created a new branch for working on the new website (CONNECTORS-1495)

git-svn-id: https://svn.apache.org/repos/asf/manifoldcf/branches/CONNECTORS-1495@1825637 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 3b34bee..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-/.settings/
-/.project
-/.idea/
-
-*.iml
-/build/
-/lib/
-/dist/
-lib-proprietary/*.jar
-site/fonts/
diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..22c89b6
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,43 @@
+# 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.
+
+Options +FollowSymlinks
+RewriteEngine on
+
+rewriterule ^end-user-documentation\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/end-user-documentation.html [r=301,nc] 
+rewriterule ^end-user-documentation\.pdf$ http://incubator.apache.org/connectors/release/trunk/en_US/end-user-documentation.pdf [r=301,nc] 
+rewriterule ^how-to-build-and-deploy\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/how-to-build-and-deploy.html [r=301,nc] 
+rewriterule ^developer-resources\.html$ http://incubator.apache.org/connectors/en_US/developer-resources.html [r=301,nc] 
+rewriterule ^mail\.html$ http://incubator.apache.org/connectors/en_US/mail.html [r=301,nc] 
+rewriterule ^download\.html$ http://incubator.apache.org/connectors/en_US/download.html [r=301,nc] 
+rewriterule ^javadoc\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/javadoc.html [r=301,nc] 
+rewriterule ^faq\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/faq.html [r=301,nc] 
+rewriterule ^concepts\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/concepts.html [r=301,nc] 
+rewriterule ^performance-tuning\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/performance-tuning.html [r=301,nc] 
+rewriterule ^who\.html$ http://incubator.apache.org/connectors/en_US/who.html [r=301,nc] 
+rewriterule ^script\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/script.html [r=301,nc] 
+rewriterule ^programmatic-operation\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/programmatic-operation.html [r=301,nc] 
+rewriterule ^included-connectors\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/included-connectors.html [r=301,nc] 
+
+rewriterule ^en_US/end-user-documentation\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/end-user-documentation.html [r=301,nc] 
+rewriterule ^en_US/end-user-documentation\.pdf$ http://incubator.apache.org/connectors/release/trunk/en_US/end-user-documentation.pdf [r=301,nc] 
+rewriterule ^en_US/how-to-build-and-deploy\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/how-to-build-and-deploy.html [r=301,nc] 
+rewriterule ^en_US/javadoc\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/javadoc.html [r=301,nc] 
+rewriterule ^en_US/faq\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/faq.html [r=301,nc] 
+rewriterule ^en_US/concepts\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/concepts.html [r=301,nc] 
+rewriterule ^en_US/performance-tuning\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/performance-tuning.html [r=301,nc] 
+rewriterule ^en_US/script\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/script.html [r=301,nc] 
+rewriterule ^en_US/programmatic-operation\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/programmatic-operation.html [r=301,nc] 
+rewriterule ^en_US/included-connectors\.html$ http://incubator.apache.org/connectors/release/trunk/en_US/included-connectors.html [r=301,nc] 
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 5f70918..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,33 +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.
-
-sudo: false
-install: true
-git:
-  depth: 1
-env:
-  matrix:
-    - TEST_SCRIPT="mvn -q install"
-    - TEST_SCRIPT="ant make-core-deps make-deps test"
-script: $TEST_SCRIPT
-language: java
-jdk:
-  - oraclejdk8
-cache:
-  directories:
-    - $HOME/.m2
-notifications:
-  email: false
-
diff --git a/CHANGES.txt b/CHANGES.txt
deleted file mode 100644
index 54a1398..0000000
--- a/CHANGES.txt
+++ /dev/null
@@ -1,4131 +0,0 @@
-ManifoldCF Change Log
-$Id$
-
-======================= 2.10-dev =====================
-
-CONNECTORS-1493: Jira connector could not fetch acls.
-(Damien Collis, Karl Wright)
-
-CONNECTORS-1488: Use a mime type that ElasticSearch 6.x allows.
-(Richard Wardrobe)
-
-CONNECTORS-1485: Prevent Form submit on Enter key press
-(Maxence SAUNIER, Kishore Kumar)
-
-CONNECTORS-1482: Improve solr connector handling of include/exclude
-for mime types to be case insenstive and to actually reject documents
-if upstream connector ignores or doesn't call checkMimeTypeIndexable().
-
-CONNECTORS-1476: TLS/SSL support for MySQL/MariaDB database connections
-(Markus Schuch)
-
-======================= Release 2.9 =====================
-
-CONNECTORS-1479: Correct classpath for running alfresco-webscript
-tests.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1478: Proprietary example missing CSS style files.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1473: Alfresco authority did not return user token, just
-groups.
-(Phillip Rhodes, Karl Wright)
-
-CONNECTORS-1471: File system output connector's delete method
-was completely broken.
-(David Hotchkiss)
-
-CONNECTORS-1469: The slack notification connector is now properly
-integrated into the maven build.
-(Markus Schuch)
-
-CONNECTORS-1468: Adds Rocket.Chat Notification Connector
-(Markus Schuch)
-
-CONNECTORS-1459: Allow the Tika service to override the mime type
-in the metadata.
-(Julien Massiera)
-
-CONNECTORS-1458: Update to use SolrJ 7.0.0.  This required some
-revision to the connector, and also to make zookeeper.jar available
-to all connectors as a root dependency.
-(Karl Wright)
-
-CONNECTORS-1453: Integrate poi 3.17, which seems to fix the
-classloader issue in 3.15.  Reverted the reassignment of poi and
-dependencies to root-level classpath accordingly.
-(Karl Wright)
-
-CONNECTORS-1456: Tentative fix for API issue exporting jobs in JSON
-format.  Basically, simple valued array elements did not work.
-(Adrian Conlon, Karl Wright)
-
-CONNECTORS-1455: Eventually skip a locked shared drive file, rather
-than aborting the job.
-(Julien Massiera, Karl Wright)
-
-CONNECTORS-1452: The runzookeeper.bat/runzookeeper.sh scripts
-were not properly starting zookeeper, because the zookeeper "main
-process" uses log4j 1.2.x methods not compatible with the log4j-1.2-api
-shim.  We have to include a 1.2.x jar and use that when starting the
-zookeeper process.
-(Karl Wright)
-
-CONNECTORS-1451: Tika extractor was causing some out-of-memory
-events to occur for simple crawls, so I increased the default memory
-allocated in the examples to 512M.
-(Karl Wright)
-
-CONNECTORS-1450: Tika extractor cannot process MS Office files due
-to a dependency problem.  The dependency issue is that poi-ooxml-schemas
-is apparently accessed via reflection, and the class lookup does not
-apparently use the current classloader, but rather some other classloader.
-This requires the entire poi* set of jars, and all dependencies, to be
-included in ManifoldCF's core jar list.
-(Karl Wright)
-
-======================= Release 2.8 =====================
-
-CONNECTORS-1445: Fix timezone handling in reports to use browser timezone
-and add a timezone field for the editjob schedule page as well. 
-(Kishore Kumar, Karl Wright)
-
-CONNECTORS-1447: Update postgresql driver to the most current version.
-This should allow error free operation with Postgresql versions back to
-version 8.
-(Karl Wright)
-
-CONNECTORS-1446: Confluence connector's UI was broken; protocol
-selection was not working.
-(Ty Taylor, Karl Wright)
-
-CONNECTORS-1444: Documentum connector needs the ability to skip
-corrupted files.
-(Tamizh Kumaran Thamizharasan, Karl Wright)
-
-CONNECTORS-1440: Add support for created date in File System connector.
-(Steph van Schalkwyk, Karl Wright)
-
-CONNECTORS-1438: Wrong content-type parse in Solr connector caused
-failure when content type contained a charset.
-(Kenta Kasahara, Karl Wright)
-
-CONNECTORS-1434: Escape filenames in Solr Http headers to match spec.
-This is a workaround for a fix that really should be in HttpClient.
-(Karl Wright, Tamizh Kumaran Thamizharasan)
-
-CONNECTORS-1433: Add pipeline specification to ES connector.
-(Steph van Schalkwyk, Karl Wright)
-
-CONNECTORS-1432: Fix deleting stale check methods from window object
-(Steph van Schalkwyk, Karl Wright, Kishore Kumar)
-
-CONNECTORS-1251: Fix encoding issues with confluence connector.
-(Marisol Redondo, Karl Wright)
-
-CONNECTORS-1431: Support different versions of ES (including 5.x and
-up).
-(Karl Wright, Hans Van Goethem)
-
-CONNECTORS-1428: Add support for configuring Tika extractor.
-(Julien Massiera, Karl Wright)
-
-CONNECTORS-1426: Fix New UI to prevent Bootstrap tab click event.
-(Karl Wright, Kishore Kumar)
-
-CONNECTORS-1425: Add tikaservice transformation connector.
-(Julien Massiera, Karl Wright)
-
-CONNECTORS-1424: Add contentlimiter transformation connector.
-(Julien Massiera)
-
-CONNECTORS-1423: Fix the new UI to add certificates to connections with certificate stores.
-(Karl Wright, Kishore Kumar)
-
-CONNECTORS-1422: Fix an HTML problem in SharePoint metadata UI.
-(David Hotchkiss)
-
-CONNECTORS-1403: Implement improved UI for web connector.
-(Kishore Kumar)
-
-CONNECTORS-1421: Have email connector retry when the connection
-is not established properly.
-(Cihad Guzel, Karl Wright)
-
-CONNECTORS-1418: Build .less files into style.css as part of the build.
-(Kishore Kumar, Karl Wright)
-
-CONNECTORS-1420: Fix the email connector's date range code.
-(Cihad Guzel)
-
-CONNECTORS-1419: Handle the JDBC no-version-query case so that
-deletes work.
-(Julien Massiera, Karl Wright)
-
-CONNECTORS-1417: Accept multipart/alternate email format.
-(Cihad Guzel)
-
-CONNECTORS-1416: Use a 4-character year for email dates.
-(Cihad Guzel)
-
-CONNECTORS-1415: Return descriptive error message when Internal Server Error occurs
-(Kishore Kumar)
-
-CONNECTORS-1414: Return descriptive error message when UI is disconnected
-(Markus Schuch, Kishore Kumar, Karl Wright)
-
-CONNECTORS-1413: Fix object equality bug at Cmis Authority Connector.
-(Furkan KAMACI, JC)
-
-CONNECTORS-1290: Merge Nuxeo Connector.  This also required going
-to log4j 2.x.  This connector is a work in progress but since a great deal
-of work has been done and the connector is nearly done, it's time to
-commit to trunk.
-(David Arroyo Escobar, Rafa Haro, Karl Wright)
-
-======================= Release 2.7 =====================
-
-CONNECTORS-1412: Fix null "to" recipient bug at email connector.
-(Furkan KAMACI)
-
-CONNECTORS-1411: Fix attachment URL template reset bug.
-(Furkan KAMACI)
-
-CONNECTORS-1410: Body is used as content at emails.
-(Furkan KAMACI)
-
-CONNECTORS-1408: Insure that there's a non-null document name in
-the Solr connector, otherwise there will be no multipart post.
-(Cihad Guzel, Karl Wright)
-
-CONNECTORS-1409: Fix re-processing email bug.
-(Furkan KAMACI)
-
-CONNECTORS-1407: Extract email addresses from email metadata fields.
-(Furkan KAMACI)
-
-CONNECTORS-1406: Fix multiple To and From field bug at email.
-(Furkan KAMACI)
-
-CONNECTORS-1405: Add file name of attachment metadata information for email.
-(Furkan KAMACI)
-
-CONNECTORS-1402: Add metadata information for email attachments.
-(Furkan KAMACI)
-
-CONNECTORS-1401: Fix Documentum Authority query to exclude
-access tokens that have matching negative groups or users.
-(Sharnel Merdeck Pereira, Karl Wright)
-
-CONNECTORS_1399: Remove all dependencies on json.jar, as per
-Apache Legal advice.
-(Karl Wright)
-
-CONNECTORS-1398: Accept RDF feeds that use lowercase "rdf", even
-though that's not legal by the spec.
-(Joachim Butz, Karl Wright)
-
-CONNECTORS-1196: New AJAX-based crawler-UI.
-(Kishore Kumar, Karl Wright)
-
-CONNECTORS-1395: Increase zookeeper session timeout to 300000,
-because we were having sessions expire.
-(Karl Wright)
-
-CONNECTORS-1396: Fix email connector class cast exception.
-(Cihad Guzel, Karl Wright)
-
-CONNECTORS-1394: Fix email connector ArrayIndexOutOfBounds
-exception.
-(Cihad Guzel, Karl Wright)
-
-CONNECTORS-1392: The Webcrawler connector now has an option to ignore
-meta robots tags in HTML pages
-(Markus Schuch)
-
-CONNECTORS-1390: Add user-settable connect timeout field for
-Active Directory authority.
-(Cihad Guzel, Karl Wright)
-
-CONNECTORS-1389: The email notification connector now supports
-multiple comma separated recipients
-(Markus Schuch)
-
-CONNECTORS-1388: The User ID field is now focused when the login
-page is loaded
-(Markus Schuch)
-
-CONNECTORS-1387: Fix Amazon S3 connector not storing secret key
-and proxy credentials properly
-(Markus Schuch)
-
-CONNECTORS-1383: Fix Generic connector not to send the password
-to the client in plaintext
-(Markus Schuch)
-
-CONNECTORS-1384: Fix GridFS connector not to send the password
-to the client in plaintext and enabled password obfuscation
-(Markus Schuch)
-
-CONNECTORS-1385: Confluence connector was constructing bad paths
-which confused CF 6.4.
-(Andrew Shumway, Karl Wright)
-
-CONNECTORS-1382: Slack notification connector now treats the webhook url
-as sensitive information
-(Markus Schuch)
-
-CONNECTORS-1381: Fix slack notification connector not to send the proxy
-password to the client in plaintext
-(Markus Schuch)
-
-CONNECTORS-1380: DropBox connector editSpecification.js velocity template incorrect variable
-(Kishore Kumar)
-
-CONNECTORS-1378: History reports End time year resets to Start Time year
-(Kishore Kumar)
-
-CONNECTORS-1372: Bizarre errors while reading data out of a RepositoryDocument
-in some cases.  This was due to the implicit conversion of Readers to
-Strings.
-(Karl Wright)
-
-CONNECTORS-1375: Add email attachment support, done as separate
-documents.
-(Cihad Guzel, Karl Wright)
-
-CONNECTORS-1371: Fix RSS connector to use same SSL support as
-the web connector.
-(Karl Wright)
-
-CONNECTORS-1370: Fix bug in Solr Connector so when an illegal
-metadata field name is mapped to a legal one, the metadata values
-are not lost.
-(Karl Wright)
-
-CONNECTORS-1368: Add date range support to email connector.
-(Cihad Guzel)
-
-CONNECTORS-1366: Wrong report code in email connector when mime
-type is rejected.
-(Furkan KAMACI)
-
-CONNECTORS-1364: Add support in the JCIFS connector for allowing user-
-settable bin names.  This allows for better resource balancing since it
-is not possible to discover the correct resource balancing empirically.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1365: Use zero seconds and milliseconds when evaluating
-DocumentFilter.
-(Furkan KAMACI)
-
-======================= Release 2.6 =====================
-
-CONNECTORS-1360: Fix MySQL and Sybase handling in the JDBC
-connector and authority connector.
-(Furkan KAMACI)
-
-CONNECTORS-1362: Don't output the stage_id field for jobs in the API.
-It's not accepted for readback.
-(Cathal Mcguinness, Karl Wright)
-
-CONNECTORS-1361: The max_interval job field was missing from the API.
-(Cathal Mcguinness, Karl Wright)
-
-CONNECTORS-1357: Delete button doesn't work on listnotifications
-(Markus Schuch)
-
-CONNECTORS-1336: Update the Compatibility Matrix
-(Piergiorgio Lucidi)
-
-CONNECTORS-1355: Missing code for API deletion of mapping and
-transformation connections.
-(Julien Massiera, Karl Wright)
-
-CONNECTORS-1344: Adds Slack Notification Connector
-(Odilo Oehmichen, Markus Schuch, Rüdiger Kurz)
-
-CONNECTORS-1349: Fix the modified_date and original_size Solr
-attributes.
-(Cihad Guzel)
-
-CONNECTORS-1338: Upgrade to SolrJ 6.3.0.
-(Shinichiro Abe)
-
-CONNECTORS-1343: Allow maximum year in report UI to be set based
-on current year.
-(Markus Schuch)
-
-CONNECTORS-1342: Bad UI logic for "path" field in livelink connector.
-(Lena Gurevich, Karl Wright)
-
-CONNECTORS-1341: Bad logic in jira connector disables document
-indexing.
-(Chalitha Perera)
-
-CONNECTORS-1325: Another example of bad XML from Microsoft has
-been found and worked around.
-(Konstantin Avdeev, Karl Wright)
-
-CONNECTORS-1340: Revise connection strings for sybase and for
-Oracle.  It's not clear why these were working before, given the change.
-(Julien Massiera)
-
-CONNECTORS-1337: Update POI jars to make them consistent with
-Tika 1.13.
-(Olivier Tavard)
-
-======================= Release 2.5 =====================
-
-CONNECTORS-1335: Log message cleanup.
-(Furkan KAMACI)
-
-CONNECTORS-1316: Upgrade to Tika 1.13.
-(Furkan KAMACI)
-
-CONNECTORS-1334: Break out forbidden api check into separate
-precommit target.
-(Furkan KAMACI)
-
-CONNECTORS-1332: Add check for forbidden api's to ant build.
-(Furkan KAMACI)
-
-CONNECTORS-1238: Update to use SolrJ 5.5.2, ZooKeeper 3.4.8.
-(Karl Wright)
-
-CONNECTORS-1331: Do not set SSL socket factory unless SSL.
-(Furkan KAMACI)
-
-CONNECTORS-1330: Minor refactoring of LDAP connector.
-(Furkan KAMACI)
-
-CONNECTORS-1329: Add logging to LDAP connector.
-(Furkan KAMACI)
-
-CONNECTORS-1326: Fix URL for Confluence documents.
-(Chalitha Perera)
-
-CONNECTORS-1325: Deal with SharePoint bad XML when document has
-optional plane utf-16 characters.  Documents with these are skipped
-since Java can't represent them either.
-(Karl Wright)
-
-CONNECTORS-1324: Fix (again) the SharePoint connector's "use all metadata"
-option.
-(Konstantin Avdeev)
-
-CONNECTORS-1323: When there were multiple outputs, the second,
-third, etc outputs would not have their activities properly logged.
-(Karl Wright)
-
-CONNECTORS-1322: Fix email connector "from" field.
-(Olivier Tavard)
-
-CONNECTORS-1318: Documentation errors.
-(KOIZUMI Satoru)
-
-CONNECTORS-1317: Missing JDOM2 dependency for Tika.
-(Karl Wright)
-
-CONNECTORS-1309: SharePoint connector would blow up looking for
-lists when SharePoint returned non-list entities.
-(Phil Reithmuller, Karl Wright)
-
-CONNECTORS-1315: Handle control characters in ES connector.
-(Silvio Meier, Karl Wright)
-
-CONNECTORS-1313: Add multivalued data support to JDBC connector.
-(Luca Alciata, Karl Wright)
-
-CONNECTORS-1312: Treat "connection reset by peer" same way as "busy"
-in JCIFS connector.
-(Konstantin Avdeev, Karl Wright)
-
-CONNECTORS-1308: Update to Tika 1.12, and all associated downstream
-dependencies.
-(Karl Wright)
-
-CONNECTORS-1305: Skip documents that get server-side resource
-problems in JCIFS connector.
-(Konstantin Avdeev, Karl Wright)
-
-CONNECTORS-1189: Fix SearchBlox's test cases so that they don't depend on JDK hash order.
-(Naveen.A.N, Ahmet Arslan)
-
-CONNECTORS-1302: Catch newer version of 'in-use' SmbException in
-JCIFS connector.
-(Vince McNamara, Karl Wright)
-
-CONNECTORS-1301: Addition of SSL to LDAP connector broke non-SSL
-functionality.
-(Yulin He, Karl Wright)
-
-CONNECTORS-1297: Detect symlink in JCifs connector and explicitly
-skip in that case.
-(Konstantin Avdeev, Karl Wright)
-
-======================= Release 2.4 =====================
-
-CONNECTORS-1296: Revamp email notification connector to do
-SMTP and be more configurable.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1295: JCIFS connector ignoring max file length value
-sometimes.
-(Konstantin Avdeev, Karl Wright)
-
-CONNECTORS-1293: Duplication of attribute names in the UI when
-multiple languages are installed in Documentum.
-(Radek Sklenicka, Karl Wright)
-
-CONNECTORS-1288: SharePoint connector proxy password obfuscation
-was breaking this feature.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1284: SharePoint fields that do not have a different
-display name from their field name (or which are defined in some way
-as yet not well understood) were being overlooked in SharePoint crawling.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1283: "Document has no version" signal was not working.
-This problem has been around since MCF 1.8/2.0.  The fix is simple but
-may change the functioning of some custom repository connectors.  This
-fix also restores broken functionality in the MCF JDBC connector, when
-no document version query is provided.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1282: Missing translation for Metadata Adjuster.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1281: SQLServer under JTDS throws AbstractMethodException.
-(Olivier Tavard, Karl Wright)
-
-CONNECTORS-1275: Help ES deal with dates properly.  Also added
-support for built-in Repository Document attributes.
-(Andrey Leybovich, Karl Wright)
-
-CONNECTORS-1272: Update _status command for Elastic Search to _stats.
-(Andrey Leybovich, Karl Wright)
-
-CONNECTORS-1271: Broken AmazonCloudSearch connector.
-(Juan Pablo Diaz-Vaz, Karl Wright)
-
-CONNECTORS-1270: Contribute OpenNLP transformation connector.
-(Chalitha Perera, Rafa Haro, Karl Wright)
-
-CONNECTORS-1268: Add missing mime types to FileNet connector.
-(Damien Picard)
-
-CONNECTORS-1267: Added enter key pressed event to the login page
-(Muhammed Olgun)
-
-======================= Release 2.3 =====================
-
-CONNECTORS-1266: Fix an infinite loop in email notification connector.
-(Markus Schuch)
-
-CONNECTORS-1265: Adjust interval for checking validity of http connection.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1263: New version of Alfresco-indexer package.
-(Maurizio Pillitu)
-
-CONNECTORS-1262: Fix Alfresco-webscript connector's version string,
-so changes to ACLs will be detected as document changes.
-(Chalitha Perera)
-
-CONNECTORS-1264: Fix handling of slashes in unquoted attribute values
-in html parsing.
-(Issei Nishigata, Karl Wright)
-
-CONNECTORS-1249: Independent priority setting for different
-connectors, and bring individual connectors up to speed with proper
-document bin names.
-(Karl Wright)
-
-CONNECTORS-1261: Supply commit-within argument for /update
-handler in Solr connector.
-(Karl Wright, Shinichiro Abe, Adrian Conlon)
-
-CONNECTORS-1251: Confluence connector encoding issue.
-(Karl Wright, Jens Grassel)
-
-CONNECTORS-1260: Fix completely broken email connector.
-(Karl Wright, Julien Massiera)
-
-CONNECTORS-1259: Use Travis CI.
-(Shinichiro Abe)
-
-CONNECTORS-1258: Update Japanese translations.
-(KOIZUMI Satoru)
-
-CONNECTORS-1256: Spanish translations.
-(Gladys Carrizales)
-
-CONNECTORS-1254: Some Jetty dependencies are missing in jetty-runner.
-(Shinichiro Abe)
-
-CONNECTORS-1255: Ignore CheckObjectIDTest.
-(Shinichiro Abe)
-
-CONNECTORS-1252: jetty.xml is missing in jetty-runner QuickStart.
-(Shinichiro Abe)
-
-CONNECTORS-1250: Fix Confluence specification UI.
-(Jens Grassel, Karl Wright)
-
-CONNECTORS-1246: Get Kafka integration test running.
-(Karl Wright)
-
-CONNECTORS-1162: Kafka connector.
-(Tugba Dogan)
-
-CONNECTORS-1245: Using wrong logger for confluence authority.
-(Jens Grassel, Karl Wright)
-
-CONNECTORS-1237: Upgrade the CMIS Connector to OpenCMIS 0.13.0
-(Piergiorgio Lucidi)
-
-CONNECTORS-1235: Indexing all properties fetched with the cmis query
-(Piergiorgio Lucidi, Christian Tiralosi, Deanna Delapasse, Elisa Croci)
-
-CONNECTORS-1244: Add support for LDAPS and TLS to LDAP
-authority connector.
-(Karl Wright)
-
-CONNECTORS-1234: Add use-mapper-attachments option
-to Elasticsearch connector.
-(Shinichiro Abe)
-
-CONNECTORS-1242: Fix document reprioritization on job resume.
-(Niall Colreavy, Karl Wright)
-
-CONNECTORS-1241: Documentum connector not handling subtypes
-properly.
-(Bipul Podder)
-
-CONNECTORS-1231: Upgrade to JUnit 4.12.
-(Shinichiro Abe)
-
-CONNECTORS-1239: Handle code 401 from Solr more appropriately.
-(Cathal McGuinness, Karl Wright)
-
-CONNECTORS-1236: Upgrade to Tika 1.10.
-(Karl Wright)
-
-CONNECTORS-1233: Add Amazon S3 connector.
-(Gunaratnam Kuhajeyan, Karl Wright)
-
-CONNECTORS-1230: Add writeLimit option on Tika extractor.
-(Shinichiro Abe)
-
-======================= Release 2.2 =====================
-
-CONNECTORS-1229: Fix NPE in metadata adjuster.
-(Mike Caceres, Karl Wright)
-
-CONNECTORS-1226: PostgreSQL does not implement the isValid()
-JDBC method in the driver we include, so make sure when we call it
-we don't fail if we get an exception.  Related to CONNECTORS-1202.
-(Karl Wright)
-
-CONNECTORS-1224: Upgrade to Hadoop 2.6.0.
-(Shinichiro Abe)
-
-CONNECTORS-1222: Handle unregistered connector class in getActivitiesList().
-(Thomas Daniel, Karl Wright)
-
-CONNECTORS-1221: Update documentation for properties.xml to
-include new ldap authentication properties.
-(Karl Wright)
-
-CONNECTORS-1131: Add infrastructure for controlling individual
-user access to parts of the UI and API, also allow this to be
-configured via LDAP.
-(Colin Joyce, Karl Wright)
-
-CONNECTORS-1220: User mapping prerequisite choices were broken,
-caused a hang when there were more than one.
-(Karl Wright)
-
-CONNECTORS-1218: Add lowerNames option on Tika extractor.
-(Shinichiro Abe)
-
-CONNECTORS-1217: Fix documentation for api login parameters.
-(Karl Wright)
-
-CONNECTORS-1216: Set default core/collection name
-and add required check on Solr connector.
-(Shinichiro Abe)
-
-CONNECTORS-1215: Fuzzyml parser needs to ignore "<" followed by
-whitespace, since those are technically not valid tags and some sites
-care.
-(Brad Dennis, Karl Wright)
-
-CONNECTORS-1213: Job notification information did not export/import
-correctly.
-(Cathal McGuinness, Karl Wright)
-
-CONNECTORS-1203: SharePoint connector did not consistently use
-internal metadata names throughout.
-(Dale Dreiske, Karl Wright)
-
-CONNECTORS-1212: Fix export/import of jobs to handle max
-intervals.
-(Kevin J. Walsh, Karl Wright)
-
-CONNECTORS-1209: Add regular expression extraction to
-Metadata Adjuster.
-(Karl Wright)
-
-CONNECTORS-1210: List notifications page links broken.
-(KOIZUMI Satoru, Karl Wright)
-
-CONNECTORS-1208: Provide more full-featured notification ability.
-(Karl Wright)
-
-CONNECTORS-1204: Add ability to post original binary length of document
-to Solr from JCIFS connector.  Also improve efficiency of JCIFS connector.
-(Karl Wright)
-
-CONNECTORS-1193: Add ability to discard web content based on a
-set of regular expressions.
-(Arcadius Ahouansou)
-
-CONNECTORS-1199: SearchBlox connector formatting non-standard.
-(Karl Wright)
-
-CONNECTORS-1198: SearchBlox connector session management not
-working properly.
-(Timo Selvaraj, Rafa Haro, Karl Wright)
-
-CONNECTORS-1197: Add "windows" file mode to file system output connector.
-(Karl Wright)
-
-CONNECTORS-1195: Fix for NumberFormatException exception thrown in Maximum Bandwidth Report
-(Kishore Kumar)
-
-CONNECTORS-1192: Fix a problem with login-page detection based on
-content.  Last line was getting skipped, and infinite amounts of content
-could be buffered in memory.  Adopted a compromise that scans an
-overlapping window of minimum size 16K.
-(Karl Wright)
-
-======================= Release 2.1 =====================
-
-CONNECTORS-1191: Unexpected job status 34, due to a race condition.
-Jobs shutting down and being aborted at the same time could wind up
-in a state where repeated exceptions would be thrown.
-(Arcadius Ahouansou, Karl Wright)
-
-CONNECTORS-1190: Broken dependencies in solr connector maven build
-caused tests to fail under maven.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-1187: Handle "File in Use" error properly in JCIFS connector.
-(Karl Wright)
-
-CONNECTORS-1186: HttpClient 4.4 requires that you set the SSL socket
-factory at the connection manager level.
-(Karl Wright)
-
-CONNECTORS-1185: Fix HttpClient deprecation warnings, and make sure
-socket timeouts are actually honored in http connections.
-(Karl Wright)
-
-CONNECTORS-1183: Fix for GridFS connector broken UI server tab.
-(Kishore Kumar)
-
-CONNECTORS-1173: Option to change View URL for Livelink Connector
-(Kishore Kumar)
-
-CONNECTORS-1179: Include the collection name as part of the Solr
-version string.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1178: Script example broken.
-(Karl Wright)
-
-CONNECTORS-1177: Add session-based security for API.
-(Jan van Haarst, Karl Wright)
-
-CONNECTORS-1176: Update SolrJ version.
-(Karl Wright)
-
-CONNECTORS-1175: Documentum connector needs to set file name.
-(Dmitry Bardin, Karl Wright)
-
-CONNECTORS-1160: Update Livelink Connector HTML String to Velocity Template
-(Kishore Kumar)
-
-CONNECTORS-1172: Fix metadata adjuster 'keep all metadata' switch
-UI.
-(Frank Brendel, Karl Wright)
-
-CONNECTORS-1171: Fix SharePoint connector path mapping UI.
-(Frank Brendel, Karl Wright)
-
-CONNECTORS-1166: Delete link doesn't work on listtransformations
-UI page.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1159: UI broken in LiveLink connector.
-(Kishore Kumar)
-
-CONNECTORS-1156: Difficulty shutting down agents process after
-a while executing.
-(Adrian Conlon, Karl Wright)
-
-CONNECTORS-1157: FileNet connector URI is incorrect for document
-subtypes.
-(Guy Sperry)
-
-CONNECTORS-1154: Changes to the flow through the web connector's
-deflate/unzip logic, designed to prevent gzip headers from being read
-if the stream's contents are not read.
-(Li Minhui, Karl Wright)
-
-CONNECTORS-1153: Broken authority name comparison is preventing
-incremental when no authority is used.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1151: FileNet connector completely broken, due to
-MCF 1.8 reorganization.
-(Guy Sperry, Karl Wright)
-
-CONNECTORS-1150: Go to Tika 1.7
-(Karl Wright)
-
-CONNECTORS-1149: Minor typos in English documentation.
-(KOIZUMI Satoru)
-
-CONNECTORS-1148: Update Japanese included-connectors document.
-(KOIZUMI Satoru)
-
-CONNECTORS-1146: Improve Japanese concepts document.
-(KOIZUMI Satoru)
-
-CONNECTORS-1145: File locking hangs when saving output connection.
-(Andreas Baumann, Michael Wilken, Karl Wright)
-
-CONNECTORS-1140: Improve Japanese documentation.
-(KOIZUMI Satoru)
-
-CONNECTORS-1141: Increase session timeout for combined UI to
-30 minutes.
-(Karl Wright)
-
-CONNECTORS-1122: Don't reprioritize documents on job start/resume.
-For jobs which share bins with other jobs, this may mean that no
-documents will be processed until the entire current queue of the
-other job is completed, but this is deemed to be a rare situation.
-(Karl Wright)
-
-CONNECTORS-1139: Add support for interruptible throttlers.
-(Karl Wright)
-
-CONNECTORS-1138: Loss of all metadata fields but one on pipeline
-bifurcation.
-(Salih Sen, Karl Wright)
-
-CONNECTORS-1136: Update the user documentation to account for
-changes in the metadata adjuster transformer.
-(Karl Wright)
-
-CONNECTORS-1134: Revamp metadata adjuster transformer to
-handle arbitrary combination expressions across multiple fields.
-This replaces the "move" and "add" paradigm with a more general
-approach.
-(Hemant Jain, Karl Wright)
-
-CONNECTORS-1135: Update Japanese translations for JCIFS connector.
-(KOIZUMI Satoru)
-
-CONNECTORS-1132: Update documentation for notification
-connections.
-(Karl Wright)
-
-CONNECTORS-1130: Add support for name/value document filtering
-in Documentum connector.
-(Hemant Jain, Karl Wright)
-
-CONNECTORS-1119: Add support for notification connectors, and
-an email notification connector.
-(Karl Wright)
-
-======================= Release 2.0 =====================
-
-CONNECTORS-1128: Job shows no activity when restarting after
-abort.
-(Karl Wright)
-
-CONNECTORS-1127: Fix boilerplate extraction to be compatible with
-current version of boilerplate.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1126: Fix LockGate release logic to not flush LockGate
-objects so aggressively.
-
-CONNECTORS-1124: start.jar in example-proprietary not working.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1125: Make sure xz jar is delivered to where Tika needs
-it.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1123: Reduce the maximum number of zookeeper lock
-nodes, by hashing the lock names that correspond to documents.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1121: Plugins have moved in the dist repository, so
-point at them properly.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1120: ElasticSearch: Handle case of deleting already
-deleted document.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1118: Change IIncrementalIngester interface to allow
-for cached connection instances.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-921: Change Zookeeper paths so all ManifoldCF nodes
-are under one root.
-(Graeme Seaton, Karl Wright)
-
-CONNECTORS-969: Don't use JSON as an output specification format.
-(Karl Wright)
-
-CONNECTORS-974: Make SharePoint 2010 be the default selection.
-(Karl Wright)
-
-CONNECTORS-1116: Prevent requirement of unlimited handles for
-cached loads by limiting number of cached loads to 200 at a time.
-(Adrian Conlon, Karl Wright)
-
-CONNECTORS-1115: Add ability to retain all components of a document,
-so that individual ones do not need to be specified.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1114: SQL exception calling removeDocument().
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1063: Add section to how-to-build-and-deploy on
-the Alfresco Webscript connector.
-(Karl Wright, Maurizio Pillitu)
-
-CONNECTORS-1112: Reduce contention for zookeeper resources by
-caching local configuration data, and by reorganizing stuffer thread.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1111: Component cleanup did not work properly.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1110: Component documents getting deleted wrongly
-when additional components added.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-1109: Bad cache key for JDBC authority.
-(Alejandro Calbazana, Karl Wright)
-
-CONNECTORS-1108: Turn most jobs logging messages from DEBUG
-to INFO.
-(Aeham Abushwashi)
-
-CONNECTORS-1100: Change how reprioritization is done to improve
-overall usability at large scale.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1106: Missing state handling for abort case.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1104: Add proxy support to SharePoint connector.
-(Karl Wright)
-
-CONNECTORS-1102: Don't do a hard reindex on jobqueue.restart,
-since it is expensive and may be unnecessary.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1101: Fix shutdown hang caused by poor interrupt
-handling in MySQL driver.
-(Karl Wright)
-
-CONNECTORS-1086: Document Amazon Cloud Search fields.
-(Karl Wright)
-
-CONNECTORS-1076: Revamp ManifoldCF obfuscation to use a
-standard encryption algorithm.
-(Karl Wright)
-
-CONNECTORS-1099: Update Metadata Adjuster documentation.
-(Karl Wright)
-
-CONNECTORS-1098: Update how-to-build-and-deploy.
-(Karl Wright)
-
-CONNECTORS-1097: Update JDBC connector documentation.
-(Karl Wright)
-
-CONNECTORS-1096: Document boilerplate removal options.
-(Karl Wright)
-
-CONNECTORS-1095: Use https for downloading everywhere.
-(Aeham Abushwashi)
-
-CONNECTORS-1094: Performance improvements for document
-reprioritization.
-(Aeham Abushwashi, Karl Wright)
-
-CONNECTORS-1093: Need to preload document priorities for reset
-of all priorities, for performance.
-(Karl Wright)
-
-CONNECTORS-1092: Error in log during load tests.
-(Karl Wright)
-
-CONNECTORS-1091: On job start, reprioritize documents.
-(Karl Wright)
-
-CONNECTORS-1090: More PostgreSQL performance improvements.
-(Karl Wright)
-
-CONNECTORS-1089: Add JDBC connector access token capability.
-(Alejandro Calbazana, Karl Wright)
-
-CONNECTORS-1088: Add boilerplate extraction to Tika extractor.
-(Arcadius Ahouansou, Karl Wright)
-
-CONNECTORS-1087: Fix failing alfresco-webscript unit test.
-(Karl Wright)
-
-CONNECTORS-1085: Reduce binary space requirement by introducing a
-connector-common-lib.
-(Karl Wright)
-
-CONNECTORS-1083: Add support for MariaDB.
-(Markus Schuch)
-
-CONNECTORS-1060: Implement Alfresco webscript connector integration
-test.
-(Maurizio Pillitu)
-
-CONNECTORS-1081: ElasticSearch documentation update.
-(Jens Jahnke)
-
-CONNECTORS-1080: Elastic search: go from "content" field to "_content".
-(Jens Jahnke)
-
-CONNECTORS-1079: Fix Tika extractor; tika core must be in connector-lib
-as well as in root jars.
-(Mingchun Zhao, Karl Wright)
-
-CONNECTORS-1078: Improve end-user documentation for the JDBC
-connection type.
-(Jens Jahnke, Karl Wright)
-
-CONNECTORS-1074: Use Tika to map extensions to mime types.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1072: Remove 1.x-related import fallback code, since
-2.0 is not backwards compatible with 1.x.
-(Karl Wright)
-
-CONNECTORS-1073: Remove 1.x-related upgrade code, since schema
-for 2.0 is not backwards compatible with 1.x anyhow.
-(Karl Wright)
-
-CONNECTORS-1075: Provide a means of obfuscating passwords in
-properties.xml and global-properties.xml.  Also include an obfuscation
-utility in the distribution, for generating obfuscated passwords.
-(Karl Wright)
-
-CONNECTORS-1071: JCIFS connector should provide date metadata in
-standard ISO8601 format with names that don't conflict with what
-Tika extractor generates.
-(Antonio David Pérez Morales, Karl Wright)
-
-CONNECTORS-1061: More fixes for the Alfresco webscript connector
-UI, and create a UI test.
-(Karl Wright)
-
-CONNECTORS-1066: Do not include blank or null fixed fields in Solr
-documents; also, provide facility to strip empty fields from general
-metadata in Metadata Adjuster.
-(Alessandro Benedetti, Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1068: Enhancements for Document Filter transformation
-connector.
-(Karl Wright)
-
-CONNECTORS-1070: Exit immediately upon finding a misconfigured
-ManifoldCF.
-(Kamil Żyta, Karl Wright)
-
-CONNECTORS-1067: Allow document filtering on modification date,
-and also hook this up in all repository connectors where it makes sense.
-(Karl Wright)
-
-CONNECTORS-1057: Implement full internationalization for alfresco-webscript
-connector.
-(Karl Wright)
-
-CONNECTORS-1065: Reorganize authority packages to be consistent
-with the standard.
-(Karl Wright)
-
-CONNECTORS-1056: Use ContentUrlPath attribute for actual URI for
-the document in Alfresco.
-(Maurizio Pillitu, Karl Wright)
-
-CONNECTORS-1062: Livelink connector date stamps etc should be in
-ms since epoch, not in human-readable timezone-dependent dates.
-(Karl Wright)
-
-CONNECTORS-1037: Add Alfresco webscript connector and authority.
-(Maurizio Pillitu, Rafa Haro, Karl Wright)
-
-CONNECTORS-1055: Fix Zulu date parsing.
-(Karl Wright)
-
-CONNECTORS-1053: Provide stop scripts for single-process examples.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1054: Document plugins for SharePoint more completely.
-(Karl Wright)
-
-CONNECTORS-345: Provide a jetty configuration XML file that can
-be used to alter the jetty configuration.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1050: Upgrade to Jetty 9.
-(Shinichiro Abe)
-
-CONNECTORS-1049: Put plugins under "plugins" in dist directory,
-and connector processes under "processes" in dist directory.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1051: Elastic Search connector and CMIS connector
-should use the same paradigm for test wars.
-(Karl Wright)
-
-CONNECTORS-1048: Use full paths for all downloaded jars.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-1047: Upgrade to Tika 1.6.
-(Shinichiro Abe)
-
-CONNECTORS-1046: Remove user mapping support except for
-official regexp mapper.
-(Karl Wright)
-
-CONNECTORS-1044: Remove all support for Derby as an internally
-used database.
-(Karl Wright)
-
-CONNECTORS-982: Remove all output connector tabs that are
-roughly equivalent to what the Document Filter transformation
-connector does.
-(Karl Wright)
-
-CONNECTORS-1043: Wrong url generated for SharePoint list items.
-(Lalit Jangra, Karl Wright)
-
-CONNECTORS-418: Finish implementation of preferred way to get content
-URL for CMIS.
-(Karl Wright)
-
-CONNECTORS-1041: Livelink connector should force HTTPS off when
-HTTP is selected.
-(Karl Wright)
-
-CONNECTORS-1040: Transformation connectors should use specification
-rather than unpacking version string.
-(Karl Wright)
-
-CONNECTORS-1039: Use a URL-centric way of getting the extension
-for document filtering.
-(David Morana, Karl Wright)
-
-CONNECTORS-1038: Handle multiple pool closes properly.
-(Karl Wright)
-
-CONNECTORS-956: Change how Solr field name escaping is done.
-(Piergiorgio Lucidi, Shinichiro Abe, Edgardo Ambrosi, Karl Wright)
-
-CONNECTORS-1036: Zookeeper service handling also has
-ephemeral nodes which need to be tied to sessions.
-(Karl Wright)
-
-CONNECTORS-1031: Fix Zookeeper synchronization to be resilient
-against short tick time settings.
-(Karl Wright)
-
-CONNECTORS-1026: Change JIRA URL to use the standard form.
-(Daniel Aschaeur)
-
-CONNECTORS-1027: Improve some general and PostgreSQL queries
-for large crawling sets.
-(Paul Boichat, Karl Wright)
-
-CONNECTORS-1025: SharePoint connector should skip blocked files.
-(Radek Sklenicka, Karl Wright)
-
-CONNECTORS-1024: Non-null components always failed due to a
-null pointer exception.
-(Karl Wright)
-
-CONNECTORS-1023: Fix Alfresco tests.  They don't yet succeed, but
-at least they run, and the connector can communicate with Alfresco.
-(Karl Wright)
-
-CONNECTORS-1021: Add more metadata for Jira connector.
-(Daniel Aschaeur)
-
-CONNECTORS-1022: Add URL mapping tab to web connector.
-(Luca Basso, Karl Wright)
-
-CONNECTORS-1020: Email connector misuse of variable names.
-(Karl Wright, Paul Boichat)
-
-CONNECTORS-975: Remove all 'forced metadata' equivalent tabs.
-(Karl Wright)
-
-CONNECTORS-1014: Fix the fact that Solr Cloud no longer sets
-a content type in its responses.
-(Kamil Zyta, Karl Wright)
-
-CONNECTORS-1006: Extend GoogleDrive connector to capture
-Google native spreadsheets.
-(Shigeki Kabayashi)
-
-CONNECTORS-973: Remove field mapping tab from Solr connector.
-(Karl Wright)
-
-CONNECTORS-1018: Fix broken job UI.
-(Karl Wright)
-
-CONNECTORS-1015: Add minimum file size to Allowed Documents
-transformation filter.
-(David Morana, Karl Wright)
-
-CONNECTORS-1016: Recognize non-existent user.
-(David Morana, Karl Wright)
-
-CONNECTORS-972: Remove Forced Metadata tab from all jobs.
-THIS IS A NON-BACKWARDS-COMPATIBLE CHANGE.
-(Karl Wright)
-
-CONNECTORS-949: Upgrade OpenCMIS to latest version to see if it
-fixes join queries.
-(Karl Wright)
-
-CONNECTORS-1013: Handle new kind of XML we see coming back from
-SharePoint on getLists metadata field list requests.
-(Lalit Jangra, Karl Wright)
-
-======================= Release 1.7 =====================
-
-CONNECTORS-1012: Upgrade xmlbeans and POI to fix various CVE's.
-(Karl Wright)
-
-CONNECTORS-1011: Upgrade to httpclient 4.3.5.
-(Karl Wright)
-
-CONNECTORS-1009: Fix CMIS connector again, to handle typical case
-where a new version is a new node.
-(Karl Wright)
-
-CONNECTORS-1010: Use uri hash instead of full URI as lock key
-to prevent "file name too long" errors on windows.
-(Erlend Garåsen, Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-1007: Fix CMIS connector so that tests pass.
-(Karl Wright)
-
-CONNECTORS-1006: Update googledrive API to latest released version.
-(Karl Wright)
-
-CONNECTORS-1000: Add support for auth to open search server
-connector.
-(Emmanuel Keller)
-
-CONNECTORS-1004: CMIS connector was not using latest version
-of document, which matters for repositories like Alfresco.
-(Prasad Perera, Karl Wright)
-
-CONNECTORS-1003: CMIS connector handling of query string was
-incorrect.
-(Karl Wright)
-
-CONNECTORS-958: Update OpenSearchServer connector to handle
-metadata, and deal with more current versions of OpenSearchServer.
-(Emmanuel Keller)
-
-CONNECTORS-565: Add connector and plugin support for SharePoint
-2013.
-(Will Parkinson, Karl Wright)
-
-CONNECTORS-984: Add Tika extraction metadata, and also add
-ability to ignore tika exceptions.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-989: Introduce document sub-components, which
-is a way of having multiple indexed documents corresponding to a
-single repository document.
-(Matteo Grolla, Karl Wright)
-
-CONNECTORS-994: Make Alfresco connector pay attention to the
-scanOnly flag.
-(Prasad Perera, Karl Wright)
-
-CONNECTORS-997: Get CMIS connector working again.
-(Karl Wright)
-
-CONNECTORS-996: Catch CMIS object not found exception, and
-also enable CMIS derby IT test.
-(Prasad Perera, Karl Wright)
-
-CONNECTORS-995: Connectors dealing with non-indexable documents
-such as directories should call noDocument() on those documents if they
-want incremental behavior.
-(Karl Wright)
-
-CONNECTORS-993: Pipeline code not handling "no document" case properly.
-This problem was an oversight of the new pipeline code.  Essentially,
-transformation connectors could choose not to send a document onward
-to the next stage.  If this happened, then the document version information
-for the corresponding output connection would never get written, and
-no incremental-ness would be possible.
-I fixed this by introducing a "noDocument()" IOutputAddActivity method,
-which transformation connectors should call when they reject a document.
-(Karl Wright)
-
-CONNECTORS-992: Add a test to exercise ServiceInterruption within
-a connector.
-(Karl Wright)
-
-CONNECTORS-990: Revamp IRepositoryConnector API to no longer separate
-getDocumentVersions() and processDocuments().  This modification basically
-pushes responsibility to determine changes to the repository connector.
-Backwards compatibility is maintained via code in BaseRepositoryConnector,
-and new methods have been added to IProcessActivity.
-WorkerThread has been largely rewritten as a result.
-(Karl Wright)
-
-CONNECTORS-991: Make Jira connector perform pre-emptive basic auth
-since Jira supports guest users.
-(Daniel Aschauer, Karl Wright)
-
-CONNECTORS-988: Performance improvements for split pipeline crawls.
-(Karl Wright)
-
-CONNECTORS-985: Get UI tests working again.
-(Karl Wright)
-
-CONNECTORS-981: Add support for SolrInputDocument indexing in
-Solr connector.
-(Alessandro Benedetti, Karl Wright)
-
-CONNECTORS-979: Fix ant build so that documentum and filenet show
-up.
-(Karl Wright)
-
-CONNECTORS-980: Output connector gets notified now when job is deleted.
-(Karl Wright)
-
-CONNECTORS-954: Revamp AmazonCloudSearch output connector completely.
-(1) Remove Tika and field mapping, since that would be done upstream in the
-pipeline.
-(2) Revamped the document lifecycle so they are batched together (which isn't
-perfect; see CONNECTORS-980).
-(Karl Wright, Takumi Yoshida)
-
-CONNECTORS-971: Use a generic "seeding version string" to track the last
-seeding event for every job.  This abstracts away from time intervals and
-permits seeding based on things like transaction IDs.
-(Karl Wright, Piergiorgio Lucidi)
-
-CONNECTORS-967: Add links to Java 1.7 and ManifoldCF framework Javadoc
-for ManifoldCF Javadocs.
-(Shinichiro Abe)
-
-CONNECTORS-965: Update end-user documentation to reflect
-multiple outputs per job.
-(Karl Wright)
-
-CONNECTORS-964: Document REST API changes for multiple outputs
-per job.
-(Karl Wright)
-
-CONNECTORS-962: Add support for multiple outputs for a given job.
-WARNING: Schema change!  REST API change!  Upgrade from 1.6.x
-has been added but not yet tested.
-(Karl Wright)
-
-CONNECTORS-963: SharePoint/AD authority did not generate the "true"
-token.
-(Karl Wright)
-
-CONNECTORS-961: Debug pipeline usage in job UI, and add a Forced Metadata
-transformation connector that has a job tab.
-(Karl Wright)
-
-CONNECTORS-960: Remove Specification subclass usage from main connector API's.
-(Karl Wright)
-
-CONNECTORS-953: Forced metadata changes do not reset seeding start time
-(Karl Wright)
-
-CONNECTORS-952: Crawler UI generates bad XML.
-(Karl Wright)
-
-CONNECTORS-951: Import/export does not handle forced metadata.
-(Karl Wright)
-
-CONNECTORS-946: Add pipeline support.  This is a major change that adds a new class of connector, UI changes,
-and includes structural as well as schema changes.  WARNING: Schema change!!
-(Karl Wright)
-
-CONNECTORS-950:CMIS Connector should ingest only the properties specified in the select clause
-(Piergiorgio Lucidi)
-
-CONNECTORS-916: Supply an Amazon Cloud Search connector.
-(Takumi Yoshida, Karl Wright)
-
-CONNECTORS-948: CMIS Connector returns couldn't encrypt null when the query doesn't include cmis:objectId
-(Piergiorgio Lucidi)
-
-CONNECTORS-947: ant test fails when make-deps is not run.
-(Karl Wright)
-
-CONNECTORS-945: GridFS connector.
-(Muhammed Olgun)
-
-CONNECTORS-944: Maven build has different stuff in war file than
-ant build.
-(Arcadius Ahouansou, Karl Wright)
-
-CONNECTORS-943: .aspx files not indexed by Sharepoint connector due to missing mime type in core
-
-CONNECTORS-941: Solr connector not working properly with basic auth.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-942: Add output connector method to handle notification
-of removal of all connection-related records.
-(Karl Wright)
-
-CONNECTORS-940: Upgrade slf4j and commons-logging to latest versions.
-(Karl Wright)
-
-CONNECTORS-933: Simplified chinese localizations.
-(Mingchun Zhao)
-
-CONNECTORS-938: Allow JSPs to all work properly with Java 8.
-(Arcadius Ahouansou, Ahmet Arslan)
-
-CONNECTORS-936: Handle null content streams in CMIS connector.
-(Cetra Free)
-
-CONNECTORS-935 : Use Java 7 in ant build
-(Ahmet Arslan)
-
-CONNECTORS-932 : Avoid UnsupportedEncodingException handling
-(Ahmet Arslan)
-
-CONNECTORS-927: Override JDK's entity expansion limit for Solr
-connector.
-(David Morana, Karl Wright)
-
-======================= Release 1.6 =====================
-
-CONNECTORS-928: Remove unused directory.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-925: Fix ant exclusions for zip/tar distributions on Linux variants.
-(Ahmet Arslan)
-
-CONNECTORS-923: Fix bandwidth throttling.
-(Karl Wright)
-
-CONNECTORS-920: Be more explicit in Solr connector about handling
-SocketTimeoutException.
-(Hitoshi Tatsumi, Karl Wright)
-
-CONNECTORS-919: Fix example-proprietary.
-(Karl Wright)
-
-CONNECTORS-913: Only remove connector registration when connectors
-are being delivered.
-(Karl Wright)
-
-CONNECTORS-912: Revamp build system, so that individual connectors
-can build directly against a distribution.  This makes it much easier for
-developers to do their own connectors using our infrastructure, and
-contribute complete working connectors with tests as well.
-(Graeme Seaton, Karl Wright)
-
-CONNECTORS-909: Upgrade to Elasticsearch 1.0.1.
-(Shinichiro Abe)
-
-CONNECTORS-900: Clean up Hadoop deprecation warnings.
-(Karl Wright)
-
-CONNECTORS-910: SharePoint connector does not fetch metadata values
-for sub-site document libraries.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-908: Update Solr 3.x, Solr 4.x, and ElasticSearch
-plugin versions bundled with ManifoldCF.
-(Karl Wright)
-
-CONNECTORS-906: Include documentation section on advanced
-properties.xml settings.
-(Graeme Seaton)
-
-CONNECTORS-890: Upgrade to Solr 4.7.0, and Httpclient 4.3.2.
-(Karl Wright)
-
-CONNECTORS-905: Add property which disables history recording.
-(Graeme Seaton)
-
-CONNECTORS-904: JDBC Connector with MySQL should convert
-from binary columns to strings.
-(Karl Wright)
-
-CONNECTORS-903: Remove deprecation warnings from framework.
-(Karl Wright)
-
-CONNECTORS-901: Clean up httpclient-related deprecation warnings.
-(Karl Wright)
-
-CONNECTORS-899: Allow some headers to be included/excluded from
-metadata for web connector.
-(Florian Schmedding, Karl Wright)
-
-CONNECTORS-898: Handle zookeeper connection loss and session
-expiration conditions.
-(Graeme Seaton, Karl Wright)
-
-CONNECTORS-886: Add support for Parent folder security
-in SharedDriveConnector.
-(Shinichiro Abe)
-
-CONNECTORS-893: Update end-user documentation to describe view
-pages and the buttons that are found on them.
-(Karl Wright)
-
-CONNECTORS-895: Add missing REST API methods for connection and
-job control, and revamp API for operations that are specific to only one
-kind of connection.
-(Karl Wright)
-
-CONNECTORS-894: Cosmetic display problem with SharePoint specification
-view.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-892: Add ability in UI reset incremental job seeding state.
-(Karl Wright)
-
-CONNECTORS-891: SharePoint AD groups not properly authorized.
-(Will Parkinson, Karl Wright)
-
-CONNECTORS-888: JobResetThread had issues when running on
-multiple agents processes.
-(Florian Schmedding, Karl Wright)
-
-CONNECTORS-887: Upgrade issues with MySQL.
-(Florian Schmedding, Karl Wright)
-
-CONNECTORS-885: Handle errors during startup better.
-(Karl Wright)
-
-CONNECTORS-883: Handle errors from the output connector during
-notification better.
-(Karl Wright)
-
-CONNECTORS-884: Log successful index/delete in Solr connector.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-882: Solr connector: Keep all metadata fixed.
-(Alessandro Benedetti, Karl Wright)
-
-CONNECTORS-880: Fix handling of output connector errors during
-clean up phase.
-(Florian Schmedding, Karl Wright)
-
-CONNECTORS-878: Come up with a formula for allocating connections
-to pools when a connection bin is used by multiple pools.
-(Karl Wright)
-
-CONNECTORS-877: Missing Solr i18n key.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-876: Solr indexing exception reports now include the document URI.
-(David Morana, Karl Wright)
-
-CONNECTORS-875: Handle ArrayIndexOutOfBounds and NumberFormatException
-from LAPI as Livelink runtime errors.
-(David Morana, Karl Wright)
-
-CONNECTORS-870: Avoid line break for login.jsp description
-when locale is Japanese.
-(Shinichiro Abe)
-
-CONNECTORS-868: Remove mvn-bootstrap scripts and all mention of them.
-Direct dependencies on missing artifacts are now possible.
-(Muhammed Olgun)
-
-CONNECTORS-867: Make locking system more responsive to UI when
-system under load.  (This is not a complete fix for the issue, but rather
-a pair of partial fixes.)
-(Karl Wright)
-
-======================= Release 1.5 =====================
-
-CONNECTORS-874: Uncaught runtime exception when SolrJ can't talk
-to zookeeper.
-(Karl Wright)
-
-CONNECTORS-872: Throttling hang for web connector, as well as web
-connector not obeying rate throttling.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-873: SolrCloud now depends on noggit; include this in the
-build and dependencies.
-(Alessandro Benedetti, Karl Wright)
-
-CONNECTORS-871: Fix versions caused by the commit for CONNECTORS-833.
-(David Morana, Karl Wright)
-
-CONNECTORS-866: Fix lock-clean scripts.
-(Karl Wright)
-
-CONNECTORS-864: Alfresco only provides 100 search results using CMIS connector with Apache ManifoldCF
-(Piergiorgio Lucidi)
-
-CONNECTORS-865: Wrong version of the parent pom in the alfresco-4-war
-(Piergiorgio Lucidi)
-
-CONNECTORS-863: Increase the number of zookeeper connections allowed;
-this permits agents processes to start on linux.
-(Karl Wright)
-
-CONNECTORS-862: Reduce the binary image footprint by consolidating the
-various lib directories and just changing classpaths.
-(Karl Wright)
-
-CONNECTORS-861: Reduce the example worker thread count so that we
-don't run out of zookeeper resources on Windows.
-(Karl Wright)
-
-CONNECTORS-860: Remove zookeeper.jar from a number of contexts
-where it should not be.  This will reduce the binary footprint by some
-amount and also prevent more than one zookeeper.jar from being in
-the classpath at a time.
-(Karl Wright)
-
-CONNECTORS-858: HDFS repository and output connectors need to be
-fully compatible with multiple Hadoop 2.2.0 file system protocols.
-(Minoru Osuka, Karl Wright)
-
-CONNECTORS-859: Authority tokens should be prefixed with the group name,
-not the connection name.
-(Fran Alvarez, Karl Wright)
-
-CONNECTORS-840: Add ability to suppress all non-specified metadata
-fields in Solr connector.
-(Alessandro Benedetti, Karl Wright)
-
-CONNECTORS-754: Add claim space selection for SharePoint native
-authority, so that it works with Claim Space servers.
-(Will Parkinson, Karl Wright)
-
-CONNECTORS-854: Enable stale connection checks on all http fetches.
-Not sure why it was disabled long ago, but it causes problems when
-connections are pooled for longer than the server wants the connection
-to survive.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-855: Use -D switch in start-webapps scripts to point
-to the right properties.xml file.  Otherwise who knows where the
-properties may come from.
-(David Morana, Karl Wright)
-
-CONNECTORS-851: Add mail.jar to connector wsdl builder to turn off
-warnings.  Also provide ability to extend build with optional include.
-(B. Scott Michel, Karl Wright)
-
-CONNECTORS-850: Add maximum recrawl interval parameter for all
-jobs.  NOTE: Schema change!!
-(Florian Schmedding, Karl Wright)
-
-CONNECTORS-849: Upgrade to Hadoop 2.2.0.
-(Karl Wright)
-
-CONNECTORS-847: Upgrade to SolrJ 4.6.0.
-(Karl Wright)
-
-CONNECTORS-814: Make File System output connector handle
-directory/file conflicts.
-(Karl Wright)
-
-CONNECTORS-733: Write a test which exercises database connection
-interruption logic, and debug the same.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-816: Document revisions to SharePoint connector,
-and new SharePoint authorities.
-(Karl Wright)
-
-CONNECTORS-553: Add email connector.
-(Tishan DahanaYakage, Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-846: Once a service had grabbed all connector
-instances, but was not using them any more, it would not release
-them for other cluster members to use.
-(Karl Wright)
-
-CONNECTORS-844: Remove "per JVM" from connection maximum
-messages in crawler UI.
-(Karl Wright)
-
-CONNECTORS-842: Update documentation to describe the functioning
-of the org.apache.manifoldcf.mysql.client property.
-(Chris Griffin, Karl Wright)
-
-CONNECTORS-843: Solr Connector methods do not call getSession()
-when they should, leading to unpredictable results.
-(Markus Schuch, Karl Wright)
-
-CONNECTORS-841: Always reset document schedules on job start.
-(David Morana, Karl Wright)
-
-CONNECTORS-839: Fix our CloudSolrServer usage to use multipart
-post instead of putting everything in the URL.
-(Alessandro Benedetti, Raymond Wiker, Karl Wright)
-
-CONNECTORS-838: Character-stuff names that ZooKeeper sees, to
-prevent issues with '/' characters.
-(Karl Wright)
-
-CONNECTORS-837: Specifying 1 connection causes hang.
-(Karl Wright)
-
-CONNECTORS-836: Use the same thread context in the registered
-shutdown objects.
-(Karl Wright)
-
-CONNECTORS-835: Fix busted ZooKeeper implementation.
-(Karl Wright)
-
-CONNECTORS-833: Fix Null Pointer exception in LiveLink connector.
-(David Morana, Karl Wright)
-
-CONNECTORS-828: New stylesheet!  Apparently brings the
-crawler UI into the modern world.
-(Eranda Bandaranaike)
-
-CONNECTORS-827: Add a feature which removes all ingeststatus
-records for an output connection, in case that the target index
-is gone forever and is inaccessible.
-(Swami Rajamohan, Karl Wright)
-
-CONNECTORS-795, CONNECTORS-821: Release new versions of
-Solr 3.x, Solr 4.x, ElasticSearch, and SharePoint 2010 plugins.
-(Karl Wright)
-
-CONNECTORS-832: Add example second agents process to all
-multiprocess examples.
-(Karl Wright)
-
-CONNECTORS-831: Refactor ReprioritizationTracker so that it uses
-the interface/factory paradigm.
-(Karl Wright)
-
-CONNECTORS-830: Stuffer thread throttling now works globally, not
-just locally.
-(Karl Wright)
-
-CONNECTORS-781: Add support for multiple agents processes.  This
-ticket involved changing much of the underlying infrastructure for
-the framework, including adding lock manager features, revamping the
-agents framework, building tests, and adding schema features that
-allow for an agents process failure.  All in all, a very significant change,
-which could well have introduced various instabilities.  Please don't
-hesitate to note any issues.
-(Graeme Seaton, Karl Wright)
-
-CONNECTORS-822: Use data size as Long value, not int.
-(David Morana, Karl Wright)
-
-CONNECTORS-819: Add missing metadata to JCIFS connector.
-(Graeme Seaton)
-
-CONNECTORS-817: Improve SharePoint logging.
-(Mark Libucha, Karl Wright)
-
-CONNECTORS-813: For list items, obtain the url from the EncodedAbsURL
-metadata field.  This should allow list items to be clicked on in search results.
-(Mark Libucha, Karl Wright)
-
-CONNECTORS-812: SharePoint connector needs to ignore constructs
-that it doesn't understand when enumerating list contents, because
-under some configurations, SharePoint lists things that aren't list items
-there.
-(Mark Libucha, Karl Wright)
-
-CONNECTORS-810: Update JDBC connector documentation, and add
-documentation for the JDBC authority connector.
-(Karl Wright)
-
-CONNECTORS-805: Add author name/email support to RSS connector.
-(Benjamin Brandmeier, Karl Wright)
-
-CONNECTORS-13: Provide a ZooKeeper method of coordinating
-various ManifoldCF processes, along with an example.
-(Karl Wright)
-
-CONNECTORS-808: Add raw jdbc string so smart users can override the
-default behavior and supply gobbledegook Oracle connect strings.
-(Marcello Lorenzi, Karl Wright)
-
-CONNECTORS-807: Handle the case when there are no documents being
-deleted.
-(Adrian Conlon, Karl Wright)
-
-CONNECTORS-804: Web connector documentation is out of date.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-806: Web connector session passwords were not being
-handled in the UI properly.
-(Karl Wright)
-
-CONNECTORS-803: Add automatic and manual ability to clean out
-repohistory rows.
-(Marcello Lorenzi, Karl Wright)
-
-CONNECTORS-801: Refactor JDBC authority to bring it into compliance with current
-conventions in JDBC connector.  Warning: this change is not backwards
-compatible!  JDBC authority queries now require explicit return column
-names for the user id and token queries!
-(Karl Wright)
-
-CONNECTORS-798: Bring JDBC connector support for CLOBs into the
-modern era.  This also required extension of the CharacterInputFile
-paradigm slightly - a new method to find the utf8 byte length was needed.
-(Karl Wright)
-
-CONNECTORS-797: Bad query when maxcount was exceeded in the
-database table for the jobstatus screen.
-(Graeme Seaton, Karl Wright)
-
-CONNECTORS-796: Fix NPE in RSS connector having to do with
-tags that aren't nested as expected.  CDATA parsing was also broken.
-(Benjamin Brandmeier, Karl Wright)
-
-CONNECTORS-792: Introduce concepts of authorization domain
-and authority group, and appropriate UI, API, etc. changes.  This
-is to support federated authorization models such as what SharePoint
-Claim Space fundamentally does, where there are multiple authorities
-per repository.
-WARNING: Schema change!
-(Karl Wright)
-
-======================= Release 1.4 =====================
-
-CONNECTORS-791: Broken WHERE clause in job status query.
-(Karl Wright)
-
-CONNECTORS-790: Fix NPE when reading job status via API.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-789: Fix broken metadata field display in SharePoint
-connector UI.
-(Mark Libucha, Karl Wright)
-
-CONNECTORS-786: Fix broken Discussion Groups in SharePoint.
-(Mark Libucha, Karl Wright)
-
-CONNECTORS-785: Turn of debug logging for Axis configuration
-exception, to remove spurious log noise.
-(Karl Wright)
-
-CONNECTORS-771: Include new versions of SharePoint plugins in
-distribution.
-(Karl Wright)
-
-CONNECTORS-784: Fix incorrect no-day-of-month-selected message
-when viewing a schedule record.
-(Adrian Conlon, Karl Wright)
-
-CONNECTORS-783: Add support for limiting the amount of counting
-needed for the job status page.
-(Hiroshi Tatsumi, Karl Wright)
-
-CONNECTORS-782: Add unique-ID metadata in SharePoint connector.
-(Dmitry Goldenberg, Karl Wright)
-
-CONNECTORS-778: Add support for attachments in SharePoint
-connector.
-(Dmitry Goldenberg, Karl Wright)
-
-CONNECTORS-772: SharePoint connector wasn't working against
-certain SharePoint instances.  The reason was that some paths
-were relative and some absolute.  Fixed ALL path management to
-have stronger check logic so bad paths are detected, warned, and
-skipped.
-(Dmitry Goldenberg, Karl Wright)
-
-CONNECTORS-775: Use httpclient 4.2.6.
-(Karl Wright)
-
-CONNECTORS-774: Add support for proxies to Wiki connector.
-(Karl Wright)
-
-CONNECTORS-773: Add support for proxies to Jira connectors.
-(Karl Wright)
-
-CONNECTORS-770: Java7 no longer allows an interface to be
-interchangeable with a class.  Modified FileNet stub accordingly.
-(Yann Barraud, Karl Wright)
-
-CONNECTORS-767: Add filename support to Web connector.
-(Shinichiro Abe)
-
-CONNECTORS-769: Include general_parentid in Livelink metadata.
-(David Morana, Karl Wright)
-
-CONNECTORS-768: Add more extensions to ExtensionMimeMap.
-(Shinichiro Abe)
-
-CONNECTORS-766: When using mcf-api-service, multiply query
-parameters are not parsed correctly.
-(Shinichiro Abe)
-
-CONNECTORS-765: Increase crawler-ui session timeout to 30 minutes.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-764: HOPCOUNTREMOVED records need to be reset when
-a job's hopcount limits change.  It also makes sense to reset them
-when the set of documents is changed.
-(Karl Wright)
-
-CONNECTORS-750: Skip files when catching FileNotFoundException,
-e.g. access/permission denied files in FileConnector.
-(Shinichiro Abe)
-
-======================= Release 1.3 =====================
-
-CONNECTORS-761: Fix broken tab in Jira authority connector, and
-don't use startsWith in javascript since IE doesn't recognize it.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-760: HDFSRepositoryConnector's version string is always start with '-'.
-(Minoru Osuka)
-
-CONNECTORS-759: Fix broken content type for login page.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-757: NPE's from GoogleDrive connector when crawling
-documents that don't have a file length.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-756: Fix broken JDBC authority UI.
-(Karl Wright)
-
-CONNECTORS-755: ant rat-sources finds unlicensed files in alfresco connector
-(Karl, Wright, Piergiorgio Lucidi)
-
-CONNECTORS-753: Japanese translations needed for ManifoldCF crawler UI login page and logout link
-(Minoru Osuka, Karl Wright)
-
-CONNECTORS-737: Make crawler-UI more secure.  This ticket requires
-that all users log in to the MCF UI, and also prevents passwords from
-appearing in HTML pages.
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-751: RequestMinimum field not handled properly in API.
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-749: HDFSRepositoryConnector can not fetch files.
-(Minoru Osuka)
-
-CONNECTORS-748: Fix broken regular expressions in file connector, and
-modify file output connector to deal with colons in the file name in an
-acceptable way (so can be used on WIndows too).
-(Minoru Osuka, Karl Wright)
-
-CONNECTORS-729: Break up Jira URL into components, with proper
-javascript checking.
-(Karl Wright)
-
-CONNECTORS-744: Use background threads in HDFS output connector.
-(Karl Wright)
-
-CONNECTORS-742: Document HDFS connector.
-(Karl Wright)
-
-CONNECTORS-741: Document HDFS output connector.
-(Karl Wright)
-
-CONNECTORS-743: Document user mapping functionality.
-(Karl Wright)
-
-CONNECTORS-703: Add mapper plugin functionality, and regular expression
-mapper.  WARNING: This change represents a schema change!!
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-745: Translate FileSystem and HDFS output connector's end-user documentation.
-(Minoru Osuka)
-
-CONNECTORS-740: Add documentation for filesystem connector changes
-and for filesystem output connector.  Also refactor filesystem connector
-for better UI.
-(Karl Wright)
-
-CONNECTORS-738: Update how-to-build-and-deploy to reflect new
-connectors.
-(Karl Wright)
-
-CONNECTORS-739: Update included-connectors on site.
-(Karl Wright)
-
-CONNECTORS-735: Include crawl date in output.  Modified Solr connector
-to allow you to specify indexeddate attribute name.
-(Stephane Gamard, Karl Wright)
-
-CONNECTORS-728: Add HDFS connector
-(Minoru Osuka, Karl Wright)
-
-CONNECTORS-727: Implemented generic API connector
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-734: Catch deadlock error with EXPLAIN ANALYZE in
-postgresql, and ignore it.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-732: Fix crawler-ui's message for 'Waiting' job status.
-(Ahmet Arslan)
-
-CONNECTORS-723: Add a Jira connector.  This connector does not yet
-handle security or comments, but may be extended in the future to do
-so.
-(Andrew Janowczyk, Karl Wright)
-
-CONNECTORS-725: Update to SolrJ 4.3.1.
-(Karl Wright)
-
-CONNECTORS-722: Fix hang during seeding in DropBox connector and
-GoogleDrive connector.
-(Andrew Janowczyk, Karl Wright)
-
-CONNECTORS-721: Fix a refactoring error in DropBox connector.
-(Andrew Janowczyk)
-
-CONNECTORS-715: Add sufficient logging to the Web Connector so that
-people can diagnose their own "why didn't it index" questions.
-(TC Tobin-Campbell, Karl Wright)
-
-CONNECTORS-717: Alfresco Connector needs a new parameter for the Socket Timeout
-(Piergiorgio Lucidi)
-
-CONNECTORS-714: All LiveLink connector to use LAPI for document fetches.
-(David Morana, Karl Wright)
-
-CONNECTORS-718: Alfresco Connector must throw exceptions with handler methods
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-713: Alfresco connector needs to deal with IOExceptions better
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-623: Use UTF-8 for encoding headers in SolrJ post.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-716: RepositoryDocument.addField() would go into an
-infinite loop if field value was null.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-710: FileConnector should have option of outputting a full http url based on Wget conventions, not just a file:/ url
-(Minoru Osuka, Karl Wright)
-
-CONNECTORS-667: Refix NPE problem with Livelink authority.  This time
-we were seeing it when SSL was not on.
-(David Morana, Karl Wright)
-
-CONNECTORS-712: ArrayIndexOutOfBoundsException in the Alfresco Connector
-(Karl Wright)
-
-CONNECTORS-711: Wrong date parsing of the Alfresco Connector
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-705: Upgrade the CMIS Connector to OpenCMIS 0.9.0
-(Piergiorgio Lucidi)
-
-CONNECTORS-706: Update documentation to require JDK 1.7.
-(Karl Wright)
-
-CONNECTORS-635: Alfresco test sometimes fails; upgrade to Alfresco 4.0 recommended
-(Piergiorgio Lucidi)
-
-CONNECTORS-707: Treat special character "." as meaning "no extension",
-for ElasticSearch and OpenSearchServer output connectors.
-(TC Tobin-Campbell, Karl Wright)
-
-CONNECTORS-708: Make JDBC connector check mime type for indexability,
-if it is present.
-(Richard Nichols, Karl Wright)
-
-CONNECTORS-709: Escape \r, \n, \f, and \b in ElasticSearch connector.
-(Richard Nichols, Karl Wright)
-
-CONNECTORS-701: Add forced ACLs to DropBox connector.  Fixed a
-few UI-related other problems as well.
-WARNING: This is a non-backwards-compatible change!!
-(Karl Wright)
-
-CONNECTORS-702: Add forced ACLs to GoogleDrive connector.  Also
-fixed a number of UI-related issues.
-(Karl Wright)
-
-CONNECTORS-684: Add Dropbox connector end-user documentation for
-Japanese.
-(Shinichiro Abe)
-
-CONNECTORS-687: Fix the way documents are indexed via DropBox, so
-that dangling threads are not left unjoined, and all common metadata
-is set in RepositoryDocument.
-(Karl Wright)
-
-CONNECTORS-700: Fix ISO8601 date parsing to handle timezones with
-colons in them, e.g. -08:00
-(Stephane Gamard, Karl Wright)
-
-CONNECTORS-698: Add various required metadata values to the
-GoogleDrive connector.
-(Karl Wright)
-
-CONNECTORS-693: Support for gzip and deflate encoding for web
-connector.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-694: Add Google Drive connector.
-(Andrew Janowczyk, Karl Wright)
-
-CONNECTORS-690: For ElasticSearch connector, include _name and
-_content_type field within "file" portion of JSON, so it will work properly
-with the Mapper Attachment Plugin.
-(Richard Nichols, Karl Wright)
-
-CONNECTORS-692: Add support for basic auth in wiki connector.
-(TC Tobin-Campbell, Karl Wright)
-
-CONNECTORS-689: Add ability to crawl user workspaces in LiveLink
-connector.
-(David Morana, Karl Wright)
-
-CONNECTORS-696: FileSystem Output Connector.
-(Minoru Osuka)
-
-======================= Release 1.2 =====================
-
-CONNECTORS-682: Fix expect-continue issues with Solr when there is
-a Solr delay of more than 3 seconds.
-(Oleg Kalnichevski, Erlend Garåsen, Karl Wright)
-
-CONNECTORS-683: Add Dropbox connector end-user documentation.
-(Andrew Janowczyk)
-
-CONNECTORS-586: Fix native2ascii incompatibility with Java 7.
-(Christian Ziech, Karl Wright)
-
-CONNECTORS-685: Handle the case when connector model is
-ADD_CHANGE_DELETE and you change configuration data.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-676: Include DropBox connector.
-(Andrew Janowczyk, Karl Wright)
-
-CONNECTORS-678: Add missing noteModification() method calls, so
-that jobqueue is reanalyzed more frequently.
-(Karl Wright)
-
-CONNECTORS-681: ElasticSearch and OpenSearchServer connectors
-both misused the File object passed to them in checkFileIndexable()
-in order to see if the extension was a supported one.  Instead they
-should have been checking the URL.  Added that code as well as changed
-the JCIFS connector to check indexability using the URL means.
-(konrad, Karl Wright)
-
-CONNECTORS-679: Web connector hangs during throttling.  Reason
-appears to be that it is possible to interrupt the beginRead() method
-after it goes into "obtain estimate" mode.  Added code to make it clean
-up in that case.  Also applied to RSS connector.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-677: Close body streams where required.
-(Karl Wright)
-
-CONNECTORS-599: Upgrade to a new version of Derby which doesn't
-stall.
-(Karl Wright)
-
-CONNECTORS-675: Fix for json UTF-8 encoding, elastic search
-connector.
-(Karl Wright)
-
-CONNECTORS-649: Adopt httpclient 4.2.4.
-(Karl Wright)
-
-CONNECTORS-671: Trim end-user documentation images.
-(Karl Wright)
-
-CONNECTORS-673: Update end-user documentation for the Active
-Directory authority.
-(Karl Wright)
-
-CONNECTORS-672: Update end-user documentation to include
-Forced Metadata tab.
-(Karl Wright)
-
-CONNECTORS-669: UI did not allow empty connection name to be
-changed, for either authority or repository connections.
-(Karl Wright)
-
-CONNECTORS-670: Update end-user documentation for RSS connector.
-(Karl Wright)
-
-CONNECTORS-642: Add Elastic Search plugin.
-(Simon Willnauer, Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-668: Update end-user documentation for LiveLink
-connector and authority.
-(Karl Wright)
-
-CONNECTORS-665: Update Solr connector type end-user documentation.
-(Karl Wright)
-
-CONNECTORS-667: Fix livelink authority caching to work properly with
-new SSL connection support.
-(David Morana, Karl Wright)
-
-CONNECTORS-666: Ant build broken
-(Piergiorgio Lucidi)
-
-CONNECTORS-644: Add support for Livelink SSL connections via LAPI.
-(David Morana, Karl Wright)
-
-CONNECTORS-663: Add support for minimal crawling.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-662: RSS connector now supports ISO8601 dates.
-(David Morana, Karl Wright)
-
-CONNECTORS-661: Turn on expect-continue for solr output.  Otherwise
-basic auth won't work.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-657: Add a standard way of handling created and modified dates
-throughout ManifoldCF, so that these can be dealt with consistently in
-an output connector.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-660: CMIS connector created date and modified date support
-(Piergiorgio Lucidi)
-
-CONNECTORS-659: Alfresco connector created date and modified date support
-(Piergiorgio Lucidi)
-
-CONNECTORS-656: Add mimetype and/or filename support to CMIS connector
-(Piergiorgio Lucidi)
-
-CONNECTORS-655: Add mimetype and/or filename support to Alfresco connector
-(Piergiorgio Lucidi)
-
-CONNECTORS-658: Add common metadata support (mimetype etc)
-to Livelink connector.
-(David Morana, Karl Wright)
-
-CONNECTORS-654: Move extension to mimetype mapping to a
-central location.
-(Mark Lugert, Karl Wright)
-
-CONNECTORS-653: Include filename in SharePoint connector.
-(Mark Lugert, Karl Wright)
-
-CONNECTORS-652: Add documentation for new script client and API
-features.
-(Karl Wright)
-
-CONNECTORS-651: Add query argument support to script client.
-(Karl Wright)
-
-CONNECTORS-63: Add API support for history and queue reports.
-(Karl Wright)
-
-CONNECTORS-650: Set a reasonable socket timeout for SharePoint
-and Meridio connectors.
-(Mark Lugert, Karl Wright)
-
-CONNECTORS-648: Revamp how tld's are used, for compatibility with
-Tomcat.
-(Jan Høydahl)
-
-CONNECTORS-647: Add the resource.name hint to the Solr output
-connector.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-623: A better fix, overriding the posting method for
-SolrJ and forcing multipart post.  Although still a hack, this should cause
-the behavior to work like MCF 1.0.1 now.
-(Karl Wright)
-
-CONNECTORS-645: Handle null data properly in worker thread.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-644: Restart button did not work.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-643: Fix spurious error report for Elastic Search deletions
-in Simple History.
-(Karl Wright)
-
-CONNECTORS-641: Add filename, mimetype, acls, and proper escaping
-to ElasticSearch connector.
-(Karl Wright)
-
-CONNECTORS-633: Remove dependency on custom version of xerces;
-extend the simple tag parser to be able to handle XML, and move it into
-core/fuzzyml for general use.
-(Karl Wright)
-
-CONNECTORS-639: Maven execute of jetty-runner fails.
-(Maciej Li¿ewski)
-
-CONNECTORS-638: Idle-time leak of database connection handles,
-so that allocation is lost forever from the pool.
-(Erlend Garåsen, Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-615: Add ability to exclude content based on regexp
-to RSS connector.
-(David Morana, Karl Wright)
-
-CONNECTORS-637: Interpret null mime types and extensions reasonably
-in ElasticSearch connector.
-(Andrew Clegg, Karl Wright)
-
-CONNECTORS-631: Support Znode path by Solr Output Connection.
-(Minoru Osuka)
-
-CONNECTORS-632: Get mvn-bootstrap scripts working again as
-intended.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-629: Revamp error handling in ElasticSearch connector.
-(Andrew Clegg, Karl Wright)
-
-CONNECTORS-625: Finish internationalization work for parts of the
-core crawler UI.
-(Karl Wright)
-
-CONNECTORS-552: Add support for forced metadata in all jobs.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-624: Add indexing via subsidiary thread to OpenSearchServer
-connector.
-(Karl Wright)
-
-CONNECTORS-606: Add indexing via subsidiary thread to ElasticSearch
-connector.
-(Karl Wright)
-
-CONNECTORS-394: Fully internationalize crawler UI.
-(Karl Wright)
-
-======================= Release 1.1 =====================
-
-CONNECTORS-630: Work around SolrJ paramname encoding bug.
-(David Morana, Karl Wright)
-
-CONNECTORS-627: Upgrade SolrJ to 4.1.0 from 4.0.0
-(Minoru Osuka)
-
-CONNECTORS-623: The stream_size and stream_name can be sent to Solr now.
-(Shinichiro Abe)
-
-CONNECTORS-622: CMIS Connector returns NPE trying to get an empty boolean or date value
-(Piergiorgio Lucidi)
-
-CONNECTORS-617: Simple report NPE under Derby.
-(Karl Wright)
-
-CONNECTORS-621: Solr connector commit logic needs to use specified
-update path.
-(Karl Wright)
-
-CONNECTORS-620: It was possible for the JDBC Connector to leak
-JDBC connections under some error conditions.
-(Anthony Leonard, Karl Wright)
-
-CONNECTORS-619: Include slf4j jars in multiprocess agents classpath.
-This was causing Solrj to not work on multiprocess deployments.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-618: MySQL orders indexes so that NULL values are first.
-This is a problem for the stuffer query, which then must go through
-millions of rows before it finds the one it is looking for.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-616: Work around Solr 4.0 or Jetty bug where connections
-are dropped randomly under multithreaded load.  Broken pipe exceptions
-are now retried after a minute, for up to three times, before the Solr
-connector concludes that the document cannot be indexed and skips it.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-613: Add a way of getting a document's mime type
-to Solr, since Tika needs mime type in order to extract content
-since Solr 4.0.0.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-614: Solr connection release not working right.
-(Karl Wright)
-
-CONNECTORS-582: Upgrade to official httpcomponents 4.2.3
-release.
-(Karl Wright)
-
-CONNECTORS-612: Disable HttpClient retries everywhere.
-(Karl Wright)
-
-CONNECTORS-611: Handle inability to get permissions for funky docs
-by skipping those docs, rather than throwing an NPE.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-610: Can't use retries with httpclient instance used
-with solrj, so disable retries explicitly.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-609: Solrj doesn't always set the code property of
-its http exceptions right, so we need to parse it out ourselves.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-608: Solr connector times out chronically on some
-documents.
-(David Morana, Karl Wright)
-
-CONNECTORS-607: Handle multi-valued parameters properly in the
-Solr connector.
-(Minoru Osuka, Shinichiro Abe, Karl Wright)
-
-CONNECTORS-603: Upgrade the CMIS Connector to OpenCMIS 0.8.0
-(Piergiorgio Lucidi)
-
-CONNECTORS-604: Make headers exactly the same as for MCF 1.0.1.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-605: Maven build is broken: commons-httpclient version is missing
-(Piergiorgio Lucidi)
-
-CONNECTORS-601: Revise algorithm for screening out documents that
-are not text in the web connector.  Since CJK characters mess up the
-old definition of "strange" character, use the more-limited definition of
-all non-whitespace characters less than 32.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-600: Add a field to the RSS connector that contains
-document origination date in ISO 8601 format.
-(David Morana, Karl Wright)
-
-CONNECTORS-598: Add an RSS connector mode that allows just
-metadata to be consumed, in conjunction with content from description
-or content fields.
-(David Morana, Karl Wright)
-
-CONNECTORS-596: RSS and Web connectors need to peel off any
-namespace qualifies from tag names when processing XML feeds.
-(David Morana, Karl Wright)
-
-CONNECTORS-594: Port Solr connector to use SolrJ, and add
-capability to work with SolrCloud installations.
-(Minoru Osuka, Ryan McKinley, Karl Wright)
-
-CONNECTORS-593: Skip hidden files in JCIFS connector.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-592: Add "last modified" metadata to JCIFs connector.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-591: Elasticsearch download URL has changed.
-(Minoru Osuka)
-
-CONNECTORS-589: Parse multiple link tags inside an entry tag, for
-Atom feeds.
-(David Morana, Karl Wright)
-
-CONNECTORS-543: Add testing infrastructure for combined war.
-(Karl Wright)
-
-CONNECTORS-587: Manual startup did not properly set lastchecktime.
-(Maciej Li¿ewski, Karl Wright)
-
-CONNECTORS-578: Refactor Livelink connector, and add support for
-general metadata.
-(David Morana, Karl Wright)
-
-CONNECTORS-584: Fix MySQL use of indexes on ORDER-BY stuffing query.
-Turns out that MySQL will not order by an index unless only the first column
-in the index is specified in the ordering criteria.  Still need to check if this
-breaks other databases like PostgreSQL, Derby, or HSQLDB.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-583: Catch MySQL lock timeout, and retry that transaction.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-581: Port OpenSearchServer connector and ElasticSearch
-connector to httpcomponents.
-(Karl Wright)
-
-CONNECTORS-566: Simple JDBC Authority connector.
-(Maciej Li¿ewski)
-
-CONNECTORS-563: Augment LDAP authority to include new features.
-(Maciej Li¿ewski)
-
-CONNECTORS-580: Remove build of commons-httpclient-mcf, and all
-ant and maven dependencies.
-(Karl Wright)
-
-CONNECTORS-579: Add untrusted, unverified https support to the RSS
-connector.
-(David Morana, Karl Wright)
-
-CONNECTORS-575: Modify Livelink connector build to use stub only when
-there is no lapi.jar available.  This is to support the fact that lapi jars are
-not compatible from release to release, class-wise, so clients will need to
-build this connector against the jar that they have, instead of the jar that
-we have.
-(David Morana, Karl Wright)
-
-CONNECTORS-577: Typo in language message properties which cause stack
-traces
-(Erlend Garåsen)
-
-CONNECTORS-120: Port ManifoldCF to httpcomponents 4.2.2, from legacy
-commons-httpclient 3.1 (mcf edition).
-(Karl Wright)
-
-CONNECTORS-574: Add more Web connector session login stages, and
-a session login test.
-(Karl Wright)
-
-CONNECTORS-573: Add the ability to specify path separator characters
-in the LiveLink connector.
-(David Morana, Karl Wright)
-
-CONNECTORS-571: MySQL timeout was not being handled properly.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-569: Add User-Agent header for Wiki connector.
-Newer versions of Wiki need this.
-(Karl Wright)
-
-CONNECTORS-560: Use standard patch if "svn patch" is not available.
-(Alex Ott, Karl Wright)
-
-CONNECTORS-568: Combined web.xml file contains wrong declarations.
-(Swami Rajamohan)
-
-CONNECTORS-562: Some web.xml files contain wrong declarations
-(Alex Ott, Erlend Garåsen)
-
-CONNECTORS-564: Configure velocity to use the ManifoldCF log
-configuration and the logger "velocity".
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-561: Only download font packages if they aren't already
-present.
-(Alex Ott)
-
-CONNECTORS-559: Help link of navigation.jsp is incorrect by locale.
-(Shinichiro Abe)
-
-CONNECTORS-558: Fix 'Insert Here' button.
-(Shinichiro Abe)
-
-CONNECTORS-556: performCommit() is in the wrong place for
-ingeststatus table update.
-(Karl Wright)
-
-CONNECTORS-542: Add pom.xml for LDAP authority.
-(Karl Wright)
-
-CONNECTORS-550: Ant targets for zip distributions were not working
-on Linux variants.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-535: Move readme files into Solr plugin modules.
-(Karl Wright)
-
-======================= Release 1.0.1 ====================
-
-CONNECTORS-555: Alfresco maven build is broken
-(Piergiorgio Lucidi)
-
-CONNECTORS-551: Resetting agents process causes job's seed
-documents to be flipped into the PURGATORY state, which in turn
-may cause the documents to be deleted and the job to be shut down
-if the seed documents are the only documents.
-(Martin Gielow, Karl Wright)
-
-CONNECTORS-546: Rework the how-to-build-and-deploy documentation
-page to be clearer and also cover the combined war.
-(Karl Wright)
-
-======================= Release 1.0 =====================
-
-CONNECTORS-549: Wrong credentials not correctly managed by CMIS Connector
-(Piergiorgio Lucidi)
-
-CONNECTORS-548: Update maven build documentation to reflect limitations
-in how maven builds can be done.
-(Erlend Garåsen, Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-547: Web crawler, on encountering fatal error with no
-contents, would throw a StringIndexOutOfRange exception.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-545: web-proprietary wars need to be used by single-
-process proprietary example.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-544: Add missing materials to combined service war.
-Also include a way of easily invoking it from the single-process example
-directory.
-(Karl Wright)
-
-CONNECTORS-540: Multi-process proprietary webapps run not properly
-running the start-webapps.sh.
-(Shinichiro Abe)
-
-CONNECTORS-539: Multi-process agent run not properly initializing
-crawler/authority environment.
-(Karl Wright)
-
-CONNECTORS-538: Maven build broken on SharePoint Connector
-(Piergiorgio Lucidi)
-
-CONNECTORS-537: NPE when trying to display a history report when
-the corresponding connector is unregistered.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-533: Do not forgo xxx-README files in connector-lib-proprietary.
-(Karl Wright)
-
-CONNECTORS-532: Update 'incubator' and redirected URLs in various places.
-(Ahmet Arslan)
-
-CONNECTORS-531: Add Japanese translation for LDAP connector
-documentation.
-(Shinichiro Abe)
-
-CONNECTORS-530: Add documentation for the Use SIDs checkbox in
-the JCIFS connector Server tab.
-(Karl Wright)
-
-CONNECTORS-528: Add documentation for LDAP authority.
-(Karl Wright)
-
-CONNECTORS-529: Add Japanese translations for LDAP authority.
-(Shinichiro Abe)
-
-CONNECTORS-515: Add LDAP connector, and modify JCIFS connector
-to allow account names to be used instead of SIDs.
-(Maciej Lizewsky, Karl Wright)
-
-CONNECTORS-526: Clarify JCIFS connector documentation.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-525: Upgrade to OpenCMIS 0.7.0
-(Piergiorgio Lucidi)
-
-CONNECTORS-527: Error during CMIS ingestion of nodes without binary content
-(Piergiorgio Lucidi)
-
-CONNECTORS-518: Add Wiki protected content access support to the
-Wiki Connector.  Thanks to Maciej Lizewski for this contribution.
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-486: Optionally encrypt the file which the crawler configuration
-is exported to.
-(Erlend Garåsen)
-
-CONNECTORS-523: Build a combined war that can be deployed alone
-on Tomcat and bring all of ManifoldCF's functionality with it.
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-524: Do not deregister connectors in single-process
-code unless they are being removed or changed.
-(Karl Wright)
-
-CONNECTORS-520 : Add pom.xml to SharePoint connector module
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-519: maven build of mcf-test-materials/mcf-alfresco-war-test fails
-(Ahmet Arslan, Piergiorgio Lucidi)
-
-CONNECTORS-521: Fix project site's broken search
-(Ahmet Arslan)
-
-CONNECTORS-492: Replace Lists.GetListItems call with a custom call,
-in SharePoint connector, to dodge limits on size of response.
-(Ahmet Arslan, Piergiorgio Lucidi, Joe Becknell, Karl Wright)
-
-CONNECTORS-522: Wiki connector namespace tab was non-functional.
-(Maciej Lizewski, Karl Wright)
-
-CONNECTORS-517: Internationalization bug; leftover "&nbsp;" in the
-English translations file.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-513: Fix HTML parsing in WebConnector so that we
-recognize a default input type to be "text", and deal with missing
-"value" attributes in "option" tags.
-(Karl Wright)
-
-CONNECTORS-514: Revamp ManifoldCF.initializeEnvironment and
-ManifoldCF.cleanUpEnvironment to use reference counting so that more
-than one user of these methods can coexist in the same VM.
-(Karl Wright)
-
-CONNECTORS-512: Revise documentation to include new access-
-method pulldown and corresponding screen shot.
-(Karl Wright)
-
-CONNECTORS-510: MySQL now periodically runs ANALYZE on tables
-to be sure the plan(s) are reasonable.
-(Karl Wright)
-
-CONNECTORS-509: Allow JDBC Connector to choose which column
-access method to use.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-507: Improve JCIFs Connector documentation.
-(Swapna Vuppala)
-
-CONNECTORS-508: Improve SharePoint connector documentation.
-(Ahmet Arslan)
-
-CONNECTORS-493: Improve JDBC connector documentation as it
-pertains to metadata handling.
-(Karl Wright)
-
-CONNECTORS-506: Missing quotes in start-database.sh cause HSQLDB
-to start with the wrong parameters.
-(Fred Toussi, Karl Wright)
-
-CONNECTORS-502: Fix MySQL transaction handling.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-505: Fix for "unknown state" issue with SharePoint
-UI.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-504: Stop agents process from talking to database after
-the stop signal has been sent.
-(Karl Wright)
-
-CONNECTORS-503: Add support in status reports for hopcount exceeded
-status.
-(Karl Wright)
-
-CONNECTORS-501: Fix hopcount logic to return a deterministic
-number of documents.  A number of race conditions were discovered
-and corrected.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-497: Add Lists support to the SharePoint connector.
-(Ahmet Arslan, Karl Wright)
-
-CONNECTORS-500: Tests were hanging or otherwise doing strange
-things on exit.  This was because the connection pool was being
-closed when the web application(s) were being unloaded, meaning
-that cleanup of the database took place with the pool in an
-inconsistent state.
-(Karl Wright)
-
-CONNECTORS-494: Fix the build to conditionally include registration
-commands for connectors that are built with stubs.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-488: Add Cache tab for all authority connectors that
-support caching, so that the cache parameters can be varied.
-(Karl Wright)
-
-CONNECTORS-470: Extend SharePoint connector to work with
-SharePoint 2010.
-(Ahmet Arslan, Fatih Samet Cetin, Joe Becknell, Karl Wright)
-
-======================= Release 0.6 =====================
-
-CONNECTORS-489: Fix user-agent string in web and rss connectors
-so that ISA proxies don't refuse to proxy the requests.
-(Jan van Haarst)
-
-CONNECTORS-487: Upgrade to HSQLDB 2.2.9.
-(Karl Wright)
-
-CONNECTORS-485: Upgrade to manifoldcf solr plugin versions 0.2.
-(Karl Wright)
-
-CONNECTORS-99: Improve documentation for JSON in REST services so
-that syntactic simplifications made by ManifoldCF are spelled out.
-(Karl Wright)
-
-CONNECTORS-474: Make it possible to build a complete release candidate
-and site javadoc without requiring any proprietary libraries or interface
-code installed.  This is accomplished by: (a) including stub non-proprietary
-classes that can be compiled against, and (b) including WSDLs and XSDs
-generated from proprietary .NET libraries, but which are not proprietary
-themselves (according to LEGAL-137).
-(Joe Becknell, Sam Ruby, Karl Wright)
-
-CONNECTORS-484: The FileNet connector UI has been broken since
-the i18n work was done on it.
-(Joe Becknell, Karl Wright)
-
-CONNECTORS-461: Mime types and document length restrictions and
-commit option for Solr output connector need documentation
-(Erlend Garåsen)
-
-CONNECTORS-483: Add NTLM proxy support for Web Connector.
-(Karl Wright)
-
-CONNECTORS-482: Need to include at least a portion of the HTTP
-body in history message whenever a non-200 HTTP code comes back.
-(Karl Wright)
-
-CONNECTORS-481: Documentation of API is wrong in a few spots.
-(Adrian Conlon, Karl Wright)
-
-CONNECTORS-480: Documentum and FileNet connector run.sh scripts
-broken.
-(Joe Becknell, Karl Wright)
-
-CONNECTORS-479: Alfresco end-to-end tests were broken due to
-missing jetty jar.
-(Karl Wright)
-
-CONNECTORS-478: Catch event constraint-violation exception in Derby.
-This was not being interpreted as a retry situation because it is no
-longer inside a transaction.
-(Marcin Goss, Karl Wright)
-
-CONNECTORS-473: Split the ManifoldCF site into two distinct pieces.
-One is housed under "site/trunk" and contains the project site.  The other
-is housed under "trunk/site" and generates the release documentation.
-(Karl Wright)
-
-CONNECTORS-476: Allow for remote MySQL connections.
-(Shigeki Kobayashi, Karl Wright)
-
-CONNECTORS-472: Make changes related to graduation.
-(Karl Wright)
-
-CONNECTORS-471: Replace broken HSQLDB 2.2.8 with a trunk build.
-(Karl Wright)
-
-CONNECTORS-96: Remove jdbcpool driver, and replace with a simple
-set of pooling classes.  This gives us better control and makes failures
-on long crawls less likely.
-(Karl Wright)
-
-CONNECTORS-469: Hook up context listener to catch web application
-shutdown more efficiently.
-(Karl Wright)
-
-CONNECTORS-453: Getting deadlock problems and other issues with
-Derby 10.8.1.1.
-(Karl Wright)
-
-CONNECTORS-467: Remove outdated taglib directives in web.xml
-(Erlend Garåsen)
-
-CONNECTORS-468: Wrap ResourceBundle class so that missing keys
-in a resource bundle are dealt with in a friendlier way.
-(Karl Wright)
-
-CONNECTORS-466: Fix expression error in CMIS connector javascript.
-(Karl Wright)
-
-CONNECTORS-465: Revamp the expression parsing in the python
-browser simulator to actually obey the Javascript precedence rules.
-(Karl Wright)
-
-CONNECTORS-464: Improve document deletion cleanup logic for
-hopcounts, so that no references to deleted documents remain.
-(Karl Wright)
-
-CONNECTORS-462: Change "<" and ">" characters to HTML entities in
-connectors
-(Erlend Garåsen)
-
-CONNECTORS-459: Upgrade to require JDK 1.6 across the board.  Get the
-(broken) maven build also working consistently with the ant build.
-(Karl Wright)
-
-CONNECTORS-435: Replace incorrect Messages.getString() calls in the main
-UI with correct ones.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-460: Add multi-domain-controller support to the
-Active Directory authority.
-(Colin Anderson, Karl Wright)
-
-CONNECTORS-456: Fix a typo in dist-license/README.txt.
-(Karl Wright, Alex Ott)
-
-CONNECTORS-455: Fix an internationalization error on the max activities
-and max bandwidth reports.
-(Karl Wright)
-
-CONNECTORS-450: Make sure all ant exec operations check properly for
-errors.  This should prevent people from getting a bad dependencies
-build if they have the wrong svn client (for instance).
-(Karl Wright)
-
-CONNECTORS-430: An error should be returned if invalid seeds are typed
-into the seeds list for the web connector
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-449: Fix browser simulator so that UI tests work again.
-(Karl Wright)
-
-CONNECTORS-436: Refer to older releases via archive.apache.org, not
-via the mirrors.
-(Karl Wright)
-
-CONNECTORS-436: Upgrade the README.txt file to accurately describe
-how to work with the binary distribution.
-(Karl Wright)
-
-CONNECTORS-432: Make sure quotations are in the javascript everywhere,
-not in the translation resources.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-431: Update pom.xml versions.
-(Karl Wright)
-
-======================= Release 0.5 =========================
-
-CONNECTORS-457: Fix for i18n problem with unknown locale picking up
-partial translations.
-(Karl Wright, Piergiorgio Lucidi, Alex Ott)
-
-CONNECTORS-454: Provide disclaimer file for all packages, not just
-source package.
-(Karl Wright)
-
-CONNECTORS-452: Get a version of postgresql jdbc driver compatible
-with JDK 1.5, and make sure it is actually in the classpath for single-
-process example.
-(Karl Wright)
-
-CONNECTORS-451: mvn-bootstrap scripts were broken.
-(Karl Wright)
-
-CONNECTORS-448: Fix xerces build for Linux machines.
-(Karl Wright)
-
-CONNECTORS-447: Deliver lib contents at root level in lib package.
-(Karl Wright)
-
-CONNECTORS-446: Correct problems blocking build in Japan.
-(Karl Wright, Shinichiro Abe)
-
-CONNECTORS-445: Each distribution has its own licensing and readme files.
-(Karl Wright)
-
-CONNECTORS-444: Update documentation to reflect new process for
-building from source.
-(Karl Wright)
-
-CONNECTORS-442: Fix the binary exclusion rules to not include target
-or the xml build files.
-(Karl Wright)
-
-CONNECTORS-443: Build all patched jars we distribute; do not rely on svn
-for any binaries.
-(Karl Wright)
-
-CONNECTORS-441: Refactor how integration packages are delivered for
-better consistency.
-(Karl Wright)
-
-CONNECTORS-440: Build should exclude integration content from external
-sources.
-(Karl Wright, Shinichiro Abe)
-
-CONNECTORS-437: Change the ant jar distribution model so that no
-binary files are included in the source distribution.  All of them are now
-downloaded via the ant "download-dependencies" target.
-(Karl Wright)
-
-CONNECTORS-434: Describe which licenses we select for our dual-licensed
-jars.
-(Karl Wright)
-
-CONNECTORS-433: Update copyright date.
-(Karl Wright)
-
-CONNECTORS-429: Check for the 'no process at end of pipe' condition
-in the JCIFS connector.
-(T.Akagi, Karl Wright)
-
-CONNECTORS-428: Include LICENSE.txt file mention of the IPA license
-for Japanese PDF documentation fonts.
-(Karl Wright)
-
-CONNECTORS-425: Elastic Search documentation missing images
-(Piergiorgio Lucidi)
-
-CONNECTORS-423: Elastic Search connector should handle document metadata
-(Luca Stancapiano, Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-424: Add RepositoryDocument.getFileName for posting file
-name as metadata.
-(Shinichiro Abe)
-
-CONNECTORS-427: The default value for "include only host matching seeds"
-should be yes/checked
-(Erlend Garåsen)
-
-CONNECTORS-288: Add Elastic Search connector.
-(Luca Stancapiano, Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-422: Rearrange Velocity templates so that there's one
-template per tab.
-(Karl Wright)
-
-CONNECTORS-381: Add an OpenSearchServer UI test.  While we were
-at it fixed a broken CMIS UI.
-(Karl Wright)
-
-CONNECTORS-421: Add hooks to permit agents "process" to be reset
-by ManifoldCF.resetEnvironment().
-(Karl Wright)
-
-CONNECTORS-420: Revise the way we use Velocity so that we can make
-better use of it for internationalization purposes, and for things like loops
-etc.
-(Karl Wright)
-
-CONNECTORS-419: Alfresco Connector needs to invoke the ingestDocument for each d:content property of a node
-(Piergiorgio Lucidi)
-
-CONNECTORS-417: CMIS Connector creates documentURI with wrong value when version is null.
-Now the documentURI to get the content stream is retrieved from the CMIS server using an internal method of the OpenCMIS API.
-(Piergiorgio Lucidi)
-
-CONNECTORS-416: Fix web connector authentication tab.
-(Karl Wright)
-
-CONNECTORS-415: Fix script language documentation.
-(Karl Wright)
-
-CONNECTORS-414: Fix incorrect path in executecommand.sh, start-webapps.sh
-and start-database.sh
-(Shinichiro Abe)
-
-CONNECTORS-413: Use the right variable variant in all places for the Open
-Search Server connector.
-(Karl Wright)
-
-CONNECTORS-412: Port OpenSearchServer connector to use Velocity rather than
-the internal home-grown substitution.
-(Luca Stancapiano)
-
-CONNECTORS-410: Allow dfc.properties to be used instead of dmcl.ini for
-determination of correct value of the DOCUMENTUM environment variable.
-(Karl Wright)
-
-CONNECTORS-411: Execution of integration tests from Maven is broken
-(Piergiorgio Lucidi)
-
-CONNECTORS-406: Use MultiThreadedHttpConnection manager in script
-engine and in OpenSearchServer connector.
-(Luca Stancapiano, Karl Wright)
-
-CONNECTORS-409: Set mcf-ui-core.jar to all the examples lib.
-(Shinichiro Abe)
-
-CONNECTORS-408: Rearrange the script-engine directory in a manner
-consistent with other dist directories, and also use a different env variable
-(ENGINE_HOME) so that we don't conflict with MCF_HOME.
-(Karl Wright)
-
-CONNECTORS-407: Set the executable bit in the distribution directory
-for .sh files during ant build.
-(Karl Wright)
-
-CONNECTORS-405: Do not include sources in binary distribution.  This
-is no longer essential since we deliver built jars for all the connectors
-now.
-(Karl Wright)
-
-CONNECTORS-327: Share the web applications among all the examples.
-(Karl Wright)
-
-CONNECTORS-402: Change the ant build process to produce two artifacts -
-one with proprietary material, and the other without.  This allows for
-releases that include built connectors even though we do not ship the
-proprietary material.
-(Karl Wright, Piergiorgio Lucidi)
-
-CONNECTORS-403: Fix the sidecar process scripts to use the same
-definition for MCF_HOME as everything else uses.  Also promote these
-scripts to the root level in their individual process directory.
-(Karl Wright)
-
-CONNECTORS-401: Update the website with some material about the project
-(Piergiorgio Lucidi)
-
-CONNECTORS-351: Alfresco Connector documentation must be updated
-(Piergiorgio Lucidi)
-
-CONNECTORS-398: Japanese localization for Alfresco connector.
-(Hitoshi Ozawa)
-
-CONNECTORS-396: Japanese updates for the CMIS connector.
-(Hitoshi Ozawa)
-
-CONNECTORS-399: Update Japanese site to reflect release of ManifoldCF 0.4-incubating.
-(Hitoshi Ozawa)
-
-CONNECTORS-387: Generate end-user-documentation.pdf properly in Japanese.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-397: Alfresco Connector UI must be conformed with Apache Velocity
-(Piergiorgio Lucidi)
-
-CONNECTORS-395: CMIS Connector UI must be completely conformed with Apache Velocity
-(Piergiorgio Lucidi)
-
-CONNECTORS-392: Complete translation to Japanese of index.xml and
-concepts.xml.
-(Hitoshi Ozawa)
-
-CONNECTORS-388: Incorporate Apache Velocity as a connector UI rendering
-option, and modify the CMIS connector's UI to use it as an example.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-391: Multiprocess example web apps didn't work, due to missing
-jars.
-(Karl Wright)
-
-CONNECTORS-390: JDBC drivers cannot work from anything other than the
-root classpath.  This is because of a flaw with JDBC.  I've changed the instructions
-accordingly, and provided built-in support for all drivers the JDBC connector
-knows about.
-(Karl Wright)
-
-CONNECTORS-389: Chemistry in-memory war renaming breaks mvn-bootstrap
-(Piergiorgio Lucidi)
-
-CONNECTORS-329: Upgrade to OpenCMIS 0.6.0
-(Piergiorgio Lucidi)
-
-CONNECTORS-385: Fix broken Forrest generation of Japanese HTML.
-This workaround simply sets the environment for Forrest up so that
-Cocoon does not fail.
-(Karl Wright)
-
-CONNECTORS-386: CMIS Integration tests implementation compile error
-(Piergiorgio Lucidi)
-
-CONNECTORS-336: Add Japanese documentation.
-(Hitoshi Ozawa)
-
-CONNECTORS-383: Add more Japanese localization for JCIFS connector.
-(Hitoshi Ozawa)
-
-CONNECTORS-382: Add more Japanese localization for JDBC connector.
-(Hitoshi Ozawa)
-
-CONNECTORS-376: Provide Japanese localization of Meridio connector.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-379: Internationalize Meridio connector.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-377: Use Maven standards for resource directories.
-(Karl Wright)
-
-CONNECTORS-375: Add Japanese messages for RSS connector.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-374: Add Japanes messages for SharePoint connector.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-373: Add Japanese messages for Solr connector.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-371: Add Japanese messages for LiveLink connector.
-(Hitoshi Ozawa)
-
-CONNECTORS-372: Finish the Japanese translation of the web connector's
-strings.
-(Hitoshi Ozawa)
-
-CONNECTORS-370: Fix the use of MessageFormat for expanding
-message arguments so that the proper locale is used.
-(Karl Wright)
-
-CONNECTORS-365: Internationalize SharePoint connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-368: Internationalize Wiki connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-367: Internationalize Web connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-364: Internationalize RSS connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-363: Internationalize more of the Livelink connector.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-362: Internationalize JDBC connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-361: Internationalize JCIFS connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-360: Internationalize GTS connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-359: Internationalize FileSystem connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-358: Internationalize FileNet connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-357: Internationalize Documentum connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-356: Internationalize ActiveDirectory connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-366: Internationalized Solr connector fully.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-318: Add debugging output for XML parsing errors.  The
-code assumes UTF-8 encoding of the stream, and only outputs the first 64K.
-This should be sufficient for most situations though.
-(Martin Goldhahn, Karl Wright)
-
-CONNECTORS-355: Fix some remaining uninternationalized strings.
-(Hitoshi Ozawa)
-
-CONNECTORS-353: Ship .wsdd configuration files as part of connector
-jars rather than separate files with configuration parameters.  This
-simplifies the building and deployment of the SharePoint and Meridio
-connectors considerably.
-(Karl Wright)
-
-CONNECTORS-352: Remove duplicate logfile property output for tests.
-(Martin Goldhahn)
-
-CONNECTORS-344: Fix OpenSearchServer UI so that data is not lost between posts.
-(Emmanuel Keller, Karl Wright)
-
-CONNECTORS-346: Reorganize test class hierarchy, and main ant
-build targets, to reduce duplication of code and make more sense.
-(Karl Wright)
-
-CONNECTORS-328: added explicit support for Multi-Tenancy in the job configuration
-(Piergiorgio Lucidi)
-
-CONNECTORS-337: Pay attention to -DskipITs for alfresco, cmis, and
-wiki tests on Maven build.
-(Karl Wright)
-
-CONNECTORS-340: Separate labels with colons from labels without.
-(Karl Wright)
-
-CONNECTORS-338: Move localization to the ui-core jar.
-(Karl Wright)
-
-CONNECTORS-335: Add i18n infrastructure.  This commit also addresses
-some problems found in the CMIS, Alfresco, and OpenSearchServer
-connectors having to do with improper escaping of data values.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-334: Add MySQL database support.
-(Hitoshi Ozawa, Karl Wright)
-
-CONNECTORS-332: Provide a way of running the web applications on jetty
-from within the multiprocess example.
-(Karl Wright)
-
-CONNECTORS-324: Maven build broken
-(Piergiorgio Lucidi)
-
-CONNECTORS-331: How-to-build-and-deploy page is missing section for Alfresco connector
-(Piergiorgio Lucidi)
-
-======================= Release 0.4 =========================
-
-CONNECTORS-349: Content binary is not correctly read
-(Piergiorgio Lucidi)
-
-CONNECTORS-343: Fix lack of proper escaping for values in the
-Alfresco, CMIS, and OpenSearchServer connectors.  Fix broken tabs
-in the Alfresco and CMIS connectors.
-(Karl Wright)
-
-CONNECTORS-342: Fix bad HTML in the File System connector.
-(Karl Wright)
-
-CONNECTORS-330: Add infrastructure that permits the database class
-to initialize a connection every time it is pulled from the pool.  This is
-necessary to support HSQLDB, because a number of HSQLDB's states
-are actually maintained in the JDBC driver and thus cannot be managed
-well in a pooled connection paradigm.
-(Fred Toussi, Karl Wright)
-
-CONNECTORS-321: Correct a problem with external HSQLDB databases
-where the schema wasn't being reliably set for the session.
-(Fred Toussi, Karl Wright)
-
-CONNECTORS-319: Added a shutdown hook to the AgentRun command,
-so that if you ^C out of it you can rerun.
-(Karl Wright)
-
-CONNECTORS-325: Adeguate the content identifier with the Alfresco node reference
-(Piergiorgio Lucidi)
-
-CONNECTORS-326: Fix the ant image build target to not use build-dev.
-(Karl Wright)
-
-CONNECTORS-315: Include the latest distributed versions of the plugin
-jars.
-(Karl Wright)
-
-CONNECTORS-323: Fix *.sh files in multiprocess-example.
-(Shinichiro Abe)
-
-CONNECTORS-313: Reorganize the dist directory to include a multiprocess
-example as well as a single process example.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-320: Fix issues with remote HSQLDB driver having to do
-with schema discovery.
-(Karl Wright)
-
-CONNECTORS-308: Get the alfresco connector integration tests to run
-under ant.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-310: Get the alfresco connector to build with Maven on a clean
-system.  This involves pushing some of the dependencies that are not available
-via the current maven repository into the local repository.  I wound up just
-changing the bouncycastle dep to 140 instead of 137, but did not change the
-others because I wasn't sure of the potential effects.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-311: added missing licenses
-(Piergiorgio Lucidi)
-
-CONNECTORS-312: Move the Meridio web service into a separate package,
-like we did for the SharePoint 3.0 plugin.
-(Karl Wright)
-
-CONNECTORS-301: added the detailed JavaDoc for the CMIS connector and integration tests
-(Piergiorgio Lucidi)
-
-CONNECTORS-300: added the defaul values for the CMIS connector configuration
-(Piergiorgio Lucidi)
-
-CONNECTORS-304: extended the endpoint parameter of the CMIS Connector with protocol, server, port and path
-(Piergiorgio Lucidi)
-
-CONNECTORS-307: CMIS and Alfresco connector configuration UI loses configuration when you switch tabs
-(Piergiorgio Lucidi)
-
-CONNECTORS-302: Add a specific Server tab for CMIS-related configuration information
-(Piergiorgio Lucidi)
-
-CONNECTORS-303: Maven build doesn't consider HTML and JS files for the connector
-(Piergiorgio Lucidi)
-
-CONNECTORS-284: HSQLDB runs out of memory on an extended load
-test, and had other problems too.  A new version of the db software was
-needed to correct this issue.  Thanks to the HSQLDB team for their
-assistance!
-(Fred Toussi, Karl Wright)
-
-CONNECTORS-299: Handle Postgresql 9.1's newfound ability to throw
-deadlock conditions on transaction ends.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-298: Improve the SSL error message when no trusted
-certs are found.
-(Michael Kelleher, Karl Wright)
-
-CONNECTORS-297: Add a description of ant download-dependencies for
-Building the SharePoint connector to how-to-build-and-deploy.html.
-(Shinichiro Abe)
-
-CONNECTORS-295: Add the support for multivalue properties
-(Piergiorgio Lucidi)
-
-CONNECTORS-296: Make independent the configuration against the WARs version for integration tests
-(Piergiorgio Lucidi)
-
-CONNECTORS-292: Problems with mvn-bootstrap.bat.  Also excluded (hopefully
-temporarily) the HSQLDBext tests from the Maven build, since their properties.xml
-conflict with HSQLDB tests.
-(Luca Stancapiano, Karl Wright)
-
-CONNECTORS-293: Fix the how-to-build-and-deploy documentation to include
-the right version of jcifs.
-(Luca Stancapiano, Karl Wright)
-
-CONNECTORS-290: Revamp the way docpriorities are handled so as to avoid
-flooding the jobqueue with documents that have a docpriority value but
-a job or document status incompatible with stuffing.  This should help a lot
-in very large crawls with multiple jobs.
-(Karl Wright)
-
-CONNECTORS-291: Active Directory authority reconnect logic had a
-pathological case when server forcibly closed connection.
-(Karl Wright)
-
-CONNECTORS-209: Add support for remote HSQLDB instances.  There are
-now configuration parameters for specifying protocol, server, and instance
-name, which if specified cause the HSQLDB driver to communicate to the
-specified remote instance.
-(Karl Wright)
-
-CONNECTORS-287: An Alfresco connector would be helpful
-(Piergiorgio Lucidi)
-
-CONNECTORS-289: Wrong version of the OpenCMIS InMemory Server war in the page How to build and deploy
-(Piergiorgio Lucidi)
-
-CONNECTORS-285: Provide a way through the IJobManager interface
-and through the API to check on the status of a job without asking
-for the counts of documents, which yields a full table scan.
-(Karl Wright)
-
-CONNECTORS-279: Prevent reindex or analyze from taking place within
-a transaction.  This was causing hangs on our load tests.
-(Karl Wright)
-
-CONNECTORS-283: Upgrade to jcifs.jar 1.3.17 in the ant build (download-dependencies target).
-(Shinichiro Abe)
-
-CONNECTORS-282: Change order in which the incremental ingester does
-things so we don't typically get unique constraint violation warnings in
-the log.
-(Karl Wright)
-
-CONNECTORS-280: The job state "DELETESTARTINGUP" was not being
-checked for in the status.  This meant that during the time that a
-job delete was beginning, "Not yet run" would be displayed as the status.
-(Karl Wright)
-
-CONNECTORS-277: Add the ability to select namespaces and title
-prefixes to the Wiki connector.
-(Tobias Wunderlich, Karl Wright)
-
-CONNECTORS-266: Upgraded the CMIS Connector libraries to OpenCMIS 0.5.0
-(Piergiorgio Lucidi)
-
-CONNECTORS-278: Wrong default parameters values for CMIS Connector in a clean installation
-(Piergiorgio Lucidi)
-
-CONNECTORS-262: Pull down .wsdls from SharePoint 3.0 example site
-in the ant build (download-dependencies target).
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-276: Pull down jtds and mysql drivers from maven repository
-in the ant build (download-dependencies target),
-and add these dependencies in appropriate places in the maven build as
-well.
-(Karl Wright)
-
-CONNECTORS-259: Enable support for MySQL in JDBC connector.
-(Karl Wright)
-
-CONNECTORS-187: Fix how the worker threads handle document deletion
-service interruptions.
-(Karl Wright)
-
-CONNECTORS-271: Wiki connector now has end-user documentation.
-(Karl Wright)
-
-CONNECTORS-263: Long-running tests should all be moved to Maven's integration-test phase
-(Piergiorgio Lucidi)
-
-CONNECTORS-273: Add last-modified metadata to indexing for the
-Wiki connector.
-(Tobias Wunderlich, Karl Wright)
-
-CONNECTORS-274: Fix long-standing problem with XML parsing, which
-affected the wiki connector in a big way.
-(Tobias Wunderlich, Karl Wright)
-
-CONNECTORS-256: Add a Wiki connector, including basic sanity tests
-and build logic.
-(Karl Wright, Tobias Wunderlich)
-
-CONNECTORS-270: The OpenSearchServer connector pom.xml was incorrect,
-and skipped the resources needed to run the connector properly.
-(Karl Wright)
-
-CONNECTORS-269: Get the maven build working properly again, including
-the HSQLDB tests, and the clean operation.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-264: Changing the repositoryId to an empty value is not possible
-(Piergiorgio Lucidi)
-
-CONNECTORS-265: removed from the CMIS Connector all the HTML snippets from the Java code
-(Piergiorgio Lucidi)
-
-CONNECTORS-268: Move sources for, and prebuild, the MCPermissions
-web service plugin for the SharePoint connector.
-(Karl Wright)
-
-CONNECTORS-257: Add cache control fields to make Active Directory authority
-configuration more flexible with regards to cache.
-(Karl Wright, Shinichiro Abe)
-
-CONNECTORS-87: Add a framework load test.
-(Karl Wright)
-
-CONNECTORS-255: Add ability to process site map documents, in both
-RSS connector and Web connector.
-(Karl Wright)
-
-CONNECTORS-202: Add commit-within parameter to Solr output connector.
-(Jan Høydahl, Karl Wright)
-
-CONNECTORS-251: Add target "download-dependencies" to build.xml.
-(Shinichiro Abe)
-
-CONNECTORS-252: Clean up build, dist and lib of each connector after build.
-(Shinichiro Abe)
-
-======================= Release 0.3 =========================
-
-CONNECTORS-240: Add OpenSearchServer end-user documentation.
-(Emmanuel Keller, Karl Wright)
-
-CONNECTORS-250: Renew jcifs download site link.
-(Shinichiro Abe)
-
-CONNECTORS-253: Make script output of configurationnode script object
-have attributes that are ordered, so the test does not depend on hash order.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-246, CONNECTORS-248, CONNECTORS-249: Problems with MVCC
-model of Hsqldb causing query inconsistencies, fixed in HSQLDB 2.2.5-6-9-2011.
-(Fred Toussi, Karl Wright)
-
-CONNECTORS-247: Add unit tests for script engine.
-(Karl Wright)
-
-CONNECTORS-144: Remove Apache license from DISCLAIMER.txt, as per the
-incubator's instructions.
-(Karl Wright)
-
-CONNECTORS-177: Remove test code from file system connector.
-(Karl Wright)
-
-CONNECTORS-141: Exclude files from rat report that the Forrest teams says I
-should.
-(Karl Wright)
-
-CONNECTORS-58: Add client scripting language and a file-system-based example.
-(Karl Wright)
-
-CONNECTORS-245: Fix API bug where schedule JSON was incorrect when fetching
-job description.
-(Karl Wright)
-
-CONNECTORS-229: CMIS connector needs to be documented in "how to build and deploy"
-(Piergiorgio Lucidi)
-
-CONNECTORS-244: Add a fix to recover for another Derby deadlock situation.
-(Karl Wright)
-
-CONNECTORS-243: Include most response headers in the metadata for
-each web connector document.
-(Jan Høydahl, Karl Wright)
-
-CONNECTORS-224: Add OpenSearchServer output connector.
-(Emmanuel Keller, Karl Wright)
-
-CONNECTORS-157: Fixed a second kind of case where the java.net.URI
-class is broken.  Relative queries starting with "?" now replace the query
-part of the url.
-(David Broadfoot, Karl Wright)
-
-CONNECTORS-239: RSS connector chromed content mode was broken.
-(Kate McGonigal, Karl Wright)
-
-CONNECTORS-238: Hard errors from notification output connector method
-should be noted and then ignored.
-(Karl Wright)
-
-CONNECTORS-61: Make it easy (and document) how to integrate
-ManifoldCF into an application.
-(Karl Wright)
-
-CONNECTORS-226: Clean up usage of REPOSITORY_CONNECTION_ERROR
-ManifoldCFException type.
-(Karl Wright)
-
-CONNECTORS-236: Add tests for CMIS connector.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-234: Add support for CMIS binding protocol.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-235: Fix broken Derby and HSQLDB file-based carrydown
-data, and added the ability to handle RSS feed description values outside
-of dechromed content.
-(Kate McGonigal, Karl Wright)
-
-CONNECTORS-232: Fix site icon link.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-230: Add CMIS mention to the ManifoldCF documentation.
-(Karl Wright)
-
-CONNECTORS-228: Add maven support for CMIS connector.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-231: Missing dependency in pom.xml.
-(Piergiorgio Lucidi)
-
-CONNECTORS-227: Fix the error reporting so it includes the problem message.
-(Piergiorgio Lucidi)
-
-CONNECTORS-221: Add CMIS connector.
-(Piergiorgio Lucidi, Karl Wright)
-
-CONNECTORS-214: Add post-fetch regular expression filtering to Web
-connector.
-(Karl Wright)
-
-CONNECTORS-225: Derby throws deadlock exceptions when indexing
-rapidly.
-(Karl Wright)
-
-CONNECTORS-223: Move test classes to be compatible with maven
-conventions.
-(Tobias Rübner, Karl Wright)
-
-CONNECTORS-219: Update maven pom.xml files to include proper
-dependencies and version numbers.
-(Tobias Rübner)
-
-CONNECTORS-220: Fix long-standing issue with database connection
-problems.  Reset logic was insufficiently robust.
-(Farzad Valad, Karl Wright)
-
-CONNECTORS-217: Check running more than one of instance of agent.
-(Shinichiro Abe)
-
-CONNECTORS-218: LockClean supports relative path
-to the synchronization directory.
-(Shinichiro Abe)
-
-CONNECTORS-215: Setting an environment variable of agent.
-Add options.env file, in which we can define optional value.
-(Karl Wright, Shinichiro Abe)
-
-CONNECTORS-216: Clean up document removal options in IProcessActivity,
-and modify connectors accordingly to avoid using the deprecated form of
-deleteDocument().
-(Karl Wright)
-
-CONNECTORS-214: Add output connector support for restricting documents based on
-mime type, URL, and document length.  Hook this up to the web and RSS
-connectors, and add mime type and maximum length fields to the Solr
-connector.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-212: Failure during notify should send job back to
-ReadyForNotify state, not ReadyForDelete state.
-(Karl Wright)
-
-CONNECTORS-211: Move pack() and unpack() utility methods into the
-connector base class.
-(Karl Wright)
-
-CONNECTORS-210: Handle RuntimeException exceptions better in
-connector factories.
-(Farzad Valad, Karl Wright)
-
-CONNECTORS-208: Make support for metadata Reader objects really
-work.
-(Karl Wright)
-
-CONNECTORS-204: Add an HSQLDB set of test targets, which use that
-database.
-(Karl Wright)
-
-CONNECTORS-206: Document HSQLDB properties, and mention it as a
-supported choice in the documentation.
-(Karl Wright)
-
-CONNECTORS-114: Finish HSQLDB implementation.
-(Fred Toussi, Karl Wright)
-
-CONNECTORS-205: Changed the database interface distinct-on abstraction
-to also include the order-by clause, so we can write something that will
-work for HSQLDB.
-(Karl Wright)
-
-CONNECTORS-203: Move to Java 1.5 compilation and conventions.
-(Erlend Garåsen, Tommaso Teofili, Karl Wright et al)
-
-CONNECTORS-201: Add activity interface ICarrydownActivity to allow
-sharing of functionality across IVersionActivity and IProcessActivity.
-(Karl Wright)
-
-CONNECTORS-200: Interpret TikaExceptions as being permanent failures.
-(Erlend Garåsen, Shinichiro Abe, Karl Wright)
-
-CONNECTORS-199: Modify site to point to new 0.2-incubating release.
-(Karl Wright)
-
-CONNECTORS-197: Add a switch that allows user to select which AD
-attribute to use for login name.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-198: Update rat-sources ant target to exclude
-test-output-postgresql folders.
-(Karl Wright)
-
-CONNECTORS-174: The standard logging.ini file for the Quick Start should
-set a log format that includes at least date and time.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-194: Forrest doc build always gets an error because of relative
-references to javadoc roots.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-196: Active directory authority did not work if login name
-and common name differed.
-(Kadri Atalay, Shinichiro Abe, Karl Wright)
-
-CONNECTORS-195: Active directory authority does not properly identify
-non-existing users on all versions of Java and all versions of AD.
-(Kadri Atalay, Karl Wright)
-
-CONNECTORS-192: Specification processing would sometimes be called
-without the specification data being posted.
-(Karl Wright)
-
-CONNECTORS-191: Fix eol-style attribute for .bat files to always be
-CRLF.
-(Karl Wright)
-
-CONNECTORS-190: Fix busted link to JSON stuff.
-(Karl Wright)
-
-CONNECTORS-189: Added links to directly access the group distribution
-email archives.
-(Farzad Valad)
-
-Update the site to create a direct link to the book, and also bring the
-copyrights and breadcrumbs to the current era.
-(Karl Wright)
-
-CONNECTORS-185: Clarify the build-and-deploy document to make sure
-it is clear that the configfile define is needed for the application server.
-(Mark Moloney, Karl Wright)
-
-CONNECTORS-186: Refactor WorkerThread code to permit all output
-connector methods to throw a ServiceInterruption, including the
-getOutputDescription() method.
-(Karl Wright)
-
-CONNECTORS-183: Add a text field to make Active Directory authority
-configuration more flexible with regards to protocol.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-32: Add access token caching to the Active Directory
-authority connector, LiveLink authority connector, Meridio authority
-connector, and Documentum authority connector.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-182: Install timed expiration of cached objects, which
-was not hooked up to the idle cleanup architecture.
-(Karl Wright)
-
-CONNECTORS-181: Fix the way timed expiration works to agree with
-the description, and pass in a current time parameter to make it
-work readily for continuous renewal.
-(Karl Wright)
-
-CONNECTORS-179: Add ability to throw ManifoldCFException from the
-IConnector method setThreadContext.
-(Karl Wright)
-
-CONNECTORS-175: Update documentation of properties.xml parameters
-to include missing ones.
-(Shinichiro Abe, Karl Wright)
-
-CONNECTORS-173: Update javadoc to include table schemas.
-(Shinichiro Abe)
-
-CONNECTORS-171: Make sure XML output from within XML document does not
-corrupt entity references.
-(Fuad Efendi)
-
-======================= Release 0.2 =======================
-Release Date:  See http://incubator.apache.org/connectors for the official release date.
-
-CONNECTORS-188: Change the eol-style attribute to LF for all the .sh files.
-(Erlend Garåsen, Karl Wright)
-
-Web site updated to reflect proposed release.
-
-CONNECTORS-172: At the advice of the Derby team, build Derby in
-"insane" mode to allow it to recover from internal errors.
-(Koji Sekiguchi, Karl Wright)
-
-CONNECTORS-170: Add support to the Derby driver for periodic analysis and
-reindexing, since after 10.7.1.1 it seems this is now supported.
-(Karl Wright)
-
-CONNECTORS-169: Add a method to the database abstraction to
-return the maximum number of OR clauses in a query.  This is to make
-Derby efficient, since it can't seem to use indexes in this situation
-(Karl Wright)
-
-CONNECTORS-166: Pull a Derby fix down from trunk into Derby 10.7.1.1,
-to fix deadlock problems
-(Oleg Tikhonov, Karl Wright)
-
-CONNECTORS-168: Change error reporting logic in Solr connector
-to handle non-XML responses
-(Fuad Efendi, Karl Wright)
-
-CONNECTORS-159: Add support for external PostgreSQL server
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-165: Upgrade to jetty 6.1.26, plus patches, which is what
-Solr is using.
-(Robert Muir, Karl Wright)
-
-CONNECTORS-163: Use Derby 10.7.1.1.
-(Oleg Tikhonov, Karl Wright)
-
-CONNECTORS-162: Add infrastructure support for derived resource
-loading, so that individual connectors can use this model to prevent jar
-conflicts.
-(Karl Wright)
-
-CONNECTORS-160: Add local trust store and working https support
-for Solr connector.
-(Carina Lannig, Karl Wright)
-
-CONNECTORS-151: Add folder support to FileNet connector.
-(Oleg Tikhonov, Karl Wright)
-
-CONNECTORS-157: Web crawler url resolution was broken for relative
-paths, because the way java.net.URI resolved them changed.
-(Karl Wright)
-
-CONNECTORS-156: Update site to describe work-around instructions.
-(Karl Wright)
-
-CONNECTORS-154: Add an ant target, and tests, that work against the
-postgresql database.
-(Karl Wright)
-
-CONNECTORS-155: Fix a query bug with fetching the job status of a single,
-specified job.
-(Karl Wright)
-
-CONNECTORS-148: Intermittent failures creating the PostgreSQL database
-still occurring; traced the problem this time to PostgreSQL not accepting
-a parameter for the password when creating a user.
-(Nicolas Max, Karl Wright)
-
-CONNECTORS-153: Add support for robots meta tag to web connector.
-(Erlend Garåsen, Karl Wright)
-
-CONNECTORS-152: Refactor notification thread and states to make the framework
-more resilient.
-(Karl Wright)
-
-CONNECTORS-145: Refactor cleanup worker threads, expire threads, and
-document delete threads to handle failure of the output connection gracefully.
-(Karl Wright)
-
-CONNECTORS-130: Block the Solr output connector from accepting documents
-that have folder-level security.
-(Karl Wright)
-
-CONNECTORS-129: Add an API reset/outputconnections/xxx command, to
-forget the index state for an output connection.
-(Karl Wright)
-
-======================= Release 0.1 =======================
-Release Date:  See http://incubator.apache.org/connectors for the official release date.
-
-CONNECTORS-149: Expire threads did not obey rules as far as deleting documents
-belonging to other jobs.  Also, the test for whether a document was shared between
-jobs did not take the output connection into account.  Finally, I found an infinite
-loop in the job delete stuffer thread code.
-(Karl Wright)
-
-CONNECTORS-147: Disable PDF's everywhere except for user documentation.
-(Grant Ingersoll, David Crossley, Karl Wright)
-
-CONNECTORS-148: Creating the database in PostgreSQL failed intermittently
-when a parameter was used for the encoding; the PostgreSQL documentation
-specifies that it must be a quoted string in that case.
-(Karl Wright)
-
-CONNECTORS-146: Problem with document cleanup logic would cause data corruption
-in carrydown data and in hopcount information.
-(Karl Wright)
-
-CONNECTORS-143: Copyright notice needs to be changed to 2011.
-(Sebb, Karl Wright)
-
-CONNECTORS-142: License and notice file revisions.
-(Ant Elder, Sebb, Ralph Goers, Karl Wright)
-
-CONNECTORS-140: Change build to generate both a -src and a -bin distribution.
-(Grant Ingersoll, Karl Wright)
-
-CONNECTORS-139: Change download area to www.apache.org/dist/incubator/manifoldcf,
-as according to incubator rules.
-(Karl Wright)
-
-CONNECTORS-138: Change name of release from 0.1-incubator to 0.1-incubating,
-as according to incubator rules.
-(Various)
-
-CONNECTORS-137: Add ASF headers to the jakarta standard tag library tld's
-that the crawler-ui uses.  RAT detected these as a problem, and I have confirmed
-that they have an Apache origin.
-(Sebb, Karl Wright)
-
-CONNECTORS-132: Remove build artifacts from the archives, except for documentation.
-This is to save space.
-(Karl Wright)
-
-CONNECTORS-136: Change rat-sources build target to exclude all files known good
-despite RAT complaints.
-(Sebb, Karl Wright)
-
-CONNECTORS-135: Adjust svn properties of files to be consistent with intended
-usage.
-(Sebb)
-
-CONNECTORS-134: Put README.txt files in all empty directories that are meant
-for a user to supply third-party content.  This prevents the archive from not
-delivering an empty directory.
-(Ant Elder, Sebb, Karl Wright)
-
-CONNECTORS-133: Update README.txt to include incubator disclaimer.
-(Ant Elder, Sebb, Karl Wright)
-
-CONNECTORS-131: Create download page with separate references for KEYS,
-CHANGES.txt, signatures, and artifacts.
-(Chris Mattmann, Karl Wright)
-
-CONNECTORS-128: Remove sql quoting logic to make sql injection attacks
-less possible.
-(Grant Ingersoll, Robert Muir, Karl Wright)
-
-CONNECTORS-122: FileNet and Documentum connector-specific process
-scripts needed.
-(Oleg Tikhonov, Karl Wright)
-
-CONNECTORS-127: Broken FileNet Document Classes tab.
-(Oleg Tikhonov, Karl Wright)
-
-CONNECTORS-126: Added a performance tuning page to the site.
-(Farzad, Karl Wright)
-
-Removed modules level of tree, and revamped build.xml in anticipation of
-a release.
-(Karl Wright)
-
-CONNECTORS-125: Set the default max handles property to be consistent with
-a default PostgreSQL installation.
-(Farzad, Karl Wright)
-
-CONNECTORS-124: Add a null authority connector, so authority tests can be
-written.
-(Karl Wright)
-
-CONNECTORS-109: Hooked up user-defined functions in Derby to perform the needed
-regular expression matching and grouping.
-(Karl Wright)
-
-CONNECTORS-121: Fixed broken javascript in the Windows Share connector "insert here"
-button.
-(Fred Schmitt, Karl Wright)
-
-CONNECTORS-117: Revised manner by which dynamic table maintenance is performed,
-so that it can be controlled by configuration parameters.
-(Farzad, Karl Wright)
-
-CONNECTORS-116: Removed Memex connector due to intellectual property concerns.
-(Robert Muir)
-
-CONNECTORS-113: Add properties that allow quick-start example to work properly with
-PostgreSQL.
-(Farzad, Karl Wright)
-
-Name change to ManifoldCF
-(Community)
-
-CONNECTORS-107: Entering report forms now preselects all activities.
-(Karl Wright)
-
-CONNECTORS-106: noteJobCompleted() method in IOutputConnector now receives an
-activities object, so activities can be recorded.
-(Karl Wright)
-
-CONNECTORS-98: Convert the API into a RESTful implementation.
-(Jack Krupansky, Mark Miller, Karl Wright)
-
-CONNECTORS-104: Add convenience feature to web connector to limit hosts to those
-explicitly mentioned in seeds.
-(Jack Krupansky, Karl Wright)
-
-CONNECTORS-102: Web connector default throttling settings.
-(Karl Wright)
-
-CONNECTORS-103: RSS connector default throttling settings.
-(Karl Wright)
-
-CONNECTORS-105: File system connector UI enhancements, to use a table-based
-metaphor for paths and rules.
-(Karl Wright)
-
-CONNECTORS-101: File system connector paths should automatically get default
-rules added.
-(Karl Wright)
-
-CONNECTORS-57: Add support in Solr connector for selecting whether end-of-job
-commits take place, on a per-connection basis.
-(Jack Krupansky, Karl Wright)
-
-CONNECTORS-41: Add support in the framework for end-of-job notification to the
-associated output connector, which can take an extended period of time.
-(Jack Krupansky, Karl Wright)
-
-CONNECTORS-97: Web connector session authentication was failing for some sites
-due to cookies httpclient thought were illegal, but browsers would accept.
-(Karl Wright)
-
-CONNECTORS-91: Made the initialization commands more accessible via code.
-(Jettro Coenradie, Karl Wright)
-
-CONNECTORS-90: Fixed a localization issue where database errors that should be
-soft errors were instead interpreted as hard failures for non-English locales.
-(Carina <c.a.r.e@gmx.de>, Marc Emery, Karl Wright)
-
-CONNECTORS-62: Added additional LCF API Documentation (Karl Wright)
-
-CONNECTORS-59: Packaged application so that it is ready to run with embedded
-Jetty App Server. (Jack Krupansky, Karl Wright)
-
-CONNECTORS-56: Enhanced API so that more features are accessible programmatically.
-(Jack Krupansky, Karl Wright)
-
-CONNECTORS-52: Updated documentation to reflect new features added to the Solr
-connector.  (Karl Wright)
-
-CONNECTORS-51: Reduce the number of required system properties needed to run the
-JCIFS connector.  (Karl Wright)
-
-CONNECTORS-49: Allow mapping of the metadata ID field in the Solr connector.
-(Rohan G Patil, Jack Krupansky, Erik Hatcher, Karl Wright)
-
-CONNECTORS-48: Improve rules description for the SharePoint connector.
-(Karl Wright)
-
-CONNECTORS-47: Framework UI called connector post-processing more than needed.
-(Karl Wright)
-
-CONNECTORS-46: Improve documentation for metadata with the JDBC Connector.
-(Rohan G Patil, Karl Wright)
-
-CONNECTORS-45: Allow specifying the Solr core name with the Solr Connector.
-(Jack Krupansky, Erik Hatcher, Karl Wright)
-
-CONNECTORS-44: Add metadata support to the JDBC Connector.
-(Rohan G Patil, Karl Wright)
-
-CONNECTORS-43: Wseless call to String.trim in MultiLineParser
-(Mark Miller, Karl Wright)
-
-CONNECTORS-42: Impossible cast in org.apache.lcf.core.database.Database
-(Mark Miller, Karl Wright)
-
-CONNECTORS-40: Change to a classloader-based plugin architecture
-(Jack Krupansky, Mark Miller, Erik Hatcher, Karl Wright)
-
-CONNECTORS-39: Allow abstraction of database transaction management.  (Karl Wright)
-
-CONNECTORS-38: Add a jetty-based "quick-start". (Jack Krupansky, Karl Wright)
-
-CONNECTORS-37: Switch to an XML configuration file.
-(Erik Hatcher, Jack Krupansky, Karl Wright)
-
-CONNECTORS-36: Improve the Solr Connector's UI to be more intuitive.  (Karl Wright)
-
-CONNECTORS-35: Add a method to reset the framework.  (Karl Wright)
-
-CONNECTORS-33: Document how to use the framework programmatically. (Karl Wright)
-
-CONNECTORS-26: Rename war files from "tomcat" to "web" as there is nothing
-tomcat-specific about them.  (Erik Hatcher, Karl Wright)
-
-CONNECTORS-23: Add usage examples to Command documentation
-(Damien Mabin, Karl Wright)
-
-CONNECTORS-22: Add support for ACLs to the Solr Connector.
-(Dominique Bejean, Peter Sturge, Karl Wright)
-
-CONNECTORS-20, CONNECTORS-3: Add an ant build system. (Karl Wright)
-
-CONNECTORS-18: The Lucene Connector was renamed to Solr Connector. (Karl Wright)
-
-CONNECTORS-17: Fix broken link in the Crawler UI's help page.  (Karl Wright)
-
-CONNECTORS-16: Generalize JCIFS connector's fingerprinting.
-(Sami Siren, Karl Wright)
-
-CONNECTORS-14: Remove some javac warnings.  (Robert Muir, Karl Wright)
-
-CONNECTORS-12: Improve whitespace formatting to be consistent. (Erik Hatcher, Karl Wright)
-
-CONNECTORS-11: Add automated build for the Apache2 Module. (Karl Wright)
-
-CONNECTORS-9, CONNECTORS-8, CONNECTORS-7, CONNECTORS-5, CONNECTORS-2:
-Remove Metacarta branding and setup.  (Karl Wright)
-
-CONNECTORS-6: Move documentation from LaTeX to the wiki.  (Karl Wright)
-
-CONNECTORS-4: Submit changes to other packages as patches.  (Oleg Kalnichevski, Karl Wright)
-
-CONNECTORS-1: Created connectors website. (Grant Ingersoll)
diff --git a/DEPENDENCIES.txt b/DEPENDENCIES.txt
deleted file mode 100644
index e64af30..0000000
--- a/DEPENDENCIES.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-ManifoldCF requires
-------------------
-* JRE 1.8 or above
-* SVN client, version 1.7 or above
-* Apache Ant, version 1.7 or above
-* Apache Forrest, version 0.9-dev or above
-* Many other libraries, available from the ManifoldCF XXX-lib distribution, or by running
-  the "make-core-deps" ant target
-
-For building ManifoldCF:
-----------------------
-* Read the "how-to-build-and-deploy.html" documentation page
-
-For testing ManifoldCF:
-----------------------
-* Unit tests included in build
-
-
diff --git a/KEYS b/KEYS
deleted file mode 100644
index 07f2522..0000000
--- a/KEYS
+++ /dev/null
@@ -1,363 +0,0 @@
-(instructions copied from forrest's KEYS file)
-
-This file contains the PGP keys of various developers.
-Please don't use them for email unless you have to. Their main
-purpose is code signing.
-
-Users: pgp < KEYS
-Developers:
-        pgp -kxa <your name> and append it to this file.
-        (pgpk -ll <your name> && pgpk -xa <your name>) >> this file.
-        (gpg --list-sigs <your name>
-             && gpg --armor --export <your name>) >> this file.
-
-----------------------------------------------------------------
-pub   4096R/03824582 2010-11-19
-uid                  Karl David Wright (CODE SIGNING KEY) <kwright@apache.org>
-sig 3        03824582 2010-11-19  Karl David Wright (CODE SIGNING KEY) <kwright@apache.org>
-sub   4096R/EE82775D 2010-11-19
-sig          03824582 2010-11-19  Karl David Wright (CODE SIGNING KEY) <kwright@apache.org>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.4.11 (MingW32)
-
-mQINBEzmR2IBEACvDjCt9SU4ma8kcrFitl6fTx3hAWJmosC1OLryVYVQ+g816NaD
-oRgKim6GcYC0wvQEHvlIpEq4xXqKIWhH4xko8wvV619uOqoK+Ca6dI7FzxnBcxQ5
-D0J59zXRikYO0qhNgZqdo+37l6AgaDMbgPUPq0XQO4KCo+XbluCZfRuL5UcbF4H5
-j4mxT3IgnMHtdzaceKP+wruh/Ak18w/6w+5GnE3QYYPGqlnBqPVTWQFjBDL+L9QD
-LWVBgduQQ3YXhDmfZGRBppzklPJeiWwBQH7mZqgjht0aoIvwLVgCgA6S9TRRcUtE
-maefHcGduKhENYgt0I3mWD41VpKLgq6kfbZYg1fCwtXd5If0KxxhsZmBlMGYCwcV
-TBzcBLhktPAFKquM/VCzu3DR8hAYQjYukOYMAAB2PGjaQlP4Rc4/vTQR8CE3oYR6
-pLgnPu8SjUcxomqKPFM1SCAx/BgUpMrWRNNO/0j9hhBlCDnHxxrTsPvMW+uqCHQp
-xNvneIuFPt7TSwcK1Luyoygtoj/3J/2zI9SCXrNJwZZzGfc26Lp4XVaGNEujwLeG
-Ik2EN2dHdcDJWOAv+szk5jgn6G9c0sb9bFCjSNI9yWjZLofTvheKIjC8EBBmB7LD
-FHLcjbCbFYGReBSWenkfcOyEq83vMrCwZ+WgVjdazZVnjCa7GntYIgOpIwARAQAB
-tDlLYXJsIERhdmlkIFdyaWdodCAoQ09ERSBTSUdOSU5HIEtFWSkgPGt3cmlnaHRA
-YXBhY2hlLm9yZz6JAjcEEwEKACEFAkzmR2ICGwMFCwkIBwMFFQoJCAsFFgIDAQAC
-HgECF4AACgkQ/R/wnAOCRYKhvg/+Nr/yGbkx3kEMhbrpco0P2+hM95J1DjihFh/5
-gDeQ5ISTENi9SQt7OBkIDGMS7FyeOXuvGpjrkqjp5PGkc/pTO3Flu/5bJAWNHQGF
-tNv51tJeGeDD8wotLvoJOLJfxZZ42JGww5TmkXqMeKUBOsBB7vqaLEuk8sm/xr0D
-R76b9b5zpcMUlQAA3rgS0Z6BGKE4X9WAmbCo7k0O+k0KNAOoB1WoUrnXKkwDwDQL
-eTOwQujLm7OiRz/nkvXx1YlpXi3u9TNcXArdOWU3HkYduSc2fcaHaj4WfzaX79CQ
-meiJBpYLglWqFaMPZPOgO9g12kMk0DsslvZZkqzcGjCB1yn5DnxgqpLLkzWmclFA
-FBPKmbxMA2iUNy1Kgn+ZhiBRYl1rz0UdTa3sthOn2paTc1IdDHUAubr8qkkfHtYp
-AaIuF+T7iqjs8J1SLhtBxqEJ8FMs9b0vSNWs+UTaXgbmYoaINMePtOgPVQfMU1Mk
-r5v/1DE99C7V0qi37AAdTEBKUKkjlU/gWVKs1dL+te/gl6b6KxyNt3oiTUFApzQP
-r5VVpNrEqWKqUVAzxif4v+iUsmQrnw2pwRCzXgQ9o8DfmqbKjKwwkWrTZMTCaNvw
-L2oT/miX1acMpmtV8Co02++gt439+Aw1ZenvQ+zuHXFglZjhHa68FJj+XtAof0Qf
-xuhLi5i5Ag0ETOZHYgEQAMHgiGeeGT7a+UApO2Wr8AM4vjTXUqnc/HpDdEOVBWMV
-Y28QGaG8MgkUhUMCNel1EHZgHF3PVmty9izrqpUOOIPoD9JBqH903+gkPAorloOA
-UzI4+4IHCSZPrhgU+akhBFfYW1SI/2noF8AUzTZnXamlLMeLaJIJDvHDIaKG6lxf
-hpPx9WGjmLP8Xf0D9WeIdmsJlKxWWBCCnWM9qZfLcrBk+cZhuDJbIPp9edPGu7DB
-qQXrmPTN9XnuRo1fUBhxxlNQ/gEsV/I4mKko+Pgs4bkRGk2b0p7/rkbuAWw9NVX1
-+17vOAuP0AuHCDuT7qno4bH1m0zftDqcNyvNl8NphxCyfXljO/hCmujKqPOn1df6
-HpORDy1kKjJeiKWWeaacRwirncwT1AZuri75iUGHCer05yt/PoYRV2fYRw6TKt8g
-lPu/2UbNujGnSOkOthwFuWP6G6SF5oRg+YdkROaC00v7VTfLvCoZ9Rdh0ZhYrwmG
-sW6iJ/AsjSfGR5WtaU+ahliyTZnIUoGND3njgBKiI8E6YFzDs2Lh+nvynv/jmB/X
-1aPxieqXw1a6h/0BsQT/uqY7941XGAdWvSzg5NP6oL+sncjKd2VXVVi/P/dMbs+h
-W+lP4RBxT6elwuzUTUaiYeEmw2WL/A/wdPnQKjVr0HA6twMnzjjOs6AnGn85FlAZ
-ABEBAAGJAh8EGAEKAAkFAkzmR2ICGwwACgkQ/R/wnAOCRYLpOhAAltJjDcRTa2MI
-M45Z7WavWwVaXxbZNyIzOifR431oqyN0bz3C4KaDz2o8Rti9y0wTfS7cgzJFe0mC
-aXU01N7t/pK3IYhf+xe/f+iBZ3JASCGu+H3zLgY7qRm3q441AkPprwVqrGIemUFQ
-qTFiSbRi9/R0OzoY+T0ZILR7eu8EmIDhoBi0aWXlxzxHKikB5SqenZz/x5sbhZcy
-UdvNKe4iB4sfhAwMreBEFH6+/rlUIC8uWTb7IScBzSXj8R9hoAUXAH35T+sTs6nx
-QCW5XzO7YRQEgbaFUOSu3s5a1NVcFyhcDq9ASOOlg0JYNK9hi/UdyXUtAoXhn8WI
-1JD9d1kz6vke2YvXwkp+ntWK6dhHKPzwN2OrHSApOM7+9dLxqT/4buQWB1BXAD2S
-d8521WI9vzEW8qyI3rZhp3OLB5GUTFCw4POFIehKCDhET6gDz0MCYHVaEMBsySfT
-13/2vZd1gEh9BD9QHlrmxqo+gJqpw4q/usKMC3VNzw6appHSzQEfor2lpfx5WYy0
-iiCKmIlos2z+lIy9AarCBqOYjcWHjkYnb6QT1k/HKPuyBV7LMqoVPiQuxgZKqx01
-ZpDvtauiZqH+MMH2qe6n5sXhDQijGwXbAsFiorFj0/kWAEncJGpyI/u6q7GnHNS5
-H4n9zm2v9HW8fqSbQq3Ym8+WQ64+IK0=
-=gEd1
------END PGP PUBLIC KEY BLOCK-----
-pub   4096R/FE045966 2009-10-13
-      Key fingerprint = A46D 8682 A850 E44E 4FEC  20EB 8A8A 771F FE04 5966
-uid                  Grant Ingersoll (CODE SIGNING KEY) <gsingers@apache.org>
-sub   4096R/72F9E0C0 2009-10-13
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.4.7 (Darwin)
-
-mQINBErU6JEBEACsovhRB+Z8VrdTU76Qxg8u+0WiSaoilsksGgOaphWvWt0b6rA3
-PJSGuDuMJfL+lGqk+aARehiZNbNl0cGYtP4Av/fElTdSr1UlmDeFjG+7Qi7FB6KK
-vAjv4mw+XM05QRTADjpNkDfAEXGPR1GNE7lOfPvNqvAl9YMLHJOBGlVqq5ZZAPHZ
-/R6Cg7+5qHbVJKtPqSxAoPJQwg6ADwDZv9nWZfbp2VwVwBkuVxBCRBPFN+WTFmW/
-k1LSxUIeHqOG9RXo7S/DYddthE0iBzP3yKA5fs3k9zaQZNAjC92Dj/M4oDiIimqG
-DJAO7ixpQY2ug9FB4LtWkyeNRnOM1LKd3TbZNqzZt4TuhCI3C5LAfVoXRPxe4T3n
-4hvWkL/2THSKfC4u0CLGjw41rXhD86YYiIWdvxVezfESzpqZPhBrAZWfx7kB69pq
-8DxWFXCaA31S/L2I6B1ZUmpOhtxg0cDoevipne7jaqRjA7TknOC45+CrpuEkOvQO
-8rwHbtshT/JDFLPfq0ruDH21eV4QYP/JLffDGyEtoRRRr4M2DZCFkOCWIPE0l142
-5mIi0nqMSj1HK5kuwMQoNAf6vF6P6MYyGWJ8nR13CDtFOnjpOpuxZiTQhlb0cqXj
-X4yQBjFim8ztGOnHrlSh25OgeKuiCWiCIuyFGykjX21RtJ/AwiOeMr4zkwARAQAB
-tDhHcmFudCBJbmdlcnNvbGwgKENPREUgU0lHTklORyBLRVkpIDxnc2luZ2Vyc0Bh
-cGFjaGUub3JnPokCNwQTAQoAIQUCStTokQIbAwULCQgHAwUVCgkICwUWAgMBAAIe
-AQIXgAAKCRCKincf/gRZZqcfD/4+zhoLTTpTGRNutTyjPnR85aTuMUVtqYNLjEcF
-PSV7p1OPhsGd3g5iaQtwCMsbWDPRSL+Xvy4/E4D32YjUR026mzAUnICq4Z35TecT
-StIeMadgSwJ0fNvuzBB8jJfUYW6a91D9TZirEC4fRVRL1bnJvmjm0HnGLQa5uGCl
-dUMbR04YXU+5V8S6KbRtLwhiVDD/do6XKeS9PGY941sw9182mLZbIbEcQrNWf8s/
-eOnobosxg5a0WxKfSZgQfNqkkuNlsRbKwI2gSjzAl030r6pWzduvftqFdnoaOBN/
-yNM1BghAhXmb/hxjuQa0x+xan15/lY5FwDX1bdnZcEI0KHJ/FIPFgk59XJVnZYH/
-tRI6jqmxQvdliA9q6rt/ctZAYaOhmXI28eeLCmdnZKUZjiG1ORYC0tIYdOYc/nXP
-NqryDaa2OD2rMy8BM5tfQ/Om/6kavDqn/m8x0jLLuOne5Umeste3yTZ3pbJWc5GF
-izOCX0FualpLXNBWt3jCooSaj5Gx92pFgoanbtI91ouVNsC24eKOJZYibKLP5fuH
-B1sNvtPcWE3e99qOzVnolHjbDX4KzXCW+yFad714kK1vdAlDvqIt2OuEuQFggZHS
-5G5FbGjgqFUG5D0uckBmu/8lZ82YW2yhuQosa5EOMwChG1sqtsYuddbifFF78AM4
-vYnmKohGBBARCgAGBQJK1OocAAoJEMsDFRmoZ+ixVg4An0MfyRmOv0tA8/UibzyK
-KPrzo1aeAKCIV+M3L+gPT9yJ9843HxyBWL+j6bkCDQRK1OiRARAApG7lRX08hPq5
-7KRRUsK6GChneFeZZNNI35VpFQHPe8y/4ej7Ydnr37otEjIvd+14p0M+PF6igCIm
-IGp2dg57PFfoOVW+apoudAtBpWkdBSjMJQ4pCoLwyv/HSXKW6QxMZeO5OBdT4iAg
-AT36M2m/lpv5wC7g7SUJDusyFPuYtMtxAkj6TUPTFJBS4+FzhrNBoCXxILDKh0AE
-N9Sslm37tC7Le84PkiI/k0C//KqNZFQ11Cazyf0CuQKj4gLtkfBTaDenlsufAKNI
-M2pkIxtLNpx93Gcay2lVKD9Dv2i4EmQID7Vt6fZ2CP+60K7CnepLhapkfWa9Rk71
-7fqLIlXCFYdWEmuT614dnDuuuRfm12ZqT3GAx9F0elZ2yv4DrXnW1F60ASJuFnDf
-RYcbTmw2VVoDiAo2al4uoE7a2yjyv7PExB65k0Uj0n1V4PF413np3r/WLSWBxxNu
-9K8oV0KZI/UxvhMULGI23ryNTZAsoi3E44lZ0EUrJTWMRvLuewQdNpNLmlo30HNL
-VTyoIlWbzhsu4ejKVqLBs/Q9M92c/Um6FJM5owkiGBEvnRtGGWhf89RonCncwg2g
-i/rk91TTKnhGpYv3tenLjZ6qmlgMgT+KUrElqrLv02kD3xZ7+2zwhaLYWFlZN6wr
-xXlA/FDOEz3tChqG+41Vf8W26+QnC98AEQEAAYkCHwQYAQoACQUCStTokQIbDAAK
-CRCKincf/gRZZgzbEACfLTy+6afsT4wAgKYdlc+6w3bBqFnDzoG0JRIrUsVhEnjB
-xhl+RZA9XMkPvw5iAeNOWSU+SoPz8hGrv3tkGJXqfeThOAB5IVDDW8FDmm57/sl4
-2m09B+QHZ7Buw56OD90GoCSm1otkbaIUjoMTbuQxTRb1qykVHO4AgLReaeMb9jqu
-hqwxyzGzWMqVR01olgvCkSDrooYjA1ltQ84JrJhic5+zdQq1XYIv0dTPP3CcrFcy
-b6pVx+Y31hK9f0EXoNZv6Ekg6B5L7LUleB3XdCL+jI1eWlQ3DTE7+OkVcehpyygc
-JFgPVm/0KMPkHTa3Fw55YWbcrwAKGv5fWSj852pbaW/GNgDAiay0MPExEYey2cu5
-Pi8dUOmJoqcznBt9qQrrmRNWPRa1Gu9vowM9m90+jtU+Tlxo104tj8gKWVngnPhn
-v1VPKPblEwJfuqC3DQh3XWzs3AwjKLXXfwznF7slqBRT48BwdLsietnovoTsZXYg
-7ks2s/QxklWisZUxrhpZTNeA/WQKxyXwiN2sKxulwjd1PnAz5DeFQWKDNZHyHP+T
-1cqtTc96tSwb2XW3iA2uZlD4aTkrOmm3FKbauC/rFmCjkpvwpvqcIdpib4M2DgNx
-zAZ2cJnxw3f57qc9Yh5qvhDUephwOAlAy8ekc1AmX14F+mwYE3GjcqeGdEbLNw==
-=GLHu
------END PGP PUBLIC KEY BLOCK-----
-pub   4096R/0CF24209 2012-03-20
-      Key fingerprint = DBD2 ED0F DC2B 7BB9 FF1C  D4DF 516B 7064 0CF2 4209
-uid                  Shinichiro Abe (CODE SIGNING KEY) <shinichiro@apache.org>
-sub   4096R/72E360B6 2012-03-20
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.4.12 (MingW32)
-
-mQINBE9oOMYBEADOdlni9c6ayok2H4mDSapEgWJCTyGG0ztHJvqAAl2Cqjr7fvZk
-wgmWj85c3AIuDUA2aNHoE0xznYto9LpIHm8gYBnVKTw/VMLQTwcNQhEI9BS4+sFh
-ZXKRob8qGlIBHf69vUFnSL2zZO21p2QBi9eROYjTpkURWBGwXdPDy+ZsvKRErx+L
-dCFMygbwnnaB0GQeY6Fi+BPDE46veth/HcvIZFUJm7lHzSOo/AKuXVZrhtEaC4hH
-qnBr3jqq9mXYuy393GGgSmGAtViHf/2t/+KFZD1uIkSou5MQF9jf4rRUSQGrAyPZ
-gpLkVavDo2Xnr9OEzbrwaXHfAfe70o6A4jebI7K37KzeBAMtCaVO69flDQUqg4HW
-zhacyWJbcqeMPd1L8jOEORB78QVsw53jRJP9xFE3TyqKL0NxXnZCiLPWQsCZM0C4
-IQ9mGw/iTeN2jCa6oZP0IUgXkZdCciFUiyi/ZZ30wRuPNN/dBPsZ6TG5hHUkpe1e
-X7Lxu9EBvEvGhkeCJUXuguD30tIXDNWzFDLhNSQj+Dh0f0/RJ+LJG+LkN+cvh4b9
-JvebbFMoWzdwiUFlqmsdqFsr9jIs4RQIcOwgtdkvixb9Kq+oxQsecmogMwhHLyJG
-gLh5PHMOwaMYZvxIiZJH1yNv3CTFjVWmGnK2wjoVmtdxuHNhFKvvGeCCtQARAQAB
-tDlTaGluaWNoaXJvIEFiZSAoQ09ERSBTSUdOSU5HIEtFWSkgPHNoaW5pY2hpcm9A
-YXBhY2hlLm9yZz6JAjgEEwECACIFAk9oOMYCGwMGCwkIBwMCBhUIAgkKCwQWAgMB
-Ah4BAheAAAoJEFFrcGQM8kIJvEcP/3besO00iRf/DHREDci0OA+Q9ncGCniaVW7y
-I302or4eHG1bE0stYRoJEHDd2usP2+dUF45VURhyYn3Acaxw33UXOU1A9iwY/uhF
-nj/LmcSmeWPb9CJLzTcKg82etvmHLy4IPPzKXEXFcvIfoDxIXwfZwqKtWefzIXmC
-y7EOZFBCtZ4tx69Wd0Sa1yfMz73AdYqBH1xGGAmPJQtqCTuh4AyceANoLlYHHUSi
-qdH7Wrc130GynEjNJsrG+c6ftmSWQqNMQhi/jOlou8pXc8UyAYYuAWwshz/rCtJv
-njHdpIGNpZ3RkjhGtxF+CD27hEC6IoXczyrmaCJaPbwwMek5kzVnKiaHmP4+4oEe
-Kxpy6qsN6Z7SzpB16dhnZRIzCi8jI7/wEc5Y4moECLd/VPEyZccWGIMpOHlb+UdS
-21lhMGPrwNxUOodefgxIOIm2A402FhJJiuQBsl4hlV2fL4CwQ/aRrZ2EIk45U3uR
-jiS0boGzZU6Y2Z9pbOE7F8bHkwcePiqfsDOKhd5si2ooSNRDAedksYa9K48q2dDj
-2jfPMKuvvnN96iThuqa99iJNzSzYsN8bLNq5bJ99CDff6T+SDZGgEv9yEaR/+DXn
-jsCc33Jjy/74o7FIjHahh+HZK9RzI0nFXLvb1GLlMId6CmMVG3/Cyyk10FSixYG7
-z9pttB/HuQINBE9oOMYBEADEdbosht2Y3sP22bzhSKjZ3yqdtmCiDxdQFPHZpbC3
-Drm7rAdq22ZJRFlCHriINalewRJjjq+JKGJzIY3lBYBLgfjomlIwTqpJ1nobe3PR
-Oz58dISxSrpJO4cIHR2ozgqm2wey0MWF+1ZmF/xjLzLIuClI2u+OBV24HTdwVeo/
-1ce6hopaRUM5pxQrzPKi1C9gxmjJ2ceAlE5hmMmpc90K65HJCnTTNb+N90P4PtQC
-pnkK3ttzS8mUZ/7/eivw7MEHksMxTRuaCiIMfot8S/SrrQiO99mAhbn/9FSiJAr0
-Syi1cLpmW//23+pkCUIc9HbHXVuA65KoYnbcj9PDldCaswakjTwwHFraiDT8w9OH
-6uU1w0GZiXTggpfit1XOUebVPIEsrX6k85sQSSrq9oGCWtB+tJ+6LSm2HPgwcFh+
-rleHyQY0UKBTBnqgLz5OKwFeTaowOc4zJMgDrGW+yDYnHvZzan5mWVsfw0U5cTqL
-IIHqdGWIA9Q/YXjDBQi1+dD0xZR2yVSrNruuyD/l4uqYkVP52CYTZQaVc7WgczTe
-ENnSoMIuNCKw+qU7HOasAowOt6V5oLB4mob3kBtnACGY6CRxQwnCUa+kkhMlHmBb
-L+STLd5xhGNUN699aNR0InXtKMiU1MjBihzHURbqJVPH+m6uX54oWP9X39s/BwfT
-1wARAQABiQIfBBgBAgAJBQJPaDjGAhsMAAoJEFFrcGQM8kIJg3cQAJJFSkdWOH9L
-ZoV1zbeQuFXLIqJr5dveYaOgf5kaC6xEOUFOkN4eallGc5dTVu1j758y4E8SqiYu
-RFhNxG4a/VNkngNTHIiHJbHsAk6IuuQqjo7F+ssCwTK5NSB0RRkY45R5+esrq3xB
-nObCEtOgIqL9slnzocJoaf3Ag5Am7av31kxBtk5kthyDGWcJGKrxL0IJyikO/CRG
-2RR5fEDcDmLJYB3oerujdmOkD9HHsoBpFA/3sLSDt8JZkPDTpIqJYOJCN45SgB/t
-+WwZM0xa13CpI9oeg9C20Ag7w0RGUtHKE5iJec6C/s2Pp7Apx/PPnEgN1KWzo6JM
-Hgi4TTq3+DPGGSzyUCElgCgJgIdpoz6NPzZeo2Gm4K1ywL/zj1S2JJYVYIkcEn5e
-ON0Don4h4Q2K+WPieRxXf81Pl7LRMCUKr2zviqT8JkxmuSGOxpc+8KrIi82nbsRr
-Ck5uQw6iyqdHhu3Zs6eTLq0dXfbX58ydLHLt4sn3xiW698OL5/aZKJ1sTquL08XU
-NIfIRcEhwhUx/PDrVZv3GGRqL3pCvHvIvVMw+d3fY3asE0vDLyh6ubb54htsvJZH
-Ia0aoNGwzQtBRiFUa12CEzlVF1VgP6nanpJeNW4F2bmKEhCBa4LjCN67pCfqTSeI
-dKYkqiwOV26TcVVLpfYqvLx8vuC2qEsx
-=i/Xs
------END PGP PUBLIC KEY BLOCK-----
-pub   4096R/3D7558E5 2014-04-15
-uid                  Ahmet Arslan (CODE SIGNING KEY) <iorixxx@apache.org>
-sig 3        3D7558E5 2014-04-15  Ahmet Arslan (CODE SIGNING KEY) <iorixxx@apache.org>
-sub   4096R/55C9450F 2014-04-15
-sig          3D7558E5 2014-04-15  Ahmet Arslan (CODE SIGNING KEY) <iorixxx@apache.org>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1
-
-mQINBFNNk30BEAC06STETxE0u7EiJ5ZirlpnnFTKWvSjX4kyNUvX69C5fy0MjA7K
-DH//dygA1HxVHq4jKyhrm6U3WqSyKOHos39C3h4DeZZ0uNrmhfjHC5Wj0DeVkzmu
-mKpIho6EDFsLl25slQA9ptvZ3XEf5Gx0554yq+363F9Z7JEyeMM7AQQ1L19NjzKe
-IKMP6TQmo7u7dCn2gcAvpW2IFwaw1yQOw7+KpDcUSXTjmVv8FfdvtScTwWyjkNp/
-ZI5aTuAmLZofIiX/PHRAgvnuxzbqY3PCzCwvPSO5/KyiIceK6PoSfFnKxbbbHSgS
-eofl7HKw9tga4I2GzR0LVAduV90w2yUwqq2UtP/e1SU4ATkvoEYMMHphmcGLGs1I
-/mymyzT9A8WuH2ReeoUkRHF+DaePivlOyyyvO1BodwVdqzQmqOXAt0QMapSXSzdo
-/mrEXD2BSyDpE6hbrtIe+4YzFTgxr6OsjyCk7KHBlYynEVWl7BqXHQPva7bQ8u64
-jvzf6IhdslixZ/pvJGrc0/BYInbS1vVXtSiU7uJvnVzAFGfyf4bKrhRFuOVXEcUk
-B4g8Ut9xmrBC/9qh5XzG0CUh6yogqA70iOSut/zZ/C/EfcvMJ6HdtkI/5tfVF89B
-h/qtnw74ne0yA/fyGgrqOwELtJ+YMgNUguFZupNaaZMuiY35RkVrzYprSwARAQAB
-tDRBaG1ldCBBcnNsYW4gKENPREUgU0lHTklORyBLRVkpIDxpb3JpeHh4QGFwYWNo
-ZS5vcmc+iQI3BBMBCAAhBQJTTZN9AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheA
-AAoJECF+KNk9dVjlU00P/2dEBa9s4jvS0Oiy01Yj6WJz0lxlQD8/OYMpaySxYKr6
-VE0jwUBzbByZPOx/MJ+YPmrwj89O02GJKb6mHhI9vSR7q4eofw2myV19RFezlqrR
-X4oL3rmuGQ1SfY1pL6Zqlqiw072fm+hz/V800OWO7/d+dEUA8iI/LjQbxAiOjijX
-hxAiSHvqO7wyoUgYglhgh6vXIkV9xdBVvqcU8YRlL3FoABMfhgW4MjkWyQxHEjgr
-+zUZh2aE0LBuj79U5ALLzjUh9uRfTQata/Mrs9CNiIVRfK/0eGJzAMTf/rIdVrgE
-8J/MbqercwHYlsOjcoOd6uqnI7w+Ily3p3GMqvYmlPnSRIpvTL/8XfH0zIBoUHNH
-qfrbMS9Es6wOomVp7QAYhFbchYIXn2M8zlou7SC7+u6PJkVYUzPNKuDbtbG8sCP2
-LUV9gXsVXwgZLwKiXUOB39O6Hy+u3XSNGX9xK+7KCS/HkADOeAHU29PKIxptxYoS
-kWDxSrnpgOreWRa501/CofZJU9jhuauOJWQDbg7Qv8IC6QrkfAT53u5r2D662qRx
-weaP13BRaXrYezNG3Nvh1SP/2P4lQc0rZCdYCa/cC/uw3u4xPECxuYdNWmKMecIz
-99EQCECwTNVvLnRxkdbJDy0wvikwWbneCu2T3ariJgygb36dlLJ0CU2m+sJGTW8/
-uQINBFNNk30BEACvL/LLUOf9zhDEXHzb4N9CIWDQr4RKTAwFf0+g5VFxYZiPDhod
-GZ2cXxGS6GSxxlL9g/hF1puC9k8lHkSn9WQ6zqlXkZIBGsgQgb23Dqj1FJhk4ULd
-eO6WUXiFoSm6hGL69xgy7SjTOAB37cqtBkSfcnx9DlZ5ZT3YKiM1ezAqN84Af9Dp
-WNVRdh3u1moCaUwQyIq3YOVYMZQ6adQ7pMOK1C+3gkA+vvfVrbQY/51KfZ8pUZOn
-kWrH9kxoRoyWFG1Xip0yG7vfLpmfPzArw4MkJYqyivlh5EURIgMPHUgPN9SdAK7n
-IBPK5Q1Nz0DA6AkfAK5k0DZxMj9UAGzuKX/Acrb9dYO5wGkw2FDjAsaL+APIOngF
-IRZDjlGgOdt2bEwe1b6EsoIQ2Ct0jBSFAYGX4k59PmKYeucOizvUpI3HOlDrSqbL
-QJ6chTEP1CNOTyLRbIPskUEfO8W7zxePNZLytCqd5rpuomSWela0h2ZqgYzcKOpG
-N1FRbguhIrIbNomJ723aocgM2QE2DEV/RGWZ/RXr9ALk4zwKrLrO7T3fPWq0cqa5
-MOyeSLlzehrK4bPRTnjaUnNjjA/Yk6VjrUPdysjp9BYn1RitCm1Z8sCqetd0Zuzw
-fd2j6dvlQ5D8z2Y4ASlBZQTljsIpep0bboDgDyLDSF8wwGrtUSXZLyJ50wARAQAB
-iQIfBBgBCAAJBQJTTZN9AhsMAAoJECF+KNk9dVjlrIAP/08Sbm4vgwBC2qWsfH0/
-LP4j3xx1DBpoFfXAie5V6diUSIjsQTB8vLF1WAGjCzwUyfB/53hBAVwx2fglylfQ
-SMxgURLtBEC9zm7eRrEVJO4uUyHZSgNtAlf+sKlV4A5Ix9NLje2B7808yU5PuGB/
-rAw6kMrhCJvjuXqWS1A4Lgw+H6gOMZ8m9iomPEb2Gvtnf9yE7S96B9ZE3yrVCpAj
-8HRjhW5Sbaf2BKmAs0k5ejIjGG1/IF6Nwch5Ig2YoBEMq5BYCAlMZxGx7FWlfIiW
-5HJDSET4XvJ59ztsQPIf5k+5HwEqLi3rG2eoA5ITgrylucXx/09KZi/QYj4EFPAH
-aY9mIhZX77halI9BLBkCezzCIo/30E7OtSKWzpFOseXOiNfrHLrjD95sdOm0us4Z
-yuX2c7YuhfVXPI73mHqQt3ThadniH0a/HJ4+g4ll06Qi+OxoY+4rljlwsK9sJ0NF
-G0ba71P1RAUqQT893RMBV7fVocHH72RMZqj1OBFc2ooXGF37nH+EA3fVoFMgKnDH
-kdbJThdxKZ938WUsk6zWP0XD5N4Kj07o/xOK9k1HU+cYDxtD77hphXhJFDSUXzxD
-Pm7NsfA29wLXsd3ZZZiS3y3JmVJeyyBimFKtyVBKC97hVrMLpNkdn6fM3k2HrFCL
-OWUgArPPt7zCcZpWTJCZOvhy
-=qHkm
------END PGP PUBLIC KEY BLOCK-----
-pub   4096R/597FF265 2014-08-12
-uid                  Mingchun Zhao <mingchun@apache.org>
-sig 3        597FF265 2014-08-12  Mingchun Zhao <mingchun@apache.org>
-sub   4096R/1EE1F38F 2014-08-12
-sig          597FF265 2014-08-12  Mingchun Zhao <mingchun@apache.org>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1
-
-mQINBFPpZxsBEACfn78r+cdP0ejc2XEzQNiPDfDG3rDj3G+XWisxdBKL8f/krr7/
-7EUn2IT4o+YqkAduw70xO/dHK8fozg8+17BFF0HuAE/ddw4MyCyY3JYA1GRSzKuM
-JYXS1DhLWp6wy7lNyu/Luf1uN6tyhyDHZ602WfT7lOQnf/BB1RRRPeAtrkYuYQ/e
-Hvn2yzsWE7R0mpUsiXjtdk7XnlTEEfyV8n4EJ9BBmJqlgI3419uq9KTUczMVaMTP
-uG3Y/etaB5ZiRGnFQUCOpKA/9KimKS3b6QYqOVWViTdEG/wsaws8Buhty3+KayA8
-lRUqK8KO/ByQRIdGnkfmeXNTS+gKoI7aTytpGnKTPwlo9hWx7XOCrQ6KCyVFmB51
-P+Gl0NyNRC76ChjmkJgb4YkZc4yBF4U0+gjhQlDmdUnHnfcmchH0KI8C7N/8xEou
-pKEZXK+YfC7WbwnQWlqwxwX1bDH3mPzAZMF3j8x/RczP71DR3fY1Iv8QhxxhLRhp
-7FvRMUrRYkyhug+7NWjEVH70ziAfMn1ISlE5uToK2n4Yf4r+lWz93bGisz+EB/Ei
-ohVTBjSpXJNo+5QHpRlA8Iiwt0QPTUAOECb2o+WJReg9GVaJ4yLXI6zBLSRuQDM+
-pZrsdDj/N5MKob4kvrE9zaleRh8uwekfsskRqHeqzxpr5hZHL29xm1wnQQARAQAB
-tCNNaW5nY2h1biBaaGFvIDxtaW5nY2h1bkBhcGFjaGUub3JnPokCOAQTAQIAIgUC
-U+lnGwIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ7c2e7ll/8mXaRw/+
-LrspfaDCjiRpd7KKGwUjXKDykru175gmxvpNt7Bnr5+tLtzZPcEaOoRjPLj16SXl
-E4ZeBwaGpvcrr1qIYuEsvQXxi2xS50i2NZvSgKar4O6pZ9k+NFCjwkit/4FmhqZO
-knbUMuRsc1v0eiZ8cAaRbuGGCLQfQJjCrvxUM4UwbaZ9jJZnerUDprMRcVjmCV24
-TYclc4c3tydVpwXZVs2W2vqWMIGxZJK98oV/2DOHUDz3AnNlnWcsPPOS2Tpm7nh5
-d49W+HyXoOlj6ScANjqYdzS+cqztdcusJy7DtNbLQmmoJgGBaRWR1kwuDxNkOc4/
-9zWkfG03xJQAqMckNwq5aDadoZY1lUsW67yvNzMbWiMAfSSMzGvC2aSNudAc1+XC
-pkrm6jngJ9xxJgBho/OYGOSvGlejg9TqRGRPbsZlm3DitTG5Ukv7vGIbt5RqIK8J
-k6KUiL3W7yqrPSLxy9vosgM2Ssbad89eBACvTYKsBeDsb3H0cTTpu/lIL4WSb0Ki
-/sogiM7qp6wCVkFiB2Cm7qtSaBacox0J1YWwcLomK7HA8eejCRXkIan7n/nHz/i+
-E3mvdDNrwQkC4rtDL7R2sAFCXc9mHLPcN6oJFVRTLLbCCtjikrBH7nxumbwlIq2k
-kTFe1JJDt2BXG5XkpN79avAJyImugbzBvTW2pRZgrQi5Ag0EU+lnGwEQANbV0/dL
-8q2M8MPNjDNhTPzmBk7NY1vz8pWGuNh1FD+CW5GysEl90AMnbEHax6rOp4Fh0AUl
-3Q40RYXTkAsn2AOQqmo7K6TpQnhzKVVkpqUtTpjevfgGePWfoYFiLEWRTZI230NH
-4EEBJXlBWqSFyVrBVs8/aj9kIkxw1QeSTMXh48fE1bxSFcvTaw8Lb55q3S2o7b1n
-kjS8kVNrS0xUAxKve47+80aj9Uts9fFrNd+IxinkAy2O2Px8RdojbQb3sTlisoI/
-CbciKNepGetmxaRnq54tWKFzETmt0yQmw4B8rB0boLntHRjO473uOEi4MknUKdSr
-m+ujlbzXUnXZ39Zp5Fou5fy/+nY96WVRmO7Gjpx4QOxFFUiNNBRqMewG++Fl22/a
-QLMptdY5OPbauPqDsDuRwnu3UzPUoMbCRScKohDHpQt0ln2EKFrXIcsKOfSjWW8r
-JcjobgEdxBlVVSm39BNhnt3YpGyYSH27UM7008tHSLP3MLrIRdy/ZpJL4anaFSSA
-q6RMzXdwPQ1ZB5oipaBoYHANDnKCCBpHdOrzZKKCsvruHGDSfuWeqQvs7fAHbt6r
-5viwzOgF3OBbfh1vVqaiLkb4Llj4DgzO/0/XLIaT3lXQvHENgpG7MTTR3Si/Zn+T
-eXcwOz8daYp3yOxrDgnyGl9g0FcESlgxlFbJABEBAAGJAh8EGAECAAkFAlPpZxsC
-GwwACgkQ7c2e7ll/8mV6vBAAnFKQB3XnsF2YvlZiL06YJN7YebwXH+4Bd7XjbnCx
-zIjQRwSTjJ5ieDEi8BDBmkkHCWeLEwm9TB5DoerGcVcyjUbg9vRJklzv3uS3+xQ0
-qcT6Z9ACbQAal30Hwy1kVJ+yAfjkLd9qhi6qloJufUnUOQVruXnlgePuR9MuE0vU
-yIYCV0ba3pvcUvttVW9oQvPkpxBpT37vmzCM6vm9rVbOb8yPGUhOOJtBljemh1On
-0EcfZAcwGDodKB5eq+hoP0+7Cpxav8PNW897L6R4Sd7pXQABoeSzcoNUiTw+XqeC
-M5Mu1K2yIfQxPpqO68NT5H6xPFzADIST8q4MzHvCUXUsEJXv6ghoq0glDWyb7a5x
-blPpCRzztZSQCrELTwyR3RMCcKSMYwvbQ4dFznybkEKaEWeH85IpIcFdLkFFVVpp
-rNAXy2+Z8URaiL0R9B0RF8W51hYrnZKy59DMqt2+ETLir1ySG+FKOkLvHOoA5Geu
-kuK94LKrY6kDWeuWVkGTQuXwIP07Iint7+df7hGG7av4sJnAWc6wNdFMhf7Okh8l
-HmJFUB+sURcGFiUDSywOfj3w5rx4qrSktIWl0jVDeGvXGdKUftYuRSDzCpQDkjtB
-7IO9VRIJBx/zGTMNSmz0Wdi1CQDpWMBvzUPdSVAE62pUGWip49fXjIOZATZgYT6e
-qeM=
-=OdJw
------END PGP PUBLIC KEY BLOCK-----
-
-----------------------------------
-pub   4096R/A5AD43BF 2015-08-26
-uid                  Rafa Haro (CODE SIGNING KEY) <rharo@apache.org>
-sig 3        A5AD43BF 2015-08-26  Rafa Haro (CODE SIGNING KEY) <rharo@apache.org>
-sub   4096R/2353BB04 2015-08-26
-sig          A5AD43BF 2015-08-26  Rafa Haro (CODE SIGNING KEY) <rharo@apache.org>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1
-
-mQINBFXd8HwBEADUhvwFzEYw2HjhluUzYDf3Pjh1ErEP6PmMNjBkYCd0mMs/VFqH
-arLrOwKJXdWFPQ71g0SCiym5yhHIwE0DKrdOFZjs3Rt/4ICE3EjKmsj7JpN2/pq3
-Uy5lW2EG1D3SXQtpua83zfwybIUuhh2TtWN9+qkFHsvO8eofR4LUKl23QeE8rB3W
-g8WQ3+9pqeVoD5LSR7ToZnUsSBkVi3NGd2KnaEFVIuxHCtzCgBiLXr8dvX4ZifXK
-IdYf5bGjmpo9zYNsv9P+uoy4QYB7m+6xjdK4tx4ZibX+yShmS/rPK22eaD1ZfyNG
-eOCBD7RkC48U8Pyb5VHN+8frLgTJux5fWzCVLNYZ5I9sSFnuQlsHNWzE8hdsO2eD
-J1Bl0WNNX7rq351J1DeGiP4yFBtejyl21Qy3j+uwXjVBqAKWKUAAI+sVDVY43/QG
-6K8TOsYlVm+It4um67+c4Y8P6eYqdpF0yDsChDd8IWnkPW8u4H8z+93R2aibvEqD
-FuTzs60mPzV647kaL+xtgG7kRt/a0JpWu8DJf0IDrP7zK1nMs8XYKuXjmY9EJ1EQ
-McxMo7IIG34ASGgggr4560zzlp+kRH+AJCT+k4E2uB1Ev+/FKR8UU6rIPY+HaBJG
-gga71CFgRUwXf46YOW7II3SdOJS3DP2aPX4dmlVFZyivv/wOR3L9+Jl/tQARAQAB
-tC9SYWZhIEhhcm8gKENPREUgU0lHTklORyBLRVkpIDxyaGFyb0BhcGFjaGUub3Jn
-PokCOAQTAQIAIgUCVd3wfAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
-jw7tn6WtQ7/VEw/+Ik5LFBGe8pJz7Q/mnRJQQ4Xhhzz+T5zwCi7MLutOo2Nptz2V
-RQ3XbaYI+XuiCxmKIReL0u+zi9Nokdso/iA/ZrNZ1tGiwFbV1aKA0DX2HuHm5C/9
-JaIuVF5CAgk9wa0KCmi0S603+S7M2468CB3YTqURmCp19eUrNNbZ3Iz9TVZGgRRc
-zq3YQHD2agCUqKtsI6aDS+tE+FO50g7kRkC3V5ig8+yHDGez0PkbUyFn/DPajhrY
-xg/QCPByp0F5r3nG8De2pJ0rO4f7pnLJdTF0qyEfqRLRaRr3gazaDaaCFLpLiCmL
-yozEiTCtqDlNXmRr4hf6foh4OEIBWebkh25ILIYfyYUW1kix4/ZHJBHcUU0tbk1D
-06/JNsEk6p7PnMfj6fUZaSSVHaXV1mDo3k4B4DF2mR1UqOodaPGO65AhQDJdT81D
-rO/esx27ciSwwpPy2Xitrz8ydQEfcpxY9OzZyD/WGMRhKUgRU7Ehi2Zv/gfIEZpD
-pFKSZdsS5ypIEpLjmMYIiRZjtMZYm9cw2mrtuyp9c8gxQMgqBD9l2JVPcz7pq3ow
-rV7mdTv4Xtu+h9x4cVomAbPsh32I0x7OUYomUOp2Z+/Amm3NT2gVgVOr1iYZAWXN
-mNty5dDxTjU0rF3BwQDbFxaXCpgv6aCqBWzYWAQeJJ1a/lV1iXYRbLvKybm5Ag0E
-Vd3wfAEQALr42tvV0cwBXdR+FWrjeu901hlnId0d1/VCLcOu8q/HYZHdfX0RmcSb
-YkqerUdh3Jse3PQQ6xtGlD1vxBGb1DUzJ2x1yyVkhvdZxK1IDMXvTQxOx+/z7pLy
-pVp83m93GJv62cqieLk3pzEaGVWALPFI5CQUNF25+9jzVCaip2Yis8fKJLZSBurJ
-8WGmxAaq7JwgSWP+CXcNHipHIlYpjd7qX/wVAn2uGw9HBnC1BXryrWBIj7ngfyUL
-YugRNlVkzNQ2ZsbWMjFSWg1Xd6qofO/kVUQiCDtxHspkXcx7EjD/11QILRk/4XIR
-V1q8bk/f3zvsZwwbttPJB0AczCyV1br7G74g1sso68jW3dS4EKcT3NXx4Z/8ruuG
-vI2i3A8Z/Ou9oLrMHk+usiYtRTnKhc8KLF7mlLdbqzsezZT/M122eMWHXXvNmHCa
-mKS/4+lado9ENl7nGMcz2MJUNopV5zTRnaTKtXCWw4lcTT2vcqR66qgo/VTO5Lbo
-go7hPZN+xlpBvrj4PopbK534Raf0aVHB2T2BiSGljEjo/O5MUIqSpz7Uo2MIyJSy
-AWlYehSVaNvW2C7Krebg+XhYzPejsiuFlsT8gPMB9+X6srMezvH9n9svbQ0LTIS/
-MzcKcA82RmUDFd3WgcoSsO03mq/rg2vuQ9GAZE0IXrrgxaO/Ck7jABEBAAGJAh8E
-GAECAAkFAlXd8HwCGwwACgkQjw7tn6WtQ7/1FxAAz4llWS14XVwTh5ANR5+uq4j6
-XgMQdlF5vZWl8T2ETAPcwdz0ZTH5qiNxZlq1/D0mD9px5PzMKK5cZWl9RZJnTLTu
-vnxrG5ohBwwMZcRiF9PETJy9p0XDFlQH/aFKLVfkIRyHcJWHBp91G7/yhTmAbylp
-HJzNBqvhS8r21Gb3p04c6X6sNQMqDXBo0Z9TNbkUuBn7NNZj2y0OPOF0qP6lVstE
-UHDq9826h3Eb4dy0yGp13WXm8KIAwYC58Ic65FOvtXavCTkFwHsIL7S8g4TW1T1t
-hfpK/h5ccAR2xPkVG09IRZeTzSnyto+l43feotZoYHFfu/NtakllZl/IZ+FhgW/9
-uNQIzxoehGIuW/JQuSTiVNykKuZnVFAJfTvN54wIRID2mbrGjp01u0FT7htjSW7R
-F1Z9QOxK8p6LXcTE+sMcm2q82DoC0DMqxf26pKJoEMK8sikX2qH6kdEIU2Xf5j4G
-+VSe+ke/BYqYl7SeCJbpMtvYGt5/qXutlr7TnT5+VU3bRozqKYuowsyN5zjx8J4b
-IqYJQ4sdxkpGHvnvGijn1DOjQTKdpEcCSnPCjQ2/Qvr916xqvj/Zk/2IJ0WKMByj
-ezxPSmslox1n6hqNsDc1JQxzSw9tcKdNJmSp7MUMw4k5Ma3s/lHvzY6f59lrq9yL
-tNBEOeTgtb2BxFMlR40=
-=pK2D
------END PGP PUBLIC KEY BLOCK-----
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index d9bdaea..0000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,434 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-
-The Meridio Connector portion of this software includes application
-interface descriptions generated in part from proprietary libraries licensed
-by Meridio, Inc., a division of Autonomy, Inc., a subsidiary of Hewlett
-Packard, Inc.
-
-The SharePoint Connector portion of this software includes application
-interface descriptions generated in part from proprietary libraries licensed
-by Microsoft, Inc.
-
-==========================================================================
-The ManifoldCF source software contains files from the "bootstrap" project.
-The following license applies to bootstrap (http://getbootstrap.com/):
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2011-2016 Twitter, Inc.
-
-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, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-==========================================================================
-The ManifoldCF source software contains files from the "bootstrap-select" project.
-The following license applies to bootstrap-select (http://silviomoreto.github.io/bootstrap-select/):
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2013-2015 bootstrap-select
-
-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, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-==========================================================================
-The ManifoldCF source software contains files from the "jQuery" project.
-The following license applies to jQuery (https://github.com/jquery/jquery/blob/1.12.4/LICENSE.txt):
---------------------------------------------------------------------------
-
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
-
-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, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
-
-==========================================================================
-The ManifoldCF UI contains files from the "jQuery-slimScroll" project.
-A dual license (MIT and GPL) applies to jQuery-slimScroll (https://github.com/rochal/jQuery-slimScroll);
-we distribute under the terms of the MIT license:
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2011 Piotr Rochala (http://rocha.la)
-
-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, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-==========================================================================
-The ManifoldCF source includes font binaries distributed by the "Font Awesome" project.
-The following license applies Font Awesome font binaries (https://fontawesome.io/license/):
---------------------------------------------------------------------------
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded, 
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
-
-==========================================================================
-The ManifoldCF source contains CSS files distributed by the "Font Awesome" project.
-The following license applies Font Awesome CSS files (https://fontawesome.io/license/):
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-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, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/NOTICE.txt b/NOTICE.txt
deleted file mode 100644
index 877af98..0000000
--- a/NOTICE.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache ManifoldCF
-Copyright 2010-2017 The Apache Software Foundation
-
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.txt b/README.txt
index 965ad8b..fd28cb4 100644
--- a/README.txt
+++ b/README.txt
@@ -1,123 +1,29 @@
-# 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.
+This directory contains the ManifoldCF web site.  To update the site, do the following:
 
-Welcome to the Apache ManifoldCF project!
------------------------------------------
+    1. Modify the site sources in ./src
 
-Apache ManifoldCF is a multi-repository crawler framework, with multiple connectors.
+    2. Run "ant make-core-deps" and "ant build" to generate the site in ./build/site.  You will need
+        internet access (for downloading dependencies and older MCF releases), and svn 1.7+ installed.
 
-For a complete description of the ManifoldCF project, team composition, source
-code repositories, and other details, please see the ManifoldCF web site at
-http://manifoldcf.apache.org
+    3. Review the site by opening ./build/site/index.html.
+    
+    4. Commit the changes.
+    
+    5. To publish the site, perform the following steps, which require Python 2.6+:
+    
+      (a) Check out the site image at https://svn.apache.org/repos/asf/incubator/lcf/site/publish
+          to a place of your choice, e.g. "svn co https://svn.apache.org/repos/asf/incubator/lcf/site/publish ../publish"
+          
+      (b) Run the following script:
+      
+          python ./scripts/update-site.py ./build/site <svn_root>
+          
+          e.g.
+          
+          python ./scripts/update-site.py ./build/site ../publish"
+          
 
-Instructions for Building Apache ManifoldCF from Source
------------------------------------------------------
+    6. The site will be mirrored from the svn image on a schedule by a cron job, currently owned by kwright.
+    
 
-1. Download a source distribution of ManifoldCF, and unpack it.
-
-2. Download the corresponding lib distribution of ManifoldCF, containing the binary
-   dependencies, and unpack it.
-   
-3. Copy the lib folder in the lib distribution into the source distribution.
-
-4. Download the Java SE 8 JDK (Java Development Kit), or greater, from http://www.oracle.com/technetwork/java/index.html.
-   You will need the JDK installed, and the %JAVA_HOME%\bin directory included
-   on your command path.  To test this, issue a "java -version" command from your
-   shell and verify that the Java version is 1.8 or greater.
-
-5. Download the Apache Ant binary distribution (1.7.0 or greater) from http://ant.apache.org.
-   You will need Ant installed and the %ANT_HOME%\bin directory included on your
-   command path.  To test this, issue a "ant -version" command from your
-   shell and verify that Ant is available.
-
-6. If you want to build the site documents, check out, build, and install Apache Forrest
-   version 0.9-dev or higher.
-   
-7. In a shell, change to the root directory of the source (where you find the outermost
-   build.xml file), and type "ant" for directions.
-
-
-Some Files and Directories Included in Apache ManifoldCF Source Distributions
---------------------------------------------------------------------------
-
-framework
-  The sources for the Apache ManifoldCF framework.
-  
-connectors
-  The sources for the Apache ManifoldCF connectors.
-
-site
-  The sources for the Apache ManifoldCF documentation.
-
-tests
-  The sources for the Apache ManifoldCF integration and load tests.
-
-build.xml
-  The root ant build script for Apache ManifoldCF.
-
-mvn-bootstrap[.sh|.bat]
-  The Apache Maven bootstrap script which installs required jars into the local Maven
-  repository.
-  
-pom.xml
-  The root Maven build file, which builds certain ManifoldCF jars and war files.  Invoke
-  with "mvn clean install".
-
-Licensing
----------
-
-ManifoldCF is licensed under the
-Apache License 2.0. See the files called LICENSE.txt and NOTICE.txt
-for more information.
-
-Cryptographic Software Notice
------------------------------
-
-This distribution may include software that has been designed for use
-with cryptographic software. The country in which you currently reside
-may have restrictions on the import, possession, use, and/or re-export
-to another country, of encryption software. BEFORE using any encryption
-software, please check your country's laws, regulations and policies
-concerning the import, possession, or use, and re-export of encryption
-software, to see if this is permitted. See <http://www.wassenaar.org/>
-for more information.
-
-The U.S. Government Department of Commerce, Bureau of Industry and
-Security (BIS), has classified this software as Export Commodity
-Control Number (ECCN) 5D002.C.1, which includes information security
-software using or performing cryptographic functions with asymmetric
-algorithms. The form and manner of this Apache Software Foundation
-distribution makes it eligible for export under the License Exception
-ENC Technology Software Unrestricted (TSU) exception (see the BIS
-Export Administration Regulations, Section 740.13) for both object
-code and source code.
-
-The following provides more details on the included software that
-may be subject to export controls on cryptographic software:
-
-  ManifoldCF interfaces with the
-  Java Secure Socket Extension (JSSE) API to provide
-
-    - HTTPS support
-
-  ManifoldCF does not include any
-  implementation of JSSE or JCE.
-
-Contact
--------
-
-  o For general information visit the main project site at
-    http://manifoldcf.apache.org
 
diff --git a/build.xml b/build.xml
index b8693d7..31eb7e5 100644
--- a/build.xml
+++ b/build.xml
@@ -15,1448 +15,244 @@
  limitations under the License.
 -->
 
-<project name="manifoldcf" default="help">
+<project name="manifoldcf-site" default="help">
 
-    <presetdef name="javac">
-      <javac includeantruntime="false" />
-    </presetdef>
-
-    <import file="site-options.xml" optional="true"/>
-
-    <import file="common-build.xml"/>
-    
-    <defaultexcludes add="**/*.patch"/>   
-    <defaultexcludes add="**/*.iml"/> 
-    <defaultexcludes add="**/.idea/**"/> 
-    
-    <property name="hsqldb.version" value="2.3.2"/>
-    <property name="jetty.version" value="9.2.3.v20140905"/>
-    <property name="httpclient.version" value="4.5.3"/>
-    <property name="httpmime.version" value="4.5.3"/>
-    <property name="httpcore.version" value="4.4.6"/>
-    <property name="xerces.version" value="2.10.0"/>
-    <property name="zookeeper.version" value="3.4.10"/>
-    <property name="mongodb.version" value="2.11.3"/>
-    <property name="postgresql.version" value="42.1.3"/>
-    <property name="axis.version" value="1.4"/>
-    <property name="saaj-api.version" value="1.3"/>
-    <property name="saaj-impl.version" value="1.3.3"/>
-    <property name="castor.version" value="1.0.5"/>
-    <property name="wsdl4j.version" value="1.6.2"/>
-    <property name="commons-codec.version" value="1.10"/>
-    <property name="commons-collections.version" value="3.2.1"/>
-    <property name="commons-collections4.version" value="4.1"/>
-    <property name="commons-discovery.version" value="0.5"/>
-    <property name="commons-el.version" value="1.0"/>
-    <property name="commons-fileupload.version" value="1.2.2"/>
-    <property name="commons-io.version" value="2.5"/>
-    <property name="commons-lang.version" value="2.6"/>
-    <property name="commons-logging.version" value="1.2"/>
-    <property name="commons-configuration.version" value="1.6"/>
-    <property name="commons-cli.version" value="1.2"/>
-    <property name="slf4j.version" value="1.7.24"/>
-    <property name="xalan.version" value="2.7.1"/>
-    <property name="poi.version" value="3.17"/>
-    <property name="activation.version" value="1.1.1"/>
-    <property name="avalon.version" value="4.3.1"/>
-    <property name="ecj.version" value="4.3.1"/>
-    <property name="fop.version" value="1.0"/>
-    <property name="javamail-spec.version" value="1.7.1"/>
-    <property name="tomcat.version" value="6.0.35"/>
-    <property name="jaxb-api.version" value="2.2.11"/>
-    <property name="jaxb-impl.version" value="2.2.11"/>
-    <property name="jaxws.version" value="2.2.6"/>
-    <property name="solrj.version" value="7.0.0"/>
-    <property name="noggit.version" value="0.8"/>
-    <property name="commons-math3.version" value="3.4.1"/>
-    <property name="chemistry.version" value="1.1.0"/>
-    <property name="glassfish.version" value="2.1.v20091210"/>
-    <property name="junit.version" value="4.12"/>
-    <property name="selenium.version" value="3.3.1"/>
-    <property name="hamcrest.version" value="1.3"/>
-    <property name="log4j12.version" value="1.2.17"/>
-    <property name="log4j.version" value="2.4.1"/>
-    <property name="mail.version" value="1.4.5"/>
-    <property name="mimepull.version" value="1.3"/>
-    <property name="opensaml.version" value="1.1"/>
-    <property name="osgi.version" value="5.0.0"/>
-    <property name="xml-resolver.version" value="1.2"/>
-    <property name="servlet-api.version" value="3.1.0"/>
-    <property name="stax-api.version" value="1.0.1"/>
-    <property name="stax-ex.version" value="1.2"/>
-    <property name="streambuffer.version" value="0.9"/>
-    <property name="velocity.version" value="1.7"/>
-    <property name="wss4j.version" value="1.5.12"/>
-    <property name="xmlgraphics-commons.version" value="1.4"/>
-    <property name="woodstox-core-asl.version" value="4.4.1"/>
-    <property name="stax2-api.version" value="3.1.4"/>
-    <property name="xmlsec.version" value="1.4.0"/>
-    <property name="xml-apis.version" value="1.4.01"/>
-    <property name="jstl.version" value="1.2"/>
-    <property name="dropbox-client.version" value="1.5.3"/>
-    <property name="json-simple.version" value="1.1.1"/>
-    <property name="json.version" value="1.8"/>
-    <property name="google-api-client.version" value="v2-rev136-1.19.0"/>
-    <property name="google-http-client.version" value="1.19.0"/>
-    <property name="jackson-core.version" value="2.9.2"/>
-    <property name="jetty-jsp-jdt.version" value="2.3.3"/>
-    <property name="jetty-schemas.version" value="3.1.M0"/>
-    <property name="alfresco-indexer.version" value="0.8.1"/>
-    <property name="gson.version" value="2.8.0"/>
-    <property name="guava.version" value="21.0"/>
-    <property name="mockito.version" value="1.9.5"/>
-    <property name="wiremock.version" value="2.5.1"/>
-    <property name="objenesis.version" value="2.1"/>
-    <property name="tika.version" value="1.17"/>
-    <property name="tagsoup.version" value="1.2.1"/>
-    <property name="james.version" value="0.8.1"/>
-    <property name="vorbis.version" value="0.8"/>
-    <property name="metadata-extractor.version" value="2.10.1"/>
-    <property name="aspectjrt.version" value="1.8.6"/>
-    <property name="jhighlight.version" value="1.0.2"/>
-    <property name="xmlbeans.version" value="2.6.0"/>
-    <property name="bc.version" value="1.54"/>
-    <property name="tukaani.version" value="1.6"/>
-    <property name="pdfbox.version" value="2.0.6"/>
-    <property name="jempbox.version" value="1.8.13"/>
-    <property name="commons-compress.version" value="1.14"/>
-    <property name="commons-csv.version" value="1.0"/>
-    <property name="commons-exec.version" value="1.3"/>
-    <property name="juniversalchardet.version" value="1.0.3"/>
-    <property name="ucar.version" value="4.5.5"/>
-    <property name="jna.version" value="4.1.0"/>
-    <property name="cglib.version" value="3.2.4"/>
-    <property name="jcommander.version" value="1.35"/>
-    <property name="protobuf.version" value="2.5.0"/>
-    <property name="jcip-annotations.version" value="1.0"/>
-    <property name="ehcache.version" value="2.6.2"/>
-    <property name="bzip2.version" value="0.9.1"/>
-    <property name="jdom2.version" value="2.0.4"/>
-    <property name="quartz.version" value="2.2.0"/>
-    <property name="boilerpipe.version" value="1.1.0"/>
-    <property name="dom4j.version" value="1.6.1"/>
-    <property name="asm.version" value="5.0.4"/>
-    <property name="xmpcore.version" value="5.1.3"/>
-    <property name="rome.version" value="1.5.1"/>
-    <property name="jdom2.version" value="2.0.6"/>
-    <property name="mp4parser.version" value="1.1.18"/>
-    <property name="jmatio.version" value="1.2"/>
-    <property name="java-libpst.version" value="0.8.1"/>
-    <property name="commons-httpclient.version" value="3.1"/>
-    <property name="jackson-databind.version" value="2.6.1"/>
-    <property name="jackson-annotations.version" value="2.6.1"/>
-    <property name="resteasy.client.version" value="3.0.16.Final"/>
-    <property name="jsoup.version" value="1.7.2"/>
-    <property name="jj2000.version" value="5.2"/>
-    <property name="hadoop.version" value="2.6.0"/>
-    <property name="aws-sdk.version" value="1.9.0"/>
-    <property name="joda-time.version" value="2.9.7"/>
-    <property name="junrar.version" value="0.7"/>
-    <property name="jackcess.version" value="2.1.8"/>
-    <property name="jackcess-encrypt.version" value="2.1.2"/>
-    <property name="opennlp.version" value="1.8.3"/>
-    <property name="sis.version" value="0.6"/>
-    <property name="opengis.version" value="3.0.0"/>
-    <property name="jsr-275.version" value="0.9.3"/>
-    <property name="commons-vfs2.version" value="2.0"/>
-    <property name="maven-scm.version" value="1.4"/>
-    <property name="plexus-utils.version" value="1.5.6"/>
-    <property name="regexp.version" value="1.3"/>
-    <property name="c3p0.version" value="0.9.1.1"/>
-    <property name="sentiment-analysis.version" value="0.1"/>
-    <property name="cxf.version" value="3.0.16"/>
-    <property name="neethi.version" value="3.0.3"/>
-    <property name="xmlschema.version" value="2.2.2"/>
-    <property name="annotation-api.version" value="1.2"/>
-    <property name="javax.ws.rs-api.version" value="2.0.1"/>
-    <property name="virtuald.version" value="1.04"/>
-    <property name="rat.bootstrap.version" value="0.12"/>
-    <property name="rat_checksum_sha1" value="16398550402b27f81cd0d508cef54b3e47a4a6da"/>
-    <property name="rat_install_path" location="${user.home}/.ant/lib" />
-    <property name="rat_bootstrap_url1" value="http://repo1.maven.org/maven2"/>
-    <!-- you might need to tweak this from china so it works -->
-    <property name="rat_bootstrap_url2" value="http://uk.maven.org/maven2"/>
-  
-  
-    <macrodef name="rat-download">
-      <attribute name="src"/>
-      <attribute name="dest"/>
-    <sequential>
-      <mkdir dir="@{dest}"/>
-      <echo message="installing rat ${rat.bootstrap.version} to ${rat_install_path}"/>
-      <get src="@{src}/org/apache/rat/apache-rat/${rat.bootstrap.version}/apache-rat-${rat.bootstrap.version}.jar"
-           dest="@{dest}/apache-rat-${rat.bootstrap.version}.jar" usetimestamp="true" ignoreerrors="true"/>
-    </sequential>
-    </macrodef>
-  
-    <target name="rat-bootstrap" description="Download and install rat in the users ant lib dir" depends="rat-bootstrap1,rat-bootstrap2,rat-checksum"/>
-
-    <!-- try to download from repo1.maven.org -->
-    <target name="rat-bootstrap1">
-      <rat-download src="${rat_bootstrap_url1}" dest="${rat_install_path}"/>
-      <available file="${rat_install_path}/apache-rat-${rat.bootstrap.version}.jar" property="rat.bootstrap1.success" />
-    </target> 
-
-    <target name="rat-bootstrap2" unless="rat.bootstrap1.success">
-      <rat-download src="${rat_bootstrap_url2}" dest="${rat_install_path}"/>
+    <target name="clean">
+        <delete dir="build"/>
+        <delete dir="tmp"/>
     </target>
 
-    <target name="rat-checksum">
-      <checksum file="${rat_install_path}/apache-rat-${rat.bootstrap.version}.jar"
-              property="${rat_checksum_sha1}"
-              algorithm="SHA"
-              verifyproperty="rat.checksum.success"/>
-      <fail message="Checksum mismatch for apache-rat-${rat.bootstrap.version}.jar. Please download this file manually">
-        <condition>
-          <isfalse value="${rat.checksum.success}"/>
-        </condition>
-      </fail>
+    <target name="checkout-source-via-svn">
+        <mkdir dir="${root-dir}"/>
+        <exec dir="${root-dir}" executable="svn" failifexecutionfails="true" failonerror="true">
+              <arg value="checkout" />
+              <arg value="${svn-url}" />
+              <arg value="${dir-name}" />
+        </exec>
+    </target>
+
+    <target name="checkout-forrest">
+        <mkdir dir="build"/>
+        <antcall target="checkout-source-via-svn">
+            <param name="root-dir" value="build"/>
+            <param name="svn-url" value="http://svn.apache.org/repos/asf/forrest/tags/forrest_09_release"/>
+            <param name="dir-name" value="forrest"/>
+        </antcall>
+    </target>
+
+    <target name="build-forrest" depends="checkout-forrest">
+        <exec osfamily="windows" dir="build/forrest/main" executable="cmd" failifexecutionfails="true" failonerror="true">
+            <arg value="/c"/>
+            <arg value="build.bat"/>
+        </exec>
+        <exec osfamily="unix" dir="build/forrest/main" executable="./build.sh" failifexecutionfails="true" failonerror="true">
+        </exec>
+    </target>
+
+    <target name="build-via-ant">
+        <property name="forrest.path" location="build/forrest"/>
+        <exec osfamily="windows" dir="${root-dir}" executable="cmd" failifexecutionfails="true" failonerror="true">
+            <arg value="/c"/>
+            <arg value="ant.bat"/>
+            <arg value="${target}" />
+            <env key="FORREST_HOME" value="${forrest.path}"/>  
+        </exec>
+        <exec osfamily="unix" dir="${root-dir}" executable="ant" failifexecutionfails="true" failonerror="true">
+            <arg value="${target}" />
+            <env key="FORREST_HOME" value="${forrest.path}"/>  
+        </exec>
+    </target>
+
+    <target name="setup-release-base-url">
+        <property name="release-base-url" value="http://www.apache.org/dist/manifoldcf"/>
+    </target>
+
+    <target name="setup-archive-base-url">
+        <property name="archive-base-url" value="http://archive.apache.org/dist/manifoldcf"/>
+    </target>
+
+    <target name="transfer-root-files">
+        <mkdir dir="build/site"/>
+        <copy todir="build/site" file=".htaccess"/>
+        <copy todir="build/site" file="doap_ManifoldCF.rdf"/>
+    </target>
+    
+    <target name="download-release" depends="setup-release-base-url">
+        <mkdir dir="build/releases"/>
+        <get src="${release-base-url}/apache-manifoldcf-${release-version}/apache-manifoldcf-${release-version}-bin.zip" dest="build/releases/apache-manifoldcf-${release-version}-bin.zip"/>
+    </target>
+
+    <target name="download-archive" depends="setup-archive-base-url">
+        <mkdir dir="build/releases"/>
+        <get src="${archive-base-url}/apache-manifoldcf-${release-version}/apache-manifoldcf-${release-version}-bin.zip" dest="build/releases/apache-manifoldcf-${release-version}-bin.zip"/>
+    </target>
+
+    <target name="download-legacy-archive" depends="setup-archive-base-url">
+        <mkdir dir="build/releases"/>
+        <get src="${archive-base-url}/apache-manifoldcf-${release-version}-bin.zip" dest="build/releases/apache-manifoldcf-${release-version}-bin.zip"/>
+    </target>
+
+    <target name="install-release" depends="download-release">
+        <mkdir dir="build/publish/release"/>
+        <!-- unpack -->
+        <unzip src="build/releases/apache-manifoldcf-${release-version}-bin.zip" dest="build/releases/apache-manifoldcf-${release-version}-bin"/>
+        <!-- copy -->
+        <mkdir dir="build/site/release"/>
+        <copy todir="build/site/release/release-${release-version}">
+            <fileset dir="build/releases/apache-manifoldcf-${release-version}-bin/apache-manifoldcf-${release-version}/doc"/>
+        </copy>
+    </target>
+
+    <target name="install-legacy-archive" depends="download-legacy-archive">
+        <mkdir dir="build/publish/release"/>
+        <!-- unpack -->
+        <unzip src="build/releases/apache-manifoldcf-${release-version}-bin.zip" dest="build/releases/apache-manifoldcf-${release-version}-bin"/>
+        <!-- copy -->
+        <mkdir dir="build/site/release"/>
+        <copy todir="build/site/release/release-${release-version}">
+            <fileset dir="build/releases/apache-manifoldcf-${release-version}-bin/apache-manifoldcf-${release-version}/doc"/>
+        </copy>
+    </target>
+
+    <target name="install-archive" depends="download-archive">
+        <mkdir dir="build/publish/release"/>
+        <!-- unpack -->
+        <unzip src="build/releases/apache-manifoldcf-${release-version}-bin.zip" dest="build/releases/apache-manifoldcf-${release-version}-bin"/>
+        <!-- copy -->
+        <mkdir dir="build/site/release"/>
+        <copy todir="build/site/release/release-${release-version}">
+            <fileset dir="build/releases/apache-manifoldcf-${release-version}-bin/apache-manifoldcf-${release-version}/doc"/>
+        </copy>
+    </target>
+
+    <target name="checkout-trunk-release">
+        <antcall target="checkout-source-via-svn">
+            <param name="root-dir" value="build/releases"/>
+            <param name="svn-url" value="http://svn.apache.org/repos/asf/manifoldcf/trunk"/>
+            <param name="dir-name" value="trunk"/>
+        </antcall>
+    </target>
+    
+    <target name="build-trunk-release" depends="checkout-trunk-release">
+        <antcall target="build-via-ant">
+            <param name="root-dir" value="build/releases/trunk"/>
+            <param name="target" value="make-core-deps"/>
+        </antcall>
+        <antcall target="build-via-ant">
+            <param name="root-dir" value="build/releases/trunk"/>
+            <param name="target" value="make-deps"/>
+        </antcall>
+        <antcall target="build-via-ant">
+            <param name="root-dir" value="build/releases/trunk"/>
+            <param name="target" value="doc"/>
+        </antcall>
+        <antcall target="build-via-ant">
+            <param name="root-dir" value="build/releases/trunk"/>
+            <param name="target" value="javadoc"/>
+        </antcall>
+    </target>
+    
+    <target name="install-trunk-release" depends="build-trunk-release">
+        <mkdir dir="build/site/release"/>
+        <copy todir="build/site/release/trunk">
+            <fileset dir="build/releases/trunk/dist/doc"/>
+        </copy>
+    </target>
+
+    <target name="get-releases-doc"> <!-- depends="install-trunk-release"-->
+        <antcall target="install-release">
+            <param name="release-version" value="2.9.1"/>
+        </antcall>
+        <antcall target="install-archive">
+            <param name="release-version" value="2.8.1"/>
+        </antcall>
+        <antcall target="install-release">
+            <param name="release-version" value="1.10"/>
+        </antcall>
+    </target>
+    
+    <target name="setup-maven-url">
+        <property name="maven-base-url" value="http://repo1.maven.org/maven2"/>
+    </target>
+    
+    <target name="download-via-maven" depends="setup-maven-url">
+        <get src="${maven-base-url}/${project-path}/${artifact-name}/${artifact-version}/${artifact-name}-${artifact-version}.${artifact-type}" dest="${target}/${artifact-name}.${artifact-type}"/>
     </target>
 
     <target name="downloaded-condition">
-        <!-- Spot check a few of the dependent jars; no point including ALL of them here... -->
-        <available file="lib/hsqldb-${hsqldb.version}.jar" property="hsqldb-found"/>
-        <available file="lib/jetty-server-${jetty.version}.jar" property="jetty-found"/>
-        <available file="lib/httpclient-${httpclient.version}.jar" property="httpclient-found"/>
-        <available file="lib/xercesImpl-${xerces.version}.jar" property="xerces-found"/>
-        <available file="lib/zookeeper-${zookeeper.version}.jar" property="zookeeper-found"/>
+        <available file="lib/commons-logging.jar" property="commons-logging-found"/>
+        <available file="lib/commons-io.jar" property="commons-io-found"/>
+        <available file="lib/fop.jar" property="fop-found"/>
+        <available file="lib/xmlgraphics-commons.jar" property="xmlgraphics-commons-found"/>
         <condition property="downloaded">
             <and>
-                <isset property="hsqldb-found"/>
-                <isset property="jetty-found"/>
-                <isset property="httpclient-found"/>
-                <isset property="xerces-found"/>
-                <isset property="zookeeper-found"/>
+                <isset property="commons-logging-found"/>
+                <isset property="commons-io-found"/>
+                <isset property="fop-found"/>
+                <isset property="xmlgraphics-commons-found"/>
             </and>
         </condition>
     </target>
     
     <target name="downloaded-check" depends="downloaded-condition" unless="downloaded">
-        <echo message="Overlay -lib package, or run 'make-core-deps' target first"/>
+        <echo message="Run 'make-core-deps' target first"/>
     </target>
 
-    
-    <target name="build-site" depends="downloaded-check" if="downloaded">
-      <ant dir="site" target="all"/>
+
+    <target name="get-forrest-root" depends="build-forrest">
+        <!--property environment="env"/>
+        <echo message="${env.FORREST_HOME}"/>
+        <property name="forrest-root" value="${env.FORREST_HOME}"/-->
+        <property name="forrest-root" value="build/forrest"/>
     </target>
     
-    <target name="check-site-built" depends="build-site">
-      <available file="site/build/site" type="dir" property="site-found"/>
-        <condition property="site-exists">
-            <and>
-                <isset property="site-found"/>
-                <isset property="downloaded"/>
-            </and>
-        </condition>
+    <target name="calculate-forrest-condition" depends="get-forrest-root">
+        <available file="${forrest-root}" property="forrestAvailable"/>
     </target>
 
-    <target name="presite-check" depends="check-site-built" unless="site-exists" if="downloaded">
-      <echo message="Site did not build.  Was FORREST_HOME set properly?"/>
+    <target name="forrest-check" depends="calculate-forrest-condition" unless="forrestAvailable">
+        <echo message="Site cannot be built without Apache Forrest installed"/>
     </target>
     
-    <target name="setup-framework" depends="set-version,downloaded-check" if="downloaded"/>
-      
-      <target name="build-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="build"/>
+    <target name="calculate-dejavu-condition">
+        <available file="fonts/dejavu-fonts-ttf-2.37.zip" property="dejavuAvailable"/>
     </target>
 
-    <target name="doc-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="doc"/>
+    <target name="dejavu-check" depends="calculate-dejavu-condition" unless="dejavuAvailable">
+        <echo message="Dejavu fonts cannot be built without dejavu-fonts-ttf-2.37.zip"/>
     </target>
 
-    <target name="build-tests-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="build-tests"/>
+    <target name="calculate-ipa-condition">
+        <available file="fonts/IPAGTTC00303.zip" property="ipaAvailable"/>
     </target>
 
-    <target name="run-tests-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="run-tests"/>
+    <target name="ipa-check" depends="calculate-ipa-condition" unless="ipaAvailable">
+        <echo message="IPA fonts cannot be built without IPAGTTC00303.zip"/>
     </target>
 
-    <target name="run-tests-postgresql-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="run-tests-postgresql"/>
-    </target>
-
-    <target name="run-tests-mysql-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="run-tests-mysql"/>
-    </target>
-
-    <target name="run-tests-HSQLDB-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="run-tests-HSQLDB"/>
-    </target>
-
-    <target name="run-tests-HSQLDBext-framework" depends="setup-framework" if="downloaded">
-        <ant dir="framework" target="run-tests-HSQLDBext"/>
-    </target>
-
-    <target name="deliver-site-doc" depends="presite-check" if="site-exists">
-          <mkdir dir="dist/doc"/>
-          <copy todir="dist/doc">
-              <fileset dir="site/build/site">
-                <exclude name="**/broken-links.xml"/>
-              </fileset>
-          </copy>
-          <copy todir="dist/doc">
-              <fileset dir="site">
-                  <include name=".htaccess"/>
-              </fileset>
-          </copy>
-    </target>
-
-    <target name="preclean-registry">
-        <mkdir dir="dist"/>
-        <delete file="dist/connectors.xml"/>
-        <delete file="dist/connectors-proprietary.xml"/>
-    </target>
-
-    <target name="preclean-for-delivery">
-        <mkdir dir="dist"/>
-        <mkdir dir="dist/example"/>
-        <mkdir dir="dist/example-proprietary"/>
-        <mkdir dir="dist/multiprocess-file-example"/>
-        <mkdir dir="dist/multiprocess-zk-example"/>
-        <mkdir dir="dist/multiprocess-file-example-proprietary"/>
-        <mkdir dir="dist/multiprocess-zk-example-proprietary"/>
-        <delete file="dist/example/properties.xml"/>
-        <delete file="dist/example-proprietary/properties.xml"/>
-        <delete file="dist/multiprocess-file-example/properties.xml"/>
-        <delete file="dist/multiprocess-file-example-proprietary/properties.xml"/>
-        <delete file="dist/multiprocess-zk-example/properties.xml"/>
-        <delete file="dist/multiprocess-zk-example-proprietary/properties.xml"/>
-        <delete file="dist/NOTICE.txt"/>
-        <delete file="dist/LICENSE.txt"/>
-    </target>
-    
-    <target name="deliver-framework" depends="preclean-for-delivery,build-framework" if="downloaded">
-        <mkdir dir="dist"/>
-        <copy todir="dist">
-            <fileset dir="framework/dist">
-                <include name="connector-build.xml"/>
-            </fileset>
-        </copy>
-        <mkdir dir="dist/web"/>
-        <copy todir="dist/web">
-            <fileset dir="framework/dist/web"/>
-        </copy>
-        <mkdir dir="dist/web-proprietary"/>
-        <copy todir="dist/web-proprietary">
-            <fileset dir="framework/dist/web-proprietary"/>
-        </copy>
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="framework/dist/lib"/>
-        </copy>
-        <mkdir dir="dist/test-lib"/>
-        <copy todir="dist/test-lib">
-            <fileset dir="framework/dist/test-lib"/>
-        </copy>
-        <mkdir dir="dist/lib-proprietary"/>
-        <copy todir="dist/lib-proprietary">
-            <fileset dir="framework/dist/lib-proprietary"/>
-        </copy>
-        <mkdir dir="dist/file-resources"/>
-        <copy todir="dist/file-resources">
-            <fileset dir="framework/dist/file-resources"/>
-        </copy>
-        <mkdir dir="dist/multiprocess-file-example"/>
-        <copy todir="dist/multiprocess-file-example">
-            <fileset dir="framework/dist/multiprocess-file-example"/>
-        </copy>
-        <mkdir dir="dist/multiprocess-file-example-proprietary"/>
-        <copy todir="dist/multiprocess-file-example-proprietary">
-            <fileset dir="framework/dist/multiprocess-file-example-proprietary"/>
-        </copy>
-        <mkdir dir="dist/multiprocess-zk-example"/>
-        <copy todir="dist/multiprocess-zk-example">
-            <fileset dir="framework/dist/multiprocess-zk-example"/>
-        </copy>
-        <mkdir dir="dist/multiprocess-zk-example-proprietary"/>
-        <copy todir="dist/multiprocess-zk-example-proprietary">
-            <fileset dir="framework/dist/multiprocess-zk-example-proprietary"/>
-        </copy>
-        <mkdir dir="dist/example"/>
-        <copy todir="dist/example">
-            <fileset dir="framework/dist/example"/>
-        </copy>
-        <mkdir dir="dist/example-proprietary"/>
-        <copy todir="dist/example-proprietary">
-            <fileset dir="framework/dist/example-proprietary"/>
-        </copy>
-        <mkdir dir="dist/script-engine"/>
-        <copy todir="dist/script-engine">
-            <fileset dir="framework/dist/script-engine"/>
-        </copy>
-        <mkdir dir="dist/obfuscation-utility"/>
-        <copy todir="dist/obfuscation-utility">
-            <fileset dir="framework/dist/obfuscation-utility"/>
-        </copy>
-        <mkdir dir="dist"/>
-        <copy todir="dist">
-            <fileset dir="framework/dist">
-                <include name="connectors.xml"/>
-                <include name="connectors-proprietary.xml"/>
-            </fileset>
-        </copy>
-        <mkdir dir="dist/connector-lib"/>
-        <copy todir="dist/connector-lib">
-            <fileset dir="framework/dist/connector-lib"/>
-        </copy>
-        <mkdir dir="dist/connector-common-lib"/>
-        <copy todir="dist/connector-common-lib">
-            <fileset dir="framework/dist/connector-common-lib"/>
-        </copy>
-        <mkdir dir="dist/connector-lib-proprietary"/>
-        <copy todir="dist/connector-lib-proprietary">
-            <fileset dir="framework/dist/connector-lib-proprietary"/>
-        </copy>
-        <chmod dir="dist/script-engine" perm="a+x" includes="**/*.sh"/>
-        <chmod dir="dist/example" perm="a+x" includes="**/*.sh"/>
-        <chmod dir="dist/example-proprietary" perm="a+x" includes="**/*.sh"/>
-        <chmod dir="dist/multiprocess-file-example" perm="a+x" includes="**/*.sh"/>
-        <chmod dir="dist/multiprocess-file-example-proprietary" perm="a+x" includes="**/*.sh"/>
-        <chmod dir="dist/multiprocess-zk-example" perm="a+x" includes="**/*.sh"/>
-        <chmod dir="dist/multiprocess-zk-example-proprietary" perm="a+x" includes="**/*.sh"/>
-        <copy todir="dist">
-            <fileset dir="dist-license" includes="*.txt"/>
-        </copy>
-    </target>
-    
-    <target name="deliver-framework-doc" depends="doc-framework" if="downloaded">
-        <mkdir dir="dist/doc/api/framework"/>
-        <copy todir="dist/doc/api/framework">
-            <fileset dir="framework/dist/doc"/>
-        </copy>
-    </target>
-
-    <!-- Connector crawler.  This iterates over all connector makefiles, invoking the specified target of each. -->
-    <macrodef name="connectors-crawl">
-        <attribute name="target" default=""/>
-        <attribute name="failonerror" default="true"/>
-        <sequential>
-            <subant target="@{target}" failonerror="@{failonerror}" inheritall="false">
-                <!-- propertyset refid="uptodate.and.compiled.properties"/ -->
-                <fileset dir="connectors" includes="*/build.xml" excludes="build/**,build-stubs/**,connector/**,dist/**,test-output*/**"/>
-            </subant>
-        </sequential>
-    </macrodef>
-
-    <!-- Generic connector targets -->
-    
-    <target name="download-connectors-dependencies" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="download-dependencies"/>
-    </target>
-
-    <target name="cleanup-connectors-dependencies" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="download-cleanup"/>
-    </target>
-
-    <target name="deliver-connectors" depends="preclean-registry,deliver-framework" if="downloaded">
-        <connectors-crawl target="deliver-connector"/>
-    </target>
-    
-    <target name="deliver-connectors-doc" depends="deliver-connectors,deliver-framework-doc" if="downloaded">
-        <connectors-crawl target="deliver-connector-doc"/>
-    </target>
-
-    <target name="run-connectors-tests" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-tests"/>
-    </target>
-
-    <target name="run-connectors-tests-HSQLDB" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-tests-HSQLDB"/>
-    </target>
-
-    <target name="run-connectors-tests-HSQLDBext" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-tests-HSQLDBext"/>
-    </target>
-
-    <target name="run-connectors-tests-postgresql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-tests-postgresql"/>
-    </target>
-
-    <target name="run-connectors-tests-mysql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-tests-mysql"/>
-    </target>
-
-    <target name="run-connectors-IT-HSQLDB" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-IT-HSQLDB"/>
-    </target>
-
-    <target name="run-connectors-IT-HSQLDBext" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-IT-HSQLDBext"/>
-    </target>
-
-    <target name="run-connectors-IT-postgresql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-IT-postgresql"/>
-    </target>
-
-    <target name="run-connectors-IT-mysql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-IT-mysql"/>
-    </target>
-
-    <target name="run-connectors-UI-HSQLDB" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-UI-HSQLDB"/>
-    </target>
-
-    <target name="run-connectors-UI-HSQLDBext" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-UI-HSQLDBext"/>
-    </target>
-
-    <target name="run-connectors-UI-postgresql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-UI-postgresql"/>
-    </target>
-
-    <target name="run-connectors-UI-mysql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-UI-mysql"/>
-    </target>
-
-    <target name="run-connectors-LT-HSQLDB" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-LT-HSQLDB"/>
-    </target>
-
-    <target name="run-connectors-LT-HSQLDBext" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-LT-HSQLDBext"/>
-    </target>
-
-    <target name="run-connectors-LT-postgresql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-LT-postgresql"/>
-    </target>
-
-    <target name="run-connectors-LT-mysql" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="run-LT-mysql"/>
-    </target>
-
-    <!-- General connectors utility targets -->
-    
-    <target name="clean-framework">
-        <ant dir="framework" target="clean"/>
-    </target>
-    
-    <target name="clean-connectors" depends="deliver-framework" if="downloaded">
-        <connectors-crawl target="clean"/>
-    </target>
-    
-    <!-- General targets -->
-    <target name="clean" depends="clean-framework,clean-connectors">
-        <delete>
-          <fileset dir="." includes="apache-manifoldcf-*.zip"/>
-          <fileset dir="." includes="apache-manifoldcf-*.tar.gz"/>
-        </delete>
-        <delete dir="build"/>
-        <delete dir="dist"/>
-        <ant dir="site" target="clean"/>
-        <ant dir="framework" target="clean"/>
-    </target>
-
-    <target name="cleanup-afterbuild" depends="clean-connectors">
-        <delete dir="build"/>
-        <ant dir="site" target="clean"/>
-        <ant dir="framework" target="clean"/>
-    </target>
-
-    <target name="build" depends="deliver-connectors"/>
-    <target name="tmpclean" depends="cleanup-afterbuild"/>
-    <target name="buildcln" depends="build,tmpclean"/>
-    <target name="javadoc" depends="deliver-connectors-doc"/>
-    <target name="doc" depends="deliver-site-doc"/>
-    
-    <target name="set-version">
-      <property name="release-version" value="2.10-dev"/>
-    </target>
-    
-    <target name="create-source-zip" depends="set-version">
-      <zip destfile="apache-manifoldcf-${release-version}-src.zip" update="false">
-        <zipfileset dir="." prefix="apache-manifoldcf-${release-version}">
-          <exclude name="lib/"/>
-          <exclude name="connectors/*/lib/"/>
-          <exclude name="framework/lib/"/>
-          <exclude name="**/build/"/>
-          <exclude name="**/tmp/"/>
-          <exclude name="site/fonts/"/>
-          <exclude name="dist/"/>
-          <exclude name="connectors/*/dist/"/>
-          <exclude name="framework/dist/"/>
-          <exclude name="**/target/"/>
-          <exclude name="**/test-materials/*.jar"/>
-          <exclude name="**/test-materials/*.war"/>
-          <exclude name="**/test-materials/*.wsdl"/>
-          <exclude name="**/test-materials/*.xsd"/>
-          <exclude name="**/test-materials-proprietary/*.jar"/>
-          <exclude name="**/test-materials-proprietary/*.war"/>
-          <exclude name="**/test-materials-proprietary/*.wsdl"/>
-          <exclude name="**/test-materials-proprietary/*.xsd"/>
-          <exclude name="**/test-output/"/>
-          <exclude name="**/test-postgresql-output/"/>
-          <exclude name="**/test-HSQLDB-output/"/>
-          <exclude name="**/test-HSQLDBext-output/"/>
-          <exclude name="**/test-mysql-output/"/>
-          <exclude name="**/lib-proprietary/*.jar"/>
-          <exclude name="**/lib-proprietary/*.war"/>
-          <exclude name="**/lib-proprietary/*.wsdl"/>
-          <exclude name="**/lib-proprietary/*.xsd"/>
-          <exclude name="connectors/elasticsearch/test-materials-proprietary/elasticsearch-1.0.1/"/>
-          <exclude name="legacy-*/"/>
-          <exclude name="apache-manifoldcf-*/"/>        
-        </zipfileset>
-      </zip>
-    </target>
-
-    <target name="create-lib-zip" depends="set-version">
-      <zip destfile="apache-manifoldcf-${release-version}-lib.zip" update="false">
-        <zipfileset dir="lib" prefix="apache-manifoldcf-${release-version}"/>
-      </zip>
-    </target>
-      
-    <target name="create-source-tar" depends="set-version">  
-      <tar destfile="apache-manifoldcf-${release-version}-src.tar.gz" compression="gzip" longfile="gnu">        
-        <tarfileset dir="." prefix="apache-manifoldcf-${release-version}">
-          <exclude name="lib/"/>
-          <exclude name="connectors/*/lib/"/>
-          <exclude name="framework/lib/"/>
-          <exclude name="**/build/"/>
-          <exclude name="**/tmp/"/>
-          <exclude name="site/fonts/"/>
-          <exclude name="dist/"/>
-          <exclude name="connectors/*/dist/"/>
-          <exclude name="framework/dist/"/>
-          <exclude name="**/target/"/>
-          <exclude name="**/test-output/"/>
-          <exclude name="**/test-postgresql-output/"/>
-          <exclude name="**/test-HSQLDB-output/"/>
-          <exclude name="**/test-HSQLDBext-output/"/>
-          <exclude name="**/test-mysql-output/"/>
-          <exclude name="**/test-materials/*.jar"/>
-          <exclude name="**/test-materials/*.war"/>
-          <exclude name="**/test-materials/*.wsdl"/>
-          <exclude name="**/test-materials/*.xsd"/>
-          <exclude name="**/test-materials-proprietary/*.jar"/>
-          <exclude name="**/test-materials-proprietary/*.war"/>
-          <exclude name="**/test-materials-proprietary/*.wsdl"/>
-          <exclude name="**/test-materials-proprietary/*.xsd"/>
-          <exclude name="**/lib-proprietary/*.jar"/>
-          <exclude name="**/lib-proprietary/*.war"/>
-          <exclude name="**/lib-proprietary/*.wsdl"/>
-          <exclude name="**/lib-proprietary/*.xsd"/>
-          <exclude name="connectors/elasticsearch/test-materials-proprietary/elasticsearch-1.0.1/"/>
-          <exclude name="legacy-*/"/>
-          <exclude name="apache-manifoldcf-*/"/>
-        </tarfileset>
-      </tar>
-    </target>
-
-    <target name="create-lib-tar" depends="set-version">
-      <tar destfile="apache-manifoldcf-${release-version}-lib.tar.gz" compression="gzip" longfile="gnu">
-        <tarfileset dir="lib" prefix="apache-manifoldcf-${release-version}"/>
-      </tar>
-    </target>
-
-    <target name="create-bin-zip" depends="build,doc,javadoc,set-version">
-      <zip destfile="apache-manifoldcf-${release-version}-bin.zip" update="false">
-        <zipfileset dir="dist" prefix="apache-manifoldcf-${release-version}">
-          <exclude name="connector-lib-proprietary/*.jar"/>
-          <exclude name="**/lib-proprietary/*.jar"/>
-          <exclude name="lib-proprietary/*.jar"/>
-          <exclude name="connector-lib-proprietary/*-PLACEHOLDER.txt"/>
-          <exclude name="connectors-proprietary.xml"/>
-          <exclude name="example-proprietary/"/>
-          <exclude name="multiprocess-file-example-proprietary/"/>
-          <exclude name="multiprocess-zk-example-proprietary/"/>
-          <exclude name="web-proprietary/"/>
-        </zipfileset>
-      </zip>
-    </target>
-    
-    <target name="create-bin-tar" depends="build,doc,javadoc,set-version">
-      <tar destfile="apache-manifoldcf-${release-version}-bin.tar.gz" compression="gzip" longfile="gnu">
-        <tarfileset dir="dist" prefix="apache-manifoldcf-${release-version}">
-          <exclude name="connector-lib-proprietary/*.jar"/>
-          <exclude name="**/lib-proprietary/*.jar"/>
-          <exclude name="lib-proprietary/*.jar"/>
-          <exclude name="connector-lib-proprietary/*-PLACEHOLDER.txt"/>
-          <exclude name="connectors-proprietary.xml"/>
-          <exclude name="example-proprietary/"/>
-          <exclude name="multiprocess-file-example-proprietary/"/>
-          <exclude name="multiprocess-zk-example-proprietary/"/>
-          <exclude name="web-proprietary/"/>
-        </tarfileset>
-      </tar>
-    </target>
-
-    <target name="image" depends="create-source-zip,create-source-tar,create-lib-zip,create-lib-tar,create-bin-zip,create-bin-tar"/>
-    
-    <target name="test-pg" depends="run-tests-postgresql-framework,run-connectors-tests-postgresql,run-connectors-IT-postgresql"/>
-
-    <target name="test-my" depends="run-tests-mysql-framework,run-connectors-tests-mysql,run-connectors-IT-mysql"/>
-
-    <target name="test-hs" depends="run-tests-HSQLDB-framework,run-tests-HSQLDBext-framework,run-connectors-tests-HSQLDB,run-connectors-tests-HSQLDBext,run-connectors-IT-HSQLDB,run-connectors-IT-HSQLDBext"/>
-
-    <target name="load-pg" depends="run-connectors-LT-postgresql"/>
-
-    <target name="load-my" depends="run-connectors-LT-mysql"/>
-
-    <target name="load-hs" depends="run-connectors-LT-HSQLDB,run-connectors-LT-HSQLDBext"/>
-
-    <target name="test" depends="run-tests-framework,run-connectors-tests,test-hs"/>
-
-    <target name="ldtest" depends="run-connectors-LT-HSQLDB"/>
-
-    <target name="uitest" depends="run-connectors-UI-HSQLDB"/>
-    
-    <target name="all" depends="build,javadoc,doc,image,test-hs"/>
-
-    <target name="help">
-      <echo level="info">
-ManifoldCF build file.  Use this file to build ManifoldCF, generate
-javadocs, generate site docs, run tests, or build distributables.
-
-Useful targets are:
-
-clean    - Clean the build and distribution areas
-build    - Build executable code, jars, processes, and examples,
-           under the 'dist' directory
-buildcln - Same as build, but clean up temp files
-javadoc  - Create the javadocs, under the 'dist/doc' directory
-test     - Compile and run all local tests (HSQLDB)
-uitest   - Compile and run all UI tests (needs Python)
-ldtest   - Compile and run all local load tests (HSQLDB)
-doc      - Build html site, under the 'dist/doc' directory
-           (requires Apache Forrest)
-precommit- Run this target before committing, to check for policy
-           violations
-tmpclean - Clean up temporary files used during build and testing
-image    - Build release image, under the '.' directory (requires
-           Apache Forrest)
-
-test-pg  - Compile and run postgresql-based tests (needs
-           Postgresql)
-test-my  - Compile and run MySQL-based tests (needs MySQL)
-test-hs  - Compile and run HSQLDB-based tests
-load-pg  - Compile and run postgresql-based load tests (needs
-           Postgresql)
-load-my  - Compile and run MySQL-based load tests (needs MySQL)
-load-hs  - Compile and run HSQLDB-based load tests
-
-all      - Build code and docs, and test (requires Apache Forrest)
-
-run-script-interpreter - Run the ManifoldCF script interpreter
-
-make-deps              - Fetch non-redistributable dependencies
-clean-deps             - Clean up non-redistributable binaries
-
-make-core-deps         - Download and build core dependencies
-clean-core-deps        - Clean up core dependencies
-
-Use Apache Forrest version forrest-0.9-dev or higher.
-      </echo>
-    </target>
-
-    <target name="-taskdef">
-      <typedef resource="org/apache/rat/anttasks/antlib.xml" uri="antlib:rat.anttasks">
-        <classpath>
-          <fileset dir="." includes="rat*.jar"/>
-        </classpath>
-      </typedef>
-    </target>
-    <target name="rat-sources" depends="-taskdef"
-      description="runs the tasks over src/java excluding the license directory">
-      <rat:report xmlns:rat="antlib:org.apache.rat.anttasks">
-        <fileset dir="mod-authz-annotate/">
-        </fileset>
-        <fileset dir="connectors/">
-          <!--exclude name="**/*"/ -->
-          <exclude name="elasticsearch/test-materials/elasticsearch-1.0.1/"/>
-          <exclude name="kafka/test-materials/*.jar"/>
-          <exclude name="cmis/test-materials/*.war"/>
-          <exclude name="alfresco/lib-proprietary/*.jar"/>
-          <exclude name="alfresco-webscript/test-materials-proprietary/*.war"/>
-          <exclude name="alfresco-webscript/connector/src/test/resources/*.json"/>
-          <exclude name="**/build/"/>
-          <exclude name="**/dist/"/>
-          <exclude name="**/test-output/"/>
-          <exclude name="**/test-postgresql-output/"/>
-          <exclude name="**/test-HSQLDB-output/"/>
-          <exclude name="**/test-HSQLDBext-output/"/>
-          <exclude name="**/test-mysql-output/"/>
-          <exclude name="filenet/lib-proprietary/*.jar"/>
-          <exclude name="documentum/lib-proprietary/*.jar"/>
-          <exclude name="jcifs/lib-proprietary/*.jar"/>
-          <exclude name="jcifs/lib-proprietary/*.diffs"/>
-          <exclude name="livelink/lib-proprietary/*.jar"/>
-          <exclude name="meridio/lib-proprietary/*.wsdl"/>
-          <exclude name="meridio/lib-proprietary/*.xsd"/>
-          <exclude name="sharepoint/lib-proprietary/*.wsdl"/>
-          <exclude name="**/surefire-reports/"/>
-          <exclude name="**/target/"/>
-        </fileset>
-        <fileset dir="framework/">
-          <exclude name="**/build/"/>
-          <exclude name="**/dist/"/>
-          <exclude name="**/test-output/"/>
-          <exclude name="**/test-postgresql-output/"/>
-          <exclude name="**/test-HSQLDB-output/"/>
-          <exclude name="**/test-HSQLDBext-output/"/>
-          <exclude name="**/test-mysql-output/"/>
-          <exclude name="**/web-generated.xml"/>
-          <exclude name="**/surefire-reports/"/>
-          <exclude name="**/target/"/>
-          <exclude name="lib-proprietary/*.jar"/>
-          <exclude name="scripts/*.env.win"/>
-          <exclude name="scripts/*.env.unix"/>
-          <exclude name="scripts-hsqldb/*.env.win"/>
-          <exclude name="scripts-hsqldb/*.env.unix"/>
-          <exclude name="scripts-zookeeper/*.env.win"/>
-          <exclude name="scripts-zookeeper/*.env.unix"/>
-          <exclude name="scripts-start/*.env.win"/>
-          <exclude name="scripts-start/*.env.unix"/>
-          <exclude name="obfuscate-scripts/*.env.win"/>
-          <exclude name="obfuscate-scripts/*.env.unix"/>
-          <exclude name="scripts-jetty/*.env.win"/>
-          <exclude name="scripts-jetty/*.env.unix"/>
-          <exclude name="scripts-combined/*.env.win"/>
-          <exclude name="scripts-combined/*.env.unix"/>
-          <exclude name="engine-scripts/*.env.win"/>
-          <exclude name="engine-scripts/*.env.unix"/>
-          <exclude name="crawler-ui/**/*.map"/>
-          <exclude name="crawler-ui/**/*.json"/>
-          <exclude name="crawler-ui/**/*.svg"/>
-          <exclude name="crawler-ui/**/.csslintrc"/>
-        </fileset>
-        <fileset dir="site/">
-          <exclude name="fonts/"/>
-          <exclude name="**/build/"/>
-          <exclude name="**/tmp/"/>
-          <exclude name="src/documentation/skins/common/xslt/html/split.xsl"/>
-          <exclude name="src/documentation/skins/lucene/note.txt"/>
-        </fileset>
-        <fileset dir="test-materials/">
-          <exclude name="**/build/"/>
-          <exclude name="**/dist/"/>
-          <exclude name="**/surefire-reports/"/>
-          <exclude name="**/target/"/>
-        </fileset>
-      </rat:report>
-    </target>
-
-    <target name="run-script-interpreter" depends="deliver-framework">
-        <java classname="org.apache.manifoldcf.scriptengine.ScriptParser" fork="true" dir="dist/script-engine" maxmemory="128M">
-          <classpath>
-            <fileset dir="dist/script-engine/lib">
-              <include name="*.jar"/>
-            </fileset>
-          </classpath>
-        </java>
-    </target>
-
-    <target name="download-less-compiler" depends="download-protobuf">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="com/github/sommeri"/>
-            <param name="artifact-version" value="1.17.2"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="less4j"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/antlr"/>
-            <param name="artifact-version" value="3.5.2"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="antlr-runtime"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="commons-beanutils"/>
-            <param name="artifact-version" value="1.8.3"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="commons-beanutils"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="setup-nuxeo-url">
-        <property name="nuxeo-base-url" value="http://maven.nuxeo.com/nexus/content/repositories/public-releases"/>
-    </target>
-    
-    <target name="download-via-nuxeo" depends="setup-nuxeo-url">
-        <get src="${nuxeo-base-url}/${project-path}/${artifact-name}/${artifact-version}/${artifact-name}-${artifact-version}.${artifact-type}" dest="${target}/${artifact-name}-${artifact-version}.${artifact-type}"/>
-    </target>
-
-    <target name="download-nuxeo-client">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-nuxeo">
-            <param name="project-path" value="org/nuxeo/client"/>
-            <param name="artifact-version" value="2.5"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="nuxeo-java-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="com/squareup/retrofit2"/>
-            <param name="artifact-version" value="2.0.2"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="retrofit"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="com/squareup/okhttp3"/>
-            <param name="artifact-version" value="3.0.0-RC1"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="okhttp"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="com/squareup/okio"/>
-            <param name="artifact-version" value="1.6.0"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="okio"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-resteasy">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/jboss/resteasy"/>
-            <param name="artifact-version" value="${resteasy.client.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="resteasy-jaxrs"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/jboss/resteasy"/>
-            <param name="artifact-version" value="${resteasy.client.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="resteasy-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-        
-    <target name="download-jsoup">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/jsoup"/>
-            <param name="artifact-version" value="${jsoup.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="jsoup"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-alfresco-webscript-plugin">
-        <mkdir dir="lib/alfresco-webscript"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib/alfresco-webscript"/>
-            <param name="project-path" value="com/github/maoo/indexer"/>
-            <param name="artifact-version" value="${alfresco-indexer.version}"/>
-            <param name="artifact-name" value="alfresco-indexer-webscripts"/>
-            <param name="artifact-type" value="amp"/>
-        </antcall>
-    </target>
-    
-    <target name="download-gson">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="com/google/code/gson"/>
-            <param name="artifact-version" value="${gson.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="gson"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-alfresco-indexer-client" depends="download-guava,download-gson">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="com/github/maoo/indexer"/>
-            <param name="artifact-version" value="${alfresco-indexer.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="alfresco-indexer-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-      </target>
-
-    <target name="download-mongo-java-driver">
-        <mkdir dir="lib"/>
-
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/mongodb"/>
-            <param name="artifact-version" value="${mongodb.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="mongo-java-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-httpcomponents">
-        <mkdir dir="lib"/>
-
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/apache/httpcomponents"/>
-            <param name="artifact-version" value="${httpcore.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="httpcore"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/apache/httpcomponents"/>
-            <param name="artifact-version" value="${httpclient.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="httpclient"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/httpcomponents"/>
-            <param name="artifact-version" value="${httpmime.version}"/>
-            <param name="artifact-name" value="httpmime"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-hsqldb">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/hsqldb"/>
-            <param name="artifact-version" value="${hsqldb.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="hsqldb"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-postgresql">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="org/postgresql"/>
-            <param name="artifact-version" value="${postgresql.version}"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="postgresql"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-aws-sdk">
-        <mkdir dir="lib"/>
-        <property name="aws-sdk-package" value="com/amazonaws"/>
-        <!-- antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-directconnect"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-logs"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-elasticbeanstalk"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-iam"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-autoscaling"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-emr"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cognitoidentity"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cloudwatchmetrics"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cloudwatch"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-dynamodb"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-ses"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-simpleworkflow"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-swf-libraries"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-importexport"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-support"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-elasticache"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cloudfront"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-opsworks"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-storagegateway"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-kinesis"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-redshift"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cloudsearch"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cloudformation"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-rds"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-sts"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-route53"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-glacier"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-sqs"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-sns"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cloudtrail"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-ec2"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-cognitosync"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-simpledb"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-datapipeline"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-elasticloadbalancing"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-elastictranscoder"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall-->
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-s3"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${aws-sdk-package}"/><param name="artifact-version" value="${aws-sdk.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="aws-java-sdk-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-joda-time">
+    <target name="download-fop">
         <mkdir dir="lib"/>
         <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="joda-time"/>
-            <param name="artifact-version" value="${joda-time.version}"/>
-            <param name="artifact-name" value="joda-time"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-axis">
-        <mkdir dir="lib"/>
-        <property name="axis-package" value="org/apache/axis"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${axis-package}"/><param name="artifact-version" value="${axis.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="axis"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${axis-package}"/><param name="artifact-version" value="${axis.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="axis-jaxrpc"/>
+            <param name="project-path" value="org/apache/xmlgraphics"/>
+            <param name="artifact-version" value="1.0"/>
+            <param name="artifact-name" value="fop"/>
             <param name="artifact-type" value="jar"/>
         </antcall>
     </target>
 
-    <target name="download-saaj">
+    <target name="download-xmlgraphics-commons">
         <mkdir dir="lib"/>
         <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/xml/soap"/>
-            <param name="artifact-version" value="${saaj-api.version}"/>
-            <param name="artifact-name" value="saaj-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/sun/xml/messaging/saaj"/>
-            <param name="artifact-version" value="${saaj-impl.version}"/>
-            <param name="artifact-name" value="saaj-impl"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-castor">
-        <mkdir dir="lib"/>
-
-        <!-- biblio is very slow -->
-        <!-- get src="http://mirrors.ibiblio.org/pub/mirrors/maven/castor/1.0.5/castor-1.0.5.jar" dest="lib/castor.jar"/ -->
-        <!-- get src="http://mirrors.ibiblio.org/pub/mirrors/maven/castor/1.0.5/castor-1.0.5-xml.jar" dest="lib/castor-xml.jar"/ -->
-        <!-- get src="http://mirrors.ibiblio.org/pub/mirrors/maven/castor/1.0.5/castor-1.0.5-commons.jar" dest="lib/castor-commons.jar"/ -->
-        <property name="castor-path" value="org/codehaus/castor"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${castor-path}"/><param name="artifact-version" value="${castor.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="castor"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <!-- antcall target="download-via-maven"><param name="project-path" value="${castor-path}"/><param name="artifact-version" value="${castor-version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="castor-xml"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${castor-path}"/><param name="artifact-version" value="${castor-version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="castor-commons"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall -->
-    </target>
-  
-    <target name="download-wsdl4j">
-        <mkdir dir="lib"/>
-        <property name="wsdl4j-package" value="wsdl4j"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${wsdl4j-package}"/><param name="artifact-version" value="${wsdl4j.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="wsdl4j"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-commons">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-codec"/>
-            <param name="artifact-version" value="${commons-codec.version}"/>
-            <param name="artifact-name" value="commons-codec"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-collections"/>
-            <param name="artifact-version" value="${commons-collections.version}"/>
-            <param name="artifact-name" value="commons-collections"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-version" value="${commons-collections4.version}"/>
-            <param name="artifact-name" value="commons-collections4"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-discovery"/>
-            <param name="artifact-version" value="${commons-discovery.version}"/>
-            <param name="artifact-name" value="commons-discovery"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-el"/>
-            <param name="artifact-version" value="${commons-el.version}"/>
-            <param name="artifact-name" value="commons-el"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-fileupload"/>
-            <param name="artifact-version" value="${commons-fileupload.version}"/>
-            <param name="artifact-name" value="commons-fileupload"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-io"/>
-            <param name="artifact-version" value="${commons-io.version}"/>
-            <param name="artifact-name" value="commons-io"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-lang"/>
-            <param name="artifact-version" value="${commons-lang.version}"/>
-            <param name="artifact-name" value="commons-lang"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-logging"/>
-            <param name="artifact-version" value="${commons-logging.version}"/>
-            <param name="artifact-name" value="commons-logging"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-configuration"/>
-            <param name="artifact-version" value="${commons-configuration.version}"/>
-            <param name="artifact-name" value="commons-configuration"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="commons-cli"/>
-            <param name="artifact-version" value="${commons-cli.version}"/>
-            <param name="artifact-name" value="commons-cli"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-  
-    <target name="download-slf4j">
-        <mkdir dir="lib"/>
-        <property name="slf4j-package" value="org/slf4j"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${slf4j-package}"/><param name="artifact-version" value="${slf4j.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="slf4j-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${slf4j-package}"/><param name="artifact-version" value="${slf4j.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="slf4j-simple"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${slf4j-package}"/><param name="artifact-version" value="${slf4j.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jcl-over-slf4j"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${slf4j-package}"/><param name="artifact-version" value="${slf4j.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jul-to-slf4j"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-jetty">
-        <mkdir dir="lib"/>
-        <property name="jetty-package" value="org/eclipse/jetty"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-jndi"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-server"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-webapp"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-servlet"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-plus"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-util"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-http"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-io"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-security"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-continuation"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}"/><param name="artifact-version" value="${jetty.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-xml"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}/toolchain"/><param name="artifact-version" value="${jetty-jsp-jdt.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-jsp-jdt"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${jetty-package}/toolchain"/><param name="artifact-version" value="${jetty-schemas.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jetty-schemas"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-xerces">
-        <mkdir dir="lib"/>
-        <property name="xerces-package" value="xerces"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${xerces-package}"/><param name="artifact-version" value="${xerces.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="xercesImpl"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-xalan">
-        <mkdir dir="lib"/>
-        <property name="xalan-package" value="xalan"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${xalan-package}"/><param name="artifact-version" value="${xalan.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="xalan"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${xalan-package}"/><param name="artifact-version" value="${xalan.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="serializer"/>
+            <param name="project-path" value="org/apache/xmlgraphics"/>
+            <param name="artifact-version" value="1.4"/>
+            <param name="artifact-name" value="xmlgraphics-commons"/>
             <param name="artifact-type" value="jar"/>
         </antcall>
     </target>
 
-    
-    <target name="download-poi">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/poi"/>
-            <param name="artifact-version" value="${poi.version}"/>
-            <param name="artifact-name" value="poi"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-activation">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/activation"/>
-            <param name="artifact-version" value="${activation.version}"/>
-            <param name="artifact-name" value="activation"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
     <target name="download-avalon-framework">
         <property name="avalon.path" value="org/apache/avalon/framework"/>
+        <property name="avalon.version" value="4.3.1"/>
         <mkdir dir="lib"/>
         <antcall target="download-via-maven"><param name="target" value="lib"/><param name="project-path" value="${avalon.path}"/><param name="artifact-version" value="${avalon.version}"/>
             <param name="artifact-name" value="avalon-framework-api"/>
@@ -1467,1418 +263,260 @@
             <param name="artifact-type" value="jar"/>
         </antcall>
     </target>
-    
-    <target name="download-ecj">
+
+    <target name="download-commons">
         <mkdir dir="lib"/>
         <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/eclipse/jdt/core/compiler"/>
-            <param name="artifact-version" value="${ecj.version}"/>
-            <param name="artifact-name" value="ecj"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-fop">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/xmlgraphics"/>
-            <param name="artifact-version" value="${fop.version}"/>
-            <param name="artifact-name" value="fop"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-geronimo-specs">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/geronimo/specs"/>
-            <param name="artifact-version" value="${javamail-spec.version}"/>
-            <param name="artifact-name" value="geronimo-javamail_1.4_spec"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-h2">
-        <mkdir dir="lib"/>
-        <!-- Alfresco dependency, so download from there -->
-        <get src="http://repo2.maven.org/maven2/com/h2database/h2/1.3.158/h2-1.3.158.jar" dest="lib/h2-1.3.158.jar"/>
-    </target>
-    
-    <target name="download-h2-support">
-        <mkdir dir="lib"/>
-        <!-- Alfresco dependency, so download from there -->
-        <get src="http://clojars.org/repo/it/sk/alfresco/h2-support/1.1/h2-support-1.1.jar" dest="lib/h2-support-1.1.jar"/>
-    </target>
-    
-    <target name="download-tomcat">
-        <mkdir dir="lib"/>
-        <property name="tomcat-package" value="org/apache/tomcat"/>
-        
-        <antcall target="download-via-maven"><param name="project-path" value="${tomcat-package}"/><param name="artifact-version" value="${tomcat.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jasper"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${tomcat-package}"/><param name="artifact-version" value="${tomcat.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jasper-el"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${tomcat-package}"/><param name="artifact-version" value="${tomcat.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="juli"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-jaxb">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/xml/bind"/>
-            <param name="artifact-version" value="${jaxb-api.version}"/>
-            <param name="artifact-name" value="jaxb-api"/>
+            <param name="project-path" value="commons-io"/>
+            <param name="artifact-version" value="1.3.2"/>
+            <param name="artifact-name" value="commons-io"/>
             <param name="artifact-type" value="jar"/>
         </antcall>
         <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/sun/xml/bind"/>
-            <param name="artifact-version" value="${jaxb-impl.version}"/>
-            <param name="artifact-name" value="jaxb-impl"/>
+            <param name="project-path" value="commons-logging"/>
+            <param name="artifact-version" value="1.1.1"/>
+            <param name="artifact-name" value="commons-logging"/>
             <param name="artifact-type" value="jar"/>
         </antcall>
     </target>
 
-    <target name="download-jaxws">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/xml/ws"/>
-            <param name="artifact-version" value="${jaxws.version}"/>
-            <param name="artifact-name" value="jaxws-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/sun/xml/ws"/>
-            <param name="artifact-version" value="${jaxws.version}"/>
-            <param name="artifact-name" value="jaxws-rt"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-chemistry">
-        <mkdir dir="lib"/>
-        <property name="chemistry-package" value="org/apache/chemistry/opencmis"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${chemistry-package}"/><param name="artifact-version" value="${chemistry.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="chemistry-opencmis-client-impl"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${chemistry-package}"/><param name="artifact-version" value="${chemistry.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="chemistry-opencmis-client-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${chemistry-package}"/><param name="artifact-version" value="${chemistry.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="chemistry-opencmis-client-bindings"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${chemistry-package}"/><param name="artifact-version" value="${chemistry.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="chemistry-opencmis-commons-impl"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${chemistry-package}"/><param name="artifact-version" value="${chemistry.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="chemistry-opencmis-commons-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-glassfish">
-        <mkdir dir="lib"/>
-        <property name="glassfish-package" value="org/mortbay/jetty"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${glassfish-package}"/><param name="artifact-version" value="${glassfish.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jsp-2.1-glassfish"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="project-path" value="${glassfish-package}"/><param name="artifact-version" value="${glassfish.version}"/><param name="target" value="lib"/>
-            <param name="artifact-name" value="jsp-api-2.1-glassfish"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-junit">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="junit"/>
-            <param name="artifact-version" value="${junit.version}"/>
-            <param name="artifact-name" value="junit"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/hamcrest"/>
-            <param name="artifact-version" value="${hamcrest.version}"/>
-            <param name="artifact-name" value="hamcrest-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-selenium" depends="download-gson,download-guava,download-commons-exec">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-java"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-chrome-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-remote-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-edge-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-firefox-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-ie-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-opera-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-safari-driver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/seleniumhq/selenium"/>
-            <param name="artifact-version" value="${selenium.version}"/>
-            <param name="artifact-name" value="selenium-support"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="cglib"/>
-            <param name="artifact-version" value="${cglib.version}"/>
-            <param name="artifact-name" value="cglib-nodep"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-mockito">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/mockito"/>
-            <param name="artifact-version" value="${mockito.version}"/>
-            <param name="artifact-name" value="mockito-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/github/tomakehurst"/>
-            <param name="artifact-version" value="${wiremock.version}"/>
-            <param name="artifact-name" value="wiremock"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/objenesis"/>
-            <param name="artifact-version" value="${objenesis.version}"/>
-            <param name="artifact-name" value="objenesis"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-log4j">
-        <mkdir dir="lib"/>
-        <!-- For zookeeper -->
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="log4j"/>
-            <param name="artifact-version" value="${log4j12.version}"/>
-            <param name="artifact-name" value="log4j"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/logging/log4j"/>
-            <param name="artifact-version" value="${log4j.version}"/>
-            <param name="artifact-name" value="log4j-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/logging/log4j"/>
-            <param name="artifact-version" value="${log4j.version}"/>
-            <param name="artifact-name" value="log4j-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/logging/log4j"/>
-            <param name="artifact-version" value="${log4j.version}"/>
-            <param name="artifact-name" value="log4j-1.2-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-mail">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/mail"/>
-            <param name="artifact-version" value="${mail.version}"/>
-            <param name="artifact-name" value="mail"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-
-    <target name="download-mimepull">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/jvnet"/>
-            <param name="artifact-version" value="${mimepull.version}"/>
-            <param name="artifact-name" value="mimepull"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-opensaml">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/opensaml"/>
-            <param name="artifact-version" value="${opensaml.version}"/>
-            <param name="artifact-name" value="opensaml"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-osgi">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/osgi"/>
-            <param name="artifact-version" value="${osgi.version}"/>
-            <param name="artifact-name" value="org.osgi.core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-xml-resolver">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="xml-resolver"/>
-            <param name="artifact-version" value="${xml-resolver.version}"/>
-            <param name="artifact-name" value="xml-resolver"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-servlet-api">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/servlet"/>
-            <param name="artifact-version" value="${servlet-api.version}"/>
-            <param name="artifact-name" value="javax.servlet-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-stax">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="stax"/>
-            <param name="artifact-version" value="${stax-api.version}"/>
-            <param name="artifact-name" value="stax-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/jvnet/staxex"/>
-            <param name="artifact-version" value="${stax-ex.version}"/>
-            <param name="artifact-name" value="stax-ex"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-streambuffer">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/sun/xml/stream/buffer"/>
-            <param name="artifact-version" value="${streambuffer.version}"/>
-            <param name="artifact-name" value="streambuffer"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-velocity">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/velocity"/>
-            <param name="artifact-version" value="${velocity.version}"/>
-            <param name="artifact-name" value="velocity"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-wss4j">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/ws/security"/>
-            <param name="artifact-version" value="${wss4j.version}"/>
-            <param name="artifact-name" value="wss4j"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-xmlgraphics-commons">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/xmlgraphics"/>
-            <param name="artifact-version" value="${xmlgraphics-commons.version}"/>
-            <param name="artifact-name" value="xmlgraphics-commons"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-woodstox">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/codehaus/woodstox"/>
-            <param name="artifact-version" value="${woodstox-core-asl.version}"/>
-            <param name="artifact-name" value="woodstox-core-asl"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/codehaus/woodstox"/>
-            <param name="artifact-version" value="${stax2-api.version}"/>
-            <param name="artifact-name" value="stax2-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-xmlsec">
-        <!-- Alfresco dependency, so resolve it from alfresco svn -->
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/santuario"/>
-            <param name="artifact-version" value="${xmlsec.version}"/>
-            <param name="artifact-name" value="xmlsec"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-xml-apis">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="xml-apis"/>
-            <param name="artifact-version" value="${xml-apis.version}"/>
-            <param name="artifact-name" value="xml-apis"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-jstl">
-        <mkdir dir="lib"/>
-        <property name="jstl-package" value="jstl"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="${jstl-package}"/>
-            <param name="artifact-version" value="${jstl.version}"/>
-            <param name="artifact-name" value="jstl"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-elasticsearch-plugin">
-        <mkdir dir="lib/elasticsearch"/>
-        <!-- Download and unpack binary artifact -->
-        <mkdir dir="build/download"/>
-        <mkdir dir="lib/elasticsearch"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.zip" dest="build/download/apache-manifoldcf-elasticsearch-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-elasticsearch-plugin-bin.zip" dest="build/download/apache-manifoldcf-elasticsearch-plugin-bin"/>
-        <copy todir="lib/elasticsearch">
-            <fileset dir="build/download/apache-manifoldcf-elasticsearch-plugin-bin/elasticsearch-plugin-mcf-2.1"/>
+    <target name="setup-local-forrest" depends="forrest-check" if="forrestAvailable">
+        <mkdir dir="tmp/forrest"/>
+        <copy todir="tmp/forrest">
+            <fileset dir="${forrest-root}"/>
         </copy>
-        <mkdir dir="lib/elasticsearch-1.5"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.zip" dest="build/download/apache-manifoldcf-elasticsearch-1.5-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-elasticsearch-1.5-plugin-bin.zip" dest="build/download/apache-manifoldcf-elasticsearch-1.5-plugin-bin"/>
-        <copy todir="lib/elasticsearch-1.5">
-            <fileset dir="build/download/apache-manifoldcf-elasticsearch-1.5-plugin-bin/elasticsearch-1.5-plugin-mcf-2.0.2"/>
+        <chmod dir="tmp/forrest/bin" perm="ugo+rx" includes="forrest"/>
+        <chmod dir="tmp/forrest/tools/ant/bin" perm="ugo+rx" includes="ant"/>
+        <!-- Replace the fop jar with a more up-to-date version -->
+        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/lib/fop-0.95.jar"/>
+        <delete file="tmp/forrest/build/plugins/lib/fop-0.95.jar"/>
+        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/lib">
+            <fileset dir="lib">
+                <include name="fop*.jar"/>
+            </fileset>
         </copy>
-    </target>
-	
-    <target name="download-kafka-client">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/kafka"/>
-            <param name="artifact-version" value="0.8.2.1"/>
-            <param name="artifact-name" value="kafka-clients"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="net/jpountz/lz4"/>
-            <param name="artifact-version" value="1.3.0"/>
-            <param name="artifact-name" value="lz4"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/xerial/snappy"/>
-            <param name="artifact-version" value="1.1.2"/>
-            <param name="artifact-name" value="snappy-java"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-json-simple">
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/googlecode/json-simple"/>
-            <param name="artifact-version" value="${json-simple.version}"/>
-            <param name="artifact-name" value="json-simple"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-   <target name="download-dropbox-client">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/syncloud"/>
-            <param name="artifact-version" value="${dropbox-client.version}"/>
-            <param name="artifact-name" value="dropbox-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-  
-    <target name="download-jira-client">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/googlecode/json-simple"/>
-            <param name="artifact-version" value="${json-simple.version}"/>
-            <param name="artifact-name" value="json-simple"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-   <target name="download-google-api-client">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/apis"/>
-            <param name="artifact-version" value="${google-api-client.version}"/>
-            <param name="artifact-name" value="google-api-services-drive"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/http-client"/>
-            <param name="artifact-version" value="${google-http-client.version}"/>
-            <param name="artifact-name" value="google-http-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/http-client"/>
-            <param name="artifact-version" value="${google-http-client.version}"/>
-            <param name="artifact-name" value="google-http-client-jackson2"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/oauth-client"/>
-            <param name="artifact-version" value="${google-http-client.version}"/>
-            <param name="artifact-name" value="google-oauth-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/fasterxml/jackson/core"/>
-            <param name="artifact-version" value="${jackson-core.version}"/>
-            <param name="artifact-name" value="jackson-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall> 
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/api-client"/>
-            <param name="artifact-version" value="${google-http-client.version}"/>
-            <param name="artifact-name" value="google-api-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-
-    </target>
-
-    <target name="download-sharepoint-plugins">
-        <mkdir dir="lib/sharepoint-2007"/>
-        <!-- Download and unpack binary artifact -->
-        <mkdir dir="build/download"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2007-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-sharepoint-2007-plugin-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2007-plugin-bin"/>
-        <copy todir="lib/sharepoint-2007">
-            <fileset dir="build/download/apache-manifoldcf-sharepoint-2007-plugin-bin/apache-manifoldcf-sharepoint-2007-plugin-0.5"/>
+        <!-- Same with the XML Graphics jar -->
+        <delete file="tmp/forrest/lib/core/xmlgraphics-commons-1.3.1.jar"/>
+        <copy todir="tmp/forrest/lib/core">
+            <fileset dir="lib">
+                <include name="xmlgraphics-commons*.jar"/>
+            </fileset>
         </copy>
-        <mkdir dir="lib/sharepoint-2010"/>
-        <!-- Download and unpack binary artifact -->
-        <mkdir dir="build/download"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2010-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-sharepoint-2010-plugin-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2010-plugin-bin"/>
-        <copy todir="lib/sharepoint-2010">
-            <fileset dir="build/download/apache-manifoldcf-sharepoint-2010-plugin-bin/apache-manifoldcf-sharepoint-2010-plugin-0.4"/>
+        <!-- Replace the file tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/output.xmap with our own patched version -->
+        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/output.xmap"/>
+        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf">
+            <fileset dir="pdf">
+                <include name="output.xmap"/>
+                <include name="config.xml"/>
+            </fileset>
         </copy>
-        <mkdir dir="lib/sharepoint-2013"/>
-        <!-- Download and unpack binary artifact -->
-        <mkdir dir="build/download"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2013-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-sharepoint-2013-plugin-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2013-plugin-bin"/>
-        <copy todir="lib/sharepoint-2013">
-            <fileset dir="build/download/apache-manifoldcf-sharepoint-2013-plugin-bin/apache-manifoldcf-sharepoint-2013-plugin-0.1"/>
-        </copy>
-        <mkdir dir="lib/sharepoint-2016"/>
-        <!-- Download and unpack binary artifact -->
-        <mkdir dir="build/download"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2016-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-sharepoint-2016-plugin-bin.zip" dest="build/download/apache-manifoldcf-sharepoint-2016-plugin-bin"/>
-        <copy todir="lib/sharepoint-2016">
-            <fileset dir="build/download/apache-manifoldcf-sharepoint-2016-plugin-bin/apache-manifoldcf-sharepoint-2016-plugin-0.1"/>
+        <dirname file="build.xml" property="project-path"/>
+        <replace file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/output.xmap" token="{root}" value="${project-path}"/>
+        <replace file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/config.xml" token="{root}" value="${project-path}"/>
+        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/resources/stylesheets/document-to-fo.xsl"/>
+        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/resources/stylesheets">
+            <fileset dir="pdf">
+                <include name="document-to-fo.xsl"/>
+            </fileset>
         </copy>
     </target>
 
-    <target name="download-solr-plugins">
-        <mkdir dir="lib/solr-3.x"/>
-        <mkdir dir="build/download"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.zip" dest="build/download/apache-manifoldcf-solr-3.x-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-solr-3.x-plugin-bin.zip" dest="build/download/apache-manifoldcf-solr-3.x-plugin-bin"/>
-        <copy todir="lib/solr-3.x">
-            <fileset dir="build/download/apache-manifoldcf-solr-3.x-plugin-bin/apache-manifoldcf-solr-3.x-plugin-2.2"/>
-        </copy>
-        <mkdir dir="lib/solr-4.x"/>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.zip" dest="build/download/apache-manifoldcf-solr-4.x-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-solr-4.x-plugin-bin.zip" dest="build/download/apache-manifoldcf-solr-4.x-plugin-bin"/>
-        <copy todir="lib/solr-4.x">
-            <fileset dir="build/download/apache-manifoldcf-solr-4.x-plugin-bin/apache-manifoldcf-solr-4.x-plugin-2.2"/>
-        </copy>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.zip" dest="build/download/apache-manifoldcf-solr-5.x-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-solr-5.x-plugin-bin.zip" dest="build/download/apache-manifoldcf-solr-5.x-plugin-bin"/>
-        <copy todir="lib/solr-5.x">
-            <fileset dir="build/download/apache-manifoldcf-solr-5.x-plugin-bin/apache-manifoldcf-solr-5.x-plugin-2.2"/>
-        </copy>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.zip" dest="build/download/apache-manifoldcf-solr-6.x-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-solr-6.x-plugin-bin.zip" dest="build/download/apache-manifoldcf-solr-6.x-plugin-bin"/>
-        <copy todir="lib/solr-6.x">
-            <fileset dir="build/download/apache-manifoldcf-solr-6.x-plugin-bin/apache-manifoldcf-solr-6.x-plugin-2.2"/>
-        </copy>
-        <get src="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.zip" dest="build/download/apache-manifoldcf-solr-7.x-plugin-bin.zip"/>
-        <unzip src="build/download/apache-manifoldcf-solr-7.x-plugin-bin.zip" dest="build/download/apache-manifoldcf-solr-7.x-plugin-bin"/>
-        <copy todir="lib/solr-7.x">
-            <fileset dir="build/download/apache-manifoldcf-solr-7.x-plugin-bin/apache-manifoldcf-solr-7.x-plugin-2.2"/>
-        </copy>
-    </target>
+    <target name="build-dejavu-fonts" depends="dejavu-check" if="dejavuAvailable">
+        <mkdir dir="tmp/font/dejavu-fonts"/>
+        <unzip src="fonts/dejavu-fonts-ttf-2.37.zip" dest="tmp/font/dejavu-fonts"/>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans.ttf"/>
+            <arg value="tmp/font/DejaVuSans.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans-Oblique.ttf"/>
+            <arg value="tmp/font/DejaVuSans-Oblique.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans-Bold.ttf"/>
+            <arg value="tmp/font/DejaVuSans-Bold.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif.ttf"/>
+            <arg value="tmp/font/DejaVuSerif.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif-Italic.ttf"/>
+            <arg value="tmp/font/DejaVuSerif-Italic.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif-Bold.ttf"/>
+            <arg value="tmp/font/DejaVuSerif-Bold.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSansMono.ttf"/>
+            <arg value="tmp/font/DejaVuSansMono.xml"/>
+        </java>
 
-
-    <target name="download-hadoop" depends="download-guava">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/hadoop"/>
-            <param name="artifact-version" value="${hadoop.version}"/>
-            <param name="artifact-name" value="hadoop-common"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/hadoop"/>
-            <param name="artifact-version" value="${hadoop.version}"/>
-            <param name="artifact-name" value="hadoop-annotations"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/hadoop"/>
-            <param name="artifact-version" value="${hadoop.version}"/>
-            <param name="artifact-name" value="hadoop-auth"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/hadoop"/>
-            <param name="artifact-version" value="${hadoop.version}"/>
-            <param name="artifact-name" value="hadoop-hdfs"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-htrace">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/htrace"/>
-            <param name="artifact-version" value="3.0.4"/>
-            <param name="artifact-name" value="htrace-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
     </target>
     
-    <target name="download-protobuf">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/protobuf"/>
-            <param name="artifact-version" value="${protobuf.version}"/>
-            <param name="artifact-name" value="protobuf-java"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
+    <target name="build-ipa-fonts" depends="ipa-check" if="ipaAvailable">
+        <mkdir dir="tmp/font/ipa-fonts"/>
+        <unzip src="fonts/IPAGTTC00303.zip" dest="tmp/font/ipa-fonts"/>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="-ttcname"/>
+            <arg value="IPAPGothic"/>
+            <arg value="tmp/font/ipa-fonts/IPAGTTC00303/ipag.ttc"/>
+            <arg value="tmp/font/ipapgothic.xml"/>
+        </java>
+        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
+            <classpath>
+                <fileset dir="lib">
+                    <include name="fop*.jar"/>
+                    <include name="xmlgraphics-commons*.jar"/>
+                    <include name="avalon*.jar"/>
+                    <include name="commons-io*.jar"/>
+                    <include name="commons-logging*.jar"/>
+                </fileset>
+            </classpath>
+            <arg value="-ttcname"/>
+            <arg value="IPAGothic"/>
+            <arg value="tmp/font/ipa-fonts/IPAGTTC00303/ipag.ttc"/>
+            <arg value="tmp/font/ipagothic.xml"/>
+        </java>
 
-    <target name="download-guava" depends="download-jna">
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="com/google/guava"/>
-            <param name="artifact-version" value="${guava.version}"/>
-            <param name="artifact-name" value="guava"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="net/java/dev/jna"/>
-            <param name="artifact-version" value="${jna.version}"/>
-            <param name="artifact-name" value="jna-platform"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-solrj">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/solr"/>
-            <param name="artifact-version" value="${solrj.version}"/>
-            <param name="artifact-name" value="solr-solrj"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/noggit"/>
-            <param name="artifact-version" value="${noggit.version}"/>
-            <param name="artifact-name" value="noggit"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-version" value="${commons-math3.version}"/>
-            <param name="artifact-name" value="commons-math3"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-zookeeper">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/zookeeper"/>
-            <param name="artifact-version" value="${zookeeper.version}"/>
-            <param name="artifact-name" value="zookeeper"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
     </target>
     
-    <target name="download-commons-exec">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-name" value="commons-exec"/>
-            <param name="artifact-version" value="${commons-exec.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-jna">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="net/java/dev/jna"/>
-            <param name="artifact-name" value="jna"/>
-            <param name="artifact-version" value="${jna.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-asm">
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ow2/asm"/>
-            <param name="artifact-name" value="asm-debug-all"/>
-            <param name="artifact-version" value="${asm.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ow2/asm"/>
-            <param name="artifact-name" value="asm-analysis"/>
-            <param name="artifact-version" value="${asm.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ow2/asm"/>
-            <param name="artifact-name" value="asm-commons"/>
-            <param name="artifact-version" value="${asm.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ow2/asm"/>
-            <param name="artifact-name" value="asm"/>
-            <param name="artifact-version" value="${asm.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ow2/asm"/>
-            <param name="artifact-name" value="asm-tree"/>
-            <param name="artifact-version" value="${asm.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ow2/asm"/>
-            <param name="artifact-name" value="asm-util"/>
-            <param name="artifact-version" value="${asm.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
+    <target name="dependencies-check" depends="ipa-check,dejavu-check,forrest-check,downloaded-check">
+        <condition property="dependenciesAvailable">
+          <and>
+              <isset property="ipaAvailable"/>
+              <isset property="dejavuAvailable"/>
+              <isset property="forrestAvailable"/>
+              <isset property="downloaded"/>
+          </and>
+        </condition>
     </target>
     
-    <target name="download-cxf" depends="download-xml-resolver,download-asm,download-jaxb">
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-core"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-frontend-jaxrs"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-frontend-jaxws"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-rs-client"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-databinding-jaxb"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-bindings-soap"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-wsdl"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-bindings-xml"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-frontend-simple"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-ws-addr"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-transports-http"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/cxf"/>
-            <param name="artifact-name" value="cxf-rt-ws-policy"/>
-            <param name="artifact-version" value="${cxf.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/neethi"/>
-            <param name="artifact-name" value="neethi"/>
-            <param name="artifact-version" value="${neethi.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
+    <target name="build" depends="setup-local-forrest,build-ipa-fonts,build-dejavu-fonts,get-releases-doc,transfer-root-files,dependencies-check" if="dependenciesAvailable">
+        <dirname file="tmp/forrest/LICENSE.txt" property="forrest-dir"/>
+        <echo message="${forrest-dir}"/>
+        <exec executable="cmd.exe" dir="." searchpath="true" failonerror="true" osfamily="windows">
+            <arg line="/c .\tmp\forrest\bin\forrest.bat site"/>
+            <env key="JAVA_TOOL_OPTIONS" value="-Dfile.encoding=UTF8"/>
+            <env key="FORREST_HOME" value="${forrest-dir}"/>
+        </exec>
+        <exec executable="./tmp/forrest/bin/forrest" dir="." searchpath="true" failonerror="true" osfamily="unix">
+            <arg line="site"/>
+            <env key="JAVA_TOOL_OPTIONS" value="-Dfile.encoding=UTF8"/>
+            <env key="FORREST_HOME" value="${forrest-dir}"/>
+        </exec>
     </target>
     
-    <target name="download-tika" depends="download-commons-exec,download-jna,download-cxf">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/tika"/>
-            <param name="artifact-version" value="${tika.version}"/>
-            <param name="artifact-name" value="tika-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/tika"/>
-            <param name="artifact-version" value="${tika.version}"/>
-            <param name="artifact-name" value="tika-parsers"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/tdunning"/>
-            <param name="artifact-version" value="${json.version}"/>
-            <param name="artifact-name" value="json"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="c3p0"/>
-            <param name="artifact-version" value="${c3p0.version}"/>
-            <param name="artifact-name" value="c3p0"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/usc/ir"/>
-            <param name="artifact-version" value="${sentiment-analysis.version}"/>
-            <param name="artifact-name" value="sentiment-analysis-parser"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/beust"/>
-            <param name="artifact-version" value="${jcommander.version}"/>
-            <param name="artifact-name" value="jcommander"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="net/jcip"/>
-            <param name="artifact-name" value="jcip-annotations"/>
-            <param name="artifact-version" value="${jcip-annotations.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="net/sf/ehcache"/>
-            <param name="artifact-name" value="ehcache-core"/>
-            <param name="artifact-version" value="${ehcache.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/itadaki"/>
-            <param name="artifact-name" value="bzip2"/>
-            <param name="artifact-version" value="${bzip2.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/jdom"/>
-            <param name="artifact-name" value="jdom2"/>
-            <param name="artifact-version" value="${jdom2.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/quartz-scheduler"/>
-            <param name="artifact-name" value="quartz"/>
-            <param name="artifact-version" value="${quartz.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/opengis"/>
-            <param name="artifact-version" value="${opengis.version}"/>
-            <param name="artifact-name" value="geoapi"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/measure"/>
-            <param name="artifact-version" value="${jsr-275.version}"/>
-            <param name="artifact-name" value="jsr-275"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/sis/core"/>
-            <param name="artifact-version" value="${sis.version}"/>
-            <param name="artifact-name" value="sis-metadata"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/sis/core"/>
-            <param name="artifact-version" value="${sis.version}"/>
-            <param name="artifact-name" value="sis-utility"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/sis/storage"/>
-            <param name="artifact-version" value="${sis.version}"/>
-            <param name="artifact-name" value="sis-netcdf"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/sis/storage"/>
-            <param name="artifact-version" value="${sis.version}"/>
-            <param name="artifact-name" value="sis-storage"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/sis/core"/>
-            <param name="artifact-version" value="${sis.version}"/>
-            <param name="artifact-name" value="sis-referencing"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/opennlp"/>
-            <param name="artifact-version" value="${opennlp.version}"/>
-            <param name="artifact-name" value="opennlp-tools"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/healthmarketscience/jackcess"/>
-            <param name="artifact-version" value="${jackcess.version}"/>
-            <param name="artifact-name" value="jackcess"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/healthmarketscience/jackcess"/>
-            <param name="artifact-version" value="${jackcess-encrypt.version}"/>
-            <param name="artifact-name" value="jackcess-encrypt"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/github/junrar"/>
-            <param name="artifact-version" value="${junrar.version}"/>
-            <param name="artifact-name" value="junrar"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-version" value="${commons-vfs2.version}"/>
-            <param name="artifact-name" value="commons-vfs2"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/maven/scm"/>
-            <param name="artifact-version" value="${maven-scm.version}"/>
-            <param name="artifact-name" value="maven-scm-api"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/maven/scm"/>
-            <param name="artifact-version" value="${maven-scm.version}"/>
-            <param name="artifact-name" value="maven-scm-provider-svnexe"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/maven/scm"/>
-            <param name="artifact-version" value="${maven-scm.version}"/>
-            <param name="artifact-name" value="maven-scm-provider-svn-commons"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/codehaus/plexus"/>
-            <param name="artifact-version" value="${plexus-utils.version}"/>
-            <param name="artifact-name" value="plexus-utils"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="regexp"/>
-            <param name="artifact-version" value="${regexp.version}"/>
-            <param name="artifact-name" value="regexp"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-name" value="commons-csv"/>
-            <param name="artifact-version" value="${commons-csv.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/ucar"/>
-            <param name="artifact-name" value="netcdf4"/>
-            <param name="artifact-version" value="${ucar.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/ucar"/>
-            <param name="artifact-name" value="httpservices"/>
-            <param name="artifact-version" value="${ucar.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/ucar"/>
-            <param name="artifact-name" value="grib"/>
-            <param name="artifact-version" value="${ucar.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/ucar"/>
-            <param name="artifact-name" value="cdm"/>
-            <param name="artifact-version" value="${ucar.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/ucar"/>
-            <param name="artifact-name" value="udunits"/>
-            <param name="artifact-version" value="${ucar.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="edu/ucar"/>
-            <param name="artifact-name" value="jj2000"/>
-            <param name="artifact-version" value="${jj2000.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/ccil/cowan/tagsoup"/>
-            <param name="artifact-version" value="${tagsoup.version}"/>
-            <param name="artifact-name" value="tagsoup"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/james"/>
-            <param name="artifact-name" value="apache-mime4j-core"/>
-            <param name="artifact-version" value="${james.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/james"/>
-            <param name="artifact-name" value="apache-mime4j-dom"/>
-            <param name="artifact-version" value="${james.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/gagravarr"/>
-            <param name="artifact-name" value="vorbis-java-tika"/>
-            <param name="artifact-version" value="${vorbis.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/poi"/>
-            <param name="artifact-name" value="poi-scratchpad"/>
-            <param name="artifact-version" value="${poi.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/drewnoakes"/>
-            <param name="artifact-name" value="metadata-extractor"/>
-            <param name="artifact-version" value="${metadata-extractor.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/aspectj"/>
-            <param name="artifact-name" value="aspectjrt"/>
-            <param name="artifact-version" value="${aspectjrt.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/codelibs"/>
-            <param name="artifact-name" value="jhighlight"/>
-            <param name="artifact-version" value="${jhighlight.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/xmlbeans"/>
-            <param name="artifact-name" value="xmlbeans"/>
-            <param name="artifact-version" value="${xmlbeans.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/bouncycastle"/>
-            <param name="artifact-name" value="bcmail-jdk15on"/>
-            <param name="artifact-version" value="${bc.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/bouncycastle"/>
-            <param name="artifact-name" value="bcprov-jdk15on"/>
-            <param name="artifact-version" value="${bc.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/bouncycastle"/>
-            <param name="artifact-name" value="bcpkix-jdk15on"/>
-            <param name="artifact-version" value="${bc.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/tukaani"/>
-            <param name="artifact-name" value="xz"/>
-            <param name="artifact-version" value="${tukaani.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/pdfbox"/>
-            <param name="artifact-name" value="jempbox"/>
-            <param name="artifact-version" value="${jempbox.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/pdfbox"/>
-            <param name="artifact-name" value="pdfbox"/>
-            <param name="artifact-version" value="${pdfbox.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/pdfbox"/>
-            <param name="artifact-name" value="fontbox"/>
-            <param name="artifact-version" value="${pdfbox.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/pdfbox"/>
-            <param name="artifact-name" value="pdfbox-debugger"/>
-            <param name="artifact-version" value="${pdfbox.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/pdfbox"/>
-            <param name="artifact-name" value="pdfbox-tools"/>
-            <param name="artifact-version" value="${pdfbox.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-name" value="commons-compress"/>
-            <param name="artifact-version" value="${commons-compress.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/googlecode/juniversalchardet"/>
-            <param name="artifact-name" value="juniversalchardet"/>
-            <param name="artifact-version" value="${juniversalchardet.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="de/l3s/boilerpipe"/>
-            <param name="artifact-name" value="boilerpipe"/>
-            <param name="artifact-version" value="${boilerpipe.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="dom4j"/>
-            <param name="artifact-name" value="dom4j"/>
-            <param name="artifact-version" value="${dom4j.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/adobe/xmp"/>
-            <param name="artifact-name" value="xmpcore"/>
-            <param name="artifact-version" value="${xmpcore.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/gagravarr"/>
-            <param name="artifact-name" value="vorbis-java-core"/>
-            <param name="artifact-version" value="${vorbis.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/poi"/>
-            <param name="artifact-name" value="poi-ooxml"/>
-            <param name="artifact-version" value="${poi.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/poi"/>
-            <param name="artifact-name" value="poi-ooxml-schemas"/>
-            <param name="artifact-version" value="${poi.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/rometools"/>
-            <param name="artifact-name" value="rome"/>
-            <param name="artifact-version" value="${rome.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/rometools"/>
-            <param name="artifact-name" value="rome-utils"/>
-            <param name="artifact-version" value="${rome.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/jdom"/>
-            <param name="artifact-name" value="jdom2"/>
-            <param name="artifact-version" value="${jdom2.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/googlecode/mp4parser"/>
-            <param name="artifact-name" value="isoparser"/>
-            <param name="artifact-version" value="${mp4parser.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/apache/ws/xmlschema"/>
-            <param name="artifact-name" value="xmlschema-core"/>
-            <param name="artifact-version" value="${xmlschema.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/annotation"/>
-            <param name="artifact-name" value="javax.annotation-api"/>
-            <param name="artifact-version" value="${annotation-api.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="javax/ws/rs"/>
-            <param name="artifact-name" value="javax.ws.rs-api"/>
-            <param name="artifact-version" value="${javax.ws.rs-api.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="org/tallison"/>
-            <param name="artifact-name" value="jmatio"/>
-            <param name="artifact-version" value="${jmatio.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/pff"/>
-            <param name="artifact-name" value="java-libpst"/>
-            <param name="artifact-version" value="${java-libpst.version}"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/github/virtuald"/>
-            <param name="artifact-version" value="${virtuald.version}"/>
-            <param name="artifact-name" value="curvesapi"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
+    <target name="download-dejavu-fonts">
+      <mkdir dir="fonts"/>
+      <get src="http://versaweb.dl.sourceforge.net/project/dejavu/dejavu/2.37/dejavu-fonts-ttf-2.37.zip" dest="fonts"/>
     </target>
     
-    <target name="download-jackson">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/fasterxml/jackson/core"/>
-            <param name="artifact-version" value="${jackson-databind.version}"/>
-            <param name="artifact-name" value="jackson-databind"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven"><param name="target" value="lib"/>
-            <param name="project-path" value="com/fasterxml/jackson/core"/>
-            <param name="artifact-version" value="${jackson-annotations.version}"/>
-            <param name="artifact-name" value="jackson-annotations"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-forbidden-checks">
-        <mkdir dir="lib"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="de/thetaphi"/>
-            <param name="artifact-version" value="2.2"/>
-            <param name="target" value="lib"/>
-            <param name="artifact-name" value="forbiddenapis"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="make-core-deps" depends="download-less-compiler,download-forbidden-checks,download-nuxeo-client,download-json-simple,download-selenium,download-kafka-client,download-joda-time,download-aws-sdk,download-resteasy,download-jsoup,download-mockito,download-alfresco-webscript-plugin,download-alfresco-indexer-client,download-mongo-java-driver,download-jira-client,download-google-api-client,download-dropbox-client,download-solrj,download-zookeeper,download-httpcomponents,download-hsqldb,download-xerces,download-commons,download-elasticsearch-plugin,download-solr-plugins,download-sharepoint-plugins,download-jstl,download-xmlgraphics-commons,download-woodstox,download-xmlsec,download-xml-apis,download-wss4j,download-velocity,download-streambuffer,download-stax,download-servlet-api,download-xml-resolver,download-osgi,download-opensaml,download-mimepull,download-mail,download-log4j,download-junit,download-jaxws,download-glassfish,download-jaxb,download-tomcat,download-h2,download-h2-support,download-geronimo-specs,download-fop,download-postgresql,download-axis,download-saaj,download-wsdl4j,download-castor,download-jetty,download-slf4j,download-xalan,download-activation,download-avalon-framework,download-poi,download-chemistry,download-ecj,download-hadoop,download-htrace,download-protobuf,download-tika,download-jackson">
-        <copy todir="lib">
-            <fileset dir="lib-license" includes="*.txt"/>
-        </copy>
+    <target name="download-ipa-fonts">
+      <mkdir dir="fonts"/>
+      <!-- http://ossipedia.ipa.go.jp/ipafont/download.html?ruleagreement=%E5%90%8C%E6%84%8F%E3%81%99%E3%82%8B%2FAccept -->
+      <!-- get src="http://ossipedia.ipa.go.jp/ipafont/IPAGTTC00303.php" dest="fonts/IPAGTTC00303.zip"/ -->
+      <!-- get src="http://info.openlab.ipa.go.jp/ipafont/fontdata/IPAGTTC00303.zip" dest="fonts"/ -->
+      <!-- get src="http://ossipedia.ipa.go.jp/ipafont/ipafont/IPAGTTC00303.zip" dest="fonts"/ -->
+      <get src="http://jaist.dl.sourceforge.jp/ipafonts/51867/IPAGTTC00303.zip" dest="fonts"/>
     </target>
     
-    <target name="download-mariadb">
-        <antcall target="download-via-maven">
-            <param name="target" value="lib-proprietary"/>
-            <param name="project-path" value="org/mariadb/jdbc"/>
-            <param name="artifact-version" value="1.1.7"/>
-            <param name="artifact-name" value="mariadb-java-client"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-    
-    <target name="download-mysql">
-        <antcall target="download-via-maven">
-            <param name="target" value="lib-proprietary"/>
-            <param name="project-path" value="mysql"/>
-            <param name="artifact-version" value="5.1.33"/>
-            <param name="artifact-name" value="mysql-connector-java"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-jtds">
-        <antcall target="download-via-maven">
-            <param name="target" value="lib-proprietary"/>
-            <param name="project-path" value="net/sourceforge/jtds"/>
-            <param name="artifact-version" value="1.2.4"/>
-            <param name="artifact-name" value="jtds"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-proprietary-dependencies" depends="download-mariadb,download-mysql,download-jtds"/>
-    
-    <target name="make-deps" depends="download-proprietary-dependencies,download-connectors-dependencies">
-        <ant dir="site" target="download-dependencies"/>
-    </target>
-
-    <target name="download-proprietary-cleanup">
-        <delete>
-            <fileset dir="lib-proprietary" excludes="README.txt"/>
-        </delete>
+    <target name="make-core-deps" depends="download-dejavu-fonts,download-ipa-fonts,download-commons,download-avalon-framework,download-xmlgraphics-commons,download-fop">
     </target>
 
     <target name="clean-core-deps">
+        <delete dir="fonts"/>
         <delete dir="lib"/>
     </target>
 
-    <target name="clean-deps" depends="download-proprietary-cleanup,cleanup-connectors-dependencies">
-        <ant dir="site" target="download-cleanup"/>
+    <target name="help">
+      <echo level="info">
+ManifoldCF site build file.  Use this file to build the ManifoldCF
+site docs.
+
+Useful targets are:
+
+clean    - Clean the build and distribution areas
+build    - Build the site
+
+make-core-deps         - Download and build core dependencies
+clean-core-deps        - Clean up core dependencies
+
+Use Apache Forrest version forrest-0.9-dev or higher.
+      </echo>
     </target>
-
-    <!-- taskdef name="forbiddenapis" classname="de.thetaphi.forbiddenapis.ant.AntTask" classpath="lib/forbiddenapis-2.2.jar"/ -->
-
-    <!-- target name="forbidden-checks" depends="build">
-        <forbiddenapis failOnMissingClasses="false" targetVersion="1.7">
-            <classpath>
-                <fileset dir="dist/lib">
-                    <include name="**/*.jar"/>
-                </fileset>
-            </classpath>
-            <bundledsignatures name="jdk-unsafe"/>
-            <bundledsignatures name="jdk-non-portable"/>
-            <fileset dir="dist/lib">
-                <include name="**/*.jar"/>
-            </fileset>
-            <fileset dir="dist/lib-proprietary">
-                <include name="**/*.jar"/>
-            </fileset>
-            <fileset dir="dist/connector-common-lib">
-                <include name="**/*.jar"/>
-            </fileset>
-            <fileset dir="dist/connector-lib">
-                <include name="**/*.jar"/>
-            </fileset>
-            <fileset dir="dist/connector-lib-proprietary">
-                <include name="**/*.jar"/>
-            </fileset>
-        </forbiddenapis>
-    </target -->
-
-    <target name="precommit" description="Run basic checks before committing" depends="rat-sources"/>
-
+    
 </project>
diff --git a/common-build.xml b/common-build.xml
deleted file mode 100644
index 89b66df..0000000
--- a/common-build.xml
+++ /dev/null
@@ -1,96 +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.
--->
-
-<project name="mcf-common-build">
-
-    <target name="setup-maven-url">
-        <property name="maven-base-url" value="https://repo1.maven.org/maven2"/>
-    </target>
-    
-    <target name="download-via-maven" depends="setup-maven-url">
-        <get src="${maven-base-url}/${project-path}/${artifact-name}/${artifact-version}/${artifact-name}-${artifact-version}.${artifact-type}" dest="${target}/${artifact-name}-${artifact-version}.${artifact-type}"/>
-    </target>
-
-    <target name="checkout-source-via-svn">
-        <mkdir dir="${root-dir}"/>
-        <exec dir="${root-dir}" executable="svn" failifexecutionfails="true" failonerror="true">
-              <arg value="checkout" />
-              <arg value="${svn-url}" />
-              <arg value="${dir-name}" />
-        </exec>
-    </target>
-
-    <target name="calculate-svn-patch-available">
-        <mkdir dir="build/svn-check"/>
-        <exec dir="build/svn-check" output="build/svn-check/svn.output" executable="svn" failifexecutionfails="true" failonerror="true">
-              <arg value="--version" />
-        </exec>
-        <loadfile property="svn-output" srcFile="build/svn-check/svn.output"/>
-        <condition property="svn-version-ok">
-            <or>
-                <contains string="${svn-output}" substring="1.7."/>
-                <contains string="${svn-output}" substring="1.8."/>
-                <contains string="${svn-output}" substring="1.9."/>
-                <contains string="${svn-output}" substring="1.10."/>
-                <contains string="${svn-output}" substring="1.11."/>
-            </or>
-        </condition>
-    </target>
-
-    <target name="calculate-patch-available" depends="calculate-svn-patch-available" unless="svn-version-ok">
-        <condition property="patch-ok">
-            <os family="unix"/>
-        </condition>
-    </target>
-    
-    <target name="check-svn-patch-available" depends="calculate-svn-patch-available" unless="svn-version-ok">
-        <echo message="You need svn version 1.7 or higher - attempting patch instead."/>
-    </target>
-    
-    <target name="check-patch-available" depends="calculate-patch-available" unless="patch-ok">
-    </target>
-    
-    <target name="patch-source-via-svn" depends="check-svn-patch-available" if="svn-version-ok">
-        <mkdir dir="${root-dir}"/>
-        <exec dir="${root-dir}" executable="svn" failifexecutionfails="true" failonerror="true">
-              <arg value="patch" />
-              <arg value="${diff-file}" />
-              <arg value="${dir-name}" />
-        </exec>
-    </target>
-    
-    <target name="patch-source-via-patch" depends="check-patch-available" if="patch-ok">
-        <mkdir dir="${root-dir}"/>
-        <exec dir="${root-dir}/${dir-name}" executable="patch" input="../${diff-file}" failifexecutionfails="true" failonerror="true">
-              <arg value="-p0" />
-        </exec>
-    </target>
-    
-    <target name="patch-source" depends="patch-source-via-svn,patch-source-via-patch"/>
-    
-    <target name="build-via-ant">
-        <exec osfamily="windows" dir="${root-dir}" executable="cmd" failifexecutionfails="true" failonerror="true">
-            <arg value="/c"/>
-            <arg value="ant.bat"/>
-            <arg value="${target}" />
-        </exec>
-        <exec osfamily="unix" dir="${root-dir}" executable="ant" failifexecutionfails="true" failonerror="true">
-            <arg value="${target}" />
-        </exec>
-    </target>
-    
-</project>
diff --git a/connectors/.gitignore b/connectors/.gitignore
deleted file mode 100644
index d844800..0000000
--- a/connectors/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-/.settings/
-/.project
-/documentfilter/
-*/build/
-*/dist/
-test-HSQLDB-output/
-
-dbname.properties
-dbname.script
-
-#ignore all files from test-materials
-/*/test-materials/*
-#unignore README.txt from test-materials
-!/*/test-materials/README.txt
-
-#ignore all files from test-materials-proprietary
-/*/test-materials-proprietary/*
-#unignore README.txt from test-materials-proprietary
-!/*/test-materials-proprietary/README.txt
-
-#ignore all files from lib-proprietary
-/*/lib-proprietary/*
-#unignore README.txt from lib-proprietary
-!/*/lib-proprietary/README.txt
diff --git a/connectors/activedirectory/.gitignore b/connectors/activedirectory/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/connectors/activedirectory/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/connectors/activedirectory/build.xml b/connectors/activedirectory/build.xml
deleted file mode 100644
index 5cc5aee..0000000
--- a/connectors/activedirectory/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="activedirectory" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-    
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="Active Directory"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.activedirectory.ActiveDirectoryAuthority"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/ActiveDirectoryAuthority.java b/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/ActiveDirectoryAuthority.java
deleted file mode 100644
index cb570c2..0000000
--- a/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/ActiveDirectoryAuthority.java
+++ /dev/null
@@ -1,1141 +0,0 @@
-/* $Id: ActiveDirectoryAuthority.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.activedirectory;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import javax.naming.*;
-import javax.naming.ldap.*;
-import javax.naming.directory.*;
-
-
-/** This is the Active Directory implementation of the IAuthorityConnector interface.
-* Access tokens for this connector are simple SIDs, except for the "global deny" token, which
-* is designed to allow the authority to shut off access to all authorized documents when the
-* user is unrecognized or the domain controller does not respond.
-*/
-public class ActiveDirectoryAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id: ActiveDirectoryAuthority.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Data from the parameters
-  
-  /** The list of suffixes and the associated domain controllers */
-  private List<DCRule> dCRules = null;
-  /** How to create a connection for a DC, keyed by DC name */
-  private Map<String,DCConnectionParameters> dCConnectionParameters = null;
-  
-  private boolean hasSessionParameters = false;
-  private String cacheLifetime = null;
-  private String cacheLRUsize = null;
-  private long responseLifetime = 60000L;
-  private int LRUsize = 1000;
-  private String ldapConnectionTimeout = null;
-
-  /** Session information for all DC's we talk with. */
-  private Map<String,DCSessionInfo> sessionInfo = null;
-  
-  /** Cache manager. */
-  private ICacheManager cacheManager = null;
-  
-  
-  /** The length of time in milliseconds that the connection remains idle before expiring.  Currently 5 minutes. */
-  private static final long expirationInterval = 300000L;
-  
-  /** Constructor.
-  */
-  public ActiveDirectoryAuthority()
-  {
-  }
-
-  /** Set thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-  
-  /** Clear thread context.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    cacheManager = null;
-  }
-  
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-    
-    // Allocate the session data, currently empty
-    sessionInfo = new HashMap<String,DCSessionInfo>();
-    
-    // Set up the DC param set, and the rules
-    dCRules = new ArrayList<DCRule>();
-    dCConnectionParameters = new HashMap<String,DCConnectionParameters>();
-    // For backwards compatibility, look at old-style parameters
-    String domainControllerName = params.getParameter(ActiveDirectoryConfig.PARAM_DOMAINCONTROLLER);
-    String userName = params.getParameter(ActiveDirectoryConfig.PARAM_USERNAME);
-    String password = params.getObfuscatedParameter(ActiveDirectoryConfig.PARAM_PASSWORD);
-    String authentication = params.getParameter(ActiveDirectoryConfig.PARAM_AUTHENTICATION);
-    String userACLsUsername = params.getParameter(ActiveDirectoryConfig.PARAM_USERACLsUSERNAME);
-    if (domainControllerName != null)
-    {
-      // Map the old-style parameters into the new-style structures.
-      dCConnectionParameters.put(domainControllerName,new DCConnectionParameters(userName,password,authentication,userACLsUsername));
-      // Create a single rule, too
-      dCRules.add(new DCRule("",domainControllerName));
-    }
-    else
-    {
-      // New-style parameters.  Read from the config info.
-      int i = 0;
-      while (i < params.getChildCount())
-      {
-        ConfigNode cn = params.getChild(i++);
-        if (cn.getType().equals(ActiveDirectoryConfig.NODE_DOMAINCONTROLLER))
-        {
-          // Domain controller name is the actual key...
-          String dcName = cn.getAttributeValue(ActiveDirectoryConfig.ATTR_DOMAINCONTROLLER);
-          // Set up the parameters for the domain controller
-          dCConnectionParameters.put(dcName,new DCConnectionParameters(cn.getAttributeValue(ActiveDirectoryConfig.ATTR_USERNAME),
-            deobfuscate(cn.getAttributeValue(ActiveDirectoryConfig.ATTR_PASSWORD)),
-            cn.getAttributeValue(ActiveDirectoryConfig.ATTR_AUTHENTICATION),
-            cn.getAttributeValue(ActiveDirectoryConfig.ATTR_USERACLsUSERNAME)));
-          // Order-based rule, as well
-          dCRules.add(new DCRule(cn.getAttributeValue(ActiveDirectoryConfig.ATTR_SUFFIX),dcName));
-        }
-      }
-    }
-
-    ldapConnectionTimeout = params.getParameter(ActiveDirectoryConfig.PARAM_LDAPCONNECTIONTIMEOUT);
-    if (ldapConnectionTimeout == null)
-      ldapConnectionTimeout = "60000";
-    cacheLifetime = params.getParameter(ActiveDirectoryConfig.PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    cacheLRUsize = params.getParameter(ActiveDirectoryConfig.PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";    
-  }
-
-  protected static String deobfuscate(String input)
-  {
-    if (input == null)
-      return null;
-    try
-    {
-      return ManifoldCF.deobfuscate(input);
-    }
-    catch (ManifoldCFException e)
-    {
-      return "";
-    }
-  }
-  
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Check connection for sanity.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    // Set up the basic session...
-    getSessionParameters();
-    // Clear the DC session info, so we're forced to redo it
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      sessionEntry.getValue().closeConnection();
-    }
-    // Loop through all domain controllers and attempt to establish a session with each one.
-    for (String domainController : dCConnectionParameters.keySet())
-    {
-      createDCSession(domainController);
-    }
-    return super.check();
-  }
-
-  /** Create or lookup a session for a domain controller.
-  */
-  protected LdapContext createDCSession(String domainController)
-    throws ManifoldCFException
-  {
-    getSessionParameters();
-    DCConnectionParameters parms = dCConnectionParameters.get(domainController);
-    // Find the session in the hash, if it exists
-    DCSessionInfo session = sessionInfo.get(domainController);
-    if (session == null)
-    {
-      session = new DCSessionInfo();
-      sessionInfo.put(domainController,session);
-    }
-    return session.getSession(domainController,parms,ldapConnectionTimeout);
-  }
-  
-  /** Poll.  The connection should be closed if it has been idle for too long.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    long currentTime = System.currentTimeMillis();
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      sessionEntry.getValue().closeIfExpired(currentTime);
-    }
-    super.poll();
-  }
-  
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      if (sessionEntry.getValue().isOpen())
-        return true;
-    }
-    return false;
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    hasSessionParameters = false;
-
-    // Close all connections
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      sessionEntry.getValue().closeConnection();
-    }
-    sessionInfo = null;
-    
-    cacheLifetime = null;
-    cacheLRUsize = null;
-    ldapConnectionTimeout = null;
-    super.disconnect();
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    // This sets up parameters we need to construct the response description
-    getSessionParameters();
-
-    // Construct a cache description object
-    ICacheDescription objectDescription = new AuthorizationResponseDescription(userName,
-      dCConnectionParameters,dCRules,this.responseLifetime,this.LRUsize);
-    
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-    try
-    {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try
-      {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-        if (response != null)
-          return response;
-        // Create the object.
-        response = getAuthorizationResponseUncached(userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle,objectDescription,response);
-        // And return it...
-        return response;
-      }
-      finally
-      {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-  
-  /** Obtain the access tokens for a given user name, uncached.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-    throws ManifoldCFException
-  {
-    //String searchBase = "CN=Administrator,CN=Users,DC=qa-ad-76,DC=metacarta,DC=com";
-    int index = userName.indexOf("@");
-    if (index == -1)
-      throw new ManifoldCFException("Username is in unexpected form (no @): '"+userName+"'");
-    String userPart = userName.substring(0,index);
-    String domainPart = userName.substring(index+1);
-    
-    // Now, look through the rules for the matching domain controller
-    String domainController = null;
-    for (DCRule rule : dCRules)
-    {
-      String suffix = rule.getSuffix();
-      if (suffix.length() == 0 || domainPart.toLowerCase(Locale.ROOT).endsWith(suffix.toLowerCase(Locale.ROOT)) &&
-        (suffix.length() == domainPart.length() || domainPart.charAt((domainPart.length()-suffix.length())-1) == '.'))
-      {
-        domainController = rule.getDomainControllerName();
-        break;
-      }
-    }
-    if (domainController == null)
-    {
-      // No domain controller found for the user, so return "user not found".
-      Logging.authorityConnectors.info("User not found: " + userName);
-      return RESPONSE_USERNOTFOUND;
-    }
-    
-    // Look up connection parameters
-    DCConnectionParameters dcParams = dCConnectionParameters.get(domainController);
-    if (dcParams == null)
-    {
-      // No domain controller, even though it's mentioned in a rule
-      Logging.authorityConnectors.info("User not found: " + userName);
-      return RESPONSE_USERNOTFOUND;
-    }
-    
-    // Use the complete fqn if the field is the "userPrincipalName"
-    String userACLsUsername = dcParams.getUserACLsUsername();
-    if (userACLsUsername != null && userACLsUsername.equals("userPrincipalName")){
-    	userPart = userName;
-    }
-    
-    //Build the DN searchBase from domain part
-    StringBuilder domainsb = new StringBuilder();
-    int j = 0;
-    while (true)
-    {
-      if (j > 0)
-        domainsb.append(",");
-
-      int k = domainPart.indexOf(".",j);
-      if (k == -1)
-      {
-        domainsb.append("DC=").append(ldapEscape(domainPart.substring(j)));
-        break;
-      }
-      domainsb.append("DC=").append(ldapEscape(domainPart.substring(j,k)));
-      j = k+1;
-    }
-
-    try
-    {
-      // Establish a session with the selected domain controller
-      LdapContext ctx = createDCSession(domainController);
-    
-      //Get DistinguishedName (for this method we are using DomainPart as a searchBase ie: DC=qa-ad-76,DC=metacarta,DC=com")
-      String searchBase = getDistinguishedName(ctx, userPart, domainsb.toString(), userACLsUsername);
-      if (searchBase == null) {
-        Logging.authorityConnectors.info("User not found: " + userName);
-        return RESPONSE_USERNOTFOUND;
-      }
-
-      //specify the LDAP search filter
-      String searchFilter = "(objectClass=user)";
-
-      //Create the search controls for finding the access tokens	
-      SearchControls searchCtls = new SearchControls();
-
-      //Specify the search scope, must be base level search for tokenGroups
-      searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
-   
-      //Specify the attributes to return
-      String returnedAtts[]={"tokenGroups","objectSid"};
-      searchCtls.setReturningAttributes(returnedAtts);
-
-      //Search for tokens.  Since every user *must* have a SID, the "no user" detection should be safe.
-      NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
-
-      ArrayList theGroups = new ArrayList();
-
-      //Loop through the search results
-      while (answer.hasMoreElements())
-      {
-        SearchResult sr = (SearchResult)answer.next();
- 
-        //the sr.GetName should be null, as it is relative to the base object
-        
-        Attributes attrs = sr.getAttributes();
-        if (attrs != null)
-        {
-          try
-          {
-            for (NamingEnumeration ae = attrs.getAll();ae.hasMore();) 
-            {
-              Attribute attr = (Attribute)ae.next();
-              for (NamingEnumeration e = attr.getAll();e.hasMore();)
-              {
-                theGroups.add(sid2String((byte[])e.next()));
-              }
-            }
- 
-          }	 
-          catch (NamingException e)
-          {
-            Logging.authorityConnectors.error("Naming exception: " + e.getMessage(), e);
-            throw new ManifoldCFException(e.getMessage(),e);
-          }
-				
-        }
-      }
-
-      if (theGroups.size() == 0) {
-        Logging.authorityConnectors.info("User not found: " + userName);
-        return RESPONSE_USERNOTFOUND;
-      }
-
-      // All users get certain well-known groups
-      theGroups.add("S-1-1-0");
-
-      String[] tokens = new String[theGroups.size()];
-      int k = 0;
-      while (k < tokens.length)
-      {
-        tokens[k] = (String)theGroups.get(k);
-        k++;
-      }
-      
-      return new AuthorizationResponse(tokens,AuthorizationResponse.RESPONSE_OK);
-
-    }
-    catch (NameNotFoundException e)
-    {
-      // This means that the user doesn't exist
-      Logging.authorityConnectors.error("User not found: " + userName + " Exception: " + e.getMessage(), e);
-      return RESPONSE_USERNOTFOUND;
-    }
-    catch (NamingException e)
-    {
-      // Unreachable
-      Logging.authorityConnectors.error("Response Unreachable: " + e.getMessage(), e);
-      return RESPONSE_UNREACHABLE;
-    }
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    // The default response if the getConnection method fails
-    return RESPONSE_UNREACHABLE;
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"ActiveDirectoryAuthority.DomainController"));
-    tabsArray.add(Messages.getString(locale,"ActiveDirectoryAuthority.Cache"));
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration.js",null);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TabName",tabName);
-    fillInDomainControllerTab(velocityContext,out,parameters);
-    fillInCacheTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_DomainController.html",velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Cache.html",velocityContext);
-  }
-  
-  protected static void fillInDomainControllerTab(Map<String,Object> velocityContext, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    String domainControllerName = parameters.getParameter(ActiveDirectoryConfig.PARAM_DOMAINCONTROLLER);
-    String userName = parameters.getParameter(ActiveDirectoryConfig.PARAM_USERNAME);
-    String password = parameters.getObfuscatedParameter(ActiveDirectoryConfig.PARAM_PASSWORD);
-    String authentication = parameters.getParameter(ActiveDirectoryConfig.PARAM_AUTHENTICATION);
-    String userACLsUsername = parameters.getParameter(ActiveDirectoryConfig.PARAM_USERACLsUSERNAME);
-    List<Map<String,String>> domainControllers = new ArrayList<Map<String,String>>();
-    
-    // Backwards compatibility: if domain controller parameter is set, create an entry in the map.
-    if (domainControllerName != null)
-    {
-      domainControllers.add(createDomainControllerMap(mapper,"",domainControllerName,userName,password,authentication,userACLsUsername));
-    }
-    else
-    {
-      // Go through nodes looking for DC nodes
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(ActiveDirectoryConfig.NODE_DOMAINCONTROLLER))
-        {
-          // Grab the info
-          String dcSuffix = cn.getAttributeValue(ActiveDirectoryConfig.ATTR_SUFFIX);
-          String dcDomainController = cn.getAttributeValue(ActiveDirectoryConfig.ATTR_DOMAINCONTROLLER);
-          String dcUserName = cn.getAttributeValue(ActiveDirectoryConfig.ATTR_USERNAME);
-          String dcPassword = deobfuscate(cn.getAttributeValue(ActiveDirectoryConfig.ATTR_PASSWORD));
-          String dcAuthentication = cn.getAttributeValue(ActiveDirectoryConfig.ATTR_AUTHENTICATION);
-          String dcUserACLsUsername = cn.getAttributeValue(ActiveDirectoryConfig.ATTR_USERACLsUSERNAME);
-          domainControllers.add(createDomainControllerMap(mapper,dcSuffix,dcDomainController,dcUserName,dcPassword,dcAuthentication,dcUserACLsUsername));
-        }
-      }
-    }
-    velocityContext.put("DOMAINCONTROLLERS",domainControllers);
-    String ldapConnectionTimeout = parameters.getParameter(ActiveDirectoryConfig.PARAM_LDAPCONNECTIONTIMEOUT);
-    if (ldapConnectionTimeout == null)
-      ldapConnectionTimeout = "60000";
-    velocityContext.put("LDAPCONNECTIONTIMEOUT", ldapConnectionTimeout);
-  }
-
-  protected static Map<String,String> createDomainControllerMap(IPasswordMapperActivity mapper, String suffix, String domainControllerName,
-    String userName, String password, String authentication, String userACLsUsername)
-  {
-    Map<String,String> defaultMap = new HashMap<String,String>();
-    if (suffix != null)
-      defaultMap.put("SUFFIX",suffix);
-    if (domainControllerName != null)
-      defaultMap.put("DOMAINCONTROLLER",domainControllerName);
-    if (userName != null)
-      defaultMap.put("USERNAME",userName);
-    if (password != null)
-      defaultMap.put("PASSWORD",mapper.mapPasswordToKey(password));
-    if (authentication != null)
-      defaultMap.put("AUTHENTICATION",authentication);
-    if (userACLsUsername != null)
-      defaultMap.put("USERACLsUSERNAME",userACLsUsername);
-    return defaultMap;
-  }
-  
-  protected static void fillInCacheTab(Map<String,Object> velocityContext, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    String cacheLifetime = parameters.getParameter(ActiveDirectoryConfig.PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    velocityContext.put("CACHELIFETIME",cacheLifetime);
-    String cacheLRUsize = parameters.getParameter(ActiveDirectoryConfig.PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";
-    velocityContext.put("CACHELRUSIZE",cacheLRUsize);
-  }
-
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String x = variableContext.getParameter("dcrecord_count");
-    if (x != null)
-    {
-      // Delete old stuff
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_DOMAINCONTROLLER,null);
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_USERNAME,null);
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_PASSWORD,null);
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_AUTHENTICATION,null);
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_USERACLsUSERNAME,null);
-      // Delete old nodes
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i);
-        if (cn.getType().equals(ActiveDirectoryConfig.NODE_DOMAINCONTROLLER))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      // Scan form fields and apply operations
-      int count = Integer.parseInt(x);
-      i = 0;
-      String op;
-      
-      Set<String> seenDomains = new HashSet<String>();
-      
-      while (i < count)
-      {
-        op = variableContext.getParameter("dcrecord_op_"+i);
-        if (op != null && op.equals("Insert"))
-        {
-          // Insert a new record right here
-          addDomainController(seenDomains,parameters,
-            variableContext.getParameter("dcrecord_suffix"),
-            variableContext.getParameter("dcrecord_domaincontrollername"),
-            variableContext.getParameter("dcrecord_username"),
-            variableContext.mapKeyToPassword(variableContext.getParameter("dcrecord_password")),
-            variableContext.getParameter("dcrecord_authentication"),
-            variableContext.getParameter("dcrecord_userACLsUsername"));
-        }
-        if (op == null || !op.equals("Delete"))
-        {
-          // Add this record back in
-          addDomainController(seenDomains,parameters,
-            variableContext.getParameter("dcrecord_suffix_"+i),
-            variableContext.getParameter("dcrecord_domaincontrollername_"+i),
-            variableContext.getParameter("dcrecord_username_"+i),
-            variableContext.mapKeyToPassword(variableContext.getParameter("dcrecord_password_"+i)),
-            variableContext.getParameter("dcrecord_authentication_"+i),
-            variableContext.getParameter("dcrecord_userACLsUsername_"+i));
-        }
-        i++;
-      }
-      op = variableContext.getParameter("dcrecord_op");
-      if (op != null && op.equals("Add"))
-      {
-        // Insert a new record right here
-        addDomainController(seenDomains,parameters,
-          variableContext.getParameter("dcrecord_suffix"),
-          variableContext.getParameter("dcrecord_domaincontrollername"),
-          variableContext.getParameter("dcrecord_username"),
-          variableContext.getParameter("dcrecord_password"),
-          variableContext.getParameter("dcrecord_authentication"),
-          variableContext.getParameter("dcrecord_userACLsUsername"));
-      }
-    }
-    String ldapConnectionTimeout = variableContext.getParameter("ldapconnectiontimeout");
-    if (ldapConnectionTimeout != null)
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_LDAPCONNECTIONTIMEOUT,ldapConnectionTimeout);
-    String cacheLifetime = variableContext.getParameter("cachelifetime");
-    if (cacheLifetime != null)
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_CACHELIFETIME,cacheLifetime);
-    String cacheLRUsize = variableContext.getParameter("cachelrusize");
-    if (cacheLRUsize != null)
-      parameters.setParameter(ActiveDirectoryConfig.PARAM_CACHELRUSIZE,cacheLRUsize);
-    
-    return null;
-  }
-  
-  protected static void addDomainController(Set<String> seenDomains, ConfigParams parameters,
-    String suffix, String domainControllerName, String userName, String password, String authentication,
-    String userACLsUsername)
-    throws ManifoldCFException
-  {
-    if (!seenDomains.contains(domainControllerName))
-    {
-      ConfigNode cn = new ConfigNode(ActiveDirectoryConfig.NODE_DOMAINCONTROLLER);
-      cn.setAttribute(ActiveDirectoryConfig.ATTR_SUFFIX,suffix);
-      cn.setAttribute(ActiveDirectoryConfig.ATTR_DOMAINCONTROLLER,domainControllerName);
-      cn.setAttribute(ActiveDirectoryConfig.ATTR_USERNAME,userName);
-      cn.setAttribute(ActiveDirectoryConfig.ATTR_PASSWORD,ManifoldCF.obfuscate(password));
-      cn.setAttribute(ActiveDirectoryConfig.ATTR_AUTHENTICATION,authentication);
-      cn.setAttribute(ActiveDirectoryConfig.ATTR_USERACLsUSERNAME,userACLsUsername);
-      parameters.addChild(parameters.getChildCount(),cn);
-      seenDomains.add(domainControllerName);
-    }
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    fillInDomainControllerTab(velocityContext,out,parameters);
-    fillInCacheTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"viewConfiguration.html",velocityContext);
-  }
-
-  // Protected methods
-
-  /** Get parameters needed for caching.
-  */
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (!hasSessionParameters)
-    {
-      try
-      {
-        responseLifetime = Long.parseLong(this.cacheLifetime) * 60L * 1000L;
-        LRUsize = Integer.parseInt(this.cacheLRUsize);
-      }
-      catch (NumberFormatException e)
-      {
-        Logging.authorityConnectors.error("Cache lifetime or Cache LRU size must be an integer: " + e.getMessage(), e);
-        throw new ManifoldCFException("Cache lifetime or Cache LRU size must be an integer: "+e.getMessage(),e);
-      }
-      hasSessionParameters = true;
-    }
-  }
-  
-  
-  /** Obtain the DistinguishedName for a given user logon name.
-  *@param ctx is the ldap context to use.
-  *@param userName (Domain Logon Name) is the user name or identifier.
-  *@param searchBase (Full Domain Name for the search ie: DC=qa-ad-76,DC=metacarta,DC=com)
-  *@return DistinguishedName for given domain user logon name. 
-  * (Should throws an exception if user is not found.)
-  */
-  protected String getDistinguishedName(LdapContext ctx, String userName, String searchBase, String userACLsUsername)
-    throws ManifoldCFException
-  {
-    String returnedAtts[] = {"distinguishedName"};
-    String searchFilter = "(&(objectClass=user)(" + userACLsUsername + "=" + userName + "))";
-    SearchControls searchCtls = new SearchControls();
-    searchCtls.setReturningAttributes(returnedAtts);
-    //Specify the search scope  
-    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-    searchCtls.setReturningAttributes(returnedAtts);
-
-    try
-    {
-      NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
-      while (answer.hasMoreElements())
-      {
-        SearchResult sr = (SearchResult)answer.next();
-        Attributes attrs = sr.getAttributes();
-        if (attrs != null)
-        {
-          String dn = attrs.get("distinguishedName").get().toString();
-          return dn;
-        }
-      }
-      return null;
-    }
-    catch (NamingException e)
-    {
-      Logging.authorityConnectors.error("Naming exception: " + e.getMessage(), e);
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-   
-  /** LDAP escape a string.
-  */
-  protected static String ldapEscape(String input)
-  {
-    //Add escape sequence to all commas
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      int oldIndex = index;
-      index = input.indexOf(",",oldIndex);
-      if (index == -1)
-      {
-        sb.append(input.substring(oldIndex));
-        break;
-      }
-      sb.append(input.substring(oldIndex,index)).append("\\,");
-      index++;
-    }
-    return sb.toString();
-  }
-    	
-  /** Convert a binary SID to a string */
-  protected static String sid2String(byte[] SID)
-  {
-    StringBuilder strSID = new StringBuilder("S");
-    long version = SID[0];
-    strSID.append("-").append(Long.toString(version));
-    long authority = SID[4];
-    for (int i = 0;i<4;i++)
-    {
-      authority <<= 8;
-      authority += SID[4+i] & 0xFF;
-    }
-    strSID.append("-").append(Long.toString(authority));
-    long count = SID[2];
-    count <<= 8;
-    count += SID[1] & 0xFF;
-    for (int j=0;j<count;j++)
-    {
-      long rid = SID[11 + (j*4)] & 0xFF;
-      for (int k=1;k<4;k++)
-      {
-        rid <<= 8;
-        rid += SID[11-k + (j*4)] & 0xFF;
-      }
-      strSID.append("-").append(Long.toString(rid));
-    }
-    return strSID.toString();
-  }
-
-  /** Class representing the session information for a specific domain controller
-  * connection.
-  */
-  protected static class DCSessionInfo
-  {
-    /** The initialized LDAP context (which functions as a session) */
-    private LdapContext ctx = null;
-    /** The time of last access to this ctx object */
-    private long expiration = -1L;
-    
-    public DCSessionInfo()
-    {
-    }
-
-    /** Initialize the session. */
-    public LdapContext getSession(String domainControllerName, DCConnectionParameters params, String ldapConnectionTimeout)
-      throws ManifoldCFException
-    {
-      String authentication = params.getAuthentication();
-      String userName = params.getUserName();
-      String password = params.getPassword();
-      
-      while (true)
-      {
-        if (ctx == null)
-        {
-          // Calculate the ldap url first
-          String ldapURL = "ldap://" + domainControllerName + ":389";
-          
-          Hashtable env = new Hashtable();
-          env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
-          env.put(Context.SECURITY_AUTHENTICATION,authentication);      
-          env.put(Context.SECURITY_PRINCIPAL,userName);
-          env.put(Context.SECURITY_CREDENTIALS,password);
-                                    
-          //connect to my domain controller
-          env.put(Context.PROVIDER_URL,ldapURL);
-                    
-          //specify attributes to be returned in binary format
-          env.put("java.naming.ldap.attributes.binary","tokenGroups objectSid");
-
-          env.put("com.sun.jndi.ldap.connect.timeout", ldapConnectionTimeout);
-          
-          // Now, try the connection...
-          try
-          {
-            Logging.authorityConnectors.info("LDAP Context environment properties: " + printLdapContextEnvironment(env));
-            ctx = new InitialLdapContext(env,null);
-            // If successful, break
-            break;
-          }
-          catch (AuthenticationException e)
-          {
-            // This means we couldn't authenticate!
-            Logging.authorityConnectors.error("Authentication problem authenticating admin user '"+userName+"': "+e.getMessage(),e);
-            throw new ManifoldCFException("Authentication problem authenticating admin user '"+userName+"': "+e.getMessage(),e);
-          }
-          catch (CommunicationException e)
-          {
-            // This means we couldn't connect, most likely
-            Logging.authorityConnectors.error("Couldn't communicate with domain controller '"+domainControllerName+"': "+e.getMessage(),e);
-            throw new ManifoldCFException("Couldn't communicate with domain controller '"+domainControllerName+"': "+e.getMessage(),e);
-          }
-          catch (NamingException e)
-          {
-            Logging.authorityConnectors.error("Naming exception: " + e.getMessage(), e);
-            throw new ManifoldCFException(e.getMessage(),e);
-          }
-        }
-        else
-        {
-          // Attempt to reconnect.  I *hope* this is efficient and doesn't do unnecessary work.
-          try
-          {
-            ctx.reconnect(null);
-            // Break on apparent success
-            break;
-          }
-          catch (AuthenticationException e)
-          {
-            // This means we couldn't authenticate!  Log it and retry creating a whole new context.
-            Logging.authorityConnectors.error("Authentication exception: " + e.getMessage() + ", explanation: " + e.getExplanation(), e);
-          }
-          catch (CommunicationException e)
-          {
-            // This means we couldn't connect, most likely.  Log it and retry creating a whole new context.
-            Logging.authorityConnectors.error("Communication exception: " + e.getMessage() + ", explanation: " + e.getExplanation(), e);
-          }
-          catch (NamingException e)
-          {
-            Logging.authorityConnectors.error("Naming exception: " + e.getMessage() + ", explanation: " + e.getExplanation(), e);
-          }
-          
-          // So we have no chance of leaking resources, attempt to close the context.
-          closeConnection();
-          // Loop back around to try our luck with a fresh connection.
-
-        }
-      }
-      
-      // Set the expiration time anew
-      expiration = System.currentTimeMillis() + expirationInterval;
-      return ctx;
-    }
-    
-    /** Close the connection handle. */
-    protected void closeConnection()
-    {
-      if (ctx != null)
-      {
-        try
-        {
-          ctx.close();
-        }
-        catch (NamingException e)
-        {
-          // Eat this error
-        }
-        ctx = null;
-        expiration = -1L;
-      }
-    }
-
-    /** Close connection if it has expired. */
-    protected void closeIfExpired(long currentTime)
-    {
-      if (expiration != -1L && currentTime > expiration)
-        closeConnection();
-    }
-
-    /** Check if open */
-    protected boolean isOpen()
-    {
-      return ctx != null;
-    }
-
-    /**
-     * Stringifies LDAP Context environment variable
-     * @param env LDAP Context environment variable
-     * @return Stringified LDAP Context environment. Password is masked if set.
-     */
-    private String printLdapContextEnvironment(Hashtable env) {
-      Hashtable copyEnv = new Hashtable<>(env);
-      if (copyEnv.containsKey(Context.SECURITY_CREDENTIALS)){
-        copyEnv.put(Context.SECURITY_CREDENTIALS, "********");
-      }
-      return Arrays.toString(copyEnv.entrySet().toArray());
-    }
-  }
-
-  /** Class describing a domain suffix and corresponding domain controller name rule.
-  */
-  protected static class DCRule
-  {
-    private String suffix;
-    private String domainControllerName;
-    
-    public DCRule(String suffix, String domainControllerName)
-    {
-      this.suffix = suffix;
-      this.domainControllerName = domainControllerName;
-    }
-    
-    public String getSuffix()
-    {
-      return suffix;
-    }
-    
-    public String getDomainControllerName()
-    {
-      return domainControllerName;
-    }
-  }
-  
-  /** Class describing the connection parameters to a domain controller.
-  */
-  protected static class DCConnectionParameters
-  {
-    private String userName;
-    private String password;
-    private String authentication;
-    private String userACLsUsername;
-
-    public DCConnectionParameters(String userName, String password, String authentication, String userACLsUsername)
-    {
-      this.userName = userName;
-      this.password = password;
-      this.authentication = authentication;
-      this.userACLsUsername = userACLsUsername;
-    }
-    
-    public String getUserName()
-    {
-      return userName;
-    }
-    
-    public String getPassword()
-    {
-      return password;
-    }
-    
-    public String getAuthentication()
-    {
-      return authentication;
-    }
-    
-    public String getUserACLsUsername()
-    {
-      return userACLsUsername;
-    }
-  }
-  
-  protected static StringSet emptyStringSet = new StringSet();
-  
-  /** This is the cache object descriptor for cached access tokens from
-  * this connector.
-  */
-  protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    /** The user name */
-    protected String userName;
-    /** Connection parameters */
-    protected Map<String,DCConnectionParameters> dcConnectionParams;
-    /** Rules */
-    protected List<DCRule> dcRules;
-    /** The response lifetime */
-    protected long responseLifetime;
-    /** The expiration time */
-    protected long expirationTime = -1;
-    
-    /** Constructor. */
-    public AuthorizationResponseDescription(String userName, Map<String,DCConnectionParameters> dcConnectionParams,
-      List<DCRule> dcRules, long responseLifetime, int LRUsize)
-    {
-      super("ActiveDirectoryAuthority",LRUsize);
-      this.userName = userName;
-      this.dcConnectionParams = dcConnectionParams;
-      this.dcRules = dcRules;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /** Return the invalidation keys for this object. */
-    public StringSet getObjectKeys()
-    {
-      return emptyStringSet;
-    }
-
-    /** Get the critical section name, used for synchronizing the creation of the object */
-    public String getCriticalSectionName()
-    {
-      StringBuilder sb = new StringBuilder(getClass().getName());
-      sb.append("-").append(userName);
-      for (DCRule rule : dcRules)
-      {
-        sb.append("-").append(rule.getSuffix());
-        String domainController = rule.getDomainControllerName();
-        DCConnectionParameters params = dcConnectionParams.get(domainController);
-        sb.append("-").append(domainController).append("-").append(params.getUserName()).append("-").append(params.getPassword());
-      }
-      return sb.toString();
-    }
-
-    /** Return the object expiration interval */
-    public long getObjectExpirationTime(long currentTime)
-    {
-      if (expirationTime == -1)
-        expirationTime = currentTime + responseLifetime;
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      int rval = userName.hashCode();
-      for (DCRule rule : dcRules)
-      {
-        String domainController = rule.getDomainControllerName();
-        DCConnectionParameters params = dcConnectionParams.get(domainController);
-        rval += rule.getSuffix().hashCode() + domainController.hashCode() + params.getUserName().hashCode() + params.getPassword().hashCode();
-      }
-      return rval;
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorizationResponseDescription))
-        return false;
-      AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-      if (!ard.userName.equals(userName))
-        return false;
-      if (ard.dcRules.size() != dcRules.size())
-        return false;
-      for (int i = 0 ; i < dcRules.size() ; i++)
-      {
-        DCRule rule = dcRules.get(i);
-        DCRule ardRule = ard.dcRules.get(i);
-        if (!rule.getSuffix().equals(ardRule.getSuffix()) || !rule.getDomainControllerName().equals(ardRule.getDomainControllerName()))
-          return false;
-        String domainController = rule.getDomainControllerName();
-        DCConnectionParameters params = dcConnectionParams.get(domainController);
-        DCConnectionParameters ardParams = ard.dcConnectionParams.get(domainController);
-        if (!params.getUserName().equals(ardParams.getUserName()) || !params.getPassword().equals(ardParams.getPassword()))
-          return false;
-      }
-      return true;
-    }
-    
-  }
-  
-}
-
-
diff --git a/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/ActiveDirectoryConfig.java b/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/ActiveDirectoryConfig.java
deleted file mode 100644
index 5b85048..0000000
--- a/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/ActiveDirectoryConfig.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: ActiveDirectoryConfig.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.activedirectory;
-
-
-/** Parameters and output data for Active Directory authority.
-*/
-public class ActiveDirectoryConfig
-{
-  public static final String _rcsid = "@(#)$Id: ActiveDirectoryConfig.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Configuration parameters
-
-  /** Domain controller */
-  public static final String PARAM_DOMAINCONTROLLER = "Domain controller";
-  /** Administrative user name */
-  public static final String PARAM_USERNAME = "User name";
-  /** Administrative password */
-  public static final String PARAM_PASSWORD = "Password";
-  /** Authentication */
-  public static final String PARAM_AUTHENTICATION = "Authentication";
-  /** UserACLs username attribute */
-  public static final String PARAM_USERACLsUSERNAME = "UserACLs username attribute";
-  /** Cache lifetime */
-  public static final String PARAM_CACHELIFETIME = "Cache lifetime";
-  /** Cache LRU size */
-  public static final String PARAM_CACHELRUSIZE = "Cache LRU size";
-  /** LDAP connection timeout*/
-  public static final String PARAM_LDAPCONNECTIONTIMEOUT = "LDAP connection timeout";
-
-  /** Domain controller node */
-  public static final String NODE_DOMAINCONTROLLER = "domaincontroller";
-  
-  // Attributes
-  
-  /** Domain suffix */
-  public static final String ATTR_SUFFIX = "suffix";
-  /** DC server name */
-  public static final String ATTR_DOMAINCONTROLLER = "domaincontroller";
-  /** DC user name */
-  public static final String ATTR_USERNAME = "username";
-  /** DC password */
-  public static final String ATTR_PASSWORD = "password";
-  /** DC authentication method */
-  public static final String ATTR_AUTHENTICATION = "authentication";
-  /** DC user acls username attribute name */
-  public static final String ATTR_USERACLsUSERNAME = "useraclsusername";
-
-}
diff --git a/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/Messages.java b/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/Messages.java
deleted file mode 100644
index 322bf56..0000000
--- a/connectors/activedirectory/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/activedirectory/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.activedirectory;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.activedirectory.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.activedirectory";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_en_US.properties b/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_en_US.properties
deleted file mode 100644
index 3661702..0000000
--- a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_en_US.properties
+++ /dev/null
@@ -1,61 +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.
-
-ActiveDirectoryAuthority.DomainController=Domain Controller
-ActiveDirectoryAuthority.Cache=Cache
-ActiveDirectoryAuthority.DomainControllers=Domain Controllers:
-ActiveDirectoryAuthority.DomainControllerName=Domain controller name
-ActiveDirectoryAuthority.DomainSuffix=Domain suffix
-ActiveDirectoryAuthority.AdministrativeUserName=Administrative user name
-ActiveDirectoryAuthority.AdministrativePassword=Administrative password
-ActiveDirectoryAuthority.Authentication=Authentication
-ActiveDirectoryAuthority.LoginNameADAttribute=Login name AD attribute
-ActiveDirectoryAuthority.CacheLifetime=Cache lifetime:
-ActiveDirectoryAuthority.CacheLRUSize=Cache LRU size:
-ActiveDirectoryAuthority.minutes=minutes
-ActiveDirectoryAuthority.AddToEnd=Add to End
-ActiveDirectoryAuthority.AddRuleToEnd=Add rule to end of list
-ActiveDirectoryAuthority.Delete=Delete
-ActiveDirectoryAuthority.DeleteRuleNumber=Delete rule #
-ActiveDirectoryAuthority.InsertBefore=Insert Before
-ActiveDirectoryAuthority.InsertBeforeRuleNumber=Insert before rule #
-ActiveDirectoryAuthority.EnterADomainControllerServerName=Enter a domain controller server name
-ActiveDirectoryAuthority.Domain Controller2=Domain Controller
-ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull=Administrative user name cannot be null
-ActiveDirectoryAuthority.AuthenticationCannotBeNull=Authentication cannot be null
-ActiveDirectoryAuthority.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-ActiveDirectoryAuthority.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-ActiveDirectoryAuthority.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-ActiveDirectoryAuthority.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-ActiveDirectoryAuthority.certificate=certificate(s)
-ActiveDirectoryAuthority.ConnectionTimeout=Connection timeout:
-ActiveDirectoryAuthority.ConnectionTimeoutMustBeAnInteger=Connection timeout value must be an integer
-ActiveDirectoryAuthority.milliseconds=milliseconds
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_es_ES.properties b/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_es_ES.properties
deleted file mode 100644
index 817a53f..0000000
--- a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_es_ES.properties
+++ /dev/null
@@ -1,61 +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.
-
-ActiveDirectoryAuthority.DomainController=Controlador de Dominio
-ActiveDirectoryAuthority.Cache=Caché
-ActiveDirectoryAuthority.DomainControllers=Controlador de Dominio:
-ActiveDirectoryAuthority.DomainControllerName=Nombre del Controlador de Dominio
-ActiveDirectoryAuthority.DomainSuffix=Sufijo de Dominio
-ActiveDirectoryAuthority.AdministrativeUserName=Nombre de Usuario Administrativo
-ActiveDirectoryAuthority.AdministrativePassword=Contraseña Administrativa
-ActiveDirectoryAuthority.Authentication=Autenticación
-ActiveDirectoryAuthority.LoginNameADAttribute=Atributo AD Iniciar sesión Nombre
-ActiveDirectoryAuthority.CacheLifetime=Vida útil de la caché:
-ActiveDirectoryAuthority.CacheLRUSize=Tamaño de caché LRU:
-ActiveDirectoryAuthority.minutes=minutos
-ActiveDirectoryAuthority.AddToEnd=Añadir a Terminar
-ActiveDirectoryAuthority.AddRuleToEnd=Añadir regla a final de la lista
-ActiveDirectoryAuthority.Delete=Borrar
-ActiveDirectoryAuthority.DeleteRuleNumber=Eliminar regla #
-ActiveDirectoryAuthority.InsertBefore=Insertar antes
-ActiveDirectoryAuthority.InsertBeforeRuleNumber=Inserte antes de la regla #
-ActiveDirectoryAuthority.EnterADomainControllerServerName=Introduzca un nombre de servidor de controlador de dominio
-ActiveDirectoryAuthority.Domain Controller2=Controlador de Dominio
-ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull=Nombre de usuario administrativo no puede ser nulo
-ActiveDirectoryAuthority.AuthenticationCannotBeNull=Autenticación no puede ser nulo
-ActiveDirectoryAuthority.CacheLifetimeCannotBeNull=Vida útil de la caché no puede ser nulo
-ActiveDirectoryAuthority.CacheLifetimeMustBeAnInteger=Vida útil de la caché debe ser un entero
-ActiveDirectoryAuthority.CacheLRUSizeCannotBeNull=Tamaño de caché LRU no puede ser nulo
-ActiveDirectoryAuthority.CacheLRUSizeMustBeAnInteger=Tamaño de caché LRU debe ser un entero
-ActiveDirectoryAuthority.certificate=certificado(s)
-ActiveDirectoryAuthority.ConnectionTimeout=Connection timeout:
-ActiveDirectoryAuthority.ConnectionTimeoutMustBeAnInteger=Connection timeout value must be an integer
-ActiveDirectoryAuthority.milliseconds=milliseconds
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_ja_JP.properties b/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_ja_JP.properties
deleted file mode 100644
index beb5c87..0000000
--- a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_ja_JP.properties
+++ /dev/null
@@ -1,45 +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.
-
-ActiveDirectoryAuthority.DomainController=ドメインコントローラ
-ActiveDirectoryAuthority.Cache=キャッシュ
-ActiveDirectoryAuthority.DomainControllers=ドメインコントローラ:
-ActiveDirectoryAuthority.DomainControllerName=ドメインコントローラ名
-ActiveDirectoryAuthority.DomainSuffix=ドメインサフィックス
-ActiveDirectoryAuthority.AdministrativeUserName=管理者名
-ActiveDirectoryAuthority.AdministrativePassword=管理者パスワード
-ActiveDirectoryAuthority.Authentication=認証
-ActiveDirectoryAuthority.LoginNameADAttribute=ログイン名AD属性
-ActiveDirectoryAuthority.CacheLifetime=キャッシュライフタイム:
-ActiveDirectoryAuthority.CacheLRUSize=キャッシュLRUサイズ:
-ActiveDirectoryAuthority.minutes=分
-ActiveDirectoryAuthority.AddToEnd=最後に追加
-ActiveDirectoryAuthority.AddRuleToEnd=リストの最後にルールを追加
-ActiveDirectoryAuthority.Delete=削除
-ActiveDirectoryAuthority.DeleteRuleNumber=ルール # を削除
-ActiveDirectoryAuthority.InsertBefore=前に挿入
-ActiveDirectoryAuthority.InsertBeforeRuleNumber=ルール # の前に挿入
-ActiveDirectoryAuthority.EnterADomainControllerServerName=ドメインコントローラ名を入力してください
-ActiveDirectoryAuthority.Domain Controller2=ドメインコントローラ
-ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull=管理者名を入力してください
-ActiveDirectoryAuthority.AuthenticationCannotBeNull=認証情報を入力してください
-ActiveDirectoryAuthority.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-ActiveDirectoryAuthority.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-ActiveDirectoryAuthority.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-ActiveDirectoryAuthority.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
-ActiveDirectoryAuthority.certificate=証明書
-ActiveDirectoryAuthority.ConnectionTimeout=Connection timeout:
-ActiveDirectoryAuthority.ConnectionTimeoutMustBeAnInteger=Connection timeout value must be an integer
-ActiveDirectoryAuthority.milliseconds=milliseconds
diff --git a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_zh_CN.properties b/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_zh_CN.properties
deleted file mode 100644
index 6e031a2..0000000
--- a/connectors/activedirectory/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/activedirectory/common_zh_CN.properties
+++ /dev/null
@@ -1,45 +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.
-
-ActiveDirectoryAuthority.DomainController=域控制器
-ActiveDirectoryAuthority.Cache=缓存
-ActiveDirectoryAuthority.DomainControllers=域控制器:
-ActiveDirectoryAuthority.DomainControllerName=域控制器名
-ActiveDirectoryAuthority.DomainSuffix=域后缀
-ActiveDirectoryAuthority.AdministrativeUserName=管理员名
-ActiveDirectoryAuthority.AdministrativePassword=管理员密码
-ActiveDirectoryAuthority.Authentication=认证
-ActiveDirectoryAuthority.LoginNameADAttribute=登录名AD属性
-ActiveDirectoryAuthority.CacheLifetime=缓存寿命: 
-ActiveDirectoryAuthority.CacheLRUSize=缓存LRU大小: 
-ActiveDirectoryAuthority.minutes=分
-ActiveDirectoryAuthority.AddToEnd=添加到末尾
-ActiveDirectoryAuthority.AddRuleToEnd=添加规则到列表末尾
-ActiveDirectoryAuthority.Delete=删除
-ActiveDirectoryAuthority.DeleteRuleNumber=删除规则 #
-ActiveDirectoryAuthority.InsertBefore=向前插入
-ActiveDirectoryAuthority.InsertBeforeRuleNumber=插入到规则号的前面 #
-ActiveDirectoryAuthority.EnterADomainControllerServerName=请输入域控制器服务器名
-ActiveDirectoryAuthority.Domain Controller2=域控制器
-ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull=请输入管理员名
-ActiveDirectoryAuthority.AuthenticationCannotBeNull=请输入认证信息
-ActiveDirectoryAuthority.CacheLifetimeCannotBeNull=请输入缓存寿命
-ActiveDirectoryAuthority.CacheLifetimeMustBeAnInteger=缓存寿命必须为整数
-ActiveDirectoryAuthority.CacheLRUSizeCannotBeNull=请输入缓存LRU大小
-ActiveDirectoryAuthority.CacheLRUSizeMustBeAnInteger=缓存LRU大小必须为整数
-ActiveDirectoryAuthority.certificate=证书
-ActiveDirectoryAuthority.ConnectionTimeout=Connection timeout:
-ActiveDirectoryAuthority.ConnectionTimeoutMustBeAnInteger=Connection timeout value must be an integer
-ActiveDirectoryAuthority.milliseconds=milliseconds
diff --git a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration.js b/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration.js
deleted file mode 100644
index 5683d58..0000000
--- a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration.js
+++ /dev/null
@@ -1,141 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  var i = 0;
-  var count = editconnection.dcrecord_count.value;
-  while (i < count)
-  {
-    var username = eval("editconnection.dcrecord_username_"+i+".value");
-    if (username == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull'))");
-      eval("editconnection.dcrecord_username_"+i+".focus()");
-      return false;
-    }
-    var authentication = eval("editconnection.dcrecord_authentication_"+i+".value");
-    if (authentication == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AuthenticationCannotBeNull'))");
-      eval("editconnection.dcrecord_authentication_"+i+".focus()");
-      return false;
-    }
-    i += 1;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.cachelifetime.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLifetimeCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Cache'))");
-    editconnection.cachelifetime.focus();
-    return false;
-  }
-  if (editconnection.cachelifetime.value != "" && !isInteger(editconnection.cachelifetime.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLifetimeMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Cache'))");
-    editconnection.cachelifetime.focus();
-    return false;
-  }
-  if (editconnection.cachelrusize.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLRUSizeCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Cache'))");
-    editconnection.cachelrusize.focus();
-    return false;
-  }
-  if (editconnection.cachelrusize.value != "" && !isInteger(editconnection.cachelrusize.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLRUSizeMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Cache'))");
-    editconnection.cachelrusize.focus();
-    return false;
-  }
-  if (editconnection.ldapconnectiontimeout.value != "" && !isInteger(editconnection.ldapconnectiontimeout.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.ConnectionTimeoutMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainController'))");
-    editconnection.ldapconnectiontimeout.focus();
-    return false;
-  }
-  return true;
-}
-
-function deleteDC(i)
-{
-  eval("editconnection.dcrecord_op_"+i+".value=\"Delete\"");
-  postFormSetAnchor("dcrecord");
-}
-
-function insertDC(i)
-{
-  if (editconnection.dcrecord_domaincontrollername.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.EnterADomainControllerServerName'))");
-    editconnection.dcrecord_domaincontrollername.focus();
-    return;
-  }
-  if (editconnection.dcrecord_username.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull'))");
-    editconnection.dcrecord_username.focus();
-    return;
-  }
-  if (editconnection.dcrecord_authentication.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AuthenticationCannotBeNull'))");
-    editconnection.dcrecord_authentication.focus();
-    return;
-  }
-  eval("editconnection.dcrecord_op_"+i+".value=\"Insert\"");
-  postFormSetAnchor("dcrecord_"+i);
-}
-
-function addDC()
-{
-  if (editconnection.dcrecord_domaincontrollername.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.EnterADomainControllerServerName'))");
-    editconnection.dcrecord_domaincontrollername.focus();
-    return;
-  }
-  if (editconnection.dcrecord_username.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativeUserNameCannotBeNull'))");
-    editconnection.dcrecord_username.focus();
-    return;
-  }
-  if (editconnection.dcrecord_authentication.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AuthenticationCannotBeNull'))");
-    editconnection.dcrecord_authentication.focus();
-    return;
-  }
-  editconnection.dcrecord_op.value="Add";
-  postFormSetAnchor("dcrecord");
-}
-
-//-->
-</script>
-
diff --git a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration_Cache.html b/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration_Cache.html
deleted file mode 100644
index f967744..0000000
--- a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration_Cache.html
+++ /dev/null
@@ -1,37 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('ActiveDirectoryAuthority.Cache'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLifetime'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/> $Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.minutes'))</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLRUSize'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/>
-<input type="hidden" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/>
-
-#end
diff --git a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration_DomainController.html b/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration_DomainController.html
deleted file mode 100644
index 8d4f015..0000000
--- a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/editConfiguration_DomainController.html
+++ /dev/null
@@ -1,138 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('ActiveDirectoryAuthority.DomainController'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainControllers'))</td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainControllerName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainSuffix'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativeUserName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativePassword'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Authentication'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.LoginNameADAttribute'))</td>
-        </tr>
-  #set($dccounter = 0)
-  #foreach($domaincontroller in $DOMAINCONTROLLERS)
-    #if(($dccounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <a name="dcrecord_$dccounter">
-              <nobr>
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Delete'))"
-                alt="$Encoder.attributeEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DeleteRuleNumber'))$dccounter" onclick="javascript:deleteDC($dccounter);"/>
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ActiveDirectoryAuthority.InsertBefore'))"
-                alt="$Encoder.attributeEscape($ResourceBundle.getString('ActiveDirectoryAuthority.InsertBeforeRuleNumber'))$dccounter" onclick="javascript:insertDC($dccounter);"/>
-              </nobr>
-            </a>
-            <input type="hidden" name="dcrecord_op_$dccounter" value="Continue"/>
-            <input type="hidden" name="dcrecord_domaincontrollername_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('DOMAINCONTROLLER'))"/>
-          </td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('DOMAINCONTROLLER'))</nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_suffix_$dccounter" type="text" size="10" value="$Encoder.attributeEscape($domaincontroller.get('SUFFIX'))"/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_username_$dccounter" type="text" size="10" value="$Encoder.attributeEscape($domaincontroller.get('USERNAME'))"/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_password_$dccounter" type="password" size="6" value="$Encoder.attributeEscape($domaincontroller.get('PASSWORD'))"/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_authentication_$dccounter" type="text" size="10" value="$Encoder.attributeEscape($domaincontroller.get('AUTHENTICATION'))"/></nobr></td>
-          <td class="formcolumncell">
-            <nobr>
-              <select name="dcrecord_userACLsUsername_$dccounter">
-    #if($domaincontroller.get('USERACLsUSERNAME') == 'sAMAccountName')
-                <option value="sAMAccountName" selected="true">
-    #else
-                <option value="sAMAccountName">
-    #end
-                  sAMAccountName
-                </option>
-    #if($domaincontroller.get('USERACLsUSERNAME') == 'userPrincipalName')
-                <option value="userPrincipalName" selected="true">
-    #else
-                <option value="userPrincipalName">
-    #end
-                  userPrincipalName
-                </option>
-              </select>
-            </nobr>
-          </td>
-        </tr>
-    #set($dccounter = $dccounter + 1)
-  #end
-        <tr class="formrow"><td class="formseparator" colspan="7"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <a name="dcrecord">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AddToEnd'))"
-              alt="$Encoder.attributeEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AddRuleToEnd'))" onclick="javascript:addDC();"/>
-            </a>
-            <input type="hidden" name="dcrecord_count" value="$dccounter"/>
-            <input type="hidden" name="dcrecord_op" value="Continue"/>
-          </td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_domaincontrollername" type="text" size="32" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_suffix" type="text" size="10" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_username" type="text" size="10" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_password" type="password" size="6" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_authentication" type="text" size="10" value="DIGEST-MD5 GSSAPI"/></nobr></td>
-          <td class="formcolumncell">
-            <nobr>
-              <select name="dcrecord_userACLsUsername">
-                <option value="sAMAccountName" selected="true">
-                  sAMAccountName
-                </option>
-                <option value="userPrincipalName">
-                  userPrincipalName
-                </option>
-              </select>
-            </nobr>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.ConnectionTimeout'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="ldapconnectiontimeout" value="$Encoder.attributeEscape($LDAPCONNECTIONTIMEOUT)"/> $Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.milliseconds'))</td>
-  </tr>
-</table>
-
-#else
-
-  #set($dccounter = 0)
-  #foreach($domaincontroller in $DOMAINCONTROLLERS)
-
-<input type="hidden" name="dcrecord_suffix_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('SUFFIX'))"/>
-<input type="hidden" name="dcrecord_domaincontrollername_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('DOMAINCONTROLLER'))"/>
-<input type="hidden" name="dcrecord_username_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('USERNAME'))"/>
-<input type="hidden" name="dcrecord_password_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('PASSWORD'))"/>
-<input type="hidden" name="dcrecord_authentication_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('AUTHENTICATION'))"/>
-<input type="hidden" name="dcrecord_userACLsUsername_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('USERACLsUSERNAME'))"/>
-
-    #set($dccounter = $dccounter + 1)
-  #end
-
-<input type="hidden" name="dcrecord_count" value="$dccounter"/>
-<input type="hidden" name="ldapconnectiontimeout" value="$LDAPCONNECTIONTIMEOUT"/>
-
-#end
diff --git a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/viewConfiguration.html b/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/viewConfiguration.html
deleted file mode 100644
index ed94d76..0000000
--- a/connectors/activedirectory/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/activedirectory/viewConfiguration.html
+++ /dev/null
@@ -1,64 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainControllers'))</td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainControllerName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.DomainSuffix'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativeUserName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.AdministrativePassword'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.Authentication'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.LoginNameADAttribute'))</td>
-        </tr>
-#set($dccounter = 0)
-#foreach($domaincontroller in $DOMAINCONTROLLERS)
-  #if(($dccounter % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('DOMAINCONTROLLER'))</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('SUFFIX'))</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('USERNAME'))</nobr></td>
-          <td class="formcolumncell"><nobr>******</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('AUTHENTICATION'))</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('USERACLsUSERNAME'))</nobr></td>
-        </tr>
-  #set($dccounter = $dccounter + 1)
-#end
-      </table>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.ConnectionTimeout'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($LDAPCONNECTIONTIMEOUT) $Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.milliseconds'))</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLifetime'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CACHELIFETIME)</nobr> $Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.minutes'))</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ActiveDirectoryAuthority.CacheLRUSize'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CACHELRUSIZE)</nobr></td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/activedirectory/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/activedirectory/tests/BaseUIHSQLDB.java b/connectors/activedirectory/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/activedirectory/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 6882e39..0000000
--- a/connectors/activedirectory/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/activedirectory/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.activedirectory.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getAuthorityClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.authorities.authorities.activedirectory.ActiveDirectoryAuthority"};
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[]{"AD authority"};
-  }
-
-}
diff --git a/connectors/activedirectory/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/activedirectory/tests/NavigationHSQLDBUI.java b/connectors/activedirectory/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/activedirectory/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 5ad1a04..0000000
--- a/connectors/activedirectory/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/activedirectory/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.activedirectory.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-
-    // Add an authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButton("Add a new authority group");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("groupname");
-    testerInstance.setValue("groupname","MyAuthorityGroup");
-
-    // Save the authority group
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Add an authority
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButton("Add a new connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyAuthorityConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.authorities.authorities.activedirectory.ActiveDirectoryAuthority");
-    testerInstance.selectValue("authoritygroup", "MyAuthorityGroup");
-    testerInstance.clickButton("Continue");
-    
-    // Visit Domain Controller tab
-    testerInstance.clickTab("Domain Controller");
-    testerInstance.setValue("dcrecord_domaincontrollername", "localhost");
-    testerInstance.setValue("dcrecord_username", "foo");
-    testerInstance.clickButton("Add to End", true);
-    
-    // Back to the name tab
-    testerInstance.clickTab("Name");
-    
-    // Now, save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Delete the authority connection
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityGroup");
-    testerInstance.acceptAlert();
-    
-  }
-  
-}
diff --git a/connectors/activedirectory/pom.xml b/connectors/activedirectory/pom.xml
deleted file mode 100644
index b93ea80..0000000
--- a/connectors/activedirectory/pom.xml
+++ /dev/null
@@ -1,362 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-activedirectory-connector</artifactId>
-  <name>ManifoldCF - Connectors - Active Directory</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-      
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <!-- Main build dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/alfresco-webscript/.gitignore b/connectors/alfresco-webscript/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/connectors/alfresco-webscript/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/connectors/alfresco-webscript/build.xml b/connectors/alfresco-webscript/build.xml
deleted file mode 100644
index f21012d..0000000
--- a/connectors/alfresco-webscript/build.xml
+++ /dev/null
@@ -1,147 +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.
--->
-
-<project name="alfresco-webscript" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <property name="alfresco-indexer.version" value="0.8.1"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="alfresco-indexer-client*.jar"/>
-        </fileset>
-    </path>
-
-    <path id="connector-test-classpath">
-        <path refid="mcf-connector-build.connector-test-classpath"/>
-        <fileset dir="../../lib">
-            <include name="chemistry*.jar"/>
-            <include name="stax*.jar"/>
-            <include name="streambuffer*.jar"/>
-            <include name="jaxb*.jar"/>
-            <include name="jaxws*.jar"/>
-            <include name="woodstox-core-asl*.jar"/>
-            <include name="mimepull*.jar"/>
-            <include name="resolver*.jar"/>
-            <include name="org.osgi.core*.jar"/>
-            <!-- include name="commons-lang*.jar"/ -->
-            <include name="joda*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="alfresco-indexer-client*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="download-via-alfresco-indexer">
-        <get src="https://repo1.maven.org/maven2/${project-path}/${artifact-name}/${artifact-version}/${artifact-name}-${artifact-version}.${artifact-type}" dest="${target}/${artifact-name}-${artifact-version}.${artifact-type}"/>
-    </target>
-
-    <target name="download-dependencies">
-        <property name="alfresco-package" value="com/github/maoo/indexer"/>
-        <antcall target="download-via-maven">
-            <param name="project-path" value="${alfresco-package}"/>
-            <param name="artifact-version" value="${alfresco-indexer.version}"/>
-            <param name="target" value="test-materials-proprietary"/>
-            <param name="artifact-name" value="alfresco-indexer-webscripts-war"/>
-            <param name="artifact-type" value="war"/>
-        </antcall>
-    </target>
-
-    <target name="integration">
-        <mkdir dir="dist/integration/alfresco-webscript"/>
-        <copy todir="dist/integration/alfresco-webscript">
-          <fileset dir="../../lib/alfresco-webscript"/>
-        </copy>
-    </target>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="test-materials-proprietary" excludes="README*.txt"/>
-        </delete>
-    </target>
-
-    <target name="calculate-testcode-condition">
-        <available file="test-materials-proprietary/alfresco-indexer-webscripts-war-${alfresco-indexer.version}.war" property="alfrescoTestcodeStatus"/>
-        <condition property="tests-present">
-            <isset property="alfrescoTestcodeStatus"/>
-        </condition>
-    </target>
-
-    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present">
-        <echo message="Alfresco Connector integration tests cannot be be performed without alfresco.war"/>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Alfresco Webscript"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.alfrescowebscript.AlfrescoConnector"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="Alfresco Webscript"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.alfrescowebscript.AlfrescoAuthorityConnector"/>
-        </antcall>
-    </target>
-
-    <target name="run-IT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="1024m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <jvmarg value="-DalfrescoServerWarPath=../test-materials-proprietary/alfresco-indexer-webscripts-war-${alfresco-indexer.version}.war"/>
-            <jvmarg value="-Xms512m"/>
-            <jvmarg value="-Xmx1024m"/>
-            <jvmarg value="-Xss1024k"/>
-            <jvmarg value="-XX:MaxPermSize=256m"/>
-            <jvmarg value="-XX:NewSize=256m"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-</project>
diff --git a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/AlfrescoAuthorityConnector.java b/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/AlfrescoAuthorityConnector.java
deleted file mode 100644
index ae88028..0000000
--- a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/AlfrescoAuthorityConnector.java
+++ /dev/null
@@ -1,168 +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 org.apache.manifoldcf.authorities.authorities.alfrescowebscript;
-
-import com.github.maoo.indexer.client.AlfrescoClient;
-import com.github.maoo.indexer.client.AlfrescoDownException;
-import com.github.maoo.indexer.client.AlfrescoUser;
-import com.github.maoo.indexer.client.WebScriptsAlfrescoClient;
-import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Locale;
-
-public class AlfrescoAuthorityConnector extends BaseAuthorityConnector {
-
-  private AlfrescoClient alfrescoClient;
-
-  public void setClient(AlfrescoClient client) {
-    alfrescoClient = client;
-  }
-
-  @Override
-  public void connect(ConfigParams config) {
-    super.connect(config);
-
-    String protocol = getConfig(config, "protocol", "http");
-    String hostname = getConfig(config, "hostname", "localhost");
-    String port = getConfig(config, "port", "8080");
-    String endpoint = getConfig(config, "endpoint", "/alfresco/service");
-    String username = getConfig(config, "username", null);
-    String password = getObfuscatedConfig(config, "password", null);
-
-    alfrescoClient = new WebScriptsAlfrescoClient(protocol, hostname + ":" + port, endpoint,
-        null, null, username, password);
-  }
-
-  private static String getConfig(ConfigParams config,
-                                  String parameter,
-                                  String defaultValue) {
-    final String protocol = config.getParameter(parameter);
-    if (protocol == null) {
-      return defaultValue;
-    }
-    return protocol;
-  }
-
-  private static String getObfuscatedConfig(ConfigParams config,
-                                  String parameter,
-                                  String defaultValue) {
-    final String protocol = config.getObfuscatedParameter(parameter);
-    if (protocol == null) {
-      return defaultValue;
-    }
-    return protocol;
-  }
-
-  /*
-   * (non-Javadoc)
-   * @see org.apache.manifoldcf.core.connector.BaseConnector#check()
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      alfrescoClient.fetchUserAuthorities("admin");
-      return super.check();
-    } catch (AlfrescoDownException e) {
-      if (Logging.authorityConnectors != null) {
-        Logging.authorityConnectors.warn(e.getMessage(), e);
-      }
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   * @see org.apache.manifoldcf.core.connector.BaseConnector#disconnect()
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    alfrescoClient = null;
-    super.disconnect();
-  }
-
-  /*
-   * (non-Javadoc)
-   * @see org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector#getDefaultAuthorizationResponse(java.lang.String)
-   */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-    return RESPONSE_UNREACHABLE;
-  }
-
-  /*
-   * (non-Javadoc)
-   * @see org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector#getAuthorizationResponse(java.lang.String)
-   */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-      throws ManifoldCFException {
-    try {
-      AlfrescoUser permissions = alfrescoClient.fetchUserAuthorities(userName);
-      if (permissions.getUsername() == null
-          || permissions.getUsername().isEmpty()
-          || permissions.getAuthorities().isEmpty()) {
-        return RESPONSE_USERNOTFOUND;
-      } else {
-        final List<String> rval = new ArrayList<>(permissions.getAuthorities());
-        rval.add(permissions.getUsername());
-        return new AuthorizationResponse(
-            rval.toArray(new String[rval.size()]),
-            AuthorizationResponse.RESPONSE_OK);
-      }
-    } catch (AlfrescoDownException e) {
-      return RESPONSE_UNREACHABLE;
-    }
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-                                        IHTTPOutput out, Locale locale, ConfigParams parameters,
-                                        List<String> tabsArray) throws ManifoldCFException, IOException {
-    ConfigurationHandler.outputConfigurationHeader(threadContext, out, locale,
-        parameters, tabsArray);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-                                      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-    ConfigurationHandler.outputConfigurationBody(threadContext, out, locale,
-        parameters, tabName);
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-                                         IPostParameters variableContext, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException {
-    return ConfigurationHandler.processConfigurationPost(threadContext,
-        variableContext, locale, parameters);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-                                Locale locale, ConfigParams parameters) throws ManifoldCFException,
-      IOException {
-    ConfigurationHandler.viewConfiguration(threadContext, out, locale,
-        parameters);
-  }
-}
diff --git a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/ConfigurationHandler.java b/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/ConfigurationHandler.java
deleted file mode 100644
index cf67277..0000000
--- a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/ConfigurationHandler.java
+++ /dev/null
@@ -1,123 +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 org.apache.manifoldcf.authorities.authorities.alfrescowebscript;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-public class ConfigurationHandler {
-  private static final String PARAM_PROTOCOL = "protocol";
-  private static final String PARAM_HOSTNAME = "hostname";
-  private static final String PARAM_PORT = "port";
-  private static final String PARAM_ENDPOINT = "endpoint";
-  private static final String PARAM_USERNAME = "username";
-  private static final String PARAM_PASSWORD = "password";
-
-  private static final String EDIT_CONFIG_HEADER = "editConfiguration.js";
-  private static final String EDIT_CONFIG_SERVER = "editConfiguration_Server.html";
-  private static final String VIEW_CONFIG = "viewConfiguration.html";
-
-  private static final Map<String, String> DEFAULT_CONFIGURATION_PARAMETERS = new HashMap<String, String>();
-
-  static {
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_PROTOCOL, "http");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_HOSTNAME, "localhost");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_PORT, "8080");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_ENDPOINT, "/alfresco/service");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_USERNAME, "");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_PASSWORD, "");
-  }
-
-  private ConfigurationHandler() {
-  }
-
-  public static void outputConfigurationHeader(IThreadContext threadContext,
-                                               IHTTPOutput out, Locale locale,
-                                               ConfigParams parameters,
-                                               List<String> tabsArray) throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale,"Alfresco.Server"));
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    fillInParameters(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER, paramMap);
-  }
-
-  private static void fillInParameters(Map<String, Object> paramMap,
-                                       IHTTPOutput out, ConfigParams parameters) {
-    for (Map.Entry<String, String> parameter : DEFAULT_CONFIGURATION_PARAMETERS
-        .entrySet()) {
-      String paramName = parameter.getKey();
-      if (paramName.endsWith("password")) {
-        String paramValue = parameters.getObfuscatedParameter(paramName);
-        if (paramValue == null) {
-          paramValue = parameter.getValue();
-        }
-        paramMap.put(paramName, out.mapPasswordToKey(paramValue));
-      } else {
-        String paramValue = parameters.getParameter(paramName);
-        if (paramValue == null) {
-          paramValue = parameter.getValue();
-        }
-        paramMap.put(paramName, paramValue);
-      }
-    }
-  }
-
-  public static void outputConfigurationBody(IThreadContext threadContext,
-                                             IHTTPOutput out, Locale locale,
-                                             ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("tabName", tabName);
-    fillInParameters(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_SERVER, paramMap);
-  }
-
-  public static String processConfigurationPost(IThreadContext threadContext,
-                                                IPostParameters variableContext,
-                                                Locale locale, ConfigParams parameters)
-      throws ManifoldCFException {
-    for (String paramName : DEFAULT_CONFIGURATION_PARAMETERS.keySet()) {
-      String paramValue = variableContext.getParameter(paramName);
-      if (paramValue != null) {
-        if (paramName.endsWith("password"))
-          parameters.setObfuscatedParameter(paramName,variableContext.mapKeyToPassword(paramValue));
-        else
-          parameters.setParameter(paramName, paramValue);
-      }
-    }
-    return null;
-  }
-
-  public static void viewConfiguration(IThreadContext threadContext,
-                                       IHTTPOutput out, Locale locale,
-                                       ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    fillInParameters(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG, paramMap);
-  }
-}
diff --git a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/Messages.java b/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/Messages.java
deleted file mode 100644
index 15cacaa..0000000
--- a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/Messages.java
+++ /dev/null
@@ -1,120 +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 org.apache.manifoldcf.authorities.authorities.alfrescowebscript;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-import java.util.Locale;
-import java.util.Map;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.authorities.authorities.alfrescowebscript.common";
-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.authorities.authorities.alfrescowebscript";
-
-  /**
-   * Constructor - do no instantiate
-   */
-  protected Messages() {
-  }
-
-  public static String getString(Locale locale, String messageKey) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-                                    Map<String, String> substitutionParameters, boolean mapToUpperCase)
-      throws ManifoldCFException {
-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey,
-        substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-                                                Map<String, String> substitutionParameters, boolean mapToUpperCase)
-      throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-                                                Map<String, Object> contextObjects)
-      throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        contextObjects);
-  }
-
-}
diff --git a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/AlfrescoConnector.java b/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/AlfrescoConnector.java
deleted file mode 100644
index 7402af9..0000000
--- a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/AlfrescoConnector.java
+++ /dev/null
@@ -1,598 +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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript;
-
-import com.github.maoo.indexer.client.AlfrescoClient;
-import com.github.maoo.indexer.client.AlfrescoDownException;
-import com.github.maoo.indexer.client.AlfrescoResponse;
-import com.github.maoo.indexer.client.WebScriptsAlfrescoClient;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.common.DateParser;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.InputStream;
-import java.text.MessageFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-
-public class AlfrescoConnector extends BaseRepositoryConnector {
-
-  private static final String ACTIVITY_FETCH = "fetch document";
-  private static final String[] activitiesList = new String[]{ACTIVITY_FETCH};
-
-  private AlfrescoClient alfrescoClient;
-  private String binName;
-  
-  private static final String CONTENT_URL_PROPERTY = "contentUrlPath";
-  private static final String AUTHORITIES_PROPERTY = "readableAuthorities";
-  private static final String MIMETYPE_PROPERTY = "mimetype";
-  private static final String SIZE_PROPERTY = "size";
-  private static final String MODIFIED_DATE_PROPERTY = "cm:modified";
-  private static final String CREATED_DATE_PROPERTY = "cm:created";
-
-  // Static Fields
-  private static final String FIELD_UUID = "uuid";
-  private static final String FIELD_NODEREF = "nodeRef";
-  private static final String FIELD_TYPE = "type";
-  private static final String FIELD_NAME = "name";
-
-  @Override
-  public int getConnectorModel() {
-    return MODEL_ADD_CHANGE_DELETE; // We return only incremental documents.
-  }
-
-  public void setClient(AlfrescoClient client) {
-    alfrescoClient = client;
-  }
-
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[] { binName };
-  }
-
-  @Override
-  public void connect(ConfigParams config) {
-    super.connect(config);
-
-    String protocol = getConfig(config, "protocol", "http");
-    String hostname = getConfig(config, "hostname", "localhost");
-    String port = getConfig(config, "port", "8080");
-    String endpoint = getConfig(config, "endpoint", "/alfresco/service");
-    String storeProtocol = getConfig(config, "storeprotocol", "workspace");
-    String storeId = getConfig(config, "storeid", "SpacesStore");
-    String username = getConfig(config, "username", null);
-    String password = getObfuscatedConfig(config, "password", null);
-
-    /*
-    System.out.println("============");
-    System.out.println(protocol);
-    System.out.println(hostname);
-    System.out.println(port);
-    System.out.println(endpoint);
-    System.out.println(storeProtocol);
-    System.out.println(storeId);
-    System.out.println(username);
-    System.out.println(password);
-    System.out.println("============");
-    */
-    
-    alfrescoClient = new WebScriptsAlfrescoClient(protocol, hostname + ":" + port, endpoint,
-        storeProtocol, storeId, username, password);
-    binName = hostname;
-  }
-
-  private static String getConfig(ConfigParams config,
-                                  String parameter,
-                                  String defaultValue) {
-    final String protocol = config.getParameter(parameter);
-    if (protocol == null) {
-      return defaultValue;
-    }
-    return protocol;
-  }
-
-  private static String getObfuscatedConfig(ConfigParams config,
-                                  String parameter,
-                                  String defaultValue) {
-    final String protocol = config.getObfuscatedParameter(parameter);
-    if (protocol == null) {
-      return defaultValue;
-    }
-    return protocol;
-  }
-
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      // We really want to do something more like fetching a document here...
-      alfrescoClient.fetchUserAuthorities("admin");
-      return super.check();
-    } catch (AlfrescoDownException e) {
-      if (Logging.connectors != null) {
-        Logging.connectors.warn(e.getMessage(), e);
-      }
-      return "Alfresco connection check failed: " + e.getMessage();
-    } catch (Exception e) {
-      if (Logging.connectors != null) {
-        Logging.connectors.error(e.getMessage(), e);
-      }
-      throw new ManifoldCFException("Alfresco connection check failed",e);
-    }
-  }
-
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    alfrescoClient = null;
-    binName = null;
-    super.disconnect();
-  }
-
-  @Override
-  public String[] getActivitiesList() {
-    return activitiesList;
-  }
-
-  @Override
-  public int getMaxDocumentRequest() {
-    return 20;
-  }
-
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-                                 String lastSeedVersion, long seedTime, int jobMode) throws ManifoldCFException, ServiceInterruption {
-    try {
-      long lastTransactionId = 0;
-      long lastAclChangesetId = 0;
-
-      if(lastSeedVersion != null && !lastSeedVersion.isEmpty()) {
-        StringTokenizer tokenizer = new StringTokenizer(lastSeedVersion,"|");
-
-        if (tokenizer.countTokens() == 2) {
-          lastTransactionId = new Long(tokenizer.nextToken());
-          lastAclChangesetId = new Long(tokenizer.nextToken());
-        }
-      }
-
-      if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug(new MessageFormat("Starting from transaction id: {0} and acl changeset id: {1}", Locale.ROOT)
-            .format(new Object[]{lastTransactionId, lastAclChangesetId}));
-
-      long transactionIdsProcessed;
-      long aclChangesetsProcessed;
-      do {
-        final AlfrescoResponse response = alfrescoClient.
-            fetchNodes(lastTransactionId,
-                       lastAclChangesetId,
-                       ConfigurationHandler.getFilters(spec));
-        int count = 0;
-        for (Map<String, Object> doc : response.getDocuments()) {
-//          String json = gson.toJson(doc);
-//          activities.addSeedDocument(json);
-          String uuid = doc.get("uuid").toString();
-          activities.addSeedDocument(uuid);
-          count++;
-        }
-        if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug(new MessageFormat("Fetched and added {0} seed documents", Locale.ROOT)
-              .format(new Object[]{new Integer(count)}));
-
-        transactionIdsProcessed = response.getLastTransactionId() - lastTransactionId;
-        aclChangesetsProcessed = response.getLastAclChangesetId() - lastAclChangesetId;
-
-        lastTransactionId = response.getLastTransactionId();
-        lastAclChangesetId = response.getLastAclChangesetId();
-
-        if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug(new MessageFormat("transaction_id={0}, acl_changeset_id={1}", Locale.ROOT)
-              .format(new Object[]{lastTransactionId, lastAclChangesetId}));
-      } while (transactionIdsProcessed > 0 || aclChangesetsProcessed > 0);
-
-      if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug(new MessageFormat("Recording {0} as last transaction id and {1} as last changeset id", Locale.ROOT)
-            .format(new Object[]{lastTransactionId, lastAclChangesetId}));
-      return lastTransactionId + "|" + lastAclChangesetId;
-    } catch (AlfrescoDownException e) {
-      handleAlfrescoDownException(e,"seeding");
-      return null;
-    }
-  }
-
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-                               IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-
-    boolean enableDocumentProcessing = ConfigurationHandler.getEnableDocumentProcessing(spec);
-    for (String doc : documentIdentifiers) {
-
-      String errorCode = null;
-      String errorDesc = null;
-      Long fileLengthLong = null;
-      long startTime = System.currentTimeMillis();
-
-      try {
-
-        String nextVersion = statuses.getIndexedVersionString(doc);
-
-        // Calling again Alfresco API because Document's actions are lost from seeding method
-        AlfrescoResponse response = alfrescoClient.fetchNode(doc);
-        if(response.getDocumentList().isEmpty()){ // Not found seeded document. Could reflect an error in Alfresco
-          if (Logging.connectors != null)
-            Logging.connectors.warn(new MessageFormat("Invalid Seeded Document from Alfresco with ID {0}", Locale.ROOT)
-                .format(new Object[]{doc}));
-          activities.deleteDocument(doc);
-          continue;
-        }
-        Map<String, Object> map = response.getDocumentList().get(0); // Should be only one
-        if ((Boolean) map.get("deleted")) {
-          activities.deleteDocument(doc);
-          continue;
-        }
-
-        // From the map, get the things we know about
-        String uuid = doc;
-        String nodeRef = map.containsKey(FIELD_NODEREF) ? map.get(FIELD_NODEREF).toString() : "";
-        String type = map.containsKey(FIELD_TYPE) ? map.get(FIELD_TYPE).toString() : "";
-        String name =  map.containsKey(FIELD_NAME) ? map.get(FIELD_NAME).toString() : "";
-
-        // Fetch document metadata
-        Map<String,Object> properties = alfrescoClient.fetchMetadata(uuid);
-
-        // Process various special fields
-        Object mdObject;
-
-        // Size
-        Long lSize = null;
-        mdObject = properties.get(SIZE_PROPERTY);
-        if (mdObject != null) {
-          String size = mdObject.toString();
-          lSize = new Long(size);
-        }
-
-        // Modified Date
-        Date modifiedDate = null;
-        mdObject = properties.get(MODIFIED_DATE_PROPERTY);
-        if (mdObject != null) {
-          modifiedDate = DateParser.parseISO8601Date(mdObject.toString());
-        }
-
-        // Created Date
-        Date createdDate = null;
-        mdObject = properties.get(CREATED_DATE_PROPERTY);
-        if (mdObject != null) {
-          createdDate = DateParser.parseISO8601Date(mdObject.toString());
-        }
-
-
-        // Establish the document version.
-        if (modifiedDate == null) {
-          activities.deleteDocument(doc);
-          continue;
-        }
-
-        StringBuilder sb = new StringBuilder();
-          
-        sb.append((enableDocumentProcessing?"+":"-"));
-        sb.append(new Long(modifiedDate.getTime()).toString());
-          
-        @SuppressWarnings("unchecked")
-        List<String> permissions = (List<String>) properties.remove(AUTHORITIES_PROPERTY);
-        if(permissions != null){
-            for (String permission : permissions) {
-                sb.append(permission);
-            }
-        }
-          
-        String documentVersion = sb.toString();
-
-        if(!activities.checkDocumentNeedsReindexing(doc, documentVersion))
-          continue;
-
-        String mimeType = null;
-        Object mimetypeObject = properties.get(MIMETYPE_PROPERTY);
-        if (mimetypeObject != null) {
-          mimeType = mimetypeObject.toString();
-        }
-
-        if (lSize != null && !activities.checkLengthIndexable(lSize.longValue())) {
-          activities.noDocument(doc, documentVersion);
-          errorCode = activities.EXCLUDED_LENGTH;
-          errorDesc = "Excluding document because of length ("+lSize+")";
-          continue;
-        }
-
-        if (!activities.checkMimeTypeIndexable(mimeType)) {
-          activities.noDocument(doc, documentVersion);
-          errorCode = activities.EXCLUDED_MIMETYPE;
-          errorDesc = "Excluding document because of mime type ("+mimeType+")";
-          continue;
-        }
-
-        if (!activities.checkDateIndexable(modifiedDate)) {
-          activities.noDocument(doc, documentVersion);
-          errorCode = activities.EXCLUDED_DATE;
-          errorDesc = "Excluding document because of date ("+modifiedDate+")";
-          continue;
-        }
-
-        String contentUrlPath = (String) properties.get(CONTENT_URL_PROPERTY);
-        if (contentUrlPath == null || contentUrlPath.isEmpty()) {
-          activities.noDocument(doc, documentVersion);
-          errorCode = "NOURL";
-          errorDesc = "Excluding document because no URL found";
-          continue;
-        }
-
-        if (!activities.checkURLIndexable(contentUrlPath)) {
-          activities.noDocument(doc, documentVersion);
-          errorCode = activities.EXCLUDED_URL;
-          errorDesc = "Excluding document because of URL ('"+contentUrlPath+"')";
-          continue;
-        }
-
-        RepositoryDocument rd = new RepositoryDocument();
-        rd.addField(FIELD_NODEREF, nodeRef);
-        rd.addField(FIELD_TYPE, type);
-        rd.setFileName(name);
-
-        if (modifiedDate != null)
-          rd.setModifiedDate(modifiedDate);
-
-        if (createdDate != null)
-          rd.setCreatedDate(createdDate);
-
-        for(String property : properties.keySet()) {
-          Object propertyValue = properties.get(property);
-          rd.addField(property,propertyValue.toString());
-        }
-
-        if (mimeType != null && !mimeType.isEmpty())
-          rd.setMimeType(mimeType);
-
-        // Indexing Permissions
-        if(permissions != null){
-          rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,
-                            permissions.toArray(new String[permissions.size()]));
-        }
-
-        // Document Binary Content
-        InputStream stream;
-        long length;
-        byte[] empty = new byte[0];
-
-        if (enableDocumentProcessing) {
-          if (lSize != null) {
-            stream = alfrescoClient.fetchContent(contentUrlPath);
-            if (stream == null) {
-              activities.noDocument(doc, documentVersion);
-              errorCode = "NOSTREAM";
-              errorDesc = "Excluding document because no content stream found";
-              continue;
-            }
-            length = lSize.longValue();
-          } else {
-            stream = new ByteArrayInputStream(empty);
-            length = 0L;
-          }
-        } else {
-          stream = new ByteArrayInputStream(empty);
-          length = 0L;
-        }
-
-        try {
-          rd.setBinary(stream, length);
-          if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug(new MessageFormat("Ingesting with id: {0}, URI {1} and rd {2}", Locale.ROOT)
-                .format(new Object[]{uuid, nodeRef, rd.getFileName()}));
-          activities.ingestDocumentWithException(doc, documentVersion, contentUrlPath, rd);
-          errorCode = "OK";
-          fileLengthLong = new Long(length);
-        } catch (IOException e) {
-          handleIOException(e,"reading stream");
-        } finally {
-          try {
-            stream.close();
-          } catch (IOException e) {
-            handleIOException(e,"closing stream");
-          }
-        }
-
-      } catch (AlfrescoDownException e) {
-        handleAlfrescoDownException(e,"processing");
-      } catch (ManifoldCFException e) {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          errorCode = null;
-        throw e;
-      } finally {
-        if (errorCode != null)
-          activities.recordActivity(new Long(startTime), ACTIVITY_FETCH,
-            fileLengthLong, doc, errorCode, errorDesc, null);
-      }
-    }
-  }
-
-  protected final static long interruptionRetryTime = 5L*60L*1000L;
-
-  protected static void handleAlfrescoDownException(AlfrescoDownException e, String context)
-    throws ManifoldCFException, ServiceInterruption {
-    long currentTime = System.currentTimeMillis();
-
-    // Server doesn't appear to by up.  Try for a brief time then give up.
-    String message = "Server appears down during "+context+": "+e.getMessage();
-    Logging.connectors.warn(message,e);
-    throw new ServiceInterruption(message,
-      e,
-      currentTime + interruptionRetryTime,
-      -1L,
-      3,
-      true);
-  }
-
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if ((e instanceof InterruptedIOException) && (!(e instanceof java.net.SocketTimeoutException)))
-      throw new ManifoldCFException(e.getMessage(), ManifoldCFException.INTERRUPTED);
-
-    long currentTime = System.currentTimeMillis();
-
-    if (e instanceof java.net.ConnectException)
-    {
-      // Server isn't up at all.  Try for a brief time then give up.
-      String message = "Server could not be contacted during "+context+": "+e.getMessage();
-      Logging.connectors.warn(message,e);
-      throw new ServiceInterruption(message,
-        e,
-        currentTime + interruptionRetryTime,
-        -1L,
-        3,
-        true);
-    }
-
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      String message2 = "Socket timeout exception during "+context+": "+e.getMessage();
-      Logging.connectors.warn(message2,e);
-      throw new ServiceInterruption(message2,
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 20L * 60000L,
-        -1,
-        false);
-    }
-
-    if (e.getClass().getName().equals("java.net.SocketException"))
-    {
-      // In the past we would have treated this as a straight document rejection, and
-      // treated it in the same manner as a 400.  The reasoning is that the server can
-      // perfectly legally send out a 400 and drop the connection immediately thereafter,
-      // this a race condition.
-      // However, Solr 4.0 (or the Jetty version that the example runs on) seems
-      // to have a bug where it drops the connection when two simultaneous documents come in
-      // at the same time.  This is the final version of Solr 4.0 so we need to deal with
-      // this.
-      if (e.getMessage().toLowerCase(Locale.ROOT).indexOf("broken pipe") != -1 ||
-        e.getMessage().toLowerCase(Locale.ROOT).indexOf("connection reset") != -1 ||
-        e.getMessage().toLowerCase(Locale.ROOT).indexOf("target server failed to respond") != -1)
-      {
-        // Treat it as a service interruption, but with a limited number of retries.
-        // In that way we won't burden the user with a huge retry interval; it should
-        // give up fairly quickly, and yet NOT give up if the error was merely transient
-        String message = "Server dropped connection during "+context+": "+e.getMessage();
-        Logging.connectors.warn(message,e);
-        throw new ServiceInterruption(message,
-          e,
-          currentTime + interruptionRetryTime,
-          -1L,
-          3,
-          false);
-      }
-
-      // Other socket exceptions are service interruptions - but if we keep getting them, it means
-      // that a socket timeout is probably set too low to accept this particular document.  So
-      // we retry for a while, then skip the document.
-      String message2 = "Socket exception during "+context+": "+e.getMessage();
-      Logging.connectors.warn(message2,e);
-      throw new ServiceInterruption(message2,
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 20L * 60000L,
-        -1,
-        false);
-    }
-
-    // Otherwise, no idea what the trouble is, so presume that retries might fix it.
-    String message3 = "IO exception during "+context+": "+e.getMessage();
-    Logging.connectors.warn(message3,e);
-    throw new ServiceInterruption(message3,
-      e,
-      currentTime + interruptionRetryTime,
-      currentTime + 2L * 60L * 60000L,
-      -1,
-      true);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-                                        IHTTPOutput out, Locale locale, ConfigParams parameters,
-                                        List<String> tabsArray) throws ManifoldCFException, IOException {
-    ConfigurationHandler.outputConfigurationHeader(threadContext, out, locale,
-        parameters, tabsArray);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-                                      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-    ConfigurationHandler.outputConfigurationBody(threadContext, out, locale,
-        parameters, tabName);
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-                                         IPostParameters variableContext, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException {
-    return ConfigurationHandler.processConfigurationPost(threadContext,
-        variableContext, locale, parameters);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-                                Locale locale, ConfigParams parameters) throws ManifoldCFException,
-      IOException {
-    ConfigurationHandler.viewConfiguration(threadContext, out, locale,
-        parameters);
-  }
-
-
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-                                        int connectionSequenceNumber, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    ConfigurationHandler.outputSpecificationHeader(out, locale, os, connectionSequenceNumber, tabsArray);
-  }
-
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-                                      int connectionSequenceNumber, int actualSequenceNumber, String tabName) throws ManifoldCFException, IOException {
-    ConfigurationHandler.outputSpecificationBody(out, locale, os, connectionSequenceNumber, actualSequenceNumber, tabName);
-  }
-
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-                                         int connectionSequenceNumber) throws ManifoldCFException {
-    return ConfigurationHandler.processSpecificationPost(variableContext, locale, os, connectionSequenceNumber);
-  }
-
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-                                int connectionSequenceNumber) throws ManifoldCFException, IOException {
-    ConfigurationHandler.viewSpecification(out, locale, os, connectionSequenceNumber);
-  }
-
-}
diff --git a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/ConfigurationHandler.java b/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/ConfigurationHandler.java
deleted file mode 100644
index 7813943..0000000
--- a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/ConfigurationHandler.java
+++ /dev/null
@@ -1,580 +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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript;
-
-import com.github.maoo.indexer.client.AlfrescoFilters;
-import com.google.common.collect.ImmutableMultimap;
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.io.IOException;
-import java.util.*;
-
-public class ConfigurationHandler {
-  private static final String PARAM_PROTOCOL = "protocol";
-  private static final String PARAM_HOSTNAME = "hostname";
-  private static final String PARAM_PORT = "port";
-  private static final String PARAM_ENDPOINT = "endpoint";
-  private static final String PARAM_STORE_PROTOCOL = "storeprotocol";
-  private static final String PARAM_STORE_ID = "storeid";
-  private static final String PARAM_USERNAME = "username";
-  private static final String PARAM_PASSWORD = "password";
-
-  // Output Specification
-  
-  /**
-   * Node describing document processing
-   */
-  public static final String NODE_ENABLEDOCUMENTPROCESSING = "enabledocumentprocessing";
-  /**
-   * Attribute value
-   */
-  public static final String ATTRIBUTE_VALUE = "value";
-
-  /**
-   * Node describing a Site
-   */
-  public static final String NODE_SITE = "site";
-  /**
-   * Attribute describing a site name
-   */
-  public static final String ATTRIBUTE_SITE = "site_name";
-
-  /**
-   * Node describing a MimeType
-   */
-  public static final String NODE_MIMETYPE = "mimetype";
-  /**
-   * Attribute describing a MimeType name
-   */
-  public static final String ATTRIBUTE_MIMETYPE = "mimetype_name";
-
-  /**
-   * Node describing an Aspect
-   */
-  public static final String NODE_ASPECT = "aspect";
-  /**
-   * Attribute describing an aspect name
-   */
-  public static final String ATTRIBUTE_ASPECT = "aspect_name";
-
-  /**
-   * Node describing a Metadata
-   */
-  public static final String NODE_METADATA = "metadata";
-  /**
-   * Attribute describing an aspect name
-   */
-  public static final String ATTRIBUTE_METADATA_SOURCE = "metadata_source";
-  /**
-   * Attribute describing an aspect value
-   */
-  public static final String ATTRIBUTE_METADATA_TARGET = "metadata_value";
-
-  public static final ImmutableMultimap<String, String> SPECIFICATION_MAP =
-      ImmutableMultimap.<String, String>builder().
-          put(NODE_SITE, ATTRIBUTE_SITE).
-          put(NODE_MIMETYPE, ATTRIBUTE_MIMETYPE).
-          put(NODE_ASPECT, ATTRIBUTE_ASPECT).
-          put(NODE_METADATA, ATTRIBUTE_METADATA_SOURCE).
-          put(NODE_METADATA, ATTRIBUTE_METADATA_TARGET).build();
-
-  private static final String EDIT_CONFIG_HEADER = "editConfiguration.js";
-  private static final String EDIT_CONFIG_SERVER = "editConfiguration_Server.html";
-  private static final String VIEW_CONFIG = "viewConfiguration.html";
-
-  private static final Map<String, String> DEFAULT_CONFIGURATION_PARAMETERS = new HashMap<String, String>();
-
-  static {
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_PROTOCOL, "http");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_HOSTNAME, "localhost");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_PORT, "8080");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_ENDPOINT, "/alfresco/service");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_STORE_PROTOCOL, "workspace");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_STORE_ID, "SpacesStore");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_USERNAME, "");
-    DEFAULT_CONFIGURATION_PARAMETERS.put(PARAM_PASSWORD, "");
-  }
-
-  private ConfigurationHandler() {
-  }
-
-  public static void outputConfigurationHeader(IThreadContext threadContext,
-                                               IHTTPOutput out, Locale locale, ConfigParams parameters,
-                                               List<String> tabsArray) throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale,"Alfresco.Server"));
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    fillInParameters(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER, paramMap);
-  }
-
-  private static void fillInParameters(Map<String, Object> paramMap,
-                                       IHTTPOutput out, ConfigParams parameters) {
-    for (Map.Entry<String, String> parameter : DEFAULT_CONFIGURATION_PARAMETERS
-        .entrySet()) {
-      String paramName = parameter.getKey();
-      if (paramName.endsWith("password")) {
-        String paramValue = parameters.getObfuscatedParameter(paramName);
-        if (paramValue == null) {
-          paramValue = parameter.getValue();
-        }
-        paramMap.put(paramName, out.mapPasswordToKey(paramValue));
-      } else {
-        String paramValue = parameters.getParameter(paramName);
-        if (paramValue == null) {
-          paramValue = parameter.getValue();
-        }
-        paramMap.put(paramName, paramValue);
-      }
-    }
-  }
-
-  public static void outputConfigurationBody(IThreadContext threadContext,
-                                             IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("tabName", tabName);
-    fillInParameters(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_SERVER, paramMap);
-  }
-
-  public static String processConfigurationPost(IThreadContext threadContext,
-                                                IPostParameters variableContext, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException {
-    for (String paramName : DEFAULT_CONFIGURATION_PARAMETERS.keySet()) {
-      String paramValue = variableContext.getParameter(paramName);
-      if (paramValue != null) {
-        if (paramName.endsWith("password"))
-          parameters.setObfuscatedParameter(paramName,variableContext.mapKeyToPassword(paramValue));
-        else
-          parameters.setParameter(paramName, paramValue);
-      }
-    }
-    return null;
-  }
-
-  public static void viewConfiguration(IThreadContext threadContext,
-                                       IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    fillInParameters(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG, paramMap);
-  }
-  
-  public static void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-                                               int connectionSequenceNumber, List<String> tabsArray)
-      throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    tabsArray.add(Messages.getString(locale, "Alfresco.FilteringConfiguration"));
-    out.print(
-              "<script type=\"text/javascript\">\n"+
-              "<!--\n"+
-              "function "+seqPrefix+"checkSpecification()\n"+
-              "{\n"+
-              "  return true;\n"+
-              "}\n"+
-              "\n");
-    
-    for(String node:SPECIFICATION_MAP.keySet()){
-      out.print(
-                "function "+seqPrefix+"add"+node+"()\n"+
-                "{\n");
-      Collection<String> vars = SPECIFICATION_MAP.get(node);
-      for(String var:vars){
-        Object[] args = new String[]{node,var};
-        out.print(
-                  "if (editjob."+seqPrefix+var+".value == \"\")\n"+
-                  "  {\n"+
-//                "    alert(\"Value of "+ node + "." + var + " can't be NULL" +"\");\n"+
-                  "    alert(\""+ Messages.getBodyJavascriptString(locale, "Alfresco.ParamNullError",args) + "\");\n"+
-                  "    editjob."+seqPrefix+var+".focus();\n"+
-                  "    return;\n"+
-                  "  }\n"
-                  );
-      }
-          
-      out.print("editjob."+seqPrefix+node+"_op.value=\"Add\";\n"+
-                "  postFormSetAnchor(\""+seqPrefix+"+"+node+"\");\n"+
-                "}\n"+
-                "\n"+
-                "function "+seqPrefix+"delete"+node+"(i)\n"+
-                "{\n"+
-                "  // Set the operation\n"+
-                "  eval(\"editjob."+seqPrefix+node+"_\"+i+\"_op.value=\\\"Delete\\\"\");\n"+
-                "  // Submit\n"+
-                "  if (editjob."+seqPrefix+node+"_count.value==i)\n"+
-                "    postFormSetAnchor(\""+seqPrefix+node+"\");\n"+
-                "  else\n"+
-                "    postFormSetAnchor(\""+seqPrefix+node+"_\"+i)\n"+
-                "  // Undo, so we won't get two deletes next time\n"+
-                "  eval(\"editjob."+seqPrefix+node+"_\"+i+\"_op.value=\\\"Continue\\\"\");\n"+
-                "}\n"+
-                "\n");
-    }
-        
-    out.print("\n"+
-              "\n"+
-              "//-->\n"+
-              "</script>\n");    
-  }
-
-  
-  public static void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-      int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-          throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    int i;
-    // Field Mapping tab
-    if (tabName.equals(Messages.getString(locale, "Alfresco.FilteringConfiguration")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-                  "<table class=\"displaytable\">\n"
-      );
-      
-      out.print(
-                  "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-                  "  <tr>\n"+
-                  "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "Alfresco.EnableDocumentProcessingQuestion") + "</nobr></td>\n"+
-                  "    <td class=\"value\">\n"+
-                  "      <input name=\""+seqPrefix+"enabledocumentprocessing_present\" type=\"hidden\" value=\"true\"/>\n"+
-                  "      <input name=\""+seqPrefix+"enabledocumentprocessing\" type=\"checkbox\" "+(getEnableDocumentProcessing(os)?"checked=\"true\" ":"")+"value=\"true\"/>\n"+
-                  "    </td>\n"+
-                  "  </tr>\n"
-      );
-
-      for(String node:SPECIFICATION_MAP.keySet()){
-        out.print(
-                  "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-                  "  <tr>\n"+
-                  "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "Alfresco.SpecificFilteringConfiguration",new String[]{Messages.getString(locale,"Alfresco."+node)}) + "</nobr></td>\n"+
-                  "    <td class=\"boxcell\">\n"+
-                  "      <table class=\"formtable\">\n"+
-                  "        <tr class=\"formheaderrow\">\n"+
-                  "          <td class=\"formcolumnheader\"></td>\n");
-        Collection<String> vars = SPECIFICATION_MAP.get(node);
-        for(String var:vars){
-          out.print(
-                  "          <td class=\"formcolumnheader\"><nobr>" + Messages.getString(locale,"Alfresco."+var) + "</nobr></td>\n"
-          );
-        }
-        out.print(
-                  "        </tr>\n"
-        );
-        
-        int fieldCounter = 0;
-        i = 0;
-        while (i < os.getChildCount()) {
-          SpecificationNode sn = os.getChild(i++);
-          if (sn.getType().equals(node)) {
-            String prefix = seqPrefix+node+"_" + Integer.toString(fieldCounter);
-            out.print(
-                  "        <tr class=\""+(((fieldCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-                  "          <td class=\"formcolumncell\">\n"+
-                  "            <a name=\""+prefix+"\">\n"+
-                  "              <input type=\"button\" value=\""+ Messages.getBodyJavascriptString(locale, "Alfresco.Delete") + "\" alt=\""+ Messages.getBodyJavascriptString(locale, "Alfresco.Delete") + ""+Integer.toString(fieldCounter+1)+"\" onclick='javascript:"+seqPrefix+"delete"+node+"("+Integer.toString(fieldCounter)+");'/>\n"+
-                  "              <input type=\"hidden\" name=\""+prefix+"_op\" value=\"Continue\"/>\n");
-            for(String var:vars){
-              out.print(
-                  "              <input type=\"hidden\" name=\""+prefix+"_"+var+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sn.getAttributeValue(var))+"\"/>\n"
-              );
-            }
-
-            out.print(
-                  "            </a>\n"+
-                  "          </td>\n"
-            );
-            for(String var:vars){
-              out.print(
-                  "          <td class=\"formcolumncell\">\n"+
-                  "            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue(var))+"</nobr>\n"+
-                  "          </td>\n");
-            }
-            out.print(
-                  "        </tr>\n"
-            );
-            fieldCounter++;
-
-          }
-        }
-        if (fieldCounter == 0)
-          {
-            out.print(
-                  "        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\""+(vars.size()+1)+"\">"+ Messages.getBodyJavascriptString(locale, "Alfresco.NoFilteringConfiguration") + "</td></tr>\n");
-          }
-        
-        out.print(
-                  "        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\""+(vars.size()+1)+"\"><hr/></td></tr>\n"+
-                  "        <tr class=\"formrow\">\n"+
-                  "          <td class=\"formcolumncell\">\n"+
-                  "            <a name=\""+seqPrefix+node+"\">\n"+
-                  "              <input type=\"button\" value=\""+ Messages.getAttributeString(locale, "Alfresco.Add") + "\" alt=\""+ Messages.getAttributeString(locale, "Alfresco.Add") + " " + node + "\" onclick=\"javascript:"+seqPrefix+"add"+node+"();\"/>\n"+
-                  "            </a>\n"+
-                  "            <input type=\"hidden\" name=\""+seqPrefix+node+"_count\" value=\""+fieldCounter+"\"/>\n"+
-                  "            <input type=\"hidden\" name=\""+seqPrefix+node+"_op\" value=\"Continue\"/>\n"+
-                  "          </td>\n");
-        for(String var:vars){
-          out.print(
-                  "          <td class=\"formcolumncell\">\n"+
-                  "            <nobr><input type=\"text\" size=\"15\" name=\""+seqPrefix+var+"\" value=\"\"/></nobr>\n"+
-                  "          </td>\n");
-        }
-
-        out.print(
-                  "        </tr>\n"+
-                  "      </table>\n"+
-                  "    </td>\n"+
-                  "  </tr>\n"
-        );
-            
-
-      }
-      out.print(
-                  "</table>\n"
-      );
-
-    }
-    else{
-      out.print(
-                  "<input type=\"hidden\" name=\""+seqPrefix+"enabledocumentprocessing_present\" value=\"true\"/>\n"+
-                  "<input type=\"hidden\" name=\""+seqPrefix+"enabledocumentprocessing\" value=\""+getEnableDocumentProcessing(os)+"\"/>\n"
-      );
-      for(String node:SPECIFICATION_MAP.keySet()){
-        i = 0;
-        int fieldCounter = 0;  
-        while (i < os.getChildCount()) {
-          SpecificationNode sn = os.getChild(i++);
-          if(sn.getType().equals(node)){
-          String prefix = seqPrefix+node+"_" + Integer.toString(fieldCounter);  
-          for(String var:SPECIFICATION_MAP.get(node)){
-            out.print(
-                    "<input type=\"hidden\" name=\""+prefix+"_"+var+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sn.getAttributeValue(var))+"\"/>\n"
-            );
-          }
-          fieldCounter++;
-          }
-        }
-          
-        out.print("<input type=\"hidden\" name=\""+seqPrefix+node+"_count\" value=\""+Integer.toString(fieldCounter)+"\"/>\n");
-      }
-    }
-  }
-      
-  public static String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-      int connectionSequenceNumber) throws ManifoldCFException {
-    int i;
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    
-    String enablePresent = variableContext.getParameter(seqPrefix+"enabledocumentprocessing_present");
-    if (enablePresent != null) {
-      String enableValue = variableContext.getParameter(seqPrefix+"enabledocumentprocessing");
-      if (enableValue == null)
-        enableValue = "false";
-      i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode specNode = os.getChild(i);
-        if (specNode.getType().equals(NODE_ENABLEDOCUMENTPROCESSING))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(NODE_ENABLEDOCUMENTPROCESSING);
-      sn.setAttribute(ATTRIBUTE_VALUE,enableValue);
-      os.addChild(os.getChildCount(),sn);
-    }
-    
-    for(String node:SPECIFICATION_MAP.keySet()){
-      
-      String x = variableContext.getParameter(seqPrefix+node+"_count");
-      if (x != null && x.length() > 0){
-        
-        i = 0;
-        while (i < os.getChildCount())
-        {
-          SpecificationNode specNode = os.getChild(i);
-          if (specNode.getType().equals(node))
-            os.removeChild(i);
-          else
-            i++;
-        }
-
-        Collection<String> vars = SPECIFICATION_MAP.get(node);
-
-        int count = Integer.parseInt(x);
-        i = 0;
-        while (i < count)
-        {
-          String prefix = seqPrefix+node+"_"+Integer.toString(i);
-          String op = variableContext.getParameter(prefix+"_op");
-          if (op == null || !op.equals("Delete"))
-          {
-            SpecificationNode specNode = new SpecificationNode(node);
-            for(String var:vars){
-              String value = variableContext.getParameter(prefix+"_"+var);
-              if(value == null)
-                value = "";
-              specNode.setAttribute(var, value);
-            }
-            os.addChild(os.getChildCount(), specNode);
-          }
-          i++;
-        }
-
-        String addop = variableContext.getParameter(seqPrefix+node+"_op");
-        if (addop != null && addop.equals("Add"))
-        {
-          SpecificationNode specNode = new SpecificationNode(node);
-          for(String var:vars){
-            String value = variableContext.getParameter(seqPrefix+var);
-            if(value == null)
-              value = "";
-            specNode.setAttribute(var, value);
-          }
-          os.addChild(os.getChildCount(), specNode);
-        }
-      }
-    }
-
-    return null;
-  }
-  
-  public static void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-                                       int connectionSequenceNumber)
-      throws ManifoldCFException, IOException
-  {
-    out.print(
-                "\n"+
-                "<table class=\"displaytable\">\n"
-    );
-    
-    out.print(
-                "  <tr>\n"+
-                "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "Alfresco.EnableDocumentProcessingQuestion") + "</nobr></td>\n"+
-                "    <td class=\"value\">\n"+
-                "      "+getEnableDocumentProcessing(os)+"\n"+
-                "    </td>\n"+
-                "  </tr>\n"
-    );
-
-    out.print(
-                "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-
-    int i = 0;
-
-    for(String node:SPECIFICATION_MAP.keySet()){
-      Collection<String> vars = SPECIFICATION_MAP.get(node);
-      out.print(
-                "  <tr>\n"+
-                "    <td class=\"description\"><nobr>"+ Messages.getBodyString(locale, "Alfresco.SpecificFilteringConfiguration",new String[]{Messages.getString(locale,"Alfresco."+node)}) +"</nobr></td>\n"+
-                "    <td class=\"boxcell\">\n"+
-                "      <table class=\"formtable\">\n"+
-                "        <tr class=\"formheaderrow\">\n");
-      for(String var:vars)
-        out.print(
-                "          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale, "Alfresco."+var) + "</nobr></td>\n"
-        );
-              
-      out.print(
-                "        </tr>\n"
-      );
-     
-      int fieldCounter = 0;
-      i = 0;
-     
-      while (i < os.getChildCount()) {
-        SpecificationNode sn = os.getChild(i++);
-        if (sn.getType().equals(node)) {
-          out.print(
-                "        <tr class=\""+(((fieldCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"
-          );
-          for(String var:vars)
-            out.print(
-                "          <td class=\"formcolumncell\">\n"+
-                "            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue(var))+"</nobr>\n"+
-                "          </td>\n"
-            );
-          out.print(
-                "        </tr>\n"
-          );
-          fieldCounter++;
-        }
-      }
-
-      if (fieldCounter == 0)
-      {
-        out.print(
-                "        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\""+vars.size()+"\">"+ Messages.getBodyJavascriptString(locale, "Alfresco.NoSpecificFilteringConfiguration",new String[]{node}) + "</td></tr>\n"
-        );
-      }
-      out.print(
-                "      </table>\n"+
-                "    </td>\n"+
-                "  </tr>\n"
-      );
-    }
-    out.print(
-                "</table>\n"
-    );
-  }
-  
-  public static String getSpecificationVersion(Specification os){
-    StringBuilder builder = new StringBuilder();
-    int i = 0;
-    while(i < os.getChildCount()){
-      SpecificationNode node = os.getChild(i);
-      Collection<String> vars = SPECIFICATION_MAP.get(node.getType());
-      for(String var:vars)
-        builder.append(node.getAttributeValue(var)).append("+");
-      i++;
-    }
-    return builder.toString();
-  }
-  
-  public static AlfrescoFilters getFilters(Specification spec) {
-    AlfrescoFilters filters = new AlfrescoFilters();
-    for(int i = 0; i < spec.getChildCount(); i++){
-      SpecificationNode node = spec.getChild(i);
-      if(node.getType().equals(NODE_SITE))
-        filters.addSiteFilter(node.getAttributeValue(ATTRIBUTE_SITE));
-      else if(node.getType().equals(NODE_MIMETYPE))
-        filters.addMimetypeFilter(node.getAttributeValue(ATTRIBUTE_MIMETYPE));
-      else if(node.getType().equals(NODE_ASPECT))
-        filters.addAspectFilter(
-            node.getAttributeValue(ATTRIBUTE_ASPECT));
-      else if(node.getType().equals(NODE_METADATA))
-        filters.addMetadataFilter(
-            node.getAttributeValue(ATTRIBUTE_METADATA_SOURCE),
-            node.getAttributeValue(ATTRIBUTE_METADATA_TARGET));
-    }
-    
-    return filters;
-  }
-  
-  public static boolean getEnableDocumentProcessing(Specification spec) {
-    boolean rval = true;
-    for(int i = 0; i < spec.getChildCount(); i++){
-      SpecificationNode node = spec.getChild(i);
-      if(node.getType().equals(NODE_ENABLEDOCUMENTPROCESSING))
-        rval = new Boolean(node.getAttributeValue(ATTRIBUTE_VALUE)).booleanValue();
-    }
-    return rval;
-  }
-  
-}
diff --git a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/Messages.java b/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/Messages.java
deleted file mode 100644
index 5b58ff5..0000000
--- a/connectors/alfresco-webscript/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/Messages.java
+++ /dev/null
@@ -1,120 +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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-import java.util.Locale;
-import java.util.Map;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.crawler.connectors.alfrescowebscript.common";
-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.alfrescowebscript";
-
-  /**
-   * Constructor - do no instantiate
-   */
-  protected Messages() {
-  }
-
-  public static String getString(Locale locale, String messageKey) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-                                    Map<String, String> substitutionParameters, boolean mapToUpperCase)
-      throws ManifoldCFException {
-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey,
-        substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-                                                Map<String, String> substitutionParameters, boolean mapToUpperCase)
-      throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-                                                Map<String, Object> contextObjects)
-      throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        contextObjects);
-  }
-
-}
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_en_US.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_en_US.properties
deleted file mode 100644
index 964aded..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_en_US.properties
+++ /dev/null
@@ -1,35 +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.
-
-Alfresco.Server=Server
-
-Alfresco.ProtocolColon=Protocol:
-Alfresco.HostnameColon=Host name:
-Alfresco.PortColon=Port:
-Alfresco.EndpointColon=Context:
-Alfresco.UsernameColon=User name:
-Alfresco.PasswordColon=Password:
-
-Alfresco.Continue=Continue
-Alfresco.Delete=Delete
-Alfresco.Add=Add
-
-Alfresco.HostNameMustNotBeEmpty=Hostname must not be empty
-Alfresco.EndpointMustNotBeEmpty=Context must not be empty
-Alfresco.HostNameCannotContainColonOrSlash=Hostname must not contain ':' or '/'
-Alfresco.PortMustNotBeEmpty=Port must not be empty
-Alfresco.PortMustBeAnInteger=Port must be an integer
-Alfresco.EndpointMustStartWithSlash=Context must start with '/'
-
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_es_ES.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_es_ES.properties
deleted file mode 100644
index aa462a8..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_es_ES.properties
+++ /dev/null
@@ -1,37 +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.
-
-Alfresco.Server=Servidor
-
-Alfresco.ProtocolColon=Protocolo:
-Alfresco.HostnameColon=nombre de host:
-Alfresco.PortColon=Puerto:
-Alfresco.EndpointColon=Contexto:
-Alfresco.UsernameColon=Nombre de usuario:
-Alfresco.PasswordColon=Contraseña:
-
-Alfresco.Continue=Continuar
-Alfresco.Delete=borrar
-Alfresco.Add=añadir
-
-Alfresco.HostNameMustNotBeEmpty=Nombre de host no puede estar vacío
-Alfresco.EndpointMustNotBeEmpty=El contexto no debe estar vacío
-Alfresco.HostNameCannotContainColonOrSlash=Nombre de host no debe contener ':' o '/'
-Alfresco.PortMustNotBeEmpty=El puerto no debe estar vacío
-Alfresco.PortMustBeAnInteger=Puerto debe ser un número entero
-Alfresco.EndpointMustStartWithSlash=Contexto debe comenzar con '/'
-
-
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_ja_JP.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_ja_JP.properties
deleted file mode 100644
index a4737bc..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_ja_JP.properties
+++ /dev/null
@@ -1,35 +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.
-
-Alfresco.Server=サーバ
-
-Alfresco.ProtocolColon=プロトコル:
-Alfresco.HostnameColon=ホスト名:
-Alfresco.PortColon=ポート:
-Alfresco.EndpointColon=コンテキスト:
-Alfresco.UsernameColon=ユーザ名:
-Alfresco.PasswordColon=パスワード:
-
-Alfresco.Continue=次へ
-Alfresco.Delete=削除
-Alfresco.Add=追加
-
-Alfresco.HostNameMustNotBeEmpty=ホスト名を入力してください
-Alfresco.EndpointMustNotBeEmpty=コンテキストを入力してください
-Alfresco.HostNameCannotContainColonOrSlash=ホスト名には「:」や「/」を含めることはできません
-Alfresco.PortMustNotBeEmpty=ポート番号を入力してください
-Alfresco.PortMustBeAnInteger=ポート番号には整数を入力してください
-Alfresco.EndpointMustStartWithSlash=コンテキストは「/」で始めてください
-
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_zh_CN.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_zh_CN.properties
deleted file mode 100644
index 964aded..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/common_zh_CN.properties
+++ /dev/null
@@ -1,35 +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.
-
-Alfresco.Server=Server
-
-Alfresco.ProtocolColon=Protocol:
-Alfresco.HostnameColon=Host name:
-Alfresco.PortColon=Port:
-Alfresco.EndpointColon=Context:
-Alfresco.UsernameColon=User name:
-Alfresco.PasswordColon=Password:
-
-Alfresco.Continue=Continue
-Alfresco.Delete=Delete
-Alfresco.Add=Add
-
-Alfresco.HostNameMustNotBeEmpty=Hostname must not be empty
-Alfresco.EndpointMustNotBeEmpty=Context must not be empty
-Alfresco.HostNameCannotContainColonOrSlash=Hostname must not contain ':' or '/'
-Alfresco.PortMustNotBeEmpty=Port must not be empty
-Alfresco.PortMustBeAnInteger=Port must be an integer
-Alfresco.EndpointMustStartWithSlash=Context must start with '/'
-
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_en_US.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_en_US.properties
deleted file mode 100644
index 2599b3f..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_en_US.properties
+++ /dev/null
@@ -1,52 +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.
-
-Alfresco.Server=Server
-
-Alfresco.ProtocolColon=Protocol:
-Alfresco.HostnameColon=Host name:
-Alfresco.PortColon=Port:
-Alfresco.EndpointColon=Context:
-Alfresco.UsernameColon=User name:
-Alfresco.PasswordColon=Password:
-Alfresco.StoreProtocolColon=Store protocol:
-Alfresco.StoreIDColon=Store ID:
-Alfresco.EnableDocumentProcessingQuestion=Enable document processing?
-
-Alfresco.HostNameMustNotBeEmpty=Hostname must not be empty
-Alfresco.EndpointMustNotBeEmpty=Context must not be empty
-Alfresco.HostNameCannotContainColonOrSlash=Hostname must not contain ':' or '/'
-Alfresco.PortMustNotBeEmpty=Port must not be empty
-Alfresco.PortMustBeAnInteger=Port must be an integer
-Alfresco.EndpointMustStartWithSlash=Context must start with '/'
-Alfresco.StoreIDMustNotBeEmpty=Store ID must not be empty
-
-Alfresco.site=site
-Alfresco.site_name=Site name
-Alfresco.mimetype=mime type
-Alfresco.mimetype_name=Mime type name
-Alfresco.aspect=aspect
-Alfresco.aspect_name=Aspect name
-Alfresco.metadata=metadata
-Alfresco.metadata_source=Metadata source
-Alfresco.metadata_value=Metadata value
-
-Alfresco.FilteringConfiguration=Filtering Configuration
-Alfresco.SpecificFilteringConfiguration=Alfresco {0} filtering configuration:
-Alfresco.NoSpecificFilteringConfiguration=No filtering configuration specified for {0}
-Alfresco.NoFilteringConfiguration=No filtering configuration specified
-Alfresco.ParamNullError=Value of {0}.{1} can't be NULL
-Alfresco.Delete=Delete
-Alfresco.Add=Add
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_es_ES.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_es_ES.properties
deleted file mode 100644
index c08e70d..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_es_ES.properties
+++ /dev/null
@@ -1,53 +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.
-
-Alfresco.Server=Servidor
-
-Alfresco.ProtocolColon=Protocolo:
-Alfresco.HostnameColon=nombre de host:
-Alfresco.PortColon=Puerto:
-Alfresco.EndpointColon=Contexto:
-Alfresco.UsernameColon=nombre de usuario:
-Alfresco.PasswordColon=Contraseña:
-Alfresco.StoreProtocolColon=protocolo de tienda:
-Alfresco.StoreIDColon=Código tienda:
-Alfresco.EnableDocumentProcessingQuestion=Habilitar el procesamiento de documentos ?
-
-Alfresco.HostNameMustNotBeEmpty=Nombre de host no puede estar vacío
-Alfresco.EndpointMustNotBeEmpty=El contexto no debe estar vacío
-Alfresco.HostNameCannotContainColonOrSlash=Nombre de host no debe contener ':' o '/'
-Alfresco.PortMustNotBeEmpty=El puerto no debe estar vacío
-Alfresco.PortMustBeAnInteger=Puerto debe ser un número entero
-Alfresco.EndpointMustStartWithSlash=Contexto debe comenzar con '/'
-Alfresco.StoreIDMustNotBeEmpty=Código tienda no debe estar vacío
-
-Alfresco.site=sitio
-Alfresco.site_name=Nombre del sitio
-Alfresco.mimetype=tipo mime
-Alfresco.mimetype_name=Mime nombre de tipo
-Alfresco.aspect=aspecto
-Alfresco.aspect_name=nombre de Aspecto
-Alfresco.metadata=metadatos
-Alfresco.metadata_source=Fuente de metadatos
-Alfresco.metadata_value=valor de metadatos
-
-Alfresco.FilteringConfiguration=Configuración de filtrado
-Alfresco.SpecificFilteringConfiguration=Alfresco {0} configuración de filtrado:
-Alfresco.NoSpecificFilteringConfiguration=Sin configuración de filtrado especificado para {0}
-Alfresco.NoFilteringConfiguration=Sin configuración de filtrado especificada
-Alfresco.ParamNullError=Valor de {0}.{1} no puede ser nulo
-Alfresco.Delete=borrar
-Alfresco.Add=añadir
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_ja_JP.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_ja_JP.properties
deleted file mode 100644
index 7560eed..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_ja_JP.properties
+++ /dev/null
@@ -1,52 +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.
-
-Alfresco.Server=サーバ
-
-Alfresco.ProtocolColon=プロトコル:
-Alfresco.HostnameColon=ホスト名:
-Alfresco.PortColon=ポート:
-Alfresco.EndpointColon=コンテキスト:
-Alfresco.UsernameColon=ユーザ名:
-Alfresco.PasswordColon=パスワード:
-Alfresco.StoreProtocolColon=Store プロトコル:
-Alfresco.StoreIDColon=Store ID:
-Alfresco.EnableDocumentProcessingQuestion=ドキュメント処理を有効にしますか。
-
-Alfresco.HostNameMustNotBeEmpty=ホスト名を入力してください
-Alfresco.EndpointMustNotBeEmpty=コンテキストを入力してください
-Alfresco.HostNameCannotContainColonOrSlash=ホスト名には「:」や「/」を含めることはできません
-Alfresco.PortMustNotBeEmpty=ポート番号を入力してください
-Alfresco.PortMustBeAnInteger=ポート番号には整数を入力してください
-Alfresco.EndpointMustStartWithSlash=コンテキストは「/」で始めてください
-Alfresco.StoreIDMustNotBeEmpty=Store IDを入力してください
-
-Alfresco.site=サイト
-Alfresco.site_name=サイト名
-Alfresco.mimetype=MIMEタイプ
-Alfresco.mimetype_name=MIMEタイプ名
-Alfresco.aspect=アスペクト
-Alfresco.aspect_name=アスペクト名
-Alfresco.metadata=メタデータ
-Alfresco.metadata_source=メタデータのソース
-Alfresco.metadata_value=メタデータの値
-
-Alfresco.FilteringConfiguration=フィルタ設定
-Alfresco.SpecificFilteringConfiguration=Alfresco {0} フィルタ設定:
-Alfresco.NoSpecificFilteringConfiguration={0} にはフィルタが設定されていません
-Alfresco.NoFilteringConfiguration=フィルタが設定されていません
-Alfresco.ParamNullError={0}.{1}の値を入力してください
-Alfresco.Delete=削除
-Alfresco.Add=追加
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_zh_CN.properties b/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_zh_CN.properties
deleted file mode 100644
index 2599b3f..0000000
--- a/connectors/alfresco-webscript/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/common_zh_CN.properties
+++ /dev/null
@@ -1,52 +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.
-
-Alfresco.Server=Server
-
-Alfresco.ProtocolColon=Protocol:
-Alfresco.HostnameColon=Host name:
-Alfresco.PortColon=Port:
-Alfresco.EndpointColon=Context:
-Alfresco.UsernameColon=User name:
-Alfresco.PasswordColon=Password:
-Alfresco.StoreProtocolColon=Store protocol:
-Alfresco.StoreIDColon=Store ID:
-Alfresco.EnableDocumentProcessingQuestion=Enable document processing?
-
-Alfresco.HostNameMustNotBeEmpty=Hostname must not be empty
-Alfresco.EndpointMustNotBeEmpty=Context must not be empty
-Alfresco.HostNameCannotContainColonOrSlash=Hostname must not contain ':' or '/'
-Alfresco.PortMustNotBeEmpty=Port must not be empty
-Alfresco.PortMustBeAnInteger=Port must be an integer
-Alfresco.EndpointMustStartWithSlash=Context must start with '/'
-Alfresco.StoreIDMustNotBeEmpty=Store ID must not be empty
-
-Alfresco.site=site
-Alfresco.site_name=Site name
-Alfresco.mimetype=mime type
-Alfresco.mimetype_name=Mime type name
-Alfresco.aspect=aspect
-Alfresco.aspect_name=Aspect name
-Alfresco.metadata=metadata
-Alfresco.metadata_source=Metadata source
-Alfresco.metadata_value=Metadata value
-
-Alfresco.FilteringConfiguration=Filtering Configuration
-Alfresco.SpecificFilteringConfiguration=Alfresco {0} filtering configuration:
-Alfresco.NoSpecificFilteringConfiguration=No filtering configuration specified for {0}
-Alfresco.NoFilteringConfiguration=No filtering configuration specified
-Alfresco.ParamNullError=Value of {0}.{1} can't be NULL
-Alfresco.Delete=Delete
-Alfresco.Add=Add
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/editConfiguration.js b/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/editConfiguration.js
deleted file mode 100644
index e65c6cd..0000000
--- a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/editConfiguration.js
+++ /dev/null
@@ -1,64 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig() {
-  return true;
-}
-
-function checkConfigForSave() {
-  if (editconnection.hostname.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.HostNameMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.hostname.focus();
-    return false;
-  }
-  if (editconnection.hostname.value.indexOf(":") != -1 || editconnection.hostname.value.indexOf("/") != -1) {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.HostNameCannotContainColonOrSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.hostname.focus();
-    return false;
-  }
-  if (editconnection.port.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.PortMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if (!isInteger(editconnection.port.value)) {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.PortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if (editconnection.endpoint.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.EndpointMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.endpoint.focus();
-    return false;
-  }
-  if (editconnection.endpoint.value.substring(0,1) != "/") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.EndpointMustStartWithSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.endpoint.focus();
-    return false;
-  }
-  return true;
-}
-// -->
-</script>
diff --git a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/editConfiguration_Server.html b/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/editConfiguration_Server.html
deleted file mode 100644
index 505304f..0000000
--- a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/editConfiguration_Server.html
+++ /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.
--->
-
-#if($tabName == "$ResourceBundle.getString('Alfresco.Server')")
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select id="protocol" name="protocol">
-  #if($protocol == "http")
-        <option value="http" selected="selected">http</option>
-  #else
-        <option value="http">http</option>
-  #end
-  #if($protocol == "https")
-        <option value="https" selected="selected">https</option>
-  #else
-        <option value="https">https</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.HostnameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="hostname" type="text" size="32" value="$Encoder.attributeEscape($hostname)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="port" type="text" size="5" value="$Encoder.attributeEscape($port)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.EndpointColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="endpoint" type="text" size="32" value="$Encoder.attributeEscape($endpoint)" />
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.UsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="username" type="text" size="32" value="$Encoder.attributeEscape($username)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="password" type="password" size="32" value="$Encoder.attributeEscape($password)"/>
-    </td>
-  </tr>
-</table>
-#else
-<input type="hidden" name="protocol" value="$Encoder.attributeEscape($protocol)" />
-<input type="hidden" name="hostname" value="$Encoder.attributeEscape($hostname)" />
-<input type="hidden" name="port" value="$Encoder.attributeEscape($port)" />
-<input type="hidden" name="endpoint" value="$Encoder.attributeEscape($endpoint)" />
-<input type="hidden" name="username" value="$Encoder.attributeEscape($username)" />
-<input type="hidden" name="password" value="$Encoder.attributeEscape($password)" />
-#end
diff --git a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/viewConfiguration.html b/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/viewConfiguration.html
deleted file mode 100644
index 99d5703..0000000
--- a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/viewConfiguration.html
+++ /dev/null
@@ -1,68 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.ProtocolColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($protocol)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.HostnameColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($hostname)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PortColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($port)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.EndpointColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($endpoint)</nobr><br/>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.UsernameColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($username)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PasswordColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>********</nobr><br/>
-    </td>
-  </tr>
-</table>
diff --git a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/editConfiguration.js b/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/editConfiguration.js
deleted file mode 100644
index 813d4e6..0000000
--- a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/editConfiguration.js
+++ /dev/null
@@ -1,70 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig() {
-  return true;
-}
-
-function checkConfigForSave() {
-  if (editconnection.hostname.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.HostnameMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.hostname.focus();
-    return false;
-  }
-  if (editconnection.hostname.value.indexOf(":") != -1 || editconnection.hostname.value.indexOf("/") != -1) {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.HostNameCannotContainColonOrSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.hostname.focus();
-    return false;
-  }
-  if (editconnection.port.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.PortMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if (!isInteger(editconnection.port.value)) {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.PortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if (editconnection.endpoint.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.EndpointMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.endpoint.focus();
-    return false;
-  }
-  if (editconnection.endpoint.value.substring(0,1) != "/") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.EndpointMustStartWithSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.endpoint.focus();
-    return false;
-  }
-  if (editconnection.storeid.value == "") {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.StoreIDMustNotBeEmpty'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Alfresco.Server'))");
-    editconnection.storeid.focus();
-    return false;
-  }
-  return true;
-}
-// -->
-</script>
diff --git a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/editConfiguration_Server.html b/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/editConfiguration_Server.html
deleted file mode 100644
index acd5d8d..0000000
--- a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/editConfiguration_Server.html
+++ /dev/null
@@ -1,119 +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.
--->
-
-#if($tabName == "Server")
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select id="protocol" name="protocol">
-  #if($protocol == "http")
-        <option value="http" selected="selected">http</option>
-  #else
-        <option value="http">http</option>
-  #end
-  #if($protocol == "https")
-        <option value="https" selected="selected">https</option>
-  #else
-        <option value="https">https</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.HostnameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="hostname" type="text" size="32" value="$Encoder.attributeEscape($hostname)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="port" type="text" size="5" value="$Encoder.attributeEscape($port)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.EndpointColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="endpoint" type="text" size="32" value="$Encoder.attributeEscape($endpoint)" />
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.StoreProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select id="storeprotocol" name="protocol">
-  #if($storeprotocol == "archive")
-        <option value="http" selected="selected">archive</option>
-  #else
-        <option value="http">archive</option>
-  #end
-  #if($storeprotocol == "workspace")
-        <option value="workspace" selected="selected">workspace</option>
-  #else
-        <option value="workspace">workspace</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.StoreIDColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="storeid" type="text" size="32" value="$Encoder.attributeEscape($storeid)"/>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.UsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="username" type="text" size="32" value="$Encoder.attributeEscape($username)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input name="password" type="password" size="32" value="$Encoder.attributeEscape($password)"/>
-    </td>
-  </tr>
-</table>
-#else
-<input type="hidden" name="protocol" value="$Encoder.attributeEscape($protocol)" />
-<input type="hidden" name="hostname" value="$Encoder.attributeEscape($hostname)" />
-<input type="hidden" name="port" value="$Encoder.attributeEscape($port)" />
-<input type="hidden" name="endpoint" value="$Encoder.attributeEscape($endpoint)" />
-<input type="hidden" name="storeprotocol" value="$Encoder.attributeEscape($storeprotocol)" />
-<input type="hidden" name="storeid" value="$Encoder.attributeEscape($storeid)" />
-<input type="hidden" name="username" value="$Encoder.attributeEscape($username)" />
-<input type="hidden" name="password" value="$Encoder.attributeEscape($password)" />
-#end
diff --git a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/viewConfiguration.html b/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/viewConfiguration.html
deleted file mode 100644
index cd9d41a..0000000
--- a/connectors/alfresco-webscript/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/viewConfiguration.html
+++ /dev/null
@@ -1,85 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.ProtocolColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($protocol)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.HostnameColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($hostname)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PortColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($port)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.EndpointColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($endpoint)</nobr><br/>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.StoreProtocolColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($storeprotocol)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.StoreIDColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($storeid)</nobr><br/>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.UsernameColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>$Encoder.bodyEscape($username)</nobr><br/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Alfresco.PasswordColon'))</nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>********</nobr><br/>
-    </td>
-  </tr>
-</table>
diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/AlfrescoAuthorityConnectorTest.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/AlfrescoAuthorityConnectorTest.java
deleted file mode 100644
index 6560341..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/alfrescowebscript/AlfrescoAuthorityConnectorTest.java
+++ /dev/null
@@ -1,46 +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 org.apache.manifoldcf.authorities.authorities.alfrescowebscript;
-
-import com.github.maoo.indexer.client.AlfrescoClient;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import com.google.gson.Gson;
-
-@RunWith(MockitoJUnitRunner.class)
-public class AlfrescoAuthorityConnectorTest {
-  private final Gson gson = new Gson();
-
-  @Mock
-  private AlfrescoClient client;
-   
-    
-  @Before
-  public void setup() throws Exception {
-	  // TODO
-  }
-  
-  @Test
-  public void testAuthorities(){
-	  // TODO
-  }
-  
-}
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/AlfrescoConnectorTest.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/AlfrescoConnectorTest.java
deleted file mode 100644
index 7b2e4e4..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/AlfrescoConnectorTest.java
+++ /dev/null
@@ -1,232 +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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Date;
-
-import com.github.maoo.indexer.client.AlfrescoClient;
-import com.github.maoo.indexer.client.AlfrescoFilters;
-import com.github.maoo.indexer.client.AlfrescoResponse;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.system.SeedingActivity;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class AlfrescoConnectorTest {
-  
-  @Mock
-  private AlfrescoClient client;
- 
-  private AlfrescoConnector connector;
-    
-  @Before
-  public void setup() throws Exception {
-    connector = new AlfrescoConnector();
-    connector.setClient(client);
-
-    when(client.fetchNodes(anyInt(), anyInt(), Mockito.any(AlfrescoFilters.class)))
-            .thenReturn(new AlfrescoResponse(
-                    0, 0, "", "", Collections.<Map<String, Object>>emptyList()));
-  }
-
-  @Test
-  public void whenAddingSeedDocumentTheAlfrescoClientShouldBeUsed() throws Exception {
-    SeedingActivity activities = mock(SeedingActivity.class);
-    Specification spec = new Specification();
-    long seedTime = 0;
-    
-    connector.addSeedDocuments(activities, spec, "", seedTime, BaseRepositoryConnector.JOBMODE_ONCEONLY);
-
-    verify(client).fetchNodes(anyInt(), anyInt(),  Mockito.any(AlfrescoFilters.class));
-  }
-
-  @Test
-  public void whenTheClientIsCalledItShouldUseThePreviouslySentLastTransactionId() throws
-          Exception {
-    long firstTransactionId = 0;
-    long lastTransactionId = 5;
-    long firstAclChangesetId = 0;
-    long lastAclChangesetId = 5;
-
-    when(client.fetchNodes(anyInt(), anyInt(), Mockito.any(AlfrescoFilters.class)))
-            .thenReturn(new AlfrescoResponse(
-                    lastTransactionId, lastAclChangesetId));
-
-    connector.addSeedDocuments(mock(SeedingActivity.class),
-            new Specification(), "", 0, BaseRepositoryConnector.JOBMODE_ONCEONLY);
-    verify(client, times(1)).fetchNodes(eq(firstTransactionId), eq(firstAclChangesetId), Mockito.any(AlfrescoFilters.class));
-
-    verify(client, times(1)).fetchNodes(eq(lastTransactionId), eq(lastAclChangesetId), Mockito.any(AlfrescoFilters.class));
-  }
-
-  
-  @Test
-  public void whenADocumentIsReturnedItShouldBeAddedToManifold() throws Exception {
-    TestDocument testDocument = new TestDocument();
-    when(client.fetchNodes(anyInt(), anyInt(), Mockito.any(AlfrescoFilters.class)))
-            .thenReturn(new AlfrescoResponse(0, 0, "", "",
-                    Arrays.<Map<String, Object>>asList(testDocument)));
-
-    SeedingActivity seedingActivity = mock(SeedingActivity.class);
-    connector.addSeedDocuments(seedingActivity, new Specification(), "", 0, BaseRepositoryConnector.JOBMODE_ONCEONLY);
-
-    verify(seedingActivity).addSeedDocument(eq(TestDocument.uuid));
-  }
-
-  @Test
-  public void whenProcessingDocumentsNodeRefsAreUsedAsDocumentURI() throws Exception {
-    TestDocument testDocument = new TestDocument();
-    testDocument.put("cm:modified","2014-10-02T16:15:25.124Z");
-    testDocument.put("size","115");
-    testDocument.put("mimetype","text/plain");
-    testDocument.put("contentUrlPath","http://localhost:8080/foo");
-    IProcessActivity activities = mock(IProcessActivity.class);
-    when(activities.checkDocumentNeedsReindexing(anyString(),anyString()))
-      .thenReturn(true);
-    when(activities.checkLengthIndexable(anyLong()))
-      .thenReturn(true);
-    when(activities.checkMimeTypeIndexable(anyString()))
-      .thenReturn(true);
-    when(activities.checkDateIndexable((Date)anyObject()))
-      .thenReturn(true);
-    when(activities.checkURLIndexable(anyString()))
-      .thenReturn(true);
-    IExistingVersions statuses = mock(IExistingVersions.class);
-    
-    when(client.fetchNode(anyString()))
-      .thenReturn(new AlfrescoResponse(0, 0, "", "",
-            Arrays.<Map<String, Object>>asList(testDocument)));
-
-    when(client.fetchMetadata(anyString()))
-      .thenReturn(testDocument);
-    
-    when(client.fetchContent(anyString()))
-      .thenReturn(new java.io.ByteArrayInputStream(new byte[0]));
-
-//    processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-//            IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    connector.processDocuments(new String[]{TestDocument.uuid}, statuses, new Specification(), activities, 0, true);
-
-    ArgumentCaptor<RepositoryDocument> rd = ArgumentCaptor.forClass(RepositoryDocument.class);
-    verify(activities)
-            .checkDocumentNeedsReindexing(eq(TestDocument.uuid), eq("+1412266525124"));
-    verify(activities)
-            .checkLengthIndexable(eq(115L));
-    verify(activities)
-            .checkMimeTypeIndexable(eq("text/plain"));
-    verify(activities)
-            .checkDateIndexable(eq(org.apache.manifoldcf.core.common.DateParser.parseISO8601Date((String)testDocument.get("cm:modified"))));
-    verify(activities)
-            .ingestDocumentWithException(eq(TestDocument.uuid), anyString(),
-                    eq((String)testDocument.get("contentUrlPath")), rd.capture());
-    
-    Iterator<String> i = rd.getValue().getFields();
-    while(i.hasNext()) {
-      String fieldName = i.next();
-      Object value1 = rd.getValue().getField(fieldName)[0];
-      Object[] values = testDocument.getRepositoryDocument().getField(fieldName);
-      if (values == null) {
-        System.out.println("field "+fieldName+"has no value in testDocument");
-        continue;
-      }
-      Object value2 = testDocument.getRepositoryDocument().getField(fieldName)[0];
-      assert value1.equals(value2);
-    }
-  }
-
-  @Test
-  public void whenProcessingDeletionShouldBeRegisteredAsDeletions() throws Exception {
-    TestDocument testDocument = new TestDocument();
-    testDocument.setDeleted(true);
-
-    when(client.fetchNode(anyString()))
-      .thenReturn(new AlfrescoResponse(0, 0, "", "",
-              Arrays.<Map<String, Object>>asList(testDocument)));
-    
-    IProcessActivity activities = mock(IProcessActivity.class);
-    IExistingVersions statuses = mock(IExistingVersions.class);
-    connector.processDocuments(new String[]{TestDocument.uuid}, statuses, new Specification(), activities, 0, true);
-
-    verify(activities).deleteDocument(eq(TestDocument.uuid));
-    verify(activities, never()).ingestDocumentWithException(eq(TestDocument.uuid), anyString(), anyString(),
-            any(RepositoryDocument.class));
-
-  }
-
-  @SuppressWarnings("serial")
-  private class TestDocument extends HashMap<String, Object> {
-    static final String uuid = "abc123";
-    static final String type = "cm:content";
-    static final String nodeRef = "workspace://abc123";
-    static final boolean deleted = false;
-    static final String storeId = "SpacesStore";
-    static final String storeProtocol = "workspace";
-    static final String name = "test";
-
-    public TestDocument() {
-      super();
-      put("uuid", uuid);
-      put("type", type);
-      put("deleted", deleted);
-      put("store_id", storeId);
-      put("store_protocol", storeProtocol);
-      put("nodeRef", nodeRef);
-      put("name", name);
-    }
-
-    public void setDeleted(boolean deleted) {
-      put("deleted", deleted);
-    }
-
-    public RepositoryDocument getRepositoryDocument() throws ManifoldCFException {
-      RepositoryDocument rd = new RepositoryDocument();
-      rd.setFileName(uuid);
-      for(String property : keySet()) {
-        rd.addField(property,get(property).toString());
-      }
-      return rd;
-    }
-  }
-}
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/APISanityHSQLDBIT.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/APISanityHSQLDBIT.java
deleted file mode 100644
index f37b46c..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/APISanityHSQLDBIT.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript.tests;
-
-import org.apache.manifoldcf.core.interfaces.Configuration;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-public class APISanityHSQLDBIT extends BaseITHSQLDB
-{
-  private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHss", Locale.ROOT);
-
-  //@TODO - Should be moved into AlfrescoConnector.java
-  public static final String ALFRESCO_PROTOCOL_PARAM = "protocol";
-  public static final String ALFRESCO_HOSTNAME_PARAM = "hostname";
-  public static final String ALFRESCO_PORT_PARAM = "port";
-  public static final String ALFRESCO_ENDPOINT_PARAM = "/alfresco/service";
-  public static final String ALFRESCO_STOREPROTOCOL_PARAM = "storeprotocol";
-  public static final String ALFRESCO_STOREID_PARAM = "storeid";
-  public static final String ALFRESCO_USERNAME_PARAM = "username";
-  public static final String ALFRESCO_PASSWORD_PARAM = "password";
-
-  public static final String ALFRESCO_PROTOCOL = "http";
-  public static final String ALFRESCO_HOSTNAME = "localhost";
-  public static final String ALFRESCO_PORT = "9090";
-  public static final String ALFRESCO_ENDPOINT = "/alfresco/service";
-  public static final String ALFRESCO_STOREPROTOCOL = "workspace";
-  public static final String ALFRESCO_STOREID = "SpacesStore";
-  public static final String ALFRESCO_USERNAME = "admin";
-  public static final String ALFRESCO_PASSWORD = "admin";
-
-  @Before
-  public void createTestArea()
-    throws Exception
-  {
-    removeTestArea();
-    
-    try
-    {
-      //Adding a document in Alfresco via CMIS
-      CMISUtils cdc = new CMISUtils();
-      cdc.setServiceUrl(ALFRESCO_PROTOCOL+"://"+ALFRESCO_HOSTNAME+":"+ALFRESCO_PORT + "/alfresco/api/-default-/public/cmis/versions/1.1/atom");
-      cdc.setUser("admin");
-      cdc.setPassword("admin");
-      cdc.createDocument("test" + "." + sdf.format(new Date()), "cmis:document");
-
-      //@TODO - Add more logic to push documents into Alfresco
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  @After
-  public void removeTestArea()
-    throws Exception
-  {
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    try
-    {
-      
-      int i;
-
-      // Create a basic file system connection, and save it.
-      ConfigurationNode connectionObject;
-      ConfigurationNode child;
-      Configuration requestObject;
-      Configuration result;
-      
-      connectionObject = new ConfigurationNode("repositoryconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("Alfresco Connector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.crawler.connectors.alfrescowebscript.AlfrescoConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Alfresco Repository Connector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("10");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("configuration");
-      
-      //Alfresco Repository Connector parameters
-
-      //protocol
-      ConfigurationNode alfrescoProtocolNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoProtocolNode.setAttribute("name", ALFRESCO_PROTOCOL_PARAM);
-      alfrescoProtocolNode.setValue(ALFRESCO_PROTOCOL);
-      child.addChild(child.getChildCount(), alfrescoProtocolNode);
-      
-      //server
-      ConfigurationNode alfrescoServerNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoServerNode.setAttribute("name", ALFRESCO_HOSTNAME_PARAM);
-      alfrescoServerNode.setValue(ALFRESCO_HOSTNAME);
-      child.addChild(child.getChildCount(), alfrescoServerNode);
-      
-      //port
-      ConfigurationNode alfrescoPortNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoPortNode.setAttribute("name", ALFRESCO_PORT_PARAM);
-      alfrescoPortNode.setValue(ALFRESCO_PORT);
-      child.addChild(child.getChildCount(), alfrescoPortNode);
-      
-      //endpoint
-      ConfigurationNode alfrescoEndpointNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoEndpointNode.setAttribute("name", ALFRESCO_ENDPOINT_PARAM);
-      alfrescoEndpointNode.setValue(ALFRESCO_ENDPOINT);
-      child.addChild(child.getChildCount(), alfrescoEndpointNode);
-
-      //storeProtocol
-      ConfigurationNode alfrescoStoreProtocol = new ConfigurationNode("_PARAMETER_");
-      alfrescoStoreProtocol.setAttribute("name", ALFRESCO_STOREPROTOCOL_PARAM);
-      alfrescoStoreProtocol.setValue(ALFRESCO_STOREPROTOCOL);
-      child.addChild(child.getChildCount(), alfrescoStoreProtocol);
-
-      //storeId
-      ConfigurationNode alfrescoStoreId = new ConfigurationNode("_PARAMETER_");
-      alfrescoStoreId.setAttribute("name", ALFRESCO_STOREID_PARAM);
-      alfrescoStoreId.setValue(ALFRESCO_STOREID);
-      child.addChild(child.getChildCount(), alfrescoStoreId);
-
-      //username
-      ConfigurationNode alfrescoUsernameNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoUsernameNode.setAttribute("name", ALFRESCO_USERNAME_PARAM);
-      alfrescoUsernameNode.setValue(ALFRESCO_USERNAME);
-      child.addChild(child.getChildCount(), alfrescoUsernameNode);
-
-      //password
-      ConfigurationNode alfrescoPasswordNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoPasswordNode.setAttribute("name", ALFRESCO_PASSWORD_PARAM);
-      alfrescoPasswordNode.setValue(ManifoldCF.obfuscate(ALFRESCO_PASSWORD));
-      child.addChild(child.getChildCount(), alfrescoPasswordNode);
-
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("repositoryconnections/Alfresco%20Connector",201,requestObject);
-
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-      
-      // Create a basic null output connection, and save it.
-      connectionObject = new ConfigurationNode("outputconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("Null Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Null Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("100");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("outputconnections/Null%20Connection",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-
-
-      // Create a job.
-      ConfigurationNode jobObject = new ConfigurationNode("job");
-
-      child = new ConfigurationNode("description");
-      child.setValue("Test Job");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("repository_connection");
-      child.setValue("Alfresco Connector");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      // Revamped way of adding output connection
-      child = new ConfigurationNode("pipelinestage");
-      ConfigurationNode pipelineChild = new ConfigurationNode("stage_id");
-      pipelineChild.setValue("0");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_isoutput");
-      pipelineChild.setValue("true");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_connectionname");
-      pipelineChild.setValue("Null Connection");
-      child.addChild(child.getChildCount(),pipelineChild);
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("run_mode");
-      child.setValue("scan once");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("start_mode");
-      child.setValue("manual");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("hopcount_mode");
-      child.setValue("accurate");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("document_specification");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,jobObject);
-
-      result = performAPIPostOperationViaNodes("jobs",201,requestObject);
-
-      String jobIDString = null;
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-        else if (resultNode.getType().equals("job_id"))
-          jobIDString = resultNode.getValue();
-      }
-      if (jobIDString == null)
-        throw new Exception("Missing job_id from return!");
-
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      long count;
-      count = getJobDocumentsProcessed(jobIDString);
-
-      if (count == 0)
-        throw new ManifoldCFException("No documents processed");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  protected void startJob(String jobIDString)
-    throws Exception
-  {
-    Configuration requestObject = new Configuration();
-    
-    Configuration result = performAPIPutOperationViaNodes("start/"+jobIDString,201,requestObject);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-  }
-  
-  protected void deleteJob(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIDeleteOperationViaNodes("jobs/"+jobIDString,200);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-
-  }
-  
-  protected String getJobStatus(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String status = null;
-    int i = 0;
-    while (i < result.getChildCount()) {
-      ConfigurationNode resultNode = result.findChild(i++);
-
-      if (resultNode.getType().equals("error")) {
-        throw new Exception(resultNode.getValue());
-      } else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("status")) {
-            status = childNode.getValue();
-            System.out.println("Type: "+resultNode.getType());
-            System.out.println("Status: "+status);
-          }
-
-        }
-      }
-    }
-    return status;
-  }
-
-  protected long getJobDocumentsProcessed(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String documentsProcessed = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("documents_processed"))
-            documentsProcessed = childNode.getValue();
-        }
-      }
-    }
-    if (documentsProcessed == null)
-      throw new Exception("Expected a documents_processed field, didn't find it");
-    return new Long(documentsProcessed).longValue();
-  }
-
-  protected void waitJobInactive(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        throw new Exception("No such job: '"+jobIDString+"'");
-      if (status.equals("not yet run"))
-        throw new Exception("Job was never started.");
-      if (status.equals("done"))
-        return;
-      if (status.equals("error"))
-        throw new Exception("Job reports error.");
-      ManifoldCF.sleep(1000L);
-      continue;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-  
-  protected void waitJobDeleted(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        return;
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-}
diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/BaseITHSQLDB.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/BaseITHSQLDB.java
deleted file mode 100644
index d4b8e64..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript.tests;
-
-import org.eclipse.jetty.security.HashLoginService;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.webapp.WebAppContext;
-
-import org.junit.Before;
-
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected Server alfrescoServer = null;
-
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Alfresco"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.alfrescowebscript.AlfrescoConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-  @Before
-  public void setUpAlfresco()
-    throws Exception
-  {
-    alfrescoServer = new Server(9090);
-    alfrescoServer.setStopAtShutdown(true);
-
-    String alfrescoServerWarPath = "../../connectors/alfresco-webscript/test-materials-proprietary/alfresco.war";
-
-    if (System.getProperty("alfrescoServerWarPath") != null)
-      alfrescoServerWarPath = System.getProperty("alfrescoServerWarPath");
-
-    ContextHandlerCollection contexts = new ContextHandlerCollection();
-    alfrescoServer.setHandler(contexts);
-
-    WebAppContext alfrescoServerApi = new WebAppContext(alfrescoServerWarPath,"/alfresco");
-    alfrescoServerApi.setParentLoaderPriority(false);
-    HashLoginService dummyLoginService = new HashLoginService("TEST-SECURITY-REALM");
-    alfrescoServerApi.getSecurityHandler().setLoginService(dummyLoginService);
-    contexts.addHandler(alfrescoServerApi);
-
-    alfrescoServer.start();
-    boolean entered = false;
-    
-    while(alfrescoServer.isStarted() 
-        && alfrescoServerApi.isStarted()
-        && !entered){
-      entered = true;
-      Thread.sleep(5000);
-    }
-  }
-}
diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/BaseUIHSQLDB.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 6be9a51..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript.tests;
-
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Alfresco Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.alfrescowebscript.AlfrescoConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/CMISUtils.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/CMISUtils.java
deleted file mode 100644
index dda302d..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/CMISUtils.java
+++ /dev/null
@@ -1,115 +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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript.tests;

-

-

-import org.apache.chemistry.opencmis.client.api.*;

-import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;

-import org.apache.chemistry.opencmis.commons.PropertyIds;

-import org.apache.chemistry.opencmis.commons.SessionParameter;

-import org.apache.chemistry.opencmis.commons.data.ContentStream;

-import org.apache.chemistry.opencmis.commons.enums.BindingType;

-import org.apache.chemistry.opencmis.commons.enums.VersioningState;

-

-import java.io.ByteArrayInputStream;

-import java.io.InputStream;

-import java.nio.charset.StandardCharsets;

-import java.util.HashMap;

-import java.util.List;

-import java.util.Map;

-

-public class CMISUtils {

-

-  private String serviceUrl = "http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom";

-  private String user;

-  private String password;

-  private String folderName = "";

-

-  private Session session = null;

-  public Session getSession() {

-    if (session == null) {

-      SessionFactory factory = SessionFactoryImpl.newInstance();

-      Map<String, String> parameter = new HashMap<String, String>();

-      parameter.put(SessionParameter.USER, getUser());

-      parameter.put(SessionParameter.PASSWORD, getPassword());

-      parameter.put(SessionParameter.ATOMPUB_URL, getServiceUrl());

-      parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());

-      List<Repository> repositories = factory.getRepositories(parameter);

-      this.session = repositories.get(0).createSession();

-    }

-    return this.session;

-  }

-

-  public Document createDocument(String docName, String contentType) {

-    Session session = getSession();

-    Folder folder = (Folder) session.getObjectByPath("/" + getFolderName());

-    String timeStamp = new Long(System.currentTimeMillis()).toString();

-    String filename = docName + " (" + timeStamp + ")";

-    Map<String, Object> properties = new HashMap<String, Object>();

-    properties.put(PropertyIds.OBJECT_TYPE_ID, contentType);

-    properties.put(PropertyIds.NAME, filename);

-    properties.put(PropertyIds.IS_MAJOR_VERSION, true);

-    properties.put(PropertyIds.IS_LATEST_MAJOR_VERSION, true);

-

-    String docText = "Lorem ipsum";

-    byte[] content = docText.getBytes(StandardCharsets.UTF_8);

-    InputStream stream = new ByteArrayInputStream(content);

-    ContentStream contentStream = session.getObjectFactory().createContentStream(

-        filename,

-        Long.valueOf(content.length),

-        "text/plain",

-        stream);

-    Document doc = folder.createDocument(

-        properties,

-        contentStream,

-        VersioningState.MAJOR);

-

-    return doc;

-  }

-

-  public String getServiceUrl() {

-    return serviceUrl;

-  }

-

-  public void setServiceUrl(String serviceUrl) {

-    this.serviceUrl = serviceUrl;

-  }

-

-  public String getPassword() {

-    return password;

-  }

-

-  public void setPassword(String password) {

-    this.password = password;

-  }

-

-  public String getUser() {

-    return user;

-  }

-

-  public void setUser(String user) {

-    this.user = user;

-  }

-

-  public String getFolderName() {

-    return folderName;

-  }

-

-  public void setFolderName(String folderName) {

-    this.folderName = folderName;

-  }

-}

diff --git a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/NavigationHSQLDBUI.java b/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index bf6b9c8..0000000
--- a/connectors/alfresco-webscript/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfrescowebscript/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript.tests;
-
-import java.util.Locale;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-import org.junit.Test;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","Null Output Connection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","Alfresco Repository Connection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.alfrescowebscript.AlfrescoConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Server tab
-    testerInstance.clickTab("Server");
-    testerInstance.setValue("username", "admin");
-    testerInstance.setValue("password", "admin");
-    testerInstance.selectValue("protocol", "http");
-    testerInstance.setValue("hostname", "localhost");
-    testerInstance.setValue("endpoint", "/alfresco/service");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","Alfresco Job");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","Null Output Connection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","Alfresco Repository Connection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // Click on "Filtering Configuraton" tab
-    testerInstance.clickTab("Filtering Configuration");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-    System.out.println("JobId: " + jobID);
-    
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete Alfresco Repository Connection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete Null Output Connection");
-    testerInstance.acceptAlert();
-  }
-  
-}
diff --git a/connectors/alfresco-webscript/connector/src/test/resources/authorities.sample.json b/connectors/alfresco-webscript/connector/src/test/resources/authorities.sample.json
deleted file mode 100644
index 5d33bcb..0000000
--- a/connectors/alfresco-webscript/connector/src/test/resources/authorities.sample.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-    "username" : "admin",
-    "authorities" : [
-    "GROUP_ALFRESCO_ADMINISTRATORS"
-    ,
-    "GROUP_EMAIL_CONTRIBUTORS"
-    ,
-    "GROUP_EVERYONE"
-    ,
-    "GROUP_site_konner"
-    ,
-    "GROUP_site_konner_SiteManager"
-    ,
-    "GROUP_site_swsdp"
-    ,
-    "GROUP_site_swsdp_SiteManager"
-    ,
-    "ROLE_ADMINISTRATOR"
-    ]
-}
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/test/resources/metadata.sample.json b/connectors/alfresco-webscript/connector/src/test/resources/metadata.sample.json
deleted file mode 100644
index 961ae12..0000000
--- a/connectors/alfresco-webscript/connector/src/test/resources/metadata.sample.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-	"path": "A/B/C",
-	"readableAuthorities": [ "1", "2", "3" ],
-	"properties": [ {
-			"name": "pippo",
-			"value": "pluto",
-			"type": "java.lang.String"
-		}, {
-			"name": "foo",
-			"value": "5",
-			"type": "java.lang.Double"
-		}
-	],
-	"aspects": [ "a", "b", "c" ]
-}
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/connector/src/test/resources/multi.authorities.sample.json b/connectors/alfresco-webscript/connector/src/test/resources/multi.authorities.sample.json
deleted file mode 100644
index 1b90b42..0000000
--- a/connectors/alfresco-webscript/connector/src/test/resources/multi.authorities.sample.json
+++ /dev/null
@@ -1,24 +0,0 @@
-[
-    {
-        username:"guest",
-        authorities:[
-            "ROLE_GUEST"
-        ]
-    },
-    {
-        username:"abeecher",
-        authorities:[
-            "GROUP_EVERYONE",
-            "GROUP_site_swsdp",
-            "GROUP_site_swsdp_SiteCollaborator"
-        ]
-    },
-    {
-        username:"mjackson",
-        authorities:[
-            "GROUP_EVERYONE",
-            "GROUP_site_swsdp",
-            "GROUP_site_swsdp_SiteManager"
-        ]
-    }
-]
\ No newline at end of file
diff --git a/connectors/alfresco-webscript/pom.xml b/connectors/alfresco-webscript/pom.xml
deleted file mode 100644
index 9bec8c6..0000000
--- a/connectors/alfresco-webscript/pom.xml
+++ /dev/null
@@ -1,437 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.manifoldcf</groupId>
-        <artifactId>mcf-connectors</artifactId>
-        <version>2.10-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <developers>
-        <developer>
-            <name>Maurizio Pillitu</name>
-            <organization>Alfresco</organization>
-            <organizationUrl>http://www.alfresco.com</organizationUrl>
-            <url>http://session.it</url>
-        </developer>
-        <developer>
-            <name>Rafa Haro</name>
-            <organization>Zaizi</organization>
-            <organizationUrl>http://www.zaizi.com</organizationUrl>
-            <url>https://github.com/rafaharo</url>
-        </developer>
-    </developers>
-
-    <artifactId>mcf-alfresco-webscript-connector</artifactId>
-    <name>ManifoldCF - Connectors - Alfresco Webscript</name>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <alfresco.indexer.version>0.8.1</alfresco.indexer.version>
-    </properties>
-
-    <repositories>
-        <repository>
-            <id>alfresco-release</id>
-            <url>https://artifacts.alfresco.com/nexus/content/repositories/releases</url>
-        </repository>
-    </repositories>
-
-    <pluginRepositories>
-        <pluginRepository>
-            <id>alfresco-release</id>
-            <url>https://artifacts.alfresco.com/nexus/content/repositories/releases</url>
-        </pluginRepository>
-    </pluginRepositories>
-
-    <build>
-        <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-        <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-        <resources>
-            <resource>
-                <directory>${basedir}/connector/src/main/native2ascii</directory>
-                <includes>
-                    <include>**/*.properties</include>
-                </includes>
-            </resource>
-            <resource>
-                <directory>${basedir}/connector/src/main/resources</directory>
-                <includes>
-                    <include>**/*.html</include>
-                    <include>**/*.js</include>
-                </includes>
-            </resource>
-        </resources>
-        <testResources>
-            <testResource>
-                <directory>${basedir}/connector/src/test/resources</directory>
-            </testResource>
-        </testResources>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>native2ascii-maven-plugin</artifactId>
-                <version>1.0-beta-1</version>
-                <configuration>
-                    <workDir>target/classes</workDir>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>native2ascii-utf8</id>
-                        <goals>
-                            <goal>native2ascii</goal>
-                        </goals>
-                        <configuration>
-                            <encoding>UTF8</encoding>
-                            <includes>
-                                <include>**/*.properties</include>
-                            </includes>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>**/*Postgresql*.java</exclude>
-                        <exclude>**/*MySQL*.java</exclude>
-                    </excludes>
-                    <forkCount>1</forkCount>
-                    <reuseForks>false</reuseForks>
-                    <workingDirectory>target/test-output</workingDirectory>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-war</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>target/dependency</outputDirectory>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>mcf-api-service</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>war</type>
-                                    <overWrite>false</overWrite>
-                                    <destFileName>mcf-api-service.war</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>mcf-authority-service</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>war</type>
-                                    <overWrite>false</overWrite>
-                                    <destFileName>mcf-authority-service.war</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>mcf-crawler-ui</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>war</type>
-                                    <overWrite>false</overWrite>
-                                    <destFileName>mcf-crawler-ui.war</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <artifactId>alfresco-indexer-webscripts-war</artifactId>
-                                    <groupId>com.github.maoo.indexer</groupId>
-                                    <version>${alfresco.indexer.version}</version>
-                                    <type>war</type>
-                                    <overWrite>false</overWrite>
-                                    <destFileName>alfresco.war</destFileName>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-failsafe-plugin</artifactId>
-                <version>2.18.1</version>
-                <configuration>
-                    <skipTests>${skipITs}</skipTests>
-                    <systemPropertyVariables>
-                        <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-                        <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-                        <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-                        <alfrescoServerWarPath>../dependency/alfresco.war</alfrescoServerWarPath>
-                    </systemPropertyVariables>
-                    <excludes>
-                        <exclude>**/*Postgresql*.java</exclude>
-                        <exclude>**/*MySQL*.java</exclude>
-                    </excludes>
-                    <forkCount>1</forkCount>
-                    <reuseForks>false</reuseForks>
-                    <workingDirectory>target/test-output</workingDirectory>
-                    <argLine>-Xms512m -Xmx1024m -Xss1024k -XX:MaxPermSize=256m -XX:NewSize=256m</argLine>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>integration-test</id>
-                        <goals>
-                            <goal>integration-test</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>verify</id>
-                        <goals>
-                            <goal>verify</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.github.maoo.indexer</groupId>
-            <artifactId>alfresco-indexer-client</artifactId>
-            <version>${alfresco.indexer.version}</version>
-            <exclusions>
-              <exclusion>
-                <groupId>log4j</groupId>
-                <artifactId>log4j</artifactId>
-              </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-core</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-connector-common</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-agents</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-pull-agent</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-ui-core</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.chemistry.opencmis</groupId>
-            <artifactId>chemistry-opencmis-client-impl</artifactId>
-            <version>0.13.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-core</artifactId>
-          <version>${project.version}</version>
-          <type>test-jar</type>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-agents</artifactId>
-          <version>${project.version}</version>
-          <type>test-jar</type>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-pull-agent</artifactId>
-          <version>${project.version}</version>
-          <type>test-jar</type>
-          <scope>test</scope>
-        </dependency>
-
-        <dependency>
-          <groupId>org.postgresql</groupId>
-          <artifactId>postgresql</artifactId>
-          <version>${postgresql.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.hsqldb</groupId>
-          <artifactId>hsqldb</artifactId>
-          <version>${hsqldb.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>mysql</groupId>
-          <artifactId>mysql-connector-java</artifactId>
-          <version>${mysql.version}</version>
-          <scope>test</scope>
-        </dependency>
-
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-api-service</artifactId>
-          <version>${project.version}</version>
-          <type>war</type>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-authority-service</artifactId>
-          <version>${project.version}</version>
-          <type>war</type>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-crawler-ui</artifactId>
-          <version>${project.version}</version>
-          <type>war</type>
-          <scope>test</scope>
-        </dependency>
-
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-server</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-util</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-plus</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-webapp</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-servlet</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-http</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-io</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-security</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-continuation</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-xml</artifactId>
-          <version>${jetty.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty.toolchain</groupId>
-          <artifactId>jetty-schemas</artifactId>
-          <version>${jetty-schemas.version}</version>
-          <scope>test</scope>
-        </dependency>
-
-        <dependency>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jsp-api-2.1-glassfish</artifactId>
-          <version>${glassfish.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jsp-2.1-glassfish</artifactId>
-          <version>${glassfish.version}</version>
-          <scope>test</scope>
-        </dependency>
-
-        <dependency>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-api</artifactId>
-          <version>${slf4j.version}</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-simple</artifactId>
-          <version>${slf4j.version}</version>
-          <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>${mockito.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.tomakehurst</groupId>
-            <artifactId>wiremock</artifactId>
-            <version>${wiremock.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>${junit.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-</project>
diff --git a/connectors/alfresco-webscript/test-materials-proprietary/README.txt b/connectors/alfresco-webscript/test-materials-proprietary/README.txt
deleted file mode 100644
index 1e42d5d..0000000
--- a/connectors/alfresco-webscript/test-materials-proprietary/README.txt
+++ /dev/null
@@ -1,18 +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.
-
-To test this connector, copy the alfresco.war, including h2 support, into this
-directory, and use the "ant test" target for the standard ant build.  You can read more
-about the process on the "how-to-build-and-deploy.html" documentation page.
diff --git a/connectors/alfresco/.gitignore b/connectors/alfresco/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/connectors/alfresco/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/connectors/alfresco/build.xml b/connectors/alfresco/build.xml
deleted file mode 100644
index 8d843d7..0000000
--- a/connectors/alfresco/build.xml
+++ /dev/null
@@ -1,134 +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.
--->
-
-<project name="alfresco" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-  
-    <property name="alfresco-client.version" value="4.2.c"/>
-    
-    <target name="calculate-condition">
-        <available file="lib-proprietary/alfresco-web-service-client-${alfresco-client.version}.jar" property="alfrescoStatus"/>
-        <condition property="build-present">
-            <isset property="alfrescoStatus"/>
-        </condition>
-    </target>
-
-    <target name="calculate-testcode-condition">
-        <available file="test-materials-proprietary/alfresco.war" property="alfrescoTestcodeStatus"/>
-        <condition property="tests-present">
-            <isset property="alfrescoTestcodeStatus"/>
-        </condition>
-    </target>
-
-    <target name="precompile-warn" depends="calculate-condition" unless="build-present">
-        <echo message="Alfresco Connector cannot be built without alfresco-web-service-client-${alfresco-client.version}.jar"/>
-    </target>
-
-    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present">
-        <echo message="Alfresco Connector integration tests cannot be be performed without alfresco.war"/>
-    </target>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="lib-proprietary" includes="*.jar"/>
-        <fileset dir="../../lib">
-            <include name="jaxrpc*.jar"/>
-        </fileset>
-    </path>
-
-    <path id="connector-test-classpath">
-        <path refid="mcf-connector-build.connector-test-classpath"/>
-        <fileset file="../../lib/h2*.jar"/>
-        <fileset file="lib-proprietary/alfresco-web-service-client*.jar"/>
-    </path>
-    
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="jaxrpc*.jar"/>
-            </fileset>
-        </copy>
-        <mkdir dir="dist/lib-proprietary-only"/>
-        <copy todir="dist/lib-proprietary-only">
-            <fileset dir="lib-proprietary">
-                <include name="alfresco-web-service-client*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="download-alfresco-ws-client">
-      <get src="https://artifacts.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-web-service-client/${alfresco-client.version}/alfresco-web-service-client-${alfresco-client.version}.jar" dest="lib-proprietary"/>
-    </target>
-	
-    <target name="download-dependencies" depends="download-alfresco-ws-client"/>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="lib-proprietary" excludes="README*.txt"/>
-        </delete>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Alfresco"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector"/>
-        </antcall>
-    </target>
-
-    <target name="run-IT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="1024m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <jvmarg value="-DalfrescoServerWarPath=../test-materials-proprietary/alfresco.war"/>
-            <jvmarg value="-Xms512m"/>
-            <jvmarg value="-Xmx1024m"/>
-            <jvmarg value="-Xss1024k"/>
-            <jvmarg value="-XX:MaxPermSize=256m"/>
-            <jvmarg value="-XX:NewSize=256m"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-</project>
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoConfig.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoConfig.java
deleted file mode 100644
index b618c00..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoConfig.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $Id$ */
-
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-/** 
- * Parameters data for the Alfresco repository connector.
-*/
-public class AlfrescoConfig {
-
-  /** Username parameter */
-  public static final String USERNAME_PARAM = "username";
- 
-  /** Password parameter */
-  public static final String PASSWORD_PARAM = "password";
-  
-  /** Protocol parameter */
-  public static final String PROTOCOL_PARAM = "protocol";
-  
-  /** Server name parameter */
-  public static final String SERVER_PARAM = "server";
-  
-  /** Port parameter */
-  public static final String PORT_PARAM = "port";
-  
-  /** Parameter for the path of the context of the Alfresco Web Services API */
-  public static final String PATH_PARAM = "path";
-  
-  /** The Lucene Query parameter */
-  public static final String LUCENE_QUERY_PARAM = "luceneQuery";
-  
-  /** Tenant domain parameter (optional) */
-  public static final String TENANT_DOMAIN_PARAM = "tenantDomain";
-  
-  /** Separator for the username field dedicated to the tenant domain */
-  public static final String TENANT_DOMAIN_SEP = "@";
-  
-  /** Socket Timeout parameter for the Alfresco Web Service Client */
-  public static final String SOCKET_TIMEOUT_PARAM = "socketTimeout";
-  
-  //default values
-  public static final String USERNAME_DEFAULT_VALUE = "admin";
-  public static final String PASSWORD_DEFAULT_VALUE = "admin";
-  public static final String PROTOCOL_DEFAULT_VALUE = "http";
-  public static final String SERVER_DEFAULT_VALUE = "localhost";
-  public static final String PORT_DEFAULT_VALUE = "8080";
-  public static final String PATH_DEFAULT_VALUE = "/alfresco/api";
-  public static final int SOCKET_TIMEOUT_DEFAULT_VALUE = 120000;
-  
-}
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java
deleted file mode 100644
index 481394e..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java
+++ /dev/null
@@ -1,1028 +0,0 @@
-/* $Id$ */
-
-/**
-
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.text.ParseException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.alfresco.webservice.authentication.AuthenticationFault;
-import org.alfresco.webservice.content.Content;
-import org.alfresco.webservice.repository.QueryResult;
-import org.alfresco.webservice.types.NamedValue;
-import org.alfresco.webservice.types.Node;
-import org.alfresco.webservice.types.Predicate;
-import org.alfresco.webservice.types.Reference;
-import org.alfresco.webservice.types.ResultSet;
-import org.alfresco.webservice.types.ResultSetRow;
-import org.alfresco.webservice.util.AuthenticationDetails;
-import org.alfresco.webservice.util.AuthenticationUtils;
-import org.alfresco.webservice.util.WebServiceException;
-import org.alfresco.webservice.util.WebServiceFactory;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class AlfrescoRepositoryConnector extends BaseRepositoryConnector {
-
-  /** Fetch activity */
-  public final static String ACTIVITY_FETCH = "fetch";
-
-  /** Username value for the Alfresco session */
-  protected String username = null;
-  
-  /** Password value for the Alfresco session */
-  protected String password = null;
-  
-  /** Endpoint protocol */
-  protected String protocol = null;
-  
-  /** Endpoint server name */
-  protected String server = null;
-  
-  /** Endpoint port */
-  protected String port = null;
-  
-  /** Endpoint context path of the Alfresco webapp */
-  protected String path = null;
-  
-  /** Endpoint with all the details */
-  protected String endpoint = null;
-  
-  /** Alfresco Tenant domain */
-  protected String tenantDomain = null;
-  
-  /** Socket Timeout for the Alfresco Web Service Client */
-  protected int socketTimeout = -1;
-  
-  protected AuthenticationDetails session = null;
-
-  protected static final long timeToRelease = 300000L;
-  protected long lastSessionFetch = -1L;
-
-  protected static final String RELATIONSHIP_CHILD = "child";
-
-  // Tabs
-  
-  /** Tab name parameter for managin the view of the Web UI */
-  private static final String TAB_NAME_PARAM = "TabName";
-  
-  /** The sequence number parameter */
-  private static final String SEQ_NUM_PARAM = "SeqNum";
-  
-  /** The selected sequence number parameter */
-  private static final String SELECTED_NUM_PARAM = "SelectedNum";
-  
-  /** The Lucene Query label for the configuration tab of the job settings */
-  private static final String TAB_LABEL_LUCENE_QUERY_RESOURCE = "AlfrescoConnector.LuceneQuery";
-  /** Alfresco Server configuration tab name */
-  private static final String ALFRESCO_SERVER_TAB_RESOURCE = "AlfrescoConnector.Server";
-
-  // Velocity template names
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_Server.html";
-  
-  /** Forward to the javascript to check the specification parameters for the job */
-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification.js";
-
-  /** Forward to the template to edit the configuration parameters for the job */
-  private static final String EDIT_SPEC_FORWARD_LUCENEQUERY = "editSpecification_LuceneQuery.html";
-  
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-  
-  /** Forward to the template to view the specification parameters for the job */
-  private static final String VIEW_SPEC_FORWARD = "viewSpecification.html";
-
-  // Other miscellaneous constants
-  
-  /** The root node for the Alfresco connector configuration in ManifoldCF */
-  private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-
-  /** Read activity */
-  protected final static String ACTIVITY_READ = "read document";
-  
-  /** Separator used when a node has more than one content stream. More than one d:content property */
-  private static final String INGESTION_SEPARATOR_FOR_MULTI_BINARY = ";";
-
-  /**
-   * Constructor
-   */
-  public AlfrescoRepositoryConnector() {
-    super();
-  }
-
-  /** 
-   * Return the list of activities that this connector supports (i.e. writes into the log).
-   * @return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[] { ACTIVITY_FETCH };
-  }
-
-  /** Get the bin name strings for a document identifier.  The bin name describes the queue to which the
-   * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-   * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-   * multiple queues or bins.
-   * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-   * that is likely to correspond to a real resource that will need real throttle protection.
-   *@param documentIdentifier is the document identifier.
-   *@return the set of bin names.  If an empty array is returned, it is equivalent to there being no request
-   * rate throttling available for this identifier.
-   */
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[] { server };
-  }
-
-  /** 
-   * Close the connection.  Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (session != null) {
-      try {
-        AuthenticationUtils.endSession();
-      } catch (Exception e) {
-        Logging.connectors.error("Alfresco: error disconnect:"+e.getMessage(), e);
-        throw new ManifoldCFException("Alfresco: error disconnect:"+e.getMessage(), e);
-      }
-      session = null;
-      lastSessionFetch = -1L;
-    }
-
-    username = null;
-    password = null;
-    protocol = null;
-    server = null;
-    port = null;
-    path = null;
-    endpoint = null;
-    tenantDomain = null;
-    socketTimeout = AlfrescoConfig.SOCKET_TIMEOUT_DEFAULT_VALUE;
-
-  }
-
-  /** Connect.
-   *@param configParameters is the set of configuration parameters, which
-   * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-   * out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    username = params.getParameter(AlfrescoConfig.USERNAME_PARAM);
-    password = params.getParameter(AlfrescoConfig.PASSWORD_PARAM);
-    protocol = params.getParameter(AlfrescoConfig.PROTOCOL_PARAM);
-    server = params.getParameter(AlfrescoConfig.SERVER_PARAM);
-    port = params.getParameter(AlfrescoConfig.PORT_PARAM);
-    path = params.getParameter(AlfrescoConfig.PATH_PARAM);
-    tenantDomain = params.getParameter(AlfrescoConfig.TENANT_DOMAIN_PARAM);
-    
-    if(params.getParameter(AlfrescoConfig.SOCKET_TIMEOUT_PARAM)!=null){
-      socketTimeout = Integer.parseInt(params.getParameter(AlfrescoConfig.SOCKET_TIMEOUT_PARAM));
-    } else {
-      socketTimeout = AlfrescoConfig.SOCKET_TIMEOUT_DEFAULT_VALUE;
-    }
-    
-    //endpoint
-    if(StringUtils.isNotEmpty(protocol)
-        && StringUtils.isNotEmpty(server)
-        && StringUtils.isNotEmpty(port)
-        && StringUtils.isNotEmpty(path)){
-      endpoint = protocol+"://"+server+":"+port+path;
-    }
-    
-    //tenant domain (optional parameter). Pattern: username@tenantDomain
-    if(StringUtils.isNotEmpty(tenantDomain)){
-      username += AlfrescoConfig.TENANT_DOMAIN_SEP + tenantDomain;
-    }
-    
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-   *@return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /** Set up a session */
-  protected void getSession() throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      // Check for parameter validity
-
-      if (StringUtils.isEmpty(username))
-        throw new ManifoldCFException("Parameter " + AlfrescoConfig.USERNAME_PARAM
-            + " required but not set");
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Alfresco: Username = '" + username + "'");
-
-      if (StringUtils.isEmpty(password))
-        throw new ManifoldCFException("Parameter " + AlfrescoConfig.PASSWORD_PARAM
-            + " required but not set");
-
-      Logging.connectors.debug("Alfresco: Password exists");
-
-      if (StringUtils.isEmpty(protocol))
-        throw new ManifoldCFException("Parameter " + AlfrescoConfig.PROTOCOL_PARAM
-            + " required but not set");
-      
-      if (StringUtils.isEmpty(server))
-        throw new ManifoldCFException("Parameter " + AlfrescoConfig.SERVER_PARAM
-            + " required but not set");
-      
-      if (StringUtils.isEmpty(port))
-        throw new ManifoldCFException("Parameter " + AlfrescoConfig.PORT_PARAM
-            + " required but not set");
-      
-      if (StringUtils.isEmpty(path))
-        throw new ManifoldCFException("Parameter " + AlfrescoConfig.PATH_PARAM
-            + " required but not set");
-    
-    endpoint = protocol+"://"+server+":"+port+path;
-    try {
-    
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();
-      
-    }catch (AuthenticationFault e) {
-        Logging.connectors.warn(
-            "Alfresco: Error during authentication. Username: "+username + ", endpoint: "+endpoint+". "
-                + e.getMessage(), e);
-        handleIOException(e);
-      } catch (WebServiceException e){
-        Logging.connectors.warn(
-            "Alfresco: Error during trying to authenticate the user. Username: "+username + ", endpoint: "+endpoint
-            +". Please check the connector parameters. " 
-            + e.getMessage(), e);
-        throw new ManifoldCFException("Alfresco: Error during trying to authenticate the user. Username: "+username + ", endpoint: "+endpoint
-            +". Please check the connector parameters. "
-            + e.getMessage(), e);
-      }
-    
-    lastSessionFetch = System.currentTimeMillis();
-    
-    }
-  }
-
-  /**
-   * Release the session, if it's time.
-   */
-  protected void releaseCheck() throws ManifoldCFException {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-        try {
-          AuthenticationUtils.endSession();
-        } catch (Exception e) {
-          Logging.connectors.error(
-              "Alfresco: Error during releasing the connection.");
-          throw new ManifoldCFException( "Alfresco: Error during releasing the connection.");
-        }
-        session = null;
-        lastSessionFetch = -1L;
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException,
-      ServiceInterruption {
-    while (true) {
-      try {
-          getSession();
-          String ticket = AuthenticationUtils.getTicket();
-          if(StringUtils.isEmpty(ticket)){
-            Logging.connectors.error(
-                "Alfresco: Error during checking the connection.");
-            throw new ManifoldCFException( "Alfresco: Error during checking the connection.");
-          }
-          AuthenticationUtils.endSession();
-        } catch (Exception e) {
-          Logging.connectors.error(
-              "Alfresco: Error during checking the connection.");
-          throw new ManifoldCFException( "Alfresco: Error during checking the connection.");
-        }
-        session=null;
-        return;
-    }
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-   * in active use.
-   */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-        try {
-          AuthenticationUtils.endSession();
-          session = null;
-          lastSessionFetch = -1L;
-        } catch (Exception e) {
-          Logging.connectors.error(
-              "Alfresco: Error during polling: "
-                  + e.getMessage(), e);
-          throw new ManifoldCFException("Alfresco: Error during polling: "
-              + e.getMessage(),e);
-        }
-    }
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {
-
-    String luceneQuery = StringUtils.EMPTY;
-    int i = 0;
-    while (i < spec.getChildCount()) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        luceneQuery = sn.getAttributeValue(AlfrescoConfig.LUCENE_QUERY_PARAM);
-        break;
-      }
-      i++;
-    }
-    
-    try{
-      QueryResult queryResult = null;
-      if (StringUtils.isEmpty(luceneQuery)) {
-        // get documents from the root of the Alfresco Repository
-        queryResult = SearchUtils.getChildrenFromCompanyHome(endpoint, username, password, socketTimeout, session);
-      } else {
-        // execute a Lucene query against the repository
-        queryResult = SearchUtils.luceneSearch(endpoint, username, password, socketTimeout, session, luceneQuery);
-      }
-  
-      if(queryResult!=null){
-        ResultSet resultSet = queryResult.getResultSet();
-        ResultSetRow[] resultSetRows = resultSet.getRows();
-        for (ResultSetRow resultSetRow : resultSetRows) {
-            NamedValue[] properties = resultSetRow.getColumns();
-            String nodeReference = PropertiesUtils.getNodeReference(properties);
-            activities.addSeedDocument(nodeReference);
-          }
-      }
-    } catch(IOException e){
-      Logging.connectors.warn("Alfresco: IOException: " + e.getMessage(), e);
-      handleIOException(e);
-    }
-    return "";
-  }
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-   *@return the maximum number. 0 indicates "unlimited".
-   */
-  @Override
-  public int getMaxDocumentRequest() {
-    return 1;
-  }
-
-  /**
-   * Return the list of relationship types that this connector recognizes.
-   * 
-   * @return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes() {
-    return new String[] { RELATIONSHIP_CHILD };
-  }
-
-  /**
-   * Read the content of a resource, replace the variable ${PARAMNAME} with the
-   * value and copy it to the out.
-   * 
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException
-   */
-  private static void outputResource(String resName, IHTTPOutput out,
-      Locale locale, Map<String,String> paramMap) throws ManifoldCFException {
-    Messages.outputResourceWithVelocity(out,locale,resName,paramMap,true);
-  }
-
-  /** Fill in Velocity parameters for the Server tab.
-  */
-  private static void fillInServerParameters(Map<String,String> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    String username = parameters.getParameter(AlfrescoConfig.USERNAME_PARAM);
-    if (username == null)
-      username = AlfrescoConfig.USERNAME_DEFAULT_VALUE;
-    paramMap.put(AlfrescoConfig.USERNAME_PARAM, username);
-
-    String password = parameters.getParameter(AlfrescoConfig.PASSWORD_PARAM);
-    if (password == null) 
-      password = AlfrescoConfig.PASSWORD_DEFAULT_VALUE;
-    else
-      password = mapper.mapPasswordToKey(password);
-    paramMap.put(AlfrescoConfig.PASSWORD_PARAM, password);
-    
-    String protocol = parameters.getParameter(AlfrescoConfig.PROTOCOL_PARAM);
-    if (protocol == null)
-      protocol = AlfrescoConfig.PROTOCOL_DEFAULT_VALUE;
-    paramMap.put(AlfrescoConfig.PROTOCOL_PARAM, protocol);
-    
-    String server = parameters.getParameter(AlfrescoConfig.SERVER_PARAM);
-    if (server == null)
-      server = AlfrescoConfig.SERVER_DEFAULT_VALUE;
-    paramMap.put(AlfrescoConfig.SERVER_PARAM, server);
-    
-    String port = parameters.getParameter(AlfrescoConfig.PORT_PARAM);
-    if (port == null)
-      port = AlfrescoConfig.PORT_DEFAULT_VALUE;
-    paramMap.put(AlfrescoConfig.PORT_PARAM, port);
-    
-    String path = parameters.getParameter(AlfrescoConfig.PATH_PARAM);
-    if (path == null)
-      path = AlfrescoConfig.PATH_DEFAULT_VALUE;
-    paramMap.put(AlfrescoConfig.PATH_PARAM, path);
-    
-    String tenantDomain = parameters.getParameter(AlfrescoConfig.TENANT_DOMAIN_PARAM);
-    if (tenantDomain == null)
-      tenantDomain = StringUtils.EMPTY;
-    paramMap.put(AlfrescoConfig.TENANT_DOMAIN_PARAM, tenantDomain);
-    
-    String socketTimeout = parameters.getParameter(AlfrescoConfig.SOCKET_TIMEOUT_PARAM);
-    if (socketTimeout == null)
-      socketTimeout = String.valueOf(AlfrescoConfig.SOCKET_TIMEOUT_DEFAULT_VALUE);
-    paramMap.put(AlfrescoConfig.SOCKET_TIMEOUT_PARAM, socketTimeout);
-    
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-        
-    Map<String,String> paramMap = new HashMap<String,String>();
-        
-    // Fill in parameters for all tabs
-
-    // Server tab
-    fillInServerParameters(paramMap, out, parameters);
-  
-    outputResource(VIEW_CONFIG_FORWARD, out, locale, paramMap);
-  }
-
-  /**
-   * Output the configuration header section. This method is called in the head
-   * section of the connector's configuration page. Its purpose is to add the
-   * required tabs to the list, and to output any javascript methods that might
-   * be needed by the configuration editing HTML.
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @param tabsArray
-   *          is an array of tab names. Add to this array any tab names that are
-   *          specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    // Add Server tab
-    tabsArray.add(Messages.getString(locale,ALFRESCO_SERVER_TAB_RESOURCE));
-
-    Map<String,String> paramMap = new HashMap<String,String>();
-        
-    // Fill in parameters for all tabs
-    fillInServerParameters(paramMap, out, parameters);
-
-    outputResource(EDIT_CONFIG_HEADER_FORWARD, out, locale, paramMap);
-  }
-
-  /** Output the configuration body section.
-   * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-   * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-   * form is "editconnection".
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@param tabName is the current tab name.
-   */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-    
-    // Do the Server tab
-    Map<String,String> paramMap = new HashMap<String,String>();
-    paramMap.put(TAB_NAME_PARAM, tabName);
-    fillInServerParameters(paramMap, out, parameters);
-    outputResource(EDIT_CONFIG_FORWARD_SERVER, out, locale, paramMap);  
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param variableContext
-   *          is the set of variables available from the post, including binary
-   *          file post information.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @return null if all is well, or a string error message if there is an error
-   *         that should prevent saving of the connection (and cause a
-   *         redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException {
-        
-    String username = variableContext.getParameter(AlfrescoConfig.USERNAME_PARAM);
-    if (username != null) {
-      parameters.setParameter(AlfrescoConfig.USERNAME_PARAM, username);
-    }
-
-    String password = variableContext.getParameter(AlfrescoConfig.PASSWORD_PARAM);
-    if (password != null) {
-      parameters.setParameter(AlfrescoConfig.PASSWORD_PARAM, variableContext.mapKeyToPassword(password));
-    }
-    
-    String protocol = variableContext.getParameter(AlfrescoConfig.PROTOCOL_PARAM);
-    if (protocol != null) {
-      parameters.setParameter(AlfrescoConfig.PROTOCOL_PARAM, protocol);
-    }
-    
-    String server = variableContext.getParameter(AlfrescoConfig.SERVER_PARAM);
-    if (server != null) {
-      parameters.setParameter(AlfrescoConfig.SERVER_PARAM, server);
-    }
-    
-    String port = variableContext.getParameter(AlfrescoConfig.PORT_PARAM);
-    if (port != null){
-      parameters.setParameter(AlfrescoConfig.PORT_PARAM, port);
-    }
-    
-    String path = variableContext.getParameter(AlfrescoConfig.PATH_PARAM);
-    if (path != null) {
-      parameters.setParameter(AlfrescoConfig.PATH_PARAM, path);
-    }
-    
-    String tenantDomain = variableContext.getParameter(AlfrescoConfig.TENANT_DOMAIN_PARAM);
-    if (tenantDomain != null){
-      parameters.setParameter(AlfrescoConfig.TENANT_DOMAIN_PARAM, tenantDomain);
-    }
-    
-    String socketTimeout = variableContext.getParameter(AlfrescoConfig.SOCKET_TIMEOUT_PARAM);
-    if (socketTimeout != null){
-      parameters.setParameter(AlfrescoConfig.SOCKET_TIMEOUT_PARAM, socketTimeout);
-    }
-    
-    return null;
-  }
-
-  /** Fill in Velocity parameters for the LuceneQuery tab.
-  */
-  private static void fillInLuceneQueryParameters(Map<String,String> paramMap, Specification ds)
-  {
-    int i = 0;
-    String luceneQuery = "";
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        luceneQuery = sn.getAttributeValue(AlfrescoConfig.LUCENE_QUERY_PARAM);
-      }
-      i++;
-    }
-    paramMap.put(AlfrescoConfig.LUCENE_QUERY_PARAM, luceneQuery);
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String,String> paramMap = new HashMap<String,String>();
-        
-    // Fill in parameters from all tabs
-    fillInLuceneQueryParameters(paramMap, ds);
-    paramMap.put(SEQ_NUM_PARAM, Integer.toString(connectionSequenceNumber));
-
-    outputResource(VIEW_SPEC_FORWARD, out, locale, paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String luceneQuery = variableContext.getParameter(seqPrefix + AlfrescoConfig.LUCENE_QUERY_PARAM);
-    if (luceneQuery != null) {
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode oldNode = ds.getChild(i);
-        if (oldNode.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-          ds.removeChild(i);
-        }
-        else
-          i++;
-      }
-      SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
-      node.setAttribute(AlfrescoConfig.LUCENE_QUERY_PARAM, luceneQuery);
-      ds.addChild(ds.getChildCount(), node);
-    }
-
-    return null;
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-    
-    // Do all tabs in turn.
-        
-    // LuceneQuery tab
-    Map<String,String> paramMap = new HashMap<String,String>();
-    paramMap.put(TAB_NAME_PARAM, tabName);
-    paramMap.put(SEQ_NUM_PARAM, Integer.toString(connectionSequenceNumber));
-    paramMap.put(SELECTED_NUM_PARAM, Integer.toString(actualSequenceNumber));
-
-    fillInLuceneQueryParameters(paramMap, ds);
-    outputResource(EDIT_SPEC_FORWARD_LUCENEQUERY, out, locale, paramMap);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    // Add LuceneQuery tab
-    tabsArray.add(Messages.getString(locale,TAB_LABEL_LUCENE_QUERY_RESOURCE));
-        
-    // Fill in parameters from all tabs
-    Map<String,String> paramMap = new HashMap<String,String>();
-    paramMap.put(SEQ_NUM_PARAM, Integer.toString(connectionSequenceNumber));
-
-    // LuceneQuery tab
-    fillInLuceneQueryParameters(paramMap, ds);
-
-    outputResource(EDIT_SPEC_HEADER_FORWARD, out, locale, paramMap);
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-      
-    for (String documentIdentifier : documentIdentifiers) {
-      // Prepare to access the document
-      String nodeReference = documentIdentifier;
-      String uuid = NodeUtils.getUuidFromNodeReference(nodeReference);
-      
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Alfresco: Processing document identifier '"
-            + nodeReference + "'");
-
-      Reference reference = new Reference();
-      reference.setStore(SearchUtils.STORE);
-      reference.setUuid(uuid);
-      
-      Predicate predicate = new Predicate();
-      predicate.setStore(SearchUtils.STORE);
-      predicate.setNodes(new Reference[]{reference});
-      
-      Node resultNode = null;
-      try {
-        resultNode = NodeUtils.get(endpoint, username, password, socketTimeout, session, predicate);
-      } catch (IOException e) {
-        Logging.connectors.warn(
-            "Alfresco: IOException getting node: "
-                + e.getMessage(), e);
-        handleIOException(e);
-      }
-      
-      NamedValue[] properties = resultNode.getProperties();
-      boolean isDocument;
-      String versionString = "";
-      if (properties != null)
-        isDocument = ContentModelUtils.isDocument(properties);
-      else
-        isDocument = false;
-      if (isDocument){
-        boolean isVersioned = NodeUtils.isVersioned(resultNode.getAspects());
-        if(isVersioned){
-          versionString = NodeUtils.getVersionLabel(properties);
-        }
-      }
-
-      if (versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)) {
-        // Need to (re)index
-      
-        String errorCode = "OK";
-        String errorDesc = StringUtils.EMPTY;
-        Long fileLengthLong = null;
-        
-        long startTime = System.currentTimeMillis();
-        
-        try{    
-          
-          try{
-            boolean isFolder = ContentModelUtils.isFolder(endpoint, username, password, socketTimeout, session, reference);
-            
-            //a generic node in Alfresco could have child-associations
-            if (isFolder) {
-              // queue all the children of the folder
-              QueryResult queryResult = SearchUtils.getChildren(endpoint, username, password, socketTimeout, session, reference);
-              ResultSet resultSet = queryResult.getResultSet();
-              ResultSetRow[] resultSetRows = resultSet.getRows();
-              for (ResultSetRow resultSetRow : resultSetRows) {
-                NamedValue[] childProperties = resultSetRow.getColumns();
-                String childNodeReference = PropertiesUtils.getNodeReference(childProperties);
-                activities.addDocumentReference(childNodeReference, nodeReference, RELATIONSHIP_CHILD);
-              }
-            } 
-
-          }catch(IOException e){
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            Logging.connectors.warn(
-                "Alfresco: IOException finding children: "
-                    + e.getMessage(), e);
-            handleIOException(e);
-          }
-        
-          //a generic node in Alfresco could also have binaries content
-          if (isDocument) {
-            // this is a content to ingest
-            InputStream is = null;
-            long fileLength = 0;
-            try {
-              //properties ingestion
-              RepositoryDocument rd = new RepositoryDocument();      
-              List<NamedValue> contentProperties = PropertiesUtils.getContentProperties(properties);
-              PropertiesUtils.ingestProperties(rd, properties, contentProperties);
-
-              // binaries ingestion - in Alfresco we could have more than one binary for each node (custom content models)
-              for (NamedValue contentProperty : contentProperties) {
-                //we are ingesting all the binaries defined as d:content property in the Alfresco content model
-                Content binary = ContentReader.read(endpoint, username, password, socketTimeout, session, predicate, contentProperty.getName());
-                fileLength = binary.getLength();
-                is = ContentReader.getBinary(endpoint, binary, username, password, socketTimeout, session);
-                rd.setBinary(is, fileLength);
-                  
-                //id is the node reference only if the node has an unique content stream
-                //For a node with a single d:content property: id = node reference
-                String id = PropertiesUtils.getNodeReference(properties);
-                  
-                //For a node with multiple d:content properties: id = node reference;QName
-                //The QName of a property of type d:content will be appended to the node reference
-                if(contentProperties.size()>1){
-                  id = id + INGESTION_SEPARATOR_FOR_MULTI_BINARY + contentProperty.getName();
-                }
-                  
-                //the document uri is related to the specific d:content property available in the node
-                //we want to ingest each content stream that are nested in a single node
-                String documentURI = binary.getUrl();
-                activities.ingestDocumentWithException(documentIdentifier, id, versionString, documentURI, rd);
-                fileLengthLong = new Long(fileLength);
-              }
-                
-              AuthenticationUtils.endSession();
-            
-            } catch (ParseException e) {
-              errorCode = "PARSEEXCEPTION";
-              errorDesc = e.getMessage();
-              Logging.connectors.warn(
-                  "Alfresco: Error during the reading process of dates: "
-                      + e.getMessage(), e);
-              handleParseException(e);
-            } catch (IOException e) {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              Logging.connectors.warn(
-                  "Alfresco: IOException: "
-                      + e.getMessage(), e);
-              handleIOException(e);
-            } finally {
-              session = null;
-              try {
-                if(is!=null){
-                  is.close();
-                }
-              } catch (InterruptedIOException e) {
-                errorCode = null;
-                throw new ManifoldCFException(e.getMessage(), e,
-                    ManifoldCFException.INTERRUPTED);
-              } catch (IOException e) {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                Logging.connectors.warn(
-                    "Alfresco: IOException closing file input stream: "
-                        + e.getMessage(), e);
-                handleIOException(e);
-              }
-            }
-
-          }
-        } catch (ManifoldCFException e) {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            errorCode = null;
-          throw e;
-        } finally {
-          if (errorCode != null)
-            activities.recordActivity(new Long(startTime), ACTIVITY_READ,
-              fileLengthLong, nodeReference, errorCode, errorDesc, null);
-        }
-      }
-    }
-    
-  }
-  
-  private static void handleIOException(IOException e)
-      throws ManifoldCFException, ServiceInterruption {
-      if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-      }
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-  }
-  
-  private void handleParseException(ParseException e) 
-      throws ManifoldCFException {
-    throw new ManifoldCFException(
-        "Alfresco: Error during parsing date values. This should never happen: "+e.getMessage(),e);
-  }
-
-}
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/Constants.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/Constants.java
deleted file mode 100644
index f2a63f5..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/Constants.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-
-public class Constants extends org.alfresco.webservice.util.Constants {
-  
-  public static final String PROP_VERSION_LABEL = createQNameString(NAMESPACE_CONTENT_MODEL, "versionLabel");
-  public static final String PROP_NODE_UUID = createQNameString(NAMESPACE_SYSTEM_MODEL, "node-uuid");
-  public static final String PROP_STORE_PROTOCOL = createQNameString(NAMESPACE_SYSTEM_MODEL, "store-protocol");
-  public static final String PROP_STORE_ID = createQNameString(NAMESPACE_SYSTEM_MODEL, "store-identifier");
-  public static final String NODE_REFERENCE = createQNameString(NAMESPACE_CONTENT_MODEL, "noderef");
-
-}
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/ContentModelUtils.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/ContentModelUtils.java
deleted file mode 100644
index a6b5836..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/ContentModelUtils.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.rmi.RemoteException;
-
-import org.alfresco.webservice.repository.QueryResult;
-import org.alfresco.webservice.repository.RepositoryFault;
-import org.alfresco.webservice.types.NamedValue;
-import org.alfresco.webservice.types.Reference;
-import org.alfresco.webservice.types.ResultSet;
-import org.alfresco.webservice.types.ResultSetRow;
-import org.alfresco.webservice.util.AuthenticationDetails;
-import org.alfresco.webservice.util.AuthenticationUtils;
-import org.alfresco.webservice.util.WebServiceFactory;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class ContentModelUtils {
-
-  /**
-   * this method checks if a node is a document: verify if exists a property named cm:content.
-   * It could be improved to support any property that has a datatype d:content.
-   * @param properties
-   * @return TRUE if the node is a document, otherwise FALSE
-   */
-  public static boolean isDocument(NamedValue[] properties) {
-    for (NamedValue property : properties) {
-      if(property.getName().equals(Constants.PROP_CONTENT)){
-        return true;
-      }
-    }
-    return false;
-  }
-  
-  /**
-   * Check if the current node has associated children
-   * @param session
-   * @param node
-   * @return TRUE if the reference contains a node that is an Alfresco space, otherwise FALSE
-   */
-  public static boolean isFolder(String endpoint, String username, String password, int socketTimeout, AuthenticationDetails session, Reference node) throws ManifoldCFException {
-    QueryResult queryResult = null;
-    try {
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();
-      queryResult = WebServiceFactory.getRepositoryService().queryChildren(node);
-      if(queryResult!=null){
-        ResultSet rs = queryResult.getResultSet();
-        if(rs!=null){
-          ResultSetRow[] rows = rs.getRows();
-          if(rows!=null){
-            if(rows.length>0){
-              return true;
-            }
-          }
-        }
-      }
-      AuthenticationUtils.endSession();
-    } catch (RepositoryFault e) {
-      Logging.connectors.warn(
-          "Alfresco: Repository Error during the queryChildren: "
-              + e.getMessage(), e);
-      ContentModelUtils.handleRepositoryFaultException(e);
-    } catch (RemoteException e) {
-      Logging.connectors.warn(
-          "Alfresco: Remote Error during the queryChildren: "
-              + e.getMessage(), e);
-      ContentModelUtils.handleRemoteException(e);
-    } finally {
-      session = null;
-    }
-    return false;
-  }
-  
-  public static void handleRepositoryFaultException(RepositoryFault e) 
-      throws ManifoldCFException {
-    throw new ManifoldCFException(
-        "Alfresco: Error during getting children: "+e.getMessage(),e);
-  }
-  
-  public static void handleRemoteException(RemoteException e) 
-      throws ManifoldCFException {
-    throw new ManifoldCFException(
-        "Alfresco: Error during getting children: "+e.getMessage(),e);
-  }
-  
-}
\ No newline at end of file
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/ContentReader.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/ContentReader.java
deleted file mode 100644
index 7cd376e..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/ContentReader.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.rmi.RemoteException;
-
-import org.alfresco.webservice.authentication.AuthenticationFault;
-import org.alfresco.webservice.content.Content;
-import org.alfresco.webservice.content.ContentFault;
-import org.alfresco.webservice.types.Predicate;
-import org.alfresco.webservice.util.AuthenticationDetails;
-import org.alfresco.webservice.util.AuthenticationUtils;
-import org.alfresco.webservice.util.ContentUtils;
-import org.alfresco.webservice.util.WebServiceFactory;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class ContentReader {
-
-  /**
-   * Read the binary for the current content
-   * @param predicate
-   * @return an unique binary for content
-   */
-  public static Content read(String endpoint, String username, String password, int socketTimeout, AuthenticationDetails session, Predicate predicate, String contentProperty) throws IOException {
-    Content[] resultBinary = null;
-    try {
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();
-      resultBinary = WebServiceFactory.getContentService().read(predicate, contentProperty);
-      AuthenticationUtils.endSession();
-    } catch (ContentFault e) {
-        Logging.connectors
-        .error(
-            "Alfresco: Content fault exception error during getting the content binary in processDocuments. " +
-            "Node: "+predicate.getNodes()[0].getPath() + ". "
-                + e.getMessage(), e);
-        throw new IOException("Alfresco: Content fault exception error during getting the content binary in processDocuments. " +
-            "Node: "+predicate.getNodes()[0].getPath() + ". "
-            + e.getMessage(), e);
-    } catch (RemoteException e) {
-        Logging.connectors
-        .error(
-            "Alfresco: Remote exception error during getting the content binary in processDocuments. " +
-            "Node: "+predicate.getNodes()[0].getPath() + ". "
-                + e.getMessage(), e);
-        throw e;
-    } finally{
-      session = null;
-    }
-    return resultBinary[0];
-  }
-  
-  public static InputStream getBinary(String endpoint, Content binary, String username, String password, int socketTimeout, AuthenticationDetails session) throws IOException {
-    InputStream is = null;
-   try { 
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();
-      is = ContentUtils.getContentAsInputStream(binary);
-    } catch (AuthenticationFault e) {
-      Logging.connectors
-      .error(
-          "Alfresco: Error during getting the binary for the node: "+binary.getNode().getPath()+"."
-              + e.getMessage(), e);
-      throw e;
-    }
-    return is;
-  }
-  
-}
\ No newline at end of file
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/Messages.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/Messages.java
deleted file mode 100644
index 5c54fe9..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/Messages.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-/**
- * 
- * @author Piergiorgio Lucidi
- *
- */
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.alfresco.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.alfresco";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/NodeUtils.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/NodeUtils.java
deleted file mode 100644
index 51d8687..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/NodeUtils.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.io.IOException;
-import java.rmi.RemoteException;
-
-import org.alfresco.webservice.repository.RepositoryFault;
-import org.alfresco.webservice.types.NamedValue;
-import org.alfresco.webservice.types.Node;
-import org.alfresco.webservice.types.Predicate;
-import org.alfresco.webservice.util.AuthenticationDetails;
-import org.alfresco.webservice.util.AuthenticationUtils;
-import org.alfresco.webservice.util.WebServiceFactory;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-/**
- * 
- * This is an utility class dedicated to the Alfresco Node Web Services API  
- * @author Piergiorgio Lucidi
- *
- */
-public class NodeUtils {
-  
-  /** the splitter character to split the node reference */
-  private static final String NODE_REFERENCE_SPLIT = "/";
-
-  /**
-   * Retrieve a specific instance of a content required in the predicate object
-   * 
-   * @param username
-   * @param password
-   * @param session
-   * @param predicate
-   * @return the Node object instance of the current content
-   */
-  public static Node get(String endpoint, String username, String password, int socketTimeout, AuthenticationDetails session, Predicate predicate) throws IOException {
-    Node[] resultNodes = null;
-    try {
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();
-      resultNodes = WebServiceFactory.getRepositoryService().get(predicate);
-      AuthenticationUtils.endSession();
-    } catch (RepositoryFault e) {
-      Logging.connectors.error(
-          "Alfresco: RepositoryFault during getting a node in processDocuments. Node: "
-              + predicate.getNodes()[0].getPath() + ". " + e.getMessage(), e);
-      throw new IOException("Alfresco: RepositoryFault during getting a node in processDocuments. Node: "
-          + predicate.getNodes()[0].getPath() + ". " + e.getMessage(), e);
-    } catch (RemoteException e) {
-      Logging.connectors
-          .error(
-              "Alfresco: Remote exception error during getting a node in processDocuments. Node: "
-                  + predicate.getNodes()[0].getPath() + ". " + e.getMessage(), e);
-      throw e;
-    } finally {
-      session = null;
-    }
-    if(resultNodes!=null && resultNodes.length>0){
-      return resultNodes[0];
-    } else {
-      return null;
-    }
-  }
-  
-  /**
-   * 
-   * @param aspects
-   * @return TRUE if the current node is versioned, otherwise FALSE
-   */
-  public static boolean isVersioned(String[] aspects){
-    for (String aspect : aspects) {
-      if(Constants.ASPECT_VERSIONABLE.equals(aspect)){
-        return true;
-      }
-    }
-    return false;
-  }
-  
-  /**
-   * 
-   * @param properties
-   * @return the version label for the current node
-   */
-  public static String getVersionLabel(NamedValue[] properties){
-    for (NamedValue property : properties) {
-      if(property.getName().equals(Constants.PROP_VERSION_LABEL)){
-        return property.getValue();
-      }
-    }
-    return StringUtils.EMPTY;
-  }
-  
-  /**
-   * Build the UUID starting from the Alfresco node reference
-   * @param nodeReference
-   * @return the UUID for the current node
-   */
-  public static String getUuidFromNodeReference(String nodeReference){
-    String uuid = StringUtils.EMPTY;
-    String[] nodeReferenceSplitted = StringUtils.split(nodeReference, NODE_REFERENCE_SPLIT);
-    if(nodeReferenceSplitted!=null
-        && nodeReferenceSplitted.length>2
-        && StringUtils.isNotEmpty(nodeReferenceSplitted[2])){
-      uuid = nodeReferenceSplitted[2];
-    }
-    return uuid;
-  }
-  
-}
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/PropertiesUtils.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/PropertiesUtils.java
deleted file mode 100644
index a26c7be..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/PropertiesUtils.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.alfresco.webservice.types.NamedValue;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.common.DateParser;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-/**
- * Utility class dedicatd to manage Alfresco properties
- * @author Piergiorgio Lucidi
- *
- */
-public class PropertiesUtils {
-
-  private static final String PROP_CONTENT_PREFIX = "contentUrl";
-  private static final String PROP_CONTENT_SEP = "|";
-  private static final String PROP_MIMETYPE_SEP = "=";
-
-  private static final String PROP_MODIFIED = Constants.createQNameString(Constants.NAMESPACE_CONTENT_MODEL, "modified");
-  
-  public static String[] getPropertyValues(NamedValue[]  properties, String qname){
-    String[] propertyValues = null;
-    for(NamedValue property : properties){
-      if(property.getName().endsWith(qname)){
-        if(property.getIsMultiValue()){
-          propertyValues = property.getValues();
-        } else {
-          propertyValues = new String[]{property.getValue()};
-        }
-      }
-    }
-    return propertyValues;
-  }
-  
-  public static void ingestProperties(RepositoryDocument rd, NamedValue[] properties, List<NamedValue> contentProperties) throws ManifoldCFException, ParseException{
-    for(NamedValue property : properties){
-      if(property!=null && StringUtils.isNotEmpty(property.getName())){
-        if(property.getIsMultiValue()){
-          String[] values = property.getValues();
-          if(values!=null){
-            for (String value : values) {
-              if(StringUtils.isNotEmpty(value)){
-                rd.addField(property.getName(), value);
-              }
-            }
-          }
-        } else {
-          if(StringUtils.isNotEmpty(property.getValue())){
-            rd.addField(property.getName(), property.getValue());
-          }
-        }
-      }
-    }
-    
-    String fileName = StringUtils.EMPTY;
-    String[] propertyValues = PropertiesUtils.getPropertyValues(properties, Constants.PROP_NAME);
-    if(propertyValues!=null && propertyValues.length>0){
-      fileName = propertyValues[0];
-    }
-    
-    String mimeType = PropertiesUtils.getMimeType(contentProperties);
-    Date createdDate = PropertiesUtils.getDatePropertyValue(properties, Constants.PROP_CREATED);
-    Date modifiedDate = PropertiesUtils.getDatePropertyValue(properties, PROP_MODIFIED);
-    
-    if(StringUtils.isNotEmpty(fileName)){
-      rd.setFileName(fileName);
-    }
-    
-    if(StringUtils.isNotEmpty(mimeType)){
-      rd.setMimeType(mimeType);
-    }
-    
-    if(createdDate!=null){
-      rd.setCreatedDate(createdDate);
-    }
-    
-    if(modifiedDate!=null){
-      rd.setModifiedDate(modifiedDate);
-    }
-  }
-  
-  /**
-   * 
-   * @param properties
-   * @return a list of binary properties for the current node
-   */
-  public static List<NamedValue> getContentProperties(NamedValue[] properties){
-    List<NamedValue> contentProperties = new ArrayList<NamedValue>();
-    if(properties!=null){
-      for (NamedValue property : properties) {
-        if(property!=null){
-          if(property.getIsMultiValue()!=null && !property.getIsMultiValue()){
-            if(StringUtils.isNotEmpty(property.getValue()) 
-                && property.getValue().startsWith(PROP_CONTENT_PREFIX)){
-                  contentProperties.add(property);
-            }
-          }
-        }
-      }
-    }
-    return contentProperties;
-  }
-  
-  /**
-   * Build the Alfresco node identifier
-   * @param properties
-   * @return the node reference for the current document
-   */
-  public static String getNodeReference(NamedValue[] properties){
-    String nodeReference = StringUtils.EMPTY;
-    String storeProtocol = StringUtils.EMPTY;
-    String storeId = StringUtils.EMPTY;
-    String uuid = StringUtils.EMPTY;
-    if(properties!=null){
-      for (NamedValue property : properties) {
-        if(Constants.PROP_STORE_PROTOCOL.equals(property.getName())){
-          storeProtocol = property.getValue();
-        } else if(Constants.PROP_STORE_ID.equals(property.getName())){
-          storeId = property.getValue();
-        } else if(Constants.PROP_NODE_UUID.equals(property.getName())){
-          uuid = property.getValue();
-        }
-      }
-    }
-    if(StringUtils.isNotEmpty(storeProtocol)
-        && StringUtils.isNotEmpty(storeId)
-        && StringUtils.isNotEmpty(uuid)) {
-      nodeReference = storeProtocol+"://"+storeId+"/"+uuid;
-    }
-    return nodeReference;
-  }
-  
-  /**
-   * 
-   * @param properties
-   * @return version label of the latest version of the node
-   */
-  public static String getVersionLabel(NamedValue[] properties){
-    String[] versionLabelList = PropertiesUtils.getPropertyValues(properties, Constants.PROP_VERSION_LABEL);
-    String versionLabel = StringUtils.EMPTY;
-    if(versionLabelList!=null && versionLabelList.length>0){
-      versionLabel = versionLabelList[0];
-    }
-    return versionLabel;
-  }
-  
-  /**
-   * This method returns the mimetype of the default content defined for the node.
-   * Notice that more than one binary can be defined in a custom model of Alfresco and also that 
-   * it could exist some contents that don't have a binary
-   * @param contentProperties
-   * @return mimetype of the default content property
-   */
-  public static String getMimeType(List<NamedValue> contentProperties){
-    if(contentProperties!=null && contentProperties.size()>0){
-      Iterator<NamedValue> i = contentProperties.iterator();
-      while(i.hasNext()){
-        NamedValue contentProperty = i.next();
-        if(Constants.PROP_CONTENT.equals(contentProperty.getName())){
-          String defaultContentPropertyValue = contentProperty.getValue();
-          String[] contentSplitted = StringUtils.split(defaultContentPropertyValue, PROP_CONTENT_SEP);
-          if (contentSplitted.length > 1) {
-            String[] mimeTypeSplitted = StringUtils.split(contentSplitted[1], PROP_MIMETYPE_SEP);
-            return mimeTypeSplitted[1];
-          }
-          return contentSplitted[0];
-        }
-      }
-    }
-    return StringUtils.EMPTY;
-  }
-  
-  /**
-   * 
-   * @param properties
-   * @return version label of the latest version of the node
-   * @throws ParseException 
-   */
-  public static Date getDatePropertyValue(NamedValue[] properties, String qname) throws ParseException{
-    Date date = null;
-    if(properties!=null && properties.length>0){
-      String[] propertyValues = PropertiesUtils.getPropertyValues(properties, qname);
-      if(propertyValues!=null && propertyValues.length>0){
-        String dateString = propertyValues[0];
-        if(StringUtils.isNotEmpty(dateString)){
-          date = DateParser.parseISO8601Date(dateString);
-        }
-      }
-    }
-    return date;
-  }
-  
-}
diff --git a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/SearchUtils.java b/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/SearchUtils.java
deleted file mode 100644
index d9b6c42..0000000
--- a/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/SearchUtils.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.alfresco;
-
-import java.io.IOException;
-import java.rmi.RemoteException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.alfresco.webservice.repository.QueryResult;
-import org.alfresco.webservice.repository.RepositoryFault;
-import org.alfresco.webservice.types.NamedValue;
-import org.alfresco.webservice.types.Query;
-import org.alfresco.webservice.types.Reference;
-import org.alfresco.webservice.types.ResultSet;
-import org.alfresco.webservice.types.ResultSetRow;
-import org.alfresco.webservice.types.Store;
-import org.alfresco.webservice.util.AuthenticationDetails;
-import org.alfresco.webservice.util.AuthenticationUtils;
-import org.alfresco.webservice.util.Constants;
-import org.alfresco.webservice.util.WebServiceFactory;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class SearchUtils {
-  
-  private static final String SPACES_STORE = "SpacesStore";
-  private static final String XPATH_COMPANY_HOME = "/app:company_home";
-
-  public static final Store STORE = new Store(Constants.WORKSPACE_STORE,
-      SPACES_STORE);
-  
-  private static final String PATH_PROPERTY = "{http://www.alfresco.org/model/content/1.0}path";
-  
-  private static final String[] EXCLUDED_PATHS = new String[]{
-    "{http://www.alfresco.org/model/application/1.0}dictionary",
-    "{http://www.alfresco.org/model/application/1.0}guest_home",
-    "{http://www.alfresco.org/model/application/1.0}user_homes",
-    "{http://www.alfresco.org/model/site/1.0}sites"};
-  
-
-  public static QueryResult luceneSearch(String endpoint, String username, String password, int socketTimeout, AuthenticationDetails session, String luceneQuery) throws IOException {
-    QueryResult queryResult = null;
-    Query query = new Query(Constants.QUERY_LANG_LUCENE, luceneQuery);
-    try {
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();
-      queryResult = WebServiceFactory.getRepositoryService().query(STORE, query, false);
-      AuthenticationUtils.endSession();
-    } catch (RepositoryFault e) {
-      Logging.connectors.error(
-          "Alfresco: Repository fault during addSeedDocuments: "
-              + e.getMessage(), e);
-      throw new IOException("Alfresco: Repository fault during addSeedDocuments: "
-          + e.getMessage(), e);
-    } catch (RemoteException e) {
-      Logging.connectors.error(
-          "Alfresco: Remote exception during addSeedDocuments: "
-              + e.getMessage(), e);
-      throw e;
-    } finally {
-      session = null;
-    }
-    return queryResult;
-  }
-  
-  public static QueryResult getChildren(String endpoint, String username, String password, int socketTimeout, AuthenticationDetails session, Reference reference) throws IOException {
-    QueryResult queryResult = null;
-    try {
-      WebServiceFactory.setEndpointAddress(endpoint);
-      WebServiceFactory.setTimeoutMilliseconds(socketTimeout);
-      AuthenticationUtils.startSession(username, password);
-      session = AuthenticationUtils.getAuthenticationDetails();  
-      queryResult = WebServiceFactory.getRepositoryService().queryChildren(reference);
-      AuthenticationUtils.endSession();
-    } catch (RepositoryFault e) {
-      Logging.connectors.error(
-          "Alfresco: RepositoryFault during getting a node in processDocuments. Node: "
-              + reference.getPath() + ". " + e.getMessage(), e);
-      throw new IOException("Alfresco: RepositoryFault during getting a node in processDocuments. Node: "
-              + reference.getPath() + ". " + e.getMessage(), e);
-      
-    } catch (RemoteException e) {
-      Logging.connectors
-          .error(
-              "Alfresco: Remote exception error during getting a node in processDocuments. Node: "
-                  + reference.getPath() + ". " + e.getMessage(), e);
-      throw e;
-    } finally {
-      session = null;
-    }
-    return queryResult;
-  }
-  
-  /**
-   * 
-   * @param username
-   * @param password
-   * @param session
-   * @return filtered children of the Company Home without all the special spaces
-   */
-  public static QueryResult getChildrenFromCompanyHome(String endpoint, String username, String password, int socketTimeout, AuthenticationDetails session) throws IOException {
-    Reference companyHome = new Reference(STORE, null, XPATH_COMPANY_HOME);
-    QueryResult queryResult = SearchUtils.getChildren(endpoint, username, password, socketTimeout, session, companyHome);
-    ResultSet rs = queryResult.getResultSet();
-    ResultSetRow[] rows = rs.getRows();
-    List<ResultSetRow> filteredRows = new ArrayList<ResultSetRow>();
-    for (ResultSetRow row : rows) {
-      boolean hasFilteredPath = false;
-      NamedValue[] properties = row.getColumns();
-      String path = PropertiesUtils.getPropertyValues(properties, PATH_PROPERTY)[0];
-      for(String excludedPath : EXCLUDED_PATHS){
-        if(StringUtils.contains(path, excludedPath)){
-          hasFilteredPath = true;
-          break;
-        }
-      }
-      if(!hasFilteredPath){
-        filteredRows.add(row);
-      }
-    }
-    ResultSetRow[] finalFilteredRows = new ResultSetRow[filteredRows.size()];
-    for(int i=0; i<finalFilteredRows.length; i++){
-      finalFilteredRows[i] = filteredRows.get(i);
-    }
-    rs.setRows(finalFilteredRows);
-    return queryResult;
-  }
-  
-}
diff --git a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_en_US.properties b/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_en_US.properties
deleted file mode 100644
index 03e384e..0000000
--- a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_en_US.properties
+++ /dev/null
@@ -1,52 +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.
-
-# Fill in this file with English words and phrases
-
-AlfrescoConnector.Server=Server
-
-AlfrescoConnector.ParametersColon=Parameters:
-
-AlfrescoConnector.TenantDomainColon=Tenant domain:
-AlfrescoConnector.UserNameColon=Username:
-AlfrescoConnector.PasswordColon=Password:
-AlfrescoConnector.ProtocolColon=Protocol:
-AlfrescoConnector.ServerColon=Server:
-AlfrescoConnector.PortColon=Port:
-AlfrescoConnector.PathColon=Path:
-AlfrescoConnector.SocketTimeoutColon=Socket Timeout:
-
-AlfrescoConnector.TenantDomainEquals=tenantDomain=
-AlfrescoConnector.UserNameEquals=username=
-AlfrescoConnector.PasswordEquals=password=
-AlfrescoConnector.ProtocolEquals=protocol=
-AlfrescoConnector.ServerEquals=server=
-AlfrescoConnector.PortEquals=port=
-AlfrescoConnector.PathEquals=path=
-AlfrescoConnector.SocketTimeoutEquals=socketTimeout=
-
-AlfrescoConnector.TheUsernameMustNotBeNull=The username must not be null
-AlfrescoConnector.ThePasswordMustNotBeNull=The password must not be null
-AlfrescoConnector.ServerNameMustNotBeNull=Server name must not be null
-AlfrescoConnector.ServerNameCantContainSlash=Server name can't contain the character '/'
-AlfrescoConnector.ThePortMustNotBeNull=The port must not be null
-AlfrescoConnector.TheServerPortMustBeAValidInteger=The server port must be a valid integer
-AlfrescoConnector.PathMustNotBeNull=Path must not be null
-AlfrescoConnector.TheSocketTimeoutMustNotBeNull=The connector socket timeout must not be null
-AlfrescoConnector.TheSocketTimeoutMustBeAValidInteger=The connector socket timeout must be a valid integer
-
-AlfrescoConnector.LuceneQuery=Lucene Query
-
-AlfrescoConnector.LuceneQueryColon=Lucene Query:
diff --git a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_es_ES.properties b/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_es_ES.properties
deleted file mode 100644
index a01ea08..0000000
--- a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_es_ES.properties
+++ /dev/null
@@ -1,53 +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.
-
-# Fill in this file with English words and phrases
-
-AlfrescoConnector.Server=Servidor
-
-AlfrescoConnector.ParametersColon=Parámetros:
-
-AlfrescoConnector.TenantDomainColon=Dominio Inquilino:
-AlfrescoConnector.UserNameColon=Nombre de usuario:
-AlfrescoConnector.PasswordColon=Contraseña:
-AlfrescoConnector.ProtocolColon=Protocolo:
-AlfrescoConnector.ServerColon=Servidor:
-AlfrescoConnector.PortColon=Puerto:
-AlfrescoConnector.PathColon=Ruta:
-AlfrescoConnector.SocketTimeoutColon=Toma de Tiempo de espera:
-
-AlfrescoConnector.TenantDomainEquals=Dominio Inquilino=
-AlfrescoConnector.UserNameEquals=nombre de usuario=
-AlfrescoConnector.PasswordEquals=contraseña=
-AlfrescoConnector.ProtocolEquals=Protocolo=
-AlfrescoConnector.ServerEquals=Servidor=
-AlfrescoConnector.PortEquals=Puerto=
-AlfrescoConnector.PathEquals=Ruta=
-AlfrescoConnector.SocketTimeoutEquals=Toma de Tiempo de espera=
-
-AlfrescoConnector.TheUsernameMustNotBeNull=El nombre de usuario no debe ser nulo
-AlfrescoConnector.ThePasswordMustNotBeNull=La contraseña no debe ser nulo
-AlfrescoConnector.ServerNameMustNotBeNull=Nombre del servidor no debe ser nulo
-AlfrescoConnector.ServerNameCantContainSlash=Nombre del servidor no puede contener el carácter '/'
-AlfrescoConnector.ThePortMustNotBeNull=El puerto no debe ser nulo
-AlfrescoConnector.TheServerPortMustBeAValidInteger=El puerto del servidor debe ser un entero válido
-AlfrescoConnector.PathMustNotBeNull=La ruta no debe ser nulo
-AlfrescoConnector.TheSocketTimeoutMustNotBeNull=El tiempo de espera zócalo conector no debe ser nulo
-AlfrescoConnector.TheSocketTimeoutMustBeAValidInteger=El tiempo de espera de toma de conexión debe ser un entero válido
-
-AlfrescoConnector.LuceneQuery=Lucene consulta
-
-AlfrescoConnector.LuceneQueryColon=Lucene consulta:
-
diff --git a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_ja_JP.properties b/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_ja_JP.properties
deleted file mode 100644
index ad53bf9..0000000
--- a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_ja_JP.properties
+++ /dev/null
@@ -1,52 +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.
-
-# Fill in this file with Japanese words and phrases
-
-AlfrescoConnector.Server=サーバ
-
-AlfrescoConnector.ParametersColon=引数:
-
-AlfrescoConnector.TenantDomainColon=テナントドメイン:
-AlfrescoConnector.UserNameColon=ユーザ名:
-AlfrescoConnector.PasswordColon=パスワード:
-AlfrescoConnector.ProtocolColon=プロトコル:
-AlfrescoConnector.ServerColon=サーバ:
-AlfrescoConnector.PortColon=ポート:
-AlfrescoConnector.PathColon=パス:
-AlfrescoConnector.SocketTimeoutColon=ソケットタイムアウト:
-
-AlfrescoConnector.TenantDomainEquals=テナントドメイン=
-AlfrescoConnector.UserNameEquals=ユーザ名=
-AlfrescoConnector.PasswordEquals=パスワード=
-AlfrescoConnector.ProtocolEquals=プロトコル=
-AlfrescoConnector.ServerEquals=サーバ=
-AlfrescoConnector.PortEquals=ポート=
-AlfrescoConnector.PathEquals=パス=
-AlfrescoConnector.SocketTimeoutEquals=ソケットタイムアウト=
-
-AlfrescoConnector.TheUsernameMustNotBeNull=ユーザ名を入力してください
-AlfrescoConnector.ThePasswordMustNotBeNull=パスワードを入力してください
-AlfrescoConnector.ServerNameMustNotBeNull=サーバ名を入力してください
-AlfrescoConnector.ServerNameCantContainSlash=サーバ名に文字「/」を含めないでください
-AlfrescoConnector.ThePortMustNotBeNull=ポート番号を入力してください
-AlfrescoConnector.TheServerPortMustBeAValidInteger=サーバポートには有効な整数を入力してください
-AlfrescoConnector.PathMustNotBeNull=パスを入力してください
-AlfrescoConnector.TheSocketTimeoutMustNotBeNull=コネクタソケットタイムアウトを入力してください
-AlfrescoConnector.TheSocketTimeoutMustBeAValidInteger=コネクタソケットタイムアウトには有効な整数を入力してください
-
-AlfrescoConnector.LuceneQuery=Luceneクエリー
-
-AlfrescoConnector.LuceneQueryColon=Luceneクエリー:
diff --git a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_zh_CN.properties b/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_zh_CN.properties
deleted file mode 100644
index 26333a1..0000000
--- a/connectors/alfresco/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/alfresco/common_zh_CN.properties
+++ /dev/null
@@ -1,52 +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.
-
-# Fill in this file with Japanese words and phrases
-
-AlfrescoConnector.Server=服务器
-
-AlfrescoConnector.ParametersColon=参数: 
-
-AlfrescoConnector.TenantDomainColon=Tenant域: 
-AlfrescoConnector.UserNameColon=用户名: 
-AlfrescoConnector.PasswordColon=密码: 
-AlfrescoConnector.ProtocolColon=协议: 
-AlfrescoConnector.ServerColon=服务器: 
-AlfrescoConnector.PortColon=端口: 
-AlfrescoConnector.PathColon=路径: 
-AlfrescoConnector.SocketTimeoutColon=套接字超时值:
-
-AlfrescoConnector.TenantDomainEquals=Tenant域=
-AlfrescoConnector.UserNameEquals=用户名=
-AlfrescoConnector.PasswordEquals=密码=
-AlfrescoConnector.ProtocolEquals=协议=
-AlfrescoConnector.ServerEquals=服务器=
-AlfrescoConnector.PortEquals=端口=
-AlfrescoConnector.PathEquals=路径=
-AlfrescoConnector.SocketTimeoutEquals=套接字超时值=
-
-AlfrescoConnector.TheUsernameMustNotBeNull=请输入用户名
-AlfrescoConnector.ThePasswordMustNotBeNull=请输入密码
-AlfrescoConnector.ServerNameMustNotBeNull=请输入服务器名
-AlfrescoConnector.ServerNameCantContainSlash=服务器名不能包含‘/’字符
-AlfrescoConnector.ThePortMustNotBeNull=请输入端口号
-AlfrescoConnector.TheServerPortMustBeAValidInteger=服务器端口必须为有效的整数
-AlfrescoConnector.PathMustNotBeNull=请输入路径
-AlfrescoConnector.TheSocketTimeoutMustNotBeNull=连接器超时值不能为空
-AlfrescoConnector.TheSocketTimeoutMustBeAValidInteger=套接字超时值必须为有效的整数
-
-AlfrescoConnector.LuceneQuery=Lucene查询
-
-AlfrescoConnector.LuceneQueryColon=Lucene查询: 
diff --git a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editConfiguration.js b/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editConfiguration.js
deleted file mode 100644
index fe8f550..0000000
--- a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editConfiguration.js
+++ /dev/null
@@ -1,93 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.username.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.TheUsernameMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.username.focus();
-    return false;
-  }
-  if (editconnection.password.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.ThePasswordMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.password.focus();
-    return false;
-  }
-  if (editconnection.server.value =="")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.ServerNameMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.server.focus();
-    return false;
-  }
-  else if(editconnection.server.value.indexOf('/')!=-1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.ServerNameCantContainSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.server.focus();
-    return false;
-  }
-  if (editconnection.port.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.ThePortMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  else if (!isInteger(editconnection.port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.TheServerPortMustBeAValidInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if(editconnection.path.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.PathMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.path.focus();
-    return false;
-  }
-  if (editconnection.socketTimeout.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.TheSocketTimeoutMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-    editconnection.socketTimeout.focus();
-    return false;
-  } 
-  else if (!isInteger(editconnection.socketTimeout.value))
-  {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.TheSocketTimeoutMustBeAValidInteger'))");
-      SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AlfrescoConnector.Server'))");
-      editconnection.socketTimeout.focus();
-      return false;
-  }
-  return true;
-}
-// -->
-</script>
\ No newline at end of file
diff --git a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editConfiguration_Server.html b/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editConfiguration_Server.html
deleted file mode 100644
index d1b8c41..0000000
--- a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editConfiguration_Server.html
+++ /dev/null
@@ -1,131 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('AlfrescoConnector.Server'))
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2">
-      <hr />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.TenantDomainColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="tenantDomain" name="tenantDomain" type="text" size="32" value="$Encoder.attributeEscape($TENANTDOMAIN)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.UserNameColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input id="username" type="text" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.PasswordColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input id="password" type="password" name="password" value="$Encoder.attributeEscape($PASSWORD)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.ProtocolColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <select id="protocol" name="protocol">
-#if($PROTOCOL == "http")
-        <option value="http" selected="selected">http</option>
-#else
-        <option value="http">http</option>
-#end
-#if($PROTOCOL == "https")
-        <option value="https" selected="selected">https</option>
-#else
-        <option value="https">https</option>
-#end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.ServerColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="server" name="server" type="text" size="32" value="$Encoder.attributeEscape($SERVER)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.PortColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="port" name="port" type="text" size="5" value="$Encoder.attributeEscape($PORT)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.PathColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="path" name="path" type="text" size="32" value="$Encoder.attributeEscape($PATH)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.SocketTimeoutColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="socketTimeout" name="socketTimeout" type="text" size="10" value="$Encoder.attributeEscape($SOCKETTIMEOUT)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-<input type="hidden" name="password" value="$Encoder.attributeEscape($PASSWORD)" />
-<input type="hidden" name="protocol" value="$Encoder.attributeEscape($PROTOCOL)" />
-<input type="hidden" name="server" value="$Encoder.attributeEscape($SERVER)" />
-<input type="hidden" name="port" value="$Encoder.attributeEscape($PORT)" />
-<input type="hidden" name="path" value="$Encoder.attributeEscape($PATH)" />
-<input type="hidden" name="tenantDomain" value="$Encoder.attributeEscape($TENANTDOMAIN)" />
-<input type="hidden" name="socketTimeout" value="$Encoder.attributeEscape($SOCKETTIMEOUT)" />
-
-#end
-
diff --git a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editSpecification.js b/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editSpecification.js
deleted file mode 100644
index f37efd4..0000000
--- a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editSpecification.js
+++ /dev/null
@@ -1,21 +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.
--->
-
-<script type="text/javascript">
-<!--
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editSpecification_LuceneQuery.html b/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editSpecification_LuceneQuery.html
deleted file mode 100644
index 4eb3382..0000000
--- a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/editSpecification_LuceneQuery.html
+++ /dev/null
@@ -1,44 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('AlfrescoConnector.LuceneQuery') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="3">
-      <hr />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.LuceneQueryColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <nobr>
-        <input type="text" size="120" name="s${SEQNUM}_luceneQuery" value="$Encoder.attributeEscape($LUCENEQUERY)" />
-      </nobr>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SEQNUM}_luceneQuery" value="$Encoder.attributeEscape($LUCENEQUERY)" />
-
-#end
diff --git a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/viewConfiguration.html b/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/viewConfiguration.html
deleted file mode 100644
index c943fd7..0000000
--- a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/viewConfiguration.html
+++ /dev/null
@@ -1,60 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.ParametersColon'))
-      </nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.TenantDomainEquals'))$Encoder.bodyEscape($TENANTDOMAIN)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.UserNameEquals'))$Encoder.bodyEscape($USERNAME)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.PasswordEquals'))********
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.ProtocolEquals'))$Encoder.bodyEscape($PROTOCOL)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.ServerEquals'))$Encoder.bodyEscape($SERVER)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.PortEquals'))$Encoder.bodyEscape($PORT)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.PathEquals'))$Encoder.bodyEscape($PATH)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.SocketTimeoutEquals'))$Encoder.bodyEscape($SOCKETTIMEOUT)
-      </nobr>
-      <br />
-    </td>
-  </tr>
-</table>
diff --git a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/viewSpecification.html b/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/viewSpecification.html
deleted file mode 100644
index 8882a09..0000000
--- a/connectors/alfresco/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/alfresco/viewSpecification.html
+++ /dev/null
@@ -1,27 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description">
-      $Encoder.bodyEscape($ResourceBundle.getString('AlfrescoConnector.LuceneQueryColon'))
-    </td>
-    <td class="value">
-      $Encoder.bodyEscape($LUCENEQUERY)
-    </td>
-  </tr>
-</table>
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/APISanityHSQLDBIT.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/APISanityHSQLDBIT.java
deleted file mode 100644
index 9de7352..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/APISanityHSQLDBIT.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.rmi.RemoteException;
-
-import org.alfresco.webservice.content.ContentServiceSoapBindingStub;
-import org.alfresco.webservice.repository.QueryResult;
-import org.alfresco.webservice.repository.RepositoryFault;
-import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
-import org.alfresco.webservice.repository.UpdateResult;
-import org.alfresco.webservice.types.CML;
-import org.alfresco.webservice.types.CMLCreate;
-import org.alfresco.webservice.types.CMLDelete;
-import org.alfresco.webservice.types.ContentFormat;
-import org.alfresco.webservice.types.NamedValue;
-import org.alfresco.webservice.types.ParentReference;
-import org.alfresco.webservice.types.Predicate;
-import org.alfresco.webservice.types.Query;
-import org.alfresco.webservice.types.Reference;
-import org.alfresco.webservice.types.ResultSetRow;
-import org.alfresco.webservice.types.Store;
-import org.alfresco.webservice.util.AuthenticationUtils;
-import org.alfresco.webservice.util.Constants;
-import org.alfresco.webservice.util.Utils;
-import org.alfresco.webservice.util.WebServiceFactory;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.core.interfaces.Configuration;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoConfig;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author Piergiorgio Lucidi
- */
-public class APISanityHSQLDBIT extends BaseITHSQLDB
-{
-  
-  private static final String REPLACER = "?";
-  private static final String ALFRESCO_TEST_QUERY_CHANGE_DOC = "PATH:\"/app:company_home/cm:testdata/*\" AND TYPE:\"cm:content\" AND @cm\\:name:\""+REPLACER+"\"";
-  private static final String ALFRESCO_TEST_QUERY = "PATH:\"/app:company_home/cm:testdata\"";
-  
-  private static final String ALFRESCO_USERNAME = "admin"; 
-  private static final String ALFRESCO_PASSWORD = "admin";
-  private static final String ALFRESCO_PROTOCOL = "http";
-  private static final String ALFRESCO_SERVER = "localhost";
-  private static final String ALFRESCO_PORT = "9090";
-  private static final String ALFRESCO_PATH = "/alfresco/api";
-  private static final int SOCKET_TIMEOUT = 120000;
-  private static final String ALFRESCO_ENDPOINT_TEST_SERVER = 
-      ALFRESCO_PROTOCOL+"://"+ALFRESCO_SERVER+":"+ALFRESCO_PORT+ALFRESCO_PATH;
-  
-  private static final Store STORE = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
-  
-  public Reference getTestFolder() throws RepositoryFault, RemoteException{
-    WebServiceFactory.setTimeoutMilliseconds(SOCKET_TIMEOUT);
-    WebServiceFactory.setEndpointAddress(ALFRESCO_ENDPOINT_TEST_SERVER);
-    AuthenticationUtils.startSession(ALFRESCO_USERNAME, ALFRESCO_PASSWORD);
-    Reference reference = new Reference();
-    try{
-      RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();
-      Query query = new Query(Constants.QUERY_LANG_LUCENE, ALFRESCO_TEST_QUERY);
-      QueryResult queryResult = repositoryService.query(STORE, query, false);
-      ResultSetRow row = queryResult.getResultSet().getRows(0);
-      reference.setStore(STORE);
-      reference.setUuid(row.getNode().getId());
-      return reference;
-    } finally {
-      AuthenticationUtils.endSession();
-    }
-  }
-  
-  public void createNewDocument(Reference folder, String name) throws IOException{
-    ParentReference folderReference = 
-        new ParentReference(STORE, folder.getUuid(), null, Constants.ASSOC_CONTAINS, null);
-
-    folderReference.setChildName("{"+Constants.NAMESPACE_CONTENT_MODEL +"}"+ name);
-    
-    NamedValue[] contentProps = new NamedValue[1]; 
-    contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, name); 
-    CMLCreate create = new CMLCreate("1", folderReference, null, null, null, Constants.TYPE_CONTENT, contentProps);
- 
-    CML cml = new CML();
-    cml.setCreate(new CMLCreate[] {create});
-
-    WebServiceFactory.setEndpointAddress(ALFRESCO_ENDPOINT_TEST_SERVER);
-    AuthenticationUtils.startSession(ALFRESCO_USERNAME, ALFRESCO_PASSWORD);
-    
-    try{
-      
-      UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);
-      
-      //format
-      ContentFormat contentFormat = new ContentFormat();
-      contentFormat.setEncoding(StandardCharsets.UTF_8.name());
-      contentFormat.setMimetype("text/plain");
-      
-      //the content
-      String content = "Alfresco Testdata "+name;
-      
-      //the new node
-      Reference reference = result[0].getDestination();
-  
-      //write the content in the new node
-      ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
-      contentService.write(reference, Constants.PROP_CONTENT, content.getBytes(StandardCharsets.UTF_8), contentFormat);
-      
-    } finally{
-      AuthenticationUtils.endSession();
-    }
-    
-  }
-  
-  /**
-   * change the document content with the new one provided as an argument
-   * @param session
-   * @param name
-   * @param newContent
-   * @throws RemoteException 
-   * @throws RepositoryFault 
-   */
-  public void changeDocument(String name, String newContent) throws RepositoryFault, RemoteException{
-    String luceneQuery = StringUtils.replace(ALFRESCO_TEST_QUERY_CHANGE_DOC, REPLACER, name);
-    WebServiceFactory.setTimeoutMilliseconds(SOCKET_TIMEOUT);
-    WebServiceFactory.setEndpointAddress(ALFRESCO_ENDPOINT_TEST_SERVER);
-    AuthenticationUtils.startSession(ALFRESCO_USERNAME, ALFRESCO_PASSWORD);
-    
-    try{
-    
-      RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();         
-      Query query = new Query(Constants.QUERY_LANG_LUCENE, luceneQuery);
-      QueryResult queryResult = repositoryService.query(STORE, query, false);
-      
-      ResultSetRow row = queryResult.getResultSet().getRows(0);
-      
-      Reference reference = new Reference();
-      reference.setStore(STORE);
-      reference.setUuid(row.getNode().getId());
-      
-      ContentFormat contentFormat = new ContentFormat();
-      contentFormat.setEncoding(StandardCharsets.UTF_8.name());
-      contentFormat.setMimetype("text/plain");
-      
-      ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
-      contentService.write(reference, Constants.PROP_CONTENT, newContent.getBytes(StandardCharsets.UTF_8), contentFormat);
-      
-    } finally {
-      AuthenticationUtils.endSession();
-    }
-    
-  }
-  
-  public void removeDocument(String name) throws RepositoryFault, RemoteException{
-    String luceneQuery = StringUtils.replace(ALFRESCO_TEST_QUERY_CHANGE_DOC, REPLACER, name);
-    WebServiceFactory.setTimeoutMilliseconds(SOCKET_TIMEOUT);
-    WebServiceFactory.setEndpointAddress(ALFRESCO_ENDPOINT_TEST_SERVER);
-    AuthenticationUtils.startSession(ALFRESCO_USERNAME, ALFRESCO_PASSWORD);
-    
-    try{
-    
-      RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();         
-      Query query = new Query(Constants.QUERY_LANG_LUCENE, luceneQuery);
-      QueryResult queryResult = repositoryService.query(STORE, query, false);
-      
-      ResultSetRow row = queryResult.getResultSet().getRows(0);
-      
-      Reference reference = new Reference();
-      reference.setStore(STORE);
-      reference.setUuid(row.getNode().getId());
-      
-      Predicate predicate = new Predicate();
-      predicate.setStore(STORE);
-      predicate.setNodes(new Reference[]{reference});
-      
-      CMLDelete cmlDelete = new CMLDelete();
-      cmlDelete.setWhere(predicate);
-      
-      CML cml = new CML();
-      cml.setDelete(new CMLDelete[]{cmlDelete});
-      
-      repositoryService.update(cml);
-      
-    } finally {
-      AuthenticationUtils.endSession();
-    }
-  }
-  
-  @Before
-  public void createTestArea()
-    throws Exception
-  {
-    removeTestArea();
-    
-    try
-    {
-      
-      AuthenticationUtils.startSession(ALFRESCO_USERNAME, ALFRESCO_PASSWORD);
-      
-      UpdateResult[] result = null;
-      
-      ParentReference companyHomeParent = 
-          new ParentReference(STORE, null, "/app:company_home", Constants.ASSOC_CONTAINS, null);
-
-      String name = "testdata";
-      companyHomeParent.setChildName("{"+Constants.NAMESPACE_CONTENT_MODEL +"}" + name);
-      
-      NamedValue[] contentProps = new NamedValue[1]; 
-      contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, name); 
-      CMLCreate create = new CMLCreate("1", companyHomeParent, null, null, null, Constants.TYPE_FOLDER, contentProps);
-      
-      CML cml = new CML();
-      cml.setCreate(new CMLCreate[] {create});
-      
-      try{
-        
-        result = WebServiceFactory.getRepositoryService().update(cml);
-      
-      } finally {
-        AuthenticationUtils.endSession();
-      }
-      
-      Reference testData = result[0].getDestination();
-      
-      createNewDocument(testData, "testdata1.txt");
-      createNewDocument(testData, "testdata2.txt");
-      
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  @After
-  public void removeTestArea()
-    throws Exception
-  {
-    WebServiceFactory.setEndpointAddress(ALFRESCO_ENDPOINT_TEST_SERVER);
-    AuthenticationUtils.startSession(ALFRESCO_USERNAME, ALFRESCO_PASSWORD);
-    
-    QueryResult queryResultTestArea = null;
-    try {
-      
-      RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();
-      Query query = new Query(Constants.QUERY_LANG_LUCENE, ALFRESCO_TEST_QUERY);
-      queryResultTestArea = repositoryService.query(STORE, query, false);
-
-      if(queryResultTestArea.getResultSet().getTotalRowCount()>0){
-      
-        ResultSetRow row = queryResultTestArea.getResultSet().getRows(0);
-        
-        Reference reference = new Reference();
-        reference.setStore(STORE);
-        reference.setUuid(row.getNode().getId());
-        
-        Predicate predicate = new Predicate();
-        predicate.setStore(STORE);
-        predicate.setNodes(new Reference[]{reference});
-        
-        CMLDelete cmlDelete = new CMLDelete();
-        cmlDelete.setWhere(predicate);
-        
-        CML cml = new CML();
-        cml.setDelete(new CMLDelete[]{cmlDelete});
-        
-        repositoryService.update(cml);
-      }
-        
-      } finally {
-        AuthenticationUtils.endSession();
-      }
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    try
-    {
-      
-      int i;
-
-      // Create a basic file system connection, and save it.
-      ConfigurationNode connectionObject;
-      ConfigurationNode child;
-      Configuration requestObject;
-      Configuration result;
-      
-      connectionObject = new ConfigurationNode("repositoryconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("Alfresco Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("An Alfresco Repository Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("10");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("configuration");
-      
-      //Alfresco Repository Connector parameters
-      
-      //username
-      ConfigurationNode alfrescoUsernameNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoUsernameNode.setAttribute("name", AlfrescoConfig.USERNAME_PARAM);
-      alfrescoUsernameNode.setValue(ALFRESCO_USERNAME);
-      child.addChild(child.getChildCount(), alfrescoUsernameNode);
-      
-      //password
-      ConfigurationNode alfrescoPasswordNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoPasswordNode.setAttribute("name", AlfrescoConfig.PASSWORD_PARAM);
-      alfrescoPasswordNode.setValue(ALFRESCO_PASSWORD);
-      child.addChild(child.getChildCount(), alfrescoPasswordNode);
-      
-      //protocol
-      ConfigurationNode alfrescoProtocolNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoProtocolNode.setAttribute("name", AlfrescoConfig.PROTOCOL_PARAM);
-      alfrescoProtocolNode.setValue(ALFRESCO_PROTOCOL);
-      child.addChild(child.getChildCount(), alfrescoProtocolNode);
-      
-      //server
-      ConfigurationNode alfrescoServerNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoServerNode.setAttribute("name", AlfrescoConfig.SERVER_PARAM);
-      alfrescoServerNode.setValue(ALFRESCO_SERVER);
-      child.addChild(child.getChildCount(), alfrescoServerNode);
-      
-      //port
-      ConfigurationNode alfrescoPortNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoPortNode.setAttribute("name", AlfrescoConfig.PORT_PARAM);
-      alfrescoPortNode.setValue(ALFRESCO_PORT);
-      child.addChild(child.getChildCount(), alfrescoPortNode);
-      
-      //path
-      ConfigurationNode alfrescoPathNode = new ConfigurationNode("_PARAMETER_");
-      alfrescoPathNode.setAttribute("name", AlfrescoConfig.PATH_PARAM);
-      alfrescoPathNode.setValue(ALFRESCO_PATH);
-      child.addChild(child.getChildCount(), alfrescoPathNode);
-      
-      //socketTimeout
-      ConfigurationNode socketTimeoutNode = new ConfigurationNode("_PARAMETER_");
-      socketTimeoutNode.setAttribute("name", AlfrescoConfig.SOCKET_TIMEOUT_PARAM);
-      socketTimeoutNode.setValue(String.valueOf(SOCKET_TIMEOUT));
-      child.addChild(child.getChildCount(), socketTimeoutNode);
-      
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("repositoryconnections/Alfresco%20Connection",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-      
-      // Create a basic null output connection, and save it.
-      connectionObject = new ConfigurationNode("outputconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("Null Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Null Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("100");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("outputconnections/Null%20Connection",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-
-      // Create a job.
-      ConfigurationNode jobObject = new ConfigurationNode("job");
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Test Job");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("repository_connection");
-      child.setValue("Alfresco Connection");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      // Revamped way of adding output connection
-      child = new ConfigurationNode("pipelinestage");
-      ConfigurationNode pipelineChild = new ConfigurationNode("stage_id");
-      pipelineChild.setValue("0");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_isoutput");
-      pipelineChild.setValue("true");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_connectionname");
-      pipelineChild.setValue("Null Connection");
-      child.addChild(child.getChildCount(),pipelineChild);
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("run_mode");
-      child.setValue("scan once");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("start_mode");
-      child.setValue("manual");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("hopcount_mode");
-      child.setValue("accurate");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("document_specification");
-      
-      
-      //Job configuration
-      ConfigurationNode sn = new ConfigurationNode("startpoint");
-      sn.setAttribute("luceneQuery",ALFRESCO_TEST_QUERY);
-      
-      child.addChild(child.getChildCount(),sn);
-      jobObject.addChild(jobObject.getChildCount(),child);
-      
-      requestObject = new Configuration();
-      requestObject.addChild(0,jobObject);
-      
-      result = performAPIPostOperationViaNodes("jobs",201,requestObject);
-      
-      String jobIDString = null;
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-        else if (resultNode.getType().equals("job_id"))
-          jobIDString = resultNode.getValue();
-      }
-      if (jobIDString == null)
-        throw new Exception("Missing job_id from return!");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 360000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      long count;
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 3)
-        throw new ManifoldCFException("Wrong number of documents processed - expected 3, saw "+new Long(count).toString());
-      
-      // Add a file and recrawl
-      Reference testFolder = getTestFolder();
-      createNewDocument(testFolder, "testdata3.txt");
-      createNewDocument(testFolder, "testdata4.txt");
-
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 360000L);
-
-      // The test data area has 4 documents and one directory, and we have to count the root directory too.
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 5)
-        throw new ManifoldCFException("Wrong number of documents processed after add - expected 5, saw "+new Long(count).toString());
-
-      // Change a document, and recrawl
-      changeDocument("testdata1*","MODIFIED - Alfresco Testdata - MODIFIED");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 360000L);
-
-      // The test data area has 4 documents and one directory, and we have to count the root directory too.
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 5)
-        throw new ManifoldCFException("Wrong number of documents processed after change - expected 5, saw "+new Long(count).toString());
-      
-      // We also need to make sure the new document was indexed.  Have to think about how to do this though.
-      // MHL
-      
-      // Delete a file, and recrawl
-      removeDocument("testdata2*");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 360000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 4)
-        throw new ManifoldCFException("Wrong number of documents processed after delete - expected 4, saw "+new Long(count).toString());
-
-      // Now, delete the job.
-      deleteJob(jobIDString);
-
-      waitJobDeleted(jobIDString, 360000L);
-      
-      // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  protected void startJob(String jobIDString)
-    throws Exception
-  {
-    Configuration requestObject = new Configuration();
-    
-    Configuration result = performAPIPutOperationViaNodes("start/"+jobIDString,201,requestObject);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-  }
-  
-  protected void deleteJob(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIDeleteOperationViaNodes("jobs/"+jobIDString,200);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-
-  }
-  
-  protected String getJobStatus(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String status = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("status"))
-            status = childNode.getValue();
-        }
-      }
-    }
-    return status;
-  }
-
-  protected long getJobDocumentsProcessed(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String documentsProcessed = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("documents_processed"))
-            documentsProcessed = childNode.getValue();
-        }
-      }
-    }
-    if (documentsProcessed == null)
-      throw new Exception("Expected a documents_processed field, didn't find it");
-    return new Long(documentsProcessed).longValue();
-  }
-
-  protected void waitJobInactive(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        throw new Exception("No such job: '"+jobIDString+"'");
-      if (status.equals("not yet run"))
-        throw new Exception("Job was never started.");
-      if (status.equals("done"))
-        return;
-      if (status.equals("error"))
-        throw new Exception("Job reports error.");
-      ManifoldCF.sleep(1000L);
-      continue;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-  
-  protected void waitJobDeleted(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        return;
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-    
-
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseHSQLDB.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseHSQLDB.java
deleted file mode 100644
index c5abf39..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Alfresco"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseITHSQLDB.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseITHSQLDB.java
deleted file mode 100644
index a70eb4d..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-import org.eclipse.jetty.security.HashLoginService;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.plus.jndi.Resource;
-
-import org.junit.After;
-import org.junit.Before;
-
-/** Tests that run the "agents daemon" should be derived from this 
- * 
- *  @author Piergiorgio Lucidi
- * 
- * */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected Server alfrescoServer = null;
-
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Alfresco"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  // Setup/teardown
-  
-  @Before
-  public void setUpAlfresco()
-    throws Exception
-  {
-    alfrescoServer = new Server(9090);
-    alfrescoServer.setStopAtShutdown(true);
-
-    String alfrescoServerWarPath = "../../connectors/alfresco/alfresco-war/alfresco.war";
-
-    if (System.getProperty("alfrescoServerWarPath") != null)
-      alfrescoServerWarPath = System.getProperty("alfrescoServerWarPath");
-    
-    //Initialize Alfresco Server bindings
-    ContextHandlerCollection contexts = new ContextHandlerCollection();
-    alfrescoServer.setHandler(contexts);
-
-    WebAppContext alfrescoServerApi = new WebAppContext(alfrescoServerWarPath,"/alfresco");
-    alfrescoServerApi.setParentLoaderPriority(false);
-    HashLoginService dummyLoginService = new HashLoginService("TEST-SECURITY-REALM");
-    alfrescoServerApi.getSecurityHandler().setLoginService(dummyLoginService);
-    contexts.addHandler(alfrescoServerApi);
-    
-    Class h2DataSource = Thread.currentThread().getContextClassLoader().loadClass("org.h2.jdbcx.JdbcDataSource");
-    Object o = h2DataSource.newInstance();
-    String jdbcUrl = "jdbc:h2:.alf_data_jetty/h2_data/alf_jetty";
-    String jdbcUsername = "alfresco";
-    String jdbcPassword = "alfresco";
-    String jdbcJndiName = "jdbc/dataSource";
-    h2DataSource.getMethod("setURL", new Class[] {String.class}).invoke(o, new Object[] {jdbcUrl});
-    h2DataSource.getMethod("setUser", new Class[] {String.class}).invoke(o, new Object[] {jdbcUsername});
-    h2DataSource.getMethod("setPassword", new Class[] {String.class}).invoke(o, new Object[] {jdbcPassword});
-    
-    Resource jdbcResource = new Resource(jdbcJndiName, o);
-    
-    alfrescoServer.start();
-    boolean entered = false;
-    
-    while(alfrescoServer.isStarted() 
-        && alfrescoServerApi.isStarted()
-        && !entered){
-      entered = true;
-      Thread.sleep(5000);
-    }
-  }
-  
-  @After
-  public void cleanUpAlfresco()
-    throws Exception
-  {
-  }
-  
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BasePostgresql.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BasePostgresql.java
deleted file mode 100644
index 1adc04a..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BasePostgresql.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Alfresco"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseUIHSQLDB.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 01fae5a..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Alfresco Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/NavigationHSQLDBUI.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 72c9679..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-import java.util.Locale;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-import org.junit.Test;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","Null Output Connection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","Alfresco Repository Connection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.alfresco.AlfrescoRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Server tab
-    testerInstance.clickTab("Server");
-    testerInstance.setValue("username", "admin");
-    testerInstance.setValue("password", "admin");
-    testerInstance.setValue("tenantDomain", "");
-    testerInstance.selectValue("protocol", "http");
-    testerInstance.setValue("server", "localhost");
-    testerInstance.setValue("port", "9090");
-    testerInstance.setValue("path", "/alfresco/api");
-    testerInstance.setValue("socketTimeout", "120000");
-    
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","Alfresco Job");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","Null Output Connection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","Alfresco Repository Connection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-    System.out.println("JobId: " + jobID);
-    
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete Alfresco Repository Connection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete Null Output Connection");
-    testerInstance.acceptAlert();
-  }
-  
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/SanityHSQLDBTest.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/SanityHSQLDBTest.java
deleted file mode 100644
index 03bbd51..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-import org.junit.Test;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/SanityPostgresqlTest.java b/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/SanityPostgresqlTest.java
deleted file mode 100644
index b583c75..0000000
--- a/connectors/alfresco/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/alfresco/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.alfresco.tests;
-
-import org.junit.Test;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/alfresco/lib-proprietary/README.txt b/connectors/alfresco/lib-proprietary/README.txt
deleted file mode 100644
index 5e6d0dc..0000000
--- a/connectors/alfresco/lib-proprietary/README.txt
+++ /dev/null
@@ -1,18 +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.
-
-To build this connector, copy the alfresco-web-service-client-3.4.e.jar into this
-directory, and build the connector using the standard ant build.  You can read more
-about the process on the "how-to-build-and-deploy.html" documentation page.
diff --git a/connectors/alfresco/pom.xml b/connectors/alfresco/pom.xml
deleted file mode 100644
index 3a72955..0000000
--- a/connectors/alfresco/pom.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  
-  <developers>
-    <developer>
-      <name>Piergiorgio Lucidi</name>
-      <organization>Sourcesense</organization>
-      <organizationUrl>http://www.sourcesense.com</organizationUrl>
-      <url>http://www.open4dev.com</url>
-    </developer>
-  </developers>
-  
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-alfresco-connector</artifactId>
-  <name>ManifoldCF - Connectors - Alfresco</name>
-
-  <repositories>
-    <repository>
-      <id>alfresco-release</id>
-      <url>https://artifacts.alfresco.com/nexus/content/repositories/releases</url>
-    </repository>
-    <repository>
-            <id>alfresco-snapshots</id>
-            <url>https://artifacts.alfresco.com/nexus/content/repositories/snapshots</url>
-           <snapshots>
-                <enabled>true</enabled>
-           </snapshots>
-    </repository>
-    <repository>
-        <id>alfresco-sites</id>
-        <url>https://artifacts.alfresco.com/nexus/content/repositories/alfresco-docs</url>
-    </repository>
-  </repositories>
-
-  <!-- 
-  <pluginRepositories>
-    <pluginRepository>
-      <id>alfresco-release</id>
-      <url>https://artifacts.alfresco.com/nexus/content/repositories/releases</url>
-    </pluginRepository>
-    <pluginRepository>
-      <id>alfresco-snapshots</id>
-      <url>https://artifacts.alfresco.com/nexus/content/repositories/snapshots</url>
-      <snapshots>
-        <enabled>true</enabled>
-      </snapshots>
-    </pluginRepository>
-  </pluginRepositories>
--->
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>alfresco-4-war</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>alfresco.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-            <alfrescoServerWarPath>../dependency/alfresco.war</alfrescoServerWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-          <argLine>-Xms512m -Xmx1024m -Xss1024k -XX:MaxPermSize=256m -XX:NewSize=256m</argLine>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>commons-beanutils</groupId>
-      <artifactId>commons-beanutils</artifactId>
-      <version>1.7.0</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-      <version>1.6</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-discovery</groupId>
-      <artifactId>commons-discovery</artifactId>
-      <version>0.2</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.xml</groupId>
-      <artifactId>jaxrpc-api</artifactId>
-      <version>1.1</version>
-    </dependency>
-    <dependency>
-      <groupId>com.jcraft</groupId>
-      <artifactId>jsch</artifactId>
-      <version>0.1.38</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opensaml</groupId>
-      <artifactId>opensaml</artifactId>
-      <version>1.1</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.xml.soap</groupId>
-      <artifactId>saaj-api</artifactId>
-      <version>1.3</version>
-    </dependency> 
-    <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>activation</artifactId>
-      <version>1.1.1</version>
-    </dependency>
-    <dependency>
-      <groupId>wsdl4j</groupId>
-      <artifactId>wsdl4j</artifactId>
-      <version>1.6.2</version>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>xalan</artifactId>
-      <version>2.7.0</version>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>2.8.0</version>
-    </dependency>
-    <dependency>
-      <groupId>bouncycastle</groupId>
-      <artifactId>bcprov-jdk15</artifactId>
-      <version>140</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.axis</groupId>
-      <artifactId>axis</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.santuario</groupId>
-      <artifactId>xmlsec</artifactId>
-      <version>1.4.0</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.alfresco</groupId>
-      <artifactId>alfresco-web-service-client</artifactId>
-      <version>4.2.c</version>
-    </dependency>
-    <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>2.6</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-plus</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-schemas</artifactId>
-      <version>${jetty-schemas.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.h2database</groupId>
-      <artifactId>h2</artifactId>
-      <version>1.3.158</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/alfresco/proprietary-library-instructions.txt b/connectors/alfresco/proprietary-library-instructions.txt
deleted file mode 100644
index 1a496be..0000000
--- a/connectors/alfresco/proprietary-library-instructions.txt
+++ /dev/null
@@ -1,19 +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.
-
-To run the Alfresco connector, copy the
-alfresco-web-service-client-3.4.e.jar into this directory, and run
-ManifoldCF using the standard means.  You can read more about the
-process on the "how-to-build-and-deploy.html" documentation page.
diff --git a/connectors/alfresco/test-materials-proprietary/README.txt b/connectors/alfresco/test-materials-proprietary/README.txt
deleted file mode 100644
index 1e42d5d..0000000
--- a/connectors/alfresco/test-materials-proprietary/README.txt
+++ /dev/null
@@ -1,18 +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.
-
-To test this connector, copy the alfresco.war, including h2 support, into this
-directory, and use the "ant test" target for the standard ant build.  You can read more
-about the process on the "how-to-build-and-deploy.html" documentation page.
diff --git a/connectors/amazoncloudsearch/.gitignore b/connectors/amazoncloudsearch/.gitignore
deleted file mode 100644
index ddd6d6d..0000000
--- a/connectors/amazoncloudsearch/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.settings/
-/.classpath
-/.project
diff --git a/connectors/amazoncloudsearch/build.xml b/connectors/amazoncloudsearch/build.xml
deleted file mode 100644
index 62dabb2..0000000
--- a/connectors/amazoncloudsearch/build.xml
+++ /dev/null
@@ -1,62 +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.
--->
-
-<project name="amazoncloudsearch" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="httpclient*.jar"/>
-            <include name="jackson-core*.jar"/>
-            <include name="jackson-databind*.jar"/>
-            <include name="jackson-annotations*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="httpclient*.jar"/>
-                <include name="jackson-core*.jar"/>
-                <include name="jackson-databind*.jar"/>
-                <include name="jackson-annotations*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-	
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="AmazonCloudSearch"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.amazoncloudsearch.AmazonCloudSearchConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/AmazonCloudSearchConfig.java b/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/AmazonCloudSearchConfig.java
deleted file mode 100644
index 9d916f0..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/AmazonCloudSearchConfig.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.amazoncloudsearch;
-
-/** Parameters for AmazonCloudSearch output connector.
- */
-public class AmazonCloudSearchConfig {
-
-  // Configuration parameters
-  public static final String SERVER_HOST="serverhost";
-  public static final String SERVER_PATH="serverpath";
-  public static final String PROXY_PROTOCOL="proxyprotocol";
-  public static final String PROXY_HOST="proxyhost";
-  public static final String PROXY_PORT="proxyport";
-    
-  public static final String SERVER_HOST_DEFAULT = "";
-  public static final String SERVER_PATH_DEFAULT = "/2013-01-01/documents/batch";
-  public static final String PROXY_PROTOCOL_DEFAULT = "http";
-  public static final String PROXY_HOST_DEFAULT = "";
-  public static final String PROXY_PORT_DEFAULT = "";
-  
-  // Specification nodes and values
-  
-}
diff --git a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/AmazonCloudSearchConnector.java b/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/AmazonCloudSearchConnector.java
deleted file mode 100644
index 018682e..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/AmazonCloudSearchConnector.java
+++ /dev/null
@@ -1,747 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.amazoncloudsearch;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.InterruptedIOException;
-import java.io.StringReader;
-import java.io.BufferedReader;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Locale;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Date;
-
-import org.apache.commons.io.input.ReaderInputStream;
-
-import org.apache.http.Consts;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputNotifyActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputCheckActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.agents.output.BaseOutputConnector;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.DBInterfaceFactory;
-import org.apache.manifoldcf.core.interfaces.IDBInterface;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.BinaryInput;
-import org.apache.manifoldcf.core.interfaces.TempFileInput;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-import org.apache.manifoldcf.core.common.DateParser;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import org.apache.manifoldcf.agents.system.Logging;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.JsonToken;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import org.apache.manifoldcf.connectorcommon.jsongen.*;
-
-public class AmazonCloudSearchConnector extends BaseOutputConnector {
-
-  /** Ingestion activity */
-  public final static String INGEST_ACTIVITY = "document ingest";
-  /** Document removal activity */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIGURATION_HTML = "editConfiguration.html";
-  
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-
-  /** Local connection */
-  protected HttpPost poster = null;
-  
-  // What we need for database keys
-  protected String serverHost = null;
-  protected String serverPath = null;
-  
-  /** Document Chunk Manager */
-  private DocumentChunkManager documentChunkManager = null;
-  
-  /** cloudsearch field name for file body text. */
-  private static final String FILE_BODY_TEXT_FIELDNAME = "f_bodytext";
-  
-  /** Field name we use for document's URI. */
-  private static final String DOCUMENT_URI_FIELDNAME = "document_URI";
-  
-  /** Constructor.
-   */
-  public AmazonCloudSearchConnector(){
-  }
-  
-  /** Clear out any state information specific to a given thread.
-  * This method is called when this object is returned to the connection pool.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    documentChunkManager = null;
-  }
-
-  @Override
-  public void install(IThreadContext threadContext) 
-      throws ManifoldCFException
-  {
-    IDBInterface mainDatabase = DBInterfaceFactory.make(threadContext,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    
-    DocumentChunkManager dcmanager = new DocumentChunkManager(mainDatabase);
-    dcmanager.install();
-  }
-
-  @Override
-  public void deinstall(IThreadContext threadContext)
-      throws ManifoldCFException
-  {
-    IDBInterface mainDatabase = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-      
-    DocumentChunkManager dcmanager = new DocumentChunkManager(mainDatabase);
-    dcmanager.deinstall();
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{INGEST_ACTIVITY,REMOVE_ACTIVITY};
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-  * out of the ini file.)
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return poster != null;
-  }
-  
-  /** Close the connection.  Call this before discarding the connection.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    serverHost = null;
-    serverPath = null;
-    poster = null;
-    super.disconnect();
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (documentChunkManager == null)
-    {
-      IDBInterface databaseHandle = DBInterfaceFactory.make(currentContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-      documentChunkManager = new DocumentChunkManager(databaseHandle);
-    }
-
-    serverHost = params.getParameter(AmazonCloudSearchConfig.SERVER_HOST);
-    if (serverHost == null)
-      throw new ManifoldCFException("Server host parameter required");
-    serverPath = params.getParameter(AmazonCloudSearchConfig.SERVER_PATH);
-    if (serverPath == null)
-      throw new ManifoldCFException("Server path parameter required");
-    String proxyProtocol = params.getParameter(AmazonCloudSearchConfig.PROXY_PROTOCOL);
-    String proxyHost = params.getParameter(AmazonCloudSearchConfig.PROXY_HOST);
-    String proxyPort = params.getParameter(AmazonCloudSearchConfig.PROXY_PORT);
-    
-    // Https is OK here without a custom trust store because we know we are talking to an Amazon instance, which has certs that
-    // are presumably non-custom.
-    String urlStr = "https://" + serverHost + serverPath;
-    poster = new HttpPost(urlStr);
-    
-    //set proxy
-    if(proxyHost != null && proxyHost.length() > 0)
-    {
-      try
-      {
-        HttpHost proxy = new HttpHost(proxyHost, Integer.parseInt(proxyPort), proxyProtocol);
-        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
-        poster.setConfig(config);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Number format exception: "+e.getMessage(),e);
-      }
-    }
-    
-    poster.addHeader("Content-Type", "application/json");
-  }
-  
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      getSession();
-      String responsbody = postData(new ReaderInputStream(new StringReader("[]"),Consts.UTF_8));
-      String status = "";
-      
-      try
-      {
-        status = getStatusFromJsonResponse(responsbody);
-      } catch (ManifoldCFException e)
-      {
-        Logging.ingest.debug(e);
-        return "Could not get status from response body. Check Access Policy setting of your domain of Amazon CloudSearch.: " + e.getMessage();
-      }
-      
-      if ("error".equalsIgnoreCase(status)) {
-        return "Connection working. responsbody : " + responsbody;
-      }
-      return "Connection NOT working. responsbody : " + responsbody;
-      
-    } catch (ServiceInterruption e) {
-      Logging.ingest.debug(e);
-      return "Transient exception: "+e.getMessage();
-    }
-  }
-  
-  private String getStatusFromJsonResponse(String responsbody) throws ManifoldCFException {
-    try {
-      JsonParser parser = new JsonFactory().createParser(responsbody);
-      while (parser.nextToken() != JsonToken.END_OBJECT)
-      {
-        String name = parser.getCurrentName();
-        if("status".equalsIgnoreCase(name)){
-          parser.nextToken();
-          return parser.getText();
-        }
-      }
-    } catch (JsonParseException e) {
-      throw new ManifoldCFException(e);
-    } catch (IOException e) {
-      throw new ManifoldCFException(e);
-    }
-    return null;
-  }
-  
-  private String parseMessage(JsonParser parser) throws JsonParseException, IOException {
-    while(parser.nextToken() != JsonToken.END_ARRAY){
-      String name = parser.getCurrentName();
-      if("message".equalsIgnoreCase(name)){
-        parser.nextToken();
-        return parser.getText();
-      }
-    }
-    return null;
-  }
-
-  private final static Set<String> acceptableMimeTypes = new HashSet<String>();
-  static
-  {
-    // We presume input can be decoded using UTF-8, so we can accept only UTF-8 and others for which this also applies
-    acceptableMimeTypes.add("text/plain;charset=utf-8");
-    acceptableMimeTypes.add("text/plain;charset=ascii");
-    acceptableMimeTypes.add("text/plain;charset=us-ascii");
-    acceptableMimeTypes.add("text/plain");
-  }
-  
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param outputDescription is the document's output version.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext outputDescription, String mimeType, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (mimeType == null)
-      return false;
-    return acceptableMimeTypes.contains(mimeType.toLowerCase(Locale.ROOT));
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  *@return the document status (accepted or permanently rejected).
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    // Establish a session
-    getSession();
-    
-    String uid = ManifoldCF.hash(documentURI);
-
-    // Build a JSON generator
-    JSONObjectReader objectReader = new JSONObjectReader();
-    // Build the metadata field part
-    JSONObjectReader fieldReader = new JSONObjectReader();
-    // Add the type and ID
-    objectReader.addNameValuePair(new JSONNameValueReader(new JSONStringReader("id"),new JSONStringReader(uid)))
-      .addNameValuePair(new JSONNameValueReader(new JSONStringReader("type"),new JSONStringReader("add")))
-      .addNameValuePair(new JSONNameValueReader(new JSONStringReader("fields"),fieldReader));
-    
-    // Populate the fields...
-    Iterator<String> itr = document.getFields();
-    while (itr.hasNext())
-    {
-      String fieldName = itr.next();
-      Object[] fieldValues = document.getField(fieldName);
-      JSONReader[] elements = new JSONReader[fieldValues.length];
-      if (fieldValues instanceof Reader[])
-      {
-        for (int i = 0; i < elements.length; i++)
-        {
-          elements[i] = new JSONStringReader((Reader)fieldValues[i]);
-        }
-      }
-      else if (fieldValues instanceof Date[])
-      {
-        for (int i = 0; i < elements.length; i++)
-        {
-          elements[i] = new JSONStringReader(DateParser.formatISO8601Date((Date)fieldValues[i]));
-        }
-      }
-      else if (fieldValues instanceof String[])
-      {
-        for (int i = 0; i < elements.length; i++)
-        {
-          elements[i] = new JSONStringReader((String)fieldValues[i]);
-        }
-      }
-      else
-        throw new IllegalStateException("Unexpected metadata type: "+fieldValues.getClass().getName());
-      
-      fieldReader.addNameValuePair(new JSONNameValueReader(new JSONStringReader(fieldName),new JSONArrayReader(elements)));
-    }
-    
-    // Add in the original URI
-    fieldReader.addNameValuePair(new JSONNameValueReader(new JSONStringReader(DOCUMENT_URI_FIELDNAME),
-      new JSONStringReader(documentURI)));
-
-    // Add the primary content data in.
-    fieldReader.addNameValuePair(new JSONNameValueReader(new JSONStringReader(FILE_BODY_TEXT_FIELDNAME),
-      new JSONStringReader(new InputStreamReader(document.getBinaryStream(),Consts.UTF_8))));
-    
-    documentChunkManager.recordDocument(uid, serverHost, serverPath, documentURI, INGEST_ACTIVITY, new Long(document.getBinaryLength()), new ReaderInputStream(objectReader, Consts.UTF_8));
-    conditionallyFlushDocuments(activities);
-    return DOCUMENTSTATUS_ACCEPTED;
-  }
-  
-  /** Remove a document using the connector.
-  * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Establish a session
-    getSession();
-    
-    String uid = ManifoldCF.hash(documentURI);
-
-    // Build a JSON generator
-    JSONObjectReader objectReader = new JSONObjectReader();
-    // Add the type and ID
-    objectReader.addNameValuePair(new JSONNameValueReader(new JSONStringReader("id"),new JSONStringReader(uid)))
-      .addNameValuePair(new JSONNameValueReader(new JSONStringReader("type"),new JSONStringReader("delete")));
-
-    try
-    {
-      documentChunkManager.recordDocument(uid, serverHost, serverPath, documentURI, REMOVE_ACTIVITY, null, new ReaderInputStream(objectReader, Consts.UTF_8));
-    }
-    catch (IOException e)
-    {
-      handleIOException(e);
-    }
-    conditionallyFlushDocuments(activities);
-  }
-  
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-      throws ManifoldCFException, ServiceInterruption {
-    getSession();
-    flushDocuments(activities);
-  }
-  
-  protected static final int CHUNK_SIZE = 1000;
-
-  protected void conditionallyFlushDocuments(IOutputHistoryActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (documentChunkManager.equalOrMoreThan(serverHost, serverPath, CHUNK_SIZE))
-      flushDocuments(activities);
-  }
-  
-  protected void flushDocuments(IOutputHistoryActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.ingest.info("AmazonCloudSearch: Starting flush to Amazon");
-
-    // Repeat until we are empty of cached stuff
-    int chunkNumber = 0;
-    while (true)
-    {
-      DocumentRecord[] records = documentChunkManager.readChunk(serverHost, serverPath, CHUNK_SIZE);
-      try
-      {
-        if (records.length == 0)
-          break;
-        // The records consist of up to 1000 individual input streams, which must be all concatenated together into the post
-        // To do that, we go into and out of Reader space once again...
-        JSONArrayReader arrayReader = new JSONArrayReader();
-        for (DocumentRecord dr : records)
-        {
-          arrayReader.addArrayElement(new JSONValueReader(new InputStreamReader(dr.getDataStream(),Consts.UTF_8)));
-        }
-        
-        //post data..
-        String responsbody = postData(new ReaderInputStream(arrayReader,Consts.UTF_8));
-        // check status
-        String status = getStatusFromJsonResponse(responsbody);
-        if("success".equals(status))
-        {
-          // Activity-log the individual documents we sent
-          for (DocumentRecord dr : records)
-          {
-            activities.recordActivity(null,dr.getActivity(),dr.getDataSize(),dr.getUri(),"OK",null);
-          }
-          Logging.ingest.info("AmazonCloudSearch: Successfully sent document chunk " + chunkNumber);
-          //remove documents from table..
-          documentChunkManager.deleteChunk(records);
-        }
-        else
-        {
-          // Activity-log the individual documents that failed
-          for (DocumentRecord dr : records)
-          {
-            activities.recordActivity(null,dr.getActivity(),dr.getDataSize(),dr.getUri(),"FAILED",responsbody);
-          }
-          Logging.ingest.error("AmazonCloudSearch: Error sending document chunk "+ chunkNumber+": '"+ responsbody + "'");
-          throw new ManifoldCFException("Received error status from service after feeding document.  Response body: '" + responsbody +"'");
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          throw e;
-        for (DocumentRecord dr : records)
-        {
-          activities.recordActivity(null,dr.getActivity(),dr.getDataSize(),dr.getUri(),e.getClass().getSimpleName().toUpperCase(Locale.ROOT),e.getMessage());
-        }
-        throw e;
-      }
-      catch (ServiceInterruption e)
-      {
-        for (DocumentRecord dr : records)
-        {
-          activities.recordActivity(null,dr.getActivity(),dr.getDataSize(),dr.getUri(),e.getClass().getSimpleName().toUpperCase(Locale.ROOT),e.getMessage());
-        }
-        throw e;
-      }
-      finally
-      {
-        Throwable exception = null;
-        for (DocumentRecord dr : records)
-        {
-          try
-          {
-            dr.close();
-          }
-          catch (Throwable e)
-          {
-            exception = e;
-          }
-        }
-        if (exception != null)
-        {
-          if (exception instanceof ManifoldCFException)
-            throw (ManifoldCFException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else
-            throw new RuntimeException("Unknown exception class thrown: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      }
-    }
-  }
-
-  /**
-   * Fill in a Server tab configuration parameter map for calling a Velocity
-   * template.
-   *
-   * @param newMap is the map to fill in
-   * @param parameters is the current set of configuration parameters
-   */
-  private static void fillInServerConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String serverhost = parameters.getParameter(AmazonCloudSearchConfig.SERVER_HOST);
-    String serverpath = parameters.getParameter(AmazonCloudSearchConfig.SERVER_PATH);
-    String proxyprotocol = parameters.getParameter(AmazonCloudSearchConfig.PROXY_PROTOCOL);
-    String proxyhost = parameters.getParameter(AmazonCloudSearchConfig.PROXY_HOST);
-    String proxyport = parameters.getParameter(AmazonCloudSearchConfig.PROXY_PORT);
-
-    if (serverhost == null)
-      serverhost = AmazonCloudSearchConfig.SERVER_HOST_DEFAULT;
-    if (serverpath == null)
-      serverpath = AmazonCloudSearchConfig.SERVER_PATH_DEFAULT;
-    if (proxyprotocol == null)
-      proxyprotocol = AmazonCloudSearchConfig.PROXY_PROTOCOL_DEFAULT;
-    if (proxyhost == null)
-      proxyhost = AmazonCloudSearchConfig.PROXY_HOST_DEFAULT;
-    if (proxyport == null)
-      proxyport = AmazonCloudSearchConfig.PROXY_PORT_DEFAULT;
-
-    newMap.put("SERVERHOST", serverhost);
-    newMap.put("SERVERPATH", serverpath);
-    newMap.put("PROXYPROTOCOL", proxyprotocol);
-    newMap.put("PROXYHOST", proxyhost);
-    newMap.put("PROXYPORT", proxyport);
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIGURATION_HTML,paramMap);
-  }
-
-  /**
-   *
-   * Output the configuration header section. This method is called in the
-   * head section of the connector's configuration page. Its purpose is to add
-   * the required tabs to the list, and to output any javascript methods that
-   * might be needed by the configuration editing HTML.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @param tabsArray is an array of tab names. Add to this array any tab
-   * names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, "AmazonCloudSearchOutputConnector.ServerTabName"));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-        
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIGURATION_JS,paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-    
-    // Call the Velocity templates for each tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-    
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    
-    // Server tab
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIGURATION_HTML,paramMap);
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post,
-   * including binary file post information.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an
-   * error that should prevent saving of the connection (and cause a
-   * redirection to an error page).
-   *
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-    IPostParameters variableContext, ConfigParams parameters)
-    throws ManifoldCFException {
-
-    // Server tab parameters
-    String serverhost = variableContext.getParameter("serverhost");
-    if (serverhost != null)
-      parameters.setParameter(AmazonCloudSearchConfig.SERVER_HOST, serverhost);
-    String serverpath = variableContext.getParameter("serverpath");
-    if (serverpath != null)
-      parameters.setParameter(AmazonCloudSearchConfig.SERVER_PATH, serverpath);
-    String proxyprotocol = variableContext.getParameter("proxyprotocol");
-    if (proxyprotocol != null)
-      parameters.setParameter(AmazonCloudSearchConfig.PROXY_PROTOCOL, proxyprotocol);
-    String proxyhost = variableContext.getParameter("proxyhost");
-    if (proxyhost != null)
-      parameters.setParameter(AmazonCloudSearchConfig.PROXY_HOST, proxyhost);
-    String proxyport = variableContext.getParameter("proxyport");
-    if (proxyport != null)
-      parameters.setParameter(AmazonCloudSearchConfig.PROXY_PORT, proxyport);
-
-    return null;
-  }
-
-  private String postData(InputStream jsonData) throws ServiceInterruption, ManifoldCFException {
-    CloseableHttpClient httpclient = HttpClients.createDefault();
-    try {
-      BinaryInput bi = new TempFileInput(jsonData);
-      try
-      {
-        poster.setEntity(new InputStreamEntity(bi.getStream(),bi.getLength()));
-        HttpResponse res = httpclient.execute(poster);
-        
-        HttpEntity resEntity = res.getEntity();
-        return EntityUtils.toString(resEntity);
-      }
-      finally
-      {
-        bi.discard();
-      }
-    } catch (ClientProtocolException e) {
-      throw new ManifoldCFException(e);
-    } catch (IOException e) {
-      handleIOException(e);
-    } finally {
-      try {
-        httpclient.close();
-      } catch (IOException e) {
-        //do nothing
-      }
-    }
-    return null;
-  }
-  
-  private static void handleIOException(IOException e)
-      throws ManifoldCFException, ServiceInterruption {
-    if (!(e instanceof java.net.SocketTimeoutException)
-        && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    Logging.ingest.warn(
-        "Amazon CloudSearch: IO exception: " + e.getMessage(), e);
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: " + e.getMessage(), e,
-        currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
-  }
-  
-}
diff --git a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/DocumentChunkManager.java b/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/DocumentChunkManager.java
deleted file mode 100644
index b03de52..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/DocumentChunkManager.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.amazoncloudsearch;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Iterator;
-
-import java.io.InputStream;
-import java.io.IOException;
-
-import org.apache.manifoldcf.core.interfaces.ColumnDescription;
-import org.apache.manifoldcf.core.interfaces.IndexDescription;
-import org.apache.manifoldcf.core.interfaces.IDBInterface;
-import org.apache.manifoldcf.core.interfaces.IResultRow;
-import org.apache.manifoldcf.core.interfaces.IResultSet;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.BinaryInput;
-import org.apache.manifoldcf.core.interfaces.TempFileInput;
-import org.apache.manifoldcf.core.interfaces.ClauseDescription;
-import org.apache.manifoldcf.core.interfaces.UnitaryClause;
-
-public class DocumentChunkManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  // Database fields
-  private final static String UID_FIELD = "uid";                        // This is the document key, which is a dochash value
-  private final static String URI_FIELD = "documenturi";            // This is the document URI in plain text
-  private final static String ACTIVITY_FIELD = "activity";          //  This is a flag, for activity logging, describing whether this is an indexing operation or a delete
-  private final static String LENGTH_FIELD = "doclength";          // Binary length of original document
-  private final static String HOST_FIELD = "serverhost";            // The host and path are there to make sure we don't collide between connections
-  private final static String PATH_FIELD = "serverpath";
-  private final static String SDF_DATA_FIELD = "sdfdata";
-  
-  public DocumentChunkManager(
-      IDBInterface database)
-  {
-    super(database, "amazoncloudsearch_documentdata");
-  }
-
-  /** Install the manager 
-   * @throws ManifoldCFException 
-   */
-  public void install() throws ManifoldCFException
-  {
-    // Standard practice: outer loop on install methods, no transactions
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the table.
-        HashMap map = new HashMap();
-        map.put(UID_FIELD,new ColumnDescription("VARCHAR(40)",false,false,null,null,false));
-        map.put(HOST_FIELD,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(PATH_FIELD,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(URI_FIELD,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(ACTIVITY_FIELD,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(LENGTH_FIELD,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(SDF_DATA_FIELD,new ColumnDescription("BLOB",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code, if needed, goes here
-      }
-
-      // Handle indexes, if needed
-      IndexDescription keyIndex = new IndexDescription(true,new String[]{HOST_FIELD,PATH_FIELD,UID_FIELD});
-
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (keyIndex != null && id.equals(keyIndex))
-          keyIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (keyIndex != null)
-        performAddIndex(null,keyIndex);
-
-
-      break;
-    }
-  }
-  
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-  
-  /**
-   * Record document information for later trasmission to Amazon.
-   * @param uid documentuid
-   * @param sdfData document SDF data.
-   * @throws ManifoldCFException
-   */
-  public void recordDocument(String uid, String host, String path, String uri, String activity, Long length, InputStream sdfData) 
-      throws ManifoldCFException, IOException
-  {
-    TempFileInput tfi = null;
-    try
-    {
-      // This downloads all the data from upstream!
-      try
-      {
-        tfi = new TempFileInput(sdfData);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          throw e;
-        throw new IOException("Fetch failed: "+e.getMessage());
-      }
-      
-      while (true)
-      {
-        long sleepAmt = 0L;
-        try
-        {
-          beginTransaction();
-          try
-          {
-
-            ArrayList params = new ArrayList();
-            String query = buildConjunctionClause(params,new ClauseDescription[]{
-              new UnitaryClause(HOST_FIELD,host),
-              new UnitaryClause(PATH_FIELD,path),
-              new UnitaryClause(UID_FIELD,uid)});
-
-            IResultSet set = performQuery("SELECT "+UID_FIELD+" FROM "+getTableName()+" WHERE "+
-              query+" FOR UPDATE",params,null,null);
-            
-            Map<String,Object> parameterMap = new HashMap<String,Object>();
-            parameterMap.put(SDF_DATA_FIELD, tfi);
-            parameterMap.put(URI_FIELD, uri);
-            parameterMap.put(ACTIVITY_FIELD, activity);
-            if (length != null)
-              parameterMap.put(LENGTH_FIELD, length);
-            
-            //if record exists on table, update record.
-            if(set.getRowCount() > 0)
-            {
-              performUpdate(parameterMap, " WHERE "+query, params, null);
-            }
-            else
-            {
-              parameterMap.put(UID_FIELD, uid);
-              parameterMap.put(HOST_FIELD, host);
-              parameterMap.put(PATH_FIELD, path);
-              performInsert(parameterMap, null);
-            }
-      
-            break;
-          }
-          catch (ManifoldCFException e)
-          {
-            signalRollback();
-            throw e;
-          }
-          catch (RuntimeException e)
-          {
-            signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            signalRollback();
-            throw e;
-          }
-          finally
-          {
-            endTransaction();
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          // Look for deadlock and retry if so
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            sleepAmt = getSleepAmt();
-            continue;
-          }
-          throw e;
-        }
-      }
-
-    }
-    finally
-    {
-      if (tfi != null)
-        tfi.discard();
-    }
-  }
-  
-  /** Determine if there are N documents or more.
-  */
-  public boolean equalOrMoreThan(String host, String path, int maximumNumber)
-    throws ManifoldCFException
-  {
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(HOST_FIELD,host),
-      new UnitaryClause(PATH_FIELD,path)});
-    IResultSet set = performQuery("SELECT "+constructCountClause(UID_FIELD)+" AS countval FROM "+getTableName()+" WHERE "+query+" "+constructOffsetLimitClause(0,maximumNumber),params,null,null);
-    long count;
-    if (set.getRowCount() > 0)
-    {
-      IResultRow row = set.getRow(0);
-      Long countVal = (Long)row.getValue("countval");
-      count = countVal.longValue();
-    }
-    else
-      count = 0L;
-    
-    return count >= maximumNumber;
-  }
-  
-  /** Read a chunk of documents.
-  */
-  public DocumentRecord[] readChunk(String host, String path, int maximumNumber)
-    throws ManifoldCFException
-  {
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(HOST_FIELD,host),
-      new UnitaryClause(PATH_FIELD,path)});
-
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+query+" "+constructOffsetLimitClause(0,maximumNumber),params,null,null);
-    DocumentRecord[] rval = new DocumentRecord[set.getRowCount()];
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = new DocumentRecord(host,path,
-        (String)row.getValue(UID_FIELD),
-        (String)row.getValue(URI_FIELD),
-        (String)row.getValue(ACTIVITY_FIELD),
-        (Long)row.getValue(LENGTH_FIELD),
-        (BinaryInput)row.getValue(SDF_DATA_FIELD));
-    }
-    return rval;
-  }
-  
-  /** Delete the chunk of documents (presumably because we processed them successfully)
-  */
-  public void deleteChunk(DocumentRecord[] records)
-    throws ManifoldCFException
-  {
-    // Do the whole thing in a transaction -- if we mess up, we'll have to try everything again
-    while (true)
-    {
-      long sleepAmt = 0L;
-      try
-      {
-        beginTransaction();
-        try
-        {
-
-          // Theoretically we could aggregate the records, but for now delete one at a time.
-          for (DocumentRecord dr : records)
-          {
-            String host = dr.getHost();
-            String path = dr.getPath();
-            String uid = dr.getUid();
-            ArrayList params = new ArrayList();
-            String query = buildConjunctionClause(params,new ClauseDescription[]{
-              new UnitaryClause(HOST_FIELD,host),
-              new UnitaryClause(PATH_FIELD,path),
-              new UnitaryClause(UID_FIELD,uid)});
-            performDelete("WHERE "+query,params,null);
-          }
-          
-          break;
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (RuntimeException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Look for deadlock and retry if so
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          sleepAmt = getSleepAmt();
-          continue;
-        }
-        throw e;
-      }
-    }
-
-  }
-  
-}
diff --git a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/DocumentRecord.java b/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/DocumentRecord.java
deleted file mode 100644
index ba177ae..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/DocumentRecord.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.amazoncloudsearch;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.io.*;
-
-public class DocumentRecord {
-  
-  protected final String host;
-  protected final String path;
-  protected final String uid;
-  protected final String uri;
-  protected final String activity;
-  protected final Long dataSize;
-  protected final BinaryInput data;
-  
-  public DocumentRecord(String host, String path, String uid, String uri, String activity, Long dataSize, BinaryInput data)
-  {
-    this.host = host;
-    this.path = path;
-    this.uid = uid;
-    this.uri = uri;
-    this.activity = activity;
-    this.dataSize = dataSize;
-    this.data = data;
-  }
-
-  public String getHost()
-  {
-    return host;
-  }
-  
-  public String getPath()
-  {
-    return path;
-  }
-  
-  public String getUid()
-  {
-    return uid;
-  }
-  
-  public String getUri()
-  {
-    return uri;
-  }
-  
-  public String getActivity()
-  {
-    return activity;
-  }
-  
-  public Long getDataSize()
-  {
-    return dataSize;
-  }
-  
-  public long getStreamLength()
-    throws ManifoldCFException
-  {
-    if (data != null)
-      return data.getLength();
-    return 0L;
-  }
-  
-  public InputStream getDataStream()
-    throws ManifoldCFException
-  {
-    if (data != null)
-      return data.getStream();
-    return null;
-  }
-  
-  public void close()
-    throws ManifoldCFException
-  {
-    if (data != null)
-      data.discard();
-  }
-  
-}
diff --git a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/Messages.java b/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/Messages.java
deleted file mode 100644
index b1e1cbc..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/amazoncloudsearch/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.amazoncloudsearch;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.amazoncloudsearch.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.output.amazoncloudsearch";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_en_US.properties b/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_en_US.properties
deleted file mode 100644
index c1c1dfe..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_en_US.properties
+++ /dev/null
@@ -1,24 +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.
-
-AmazonCloudSearchOutputConnector.ServerTabName=Server
-AmazonCloudSearchOutputConnector.ServerHostColon=Server host:
-AmazonCloudSearchOutputConnector.ServerPathColon=Server path:
-AmazonCloudSearchOutputConnector.ProxyProtocolColon=Proxy protocol:
-AmazonCloudSearchOutputConnector.ProxyHostColon=Proxy host:
-AmazonCloudSearchOutputConnector.ProxyPortColon=Proxy port:
-AmazonCloudSearchOutputConnector.ServerHostCannotBeNull=Server host cannot be null
-AmazonCloudSearchOutputConnector.ServerPathMustStartWithSlash=Server path must start with a '/'
-AmazonCloudSearchOutputConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
diff --git a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_es_ES.properties b/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_es_ES.properties
deleted file mode 100644
index dde4104..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_es_ES.properties
+++ /dev/null
@@ -1,25 +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.
-
-AmazonCloudSearchOutputConnector.ServerTabName=Servidor
-AmazonCloudSearchOutputConnector.ServerHostColon=host de servidor:
-AmazonCloudSearchOutputConnector.ServerPathColon=ruta del servidor:
-AmazonCloudSearchOutputConnector.ProxyProtocolColon=protocolo Proxy:
-AmazonCloudSearchOutputConnector.ProxyHostColon=Host de proxy:
-AmazonCloudSearchOutputConnector.ProxyPortColon=Puerto de proxy:
-AmazonCloudSearchOutputConnector.ServerHostCannotBeNull=Host del servidor no puede ser nulo
-AmazonCloudSearchOutputConnector.ServerPathMustStartWithSlash=Ruta del servidor debe comenzar con una '/'
-AmazonCloudSearchOutputConnector.ProxyPortMustBeAnInteger=Puerto proxy debe ser un entero
- 
\ No newline at end of file
diff --git a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_ja_JP.properties b/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_ja_JP.properties
deleted file mode 100644
index 315c309..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_ja_JP.properties
+++ /dev/null
@@ -1,24 +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.
-
-AmazonCloudSearchOutputConnector.ServerTabName=サーバー
-AmazonCloudSearchOutputConnector.ServerHostColon=サーバー名:
-AmazonCloudSearchOutputConnector.ServerPathColon=パス:
-AmazonCloudSearchOutputConnector.ProxyProtocolColon=プロキシ プロトコル:
-AmazonCloudSearchOutputConnector.ProxyHostColon=プロキシ ホスト:
-AmazonCloudSearchOutputConnector.ProxyPortColon=プロキシ ポート:
-AmazonCloudSearchOutputConnector.ServerHostCannotBeNull=サーバー名は必須です。
-AmazonCloudSearchOutputConnector.ServerPathMustStartWithSlash=パスは / から入力してください。
-AmazonCloudSearchOutputConnector.ProxyPortMustBeAnInteger=プロキシ ポートは数値を入力してください。
diff --git a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_zh_CN.properties b/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_zh_CN.properties
deleted file mode 100644
index f04374d..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/amazoncloudsearch/common_zh_CN.properties
+++ /dev/null
@@ -1,24 +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.
-
-AmazonCloudSearchOutputConnector.ServerTabName=服务器
-AmazonCloudSearchOutputConnector.ServerHostColon=服务器主机:
-AmazonCloudSearchOutputConnector.ServerPathColon=服务器路径:
-AmazonCloudSearchOutputConnector.ProxyProtocolColon=代理服务器协议:
-AmazonCloudSearchOutputConnector.ProxyHostColon=代理服务器主机:
-AmazonCloudSearchOutputConnector.ProxyPortColon=代理服务器端口:
-AmazonCloudSearchOutputConnector.ServerHostCannotBeNull=服务器主机不能为空
-AmazonCloudSearchOutputConnector.ServerPathMustStartWithSlash=服务器路径必须开始于'/'
-AmazonCloudSearchOutputConnector.ProxyPortMustBeAnInteger=服务器端口必须为整数
diff --git a/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/editConfiguration.html b/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/editConfiguration.html
deleted file mode 100644
index b253e9d..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/editConfiguration.html
+++ /dev/null
@@ -1,70 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerTabName'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerHostColon'))</nobr></td>
-    <td class="value"><input name="serverhost" type="text" value="$Encoder.attributeEscape($SERVERHOST)" size="32" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerPathColon'))</nobr></td>
-    <td class="value"><input name="serverpath" type="text" value="$Encoder.attributeEscape($SERVERPATH)" size="32" /></td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyProtocolColon'))</nobr></td>
-    <td class="value">
-      <select name="proxyprotocol" size="2">
-  #if($PROXYPROTOCOL == 'http')
-        <option value="http" selected="true">http</option>
-  #else
-        <option value="http">http</option>
-  #end
-  #if($PROXYPROTOCOL == 'https')
-        <option value="https" selected="true">https</option>
-  #else
-        <option value="https">https</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyHostColon'))</nobr></td>
-    <td class="value"><input name="proxyhost" type="text" value="$Encoder.attributeEscape($PROXYHOST)" size="32" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyPortColon'))</nobr></td>
-    <td class="value"><input name="proxyport" type="text" value="$Encoder.attributeEscape($PROXYPORT)" size="5" /></td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="serverhost" value="$Encoder.attributeEscape($SERVERHOST)" />
-<input type="hidden" name="serverpath" value="$Encoder.attributeEscape($SERVERPATH)" />
-<input type="hidden" name="proxyprotocol" value="$Encoder.attributeEscape($PROXYPROTOCOL)" />
-<input type="hidden" name="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)" />
-<input type="hidden" name="proxyport" value="$Encoder.attributeEscape($PROXYPORT)" />
-
-#end
diff --git a/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/editConfiguration.js b/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/editConfiguration.js
deleted file mode 100644
index 4cb9a85..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/editConfiguration.js
+++ /dev/null
@@ -1,46 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfigForSave()
-{
-  if (editconnection.serverhost.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerHostCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerTabName'))");
-    editconnection.serverhost.focus();
-    return false;
-  }
-  if (!editconnection.serverpath.value.indexOf("/") == 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerPathMustStartWithSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerTabName'))");
-    editconnection.serverpath.focus();
-    return false;
-  }
-  if (editconnection.proxyport.value != "" && !isInteger(editconnection.proxyport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyPortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerTabName'))");
-    editconnection.proxyport.focus();
-    return false;
-  }
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/viewConfiguration.html b/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/viewConfiguration.html
deleted file mode 100644
index e93d716..0000000
--- a/connectors/amazoncloudsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/amazoncloudsearch/viewConfiguration.html
+++ /dev/null
@@ -1,42 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerHostColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($SERVERHOST)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ServerPathColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($SERVERPATH)</td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyProtocolColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($PROXYPROTOCOL)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyHostColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($PROXYHOST)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('AmazonCloudSearchOutputConnector.ProxyPortColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($PROXYPORT)</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/amazoncloudsearch/pom.xml b/connectors/amazoncloudsearch/pom.xml
deleted file mode 100644
index fcb8573..0000000
--- a/connectors/amazoncloudsearch/pom.xml
+++ /dev/null
@@ -1,388 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <developers>
-    <developer>
-      <name>Takumi Yoshida</name>
-      <url>http://yoshi0309.hatenablog.com/</url>
-    </developer>
-  </developers>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-amazoncloudsearch-connector</artifactId>
-  <name>ManifoldCF - Connectors - Amazon CloudSearch Output</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-      <version>2.6.1</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>2.6.1</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-annotations</artifactId>
-      <version>2.6.1</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/amazons3/build.xml b/connectors/amazons3/build.xml
deleted file mode 100644
index 0933fab..0000000
--- a/connectors/amazons3/build.xml
+++ /dev/null
@@ -1,70 +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.
--->
-
-<project name="amazons3" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="aws-java-sdk-core-*.jar"/>
-            <include name="aws-java-sdk-s3-*.jar"/>
-            <include name="jackson-core*.jar"/>
-            <include name="jackson-databind*.jar"/>
-            <include name="jackson-annotations*.jar"/>
-            <include name="joda-time*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-              <include name="aws-java-sdk-core-*.jar"/>
-              <include name="aws-java-sdk-s3-*.jar"/>
-              <include name="jackson-core*.jar"/>
-              <include name="jackson-databind*.jar"/>
-              <include name="jackson-annotations*.jar"/>
-              <include name="joda-time*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-	
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="AmazonS3"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.amazons3.AmazonS3Connector"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="AmazonS3"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.amazons3.AmazonS3Authority"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/amazons3/S3Artifact.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/amazons3/S3Artifact.java
deleted file mode 100644
index 8812f22..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/amazons3/S3Artifact.java
+++ /dev/null
@@ -1,80 +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 org.apache.manifoldcf.amazons3;
-
-/**
- * 
- * @author Kuhajeyan
- *
- */
-public class S3Artifact {
-
-  private String bucketName;
-
-  private String key;
-
-  public S3Artifact() {
-
-  }
-
-  public S3Artifact(String bucketName, String key) {
-
-    this.bucketName = bucketName;
-    this.key = key;
-  }
-
-  public String getBucketName() {
-    return bucketName;
-  }
-
-  public void setBucketName(String bucketName) {
-    this.bucketName = bucketName;
-  }
-
-  public String getKey() {
-    return key;
-  }
-
-  public void setKey(String key) {
-    this.key = key;
-  }
-  
-  @Override
-  public boolean equals(Object obj) {
-    if(obj == null)
-      return false;
-    
-    if(!(obj instanceof S3Artifact))
-      return false;
-    
-    if(obj == this){
-      return true;
-    }
-    
-    S3Artifact newObj = (S3Artifact)obj;
-    if(newObj.getBucketName() == this.getBucketName() && newObj.getKey() == this.getKey())
-      return true;
-    
-    return false;
-  }
-  
-  @Override
-  public int hashCode() {    
-    return this.getBucketName().hashCode() + this.getKey().hashCode() + 345;
-  }
-
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/amazons3/XThreadBuffer.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/amazons3/XThreadBuffer.java
deleted file mode 100644
index 8a3d802..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/amazons3/XThreadBuffer.java
+++ /dev/null
@@ -1,88 +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 org.apache.manifoldcf.amazons3;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.manifoldcf.crawler.system.Logging;
-
-/**
- * Generic XThread class 
- * @author Kuhajeyan
- *
- * @param <T>
- */
-public class XThreadBuffer<T> {
-  protected static int MAX_SIZE = 1024;
-
-  protected List<T> buffer = Collections.synchronizedList(new ArrayList<T>(
-      MAX_SIZE));
-
-  protected boolean complete = false;
-
-  protected boolean abandoned = false;
-
-  /** Constructor */
-  public XThreadBuffer() {
-  }
-
-  public synchronized void add(T t) throws InterruptedException {
-    while (buffer.size() == MAX_SIZE && !abandoned)
-      wait();
-    if (abandoned)
-      return;
-    buffer.add(t);
-    // Notify threads that are waiting on there being stuff in the queue
-    notifyAll();
-  }
-
-  public synchronized void abandon() {
-    abandoned = true;
-    // Notify waiting threads
-    notifyAll();
-  }
-
-  public synchronized T fetch() throws InterruptedException {
-
-    while (buffer.size() == 0 && !complete) 
-    {
-      if (Logging.connectors != null) {
-        Logging.connectors.info("thread will be put to wait");
-      }
-      wait();
-    }
-
-    if (buffer.size() == 0)
-      return null;
-    boolean isBufferFull = (buffer.size() == MAX_SIZE);
-    T rval = buffer.remove(buffer.size() - 1);
-    // Notify those threads waiting on buffer being not completely full to
-    // wake
-    if (isBufferFull)
-      notifyAll();
-    return rval;
-  }
-
-  public synchronized void signalDone() {
-    complete = true;
-    // Notify threads that are waiting for stuff to appear, because it won't
-    notifyAll();
-  }
-
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/AmazonS3Authority.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/AmazonS3Authority.java
deleted file mode 100644
index ab1065e..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/AmazonS3Authority.java
+++ /dev/null
@@ -1,599 +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 org.apache.manifoldcf.authorities.authorities.amazons3;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.core.interfaces.ConfigNode;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-import com.amazonaws.AmazonClientException;
-import com.amazonaws.AmazonServiceException;
-import com.amazonaws.auth.BasicAWSCredentials;
-import com.amazonaws.services.s3.AmazonS3;
-import com.amazonaws.services.s3.AmazonS3Client;
-import com.amazonaws.services.s3.model.AccessControlList;
-import com.amazonaws.services.s3.model.Bucket;
-import com.amazonaws.services.s3.model.CanonicalGrantee;
-import com.amazonaws.services.s3.model.Grant;
-import com.amazonaws.services.s3.model.Grantee;
-import com.amazonaws.services.s3.model.Owner;
-
-/**
- * Authority connector for Amazons3
- * @author Kuhajeyan
- *
- */
-public class AmazonS3Authority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector {
-  private static final String TAB_NAME = "TabName";
-
-  protected long lastSessionFetch = -1L;
-
-  protected static final long timeToRelease = 300000L;
-
-  protected AmazonS3 amazonS3;
-
-  protected boolean connected = false;
-
-  protected String amazons3ProxyHost = null;
-
-  protected String amazons3ProxyPort = null;
-
-  protected String amazons3ProxyDomain = null;
-
-  protected String amazons3ProxyUserName = null;
-
-  protected String amazons3ProxyPassword = null;
-
-  protected String amazons3AwsAccessKey = null;
-
-  protected String amazons3AwsSecretKey = null;
-
-  public AmazonS3Authority() {
-
-  }
-
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    amazons3AwsAccessKey = null;
-    amazons3AwsSecretKey = null;
-
-    amazons3ProxyHost = null;
-    amazons3ProxyPort = null;
-    amazons3ProxyDomain = null;
-    amazons3ProxyUserName = null;
-    amazons3ProxyPassword = null;
-  }
-
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    // aws access and secret keys
-    amazons3AwsAccessKey = configParams
-        .getParameter(AmazonS3Config.AWS_ACCESS_KEY);
-    amazons3AwsSecretKey = configParams
-        .getObfuscatedParameter(AmazonS3Config.AWS_SECRET_KEY);
-
-    // proxy values
-    amazons3ProxyHost = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_HOST);
-    amazons3ProxyPort = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_PORT);
-    amazons3ProxyDomain = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_DOMAIN);
-    amazons3ProxyUserName = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_USERNAME);
-    amazons3ProxyPassword = configParams
-        .getObfuscatedParameter(AmazonS3Config.AMAZONS3_PROXY_PASSWORD);
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection
-   * integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    // connect with amazons3 client
-    Logging.authorityConnectors.info("Checking connection");
-
-    try {
-      // invokes the check thread
-      CheckThread checkThread = new CheckThread(getClient());
-      checkThread.start();
-      checkThread.join();
-      if (checkThread.getException() != null) {
-        Throwable thr = checkThread.getException();
-        return "Check exception: " + thr.getMessage();
-      }
-      return checkThread.getResult();
-    }
-    catch (InterruptedException ex) {
-      Logging.authorityConnectors.error(
-          "Error while checking connection", ex);
-      throw new ManifoldCFException(ex.getMessage(), ex,
-          ManifoldCFException.INTERRUPTED);
-    }
-
-  }
-
-  /**
-   * Get the Amazons3 client, relevant access keys should have been posted
-   * already
-   * @return
-   */
-  protected AmazonS3 getClient() {
-    if (amazonS3 == null) {
-      try {
-        BasicAWSCredentials awsCreds = new BasicAWSCredentials(
-            amazons3AwsAccessKey, amazons3AwsSecretKey);
-        amazonS3 = new AmazonS3Client(awsCreds);
-      }
-      catch (Exception e) {
-        Logging.authorityConnectors.error(
-            "Error while amazon s3 connectionr", e);
-
-      }
-    }
-    lastSessionFetch = System.currentTimeMillis();
-    return amazonS3;
-  }
-
-  @Override
-  public boolean isConnected() {
-    return amazonS3 != null && amazonS3.getS3AccountOwner() != null;
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      amazonS3 = null;
-      lastSessionFetch = -1L;
-    }
-  }
-
-  private void fillInServerConfigurationMap(Map<String, Object> out,
-      IPasswordMapperActivity mapper, ConfigParams parameters) {
-
-    String amazons3AccessKey = parameters
-        .getParameter(AmazonS3Config.AWS_ACCESS_KEY);
-    String amazons3SecretKey = parameters
-        .getObfuscatedParameter(AmazonS3Config.AWS_SECRET_KEY);
-
-    // default values
-    if (amazons3AccessKey == null)
-      amazons3AccessKey = AmazonS3Config.AMAZONS3_AWS_ACCESS_KEY_DEFAULT;
-    if (amazons3SecretKey == null)
-      amazons3SecretKey = AmazonS3Config.AMAZONS3_AWS_SECRET_KEY_DEFAULT;
-    else
-      amazons3SecretKey = mapper.mapPasswordToKey(amazons3SecretKey);
-
-    // fill the map
-    out.put("AMAZONS3_AWS_ACCESS_KEY", amazons3AccessKey);
-    out.put("AMAZONS3_AWS_SECRET_KEY", amazons3SecretKey);
-  }
-
-  private void fillInProxyConfigurationMap(Map<String, Object> out,
-      IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String amazons3ProxyHost = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_HOST);
-    String amazons3ProxyPort = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_PORT);
-    String amazons3ProxyDomain = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_DOMAIN);
-    String amazons3ProxyUserName = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_USERNAME);
-    String amazons3ProxyPassword = parameters
-        .getObfuscatedParameter(AmazonS3Config.AMAZONS3_PROXY_PASSWORD);
-
-    if (amazons3ProxyHost == null)
-      amazons3ProxyHost = AmazonS3Config.AMAZONS3_PROXY_HOST_DEFAULT;
-    if (amazons3ProxyPort == null)
-      amazons3ProxyPort = AmazonS3Config.AMAZONS3_PROXY_PORT_DEFAULT;
-    if (amazons3ProxyDomain == null)
-      amazons3ProxyDomain = AmazonS3Config.AMAZONS3_PROXY_DOMAIN_DEFAULT;
-    if (amazons3ProxyUserName == null)
-      amazons3ProxyUserName = AmazonS3Config.AMAZONS3_PROXY_USERNAME_DEFAULT;
-    if (amazons3ProxyPassword == null)
-      amazons3ProxyPassword = AmazonS3Config.AMAZONS3_PROXY_PASSWORD_DEFAULT;
-    else
-      amazons3ProxyPassword = mapper
-          .mapPasswordToKey(amazons3ProxyPassword);
-
-    // fill the map
-    out.put("AMAZONS3_PROXY_HOST", amazons3ProxyHost);
-    out.put("AMAZONS3_PROXY_PORT", amazons3ProxyPort);
-    out.put("AMAZONS3_PROXY_DOMAIN", amazons3ProxyDomain);
-    out.put("AMAZONS3_PROXY_USERNAME", amazons3ProxyUserName);
-    out.put("AMAZONS3_PROXY_PWD", amazons3ProxyPassword);
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   * 
-   * */
-  public void viewConfiguration(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, AmazonS3Config.VIEW_CONFIG_FORWARD, paramMap);
-  }
-
-  /**
-   * Output the configuration header section. This method is called in the
-   * head section of the connector's configuration page. Its purpose is to add
-   * the required tabs to the list, and to output any javascript methods that
-   * might be needed by the configuration editing HTML.
-   * */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale,
-        AmazonS3Config.AMAZONS3_SERVER_TAB_PROPERTY));
-    // Add the Proxy tab
-    tabsArray.add(Messages.getString(locale,
-        AmazonS3Config.AMAZONS3_PROXY_TAB_PROPERTY));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_CONFIG_HEADER_FORWARD, paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      String tabName) throws ManifoldCFException, IOException {
-
-    // Call the Velocity templates for each tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put(TAB_NAME, tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_CONFIG_FORWARD_SERVER, paramMap);
-    // Proxy tab
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_CONFIG_FORWARD_PROXY, paramMap);
-
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   * */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, Locale locale,
-      ConfigParams parameters) throws ManifoldCFException {
-    // server tab
-    String awsAccessKey = variableContext.getParameter("aws_access_key");
-
-    if (awsAccessKey != null) {
-      parameters
-          .setParameter(AmazonS3Config.AWS_ACCESS_KEY, awsAccessKey);
-    }
-    String awsSecretKey = variableContext.getParameter("aws_secret_key");
-    if (awsSecretKey != null) {
-      // set as obfuscated parameter
-      parameters.setObfuscatedParameter(AmazonS3Config.AWS_SECRET_KEY,
-          variableContext.mapKeyToPassword(awsSecretKey));
-    }
-    Logging.authorityConnectors.info("Saved values for aws keys");
-
-    int i = 0;
-    while (i < parameters.getChildCount()) {
-      ConfigNode cn = parameters.getChild(i);
-      if (cn.getType().equals(AmazonS3Config.AWS_ACCESS_KEY)
-          || cn.getType().equals(AmazonS3Config.AWS_SECRET_KEY))
-        parameters.removeChild(i);
-      else
-        i++;
-    }
-
-    // proxy tab
-    String amazons3ProxyHost = variableContext
-        .getParameter("amazons3_proxy_host");
-    if (amazons3ProxyHost != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_HOST,
-          amazons3ProxyHost);
-    }
-    String amazons3ProxyPort = variableContext
-        .getParameter("amazons3_proxy_port");
-    if (amazons3ProxyPort != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_PORT,
-          amazons3ProxyPort);
-    }
-    String amazons3ProxyDomain = variableContext
-        .getParameter("amazons3_proxy_domain");
-    if (amazons3ProxyDomain != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_DOMAIN,
-          amazons3ProxyDomain);
-    }
-    String amazons3ProxyUserName = variableContext
-        .getParameter("amazons3_proxy_username");
-    if (amazons3ProxyUserName != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_USERNAME,
-          amazons3ProxyUserName);
-    }
-    String amazons3ProxyPassword = variableContext
-        .getParameter("amazons3_proxy_pwd");
-    if (amazons3ProxyPassword != null) {
-      // set as obfuscated parameter
-      parameters.setObfuscatedParameter(
-          AmazonS3Config.AMAZONS3_PROXY_PASSWORD,
-          variableContext.mapKeyToPassword(amazons3ProxyPassword));
-    }
-
-    return null;
-  }
-
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-      throws ManifoldCFException {
-
-    try {
-      HashMap<String, Set<Grant>> checkUserExists = checkUserExists(userName);
-      if (isUserAvailable(userName, checkUserExists.values())) {
-        return new AuthorizationResponse(new String[] { userName },
-          AuthorizationResponse.RESPONSE_OK);
-      }
-		
-    }
-    catch (Exception e) {
-      Logging.authorityConnectors.error("Error while getting authorization response",e);
-      return RESPONSE_UNREACHABLE;
-    }
-    return RESPONSE_USERNOTFOUND;
-  }
-
-  private boolean isUserAvailable(String userName,
-      Collection<Set<Grant>> collection) {
-    String[] users = getUsers(collection);
-    return Arrays.asList(users).contains(userName);
-  }
-
-  private String[] getUsers(Collection<Set<Grant>> collection) {
-    Set<String> users = new HashSet<String>();// no duplicates
-    for (Collection c : collection) {
-      Set<Grant> c1 = (Set<Grant>) c;
-      for (Grant grant : c1) {
-        if (grant != null && grant.getGrantee() != null) {
-          Grantee grantee = grant.getGrantee();
-
-          if (grantee instanceof CanonicalGrantee) {
-            users.add(((CanonicalGrantee) grantee).getDisplayName());
-          }
-          else {
-            users.add(grantee.getIdentifier());
-          }
-        }
-      }
-    }
-
-    return users.toArray(new String[users.size()]);
-  }
-
-  private HashMap<String, Set<Grant>> checkUserExists(String userName)
-      throws ManifoldCFException {
-    GrantsThread t = new GrantsThread(getClient());
-    try {
-      t.start();
-      t.finishUp();
-      return t.getResult();
-    }
-    catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    }
-    catch (InterruptedIOException e) {
-      t.interrupt();
-      handleIOException(e);
-    }
-    catch (IOException e) {
-      handleIOException(e);
-    }
-    catch (ResponseException e) {
-      handleResponseException(e);
-    }
-    return null;
-  }
-
-  /**
-   * Obtain the default access tokens for a given user name.
-   * @param userName is the user name or identifier.
-   * @return the default response tokens, presuming that the connect method
-   * fails.
-   */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-    return RESPONSE_UNREACHABLE;
-  }
-
-  private static void handleIOException(IOException e)
-      throws ManifoldCFException {
-    if (!(e instanceof java.net.SocketTimeoutException)
-        && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    Logging.authorityConnectors.warn(
-        "JIRA: IO exception: " + e.getMessage(), e);
-    throw new ManifoldCFException("IO exception: " + e.getMessage(), e);
-  }
-
-  private static void handleResponseException(ResponseException e)
-      throws ManifoldCFException {
-    throw new ManifoldCFException("Response exception: " + e.getMessage(),
-        e);
-  }
-
-  protected static class GrantsThread extends Thread {
-
-    protected Throwable exception = null;
-
-    protected boolean result = false;
-
-    protected AmazonS3 amazonS3 = null;
-
-    private HashMap<String, Set<Grant>> grants;
-
-    public GrantsThread(AmazonS3 amazonS3) {
-      super();
-      this.amazonS3 = amazonS3;
-      setDaemon(true);
-      grants = new HashMap<String, Set<Grant>>();
-    }
-
-    public void finishUp() throws InterruptedException, IOException,
-        ResponseException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        }
-        else if (thr instanceof ResponseException) {
-          throw (ResponseException) thr;
-        }
-        else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        }
-        else {
-          throw (Error) thr;
-        }
-      }
-    }
-
-    @Override
-    public void run() {
-
-      List<Bucket> listBuckets = amazonS3.listBuckets();
-      for (Bucket bucket : listBuckets) {
-        AccessControlList bucketAcl = amazonS3.getBucketAcl(bucket
-            .getName());
-
-        if (bucketAcl != null)
-          grants.put(bucket.getName(), bucketAcl.getGrants());
-      }
-    }
-
-    public HashMap<String, Set<Grant>> getResult() {
-      return grants;
-    }
-
-  }
-
-  protected static class CheckThread extends Thread {
-    protected String result = "Unknown";
-
-    protected AmazonS3 s3 = null;
-
-    protected Throwable exception = null;
-
-    public CheckThread(AmazonS3 s3) {
-      this.s3 = s3;
-    }
-
-    public String getResult() {
-      return result;
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-
-    @Override
-    public void run() {
-      try {
-        if (s3 != null) {
-          Owner s3AccountOwner = s3.getS3AccountOwner();
-          if (s3AccountOwner != null) {
-            result = StringUtils.isNotEmpty(s3AccountOwner
-                .getDisplayName()) ? "Connection OK"
-                : "Connection Failed";
-          }
-
-        }
-      }
-      catch (AmazonServiceException e) {
-        result = "Connection Failed : " + e.getMessage();
-        exception = e;
-
-        Logging.authorityConnectors.error(e);
-      }
-      catch (AmazonClientException e) {
-        result = "Connection Failed : " + e.getMessage();
-        exception = e;
-
-        Logging.authorityConnectors.error(e);
-      }
-    }
-  }
-
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/AmazonS3Config.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/AmazonS3Config.java
deleted file mode 100644
index b6292c4..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/AmazonS3Config.java
+++ /dev/null
@@ -1,103 +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 org.apache.manifoldcf.authorities.authorities.amazons3;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class AmazonS3Config {
-  public static final String AWS_ACCESS_KEY = "aws_access_key";
-
-  public static final String AWS_SECRET_KEY = "aws_secret_key";
-
-  public static final String AMAZONS3_HOST = "amazons3_host";
-
-  public static final String AMAZONS3_PORT = "amazons3_port";
-
-  public static final String AMAZONS3_PROTOCOL = "amazons3_protocol";
-
-  public static final String AMAZONS3_PROXY_HOST = "amazons3_proxy_host";
-
-  public static final String AMAZONS3_PROXY_PORT = "amazons3_proxy_port";
-
-  public static final String AMAZONS3_PROXY_DOMAIN = "amazons3_proxy_domain";
-
-  public static final String AMAZONS3_PROXY_USERNAME = "amazons3_proxy_username";
-
-  public static final String AMAZONS3_PROXY_PASSWORD = "amazons3_proxy_password";
-
-  public static final String AMAZONS3_HOST_DEFAULT = "";
-
-  public static final String AMAZONS3_PORT_DEFAULT = "";
-
-  public static final String AMAZONS3_PROTOCOL_DEFAULT = "http";
-
-  public static final String AMAZONS3_AWS_ACCESS_KEY_DEFAULT = "";
-
-  public static final String AMAZONS3_AWS_SECRET_KEY_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_HOST_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_PORT_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_DOMAIN_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_USERNAME_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_PASSWORD_DEFAULT = "";
-
-  public static final String AMAZONS3_BUCKETS_DEFAULT = "";
-
-  // Configuration tabs
-  public static final String AMAZONS3_SERVER_TAB_PROPERTY = "Amazons3AuthorityConnector.Server";
-
-  public static final String AMAZONS3_PROXY_TAB_PROPERTY = "Amazons3AuthorityConnector.Proxy";
-
-  // Specification tabs
-  public static final String AMAZONS3_BUCKETS_TAB_PROPERTY = "Amazons3AuthorityConnector.Amazons3Buckets";
-
-  public static final String AMAZONS3_SECURITY_TAB_PROPERTY = "Amazons3AuthorityConnector.Amazons3Security";
-
-  // Template names for configuration
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  public static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_amazons3.js";
-
-  public static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_amazons3_server.html";
-
-  public static final String EDIT_CONFIG_FORWARD_PROXY = "editConfiguration_amazons3_proxy.html";
-
-  public static final String VIEW_CONFIG_FORWARD = "viewConfiguration_amazons3.html";
-
-  
-  
-  
-  
-  
-  //////
-  public static final int CHARACTER_LIMIT = 1000000;
-
-  public static final String DOCUMENT_URI_FORMAT = "%s.s3.amazonaws.com/%s";
-
-  
-
-  public static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-
-  public static final String JOB_BUCKETS_ATTRIBUTE = "s3buckets";
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/Messages.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/Messages.java
deleted file mode 100644
index 6c89584..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/Messages.java
+++ /dev/null
@@ -1,144 +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 org.apache.manifoldcf.authorities.authorities.amazons3;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.amazons3.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.amazons3";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/ResponseException.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/ResponseException.java
deleted file mode 100644
index d3d2a40..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/amazons3/ResponseException.java
+++ /dev/null
@@ -1,32 +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 org.apache.manifoldcf.authorities.authorities.amazons3;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class ResponseException extends Exception {
-
-  public ResponseException(String msg) {
-    super(msg);
-  }
-
-  public ResponseException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3Config.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3Config.java
deleted file mode 100644
index b5be926..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3Config.java
+++ /dev/null
@@ -1,117 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class AmazonS3Config {
-  public static final String AWS_ACCESS_KEY = "aws_access_key";
-
-  public static final String AWS_SECRET_KEY = "aws_secret_key";
-
-  public static final String AMAZONS3_HOST = "amazons3_host";
-
-  public static final String AMAZONS3_PORT = "amazons3_port";
-
-  public static final String AMAZONS3_PROTOCOL = "amazons3_protocol";
-
-  public static final String AMAZONS3_PROXY_HOST = "amazons3_proxy_host";
-
-  public static final String AMAZONS3_PROXY_PORT = "amazons3_proxy_port";
-
-  public static final String AMAZONS3_PROXY_DOMAIN = "amazons3_proxy_domain";
-
-  public static final String AMAZONS3_PROXY_USERNAME = "amazons3_proxy_username";
-
-  public static final String AMAZONS3_PROXY_PASSWORD = "amazons3_proxy_password";
-
-  public static final String AMAZONS3_HOST_DEFAULT = "";
-
-  public static final String AMAZONS3_PORT_DEFAULT = "";
-
-  public static final String AMAZONS3_PROTOCOL_DEFAULT = "http";
-
-  public static final String AMAZONS3_AWS_ACCESS_KEY_DEFAULT = "";
-
-  public static final String AMAZONS3_AWS_SECRET_KEY_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_HOST_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_PORT_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_DOMAIN_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_USERNAME_DEFAULT = "";
-
-  public static final String AMAZONS3_PROXY_PASSWORD_DEFAULT = "";
-
-  public static final String AMAZONS3_BUCKETS_DEFAULT = "";
-
-  // Configuration tabs
-  public static final String AMAZONS3_SERVER_TAB_PROPERTY = "Amazons3RepositoryConnector.Server";
-
-  public static final String AMAZONS3_PROXY_TAB_PROPERTY = "Amazons3RepositoryConnector.Proxy";
-
-  // Specification tabs
-  public static final String AMAZONS3_BUCKETS_TAB_PROPERTY = "Amazons3RepositoryConnector.Amazons3Buckets";
-
-  public static final String AMAZONS3_SECURITY_TAB_PROPERTY = "Amazons3RepositoryConnector.Amazons3Security";
-
-  // Template names for configuration
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  public static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_amazons3.js";
-
-  public static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_amazons3_server.html";
-
-  public static final String EDIT_CONFIG_FORWARD_PROXY = "editConfiguration_amazons3_proxy.html";
-
-  public static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification_amazons3.js";
-
-  public static final String EDIT_SPEC_FORWARD_BUCKETS = "editSpecification_buckets.html";
-
-  public static final String VIEW_CONFIG_FORWARD = "viewConfiguration_amazons3.html";
-
-  public static final String VIEW_SPEC_FORWARD = "viewSpecification_amazons3.html";
-  
-  //job
-  protected static final String RELATIONSHIP_RELATED = "related";
-
-  
-
-  public static final String JOB_ACCESS_NODE_TYPE = "access";
-
-  public static final String JOB_TOKEN_ATTRIBUTE = "token";
-  
-  
-  
-  
-  //////
-  public static final int CHARACTER_LIMIT = 1000000;
-  public static final String DOCUMENT_URI_FORMAT = "%s.s3.amazonaws.com/%s";
-  public static final String BUCKET_SPLITTER = ",";
-  public static final String STD_SEPARATOR_BUCKET_AND_KEY = BUCKET_SPLITTER;
-
-  
-
-  public static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-
-  public static final String JOB_BUCKETS_ATTRIBUTE = "s3buckets";
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3Connector.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3Connector.java
deleted file mode 100644
index d611d9b..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3Connector.java
+++ /dev/null
@@ -1,917 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.amazons3.S3Artifact;
-import org.apache.manifoldcf.amazons3.XThreadBuffer;
-import org.apache.manifoldcf.core.connector.BaseConnector;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.tika.Tika;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.parser.AutoDetectParser;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.sax.BodyContentHandler;
-
-import com.amazonaws.AmazonClientException;
-import com.amazonaws.AmazonServiceException;
-import com.amazonaws.auth.BasicAWSCredentials;
-import com.amazonaws.services.s3.AmazonS3;
-import com.amazonaws.services.s3.AmazonS3Client;
-import com.amazonaws.services.s3.model.AccessControlList;
-import com.amazonaws.services.s3.model.Bucket;
-import com.amazonaws.services.s3.model.CanonicalGrantee;
-import com.amazonaws.services.s3.model.GetObjectRequest;
-import com.amazonaws.services.s3.model.Grant;
-import com.amazonaws.services.s3.model.Grantee;
-import com.amazonaws.services.s3.model.ListObjectsRequest;
-import com.amazonaws.services.s3.model.ObjectListing;
-import com.amazonaws.services.s3.model.ObjectMetadata;
-import com.amazonaws.services.s3.model.Owner;
-import com.amazonaws.services.s3.model.S3Object;
-import com.amazonaws.services.s3.model.S3ObjectSummary;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class AmazonS3Connector extends BaseRepositoryConnector {
-
-  private static final String BUCKET_SPLITTER = ",";
-
-  private static final String TAB_NAME = "TabName";
-
-  private static final String SELECTED_NUM = "SelectedNum";
-
-  private static final String SEQ_NUM = "SeqNum";
-
-  protected final static String ACTIVITY_READ = "read document";
-
-  protected long lastSessionFetch = -1L;
-
-  protected static final long timeToRelease = 300000L;
-
-  protected AmazonS3 amazonS3;
-
-  protected boolean connected = false;
-
-  protected String amazons3ProxyHost = null;
-
-  protected String amazons3ProxyPort = null;
-
-  protected String amazons3ProxyDomain = null;
-
-  protected String amazons3ProxyUserName = null;
-
-  protected String amazons3ProxyPassword = null;
-
-  protected String amazons3AwsAccessKey = null;
-
-  protected String amazons3AwsSecretKey = null;
-
-  private static final String STD_SEPARATOR_BUCKET_AND_KEY = BUCKET_SPLITTER;
-
-  private String[] buckets;
-
-  private DocumentProcess documentProcess;
-
-  public AmazonS3Connector() {
-    super();
-    documentProcess = new GenericDocumentProcess();
-  }
-
-  @Override
-  public String[] getActivitiesList() {
-    return new String[] { ACTIVITY_READ };
-  }
-
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[] { amazons3AwsAccessKey };
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    amazons3AwsAccessKey = null;
-    amazons3AwsSecretKey = null;
-
-    amazons3ProxyHost = null;
-    amazons3ProxyPort = null;
-    amazons3ProxyDomain = null;
-    amazons3ProxyUserName = null;
-    amazons3ProxyPassword = null;
-  }
-
-  /**
-   * Connect method initializes the configparams
-   * */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    // aws access and secret keys
-    amazons3AwsAccessKey = configParams
-        .getParameter(AmazonS3Config.AWS_ACCESS_KEY);
-    amazons3AwsSecretKey = configParams
-        .getObfuscatedParameter(AmazonS3Config.AWS_SECRET_KEY);
-
-    // proxy values
-    amazons3ProxyHost = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_HOST);
-    amazons3ProxyPort = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_PORT);
-    amazons3ProxyDomain = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_DOMAIN);
-    amazons3ProxyUserName = configParams
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_USERNAME);
-    amazons3ProxyPassword = configParams
-        .getObfuscatedParameter(AmazonS3Config.AMAZONS3_PROXY_PASSWORD);
-  }
-
-  /**
-   * Get the Amazons3 client, relevant access keys should have been posted
-   * already
-   * @return
- * @throws ManifoldCFException 
-   */
-  protected AmazonS3 getClient() throws ManifoldCFException {
-    if (amazonS3 == null) {
-      try {
-        BasicAWSCredentials awsCreds = new BasicAWSCredentials(
-            amazons3AwsAccessKey, amazons3AwsSecretKey);
-        amazonS3 = new AmazonS3Client(awsCreds);
-      }
-      catch (Exception e) {
-        Logging.connectors
-            .error("Error while amazon s3 connectionr", e);
-        throw new ManifoldCFException(
-                "Amazon client can not connect at the moment",e.getCause());
-      }
-    }
-    lastSessionFetch = System.currentTimeMillis();
-    return amazonS3;
-  }
-
-  /**
-   * 
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    // connect with amazons3 client
-    Logging.connectors.info("Checking connection");
-
-    try {
-      // invokes the check thread
-      CheckThread checkThread = new CheckThread(getClient());
-      checkThread.start();
-      checkThread.join();// should wait for join
-      if (checkThread.getException() != null) {
-        Throwable thr = checkThread.getException();
-        return "Check exception: " + thr.getMessage();
-      }
-      return checkThread.getResult();
-    }
-    catch (InterruptedException ex) {
-      Logging.connectors.error("Error while checking connection", ex);
-      throw new ManifoldCFException(ex.getMessage(), ex,
-          ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  @Override
-  public boolean isConnected() {
-    return amazonS3 != null && amazonS3.getS3AccountOwner() != null;
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      amazonS3 = null;
-      lastSessionFetch = -1L;
-    }
-  }
-
-  @Override
-  public int getMaxDocumentRequest() {
-    return 1;
-  }
-
-  /**
-   * Return the list of relationship types that this connector recognizes.
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes() {
-    return new String[] { AmazonS3Config.RELATIONSHIP_RELATED };
-  }
-
-  private void fillInServerConfigurationMap(Map<String, Object> newMap,
-      IPasswordMapperActivity mapper, ConfigParams parameters) {
-
-    String amazons3AccessKey = parameters
-        .getParameter(AmazonS3Config.AWS_ACCESS_KEY);
-    String amazons3SecretKey = parameters
-        .getObfuscatedParameter(AmazonS3Config.AWS_SECRET_KEY);
-
-    // default values
-    if (amazons3AccessKey == null)
-      amazons3AccessKey = AmazonS3Config.AMAZONS3_AWS_ACCESS_KEY_DEFAULT;
-    if (amazons3SecretKey == null)
-      amazons3SecretKey = AmazonS3Config.AMAZONS3_AWS_SECRET_KEY_DEFAULT;
-    else
-      amazons3SecretKey = mapper.mapPasswordToKey(amazons3SecretKey);
-
-    // fill the map
-    newMap.put("AMAZONS3_AWS_ACCESS_KEY", amazons3AccessKey);
-    newMap.put("AMAZONS3_AWS_SECRET_KEY", amazons3SecretKey);
-  }
-
-  private void fillInProxyConfigurationMap(Map<String, Object> newMap,
-      IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String amazons3ProxyHost = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_HOST);
-    String amazons3ProxyPort = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_PORT);
-    String amazons3ProxyDomain = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_DOMAIN);
-    String amazons3ProxyUserName = parameters
-        .getParameter(AmazonS3Config.AMAZONS3_PROXY_USERNAME);
-    String amazons3ProxyPassword = parameters
-        .getObfuscatedParameter(AmazonS3Config.AMAZONS3_PROXY_PASSWORD);
-
-    if (amazons3ProxyHost == null)
-      amazons3ProxyHost = AmazonS3Config.AMAZONS3_PROXY_HOST_DEFAULT;
-    if (amazons3ProxyPort == null)
-      amazons3ProxyPort = AmazonS3Config.AMAZONS3_PROXY_PORT_DEFAULT;
-    if (amazons3ProxyDomain == null)
-      amazons3ProxyDomain = AmazonS3Config.AMAZONS3_PROXY_DOMAIN_DEFAULT;
-    if (amazons3ProxyUserName == null)
-      amazons3ProxyUserName = AmazonS3Config.AMAZONS3_PROXY_USERNAME_DEFAULT;
-    if (amazons3ProxyPassword == null)
-      amazons3ProxyPassword = AmazonS3Config.AMAZONS3_PROXY_PASSWORD_DEFAULT;
-    else
-      amazons3ProxyPassword = mapper
-          .mapPasswordToKey(amazons3ProxyPassword);
-
-    // fill the map
-    newMap.put("AMAZONS3_PROXY_HOST", amazons3ProxyHost);
-    newMap.put("AMAZONS3_PROXY_PORT", amazons3ProxyPort);
-    newMap.put("AMAZONS3_PROXY_DOMAIN", amazons3ProxyDomain);
-    newMap.put("AMAZONS3_PROXY_USERNAME", amazons3ProxyUserName);
-    newMap.put("AMAZONS3_PROXY_PWD", amazons3ProxyPassword);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.VIEW_CONFIG_FORWARD, paramMap);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale,
-        AmazonS3Config.AMAZONS3_SERVER_TAB_PROPERTY));
-    // Add the Proxy tab
-    tabsArray.add(Messages.getString(locale,
-        AmazonS3Config.AMAZONS3_PROXY_TAB_PROPERTY));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_CONFIG_HEADER_FORWARD, paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      String tabName) throws ManifoldCFException, IOException {
-    // Call the Velocity templates for each tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put(TAB_NAME, tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_CONFIG_FORWARD_SERVER, paramMap);
-    // Proxy tab
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_CONFIG_FORWARD_PROXY, paramMap);
-  }
-
-  private static void fillInBucketsSpecificationMap(
-      Map<String, Object> newMap, Specification ds) {
-    String s3Buckets = AmazonS3Config.AMAZONS3_BUCKETS_DEFAULT;
-    newMap.put("AMAZONS3BUCKETS", s3Buckets);
-    s3Buckets = getExcludedBuckets(ds);
-    if (s3Buckets != null && !StringUtils.isEmpty(s3Buckets)) {
-      String[] buckets = s3Buckets.split(BUCKET_SPLITTER);
-
-      newMap.put("AMAZONS3BUCKETS", s3Buckets);
-
-      Logging.connectors.info("resolved s3 bucket values : " + s3Buckets);
-    }
-    else {
-      Logging.connectors.info("No exclusion buckets available");
-    }
-  }
-
-  private static String getExcludedBuckets(Specification ds) {
-    String buckets = null;
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(AmazonS3Config.JOB_STARTPOINT_NODE_TYPE)) {
-        buckets = sn
-            .getAttributeValue(AmazonS3Config.JOB_BUCKETS_ATTRIBUTE);
-      }
-    }
-    return buckets;
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, Locale locale,
-      ConfigParams parameters) throws ManifoldCFException {
-    // server tab
-    String awsAccessKey = variableContext.getParameter("aws_access_key");
-    if (awsAccessKey != null) {
-      parameters
-          .setParameter(AmazonS3Config.AWS_ACCESS_KEY, awsAccessKey);
-    }
-    String awsSecretKey = variableContext.getParameter("aws_secret_key");
-    if (awsSecretKey != null) {
-      // set as obfuscated parameter
-      parameters.setObfuscatedParameter(AmazonS3Config.AWS_SECRET_KEY,
-          variableContext.mapKeyToPassword(awsSecretKey));
-    }
-
-    // proxy tab
-    String amazons3ProxyHost = variableContext
-        .getParameter("amazons3_proxy_host");
-    if (amazons3ProxyHost != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_HOST,
-          amazons3ProxyHost);
-    }
-    String amazons3ProxyPort = variableContext
-        .getParameter("amazons3_proxy_port");
-    if (amazons3ProxyPort != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_PORT,
-          amazons3ProxyPort);
-    }
-    String amazons3ProxyDomain = variableContext
-        .getParameter("amazons3_proxy_domain");
-    if (amazons3ProxyDomain != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_DOMAIN,
-          amazons3ProxyDomain);
-    }
-    String amazons3ProxyUserName = variableContext
-        .getParameter("amazons3_proxy_username");
-    if (amazons3ProxyUserName != null) {
-      parameters.setParameter(AmazonS3Config.AMAZONS3_PROXY_USERNAME,
-          amazons3ProxyUserName);
-    }
-    String amazons3ProxyPassword = variableContext
-        .getParameter("amazons3_proxy_pwd");
-    if (amazons3ProxyPassword != null) {
-      // set as obfuscated parameter
-      parameters.setObfuscatedParameter(
-          AmazonS3Config.AMAZONS3_PROXY_PASSWORD,
-          variableContext.mapKeyToPassword(amazons3ProxyPassword));
-    }
-
-    return null;
-  }
-
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale,
-      Specification ds, int connectionSequenceNumber)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put(SEQ_NUM, Integer.toString(connectionSequenceNumber));
-    fillInBucketsSpecificationMap(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.VIEW_SPEC_FORWARD, paramMap);
-  }
-
-  /**
-   * Process a specification post. This method is called at the start of job's
-   * edit or view page, whenever there is a possibility that form data for a
-   * connection has been posted. Its purpose is to gather form information and
-   * modify the document specification accordingly. The name of the posted
-   * form is always "editjob". The connector will be connected before this
-   * method can be called.
-   *
-   * @param variableContext contains the post data, including binary
-   * file-upload information.
-   * @param locale is the locale the output is preferred to be in.
-   * @param ds is the current document specification for this job.
-   * @param connectionSequenceNumber is the unique number of this connection
-   * within the job.
-   * @return null if all is well, or a string error message if there is an
-   * error that should prevent saving of the job (and cause a redirection to
-   * an error page).
-   */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext,
-      Locale locale, Specification ds, int connectionSequenceNumber)
-      throws ManifoldCFException {
-    String seqPrefix = "s" + connectionSequenceNumber + "_";
-    String s3Buckets = variableContext.getParameter(seqPrefix
-        + AmazonS3Config.JOB_BUCKETS_ATTRIBUTE);
-    // strip off buckets
-    if (StringUtils.isNotEmpty(s3Buckets)) {
-      s3Buckets = s3Buckets.replaceAll("\\s+", "");
-      buckets = s3Buckets.split(BUCKET_SPLITTER);
-
-      if (buckets != null) {
-        int i = 0;
-        while (i < ds.getChildCount()) {
-          SpecificationNode oldNode = ds.getChild(i);
-          if (oldNode.getType().equals(
-              AmazonS3Config.JOB_STARTPOINT_NODE_TYPE)) {
-            ds.removeChild(i);
-            break;
-          }
-          i++;
-        }
-        SpecificationNode node = new SpecificationNode(
-            AmazonS3Config.JOB_STARTPOINT_NODE_TYPE);
-        node.setAttribute(AmazonS3Config.JOB_BUCKETS_ATTRIBUTE,
-            s3Buckets);
-        ds.addChild(ds.getChildCount(), node);
-      }
-
-    }
-
-    String xc = variableContext.getParameter(seqPrefix + "tokencount");
-    if (xc != null) {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(AmazonS3Config.JOB_ACCESS_NODE_TYPE))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount) {
-        String accessDescription = "_" + Integer.toString(i);
-        String accessOpName = seqPrefix + "accessop"
-            + accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete")) {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix
-            + "spectoken" + accessDescription);
-        SpecificationNode node = new SpecificationNode(
-            AmazonS3Config.JOB_ACCESS_NODE_TYPE);
-        node.setAttribute(AmazonS3Config.JOB_TOKEN_ATTRIBUTE,
-            accessSpec);
-        ds.addChild(ds.getChildCount(), node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix + "accessop");
-      if (op != null && op.equals("Add")) {
-        String accessspec = variableContext.getParameter(seqPrefix
-            + "spectoken");
-        SpecificationNode node = new SpecificationNode(
-            AmazonS3Config.JOB_ACCESS_NODE_TYPE);
-        node.setAttribute(AmazonS3Config.JOB_TOKEN_ATTRIBUTE,
-            accessspec);
-        ds.addChild(ds.getChildCount(), node);
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale,
-      Specification ds, int connectionSequenceNumber,
-      int actualSequenceNumber, String tabName)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put(TAB_NAME, tabName);
-    paramMap.put(SEQ_NUM, Integer.toString(connectionSequenceNumber));
-    paramMap.put(SELECTED_NUM, Integer.toString(actualSequenceNumber));
-
-    fillInBucketsSpecificationMap(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_SPEC_FORWARD_BUCKETS, paramMap);
-  }
-
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale,
-      Specification ds, int connectionSequenceNumber,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale,
-        AmazonS3Config.AMAZONS3_BUCKETS_TAB_PROPERTY));
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put(SEQ_NUM, Integer.toString(connectionSequenceNumber));
-
-    fillInBucketsSpecificationMap(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale,
-        AmazonS3Config.EDIT_SPEC_HEADER_FORWARD, paramMap);
-  }
-
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities,
-      Specification spec, String lastSeedVersion, long seedTime,
-      int jobMode) throws ManifoldCFException, ServiceInterruption {
-
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-
-    String[] bucketsToRemove = null;
-    String unparsedBuckets = getExcludedBuckets(spec);
-    if (unparsedBuckets != null && StringUtils.isNotEmpty(unparsedBuckets))
-      bucketsToRemove = unparsedBuckets.split(BUCKET_SPLITTER);
-    // get seeds
-    getSeeds(activities, bucketsToRemove);
-
-    return new Long(seedTime).toString();
-  }
-
-  private void getSeeds(ISeedingActivity activities, String[] buckets)
-      throws ManifoldCFException, ServiceInterruption {
-    GetSeedsThread t = new GetSeedsThread(getClient(), buckets);
-    try {
-      t.start();
-
-      boolean wasInterrupted = false;
-      try {
-        XThreadBuffer<S3Artifact> seedBuffer = t.getBuffer();
-        // Pick up the paths, and add them to the activities, before we
-        // join with the child thread.
-        while (true) {
-          // The only kind of exceptions this can throw are going to
-          // shut the process down.
-          S3Artifact s3Artifact = seedBuffer.fetch();
-          if (s3Artifact == null) {
-            Logging.connectors.info("No artifact retured");
-            break;
-          }
-
-          String issueKey = s3Artifact.getBucketName()
-              + STD_SEPARATOR_BUCKET_AND_KEY
-              + s3Artifact.getKey();
-
-          Logging.connectors.info("Issue key is : " + issueKey);
-          activities.addSeedDocument(issueKey);
-
-        }
-      }
-      catch (InterruptedException e) {
-
-        Logging.connectors.error(e);
-
-        wasInterrupted = true;
-        throw e;
-      }
-      catch (ManifoldCFException e) {
-
-        Logging.connectors.error(e);
-
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          wasInterrupted = true;
-        throw e;
-      }
-      finally {
-        if (!wasInterrupted)
-          t.finishUp();
-      }
-    }
-    catch (InterruptedException e) {
-
-      Logging.connectors.error(e);
-
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    catch (java.net.SocketTimeoutException e) {
-
-      Logging.connectors.error(e);
-
-      handleIOException(e);
-    }
-    catch (InterruptedIOException e) {
-
-      Logging.connectors.error(e);
-
-      t.interrupt();
-      handleIOException(e);
-    }
-    catch (IOException e) {
-
-      Logging.connectors.error(e);
-
-      handleIOException(e);
-    }
-    catch (ResponseException e) {
-
-      Logging.connectors.error(e);
-
-      handleResponseException(e);
-    }
-  }
-
-  private static void handleIOException(IOException e)
-      throws ManifoldCFException, ServiceInterruption {
-    if (!(e instanceof java.net.SocketTimeoutException)
-        && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    Logging.connectors.warn("Amazons3: IO exception: " + e.getMessage(), e);
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: " + e.getMessage(), e,
-        currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
-  }
-
-  private static void handleResponseException(ResponseException e)
-      throws ManifoldCFException, ServiceInterruption {
-    throw new ManifoldCFException("Unexpected response: " + e.getMessage(),
-        e);
-  }
-
-  @Override
-  public void processDocuments(String[] documentIdentifiers,
-      IExistingVersions statuses, Specification spec,
-      IProcessActivity activities, int jobMode,
-      boolean usesDefaultAuthority) throws ManifoldCFException,
-      ServiceInterruption {
-    AmazonS3 amazons3Client = getClient();    
-    documentProcess.doProcessDocument(documentIdentifiers, statuses, spec,
-        activities, jobMode, usesDefaultAuthority, amazons3Client);
-
-  }
-
-  protected static class GetSeedsThread extends Thread {
-    protected Throwable exception = null;
-
-    protected String[] bucketsToBeRemoved;
-
-    protected AmazonS3 s3client = null;
-
-    protected XThreadBuffer<S3Artifact> seedBuffer;
-
-    public XThreadBuffer<S3Artifact> getBuffer() {
-      return seedBuffer;
-    }
-
-    public void setBuffer(XThreadBuffer<S3Artifact> buffer) {
-      this.seedBuffer = buffer;
-    }
-
-    public GetSeedsThread(AmazonS3 s3, String[] buckets) {
-      super();
-      this.bucketsToBeRemoved = buckets;
-      this.s3client = s3;
-      seedBuffer = new XThreadBuffer<S3Artifact>();
-      setDaemon(true);
-    }
-
-    @Override
-    public void run() {
-      try {
-        // push the keys for all documents
-        processSeeds();
-      }
-      catch (Exception e) {
-
-        Logging.connectors.error(e);
-        this.exception = e;
-      }
-      finally {
-        seedBuffer.signalDone();
-      }
-    }
-
-    private void processSeeds() {
-
-      if (s3client != null) {
-
-        List<Bucket> listBuckets = s3client.listBuckets();
-        List<String> refinedBuckets = new ArrayList<String>();
-        
-        for (Bucket bucket : listBuckets) {
-          if (bucketsToBeRemoved != null && bucketsToBeRemoved.length > 0 &&  !Arrays.asList(bucketsToBeRemoved).contains(
-              bucket.getName())) {
-            refinedBuckets.add(bucket.getName());
-          }
-          else{
-            refinedBuckets.add(bucket.getName());
-          }
-        }
-
-        for (String bucket : refinedBuckets) {
-          String bucketName = bucket;
-          try {
-            PushSeeds(bucketName);
-          }
-          catch (Exception e) {
-            Logging.connectors.error(e);
-          }
-        }
-
-      }
-      else {
-        Logging.connectors.info("Could not connect amazon");
-      }
-    }
-
-    private void PushSeeds(String bucketName) {
-      try {
-        ObjectListing objectListing = s3client
-            .listObjects(new ListObjectsRequest()
-                .withBucketName(bucketName));
-        for (S3ObjectSummary objectSummary : objectListing
-            .getObjectSummaries()) {
-          try {
-            addSeed(bucketName, objectSummary);
-          }
-          catch (Exception e) {
-
-            Logging.connectors.error(e);
-
-          }
-        }
-
-      }
-      catch (Exception e) {
-
-        Logging.connectors.error(e);
-      }
-    }
-
-    private void addSeed(String bucketName, S3ObjectSummary objectSummary)
-        throws InterruptedException {
-      String objectKey = objectSummary.getKey();
-      String combinedKey = bucketName + STD_SEPARATOR_BUCKET_AND_KEY
-          + objectKey;
-      // push the key
-      seedBuffer.add(new S3Artifact(bucketName, objectKey));
-
-      Logging.connectors
-          .info("Pused a new key(combined) in seed buffer : "
-              + combinedKey);
-    }
-
-    public void finishUp() throws InterruptedException, IOException,
-        ResponseException {
-      seedBuffer.abandon();
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException)
-          throw (IOException) thr;
-        else if (thr instanceof ResponseException)
-          throw (ResponseException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "
-              + thr.getClass().getName(), thr);
-      }
-    }
-
-  }
-
-  protected static class CheckThread extends Thread {
-    protected String result = "Unknown";
-
-    protected AmazonS3 s3 = null;
-
-    protected Throwable exception = null;
-
-    public CheckThread(AmazonS3 s3) {
-      this.s3 = s3;
-    }
-
-    public String getResult() {
-      return result;
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-
-    @Override
-    public void run() {
-      try {
-        if (s3 != null) {
-          Owner s3AccountOwner = s3.getS3AccountOwner();
-          if (s3AccountOwner != null) {
-            result = StringUtils.isNotEmpty(s3AccountOwner
-                .getDisplayName()) ? "Connection OK"
-                : "Connection Failed";
-          }
-
-        }
-      }
-      catch (AmazonServiceException e) {
-        result = "Connection Failed : " + e.getMessage();
-        exception = e;
-
-        Logging.connectors.error(e);
-      }
-      catch (AmazonClientException e) {
-        result = "Connection Failed : " + e.getMessage();
-        exception = e;
-
-        Logging.connectors.error(e);
-      }
-    }
-  }
-
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3DocumentProcessUtility.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3DocumentProcessUtility.java
deleted file mode 100644
index 2e6162a..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/AmazonS3DocumentProcessUtility.java
+++ /dev/null
@@ -1,122 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.amazons3.S3Artifact;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.tika.metadata.Metadata;
-
-import com.amazonaws.services.s3.model.CanonicalGrantee;
-import com.amazonaws.services.s3.model.Grant;
-import com.amazonaws.services.s3.model.Grantee;
-import com.amazonaws.services.s3.model.ObjectMetadata;
-
-public class AmazonS3DocumentProcessUtility {
-
-  public AmazonS3DocumentProcessUtility() {
-    super();
-  }
-
-  /**
-   * Get users has the the access the to artifact
-   * @param grants available for artifact
-   * @return
-   */
-  protected String[] getUsers(Set<Grant> grants) {
-    Set<String> users = new HashSet<String>();// no duplicates
-    for (Grant grant : grants) {
-      if (grant != null && grant.getGrantee() != null) {
-        Grantee grantee = grant.getGrantee();
-  
-        if (grantee instanceof CanonicalGrantee) {
-          users.add(((CanonicalGrantee) grantee).getDisplayName());
-        }
-        else {
-          users.add(grantee.getIdentifier());
-        }
-      }
-    }
-  
-    return users.toArray(new String[users.size()]);
-  }
-
-  /**
-   * Constructs document URI for s3artifact
-   * @param s3Artifact
-   * @return
-   */
-  protected String getDocumentURI(S3Artifact s3Artifact) {
-    return String.format(Locale.ROOT, AmazonS3Config.DOCUMENT_URI_FORMAT,
-        s3Artifact.getBucketName(), s3Artifact.getKey());
-  }
-
-  /**
-   * Adds available meta data to repository documetn
-   * @param rd repository document
-   * @param metadata2
-   * @throws ManifoldCFException
-   */
-  protected void addAllMetaData(RepositoryDocument rd, Metadata metadata2)
-      throws ManifoldCFException {
-        for (String field : metadata2.names()) {
-          rd.addField(field, metadata2.get(field));
-        }
-      }
-
-  /**
-   * Get the s3artifact (document) using the document identifier ( bucket,key)
-   * @param documentIdentifier
-   * @return
-   * @throws ManifoldCFException
-   */
-  protected S3Artifact getS3Artifact(String documentIdentifier) throws ManifoldCFException {
-    String key;
-    String bucketName = documentIdentifier
-        .split(AmazonS3Config.STD_SEPARATOR_BUCKET_AND_KEY)[0];
-    key = documentIdentifier.split(AmazonS3Config.STD_SEPARATOR_BUCKET_AND_KEY)[1];
-    if (StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(key))
-      throw new ManifoldCFException("bucket or key name is empty");
-  
-    return new S3Artifact(bucketName, key);
-  }
-
-  protected void addRawMetadata(RepositoryDocument rd, ObjectMetadata objectMetadata) {
-    Map<String, Object> rawMetadata = objectMetadata.getRawMetadata();
-  
-    for (Entry<String, Object> entry : rawMetadata.entrySet()) {
-      try {
-        String value = entry.getValue().toString();
-        String key = entry.getKey();
-        rd.addField(key, value);
-      }
-      catch (ManifoldCFException e) {
-        Logging.connectors.error("Error while adding metadata",e);
-      }
-    }
-  
-  }
-
-}
\ No newline at end of file
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/DocumentProcess.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/DocumentProcess.java
deleted file mode 100644
index 015c79e..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/DocumentProcess.java
+++ /dev/null
@@ -1,36 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-
-import com.amazonaws.services.s3.AmazonS3;
-
-public interface DocumentProcess {
-  
-
-  void doProcessDocument(String[] documentIdentifiers,
-      IExistingVersions statuses, Specification spec,
-      IProcessActivity activities, int jobMode,
-      boolean usesDefaultAuthority, AmazonS3 amazons3Client)
-      throws ManifoldCFException, ServiceInterruption;
-
-}
\ No newline at end of file
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/GenericDocumentProcess.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/GenericDocumentProcess.java
deleted file mode 100644
index c4cf4af..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/GenericDocumentProcess.java
+++ /dev/null
@@ -1,276 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.util.Date;
-import java.util.Set;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.amazons3.S3Artifact;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import com.amazonaws.AmazonClientException;
-import com.amazonaws.AmazonServiceException;
-import com.amazonaws.services.s3.AmazonS3;
-import com.amazonaws.services.s3.model.AccessControlList;
-import com.amazonaws.services.s3.model.GetObjectRequest;
-import com.amazonaws.services.s3.model.Grant;
-import com.amazonaws.services.s3.model.ObjectMetadata;
-import com.amazonaws.services.s3.model.S3Object;
-
-/**
- * Generic amazons3 extractor
- * @author Kuhajeyan
- *
- */
-public class GenericDocumentProcess extends AmazonS3DocumentProcessUtility
-    implements DocumentProcess {
-
-  private static final String TEXT_PLAIN = "text/plain";
-
-  /**
-   * Process documents with out any tika extractor
-   * @param documentIdentifiers
-   * @param statuses
-   * @param spec
-   * @param activities
-   * @param jobMode
-   * @param usesDefaultAuthority
-   * @param amazons3Client
-   * @throws ManifoldCFException
-   */
-  @Override
-  public void doProcessDocument(String[] documentIdentifiers,
-      IExistingVersions statuses, Specification spec,
-      IProcessActivity activities, int jobMode,
-      boolean usesDefaultAuthority, AmazonS3 amazons3Client)
-      throws ManifoldCFException, ServiceInterruption {
-    if (amazons3Client == null)
-      throw new ManifoldCFException(
-          "Amazon client can not connect at the moment");
-
-    for (String documentIdentifier : documentIdentifiers) {
-      try {
-        if (documentIdentifier == null
-            || StringUtils.isEmpty(documentIdentifier)) {
-          Logging.connectors
-              .warn("Document identifier is empty, document will not be processed");
-          continue;
-        }
-
-        String versionString;
-        String[] aclsToUse;
-
-        if (documentIdentifier
-            .split(AmazonS3Config.STD_SEPARATOR_BUCKET_AND_KEY) == null
-            && documentIdentifier.length() < 1) {
-          continue;
-        }
-
-        S3Artifact s3Artifact = getS3Artifact(documentIdentifier);
-        S3Object s3Obj = amazons3Client.getObject(new GetObjectRequest(
-            s3Artifact.getBucketName(), s3Artifact.getKey()));
-
-        if (s3Obj == null) {
-          // no such document in the bucket now
-          // delete document
-          activities.deleteDocument(documentIdentifier);
-          continue;
-        }
-
-        Logging.connectors.info("Content-Type: "
-            + s3Obj.getObjectMetadata().getContentType());
-        ObjectMetadata objectMetadata = s3Obj.getObjectMetadata();
-
-        Date lastModified = objectMetadata.getLastModified();
-        StringBuilder sb = new StringBuilder();
-        if (lastModified == null) {
-          // remove the content
-          activities.deleteDocument(documentIdentifier);
-          continue;
-        }
-
-        aclsToUse = new String[0];
-
-        AccessControlList objectAcl = amazons3Client.getObjectAcl(
-            s3Artifact.getBucketName(), s3Artifact.getKey());
-
-        Set<Grant> grants = objectAcl.getGrants();
-        String[] users = getUsers(grants);
-
-        aclsToUse = users;
-
-        sb.append(lastModified.toString());
-        versionString = sb.toString();
-
-        Logging.connectors.debug("version string : " + versionString);
-
-        if (versionString.length() > 0
-            && !activities.checkDocumentNeedsReindexing(
-                documentIdentifier, versionString)) {
-          Logging.connectors
-              .info("Document need not to be reindexed : "
-                  + documentIdentifier);
-          continue;
-        }
-
-        Logging.connectors
-            .debug("JIRA: Processing document identifier '"
-                + documentIdentifier + "'");
-
-        long startTime = System.currentTimeMillis();
-        String errorCode = null;
-        String errorDesc = null;
-        Long fileSize = null;
-
-        String mimeType = TEXT_PLAIN;// default
-        long fileLength = s3Obj.getObjectMetadata().getContentLength();
-
-        if (!activities.checkLengthIndexable(fileLength)) {
-          errorCode = activities.EXCLUDED_LENGTH;
-          errorDesc = "Excluded because of document length ("
-              + fileLength + ")";
-          activities.noDocument(documentIdentifier, versionString);
-          continue;
-        }
-
-        String documentURI = getDocumentURI(s3Artifact);
-        Logging.connectors.debug("document : " + documentURI);
-
-        if (!activities.checkURLIndexable(documentURI)) {
-          errorCode = activities.EXCLUDED_URL;
-          errorDesc = "Excluded because of URL ('" + documentURI
-              + "')";
-          activities.noDocument(documentIdentifier, versionString);
-          continue;
-        }
-
-        if (!activities.checkMimeTypeIndexable(mimeType)) {
-          errorCode = activities.EXCLUDED_MIMETYPE;
-          errorDesc = "Excluded because of mime type ('" + mimeType
-              + "')";
-          activities.noDocument(documentIdentifier, versionString);
-          continue;
-        }
-
-        if (!activities.checkDateIndexable(lastModified)) {
-          errorCode = activities.EXCLUDED_DATE;
-          errorDesc = "Excluded because of date (" + lastModified
-              + ")";
-          activities.noDocument(documentIdentifier, versionString);
-          continue;
-        }
-
-        InputStream in = null;
-        try {
-
-          in = s3Obj.getObjectContent();
-
-          // otherwise process
-          RepositoryDocument rd = new RepositoryDocument();
-          addRawMetadata(rd, objectMetadata);
-          // Turn into acls and add into
-          // description
-          String[] denyAclsToUse;
-          if (aclsToUse.length > 0)
-            denyAclsToUse = new String[] { AmazonS3Connector.GLOBAL_DENY_TOKEN };
-          else
-            denyAclsToUse = new String[0];
-          rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,
-              aclsToUse, denyAclsToUse);
-
-          rd.setMimeType(mimeType);
-
-          if (lastModified != null)
-            rd.setModifiedDate(lastModified);
-
-          // assign the stream
-          rd.setBinary(in, fileLength);
-          activities.ingestDocumentWithException(documentIdentifier,
-              versionString, documentURI, rd);
-
-          errorCode = "OK";
-          fileSize = new Long(fileLength);
-        }
-        catch (IOException e1) {
-          handleIOException(e1);
-        }
-        finally {
-          // close input stream
-          if (in != null)
-            IOUtils.closeQuietly(in);
-        }
-
-      }
-      catch (AmazonServiceException e) {
-        handleServiceException(e);
-      }
-      catch (AmazonClientException e) {
-        handleClientException(e);
-      }
-    }
-
-  }
-
-  protected static void handleIOException(final IOException e)
-      throws ManifoldCFException, ServiceInterruption {
-    Logging.connectors.error("Error while copying stream", e);
-    if (!(e instanceof java.net.SocketTimeoutException)
-        && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: " + e.getMessage(), e,
-        currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
-  }
-
-  protected static void handleServiceException(final AmazonServiceException e)
-      throws ManifoldCFException, ServiceInterruption {
-    Logging.connectors.error("Service exception status : " + e.getStatusCode(),e);
-    
-    if (!e.isRetryable()) {
-      throw new ManifoldCFException("Amazon service exception: "
-          + e.getMessage(), e.getCause());
-    }
-    
-    throw new ServiceInterruption(e.getMessage(), System.currentTimeMillis()+300000L);
-  }
-
-  protected static void handleClientException(final AmazonClientException e)
-      throws ManifoldCFException, ServiceInterruption {
-    Logging.connectors.error(e);
-    if (!e.isRetryable()) {
-      throw new ManifoldCFException("Amazon client exception: "
-          + e.getMessage(), e.getCause());
-    }
-
-    throw new ServiceInterruption(e.getMessage(), System.currentTimeMillis()+300000L);
-  }
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/Messages.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/Messages.java
deleted file mode 100644
index b43a10a..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/Messages.java
+++ /dev/null
@@ -1,144 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-
-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.crawler.connectors.amazons3.common";
-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.amazons3";
-
-  protected Messages() {
-  }
-
-  public static String getString(Locale locale, String messageKey) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale,
-      String messageKey) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale,
-        messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale,
-      String messageKey) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey,
-        null);
-  }
-
-  public static String getString(Locale locale, String messageKey,
-      Object[] args) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey,
-      Object[] args) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey,
-      Object[] args) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale,
-      String messageKey, Object[] args) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale,
-        messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale,
-      String messageKey, Object[] args) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey,
-        args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be
-  // specified.
-
-  public static String getString(String bundleName, Locale locale,
-      String messageKey, Object[] args) {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale,
-      String messageKey, Object[] args) {
-    return getAttributeString(Messages.class, bundleName, locale,
-        messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale,
-      String messageKey, Object[] args) {
-    return getBodyString(Messages.class, bundleName, locale, messageKey,
-        args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName,
-      Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale,
-        messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName,
-      Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(Messages.class, bundleName, locale,
-        messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale,
-      String resourceKey, Map<String, String> substitutionParameters,
-      boolean mapToUpperCase) throws ManifoldCFException {
-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale,
-        resourceKey, substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output,
-      Locale locale, String resourceKey,
-      Map<String, String> substitutionParameters, boolean mapToUpperCase)
-      throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME,
-        DEFAULT_PATH_NAME, locale, resourceKey, substitutionParameters,
-        mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output,
-      Locale locale, String resourceKey,
-      Map<String, Object> contextObjects) throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME,
-        DEFAULT_PATH_NAME, locale, resourceKey, contextObjects);
-  }
-}
diff --git a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/ResponseException.java b/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/ResponseException.java
deleted file mode 100644
index e84a592..0000000
--- a/connectors/amazons3/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/amazons3/ResponseException.java
+++ /dev/null
@@ -1,32 +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 org.apache.manifoldcf.crawler.connectors.amazons3;
-
-/**
- * @author Kuhajeyan
- *
- */
-public class ResponseException extends Exception {
-
-  public ResponseException(String msg) {
-    super(msg);
-  }
-
-  public ResponseException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-}
diff --git a/connectors/amazons3/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/amazons3/common_en_US.properties b/connectors/amazons3/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/amazons3/common_en_US.properties
deleted file mode 100644
index ee1b744..0000000
--- a/connectors/amazons3/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/amazons3/common_en_US.properties
+++ /dev/null
@@ -1,52 +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.
-
-Amazons3AuthorityConnector.Proxy=Proxy
-Amazons3AuthorityConnector.Server=Server
-Amazons3AuthorityConnector.Amazons3Security=Security
-
-Amazons3AuthorityConnector.Amazons3ProxyPortColon=Port:
-Amazons3AuthorityConnector.Amazons3ProxyHostColon=Host:
-Amazons3AuthorityConnector.Amazons3ProxyDomainColon=Domain:
-Amazons3AuthorityConnector.Amazons3ProxyUsernameColon=UserName:
-Amazons3AuthorityConnector.Amazons3ProxyPasswordColon=Password:
-
-
-Amazons3AuthorityConnector.Amazons3ProtocolColon=Protocol:
-Amazons3AuthorityConnector.Amazons3HostColon=Host:
-Amazons3AuthorityConnector.Amazons3PortColon=Port:
-Amazons3AuthorityConnector.AwsAccessKeyColon=Access Key:
-Amazons3AuthorityConnector.AwsSecretKeyColon=Secret Key:
-
-
-Amazons3AuthorityConnector.Amazons3HostMustNotIncludeSlash=Host should not include slash
-Amazons3AuthorityConnector.Amazons3HostMustNotIncludeSlash=Host should not include slash
-Amazons3AuthorityConnector.Amazons3PortMustBeAnInteger=Port value should be an integer
-
-Amazons3AuthorityConnector.Amazons3ProxyPortMustBeAnInteger=Port value should be an integer
-Amazons3AuthorityConnector.Amazons3ProxyHostMustNotIncludeSlash=Host should not include slash
-
-Amazons3AuthorityConnector.Amazons3HostMustNotBeNull=Host value should not be null
-Amazons3AuthorityConnector.Amazons3PortMustBeAnInteger=Port value should be an integer
-Amazons3AuthorityConnector.Amazons3AccessKeyShouldNotBeNull=Access key should not be null
-Amazons3AuthorityConnector.Amazons3SecretKeyShouldNotBeNull=Secret key should not be null
-
-Amazons3AuthorityConnector.Amazons3Buckets=Exclude Buckets 
-Amazons3AuthorityConnector.Amazons3BucketsColon=Exclude Buckets:
-Amazons3AuthorityConnector.Amazons3BucketsCannotBeNull=Amazon s3 buckets can not be null
-
-
-
-
diff --git a/connectors/amazons3/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/amazons3/common_en_US.properties b/connectors/amazons3/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/amazons3/common_en_US.properties
deleted file mode 100644
index 0d1eaf8..0000000
--- a/connectors/amazons3/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/amazons3/common_en_US.properties
+++ /dev/null
@@ -1,52 +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.
-
-Amazons3RepositoryConnector.Proxy=Proxy
-Amazons3RepositoryConnector.Server=Server
-Amazons3RepositoryConnector.Amazons3Security=Security
-
-Amazons3RepositoryConnector.Amazons3ProxyPortColon=Port:
-Amazons3RepositoryConnector.Amazons3ProxyHostColon=Host:
-Amazons3RepositoryConnector.Amazons3ProxyDomainColon=Domain:
-Amazons3RepositoryConnector.Amazons3ProxyUsernameColon=UserName:
-Amazons3RepositoryConnector.Amazons3ProxyPasswordColon=Password:
-
-
-Amazons3RepositoryConnector.Amazons3ProtocolColon=Protocol:
-Amazons3RepositoryConnector.Amazons3HostColon=Host:
-Amazons3RepositoryConnector.Amazons3PortColon=Port:
-Amazons3RepositoryConnector.AwsAccessKeyColon=Access Key:
-Amazons3RepositoryConnector.AwsSecretKeyColon=Secret Key:
-
-
-Amazons3RepositoryConnector.Amazons3HostMustNotIncludeSlash=Host should not include slash
-Amazons3RepositoryConnector.Amazons3HostMustNotIncludeSlash=Host should not include slash
-Amazons3RepositoryConnector.Amazons3PortMustBeAnInteger=Port value should be an integer
-
-Amazons3RepositoryConnector.Amazons3ProxyPortMustBeAnInteger=Port value should be an integer
-Amazons3RepositoryConnector.Amazons3ProxyHostMustNotIncludeSlash=Host should not include slash
-
-Amazons3RepositoryConnector.Amazons3HostMustNotBeNull=Host value should not be null
-Amazons3RepositoryConnector.Amazons3PortMustBeAnInteger=Port value should be an integer
-Amazons3RepositoryConnector.Amazons3AccessKeyShouldNotBeNull=Access key should not be null
-Amazons3RepositoryConnector.Amazons3SecretKeyShouldNotBeNull=Secret key should not be null
-
-Amazons3RepositoryConnector.Amazons3Buckets=Exclude Buckets 
-Amazons3RepositoryConnector.Amazons3BucketsColon=Exclude Buckets:
-Amazons3RepositoryConnector.Amazons3BucketsCannotBeNull=Amazon s3 buckets can not be null
-
-
-
-
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3.js b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3.js
deleted file mode 100644
index 682e908..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3.js
+++ /dev/null
@@ -1,63 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{ 
-  
-  if (editconnection.amazons3_proxy_port.value != "" && !isInteger(editconnection.amazons3_proxy_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyPortMustBeAnInteger'))");
-    editconnection.amazons3_proxy_port.focus();
-    return false;
-  }
-
-  if (editconnection.amazons3_proxy_host.value != "" && editconnection.amazons3_proxy_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyHostMustNotIncludeSlash'))");
-    editconnection.amazons3_proxy_host.focus();
-    return false;
-  }
-  
-  return true;
-}
-
-function checkConfigForSave()
-{
-  
-  
-  if (editconnection.aws_access_key.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3AccessKeyShouldNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Server'))");
-    editconnection.aws_access_key.focus();
-    return false;
-  }
-  
-  if (editconnection.aws_secret_key.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3SecretKeyShouldNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Server'))");
-    editconnection.aws_secret_key.focus();
-    return false;
-  }
-  
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3_proxy.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3_proxy.html
deleted file mode 100644
index 8d0fb8c..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3_proxy.html
+++ /dev/null
@@ -1,78 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('Amazons3AuthorityConnector.Proxy'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="amazons3_proxy_host" name="amazons3_proxy_host" value="$Encoder.attributeEscape($AMAZONS3_PROXY_HOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="amazons3_proxy_port" name="amazons3_proxy_port" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PORT)" />
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="amazons3_proxy_domain" name="amazons3_proxy_domain" value="$Encoder.attributeEscape($AMAZONS3_PROXY_DOMAIN)" />
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="amazons3_proxy_username" name="amazons3_proxy_username" value="$Encoder.attributeEscape($AMAZONS3_PROXY_USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="amazons3_proxy_pwd" name="amazons3_proxy_pwd" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PWD)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="amazons3_proxy_host" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PORT)" />
-<input type="hidden" name="amazons3_proxy_port" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PORT)" />
-<input type="hidden" name="amazons3_proxy_domain" value="$Encoder.attributeEscape($AMAZONS3_PROXY_DOMAIN)" />
-<input type="hidden" name="amazons3_proxy_username" value="$Encoder.attributeEscape($AMAZONS3_PROXY_USERNAME)" />
-<input type="hidden" name="amazons3_proxy_pwd" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PWD)" />
-
-#end
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3_server.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3_server.html
deleted file mode 100644
index 2fc28ba..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/editConfiguration_amazons3_server.html
+++ /dev/null
@@ -1,53 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('Amazons3AuthorityConnector.Server'))
-
-<table class="displaytable">
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.AwsAccessKeyColon'))</nobr>
-		</td>
-		<td class="value"><input size="16" type="text"
-			id="aws_access_key" name="aws_access_key"
-			value="$Encoder.attributeEscape($AMAZONS3_AWS_ACCESS_KEY)" /></td>
-	</tr>
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.AwsSecretKeyColon'))</nobr>
-		</td>
-		<td class="value"><input size="16" type="password"
-			id="aws_secret_key" name="aws_secret_key"
-			value="$Encoder.attributeEscape($AMAZONS3_AWS_SECRET_KEY)" /></td>
-	</tr>
-</table>
-
-#else
-
-
-
-<input type="hidden" name="aws_access_key"
-	value="$Encoder.attributeEscape($AMAZONS3_AWS_ACCESS_KEY)" />
-<input type="hidden" name="aws_secret_key"
-	value="$Encoder.attributeEscape($AMAZONS3_AWS_SECRET_KEY)" />
-
-#end
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/viewConfiguration_amazons3.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/viewConfiguration_amazons3.html
deleted file mode 100644
index 3b794ef..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/amazons3/viewConfiguration_amazons3.html
+++ /dev/null
@@ -1,80 +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.
--->
-
-
-
- <table class="displaytable">
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.AwsAccessKeyColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_AWS_ACCESS_KEY)</nobr>
-		</td>
-	</tr>
-	
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.AwsSecretKeyColon'))</nobr>
-		</td>
-		<td class="value"><nobr>********</nobr></td>
-	</tr>
-
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyHostColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_HOST)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyPortColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_PORT)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyDomainColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_DOMAIN)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyUsernameColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_USERNAME)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3AuthorityConnector.Amazons3ProxyPasswordColon'))</nobr>
-		</td>
-		<td class="value"><nobr>********</nobr></td>
-	</tr>
-	
-
-	
-</table>
-
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3.js b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3.js
deleted file mode 100644
index 7681606..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3.js
+++ /dev/null
@@ -1,63 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{	
-	
-	if (editconnection.amazons3_proxy_port.value != "" && !isInteger(editconnection.amazons3_proxy_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyPortMustBeAnInteger'))");
-    editconnection.amazons3_proxy_port.focus();
-    return false;
-  }
-
-  if (editconnection.amazons3_proxy_host.value != "" && editconnection.amazons3_proxy_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyHostMustNotIncludeSlash'))");
-    editconnection.amazons3_proxy_host.focus();
-    return false;
-  }
-  
-  return true;
-}
-
-function checkConfigForSave()
-{
-  
-  
-  if (editconnection.aws_access_key.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3AccessKeyShouldNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Server'))");
-    editconnection.aws_access_key.focus();
-    return false;
-  }
-  
-  if (editconnection.aws_secret_key.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3SecretKeyShouldNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Server'))");
-    editconnection.aws_secret_key.focus();
-    return false;
-  }
-  
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3_proxy.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3_proxy.html
deleted file mode 100644
index 6abd427..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3_proxy.html
+++ /dev/null
@@ -1,78 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('Amazons3RepositoryConnector.Proxy'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="amazons3_proxy_host" name="amazons3_proxy_host" value="$Encoder.attributeEscape($AMAZONS3_PROXY_HOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="amazons3_proxy_port" name="amazons3_proxy_port" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PORT)" />
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="amazons3_proxy_domain" name="amazons3_proxy_domain" value="$Encoder.attributeEscape($AMAZONS3_PROXY_DOMAIN)" />
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="amazons3_proxy_username" name="amazons3_proxy_username" value="$Encoder.attributeEscape($AMAZONS3_PROXY_USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="amazons3_proxy_pwd" name="amazons3_proxy_pwd" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PWD)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="amazons3_proxy_host" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PORT)" />
-<input type="hidden" name="amazons3_proxy_port" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PORT)" />
-<input type="hidden" name="amazons3_proxy_domain" value="$Encoder.attributeEscape($AMAZONS3_PROXY_DOMAIN)" />
-<input type="hidden" name="amazons3_proxy_username" value="$Encoder.attributeEscape($AMAZONS3_PROXY_USERNAME)" />
-<input type="hidden" name="amazons3_proxy_pwd" value="$Encoder.attributeEscape($AMAZONS3_PROXY_PWD)" />
-
-#end
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3_server.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3_server.html
deleted file mode 100644
index aadcaa5..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editConfiguration_amazons3_server.html
+++ /dev/null
@@ -1,58 +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.
--->
-
-#if($TabName ==
-$ResourceBundle.getString('Amazons3RepositoryConnector.Server'))
-
-<table class="displaytable">
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-
-
-
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.AwsAccessKeyColon'))</nobr>
-		</td>
-		<td class="value"><input size="16" type="text"
-			id="aws_access_key" name="aws_access_key"
-			value="$Encoder.attributeEscape($AMAZONS3_AWS_ACCESS_KEY)" /></td>
-	</tr>
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.AwsSecretKeyColon'))</nobr>
-		</td>
-		<td class="value"><input size="16" type="password"
-			id="aws_secret_key" name="aws_secret_key"
-			value="$Encoder.attributeEscape($AMAZONS3_AWS_SECRET_KEY)" /></td>
-	</tr>
-</table>
-
-#else
-
-
-
-<input type="hidden" name="aws_access_key"
-	value="$Encoder.attributeEscape($AMAZONS3_AWS_ACCESS_KEY)" />
-<input type="hidden" name="aws_secret_key"
-	value="$Encoder.attributeEscape($AMAZONS3_AWS_SECRET_KEY)" />
-
-#end
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editSpecification_amazons3.js b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editSpecification_amazons3.js
deleted file mode 100644
index b0aa4e9..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editSpecification_amazons3.js
+++ /dev/null
@@ -1,24 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-
-
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editSpecification_buckets.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editSpecification_buckets.html
deleted file mode 100644
index 1351319..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/editSpecification_buckets.html
+++ /dev/null
@@ -1,41 +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.
--->
-
-
-#if($TabName == $ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3Buckets') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3BucketsColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <nobr>
-        <input type="text" size="50" name="s${SeqNum}_s3buckets" value="$Encoder.attributeEscape($AMAZONS3BUCKETS)" />
-      </nobr>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SeqNum}_s3buckets" value="$Encoder.attributeEscape($AMAZONS3BUCKETS)" />
-
-#end
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/viewConfiguration_amazons3.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/viewConfiguration_amazons3.html
deleted file mode 100644
index 32be5f7..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/viewConfiguration_amazons3.html
+++ /dev/null
@@ -1,76 +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.
--->
-
-<table class="displaytable">
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.AwsAccessKeyColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_AWS_ACCESS_KEY)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.AwsSecretKeyColon'))</nobr>
-		</td>
-		<td class="value"><nobr>********</nobr></td>
-	</tr>
-
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyHostColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_HOST)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyPortColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_PORT)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="separator" colspan="2"><hr /></td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyDomainColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_DOMAIN)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyUsernameColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3_PROXY_USERNAME)</nobr>
-		</td>
-	</tr>
-
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3ProxyPasswordColon'))</nobr>
-		</td>
-		<td class="value"><nobr>********</nobr></td>
-	</tr>
-
-</table>
-
diff --git a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/viewSpecification_amazons3.html b/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/viewSpecification_amazons3.html
deleted file mode 100644
index 7230d6a..0000000
--- a/connectors/amazons3/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/amazons3/viewSpecification_amazons3.html
+++ /dev/null
@@ -1,25 +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.
--->
-
-<table class="displaytable">
-	<tr>
-		<td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('Amazons3RepositoryConnector.Amazons3BucketsColon'))</nobr>
-		</td>
-		<td class="value"><nobr>$Encoder.bodyEscape($AMAZONS3BUCKETS)</nobr>
-		</td>
-	</tr>
-</table>
diff --git a/connectors/amazons3/pom.xml b/connectors/amazons3/pom.xml
deleted file mode 100644
index c158ad1..0000000
--- a/connectors/amazons3/pom.xml
+++ /dev/null
@@ -1,395 +0,0 @@
-<?xml version="1.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.
--->
-
-<project
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <packaging>jar</packaging>
-  <artifactId>mcf-amazons3-connector</artifactId>
-  <name>ManifoldCF - Connectors - Amazon S3</name>
-  <groupId>org.apache.manifoldcf</groupId>
-
-  <developers>
-    <developer>
-      <name>Gunaratnam Kuhajeyan</name>
-      <organization></organization>
-      <organizationUrl></organizationUrl>
-      <url>kuhajeyan.blogspot.com</url>
-    </developer>
-  </developers>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <project.http.version>1.14.1-beta</project.http.version>
-    <project.oauth.version>1.14.1-beta</project.oauth.version>
-    <aws-java-sdk.version>1.9.0</aws-java-sdk.version>
-    <json.simple.version>1.1</json.simple.version>
-  </properties>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-          <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-          <execution>
-            <id>native2ascii-utf8</id>
-            <goals>
-              <goal>native2ascii</goal>
-            </goals>
-            <configuration>
-              <encoding>UTF8</encoding>
-              <includes>
-                <include>**/*.properties</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>${commons-lang.version}</version>
-      <type>jar</type>
-    </dependency>
-
-    <!-- Testing dependencies -->
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.amazonaws</groupId>
-      <artifactId>aws-java-sdk-s3</artifactId>
-      <version>${aws-java-sdk.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.amazonaws</groupId>
-      <artifactId>aws-java-sdk-core</artifactId>
-      <version>${aws-java-sdk.version}</version>
-    </dependency>
-    
-  </dependencies>
-</project>
diff --git a/connectors/cmis/.gitignore b/connectors/cmis/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/connectors/cmis/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/connectors/cmis/build.xml b/connectors/cmis/build.xml
deleted file mode 100644
index a1e610c..0000000
--- a/connectors/cmis/build.xml
+++ /dev/null
@@ -1,129 +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.
--->
-
-<project name="cmis" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-    
-    <property name="chemistry.version" value="1.1.0"/>
-    
-    <target name="download-dependencies">
-        <property name="chemistry-package" value="org/apache/chemistry/opencmis"/>
-        <antcall target="download-via-maven"><param name="project-path" value="${chemistry-package}"/><param name="artifact-version" value="${chemistry.version}"/><param name="target" value="test-materials"/>
-            <param name="artifact-name" value="chemistry-opencmis-server-inmemory"/>
-            <param name="artifact-type" value="war"/>
-        </antcall>
-    </target>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="test-materials" excludes="README*.txt"/>
-        </delete>
-    </target>
-
-    <target name="calculate-testcode-condition">
-        <available file="test-materials/chemistry-opencmis-server-inmemory-${chemistry.version}.war" property="tests-present"/>
-    </target>
-
-    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present">
-        <echo message="Need Apache Chemistry in-memory war download in order to run tests - run ant make-deps"/>
-    </target>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="chemistry*.jar"/>
-            <include name="stax*.jar"/>
-            <include name="streambuffer*.jar"/>
-            <include name="jaxb*.jar"/>
-            <include name="jaxws*.jar"/>
-            <include name="woodstox-core-asl*.jar"/>
-            <include name="mimepull*.jar"/>
-            <include name="resolver*.jar"/>
-            <include name="org.osgi.core*.jar"/>
-            <!-- include name="commons-lang*.jar"/ -->
-        	  <include name="joda*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="chemistry*.jar"/>
-                <include name="stax*.jar"/>
-                <include name="streambuffer*.jar"/>
-                <include name="jaxb*.jar"/>
-                <include name="jaxws*.jar"/>
-                <include name="woodstox-core-asl*.jar"/>
-                <include name="mimepull*.jar"/>
-                <include name="resolver*.jar"/>
-                <include name="org.osgi.core*.jar"/>
-                <include name="joda*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="CMIS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="CMIS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.cmis.CmisAuthorityConnector"/>
-        </antcall>
-    </target>
-
-    <target name="run-IT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="256m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <jvmarg value="-DopenCmisServerWarPath=../test-materials/chemistry-opencmis-server-inmemory-${chemistry.version}.war"/>
-            <jvmarg value="-Xms128m"/>
-            <jvmarg value="-Xmx256m"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-</project>
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/cmis/CmisAuthorityConnector.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/cmis/CmisAuthorityConnector.java
deleted file mode 100644
index b908de4..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/cmis/CmisAuthorityConnector.java
+++ /dev/null
@@ -1,413 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.authorities.authorities.cmis;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Locale;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.core.interfaces.CacheManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ICacheCreateHandle;
-import org.apache.manifoldcf.core.interfaces.ICacheDescription;
-import org.apache.manifoldcf.core.interfaces.ICacheHandle;
-import org.apache.manifoldcf.core.interfaces.ICacheManager;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.StringSet;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.ui.util.Encoder;
-
-/**
- * 
- * The CMIS Authority Connector is based only on a regular expression checker, because the CMIS specification 
- * (and the Apache Chemistry implementation) doesn't have any exposed method to get info about users.
- * 
- * For the configuration we can assume that we could have different users for any CMIS repository that 
- * could have the same endpoint. That's why for this connector is required the Repository ID.
- * 
- * @author Piergiorgio Lucidi
- * 
- */
-public class CmisAuthorityConnector extends BaseAuthorityConnector {
-
-  public static final String CONFIG_PARAM_USERNAME = "username";
-  public static final String CONFIG_PARAM_PASSWORD = "password";
-  public static final String CONFIG_PARAM_ENDPOINT = "endpoint";
-  public static final String CONFIG_PARAM_REPOSITORY_ID = "repositoryId";
-  
-  protected static final String CONFIG_PARAM_USERNAME_REGEXP = "usernameregexp";
-  protected static final String CONFIG_PARAM_USER_TRANSLATION = "usertranslation";
-  
-  private static final String DEFAULT_VALUE_ENDPOINT = "http://localhost:8080/cmis/";
-  private static final String DEFAULT_VALUE_REPOSITORY_ID = "uuid";
-
-  protected String endpoint = null;
-  protected String repositoryId = null;
-
-  protected Map<String, String> parameters = new HashMap<String, String>();
-  
-  /** The cache manager. */
-  protected ICacheManager cacheManager = null;
-  
-  protected static long responseLifetime = 60000L;
-  protected static int LRUsize = 1000;
-  protected static StringSet emptyStringSet = new StringSet();
-  
-  /** This is the active directory global deny token.  This should be ingested with all documents. */
-  public static final String GLOBAL_DENY_TOKEN = "DEAD_AUTHORITY";
-  
-  /** Unreachable CMIS */
-  private static final AuthorizationResponse unreachableResponse = new AuthorizationResponse(
-    new String[]{GLOBAL_DENY_TOKEN},AuthorizationResponse.RESPONSE_UNREACHABLE);
-  
-  /** User not found */
-  private static final AuthorizationResponse userNotFoundResponse = new AuthorizationResponse(
-    new String[]{GLOBAL_DENY_TOKEN},AuthorizationResponse.RESPONSE_USERNOTFOUND);
-
-  /** Set thread context.
-   */
-   @Override
-   public void setThreadContext(IThreadContext tc)
-     throws ManifoldCFException {
-     super.setThreadContext(tc);
-     cacheManager = CacheManagerFactory.make(tc);
-   }
-   
-   /** Clear thread context.
-   */
-   @Override
-   public void clearThreadContext() {
-     super.clearThreadContext();
-     cacheManager = null;
-   }
-  
-  public CmisAuthorityConnector() {
-    super();
-  }
-  
-  
-  /**
-   * Output the configuration body section. This method is called in the body
-   * section of the authority connector's configuration page. Its purpose is to
-   * present the required form elements for editing. The coder can presume that
-   * the HTML that is output from this configuration will be within appropriate
-   * <html>, <body>, and <form> tags. The name of the form is "editconnection".
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @param tabName
-   *          is the current tab name.
-   */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-
-    String endpoint = parameters.getParameter(CONFIG_PARAM_ENDPOINT);
-    String repositoryId = parameters.getParameter(CONFIG_PARAM_REPOSITORY_ID);
-    
-    if(StringUtils.isEmpty(endpoint))
-      endpoint = DEFAULT_VALUE_ENDPOINT;
-    if(StringUtils.isEmpty(repositoryId))
-      repositoryId = DEFAULT_VALUE_REPOSITORY_ID;
-    
-    if (tabName.equals(Messages.getString(locale,"CmisAuthorityConnector.Repository")))
-    {
-    out.print("<table class=\"displaytable\">\n"
-        + "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n");
-    out.print("<tr><td class=\"description\"><nobr>" + Messages.getBodyString(locale,"CmisAuthorityConnector.Endpoint") + "</nobr></td>" +
-        "<td class=\"value\"><input type=\"text\" name=\""
-        + CONFIG_PARAM_ENDPOINT + "\" value=\""+Encoder.attributeEscape(endpoint)+"\" size=\"50\"/></td></tr>\n");
-    out.print("<tr><td class=\"description\"><nobr>" + Messages.getBodyString(locale,"CmisAuthorityConnector.RepositoryID") + "</nobr></td>" +
-        "<td class=\"value\"><input type=\"text\" name=\""
-        + CONFIG_PARAM_REPOSITORY_ID + "\" value=\""+Encoder.attributeEscape(repositoryId)+"\"/></td></tr>\n");
-    out.print("</table>\n");
-    }
-    else
-    {
-      out.print("<input type=\"hidden\" name=\""+CONFIG_PARAM_ENDPOINT+"\" value=\""+Encoder.attributeEscape(endpoint)+"\"/>\n");
-      out.print("<input type=\"hidden\" name=\""+CONFIG_PARAM_REPOSITORY_ID+"\" value=\""+Encoder.attributeEscape(repositoryId)+"\"/>\n");
-    }
-    
-  }
-
-  /**
-   * Output the configuration header section. This method is called in the head
-   * section of the connector's configuration page. Its purpose is to add the
-   * required tabs to the list, and to output any javascript methods that might
-   * be needed by the configuration editing HTML.
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @param tabsArray
-   *          is an array of tab names. Add to this array any tab names that are
-   *          specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    
-    tabsArray.add(Messages.getString(locale,"CmisAuthorityConnector.Repository"));
-    
-    out.print("<script type=\"text/javascript\">\n" + "<!--\n"
-        + "function checkConfig()\n" + "{\n"
-        + "  if (editconnection.endpoint.value == \"\")\n" + "  {\n"
-        + "    alert(\"" + Messages.getBodyJavascriptString(locale,"CmisAuthorityConnector.TheEndpointMustBeNotNull") + "\");\n"
-        + "    editconnection.endpoint.focus();\n" + "    return false;\n"
-        + "  }\n" + "\n" + "  return true;\n" + "}\n" + " \n"
-        + "function checkConfigForSave()\n" + "{\n"
-        + "  if (editconnection.endpoint.value == \"\")\n" + "  {\n"
-        + "    alert(\"" + Messages.getBodyJavascriptString(locale,"CmisAuthorityConnector.TheEndpointMustBeNotNull") + "\");\n"
-        + "    editconnection.endpoint.focus();\n" + "    return false;\n"
-        + "  }\n" + "  if (editconnection.repositoryId.value == \"\")\n" + "  {\n"
-        + "    alert(\"" + Messages.getBodyJavascriptString(locale,"CmisAuthorityConnector.TheRepositoryIDMustBeNotNull") + "\");\n"
-        + "    editconnection.repositoryId.focus();\n" + "    return false;\n"
-        + "  }\n" + "  return true;\n" + "}\n" + "\n" + "//-->\n"
-        + "</script>\n");
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param variableContext
-   *          is the set of variables available from the post, including binary
-   *          file post information.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @return null if all is well, or a string error message if there is an error
-   *         that should prevent saving of the connection (and cause a
-   *         redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException {
-
-    //Repository
-    String endpoint = variableContext.getParameter(CONFIG_PARAM_ENDPOINT);
-    if (StringUtils.isNotEmpty(endpoint) && endpoint.length() > 0)
-      parameters.setParameter(CONFIG_PARAM_ENDPOINT, endpoint);
-
-    String repositoryId = variableContext
-        .getParameter(CONFIG_PARAM_REPOSITORY_ID);
-    if (StringUtils.isNotEmpty(repositoryId))
-      parameters.setParameter(CONFIG_PARAM_REPOSITORY_ID, repositoryId);
-    
-    return null;
-
-  }
-  
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML that
-   * is output from this configuration will be within appropriate <html> and
-   * <body> tags.
-   * 
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    out.print("<table class=\"displaytable\">\n"
-        + "  <tr>\n"
-        + "    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"CmisAuthorityConnector.Parameters") + "</nobr></td>\n"
-        + "    <td class=\"value\" colspan=\"3\">\n");
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext()) {
-      String param = (String) iter.next();
-      String value = parameters.getParameter(param);
-        out.print("      <nobr>"
-            + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param) + "="
-            + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)
-            + "</nobr><br/>\n");
-    }
-    out.print("</td>\n" + "  </tr>\n" + "</table>\n");
-  }
-  
-  /** Obtain the default access tokens for a given user name.
-   *@param userName is the user name or identifier.
-   *@return the default response tokens, presuming that the connect method fails.
-   */
-   @Override
-   public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-   {
-     return unreachableResponse;
-   }
-   
-   /** Uncached version of the getAuthorizationResponse method.
-    *@param userName is the user name or identifier.
-    *@return the response tokens (according to the current authority).
-    * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-    */
-    protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-      throws ManifoldCFException
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("CMIS: Calculating response access tokens for user '"+userName+"'");
-
-      // Map the user to the final value
-      String verifiedUserName = userName;
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("CMIS: Mapped user name is '"+verifiedUserName+"'");
-      
-      String[] tokens = new String[1];
-      tokens[0] = verifiedUserName;
-      return new AuthorizationResponse(tokens,AuthorizationResponse.RESPONSE_OK);
-
-    }
-  
-  /** Obtain the access tokens for a given user name.
-   *@param userName is the user name or identifier.
-   *@return the response tokens (according to the current authority).
-   * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-   */
-   @Override
-   public AuthorizationResponse getAuthorizationResponse(String userName)
-     throws ManifoldCFException
-   {
-     if (Logging.connectors.isDebugEnabled())
-       Logging.connectors.debug("CMIS: Received request for user '"+userName+"'");
-     
-     ICacheDescription objectDescription = new AuthorizationResponseDescription(userName,endpoint,repositoryId);
-     
-     // Enter the cache
-     ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-     try
-     {
-       ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-       try
-       {
-         // Lookup the object
-         AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-         if (response != null)
-           return response;
-         // Create the object.
-         response = getAuthorizationResponseUncached(userName);
-         // Save it in the cache
-         cacheManager.saveObject(createHandle,objectDescription,response);
-         // And return it...
-         return response;
-       }
-       finally
-       {
-         cacheManager.leaveCreateSection(createHandle);
-       }
-     }
-     finally
-     {
-       cacheManager.leaveCache(ch);
-     }
-   }
-   
-   /** This is the cache object descriptor for cached access tokens from
-    * this connector.
-    */
-    protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-    {
-      /** The user name associated with the access tokens */
-      protected final String userName;
-      /** The repository endpoint */
-      protected final String endpoint;
-      /** The repository id */
-      protected final String repositoryId;
-      /** The expiration time */
-      protected long expirationTime = -1;
-      
-      /** Constructor. */
-      public AuthorizationResponseDescription(String userName, String endpoint, String repositoryId)
-      {
-        super("CMISAuthority",LRUsize);
-        this.userName = userName;
-        this.endpoint = endpoint;
-        this.repositoryId = repositoryId;
-      }
-
-      /** Return the invalidation keys for this object. */
-      public StringSet getObjectKeys()
-      {
-        return emptyStringSet;
-      }
-
-      /** Get the critical section name, used for synchronizing the creation of the object */
-      public String getCriticalSectionName()
-      {
-        return getClass().getName() + "-" + userName + "-" + endpoint +
-          "-" + repositoryId;
-      }
-
-      /** Return the object expiration interval */
-      public long getObjectExpirationTime(long currentTime)
-      {
-        if (expirationTime == -1)
-          expirationTime = currentTime + responseLifetime;
-        return expirationTime;
-      }
-
-      public int hashCode()
-      {
-        return userName.hashCode() + endpoint.hashCode() + repositoryId.hashCode();
-      }
-      
-      public boolean equals(Object o)
-      {
-        if (!(o instanceof AuthorizationResponseDescription))
-          return false;
-        AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-        return ard.userName.equals(userName) && ard.endpoint.equals(endpoint) &&
-          ard.repositoryId.equals(repositoryId);
-      }
-      
-    }
-    
-}
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/cmis/Messages.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/cmis/Messages.java
deleted file mode 100644
index e0d95fa..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/cmis/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.cmis;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.cmis.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.cmis";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisConfig.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisConfig.java
deleted file mode 100644
index ca4db95..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisConfig.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.cmis;
-
-import org.apache.commons.lang.StringUtils;
-
-/** 
- * Parameters data for the CMIS repository connector.
-*/
-public class CmisConfig {
-  
-  /** Username */
-  public static final String USERNAME_PARAM = "username";
- 
-  /** Password */
-  public static final String PASSWORD_PARAM = "password";
-  
-  /** Protocol */
-  public static final String PROTOCOL_PARAM = "protocol";
-  
-  /** Server name */
-  public static final String SERVER_PARAM = "server";
-  
-  /** Port */
-  public static final String PORT_PARAM = "port";
-  
-  /** Path of the context of the CMIS AtomPub api */
-  public static final String PATH_PARAM = "path";
-  
-  /** CMIS Repository Id */
-  public static final String REPOSITORY_ID_PARAM = "repositoryId";
-  
-  /** CMIS protocol binding */
-  public static final String BINDING_PARAM = "binding";
-  
-  /** CMIS Query */
-  public static final String CMIS_QUERY_PARAM = "cmisQuery";
-  
-  //default values
-  public static final String USERNAME_DEFAULT_VALUE = "dummyuser";
-  public static final String PASSWORD_DEFAULT_VALUE = "dummysecrect";
-  public static final String PROTOCOL_DEFAULT_VALUE = "http";
-  public static final String SERVER_DEFAULT_VALUE = "localhost";
-  public static final String PORT_DEFAULT_VALUE = "9090";
-  public static final String BINDING_DEFAULT_VALUE = "atom";
-  public static final String PATH_DEFAULT_VALUE = "/chemistry-opencmis-server-inmemory/atom";
-  public static final String REPOSITORY_ID_DEFAULT_VALUE = StringUtils.EMPTY;
-  public static final String BINDING_ATOM_VALUE = "atom";
-  public static final String BINDING_WS_VALUE = "ws";
-  
-}
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java
deleted file mode 100644
index 99ceb4d..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java
+++ /dev/null
@@ -1,1284 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.cmis;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.rmi.NotBoundException;
-import java.rmi.RemoteException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.chemistry.opencmis.client.api.CmisObject;
-import org.apache.chemistry.opencmis.client.api.Document;
-import org.apache.chemistry.opencmis.client.api.Folder;
-import org.apache.chemistry.opencmis.client.api.ItemIterable;
-import org.apache.chemistry.opencmis.client.api.Property;
-import org.apache.chemistry.opencmis.client.api.QueryResult;
-import org.apache.chemistry.opencmis.client.api.Repository;
-import org.apache.chemistry.opencmis.client.api.Session;
-import org.apache.chemistry.opencmis.client.api.SessionFactory;
-import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
-import org.apache.chemistry.opencmis.commons.PropertyIds;
-import org.apache.chemistry.opencmis.commons.SessionParameter;
-import org.apache.chemistry.opencmis.commons.enums.BindingType;
-import org.apache.chemistry.opencmis.commons.enums.PropertyType;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisConnectionException;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
-import org.apache.chemistry.opencmis.commons.impl.Constants;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
-
-import org.apache.commons.io.input.NullInputStream;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-/**
- * This is the "repository connector" for a CMIS-compliant repository.
- *
- * @author Piergiorgio Lucidi
- */
-public class CmisRepositoryConnector extends BaseRepositoryConnector {
-
-  private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-
-  protected final static String ACTIVITY_READ = "read document";
-  protected static final String RELATIONSHIP_CHILD = "child";
-
-  private static final String CMIS_FOLDER_BASE_TYPE = "cmis:folder";
-  private static final String CMIS_DOCUMENT_BASE_TYPE = "cmis:document";
-  private static final SimpleDateFormat ISO8601_DATE_FORMATTER = new SimpleDateFormat(
-      "yyyy-MM-dd'T'HH:mm:ssZ", Locale.ROOT);
-
-  // Tab name properties
-
-  private static final String CMIS_SERVER_TAB_PROPERTY = "CmisRepositoryConnector.Server";
-  private static final String CMIS_QUERY_TAB_PROPERTY = "CmisRepositoryConnector.CMISQuery";
-
-
-  // Template names
-
-    /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-  /** Server tab template */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_Server.html";
-
-  /** Forward to the javascript to check the specification parameters for the job */
-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification.js";
-
-  /** Forward to the template to edit the configuration parameters for the job */
-  private static final String EDIT_SPEC_FORWARD_CMISQUERY = "editSpecification_CMISQuery.html";
-
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-
-  /** Forward to the template to view the specification parameters for the job */
-  private static final String VIEW_SPEC_FORWARD = "viewSpecification.html";
-
-
-  /**
-   * CMIS Session handle
-   */
-  Session session = null;
-
-  protected String username = null;
-  protected String password = null;
-
-  /** Endpoint protocol */
-  protected String protocol = null;
-
-  /** Endpoint server name */
-  protected String server = null;
-
-  /** Endpoint port */
-  protected String port = null;
-
-  /** Endpoint context path of the Alfresco webapp */
-  protected String path = null;
-
-  protected String repositoryId = null;
-  protected String binding = null;
-
-  protected SessionFactory factory = SessionFactoryImpl.newInstance();
-  protected Map<String, String> parameters = new HashMap<String, String>();
-
-  public final static String ACTIVITY_FETCH = "fetch";
-
-  protected static final long timeToRelease = 300000L;
-  protected long lastSessionFetch = -1L;
-
-  /**
-   * Constructor
-   */
-  public CmisRepositoryConnector() {
-    super();
-  }
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    return MODEL_CHAINED_ADD_CHANGE;
-  }
-
-  /**
-   * Return the list of activities that this connector supports (i.e. writes into the log).
-   * @return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[] { ACTIVITY_FETCH };
-  }
-
-  /** Get the bin name strings for a document identifier.  The bin name describes the queue to which the
-   * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-   * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-   * multiple queues or bins.
-   * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-   * that is likely to correspond to a real resource that will need real throttle protection.
-   *@param documentIdentifier is the document identifier.
-   *@return the set of bin names.  If an empty array is returned, it is equivalent to there being no request
-   * rate throttling available for this identifier.
-   */
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[] { server };
-  }
-
-  protected class GetSessionThread extends Thread {
-    protected Throwable exception = null;
-
-    public GetSessionThread() {
-      super();
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        // Create a session
-        parameters.clear();
-
-        // user credentials
-        parameters.put(SessionParameter.USER, username);
-        parameters.put(SessionParameter.PASSWORD, password);
-
-        String endpoint = protocol+"://"+server+":"+port+path;
-
-        // connection settings
-        if(CmisConfig.BINDING_ATOM_VALUE.equals(binding)){
-          //AtomPub protocol
-          parameters.put(SessionParameter.ATOMPUB_URL, endpoint);
-          parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
-        } else if(CmisConfig.BINDING_WS_VALUE.equals(binding)){
-          //Web Services - SOAP - protocol
-          parameters.put(SessionParameter.BINDING_TYPE, BindingType.WEBSERVICES.value());
-          parameters.put(SessionParameter.WEBSERVICES_ACL_SERVICE, endpoint+"/ACLService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_DISCOVERY_SERVICE, endpoint+"/DiscoveryService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_MULTIFILING_SERVICE, endpoint+"/MultiFilingService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_NAVIGATION_SERVICE, endpoint+"/NavigationService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_OBJECT_SERVICE, endpoint+"/ObjectService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_POLICY_SERVICE, endpoint+"/PolicyService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_RELATIONSHIP_SERVICE, endpoint+"/RelationshipService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_REPOSITORY_SERVICE, endpoint+"/RepositoryService?wsdl");
-          parameters.put(SessionParameter.WEBSERVICES_VERSIONING_SERVICE, endpoint+"/VersioningService?wsdl");
-        }
-        // create session
-        if (StringUtils.isEmpty(repositoryId)) {
-
-
-          // get a session from the first CMIS repository exposed by
-          // the endpoint
-          List<Repository> repos = null;
-          try {
-            repos = factory.getRepositories(parameters);
-            session = repos.get(0).createSession();
-          } catch (Exception e) {
-            Logging.connectors.error("CMIS: Error during getting CMIS repositories. Please check the endpoint parameters: " + e.getMessage(), e);
-            this.exception = e;
-          }
-
-        } else {
-
-          // get a session from the repository specified in the
-          // configuration with its own ID
-          parameters.put(SessionParameter.REPOSITORY_ID, repositoryId);
-
-          try {
-            session = factory.createSession(parameters);
-          } catch (Exception e) {
-            Logging.connectors.error("CMIS: Error during the creation of the new session. Please check the endpoint parameters: " + e.getMessage(), e);
-            this.exception = e;
-          }
-
-        }
-
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-  }
-
-  protected class CheckConnectionThread extends Thread {
-    protected Throwable exception = null;
-
-    public CheckConnectionThread() {
-      super();
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.getRepositoryInfo();
-      } catch (Throwable e) {
-        Logging.connectors.warn("CMIS: Error checking repository: "+e.getMessage(),e);
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-
-  }
-
-  protected class DestroySessionThread extends Thread {
-    protected Throwable exception = null;
-
-    public DestroySessionThread() {
-      super();
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session = null;
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-
-  }
-
-  /**
-   * Close the connection.  Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (session != null) {
-      DestroySessionThread t = new DestroySessionThread();
-      try {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null) {
-          if (thr instanceof RemoteException)
-            throw (RemoteException) thr;
-          else
-            throw (Error) thr;
-        }
-        session = null;
-        lastSessionFetch = -1L;
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (RemoteException e) {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException
-            || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(), e2,
-              ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn(
-            "CMIS: Transient remote exception closing session: "
-                + e.getMessage(), e);
-      }
-
-    }
-
-    username = null;
-    password = null;
-    protocol = null;
-    server = null;
-    port = null;
-    path = null;
-    binding = null;
-    repositoryId = null;
-
-  }
-
-  /**
-   * This method create a new CMIS session for a CMIS repository, if the
-   * repositoryId is not provided in the configuration, the connector will
-   * retrieve all the repositories exposed for this endpoint the it will start
-   * to use the first one.
-   * @param configParameters is the set of configuration parameters, which
-   * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-   * out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    username = params.getParameter(CmisConfig.USERNAME_PARAM);
-    password = params.getParameter(CmisConfig.PASSWORD_PARAM);
-    protocol = params.getParameter(CmisConfig.PROTOCOL_PARAM);
-    server = params.getParameter(CmisConfig.SERVER_PARAM);
-    port = params.getParameter(CmisConfig.PORT_PARAM);
-    path = params.getParameter(CmisConfig.PATH_PARAM);
-
-    binding = params.getParameter(CmisConfig.BINDING_PARAM);
-    if (StringUtils.isNotEmpty(params.getParameter(CmisConfig.REPOSITORY_ID_PARAM)))
-      repositoryId = params.getParameter(CmisConfig.REPOSITORY_ID_PARAM);
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-   *@return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /** Set up a session */
-  protected void getSession() throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      // Check for parameter validity
-
-      if (StringUtils.isEmpty(binding))
-        throw new ManifoldCFException("Parameter " + CmisConfig.BINDING_PARAM
-            + " required but not set");
-
-      if (StringUtils.isEmpty(username))
-        throw new ManifoldCFException("Parameter " + CmisConfig.USERNAME_PARAM
-            + " required but not set");
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("CMIS: Username = '" + username + "'");
-
-      if (StringUtils.isEmpty(password))
-        throw new ManifoldCFException("Parameter " + CmisConfig.PASSWORD_PARAM
-            + " required but not set");
-
-      Logging.connectors.debug("CMIS: Password exists");
-
-      if (StringUtils.isEmpty(protocol))
-        throw new ManifoldCFException("Parameter " + CmisConfig.PROTOCOL_PARAM
-            + " required but not set");
-
-      if (StringUtils.isEmpty(server))
-        throw new ManifoldCFException("Parameter " + CmisConfig.SERVER_PARAM
-            + " required but not set");
-
-      if (StringUtils.isEmpty(port))
-        throw new ManifoldCFException("Parameter " + CmisConfig.PORT_PARAM
-            + " required but not set");
-
-      if (StringUtils.isEmpty(path))
-        throw new ManifoldCFException("Parameter " + CmisConfig.PATH_PARAM
-            + " required but not set");
-
-      long currentTime;
-      GetSessionThread t = new GetSessionThread();
-      try {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null) {
-          if (thr instanceof java.net.MalformedURLException)
-            throw (java.net.MalformedURLException) thr;
-          else if (thr instanceof NotBoundException)
-            throw (NotBoundException) thr;
-          else if (thr instanceof RemoteException)
-            throw (RemoteException) thr;
-          else if (thr instanceof CmisConnectionException)
-            throw new ManifoldCFException("CMIS: Error during getting a new session: " + thr.getMessage(), thr);
-          else if (thr instanceof CmisPermissionDeniedException)
-            throw new ManifoldCFException("CMIS: Wrong credentials during getting a new session: " + thr.getMessage(), thr);
-          else
-            throw (Error) thr;
-        }
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (java.net.MalformedURLException e) {
-        throw new ManifoldCFException(e.getMessage(), e);
-      } catch (NotBoundException e) {
-        // Transient problem: Server not available at the moment.
-        Logging.connectors.warn(
-            "CMIS: Server not up at the moment: " + e.getMessage(), e);
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(), currentTime + 60000L);
-      } catch (RemoteException e) {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException
-            || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(), e2,
-              ManifoldCFException.INTERRUPTED);
-        // Treat this as a transient problem
-        Logging.connectors.warn(
-            "CMIS: Transient remote exception creating session: "
-                + e.getMessage(), e);
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(), currentTime + 60000L);
-      }
-
-    }
-
-    lastSessionFetch = System.currentTimeMillis();
-  }
-
-  /**
-   * Release the session, if it's time.
-   */
-  protected void releaseCheck() throws ManifoldCFException {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      DestroySessionThread t = new DestroySessionThread();
-      try {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null) {
-          if (thr instanceof RemoteException)
-            throw (RemoteException) thr;
-          else
-            throw (Error) thr;
-        }
-        session = null;
-        lastSessionFetch = -1L;
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (RemoteException e) {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException
-            || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(), e2,
-              ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn(
-            "CMIS: Transient remote exception closing session: "
-                + e.getMessage(), e);
-      }
-
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException,
-      ServiceInterruption {
-    while (true) {
-      boolean noSession = (session == null);
-      getSession();
-      long currentTime;
-      CheckConnectionThread t = new CheckConnectionThread();
-      try {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null) {
-          if (thr instanceof RemoteException)
-            throw (RemoteException) thr;
-          else if (thr instanceof CmisConnectionException)
-            throw new ManifoldCFException("CMIS: Error during checking connection: " + thr.getMessage(), thr);
-          else
-            throw (Error) thr;
-        }
-        return;
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (RemoteException e) {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException
-            || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(), e2,
-              ManifoldCFException.INTERRUPTED);
-        if (noSession) {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption(
-              "Transient error connecting to filenet service: "
-                  + e.getMessage(), currentTime + 60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  /**
-   * This method is periodically called for all connectors that are connected but not
-   * in active use.
-   */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      DestroySessionThread t = new DestroySessionThread();
-      try {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null) {
-          if (thr instanceof RemoteException)
-            throw (RemoteException) thr;
-          else
-            throw (Error) thr;
-        }
-        session = null;
-        lastSessionFetch = -1L;
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (RemoteException e) {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException
-            || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(), e2,
-              ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn(
-            "CMIS: Transient remote exception closing session: "
-                + e.getMessage(), e);
-      }
-
-    }
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {
-
-    getSession();
-
-    String cmisQuery = StringUtils.EMPTY;
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        cmisQuery = sn.getAttributeValue(CmisConfig.CMIS_QUERY_PARAM);
-        break;
-      }
-    }
-
-    if (StringUtils.isEmpty(cmisQuery)) {
-      // get root Documents from the CMIS Repository
-      ItemIterable<CmisObject> cmisObjects = session.getRootFolder()
-          .getChildren();
-      for (CmisObject cmisObject : cmisObjects) {
-        activities.addSeedDocument(cmisObject.getId());
-      }
-    } else {
-      cmisQuery = CmisRepositoryConnectorUtils.getCmisQueryWithObjectId(cmisQuery);
-      ItemIterable<QueryResult> results = session.query(cmisQuery, false).getPage(1000000000);
-      for (QueryResult result : results) {
-        String id = result.getPropertyValueById(PropertyIds.OBJECT_ID);
-        activities.addSeedDocument(id);
-      }
-    }
-
-    return "";
-  }
-
-
-
-  /**
-   * Get the maximum number of documents to amalgamate together into one batch, for this connector.
-   * @return the maximum number. 0 indicates "unlimited".
-   */
-  @Override
-  public int getMaxDocumentRequest() {
-    return 1;
-  }
-
-  /**
-   * Return the list of relationship types that this connector recognizes.
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes() {
-    return new String[] { RELATIONSHIP_CHILD };
-  }
-
-  /**
-   * Read the content of a resource, replace the variable ${PARAMNAME} with the
-   * value and copy it to the out.
-   *
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException
-   */
-  private static void outputResource(String resName, IHTTPOutput out,
-      Locale locale, Map<String,String> paramMap) throws ManifoldCFException {
-    Messages.outputResourceWithVelocity(out,locale,resName,paramMap,true);
-  }
-
-  /** Fill in a Server tab configuration parameter map for calling a Velocity template.
-  *@param newMap is the map to fill in
-  *@param parameters is the current set of configuration parameters
-  */
-  private static void fillInServerConfigurationMap(Map<String,String> newMap, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    String username = parameters.getParameter(CmisConfig.USERNAME_PARAM);
-    String password = parameters.getParameter(CmisConfig.PASSWORD_PARAM);
-    String protocol = parameters.getParameter(CmisConfig.PROTOCOL_PARAM);
-    String server = parameters.getParameter(CmisConfig.SERVER_PARAM);
-    String port = parameters.getParameter(CmisConfig.PORT_PARAM);
-    String path = parameters.getParameter(CmisConfig.PATH_PARAM);
-    String repositoryId = parameters.getParameter(CmisConfig.REPOSITORY_ID_PARAM);
-    String binding = parameters.getParameter(CmisConfig.BINDING_PARAM);
-
-    if(username == null)
-      username = StringUtils.EMPTY;
-    if(password == null)
-      password = StringUtils.EMPTY;
-    else
-      password = mapper.mapPasswordToKey(password);
-    if(protocol == null)
-      protocol = CmisConfig.PROTOCOL_DEFAULT_VALUE;
-    if(server == null)
-      server = CmisConfig.SERVER_DEFAULT_VALUE;
-    if(port == null)
-      port = CmisConfig.PORT_DEFAULT_VALUE;
-    if(path == null)
-      path = CmisConfig.PATH_DEFAULT_VALUE;
-    if(repositoryId == null)
-      repositoryId = StringUtils.EMPTY;
-    if(binding == null)
-      binding = CmisConfig.BINDING_ATOM_VALUE;
-
-    newMap.put(CmisConfig.USERNAME_PARAM, username);
-    newMap.put(CmisConfig.PASSWORD_PARAM, password);
-    newMap.put(CmisConfig.PROTOCOL_PARAM, protocol);
-    newMap.put(CmisConfig.SERVER_PARAM, server);
-    newMap.put(CmisConfig.PORT_PARAM, port);
-    newMap.put(CmisConfig.PATH_PARAM, path);
-    newMap.put(CmisConfig.REPOSITORY_ID_PARAM, repositoryId);
-    newMap.put(CmisConfig.BINDING_PARAM, binding);
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML that
-   * is output from this configuration will be within appropriate <html> and
-   * <body> tags.
-   *
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String,String> paramMap = new HashMap<String,String>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    outputResource(VIEW_CONFIG_FORWARD, out, locale, paramMap);
-  }
-
-  /**
-
-   * Output the configuration header section. This method is called in the head
-   * section of the connector's configuration page. Its purpose is to add the
-   * required tabs to the list, and to output any javascript methods that might
-   * be needed by the configuration editing HTML.
-   *
-   * @param threadContext
-   *          is the local thread context.
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @param tabsArray
-   *          is an array of tab names. Add to this array any tab names that are
-   *          specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale,CMIS_SERVER_TAB_PROPERTY));
-    // Map the parameters
-    Map<String,String> paramMap = new HashMap<String,String>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    outputResource(EDIT_CONFIG_HEADER_FORWARD, out, locale, paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-
-    // Call the Velocity templates for each tab
-
-    // Server tab
-    Map<String,String> paramMap = new HashMap<String,String>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    outputResource(EDIT_CONFIG_FORWARD_SERVER, out, locale, paramMap);
-
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   *
-   * @param threadContext
-   *          is the local thread context.
-   * @param variableContext
-   *          is the set of variables available from the post, including binary
-   *          file post information.
-   * @param parameters
-   *          are the configuration parameters, as they currently exist, for
-   *          this connection being configured.
-   * @return null if all is well, or a string error message if there is an error
-   *         that should prevent saving of the connection (and cause a
-   *         redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, ConfigParams parameters)
-      throws ManifoldCFException {
-
-    String binding = variableContext.getParameter(CmisConfig.BINDING_PARAM);
-    if (binding != null)
-      parameters.setParameter(CmisConfig.BINDING_PARAM, binding);
-
-    String username = variableContext.getParameter(CmisConfig.USERNAME_PARAM);
-    if (username != null)
-      parameters.setParameter(CmisConfig.USERNAME_PARAM, username);
-
-    String password = variableContext.getParameter(CmisConfig.PASSWORD_PARAM);
-    if (password != null)
-      parameters.setParameter(CmisConfig.PASSWORD_PARAM, variableContext.mapKeyToPassword(password));
-
-    String protocol = variableContext.getParameter(CmisConfig.PROTOCOL_PARAM);
-    if (protocol != null) {
-      parameters.setParameter(CmisConfig.PROTOCOL_PARAM, protocol);
-    }
-
-    String server = variableContext.getParameter(CmisConfig.SERVER_PARAM);
-    if (server != null && !StringUtils.contains(server, '/')) {
-      parameters.setParameter(CmisConfig.SERVER_PARAM, server);
-    }
-
-    String port = variableContext.getParameter(CmisConfig.PORT_PARAM);
-    if (port != null){
-      try {
-        Integer.parseInt(port);
-        parameters.setParameter(CmisConfig.PORT_PARAM, port);
-      } catch (NumberFormatException e) {
-
-      }
-    }
-
-    String path = variableContext.getParameter(CmisConfig.PATH_PARAM);
-    if (path != null) {
-      parameters.setParameter(CmisConfig.PATH_PARAM, path);
-    }
-
-    String repositoryId = variableContext.getParameter(CmisConfig.REPOSITORY_ID_PARAM);
-    if (repositoryId != null) {
-      parameters.setParameter(CmisConfig.REPOSITORY_ID_PARAM, repositoryId);
-    }
-
-    return null;
-  }
-
-  /** Fill in specification Velocity parameter map for CMISQuery tab.
-  */
-  private static void fillInCMISQuerySpecificationMap(Map<String,String> newMap, Specification ds)
-  {
-    int i = 0;
-    String cmisQuery = "";
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        cmisQuery = sn.getAttributeValue(CmisConfig.CMIS_QUERY_PARAM);
-      }
-      i++;
-    }
-    newMap.put(CmisConfig.CMIS_QUERY_PARAM, cmisQuery);
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-
-    Map<String,String> paramMap = new HashMap<String,String>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInCMISQuerySpecificationMap(paramMap, ds);
-
-    outputResource(VIEW_SPEC_FORWARD, out, locale, paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String cmisQuery = variableContext.getParameter(seqPrefix + CmisConfig.CMIS_QUERY_PARAM);
-    if (cmisQuery != null) {
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode oldNode = ds.getChild(i);
-        if (oldNode.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-          ds.removeChild(i);
-          break;
-        }
-        i++;
-      }
-      SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
-      node.setAttribute(CmisConfig.CMIS_QUERY_PARAM, cmisQuery);
-      variableContext.setParameter(CmisConfig.CMIS_QUERY_PARAM, cmisQuery);
-      ds.addChild(ds.getChildCount(), node);
-    }
-    return null;
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-
-    // Output CMISQuery tab
-    Map<String,String> paramMap = new HashMap<String,String>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    fillInCMISQuerySpecificationMap(paramMap, ds);
-    outputResource(EDIT_SPEC_FORWARD_CMISQUERY, out, locale, paramMap);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale,CMIS_QUERY_TAB_PROPERTY));
-
-    Map<String,String> paramMap = new HashMap<String,String>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInCMISQuerySpecificationMap(paramMap, ds);
-
-    outputResource(EDIT_SPEC_HEADER_FORWARD, out, locale, paramMap);
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-
-    // Extract what we need from the spec
-    String cmisQuery = StringUtils.EMPTY;
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        cmisQuery = sn.getAttributeValue(CmisConfig.CMIS_QUERY_PARAM);
-        break;
-      }
-    }
-
-
-    for (String documentIdentifier : documentIdentifiers) {
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("CMIS: Processing document identifier '"
-            + documentIdentifier + "'");
-
-      getSession();
-
-      // Load the object.  If this fails, it has been deleted.
-      CmisObject cmisObject;
-      try {
-       cmisObject = session.getObject(documentIdentifier);
-      } catch (CmisObjectNotFoundException e) {
-        cmisObject = null;
-      }
-
-      if (cmisObject == null) {
-        //System.out.println(" doesn't exist");
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-
-      String versionString;
-
-      if (cmisObject.getBaseType().getId().equals(CMIS_DOCUMENT_BASE_TYPE)) {
-        Document document = (Document) cmisObject;
-
-        // Since documents that are not current have different node id's, we can return a constant version,
-        // EXCEPT when the document is not the current one (in which case we delete)
-        boolean isCurrentVersion;
-        try {
-          Document d = document.getObjectOfLatestVersion(false);
-          isCurrentVersion = d.getId().equals(documentIdentifier);
-        } catch (CmisObjectNotFoundException e) {
-          isCurrentVersion = false;
-        }
-        if (isCurrentVersion) {
-          //System.out.println(" is latest version");
-          //versionString = documentIdentifier + ":" + cmisQuery;
-      // take into account of the last modification date
-            long lmdSeconds = document.getLastModificationDate().getTimeInMillis();
-            versionString = documentIdentifier + lmdSeconds + ":" + cmisQuery;
-        } else {
-          //System.out.println(" is NOT latest vrersion");
-          activities.deleteDocument(documentIdentifier);
-          continue;
-        }
-      } else {
-        //a CMIS folder will always be processed
-        //System.out.println(" is folder");
-        versionString = StringUtils.EMPTY;
-      }
-
-      if (versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)) {
-        // Index this document
-        String errorCode = null;
-        String errorDesc = null;
-        Long fileLengthLong = null;
-        long startTime = System.currentTimeMillis();
-        try {
-          String baseTypeId = cmisObject.getBaseType().getId();
-
-          if (baseTypeId.equals(CMIS_FOLDER_BASE_TYPE)) {
-
-            // adding all the children for a folder
-
-            Folder folder = (Folder) cmisObject;
-            ItemIterable<CmisObject> children = folder.getChildren();
-            for (CmisObject child : children) {
-              activities.addDocumentReference(child.getId(), documentIdentifier,
-                  RELATIONSHIP_CHILD);
-            }
-          } else if(baseTypeId.equals(CMIS_DOCUMENT_BASE_TYPE)) {
-            // content ingestion
-
-            Document document = (Document) cmisObject;
-
-            Date createdDate = document.getCreationDate().getTime();
-            Date modifiedDate = document.getLastModificationDate().getTime();
-            long fileLength = document.getContentStreamLength();
-            String fileName = document.getContentStreamFileName();
-            String mimeType = document.getContentStreamMimeType();
-            //documentURI
-            String documentURI = CmisRepositoryConnectorUtils.getDocumentURL(document, session);
-
-            // Do any filtering (which will save us work)
-            if (!activities.checkURLIndexable(documentURI))
-            {
-              activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_URL;
-              errorDesc = "Excluding due to URL ('"+documentURI+"')";
-              continue;
-            }
-
-            if (!activities.checkMimeTypeIndexable(mimeType))
-            {
-              activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_MIMETYPE;
-              errorDesc = "Excluding due to mime type ("+mimeType+")";
-              continue;
-            }
-
-            if (!activities.checkLengthIndexable(fileLength))
-            {
-              activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_LENGTH;
-              errorDesc = "Excluding due to length ("+fileLength+")";
-              continue;
-            }
-
-            if (!activities.checkDateIndexable(modifiedDate))
-            {
-              activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_DATE;
-              errorDesc = "Excluding due to date ("+modifiedDate+")";
-              continue;
-            }
-
-            RepositoryDocument rd = new RepositoryDocument();
-            rd.setFileName(fileName);
-            rd.setMimeType(mimeType);
-            rd.setCreatedDate(createdDate);
-            rd.setModifiedDate(modifiedDate);
-
-            InputStream is;
-            try {
-              if (fileLength > 0)
-                is = document.getContentStream().getStream();
-              else
-                is = null;
-            } catch (CmisObjectNotFoundException e) {
-              // Document gone
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-
-            try {
-              //binary
-              if(is != null) {
-                rd.setBinary(is, fileLength);
-              } else {
-                rd.setBinary(new NullInputStream(0),0);
-              }
-
-              //modify the query in order to get the cmis:objectId field
-              String modifiedQuery = CmisRepositoryConnectorUtils.getCmisQueryWithObjectId(cmisQuery);
-
-              //filter the fields selected in the query
-              CmisRepositoryConnectorUtils.addValuesOfProperties(cmisObject.getProperties(), rd, modifiedQuery);
-              //ingestion
-
-              try {
-                activities.ingestDocumentWithException(documentIdentifier, versionString, documentURI, rd);
-                fileLengthLong = new Long(fileLength);
-                errorCode = "OK";
-              } catch (IOException e) {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(e, "reading file input stream");
-              }
-            } catch (Exception ecc) {
-               ecc.printStackTrace();
-              } finally {
-              try {
-                if(is!=null){
-                  is.close();
-                }
-              } catch (IOException e) {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(e, "closing file input stream");
-              }
-            }
-          } else {
-            // Unrecognized document type
-            activities.noDocument(documentIdentifier,versionString);
-            errorCode = "UNKNOWNTYPE";
-            errorDesc = "Document type is unrecognized: '"+baseTypeId+"'";
-          }
-        } catch (ManifoldCFException e) {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            errorCode = null;
-          throw e;
-        } finally {
-          if (errorCode != null)
-            activities.recordActivity(new Long(startTime), ACTIVITY_READ,
-              fileLengthLong, documentIdentifier, errorCode, errorDesc, null);
-        }
-      }
-    }
-
-  }
-
-  protected static void handleIOException(IOException e, String context) throws ManifoldCFException, ServiceInterruption {
-    if (e instanceof InterruptedIOException) {
-      throw new ManifoldCFException(e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } else {
-      Logging.connectors.warn(
-        "CMIS: IOException "+context+": "
-          + e.getMessage(), e);
-      throw new ManifoldCFException(e.getMessage(), e);
-    }
-  }
-
-}
\ No newline at end of file
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java
deleted file mode 100644
index 32e8afe..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.cmis;
-
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.*;
-
-import org.apache.chemistry.opencmis.client.api.Document;
-import org.apache.chemistry.opencmis.client.api.Property;
-import org.apache.chemistry.opencmis.client.api.Session;
-import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService;
-import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AtomPubParser;
-import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
-import org.apache.chemistry.opencmis.commons.enums.Cardinality;
-import org.apache.chemistry.opencmis.commons.enums.PropertyType;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.ISODateTimeFormat;
-
-/**
- *
- * @author Piergiorgio Lucidi
- *
- */
-public class CmisRepositoryConnectorUtils {
-
-    private static final String LOAD_LINK_METHOD_NAME = "loadLink";
-    private static final String FROM_TOKEN = "from";
-    private static final String SEP = " ";
-    private static final String SELECT_STAR_CLAUSE = "select *";
-    private static final String OBJECT_ID_PROPERTY = "cmis:objectId";
-    private static final String OBJECT_ID_TERM = OBJECT_ID_PROPERTY + ",";
-    private static final String SELECT_CLAUSE_TERM_SEP = ",";
-    private static final String SELECT_PREFIX = "select ";
-    private final static String TOKENIZER_SEP = ",\n\t";
-
-    public static final String getDocumentURL(final Document document, final Session session)
-            throws ManifoldCFException {
-        String link = null;
-        try {
-            Method loadLink = AbstractAtomPubService.class.getDeclaredMethod(LOAD_LINK_METHOD_NAME,
-                    new Class[]{String.class, String.class, String.class, String.class});
-
-            loadLink.setAccessible(true);
-
-            link = (String) loadLink.invoke(session.getBinding().getObjectService(), session.getRepositoryInfo().getId(),
-                    document.getId(), AtomPubParser.LINK_REL_CONTENT, null);
-        } catch (Exception e) {
-            Logging.connectors.error(
-                    "CMIS: Error during getting the content stream url: "
-                    + e.getMessage(), e);
-            throw new ManifoldCFException(e.getMessage(), e);
-        }
-
-        return link;
-    }
-
-    /**
-     * Utility method to consider the objectId whenever it is not present in the select clause
-     * @param cmisQuery
-     * @return the cmisQuery with the cmis:objectId property added in the select clause
-     */
-    public static String getCmisQueryWithObjectId(String cmisQuery) {
-        String cmisQueryResult = StringUtils.EMPTY;
-        String selectClause = getSelectClause(cmisQuery);
-        if (selectClause.equalsIgnoreCase(SELECT_STAR_CLAUSE)) {
-            cmisQueryResult = cmisQuery;
-        } else {
-            //get the select term and add the cmis:objectId term or prefix.cmis:objectId
-            StringTokenizer selectClauseTokenized = new StringTokenizer(selectClause.trim());
-            boolean firstTermSelectClause = true;
-            String selectTerm = StringUtils.EMPTY;
-            String prefix = StringUtils.EMPTY;
-            boolean foundObjIdClause = false;
-            boolean foundPrefixClause = false;
-            while (selectClauseTokenized.hasMoreElements()) {
-                String term = selectClauseTokenized.nextToken();
-                if (firstTermSelectClause) {
-                    selectTerm = term;
-                    firstTermSelectClause = false;
-                } else {
-                    if (term.contains(OBJECT_ID_PROPERTY)){
-                        foundObjIdClause = true;
-                        cmisQueryResult = cmisQuery;
-                        break;
-                    }
-                    //if a term use a prefix table, get the prefix
-                    if (!foundPrefixClause && term.contains(".")){
-                        int i = term.indexOf(".");
-                        prefix = term.substring(0,i);
-                        foundPrefixClause = true;
-                    }
-                }
-            }
-            // if the cmis:objectId term is not found, add it
-            if (!foundObjIdClause) {
-                String toReplace = selectTerm + " ";
-                if (foundPrefixClause) {
-                    toReplace += prefix + "." + OBJECT_ID_TERM;
-                } else {
-                    toReplace += OBJECT_ID_TERM;
-                }
-                cmisQueryResult = StringUtils.replaceOnce(cmisQuery, selectTerm, toReplace);
-            }
-        }
-        return cmisQueryResult;
-    }
-
-  /**
-   * Utility method to understand if a property must be indexed or not
-   * @param cmisQuery
-   * @param propertyId
-   * @return TRUE if the property is included in the select clause of the query, otherwise it will return FALSE
-   */
-  public static boolean existsInSelectClause(String cmisQuery, String propertyId) {
-        String selectClause = getSelectClause(cmisQuery);
-        if (selectClause.toLowerCase(Locale.ROOT).startsWith(SELECT_STAR_CLAUSE)) {
-            return true;
-        } else {
-            StringTokenizer cmisQueryTokenized = new StringTokenizer(cmisQuery.trim());
-            while (cmisQueryTokenized.hasMoreElements()) {
-                String term = cmisQueryTokenized.nextToken();
-                if (!term.equalsIgnoreCase(FROM_TOKEN)) {
-                    if (term.equalsIgnoreCase(propertyId)) {
-                        return true;
-                    } else if (StringUtils.contains(term, SELECT_CLAUSE_TERM_SEP)) {
-                        //in this case means that we have: select cmis:objectId,cmis:name from ...
-                        StringTokenizer termsTokenized = new StringTokenizer(term, SELECT_CLAUSE_TERM_SEP);
-                        while (termsTokenized.hasMoreElements()) {
-                            String termTokenized = termsTokenized.nextToken().trim();
-                            if (termTokenized.equalsIgnoreCase(propertyId)) {
-                                return true;
-                            }
-                        }
-                    }
-                } else {
-                    break;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * @param props : list properties of a document
-     * @param rd : object that contains the properties to pass to connector
-     * @param cmisQuery : cmis query
-     */
-    public static void addValuesOfProperties(final List<Property<?>> props, RepositoryDocument rd, String cmisQuery) {
-        Map<String, String> cmisQueryColumns = CmisRepositoryConnectorUtils.getSelectMap(cmisQuery);
-        boolean isWildcardQuery = CmisRepositoryConnectorUtils.isWildcardQuery(cmisQuery);
-        addValuesOfProperty(props, isWildcardQuery, cmisQueryColumns, rd);
-    }
-
-    /**
-     * @param props : list properties of a document
-     * @param isWildcardQuery : if the query select is of type '*'
-     * @param cmisQueryColumns : selectors query
-     * @param rd : object that contains the properties to pass to connector
-     */
-    public static void addValuesOfProperty(final List<Property<?>> props, final boolean isWildcardQuery, final Map<String, String> cmisQueryColumns, RepositoryDocument rd) {
-
-        for (Property<?> property : props) {
-            String propertyId = property.getId();
-            if (isWildcardQuery || cmisQueryColumns.containsKey(propertyId)) {
-                try {
-                    addPropertyValue(property, rd);
-                } catch (Exception e) {
-                    Logging.connectors.error("Error when adding property[" + propertyId + "] msg=[" + e.getMessage() + "]", e);
-                }
-
-            }
-        }
-    }
-
-    /**
-     * @param property : the property
-     * @param propertyDefinitionType : definition of the type of property
-     * @param rd : object to which we add the association property -> value
-     * @throws Exception
-     *
-     */
-    private static void addPropertyValue(Property<?> property, RepositoryDocument rd) throws Exception {
-
-        DateTimeFormatter format = ISODateTimeFormat.dateTime();
-        PropertyDefinition<?> propertyDefinitionType = property.getDefinition();
-        PropertyType propertyType = propertyDefinitionType.getPropertyType();
-        boolean isMultiValue = (propertyDefinitionType.getCardinality() == Cardinality.MULTI);
-        String currentProperty = property.getId();
-
-        switch (propertyType) {
-
-            case STRING:
-            case ID:
-            case URI:
-            case HTML:
-                List<String> listValues = (List<String>) property.getValues();
-                if (!CollectionUtils.isEmpty(listValues)) {
-                    if (isMultiValue) {
-                        for (String htmlPropertyValue : listValues) {
-                            rd.addField(currentProperty, htmlPropertyValue);
-                        }
-                    } else {
-                        String stringValue = (String) listValues.get(0);
-                        if (StringUtils.isNotEmpty(stringValue)) {
-                            rd.addField(currentProperty, stringValue);
-                        }
-                    }
-                }
-                break;
-
-            case BOOLEAN:
-                List<Boolean> booleanPropertyValues = (List<Boolean>) property.getValues();
-                if (!CollectionUtils.isEmpty(booleanPropertyValues)) {
-                    if (isMultiValue) {
-                        for (Boolean booleanPropertyValue : booleanPropertyValues) {
-                            rd.addField(currentProperty, booleanPropertyValue.toString());
-                        }
-                    } else {
-                        Boolean booleanValue = (Boolean) booleanPropertyValues.get(0);
-                        if (booleanValue != null) {
-                            rd.addField(currentProperty, booleanValue.toString());
-                        }
-                    }
-                }
-                break;
-
-            case INTEGER:
-                List<BigInteger> integerPropertyValues = (List<BigInteger>) property.getValues();
-                if (!CollectionUtils.isEmpty(integerPropertyValues)) {
-                    if (isMultiValue) {
-                        for (BigInteger integerPropertyValue : integerPropertyValues) {
-                            rd.addField(currentProperty, integerPropertyValue.toString());
-                        }
-                    } else {
-                        BigInteger integerValue = (BigInteger) integerPropertyValues.get(0);
-                        if (integerValue != null) {
-                            rd.addField(currentProperty, integerValue.toString());
-                        }
-                    }
-                }
-                break;
-
-            case DECIMAL:
-                List<BigDecimal> decimalPropertyValues = (List<BigDecimal>) property.getValues();
-                if (!CollectionUtils.isEmpty(decimalPropertyValues)) {
-                    if (isMultiValue) {
-                        for (BigDecimal decimalPropertyValue : decimalPropertyValues) {
-                            rd.addField(currentProperty, decimalPropertyValue.toString());
-                        }
-                    } else {
-                        BigDecimal decimalValue = (BigDecimal) decimalPropertyValues.get(0);
-                        if (decimalValue != null) {
-                            rd.addField(currentProperty, decimalValue.toString());
-                        }
-                    }
-                }
-                break;
-
-            case DATETIME:
-                List<GregorianCalendar> datePropertyValues = (List<GregorianCalendar>) property.getValues();
-                if (!CollectionUtils.isEmpty(datePropertyValues)) {
-                    if (isMultiValue) {
-                        for (GregorianCalendar datePropertyValue : datePropertyValues) {
-                            rd.addField(currentProperty, format.print(datePropertyValue.getTimeInMillis()));
-                        }
-                    } else {
-                        GregorianCalendar dateValue = (GregorianCalendar) datePropertyValues.get(0);
-                        if (dateValue != null) {
-                            rd.addField(currentProperty, format.print(dateValue.getTimeInMillis()));
-                        }
-                    }
-                }
-                break;
-
-            default:
-                break;
-        }
-    }
-
-    private static String getSelectClause(String cmisQuery) {
-        StringTokenizer cmisQueryTokenized = new StringTokenizer(cmisQuery.trim());
-        String selectClause = StringUtils.EMPTY;
-        boolean firstTerm = true;
-        while (cmisQueryTokenized.hasMoreElements()) {
-            String term = cmisQueryTokenized.nextToken();
-            if (!term.equalsIgnoreCase(FROM_TOKEN)) {
-                if (firstTerm) {
-                    selectClause += term;
-                    firstTerm = false;
-                } else {
-                    selectClause += SEP + term;
-                }
-
-            } else {
-                break;
-            }
-        }
-        return selectClause;
-    }
-
-
-    //create a map with the field term and the alias (if present)
-    public static Map<String, String> getSelectMap(String cmisQuery) {
-        Map<String, String> cmisQueryColumns = new HashMap<>();
-        String selectClause = getSelectClause(cmisQuery.trim());
-
-        StringTokenizer cmisQueryTokenized = new StringTokenizer(selectClause.substring(SELECT_PREFIX.length()), TOKENIZER_SEP);
-        while (cmisQueryTokenized.hasMoreElements()) {
-            String term = cmisQueryTokenized.nextToken();
-            ColumnSet column = getColumnName(term);
-            cmisQueryColumns.put(column.getName(), column.getAlias());
-        }
-        return cmisQueryColumns;
-    }
-
-    //get a columset object given a term of the select clause
-    private static ColumnSet getColumnName(String orig) {
-        final String sep = " as ";
-        final int sepLen = sep.length();
-        String justColumnName = null;
-        String alias = null;
-
-        if (orig == null) {
-            return null;
-        }
-
-        justColumnName = orig.trim();
-
-        int idx = orig.indexOf(sep);
-        if (idx < 0) {
-            idx = orig.indexOf(sep.toUpperCase(Locale.ROOT));
-        }
-
-        if (idx > 1) {
-            alias = orig.substring(idx + sepLen).trim();
-            justColumnName = orig.substring(0, idx).trim();
-        }
-
-        // Now we identify the column name and the prefix as alias if it's null,
-        idx = justColumnName.indexOf(".");
-        if(idx > 0){
-            justColumnName = justColumnName.substring(idx + 1);
-        }
-
-        if (alias == null) {
-            alias = justColumnName;
-        }
-
-        return new ColumnSet(justColumnName, alias);
-    }
-
-    //check if the query is a select *
-    public static boolean isWildcardQuery(String selectClause) {
-        return selectClause.toLowerCase(Locale.ROOT).startsWith(SELECT_STAR_CLAUSE);
-    }
-}
\ No newline at end of file
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/ColumnSet.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/ColumnSet.java
deleted file mode 100644
index 91139c5..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/ColumnSet.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.connectors.cmis;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * 
- * @author Piergiorgio Lucidi
- *
- */
-public class ColumnSet {
-
-    private String name = StringUtils.EMPTY;
-    private String alias = StringUtils.EMPTY;
-
-    public ColumnSet() {}
-
-    public ColumnSet(String name, String alias) {
-        this.name = name;
-        this.alias = alias;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-
-    public void setAlias(String alias) {
-        this.alias = alias;
-    }
-
-    @Override
-    public String toString() {
-        return "ColumnSet{name=" + name + ", alias=" + alias + '}';
-    }
-
-}
diff --git a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/Messages.java b/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/Messages.java
deleted file mode 100644
index 8fe39ec..0000000
--- a/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.cmis.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.cmis";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_en_US.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_en_US.properties
deleted file mode 100644
index ec70e61..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_en_US.properties
+++ /dev/null
@@ -1,60 +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.
-
-CmisAuthorityConnector.Endpoint=Endpoint:
-CmisAuthorityConnector.RepositoryID=Repository ID:
-CmisAuthorityConnector.UserMapping=User mapping:
-CmisAuthorityConnector.TheEndpointMustBeNotNull=The endpoint must be not null
-CmisAuthorityConnector.TheRepositoryIDMustBeNotNull=The repository id must be not null
-CmisAuthorityConnector.Parameters=Parameters:
-
-CmisRepositoryConnector.Server=Server
-
-CmisRepositoryConnector.BindingColon=Binding:
-CmisRepositoryConnector.UsernameColon=Username:
-CmisRepositoryConnector.PasswordColon=Password:
-CmisRepositoryConnector.ProtocolColon=Protocol:
-CmisRepositoryConnector.ServerColon=Server:
-CmisRepositoryConnector.PortColon=Port:
-CmisRepositoryConnector.PathColon=Path:
-CmisRepositoryConnector.RepositoryIDColon=Repository ID:
-CmisRepositoryConnector.Optional=(optional)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=The username must not be null
-CmisRepositoryConnector.ThePasswordMustNotBeNull=The password must not be null
-CmisRepositoryConnector.TheBindingMustNotBeNull=The binding must not be null
-CmisRepositoryConnector.ServerNameMustNotBeNull=Server name must be not null
-CmisRepositoryConnector.ServerNameCantContainSlash=Server name can't contain the character '/'
-CmisRepositoryConnector.ThePortMustNotBeNull=The port must be not null
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=The server port must be a valid integer
-CmisRepositoryConnector.PathMustNotBeNull=Path must be not null
-
-CmisRepositoryConnector.CMISQuery=CMIS Query
-
-CmisRepositoryConnector.CMISQueryColon=CMIS Query:
-
-CmisRepositoryConnector.ParametersColon=Parameters:
-CmisRepositoryConnector.UsernameEquals=username=
-CmisRepositoryConnector.PasswordEquals=password=
-CmisRepositoryConnector.BindingEquals=binding=
-CmisRepositoryConnector.ProtocolEquals=protocol=
-CmisRepositoryConnector.ServerEquals=server=
-CmisRepositoryConnector.PortEquals=port=
-CmisRepositoryConnector.PathEquals=path=
-CmisRepositoryConnector.RepositoryIdEquals=repositoryId=
-
-CmisAuthorityConnector.Repository=Repository
-CmisAuthorityConnector.UserMapping=User Mapping
-
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_es_ES.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_es_ES.properties
deleted file mode 100644
index 9e59fa0..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_es_ES.properties
+++ /dev/null
@@ -1,61 +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.
-
-CmisAuthorityConnector.Endpoint=Punto final:
-CmisAuthorityConnector.RepositoryID=Depósito ID:
-CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario:
-CmisAuthorityConnector.TheEndpointMustBeNotNull=El punto final no debe ser nulo
-CmisAuthorityConnector.TheRepositoryIDMustBeNotNull=The repository id must be not null
-CmisAuthorityConnector.Parameters=Parámetros:
-
-CmisRepositoryConnector.Server=Servidor
-
-CmisRepositoryConnector.BindingColon=Uniòn:
-CmisRepositoryConnector.UsernameColon=Nombre de usuario:
-CmisRepositoryConnector.PasswordColon=Contraseña:
-CmisRepositoryConnector.ProtocolColon=Protocolo:
-CmisRepositoryConnector.ServerColon=Servidor:
-CmisRepositoryConnector.PortColon=Puerto:
-CmisRepositoryConnector.PathColon=Camino:
-CmisRepositoryConnector.RepositoryIDColon=Depósito ID:
-CmisRepositoryConnector.Optional=(opcional)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=El nombre de usuario no debe ser nulo
-CmisRepositoryConnector.ThePasswordMustNotBeNull=La contraseña no debe ser nulo
-CmisRepositoryConnector.TheBindingMustNotBeNull=La unión no debe ser nulo
-CmisRepositoryConnector.ServerNameMustNotBeNull=Nombre del servidor debe ser no nula
-CmisRepositoryConnector.ServerNameCantContainSlash=Nombre del servidor no puede contener el carácter '/'
-CmisRepositoryConnector.ThePortMustNotBeNull=El puerto debe ser no nula
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=El puerto del servidor debe ser un entero válido
-CmisRepositoryConnector.PathMustNotBeNull=El camino debe ser no nulo
-
-CmisRepositoryConnector.CMISQuery=CMIS consulta
-
-CmisRepositoryConnector.CMISQueryColon=CMIS consulta:
-
-CmisRepositoryConnector.ParametersColon=Parámetros:
-CmisRepositoryConnector.UsernameEquals=nombre de usuario=
-CmisRepositoryConnector.PasswordEquals=contraseña=
-CmisRepositoryConnector.BindingEquals=unión=
-CmisRepositoryConnector.ProtocolEquals=protocolo=
-CmisRepositoryConnector.ServerEquals=servidor=
-CmisRepositoryConnector.PortEquals=puerto=
-CmisRepositoryConnector.PathEquals=camino=
-CmisRepositoryConnector.RepositoryIdEquals=Depósito ID=
-
-CmisAuthorityConnector.Repository=Depósito
-CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario
-
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_ja_JP.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_ja_JP.properties
deleted file mode 100644
index ef27cb0..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_ja_JP.properties
+++ /dev/null
@@ -1,59 +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.
-
-CmisAuthorityConnector.Endpoint=エンドポイント:
-CmisAuthorityConnector.RepositoryID=リポジトリID:
-CmisAuthorityConnector.UserMapping=ユーザマッピング:
-CmisAuthorityConnector.TheEndpointMustBeNotNull=エンドポイントがnullです
-CmisAuthorityConnector.TheRepositoryIDMustBeNotNull=リポジトリidがnullです
-CmisAuthorityConnector.Parameters=引数:
-
-CmisRepositoryConnector.Server=サーバ
-
-CmisRepositoryConnector.BindingColon=バインディング:
-CmisRepositoryConnector.UsernameColon=ユーザ名:
-CmisRepositoryConnector.PasswordColon=パスワード:
-CmisRepositoryConnector.ProtocolColon=プロトコル:
-CmisRepositoryConnector.ServerColon=サーバ:
-CmisRepositoryConnector.PortColon=ポート:
-CmisRepositoryConnector.PathColon=パス:
-CmisRepositoryConnector.RepositoryIDColon=リポジトリID:
-CmisRepositoryConnector.Optional=(任意)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=ユーザ名を入力してください
-CmisRepositoryConnector.ThePasswordMustNotBeNull=パスワードを入力してください
-CmisRepositoryConnector.TheBindingMustNotBeNull=バインディングを入力してください
-CmisRepositoryConnector.ServerNameMustNotBeNull=サーバ名を入力してください
-CmisRepositoryConnector.ServerNameCantContainSlash=サーバ名には文字「/」を含めないでください
-CmisRepositoryConnector.ThePortMustNotBeNull=ポート番号を入力してください
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=サーバポートには整数を入力してください
-CmisRepositoryConnector.PathMustNotBeNull=パスを入力してください
-
-CmisRepositoryConnector.CMISQuery=CMISクエリー
-
-CmisRepositoryConnector.CMISQueryColon=CMISクエリー:
-
-CmisRepositoryConnector.ParametersColon=引数:
-CmisRepositoryConnector.UsernameEquals=ユーザ名=
-CmisRepositoryConnector.PasswordEquals=パスワード=
-CmisRepositoryConnector.BindingEquals=バインディング=
-CmisRepositoryConnector.ProtocolEquals=プロトコル=
-CmisRepositoryConnector.ServerEquals=サーバ=
-CmisRepositoryConnector.PortEquals=ポート=
-CmisRepositoryConnector.PathEquals=パス=
-CmisRepositoryConnector.RepositoryIdEquals=リポジトリId=
-
-CmisAuthorityConnector.Repository=リポジトリ
-CmisAuthorityConnector.UserMapping=ユーザマップ
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_zh_CN.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_zh_CN.properties
deleted file mode 100644
index 922a8e3..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/cmis/common_zh_CN.properties
+++ /dev/null
@@ -1,59 +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.
-
-CmisAuthorityConnector.Endpoint=端点: 
-CmisAuthorityConnector.RepositoryID=存储库ID: 
-CmisAuthorityConnector.UserMapping=用户映射: 
-CmisAuthorityConnector.TheEndpointMustBeNotNull=端点不能为Null
-CmisAuthorityConnector.TheRepositoryIDMustBeNotNull=存储库id不能为Null
-CmisAuthorityConnector.Parameters=参数: 
-
-CmisRepositoryConnector.Server=服务器
-
-CmisRepositoryConnector.BindingColon=绑定: 
-CmisRepositoryConnector.UsernameColon=用户名: 
-CmisRepositoryConnector.PasswordColon=密码: 
-CmisRepositoryConnector.ProtocolColon=协议: 
-CmisRepositoryConnector.ServerColon=服务器: 
-CmisRepositoryConnector.PortColon=端口: 
-CmisRepositoryConnector.PathColon=路径: 
-CmisRepositoryConnector.RepositoryIDColon=存储库ID: 
-CmisRepositoryConnector.Optional=(可选)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=请输入用户名
-CmisRepositoryConnector.ThePasswordMustNotBeNull=请输入密码
-CmisRepositoryConnector.TheBindingMustNotBeNull=请输入绑定
-CmisRepositoryConnector.ServerNameMustNotBeNull=请输入服务器名
-CmisRepositoryConnector.ServerNameCantContainSlash=服务器名不能包含‘/’字符
-CmisRepositoryConnector.ThePortMustNotBeNull=请输入端口号
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=服务器端口必须为有效的整数
-CmisRepositoryConnector.PathMustNotBeNull=请输入路径
-
-CmisRepositoryConnector.CMISQuery=CMIS查询
-
-CmisRepositoryConnector.CMISQueryColon=CMIS查询: 
-
-CmisRepositoryConnector.ParametersColon=参数: 
-CmisRepositoryConnector.UsernameEquals=用户名=
-CmisRepositoryConnector.PasswordEquals=密码=
-CmisRepositoryConnector.BindingEquals=绑定=
-CmisRepositoryConnector.ProtocolEquals=协议=
-CmisRepositoryConnector.ServerEquals=服务器=
-CmisRepositoryConnector.PortEquals=端口=
-CmisRepositoryConnector.PathEquals=路径=
-CmisRepositoryConnector.RepositoryIdEquals=存储库ID=
-
-CmisAuthorityConnector.Repository=存储库
-CmisAuthorityConnector.UserMapping=用户映射
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties
deleted file mode 100644
index a3958ea..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties
+++ /dev/null
@@ -1,59 +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.
-
-CmisAuthorityConnector.Endpoint=Endpoint:
-CmisAuthorityConnector.RepositoryID=Repository ID:
-CmisAuthorityConnector.UserMapping=User mapping:
-CmisAuthorityConnector.TheEndpointMustBeNotNull=The endpoint must be not null
-CmisAuthorityConnector.Parameters=Parameters:
-
-CmisRepositoryConnector.Server=Server
-
-CmisRepositoryConnector.BindingColon=Binding:
-CmisRepositoryConnector.UsernameColon=Username:
-CmisRepositoryConnector.PasswordColon=Password:
-CmisRepositoryConnector.ProtocolColon=Protocol:
-CmisRepositoryConnector.ServerColon=Server:
-CmisRepositoryConnector.PortColon=Port:
-CmisRepositoryConnector.PathColon=Path:
-CmisRepositoryConnector.RepositoryIDColon=Repository ID:
-CmisRepositoryConnector.Optional=(optional)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=The username must not be null
-CmisRepositoryConnector.ThePasswordMustNotBeNull=The password must not be null
-CmisRepositoryConnector.TheBindingMustNotBeNull=The binding must not be null
-CmisRepositoryConnector.ServerNameMustNotBeNull=Server name must be not null
-CmisRepositoryConnector.ServerNameCantContainSlash=Server name can't contain the character '/'
-CmisRepositoryConnector.ThePortMustNotBeNull=The port must be not null
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=The server port must be a valid integer
-CmisRepositoryConnector.PathMustNotBeNull=Path must be not null
-
-CmisRepositoryConnector.CMISQuery=CMIS Query
-
-CmisRepositoryConnector.CMISQueryColon=CMIS Query:
-
-CmisRepositoryConnector.ParametersColon=Parameters:
-CmisRepositoryConnector.UsernameEquals=username=
-CmisRepositoryConnector.PasswordEquals=password=
-CmisRepositoryConnector.BindingEquals=binding=
-CmisRepositoryConnector.ProtocolEquals=protocol=
-CmisRepositoryConnector.ServerEquals=server=
-CmisRepositoryConnector.PortEquals=port=
-CmisRepositoryConnector.PathEquals=path=
-CmisRepositoryConnector.RepositoryIdEquals=repositoryId=
-
-CmisAuthorityConnector.Repository=Repository
-CmisAuthorityConnector.UserMapping=User Mapping
-
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties
deleted file mode 100644
index 7b143b8..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties
+++ /dev/null
@@ -1,60 +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.
-
-CmisAuthorityConnector.Endpoint=Punto final:
-CmisAuthorityConnector.RepositoryID=Identificaciòn de Depósito:
-CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario:
-CmisAuthorityConnector.TheEndpointMustBeNotNull=El punto final no debe ser nulo
-CmisAuthorityConnector.Parameters=Parámetros:
-
-CmisRepositoryConnector.Server=Servidor
-
-CmisRepositoryConnector.BindingColon=Unión:
-CmisRepositoryConnector.UsernameColon=Nombre de usuario:
-CmisRepositoryConnector.PasswordColon=Contraseña:
-CmisRepositoryConnector.ProtocolColon=Protocolo:
-CmisRepositoryConnector.ServerColon=Servidor:
-CmisRepositoryConnector.PortColon=Puerto:
-CmisRepositoryConnector.PathColon=Camino:
-CmisRepositoryConnector.RepositoryIDColon=Identificaciòn de Depósito:
-CmisRepositoryConnector.Optional=(opcional)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=El nombre de usuario no debe ser nulo
-CmisRepositoryConnector.ThePasswordMustNotBeNull=La contraseña no debe ser nulo
-CmisRepositoryConnector.TheBindingMustNotBeNull=La unión no debe ser nulo
-CmisRepositoryConnector.ServerNameMustNotBeNull=Nombre del servidor debe ser no nula
-CmisRepositoryConnector.ServerNameCantContainSlash=Nombre del servidor no puede contener el carácter '/'
-CmisRepositoryConnector.ThePortMustNotBeNull=El puerto debe ser no nula
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=El puerto del servidor debe ser un entero válido
-CmisRepositoryConnector.PathMustNotBeNull=El camino debe ser no nulo
-
-CmisRepositoryConnector.CMISQuery=CMIS consulta
-
-CmisRepositoryConnector.CMISQueryColon=CMIS consulta:
-
-CmisRepositoryConnector.ParametersColon=Parámetros:
-CmisRepositoryConnector.UsernameEquals=nombre de usuario=
-CmisRepositoryConnector.PasswordEquals=Contraseña=
-CmisRepositoryConnector.BindingEquals=Unión=
-CmisRepositoryConnector.ProtocolEquals=protocolo=
-CmisRepositoryConnector.ServerEquals=servidor=
-CmisRepositoryConnector.PortEquals=puerto=
-CmisRepositoryConnector.PathEquals=camino=
-CmisRepositoryConnector.RepositoryIdEquals=Identificaciòn de Depósito=
-
-CmisAuthorityConnector.Repository=Depósito
-CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario
-
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_ja_JP.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_ja_JP.properties
deleted file mode 100644
index efd4cd1..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_ja_JP.properties
+++ /dev/null
@@ -1,58 +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.
-
-CmisAuthorityConnector.Endpoint=エンドポイント:
-CmisAuthorityConnector.RepositoryID=リポジトリID:
-CmisAuthorityConnector.UserMapping=ユーザマッピング:
-CmisAuthorityConnector.TheEndpointMustBeNotNull=エンドポイントがnullです
-CmisAuthorityConnector.Parameters=引数:
-
-CmisRepositoryConnector.Server=サーバ
-
-CmisRepositoryConnector.BindingColon=バインディング:
-CmisRepositoryConnector.UsernameColon=ユーザ名:
-CmisRepositoryConnector.PasswordColon=パスワード:
-CmisRepositoryConnector.ProtocolColon=プロトコル:
-CmisRepositoryConnector.ServerColon=サーバ:
-CmisRepositoryConnector.PortColon=ポート:
-CmisRepositoryConnector.PathColon=パス:
-CmisRepositoryConnector.RepositoryIDColon=リポジトリID:
-CmisRepositoryConnector.Optional=(任意)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=ユーザ名を入力してください
-CmisRepositoryConnector.ThePasswordMustNotBeNull=パスワードを入力してください
-CmisRepositoryConnector.TheBindingMustNotBeNull=バインディングを入力してください
-CmisRepositoryConnector.ServerNameMustNotBeNull=サーバ名を入力してください
-CmisRepositoryConnector.ServerNameCantContainSlash=サーバ名には文字「/」を含めないでください
-CmisRepositoryConnector.ThePortMustNotBeNull=ポート番号を入力してください
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=サーバポートには整数を入力してください
-CmisRepositoryConnector.PathMustNotBeNull=パスを入力してください
-
-CmisRepositoryConnector.CMISQuery=CMISクエリー
-
-CmisRepositoryConnector.CMISQueryColon=CMISクエリー:
-
-CmisRepositoryConnector.ParametersColon=引数:
-CmisRepositoryConnector.UsernameEquals=ユーザ名=
-CmisRepositoryConnector.PasswordEquals=パスワード=
-CmisRepositoryConnector.BindingEquals=バインディング=
-CmisRepositoryConnector.ProtocolEquals=プロトコル=
-CmisRepositoryConnector.ServerEquals=サーバ=
-CmisRepositoryConnector.PortEquals=ポート=
-CmisRepositoryConnector.PathEquals=パス=
-CmisRepositoryConnector.RepositoryIdEquals=リポジトリId=
-
-CmisAuthorityConnector.Repository=リポジトリ
-CmisAuthorityConnector.UserMapping=ユーザマップ
diff --git a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_zh_CN.properties b/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_zh_CN.properties
deleted file mode 100644
index e1f1bd8..0000000
--- a/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_zh_CN.properties
+++ /dev/null
@@ -1,58 +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.
-
-CmisAuthorityConnector.Endpoint=端点: 
-CmisAuthorityConnector.RepositoryID=存储库ID: 
-CmisAuthorityConnector.UserMapping=用户映射: 
-CmisAuthorityConnector.TheEndpointMustBeNotNull=端点不能为Null
-CmisAuthorityConnector.Parameters=参数: 
-
-CmisRepositoryConnector.Server=服务器
-
-CmisRepositoryConnector.BindingColon=绑定: 
-CmisRepositoryConnector.UsernameColon=用户名: 
-CmisRepositoryConnector.PasswordColon=密码: 
-CmisRepositoryConnector.ProtocolColon=协议: 
-CmisRepositoryConnector.ServerColon=服务器: 
-CmisRepositoryConnector.PortColon=端口: 
-CmisRepositoryConnector.PathColon=路径: 
-CmisRepositoryConnector.RepositoryIDColon=存储库ID: 
-CmisRepositoryConnector.Optional=(可选)
-
-CmisRepositoryConnector.TheUsernameMustNotBeNull=请输入用户名
-CmisRepositoryConnector.ThePasswordMustNotBeNull=请输入密码
-CmisRepositoryConnector.TheBindingMustNotBeNull=请输入绑定
-CmisRepositoryConnector.ServerNameMustNotBeNull=请输入服务器名
-CmisRepositoryConnector.ServerNameCantContainSlash=服务器名不能包含‘/’字符
-CmisRepositoryConnector.ThePortMustNotBeNull=请输入端口号
-CmisRepositoryConnector.TheServerPortMustBeValidInteger=服务器端口必须为有效的整数
-CmisRepositoryConnector.PathMustNotBeNull=请输入路径
-
-CmisRepositoryConnector.CMISQuery=CMIS查询
-
-CmisRepositoryConnector.CMISQueryColon=CMIS查询: 
-
-CmisRepositoryConnector.ParametersColon=参数: 
-CmisRepositoryConnector.UsernameEquals=用户名=
-CmisRepositoryConnector.PasswordEquals=密码=
-CmisRepositoryConnector.BindingEquals=绑定=
-CmisRepositoryConnector.ProtocolEquals=协议=
-CmisRepositoryConnector.ServerEquals=服务器=
-CmisRepositoryConnector.PortEquals=端口=
-CmisRepositoryConnector.PathEquals=路径=
-CmisRepositoryConnector.RepositoryIdEquals=存储库ID=
-
-CmisAuthorityConnector.Repository=存储库
-CmisAuthorityConnector.UserMapping=用户映射
diff --git a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editConfiguration.js b/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editConfiguration.js
deleted file mode 100644
index 24b49d1..0000000
--- a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editConfiguration.js
+++ /dev/null
@@ -1,82 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  return true;
-}
- 
-function checkConfigForSave()
-{
-  if (editconnection.username.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.TheUsernameMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.username.focus();
-    return false;
-  }
-  if (editconnection.password.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.ThePasswordMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.password.focus();
-    return false;
-  }
-  if (editconnection.binding.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.TheBindingMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.binding.focus();
-    return false;
-  }
-  if (editconnection.server.value ==""){
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.ServerNameMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.server.focus();
-    return false;
-  }
-  if(editconnection.server.value.indexOf('/')!=-1) {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.ServerNameCantContainSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.server.focus();
-    return false;
-  }
-  if (editconnection.port.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.ThePortMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if (!isInteger(editconnection.port.value)){
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.TheServerPortMustBeValidInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if(editconnection.path.value == ""){
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.PathMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('CmisRepositoryConnector.Server'))");
-    editconnection.path.focus();
-    return false;
-  }
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editConfiguration_Server.html b/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editConfiguration_Server.html
deleted file mode 100644
index 744fced..0000000
--- a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editConfiguration_Server.html
+++ /dev/null
@@ -1,138 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('CmisRepositoryConnector.Server'))
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2">
-      <hr />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.BindingColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <select id="binding" name="binding">
-#if($BINDING == "atom")
-        <option value="atom" selected="selected">AtomPub</option>
-        <option value="ws">Web Services</option>
-#else
-        <option value="atom">AtomPub</option>
-        <option value="ws" selected="selected">Web Services</option>
-#end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.UsernameColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input type="text" id="username" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.PasswordColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input type="password" id="password" name="password" value="$Encoder.attributeEscape($PASSWORD)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.ProtocolColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <select id="protocol" name="protocol">
-#if($PROTOCOL == "https")
-        <option value="http">http</option>
-        <option value="https" selected="selected">https</option>
-#else
-        <option value="http" selected="selected">http</option>
-        <option value="https">https</option>
-#end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.ServerColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="server" name="server" type="text" size="32" value="$Encoder.attributeEscape($SERVER)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.PortColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="port" name="port" type="text" size="5" value="$Encoder.attributeEscape($PORT)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.PathColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="path" name="path" type="text" size="32" value="$Encoder.attributeEscape($PATH)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.RepositoryIDColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input type="text" id="repositoryId" name="repositoryId" value="$Encoder.attributeEscape($REPOSITORYID)" />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.Optional'))
-      </nobr>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-<input type="hidden" name="password" value="$Encoder.attributeEscape($PASSWORD)" />
-<input type="hidden" name="protocol" value="$Encoder.attributeEscape($PROTOCOL)" />
-<input type="hidden" name="server" value="$Encoder.attributeEscape($SERVER)" />
-<input type="hidden" name="port" value="$Encoder.attributeEscape($PORT)" />
-<input type="hidden" name="path" value="$Encoder.attributeEscape($PATH)" />
-<input type="hidden" name="binding" value="$Encoder.attributeEscape($BINDING)" />
-<input type="hidden" name="repositoryId" value="$Encoder.attributeEscape($REPOSITORYID)" />
-
-#end
diff --git a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editSpecification.js b/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editSpecification.js
deleted file mode 100644
index f37efd4..0000000
--- a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editSpecification.js
+++ /dev/null
@@ -1,21 +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.
--->
-
-<script type="text/javascript">
-<!--
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editSpecification_CMISQuery.html b/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editSpecification_CMISQuery.html
deleted file mode 100644
index 3c96631..0000000
--- a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/editSpecification_CMISQuery.html
+++ /dev/null
@@ -1,44 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('CmisRepositoryConnector.CMISQuery') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="3">
-      <hr />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.CMISQueryColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <nobr>
-        <input type="text" size="120" name="s${SEQNUM}_cmisQuery" value="$Encoder.attributeEscape($CMISQUERY)" />
-      </nobr>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SEQNUM}_cmisQuery" value="$Encoder.attributeEscape($CMISQUERY)" />
-
-#end
diff --git a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/viewConfiguration.html b/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/viewConfiguration.html
deleted file mode 100644
index 4c8ce3e..0000000
--- a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/viewConfiguration.html
+++ /dev/null
@@ -1,61 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.ParametersColon'))
-      </nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.UsernameEquals'))$Encoder.bodyEscape($USERNAME)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.PasswordEquals'))********
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.BindingEquals'))$Encoder.bodyEscape($BINDING)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.ProtocolEquals'))$Encoder.bodyEscape($PROTOCOL)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.ServerEquals'))$Encoder.bodyEscape($SERVER)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.PortEquals'))$Encoder.bodyEscape($PORT)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.PathEquals'))$Encoder.bodyEscape($PATH)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.RepositoryIdEquals'))$Encoder.bodyEscape($REPOSITORYID)
-      </nobr>
-      <br />
-    </td>
-  </tr>
-</table>
-
diff --git a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/viewSpecification.html b/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/viewSpecification.html
deleted file mode 100644
index 9c20ebd..0000000
--- a/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/cmis/viewSpecification.html
+++ /dev/null
@@ -1,29 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('CmisRepositoryConnector.CMISQueryColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      $Encoder.bodyEscape($CMISQUERY)
-    </td>
-  </tr>
-</table>
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java
deleted file mode 100644
index 5c04b07..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/* $Id: APISanityIT.java 1234472 2012-01-22 09:59:32Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.chemistry.opencmis.client.api.Document;
-import org.apache.chemistry.opencmis.client.api.Folder;
-import org.apache.chemistry.opencmis.client.api.ItemIterable;
-import org.apache.chemistry.opencmis.client.api.QueryResult;
-import org.apache.chemistry.opencmis.client.api.Session;
-import org.apache.chemistry.opencmis.client.api.SessionFactory;
-import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
-import org.apache.chemistry.opencmis.commons.PropertyIds;
-import org.apache.chemistry.opencmis.commons.SessionParameter;
-import org.apache.chemistry.opencmis.commons.data.ContentStream;
-import org.apache.chemistry.opencmis.commons.enums.BindingType;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
-import org.apache.chemistry.opencmis.commons.spi.ObjectService;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.core.interfaces.Configuration;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.cmis.CmisConfig;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author Piergiorgio Lucidi
- */
-public class APISanityHSQLDBIT extends BaseITHSQLDB
-{
-  private static final String REPLACER = "?";
-  private static final String CMIS_TEST_QUERY_CHANGE_DOC = "SELECT * FROM cmis:document WHERE cmis:name='"+REPLACER+"'";
-  private static final String CMIS_TEST_QUERY = "SELECT * FROM cmis:folder WHERE cmis:name='testdata'";
-    
-  private Session cmisClientSession = null;
-  
-  private Session getCmisClientSession(){
-    // default factory implementation
-    SessionFactory factory = SessionFactoryImpl.newInstance();
-    Map<String, String> parameters = new HashMap<String, String>();
-
-    // user credentials
-    parameters.put(SessionParameter.USER, CmisConfig.USERNAME_DEFAULT_VALUE);
-    parameters.put(SessionParameter.PASSWORD, CmisConfig.PASSWORD_DEFAULT_VALUE);
-
-    // connection settings
-    String endpoint =
-        CmisConfig.PROTOCOL_DEFAULT_VALUE + "://" + 
-        CmisConfig.SERVER_DEFAULT_VALUE + ":" +
-        CmisConfig.PORT_DEFAULT_VALUE + 
-        CmisConfig.PATH_DEFAULT_VALUE;
-    
-    parameters.put(SessionParameter.ATOMPUB_URL, endpoint);
-    parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
-
-    // create session
-    return factory.getRepositories(parameters).get(0).createSession();
-  }
-  
-  public Folder getTestFolder(Session session){
-    Folder testFolder = null;
-    ItemIterable<QueryResult> results = session.query(CMIS_TEST_QUERY, false);
-    for (QueryResult result : results) {
-      String folderId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
-      testFolder = (Folder)session.getObject(folderId);
-    }
-    return testFolder;
-  }
-  
-  public void createNewDocument(Folder folder, String name) throws IOException{
-    // properties 
-    // (minimal set: name and object type id)
-    Map<String, Object> contentProperties = new HashMap<String, Object>();
-    contentProperties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
-    contentProperties.put(PropertyIds.NAME, name);
-  
-    // content
-    String contentString = "CMIS Testdata "+name;
-    byte[] content = contentString.getBytes(StandardCharsets.UTF_8);
-    InputStream stream = new ByteArrayInputStream(content);
-    ContentStream contentStream = new ContentStreamImpl(name, new BigInteger(content), "text/plain", stream);
-  
-    // create a major version
-    folder.createDocument(contentProperties, contentStream, null);
-    stream.close();
-  }
-  
-  /**
-   * change the document content with the new one provided as an argument
-   * @param session
-   * @param name
-   * @param newContent
-   */
-  public void changeDocument(Session session, String name, String newContent){
-    String cmisQuery = StringUtils.replace(CMIS_TEST_QUERY_CHANGE_DOC, REPLACER, name);
-    ItemIterable<QueryResult> results = session.query(cmisQuery, false);
-    String objectId = StringUtils.EMPTY;
-    for (QueryResult result : results) {
-      objectId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
-    }
-
-    byte[] newContentByteArray = newContent.getBytes(StandardCharsets.UTF_8);
-    InputStream stream = new ByteArrayInputStream(newContentByteArray);
-    ContentStream contentStream = new ContentStreamImpl(name, new BigInteger(newContentByteArray), "text/plain", stream);
-    Document documentToUpdate = (Document) session.getObject(objectId);
-    documentToUpdate.setContentStream(contentStream, true);
-  }
-  
-  public void removeDocument(Session session, String name){
-    String cmisQuery = StringUtils.replace(CMIS_TEST_QUERY_CHANGE_DOC, REPLACER, name);
-    ItemIterable<QueryResult> results = session.query(cmisQuery, false);
-    String objectId = StringUtils.EMPTY;
-    for (QueryResult result : results) {
-      objectId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
-    }
-    String repositoryId = session.getRepositoryInfo().getId();
-    ObjectService objectService = session.getBinding().getObjectService();
-    objectService.deleteObject(repositoryId, objectId, true, null);
-  }
-  
-  @Before
-  public void createTestArea()
-    throws Exception
-  {
-    try
-    {
-      cmisClientSession = getCmisClientSession();
-
-      //creating a new folder
-      Folder root = cmisClientSession.getRootFolder();
-      
-      ItemIterable<QueryResult> results = cmisClientSession.query(CMIS_TEST_QUERY, false);
-      for (QueryResult result : results) {
-         String repositoryId = cmisClientSession.getRepositoryInfo().getId();
-        String folderId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
-        cmisClientSession.getBinding().getObjectService().deleteTree(repositoryId, folderId, true, null, false, null);
-      }
-
-      Map<String, Object> folderProperties = new HashMap<String, Object>();
-      folderProperties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:folder");
-      folderProperties.put(PropertyIds.NAME, "testdata");
-  
-      Folder newFolder = root.createFolder(folderProperties);
-
-      String name = "testdata1.txt";
-      createNewDocument(newFolder, name);
-      
-      name = "testdata2.txt";
-      createNewDocument(newFolder,name);
-      
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  @After
-  public void removeTestArea()
-    throws Exception
-  {
-    // we don't need to remove anything
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    try
-    {
-      
-      int i;
-
-      // Create a basic file system connection, and save it.
-      ConfigurationNode connectionObject;
-      ConfigurationNode child;
-      Configuration requestObject;
-      Configuration result;
-      
-      connectionObject = new ConfigurationNode("repositoryconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("CMIS Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("CMIS Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("10");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("configuration");
-      
-      //CMIS Repository Connector parameters
-      
-      //binding
-      ConfigurationNode cmisBindingNode = new ConfigurationNode("_PARAMETER_");
-      cmisBindingNode.setAttribute("name", CmisConfig.BINDING_PARAM);
-      cmisBindingNode.setValue(CmisConfig.BINDING_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisBindingNode);
-      
-      //username
-      ConfigurationNode cmisUsernameNode = new ConfigurationNode("_PARAMETER_");
-      cmisUsernameNode.setAttribute("name", CmisConfig.USERNAME_PARAM);
-      cmisUsernameNode.setValue(CmisConfig.USERNAME_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisUsernameNode);
-      
-      //password
-      ConfigurationNode cmisPasswordNode = new ConfigurationNode("_PARAMETER_");
-      cmisPasswordNode.setAttribute("name", CmisConfig.PASSWORD_PARAM);
-      cmisPasswordNode.setValue(CmisConfig.PASSWORD_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisPasswordNode);
-      
-      //protocol
-      ConfigurationNode cmisProtocolNode = new ConfigurationNode("_PARAMETER_");
-      cmisProtocolNode.setAttribute("name", CmisConfig.PROTOCOL_PARAM);
-      cmisProtocolNode.setValue(CmisConfig.PROTOCOL_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisProtocolNode);
-      
-      //server
-      ConfigurationNode cmisServerNode = new ConfigurationNode("_PARAMETER_");
-      cmisServerNode.setAttribute("name", CmisConfig.SERVER_PARAM);
-      cmisServerNode.setValue(CmisConfig.SERVER_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisServerNode);
-      
-      //port
-      ConfigurationNode cmisPortNode = new ConfigurationNode("_PARAMETER_");
-      cmisPortNode.setAttribute("name", CmisConfig.PORT_PARAM);
-      cmisPortNode.setValue(CmisConfig.PORT_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisPortNode);
-      
-      //path
-      ConfigurationNode cmisPathNode = new ConfigurationNode("_PARAMETER_");
-      cmisPathNode.setAttribute("name", CmisConfig.PATH_PARAM);
-      cmisPathNode.setValue(CmisConfig.PATH_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisPathNode);
-      
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("repositoryconnections/CMIS%20Connection",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-      
-      // Create a basic null output connection, and save it.
-      connectionObject = new ConfigurationNode("outputconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("Null Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Null Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("100");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("outputconnections/Null%20Connection",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-
-      // Create a job.
-      ConfigurationNode jobObject = new ConfigurationNode("job");
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Test Job");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("repository_connection");
-      child.setValue("CMIS Connection");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      // Revamped way of adding output connection
-      child = new ConfigurationNode("pipelinestage");
-      ConfigurationNode pipelineChild = new ConfigurationNode("stage_id");
-      pipelineChild.setValue("0");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_isoutput");
-      pipelineChild.setValue("true");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_connectionname");
-      pipelineChild.setValue("Null Connection");
-      child.addChild(child.getChildCount(),pipelineChild);
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("run_mode");
-      child.setValue("scan once");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("start_mode");
-      child.setValue("manual");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("hopcount_mode");
-      child.setValue("accurate");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("document_specification");
-      
-      
-      //Job configuration
-      ConfigurationNode sn = new ConfigurationNode("startpoint");
-      sn.setAttribute("cmisQuery",CMIS_TEST_QUERY);
-      
-      child.addChild(child.getChildCount(),sn);
-      jobObject.addChild(jobObject.getChildCount(),child);
-      
-      requestObject = new Configuration();
-      requestObject.addChild(0,jobObject);
-      
-      result = performAPIPostOperationViaNodes("jobs",201,requestObject);
-      
-      String jobIDString = null;
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-        else if (resultNode.getType().equals("job_id"))
-          jobIDString = resultNode.getValue();
-      }
-      if (jobIDString == null)
-        throw new Exception("Missing job_id from return!");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      long count;
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 3)
-        throw new ManifoldCFException("Wrong number of documents processed - expected 3, saw "+new Long(count).toString());
-      
-      // Add a file and recrawl
-      Folder testFolder = getTestFolder(cmisClientSession);
-      createNewDocument(testFolder, "testdata3.txt");
-      createNewDocument(testFolder, "testdata4.txt");
-
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // The test data area has 4 documents and one directory, and we have to count the root directory too.
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 5)
-        throw new ManifoldCFException("Wrong number of documents processed after add - expected 5, saw "+new Long(count).toString());
-
-      // Change a document, and recrawl
-      changeDocument(cmisClientSession,"testdata1.txt","MODIFIED - CMIS Testdata - MODIFIED");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // The test data area has 4 documents and one directory, and we have to count the root directory too.
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 5)
-        throw new ManifoldCFException("Wrong number of documents processed after change - expected 5, saw "+new Long(count).toString());
-      
-      // We also need to make sure the new document was indexed.  Have to think about how to do this though.
-      // MHL
-      //System.out.println("Starting delete...");
-      // Delete a file, and recrawl
-      removeDocument(cmisClientSession, "testdata2.txt");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      count = getJobDocumentsProcessed(jobIDString);
-      /* NOTE WELL: this no longer works after upgrade to CMIS 1 !!
-      if (count != 4)
-        throw new ManifoldCFException("Wrong number of documents processed after delete - expected 4, saw "+new Long(count).toString());
-      */
-      
-      // Now, delete the job.
-      deleteJob(jobIDString);
-
-      waitJobDeleted(jobIDString, 120000L);
-      
-      // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  protected void startJob(String jobIDString)
-    throws Exception
-  {
-    Configuration requestObject = new Configuration();
-    
-    Configuration result = performAPIPutOperationViaNodes("start/"+jobIDString,201,requestObject);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-  }
-  
-  protected void deleteJob(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIDeleteOperationViaNodes("jobs/"+jobIDString,200);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-
-  }
-  
-  protected String getJobStatus(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String status = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("status"))
-            status = childNode.getValue();
-        }
-      }
-    }
-    return status;
-  }
-
-  protected long getJobDocumentsProcessed(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String documentsProcessed = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("documents_processed"))
-            documentsProcessed = childNode.getValue();
-        }
-      }
-    }
-    if (documentsProcessed == null)
-      throw new Exception("Expected a documents_processed field, didn't find it");
-    return new Long(documentsProcessed).longValue();
-  }
-
-  protected void waitJobInactive(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        throw new Exception("No such job: '"+jobIDString+"'");
-      if (status.equals("not yet run"))
-        throw new Exception("Job was never started.");
-      if (status.equals("done"))
-        return;
-      if (status.equals("error"))
-        throw new Exception("Job reports error.");
-      ManifoldCF.sleep(1000L);
-      continue;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-  
-  protected void waitJobDeleted(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        return;
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-    
-
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseHSQLDB.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseHSQLDB.java
deleted file mode 100644
index e58cd7b..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"CMIS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseITHSQLDB.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseITHSQLDB.java
deleted file mode 100644
index 671a1e4..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id: BaseDerby.java 1225812 2011-30-12 13:08:38Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import org.junit.After;
-import org.junit.Before;
-
-/** Tests that run the "agents daemon" should be derived from this 
- * 
- *  @author Piergiorgio Lucidi
- * 
- * */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected CMISServer cmisServer = null;
-
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"CMIS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  // Setup/teardown
-  
-  @Before
-  public void setUpCMIS()
-    throws Exception
-  {
-    String openCmisServerWarPath = "../../../lib/chemistry-opencmis-server-inmemory.war";
-
-    if (System.getProperty("openCmisServerWarPath") != null)
-      openCmisServerWarPath = System.getProperty("openCmisServerWarPath");
-
-    cmisServer = new CMISServer(9090, openCmisServerWarPath);
-    cmisServer.start();
-  }
-  
-  @After
-  public void cleanUpCMIS()
-    throws Exception
-  {
-    cmisServer.stop();
-  }
-  
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BasePostgresql.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BasePostgresql.java
deleted file mode 100644
index 61a4b37..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BasePostgresql.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"CMIS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseUIHSQLDB.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 3142870..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"CMIS Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-  protected String[] getAuthorityClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.authorities.authorities.cmis.CmisAuthorityConnector"};
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[]{"CMIS authority"};
-  }
-
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/CMISServer.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/CMISServer.java
deleted file mode 100644
index 6fbd2dd..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/CMISServer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.webapp.WebAppContext;
-
-/** Class representing an instance of CMIS Server
- */
-public class CMISServer
-{
-  protected Server cmisServer = null;
-  protected WebAppContext openCmisServerApi = null;
-  
-  public CMISServer(int port, String warPath)
-  {
-    cmisServer = new Server(port);
-    cmisServer.setStopAtShutdown(true);
-
-    //Initialize OpenCMIS Server bindings
-    ContextHandlerCollection contexts = new ContextHandlerCollection();
-    cmisServer.setHandler(contexts);
-
-    openCmisServerApi = new WebAppContext(warPath,"/chemistry-opencmis-server-inmemory");
-    openCmisServerApi.setParentLoaderPriority(false);
-    contexts.addHandler(openCmisServerApi);
-  }
-  
-  public void start()
-    throws Exception
-  {
-    cmisServer.start();
-    boolean entered = false;
-    
-    while(cmisServer.isStarted() 
-        && openCmisServerApi.isStarted()
-        && !entered){
-      entered = true;
-      Thread.sleep(5000);
-    }
-  }
-  
-  public void stop()
-    throws Exception
-  {
-  }
-
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/CheckObjectIDTest.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/CheckObjectIDTest.java
deleted file mode 100644
index 61d5e66..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/CheckObjectIDTest.java
+++ /dev/null
@@ -1,34 +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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnectorUtils;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class CheckObjectIDTest {
-
-  @Ignore
-  @Test
-  public void testSimple() {
-    String cmisQuery = " select cmis:name from cmis:folder where cmis:name='Colacem'";
-    cmisQuery = CmisRepositoryConnectorUtils.getCmisQueryWithObjectId(cmisQuery);
-    System.out.println(cmisQuery);
-    System.exit(0);
-  }
-  
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/NavigationHSQLDBUI.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 2f24dfa..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import java.util.Locale;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-import org.junit.Test;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Add an authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButton("Add a new authority group");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("groupname");
-    testerInstance.setValue("groupname","MyAuthorityGroup");
-
-    // Save the authority group
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Add an authority
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButton("Add a new connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyAuthorityConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.authorities.authorities.cmis.CmisAuthorityConnector");
-    testerInstance.selectValue("authoritygroup", "MyAuthorityGroup");
-    testerInstance.clickButton("Continue");
-    
-    // Now, save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector");
-    testerInstance.selectValue("authorityname", "MyAuthorityGroup");
-    testerInstance.clickButton("Continue");
-
-    // Server tab
-    testerInstance.clickTab("Server");
-    testerInstance.setValue("username", "foo");
-    testerInstance.setValue("password", "bar");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the authority connection
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityGroup");
-    testerInstance.acceptAlert();
-  }
-  
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/SanityHSQLDBTest.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/SanityHSQLDBTest.java
deleted file mode 100644
index 0e44733..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import org.junit.Test;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/SanityPostgresqlTest.java b/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/SanityPostgresqlTest.java
deleted file mode 100644
index 6c6d610..0000000
--- a/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.cmis.tests;
-
-import org.junit.Test;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/cmis/pom.xml b/connectors/cmis/pom.xml
deleted file mode 100644
index 775eb41..0000000
--- a/connectors/cmis/pom.xml
+++ /dev/null
@@ -1,438 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <developers>
-    <developer>
-      <name>Piergiorgio Lucidi</name>
-      <organization>Sourcesense</organization>
-      <organizationUrl>http://www.sourcesense.com</organizationUrl>
-      <url>http://www.open4dev.com</url>
-    </developer>
-  </developers>
-  
-  <artifactId>mcf-cmis-connector</artifactId>
-  <name>ManifoldCF - Connectors - CMIS</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>org.apache.chemistry.opencmis</groupId>
-                  <artifactId>chemistry-opencmis-server-inmemory</artifactId>
-                  <version>0.13.0</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>chemistry-opencmis-server-inmemory.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-            <openCmisServerWarPath>../dependency/chemistry-opencmis-server-inmemory.war</openCmisServerWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-    <pluginManagement>
-    	<plugins>
-    		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
-    		<plugin>
-    			<groupId>org.eclipse.m2e</groupId>
-    			<artifactId>lifecycle-mapping</artifactId>
-    			<version>1.0.0</version>
-    			<configuration>
-    				<lifecycleMappingMetadata>
-    					<pluginExecutions>
-    						<pluginExecution>
-    							<pluginExecutionFilter>
-    								<groupId>org.codehaus.mojo</groupId>
-    								<artifactId>
-    									native2ascii-maven-plugin
-    								</artifactId>
-    								<versionRange>
-    									[1.0-beta-1,)
-    								</versionRange>
-    								<goals>
-    									<goal>native2ascii</goal>
-    								</goals>
-    							</pluginExecutionFilter>
-    							<action>
-    								<ignore></ignore>
-    							</action>
-    						</pluginExecution>
-    					</pluginExecutions>
-    				</lifecycleMappingMetadata>
-    			</configuration>
-    		</plugin>
-    	</plugins>
-    </pluginManagement>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.chemistry.opencmis</groupId>
-        <artifactId>chemistry-opencmis-client-impl</artifactId>
-        <version>1.1.0</version>
-     </dependency>
-     <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>2.6</version>
-    </dependency>
-     <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>${commons-io.version}</version>
-    </dependency>
-    <dependency>
-		  <groupId>joda-time</groupId>
-		  <artifactId>joda-time</artifactId>
-		  <version>2.8.1</version>
-    </dependency>
-    
-    <!-- Test scope -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.chemistry.opencmis</groupId>
-      <artifactId>chemistry-opencmis-server-inmemory</artifactId>
-      <version>0.13.0</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/cmis/test-materials/README.txt b/connectors/cmis/test-materials/README.txt
deleted file mode 100644
index 293a813..0000000
--- a/connectors/cmis/test-materials/README.txt
+++ /dev/null
@@ -1,19 +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.
-
-To test this connector, copy the Apache Chemistry in-memory war file into
-lthis directory, and use the "ant test" target for the standard ant build.
-You can read more about the process on the "how-to-build-and-deploy.html"
-documentation page.
diff --git a/connectors/confluence/.gitignore b/connectors/confluence/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/confluence/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/confluence/build.xml b/connectors/confluence/build.xml
deleted file mode 100644
index 131a543..0000000
--- a/connectors/confluence/build.xml
+++ /dev/null
@@ -1,52 +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.
--->
-
-<project name="confluence" default="all">
-
-  <property environment="env" />
-  <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-    <isset property="env.MCFDISTPATH" />
-  </condition>
-  <property name="abs-dist" location="../../dist" />
-  <condition property="mcf-dist" value="${abs-dist}">
-    <not>
-      <isset property="env.MCFDISTPATH" />
-    </not>
-  </condition>
-
-  <import file="${mcf-dist}/connector-build.xml" />
-
-  <path id="connector-classpath">
-    <path refid="mcf-connector-build.connector-classpath" />
-    <fileset dir="../../lib">
-      <include name="httpcore*.jar" />
-      <include name="httpclient*.jar" />
-    </fileset>
-  </path>
-
-  <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-    <antcall target="general-add-repository-connector">
-      <param name="connector-label" value="Confluence" />
-      <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.confluence.ConfluenceRepositoryConnector" />
-    </antcall>
-    <antcall target="general-add-authority-connector">
-      <param name="connector-label" value="Confluence" />
-      <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.confluence.ConfluenceAuthorityConnector" />
-    </antcall>
-  </target>
-
-</project>
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/confluence/ConfluenceAuthorityConnector.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/confluence/ConfluenceAuthorityConnector.java
deleted file mode 100644
index 99b23cc..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/confluence/ConfluenceAuthorityConnector.java
+++ /dev/null
@@ -1,455 +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 org.apache.manifoldcf.authorities.authorities.confluence;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.confluence.ConfluenceConfiguration;
-import org.apache.manifoldcf.crawler.connectors.confluence.client.ConfluenceClient;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceUser;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <p>
- * Confluence Authority Connector class
- * </p>
- * <p>
- * ManifoldCF Authority connector to deal with Confluence documents
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class ConfluenceAuthorityConnector extends BaseAuthorityConnector {
-
-  /*
-   * Prefix for Confluence configuration and specification parameters
-   */
-  private static final String PARAMETER_PREFIX = "confluence_";
-
-  /* Configuration tabs */
-  private static final String CONF_SERVER_TAB_PROPERTY = "ConfluenceAuthorityConnector.Server";
-
-  // pages & js
-  // Template names for Confluence configuration
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_conf.js";
-  /**
-   * Server tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_conf_server.html";
-
-  /**
-   * Forward to the HTML template to view the configuration parameters
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_conf.html";
-
-
-  private Logger logger = LoggerFactory
-      .getLogger(ConfluenceAuthorityConnector.class);
-
-  /* Confluence instance parameters */
-  protected String protocol = null;
-  protected String host = null;
-  protected String port = null;
-  protected String path = null;
-  protected String username = null;
-  protected String password = null;
-
-  protected ConfluenceClient confluenceClient = null;
-
-  /**
-   * <p>
-   * Default constructor
-   * </p>
-   */
-  public ConfluenceAuthorityConnector() {
-    super();
-  }
-  
-  /**
-   * Used Mainly for testing
-   * 
-   * @param client Injected Confluence Client
-   */
-  public void setConfluenceClient(ConfluenceClient client){
-    this.confluenceClient = client;
-  }
-
-  
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (confluenceClient != null) {
-      confluenceClient = null;
-    }
-
-    protocol = null;
-    host = null;
-    port = null;
-    path = null;
-    username = null;
-    password = null;
-
-  }
-
-  /**
-   * Makes connection to server
-   * 
-   * 
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    protocol = params.getParameter(ConfluenceConfiguration.Server.PROTOCOL);
-    host = params.getParameter(ConfluenceConfiguration.Server.HOST);
-    port = params.getParameter(ConfluenceConfiguration.Server.PORT);
-    path = params.getParameter(ConfluenceConfiguration.Server.PATH);
-    username = params.getParameter(ConfluenceConfiguration.Server.USERNAME);
-    password = params
-        .getObfuscatedParameter(ConfluenceConfiguration.Server.PASSWORD);
-
-    try {
-      initConfluenceClient();
-    } catch (ManifoldCFException e) {
-      logger.debug(
-          "Not possible to initialize Confluence client. Reason: {}",
-          e.getMessage());
-    }
-  }
-
-  /**
-   * Checks if connection is available
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      if (!isConnected()) {
-        initConfluenceClient();
-      }
-      Boolean result = confluenceClient.checkAuth();
-      if (result)
-        return super.check();
-      else
-        throw new ManifoldCFException(
-            "Confluence instance could not be reached");
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    } catch (Exception e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /**
-   * <p>
-   * Initialize Confluence client using the configured parameters
-   * 
-   * @throws ManifoldCFException
-   */
-  protected void initConfluenceClient() throws ManifoldCFException {
-    if (confluenceClient == null) {
-
-      if (StringUtils.isEmpty(protocol)) {
-        throw new ManifoldCFException("Parameter "
-            + ConfluenceConfiguration.Server.PROTOCOL
-            + " required but not set");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("Confluence protocol = '" + protocol
-            + "'");
-      }
-
-      if (StringUtils.isEmpty(host)) {
-        throw new ManifoldCFException("Parameter "
-            + ConfluenceConfiguration.Server.HOST
-            + " required but not set");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("Confluence host = '" + host + "'");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("Confluence port = '" + port + "'");
-      }
-
-      if (StringUtils.isEmpty(path)) {
-        throw new ManifoldCFException("Parameter "
-            + ConfluenceConfiguration.Server.PATH
-            + " required but not set");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("Confluence path = '" + path + "'");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("Confluence username = '" + username
-            + "'");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors
-            .debug("Confluence password '" + password != null ? "set"
-                : "not set" + "'");
-      }
-
-      int portInt;
-      if (port != null && port.length() > 0) {
-        try {
-          portInt = Integer.parseInt(port);
-        } catch (NumberFormatException e) {
-          throw new ManifoldCFException("Bad number: "
-              + e.getMessage(), e);
-        }
-      } else {
-        if (protocol.toLowerCase(Locale.ROOT).equals("http"))
-          portInt = 80;
-        else
-          portInt = 443;
-      }
-
-      /* Generating a client to perform Confluence requests */
-      confluenceClient = new ConfluenceClient(protocol, host, portInt,
-          path, username, password);
-    }
-
-  }
-
-  /**
-   * This method is called to assess whether to count this connector instance
-   * should actually be counted as being connected.
-   *
-   * @return true if the connector instance is actually connected.
-   */
-  @Override
-  public boolean isConnected() {
-    return confluenceClient != null;
-  }
-
-
-  private void fillInServerConfigurationMap(Map<String, String> serverMap,
-      IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String confluenceProtocol = parameters
-        .getParameter(ConfluenceConfiguration.Server.PROTOCOL);
-    String confluenceHost = parameters
-        .getParameter(ConfluenceConfiguration.Server.HOST);
-    String confluencePort = parameters
-        .getParameter(ConfluenceConfiguration.Server.PORT);
-    String confluencePath = parameters
-        .getParameter(ConfluenceConfiguration.Server.PATH);
-    String confluenceUsername = parameters
-        .getParameter(ConfluenceConfiguration.Server.USERNAME);
-    String confluencePassword = parameters
-        .getObfuscatedParameter(ConfluenceConfiguration.Server.PASSWORD);
-
-    if (confluenceProtocol == null)
-      confluenceProtocol = ConfluenceConfiguration.Server.PROTOCOL_DEFAULT_VALUE;
-    if (confluenceHost == null)
-      confluenceHost = ConfluenceConfiguration.Server.HOST_DEFAULT_VALUE;
-    if (confluencePort == null)
-      confluencePort = ConfluenceConfiguration.Server.PORT_DEFAULT_VALUE;
-    if (confluencePath == null)
-      confluencePath = ConfluenceConfiguration.Server.PATH_DEFAULT_VALUE;
-
-    if (confluenceUsername == null)
-      confluenceUsername = ConfluenceConfiguration.Server.USERNAME_DEFAULT_VALUE;
-    if (confluencePassword == null)
-      confluencePassword = ConfluenceConfiguration.Server.PASSWORD_DEFAULT_VALUE;
-    else
-      confluencePassword = mapper.mapPasswordToKey(confluencePassword);
-
-    serverMap.put(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PROTOCOL, confluenceProtocol);
-    serverMap.put(PARAMETER_PREFIX + ConfluenceConfiguration.Server.HOST,
-        confluenceHost);
-    serverMap.put(PARAMETER_PREFIX + ConfluenceConfiguration.Server.PORT,
-        confluencePort);
-    serverMap.put(PARAMETER_PREFIX + ConfluenceConfiguration.Server.PATH,
-        confluencePath);
-    serverMap.put(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.USERNAME, confluenceUsername);
-    serverMap.put(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PASSWORD, confluencePassword);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    /* Fill server configuration parameters */
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD,
-        paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, CONF_SERVER_TAB_PROPERTY));
-    // Map the parameters
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    /* Fill server configuration parameters */
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_CONFIG_HEADER_FORWARD, paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      String tabName) throws ManifoldCFException, IOException {
-
-    // Call the Velocity templates for each tab
-    Map<String, String> paramMap = new HashMap<String, String>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_CONFIG_FORWARD_SERVER, paramMap, true);
-
-  }
-
-  /*
-   * Repository specification post handle, (server and proxy & client secret
-   * etc)
-   * 
-   * @see
-   * org.apache.manifoldcf.core.connector.BaseConnector#processConfigurationPost
-   * (org.apache.manifoldcf.core.interfaces.IThreadContext,
-   * org.apache.manifoldcf.core.interfaces.IPostParameters,
-   * org.apache.manifoldcf.core.interfaces.ConfigParams)
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, ConfigParams parameters)
-      throws ManifoldCFException {
-
-    String confluenceProtocol = variableContext
-        .getParameter(PARAMETER_PREFIX
-            + ConfluenceConfiguration.Server.PROTOCOL);
-    if (confluenceProtocol != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.PROTOCOL,
-          confluenceProtocol);
-
-    String confluenceHost = variableContext.getParameter(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.HOST);
-    if (confluenceHost != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.HOST,
-          confluenceHost);
-
-    String confluencePort = variableContext.getParameter(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PORT);
-    if (confluencePort != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.PORT,
-          confluencePort);
-
-    String confluencePath = variableContext.getParameter(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PATH);
-    if (confluencePath != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.PATH,
-          confluencePath);
-
-    String confluenceUsername = variableContext
-        .getParameter(PARAMETER_PREFIX
-            + ConfluenceConfiguration.Server.USERNAME);
-    if (confluenceUsername != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.USERNAME,
-          confluenceUsername);
-
-    String confluencePassword = variableContext
-        .getParameter(PARAMETER_PREFIX
-            + ConfluenceConfiguration.Server.PASSWORD);
-    if (confluencePassword != null)
-      parameters.setObfuscatedParameter(
-          ConfluenceConfiguration.Server.PASSWORD,
-          variableContext.mapKeyToPassword(confluencePassword));
-
-    /* null means process configuration has been successful */
-    return null;
-  }
-  
-    /*
-     * (non-Javadoc)
-     * @see org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector#getDefaultAuthorizationResponse(java.lang.String)
-     */
-    @Override
-    public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-      return RESPONSE_UNREACHABLE;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector#getAuthorizationResponse(java.lang.String)
-     */
-    @Override
-    public AuthorizationResponse getAuthorizationResponse(String userName)
-        throws ManifoldCFException {
-      try {
-        ConfluenceUser confluenceUser = confluenceClient.getUserAuthorities(userName);
-        if (confluenceUser.getUsername() == null
-            || confluenceUser.getUsername().isEmpty()
-            || confluenceUser.getAuthorities().isEmpty())
-          return RESPONSE_USERNOTFOUND;
-        else
-          return new AuthorizationResponse(
-              confluenceUser.getAuthorities().toArray(new String[confluenceUser.getAuthorities().size()]),
-              AuthorizationResponse.RESPONSE_OK);
-      } catch (Exception e) {
-        return RESPONSE_UNREACHABLE;
-      }
-    }
-
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/confluence/Messages.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/confluence/Messages.java
deleted file mode 100644
index 2b305f5..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/confluence/Messages.java
+++ /dev/null
@@ -1,149 +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 org.apache.manifoldcf.authorities.authorities.confluence;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-/**
- * <p>Messages class</p>
- * <p>Class used to render templates along with specific values</p>
- * <p>Also used to get messages for specific Locales</p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.confluence.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.confluence";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/ConfluenceConfiguration.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/ConfluenceConfiguration.java
deleted file mode 100644
index 5fbcc4a..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/ConfluenceConfiguration.java
+++ /dev/null
@@ -1,58 +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 org.apache.manifoldcf.crawler.connectors.confluence;
-
-/**
- * <p>
- * ConfluenceConfiguration class
- * </p>
- * <p>
- * Class used to keep configuration parameters for Confluence repository connection
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class ConfluenceConfiguration {
-
-  public static interface Server {
-    public static final String USERNAME = "username";
-    public static final String PASSWORD = "password";
-    public static final String PROTOCOL = "protocol";
-    public static final String HOST = "host";
-    public static final String PORT = "port";
-    public static final String PATH = "path";
-    
-    public static final String PROTOCOL_DEFAULT_VALUE = "http";
-    public static final String HOST_DEFAULT_VALUE = "";
-    public static final String PORT_DEFAULT_VALUE = "8090";
-    public static final String PATH_DEFAULT_VALUE = "/confluence";
-    public static final String USERNAME_DEFAULT_VALUE = "";
-    public static final String PASSWORD_DEFAULT_VALUE = "";
-  }
-
-  public static interface Specification {
-    public static final String SPACES = "spaces";
-    public static final String SPACE = "space";
-    public static final String SPACE_KEY_ATTRIBUTE = "key";
-    public static final String PAGES = "pages";
-    public static final String PROCESS_ATTACHMENTS_ATTRIBUTE_KEY = "process_attachments";
-    
-  }
-  
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/ConfluenceRepositoryConnector.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/ConfluenceRepositoryConnector.java
deleted file mode 100644
index 6902ec4..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/ConfluenceRepositoryConnector.java
+++ /dev/null
@@ -1,1261 +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 org.apache.manifoldcf.crawler.connectors.confluence;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.text.DateFormat;
-import java.text.MessageFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.connectors.confluence.client.ConfluenceClient;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Attachment;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceResponse;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Page;
-import org.apache.manifoldcf.crawler.connectors.confluence.util.ConfluenceUtil;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * <p>
- * Confluence Repository Connector class
- * </p>
- * <p>
- * ManifoldCF Repository connector to deal with Confluence documents
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class ConfluenceRepositoryConnector extends BaseRepositoryConnector {
-
-  protected final static String ACTIVITY_READ = "read document";
-
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;
-
-  /*
-   * Prefix for Confluence configuration and specification parameters
-   */
-  private static final String PARAMETER_PREFIX = "confluence_";
-
-  /* Configuration tabs */
-  private static final String CONF_SERVER_TAB_PROPERTY = "ConfluenceRepositoryConnector.Server";
-
-  /* Specification tabs */
-  private static final String CONF_SPACES_TAB_PROPERTY = "ConfluenceRepositoryConnector.Spaces";
-  private static final String CONF_PAGES_TAB_PROPERTY = "ConfluenceRepositoryConnector.Pages";
-
-  // pages & js
-  // Template names for Confluence configuration
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_conf.js";
-  /**
-   * Server tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_conf_server.html";
-
-  /**
-   * Forward to the HTML template to view the configuration parameters
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_conf.html";
-
-  // Template names for Confluence job specification
-  /**
-   * Forward to the javascript to check the specification parameters for the
-   * job
-   */
-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification_conf.js";
-  /**
-   * Forward to the template to edit the spaces for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_SPACES = "editSpecification_confSpaces.html";
-
-  /**
-   * Forward to the template to edit the pages configuration for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_CONF_PAGES = "editSpecification_confPages.html";
-
-  /**
-   * Forward to the template to view the specification parameters for the job
-   */
-  private static final String VIEW_SPEC_FORWARD = "viewSpecification_conf.html";
-
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-
-  protected final static long interruptionRetryTime = 5L * 60L * 1000L;
-
-  private Logger logger = LoggerFactory
-      .getLogger(ConfluenceRepositoryConnector.class);
-
-  /* Confluence instance parameters */
-  protected String protocol = null;
-  protected String host = null;
-  protected String port = null;
-  protected String path = null;
-  protected String username = null;
-  protected String password = null;
-
-  protected ConfluenceClient confluenceClient = null;
-
-  /**
-   * <p>
-   * Default constructor
-   * </p>
-   */
-  public ConfluenceRepositoryConnector() {
-    super();
-  }
-  
-  /**
-   * Set Confluence Client (Mainly for Testing)
-   * 
-   * @param confluenceClient
-   */
-  public void setConfluenceClient(ConfluenceClient confluenceClient){
-    this.confluenceClient = confluenceClient;
-  }
-
-  @Override
-  public String[] getActivitiesList() {
-    return new String[] { ACTIVITY_READ };
-  }
-
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[] { host };
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (confluenceClient != null) {
-      confluenceClient = null;
-    }
-
-    protocol = null;
-    host = null;
-    port = null;
-    path = null;
-    username = null;
-    password = null;
-
-  }
-
-  /**
-   * Makes connection to server
-   * 
-   * 
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    protocol = params.getParameter(ConfluenceConfiguration.Server.PROTOCOL);
-    host = params.getParameter(ConfluenceConfiguration.Server.HOST);
-    port = params.getParameter(ConfluenceConfiguration.Server.PORT);
-    path = params.getParameter(ConfluenceConfiguration.Server.PATH);
-    username = params.getParameter(ConfluenceConfiguration.Server.USERNAME);
-    password = params
-        .getObfuscatedParameter(ConfluenceConfiguration.Server.PASSWORD);
-
-    try {
-      initConfluenceClient();
-    } catch (ManifoldCFException e) {
-      logger.debug(
-          "Not possible to initialize Confluence client. Reason: {}",
-          e.getMessage());
-      e.printStackTrace();
-    }
-  }
-
-  /**
-   * Checks if connection is available
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      if (!isConnected()) {
-        initConfluenceClient();
-      }
-      Boolean result = confluenceClient.check();
-      if (result)
-        return super.check();
-      else
-        throw new ManifoldCFException(
-            "Confluence instance could not be reached");
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    } catch (Exception e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /**
-   * <p>
-   * Initialize Confluence client using the configured parameters
-   * 
-   * @throws ManifoldCFException
-   */
-  protected void initConfluenceClient() throws ManifoldCFException {
-    if (confluenceClient == null) {
-
-      if (StringUtils.isEmpty(protocol)) {
-        throw new ManifoldCFException("Parameter "
-            + ConfluenceConfiguration.Server.PROTOCOL
-            + " required but not set");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("Confluence protocol = '" + protocol
-            + "'");
-      }
-
-      if (StringUtils.isEmpty(host)) {
-        throw new ManifoldCFException("Parameter "
-            + ConfluenceConfiguration.Server.HOST
-            + " required but not set");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("Confluence host = '" + host + "'");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("Confluence port = '" + port + "'");
-      }
-
-//      if (StringUtils.isEmpty(path)) {
-//        throw new ManifoldCFException("Parameter "
-//            + ConfluenceConfiguration.Server.PATH
-//            + " required but not set");
-//      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("Confluence path = '" + path + "'");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("Confluence username = '" + username
-            + "'");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors
-            .debug("Confluence password '" + password != null ? "set"
-                : "not set" + "'");
-      }
-
-      int portInt;
-      if (port != null && port.length() > 0) {
-        try {
-          portInt = Integer.parseInt(port);
-        } catch (NumberFormatException e) {
-          throw new ManifoldCFException("Bad number: "
-              + e.getMessage(), e);
-        }
-      } else {
-        if (protocol.toLowerCase(Locale.ROOT).equals("http"))
-          portInt = 80;
-        else
-          portInt = 443;
-      }
-
-      /* Generating a client to perform Confluence requests */
-      confluenceClient = new ConfluenceClient(protocol, host, portInt,
-          path, username, password);
-      lastSessionFetch = System.currentTimeMillis();
-    }
-
-  }
-
-  /**
-   * This method is called to assess whether to count this connector instance
-   * should actually be counted as being connected.
-   *
-   * @return true if the connector instance is actually connected.
-   */
-  @Override
-  public boolean isConnected() {
-    return confluenceClient != null;
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      confluenceClient.close();
-      confluenceClient = null;
-      lastSessionFetch = -1L;
-    }
-  }
-
-  @Override
-  public int getMaxDocumentRequest() {
-    return super.getMaxDocumentRequest();
-  }
-
-  /**
-   * Return the list of relationship types that this connector recognizes.
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes() {
-    return new String[] {};
-  }
-
-  private void fillInServerConfigurationMap(Map<String, String> serverMap,
-      IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String confluenceProtocol = parameters
-        .getParameter(ConfluenceConfiguration.Server.PROTOCOL);
-    String confluenceHost = parameters
-        .getParameter(ConfluenceConfiguration.Server.HOST);
-    String confluencePort = parameters
-        .getParameter(ConfluenceConfiguration.Server.PORT);
-    String confluencePath = parameters
-        .getParameter(ConfluenceConfiguration.Server.PATH);
-    String confluenceUsername = parameters
-        .getParameter(ConfluenceConfiguration.Server.USERNAME);
-    String confluencePassword = parameters
-        .getObfuscatedParameter(ConfluenceConfiguration.Server.PASSWORD);
-
-    if (confluenceProtocol == null)
-      confluenceProtocol = ConfluenceConfiguration.Server.PROTOCOL_DEFAULT_VALUE;
-    if (confluenceHost == null)
-      confluenceHost = ConfluenceConfiguration.Server.HOST_DEFAULT_VALUE;
-    if (confluencePort == null)
-      confluencePort = ConfluenceConfiguration.Server.PORT_DEFAULT_VALUE;
-    if (confluencePath == null)
-      confluencePath = ConfluenceConfiguration.Server.PATH_DEFAULT_VALUE;
-
-    if (confluenceUsername == null)
-      confluenceUsername = ConfluenceConfiguration.Server.USERNAME_DEFAULT_VALUE;
-    if (confluencePassword == null)
-      confluencePassword = ConfluenceConfiguration.Server.PASSWORD_DEFAULT_VALUE;
-    else
-      confluencePassword = mapper.mapPasswordToKey(confluencePassword);
-
-    serverMap.put(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PROTOCOL, confluenceProtocol);
-    serverMap.put(PARAMETER_PREFIX + ConfluenceConfiguration.Server.HOST,
-        confluenceHost);
-    serverMap.put(PARAMETER_PREFIX + ConfluenceConfiguration.Server.PORT,
-        confluencePort);
-    serverMap.put(PARAMETER_PREFIX + ConfluenceConfiguration.Server.PATH,
-        confluencePath);
-    serverMap.put(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.USERNAME, confluenceUsername);
-    serverMap.put(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PASSWORD, confluencePassword);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    /* Fill server configuration parameters */
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD,
-        paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, CONF_SERVER_TAB_PROPERTY));
-    // Map the parameters
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    /* Fill server configuration parameters */
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_CONFIG_HEADER_FORWARD, paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      String tabName) throws ManifoldCFException, IOException {
-
-    // Call the Velocity templates for each tab
-    Map<String, String> paramMap = new HashMap<String, String>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_CONFIG_FORWARD_SERVER, paramMap, true);
-
-  }
-
-  /*
-   * Repository specification post handle, (server and proxy & client secret
-   * etc)
-   * 
-   * @see
-   * org.apache.manifoldcf.core.connector.BaseConnector#processConfigurationPost
-   * (org.apache.manifoldcf.core.interfaces.IThreadContext,
-   * org.apache.manifoldcf.core.interfaces.IPostParameters,
-   * org.apache.manifoldcf.core.interfaces.ConfigParams)
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, ConfigParams parameters)
-      throws ManifoldCFException {
-
-    String confluenceProtocol = variableContext
-        .getParameter(PARAMETER_PREFIX
-            + ConfluenceConfiguration.Server.PROTOCOL);
-    if (confluenceProtocol != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.PROTOCOL,
-          confluenceProtocol);
-
-    String confluenceHost = variableContext.getParameter(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.HOST);
-    if (confluenceHost != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.HOST,
-          confluenceHost);
-
-    String confluencePort = variableContext.getParameter(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PORT);
-    if (confluencePort != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.PORT,
-          confluencePort);
-
-    String confluencePath = variableContext.getParameter(PARAMETER_PREFIX
-        + ConfluenceConfiguration.Server.PATH);
-    if (confluencePath != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.PATH,
-          confluencePath);
-
-    String confluenceUsername = variableContext
-        .getParameter(PARAMETER_PREFIX
-            + ConfluenceConfiguration.Server.USERNAME);
-    if (confluenceUsername != null)
-      parameters.setParameter(ConfluenceConfiguration.Server.USERNAME,
-          confluenceUsername);
-
-    String confluencePassword = variableContext
-        .getParameter(PARAMETER_PREFIX
-            + ConfluenceConfiguration.Server.PASSWORD);
-    if (confluencePassword != null)
-      parameters.setObfuscatedParameter(
-          ConfluenceConfiguration.Server.PASSWORD,
-          variableContext.mapKeyToPassword(confluencePassword));
-
-    /* null means process configuration has been successful */
-    return null;
-  }
-
-  /**
-   * <p>
-   * Fill the configured spaces into the map
-   * </p>
-   * 
-   * @param newMap
-   * @param cs
-   */
-  private void fillInConfSpacesSpecificationMap(Map<String, Object> newMap,
-      ConfluenceSpecification cs) {
-
-    newMap.put(ConfluenceConfiguration.Specification.SPACES.toUpperCase(Locale.ROOT),
-        cs.getSpaces());
-  }
-
-  /**
-   * <p>
-   * Fill the pages configuration into the map
-   * </p>
-   * 
-   * @param newMap
-   * @param cs
-   */
-  private void fillInConfPagesSpecificationMap(Map<String, Object> newMap,
-      ConfluenceSpecification cs) {
-
-    newMap.put(
-        ConfluenceConfiguration.Specification.PROCESS_ATTACHMENTS_ATTRIBUTE_KEY
-            .toUpperCase(Locale.ROOT), cs.isProcessAttachments());
-    return;
-
-  }
-
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale,
-      Specification ds, int connectionSequenceNumber)
-      throws ManifoldCFException, IOException {
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    ConfluenceSpecification cs = ConfluenceSpecification.from(ds);
-
-    fillInConfSpacesSpecificationMap(paramMap, cs);
-    fillInConfPagesSpecificationMap(paramMap, cs);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_SPEC_FORWARD,
-        paramMap);
-  }
-
-  /*
-   * Handle job specification post
-   * 
-   * @see org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector#
-   * processSpecificationPost
-   * (org.apache.manifoldcf.core.interfaces.IPostParameters,
-   * org.apache.manifoldcf.crawler.interfaces.DocumentSpecification)
-   */
-
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext,
-      Locale locale, Specification ds, int connectionSequenceNumber)
-      throws ManifoldCFException {
-
-    String seqPrefix = "s" + connectionSequenceNumber + "_";
-
-    String xc = variableContext.getParameter(seqPrefix + "spacescount");
-    if (xc != null) {
-      // Delete all preconfigured spaces
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(
-            ConfluenceConfiguration.Specification.SPACES))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode spaces = new SpecificationNode(
-          ConfluenceConfiguration.Specification.SPACES);
-      ds.addChild(ds.getChildCount(), spaces);
-      int spacesCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < spacesCount) {
-        String spaceDescription = "_" + Integer.toString(i);
-        String spaceOpName = seqPrefix + "spaceop" + spaceDescription;
-        xc = variableContext.getParameter(spaceOpName);
-        if (xc != null && xc.equals("Delete")) {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String spaceKey = variableContext.getParameter(seqPrefix
-            + "space" + spaceDescription);
-        SpecificationNode node = new SpecificationNode(
-            ConfluenceConfiguration.Specification.SPACE);
-        node.setAttribute(
-            ConfluenceConfiguration.Specification.SPACE_KEY_ATTRIBUTE,
-            spaceKey);
-        spaces.addChild(spaces.getChildCount(), node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix + "spaceop");
-      if (op != null && op.equals("Add")) {
-        String spaceSpec = variableContext.getParameter(seqPrefix
-            + "space");
-        SpecificationNode node = new SpecificationNode(
-            ConfluenceConfiguration.Specification.SPACE);
-        node.setAttribute(
-            ConfluenceConfiguration.Specification.SPACE_KEY_ATTRIBUTE,
-            spaceSpec);
-        spaces.addChild(spaces.getChildCount(), node);
-      }
-    }
-
-    /* Delete pages configuration */
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType()
-          .equals(ConfluenceConfiguration.Specification.PAGES))
-        ds.removeChild(i);
-      else
-        i++;
-    }
-
-    SpecificationNode pages = new SpecificationNode(
-        ConfluenceConfiguration.Specification.PAGES);
-    ds.addChild(ds.getChildCount(), pages);
-
-    String procAttachments = variableContext
-        .getParameter(seqPrefix
-            + ConfluenceConfiguration.Specification.PROCESS_ATTACHMENTS_ATTRIBUTE_KEY);
-    if (procAttachments != null && !procAttachments.isEmpty()) {
-      pages.setAttribute(
-          ConfluenceConfiguration.Specification.PROCESS_ATTACHMENTS_ATTRIBUTE_KEY,
-          String.valueOf(procAttachments));
-    }
-
-    return null;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector#
-   * outputSpecificationBody
-   * (org.apache.manifoldcf.core.interfaces.IHTTPOutput, java.util.Locale,
-   * org.apache.manifoldcf.crawler.interfaces.DocumentSpecification,
-   * java.lang.String)
-   */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale,
-      Specification ds, int connectionSequenceNumber,
-      int actualSequenceNumber, String tabName)
-      throws ManifoldCFException, IOException {
-
-    // Output JIRAQuery tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    ConfluenceSpecification cs = ConfluenceSpecification.from(ds);
-
-    fillInConfSpacesSpecificationMap(paramMap, cs);
-    fillInConfPagesSpecificationMap(paramMap, cs);
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_SPEC_FORWARD_SPACES, paramMap);
-
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_SPEC_FORWARD_CONF_PAGES, paramMap);
-  }
-
-  /*
-   * Header for the specification
-   * 
-   * @see org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector#
-   * outputSpecificationHeader
-   * (org.apache.manifoldcf.core.interfaces.IHTTPOutput, java.util.Locale,
-   * org.apache.manifoldcf.crawler.interfaces.DocumentSpecification,
-   * java.util.List)
-   */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale,
-      Specification ds, int connectionSequenceNumber,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-
-    tabsArray.add(Messages.getString(locale, CONF_SPACES_TAB_PROPERTY));
-    tabsArray.add(Messages.getString(locale, CONF_PAGES_TAB_PROPERTY));
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_SPEC_HEADER_FORWARD, paramMap);
-  }
-
-  /*
-   * Adding seed documents
-   * 
-   * @see org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector#
-   * addSeedDocuments
-   * (org.apache.manifoldcf.crawler.interfaces.ISeedingActivity,
-   * org.apache.manifoldcf.crawler.interfaces.DocumentSpecification, long,
-   * long, int)
-   */
-  public String addSeedDocuments(ISeedingActivity activities,
-      Specification spec, String lastSeedVersion, long seedTime,
-      int jobMode) throws ManifoldCFException, ServiceInterruption {
-
-    if (!isConnected()) {
-      initConfluenceClient();
-    }
-
-    try {
-
-      /*
-       * Not uses delta seeding because Confluence can't be queried using
-       * dates or in a ordered way, only start and limit which can cause
-       * problems if an already indexed document is deleted, because we
-       * will miss some to-be indexed docs due to the last start parameter
-       * stored in the last execution
-       */
-      // if(lastSeedVersion != null && !lastSeedVersion.isEmpty()) {
-      // StringTokenizer tokenizer = new
-      // StringTokenizer(lastSeedVersion,"|");
-      //
-      // lastStart = new Long(lastSeedVersion);
-      // }
-
-      ConfluenceSpecification confluenceSpecification = ConfluenceSpecification
-          .from(spec);
-      List<String> spaceKeys = confluenceSpecification.getSpaces();
-
-      if (spaceKeys.isEmpty()) {
-        logger.info("No spaces configured. Processing all spaces");
-        addSeedDocumentsForSpace(Optional.<String> absent(),
-            activities, confluenceSpecification, lastSeedVersion,
-            seedTime, jobMode);
-      } else {
-        for (String space : spaceKeys) {
-          logger.info("Processing configured space {}", space);
-          addSeedDocumentsForSpace(Optional.<String> of(space),
-              activities, confluenceSpecification,
-              lastSeedVersion, seedTime, jobMode);
-        }
-      }
-
-      return "";
-    } catch (Exception e) {
-      handleConfluenceDownException(e, "seeding");
-      return null;
-    }
-  }
-
-  /**
-   * <p>
-   * Add seed documents for a given optional space
-   * </p>
-   * 
-   * @throws ServiceInterruption
-   * @throws ManifoldCFException
-   */
-  private void addSeedDocumentsForSpace(Optional<String> space,
-      ISeedingActivity activities,
-      ConfluenceSpecification confluenceSpec, String lastSeedVersion,
-      long seedTime, int jobMode) throws ManifoldCFException,
-      ServiceInterruption {
-
-    long lastStart = 0;
-    long defaultSize = 50;
-
-    if (Logging.connectors != null && Logging.connectors.isDebugEnabled()) {
-      String spaceDesc = space.isPresent() ? "space with key "
-          + space.get() : "all the spaces";
-      Logging.connectors.debug(new MessageFormat("Starting from {0} and size {1} for {2}", Locale.ROOT)
-          .format(new Object[] { lastStart, defaultSize, spaceDesc }));
-    }
-
-    try {
-      Boolean isLast = true;
-      do {
-        final ConfluenceResponse<Page> response = confluenceClient.getPages(
-            (int) lastStart, (int) defaultSize, space);
-
-        int count = 0;
-        for (Page page : response.getResults()) {
-
-          activities.addSeedDocument(page.getId());
-          if (confluenceSpec.isProcessAttachments()) {
-            processSeedAttachments(page, activities);
-          }
-          count++;
-        }
-        if (Logging.connectors != null
-            && Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug(new MessageFormat("Fetched and added {0} seed documents", Locale.ROOT)
-              .format(new Object[] { new Integer(count) }));
-
-        lastStart += count;
-        isLast = response.isLast();
-        if (Logging.connectors != null
-            && Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug(new MessageFormat("New start {0} and size {1}", Locale.ROOT)
-              .format(new Object[] { lastStart, defaultSize }));
-      } while (!isLast);
-
-    } catch (Exception e) {
-      handleConfluenceDownException(e, "seeding");
-    }
-
-  }
-
-  /**
-   * <p>
-   * Process seed attachments for the given page
-   * </p>
-   * 
-   * @param page
-   * @param activities
-   */
-  private void processSeedAttachments(Page page, ISeedingActivity activities)
-      throws ManifoldCFException, ServiceInterruption {
-    long lastStart = 0;
-    long defaultSize = 50;
-
-    if (Logging.connectors != null && Logging.connectors.isDebugEnabled()) {
-      Logging.connectors.debug(new MessageFormat("Processing page {} attachments starting from {} and size {}", Locale.ROOT)
-          .format(new Object[] { page.getId(), lastStart, defaultSize }));
-    }
-
-    try {
-      Boolean isLast = true;
-      do {
-        final ConfluenceResponse<Attachment> response = confluenceClient
-            .getPageAttachments(page.getId(), (int) lastStart,
-                (int) defaultSize);
-
-        int count = 0;
-        for (Page resultPage : response.getResults()) {
-          activities.addSeedDocument(ConfluenceUtil
-              .generateRepositoryDocumentIdentifier(
-                  resultPage.getId(), page.getId()));
-          count++;
-        }
-
-        if (Logging.connectors != null
-            && Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug(
-              new MessageFormat("Fetched and added {} seed document attachments for page {}" , Locale.ROOT)
-                  .format(new Object[] { new Integer(count), page.getId() }));
-
-        lastStart += count;
-        isLast = response.isLast();
-        if (Logging.connectors != null
-            && Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug(new MessageFormat("New start {0} and size {1}", Locale.ROOT)
-              .format(new Object[] { lastStart, defaultSize }));
-      } while (!isLast);
-
-    } catch (Exception e) {
-      handleConfluenceDownException(e, "seeding");
-    }
-  }
-
-  protected static void handleConfluenceDownException(Exception e,
-      String context) throws ManifoldCFException, ServiceInterruption {
-    long currentTime = System.currentTimeMillis();
-
-    // Server doesn't appear to by up. Try for a brief time then give up.
-    String message = "Server appears down during " + context + ": "
-        + e.getMessage();
-    Logging.connectors.warn(message, e);
-    throw new ServiceInterruption(message, e, currentTime
-        + interruptionRetryTime, -1L, 3, true);
-  }
-
-  /*
-   * Process documents
-   * 
-   * @see org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector#
-   * processDocuments(java.lang.String[], java.lang.String[],
-   * org.apache.manifoldcf.crawler.interfaces.IProcessActivity,
-   * org.apache.manifoldcf.crawler.interfaces.DocumentSpecification,
-   * boolean[])
-   */
-  @Override
-  public void processDocuments(String[] documentIdentifiers,
-      IExistingVersions statuses, Specification spec,
-      IProcessActivity activities, int jobMode,
-      boolean usesDefaultAuthority) throws ManifoldCFException,
-      ServiceInterruption {
-
-    if(Logging.connectors != null && Logging.connectors.isDebugEnabled())
-      Logging.connectors
-        .debug("Process Confluence documents: Inside processDocuments");
-
-    for (int i = 0; i < documentIdentifiers.length; i++) {
-      String pageId = documentIdentifiers[i];
-      String version = statuses.getIndexedVersionString(pageId);
-
-      long startTime = System.currentTimeMillis();
-      String errorCode = "OK";
-      String errorDesc = StringUtils.EMPTY;
-      ProcessResult pResult = null;
-      boolean doLog = true;
-
-      try {
-        if (Logging.connectors != null && Logging.connectors.isDebugEnabled()) {
-          Logging.connectors
-              .debug("Confluence: Processing document identifier '"
-                  + pageId + "'");
-        }
-
-        /* Ensure Confluence client is connected */
-        if (!isConnected()) {
-          initConfluenceClient();
-        }
-
-        if (ConfluenceUtil.isAttachment(pageId)) {
-          pResult = processPageAsAttachment(pageId, version,
-              activities, doLog);
-        }
-        else {
-          pResult = processPage(pageId, version, activities, doLog,
-              Maps.<String, String> newHashMap());
-        }
-      } catch (IOException ioe) {
-        handleIOException(ioe);
-      } catch (Exception e) {
-        handleException(e);
-      }
-
-      finally {
-        if (doLog){
-          if(pResult != null && pResult.errorCode != null && !pResult.errorCode.isEmpty()){
-            activities.recordActivity(new Long(startTime),
-                ACTIVITY_READ, pResult.fileSize, pageId, pResult.errorCode,
-                  pResult.errorDescription, null);
-          }else{
-            activities.recordActivity(new Long(startTime),
-                ACTIVITY_READ, pResult.fileSize, pageId, errorCode,
-                  errorDesc, null);
-          }
-        }
-      }
-
-    }
-  }
-
-  /**
-   * <p>
-   * Process the specific page
-   * </p>
-   * 
-   * @param pageId
-   *            The pageId being an attachment
-   * @param version
-   *            The version of the page
-   * @param activities
-   * @param doLog
-   * @throws ManifoldCFException
-   * @throws IOException
-   * @throws ServiceInterruption
-   */
-  private ProcessResult processPage(String pageId, String version,
-      IProcessActivity activities, boolean doLog,
-      Map<String, String> extraProperties) throws ManifoldCFException,
-      ServiceInterruption, IOException {
-    Page page = confluenceClient.getPage(pageId);
-    return processPageInternal(page, pageId, version, activities, doLog,
-        extraProperties);
-  }
-
-  /**
-   * <p>
-   * Process the specific attachment
-   * </p>
-   * 
-   * @param pageId
-   *            The pageId being an attachment
-   * @param version
-   *            The version of the page
-   * @param activities
-   * @param doLog
-   * @throws IOException
-   * @throws ServiceInterruption
-   */
-  private ProcessResult processPageAsAttachment(String pageId, String version,
-      IProcessActivity activities, boolean doLog)
-      throws ManifoldCFException, ServiceInterruption, IOException {
-
-    String[] ids = ConfluenceUtil.getAttachmentAndPageId(pageId);
-    Attachment attachment = confluenceClient.getAttachment(ids[0]);
-    Map<String, String> extraProperties = Maps.newHashMap();
-    extraProperties.put("attachedBy", ids[1]);
-    return processPageInternal(attachment, pageId, version, activities, doLog,
-        extraProperties);
-  }
-
-  /**
-   * <p>
-   * Process the specific page
-   * </p>
-   * 
-   * @param pageId
-   *            The pageId being an attachment
-   * @param manifoldDocumentIdentifier
-   * @param version
-   *            The version of the page
-   * @param activities
-   * @param doLog
-   * @throws ManifoldCFException
-   * @throws IOException
-   * @throws ServiceInterruption
-   */
-  private ProcessResult processPageInternal(Page page,
-      String manifoldDocumentIdentifier, String version,
-      IProcessActivity activities, boolean doLog,
-      Map<String, String> extraProperties) throws ManifoldCFException,
-      ServiceInterruption, IOException {
-
-        
-    /* Remove page if it has no content */
-    /*
-     * Page does not have content if there was an error trying to get the
-     * page
-     */
-    if (!page.hasContent()) {
-      activities.deleteDocument(manifoldDocumentIdentifier);
-      return new ProcessResult(page.getLength(), "DELETED", "");
-    }
-    if (Logging.connectors != null && Logging.connectors.isDebugEnabled()) {
-      Logging.connectors.debug("Confluence: This content exists: "
-          + page.getId());
-    }
-
-    RepositoryDocument rd = new RepositoryDocument();
-    Date createdDate = page.getCreatedDate();
-    Date lastModified = page.getLastModifiedDate();
-    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.ROOT);
-
-    /*
-     * Retain page in Manifold because it has not changed from last time
-     * This is needed to keep the identifier in Manifold data, because by
-     * default if a document is not retained nor ingested, it will be
-     * deleted by the framework
-     */
-    String lastVersion = df.format(lastModified);
-    
-    if (!activities.checkDocumentNeedsReindexing(manifoldDocumentIdentifier, lastVersion)) {
-      return new ProcessResult(page.getLength(), "RETAINED", "");
-    }
-    
-    if (!activities.checkLengthIndexable(page.getLength())){
-      activities.noDocument(manifoldDocumentIdentifier, lastVersion);
-      String errorCode = IProcessActivity.EXCLUDED_LENGTH;
-      String errorDesc = "Excluding document because of length ("+page.getLength()+")";
-      return new ProcessResult(page.getLength(), errorCode, errorDesc);
-    }
-
-    if (!activities.checkMimeTypeIndexable(page.getMediaType())) {
-      activities.noDocument(manifoldDocumentIdentifier, lastVersion);
-      String errorCode = IProcessActivity.EXCLUDED_MIMETYPE;
-      String errorDesc = "Excluding document because of mime type ("+page.getMediaType()+")";
-      return new ProcessResult(page.getLength(), errorCode, errorDesc);
-    }
-
-    if (!activities.checkDateIndexable(lastModified)) {
-      activities.noDocument(manifoldDocumentIdentifier, lastVersion);
-      String errorCode = IProcessActivity.EXCLUDED_DATE;
-      String errorDesc = "Excluding document because of date ("+lastModified+")";
-      return new ProcessResult(page.getLength(), errorCode, errorDesc);
-    }
-
-    if (!activities.checkURLIndexable(page.getWebUrl())) {
-      activities.noDocument(manifoldDocumentIdentifier, lastVersion);
-      String errorCode = IProcessActivity.EXCLUDED_URL;
-      String errorDesc = "Excluding document because of URL ('"+page.getWebUrl()+"')";
-      return new ProcessResult(page.getLength(), errorCode, errorDesc);
-    }
-
-    /* Add repository document information */
-    rd.setMimeType(page.getMediaType());
-    if (createdDate != null)
-      rd.setCreatedDate(createdDate);
-    if (lastModified != null)
-      rd.setModifiedDate(lastModified);
-    rd.setIndexingDate(new Date());
-
-    /* Adding Page Metadata */
-    Map<String, Object> pageMetadata = page.getMetadataAsMap();
-    for (Entry<String, Object> entry : pageMetadata.entrySet()) {
-      if(entry.getValue() instanceof List) {
-        List<?> list = (List<?>)entry.getValue();
-        rd.addField(entry.getKey(), list.toArray(new String[list.size()]));
-      }
-      else {
-        rd.addField(entry.getKey(), entry.getValue().toString());
-      }
-    }
-
-    /* Adding extra properties */
-    for (Entry<String, String> entry : extraProperties.entrySet()) {
-      rd.addField(entry.getKey(), entry.getValue());
-    }
-
-    String documentURI = page.getWebUrl();
-
-    /* Set repository document ACLs */
-    rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,
-        new String[] { page.getSpace() });
-    rd.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,
-        new String[] { defaultAuthorityDenyToken });
-
-    rd.setBinary(page.getContentStream(), page.getLength());
-    rd.addField("size", String.valueOf(page.getLength()));
-
-    /* Ingest document */
-    activities.ingestDocumentWithException(manifoldDocumentIdentifier,
-        lastVersion, documentURI, rd);
-    
-    return new ProcessResult(page.getLength(), null, null);
-  }
-
-  /**
-   * <p>
-   * Handles IO Exception to manage whether the exception is an interruption
-   * so that the process needs to be executed again later on
-   * </p>
-   * 
-   * @param e
-   *            The Exception
-   * @throws ManifoldCFException
-   * @throws ServiceInterruption
-   */
-  private static void handleIOException(IOException e)
-      throws ManifoldCFException, ServiceInterruption {
-    if (!(e instanceof java.net.SocketTimeoutException)
-        && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-    }
-    Logging.connectors.warn("IO exception: " + e.getMessage(), e);
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: " + e.getMessage(), e,
-        currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
-  }
-
-  /**
-   * <p>
-   * Handles general exceptions
-   * </p>
-   * 
-   * @param e
-   *            The Exception
-   * @throws ManifoldCFException
-   */
-  private static void handleException(Exception e) throws ManifoldCFException {
-    Logging.connectors.warn("Exception: " + e.getMessage(), e);
-    throw new ManifoldCFException("Exception: " + e.getMessage(), e,
-        ManifoldCFException.REPOSITORY_CONNECTION_ERROR);
-
-  }
-  
-  private class ProcessResult{
-    private long fileSize;
-    private String errorCode;
-    private String errorDescription;
-    
-    private ProcessResult(long fileSize, String errorCode, String errorDescription){
-      this.fileSize = fileSize;
-      this.errorCode = errorCode;
-      this.errorDescription = errorDescription;
-    }
-  }
-
-  /**
-   * <p>
-   * Internal private class used to parse and keep the specification
-   * configuration in object format
-   * </p>
-   * 
-   * @author Antonio David Perez Morales <adperezmorales@gmail.com>
-   *
-   */
-  private static class ConfluenceSpecification {
-    private List<String> spaces;
-    private Boolean processAttachments = false;
-
-    /**
-     * <p>
-     * Returns if attachments should be processed
-     * </p>
-     * 
-     * @return a {@code Boolean} indicating if the attachments should be
-     *         processed or not
-     */
-    public Boolean isProcessAttachments() {
-      return this.processAttachments;
-    }
-
-    /**
-     * <p>
-     * Returns the list of configured spaces or an empty list meaning that
-     * all spaces should be processed
-     * </p>
-     * 
-     * @return a {@code List<String>} of configured spaces
-     */
-    public List<String> getSpaces() {
-      return this.spaces;
-    }
-
-    public static ConfluenceSpecification from(Specification spec) {
-      ConfluenceSpecification cs = new ConfluenceSpecification();
-      cs.spaces = Lists.newArrayList();
-      for (int i = 0, len = spec.getChildCount(); i < len; i++) {
-        SpecificationNode sn = spec.getChild(i);
-        if (sn.getType().equals(
-            ConfluenceConfiguration.Specification.SPACES)) {
-          for (int j = 0, sLen = sn.getChildCount(); j < sLen; j++) {
-            SpecificationNode specNode = sn.getChild(j);
-            if (specNode.getType().equals(
-                ConfluenceConfiguration.Specification.SPACE)) {
-              cs.spaces
-                  .add(specNode
-                      .getAttributeValue(ConfluenceConfiguration.Specification.SPACE_KEY_ATTRIBUTE));
-
-            }
-          }
-
-        } else if (sn.getType().equals(
-            ConfluenceConfiguration.Specification.PAGES)) {
-          String s = sn
-              .getAttributeValue(ConfluenceConfiguration.Specification.PROCESS_ATTACHMENTS_ATTRIBUTE_KEY);
-          cs.processAttachments = Boolean.valueOf(s);
-        }
-      }
-
-      return cs;
-
-    }
-  }
-
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/Messages.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/Messages.java
deleted file mode 100644
index 1b65bda..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/Messages.java
+++ /dev/null
@@ -1,149 +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 org.apache.manifoldcf.crawler.connectors.confluence;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-/**
- * <p>Messages class</p>
- * <p>Class used to render templates along with specific values</p>
- * <p>Also used to get messages for specific Locales</p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.confluence.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.confluence";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/client/ConfluenceClient.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/client/ConfluenceClient.java
deleted file mode 100644
index 873d6d8..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/client/ConfluenceClient.java
+++ /dev/null
@@ -1,707 +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 org.apache.manifoldcf.crawler.connectors.confluence.client;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.StringReader;
-import java.nio.charset.Charset;
-import java.util.List;
-import java.util.Locale;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.util.EntityUtils;
-import org.apache.manifoldcf.connectorcommon.common.InterruptibleSocketFactory;
-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.confluence.exception.ConfluenceException;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Attachment;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceResource;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceResponse;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceUser;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Label;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.MutableAttachment;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.MutablePage;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Page;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Space;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Spaces;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.builder.ConfluenceResourceBuilder;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-
-/**
- * <p>
- * ConfluenceClient class
- * </p>
- * <p>
- * This class is intended to be used to interact with Confluence REST API
- * </p>
- * <p>
- * There are some methods that make use of the Confluence JSON-RPC 2.0 API, but
- * until all the methods are ported to the new REST API, we will have to use
- * them to leverage all the features provided by Confluence
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class ConfluenceClient {
-
-  private static final String VIEW_PERMISSION = "view";
-  
-  private static final String CONTENT_PATH = "/rest/api/content";
-  private static final String AUTHORITY_PATH = "/rpc/json-rpc/confluenceservice-v2/";
-  private static final String EXPANDABLE_PARAMETERS = "expand=body.view,metadata.labels,space,history,version";
-  private static final String CHILD_ATTACHMENTS_PATH = "/child/attachment/";
-  private static final String LABEL_PATH = "/label";
-
-  private Logger logger = LoggerFactory.getLogger(ConfluenceClient.class);
-
-  private String protocol;
-  private Integer port;
-  private String host;
-  private String path;
-  private String username;
-  private String password;
-
-  private CloseableHttpClient httpClient;
-  private HttpClientContext httpContext;
-
-  /**
-   * <p>Creates a new client instance using the given parameters</p>
-   * @param protocol the protocol
-   * @param host the host
-   * @param port the port
-   * @param path the path to Confluence instance
-   * @param username the username used to make the requests. Null or empty to use anonymous user
-   * @param password the password
-   * @throws ManifoldCFException 
-   */
-  public ConfluenceClient(String protocol, String host, Integer port,
-      String path, String username, String password) throws ManifoldCFException {
-    this.protocol = protocol;
-    this.host = host;
-    this.port = port;
-    this.path = path;
-    this.username = username;
-    this.password = password;
-
-    connect();
-  }
-
-  /**
-   * <p>Connect methods used to initialize the underlying client</p>
-   * @throws ManifoldCFException 
-   */
-  private void connect() throws ManifoldCFException {
-
-    int socketTimeout = 900000;
-      int connectionTimeout = 60000;
-
-      javax.net.ssl.SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();
-      SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeout),
-        NoopHostnameVerifier.INSTANCE);
-
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-          .register("http", PlainConnectionSocketFactory.getSocketFactory())
-          .register("https", myFactory)
-          .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-        .setCircularRedirectsAllowed(true)
-        .setSocketTimeout(socketTimeout)
-        .setExpectContinueEnabled(true)
-        .setConnectTimeout(connectionTimeout)
-        .setConnectionRequestTimeout(socketTimeout);
-
-
-      httpClient = HttpClients.custom()
-        .setConnectionManager(poolingConnectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new LaxRedirectStrategy())
-        .build();
-      
-     }
-
-  /**
-   * <p>Close the client. No further requests can be done</p>
-   */
-  public void close() {
-    if (httpClient != null) {
-      try {
-        httpClient.close();
-      } catch (IOException e) {
-        logger.debug("Error closing http connection. Reason: {}",
-            e.getMessage());
-        e.printStackTrace();
-      }
-    }
-  }
-
-  /**
-   * <p>Check method used to test if Confluence instance is up and running</p>
-   * 
-   * @return a {@code Boolean} indicating whether the Confluence instance is alive or not
-   * 
-   * @throws Exception
-   */
-  public boolean check() throws Exception {
-    HttpResponse response;
-    try {
-      if (httpClient == null) {
-        connect();
-      }
-
-      String url = String.format(Locale.ROOT, "%s://%s:%s%s%s?limit=1", protocol, host,
-          port, path, CONTENT_PATH);
-      logger.debug(
-          "[Processing] Hitting url: {} for confluence status check fetching : ",
-          "Confluence URL", sanitizeUrl(url));
-      HttpGet httpGet = createGetRequest(url);
-      response = httpClient.execute(httpGet);
-      int statusCode = response.getStatusLine().getStatusCode();
-      if (statusCode != 200)
-        throw new Exception(
-            "[Checking connection] Confluence server appears to be down");
-      else
-        return true;
-    } catch (IOException e) {
-      logger.warn(
-          "[Checking connection] Confluence server appears to be down",
-          e);
-      throw new Exception("Confluence appears to be down", e);
-    }
-  }
-
-  /**
-   * <p>Check method used to test if Confluence instance is up and running when using Authority connector (JSON-RPC API)</p>
-   * <p>This method will be deleted when all JSON-RPC methods are available through the REST API
-   * 
-   * @return a {@code Boolean} indicating whether the Confluence instance is alive or not
-   * 
-   * @throws Exception
-   */
-  public boolean checkAuth() throws Exception {
-    try {
-      if (httpClient == null) {
-        connect();
-      }
-      getSpaces();
-      return true;
-    } catch (Exception e) {
-      logger.warn(
-          "[Checking connection] Confluence server appears to be down",
-          e);
-      throw e;
-    }
-  }
-  /**
-   * <p>
-   * Create a get request for the given url
-   * </p>
-   * 
-   * @param url
-   *            the url
-   * @return the created {@code HttpGet} instance
-   */
-  private HttpGet createGetRequest(String url) {
-    String finalUrl = useBasicAuthentication() ? url + "&os_authType=basic": url;
-    String sanitizedUrl = sanitizeUrl(finalUrl);
-    HttpGet httpGet = new HttpGet(sanitizedUrl);
-    httpGet.addHeader("Accept", "application/json");
-    if (useBasicAuthentication()) {
-      httpGet.addHeader(
-          "Authorization",
-          "Basic "
-              + Base64.encodeBase64String(String.format(Locale.ROOT, "%s:%s",
-                  this.username, this.password).getBytes(
-                  Charset.forName("UTF-8"))));
-    }
-    return httpGet;
-  }
-
-  /**
-   * <p>
-   * Get a list of Confluence pages
-   * </p>
-   * 
-   * @return a {@code ConfluenceResponse} containing the result pages and
-   *         some pagination values
-   * @throws Exception
-   */
-  public ConfluenceResponse<Page> getPages() throws Exception {
-    return getPages(0, 50, Optional.<String> absent());
-  }
-
-  /**
-   * <p>
-   * Get a list of Confluence pages using pagination
-   * </p>
-   * 
-   * @param start The start value to get pages from
-   * @param limit The number of pages to get from start
-   * @return a {@code ConfluenceResponse} containing the result pages and
-   *         some pagination values
-   * @throws Exception
-   */
-  @SuppressWarnings("unchecked")
-  public ConfluenceResponse<Page> getPages(int start, int limit,
-      Optional<String> space) throws Exception {
-    String url = String.format(Locale.ROOT, "%s://%s:%s%s%s?limit=%s&start=%s", protocol,
-        host, port, path, CONTENT_PATH, limit, start);
-    if (space.isPresent()) {
-      url = String.format(Locale.ROOT, "%s&spaceKey=%s", url, space.get());
-    }
-    return (ConfluenceResponse<Page>) getConfluenceResources(url, Page.builder());
-  }
-
-  /**
-   * <p>Get the {@code ConfluenceResources} from the given url</p>
-   * @param url The url identifying the REST resource to get the documents
-   * @param builder The builder used to build the resources contained in the response
-   * @return a {@code ConfluenceResponse} containing the page results
-   * @throws Exception
-   */
-  private ConfluenceResponse<? extends ConfluenceResource> getConfluenceResources(String url, ConfluenceResourceBuilder<? extends ConfluenceResource> builder) throws Exception {
-    logger.debug("[Processing] Hitting url for get confluence resources: {}", sanitizeUrl(url));
-
-    try {
-      HttpGet httpGet = createGetRequest(url);
-      HttpResponse response = executeRequest(httpGet);
-      ConfluenceResponse<? extends ConfluenceResource> confluenceResponse = responseFromHttpEntity(response
-          .getEntity(), builder);
-      EntityUtils.consume(response.getEntity());
-      return confluenceResponse;
-    } catch (IOException e) {
-      logger.error("[Processing] Failed to get page(s)", e);
-      throw new Exception("Confluence appears to be down", e);
-    }
-  }
-
-  /**
-   * <p>Creates a ConfluenceResponse from the entity returned in the HttpResponse</p>
-   * @param entity the {@code HttpEntity} to extract the response from
-   * @return a {@code ConfluenceResponse} with the requested information
-   * @throws Exception
-   */
-  private <T extends ConfluenceResource> ConfluenceResponse<T> responseFromHttpEntity(HttpEntity entity, ConfluenceResourceBuilder<T> builder)
-      throws Exception {
-    String stringEntity = EntityUtils.toString(entity, "UTF-8");
-
-    final JSONParser parser = new JSONParser();
-    final JSONObject responseObject = (JSONObject)parser.parse(new StringReader(stringEntity));
-    ConfluenceResponse<T> response = ConfluenceResponse
-        .fromJson(responseObject, builder);
-    if (response.getResults().size() == 0) {
-      logger.debug("[Processing] No {} found in the Confluence response", builder.getType().getSimpleName());
-    }
-
-    return response;
-  }
-  
-  /**
-   * <p>Get the attachments of the given page</p>
-   * @param pageId the page id
-   * @return a {@code ConfluenceResponse} instance containing the attachment results and some pagination values</p>
-   * @throws Exception
-   */
-  public ConfluenceResponse<Attachment> getPageAttachments(String pageId)
-      throws Exception {
-    return getPageAttachments(pageId, 0, 50);
-  }
-
-  /**
-   * <p>Get the attachments of the given page using pagination</p>
-   * @param pageId the page id
-   * @param start The start value to get attachments from
-   * @param limit The number of attachments to get from start
-   * @return a {@code ConfluenceResponse} instance containing the attachment results and some pagination values</p>
-   * @throws Exception
-   */
-  public ConfluenceResponse<Attachment> getPageAttachments(String pageId, int start,
-      int limit) throws Exception {
-    String url = String.format(Locale.ROOT, "%s://%s:%s%s%s/%s%s?limit=%s&start=%s",
-        protocol, host, port, path, CONTENT_PATH, pageId, CHILD_ATTACHMENTS_PATH,
-        limit, start);
-    @SuppressWarnings("unchecked")
-    ConfluenceResponse<Attachment> confluenceResources = (ConfluenceResponse<Attachment>) getConfluenceResources(url, Attachment.builder());
-    return confluenceResources;
-  }
-  
-  /**
-   * <p>
-   * Gets a specific attachment contained in the specific page
-   * </p>
-   * 
-   * @param attachmentId
-   * @param pageId
-   * @return the {@code Attachment} instance
-   */
-  public Attachment getAttachment(String attachmentId) {
-    String url = String
-        .format(Locale.ROOT, "%s://%s:%s%s%s/%s?%s",
-            protocol, host, port, path, CONTENT_PATH, attachmentId, EXPANDABLE_PARAMETERS);
-    logger.debug(
-        "[Processing] Hitting url for getting document content : {}",
-        sanitizeUrl(url));
-    try {
-      HttpGet httpGet = createGetRequest(url);
-      HttpResponse response = executeRequest(httpGet);
-      HttpEntity entity = response.getEntity();
-      MutableAttachment attachment = attachmentFromHttpEntity(entity);
-      EntityUtils.consume(entity);
-      retrieveAndSetAttachmentContent(attachment);
-      return attachment;
-    } catch (Exception e) {
-      logger.error("[Processing] Failed to get attachment {}. Error: {}",
-          url, e.getMessage());
-    }
-
-    return new Attachment();
-  }
-
-  /**
-   * <p>
-   * Downloads and retrieves the attachment content, setting it in the given
-   * {@code Attachment} instance
-   * </p>
-   * 
-   * @param attachment
-   *            the {@code Attachment} instance to download and set the
-   *            content
-   * @throws Exception
-   */
-  private void retrieveAndSetAttachmentContent(MutableAttachment attachment)
-      throws Exception {
-    StringBuilder sb = new StringBuilder();
-    sb.append(attachment.getBaseUrl()).append(attachment.getUrlContext())
-        .append(attachment.getDownloadUrl());
-    String url = sanitizeUrl(sb.toString());
-    logger.debug(
-        "[Processing] Hitting url for getting attachment content : {}",
-        url);
-    try {
-      HttpGet httpGet = createGetRequest(url);
-      HttpResponse response = executeRequest(httpGet);
-      attachment.setLength(response.getEntity().getContentLength());
-      byte[] byteContent = IOUtils.toByteArray(response.getEntity()
-          .getContent());
-      EntityUtils.consumeQuietly(response.getEntity());
-      attachment.setContentStream(new ByteArrayInputStream(byteContent));
-    } catch (Exception e) {
-
-      logger.error(
-          "[Processing] Failed to get attachment content from {}. Error: {}",
-          url, e.getMessage());
-      throw e;
-    }
-
-  }
-
-
-  /**
-   * <p>Get a Confluence page identified by its id</p>
-   * @param pageId the page id
-   * @return the Confluence page
-   */
-  public Page getPage(String pageId) {
-    String url = String
-        .format(Locale.ROOT, "%s://%s:%s%s%s/%s?%s",
-            protocol, host, port, path, CONTENT_PATH, pageId, EXPANDABLE_PARAMETERS);
-    url = sanitizeUrl(url);
-    logger.debug(
-        "[Processing] Hitting url for getting document content : {}",
-        url);
-    try {
-      HttpGet httpGet = createGetRequest(url);
-      HttpResponse response = executeRequest(httpGet);
-      HttpEntity entity = response.getEntity();
-      MutablePage page = pageFromHttpEntity(entity);
-      EntityUtils.consume(entity);
-      List<Label> labels = getLabels(pageId);
-      page.setLabels(labels);
-      return page;
-    } catch (Exception e) {
-      logger.error("[Processing] Failed to get page {0}. Error: {1}",
-          url, e.getMessage());
-    }
-
-    return new Page();
-  }
-
-  /**
-   * <p>Get the labels of a specific page</p> 
-   * @param pageId The pageId to get the labels
-   * @return a {@code List<Label>} of labels
-   */
-  public List<Label> getLabels(String pageId) {
-        
-    List<Label> labels = Lists.newArrayList();
-    int lastStart = 0;
-    int limit = 50;
-    boolean isLast = false;
-    do {
-      String url = String
-          .format(Locale.ROOT, "%s://%s:%s%s%s/%s/%s?start=%s&limit=%s",
-              protocol, host, port, path, CONTENT_PATH, pageId, LABEL_PATH, lastStart, limit);
-      url = sanitizeUrl(url);
-      logger.debug(
-          "[Processing] Hitting url for getting page labels : {}",
-          url);
-      try {
-        @SuppressWarnings("unchecked")
-        ConfluenceResponse<Label> response = (ConfluenceResponse<Label>) getConfluenceResources(url, Label.builder());
-        labels.addAll(response.getResults());
-        lastStart += response.getResults().size();
-        isLast = response.isLast();
-      } catch (Exception e) {
-        logger.debug("Error getting labels for page {}. Reason: {}", pageId, e.getMessage());
-      }
-    }
-    while(!isLast);
-    
-    return labels;
-  }
-  
-  /**
-   * 
-   * @param username
-   * @return
-   * @throws Exception
-   */
-  public ConfluenceUser getUserAuthorities(String username) throws Exception {
-    List<String> authorities = Lists.<String>newArrayList();
-    Spaces spaces = getSpaces();
-    for(Space space: spaces) {
-      List<String> permissions = getSpacePermissionsForUser(space, username);
-      if(permissions.contains(VIEW_PERMISSION)) {
-        authorities.add(space.getKey());
-      }
-    }
-    
-    return new ConfluenceUser(username, authorities);
-  
-  }
-  
-  private HttpPost createPostRequest(String url) {
-    HttpPost httpPost = new HttpPost(url);
-    httpPost.addHeader("Accept", "application/json");
-    httpPost.addHeader("Content-Type", "application/json");
-    if (useBasicAuthentication()) {
-      httpPost.addHeader(
-          "Authorization",
-          "Basic "
-              + Base64.encodeBase64String(String.format(Locale.ROOT, "%s:%s",
-                  this.username, this.password).getBytes(
-                  Charset.forName("UTF-8"))));
-    }
-    return httpPost;
-  }
-  
-  /**
-   * <p>Execute the given {@code HttpUriRequest} using the configured client</p> 
-   * @param request the {@code HttpUriRequest} to be executed
-   * @return the {@code HttpResponse} object returned from the server
-   * @throws Exception
-   */
-  private HttpResponse executeRequest(HttpUriRequest request)
-      throws Exception {
-    String url = request.getURI().toString();
-    logger.debug(
-        "[Processing] Hitting url for getting document content : {}",
-        url);
-
-    try {
-      HttpResponse response = httpClient.execute(request, httpContext);
-      if (response.getStatusLine().getStatusCode() != 200) {
-        throw new Exception("Confluence error. "
-            + response.getStatusLine().getStatusCode() + " "
-            + response.getStatusLine().getReasonPhrase());
-      }
-      return response;
-    } catch (Exception e) {
-      logger.error("[Processing] Failed to get page {}. Error: {}",
-          url, e.getMessage());
-      throw e;
-    }
-  }
-
-  /**
-   * <p>Creates a Confluence page object from the given entity returned by the server</p>
-   * @param entity the {@code HttpEntity} to create the {@code MutablePage} from
-   * @return the Confluence page instance
-   * @throws Exception
-   */
-  private MutablePage pageFromHttpEntity(HttpEntity entity) throws Exception {
-    String stringEntity = EntityUtils.toString(entity, "UTF-8");
-
-    final JSONParser parser = new JSONParser();
-    final JSONObject responseObject = (JSONObject)parser.parse(new StringReader(stringEntity));
-    @SuppressWarnings("unchecked")
-    MutablePage response = ((ConfluenceResourceBuilder<MutablePage>)MutablePage.builder()).fromJson(responseObject, new MutablePage());
-    return response;
-  }
-
-  /**
-   * <p>Creates a {@code MutableAttachment} object from the given entity returned by the server</p>
-   * @param entity the {@code HttpEntity} to create the {@code MutableAttachment} from
-   * @return the Confluence MutableAttachment instance
-   * @throws Exception
-   */
-  private MutableAttachment attachmentFromHttpEntity(HttpEntity entity)
-      throws Exception {
-    String stringEntity = EntityUtils.toString(entity, "UTF-8");
-    final JSONParser parser = new JSONParser();
-    final JSONObject responseObject = (JSONObject)parser.parse(new StringReader(stringEntity));;
-    MutableAttachment response = (MutableAttachment) Attachment
-        .builder()
-        .fromJson(responseObject, new MutableAttachment());
-    return response;
-  }
-
-  /**
-   * <p>Method to check if basic authentication must be used</p>
-   * @return {@code Boolean} indicating whether basic authentication must be used or not
-   */
-  private boolean useBasicAuthentication() {
-    return this.username != null && !"".equals(username)
-        && this.password != null;
-  }
-
-  /**
-   * <p>
-   * Sanitize the given url replacing the appearance of more than one slash by
-   * only one slash
-   * </p>
-   * 
-   * @param url
-   *            The url to sanitize
-   * @return the sanitized url
-   */
-  private String sanitizeUrl(String url) {
-    int colonIndex = url.indexOf(":");
-    String urlWithoutProtocol = url.startsWith("http") ? url.substring(colonIndex+3) : url;
-    String sanitizedUrl = urlWithoutProtocol.replaceAll("\\/+", "/");
-    return url.substring(0,colonIndex) + "://" + sanitizedUrl;
-  }
-  
-  private Spaces getSpaces() throws Exception {
-    String url = String.format(Locale.ROOT, "%s://%s:%s%s%sgetSpaces", protocol, host,
-        port, path, AUTHORITY_PATH);
-
-    logger.debug(
-        "[Processing] Hitting url for getting Confluence spaces : {}",
-        url);
-
-    HttpPost httpPost = createPostRequest(url);
-    httpPost.setEntity(new StringEntity("[]"));
-    HttpResponse response = httpClient.execute(httpPost);
-    if (response.getStatusLine().getStatusCode() != 200) {
-      throw new ConfluenceException("Confluence error. "
-          + response.getStatusLine().getStatusCode() + " "
-          + response.getStatusLine().getReasonPhrase());
-    }
-    HttpEntity entity = response.getEntity();
-    Spaces spaces = spacesFromHttpEntity(entity);
-    EntityUtils.consume(entity);
-    return spaces;
-  }
-  
-  private List<String> getSpacePermissionsForUser(Space space, String username) throws Exception {
-    String url = String.format(Locale.ROOT, "%s://%s:%s%s%sgetPermissionsForUser", protocol, host,
-        port, path, AUTHORITY_PATH);
-
-    logger.debug(
-        "[Processing] Hitting url {} for getting Confluence permissions for user {} in space {}",
-        url, username, space.getKey());
-
-    HttpPost httpPost = createPostRequest(url);
-    final JSONArray jsonArray = new JSONArray();
-    jsonArray.add(space.getKey());
-    jsonArray.add(username);
-    StringEntity stringEntity = new StringEntity(jsonArray.toJSONString());
-    httpPost.setEntity(stringEntity);
-    HttpResponse response = httpClient.execute(httpPost);
-    if (response.getStatusLine().getStatusCode() != 200) {
-      throw new ConfluenceException("Confluence error. "
-          + response.getStatusLine().getStatusCode() + " "
-          + response.getStatusLine().getReasonPhrase());
-    }
-    HttpEntity entity = response.getEntity();
-    List<String> permissions = permissionsFromHttpEntity(entity);
-    EntityUtils.consume(entity);
-    return permissions;
-  }
-
-  private Spaces spacesFromHttpEntity(HttpEntity entity) throws Exception {
-    String stringEntity = EntityUtils.toString(entity, "UTF-8");
-    final JSONParser parser = new JSONParser();
-    final JSONArray responseObject = (JSONArray)parser.parse(new StringReader(stringEntity));
-    Spaces response = Spaces.fromJson(responseObject);
-
-    return response;
-  }
-  
-  private List<String> permissionsFromHttpEntity(HttpEntity entity) throws Exception {
-    String stringEntity = EntityUtils.toString(entity, "UTF-8");
-    final JSONParser parser = new JSONParser();
-    final JSONArray responseObject = (JSONArray)parser.parse(new StringReader(stringEntity));
-    final List<String> permissions = Lists.newArrayList();
-    for(int i=0,len=responseObject.size();i<len;i++) {
-      permissions.add(responseObject.get(i).toString());
-    }
-
-    return permissions;
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/exception/ConfluenceException.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/exception/ConfluenceException.java
deleted file mode 100644
index 42e0a5e..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/exception/ConfluenceException.java
+++ /dev/null
@@ -1,34 +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 org.apache.manifoldcf.crawler.connectors.confluence.exception;
-
-public class ConfluenceException extends Exception {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 5903550079897330304L;
-
-  public ConfluenceException(String message) {
-    super(message);
-  }
-  
-  public ConfluenceException(String message, Throwable cause) {
-    super(message, cause);
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/exception/PageNotFoundException.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/exception/PageNotFoundException.java
deleted file mode 100644
index 74639de..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/exception/PageNotFoundException.java
+++ /dev/null
@@ -1,31 +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 org.apache.manifoldcf.crawler.connectors.confluence.exception;
-
-/**
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class PageNotFoundException extends Exception {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 1L;
-}
\ No newline at end of file
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Attachment.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Attachment.java
deleted file mode 100644
index 38a8719..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Attachment.java
+++ /dev/null
@@ -1,128 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.io.InputStream;
-import java.util.Map;
-
-import org.apache.manifoldcf.crawler.connectors.confluence.model.builder.ConfluenceResourceBuilder;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-
-/**
- * <p>
- * Attachment class
- * </p>
- * <p>
- * Represents a Confluence Attachment
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- */
-public class Attachment extends Page {
-
-  protected static final String KEY_DOWNLOAD = "download";
-  protected static final String KEY_EXTENSIONS = "extensions";
-  protected String downloadUrl;
-  protected InputStream contentStream;
-
-  public static ConfluenceResourceBuilder<Attachment> builder() {
-    return new AttachmentBuilder();
-  }
-
-  public String getDownloadUrl() {
-    return this.downloadUrl;
-  }
-
-  @Override
-  public boolean hasContent() {
-    return (this.length > 0 && this.hasContentStream()) || (this.downloadUrl != null && !this.downloadUrl.isEmpty());
-  }
-
-  public Boolean hasContentStream() {
-    return this.contentStream != null;
-  }
-
-  @Override
-  public InputStream getContentStream() {
-    if(hasContentStream()) {
-      return this.contentStream;
-    }
-    return super.getContentStream();
-  }
-
-  @Override
-  protected void refineMetadata(Map<String, Object> metadata) {
-    super.refineMetadata(metadata);
-    metadata.put("downloadUrl", this.getBaseUrl() + this.getUrlContext()
-        + downloadUrl);
-  }
-
-  /**
-   * <p>
-   * AttachmentBuilder internal class
-   * </p>
-   * <p>
-   * Used to build Attachments
-   * </p>
-   * 
-   * @author Antonio David Perez Morales <adperezmorales@gmail.com>
-   *
-   */
-  public static class AttachmentBuilder implements ConfluenceResourceBuilder<Attachment>{
-    
-    @Override
-    public Attachment fromJson(JSONObject jsonPage) {
-      return fromJson(jsonPage, new Attachment());
-    }
-
-    @SuppressWarnings("unchecked")
-    public Attachment fromJson(JSONObject jsonPage, Attachment attachment) {
-      ((ConfluenceResourceBuilder<Page>) Page.builder()).fromJson(jsonPage, attachment);
-
-      /*
-        * Download URL
-        */
-
-      JSONObject links = (JSONObject) jsonPage.get(Page.KEY_LINKS);
-      if (links != null) {
-        attachment.downloadUrl = (links.get(KEY_DOWNLOAD)==null)?"":links.get(KEY_DOWNLOAD).toString();
-      }
-
-      /*
-        * Extensions
-        */
-      JSONObject extensions = (JSONObject) jsonPage
-          .get(KEY_EXTENSIONS);
-      if (extensions != null) {
-        final Object o = extensions.get(Page.KEY_MEDIATYPE);
-        attachment.mediaType = (o==null)?"":o.toString();
-      }
-
-      return attachment;
-    }
-
-    @Override
-    public Class<Attachment> getType() {
-      return Attachment.class;
-    }
-
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceResource.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceResource.java
deleted file mode 100644
index a2e9c3b..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceResource.java
+++ /dev/null
@@ -1,29 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-/**
- * <p>ConfluenceResource class</p>
- * <p>Used as base class for other classes like Page and Attachments</p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com> 
- *
- */
-public class ConfluenceResource {
-
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceResponse.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceResponse.java
deleted file mode 100644
index 5cc3a50..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceResponse.java
+++ /dev/null
@@ -1,76 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.manifoldcf.crawler.connectors.confluence.model.builder.ConfluenceResourceBuilder;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-
-public class ConfluenceResponse<T extends ConfluenceResource> {
-
-  private List<T> results;
-  private int start;
-  private int limit;
-  private Boolean isLast;
-  
-  public ConfluenceResponse(List<T> results, int start, int limit, Boolean isLast) {
-    this.results = results;
-    this.start = start;
-    this.limit = limit;
-    this.isLast = isLast;
-  }
-  
-  public List<T> getResults() {
-    return this.results;
-  }
-  
-  public int getStart() {
-    return this.start;
-  }
-  
-  public int getLimit() {
-    return this.limit;
-  }
-  
-  public Boolean isLast() {
-    return isLast;
-  }
-  
-  public static <T extends ConfluenceResource> ConfluenceResponse<T> fromJson(JSONObject response, ConfluenceResourceBuilder<T> builder) {
-    List<T> resources = new ArrayList<T>();
-    JSONArray jsonArray = (JSONArray)response.get("results");
-    for(int i=0,size=jsonArray.size(); i<size;i++) {
-      JSONObject jsonPage = (JSONObject)jsonArray.get(i);
-      T resource = (T) builder.fromJson(jsonPage);
-      resources.add(resource);
-    }
-      
-    int limit = ((Long)response.get("limit")).intValue();
-    int start = ((Long)response.get("start")).intValue();
-    Boolean isLast = false;
-    JSONObject links = (JSONObject)response.get("_links");
-    if(links != null) {
-      isLast = (links.get("next")==null);
-    }
-      
-    return new ConfluenceResponse<T>(resources, start, limit, isLast);
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceUser.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceUser.java
deleted file mode 100644
index eff1069..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/ConfluenceUser.java
+++ /dev/null
@@ -1,45 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.util.List;
-
-/**
- * <p>ConfluenceUser class</p>
- * <p>Represents a Confluence user</p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class ConfluenceUser {
-    private final String username;
-    private final List<String> authorities;
-
-    public ConfluenceUser(String username, List<String> authorities) {
-      this.username = username;
-      this.authorities = authorities;
-    }
-
-    public String getUsername() {
-      return username;
-    }
-
-    public List<String> getAuthorities() {
-      return authorities;
-    }
-  }
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Label.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Label.java
deleted file mode 100644
index 9e249a8..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Label.java
+++ /dev/null
@@ -1,103 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import org.apache.manifoldcf.crawler.connectors.confluence.model.builder.ConfluenceResourceBuilder;
-import org.json.simple.JSONObject;
-
-/**
- * <p>
- * Label class
- * </p>
- * <p>
- * Represents a Confluence Label
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- */
-public class Label extends ConfluenceResource{
-
-  protected static final String KEY_LINKS = "_links";
-  protected static final String KEY_ID = "id";
-  protected static final String KEY_SELF = "self";
-  protected static final String KEY_PREFIX = "prefix";
-  protected static final String KEY_NAME = "name";
-
-  protected String id;
-  protected String prefix;
-  protected String name;
-
-  @SuppressWarnings("unused")
-  private JSONObject delegated;
-
-  public Label() {
-
-  }
-
-  public String getId() {
-    return this.id;
-  }
-
-  public String getPrefix() {
-    return this.prefix;
-  }
-
-  public String getName() {
-    return this.name;
-  }
-
-  public static LabelBuilder builder() {
-    return new LabelBuilder();
-  }
-
-  /**
-   * <p>
-   * LabelBuilder internal class
-   * </p>
-   * <p>
-   * Used to build Labels
-   * </p>
-   * 
-   * @author Antonio David Perez Morales <adperezmorales@gmail.com>
-   *
-   */
-  public static class LabelBuilder implements ConfluenceResourceBuilder<Label>{
-
-    public Label fromJson(JSONObject jsonLabel) {
-      return fromJson(jsonLabel, new Label());
-    }
-
-    public Label fromJson(JSONObject jsonPage, Label label) {
-
-      label.id = (jsonPage.get(KEY_ID)==null)?"":jsonPage.get(KEY_ID).toString();
-      label.prefix = (jsonPage.get(KEY_PREFIX)==null)?"":jsonPage.get(KEY_PREFIX).toString();
-      label.name = (jsonPage.get(KEY_NAME)==null)?"":jsonPage.get(KEY_NAME).toString();
-
-      label.delegated = jsonPage;
-
-      return label;
-
-    }
-
-    @Override
-    public Class<Label> getType() {
-      return Label.class;
-    }
-
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/MutableAttachment.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/MutableAttachment.java
deleted file mode 100644
index d3e9041..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/MutableAttachment.java
+++ /dev/null
@@ -1,111 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.io.InputStream;
-import java.util.Date;
-
-/**
- * <p>
- * Mutable Attachment class
- * </p>
- * <p>
- * Represents a Confluence Attachment which can be mutated
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- */
-public class MutableAttachment extends Attachment {
-
-  public void setId(String id) {
-    this.id = id;
-  }
-  
-  public void setSpace(String space) {
-    this.space = space;
-  }
-
-  public void setBaseUrl(String baseUrl) {
-    this.baseUrl = baseUrl;
-  }
-
-  public void setUrlContext(String urlContext) {
-    this.urlContext = urlContext;
-  }
-  
-  public void setUrl(String url) {
-    this.url = url;
-  }
-  
-  public void setWebUrl(String webUrl) {
-    this.webUrl = webUrl;
-  }
-  
-  public void setCreatedDate(Date createdDate) {
-    this.createdDate = createdDate;
-  }
-  
-  public void setLastModified(Date lastModified) {
-    this.lastModified = lastModified;
-  }
-  
-  public void setType(PageType type) {
-    this.type = type;
-  }
-  
-  public void setTitle(String title) {
-    this.title = title;
-  }
-  
-  public void setVersion(int version) {
-    this.version = version;
-  }
-  
-  public void setCreator(String creator) {
-    this.creator = creator;
-  }
-  
-  public void setCreatorUsername(String creatorUsername) {
-    this.creatorUsername = creatorUsername;
-  }
-  
-  public void setLastModifier(String lastModifier) {
-    this.lastModifier = lastModifier;
-  }
-  
-  public void setLastModifierUsername(String lastModifierUsername) {
-    this.lastModifierUsername = lastModifierUsername;
-  }
-  
-  public void setMediaType(String mediaType) {
-    this.mediaType = mediaType;
-  }
-  
-  public void setLength(long length) {
-    this.length = length;
-  }
-  
-  public void setDownloadUrl(String downloadUrl) {
-    this.downloadUrl = downloadUrl;
-  }
-  
-  public void setContentStream(InputStream contentStream) {
-    this.contentStream = contentStream;
-  }  
-
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/MutablePage.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/MutablePage.java
deleted file mode 100644
index 71816e9..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/MutablePage.java
+++ /dev/null
@@ -1,116 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * <p>
- * MutablePage class
- * </p>
- * <p>
- * Represents a Confluence Page which is mutable unlike {@code Page} class which can be also initialized using the PageBuilder obtained from
- * <code>Page.builder()</code> method
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- */
-public class MutablePage extends Page {
-
-  public MutablePage() {
-
-  }
-  
-  public void setId(String id) {
-    this.id = id;
-  }
-
-  public void setSpace(String space) {
-    this.space = space;
-  }
-
-  public void setBaseUrl(String baseUrl) {
-    this.baseUrl = baseUrl;
-  }
-
-  public void setUrlContext(String urlContext) {
-    this.urlContext = urlContext;
-  }
-
-  public void setUrl(String url) {
-    this.url = url;
-  }
-
-  public void setWebUrl(String webUrl) {
-    this.webUrl = webUrl;
-  }
-
-  public void setCreatedDate(Date createdDate) {
-    this.createdDate = createdDate;
-  }
-
-  public void setLastModified(Date lastModified) {
-    this.lastModified = lastModified;
-  }
-
-  public void setType(PageType type) {
-    this.type = type;
-  }
-
-  public void setTitle(String title) {
-    this.title = title;
-  }
-
-  public void setVersion(int version) {
-    this.version = version;
-  }
-
-  public void setCreator(String creator) {
-    this.creator = creator;
-  }
-
-  public void setCreatorUsername(String creatorUsername) {
-    this.creatorUsername = creatorUsername;
-  }
-
-  public void setLastModifier(String lastModifier) {
-    this.lastModifier = lastModifier;
-  }
-
-  public void setLastModifierUsername(String lastModifierUsername) {
-    this.lastModifierUsername = lastModifierUsername;
-  }
-
-  public void setMediaType(String mediaType) {
-    this.mediaType = mediaType;
-  }
-
-  public void setLength(long length) {
-    this.length = length;
-  }
-
-  public void setContent(String content) {
-    this.content = content;
-  }
-
-  public void setLabels(List<Label> labels) {
-    this.labels = labels;
-  }
-
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Page.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Page.java
deleted file mode 100644
index 4383cff..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Page.java
+++ /dev/null
@@ -1,354 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.common.DateParser;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.builder.ConfluenceResourceBuilder;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * <p>
- * Page class
- * </p>
- * <p>
- * Represents a Confluence Page
- * </p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- */
-public class Page extends ConfluenceResource{
-
-  protected static final String KEY_LINKS = "_links";
-  protected static final String KEY_ID = "id";
-  protected static final String KEY_SELF = "self";
-  protected static final String KEY_WEBUI = "webui";
-  protected static final String KEY_BASE = "base";
-  protected static final String KEY_CONTEXT = "context";
-  protected static final String KEY_KEY = "key";
-  protected static final String KEY_TITLE = "title";
-  protected static final String KEY_BODY = "body";
-  protected static final String KEY_VIEW = "view";
-  protected static final String KEY_VALUE = "value";
-  protected static final String KEY_SPACE = "space";
-  protected static final String KEY_HISTORY = "history";
-  protected static final String KEY_CREATED_DATE = "createdDate";
-  protected static final String KEY_CREATED_BY = "createdBy";
-  protected static final String KEY_BY = "by";
-  protected static final String KEY_TYPE = "type";
-  protected static final String KEY_DISPLAY_NAME = "displayName";
-  protected static final String KEY_USER_NAME = "username";
-  protected static final String KEY_VERSION = "version";
-  protected static final String KEY_WHEN = "when";
-  protected static final String KEY_MEDIATYPE = "mediaType";
-
-  private static final String PAGE_ID = "confluenceId";
-  private static final String PAGE_URL = "url";
-  private static final String PAGE_WEBURL = "webUrl";
-  private static final String PAGE_LAST_MODIFIED = "lastModified";
-  private static final String PAGE_CREATOR = "creator";
-  private static final String PAGE_CREATOR_USERNAME = "creatorUsername";
-  private static final String PAGE_LAST_MODIFIER = "lastModifier";
-  private static final String PAGE_LAST_MODIFIER_USERNAME = "lastModifierUsername";
-  private static final String PAGE_SIZE = "size";
-  private static final String PAGE_LABEL = "label";
-
-  protected String id;
-  protected String space;
-  protected String baseUrl;
-  protected String urlContext;
-  protected String url;
-  protected String webUrl;
-  protected Date createdDate;
-  protected Date lastModified;
-  protected PageType type;
-  protected String title;
-  protected int version;
-  protected String creator;
-  protected String creatorUsername;
-  protected String lastModifier;
-  protected String lastModifierUsername;
-  protected String mediaType = "text/html; charset=utf-8";
-  protected long length;
-  protected String content;
-  protected List<Label> labels = Lists.newArrayList();
-
-  @SuppressWarnings("unused")
-  private JSONObject delegated;
-
-  public Page() {
-
-  }
-
-  public String getContent() {
-    return this.content;
-  }
-
-  public String getId() {
-    return this.id;
-  }
-
-  public PageType getType() {
-    return this.type;
-  }
-
-  public String getMediaType() {
-    return this.mediaType;
-  }
-
-  public int getVersion() {
-    return this.version;
-  }
-
-  public String getTitle() {
-    return this.title;
-  }
-
-  public String getBaseUrl() {
-    return this.baseUrl;
-  }
-
-  public String getUrlContext() {
-    return this.urlContext;
-  }
-
-  public String getWebUrl() {
-    return this.webUrl;
-  }
-
-  public String getUrl() {
-    return this.url;
-  }
-
-  public String getSpace() {
-    return this.space;
-  }
-
-  public String getCreator() {
-    return this.creator;
-  }
-
-  public String getCreatorUsername() {
-    return this.creatorUsername;
-  }
-
-  public String getLastModifier() {
-    return this.lastModifier;
-  }
-
-  public String getLastModifierUsername() {
-    return this.lastModifierUsername;
-  }
-
-  public Date getCreatedDate() {
-    return this.createdDate;
-  }
-
-  public Date getLastModifiedDate() {
-    return this.lastModified;
-  }
-
-  public long getLength() {
-    return this.length;
-  }
-
-  public boolean hasContent() {
-    return this.length > 0 && this.content != null;
-  }
-  
-  public InputStream getContentStream() {
-    String contentStream = content != null ? content : "";
-    return new ByteArrayInputStream(
-        contentStream.getBytes(StandardCharsets.UTF_8));
-  }
-
-  public List<Label> getLabels() {
-    return this.labels;
-  }
-  
-  public Map<String, Object> getMetadataAsMap() {
-    Map<String, Object> pageMetadata = Maps.newHashMap();
-    pageMetadata.put(KEY_ID,  this.id);
-    pageMetadata.put(PAGE_ID, this.id);
-    pageMetadata.put(KEY_TYPE, this.type.toString());
-    pageMetadata.put(KEY_TITLE, this.title);
-    pageMetadata.put(KEY_SPACE, this.space);
-    pageMetadata.put(PAGE_URL, this.url);
-    pageMetadata.put(PAGE_WEBURL, this.webUrl);
-    pageMetadata.put(KEY_CREATED_DATE,
-        DateParser.formatISO8601Date(this.createdDate));
-    pageMetadata.put(PAGE_LAST_MODIFIED,
-        DateParser.formatISO8601Date(this.lastModified));
-    pageMetadata.put(KEY_MEDIATYPE, this.mediaType);
-    pageMetadata.put(KEY_VERSION, String.valueOf(this.version));
-    pageMetadata.put(PAGE_CREATOR, this.creator);
-    pageMetadata.put(PAGE_CREATOR_USERNAME, this.creatorUsername);
-    pageMetadata.put(PAGE_LAST_MODIFIER, this.lastModifier);
-    pageMetadata
-        .put(PAGE_LAST_MODIFIER_USERNAME, this.lastModifierUsername);
-    pageMetadata.put(PAGE_SIZE, String.valueOf(this.length));
-    
-    putLabelsOnMetadataMap(pageMetadata);
-    refineMetadata(pageMetadata);
-    return pageMetadata;
-  }
-
-  /**
-   * <p>Put the page labels on the metadata map</p>
-   * @param pageMetadata
-   */
-  private void putLabelsOnMetadataMap(Map<String, Object> pageMetadata) {
-    if(this.labels == null || this.labels.isEmpty()) {
-      return;
-    }
-    
-    Iterable<String> labelsString = Iterables.transform(this.labels, new Function<Label, String>() {
-      @Override
-      public String apply(Label input) {
-        return input.getName();
-      }
-    });
-    
-    pageMetadata.put(PAGE_LABEL, Lists.newArrayList(labelsString));
-    
-  }
-
-  /**
-   * <p>
-   * Used to be overwritten by child classes to add more metadata to the map
-   * </p>
-   * 
-   * @param metadata
-   */
-  protected void refineMetadata(Map<String, Object> metadata) {
-  }
-
-  public static ConfluenceResourceBuilder<? extends Page> builder() {
-    return new PageBuilder();
-  }
-
-  /**
-   * <p>PageBuilder internal class</p>
-   * <p>Used to build pages</p>
-   * @author Antonio David Perez Morales <adperezmorales@gmail.com>
-   *
-   */
-  public static class PageBuilder implements ConfluenceResourceBuilder<Page>{
-    
-    public Page fromJson(JSONObject jsonPage) {
-      return fromJson(jsonPage, new Page());
-    }
-    
-    public Page fromJson(JSONObject jsonPage, Page page) {
-
-      String id = jsonPage.get(KEY_ID).toString();
-      String type = jsonPage.get(KEY_TYPE).toString();
-      String title = jsonPage.get(KEY_TITLE).toString();
-
-      page.delegated = jsonPage;
-
-      /* Init Page fields */
-      page.id = id;
-      page.type = PageType.fromName(type);
-      page.title = title;
-
-      page.space = processSpace(jsonPage);
-
-      /*
-        * Url & WebUrl
-        */
-      JSONObject links = (JSONObject) jsonPage.get(KEY_LINKS);
-      if (links != null) {
-        page.url = (links.get(KEY_SELF)==null)?"":links.get(KEY_SELF).toString();
-        String webUrl = (links.get(KEY_WEBUI)==null)?"":links.get(KEY_WEBUI).toString();
-        page.urlContext = (links.get(KEY_CONTEXT)==null)?"":links.get(KEY_CONTEXT).toString();
-        page.baseUrl = (links.get(KEY_BASE)==null)?"":links.get(KEY_BASE).toString();
-        page.webUrl = page.baseUrl + webUrl;
-
-      }
-
-      /*
-        * Created By and created Date
-        */
-      JSONObject history = (JSONObject) jsonPage.get(KEY_HISTORY);
-      if (history != null) {
-
-        page.createdDate = DateParser.parseISO8601Date((history.get(KEY_CREATED_DATE)==null)?"":history.get(KEY_CREATED_DATE).toString());
-        JSONObject createdBy = (JSONObject) history.get(KEY_CREATED_BY);
-        if (createdBy != null) {
-          page.creator = (createdBy.get(KEY_DISPLAY_NAME)==null)?"":createdBy.get(KEY_DISPLAY_NAME).toString();
-          page.creatorUsername = (createdBy.get(KEY_USER_NAME)==null)?"":createdBy.get(KEY_USER_NAME).toString();
-        }
-
-      }
-
-      /*
-        * Last modifier and Last modified date
-        */
-      JSONObject version = (JSONObject) jsonPage.get(KEY_VERSION);
-      if (version != null) {
-        JSONObject by = (JSONObject) version.get(KEY_BY);
-        if (by != null) {
-          page.lastModifier = (by.get(KEY_DISPLAY_NAME)==null)?"":by.get(KEY_DISPLAY_NAME).toString();
-          page.lastModifierUsername = (by.get(KEY_USER_NAME)==null)?"":by.get(KEY_USER_NAME).toString();
-        }
-
-        page.lastModified = DateParser.parseISO8601Date((version.get(KEY_WHEN)==null)?"":version.get(KEY_WHEN).toString());
-      }
-
-      /*
-        * Page Content
-        */
-      JSONObject body = (JSONObject) jsonPage.get(KEY_BODY);
-      if (body != null) {
-        JSONObject view = (JSONObject) body.get(KEY_VIEW);
-        if (view != null) {
-          page.content = (view.get(KEY_VALUE)==null)?"":view.get(KEY_VALUE).toString();
-          page.length = page.content.getBytes(StandardCharsets.UTF_8).length;
-        }
-      }
-
-      return page;
-    }
-
-    private static String processSpace(JSONObject page) {
-      /* Page */
-      JSONObject space = (JSONObject) page.get(KEY_SPACE);
-      if (space != null)
-        return (space.get(KEY_KEY)==null)?"":space.get(KEY_KEY).toString();
-      return "";
-    }
-
-    @Override
-    public Class<Page> getType() {
-      return Page.class;
-    }
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/PageType.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/PageType.java
deleted file mode 100644
index 2c419a6..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/PageType.java
+++ /dev/null
@@ -1,48 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import org.apache.commons.lang.WordUtils;
-
-import java.util.Locale;
-
-/**
- * <p>PageType class</p>
- * <p>Represents the kind of pages we can have in Confluence</p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public enum PageType {
-
-  PAGE, ATTACHMENT;
-  
-  public static PageType fromName(String type) {
-    for(PageType pageType: values()) {
-      if(pageType.name().equalsIgnoreCase(type)) {
-        return pageType;
-      }
-    }
-    
-    return PageType.PAGE;
-  }
-  
-  public String toString() {
-    return WordUtils.capitalize(name().toLowerCase(Locale.ROOT));
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Space.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Space.java
deleted file mode 100644
index fa6a495..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Space.java
+++ /dev/null
@@ -1,72 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import org.json.simple.JSONObject;
-
-public class Space {
-
-  private static final String KEY_NAME = "name";
-  private static final String KEY_KEY = "key";
-  private static final String KEY_TYPE = "type";
-  private static final String KEY_URL = "url";
-  
-  private String key;
-  private String name;
-  private String type;
-  private String url;
-  
-  public Space() {
-    
-  }
-  
-  public String getKey() {
-    return key;
-  }
-  public void setKey(String key) {
-    this.key = key;
-  }
-  public String getName() {
-    return name;
-  }
-  public void setName(String name) {
-    this.name = name;
-  }
-  public String getType() {
-    return type;
-  }
-  public void setType(String type) {
-    this.type = type;
-  }
-  public String getUrl() {
-    return url;
-  }
-  public void setUrl(String url) {
-    this.url = url;
-  }
-  
-  public static Space fromJson(JSONObject spaceJson) {
-    Space space = new Space();
-    space.key = (spaceJson.get(KEY_KEY)==null)?"":spaceJson.get(KEY_KEY).toString();
-    space.name = (spaceJson.get(KEY_NAME)==null)?"":spaceJson.get(KEY_NAME).toString();
-    space.type = (spaceJson.get(KEY_TYPE)==null)?"":spaceJson.get(KEY_TYPE).toString();
-    space.url = (spaceJson.get(KEY_URL)==null)?"":spaceJson.get(KEY_URL).toString();
-    return space;
-  }
-  
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Spaces.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Spaces.java
deleted file mode 100644
index c1be1c2..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/Spaces.java
+++ /dev/null
@@ -1,47 +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 org.apache.manifoldcf.crawler.connectors.confluence.model;
-
-import java.util.ArrayList;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Spaces extends ArrayList<Space> {
-
-  private static Logger logger = LoggerFactory.getLogger(Spaces.class);
-  /**
-   * 
-   */
-  private static final long serialVersionUID = -5334215263162816914L;
-
-  
-  public static Spaces fromJson(JSONArray jsonSpaces) {
-    Spaces spaces = new Spaces();
-    for(int i=0,len=jsonSpaces.size();i<len;i++) {
-      JSONObject spaceJson = (JSONObject)jsonSpaces.get(i);
-      Space space = Space.fromJson(spaceJson);
-      spaces.add(space);
-    }
-    
-    return spaces;
-    
-  }
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/builder/ConfluenceResourceBuilder.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/builder/ConfluenceResourceBuilder.java
deleted file mode 100644
index 0783f8d..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/model/builder/ConfluenceResourceBuilder.java
+++ /dev/null
@@ -1,50 +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 org.apache.manifoldcf.crawler.connectors.confluence.model.builder;
-
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceResource;
-import org.json.simple.JSONObject;
-
-/**
- * <p>ConfluenceResourceBuilder interface</p>
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- * @param <T> Subtype of ConfluenceResource to be built
- */
-public interface ConfluenceResourceBuilder<T extends ConfluenceResource> {
-
-  /**
-   * <p>Creates a <T> instance from a JSON representation 
-   * @param jsonDocument
-   * @return T instance
-   */
-  T fromJson(JSONObject jsonDocument);
-  
-  /**
-   * <p>Populates the given <T> instance from a JSON representation and return it</p>
-   * @param jsonDocument
-   * @return T instance
-   */
-  T fromJson(JSONObject jsonDocument, T document);
-  
-  /**
-   * <p>Returns the Class of the resource that can be built</p>
-   * @return the type Class<T> of the resource which can be built by this builder
-   */
-  Class<T> getType();
-}
diff --git a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/util/ConfluenceUtil.java b/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/util/ConfluenceUtil.java
deleted file mode 100644
index a85d649..0000000
--- a/connectors/confluence/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/confluence/util/ConfluenceUtil.java
+++ /dev/null
@@ -1,59 +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 org.apache.manifoldcf.crawler.connectors.confluence.util;
-
-/**
- * <p>Utility class for Confluence connectors</p>
- * 
- * @author Antonio David Perez Morales <adperezmorales@gmail.com>
- *
- */
-public class ConfluenceUtil {
-
-  private static final String ATTACHMENT_ID_PREFIX = "att";
-  
-  /**
-   * <p>Generates a repository document identifier for the specific attachment and page to be used for Repository Documents for attachment pages</p>
-   * @param attachmentId
-   * @param pageId
-   * @return a generated 
-   */
-  public static String generateRepositoryDocumentIdentifier(String attachmentId, String pageId) {
-    StringBuilder sb = new StringBuilder();
-    sb.append(attachmentId).append("-").append(pageId);
-    return sb.toString();
-  }
-  
-  /**
-   * <p>Checks if the given id is an attachment or not</p>
-   * @param id
-   * @return a {@code Boolean} indicating if the id is related to an attachment or not 
-   */
-  public static Boolean isAttachment(String id) {
-    return id.startsWith(ATTACHMENT_ID_PREFIX);
-  }
-  
-  /**
-   * <p>Gets the attachment id and page id from a repository document id</p>
-   * @param id the repository document id
-   * @return an Array containing the attachment and page ids where index 0 is the attachment id and index 1 is the page id
-   */
-  public static String[] getAttachmentAndPageId(String id) {
-    return id.split("-");
-  }
-}
diff --git a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/confluence/common_en_US.properties b/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/confluence/common_en_US.properties
deleted file mode 100644
index eddade0..0000000
--- a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/confluence/common_en_US.properties
+++ /dev/null
@@ -1,29 +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.
-
-ConfluenceAuthorityConnector.Server=Server
-
-ConfluenceAuthorityConnector.ProtocolColon=Protocol:
-ConfluenceAuthorityConnector.HostColon=Host:
-ConfluenceAuthorityConnector.PortColon=Port:
-ConfluenceAuthorityConnector.PathColon=Path:
-ConfluenceAuthorityConnector.UsernameColon=Username:
-ConfluenceAuthorityConnector.PasswordColon=Password:
-
-ConfluenceAuthorityConnector.HostMustNotBeNull=Confluence host must not be null
-ConfluenceAuthorityConnector.HostMustNotIncludeSlash=Confluence host must not include a '/' character
-ConfluenceAuthorityConnector.PortMustBeAnInteger=Confluence port must be an integer
-ConfluenceAuthorityConnector.PathMustNotBeNull=Confluence path must not be null
-ConfluenceAuthorityConnector.PathMustBeginWithASlash=Confluence path must begin with a '/' character
diff --git a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/confluence/common_es_ES.properties b/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/confluence/common_es_ES.properties
deleted file mode 100644
index 66634eb..0000000
--- a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/confluence/common_es_ES.properties
+++ /dev/null
@@ -1,29 +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.
-
-ConfluenceAuthorityConnector.Server=Servidor
-
-ConfluenceAuthorityConnector.ProtocolColon=Protocolo:
-ConfluenceAuthorityConnector.HostColon=Host:
-ConfluenceAuthorityConnector.PortColon=Puerto:
-ConfluenceAuthorityConnector.PathColon=Camino:
-ConfluenceAuthorityConnector.UsernameColon=Nombre de usuario:
-ConfluenceAuthorityConnector.PasswordColon=Contraseña:
-
-ConfluenceAuthorityConnector.HostMustNotBeNull=Confluencia de acogida no debe ser nulo
-ConfluenceAuthorityConnector.HostMustNotIncludeSlash=Confluencia de acogida no debe incluir una '/' carácter
-ConfluenceAuthorityConnector.PortMustBeAnInteger=Confluencia puerto debe ser un entero
-ConfluenceAuthorityConnector.PathMustNotBeNull=Ruta Confluencia no debe ser nulo
-ConfluenceAuthorityConnector.PathMustBeginWithASlash=Confluencia ruta debe comenzar con una '/' carácter
diff --git a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/confluence/common_en_US.properties b/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/confluence/common_en_US.properties
deleted file mode 100644
index 8b4bd67..0000000
--- a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/confluence/common_en_US.properties
+++ /dev/null
@@ -1,42 +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.
-
-ConfluenceRepositoryConnector.Server=Server
-ConfluenceRepositoryConnector.Spaces=Spaces
-ConfluenceRepositoryConnector.Pages=Pages
-
-
-ConfluenceRepositoryConnector.ProtocolColon=Protocol:
-ConfluenceRepositoryConnector.HostColon=Host:
-ConfluenceRepositoryConnector.PortColon=Port:
-ConfluenceRepositoryConnector.PathColon=Path:
-ConfluenceRepositoryConnector.UsernameColon=Username:
-ConfluenceRepositoryConnector.PasswordColon=Password:
-
-ConfluenceRepositoryConnector.HostMustNotBeNull=Confluence host must not be null
-ConfluenceRepositoryConnector.HostMustNotIncludeSlash=Confluence host must not include a '/' character
-ConfluenceRepositoryConnector.PortMustBeAnInteger=Confluence port must be an integer
-ConfluenceRepositoryConnector.PathMustNotBeNull=Confluence path must not be null
-ConfluenceRepositoryConnector.PathMustBeginWithASlash=Confluence path must begin with a '/' character
-
-ConfluenceRepositoryConnector.NoSpacesConfigured=No spaces configured. All spaces will be crawled
-
-ConfluenceRepositoryConnector.Add=Add
-ConfluenceRepositoryConnector.AddSpace=Add Space
-ConfluenceRepositoryConnector.Delete=Delete
-ConfluenceRepositoryConnector.DeleteSpace=Delete space #
-ConfluenceRepositoryConnector.TypeInASpace=Type in a space
-
-ConfluenceRepositoryConnector.ProcessAttachments=Process Attachments
\ No newline at end of file
diff --git a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/confluence/common_es_ES.properties b/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/confluence/common_es_ES.properties
deleted file mode 100644
index 5c348ff..0000000
--- a/connectors/confluence/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/confluence/common_es_ES.properties
+++ /dev/null
@@ -1,42 +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.
-
-ConfluenceRepositoryConnector.Server=Servidor
-ConfluenceRepositoryConnector.Spaces=Espacios
-ConfluenceRepositoryConnector.Pages=Páginas
-
-
-ConfluenceRepositoryConnector.ProtocolColon=Protocolo:
-ConfluenceRepositoryConnector.HostColon=Host:
-ConfluenceRepositoryConnector.PortColon=Puerto:
-ConfluenceRepositoryConnector.PathColon=Camino:
-ConfluenceRepositoryConnector.UsernameColon=Nombre de usuario:
-ConfluenceRepositoryConnector.PasswordColon=Contraseña:
-
-ConfluenceRepositoryConnector.HostMustNotBeNull=Confluencia de acogida no debe ser nulo
-ConfluenceRepositoryConnector.HostMustNotIncludeSlash=Confluencia de acogida no debe incluir una '/' carácter
-ConfluenceRepositoryConnector.PortMustBeAnInteger=El puerto de confluencia debe ser un número entero
-ConfluenceRepositoryConnector.PathMustNotBeNull=El camino de confluencia no debe ser nulo
-ConfluenceRepositoryConnector.PathMustBeginWithASlash=Confluencia ruta debe comenzar con una '/' carácter
-
-ConfluenceRepositoryConnector.NoSpacesConfigured=Sin espacios configurados . Todos los espacios se rastrearán
-
-ConfluenceRepositoryConnector.Add=añadir
-ConfluenceRepositoryConnector.AddSpace=Añadir Espacio
-ConfluenceRepositoryConnector.Delete=borrar
-ConfluenceRepositoryConnector.DeleteSpace=eliminar el espacio #
-ConfluenceRepositoryConnector.TypeInASpace=Escriba un espacio
-
-ConfluenceRepositoryConnector.ProcessAttachments=Accesorios de Proceso
\ No newline at end of file
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/editConfiguration_conf.js b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/editConfiguration_conf.js
deleted file mode 100644
index 31b72e8..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/editConfiguration_conf.js
+++ /dev/null
@@ -1,92 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.confluence_port.value != "" && !isInteger(editconnection.confluence_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.ConfPortMustBeAnInteger'))");
-    editconnection.confluence_port.focus();
-    return false;
-  }
-
-  if (editconnection.confluence_host.value != "" && editconnection.confluence_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.HostMustNotIncludeSlash'))");
-    editconnection.confluence_host.focus();
-    return false;
-  }
-
-  if (editconnection.confluence_path.value != "" && !(editconnection.confluence_path.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PathMustBeginWithASlash'))");
-    editconnection.confluence_path.focus();
-    return false;
-  }
-
-  return true;
-}
- 
-function checkConfigForSave()
-{
-    
-  if (editconnection.confluence_host.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.HostMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.Server'))");
-    editconnection.confluence_host.focus();
-    return false;
-  }
-  
-  if (editconnection.confluence_host.value != "" && editconnection.confluence_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.HostMustNotIncludeSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.Server'))");
-    editconnection.confluence_host.focus();
-    return false;
-  }
-
-  if (editconnection.confluence_port.value != "" && !isInteger(editconnection.confluence_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.Server'))");
-    editconnection.confluence_port.focus();
-    return false;
-  }
-
-  if (editconnection.confluence_path.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PathMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.Server'))");
-    editconnection.confluence_path.focus();
-    return false;
-  }
-  
-  if (editconnection.confluence_path.value != "" && !(editconnection.confluence_path.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PathMustBeginWithASlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.Server'))");
-    editconnection.confluence_path.focus();
-    return false;
-  }
-  
-  return true;
-}
-//-->
-</script>
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/editConfiguration_conf_server.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/editConfiguration_conf_server.html
deleted file mode 100644
index 5113114..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/editConfiguration_conf_server.html
+++ /dev/null
@@ -1,99 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('ConfluenceAuthorityConnector.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select size="2" name="confluence_protocol">
-#if($CONFLUENCE_PROTOCOL == 'http')
-        <option value="http" selected="true">http</option>
-#else
-        <option value="http">http</option>
-#end
-#if($CONFLUENCE_PROTOCOL == 'https')
-        <option value="https" selected="true">https</option>
-#else
-        <option value="https">https</option>
-#end
-      </select>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.HostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="confluence_host" name="confluence_host" value="$Encoder.attributeEscape($CONFLUENCE_HOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="confluence_port" name="confluence_port" value="$Encoder.attributeEscape($CONFLUENCE_PORT)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PathColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="confluence_path" name="confluence_path" value="$Encoder.attributeEscape($CONFLUENCE_PATH)" />
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.UsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="confluence_username" name="confluence_username" value="$Encoder.attributeEscape($CONFLUENCE_USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="confluence_password" name="confluence_password" value="$Encoder.attributeEscape($CONFLUENCE_PASSWORD)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="confluence_protocol" value="$Encoder.attributeEscape($CONFLUENCE_PROTOCOL)" />
-<input type="hidden" name="confluence_host" value="$Encoder.attributeEscape($CONFLUENCE_HOST)" />
-<input type="hidden" name="confluence_port" value="$Encoder.attributeEscape($CONFLUENCE_PORT)" />
-<input type="hidden" name="confluence_path" value="$Encoder.attributeEscape($CONFLUENCE_PATH)" />
-<input type="hidden" name="confluence_username" value="$Encoder.attributeEscape($CONFLUENCE_USERNAME)" />
-<input type="hidden" name="confluence_password" value="$Encoder.attributeEscape($CONFLUENCE_PASSWORD)" />
-
-#end
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/viewConfiguration_conf.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/viewConfiguration_conf.html
deleted file mode 100644
index a6014cb..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/confluence/viewConfiguration_conf.html
+++ /dev/null
@@ -1,78 +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.
--->
-
-
-<table class="displaytable">
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_PROTOCOL)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.HostColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_HOST)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_PORT)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PathColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_PATH)</nobr>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.UsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_USERNAME)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceAuthorityConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>********</nobr>
-    </td>
-  </tr>
-
-</table>
-
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editConfiguration_conf.js b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editConfiguration_conf.js
deleted file mode 100644
index 32f3212..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editConfiguration_conf.js
+++ /dev/null
@@ -1,92 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.confluence_port.value != "" && !isInteger(editconnection.confluence_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.ConfPortMustBeAnInteger'))");
-    editconnection.confluence_port.focus();
-    return false;
-  }
-
-  if (editconnection.confluence_host.value != "" && editconnection.confluence_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.HostMustNotIncludeSlash'))");
-    editconnection.confluence_host.focus();
-    return false;
-  }
-
-//  if (editconnection.confluence_path.value != "" && !(editconnection.confluence_path.value.indexOf("/") == 0))
-//  {
-//    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PathMustBeginWithASlash'))");
-//    editconnection.confluence_path.focus();
-//    return false;
-//  }
-
-  return true;
-}
- 
-function checkConfigForSave()
-{
-    
-  if (editconnection.confluence_host.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.HostMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Server'))");
-    editconnection.confluence_host.focus();
-    return false;
-  }
-  
-  if (editconnection.confluence_host.value != "" && editconnection.confluence_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.HostMustNotIncludeSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Server'))");
-    editconnection.confluence_host.focus();
-    return false;
-  }
-
-  if (editconnection.confluence_port.value != "" && !isInteger(editconnection.confluence_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Server'))");
-    editconnection.confluence_port.focus();
-    return false;
-  }
-
-//  if (editconnection.confluence_path.value == "")
-//  {
-//    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PathMustNotBeNull'))");
-//    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Server'))");
-//    editconnection.confluence_path.focus();
-//    return false;
-//  }
-//  
-//  if (editconnection.confluence_path.value != "" && !(editconnection.confluence_path.value.indexOf("/") == 0))
-//  {
-//    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PathMustBeginWithASlash'))");
-//    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Server'))");
-//    editconnection.confluence_path.focus();
-//    return false;
-//  }
-  
-  return true;
-}
-//-->
-</script>
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editConfiguration_conf_server.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editConfiguration_conf_server.html
deleted file mode 100644
index 07f045d..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editConfiguration_conf_server.html
+++ /dev/null
@@ -1,99 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('ConfluenceRepositoryConnector.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select size="2" name="confluence_protocol">
-#if($CONFLUENCE_PROTOCOL == 'http')
-        <option value="http" selected="true">http</option>
-#else
-        <option value="http">http</option>
-#end
-#if($CONFLUENCE_PROTOCOL == 'https')
-        <option value="https" selected="true">https</option>
-#else
-        <option value="https">https</option>
-#end
-      </select>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.HostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="confluence_host" name="confluence_host" value="$Encoder.attributeEscape($CONFLUENCE_HOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="confluence_port" name="confluence_port" value="$Encoder.attributeEscape($CONFLUENCE_PORT)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PathColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="confluence_path" name="confluence_path" value="$Encoder.attributeEscape($CONFLUENCE_PATH)" />
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.UsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="confluence_username" name="confluence_username" value="$Encoder.attributeEscape($CONFLUENCE_USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="confluence_password" name="confluence_password" value="$Encoder.attributeEscape($CONFLUENCE_PASSWORD)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="confluence_protocol" value="$Encoder.attributeEscape($CONFLUENCE_PROTOCOL)" />
-<input type="hidden" name="confluence_host" value="$Encoder.attributeEscape($CONFLUENCE_HOST)" />
-<input type="hidden" name="confluence_port" value="$Encoder.attributeEscape($CONFLUENCE_PORT)" />
-<input type="hidden" name="confluence_path" value="$Encoder.attributeEscape($CONFLUENCE_PATH)" />
-<input type="hidden" name="confluence_username" value="$Encoder.attributeEscape($CONFLUENCE_USERNAME)" />
-<input type="hidden" name="confluence_password" value="$Encoder.attributeEscape($CONFLUENCE_PASSWORD)" />
-
-#end
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_conf.js b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_conf.js
deleted file mode 100644
index f4340fd..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_conf.js
+++ /dev/null
@@ -1,49 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkSpecificationForSave()
-{
-  return true;
-}
- 
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function s${SeqNum}_SpecDeleteSpace(i)
-{
-	s${SeqNum}_SpecOp("s${SeqNum}_spaceop_"+i,"Delete","space_"+i);
-}
-
-function s${SeqNum}_SpecAddSpace(i)
-{
-  var x = i-1;
-  if (editjob["s${SeqNum}_space"].value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.TypeInASpace'))");
-    editjob.s${SeqNum}_space.focus();
-    return;
-  }
-  s${SeqNum}_SpecOp("s${SeqNum}_spaceop","Add","space_"+i);
-}
-
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_confPages.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_confPages.html
deleted file mode 100644
index 29db7c9..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_confPages.html
+++ /dev/null
@@ -1,41 +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.
--->
-
-
-#if($TabName == $ResourceBundle.getString('ConfluenceRepositoryConnector.Pages') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description" colspan="2">
-        $Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.ProcessAttachments'))
-    </td>
-    <td class="value">
-      <input type="checkbox" name="s${SeqNum}_process_attachments" value="true"
-      #if($PROCESS_ATTACHMENTS) checked 
-      #end 
-      />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SeqNum}_process_attachments" value="$PROCESS_ATTACHMENTS"/>
-
-#end
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_confSpaces.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_confSpaces.html
deleted file mode 100644
index 9736717..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/editSpecification_confSpaces.html
+++ /dev/null
@@ -1,74 +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.
--->
-
-
-#if($TabName == $ResourceBundle.getString('ConfluenceRepositoryConnector.Spaces') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  #set($spacecounter = 0)
-  #foreach($space in $SPACES)
-
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_spaceop_$spacecounter" value=""/>
-      <input type="hidden" name="s${SeqNum}_space_$spacecounter" value="$Encoder.attributeEscape($space)"/>
-      <a name="s${SeqNum}_tokenspace_$spacecounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Delete'))" onClick='Javascript:s${SeqNum}_SpecDeleteSpace($spacecounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.DeleteSpace'))$spacecounter"/>
-      </a>
-    </td>
-    <td class="value">$Encoder.bodyEscape($space)</td>
-  </tr>
-
-    #set($spacecounter = $spacecounter + 1)
-  #end
-
-  #set($nextspace = $spacecounter + 1)
-
-  #if($spacecounter == 0)
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.NoSpacesConfigured'))</td>
-  </tr>
-  #end
-
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_spacescount" value="$spacecounter"/>
-      <input type="hidden" name="s${SeqNum}_spaceop" value=""/>
-      <a name="space_$spacecounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Add'))" onClick='Javascript:s${SeqNum}_SpecAddSpace($nextspace)' alt="$Encoder.attributeEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.AddSpace'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="s${SeqNum}_space" value=""/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($spacecounter = 0)
-  #foreach($space in $SPACES)
-<input type="hidden" name="s${SeqNum}_space_$spacecounter" value="$Encoder.attributeEscape($space)"/>
-    #set($spacecounter = $spacecounter + 1)
-  #end
-<input type="hidden" name="s${SeqNum}_spacescount" value="$spacecounter"/>
-
-#end
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/viewConfiguration_conf.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/viewConfiguration_conf.html
deleted file mode 100644
index 04941cf..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/viewConfiguration_conf.html
+++ /dev/null
@@ -1,77 +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.
--->
-
-<table class="displaytable">
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_PROTOCOL)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.HostColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_HOST)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_PORT)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PathColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_PATH)</nobr>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.UsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CONFLUENCE_USERNAME)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>********</nobr>
-    </td>
-  </tr>
-
-</table>
-
diff --git a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/viewSpecification_conf.html b/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/viewSpecification_conf.html
deleted file mode 100644
index 9c2e002..0000000
--- a/connectors/confluence/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/confluence/viewSpecification_conf.html
+++ /dev/null
@@ -1,46 +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.
--->
-
-<table class="displaytable">
-  <tr>
-#if($SPACES.size() == 0)
-    <td class="message" colspan="2">
-      $Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.NoSpacesConfigured'))
-    </td>
-#else
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.Spaces'))</nobr>
-    </td>
-    <td class="value">
-  #set($spacecounter = 0)
-  #foreach($space in $SPACES)
-    <nobr>$Encoder.bodyEscape($space)</nobr><br/>
-    #set($spacecounter = $spacecounter + 1)
-  #end
-    </td>
-#end
-  </tr>
-
-  <tr>
-    <td class="message" colspan="2">
-        $Encoder.bodyEscape($ResourceBundle.getString('ConfluenceRepositoryConnector.ProcessAttachments'))
-    </td>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($PROCESS_ATTACHMENTS)</nobr>
-    </td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/confluence/connector/src/test/java/org/apache/manifoldcf/authorities/confluence/tests/ConfluenceAuthorityTest.java b/connectors/confluence/connector/src/test/java/org/apache/manifoldcf/authorities/confluence/tests/ConfluenceAuthorityTest.java
deleted file mode 100644
index 8adf8e5..0000000
--- a/connectors/confluence/connector/src/test/java/org/apache/manifoldcf/authorities/confluence/tests/ConfluenceAuthorityTest.java
+++ /dev/null
@@ -1,86 +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 org.apache.manifoldcf.authorities.confluence.tests;
-
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Assert;
-
-import org.apache.manifoldcf.authorities.authorities.confluence.ConfluenceAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.authorities.interfaces.IAuthorityConnector;
-import org.apache.manifoldcf.crawler.connectors.confluence.client.ConfluenceClient;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceUser;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ConfluenceAuthorityTest {
-
-	@Mock
-	private ConfluenceClient client;
-	
-	private ConfluenceAuthorityConnector connector;
-	
-	@Before
-	public void setup() throws Exception{
-		connector = new ConfluenceAuthorityConnector();
-		connector.setConfluenceClient(client);
-	}
-	
-	@Test
-	public void checkMockInjection() throws Exception{
-		when(client.checkAuth()).thenReturn(true);
-		Assert.assertEquals(connector.check(), "Connection working");
-	}
-	
-	@Test
-	public void checkUserNotFound() throws Exception{
-		ConfluenceUser user = mock(ConfluenceUser.class);
-		when(user.getUsername()).thenReturn(null);
-		when(client.getUserAuthorities(anyString())).thenReturn(user);
-		AuthorizationResponse response = connector.getAuthorizationResponse(anyString());
-		String[] tokens = response.getAccessTokens();
-		Assert.assertEquals(tokens.length, 1);
-		Assert.assertEquals(tokens[0], IAuthorityConnector.GLOBAL_DENY_TOKEN);
-		Assert.assertEquals(response.getResponseStatus(), AuthorizationResponse.RESPONSE_USERNOTFOUND);
-	}
-	
-	@Test
-	public void checkUserFound() throws Exception{
-		ConfluenceUser user = mock(ConfluenceUser.class);
-		when(user.getUsername()).thenReturn("A");
-		List<String> tokens = new ArrayList<String>();
-		tokens.add("B");
-		when(user.getAuthorities()).thenReturn(tokens);
-		when(client.getUserAuthorities(anyString())).thenReturn(user);
-		AuthorizationResponse response = connector.getAuthorizationResponse(anyString());
-		String[] tokens_aux = response.getAccessTokens();
-		Assert.assertEquals(tokens_aux.length, 1);
-		Assert.assertEquals(tokens_aux[0], tokens.get(0));
-		Assert.assertEquals(response.getResponseStatus(), AuthorizationResponse.RESPONSE_OK);
-	}
-	
-}
diff --git a/connectors/confluence/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/confluence/tests/ConfluenceConnectorTest.java b/connectors/confluence/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/confluence/tests/ConfluenceConnectorTest.java
deleted file mode 100644
index 7398635..0000000
--- a/connectors/confluence/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/confluence/tests/ConfluenceConnectorTest.java
+++ /dev/null
@@ -1,206 +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 org.apache.manifoldcf.crawler.connectors.confluence.tests;
-
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.nio.charset.StandardCharsets;
-import java.text.DateFormat;
-import java.util.*;
-
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.connectors.confluence.ConfluenceRepositoryConnector;
-import org.apache.manifoldcf.crawler.connectors.confluence.client.ConfluenceClient;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.ConfluenceResponse;
-import org.apache.manifoldcf.crawler.connectors.confluence.model.Page;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.system.SeedingActivity;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import com.google.common.base.Optional;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ConfluenceConnectorTest {
-
-	@Mock
-	private ConfluenceClient client;
-	
-	private ConfluenceRepositoryConnector connector;
-	
-	@SuppressWarnings("unchecked")
-	@Before
-	public void setup() throws Exception{
-		connector = new ConfluenceRepositoryConnector();
-		connector.setConfluenceClient(client);
-		when(client.getPages(anyInt(), anyInt(), Mockito.any(Optional.class))).
-			thenReturn(new ConfluenceResponse<Page>(Collections.<Page>emptyList(), 0, 0, true));
-	}
-	
-	@SuppressWarnings("unchecked")
-	@Test
-	public void mockEmptySeeding() throws Exception {
-		
-		SeedingActivity activities = mock(SeedingActivity.class);
-		Specification spec = new Specification();
-		long seedTime = 0;
-
-		connector.addSeedDocuments(activities, spec, "", seedTime, BaseRepositoryConnector.JOBMODE_ONCEONLY);
-		// Verify it starts always at 0. Pagination configurable so anyInt(). Only one call because isLast must be false
-		verify(client, times(1)).getPages(eq(0), anyInt(), Mockito.any(Optional.class));
-	}
-	
-	@SuppressWarnings("unchecked")
-	@Test
-	public void mockSeeding() throws Exception {
-		
-		SeedingActivity activities = mock(SeedingActivity.class);
-		Specification spec = new Specification();
-		long seedTime = 0;
-	
-		List<Page> pages = new ArrayList<Page>();
-		Page page = mock(Page.class);
-		pages.add(page);
-		when(client.getPages(anyInt(), anyInt(), Mockito.any(Optional.class))).
-			thenReturn(new ConfluenceResponse<Page>(pages, 0, 0, false)).
-			thenReturn(new ConfluenceResponse<Page>(Collections.<Page>emptyList(), 0, 0, true));
-		connector.addSeedDocuments(activities, spec, "", seedTime, BaseRepositoryConnector.JOBMODE_ONCEONLY);
-		verify(activities, times(1)).addSeedDocument(Mockito.anyString());
-		verify(client, times(1)).getPages(eq(0), anyInt(), Mockito.any(Optional.class));
-		verify(client, times(1)).getPages(eq(1), anyInt(), Mockito.any(Optional.class));
-	}
-	
-	@Test
-	public void mockSimpleIngestion() throws Exception{
-		
-		Page fakePage = mock(Page.class);
-		
-		Date date = new Date();
-		DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.ROOT);
-		String content = "A";
-		String uri = "http://test";
-		byte[] documentBytes = content
-				.getBytes(StandardCharsets.UTF_8);
-		long size = (long) documentBytes.length;
-		
-		when(fakePage.hasContent()).thenReturn(true);
-		when(fakePage.getContent()).thenReturn(content);
-		when(fakePage.getLength()).thenReturn(size);
-		when(fakePage.getLastModifiedDate()).thenReturn(date);
-		when(fakePage.getMediaType()).thenReturn("text/plain");
-		when(fakePage.getCreatedDate()).thenReturn(date);
-		when(fakePage.getWebUrl()).thenReturn(uri);
-		Map<String, Object> metadata = new HashMap<String, Object>();
-		metadata.put("x", "y");	
-		when(fakePage.getMetadataAsMap()).thenReturn(metadata);
-						
-		IProcessActivity activities = mock(IProcessActivity.class);
-	    when(activities.checkLengthIndexable(anyLong()))
-	      .thenReturn(true);
-	    when(activities.checkMimeTypeIndexable(anyString()))
-	      .thenReturn(true);
-	    when(activities.checkDateIndexable((Date)anyObject()))
-	      .thenReturn(true);
-	    when(activities.checkURLIndexable(anyString()))
-	      .thenReturn(true);
-	    when(activities.checkDocumentNeedsReindexing(anyString(), anyString()))
-	      .thenReturn(true);
-	    IExistingVersions statuses = mock(IExistingVersions.class);
-	    
-	    String ID = df.format(date);
-	    when(statuses.getIndexedVersionString(ID)).
-	    	thenReturn(null);
-	    
-	    when(client.getPage(Mockito.anyString())).
-	    	thenReturn(fakePage);
-	    
-	    connector.processDocuments(new String[]{ID}, statuses, new Specification(), activities, 0, true);
-	    ArgumentCaptor<RepositoryDocument> rd = ArgumentCaptor.forClass(RepositoryDocument.class);
-	    
-	    verify(client, times(1)).getPage(ID);
-	    verify(activities, times(1)).ingestDocumentWithException(eq(ID),
-				eq(df.format(date)), eq(uri), rd.capture());
-	    verify(activities, times(1)).recordActivity(anyLong(),
-	    		eq("read document"), eq(size), eq(ID), eq("OK"),
-				anyString(), Mockito.isNull(String[].class));
-	    
-	    RepositoryDocument doc = rd.getValue();
-	    Assert.assertEquals(size, doc.getBinaryLength());
-	    String[] values = doc.getFieldAsStrings("x");
-	    Assert.assertEquals(values.length, 1);
-	    Assert.assertEquals(values[0], "y");
-	    
-	}
-	
-	@Test
-	public void mockNeedsReindexing() throws Exception{
-		Page fakePage = mock(Page.class);
-		when(fakePage.hasContent()).thenReturn(true);
-		Date date = new Date();
-		DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.ROOT);
-		String version = df.format(date);
-		when(fakePage.getLastModifiedDate()).thenReturn(df.parse(version));
-		
-		String id = "1";
-		IProcessActivity activities = mock(IProcessActivity.class);
-		IExistingVersions statuses = mock(IExistingVersions.class);
-		when(statuses.getIndexedVersionString(id)).
-			thenReturn(version);
-		
-		when(client.getPage(Mockito.anyString())).
-    		thenReturn(fakePage);
-		
-		connector.processDocuments(new String[]{id}, statuses, new Specification(), activities, 0, true);
-		verify(client, times(1)).getPage(id);
-		verify(activities, times(1)).checkDocumentNeedsReindexing(id, version);
-	}
-	
-	@Test
-	public void mockDeleteDocument() throws Exception{
-		Page fakePage = mock(Page.class);
-		when(fakePage.hasContent()).thenReturn(false);
-		String id = "A";
-		when(fakePage.hasContent()).thenReturn(false);
-		when(client.getPage(Mockito.anyString())).
-    	thenReturn(fakePage);
-		
-		IExistingVersions statuses = mock(IExistingVersions.class);
-		IProcessActivity activities = mock(IProcessActivity.class);
-		connector.processDocuments(new String[]{id}, statuses, new Specification(), activities, 0, true);
-		verify(client, times(1)).getPage(id);
-		verify(activities, times(1)).deleteDocument(id);
-				
-	}
-		
-}
diff --git a/connectors/confluence/pom.xml b/connectors/confluence/pom.xml
deleted file mode 100644
index 9bffb59..0000000
--- a/connectors/confluence/pom.xml
+++ /dev/null
@@ -1,348 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-
-  <name>ManifoldCF - Connectors - Confluence Connector</name>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>mcf-confluence-connector</artifactId>
-  <packaging>jar</packaging>
-
-  <url>http://maven.apache.org</url>
-
-  <developers>
-    <developer>
-      <name>Antonio David Perez Morales</name>
-      <email>adperezmorales@gmail.com</email>
-    </developer>
-  </developers>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-          <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-          <execution>
-            <id>native2ascii-utf8</id>
-            <goals>
-              <goal>native2ascii</goal>
-            </goals>
-            <configuration>
-              <encoding>UTF8</encoding>
-              <includes>
-                <include>**/*.properties</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <!--This plugin's configuration is used to store Eclipse m2e settings 
-          only. It has no influence on the Maven build itself. -->
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.apache.maven.plugins
-                    </groupId>
-                    <artifactId>
-                      maven-dependency-plugin
-                    </artifactId>
-                    <versionRange>
-                      [2.8,)
-                    </versionRange>
-                    <goals>
-                      <goal>copy</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.codehaus.mojo
-                    </groupId>
-                    <artifactId>
-                      native2ascii-maven-plugin
-                    </artifactId>
-                    <versionRange>
-                      [1.0-beta-1,)
-                    </versionRange>
-                    <goals>
-                      <goal>native2ascii</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.apache.maven.plugins
-                    </groupId>
-                    <artifactId>
-                      maven-remote-resources-plugin
-                    </artifactId>
-                    <versionRange>
-                      [1.5,)
-                    </versionRange>
-                    <goals>
-                      <goal>process</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-
-
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>${commons-lang.version}</version>
-      <type>jar</type>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>15.0</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>${mockito.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.github.tomakehurst</groupId>
-      <artifactId>wiremock</artifactId>
-      <version>${wiremock.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-
-  </dependencies>
-
-</project>
diff --git a/connectors/contentlimiter/.gitignore b/connectors/contentlimiter/.gitignore
deleted file mode 100644
index 75472cf..0000000
--- a/connectors/contentlimiter/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.settings/
-/.project
diff --git a/connectors/contentlimiter/build.xml b/connectors/contentlimiter/build.xml
deleted file mode 100644
index 4e25a9c..0000000
--- a/connectors/contentlimiter/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="contentlimiter" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="Content limiter"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.contentlimiter.ContentLimiter"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/ContentLimiter.java b/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/ContentLimiter.java
deleted file mode 100644
index f96b908..0000000
--- a/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/ContentLimiter.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.contentlimiter;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.commons.io.IOUtils;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-public class ContentLimiter extends org.apache.manifoldcf.agents.transformation.BaseTransformationConnector {
-
-  /** Forward to the javascript to check the specification parameters for the job */
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  
-  private static final String EDIT_SPECIFICATION_CONTENT_HTML = "editSpecification_Content.html";
-  
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  protected static final String ACTIVITY_LIMIT = "limit";
-
-  protected static final String[] activitiesList = new String[]{ACTIVITY_LIMIT};
-  
-  /** We handle up to 64K in memory; after that we go to disk. */
-  protected static final long inMemoryMaximumFile = 65536;
-  
-  /** Return a list of activities that this connector generates.
-  * The connector does NOT need to be connected before this method is called.
-  *@return the set of activities.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** Constructor.
-   */
-  public ContentLimiter(){
-  }
-  
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param os is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification os)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    SpecPacker sp = new SpecPacker(os);
-    return new VersionContext(sp.toPackedString(),params,os);
-  }
-
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param outputDescription is the document's output version.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext outputDescription, String mimeType, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return activities.checkMimeTypeIndexable(mimeType);
-  }
-
-  @Override
-  public boolean checkLengthIndexable(VersionContext outputDescription, long length, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    final SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    return activities.checkLengthIndexable(Math.min(length, sp.lengthCutoff));
-  }
-  
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  *@return the document status (accepted or permanently rejected).
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    final SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    
-    InputStream is = null;
-    DestinationStorage ds = null;
-    try {
-      RepositoryDocument finalDocument;
-      long length;
-      long startTime = System.currentTimeMillis();
-      String resultCode = "OK";
-      String description = null;
-      
-      if(document.getBinaryLength() > sp.lengthCutoff) {
-          
-        if (document.getBinaryLength() <= inMemoryMaximumFile)
-        {
-          ds = new MemoryDestinationStorage((int)document.getBinaryLength());
-        }
-        else
-        {
-          ds = new FileDestinationStorage();
-        }
-        
-        // Create a copy of Repository Document
-        finalDocument = document.duplicate();
-        
-        InputStream docIs = document.getBinaryStream();
-        try {
-          IOUtils.copyLarge(docIs, ds.getOutputStream(), 0L, sp.lengthCutoff);
-          
-          // Get new stream length
-          length = ds.getBinaryLength();
-          is = ds.getInputStream();
-          finalDocument.setBinary(is,length);
-          resultCode = "TRUNCATEDOK";
-        } catch(IOException e) {
-          resultCode = "TRUNCATEDERROR";
-          description = e.getMessage();
-          return DOCUMENTSTATUS_REJECTED;
-        } finally {
-          docIs.close();
-        }
-      } else {
-        finalDocument = document;
-        length = document.getBinaryLength();
-      }
-      
-      activities.recordActivity(new Long(startTime), ACTIVITY_LIMIT, length, documentURI,
-                resultCode, description);
-      return activities.sendDocument(documentURI, finalDocument);
-    } finally {
-      if(is != null) {
-        is.close();
-      }
-      if(ds != null) {
-        ds.close();
-      }
-    }
-  }
-  
-  protected static void fillInContentSpecificationMap(Map<String,Object> paramMap, Specification os)
-  {
-    String maxContentLength = ContentLimiterConfig.MAXLENGTH_DEFAULT;
-    for (int i = 0; i < os.getChildCount(); i++)
-    {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(ContentLimiterConfig.NODE_MAXLENGTH)) {
-        maxContentLength = sn.getAttributeValue(ContentLimiterConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    paramMap.put("MAXCONTENTLENGTH",maxContentLength);
-  }
-  
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    tabsArray.add(Messages.getString(locale, "ContentLimiter.ContentTabName"));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInContentSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_JS,paramMap);
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM",Integer.toString(actualSequenceNumber));
-
-    // Fill in the field mapping tab data
-    fillInContentSpecificationMap(paramMap, os);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_CONTENT_HTML,paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    
-    String x;
-
-    x = variableContext.getParameter(seqPrefix+"maxcontentlength");
-    if (x != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(ContentLimiterConfig.NODE_MAXLENGTH))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(ContentLimiterConfig.NODE_MAXLENGTH);
-      sn.setAttribute(ContentLimiterConfig.ATTRIBUTE_VALUE,x);
-      os.addChild(os.getChildCount(),sn);
-    }
-    
-    return null;
-  }
-  
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInContentSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPECIFICATION_HTML,paramMap);
-    
-  }
-  
-  protected static Set<String> fillSet(String input) {
-    Set<String> rval = new HashSet<String>();
-    try
-    {
-      StringReader sr = new StringReader(input);
-      BufferedReader br = new BufferedReader(sr);
-      String line = null;
-      while ((line = br.readLine()) != null)
-      {
-        line = line.trim();
-        if (line.equals("*"))
-          rval = null;
-        else if (rval != null && line.length() > 0)
-          rval.add(line.toLowerCase(Locale.ROOT));
-      }
-    }
-    catch (IOException e)
-    {
-      // Should never happen
-      throw new RuntimeException("IO exception reading strings: "+e.getMessage(),e);
-    }
-    return rval;
-  }
-  
-  protected static int handleIOException(IOException e)
-		    throws ManifoldCFException
-  {
-    // IOException reading from our local storage...
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-  
-  protected static interface DestinationStorage
-  {
-    /** Get the output stream to write to.  Caller should explicitly close this stream when done writing.
-    */
-    public OutputStream getOutputStream()
-      throws ManifoldCFException;
-    
-    /** Get new binary length.
-    */
-    public long getBinaryLength()
-      throws ManifoldCFException;
-
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    public InputStream getInputStream()
-      throws ManifoldCFException;
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    public void close()
-      throws ManifoldCFException;
-  }
-  
-  protected static class FileDestinationStorage implements DestinationStorage
-  {
-    protected final File outputFile;
-    protected final OutputStream outputStream;
-
-    public FileDestinationStorage()
-      throws ManifoldCFException
-    {
-      File outputFile;
-      OutputStream outputStream;
-      try
-      {
-        outputFile = File.createTempFile("mcftika","tmp");
-        outputStream = new FileOutputStream(outputFile);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e);
-        outputFile = null;
-        outputStream = null;
-      }
-      this.outputFile = outputFile;
-      this.outputStream = outputStream;
-    }
-    
-    @Override
-    public OutputStream getOutputStream()
-      throws ManifoldCFException
-    {
-      return outputStream;
-    }
-    
-    /** Get new binary length.
-    */
-    @Override
-    public long getBinaryLength()
-      throws ManifoldCFException
-    {
-      return outputFile.length();
-    }
-
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    @Override
-    public InputStream getInputStream()
-      throws ManifoldCFException
-    {
-      try
-      {
-        return new FileInputStream(outputFile);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e);
-        return null;
-      }
-    }
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    @Override
-    public void close()
-      throws ManifoldCFException
-    {
-      outputFile.delete();
-    }
-
-  }
-  
-  protected static class MemoryDestinationStorage implements DestinationStorage
-  {
-    protected final ByteArrayOutputStream outputStream;
-    
-    public MemoryDestinationStorage(int sizeHint)
-    {
-      outputStream = new ByteArrayOutputStream(sizeHint);
-    }
-    
-    @Override
-    public OutputStream getOutputStream()
-      throws ManifoldCFException
-    {
-      return outputStream;
-    }
-
-    /** Get new binary length.
-    */
-    @Override
-    public long getBinaryLength()
-      throws ManifoldCFException
-    {
-      return outputStream.size();
-    }
-    
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    @Override
-    public InputStream getInputStream()
-      throws ManifoldCFException
-    {
-      return new ByteArrayInputStream(outputStream.toByteArray());
-    }
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    public void close()
-      throws ManifoldCFException
-    {
-    }
-
-  }
-  
-  protected static class SpecPacker {
-    
-    
-    private Long lengthCutoff;
-    
-    public SpecPacker(Specification os) {
-      for (int i = 0; i < os.getChildCount(); i++) {
-        SpecificationNode sn = os.getChild(i);
-        
-        if (sn.getType().equals(ContentLimiterConfig.NODE_MAXLENGTH)) {
-          String value = sn.getAttributeValue(ContentLimiterConfig.ATTRIBUTE_VALUE);
-          lengthCutoff = new Long(value);
-        }
-      }
-    }
-    
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-      
-      // Max length
-      if (lengthCutoff == null)
-        sb.append('-');
-      else {
-        sb.append('+');
-        pack(sb,lengthCutoff.toString(),'+');
-      }
-
-      return sb.toString();
-    }
-    
-  }
-  
-}
diff --git a/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/ContentLimiterConfig.java b/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/ContentLimiterConfig.java
deleted file mode 100644
index 3ef4875..0000000
--- a/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/ContentLimiterConfig.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.contentlimiter;
-
-/** Parameters for DocumentFilter transformation connector.
- */
-public class ContentLimiterConfig {
-
-  // Configuration parameters
-  
-  // Specification nodes and values
-  public static final String NODE_MAXLENGTH = "maxlength";
-  public static final String MAXLENGTH_DEFAULT = "500000000";
-  public static final String ATTRIBUTE_VALUE = "value";
-}
diff --git a/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/Messages.java b/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/Messages.java
deleted file mode 100644
index 6f8abba..0000000
--- a/connectors/contentlimiter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/contentlimiter/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.contentlimiter;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.transformation.contentlimiter.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.transformation.contentlimiter";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_en_US.properties b/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_en_US.properties
deleted file mode 100644
index 61dbd09..0000000
--- a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_en_US.properties
+++ /dev/null
@@ -1,17 +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.
-
-ContentLimiter.ContentTabName=Content limiter
-ContentLimiter.MaxContentLengthBytesColon=Maximum content length (bytes):
diff --git a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_es_ES.properties b/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_es_ES.properties
deleted file mode 100644
index c77a9a9..0000000
--- a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_es_ES.properties
+++ /dev/null
@@ -1,17 +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.
-
-ContentLimiter.ContentTabName=Limitador de contenido
-ContentLimiter.MaxContentLengthBytesColon=Longitud máxima del contenido (bytes):
diff --git a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_ja_JP.properties b/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_ja_JP.properties
deleted file mode 100644
index 61dbd09..0000000
--- a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_ja_JP.properties
+++ /dev/null
@@ -1,17 +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.
-
-ContentLimiter.ContentTabName=Content limiter
-ContentLimiter.MaxContentLengthBytesColon=Maximum content length (bytes):
diff --git a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_zh_CN.properties b/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_zh_CN.properties
deleted file mode 100644
index 61dbd09..0000000
--- a/connectors/contentlimiter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/contentlimiter/common_zh_CN.properties
+++ /dev/null
@@ -1,17 +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.
-
-ContentLimiter.ContentTabName=Content limiter
-ContentLimiter.MaxContentLengthBytesColon=Maximum content length (bytes):
diff --git a/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/editSpecification.js b/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/editSpecification.js
deleted file mode 100644
index 1d6aa8b..0000000
--- a/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/editSpecification.js
+++ /dev/null
@@ -1,26 +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.
--->
-
-<script type="text/javascript">
-<!--
-function s${SEQNUM}_checkSpecification()
-{
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/editSpecification_Content.html b/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/editSpecification_Content.html
deleted file mode 100644
index 54a2557..0000000
--- a/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/editSpecification_Content.html
+++ /dev/null
@@ -1,34 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('ContentLimiter.ContentTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ContentLimiter.MaxContentLengthBytesColon'))</nobr>
-    </td>
-    <td class="value"><input name="s${SEQNUM}_maxcontentlength" type="text"
-      value="$Encoder.attributeEscape($MAXCONTENTLENGTH)" size="24" /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SEQNUM}_maxcontentlength" value="$Encoder.attributeEscape($MAXCONTENTLENGTH)" />
-
-#end
diff --git a/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/viewSpecification.html b/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/viewSpecification.html
deleted file mode 100644
index c557032..0000000
--- a/connectors/contentlimiter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/contentlimiter/viewSpecification.html
+++ /dev/null
@@ -1,24 +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.
--->
-
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ContentLimiter.MaxContentLengthBytesColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($MAXCONTENTLENGTH)</td>
-  </tr>
-</table>
diff --git a/connectors/contentlimiter/pom.xml b/connectors/contentlimiter/pom.xml
deleted file mode 100644
index fbeb460..0000000
--- a/connectors/contentlimiter/pom.xml
+++ /dev/null
@@ -1,362 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

-

-<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/xsd/maven-4.0.0.xsd">

-  <parent>

-    <groupId>org.apache.manifoldcf</groupId>

-    <artifactId>mcf-connectors</artifactId>

-    <version>2.10-SNAPSHOT</version>

-  </parent>

-  <modelVersion>4.0.0</modelVersion>

-

-  <properties>

-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

-  </properties>

-

-  <artifactId>mcf-contentlimiter-connector</artifactId>

-  <name>ManifoldCF - Connectors - Content Limiter</name>

-

-  <build>

-    <defaultGoal>integration-test</defaultGoal>

-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>

-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>

-    <resources>

-      <resource>

-        <directory>${basedir}/connector/src/main/native2ascii</directory>

-        <includes>

-          <include>**/*.properties</include>

-        </includes>

-      </resource>

-      <resource>

-        <directory>${basedir}/connector/src/main/resources</directory>

-        <includes>

-          <include>**/*.html</include>

-          <include>**/*.js</include>

-        </includes>

-      </resource>

-    </resources> 

-    <testResources>

-      <testResource>

-        <directory>${basedir}/connector/src/test/resources</directory>

-      </testResource>

-    </testResources>

-

-    <plugins>

-

-      <plugin>

-        <groupId>org.codehaus.mojo</groupId>

-        <artifactId>native2ascii-maven-plugin</artifactId>

-        <version>1.0-beta-1</version>

-        <configuration>

-            <workDir>target/classes</workDir>

-        </configuration>

-        <executions>

-            <execution>

-                <id>native2ascii-utf8</id>

-                <goals>

-                    <goal>native2ascii</goal>

-                </goals>

-                <configuration>

-                    <encoding>UTF8</encoding>

-                    <includes>

-                      <include>**/*.properties</include>

-                    </includes>

-                </configuration>

-            </execution>

-        </executions>

-      </plugin>

-

-      <!-- Test plugin configuration -->

-      <plugin>

-        <artifactId>maven-dependency-plugin</artifactId>

-        <executions>

-           <execution>

-            <id>copy-war</id>

-            <phase>generate-resources</phase>

-            <goals>

-              <goal>copy</goal>

-            </goals>

-            <configuration>

-              <outputDirectory>target/dependency</outputDirectory>

-              <artifactItems>

-                <artifactItem>

-                  <groupId>${project.groupId}</groupId>

-                  <artifactId>mcf-api-service</artifactId>

-                  <version>${project.version}</version>

-                  <type>war</type>

-                  <overWrite>false</overWrite>

-                  <destFileName>mcf-api-service.war</destFileName>

-                </artifactItem>

-                <artifactItem>

-                  <groupId>${project.groupId}</groupId>

-                  <artifactId>mcf-authority-service</artifactId>

-                  <version>${project.version}</version>

-                  <type>war</type>

-                  <overWrite>false</overWrite>

-                  <destFileName>mcf-authority-service.war</destFileName>

-                </artifactItem>

-                <artifactItem>

-                  <groupId>${project.groupId}</groupId>

-                  <artifactId>mcf-crawler-ui</artifactId>

-                  <version>${project.version}</version>

-                  <type>war</type>

-                  <overWrite>false</overWrite>

-                  <destFileName>mcf-crawler-ui.war</destFileName>

-                </artifactItem>

-              </artifactItems>

-            </configuration>

-          </execution>

-        </executions>

-      </plugin>

-

-      <plugin>

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

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

-        <configuration>

-          <excludes>

-            <exclude>**/*Postgresql*.java</exclude>

-            <exclude>**/*MySQL*.java</exclude>

-          </excludes>

-          <forkCount>1</forkCount>

-          <reuseForks>false</reuseForks>

-          <workingDirectory>target/test-output</workingDirectory>

-        </configuration>

-      </plugin>

-

-      <plugin>

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

-        <artifactId>maven-failsafe-plugin</artifactId>

-        <version>2.18.1</version>

-        <configuration>

-          <skipTests>${skipITs}</skipTests>

-          <systemPropertyVariables>

-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>

-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>

-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>

-          </systemPropertyVariables>

-          <excludes>

-            <exclude>**/*Postgresql*.java</exclude>

-            <exclude>**/*MySQL*.java</exclude>

-          </excludes>

-          <forkCount>1</forkCount>

-          <reuseForks>false</reuseForks>

-          <workingDirectory>target/test-output</workingDirectory>

-        </configuration>

-        <executions>

-          <execution>

-            <id>integration-test</id>

-            <goals>

-              <goal>integration-test</goal>

-            </goals>

-          </execution>

-          <execution>

-            <id>verify</id>

-            <goals>

-              <goal>verify</goal>

-            </goals>

-          </execution>

-        </executions>

-      </plugin>

-

-    </plugins>

-  </build>

-  

-  <dependencies>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-core</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-connector-common</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-agents</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-ui-core</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    

-    <!-- Testing dependencies -->

-    

-    <dependency>

-      <groupId>junit</groupId>

-      <artifactId>junit</artifactId>

-      <version>${junit.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-core</artifactId>

-      <version>${project.version}</version>

-      <type>test-jar</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-agents</artifactId>

-      <version>${project.version}</version>

-      <type>test-jar</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-pull-agent</artifactId>

-      <version>${project.version}</version>

-      <type>jar</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-pull-agent</artifactId>

-      <version>${project.version}</version>

-      <type>test-jar</type>

-      <scope>test</scope>

-    </dependency>

-

-    <dependency>

-      <groupId>org.postgresql</groupId>

-      <artifactId>postgresql</artifactId>

-      <version>${postgresql.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.hsqldb</groupId>

-      <artifactId>hsqldb</artifactId>

-      <version>${hsqldb.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>mysql</groupId>

-      <artifactId>mysql-connector-java</artifactId>

-      <version>${mysql.version}</version>

-      <scope>test</scope>

-    </dependency>

-

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-api-service</artifactId>

-      <version>${project.version}</version>

-      <type>war</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-authority-service</artifactId>

-      <version>${project.version}</version>

-      <type>war</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-crawler-ui</artifactId>

-      <version>${project.version}</version>

-      <type>war</type>

-      <scope>test</scope>

-    </dependency>

-

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-server</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-util</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-webapp</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-servlet</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-http</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-io</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-security</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-continuation</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-xml</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-

-    <dependency>

-      <groupId>org.mortbay.jetty</groupId>

-      <artifactId>jsp-api-2.1-glassfish</artifactId>

-      <version>${glassfish.version}</version>

-      <scope>test</scope>

-    </dependency>    

-    <dependency>

-      <groupId>org.mortbay.jetty</groupId>

-      <artifactId>jsp-2.1-glassfish</artifactId>

-      <version>${glassfish.version}</version>

-      <scope>test</scope>

-    </dependency>

-    

-    <dependency>

-      <groupId>org.slf4j</groupId>

-      <artifactId>slf4j-api</artifactId>

-      <version>${slf4j.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.slf4j</groupId>

-      <artifactId>slf4j-simple</artifactId>

-      <version>${slf4j.version}</version>

-      <scope>test</scope>

-    </dependency>

-

-  </dependencies>

-</project>

diff --git a/connectors/documentfilter/build.xml b/connectors/documentfilter/build.xml
deleted file mode 100644
index f788dfe..0000000
--- a/connectors/documentfilter/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="documentfilter" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="Allowed documents"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.documentfilter.DocumentFilter"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/DocumentFilter.java b/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/DocumentFilter.java
deleted file mode 100644
index 576453b..0000000
--- a/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/DocumentFilter.java
+++ /dev/null
@@ -1,633 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.documentfilter;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import org.apache.manifoldcf.agents.system.Logging;
-
-import org.apache.commons.io.FilenameUtils;
-
-import java.io.*;
-import java.util.*;
-import java.net.*;
-
-public class DocumentFilter extends org.apache.manifoldcf.agents.transformation.BaseTransformationConnector {
-
-  /** Forward to the javascript to check the specification parameters for the job */
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  
-  private static final String EDIT_SPECIFICATION_CONTENTS_HTML = "editSpecification_Contents.html";
-  
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  protected static final String ACTIVITY_FILTER = "filter";
-
-  protected static final String[] activitiesList = new String[]{ACTIVITY_FILTER};
-  
-  /** Return a list of activities that this connector generates.
-  * The connector does NOT need to be connected before this method is called.
-  *@return the set of activities.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** Constructor.
-   */
-  public DocumentFilter(){
-  }
-  
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param os is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification os)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    SpecPacker sp = new SpecPacker(os);
-    return new VersionContext(sp.toPackedString(),params,os);
-  }
-
-  /** Detect if a document date is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param outputDescription is the document's output version.
-  *@param date is the date of the document.
-  *@param activities is an object including the activities that can be performed by this method.
-  *@return true if the document with that date can be accepted by this connector.
-  */
-  @Override
-  public boolean checkDateIndexable(VersionContext outputDescription, Date date, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    return checkDateIndexable(sp, outputDescription, date, activities);
-  }
-  
-  protected boolean checkDateIndexable(SpecPacker sp, VersionContext outputDescription, Date date, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    if (sp.checkDate(date))
-      return super.checkDateIndexable(outputDescription, date, activities);
-    else
-      return false;
-  }
-
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param outputDescription is the document's output version.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext outputDescription, String mimeType, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    return checkMimeTypeIndexable(sp, outputDescription, mimeType, activities);
-  }
-  
-  protected boolean checkMimeTypeIndexable(SpecPacker sp, VersionContext outputDescription, String mimeType, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    if (sp.checkMimeType(mimeType))
-      return super.checkMimeTypeIndexable(outputDescription, mimeType, activities);
-    else
-      return false;
-  }
-
-  @Override
-  public boolean checkLengthIndexable(VersionContext outputDescription, long length, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    return checkLengthIndexable(sp, outputDescription, length, activities);
-  }
-  
-  protected boolean checkLengthIndexable(SpecPacker sp, VersionContext outputDescription, long length, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    if (sp.checkLengthIndexable(length))
-      return super.checkLengthIndexable(outputDescription, length, activities);
-    else
-      return false;
-  }
-
-  @Override
-  public boolean checkURLIndexable(VersionContext outputDescription, String url, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    return checkURLIndexable(sp, outputDescription, url, activities);
-  }
-  
-  protected boolean checkURLIndexable(SpecPacker sp, VersionContext outputDescription, String url, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption {
-    if (sp.checkURLIndexable(url))
-      return super.checkURLIndexable(outputDescription, url, activities);
-    else
-      return false;
-  }
-  
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  *@return the document status (accepted or permanently rejected).
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    // Hard filtering (in case connectors don't call check methods above)
-    SpecPacker sp = new SpecPacker(outputDescription.getSpecification());
-    if (!checkURLIndexable(sp, outputDescription, documentURI, activities))
-    {
-      activities.noDocument();
-      activities.recordActivity(null, ACTIVITY_FILTER, null, documentURI, activities.EXCLUDED_URL, "Rejected due to URL ('"+documentURI+"')");
-      if (Logging.ingest.isDebugEnabled())
-        Logging.ingest.debug("Document filter: Rejected document "+documentURI+" due to URL ('"+documentURI+"')");
-      return DOCUMENTSTATUS_REJECTED;
-    }
-
-    if (!checkLengthIndexable(sp, outputDescription, document.getBinaryLength(), activities))
-    {
-      activities.noDocument();
-      activities.recordActivity(null, ACTIVITY_FILTER, null, documentURI, activities.EXCLUDED_LENGTH, "Rejected due to length ("+document.getBinaryLength()+")");
-      if (Logging.ingest.isDebugEnabled())
-        Logging.ingest.debug("Document filter: Rejected document "+documentURI+" due to length ("+document.getBinaryLength()+")");
-      return DOCUMENTSTATUS_REJECTED;
-    }
-    
-    if (!checkMimeTypeIndexable(sp, outputDescription, document.getMimeType(), activities))
-    {
-      activities.noDocument();
-      activities.recordActivity(null, ACTIVITY_FILTER, null, documentURI, activities.EXCLUDED_MIMETYPE, "Rejected due to mime type ('"+document.getMimeType()+"')");
-      if (Logging.ingest.isDebugEnabled())
-        Logging.ingest.debug("Document filter: Rejected document "+documentURI+" due to mime type ('"+document.getMimeType()+"')");
-      return DOCUMENTSTATUS_REJECTED;
-    }
-    
-    if (!checkDateIndexable(sp, outputDescription, document.getModifiedDate(), activities))
-    {
-      activities.noDocument();
-      activities.recordActivity(null, ACTIVITY_FILTER, null, documentURI, activities.EXCLUDED_DATE, "Rejected due to date ('"+document.getModifiedDate()+"')");
-      if (Logging.ingest.isDebugEnabled())
-        Logging.ingest.debug("Document filter: Rejected document "+documentURI+" due to date ('"+document.getModifiedDate()+"')");
-      return DOCUMENTSTATUS_REJECTED;
-    }
-    
-    return activities.sendDocument(documentURI, document);
-  }
-  
-  protected static void fillInContentsSpecificationMap(Map<String,Object> paramMap, Specification os)
-  {
-    String minFileSize = DocumentFilterConfig.MINLENGTH_DEFAULT;
-    String maxFileSize = DocumentFilterConfig.MAXLENGTH_DEFAULT;
-    String allowedMimeTypes = DocumentFilterConfig.MIMETYPES_DEFAULT;
-    String allowedFileExtensions = DocumentFilterConfig.EXTENSIONS_DEFAULT;
-    Long minDate = null;
-    for (int i = 0; i < os.getChildCount(); i++)
-    {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(DocumentFilterConfig.NODE_MAXLENGTH))
-        maxFileSize = sn.getAttributeValue(DocumentFilterConfig.ATTRIBUTE_VALUE);
-      else if (sn.getType().equals(DocumentFilterConfig.NODE_MINLENGTH))
-        minFileSize = sn.getAttributeValue(DocumentFilterConfig.ATTRIBUTE_VALUE);
-      else if (sn.getType().equals(DocumentFilterConfig.NODE_MIMETYPES))
-        allowedMimeTypes = sn.getValue();
-      else if (sn.getType().equals(DocumentFilterConfig.NODE_EXTENSIONS))
-        allowedFileExtensions = sn.getValue();
-      else if (sn.getType().equals(DocumentFilterConfig.NODE_MINDATE))
-        minDate = new Long(sn.getAttributeValue(DocumentFilterConfig.ATTRIBUTE_VALUE));
-    }
-    paramMap.put("MINFILESIZE",minFileSize);
-    paramMap.put("MAXFILESIZE",maxFileSize);
-    paramMap.put("MIMETYPES",allowedMimeTypes);
-    paramMap.put("EXTENSIONS",allowedFileExtensions);
-    
-    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ROOT);
-    c.setTimeInMillis((minDate==null)?0L:minDate.longValue());
-    paramMap.put("MINDATEYEAR",Integer.toString(c.get(Calendar.YEAR)));
-    paramMap.put("MINDATEMONTH",Integer.toString(c.get(Calendar.MONTH)));
-    paramMap.put("MINDATEDAY",Integer.toString(c.get(Calendar.DAY_OF_MONTH)));
-    paramMap.put("MINDATEHOUR",Integer.toString(c.get(Calendar.HOUR_OF_DAY)));
-    paramMap.put("MINDATEMINUTE",String.format(Locale.ROOT, "%02d",c.get(Calendar.MINUTE)));
-  }
-  
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    tabsArray.add(Messages.getString(locale, "DocumentFilter.ContentsTabName"));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInContentsSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_JS,paramMap);
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM",Integer.toString(actualSequenceNumber));
-
-    // Fill in the field mapping tab data
-    fillInContentsSpecificationMap(paramMap, os);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_CONTENTS_HTML,paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String minDateYear = variableContext.getParameter(seqPrefix+"mindateyear");
-    String minDateMonth = variableContext.getParameter(seqPrefix+"mindatemonth");
-    String minDateDay = variableContext.getParameter(seqPrefix + "mindateday");
-    String minDateHour = variableContext.getParameter(seqPrefix + "mindatehour");
-    String minDateMinute = variableContext.getParameter(seqPrefix + "mindateminute");
-    if (minDateYear != null && minDateMonth != null && minDateDay != null && minDateHour != null && minDateMinute != null)
-    {
-      Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ROOT);
-      c.set(Calendar.SECOND, 0);
-      c.set(Calendar.MILLISECOND, 0);
-      try
-      {
-        c.set(Integer.parseInt(minDateYear),Integer.parseInt(minDateMonth),Integer.parseInt(minDateDay),Integer.parseInt(minDateHour),Integer.parseInt(minDateMinute),0);
-      }
-      catch (Exception e)
-      {
-      }
-      long theTime = c.getTimeInMillis();
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(DocumentFilterConfig.NODE_MINDATE))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(DocumentFilterConfig.NODE_MINDATE);
-      sn.setAttribute(DocumentFilterConfig.ATTRIBUTE_VALUE,new Long(theTime).toString());
-      os.addChild(os.getChildCount(),sn);
-    }
-    
-    String x;
-
-    x = variableContext.getParameter(seqPrefix+"minfilesize");
-    if (x != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(DocumentFilterConfig.NODE_MINLENGTH))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(DocumentFilterConfig.NODE_MINLENGTH);
-      sn.setAttribute(DocumentFilterConfig.ATTRIBUTE_VALUE,x);
-      os.addChild(os.getChildCount(),sn);
-    }
-
-    x = variableContext.getParameter(seqPrefix+"maxfilesize");
-    if (x != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(DocumentFilterConfig.NODE_MAXLENGTH))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(DocumentFilterConfig.NODE_MAXLENGTH);
-      sn.setAttribute(DocumentFilterConfig.ATTRIBUTE_VALUE,x);
-      os.addChild(os.getChildCount(),sn);
-    }
-
-    x = variableContext.getParameter(seqPrefix+"mimetypes");
-    if (x != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(DocumentFilterConfig.NODE_MIMETYPES))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(DocumentFilterConfig.NODE_MIMETYPES);
-      sn.setValue(x);
-      os.addChild(os.getChildCount(),sn);
-    }
-
-    x = variableContext.getParameter(seqPrefix+"extensions");
-    if (x != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(DocumentFilterConfig.NODE_EXTENSIONS))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode(DocumentFilterConfig.NODE_EXTENSIONS);
-      sn.setValue(x);
-      os.addChild(os.getChildCount(),sn);
-    }
-    
-    return null;
-  }
-  
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInContentsSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPECIFICATION_HTML,paramMap);
-    
-  }
-  
-  protected static Set<String> fillSet(String input) {
-    Set<String> rval = new HashSet<String>();
-    try
-    {
-      StringReader sr = new StringReader(input);
-      BufferedReader br = new BufferedReader(sr);
-      String line = null;
-      while ((line = br.readLine()) != null)
-      {
-        line = line.trim();
-        if (line.equals("*"))
-          rval = null;
-        else if (rval != null && line.length() > 0)
-          rval.add(line.toLowerCase(Locale.ROOT));
-      }
-    }
-    catch (IOException e)
-    {
-      // Should never happen
-      throw new RuntimeException("IO exception reading strings: "+e.getMessage(),e);
-    }
-    return rval;
-  }
-  
-  protected static class SpecPacker {
-    
-    // null means "match everything"
-    private final Set<String> extensions;
-    // null means "match everything"
-    private final Set<String> mimeTypes;
-    private final Long minLength;
-    private final Long lengthCutoff;
-    private final Long minDate;
-    
-    public SpecPacker(Specification os) {
-      Long minDate = null;
-      Long minLength = null;
-      Long lengthCutoff = null;
-      String extensions = null;
-      String mimeTypes = null;
-      for (int i = 0; i < os.getChildCount(); i++) {
-        SpecificationNode sn = os.getChild(i);
-        
-        if (sn.getType().equals(DocumentFilterConfig.NODE_MIMETYPES)) {
-          mimeTypes = sn.getValue();
-        } else if (sn.getType().equals(DocumentFilterConfig.NODE_EXTENSIONS)) {
-          extensions = sn.getValue();
-        } else if (sn.getType().equals(DocumentFilterConfig.NODE_MAXLENGTH)) {
-          String value = sn.getAttributeValue(DocumentFilterConfig.ATTRIBUTE_VALUE);
-          lengthCutoff = new Long(value);
-        } else if (sn.getType().equals(DocumentFilterConfig.NODE_MINLENGTH)) {
-          String value = sn.getAttributeValue(DocumentFilterConfig.ATTRIBUTE_VALUE);
-          minLength = new Long(value);
-        } else if (sn.getType().equals(DocumentFilterConfig.NODE_MINDATE)) {
-          String value = sn.getAttributeValue(DocumentFilterConfig.ATTRIBUTE_VALUE);
-          minDate = new Long(value);
-        }
-      }
-      this.minDate = minDate;
-      this.minLength = minLength;
-      this.lengthCutoff = lengthCutoff;
-      this.extensions = fillSet(extensions);
-      this.mimeTypes = fillSet(mimeTypes);
-    }
-    
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-      int i;
-      
-      // Max length
-      if (lengthCutoff == null)
-        sb.append('-');
-      else {
-        sb.append('+');
-        pack(sb,lengthCutoff.toString(),'+');
-      }
-      
-      // Mime types
-      if (this.mimeTypes == null)
-        sb.append('-');
-      else
-      {
-        sb.append('+');
-        String[] mimeTypes = new String[this.mimeTypes.size()];
-        i = 0;
-        for (String mimeType : this.mimeTypes) {
-          mimeTypes[i++] = mimeType;
-        }
-        java.util.Arrays.sort(mimeTypes);
-        packList(sb,mimeTypes,'+');
-      }
-      
-      // Extensions
-      if (this.extensions == null)
-        sb.append('-');
-      else
-      {
-        sb.append('+');
-        String[] extensions = new String[this.extensions.size()];
-        i = 0;
-        for (String extension : this.extensions) {
-          extensions[i++] = extension;
-        }
-        java.util.Arrays.sort(extensions);
-        packList(sb,extensions,'+');
-      }
-
-      // Min length
-      if (minLength == null)
-        sb.append('-');
-      else {
-        sb.append('+');
-        pack(sb,minLength.toString(),'+');
-      }
-      
-      // Min date
-      if (minDate == null)
-        sb.append('-');
-      else {
-        sb.append('+');
-        pack(sb,minDate.toString(),'+');
-      }
-
-      return sb.toString();
-    }
-    
-    public boolean checkLengthIndexable(long length) {
-      if (minLength != null && length < minLength.longValue())
-        return false;
-      if (lengthCutoff != null && length > lengthCutoff.longValue())
-        return false;
-      return true;
-    }
-    
-    public boolean checkDate(Date date) {
-      if (minDate != null && date != null && date.getTime() < minDate)
-        return false;
-      return true;
-    }
-    
-    public boolean checkMimeType(String mimeType) {
-      if (mimeType == null)
-        mimeType = "application/unknown";
-      if (mimeTypes == null)
-        return true;
-      return mimeTypes.contains(mimeType.toLowerCase(Locale.ROOT));
-    }
-    
-    public boolean checkURLIndexable(String url) {
-      String extension = null;
-      try
-      {
-        String path = new URI(url).getPath();
-        if (path != null)
-          extension = FilenameUtils.getExtension(path);
-      }
-      catch (URISyntaxException e)
-      {
-        extension = FilenameUtils.getExtension(url);
-      }
-      if (extension == null || extension.length() == 0)
-        extension = ".";
-      if (extensions == null)
-        return true;
-      return extensions.contains(extension.toLowerCase(Locale.ROOT));
-    }
-    
-  }
-  
-}
diff --git a/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/DocumentFilterConfig.java b/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/DocumentFilterConfig.java
deleted file mode 100644
index 44c293a..0000000
--- a/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/DocumentFilterConfig.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.documentfilter;
-
-/** Parameters for DocumentFilter transformation connector.
- */
-public class DocumentFilterConfig {
-
-  // Configuration parameters
-  
-  // Specification nodes and values
-  public static final String NODE_MINLENGTH = "minlength";
-  public static final String MINLENGTH_DEFAULT = "0";
-  public static final String NODE_MAXLENGTH = "maxlength";
-  public static final String MAXLENGTH_DEFAULT = "1000000000";
-  public static final String NODE_MIMETYPES = "mimetypes";
-  public static final String MIMETYPES_DEFAULT =
-                        "*\n"
-                        + "application/msword\n"
-		        + "application/vnd.ms-excel\n"
-		        + "application/vnd.openxmlformats-officedocument.wordprocessingml.document\n"
-		        + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n"
-		        + "text/html\n"
-		        + "application/pdf\n"
-		        + "application/vnd.ms-powerpoint\n"
-		        + "application/vnd.openxmlformats-officedocument.presentationml.presentation\n"
-		        + "application/vnd.oasis.opendocument.text\n"
-		        + "application/vnd.oasis.opendocument.spreadsheet\n"
-		        + "application/vnd.oasis.opendocument.formula\n"
-		        + "application/rtf\n" + "text/plain\n" + "audio/mpeg\n"
-		        + "audio/x-wav\n" + "audio/ogg\n" + "audio/flac\n"
-		        + "application/x-bittorrent";
-  public static final String NODE_EXTENSIONS = "extensions";
-  public static final String EXTENSIONS_DEFAULT =
-                    "*\n" + "log\n" + "doc\n" + "docx\n" + "xls\n" + "xlsx\n" + "ppt\n" + "pptx\n"
-		    + "html\n" + "pdf\n" + "odt\n" + "ods\n" + "rtf\n" + "txt\n" + "mp3\n"
-		    + "mp4\n" + "wav\n" + "ogg\n" + "flac\n" + "torrent";
-  public static final String NODE_MINDATE = "mindate";
-  public static final String ATTRIBUTE_VALUE = "value";
-}
diff --git a/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/Messages.java b/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/Messages.java
deleted file mode 100644
index 635daa5..0000000
--- a/connectors/documentfilter/connector/src/main/java/org/apache/manifoldcf/agents/transformation/documentfilter/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.documentfilter;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.transformation.documentfilter.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.transformation.documentfilter";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_en_US.properties b/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_en_US.properties
deleted file mode 100644
index a397658..0000000
--- a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_en_US.properties
+++ /dev/null
@@ -1,34 +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.
-
-DocumentFilter.ContentsTabName=Allowed contents
-DocumentFilter.MinFileSizeBytesColon=Min file size (bytes):
-DocumentFilter.MaxFileSizeBytesColon=Max file size (bytes):
-DocumentFilter.AllowedMIMETypesColon=Allowed MIME types:
-DocumentFilter.AllowedFileExtensionsColon=Allowed file extensions:
-
-DocumentFilter.MinDateColon=Minimum document date:
-DocumentFilter.Month_0=January
-DocumentFilter.Month_1=February
-DocumentFilter.Month_2=March
-DocumentFilter.Month_3=April
-DocumentFilter.Month_4=May
-DocumentFilter.Month_5=June
-DocumentFilter.Month_6=July
-DocumentFilter.Month_7=August
-DocumentFilter.Month_8=September
-DocumentFilter.Month_9=October
-DocumentFilter.Month_10=November
-DocumentFilter.Month_11=December
diff --git a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_es_ES.properties b/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_es_ES.properties
deleted file mode 100644
index f173d1f..0000000
--- a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_es_ES.properties
+++ /dev/null
@@ -1,34 +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.
-
-DocumentFilter.ContentsTabName=Contenido permitido
-DocumentFilter.MinFileSizeBytesColon=Tamaño de archivo Min (bytes):
-DocumentFilter.MaxFileSizeBytesColon=Tamaño máximo de archivo (bytes):
-DocumentFilter.AllowedMIMETypesColon=Tipos MIME permitidos:
-DocumentFilter.AllowedFileExtensionsColon=Extensiones de archivo permitidos:
-
-DocumentFilter.MinDateColon=Fecha mínima documento:
-DocumentFilter.Month_0=Enero
-DocumentFilter.Month_1=Febrero
-DocumentFilter.Month_2=Marzo
-DocumentFilter.Month_3=Abril
-DocumentFilter.Month_4=Mayo
-DocumentFilter.Month_5=Junio
-DocumentFilter.Month_6=Julio
-DocumentFilter.Month_7=Agosto
-DocumentFilter.Month_8=Setiembre
-DocumentFilter.Month_9=Octubre
-DocumentFilter.Month_10=Noviembre
-DocumentFilter.Month_11=Diciembre
diff --git a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_ja_JP.properties b/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_ja_JP.properties
deleted file mode 100644
index e31f105..0000000
--- a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_ja_JP.properties
+++ /dev/null
@@ -1,34 +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.
-
-DocumentFilter.ContentsTabName=コンテンツ
-DocumentFilter.MinFileSizeBytesColon=最小ファイルサイズ (バイト):
-DocumentFilter.MaxFileSizeBytesColon=最大ファイルサイズ (バイト):
-DocumentFilter.AllowedMIMETypesColon=利用可能なMIMEタイプ:
-DocumentFilter.AllowedFileExtensionsColon=利用可能なファイル拡張子:
-
-DocumentFilter.MinDateColon=最小ドキュメント日時:
-DocumentFilter.Month_0=1月
-DocumentFilter.Month_1=2月
-DocumentFilter.Month_2=3月
-DocumentFilter.Month_3=4月
-DocumentFilter.Month_4=5月
-DocumentFilter.Month_5=6月
-DocumentFilter.Month_6=7月
-DocumentFilter.Month_7=8月
-DocumentFilter.Month_8=9月
-DocumentFilter.Month_9=10月
-DocumentFilter.Month_10=11月
-DocumentFilter.Month_11=12月
diff --git a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_zh_CN.properties b/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_zh_CN.properties
deleted file mode 100644
index 5ddaac5..0000000
--- a/connectors/documentfilter/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/documentfilter/common_zh_CN.properties
+++ /dev/null
@@ -1,34 +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.
-
-DocumentFilter.ContentsTabName=内容
-DocumentFilter.MinFileSizeBytesColon=最小文件大小(字节):
-DocumentFilter.MaxFileSizeBytesColon=最大文件大小(字节):
-DocumentFilter.AllowedMIMETypesColon=可利用的MIME类型:
-DocumentFilter.AllowedFileExtensionsColon=可利用的文件扩展名:
-
-DocumentFilter.MinDateColon=Minimum document date:
-DocumentFilter.Month_0=January
-DocumentFilter.Month_1=February
-DocumentFilter.Month_2=March
-DocumentFilter.Month_3=April
-DocumentFilter.Month_4=May
-DocumentFilter.Month_5=June
-DocumentFilter.Month_6=July
-DocumentFilter.Month_7=August
-DocumentFilter.Month_8=September
-DocumentFilter.Month_9=October
-DocumentFilter.Month_10=November
-DocumentFilter.Month_11=December
diff --git a/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/editSpecification.js b/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/editSpecification.js
deleted file mode 100644
index 1d6aa8b..0000000
--- a/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/editSpecification.js
+++ /dev/null
@@ -1,26 +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.
--->
-
-<script type="text/javascript">
-<!--
-function s${SEQNUM}_checkSpecification()
-{
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/editSpecification_Contents.html b/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/editSpecification_Contents.html
deleted file mode 100644
index 2394e3e..0000000
--- a/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/editSpecification_Contents.html
+++ /dev/null
@@ -1,119 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('DocumentFilter.ContentsTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.MinDateColon'))</nobr></td>
-    <td class="value">
-      <nobr>
-        <select name="s${SEQNUM}_mindateyear" size="5">
-  #foreach ($year in [1969..2020])
-    #if ($MINDATEYEAR == $year)
-          <option value="$year" selected="true">$year</option>
-    #else
-          <option value="$year">$year</option>
-    #end
-  #end
-        </select>
-        <select name="s${SEQNUM}_mindatemonth" size="5">
-  #foreach ($month in [0..11])
-    #set ($monthkey = "DocumentFilter.Month_${month}")
-    #if ($MINDATEMONTH == $month)
-          <option value="$month" selected="true">$Encoder.bodyEscape($ResourceBundle.getString($monthkey))</option>
-    #else
-          <option value="$month">$Encoder.bodyEscape($ResourceBundle.getString($monthkey))</option>
-    #end
-  #end
-        </select>
-        <select name="s${SEQNUM}_mindateday" size="5">
-  #foreach ($day in [1..31])
-    #set ($dayvalue = $day)
-    #if ($MINDATEDAY == $day)
-          <option value="$day" selected="true">$dayvalue</option>
-    #else
-          <option value="$day">$dayvalue</option>
-    #end
-  #end
-        </select>
-        <select name="s${SEQNUM}_mindatehour" size="5">
-  #foreach ($hour in [0..23])
-    #if ($MINDATEHOUR == $hour)
-          <option value="$hour" selected="true">$hour</option>
-    #else
-          <option value="$hour">$hour</option>
-    #end
-  #end
-        </select>
-        :
-        <select name="s${SEQNUM}_mindateminute" size="5">
-  #foreach ($minute in ["00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59"])
-    #if ($MINDATEMINUTE == $minute)
-          <option value="$minute" selected="true">$minute</option>
-    #else
-          <option value="$minute">$minute</option>
-    #end
-  #end
-        </select>
-      </nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.MinFileSizeBytesColon'))</nobr>
-    </td>
-    <td class="value"><input name="s${SEQNUM}_minfilesize" type="text"
-      value="$Encoder.attributeEscape($MINFILESIZE)" size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.MaxFileSizeBytesColon'))</nobr>
-    </td>
-    <td class="value"><input name="s${SEQNUM}_maxfilesize" type="text"
-      value="$Encoder.attributeEscape($MAXFILESIZE)" size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.AllowedMIMETypesColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea rows="10" cols="64" name="s${SEQNUM}_mimetypes">$Encoder.bodyEscape($MIMETYPES)</textarea>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.AllowedFileExtensionsColon'))</nobr></td>
-    <td class="value">
-      <textarea rows="10" cols="12" name="s${SEQNUM}_extensions">$Encoder.bodyEscape($EXTENSIONS)</textarea>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SEQNUM}_mindateyear" value="$MINDATEYEAR" />
-<input type="hidden" name="s${SEQNUM}_mindatemonth" value="$MINDATEMONTH" />
-<input type="hidden" name="s${SEQNUM}_mindateday" value="$MINDATEDAY" />
-<input type="hidden" name="s${SEQNUM}_mindatehour" value="$MINDATEHOUR" />
-<input type="hidden" name="s${SEQNUM}_mindateminute" value="$MINDATEMINUTE" />
-
-<input type="hidden" name="s${SEQNUM}_minfilesize" value="$Encoder.attributeEscape($MINFILESIZE)" />
-<input type="hidden" name="s${SEQNUM}_maxfilesize" value="$Encoder.attributeEscape($MAXFILESIZE)" />
-<input type="hidden" name="s${SEQNUM}_mimetypes" value="$Encoder.attributeEscape($MIMETYPES)" />
-<input type="hidden" name="s${SEQNUM}_extensions" value="$Encoder.attributeEscape($EXTENSIONS)" />
-
-#end
diff --git a/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/viewSpecification.html b/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/viewSpecification.html
deleted file mode 100644
index 67ff226..0000000
--- a/connectors/documentfilter/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/documentfilter/viewSpecification.html
+++ /dev/null
@@ -1,45 +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.
--->
-
-#set ($month = "DocumentFilter.Month_${MINDATEMONTH}")
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.MinDateColon'))</nobr></td>
-    <td class="value">
-      <nobr>
-        $MINDATEYEAR $Encoder.bodyEscape($ResourceBundle.getString($month)) $MINDATEDAY $MINDATEHOUR:$MINDATEMINUTE
-      </nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.MinFileSizeBytesColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($MINFILESIZE)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.MaxFileSizeBytesColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($MAXFILESIZE)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.AllowedMIMETypesColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($MIMETYPES)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('DocumentFilter.AllowedFileExtensionsColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($EXTENSIONS)</td>
-  </tr>
-  
-</table>
diff --git a/connectors/documentfilter/pom.xml b/connectors/documentfilter/pom.xml
deleted file mode 100644
index 07ff40a..0000000
--- a/connectors/documentfilter/pom.xml
+++ /dev/null
@@ -1,362 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-documentfilter-connector</artifactId>
-  <name>ManifoldCF - Connectors - Document Filter</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/com/DfClientX.java b/connectors/documentum/build-stub/src/main/java/com/documentum/com/DfClientX.java
deleted file mode 100644
index ad3fd5c..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/com/DfClientX.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.com;
-
-import com.documentum.fc.client.IDfClient;
-import com.documentum.fc.common.DfObject;
-import com.documentum.fc.common.IDfLoginInfo;
-import com.documentum.fc.common.DfException;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfClientX extends DfObject implements IDfClientX
-{
-  public DfClientX()
-  {
-  }
-  
-  public IDfLoginInfo getLoginInfo()
-  {
-    return null;
-  }
-  
-  public IDfClient getLocalClient()
-    throws DfException
-  {
-    return null;
-  }
-
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/com/IDfClientX.java b/connectors/documentum/build-stub/src/main/java/com/documentum/com/IDfClientX.java
deleted file mode 100644
index 9ef264d..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/com/IDfClientX.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.com;
-
-import com.documentum.fc.client.IDfClient;
-import com.documentum.fc.common.IDfLoginInfo;
-import com.documentum.fc.common.DfException;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfClientX
-{
-  public IDfLoginInfo getLoginInfo();
-  public IDfClient getLocalClient()
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfAuthenticationException.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfAuthenticationException.java
deleted file mode 100644
index 01cd52c..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfAuthenticationException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfAuthenticationException extends DfServiceException
-{
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfDocbaseUnreachableException.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfDocbaseUnreachableException.java
deleted file mode 100644
index ea44835..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfDocbaseUnreachableException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfDocbaseUnreachableException extends DfIOException
-{
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfIOException.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfIOException.java
deleted file mode 100644
index 3587744..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfIOException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfIOException extends DfServiceException
-{
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfIdentityException.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfIdentityException.java
deleted file mode 100644
index 4596441..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfIdentityException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfIdentityException extends DfServiceException
-{
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfQuery.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfQuery.java
deleted file mode 100644
index 3966659..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfQuery.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfQuery extends DfObject implements IDfQuery
-{
-  public DfQuery()
-  {
-  }
-
-  public IDfCollection execute(IDfSession session, int type)
-    throws DfException
-  {
-    return null;
-  }
-
-  public void setBatchSize(int size)
-  {
-  }
-  
-  public void setDQL(String dql)
-  {
-  }
-
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfServiceException.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfServiceException.java
deleted file mode 100644
index 2812045..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/DfServiceException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfServiceException extends DfException
-{
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfClient.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfClient.java
deleted file mode 100644
index 68675bc..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfClient.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfClient
-{
-  public IDfSessionManager newSessionManager();
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfCollection.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfCollection.java
deleted file mode 100644
index cf22595..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfCollection.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfCollection
-{
-  public String getString(String attribute)
-    throws DfException;
-  public boolean next()
-    throws DfException;
-  public void close()
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfFolder.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfFolder.java
deleted file mode 100644
index a0650bb..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfFolder.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfFolder extends IDfPersistentObject
-{
-  public int getFolderPathCount()
-    throws DfException;
-  public String getFolderPath(int index)
-    throws DfException;
-  public IDfCollection getContents(String attribute)
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfPersistentObject.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfPersistentObject.java
deleted file mode 100644
index 1308d89..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfPersistentObject.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfPersistentObject extends IDfTypedObject
-{
-  public boolean isDeleted()
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfQuery.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfQuery.java
deleted file mode 100644
index 86e74bc..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfQuery.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfQuery
-{
-  public final static int DF_EXECREAD_QUERY = 4;
-
-  public IDfCollection execute(IDfSession session, int type)
-    throws DfException;
-  public void setBatchSize(int size);
-  public void setDQL(String dql);
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSession.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSession.java
deleted file mode 100644
index 97d8c6f..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSession.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfSession
-{
-  public IDfPersistentObject getObject(IDfId id)
-    throws DfException;
-  public IDfType getType(String type)
-    throws DfException;
-  public IDfPersistentObject getObjectByPath(String folderPath)
-    throws DfException;
-  public IDfPersistentObject getObjectByQualification(String dql)
-    throws DfException;
-  public String getSessionId()
-    throws DfException;
-  public String getServerVersion()
-    throws DfException;
-  public String getDocbaseName()
-    throws DfException;
-  public boolean isConnected();
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSessionManager.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSessionManager.java
deleted file mode 100644
index 2bc05c1..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSessionManager.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfSessionManager
-{
-  public void setIdentity(String docBaseName, IDfLoginInfo loginInfo)
-    throws DfException;
-  public IDfSession getSession(String docBaseName)
-    throws DfException;
-  public void release(IDfSession session);
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSysObject.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSysObject.java
deleted file mode 100644
index ea13562..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfSysObject.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfSysObject extends IDfPersistentObject
-{
-  public IDfVersionPolicy getVersionPolicy()
-    throws DfException;
-  public String getFile(String path)
-    throws DfException;
-  public String getTypeName()
-    throws DfException;
-  public int getFolderIdCount()
-    throws DfException;
-  public IDfId getFolderId(int i)
-    throws DfException;
-  public int getPageCount()
-    throws DfException;
-  public long getContentSize()
-    throws DfException;
-  public int getPermit()
-    throws DfException;
-  public boolean isHidden()
-    throws DfException;
-  public String getACLName()
-    throws DfException;
-  public String getACLDomain()
-    throws DfException;
-  public String getContentType()
-    throws DfException;
-  public String getObjectName()
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfType.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfType.java
deleted file mode 100644
index ede8c59..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfType
-{
-  public boolean isSubTypeOf(String theType)
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfTypedObject.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfTypedObject.java
deleted file mode 100644
index 219d909..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfTypedObject.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfTypedObject
-{
-  public IDfId getObjectId()
-    throws DfException;
-  public int getValueCount(String attribute)
-    throws DfException;
-  public String getRepeatingString(String attribute, int index)
-    throws DfException;
-  public String getString(String attribute)
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfUser.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfUser.java
deleted file mode 100644
index f49e8be..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfUser.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-import com.documentum.fc.common.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfUser extends IDfPersistentObject
-{
-  public String getUserName()
-    throws DfException;
-  public int getUserState()
-    throws DfException;
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfVersionPolicy.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfVersionPolicy.java
deleted file mode 100644
index 6477e9e..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/client/IDfVersionPolicy.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.client;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfVersionPolicy
-{
-  public String getSameLabel();
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfException.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfException.java
deleted file mode 100644
index 8319be6..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.common;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfException extends Exception
-{
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfObject.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfObject.java
deleted file mode 100644
index 638aa2d..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfObject.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.common;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfObject
-{
-  public DfObject()
-  {
-  }
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfTime.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfTime.java
deleted file mode 100644
index 0441083..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/DfTime.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.common;
-
-import java.util.Date;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class DfTime extends DfObject implements IDfTime
-{
-  public DfTime(Date date)
-  {
-  }
-  
-  public String asString(String pattern)
-  {
-    return null;
-  }
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfId.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfId.java
deleted file mode 100644
index 6d93e63..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfId.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.common;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfId
-{
-  public String getId();
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfLoginInfo.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfLoginInfo.java
deleted file mode 100644
index c106ade..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfLoginInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.common;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfLoginInfo
-{
-  public void setUser(String userName);
-  public void setPassword(String password);
-  public void setDomain(String domain);
-}
diff --git a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfTime.java b/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfTime.java
deleted file mode 100644
index abfb424..0000000
--- a/connectors/documentum/build-stub/src/main/java/com/documentum/fc/common/IDfTime.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.documentum.fc.common;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IDfTime
-{
-  public static final String DF_TIME_PATTERN44 = "mm/dd/yyyy hh:mi:ss";
-  public String asString(String pattern);
-
-}
diff --git a/connectors/documentum/build.xml b/connectors/documentum/build.xml
deleted file mode 100644
index 1560ddb..0000000
--- a/connectors/documentum/build.xml
+++ /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.
--->
-
-<project name="documentum" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="has-proprietary-materials-check">
-        <available file="lib-proprietary/dfc.jar" property="dfcStatus"/>
-        <available file="lib-proprietary/dfcbase.jar" property="dfcbaseStatus"/>
-        <available file="lib-proprietary/dctm.jar" property="dctmStatus"/>
-        <condition property="proprietaryMaterialsAvailable">
-            <and>
-                <isset property="dfcStatus"/>
-                <isset property="dfcbaseStatus"/>
-                <isset property="dctmStatus"/>
-            </and>
-        </condition>
-    </target>
-
-    <path id="implementation-classpath">
-        <path refid="mcf-connector-build.implementation-classpath"/>
-        <fileset dir="lib-proprietary"> 
-            <include name="*.jar"/> 
-        </fileset> 
-    </path>
-
-    <target name="rmic-build-all" depends="compile-implementation,compile-interface,setup-rmic,has-RMI-check" if="hasRMI">
-        <!-- The ant version I have doesn't seem to handle class specifications based on file names, so this is the best I could come up with -->
-        <antcall target="rmic-build">
-            <param name="classname" value="org.apache.manifoldcf.crawler.common.DCTM.DocumentumFactoryImpl"/>
-        </antcall>
-        <antcall target="rmic-build">
-            <param name="classname" value="org.apache.manifoldcf.crawler.common.DCTM.DocumentumImpl"/>
-        </antcall>
-        <antcall target="rmic-build">
-            <param name="classname" value="org.apache.manifoldcf.crawler.common.DCTM.DocumentumObjectImpl"/>
-        </antcall>
-        <antcall target="rmic-build">
-            <param name="classname" value="org.apache.manifoldcf.crawler.common.DCTM.DocumentumResultImpl"/>
-        </antcall>
-    </target>
-    
-    
-    <target name="server-process" depends="mcf-connector-build.server-process,has-RMI-check" if="hasRMI">
-        <mkdir dir="dist/server-process/lib-proprietary"/>
-        <copy todir="dist/server-process/lib-proprietary">
-            <fileset dir="lib-proprietary" includes="*.jar"/>
-        </copy>
-        <copy todir="dist/server-process/lib-proprietary" file="server/README.txt"/>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="Documentum"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.DCTM.AuthorityConnector"/>
-        </antcall>
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Documentum"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.DCTM.DCTM"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/DCTM/AuthorityConnector.java b/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/DCTM/AuthorityConnector.java
deleted file mode 100644
index 846232a..0000000
--- a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/DCTM/AuthorityConnector.java
+++ /dev/null
@@ -1,1469 +0,0 @@
-/* $Id: AuthorityConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.DCTM;
-
-import org.apache.log4j.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.crawler.common.DCTM.*;
-import java.rmi.*;
-
-
-/** Autheticator.
-*/
-public class AuthorityConnector extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-
-  public static final String CONFIG_PARAM_DOCBASE = "docbasename";
-  public static final String CONFIG_PARAM_USERNAME = "docbaseusername";
-  public static final String CONFIG_PARAM_PASSWORD = "docbasepassword";
-  public static final String CONFIG_PARAM_DOMAIN = "domain";
-  public static final String CONFIG_PARAM_CASEINSENSITIVE = "usernamecaseinsensitive";
-  public static final String CONFIG_PARAM_USESYSTEMACLS = "usesystemacls";
-  public static final String CONFIG_PARAM_CACHELIFETIME = "cachelifetimemins";
-  public static final String CONFIG_PARAM_CACHELRUSIZE = "cachelrusize";
-  
-  protected String docbaseName = null;
-  protected String userName = null;
-  protected String password = null;
-  protected String domain = null;
-  protected boolean caseInsensitive = false;
-  protected boolean useSystemAcls = true;
-
-  // Documentum has no "deny" tokens, and its document acls cannot be empty, so no local authority deny token is required.
-  // However, it is felt that we need to be suspenders-and-belt, so we use the deny token.
-  // The documentum tokens are of the form xxx:yyy, so they cannot collide with the standard deny token.
-
-    /** Cache manager. */
-  protected ICacheManager cacheManager = null;
-
-  // Set if we have set up session parameters necessary for caching
-  protected boolean hasSessionParameters = false;
-  // This is the DFC session; it may be null, or it may be set.
-  protected IDocumentum session = null;
-  protected long lastSessionFetch = -1L;
-
-  protected static final long timeToRelease = 300000L;
-
-  private String cacheLifetime = null;
-  private String cacheLRUsize = null;
-  private long responseLifetime = 60000L;
-  private int LRUsize = 1000;
-
-  public AuthorityConnector()
-  {
-    super();
-  }
-
-  /** Set thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-  
-  /** Clear thread context.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    cacheManager = null;
-  }
-
-  protected class GetSessionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public GetSessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Create a session
-        IDocumentumFactory df = (IDocumentumFactory)Naming.lookup("rmi://127.0.0.1:8300/documentum_factory");
-        IDocumentum newSession = df.make();
-        newSession.createSession(docbaseName,userName,password,domain);
-        session = newSession;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-  }
-
-  /** Get session parameters.
-  */
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (!hasSessionParameters)
-    {
-      try
-      {
-        responseLifetime = Long.parseLong(this.cacheLifetime) * 60L * 1000L;
-        LRUsize = Integer.parseInt(this.cacheLRUsize);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Cache lifetime or Cache LRU size must be an integer: "+e.getMessage(),e);
-      }
-
-      // This is the stuff that used to be in connect()
-      if (docbaseName == null || docbaseName.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_DOCBASE+" required but not set");
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("DCTM: Docbase = '" + docbaseName + "'");
-
-      if (userName == null || userName.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_USERNAME+" required but not set");
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("DCTM: Username = '" + userName + "'");
-
-      if (password == null || password.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_PASSWORD+" required but not set");
-
-      Logging.authorityConnectors.debug("DCTM: Password exists");
-
-      if (domain == null)
-      {
-        // Empty domain is allowed
-        Logging.authorityConnectors.debug("DCTM: No domain");
-      }
-      else
-        Logging.authorityConnectors.debug("DCTM: Domain = '" + domain + "'");
-
-      if (caseInsensitive)
-      {
-        Logging.authorityConnectors.debug("DCTM: Case insensitivity enabled");
-      }
-
-      if (useSystemAcls)
-      {
-        Logging.authorityConnectors.debug("DCTM: Use system acls enabled");
-      }
-
-      hasSessionParameters = true;
-    }
-  }
-  
-  /** Get a DFC session.  This will be done every time it is needed.
-  */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    getSessionParameters();
-    if (session == null)
-    {
-      // This actually sets up the connection
-      GetSessionThread t = new GetSessionThread();
-      try
-      {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null)
-        {
-          if (thr instanceof java.net.MalformedURLException)
-            throw (java.net.MalformedURLException)thr;
-          else if (thr instanceof NotBoundException)
-            throw (NotBoundException)thr;
-          else if (thr instanceof RemoteException)
-            throw (RemoteException)thr;
-          else if (thr instanceof DocumentumException)
-            throw (DocumentumException)thr;
-          else if (thr instanceof RuntimeException)
-            throw (RuntimeException)thr;
-          else
-            throw (Error)thr;
-        }
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.MalformedURLException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      catch (NotBoundException e)
-      {
-        // Transient problem: Server not available at the moment.
-        throw new ManifoldCFException("Server not up at the moment: "+e.getMessage(),e);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        throw new ManifoldCFException("Transient remote exception creating session: "+e.getMessage(),e);
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-        {
-          throw new ManifoldCFException("Remote service interruption creating session: "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-    }
-
-    // Update the expire time for this session, except if an error was thrown.
-    lastSessionFetch = System.currentTimeMillis();
-
-  }
-
-  /** Perform a DQL query, with appropriate reset on a remote exception */
-  protected IDocumentumResult performDQLQuery(String query)
-    throws DocumentumException, ManifoldCFException
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      try
-      {
-        return session.performDQLQuery(query);
-      }
-      catch (RemoteException e)
-      {
-        if (noSession)
-          throw new ManifoldCFException("Transient error connecting to documentum service",e);
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class CheckConnectionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public CheckConnectionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-  }
-
-  /** Check connection, with appropriate retries */
-  protected void checkConnection()
-    throws DocumentumException, ManifoldCFException
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      CheckConnectionThread t = new CheckConnectionThread();
-      try
-      {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null)
-        {
-          if (thr instanceof RemoteException)
-            throw (RemoteException)thr;
-          else if (thr instanceof DocumentumException)
-            throw (DocumentumException)thr;
-          else if (thr instanceof RuntimeException)
-            throw (RuntimeException)thr;
-          else
-            throw (Error)thr;
-        }
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-          throw new ManifoldCFException("Transient error connecting to documentum service",e);
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  /** Perform getObjectByQualification, with appropriate reset */
-  protected IDocumentumObject getObjectByQualification(String qualification)
-    throws DocumentumException, ManifoldCFException
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      try
-      {
-        return session.getObjectByQualification(qualification);
-      }
-      catch (RemoteException e)
-      {
-        if (noSession)
-          throw new ManifoldCFException("Transient error connecting to documentum service",e);
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-
-  }
-
-  /** Get server version, with appropriate retries */
-  protected String getServerVersion()
-    throws DocumentumException, ManifoldCFException
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      try
-      {
-        return session.getServerVersion();
-      }
-      catch (RemoteException e)
-      {
-        if (noSession)
-          throw new ManifoldCFException("Transient error connecting to documentum service",e);
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-
-  }
-
-
-  protected class DestroySessionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public DestroySessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.destroySession();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-  }
-
-
-  /** Release the session, if it's time.
-  */
-  protected void releaseCheck()
-    throws ManifoldCFException
-  {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease)
-    {
-      DestroySessionThread t = new DestroySessionThread();
-      try
-      {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null)
-        {
-          if (thr instanceof RemoteException)
-            throw (RemoteException)thr;
-          else if (thr instanceof DocumentumException)
-            throw (DocumentumException)thr;
-          else if (thr instanceof RuntimeException)
-            throw (RuntimeException)thr;
-          else
-            throw (Error)thr;
-        }
-        session = null;
-        lastSessionFetch = -1L;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.authorityConnectors.warn("Transient remote exception closing session",e);
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.authorityConnectors.warn("Remote service interruption closing session",e);
-        }
-        else
-          Logging.authorityConnectors.warn("Error closing session",e);
-      }
-    }
-  }
-
-  protected class GetUserAccessIDThread extends Thread
-  {
-    protected String strUserName;
-    protected Throwable exception = null;
-    protected String rval = null;
-    protected AuthorizationResponse response = null;
-
-    public GetUserAccessIDThread(String strUserName)
-    {
-      super();
-      setDaemon(true);
-      this.strUserName = strUserName;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Need the server version so we can figure out whether to try the user_login_name query
-        String serverVersion = session.getServerVersion();
-        boolean hasLoginNameColumn = (serverVersion.compareTo("5.3.") >= 0);
-
-        IDocumentumObject object = null;
-        try
-        {
-          if (hasLoginNameColumn)
-            object = getObjectByQualification("dm_user where "+insensitiveMatch(caseInsensitive,"user_login_name",strUserName));
-          if (!object.exists())
-            object = getObjectByQualification("dm_user where "+insensitiveMatch(caseInsensitive,"user_os_name",strUserName));
-          if (!object.exists())
-          {
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("DCTM: No user found for username '" + strUserName + "'");
-            response = RESPONSE_USERNOTFOUND;
-            return;
-          }
-
-          if (object.getUserState() != 0)
-          {
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("DCTM: User found for username '" + strUserName + "' but the account is not active.");
-            response = RESPONSE_USERUNAUTHORIZED;
-            return;
-          }
-
-          rval = object.getUserName();
-
-        }
-        finally
-        {
-          if (object != null)
-            object.release();
-        }
-
-
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-    public String getUserID()
-    {
-      return rval;
-    }
-
-    public AuthorizationResponse getResponse()
-    {
-      return response;
-    }
-  }
-
-  protected class GetAccessTokensThread extends Thread
-  {
-    protected String strDQL;
-    protected ArrayList list;
-    protected Throwable exception = null;
-
-    public GetAccessTokensThread(String strDQL, ArrayList list)
-    {
-      super();
-      setDaemon(true);
-      this.strDQL = strDQL;
-      this.list = list;
-    }
-
-    public void run()
-    {
-      try
-      {
-        IDocumentumResult result = session.performDQLQuery(strDQL);
-        try
-        {
-          if (Logging.authorityConnectors.isDebugEnabled())
-            Logging.authorityConnectors.debug("DCTM: Collection returned.");
-          while (result.isValidRow())
-          {
-            String strObjectName = result.getStringValue("object_name");
-            String strOwnerName = result.getStringValue("owner_name");
-            String strFullTokenName = docbaseName + ":" + strOwnerName + "." + strObjectName;
-            list.add(strFullTokenName);
-
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("DCTM: ACL being added: " + strFullTokenName);
-
-            result.nextRow();
-
-          }
-        }
-        finally
-        {
-          result.close();
-        }
-
-
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param strUserNamePassedIn is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String strUserNamePassedIn)
-    throws ManifoldCFException
-  {
-
-    if (Logging.authorityConnectors.isDebugEnabled())
-      Logging.authorityConnectors.debug("DCTM: Inside AuthorityConnector.getAuthorizationResponse for user '"+strUserNamePassedIn+"'");
-
-    // We need this in order to be able to properly construct an AuthorizationResponseDescription.
-    getSessionParameters();
-    
-    // Construct a cache description object
-    ICacheDescription objectDescription = new AuthorizationResponseDescription(strUserNamePassedIn,docbaseName,userName,password,
-      domain,caseInsensitive,useSystemAcls,responseLifetime,LRUsize);
-    
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-    try
-    {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try
-      {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-        if (response != null)
-          return response;
-        // Create the object.
-        response = getAuthorizationResponseUncached(strUserNamePassedIn);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle,objectDescription,response);
-        // And return it...
-        return response;
-      }
-      finally
-      {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-  
-  /** Uncached get response method. */
-  protected AuthorizationResponse getAuthorizationResponseUncached(String strUserNamePassedIn)
-    throws ManifoldCFException
-  {
-    if (Logging.authorityConnectors.isDebugEnabled())
-      Logging.authorityConnectors.debug("DCTM: Inside AuthorityConnector.getAuthorizationResponseUncached for user '"+strUserNamePassedIn+"'");
-
-    try
-    {
-      String strUserName = strUserNamePassedIn;
-
-      String strAccessToken;
-      while (true)
-      {
-        boolean noSession = (session==null);
-        getSession();
-        GetUserAccessIDThread t = new GetUserAccessIDThread(strUserName);
-        try
-        {
-          t.start();
-          t.join();
-          Throwable thr = t.getException();
-          if (thr != null)
-          {
-            if (thr instanceof RemoteException)
-              throw (RemoteException)thr;
-            else if (thr instanceof DocumentumException)
-              throw (DocumentumException)thr;
-            else if (thr instanceof RuntimeException)
-              throw (RuntimeException)thr;
-            else
-              throw (Error)thr;
-          }
-          if (t.getResponse() != null)
-            return t.getResponse();
-          strAccessToken = t.getUserID();
-          // Exit out of retry loop
-          break;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RemoteException e)
-        {
-          Throwable e2 = e.getCause();
-          if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-            throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-          if (noSession)
-          {
-            Logging.authorityConnectors.warn("DCTM: Transient error checking authorization: "+e.getMessage(),e);
-            return RESPONSE_UNREACHABLE;
-          }
-          session = null;
-          lastSessionFetch = -1L;
-          // Go back around again
-        }
-      }
-
-
-      // String strDQL = "SELECT DISTINCT A.object_name FROM dm_acl A
-      // WHERE (any (A.r_accessor_name = '" + strAccessToken + "' AND
-      // A.r_accessor_permit > 1) OR ANY (A.r_accessor_name in (SELECT
-      // G.group_name FROM dm_group G WHERE ANY G.i_all_users_names = '" +
-      // strAccessToken + "') AND A.r_accessor_permit > 1)) AND '" +
-      // strAccessToken + "' In (SELECT U.user_name FROM dm_user U WHERE
-      // U.user_state=0)";
-      String strDQL = "SELECT DISTINCT A.owner_name, A.object_name FROM dm_acl A " + " WHERE ";
-      if (!useSystemAcls)
-      {
-        strDQL += "A.object_name NOT LIKE 'dm_%' AND (";
-      }
-      
-      // Include ACLs with positive groups and users
-      strDQL += "(any (A.r_accessor_name IN (" + quoteDQLString(strAccessToken) + ", 'dm_world') AND r_accessor_permit>2) OR (any (A.r_accessor_name='dm_owner' AND A.r_accessor_permit>2) AND A.owner_name=" + quoteDQLString(strAccessToken) + ") OR (ANY (A.r_accessor_name in (SELECT G.group_name FROM dm_group G WHERE ANY G.i_all_users_names = " + quoteDQLString(strAccessToken) + ") AND r_accessor_permit>2))) ";
-      // Exclude ACLs with negative groups and users
-      strDQL += "AND NOT (any (A.r_accessor_name IN (" + quoteDQLString(strAccessToken) + ", 'dm_world') AND r_accessor_permit<=2) OR (any (A.r_accessor_name='dm_owner' AND A.r_accessor_permit<=2) AND A.owner_name=" + quoteDQLString(strAccessToken) + ") OR (ANY (A.r_accessor_name in (SELECT G.group_name FROM dm_group G WHERE ANY G.i_all_users_names = " + quoteDQLString(strAccessToken) + ") AND r_accessor_permit<=2)))";
-      
-      if (!useSystemAcls) {
-        strDQL += ")";
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("DCTM: About to execute query= (" + strDQL + ")");
-
-      while (true)
-      {
-        boolean noSession = (session==null);
-        getSession();
-        ArrayList list =  new ArrayList();
-        GetAccessTokensThread t = new GetAccessTokensThread(strDQL,list);
-        try
-        {
-          t.start();
-          t.join();
-          Throwable thr = t.getException();
-          if (thr != null)
-          {
-            if (thr instanceof RemoteException)
-              throw (RemoteException)thr;
-            else if (thr instanceof DocumentumException)
-              throw (DocumentumException)thr;
-            else if (thr instanceof RuntimeException)
-              throw (RuntimeException)thr;
-            else
-              throw (Error)thr;
-          }
-          Logging.authorityConnectors.debug("DCTM: Done processing authorization query");
-
-          String[] strArrayRetVal = new String[list.size()];
-
-          int intObjectIdIndex = 0;
-
-          while (intObjectIdIndex < strArrayRetVal.length)
-          {
-            strArrayRetVal[intObjectIdIndex] = (String)list.get(intObjectIdIndex);
-            intObjectIdIndex++;
-          }
-          // Break out of retry loop and return
-          return new AuthorizationResponse(strArrayRetVal,AuthorizationResponse.RESPONSE_OK);
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RemoteException e)
-        {
-          Throwable e2 = e.getCause();
-          if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-            throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-          if (noSession)
-          {
-            Logging.authorityConnectors.warn("DCTM: Transient error checking authorization: "+e.getMessage(),e);
-            return RESPONSE_UNREACHABLE;
-          }
-          session = null;
-          lastSessionFetch = -1L;
-          // Go back around again
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        Logging.authorityConnectors.warn("DCTM: Transient error checking authorization: "+e.getMessage(),e);
-        // Transient: Treat as if user does not exist, not like credentials invalid.
-        return RESPONSE_UNREACHABLE;
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    return RESPONSE_UNREACHABLE;
-  }
-
-  protected static String insensitiveMatch(boolean insensitive, String field, String value)
-  {
-    StringBuilder sb = new StringBuilder();
-    if (insensitive)
-      sb.append("upper(").append(field).append(")");
-    else
-      sb.append(field);
-    sb.append("=");
-    if (insensitive)
-      sb.append(quoteDQLString(value.toUpperCase(Locale.ROOT)));
-    else
-      sb.append(quoteDQLString(value));
-    return sb.toString();
-  }
-
-  protected static String quoteDQLString(String value)
-  {
-    StringBuilder sb = new StringBuilder("'");
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\'')
-        sb.append(x);
-      sb.append(x);
-    }
-    sb.append("'");
-    return sb.toString();
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      try
-      {
-        checkConnection();
-        return super.check();
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-          return "Connection temporarily failed: "+e.getMessage();
-        else
-          return "Connection failed: "+e.getMessage();
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      return "Connection failed: "+e.getMessage();
-    }
-
-  }
-
-
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    docbaseName = configParams.getParameter(CONFIG_PARAM_DOCBASE);
-    userName = configParams.getParameter(CONFIG_PARAM_USERNAME);
-    password = configParams.getObfuscatedParameter(CONFIG_PARAM_PASSWORD);
-    domain = configParams.getParameter(CONFIG_PARAM_DOMAIN);
-    if (domain == null || domain.length() < 1)
-    {
-      // Empty domain is allowed
-      domain = null;
-    }
-
-    String strCaseInsensitive = configParams.getParameter(CONFIG_PARAM_CASEINSENSITIVE);
-    if (strCaseInsensitive != null && strCaseInsensitive.equals("true"))
-    {
-      caseInsensitive = true;
-    }
-    else
-      caseInsensitive = false;
-
-    String strUseSystemAcls = configParams.getParameter(CONFIG_PARAM_USESYSTEMACLS);
-    if (strUseSystemAcls == null || strUseSystemAcls.equals("true"))
-    {
-      useSystemAcls = true;
-    }
-    else
-      useSystemAcls = false;
-
-    cacheLifetime = configParams.getParameter(CONFIG_PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    cacheLRUsize = configParams.getParameter(CONFIG_PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";    
-
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /** Disconnect from Documentum.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    hasSessionParameters = false;
-    if (session != null)
-    {
-      DestroySessionThread t = new DestroySessionThread();
-      try
-      {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null)
-        {
-          if (thr instanceof RemoteException)
-            throw (RemoteException)thr;
-          else if (thr instanceof DocumentumException)
-            throw (DocumentumException)thr;
-          else if (thr instanceof RuntimeException)
-            throw (RuntimeException)thr;
-          else
-            throw (Error)thr;
-        }
-        session = null;
-        lastSessionFetch = -1L;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.authorityConnectors.warn("DCTM: Transient remote exception closing session: "+e.getMessage(),e);
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.authorityConnectors.warn("DCTM: Remote service interruption closing session: "+e.getMessage(),e);
-        }
-        else
-          Logging.authorityConnectors.warn("DCTM: Error closing session: "+e.getMessage(),e);
-      }
-
-    }
-
-    docbaseName = null;
-    userName = null;
-    password = null;
-    domain = null;
-    
-    cacheLifetime = null;
-    cacheLRUsize = null;
-
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    releaseCheck();
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"DCTM.Docbase"));
-    tabsArray.add(Messages.getString(locale,"DCTM.UserMapping"));
-    tabsArray.add(Messages.getString(locale,"DCTM.SystemACLs"));
-    tabsArray.add(Messages.getString(locale,"DCTM.Cache"));
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.docbasename.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.PleaseSupplyTheNameOfADocbase") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Docbase") + "\");\n"+
-"    editconnection.docbasename.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.docbaseusername.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.TheConnectionRequiresAValidDocumentumUserName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Docbase") + "\");\n"+
-"    editconnection.docbaseusername.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.docbasepassword.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.TheConnectionRequiresTheDocumentumUsersPassword") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Docbase") + "\");\n"+
-"    editconnection.docbasepassword.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelifetime.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.CacheLifetimeCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Cache") + "\");\n"+
-"    editconnection.cachelifetime.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelifetime.value != \"\" && !isInteger(editconnection.cachelifetime.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.CacheLifetimeMustBeAnInteger") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Cache") + "\");\n"+
-"    editconnection.cachelifetime.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelrusize.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.CacheLRUSizeCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Cache") + "\");\n"+
-"    editconnection.cachelrusize.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelrusize.value != \"\" && !isInteger(editconnection.cachelrusize.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.CacheLRUSizeMustBeAnInteger") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Cache") + "\");\n"+
-"    editconnection.cachelrusize.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String docbaseName = parameters.getParameter(CONFIG_PARAM_DOCBASE);
-    if (docbaseName == null)
-      docbaseName = "";
-
-    String docbaseUserName = parameters.getParameter(CONFIG_PARAM_USERNAME);
-    if (docbaseUserName == null)
-      docbaseUserName = "";
-
-    String docbasePassword = parameters.getObfuscatedParameter(CONFIG_PARAM_PASSWORD);
-    if (docbasePassword == null)
-      docbasePassword = "";
-    else
-      docbasePassword = out.mapPasswordToKey(docbasePassword);
-
-    String docbaseDomain = parameters.getParameter(CONFIG_PARAM_DOMAIN);
-    if (docbaseDomain == null)
-      docbaseDomain = "";
-
-    String caseInsensitiveUser = parameters.getParameter(CONFIG_PARAM_CASEINSENSITIVE);
-    if (caseInsensitiveUser == null)
-      caseInsensitiveUser = "false";
-
-    String useSystemAcls = parameters.getParameter(CONFIG_PARAM_USESYSTEMACLS);
-    if (useSystemAcls == null)
-      useSystemAcls = "true";
-
-    String cacheLifetime = parameters.getParameter(CONFIG_PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    
-    String cacheLRUsize = parameters.getParameter(CONFIG_PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";    
-
-    // "Docbase" tab
-    if (tabName.equals(Messages.getString(locale,"DCTM.Docbase")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbaseName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"docbasename\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbaseUserName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"docbaseusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseUserName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbasePassword") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"password\" size=\"32\" name=\"docbasepassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbasePassword)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbaseDomain") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"docbasedomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseDomain)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for "Docbase" tab
-      out.print(
-"<input type=\"hidden\" name=\"docbasename\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"docbaseusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseUserName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"docbasepassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbasePassword)+"\"/>\n"+
-"<input type=\"hidden\" name=\"docbasedomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseDomain)+"\"/>\n"
-      );
-    }
-
-    // "User Mapping" tab
-    if (tabName.equals(Messages.getString(locale,"DCTM.UserMapping")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.AuthenticationUsernameMatching") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"+
-"        <tr>\n"+
-"          <td class=\"description\"><input name=\"usernamecaseinsensitive\" type=\"radio\" value=\"true\" "+((caseInsensitiveUser.equals("true"))?"checked=\"true\"":"")+" /></td>\n"+
-"          <td class=\"value\"><nobr>" + Messages.getBodyString(locale,"DCTM.CaseInsensitive") + "</nobr></td>\n"+
-"        </tr>\n"+
-"        <tr>\n"+
-"          <td class=\"description\"><input name=\"usernamecaseinsensitive\" type=\"radio\" value=\"false\" "+((!caseInsensitiveUser.equals("true"))?"checked=\"true\"":"")+" /></td>\n"+
-"          <td class=\"value\"><nobr>" + Messages.getBodyString(locale,"DCTM.CaseSensitive") + "</nobr></td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for "User Mapping" tab
-      out.print(
-"<input type=\"hidden\" name=\"usernamecaseinsensitive\" value=\""+caseInsensitiveUser+"\"/>\n"
-      );
-    }
-
-    // "System ACLs" tab
-    if (tabName.equals(Messages.getString(locale,"DCTM.SystemACLs")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.UseSystemAcls") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"+
-"        <tr>\n"+
-"          <td class=\"description\"><input name=\"usesystemacls\" type=\"radio\" value=\"true\" "+((useSystemAcls.equals("true"))?"checked=\"true\"":"")+" /></td>\n"+
-"          <td class=\"value\"><nobr>" + Messages.getBodyString(locale,"DCTM.UseSystemAcls") + "</nobr></td>\n"+
-"        </tr>\n"+
-"        <tr>\n"+
-"          <td class=\"description\"><input name=\"usesystemacls\" type=\"radio\" value=\"false\" "+((!useSystemAcls.equals("true"))?"checked=\"true\"":"")+" /></td>\n"+
-"          <td class=\"value\"><nobr>" + Messages.getBodyString(locale,"DCTM.DontUseSystemAcls") + "</nobr></td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for "System ACLs" tab
-      out.print(
-"<input type=\"hidden\" name=\"usesystemacls\" value=\""+useSystemAcls+"\"/>\n"
-      );
-    }
-    
-    // "Cache" tab
-    if(tabName.equals(Messages.getString(locale,"DCTM.Cache")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.CacheLifetime") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"cachelifetime\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLifetime) + "\"/> " + Messages.getBodyString(locale,"DCTM.minutes") + "</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.CacheLRUSize") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"cachelrusize\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLRUsize) + "\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for "Cache" tab
-      out.print(
-"<input type=\"hidden\" name=\"cachelifetime\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLifetime) + "\"/>\n"+
-"<input type=\"hidden\" name=\"cachelrusize\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLRUsize) + "\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String docbaseName = variableContext.getParameter("docbasename");
-    if (docbaseName != null)
-      parameters.setParameter(CONFIG_PARAM_DOCBASE,docbaseName);
-	
-    String docbaseUserName = variableContext.getParameter("docbaseusername");
-    if (docbaseUserName != null)
-      parameters.setParameter(CONFIG_PARAM_USERNAME,docbaseUserName);
-	
-    String docbasePassword = variableContext.getParameter("docbasepassword");
-    if (docbasePassword != null)
-      parameters.setObfuscatedParameter(CONFIG_PARAM_PASSWORD,variableContext.mapKeyToPassword(docbasePassword));
-	
-    String docbaseDomain = variableContext.getParameter("docbasedomain");
-    if (docbaseDomain != null)
-      parameters.setParameter(CONFIG_PARAM_DOMAIN,docbaseDomain);
-
-    String caseInsensitiveUser = variableContext.getParameter("usernamecaseinsensitive");
-    if (caseInsensitiveUser != null)
-      parameters.setParameter(CONFIG_PARAM_CASEINSENSITIVE,caseInsensitiveUser);
-
-    String useSystemAcls = variableContext.getParameter("usesystemacls");
-    if (useSystemAcls != null)
-      parameters.setParameter(CONFIG_PARAM_USESYSTEMACLS,useSystemAcls);
-    
-    String cacheLifetime = variableContext.getParameter("cachelifetime");
-    if (cacheLifetime != null)
-      parameters.setParameter(CONFIG_PARAM_CACHELIFETIME,cacheLifetime);
-
-    String cacheLRUsize = variableContext.getParameter("cachelrusize");
-    if (cacheLRUsize != null)
-      parameters.setParameter(CONFIG_PARAM_CACHELRUSIZE,cacheLRUsize);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"DCTM.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" " + Messages.getBodyString(locale,"DCTM.certificate") + "&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-  protected static StringSet emptyStringSet = new StringSet();
-
-  /** This is the cache object descriptor for cached access tokens from
-  * this connector.
-  */
-  protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    // The parameters upon which the cached results are based.
-    protected String userName;
-    protected String docbaseName;
-    protected String adminUserName;
-    protected String adminPassword;
-    protected String domain;
-    protected boolean caseInsensitive;
-    protected boolean useSystemACLs;
-    /** The expiration time */
-    protected long expirationTime = -1;
-    /** The response lifetime */
-    protected long responseLifetime;
-    
-    /** Constructor. */
-    public AuthorizationResponseDescription(String userName, String docbaseName,
-      String adminUserName, String adminPassword, String domain,
-      boolean caseInsensitive, boolean useSystemACLs,
-      long responseLifetime, int LRUsize)
-    {
-      super("DocumentumDirectoryAuthority",LRUsize);
-      this.userName = userName;
-      this.docbaseName = docbaseName;
-      this.adminUserName = adminUserName;
-      this.adminPassword = adminPassword;
-      this.domain = domain;
-      this.caseInsensitive = caseInsensitive;
-      this.useSystemACLs = useSystemACLs;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /** Return the invalidation keys for this object. */
-    public StringSet getObjectKeys()
-    {
-      return emptyStringSet;
-    }
-
-    /** Get the critical section name, used for synchronizing the creation of the object */
-    public String getCriticalSectionName()
-    {
-      return getClass().getName() + "-" + userName + "-" + docbaseName +
-        "-" + adminUserName + "-" + adminPassword + "-" + ((domain==null)?"NULL":domain) + "-" +
-        (caseInsensitive?"true":"false") + "-" + (useSystemACLs?"true":"false");
-    }
-
-    /** Return the object expiration interval */
-    public long getObjectExpirationTime(long currentTime)
-    {
-      if (expirationTime == -1)
-        expirationTime = currentTime + responseLifetime;
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      return userName.hashCode() + docbaseName.hashCode() + adminUserName.hashCode() +
-        adminPassword.hashCode() + ((domain==null)?0:domain.hashCode()) +
-        (caseInsensitive?1:0) + (useSystemACLs?1:0);
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorizationResponseDescription))
-        return false;
-      AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-      return ard.userName.equals(userName) && ard.docbaseName.equals(docbaseName) &&
-        ard.adminUserName.equals(adminUserName) && ard.adminPassword.equals(adminPassword) &&
-        ((ard.domain==null||domain==null)?(ard.domain == domain):(ard.domain.equals(domain))) &&
-        ard.caseInsensitive == caseInsensitive && ard.useSystemACLs == useSystemACLs;
-    }
-    
-  }
-
-}
diff --git a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/DCTM/Messages.java b/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/DCTM/Messages.java
deleted file mode 100644
index a058700..0000000
--- a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/DCTM/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.DCTM;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.DCTM.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.DCTM";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java b/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java
deleted file mode 100644
index c903055..0000000
--- a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java
+++ /dev/null
@@ -1,4472 +0,0 @@
-/* $Id: DCTM.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.DCTM;
-
-import org.apache.log4j.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.crawler.common.DCTM.*;
-import java.rmi.*;
-
-public class DCTM extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: DCTM.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  public static String CONFIG_PARAM_DOCBASE = "docbasename";
-  public static String CONFIG_PARAM_USERNAME = "docbaseusername";
-  public static String CONFIG_PARAM_PASSWORD = "docbasepassword";
-  public static String CONFIG_PARAM_WEBTOPBASEURL = "webtopbaseurl";
-  public static String CONFIG_PARAM_DOMAIN = "domain";
-
-  public static String CONFIG_PARAM_LOCATION = "docbaselocation";
-  public static String CONFIG_PARAM_OBJECTTYPE = "objecttype";
-  public static String CONFIG_PARAM_ATTRIBUTENAME = "attrname";
-  public static String CONFIG_PARAM_MAXLENGTH = "maxdoclength";
-  public static String CONFIG_PARAM_FORMAT = "mimetype";
-  public static String CONFIG_PARAM_PATHNAMEATTRIBUTE = "pathnameattribute";
-  public static String CONFIG_PARAM_PATHMAP = "pathmap";
-  public static String CONFIG_PARAM_FILTER = "filter";
-  
-  // Activities we log
-  public final static String ACTIVITY_FETCH = "fetch";
-
-  protected String docbaseName = null;
-  protected String userName = null;
-  protected String password = null;
-  protected String domain = null;
-  protected String webtopBaseURL = null;
-
-  protected boolean hasSessionParameters = false;
-  protected IDocumentum session = null;
-  protected long lastSessionFetch = -1L;
-
-  protected static final long timeToRelease = 300000L;
-
-  /** Documentum has no "deny" tokens, and its document acls cannot be empty, so no local authority deny token is required.
-  * However, it is felt that we need to be suspenders-and-belt, so here is the deny token.
-  * The documentum tokens are of the form xxx:yyy, so they cannot collide with the standard deny token. */
-  private static final String denyToken = GLOBAL_DENY_TOKEN;
-
-  protected class GetSessionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public GetSessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Create a session
-        IDocumentumFactory df = (IDocumentumFactory)Naming.lookup("rmi://127.0.0.1:8300/documentum_factory");
-        IDocumentum newSession = df.make();
-        newSession.createSession(docbaseName,userName,password,domain);
-        session = newSession;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, java.net.MalformedURLException, NotBoundException, RemoteException, DocumentumException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof java.net.MalformedURLException)
-          throw (java.net.MalformedURLException)thr;
-        else if (thr instanceof NotBoundException)
-          throw (NotBoundException)thr;
-        else if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-  /** Establish session parameters.
-  */
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (!hasSessionParameters)
-    {
-      // Perform basic parameter checking, and debug output.
-      if (docbaseName == null || docbaseName.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_DOCBASE+" required but not set");
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("DCTM: Docbase = '" + docbaseName + "'");
-
-      if (userName == null || userName.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_USERNAME+" required but not set");
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("DCTM: Username = '" + userName + "'");
-
-      if (password == null || password.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_PASSWORD+" required but not set");
-
-      Logging.connectors.debug("DCTM: Password exists");
-
-      if (webtopBaseURL == null || webtopBaseURL.length() < 1)
-        throw new ManifoldCFException("Required parameter "+CONFIG_PARAM_WEBTOPBASEURL+" missing");
-
-      if (domain == null)
-        // Empty domain is allowed
-        Logging.connectors.debug("DCTM: No domain");
-      else
-        Logging.connectors.debug("DCTM: Domain = '" + domain + "'");
-
-      hasSessionParameters = true;
-    }
-  }
-  
-  /** Get a DFC session.  This will be done every time it is needed.
-  */
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSessionParameters();
-    if (session == null)
-    {
-      long currentTime;
-      GetSessionThread t = new GetSessionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.MalformedURLException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      catch (NotBoundException e)
-      {
-        // Transient problem: Server not available at the moment.
-        Logging.connectors.warn("DCTM: RMI server not up at the moment: "+e.getMessage(),e);
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),currentTime + 60000L);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        // Treat this as a transient problem
-        Logging.connectors.warn("DCTM: Transient remote exception creating session: "+e.getMessage(),e);
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),currentTime + 60000L);
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.connectors.warn("DCTM: Remote service interruption creating session: "+e.getMessage(),e);
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L,currentTime + 12*60*60000L,
-            -1,true);
-        }
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-    }
-
-    // Note that we need the session at this time; this will determine when
-    // the session expires.
-    lastSessionFetch = System.currentTimeMillis();
-
-  }
-
-  protected class GetListOfValuesThread extends Thread
-  {
-    protected final String query;
-    protected final String fieldName;
-    
-    protected Throwable exception = null;
-    protected final List<String> list = new ArrayList<String>();
-
-    public GetListOfValuesThread(String query, String fieldName)
-    {
-      super();
-      setDaemon(true);
-      this.query = query;
-      this.fieldName = fieldName;
-    }
-
-    public void run()
-    {
-      try
-      {
-        IDocumentumResult result = session.performDQLQuery(query);
-        try
-        {
-          while (result.isValidRow())
-          {
-            list.add(result.getStringValue(fieldName));
-            result.nextRow();
-          }
-          return;
-        }
-        finally
-        {
-          result.close();
-        }
-
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public List<String> finishUp()
-      throws InterruptedException, RemoteException, DocumentumException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return list;
-    }
-
-  }
-
-  protected List<String> getAttributesForType(String typeName)
-    throws DocumentumException, ManifoldCFException, ServiceInterruption
-  {
-    String strDQL = "select distinct attr_name FROM dmi_dd_attr_info where type_name = '" + typeName + "'";
-
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      GetListOfValuesThread t = new GetListOfValuesThread(strDQL,"attr_name");
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class CheckConnectionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public CheckConnectionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, RemoteException, DocumentumException
-    {    
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-  /** Check connection, with appropriate retries */
-  protected void checkConnection()
-    throws DocumentumException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      CheckConnectionThread t = new CheckConnectionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class BuildDateStringThread extends Thread
-  {
-    protected long timevalue;
-    protected Throwable exception = null;
-    protected String rval = null;
-
-    public BuildDateStringThread(long timevalue)
-    {
-      super();
-      setDaemon(true);
-      this.timevalue = timevalue;
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.buildDateString(timevalue);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public String finishUp()
-      throws InterruptedException, RemoteException, DocumentumException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Build date string with appropriate reset */
-  protected String buildDateString(long timevalue)
-    throws DocumentumException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      BuildDateStringThread t = new BuildDateStringThread(timevalue);
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class DestroySessionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public DestroySessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.destroySession();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, RemoteException, DocumentumException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-  /** Release the session, if it's time.
-  */
-  protected void releaseCheck()
-    throws ManifoldCFException
-  {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease)
-    {
-      DestroySessionThread t = new DestroySessionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-        session = null;
-        lastSessionFetch = -1L;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn("Transient remote exception closing session: "+e.getMessage(),e);
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.connectors.warn("Remote service interruption closing session: "+e.getMessage(),e);
-        }
-        else
-          Logging.connectors.warn("Error closing session: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  /** Constructor.
-  */
-  public DCTM()
-  {
-    super();
-  }
-
-  /** Let the crawler know the completeness of the information we are giving it.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    // For documentum, originally we thought it would return the deleted objects when we
-    // reseeded.  Later research has shown that documentum simply deletes the whole thing now
-    // and doesn't leave a gravemarker around at all.  So we have no choice but to treat this
-    // like other stupid repositories and check for deletes by scanning!  UGH.  It also does
-    // not accurately provide changes, because the ACL changes are not caught by the query.
-    return MODEL_ADD;
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{ACTIVITY_FETCH};
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      try
-      {
-        checkConnection();
-        return super.check();
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-          throw new ServiceInterruption(e.getMessage(),0L);
-        else
-          throw new ManifoldCFException(e.getMessage(),e);
-      }
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Connection temporarily failed: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      return "Connection failed: "+e.getMessage();
-    }
-  }
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  * Note well: There are no exceptions allowed from this call, since it is expected to mainly establish connection parameters.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    // Set local parameters, for convenience
-    docbaseName = params.getParameter(CONFIG_PARAM_DOCBASE);
-    userName = params.getParameter(CONFIG_PARAM_USERNAME);
-    password = params.getObfuscatedParameter(CONFIG_PARAM_PASSWORD);
-    webtopBaseURL = params.getParameter(CONFIG_PARAM_WEBTOPBASEURL);
-    domain = params.getParameter(CONFIG_PARAM_DOMAIN);
-    if (domain == null || domain.length() < 1)
-      domain = null;
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    releaseCheck();
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /** Disconnect from Documentum.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    hasSessionParameters = false;
-    if (session != null)
-    {
-      DestroySessionThread t = new DestroySessionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-        session = null;
-        lastSessionFetch = -1L;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn("DCTM: Transient remote exception closing session: "+e.getMessage(),e);
-      }
-      catch (DocumentumException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.connectors.warn("DCTM: Remote service interruption closing session: "+e.getMessage(),e);
-        }
-        else
-          Logging.connectors.warn("DCTM: Error closing session: "+e.getMessage(),e);
-      }
-
-    }
-
-    docbaseName = null;
-    userName = null;
-    password = null;
-    domain = null;
-    webtopBaseURL = null;
-
-  }
-
-  /** Protected method for calculating the URI
-  */
-  protected String convertToURI(String strObjectId, String objectType)
-    throws ManifoldCFException
-  {
-    String strWebtopBaseUrl = webtopBaseURL;
-
-    if (!strWebtopBaseUrl.endsWith("/"))
-    {
-      strWebtopBaseUrl = strWebtopBaseUrl + "/";
-    }
-
-    return strWebtopBaseUrl +
-      "component/drl?versionLabel=CURRENT&objectId=" + strObjectId;
-  }
-
-  /** Get the bin (so throttling makes sense).  We will bin by docbase.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    // Previously, this actually established a session and went back-and-forth with
-    // documentum.  But we already have the docbase name, so that seems stupid.
-    return new String[]{docbaseName};
-  }
-
-  protected static class StringQueue
-  {
-    protected String value = null;
-    protected boolean present = false;
-    protected boolean abort = false;
-
-    public StringQueue()
-    {
-    }
-
-    public synchronized String getNext()
-      throws InterruptedException
-    {
-      while (abort == false && present == false)
-        wait();
-      if (abort)
-        return null;
-      present = false;
-      String rval = value;
-      notifyAll();
-      return rval;
-    }
-
-    public synchronized void add(String value)
-      throws InterruptedException
-    {
-      while (abort == false && present == true)
-        wait();
-      if (abort)
-        return;
-      present = true;
-      this.value = value;
-      notifyAll();
-    }
-
-    public synchronized void abort()
-    {
-      abort = true;
-      notifyAll();
-    }
-  }
-
-  protected class GetDocumentsFromQueryThread extends Thread
-  {
-    protected String dql;
-    protected StringQueue queue;
-    protected Throwable exception = null;
-    protected boolean abortSignaled = false;
-
-    public GetDocumentsFromQueryThread(String dql, StringQueue queue)
-    {
-      super();
-      setDaemon(true);
-      this.dql = dql;
-      this.queue = queue;
-    }
-
-    public void abort()
-    {
-      abortSignaled = true;
-      queue.abort();
-    }
-
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          // This is a bit dicey, because any call to a ISeedingActivities method may well cause locks to be thrown.  The owning thread,
-          // however, will try to shut this thread down only once, then it will exit itself.  Since the activities method itself is properly
-          // interruptible, cleanup will correctly occur should there be enough time to do it before the process exits - but that is not
-          // guaranteed, unfortunately.
-          //
-          // So, the only way this can work is to build an in-memory queue, where the owning thread does the actual call to the appropriate
-          // ISeedingActivities method.  It's yet another complication on an already extremely complex model.
-          if (!abortSignaled)
-          {
-            IDocumentumResult result = session.performDQLQuery(dql);
-            try
-            {
-              while (result.isValidRow())
-              {
-                if (abortSignaled)
-                  break;
-                String strObjectId = result.getStringValue("i_chronicle_id");
-                result.nextRow();
-                queue.add(strObjectId);
-              }
-            }
-            finally
-            {
-              result.close();
-            }
-          }
-        }
-        catch (InterruptedException e)
-        {
-          // Abort the thread
-          throw e;
-        }
-        catch (Throwable e)
-        {
-          this.exception = e;
-        }
-        finally
-        {
-          // Always signal the end!!  This guarantees that the calling thread will be able to wake up and notice we have finished.
-          queue.add(null);
-        }
-      }
-      catch (InterruptedException e)
-      {
-        // Just end
-      }
-    }
-
-    public void finishUp()
-      throws RemoteException, DocumentumException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    if (command.equals("contenttypes"))
-    {
-      try
-      {
-        String[] contentTypes = getContentTypes();
-        int i = 0;
-        while (i < contentTypes.length)
-        {
-          String contentType = contentTypes[i++];
-          ConfigurationNode node = new ConfigurationNode("content_type");
-          node.setValue(contentType);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.equals("objecttypes"))
-    {
-      try
-      {
-        String[] objectTypes = getObjectTypes();
-        int i = 0;
-        while (i < objectTypes.length)
-        {
-          String objectType = objectTypes[i++];
-          ConfigurationNode node = new ConfigurationNode("object_type");
-          node.setValue(objectType);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("folders/"))
-    {
-      // I hope folder names in Documentum cannot have "/" characters in them.
-      String parentFolder = command.substring("folders/".length());
-      try
-      {
-        String[] folders = getChildFolderNames(parentFolder);
-        int i = 0;
-        while (i < folders.length)
-        {
-          String folder = folders[i++];
-          ConfigurationNode node = new ConfigurationNode("folder");
-          node.setValue(folder);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("indexableattributes/"))
-    {
-      // I hope object types can't have "/" characters
-      String objectType = command.substring("indexableattributes/".length());
-      try
-      {
-        String[] indexableAttributes = getIngestableAttributes(objectType);
-        int i = 0;
-        while (i < indexableAttributes.length)
-        {
-          String indexableAttribute = indexableAttributes[i++];
-          ConfigurationNode node = new ConfigurationNode("attribute");
-          node.setValue(indexableAttribute);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else
-      return super.requestInfo(output,command);
-    return true;
-  }
-  
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Extract startTime
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else
-    {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-
-    // First, build the query
-
-    StringBuilder strLocationsClause = new StringBuilder();
-    Map<String,Map<String,Map<String,Set<String>>>> tokenList = new HashMap<String,Map<String,Map<String,Set<String>>>>();
-    List<String> contentList = null;
-    String maxSize = null;
-
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode n = spec.getChild(i);
-      if (n.getType().equals(CONFIG_PARAM_LOCATION))
-      {
-        String strLocation = n.getAttributeValue("path");
-        if (strLocation != null && strLocation.length() > 0)
-        {
-          if (strLocationsClause != null && strLocationsClause.length() > 0)
-          {
-            strLocationsClause.append(" OR Folder('").append(strLocation).append("', DESCEND)");
-          }
-          else
-          {
-            strLocationsClause.append("Folder('").append(strLocation).append("', DESCEND)");
-          }
-        }
-      }
-      else if (n.getType().equals(CONFIG_PARAM_OBJECTTYPE))
-      {
-        String objType = n.getAttributeValue("token");
-        Map<String,Map<String,Set<String>>> filters = tokenList.get(objType);
-        if (filters == null)
-        {
-          filters = new HashMap<String,Map<String,Set<String>>>();
-          tokenList.put(objType,filters);
-        }
-        // Go through children and pick out filters
-        for (int j = 0; j < n.getChildCount(); j++)
-        {
-          SpecificationNode sn = n.getChild(j);
-          if (sn.getType().equals(CONFIG_PARAM_FILTER))
-          {
-            String attributeName = sn.getAttributeValue("name");
-            String operation = sn.getAttributeValue("op");
-            String value = sn.getAttributeValue("value");
-            Map<String,Set<String>> operations = filters.get(attributeName);
-            if (operations == null)
-            {
-              operations = new HashMap<String,Set<String>>();
-              filters.put(attributeName,operations);
-            }
-            Set<String> values = operations.get(operation);
-            if (values == null)
-            {
-              values = new HashSet<String>();
-              operations.put(operation,values);
-            }
-            values.add(value);
-          }
-        }
-      }
-      else if (n.getType().equals(CONFIG_PARAM_FORMAT))
-      {
-        String docType = n.getAttributeValue("value");
-        if (contentList == null)
-          contentList = new ArrayList<String>();
-        contentList.add(docType);
-      }
-      else if (n.getType().equals(CONFIG_PARAM_MAXLENGTH))
-      {
-        maxSize = n.getAttributeValue("value");
-      }
-
-    }
-
-    if (tokenList.size() == 0)
-    {
-      Logging.connectors.debug("DCTM: No ObjectType found in Document Spec. Setting it to dm_document");
-      tokenList.put("dm_document",new HashMap<String,Map<String,Set<String>>>());
-    }
-
-    if (strLocationsClause.length() < 1)
-    {
-      Logging.connectors.debug("DCTM: No location found in document specification. Search will be across entire docbase");
-    }
-
-    try
-    {
-      String strDQLstart = "select for READ distinct i_chronicle_id from ";
-      // There seems to be some unexplained slop in the latest DCTM version.  It misses documents depending on how close to the r_modify_date you happen to be.
-      // So, I've decreased the start time by a full five minutes, to insure overlap.
-      if (startTime > 300000L)
-        startTime = startTime - 300000L;
-      else
-        startTime = 0L;
-      StringBuilder strDQLend = new StringBuilder(" where r_modify_date >= " + buildDateString(startTime) +
-        " and r_modify_date<=" + buildDateString(seedTime) +
-        " AND (i_is_deleted=TRUE Or (i_is_deleted=FALSE AND a_full_text=TRUE AND r_content_size>0");
-
-      // append maxsize if set
-      if (maxSize != null && maxSize.length() > 0)
-      {
-        strDQLend.append(" AND r_content_size<=").append(maxSize);
-      }
-
-      String[] dctmTypes = convertToDCTMTypes(contentList);
-      if (dctmTypes != null)
-      {
-        if (dctmTypes.length == 0)
-          strDQLend.append(" AND 1<0");
-        else
-        {
-          strDQLend.append(" AND a_content_type IN (");
-          boolean commaNeeded = false;
-          for (String cType : dctmTypes)
-          {
-            if (commaNeeded)
-              strDQLend.append(",");
-            else
-              commaNeeded = true;
-            strDQLend.append(quoteDQLString(cType));
-          }
-          strDQLend.append(")");
-        }
-      }
-
-      // End the clause for non-deleted documents
-      strDQLend.append("))");
-
-      // append location on if it is provided.  This will apply to both deleted and non-deleted documents.
-      if (strLocationsClause.length() > 0)
-      {
-        strDQLend.append(" AND ( " + strLocationsClause.toString() + " )");
-      }
-
-      // Now, loop through the documents and queue them up.
-      for (String tokenValue : tokenList.keySet())
-      {
-        activities.checkJobStillActive();
-        
-        // Construct the filter part of the DQL query
-        Map<String,Map<String,Set<String>>> filters = tokenList.get(tokenValue);
-        
-        StringBuilder filterPart = new StringBuilder();
-        // For each attribute, go through the operations and emit an AND clause
-        for (String attributeName : filters.keySet())
-        {
-          Map<String,Set<String>> operations = filters.get(attributeName);
-          for (String operation : operations.keySet())
-          {
-            Set<String> values = operations.get(operation);
-            if (operation.equals("="))
-            {
-              filterPart.append(" AND \"").append(attributeName).append("\"").append(" IN (");
-              boolean commaNeeded = false;
-              for (String value : values)
-              {
-                if (commaNeeded)
-                  filterPart.append(",");
-                else
-                  commaNeeded = true;
-                filterPart.append(quoteDQLString(value));
-              }
-              filterPart.append(")");
-            }
-            else if (operation.equals("<>"))
-            {
-              filterPart.append(" AND (");
-              boolean andNeeded = false;
-              for (String value : values)
-              {
-                if (andNeeded)
-                  filterPart.append(" AND ");
-                else
-                  andNeeded = true;
-                filterPart.append("\"").append(attributeName).append("\"").append("<>").append(quoteDQLString(value));
-              }
-              filterPart.append(")");
-            }
-            else
-              throw new ManifoldCFException("Unrecognized operation: "+operation);
-          }
-        }
-        
-        String strDQL = strDQLstart + tokenValue + strDQLend + filterPart;
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("DCTM: About to execute query= (" + strDQL + ")");
-        while (true)
-        {
-          boolean noSession = (session==null);
-          getSession();
-          try
-          {
-            StringQueue stringQueue = new StringQueue();
-            GetDocumentsFromQueryThread t = new GetDocumentsFromQueryThread(strDQL,stringQueue);
-            t.start();
-            try
-            {
-              int checkIndex = 0;
-              // Loop through return values and add them until done is signalled
-              while (true)
-              {
-                if (checkIndex == 10)
-                {
-                  activities.checkJobStillActive();
-                  checkIndex = 0;
-                }
-                checkIndex++;
-                String next = stringQueue.getNext();
-                if (next == null)
-                  break;
-                activities.addSeedDocument(next);
-              }
-              t.finishUp();
-              // Go on to next document type and repeat
-              break;
-            }
-            catch (InterruptedException e)
-            {
-              t.abort();
-              // This is just a courtesy; the thread will be killed regardless on process exit
-              t.interrupt();
-              // It's ok to leave the thread still active; we'll be shutting down anyway.
-              throw e;
-            }
-            catch (ManifoldCFException e)
-            {
-              t.abort();
-              // We need the join, because we really don't want this documentum session to be
-              // still busy when we leave.
-              t.join();
-              throw e;
-            }
-            catch (ServiceInterruption e)
-            {
-              t.abort();
-              // We need the join, because we really don't want this documentum session to be
-              // still busy when we leave.
-              t.join();
-              throw e;
-            }
-          }
-          catch (InterruptedException e)
-          {
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RemoteException e)
-          {
-            Throwable e2 = e.getCause();
-            if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-              throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-            if (noSession)
-            {
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-            }
-            session = null;
-            lastSessionFetch = -1L;
-            // Go back around again
-          }
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-      // Base our treatment on the kind of error it is.
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        long currentTime = System.currentTimeMillis();
-        Logging.connectors.warn("DCTM: Remote service interruption getting versions: "+e.getMessage(),e);
-        throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L, currentTime + 12 * 60 * 60000L,-1,true);
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-    return new Long(seedTime).toString();
-  }
-
-  /** Do a query and read back the name column */
-  protected static String[] convertToDCTMTypes(List<String> contentList)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (contentList != null && contentList.size() > 0)
-    {
-      // The contentList has type names.
-      return contentList.toArray(new String[0]);
-    }
-    return null;
-
-  }
-
-  protected static String quoteDQLString(String value)
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("'");
-    for (int i = 0; i < value.length(); i++)
-    {
-      char x = value.charAt(i);
-      if (x == '\'')
-        sb.append("'");
-      sb.append(x);
-    }
-    sb.append("'");
-    return sb.toString();
-  }
-  
-  protected class ProcessDocumentThread extends Thread
-  {
-    // Initial data
-    protected final String documentIdentifier;
-    protected final SpecInfo sDesc;
-    
-    // State
-    protected volatile boolean versionPartDone = false;
-    protected volatile boolean threadExit = false;
-    protected volatile boolean startFetch = false;
-    protected volatile boolean abort = false;
-    
-    // Return info
-    protected File objFileTemp = null;
-    protected Throwable exception = null;
-    protected String versionString = null;
-    protected RepositoryDocument rval = null;
-    protected Long activityStartTime = null;
-    protected Long activityFileLength = null;
-    protected String activityStatus = null;
-    protected String activityMessage = null;
-    protected String uri = null;
-    protected String contentType = null;
-    protected Long contentSize = null;
-
-    public ProcessDocumentThread(String documentIdentifier, SpecInfo sDesc)
-    {
-      super();
-      setDaemon(true);
-      this.documentIdentifier = documentIdentifier;
-      this.objFileTemp = objFileTemp;
-      this.sDesc = sDesc;
-    }
-
-    public void run()
-    {
-      try
-      {
-
-        IDocumentumObject object = session.getObjectByQualification("dm_document where i_chronicle_id='" + documentIdentifier +
-          "' and any r_version_label='CURRENT'");
-        try
-        {
-          long contentSizeValue = object.getContentSize();
-          contentSize = new Long(contentSizeValue);
-          // Get the type name; this is what we use to figure out the desired attributes
-          String typeName = object.getTypeName();
-          
-          if (object.exists() && !object.isDeleted() && !object.isHidden() && object.getPermit() > 1 &&
-            contentSizeValue > 0 && object.getPageCount() > 0)
-          {
-            // According to Ryck, the version label is not helping us much, so if it's null it's ok
-            String versionLabel = object.getVersionLabel();
-
-            // The version string format was reorganized on 11/6/2006.
-
-            StringBuilder strVersionLabel = new StringBuilder();
-
-            strVersionLabel.append(sDesc.getMetadataVersionAddendum(typeName));
-
-            // Now do the forced acls.  Since this is a reorganization of the version string,
-            // I decided to make these parseable, and pass them through to processDocument() in that
-            // way, because most connectors seem to be heading in that direction.
-            strVersionLabel.append(sDesc.getForcedAclString());
-
-            // The version label passed back will be a concatenation of the implicit version label and the v_stamp
-            // This way we can catch any changes to the content
-            strVersionLabel.append(versionLabel);
-            strVersionLabel.append("_").append(object.getVStamp());
-
-            /* This was removed on 9/5/2006 because Rick indicated that i_vstamp is incremented on every change to a document,
-            including change of dynamic acl name.  This is in contrast to r_modifydate, which is NOT changed under such conditions.
-
-            if (acls != null && acls.length == 0)
-            {
-              // Get the acl for the document, and tack it on to the version if it's dynamic.  This compensates
-              // for the fact that changing a dynamic acl on an object doesn't mark it as modified!
-              String aclName = object.getACLName();
-              if (aclName != null && aclName.startsWith("dm_"))
-                strVersionLabel.append("=").append(aclName);
-            }
-            */
-
-            // Append the path name attribute version
-            strVersionLabel.append(sDesc.getPathNameAttributeAddendum());
-
-            // Append the Webtop base url.  This was added on 9/7/2007.
-            strVersionLabel.append("_").append(webtopBaseURL);
-
-            versionString = strVersionLabel.toString();
-          }
-          else
-            versionString = null;
-          
-          // Signal that we are done with the version string
-          synchronized (this)
-          {
-            versionPartDone = true;
-            notifyAll();
-            while (true)
-            {
-              if (startFetch || abort)
-                break;
-              wait();
-            }
-            if (abort)
-              return;
-          }
-
-          // Do fetch phase
-            
-          String objName = object.getObjectName();
-          String contentType = object.getContentType();
-            
-          // This particular way of getting content failed, because DFC loaded the
-          // whole object into memory (very very bad DFC!)
-          // InputStream is = objIDfSysObject.getContent();
-          //
-          // Instead, read the file to a disk temporary file, and then stream from there.
-          activityStartTime = new Long(System.currentTimeMillis());
-
-          String strFilePath = null;
-          try
-          {
-            strFilePath = object.getFile(objFileTemp.getCanonicalPath());
-          }
-          catch (DocumentumException dfe)
-          {
-            // Fetch failed, so log it
-            activityMessage = dfe.getMessage();
-            if (dfe.getType() == DocumentumException.TYPE_NOTALLOWED)
-            {
-              activityStatus = "NOTALLOWED";
-              return;
-            }
-            else if (dfe.getType() == DocumentumException.TYPE_CORRUPTEDDOCUMENT)
-            {
-              activityStatus = "CORRUPTEDDOCUMENT";
-              return;
-            }
-            throw dfe;
-          }
-          long fileLength = objFileTemp.length();
-          activityFileLength = new Long(fileLength);
-
-          if (strFilePath == null)
-          {
-            activityStatus = "CONTENTDIDNOTFETCH";
-            activityMessage = "Content could not be fetched";
-            // We don't know why it won't fetch, but skip it and keep going.
-            return;
-          }
-
-          activityStatus = "OK";
-
-          rval = new RepositoryDocument();
-
-          if (contentType != null)
-            rval.setMimeType(contentType);
-            
-          List<String> attributeDescriptions = sDesc.getMetadataFields(typeName);
-          if (attributeDescriptions != null)
-          {
-            for (String attrName : attributeDescriptions)
-            {
-              // Fetch the attributes from the object
-              String[] values = object.getAttributeValues(attrName);
-              // Add the attribute to the rd
-              rval.addField(attrName,values);
-            }
-          }
-
-          if (objName != null)
-            rval.setFileName(objName);
-          
-          // Add the path metadata item into the mix, if enabled
-          String pathAttributeName = sDesc.getPathAttributeName();
-          if (pathAttributeName != null && pathAttributeName.length() > 0)
-          {
-            String[] pathString = sDesc.getPathAttributeValue(object);
-            rval.addField(pathAttributeName,pathString);
-          }
-
-          // Handle the forced acls
-          String[] denyAcls = new String[]{denyToken};
-          String[] acls = sDesc.getAcls();
-          if (acls != null && acls.length == 0)
-          {
-            String[] strarrACL = new String[1];
-            // This used to go back-and-forth to documentum to get the docbase name, but that seemed stupid, so i just
-            // use the one I have already now.
-            strarrACL[0] = docbaseName + ":" + object.getACLDomain() + "." + object.getACLName();
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("DCTM: Processing document (" + objName + ") with ACL=" + strarrACL[0] + " and size=" + object.getContentSize() + " bytes.");
-            rval.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,strarrACL);
-            rval.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,denyAcls);
-          }
-          else if (acls != null)
-          {
-            rval.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acls);
-            rval.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,denyAcls);
-
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("DCTM: Processing document (" + objName + ") with size=" + object.getContentSize() + " bytes.");
-          }
-
-          uri = convertToURI(object.getObjectId(),contentType);
-        }
-        finally
-        {
-          object.release();
-        }
-
-      }
-      catch (DocumentumException dfe)
-      {
-        // Fetch by qualification failed
-        activityMessage = dfe.getMessage();
-        if (dfe.getType() == DocumentumException.TYPE_NOTALLOWED)
-        {
-          activityStatus = "NOTALLOWED";
-          return;
-        }
-        else if (dfe.getType() == DocumentumException.TYPE_CORRUPTEDDOCUMENT)
-        {
-          activityStatus = "CORRUPTEDDOCUMENT";
-          return;
-        }
-        this.exception = dfe;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-      finally
-      {
-        synchronized(this)
-        {
-          threadExit = true;
-          notifyAll();
-        }
-      }
-    }
-
-    public String getVersionString()
-      throws RemoteException, DocumentumException, InterruptedException
-    {
-      // First, wait for version to be ready
-      synchronized (this)
-      {
-        while (true)
-        {
-          wait();
-          if (threadExit || versionPartDone)
-            break;
-        }
-      }
-      if (exception != null)
-      {
-        if (exception instanceof RemoteException)
-          throw (RemoteException)exception;
-        else if (exception instanceof DocumentumException)
-          throw (DocumentumException)exception;
-        else if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-        else if (exception instanceof Error)
-          throw (Error)exception;
-        else
-          throw new RuntimeException("Unexpected exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-      }
-      // Return the version
-      return versionString;
-    }
-    
-    public void startFetch(File objFileTemp)
-    {
-      // Begin the fetch part
-      synchronized (this)
-      {
-        this.objFileTemp = objFileTemp;
-        startFetch = true;
-        notifyAll();
-      }
-    }
-    
-    public void finishWithoutFetch()
-      throws InterruptedException
-    {
-      // Abort the fetch phase, and shut the thread down
-      synchronized (this)
-      {
-        abort = true;
-        notifyAll();
-      }
-      join();
-    }
-
-    public RepositoryDocument finishUp()
-      throws RemoteException, DocumentumException, InterruptedException, ManifoldCFException
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof RemoteException)
-          throw (RemoteException)exception;
-        else if (exception instanceof DocumentumException)
-          throw (DocumentumException)exception;
-        else if (exception instanceof ManifoldCFException)
-          throw (ManifoldCFException)exception;
-        else if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-        else if (exception instanceof Error)
-          throw (Error)exception;
-        else
-          throw new RuntimeException("Unexpected exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-      }
-      return rval;
-    }
-    
-    public Long getContentSize()
-    {
-      return contentSize;
-    }
-    
-    public String getContentType()
-    {
-      return contentType;
-    }
-    
-    public Long getActivityStartTime()
-    {
-      return activityStartTime;
-    }
-
-    public Long getActivityFileLength()
-    {
-      return activityFileLength;
-    }
-
-    public String getActivityStatus()
-    {
-      return activityStatus;
-    }
-
-    public String getActivityMessage()
-    {
-      return activityMessage;
-    }
-
-    public String getURI()
-    {
-      return uri;
-    }
-
-
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime;
-    // Do any preliminary work
-    // Build the node/path cache
-    SpecInfo sDesc = new SpecInfo(spec);
-    
-    try
-    {
-      // Now we are ready to go through the document identifiers
-      for (String documentIdentifier : documentIdentifiers)
-      {
-        // It is better, performance-wise, to fetch a document object just once.  Under RMI,
-        // though, we will need to do this in a background thread, since it's socket-based and can therefore
-        // be broken by network disruption.  On the other hand, decisions about how to proceed can
-        // only be undertaken in the local ManifoldCF worker thread.
-        // In order to deal with these constraints, the background thread needs to have multiple "stages".
-        // Each stage executes to completion and then blocks, while the MCF worker thread looks at the
-        // results, and then informs the background thread to proceed (or to abort, if no further work
-        // is desired).
-        
-        // Since each documentum access is time-consuming, be sure that we abort if the job has gone inactive
-        activities.checkJobStillActive();
-
-        while (true)
-        {
-          boolean noSession = (session==null);
-          getSession();
-          
-          String errorCode = null;
-          String errorDesc = null;
-          Long fileLengthLong = null;
-          Long startTime = null;
-          
-          try
-          {
-
-            ProcessDocumentThread t = new ProcessDocumentThread(documentIdentifier, sDesc);
-            // Start the thread
-            t.start();
-            try
-            {
-              // Wait for version string
-              String versionString = t.getVersionString();
-
-              if (Logging.connectors.isDebugEnabled())
-              {
-                if (versionString != null)
-                {
-                  Logging.connectors.debug("DCTM: Document " + documentIdentifier+" has version label: " + versionString);
-                }
-                else
-                {
-                  Logging.connectors.debug("DCTM: Document " + documentIdentifier+" has been removed or is hidden");
-                }
-              }
-              
-              if (versionString == null)
-              {
-                t.finishWithoutFetch();
-                activities.deleteDocument(documentIdentifier);
-                break;
-              }
-              
-              // Start the fetch part
-              try
-              {
-                // Create a temporary file for every attempt, because we don't know yet whether we'll need it or not -
-                // but probably we will.
-                File objFileTemp = File.createTempFile("_mc_dctm_", null);
-                try
-                {
-                  t.startFetch(objFileTemp);
-                  RepositoryDocument rd = t.finishUp();
-                  
-                  if (rd == null)
-                  {
-                    errorCode = t.getActivityStatus();
-                    errorDesc = t.getActivityMessage();
-                    activities.noDocument(documentIdentifier,versionString);
-                    break;
-                  }
-                    
-                  long fileLength = t.getContentSize().longValue();
-                  if (!activities.checkLengthIndexable(fileLength))
-                  {
-                    errorCode = activities.EXCLUDED_LENGTH;
-                    errorDesc = "Excluded due to content length ("+fileLength+")";
-                    activities.noDocument(documentIdentifier,versionString);
-                    break;
-                  }
-                  
-                  String contentType = t.getContentType();
-                  if (!activities.checkMimeTypeIndexable(contentType))
-                  {
-                    errorCode = activities.EXCLUDED_MIMETYPE;
-                    errorDesc = "Excluded due to mime type ("+contentType+")";
-                    activities.noDocument(documentIdentifier,versionString);
-                    break;
-                  }
-
-                  // Stream the data to the ingestion system
-                  InputStream is = new FileInputStream(objFileTemp);
-                  try
-                  {
-                    rd.setBinary(is, fileLength);
-                    // Do the ingestion
-                    activities.ingestDocumentWithException(documentIdentifier,versionString,
-                      t.getURI(), rd);
-                    errorCode = t.getActivityStatus();
-                    errorDesc = t.getActivityMessage();
-                    fileLengthLong = t.getActivityFileLength();
-                    startTime = t.getActivityStartTime();
-                    break;
-                  }
-                  finally
-                  {
-                    is.close();
-                  }
-                }
-                finally
-                {
-                  objFileTemp.delete();
-                }
-              }
-              catch (java.io.IOException e)
-              {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(e);
-              }
-
-              // Leave the retry loop; go on to the next document
-              break;
-            }
-            catch (InterruptedException e)
-            {
-              t.interrupt();
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (RemoteException e)
-            {
-              Throwable e2 = e.getCause();
-              if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-                throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-              if (noSession)
-              {
-                currentTime = System.currentTimeMillis();
-                throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-              }
-              session = null;
-              lastSessionFetch = -1L;
-              // Go back around again
-            }
-            
-          }
-          catch (DocumentumException e)
-          {
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            throw e;
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              errorCode = null;
-            throw e;
-          }
-          finally
-          {
-            if (errorCode != null)
-              activities.recordActivity(startTime,ACTIVITY_FETCH,
-                fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-          }
-                
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-      // Base our treatment on the kind of error it is.
-      currentTime = System.currentTimeMillis();
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        Logging.connectors.warn("DCTM: Remote service interruption processing documents: "+e.getMessage(),e);
-        throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L,currentTime + 12 * 60 * 60000L,-1,true);
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  protected static void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-      throw new ManifoldCFException(e.getMessage(),e);
-    else if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-  
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // 1 at a time, since this connector does not deal with documents en masse, but one at a time.
-    return 1;
-  }
-
-    // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"DCTM.Docbase"));
-    tabsArray.add(Messages.getString(locale,"DCTM.Webtop"));
-    
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.docbasename.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"DCTM.PleaseSupplyTheNameofaDocbase")+"\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Docbase") + "\");\n"+
-"    editconnection.docbasename.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.docbaseusername.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.ConnectionRequiresValidDocumentumUsername")+"\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Docbase") + "\");\n"+
-"    editconnection.docbaseusername.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.docbasepassword.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.ConnectionRequiresPassword")+"\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Docbase") + "\");\n"+
-"    editconnection.docbasepassword.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webtopbaseurl.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.SpecifyBaseWebtopURL")+"\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"DCTM.Webtop") + "\");\n"+
-"    editconnection.webtopbaseurl.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String docbaseName = parameters.getParameter(CONFIG_PARAM_DOCBASE);
-    if (docbaseName == null)
-      docbaseName = "";
-    String docbaseUserName = parameters.getParameter(CONFIG_PARAM_USERNAME);
-    if (docbaseUserName == null)
-      docbaseUserName = "";
-    String docbasePassword = parameters.getObfuscatedParameter(CONFIG_PARAM_PASSWORD);
-    if (docbasePassword == null)
-      docbasePassword = "";
-    else
-      docbasePassword = out.mapPasswordToKey(docbasePassword);
-    String docbaseDomain = parameters.getParameter(CONFIG_PARAM_DOMAIN);
-    if (docbaseDomain == null)
-      docbaseDomain = "";
-    String webtopBaseUrl = parameters.getParameter(CONFIG_PARAM_WEBTOPBASEURL);
-    if (webtopBaseUrl == null)
-      webtopBaseUrl = "http://localhost/webtop/";
-
-    // "Docbase" tab
-    if (tabName.equals(Messages.getString(locale,"DCTM.Docbase")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbaseName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"docbasename\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbaseUserName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"docbaseusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseUserName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbasePassword") + "</nobr></td><td class=\"value\"><input type=\"password\" size=\"32\" name=\"docbasepassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbasePassword)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocbaseDomain") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"docbasedomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseDomain)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Docbase tab
-      out.print(
-"<input type=\"hidden\" name=\"docbasename\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"docbaseusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseUserName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"docbasepassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbasePassword)+"\"/>\n"+
-"<input type=\"hidden\" name=\"docbasedomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(docbaseDomain)+"\"/>\n"
-      );
-    }
-
-    // Webtop tab
-    if (tabName.equals(Messages.getString(locale,"DCTM.Webtop")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.WebtopBaseURL") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"webtopbaseurl\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webtopBaseUrl)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Webtop tab
-      out.print(
-"<input type=\"hidden\" name=\"webtopbaseurl\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webtopBaseUrl)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String docbaseName = variableContext.getParameter("docbasename");
-    if (docbaseName != null)
-      parameters.setParameter(CONFIG_PARAM_DOCBASE,docbaseName);
-
-    String docbaseUserName = variableContext.getParameter("docbaseusername");
-    if (docbaseUserName != null)
-      parameters.setParameter(CONFIG_PARAM_USERNAME,docbaseUserName);
-
-    String docbasePassword = variableContext.getParameter("docbasepassword");
-    if (docbasePassword != null)
-      parameters.setObfuscatedParameter(CONFIG_PARAM_PASSWORD,variableContext.mapKeyToPassword(docbasePassword));
-
-    String docbaseDomain = variableContext.getParameter("docbasedomain");
-    if (docbaseDomain != null)
-      parameters.setParameter(CONFIG_PARAM_DOMAIN,docbaseDomain);
-
-    String webtopBaseUrl = variableContext.getParameter("webtopbaseurl");
-    if (webtopBaseUrl != null)
-      parameters.setParameter(CONFIG_PARAM_WEBTOPBASEURL,webtopBaseUrl);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"DCTM.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" certificate(s)&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    tabsArray.add(Messages.getString(locale,"DCTM.Paths"));
-    tabsArray.add(Messages.getString(locale,"DCTM.DocumentTypes"));
-    tabsArray.add(Messages.getString(locale,"DCTM.ContentTypes"));
-    tabsArray.add(Messages.getString(locale,"DCTM.ContentLength"));
-    tabsArray.add(Messages.getString(locale,"DCTM.Security"));
-    tabsArray.add(Messages.getString(locale,"DCTM.PathMetadata"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"checkSpecification()\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specmaxdoclength.value != \"\" && !isInteger(editjob."+seqPrefix+"specmaxdoclength.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.MaximumDocumentLengthMustBeNullOrAnInteger") + "\");\n"+
-"    editjob."+seqPrefix+"specmaxdoclength.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"DeleteFilter(k,l)\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"filter_\"+k+\"_\"+l+\"_op\",\"Delete\",\""+seqPrefix+"filter_\"+k+\"_\"+l);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"AddFilter(k,l)\n"+
-"{\n"+
-"  if (eval(\"editjob."+seqPrefix+"filter_\"+k+\"_name.value == \\\"\\\"\"))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.SelectAnAttributeFirst") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"filter_\"+k+\"_name.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  if (eval(\"editjob."+seqPrefix+"filter_\"+k+\"_operation.value == \\\"\\\"\"))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.SelectAnOperation") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"filter_\"+k+\"_operation.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  if (eval(\"editjob."+seqPrefix+"filter_\"+k+\"_value.value == \\\"\\\"\"))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.FilterMustHaveValue") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"filter_\"+k+\"_value.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"filter_\"+k+\"_op\",\"Add\",\""+seqPrefix+"filter_\"+k+\"_\"+l);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToPath(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"pathaddon.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.SelectAFolderFirst") + "\");\n"+
-"    editjob."+seqPrefix+"pathaddon.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"AddToPath\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.NullTokensNotAllowed") + "\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  "+seqPrefix+"SpecOp(\"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddMapping(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specmatch.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.EnterASpecificationFirst") + "\");\n"+
-"    editjob."+seqPrefix+"specmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editjob."+seqPrefix+"specmatch.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"DCTM.SpecificationMustBeValidRegularExpression") + "\");\n"+
-"    editjob."+seqPrefix+"specmatch.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specmappingop\",\"Add\",anchorvalue);\n"+
-"  }\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int k;
-
-    // Paths tab
-    if (tabName.equals(Messages.getString(locale,"DCTM.Paths")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Now, loop through paths
-      k = 0;
-      for (int i = 0; i < ds.getChildCount(); i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(CONFIG_PARAM_LOCATION))
-        {
-          String pathDescription = "_" + Integer.toString(k);
-          String pathName = seqPrefix + "specpath" + pathDescription;
-          String pathOpName = seqPrefix + "pathop" + pathDescription;
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+pathName+"\" value=\""+sn.getAttributeValue("path")+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+pathOpName+"\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Delete\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")' alt=\"" + Messages.getAttributeString(locale,"DCTM.DeletePath")+Integer.toString(k)+"\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue("path"))+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"DCTM.NoSpecificCabinetFolderPathsGiven") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-
-      out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-	
-      String pathSoFar = (String)currentContext.get(seqPrefix+"specpath");
-      if (pathSoFar == null)
-        pathSoFar = "/";
-
-      // Grab next folder/project list
-      try
-      {
-        String[] childList = getChildFolderNames(pathSoFar);
-        if (childList == null)
-        {
-          // Illegal path - set it back
-          pathSoFar = "/";
-          childList = getChildFolderNames(pathSoFar);
-          if (childList == null)
-            throw new ManifoldCFException("Can't find any children for root folder");
-        }
-        
-        out.print(
-"      <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"hidden\" name=\""+seqPrefix+"specpath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathSoFar)+"\"/>\n"+
-"        <input type=\"hidden\" name=\""+seqPrefix+"pathop\" value=\"\"/>\n"+
-"        <input type=\"button\" value=\"Add\" alt=\"" + Messages.getAttributeString(locale,"DCTM.AddPath") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"Add\",\""+seqPrefix+"path_"+Integer.toString(k+1)+"\")'/>&nbsp;\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathSoFar)+"\n"
-        );
-        if (pathSoFar.length() > 1)
-        {
-          out.print(
-"      <input type=\"button\" value=\"-\" alt=\"" + Messages.getAttributeString(locale,"DCTM.RemoveFromPath") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"Up\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>\n"
-          );
-        }
-        if (childList.length > 0)
-        {
-          out.print(
-"      <input type=\"button\" value=\"+\" alt=\"" + Messages.getAttributeString(locale,"DCTM.AddToPath") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToPath(\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>&nbsp;\n"+
-"      <select multiple=\"false\" name=\""+seqPrefix+"pathaddon\" size=\"2\">\n"+
-"        <option value=\"\" selected=\"selected\">" + Messages.getBodyString(locale,"DCTM.PickAFolder") + "</option>\n"
-          );
-          int j = 0;
-          while (j < childList.length)
-          {
-            out.print(
-"        <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(childList[j])+"\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(childList[j])+"</option>\n"
-            );
-            j++;
-          }
-
-          out.print(
-"      </select>\n"
-          );
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        out.println(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage()));
-      }
-      catch (ServiceInterruption e)
-      {
-        out.println("Service interruption or invalid credentials - check your repository connection: "+e.getMessage());
-      }
-      
-      out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Now, loop through paths
-      k = 0;
-      for (int i =0; i < ds.getChildCount(); i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(CONFIG_PARAM_LOCATION))
-        {
-          String pathDescription = "_" + Integer.toString(k);
-          String pathName = seqPrefix + "specpath" + pathDescription;
-          out.print(
-"<input type=\"hidden\" name=\""+pathName+"\" value=\""+sn.getAttributeValue("path")+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-
-    // Security tab
-    // Find whether security is on or off
-    boolean securityOn = true;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"DCTM.Security")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.Security2") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"1\">\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"on\" "+((securityOn)?"checked=\"true\"":"")+" />Enabled&nbsp;\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"off\" "+((securityOn==false)?"checked=\"true\"":"")+" />Disabled\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Finally, go through forced ACL
-      k = 0;
-      for (int i = 0; i < ds.getChildCount(); i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String accessOpName = seqPrefix+"accessop"+accessDescription;
-          String accessTokenName = seqPrefix+"spectoken"+accessDescription;
-          String token = sn.getAttributeValue("token");
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\""+accessTokenName+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"DCTM.DeleteAccessToken")+Integer.toString(k)+"\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")'/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"DCTM.NoAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Add\" alt=\"" + Messages.getAttributeString(locale,"DCTM.AddAccessToken") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")'/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specsecurity\" value=\""+(securityOn?"on":"off")+"\"/>\n"
-      );
-      // Finally, go through forced ACL
-      k = 0;
-      for (int i = 0; i < ds.getChildCount(); i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String token = sn.getAttributeValue("token");
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-
-    // Document Types tab
-
-    // First, build a hash map containing all the currently selected document types
-    Map<String,Object> dtMetadata = new HashMap<String,Object>();
-    Map<String,Map<String,Map<String,Set<String>>>> dtFilters = new HashMap<String,Map<String,Map<String,Set<String>>>>();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_OBJECTTYPE))
-      {
-        String token = sn.getAttributeValue("token");
-        if (token != null && token.length() > 0)
-        {
-          String isAllString = sn.getAttributeValue("all");
-          if (isAllString != null && isAllString.equals("true"))
-            dtMetadata.put(token,new Boolean(true));
-          else
-          {
-            Set<String> attrMap = new HashSet<String>();
-            // Go through the children and look for attribute records
-            for (int kk = 0; kk < sn.getChildCount(); kk++)
-            {
-              SpecificationNode dsn = sn.getChild(kk);
-              if (dsn.getType().equals(CONFIG_PARAM_ATTRIBUTENAME))
-              {
-                String attr = dsn.getAttributeValue("attrname");
-                attrMap.add(attr);
-              }
-            }
-            dtMetadata.put(token,attrMap);
-          }
-          Map<String,Map<String,Set<String>>> filterInfo = new HashMap<String,Map<String,Set<String>>>();
-          for (int kk = 0; kk < sn.getChildCount(); kk++)
-          {
-            SpecificationNode dsn = sn.getChild(kk);
-            if (dsn.getType().equals(CONFIG_PARAM_FILTER))
-            {
-              String name = dsn.getAttributeValue("name");
-              String op = dsn.getAttributeValue("op");
-              String value = dsn.getAttributeValue("value");
-              Map<String,Set<String>> filters = filterInfo.get(name);
-              if (filters == null)
-              {
-                filters = new HashMap<String,Set<String>>();
-                filterInfo.put(name,filters);
-              }
-              Set<String> filterValues = filters.get(op);
-              if (filterValues == null)
-              {
-                filterValues = new HashSet<String>();
-                filters.put(op,filterValues);
-              }
-              filterValues.add(value);
-            }
-          }
-          dtFilters.put(token,filterInfo);
-        }
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"DCTM.DocumentTypes")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      
-      // Need to catch potential license exception here
-      try
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"boxcell\" colspan=\"2\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"filter_op\" value=\"Continue\"/>\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocumentType") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Filters") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.AllMetadataQ") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.SpecificMetadata") + "</nobr></td>\n"+
-"        </tr>\n"
-        );
-
-        k = 0;
-        String[] strarrObjTypes = getObjectTypes();
-        for (String strObjectType : strarrObjTypes)
-        {
-          if (strObjectType != null && strObjectType.length() > 0)
-	  {
-            // Get the attributes for this data type
-            String[] values = getIngestableAttributes(strObjectType);
-
-            out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"datatype_"+k+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strObjectType)+"\"/>\n"
-            );
-
-            Object o = dtMetadata.get(strObjectType);
-            if (o == null)
-            {
-              out.print(
-"            <input type=\"checkbox\" name=\""+seqPrefix+"specfiletype\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strObjectType)+"\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(strObjectType)+"</input>\n"
-              );
-            }
-            else
-            {
-              out.print(
-"            <input type=\"checkbox\" name=\""+seqPrefix+"specfiletype\" checked=\"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strObjectType)+"\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(strObjectType)+"</input>\n"
-              );
-
-            }
-            out.print(
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_op\" value=\"Continue\"/>\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.AttributeName") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Operation") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Value") + "</nobr></td>\n"+
-"              </tr>\n"
-            );
-            
-            // Now, do filters.  This will be a table-with-a-table, with an "Add" button at the bottom.
-            Map<String,Map<String,Set<String>>> currentFilters = dtFilters.get(strObjectType);
-            int l = 0;
-            if (currentFilters != null)
-            {
-              String[] filterAttributes = currentFilters.keySet().toArray(new String[0]);
-              java.util.Arrays.sort(filterAttributes);
-              for (String filterAttribute : filterAttributes)
-              {
-                Map<String,Set<String>> filters = currentFilters.get(filterAttribute);
-                String[] sortedOperations = filters.keySet().toArray(new String[0]);
-                java.util.Arrays.sort(sortedOperations);
-                for (String filterOperation : sortedOperations)
-                {
-                  Set<String> filterValues = filters.get(filterOperation);
-                  String[] sortedValues = filterValues.toArray(new String[0]);
-                  java.util.Arrays.sort(sortedValues);
-                  for (String filterValue : sortedValues)
-                  {
-                    out.print(
-"              <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_op\" value=\"Continue\"/>\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_name\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filterAttribute)+"\"/>\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_operation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filterOperation)+"\"/>\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_value\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filterValue)+"\"/>\n"+
-"                  <a name=\""+seqPrefix+"filter_"+k+"_"+l+"\">\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"DCTM.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"DCTM.DeleteFilter")+"\" onclick='javascript:"+seqPrefix+"DeleteFilter("+k+","+l+");'/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filterAttribute)+"\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filterOperation)+"\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filterValue)+"\n"+
-"                </td>\n"+
-"              </tr>\n"
-                    );
-                    l++;
-                  }
-                }
-              }
-            }
-            
-            if (l == 0)
-            {
-              out.print(
-"              <tr class=\"formrow\"><td colspan=\"4\" class=\"formcolumnmessage\"><nobr>" + Messages.getBodyString(locale,"DCTM.NoAttributeFiltersSpecified") + "</nobr></td></tr>\n"
-              );
-            }
-            out.print(
-"              <tr class=\"formrow\"><td colspan=\"4\" class=\"formseparator\"><hr/></td></tr>\n"+
-"              <tr class=\"formrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <a name=\""+seqPrefix+"filter_"+k+"_"+l+"\">\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"DCTM.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"DCTM.AddFilter") + "\" onclick='javascript:"+seqPrefix+"AddFilter("+k+","+l+");'/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_count\" value=\""+l+"\"/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <select multiple=\"false\" name=\""+seqPrefix+"filter_"+k+"_name\" size=\"3\">\n"+
-"                    <option value=\"\" selected=\"selected\">" + Messages.getBodyString(locale,"DCTM.PickAnAttribute") + "</option>\n"
-            );
-
-            for (String attributeName : values)
-            {
-              out.print(
-"                    <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(attributeName)+"\">" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(attributeName) + "</option>\n"
-              );
-            }
-
-            out.print(
-"                  </select>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <select multiple=\"false\" name=\""+seqPrefix+"filter_"+k+"_operation\" size=\"3\">\n"+
-"                    <option value=\"\" selected=\"selected\">" + Messages.getBodyString(locale,"DCTM.PickAnOperation") + "</option>\n"+
-"                    <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape("=")+"\">" + Messages.getBodyString(locale,"DCTM.Equals") + "</option>\n"+
-"                    <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape("<>")+"\">" + Messages.getBodyString(locale,"DCTM.NotEquals") + "</option>\n"+
-"                  </select>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\"><input type=\"text\" name=\""+seqPrefix+"filter_"+k+"_value\" size=\"30\" value=\"\"/></td>\n"+
-"              </tr>\n"+
-"            </table>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"
-            );
-            
-            boolean isAll = false;
-            Set<String> attrMap = null;
-            if (o instanceof Boolean)
-            {
-              isAll = ((Boolean)o).booleanValue();
-              attrMap = new HashSet<String>();
-            }
-            else
-            {
-              isAll = false;
-              attrMap = (Set<String>)o;
-            }
-            out.print(
-"            <input type=\"checkbox\" name=\""+seqPrefix+"specfileallattrs_"+k+"\" value=\"true\" "+(isAll?"checked=\"\"":"")+"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <select multiple=\"true\" name=\""+seqPrefix+"specfileattrs_"+k+"\" size=\"3\">\n"
-            );
-            for (String option : values)
-            {
-              if (attrMap != null && attrMap.contains(option))
-              {
-                // Selected
-                out.print(
-"              <option selected=\"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(option)+"\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(option)+"</option>\n"
-                );
-              }
-              else
-              {
-                // Unselected
-                out.print(
-"              <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(option)+"\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(option)+"</option>\n"
-                );
-              }
-            }
-            out.print(
-"            </select>\n"+
-"          </td>\n"
-            );
-            out.print(
-"        </tr>\n"
-            );
-            k++;
-      	  }
-	}
-        out.print(
-"      </table>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"datatype_count\" value=\""+k+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-      catch (ManifoldCFException e)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-      catch (ServiceInterruption e)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">\n"+
-"		" + Messages.getBodyString(locale,"DCTM.ServiceInterruptionOrInvalidCredentials")+
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"</table>\n"
-      );
-    }
-    else
-    {
-      k = 0;
-      for (String strObjectType : dtMetadata.keySet())
-      {
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"datatype_"+k+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strObjectType)+"\"/>\n"
-        );
-        Map<String,Map<String,Set<String>>> currentFilters = dtFilters.get(strObjectType);
-        int l = 0;
-        for (String filterAttribute : currentFilters.keySet())
-        {
-          Map<String,Set<String>> filters = currentFilters.get(filterAttribute);
-          for (String filterOperation : filters.keySet())
-          {
-            Set<String> filterValues = filters.get(filterOperation);
-            for (String filterValue : filterValues)
-            {
-              out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_name\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filterAttribute)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_operation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filterOperation)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_"+l+"_value\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filterValue)+"\"/>\n"
-              );
-              l++;
-            }
-          }
-        }
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"filter_"+k+"_count\" value=\""+l+"\"/>\n"
-        );
-
-        Object o = dtMetadata.get(strObjectType);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfiletype\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strObjectType)+"\"/>\n"
-        );
-        if (o instanceof Boolean)
-        {
-          Boolean b = (Boolean)o;
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfileallattrs_"+k+"\" value=\""+(b.booleanValue()?"true":"false")+"\"/>\n"
-          );
-        }
-        else
-        {
-          Set<String> map = (Set<String>)o;
-          for (String attrName : map)
-          {
-            out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfileattrs_"+k+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(attrName)+"\"/>\n"
-            );
-          }
-        }
-        k++;
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"datatype_count\" value=\""+k+"\"/>\n"
-      );
-
-    }
-
-    // Content types tab
-
-    // First, build a hash map containing all the currently selected document types
-    Set<String> ctMap = null;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_FORMAT))
-      {
-        String token = sn.getAttributeValue("value");
-        if (token != null && token.length() > 0)
-        {
-          if (ctMap == null)
-            ctMap = new HashSet<String>();
-          ctMap.add(token);
-        }
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"DCTM.ContentTypes")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Need to catch potential license exception here
-      try
-      {
-        String[] strarrMimeTypes = getContentTypes();
-        for (String strMimeType : strarrMimeTypes)
-        {
-          if (strMimeType != null && strMimeType.length() > 0)
-	  {
-            out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"
-            );
-            if (ctMap == null || ctMap.contains(strMimeType))
-            {
-              out.print(
-"      <input type=\"checkbox\" name=\""+seqPrefix+"specmimetype\" checked=\"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strMimeType)+"\"></input>\n"
-              );
-            }
-            else
-            {
-              out.print(
-"      <input type=\"checkbox\" name=\""+seqPrefix+"specmimetype\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strMimeType)+"\"></input>\n"
-              );
-            }
-            out.print(
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(strMimeType)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-            );
-      	  }
-	}
-      }
-      catch (ManifoldCFException e)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-      catch (ServiceInterruption e)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">\n"+
-"		" + Messages.getBodyString(locale,"DCTM.ServiceInterruptionOrInvalidCredentials") +
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"</table>\n"
-      );
-    }
-    else
-    {
-      if (ctMap != null)
-      {
-        for (String strMimeType : ctMap)
-        {
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmimetype\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(strMimeType)+"\"/>\n"
-          );
-        }
-      }
-    }
-
-
-    // The Content Length tab
-
-    // Search for max document size
-    String maxDocLength = "";
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_MAXLENGTH))
-      {
-        maxDocLength = sn.getAttributeValue("value");
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"DCTM.ContentLength")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"separator\" colspan=\"2\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.ContentLength") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\""+seqPrefix+"specmaxdoclength\" type=\"text\" size=\"10\" value=\""+maxDocLength+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmaxdoclength\" value=\""+maxDocLength+"\"/>\n"
-      );
-    }
-
-
-    // Path metadata tab
-
-    // Find the path-value metadata attribute name
-    String pathNameAttribute = "";
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_PATHNAMEATTRIBUTE))
-      {
-        pathNameAttribute = sn.getAttributeValue("value");
-      }
-    }
-
-    // Find the path-value mapping data
-    org.apache.manifoldcf.crawler.connectors.DCTM.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.DCTM.MatchMap();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_PATHMAP))
-      {
-        String pathMatch = sn.getAttributeValue("match");
-        String pathReplace = sn.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"DCTM.PathMetadata")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingcount\" value=\""+Integer.toString(matchMap.getMatchCount())+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingop\" value=\"\"/>\n"+
-"\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"DCTM.PathAttributeName") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"+
-"      <input type=\"text\" name=\""+seqPrefix+"specpathnameattribute\" size=\"20\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathNameAttribute)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"
-      );
-      for (int i = 0; i < matchMap.getMatchCount(); i++)
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><input type=\"hidden\" name=\""+seqPrefix+"specmappingop_"+Integer.toString(i)+"\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"mapping_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specmappingop_"+Integer.toString(i)+"\",\"" + Messages.getAttributeJavascriptString(locale,"DCTM.Delete") + "\",\""+seqPrefix+"mapping_"+Integer.toString(i)+"\")' alt=\"" + Messages.getAttributeString(locale,"DCTM.DeleteMapping") + Integer.toString(i)+"\" value=\"Delete\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</td>\n"+
-"  </tr>\n"
-        );
-      }
-      if (matchMap.getMatchCount() == 0)
-      {
-        out.print(
-"  <tr><td colspan=\"4\" class=\"message\">" + Messages.getBodyString(locale,"DCTM.NoMappingsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <a name=\""+seqPrefix+"mapping_"+Integer.toString(matchMap.getMatchCount())+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecAddMapping(\""+seqPrefix+"mapping_"+Integer.toString(matchMap.getMatchCount()+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"DCTM.AddToMappings") + "\" value=\"" + Messages.getAttributeString(locale,"DCTM.Add") + "\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"DCTM.MatchRegexp") + "&nbsp;<input type=\"text\" name=\""+seqPrefix+"specmatch\" size=\"32\" value=\"\"/></td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"DCTM.ReplaceString") + "&nbsp;<input type=\"text\" name=\""+seqPrefix+"specreplace\" size=\"32\" value=\"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingcount\" value=\""+Integer.toString(matchMap.getMatchCount())+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specpathnameattribute\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathNameAttribute)+"\"/>\n"
-      );
-      for (int i = 0; i < matchMap.getMatchCount(); i++)
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>\n"
-        );
-      }
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String x;
-    String[] y;
-    
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    x = variableContext.getParameter(seqPrefix+"pathcount");
-    if (x != null)
-    {
-      // Delete all path specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals(CONFIG_PARAM_LOCATION))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(x);
-      // Gather up these
-      i = 0;
-      while (i < pathCount)
-      {
-      	String pathDescription = "_"+Integer.toString(i);
-      	String pathOpName = seqPrefix+"pathop"+pathDescription;
-        String pathName = seqPrefix+"specpath"+pathDescription;
-      	x = variableContext.getParameter(pathOpName);
-      	if (x != null && x.equals("Delete"))
-      	{
-          // Skip to the next
-          i++;
-          continue;
-      	}
-      	// Path inserts won't happen until the very end
-      	String path = variableContext.getParameter(pathName);
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_LOCATION);
-      	node.setAttribute("path",path);
-      	ds.addChild(ds.getChildCount(),node);
-      	i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"pathop");
-      if (op != null && op.equals("Add"))
-      {
-      	String path = variableContext.getParameter(seqPrefix+"specpath");
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_LOCATION);
-      	node.setAttribute("path",path);
-      	ds.addChild(ds.getChildCount(),node);
-      }
-      else if (op != null && op.equals("Up"))
-      {
-      	// Strip off end
-      	String path = variableContext.getParameter(seqPrefix+"specpath");
-      	int k = path.lastIndexOf("/");
-      	if (k != -1)
-          path = path.substring(0,k);
-      	if (path.length() == 0)
-          path = "/";
-      	currentContext.save(seqPrefix+"specpath",path);
-      }
-      else if (op != null && op.equals("AddToPath"))
-      {
-      	String path = variableContext.getParameter(seqPrefix+"specpath");
-      	String addon = variableContext.getParameter(seqPrefix+"pathaddon");
-      	if (addon != null && addon.length() > 0)
-      	{
-          if (path.length() == 1)
-            path = "/" + addon;
-          else
-            path += "/" + addon;
-      	}
-      	currentContext.save(seqPrefix+"specpath",path);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (x != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals("security"))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode("security");
-      node.setAttribute("value",x);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    x = variableContext.getParameter(seqPrefix+"tokencount");
-    if (x != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals("access"))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(x);
-      i = 0;
-      while (i < accessCount)
-      {
-      	String accessDescription = "_"+Integer.toString(i);
-      	String accessOpName = seqPrefix+"accessop"+accessDescription;
-      	x = variableContext.getParameter(accessOpName);
-      	if (x != null && x.equals("Delete"))
-      	{
-          // Next row
-          i++;
-          continue;
-      	}
-      	// Get the stuff we need
-      	String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-      	SpecificationNode node = new SpecificationNode("access");
-      	node.setAttribute("token",accessSpec);
-      	ds.addChild(ds.getChildCount(),node);
-      	i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-      	String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-      	SpecificationNode node = new SpecificationNode("access");
-      	node.setAttribute("token",accessspec);
-      	ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"datatype_count");
-    if (x != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals(CONFIG_PARAM_OBJECTTYPE))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      int dataCount = Integer.parseInt(x);
-      
-      y = variableContext.getParameterValues(seqPrefix+"specfiletype");
-      Set<String> checkedTypes = new HashSet<String>();
-      if (y != null)
-      {
-        for (String s : y)
-        {
-          checkedTypes.add(s);
-        }
-      }
-      
-      // Loop through specs
-      for (int k = 0; k < dataCount; k++)
-      {
-      	String fileType = variableContext.getParameter(seqPrefix+"datatype_"+k);
-        if (checkedTypes.contains(fileType))
-        {
-          SpecificationNode node = new SpecificationNode(CONFIG_PARAM_OBJECTTYPE);
-          node.setAttribute("token",fileType);
-          String isAll = variableContext.getParameter(seqPrefix+"specfileallattrs_"+k);
-          if (isAll != null)
-            node.setAttribute("all",isAll);
-          String[] z = variableContext.getParameterValues(seqPrefix+"specfileattrs_"+k);
-          if (z != null)
-          {
-            for (int kk = 0; kk < z.length; kk++)
-            {
-              SpecificationNode attrNode = new SpecificationNode(CONFIG_PARAM_ATTRIBUTENAME);
-              attrNode.setAttribute("attrname",z[kk]);
-              node.addChild(node.getChildCount(),attrNode);
-            }
-          }
-          x = variableContext.getParameter(seqPrefix+"filter_"+k+"_count");
-          int filterCount = Integer.parseInt(x);
-          for (int kk = 0; kk < filterCount; kk++)
-          {
-            String op = variableContext.getParameter(seqPrefix+"filter_"+k+"_"+kk+"_op");
-            if (op == null || !op.equals("Delete"))
-            {
-              String attributeName = variableContext.getParameter(seqPrefix+"filter_"+k+"_"+kk+"_name");
-              String operation = variableContext.getParameter(seqPrefix+"filter_"+k+"_"+kk+"_operation");
-              String value = variableContext.getParameter(seqPrefix+"filter_"+k+"_"+kk+"_value");
-              SpecificationNode filterNode = new SpecificationNode(CONFIG_PARAM_FILTER);
-              filterNode.setAttribute("name",attributeName);
-              filterNode.setAttribute("op",operation);
-              filterNode.setAttribute("value",value);
-              node.addChild(node.getChildCount(),filterNode);
-            }
-          }
-          // Add at the end
-          x = variableContext.getParameter(seqPrefix+"filter_"+k+"_op");
-          if (x != null && x.equals("Add"))
-          {
-            String attributeName = variableContext.getParameter(seqPrefix+"filter_"+k+"_name");
-            String operation = variableContext.getParameter(seqPrefix+"filter_"+k+"_operation");
-            String value = variableContext.getParameter(seqPrefix+"filter_"+k+"_value");
-            SpecificationNode filterNode = new SpecificationNode(CONFIG_PARAM_FILTER);
-            filterNode.setAttribute("name",attributeName);
-            filterNode.setAttribute("op",operation);
-            filterNode.setAttribute("value",value);
-            node.addChild(node.getChildCount(),filterNode);
-          }
-          ds.addChild(ds.getChildCount(),node);
-        }
-      }
-    }
-
-    y = variableContext.getParameterValues(seqPrefix+"specmimetype");
-    if (y != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals(CONFIG_PARAM_FORMAT))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      // Loop through specs
-      i = 0;
-      while (i < y.length)
-      {
-      	String fileType = y[i++];
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_FORMAT);
-      	node.setAttribute("value",fileType);
-      	ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specmaxdoclength");
-    if (x != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals(CONFIG_PARAM_MAXLENGTH))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      if (x.length() > 0)
-      {
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_MAXLENGTH);
-      	node.setAttribute("value",x);
-      	ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    String xc = variableContext.getParameter(seqPrefix+"specpathnameattribute");
-    if (xc != null)
-    {
-      // Delete old one
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals(CONFIG_PARAM_PATHNAMEATTRIBUTE))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-      if (xc.length() > 0)
-      {
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_PATHNAMEATTRIBUTE);
-      	node.setAttribute("value",xc);
-      	ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specmappingcount");
-    if (xc != null)
-    {
-      // Delete old spec
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-      	SpecificationNode sn = ds.getChild(i);
-      	if (sn.getType().equals(CONFIG_PARAM_PATHMAP))
-          ds.removeChild(i);
-      	else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(xc);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-      	String pathDescription = "_"+Integer.toString(i);
-      	String pathOpName = seqPrefix+"specmappingop"+pathDescription;
-      	xc = variableContext.getParameter(pathOpName);
-      	if (xc != null && xc.equals("Delete"))
-      	{
-          // Skip to the next
-          i++;
-          continue;
-      	}
-      	// Inserts won't happen until the very end
-      	String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-      	String replace = variableContext.getParameter(seqPrefix+"specreplace"+pathDescription);
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_PATHMAP);
-      	node.setAttribute("match",match);
-      	node.setAttribute("replace",replace);
-      	ds.addChild(ds.getChildCount(),node);
-      	i++;
-      }
-
-      // Check for add
-      xc = variableContext.getParameter(seqPrefix+"specmappingop");
-      if (xc != null && xc.equals("Add"))
-      {
-      	String match = variableContext.getParameter(seqPrefix+"specmatch");
-      	String replace = variableContext.getParameter(seqPrefix+"specreplace");
-      	SpecificationNode node = new SpecificationNode(CONFIG_PARAM_PATHMAP);
-      	node.setAttribute("match",match);
-      	node.setAttribute("replace",replace);
-      	ds.addChild(ds.getChildCount(),node);
-      }
-    }
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"
-    );
-    boolean seenAny = false;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_LOCATION))
-      {
-        if (seenAny == false)
-        {
-          seenAny = true;
-          out.print(
-"    <td class=\"description\">" + Messages.getBodyString(locale,"DCTM.CabinetFolderPaths") + "</td>\n"+
-"    <td class=\"value\">\n"
-          );
-        }
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue("path"))+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td colspan=\"2\" class=\"message\">" + Messages.getBodyString(locale,"DCTM.NoCabinetFolderPathsSpecified") + "</td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"boxcell\" colspan=\"2\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.DocumentType") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Filters") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Metadata") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-    int l = 0;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_OBJECTTYPE))
-      {
-        out.print(
-"        <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"
-        );
-
-        String strObjectType = sn.getAttributeValue("token");
-        out.print(
-"          <td class=\"formcolumncell\">\n"+
-"            "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(strObjectType)+"\n"+
-"          </td>\n"
-        );
-        out.print(
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.AttributeName") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Operation") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"DCTM.Value") + "</nobr></td>\n"+
-"              </tr>\n"
-        );
-        Map<String,Map<String,Set<String>>> currentFilters = new HashMap<String,Map<String,Set<String>>>();
-        for (int k = 0; k < sn.getChildCount(); k++)
-        {
-          SpecificationNode dsn = sn.getChild(k);
-          if (dsn.getType().equals(CONFIG_PARAM_FILTER))
-          {
-            String attributeName = dsn.getAttributeValue("name");
-            String operation = dsn.getAttributeValue("op");
-            String value = dsn.getAttributeValue("value");
-            Map<String,Set<String>> filters = currentFilters.get(attributeName);
-            if (filters == null)
-            {
-              filters = new HashMap<String,Set<String>>();
-              currentFilters.put(attributeName,filters);
-            }
-            Set<String> values = filters.get(operation);
-            if (values == null)
-            {
-              values = new HashSet<String>();
-              filters.put(operation,values);
-            }
-            values.add(value);
-          }
-        }
-        
-        int kk = 0;
-        String[] sortedAttributes = currentFilters.keySet().toArray(new String[0]);
-        java.util.Arrays.sort(sortedAttributes);
-        for (String filterAttribute : sortedAttributes)
-        {
-          Map<String,Set<String>> currentOperations = currentFilters.get(filterAttribute);
-          String[] sortedOperations = currentOperations.keySet().toArray(new String[0]);
-          java.util.Arrays.sort(sortedOperations);
-          for (String filterOperation : sortedOperations)
-          {
-            Set<String> currentValues = currentOperations.get(filterOperation);
-            String[] sortedValues = currentValues.toArray(new String[0]);
-            java.util.Arrays.sort(sortedValues);
-            StringBuilder sb = new StringBuilder();
-            boolean commaNeeded = false;
-            for (String value : sortedValues)
-            {
-              if (commaNeeded)
-                sb.append(", ");
-              else
-                commaNeeded = true;
-              sb.append("\"").append(value).append("\"");
-            }
-            out.print(
-"              <tr class=\""+(((kk % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filterAttribute)+"</nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filterOperation)+"</nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sb.toString())+"\n"+
-"                </td>\n"+
-"              </tr>\n"
-            );
-            kk++;
-          }
-        }
-        
-        out.print(
-"            </table>\n"+
-"          </td>\n"
-        );
-        out.print(
-"          <td class=\"formcolumncell\">\n"
-        );
-
-        String isAll = sn.getAttributeValue("all");
-        if (isAll != null && isAll.equals("true"))
-          out.print(
-"            <nobr>" + Messages.getBodyString(locale,"DCTM.allMetadataAttributes") + "</nobr>\n"
-          );
-        else
-        {
-          for (int k = 0; k < sn.getChildCount(); k++)
-          {
-            SpecificationNode dsn = sn.getChild(k);
-            if (dsn.getType().equals(CONFIG_PARAM_ATTRIBUTENAME))
-            {
-              String attrName = dsn.getAttributeValue("attrname");
-              out.print(
-"            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(attrName)+"</nobr>\n"
-              );
-            }
-          }
-        }
-        out.print(
-"          </td>\n"
-        );
-
-        out.print(
-"        </tr>\n"
-        );
-        
-        l++;
-      }
-      
-    }
-    if (l == 0)
-    {
-      out.print(
-"        <tr class=\"formrow\">\n"+
-"          <td colspan=\"3\" class=\"message\">" + Messages.getBodyString(locale,"DCTM.NoDocumentTypesSpecified") + "</td>\n"+
-"        </tr>\n"
-      );
-    }
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"
-    );
-    seenAny = false;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_FORMAT))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.ContentTypes2") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String strContentType = sn.getAttributeValue("value");
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(strContentType)+"<br/>\n"
-        );
-      }
-    }
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td colspan=\"2\" class=\"message\">" + Messages.getBodyString(locale,"DCTM.NoMimeTypesSpecified") + "</td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Find max document length
-    String maxDocumentLength = "unlimited";
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_MAXLENGTH))
-      {
-        maxDocumentLength = sn.getAttributeValue("value");
-      }
-    }
-
-    out.print(
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.MaximumDocumentLength") + "</nobr></td>\n"+
-"    <td class=\"value\">"+maxDocumentLength+"</td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    
-    // Find whether security is on or off
-    boolean securityOn = true;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-    
-    out.print(
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.Security2") + "</nobr></td>\n"+
-"    <td class=\"value\">"+((securityOn)?"Enabled":"Disabled")+"</td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Go through looking for access tokens
-    seenAny = false;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("access"))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.AccessTokens") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue("token");
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"DCTM.NoAccessTokensSpecified") + "</td></tr>\n"
-      );
-    }
-
-    out.print(
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    
-    // Find the path-name metadata attribute name
-    String pathNameAttribute = "";
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_PATHNAMEATTRIBUTE))
-      {
-        pathNameAttribute = sn.getAttributeValue("value");
-      }
-    }
-
-    out.print(
-"  <tr>\n"
-    );
-    if (pathNameAttribute.length() > 0)
-    {
-      out.print(
-"    <td class=\"description\">" + Messages.getBodyString(locale,"DCTM.PathNameMetadataAttribute") + "</td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathNameAttribute)+"</td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"DCTM.NoPathNameMetadataAttributeSpecified") + "</td>\n"
-      );
-    }
-    
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"    \n"+
-"  <tr>\n"
-    );
-    
-    // Find the path-value mapping data
-    org.apache.manifoldcf.crawler.connectors.DCTM.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.DCTM.MatchMap();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(CONFIG_PARAM_PATHMAP))
-      {
-        String pathMatch = sn.getAttributeValue("match");
-        String pathReplace = sn.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-    if (matchMap.getMatchCount() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"DCTM.PathValueMapping") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      for (int i = 0; i < matchMap.getMatchCount(); i++)
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"        <tr>\n"+
-"          <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</td>\n"+
-"          <td class=\"value\">--></td>\n"+
-"          <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</td>\n"+
-"        </tr>\n"
-        );
-      }
-
-      out.print(
-"      </table>\n"+
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"DCTM.NoMappingsSpecified") + "</td>\n"
-      );
-    }
-
-    out.print(
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-  /** Documentum-specific method, for UI support.
-  * This one returns the supported content types, which will be presented in the UI for selection.
-  */
-  public String[] getContentTypes()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      String dql = "select name from dm_format where can_index=true order by name asc";
-      while (true)
-      {
-        boolean noSession = (session==null);
-        getSession();
-        GetListOfValuesThread t = new GetListOfValuesThread(dql,"name");
-        try
-        {
-          t.start();
-          List<String> contentTypes = t.finishUp();
-          
-          String[] rval = new String[contentTypes.size()];
-          int i = 0;
-          while (i < rval.length)
-          {
-            rval[i] = contentTypes.get(i);
-            i++;
-          }
-          return rval;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RemoteException e)
-        {
-          Throwable e2 = e.getCause();
-          if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-            throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-          if (noSession)
-          {
-            long currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-          }
-          session = null;
-          lastSessionFetch = -1L;
-          continue;
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-      // Base our treatment on the kind of error it is.
-      long currentTime = System.currentTimeMillis();
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        Logging.connectors.warn("DCTM: Remote service interruption reading content types: "+e.getMessage(),e);
-        throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L, 12 * 60 * 60000L,-1,true);
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Documentum-specific method, for UI support.
-  */
-  public String[] getObjectTypes()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    //if (true)
-    //  return new String[]{"type1","type2","type3"};
-    try
-    {
-      String strDQL = "select distinct A.r_type_name from dmi_type_info A, dmi_dd_type_info B  " +
-        " where ((not A.r_type_name like 'dm_%' and any A.r_supertype='dm_document' and B.life_cycle <> 3) " +
-        "or (A.r_type_name = 'dm_document' and B.life_cycle <> 3)) " +
-        " AND A.r_type_name = B.type_name order by A.r_type_name";
-      while (true)
-      {
-        boolean noSession = (session==null);
-        getSession();
-        GetListOfValuesThread t = new GetListOfValuesThread(strDQL,"r_type_name");
-        try
-        {
-          t.start();
-          List<String> objectTypes = t.finishUp();
-          String[] rval = new String[objectTypes.size()];
-          int i = 0;
-          while (i < rval.length)
-          {
-            rval[i] = objectTypes.get(i);
-            i++;
-          }
-          return rval;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RemoteException e)
-        {
-          Throwable e2 = e.getCause();
-          if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-            throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-          if (noSession)
-          {
-            long currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-          }
-          session = null;
-          lastSessionFetch = -1L;
-          continue;
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-      // Base our treatment on the kind of error it is.
-      long currentTime = System.currentTimeMillis();
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        Logging.connectors.warn("DCTM: Remote service interruption reading object types: "+e.getMessage(),e);
-        throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L, currentTime + 12 * 60 * 60000L,-1,true);
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-
-  protected class GetChildFolderNamesThread extends Thread
-  {
-    protected final String strTheParentFolderPath;
-    
-    protected Throwable exception = null;
-    protected String[] rval = null;
-
-    public GetChildFolderNamesThread(String strTheParentFolderPath)
-    {
-      super();
-      setDaemon(true);
-      this.strTheParentFolderPath = strTheParentFolderPath;
-    }
-
-    public void run()
-    {
-      try
-      {
-        IDocumentumResult result;
-        ArrayList objFolderNames = new ArrayList();
-        if (strTheParentFolderPath.equalsIgnoreCase("/"))
-        {
-          String strDQLForCabinets = "select object_name, r_object_type, r_object_id from dm_cabinet order by 1";
-          result = session.performDQLQuery(strDQLForCabinets);
-        }
-        else
-        {
-          result = session.getFolderContents(strTheParentFolderPath);
-        }
-
-        try
-        {
-          Map matchTypes = new HashMap();
-          while (result.isValidRow())
-          {
-            String strObjectName = result.getStringValue("object_name");
-            String strObjectType = result.getStringValue("r_object_type").trim();
-            Boolean x = (Boolean)matchTypes.get(strObjectType);
-            if (x == null)
-            {
-              // Look up whether this is a type of folder or cabinet
-              boolean isMatch = session.isOneOf(strObjectType,new String[]{"dm_folder","dm_cabinet"});
-              x = new Boolean(isMatch);
-              matchTypes.put(strObjectType,x);
-            }
-
-            if (x.booleanValue())
-            {
-              objFolderNames.add(strObjectName);
-            }
-            result.nextRow();
-          }
-        }
-        finally
-        {
-          result.close();
-        }
-
-        rval = new String[objFolderNames.size()];
-        int i = 0;
-        while (i < rval.length)
-        {
-          rval[i] = (String)objFolderNames.get(i);
-          i++;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public String[] finishUp()
-      throws InterruptedException, RemoteException, DocumentumException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof DocumentumException)
-          throw (DocumentumException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  /** This method returns an ordered set of the "next things" given a folder path, for the UI to
-  * use in constructing the starting folder for a job's document specification.
-  */
-  public String[] getChildFolderNames(String strTheParentFolderPath)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      while (true)
-      {
-        boolean noSession = (session==null);
-        getSession();
-        GetChildFolderNamesThread t = new GetChildFolderNamesThread(strTheParentFolderPath);
-        try
-        {
-          t.start();
-          return t.finishUp();
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RemoteException e)
-        {
-          Throwable e2 = e.getCause();
-          if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-            throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-          if (noSession)
-          {
-            long currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-          }
-          session = null;
-          lastSessionFetch = -1L;
-          continue;
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-      // Base our treatment on the kind of error it is.
-      long currentTime = System.currentTimeMillis();
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        Logging.connectors.warn("DCTM: Remote service interruption reading child folders: "+e.getMessage(),e);
-        throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L,currentTime + 12 * 60 * 60000L,-1,true);
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-
-  }
-
-  /** Get the list of attributes for a given data type.  This returns an inclusive list of both pre-defined and extended
-  * attributes, to be presented to the user as a select list per data type.  From this list, the metadata attributes will
-  * be selected.
-  *@param docType is the document type (e.g. "dm_document") for which the attributes are requested.
-  *@return the array of data attributes, in alphabetic order.
-  */
-  public String[] getIngestableAttributes(String docType)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    //if (true)
-    //  return new String[]{"attribute1","attribute2","attribute3"};
-    try
-    {
-      String strDQL = "select distinct attr_name FROM dmi_dd_attr_info where type_name = '" + docType + "' order by attr_name asc";
-      while (true)
-      {
-        boolean noSession = (session==null);
-        getSession();
-        GetListOfValuesThread t = new GetListOfValuesThread(strDQL,"attr_name");
-        try
-        {
-          t.start();
-          List<String> attributes = t.finishUp();
-          String[] rval = new String[attributes.size()];
-          int i = 0;
-          while (i < rval.length)
-          {
-            rval[i] = attributes.get(i);
-            i++;
-          }
-          return rval;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RemoteException e)
-        {
-          Throwable e2 = e.getCause();
-          if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-            throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-          if (noSession)
-          {
-            long currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Transient error connecting to documentum service: "+e.getMessage(),currentTime + 60000L);
-          }
-          session = null;
-          lastSessionFetch = -1L;
-          continue;
-        }
-      }
-    }
-    catch (DocumentumException e)
-    {
-      // Base our treatment on the kind of error it is.
-      long currentTime = System.currentTimeMillis();
-      if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-      {
-        Logging.connectors.warn("DCTM: Remote service interruption reading child folders: "+e.getMessage(),e);
-        throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L,currentTime + 12 * 60 * 60000L,-1,true);
-      }
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-
-  // Private and protected methods
-
-  /** This class digests specifications and allows easy access to the data within.
-  */
-  protected class SpecInfo
-  {
-    /** The path attribute name */
-    protected final String pathAttributeName;
-    /** The folder ID to path name mapping (which acts like a cache).
-      The key is the folder ID, and the value is an array of Strings. */
-    protected final Map<String,String[]> pathMap = new HashMap<String,String[]>();
-    /** The path name map */
-    protected final MatchMap matchMap = new MatchMap();
-    /** A set of forced acls */
-    protected final Set<String> aclSet = new HashSet<String>();
-    /** Security on/off */
-    protected final boolean securityOn;
-    /** Map of type to selected attributes */
-    protected final Map<String,List<String>> typeMap = new HashMap<String,List<String>>();
-
-    /** Constructor */
-    public SpecInfo(Specification spec)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      String pathAttributeName = null;
-      boolean securityOn = true;
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode n = spec.getChild(i);
-        if (n.getType().equals(CONFIG_PARAM_PATHNAMEATTRIBUTE))
-          pathAttributeName = n.getAttributeValue("value");
-        else if (n.getType().equals(CONFIG_PARAM_PATHMAP))
-        {
-          String pathMatch = n.getAttributeValue("match");
-          String pathReplace = n.getAttributeValue("replace");
-          matchMap.appendMatchPair(pathMatch,pathReplace);
-        }
-        else if (n.getType().equals("access"))
-        {
-          String token = n.getAttributeValue("token");
-          aclSet.add(token);
-        }
-        else if (n.getType().equals("security"))
-        {
-          String value = n.getAttributeValue("value");
-          if (value.equals("on"))
-            securityOn = true;
-          else if (value.equals("off"))
-            securityOn = false;
-        }
-        else if (n.getType().equals(CONFIG_PARAM_OBJECTTYPE))
-        {
-          String typeName = n.getAttributeValue("token");
-          String isAll = n.getAttributeValue("all");
-          List<String> list;
-          if (isAll != null && isAll.equals("true"))
-          {
-            // "All" attributes are specified
-            // The current complete list of attributes must be fetched for this document type
-            try
-            {
-              list = getAttributesForType(typeName);
-            }
-            catch (DocumentumException e)
-            {
-              // Base our treatment on the kind of error it is.
-              if (e.getType() == DocumentumException.TYPE_SERVICEINTERRUPTION)
-              {
-                long currentTime = System.currentTimeMillis();
-                Logging.connectors.warn("DCTM: Remote service interruption listing attributes: "+e.getMessage(),e);
-                throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L,currentTime + 12 * 60 * 60000L,-1,true);
-              }
-              throw new ManifoldCFException(e.getMessage(),e);
-            }
-          }
-          else
-          {
-            list = new ArrayList<String>();
-            for (int l = 0; i < n.getChildCount(); l++)
-            {
-              SpecificationNode sn = n.getChild(l);
-              if (sn.getType().equals(CONFIG_PARAM_ATTRIBUTENAME))
-              {
-                String attrName = sn.getAttributeValue("attrname");
-                list.add(attrName);
-              }
-            }
-          }
-          typeMap.put(typeName,list);
-        }
-      }
-      this.pathAttributeName = pathAttributeName;
-      this.securityOn = securityOn;
-    }
-
-    /** Get the path attribute name.
-    *@return the path attribute name, or null if none specified.
-    */
-    public String getPathAttributeName()
-    {
-      return pathAttributeName;
-    }
-
-    /** Given an identifier, get the array of translated strings that goes into the metadata.
-    */
-    public String[] getPathAttributeValue(IDocumentumObject object)
-      throws DocumentumException, RemoteException, ManifoldCFException
-    {
-      String[] paths = object.getFolderPaths(pathMap);
-      String[] rval = new String[paths.length];
-      for (int i = 0; i < paths.length; i++)
-      {
-        rval[i] = matchMap.translate(paths[i]);
-      }
-      return rval;
-    }
-
-    /** Grab forced acl out of document specification.
-    *@param spec is the document specification.
-    *@return the acls.
-    */
-    public String[] getAcls()
-    {
-      if (!securityOn)
-        return null;
-
-      String[] rval = new String[aclSet.size()];
-      Iterator<String> iter = aclSet.iterator();
-      int i = 0;
-      for (String value : aclSet)
-      {
-        rval[i++] = value;
-      }
-      return rval;
-    }
-
-    public String getForcedAclString()
-    {
-      // Get the forced acls (and whether security is on as well)
-      String[] acls = getAcls();
-      // Build a "forced acl" version string, of the form ";<acl>+<acl>+..."
-      StringBuilder forcedAclString = new StringBuilder();
-      if (acls != null)
-      {
-        forcedAclString.append('+');
-        java.util.Arrays.sort(acls);
-        packList(forcedAclString,acls,'+');
-        pack(forcedAclString,denyToken,'+');
-      }
-      else
-        forcedAclString.append('-');
-      return forcedAclString.toString();
-    }
-    
-    public List<String> getMetadataFields(String typeName)
-    {
-      return typeMap.get(typeName);
-    }
-    
-    public String getMetadataVersionAddendum(String typeName)
-    {
-      // Sort the attribute names, because we need them to be comparable.
-      StringBuilder sb = new StringBuilder();
-      List<String> list = typeMap.get(typeName);
-      if (list == null)
-        packList(sb,new String[0],'+');
-      else
-      {
-        String[] sortArray = new String[list.size()];
-        int j = 0;
-        for (String thing : list)
-        {
-          sortArray[j++] = thing;
-        }
-        java.util.Arrays.sort(sortArray);
-        packList(sb,sortArray,'+');
-      }
-      return sb.toString();
-    }
-    
-    public String getPathNameAttributeAddendum()
-    {
-      // This starts with = since ; is used by another optional component (the forced acls)
-      StringBuilder pathNameAttributeVersion = new StringBuilder();
-      if (pathAttributeName != null)
-        pathNameAttributeVersion.append("=").append(pathAttributeName).append(":").append(matchMap);
-      return pathNameAttributeVersion.toString();
-    }
-    
-  }
-  
-}
diff --git a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/MatchMap.java b/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/MatchMap.java
deleted file mode 100644
index b67f13b..0000000
--- a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/MatchMap.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/* $Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.DCTM;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** An instance of this class describes a "match map", which describes a translation of an input
-* string using regexp technology.
-* A match map consists of multiple clauses, which are fired in sequence.  Each clause is a regexp
-* search and replace, where the replace string can include references to the groups present in the
-* search regexp.
-* MatchMaps can be converted to strings in two different ways.  The first way is to build a single
-* string of the form "match1=replace1&match2=replace2...".  Strings of this kind must escape & and =
-* characters in the match and replace strings, where found.  The second way is to generate an array
-* of match strings and a corresponding array of replace strings.  This method requires no escaping
-* of the string contents.
-*/
-public class MatchMap
-{
-  public static final String _rcsid = "@(#)$Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the set of match regexp strings */
-  protected ArrayList matchStrings;
-  /** This is the set of Pattern objects corresponding to the match regexp strings.
-  * It's null if the patterns have not been built yet. */
-  protected Pattern[] matchPatterns = null;
-  /** This is the set of replace strings */
-  protected ArrayList replaceStrings;
-
-  /** Constructor.  Build an empty matchmap. */
-  public MatchMap()
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-  }
-
-  /** Constructor.  Build a matchmap from a single string. */
-  public MatchMap(String stringForm)
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-    StringBuilder matchString = new StringBuilder();
-    StringBuilder replaceString = new StringBuilder();
-    int i = 0;
-    while (i < stringForm.length())
-    {
-      matchString.setLength(0);
-      replaceString.setLength(0);
-      while (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&' || x == '=')
-          break;
-        i++;
-        if (x == '\\' && i < stringForm.length())
-          x = stringForm.charAt(i++);
-        matchString.append(x);
-      }
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '=')
-        {
-          i++;
-          // Pick up the second string
-          while (i < stringForm.length())
-          {
-            x = stringForm.charAt(i);
-            if (x == '&')
-              break;
-            i++;
-            if (x == '\\' && i < stringForm.length())
-              x = stringForm.charAt(i++);
-            replaceString.append(x);
-          }
-        }
-      }
-
-      matchStrings.add(matchString.toString());
-      replaceStrings.add(replaceString.toString());
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&')
-          i++;
-      }
-    }
-  }
-
-  /** Constructor.  Build a matchmap from two arraylists representing match and replace strings */
-  public MatchMap(ArrayList matchStrings, ArrayList replaceStrings)
-  {
-    this.matchStrings = (ArrayList)matchStrings.clone();
-    this.replaceStrings = (ArrayList)replaceStrings.clone();
-  }
-
-  /** Get the number of match/replace strings */
-  public int getMatchCount()
-  {
-    return matchStrings.size();
-  }
-
-  /** Get a specific match string */
-  public String getMatchString(int index)
-  {
-    return (String)matchStrings.get(index);
-  }
-
-  /** Get a specific replace string */
-  public String getReplaceString(int index)
-  {
-    return (String)replaceStrings.get(index);
-  }
-
-  /** Delete a specified match/replace string pair */
-  public void deleteMatchPair(int index)
-  {
-    matchStrings.remove(index);
-    replaceStrings.remove(index);
-    matchPatterns = null;
-  }
-
-  /** Insert a match/replace string pair */
-  public void insertMatchPair(int index, String match, String replace)
-  {
-    matchStrings.add(index,match);
-    replaceStrings.add(index,replace);
-    matchPatterns = null;
-  }
-
-  /** Append a match/replace string pair */
-  public void appendMatchPair(String match, String replace)
-  {
-    matchStrings.add(match);
-    replaceStrings.add(replace);
-    matchPatterns = null;
-  }
-
-  /** Append old-style match/replace pair.
-  * This method translates old-style regexp and group output form to the
-  * current style before adding to the map.
-  */
-  public void appendOldstyleMatchPair(String oldstyleMatch, String oldstyleReplace)
-  {
-    String newStyleMatch = "^" + oldstyleMatch + "$";
-
-    // Need to build a new-style replace string from the old one.  To do that, use the
-    // original parser (which basically will guarantee that we get it right)
-
-    EvaluatorTokenStream et = new EvaluatorTokenStream(oldstyleReplace);
-    StringBuilder newStyleReplace = new StringBuilder();
-
-    while (true)
-    {
-      EvaluatorToken t = et.peek();
-      if (t == null)
-        break;
-      switch (t.getType())
-      {
-      case EvaluatorToken.TYPE_COMMA:
-        et.advance();
-        break;
-      case EvaluatorToken.TYPE_GROUP:
-        et.advance();
-        int groupNumber = t.getGroupNumber();
-        switch (t.getGroupStyle())
-        {
-        case EvaluatorToken.GROUPSTYLE_NONE:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append(")");
-          break;
-        case EvaluatorToken.GROUPSTYLE_LOWER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("l)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_UPPER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("u)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_MIXED:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("m)");
-          break;
-        default:
-          break;
-        }
-        break;
-      case EvaluatorToken.TYPE_TEXT:
-        et.advance();
-        escape(newStyleReplace,t.getTextValue());
-        break;
-      default:
-        break;
-      }
-    }
-
-    appendMatchPair(newStyleMatch,newStyleReplace.toString());
-  }
-
-  /** Escape a string so it is verbatim */
-  protected static void escape(StringBuilder output, String input)
-  {
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '$')
-        output.append(x);
-      output.append(x);
-    }
-  }
-
-  /** Convert the matchmap to string form. */
-  public String toString()
-  {
-    int i = 0;
-    StringBuilder rval = new StringBuilder();
-    while (i < matchStrings.size())
-    {
-      String matchString = (String)matchStrings.get(i);
-      String replaceString = (String)replaceStrings.get(i);
-      if (i > 0)
-        rval.append('&');
-      stuff(rval,matchString);
-      rval.append('=');
-      stuff(rval,replaceString);
-      i++;
-    }
-    return rval.toString();
-  }
-
-  /** Stuff characters */
-  protected static void stuff(StringBuilder sb, String value)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '&' || x == '=')
-        sb.append('\\');
-      sb.append(x);
-    }
-  }
-
-  /** Perform a translation.
-  */
-  public String translate(String input)
-    throws ManifoldCFException
-  {
-    // Build pattern vector if not already there
-    if (matchPatterns == null)
-    {
-      matchPatterns = new Pattern[matchStrings.size()];
-      int i = 0;
-      while (i < matchPatterns.length)
-      {
-        String regexp = (String)matchStrings.get(i);
-        try
-        {
-          matchPatterns[i] = Pattern.compile(regexp);
-        }
-        catch (java.util.regex.PatternSyntaxException e)
-        {
-          matchPatterns = null;
-          throw new ManifoldCFException("For match expression '"+regexp+"', found pattern syntax error: "+e.getMessage(),e);
-        }
-        i++;
-      }
-    }
-
-    int j = 0;
-    while (j < matchPatterns.length)
-    {
-      Pattern p = matchPatterns[j];
-      // Construct a matcher
-      Matcher m = p.matcher(input);
-      // Grab the output description
-      String outputDescription = (String)replaceStrings.get(j);
-      j++;
-      // Create a copy buffer
-      StringBuilder outputBuffer = new StringBuilder();
-      // Keep track of the index in the original string we have done up to
-      int currentIndex = 0;
-      // Scan the string using find, and for each one found, do a translation
-      while (true)
-      {
-        boolean foundOne = m.find();
-        if (foundOne == false)
-        {
-          // No subsequent match found.
-          // Copy everything from currentIndex until the end of input
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-
-        // Do a translation.  This involves copying everything in the input
-        // string up until the start of the match, then doing a replace for
-        // the match itself, and finally setting the currentIndex to the end
-        // of the match.
-
-        int matchStart = m.start(0);
-        int matchEnd = m.end(0);
-        if (matchStart == -1)
-        {
-          // The expression was degenerate; treat this as the end.
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-        outputBuffer.append(input.substring(currentIndex,matchStart));
-
-        // Process translation description!
-        int i = 0;
-        while (i < outputDescription.length())
-        {
-          char x = outputDescription.charAt(i++);
-          if (x == '$' && i < outputDescription.length())
-          {
-            x = outputDescription.charAt(i++);
-            if (x == '(')
-            {
-              // Process evaluation expression
-              StringBuilder numberBuf = new StringBuilder();
-              boolean upper = false;
-              boolean lower = false;
-              boolean mixed = false;
-              while (i < outputDescription.length())
-              {
-                char y = outputDescription.charAt(i++);
-                if (y == ')')
-                  break;
-                else if (y >= '0' && y <= '9')
-                  numberBuf.append(y);
-                else if (y == 'u' || y == 'U')
-                  upper = true;
-                else if (y == 'l' || y == 'L')
-                  lower = true;
-                else if (y == 'm' || y == 'M')
-                  mixed = true;
-              }
-              String number = numberBuf.toString();
-              try
-              {
-                int groupnum = Integer.parseInt(number);
-                String groupValue = m.group(groupnum);
-                if (upper)
-                  outputBuffer.append(groupValue.toUpperCase(Locale.ROOT));
-                else if (lower)
-                  outputBuffer.append(groupValue.toLowerCase(Locale.ROOT));
-                else if (mixed && groupValue.length() > 0)
-                  outputBuffer.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT)).append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-                else
-                  outputBuffer.append(groupValue);
-
-              }
-              catch (NumberFormatException e)
-              {
-                // Silently skip, because it's an illegal group number, so nothing
-                // gets added.
-              }
-
-              // Go back around, so we don't add the $ in
-              continue;
-            }
-          }
-          outputBuffer.append(x);
-        }
-
-        currentIndex = matchEnd;
-      }
-
-      input = outputBuffer.toString();
-    }
-
-    return input;
-  }
-
-
-  // Protected classes
-
-  // These classes are used to process the old token-based replacement strings
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-}
diff --git a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/Messages.java b/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/Messages.java
deleted file mode 100644
index e0c6a33..0000000
--- a/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.DCTM;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.DCTM.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.DCTM";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_en_US.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_en_US.properties
deleted file mode 100644
index e4a0898..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_en_US.properties
+++ /dev/null
@@ -1,88 +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.
-
-DCTM.NoAccessTokensPresent=No access tokens present
-DCTM.NoAccessTokensSpecified=No access tokens specified
-DCTM.Cache=Cache
-DCTM.CacheLifetime=Cache lifetime:
-DCTM.CacheLRUSize=Cache LRU size:
-DCTM.minutes=minutes
-DCTM.Docbase=Docbase
-DCTM.DocbaseName=Docbase name:
-DCTM.DocbaseUserName=Docbase user name:
-DCTM.DocbasePassword=Docbase password:
-DCTM.DocbaseDomain=Docbase domain:
-DCTM.Webtop=Webtop
-DCTM.WebtopBaseURL=Webtop Base URL
-DCTM.Parameters=Parameters:
-DCTM.Paths=Paths
-DCTM.DocumentTypes=Document Types
-DCTM.ContentTypes=Content Types
-DCTM.ContentLength=Content Length
-DCTM.Security=Security
-DCTM.PathMetadata=Path Metadata
-DCTM.Security2=Security:
-DCTM.PathAttributeName=Path attribute name:
-DCTM.Delete=Delete
-DCTM.DeleteMapping=Delete mapping #
-DCTM.NoMappingsSpecified=No mappings specified
-DCTM.Add=Add
-DCTM.AddToMappings=Add to mappings
-DCTM.MatchRegexp=Match regexp:
-DCTM.ReplaceString=Replace string:
-DCTM.CabinetFolderPaths=Cabinet/folder paths:
-DCTM.NoCabinetFolderPathsSpecified=No cabinet/folder paths specified (everything in docbase will be scanned)
-DCTM.ObjectTypes=Object types:
-DCTM.allMetadataAttributes=(all metadata attributes)
-DCTM.NoDocumentTypesSpecified=No document types specified
-DCTM.ContentTypes2=Content types:
-DCTM.NoMimeTypesSpecified=No mime types specified - ALL will be ingested
-DCTM.MaximumDocumentLength=Maximum document length:
-DCTM.AccessTokens=Access tokens:
-DCTM.PathNameMetadataAttribute=Path-name metadata attribute:
-DCTM.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-DCTM.PathValueMapping=Path-value mapping:
-DCTM.NoMappingsSpecified=No mappings specified
-DCTM.PleaseSupplyTheNameOfADocbase=Please supply the name of a Docbase
-DCTM.TheConnectionRequiresAValidDocumentumUserName=The connection requires a valid Documentum user name
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=The connection requires the Documentum user's password
-DCTM.AuthenticationUsernameMatching=Authentication username matching:
-DCTM.CaseInsensitive=Case insensitive
-DCTM.CaseSensitive=Case sensitive
-DCTM.UseSystemAcls=Use system acls:
-DCTM.DontUseSystemAcls=Don't use system acls
-DCTM.certificate=certificate(s)
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=Maximum document length must be null or an integer
-DCTM.SelectAFolderFirst=Select a folder first
-DCTM.NullTokensNotAllowed=Null tokens not allowed
-DCTM.EnterASpecificationFirst=Enter a specification first
-DCTM.SpecificationMustBeValidRegularExpression=Specification must be valid regular expression
-DCTM.DeletePath=Delete path #
-DCTM.NoSpecificCabinetFolderPathsGiven=No specific cabinet/folder paths given (everything in docbase will be scanned)
-DCTM.AddPath=Add path
-DCTM.RemoveFromPath=Remove from path
-DCTM.AddToPath=Add to path
-DCTM.PickAFolder=-- Pick a folder --
-DCTM.DeleteAccessToken=Delete access token #
-DCTM.AddAccessToken=Add access token
-DCTM.ServiceInterruptionOrInvalidCredentials=Service interruption or invalid credentials - check your repository connection\n
-DCTM.ContentLength=Content length:
-DCTM.UserMapping=User Mapping
-DCTM.SystemACLs=System ACLs
-DCTM.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-DCTM.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-DCTM.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-DCTM.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_es_ES.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_es_ES.properties
deleted file mode 100644
index 5c348ff..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_es_ES.properties
+++ /dev/null
@@ -1,42 +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.
-
-ConfluenceRepositoryConnector.Server=Servidor
-ConfluenceRepositoryConnector.Spaces=Espacios
-ConfluenceRepositoryConnector.Pages=Páginas
-
-
-ConfluenceRepositoryConnector.ProtocolColon=Protocolo:
-ConfluenceRepositoryConnector.HostColon=Host:
-ConfluenceRepositoryConnector.PortColon=Puerto:
-ConfluenceRepositoryConnector.PathColon=Camino:
-ConfluenceRepositoryConnector.UsernameColon=Nombre de usuario:
-ConfluenceRepositoryConnector.PasswordColon=Contraseña:
-
-ConfluenceRepositoryConnector.HostMustNotBeNull=Confluencia de acogida no debe ser nulo
-ConfluenceRepositoryConnector.HostMustNotIncludeSlash=Confluencia de acogida no debe incluir una '/' carácter
-ConfluenceRepositoryConnector.PortMustBeAnInteger=El puerto de confluencia debe ser un número entero
-ConfluenceRepositoryConnector.PathMustNotBeNull=El camino de confluencia no debe ser nulo
-ConfluenceRepositoryConnector.PathMustBeginWithASlash=Confluencia ruta debe comenzar con una '/' carácter
-
-ConfluenceRepositoryConnector.NoSpacesConfigured=Sin espacios configurados . Todos los espacios se rastrearán
-
-ConfluenceRepositoryConnector.Add=añadir
-ConfluenceRepositoryConnector.AddSpace=Añadir Espacio
-ConfluenceRepositoryConnector.Delete=borrar
-ConfluenceRepositoryConnector.DeleteSpace=eliminar el espacio #
-ConfluenceRepositoryConnector.TypeInASpace=Escriba un espacio
-
-ConfluenceRepositoryConnector.ProcessAttachments=Accesorios de Proceso
\ No newline at end of file
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_ja_JP.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_ja_JP.properties
deleted file mode 100644
index f6d48d5..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_ja_JP.properties
+++ /dev/null
@@ -1,87 +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.
-
-DCTM.NoAccessTokensPresent=アクセストークンが存在しません
-DCTM.NoAccessTokensSpecified=アクセストークンが未定義です
-DCTM.Cache=キャッシュ
-DCTM.CacheLifetime=キャッシュライフタイム:
-DCTM.CacheLRUSize=キャッシュLRUサイズ:
-DCTM.minutes=分
-DCTM.Docbase=Docbase
-DCTM.DocbaseName=Docbase名:
-DCTM.DocbaseUserName=Docbaseユーザ名:
-DCTM.DocbasePassword=Docbaseパスワード:
-DCTM.DocbaseDomain=Docbaseドメイン:
-DCTM.Webtop=Webtop
-DCTM.WebtopBaseURL=WebtopベースURL
-DCTM.Parameters=引数:
-DCTM.Paths=パス
-DCTM.DocumentTypes=文書タイプ
-DCTM.ContentTypes=コンテンツタイプ
-DCTM.ContentLength=コンテンツ長
-DCTM.Security=セキュリティ
-DCTM.PathMetadata=パスメタデータ
-DCTM.Security2=セキュリティ:
-DCTM.PathAttributeName=パス属性名:
-DCTM.Delete=削除
-DCTM.DeleteMapping=削除マップ #
-DCTM.NoMappingsSpecified=マップを指定してください
-DCTM.Add=追加
-DCTM.AddToMappings=マップに追加
-DCTM.MatchRegexp=正規表現に一致:
-DCTM.ReplaceString=文字列の置換:
-DCTM.CabinetFolderPaths=キャビネット/フォルダパス:
-DCTM.NoCabinetFolderPathsSpecified=キャビネット/フォルダパスを指定してください(docbaseのすべてがスキャンされます)
-DCTM.ObjectTypes=オブジェクトタイプ:
-DCTM.allMetadataAttributes=(すべてのメタデータ属性)
-DCTM.NoDocumentTypesSpecified=ドキュメントタイプを指定してください
-DCTM.ContentTypes2=コンテンツタイプ:
-DCTM.NoMimeTypesSpecified=MIMEタイプを指定してください - すべてを読込みます
-DCTM.MaximumDocumentLength=最大ドキュメント長:
-DCTM.AccessTokens=アクセストークン:
-DCTM.PathNameMetadataAttribute=Path-nameメタデータ属性:
-DCTM.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性を指定してください
-DCTM.PathValueMapping=Path-valueマッピング:
-DCTM.NoMappingsSpecified=マッピングを指定してください
-DCTM.PleaseSupplyTheNameOfADocbase=Docbase名を入力してください
-DCTM.TheConnectionRequiresAValidDocumentumUserName=Documentumユーザ名を入力してください
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=パスワードを入力してください
-DCTM.AuthenticationUsernameMatching=認証ユーザ名パターン:
-DCTM.CaseInsensitive=大/小文字を区別しない
-DCTM.CaseSensitive=大/小文字を区別
-DCTM.UseSystemAcls=システムACLを利用:
-DCTM.DontUseSystemAcls=システムACLを使わない
-DCTM.certificate=証明書
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=最大ドキュメント長さにはnull又は整数を入力してください
-DCTM.SelectAFolderFirst=フォルダを選択してください
-DCTM.NullTokensNotAllowed=トークンを入力してください
-DCTM.EnterASpecificationFirst=パターンを入力してください
-DCTM.SpecificationMustBeValidRegularExpression=パターンは正規表現で入力してください
-DCTM.DeletePath=パスを削除: #
-DCTM.NoSpecificCabinetFolderPathsGiven=キャビネット/フォルダを指定してください(docbase内のすべてをスキャンします)
-DCTM.AddPath=パスに追加
-DCTM.RemoveFromPath=パスから削除
-DCTM.AddToPath=パスを追加
-DCTM.PickAFolder=-- フォルダを選択してくださ --
-DCTM.DeleteAccessToken=アクセストークンを削除: #
-DCTM.AddAccessToken=アクセストークン
-DCTM.ServiceInterruptionOrInvalidCredentials=サーバの中断又は不正な証明書 - リポジトリコネクションを再確認してください
-DCTM.ContentLength=Content length:
-DCTM.UserMapping=ユーザマップ
-DCTM.SystemACLs=システムACL
-DCTM.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-DCTM.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-DCTM.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-DCTM.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_zh_CN.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_zh_CN.properties
deleted file mode 100644
index b8d6404..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/DCTM/common_zh_CN.properties
+++ /dev/null
@@ -1,87 +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.
-
-DCTM.NoAccessTokensPresent=访问令牌不存在
-DCTM.NoAccessTokensSpecified=访问令牌未指定
-DCTM.Cache=缓存
-DCTM.CacheLifetime=缓存寿命: 
-DCTM.CacheLRUSize=缓存LRU大小: 
-DCTM.minutes=分
-DCTM.Docbase=Docbase
-DCTM.DocbaseName=Docbase名: 
-DCTM.DocbaseUserName=Docbase用户名: 
-DCTM.DocbasePassword=Docbase密码: 
-DCTM.DocbaseDomain=Docbase域: 
-DCTM.Webtop=Webtop
-DCTM.WebtopBaseURL=Webtop基URL
-DCTM.Parameters=参数: 
-DCTM.Paths=路径
-DCTM.DocumentTypes=文档类型
-DCTM.ContentTypes=内容类型
-DCTM.ContentLength=内容长度
-DCTM.Security=安全
-DCTM.PathMetadata=路径元数据
-DCTM.Security2=安全: 
-DCTM.PathAttributeName=路径属性名: 
-DCTM.Delete=删除
-DCTM.DeleteMapping=删除映射 #
-DCTM.NoMappingsSpecified=映射未指定
-DCTM.Add=添加
-DCTM.AddToMappings=添加到映射
-DCTM.MatchRegexp=匹配正则表达式: 
-DCTM.ReplaceString=替换字符串: 
-DCTM.CabinetFolderPaths=档案柜/文件夹路径: 
-DCTM.NoCabinetFolderPathsSpecified=档案柜/文件夹路径未指定(将扫描所有Docbase)
-DCTM.ObjectTypes=对象类型: 
-DCTM.allMetadataAttributes=(所有元数据属性)
-DCTM.NoDocumentTypesSpecified=文档类型未指定
-DCTM.ContentTypes2=内容类型: 
-DCTM.NoMimeTypesSpecified=MIME类型请指定 - 将处理所有文档
-DCTM.MaximumDocumentLength=最大文档长度: 
-DCTM.AccessTokens=访问令牌: 
-DCTM.PathNameMetadataAttribute=路径名元数据属性: 
-DCTM.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-DCTM.PathValueMapping=路径值映射: 
-DCTM.NoMappingsSpecified=映射未指定
-DCTM.PleaseSupplyTheNameOfADocbase=请输入Docbase名
-DCTM.TheConnectionRequiresAValidDocumentumUserName=请输入Documentum用户名
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=请输入Documentum用户密码
-DCTM.AuthenticationUsernameMatching=认证用户名匹配: 
-DCTM.CaseInsensitive=不区分大小写
-DCTM.CaseSensitive=区分大小写
-DCTM.UseSystemAcls=使用系统ACL: 
-DCTM.DontUseSystemAcls=不要使用系统ACL
-DCTM.certificate=证书
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=最大文档长度必须为Null或整数
-DCTM.SelectAFolderFirst=请先选择文件夹
-DCTM.NullTokensNotAllowed=令牌不能为Null
-DCTM.EnterASpecificationFirst=请先输入规范
-DCTM.SpecificationMustBeValidRegularExpression=规范必须为有效的正则表达式
-DCTM.DeletePath=删除路径:  #
-DCTM.NoSpecificCabinetFolderPathsGiven=档案柜/文件夹路径未指定(将扫描所有docbase)
-DCTM.AddPath=添加路径
-DCTM.RemoveFromPath=从路径删除
-DCTM.AddToPath=添加到路径
-DCTM.PickAFolder=-- 请选择文件夹 --
-DCTM.DeleteAccessToken=删除访问令牌:  #
-DCTM.AddAccessToken=添加访问令牌
-DCTM.ServiceInterruptionOrInvalidCredentials=服务器中断或无效证书 - 请重新确认存储库连接
-DCTM.ContentLength=内容长度:
-DCTM.UserMapping=用户映射
-DCTM.SystemACLs=系统ACL
-DCTM.CacheLifetimeCannotBeNull=缓存寿命不能为Null
-DCTM.CacheLifetimeMustBeAnInteger=缓存寿命必须为整数
-DCTM.CacheLRUSizeCannotBeNull=缓存LRU大小不能为Null
-DCTM.CacheLRUSizeMustBeAnInteger=缓存LRU大小必须为整数
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_en_US.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_en_US.properties
deleted file mode 100644
index 5b23d64..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_en_US.properties
+++ /dev/null
@@ -1,104 +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.
-
-DCTM.NoAccessTokensPresent=No access tokens present
-DCTM.NoAccessTokensSpecified=No access tokens specified
-DCTM.Docbase=Docbase
-DCTM.DocbaseName=Docbase name:
-DCTM.DocbaseUserName=Docbase user name:
-DCTM.DocbasePassword=Docbase password:
-DCTM.DocbaseDomain=Docbase domain:
-DCTM.Webtop=Webtop
-DCTM.WebtopBaseURL=Webtop Base URL
-DCTM.Parameters=Parameters:
-DCTM.Paths=Paths
-DCTM.DocumentTypes=Document Types
-DCTM.ContentTypes=Content Types
-DCTM.ContentLength=Content Length
-DCTM.Security=Security
-DCTM.PathMetadata=Path Metadata
-DCTM.Security2=Security:
-DCTM.PathAttributeName=Path attribute name:
-DCTM.Delete=Delete
-DCTM.DeleteMapping=Delete mapping #
-DCTM.NoMappingsSpecified=No mappings specified
-DCTM.Add=Add
-DCTM.AddToMappings=Add to mappings
-DCTM.MatchRegexp=Match regexp:
-DCTM.ReplaceString=Replace string:
-DCTM.CabinetFolderPaths=Cabinet/folder paths:
-DCTM.NoCabinetFolderPathsSpecified=No cabinet/folder paths specified (everything in docbase will be scanned)
-DCTM.ObjectTypes=Object types:
-DCTM.allMetadataAttributes=(all metadata attributes)
-DCTM.NoDocumentTypesSpecified=No document types specified
-DCTM.ContentTypes2=Content types:
-DCTM.NoMimeTypesSpecified=No mime types specified - ALL will be ingested
-DCTM.MaximumDocumentLength=Maximum document length:
-DCTM.AccessTokens=Access tokens:
-DCTM.PathNameMetadataAttribute=Path-name metadata attribute:
-DCTM.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-DCTM.PathValueMapping=Path-value mapping:
-DCTM.NoMappingsSpecified=No mappings specified
-DCTM.PleaseSupplyTheNameOfADocbase=Please supply the name of a Docbase
-DCTM.TheConnectionRequiresAValidDocumentumUserName=The connection requires a valid Documentum user name
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=The connection requires the Documentum user's password
-DCTM.AuthenticationUsernameMatching=Authentication username matching:
-DCTM.CaseInsensitive=Case insensitive
-DCTM.CaseSensitive=Case sensitive
-DCTM.UseSystemAcls=Use system acls:
-DCTM.DontUseSystemAcls=Don't use system acls
-DCTM.certificate=certificate(s)
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=Maximum document length must be null or an integer
-DCTM.SelectAFolderFirst=Select a folder first
-DCTM.NullTokensNotAllowed=Null tokens not allowed
-DCTM.EnterASpecificationFirst=Enter a specification first
-DCTM.SpecificationMustBeValidRegularExpression=Specification must be valid regular expression
-DCTM.DeletePath=Delete path #
-DCTM.NoSpecificCabinetFolderPathsGiven=No specific cabinet/folder paths given (everything in docbase will be scanned)
-DCTM.AddPath=Add path
-DCTM.RemoveFromPath=Remove from path
-DCTM.AddToPath=Add to path
-DCTM.PickAFolder=-- Pick a folder --
-DCTM.DeleteAccessToken=Delete access token #
-DCTM.AddAccessToken=Add access token
-DCTM.ServiceInterruptionOrInvalidCredentials=Service interruption or invalid credentials - check your repository connection\n
-DCTM.ContentLength=Content length:
-DCTM.UserMapping=User Mapping
-DCTM.SystemACLs=System ACLs
-
-DCTM.PleaseSupplyTheNameofaDocbase=Please supply the name of a Docbase
-DCTM.ConnectionRequiresValidDocumentumUsername=The connection requires a valid Documentum user name
-DCTM.ConnectionRequiresPassword=The connection requires the Documentum user's password
-DCTM.SpecifyBaseWebtopURL=Please specify the base url to a webtop to serve selected documents
-
-DCTM.DocumentType=Document type
-DCTM.Filters=Filters
-DCTM.AllMetadataQ=All metadata?
-DCTM.Metadata=Metadata
-DCTM.SpecificMetadata=Specific metadata
-DCTM.AttributeName=Attribute name
-DCTM.Operation=Operation
-DCTM.Value=Value
-DCTM.DeleteFilter=Delete filter
-DCTM.NoAttributeFiltersSpecified=No attribute filters specified
-DCTM.AddFilter=Add filter
-DCTM.SelectAnAttributeFirst=Select a filter attribute first
-DCTM.SelectAnOperation=Select an operation
-DCTM.FilterMustHaveValue=Filter must have a value string
-DCTM.PickAnAttribute=-- Select an attribute --
-DCTM.PickAnOperation=-- Pick an operation --
-DCTM.Equals=equals
-DCTM.NotEquals=not equals
-
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_es_ES.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_es_ES.properties
deleted file mode 100644
index 23d6e6f..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_es_ES.properties
+++ /dev/null
@@ -1,104 +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.
-
-DCTM.NoAccessTokensPresent=No hay tokens de acceso actuales
-DCTM.NoAccessTokensSpecified=No hay tokens de acceso especificados
-DCTM.Docbase=base de Doc
-DCTM.DocbaseName=Nombre base Doc:
-DCTM.DocbaseUserName=nombre de usuario de base Doc:
-DCTM.DocbasePassword=Contraseña de base Doc:
-DCTM.DocbaseDomain=Dominio de base Doc:
-DCTM.Webtop=top web
-DCTM.WebtopBaseURL=URL base superior Web
-DCTM.Parameters=Parámetros:
-DCTM.Paths=Caminos
-DCTM.DocumentTypes=Tipos de documentos
-DCTM.ContentTypes=Tipos de contenido
-DCTM.ContentLength=contenido Longitud
-DCTM.Security=Seguridad
-DCTM.PathMetadata=Camino Metadata
-DCTM.Security2=Seguridad:
-DCTM.PathAttributeName=Nombre de atributo de camino:
-DCTM.Delete=borrar
-DCTM.DeleteMapping=Suprima trazar un mapa #
-DCTM.NoMappingsSpecified=No hay asignaciones especificadas
-DCTM.Add=añadir
-DCTM.AddToMappings=Añadir a asignaciones
-DCTM.MatchRegexp=Expresiòn regular:
-DCTM.ReplaceString=Reemplazar cadena:
-DCTM.CabinetFolderPaths=Gabinete/rutas de carpetas:
-DCTM.NoCabinetFolderPathsSpecified=Sin gabinete/rutas de las carpetas especificadas (todo en base de doc se escaneará)
-DCTM.ObjectTypes=Los tipos de objetos:
-DCTM.allMetadataAttributes=(todos los atributos de metadatos)
-DCTM.NoDocumentTypesSpecified=No hay tipos de documentos especificados
-DCTM.ContentTypes2=Tipos de contenido:
-DCTM.NoMimeTypesSpecified=No hay tipos mime especificados - Todos serán ingeridos
-DCTM.MaximumDocumentLength=Longitud máxima del documento:
-DCTM.AccessTokens=tokens de acceso:
-DCTM.PathNameMetadataAttribute=Camino-atributo de nombre metadatos:
-DCTM.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-DCTM.PathValueMapping=Camino-asignación de valores:
-DCTM.NoMappingsSpecified=No hay mapa especificado
-DCTM.PleaseSupplyTheNameOfADocbase=Por favor proporcione el nombre de una base Doc
-DCTM.TheConnectionRequiresAValidDocumentumUserName=La conexión requiere un nombre de usuario válido Documentum
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=La conexión requiere la contraseña del usuario Documentum
-DCTM.AuthenticationUsernameMatching=Acceso Nombre de usuario coincidente:
-DCTM.CaseInsensitive=sensibles a mayùsculas y minùsculas
-DCTM.CaseSensitive=sensible a mayùsculas
-DCTM.UseSystemAcls=Uso del sistema ACL:
-DCTM.DontUseSystemAcls=No utilice ACL del sistema
-DCTM.certificate=certificado(s)
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=Longitud máxima del documento debe ser nulo o un entero
-DCTM.SelectAFolderFirst=Seleccione una carpeta primero
-DCTM.NullTokensNotAllowed=Tokens nulos no permitidos
-DCTM.EnterASpecificationFirst=Introduzca una especificación primero
-DCTM.SpecificationMustBeValidRegularExpression=Especificación debe ser expresión regular válida
-DCTM.DeletePath=eliminar ruta #
-DCTM.NoSpecificCabinetFolderPathsGiven=Sin gabinete específico/rutas de carpetas dadas (todo en base de doc se escaneará)
-DCTM.AddPath=Añadir ruta
-DCTM.RemoveFromPath=Eliminaciòn de ruta
-DCTM.AddToPath=Añadir al camino
-DCTM.PickAFolder=-- Elija una carpeta --
-DCTM.DeleteAccessToken=Eliminar token de acceso #
-DCTM.AddAccessToken=Añadir token de acceso
-DCTM.ServiceInterruptionOrInvalidCredentials=Interrupción del servicio o de credenciales no válidas - compruebe la conexión del repositorio\n
-DCTM.ContentLength=contenido longitudinal:
-DCTM.UserMapping=Trazar un mapa de Usuario
-DCTM.SystemACLs=Sistema de ACL
-
-DCTM.PleaseSupplyTheNameofaDocbase=Por favor proporcione el nombre de una base Doc
-DCTM.ConnectionRequiresValidDocumentumUsername=La conexión requiere un nombre de usuario válido Documentum
-DCTM.ConnectionRequiresPassword=La conexión requiere la contraseña del usuario Documentum
-DCTM.SpecifyBaseWebtopURL=Por favor especificar la URL base para un top web para servir a los documentos seleccionados
-
-DCTM.DocumentType=Tipo de documento
-DCTM.Filters=Filtros
-DCTM.AllMetadataQ=Todos los metadatos?
-DCTM.Metadata=Metadatos
-DCTM.SpecificMetadata=metadatos específico
-DCTM.AttributeName=Nombre del Atributo
-DCTM.Operation=Operación
-DCTM.Value=Valor
-DCTM.DeleteFilter=eliminar filtro
-DCTM.NoAttributeFiltersSpecified=No hay filtros atributo especificado
-DCTM.AddFilter=Añadir filtro
-DCTM.SelectAnAttributeFirst=Seleccionar un atributo de filtro primero
-DCTM.SelectAnOperation=Seleccione una operación
-DCTM.FilterMustHaveValue=Filtro debe tener una cadena de valor
-DCTM.PickAnAttribute=-- Seleccione un atributo --
-DCTM.PickAnOperation=-- Escoja una operación --
-DCTM.Equals=iguales
-DCTM.NotEquals=no iguales
-
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_ja_JP.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_ja_JP.properties
deleted file mode 100644
index 4ea4471..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_ja_JP.properties
+++ /dev/null
@@ -1,103 +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.
-
-DCTM.NoAccessTokensPresent=アクセストークンが存在しません
-DCTM.NoAccessTokensSpecified=アクセストークンが未定義です
-DCTM.Docbase=Docbase
-DCTM.DocbaseName=Docbase名:
-DCTM.DocbaseUserName=Docbaseユーザ名:
-DCTM.DocbasePassword=Docbaseパスワード:
-DCTM.DocbaseDomain=Docbaseドメイン:
-DCTM.Webtop=Webtop
-DCTM.WebtopBaseURL=WebtopベースURL
-DCTM.Parameters=引数:
-DCTM.Paths=パス
-DCTM.DocumentTypes=文書タイプ
-DCTM.ContentTypes=コンテンツタイプ
-DCTM.ContentLength=コンテンツ長
-DCTM.Security=セキュリティ
-DCTM.PathMetadata=パスメタデータ
-DCTM.Security2=セキュリティ:
-DCTM.PathAttributeName=パス属性名:
-DCTM.Delete=削除
-DCTM.DeleteMapping=マップ # を削除
-DCTM.NoMappingsSpecified=マップを指定してください
-DCTM.Add=追加
-DCTM.AddToMappings=マップに追加
-DCTM.MatchRegexp=正規表現に一致:
-DCTM.ReplaceString=文字列の置換:
-DCTM.CabinetFolderPaths=キャビネット/フォルダパス:
-DCTM.NoCabinetFolderPathsSpecified=キャビネット/フォルダパスを指定してください(docbaseのすべてがスキャンされます)
-DCTM.ObjectTypes=オブジェクトタイプ:
-DCTM.allMetadataAttributes=(すべてのメタデータ属性)
-DCTM.NoDocumentTypesSpecified=ドキュメントタイプを指定してください
-DCTM.ContentTypes2=コンテンツタイプ:
-DCTM.NoMimeTypesSpecified=MIMEタイプを指定してください - すべてを読込みます
-DCTM.MaximumDocumentLength=最大ドキュメント長:
-DCTM.AccessTokens=アクセストークン:
-DCTM.PathNameMetadataAttribute=Path-nameメタデータ属性:
-DCTM.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性を指定してください
-DCTM.PathValueMapping=Path-valueマッピング:
-DCTM.NoMappingsSpecified=マッピングを指定してください
-DCTM.PleaseSupplyTheNameOfADocbase=Docbase名を入力してください
-DCTM.TheConnectionRequiresAValidDocumentumUserName=Documentumユーザ名を入力してください
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=パスワードを入力してください
-DCTM.AuthenticationUsernameMatching=認証ユーザ名パターン:
-DCTM.CaseInsensitive=大/小文字を区別しない
-DCTM.CaseSensitive=大/小文字を区別
-DCTM.UseSystemAcls=システムACLを利用:
-DCTM.DontUseSystemAcls=システムACLを使わない
-DCTM.certificate=証明書
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=最大ドキュメント長にはnull又は整数を入力してください
-DCTM.SelectAFolderFirst=フォルダを選択してください
-DCTM.NullTokensNotAllowed=トークンを入力してください
-DCTM.EnterASpecificationFirst=パターンを入力してください
-DCTM.SpecificationMustBeValidRegularExpression=パターンは正規表現で入力してください
-DCTM.DeletePath=パス # を削除
-DCTM.NoSpecificCabinetFolderPathsGiven=キャビネット/フォルダを指定してください(docbase内のすべてをスキャンします)
-DCTM.AddPath=パスを追加
-DCTM.RemoveFromPath=パスから削除
-DCTM.AddToPath=パスに追加
-DCTM.PickAFolder=-- フォルダを選択してください --
-DCTM.DeleteAccessToken=アクセストークン # を削除
-DCTM.AddAccessToken=アクセストークン
-DCTM.ServiceInterruptionOrInvalidCredentials=サーバの中断又は不正な証明書 - リポジトリコネクションを再確認してください
-DCTM.ContentLength=コンテンツ長:
-DCTM.UserMapping=ユーザマップ
-DCTM.SystemACLs=システムACL
-
-DCTM.PleaseSupplyTheNameofaDocbase=Docbase名を入力してください
-DCTM.ConnectionRequiresValidDocumentumUsername=有効なDocumentumユーザ名を入力してください
-DCTM.ConnectionRequiresPassword=パスワードを入力してください
-DCTM.SpecifyBaseWebtopURL=Please specify the base url to a webtop to serve selected documents
-
-DCTM.DocumentType=文書タイプ
-DCTM.Filters=フィルタ
-DCTM.AllMetadataQ=All metadata?
-DCTM.Metadata=メタデータ
-DCTM.SpecificMetadata=Specific metadata
-DCTM.AttributeName=属性名
-DCTM.Operation=操作
-DCTM.Value=値
-DCTM.DeleteFilter=フィルタを削除
-DCTM.NoAttributeFiltersSpecified=属性フィルタを指定してください
-DCTM.AddFilter=フィルタを追加
-DCTM.SelectAnAttributeFirst=フィルタ属性を選択してください
-DCTM.SelectAnOperation=操作を選択
-DCTM.FilterMustHaveValue=フィルタには値文字列が必要です
-DCTM.PickAnAttribute=-- 属性を選択してください --
-DCTM.PickAnOperation=-- 操作を選択してください --
-DCTM.Equals=等しい
-DCTM.NotEquals=等しくない
diff --git a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_zh_CN.properties b/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_zh_CN.properties
deleted file mode 100644
index 1cef408..0000000
--- a/connectors/documentum/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/DCTM/common_zh_CN.properties
+++ /dev/null
@@ -1,103 +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.
-
-DCTM.NoAccessTokensPresent=访问令牌不存在
-DCTM.NoAccessTokensSpecified=访问令牌未指定
-DCTM.Docbase=Docbase
-DCTM.DocbaseName=Docbase名: 
-DCTM.DocbaseUserName=Docbase用户名: 
-DCTM.DocbasePassword=Docbase密码: 
-DCTM.DocbaseDomain=Docbase域: 
-DCTM.Webtop=Webtop
-DCTM.WebtopBaseURL=Webtop基URL
-DCTM.Parameters=参数: 
-DCTM.Paths=路径
-DCTM.DocumentTypes=文档类型
-DCTM.ContentTypes=内容类型
-DCTM.ContentLength=内容长度
-DCTM.Security=安全
-DCTM.PathMetadata=路径元数据
-DCTM.Security2=安全: 
-DCTM.PathAttributeName=路径属性名: 
-DCTM.Delete=删除
-DCTM.DeleteMapping=删除映射 #
-DCTM.NoMappingsSpecified=映射未指定
-DCTM.Add=添加
-DCTM.AddToMappings=添加到映射
-DCTM.MatchRegexp=匹配正则表达式: 
-DCTM.ReplaceString=替换字符串: 
-DCTM.CabinetFolderPaths=档案柜/文件夹路径: 
-DCTM.NoCabinetFolderPathsSpecified=档案柜/文件夹路径未指定(扫描所有docbase)
-DCTM.ObjectTypes=对象类型: 
-DCTM.allMetadataAttributes=(所有元数据属性)
-DCTM.NoDocumentTypesSpecified=文档类型未指定
-DCTM.ContentTypes2=内容类型: 
-DCTM.NoMimeTypesSpecified=MIME类型未指定 - 读取所有
-DCTM.MaximumDocumentLength=最大文档长度: 
-DCTM.AccessTokens=访问令牌: 
-DCTM.PathNameMetadataAttribute=路径名元数据属性: 
-DCTM.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-DCTM.PathValueMapping=路径值映射: 
-DCTM.NoMappingsSpecified=映射未指定
-DCTM.PleaseSupplyTheNameOfADocbase=请输入Docbase名
-DCTM.TheConnectionRequiresAValidDocumentumUserName=请输入Documentum用户名
-DCTM.TheConnectionRequiresTheDocumentumUsersPassword=请输入Documentum密码
-DCTM.AuthenticationUsernameMatching=认证用户名匹配: 
-DCTM.CaseInsensitive=不区分大小写
-DCTM.CaseSensitive=区分大小写
-DCTM.UseSystemAcls=使用系统ACL: 
-DCTM.DontUseSystemAcls=不使用系统ACL
-DCTM.certificate=证书
-DCTM.MaximumDocumentLengthMustBeNullOrAnInteger=最大文档长度必须为Null或整数
-DCTM.SelectAFolderFirst=请先选择文件夹
-DCTM.NullTokensNotAllowed=请输入令牌
-DCTM.EnterASpecificationFirst=请先输入规范
-DCTM.SpecificationMustBeValidRegularExpression=规范必须为有效的正则表达式
-DCTM.DeletePath=删除路径:  #
-DCTM.NoSpecificCabinetFolderPathsGiven=档案柜/文件夹未指定(扫描所有docbase)
-DCTM.AddPath=添加路径
-DCTM.RemoveFromPath=从路径删除
-DCTM.AddToPath=添加到路径
-DCTM.PickAFolder=-- 请选择文件夹 --
-DCTM.DeleteAccessToken=删除访问令牌:  #
-DCTM.AddAccessToken=添加访问令牌
-DCTM.ServiceInterruptionOrInvalidCredentials=服务器中断或无效证书 - 请重新检查存储库连接
-DCTM.ContentLength=内容长度:
-DCTM.UserMapping=用户映射
-DCTM.SystemACLs=系统ACL
-
-DCTM.PleaseSupplyTheNameofaDocbase=Please supply the name of a Docbase
-DCTM.ConnectionRequiresValidDocumentumUsername=The connection requires a valid Documentum user name
-DCTM.ConnectionRequiresPassword=The connection requires the Documentum user's password
-DCTM.SpecifyBaseWebtopURL=Please specify the base url to a webtop to serve selected documents
-
-DCTM.DocumentType=Document type
-DCTM.Filters=Filters
-DCTM.AllMetadataQ=All metadata?
-DCTM.Metadata=Metadata
-DCTM.SpecificMetadata=Specific metadata
-DCTM.AttributeName=Attribute name
-DCTM.Operation=Operation
-DCTM.Value=Value
-DCTM.DeleteFilter=Delete filter
-DCTM.NoAttributeFiltersSpecified=No attribute filters specified
-DCTM.AddFilter=Add filter
-DCTM.SelectAnAttributeFirst=Select a filter attribute first
-DCTM.SelectAnOperation=Select an operation
-DCTM.FilterMustHaveValue=Filter must have a value string
-DCTM.PickAnAttribute=-- Select an attribute --
-DCTM.PickAnOperation=-- Pick an operation --
-DCTM.Equals=equals
-DCTM.NotEquals=not equals
diff --git a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumFactoryImpl.java b/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumFactoryImpl.java
deleted file mode 100644
index 0c07fc7..0000000
--- a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumFactoryImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: DocumentumFactoryImpl.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-import java.rmi.server.UnicastRemoteObject;
-import java.util.*;
-
-/** This class mints IDocumentum objects for clients, and does nothing else at all.
-*/
-public class DocumentumFactoryImpl extends UnicastRemoteObject implements IDocumentumFactory
-{
-  public static final String _rcsid = "@(#)$Id: DocumentumFactoryImpl.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Instantiate */
-  public DocumentumFactoryImpl()
-    throws RemoteException
-  {
-    super(0,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-  }
-
-  /** Mint a new IDocumentum handle.
-  */
-  public IDocumentum make()
-    throws RemoteException
-  {
-    return new DocumentumImpl();
-  }
-}
diff --git a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumImpl.java b/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumImpl.java
deleted file mode 100644
index 75332cd..0000000
--- a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumImpl.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/* $Id: DocumentumImpl.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-import java.rmi.server.UnicastRemoteObject;
-import com.documentum.fc.client.*;
-import com.documentum.fc.common.*;
-import com.documentum.com.*;
-import java.util.*;
-
-/** This class abstracts away from the documentum methods necessary to "do things" that
-* the crawler or authority needs to be done with the Documentum repository.  The purpose for breaking this
-* out is to permit the Documentum invocation to be RMI based, because it keeps segfaulting on us.
-*
-* One of the tricks needed is to preserve session.  This is handled at this level by explicitly passing a
-* session string around.  The session string is created on the remote JVM, and is subsequently used to describe
-* the individual session we care about from the client side.
-*/
-public class DocumentumImpl extends UnicastRemoteObject implements IDocumentum
-{
-  public static final String _rcsid = "@(#)$Id: DocumentumImpl.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // All the parameters we need to set up a session
-  protected String docBaseName = null;
-  protected String userName = null;
-  protected String password = null;
-  protected String domain = null;
-
-  // This is the session manager
-  protected IDfSessionManager sessionManager = null;
-  // This is the DFC session; it may be null, or it may be set.
-  protected IDfSession session = null;
-
-  /** Instantiate */
-  public DocumentumImpl()
-    throws RemoteException
-  {
-    super(0,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-  }
-
-  /** Get a DFC session.  This will be done every time it is needed.
-  */
-  protected IDfSession getSession()
-    throws DocumentumException
-  {
-    if (session == null)
-    {
-      // Retry 5 times, with a one-second wait between attempts
-      int retryCount = 5;
-      while (true)
-      {
-        performSessionCreate();
-        if (session == null || !session.isConnected())
-        {
-          if (retryCount == 0)
-            throw new DocumentumException("Connection attempt failed!");
-          retryCount--;
-          try
-          {
-            Integer x = new Integer(0);
-            synchronized (x)
-            {
-              x.wait(1000L);
-            }
-          }
-          catch (InterruptedException e)
-          {
-          }
-          continue;
-        }
-        break;
-      }
-    }
-    return session;
-  }
-
-  /** Create a session.
-  *@param userName is the username to use to establish the session.
-  *@param password is the password to use to establish the session.
-  *@param domain is the domain to use to establish the session.
-  */
-  public void createSession(String docBaseName, String userName, String password, String domain)
-    throws DocumentumException, RemoteException
-  {
-    this.docBaseName = docBaseName;
-    this.userName = userName;
-    this.password = password;
-    this.domain = domain;
-
-    performSessionCreate();
-  }
-
-  /** Do the work of creating a session instance from scratch.
-  */
-  protected void performSessionCreate()
-    throws DocumentumException
-  {
-    try
-    {
-      IDfClientX clientx = new DfClientX();
-      IDfClient client = clientx.getLocalClient();
-
-      //create a Session Manager object
-      IDfSessionManager localSessionManager = client.newSessionManager();
-
-      //create an IDfLoginInfo object named loginInfoObj
-      IDfLoginInfo loginInfoObj = clientx.getLoginInfo();
-      loginInfoObj.setUser(userName);
-      loginInfoObj.setPassword(password);
-      if (domain != null)
-        loginInfoObj.setDomain(domain);
-
-      //bind the Session Manager to the login info
-      localSessionManager.setIdentity(docBaseName, loginInfoObj);
-
-      //create a session using getSession;
-      // NOTE: this will reuse a released session or create a new one
-      session = localSessionManager.getSession(docBaseName);
-      sessionManager = localSessionManager;
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-
-  /** Delete a session.
-  */
-  public void destroySession()
-    throws DocumentumException, RemoteException
-  {
-    if (session != null)
-    {
-      sessionManager.release(session);
-      if (!session.isConnected())
-      {
-        // Successfully disconnected...
-      }
-      // Regardless of what happened, clean up
-      session = null;
-      sessionManager = null;
-    }
-  }
-
-  /** Check if there is a working connection.
-  */
-  public void checkConnection()
-    throws DocumentumException, RemoteException
-  {
-    // Simple call that requires that a session actually be established (I hope)
-    getDocbaseName();
-  }
-
-
-  /** Read the docbase name based on the session.
-  */
-  public String getDocbaseName()
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      return objIDfSession.getDocbaseName();
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Get the server version.
-  */
-  public String getServerVersion()
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      return objIDfSession.getServerVersion();
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Get the current session id.
-  */
-  public String getSessionId()
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      return objIDfSession.getSessionId();
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Perform a DQL query.  What comes back from this is the equivalent of a DFC collection,
-  * which I've represented as an interface that reads a resultset-like object in a streamed manner.
-  *@param dql is the query that is to be fired off.
-  *@return a resultset.  This differs somewhat from the documentum convention in that it is
-  * ALWAYS returned, even if it is empty.
-  */
-  public IDocumentumResult performDQLQuery(String dql)
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      IDfQuery objIDfQuery = new DfQuery();
-      objIDfQuery.setDQL(dql);
-      // Documentum seems to ignore this, but set it anyway in case they fix it.
-      objIDfQuery.setBatchSize(2048);
-      return new DocumentumResultImpl(objIDfQuery.execute(objIDfSession, IDfQuery.DF_EXECREAD_QUERY));
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Get a documentum object, by qualification.  The qualification is a DQL query part.  The
-  * returned object has properties as described by the methods of IDocumentumObject.
-  */
-  public IDocumentumObject getObjectByQualification(String dql)
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      return new DocumentumObjectImpl(objIDfSession,objIDfSession.getObjectByQualification(dql));
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException dfe)
-    {
-      // Can't decide what to do without looking at the exception text.
-      // This is crappy but it's the best we can manage, apparently.
-      String errorMessage = dfe.getMessage();
-      if (errorMessage.indexOf("[DM_CONTENT_E_CANT_START_PULL]") != -1)
-      {
-        // It's probably not a transient error.  Report it as an access violation, even though it
-        // may well not be.  We don't have much info as to what's happening.
-        throw new DocumentumException(dfe.getMessage(),DocumentumException.TYPE_NOTALLOWED);
-      }
-      else if (errorMessage.indexOf("[DM_OBJECT_E_LOAD_INVALID_STRING_LEN]") != -1 ||
-        errorMessage.indexOf("[DM_PLATFORM_E_INTEGER_CONVERSION_ERROR]") != -1)
-      {
-        throw new DocumentumException(dfe.getMessage(),DocumentumException.TYPE_CORRUPTEDDOCUMENT);
-      }
-      // Treat it as transient, and retry
-      throw new DocumentumException(dfe.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-      //throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-
-  }
-
-  /** Get folder contents */
-  public IDocumentumResult getFolderContents(String folderPath)
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      IDfFolder objTheParentFolderNode = (IDfFolder) objIDfSession.getObjectByPath(folderPath);
-      if (objTheParentFolderNode == null)
-      {
-        return new DocumentumResultImpl(null);
-      }
-
-      return new DocumentumResultImpl(objTheParentFolderNode.getContents(null));
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Check if an object type is equal to or is a subtype of any one of a set of other object types.
-  */
-  public boolean isOneOf(String theType, String[] matchTypeSet)
-    throws DocumentumException, RemoteException
-  {
-    IDfSession objIDfSession = getSession();
-    try
-    {
-      IDfType typeDescription = objIDfSession.getType(theType);
-      int i = 0;
-      while (i < matchTypeSet.length)
-      {
-        String matchType = matchTypeSet[i++];
-        if (matchType.equalsIgnoreCase(theType))
-          return true;
-        if (typeDescription.isSubTypeOf(matchType))
-          return true;
-      }
-      return false;
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Build a DQL date string from a long timestamp */
-  public String buildDateString(long timestamp)
-    throws RemoteException
-  {
-    return "date('"+new DfTime(new Date(timestamp)).asString(IDfTime.DF_TIME_PATTERN44)+"','"+IDfTime.DF_TIME_PATTERN44+"')";
-  }
-
-
-}
diff --git a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumObjectImpl.java b/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumObjectImpl.java
deleted file mode 100644
index c1596b4..0000000
--- a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumObjectImpl.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/* $Id: DocumentumObjectImpl.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-import java.rmi.server.UnicastRemoteObject;
-import com.documentum.fc.client.*;
-import com.documentum.fc.common.*;
-import java.util.*;
-
-/** This represents the limited equivalent of an IDfSysObject, containing only the properties that the crawler code
-* needs to do its job.
-*/
-public class DocumentumObjectImpl extends UnicastRemoteObject implements IDocumentumObject
-{
-  public static final String _rcsid = "@(#)$Id: DocumentumObjectImpl.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Reference to the sysobject */
-  protected IDfPersistentObject object;
-  /** Reference to the session (for fetching more stuff when we need it) */
-  protected IDfSession session;
-
-  /** Constructor */
-  public DocumentumObjectImpl(IDfSession session, IDfPersistentObject object)
-    throws RemoteException
-  {
-    super(0,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-    this.session = session;
-    this.object = object;
-  }
-
-  /** Release the object */
-  public void release()
-    throws RemoteException
-  {
-    object = null;
-    session = null;
-  }
-
-  /** Does the object exist? */
-  public boolean exists()
-    throws DocumentumException, RemoteException
-  {
-    return (object!=null);
-  }
-
-  /** Get the object identifier */
-  public String getObjectId()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return object.getObjectId().toString();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the object name */
-  public String getObjectName()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getObjectName();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the object's content type */
-  public String getContentType()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getContentType();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the ACL domain */
-  public String getACLDomain()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getACLDomain();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the ACL name */
-  public String getACLName()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getACLName();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Check if object is deleted */
-  public boolean isDeleted()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return object.isDeleted();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Check if object is hidden */
-  public boolean isHidden()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).isHidden();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get object's permit level */
-  public int getPermit()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getPermit();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get object's content size */
-  public long getContentSize()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getContentSize();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get object's page count */
-  public int getPageCount()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getPageCount();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the object's version label */
-  public String getVersionLabel()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      String versionLabel;
-      IDfVersionPolicy policy = ((IDfSysObject)object).getVersionPolicy();
-      if (policy != null)
-      {
-        versionLabel = policy.getSameLabel();
-        if (versionLabel == null)
-          versionLabel = "";
-      }
-      else
-        versionLabel = "";
-
-      return versionLabel;
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-
-  /** Get object type name */
-  public String getTypeName()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getTypeName();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the vstamp field for the object */
-  public String getVStamp()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return object.getString("i_vstamp");
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum exception: "+e.getMessage());
-    }
-  }
-
-  /** Get the path set for the object.  This is the complete set of folder paths that lead to the object. */
-  public String[] getFolderPaths(Map pathMapCache)
-    throws DocumentumException, RemoteException
-  {
-    // Catch errors
-    try
-    {
-      // Get the number of folder id's that own it
-      int count = ((IDfSysObject)object).getFolderIdCount();
-      // Accumulate translated strings
-      ArrayList list = new ArrayList();
-      int i = 0;
-      while (i < count)
-      {
-        IDfId folderID = ((IDfSysObject)object).getFolderId(i++);
-        String folderIDString = folderID.getId();
-        // Look up folder's path
-        String[] folderPath = (String[])pathMapCache.get(folderIDString);
-        if (folderPath == null)
-        {
-          // Find the folder path (by loading the folder object)
-          IDfFolder folder = (IDfFolder)session.getObject(folderID);
-          if (folder == null)
-            folderPath = new String[0];
-          else
-          {
-            int folderPathCount = folder.getFolderPathCount();
-            folderPath = new String[folderPathCount];
-            int j = 0;
-            while (j < folderPathCount)
-            {
-              folderPath[j] = folder.getFolderPath(j);
-              j++;
-            }
-          }
-          pathMapCache.put(folderIDString,folderPath);
-        }
-        int j = 0;
-        while (j < folderPath.length)
-        {
-          list.add(folderPath[j++]);
-        }
-      }
-
-      String[] rval = new String[list.size()];
-      i = 0;
-      while (i < rval.length)
-      {
-        rval[i] = (String)list.get(i);
-        i++;
-      }
-      return rval;
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Write the content of the object to a file path.
-  *@param path is where the content should be written.
-  *@return the file path where the content was written. */
-  public String getFile(String path)
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfSysObject)object).getFile(path);
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException dfe)
-    {
-      // Can't decide what to do without looking at the exception text.
-      // This is crappy but it's the best we can manage, apparently.
-      String errorMessage = dfe.getMessage();
-      if (errorMessage.indexOf("[DM_CONTENT_E_CANT_START_PULL]") != -1)
-      {
-        // It's probably not a transient error.  Report it as an access violation, even though it
-        // may well not be.  We don't have much info as to what's happening.
-        throw new DocumentumException(dfe.getMessage(),DocumentumException.TYPE_NOTALLOWED);
-      }
-      else if (errorMessage.indexOf("[DM_OBJECT_E_LOAD_INVALID_STRING_LEN]") != -1 ||
-        errorMessage.indexOf("[DM_PLATFORM_E_INTEGER_CONVERSION_ERROR]") != -1)
-      {
-        throw new DocumentumException(dfe.getMessage(),DocumentumException.TYPE_CORRUPTEDDOCUMENT);
-      }
-      // Treat it as transient, and retry
-      throw new DocumentumException(dfe.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-  }
-
-  /** Get all the values that an attribute has, including multiple ones if present */
-  public String[] getAttributeValues(String attribute)
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      int valueCount = object.getValueCount(attribute);
-      String[] values = new String[valueCount];
-      int y = 0;
-      while (y < valueCount)
-      {
-        // Fetch the attribute.
-        // It's supposed to work for all attribute types...
-        String value = object.getRepeatingString(attribute,y);
-        values[y++] = value;
-      }
-      return values;
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Get a user state */
-  public int getUserState()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfUser)object).getUserState();
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Get a user's name */
-  public String getUserName()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return ((IDfUser)object).getUserName();
-    }
-    catch (DfAuthenticationException ex)
-    {
-      throw new DocumentumException("Bad credentials: "+ex.getMessage(),DocumentumException.TYPE_BADCREDENTIALS);
-    }
-    catch (DfIdentityException ex)
-    {
-      throw new DocumentumException("Bad docbase name: "+ex.getMessage(),DocumentumException.TYPE_BADCONNECTIONPARAMS);
-    }
-    catch (DfDocbaseUnreachableException e)
-    {
-      throw new DocumentumException("Docbase unreachable: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfIOException e)
-    {
-      throw new DocumentumException("Docbase io exception: "+e.getMessage(),DocumentumException.TYPE_SERVICEINTERRUPTION);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-
-}
diff --git a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumResultImpl.java b/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumResultImpl.java
deleted file mode 100644
index 9919a63..0000000
--- a/connectors/documentum/implementation/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumResultImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/* $Id: DocumentumResultImpl.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-import java.rmi.server.UnicastRemoteObject;
-import com.documentum.fc.client.*;
-import com.documentum.fc.common.*;
-
-/** This interface represents a streamed resultset from a documentum DQL
-* query. */
-public class DocumentumResultImpl extends UnicastRemoteObject implements IDocumentumResult
-{
-  public static final String _rcsid = "@(#)$Id: DocumentumResultImpl.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // The documentum collection, or null if empty
-  protected IDfCollection objIDfCollection;
-  // Whether the current row is valid
-  protected boolean isValid;
-
-  /** Constructor */
-  public DocumentumResultImpl(IDfCollection objIDfCollection)
-    throws DocumentumException, RemoteException
-  {
-    super(0,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-    this.objIDfCollection = objIDfCollection;
-    isValid = (objIDfCollection != null);
-    if (isValid)
-    {
-      try
-      {
-        isValid = objIDfCollection.next();
-      }
-      catch (DfException e)
-      {
-        throw new DocumentumException("Documentum error: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  /** Check if we are done with the resultset.
-  *@return true if there is still a valid row to read out of, or false if the list is done. */
-  public boolean isValidRow()
-    throws DocumentumException, RemoteException
-  {
-    return isValid;
-  }
-
-  /** Get a string result value */
-  public String getStringValue(String valueName)
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      return objIDfCollection.getString(valueName);
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Advance to the next row. */
-  public void nextRow()
-    throws DocumentumException, RemoteException
-  {
-    try
-    {
-      isValid = objIDfCollection.next();
-    }
-    catch (DfException e)
-    {
-      throw new DocumentumException("Documentum error: "+e.getMessage());
-    }
-  }
-
-  /** Close and release the resources for this resultset.
-  */
-  public void close()
-    throws DocumentumException, RemoteException
-  {
-    if (objIDfCollection != null)
-    {
-      try
-      {
-        objIDfCollection.close();
-        objIDfCollection = null;
-        isValid = false;
-      }
-      catch (DfException e)
-      {
-        throw new DocumentumException("Documentum error: "+e.getMessage());
-      }
-    }
-  }
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumException.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumException.java
deleted file mode 100644
index ada50df..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/DocumentumException.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id: DocumentumException.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-public class DocumentumException extends Exception
-{
-  public static final String _rcsid = "@(#)$Id: DocumentumException.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Classes of exception
-  public static final int TYPE_SERVICEINTERRUPTION = 0;
-  public static final int TYPE_BADCREDENTIALS = 1;
-  public static final int TYPE_BADCONNECTIONPARAMS = 2;
-  public static final int TYPE_NOTALLOWED = 3;
-  public static final int TYPE_GENERAL = 4;
-  public static final int TYPE_CORRUPTEDDOCUMENT = 5;
-
-  protected int errType;
-
-  public DocumentumException(String errString)
-  {
-    super(errString);
-    errType = TYPE_GENERAL;
-  }
-
-  public DocumentumException(String errString, Throwable cause)
-  {
-    super(errString,cause);
-    errType = TYPE_GENERAL;
-  }
-
-  public DocumentumException(Throwable cause)
-  {
-    super(cause);
-    errType = TYPE_GENERAL;
-  }
-
-  public DocumentumException(String errString, int errType)
-  {
-    super(errString);
-    this.errType = errType;
-  }
-
-  public DocumentumException(String errString, Throwable cause, int errType)
-  {
-    super(errString,cause);
-    this.errType = errType;
-  }
-
-  public DocumentumException(Throwable cause, int errType)
-  {
-    super(cause);
-    this.errType = errType;
-  }
-
-  public int getType()
-  {
-    return errType;
-  }
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentum.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentum.java
deleted file mode 100644
index 90cbb68..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentum.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id: IDocumentum.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-
-/** This class abstracts away from the documentum methods necessary to "do things" that
-* the crawler or authority needs to be done with the Documentum repository.  The purpose for breaking this
-* out is to permit the Documentum invocation to be RMI based, because it keeps segfaulting on us.
-*
-* One of the tricks needed is to preserve session.  This is handled at this level by explicitly passing a
-* session string around.  The session string is created on the remote JVM, and is subsequently used to describe
-* the individual session we care about from the client side.
-*/
-public interface IDocumentum extends Remote
-{
-  public static final String _rcsid = "@(#)$Id: IDocumentum.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Create a session.
-  *@param docbaseName is the name of the docbase we want to connect to.
-  *@param userName is the username to use to establish the session.
-  *@param password is the password to use to establish the session.
-  *@param domain is the domain to use to establish the session.
-  */
-  public void createSession(String docbaseName, String userName, String password, String domain)
-    throws DocumentumException, RemoteException;
-
-  /** Delete the session.
-  */
-  public void destroySession()
-    throws DocumentumException, RemoteException;
-
-  /** Check if there is a working connection.
-  */
-  public void checkConnection()
-    throws DocumentumException, RemoteException;
-
-  /** Read the docbase name based on the session.
-  */
-  public String getDocbaseName()
-    throws DocumentumException, RemoteException;
-
-  /** Get the server version.
-  */
-  public String getServerVersion()
-    throws DocumentumException, RemoteException;
-
-  /** Get the current session id.
-  */
-  public String getSessionId()
-    throws DocumentumException, RemoteException;
-
-  /** Perform a DQL query.  What comes back from this is the equivalent of a DFC collection,
-  * which I've represented as an interface that reads a resultset-like object in a streamed manner.
-  *@param dql is the query that is to be fired off.
-  *@return a resultset.  This differs somewhat from the documentum convention in that it is
-  * ALWAYS returned, even if it is empty.
-  */
-  public IDocumentumResult performDQLQuery(String dql)
-    throws DocumentumException, RemoteException;
-
-  /** Get a documentum object, by qualification.  The qualification is a DQL query part.  The
-  * returned object has properties as described by the methods of IDocumentumObject.
-  */
-  public IDocumentumObject getObjectByQualification(String dql)
-    throws DocumentumException, RemoteException;
-
-  /** Get folder contents */
-  public IDocumentumResult getFolderContents(String folderPath)
-    throws DocumentumException, RemoteException;
-
-  /** Check if an object type is equal to or is a subtype of any one of a set of other object types.
-  */
-  public boolean isOneOf(String theType, String[] matchTypeSet)
-    throws DocumentumException, RemoteException;
-
-
-  // Helper methods for building DQL queries
-
-  /** Build a DQL date string from a long timestamp */
-  public String buildDateString(long timestamp)
-    throws RemoteException;
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumFactory.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumFactory.java
deleted file mode 100644
index 64a0e1d..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id: IDocumentumFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-
-/** This interface describes a factory for producing remote IDocumentum objects under the auspices of RMI.
-* If we decide to use the Activation Framework, this interface will not be needed.  Its sole function
-* is to grab a new IDocumentum handle.
-*/
-public interface IDocumentumFactory extends Remote
-{
-  public static final String _rcsid = "@(#)$Id: IDocumentumFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Mint a new IDocumentum handle.
-  */
-  public IDocumentum make()
-    throws RemoteException;
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumObject.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumObject.java
deleted file mode 100644
index 0e4cc60..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumObject.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/* $Id: IDocumentumObject.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-import java.util.*;
-
-/** This represents the limited equivalent of an IDfSysObject, containing only the properties that the crawler code
-* needs to do its job.
-*/
-public interface IDocumentumObject extends Remote
-{
-  public static final String _rcsid = "@(#)$Id: IDocumentumObject.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Release the object */
-  public void release()
-    throws RemoteException;
-
-  /** Does the object exist? */
-  public boolean exists()
-    throws DocumentumException, RemoteException;
-
-  /** Get the object identifier */
-  public String getObjectId()
-    throws DocumentumException, RemoteException;
-
-  /** Get the object name */
-  public String getObjectName()
-    throws DocumentumException, RemoteException;
-
-  /** Get the object's content type */
-  public String getContentType()
-    throws DocumentumException, RemoteException;
-
-  /** Get the ACL domain */
-  public String getACLDomain()
-    throws DocumentumException, RemoteException;
-
-  /** Get the ACL name */
-  public String getACLName()
-    throws DocumentumException, RemoteException;
-
-  /** Check if object is deleted */
-  public boolean isDeleted()
-    throws DocumentumException, RemoteException;
-
-  /** Check if object is hidden */
-  public boolean isHidden()
-    throws DocumentumException, RemoteException;
-
-  /** Get object's permit level */
-  public int getPermit()
-    throws DocumentumException, RemoteException;
-
-  /** Get object's content size */
-  public long getContentSize()
-    throws DocumentumException, RemoteException;
-
-  /** Get object's page count */
-  public int getPageCount()
-    throws DocumentumException, RemoteException;
-
-  /** Get the object's version label */
-  public String getVersionLabel()
-    throws DocumentumException, RemoteException;
-
-  /** Get object type name */
-  public String getTypeName()
-    throws DocumentumException, RemoteException;
-
-  /** Get the vstamp field for the object */
-  public String getVStamp()
-    throws DocumentumException, RemoteException;
-
-  /** Get the path set for the object.  This is the complete set of folder paths that lead to the object. */
-  public String[] getFolderPaths(Map pathMapCache)
-    throws DocumentumException, RemoteException;
-
-  /** Write the content of the object to a file path.
-  *@param path is where the content should be written.
-  *@return the file path where the content was written. */
-  public String getFile(String path)
-    throws DocumentumException, RemoteException;
-
-  /** Get all the values that an attribute has, including multiple ones if present */
-  public String[] getAttributeValues(String attribute)
-    throws DocumentumException, RemoteException;
-
-  /** Get a user state */
-  public int getUserState()
-    throws DocumentumException, RemoteException;
-
-  /** Get a user's name */
-  public String getUserName()
-    throws DocumentumException, RemoteException;
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumResult.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumResult.java
deleted file mode 100644
index ec66340..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/IDocumentumResult.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* $Id: IDocumentumResult.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.*;
-
-/** This interface represents a streamed resultset from a documentum DQL
-* query. */
-public interface IDocumentumResult extends Remote
-{
-  public static final String _rcsid = "@(#)$Id: IDocumentumResult.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Check if we are done with the resultset.
-  *@return true if there is still a valid row to read out of, or false if the list is done. */
-  public boolean isValidRow()
-    throws DocumentumException, RemoteException;
-
-  /** Get a string result value */
-  public String getStringValue(String valueName)
-    throws DocumentumException, RemoteException;
-
-  /** Advance to the next row. */
-  public void nextRow()
-    throws DocumentumException, RemoteException;
-
-  /** Close and release the resources for this resultset.
-  */
-  public void close()
-    throws DocumentumException, RemoteException;
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/LocalClientSocket.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/LocalClientSocket.java
deleted file mode 100644
index a0814c1..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/LocalClientSocket.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $Id: LocalClientSocket.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.server.*;
-import java.net.*;
-import java.io.IOException;
-
-/** This class wraps Socket and does not permit it to be directed to connect anywhere other than to localhost.
-*/
-public class LocalClientSocket extends Socket
-{
-  public static final String _rcsid = "@(#)$Id: LocalClientSocket.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected static InetAddress loopbackAddress;
-
-  static
-  {
-    try
-    {
-      loopbackAddress = InetAddress.getByAddress(new byte[]{127,0,0,1});
-    }
-    catch (UnknownHostException e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  protected int currentPort;
-
-  /** Constructor */
-  public LocalClientSocket(int port)
-    throws IOException
-  {
-    super(loopbackAddress,port);
-    currentPort = port;
-  }
-
-  public void connect(SocketAddress endpoint)
-    throws IOException
-  {
-    int thisPort = currentPort;
-    if (endpoint instanceof InetSocketAddress)
-      thisPort = ((InetSocketAddress)endpoint).getPort();
-    endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-    super.connect(endpoint);
-  }
-
-  public void connect(SocketAddress endpoint, int timeout)
-    throws IOException
-  {
-    int thisPort = currentPort;
-    if (endpoint instanceof InetSocketAddress)
-      thisPort = ((InetSocketAddress)endpoint).getPort();
-    endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-    super.connect(endpoint,timeout);
-  }
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/RMILocalClientSocketFactory.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/RMILocalClientSocketFactory.java
deleted file mode 100644
index 54361ef..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/RMILocalClientSocketFactory.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id: RMILocalClientSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.server.*;
-import java.net.*;
-import java.io.IOException;
-
-/** This factory mints client-side sockets.  I've created one so the $%^&* rmi world doesn't attempt
-* to connect to anything other than localhost (127.0.0.1).
-*/
-public class RMILocalClientSocketFactory implements RMIClientSocketFactory, java.io.Serializable
-{
-  public static final String _rcsid = "@(#)$Id: RMILocalClientSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Constructor */
-  public RMILocalClientSocketFactory()
-  {
-  }
-
-  /** The method that mints a socket of the right kind.
-  */
-  public Socket createSocket(String host, int port)
-    throws IOException
-  {
-    return new LocalClientSocket(port);
-  }
-
-  /** The contract makes us implement equals and hashcode */
-  public boolean equals(Object o)
-  {
-    return (o instanceof RMILocalClientSocketFactory);
-  }
-
-  /** Hashcode consistent with equals() */
-  public int hashCode()
-  {
-    // All classes of this kind have the same number (randomly picked)
-    return 258474;
-  }
-
-
-}
diff --git a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/RMILocalSocketFactory.java b/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/RMILocalSocketFactory.java
deleted file mode 100644
index e8f2c1b..0000000
--- a/connectors/documentum/interface/src/main/java/org/apache/manifoldcf/crawler/common/DCTM/RMILocalSocketFactory.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id: RMILocalSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.DCTM;
-
-import java.rmi.server.*;
-import java.net.*;
-import java.io.IOException;
-
-/** This class is the main server class, which gets run to start the rmi service that talks to Documentum.
-*/
-public class RMILocalSocketFactory implements RMIServerSocketFactory
-{
-  public static final String _rcsid = "@(#)$Id: RMILocalSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected static InetAddress loopbackAddress;
-
-  static
-  {
-    try
-    {
-      loopbackAddress = InetAddress.getByAddress(new byte[]{127,0,0,1});
-    }
-    catch (UnknownHostException e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  /** Create a socket attached to the specified port.  0 means an anonymous port. */
-  public ServerSocket createServerSocket(int port)
-    throws IOException
-  {
-    return new LocalServerSocket(port);
-  }
-
-  /** The contract makes us implement equals and hashcode */
-  public boolean equals(Object o)
-  {
-    return (o instanceof RMILocalSocketFactory);
-  }
-
-  /** Hashcode consistent with equals() */
-  public int hashCode()
-  {
-    // All classes of this kind have the same number (randomly picked)
-    return 258473;
-  }
-
-  /** This is a localhost-bound implementation of ServerSocket */
-  protected static class LocalServerSocket extends ServerSocket
-  {
-    protected int currentPort;
-
-    /** Constructor.  We only use the one, so the rest are immaterial. */
-    public LocalServerSocket(int port)
-      throws IOException
-    {
-      super(port);
-      currentPort = port;
-    }
-
-    /** Override the bind operation, to make sure we only bind to localhost */
-    public void bind(java.net.SocketAddress endpoint)
-      throws IOException
-    {
-      int thisPort = currentPort;
-      if (endpoint instanceof InetSocketAddress)
-        thisPort = ((InetSocketAddress)endpoint).getPort();
-      endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-      super.bind(endpoint);
-    }
-
-    /** Override the bind operation, to make sure we only bind to localhost */
-    public void bind(java.net.SocketAddress endpoint, int backlog)
-      throws IOException
-    {
-      int thisPort = currentPort;
-      if (endpoint instanceof InetSocketAddress)
-        thisPort = ((InetSocketAddress)endpoint).getPort();
-      endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-      super.bind(endpoint,backlog);
-    }
-  }
-}
diff --git a/connectors/documentum/lib-proprietary/README.txt b/connectors/documentum/lib-proprietary/README.txt
deleted file mode 100644
index 0285aab..0000000
--- a/connectors/documentum/lib-proprietary/README.txt
+++ /dev/null
@@ -1,40 +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.
-
-Portions of this package (namely, the documentum-server process) depend on the
-Documentum Foundation Classes.  DFC does not in general change their API much
-between revs, but the underlying software may change quite a bit, and the versions
-of Documentum that will work with each revision also change (as would be expected).
-
-In order to build all the classes and processes for this connector, you must install a
-version of Documentum's DFC on your system, and then locate the pertinent jars.
-The jars are described in the included Makefile.  Bear in mind that DFC has a JNI
-component as well, so the actual documentum-server process must include access
-to the appropriate dll's or so's in order to be functional.  This is accomplished by setting
-an environment variable before running the scripts that start the ManifoldCF
-documentum connector server process.  Read the "how-to-build-and-deploy.html"
-document for details.
-
-Copy all the jars that are needed to run your version of DFC into this directory, and
-the normal connector build should create all the artifacts you need to run the connector.
-
-The code that's included here was tested against DFC 5.3.5 SP2.
-
-
-
-
-
-
-
diff --git a/connectors/documentum/registry-scripts/run.bat b/connectors/documentum/registry-scripts/run.bat
deleted file mode 100644
index b354bed..0000000
--- a/connectors/documentum/registry-scripts/run.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME and MCF_HOME are set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist "%MCF_HOME%\properties.xml" goto nolcfhome

-rem save existing path here

-set OLDDIR=%CD%

-cd "%MCF_HOME%\..\processes\documentum-registry"

-set CLASSPATH=.

-for %%f in (lib/*) do call setclasspath.bat %%f

-rem restore old path here

-cd "%OLDDIR%"

-"%JAVA_HOME%\bin\java" -Xmx32m -Xms32m -classpath "%CLASSPATH%" org.apache.manifoldcf.crawler.registry.DCTM.DCTM

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Environment variable MCF_HOME is not set properly.

-goto done

-:done

diff --git a/connectors/documentum/registry-scripts/run.sh b/connectors/documentum/registry-scripts/run.sh
deleted file mode 100644
index 8b4f912..0000000
--- a/connectors/documentum/registry-scripts/run.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    PATHSEP=";"
-else
-    PATHSEP=":"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f "$MCF_HOME"/properties.xml ] ; then
-    
-        # Build the classpath
-        CLASSPATH=""
-        for filename in $(ls -1 "$MCF_HOME"/../processes/documentum-registry/lib) ; do
-            if [ -n "$CLASSPATH" ] ; then
-                CLASSPATH="$CLASSPATH""$PATHSEP""$MCF_HOME"/../processes/documentum-registry/lib/"$filename"
-            else
-                CLASSPATH="$MCF_HOME"/../processes/documentum-registry/lib/"$filename"
-            fi
-        done
-        
-        "$JAVA_HOME/bin/java" -Xmx32m -Xms32m -cp "$CLASSPATH" org.apache.manifoldcf.crawler.registry.DCTM.DCTM
-        exit $?
-        
-    else
-        echo "Environment variable MCF_HOME is not properly set." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/connectors/documentum/registry-scripts/setclasspath.bat b/connectors/documentum/registry-scripts/setclasspath.bat
deleted file mode 100644
index 8d20a00..0000000
--- a/connectors/documentum/registry-scripts/setclasspath.bat
+++ /dev/null
@@ -1,16 +0,0 @@
-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-set CLASSPATH=%CLASSPATH%;%MCF_HOME%\..\processes\documentum-registry\lib\%1

diff --git a/connectors/documentum/registry/src/main/java/org/apache/manifoldcf/crawler/registry/DCTM/DCTM.java b/connectors/documentum/registry/src/main/java/org/apache/manifoldcf/crawler/registry/DCTM/DCTM.java
deleted file mode 100644
index a7f09df..0000000
--- a/connectors/documentum/registry/src/main/java/org/apache/manifoldcf/crawler/registry/DCTM/DCTM.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id: DCTM.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.registry.DCTM;
-
-import java.rmi.*;
-import org.apache.manifoldcf.crawler.common.DCTM.RMILocalSocketFactory;
-import org.apache.manifoldcf.crawler.common.DCTM.RMILocalClientSocketFactory;
-
-/** This class is the main registry class, which gets run to start the registry service that handles Documentum server communication.
-* I needed to create my own since the rmiregistry utility did not let me override the java security policy.
-*/
-public class DCTM
-{
-  public static final String _rcsid = "@(#)$Id: DCTM.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DCTM()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    try
-    {
-      java.rmi.registry.Registry r = java.rmi.registry.LocateRegistry.createRegistry(8300,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-      // Registry started OK
-      System.out.println("Documentum Registry started and awaiting connections.");
-      // Sleep forever, until process is externally terminated
-      while (true)
-      {
-        Thread.sleep(10000L);
-      }
-    }
-    catch (InterruptedException e)
-    {
-    }
-    catch (RemoteException er)
-    {
-      System.err.println("Remote exception in DCTM.main: " + er);
-      er.printStackTrace(System.err);
-    }
-  }
-}
diff --git a/connectors/documentum/server-scripts/run.bat b/connectors/documentum/server-scripts/run.bat
deleted file mode 100644
index bbbe141..0000000
--- a/connectors/documentum/server-scripts/run.bat
+++ /dev/null
@@ -1,45 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME and MCF_HOME are set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist "%MCF_HOME%\properties.xml" goto nolcfhome

-rem TODO: Check this on a windows system!

-if exist "%DOCUMENTUM%\dmcl.ini" goto dctmhomefound

-if not exist "%DOCUMENTUM%\dfc.properties" goto nodctmhome

-:dctmhomefound

-rem save existing path here

-set OLDDIR=%CD%

-cd "%MCF_HOME%\..\processes\documentum-server"

-set CLASSPATH=.

-for %%f in (lib/*) do call setclasspath.bat %%f lib

-for %%f in (lib-proprietary/*.jar) do call setclasspath.bat %%f lib-proprietary

-rem restore old path here

-cd "%OLDDIR%"

-set LIB_STATEMENT=

-if defined JAVA_LIB_PATH set LIB_STATEMENT="-Djava.library.path=%JAVA_LIB_PATH%"

-"%JAVA_HOME%\bin\java" -Xmx512m -Xms32m %LIB_STATEMENT% -classpath "%CLASSPATH%" org.apache.manifoldcf.crawler.server.DCTM.DCTM

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Environment variable MCF_HOME is not set properly.

-goto done

-:nodctmhome

-echo Environment variable DOCUMENTUM is not set properly.

-goto done

-:done

diff --git a/connectors/documentum/server-scripts/run.sh b/connectors/documentum/server-scripts/run.sh
deleted file mode 100644
index 2230726..0000000
--- a/connectors/documentum/server-scripts/run.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    PATHSEP=";"
-else
-    PATHSEP=":"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f "$MCF_HOME"/properties.xml ] ; then
-        # TODO: Check this on both Windows and Redhat
-        if [ -f "$DOCUMENTUM"/dmcl.ini -o -f "$DOCUMENTUM"/dfc.properties ] ; then
-    
-            # Build the classpath
-            CLASSPATH=""
-            for filename in $(ls -1 "$MCF_HOME"/../processes/documentum-server/lib) ; do
-                if [ -n "$CLASSPATH" ] ; then
-                    CLASSPATH="$CLASSPATH""$PATHSEP""$MCF_HOME"/../processes/documentum-server/lib/"$filename"
-                else
-                    CLASSPATH="$MCF_HOME"/../processes/documentum-server/lib/"$filename"
-                fi
-            done
-
-            for filename in $(ls -1 "$MCF_HOME"/../processes/documentum-server/lib-proprietary | grep "\.jar$") ; do
-                if [ -n "$CLASSPATH" ] ; then
-                    CLASSPATH="$CLASSPATH""$PATHSEP""$MCF_HOME"/../processes/documentum-server/lib-proprietary/"$filename"
-                else
-                    CLASSPATH="$MCF_HOME"/../processes/documentum-server/lib-proprietary/"$filename"
-                fi
-            done
-
-            LIB_STATEMENT=""
-            if [[ $JAVA_LIB_PATH != "" ]] ; then
-                LIB_STATEMENT=-Djava.library.path="$JAVA_LIB_PATH"
-            fi
-            "$JAVA_HOME/bin/java" -Xmx512m -Xms32m $LIB_STATEMENT -cp "$CLASSPATH" org.apache.manifoldcf.crawler.server.DCTM.DCTM
-            exit $?
-        else
-            echo "Environment variable DOCUMENTUM is not properly set." 1>&2
-            exit 1
-        fi      
-
-    else
-        echo "Environment variable MCF_HOME is not properly set." 1>&2
-        exit 1
-    fi    
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/connectors/documentum/server-scripts/setclasspath.bat b/connectors/documentum/server-scripts/setclasspath.bat
deleted file mode 100644
index 724e18a..0000000
--- a/connectors/documentum/server-scripts/setclasspath.bat
+++ /dev/null
@@ -1,16 +0,0 @@
-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-set CLASSPATH=%CLASSPATH%;%MCF_HOME%\..\processes\documentum-server\%2\%1

diff --git a/connectors/documentum/server/README.txt b/connectors/documentum/server/README.txt
deleted file mode 100644
index 8085ccc..0000000
--- a/connectors/documentum/server/README.txt
+++ /dev/null
@@ -1,39 +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.
-
-The documentum-server process depends on the Documentum Foundation Classes.
-
-In order to run the documentum-server process, you must install a
-version of Documentum's DFC on your system, and then locate the pertinent jars.
-Copy all the jars that are needed to run your version of DFC into this directory, and
-start the process using the supplied "run" scripts.
-
-Remember that DFC has a JNI component as well, so the process must include access
-to the appropriate dll's or so's in order to be functional.  This is accomplished by setting
-an environment variable before running the scripts that start the ManifoldCF
-documentum connector server process.
-
-If you find there are incompatibilities between your version of DFC and the one your
-ManifoldCF release was built against, you must build ManifoldCF yourself, and include
-a copy of DFC prior to building, in the directory connectors/documentum/lib-proprietary.
-
-Read the "how-to-build-and-deploy.html" document for details.
-
-
-
-
-
-
-
diff --git a/connectors/documentum/server/src/main/java/org/apache/manifoldcf/crawler/server/DCTM/DCTM.java b/connectors/documentum/server/src/main/java/org/apache/manifoldcf/crawler/server/DCTM/DCTM.java
deleted file mode 100644
index 31f319d..0000000
--- a/connectors/documentum/server/src/main/java/org/apache/manifoldcf/crawler/server/DCTM/DCTM.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id: DCTM.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.server.DCTM;
-
-import java.rmi.*;
-import org.apache.manifoldcf.crawler.common.DCTM.*;
-import java.net.*;
-
-/** This class is the main server class, which gets run to start the rmi service that talks to Documentum.
-*/
-public class DCTM
-{
-  public static final String _rcsid = "@(#)$Id: DCTM.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DCTM()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    try
-    {
-      DocumentumFactoryImpl factory = new DocumentumFactoryImpl();
-      Naming.rebind("//127.0.0.1:8300/documentum_factory", factory);
-      // sets the handle
-      System.out.println("Documentum Server started and awaiting connections.");
-      while (true)
-      {
-        Thread.sleep(600000L);
-      }
-    }
-    catch (InterruptedException e)
-    {
-    }
-    catch (RemoteException er)
-    {
-      System.err.println("Remote exception in DCTM.main: " + er);
-      er.printStackTrace(System.err);
-    }
-    catch (MalformedURLException er)
-    {
-      System.err.println("Exception in DCTM.main: " + er);
-      er.printStackTrace(System.err);
-    }
-
-  }
-}
diff --git a/connectors/dropbox/.gitignore b/connectors/dropbox/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/dropbox/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/dropbox/build.xml b/connectors/dropbox/build.xml
deleted file mode 100644
index e922489..0000000
--- a/connectors/dropbox/build.xml
+++ /dev/null
@@ -1,56 +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.

--->

-

-<project name="dropbox" default="all">

-

-    <property environment="env"/>

-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">

-        <isset property="env.MCFDISTPATH"/>

-    </condition>

-    <property name="abs-dist" location="../../dist"/>

-    <condition property="mcf-dist" value="${abs-dist}">

-        <not>

-            <isset property="env.MCFDISTPATH"/>

-        </not>

-    </condition>

-

-    <import file="${mcf-dist}/connector-build.xml"/>

-

-    <path id="connector-classpath">

-        <path refid="mcf-connector-build.connector-classpath"/>

-        <fileset dir="../../lib">

-            <include name="dropbox-client*.jar"/>

-        </fileset>

-    </path>

-

-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">

-        <mkdir dir="dist/lib"/>

-        <copy todir="dist/lib">

-            <fileset dir="../../lib">

-                <include name="dropbox*.jar"/>

-            </fileset>

-        </copy>

-    </target>

-

-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">

-        <antcall target="general-add-repository-connector">

-            <param name="connector-label" value="DropBox"/>

-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.dropbox.DropboxRepositoryConnector"/>

-        </antcall>

-    </target>

-

-</project>

diff --git a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxConfig.java b/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxConfig.java
deleted file mode 100644
index c33e3f8..0000000
--- a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxConfig.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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.
-*/
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.apache.manifoldcf.crawler.connectors.dropbox;
-
-/**
- *
- * @author andrew
- */
-public class DropboxConfig {
-     
-  /** Username */
-  public static final String KEY_PARAM = "key";
- 
-  /** Password */
-  public static final String SECRET_PARAM = "secret";
-  
-  
-   public static final String APP_KEY_PARAM = "app_key";
- 
-  /** Password */
-  public static final String APP_SECRET_PARAM = "app_secret";
-
-  
-  /** CMIS Repository Id */
-  public static final String REPOSITORY_ID_PARAM = "repositoryId";
-  
-  //default values
-  public static final String PATH_DEFAULT_VALUE = "/";
-  public static final String REPOSITORY_ID_DEFAULT_VALUE = "dropbox";
-  
-  public static final String DROPBOX_PATH_PARAM = "dropboxpath";
-  public static final String DROPBOX_PATH_PARAM_DEFAULT_VALUE = "/";
-  
-}
diff --git a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java b/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java
deleted file mode 100644
index 65209d1..0000000
--- a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java
+++ /dev/null
@@ -1,1261 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.dropbox;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-
-import com.dropbox.client2.DropboxAPI;
-import com.dropbox.client2.exception.DropboxException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.Iterator;
-import java.util.Date;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.log4j.Logger;
-
-/**
- *
- * @author andrew
- */
-public class DropboxRepositoryConnector extends BaseRepositoryConnector {
-
-  protected final static String ACTIVITY_READ = "read document";
-  public final static String ACTIVITY_FETCH = "fetch";
-  protected static final String RELATIONSHIP_CHILD = "child";
-  
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
-
-  // Nodes and attributes
-  private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-  private static final String JOB_PATH_ATTRIBUTE = "path";
-  private static final String JOB_ACCESS_NODE_TYPE = "access";
-  private static final String JOB_TOKEN_ATTRIBUTE = "token";
-
-  // Tab properties
-  private static final String DROPBOX_SERVER_TAB_PROPERTY = "DropboxRepositoryConnector.Server";
-  private static final String DROPBOX_PATH_TAB_PROPERTY = "DropboxRepositoryConnector.DropboxPath";
-  private static final String DROPBOX_SECURITY_TAB_PROPERTY = "DropboxRepositoryConnector.Security";
-
-  // Template names
-  
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-  /**
-   * Server tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_Server.html";
-  /**
-   * Forward to the HTML template to view the configuration parameters
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-  
-  /**
-   * Forward to the javascript to check the specification parameters for the
-   * job
-   */
-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification.js";
-  /**
-   * Forward to the template to edit the configuration parameters for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_DROPBOXPATH = "editSpecification_DropboxPath.html";
-  /**
-   * Forward to the template to edit the configuration parameters for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_SECURITY = "editSpecification_Security.html";
-  /**
-   * Forward to the template to view the specification parameters for the job
-   */
-  private static final String VIEW_SPEC_FORWARD = "viewSpecification.html";
-
-  /**
-   * Endpoint server name
-   */
-  protected String server = "dropbox";
-  protected DropboxSession session = null;
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-  
-  protected String app_key = null;
-  protected String app_secret = null;
-  protected String key = null;
-  protected String secret = null;
-
-  public DropboxRepositoryConnector() {
-    super();
-  }
-
-  /**
-   * Return the list of activities that this connector supports (i.e. writes
-   * into the log).
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[]{ACTIVITY_FETCH, ACTIVITY_READ};
-  }
-
-  /**
-   * Get the bin name strings for a document identifier. The bin name
-   * describes the queue to which the document will be assigned for throttling
-   * purposes. Throttling controls the rate at which items in a given queue
-   * are fetched; it does not say anything about the overall fetch rate, which
-   * may operate on multiple queues or bins. For example, if you implement a
-   * web crawler, a good choice of bin name would be the server name, since
-   * that is likely to correspond to a real resource that will need real
-   * throttle protection.
-   *
-   * @param documentIdentifier is the document identifier.
-   * @return the set of bin names. If an empty array is returned, it is
-   * equivalent to there being no request rate throttling available for this
-   * identifier.
-   */
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[]{server};
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (session != null) {
-      session.close();
-      session = null;
-      lastSessionFetch = -1L;
-    }
-
-    app_key = null;
-    app_secret= null;
-    key = null;
-    secret = null;
-    
-  }
-
-  /**
-   * This method create a new DROPBOX session for a DROPBOX repository, if the
-   * repositoryId is not provided in the configuration, the connector will
-   * retrieve all the repositories exposed for this endpoint the it will start
-   * to use the first one.
-   *
-   * @param configParameters is the set of configuration parameters, which in
-   * this case describe the target appliance, basic auth configuration, etc.
-   * (This formerly came out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    app_key=params.getParameter(DropboxConfig.APP_KEY_PARAM);
-    app_secret=params.getObfuscatedParameter(DropboxConfig.APP_SECRET_PARAM);
-    key = params.getParameter(DropboxConfig.KEY_PARAM);
-    secret = params.getObfuscatedParameter(DropboxConfig.SECRET_PARAM);
-    
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection
-   * integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  protected void checkConnection()
-    throws ManifoldCFException, ServiceInterruption {
-    getSession();
-    CheckConnectionThread t = new CheckConnectionThread();
-    try {
-      t.start();
-      t.join();
-      Throwable thr = t.getException();
-      if (thr != null) {
-        if (thr instanceof DropboxException) {
-          throw (DropboxException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-      return;
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (DropboxException e) {
-      Logging.connectors.warn("DROPBOX: Error checking repository: " + e.getMessage(), e);
-      handleDropboxException(e);
-    }
-  }
-  
-  protected class CheckConnectionThread extends Thread {
-
-    protected Throwable exception = null;
-
-    public CheckConnectionThread() {
-      super();
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.getRepositoryInfo();
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-  }
-
-  /**
-   * Set up a session
-   */
-  protected void getSession() throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      // Check for parameter validity
-
-      if (StringUtils.isEmpty(app_key)) {
-        throw new ManifoldCFException("Parameter " + DropboxConfig.APP_KEY_PARAM
-            + " required but not set");
-      }
-      
-      if (StringUtils.isEmpty(app_secret)) {
-        throw new ManifoldCFException("Parameter " + DropboxConfig.APP_SECRET_PARAM
-            + " required but not set");
-      }
-      
-      
-      if (StringUtils.isEmpty(key)) {
-        throw new ManifoldCFException("Parameter " + DropboxConfig.KEY_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("DROPBOX: Username = '" + key + "'");
-      }
-
-      if (StringUtils.isEmpty(secret)) {
-        throw new ManifoldCFException("Parameter " + DropboxConfig.SECRET_PARAM
-            + " required but not set");
-      }
-
-      Logging.connectors.debug("DROPBOX: Password exists");
-
-      
-      // Create a session
-      session = new DropboxSession(app_key, app_secret, key, secret);
-      lastSessionFetch = System.currentTimeMillis();
-    }
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      session.close();
-      session = null;
-      lastSessionFetch = -1L;
-    }
-
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /**
-   * Get the maximum number of documents to amalgamate together into one
-   * batch, for this connector.
-   *
-   * @return the maximum number. 0 indicates "unlimited".
-   */
-  @Override
-  public int getMaxDocumentRequest() {
-    return 1;
-  }
-
-  /**
-   * Return the list of relationship types that this connector recognizes.
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes() {
-    return new String[]{RELATIONSHIP_CHILD};
-  }
-
-  /**
-   * Fill in a Server tab configuration parameter map for calling a Velocity
-   * template.
-   *
-   * @param newMap is the map to fill in
-   * @param parameters is the current set of configuration parameters
-   */
-  private static void fillInServerConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    
-    String app_key = parameters.getParameter(DropboxConfig.APP_KEY_PARAM);
-    String app_secret = parameters.getObfuscatedParameter(DropboxConfig.APP_SECRET_PARAM);
-    
-    String username = parameters.getParameter(DropboxConfig.KEY_PARAM);
-    String password = parameters.getObfuscatedParameter(DropboxConfig.SECRET_PARAM);
-    
-    if (app_key == null) {
-      app_key = StringUtils.EMPTY;
-    }
-    
-    if (app_secret == null) {
-      app_secret = StringUtils.EMPTY;
-    } else {
-      app_secret = mapper.mapPasswordToKey(app_secret);
-    }
-    
-    if (username == null) {
-      username = StringUtils.EMPTY;
-    }
-    if (password == null) {
-      password = StringUtils.EMPTY;
-    } else {
-      password = mapper.mapPasswordToKey(password);
-    }
-    
-    newMap.put("APP_KEY", app_key);
-    newMap.put("APP_SECRET", app_secret);
-    newMap.put("KEY", username);
-    newMap.put("SECRET", password);
-    
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIG_FORWARD,paramMap);
-  }
-
-  /**
-   *
-   * Output the configuration header section. This method is called in the
-   * head section of the connector's configuration page. Its purpose is to add
-   * the required tabs to the list, and to output any javascript methods that
-   * might be needed by the configuration editing HTML.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @param tabsArray is an array of tab names. Add to this array any tab
-   * names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, DROPBOX_SERVER_TAB_PROPERTY));
-
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_HEADER_FORWARD,paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException {
-
-    // Call the Velocity templates for each tab
-
-    // Server tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_SERVER,paramMap);
-
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post,
-   * including binary file post information.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an
-   * error that should prevent saving of the connection (and cause a
-   * redirection to an error page).
-   *
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-    IPostParameters variableContext, ConfigParams parameters)
-    throws ManifoldCFException {
-
-    
-    String app_key = variableContext.getParameter("app_key");
-    if (app_key != null) {
-      parameters.setParameter(DropboxConfig.APP_KEY_PARAM, app_key);
-    }
-    
-    String app_secret = variableContext.getParameter("app_secret");
-    if (app_secret != null) {
-      parameters.setObfuscatedParameter(DropboxConfig.APP_SECRET_PARAM, variableContext.mapKeyToPassword(app_secret));
-    }
-    
-    String key = variableContext.getParameter("key");
-    if (key != null) {
-      parameters.setParameter(DropboxConfig.KEY_PARAM, key);
-    }
-
-    String secret = variableContext.getParameter("secret");
-    if (secret != null) {
-      parameters.setObfuscatedParameter(DropboxConfig.SECRET_PARAM, variableContext.mapKeyToPassword(secret));
-    }
-
-    return null;
-  }
-
-  /**
-   * Fill in specification Velocity parameter map for DROPBOXPath tab.
-   */
-  private static void fillInDropboxPathSpecificationMap(Map<String, Object> newMap, Specification ds) {
-    int i = 0;
-    String DropboxPath = DropboxConfig.DROPBOX_PATH_PARAM_DEFAULT_VALUE;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        DropboxPath = sn.getAttributeValue(JOB_PATH_ATTRIBUTE);
-      }
-      i++;
-    }
-    newMap.put("DROPBOXPATH", DropboxPath);
-  }
-
-  /**
-   * Fill in specification Velocity parameter map for Dropbox Security tab.
-   */
-  private static void fillInDropboxSecuritySpecificationMap(Map<String, Object> newMap, Specification ds) {
-    List<Map<String,String>> accessTokenList = new ArrayList<Map<String,String>>();
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {
-        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);
-        Map<String,String> accessMap = new HashMap<String,String>();
-        accessMap.put("TOKEN",token);
-        accessTokenList.add(accessMap);
-      }
-    }
-    newMap.put("ACCESSTOKENS", accessTokenList);
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInDropboxPathSpecificationMap(paramMap, ds);
-    fillInDropboxSecuritySpecificationMap(paramMap, ds);
-      
-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPEC_FORWARD,paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String dropboxPath = variableContext.getParameter(seqPrefix+"dropboxpath");
-    if (dropboxPath != null) {
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode oldNode = ds.getChild(i);
-        if (oldNode.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-          ds.removeChild(i);
-          break;
-        }
-        i++;
-      }
-      SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
-      node.setAttribute(JOB_PATH_ATTRIBUTE, dropboxPath);
-      ds.addChild(ds.getChildCount(), node);
-    }
-    String xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null) {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(JOB_ACCESS_NODE_TYPE))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount) {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete")) {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);
-        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);
-        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    return null;
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-
-    // Output DROPBOXPath tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    fillInDropboxPathSpecificationMap(paramMap, ds);
-    fillInDropboxSecuritySpecificationMap(paramMap, ds);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_DROPBOXPATH,paramMap);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_SECURITY,paramMap);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, DROPBOX_PATH_TAB_PROPERTY));
-    tabsArray.add(Messages.getString(locale, DROPBOX_SECURITY_TAB_PROPERTY));
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInDropboxPathSpecificationMap(paramMap, ds);
-    fillInDropboxSecuritySpecificationMap(paramMap, ds);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER_FORWARD,paramMap);
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {    
-
-    String dropboxPath = StringUtils.EMPTY;
-    int i = 0;
-    while (i < spec.getChildCount()) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        dropboxPath = sn.getAttributeValue(JOB_PATH_ATTRIBUTE);
-        break;
-      }
-      i++;
-    }
-    
-    getSession();
-    GetSeedsThread t = new GetSeedsThread(dropboxPath);
-    try {
-      t.start();
-      boolean wasInterrupted = false;
-      try {
-        XThreadStringBuffer seedBuffer = t.getBuffer();
-
-        // Pick up the paths, and add them to the activities, before we join with the child thread.
-        while (true) {
-          // The only kind of exceptions this can throw are going to shut the process down.
-          String docPath = seedBuffer.fetch();
-          if (docPath ==  null)
-            break;
-          // Add the pageID to the queue
-          activities.addSeedDocument(docPath);
-        }
-      } catch (InterruptedException e) {
-        wasInterrupted = true;
-        throw e;
-      } catch (ManifoldCFException e) {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          wasInterrupted = true;
-        throw e;
-      } finally {
-        if (!wasInterrupted)
-          t.finishUp();
-      }
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (DropboxException e) {
-      Logging.connectors.warn("DROPBOX: Error adding seed documents: " + e.getMessage(), e);
-      handleDropboxException(e);
-    }
-    return "";
-  }
-
-  protected class GetSeedsThread extends Thread {
-
-    protected Throwable exception = null;
-    protected final String path;
-    protected final XThreadStringBuffer seedBuffer;
-    
-    public GetSeedsThread(String path) {
-      super();
-      this.path = path;
-      this.seedBuffer = new XThreadStringBuffer();
-      setDaemon(true);
-    }
-
-    @Override
-    public void run() {
-      try {
-        session.getSeeds(seedBuffer,path,25000); //upper limit on files to get supported by dropbox api in a single directory
-      } catch (Throwable e) {
-        this.exception = e;
-      } finally {
-        seedBuffer.signalDone();
-      }
-    }
-
-    public XThreadStringBuffer getBuffer() {
-      return seedBuffer;
-    }
-    
-    public void finishUp()
-      throws InterruptedException, DropboxException {
-      seedBuffer.abandon();
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof DropboxException)
-          throw (DropboxException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-      }
-    }
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-      
-      
-    Logging.connectors.debug("DROPBOX: Inside processDocuments");
-
-    // Forced acls
-    String[] acls = getAcls(spec);
-    // Sort it,
-    java.util.Arrays.sort(acls);
-
-    for (String documentIdentifier : documentIdentifiers) {
-      
-      getSession();
-      
-      String versionString;
-      GetObjectThread objt = new GetObjectThread(documentIdentifier);
-      objt.start();
-      try {
-        objt.finishUp();
-      } catch (InterruptedException e) {
-        objt.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-          ManifoldCFException.INTERRUPTED);
-      } catch (DropboxException e) {
-        Logging.connectors.warn("DROPBOX: Error getting object: " + e.getMessage(), e);
-        handleDropboxException(e);
-      }
-
-      DropboxAPI.Entry dropboxObject = objt.getResponse();
-
-      if (dropboxObject.isDir) {
-        //a folder will always be processed
-        versionString = StringUtils.EMPTY;
-        
-        // adding all the children + subdirs for a folder
-
-        List<DropboxAPI.Entry> children = dropboxObject.contents;
-        for (DropboxAPI.Entry child : children) {
-          activities.addDocumentReference(child.path, documentIdentifier, RELATIONSHIP_CHILD);
-        }
-
-        activities.noDocument(documentIdentifier,versionString);
-        continue;
-      }
-      
-      if (dropboxObject.isDeleted) {
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-
-      if (StringUtils.isEmpty(dropboxObject.rev)) {
-        //a document that doesn't contain versioning information will never be processed
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-      
-      StringBuilder sb = new StringBuilder();
-
-      // Acls
-      packList(sb,acls,'+');
-      if (acls.length > 0) {
-        sb.append('+');
-        pack(sb,defaultAuthorityDenyToken,'+');
-      }
-      else
-        sb.append('-');
-
-      sb.append(dropboxObject.rev);
-      versionString = sb.toString();
-    
-      if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-        continue;
-      
-      long startTime = System.currentTimeMillis();
-      String errorCode = null;
-      String errorDesc = null;
-      Long fileSize = null;
-      String nodeId = documentIdentifier;
-      String version = versionString;
-        
-      try {
-        // Length in bytes
-        long fileLength = dropboxObject.bytes;
-        if (!activities.checkLengthIndexable(fileLength))
-        {
-          errorCode = activities.EXCLUDED_LENGTH;
-          errorDesc = "Document excluded because of length ("+fileLength+")";
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-        
-        //documentURI
-        String documentURI = dropboxObject.path;
-        if (!activities.checkURLIndexable(documentURI))
-        {
-          errorCode = activities.EXCLUDED_URL;
-          errorDesc = "Document excluded because of URL ('"+documentURI+"')";
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-
-        //Modified date
-        Date modifiedDate;
-        if (dropboxObject.modified != null)
-          modifiedDate = com.dropbox.client2.RESTUtility.parseDate(dropboxObject.modified);
-        else
-          modifiedDate = null;
-        if (!activities.checkDateIndexable(modifiedDate))
-        {
-          errorCode = activities.EXCLUDED_DATE;
-          errorDesc = "Document excluded because of date ("+modifiedDate+")";
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-        
-        // Mime type
-        String mimeType = dropboxObject.mimeType;
-        if (!activities.checkMimeTypeIndexable(mimeType))
-        {
-          errorCode = activities.EXCLUDED_MIMETYPE;
-          errorDesc = "Document excluded because of mime type ('"+mimeType+"')";
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-        
-        // content ingestion
-        RepositoryDocument rd = new RepositoryDocument();
-
-        if (acls.length > 0) {
-          rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acls);
-          String[] denyAclArray = new String[]{defaultAuthorityDenyToken};
-          rd.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,denyAclArray);
-        }
-            
-
-        if (dropboxObject.path != null)
-          rd.setFileName(dropboxObject.path);
-        if (dropboxObject.mimeType != null)
-          rd.setMimeType(dropboxObject.mimeType);
-        if (dropboxObject.modified != null)
-          rd.setModifiedDate(modifiedDate);
-        // There doesn't appear to be a created date...
-                
-        rd.addField("Modified", dropboxObject.modified);
-        rd.addField("Size", dropboxObject.size);
-        rd.addField("Path", dropboxObject.path);
-        rd.addField("Root", dropboxObject.root);
-        rd.addField("ClientMtime", dropboxObject.clientMtime);
-        rd.addField("mimeType", dropboxObject.mimeType);
-        rd.addField("rev", dropboxObject.rev);
-              
-        getSession();
-        BackgroundStreamThread t = new BackgroundStreamThread(nodeId);
-        t.start();
-        try {
-          boolean wasInterrupted = false;
-          try {
-            InputStream is = t.getSafeInputStream();
-            try {
-              rd.setBinary(is, fileLength);
-              activities.ingestDocumentWithException(nodeId, version, documentURI, rd);
-              // No errors.  Record the fact that we made it.
-              errorCode = "OK";
-              fileSize = new Long(fileLength);
-            } finally {
-              is.close();
-            }
-          } catch (java.net.SocketTimeoutException e) {
-            throw e;
-          } catch (InterruptedIOException e) {
-            wasInterrupted = true;
-            throw e;
-          } catch (ManifoldCFException e) {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              wasInterrupted = true;
-            throw e;
-          } finally {
-            if (!wasInterrupted)
-              // This does a join
-              t.finishUp();
-          }
-
-        } catch (InterruptedException e) {
-          // We were interrupted out of the join, most likely.  Before we abandon the thread,
-          // send a courtesy interrupt.
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-        } catch (java.net.SocketTimeoutException e) {
-          errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = e.getMessage();
-          handleIOException(e);
-        } catch (InterruptedIOException e) {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-        } catch (IOException e) {
-          errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = e.getMessage();
-          handleIOException(e);
-        } catch (DropboxException e) {
-          Logging.connectors.warn("DROPBOX: Error getting stream: " + e.getMessage(), e);
-          errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = e.getMessage();
-          handleDropboxException(e);
-        }
-      } catch (ManifoldCFException e) {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          errorCode = null;
-        throw e;
-      } finally {
-        if (errorCode != null)
-          activities.recordActivity(new Long(startTime), ACTIVITY_READ,
-            fileSize, nodeId, errorCode, errorDesc, null);
-      }
-    }
-  }
-
-
-  protected class GetObjectThread extends Thread {
-
-    protected final String nodeId;
-    protected Throwable exception = null;
-    protected DropboxAPI.Entry response = null;
-
-    public GetObjectThread(String nodeId) {
-      super();
-      setDaemon(true);
-      this.nodeId = nodeId;
-    }
-
-    public void run() {
-      try {
-        response = session.getObject(nodeId);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, DropboxException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof DropboxException)
-          throw (DropboxException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-      }
-    }
-
-    public DropboxAPI.Entry getResponse() {
-      return response;
-    }
-    
-    public Throwable getException() {
-      return exception;
-    }
-  }
-
-  protected class BackgroundStreamThread extends Thread
-  {
-    protected final String nodeId;
-    
-    protected boolean abortThread = false;
-    protected Throwable responseException = null;
-    protected InputStream sourceStream = null;
-    protected XThreadInputStream threadStream = null;
-    
-    public BackgroundStreamThread(String nodeId)
-    {
-      super();
-      setDaemon(true);
-      this.nodeId = nodeId;
-    }
-
-    public void run()
-    {
-      try {
-        try {
-          synchronized (this) {
-            if (!abortThread) {
-              sourceStream = session.getDropboxInputStream(nodeId);
-              threadStream = new XThreadInputStream(sourceStream);
-              this.notifyAll();
-            }
-          }
-          
-          if (threadStream != null)
-          {
-            // Stuff the content until we are done
-            threadStream.stuffQueue();
-          }
-        } finally {
-          if (sourceStream != null)
-            sourceStream.close();
-        }
-      } catch (Throwable e) {
-        responseException = e;
-      }
-    }
-
-    public InputStream getSafeInputStream()
-      throws InterruptedException, IOException, DropboxException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          checkException(responseException);
-          if (threadStream != null)
-            return threadStream;
-          wait();
-        }
-      }
-    }
-    
-    public void finishUp()
-      throws InterruptedException, IOException, DropboxException
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      synchronized (this) {
-        if (threadStream != null) {
-          threadStream.abort();
-        }
-        abortThread = true;
-      }
-
-      join();
-
-      checkException(responseException);
-    }
-    
-    protected synchronized void checkException(Throwable exception)
-      throws IOException, DropboxException
-    {
-      if (exception != null)
-      {
-        Throwable e = exception;
-        if (e instanceof DropboxException)
-          throw (DropboxException)e;
-        else if (e instanceof IOException)
-          throw (IOException)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof Error)
-          throw (Error)e;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
-      }
-    }
-
-  }
-
-  /** Grab forced acl out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getAcls(Specification spec) {
-    Set<String> map = new HashSet<String>();
-    for (int i = 0; i < spec.getChildCount(); i++) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {
-        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);
-        map.add(token);
-      }
-    }
-
-    String[] rval = new String[map.size()];
-    Iterator<String> iter = map.iterator();
-    int i = 0;
-    while (iter.hasNext()) {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  /** Handle a dropbox exception. */
-  protected static void handleDropboxException(DropboxException e)
-    throws ManifoldCFException, ServiceInterruption {
-    // Right now I don't know enough, so throw Service Interruptions
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("Dropbox exception: "+e.getMessage(), e, currentTime + 300000L,
-      currentTime + 3 * 60 * 60000L,-1,false);
-  }
-  
-  /** Handle an IO exception. */
-  protected static void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption {
-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    }
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L,
-      currentTime + 3 * 60 * 60000L,-1,false);
-  }
-  
-}
diff --git a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxSession.java b/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxSession.java
deleted file mode 100644
index 375d9bc..0000000
--- a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxSession.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/* $Id$ */
-
-/**
-* 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.
-*/
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.apache.manifoldcf.crawler.connectors.dropbox;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-
-import com.dropbox.client2.session.AppKeyPair;
-import java.util.Map;
-import com.dropbox.client2.session.WebAuthSession;
-import com.dropbox.client2.DropboxAPI;
-import com.dropbox.client2.DropboxAPI.DeltaEntry;
-import com.dropbox.client2.DropboxAPI.DropboxInputStream;
-import com.dropbox.client2.DropboxAPI.Entry;
-import com.dropbox.client2.exception.DropboxException;
-import com.dropbox.client2.jsonextract.JsonExtractionException;
-import com.dropbox.client2.jsonextract.JsonList;
-import com.dropbox.client2.jsonextract.JsonMap;
-import com.dropbox.client2.jsonextract.JsonThing;
-import com.dropbox.client2.session.AccessTokenPair;
-import com.dropbox.client2.session.AppKeyPair;
-import com.dropbox.client2.session.Session;
-import com.dropbox.client2.session.WebAuthSession;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import org.json.simple.parser.ParseException;
-
-/**
- *
- * @author andrew
- */
-public class DropboxSession {
-
-  private DropboxAPI<?> client;
-  
-  public DropboxSession(String app_key, String app_secret, String key, String secret) {
-    AppKeyPair appKeyPair = new AppKeyPair(app_key, app_secret);
-    WebAuthSession session = new WebAuthSession(appKeyPair, WebAuthSession.AccessType.DROPBOX);
-    AccessTokenPair ac = new AccessTokenPair(key, secret);
-    session.setAccessTokenPair(ac);
-    client = new DropboxAPI<WebAuthSession>(session);
-  }
-
-  public Map<String, String> getRepositoryInfo() throws DropboxException {
-    Map<String, String> info = new HashMap<String, String>();
-
-    info.put("Country", client.accountInfo().country);
-    info.put("Display Name", client.accountInfo().displayName);
-    info.put("Referral Link", client.accountInfo().referralLink);
-    info.put("Quota", String.valueOf(client.accountInfo().quota));
-    info.put("Quota Normal", String.valueOf(client.accountInfo().quotaNormal));
-    info.put("Quota Shared", String.valueOf(client.accountInfo().quotaShared));
-    info.put("Uid", String.valueOf(client.accountInfo().uid));
-    return info;
-  }
-
-  public void getSeeds(XThreadStringBuffer idBuffer, String path, int max_dirs)
-    throws DropboxException, InterruptedException {
-
-    idBuffer.add(path); //need to add root dir so that single files such as /file1 will still get read
-        
-        
-    DropboxAPI.Entry root_entry = client.metadata(path, max_dirs, null, true, null);
-    List<DropboxAPI.Entry> entries = root_entry.contents; //gets a list of the contents of the entire folder: subfolders + files
-
-    // Apply the entries one by one.
-    for (DropboxAPI.Entry e : entries) {
-      if (e.isDir) { //only add the directories as seeds, we'll add the files later
-        idBuffer.add(e.path);
-      }
-    }
-  }
-  
-  public DropboxAPI.Entry getObject(String id) throws DropboxException {
-    return client.metadata(id, 25000, null, true, null);
-  }
-
-  public DropboxInputStream getDropboxInputStream(String id) throws DropboxException {
-    return client.getFileStream(id, null);
-  }
-  
-  public void close() {
-    // MHL
-  }
-}
diff --git a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/Messages.java b/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/Messages.java
deleted file mode 100644
index ee00b26..0000000
--- a/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.dropbox;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.dropbox.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.dropbox";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_en_US.properties b/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_en_US.properties
deleted file mode 100644
index 3a79cc4..0000000
--- a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_en_US.properties
+++ /dev/null
@@ -1,39 +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.

-

-DropboxRepositoryConnector.Server=Server

-DropboxRepositoryConnector.Security=Security

-DropboxRepositoryConnector.DropboxPath=Folder

-

-DropboxRepositoryConnector.AppKeyColon=Application Key:

-DropboxRepositoryConnector.AppSecretColon=Application Secret:

-DropboxRepositoryConnector.KeyColon=Key:

-DropboxRepositoryConnector.SecretColon=Secret:

-

-DropboxRepositoryConnector.TheAppKeyMustNotBeNull=The Application Key must not be null

-DropboxRepositoryConnector.TheAppSecretMustNotBeNull=The Application Secret must not be null

-DropboxRepositoryConnector.TheKeyMustNotBeNull=The Key must not be null

-DropboxRepositoryConnector.TheSecretMustNotBeNull=The Secret must not be null

-DropboxRepositoryConnector.PathMustNotBeNull=Path must be not null

-DropboxRepositoryConnector.TypeInAnAccessToken=Type in an access token

-

-DropboxRepositoryConnector.DropboxPathColon=Dropbox folder to index:

-

-DropboxRepositoryConnector.NoAccessTokensPresent=No access tokens present

-DropboxRepositoryConnector.Add=Add

-DropboxRepositoryConnector.AddAccessToken=Add access token

-DropboxRepositoryConnector.Delete=Delete

-DropboxRepositoryConnector.DeleteToken=Delete token #

-DropboxRepositoryConnector.AccessTokensColon=Access tokens:

diff --git a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_es_ES.properties b/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_es_ES.properties
deleted file mode 100644
index 7a501ef..0000000
--- a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_es_ES.properties
+++ /dev/null
@@ -1,39 +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.

-

-DropboxRepositoryConnector.Server=Servidor

-DropboxRepositoryConnector.Security=Seguridad

-DropboxRepositoryConnector.DropboxPath=carpeta

-

-DropboxRepositoryConnector.AppKeyColon=Tecla de aplicación:

-DropboxRepositoryConnector.AppSecretColon=Aplicación Secreto:

-DropboxRepositoryConnector.KeyColon=Llave:

-DropboxRepositoryConnector.SecretColon=Secreto:

-

-DropboxRepositoryConnector.TheAppKeyMustNotBeNull=La clave de la aplicación no debe ser nulo

-DropboxRepositoryConnector.TheAppSecretMustNotBeNull=La aplicación Secreto no debe ser nulo

-DropboxRepositoryConnector.TheKeyMustNotBeNull=La llave no debe ser nulo

-DropboxRepositoryConnector.TheSecretMustNotBeNull=El secreto no debe ser nulo

-DropboxRepositoryConnector.PathMustNotBeNull=El camino debe ser no nulo

-DropboxRepositoryConnector.TypeInAnAccessToken=Escriba un token de acceso

-

-DropboxRepositoryConnector.DropboxPathColon=Carpeta de Dropbox para indexar:

-

-DropboxRepositoryConnector.NoAccessTokensPresent=No hay tokens de acceso actuales

-DropboxRepositoryConnector.Add=añadir

-DropboxRepositoryConnector.AddAccessToken=Añadir token de acceso

-DropboxRepositoryConnector.Delete=borrar

-DropboxRepositoryConnector.DeleteToken=Eliminar token #

-DropboxRepositoryConnector.AccessTokensColon=tokens de acceso:

diff --git a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_ja_JP.properties b/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_ja_JP.properties
deleted file mode 100644
index e75479e..0000000
--- a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_ja_JP.properties
+++ /dev/null
@@ -1,39 +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.
-
-DropboxRepositoryConnector.Server=Server
-DropboxRepositoryConnector.Security=Security
-DropboxRepositoryConnector.DropboxPath=Folder
-
-DropboxRepositoryConnector.AppKeyColon=Application Key:
-DropboxRepositoryConnector.AppSecretColon=Application Secret:
-DropboxRepositoryConnector.KeyColon=Key:
-DropboxRepositoryConnector.SecretColon=Secret:
-
-DropboxRepositoryConnector.TheAppKeyMustNotBeNull=The Application Key must not be null
-DropboxRepositoryConnector.TheAppSecretMustNotBeNull=The Application Secret must not be null
-DropboxRepositoryConnector.TheKeyMustNotBeNull=The Key must not be null
-DropboxRepositoryConnector.TheSecretMustNotBeNull=The Secret must not be null
-DropboxRepositoryConnector.PathMustNotBeNull=Path must be not null
-DropboxRepositoryConnector.TypeInAnAccessToken=Type in an access token
-
-DropboxRepositoryConnector.DropboxPathColon=Dropbox folder to index:
-
-DropboxRepositoryConnector.NoAccessTokensPresent=No access tokens present
-DropboxRepositoryConnector.Add=Add
-DropboxRepositoryConnector.AddAccessToken=Add access token
-DropboxRepositoryConnector.Delete=Delete
-DropboxRepositoryConnector.DeleteToken=Delete token #
-DropboxRepositoryConnector.AccessTokensColon=Access tokens:
diff --git a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_zh_CN.properties b/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_zh_CN.properties
deleted file mode 100644
index 8a7b2cc..0000000
--- a/connectors/dropbox/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/dropbox/common_zh_CN.properties
+++ /dev/null
@@ -1,39 +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.
-
-DropboxRepositoryConnector.Server=服务器
-DropboxRepositoryConnector.Security=安全
-DropboxRepositoryConnector.DropboxPath=Dropbox路径
-
-DropboxRepositoryConnector.AppKeyColon=Application Key:
-DropboxRepositoryConnector.AppSecretColon=Application Secret:
-DropboxRepositoryConnector.KeyColon=Key:
-DropboxRepositoryConnector.SecretColon=Secret:
-
-DropboxRepositoryConnector.TheAppKeyMustNotBeNull=Application Key不能为Null
-DropboxRepositoryConnector.TheAppSecretMustNotBeNull=Application Secret不能为Null
-DropboxRepositoryConnector.TheKeyMustNotBeNull=Key不能为Null
-DropboxRepositoryConnector.TheSecretMustNotBeNull=Secret不能为Null
-DropboxRepositoryConnector.PathMustNotBeNull=路径不能为Null
-DropboxRepositoryConnector.TypeInAnAccessToken=输入访问令牌
-
-DropboxRepositoryConnector.DropboxPathColon=索引对象的Dropbox路径:
-
-DropboxRepositoryConnector.NoAccessTokensPresent=访问令牌不存在
-DropboxRepositoryConnector.Add=添加
-DropboxRepositoryConnector.AddAccessToken=添加访问令牌
-DropboxRepositoryConnector.Delete=删除
-DropboxRepositoryConnector.DeleteToken=删除令牌 #
-DropboxRepositoryConnector.AccessTokensColon=访问令牌:
diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editConfiguration.js b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editConfiguration.js
deleted file mode 100644
index f6efe8a..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editConfiguration.js
+++ /dev/null
@@ -1,61 +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.

--->

-

-<script type="text/javascript">

-<!--

-function checkConfig()

-{

-  return true;

-}

- 

-function checkConfigForSave()

-{

-    

-    if (editconnection.app_key.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.TheAppKeyMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.Server'))");

-    editconnection.app_key.focus();

-    return false;

-  }

-  

-    if (editconnection.app_secret.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.TheAppSecretMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.Server'))");

-    editconnection.app_secret.focus();

-    return false;

-  }

-    

-  if (editconnection.key.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.TheKeyMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.Server'))");

-    editconnection.key.focus();

-    return false;

-  }

-  if (editconnection.secret.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.TheSecretMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.Server'))");

-    editconnection.secret.focus();

-    return false;

-  }

-  return true;

-}

-//-->

-</script>
\ No newline at end of file
diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editConfiguration_Server.html b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editConfiguration_Server.html
deleted file mode 100644
index 2b7cb9e..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editConfiguration_Server.html
+++ /dev/null
@@ -1,67 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('DropboxRepositoryConnector.Server'))

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.AppKeyColon'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" id="app_key" name="app_key" value="$Encoder.attributeEscape($APP_KEY)" />

-    </td>

-  </tr>

-  

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.AppSecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" id="app_secret" name="app_secret" value="$Encoder.attributeEscape($APP_SECRET)" />

-    </td>

-  </tr>

-  

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.KeyColon'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" id="key" name="key" value="$Encoder.attributeEscape($KEY)" />

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.SecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" id="secret" name="secret" value="$Encoder.attributeEscape($SECRET)" />

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="app_key" value="$Encoder.attributeEscape($APP_KEY)" />

-<input type="hidden" name="app_secret" value="$Encoder.attributeEscape($APP_SECRET)" />

-<input type="hidden" name="key" value="$Encoder.attributeEscape($KEY)" />

-<input type="hidden" name="secret" value="$Encoder.attributeEscape($SECRET)" />

-

-#end

diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification.js b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification.js
deleted file mode 100644
index 62bff6b..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification.js
+++ /dev/null
@@ -1,55 +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.

--->

-

-<script type="text/javascript">

-<!--

-function s${SeqNum}_checkSpecificationForSave()

-{

-  if(editjob.s${SeqNum}_dropboxpath.value == "") {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.PathMustNotBeNull'))");

-    SelectSequencedTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.Server'))",${SeqNum});

-    editjob.s${SeqNum}_dropboxpath.focus();

-    return false;

-  }

-  return true;

-}

- 

-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)

-{

-  eval("editjob."+n+".value = \""+opValue+"\"");

-  postFormSetAnchor(anchorvalue);

-}

-

-function s${SeqNum}_SpecDeleteToken(i)

-{

-  s${SeqNum}_SpecOp("s${SeqNum}_accessop_"+i,"Delete","s${SeqNum}_token_"+i);

-}

-

-function s${SeqNum}_SpecAddToken(i)

-{

-  if (editjob.s${SeqNum}_spectoken.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('DropboxRepositoryConnector.TypeInAnAccessToken'))");

-    editjob.s${SeqNum}_spectoken.focus();

-    return;

-  }

-  s${SeqNum}_SpecOp("s${SeqNum}_accessop","Add","s${SeqNum}_token_"+i);

-}

-

-//-->

-</script>

-

diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification_DropboxPath.html b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification_DropboxPath.html
deleted file mode 100644
index fae94d4..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification_DropboxPath.html
+++ /dev/null
@@ -1,36 +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.

--->

-#if($TabName == $ResourceBundle.getString('DropboxRepositoryConnector.DropboxPath') && ${SeqNum} == ${SelectedNum})

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.DropboxPathColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr><input type="text" size="80" name="s${SeqNum}_dropboxpath" value="$Encoder.attributeEscape($DROPBOXPATH)" /></nobr>

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="s${SeqNum}_dropboxpath" value="$Encoder.attributeEscape($DROPBOXPATH)" />

-

-#end

-

diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification_Security.html b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification_Security.html
deleted file mode 100644
index e4a5e3e..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/editSpecification_Security.html
+++ /dev/null
@@ -1,73 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('DropboxRepositoryConnector.Security') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  #set($atcounter = 0)
-  #foreach($atoken in $ACCESSTOKENS)
-
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_accessop_$atcounter" value=""/>
-      <input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>
-      <a name="s${SeqNum}_token_$atcounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('DropboxRepositoryConnector.Delete'))" onClick='Javascript:s${SeqNum}_SpecDeleteToken($atcounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('DropboxRepositoryConnector.DeleteToken'))$atcounter"/>
-      </a>
-    </td>
-    <td class="value">$Encoder.bodyEscape($atoken.get('TOKEN'))</td>
-  </tr>
-
-    #set($atcounter = $atcounter + 1)
-  #end
-
-  #set($nexttoken = $atcounter + 1)
-
-  #if($atcounter == 0)
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.NoAccessTokensPresent'))</td>
-  </tr>
-  #end
-
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>
-      <input type="hidden" name="s${SeqNum}_accessop" value=""/>
-      <a name="s${SeqNum}_token_$atcounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('DropboxRepositoryConnector.Add'))" onClick='Javascript:s${SeqNum}_SpecAddToken($nexttoken)' alt="$Encoder.attributeEscape($ResourceBundle.getString('DropboxRepositoryConnector.AddAccessToken'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="s${SeqNum}_spectoken" value=""/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($atcounter = 0)
-  #foreach($atoken in $ACCESSTOKENS)
-<input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>
-    #set($atcounter = $atcounter + 1)
-  #end
-<input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>
-
-#end
diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/viewConfiguration.html b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/viewConfiguration.html
deleted file mode 100644
index 3b4d74f..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/viewConfiguration.html
+++ /dev/null
@@ -1,52 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.AppKeyColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($APP_KEY)</nobr>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.AppSecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>********</nobr>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.KeyColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($KEY)</nobr>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.SecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>********</nobr>

-    </td>

-  </tr>

-</table>

-

diff --git a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/viewSpecification.html b/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/viewSpecification.html
deleted file mode 100644
index 4e28a44..0000000
--- a/connectors/dropbox/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/dropbox/viewSpecification.html
+++ /dev/null
@@ -1,46 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.DropboxPathColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($DROPBOXPATH)</nobr>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-#if($ACCESSTOKENS.size() == 0)

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.NoAccessTokensPresent'))

-    </td>

-#else

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('DropboxRepositoryConnector.AccessTokensColon'))</nobr>

-    </td>

-    <td class="value">

-  #set($atcounter = 0)

-  #foreach($atoken in $ACCESSTOKENS)

-    <nobr>$Encoder.bodyEscape($atoken.get('TOKEN'))</nobr><br/>

-    #set($atcounter = $atcounter + 1)

-  #end

-    </td>

-#end

-  </tr>

-</table>

diff --git a/connectors/dropbox/pom.xml b/connectors/dropbox/pom.xml
deleted file mode 100644
index e616330..0000000
--- a/connectors/dropbox/pom.xml
+++ /dev/null
@@ -1,386 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

-

-<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/xsd/maven-4.0.0.xsd">

-

-    <parent>

-        <groupId>org.apache.manifoldcf</groupId>

-        <artifactId>mcf-connectors</artifactId>

-        <version>2.10-SNAPSHOT</version>

-    </parent>

-    <modelVersion>4.0.0</modelVersion>

-

-    <packaging>jar</packaging>

-

-    <developers>

-        <developer>

-            <name>Andrew Janowczyk</name>

-            <organization>Searchbox</organization>

-            <organizationUrl>http://www.searchbox.com</organizationUrl>

-            <url>http://www.searchbox.com</url>

-        </developer>

-    </developers>

-

-  <properties>

-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

-  </properties>

-

-    <artifactId>mcf-dropbox-connector</artifactId>

-    <name>ManifoldCF - Connectors - Dropbox</name>

-

-    <build>

-        <defaultGoal>integration-test</defaultGoal>

-        <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>

-        <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>

-        <resources>

-          <resource>

-            <directory>${basedir}/connector/src/main/native2ascii</directory>

-            <includes>

-              <include>**/*.properties</include>

-            </includes>

-          </resource>

-          <resource>

-            <directory>${basedir}/connector/src/main/resources</directory>

-            <includes>

-              <include>**/*.html</include>

-              <include>**/*.js</include>

-            </includes>

-          </resource>

-        </resources> 

-        <testResources>

-          <testResource>

-            <directory>${basedir}/connector/src/test/resources</directory>

-          </testResource>

-        </testResources>

-    

-        <plugins>

-

-            <plugin>

-                <groupId>org.codehaus.mojo</groupId>

-                <artifactId>native2ascii-maven-plugin</artifactId>

-                <version>1.0-beta-1</version>

-                <configuration>

-                    <workDir>target/classes</workDir>

-                </configuration>

-                <executions>

-                    <execution>

-                        <id>native2ascii-utf8</id>

-                        <goals>

-                            <goal>native2ascii</goal>

-                        </goals>

-                        <configuration>

-                            <encoding>UTF8</encoding>

-                            <includes>

-                                <include>**/*.properties</include>

-                            </includes>

-                        </configuration>

-                    </execution>

-                </executions>

-            </plugin>

-

-            <plugin>

-              <artifactId>maven-dependency-plugin</artifactId>

-              <executions>

-                 <execution>

-                  <id>copy-war</id>

-                  <phase>generate-resources</phase>

-                  <goals>

-                    <goal>copy</goal>

-                  </goals>

-                  <configuration>

-                    <outputDirectory>target/dependency</outputDirectory>

-                    <artifactItems>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-api-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-api-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-authority-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-authority-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-crawler-ui</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-crawler-ui.war</destFileName>

-                      </artifactItem>

-                    </artifactItems>

-                  </configuration>

-                </execution>

-              </executions>

-            </plugin>

-

-            <!-- Test plugin configuration -->

-            <plugin>

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

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

-              <configuration>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-            </plugin>

-

-            <plugin>

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

-              <artifactId>maven-failsafe-plugin</artifactId>

-              <version>2.18.1</version>

-              <configuration>

-                <skipTests>${skipITs}</skipTests>

-                <systemPropertyVariables>

-                  <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>

-                  <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>

-                  <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>

-                </systemPropertyVariables>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-              <executions>

-                <execution>

-                  <id>integration-test</id>

-                  <goals>

-                    <goal>integration-test</goal>

-                  </goals>

-                </execution>

-                <execution>

-                  <id>verify</id>

-                  <goals>

-                    <goal>verify</goal>

-                  </goals>

-                </execution>

-              </executions>

-            </plugin>

-

-        </plugins>

-    </build>

-

-    <dependencies>

-

-        <!-- Main -->

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-connector-common</artifactId>

-          <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-pull-agent</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-agents</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-ui-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>commons-lang</groupId>

-            <artifactId>commons-lang</artifactId>

-            <version>${commons-lang.version}</version>

-            <type>jar</type>

-        </dependency>

-        <dependency>

-            <groupId>org.syncloud</groupId>

-            <artifactId>dropbox-client</artifactId>

-            <version>1.5.3</version>

-            <type>jar</type>

-        </dependency>

-        

-        <!-- Tests -->

-        <dependency>

-          <groupId>junit</groupId>

-          <artifactId>junit</artifactId>

-          <version>${junit.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-core</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-agents</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-pull-agent</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.postgresql</groupId>

-          <artifactId>postgresql</artifactId>

-          <version>${postgresql.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.hsqldb</groupId>

-          <artifactId>hsqldb</artifactId>

-          <version>${hsqldb.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>mysql</groupId>

-          <artifactId>mysql-connector-java</artifactId>

-          <version>${mysql.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-api-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-authority-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-crawler-ui</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-server</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-util</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-webapp</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-servlet</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-http</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-io</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-security</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-continuation</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-xml</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-api-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>    

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>

-        

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-api</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-simple</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-    </dependencies>

-</project>

diff --git a/connectors/elasticsearch/.gitignore b/connectors/elasticsearch/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/elasticsearch/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/elasticsearch/build.xml b/connectors/elasticsearch/build.xml
deleted file mode 100644
index 8960c3a..0000000
--- a/connectors/elasticsearch/build.xml
+++ /dev/null
@@ -1,100 +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.
--->
-
-<project name="elasticsearch" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <property name="elasticsearch.version" value="1.0.1"/>
-
-    <target name="download-dependencies">
-        
-        <mkdir dir="build/download"/>
-        <get src="http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-${elasticsearch.version}.tar.gz" 
-            dest="build/download/elasticsearch.tar.gz"/>
-        <gunzip src="build/download/elasticsearch.tar.gz"/>
-        <untar src="build/download/elasticsearch.tar" dest="test-materials"/>
-        
-        <!-- download and install the attachment plugin -->
-        <mkdir dir="test-materials/elasticsearch-${elasticsearch.version}/plugins"/>
-        
-        <get src="https://github.com/elasticsearch/elasticsearch-mapper-attachments/archive/v2.0.0.RC1.zip" 
-            dest="test-materials/elasticsearch-${elasticsearch.version}/plugins/mapper-attachments.zip"/>
-        
-        <unzip src="test-materials/elasticsearch-${elasticsearch.version}/plugins/mapper-attachments.zip" dest="test-materials/elasticsearch-${elasticsearch.version}/plugins/mapper-attachments"/>
-
-        <chmod dir="test-materials/elasticsearch-${elasticsearch.version}" perm="ugo+rxw">
-            <fileset dir="**/*"/>
-        </chmod>
-        <chmod file="test-materials/elasticsearch-${elasticsearch.version}/bin/plugin" perm="ugo+rx"/>
-        <chmod file="test-materials/elasticsearch-${elasticsearch.version}/bin/elasticsearch" perm="ugo+rx"/>
-        <chmod file="test-materials/elasticsearch-${elasticsearch.version}/bin/elasticsearch.in.sh" perm="ugo+rx"/>
-      
-    </target>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="test-materials" excludes="README*.txt"/>
-        </delete>
-    </target>
-
-    <target name="integration">
-        <mkdir dir="dist/integration/elasticsearch"/>
-        <copy todir="dist/integration/elasticsearch">
-          <fileset dir="../../lib/elasticsearch"/>
-        </copy>
-        <mkdir dir="dist/integration/elasticsearch-1.5"/>
-        <copy todir="dist/integration/elasticsearch-1.5">
-          <fileset dir="../../lib/elasticsearch-1.5"/>
-        </copy>
-    </target>
-
-    <target name="calculate-testcode-condition">
-        <available file="test-materials/elasticsearch-${elasticsearch.version}" property="tests-present"/>
-    </target>
-
-    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present">
-        <echo message="Need ElasticSearch download in order to compile tests - run ant make-deps"/>
-    </target>
-
-    <path id="connector-test-classpath">
-        <path refid="mcf-connector-build.connector-test-classpath"/>
-        <fileset dir="test-materials/elasticsearch-${elasticsearch.version}">
-            <include name="lib/*.jar"/>
-        	  <include name="plugins/mapper-attachments/*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="ElasticSearch"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchAction.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchAction.java
deleted file mode 100644
index 185f0a4..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchAction.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/* $Id: ElasticSearchAction.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.HttpClient;
-
-import java.io.IOException;
-import java.util.Locale;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class ElasticSearchAction extends ElasticSearchConnection
-{
-
-  public enum CommandEnum
-  {
-    _optimize, _refresh, _stats, _forcemerge;
-  }
-
-  public ElasticSearchAction(HttpClient client, ElasticSearchConfig config)
-      throws ManifoldCFException
-  {
-    super(config, client);
-  }
-  
-  public void executeGET(CommandEnum cmd, boolean checkConnection)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    StringBuffer url = getApiUrl(cmd.toString(), checkConnection);
-    HttpGet method = new HttpGet(url.toString());
-    call(method);
-    String error = checkJson(jsonException);
-    if (getResult() == Result.OK && error == null)
-      return;
-    setResult("JSONERROR",Result.ERROR, error);
-    Logging.connectors.warn("ES: Commit failed: "+getResponse());
-  }
-
-  public void executePOST(CommandEnum cmd, boolean checkConnection)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    StringBuffer url = getApiUrl(cmd.toString(), checkConnection);
-    HttpPost method = new HttpPost(url.toString());
-    call(method);
-    String error = checkJson(jsonException);
-    if (getResult() == Result.OK && error == null)
-      return;
-    setResult("JSONERROR",Result.ERROR, error);
-    Logging.connectors.warn("ES: Commit failed: "+getResponse());
-  }
-  
-  @Override
-  protected void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption {
-    // We want a quicker failure here!!
-    if (e instanceof java.io.InterruptedIOException && !(e instanceof java.net.SocketTimeoutException))
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-    long currentTime = System.currentTimeMillis();
-    // One notification attempt, then we're done.
-    throw new ServiceInterruption("IO exception: "+e.getMessage(),e,
-        currentTime + 60000L,
-        currentTime + 1L * 60L * 60000L,
-        1,
-        false);
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java
deleted file mode 100644
index d22749b..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/* $Id: ElasticSearchConfig.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-
-import java.util.Locale;
-
-public class ElasticSearchConfig extends ElasticSearchParam
-{
-
-  /**
-	 * 
-	 */
-  private static final long serialVersionUID = -2071296573398352538L;
-
-  /** Parameters used for the configuration */
-  final private static ParameterEnum[] CONFIGURATIONLIST =
-  {
-    ParameterEnum.SERVERVERSION,
-    ParameterEnum.SERVERLOCATION,
-    ParameterEnum.INDEXNAME,
-    ParameterEnum.INDEXTYPE,
-    ParameterEnum.USEMAPPERATTACHMENTS,
-    ParameterEnum.PIPELINENAME,
-    ParameterEnum.CONTENTATTRIBUTENAME,
-    ParameterEnum.CREATEDDATEATTRIBUTENAME,
-    ParameterEnum.MODIFIEDDATEATTRIBUTENAME,
-    ParameterEnum.INDEXINGDATEATTRIBUTENAME,
-    ParameterEnum.MIMETYPEATTRIBUTENAME
-  };
-
-  /** Build a set of ElasticSearchParameters by reading ConfigParams. If the
-   * value returned by ConfigParams.getParameter is null, the default value is
-   * set.
-   * 
-   * @param paramList
-   * @param params */
-  public ElasticSearchConfig(ConfigParams params)
-  {
-    super(CONFIGURATIONLIST);
-    for (ParameterEnum param : CONFIGURATIONLIST)
-    {
-      String value = params.getParameter(param.name());
-      if (value == null)
-        value = param.defaultValue;
-      put(param, value);
-    }
-  }
-
-  /** @return a unique identifier for one index on one ElasticSearch instance. */
-  public String getUniqueIndexIdentifier()
-  {
-    StringBuffer sb = new StringBuffer();
-    sb.append(getServerLocation());
-    if (sb.charAt(sb.length() - 1) != '/')
-      sb.append('/');
-    sb.append(getIndexName());
-    return sb.toString();
-  }
-
-  public final static void contextToConfig(IPostParameters variableContext,
-      ConfigParams parameters)
-  {
-    for (ParameterEnum param : CONFIGURATIONLIST)
-    {
-      String p = variableContext.getParameter(param.name().toLowerCase(Locale.ROOT));
-      if (p != null)
-        parameters.setParameter(param.name(), p);
-    }
-
-    String useMapperAttachmentsPresent = variableContext.getParameter("usemapperattachments_present");
-    if (useMapperAttachmentsPresent != null)
-    {
-      String useMapperAttachments = variableContext.getParameter(ParameterEnum.USEMAPPERATTACHMENTS.name().toLowerCase(Locale.ROOT));
-      if (useMapperAttachments == null || useMapperAttachments.length() == 0)
-        useMapperAttachments = "false";
-      parameters.setParameter(ParameterEnum.USEMAPPERATTACHMENTS.name(), useMapperAttachments);
-    }
-  }
-
-  final public boolean isServerAfter5()
-  {
-    return getMajorVersion() >= 5;
-  }
-      
-  final public int getMajorVersion() {
-    final String version = getServerVersion();
-    if (version == null || version.length() == 0) {
-      return 0;
-    }
-    final int index = version.indexOf(".");
-    final String upperVersion;
-    if (index == -1) {
-      upperVersion = version;
-    } else {
-      upperVersion = version.substring(0, index);
-    }
-    int majorVersion;
-    try {
-      majorVersion = Integer.parseInt(upperVersion);
-    } catch (Exception e) {
-      majorVersion = 0;
-    }
-    return majorVersion;
-  }
-  
-  final public String getServerVersion()
-  {
-    return get(ParameterEnum.SERVERVERSION);
-  }
-  
-  final public String getServerLocation()
-  {
-    return get(ParameterEnum.SERVERLOCATION);
-  }
-
-  final public String getIndexName()
-  {
-    return get(ParameterEnum.INDEXNAME);
-  }
-
-  final public String getIndexType()
-  {
-    return get(ParameterEnum.INDEXTYPE);
-  }
-
-  final public Boolean getUseMapperAttachments()
-  {
-    return Boolean.valueOf(get(ParameterEnum.USEMAPPERATTACHMENTS));
-  }
-
-  final public String getPipelineName()
-  {
-    return get(ParameterEnum.PIPELINENAME);
-  }
-  
-  final public String getContentAttributeName()
-  {
-    return get(ParameterEnum.CONTENTATTRIBUTENAME);
-  }
-
-  final public String getCreatedDateAttributeName()
-  {
-    return get(ParameterEnum.CREATEDDATEATTRIBUTENAME);
-  }
-
-  final public String getModifiedDateAttributeName()
-  {
-    return get(ParameterEnum.MODIFIEDDATEATTRIBUTENAME);
-  }
-
-  final public String getIndexingDateAttributeName()
-  {
-    return get(ParameterEnum.INDEXINGDATEATTRIBUTENAME);
-  }
-
-  final public String getMimeTypeAttributeName()
-  {
-    return get(ParameterEnum.MIMETYPEATTRIBUTENAME);
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnection.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnection.java
deleted file mode 100644
index d6d2e52..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnection.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/* $Id: ElasticSearchConnection.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.io.StringWriter;
-import java.io.Reader;
-import java.io.InputStreamReader;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Locale;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.Header;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.entity.ContentType;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-import org.apache.http.ParseException;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-public class ElasticSearchConnection
-{
-  protected ElasticSearchConfig config;
-  
-  private HttpClient client;
-  
-  private String serverLocation;
-
-  private String indexName;
-
-  private String resultDescription;
-
-  private String callUrlSnippet;
-
-  private String response;
-
-  private String resultCode;
-
-  protected final static String jsonException = "\"error\"";
-
-  public enum Result
-  {
-    OK, ERROR, UNKNOWN;
-  }
-
-  private Result result;
-  
-  protected ElasticSearchConnection(ElasticSearchConfig config, HttpClient client)
-  {
-    this.config = config;
-    this.client = client;
-    result = Result.UNKNOWN;
-    response = null;
-    resultDescription = "";
-    callUrlSnippet = null;
-    serverLocation = config.getServerLocation();
-    indexName = config.getIndexName();
-  }
-
-
-  protected StringBuffer getApiUrl(String command, boolean checkConnection) throws ManifoldCFException
-  {
-    StringBuffer url = new StringBuffer(serverLocation);
-    if (!serverLocation.endsWith("/"))
-      url.append('/');
-    if(!checkConnection)
-      url.append(URLEncoder.encode(indexName)).append("/");
-    url.append(command);
-    callUrlSnippet = url.toString();
-    return url;
-  }
-
-  protected static class CallThread extends Thread
-  {
-    protected final HttpClient client;
-    protected final HttpRequestBase method;
-    protected int resultCode = -1;
-    protected String response = null;
-    protected Throwable exception = null;
-    
-    public CallThread(HttpClient client, HttpRequestBase method)
-    {
-      this.client = client;
-      this.method = method;
-      setDaemon(true);
-    }
-    
-    @Override
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          HttpResponse resp = client.execute(method);
-          resultCode = resp.getStatusLine().getStatusCode();
-          response = getResponseBodyAsString(resp.getEntity());
-        }
-        finally
-        {
-          method.abort();
-        }
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        exception = e;
-      }
-      catch (InterruptedIOException e)
-      {
-        // Just exit
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws HttpException, IOException, InterruptedException
-    {
-      join();
-      Throwable t = exception;
-      if (t != null)
-      {
-        if (t instanceof HttpException)
-          throw (HttpException)t;
-        else if (t instanceof IOException)
-          throw (IOException)t;
-        else if (t instanceof RuntimeException)
-          throw (RuntimeException)t;
-        else if (t instanceof Error)
-          throw (Error)t;
-        else
-          throw new RuntimeException("Unexpected exception thrown: "+t.getMessage(),t);
-      }
-    }
-    
-    public int getResultCode()
-    {
-      return resultCode;
-    }
-    
-    public String getResponse()
-    {
-      return response;
-    }
-    
-    public Throwable getException()
-    {
-      return exception;
-    }
-  }
-  
-  /** Call ElasticSearch.
-  *@return false if there was a "rejection".
-  */
-  protected boolean call(HttpRequestBase method)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    CallThread ct = new CallThread(client, method);
-    try
-    {
-      ct.start();
-      try
-      {
-        ct.finishUp();
-        response = ct.getResponse();
-        return handleResultCode(ct.getResultCode(), response);
-      }
-      catch (InterruptedException e)
-      {
-        ct.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-    catch (HttpException e)
-    {
-      handleHttpException(e);
-      return false;
-    }
-    catch (IOException e)
-    {
-      handleIOException(e);
-      return false;
-    }
-  }
-
-  protected boolean handleResultCode(int code, String response)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (code == 200 || code == 201)
-    {
-      setResult("OK",Result.OK, null);
-      return true;
-    }
-    else if (code == 404)
-    {
-      setResult(IOutputHistoryActivity.HTTP_ERROR,Result.ERROR, "Page not found: " + response);
-      throw new ManifoldCFException("Server/page not found");
-    }
-    else if (code >= 400 && code < 500)
-    {
-      setResult(IOutputHistoryActivity.HTTP_ERROR,Result.ERROR, "HTTP code = "+code+", Response = "+response);
-      return false;
-    }
-    else if (code >= 500 && code < 600)
-    {
-      setResult(IOutputHistoryActivity.HTTP_ERROR,Result.ERROR, "Server exception: "+response);
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Server exception: "+response,
-        new ManifoldCFException(response),
-        currentTime + 300000L,
-        currentTime + 20L * 60000L,
-        -1,
-        false);
-    }
-    setResult(IOutputHistoryActivity.HTTP_ERROR,Result.UNKNOWN, "HTTP code = "+code+", Response = "+response);
-    throw new ManifoldCFException("Unexpected HTTP result code: "+code+": "+response);
-  }
-
-  protected void handleHttpException(HttpException e)
-    throws ManifoldCFException, ServiceInterruption {
-    setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-    throw new ManifoldCFException(e);
-  }
-  
-  protected void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption {
-    if (e instanceof java.io.InterruptedIOException && !(e instanceof java.net.SocketTimeoutException))
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-    long currentTime = System.currentTimeMillis();
-    // All IO exceptions are treated as service interruptions, retried for an hour
-    throw new ServiceInterruption("IO exception: "+e.getMessage(),e,
-        currentTime + 60000L,
-        currentTime + 1L * 60L * 60000L,
-        -1,
-        true);
-  }
-    
-  private static String getResponseBodyAsString(HttpEntity entity)
-    throws IOException, HttpException {
-    InputStream is = entity.getContent();
-    if (is != null)
-    {
-      try
-      {
-        Charset charSet;
-        try
-        {
-          ContentType ct = ContentType.get(entity);
-          if (ct == null)
-            charSet = StandardCharsets.UTF_8;
-          else
-            charSet = ct.getCharset();
-        }
-        catch (ParseException e)
-        {
-          charSet = StandardCharsets.UTF_8;
-        }
-        char[] buffer = new char[65536];
-        Reader r = new InputStreamReader(is,charSet);
-        Writer w = new StringWriter();
-        try
-        {
-          while (true)
-          {
-            int amt = r.read(buffer);
-            if (amt == -1)
-              break;
-            w.write(buffer,0,amt);
-          }
-        }
-        finally
-        {
-          w.flush();
-        }
-        return w.toString();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    return "";
-  }
-
-  protected String checkJson(String jsonQuery) throws ManifoldCFException
-  {
-    String result = null;
-    if (response != null)
-    {
-      String[] tokens = response.replaceAll("\\{", "").replaceAll("\\}", "")
-          .split(",");
-      for (String token : tokens)
-        if (token.contains(jsonQuery))
-          result = token.substring(token.indexOf(":") + 1);
-    }
-    return result;
-  }
-
-  protected void setResult(String resultCode, Result res, String desc)
-  {
-    if (res != null)
-      result = res;
-    if (desc != null)
-      if (desc.length() > 0)
-        resultDescription = desc;
-    setResultCode(resultCode);
-  }
-
-  public String getResultDescription()
-  {
-    return resultDescription;
-  }
-
-  protected String getResponse()
-  {
-    return response;
-  }
-
-
-  public Result getResult()
-  {
-    return result;
-  }
-
-  public String getCallUrlSnippet()
-  {
-    return callUrlSnippet;
-  }
-
-  public String getResultCode(){ return resultCode; }
-
-  public void setResultCode(String resultCode){ this.resultCode = resultCode; }
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
deleted file mode 100644
index ece0f90..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/* $Id: ElasticSearchConnector.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputNotifyActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputCheckActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.agents.output.BaseOutputConnector;
-import org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchAction.CommandEnum;
-import org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnection.Result;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-
-/**
- * This is the "output connector" for elasticsearch.
- * 
- * @author Luca Stancapiano
- */
-public class ElasticSearchConnector extends BaseOutputConnector
-{
-
-  private final static String ELASTICSEARCH_INDEXATION_ACTIVITY = "Indexation";
-  private final static String ELASTICSEARCH_DELETION_ACTIVITY = "Deletion";
-  private final static String ELASTICSEARCH_OPTIMIZE_ACTIVITY = "Optimize";
-
-  private final static String[] ELASTICSEARCH_ACTIVITIES =
-  { ELASTICSEARCH_INDEXATION_ACTIVITY, ELASTICSEARCH_DELETION_ACTIVITY,
-      ELASTICSEARCH_OPTIMIZE_ACTIVITY };
-
-  private final static String ELASTICSEARCH_TAB_PARAMETERS = "ElasticSearchConnector.Parameters";
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIG_FORWARD_PARAMETERS = "editConfiguration_Parameters.html";
-
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-
-  /** Connection expiration interval */
-  private static final long EXPIRATION_INTERVAL = 60000L;
-
-  private HttpClientConnectionManager connectionManager = null;
-  private HttpClient client = null;
-  private long expirationTime = -1L;
-  
-  public ElasticSearchConnector()
-  {
-  }
-
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-  }
-  
-  protected HttpClient getSession()
-    throws ManifoldCFException
-  {
-    if (client == null)
-    {
-      int socketTimeout = 900000;
-      int connectionTimeout = 60000;
-      
-      // Set up connection manager
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      connectionManager = poolingConnectionManager;
-
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(true)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-          
-      client = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .setMaxConnTotal(1)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setDefaultCredentialsProvider(credentialsProvider)
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .build();
-
-
-    }
-    expirationTime = System.currentTimeMillis() + EXPIRATION_INTERVAL;
-    return client;
-  }
-
-  protected void closeSession()
-  {
-    if (connectionManager != null)
-    {
-      connectionManager.shutdown();
-      connectionManager = null;
-    }
-    client = null;
-    expirationTime = -1L;
-  }
-  
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return connectionManager != null;
-  }
-
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    super.disconnect();
-    closeSession();
-  }
-  
-  
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    super.poll();
-    if (connectionManager != null)
-    {
-      if (System.currentTimeMillis() > expirationTime)
-      {
-        closeSession();
-      }
-    }
-  }
-  
-  @Override
-  public String[] getActivitiesList()
-  {
-    return ELASTICSEARCH_ACTIVITIES;
-  }
-
-  /** Read the content of a resource, replace the variable ${PARAMNAME} with the
-   * value and copy it to the out.
-   * 
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException */
-  private static void outputResource(String resName, IHTTPOutput out,
-      Locale locale, ElasticSearchParam params,
-      String tabName, Integer sequenceNumber, Integer currentSequenceNumber) throws ManifoldCFException
-  {
-    Map<String,String> paramMap = null;
-    if (params != null) {
-      paramMap = params.buildMap();
-      if (tabName != null) {
-        paramMap.put("TabName", tabName);
-      }
-      if (currentSequenceNumber != null)
-        paramMap.put("SelectedNum",currentSequenceNumber.toString());
-    }
-    else
-    {
-      paramMap = new HashMap<String,String>();
-    }
-    if (sequenceNumber != null)
-      paramMap.put("SeqNum",sequenceNumber.toString());
-
-    Messages.outputResourceWithVelocity(out, locale, resName, paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray) throws ManifoldCFException, IOException
-  {
-    super.outputConfigurationHeader(threadContext, out, locale, parameters,
-        tabsArray);
-    tabsArray.add(Messages.getString(locale, ELASTICSEARCH_TAB_PARAMETERS));
-    outputResource(EDIT_CONFIG_HEADER_FORWARD, out, locale, null, null, null, null);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException
-  {
-    super.outputConfigurationBody(threadContext, out, locale, parameters,
-        tabName);
-    ElasticSearchConfig config = this.getConfigParameters(parameters);
-    outputResource(EDIT_CONFIG_FORWARD_PARAMETERS, out, locale, config, tabName, null, null);
-  }
-
-  /** Build a Set of ElasticSearch parameters. If configParams is null,
-   * getConfiguration() is used.
-   * 
-   * @param configParams */
-  final private ElasticSearchConfig getConfigParameters(
-      ConfigParams configParams)
-  {
-    if (configParams == null)
-      configParams = getConfiguration();
-    return new ElasticSearchConfig(configParams);
-  }
-
-  @Override
-  public VersionContext getPipelineDescription(Specification os)
-      throws ManifoldCFException
-  {
-    return new VersionContext("",params,os);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException,
-      IOException
-  {
-    outputResource(VIEW_CONFIG_FORWARD, out, locale,
-        getConfigParameters(parameters), null, null, null);
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, ConfigParams parameters)
-      throws ManifoldCFException
-  {
-    ElasticSearchConfig.contextToConfig(variableContext, parameters);
-    return null;
-  }
-
-  /** Convert an unqualified ACL to qualified form.
-  * @param acl is the initial, unqualified ACL.
-  * @param authorityNameString is the name of the governing authority for this document's acls, or null if none.
-  * @param activities is the activities object, so we can report what's happening.
-  * @return the modified ACL.
-  */
-  protected static String[] convertACL(String[] acl, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException
-  {
-    if (acl != null)
-    {
-      String[] rval = new String[acl.length];
-      int i = 0;
-      while (i < rval.length)
-      {
-        rval[i] = activities.qualifyAccessToken(authorityNameString,acl[i]);
-        i++;
-      }
-      return rval;
-    }
-    return new String[0];
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription,
-      RepositoryDocument document, String authorityNameString,
-      IOutputAddActivity activities) throws ManifoldCFException,
-      ServiceInterruption, IOException
-  {
-    HttpClient client = getSession();
-    ElasticSearchConfig config = getConfigParameters(null);
-
-    InputStream inputStream = document.getBinaryStream();
-    // For ES, we have to have fixed fields only; nothing else is possible b/c we don't have
-    // default field values.
-    String[] acls = null;
-    String[] denyAcls = null;
-    String[] shareAcls = null;
-    String[] shareDenyAcls = null;
-    String[] parentAcls = null;
-    String[] parentDenyAcls = null;
-    Iterator<String> a = document.securityTypesIterator();
-    while (a.hasNext())
-    {
-      String securityType = a.next();
-      String[] convertedAcls = convertACL(document.getSecurityACL(securityType),authorityNameString,activities);
-      String[] convertedDenyAcls = convertACL(document.getSecurityDenyACL(securityType),authorityNameString,activities);
-      if (securityType.equals(RepositoryDocument.SECURITY_TYPE_DOCUMENT))
-      {
-        acls = convertedAcls;
-        denyAcls = convertedDenyAcls;
-      }
-      else if (securityType.equals(RepositoryDocument.SECURITY_TYPE_SHARE))
-      {
-        shareAcls = convertedAcls;
-        shareDenyAcls = convertedDenyAcls;
-      }
-      else if (securityType.equals(RepositoryDocument.SECURITY_TYPE_PARENT))
-      {
-        parentAcls = convertedAcls;
-        parentDenyAcls = convertedDenyAcls;
-      }
-      else
-      {
-        // Don't know how to deal with it
-        activities.recordActivity(null,ELASTICSEARCH_INDEXATION_ACTIVITY,document.getBinaryLength(),documentURI,activities.UNKNOWN_SECURITY,"Rejected document that has security info which ElasticSearch does not recognize: '"+ securityType + "'");
-        return DOCUMENTSTATUS_REJECTED;
-      }
-    }
-    
-    long startTime = System.currentTimeMillis();
-    ElasticSearchIndex oi = new ElasticSearchIndex(client, config);
-    try
-    {
-      oi.execute(documentURI, document, inputStream, acls, denyAcls, shareAcls, shareDenyAcls, parentAcls, parentDenyAcls);
-      if (oi.getResult() != Result.OK)
-        return DOCUMENTSTATUS_REJECTED;
-      return DOCUMENTSTATUS_ACCEPTED;
-    }
-    finally
-    {
-      activities.recordActivity(startTime, ELASTICSEARCH_INDEXATION_ACTIVITY,
-        document.getBinaryLength(), documentURI, oi.getResultCode(), oi.getResultDescription());
-    }
-  }
-
-  @Override
-  public void removeDocument(String documentURI, String outputDescription,
-      IOutputRemoveActivity activities) throws ManifoldCFException,
-      ServiceInterruption
-  {
-    HttpClient client = getSession();
-    long startTime = System.currentTimeMillis();
-    ElasticSearchDelete od = new ElasticSearchDelete(client, getConfigParameters(null));
-    try
-    {
-      od.execute(documentURI);
-    }
-    finally
-    {
-      activities.recordActivity(startTime, ELASTICSEARCH_DELETION_ACTIVITY, null,
-          documentURI, od.getResultCode(), od.getResultDescription());
-    }
-  }
-
-  @Override
-  public String check() throws ManifoldCFException
-  {
-    HttpClient client = getSession();
-    ElasticSearchAction oss = new ElasticSearchAction(client, getConfigParameters(null));
-    try
-    {
-      oss.executeGET(CommandEnum._stats, true);
-      String resultName = oss.getResult().name();
-      if (resultName.equals("OK"))
-        return super.check();
-      return resultName + " " + oss.getResultDescription();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Transient exception: "+e.getMessage();
-    }
-  }
-
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    ElasticSearchConfig config = getConfigParameters(null);
-    HttpClient client = getSession();
-    long startTime = System.currentTimeMillis();
-    ElasticSearchAction oo = new ElasticSearchAction(client, config);
-    try
-    {
-      if (config.isServerAfter5()) {
-        oo.executePOST(CommandEnum._forcemerge, false);
-      } else {
-        oo.executeGET(CommandEnum._optimize, false);
-      }
-    }
-    finally
-    {
-      activities.recordActivity(startTime, ELASTICSEARCH_OPTIMIZE_ACTIVITY, null,
-          oo.getCallUrlSnippet(), oo.getResultCode(),
-          oo.getResultDescription());
-    }
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchDelete.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchDelete.java
deleted file mode 100644
index c4d79ab..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchDelete.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id: ElasticSearchDelete.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpDelete;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class ElasticSearchDelete extends ElasticSearchConnection
-{
-
-  public ElasticSearchDelete(HttpClient client, ElasticSearchConfig config)
-  {
-    super(config, client);
-  }
-  
-  public void execute(String documentURI)
-      throws ManifoldCFException, ServiceInterruption
-  {
-      String idField = URLEncoder.encode(documentURI);
-      HttpDelete method = new HttpDelete(config.getServerLocation() +
-          "/" + config.getIndexName() + "/" + config.getIndexType()
-          + "/" + idField);
-      call(method);
-      String error = checkJson(jsonException);
-      if (getResult() == Result.OK && error == null)
-        return;
-      // We thought we needed to delete, but ElasticSearch disagreed.
-      // Log the result as an error, but proceed anyway.
-      setResult("JSONERROR",Result.ERROR, error);
-      Logging.connectors.warn("ES: Delete failed: "+getResponse());
-  }
-  
-  @Override
-  protected boolean handleResultCode(int code, String response)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (code == 404)
-    {
-      setResult("OK",Result.OK, null);
-      return true;
-    }
-    return super.handleResultCode(code, response);
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java
deleted file mode 100644
index 928c71e..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/* $Id: ElasticSearchIndex.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.Iterator;
-
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-import java.util.TimeZone;
-import java.util.Date;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.Consts;
-import org.apache.http.HttpEntity;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.Header;
-import org.apache.commons.io.IOUtils;
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnection.Result;
-import org.apache.manifoldcf.core.common.Base64;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-public class ElasticSearchIndex extends ElasticSearchConnection
-{
-
-  /** The allow attribute name */
-  protected final static String allowAttributeName = "allow_token_";
-  /** The deny attribute name */
-  protected final static String denyAttributeName = "deny_token_";
-  /** The no-security token */
-  protected final static String noSecurityToken = "__nosecurity__";
-  
-  /** Flag set as to whether null_value works in ES.  Right now it doesn't work,
-  * so we have to do everything in the connector. */
-  protected final static boolean useNullValue = false;
-  
-  private class IndexRequestEntity implements HttpEntity
-  {
-
-    private final RepositoryDocument document;
-    private final InputStream inputStream;
-    private final String[] acls;
-    private final String[] denyAcls;
-    private final String[] shareAcls;
-    private final String[] shareDenyAcls;
-    private final String[] parentAcls;
-    private final String[] parentDenyAcls;
-    private final boolean useMapperAttachments;
-    private final String contentAttributeName;
-    private final String createdDateAttributeName;
-    private final String modifiedDateAttributeName;
-    private final String indexingDateAttributeName;
-    private final String mimeTypeAttributeName;
-    
-    public IndexRequestEntity(RepositoryDocument document, InputStream inputStream,
-      String[] acls, String[] denyAcls, String[] shareAcls, String[] shareDenyAcls, String[] parentAcls, String[] parentDenyAcls,
-      boolean useMapperAttachments,
-      String contentAttributeName,
-      String createdDateAttributeName,
-      String modifiedDateAttributeName,
-      String indexingDateAttributeName,
-      String mimeTypeAttributeName)
-      throws ManifoldCFException
-    {
-      this.document = document;
-      this.inputStream = inputStream;
-      this.acls = acls;
-      this.denyAcls = denyAcls;
-      this.shareAcls = shareAcls;
-      this.shareDenyAcls = shareDenyAcls;
-      this.parentAcls = parentAcls;
-      this.parentDenyAcls = parentDenyAcls;
-      this.useMapperAttachments = useMapperAttachments;
-      this.contentAttributeName = contentAttributeName;
-      this.createdDateAttributeName = createdDateAttributeName;
-      this.modifiedDateAttributeName = modifiedDateAttributeName;
-      this.indexingDateAttributeName = indexingDateAttributeName;
-      this.mimeTypeAttributeName = mimeTypeAttributeName;
-    }
-
-    @Override
-    public boolean isChunked() {
-      return false;
-    }
-    
-    @Override
-    @Deprecated
-    public void consumeContent()
-      throws IOException {
-      EntityUtils.consume(this);
-    }
-    
-    @Override
-    public boolean isRepeatable() {
-      return false;
-    }
-
-    @Override
-    public boolean isStreaming() {
-      return false;
-    }
-    
-    @Override
-    public InputStream getContent()
-      throws IOException, IllegalStateException {
-      return inputStream;
-    }
-    
-    @Override
-    public void writeTo(OutputStream out)
-      throws IOException {
-      PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
-      try
-      {
-        pw.print("{");
-        Iterator<String> i = document.getFields();
-        boolean needComma = false;
-        while (i.hasNext()){
-          String fieldName = i.next();
-          Date[] dateFieldValues = document.getFieldAsDates(fieldName);
-          if (dateFieldValues != null)
-          {
-            needComma = writeField(pw, needComma, fieldName, dateFieldValues);
-          }
-          else
-          {
-            String[] fieldValues = document.getFieldAsStrings(fieldName);
-            needComma = writeField(pw, needComma, fieldName, fieldValues);
-          }
-        }
-
-        // Standard document fields
-        final Date createdDate = document.getCreatedDate();
-        if (createdDate != null && createdDateAttributeName != null && createdDateAttributeName.length() > 0)
-        {
-          needComma = writeField(pw, needComma, createdDateAttributeName, new Date[]{createdDate});
-        }
-        final Date modifiedDate = document.getModifiedDate();
-        if (modifiedDate != null && modifiedDateAttributeName != null && modifiedDateAttributeName.length() > 0)
-        {
-          needComma = writeField(pw, needComma, modifiedDateAttributeName, new Date[]{modifiedDate});
-        }
-        final Date indexingDate = document.getIndexingDate();
-        if (indexingDate != null && indexingDateAttributeName != null && indexingDateAttributeName.length() > 0)
-        {
-          needComma = writeField(pw, needComma, indexingDateAttributeName, new Date[]{indexingDate});
-        }
-        final String mimeType = document.getMimeType();
-        if (mimeType != null && mimeTypeAttributeName != null && mimeTypeAttributeName.length() > 0)
-        {
-          needComma = writeField(pw, needComma, mimeTypeAttributeName, new String[]{mimeType});
-        }
-        
-        needComma = writeACLs(pw, needComma, "document", acls, denyAcls);
-        needComma = writeACLs(pw, needComma, "share", shareAcls, shareDenyAcls);
-        needComma = writeACLs(pw, needComma, "parent", parentAcls, parentDenyAcls);
-
-        if (useMapperAttachments && inputStream != null) {
-          if(needComma){
-            pw.print(",");
-          }
-          // I'm told this is not necessary: see CONNECTORS-690
-          //pw.print("\"type\" : \"attachment\",");
-          pw.print("\"file\" : {");
-          String contentType = document.getMimeType();
-          if (contentType != null)
-            pw.print("\"_content_type\" : "+jsonStringEscape(contentType)+",");
-          String fileName = document.getFileName();
-          if (fileName != null)
-            pw.print("\"_name\" : "+jsonStringEscape(fileName)+",");
-          // Since ES 1.0
-          pw.print(" \"_content\" : \"");
-          Base64 base64 = new Base64();
-          base64.encodeStream(inputStream, pw);
-          pw.print("\"}");
-        }
-        
-        if (!useMapperAttachments && inputStream != null) {
-          if (contentAttributeName != null)
-          {
-            Reader r = new InputStreamReader(inputStream, Consts.UTF_8);
-            StringBuilder sb = new StringBuilder((int)document.getBinaryLength());
-            char[] buffer = new char[65536];
-            while (true)
-            {
-              int amt = r.read(buffer,0,buffer.length);
-              if (amt == -1)
-                break;
-              sb.append(buffer,0,amt);
-            }
-            needComma = writeField(pw, needComma, contentAttributeName, new String[]{sb.toString()});
-          }
-        }
-        
-        pw.print("}");
-      } catch (ManifoldCFException e)
-      {
-        throw new IOException(e.getMessage());
-      } finally
-      {
-        pw.flush();
-        IOUtils.closeQuietly(pw);
-      }
-    }
-
-    @Override
-    public long getContentLength() {
-      // Unknown (chunked) length
-      return -1L;
-    }
-
-    @Override
-    public Header getContentType() {
-      return new BasicHeader("Content-type","application/json");
-    }
-
-    @Override
-    public Header getContentEncoding() {
-      return null;
-    }
-
-  }
-
-  protected static boolean writeField(PrintWriter pw, boolean needComma,
-    String fieldName, String[] fieldValues)
-    throws IOException
-  {
-    if (fieldValues == null)
-      return needComma;
-
-    if (fieldValues.length == 1){
-      if (needComma)
-        pw.print(",");
-      pw.print(jsonStringEscape(fieldName)+" : "+jsonStringEscape(fieldValues[0]));
-      needComma = true;
-      return needComma;
-    }
-
-    if (fieldValues.length > 1){
-      if (needComma)
-        pw.print(",");
-      StringBuilder sb = new StringBuilder();
-      sb.append("[");
-      for(int j=0; j<fieldValues.length; j++){
-        sb.append(jsonStringEscape(fieldValues[j])).append(",");
-      }
-      sb.setLength(sb.length() - 1); // discard last ","
-      sb.append("]");
-      pw.print(jsonStringEscape(fieldName)+" : "+sb.toString());
-      needComma = true;
-    }
-    return needComma;
-  }
-
-  private final static SimpleDateFormat DATE_FORMATTER;
-
-  static
-  {
-    String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
-    TimeZone UTC = TimeZone.getTimeZone("UTC");
-    DATE_FORMATTER = new SimpleDateFormat(ISO_FORMAT, Locale.ROOT);
-    DATE_FORMATTER.setTimeZone(UTC);
-  }
-  
-  protected static String formatAsString(final Date dateValue)
-  {
-    return DATE_FORMATTER.format(dateValue);
-  }
-  
-  protected static boolean writeField(PrintWriter pw, boolean needComma,
-    String fieldName, Date[] fieldValues)
-    throws IOException
-  {
-    if (fieldValues == null)
-      return needComma;
-
-    if (fieldValues.length == 1){
-      if (needComma)
-        pw.print(",");
-      pw.print(jsonStringEscape(fieldName)+" : "+jsonStringEscape(formatAsString(fieldValues[0])));
-      needComma = true;
-      return needComma;
-    }
-
-    if (fieldValues.length > 1){
-      if (needComma)
-        pw.print(",");
-      StringBuilder sb = new StringBuilder();
-      sb.append("[");
-      for(int j=0; j<fieldValues.length; j++){
-        sb.append(jsonStringEscape(formatAsString(fieldValues[j]))).append(",");
-      }
-      sb.setLength(sb.length() - 1); // discard last ","
-      sb.append("]");
-      pw.print(jsonStringEscape(fieldName)+" : "+sb.toString());
-      needComma = true;
-    }
-    return needComma;
-  }
-  
-  /** Output an acl level */
-  protected static boolean writeACLs(PrintWriter pw, boolean needComma,
-    String aclType, String[] acl, String[] denyAcl)
-    throws IOException
-  {
-    String metadataACLName = allowAttributeName + aclType;
-    if (acl != null && acl.length > 0)
-      needComma = writeField(pw,needComma,metadataACLName,acl);
-    else if (!useNullValue)
-      needComma = writeField(pw,needComma,metadataACLName,new String[]{noSecurityToken});
-    String metadataDenyACLName = denyAttributeName + aclType;
-    if (denyAcl != null && denyAcl.length > 0)
-      needComma = writeField(pw,needComma,metadataDenyACLName,denyAcl);
-    else if (!useNullValue)
-      needComma = writeField(pw,needComma,metadataDenyACLName,new String[]{noSecurityToken});
-    return needComma;
-  }
-
-  protected static String jsonStringEscape(String value)
-  {
-    StringBuilder sb = new StringBuilder("\"");
-    for (int i = 0; i < value.length(); i++)
-    {
-      char x = value.charAt(i);
-      if (x == '\n')
-        sb.append('\\').append('n');
-      else if (x == '\r')
-        sb.append('\\').append('r');
-      else if (x == '\t')
-        sb.append('\\').append('t');
-      else if (x == '\b')
-        sb.append('\\').append('b');
-      else if (x == '\f')
-        sb.append('\\').append('f');
-      else if (x < 32)
-      {
-        sb.append("\\u").append(String.format(Locale.ROOT, "%04x", (int)x));
-      }
-      else
-      {
-        if (x == '\"' || x == '\\' || x == '/')
-          sb.append('\\');
-        sb.append(x);
-      }
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-  
-
-  public ElasticSearchIndex(HttpClient client, ElasticSearchConfig config)
-  {
-    super(config, client);
-  }
-  
-  /** Do the indexing.
-  *@return false to indicate that the document was rejected.
-  */
-  public boolean execute(String documentURI, RepositoryDocument document, 
-    InputStream inputStream,
-    String[] acls, String[] denyAcls, String[] shareAcls, String[] shareDenyAcls, String[] parentAcls, String[] parentDenyAcls)
-    throws ManifoldCFException, ServiceInterruption
-  {
-
-
-    final String idField = URLEncoder.encode(documentURI);
-    final String encodedPipelineName = (config.getPipelineName() == null || config.getPipelineName().length() == 0)?null:URLEncoder.encode(config.getPipelineName());
-    
-    final String command = config.getIndexType() + "/" + idField;
-    final String fullCommand = (encodedPipelineName == null)?command:(command + "?pipeline=" + encodedPipelineName);
-    
-    StringBuffer url = getApiUrl(fullCommand, false);
-    HttpPut put = new HttpPut(url.toString());
-    put.setEntity(new IndexRequestEntity(document, inputStream,
-      acls, denyAcls, shareAcls, shareDenyAcls, parentAcls, parentDenyAcls,
-      config.getUseMapperAttachments(),
-      config.getContentAttributeName(),
-      config.getCreatedDateAttributeName(),
-      config.getModifiedDateAttributeName(),
-      config.getIndexingDateAttributeName(),
-      config.getMimeTypeAttributeName()));
-    if (call(put) == false)
-      return false;
-    String error = checkJson(jsonException);
-    if (getResult() == Result.OK && error == null)
-      return true;
-    setResult("JSONERROR",Result.ERROR, error);
-    Logging.connectors.warn("ES: Index failed: "+getResponse());
-    return true;
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java
deleted file mode 100644
index 2b0cc42..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/* $Id: ElasticSearchParam.java 1299512 2012-03-12 00:58:38Z piergiorgio $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.elasticsearch;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchParam.ParameterEnum;
-
-/** 
- * Parameters data for the elasticsearch output connector.
-*/
-public class ElasticSearchParam extends HashMap<ParameterEnum, String>
-{
-
-  /** Parameters constants */
-  public enum ParameterEnum
-  {
-    SERVERVERSION(""),
-    
-    SERVERLOCATION("http://localhost:9200/"),
-
-    INDEXNAME("index"),
-
-    INDEXTYPE("generictype"),
-
-    USEMAPPERATTACHMENTS("true"),
-    
-    PIPELINENAME(""),
-
-    CONTENTATTRIBUTENAME(""),
-
-    CREATEDDATEATTRIBUTENAME(""),
-    
-    MODIFIEDDATEATTRIBUTENAME(""),
-    
-    INDEXINGDATEATTRIBUTENAME(""),
-    
-    MIMETYPEATTRIBUTENAME(""),
-    
-    FIELDLIST("");
-
-    final protected String defaultValue;
-
-    private ParameterEnum(String defaultValue)
-    {
-      this.defaultValue = defaultValue;
-    }
-  }
-
-  private static final long serialVersionUID = -1593234685772720029L;
-
-  protected ElasticSearchParam(ParameterEnum[] params)
-  {
-    super(params.length);
-  }
-
-  final public Map<String, String> buildMap()
-  {
-    Map<String, String> rval = new HashMap<String, String>();
-    for (Map.Entry<ParameterEnum, String> entry : this.entrySet())
-      rval.put(entry.getKey().name(), entry.getValue());
-    return rval;
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/Messages.java b/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/Messages.java
deleted file mode 100644
index 5f4ed61..0000000
--- a/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1295926 2012-03-01 21:56:27Z kwright $ */

-

-/**

-* 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 org.apache.manifoldcf.agents.output.elasticsearch;

-

-import java.util.Locale;

-import java.util.Map;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-

-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages

-{

-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.agents.output.elasticsearch.common";

-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.elasticsearch";

-  

-  /** Constructor - do no instantiate

-  */

-  protected Messages()

-  {

-  }

-  

-  public static String getString(Locale locale, String messageKey)

-  {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey)

-  {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey)

-  {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey)

-  {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey)

-  {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getString(Locale locale, String messageKey, Object[] args)

-  {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-  

-  public static String getBodyString(Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  // More general methods which allow bundlenames and class loaders to be specified.

-  

-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);

-  }

-  

-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  // Resource output

-  

-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException

-  {

-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,

-      substitutionParameters,mapToUpperCase);

-  }

-  

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException

-  {

-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,

-      substitutionParameters,mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,Object> contextObjects)

-    throws ManifoldCFException

-  {

-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,

-      contextObjects);

-  }

-  

-}

-

diff --git a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties b/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties
deleted file mode 100644
index c15e64e..0000000
--- a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties
+++ /dev/null
@@ -1,40 +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.
-
-ElasticSearchConnector.Parameters=Parameters
-
-ElasticSearchConnector.ServerVersion=Server version:
-ElasticSearchConnector.ServerLocation=Server location
-ElasticSearchConnector.URLColon=(URL):
-ElasticSearchConnector.IndexNameColon=Index name:
-ElasticSearchConnector.IndexTypeColon=Index type:
-ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
-ElasticSearchConnector.PipelineNameColon=Pipeline name:
-ElasticSearchConnector.ContentAttributeNameColon=Content field name:
-ElasticSearchConnector.CreatedDateAttributeNameColon=Created date field name:
-ElasticSearchConnector.ModifiedDateAttributeNameColon=Modified date field name:
-ElasticSearchConnector.IndexingDateAttributeNameColon=Indexing date field name:
-ElasticSearchConnector.MimeTypeAttributeNameColon=Mime type field name:
-
-ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=Please supply a valid ElasticSearch server location
-ElasticSearchConnector.PleaseSupplyValidIndexName=Please supply a valid index name
-ElasticSearchConnector.PleaseSupplyValidIndexType=Please supply a valid index type
-ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Content field name required unless using mapper attachments
-
-ElasticSearchConnector.ElasticSearch=ElasticSearch
-
-ElasticSearchConnector.MaxFileSizeBytesColon=Max file size (bytes):
-ElasticSearchConnector.AllowedMIMETypesColon=Allowed MIME Types:
-ElasticSearchConnector.AllowedFileExtensionsColon=Allowed file extensions\:
\ No newline at end of file
diff --git a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_es_ES.properties b/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_es_ES.properties
deleted file mode 100644
index a689bb1..0000000
--- a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_es_ES.properties
+++ /dev/null
@@ -1,41 +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.
-
-ElasticSearchConnector.Parameters=Parámetros
-
-ElasticSearchConnector.ServerVersion=Server version:
-ElasticSearchConnector.ServerLocation=Ubicación del servidor
-ElasticSearchConnector.URLColon=(URL):
-ElasticSearchConnector.IndexNameColon=El nombre de índice:
-ElasticSearchConnector.IndexTypeColon=tipo de índice:
-ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
-ElasticSearchConnector.PipelineNameColon=Pipeline name:
-ElasticSearchConnector.ContentAttributeNameColon=Content field name:
-ElasticSearchConnector.CreatedDateAttributeNameColon=Created date field name:
-ElasticSearchConnector.ModifiedDateAttributeNameColon=Modified date field name:
-ElasticSearchConnector.IndexingDateAttributeNameColon=Indexing date field name:
-ElasticSearchConnector.MimeTypeAttributeNameColon=Mime type field name:
-
-ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=Por favor suministre una posición de servidor válida elástica de búsqueda
-ElasticSearchConnector.PleaseSupplyValidIndexName=Por favor proporcione un nombre de índice válido
-ElasticSearchConnector.PleaseSupplyValidIndexType=Por favor, facilite un tipo de índice válido
-
-ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Se requiere un nombre de campo de contenido, a menos que utilicen archivos adjuntos mapa
-
-ElasticSearchConnector.ElasticSearch=Búsqueda elástica
-
-ElasticSearchConnector.MaxFileSizeBytesColon=Tamaño máximo de archivo (bytes):
-ElasticSearchConnector.AllowedMIMETypesColon=Tipos de MIME permitidos:
-ElasticSearchConnector.AllowedFileExtensionsColon=Extensiones de archivo permitidos:
diff --git a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties b/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties
deleted file mode 100644
index 2b143f0..0000000
--- a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties
+++ /dev/null
@@ -1,40 +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.
-
-ElasticSearchConnector.Parameters=引数
-
-ElasticSearchConnector.ServerVersion=Server version:
-ElasticSearchConnector.ServerLocation=サーバ
-ElasticSearchConnector.URLColon=(URL):
-ElasticSearchConnector.IndexNameColon=インデックス名:
-ElasticSearchConnector.IndexTypeColon=タイプ名:
-ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
-ElasticSearchConnector.PipelineNameColon=Pipeline name:
-ElasticSearchConnector.ContentAttributeNameColon=Content field name:
-ElasticSearchConnector.CreatedDateAttributeNameColon=Created date field name:
-ElasticSearchConnector.ModifiedDateAttributeNameColon=Modified date field name:
-ElasticSearchConnector.IndexingDateAttributeNameColon=Indexing date field name:
-ElasticSearchConnector.MimeTypeAttributeNameColon=Mime type field name:
-
-ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=正しいElasticSearchサーバURLを入力してください
-ElasticSearchConnector.PleaseSupplyValidIndexName=正しいインデックス名を入力してください
-ElasticSearchConnector.PleaseSupplyValidIndexType=正しいタイプ名を入力してください
-ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Content field name required unless using mapper attachments
-
-ElasticSearchConnector.ElasticSearch=ElasticSearch
-
-ElasticSearchConnector.MaxFileSizeBytesColon=最大ファイルサイズ (bytes):
-ElasticSearchConnector.AllowedMIMETypesColon=利用可能なMIMEタイプ:
-ElasticSearchConnector.AllowedFileExtensionsColon=利用可能なファイル拡張子:
diff --git a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties b/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties
deleted file mode 100644
index ff54f99..0000000
--- a/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties
+++ /dev/null
@@ -1,40 +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.
-
-ElasticSearchConnector.Parameters=参数
-
-ElasticSearchConnector.ServerVersion=Server version:
-ElasticSearchConnector.ServerLocation=服务器
-ElasticSearchConnector.URLColon=(URL):
-ElasticSearchConnector.IndexNameColon=索引名: 
-ElasticSearchConnector.IndexTypeColon=索引类型: 
-ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
-ElasticSearchConnector.PipelineNameColon=Pipeline name:
-ElasticSearchConnector.ContentAttributeNameColon=Content field name:
-ElasticSearchConnector.CreatedDateAttributeNameColon=Created date field name:
-ElasticSearchConnector.ModifiedDateAttributeNameColon=Modified date field name:
-ElasticSearchConnector.IndexingDateAttributeNameColon=Indexing date field name:
-ElasticSearchConnector.MimeTypeAttributeNameColon=Mime type field name:
-
-ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=请输入有效的Elasticsearch服务器URL
-ElasticSearchConnector.PleaseSupplyValidIndexName=请输入有效的索引名
-ElasticSearchConnector.PleaseSupplyValidIndexType=请输入有效的索引类型
-ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Content field name required unless using mapper attachments
-
-ElasticSearchConnector.ElasticSearch=Elasticsearch
-
-ElasticSearchConnector.MaxFileSizeBytesColon=最大文件大小(字节):
-ElasticSearchConnector.AllowedMIMETypesColon=被允许的MIME类型: 
-ElasticSearchConnector.AllowedFileExtensionsColon=被允许的文件扩展名: 
diff --git a/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js b/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js
deleted file mode 100644
index d85dbc0..0000000
--- a/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js
+++ /dev/null
@@ -1,87 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig() {
-  if (editconnection.serverlocation) {
-    if (editconnection.serverlocation.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation'))");
-      editconnection.serverlocation.focus();
-      return false;
-    }
-  }
-  if (editconnection.indexname) {
-    if (editconnection.indexname.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.PleaseSupplyValidIndexName'))");
-      editconnection.indexname.focus();
-      return false;
-    }
-  }
-  if (editconnection.indextype) {
-    if (editconnection.indextype.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.PleaseSupplyValidIndexType'))");
-      editconnection.indextype.focus();
-      return false;
-    }
-  }
-  if (editconnection.contentattributename) {
-    if (editconnection.contentattributename.value == "" && ((editconnection.usemapperattachments_checkbox.value == "true" && editconnection. usemapperattachments.checked == false) || (editconnection.usemapperattachments_checkbox.value != "true" && editconnection.usemapperattachments.value != "true"))) {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments'))");
-      editconnection.contentattributename.focus();
-      return false;
-    }
-  }
-  return true;
-}
-
-function checkConfigForSave() {
-  if (editconnection.serverlocation) {
-    if (editconnection.serverlocation.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('ElasticSearchConnector.Parameters'))");
-      editconnection.serverlocation.focus();
-      return false;
-    }
-  }
-  if (editconnection.indexname) {
-    if (editconnection.indexname.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.PleaseSupplyValidIndexName'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('ElasticSearchConnector.Parameters'))");
-      editconnection.indexname.focus();
-      return false;
-    }
-  }
-  if (editconnection.indextype) {
-    if (editconnection.indextype.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.PleaseSupplyValidIndexType'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('ElasticSearchConnector.Parameters'))");
-      editconnection.indextype.focus();
-      return false;
-    }
-  }
-  if (editconnection.contentattributename) {
-    if (editconnection.contentattributename.value == "" && ((editconnection.usemapperattachments_checkbox.value == "true" && editconnection. usemapperattachments.checked == false) || (editconnection.usemapperattachments_checkbox.value != "true" && editconnection.usemapperattachments.value != "true"))) {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments'))");
-      editconnection.contentattributename.focus();
-      return false;
-    }
-  }
-  return true;
-}
-//-->
-</script>
diff --git a/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html b/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html
deleted file mode 100644
index b02480c..0000000
--- a/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html
+++ /dev/null
@@ -1,111 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('ElasticSearchConnector.Parameters'))
-
-<table class="displaytable">
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ServerVersion'))</nobr>
-    </td>
-    <td class="value"><input name="serverversion" type="text"
-      value="$Encoder.attributeEscape($SERVERVERSION)" size="10" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ServerLocation'))</nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.URLColon'))
-    </td>
-    <td class="value"><input name="serverlocation" type="text"
-      value="$Encoder.attributeEscape($SERVERLOCATION)" size="48" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexNameColon'))</nobr></td>
-    <td class="value"><input name="indexname" type="text" value="$Encoder.attributeEscape($INDEXNAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexTypeColon'))</nobr></td>
-    <td class="value"><input name="indextype" type="text" value="$Encoder.attributeEscape($INDEXTYPE)"
-      size="24" /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.UseMapperAttachmentsColon'))</nobr></td>
-    <td class="value">
-       <input type="hidden" name="usemapperattachments_checkbox" value="true"/>
-       <input type="hidden" name="usemapperattachments_present" value="true"/>
-  #if($USEMAPPERATTACHMENTS == 'true')
-       <input type="checkbox" checked="true" name="usemapperattachments" value="true"/>
-  #else
-       <input type="checkbox" name="usemapperattachments" value="true"/>
-  #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.PipelineNameColon'))</nobr></td>
-    <td class="value"><input name="pipelinename" type="text" value="$Encoder.attributeEscape($PIPELINENAME)"
-      size="24" /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameColon'))</nobr></td>
-    <td class="value"><input name="contentattributename" type="text" value="$Encoder.attributeEscape($CONTENTATTRIBUTENAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.CreatedDateAttributeNameColon'))</nobr></td>
-    <td class="value"><input name="createddateattributename" type="text" value="$Encoder.attributeEscape($CREATEDDATEATTRIBUTENAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ModifiedDateAttributeNameColon'))</nobr></td>
-    <td class="value"><input name="modifieddateattributename" type="text" value="$Encoder.attributeEscape($MODIFIEDDATEATTRIBUTENAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexingDateAttributeNameColon'))</nobr></td>
-    <td class="value"><input name="indexingdateattributename" type="text" value="$Encoder.attributeEscape($INDEXINGDATEATTRIBUTENAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.MimeTypeAttributeNameColon'))</nobr></td>
-    <td class="value"><input name="mimetypeattributename" type="text" value="$Encoder.attributeEscape($MIMETYPEATTRIBUTENAME)"
-      size="24" /></td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="serverversion" value="$Encoder.attributeEscape($SERVERVERSION)" />
-<input type="hidden" name="serverlocation" value="$Encoder.attributeEscape($SERVERLOCATION)" />
-<input type="hidden" name="indexname" value="$Encoder.attributeEscape($INDEXNAME)" />
-<input type="hidden" name="indextype" value="$Encoder.attributeEscape($INDEXTYPE)" />
-<input type="hidden" name="usemapperattachments_checkbox" value="false"/>
-<input type="hidden" name="usemapperattachments_present" value="true"/>
-<input type="hidden" name="usemapperattachments" value="$Encoder.bodyEscape($USEMAPPERATTACHMENTS)" />
-<input type="hidden" name="pipelinename" value="$Encoder.attributeEscape($PIPELINENAME)" />
-<input type="hidden" name="contentattributename" value="$Encoder.attributeEscape($CONTENTATTRIBUTENAME)" />
-<input type="hidden" name="createddateattributename" value="$Encoder.attributeEscape($CREATEDDATEATTRIBUTENAME)" />
-<input type="hidden" name="modifieddateattributename" value="$Encoder.attributeEscape($MODIFIEDDATEATTRIBUTENAME)" />
-<input type="hidden" name="indexingdateattributename" value="$Encoder.attributeEscape($INDEXINGDATEATTRIBUTENAME)" />
-<input type="hidden" name="mimetypeattributename" value="$Encoder.attributeEscape($MIMETYPEATTRIBUTENAME)" />
-
-#end
diff --git a/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html b/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html
deleted file mode 100644
index 93079e1..0000000
--- a/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html
+++ /dev/null
@@ -1,65 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ServerVersion'))</nobr>
-    <td class="value">$Encoder.bodyEscape($SERVERVERSION)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ServerLocation'))</nobr>
-    $Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.URLColon'))</td>
-    <td class="value">$Encoder.bodyEscape($SERVERLOCATION)</td>
-  </tr>
-    <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($INDEXNAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexTypeColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($INDEXTYPE)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.UseMapperAttachmentsColon'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($USEMAPPERATTACHMENTS)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.PipelineNameColon'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($PIPELINENAME)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($CONTENTATTRIBUTENAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.CreatedDateAttributeNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($CREATEDDATEATTRIBUTENAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ModifiedDateAttributeNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($MODIFIEDDATEATTRIBUTENAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexingDateAttributeNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($INDEXINGDATEATTRIBUTENAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.MimeTypeAttributeNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($MIMETYPEATTRIBUTENAME)</td>
-  </tr>
-
-</table>
\ No newline at end of file
diff --git a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/APISanityHSQLDBIT.java b/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/APISanityHSQLDBIT.java
deleted file mode 100644
index 3f48327..0000000
--- a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/APISanityHSQLDBIT.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.elasticsearch.tests;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.core.interfaces.Configuration;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author Piergiorgio Lucidi
- */
-public class APISanityHSQLDBIT extends BaseITHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    try
-    {
-      
-      int i;
-
-      // Create a basic file system connection, and save it.
-      ConfigurationNode connectionObject;
-      ConfigurationNode child;
-      Configuration requestObject;
-      Configuration result;
-      
-      connectionObject = new ConfigurationNode("repositoryconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("Test Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Test Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("10");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("configuration");
-      
-      //Testing Repository Connector parameters
-      
-      // MHL
-      
-      /*
-      ConfigurationNode cmisBindingNode = new ConfigurationNode("_PARAMETER_");
-      cmisBindingNode.setAttribute("name", CmisConfig.BINDING_PARAM);
-      cmisBindingNode.setValue(CmisConfig.BINDING_DEFAULT_VALUE);
-      child.addChild(child.getChildCount(), cmisBindingNode);
-      */
-      
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("repositoryconnections/Test%20Connection",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-      
-      // Create a basic null output connection, and save it.
-      connectionObject = new ConfigurationNode("outputconnection");
-      
-      child = new ConfigurationNode("name");
-      child.setValue("ElasticSearch");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      child = new ConfigurationNode("description");
-      child.setValue("ElasticSearch Connection");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("100");
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-
-      child = new ConfigurationNode("configuration");
-      
-      //ElasticSearch Output Connector parameters
-      
-      //serverlocation
-      ConfigurationNode serverLocation = new ConfigurationNode("_PARAMETER_");
-      serverLocation.setAttribute("name", "serverlocation");
-      serverLocation.setValue("http://localhost:9200");
-      child.addChild(child.getChildCount(), serverLocation);
-      
-      //indexname
-      ConfigurationNode indexName = new ConfigurationNode("_PARAMETER_");
-      indexName.setAttribute("name", "indexname");
-      indexName.setValue("index");
-      child.addChild(child.getChildCount(), indexName);
-      
-      //indextype
-      ConfigurationNode indexType = new ConfigurationNode("_PARAMETER_");
-      indexType.setAttribute("name", "indextype");
-      indexType.setValue("generictype");
-      child.addChild(child.getChildCount(), indexType);
-      
-      connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-      requestObject = new Configuration();
-      requestObject.addChild(0,connectionObject);
-      
-      result = performAPIPutOperationViaNodes("outputconnections/ElasticSearch",201,requestObject);
-      
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-      }
-
-      // Create a job.
-      ConfigurationNode jobObject = new ConfigurationNode("job");
-      
-      child = new ConfigurationNode("description");
-      child.setValue("Test Job");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("repository_connection");
-      child.setValue("Test Connection");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      // Revamped way of adding output connection
-      child = new ConfigurationNode("pipelinestage");
-      ConfigurationNode pipelineChild = new ConfigurationNode("stage_id");
-      pipelineChild.setValue("0");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_isoutput");
-      pipelineChild.setValue("true");
-      child.addChild(child.getChildCount(),pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_connectionname");
-      pipelineChild.setValue("ElasticSearch");
-      child.addChild(child.getChildCount(),pipelineChild);
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("run_mode");
-      child.setValue("scan once");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("start_mode");
-      child.setValue("manual");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("hopcount_mode");
-      child.setValue("accurate");
-      jobObject.addChild(jobObject.getChildCount(),child);
-
-      child = new ConfigurationNode("document_specification");
-      
-      jobObject.addChild(jobObject.getChildCount(),child);
-      
-      requestObject = new Configuration();
-      requestObject.addChild(0,jobObject);
-      
-      result = performAPIPostOperationViaNodes("jobs",201,requestObject);
-      
-      String jobIDString = null;
-      i = 0;
-      while (i < result.getChildCount())
-      {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error"))
-          throw new Exception(resultNode.getValue());
-        else if (resultNode.getType().equals("job_id"))
-          jobIDString = resultNode.getValue();
-      }
-      if (jobIDString == null)
-        throw new Exception("Missing job_id from return!");
-      
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      long count;
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 3)
-        throw new ManifoldCFException("Wrong number of documents processed - expected 3, saw "+new Long(count).toString());
-      
-      // Now, delete the job.
-      deleteJob(jobIDString);
-
-      waitJobDeleted(jobIDString, 120000L);
-      
-      // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  protected void startJob(String jobIDString)
-    throws Exception
-  {
-    Configuration requestObject = new Configuration();
-    
-    Configuration result = performAPIPutOperationViaNodes("start/"+jobIDString,201,requestObject);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-  }
-  
-  protected void deleteJob(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIDeleteOperationViaNodes("jobs/"+jobIDString,200);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-
-  }
-  
-  protected String getJobStatus(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String status = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("status"))
-            status = childNode.getValue();
-        }
-      }
-    }
-    return status;
-  }
-
-  protected long getJobDocumentsProcessed(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String documentsProcessed = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("documents_processed"))
-            documentsProcessed = childNode.getValue();
-        }
-      }
-    }
-    if (documentsProcessed == null)
-      throw new Exception("Expected a documents_processed field, didn't find it");
-    return new Long(documentsProcessed).longValue();
-  }
-
-  protected void waitJobInactive(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        throw new Exception("No such job: '"+jobIDString+"'");
-      if (status.equals("not yet run"))
-        throw new Exception("Job was never started.");
-      if (status.equals("done"))
-        return;
-      if (status.equals("error"))
-        throw new Exception("Job reports error.");
-      ManifoldCF.sleep(1000L);
-      continue;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-  
-  protected void waitJobDeleted(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatus(jobIDString);
-      if (status == null)
-        return;
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-    
-
-}
diff --git a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseHSQLDB.java b/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseHSQLDB.java
deleted file mode 100644
index 4c8c977..0000000
--- a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.elasticsearch.tests;
-
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Elastic Search"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector"};
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseITHSQLDB.java b/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseITHSQLDB.java
deleted file mode 100644
index eefda6f..0000000
--- a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.elasticsearch.tests;
-
-import org.elasticsearch.node.Node;
-import org.junit.After;
-import org.junit.Before;
-
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.webapp.WebAppContext;
-
-import static org.elasticsearch.node.NodeBuilder.*;
-
-/**  
- *  Base integration tests class for Elastic Search tested against a CMIS repository
- *  @author Piergiorgio Lucidi
- * 
- * */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected Node node = null;
-
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"CMIS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-
-  protected String[] getOutputNames()
-  {
-    return new String[]{"ElasticSearch"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector"};
-  }
-
-  @Before
-  public void setupElasticSearch()
-    throws Exception
-  {
-    //Initialize ElasticSearch server
-    //the default port is 9200
-    System.out.println("ElasticSearch is starting...");
-    node = nodeBuilder().local(true).node();
-    System.out.println("ElasticSearch is started on port 9200");
-  }
-  
-  
-  @After
-  public void cleanUpElasticSearch(){
-    if(node!=null)
-      node.close();
-  }
-  
-}
diff --git a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BasePostgresql.java b/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BasePostgresql.java
deleted file mode 100644
index 1da1d6c..0000000
--- a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BasePostgresql.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.elasticsearch.tests;
-
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Elastic Search"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector"};
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseUIHSQLDB.java b/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 264b971..0000000
--- a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.elasticsearch.tests;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Test Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"ElasticSearch"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector"};
-  }
-
-}
diff --git a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/NavigationHSQLDBUI.java b/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 2a1cce4..0000000
--- a/connectors/elasticsearch/connector/src/test/java/org/apache/manifoldcf/agents/output/elasticsearch/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.elasticsearch.tests;
-
-import java.util.Locale;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-import org.junit.Test;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.output.elasticsearch.ElasticSearchConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Parameters tab
-    testerInstance.clickTab("Parameters");
-    testerInstance.setValue("serverlocation", "http://localhost:9200/");
-    testerInstance.setValue("indexname", "index");
-    testerInstance.setValue("indextype", "generictype");
-    
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // MHL
-    
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/elasticsearch/pom.xml b/connectors/elasticsearch/pom.xml
deleted file mode 100644
index 453d522..0000000
--- a/connectors/elasticsearch/pom.xml
+++ /dev/null
@@ -1,478 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

- 

-<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/xsd/maven-4.0.0.xsd">

-  <parent>

-    <groupId>org.apache.manifoldcf</groupId>

-    <artifactId>mcf-connectors</artifactId>

-    <version>2.10-SNAPSHOT</version>

-  </parent>

-  <modelVersion>4.0.0</modelVersion>

-  

-  <repositories>

-    <repository>

-      <id>sonatype</id>

-      <url>https://oss.sonatype.org/content/repositories/releases</url>

-    </repository>

-  </repositories>

-

-  <developers>

-    <developer>

-      <name>Luca Stancapiano</name>

-      <organization>vige</organization>

-      <organizationUrl>http://www.vige.it</organizationUrl>

-      <url />

-    </developer>

-    <developer>

-      <name>Piergiorgio Lucidi</name>

-      <organization>Sourcesense</organization>

-      <organizationUrl>http://www.sourcesense.com</organizationUrl>

-      <url>http://www.open4dev.com</url>

-    </developer>

-  </developers>

-  

-  <properties>

-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

-  </properties>

-

-  <artifactId>mcf-elasticsearch-connector</artifactId>

-  <name>ManifoldCF - Connectors - ElasticSearch</name>

-

-  <build>

-    <defaultGoal>integration-test</defaultGoal>

-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>

-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>

-    <resources>

-      <resource>

-        <directory>${basedir}/connector/src/main/native2ascii</directory>

-        <includes>

-          <include>**/*.properties</include>

-        </includes>

-      </resource>

-      <resource>

-        <directory>${basedir}/connector/src/main/resources</directory>

-        <includes>

-          <include>**/*.html</include>

-          <include>**/*.js</include>

-        </includes>

-      </resource>

-    </resources> 

-    <testResources>

-      <testResource>

-        <directory>${basedir}/connector/src/test/resources</directory>

-      </testResource>

-    </testResources>

-

-    <plugins>

-

-      <plugin>

-        <groupId>org.codehaus.mojo</groupId>

-        <artifactId>native2ascii-maven-plugin</artifactId>

-        <version>1.0-beta-1</version>

-        <configuration>

-            <workDir>target/classes</workDir>

-        </configuration>

-        <executions>

-            <execution>

-                <id>native2ascii-utf8</id>

-                <goals>

-                    <goal>native2ascii</goal>

-                </goals>

-                <configuration>

-                    <encoding>UTF8</encoding>

-                    <includes>

-                      <include>**/*.properties</include>

-                    </includes>

-                </configuration>

-            </execution>

-        </executions>

-      </plugin>

-

-      <plugin>

-        <artifactId>maven-dependency-plugin</artifactId>

-        <executions>

-           <execution>

-            <id>copy-war</id>

-            <phase>generate-resources</phase>

-            <goals>

-              <goal>copy</goal>

-            </goals>

-            <configuration>

-              <outputDirectory>target/dependency</outputDirectory>

-              <artifactItems>

-                <artifactItem>

-                  <groupId>${project.groupId}</groupId>

-                  <artifactId>mcf-api-service</artifactId>

-                  <version>${project.version}</version>

-                  <type>war</type>

-                  <overWrite>false</overWrite>

-                  <destFileName>mcf-api-service.war</destFileName>

-                </artifactItem>

-                <artifactItem>

-                  <groupId>${project.groupId}</groupId>

-                  <artifactId>mcf-authority-service</artifactId>

-                  <version>${project.version}</version>

-                  <type>war</type>

-                  <overWrite>false</overWrite>

-                  <destFileName>mcf-authority-service.war</destFileName>

-                </artifactItem>

-                <artifactItem>

-                  <groupId>${project.groupId}</groupId>

-                  <artifactId>mcf-crawler-ui</artifactId>

-                  <version>${project.version}</version>

-                  <type>war</type>

-                  <overWrite>false</overWrite>

-                  <destFileName>mcf-crawler-ui.war</destFileName>

-                </artifactItem>

-              </artifactItems>

-            </configuration>

-          </execution>

-        </executions>

-      </plugin>

-

-      <!-- Test plugin configuration -->

-      <plugin>

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

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

-        <configuration>

-          <excludes>

-            <exclude>**/*Postgresql*.java</exclude>

-            <exclude>**/*MySQL*.java</exclude>

-          </excludes>

-          <forkCount>1</forkCount>

-          <reuseForks>false</reuseForks>

-          <workingDirectory>target/test-output</workingDirectory>

-        </configuration>

-      </plugin>

-

-      <plugin>

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

-        <artifactId>maven-failsafe-plugin</artifactId>

-        <version>2.18.1</version>

-        <configuration>

-          <skipTests>${skipITs}</skipTests>

-          <systemPropertyVariables>

-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>

-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>

-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>

-          </systemPropertyVariables>

-          <excludes>

-            <exclude>**/*Postgresql*.java</exclude>

-            <exclude>**/*MySQL*.java</exclude>

-          </excludes>

-          <forkCount>1</forkCount>

-          <reuseForks>false</reuseForks>

-          <workingDirectory>target/test-output</workingDirectory>

-        </configuration>

-        <executions>

-          <execution>

-            <id>integration-test</id>

-            <goals>

-              <goal>integration-test</goal>

-            </goals>

-          </execution>

-          <execution>

-            <id>verify</id>

-            <goals>

-              <goal>verify</goal>

-            </goals>

-          </execution>

-        </executions>

-      </plugin>

-

-    </plugins>

-  </build>

-

-  <dependencies>

-    <!-- Main build dependencies -->

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-core</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-connector-common</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-agents</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-pull-agent</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-ui-core</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.httpcomponents</groupId>

-      <artifactId>httpclient</artifactId>

-      <version>${httpcomponent.httpclient.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>commons-logging</groupId>

-      <artifactId>commons-logging</artifactId>

-      <version>${commons-logging.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>commons-codec</groupId>

-      <artifactId>commons-codec</artifactId>

-      <version>${commons-codec.version}</version>

-    </dependency>

-    

-    <!-- Testing dependencies -->

-    

-    <dependency>

-      <groupId>junit</groupId>

-      <artifactId>junit</artifactId>

-      <version>${junit.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-core</artifactId>

-      <version>${project.version}</version>

-      <type>test-jar</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-agents</artifactId>

-      <version>${project.version}</version>

-      <type>test-jar</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-pull-agent</artifactId>

-      <version>${project.version}</version>

-      <type>test-jar</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.postgresql</groupId>

-      <artifactId>postgresql</artifactId>

-      <version>${postgresql.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.hsqldb</groupId>

-      <artifactId>hsqldb</artifactId>

-      <version>${hsqldb.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>mysql</groupId>

-      <artifactId>mysql-connector-java</artifactId>

-      <version>${mysql.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-api-service</artifactId>

-      <version>${project.version}</version>

-      <type>war</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-authority-service</artifactId>

-      <version>${project.version}</version>

-      <type>war</type>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-crawler-ui</artifactId>

-      <version>${project.version}</version>

-      <type>war</type>

-      <scope>test</scope>

-    </dependency>

-

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-server</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-util</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-webapp</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-servlet</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-http</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-io</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-security</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-continuation</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.eclipse.jetty</groupId>

-      <artifactId>jetty-xml</artifactId>

-      <version>${jetty.version}</version>

-      <scope>test</scope>

-    </dependency>

-

-    <dependency>

-      <groupId>org.mortbay.jetty</groupId>

-      <artifactId>jsp-api-2.1-glassfish</artifactId>

-      <version>${glassfish.version}</version>

-      <scope>test</scope>

-    </dependency>    

-    <dependency>

-      <groupId>org.mortbay.jetty</groupId>

-      <artifactId>jsp-2.1-glassfish</artifactId>

-      <version>${glassfish.version}</version>

-      <scope>test</scope>

-    </dependency>

-    

-    <dependency>

-      <groupId>org.slf4j</groupId>

-      <artifactId>slf4j-api</artifactId>

-      <version>${slf4j.version}</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.slf4j</groupId>

-      <artifactId>slf4j-simple</artifactId>

-      <version>${slf4j.version}</version>

-      <scope>test</scope>

-    </dependency>

-

-    <!-- Elastic Search dependencies -->

-    <dependency>

-      <groupId>org.elasticsearch</groupId>

-      <artifactId>elasticsearch</artifactId>

-      <version>1.0.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-core</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>                 

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-analyzers-common</artifactId>   

-      <version>4.6.1</version>                            

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-codecs</artifactId>

-      <version>4.6.1</version>                                                                    

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-queries</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-memory</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-highlighter</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-queryparser</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-misc</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-join</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.lucene</groupId>

-      <artifactId>lucene-grouping</artifactId>

-      <version>4.6.1</version>

-      <scope>test</scope>

-    </dependency>

-    

-    <!-- Attachment Plugin -->

-    <dependency>

-      <groupId>org.elasticsearch</groupId>

-      <artifactId>elasticsearch-mapper-attachments</artifactId>

-      <version>2.0.0.RC1</version>

-      <scope>test</scope>

-      <exclusions>

-        <exclusion>

-          <groupId>log4j</groupId>

-          <artifactId>log4j</artifactId>

-        </exclusion>

-      </exclusions>

-    </dependency>

-

-  </dependencies>

-</project>

diff --git a/connectors/elasticsearch/test-materials/README.txt b/connectors/elasticsearch/test-materials/README.txt
deleted file mode 100644
index d40ddbf..0000000
--- a/connectors/elasticsearch/test-materials/README.txt
+++ /dev/null
@@ -1,19 +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.
-
-To test this connector, copy the contents of the unpacked elastic search binary's
-lib folder into this directory, and use the "ant test" target for the standard ant build.
-You can read more about the process on the "how-to-build-and-deploy.html"
-documentation page.
diff --git a/connectors/email/.gitignore b/connectors/email/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/email/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/email/build.xml b/connectors/email/build.xml
deleted file mode 100644
index bf6f808..0000000
--- a/connectors/email/build.xml
+++ /dev/null
@@ -1,44 +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.
--->
-
-<project name="email" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="EMail"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.email.EmailConnector"/>
-        </antcall>
-        <antcall target="general-add-notification-connector">
-            <param name="connector-label" value="EMail"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.notifications.email.EmailConnector"/>
-        </antcall>
-    </target>
-
-</project>
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConfig.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConfig.java
deleted file mode 100644
index 689b1b6..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConfig.java
+++ /dev/null
@@ -1,131 +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 org.apache.manifoldcf.crawler.connectors.email;
-
-
-/**
-* Parameters data for the Email repository connector.
-*/
-public class EmailConfig {
-
-  /**
-  * Username
-  */
-  public static final String USERNAME_PARAM = "username";
-
-  /**
-  * Password
-  */
-  public static final String PASSWORD_PARAM = "password";
-
-  /**
-  * Protocol
-  */
-  public static final String PROTOCOL_PARAM = "protocol";
-
-  /**
-  * Server name
-  */
-  public static final String SERVER_PARAM = "server";
-
-  /**
-  * Port
-  */
-  public static final String PORT_PARAM = "port";
-
-  /**
-  * URL template
-  */
-  public static final String URL_PARAM = "url";
-  
-  /**
-  * Attachment URL template
-  */
-  public static final String ATTACHMENT_URL_PARAM = "attachmenturl";
-  
-  // Protocol options
-  
-  public static final String PROTOCOL_IMAP = "IMAP";
-  public static final String PROTOCOL_IMAPS = "IMAP-SSL";
-  public static final String PROTOCOL_POP3 = "POP3";
-  public static final String PROTOCOL_POP3S = "POP3-SSL";
-  
-  // Protocol providers
-  
-  public static final String PROTOCOL_IMAP_PROVIDER = "imap";
-  public static final String PROTOCOL_IMAPS_PROVIDER = "imaps";
-  public static final String PROTOCOL_POP3_PROVIDER = "pop3";
-  public static final String PROTOCOL_POP3S_PROVIDER = "pop3s";
-  
-  // Default values and various other constants
-  
-  public static final String PROTOCOL_DEFAULT_VALUE = "IMAP";
-  public static final String PORT_DEFAULT_VALUE = "";
-  public static final String[] BASIC_METADATA = {"To","From","Subject","Date","Encoding of Attachment",
-      "MIME Type of attachment", "File Name of Attachment"};
-  public static final String BASIC_EXTRACT_EMAIL = "Use E-Mail Extractor";
-  public static final String[] BASIC_SEARCHABLE_ATTRIBUTES = {"To","From","Subject","Body","Start Date", "End Date"};
-
-  // Specification nodes
-  
-  public static final String NODE_PROPERTIES = "properties";
-  public static final String NODE_METADATA = "metadata";
-  public static final String NODE_EXTRACT_EMAIL = "extractemail";
-  public static final String NODE_FILTER = "filter";
-  public static final String NODE_FOLDER = "folder";
-  
-  public static final String ATTRIBUTE_NAME = "name";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-  // Metadata field names
-  
-  public static final String EMAIL_SUBJECT = "subject";
-  public static final String EMAIL_FROM = "from";
-  public static final String EMAIL_TO = "to";
-  public static final String EMAIL_BODY = "body";
-  public static final String EMAIL_DATE = "date";
-  public static final String EMAIL_ATTACHMENT_ENCODING = "encoding of attachment";
-  public static final String EMAIL_ATTACHMENT_MIMETYPE = "mime type of attachment";
-  public static final String EMAIL_ATTACHMENTNAME = "file name of attachment";
-  public static final String EMAIL_VERSION = "1.0";
-
-  // Date field names for filtering
-  public static final String EMAIL_FILTERING_DATE_FORMAT = "dd/MM/yyyy";
-  public static final String EMAIL_START_DATE = "start date";
-  public static final String EMAIL_END_DATE = "end date";
-
-  // Mime types
-  
-  public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
-  public static final String MIMETYPE_HTML = "text/html";
-  public static final String MIMETYPE_MULTIPART_GENERIC = "multipart/*";
-  public static final String MIMETYPE_MULTIPART_ALTERNATIVE = "multipart/alternative";
-  
-  // Fields
-  
-  public static final String ENCODING_FIELD = "encoding";
-  public static final String MIMETYPE_FIELD = "mimetype";
-  public static final String ATTACHMENTNAME_FIELD = "attachmentname";
-  public static final String MAILSUBJECT_FIELD = "mailsubject";
-  //public static final String TO = "To";
-  
-  // Activity names
-  
-  public final static String ACTIVITY_FETCH = "fetch";
-
-}
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java
deleted file mode 100644
index 18b618a..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java
+++ /dev/null
@@ -1,2246 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.email;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import javax.mail.*;
-import javax.mail.internet.MimeMessage;
-import javax.mail.search.*;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.nio.charset.StandardCharsets;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
-* This interface describes an instance of a connection between a repository and ManifoldCF's
-* standard "pull" ingestion agent.
-* <p/>
-* Each instance of this interface is used in only one thread at a time. Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters. That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-* <p/>
-* Implementers of this interface should provide a default constructor which has this signature:
-* <p/>
-* xxx();
-* <p/>
-* Connectors are either configured or not. If configured, they will persist in a pool, and be
-* reused multiple times. Certain methods of a connector may be called before the connector is
-* configured. This includes basically all methods that permit inspection of the connector's
-* capabilities. The complete list is:
-* <p/>
-* <p/>
-* The purpose of the repository connector is to allow documents to be fetched from the repository.
-* <p/>
-* Each repository connector describes a set of documents that are known only to that connector.
-* It therefore establishes a space of document identifiers. Each connector will only ever be
-* asked to deal with identifiers that have in some way originated from the connector.
-* <p/>
-* Documents are fetched in three stages. First, the getDocuments() method is called in the connector
-* implementation. This returns a set of document identifiers. The document identifiers are used to
-* obtain the current document version strings in the second stage, using the getDocumentVersions() method.
-* The last stage is processDocuments(), which queues up any additional documents needed, and also ingests.
-* This method will not be called if the document version seems to indicate that no document change took
-* place.
-*/
-
-public class EmailConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector {
-
-  protected final static long SESSION_EXPIRATION_MILLISECONDS = 300000L;
-  
-  // Local variables.
-  protected long sessionExpiration = -1L;
-  
-  // Parameters for establishing a session
-  
-  protected String server = null;
-  protected String portString = null;
-  protected String username = null;
-  protected String password = null;
-  protected String protocol = null;
-  protected Properties properties = null;
-  protected String urlTemplate = null;
-  protected String attachmentUrlTemplate = null;
-  
-  // Local session handle
-  protected EmailSession session = null;
-
-  private static Map<String,String> providerMap;
-  static
-  {
-    providerMap = new HashMap<String,String>();
-    providerMap.put(EmailConfig.PROTOCOL_POP3, EmailConfig.PROTOCOL_POP3_PROVIDER);
-    providerMap.put(EmailConfig.PROTOCOL_POP3S, EmailConfig.PROTOCOL_POP3S_PROVIDER);
-    providerMap.put(EmailConfig.PROTOCOL_IMAP, EmailConfig.PROTOCOL_IMAP_PROVIDER);
-    providerMap.put(EmailConfig.PROTOCOL_IMAPS, EmailConfig.PROTOCOL_IMAPS_PROVIDER);
-  }
-  //////////////////////////////////Start of Basic Connector Methods/////////////////////////
-
-  /**
-  * Connect.
-  *
-  * @param configParameters is the set of configuration parameters, which
-  * in this case describe the root directory.
-  */
-  @Override
-  public void connect(ConfigParams configParameters) {
-    super.connect(configParameters);
-    this.server = configParameters.getParameter(EmailConfig.SERVER_PARAM);
-    this.portString = configParameters.getParameter(EmailConfig.PORT_PARAM);
-    this.protocol = configParameters.getParameter(EmailConfig.PROTOCOL_PARAM);
-    this.username = configParameters.getParameter(EmailConfig.USERNAME_PARAM);
-    this.password = configParameters.getObfuscatedParameter(EmailConfig.PASSWORD_PARAM);
-    this.urlTemplate = configParameters.getParameter(EmailConfig.URL_PARAM);
-    this.attachmentUrlTemplate = configParameters.getParameter(EmailConfig.ATTACHMENT_URL_PARAM);
-    this.properties = new Properties();
-    int i = 0;
-    while (i < configParameters.getChildCount()) //In post property set is added as a configuration node
-    {
-      ConfigNode cn = configParameters.getChild(i++);
-      if (cn.getType().equals(EmailConfig.NODE_PROPERTIES)) {
-        String findParameterName = cn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        String findParameterValue = cn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-        this.properties.setProperty(findParameterName, findParameterValue);
-      }
-    }
-  }
-
-  /**
-  * Close the connection. Call this before discarding this instance of the
-  * repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException {
-    this.attachmentUrlTemplate = null;
-    this.urlTemplate = null;
-    this.server = null;
-    this.portString = null;
-    this.protocol = null;
-    this.username = null;
-    this.password = null;
-    this.properties = null;
-    finalizeConnection();
-    super.disconnect();
-  }
-
-  /**
-  * This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (session != null)
-    {
-      if (System.currentTimeMillis() >= sessionExpiration)
-        finalizeConnection();
-    }
-  }
-
-  /**
-  * Test the connection. Returns a string describing the connection integrity.
-  *
-  * @return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-      throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    // Force a re-connection
-    finalizeConnection();
-    getSession();
-    try {
-      CheckConnectionThread cct = new CheckConnectionThread(session);
-      cct.start();
-      cct.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (MessagingException e) {
-      handleMessagingException(e,"checking the connection");
-    }
-  }
-
-  ///////////////////////////////End of Basic Connector Methods////////////////////////////////////////
-
-  //////////////////////////////Start of Repository Connector Method///////////////////////////////////
-
-  @Override
-  public int getConnectorModel() {
-    return MODEL_ADD; //Change is not applicable in context of email
-  }
-
-  /**
-  * Return the list of activities that this connector supports (i.e. writes into the log).
-  *
-  * @return the list.
-  */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[]{EmailConfig.ACTIVITY_FETCH};
-  }
-
-  /**
-  * Get the bin name strings for a document identifier. The bin name describes the queue to which the
-  * document will be assigned for throttling purposes. Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *
-  * @param documentIdentifier is the document identifier.
-  * @return the set of bin names. If an empty array is returned, it is equivalent to there being no request
-  * rate throttling available for this identifier.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[]{server};
-  }
-
-  /**
-  * Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *
-  * @return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest() {
-    return 10;
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param lastSeedVersion is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {
-
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else
-    {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-
-    getSession();
-
-    int i = 0;
-    Map<String,String> findMap = new HashMap<String,String>();
-    List<String> folderNames = new ArrayList<String>();
-    while (i < spec.getChildCount()) {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals(EmailConfig.NODE_FOLDER)) {
-        folderNames.add(sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME));
-      } else if (sn.getType().equals(EmailConfig.NODE_FILTER)) {
-        String findParameterName, findParameterValue;
-        findParameterName = sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        findParameterValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-        findMap.put(findParameterName, findParameterValue);
-
-      }
-
-    }
-    
-    for (String folderName : folderNames)
-    {
-      try {
-        OpenFolderThread oft = new OpenFolderThread(session, folderName);
-        oft.start();
-        Folder folder = oft.finishUp();
-        try
-        {
-          Message[] messages = findMessages(folder, startTime, seedTime, findMap);
-          for (Message message : messages) {
-            String emailID = ((MimeMessage) message).getMessageID();
-            activities.addSeedDocument(createDocumentIdentifier(folderName,emailID));
-          }
-        }
-        finally
-        {
-          CloseFolderThread cft = new CloseFolderThread(session, folder);
-          cft.start();
-          cft.finishUp();
-        }
-      } catch (InterruptedException e) {
-        throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-      } catch (MessagingException e) {
-        handleMessagingException(e, "finding emails");
-      }
-    }
-
-    return new Long(seedTime).toString();
-  }
-
-  /*
-  This method will return the list of messages which matches the given criteria
-  */
-  private Message[] findMessages(Folder folder, long startTime, long endTime, Map<String,String> findMap)
-    throws MessagingException, InterruptedException {
-    String findParameterName;
-    String findParameterValue;
-    
-    SearchTerm searchTerm = null;
-    
-    Iterator<Map.Entry<String,String>> it = findMap.entrySet().iterator();
-    while (it.hasNext()) {
-      Map.Entry<String,String> pair = it.next();
-      findParameterName = pair.getKey().toLowerCase(Locale.ROOT);
-      findParameterValue = pair.getValue();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Email: Finding emails where '" + findParameterName +
-            "' = '" + findParameterValue + "'");
-      SearchTerm searchClause = null;
-      Integer comparisonTerm = null;
-      if (findParameterName.equals(EmailConfig.EMAIL_SUBJECT)) {
-        searchClause = new SubjectTerm(findParameterValue);
-      } else if (findParameterName.equals(EmailConfig.EMAIL_FROM)) {
-        searchClause = new FromStringTerm(findParameterValue);
-      } else if (findParameterName.equals(EmailConfig.EMAIL_TO)) {
-        searchClause = new RecipientStringTerm(Message.RecipientType.TO, findParameterValue);
-      } else if (findParameterName.equals(EmailConfig.EMAIL_BODY)) {
-        searchClause = new BodyTerm(findParameterValue);
-      } else if (findParameterName.equals(EmailConfig.EMAIL_START_DATE)) {
-        comparisonTerm = ComparisonTerm.GT;
-      } else if (findParameterName.equals(EmailConfig.EMAIL_END_DATE)) {
-        comparisonTerm = ComparisonTerm.LT;
-      }
-
-      if (comparisonTerm != null) {
-        SimpleDateFormat date = new SimpleDateFormat(EmailConfig.EMAIL_FILTERING_DATE_FORMAT);
-        try {
-          searchClause = new ReceivedDateTerm(comparisonTerm, date.parse(findParameterValue));
-        } catch (ParseException e) {
-          Logging.connectors.warn("Email: Unknown date format: '" + findParameterValue + "'for filter parameter name: '" + findParameterName + "'");
-        }
-      }
-
-
-      if (searchClause != null)
-      {
-        if (searchTerm == null)
-          searchTerm = searchClause;
-        else
-          searchTerm = new AndTerm(searchTerm, searchClause);
-      }
-      else
-      {
-        Logging.connectors.warn("Email: Unknown filter parameter name: '"+findParameterName+"'");
-      }
-    }
-    
-    Message[] result;
-    if (searchTerm == null)
-    {
-      GetMessagesThread gmt = new GetMessagesThread(session, folder);
-      gmt.start();
-      result = gmt.finishUp();
-    }
-    else
-    {
-      SearchMessagesThread smt = new SearchMessagesThread(session, folder, searchTerm);
-      smt.start();
-      result = smt.finishUp();
-    }
-    return result;
-  }
-
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      
-      // Check that all the required parameters are there.
-      if (urlTemplate == null)
-        throw new ManifoldCFException("Missing url parameter");
-      if (server == null)
-        throw new ManifoldCFException("Missing server parameter");
-      if (properties == null)
-        throw new ManifoldCFException("Missing server properties");
-      if (protocol == null)
-        throw new ManifoldCFException("Missing protocol parameter");
-      
-      // Create a session.
-      int port;
-      if (portString != null && portString.length() > 0)
-      {
-        try
-        {
-          port = Integer.parseInt(portString);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Port number has bad format: "+e.getMessage(),e);
-        }
-      }
-      else
-        port = -1;
-
-      try {
-        ConnectThread connectThread = new ConnectThread(server, port, username, password,
-          providerMap.get(protocol), properties);
-        connectThread.start();
-        session = connectThread.finishUp();
-      } catch (InterruptedException e) {
-        throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-      } catch (MessagingException e) {
-        handleMessagingException(e, "connecting");
-      }
-    }
-    sessionExpiration = System.currentTimeMillis() + SESSION_EXPIRATION_MILLISECONDS;
-  }
-
-  protected void finalizeConnection() {
-    if (session != null) {
-      try {
-        CloseSessionThread closeSessionThread = new CloseSessionThread(session);
-        closeSessionThread.start();
-        closeSessionThread.finishUp();
-      } catch (InterruptedException e) {
-      } catch (MessagingException e) {
-        Logging.connectors.warn("Error while closing connection to server: " + e.getMessage(),e);
-      } finally {
-        session = null;
-      }
-    }
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-
-    List<String> requiredMetadata = new ArrayList<String>();
-    boolean useEmailExtractor = false;
-    for (int i = 0; i < spec.getChildCount(); i++) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(EmailConfig.NODE_METADATA)) {
-        String metadataAttribute = sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        requiredMetadata.add(metadataAttribute);
-      }
-      if (sn.getType().equals(EmailConfig.NODE_EXTRACT_EMAIL)) {
-        useEmailExtractor = true;
-      }
-    }
-    
-    // Keep a cached set of open folders
-    Map<String,Folder> openFolders = new HashMap<String,Folder>();
-    try {
-
-      for (String documentIdentifier : documentIdentifiers) {
-        final Integer attachmentIndex = extractAttachmentNumberFromDocumentIdentifier(documentIdentifier);
-        if (attachmentIndex == null) {
-          // It's an email
-          String versionString = "_" + urlTemplate;   // NOT empty; we need to make ManifoldCF understand that this is a document that never will change.
-          
-          // Check if we need to index
-          if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-            continue;
-          
-          String compositeID = documentIdentifier;
-          String version = versionString;
-          String folderName = extractFolderNameFromDocumentIdentifier(compositeID);
-          String id = extractEmailIDFromDocumentIdentifier(compositeID);
-          
-          String errorCode = null;
-          String errorDesc = null;
-          Long fileLengthLong = null;
-          long startTime = System.currentTimeMillis();
-          try {
-            try {
-              Folder folder = openFolders.get(folderName);
-              if (folder == null)
-              {
-                getSession();
-                OpenFolderThread oft = new OpenFolderThread(session, folderName);
-                oft.start();
-                folder = oft.finishUp();
-                openFolders.put(folderName,folder);
-              }
-              
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Email: Processing document identifier '"
-                  + compositeID + "'");
-              SearchTerm messageIDTerm = new MessageIDTerm(id);
-                
-              getSession();
-              SearchMessagesThread smt = new SearchMessagesThread(session, folder, messageIDTerm);
-              smt.start();
-              Message[] message = smt.finishUp();
-
-              String msgURL = makeDocumentURI(urlTemplate, folderName, id);
-
-              Message msg = null;
-              for (Message msg2 : message) {
-                msg = msg2;
-              }
-              if (msg == null) {
-                // email was not found
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-                
-              if (!activities.checkURLIndexable(msgURL)) {
-                errorCode = activities.EXCLUDED_URL;
-                errorDesc = "Excluded because of URL ('"+msgURL+"')";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-                
-              long fileLength = msg.getSize();
-              if (!activities.checkLengthIndexable(fileLength)) {
-                errorCode = activities.EXCLUDED_LENGTH;
-                errorDesc = "Excluded because of length ("+fileLength+")";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-                
-              Date sentDate = msg.getSentDate();
-              if (!activities.checkDateIndexable(sentDate)) {
-                errorCode = activities.EXCLUDED_DATE;
-                errorDesc = "Excluded because of date ("+sentDate+")";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-              
-              String mimeType = "text/plain";
-              if (!activities.checkMimeTypeIndexable(mimeType)) {
-                errorCode = activities.EXCLUDED_MIMETYPE;
-                errorDesc = "Excluded because of mime type ('"+mimeType+"')";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-              
-              RepositoryDocument rd = new RepositoryDocument();
-              rd.setFileName(msg.getFileName());
-              rd.setMimeType(mimeType);
-              rd.setCreatedDate(sentDate);
-              rd.setModifiedDate(sentDate);
-
-              for (String metadata : requiredMetadata) {
-                if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_TO)) {
-                  Address[] to = msg.getRecipients(Message.RecipientType.TO);
-                  if (to != null) {
-                    String[] toStr = new String[to.length];
-                    int j = 0;
-                    for (Address address : to) {
-                      toStr[j] = useEmailExtractor ? extractEmailAddress(address.toString()) : address.toString();
-                      j++;
-                    }
-                    rd.addField(EmailConfig.EMAIL_TO, toStr);
-                  }
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_FROM)) {
-                  Address[] from = msg.getFrom();
-                  String[] fromStr = new String[from.length];
-                  int j = 0;
-                  for (Address address : from) {
-                    fromStr[j] = useEmailExtractor ? extractEmailAddress(address.toString()) : address.toString();
-                    j++;
-                  }
-                  rd.addField(EmailConfig.EMAIL_FROM, fromStr);
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_SUBJECT)) {
-                  String subject = msg.getSubject();
-                  rd.addField(EmailConfig.EMAIL_SUBJECT, subject);
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_DATE)) {
-                  rd.addField(EmailConfig.EMAIL_DATE, sentDate.toString());
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_ATTACHMENT_ENCODING)) {
-                  Object o = msg.getContent();
-                  if (o != null) {
-                    if (o instanceof Multipart) {
-                      Multipart mp = (Multipart) o;
-                      String[] encoding = new String[mp.getCount()];
-                      for (int k = 0, n = mp.getCount(); k < n; k++) {
-                        Part part = mp.getBodyPart(k);
-                        if (isAttachment(part)) {
-                          final String[] fileSplit = part.getFileName().split("\\?");
-                          if (fileSplit.length > 1) {
-                            encoding[k] = fileSplit[1];
-                          } else {
-                            encoding[k] = "";
-                          }
-                        }
-                      }
-                      rd.addField(EmailConfig.ENCODING_FIELD, encoding);
-                    } else if (o instanceof String) {
-                      rd.addField(EmailConfig.ENCODING_FIELD, "");
-                    }
-                  }
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_ATTACHMENT_MIMETYPE)) {
-                  Object o = msg.getContent();
-                  if (o != null) {
-                    if (o instanceof Multipart) {
-                      Multipart mp = (Multipart) o;
-                      String[] MIMEType = new String[mp.getCount()];
-                      for (int k = 0, n = mp.getCount(); k < n; k++) {
-                        Part part = mp.getBodyPart(k);
-                        if (isAttachment(part)) {
-                          MIMEType[k] = part.getContentType();
-
-                        }
-                      }
-                      rd.addField(EmailConfig.MIMETYPE_FIELD, MIMEType);
-                    } else if (o instanceof String) {
-                      rd.addField(EmailConfig.MIMETYPE_FIELD, "");
-                    }
-                  }
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_ATTACHMENTNAME)) {
-                  Object o = msg.getContent();
-                  if (o != null) {
-                    if (o instanceof Multipart) {
-                      Multipart mp = (Multipart) o;
-                      String[] attachmentNames = new String[mp.getCount()];
-                      for (int k = 0, n = mp.getCount(); k < n; k++) {
-                        Part part = mp.getBodyPart(k);
-                        if (isAttachment(part)) {
-                          attachmentNames[k] = part.getFileName();
-                        }
-                      }
-                      rd.addField(EmailConfig.ATTACHMENTNAME_FIELD, attachmentNames);
-                    } else if (o instanceof String) {
-                      rd.addField(EmailConfig.ATTACHMENTNAME_FIELD, "");
-                    }
-                  }
-                }
-              }
-
-              //Content includes both body and attachments,
-              //Body will be set as content and attachments will be indexed as separate documents.
-              final EmailContent bodyContent = extractBodyContent(msg);
-              if(bodyContent != null) {
-                rd.setMimeType(bodyContent.getMimeType());
-                InputStream is = new ByteArrayInputStream(bodyContent.getContent().getBytes(StandardCharsets.UTF_8));
-                try {
-                  rd.setBinary(is, fileLength);
-                  activities.ingestDocumentWithException(documentIdentifier, version, msgURL, rd);
-                  errorCode = "OK";
-                  fileLengthLong = new Long(fileLength);
-                } finally {
-                  is.close();
-                }
-              }
-
-              // If we're supposed to deal with attachments, this is the time to queue them up
-              if (attachmentUrlTemplate != null) {
-                if (msg.getContent() != null && msg.getContent() instanceof Multipart) {
-                  final Multipart mp = (Multipart) msg.getContent();
-                  final int numAttachments = mp.getCount();
-                  for (int i = 0; i < numAttachments; i++) {
-                    if (isAttachment(mp.getBodyPart(i))) {
-                      activities.addDocumentReference(documentIdentifier + ":" + i);
-                    }
-                  }
-                }
-              }
-              
-            } catch (InterruptedException e) {
-              throw new ManifoldCFException(e.getMessage(), ManifoldCFException.INTERRUPTED);
-            } catch (MessagingException e) {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              handleMessagingException(e, "processing email");
-            } catch (IOException e) {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              handleIOException(e, "processing email");
-              throw new ManifoldCFException(e.getMessage(), e);
-            }
-          } catch (ManifoldCFException e) {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              errorCode = null;
-            throw e;
-          } finally {
-            if (errorCode != null)
-              activities.recordActivity(new Long(startTime),EmailConfig.ACTIVITY_FETCH,
-                fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-          }
-        } else {
-          // It's a specific attachment
-          final int attachmentNumber = attachmentIndex;
-          
-          String versionString = "_" + attachmentUrlTemplate;   // NOT empty; we need to make ManifoldCF understand that this is a document that never will change.
-          
-          // Check if we need to index
-          if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-            continue;
-          
-          String compositeID = documentIdentifier;
-          String version = versionString;
-          String folderName = extractFolderNameFromDocumentIdentifier(compositeID);
-          String id = extractEmailIDFromDocumentIdentifier(compositeID);
-          
-          String errorCode = null;
-          String errorDesc = null;
-          Long fileLengthLong = null;
-          long startTime = System.currentTimeMillis();
-          try {
-            try {
-              Folder folder = openFolders.get(folderName);
-              if (folder == null)
-              {
-                getSession();
-                OpenFolderThread oft = new OpenFolderThread(session, folderName);
-                oft.start();
-                folder = oft.finishUp();
-                openFolders.put(folderName,folder);
-              }
-              
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Email: Processing document identifier '"
-                  + documentIdentifier + "'");
-              SearchTerm messageIDTerm = new MessageIDTerm(id);
-                
-              getSession();
-              SearchMessagesThread smt = new SearchMessagesThread(session, folder, messageIDTerm);
-              smt.start();
-              Message[] message = smt.finishUp();
-
-              String msgURL = makeDocumentURI(attachmentUrlTemplate, folderName, id, attachmentNumber);
-
-              Message msg = null;
-              for (Message msg2 : message) {
-                msg = msg2;
-              }
-              if (msg == null) {
-                // email was not found
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-                
-              if (!activities.checkURLIndexable(msgURL)) {
-                errorCode = activities.EXCLUDED_URL;
-                errorDesc = "Excluded because of URL ('"+msgURL+"')";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-
-              final Date sentDate = msg.getSentDate();
-              if (!activities.checkDateIndexable(sentDate)) {
-                errorCode = activities.EXCLUDED_DATE;
-                errorDesc = "Excluded because of date ("+sentDate+")";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-
-              final Multipart mp = (Multipart) msg.getContent();
-              if (mp.getCount() <= attachmentNumber) {
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-              final Part part = mp.getBodyPart(attachmentNumber);
-                            
-              final long fileLength = part.getSize();
-              if (!activities.checkLengthIndexable(fileLength)) {
-                errorCode = activities.EXCLUDED_LENGTH;
-                errorDesc = "Excluded because of length ("+fileLength+")";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-                
-              final String origMimeType = part.getContentType();
-              final String mimeType;
-              //MSExchange puts crap after the mime type so it has to be munged.
-              // Example: "application/msword; name=SampleDOCFile_100kb.doc"
-              if (origMimeType == null || origMimeType.indexOf(";") == -1) {
-                mimeType = origMimeType;
-              } else {
-                mimeType = origMimeType.substring(0, origMimeType.indexOf(";"));
-              }
-              if (!activities.checkMimeTypeIndexable(mimeType)) {
-                errorCode = activities.EXCLUDED_MIMETYPE;
-                errorDesc = "Excluded because of mime type ('"+mimeType+"')";
-                activities.noDocument(documentIdentifier, version);
-                continue;
-              }
-
-              RepositoryDocument rd = new RepositoryDocument();
-              rd.setFileName(part.getFileName());
-              rd.setMimeType(mimeType);
-              rd.setCreatedDate(sentDate);
-              rd.setModifiedDate(sentDate);
-
-              for (String metadata : requiredMetadata) {
-                if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_TO)) {
-                  Address[] to = msg.getRecipients(Message.RecipientType.TO);
-                  if (to != null) {
-                    String[] toStr = new String[to.length];
-                    int j = 0;
-                    for (Address address : to) {
-                      toStr[j] = useEmailExtractor ? extractEmailAddress(address.toString()) : address.toString();
-                      j++;
-                    }
-                    rd.addField(EmailConfig.EMAIL_TO, toStr);
-                  }
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_FROM)) {
-                  Address[] from = msg.getFrom();
-                  String[] fromStr = new String[from.length];
-                  int j = 0;
-                  for (Address address : from) {
-                    fromStr[j] = useEmailExtractor ? extractEmailAddress(address.toString()) : address.toString();
-                    j++;
-                  }
-                  rd.addField(EmailConfig.EMAIL_FROM, fromStr);
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_SUBJECT)) {
-                  String subject = msg.getSubject();
-                  //Attachments may have a field named "subject". So, different field name is used not to clash.
-                  rd.addField(EmailConfig.MAILSUBJECT_FIELD, subject);
-                } else if (metadata.toLowerCase(Locale.ROOT).equals(EmailConfig.EMAIL_DATE)) {
-                  rd.addField(EmailConfig.EMAIL_DATE, sentDate.toString());
-                }
-              }
-
-              final InputStream is = part.getInputStream();
-              try {
-                rd.setBinary(is, fileLength);
-                activities.ingestDocumentWithException(documentIdentifier, version, msgURL, rd);
-                errorCode = "OK";
-                fileLengthLong = new Long(fileLength);
-              } finally {
-                is.close();
-              }
-
-            } catch (InterruptedException e) {
-              throw new ManifoldCFException(e.getMessage(), ManifoldCFException.INTERRUPTED);
-            } catch (MessagingException e) {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              handleMessagingException(e, "processing email attachment");
-            } catch (IOException e) {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              handleIOException(e, "processing email attachment");
-              throw new ManifoldCFException(e.getMessage(), e);
-            }
-          } catch (ManifoldCFException e) {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              errorCode = null;
-            throw e;
-          } finally {
-            if (errorCode != null)
-              activities.recordActivity(new Long(startTime),EmailConfig.ACTIVITY_FETCH,
-                fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-          }
-
-        }
-      }
-    }
-    finally
-    {
-      for (Folder f : openFolders.values())
-      {
-        try
-        {
-          CloseFolderThread cft = new CloseFolderThread(session, f);
-          cft.start();
-          cft.finishUp();
-        }
-        catch (InterruptedException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-        }
-        catch (MessagingException e)
-        {
-          handleMessagingException(e, "closing folders");
-        }
-      }
-    }
-
-  }
-
-  private EmailContent getContent(Part part) throws MessagingException, IOException {
-    if (part.isMimeType(EmailConfig.MIMETYPE_TEXT_PLAIN)) {
-      return new EmailContent(part.getContent().toString());
-    } else if(part.isMimeType(EmailConfig.MIMETYPE_HTML)) {
-      return new EmailContent(part.getContent().toString(), EmailConfig.MIMETYPE_HTML);
-    }
-
-    if (part.isMimeType(EmailConfig.MIMETYPE_MULTIPART_ALTERNATIVE)) {
-      // prefer html text over plain text
-      Multipart mp = (Multipart) part.getContent();
-      EmailContent emailContent = null;
-      for (int i = 0; i < mp.getCount(); i++) {
-        Part bodyPart = mp.getBodyPart(i);
-        if (bodyPart.isMimeType(EmailConfig.MIMETYPE_TEXT_PLAIN)) {
-          if (emailContent == null) {
-            emailContent = getContent(bodyPart);
-          }
-          continue;
-        } else if (bodyPart.isMimeType(EmailConfig.MIMETYPE_HTML)) {
-          emailContent = getContent(bodyPart);
-          if (emailContent != null) {
-            return emailContent;
-          }
-        } else {
-          return getContent(bodyPart);
-        }
-      }
-      return emailContent;
-    } else if (part.isMimeType(EmailConfig.MIMETYPE_MULTIPART_GENERIC)) {
-      Multipart mp = (Multipart) part.getContent();
-      for (int i = 0; i < mp.getCount(); i++) {
-        EmailContent emailContent = getContent(mp.getBodyPart(i));
-        if (emailContent != null) {
-          return emailContent;
-        }
-      }
-    }
-    return null;
-  }
-
-  private EmailContent extractBodyContent(Message msg) throws MessagingException, IOException {
-    EmailContent emailContent = null;
-    Object o = msg.getContent();
-    if (o instanceof Multipart) {
-      Multipart mp = (Multipart) msg.getContent();
-      for (int k = 0, n = mp.getCount(); k < n; k++) {
-        Part part = mp.getBodyPart(k);
-        String disposition = part.getDisposition();
-        if (disposition == null) {
-          EmailContent content = getContent(part);
-          if (content != null) {
-            emailContent = content;
-          }
-        }
-      }
-    } else if (o instanceof String) {
-      emailContent = new EmailContent((String)o);
-    }
-    return emailContent;
-  }
-
-  /**
-  * Checks whether a Part is an attachment or not
-  * @param part Part to check
-  * @return is attachment or not
-  */
-  private boolean isAttachment(Part part) throws MessagingException {
-    String disposition = part.getDisposition();
-    return ((disposition != null)
-        && ((disposition.toLowerCase(Locale.ROOT).equals(Part.ATTACHMENT)
-        || (disposition.toLowerCase(Locale.ROOT).equals(Part.INLINE)))));
-  }
-
-  /**
-   * Extracts e-mail address within < and > characters if any.
-   * If not, returns passed raw mail address.
-   *
-   * @param rawEmailAddress e-mail address to be extracted
-   * @return Extracted e-mail address
-   */
-  private String extractEmailAddress(String rawEmailAddress) {
-    Pattern pattern = Pattern.compile("<(.+?@.+?)>");
-    Matcher matcher = pattern.matcher(rawEmailAddress);
-
-    return matcher.find() ? matcher.group(1) : rawEmailAddress;
-  }
-
-  //////////////////////////////End of Repository Connector Methods///////////////////////////////////
-
-
-  ///////////////////////////////////////Start of Configuration UI/////////////////////////////////////
-
-  /**
-  * Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page. Its purpose is to
-  * add the required tabs to the list, and to output any javascript methods that might be needed by
-  * the configuration editing HTML.
-  * The connector does not need to be connected for this method to be called.
-  *
-  * @param threadContext is the local thread context.
-  * @param out is the output to which any HTML should be sent.
-  * @param locale is the desired locale.
-  * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  * @param tabsArray is an array of tab names. Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "EmailConnector.Server"));
-    tabsArray.add(Messages.getString(locale, "EmailConnector.URL"));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInURLConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationHeader.js", paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException {
-    // Output the Server tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInURLConfigurationMap(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "Configuration_Server.html", paramMap);
-    Messages.outputResourceWithVelocity(out, locale, "Configuration_URL.html", paramMap);
-  }
-
-  private static void fillInServerConfigurationMap(Map<String, Object> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    int i = 0;
-    String username = parameters.getParameter(EmailConfig.USERNAME_PARAM);
-    String password = parameters.getObfuscatedParameter(EmailConfig.PASSWORD_PARAM);
-    String protocol = parameters.getParameter(EmailConfig.PROTOCOL_PARAM);
-    String server = parameters.getParameter(EmailConfig.SERVER_PARAM);
-    String port = parameters.getParameter(EmailConfig.PORT_PARAM);
-    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
-    while (i < parameters.getChildCount()) //In post property set is added as a configuration node
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(EmailConfig.NODE_PROPERTIES)) {
-        String findParameterName = cn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        String findParameterValue = cn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-        Map<String, String> row = new HashMap<String, String>();
-        row.put("name", findParameterName);
-        row.put("value", findParameterValue);
-        list.add(row);
-      }
-    }
-
-    if (username == null)
-      username = StringUtils.EMPTY;
-    if (password == null)
-      password = StringUtils.EMPTY;
-    else
-      password = mapper.mapPasswordToKey(password);
-    if (protocol == null)
-      protocol = EmailConfig.PROTOCOL_DEFAULT_VALUE;
-    if (server == null)
-      server = StringUtils.EMPTY;
-    if (port == null)
-      port = EmailConfig.PORT_DEFAULT_VALUE;
-
-    paramMap.put("USERNAME", username);
-    paramMap.put("PASSWORD", password);
-    paramMap.put("PROTOCOL", protocol);
-    paramMap.put("SERVER", server);
-    paramMap.put("PORT", port);
-    paramMap.put("PROPERTIES", list);
-
-  }
-
-  private static void fillInURLConfigurationMap(Map<String, Object> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String urlTemplate = parameters.getParameter(EmailConfig.URL_PARAM);
-
-    if (urlTemplate == null) {
-      urlTemplate = "http://sampleserver/$(FOLDERNAME)?id=$(MESSAGEID)";
-    }
-
-    paramMap.put("URL", urlTemplate);
-    
-    String attachmentUrlTemplate = parameters.getParameter(EmailConfig.ATTACHMENT_URL_PARAM);
-    
-    if (attachmentUrlTemplate == null) {
-      attachmentUrlTemplate = "http://sampleserver/$(FOLDERNAME)?id=$(MESSAGEID)&attach=$(ATTACHMENTNUMBER)";
-    }
-    
-    paramMap.put("ATTACHMENTURL", attachmentUrlTemplate);
-  }
-
-  /**
-  * Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility
-  * that form data for a connection has been posted. Its purpose is to gather form information and modify
-  * the configuration parameters accordingly.
-  * The name of the posted form is always "editconnection".
-  * The connector does not need to be connected for this method to be called.
-  *
-  * @param threadContext is the local thread context.
-  * @param variableContext is the set of variables available from the post, including binary file post information.
-  * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  * @return null if all is well, or a string error message if there is an error that should prevent saving of the
-  * connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    ConfigParams parameters) throws ManifoldCFException {
-
-    String urlTemplate = variableContext.getParameter("url");
-    if (urlTemplate != null)
-      parameters.setParameter(EmailConfig.URL_PARAM, urlTemplate);
-
-    String attachmentUrlTemplate = variableContext.getParameter("attachmenturl");
-    if (attachmentUrlTemplate != null)
-      parameters.setParameter(EmailConfig.ATTACHMENT_URL_PARAM, attachmentUrlTemplate);
-
-    String userName = variableContext.getParameter("username");
-    if (userName != null)
-      parameters.setParameter(EmailConfig.USERNAME_PARAM, userName);
-
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(EmailConfig.PASSWORD_PARAM, variableContext.mapKeyToPassword(password));
-
-    String protocol = variableContext.getParameter("protocol");
-    if (protocol != null)
-      parameters.setParameter(EmailConfig.PROTOCOL_PARAM, protocol);
-
-    String server = variableContext.getParameter("server");
-    if (server != null)
-      parameters.setParameter(EmailConfig.SERVER_PARAM, server);
-    String port = variableContext.getParameter("port");
-    if (port != null)
-      parameters.setParameter(EmailConfig.PORT_PARAM, port);
-    // Remove old find parameter document specification information
-    removeNodes(parameters, EmailConfig.NODE_PROPERTIES);
-
-    // Parse the number of records that were posted
-    String findCountString = variableContext.getParameter("findcount");
-    if (findCountString != null) {
-      int findCount = Integer.parseInt(findCountString);
-
-      // Loop throught them and add new server properties
-      int i = 0;
-      while (i < findCount) {
-        String suffix = "_" + Integer.toString(i++);
-        // Only add the name/value if the item was not deleted.
-        String findParameterOp = variableContext.getParameter("findop" + suffix);
-        if (findParameterOp == null || !findParameterOp.equals("Delete")) {
-          String findParameterName = variableContext.getParameter("findname" + suffix);
-          String findParameterValue = variableContext.getParameter("findvalue" + suffix);
-          addFindParameterNode(parameters, findParameterName, findParameterValue);
-        }
-      }
-    }
-
-    // Now, look for a global "Add" operation
-    String operation = variableContext.getParameter("findop");
-    if (operation != null && operation.equals("Add")) {
-      // Pick up the global parameter name and value
-      String findParameterName = variableContext.getParameter("findname");
-      String findParameterValue = variableContext.getParameter("findvalue");
-      addFindParameterNode(parameters, findParameterName, findParameterValue);
-    }
-
-    return null;
-  }
-
-  /**
-  * View configuration. This method is called in the body section of the
-  * connector's view configuration page. Its purpose is to present the
-  * connection information to the user. The coder can presume that the HTML that
-  * is output from this configuration will be within appropriate <html> and
-  * <body> tags.
-  *
-  * @param threadContext is the local thread context.
-  * @param out is the output to which any HTML should be sent.
-  * @param parameters are the configuration parameters, as they currently exist, for
-  * this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInURLConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationView.html", paramMap);
-  }
-
-
-  /////////////////////////////////End of configuration UI////////////////////////////////////////////////////
-
-
-  /////////////////////////////////Start of Specification UI//////////////////////////////////////////////////
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    // Add the tabs
-    tabsArray.add(Messages.getString(locale, "EmailConnector.Metadata"));
-    tabsArray.add(Messages.getString(locale, "EmailConnector.Filter"));
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationHeader.js", paramMap);
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-    outputFilterTab(out, locale, ds, tabName, connectionSequenceNumber, actualSequenceNumber);
-    outputMetadataTab(out, locale, ds, tabName, connectionSequenceNumber, actualSequenceNumber);
-  }
-
-  /**
-* Take care of "Metadata" tab.
-*/
-  protected void outputMetadataTab(IHTTPOutput out, Locale locale,
-    Specification ds, String tabName, int connectionSequenceNumber, int actualSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-    fillInMetadataTab(paramMap, ds);
-    fillInMetadataAttributes(paramMap);
-    Messages.outputResourceWithVelocity(out, locale, "Specification_Metadata.html", paramMap);
-  }
-
-  /**
-  * Fill in Velocity context for Metadata tab.
-  */
-  protected static void fillInMetadataTab(Map<String, Object> paramMap,
-    Specification ds) {
-    Set<String> metadataSelections = new HashSet<String>();
-    String extractEmailSelection = null;
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(EmailConfig.NODE_METADATA)) {
-        String metadataName = sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        metadataSelections.add(metadataName);
-      } else if (sn.getType().equals(EmailConfig.NODE_EXTRACT_EMAIL)) {
-        extractEmailSelection = sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-      }
-    }
-    paramMap.put("METADATASELECTIONS", metadataSelections);
-    paramMap.put("EXTRACTEMAILSELECTION", extractEmailSelection);
-  }
-
-  /**
-  * Fill in Velocity context with data to permit attribute selection.
-  */
-  protected void fillInMetadataAttributes(Map<String, Object> paramMap) {
-    String[] matchNames = EmailConfig.BASIC_METADATA;
-    paramMap.put("METADATAATTRIBUTES", matchNames);
-
-    String extractEmailAttribute = EmailConfig.BASIC_EXTRACT_EMAIL;
-    paramMap.put("EXTRACTEMAILATTRIBUTE", extractEmailAttribute);
-  }
-
-  protected void outputFilterTab(IHTTPOutput out, Locale locale,
-    Specification ds, String tabName, int connectionSequenceNumber, int actualSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-    fillInFilterTab(paramMap, ds);
-    if (tabName.equals(Messages.getString(locale, "EmailConnector.Filter")))
-      fillInSearchableAttributes(paramMap);
-    Messages.outputResourceWithVelocity(out, locale, "Specification_Filter.html", paramMap);
-  }
-
-  private void fillInSearchableAttributes(Map<String, Object> paramMap)
-  {
-    String[] attributes = EmailConfig.BASIC_SEARCHABLE_ATTRIBUTES;
-    paramMap.put("SEARCHABLEATTRIBUTES", attributes);
-    try
-    {
-      String[] folderNames = getFolderNames();
-      paramMap.put("FOLDERNAMES", folderNames);
-      paramMap.put("EXCEPTION", "");
-    }
-    catch (ManifoldCFException e)
-    {
-      paramMap.put("EXCEPTION", e.getMessage());
-    }
-    catch (ServiceInterruption e)
-    {
-      paramMap.put("EXCEPTION", e.getMessage());
-    }
-  }
-
-  protected static void fillInFilterTab(Map<String, Object> paramMap,
-    Specification ds) {
-    List<Map<String, String>> filterList = new ArrayList<Map<String, String>>();
-    Set<String> folders = new HashSet<String>();
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(EmailConfig.NODE_FILTER)) {
-
-        String findParameterName = sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        String findParameterValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-        Map<String, String> row = new HashMap<String, String>();
-        row.put("name", findParameterName);
-        row.put("value", findParameterValue);
-        filterList.add(row);
-      }
-      else if (sn.getType().equals(EmailConfig.NODE_FOLDER)) {
-        String folderName = sn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        folders.add(folderName);
-      }
-    }
-    paramMap.put("MATCHES", filterList);
-    paramMap.put("FOLDERS", folders);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    String result = processFilterTab(variableContext, ds, connectionSequenceNumber);
-    if (result != null)
-      return result;
-    result = processMetadataTab(variableContext, ds, connectionSequenceNumber);
-    return result;
-  }
-
-
-  protected String processFilterTab(IPostParameters variableContext, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-      
-    String findCountString = variableContext.getParameter(seqPrefix + "findcount");
-    if (findCountString != null) {
-      int findCount = Integer.parseInt(findCountString);
-      
-      // Remove old find parameter document specification information
-      removeNodes(ds, EmailConfig.NODE_FILTER);
-
-      int i = 0;
-      while (i < findCount) {
-        String suffix = "_" + Integer.toString(i++);
-        // Only add the name/value if the item was not deleted.
-        String findParameterOp = variableContext.getParameter(seqPrefix + "findop" + suffix);
-        if (findParameterOp == null || !findParameterOp.equals("Delete")) {
-          String findParameterName = variableContext.getParameter(seqPrefix + "findname" + suffix);
-          String findParameterValue = variableContext.getParameter(seqPrefix + "findvalue" + suffix);
-          addFindParameterNode(ds, findParameterName, findParameterValue);
-        }
-      }
-
-      String operation = variableContext.getParameter(seqPrefix + "findop");
-      if (operation != null && operation.equals("Add")) {
-        String findParameterName = variableContext.getParameter(seqPrefix + "findname");
-        String findParameterValue = variableContext.getParameter(seqPrefix + "findvalue");
-        addFindParameterNode(ds, findParameterName, findParameterValue);
-      }
-    }
-    
-    String[] folders = variableContext.getParameterValues(seqPrefix + "folders");
-    if (folders != null)
-    {
-      removeNodes(ds, EmailConfig.NODE_FOLDER);
-      for (String folder : folders)
-      {
-        addFolderNode(ds, folder);
-      }
-    }
-    return null;
-  }
-
-
-  protected String processMetadataTab(IPostParameters variableContext, Specification ds,
-                                   int connectionSequenceNumber)
-          throws ManifoldCFException {
-    String result = processMetadataAttributes(variableContext, ds, connectionSequenceNumber);
-    if (result != null)
-      return result;
-
-    result = processExtractEmail(variableContext, ds, connectionSequenceNumber);
-    return result;
-
-  }
-
-  protected String processMetadataAttributes(IPostParameters variableContext, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-      
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Remove old included metadata nodes
-    removeNodes(ds, EmailConfig.NODE_METADATA);
-
-    // Get the posted metadata values
-    String[] metadataNames = variableContext.getParameterValues(seqPrefix + "metadata");
-    if (metadataNames != null) {
-      // Add each metadata name as a node to the document specification
-      int i = 0;
-      while (i < metadataNames.length) {
-        String metadataName = metadataNames[i++];
-        addIncludedMetadataNode(ds, metadataName);
-      }
-    }
-
-    return null;
-  }
-
-  protected String processExtractEmail(IPostParameters variableContext, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Remove old included extract email nodes
-    removeNodes(ds, EmailConfig.NODE_EXTRACT_EMAIL);
-
-    // Get the posted extract email value
-    String extractEmail = variableContext.getParameter(seqPrefix + "extractemail");
-    if (extractEmail == null) {
-      return null;
-    }
-
-    // Gather the extract email parameter to be the last one
-    SpecificationNode sn = new SpecificationNode(EmailConfig.NODE_EXTRACT_EMAIL);
-    sn.setAttribute(EmailConfig.ATTRIBUTE_NAME, extractEmail);
-    // Add the new extract email parameter
-    ds.addChild(ds.getChildCount(), sn);
-
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    fillInFilterTab(paramMap, ds);
-    fillInMetadataTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationView.html", paramMap);
-  }
-
-  ///////////////////////////////////////End of specification UI///////////////////////////////////////////////
-  
-  /** Get a sorted list of folder names */
-  protected String[] getFolderNames()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    try
-    {
-      ListFoldersThread lft = new ListFoldersThread(session);
-      lft.start();
-      return lft.finishUp();
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-    catch (MessagingException e)
-    {
-      handleMessagingException(e,"getting folder list");
-      return null;
-    }
-  }
-
-  /** Create a document's URI given a template, a folder name, and a message ID */
-  protected static String makeDocumentURI(String urlTemplate, String folderName, String id)
-  {
-      // First, URL encode folder name and id
-      String encodedFolderName = URLEncoder.encode(folderName);
-      String encodedId = URLEncoder.encode(id);
-      // The template is already URL encoded, except for the substitution points
-      Map<String,String> subsMap = new HashMap<String,String>();
-      subsMap.put("FOLDERNAME", encodedFolderName);
-      subsMap.put("MESSAGEID", encodedId);
-      return substitute(urlTemplate, subsMap);
-  }
-
-  /** Create a document's URI given a template, a folder name, a message ID, and an attachment number */
-  protected static String makeDocumentURI(String urlTemplate, String folderName, String id, int attachmentNumber)
-  {
-      // First, URL encode folder name and id
-      String encodedFolderName = URLEncoder.encode(folderName);
-      String encodedId = URLEncoder.encode(id);
-      // The template is already URL encoded, except for the substitution points
-      Map<String,String> subsMap = new HashMap<String,String>();
-      subsMap.put("FOLDERNAME", encodedFolderName);
-      subsMap.put("MESSAGEID", encodedId);
-      subsMap.put("ATTACHMENTNUMBER", Integer.toString(attachmentNumber));
-      return substitute(urlTemplate, subsMap);
-  }
-
-  protected static String substitute(String template, Map<String,String> map)
-  {
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      int newIndex = template.indexOf("$(",index);
-      if (newIndex == -1)
-      {
-        sb.append(template.substring(index));
-        break;
-      }
-      sb.append(template.substring(index, newIndex));
-      int endIndex = template.indexOf(")",newIndex+2);
-      String varName;
-      if (endIndex == -1)
-        varName = template.substring(newIndex + 2);
-      else
-        varName = template.substring(newIndex + 2, endIndex);
-      String subsValue = map.get(varName);
-      if (subsValue == null)
-        subsValue = "";
-      sb.append(subsValue);
-      if (endIndex == -1)
-        break;
-      index = endIndex+1;
-    }
-    return sb.toString();
-  }
-  
-  protected static void addFindParameterNode(ConfigParams parameters, String findParameterName, String findParameterValue) {
-    ConfigNode cn = new ConfigNode(EmailConfig.NODE_PROPERTIES);
-    cn.setAttribute(EmailConfig.ATTRIBUTE_NAME, findParameterName);
-    cn.setAttribute(EmailConfig.ATTRIBUTE_VALUE, findParameterValue);
-    // Add to the end
-    parameters.addChild(parameters.getChildCount(), cn);
-  }
-
-  protected static void removeNodes(ConfigParams parameters,
-                    String nodeTypeName) {
-    int i = 0;
-    while (i < parameters.getChildCount()) {
-      ConfigNode cn = parameters.getChild(i);
-      if (cn.getType().equals(nodeTypeName))
-        parameters.removeChild(i);
-      else
-        i++;
-    }
-  }
-
-  protected static void removeNodes(Specification ds,
-                    String nodeTypeName) {
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(nodeTypeName))
-        ds.removeChild(i);
-      else
-        i++;
-    }
-  }
-
-  protected static void addIncludedMetadataNode(Specification ds,
-                          String metadataName) {
-    // Build the proper node
-    SpecificationNode sn = new SpecificationNode(EmailConfig.NODE_METADATA);
-    sn.setAttribute(EmailConfig.ATTRIBUTE_NAME, metadataName);
-    // Add to the end
-    ds.addChild(ds.getChildCount(), sn);
-  }
-
-  protected static void addFindParameterNode(Specification ds, String findParameterName, String findParameterValue) {
-    SpecificationNode sn = new SpecificationNode(EmailConfig.NODE_FILTER);
-    sn.setAttribute(EmailConfig.ATTRIBUTE_NAME, findParameterName);
-    sn.setAttribute(EmailConfig.ATTRIBUTE_VALUE, findParameterValue);
-    // Add to the end
-    ds.addChild(ds.getChildCount(), sn);
-  }
-
-  protected static void addFolderNode(Specification ds, String folderName)
-  {
-    SpecificationNode sn = new SpecificationNode(EmailConfig.NODE_FOLDER);
-    sn.setAttribute(EmailConfig.ATTRIBUTE_NAME, folderName);
-    ds.addChild(ds.getChildCount(), sn);
-  }
-  
-
-  /** Create a document identifier from a folder name and an email ID */
-  protected static String createDocumentIdentifier(String folderName, String emailID)
-  {
-    return makeSafeFolderName(folderName) + ":" + emailID;
-  }
-  
-  /** Find an attachment number in a document identifier */
-  protected static Integer extractAttachmentNumberFromDocumentIdentifier(String di)
-  {
-    int index1 = di.indexOf(":");
-    if (index1 == -1)
-      throw new RuntimeException("Bad document identifier: '"+di+"'");
-    int index2 = di.indexOf(":", index1 + 1);
-    if (index2 == -1)
-      return null;
-    return new Integer(di.substring(index2 + 1));
-  }
-  
-  /** Find a folder name in a document identifier */
-  protected static String extractFolderNameFromDocumentIdentifier(String di)
-  {
-    int index = di.indexOf(":");
-    if (index == -1)
-      throw new RuntimeException("Bad document identifier: '"+di+"'");
-    return di.substring(0,index);
-  }
-
-  /** Find an email ID in a document identifier */
-  protected static String extractEmailIDFromDocumentIdentifier(String di)
-  {
-    int index1 = di.indexOf(":");
-    if (index1 == -1)
-      throw new RuntimeException("Bad document identifier: '"+di+"'");
-    int index2 = di.indexOf(":", index1 + 1);
-    if (index2 == -1)
-      return di.substring(index1+1);
-    return di.substring(index1 + 1, index2);
-  }
-  
-  /** Create a safe folder name (which doesn't contain colons) */
-  protected static String makeSafeFolderName(String folderName)
-  {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < folderName.length(); i++)
-    {
-      char x = folderName.charAt(i);
-      if (x == '\\')
-        sb.append('\\').append('\\');
-      else if (x == ':')
-        sb.append('\\').append('0');
-      else
-        sb.append(x);
-    }
-    return sb.toString();
-  }
-  
-  /** Unpack a safe folder name */
-  protected static String unpackSafeFolderName(String packedFolderName)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < packedFolderName.length())
-    {
-      char x = packedFolderName.charAt(i++);
-      if (x == '\\')
-      {
-        if (i == packedFolderName.length())
-          throw new RuntimeException("Illegal packed folder name: '"+packedFolderName+"'");
-        x = packedFolderName.charAt(i++);
-        if (x == '\\')
-          sb.append('\\');
-        else if (x == '0')
-          sb.append(':');
-        else
-          throw new RuntimeException("Illegal packed folder name: '"+packedFolderName+"'");
-      }
-      else
-        sb.append(x);
-    }
-    return sb.toString();
-  }
-  
-  /** Handle Messaging exceptions in a consistent global manner */
-  protected static void handleMessagingException(MessagingException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e.getMessage().indexOf("Connection dropped by server?") != -1) {
-      final long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Email server is down, retrying: "+e.getMessage(),e,currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    } else {
-      Logging.connectors.error("Email: Error "+context+": "+e.getMessage(),e);
-      throw new ManifoldCFException("Error "+context+": "+e.getMessage(),e);
-    }
-  }
-  
-  /** Handle IO Exception */
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      Logging.connectors.error("Email: Socket timeout "+context+": "+e.getMessage(),e);
-      throw new ManifoldCFException("Socket timeout: "+e.getMessage(),e);
-    }
-    else if (e instanceof InterruptedIOException)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-    else
-    {
-      Logging.connectors.error("Email: IO error "+context+": "+e.getMessage(),e);
-      throw new ManifoldCFException("IO error "+context+": "+e.getMessage(),e);
-    }
-  }
-
-  /** Class to set up connection.
-  */
-  protected static class ConnectThread extends Thread
-  {
-    protected final String server;
-    protected final int port;
-    protected final String username;
-    protected final String password;
-    protected final String protocol;
-    protected final Properties properties;
-    
-    // Local session handle
-    protected EmailSession session = null;
-    protected Throwable exception = null;
-    
-    public ConnectThread(String server, int port, String username, String password, String protocol, Properties properties)
-    {
-      this.server = server;
-      this.port = port;
-      this.username = username;
-      this.password = password;
-      this.protocol = protocol;
-      this.properties = properties;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session = new EmailSession(server, port, username, password, protocol, properties);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public EmailSession finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return session;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to close the session.
-  */
-  protected static class CloseSessionThread extends Thread
-  {
-    protected final EmailSession session;
-    
-    protected Throwable exception = null;
-    
-    public CloseSessionThread(EmailSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session.close();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to list all folders.
-  */
-  protected static class ListFoldersThread extends Thread
-  {
-    protected final EmailSession session;
-    
-    protected String[] rval = null;
-    protected Throwable exception = null;
-    
-    public ListFoldersThread(EmailSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        rval = session.listFolders();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public String[] finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return rval;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to check the connection.
-  */
-  protected static class CheckConnectionThread extends Thread
-  {
-    protected final EmailSession session;
-    
-    protected Throwable exception = null;
-    
-    public CheckConnectionThread(EmailSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to open a folder.
-  */
-  protected static class OpenFolderThread extends Thread
-  {
-    protected final EmailSession session;
-    protected final String folderName;
-    
-    // Local folder
-    protected Folder folder = null;
-    protected Throwable exception = null;
-    
-    public OpenFolderThread(EmailSession session, String folderName)
-    {
-      this.session = session;
-      this.folderName = folderName;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        folder = session.openFolder(folderName);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public Folder finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return folder;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-  
-  /** Class to close a folder.
-  */
-  protected static class CloseFolderThread extends Thread
-  {
-    protected final EmailSession session;
-    protected final Folder folder;
-    
-    // Local folder
-    protected Throwable exception = null;
-    
-    public CloseFolderThread(EmailSession session, Folder folder)
-    {
-      this.session = session;
-      this.folder = folder;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session.closeFolder(folder);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to get all messages from a folder.
-  */
-  protected static class GetMessagesThread extends Thread
-  {
-    protected final EmailSession session;
-    protected final Folder folder;
-    
-    // Local messages
-    protected Message[] messages = null;
-    protected Throwable exception = null;
-    
-    public GetMessagesThread(EmailSession session, Folder folder)
-    {
-      this.session = session;
-      this.folder = folder;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        messages = session.getMessages(folder);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public Message[] finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return messages;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to search for messages in a folder.
-  */
-  protected static class SearchMessagesThread extends Thread
-  {
-    protected final EmailSession session;
-    protected final Folder folder;
-    protected final SearchTerm searchTerm;
-    
-    // Local messages
-    protected Message[] messages = null;
-    protected Throwable exception = null;
-    
-    public SearchMessagesThread(EmailSession session, Folder folder, SearchTerm searchTerm)
-    {
-      this.session = session;
-      this.folder = folder;
-      this.searchTerm = searchTerm;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        messages = session.search(folder, searchTerm);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public Message[] finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return messages;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  private static class EmailContent {
-    private final String content;
-    private final String mimeType;
-
-    public EmailContent(final String content) {
-      this.content = content;
-      this.mimeType = EmailConfig.MIMETYPE_TEXT_PLAIN;
-    }
-
-    public EmailContent(final String content, final String mimetype) {
-      this.content = content;
-      this.mimeType = mimetype;
-    }
-
-    public String getContent() {
-      return content;
-    }
-
-    public String getMimeType() {
-      return mimeType;
-    }
-  }
-
-}
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailSession.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailSession.java
deleted file mode 100644
index 17908bb..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailSession.java
+++ /dev/null
@@ -1,133 +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 org.apache.manifoldcf.crawler.connectors.email;
-
-import java.io.*;
-import java.util.*;
-import javax.mail.*;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMessage;
-import javax.mail.search.*;
-
-/** This class represents a raw email session, without any protection
-* from threads waiting on sockets, etc.
-*/
-public class EmailSession
-{
-  protected final String server;
-  protected final int port;
-  protected final String username;
-  protected final String password;
-  protected final String protocol;
-  protected final Properties properties;
-
-  private Session session = null;
-  private Store store = null;
-
-  /** Create a session */
-  public EmailSession(String server, int port, String username, String password,
-    String protocol, Properties properties)
-    throws MessagingException
-  {
-    this.server = server;
-    this.port = port;
-    this.username = username;
-    this.password = password;
-    this.protocol = protocol;
-    this.properties = properties;
-    
-    // Now, try to connect
-    Session thisSession = Session.getDefaultInstance(properties, null);
-    Store thisStore = thisSession.getStore(protocol);
-    thisStore.connect(server, port, username, password);
-
-    session = thisSession;
-    store = thisStore;
-  }
-  
-  public String[] listFolders()
-    throws MessagingException
-  {
-    if (store != null)
-    {
-      List<String> folderList = new ArrayList<String>();
-      Folder[] folders = store.getDefaultFolder().list("*");
-      for (Folder folder : folders)
-      {
-        if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0)
-          folderList.add(folder.getFullName());
-      }
-      String[] rval = folderList.toArray(new String[0]);
-      java.util.Arrays.sort(rval);
-      return rval;
-    }
-    return null;
-  }
-  
-  public void checkConnection()
-    throws MessagingException
-  {
-    if (store != null)
-    {
-      if (store.getDefaultFolder() == null) {
-        throw new MessagingException("Error checking the connection: No default folder.");
-      }
-    }
-  }
-
-  public Folder openFolder(String folderName)
-    throws MessagingException
-  {
-    if (store != null)
-    {
-      Folder thisFolder = store.getFolder(folderName);
-      thisFolder.open(Folder.READ_ONLY);
-      return thisFolder;
-    }
-    return null;
-  }
-  
-  public void closeFolder(Folder folder)
-    throws MessagingException
-  {
-    folder.close(false);
-  }
-  
-  public Message[] getMessages(Folder folder)
-    throws MessagingException
-  {
-    return folder.getMessages();
-  }
-  
-  public Message[] search(Folder folder, SearchTerm searchTerm)
-    throws MessagingException
-  {
-    return folder.search(searchTerm);
-  }
-  
-  public void close()
-    throws MessagingException
-  {
-    if (store != null)
-    {
-      store.close();
-      store = null;
-    }
-    session = null;
-  }
-}
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/Messages.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/Messages.java
deleted file mode 100644
index 655fa6e..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.email;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.email.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.email";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailConfig.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailConfig.java
deleted file mode 100644
index 26618e7..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailConfig.java
+++ /dev/null
@@ -1,93 +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 org.apache.manifoldcf.crawler.notifications.email;
-
-
-/**
-* Parameters data for the Email notification connector.
-*/
-public class EmailConfig {
-
-  /**
-  * Username
-  */
-  public static final String USERNAME_PARAM = "username";
-
-  /**
-  * Password
-  */
-  public static final String PASSWORD_PARAM = "password";
-
-  /**
-  * Protocol
-  */
-  public static final String PROTOCOL_PARAM = "protocol";
-
-  /**
-  * Server name
-  */
-  public static final String SERVER_PARAM = "server";
-
-  /**
-  * Port
-  */
-  public static final String PORT_PARAM = "port";
-
-  /**
-  * URL template
-  */
-  public static final String URL_PARAM = "url";
-  
-  // Protocol options
-  
-  public static final String PROTOCOL_IMAP = "IMAP";
-  public static final String PROTOCOL_IMAPS = "IMAP-SSL";
-  public static final String PROTOCOL_POP3 = "POP3";
-  public static final String PROTOCOL_POP3S = "POP3-SSL";
-  
-  // Protocol providers
-  
-  public static final String PROTOCOL_IMAP_PROVIDER = "imap";
-  public static final String PROTOCOL_IMAPS_PROVIDER = "imaps";
-  public static final String PROTOCOL_POP3_PROVIDER = "pop3";
-  public static final String PROTOCOL_POP3S_PROVIDER = "pop3s";
-  
-  // Default values and various other constants
-  
-  public static final String PROTOCOL_DEFAULT_VALUE = "IMAP";
-  public static final String PORT_DEFAULT_VALUE = "";
-
-  // Specification nodes
-  
-  public static final String NODE_FINISHED = "finished";
-  public static final String NODE_ERRORABORTED = "erroraborted";
-  public static final String NODE_MANUALABORTED = "manualaborted";
-  public static final String NODE_MANUALPAUSED = "manualpaused";
-  public static final String NODE_SCHEDULEPAUSED = "schedulepaused";
-  public static final String NODE_RESTARTED = "restarted";
-  
-  public static final String NODE_TO = "to";
-  public static final String NODE_FROM = "from";
-  public static final String NODE_SUBJECT = "subject";
-  public static final String NODE_BODY = "body";
-  public static final String NODE_PROPERTIES = "properties";
-  public static final String ATTRIBUTE_NAME = "name";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-
-}
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailConnector.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailConnector.java
deleted file mode 100644
index 9c6f58f..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailConnector.java
+++ /dev/null
@@ -1,995 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.email;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import java.io.*;
-import java.util.*;
-import javax.mail.*;
-
-/**
-*/
-public class EmailConnector extends org.apache.manifoldcf.crawler.notifications.BaseNotificationConnector {
-
-  protected final static long SESSION_EXPIRATION_MILLISECONDS = 300000L;
-  
-  // Local variables.
-  protected long sessionExpiration = -1L;
-  
-  // Parameters for establishing a session
-  
-  protected String server = null;
-  protected String portString = null;
-  protected String username = null;
-  protected String password = null;
-  protected Properties properties = null;
-  
-  // Local session handle
-  protected EmailSession session = null;
-
-  //////////////////////////////////Start of Basic Connector Methods/////////////////////////
-
-  /**
-  * Connect.
-  *
-  * @param configParameters is the set of configuration parameters, which
-  * in this case describe the root directory.
-  */
-  @Override
-  public void connect(ConfigParams configParameters) {
-    super.connect(configParameters);
-    this.server = configParameters.getParameter(EmailConfig.SERVER_PARAM);
-    this.portString = configParameters.getParameter(EmailConfig.PORT_PARAM);
-    this.username = configParameters.getParameter(EmailConfig.USERNAME_PARAM);
-    this.password = configParameters.getObfuscatedParameter(EmailConfig.PASSWORD_PARAM);
-    this.properties = new Properties();
-    int i = 0;
-    while (i < configParameters.getChildCount()) //In post property set is added as a configuration node
-    {
-      ConfigNode cn = configParameters.getChild(i++);
-      if (cn.getType().equals(EmailConfig.NODE_PROPERTIES)) {
-        String findParameterName = cn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        String findParameterValue = cn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-        this.properties.setProperty(findParameterName, findParameterValue);
-      }
-    }
-  }
-
-  /**
-  * Close the connection. Call this before discarding this instance of the
-  * repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException {
-    this.server = null;
-    this.portString = null;
-    this.username = null;
-    this.password = null;
-    this.properties = null;
-    finalizeConnection();
-    super.disconnect();
-  }
-
-  /**
-  * This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (session != null)
-    {
-      if (System.currentTimeMillis() >= sessionExpiration)
-        finalizeConnection();
-    }
-  }
-
-  /**
-  * Test the connection. Returns a string describing the connection integrity.
-  *
-  * @return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-      throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    // Force a re-connection
-    finalizeConnection();
-    getSession();
-    try {
-      CheckConnectionThread cct = new CheckConnectionThread(session);
-      cct.start();
-      cct.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (MessagingException e) {
-      handleMessagingException(e,"checking the connection");
-    }
-  }
-
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      
-      // Check that all the required parameters are there.
-      if (server == null)
-        throw new ManifoldCFException("Missing server parameter");
-      if (properties == null)
-        throw new ManifoldCFException("Missing server properties");
-      
-      // Create a session.
-      int port;
-      if (portString != null && portString.length() > 0)
-      {
-        try
-        {
-          port = Integer.parseInt(portString);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Port number has bad format: "+e.getMessage(),e);
-        }
-      }
-      else
-        port = -1;
-
-      try {
-        ConnectThread connectThread = new ConnectThread(server, port, username, password, properties);
-        connectThread.start();
-        session = connectThread.finishUp();
-      } catch (InterruptedException e) {
-        throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-      } catch (MessagingException e) {
-        handleMessagingException(e, "connecting");
-      }
-    }
-    sessionExpiration = System.currentTimeMillis() + SESSION_EXPIRATION_MILLISECONDS;
-  }
-
-  protected void finalizeConnection() {
-    if (session != null) {
-      try {
-        CloseSessionThread closeSessionThread = new CloseSessionThread(session);
-        closeSessionThread.start();
-        closeSessionThread.finishUp();
-      } catch (InterruptedException e) {
-      } catch (MessagingException e) {
-        Logging.connectors.warn("Error while closing connection to server: " + e.getMessage(),e);
-      } finally {
-        session = null;
-      }
-    }
-  }
-
-  ///////////////////////////////End of Basic Connector Methods////////////////////////////////////////
-
-  //////////////////////////////Start of Notification Connector Method///////////////////////////////////
-
-  /** Notify of job stop due to error abort.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopErrorAbort(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendMail(spec, EmailConfig.NODE_ERRORABORTED);
-  }
-
-  /** Notify of job stop due to manual abort.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopManualAbort(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendMail(spec, EmailConfig.NODE_MANUALABORTED);
-  }
-
-  /** Notify of job stop due to manual pause.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopManualPause(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendMail(spec, EmailConfig.NODE_MANUALPAUSED);
-  }
-
-  /** Notify of job stop due to schedule pause.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopSchedulePause(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendMail(spec, EmailConfig.NODE_SCHEDULEPAUSED);
-  }
-
-  /** Notify of job stop due to restart.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopRestart(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendMail(spec, EmailConfig.NODE_RESTARTED);
-  }
-
-  /** Notify of job end.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobEnd(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendMail(spec, EmailConfig.NODE_FINISHED);
-  }
-
-  protected void sendMail(final Specification spec, final String nodeType)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    final List<String> to = new ArrayList<String>();
-    String from = null;
-    String subject = "";
-    String body = "";
-    for (int i = 0; i < spec.getChildCount(); i++) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(EmailConfig.NODE_TO))
-        to.addAll(splitAtCommaAndTrim(sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE)));
-      else if (sn.getType().equals(EmailConfig.NODE_FROM))
-        from = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-      else if (sn.getType().equals(EmailConfig.NODE_SUBJECT))
-        subject = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-      else if (sn.getType().equals(EmailConfig.NODE_BODY))
-        body = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-    }
-    // Look for node of the specified type
-    if (nodeType != null)
-    {
-      for (int i = 0; i < spec.getChildCount(); i++) {
-        SpecificationNode childNode = spec.getChild(i);
-        if (childNode.getType().equals(nodeType))
-        {
-          for (int j = 0; j < childNode.getChildCount(); j++) {
-            SpecificationNode sn = childNode.getChild(j);
-            if (sn.getType().equals(EmailConfig.NODE_TO)) {
-              to.addAll(splitAtCommaAndTrim(sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE)));
-            }
-            else if (sn.getType().equals(EmailConfig.NODE_FROM))
-              from = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-            else if (sn.getType().equals(EmailConfig.NODE_SUBJECT))
-              subject = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-            else if (sn.getType().equals(EmailConfig.NODE_BODY))
-              body = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-          }
-        }
-      }
-    }
-    
-    if (to.size() == 0)
-      return;
-    
-    // Construct and send an email
-    getSession();
-    
-    SendThread st = new SendThread(session,to,from,subject,body);
-    st.start();
-    try {
-      st.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (MessagingException e) {
-      handleMessagingException(e,"sending email");
-    }
-  }
-  
-  private List<String> splitAtCommaAndTrim(String input) {
-    List<String> result = new ArrayList<>();
-    if (input != null) {
-      result.addAll(Arrays.asList(input.split("\\s*,\\s*")));
-    }
-    return result;
-  }
-
-
-  //////////////////////////////End of Notification Connector Methods///////////////////////////////////
-
-
-  ///////////////////////////////////////Start of Configuration UI/////////////////////////////////////
-
-  /**
-  * Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page. Its purpose is to
-  * add the required tabs to the list, and to output any javascript methods that might be needed by
-  * the configuration editing HTML.
-  * The connector does not need to be connected for this method to be called.
-  *
-  * @param threadContext is the local thread context.
-  * @param out is the output to which any HTML should be sent.
-  * @param locale is the desired locale.
-  * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  * @param tabsArray is an array of tab names. Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "EmailConnector.Server"));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationHeader.js", paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException {
-    // Output the Server tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "Configuration_Server.html", paramMap);
-  }
-
-  private static void fillInServerConfigurationMap(Map<String, Object> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    int i = 0;
-    String username = parameters.getParameter(EmailConfig.USERNAME_PARAM);
-    String password = parameters.getObfuscatedParameter(EmailConfig.PASSWORD_PARAM);
-    String server = parameters.getParameter(EmailConfig.SERVER_PARAM);
-    String port = parameters.getParameter(EmailConfig.PORT_PARAM);
-    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
-    while (i < parameters.getChildCount()) //In post property set is added as a configuration node
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(EmailConfig.NODE_PROPERTIES)) {
-        String findParameterName = cn.getAttributeValue(EmailConfig.ATTRIBUTE_NAME);
-        String findParameterValue = cn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-        Map<String, String> row = new HashMap<String, String>();
-        row.put("name", findParameterName);
-        row.put("value", findParameterValue);
-        list.add(row);
-      }
-    }
-
-    if (username == null)
-      username = StringUtils.EMPTY;
-    if (password == null)
-      password = StringUtils.EMPTY;
-    else
-      password = mapper.mapPasswordToKey(password);
-    if (server == null)
-      server = StringUtils.EMPTY;
-    if (port == null)
-      port = EmailConfig.PORT_DEFAULT_VALUE;
-
-    paramMap.put("USERNAME", username);
-    paramMap.put("PASSWORD", password);
-    paramMap.put("SERVER", server);
-    paramMap.put("PORT", port);
-    paramMap.put("PROPERTIES", list);
-
-  }
-
-  /**
-  * Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility
-  * that form data for a connection has been posted. Its purpose is to gather form information and modify
-  * the configuration parameters accordingly.
-  * The name of the posted form is always "editconnection".
-  * The connector does not need to be connected for this method to be called.
-  *
-  * @param threadContext is the local thread context.
-  * @param variableContext is the set of variables available from the post, including binary file post information.
-  * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  * @return null if all is well, or a string error message if there is an error that should prevent saving of the
-  * connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    ConfigParams parameters) throws ManifoldCFException {
-
-    String userName = variableContext.getParameter("username");
-    if (userName != null)
-      parameters.setParameter(EmailConfig.USERNAME_PARAM, userName);
-
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(EmailConfig.PASSWORD_PARAM, variableContext.mapKeyToPassword(password));
-
-    String server = variableContext.getParameter("server");
-    if (server != null)
-      parameters.setParameter(EmailConfig.SERVER_PARAM, server);
-    String port = variableContext.getParameter("port");
-    if (port != null)
-      parameters.setParameter(EmailConfig.PORT_PARAM, port);
-    // Remove old find parameter document specification information
-    removeNodes(parameters, EmailConfig.NODE_PROPERTIES);
-
-    // Parse the number of records that were posted
-    String findCountString = variableContext.getParameter("findcount");
-    if (findCountString != null) {
-      int findCount = Integer.parseInt(findCountString);
-
-      // Loop throught them and add new server properties
-      int i = 0;
-      while (i < findCount) {
-        String suffix = "_" + Integer.toString(i++);
-        // Only add the name/value if the item was not deleted.
-        String findParameterOp = variableContext.getParameter("findop" + suffix);
-        if (findParameterOp == null || !findParameterOp.equals("Delete")) {
-          String findParameterName = variableContext.getParameter("findname" + suffix);
-          String findParameterValue = variableContext.getParameter("findvalue" + suffix);
-          addFindParameterNode(parameters, findParameterName, findParameterValue);
-        }
-      }
-    }
-
-    // Now, look for a global "Add" operation
-    String operation = variableContext.getParameter("findop");
-    if (operation != null && operation.equals("Add")) {
-      // Pick up the global parameter name and value
-      String findParameterName = variableContext.getParameter("findname");
-      String findParameterValue = variableContext.getParameter("findvalue");
-      addFindParameterNode(parameters, findParameterName, findParameterValue);
-    }
-
-    return null;
-  }
-
-  /**
-  * View configuration. This method is called in the body section of the
-  * connector's view configuration page. Its purpose is to present the
-  * connection information to the user. The coder can presume that the HTML that
-  * is output from this configuration will be within appropriate <html> and
-  * <body> tags.
-  *
-  * @param threadContext is the local thread context.
-  * @param out is the output to which any HTML should be sent.
-  * @param parameters are the configuration parameters, as they currently exist, for
-  * this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationView.html", paramMap);
-  }
-
-
-  /////////////////////////////////End of configuration UI////////////////////////////////////////////////////
-
-
-  /////////////////////////////////Start of Specification UI//////////////////////////////////////////////////
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    // Add the tabs
-    tabsArray.add(Messages.getString(locale, "EmailConnector.Message"));
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationHeader.js", paramMap);
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-    outputMessageTab(out, locale, ds, tabName, connectionSequenceNumber, actualSequenceNumber);
-  }
-
-  /**
-* Take care of "Message" tab.
-*/
-  protected void outputMessageTab(IHTTPOutput out, Locale locale,
-    Specification ds, String tabName, int connectionSequenceNumber, int actualSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-    fillInMessageTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "Specification_Message.html", paramMap);
-  }
-
-  /**
-  * Fill in Velocity context for Metadata tab.
-  */
-  protected static void fillInMessageTab(Map<String, Object> paramMap,
-    Specification ds) {
-      
-    // Preload default values, for backwards compatibility
-    String toValue = "";
-    String fromValue = "";
-    String subjectValue = "";
-    String bodyValue = "";
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(EmailConfig.NODE_TO)) {
-        toValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-      } else if (sn.getType().equals(EmailConfig.NODE_FROM)) {
-        fromValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-      } else if (sn.getType().equals(EmailConfig.NODE_SUBJECT)) {
-        subjectValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-      } else if (sn.getType().equals(EmailConfig.NODE_BODY)) {
-        bodyValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    // If ANY of the above are non-empty, we create a new dummy record
-    if (toValue.length() > 0) {
-      // Add the dummy records
-      addRecord(paramMap, EmailConfig.NODE_FINISHED, toValue, fromValue, subjectValue, bodyValue);
-      addRecord(paramMap, EmailConfig.NODE_ERRORABORTED, toValue, fromValue, subjectValue, bodyValue);
-      addRecord(paramMap, EmailConfig.NODE_MANUALABORTED, toValue, fromValue, subjectValue, bodyValue);
-      addRecord(paramMap, EmailConfig.NODE_MANUALPAUSED, toValue, fromValue, subjectValue, bodyValue);
-      addRecord(paramMap, EmailConfig.NODE_SCHEDULEPAUSED, toValue, fromValue, subjectValue, bodyValue);
-      addRecord(paramMap, EmailConfig.NODE_RESTARTED, toValue, fromValue, subjectValue, bodyValue);
-      
-    }
-    else
-    {
-      // Initialize all records with blanks
-      addRecord(paramMap, EmailConfig.NODE_FINISHED, "", "", "", "");
-      addRecord(paramMap, EmailConfig.NODE_ERRORABORTED, "", "", "", "");
-      addRecord(paramMap, EmailConfig.NODE_MANUALABORTED, "", "", "", "");
-      addRecord(paramMap, EmailConfig.NODE_MANUALPAUSED, "", "", "", "");
-      addRecord(paramMap, EmailConfig.NODE_SCHEDULEPAUSED, "", "", "", "");
-      addRecord(paramMap, EmailConfig.NODE_RESTARTED, "", "", "" ,"");
-
-      // Loop through nodes and pick them out that way
-      for (int i = 0; i < ds.getChildCount(); i++) {
-        SpecificationNode childNode = ds.getChild(i);
-        if (childNode.getType().equals(EmailConfig.NODE_FINISHED) ||
-          childNode.getType().equals(EmailConfig.NODE_ERRORABORTED) ||
-          childNode.getType().equals(EmailConfig.NODE_MANUALABORTED) ||
-          childNode.getType().equals(EmailConfig.NODE_MANUALPAUSED) ||
-          childNode.getType().equals(EmailConfig.NODE_SCHEDULEPAUSED) ||
-          childNode.getType().equals(EmailConfig.NODE_RESTARTED)) {
-          toValue = "";
-          fromValue = "";
-          subjectValue = "";
-          bodyValue = "";
-          for (int j = 0; j < childNode.getChildCount(); j++) {
-            SpecificationNode sn = childNode.getChild(j);
-            if (sn.getType().equals(EmailConfig.NODE_TO)) {
-              toValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-            } else if (sn.getType().equals(EmailConfig.NODE_FROM)) {
-              fromValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-            } else if (sn.getType().equals(EmailConfig.NODE_SUBJECT)) {
-              subjectValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-            } else if (sn.getType().equals(EmailConfig.NODE_BODY)) {
-              bodyValue = sn.getAttributeValue(EmailConfig.ATTRIBUTE_VALUE);
-            }
-          }
-          addRecord(paramMap, childNode.getType(), toValue, fromValue, subjectValue, bodyValue);
-        }
-      }
-    }
-  }
-
-  protected static void addRecord(Map<String,Object> paramMap, String nodeType, String toValue, String fromValue, String subjectValue, String bodyValue) {
-    paramMap.put(nodeType+"_TO", toValue);
-    paramMap.put(nodeType+"_FROM", fromValue);
-    paramMap.put(nodeType+"_SUBJECT", subjectValue);
-    paramMap.put(nodeType+"_BODY", bodyValue);
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    return processMessageTab(variableContext, ds, connectionSequenceNumber);
-  }
-
-  protected String processMessageTab(IPostParameters variableContext, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    
-    // Remove legacy nodes always
-    removeNodes(ds, EmailConfig.NODE_TO);
-    removeNodes(ds, EmailConfig.NODE_FROM);
-    removeNodes(ds, EmailConfig.NODE_SUBJECT);
-    removeNodes(ds, EmailConfig.NODE_BODY);
-    
-    // Gather all different kinds.
-    gatherRecord(ds, seqPrefix, variableContext, EmailConfig.NODE_FINISHED);
-    gatherRecord(ds, seqPrefix, variableContext, EmailConfig.NODE_ERRORABORTED);
-    gatherRecord(ds, seqPrefix, variableContext, EmailConfig.NODE_MANUALABORTED);
-    gatherRecord(ds, seqPrefix, variableContext, EmailConfig.NODE_MANUALPAUSED);
-    gatherRecord(ds, seqPrefix, variableContext, EmailConfig.NODE_SCHEDULEPAUSED);
-    gatherRecord(ds, seqPrefix, variableContext, EmailConfig.NODE_RESTARTED);
-    
-    return null;
-  }
-
-  protected static void gatherRecord(Specification ds, String seqPrefix, IPostParameters variableContext, String nodeType) {
-    removeNodes(ds, nodeType);
-    SpecificationNode sn = new SpecificationNode(nodeType);
-    String toString = variableContext.getParameter(seqPrefix + nodeType + "_to");
-    if (toString != null)
-    {
-      addNodeValue(sn, EmailConfig.NODE_TO, toString);
-    }
-    String fromString = variableContext.getParameter(seqPrefix + nodeType + "_from");
-    if (fromString != null)
-    {
-      addNodeValue(sn, EmailConfig.NODE_FROM, fromString);
-    }
-    String subjectString = variableContext.getParameter(seqPrefix + nodeType + "_subject");
-    if (subjectString != null)
-    {
-      addNodeValue(sn, EmailConfig.NODE_SUBJECT, subjectString);
-    }
-    String bodyString = variableContext.getParameter(seqPrefix + nodeType + "_body");
-    if (bodyString != null)
-    {
-      addNodeValue(sn, EmailConfig.NODE_BODY, bodyString);
-    }
-    ds.addChild(ds.getChildCount(),sn);
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    fillInMessageTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationView.html", paramMap);
-  }
-
-  ///////////////////////////////////////End of specification UI///////////////////////////////////////////////
-  
-  protected static void addFindParameterNode(ConfigParams parameters, String findParameterName, String findParameterValue) {
-    ConfigNode cn = new ConfigNode(EmailConfig.NODE_PROPERTIES);
-    cn.setAttribute(EmailConfig.ATTRIBUTE_NAME, findParameterName);
-    cn.setAttribute(EmailConfig.ATTRIBUTE_VALUE, findParameterValue);
-    // Add to the end
-    parameters.addChild(parameters.getChildCount(), cn);
-  }
-
-  protected static void removeNodes(ConfigParams parameters, String nodeTypeName) {
-    int i = 0;
-    while (i < parameters.getChildCount()) {
-      ConfigNode cn = parameters.getChild(i);
-      if (cn.getType().equals(nodeTypeName))
-        parameters.removeChild(i);
-      else
-        i++;
-    }
-  }
-
-  protected static void removeNodes(Specification ds, String nodeTypeName) {
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(nodeTypeName))
-        ds.removeChild(i);
-      else
-        i++;
-    }
-  }
-
-  protected static void addNodeValue(SpecificationNode ds, String nodeType, String value)
-  {
-    SpecificationNode sn = new SpecificationNode(nodeType);
-    sn.setAttribute(EmailConfig.ATTRIBUTE_VALUE,value);
-    ds.addChild(ds.getChildCount(),sn);
-  }
-  
-
-  /** Handle Messaging exceptions in a consistent global manner */
-  protected static void handleMessagingException(MessagingException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.error("Email: Error "+context+": "+e.getMessage(),e);
-    throw new ManifoldCFException("Error "+context+": "+e.getMessage(),e);
-  }
-  
-  /** Class to set up connection.
-  */
-  protected static class ConnectThread extends Thread
-  {
-    protected final String server;
-    protected final int port;
-    protected final String username;
-    protected final String password;
-    protected final Properties properties;
-    
-    // Local session handle
-    protected EmailSession session = null;
-    protected Throwable exception = null;
-    
-    public ConnectThread(String server, int port, String username, String password, Properties properties)
-    {
-      this.server = server;
-      this.port = port;
-      this.username = username;
-      this.password = password;
-      this.properties = properties;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session = new EmailSession(server, port, username, password, properties);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public EmailSession finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return session;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to close the session.
-  */
-  protected static class CloseSessionThread extends Thread
-  {
-    protected final EmailSession session;
-    
-    protected Throwable exception = null;
-    
-    public CloseSessionThread(EmailSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session.close();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to check the connection.
-  */
-  protected static class CheckConnectionThread extends Thread
-  {
-    protected final EmailSession session;
-    
-    protected Throwable exception = null;
-    
-    public CheckConnectionThread(EmailSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to send email.
-  */
-  protected static class SendThread extends Thread
-  {
-    protected final EmailSession session;
-    protected final List<String> to;
-    protected final String from;
-    protected final String subject;
-    protected final String body;
-    
-    protected Throwable exception = null;
-    
-    public SendThread(EmailSession session, List<String> to, String from, String subject, String body)
-    {
-      this.session = session;
-      this.to = to;
-      this.from = from;
-      this.subject = subject;
-      this.body = body;
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        session.send(to,from,subject,body);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws MessagingException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof MessagingException)
-            throw (MessagingException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-}
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailSession.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailSession.java
deleted file mode 100644
index 7c83f60..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/EmailSession.java
+++ /dev/null
@@ -1,120 +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 org.apache.manifoldcf.crawler.notifications.email;
-
-import java.io.*;
-import java.util.*;
-import javax.mail.*;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.InternetAddress;
-
-/** This class represents a raw email session, without any protection
-* from threads waiting on sockets, etc.
-*/
-public class EmailSession
-{
-  protected final String server;
-  protected final int port;
-  protected final String username;
-  protected final String password;
-  protected final Properties properties;
-
-  private Session session = null;
-
-  /** Create a session */
-  public EmailSession(final String server, final int port, final String username, final String password,
-    Properties properties)
-    throws MessagingException
-  {
-    this.server = server;
-    this.port = port;
-    this.username = username;
-    this.password = password;
-    this.properties = properties;
-
-    properties.put("mail.smtp.host", server);
-    properties.put("mail.smtp.port", new Integer(port).toString());
-
-    if (properties.get("mail.smtp.connectiontimeout") == null) {
-      properties.put("mail.smtp.connectiontimeout", new Integer(60000));
-    }
-    if (properties.get("mail.smtp.timeout") == null) {
-      properties.put("mail.smtp.timeout", new Integer(60000));
-    }
-    if (properties.get("mail.smtp.writetimeout") == null) {
-      properties.put("mail.smtp.writetimeout", new Integer(60000));
-    }
-    
-    if (username != null && username.length() > 0) {
-      properties.put("mail.smtp.auth", "true");
-    }
-    
-    if (properties.get("mail.smtp.starttls.enable") == null) {
-      properties.put("mail.smtp.starttls.enable", "true");
-      //properties.put("mail.smtp.ssl.trust", true);
-    }
-
-    
-    // Now, try to connect
-    final Session thisSession = Session.getInstance(properties,
-      new javax.mail.Authenticator() {
-        protected PasswordAuthentication getPasswordAuthentication() {
-          return new PasswordAuthentication(username, password);
-        }
-      });
-  
-    session = thisSession;
-  }
-  
-  public void checkConnection()
-    throws MessagingException
-  {
-    // Need something here...
-  }
-
-  public void send(List<String> to, String from, String subject, String body)
-    throws MessagingException
-  {
-    // Create a default MimeMessage object.
-    MimeMessage message = new MimeMessage(session);
-
-    // Set From: header field of the header.
-    message.setFrom(new InternetAddress(from));
-
-    // Set To: header field of the header.
-    for (String toValue : to) {
-      message.addRecipient(Message.RecipientType.TO, new InternetAddress(toValue));
-    }
-
-    // Set Subject: header field
-    message.setSubject(subject);
-
-    // Now set the actual message
-    message.setText(body);
-
-    // Send message
-    Transport.send(message);
-  }
-  
-  public void close()
-    throws MessagingException
-  {
-    session = null;
-  }
-}
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/Messages.java b/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/Messages.java
deleted file mode 100644
index c63b469..0000000
--- a/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/email/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.email;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.notifications.email.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.notifications.email";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_en_US.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_en_US.properties
deleted file mode 100644
index cf39895..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_en_US.properties
+++ /dev/null
@@ -1,57 +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.
-
-EmailConnector.Server=Server
-EmailConnector.URL=URL
-EmailConnector.Metadata=Metadata
-EmailConnector.Filter=Filter
-
-EmailConnector.EnterAMailServerHostName=Enter a mail server host name
-EmailConnector.PleaseSelectAConfigurationParameterName=Please select a configuration parameter name
-EmailConnector.PleaseSelectAMetadataName=Please select a metadata name
-EmailConnector.ValueCannotBeBlank=Value cannot be blank
-EmailConnector.URLTemplateCannotBeBlank=URL template cannot be blank
-
-EmailConnector.URLTemplateColon=URL template:
-EmailConnector.ConfigurationPropertiesColon=Configuration properties:
-EmailConnector.ProtocolColon=Protocol:
-EmailConnector.HostNameColon=Host name:
-EmailConnector.PortColon=Port:
-EmailConnector.UserNameColon=User name:
-EmailConnector.PasswordColon=Password:
-EmailConnector.MatchesColon=Matches:
-EmailConnector.FoldersColon=Folders:
-EmailConnector.RecordFilterColon=Record filter:
-EmailConnector.ServerProperty=Server property
-EmailConnector.Value=Value
-EmailConnector.NoServerPropertiesSpecified=No server properties specified
-EmailConnector.AddNewMatch=Add new match
-EmailConnector.AddNewProperty=Add new property
-EmailConnector.Add=Add
-EmailConnector.DeleteMatchNumber=Delete match #
-EmailConnector.DeletePropertyNumber=Delete property #
-EmailConnector.Delete=Delete
-EmailConnector.MetadataName=Metadata name
-EmailConnector.NoMetadataSpecified=No metadata specified
-EmailConnector.SelectMetadataName=--Select metadata name --
-EmailConnector.IncludedMetadataColon=Included metadata:
-EmailConnector.ExtractEmailColon=Fields to extract e-mail addresses from:
-EmailConnector.AttachmentURLTemplateColon=Attachment URL template (blank if no attachments desired):
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_es_ES.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_es_ES.properties
deleted file mode 100644
index a3e7c04..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_es_ES.properties
+++ /dev/null
@@ -1,59 +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.
-
-EmailConnector.Server=Servidor
-EmailConnector.URL=URL
-EmailConnector.Metadata=metadatos
-EmailConnector.Filter=Filtro
-
-EmailConnector.EnterAMailServerHostName=Introduzca un nombre de host del servidor de correo
-EmailConnector.PleaseSelectAConfigurationParameterName=Por favor seleccione un nombre de parámetro de configuración
-EmailConnector.PleaseSelectAMetadataName=Por favor seleccione un nombre de metadatos
-EmailConnector.ValueCannotBeBlank=El valor no puede estar en blanco
-EmailConnector.URLTemplateCannotBeBlank=URL plantilla no puede estar en blanco
-
-EmailConnector.URLTemplateColon=URL plantilla:
-EmailConnector.ConfigurationPropertiesColon=propiedades de configuración:
-EmailConnector.ProtocolColon=Protocolo:
-EmailConnector.HostNameColon=nombre de host:
-EmailConnector.PortColon=Puerto:
-EmailConnector.UserNameColon=Nombre de usuario:
-EmailConnector.PasswordColon=Contraseña:
-EmailConnector.MatchesColon=Correspondecia:
-EmailConnector.FoldersColon=Carpetas:
-EmailConnector.RecordFilterColon=filtro de registros:
-EmailConnector.ServerProperty=propiedad del servidor
-EmailConnector.Value=Valor
-EmailConnector.NoServerPropertiesSpecified=No hay propiedades de servidor especificados
-EmailConnector.AddNewMatch=Añadir una nueva correspondecia
-EmailConnector.AddNewProperty=Añadir nueva propiedad
-EmailConnector.Add=añadir
-EmailConnector.DeleteMatchNumber=eliminar correspondencia #
-EmailConnector.DeletePropertyNumber=eliminar propiedad #
-EmailConnector.Delete=borrar
-EmailConnector.MetadataName=nombre de metadatos
-EmailConnector.NoMetadataSpecified=Sin metadatos especificada
-EmailConnector.SelectMetadataName=--Seleccione el nombre de metadatos --
-EmailConnector.IncludedMetadataColon=metadatos Incluido:
-EmailConnector.ExtractEmailColon=Fields to extract e-mail addresses from:
-EmailConnector.AttachmentURLTemplateColon=Attachment URL template (blank if no attachments desired):
-
-
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_ja_JP.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_ja_JP.properties
deleted file mode 100644
index 075fd3b..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_ja_JP.properties
+++ /dev/null
@@ -1,59 +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.
-
-EmailConnector.Server=Server
-EmailConnector.URL=URL
-EmailConnector.Metadata=Metadata
-EmailConnector.Filter=Filter
-
-EmailConnector.EnterAMailServerHostName=Enter a mail server host name
-EmailConnector.PleaseSelectAConfigurationParameterName=Please select a configuration parameter name
-EmailConnector.PleaseSelectAMetadataName=Please select a metadata name
-EmailConnector.ValueCannotBeBlank=Value cannot be blank
-EmailConnector.URLTemplateCannotBeBlank=URL template cannot be blank
-
-EmailConnector.URLTemplateColon=URL template:
-EmailConnector.ConfigurationPropertiesColon=Configuration properties:
-EmailConnector.ProtocolColon=Protocol:
-EmailConnector.HostNameColon=Host name:
-EmailConnector.PortColon=Port:
-EmailConnector.UserNameColon=User name:
-EmailConnector.PasswordColon=Password:
-EmailConnector.MatchesColon=Matches:
-EmailConnector.FoldersColon=Folders:
-EmailConnector.RecordFilterColon=Record filter:
-EmailConnector.ServerProperty=Server property
-EmailConnector.Value=Value
-EmailConnector.NoServerPropertiesSpecified=No server properties specified
-EmailConnector.AddNewMatch=Add new match
-EmailConnector.AddNewProperty=Add new property
-EmailConnector.Add=Add
-EmailConnector.DeleteMatchNumber=Delete match #
-EmailConnector.DeletePropertyNumber=Delete property #
-EmailConnector.Delete=Delete
-EmailConnector.MetadataName=Metadata name
-EmailConnector.NoMetadataSpecified=No metadata specified
-EmailConnector.SelectMetadataName=--Select metadata name --
-EmailConnector.IncludedMetadataColon=Included metadata:
-EmailConnector.ExtractEmailColon=Fields to extract e-mail addresses from:
-EmailConnector.AttachmentURLTemplateColon=Attachment URL template (blank if no attachments desired):
-
-
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_zh_CN.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_zh_CN.properties
deleted file mode 100644
index 44ba4e3..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/email/common_zh_CN.properties
+++ /dev/null
@@ -1,59 +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.
-
-EmailConnector.Server=服务器
-EmailConnector.URL=URL
-EmailConnector.Metadata=元数据
-EmailConnector.Filter=过滤器
-
-EmailConnector.EnterAMailServerHostName=请输入邮件服务器主机名
-EmailConnector.PleaseSelectAConfigurationParameterName=请选择配置参数名
-EmailConnector.PleaseSelectAMetadataName=请选择元数据名
-EmailConnector.ValueCannotBeBlank=值不能为空
-EmailConnector.URLTemplateCannotBeBlank=URL模版不能为空
-
-EmailConnector.URLTemplateColon=URL模版:
-EmailConnector.ConfigurationPropertiesColon=配置属性:
-EmailConnector.ProtocolColon=协议:
-EmailConnector.HostNameColon=主机名:
-EmailConnector.PortColon=端口:
-EmailConnector.UserNameColon=用户名:
-EmailConnector.PasswordColon=密码:
-EmailConnector.MatchesColon=匹配:
-EmailConnector.FoldersColon=文件夹:
-EmailConnector.RecordFilterColon=记录过滤器:
-EmailConnector.ServerProperty=服务器属性
-EmailConnector.Value=值
-EmailConnector.NoServerPropertiesSpecified=服务器属性未指定
-EmailConnector.AddNewMatch=添加新匹配
-EmailConnector.AddNewProperty=添加新属性
-EmailConnector.Add=添加
-EmailConnector.DeleteMatchNumber=删除匹配 #
-EmailConnector.DeletePropertyNumber=删除属性 #
-EmailConnector.Delete=删除
-EmailConnector.MetadataName=元数据名
-EmailConnector.NoMetadataSpecified=元数据未指定
-EmailConnector.SelectMetadataName=-- 选择元数据名 --
-EmailConnector.IncludedMetadataColon=被包含的元数据:
-EmailConnector.ExtractEmailColon=Fields to extract e-mail addresses from:
-EmailConnector.AttachmentURLTemplateColon=Attachment URL template (blank if no attachments desired):
-
-
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_en_US.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_en_US.properties
deleted file mode 100644
index 81ba371..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_en_US.properties
+++ /dev/null
@@ -1,58 +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.
-
-EmailConnector.Server=Server
-EmailConnector.Message=Message
-
-EmailConnector.EnterAMailServerHostName=Enter a mail server host name
-EmailConnector.PleaseSelectAConfigurationParameterName=Please select a configuration parameter name
-EmailConnector.ValueCannotBeBlank=Value cannot be blank
-EmailConnector.PortMustBeIntegerOrBlank=Port must be an integer, or blank
-
-EmailConnector.ConfigurationPropertiesColon=Configuration properties:
-EmailConnector.ProtocolColon=Protocol:
-EmailConnector.HostNameColon=Host name:
-EmailConnector.PortColon=Port:
-EmailConnector.UserNameColon=User name:
-EmailConnector.PasswordColon=Password:
-
-EmailConnector.ServerProperty=Server property
-EmailConnector.Value=Value
-EmailConnector.NoServerPropertiesSpecified=No server properties specified
-EmailConnector.AddNewProperty=Add new property
-EmailConnector.Add=Add
-EmailConnector.DeletePropertyNumber=Delete property #
-EmailConnector.Delete=Delete
-
-EmailConnector.JobFinished=Job finished
-EmailConnector.JobStopErrorAbort=Job stopped due to error abort
-EmailConnector.JobStopManualAbort=Job stopped due to manual abort
-EmailConnector.JobStopManualPause=Job stopped due to manual pause
-EmailConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-EmailConnector.JobStopRestart=Job stopped due to job restart
-
-EmailConnector.ToColon=To:
-EmailConnector.FromColon=From:
-EmailConnector.SubjectColon=Subject:
-EmailConnector.BodyColon=Body:
-
-EmailConnector.ToFieldCannotBeBlank='To' field cannot be blank
-EmailConnector.FromFieldCannotBeBlank='From' field cannot be blank
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_es_ES.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_es_ES.properties
deleted file mode 100644
index 13a5300..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_es_ES.properties
+++ /dev/null
@@ -1,58 +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.
-
-EmailConnector.Server=Servidor
-EmailConnector.Message=Mensaje
-
-EmailConnector.EnterAMailServerHostName=Introduzca un nombre de host del servidor de correo
-EmailConnector.PleaseSelectAConfigurationParameterName=Por favor seleccione un nombre de parámetro de configuración
-EmailConnector.ValueCannotBeBlank=El valor no puede estar en blanco
-EmailConnector.PortMustBeIntegerOrBlank=Puerto debe ser un número entero, o en blanco
-
-EmailConnector.ConfigurationPropertiesColon=Configuration properties:
-EmailConnector.ProtocolColon=Protocolo:
-EmailConnector.HostNameColon=nombre de host:
-EmailConnector.PortColon=puerto:
-EmailConnector.UserNameColon=nombre de usuario:
-EmailConnector.PasswordColon=Contraseña:
-
-EmailConnector.ServerProperty=propiedad del servidor
-EmailConnector.Value=Valor
-EmailConnector.NoServerPropertiesSpecified=No hay propiedades de servidor especificados
-EmailConnector.AddNewProperty=Añadir nueva propiedad
-EmailConnector.Add=añadir
-EmailConnector.DeletePropertyNumber=eliminar la propiedad #
-EmailConnector.Delete=borrar
-
-EmailConnector.JobFinished=trabajo terminado
-EmailConnector.JobStopErrorAbort=Trabajo parado debido a deficiencia de error
-EmailConnector.JobStopManualAbort=Trabajo parado debido a defciencia del manual
-EmailConnector.JobStopManualPause=Trabajo parado debido a pausa manual
-EmailConnector.JobStopSchedulePause=Trabajo parado debido a la pausa programada
-EmailConnector.JobStopRestart=Trabajo parado debido a nuevo principio de trabajo
-
-EmailConnector.ToColon=A:
-EmailConnector.FromColon=De:
-EmailConnector.SubjectColon=Asunto:
-EmailConnector.BodyColon=Cuerpo:
-
-EmailConnector.ToFieldCannotBeBlank='A' campo no puede estar en blanco
-EmailConnector.FromFieldCannotBeBlank='De' el campo no puede ser en blanco
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_ja_JP.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_ja_JP.properties
deleted file mode 100644
index 81ba371..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_ja_JP.properties
+++ /dev/null
@@ -1,58 +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.
-
-EmailConnector.Server=Server
-EmailConnector.Message=Message
-
-EmailConnector.EnterAMailServerHostName=Enter a mail server host name
-EmailConnector.PleaseSelectAConfigurationParameterName=Please select a configuration parameter name
-EmailConnector.ValueCannotBeBlank=Value cannot be blank
-EmailConnector.PortMustBeIntegerOrBlank=Port must be an integer, or blank
-
-EmailConnector.ConfigurationPropertiesColon=Configuration properties:
-EmailConnector.ProtocolColon=Protocol:
-EmailConnector.HostNameColon=Host name:
-EmailConnector.PortColon=Port:
-EmailConnector.UserNameColon=User name:
-EmailConnector.PasswordColon=Password:
-
-EmailConnector.ServerProperty=Server property
-EmailConnector.Value=Value
-EmailConnector.NoServerPropertiesSpecified=No server properties specified
-EmailConnector.AddNewProperty=Add new property
-EmailConnector.Add=Add
-EmailConnector.DeletePropertyNumber=Delete property #
-EmailConnector.Delete=Delete
-
-EmailConnector.JobFinished=Job finished
-EmailConnector.JobStopErrorAbort=Job stopped due to error abort
-EmailConnector.JobStopManualAbort=Job stopped due to manual abort
-EmailConnector.JobStopManualPause=Job stopped due to manual pause
-EmailConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-EmailConnector.JobStopRestart=Job stopped due to job restart
-
-EmailConnector.ToColon=To:
-EmailConnector.FromColon=From:
-EmailConnector.SubjectColon=Subject:
-EmailConnector.BodyColon=Body:
-
-EmailConnector.ToFieldCannotBeBlank='To' field cannot be blank
-EmailConnector.FromFieldCannotBeBlank='From' field cannot be blank
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_zh_CN.properties b/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_zh_CN.properties
deleted file mode 100644
index 81ba371..0000000
--- a/connectors/email/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/email/common_zh_CN.properties
+++ /dev/null
@@ -1,58 +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.
-
-EmailConnector.Server=Server
-EmailConnector.Message=Message
-
-EmailConnector.EnterAMailServerHostName=Enter a mail server host name
-EmailConnector.PleaseSelectAConfigurationParameterName=Please select a configuration parameter name
-EmailConnector.ValueCannotBeBlank=Value cannot be blank
-EmailConnector.PortMustBeIntegerOrBlank=Port must be an integer, or blank
-
-EmailConnector.ConfigurationPropertiesColon=Configuration properties:
-EmailConnector.ProtocolColon=Protocol:
-EmailConnector.HostNameColon=Host name:
-EmailConnector.PortColon=Port:
-EmailConnector.UserNameColon=User name:
-EmailConnector.PasswordColon=Password:
-
-EmailConnector.ServerProperty=Server property
-EmailConnector.Value=Value
-EmailConnector.NoServerPropertiesSpecified=No server properties specified
-EmailConnector.AddNewProperty=Add new property
-EmailConnector.Add=Add
-EmailConnector.DeletePropertyNumber=Delete property #
-EmailConnector.Delete=Delete
-
-EmailConnector.JobFinished=Job finished
-EmailConnector.JobStopErrorAbort=Job stopped due to error abort
-EmailConnector.JobStopManualAbort=Job stopped due to manual abort
-EmailConnector.JobStopManualPause=Job stopped due to manual pause
-EmailConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-EmailConnector.JobStopRestart=Job stopped due to job restart
-
-EmailConnector.ToColon=To:
-EmailConnector.FromColon=From:
-EmailConnector.SubjectColon=Subject:
-EmailConnector.BodyColon=Body:
-
-EmailConnector.ToFieldCannotBeBlank='To' field cannot be blank
-EmailConnector.FromFieldCannotBeBlank='From' field cannot be blank
-
-
-
-
-
-
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/ConfigurationHeader.js b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/ConfigurationHeader.js
deleted file mode 100644
index 0ff31f2..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/ConfigurationHeader.js
+++ /dev/null
@@ -1,91 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.port.value != "" && !isInteger(editconnection.port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PortMustBeIntegerOrBlank'))");
-    editconnection.port.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.server.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.EnterAMailServerHostName'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.Server'))");
-    editconnection.server.focus();
-    return false;
-  }
-  if (editconnection.port.value != "" && !isInteger(editconnection.port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PortMustBeIntegerOrBlank'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  if (editconnection.url.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.URLTemplateCannotBeBlank'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.URL'))");
-    editconnection.url.focus();
-    return false;
-  }
-  return true;
-}
-
-function addProperty()
-{
-  postFormSetAnchor("property"); //Repost the form and send the browser to property anchor
-}
-
-function SpecOp(n, opValue, anchorvalue)
-{
-  eval("editconnection."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function FindDelete(n)
-{
-  SpecOp("findop_"+n, "Delete", "find_"+n);
-}
-
-function FindAdd(n)
-{
-  if (editconnection.findname.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PleaseSelectAConfigurationParameterName'))");
-    editconnection.findname.focus();
-    return;
-  }
-  if (editconnection.findvalue.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ValueCannotBeBlank'))");
-    editconnection.findvalue.focus();
-    return;
-  }
-  SpecOp("findop", "Add", "find_"+n);
-}
-
-//-->
-</script>
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/ConfigurationView.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/ConfigurationView.html
deleted file mode 100644
index 2fc39b1..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/ConfigurationView.html
+++ /dev/null
@@ -1,104 +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.
--->
-
-<table class="displaytable">
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROTOCOL)</nobr>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.HostNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($SERVER)</nobr>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PORT)</nobr>
-    </td>
-  </tr>
-
-  <tr><td  class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.UserNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($USERNAME)</nobr>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>********</nobr>
-    </td>
-  </tr>
-
-  <tr><td  class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ConfigurationPropertiesColon'))</nobr>
-    </td>
-    <td class="value">
-#foreach( $property in $PROPERTIES )
-        <nobr>
-            $Encoder.bodyEscape($property.get('name')) : $Encoder.bodyEscape($property.get('value'))
-        </nobr>
-        <br/>
-#end
-
-    </td>
-  </tr>
-  
-  <tr><td  class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.URLTemplateColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($URL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.AttachmentURLTemplateColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($ATTACHMENTURL)</nobr>
-    </td>
-  </tr>
-
-</table>
-
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Configuration_Server.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Configuration_Server.html
deleted file mode 100644
index ee74393..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Configuration_Server.html
+++ /dev/null
@@ -1,189 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('EmailConnector.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select id="protocol" name="protocol" size="2">
-  #if($PROTOCOL == 'IMAP')
-        <option value="IMAP" selected="selected">IMAP</option>
-  #else
-        <option value="IMAP">IMAP</option>
-  #end
-  #if($PROTOCOL == 'IMAP-SSL')
-        <option value="IMAP-SSL" selected="selected">IMAP-SSL</option>
-  #else
-        <option value="IMAP-SSL">IMAP-SSL</option>
-  #end
-  #if($PROTOCOL == 'POP3')
-        <option value="POP3" selected="selected">POP3</option>
-  #else
-        <option value="POP3">POP3</option>
-  #end
-  #if($PROTOCOL == 'POP3-SSL')
-        <option value="POP3-SSL" selected="selected">POP3-SSL</option>
-  #else
-        <option value="POP3-SSL">POP3-SSL</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.HostNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="server" name="server" type="text" size="32" value="$Encoder.attributeEscape($SERVER)"/>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" id="port" name="port" value="$Encoder.attributeEscape($PORT)"/>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.UserNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" id="username" name="username" value="$Encoder.attributeEscape($USERNAME)"/>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="password" id="password" name="password" value="$Encoder.attributeEscape($PASSWORD)"/>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ConfigurationPropertiesColon'))</nobr>
-    </td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ServerProperty'))</nobr>
-          </td>
-          <td class="formcolumnheader">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.Value'))</nobr>
-          </td>
-        </tr>
-
-  #set($k = 0)
-  #foreach($property in $PROPERTIES)
-
-    #if(($k % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <input type="hidden" name="findop_$k" value=""/>
-            <input type="hidden" name="findname_$k" value="$Encoder.attributeEscape($property.get('name'))"/>
-            <input type="hidden" name="findvalue_$k" value="$Encoder.attributeEscape($property.get('value'))"/>
-            <a name="find_$k">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.Delete'))" onClick='Javascript:FindDelete("$k")' alt="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.DeletePropertyNumber'))$k"/>
-            </a>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($property.get('name'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($property.get('value'))</nobr>
-          </td>
-        </tr>
-
-    #set($k = $k + 1)
-  #end
-
-  #if($k == 0)
-        <tr class="formrow">
-          <td class="formcolumnmessage" colspan="3">$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.NoServerPropertiesSpecified'))</td>
-        </tr>
-  #end
-
-        <tr class="formrow"><td class="formseparator" colspan="3"><hr/></td></tr>
-
-  #set($nextk = $k + 1)
-
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <nobr>
-              <a name="find_$k">
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.Add'))" onClick='Javascript:FindAdd("$nextk")' alt="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.AddNewProperty'))"/>
-                <input type="hidden" name="findcount" value="$k"/>
-                <input type="hidden" name="findop" value=""/>
-              </a>
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="32" name="findname" value=""/></nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="32" name="findvalue" value=""/></nobr>
-          </td>
-        </tr>
-
-
-      </table>
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="username" value="$Encoder.attributeEscape($USERNAME)"/>
-<input type="hidden" name="password" value="$Encoder.attributeEscape($PASSWORD)"/>
-<input type="hidden" name="protocol" value="$Encoder.attributeEscape($PROTOCOL)"/>
-<input type="hidden" name="server" value="$Encoder.attributeEscape($SERVER)"/>
-<input type="hidden" name="port" value="$Encoder.attributeEscape($PORT)"/>
-
-  #set($k = 0)
-  #foreach($property in $PROPERTIES)
-
-<input type="hidden" name="findname_$k" value="$Encoder.attributeEscape($property.get('name'))"/>
-<input type="hidden" name="findvalue_$k" value="$Encoder.attributeEscape($property.get('value'))"/>
-
-    #set($k = $k + 1)
-  #end
-
-<input type="hidden" name="findcount" value="$k"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Configuration_URL.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Configuration_URL.html
deleted file mode 100644
index f208e7d..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Configuration_URL.html
+++ /dev/null
@@ -1,45 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('EmailConnector.URL'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.URLTemplateColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr><input type="text" name="url" size="60" value="$Encoder.attributeEscape($URL)"/></nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.AttachmentURLTemplateColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr><input type="text" name="attachmenturl" size="60" value="$Encoder.attributeEscape($ATTACHMENTURL)"/></nobr>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="url" value="$Encoder.attributeEscape($URL)"/>
-<input type="hidden" name="attachmenturl" value="$Encoder.attributeEscape($ATTACHMENTURL)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/SpecificationHeader.js b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/SpecificationHeader.js
deleted file mode 100644
index 19d6b08..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/SpecificationHeader.js
+++ /dev/null
@@ -1,69 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SeqNum}_checkSpecification()
-{
-  if (s${SeqNum}_checkDocumentsTab() == false)
-    return false;
-  if (s${SeqNum}_checkMetadataTab() == false)
-    return false;
-  return true;
-}
- 
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function s${SeqNum}_checkDocumentsTab()
-{
-  return true;
-}
-
-function s${SeqNum}_checkMetadataTab()
-{
-  return true;
-}
-
-function s${SeqNum}_FindDelete(n)
-{
-  s${SeqNum}_SpecOp("s${SeqNum}_findop_"+n, "Delete", "s${SeqNum}_find_"+n);
-}
-
-function s${SeqNum}_FindAdd(n)
-{
-  if (editjob.s${SeqNum}_findname.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PleaseSelectAMetadataName'))");
-    editjob.s${SeqNum}_findname.focus();
-    return;
-  }
-  if (editjob.s${SeqNum}_findvalue.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ValueCannotBeBlank'))");
-    editjob.s${SeqNum}_findvalue.focus();
-    return;
-  }
-  s${SeqNum}_SpecOp("s${SeqNum}_findop", "Add", "s${SeqNum}_find_"+n);
-}
-
-//-->
-</script>
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/SpecificationView.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/SpecificationView.html
deleted file mode 100644
index 11687fc..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/SpecificationView.html
+++ /dev/null
@@ -1,82 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FoldersColon'))</nobr></td>
-    <td class="value">
-  #foreach($folder in $FOLDERS)
-      <nobr>$Encoder.bodyEscape($folder)</nobr><br/>
-  #end
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.RecordFilterColon'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.MetadataName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.Value'))</nobr></td>
-        </tr>
-
-#set($k = 0)
-#foreach($match in $MATCHES)
-  #if(($k % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($match.get('name'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($match.get('value'))</nobr>
-          </td>
-        </tr>
-  #set($k = $k + 1)
-#end
-    
-      </table>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.IncludedMetadataColon'))</nobr></td>
-    <td class="value">
-
-#set($seendata = false)
-#foreach($metadataselection in $METADATASELECTIONS)
-  #if($seendata)
-      <br/>
-  #end
-  #set($seendata = true)
-      <nobr>$Encoder.bodyEscape($metadataselection)</nobr>
-#end
-
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ExtractEmailColon'))</nobr></td>
-    <td class="value">
-        #if($EXTRACTEMAILSELECTION)
-      <nobr>$Encoder.bodyEscape($EXTRACTEMAILSELECTION)</nobr>
-        #end
-    </td>
-  </tr>
-</table>
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Specification_Filter.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Specification_Filter.html
deleted file mode 100644
index 3bf827c..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Specification_Filter.html
+++ /dev/null
@@ -1,145 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('EmailConnector.Filter') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-  #if($EXCEPTION == '')
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FoldersColon'))</nobr>
-    </td>
-    <td class="value">
-      <select name="s${SeqNum}_folders" multiple="true" size="4">
-    #foreach($name in $FOLDERNAMES)
-      #if($FOLDERS.contains($name))
-        <option value="$Encoder.attributeEscape($name)" selected="true">$Encoder.bodyEscape($name)</option>
-      #else
-        <option value="$Encoder.attributeEscape($name)">$Encoder.bodyEscape($name)</option>
-      #end
-    #end
-      </select>
-    </td>
-  #else
-    <td class="message" colspan="2">
-    #foreach($name in $FOLDERS)
-      <input type="hidden" name="s${SeqNum}_folders" value="$Encoder.attributeEscape($name)"/>
-    #end
-      $Encoder.bodyEscape($EXCEPTION)
-    </td>
-  #end
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.RecordFilterColon'))</nobr>
-    </td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.MetadataName'))</nobr>
-          </td>
-          <td class="formcolumnheader">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.Value'))</nobr>
-          </td>
-        </tr>
-
-  #set($k = 0)
-  #foreach($match in $MATCHES)
-
-    #if(($k % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <input type="hidden" name="s${SeqNum}_findop_$k" value=""/>
-            <input type="hidden" name="s${SeqNum}_findname_$k" value="$Encoder.attributeEscape($match.get('name'))"/>
-            <input type="hidden" name="s${SeqNum}_findvalue_$k" value="$Encoder.attributeEscape($match.get('value'))"/>
-            <a name="s${SeqNum}_find_$k">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.Delete'))" onClick='Javascript:s${SeqNum}_FindDelete("$k")' alt="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.DeleteMatchNumber'))$k"/>
-            </a>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($match.get('name'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($match.get('value'))</nobr>
-          </td>
-        </tr>
-
-    #set($k = $k + 1)
-  #end
-
-  #if($k == 0)
-        <tr class="formrow">
-          <td class="formcolumnmessage" colspan="3">$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.NoMetadataSpecified'))</td>
-        </tr>
-  #end
-
-        <tr class="formrow"><td class="formseparator" colspan="3"><hr/></td></tr>
-  #set($nextk = $k + 1)
-
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_find_$k">
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.Add'))" onClick='Javascript:s${SeqNum}_FindAdd("$nextk")' alt="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.AddNewMatch'))"/>
-                <input type="hidden" name="s${SeqNum}_findcount" value="$k"/>
-                <input type="hidden" name="s${SeqNum}_findop" value=""/>
-              </a>
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <select name="s${SeqNum}_findname">
-              <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SelectMetadataName'))</option>
-  #foreach($name in $SEARCHABLEATTRIBUTES)
-              <option value="$Encoder.attributeEscape($name)">$Encoder.bodyEscape($name)</option>
-  #end
-            </select>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="32" name="s${SeqNum}_findvalue" value=""/></nobr>
-          </td>
-        </tr>
-
-      </table>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #foreach($name in $FOLDERS)
-<input type="hidden" name="s${SeqNum}_folders" value="$Encoder.attributeEscape($name)"/>
-  #end
-
-  #set($k = 0)
-  #foreach($match in $MATCHES)
-
-<input type="hidden" name="s${SeqNum}_findname_$k" value="$Encoder.attributeEscape($match.get('name'))"/>
-<input type="hidden" name="s${SeqNum}_findvalue_$k" value="$Encoder.attributeEscape($match.get('value'))"/>
-
-    #set($k = $k + 1)
-  #end
-
-<input type="hidden" name="s${SeqNum}_findcount" value="$k"/>
-
-#end
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Specification_Metadata.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Specification_Metadata.html
deleted file mode 100644
index 69481f3..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/email/Specification_Metadata.html
+++ /dev/null
@@ -1,57 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('EmailConnector.Metadata') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.IncludedMetadataColon'))</nobr></td>
-    <td class="value">
-  #foreach($metadataattribute in $METADATAATTRIBUTES)
-    #if($METADATASELECTIONS.contains($metadataattribute))
-      <input type="checkbox" name="s${SeqNum}_metadata" value="$Encoder.attributeEscape($metadataattribute)" checked="true"/>
-    #else
-      <input type="checkbox" name="s${SeqNum}_metadata" value="$Encoder.attributeEscape($metadataattribute)"/>
-    #end
-      <nobr>$Encoder.bodyEscape($metadataattribute)</nobr><br/>
-  #end
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ExtractEmailColon'))</nobr></td>
-    <td class="value">
-    #if($EXTRACTEMAILSELECTION)
-      <input type="checkbox" name="s${SeqNum}_extractemail" value="$Encoder.attributeEscape($EXTRACTEMAILATTRIBUTE)" checked="true"/>
-    #else
-      <input type="checkbox" name="s${SeqNum}_extractemail" value="$Encoder.attributeEscape($EXTRACTEMAILATTRIBUTE)"/>
-    #end
-      <nobr>$Encoder.bodyEscape($EXTRACTEMAILATTRIBUTE)</nobr><br/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #foreach($metadataselection in $METADATASELECTIONS)
-<input type="hidden" name="s${SeqNum}_metadata" value="$Encoder.attributeEscape($metadataselection)"/>
-  #end
-  #if($EXTRACTEMAILSELECTION)
-<input type="hidden" name="s${SeqNum}_extractemail" value="$Encoder.attributeEscape($EXTRACTEMAILSELECTION)"/>
-  #end
-#end
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/ConfigurationHeader.js b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/ConfigurationHeader.js
deleted file mode 100644
index f4db53f..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/ConfigurationHeader.js
+++ /dev/null
@@ -1,84 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.port.value != "" && !isInteger(editconnection.port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PortMustBeIntegerOrBlank'))");
-    editconnection.port.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.server.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.EnterAMailServerHostName'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.Server'))");
-    editconnection.server.focus();
-    return false;
-  }
-  if (editconnection.port.value != "" && !isInteger(editconnection.port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PortMustBeIntegerOrBlank'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.Server'))");
-    editconnection.port.focus();
-    return false;
-  }
-  return true;
-}
-
-function addProperty()
-{
-  postFormSetAnchor("property"); //Repost the form and send the browser to property anchor
-}
-
-function SpecOp(n, opValue, anchorvalue)
-{
-  eval("editconnection."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function FindDelete(n)
-{
-  SpecOp("findop_"+n, "Delete", "find_"+n);
-}
-
-function FindAdd(n)
-{
-  if (editconnection.findname.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.PleaseSelectAConfigurationParameterName'))");
-    editconnection.findname.focus();
-    return;
-  }
-  if (editconnection.findvalue.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ValueCannotBeBlank'))");
-    editconnection.findvalue.focus();
-    return;
-  }
-  SpecOp("findop", "Add", "find_"+n);
-}
-
-//-->
-</script>
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/ConfigurationView.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/ConfigurationView.html
deleted file mode 100644
index bd823f5..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/ConfigurationView.html
+++ /dev/null
@@ -1,76 +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.
--->
-
-<table class="displaytable">
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.HostNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($SERVER)</nobr>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PORT)</nobr>
-    </td>
-  </tr>
-
-  <tr><td  class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.UserNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($USERNAME)</nobr>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>********</nobr>
-    </td>
-  </tr>
-
-  <tr><td  class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ConfigurationPropertiesColon'))</nobr>
-    </td>
-    <td class="value">
-#foreach( $property in $PROPERTIES )
-        <nobr>
-            $Encoder.bodyEscape($property.get('name')) : $Encoder.bodyEscape($property.get('value'))
-        </nobr>
-        <br/>
-#end
-
-    </td>
-  </tr>
-  
-</table>
-
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/Configuration_Server.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/Configuration_Server.html
deleted file mode 100644
index 1d75a3f..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/Configuration_Server.html
+++ /dev/null
@@ -1,158 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('EmailConnector.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.HostNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="server" name="server" type="text" size="32" value="$Encoder.attributeEscape($SERVER)"/>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" id="port" name="port" value="$Encoder.attributeEscape($PORT)"/>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.UserNameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" id="username" name="username" value="$Encoder.attributeEscape($USERNAME)"/>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="password" id="password" name="password" value="$Encoder.attributeEscape($PASSWORD)"/>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ConfigurationPropertiesColon'))</nobr>
-    </td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ServerProperty'))</nobr>
-          </td>
-          <td class="formcolumnheader">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.Value'))</nobr>
-          </td>
-        </tr>
-
-  #set($k = 0)
-  #foreach($property in $PROPERTIES)
-
-    #if(($k % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <input type="hidden" name="findop_$k" value=""/>
-            <input type="hidden" name="findname_$k" value="$Encoder.attributeEscape($property.get('name'))"/>
-            <input type="hidden" name="findvalue_$k" value="$Encoder.attributeEscape($property.get('value'))"/>
-            <a name="find_$k">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.Delete'))" onClick='Javascript:FindDelete("$k")' alt="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.DeletePropertyNumber'))$k"/>
-            </a>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($property.get('name'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($property.get('value'))</nobr>
-          </td>
-        </tr>
-
-    #set($k = $k + 1)
-  #end
-
-  #if($k == 0)
-        <tr class="formrow">
-          <td class="formcolumnmessage" colspan="3">$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.NoServerPropertiesSpecified'))</td>
-        </tr>
-  #end
-
-        <tr class="formrow"><td class="formseparator" colspan="3"><hr/></td></tr>
-
-  #set($nextk = $k + 1)
-
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <nobr>
-              <a name="find_$k">
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.Add'))" onClick='Javascript:FindAdd("$nextk")' alt="$Encoder.attributeEscape($ResourceBundle.getString('EmailConnector.AddNewProperty'))"/>
-                <input type="hidden" name="findcount" value="$k"/>
-                <input type="hidden" name="findop" value=""/>
-              </a>
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="32" name="findname" value=""/></nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="32" name="findvalue" value=""/></nobr>
-          </td>
-        </tr>
-
-
-      </table>
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="username" value="$Encoder.attributeEscape($USERNAME)"/>
-<input type="hidden" name="password" value="$Encoder.attributeEscape($PASSWORD)"/>
-<input type="hidden" name="server" value="$Encoder.attributeEscape($SERVER)"/>
-<input type="hidden" name="port" value="$Encoder.attributeEscape($PORT)"/>
-
-  #set($k = 0)
-  #foreach($property in $PROPERTIES)
-
-<input type="hidden" name="findname_$k" value="$Encoder.attributeEscape($property.get('name'))"/>
-<input type="hidden" name="findvalue_$k" value="$Encoder.attributeEscape($property.get('value'))"/>
-
-    #set($k = $k + 1)
-  #end
-
-<input type="hidden" name="findcount" value="$k"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/SpecificationHeader.js b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/SpecificationHeader.js
deleted file mode 100644
index 33f41b4..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/SpecificationHeader.js
+++ /dev/null
@@ -1,148 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SeqNum}_checkSpecificationForSave()
-{
-  if (s${SeqNum}_checkMessageTabForSave() == false)
-    return false;
-  return true;
-}
-
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function s${SeqNum}_checkMessageTabForSave()
-{
-  if (editjob.s${SeqNum}_finished_subject.value != "" || editjob.s${SeqNum}_finished_body.value != "")
-  {
-    if (editjob.s${SeqNum}_finished_to.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ToFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_finished_to.focus();
-      return false;
-    }
-    if (editjob.s${SeqNum}_finished_from.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.FromFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_finished_from.focus();
-      return false;
-    }
-  }
-
-  if (editjob.s${SeqNum}_erroraborted_subject.value != "" || editjob.s${SeqNum}_erroraborted_body.value != "")
-  {
-    if (editjob.s${SeqNum}_erroraborted_to.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ToFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_erroraborted_to.focus();
-      return false;
-    }
-    if (editjob.s${SeqNum}_erroraborted_from.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.FromFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_erroraborted_from.focus();
-      return false;
-    }
-  }
-
-  if (editjob.s${SeqNum}_manualaborted_subject.value != "" || editjob.s${SeqNum}_manualaborted_body.value != "")
-  {
-    if (editjob.s${SeqNum}_manualaborted_to.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ToFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_manualaborted_to.focus();
-      return false;
-    }
-    if (editjob.s${SeqNum}_manualaborted_from.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.FromFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_manualaborted_from.focus();
-      return false;
-    }
-  }
-  
-  if (editjob.s${SeqNum}_manualpaused_subject.value != "" || editjob.s${SeqNum}_manualpaused_body.value != "")
-  {
-    if (editjob.s${SeqNum}_manualpaused_to.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ToFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_manualpaused_to.focus();
-      return false;
-    }
-    if (editjob.s${SeqNum}_manualpaused_from.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.FromFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_manualpaused_from.focus();
-      return false;
-    }
-  }
-
-  if (editjob.s${SeqNum}_schedulepaused_subject.value != "" || editjob.s${SeqNum}_schedulepaused_body.value != "")
-  {
-    if (editjob.s${SeqNum}_schedulepaused_to.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ToFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_schedulepaused_to.focus();
-      return false;
-    }
-    if (editjob.s${SeqNum}_schedulepaused_from.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.FromFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_schedulepaused_from.focus();
-      return false;
-    }
-  }
-
-  if (editjob.s${SeqNum}_restarted_subject.value != "" || editjob.s${SeqNum}_restarted_body.value != "")
-  {
-    if (editjob.s${SeqNum}_restarted_to.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.ToFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_restarted_to.focus();
-      return false;
-    }
-    if (editjob.s${SeqNum}_restarted_from.value == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('EmailConnector.FromFieldCannotBeBlank'))");
-      SelectSequencedTab("$Encoder.attributeJavascriptEscape($ResourceBundle.getString('EmailConnector.Message'))",${SeqNum})
-      editjob.s${SeqNum}_restarted_from.focus();
-      return false;
-    }
-  }
-
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/SpecificationView.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/SpecificationView.html
deleted file mode 100644
index 26f5264..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/SpecificationView.html
+++ /dev/null
@@ -1,176 +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.
--->
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobFinished'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($finished_TO)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($finished_FROM)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($finished_SUBJECT)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($finished_BODY)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopErrorAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($erroraborted_TO)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($erroraborted_FROM)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($erroraborted_SUBJECT)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($erroraborted_BODY)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopManualAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualaborted_TO)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualaborted_FROM)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualaborted_SUBJECT)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualaborted_BODY)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopManualPause'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualpaused_TO)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualpaused_FROM)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualpaused_SUBJECT)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualpaused_BODY)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopSchedulePause'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($schedulepaused_TO)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($schedulepaused_FROM)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($schedulepaused_SUBJECT)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($schedulepaused_BODY)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopRestart'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($restarted_TO)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($restarted_FROM)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($restarted_SUBJECT)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($restarted_BODY)
-    </td>
-  </tr>
-
-</table>
diff --git a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/Specification_Message.html b/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/Specification_Message.html
deleted file mode 100644
index 52846db..0000000
--- a/connectors/email/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/email/Specification_Message.html
+++ /dev/null
@@ -1,260 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('EmailConnector.Message') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobFinished'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_finished_to" size="32" value="$Encoder.attributeEscape($finished_TO)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_finished_from" size="32" value="$Encoder.attributeEscape($finished_FROM)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_finished_subject" size="50" value="$Encoder.attributeEscape($finished_SUBJECT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_finished_body" rows="10" cols="50">$Encoder.bodyEscape($finished_BODY)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopErrorAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_erroraborted_to" size="32" value="$Encoder.attributeEscape($erroraborted_TO)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_erroraborted_from" size="32" value="$Encoder.attributeEscape($erroraborted_FROM)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_erroraborted_subject" size="50" value="$Encoder.attributeEscape($erroraborted_SUBJECT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_erroraborted_body" rows="10" cols="50">$Encoder.bodyEscape($erroraborted_BODY)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopManualAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualaborted_to" size="32" value="$Encoder.attributeEscape($manualaborted_TO)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualaborted_from" size="32" value="$Encoder.attributeEscape($manualaborted_FROM)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualaborted_subject" size="50" value="$Encoder.attributeEscape($manualaborted_SUBJECT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_manualaborted_body" rows="10" cols="50">$Encoder.bodyEscape($manualaborted_BODY)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopManualPause'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualpaused_to" size="32" value="$Encoder.attributeEscape($manualpaused_TO)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualpaused_from" size="32" value="$Encoder.attributeEscape($manualpaused_FROM)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualpaused_subject" size="50" value="$Encoder.attributeEscape($manualpaused_SUBJECT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_manualpaused_body" rows="10" cols="50">$Encoder.bodyEscape($manualpaused_BODY)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopSchedulePause'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_schedulepaused_to" size="32" value="$Encoder.attributeEscape($schedulepaused_TO)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_schedulepaused_from" size="32" value="$Encoder.attributeEscape($schedulepaused_FROM)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_schedulepaused_subject" size="50" value="$Encoder.attributeEscape($schedulepaused_SUBJECT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_schedulepaused_body" rows="10" cols="50">$Encoder.bodyEscape($schedulepaused_BODY)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.JobStopRestart'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.ToColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_restarted_to" size="32" value="$Encoder.attributeEscape($restarted_TO)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.FromColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_restarted_from" size="32" value="$Encoder.attributeEscape($restarted_FROM)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.SubjectColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_restarted_subject" size="50" value="$Encoder.attributeEscape($restarted_SUBJECT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('EmailConnector.BodyColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_restarted_body" rows="10" cols="50">$Encoder.bodyEscape($restarted_BODY)</textarea>
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="s${SeqNum}_finished_to" value="$Encoder.attributeEscape($finished_TO)"/>
-<input type="hidden" name="s${SeqNum}_finished_from" value="$Encoder.attributeEscape($finished_FROM)"/>
-<input type="hidden" name="s${SeqNum}_finished_subject" value="$Encoder.attributeEscape($finished_SUBJECT)"/>
-<input type="hidden" name="s${SeqNum}_finished_body" value="$Encoder.attributeEscape($finished_BODY)"/>
-
-<input type="hidden" name="s${SeqNum}_erroraborted_to" value="$Encoder.attributeEscape($erroraborted_TO)"/>
-<input type="hidden" name="s${SeqNum}_erroraborted_from" value="$Encoder.attributeEscape($erroraborted_FROM)"/>
-<input type="hidden" name="s${SeqNum}_erroraborted_subject" value="$Encoder.attributeEscape($erroraborted_SUBJECT)"/>
-<input type="hidden" name="s${SeqNum}_erroraborted_body" value="$Encoder.attributeEscape($erroraborted_BODY)"/>
-
-<input type="hidden" name="s${SeqNum}_manualaborted_to" value="$Encoder.attributeEscape($manualaborted_TO)"/>
-<input type="hidden" name="s${SeqNum}_manualaborted_from" value="$Encoder.attributeEscape($manualaborted_FROM)"/>
-<input type="hidden" name="s${SeqNum}_manualaborted_subject" value="$Encoder.attributeEscape($manualaborted_SUBJECT)"/>
-<input type="hidden" name="s${SeqNum}_manualaborted_body" value="$Encoder.attributeEscape($manualaborted_BODY)"/>
-
-<input type="hidden" name="s${SeqNum}_manualpaused_to" value="$Encoder.attributeEscape($manualpaused_TO)"/>
-<input type="hidden" name="s${SeqNum}_manualpaused_from" value="$Encoder.attributeEscape($manualpaused_FROM)"/>
-<input type="hidden" name="s${SeqNum}_manualpaused_subject" value="$Encoder.attributeEscape($manualpaused_SUBJECT)"/>
-<input type="hidden" name="s${SeqNum}_manualpaused_body" value="$Encoder.attributeEscape($manualpaused_BODY)"/>
-
-<input type="hidden" name="s${SeqNum}_schedulepaused_to" value="$Encoder.attributeEscape($schedulepaused_TO)"/>
-<input type="hidden" name="s${SeqNum}_schedulepaused_from" value="$Encoder.attributeEscape($schedulepaused_FROM)"/>
-<input type="hidden" name="s${SeqNum}_schedulepaused_subject" value="$Encoder.attributeEscape($schedulepaused_SUBJECT)"/>
-<input type="hidden" name="s${SeqNum}_schedulepaused_body" value="$Encoder.attributeEscape($schedulepaused_BODY)"/>
-
-<input type="hidden" name="s${SeqNum}_restarted_to" value="$Encoder.attributeEscape($restarted_TO)"/>
-<input type="hidden" name="s${SeqNum}_restarted_from" value="$Encoder.attributeEscape($restarted_FROM)"/>
-<input type="hidden" name="s${SeqNum}_restarted_subject" value="$Encoder.attributeEscape($restarted_SUBJECT)"/>
-<input type="hidden" name="s${SeqNum}_restarted_body" value="$Encoder.attributeEscape($restarted_BODY)"/>
-
-#end
diff --git a/connectors/email/pom.xml b/connectors/email/pom.xml
deleted file mode 100644
index 0ba69c0..0000000
--- a/connectors/email/pom.xml
+++ /dev/null
@@ -1,366 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-email-connector</artifactId>
-  <name>ManifoldCF - Connectors - Email</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-      
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>mail</artifactId>
-      <version>1.4</version>
-    </dependency> 
-
-  </dependencies>
-</project>
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/ClassDefinition.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/ClassDefinition.java
deleted file mode 100644
index 0e50975..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/ClassDefinition.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.admin;
-
-import com.filenet.api.collection.ClassDefinitionSet;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ClassDefinition
-{
-  public String get_SymbolicName();
-  public String get_DisplayName();
-  public ClassDefinitionSet get_ImmediateSubclassDefinitions();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/DocumentClassDefinition.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/DocumentClassDefinition.java
deleted file mode 100644
index e7d2344..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/DocumentClassDefinition.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.admin;
-
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface DocumentClassDefinition extends VersionableClassDefinition
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/SubscribableClassDefinition.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/SubscribableClassDefinition.java
deleted file mode 100644
index 2acdc8e..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/SubscribableClassDefinition.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.admin;
-
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface SubscribableClassDefinition extends ClassDefinition
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/VersionableClassDefinition.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/VersionableClassDefinition.java
deleted file mode 100644
index 2e47044..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/admin/VersionableClassDefinition.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.admin;
-
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface VersionableClassDefinition extends SubscribableClassDefinition
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/AccessPermissionList.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/AccessPermissionList.java
deleted file mode 100644
index 27820dc..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/AccessPermissionList.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface AccessPermissionList extends DependentObjectList
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ClassDefinitionSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ClassDefinitionSet.java
deleted file mode 100644
index aa56e30..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ClassDefinitionSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ClassDefinitionSet extends IndependentObjectSet
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ContainableSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ContainableSet.java
deleted file mode 100644
index 2e31f98..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ContainableSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ContainableSet
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ContentElementList.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ContentElementList.java
deleted file mode 100644
index 2f2dbd9..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/ContentElementList.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ContentElementList extends DependentObjectList
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/DependentObjectList.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/DependentObjectList.java
deleted file mode 100644
index 09c72c5..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/DependentObjectList.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface DependentObjectList extends EngineCollection, java.util.List
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/EngineCollection.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/EngineCollection.java
deleted file mode 100644
index 82e2dac..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/EngineCollection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-import java.util.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface EngineCollection
-{
-  public Iterator iterator();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/EngineSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/EngineSet.java
deleted file mode 100644
index 3bb0c90..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/EngineSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface EngineSet extends EngineCollection
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/FolderSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/FolderSet.java
deleted file mode 100644
index cd62da3..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/FolderSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface FolderSet extends ContainableSet, SubscribableSet, IndependentObjectSet
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/IndependentObjectSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/IndependentObjectSet.java
deleted file mode 100644
index 3b559d7..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/IndependentObjectSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IndependentObjectSet extends EngineSet
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/PropertyDescriptionList.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/PropertyDescriptionList.java
deleted file mode 100644
index 60d71e2..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/PropertyDescriptionList.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id: AccessPermissionList.java 1342799 2012-05-25 20:25:51Z kwright $ */

-

-/**

-* 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 com.filenet.api.collection;

-

-/** Stub interface to allow the connector to build fully.

-*/

-public interface PropertyDescriptionList extends DependentObjectList, EngineCollection

-{

-}

diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/RepositoryRowSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/RepositoryRowSet.java
deleted file mode 100644
index 7207fcf..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/RepositoryRowSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface RepositoryRowSet extends EngineSet
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/SubscribableSet.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/SubscribableSet.java
deleted file mode 100644
index b0d6a73..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/collection/SubscribableSet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.collection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface SubscribableSet
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/AccessLevel.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/AccessLevel.java
deleted file mode 100644
index 4a50812..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/AccessLevel.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.constants;
-
-/** Stub class to allow the connector to build fully.
-*/
-public class AccessLevel implements java.io.Serializable
-{
-  public static final int VIEW_AS_INT = 131201;
-
-  public int getValue() { return 0; }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/AccessType.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/AccessType.java
deleted file mode 100644
index 1687d7a..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/AccessType.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.constants;
-
-/** Stub class to allow the connector to build fully.
-*/
-public class AccessType implements java.io.Serializable
-{
-  public static final int ALLOW_AS_INT = 1;
-  public static final int DENY_AS_INT = 2;
-  
-  public int getValue()
-  {
-    return 0;
-  }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/FilteredPropertyType.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/FilteredPropertyType.java
deleted file mode 100644
index b757cfb..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/FilteredPropertyType.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.constants;
-
-/** Stub class to allow the connector to build fully.
-*/
-public class FilteredPropertyType implements java.io.Serializable
-{
-  public static final FilteredPropertyType ANY = new FilteredPropertyType();
-
-  public int getValue() { return 0; }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/SecurityPrincipalType.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/SecurityPrincipalType.java
deleted file mode 100644
index 8cdb12a..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/constants/SecurityPrincipalType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.constants;
-
-/** Stub class to allow the connector to build fully.
-*/
-public class SecurityPrincipalType implements java.io.Serializable
-{
-  public static final int USER_AS_INT = 2000;
-  
-  public int getValue()
-  {
-    return 0;
-  }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Connection.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Connection.java
deleted file mode 100644
index 04a7759..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Connection.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Connection extends java.io.Serializable
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Containable.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Containable.java
deleted file mode 100644
index 7ad332a..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Containable.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Containable
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ContentElement.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ContentElement.java
deleted file mode 100644
index dbbb7a3..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ContentElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ContentElement extends RepositoryObject, EngineObject, DependentObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ContentTransfer.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ContentTransfer.java
deleted file mode 100644
index 971d673..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ContentTransfer.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-import java.io.InputStream;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ContentTransfer extends RepositoryObject, ContentElement, DependentObject
-{
-  public InputStream accessContentStream();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/DependentObject.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/DependentObject.java
deleted file mode 100644
index 984338e..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/DependentObject.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface DependentObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Document.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Document.java
deleted file mode 100644
index dc39bad..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Document.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-import com.filenet.api.collection.ContentElementList;
-import com.filenet.api.collection.AccessPermissionList;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Document extends Versionable, Containable, Subscribable, RepositoryObject, IndependentlyPersistableObject
-{
-  public ContentElementList get_ContentElements();
-  public AccessPermissionList get_Permissions();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Domain.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Domain.java
deleted file mode 100644
index 7bedf86..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Domain.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Domain extends InstantiatingScope, IndependentlyPersistableObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/EngineObject.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/EngineObject.java
deleted file mode 100644
index 1ee3302..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/EngineObject.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-import com.filenet.api.property.Properties;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface EngineObject extends java.io.Serializable
-{
-  public String getClassName();
-  public Properties getProperties();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Factory.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Factory.java
deleted file mode 100644
index 47cd862..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Factory.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-import com.filenet.api.exception.*;
-import com.filenet.api.property.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class Factory
-{
-  public static class Connection
-  {
-    public static com.filenet.api.core.Connection getConnection(String uri)
-      throws EngineRuntimeException
-    {
-      return null;
-    }
-  }
-  
-  public static class Domain
-  {
-    public static com.filenet.api.core.Domain fetchInstance(com.filenet.api.core.Connection conn, String domain, PropertyFilter filter)
-      throws EngineRuntimeException
-    {
-      return null;
-    }
-  }
-  
-  public static class ObjectStore
-  {
-    public static com.filenet.api.core.ObjectStore fetchInstance(com.filenet.api.core.Domain domain, String name, PropertyFilter filter)
-    {
-      return null;
-    }
-  }
-  
-  public static class ClassDefinition
-  {
-    public static com.filenet.api.admin.ClassDefinition fetchInstance(com.filenet.api.core.ObjectStore os, String rootClass, PropertyFilter filter)
-    {
-      return null;
-    }
-  }
-  
-  public static class Document
-  {
-    public static com.filenet.api.core.Document fetchInstance(com.filenet.api.core.ObjectStore os, String docId, PropertyFilter filter)
-    {
-      return null;
-    }
-  }
-  
-  public static class User
-  {
-    public static com.filenet.api.security.User fetchInstance(com.filenet.api.core.Connection conn, String gname, PropertyFilter filter)
-    {
-      return null;
-    }
-  }
-
-  public static class Group
-  {
-    public static com.filenet.api.security.Group fetchInstance(com.filenet.api.core.Connection conn, String gname, PropertyFilter filter)
-    {
-      return null;
-    }
-  }
-  
-  public static class ClassDescription
-  {
-    public static com.filenet.api.meta.ClassDescription fetchInstance(com.filenet.api.core.Scope scope, String className, PropertyFilter filter)
-    {
-      return null;
-    }
-  }
-  
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Folder.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Folder.java
deleted file mode 100644
index 9db2947..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Folder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-import com.filenet.api.collection.FolderSet;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Folder extends IndependentlyPersistableObject, Versionable, Containable, Subscribable
-{
-  public FolderSet get_SubFolders();
-  public String get_FolderName();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/IndependentObject.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/IndependentObject.java
deleted file mode 100644
index 91cd675..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/IndependentObject.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IndependentObject extends EngineObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/IndependentlyPersistableObject.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/IndependentlyPersistableObject.java
deleted file mode 100644
index be57cbf..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/IndependentlyPersistableObject.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface IndependentlyPersistableObject extends IndependentObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/InstantiatingScope.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/InstantiatingScope.java
deleted file mode 100644
index 152d80b..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/InstantiatingScope.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id: Folder.java 1342461 2012-05-24 22:02:53Z kwright $ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface InstantiatingScope extends Scope
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ObjectStore.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ObjectStore.java
deleted file mode 100644
index 21ea813..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/ObjectStore.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ObjectStore extends InstantiatingScope, IndependentlyPersistableObject
-{
-  public Folder get_RootFolder();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/RepositoryObject.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/RepositoryObject.java
deleted file mode 100644
index 7a59212..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/RepositoryObject.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface RepositoryObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Scope.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Scope.java
deleted file mode 100644
index 0e0efb3..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Scope.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Scope
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Subscribable.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Subscribable.java
deleted file mode 100644
index 237b442..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Subscribable.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Subscribable
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Versionable.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Versionable.java
deleted file mode 100644
index b4e14b9..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/core/Versionable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id: Document.java 1342799 2012-05-25 20:25:51Z kwright $ */
-
-/**
-* 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 com.filenet.api.core;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Versionable
-{
-  public Boolean get_IsCurrentVersion();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/exception/EngineRuntimeException.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/exception/EngineRuntimeException.java
deleted file mode 100644
index 345b1e7..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/exception/EngineRuntimeException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.exception;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class EngineRuntimeException extends RuntimeException implements java.io.Externalizable
-{
-  public ExceptionCode getExceptionCode()
-  {
-    return null;
-  }
-  
-  public void writeExternal(java.io.ObjectOutput out)
-    throws java.io.IOException
-  {
-  }
-  
-  public void readExternal(java.io.ObjectInput in)
-    throws java.io.IOException, ClassNotFoundException
-  {
-  }
-  
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/exception/ExceptionCode.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/exception/ExceptionCode.java
deleted file mode 100644
index ad57c72..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/exception/ExceptionCode.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.exception;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public enum ExceptionCode //???
-{
-  TRANSPORT_WSI_NETWORK_ERROR,
-  SECURITY_WSI_NO_LOGIN_MODULES_SUCCEEDED,
-  API_INVALID_URI,
-  E_OBJECT_NOT_FOUND,
-  E_ACCESS_DENIED,
-  API_NO_CONTENT_ELEMENTS
-  
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/ClassDescription.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/ClassDescription.java
deleted file mode 100644
index 37ba003..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/ClassDescription.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.meta;
-
-import com.filenet.api.collection.PropertyDescriptionList;
-import com.filenet.api.core.IndependentObject;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface ClassDescription extends Metadata, IndependentObject
-{
-  public PropertyDescriptionList get_PropertyDescriptions();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/Metadata.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/Metadata.java
deleted file mode 100644
index 64e6810..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/Metadata.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.meta;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Metadata
-{
-  public String get_DisplayName();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/PropertyDescription.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/PropertyDescription.java
deleted file mode 100644
index 1218443..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/meta/PropertyDescription.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.meta;
-
-import com.filenet.api.core.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface PropertyDescription extends Metadata, EngineObject, DependentObject
-{
-  public String get_SymbolicName();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/Properties.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/Properties.java
deleted file mode 100644
index 8c10573..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/Properties.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.property;
-
-import java.util.*;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Properties extends java.io.Serializable
-{
-  public Iterator<Property> iterator();
-  public Object getObjectValue(String propName);
-  public Property get(String propName);
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/Property.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/Property.java
deleted file mode 100644
index 1994d1b..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/Property.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.property;
-
-import com.filenet.api.util.Id;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Property extends java.io.Serializable
-{
-  public Object getObjectValue();
-  public String getPropertyName();
-  public Id getIdValue();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/PropertyFilter.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/PropertyFilter.java
deleted file mode 100644
index 372241a..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/property/PropertyFilter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.property;
-
-import com.filenet.api.constants.FilteredPropertyType;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class PropertyFilter
-{
-  public PropertyFilter()
-  {
-  }
-  
-  public void addIncludeType(int something, Long somethingElse, Boolean somethingBoolean, FilteredPropertyType fpt, Integer somethingInt)
-  {
-  }
-  
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/RepositoryRow.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/RepositoryRow.java
deleted file mode 100644
index 260e9c2..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/RepositoryRow.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.query;
-
-import com.filenet.api.property.Properties;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface RepositoryRow extends java.io.Serializable
-{
-  public Properties getProperties();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/SearchSQL.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/SearchSQL.java
deleted file mode 100644
index be54b8d..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/SearchSQL.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.query;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class SearchSQL
-{
-  public SearchSQL()
-  {
-  }
-  
-  public void setQueryString(String query)
-  {
-  }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/SearchScope.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/SearchScope.java
deleted file mode 100644
index bfdd10d..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/query/SearchScope.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.query;
-
-import com.filenet.api.core.ObjectStore;
-import com.filenet.api.collection.RepositoryRowSet;
-import com.filenet.api.property.PropertyFilter;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class SearchScope
-{
-  public SearchScope(ObjectStore os)
-  {
-  }
-  
-  public RepositoryRowSet fetchRows(SearchSQL sql, Integer something,
-    PropertyFilter filter, Boolean somethingelse)
-  {
-    return null;
-  }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/AccessPermission.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/AccessPermission.java
deleted file mode 100644
index a96d6da..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/AccessPermission.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.security;
-
-import com.filenet.api.core.DependentObject;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface AccessPermission extends DiscretionaryPermission, DependentObject
-{
-  public Integer get_AccessMask();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/DiscretionaryPermission.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/DiscretionaryPermission.java
deleted file mode 100644
index 82fe07a..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/DiscretionaryPermission.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.security;
-
-import com.filenet.api.constants.AccessType;
-import com.filenet.api.core.DependentObject;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface DiscretionaryPermission extends Permission, DependentObject
-{
-  public AccessType get_AccessType();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/Group.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/Group.java
deleted file mode 100644
index af04d23..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/Group.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.security;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Group extends SecurityPrincipal
-{
-  public String get_Id();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/Permission.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/Permission.java
deleted file mode 100644
index 7ba8840..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/Permission.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.security;
-
-import com.filenet.api.core.*;
-import com.filenet.api.constants.SecurityPrincipalType;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface Permission extends EngineObject, DependentObject
-{
-  public String get_GranteeName();
-  public SecurityPrincipalType get_GranteeType();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/SecurityPrincipal.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/SecurityPrincipal.java
deleted file mode 100644
index e0010a2..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/SecurityPrincipal.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.security;
-
-import com.filenet.api.core.IndependentObject;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface SecurityPrincipal extends IndependentObject
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/User.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/User.java
deleted file mode 100644
index 22b4009..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/security/User.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.security;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public interface User extends SecurityPrincipal
-{
-  public String get_Id();
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/ConfigurationParameters.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/ConfigurationParameters.java
deleted file mode 100644
index 399609b..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/ConfigurationParameters.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.util;
-
-/** Stub class to allow the connector to build fully.
-*/
-public class ConfigurationParameters implements java.io.Serializable
-{
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/Id.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/Id.java
deleted file mode 100644
index e6312ee..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/Id.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.util;
-
-/** Stub class to allow the connector to build fully.
-*/
-public class Id implements java.io.Serializable, Comparable
-{
-  public int compareTo(Object o) { return 0; }
-}
diff --git a/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/UserContext.java b/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/UserContext.java
deleted file mode 100644
index 8d64ce4..0000000
--- a/connectors/filenet/build-stub/src/main/java/com/filenet/api/util/UserContext.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.filenet.api.util;
-
-import com.filenet.api.core.Connection;
-
-/** Stub interface to allow the connector to build fully.
-*/
-public class UserContext
-{
-  public static UserContext get()
-  {
-    return null;
-  }
-  
-  public static javax.security.auth.Subject createSubject(Connection conn, String userID, String password, String module)
-  {
-    return null;
-  }
-  
-  public void pushSubject(javax.security.auth.Subject subject)
-  {
-  }
-  
-}
diff --git a/connectors/filenet/build.xml b/connectors/filenet/build.xml
deleted file mode 100644
index 2e562dc..0000000
--- a/connectors/filenet/build.xml
+++ /dev/null
@@ -1,72 +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.
--->
-
-<project name="filenet" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="has-proprietary-materials-check">
-        <available file="lib-proprietary/Jace.jar" property="JaceStatus"/>
-        <condition property="proprietaryMaterialsAvailable">
-            <isset property="JaceStatus"/>
-        </condition>
-    </target>
-
-    <path id="implementation-classpath">
-        <path refid="mcf-connector-build.implementation-classpath"/>
-        <fileset dir="lib-proprietary"> 
-            <include name="*.jar"/> 
-        </fileset> 
-    </path>
-
-    <target name="rmic-build-all" depends="compile-implementation,compile-interface,setup-rmic,has-RMI-check" if="hasRMI">
-        <!-- The ant version I have doesn't seem to handle class specifications based on file names, so this is the best I could come up with -->
-        <antcall target="rmic-build">
-            <param name="classname" value="org.apache.manifoldcf.crawler.common.filenet.FilenetFactoryImpl"/>
-        </antcall>
-        <antcall target="rmic-build">
-            <param name="classname" value="org.apache.manifoldcf.crawler.common.filenet.FilenetImpl"/>
-        </antcall>
-    </target>
-    
-    <target name="server-process" depends="mcf-connector-build.server-process,has-RMI-check" if="hasRMI">
-        <mkdir dir="dist/server-process/lib-proprietary"/>
-        <copy todir="dist/server-process/lib-proprietary">
-            <fileset dir="lib-proprietary" includes="*.jar"/>
-        </copy>
-        <copy todir="dist/server-process/lib-proprietary" file="server/README.txt"/>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="FileNet"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/DocClassSpec.java b/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/DocClassSpec.java
deleted file mode 100644
index e1c8823..0000000
--- a/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/DocClassSpec.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/* $Id: DocClassSpec.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filenet;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-public class DocClassSpec
-{
-  public static final String _rcsid = "@(#)$Id: DocClassSpec.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Each doc class has a set of metadata fields that should be ingested with it, as well as a set of matches that
-  // describe WHICH documents to select.
-  protected boolean allMetadata = false;
-  protected HashMap metadataFields = new HashMap();
-  protected ArrayList matchItems = new ArrayList();
-
-  public DocClassSpec()
-  {
-  }
-
-  public DocClassSpec(SpecificationNode sn)
-  {
-    // Now, scan for metadata etc.
-    String allmetadata = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_ATTRIBUTE_ALLMETADATA);
-    if (allmetadata == null || allmetadata.length() == 0)
-      allmetadata = "false";
-    int j;
-    if (allmetadata.equals("false"))
-    {
-      j = 0;
-      while (j < sn.getChildCount())
-      {
-        SpecificationNode node = sn.getChild(j++);
-        if (node.getType().equals(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_NODE_METADATAFIELD))
-        {
-          String fieldName = node.getAttributeValue(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_ATTRIBUTE_VALUE);
-          metadataFields.put(fieldName,fieldName);
-        }
-      }
-    }
-    else
-      allMetadata = true;
-
-    j = 0;
-    while (j < sn.getChildCount())
-    {
-      SpecificationNode node = sn.getChild(j++);
-      if (node.getType().equals(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_NODE_MATCH))
-      {
-        String matchTypeString = node.getAttributeValue(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_ATTRIBUTE_MATCHTYPE);
-        String matchField = node.getAttributeValue(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_ATTRIBUTE_FIELDNAME);
-        String matchValue = node.getAttributeValue(org.apache.manifoldcf.crawler.connectors.filenet.FilenetConnector.SPEC_ATTRIBUTE_VALUE);
-        appendMatch(matchTypeString,matchField,matchValue);
-      }
-    }
-
-  }
-
-  /** Set metadata to "all metadata" */
-  public void setAllMetadata(boolean value)
-  {
-    this.allMetadata = value;
-  }
-
-  /** Add a metadata field to include */
-  public void setMetadataField(String fieldName)
-  {
-    metadataFields.put(fieldName, fieldName);
-    this.allMetadata = false;
-  }
-
-  /** Add a match */
-  public int appendMatch(String matchType, String matchField, String matchValue)
-  {
-    int rval = matchItems.size();
-    matchItems.add(new MatchItem(matchType, matchField, matchValue));
-    return rval;
-  }
-
-  /** Get 'all metadata' flag */
-  public boolean getAllMetadata()
-  {
-    return allMetadata;
-  }
-
-  /** Get the list of metadata fields */
-  public String[] getMetadataFields()
-  {
-    String[] rval = new String[metadataFields.size()];
-    Iterator iter = metadataFields.keySet().iterator();
-    int i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  /** Check if a metadata field is included */
-  public boolean checkMetadataIncluded(String fieldName)
-  {
-    if (allMetadata)
-      return true;
-    return (metadataFields.get(fieldName) != null);
-  }
-
-  /** Get the number of matches */
-  public int getMatchCount()
-  {
-    return matchItems.size();
-  }
-
-  /** For a given match, get its type */
-  public String getMatchType(int matchIndex)
-  {
-    MatchItem mi = (MatchItem)matchItems.get(matchIndex);
-    return mi.getMatchType();
-  }
-
-  /** For a given match, get its field name */
-  public String getMatchField(int matchIndex)
-  {
-    MatchItem mi = (MatchItem)matchItems.get(matchIndex);
-    return mi.getMatchField();
-  }
-
-  /** For a given match, get its match value */
-  public String getMatchValue(int matchIndex)
-  {
-    MatchItem mi = (MatchItem)matchItems.get(matchIndex);
-    return mi.getMatchValue();
-  }
-
-  protected static class MatchItem
-  {
-    String matchType;
-    String matchField;
-    String matchValue;
-
-    public MatchItem(String matchType, String matchField, String matchValue)
-    {
-      this.matchType = matchType;
-      this.matchField = matchField;
-      this.matchValue = matchValue;
-    }
-
-    public String getMatchType()
-    {
-      return matchType;
-    }
-
-    public String getMatchField()
-    {
-      return matchField;
-    }
-
-    public String getMatchValue()
-    {
-      return matchValue;
-    }
-  }
-}
diff --git a/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java b/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
deleted file mode 100644
index 8aa676f..0000000
--- a/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
+++ /dev/null
@@ -1,3962 +0,0 @@
-/* $Id: FilenetConnector.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filenet;
-
-import org.apache.log4j.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.crawler.common.filenet.*;
-import java.rmi.*;
-import java.text.SimpleDateFormat;
-
-
-public class FilenetConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: FilenetConnector.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Parameters
-  public static final String CONFIG_PARAM_USERID = "User ID";
-  public static final String CONFIG_PARAM_PASSWORD = "Password";
-  public static final String CONFIG_PARAM_FILENETDOMAIN_OLD = "Filenet domain";
-  public static final String CONFIG_PARAM_FILENETDOMAIN = "FileNet domain";
-  public static final String CONFIG_PARAM_OBJECTSTORE = "Object store";
-  public static final String CONFIG_PARAM_SERVERPROTOCOL = "Server protocol";
-  public static final String CONFIG_PARAM_SERVERHOSTNAME = "Server hostname";
-  public static final String CONFIG_PARAM_SERVERPORT = "Server port";
-  public static final String CONFIG_PARAM_SERVERWSILOCATION = "Server WebServices location";
-  public static final String CONFIG_PARAM_URLPROTOCOL = "Document URL protocol";
-  public static final String CONFIG_PARAM_URLHOSTNAME = "Document URL hostname";
-  public static final String CONFIG_PARAM_URLPORT = "Document URL port";
-  public static final String CONFIG_PARAM_URLLOCATION = "Document URL location";
-
-  // Specification nodes
-  public static final String SPEC_NODE_FOLDER = "folder";
-  public static final String SPEC_NODE_MIMETYPE = "mimetype";
-  public static final String SPEC_NODE_DOCUMENTCLASS = "documentclass";
-  // This specification node is only ever a child of SPEC_NODE_DOCUMENTCLASS
-  public static final String SPEC_NODE_METADATAFIELD = "metafield";
-  // This specification node is only ever a child of SPEC_NODE_DOCUMENTCLASS
-  public static final String SPEC_NODE_MATCH = "match";
-
-  // Specification attributes
-  public static final String SPEC_ATTRIBUTE_VALUE = "value";
-  public static final String SPEC_ATTRIBUTE_ALLMETADATA = "allmetadata";
-  public static final String SPEC_ATTRIBUTE_MATCHTYPE = "matchtype";
-  public static final String SPEC_ATTRIBUTE_FIELDNAME = "fieldname";
-
-  // Activities
-  public static final String ACTIVITY_FETCH = "fetch";
-
-  protected static final long timeToRelease = 300000L;
-
-  /** Filenet session handle. */
-  protected IFilenet session = null;
-  /** Time last session was created */
-  protected long lastSessionFetch = -1L;
-  /** Username */
-  protected String userID = null;
-  /** Password */
-  protected String password = null;
-  /** Filenet domain */
-  protected String filenetDomain = null;
-  /** Object store */
-  protected String objectStore = null;
-  /** Server protocol */
-  protected String serverProtocol = null;
-  /** Server host name */
-  protected String serverHostname = null;
-  /** Server port */
-  protected String serverPort = null;
-  /** Server location */
-  protected String serverLocation = null;
-  /** URI to get us to the webservices integration */
-  protected String serverWSIURI = null;
-  /** Document URI server protocol */
-  protected String docUrlServerProtocol = null;
-  /** Document URI server name */
-  protected String docUrlServerName = null;
-  /** Document URI port */
-  protected String docUrlPort = null;
-  /** Document URI location */
-  protected String docUrlLocation = null;
-  /** Document URI protocol, server, port, and location */
-  protected String docURIPrefix = null;
-
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;
-
-  protected class GetSessionThread extends Thread
-  {
-    protected IFilenet rval = null;
-    protected Throwable exception = null;
-
-    public GetSessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Create a session
-        IFilenetFactory df = (IFilenetFactory)Naming.lookup("rmi://127.0.0.1:8305/filenet_factory");
-        IFilenet newSession = df.make();
-        newSession.createSession(userID,password,filenetDomain,objectStore,serverWSIURI);
-        session = newSession;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws java.net.MalformedURLException, NotBoundException, RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof java.net.MalformedURLException)
-          throw (java.net.MalformedURLException)thr;
-        else if (thr instanceof NotBoundException)
-          throw (NotBoundException)thr;
-        else if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-  /** Get a DFC session.  This will be done every time it is needed.
-  */
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (session == null)
-    {
-      // Check for parameter validity
-      if (userID == null || userID.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_USERID+" required but not set");
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("FileNet: UserID = '" + userID + "'");
-
-      if (password == null || password.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_PASSWORD+" required but not set");
-
-      Logging.connectors.debug("FileNet: Password exists");
-
-      if (objectStore == null || objectStore.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_OBJECTSTORE+" required but not set");
-
-      if (serverProtocol == null || serverProtocol.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_SERVERPROTOCOL+" required but not set");
-
-      if (serverHostname == null || serverHostname.length() < 1)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_SERVERHOSTNAME+" required but not set");
-
-      if (serverPort != null && serverPort.length() < 1)
-        serverPort = null;
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("FileNet: Server URI is '"+serverWSIURI+"'");
-
-      if (docUrlServerProtocol == null || docUrlServerProtocol.length() == 0)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_URLPROTOCOL+" required but not set");
-
-      if (docUrlServerName == null || docUrlServerName.length() == 0)
-        throw new ManifoldCFException("Parameter "+CONFIG_PARAM_URLHOSTNAME+" required but not set");
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("FileNet: Document base URI is '"+docURIPrefix+"'");
-
-      long currentTime;
-      GetSessionThread t = new GetSessionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.MalformedURLException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      catch (NotBoundException e)
-      {
-        // Transient problem: Server not available at the moment.
-        Logging.connectors.warn("FileNet: RMI server not up at the moment: "+e.getMessage(),e);
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),currentTime + 60000L);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        // Treat this as a transient problem
-        Logging.connectors.warn("FileNet: Transient remote exception creating session: "+e.getMessage(),e);
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),currentTime + 60000L);
-      }
-      catch (FilenetException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.connectors.warn("FileNet: Remote service interruption creating session: "+e.getMessage(),e);
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption(e.getMessage(),e,currentTime + 300000L,currentTime + 12 * 60 * 60000L,-1,true);
-        }
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-    }
-
-    // Note that we need the session at this time; this will determine when
-    // the session expires.
-    lastSessionFetch = System.currentTimeMillis();
-
-  }
-
-  protected class DestroySessionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public DestroySessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.destroySession();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-
-  }
-
-  /** Release the session, if it's time.
-  */
-  protected void releaseCheck()
-    throws ManifoldCFException
-  {
-    if (lastSessionFetch == -1L)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease)
-    {
-      DestroySessionThread t = new DestroySessionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-        session = null;
-        lastSessionFetch = -1L;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn("FileNet: Transient remote exception closing session: "+e.getMessage(),e);
-      }
-      catch (FilenetException e)
-      {
-        session = null;
-        lastSessionFetch = -1L;
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.connectors.warn("FileNet: Remote service interruption closing session: "+e.getMessage(),e);
-        }
-        else
-          Logging.connectors.warn("FileNet: Error closing session: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  /** Constructor.
-  */
-  public FilenetConnector()
-  {
-    super();
-  }
-
-  /** Let the crawler know the completeness of the information we are giving it.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    return MODEL_ADD;
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    return new String[]{serverHostname};
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{ACTIVITY_FETCH};
-  }
-
-  /** Connect to filenet.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    // Grab some values for convenience
-    userID = configParams.getParameter(CONFIG_PARAM_USERID);
-    password = configParams.getObfuscatedParameter(CONFIG_PARAM_PASSWORD);
-    filenetDomain = configParams.getParameter(CONFIG_PARAM_FILENETDOMAIN);
-    if (filenetDomain == null)
-    {
-      filenetDomain = configParams.getParameter(CONFIG_PARAM_FILENETDOMAIN_OLD);
-      if (filenetDomain == null)
-        filenetDomain = "";
-    }
-
-    objectStore = configParams.getParameter(CONFIG_PARAM_OBJECTSTORE);
-    serverProtocol = configParams.getParameter(CONFIG_PARAM_SERVERPROTOCOL);
-    serverHostname = configParams.getParameter(CONFIG_PARAM_SERVERHOSTNAME);
-    serverPort = configParams.getParameter(CONFIG_PARAM_SERVERPORT);
-    if (serverPort != null && serverPort.length() < 1)
-      serverPort = null;
-    serverLocation = configParams.getParameter(CONFIG_PARAM_SERVERWSILOCATION);
-    if (serverLocation != null && serverLocation.length() < 1)
-      serverLocation = null;
-
-    serverWSIURI = ((serverProtocol==null)?"":serverProtocol) + "://" + ((serverHostname==null)?"":serverHostname);
-    if (serverPort != null)
-      serverWSIURI += ":" + serverPort;
-    if (serverLocation != null)
-      serverWSIURI += "/" + serverLocation;
-
-    docUrlServerProtocol = configParams.getParameter(CONFIG_PARAM_URLPROTOCOL);
-    docUrlServerName = configParams.getParameter(CONFIG_PARAM_URLHOSTNAME);
-    docUrlPort = configParams.getParameter(CONFIG_PARAM_URLPORT);
-    if (docUrlPort != null && docUrlPort.length() < 1)
-      docUrlPort = null;
-    docUrlLocation = configParams.getParameter(CONFIG_PARAM_URLLOCATION);
-    if (docUrlLocation != null && docUrlLocation.length() < 1)
-      docUrlLocation = null;
-
-    docURIPrefix = ((docUrlServerProtocol==null)?"":docUrlServerProtocol) + "://" + ((docUrlServerName==null)?"":docUrlServerName);
-    if (docUrlPort != null)
-      docURIPrefix = docURIPrefix + ":" + docUrlPort;
-    if (docUrlLocation != null)
-      docURIPrefix = docURIPrefix + "/" + docUrlLocation;
-    docURIPrefix += "/getContent?objectStoreName=" + ((objectStore==null)?"":objectStore);
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      try
-      {
-        checkConnection();
-        return super.check();
-      }
-      catch (FilenetException e)
-      {
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-          throw new ServiceInterruption(e.getMessage(),0L);
-        else
-          throw new ManifoldCFException(e.getMessage(),e);
-      }
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Connection temporarily failed: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      return "Connection failed: "+e.getMessage();
-    }
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    releaseCheck();
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /** Disconnect from Filenet.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    if (session != null)
-    {
-      DestroySessionThread t = new DestroySessionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-        session = null;
-        lastSessionFetch = -1L;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        session = null;
-        lastSessionFetch = -1L;
-        // Treat this as a transient problem
-        Logging.connectors.warn("FileNet: Transient remote exception closing session: "+e.getMessage(),e);
-      }
-      catch (FilenetException e)
-      {
-        session = null;
-        lastSessionFetch = -1L;
-        // Base our treatment on the kind of error it is.
-        if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-        {
-          Logging.connectors.warn("FileNet: Remote service interruption closing session: "+e.getMessage(),e);
-        }
-        else
-          Logging.connectors.warn("FileNet: Error closing session: "+e.getMessage(),e);
-      }
-
-    }
-
-    userID = null;
-    password = null;
-    objectStore = null;
-    serverWSIURI = null;
-    serverHostname = null;
-    docURIPrefix = null;
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    if (command.startsWith("metadatafields/"))
-    {
-      String documentClass = command.substring("metadatafields/".length());
-      try
-      {
-        MetadataFieldDefinition[] metaFields = getDocumentClassMetadataFieldsDetails(documentClass);
-        int i = 0;
-        while (i < metaFields.length)
-        {
-          MetadataFieldDefinition def = metaFields[i++];
-          ConfigurationNode node = new ConfigurationNode("metadata_field");
-          ConfigurationNode child;
-          child = new ConfigurationNode("display_name");
-          child.setValue(def.getDisplayName());
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("symbolic_name");
-          child.setValue(def.getSymbolicName());
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.equals("documentclasses"))
-    {
-      try
-      {
-        DocumentClassDefinition[] definitions = getDocumentClassesDetails();
-        int i = 0;
-        while (i < definitions.length)
-        {
-          DocumentClassDefinition def = definitions[i++];
-          ConfigurationNode node = new ConfigurationNode("document_class");
-          ConfigurationNode child;
-          child = new ConfigurationNode("display_name");
-          child.setValue(def.getDisplayName());
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("symbolic_name");
-          child.setValue(def.getSymbolicName());
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.equals("mimetypes"))
-    {
-      try
-      {
-        String[] mimeTypesArray = getMimeTypes();
-        int i = 0;
-        while (i < mimeTypesArray.length)
-        {
-          String mimeType = mimeTypesArray[i++];
-          ConfigurationNode node = new ConfigurationNode("mime_type");
-          node.setValue(mimeType);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else
-      return super.requestInfo(output,command);
-    return true;
-  }
-  
-  /** Get child folder names, given a starting folder name.
-  *@param folderName is the starting folder name.
-  *@return the child folder names.
-  */
-  public String[] getChildFolders(String folderName)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      if (folderName.startsWith("/"))
-        folderName = folderName.substring(1);
-      
-      String[] folderPath;
-      if (folderName.length() == 0)
-        folderPath = new String[0];
-      else
-        folderPath = folderName.split("/");
-      
-      String[] rval = doGetChildFolders(folderPath);
-      if (rval == null)
-        return null;
-      java.util.Arrays.sort(rval);
-      return rval;
-    }
-    catch (FilenetException e)
-    {
-      // Base our treatment on the kind of error it is.
-      if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-        throw new ServiceInterruption(e.getMessage(),0L);
-      else
-        throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.debug("FileNet: Inside addSeedDocuments");
-
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else
-    {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-
-    // Go through all the document classes and do a query for each one
-    //get all mimetypes and build a SQL "where condition"
-
-    StringBuilder mimeTypesClause = new StringBuilder();
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i);
-      if (n.getType().equals(SPEC_NODE_MIMETYPE))
-      {
-        String mimeType = n.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        if (mimeType != null)
-        {
-          if (mimeTypesClause.length() != 0)
-            mimeTypesClause.append(" or ");
-          mimeTypesClause.append("[MimeType] = '").append(mimeType).append("'");
-        }
-      }
-      i++;
-    }
-    if (mimeTypesClause.length() == 0)
-    {
-      // Build the standard default filter list
-      String[] mimeTypes = getMimeTypes();
-      i = 0;
-      while (i < mimeTypes.length)
-      {
-        String mimeType = mimeTypes[i++];
-        if (mimeTypesClause.length() != 0)
-          mimeTypesClause.append(" or ");
-        mimeTypesClause.append("[MimeType] = '").append(mimeType).append("'");
-      }
-    }
-
-    StringBuilder sqlBuffer = new StringBuilder(" WHERE ([IsCurrentVersion] = TRUE AND (");
-    sqlBuffer.append(mimeTypesClause);
-    sqlBuffer.append(")");
-    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.ROOT);
-
-    // FileNet can apparently take a while to make documents available for searching, so throw in a bias of 15 minutes
-    long biasTime = 15L * 60000L;
-    if (startTime < biasTime)
-      startTime = 0L;
-    else
-      startTime -= biasTime;
-
-    if (startTime > 0L)
-    {
-      sqlBuffer.append(" AND [DateLastModified] >= ").append(buildTime(c,startTime));
-    }
-
-    sqlBuffer.append(" AND  [DateLastModified] <= ").append(buildTime(c,seedTime));
-
-    // Folders are also based just on objectstore, so we add those here.
-    boolean seenAny = false;
-    i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i++);
-      if (n.getType().equals(SPEC_NODE_FOLDER))
-      {
-        if (!seenAny)
-        {
-          sqlBuffer.append(" AND (");
-          seenAny = true;
-        }
-        else
-        {
-          sqlBuffer.append(" or ");
-        }
-        String folderValue = n.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        sqlBuffer.append("This INSUBFOLDER "+quoteSQLString(folderValue));
-      }
-    }
-    if (seenAny)
-    {
-      sqlBuffer.append(")");
-    }
-    
-    String whereClause = sqlBuffer.toString();
-
-    i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i);
-
-      if (n.getType().equals(SPEC_NODE_DOCUMENTCLASS))
-      {
-        String dc = n.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        DocClassSpec dcs = new DocClassSpec(n);
-        int matchCount = dcs.getMatchCount();
-        StringBuilder moreWhereClause = new StringBuilder(whereClause);
-        int q = 0;
-        while (q < matchCount)
-        {
-          String matchType = dcs.getMatchType(q);
-          String matchField = dcs.getMatchField(q);
-          String matchValue = dcs.getMatchValue(q);
-          q++;
-          moreWhereClause.append(" AND [").append(matchField).append("] ").append(matchType).append(" ")
-            .append(quoteSQLString(matchValue));
-        }
-        moreWhereClause.append(")");
-        String fullSQL = "SELECT Id, [VersionSeries] FROM "+dc+" WITH EXCLUDESUBCLASSES "+moreWhereClause.toString()+" OPTIONS(TIMELIMIT 180)";
-        long currentTime;
-        try
-        {
-          String[] objectIds = doGetMatchingObjectIds(fullSQL);
-          int j = 0;
-          while (j < objectIds.length)
-          {
-            // Add an identifier WITHOUT a comma for each document picked up in seeding.
-            // These identifiers will be processed later to yield individual content identifiers.
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("FileNet: Seeding with identifier '"+objectIds[j]+"'");
-            activities.addSeedDocument(objectIds[j++]);
-          }
-        }
-        catch (FilenetException e)
-        {
-          // Base our treatment on the kind of error it is.
-          currentTime = System.currentTimeMillis();
-          if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-            throw new ServiceInterruption(e.getMessage(),e,currentTime+300000L,currentTime+12*60*60000L,-1,true);
-          else
-            throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-
-      i++;
-    }
-    return new Long(seedTime).toString();
-  }
-
-  protected static String quoteSQLString(String value)
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append('\'');
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\'')
-        sb.append('\'');
-      sb.append(x);
-    }
-    sb.append('\'');
-    return sb.toString();
-  }
-
-  protected static String buildTime(Calendar c, long timeValue)
-  {
-    c.setTimeInMillis(timeValue);
-    //c.computeFields();
-    StringBuilder rval = new StringBuilder();
-    print_int(rval,c.get(Calendar.YEAR),4);
-    print_int(rval,c.get(Calendar.MONTH)+1,2);
-    print_int(rval,c.get(Calendar.DAY_OF_MONTH),2);
-    rval.append("T");
-    print_int(rval,c.get(Calendar.HOUR_OF_DAY),2);
-    print_int(rval,c.get(Calendar.MINUTE),2);
-    print_int(rval,c.get(Calendar.SECOND),2);
-    rval.append("Z");
-    return rval.toString();
-  }
-
-  protected static void print_int(StringBuilder sb, int value, int digits)
-  {
-    if (digits == 4)
-    {
-      value = print_digit(sb,value,1000);
-      digits--;
-    }
-    if (digits == 3)
-    {
-      value = print_digit(sb,value,100);
-      digits--;
-    }
-    if (digits == 2)
-    {
-      value = print_digit(sb,value,10);
-      digits--;
-    }
-    if (digits == 1)
-    {
-      print_digit(sb,value,1);
-    }
-  }
-
-  protected static int print_digit(StringBuilder sb, int value, int divisor)
-  {
-    int digit = value / divisor;
-    int x = '0' + digit;
-    sb.append((char)x);
-    return value - digit * divisor;
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.debug("FileNet: Inside processDocuments");
-
-    SpecInfo dSpec = new SpecInfo(spec);
-    
-    String[] acls = dSpec.getAcls();
-
-
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      // For each document, be sure to confirm job still active
-      activities.checkJobStillActive();
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Filenet: Getting version for identifier '"+documentIdentifier+"'");
-
-      
-      int cIndex = documentIdentifier.indexOf(",");
-      if (cIndex != -1)
-      {
-        String vId = documentIdentifier.substring(0,cIndex);
-        int elementNumber;
-        try
-        {
-          elementNumber = Integer.parseInt(documentIdentifier.substring(cIndex+1));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number in identifier: "+documentIdentifier,e);
-        }
-
-        // Calculate the version id and the element number
-        String versionString;
-        String[] aclValues = null;
-        String[] denyAclValues = null;
-        String docClass = null;
-        String[] metadataFieldNames = null;
-        String[] metadataFieldValues = null;
-
-        FileInfo fileInfo;
-        try
-        {
-          fileInfo = doGetDocumentInformation(vId, dSpec.getMetadataFields());
-          if (fileInfo == null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("FileNet: Skipping document '"+documentIdentifier+"' because not a current document");
-            activities.deleteDocument(documentIdentifier);
-            continue;
-          }
-        }
-        catch (FilenetException e)
-        {
-          // Base our treatment on the kind of error it is.
-          long currentTime = System.currentTimeMillis();
-          if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-            throw new ServiceInterruption(e.getMessage(),e,currentTime+300000L,currentTime+12*60*60000L,-1,true);
-          else if (e.getType() == FilenetException.TYPE_NOTALLOWED)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("FileNet: Skipping file '"+documentIdentifier+"' because: "+e.getMessage(),e);
-            activities.deleteDocument(documentIdentifier);
-            continue;
-          }
-          else
-            throw new ManifoldCFException(e.getMessage(),e);
-        }
-
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Filenet: Document '"+documentIdentifier+"' is a current document");
-
-        // Form a version string based on the info in fileInfo
-        // Version string will consist of:
-        // (a) metadata info
-        // (b) acl info
-        // (c) the url prefix to use
-        StringBuilder versionBuffer = new StringBuilder();
-
-        docClass = fileInfo.getDocClass();
-        DocClassSpec docclassspec = dSpec.getDocClassSpec(docClass);
-
-        // First, verify that this document matches the match criteria
-        boolean docMatches = true;
-        for (int q = 0; q < docclassspec.getMatchCount(); q++)
-        {
-          String matchType = docclassspec.getMatchType(q);
-          String matchField = docclassspec.getMatchField(q);
-          String matchValue = docclassspec.getMatchValue(q);
-          // Grab the appropriate field value from the fileinfo.  We know it is there because we explicitly
-          // folded the match fields into the server request.
-          String matchDocValue = fileInfo.getMetadataValue(matchField);
-          docMatches = performMatch(matchType,matchDocValue,matchValue);
-          if (docMatches == false)
-            break;
-        }
-
-        if (!docMatches)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("FileNet: Skipping document '"+documentIdentifier+"' because doesn't match field criteria");
-          activities.deleteDocument(documentIdentifier);
-          continue;
-        }
-            
-        // Metadata info
-        int metadataCount = 0;
-        Iterator iter = fileInfo.getMetadataIterator();
-        while (iter.hasNext())
-        {
-          String field = (String)iter.next();
-          if (docclassspec.checkMetadataIncluded(field))
-            metadataCount++;
-        }
-        metadataFieldNames = new String[metadataCount];
-        int j = 0;
-        iter = fileInfo.getMetadataIterator();
-        while (iter.hasNext())
-        {
-          String field = (String)iter.next();
-          if (docclassspec.checkMetadataIncluded(field))
-            metadataFieldNames[j++] = field;
-        }
-        java.util.Arrays.sort(metadataFieldNames);
-        // Pack field names and values
-        // For sanity, pack the names first and then the values!
-        packList(versionBuffer,metadataFieldNames,'+');
-        metadataFieldValues = new String[metadataFieldNames.length];
-        for (int q = 0; q < metadataFieldValues.length; q++)
-        {
-          metadataFieldValues[q] = fileInfo.getMetadataValue(metadataFieldNames[q]);
-          if (metadataFieldValues[q] == null)
-            metadataFieldValues[q] = "";
-        }
-        packList(versionBuffer,metadataFieldValues,'+');
-
-        // Acl info
-        // Future work will add "forced acls", so use a single character as a signal as to whether security is on or off.
-        if (acls != null && acls.length == 0)
-        {
-          // Security is on, so use the acls that came back from filenet
-          aclValues = new String[fileInfo.getAclCount()];
-          j = 0;
-          iter = fileInfo.getAclIterator();
-          while (iter.hasNext())
-          {
-            aclValues[j++] = (String)iter.next();
-          }
-          denyAclValues = new String[fileInfo.getDenyAclCount()];
-          j = 0;
-          iter = fileInfo.getDenyAclIterator();
-          while (iter.hasNext())
-          {
-            denyAclValues[j++] = (String)iter.next();
-          }
-        }
-        else if (acls != null && acls.length > 0)
-        {
-          // Forced acls
-          aclValues = acls;
-          denyAclValues = new String[]{defaultAuthorityDenyToken};
-        }
-
-        if (aclValues != null)
-        {
-          versionBuffer.append('+');
-          java.util.Arrays.sort(aclValues);
-          packList(versionBuffer,aclValues,'+');
-          if (denyAclValues == null)
-            denyAclValues = new String[0];
-          java.util.Arrays.sort(denyAclValues);
-          packList(versionBuffer,denyAclValues,'+');
-        }
-        else
-          versionBuffer.append('-');
-        
-        // Document class
-        pack(versionBuffer,docClass,'+');
-        // Document URI
-        pack(versionBuffer,docURIPrefix,'+');
-
-        versionString = versionBuffer.toString();
-        
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("FileNet: Document identifier '"+documentIdentifier+"' is a document attachment");
-
-        String errorCode = null;
-        String errorDesc = null;
-        long startTime = System.currentTimeMillis();
-        Long fileLengthLong = null;
-        
-        try
-        {
-          String uri = convertToURI(docURIPrefix,vId,elementNumber,docClass);
-          if (!activities.checkURLIndexable(uri))
-          {
-            errorCode = activities.EXCLUDED_URL;
-            errorDesc = "Excluded because of url ('"+uri+"')";
-            activities.noDocument(documentIdentifier,versionString);
-            continue;
-          }
-        
-          File objFileTemp = null;
-          try
-          {
-            objFileTemp = File.createTempFile("_mc_fln_", null);
-          }
-          catch (IOException e)
-          {
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            handleIOException(e,documentIdentifier,"creating temporary file");
-          }
-          try
-          {
-            try
-            {
-              doGetDocumentContents(vId,elementNumber,objFileTemp.getCanonicalPath());
-            }
-            catch (IOException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              handleIOException(e,documentIdentifier,"reading document");
-            }
-            catch (FilenetException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              // Base our treatment on the kind of error it is.
-              long currentTime = System.currentTimeMillis();
-              if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-              {
-                throw new ServiceInterruption(e.getMessage(),e,currentTime+300000L,currentTime+12*60*60000L,-1,true);
-              }
-              else if (e.getType() == FilenetException.TYPE_NOTALLOWED)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("FileNet: Removing file '"+documentIdentifier+"' because: "+e.getMessage(),e);
-                activities.noDocument(documentIdentifier,versionString);
-                continue;
-              }
-              else
-              {
-                throw new ManifoldCFException(e.getMessage(),e);
-              }
-            }
-
-            // Document fetch completed
-            long fileLength = objFileTemp.length();
-            if (!activities.checkLengthIndexable(fileLength))
-            {
-              errorCode = activities.EXCLUDED_LENGTH;
-              errorDesc = "Excluded document because of length ("+fileLength+")";
-              activities.noDocument(documentIdentifier,versionString);
-              continue;
-            }
-
-            RepositoryDocument rd = new RepositoryDocument();
-            // Apply metadata
-            for (int k = 0; k < metadataFieldNames.length; k++)
-            {
-              String metadataName = metadataFieldNames[k];
-              String metadataValue = metadataFieldValues[k];
-              rd.addField(metadataName,metadataValue);
-            }
-
-            // Apply acls
-            if (aclValues != null)
-            {
-              rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,aclValues);
-            }
-            if (denyAclValues != null)
-            {
-              rd.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,denyAclValues);
-            }
-
-            InputStream is = null;
-            try
-            {
-              is = new FileInputStream(objFileTemp);
-            }
-            catch (IOException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              handleIOException(e,documentIdentifier,"Opening temporary file");
-            }
-            try
-            {
-              rd.setBinary(is, fileLength);
-
-              try
-              {
-                // Ingest
-                activities.ingestDocumentWithException(documentIdentifier,versionString,uri,rd);
-                errorCode = "OK";
-                fileLengthLong = new Long(fileLength);
-              }
-              catch (IOException e)
-              {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(e,documentIdentifier,"ingesting document");
-              }
-            }
-            finally
-            {
-              try
-              {
-                is.close();
-              }
-              catch (IOException e)
-              {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(e,documentIdentifier,"closing input stream");
-              }
-            }
-          }
-          finally
-          {
-            // Delete temp file
-            objFileTemp.delete();
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            errorCode = null;
-          throw e;
-        }
-        finally
-        {
-          if (errorCode != null)
-            activities.recordActivity(new Long(startTime),ACTIVITY_FETCH,
-              fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-        }
-      }
-      else
-      {
-        Integer count;
-        try
-        {
-          count = doGetDocumentContentCount(documentIdentifier);
-          if (count == null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("FileNet: Removing version '"+documentIdentifier+"' because it seems to no longer exist");
-            activities.deleteDocument(documentIdentifier);
-            continue;
-          }
-        }
-        catch (FilenetException e)
-        {
-          // Base our treatment on the kind of error it is.
-          long currentTime = System.currentTimeMillis();
-          if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-            throw new ServiceInterruption(e.getMessage(),e,currentTime+300000L,currentTime+12*60*60000L,-1,true);
-          else if (e.getType() == FilenetException.TYPE_NOTALLOWED)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("FileNet: Skipping file '"+documentIdentifier+"' because: "+e.getMessage(),e);
-            activities.deleteDocument(documentIdentifier);
-            continue;
-          }
-          else
-            throw new ManifoldCFException(e.getMessage(),e);
-        }
-
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("FileNet: There are "+count.toString()+" content values for '"+documentIdentifier+"'");
-
-        // Loop through all document content identifiers and add a child identifier for each
-        for (int q = 0; q < count.intValue(); q++)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("Filenet: Adding document identifier '"+documentIdentifier+","+Integer.toString(q)+"'");
-
-          activities.addDocumentReference(documentIdentifier + "," + Integer.toString(q));
-        }
-        
-        // No more processing is necessary for document identifiers.
-        activities.noDocument(documentIdentifier,"");
-        continue;
-
-      }
-    }
-  }
-
-  protected static void handleIOException(IOException e, String documentIdentifier, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Socket timeout "+context+": "+e.getMessage(),e,currentTime+300000L,currentTime+1*60*60000L,5,true);
-    }
-    if (e instanceof InterruptedIOException)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    Logging.connectors.error("FileNet: IO exception on '"+documentIdentifier+"' while "+context+": "+e.getMessage(),e);
-    throw new ManifoldCFException("IO exception "+context+": "+e.getMessage(),e);
-  }
-  
-  /** Emulate the query matching for filenet sql expressions. */
-  protected static boolean performMatch(String matchType, String matchDocValue, String matchValue)
-  {
-    if (matchType.equals("="))
-      return matchDocValue.equalsIgnoreCase(matchValue);
-    else if (matchType.equals("!="))
-      return !matchDocValue.equalsIgnoreCase(matchValue);
-
-    // Do a LIKE comparison
-    return likeMatch(matchDocValue,0,matchValue,0);
-  }
-
-  /** Match a portion of a string with SQL wildcards (%) */
-  protected static boolean likeMatch(String matchDocValue, int matchDocPos, String matchValue, int matchPos)
-  {
-    if (matchPos == matchValue.length())
-    {
-      return matchDocPos == matchDocValue.length();
-    }
-    if (matchDocPos == matchDocValue.length())
-    {
-      return matchValue.charAt(matchPos) == '%' && likeMatch(matchDocValue,matchDocPos,matchValue,matchPos+1);
-    }
-    char x = matchDocValue.charAt(matchDocPos);
-    char y = matchValue.charAt(matchPos);
-    if (y != '%')
-      return Character.toLowerCase(x) == Character.toLowerCase(y) && likeMatch(matchDocValue,matchDocPos+1,matchValue,matchPos+1);
-
-    return likeMatch(matchDocValue,matchDocPos+1,matchValue,matchPos) ||
-      likeMatch(matchDocValue,matchDocPos,matchValue,matchPos+1);
-  }
-
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // 1 at a time, since this connector does not deal with documents en masse, but one at a time.
-    return 1;
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.Server"));
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.ObjectStore"));
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.DocumentURL"));
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.Credentials"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.serverport.value != \"\" && !isInteger(editconnection.serverport.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheServerPortMustBeAnInteger") + "\");\n"+
-"    editconnection.serverport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.urlport.value != \"\" && !isInteger(editconnection.urlport.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheDocumentURLPortMustBeAnInteger") + "\");\n"+
-"    editconnection.urlport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  return true;\n"+
-"}\n"+
-"	\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.serverhostname.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheConnectionRequiresAFileNetHostName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.Server") + "\");\n"+
-"    editconnection.serverhostname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverport.value != \"\" && !isInteger(editconnection.serverport.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheServerPortMustBeAnInteger") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.Server") + "\");\n"+
-"    editconnection.serverport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.urlhostname.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheDocumentURLRequiresAHostName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.DocumentURL") + "\");\n"+
-"    editconnection.urlhostname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.urlport.value != \"\" && !isInteger(editconnection.urlport.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheDocumentURLPortMustBeAnInteger") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.DocumentURL") + "\");\n"+
-"    editconnection.urlport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  if (editconnection.filenetdomain.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheFileNetDomainNameCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.ObjectStore") + "\");\n"+
-"    editconnection.filenetdomain.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.objectstore.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheObjectStoreNameCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.ObjectStore") + "\");\n"+
-"    editconnection.objectstore.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.userid.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheConnectionRequiresAValidFileNetUserID") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.Credentials") + "\");\n"+
-"    editconnection.userid.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.password.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.TheConnectionRequiresTheFileNetUsersPassword") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.Credentials") + "\");\n"+
-"    editconnection.password.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String userID = parameters.getParameter(CONFIG_PARAM_USERID);
-    if (userID == null)
-      userID = "";
-    String password = parameters.getObfuscatedParameter(CONFIG_PARAM_PASSWORD);
-    if (password == null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-    String filenetdomain = parameters.getParameter(CONFIG_PARAM_FILENETDOMAIN);
-    if (filenetdomain == null)
-    {
-      filenetdomain = parameters.getParameter(CONFIG_PARAM_FILENETDOMAIN_OLD);
-      if (filenetdomain == null)
-        filenetdomain = "";
-    }
-    String objectstore = parameters.getParameter(CONFIG_PARAM_OBJECTSTORE);
-    if (objectstore == null)
-      objectstore = "";
-    String serverprotocol = parameters.getParameter(CONFIG_PARAM_SERVERPROTOCOL);
-    if (serverprotocol == null)
-      serverprotocol = "http";
-    String serverhostname = parameters.getParameter(CONFIG_PARAM_SERVERHOSTNAME);
-    if (serverhostname == null)
-      serverhostname = "";
-    String serverport = parameters.getParameter(CONFIG_PARAM_SERVERPORT);
-    if (serverport == null)
-      serverport = "";
-    String serverwsilocation = parameters.getParameter(CONFIG_PARAM_SERVERWSILOCATION);
-    if (serverwsilocation == null)
-      serverwsilocation = "wsi/FNCEWS40DIME";
-    String urlprotocol = parameters.getParameter(CONFIG_PARAM_URLPROTOCOL);
-    if (urlprotocol == null)
-      urlprotocol = "http";
-    String urlhostname = parameters.getParameter(CONFIG_PARAM_URLHOSTNAME);
-    if (urlhostname == null)
-      urlhostname = "";
-    String urlport = parameters.getParameter(CONFIG_PARAM_URLPORT);
-    if (urlport == null)
-      urlport = "";
-    String urllocation = parameters.getParameter(CONFIG_PARAM_URLLOCATION);
-    if (urllocation == null)
-      urllocation = "Workplace/Browse.jsp";
-
-    // "Server" tab
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.Server")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.ServerProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"serverprotocol\" size=\"2\">\n"+
-"        <option value=\"http\" "+(serverprotocol.equals("http")?"selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\"https\" "+(serverprotocol.equals("https")?"selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.ServerHostName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"serverhostname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverhostname)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.ServerPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"serverport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverport)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.ServerWebServiceLocation") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"serverwsilocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverwsilocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Server tab
-      out.print(
-"<input type=\"hidden\" name=\"serverprotocol\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverprotocol)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverhostname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverhostname)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverport)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverwsilocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverwsilocation)+"\"/>\n"
-      );
-    }
-
-    // "Document URL" tab
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.DocumentURL")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.DocumentURLProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"urlprotocol\" size=\"2\">\n"+
-"        <option value=\"http\" "+(serverprotocol.equals("http")?"selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\"https\" "+(serverprotocol.equals("https")?"selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.DocumentURLHostName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"urlhostname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urlhostname)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.DocumentURLPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"urlport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urlport)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.DocumentURLLocation") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"urllocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urllocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Document URL tab
-      out.print(
-"<input type=\"hidden\" name=\"urlprotocol\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urlprotocol)+"\"/>\n"+
-"<input type=\"hidden\" name=\"urlhostname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urlhostname)+"\"/>\n"+
-"<input type=\"hidden\" name=\"urlport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urlport)+"\"/>\n"+
-"<input type=\"hidden\" name=\"urllocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(urllocation)+"\"/>\n"
-      );
-    }
-
-    // "Object Store" tab
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.ObjectStore")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.FileNetDomainName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"filenetdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filenetdomain)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.ObjectStoreName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"objectstore\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(objectstore)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Object Store tab
-      out.print(
-"<input type=\"hidden\" name=\"filenetdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filenetdomain)+"\"/>\n"+
-"<input type=\"hidden\" name=\"objectstore\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(objectstore)+"\"/>\n"
-      );
-    }
-
-
-    // "Credentials" tab
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.Credentials")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.UserID") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"userid\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userID)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.Password") + "</nobr></td><td class=\"value\"><input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Credentials tab
-      out.print(
-"<input type=\"hidden\" name=\"userid\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userID)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"
-      );
-    }
-
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String serverprotocol = variableContext.getParameter("serverprotocol");
-    if (serverprotocol != null)
-      parameters.setParameter(CONFIG_PARAM_SERVERPROTOCOL,serverprotocol);
-
-    String serverhostname = variableContext.getParameter("serverhostname");
-    if (serverhostname != null)
-      parameters.setParameter(CONFIG_PARAM_SERVERHOSTNAME,serverhostname);
-    
-    String serverport = variableContext.getParameter("serverport");
-    if (serverport != null && serverport.length() > 0)
-      parameters.setParameter(CONFIG_PARAM_SERVERPORT,serverport);
-
-    String serverwsilocation = variableContext.getParameter("serverwsilocation");
-    if (serverwsilocation != null)
-      parameters.setParameter(CONFIG_PARAM_SERVERWSILOCATION,serverwsilocation);
-
-    String urlprotocol = variableContext.getParameter("urlprotocol");
-    if (urlprotocol != null)
-      parameters.setParameter(CONFIG_PARAM_URLPROTOCOL,urlprotocol);
-
-    String urlhostname = variableContext.getParameter("urlhostname");
-    if (urlhostname != null)
-      parameters.setParameter(CONFIG_PARAM_URLHOSTNAME,urlhostname);
-
-    String urlport = variableContext.getParameter("urlport");
-    if (urlport != null && urlport.length() > 0)
-      parameters.setParameter(CONFIG_PARAM_URLPORT,urlport);
-
-    String urllocation = variableContext.getParameter("urllocation");
-    if (urllocation != null)
-      parameters.setParameter(CONFIG_PARAM_URLLOCATION,urllocation);
-
-    String userID = variableContext.getParameter("userid");
-    if (userID != null)
-      parameters.setParameter(CONFIG_PARAM_USERID,userID);
-
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(CONFIG_PARAM_PASSWORD,variableContext.mapKeyToPassword(password));
-
-    String filenetdomain = variableContext.getParameter("filenetdomain");
-    if (filenetdomain != null)
-      parameters.setParameter(CONFIG_PARAM_FILENETDOMAIN,filenetdomain);
-
-    String objectstore = variableContext.getParameter("objectstore");
-    if (objectstore != null)
-      parameters.setParameter(CONFIG_PARAM_OBJECTSTORE,objectstore);
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" certificate(s)&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.DocumentClasses"));
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.MimeTypes"));
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.Folders"));
-    tabsArray.add(Messages.getString(locale,"FilenetConnector.Security"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToPath(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"pathaddon.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.SelectAFolderFirst") + "\");\n"+
-"    editjob."+seqPrefix+"pathaddon.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"AddToPath\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddMatch(docclass, anchorvalue)\n"+
-"{\n"+
-"  if (eval(\"editjob."+seqPrefix+"matchfield_\"+docclass+\".value\") == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.SelectAFieldFirst") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"matchfield_\"+docclass+\".focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  if (eval(\"editjob."+seqPrefix+"matchtype_\"+docclass+\".value\") == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.SelectAMatchType") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"matchtype_\"+docclass+\".focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"matchop_\"+docclass,\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"FilenetConnector.NullTokensNotAllowed") + "\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-    int k;
-    Iterator iter;
-
-    // "Document Classes" tab
-    // Look for document classes
-    HashMap documentClasses = new HashMap();
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(SPEC_NODE_DOCUMENTCLASS))
-      {
-        String value = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        // Now, scan for metadata etc.
-        org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec spec = new org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec(sn);
-        documentClasses.put(value,spec);
-      }
-    }
-
-    // Folders tab
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.Folders")) && actualSequenceNumber == connectionSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Now, loop through paths.  There will be a row in the current table for each one.
-      // The row will contain a delete button on the left.  On the right will be the startpoint itself at the top,
-      // and underneath it the table where the filter criteria are edited.
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(SPEC_NODE_FOLDER))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          String pathOpName = seqPrefix+"pathop"+pathDescription;
-          String startPath = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-          out.print(
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FilenetConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"FilenetConnector.DeletePath")+Integer.toString(k)+"\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Delete\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(startPath)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+pathOpName+"\" value=\"\"/>\n"+
-"      <nobr>"+((startPath.length() == 0)?"(root)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(startPath))+"</nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"FilenetConnector.NoFoldersChosen") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\" colspan=\"2\">\n"+
-"      <nobr>\n"+
-"        <input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"        <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"
-      );
-	
-      String pathSoFar = (String)currentContext.get(seqPrefix+"specpath");
-      if (pathSoFar == null)
-        pathSoFar = "/";
-
-      // Grab next folder/project list
-      try
-      {
-        String[] childList;
-        childList = getChildFolders(pathSoFar);
-        if (childList == null)
-        {
-          // Illegal path - set it back
-          pathSoFar = "/";
-          childList = getChildFolders("/");
-          if (childList == null)
-            throw new ManifoldCFException("Can't find any children for root folder");
-        }
-        out.print(
-"          <input type=\"hidden\" name=\""+seqPrefix+"specpath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathSoFar)+"\"/>\n"+
-"          <input type=\"hidden\" name=\""+seqPrefix+"pathop\" value=\"\"/>\n"+
-"          <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FilenetConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"FilenetConnector.AddPath") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\"pathop\",\"Add\",\""+seqPrefix+"path_"+Integer.toString(k+1)+"\")'/>\n"+
-"          &nbsp;"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathSoFar)+"\n"
-        );
-        if (pathSoFar.length() > 0 && !pathSoFar.equals("/"))
-        {
-          out.print(
-"          <input type=\"button\" value=\"-\" alt=\"" + Messages.getAttributeString(locale,"FilenetConnector.RemoveFromPath") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\"pathop\",\"Up\",\"path_"+Integer.toString(k)+"\")'/>\n"
-          );
-        }
-        if (childList.length > 0)
-        {
-          out.print(
-"          <nobr>\n"+
-"            <input type=\"button\" value=\"+\" alt=\"" + Messages.getAttributeString(locale,"FilenetConnector.AddToPath") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToPath(\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>&nbsp;\n"+
-"            <select multiple=\"false\" name=\""+seqPrefix+"pathaddon\" size=\"4\">\n"+
-"              <option value=\"\" selected=\"selected\">-- " + Messages.getBodyString(locale,"FilenetConnector.PickAFolder") + " --</option>\n"
-          );
-          int j = 0;
-          while (j < childList.length)
-          {
-            String attrFolder = org.apache.manifoldcf.ui.util.Encoder.attributeEscape(childList[j]);
-            String bodyFolder = org.apache.manifoldcf.ui.util.Encoder.bodyEscape(childList[j]);
-            out.print(
-"              <option value=\""+attrFolder+"\">"+bodyFolder+"</option>\n"
-            );
-            j++;
-          }
-          out.print(
-"            </select>\n"+
-"          </nobr>\n"
-          );
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        out.println(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage()));
-      }
-      catch (ServiceInterruption e)
-      {
-        e.printStackTrace();
-        out.println(org.apache.manifoldcf.ui.util.Encoder.bodyEscape("Transient error - "+e.getMessage()));
-      }
-      out.print(
-"        </a>\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Generate hiddens for the folders tab
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(SPEC_NODE_FOLDER))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          String startPath = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(startPath)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-    
-    // Document classes tab
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.DocumentClasses")) && actualSequenceNumber == connectionSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"hasdocumentclasses\" value=\"true\"/>\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Fetch the list of valid document classes from the connector
-      org.apache.manifoldcf.crawler.common.filenet.DocumentClassDefinition[] documentClassArray = null;
-      HashMap documentClassFields = new HashMap();
-      String message = null;
-      try
-      {
-        documentClassArray = getDocumentClassesDetails();
-        int j = 0;
-        while (j < documentClassArray.length)
-        {
-          String documentClass = documentClassArray[j++].getSymbolicName();
-          org.apache.manifoldcf.crawler.common.filenet.MetadataFieldDefinition[] metaFields = getDocumentClassMetadataFieldsDetails(documentClass);
-          documentClassFields.put(documentClass,metaFields);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        message = e.getMessage();
-      }
-      catch (ServiceInterruption e)
-      {
-        message = "FileNet server temporarily unavailable: "+e.getMessage();
-      }
-
-      if (message != null)
-      {
-        out.print(
-"  <tr><td class=\"message\" colspan=\"2\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(message)+"</td></tr>\n"
-        );
-      }
-      else
-      {
-        i = 0;
-        while (i < documentClassArray.length)
-        {
-          org.apache.manifoldcf.crawler.common.filenet.DocumentClassDefinition def = documentClassArray[i++];
-          String documentClass = def.getSymbolicName();
-          String displayName = def.getDisplayName();
-          org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec spec = (org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec)documentClasses.get(documentClass);
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(documentClass+" ("+displayName+")")+":</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"displaytable\">\n"+
-"        <tr>\n"+
-"          <td class=\"description\">\n"+
-"            <nobr>" + Messages.getBodyString(locale,"FilenetConnector.Include") + "</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"value\">\n"+
-"            <nobr><input type=\"checkbox\" name=\""+seqPrefix+"documentclasses\" "+((spec != null)?"checked=\"true\"":"")+" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\"></input></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"        <tr>\n"+
-"          <td class=\"description\">\n"+
-"            <nobr>" + Messages.getBodyString(locale,"FilenetConnector.DocumentCriteria") + "</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"displaytable\">\n"
-          );
-          org.apache.manifoldcf.crawler.common.filenet.MetadataFieldDefinition[] fields = (org.apache.manifoldcf.crawler.common.filenet.MetadataFieldDefinition[])documentClassFields.get(documentClass);
-          String[] fieldArray = new String[fields.length];
-          HashMap fieldMap = new HashMap();
-          int j = 0;
-          while (j < fieldArray.length)
-          {
-            org.apache.manifoldcf.crawler.common.filenet.MetadataFieldDefinition field = fields[j];
-            fieldArray[j++] = field.getSymbolicName();
-            fieldMap.put(field.getSymbolicName(),field.getDisplayName());
-          }
-          java.util.Arrays.sort(fieldArray);
-
-          int q = 0;
-          int matchCount = ((spec==null)?0:spec.getMatchCount());
-          while (q < matchCount)
-          {
-            String matchType = spec.getMatchType(q);
-            String matchField = spec.getMatchField(q);
-            String matchValue = spec.getMatchValue(q);
-            String opName = seqPrefix+"matchop_" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass) + "_" +Integer.toString(q);
-            String labelName = seqPrefix+"match_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"_"+Integer.toString(q);
-            out.print(
-"              <tr>\n"+
-"                <td class=\"description\">\n"+
-"                  <input type=\"hidden\" name=\""+opName+"\" value=\"\"/>\n"+
-"                  <a name=\""+labelName+"\">\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FilenetConnector.Delete") + "\" alt=\"" + Messages.getAttributeString(locale,"FilenetConnector.Delete") + documentClass+" match # "+Integer.toString(q)+"\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+opName+"\",\"Delete\",\""+labelName+"\")'/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"matchfield_" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass) + "_" + Integer.toString(q)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchField)+"\"/>\n"+
-"                  <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchField)+"</nobr>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"matchtype_" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass) + "_" + Integer.toString(q)+"\" value=\""+matchType+"\"/>\n"+
-"                  <nobr>"+matchType+"</nobr>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"matchvalue_" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass) + "_" + Integer.toString(q)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchValue)+"\"/>\n"+
-"                  <nobr>\""+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchValue)+"\"</nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"
-            );
-            q++;
-          }
-          if (q == 0)
-          {
-            out.print(
-"              <tr><td class=\"message\" colspan=\"4\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.NoCriteriaSpecified") + "</nobr></td></tr>\n"
-            );
-          }
-          String addLabelName = seqPrefix+"match_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"_"+Integer.toString(q);
-          String addOpName = seqPrefix+"matchop_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass);
-          out.print(
-"              <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"              <tr>\n"+
-"                <td class=\"description\">\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"matchcount_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" value=\""+Integer.toString(matchCount)+"\"/>\n"+
-"                  <input type=\"hidden\" name=\""+addOpName+"\" value=\"\"/>\n"+
-"                  <a name=\""+addLabelName+"\">\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FilenetConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"FilenetConnector.AddMatchFor") +org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" onClick='Javascript:"+seqPrefix+"SpecAddMatch(\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\",\""+seqPrefix+"match_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"_"+Integer.toString(q+1)+"\")'/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <select name=\""+seqPrefix+"matchfield_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" size=\"5\">\n"
-          );
-          q = 0;
-          while (q < fieldArray.length)
-          {
-            String field = fieldArray[q++];
-            String dName = (String)fieldMap.get(field);
-            out.print(
-"                    <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(field)+"\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(field+" ("+dName+")")+"</option>\n"
-            );
-          }
-          out.print(
-"                  </select>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <select name=\""+seqPrefix+"matchtype_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\">\n"+
-"                    <option value=\"=\">" + Messages.getBodyString(locale,"FilenetConnector.Equals") + "</option>\n"+
-"                    <option value=\"!=\">" + Messages.getBodyString(locale,"FilenetConnector.NotEquals") + "</option>\n"+
-"                    <option value=\"LIKE\">" + Messages.getBodyString(locale,"FilenetConnector.Like") + "</option>\n"+
-"                  </select>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <input name=\""+seqPrefix+"matchvalue_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" type=\"text\" size=\"32\" value=\"\"/>\n"+
-"                </td>\n"+
-"              </tr>\n"+
-          
-"            </table>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"        <tr>\n"+
-"          <td class=\"description\">\n"+
-"            <nobr>" + Messages.getBodyString(locale,"FilenetConnector.IngestAllMetadataFields") + "</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"value\">\n"+
-"            <nobr><input type=\"checkbox\" name=\""+seqPrefix+"allmetadata_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" value=\"true\" "+((spec != null && spec.getAllMetadata())?"checked=\"\"":"")+"></input></nobr><br/>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"        <tr>\n"+
-"          <td class=\"description\">\n"+
-"            <nobr>" + Messages.getBodyString(locale,"FilenetConnector.MetadataFields") + "</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"value\">\n"+
-"            <nobr>\n"+
-"              <select name=\""+seqPrefix+"metadatafield_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" multiple=\"true\" size=\"5\">\n"
-          );
-          j = 0;
-          while (j < fieldArray.length)
-          {
-            String field = fieldArray[j++];
-            String dName = (String)fieldMap.get(field);
-            out.print(
-"                <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(field)+"\" "+((spec!=null && spec.getAllMetadata() == false && spec.checkMetadataIncluded(field))?"selected=\"true\"":"")+">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(field+" ("+dName+")")+"</option>\n"
-            );
-          }
-          out.print(
-"              </select>\n"+
-"            </nobr>\n"+
-"\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-        }
-      }
-      out.print(
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"hasdocumentclasses\" value=\"true\"/>\n"
-      );
-      iter = documentClasses.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String documentClass = (String)iter.next();
-        org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec spec = (org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec)documentClasses.get(documentClass);
-        if (spec.getAllMetadata())
-        {
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"allmetadata_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" value=\"true\"/>\n"
-          );
-        }
-        else
-        {
-          String[] metadataFields = spec.getMetadataFields();
-          int q = 0;
-          while (q < metadataFields.length)
-          {
-            String field = metadataFields[q++];
-            out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"metadatafield_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(field)+"\"/>\n"
-            );
-          }
-        }
-                    
-        // Do matches
-        int matchCount = spec.getMatchCount();
-        int q = 0;
-        while (q < matchCount)
-        {
-          String matchType = spec.getMatchType(q);
-          String matchField = spec.getMatchField(q);
-          String matchValue = spec.getMatchValue(q);
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"matchfield_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"_"+Integer.toString(q)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchField)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"matchtype_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"_"+Integer.toString(q)+"\" value=\""+matchType+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"matchvalue_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"_"+Integer.toString(q)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchValue)+"\"/>\n"
-          );
-          q++;
-        }
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"matchcount_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\" value=\""+Integer.toString(matchCount)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"documentclasses\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentClass)+"\"/>\n"
-        );
-      }
-    }
-
-    // "Mime Types" tab
-    HashMap mimeTypes = null;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(SPEC_NODE_MIMETYPE))
-      {
-        String value = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        if (mimeTypes == null)
-          mimeTypes = new HashMap();
-        mimeTypes.put(value,value);
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.MimeTypes")) && actualSequenceNumber == connectionSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"hasmimetypes\" value=\"true\"/>\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Fetch the list of valid document classes from the connector
-      String[] mimeTypesArray = null;
-      String message = null;
-      try
-      {
-        mimeTypesArray = getMimeTypes();
-      }
-      catch (ManifoldCFException e)
-      {
-        message = e.getMessage();
-      }
-      catch (ServiceInterruption e)
-      {
-        message = "FileNet server temporarily unavailable: "+e.getMessage();
-      }
-      out.print(
-"  <tr>\n"
-      );
-      if (message != null)
-      {
-        out.print(
-"    <td class=\"message\" colspan=\"2\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(message)+"</td>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.MimeTypesToInclude") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\""+seqPrefix+"mimetypes\" size=\"10\" multiple=\"true\">\n"
-        );
-        i = 0;
-        while (i < mimeTypesArray.length)
-        {
-          String mimeType = mimeTypesArray[i++];
-          if (mimeTypes == null || mimeTypes.get(mimeType) != null)
-          {
-            out.print(
-"        <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeType)+"\" selected=\"true\">\n"+
-"          "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mimeType)+"\n"+
-"        </option>\n"
-            );
-          }
-          else
-          {
-            out.print(
-"        <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeType)+"\">\n"+
-"          "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mimeType)+"\n"+
-"        </option>\n"
-            );
-          }
-        }
-        out.print(
-"      </select>\n"+
-"    </td>\n"
-        );
-      }
-      out.print(
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"hasmimetypes\" value=\"true\"/>\n"
-      );
-      if (mimeTypes != null)
-      {
-        iter = mimeTypes.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String mimeType = (String)iter.next();
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"mimetypes\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeType)+"\"/>\n"
-          );
-        }
-      }
-    }
-
-    // Security tab
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"FilenetConnector.Security")) && actualSequenceNumber == connectionSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.Security2") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"1\">\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"on\" "+((securityOn)?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"FilenetConnector.Enabled") +
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"off\" "+((securityOn==false)?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"FilenetConnector.Disabled") + 
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Finally, go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String accessOpName = seqPrefix+"accessop"+accessDescription;
-          String token = sn.getAttributeValue("token");
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FilenetConnector.Delete") + "\" alt=\""+ Messages.getAttributeString(locale,"FilenetConnector.DeleteAccessToken")+Integer.toString(k)+"\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")'/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"FilenetConnector.NoAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FilenetConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"FilenetConnector.AddAccessToken") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")'/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specsecurity\" value=\""+(securityOn?"on":"off")+"\"/>\n"
-      );
-      // Finally, go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String token = sn.getAttributeValue("token");
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String[] x;
-    String y;
-    int i;
-
-    if (variableContext.getParameter(seqPrefix+"hasdocumentclasses") != null)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        if (ds.getChild(i).getType().equals(SPEC_NODE_DOCUMENTCLASS))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      x = variableContext.getParameterValues(seqPrefix+"documentclasses");
-      if (x != null)
-      {
-        i = 0;
-        while (i < x.length)
-        {
-          String value = x[i++];
-          SpecificationNode node = new SpecificationNode(SPEC_NODE_DOCUMENTCLASS);
-          node.setAttribute(SPEC_ATTRIBUTE_VALUE,value);
-          // Get the allmetadata value for this document class
-          String allmetadata = variableContext.getParameter(seqPrefix+"allmetadata_"+value);
-          if (allmetadata == null)
-            allmetadata = "false";
-          if (allmetadata.equals("true"))
-            node.setAttribute(SPEC_ATTRIBUTE_ALLMETADATA,allmetadata);
-          else
-          {
-            String[] fields = variableContext.getParameterValues(seqPrefix+"metadatafield_"+value);
-            if (fields != null)
-            {
-              int j = 0;
-              while (j < fields.length)
-              {
-                String field = fields[j++];
-                SpecificationNode sp2 = new SpecificationNode(SPEC_NODE_METADATAFIELD);
-                sp2.setAttribute(SPEC_ATTRIBUTE_VALUE,field);
-                node.addChild(node.getChildCount(),sp2);
-              }
-            }
-          }
-			
-          // Now, gather up matches too
-          String matchCountString = variableContext.getParameter(seqPrefix+"matchcount_"+value);
-          int matchCount = Integer.parseInt(matchCountString);
-          int q = 0;
-          while (q < matchCount)
-          {
-            String matchOp = variableContext.getParameter(seqPrefix+"matchop_"+value+"_"+Integer.toString(q));
-            String matchType = variableContext.getParameter(seqPrefix+"matchtype_"+value+"_"+Integer.toString(q));
-            String matchField = variableContext.getParameter(seqPrefix+"matchfield_"+value+"_"+Integer.toString(q));
-            String matchValue = variableContext.getParameter(seqPrefix+"matchvalue_"+value+"_"+Integer.toString(q));
-            if (matchOp == null || !matchOp.equals("Delete"))
-            {
-              SpecificationNode matchNode = new SpecificationNode(SPEC_NODE_MATCH);
-              matchNode.setAttribute(SPEC_ATTRIBUTE_MATCHTYPE,matchType);
-              matchNode.setAttribute(SPEC_ATTRIBUTE_FIELDNAME,matchField);
-              if (matchValue == null)
-                matchValue = "";
-              matchNode.setAttribute(SPEC_ATTRIBUTE_VALUE,matchValue);
-              node.addChild(node.getChildCount(),matchNode);
-            }
-            q++;
-          }
-          ds.addChild(ds.getChildCount(),node);
-			
-          // Look for the add operation
-          String addMatchOp = variableContext.getParameter(seqPrefix+"matchop_"+value);
-          if (addMatchOp != null && addMatchOp.equals("Add"))
-          {
-            String matchType = variableContext.getParameter(seqPrefix+"matchtype_"+value);
-            String matchField = variableContext.getParameter(seqPrefix+"matchfield_"+value);
-            String matchValue = variableContext.getParameter(seqPrefix+"matchvalue_"+value);
-            SpecificationNode matchNode = new SpecificationNode(SPEC_NODE_MATCH);
-            matchNode.setAttribute(SPEC_ATTRIBUTE_MATCHTYPE,matchType);
-            matchNode.setAttribute(SPEC_ATTRIBUTE_FIELDNAME,matchField);
-            if (matchValue == null)
-              matchValue = "";
-            matchNode.setAttribute(SPEC_ATTRIBUTE_VALUE,matchValue);
-            node.addChild(node.getChildCount(),matchNode);
-          }
-			
-        }
-      }
-    }
-	
-    if (variableContext.getParameter(seqPrefix+"hasmimetypes") != null)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        if (ds.getChild(i).getType().equals(SPEC_NODE_MIMETYPE))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      x = variableContext.getParameterValues(seqPrefix+"mimetypes");
-      if (x != null)
-      {
-        i = 0;
-        while (i < x.length)
-        {
-          String value = x[i++];
-          SpecificationNode node = new SpecificationNode(SPEC_NODE_MIMETYPE);
-          node.setAttribute(SPEC_ATTRIBUTE_VALUE,value);
-          ds.addChild(ds.getChildCount(),node);
-        }
-      }
-    }
-
-    y = variableContext.getParameter(seqPrefix+"pathcount");
-    if (y != null)
-    {
-      // Delete all path specs first
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(SPEC_NODE_FOLDER))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(y);
-      // Gather up these
-      i = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"pathop"+pathDescription;
-        y = variableContext.getParameter(pathOpName);
-        if (y != null && y.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Path inserts won't happen until the very end
-        String path = variableContext.getParameter(seqPrefix+"specpath"+pathDescription);
-        SpecificationNode node = new SpecificationNode(SPEC_NODE_FOLDER);
-        node.setAttribute(SPEC_ATTRIBUTE_VALUE,path);
-
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"pathop");
-      if (op != null && op.equals("Add"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        SpecificationNode node = new SpecificationNode(SPEC_NODE_FOLDER);
-        node.setAttribute(SPEC_ATTRIBUTE_VALUE,path);
-        ds.addChild(ds.getChildCount(),node);
-      }
-      else if (op != null && op.equals("Up"))
-      {
-        // Strip off end
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        int k = path.lastIndexOf("/");
-        if (k <= 0)
-          path = "/";
-        else
-          path = path.substring(0,k);
-        currentContext.save(seqPrefix+"specpath",path);
-      }
-      else if (op != null && op.equals("AddToPath"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        String addon = variableContext.getParameter(seqPrefix+"pathaddon");
-        if (addon != null && addon.length() > 0)
-        {
-          if (path.length() <= 1)
-            path = "/" + addon;
-          else
-            path += "/" + addon;
-        }
-        currentContext.save(seqPrefix+"specpath",path);
-      }
-    }
-
-    y = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (y != null)
-    {
-      // Delete all security entries first
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("security"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode("security");
-      node.setAttribute("value",y);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    y = variableContext.getParameter(seqPrefix+"tokencount");
-    if (y != null)
-    {
-      // Delete all file specs first
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(y);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        y = variableContext.getParameter(accessOpName);
-        if (y != null && y.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    int i;
-    Iterator iter;
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"
-    );
-    // Look for document classes
-    HashMap documentClasses = new HashMap();
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(SPEC_NODE_DOCUMENTCLASS))
-      {
-        String value = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec spec = new org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec(sn);
-        documentClasses.put(value,spec);
-      }
-    }
-    String[] sortedDocumentClasses = new String[documentClasses.size()];
-    i = 0;
-    iter = documentClasses.keySet().iterator();
-    while (iter.hasNext())
-    {
-      sortedDocumentClasses[i++] = (String)iter.next();
-    }
-    java.util.Arrays.sort(sortedDocumentClasses);
-
-    if (sortedDocumentClasses.length == 0)
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.NoIncludedDocumentClasses") + "</nobr></td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.IncludedDocumentClasses") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      i = 0;
-      while (i < sortedDocumentClasses.length)
-      {
-        String docclass = sortedDocumentClasses[i++];
-        out.print(
-"        <tr>\n"+
-"          <td class=\"description\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(docclass)+"</nobr></td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"displaytable\">\n"+
-"              <tr>\n"+
-"                <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.Metadata") + "</nobr></td>\n"+
-"                <td class=\"value\">\n"
-        );
-        org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec fieldValues = (org.apache.manifoldcf.crawler.connectors.filenet.DocClassSpec)documentClasses.get(docclass);
-        if (fieldValues.getAllMetadata())
-        {
-          out.print(
-"                  <nobr>(all metadata values)</nobr>\n"
-          );
-        }
-        else
-        {
-          String[] valuesList = fieldValues.getMetadataFields();
-          java.util.Arrays.sort(valuesList);
-          int j = 0;
-          while (j < valuesList.length)
-          {
-            String value = valuesList[j++];
-            out.print(
-"                  <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-            );
-          }
-        }
-        out.print(
-"                </td>\n"+
-"              </tr>\n"+
-"              <tr>\n"+
-"                <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.DocumentsMatching") + "</nobr></td>\n"+
-"                <td class=\"value\">\n"
-        );
-        int matchCount = fieldValues.getMatchCount();
-        int q = 0;
-        while (q < matchCount)
-        {
-          String matchType = fieldValues.getMatchType(q);
-          String matchField = fieldValues.getMatchField(q);
-          String matchValue = fieldValues.getMatchValue(q);
-          q++;
-          out.print(
-"                  <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchField)+" "+matchType+" \""+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchValue)+"\"</nobr><br/>\n"
-          );
-        }
-
-        if (q == 0)
-        {
-          out.print(
-"                  <nobr>(" + Messages.getBodyString(locale,"FilenetConnector.AllDocumentsInClass") + "\""+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(docclass)+"\")</nobr>\n"
-          );
-        }
-        out.print(
-"                </td>\n"+
-"              </tr>\n"+
-"            </table>\n"+
-"          </td>\n"+
-"        </tr>\n"
-        );
-      }
-      out.print(
-"      </table>\n"+
-"    </td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"
-    );
-    // Look for mime types
-    i = 0;
-    HashMap mimeTypes = null;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(SPEC_NODE_MIMETYPE))
-      {
-        String value = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-        if (mimeTypes == null)
-          mimeTypes = new HashMap();
-        mimeTypes.put(value,value);
-      }
-    }
-
-    if (mimeTypes != null)
-    {
-      String[] sortedMimeTypes = new String[mimeTypes.size()];
-      i = 0;
-      iter = mimeTypes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        sortedMimeTypes[i++] = (String)iter.next();
-      }
-      java.util.Arrays.sort(sortedMimeTypes);
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.IncludedMimeTypes") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-      );
-      i = 0;
-      while (i < sortedMimeTypes.length)
-      {
-        String value = sortedMimeTypes[i++];
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-      out.print(
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.NoIncludedMimeTypes") + "</nobr></td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    
-    // Handle Folders
-    i = 0;
-    boolean seenAny = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode spn = ds.getChild(i++);
-      if (spn.getType().equals(SPEC_NODE_FOLDER))
-      {
-        if (seenAny == false)
-        {
-          seenAny = true;
-        }
-        out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.Folders2") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(spn.getAttributeValue(SPEC_ATTRIBUTE_VALUE))+"</nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-    }
-    if (seenAny == false)
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"FilenetConnector.AllFoldersSpecified") + "</td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"
-    );
-    
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-    out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.Security2") + "</nobr></td>\n"+
-"    <td class=\"value\">"+(securityOn?"Enabled":"Disabled")+"</td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Go through looking for access tokens
-    seenAny = false;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("access"))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FilenetConnector.AccessTokens") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue("token");
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"FilenetConnector.NoAccessTokensSpecified") + "</td></tr>\n"
-      );
-    }
-    out.print(
-"</table>\n"
-    );
-  }
-
-  // UI support methods
-
-  /** Get the set of available document classes, with details */
-  public DocumentClassDefinition[] getDocumentClassesDetails()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime;
-    try
-    {
-      return getDocumentClassesInfo();
-    }
-    catch (FilenetException e)
-    {
-      // Base our treatment on the kind of error it is.
-      currentTime = System.currentTimeMillis();
-      if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-        throw new ServiceInterruption(e.getMessage(),e,currentTime+300000L,currentTime+12*60*60000L,-1,true);
-      else
-        throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Get the set of available metadata fields per document class */
-  public MetadataFieldDefinition[] getDocumentClassMetadataFieldsDetails(String documentClassName)
-    throws ServiceInterruption, ManifoldCFException
-  {
-    long currentTime;
-    try
-    {
-      return getDocumentClassMetadataFieldsInfo(documentClassName);
-    }
-    catch (FilenetException e)
-    {
-      // Base our treatment on the kind of error it is.
-      currentTime = System.currentTimeMillis();
-      if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
-        throw new ServiceInterruption(e.getMessage(),e,currentTime+300000L,currentTime+12*60*60000L,-1,true);
-      else
-        throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Get the set of available mime types */
-  public String[] getMimeTypes()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // For now, return the list of mime types we know about
-    return new String[]
-    {
-      "application/excel",
-        "application/powerpoint",
-        "application/ppt",
-        "application/rtf",
-        "application/xls",
-        "text/html",
-        "text/rtf",
-        "text/pdf",
-        "application/x-excel",
-        "application/x-msexcel",
-        "application/x-mspowerpoint",
-        "application/x-msword-doc",
-        "application/x-msword",
-        "application/x-word",
-        "Application/pdf",
-        "text/xml",
-        "no-type",
-        "text/plain",
-        "application/pdf",
-        "application/x-rtf",
-        "application/vnd.ms-excel",
-        "application/vnd.ms-pps",
-        "application/vnd.ms-powerpoint",
-        "application/vnd.ms-word",
-        "application/msword",
-        "application/msexcel",
-        "application/mspowerpoint",
-        "application/ms-powerpoint",
-        "application/ms-word",
-        "application/ms-excel",
-        "Adobe",
-        "application/Vnd.Ms-Excel",
-        "vnd.ms-powerpoint",
-        "application/x-pdf",
-        "winword",
-        "text/richtext",
-        "Text",
-        "Text/html",
-        "application/MSWORD",
-        "application/PDF",
-        "application/MSEXCEL",
-        "application/MSPOWERPOINT",
-        "application/vnd.oasis.opendocument.presentation",
-        "application/vnd.oasis.opendocument.spreadsheet",
-        "application/vnd.oasis.opendocument.text"
-    };
-  }
-
-  // Protected methods
-
-  /** Convert a document identifier to a URI.  The URI is the URI that will be the unique key from
-  * the search index, and will be presented to the user as part of the search results.
-  *@param documentIdentifier is the document identifier.
-  *@return the document uri.
-  */
-  protected static String convertToURI(String urlBase, String documentIdentifier, int elementNumber, String documentClass)
-  {
-    // objectType is the parent object type, which is why Document is correct
-    return  urlBase  +  "&id=" + documentIdentifier + "&element="+Integer.toString(elementNumber)+"&objectType=Document";
-  }
-
-  protected class CheckConnectionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public CheckConnectionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-  /** Check connection, with appropriate retries */
-  protected void checkConnection()
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      CheckConnectionThread t = new CheckConnectionThread();
-      t.start();
-      try
-      {
-        t.finishUp();
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class GetDocumentClassesInfoThread extends Thread
-  {
-    protected DocumentClassDefinition[] rval = null;
-    protected Throwable exception = null;
-
-    public GetDocumentClassesInfoThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.getDocumentClassesDetails();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public DocumentClassDefinition[] finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Get document class details, with appropriate retries */
-  protected DocumentClassDefinition[] getDocumentClassesInfo()
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetDocumentClassesInfoThread t = new GetDocumentClassesInfoThread();
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class GetDocumentClassesMetadataFieldsInfoThread extends Thread
-  {
-    protected String documentClassName;
-    protected MetadataFieldDefinition[] rval = null;
-    protected Throwable exception = null;
-
-    public GetDocumentClassesMetadataFieldsInfoThread(String documentClassName)
-    {
-      super();
-      setDaemon(true);
-      this.documentClassName = documentClassName;
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.getDocumentClassMetadataFieldsDetails(documentClassName);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public MetadataFieldDefinition[] finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Get document class metadata fields details, with appropriate retries */
-  protected MetadataFieldDefinition[] getDocumentClassMetadataFieldsInfo(String documentClassName)
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetDocumentClassesMetadataFieldsInfoThread t = new GetDocumentClassesMetadataFieldsInfoThread(documentClassName);
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class GetChildFoldersThread extends Thread
-  {
-    protected final String[] folderPath;
-    protected String[] rval = null;
-    protected Throwable exception = null;
-
-    public GetChildFoldersThread(String[] folderPath)
-    {
-      super();
-      setDaemon(true);
-      this.folderPath = folderPath;
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.getChildFolders(folderPath);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public String[] finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-
-  /** Get child folder names */
-  protected String[] doGetChildFolders(String[] folderPath)
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetChildFoldersThread t = new GetChildFoldersThread(folderPath);
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class GetMatchingObjectIdsThread extends Thread
-  {
-    protected String sql;
-    protected String[] rval = null;
-    protected Throwable exception = null;
-
-    public GetMatchingObjectIdsThread(String sql)
-    {
-      super();
-      setDaemon(true);
-      this.sql = sql;
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.getMatchingObjectIds(sql);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public String[] finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-  
-  /** Get matching object id's for a given query */
-  protected String[] doGetMatchingObjectIds(String sql)
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetMatchingObjectIdsThread t = new GetMatchingObjectIdsThread(sql);
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class GetDocumentContentCountThread extends Thread
-  {
-    protected String identifier;
-    protected Integer rval = null;
-    protected Throwable exception = null;
-
-    public GetDocumentContentCountThread(String identifier)
-    {
-      super();
-      setDaemon(true);
-      this.identifier = identifier;
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.getDocumentContentCount(identifier);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Integer finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  protected Integer doGetDocumentContentCount(String documentIdentifier)
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetDocumentContentCountThread t = new GetDocumentContentCountThread(documentIdentifier);
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-
-  }
-
-  protected class GetDocumentInformationThread extends Thread
-  {
-    protected final String docId;
-    protected final Map<String,Object> metadataFields;
-    protected FileInfo rval = null;
-    protected Throwable exception = null;
-
-    public GetDocumentInformationThread(String docId, Map<String,Object> metadataFields)
-    {
-      super();
-      setDaemon(true);
-      this.docId = docId;
-      this.metadataFields = metadataFields;
-    }
-
-    public void run()
-    {
-      try
-      {
-        rval = session.getDocumentInformation(docId,metadataFields);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public FileInfo finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  /** Get document info */
-  protected FileInfo doGetDocumentInformation(String docId, Map<String,Object> metadataFields)
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetDocumentInformationThread t = new GetDocumentInformationThread(docId,metadataFields);
-      t.start();
-      try
-      {
-        return t.finishUp();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-  }
-
-  protected class GetDocumentContentsThread extends Thread
-  {
-    protected final String docId;
-    protected final int elementNumber;
-    protected final String tempFileName;
-    
-    protected Throwable exception = null;
-
-    public GetDocumentContentsThread(String docId, int elementNumber, String tempFileName)
-    {
-      super();
-      setDaemon(true);
-      this.docId = docId;
-      this.elementNumber = elementNumber;
-      this.tempFileName = tempFileName;
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.getDocumentContents(docId,elementNumber,tempFileName);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws RemoteException, FilenetException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof RemoteException)
-          throw (RemoteException)thr;
-        else if (thr instanceof FilenetException)
-          throw (FilenetException)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-  /** Get document contents */
-  protected void doGetDocumentContents(String docId, int elementNumber, String tempFileName)
-    throws FilenetException, ManifoldCFException, ServiceInterruption
-  {
-    while (true)
-    {
-      boolean noSession = (session==null);
-      getSession();
-      long currentTime;
-      GetDocumentContentsThread t = new GetDocumentContentsThread(docId,elementNumber,tempFileName);
-      t.start();
-      try
-      {
-        t.finishUp();
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RemoteException e)
-      {
-        Throwable e2 = e.getCause();
-        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
-          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-        if (noSession)
-        {
-          currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
-        }
-        session = null;
-        lastSessionFetch = -1L;
-        continue;
-      }
-    }
-
-  }
-
-
-  // Utility classes/methods
-
-  protected static class SpecInfo
-  {
-    protected final Set<String> aclMap = new HashSet<String>();
-    protected final boolean securityOn;
-    protected final Map<String,DocClassSpec> docClassSpecs = new HashMap<String,DocClassSpec>();
-    protected final Map<String,Object> metadataFields = new HashMap<String,Object>();
-
-    public SpecInfo(Specification spec)
-    {
-      boolean securityOn = true;
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode sn = spec.getChild(i);
-        if (sn.getType().equals("access"))
-        {
-          String token = sn.getAttributeValue("token");
-          aclMap.add(token);
-        }
-        else if (sn.getType().equals("security"))
-        {
-          String value = sn.getAttributeValue("value");
-          if (value.equals("on"))
-            securityOn = true;
-          else if (value.equals("off"))
-            securityOn = false;
-        }
-        else if (sn.getType().equals(SPEC_NODE_DOCUMENTCLASS))
-        {
-          String value = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
-          DocClassSpec classSpec = new DocClassSpec(sn);
-          docClassSpecs.put(value,classSpec);
-          if (classSpec.getAllMetadata())
-            metadataFields.put(value,new Boolean(true));
-          else
-          {
-            Set<String> sumMap = new HashSet<String>();
-            int j = 0;
-            String[] fields = classSpec.getMetadataFields();
-            for (String field : fields)
-            {
-              sumMap.add(field);
-            }
-            for (j = 0; j < classSpec.getMatchCount(); j++)
-            {
-              sumMap.add(classSpec.getMatchField(j));
-            }
-            // Convert to an array
-            String[] fieldArray = new String[sumMap.size()];
-            j = 0;
-            for (String field : sumMap)
-            {
-              fieldArray[j++] = field;
-            }
-            metadataFields.put(value,fieldArray);
-          }
-        }
-
-      }
-      
-      this.securityOn = securityOn;
-
-    }
-    
-    public String[] getAcls()
-    {
-      if (!securityOn)
-        return null;
-
-      String[] rval = new String[aclMap.size()];
-      int i = 0;
-      for (String acl : aclMap)
-      {
-        rval[i++] = acl;
-      }
-      return rval;
-    }
-    
-    public DocClassSpec getDocClassSpec(String docClass)
-    {
-      return docClassSpecs.get(docClass);
-    }
-
-    public Map<String,Object> getMetadataFields()
-    {
-      return metadataFields;
-    }
-  
-
-  }
-  
-}
diff --git a/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/Messages.java b/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/Messages.java
deleted file mode 100644
index 48250ea..0000000
--- a/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filenet;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.filenet.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.filenet";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_en_US.properties b/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_en_US.properties
deleted file mode 100644
index 64b09b4..0000000
--- a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_en_US.properties
+++ /dev/null
@@ -1,85 +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.
-
-FilenetConnector.NoAccessTokensPresent=No access tokens present
-FilenetConnector.NoAccessTokensSpecified=No access tokens specified
-FilenetConnector.Server=Server
-FilenetConnector.ObjectStore=Object Store
-FilenetConnector.DocumentURL=Document URL
-FilenetConnector.Credentials=Credentials
-FilenetConnector.ServerProtocol=Server protocol:
-FilenetConnector.ServerHostName=Server host name:
-FilenetConnector.ServerPort=Server port:
-FilenetConnector.ServerWebServiceLocation=Server web service location:
-FilenetConnector.DocumentURLProtocol=Document URL protocol:
-FilenetConnector.DocumentURLHostName=Document URL host name:
-FilenetConnector.DocumentURLPort=Document URL port:
-FilenetConnector.DocumentURLLocation=Document URL location:
-FilenetConnector.FileNetDomainName=FileNet domain name:
-FilenetConnector.ObjectStoreName=Object store name:
-FilenetConnector.UserID=User ID:
-FilenetConnector.Password=Password:
-FilenetConnector.Parameters=Parameters:
-FilenetConnector.Delete=Delete
-FilenetConnector.DeletePath=Delete path #
-FilenetConnector.NoFoldersChosen=No folders chosen - all documents will be taken
-FilenetConnector.Add=Add
-FilenetConnector.AddPath=Add path
-FilenetConnector.RemoveFromPath=Remove from path
-FilenetConnector.AddToPath=Add to path
-FilenetConnector.PickAFolder=Pick a folder
-FilenetConnector.Include=Include?
-FilenetConnector.DocumentCriteria=Document criteria:
-FilenetConnector.NoCriteriaSpecified=(No criteria specified - all documents will be taken)
-FilenetConnector.IngestAllMetadataFields=Ingest all metadata fields
-FilenetConnector.MetadataFields=Metadata fields:
-FilenetConnector.MimeTypesToInclude:=Mime types to include:
-FilenetConnector.Security2=Security:
-FilenetConnector.Folders=Folders
-FilenetConnector.DocumentClasses=Document Classes
-FilenetConnector.MimeTypes=Mime Types
-FilenetConnector.Security=Security
-FilenetConnector.NoIncludedDocumentClasses=No included document classes
-FilenetConnector.IncludedDocumentClasses=Included document classes:
-FilenetConnector.Metadata=Metadata:
-FilenetConnector.DocumentsMatching=Documents matching:
-FilenetConnector.IncludedMimeTypes=Included mime types:
-FilenetConnector.NoIncludedMimeTypes=No included mime types - ALL will be ingested
-FilenetConnector.Folders2=Folders:
-FilenetConnector.AllFoldersSpecified=All folders specified
-FilenetConnector.Security2=Security:
-FilenetConnector.AccessTokens=Access tokens:
-FilenetConnector.TheConnectionRequiresAFileNetHostName=The connection requires a FileNet host name
-FilenetConnector.TheServerPortMustBeAnInteger=The server port must be an integer
-FilenetConnector.TheDocumentURLRequiresAHostName=The Document URL requires a host name
-FilenetConnector.TheDocumentURLPortMustBeAnInteger=The Document URL port must be an integer
-FilenetConnector.TheFileNetDomainNameCannotBeNull=The file net domain name cannot be null
-FilenetConnector.TheObjectStoreNameCannotBeNull=The object store name cannot be null
-FilenetConnector.TheConnectionRequiresAValidFileNetUserID=The connection requires a valid FileNet user ID
-FilenetConnector.TheConnectionRequiresTheFileNetUsersPassword=The connection requires the FileNet user's password
-FilenetConnector.SelectAFolderFirst=Select a folder first
-FilenetConnector.SelectAFieldFirst=Select a field first
-FilenetConnector.SelectAMatchType=Select a match type
-FilenetConnector.NullTokensNotAllowed=Null tokens not allowed
-FilenetConnector.AddMatchFor=Add match for
-FilenetConnector.Equals=Equals
-FilenetConnector.NotEquals=Not equals
-FilenetConnector.Like='Like' (with % wildcards)
-FilenetConnector.Enabled=Enabled&nbsp;\n
-FilenetConnector.Disabled=Disabled\n
-FilenetConnector.DeleteAccessToken=Delete access token #
-FilenetConnector.AddAccessToken=Add access token
-FilenetConnector.AllDocumentsInClass=All documents in class
-
diff --git a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_es_ES.properties b/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_es_ES.properties
deleted file mode 100644
index cbf357e..0000000
--- a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_es_ES.properties
+++ /dev/null
@@ -1,85 +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.
-
-FilenetConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-FilenetConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-FilenetConnector.Server=Servidor
-FilenetConnector.ObjectStore=almacén de objetos
-FilenetConnector.DocumentURL=Documento URL
-FilenetConnector.Credentials=Credenciales
-FilenetConnector.ServerProtocol=protocolo de servidor:
-FilenetConnector.ServerHostName=Nombre de host del servidor:
-FilenetConnector.ServerPort=Puerto de servidor:
-FilenetConnector.ServerWebServiceLocation=El web de servidor atiende la posición:
-FilenetConnector.DocumentURLProtocol=Protocolo URL Documento:
-FilenetConnector.DocumentURLHostName=Documento URL nombre de host:
-FilenetConnector.DocumentURLPort=Puerto Documento URL:
-FilenetConnector.DocumentURLLocation=Documento URL posición:
-FilenetConnector.FileNetDomainName=Nombre de dominio de Red de archivo:
-FilenetConnector.ObjectStoreName=Nombre de tienda de objeto:
-FilenetConnector.UserID=ID de usuario:
-FilenetConnector.Password=Contraseña:
-FilenetConnector.Parameters=Parámetros:
-FilenetConnector.Delete=borrar
-FilenetConnector.DeletePath=eliminar ruta #
-FilenetConnector.NoFoldersChosen=No hay carpetas elegidas - todos los documentos serán tomados
-FilenetConnector.Add=añadir
-FilenetConnector.AddPath=Añadir ruta
-FilenetConnector.RemoveFromPath=Eliminar de ruta
-FilenetConnector.AddToPath=Añadir a la ruta
-FilenetConnector.PickAFolder=Elija una carpeta
-FilenetConnector.Include=¿Incluir?
-FilenetConnector.DocumentCriteria=Criterios de documento:
-FilenetConnector.NoCriteriaSpecified=(Ningunos criterios especificados - todos los documentos serán tomados)
-FilenetConnector.IngestAllMetadataFields=Ingrese todos los campos de metadata
-FilenetConnector.MetadataFields=campos de metadatos:
-FilenetConnector.MimeTypesToInclude:=Tipos MIME para incluir:
-FilenetConnector.Security2=Seguridad:
-FilenetConnector.Folders=Carpetas
-FilenetConnector.DocumentClasses=Clases de Documento
-FilenetConnector.MimeTypes=Tipos Mime
-FilenetConnector.Security=Seguridad
-FilenetConnector.NoIncludedDocumentClasses=No hay clases de documentos incluidos
-FilenetConnector.IncludedDocumentClasses=Clases de documentos incluidos:
-FilenetConnector.Metadata=Metadatos:
-FilenetConnector.DocumentsMatching=Correspondencia de documentos:
-FilenetConnector.IncludedMimeTypes=Tipos MIME incluidos:
-FilenetConnector.NoIncludedMimeTypes=No hay tipos MIME incluidos - Todos serán ingresados
-FilenetConnector.Folders2=Carpetas:
-FilenetConnector.AllFoldersSpecified=Todas las carpetas especificadas
-FilenetConnector.Security2=Seguridad:
-FilenetConnector.AccessTokens=tokens de acceso:
-FilenetConnector.TheConnectionRequiresAFileNetHostName=La conexión requiere un nombre de host File Net
-FilenetConnector.TheServerPortMustBeAnInteger=El puerto del servidor debe ser un entero
-FilenetConnector.TheDocumentURLRequiresAHostName=La dirección URL del documento requiere un nombre de host
-FilenetConnector.TheDocumentURLPortMustBeAnInteger=El puerto URL Documento debe ser un entero
-FilenetConnector.TheFileNetDomainNameCannotBeNull=El nombre de dominio neto archivo no puede ser nulo
-FilenetConnector.TheObjectStoreNameCannotBeNull=El nombre de la tienda de objetos no puede ser nulo
-FilenetConnector.TheConnectionRequiresAValidFileNetUserID=La conexión requiere un ID de usuario de File Net válida
-FilenetConnector.TheConnectionRequiresTheFileNetUsersPassword=La conexión requiere la contraseña del usuario File Net
-FilenetConnector.SelectAFolderFirst=Seleccione una carpeta primero
-FilenetConnector.SelectAFieldFirst=Seleccione un campo primero
-FilenetConnector.SelectAMatchType=Seleccione un tipo de concordancia
-FilenetConnector.NullTokensNotAllowed=Tokens nulos no permitidos
-FilenetConnector.AddMatchFor=Añadir la altura de
-FilenetConnector.Equals=Iguales
-FilenetConnector.NotEquals=no iguales
-FilenetConnector.Like='Como' (con % comodines)
-FilenetConnector.Enabled=Activado&nbsp;\n
-FilenetConnector.Disabled=Imposibilitadi\n
-FilenetConnector.DeleteAccessToken=Eliminar token de acceso #
-FilenetConnector.AddAccessToken=Añadir token de acceso
-FilenetConnector.AllDocumentsInClass=Todos los documentos en clase
-
diff --git a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_ja_JP.properties b/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_ja_JP.properties
deleted file mode 100644
index e1a96a2..0000000
--- a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_ja_JP.properties
+++ /dev/null
@@ -1,84 +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.
-
-FilenetConnector.NoAccessTokensPresent=アクセストークンが存在しません
-FilenetConnector.NoAccessTokensSpecified=アクセストークンが未定義です
-FilenetConnector.Server=サーバ
-FilenetConnector.ObjectStore=オブジェクトストア
-FilenetConnector.DocumentURL=ドキュメントURL
-FilenetConnector.Credentials=認証
-FilenetConnector.ServerProtocol=サーバプロトコル:
-FilenetConnector.ServerHostName=サーバホスト名:
-FilenetConnector.ServerPort=サーバポート:
-FilenetConnector.ServerWebServiceLocation=サーバWebサービス:
-FilenetConnector.DocumentURLProtocol=ドキュメントURLプロトコル:
-FilenetConnector.DocumentURLHostName=ドキュメントURLホスト名:
-FilenetConnector.DocumentURLPort=ドキュメントURLポート:
-FilenetConnector.DocumentURLLocation=ドキュメントURL:
-FilenetConnector.FileNetDomainName=FileNetドメイン名:
-FilenetConnector.ObjectStoreName=オブジェクトストア名:
-FilenetConnector.UserID=ユーザID:
-FilenetConnector.Password=パスワード:
-FilenetConnector.Parameters=引数:
-FilenetConnector.Delete=削除
-FilenetConnector.DeletePath=パス # を削除
-FilenetConnector.NoFoldersChosen=フォルダが選択されていません - すべてのドキュメントを対象にします
-FilenetConnector.Add=追加
-FilenetConnector.AddPath=パスを追加
-FilenetConnector.RemoveFromPath=パスから除外
-FilenetConnector.AddToPath=パスに追加
-FilenetConnector.PickAFolder=フォルダを選択してください
-FilenetConnector.Include=含む
-FilenetConnector.DocumentCriteria=ドキュメント条件:
-FilenetConnector.NoCriteriaSpecified=(条件が指定されていません - すべてのドキュメントを対象にします)
-FilenetConnector.IngestAllMetadataFields=すべてのメタデータフィールドを読み込む
-FilenetConnector.MetadataFields=メタデータフィールド:
-FilenetConnector.MimeTypesToInclude=含むMIMEタイプ:
-FilenetConnector.Security2=セキュリティ:
-FilenetConnector.Folders=フォルダ
-FilenetConnector.DocumentClasses=ドキュメントクラス
-FilenetConnector.MimeTypes=MIMEタイプ
-FilenetConnector.Security=セキュリティ
-FilenetConnector.NoIncludedDocumentClasses=含まないドキュメントクラス
-FilenetConnector.IncludedDocumentClasses=含むドキュメントクラス:
-FilenetConnector.Metadata=メタデータ:
-FilenetConnector.DocumentsMatching=一致するドキュメント:
-FilenetConnector.IncludedMimeTypes=含むMIMEタイプ:
-FilenetConnector.NoIncludedMimeTypes=含まないMIMEタイプ - すべて読取ります
-FilenetConnector.Folders2=フォルダ:
-FilenetConnector.AllFoldersSpecified=指定したすべてのフォルダ
-FilenetConnector.Security2=セキュリティ:
-FilenetConnector.AccessTokens=アクセストークン:
-FilenetConnector.TheConnectionRequiresAFileNetHostName=FileNetホスト名を入力してください
-FilenetConnector.TheServerPortMustBeAnInteger=ポート番号には整数を入力してください
-FilenetConnector.TheDocumentURLRequiresAHostName=ドキュメントURLのホスト名を入力してください
-FilenetConnector.TheDocumentURLPortMustBeAnInteger=ドキュメントURLポートには整数を入力してください
-FilenetConnector.TheFileNetDomainNameCannotBeNull=FileNetドメイン名を入力してください
-FilenetConnector.TheObjectStoreNameCannotBeNull=オブジェクト名を入力してください
-FilenetConnector.TheConnectionRequiresAValidFileNetUserID=FileNetユーザIDを入力してください
-FilenetConnector.TheConnectionRequiresTheFileNetUsersPassword=パスワードを入力してください
-FilenetConnector.SelectAFolderFirst=フォルダを選択してください
-FilenetConnector.SelectAFieldFirst=項目を選択してください
-FilenetConnector.SelectAMatchType=タイプを選択してください
-FilenetConnector.NullTokensNotAllowed=トークンを入力してください
-FilenetConnector.AddMatchFor=パターンを追加
-FilenetConnector.Equals=等しい
-FilenetConnector.NotEquals=等しくない
-FilenetConnector.Like='Like' (ワイルドカード「%」)
-FilenetConnector.Enabled=有効&nbsp;\n
-FilenetConnector.Disabled=無効\n
-FilenetConnector.DeleteAccessToken=アクセストークン # を削除
-FilenetConnector.AddAccessToken=アクセストークンを追加
-FilenetConnector.AllDocumentsInClass=クラスのすべてのドキュメント
diff --git a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_zh_CN.properties b/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_zh_CN.properties
deleted file mode 100644
index ed14b69..0000000
--- a/connectors/filenet/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filenet/common_zh_CN.properties
+++ /dev/null
@@ -1,84 +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.
-
-FilenetConnector.NoAccessTokensPresent=访问令牌不存在
-FilenetConnector.NoAccessTokensSpecified=访问令牌未指定
-FilenetConnector.Server=服务器
-FilenetConnector.ObjectStore=对象存储
-FilenetConnector.DocumentURL=文档URL
-FilenetConnector.Credentials=凭证
-FilenetConnector.ServerProtocol=服务器协议: 
-FilenetConnector.ServerHostName=服务器主机名: 
-FilenetConnector.ServerPort=服务器端口: 
-FilenetConnector.ServerWebServiceLocation=服务器Web服务位置: 
-FilenetConnector.DocumentURLProtocol=文档URL协议: 
-FilenetConnector.DocumentURLHostName=文档URL主机名: 
-FilenetConnector.DocumentURLPort=文档URL端口: 
-FilenetConnector.DocumentURLLocation=文档URL: 
-FilenetConnector.FileNetDomainName=FileNet域名: 
-FilenetConnector.ObjectStoreName=对象存储名: 
-FilenetConnector.UserID=用户ID: 
-FilenetConnector.Password=密码: 
-FilenetConnector.Parameters=参数: 
-FilenetConnector.Delete=删除
-FilenetConnector.DeletePath=删除路径 #
-FilenetConnector.NoFoldersChosen=文件夹未选定 - 将处理所有文档
-FilenetConnector.Add=添加
-FilenetConnector.AddPath=添加路径
-FilenetConnector.RemoveFromPath=从路径排除
-FilenetConnector.AddToPath=添加到路径
-FilenetConnector.PickAFolder=请选择文件夹
-FilenetConnector.Include=包含
-FilenetConnector.DocumentCriteria=文档标准: 
-FilenetConnector.NoCriteriaSpecified=(标准未指定 - 将处理所有文档)
-FilenetConnector.IngestAllMetadataFields=爬取所有元数据字段
-FilenetConnector.MetadataFields=元数据字段: 
-FilenetConnector.MimeTypesToInclude=包含对象MIME类型: 
-FilenetConnector.Security2=安全: 
-FilenetConnector.Folders=文件夹
-FilenetConnector.DocumentClasses=文档类
-FilenetConnector.MimeTypes=MIME类型
-FilenetConnector.Security=安全
-FilenetConnector.NoIncludedDocumentClasses=文档类不存在
-FilenetConnector.IncludedDocumentClasses=所包含的文档类: 
-FilenetConnector.Metadata=元数据: 
-FilenetConnector.DocumentsMatching=文档匹配: 
-FilenetConnector.IncludedMimeTypes=所包含的MIME类型: 
-FilenetConnector.NoIncludedMimeTypes=MIME类型不存在 - 将处理所有文档
-FilenetConnector.Folders2=文件夹: 
-FilenetConnector.AllFoldersSpecified=指定了所有文件夹
-FilenetConnector.Security2=安全: 
-FilenetConnector.AccessTokens=访问令牌: 
-FilenetConnector.TheConnectionRequiresAFileNetHostName=请输入FileNet主机名
-FilenetConnector.TheServerPortMustBeAnInteger=端口号必须为整数
-FilenetConnector.TheDocumentURLRequiresAHostName=请输入文档URL的主机名
-FilenetConnector.TheDocumentURLPortMustBeAnInteger=文档URL端口必须为整数
-FilenetConnector.TheFileNetDomainNameCannotBeNull=FileNet域名不能为Null
-FilenetConnector.TheObjectStoreNameCannotBeNull=对象存储名不能为Null
-FilenetConnector.TheConnectionRequiresAValidFileNetUserID=请输入有效的FileNet用户ID
-FilenetConnector.TheConnectionRequiresTheFileNetUsersPassword=请输入FileNet用户密码
-FilenetConnector.SelectAFolderFirst=请先选择文件夹
-FilenetConnector.SelectAFieldFirst=请先选择字段
-FilenetConnector.SelectAMatchType=请选择匹配类型
-FilenetConnector.NullTokensNotAllowed=令牌不能为Null
-FilenetConnector.AddMatchFor=添加匹配
-FilenetConnector.Equals=等于
-FilenetConnector.NotEquals=不等于
-FilenetConnector.Like=‘Like’ (通配符‘%’)
-FilenetConnector.Enabled=有效&nbsp;\n
-FilenetConnector.Disabled=无效\n
-FilenetConnector.DeleteAccessToken=删除访问令牌:  #
-FilenetConnector.AddAccessToken=添加访问令牌
-FilenetConnector.AllDocumentsInClass=类中所有文档
diff --git a/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetFactoryImpl.java b/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetFactoryImpl.java
deleted file mode 100644
index b04dd4b..0000000
--- a/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetFactoryImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: FilenetFactoryImpl.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.*;
-import java.rmi.server.UnicastRemoteObject;
-import java.util.*;
-
-/** This class mints IFilenet objects for clients, and does nothing else at all.
-*/
-public class FilenetFactoryImpl extends UnicastRemoteObject implements IFilenetFactory
-{
-  public static final String _rcsid = "@(#)$Id: FilenetFactoryImpl.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Instantiate */
-  public FilenetFactoryImpl()
-    throws RemoteException
-  {
-    super(0,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-  }
-
-  /** Mint a new IFilenet handle.
-  */
-  public IFilenet make()
-    throws RemoteException
-  {
-    return new FilenetImpl();
-  }
-}
diff --git a/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java b/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java
deleted file mode 100644
index f4de69a..0000000
--- a/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java
+++ /dev/null
@@ -1,632 +0,0 @@
-/* $Id: FilenetImpl.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.*;
-import java.rmi.server.UnicastRemoteObject;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import java.util.*;
-import java.io.*;
-
-
-import com.filenet.api.core.*;
-import com.filenet.api.util.UserContext;
-import com.filenet.api.collection.*;
-import com.filenet.api.meta.*;
-import com.filenet.api.admin.*;
-import com.filenet.api.query.*;
-import com.filenet.api.util.*;
-import com.filenet.api.exception.*;
-import com.filenet.api.security.*;
-import com.filenet.api.constants.*;
-import com.filenet.api.property.*;
-
-
-/** This class abstracts away from the filenet methods necessary to "do things" that
-* the crawler or authority needs to be done with the Filenet repository.
-*/
-public class FilenetImpl extends UnicastRemoteObject implements IFilenet
-{
-  public static final String _rcsid = "@(#)$Id: FilenetImpl.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  //Web service login module name
-  private static final String PARAM_LOGIN_MODULE = "FileNetP8WSI";
-  //Top level document class name
-  private static final String PARAM_ROOT_DOC_CLASSNAME = "Document";
-
-  private String userID = null;
-  private String password = null;
-  private String serverWsiURI=null;
-  private String fnDomainString=null;
-  private String objectStoreName=null;
-
-  private Connection conn = null;
-  private com.filenet.api.core.ObjectStore os = null;
-  private Domain fnDomain = null;
-  private UserContext uc =null;
-
-  /** Instantiate */
-  public FilenetImpl()
-    throws RemoteException
-  {
-    super(0,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-  }
-
-  /** Create a session.
-  *@param userID is the userID to use to establish the session.
-  *@param password is the password to use to establish the session.
-  *@param objectStore is the object store to use to establish the session.
-  *@param serverWSIURI is the URI to use to get to the server's web services.
-  */
-  public void createSession(String userID, String password, String domain, String objectStore, String serverWSIURI)
-    throws FilenetException, RemoteException
-  {
-    this.userID = userID;
-    this.password = password;
-    this.fnDomainString = domain;
-    this.serverWsiURI = serverWSIURI;
-    this.objectStoreName = objectStore;
-
-    // Now, set up the connection
-
-
-    try
-    {
-      conn = Factory.Connection.getConnection(serverWsiURI);
-      setConnectionCredentials();
-      //uc = UserContext.get();
-      //uc.setLocale(null);
-      //uc.pushSubject(UserContext.createSubject(conn, userName, password, PARAM_LOGIN_MODULE));
-      fnDomain = Factory.Domain.fetchInstance(conn,fnDomainString, null);
-      if (fnDomain == null)
-        throw new FilenetException("Could not locate FileNet domain '"+fnDomain+"'");
-      os = Factory.ObjectStore.fetchInstance(fnDomain, objectStoreName, null);
-      if (os == null)
-        throw new FilenetException("Could not locate FileNet objectstore '"+objectStoreName+"'");
-    }
-    catch(EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      ExceptionCode code = e.getExceptionCode();
-      if (code.equals(ExceptionCode.TRANSPORT_WSI_NETWORK_ERROR))
-        throw new FilenetException("Transport error: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_SERVICEINTERRUPTION);
-      if (code.equals(ExceptionCode.SECURITY_WSI_NO_LOGIN_MODULES_SUCCEEDED))
-        throw new FilenetException("Login failure: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_BADCREDENTIALS);
-      if (code.equals(ExceptionCode.API_INVALID_URI))
-        throw new FilenetException("Invalid URI error connecting to FileNet: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():"")+" This probably means your connection parameters are incorrect.",FilenetException.TYPE_BADCONNECTIONPARAMS);
-      throw new FilenetException("Runtime exception connecting to FileNet: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("Exception connecting to FileNet: "+e.getMessage());
-    }
-
-  }
-
-
-  /** Delete a session.
-  */
-  public void destroySession()
-    throws FilenetException, RemoteException
-  {
-    userID = null;
-    password = null;
-    serverWsiURI = null;
-    fnDomainString = null;
-    objectStoreName = null;
-    fnDomain = null;
-    os = null;
-    conn = null;
-  }
-
-  /** Check if there is a working connection.
-  */
-  public void checkConnection()
-    throws FilenetException, RemoteException
-  {
-    // Establishing a working session is enough to test connectivity
-  }
-
-  /** Get the set of folder names that are children of the specified folder path. */
-  public String[] getChildFolders(String[] parentFolderPath)
-    throws FilenetException, RemoteException
-  {
-    setConnectionCredentials();
-    // Start at root.
-    Folder currentFolder = os.get_RootFolder();
-    // Work our way down through the path.  If the path turns out to be invalid,
-    // we return null.
-    int i = 0;
-    while (i < parentFolderPath.length)
-    {
-      // For each path segment, find the matching child folder
-      FolderSet folderSet = currentFolder.get_SubFolders();
-      currentFolder = null;
-      Iterator fldrIter = folderSet.iterator();
-      while (fldrIter.hasNext())
-      {
-        Folder folder = (Folder)fldrIter.next();
-        if (folder.get_FolderName().equals(parentFolderPath[i]))
-        {
-          currentFolder = folder;
-          break;
-        }
-      }
-      
-      // Found no folder object with the correct name; the setup must have changed.
-      if (currentFolder == null)
-        return null;
-      
-      i++;
-    }
-    
-    // We've located the correct parent folder object.  Construct a list of children to return.
-    ArrayList rval = new ArrayList();
-    FolderSet children = currentFolder.get_SubFolders();
-    Iterator childFolderIterator = children.iterator();
-    while (childFolderIterator.hasNext())
-    {
-      Folder child = (Folder)childFolderIterator.next();
-      rval.add(child.get_FolderName());
-    }
-    
-    String[] rvalArray = new String[rval.size()];
-    rval.toArray(rvalArray);
-    return rvalArray;
-  }
-  
-  /** Get the set of available document classes. */
-  public DocumentClassDefinition[] getDocumentClassesDetails()
-    throws FilenetException, RemoteException
-  {
-    DocumentClassDefinition[] oDocClasses=null;
-    setConnectionCredentials();
-
-    ArrayList docClasses = getFNDocClasses(PARAM_ROOT_DOC_CLASSNAME);
-    docClasses.add(new DocumentClassDefinition(PARAM_ROOT_DOC_CLASSNAME,PARAM_ROOT_DOC_CLASSNAME));
-    oDocClasses = new DocumentClassDefinition[docClasses.size()];
-    docClasses.toArray((DocumentClassDefinition[]) oDocClasses);
-
-    return oDocClasses;
-  }
-
-  /** Get the set of available metadata fields per document class */
-  public MetadataFieldDefinition[] getDocumentClassMetadataFieldsDetails(String documentClassName)
-    throws FilenetException, RemoteException
-  {
-    MetadataFieldDefinition[] oProps =null;
-    ArrayList propDescs = new ArrayList();
-    PropertyDescriptionList pdescs=null;
-    setConnectionCredentials();
-    int i=0;
-
-    try
-    {
-      PropertyFilter pf = new PropertyFilter();
-      pf.addIncludeType(0, null, Boolean.TRUE, FilteredPropertyType.ANY, null);
-
-      ClassDescription classDesc = (ClassDescription)Factory.ClassDescription.fetchInstance(os, documentClassName, pf);
-      if (classDesc != null)
-      {
-        pdescs = classDesc.get_PropertyDescriptions();
-        PropertyDescription propDesc = null;
-        Iterator iter = pdescs.iterator();
-        while (iter.hasNext())
-        {
-          propDesc = (PropertyDescription) iter.next();
-          MetadataFieldDefinition mdf = new MetadataFieldDefinition(propDesc.get_DisplayName(),propDesc.get_SymbolicName());
-          propDescs.add(mdf);
-        }
-      }
-    }
-    catch (EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      throw new FilenetException("Runtime exception getting document class properties: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("FileNet exception getting document class properties: "+e.getMessage());
-    }
-    oProps = new MetadataFieldDefinition[propDescs.size()];
-    propDescs.toArray(oProps);
-
-    return oProps;
-  }
-
-  /** Execute a sql statement against FileNet and return the matching object id's */
-  public String[] getMatchingObjectIds(String sql)
-    throws RemoteException, FilenetException
-  {
-    setConnectionCredentials();
-
-    HashMap docIds = new HashMap();
-
-    SearchSQL sqlObject = new SearchSQL();
-    sqlObject.setQueryString(sql);
-    // System.out.println("Sql string is: "+sql);
-    SearchScope searchScope = new SearchScope(os);
-
-    // Uses fetchRows to test the SQL statement.
-    try
-    {
-      // System.out.println("Fetching rows");
-      RepositoryRowSet rowSet = searchScope.fetchRows(sqlObject, null, null, new Boolean(true));
-      Iterator iter = rowSet.iterator();
-      while (iter.hasNext())
-      {
-        // System.out.println("Found a row");
-        RepositoryRow row = (RepositoryRow) iter.next();
-        String docId = row.getProperties().get("Id").getIdValue().toString();
-        docIds.put(docId,docId);
-      }
-    }
-    catch (EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      ExceptionCode code = e.getExceptionCode();
-      if (code.equals(ExceptionCode.TRANSPORT_WSI_NETWORK_ERROR))
-        throw new FilenetException("Transport error: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_SERVICEINTERRUPTION);
-      if (code.equals(ExceptionCode.SECURITY_WSI_NO_LOGIN_MODULES_SUCCEEDED))
-        throw new FilenetException("Login failure: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_BADCREDENTIALS);
-      if (code.equals(ExceptionCode.E_ACCESS_DENIED))
-        throw new FilenetException("Access denied getting document information: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_NOTALLOWED);
-      throw new FilenetException("Runtime exception getting matching object ids: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("Query failed: '" + sql + "':" + e.getMessage(),e);
-    }
-
-    String[] rval = new String[docIds.size()];
-    Iterator iter = docIds.keySet().iterator();
-    int i = 0;
-    while (iter.hasNext())
-    {
-      String docId = (String)iter.next();
-      rval[i] = docId;
-      i++;
-    }
-
-    return rval;
-  }
-
-  /** Get the document content information given an object id.  Will return null if the version id is not a current document version id. */
-  public Integer getDocumentContentCount(String docId)
-    throws RemoteException, FilenetException
-  {
-    setConnectionCredentials();
-    try
-    {
-      com.filenet.api.core.Document doc = Factory.Document.fetchInstance(os, docId, null);
-      if (doc == null)
-        return null;
-      ContentElementList elements = doc.get_ContentElements();
-      int count = elements.size();
-      return new Integer(count);
-    }
-    catch (EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      ExceptionCode code = e.getExceptionCode();
-      if (code.equals(ExceptionCode.TRANSPORT_WSI_NETWORK_ERROR))
-        throw new FilenetException("Transport error: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_SERVICEINTERRUPTION);
-      if (code.equals(ExceptionCode.SECURITY_WSI_NO_LOGIN_MODULES_SUCCEEDED))
-        throw new FilenetException("Login failure: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_BADCREDENTIALS);
-      if (code.equals(ExceptionCode.E_ACCESS_DENIED))
-        throw new FilenetException("Access denied getting content information: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_NOTALLOWED);
-      if (code.equals(ExceptionCode.API_NO_CONTENT_ELEMENTS))
-        return new Integer(0);
-      if (code.equals(ExceptionCode.E_OBJECT_NOT_FOUND))
-        return null;
-      throw new FilenetException("Runtime exception getting content information: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("Content count request failed: '" + docId + "':" + e.getMessage(),e);
-    }
-  }
-
-  /** Get document information for a given filenet document.  Will return null if the version id is not a current document version id.
-  * The metadataFields hashmap is keyed by document class, and contains as a value either Boolean(true) (meaning "all"), or a String[] that has the
-  * list of fields desired. */
-  public FileInfo getDocumentInformation(String docId, Map<String,Object> metadataFields)
-    throws FilenetException, RemoteException
-  {
-    //System.out.println("Looking for document information on "+docId);
-    setConnectionCredentials();
-    try
-    {
-      com.filenet.api.core.Document doc = Factory.Document.fetchInstance(os, docId, null);
-      if (doc == null)
-      {
-        //System.out.println(" For "+docId+", null object return");
-        return null;
-      }
-      if(!(doc.get_IsCurrentVersion().booleanValue()))
-      {
-        //System.out.println(" For "+docId+",isCurrent() is false");
-        return null;
-      }
-      //else
-      //      System.out.println("For "+docId+" isCurrent() is true");
-
-      String docClass = doc.getClassName();
-      FileInfo rval = new FileInfo(docClass);
-
-      //System.out.println("Got class name for "+docId);
-      Object metadataObject = metadataFields.get(docClass);
-      if (metadataObject != null && metadataObject instanceof Boolean)
-      {
-        // "All metadata"
-        com.filenet.api.property.Properties props = doc.getProperties();
-        Iterator iter = props.iterator();
-        while (iter.hasNext())
-        {
-          com.filenet.api.property.Property prop = (com.filenet.api.property.Property)iter.next();
-          String sPropName = prop.getPropertyName();
-          Object objPropVal = prop.getObjectValue();
-          if (objPropVal != null)
-            rval.addMetadataValue(sPropName, objPropVal.toString());
-        }
-      }
-      else if (metadataObject != null)
-      {
-        String[] fields = (String[])metadataObject;
-        for (int j=0; j < fields.length; j++)
-        {
-          String sPropName = fields[j];
-          try
-          {
-            //System.out.println("Getting properties for "+docId);
-            Object objPropVal = doc.getProperties().getObjectValue(sPropName);
-            if (objPropVal != null)
-              rval.addMetadataValue(sPropName,objPropVal.toString());
-          }
-          catch (Exception e)
-          {
-            // Is this what happens when you ask for a property that doesn't exist?  Ask - MHL
-          }
-        }
-      }
-      else
-      {
-        // It's a kind of document we didn't want
-        return null;
-      }
-
-      //System.out.println("Getting permissions for "+docId);
-      AccessPermissionList apl = doc.get_Permissions();
-      //System.out.println("Got permissions for "+docId);
-      Iterator iter = apl.iterator();
-      while (iter.hasNext())
-      {
-        AccessPermission ap = (AccessPermission)iter.next();
-        AccessType at = ap.get_AccessType();
-        int atval = at.getValue();
-        int am = ap.get_AccessMask().intValue();
-        int tmp = AccessLevel.VIEW_AS_INT;
-
-        if ((am & tmp) ==  tmp && (atval==AccessType.ALLOW_AS_INT || atval==AccessType.DENY_AS_INT))
-        {
-
-          String gname = ap.get_GranteeName();
-          // System.out.println("Docid "+docId+" has view access for "+gname);
-          if (!gname.equals("#AUTHENTICATED-USERS"))
-          {
-            //System.out.println("Getting user "+gname);
-            SecurityPrincipalType gtype = ap.get_GranteeType();
-            if (gtype.getValue() == SecurityPrincipalType.USER_AS_INT) {
-              User usr = Factory.User.fetchInstance(conn, gname, null);
-              if (usr != null) {
-                String sid = usr.get_Id();
-                if (atval == AccessType.ALLOW_AS_INT)
-                  rval.addAclValue(sid);
-                else if (atval == AccessType.DENY_AS_INT)
-                  rval.addDenyAclValue(sid);
-              }
-            } else {
-              Group grp = Factory.Group.fetchInstance(conn, gname, null);
-              if (grp != null) {
-                String sid = grp.get_Id();
-                if (atval == AccessType.ALLOW_AS_INT)
-                  rval.addAclValue(sid);
-                else if (atval == AccessType.DENY_AS_INT)
-                  rval.addDenyAclValue(sid);
-              }
-            }
-          }
-          else
-          {
-            if (atval == AccessType.ALLOW_AS_INT)
-              // Still trying to verify that this SID means the right thing in this context
-              rval.addAclValue("S-1-1-0");
-            else if (atval == AccessType.DENY_AS_INT)
-              rval.addDenyAclValue("S-1-1-0");
-          }
-        }
-        // else
-        //      System.out.println("Docid "+docId+" has access level "+Integer.toString(am)+" with type "+Integer.toString(atval));
-      }
-      // System.out.println("DocId "+docId+" has "+Integer.toString(rval.getAclCount())+" acls");
-      return rval;
-    }
-    catch (EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      ExceptionCode code = e.getExceptionCode();
-      if (code.equals(ExceptionCode.E_OBJECT_NOT_FOUND))
-      {
-        //System.out.println(" For "+docId+", OBJECT_NOT_FOUND exception");
-        return null;
-      }
-      if (code.equals(ExceptionCode.TRANSPORT_WSI_NETWORK_ERROR))
-        throw new FilenetException("Transport error: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_SERVICEINTERRUPTION);
-      if (code.equals(ExceptionCode.SECURITY_WSI_NO_LOGIN_MODULES_SUCCEEDED))
-        throw new FilenetException("Login failure: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_BADCREDENTIALS);
-      if (code.equals(ExceptionCode.E_ACCESS_DENIED))
-        throw new FilenetException("Access denied getting document information: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_NOTALLOWED);
-      throw new FilenetException("Runtime exception getting document information: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("Get document information failed:" + e.getMessage(),e);
-    }
-
-  }
-
-  /** Get document contents */
-  public void getDocumentContents(String docId, int elementNumber, String tempFileName)
-    throws FilenetException, RemoteException
-  {
-    setConnectionCredentials();
-    try
-    {
-      com.filenet.api.core.Document doc =  Factory.Document.fetchInstance(os, docId, null);
-      if (doc != null)
-      {
-
-        ContentElementList elements = doc.get_ContentElements();
-        Iterator iter = elements.iterator();
-
-        // There are multiple documents per "document version" possible in filenet.
-        ContentTransfer element = null;
-        int i = 0;
-        while ( iter.hasNext())
-        {
-          element = (ContentTransfer)iter.next();
-          if (i == elementNumber)
-            break;
-          i++;
-        }
-
-        if (element == null)
-          throw new FilenetException("Could not locate element "+Integer.toString(elementNumber)+" in document '"+docId+"'");
-
-        File f = new File(tempFileName);
-
-        InputStream is = element.accessContentStream();
-        try
-        {
-          // Copy the document to the temporary file so described, and return
-          OutputStream os = new FileOutputStream(f);
-          try
-          {
-            byte[] byteBuffer = new byte[65536];
-            while (true)
-            {
-              int amt = is.read(byteBuffer);
-              if (amt == -1)
-                break;
-              os.write(byteBuffer,0,amt);
-            }
-          }
-          finally
-          {
-            os.close();
-          }
-        }
-        catch (IOException e)
-        {
-          f.delete();
-          throw new FilenetException("Could not read file from FileNet for document '"+docId+"': "+e.getMessage(),e);
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Do nothing
-          }
-        }
-      }
-      else
-        throw new FilenetException("Unknown file: '"+docId+"'");
-    }
-    catch (EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      ExceptionCode code = e.getExceptionCode();
-      if (code.equals(ExceptionCode.E_OBJECT_NOT_FOUND))
-        throw new FilenetException("File not found: '"+docId+"'");
-      if (code.equals(ExceptionCode.TRANSPORT_WSI_NETWORK_ERROR))
-        throw new FilenetException("Transport error: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_SERVICEINTERRUPTION);
-      if (code.equals(ExceptionCode.SECURITY_WSI_NO_LOGIN_MODULES_SUCCEEDED))
-        throw new FilenetException("Login failure: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_BADCREDENTIALS);
-      if (code.equals(ExceptionCode.E_ACCESS_DENIED))
-        throw new FilenetException("Access denied getting document contents: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""),FilenetException.TYPE_NOTALLOWED);
-      throw new FilenetException("Runtime exception getting document contents: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("Get document contents failed:" + e.getMessage(),e);
-    }
-
-  }
-
-
-  // Protected methods
-
-  protected void setConnectionCredentials()
-  {
-    uc = UserContext.get();
-    //uc.setLocale(null);
-    uc.pushSubject(UserContext.createSubject(conn, userID, password, PARAM_LOGIN_MODULE));
-  }
-
-  protected ArrayList getFNDocClasses(String rootClass)
-    throws FilenetException
-  {
-    ArrayList al = new ArrayList();
-
-    try
-    {
-      ClassDefinition classDef = Factory.ClassDefinition.fetchInstance(os, rootClass, null);
-      ClassDefinitionSet cds = classDef.get_ImmediateSubclassDefinitions();
-      ClassDefinition clsDesc = null;
-      Iterator iter = cds.iterator();
-      if (iter != null){
-        while (iter.hasNext()){
-          clsDesc = (ClassDefinition) iter.next();
-          al.addAll(getFNDocClasses(clsDesc.get_SymbolicName()));
-          DocumentClassDefinition dc = new DocumentClassDefinition(clsDesc.get_DisplayName(),clsDesc.get_SymbolicName());
-          al.add(dc);
-        }
-      }
-    }
-    catch (EngineRuntimeException e)
-    {
-      Throwable e2 = e.getCause();
-      throw new FilenetException("Runtime exception getting FileNet class definition details: "+e.getMessage()+((e2!=null)?": "+e2.getMessage():""));
-    }
-    catch(Exception e)
-    {
-      throw new FilenetException("Exception getting FileNet class definition details: "+e.getMessage());
-    }
-    return al;
-  }
-
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/DocumentClassDefinition.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/DocumentClassDefinition.java
deleted file mode 100644
index e03e268..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/DocumentClassDefinition.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id: DocumentClassDefinition.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-public class DocumentClassDefinition extends NameDescription
-{
-  public static final String _rcsid = "@(#)$Id: DocumentClassDefinition.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public DocumentClassDefinition(String displayName, String symbolicName)
-  {
-    super(displayName,symbolicName);
-  }
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FileInfo.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FileInfo.java
deleted file mode 100644
index 21a7934..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FileInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id: FileInfo.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.util.*;
-
-public class FileInfo implements java.io.Serializable
-{
-  public static final String _rcsid = "@(#)$Id: FileInfo.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected String docClass;
-  protected HashMap metadataValues = new HashMap();
-  protected HashMap aclValues = new HashMap();
-  protected HashMap denyAclValues = new HashMap();
-
-  public FileInfo(String docClass)
-  {
-    this.docClass = docClass;
-  }
-
-  public void addMetadataValue(String metadataName, String metadataValue)
-  {
-    metadataValues.put(metadataName,metadataValue);
-  }
-
-  public void addAclValue(String aclValue)
-  {
-    aclValues.put(aclValue,aclValue);
-  }
-
-  public void addDenyAclValue(String aclValue)
-  {
-    denyAclValues.put(aclValue,aclValue);
-  }
-
-  public String getDocClass()
-  {
-    return docClass;
-  }
-
-  public int getMetadataCount()
-  {
-    return metadataValues.size();
-  }
-
-  public Iterator getMetadataIterator()
-  {
-    return metadataValues.keySet().iterator();
-  }
-
-  public String getMetadataValue(String metadataName)
-  {
-    return (String)metadataValues.get(metadataName);
-  }
-
-  public int getAclCount()
-  {
-    return aclValues.size();
-  }
-
-  public Iterator getAclIterator()
-  {
-    return aclValues.keySet().iterator();
-  }
-
-  public int getDenyAclCount()
-  {
-    return denyAclValues.size();
-  }
-
-  public Iterator getDenyAclIterator()
-  {
-    return denyAclValues.keySet().iterator();
-  }
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FileSeedInfo.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FileSeedInfo.java
deleted file mode 100644
index dd32bc7..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FileSeedInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: FileSeedInfo.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.util.*;
-
-public class FileSeedInfo implements java.io.Serializable
-{
-  public static final String _rcsid = "@(#)$Id: FileSeedInfo.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected String docId;
-  protected int elementCount;
-
-  public FileSeedInfo(String docId, int elementCount)
-  {
-    this.docId = docId;
-    this.elementCount = elementCount;
-  }
-
-  public String getDocId()
-  {
-    return docId;
-  }
-
-  public int getElementCount()
-  {
-    return elementCount;
-  }
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetException.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetException.java
deleted file mode 100644
index daddc0a..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetException.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $Id: FilenetException.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-public class FilenetException extends Exception
-{
-  public static final String _rcsid = "@(#)$Id: FilenetException.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Classes of exception
-  public static final int TYPE_SERVICEINTERRUPTION = 0;
-  public static final int TYPE_BADCREDENTIALS = 1;
-  public static final int TYPE_BADCONNECTIONPARAMS = 2;
-  public static final int TYPE_NOTALLOWED = 3;
-  public static final int TYPE_GENERAL = 4;
-
-  protected int errType;
-
-  public FilenetException(String errString)
-  {
-    super(errString);
-    errType = TYPE_GENERAL;
-  }
-
-  public FilenetException(String errString, Throwable cause)
-  {
-    super(errString,cause);
-    errType = TYPE_GENERAL;
-  }
-
-  public FilenetException(Throwable cause)
-  {
-    super(cause);
-    errType = TYPE_GENERAL;
-  }
-
-  public FilenetException(String errString, int errType)
-  {
-    super(errString);
-    this.errType = errType;
-  }
-
-  public FilenetException(String errString, Throwable cause, int errType)
-  {
-    super(errString,cause);
-    this.errType = errType;
-  }
-
-  public FilenetException(Throwable cause, int errType)
-  {
-    super(cause);
-    this.errType = errType;
-  }
-
-  public int getType()
-  {
-    return errType;
-  }
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java
deleted file mode 100644
index b2e79d1..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/* $Id: IFilenet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.*;
-import java.util.*;
-
-/** This class abstracts away from the filenet methods necessary to "do things" that
-* the crawler or authority needs to be done with the Filenet repository.  The purpose for breaking this
-* out is to permit the Filenet invocation to be RMI based, because it relies
-* on too many specific versions of jars.
-*
-* One of the tricks needed is to preserve session.  This is handled at this level by explicitly passing a
-* session string around.  The session string is created on the remote JVM, and is subsequently used to describe
-* the individual session we care about from the client side.
-*/
-public interface IFilenet extends Remote
-{
-  public static final String _rcsid = "@(#)$Id: IFilenet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Create a session.
-  *@param userID is the userID to use to establish the session.
-  *@param password is the password to use to establish the session.
-  *@param domain is the filenet domain of the user and password.
-  *@param objectStore is the object store to use to establish the session.
-  *@param serverWSIURI is the URI to use to get to the server's web services.
-  */
-  public void createSession(String userID, String password, String domain, String objectStore, String serverWSIURI)
-    throws FilenetException, RemoteException;
-
-  /** Delete a session.
-  */
-  public void destroySession()
-    throws FilenetException, RemoteException;
-
-  /** Check if there is a working connection.
-  */
-  public void checkConnection()
-    throws FilenetException, RemoteException;
-
-  /** Get the set of folder names that are children of the specified folder path. */
-  public String[] getChildFolders(String[] parentFolderPath)
-    throws FilenetException, RemoteException;
-
-  /** Get the set of available document classes
-  */
-  public DocumentClassDefinition[] getDocumentClassesDetails()
-    throws FilenetException, RemoteException;
-
-  /** Get the set of available metadata fields per document class
-  */
-  public MetadataFieldDefinition[] getDocumentClassMetadataFieldsDetails(String documentClassName)
-    throws FilenetException, RemoteException;
-
-  /** Execute a sql statement against FileNet and return the matching object id's */
-  public String[] getMatchingObjectIds(String sql)
-    throws RemoteException, FilenetException;
-
-  /** Get the document content information given an object id.  Will return null if the version id is not a current document version id. */
-  public Integer getDocumentContentCount(String docId)
-    throws RemoteException, FilenetException;
-
-  /** Get document information for a given filenet document.  Will return null if the version id is not a current document version id.
-  * The metadataFields hashmap is keyed by document class, and contains as a value either null (meaning "all"), or a String[] that has the
-  * list of fields desired. */
-  public FileInfo getDocumentInformation(String docId, Map<String,Object> metadataFields)
-    throws FilenetException, RemoteException;
-
-  /** Get document contents */
-  public void getDocumentContents(String docId, int elementNumber, String tempFileName)
-    throws FilenetException, RemoteException;
-
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenetFactory.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenetFactory.java
deleted file mode 100644
index ca7bbda..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenetFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id: IFilenetFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.*;
-
-/** This interface describes a factory for producing remote IFilenet objects under the auspices of RMI.
-* If we decide to use the Activation Framework, this interface will not be needed.  Its sole function
-* is to grab a new IFilenet handle.
-*/
-public interface IFilenetFactory extends Remote
-{
-  public static final String _rcsid = "@(#)$Id: IFilenetFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Mint a new IFilenet handle.
-  */
-  public IFilenet make()
-    throws RemoteException;
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/LocalClientSocket.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/LocalClientSocket.java
deleted file mode 100644
index ddf0978..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/LocalClientSocket.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $Id: LocalClientSocket.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.server.*;
-import java.net.*;
-import java.io.IOException;
-
-/** This class wraps Socket and does not permit it to be directed to connect anywhere other than to localhost.
-*/
-public class LocalClientSocket extends Socket
-{
-  public static final String _rcsid = "@(#)$Id: LocalClientSocket.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected static InetAddress loopbackAddress;
-
-  static
-  {
-    try
-    {
-      loopbackAddress = InetAddress.getByAddress(new byte[]{127,0,0,1});
-    }
-    catch (UnknownHostException e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  protected int currentPort;
-
-  /** Constructor */
-  public LocalClientSocket(int port)
-    throws IOException
-  {
-    super(loopbackAddress,port);
-    currentPort = port;
-  }
-
-  public void connect(SocketAddress endpoint)
-    throws IOException
-  {
-    int thisPort = currentPort;
-    if (endpoint instanceof InetSocketAddress)
-      thisPort = ((InetSocketAddress)endpoint).getPort();
-    endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-    super.connect(endpoint);
-  }
-
-  public void connect(SocketAddress endpoint, int timeout)
-    throws IOException
-  {
-    int thisPort = currentPort;
-    if (endpoint instanceof InetSocketAddress)
-      thisPort = ((InetSocketAddress)endpoint).getPort();
-    endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-    super.connect(endpoint,timeout);
-  }
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/MetadataFieldDefinition.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/MetadataFieldDefinition.java
deleted file mode 100644
index 180efad..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/MetadataFieldDefinition.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id: MetadataFieldDefinition.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-public class MetadataFieldDefinition extends NameDescription
-{
-  public static final String _rcsid = "@(#)$Id: MetadataFieldDefinition.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public MetadataFieldDefinition(String displayName, String symbolicName)
-  {
-    super(displayName,symbolicName);
-  }
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/NameDescription.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/NameDescription.java
deleted file mode 100644
index 6fdff66..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/NameDescription.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id: NameDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-public class NameDescription implements java.io.Serializable
-{
-  public static final String _rcsid = "@(#)$Id: NameDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected String displayName;
-  protected String symbolicName;
-
-  public NameDescription(String displayName, String symbolicName)
-  {
-    this.displayName = displayName;
-    this.symbolicName = symbolicName;
-  }
-
-  public String getDisplayName()
-  {
-    return displayName;
-  }
-
-  public String getSymbolicName()
-  {
-    return symbolicName;
-  }
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/RMILocalClientSocketFactory.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/RMILocalClientSocketFactory.java
deleted file mode 100644
index a30c722..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/RMILocalClientSocketFactory.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id: RMILocalClientSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.server.*;
-import java.net.*;
-import java.io.IOException;
-
-/** This factory mints client-side sockets.  I've created one so the $%^&* rmi world doesn't attempt
-* to connect to anything other than localhost (127.0.0.1).
-*/
-public class RMILocalClientSocketFactory implements RMIClientSocketFactory, java.io.Serializable
-{
-  public static final String _rcsid = "@(#)$Id: RMILocalClientSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Constructor */
-  public RMILocalClientSocketFactory()
-  {
-  }
-
-  /** The method that mints a socket of the right kind.
-  */
-  public Socket createSocket(String host, int port)
-    throws IOException
-  {
-    return new LocalClientSocket(port);
-  }
-
-  /** The contract makes us implement equals and hashcode */
-  public boolean equals(Object o)
-  {
-    return (o instanceof RMILocalClientSocketFactory);
-  }
-
-  /** Hashcode consistent with equals() */
-  public int hashCode()
-  {
-    // All classes of this kind have the same number (randomly picked)
-    return 258475;
-  }
-
-
-}
diff --git a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/RMILocalSocketFactory.java b/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/RMILocalSocketFactory.java
deleted file mode 100644
index a8a0d37..0000000
--- a/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/RMILocalSocketFactory.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id: RMILocalSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.common.filenet;
-
-import java.rmi.server.*;
-import java.net.*;
-import java.io.IOException;
-
-/** This class is the main server class, which gets run to start the rmi service that talks to Filenet.
-*/
-public class RMILocalSocketFactory implements RMIServerSocketFactory
-{
-  public static final String _rcsid = "@(#)$Id: RMILocalSocketFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected static InetAddress loopbackAddress;
-
-  static
-  {
-    try
-    {
-      loopbackAddress = InetAddress.getByAddress(new byte[]{127,0,0,1});
-    }
-    catch (UnknownHostException e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  /** Create a socket attached to the specified port.  0 means an anonymous port. */
-  public ServerSocket createServerSocket(int port)
-    throws IOException
-  {
-    return new LocalServerSocket(port);
-  }
-
-  /** The contract makes us implement equals and hashcode */
-  public boolean equals(Object o)
-  {
-    return (o instanceof RMILocalSocketFactory);
-  }
-
-  /** Hashcode consistent with equals() */
-  public int hashCode()
-  {
-    // All classes of this kind have the same number (randomly picked)
-    return 258476;
-  }
-
-  /** This is a localhost-bound implementation of ServerSocket */
-  protected static class LocalServerSocket extends ServerSocket
-  {
-    protected int currentPort;
-
-    /** Constructor.  We only use the one, so the rest are immaterial. */
-    public LocalServerSocket(int port)
-      throws IOException
-    {
-      super(port);
-      currentPort = port;
-    }
-
-    /** Override the bind operation, to make sure we only bind to localhost */
-    public void bind(java.net.SocketAddress endpoint)
-      throws IOException
-    {
-      int thisPort = currentPort;
-      if (endpoint instanceof InetSocketAddress)
-        thisPort = ((InetSocketAddress)endpoint).getPort();
-      endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-      super.bind(endpoint);
-    }
-
-    /** Override the bind operation, to make sure we only bind to localhost */
-    public void bind(java.net.SocketAddress endpoint, int backlog)
-      throws IOException
-    {
-      int thisPort = currentPort;
-      if (endpoint instanceof InetSocketAddress)
-        thisPort = ((InetSocketAddress)endpoint).getPort();
-      endpoint = new InetSocketAddress(loopbackAddress,thisPort);
-      super.bind(endpoint,backlog);
-    }
-  }
-}
diff --git a/connectors/filenet/lib-proprietary/README.txt b/connectors/filenet/lib-proprietary/README.txt
deleted file mode 100644
index 9e9da29..0000000
--- a/connectors/filenet/lib-proprietary/README.txt
+++ /dev/null
@@ -1,31 +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.
-
-Portions of the FileNet connector need to be compiled against a set of jars
-delivered along with the FileNet API.  The version of the API seems to matter;
-bugs are pretty rampant, and small point releases seem to be needed to correct them.
-
-Copy the filenet API jars into this directory, and build the connector using the
-provided ant build, and all processes should be built properly.  For some versions
-of P8, there is a dependency on WASP, whose location you will need to specify
-as an environment variable when you start the filenet connector server process.
-See the "how-to-build-and-deploy.html" documentation page for details.
-
-The version of the jars this connector was tested against code from Filenet
-P8 API 4.0.0 (P8CE-4.0.0-002-Win), and later with P8 4.5.0.  The jars were re-labeled
-with the prefix "ibm-" to avoid collision with the names of other jars, since many
-of them were common with other packages such as xerces, but had been modified
-in some way.
-
diff --git a/connectors/filenet/registry-scripts/run.bat b/connectors/filenet/registry-scripts/run.bat
deleted file mode 100644
index a3e2ca0..0000000
--- a/connectors/filenet/registry-scripts/run.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME and MCF_HOME are set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist "%MCF_HOME%\properties.xml" goto nolcfhome

-rem save existing path here

-set OLDDIR=%CD%

-cd "%MCF_HOME%\..\processes\filenet-registry"

-set CLASSPATH=.

-for %%f in (lib/*) do call setclasspath.bat %%f

-rem restore old path here

-cd "%OLDDIR%"

-"%JAVA_HOME%\bin\java" -Xmx32m -Xms32m -classpath "%CLASSPATH%" org.apache.manifoldcf.crawler.registry.filenet.Filenet

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Environment variable MCF_HOME is not set properly.

-goto done

-:done

diff --git a/connectors/filenet/registry-scripts/run.sh b/connectors/filenet/registry-scripts/run.sh
deleted file mode 100644
index e7cab9b..0000000
--- a/connectors/filenet/registry-scripts/run.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    PATHSEP=";"
-else
-    PATHSEP=":"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f "$MCF_HOME"/properties.xml ] ; then
-    
-        # Build the classpath
-        CLASSPATH=""
-        for filename in $(ls -1 "$MCF_HOME"/../processes/filenet-registry/lib) ; do
-            if [ -n "$CLASSPATH" ] ; then
-                CLASSPATH="$CLASSPATH""$PATHSEP""$MCF_HOME"/../processes/filenet-registry/lib/"$filename"
-            else
-                CLASSPATH="$MCF_HOME"/../processes/filenet-registry/lib/"$filename"
-            fi
-        done
-        
-        "$JAVA_HOME/bin/java" -Xmx32m -Xms32m -cp "$CLASSPATH" org.apache.manifoldcf.crawler.registry.filenet.Filenet
-        exit $?
-        
-    else
-        echo "Environment variable MCF_HOME is not properly set." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/connectors/filenet/registry-scripts/setclasspath.bat b/connectors/filenet/registry-scripts/setclasspath.bat
deleted file mode 100644
index 72264c8..0000000
--- a/connectors/filenet/registry-scripts/setclasspath.bat
+++ /dev/null
@@ -1,16 +0,0 @@
-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-set CLASSPATH=%CLASSPATH%;%MCF_HOME%\..\processes\filenet-registry\lib\%1

diff --git a/connectors/filenet/registry/src/main/java/org/apache/manifoldcf/crawler/registry/filenet/Filenet.java b/connectors/filenet/registry/src/main/java/org/apache/manifoldcf/crawler/registry/filenet/Filenet.java
deleted file mode 100644
index 69f9ab5..0000000
--- a/connectors/filenet/registry/src/main/java/org/apache/manifoldcf/crawler/registry/filenet/Filenet.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id: Filenet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.registry.filenet;
-
-import java.rmi.*;
-import org.apache.manifoldcf.crawler.common.filenet.RMILocalSocketFactory;
-import org.apache.manifoldcf.crawler.common.filenet.RMILocalClientSocketFactory;
-
-/** This class is the main registry class, which gets run to start the registry service that handles Documentum server communication.
-* I needed to create my own since the rmiregistry utility did not let me override the java security policy.
-*/
-public class Filenet
-{
-  public static final String _rcsid = "@(#)$Id: Filenet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private Filenet()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    try
-    {
-      java.rmi.registry.Registry r = java.rmi.registry.LocateRegistry.createRegistry(8305,new RMILocalClientSocketFactory(),new RMILocalSocketFactory());
-      // Registry started OK
-      System.out.println("FileNet Registry started and awaiting connections.");
-      // Sleep forever, until process is externally terminated
-      while (true)
-      {
-        Thread.sleep(10000L);
-      }
-    }
-    catch (InterruptedException e)
-    {
-    }
-    catch (RemoteException er)
-    {
-      System.err.println("Remote exception in FileNet.main: " + er);
-      er.printStackTrace(System.err);
-    }
-  }
-}
diff --git a/connectors/filenet/server-scripts/run.bat b/connectors/filenet/server-scripts/run.bat
deleted file mode 100644
index d70da10..0000000
--- a/connectors/filenet/server-scripts/run.bat
+++ /dev/null
@@ -1,40 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME and MCF_HOME are set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist "%MCF_HOME%\properties.xml" goto nolcfhome

-rem save existing path here

-set OLDDIR=%CD%

-cd "%MCF_HOME%\..\processes\filenet-server"

-set CLASSPATH=.

-for %%f in (lib/*) do call setclasspath.bat %%f lib

-for %%f in (lib-proprietary/*.jar) do call setclasspath.bat %%f lib-proprietary

-rem restore old path here

-cd "%OLDDIR%"

-set WASP_STATEMENT=

-if defined WASP_HOME set WASP_STATEMENT="-Dwasp.location=%WASP_HOME%"

-set LIB_STATEMENT=

-if defined JAVA_LIB_PATH set LIB_STATEMENT="-Djava.library.path=%JAVA_LIB_PATH%"

-"%JAVA_HOME%\bin\java" -Xmx512m -Xms32m %WASP_STATEMENT% %LIB_STATEMENT% -classpath "%CLASSPATH%" org.apache.manifoldcf.crawler.server.filenet.Filenet

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Environment variable MCF_HOME is not set properly.

-goto done

-:done

diff --git a/connectors/filenet/server-scripts/run.sh b/connectors/filenet/server-scripts/run.sh
deleted file mode 100644
index 99c344a..0000000
--- a/connectors/filenet/server-scripts/run.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    PATHSEP=";"
-else
-    PATHSEP=":"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f "$MCF_HOME"/properties.xml ] ; then
-    
-        # Build the classpath
-        CLASSPATH=""
-        for filename in $(ls -1 "$MCF_HOME"/../processes/filenet-server/lib) ; do
-            if [ -n "$CLASSPATH" ] ; then
-                CLASSPATH="$CLASSPATH""$PATHSEP""$MCF_HOME"/../processes/filenet-server/lib/"$filename"
-            else
-                CLASSPATH="$MCF_HOME"/../processes/filenet-server/lib/"$filename"
-            fi
-        done
-
-        for filename in $(ls -1 "$MCF_HOME"/../processes/filenet-server/lib-proprietary | grep "\.jar$") ; do
-            if [ -n "$CLASSPATH" ] ; then
-                CLASSPATH="$CLASSPATH""$PATHSEP""$MCF_HOME"/../processes/filenet-server/lib-proprietary/"$filename"
-            else
-                CLASSPATH="$MCF_HOME"/../processes/filenet-server/lib-proprietary/"$filename"
-            fi
-        done
-
-        WASP_STATEMENT=""
-        if [[ $WASP_HOME != "" ]] ; then
-            WASP_STATEMENT=-Dwasp.location="WASP_HOME"
-        fi
-        LIB_STATEMENT=""
-        if [[ $JAVA_LIB_PATH != "" ]] ; then
-            LIB_STATEMENT=-Djava.library.path="$JAVA_LIB_PATH"
-        fi
-        "$JAVA_HOME/bin/java" -Xmx512m -Xms32m $WASP_STATEMENT $LIB_STATEMENT -cp "$CLASSPATH" org.apache.manifoldcf.crawler.server.filenet.Filenet
-        exit $?
-        
-    else
-        echo "Environment variable MCF_HOME is not properly set." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/connectors/filenet/server-scripts/setclasspath.bat b/connectors/filenet/server-scripts/setclasspath.bat
deleted file mode 100644
index 9b36ec0..0000000
--- a/connectors/filenet/server-scripts/setclasspath.bat
+++ /dev/null
@@ -1,16 +0,0 @@
-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-set CLASSPATH=%CLASSPATH%;%MCF_HOME%\..\processes\filenet-server\%2\%1

diff --git a/connectors/filenet/server/README.txt b/connectors/filenet/server/README.txt
deleted file mode 100644
index ddf6ff6..0000000
--- a/connectors/filenet/server/README.txt
+++ /dev/null
@@ -1,34 +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.
-
-The filenet-server process depends on the FileNet API.
-
-In order to run the filenet-server process, you must install a
-version of the FileNet API on your system, and then locate the pertinent jars.
-Copy all the jars that are needed to run your version of the API into this directory, and
-start the process using the supplied "run" scripts.
-
-If you find there are incompatibilities between your version of DFC and the one your
-ManifoldCF release was built against, you must build ManifoldCF yourself, and include
-a copy of the API prior to building, in the directory connectors/filenet/lib-proprietary.
-
-Read the "how-to-build-and-deploy.html" document for details.
-
-
-
-
-
-
-
diff --git a/connectors/filenet/server/src/main/java/org/apache/manifoldcf/crawler/server/filenet/Filenet.java b/connectors/filenet/server/src/main/java/org/apache/manifoldcf/crawler/server/filenet/Filenet.java
deleted file mode 100644
index 1b72106..0000000
--- a/connectors/filenet/server/src/main/java/org/apache/manifoldcf/crawler/server/filenet/Filenet.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id: Filenet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.server.filenet;
-
-import java.rmi.*;
-import org.apache.manifoldcf.crawler.common.filenet.*;
-import java.net.*;
-
-/** This class is the main server class, which gets run to start the rmi service that talks to Filenet.
-*/
-public class Filenet
-{
-  public static final String _rcsid = "@(#)$Id: Filenet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private Filenet()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    try
-    {
-      FilenetFactoryImpl factory = new FilenetFactoryImpl();
-      Naming.rebind("//127.0.0.1:8305/filenet_factory", factory);
-      // sets the handle
-      System.out.println("FileNet Server started and awaiting connections.");
-      while (true)
-      {
-        Thread.sleep(600000L);
-      }
-    }
-    catch (InterruptedException e)
-    {
-    }
-    catch (RemoteException er)
-    {
-      System.err.println("Remote exception in FileNet.main: " + er);
-      er.printStackTrace(System.err);
-    }
-    catch (MalformedURLException er)
-    {
-      System.err.println("Exception in FileNet.main: " + er);
-      er.printStackTrace(System.err);
-    }
-
-  }
-}
diff --git a/connectors/filesystem/.gitignore b/connectors/filesystem/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/filesystem/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/filesystem/build.xml b/connectors/filesystem/build.xml
deleted file mode 100644
index 4a66194..0000000
--- a/connectors/filesystem/build.xml
+++ /dev/null
@@ -1,44 +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.
--->
-
-<project name="filesystem" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="File system"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"/>
-        </antcall>
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="File system"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.filesystem.FileOutputConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConfig.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConfig.java
deleted file mode 100644
index e3aa630..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConfig.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id: FileOutputConfig.java 1299512 2013-05-31 22:59:38Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-
-import java.util.Locale;
-
-
-public class FileOutputConfig extends FileOutputParam {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = -2071290103498352538L;
-
-  /** Parameters used for the configuration */
-  final private static ParameterEnum[] CONFIGURATIONLIST = {};
-
-  /** Build a set of ElasticSearchParameters by reading ConfigParams. If the
-   * value returned by ConfigParams.getParameter is null, the default value is
-   * set.
-   * 
-   * @param params
-   */
-  public FileOutputConfig(ConfigParams params)
-  {
-    super(CONFIGURATIONLIST);
-    for (ParameterEnum param : CONFIGURATIONLIST) {
-      String value = params.getParameter(param.name());
-      if (value == null) {
-        value = param.defaultValue;
-      }
-      put(param, value);
-    }
-  }
-
-  /**
-   * @param variableContext
-   * @param parameters
-   */
-  public final static void contextToConfig(IPostParameters variableContext, ConfigParams parameters) {
-    for (ParameterEnum param : CONFIGURATIONLIST) {
-      String p = variableContext.getParameter(param.name().toLowerCase(Locale.ROOT));
-      if (p != null) {
-        parameters.setParameter(param.name(), p);
-      }
-    }
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
deleted file mode 100644
index be4332a..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
+++ /dev/null
@@ -1,886 +0,0 @@
-/* $Id: FileOutputConnector.java 991374 2013-05-31 23:04:08Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.InputStream;
-import java.io.BufferedReader;
-import java.io.StringReader;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.SystemUtils;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import java.nio.channels.ClosedChannelException;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.output.BaseOutputConnector;
-import org.apache.manifoldcf.agents.system.Logging;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-
-public class FileOutputConnector extends BaseOutputConnector {
-
-  public static final String _rcsid = "@(#)$Id: FileOutputConnector.java 988245 2010-08-23 18:39:35Z minoru $";
-
-  // Activities we log
-
-  /** Ingestion activity */
-  public final static String INGEST_ACTIVITY = "document ingest";
-  /** Document removal activity */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-
-  // Activities list
-  protected static final String[] activitiesList = new String[]{INGEST_ACTIVITY, REMOVE_ACTIVITY};
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIGURATION_HTML = "editConfiguration.html";
-
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-
-  /** Forward to the javascript to check the specification parameters for the job */
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-
-  /** Forward to the template to edit the configuration parameters for the job */
-  private static final String EDIT_SPECIFICATION_HTML = "editSpecification.html";
-
-  /** Forward to the template to view the specification parameters for the job */
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  /** Constructor.
-   */
-  public FileOutputConnector() {
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-   *@return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return activitiesList;
-  }
-
-  /** Connect.
-   *@param configParameters is the set of configuration parameters, which
-   * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-   * out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParameters) {
-    super.connect(configParameters);
-  }
-
-  /** Close the connection.  Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    super.disconnect();
-  }
-
-  /** Set up a session */
-  protected void getSession() throws ManifoldCFException, ServiceInterruption {
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-   *@return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      getSession();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Transient error: "+e.getMessage();
-    }
-  }
-
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-   * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-   * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-   * is used to describe the version of the actual document.
-   *
-   * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-   * necessary.
-   *@param spec is the current output specification for the job that is doing the crawling.
-   *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-   * the document will not need to be sent again to the output data store.
-   */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec) throws ManifoldCFException, ServiceInterruption {
-    FileOutputSpecs specs = new FileOutputSpecs(getSpecNode(spec));
-    return new VersionContext(specs.toVersionString(),params,spec);
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-   * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-   * necessary.
-   * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-   * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-   * an output description string in order to determine what should be done.
-   *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-   * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-   *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-   *@param document is the document data to be processed (handed to the output data store).
-   *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-   *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-   *@return the document status (accepted or permanently rejected).
-   */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities) throws ManifoldCFException, ServiceInterruption, IOException {
-    // Establish a session
-    getSession();
-
-    FileOutputConfig config = getConfigParameters(null);
-
-    FileOutputSpecs specs = new FileOutputSpecs(getSpecNode(outputDescription.getSpecification()));;
-    StringBuffer path = new StringBuffer();
-
-    String errorCode = "OK";
-    String errorDesc = null;
-
-    try {
-      /*
-        * make file path
-        */
-      if (specs.getRootPath() != null) {
-        path.append(specs.getRootPath());
-      }
-        
-      // If the path does not yet exist at the root level, it is dangerous to create it.
-      File currentPath = new File(path.toString());
-      if (!currentPath.exists())
-        throw new ManifoldCFException("Root path does not yet exist: '"+currentPath+"'");
-      if (!currentPath.isDirectory())
-        throw new ManifoldCFException("Root path is not a directory: '"+currentPath+"'");
-        
-      String filePath = documentURItoFilePath(documentURI);
-        
-      // Build path one level at a time.  This is needed because there may be a collision at
-      // every level.
-      int index = 0;
-      while (true)
-      {
-        int currentIndex = filePath.indexOf("/",index);
-        if (currentIndex == -1)
-          break;
-        String dirName = filePath.substring(index,currentIndex);
-        File newPath = new File(currentPath, dirName);
-        index = currentIndex + 1;
-        int suffix = 1;
-        while (true)
-        {
-          if (newPath.exists() && newPath.isDirectory())
-            break;
-          // Try to create it.  If we fail, check if it now exists as a file.
-          if (newPath.mkdir())
-            break;
-          // Hmm, didn't create.  If it is a file, we suffered a collision, so try again with ".N" as a suffix.
-          if (newPath.exists())
-          {
-            if (newPath.isDirectory())
-              break;
-            newPath = new File(currentPath, dirName + "." + suffix);
-            suffix++;
-          }
-          else
-          {
-              errorCode = activities.CREATED_DIRECTORY;
-              errorDesc = "Could not create directory '\"+newPath+\"'.  Permission issue?";
-              throw new ManifoldCFException(errorDesc);
-          }
-        }
-        // Directory successfully created!
-        currentPath = newPath;
-        // Go on to the next one.
-      }
-        
-      // Path successfully created.  Now create file.
-      FileOutputStream output = null;
-      String fileName = filePath.substring(index);
-      File outputPath = new File(currentPath, fileName);
-      int fileSuffix = 1;
-      while (true)
-      {
-        try
-        {
-          output = new FileOutputStream(outputPath);
-          break;
-        }
-        catch (FileNotFoundException e)
-        {
-          // Figure out why it could not be created.
-          if (outputPath.exists() && !outputPath.isFile())
-          {
-            // try a new file
-            outputPath = new File(currentPath, fileName + "." + fileSuffix);
-            fileSuffix++;
-            continue;
-          }
-          // Probably some other error
-          errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = "Could not create file '" + outputPath + "': " +e.getMessage();
-          throw new ManifoldCFException(errorDesc,e);
-        }
-      }
-
-      try {
-        /*
-          * lock file
-          */
-        FileChannel channel = output.getChannel();
-        FileLock lock = channel.tryLock();
-        if (lock == null){
-          errorCode = ServiceInterruption.class.getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = "Could not lock file: '"+outputPath+"'";
-          throw new ServiceInterruption(errorDesc,null,1000L,-1L,10,false);
-        }
-
-
-        try {
-
-          /*
-            * write file
-            */
-          InputStream input = document.getBinaryStream();
-          byte buf[] = new byte[65536];
-          int len;
-          while((len = input.read(buf)) != -1) {
-            output.write(buf, 0, len);
-          }
-          output.flush();
-        } finally {
-          // Unlock
-          try {
-            if (lock != null) {
-              lock.release();
-            }
-          } catch (ClosedChannelException e) {
-          }
-        }
-      } finally {
-        try {
-          output.close();
-        } catch (IOException e) {
-        }
-      }
-    } catch (URISyntaxException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleURISyntaxException(e);
-      return DOCUMENTSTATUS_REJECTED;
-    } catch (FileNotFoundException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleFileNotFoundException(e);
-      return DOCUMENTSTATUS_REJECTED;
-    } catch (SecurityException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleSecurityException(e);
-      return DOCUMENTSTATUS_REJECTED;
-    } catch (IOException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleIOException(e);
-      return DOCUMENTSTATUS_REJECTED;
-    } finally {
-        activities.recordActivity(null, INGEST_ACTIVITY, new Long(document.getBinaryLength()), documentURI, errorCode, errorDesc);
-    }
-
-    return DOCUMENTSTATUS_ACCEPTED;
-  }
-
-  protected static void handleURISyntaxException(URISyntaxException e)
-    throws ManifoldCFException, ServiceInterruption {
-    Logging.agents.error("FileSystem: URISyntaxException: "+e.getMessage(),e);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-
-  protected static void handleSecurityException(SecurityException e)
-    throws ManifoldCFException, ServiceInterruption {
-    Logging.agents.error("FileSystem: SecurityException: "+e.getMessage(),e);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-
-  protected static void handleFileNotFoundException(FileNotFoundException e)
-    throws ManifoldCFException, ServiceInterruption {
-    Logging.agents.error("FileSystem: Path is illegal: "+e.getMessage(),e);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-
-  /** Handle IOException */
-  protected static void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    }
-    long currentTime = System.currentTimeMillis();
-    Logging.agents.warn("FileSystem: IO exception: "+e.getMessage(),e);
-    throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L,-1,false);
-  }
-
-  /** Remove a document using the connector.
-   * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-   *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-   * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-   *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-   *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-   */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities) throws ManifoldCFException, ServiceInterruption {
-    // Establish a session
-    getSession();
-
-    String errorCode = "OK";
-    String errorDesc = null;
-
-    FileOutputConfig config = getConfigParameters(null);
-
-    FileOutputSpecs specs = new FileOutputSpecs(outputDescription);
-
-    StringBuffer path = new StringBuffer();
-    try {
-
-      if(specs.getRootPath() != null) {
-        path.append(specs.getRootPath());
-      }
-
-      // We cannot remove documents, because it is unsafe to do so.
-      // Paths that were created when the document existed will not
-      // be found if it goes away.  So we have to leave a grave marker,
-      // in this case a zero-length file, instead.
-      
-      // If the path does not yet exist at the root level, it is dangerous to create it.
-      File currentPath = new File(path.toString());
-      if (!currentPath.exists())
-        return;
-      if (!currentPath.isDirectory())
-        return;
-      
-      String filePath = documentURItoFilePath(documentURI);
-      
-      // Build path one level at a time.  This is needed because there may be a collision at
-      // every level.  If we don't find a directory where we expect it, we just exit.
-      int index = 0;
-      while (true)
-      {
-        int currentIndex = filePath.indexOf("/",index);
-        if (currentIndex == -1)
-          break;
-        String dirName = filePath.substring(index,currentIndex);
-        File newPath = new File(currentPath, dirName);
-        index = currentIndex + 1;
-        int suffix = 1;
-        while (true)
-        {
-          if (!newPath.exists())
-            return;
-          if (newPath.isDirectory())
-            break;
-          // It's a file.  Move on to the next one.
-          newPath = new File(currentPath, dirName + "." + suffix);
-          suffix++;
-        }
-        // Directory successfully created!
-        currentPath = newPath;
-        // Go on to the next level.
-      }
-      
-      // Path found.  Now, see if we can find the file to null out.
-      FileOutputStream output = null;
-      String fileName = filePath.substring(index);
-      File outputPath = new File(currentPath, fileName);
-      int fileSuffix = 1;
-      while (true)
-      {
-        if (!outputPath.exists())
-          return;
-        if (!outputPath.isFile())
-        {
-          // Try a new one
-          outputPath = new File(currentPath, fileName + "." + fileSuffix);
-          fileSuffix++;
-          continue;
-        }
-        // Null it out!
-        try
-        {
-          output = new FileOutputStream(outputPath);
-          break;
-        }
-        catch (FileNotFoundException e)
-        {
-          // Probably some other error
-          errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = "Couldn't delete the file due to:" + e.getMessage();
-          throw new ManifoldCFException("Could not zero out file '"+outputPath+"': "+e.getMessage(),e);
-        }
-      }
-      // Just close it, to make a zero-length grave marker.
-      output.close();
-    } catch (URISyntaxException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to delete document due to: " + e.getMessage();
-      handleURISyntaxException(e);
-    } catch (FileNotFoundException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to delete document due to: " + e.getMessage();
-      handleFileNotFoundException(e);
-    } catch (SecurityException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to delete document due to: " + e.getMessage();
-      handleSecurityException(e);
-    } catch (IOException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to delete document due to: " + e.getMessage();
-      handleIOException(e);
-    } finally {
-        activities.recordActivity(null, REMOVE_ACTIVITY, null, documentURI, errorCode, errorDesc);
-    }
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    super.outputSpecificationHeader(out, locale, os, connectionSequenceNumber, tabsArray);
-    tabsArray.add(Messages.getString(locale, "FileConnector.PathTabName"));
-    outputResource(EDIT_SPECIFICATION_JS, out, locale, null, null, new Integer(connectionSequenceNumber), null);
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-    super.outputSpecificationBody(out, locale, os, connectionSequenceNumber, actualSequenceNumber, tabName);
-    FileOutputSpecs specs = getSpecParameters(os);
-    outputResource(EDIT_SPECIFICATION_HTML, out, locale, specs, tabName, new Integer(connectionSequenceNumber), new Integer(actualSequenceNumber));
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    ConfigurationNode specNode = getSpecNode(os);
-    boolean bAdd = (specNode == null);
-    if (bAdd) {
-      specNode = new SpecificationNode(FileOutputConstant.PARAM_ROOTPATH);
-    }
-    FileOutputSpecs.contextToSpecNode(variableContext, specNode, connectionSequenceNumber);
-    if (bAdd) {
-      os.addChild(os.getChildCount(), specNode);
-    }
-
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-    outputResource(VIEW_SPECIFICATION_HTML, out, locale, getSpecParameters(os), null, new Integer(connectionSequenceNumber), null);
-  }
-
-  /**
-   * @param os
-   * @return
-   */
-  final private SpecificationNode getSpecNode(Specification os)
-  {
-    int l = os.getChildCount();
-    for (int i = 0; i < l; i++) {
-      SpecificationNode node = os.getChild(i);
-      if (node.getType().equals(FileOutputConstant.PARAM_ROOTPATH)) {
-        return node;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @param os
-   * @return
-   * @throws ManifoldCFException
-   */
-  final private FileOutputSpecs getSpecParameters(Specification os) throws ManifoldCFException {
-    return new FileOutputSpecs(getSpecNode(os));
-  }
-
-  /**
-   * @param configParams
-   * @return
-   */
-  final private FileOutputConfig getConfigParameters(ConfigParams configParams) {
-    if (configParams == null)
-      configParams = getConfiguration();
-    return new FileOutputConfig(configParams);
-  }
-
-  /** Read the content of a resource, replace the variable ${PARAMNAME} with the
-   * value and copy it to the out.
-   * 
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException */
-  private static void outputResource(String resName, IHTTPOutput out, Locale locale, FileOutputParam params, String tabName,
-    Integer sequenceNumber, Integer currentSequenceNumber) throws ManifoldCFException {
-    Map<String,String> paramMap = null;
-    if (params != null) {
-      paramMap = params.buildMap();
-      if (tabName != null) {
-        paramMap.put("TabName", tabName);
-      }
-      if (currentSequenceNumber != null)
-        paramMap.put("SelectedNum", currentSequenceNumber.toString());
-    }
-    else
-    {
-      paramMap = new HashMap<String,String>();
-    }
-    if (sequenceNumber != null)
-      paramMap.put("SeqNum", sequenceNumber.toString());
-    Messages.outputResourceWithVelocity(out, locale, resName, paramMap, true);
-  }
-
-  /**
-   * @param documentURI
-   * @return
-   * @throws URISyntaxException
-   * @throws NullPointerException
-   */
-  final private String documentURItoFilePath(String documentURI) throws URISyntaxException, NullPointerException {
-    StringBuffer path = new StringBuffer();
-    URI uri = new URI(documentURI);
-    if (SystemUtils.IS_OS_WINDOWS)
-      windowsFileName(path, uri);
-    else
-      unixFileName(path, uri);
-    return path.toString();
-  }
-  
-  final private void windowsFileName(final StringBuffer path, final URI uri) {
-    // Illegal characters: \ / : * ? " < > |
-    boolean endsWithSlash = false;
-    if (uri.getScheme() != null) {
-      path.append(uri.getScheme());
-      path.append("/");
-      endsWithSlash = true;
-    }
-
-    if (uri.getHost() != null) {
-      path.append(uri.getHost());
-      endsWithSlash = false;
-      if (uri.getPort() != -1) {
-        path.append("_");
-        path.append(uri.getPort());
-      }
-      if (uri.getRawPath() != null) {
-        if (uri.getRawPath().length() == 0) {
-          path.append("/");
-          endsWithSlash = true;
-        } else if (uri.getRawPath().equals("/")) {
-          path.append(uri.getRawPath());
-          endsWithSlash = false;
-        } else {
-          for (String name : uri.getRawPath().split("/")) {
-            if (name.length() > 0) {
-              path.append("/");
-              path.append(convertWindowsString(name));
-              endsWithSlash = false;
-            }
-          }
-        }
-      }
-      if (uri.getRawQuery() != null) {
-        path.append("/");
-        path.append(convertWindowsString(uri.getRawQuery()));
-        endsWithSlash = false;
-      }
-    } else {
-      if (uri.getRawSchemeSpecificPart() != null) {
-        for (String name : uri.getRawSchemeSpecificPart().split("/")) {
-          if (name.length() > 0) {
-            path.append("/");
-            path.append(convertWindowsString(name));
-            endsWithSlash = false;
-          }
-        }
-      }
-    }
-
-    if (endsWithSlash) {
-      path.append(".content");
-    }
-  }
-  
-  final private String convertWindowsString(final String input) {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < input.length(); i++) {
-      char c = input.charAt(i);
-      // Handle filename disallowed special characters!
-      if (c == ':' || c == '/' || c == '\\' | c == '*' | c == '"' | c == '?' | c == '|' || c == '<' || c == '>') {
-        sb.append('_');
-      }
-      else
-        sb.append(c);
-    }
-    return sb.toString();
-  }
-
-  final private void unixFileName(final StringBuffer path, final URI uri) {
-    boolean endsWithSlash = false;
-    if (uri.getScheme() != null) {
-      path.append(uri.getScheme());
-      path.append("/");
-      endsWithSlash = true;
-    }
-
-    if (uri.getHost() != null) {
-      path.append(uri.getHost());
-      endsWithSlash = false;
-      if (uri.getPort() != -1) {
-        path.append(":");
-        path.append(uri.getPort());
-      }
-      if (uri.getRawPath() != null) {
-        if (uri.getRawPath().length() == 0) {
-          path.append("/");
-          endsWithSlash = true;
-        } else if (uri.getRawPath().equals("/")) {
-          path.append(uri.getRawPath());
-          endsWithSlash = false;
-        } else {
-          for (String name : uri.getRawPath().split("/")) {
-            if (name.length() > 0) {
-              path.append("/");
-              path.append(convertUnixString(name));
-              endsWithSlash = false;
-            }
-          }
-        }
-      }
-      if (uri.getRawQuery() != null) {
-        path.append("?");
-        path.append(convertUnixString(uri.getRawQuery()));
-        endsWithSlash = false;
-      }
-    } else {
-      if (uri.getRawSchemeSpecificPart() != null) {
-        for (String name : uri.getRawSchemeSpecificPart().split("/")) {
-          if (name.length() > 0) {
-            path.append("/");
-            path.append(convertUnixString(name));
-            endsWithSlash = false;
-          }
-        }
-      }
-    }
-
-    if (endsWithSlash) {
-      path.append(".content");
-    }
-  }
-  
-  final private String convertUnixString(final String input) {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < input.length(); i++) {
-      char c = input.charAt(i);
-      // Handle filename disallowed special characters!
-      if (c == ':') {
-        // MHL for what really happens to colons
-      }
-      else
-        sb.append(c);
-    }
-    return sb.toString();
-  }
-  
-  protected static class FileOutputSpecs extends FileOutputParam {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1859652730572662025L;
-
-    final public static ParameterEnum[] SPECIFICATIONLIST = {
-      ParameterEnum.ROOTPATH
-    };
-
-    private final String rootPath;
-
-    /** Build a set of parameters from a packed version string.
-     *
-     * @param versionString composed of "packed" output specification parameters.
-     * @throws ManifoldCFException
-     */
-    public FileOutputSpecs(String versionString) throws ManifoldCFException {
-      super(SPECIFICATIONLIST);
-      int index = 0;
-      for (ParameterEnum param : SPECIFICATIONLIST) {
-        StringBuilder sb = new StringBuilder();
-        index = unpack(sb, versionString, index, '+');
-        put(param, sb.toString());
-      }
-      this.rootPath = this.getRootPath();
-    }
-
-    /** Build a set of ElasticSearch parameters by reading an instance of
-     * SpecificationNode.
-     * 
-     * @param node
-     * @throws ManifoldCFException
-     */
-    public FileOutputSpecs(ConfigurationNode node) throws ManifoldCFException {
-      super(SPECIFICATIONLIST);
-      String rootPath = null;
-      for (ParameterEnum param : SPECIFICATIONLIST) {
-        String value = null;
-        if (node != null) {
-          value = node.getAttributeValue(param.name());
-        }
-        if (value == null) {
-          value = param.defaultValue;
-        }
-        put(param, value);
-      }
-      rootPath = getRootPath();
-      this.rootPath = rootPath;
-    }
-
-    /**
-     * @param variableContext
-     * @param specNode
-     */
-    public static void contextToSpecNode(IPostParameters variableContext, ConfigurationNode specNode, int sequenceNumber) {
-      for (ParameterEnum param : SPECIFICATIONLIST) {
-        String p = variableContext.getParameter("s"+sequenceNumber+"_"+param.name().toLowerCase(Locale.ROOT));
-        if (p != null) {
-          specNode.setAttribute(param.name(), p);
-        }
-      }
-    }
-
-    /** @return a version string representation of the parameter list */
-    public String toVersionString() {
-      StringBuilder sb = new StringBuilder();
-      pack(sb,rootPath,'+');
-      return sb.toString();
-    }
-
-    /**
-     * @return
-     */
-    public String getRootPath() {
-      return get(ParameterEnum.ROOTPATH);
-    }
-
-    /**
-     * @param content
-     * @return
-     * @throws ManifoldCFException
-     */
-    private final static TreeSet<String> createStringSet(String content) throws ManifoldCFException {
-      TreeSet<String> set = new TreeSet<String>();
-      BufferedReader br = null;
-      StringReader sr = null;
-      try {
-        sr = new StringReader(content);
-        br = new BufferedReader(sr);
-        String line = null;
-        while ((line = br.readLine()) != null) {
-          line = line.trim();
-          if (line.length() > 0) {
-            set.add(line);
-          }
-        }
-        return set;
-      } catch (IOException e) {
-        throw new ManifoldCFException(e);
-      } finally {
-        if (br != null) {
-          IOUtils.closeQuietly(br);
-        }
-      }
-    }
-
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConstant.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConstant.java
deleted file mode 100644
index 6627b92..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConstant.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id: FileOutputConstant.java 991374 2013-05-31 23:01:08Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.filesystem;
-
-
-/** Parameters and output data for File output connector.
- */
-public class FileOutputConstant
-{
-  public static final String _rcsid = "@(#)$Id: SolrConfig.java 991374 2010-08-31 22:32:08Z minoru $";
-
-  // Configuration parameters
-
-  /** Root path */
-  public static final String PARAM_ROOTPATH = "rootpath";
-
-}
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputParam.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputParam.java
deleted file mode 100644
index 8621e3c..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputParam.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: FileOutputParam.java 1299512 2013-05-31 22:59:38Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/** 
- * Parameters data for the elasticsearch output connector.
- */
-public class FileOutputParam extends HashMap<ParameterEnum, String>
-{
-  private static final long serialVersionUID = -140994685772720029L;
-
-
-  protected FileOutputParam(ParameterEnum[] params) {
-    super(params.length);
-  }
-
-  final public Map<String, String> buildMap() {
-    Map<String, String> rval = new HashMap<String, String>();
-    for (Map.Entry<ParameterEnum, String> entry : this.entrySet()) {
-      rval.put(entry.getKey().name(), entry.getValue());
-    }
-    return rval;
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/Messages.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/Messages.java
deleted file mode 100644
index 967501c..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1295926 2013-05-31 23:00:00Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.filesystem.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.output.filesystem";
-
-  /** Constructor - do no instantiate
-   */
-  protected Messages()
-  {
-  }
-
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String,String> substitutionParameters, boolean mapToUpperCase)
-          throws ManifoldCFException
-          {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-        substitutionParameters,mapToUpperCase);
-          }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String,String> substitutionParameters, boolean mapToUpperCase)
-          throws ManifoldCFException
-          {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-        substitutionParameters,mapToUpperCase);
-          }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String,Object> contextObjects)
-          throws ManifoldCFException
-          {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-        contextObjects);
-          }
-
-}
-
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/ParameterEnum.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/ParameterEnum.java
deleted file mode 100644
index 4131d49..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/ParameterEnum.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.filesystem;
-
-/** Parameters constants */
-public enum ParameterEnum {
-  ROOTPATH("");
-
-  final protected String defaultValue;
-
-  private ParameterEnum(String defaultValue) {
-    this.defaultValue = defaultValue;
-  }
-}
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java
deleted file mode 100644
index 0b993af..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java
+++ /dev/null
@@ -1,1307 +0,0 @@
-/* $Id: FileConnector.java 995085 2010-09-08 15:13:38Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.connectorcommon.extmimemap.ExtensionMimeMap;
-import java.util.*;
-import java.io.*;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Paths;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.BasicFileAttributes;
-
-/** This is the "repository connector" for a file system.  It's a relative of the share crawler, and should have
-* comparable basic functionality, with the exception of the ability to use ActiveDirectory and look at other shares.
-*/
-public class FileConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: FileConnector.java 995085 2010-09-08 15:13:38Z kwright $";
-
-  // Activities that we know about
-  protected final static String ACTIVITY_READ = "read document";
-
-  // Relationships we know about
-  protected static final String RELATIONSHIP_CHILD = "child";
-
-  // Activities list
-  protected static final String[] activitiesList = new String[]{ACTIVITY_READ};
-
-  // Parameters that this connector cares about
-  // public final static String ROOTDIRECTORY = "rootdirectory";
-
-  // Local data
-  // protected File rootDirectory = null;
-
-  /** Constructor.
-  */
-  public FileConnector()
-  {
-  }
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    return MODEL_CHAINED_ADD_CHANGE;
-  }
-
-  /** Return the list of relationship types that this connector recognizes.
-  *@return the list.
-  */
-  @Override
-  public String[] getRelationshipTypes()
-  {
-    return new String[]{RELATIONSHIP_CHILD};
-  }
-
-  /** List the activities we might report on.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** For any given document, list the bins that it is a member of.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-/*
-    // Note: This code is for testing, so we can see how documents behave when they are in various kinds of bin situations.
-    // The testing model is that there are documents belonging to "SLOW", to "FAST", or both to "SLOW" and "FAST" bins.
-    // The connector chooses which bins to assign a document to based on the identifier (which is the document's path), so
-    // this is something that should NOT be duplicated by other connector implementers.
-    if (documentIdentifier.indexOf("/BOTH/") != -1 || (documentIdentifier.indexOf("/SLOW/") != -1 && documentIdentifier.indexOf("/FAST/") != -1))
-      return new String[]{"SLOW","FAST"};
-    if (documentIdentifier.indexOf("/SLOW/") != -1)
-      return new String[]{"SLOW"};
-    if (documentIdentifier.indexOf("/FAST/") != -1)
-      return new String[]{"FAST"};
-*/
-    return new String[]{""};
-  }
-
-  /** Convert a document identifier to a URI.  The URI is the URI that will be the unique key from
-  * the search index, and will be presented to the user as part of the search results.
-  *@param filePath is the document filePath.
-  *@param repositoryPath is the document repositoryPath.
-  *@return the document uri.
-  */
-  protected static String convertToWGETURI(String path)
-    throws ManifoldCFException
-  {
-    //
-    // Note well:  This MUST be a legal URI!!!
-    try
-    {
-      StringBuffer sb = new StringBuffer();
-      String[] tmp = path.split("/", 3);
-      String scheme = "";
-      String host = "";
-      String other = "";
-      if (tmp.length >= 1)
-        scheme = tmp[0];
-      else
-        scheme = "http";
-      if (tmp.length >= 2)
-        host = tmp[1];
-      else
-        host = "localhost";
-      if (tmp.length >= 3)
-        other = "/" + tmp[2];
-      else
-        other = "/";
-      return new URI(scheme + "://" + host + other).toURL().toString();
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad url: "+e.getMessage(),e);
-    }
-    catch (URISyntaxException e)
-    {
-      throw new ManifoldCFException("Bad url: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Convert a document identifier to a URI.  The URI is the URI that will be the unique key from
-  * the search index, and will be presented to the user as part of the search results.
-  *@param documentIdentifier is the document identifier.
-  *@return the document uri.
-  */
-  protected static String convertToURI(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    //
-    // Note well:  This MUST be a legal URI!!!
-    try
-    {
-      return new File(documentIdentifier).toURI().toURL().toString();
-    }
-    catch (java.io.IOException e)
-    {
-      throw new ManifoldCFException("Bad url",e);
-    }
-  }
-
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      // Walk the specification for the "startpoint" types.  Amalgamate these into a list of strings.
-      // Presume that all roots are startpoint nodes
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode n = spec.getChild(i);
-        if (n.getType().equals("startpoint"))
-        {
-          // The id returned MUST be in canonical form!!!
-          String seed = new File(n.getAttributeValue("path")).getCanonicalPath();
-          if (Logging.connectors.isDebugEnabled())
-          {
-            Logging.connectors.debug("Seed = '"+seed+"'");
-          }
-          activities.addSeedDocument(seed);
-        }
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("Could not get a canonical path: "+e.getMessage(),e);
-    }
-    return "";
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      File file = new File(documentIdentifier);
-      if (!file.exists())
-      {
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-      
-      if (file.isDirectory())
-      {
-        // It's a directory.  The version ID would be the
-        // last modified date, except that doesn't work on Windows
-        // because modified dates are not transitive.
-        //long lastModified = file.lastModified();
-        //rval[i] = new Long(lastModified).toString();
-
-        // No versioning; just reference children
-        // Chained connectors scan parent nodes always
-        // Queue up stuff for directory
-        long startTime = System.currentTimeMillis();
-        String errorCode = null;
-        String errorDesc = null;
-        try
-        {
-          try
-          {
-            File[] files = file.listFiles();
-            if (files != null)
-            {
-              for (File f : files)
-              {
-                String canonicalPath = f.getCanonicalPath();
-                if (checkInclude(f,canonicalPath,spec))
-                  activities.addDocumentReference(canonicalPath,documentIdentifier,RELATIONSHIP_CHILD);
-              }
-            }
-            errorCode = "OK";
-          }
-          catch (IOException e)
-          {
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-          }
-        }
-        finally
-        {
-          if (errorCode != null)
-            activities.recordActivity(new Long(startTime),ACTIVITY_READ,null,documentIdentifier,errorCode,errorDesc,null);
-        }
-        continue;
-      }
-      
-      // It's a file
-      final Path path = file.toPath();
-      String versionString;
-      String convertPath;
-      long fileLength = file.length();
-      // Get the file's modified date.
-      long lastModified = file.lastModified();
-
-      // Check if the path is to be converted.  We record that info in the version string so that we'll reindex documents whose
-      // URI's change.
-      convertPath = findConvertPath(spec, file);
-      StringBuilder sb = new StringBuilder();
-      if (convertPath != null)
-      {
-        // Record the path.
-        sb.append("+");
-        pack(sb,convertPath,'+');
-      }
-      else
-        sb.append("-");
-      sb.append(new Long(lastModified).toString()).append(":").append(new Long(fileLength).toString());
-      versionString = sb.toString();
-    
-      if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-        continue;
-      
-      long startTime = System.currentTimeMillis();
-      String errorCode = null;
-      String errorDesc = null;
-      Long fileLengthLong = null;
-      try
-      {
-        // We've already avoided queuing documents that we don't want, based on file specifications.
-        // We still need to check based on file data.
-        if (!checkIngest(file,spec))
-        {
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-        
-        String fileName = file.getName();
-        final Date modifiedDate = new Date(file.lastModified());
-        String mimeType = mapExtensionToMimeType(fileName);
-        String uri;
-        if (convertPath != null) {
-          // WGET-compatible input; convert back to external URI
-          uri = convertToWGETURI(convertPath);
-        } else {
-          uri = convertToURI(documentIdentifier);
-        }
-
-        if (!activities.checkLengthIndexable(fileLength))
-        {
-          errorCode = activities.EXCLUDED_LENGTH;
-          errorDesc = "Excluded because of length ("+fileLength+")";
-          Logging.connectors.debug("Skipping file '"+documentIdentifier+"' because length was excluded by output connector.");
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-              
-        if (!activities.checkURLIndexable(uri))
-        {
-          errorCode = activities.EXCLUDED_URL;
-          errorDesc = "Excluded because of URL ('"+uri+"')";
-          Logging.connectors.debug("Skipping file '"+documentIdentifier+"' because URL was excluded by output connector.");
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-                
-        if (!activities.checkDateIndexable(modifiedDate))
-        {
-          errorCode = activities.EXCLUDED_DATE;
-          errorDesc = "Excluded because of date ("+modifiedDate+")";
-          Logging.connectors.debug("Skipping file '"+documentIdentifier+"' because date ("+modifiedDate+") was excluded by output connector.");
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-                
-        if (!activities.checkMimeTypeIndexable(mimeType))
-        {
-          errorCode = activities.EXCLUDED_MIMETYPE;
-          errorDesc = "Excluded because mime type ('"+mimeType+"')";
-          Logging.connectors.debug("Skipping file '"+documentIdentifier+"' because mime type ('"+mimeType+"') was excluded by output connector.");
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-
-        RepositoryDocument data = new RepositoryDocument();
-        data.setFileName(fileName);
-        data.setMimeType(mimeType);
-        data.setModifiedDate(modifiedDate);
-        if (convertPath != null) {
-          // WGET-compatible input; convert back to external URI
-          data.addField("uri",uri);
-        } else {
-          data.addField("uri",file.toString());
-        }
-        // MHL for other metadata
-        
-        // Ingest the document.
-        try
-        {
-          final BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class);
-          final Date createdDate = new Date(attributes.creationTime().toMillis());
-          data.setCreatedDate(createdDate);
-
-          InputStream is = new FileInputStream(file);
-          try
-          {
-            data.setBinary(is,fileLength);
-            activities.ingestDocumentWithException(documentIdentifier,versionString,uri,data);
-            errorCode = "OK";
-            fileLengthLong = new Long(fileLength);
-          }
-          finally
-          {
-            is.close();
-          }
-        }
-        catch (FileNotFoundException e)
-        {
-          //skip. throw nothing.
-          Logging.connectors.debug("Skipping file due to " +e.getMessage());
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-        catch (InterruptedIOException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (IOException e)
-        {
-          errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          errorDesc = e.getMessage();
-          throw new ManifoldCFException("IO Error: "+e.getMessage(),e);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          errorCode = null;
-        throw e;
-      }
-      finally
-      {
-        if (errorCode != null)
-          activities.recordActivity(new Long(startTime),ACTIVITY_READ,fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-      }
-    }
-  }
-
-  /** This method finds the part of the path that should be converted to a URI.
-  * Returns null if the path should not be converted.
-  *@param spec is the document specification.
-  *@param documentIdentifier is the document identifier.
-  *@return the part of the path to be converted, or null.
-  */
-  protected static String findConvertPath(Specification spec, File theFile)
-  {
-    String fullpath = theFile.getAbsolutePath().replaceAll("\\\\","/");
-    for (int j = 0; j < spec.getChildCount(); j++)
-    {
-      SpecificationNode sn = spec.getChild(j);
-      if (sn.getType().equals("startpoint"))
-      {
-        String path = sn.getAttributeValue("path").replaceAll("\\\\","/");
-        String convertToURI = sn.getAttributeValue("converttouri");
-        if (path.length() > 0 && convertToURI != null && convertToURI.equals("true"))
-        {
-          if (!path.endsWith("/"))
-            path += "/";
-          if (fullpath.startsWith(path))
-            return fullpath.substring(path.length());
-        }
-      }
-    }
-    return null;
-  }
-
-  /** Map an extension to a mime type */
-  protected static String mapExtensionToMimeType(String fileName)
-  {
-    int slashIndex = fileName.lastIndexOf("/");
-    if (slashIndex != -1)
-      fileName = fileName.substring(slashIndex+1);
-    int dotIndex = fileName.lastIndexOf(".");
-    if (dotIndex == -1)
-      return null;
-    return ExtensionMimeMap.mapToMimeType(fileName.substring(dotIndex+1).toLowerCase(java.util.Locale.ROOT));
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"FileConnector.Paths"));
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-    int k;
-
-    // Paths tab
-    if (tabName.equals(Messages.getString(locale,"FileConnector.Paths")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"3\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"FileConnector.Paths2") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.RootPath") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.ConvertToURI") + "<br/>" + Messages.getBodyString(locale,"FileConnector.ConvertToURIExample")+ "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.Rules") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("startpoint"))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          String pathOpName = seqPrefix+"specop"+pathDescription;
-
-          String path = sn.getAttributeValue("path");
-          String convertToURIString = sn.getAttributeValue("converttouri");
-
-          boolean convertToURI = false;
-          if (convertToURIString != null && convertToURIString.equals("true"))
-            convertToURI = true;
-
-          out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <input type=\"hidden\" name=\""+pathOpName+"\" value=\"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sn.getAttributeValue("path"))+"\"/>\n"+
-"            <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FileConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Delete\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")' alt=\""+Messages.getAttributeString(locale,"FileConnector.DeletePath")+Integer.toString(k)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(path)+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"converttouri"+pathDescription+"\" value=\""+(convertToURI?"true":"false")+"\">\n"+
-"            <nobr>\n"+
-"              "+(convertToURI?Messages.getBodyString(locale,"FileConnector.Yes"):Messages.getBodyString(locale,"FileConnector.No"))+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"specchildcount"+pathDescription+"\" value=\""+Integer.toString(sn.getChildCount())+"\"/>\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.IncludeExclude") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.FileDirectory") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.Match") + "</nobr></td>\n"+
-"              </tr>\n"
-          );
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode excludeNode = sn.getChild(j);
-            String instanceDescription = "_"+Integer.toString(k)+"_"+Integer.toString(j);
-            String instanceOpName = seqPrefix + "specop" + instanceDescription;
-
-            String nodeFlavor = excludeNode.getType();
-            String nodeType = excludeNode.getAttributeValue("type");
-            String nodeMatch = excludeNode.getAttributeValue("match");
-            out.print(
-"              <tr class=\"evenformrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FileConnector.InsertHere") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+instanceOpName+"\",\"Insert Here\",\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j+1)+"\")' alt=\""+Messages.getAttributeString(locale,"FileConnector.InsertNewMatchForPath")+Integer.toString(k)+" before position #"+Integer.toString(j)+"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"specflavor"+instanceDescription+"\">\n"+
-"                      <option value=\"include\">" + Messages.getBodyString(locale,"FileConnector.include") + "</option>\n"+
-"                      <option value=\"exclude\">" + Messages.getBodyString(locale,"FileConnector.exclude") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"spectype"+instanceDescription+"\">\n"+
-"                      <option value=\"file\">" + Messages.getBodyString(locale,"FileConnector.File") + "</option>\n"+
-"                      <option value=\"directory\">" + Messages.getBodyString(locale,"FileConnector.Directory") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"text\" size=\"10\" name=\""+seqPrefix+"specmatch"+instanceDescription+"\" value=\"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"+
-"              <tr class=\"oddformrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"hidden\" name=\""+instanceOpName+"\" value=\"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specfl"+instanceDescription+"\" value=\""+nodeFlavor+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specty"+instanceDescription+"\" value=\""+nodeType+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specma"+instanceDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nodeMatch)+"\"/>\n"+
-"                    <a name=\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j)+"\">\n"+
-"                      <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FileConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+instanceOpName+"\",\"Delete\",\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j)+"\")' alt=\""+Messages.getAttributeString(locale,"FileConnector.DeletePath")+Integer.toString(k)+", match spec #"+Integer.toString(j)+"\"/>\n"+
-"                    </a>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeFlavor+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeType+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(nodeMatch)+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"
-            );
-            j++;
-          }
-          if (j == 0)
-          {
-            out.print(
-"              <tr class=\"formrow\"><td class=\"formcolumnmessage\" colspan=\"4\">" + Messages.getBodyString(locale,"FileConnector.NoRulesDefined") + "</td></tr>\n"
-            );
-          }
-          out.print(
-"              <tr class=\"formrow\"><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"              <tr class=\"formrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <a name=\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j)+"\">\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FileConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Add\",\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j+1)+"\")' alt=\""+Messages.getAttributeString(locale,"FileConnector.AddNewMatchForPath")+Integer.toString(k)+"\"/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"specflavor"+pathDescription+"\">\n"+
-"                      <option value=\"include\">" + Messages.getBodyString(locale,"FileConnector.include") + "</option>\n"+
-"                      <option value=\"exclude\">" + Messages.getBodyString(locale,"FileConnector.exclude") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"spectype"+pathDescription+"\">\n"+
-"                      <option value=\"file\">" + Messages.getBodyString(locale,"FileConnector.File") + "</option>\n"+
-"                      <option value=\"directory\">" + Messages.getBodyString(locale,"FileConnector.Directory") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"text\" size=\"10\" name=\""+seqPrefix+"specmatch"+pathDescription+"\" value=\"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"+
-"            </table>\n"+
-"          </td>\n"+
-"        </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formcolumnmessage\" colspan=\"4\">" + Messages.getBodyString(locale,"FileConnector.NoDocumentsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"                <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"FileConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specop\",\"Add\",\""+seqPrefix+"path_"+Integer.toString(i+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"FileConnector.AddNewPath") + "\"/>\n"+
-"                <input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"                <input type=\"hidden\" name=\""+seqPrefix+"specop\" value=\"\"/>\n"+
-"              </a>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <input type=\"text\" size=\"30\" name=\""+seqPrefix+"specpath\" value=\"\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <input name=\""+seqPrefix+"converttouri\" type=\"checkbox\" value=\"true\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("startpoint"))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-
-          String path = sn.getAttributeValue("path");
-          String convertToURIString = sn.getAttributeValue("converttouri");
-
-          boolean convertToURI = false;
-          if (convertToURIString != null && convertToURIString.equals("true"))
-            convertToURI = true;
-
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(path)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"converttouri"+pathDescription+"\" value=\""+(convertToURI?"true":"false")+"\">\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specchildcount"+pathDescription+"\" value=\""+Integer.toString(sn.getChildCount())+"\"/>\n"
-          );
-
-          int j = 0;
-	  while (j < sn.getChildCount())
-	  {
-            SpecificationNode excludeNode = sn.getChild(j);
-            String instanceDescription = "_"+Integer.toString(k)+"_"+Integer.toString(j);
-
-            String nodeFlavor = excludeNode.getType();
-            String nodeType = excludeNode.getAttributeValue("type");
-            String nodeMatch = excludeNode.getAttributeValue("match");
-            out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfl"+instanceDescription+"\" value=\""+nodeFlavor+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specty"+instanceDescription+"\" value=\""+nodeType+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specma"+instanceDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nodeMatch)+"\"/>\n"
-            );
-            j++;
-          }
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-    
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String x = variableContext.getParameter(seqPrefix+"pathcount");
-    if (x != null)
-    {
-      ds.clearChildren();
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(x);
-      // Gather up these
-      int i = 0;
-      int k = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specop"+pathDescription;
-        x = variableContext.getParameter(pathOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Path inserts won't happen until the very end
-        String path = variableContext.getParameter(seqPrefix+"specpath"+pathDescription);
-        String convertToURI = variableContext.getParameter(seqPrefix+"converttouri"+pathDescription);
-
-        SpecificationNode node = new SpecificationNode("startpoint");
-        node.setAttribute("path",path);
-        if (convertToURI != null)
-          node.setAttribute("converttouri",convertToURI);
-
-        // Now, get the number of children
-        String y = variableContext.getParameter(seqPrefix+"specchildcount"+pathDescription);
-        int childCount = Integer.parseInt(y);
-        int j = 0;
-        int w = 0;
-        while (j < childCount)
-        {
-          String instanceDescription = "_"+Integer.toString(i)+"_"+Integer.toString(j);
-          // Look for an insert or a delete at this point
-          String instanceOp = seqPrefix+"specop"+instanceDescription;
-          String z = variableContext.getParameter(instanceOp);
-          String flavor;
-          String type;
-          String match;
-          SpecificationNode sn;
-          if (z != null && z.equals("Delete"))
-          {
-            // Process the deletion as we gather
-            j++;
-            continue;
-          }
-          if (z != null && z.equals("Insert Here"))
-          {
-            // Process the insertion as we gather.
-            flavor = variableContext.getParameter(seqPrefix+"specflavor"+instanceDescription);
-            type = variableContext.getParameter(seqPrefix+"spectype"+instanceDescription);
-            match = variableContext.getParameter(seqPrefix+"specmatch"+instanceDescription);
-            sn = new SpecificationNode(flavor);
-            sn.setAttribute("type",type);
-            sn.setAttribute("match",match);
-            node.addChild(w++,sn);
-          }
-          flavor = variableContext.getParameter(seqPrefix+"specfl"+instanceDescription);
-          type = variableContext.getParameter(seqPrefix+"specty"+instanceDescription);
-          match = variableContext.getParameter(seqPrefix+"specma"+instanceDescription);
-          sn = new SpecificationNode(flavor);
-          sn.setAttribute("type",type);
-          sn.setAttribute("match",match);
-          node.addChild(w++,sn);
-          j++;
-        }
-        if (x != null && x.equals("Add"))
-        {
-          // Process adds to the end of the rules in-line
-          String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-          String type = variableContext.getParameter(seqPrefix+"spectype"+pathDescription);
-          String flavor = variableContext.getParameter(seqPrefix+"specflavor"+pathDescription);
-          SpecificationNode sn = new SpecificationNode(flavor);
-          sn.setAttribute("type",type);
-          sn.setAttribute("match",match);
-          node.addChild(w,sn);
-        }
-        ds.addChild(k++,node);
-        i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"specop");
-      if (op != null && op.equals("Add"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        String convertToURI = variableContext.getParameter(seqPrefix+"converttouri");
-
-        SpecificationNode node = new SpecificationNode("startpoint");
-        node.setAttribute("path",path);
-        if (convertToURI != null)
-          node.setAttribute("converttouri",convertToURI);
-
-        // Now add in the defaults; these will be "include all directories" and "include all files".
-        SpecificationNode sn = new SpecificationNode("include");
-        sn.setAttribute("type","file");
-        sn.setAttribute("match","*");
-        node.addChild(node.getChildCount(),sn);
-        sn = new SpecificationNode("include");
-        sn.setAttribute("type","directory");
-        sn.setAttribute("match","*");
-        node.addChild(node.getChildCount(),sn);
-
-        ds.addChild(k,node);
-      }
-    }
-    
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\">" + Messages.getAttributeString(locale,"FileConnector.Paths2") + "</td>\n"+    
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.RootPath") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.ConvertToURI") + "<br/>" + Messages.getBodyString(locale,"FileConnector.ConvertToURIExample")+ "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.Rules") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-    
-    int k = 0;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("startpoint"))
-      {
-        String path = sn.getAttributeValue("path");
-        String convertToURIString = sn.getAttributeValue("converttouri");
-        boolean convertToURI = false;
-        if (convertToURIString != null && convertToURIString.equals("true"))
-          convertToURI = true;
-        
-        out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(path)+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+(convertToURI?Messages.getBodyString(locale,"FileConnector.Yes"):Messages.getBodyString(locale,"FileConnector.No"))+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.IncludeExclude") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.FileDirectory") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"FileConnector.Match") + "</nobr></td>\n"+
-"              </tr>\n"
-        );
-        
-        int l = 0;
-        for (int j = 0; j < sn.getChildCount(); j++)
-        {
-          SpecificationNode excludeNode = sn.getChild(j);
-
-          String nodeFlavor = excludeNode.getType();
-          String nodeType = excludeNode.getAttributeValue("type");
-          String nodeMatch = excludeNode.getAttributeValue("match");
-          out.print(
-"              <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeFlavor+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeType+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(nodeMatch)+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"
-          );
-          l++;
-        }
-
-        if (l == 0)
-        {
-          out.print(
-"              <tr><td class=\"formcolumnmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"FileConnector.NoRulesDefined") + "</td></tr>\n"
-          );
-        }
-
-        out.print(
-"            </table>\n"+
-"           </td>\n"
-        );
-
-        out.print(
-"        </tr>\n"
-        );
-
-        k++;
-      }
-      
-    }
-
-    if (k == 0)
-    {
-      out.print(
-"        <tr><td class=\"formcolumnmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"FileConnector.NoDocumentsSpecified") + "</td></tr>\n"
-      );
-    }
-    
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-    );
-
-    out.print(
-"</table>\n"
-    );
-    
-  }
-
-  // Protected static methods
-
-  /** Check if a file or directory should be included, given a document specification.
-  *@param fileName is the canonical file name.
-  *@param documentSpecification is the specification.
-  *@return true if it should be included.
-  */
-  protected static boolean checkInclude(File file, String fileName, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-    {
-      Logging.connectors.debug("Checking whether to include file '"+fileName+"'");
-    }
-
-    try
-    {
-      String pathPart;
-      String filePart;
-      if (file.isDirectory())
-      {
-        pathPart = fileName;
-        filePart = null;
-      }
-      else
-      {
-        pathPart = file.getParentFile().getCanonicalPath();
-        filePart = file.getName();
-      }
-
-      // Scan until we match a startpoint
-      int i = 0;
-      while (i < documentSpecification.getChildCount())
-      {
-        SpecificationNode sn = documentSpecification.getChild(i++);
-        if (sn.getType().equals("startpoint"))
-        {
-          String path = new File(sn.getAttributeValue("path")).getCanonicalPath();
-          if (Logging.connectors.isDebugEnabled())
-          {
-            Logging.connectors.debug("Checking path '"+path+"' against canonical '"+pathPart+"'");
-          }
-          // Compare with filename
-          int matchEnd = matchSubPath(path,pathPart);
-          if (matchEnd == -1)
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              Logging.connectors.debug("Match check '"+path+"' against canonical '"+pathPart+"' failed");
-            }
-
-            continue;
-          }
-          // matchEnd is the start of the rest of the path (after the match) in fileName.
-          // We need to walk through the rules and see whether it's in or out.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode node = sn.getChild(j++);
-            String flavor = node.getType();
-            String match = node.getAttributeValue("match");
-            String type = node.getAttributeValue("type");
-            // If type is "file", then our match string is against the filePart.
-            // If filePart is null, then this rule is simply skipped.
-            String sourceMatch;
-            int sourceIndex;
-            if (type.equals("file"))
-            {
-              if (filePart == null)
-                continue;
-              sourceMatch = filePart;
-              sourceIndex = 0;
-            }
-            else
-            {
-              if (filePart != null)
-                continue;
-              sourceMatch = pathPart;
-              sourceIndex = matchEnd;
-            }
-
-            if (flavor.equals("include"))
-            {
-              if (checkMatch(sourceMatch,sourceIndex,match))
-                return true;
-            }
-            else if (flavor.equals("exclude"))
-            {
-              if (checkMatch(sourceMatch,sourceIndex,match))
-                return false;
-            }
-          }
-        }
-      }
-      if (Logging.connectors.isDebugEnabled())
-      {
-        Logging.connectors.debug("Not including '"+fileName+"' because no matching rules");
-      }
-
-      return false;
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO Error",e);
-    }
-  }
-
-  /** Check if a file should be ingested, given a document specification.  It is presumed that
-  * documents that do not pass checkInclude() will be checked with this method.
-  *@param file is the file.
-  *@param documentSpecification is the specification.
-  */
-  protected static boolean checkIngest(File file, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    // Since the only exclusions at this point are not based on file contents, this is a no-op.
-    // MHL
-    return true;
-  }
-
-  /** Match a sub-path.  The sub-path must match the complete starting part of the full path, in a path
-  * sense.  The returned value should point into the file name beyond the end of the matched path, or
-  * be -1 if there is no match.
-  *@param subPath is the sub path.
-  *@param fullPath is the full path.
-  *@return the index of the start of the remaining part of the full path, or -1.
-  */
-  protected static int matchSubPath(String subPath, String fullPath)
-  {
-    if (subPath.length() > fullPath.length())
-      return -1;
-    if (fullPath.startsWith(subPath) == false)
-      return -1;
-    int rval = subPath.length();
-    if (fullPath.length() == rval)
-      return rval;
-    char x = fullPath.charAt(rval);
-    if (x == File.separatorChar)
-      rval++;
-    return rval;
-  }
-
-  /** Check a match between two strings with wildcards.
-  *@param sourceMatch is the expanded string (no wildcards)
-  *@param sourceIndex is the starting point in the expanded string.
-  *@param match is the wildcard-based string.
-  *@return true if there is a match.
-  */
-  protected static boolean checkMatch(String sourceMatch, int sourceIndex, String match)
-  {
-    // Note: The java regex stuff looks pretty heavyweight for this purpose.
-    // I've opted to try and do a simple recursive version myself, which is not compiled.
-    // Basically, the match proceeds by recursive descent through the string, so that all *'s cause
-    // recursion.
-    boolean caseSensitive = true;
-
-    return processCheck(caseSensitive, sourceMatch, sourceIndex, match, 0);
-  }
-
-  /** Recursive worker method for checkMatch.  Returns 'true' if there is a path that consumes both
-  * strings in their entirety in a matched way.
-  *@param caseSensitive is true if file names are case sensitive.
-  *@param sourceMatch is the source string (w/o wildcards)
-  *@param sourceIndex is the current point in the source string.
-  *@param match is the match string (w/wildcards)
-  *@param matchIndex is the current point in the match string.
-  *@return true if there is a match.
-  */
-  protected static boolean processCheck(boolean caseSensitive, String sourceMatch, int sourceIndex,
-    String match, int matchIndex)
-  {
-    // Logging.connectors.debug("Matching '"+sourceMatch+"' position "+Integer.toString(sourceIndex)+
-    //      " against '"+match+"' position "+Integer.toString(matchIndex));
-
-    // Match up through the next * we encounter
-    while (true)
-    {
-      // If we've reached the end, it's a match.
-      if (sourceMatch.length() == sourceIndex && match.length() == matchIndex)
-        return true;
-      // If one has reached the end but the other hasn't, no match
-      if (match.length() == matchIndex)
-        return false;
-      if (sourceMatch.length() == sourceIndex)
-      {
-        if (match.charAt(matchIndex) != '*')
-          return false;
-        matchIndex++;
-        continue;
-      }
-      char x = sourceMatch.charAt(sourceIndex);
-      char y = match.charAt(matchIndex);
-      if (!caseSensitive)
-      {
-        if (x >= 'A' && x <= 'Z')
-          x -= 'A'-'a';
-        if (y >= 'A' && y <= 'Z')
-          y -= 'A'-'a';
-      }
-      if (y == '*')
-      {
-        // Wildcard!
-        // We will recurse at this point.
-        // Basically, we want to combine the results for leaving the "*" in the match string
-        // at this point and advancing the source index, with skipping the "*" and leaving the source
-        // string alone.
-        return processCheck(caseSensitive,sourceMatch,sourceIndex+1,match,matchIndex) ||
-          processCheck(caseSensitive,sourceMatch,sourceIndex,match,matchIndex+1);
-      }
-      if (y == '?' || x == y)
-      {
-        sourceIndex++;
-        matchIndex++;
-      }
-      else
-        return false;
-    }
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/Messages.java b/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/Messages.java
deleted file mode 100644
index 0cb5a68..0000000
--- a/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.filesystem.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.filesystem";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_en_US.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_en_US.properties
deleted file mode 100644
index 8564f43..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_en_US.properties
+++ /dev/null
@@ -1,18 +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.
-
-FileConnector.PathTabName=Output Path
-FileConnector.RootPath=Root path:
-FileConnector.RootPathCannotBeNull=Root path cannot be null
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_es_ES.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_es_ES.properties
deleted file mode 100644
index 7a4ba04..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_es_ES.properties
+++ /dev/null
@@ -1,18 +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.
-
-FileConnector.PathTabName=Ruta de salida
-FileConnector.RootPath=ruta raíz:
-FileConnector.RootPathCannotBeNull=Ruta de raíz no puede ser nulo
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_ja_JP.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_ja_JP.properties
deleted file mode 100644
index bdeac79..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_ja_JP.properties
+++ /dev/null
@@ -1,18 +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.
-
-FileConnector.PathTabName=出力パス
-FileConnector.RootPath=ルートパス
-FileConnector.RootPathCannotBeNull=ルートパスを入力してください
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_zh_CN.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_zh_CN.properties
deleted file mode 100644
index 69f624d..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/filesystem/common_zh_CN.properties
+++ /dev/null
@@ -1,18 +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.
-
-FileConnector.PathTabName=路径标签名
-FileConnector.RootPath=根路径
-FileConnector.RootPathCannotBeNull=根路径不能为Null
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_en_US.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_en_US.properties
deleted file mode 100644
index e6f15be..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_en_US.properties
+++ /dev/null
@@ -1,41 +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.
-
-FileConnector.Paths=Repository Paths
-FileConnector.Paths2=Repository Paths:
-FileConnector.RootPath=Root path
-FileConnector.ConvertToURI=Convert path to URI?
-FileConnector.ConvertToURIExample= (e.g. http/xyz/index.html => http://xyz/index.html)
-FileConnector.Yes=Yes
-FileConnector.No=No
-FileConnector.Rules=Rules
-FileConnector.Delete=Delete
-FileConnector.DeletePath=Delete path #
-FileConnector.IncludeExclude=Include/exclude
-FileConnector.FileDirectory=File/directory
-FileConnector.Match=Match
-FileConnector.include=include
-FileConnector.exclude=exclude
-FileConnector.File=File
-FileConnector.Directory=Directory
-FileConnector.NoDocumentsSpecified=No documents specified
-FileConnector.Add=Add
-FileConnector.InsertHere=Insert Here
-FileConnector.include=include
-FileConnector.NoRulesDefined=No rules defined
-FileConnector.InsertNewMatchForPath=Insert new match for path #
-FileConnector.DeletePath=Delete path #
-FileConnector.AddNewMatchForPath=Add new match for path #
-FileConnector.AddNewPath=Add new path
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_es_ES.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_es_ES.properties
deleted file mode 100644
index dcb1852..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_es_ES.properties
+++ /dev/null
@@ -1,41 +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.
-
-FileConnector.Paths=Caminos del repositorio
-FileConnector.Paths2=Caminos del repositorio:
-FileConnector.RootPath=ruta raíz
-FileConnector.ConvertToURI=Convertir camino a URI?
-FileConnector.ConvertToURIExample= (e.g. http/xyz/index.html => http://xyz/index.html)
-FileConnector.Yes=Si
-FileConnector.No=No
-FileConnector.Rules=Reglas
-FileConnector.Delete=borrar
-FileConnector.DeletePath=eliminar ruta #
-FileConnector.IncludeExclude=incluir/excluir
-FileConnector.FileDirectory=Archivo/directorio
-FileConnector.Match=Partido
-FileConnector.include=incluir
-FileConnector.exclude=excluir
-FileConnector.File=Archivo
-FileConnector.Directory=Directorio
-FileConnector.NoDocumentsSpecified=No hay documentos especificados
-FileConnector.Add=añadir
-FileConnector.InsertHere=Inserte aquí
-FileConnector.include=incluir
-FileConnector.NoRulesDefined=No hay reglas definidas
-FileConnector.InsertNewMatchForPath=Insertar nuevo partido para la ruta #
-FileConnector.DeletePath=eliminar ruta #
-FileConnector.AddNewMatchForPath=Escribir un partido para la ruta #
-FileConnector.AddNewPath=Añadir nuevo camino
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_ja_JP.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_ja_JP.properties
deleted file mode 100644
index 7df1022..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_ja_JP.properties
+++ /dev/null
@@ -1,41 +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.
-
-FileConnector.Paths=リポジトリパス
-FileConnector.Paths2=リポジトリパス:
-FileConnector.RootPath=ルートパス
-FileConnector.ConvertToURI=パスをURIに変換しますか
-FileConnector.ConvertToURIExample= 例) http/xyz/index.html => http://xyz/index.html
-FileConnector.Yes=はい
-FileConnector.No=いいえ
-FileConnector.Rules=ルール
-FileConnector.Delete=削除
-FileConnector.DeletePath=パス # を削除
-FileConnector.IncludeExclude=含む/除外
-FileConnector.FileDirectory=ファイル/ディレクトリ
-FileConnector.Match=一致
-FileConnector.include=含む
-FileConnector.exclude=除外
-FileConnector.File=ファイル
-FileConnector.Directory=ディレクトリ
-FileConnector.NoDocumentsSpecified=コンテンツが指定されていません
-FileConnector.Add=追加
-FileConnector.InsertHere=ここに挿入
-FileConnector.include=含む
-FileConnector.NoRulesDefined=ルールが未定義です
-FileConnector.InsertNewMatchForPath=パス # に新しいパターンを挿入
-FileConnector.DeletePath=パス # を削除
-FileConnector.AddNewMatchForPath=パス # に新しいパターンを追加
-FileConnector.AddNewPath=新しいパスを追加
diff --git a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_zh_CN.properties b/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_zh_CN.properties
deleted file mode 100644
index f945ed2..0000000
--- a/connectors/filesystem/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/filesystem/common_zh_CN.properties
+++ /dev/null
@@ -1,41 +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.
-
-FileConnector.Paths=存储库路径
-FileConnector.Paths2=存储库路径: 
-FileConnector.RootPath=根路径
-FileConnector.ConvertToURI=转换成URI
-FileConnector.ConvertToURIExample= 例) http/xyz/index.html => http://xyz/index.html
-FileConnector.Yes=是
-FileConnector.No=否
-FileConnector.Rules=规则
-FileConnector.Delete=删除
-FileConnector.DeletePath=删除路径 #
-FileConnector.IncludeExclude=包含/排除
-FileConnector.FileDirectory=文件/目录
-FileConnector.Match=匹配
-FileConnector.include=包含
-FileConnector.exclude=排除
-FileConnector.File=文件
-FileConnector.Directory=目录
-FileConnector.NoDocumentsSpecified=文档未指定
-FileConnector.Add=添加
-FileConnector.InsertHere=在这里插入
-FileConnector.include=包含
-FileConnector.NoRulesDefined=规则未指定
-FileConnector.InsertNewMatchForPath=为路径插入新匹配:  #
-FileConnector.DeletePath=删除路径:  #
-FileConnector.AddNewMatchForPath=为路径添加新匹配:  #
-FileConnector.AddNewPath=添加新路径
diff --git a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editConfiguration.html b/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editConfiguration.html
deleted file mode 100644
index bd1c7e4..0000000
--- a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editConfiguration.html
+++ /dev/null
@@ -1,16 +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.
--->
diff --git a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editConfiguration.js b/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editConfiguration.js
deleted file mode 100644
index f37efd4..0000000
--- a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editConfiguration.js
+++ /dev/null
@@ -1,21 +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.
--->
-
-<script type="text/javascript">
-<!--
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editSpecification.html b/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editSpecification.html
deleted file mode 100644
index 12c1c69..0000000
--- a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editSpecification.html
+++ /dev/null
@@ -1,32 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('FileConnector.PathTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('FileConnector.RootPath'))</nobr></td>
-    <td class="value"><input type="text" name="s${SEQNUM}_rootpath" size="64" value="$Encoder.attributeEscape($ROOTPATH)" /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SEQNUM}_rootpath" value="$Encoder.attributeEscape($ROOTPATH)" />
-
-#end
diff --git a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editSpecification.js b/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editSpecification.js
deleted file mode 100644
index cbc9d08..0000000
--- a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/editSpecification.js
+++ /dev/null
@@ -1,32 +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.
--->
-
-<script type="text/javascript">
-<!--
-function s${SEQNUM}_checkSpecificationForSave()
-{
-  if (editjob.s${SEQNUM}_rootpath.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('FileConnector.RootPathCannotBeNull'))");
-    SelectSequencedTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('FileConnector.PathTabName'))",${SEQNUM});
-    editjob.s${SEQNUM}_rootpath.focus();
-    return false;
-  }
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/viewConfiguration.html b/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/viewConfiguration.html
deleted file mode 100644
index bd1c7e4..0000000
--- a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/viewConfiguration.html
+++ /dev/null
@@ -1,16 +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.
--->
diff --git a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/viewSpecification.html b/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/viewSpecification.html
deleted file mode 100644
index 94d26e8..0000000
--- a/connectors/filesystem/connector/src/main/resources/org/apache/manifoldcf/agents/output/filesystem/viewSpecification.html
+++ /dev/null
@@ -1,23 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('FileConnector.RootPath'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($ROOTPATH)</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BaseHSQLDB.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BaseHSQLDB.java
deleted file mode 100644
index 3855190..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BaseHSQLDB.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: BaseHSQLDB.java 1147086 2011-07-15 10:58:30Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BaseMySQL.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BaseMySQL.java
deleted file mode 100644
index eabd07a..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BaseMySQL.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: BaseMySQL.java 1221585 2011-12-21 03:10:03Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.crawler.tests.ConnectorBaseMySQL
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BasePostgresql.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BasePostgresql.java
deleted file mode 100644
index d8dfb16..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/BasePostgresql.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityHSQLDBTest.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityHSQLDBTest.java
deleted file mode 100644
index af6bb79..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: SanityHSQLDBTest.java 1147086 2011-07-15 10:58:30Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityMySQLTest.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityMySQLTest.java
deleted file mode 100644
index cd08b3e..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityMySQLTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: SanityMySQLTest.java 1221585 2011-12-21 03:10:03Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityPostgresqlTest.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityPostgresqlTest.java
deleted file mode 100644
index 1803f44..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/agents/output/filesystem/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.filesystem;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityCombinedHSQLDBIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityCombinedHSQLDBIT.java
deleted file mode 100644
index b5ddcab..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityCombinedHSQLDBIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class APISanityCombinedHSQLDBIT extends BaseITHSQLDB
-{
-  protected APISanityTester tester;
-  
-  public APISanityCombinedHSQLDBIT()
-  {
-    super(true);
-    tester = new APISanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityHSQLDBIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityHSQLDBIT.java
deleted file mode 100644
index c1d5237..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityHSQLDBIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class APISanityHSQLDBIT extends BaseITHSQLDB
-{
-  protected APISanityTester tester;
-  
-  public APISanityHSQLDBIT()
-  {
-    tester = new APISanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityMySQLIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityMySQLIT.java
deleted file mode 100644
index 90727a2..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityMySQLIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class APISanityMySQLIT extends BaseITMySQL
-{
-  protected APISanityTester tester;
-  
-  public APISanityMySQLIT()
-  {
-    tester = new APISanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityPostgresqlIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityPostgresqlIT.java
deleted file mode 100644
index 349c644..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityPostgresqlIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id: APISanity.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class APISanityPostgresqlIT extends BaseITPostgresql
-{
-  protected APISanityTester tester;
-  
-  public APISanityPostgresqlIT()
-  {
-    tester = new APISanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityTester.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityTester.java
deleted file mode 100644
index 541d1b7..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/APISanityTester.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a very basic sanity check */
-public class APISanityTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public APISanityTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void setupTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-    FileHelper.createDirectory(f);
-  }
-  
-  public void teardownTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    int i;
-
-    // Create a basic file system connection, and save it.
-    ConfigurationNode connectionObject;
-    ConfigurationNode child;
-    Configuration requestObject;
-    Configuration result;
-
-    instance.loginAPI("","");
-    
-    connectionObject = new ConfigurationNode("repositoryconnection");
-    
-    child = new ConfigurationNode("name");
-    child.setValue("File Connection");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-    child = new ConfigurationNode("class_name");
-    child.setValue("org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-    child = new ConfigurationNode("description");
-    child.setValue("File Connection");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-
-    child = new ConfigurationNode("max_connections");
-    child.setValue("100");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-
-    requestObject = new Configuration();
-    requestObject.addChild(0,connectionObject);
-      
-    result = instance.performAPIPutOperationViaNodes("repositoryconnections/File%20Connection",201,requestObject);
-      
-    i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-      
-    // Create a basic null output connection, and save it.
-    connectionObject = new ConfigurationNode("outputconnection");
-      
-    child = new ConfigurationNode("name");
-    child.setValue("Null Connection");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-    child = new ConfigurationNode("class_name");
-    child.setValue("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-    child = new ConfigurationNode("description");
-    child.setValue("Null Connection");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-
-    child = new ConfigurationNode("max_connections");
-    child.setValue("100");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-
-    requestObject = new Configuration();
-    requestObject.addChild(0,connectionObject);
-      
-    result = instance.performAPIPutOperationViaNodes("outputconnections/Null%20Connection",201,requestObject);
-      
-    i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-
-    // Create a job.
-    ConfigurationNode jobObject = new ConfigurationNode("job");
-      
-    child = new ConfigurationNode("description");
-    child.setValue("Test Job");
-    jobObject.addChild(jobObject.getChildCount(),child);
-
-    child = new ConfigurationNode("repository_connection");
-    child.setValue("File Connection");
-    jobObject.addChild(jobObject.getChildCount(),child);
-
-    // Revamped way of adding output connection
-    child = new ConfigurationNode("pipelinestage");
-    ConfigurationNode pipelineChild = new ConfigurationNode("stage_id");
-    pipelineChild.setValue("0");
-    child.addChild(child.getChildCount(),pipelineChild);
-    pipelineChild = new ConfigurationNode("stage_isoutput");
-    pipelineChild.setValue("true");
-    child.addChild(child.getChildCount(),pipelineChild);
-    pipelineChild = new ConfigurationNode("stage_connectionname");
-    pipelineChild.setValue("Null Connection");
-    child.addChild(child.getChildCount(),pipelineChild);
-    jobObject.addChild(jobObject.getChildCount(),child);
-
-    child = new ConfigurationNode("run_mode");
-    child.setValue("scan once");
-    jobObject.addChild(jobObject.getChildCount(),child);
-
-    child = new ConfigurationNode("start_mode");
-    child.setValue("manual");
-    jobObject.addChild(jobObject.getChildCount(),child);
-
-    child = new ConfigurationNode("hopcount_mode");
-    child.setValue("accurate");
-    jobObject.addChild(jobObject.getChildCount(),child);
-
-    child = new ConfigurationNode("document_specification");
-    // Crawl everything underneath the 'testdata' area
-    File testDataFile = new File("testdata").getCanonicalFile();
-    if (!testDataFile.exists())
-      throw new ManifoldCFException("Test data area not found!  Looking in "+testDataFile.toString());
-    if (!testDataFile.isDirectory())
-      throw new ManifoldCFException("Test data area not a directory!  Looking in "+testDataFile.toString());
-    ConfigurationNode sn = new ConfigurationNode("startpoint");
-    sn.setAttribute("path",testDataFile.toString());
-    ConfigurationNode n = new ConfigurationNode("include");
-    n.setAttribute("type","file");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    n = new ConfigurationNode("include");
-    n.setAttribute("type","directory");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    child.addChild(child.getChildCount(),sn);
-    jobObject.addChild(jobObject.getChildCount(),child);
-      
-    requestObject = new Configuration();
-    requestObject.addChild(0,jobObject);
-      
-    result = instance.performAPIPostOperationViaNodes("jobs",201,requestObject);
-      
-    String jobIDString = null;
-    i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("job_id"))
-        jobIDString = resultNode.getValue();
-    }
-    if (jobIDString == null)
-      throw new Exception("Missing job_id from return!");
-      
-    Long jobID = new Long(jobIDString);
-      
-    // Create the test data files.
-    FileHelper.createFile(new File("testdata/test1.txt"),"This is a test file");
-    FileHelper.createFile(new File("testdata/test2.txt"),"This is another test file");
-    FileHelper.createDirectory(new File("testdata/testdir"));
-    FileHelper.createFile(new File("testdata/testdir/test3.txt"),"This is yet another test file");
-      
-    ConfigurationNode requestNode;
-      
-    // Now, start the job, and wait until it completes.
-    instance.startJobAPI(jobIDString);
-    instance.waitJobInactiveAPI(jobIDString, 120000L);
-
-    // Check to be sure we actually processed the right number of documents.
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    long count;
-    count = instance.getJobDocumentsProcessedAPI(jobIDString);
-    if (count != 5)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 5, saw "+new Long(count).toString());
-      
-    // Add a file and recrawl
-    FileHelper.createFile(new File("testdata/testdir/test4.txt"),"Added file");
-
-    // Now, start the job, and wait until it completes.
-    instance.startJobAPI(jobIDString);
-    instance.waitJobInactiveAPI(jobIDString, 120000L);
-
-    // The test data area has 4 documents and one directory, and we have to count the root directory too.
-    count = instance.getJobDocumentsProcessedAPI(jobIDString);
-    if (count != 6)
-      throw new ManifoldCFException("Wrong number of documents processed after add - expected 6, saw "+new Long(count).toString());
-
-    // Change a file, and recrawl
-    FileHelper.changeFile(new File("testdata/test1.txt"),"Modified contents");
-      
-    // Now, start the job, and wait until it completes.
-    instance.startJobAPI(jobIDString);
-    instance.waitJobInactiveAPI(jobIDString, 120000L);
-
-    // The test data area has 4 documents and one directory, and we have to count the root directory too.
-    count = instance.getJobDocumentsProcessedAPI(jobIDString);
-    if (count != 6)
-      throw new ManifoldCFException("Wrong number of documents processed after change - expected 6, saw "+new Long(count).toString());
-    // We also need to make sure the new document was indexed.  Have to think about how to do this though.
-    // MHL
-      
-    // Delete a file, and recrawl
-    FileHelper.removeFile(new File("testdata/test2.txt"));
-      
-    // Now, start the job, and wait until it completes.
-    instance.startJobAPI(jobIDString);
-    instance.waitJobInactiveAPI(jobIDString, 120000L);
-
-    // Check to be sure we actually processed the right number of documents.
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    count = instance.getJobDocumentsProcessedAPI(jobIDString);
-    if (count != 5)
-      throw new ManifoldCFException("Wrong number of documents processed after delete - expected 5, saw "+new Long(count).toString());
-
-    // Have a try to get the history records for the connection
-    result = instance.performAPIGetOperationViaNodes("repositoryconnectionhistory/File%20Connection?report=simple",200);
-
-    // Now, delete the job.
-    instance.deleteJobAPI(jobIDString);
-
-    instance.waitJobDeletedAPI(jobIDString, 120000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseHSQLDB.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseHSQLDB.java
deleted file mode 100644
index 5270df2..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITHSQLDB.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITHSQLDB.java
deleted file mode 100644
index 93a8288..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  public BaseITHSQLDB()
-  {
-    super();
-  }
-  
-  public BaseITHSQLDB(boolean singleWar)
-  {
-    super(singleWar);
-  }
-
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITMySQL.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITMySQL.java
deleted file mode 100644
index f5b52ba..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITMySQL.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITMySQL extends org.apache.manifoldcf.crawler.tests.BaseITMySQL
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITPostgresql.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITPostgresql.java
deleted file mode 100644
index 93f1ac9..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseITPostgresql.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id: TestBase.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITPostgresql extends org.apache.manifoldcf.crawler.tests.BaseITPostgresql
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseMySQL.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseMySQL.java
deleted file mode 100644
index 1b06734..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseMySQL.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.crawler.tests.ConnectorBaseMySQL
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BasePostgresql.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BasePostgresql.java
deleted file mode 100644
index 93eaedb..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BasePostgresql.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseUIHSQLDB.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 2fc8bd3..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  public BaseUIHSQLDB()
-  {
-    super();
-  }
-  
-  public BaseUIHSQLDB(boolean singleWar)
-  {
-    super(singleWar);
-  }
-
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlHSQLDBLT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlHSQLDBLT.java
deleted file mode 100644
index 5a1fa73..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlHSQLDBLT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlHSQLDBLT extends BaseITHSQLDB
-{
-  protected BigCrawlTester tester;
-  
-  public BigCrawlHSQLDBLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlMySQLLT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlMySQLLT.java
deleted file mode 100644
index ef1deb1..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlMySQLLT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlMySQLLT extends BaseITMySQL
-{
-  protected BigCrawlTester tester;
-  
-  public BigCrawlMySQLLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlPostgresqlLT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlPostgresqlLT.java
deleted file mode 100644
index 4fb5162..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlPostgresqlLT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlPostgresqlLT extends BaseITPostgresql
-{
-  protected BigCrawlTester tester;
-  
-  public BigCrawlPostgresqlLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlTester.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlTester.java
deleted file mode 100644
index c91c1f2..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/BigCrawlTester.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a 100000 document crawl */
-public class BigCrawlTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public BigCrawlTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void setupTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-    FileHelper.createDirectory(f);
-    // Create the test data files.
-    String baseFileName = "testdata/";
-    int i0 = 0;
-    while (i0 < 10)
-    {
-      String fileName0 = baseFileName + "/dir-" + i0;
-      FileHelper.createDirectory(new File(fileName0));
-      int i1 = 0;
-      while (i1 < 10)
-      {
-        String fileName1 = fileName0 + "/dir-" + i1;
-        FileHelper.createDirectory(new File(fileName1));
-        int i2 = 0;
-        while (i2 < 10)
-        {
-          String fileName2 = fileName1 + "/dir-" + i2;
-          FileHelper.createDirectory(new File(fileName2));
-          int i3 = 0;
-          while (i3 < 10)
-          {
-            String fileName3 = fileName2 + "/dir-" + i3;
-            FileHelper.createDirectory(new File(fileName3));
-            int i4 = 0;
-            while (i4 < 10)
-            {
-              String fileName4 = fileName3 + "/file-"+i4;
-              FileHelper.createFile(new File(fileName4),"Test file "+i0+":"+i1+":"+i2+":"+i3+":"+i4);
-              i4++;
-            }
-            i3++;
-          }
-          i2++;
-        }
-        i1++;
-      }
-      i0++;
-    }
-    System.err.println("Done generating files");
-  }
-  
-  public void teardownTestArea()
-    throws Exception
-  {
-    System.err.println("Removing generated files");
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("File Connection");
-    conn.setDescription("File Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("File Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    // Crawl everything underneath the 'testdata' area
-    File testDataFile = new File("testdata").getCanonicalFile();
-    if (!testDataFile.exists())
-      throw new ManifoldCFException("Test data area not found!  Looking in "+testDataFile.toString());
-    if (!testDataFile.isDirectory())
-      throw new ManifoldCFException("Test data area not a directory!  Looking in "+testDataFile.toString());
-    SpecificationNode sn = new SpecificationNode("startpoint");
-    sn.setAttribute("path",testDataFile.toString());
-    SpecificationNode n = new SpecificationNode("include");
-    n.setAttribute("type","file");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    n = new SpecificationNode("include");
-    n.setAttribute("type","directory");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    ds.addChild(ds.getChildCount(),sn);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it completes.
-    long startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),18000000L);
-    System.err.println("Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 111111)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 111111, saw "+new Long(status.getDocumentsProcessed()).toString());
-
-    // Now, start the job AGAIN, and wait until it completes.
-    startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),18000000L);
-    System.err.println("Second crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    status = jobManager.getStatus(job.getID());
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 111111)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 111111, saw "+new Long(status.getDocumentsProcessed()).toString());
-
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),18000000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationHSQLDBIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationHSQLDBIT.java
deleted file mode 100644
index 028dae7..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationHSQLDBIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test which checks to see if document expiration works properly. */
-public class ExpirationHSQLDBIT extends BaseITHSQLDB
-{
-  protected ExpirationTester tester;
-  
-  public ExpirationHSQLDBIT()
-  {
-    tester = new ExpirationTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void expirationCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationMySQLIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationMySQLIT.java
deleted file mode 100644
index c332ddc..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationMySQLIT.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test which checks to see if document expiration works properly. */
-public class ExpirationMySQLIT extends BaseITMySQL
-{
-  protected ExpirationTester tester;
-  
-  public ExpirationMySQLIT()
-  {
-    tester = new ExpirationTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void expirationCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationPostgresqlIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationPostgresqlIT.java
deleted file mode 100644
index 4b26cfe..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationPostgresqlIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test which checks to see if document expiration works properly. */
-public class ExpirationPostgresqlIT extends BaseITPostgresql
-{
-  protected ExpirationTester tester;
-  
-  public ExpirationPostgresqlIT()
-  {
-    tester = new ExpirationTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void expirationCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationTester.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationTester.java
deleted file mode 100644
index 63e8fde..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/ExpirationTester.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a test which checks to see if document expiration works properly. */
-public class ExpirationTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public ExpirationTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void setupTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-    FileHelper.createDirectory(f);
-  }
-  
-  public void teardownTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("File Connection");
-    conn.setDescription("File Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("File Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-    // 60-second expiration for all documents..
-    job.setExpiration(new Long(60000L));
-    // Infinite rescan interval.
-    job.setInterval(null);
-    // Continuous job.
-    job.setType(IJobDescription.TYPE_CONTINUOUS);
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    // Crawl everything underneath the 'testdata' area
-    File testDataFile = new File("testdata").getCanonicalFile();
-    if (!testDataFile.exists())
-      throw new ManifoldCFException("Test data area not found!  Looking in "+testDataFile.toString());
-    if (!testDataFile.isDirectory())
-      throw new ManifoldCFException("Test data area not a directory!  Looking in "+testDataFile.toString());
-    SpecificationNode sn = new SpecificationNode("startpoint");
-    sn.setAttribute("path",testDataFile.toString());
-    SpecificationNode n = new SpecificationNode("include");
-    n.setAttribute("type","file");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    n = new SpecificationNode("include");
-    n.setAttribute("type","directory");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    ds.addChild(ds.getChildCount(),sn);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Create the test data files.
-    FileHelper.createFile(new File("testdata/test1.txt"),"This is a test file");
-    FileHelper.createFile(new File("testdata/test2.txt"),"This is another test file");
-    FileHelper.createDirectory(new File("testdata/testdir"));
-    FileHelper.createFile(new File("testdata/testdir/test3.txt"),"This is yet another test file");
-    FileHelper.createDirectory(new File("testdata/testdir/seconddir"));
-    FileHelper.createFile(new File("testdata/testdir/seconddir/test4.txt"),"Lowest test file");
-      
-    // Now, start the job, and wait until it is running.
-    jobManager.manualStart(job.getID());
-    instance.waitJobRunningNative(jobManager,job.getID(),30000L);
-      
-    JobStatus status;
-      
-    // Now we wait, and we should see 7 documents eventually.
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + 120000L)
-    {
-      status = jobManager.getStatus(job.getID());
-      if (status.getDocumentsProcessed() == 7)
-        break;
-
-      ManifoldCF.sleep(1000L);
-    }
-      
-    // At this point there should be 7 documents.
-    // OK, documents should expire starting a minute later.  The number of documents will go quickly to zero after this time. 
-    // So all we need to do is confirm that the job stops within 2 minutes.
-    instance.waitJobInactiveNative(jobManager,job.getID(),180000L);
-
-    status = jobManager.getStatus(job.getID());
-    if (status.getDocumentsProcessed() != 0)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 0, saw "+new Long(status.getDocumentsProcessed()).toString());
-      
-
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),120000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/FileHelper.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/FileHelper.java
deleted file mode 100644
index c0491e5..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/FileHelper.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-/** Helper class for local file manipulation */
-public class FileHelper
-{
-
-  protected static void createDirectory(File f)
-    throws Exception
-  {
-    if (f.mkdirs() == false)
-      throw new Exception("Failed to create directory "+f.toString());
-  }
-  
-  protected static void removeDirectory(File f)
-    throws Exception
-  {
-    File[] files = f.listFiles();
-    if (files != null)
-    {
-      int i = 0;
-      while (i < files.length)
-      {
-        File subfile = files[i++];
-        if (subfile.isDirectory())
-          removeDirectory(subfile);
-        else
-          subfile.delete();
-      }
-    }
-    f.delete();
-  }
-  
-  protected static void createFile(File f, String contents)
-    throws Exception
-  {
-    OutputStream os = new FileOutputStream(f);
-    try
-    {
-      Writer w = new OutputStreamWriter(os, StandardCharsets.UTF_8);
-      try
-      {
-        w.write(contents);
-      }
-      finally
-      {
-        w.flush();
-      }
-    }
-    finally
-    {
-      os.close();
-    }
-  }
-  
-  protected static void removeFile(File f)
-    throws Exception
-  {
-    if (f.delete() == false)
-      throw new Exception("Failed to delete file "+f.toString());
-  }
-  
-  protected static void changeFile(File f, String newContents)
-    throws Exception
-  {
-    removeFile(f);
-    createFile(f,newContents);
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountHSQLDBIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountHSQLDBIT.java
deleted file mode 100644
index 309328c..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountHSQLDBIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test which checks to be sure hopcount functionality is working properly. */
-public class HopcountHSQLDBIT extends BaseITHSQLDB
-{
-  protected HopcountTester tester;
-  
-  public HopcountHSQLDBIT()
-  {
-    tester = new HopcountTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void hopcountCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountMySQLIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountMySQLIT.java
deleted file mode 100644
index 78856f4..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountMySQLIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test which checks to be sure hopcount functionality is working properly. */
-public class HopcountMySQLIT extends BaseITMySQL
-{
-  protected HopcountTester tester;
-  
-  public HopcountMySQLIT()
-  {
-    tester = new HopcountTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void hopcountCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountPostgresqlIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountPostgresqlIT.java
deleted file mode 100644
index e077d5b..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountPostgresqlIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test which checks to be sure hopcount functionality is working properly. */
-public class HopcountPostgresqlIT extends BaseITPostgresql
-{
-  protected HopcountTester tester;
-  
-  public HopcountPostgresqlIT()
-  {
-    tester = new HopcountTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void hopcountCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountTester.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountTester.java
deleted file mode 100644
index d7b56e4..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/HopcountTester.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a test which checks to be sure hopcount functionality is working properly. */
-public class HopcountTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public HopcountTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void setupTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-    FileHelper.createDirectory(f);
-  }
-  
-  public void teardownTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("File Connection");
-    conn.setDescription("File Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("File Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-    job.addHopCountFilter("child",new Long(2));
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    // Crawl everything underneath the 'testdata' area
-    File testDataFile = new File("testdata").getCanonicalFile();
-    if (!testDataFile.exists())
-      throw new ManifoldCFException("Test data area not found!  Looking in "+testDataFile.toString());
-    if (!testDataFile.isDirectory())
-      throw new ManifoldCFException("Test data area not a directory!  Looking in "+testDataFile.toString());
-    SpecificationNode sn = new SpecificationNode("startpoint");
-    sn.setAttribute("path",testDataFile.toString());
-    SpecificationNode n = new SpecificationNode("include");
-    n.setAttribute("type","file");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    n = new SpecificationNode("include");
-    n.setAttribute("type","directory");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    ds.addChild(ds.getChildCount(),sn);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Create the test data files.
-    FileHelper.createFile(new File("testdata/test1.txt"),"This is a test file");
-    FileHelper.createFile(new File("testdata/test2.txt"),"This is another test file");
-    FileHelper.createDirectory(new File("testdata/testdir"));
-    FileHelper.createFile(new File("testdata/testdir/test3.txt"),"This is yet another test file");
-    FileHelper.createDirectory(new File("testdata/testdir/seconddir"));
-    FileHelper.createFile(new File("testdata/testdir/seconddir/test4.txt"),"Lowest test file");
-      
-    // Now, start the job, and wait until it completes.
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    // The test data area has 4 documents and 2 directories and we have to count the root directory too.
-    // But the max hopcount is 2, so one file will be left behind, so the count should be 6, not 7.
-    if (status.getDocumentsProcessed() != 6)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 6, saw "+new Long(status.getDocumentsProcessed()).toString());
-      
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(), 120000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationCombinedHSQLDBUI.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationCombinedHSQLDBUI.java
deleted file mode 100644
index b7f3a64..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationCombinedHSQLDBUI.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.HTMLTester;
-
-/** Basic UI navigation tests */
-public class NavigationCombinedHSQLDBUI extends BaseUIHSQLDB
-{
-
-  public NavigationCombinedHSQLDBUI()
-  {
-    super(true);
-  }
-  
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    new NavigationUITester(testerInstance,"http://localhost:8346/mcf/index.jsp").createConnectionsAndJob();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationHSQLDBUI.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 830c7bd..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.HTMLTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    new NavigationUITester(testerInstance,"http://localhost:8346/mcf-crawler-ui/index.jsp").createConnectionsAndJob();
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationUITester.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationUITester.java
deleted file mode 100644
index e404a48..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/NavigationUITester.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationUITester
-{
-  protected final SeleniumTester testerInstance;
-  protected final String startURL;
-  
-  public NavigationUITester(SeleniumTester tester, String startURL)
-  {
-    this.testerInstance = tester;
-    this.startURL = startURL;
-  }
-  
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", startURL);
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // Now, HopFilters
-    testerInstance.clickTab("Hop Filters");
-    testerInstance.clickRadioButton("hopcountmode","2");
-
-    // Repository Paths tab
-    testerInstance.clickTab("Repository Paths");
-    
-    // MHL
-    
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityHSQLDBIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityHSQLDBIT.java
deleted file mode 100644
index 7dab3bf..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityHSQLDBIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBIT extends BaseITHSQLDB
-{
-  protected SanityTester tester;
-  
-  public SanityHSQLDBIT()
-  {
-    tester = new SanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
- 
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityHSQLDBTest.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityHSQLDBTest.java
deleted file mode 100644
index eb86a2d..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityMySQLIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityMySQLIT.java
deleted file mode 100644
index 68469dc..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityMySQLIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLIT extends BaseITMySQL
-{
-  protected SanityTester tester;
-  
-  public SanityMySQLIT()
-  {
-    tester = new SanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
- 
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityMySQLTest.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityMySQLTest.java
deleted file mode 100644
index 587b562..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityMySQLTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityPostgresqlIT.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityPostgresqlIT.java
deleted file mode 100644
index b00551d..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityPostgresqlIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlIT extends BaseITPostgresql
-{
-  protected SanityTester tester;
-  
-  public SanityPostgresqlIT()
-  {
-    tester = new SanityTester(mcfInstance);
-  }
-  
-  @Before
-  public void setupTester()
-    throws Exception
-  {
-    tester.setupTestArea();
-  }
-  
-  @After
-  public void teardownTester()
-    throws Exception
-  {
-    tester.teardownTestArea();
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    tester.executeTest();
-  }
- 
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityPostgresqlTest.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityPostgresqlTest.java
deleted file mode 100644
index 3f88800..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityTester.java b/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityTester.java
deleted file mode 100644
index 6745f6e..0000000
--- a/connectors/filesystem/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/filesystem/tests/SanityTester.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.filesystem.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a very basic sanity check */
-public class SanityTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public SanityTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void setupTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-    FileHelper.createDirectory(f);
-  }
-  
-  public void teardownTestArea()
-    throws Exception
-  {
-    File f = new File("testdata");
-    FileHelper.removeDirectory(f);
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("File Connection");
-    conn.setDescription("File Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("File Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    // Crawl everything underneath the 'testdata' area
-    File testDataFile = new File("testdata").getCanonicalFile();
-    if (!testDataFile.exists())
-      throw new ManifoldCFException("Test data area not found!  Looking in "+testDataFile.toString());
-    if (!testDataFile.isDirectory())
-      throw new ManifoldCFException("Test data area not a directory!  Looking in "+testDataFile.toString());
-    SpecificationNode sn = new SpecificationNode("startpoint");
-    sn.setAttribute("path",testDataFile.toString());
-    SpecificationNode n = new SpecificationNode("include");
-    n.setAttribute("type","file");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    n = new SpecificationNode("include");
-    n.setAttribute("type","directory");
-    n.setAttribute("match","*");
-    sn.addChild(sn.getChildCount(),n);
-    ds.addChild(ds.getChildCount(),sn);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Create the test data files.
-    FileHelper.createFile(new File("testdata/test1.txt"),"This is a test file");
-    FileHelper.createFile(new File("testdata/test2.txt"),"This is another test file");
-    FileHelper.createDirectory(new File("testdata/testdir"));
-    FileHelper.createFile(new File("testdata/testdir/test3.txt"),"This is yet another test file");
-      
-    // Now, start the job, and wait until it completes.
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 5)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 5, saw "+new Long(status.getDocumentsProcessed()).toString());
-      
-    // Add a file and recrawl using minimal crawl
-    FileHelper.createFile(new File("testdata/testdir/test4.txt"),"Added file");
-
-    // Now, start the job, and wait until it completes.
-    jobManager.manualStart(job.getID(),true);
-    instance.waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-    status = jobManager.getStatus(job.getID());
-    // The test data area has 4 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 6)
-      throw new ManifoldCFException("Wrong number of documents processed after add - expected 6, saw "+new Long(status.getDocumentsProcessed()).toString());
-
-    // Change a file, and recrawl, once again using minimal
-    FileHelper.changeFile(new File("testdata/test1.txt"),"Modified contents");
-      
-    // Now, start the job, and wait until it completes.
-    jobManager.manualStart(job.getID(),true);
-    instance.waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-    status = jobManager.getStatus(job.getID());
-    // The test data area has 4 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 6)
-      throw new ManifoldCFException("Wrong number of documents processed after change - expected 6, saw "+new Long(status.getDocumentsProcessed()).toString());
-    // We also need to make sure the new document was indexed.  Have to think about how to do this though.
-    // MHL
-      
-    // Delete a file, and recrawl
-    FileHelper.removeFile(new File("testdata/test2.txt"));
-    
-    // Do a minimal recrawl first; the delete should not be picked up.
-    jobManager.manualStart(job.getID(),true);
-    instance.waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-    status = jobManager.getStatus(job.getID());
-    // The test data area has 4 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 6)
-      throw new ManifoldCFException("Wrong number of documents processed after delete with minimal crawl - expected 6, saw "+new Long(status.getDocumentsProcessed()).toString());
-    
-    // Now, do a complete crawl - the delete should be found now.
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-    // Check to be sure we actually processed the right number of documents.
-    status = jobManager.getStatus(job.getID());
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 5)
-      throw new ManifoldCFException("Wrong number of documents processed after delete - expected 5, saw "+new Long(status.getDocumentsProcessed()).toString());
-
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),120000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/filesystem/pom.xml b/connectors/filesystem/pom.xml
deleted file mode 100644
index e01238c..0000000
--- a/connectors/filesystem/pom.xml
+++ /dev/null
@@ -1,375 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-filesystem-connector</artifactId>
-  <name>ManifoldCF - Connectors - Filesystem</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-      
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-combined-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-            <combinedWarPath>../dependency/mcf-combined-service-${project.version}.war</combinedWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-combined-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/forcedmetadata/.gitignore b/connectors/forcedmetadata/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/forcedmetadata/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/forcedmetadata/build.xml b/connectors/forcedmetadata/build.xml
deleted file mode 100644
index 6c64367..0000000
--- a/connectors/forcedmetadata/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="forcedmetadata" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="Metadata adjuster"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.forcedmetadata.ForcedMetadataConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/FieldDataFactory.java b/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/FieldDataFactory.java
deleted file mode 100644
index b513a57..0000000
--- a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/FieldDataFactory.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.forcedmetadata;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This class provides unique Reader and other field instances, when requested, based
-* on an input RepositoryDocument.  It does this by pulling the values of the field into
-* a CharacterInput implementation, thus making a temporary file copy.  So it is imperative
-* that this object is closed when it is no longer needed.
-*/
-public class FieldDataFactory {
-
-  protected final RepositoryDocument sourceDocument;
-
-  // Readers (organized by metadata)
-  protected final Map<String,CharacterInput[]> metadataReaders = new HashMap<String,CharacterInput[]>();
-
-  public FieldDataFactory(RepositoryDocument sourceDocument) {
-    this.sourceDocument = sourceDocument;
-  }
-
-  public void close()
-    throws ManifoldCFException {
-    for (String key : metadataReaders.keySet()) {
-      CharacterInput[] rt = metadataReaders.get(key);
-      for (CharacterInput r : rt) {
-        r.discard();
-      }
-    }
-  }
-
-  public Object[] getField(String fieldName)
-    throws IOException, ManifoldCFException {
-    CharacterInput[] inputs = metadataReaders.get(fieldName);
-    if (inputs == null) {
-      // Either never seen the field before, or it's not a Reader
-      Object[] fieldValues = sourceDocument.getField(fieldName);
-      if (fieldValues == null)
-        return fieldValues;
-      if (fieldValues instanceof Reader[]) {
-        // Create a copy
-        CharacterInput[] newValues = new CharacterInput[fieldValues.length];
-        try {
-          // Populate newValues
-          for (int i = 0; i < newValues.length; i++) {
-            newValues[i] = new TempFileCharacterInput((Reader)fieldValues[i]);
-          }
-          metadataReaders.put(fieldName,newValues);
-          inputs = newValues;
-        } catch (Throwable e) {
-          for (CharacterInput r : newValues)
-          {
-            if (r != null)
-              r.discard();
-          }
-          if (e instanceof IOException)
-            throw (IOException)e;
-          else if (e instanceof RuntimeException)
-            throw (RuntimeException)e;
-          else if (e instanceof Error)
-            throw (Error)e;
-          else
-            throw new RuntimeException("Unknown exception type: "+e.getClass().getName()+": "+e.getMessage(),e);
-        }
-      } else {
-        return fieldValues;
-      }
-    }
-
-    Reader[] newReaders = new Reader[inputs.length];
-    for (int i = 0; i < inputs.length; i++)
-    {
-      inputs[i].doneWithStream();
-      newReaders[i] = inputs[i].getStream();
-    }
-    return newReaders;
-  }
-
-  public String[] getFieldAsStrings(String fieldName)
-    throws IOException, ManifoldCFException {
-    CharacterInput[] cilist = metadataReaders.get(fieldName);
-    if (cilist == null)
-      return sourceDocument.getFieldAsStrings(fieldName);
-
-    // We've created a local array of CharacterInputs from this field.  We'll need to convert these
-    // to strings.
-    char[] buffer = new char[65536];
-    String[] rval = new String[cilist.length];
-    for (int i = 0; i < rval.length; i++) {
-      CharacterInput ci = cilist[i];
-      ci.doneWithStream();
-      Reader r = ci.getStream();
-      // Read into a buffer
-      StringBuilder newValue = new StringBuilder();
-      while (true)
-      {
-        int amt = r.read(buffer);
-        if (amt == -1)
-          break;
-        newValue.append(buffer,0,amt);
-      }
-      rval[i] = newValue.toString();
-    }
-    sourceDocument.addField(fieldName,rval);
-    metadataReaders.remove(fieldName);
-    for (CharacterInput ci : cilist) {
-      ci.discard();
-    }
-    return rval;
-  }
-}
-
diff --git a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/FieldSource.java b/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/FieldSource.java
deleted file mode 100644
index a30c421..0000000
--- a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/FieldSource.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.forcedmetadata;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
-public class FieldSource implements IDataSource {
-  
-  protected final static int CASE_EXACT = 0;
-  protected final static int CASE_LOWER = 1;
-  protected final static int CASE_UPPER = 2;
-  
-  protected final static Object[] EMPTY_OBJECT_ARRAY = new Object[0];
-  protected final static String[] EMPTY_STRING_ARRAY = new String[0];
-  
-  protected final FieldDataFactory rd;
-  protected final String fieldName;
-  protected final Pattern regExpPattern;
-  protected final int groupNumber;
-  protected final int caseSpecifier;
-
-  protected String[] cachedValue;
-
-  public FieldSource(final FieldDataFactory rd, final String fieldName, final String regExp, final String groupNumber)
-    throws ManifoldCFException {
-    this.rd = rd;
-    this.fieldName = fieldName;
-    if (regExp == null || regExp.length() == 0) {
-      regExpPattern = null;
-      this.groupNumber = 0;
-      this.caseSpecifier = CASE_EXACT;
-    } else {
-      try {
-        this.regExpPattern = Pattern.compile(regExp);
-        if (groupNumber == null || groupNumber.length() == 0) {
-          this.groupNumber = 0;
-          this.caseSpecifier = CASE_EXACT;
-        } else {
-          final StringBuilder sb = new StringBuilder();
-          int caseResult = CASE_EXACT;
-          int i = 0;
-          while (i < groupNumber.length()) {
-            final char theChar = groupNumber.charAt(i++);
-            if (theChar >= '0' && theChar <= '9')
-              sb.append(theChar);
-            else if (theChar == 'l')
-              caseResult = CASE_LOWER;
-            else if (theChar == 'u')
-              caseResult = CASE_UPPER;
-            else
-              throw new ManifoldCFException("Regular expression group specifier '"+groupNumber+"' has illegal character '"+theChar+"'; should be a number, or number + l, or number + u");
-          }
-          if (sb.length() == 0)
-            throw new ManifoldCFException("Regular expression group specifier '"+groupNumber+"' must include a number");
-          this.caseSpecifier = caseResult;
-          this.groupNumber = Integer.parseInt(sb.toString());
-        }
-      } catch (NumberFormatException e) {
-        throw new ManifoldCFException("Regular expression group specifier '"+groupNumber+"': "+e.getMessage(),e);
-      } catch (PatternSyntaxException e) {
-        throw new ManifoldCFException("Regular expression '"+regExp+"': "+e.getMessage(),e);
-      }
-    }
-  }
-    
-  @Override
-  public int getSize()
-    throws IOException, ManifoldCFException {
-    return getRawForm().length;
-  }
-    
-  @Override
-  public Object[] getRawForm()
-    throws IOException, ManifoldCFException {
-    if (regExpPattern != null) {
-      return calculateExtractedResult();
-    }
-    final Object[] rval = rd.getField(fieldName);
-    if (rval == null)
-      return EMPTY_OBJECT_ARRAY;
-    return rval;
-  }
-    
-  @Override
-  public String[] getStringForm()
-    throws IOException, ManifoldCFException {
-    if (regExpPattern != null) {
-      return calculateExtractedResult();
-    }
-    final String[] rval = rd.getFieldAsStrings(fieldName);
-    if (rval == null)
-      return EMPTY_STRING_ARRAY;
-    return rval;
-  }
-  
-  protected String[] calculateExtractedResult()
-    throws IOException, ManifoldCFException {
-    if (cachedValue == null) {
-      final String[] resultSources = rd.getFieldAsStrings(fieldName);
-      final List<String> resultList = new ArrayList<String>(resultSources.length);
-      for (String x : resultSources) {
-        final Matcher m = regExpPattern.matcher(x);
-        if (m.find()) {
-          String result = x.substring(m.start(groupNumber),m.end(groupNumber));
-          switch (caseSpecifier) {
-          case CASE_LOWER:
-            result = result.toLowerCase(Locale.ROOT);
-            break;
-          case CASE_UPPER:
-            result = result.toUpperCase(Locale.ROOT);
-            break;
-          case CASE_EXACT:
-          default:
-            break;
-          }
-          resultList.add(result);
-        }
-      }
-      cachedValue = resultList.toArray(EMPTY_STRING_ARRAY);
-    }
-    return cachedValue;
-  }
-}
diff --git a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/ForcedMetadataConnector.java b/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/ForcedMetadataConnector.java
deleted file mode 100644
index 5e74c1d..0000000
--- a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/ForcedMetadataConnector.java
+++ /dev/null
@@ -1,860 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.forcedmetadata;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This connector works as a transformation connector, and merely adds specified metadata items.
-*
-*/
-public class ForcedMetadataConnector extends org.apache.manifoldcf.agents.transformation.BaseTransformationConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Nodes and attributes representing parameters and values.
-  // There will be node for every parameter/value pair.
-  
-  public static final String NODE_EXPRESSION = "expression";
-  public static final String NODE_PAIR = "pair";
-  public static final String ATTRIBUTE_PARAMETER = "parameter";
-  public static final String NODE_FIELDMAP = "fieldmap";
-  public static final String NODE_KEEPMETADATA = "keepAllMetadata";
-  public static final String NODE_FILTEREMPTY = "filterEmpty";
-  public static final String ATTRIBUTE_SOURCE = "source";
-  public static final String ATTRIBUTE_TARGET = "target";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-  // Templates
-  
-  private static final String VIEW_SPEC = "viewSpecification.html";
-  private static final String EDIT_SPEC_HEADER = "editSpecification.js";
-  private static final String EDIT_SPEC_EXPRESSIONS = "editSpecification_Expressions.html";
-
-  /** Get a pipeline version string, given a pipeline specification object.  The version string is used to
-  * uniquely describe the pertinent details of the specification and the configuration, to allow the Connector 
-  * Framework to determine whether a document will need to be processed again.
-  * Note that the contents of any document cannot be considered by this method; only configuration and specification information
-  * can be considered.
-  *
-  * This method presumes that the underlying connector object has been configured.
-  *@param spec is the current pipeline specification object for this connection for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes configuration and specification in such a way that
-  * if two such strings are equal, nothing that affects how or whether the document is indexed will be different.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    SpecPacker sp = new SpecPacker(spec);
-    return new VersionContext(sp.toPackedString(),params,spec);
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    // Unpack the forced metadata
-    SpecPacker sp = new SpecPacker(pipelineDescription.getSpecification());
-    
-    // Create a structure that will allow us access to fields without sharing Reader objects
-    FieldDataFactory fdf = new FieldDataFactory(document);
-    try {
-      // We have to create a copy of the Repository Document, since we might be rearranging things
-      RepositoryDocument docCopy = document.duplicate();
-      // We must explicitly copy all fields, since we can't share references to Reader objects and
-      // expect anything to work right
-      docCopy.clearFields();
-      
-      // Clear fields, unless we're supposed to keep what we don't specify
-      if (sp.filterEmpty()) {
-        if (sp.keepAllMetadata()) {
-          // Loop through fields and copy them, filtering empties
-          Iterator<String> fields = document.getFields();
-          while (fields.hasNext())
-          {
-            String field = fields.next();
-            moveData(docCopy,field,fdf,field,true);
-          }
-        }
-      } else if (sp.keepAllMetadata()) {
-        // Copy ALL current fields from old document, but go through FieldDataFactory
-        Iterator<String> fields = document.getFields();
-        while (fields.hasNext())
-        {
-          String field = fields.next();
-          moveData(docCopy,field,fdf,field,false);
-        }
-      }
-      
-      // Iterate through the expressions
-      Iterator<String> expressionKeys = sp.getExpressionKeys();
-      while (expressionKeys.hasNext()) {
-        String expressionKey = expressionKeys.next();
-        // Get the set of expressions for the key
-        Set<String> values = sp.getExpressionValues(expressionKey);
-        IDataSource[] dataSources = new IDataSource[values.size()];
-        int k = 0;
-        for (String expression : values) {
-          dataSources[k++] = processExpression(expression, fdf);
-        }
-        int totalSize = 0;
-        for (IDataSource dataSource : dataSources) {
-          if (dataSource != null)
-            totalSize += dataSource.getSize();
-        }
-        if (totalSize == 0) {
-          docCopy.removeField(expressionKey);
-        } else {
-          // Each IDataSource will contribute zero or more results to the final array.  But here's the tricky part:
-          // the results all must be of the same type.  If there are any differences, then we have to bash them all to
-          // strings first.
-          Object[] allValues;
-          k = 0;
-          if (allDates(dataSources)) {
-            allValues = new Date[totalSize];
-            for (IDataSource dataSource : dataSources) {
-              if (dataSource != null) {
-                for (Object o : dataSource.getRawForm()) {
-                  allValues[k++] = o;
-                }
-              }
-            }
-            docCopy.addField(expressionKey,(Date[])conditionallyRemoveNulls(allValues,sp.filterEmpty()));
-          } else if (allReaders(dataSources)) {
-            if (sp.filterEmpty())
-              allValues = new String[totalSize];
-            else
-              allValues = new Reader[totalSize];
-            for (IDataSource dataSource : dataSources) {
-              if (dataSource != null) {
-                Object[] sources = sp.filterEmpty()?dataSource.getStringForm():dataSource.getRawForm();
-                for (Object o : sources) {
-                  allValues[k++] = o;
-                }
-              }
-            }
-            if (sp.filterEmpty())
-              docCopy.addField(expressionKey,removeEmpties((String[])allValues));
-            else
-              docCopy.addField(expressionKey,(Reader[])allValues);
-          } else {
-            allValues = new String[totalSize];
-            // Convert to strings throughout
-            for (IDataSource dataSource : dataSources) {
-              if (dataSource != null) {
-                for (Object o : dataSource.getStringForm()) {
-                  allValues[k++] = o;
-                }
-              }
-            }
-            if (sp.filterEmpty())
-              docCopy.addField(expressionKey,removeEmpties((String[])allValues));
-            else
-              docCopy.addField(expressionKey,(String[])allValues);
-          }
-        }
-      }
-      
-      // Finally, send the modified repository document onward to the next pipeline stage.
-      // If we'd done anything to the stream, we'd have needed to create a new RepositoryDocument object and copied the
-      // data into it, and closed the new stream after sendDocument() was called.
-      return activities.sendDocument(documentURI,docCopy);
-
-    } finally {
-      fdf.close();
-    }
-  }
-
-  protected static boolean allDates(IDataSource[] dataSources)
-    throws IOException, ManifoldCFException {
-    for (IDataSource ds : dataSources) {
-      if (ds != null && !(ds.getRawForm() instanceof Date[]))
-        return false;
-    }
-    return true;
-  }
-
-  protected static boolean allReaders(IDataSource[] dataSources)
-    throws IOException, ManifoldCFException {
-    for (IDataSource ds : dataSources) {
-      if (ds != null && !(ds.getRawForm() instanceof Reader[]))
-        return false;
-    }
-    return true;
-  }
-  
-  protected static void moveData(RepositoryDocument docCopy, String target, FieldDataFactory document, String field, boolean filterEmpty)
-    throws ManifoldCFException, IOException
-  {
-    Object[] fieldData = document.getField(field);
-    if (fieldData instanceof Date[])
-      docCopy.addField(target,(Date[])conditionallyRemoveNulls(fieldData,filterEmpty));
-    else if (fieldData instanceof Reader[])
-    {
-      // To strip out empty fields, we will need to convert readers to strings
-      if (filterEmpty)
-        docCopy.addField(target,removeEmpties(document.getFieldAsStrings(field)));
-      else
-        docCopy.addField(target,(Reader[])fieldData);
-    }
-    else if (fieldData instanceof String[])
-    {
-      String[] processedFieldData;
-      if (filterEmpty)
-        processedFieldData = removeEmpties((String[])fieldData);
-      else
-        processedFieldData = (String[])fieldData;
-      docCopy.addField(target,processedFieldData);
-    }
-  }
-
-  protected static String[] removeEmpties(String[] input)
-  {
-    int count = 0;
-    for (String s : input)
-    {
-      if (s != null && s.length() > 0)
-        count++;
-    }
-    if (count == input.length)
-      return input;
-    
-    String[] rval = new String[count];
-    count = 0;
-    for (String s : input)
-    {
-      if (s != null && s.length() > 0)
-        rval[count++] = s;
-    }
-    return rval;
-
-  }
-  
-  protected static Object[] conditionallyRemoveNulls(Object[] input, boolean filterEmpty)
-  {
-    if (!filterEmpty)
-      return input;
-    int count = 0;
-    for (Object o : input)
-    {
-      if (o != null)
-        count++;
-    }
-    if (count == input.length)
-      return input;
-    
-    Object[] rval = new Object[count];
-    count = 0;
-    for (Object o : input)
-    {
-      if (o != null)
-        rval[count++] = o;
-    }
-    return rval;
-  }
-  
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch (inherited from IConnector) is involved in setting up connection configuration information.
-  // The second bunch
-  // is involved in presenting and editing pipeline specification information for a connection within a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    // Output specification header
-    
-    tabsArray.add(Messages.getString(locale, "ForcedMetadata.Expressions"));
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER,paramMap);
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    // Output specification body
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM",Integer.toString(actualSequenceNumber));
-
-    fillInExpressionsTab(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_EXPRESSIONS,paramMap);
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    // Process specification post
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    String expressionCount = variableContext.getParameter(seqPrefix+"expression_count");
-    if (expressionCount != null)
-    {
-      int count = Integer.parseInt(expressionCount);
-      // Delete old spec data, including legacy node types we no longer use
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode cn = os.getChild(i);
-        if (cn.getType().equals(NODE_EXPRESSION) || cn.getType().equals(NODE_PAIR) || cn.getType().equals(NODE_FIELDMAP))
-          os.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through form data
-      for (int j = 0; j < count; j++)
-      {
-        String op = variableContext.getParameter(seqPrefix+"expression_"+j+"_op");
-        if (op != null && op.equals("Delete"))
-          continue;
-        String paramName = variableContext.getParameter(seqPrefix+"expression_"+j+"_name");
-        String paramRemove = variableContext.getParameter(seqPrefix+"expression_"+j+"_remove");
-        String paramValue = variableContext.getParameter(seqPrefix+"expression_"+j+"_value");
-        SpecificationNode sn = new SpecificationNode(NODE_EXPRESSION);
-        sn.setAttribute(ATTRIBUTE_PARAMETER,paramName);
-        if (!(paramRemove != null && paramRemove.equals("true")))
-          sn.setAttribute(ATTRIBUTE_VALUE,paramValue);
-        os.addChild(os.getChildCount(),sn);
-      }
-      // Look for add operation
-      String addOp = variableContext.getParameter(seqPrefix+"expression_op");
-      if (addOp != null && addOp.equals("Add"))
-      {
-        String paramName = variableContext.getParameter(seqPrefix+"expression_name");
-        String paramRemove = variableContext.getParameter(seqPrefix+"expression_remove");
-        String paramValue = variableContext.getParameter(seqPrefix+"expression_value");
-        SpecificationNode sn = new SpecificationNode(NODE_EXPRESSION);
-        sn.setAttribute(ATTRIBUTE_PARAMETER,paramName);
-        if (!(paramRemove != null && paramRemove.equals("true")))
-          sn.setAttribute(ATTRIBUTE_VALUE,paramValue);
-        os.addChild(os.getChildCount(),sn);
-      }
-
-    }
-    
-    String x = variableContext.getParameter(seqPrefix+"keepallmetadata_present");
-    if (x != null && x.length() > 0)
-    {
-      String keepAll = variableContext.getParameter(seqPrefix+"keepallmetadata");
-      if (keepAll == null)
-        keepAll = "false";
-      // About to gather the fieldmapping nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(NODE_KEEPMETADATA))
-          os.removeChild(i);
-        else
-          i++;
-      }
-
-      // Gather the keep all metadata parameter to be the last one
-      SpecificationNode node = new SpecificationNode(NODE_KEEPMETADATA);
-      node.setAttribute(ATTRIBUTE_VALUE, keepAll);
-      // Add the new keepallmetadata config parameter 
-      os.addChild(os.getChildCount(), node);
-    }
-
-    x = variableContext.getParameter(seqPrefix+"filterempty_present");
-    if (x != null && x.length() > 0)
-    {
-      String filterEmpty = variableContext.getParameter(seqPrefix+"filterempty");
-      if (filterEmpty == null)
-        filterEmpty = "false";
-      // About to gather the fieldmapping nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(NODE_FILTEREMPTY))
-          os.removeChild(i);
-        else
-          i++;
-      }
-
-      // Gather the keep all metadata parameter to be the last one
-      SpecificationNode node = new SpecificationNode(NODE_FILTEREMPTY);
-      node.setAttribute(ATTRIBUTE_VALUE, filterEmpty);
-      // Add the new keepallmetadata config parameter 
-      os.addChild(os.getChildCount(), node);
-    }
-
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    // View specification
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-    
-    // Fill in the map with data from all tabs
-    fillInExpressionsTab(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPEC,paramMap);
-  }
-
-  protected static void fillInExpressionsTab(Map<String,Object> paramMap, Specification os)
-  {
-    final Map<String,Set<String>> expressions = new HashMap<String,Set<String>>();
-    final Map<String,Set<String>> expressionAdditions = new HashMap<String,Set<String>>();
-    final Map<String,Set<String>> additions = new HashMap<String,Set<String>>();
-    
-    String keepAllMetadataValue = "true";
-    String filterEmptyValue = "true";
-    for (int i = 0; i < os.getChildCount(); i++)
-    {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(NODE_FIELDMAP)) {
-        String source = sn.getAttributeValue(ATTRIBUTE_SOURCE);
-        String target = sn.getAttributeValue(ATTRIBUTE_TARGET);
-        String targetDisplay;
-        
-        expressions.put(source,new HashSet<String>());
-        if (target != null)
-        {
-          Set<String> sources = new HashSet<String>();
-          sources.add("${"+source+"}");
-          expressions.put(target,sources);
-        }
-      }
-      else if (sn.getType().equals(NODE_PAIR))
-      {
-        String parameter = sn.getAttributeValue(ATTRIBUTE_PARAMETER);
-        String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-        // Since the same target is completely superceded by a NODE_PAIR, but NODE_PAIRs
-        // are cumulative, I have to build these completely and then post-process them.
-        Set<String> addition = additions.get(parameter);
-        if (addition == null)
-        {
-          addition = new HashSet<String>();
-          additions.put(parameter,addition);
-        }
-        addition.add(nonExpressionEscape(value));
-      }
-      else if (sn.getType().equals(NODE_EXPRESSION))
-      {
-        String parameter = sn.getAttributeValue(ATTRIBUTE_PARAMETER);
-        String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-        if (value == null) {
-          expressionAdditions.put(parameter,new HashSet<String>());
-        } else {
-          Set<String> expressionAddition = expressionAdditions.get(parameter);
-          if (expressionAddition == null)
-          {
-            expressionAddition = new HashSet<String>();
-            expressionAdditions.put(parameter,expressionAddition);
-          }
-          expressionAddition.add(value);
-        }
-      }
-      else if (sn.getType().equals(NODE_KEEPMETADATA))
-      {
-        keepAllMetadataValue = sn.getAttributeValue(ATTRIBUTE_VALUE);
-      }
-      else if (sn.getType().equals(NODE_FILTEREMPTY))
-      {
-        filterEmptyValue = sn.getAttributeValue(ATTRIBUTE_VALUE);
-      }
-    }
-    
-    // Postprocessing.
-    // Override the moves with the additions
-    for (String parameter : additions.keySet())
-    {
-      expressions.put(parameter,additions.get(parameter));
-    }
-
-    // Override all with expression additions
-    for (String parameter : expressionAdditions.keySet())
-    {
-      expressions.put(parameter,expressionAdditions.get(parameter));
-    }
-
-    // Problem: how to display case where we want a null source??
-    // A: Special value
-    List<Map<String,String>> pObject = new ArrayList<Map<String,String>>();
-    String[] keys = expressions.keySet().toArray(new String[0]);
-    java.util.Arrays.sort(keys);
-    
-    // Now, build map
-    for (String key : keys)
-    {
-      Set<String> values = expressions.get(key);
-      if (values.size() == 0) {
-        Map<String,String> record = new HashMap<String,String>();
-        record.put("parameter",key);
-        record.put("value","");
-        record.put("isnull","true");
-        pObject.add(record);
-      } else {
-        String[] valueArray = values.toArray(new String[0]);
-        java.util.Arrays.sort(valueArray);
-        
-        for (String value : valueArray)
-        {
-          Map<String,String> record = new HashMap<String,String>();
-          record.put("parameter",key);
-          record.put("value",value);
-          record.put("isnull","false");
-          pObject.add(record);
-        }
-      }
-    }
-    
-    paramMap.put("EXPRESSIONS",pObject);
-    paramMap.put("KEEPALLMETADATA",keepAllMetadataValue);
-    paramMap.put("FILTEREMPTY",filterEmptyValue);
-  }
-  
-  /** This is used to upgrade older constant values to new ones, that won't trigger expression eval.
-  */
-  protected static String nonExpressionEscape(String input) {
-    // Not doing any escaping yet
-    return input;
-  }
-
-  /** This is used to unescape text that's been escaped to prevent substitution of ${} expressions.
-  */
-  protected static String nonExpressionUnescape(String input) {
-    // Not doing any escaping yet
-    return input;
-  }
-  
-  
-  protected static IDataSource append(IDataSource currentValues, IDataSource data)
-    throws IOException, ManifoldCFException {
-    // currentValues and data can either be:
-    // Date[], String[], or Reader[].
-    // We want to preserve the type in as high a form as possible when we compute the combinations.
-    if (currentValues == null)
-      return data;
-    if (currentValues.getSize() == 0)
-      return currentValues;
-    // Any combination causes conversion to a string, so if we get here, we can read the inputs all
-    // as strings safely.
-    String[] currentStrings = currentValues.getStringForm();
-    String[] dataStrings = data.getStringForm();
-    String[] rval = new String[currentStrings.length * dataStrings.length];
-    int rvalIndex = 0;
-    for (String currentString : currentStrings) {
-      for (String dataString : dataStrings) {
-        rval[rvalIndex++] = currentString + dataString;
-      }
-    }
-    return new StringSource(rval);
-  }
-  
-  public static IDataSource processExpression(String expression, FieldDataFactory sourceDocument)
-    throws IOException, ManifoldCFException {
-    int index = 0;
-    IDataSource input = null;
-    while (true) {
-      // If we're at the end, return the input
-      if (index == expression.length())
-        return input;
-      // Look for next field specification
-      int field = expression.indexOf("${",index);
-      if (field == -1)
-        return append(input, new StringSource(nonExpressionUnescape(expression.substring(index))));
-      if (field > 0)
-        input = append(input, new StringSource(nonExpressionUnescape(expression.substring(index,field))));
-      // Parse the field name, and regular expression (if any)
-      StringBuilder fieldNameBuffer = new StringBuilder();
-      StringBuilder regExpBuffer = new StringBuilder();
-      StringBuilder groupNumberBuffer = new StringBuilder();
-      field = parseArgument(expression, field+2, fieldNameBuffer);
-      field = parseArgument(expression, field, regExpBuffer);
-      field = parseArgument(expression, field, groupNumberBuffer);
-      int fieldEnd = parseToEnd(expression, field);
-      if (fieldEnd == expression.length()) {
-        if (fieldNameBuffer.length() > 0)
-          return append(input, new FieldSource(sourceDocument, fieldNameBuffer.toString(), regExpBuffer.toString(), groupNumberBuffer.toString()));
-        return input;
-      } else {
-        if (fieldNameBuffer.length() > 0)
-          input = append(input, new FieldSource(sourceDocument, fieldNameBuffer.toString(), regExpBuffer.toString(), groupNumberBuffer.toString()));
-        index = fieldEnd;
-      }
-    }
-  }
-  
-  protected static int parseArgument(final String input, int start, final StringBuilder output) {
-    // Parse until we hit the end marker or an unescaped pipe symbol
-    while (true) {
-      if (input.length() == start)
-        return start;
-      char theChar = input.charAt(start);
-      if (theChar == '}')
-        return start;
-      start++;
-      if (theChar == '|')
-        return start;
-      if (theChar == '\\') {
-        if (input.length() == start)
-          return start;
-        theChar = input.charAt(start++);
-      }
-      output.append(theChar);
-    }
-  }
-  
-  protected static int parseToEnd(final String input, int start) {
-    while (true) {
-      if (input.length() == start)
-        return start;
-      char theChar = input.charAt(start++);
-      if (theChar == '}')
-        return start;
-      if (theChar == '\\') {
-        if (input.length() == start)
-          return start;
-        start++;
-      }
-    }
-  }
-
-  protected static class SpecPacker {
-    
-    private final boolean keepAllMetadata;
-    private final boolean filterEmpty;
-    private final Map<String,Set<String>> expressions = new HashMap<String,Set<String>>();
-
-    public SpecPacker(Specification os) {
-      boolean keepAllMetadata = true;
-      boolean filterEmpty = true;
-      final Map<String,Set<String>> additions = new HashMap<String,Set<String>>();
-      final Map<String,Set<String>> expressionAdditions = new HashMap<String,Set<String>>();
-      for (int i = 0; i < os.getChildCount(); i++) {
-        SpecificationNode sn = os.getChild(i);
-        
-        if(sn.getType().equals(NODE_KEEPMETADATA)) {
-          String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-          keepAllMetadata = Boolean.parseBoolean(value);
-        } else if (sn.getType().equals(NODE_FILTEREMPTY)) {
-          String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-          filterEmpty = Boolean.parseBoolean(value);
-        } else if (sn.getType().equals(NODE_FIELDMAP)) {
-          String source = sn.getAttributeValue(ATTRIBUTE_SOURCE);
-          String target = sn.getAttributeValue(ATTRIBUTE_TARGET);
-          
-          expressions.put(source,new HashSet<String>());
-          // Null target means to remove the *source* from the document.
-          if (target != null) {
-            Set<String> sources = new HashSet<String>();
-            sources.add("${"+source+"}");
-            expressions.put(target,sources);
-          }
-        }
-        else if (sn.getType().equals(NODE_PAIR))
-        {
-          String parameter = sn.getAttributeValue(ATTRIBUTE_PARAMETER);
-          String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-          // Since the same target is completely superceded by a NODE_PAIR, but NODE_PAIRs
-          // are cumulative, I have to build these completely and then post-process them.
-          Set<String> addition = additions.get(parameter);
-          if (addition == null)
-          {
-            addition = new HashSet<String>();
-            additions.put(parameter,addition);
-          }
-          addition.add(nonExpressionEscape(value));
-        }
-        else if (sn.getType().equals(NODE_EXPRESSION))
-        {
-          String parameter = sn.getAttributeValue(ATTRIBUTE_PARAMETER);
-          String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-          if (value == null) {
-            expressionAdditions.put(parameter,new HashSet<String>());
-          } else {
-            Set<String> expressionAddition = expressionAdditions.get(parameter);
-            if (expressionAddition == null)
-            {
-              expressionAddition = new HashSet<String>();
-              expressionAdditions.put(parameter,expressionAddition);
-            }
-            expressionAddition.add(value);
-          }
-        }
-      }
-      
-      // Override the moves with the additions
-      for (String parameter : additions.keySet())
-      {
-        expressions.put(parameter,additions.get(parameter));
-      }
-
-      // Override all with expression additions
-      for (String parameter : expressionAdditions.keySet())
-      {
-        expressions.put(parameter,expressionAdditions.get(parameter));
-      }
-      
-      this.keepAllMetadata = keepAllMetadata;
-      this.filterEmpty = filterEmpty;
-    }
-    
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-      int i;
-      
-      final String[] sortArray = expressions.keySet().toArray(new String[0]);
-      java.util.Arrays.sort(sortArray);
-      // Pack the list of keys
-      packList(sb,sortArray,'+');
-      for (String key : sortArray) {
-        Set<String> values = expressions.get(key);
-        String[] valueArray = values.toArray(new String[0]);
-        java.util.Arrays.sort(valueArray);
-        packList(sb,valueArray,'+');
-      }
-
-      // Keep all metadata
-      if (keepAllMetadata)
-        sb.append('+');
-      else
-        sb.append('-');
-      
-      // Filter empty
-      if (filterEmpty)
-        sb.append('+');
-      else
-        sb.append('-');
-
-      return sb.toString();
-    }
-    
-    public Iterator<String> getExpressionKeys()
-    {
-      return expressions.keySet().iterator();
-    }
-    
-    public Set<String> getExpressionValues(String key)
-    {
-      return expressions.get(key);
-    }
-    
-    public boolean keepAllMetadata() {
-      return keepAllMetadata;
-    }
-    
-    public boolean filterEmpty() {
-      return filterEmpty;
-    }
-  }
-  
-}
-
-
diff --git a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/IDataSource.java b/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/IDataSource.java
deleted file mode 100644
index ffb0e2e..0000000
--- a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/IDataSource.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.forcedmetadata;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes a general field data source.
-*/
-public interface IDataSource {
-  public int getSize() throws IOException, ManifoldCFException;
-  public Object[] getRawForm() throws IOException, ManifoldCFException;
-  public String[] getStringForm() throws IOException, ManifoldCFException;
-}
diff --git a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/Messages.java b/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/Messages.java
deleted file mode 100644
index 11d7170..0000000
--- a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.forcedmetadata;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.transformation.forcedmetadata.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.transformation.forcedmetadata";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/StringSource.java b/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/StringSource.java
deleted file mode 100644
index e403d03..0000000
--- a/connectors/forcedmetadata/connector/src/main/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/StringSource.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.forcedmetadata;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-public class StringSource implements IDataSource {
-  protected final String[] data;
-    
-  public StringSource(String data) {
-    this.data = new String[]{data};
-  }
-    
-  public StringSource(String[] data) {
-    this.data = data;
-  }
-    
-  @Override
-  public int getSize() {
-    return data.length;
-  }
-    
-  @Override
-  public Object[] getRawForm() {
-    return data;
-  }
-    
-  @Override
-  public String[] getStringForm() {
-    return data;
-  }
-}
diff --git a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_en_US.properties b/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_en_US.properties
deleted file mode 100644
index c6c582f..0000000
--- a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_en_US.properties
+++ /dev/null
@@ -1,32 +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.
-
-ForcedMetadata.Expressions=Metadata expressions
-ForcedMetadata.RemoveQ=Remove this parameter?
-ForcedMetadata.ParameterValueExpression=Expression ("${fieldname}" references a field)
-ForcedMetadata.MetadataExpressionsColon=Metadata expressions:
-ForcedMetadata.NoExpressionsSpecified=No expressions provided
-ForcedMetadata.Deleteexpressionnumber=Delete expression #
-ForcedMetadata.Addexpression=Add expression
-ForcedMetadata.True=true
-ForcedMetadata.False=false
-ForcedMetadata.ExpressionMetadataNameMustNotBeNull=Expression metadata name must not be null
-ForcedMetadata.ParameterName=Parameter name
-ForcedMetadata.Delete=Delete
-ForcedMetadata.Add=Add
-ForcedMetadata.KeepAllMetadata=Keep all incoming metadata
-ForcedMetadata.FilterEmpty=Remove empty metadata values
-ForcedMetadata.NoFieldNameSpecified=Please specify a metadata name
-ForcedMetadata.ForcedMetadataNameMustNotBeNull=Metadata name must not be null
diff --git a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_es_ES.properties b/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_es_ES.properties
deleted file mode 100644
index 91aeeab..0000000
--- a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_es_ES.properties
+++ /dev/null
@@ -1,32 +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.
-
-ForcedMetadata.Expressions=expresiones de metadatos
-ForcedMetadata.RemoveQ=Eliminar este parámetro?
-ForcedMetadata.ParameterValueExpression=Expresión ("${nombre del campo}" hace referencia a un campo)
-ForcedMetadata.MetadataExpressionsColon=expresiones de metadatos:
-ForcedMetadata.NoExpressionsSpecified=No hay expresiones proporcionadas
-ForcedMetadata.Deleteexpressionnumber=eliminar expresión #
-ForcedMetadata.Addexpression=Añadir expresión
-ForcedMetadata.True=verdadero
-ForcedMetadata.False=falso
-ForcedMetadata.ExpressionMetadataNameMustNotBeNull=Expresión nombre de metadatos no debe ser nulo
-ForcedMetadata.ParameterName=nombre del parámetro
-ForcedMetadata.Delete=borrar
-ForcedMetadata.Add=añadir
-ForcedMetadata.KeepAllMetadata=Mantenga todos los metadatos de entrada
-ForcedMetadata.FilterEmpty=Retire valores de metadatos vacías
-ForcedMetadata.NoFieldNameSpecified=Por favor, especifique un nombre de metadatos
-ForcedMetadata.ForcedMetadataNameMustNotBeNull=Metadata name must not be null
diff --git a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_ja_JP.properties b/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_ja_JP.properties
deleted file mode 100644
index 7218e18..0000000
--- a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_ja_JP.properties
+++ /dev/null
@@ -1,32 +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.
-
-ForcedMetadata.Expressions=Metadata expressions
-ForcedMetadata.RemoveQ=Remove this parameter?
-ForcedMetadata.ParameterValueExpression=Expression ("${fieldname}" references a field)
-ForcedMetadata.MetadataExpressionsColon=Metadata expressions:
-ForcedMetadata.NoExpressionsSpecified=No expressions provided
-ForcedMetadata.Deleteexpressionnumber=Delete expression #
-ForcedMetadata.Addexpression=Add expression
-ForcedMetadata.True=true
-ForcedMetadata.False=false
-ForcedMetadata.ExpressionMetadataNameMustNotBeNull=Expression metadata name must not be null
-ForcedMetadata.ParameterName=パラメータ名
-ForcedMetadata.Delete=削除
-ForcedMetadata.Add=追加
-ForcedMetadata.KeepAllMetadata=全メタデータを保存
-ForcedMetadata.FilterEmpty=Remove empty metadata values
-ForcedMetadata.NoFieldNameSpecified=フィールド名を入力してください
-ForcedMetadata.ForcedMetadataNameMustNotBeNull=Metadata name must not be null
diff --git a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_zh_CN.properties b/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_zh_CN.properties
deleted file mode 100644
index b791958..0000000
--- a/connectors/forcedmetadata/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/forcedmetadata/common_zh_CN.properties
+++ /dev/null
@@ -1,32 +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.
-
-ForcedMetadata.Expressions=Metadata expressions
-ForcedMetadata.RemoveQ=Remove this parameter?
-ForcedMetadata.ParameterValueExpression=Expression ("${fieldname}" references a field)
-ForcedMetadata.MetadataExpressionsColon=Metadata expressions:
-ForcedMetadata.NoExpressionsSpecified=No expressions provided
-ForcedMetadata.Deleteexpressionnumber=Delete expression #
-ForcedMetadata.Addexpression=Add expression
-ForcedMetadata.True=true
-ForcedMetadata.False=false
-ForcedMetadata.ExpressionMetadataNameMustNotBeNull=Expression metadata name must not be null
-ForcedMetadata.ParameterName=参数名
-ForcedMetadata.Delete=删除
-ForcedMetadata.Add=添加
-ForcedMetadata.KeepAllMetadata=保持所有元数据
-ForcedMetadata.FilterEmpty=Remove empty metadata values
-ForcedMetadata.NoFieldNameSpecified=请指定字段名
-ForcedMetadata.ForcedMetadataNameMustNotBeNull=Metadata name must not be null
diff --git a/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/editSpecification.js b/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/editSpecification.js
deleted file mode 100644
index 70d75d3..0000000
--- a/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/editSpecification.js
+++ /dev/null
@@ -1,99 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SEQNUM}_AddExpression()
-{
-  if (editjob.s${SEQNUM}_expression_name.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ForcedMetadata.ExpressionMetadataNameMustNotBeNull'))");
-    editjob.s${SEQNUM}_expression_name.focus();
-    return;
-  }
-  document.editjob.s${SEQNUM}_expression_op.value="Add";
-  postFormSetAnchor("s${SEQNUM}_expression_tag");
-}
-	
-function s${SEQNUM}_DeleteExpression(n)
-{
-  eval("document.editjob.s${SEQNUM}_expression_"+n+"_op.value = 'Delete'");
-  if (n == 0)
-    postFormSetAnchor("s${SEQNUM}_expression_tag");
-  else
-    postFormSetAnchor("s${SEQNUM}_expression_"+(n-1)+"_tag");
-}
-
-function s${SEQNUM}_AddForcedMetadata()
-{
-  if (editjob.s${SEQNUM}_forcedmetadata_name.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ForcedMetadata.ForcedMetadataNameMustNotBeNull'))");
-    editjob.s${SEQNUM}_forcedmetadata_name.focus();
-    return;
-  }
-  document.editjob.s${SEQNUM}_forcedmetadata_op.value="Add";
-  postFormSetAnchor("s${SEQNUM}_forcedmetadata_tag");
-}
-	
-function s${SEQNUM}_DeleteForcedMetadata(n)
-{
-  eval("document.editjob.s${SEQNUM}_forcedmetadata_"+n+"_op.value = 'Delete'");
-  if (n == 0)
-    postFormSetAnchor("s${SEQNUM}_forcedmetadata_tag");
-  else
-    postFormSetAnchor("s${SEQNUM}_forcedmetadata_"+(n-1)+"_tag");
-}
-
-function s${SEQNUM}_addFieldMapping()
-{
-  if (editjob.s${SEQNUM}_fieldmapping_source.value == "")
-  {
-    alert("$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.NoFieldNameSpecified'))");
-    editjob.s${SEQNUM}_fieldmapping_source.focus();
-    return;
-  }
-  editjob.s${SEQNUM}_fieldmapping_op.value="Add";
-  postFormSetAnchor("s${SEQNUM}_fieldmapping");
-}
-
-function s${SEQNUM}_deleteFieldMapping(i)
-{
-  // Set the operation
-  eval("editjob.s${SEQNUM}_fieldmapping_op_"+i+".value=\"Delete\"");
-  // Submit
-  if (editjob.s${SEQNUM}_fieldmapping_count.value==i)
-    postFormSetAnchor("s${SEQNUM}_fieldmapping");
-  else
-    postFormSetAnchor("s${SEQNUM}_fieldmapping_"+i)
-  // Undo, so we won't get two deletes next time
-  eval("editjob.s${SEQNUM}_fieldmapping_op_"+i+".value=\"Continue\"");
-}
-
-function s${SEQNUM}_checkSpecificationForSave()
-{
-  return true;
-}
-
-function s${SEQNUM}_checkSpecification()
-{
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/editSpecification_Expressions.html b/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/editSpecification_Expressions.html
deleted file mode 100644
index 3ba9e5b..0000000
--- a/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/editSpecification_Expressions.html
+++ /dev/null
@@ -1,139 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('ForcedMetadata.Expressions') && $SEQNUM == $SELECTEDNUM)
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="4"><hr/></td>
-  </tr>
-  <tr>
-    <td class="description" colspan="1"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.MetadataExpressionsColon'))</nobr></td>
-    <td class="boxcell" colspan="3">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.ParameterName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.RemoveQ'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.ParameterValueExpression'))</nobr></td>
-        </tr>
-  #set($paramcounter = 0)
-  #foreach($paramrecord in $EXPRESSIONS)
-    #if(($paramcounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <a name="s${SEQNUM}_expression_${paramcounter}_tag"/>
-            <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ForcedMetadata.Delete'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('ForcedMetadata.Deleteexpressionnumber'))${paramcounter}" onclick='javascript:s${SEQNUM}_DeleteExpression(${paramcounter});'/>
-            <input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_op" value="Continue"/>
-            <input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_name" value="$Encoder.attributeEscape($paramrecord.get('parameter'))"/>
-            <input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_remove" value="$Encoder.attributeEscape($paramrecord.get('isnull'))"/>
-            <input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_value" value="$Encoder.attributeEscape($paramrecord.get('value'))"/>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($paramrecord.get('parameter'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-    #if($paramrecord.get('isnull') == 'true')
-              $Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.True'))
-    #end
-    #if($paramrecord.get('isnull') == 'false')
-              $Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.False'))
-    #end
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($paramrecord.get('value'))</nobr>
-          </td>
-        </tr>
-    #set($paramcounter = $paramcounter + 1)
-  #end
-  #if($paramcounter == 0)
-        <tr class="formrow"><td colspan="4" class="formcolumnmessage"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.NoExpressionsSpecified'))</nobr></td></tr>
-  #end
-        <tr class="formrow"><td colspan="4" class="formseparator"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <a name="s${SEQNUM}_expression_tag"/>
-            <input type="hidden" name="s${SEQNUM}_expression_op" value="Continue"/>
-            <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('ForcedMetadata.Add'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('ForcedMetadata.Addexpression'))" onclick="javascript:s${SEQNUM}_AddExpression();"/>
-            <input type="hidden" name="s${SEQNUM}_expression_count" value="${paramcounter}"/>
-          </td>
-          <td class="formcolumncell">
-            <input type="text" name="s${SEQNUM}_expression_name" size="30" value=""/>
-          </td>
-          <td class="formcolumncell">
-            <select name="s${SEQNUM}_expression_remove" size="2">
-              <option name="true">$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.True'))</option>
-              <option name="false" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.False'))</option>
-            </select>
-          </td>
-          <td class="formcolumncell">
-            <input type="text" name="s${SEQNUM}_expression_value" size="30" value=""/>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="4"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.KeepAllMetadata'))</nobr></td>
-    <td class="value" colspan="3">
-      <input type="hidden" name="s${SEQNUM}_keepallmetadata_present" value="true"/>
-  #if($KEEPALLMETADATA == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_keepallmetadata" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_keepallmetadata" value="true"/>
-  #end
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.FilterEmpty'))</nobr></td>
-    <td class="value" colspan="3">
-      <input type="hidden" name="s${SEQNUM}_filterempty_present" value="true"/>
-  #if($FILTEREMPTY == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_filterempty" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_filterempty" value="true"/>
-  #end
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-  #set($paramcounter = 0)
-  #foreach($paramrecord in $EXPRESSIONS)
-<input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_name" value="$Encoder.attributeEscape($paramrecord.get('parameter'))" />
-<input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_remove" value="$Encoder.attributeEscape($paramrecord.get('isnull'))" />
-<input type="hidden" name="s${SEQNUM}_expression_${paramcounter}_value" value="$Encoder.attributeEscape($paramrecord.get('value'))" />
-    #set($paramcounter = $paramcounter + 1)
-  #end
-<input type="hidden" name="s${SEQNUM}_expression_count" value="${paramcounter}"/>
-<input type="hidden" name="s${SEQNUM}_keepallmetadata_present" value="true"/>
-<input type="hidden" name="s${SEQNUM}_keepallmetadata" value="$Encoder.attributeEscape($KEEPALLMETADATA)"/>
-<input type="hidden" name="s${SEQNUM}_filterempty_present" value="true"/>
-<input type="hidden" name="s${SEQNUM}_filterempty" value="$Encoder.attributeEscape($FILTEREMPTY)"/>
-
-#end
diff --git a/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/viewSpecification.html b/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/viewSpecification.html
deleted file mode 100644
index a7cc250..0000000
--- a/connectors/forcedmetadata/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/forcedmetadata/viewSpecification.html
+++ /dev/null
@@ -1,69 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description" colspan="1"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.MetadataExpressionsColon'))</nobr></td>
-    <td class="boxcell" colspan="3">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.ParameterName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.RemoveQ'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.ParameterValueExpression'))</nobr></td>
-        </tr>
-  #set($paramcounter = 0)
-  #foreach($paramrecord in $EXPRESSIONS)
-    #if(($paramcounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($paramrecord.get('parameter'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-    #if($paramrecord.get('isnull') == 'true')
-              $Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.True'))
-    #end
-    #if($paramrecord.get('isnull') == 'false')
-              $Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.False'))
-    #end
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($paramrecord.get('value'))</nobr>
-          </td>
-        </tr>
-    #set($paramcounter = $paramcounter + 1)
-  #end
-  #if($paramcounter == 0)
-        <tr class="formrow"><td colspan="4" class="formcolumnmessage"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.NoExpressionsSpecified'))</nobr></td></tr>
-  #end
-      </table>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="4"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.KeepAllMetadata'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($KEEPALLMETADATA)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ForcedMetadata.FilterEmpty'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($FILTEREMPTY)</nobr></td>
-  </tr>
-</table>
diff --git a/connectors/forcedmetadata/connector/src/test/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/ExpressionTest.java b/connectors/forcedmetadata/connector/src/test/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/ExpressionTest.java
deleted file mode 100644
index 9d440b8..0000000
--- a/connectors/forcedmetadata/connector/src/test/java/org/apache/manifoldcf/agents/transformation/forcedmetadata/ExpressionTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.agents.transformation.forcedmetadata.*;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import java.io.*;
-import java.util.*;
-
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class ExpressionTest
-{
-
-  @Test
-  public void simpleExpressions()
-    throws Exception {
-    RepositoryDocument inputDoc = new RepositoryDocument();
-    inputDoc.addField("stringfield",new String[]{"stringa","stringb","stringc"});
-    inputDoc.addField("readerfield",new Reader[]{new StringReader("readera"),new StringReader("readerb")});
-    inputDoc.addField("datefield",new Date[]{new Date(0L), new Date(100000000L)});
-    FieldDataFactory fdf = new FieldDataFactory(inputDoc);
-    try {
-      arrayEquals(new String[]{"stringa","stringb","stringc"}, (String[])(ForcedMetadataConnector.processExpression("${stringfield}", fdf).getRawForm()));
-      arrayEquals(new String[]{"prefixstringapostfix","prefixstringbpostfix","prefixstringcpostfix"}, (String[])(ForcedMetadataConnector.processExpression("prefix${stringfield}postfix", fdf).getRawForm()));
-      arrayEquals(new Reader[]{new StringReader("readera"),new StringReader("readerb")}, (Reader[])(ForcedMetadataConnector.processExpression("${readerfield}", fdf).getRawForm()));
-      // Second access of reader fields, without prior string conversion, also must work
-      arrayEquals(new Reader[]{new StringReader("readera"),new StringReader("readerb")}, (Reader[])(ForcedMetadataConnector.processExpression("${readerfield}", fdf).getRawForm()));
-      arrayEquals(new String[]{"prefixreaderapostfix","prefixreaderbpostfix"}, (String[])(ForcedMetadataConnector.processExpression("prefix${readerfield}postfix", fdf).getRawForm()));
-      arrayEquals(new String[]{"prefixapostfix","prefixbpostfix","prefixcpostfix"}, (String[])(ForcedMetadataConnector.processExpression("prefix${stringfield|string([abc])|1}postfix", fdf).getRawForm()));
-      arrayEquals(new String[]{"prefixApostfix","prefixBpostfix","prefixCpostfix"}, (String[])(ForcedMetadataConnector.processExpression("prefix${stringfield|string([abc])|1u}postfix", fdf).getRawForm()));
-    } finally {
-      fdf.close();
-    }
-  }
-  
-  protected static void arrayEquals(Reader[] expected, Reader[] actual)
-    throws Exception {
-    assertEquals(expected.length,actual.length);
-    Set<String> expectedSet = new HashSet<String>();
-    for (Reader expectedValue : expected) {
-      expectedSet.add(readData(expectedValue));
-    }
-    for (Reader actualValue : actual) {
-      assertEquals(true,expectedSet.contains(readData(actualValue)));
-    }
-
-  }
-  
-  protected static String readData(Reader r)
-    throws IOException {
-    StringBuilder sb = new StringBuilder();
-    char[] buffer = new char[65536];
-    while (true) {
-      int amt = r.read(buffer);
-      if (amt == -1)
-        break;
-      sb.append(buffer,0,amt);
-    }
-    return sb.toString();
-  }
-  
-  protected static void arrayEquals(String[] expected, String[] actual)
-    throws Exception {
-    assertEquals(expected.length,actual.length);
-    Set<String> expectedSet = new HashSet<String>();
-    for (String expectedValue : expected) {
-      expectedSet.add(expectedValue);
-    }
-    for (String actualValue : actual) {
-      assertEquals(true,expectedSet.contains(actualValue));
-    }
-  }
-}
diff --git a/connectors/forcedmetadata/pom.xml b/connectors/forcedmetadata/pom.xml
deleted file mode 100644
index 4c0f86a..0000000
--- a/connectors/forcedmetadata/pom.xml
+++ /dev/null
@@ -1,355 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-forcedmetadata-connector</artifactId>
-  <name>ManifoldCF - Connectors - Forced metadata</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/generic/.gitignore b/connectors/generic/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/generic/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/generic/API.txt b/connectors/generic/API.txt
deleted file mode 100644
index 92c8186..0000000
--- a/connectors/generic/API.txt
+++ /dev/null
@@ -1,86 +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.

-

-API should be implemented as web page (entry point) returning results based on provided GET params. API can be secured with HTTP basic authentication.

-There are 4 actions:

-- check

-- seed

-- items

-- item

-

-Action is passed as "action" GET param to the entrypoint.

-

-

-----------------------------------------------------------------------------------------------------

-[entrypoint]?action=check

-----------------------------------------------------------------------------------------------------

-should return HTTP status code 200 providing information that entrypoint is working properly.

-

-----------------------------------------------------------------------------------------------------

-[entrypoint]?action=seed&startDate=YYYY-MM-DDTHH:mm:ssZ&endDate=YYYY-MM-DDTHH:mm:ssZ

-----------------------------------------------------------------------------------------------------

-parameters:

-startDate - the start of time frame which should be applied to returned seeds. If this is a first run - this parameter will not be provided meaning that all documents should be returned.

-endDate - the end of time frame. Always provided.

-

-startDate and endDate parameters are encoded as YYYY-MM-DD'T'HH:mm:ss'Z'. Result should be valid XML of form:

-<seeds>

-   <seed id="document_id_1" />

-   <seed id="document_id_2" />

-   ...

-</seeds>

-

-attributes "id" are required.

-

-----------------------------------------------------------------------------------------------------

-[entrypoint]?action=items&id[]=document_id_1&id=document_id_2

-----------------------------------------------------------------------------------------------------

-parameters:

-id[] - array of document IDs that should be returned

-

-Result should be valid XML of form:

-<items>

-   <item id="document_id_1">

-      <url>[http://document_uri]</url>

-      <version>[document_version]</version>

-	  <created>2013-11-11T21:00:00Z</created>

-	  <updated>2013-11-11T21:00:00Z</updated>

-	  <filename>filename.ext</filename>

-	  <mimetype>mime/type</mimetype>

-	  <metadata>

-	     <meta name="meta_name_1">meta_value_1</meta>

-	     <meta name="meta_name_2">meta_value_2</meta>

-		 ...

-	  </metadata>

-	  <auth>

-		 <token>auth_token_1</token>

-		 <token>auth_token_2</token>

-		 ...

-	  </auth>

-	  <content>Document content</content>

-   </item>

-   ...

-</items>

-

-id, url, version are required, the rest is optional. If "auth" tag is provided - document will be treated as non-public with defined access tokens, if it is ommited - document will be public.

-if content tag is ommited - connector will ask for document content as "action=item" separate API call.

-

-----------------------------------------------------------------------------------------------------

-[entrypoint]?action=item&id=document_id

-----------------------------------------------------------------------------------------------------

-parameters:

-id - requested document ID

-

-Result should be the document content. It does not have to be XML - you may return binary data (PDF, DOC, etc) which represent the document.
\ No newline at end of file
diff --git a/connectors/generic/build.xml b/connectors/generic/build.xml
deleted file mode 100644
index 438e902..0000000
--- a/connectors/generic/build.xml
+++ /dev/null
@@ -1,60 +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.

--->

-

-<project name="generic" default="all">

-

-    <property environment="env"/>

-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">

-        <isset property="env.MCFDISTPATH"/>

-    </condition>

-    <property name="abs-dist" location="../../dist"/>

-    <condition property="mcf-dist" value="${abs-dist}">

-        <not>

-            <isset property="env.MCFDISTPATH"/>

-        </not>

-    </condition>

-

-    <import file="${mcf-dist}/connector-build.xml"/>

-

-    <path id="connector-classpath">

-        <path refid="mcf-connector-build.connector-classpath"/>

-        <fileset dir="${mcf-dist}/lib">

-            <include name="jaxb-impl*.jar"/>

-        </fileset>

-    </path>

-

-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">

-        <mkdir dir="dist/lib"/>

-        <copy todir="dist/lib">

-            <fileset dir="${mcf-dist}/lib">

-                <include name="jaxb-impl*.jar"/>

-            </fileset>

-        </copy>

-    </target>

-

-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">

-        <antcall target="general-add-repository-connector">

-            <param name="connector-label" value="Generic"/>

-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.generic.GenericConnector"/>

-        </antcall>

-        <antcall target="general-add-authority-connector">

-            <param name="connector-label" value="Generic"/>

-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.generic.GenericAuthority"/>

-        </antcall>

-    </target>

-

-</project>

diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/generic/GenericAuthority.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/generic/GenericAuthority.java
deleted file mode 100644
index 4789ccf..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/generic/GenericAuthority.java
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.authorities.authorities.generic;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Locale;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.EntityUtils;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.core.interfaces.CacheManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ICacheCreateHandle;
-import org.apache.manifoldcf.core.interfaces.ICacheDescription;
-import org.apache.manifoldcf.core.interfaces.ICacheHandle;
-import org.apache.manifoldcf.core.interfaces.ICacheManager;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.StringSet;
-import org.apache.manifoldcf.crawler.connectors.generic.api.Auth;
-import org.apache.manifoldcf.ui.util.Encoder;
-
-/**
- *
- * @author krycek
- */
-public class GenericAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector {
-
-  public static final String _rcsid = "@(#)$Id: GenericAuthority.java 1496653 2013-06-25 22:05:04Z mlizewski $";
-
-  /**
-   * This is the active directory global deny token. This should be ingested
-   * with all documents.
-   */
-  private static final String globalDenyToken = "DEAD_AUTHORITY";
-
-  private static final AuthorizationResponse unreachableResponse = new AuthorizationResponse(new String[]{globalDenyToken},
-    AuthorizationResponse.RESPONSE_UNREACHABLE);
-
-  private static final AuthorizationResponse userNotFoundResponse = new AuthorizationResponse(new String[]{globalDenyToken},
-    AuthorizationResponse.RESPONSE_USERNOTFOUND);
-
-  private final static String ACTION_PARAM_NAME = "action";
-
-  private final static String ACTION_AUTH = "auth";
-
-  private final static String ACTION_CHECK = "check";
-
-  private String genericLogin = null;
-
-  private String genericPassword = null;
-
-  private String genericEntryPoint = null;
-
-  private int connectionTimeoutMillis = 60 * 1000;
-
-  private int socketTimeoutMillis = 30 * 60 * 1000;
-
-  private long responseLifetime = 60000L; //60sec
-
-  private int LRUsize = 1000;
-
-  private DefaultHttpClient client = null;
-
-  private long sessionExpirationTime = -1L;
-
-  /**
-   * Cache manager.
-   */
-  private ICacheManager cacheManager = null;
-
-  /**
-   * Constructor.
-   */
-  public GenericAuthority() {
-  }
-
-  /**
-   * Set thread context.
-   */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-
-  /**
-   * Connect. The configuration parameters are included.
-   *
-   * @param configParams are the configuration parameters for this connection.
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    genericEntryPoint = getParam(configParams, "genericEntryPoint", null);
-    genericLogin = getParam(configParams, "genericLogin", null);
-    genericPassword = "";
-    try {
-      genericPassword = ManifoldCF.deobfuscate(getParam(configParams, "genericPassword", ""));
-    } catch (ManifoldCFException ignore) {
-    }
-    connectionTimeoutMillis = Integer.parseInt(getParam(configParams, "genericConnectionTimeout", "60000"));
-    if (connectionTimeoutMillis == 0) {
-      connectionTimeoutMillis = 60000;
-    }
-    socketTimeoutMillis = Integer.parseInt(getParam(configParams, "genericSocketTimeout", "1800000"));
-    if (socketTimeoutMillis == 0) {
-      socketTimeoutMillis = 1800000;
-    }
-    responseLifetime = Long.parseLong(getParam(configParams, "genericResponseLifetime", "60000"));
-    if (responseLifetime == 0) {
-      responseLifetime = 60000;
-    }
-  }
-
-  protected DefaultHttpClient getClient() throws ManifoldCFException {
-    synchronized (this) {
-      if (client != null) {
-        return client;
-      }
-      DefaultHttpClient cl = new DefaultHttpClient();
-      if (genericLogin != null && !genericLogin.isEmpty()) {
-        try {
-          URL url = new URL(genericEntryPoint);
-          Credentials credentials = new UsernamePasswordCredentials(genericLogin, genericPassword);
-          cl.getCredentialsProvider().setCredentials(new AuthScope(url.getHost(), url.getPort() > 0 ? url.getPort() : 80, AuthScope.ANY_REALM), credentials);
-          cl.addRequestInterceptor(new PreemptiveAuth(credentials), 0);
-        } catch (MalformedURLException ex) {
-          client = null;
-          sessionExpirationTime = -1L;
-          throw new ManifoldCFException("getClient exception: " + ex.getMessage(), ex);
-        }
-      }
-      HttpConnectionParams.setConnectionTimeout(cl.getParams(), connectionTimeoutMillis);
-      HttpConnectionParams.setSoTimeout(cl.getParams(), socketTimeoutMillis);
-      sessionExpirationTime = System.currentTimeMillis() + 300000L;
-      client = cl;
-      return cl;
-    }
-  }
-
-  /**
-   * Poll. The connection should be closed if it has been idle for too long.
-   */
-  @Override
-  public void poll()
-    throws ManifoldCFException {
-    if (client != null && System.currentTimeMillis() > sessionExpirationTime) {
-      disconnectSession();
-    }
-    super.poll();
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return client != null;
-  }
-
-  /**
-   * Check connection for sanity.
-   */
-  @Override
-  public String check()
-    throws ManifoldCFException {
-    HttpClient client = getClient();
-    try {
-      CheckThread checkThread = new CheckThread(client, genericEntryPoint + "?" + ACTION_PARAM_NAME + "=" + ACTION_CHECK);
-      checkThread.start();
-      checkThread.join();
-      if (checkThread.getException() != null) {
-        Throwable thr = checkThread.getException();
-        return "Check exception: " + thr.getMessage();
-      }
-      return checkThread.getResult();
-    } catch (InterruptedException ex) {
-      throw new ManifoldCFException(ex.getMessage(), ex, ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /**
-   * Close the connection. Call this before discarding the repository connector.
-   */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException {
-    disconnectSession();
-    super.disconnect();
-
-    // Zero out all the stuff that we want to be sure we don't use again
-    genericEntryPoint = null;
-    genericLogin = null;
-    genericPassword = null;
-  }
-
-  protected String createCacheConnectionString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(genericEntryPoint).append("#").append(genericLogin);
-    return sb.toString();
-  }
-
-  /**
-   * Obtain the access tokens for a given user name.
-   *
-   * @param userName is the user name or identifier.
-   * @return the response tokens (according to the current authority). (Should
-   * throws an exception only when a condition cannot be properly described
-   * within the authorization response object.)
-   */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException {
-
-    HttpClient client = getClient();
-    // Construct a cache description object
-    ICacheDescription objectDescription = new GenericAuthorizationResponseDescription(userName,
-      createCacheConnectionString(), this.responseLifetime, this.LRUsize);
-
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription}, null, null);
-    try {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse) cacheManager.lookupObject(createHandle, objectDescription);
-        if (response != null) {
-          return response;
-        }
-        // Create the object.
-        response = getAuthorizationResponseUncached(client, userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle, objectDescription, response);
-        // And return it...
-        return response;
-      } finally {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    } finally {
-      cacheManager.leaveCache(ch);
-    }
-  }
-
-  protected AuthorizationResponse getAuthorizationResponseUncached(HttpClient client, String userName)
-    throws ManifoldCFException {
-    StringBuilder url = new StringBuilder(genericEntryPoint);
-    url.append("?").append(ACTION_PARAM_NAME).append("=").append(ACTION_AUTH);
-    url.append("&username=").append(URLEncoder.encode(userName));
-
-
-    try {
-      FetchTokensThread t = new FetchTokensThread(client, url.toString());
-      t.start();
-      t.join();
-      if (t.getException() != null) {
-        return unreachableResponse;
-      }
-      Auth auth = t.getAuthResponse();
-      if (auth == null) {
-        return userNotFoundResponse;
-      }
-      if (!auth.exists) {
-        return userNotFoundResponse;
-      }
-      if (auth.tokens == null) {
-        return new AuthorizationResponse(new String[]{}, AuthorizationResponse.RESPONSE_OK);
-      }
-
-      String[] tokens = new String[auth.tokens.size()];
-      int k = 0;
-      while (k < tokens.length) {
-        tokens[k] = (String) auth.tokens.get(k);
-        k++;
-      }
-
-      return new AuthorizationResponse(tokens, AuthorizationResponse.RESPONSE_OK);
-    } catch (InterruptedException ex) {
-      throw new ManifoldCFException(ex.getMessage(), ex, ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /**
-   * Obtain the default access tokens for a given user name.
-   *
-   * @param userName is the user name or identifier.
-   * @return the default response tokens, presuming that the connect method
-   * fails.
-   */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-    // The default response if the getConnection method fails
-    return unreachableResponse;
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "generic.EntryPoint"));
-
-    out.print(
-      "<script type=\"text/javascript\">\n"
-      + "<!--\n"
-      + "function checkConfig() {\n"
-      + "  return true;\n"
-      + "}\n"
-      + "\n"
-      + "function checkConfigForSave() {\n"
-      + "  if (editconnection.genericEntryPoint.value == \"\") {\n"
-      + "    alert(\"" + Messages.getBodyJavascriptString(locale, "generic.EntryPointCannotBeBlank") + "\");\n"
-      + "    SelectTab(\"" + Messages.getBodyJavascriptString(locale, "generic.EntryPoint") + "\");\n"
-      + "    editconnection.genericEntryPoint.focus();\n"
-      + "    return false;\n"
-      + "  }\n"
-      + "  return true;\n"
-      + "}\n"
-      + "//-->\n"
-      + "</script>\n");
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException {
-
-    String server = getParam(parameters, "genericEntryPoint", "");
-    String login = getParam(parameters, "genericLogin", "");
-    String password = "";
-    try {
-      password = out.mapPasswordToKey(ManifoldCF.deobfuscate(getParam(parameters, "genericPassword", "")));
-    } catch (ManifoldCFException ignore) {
-    }
-    String conTimeout = getParam(parameters, "genericConnectionTimeout", "60000");
-    String soTimeout = getParam(parameters, "genericSocketTimeout", "1800000");
-    String respLifetime = getParam(parameters, "genericResponseLifetime", "60000");
-
-    if (tabName.equals(Messages.getString(locale, "generic.EntryPoint"))) {
-      out.print(
-        "<table class=\"displaytable\">\n"
-        + " <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-        + " <tr>\n"
-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.EntryPointColon") + "</nobr></td>\n"
-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericEntryPoint\" value=\"" + Encoder.attributeEscape(server) + "\"/></td>\n"
-        + " </tr>\n"
-        + " <tr>\n"
-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.LoginColon") + "</nobr></td>\n"
-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericLogin\" value=\"" + Encoder.attributeEscape(login) + "\"/></td>\n"
-        + " </tr>\n"
-        + " <tr>\n"
-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.PasswordColon") + "</nobr></td>\n"
-        + "  <td class=\"value\"><input type=\"password\" size=\"32\" name=\"genericPassword\" value=\"" + Encoder.attributeEscape(password) + "\"/></td>\n"
-        + " </tr>\n"
-        + " <tr>\n"
-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ConnectionTimeoutColon") + "</nobr></td>\n"
-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericConTimeout\" value=\"" + Encoder.attributeEscape(conTimeout) + "\"/></td>\n"
-        + " </tr>\n"
-        + " <tr>\n"
-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.SocketTimeoutColon") + "</nobr></td>\n"
-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericSoTimeout\" value=\"" + Encoder.attributeEscape(soTimeout) + "\"/></td>\n"
-        + " </tr>\n"
-        + " <tr>\n"
-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ResponseLifetimeColon") + "</nobr></td>\n"
-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericResponseLifetime\" value=\"" + Encoder.attributeEscape(respLifetime) + "\"/></td>\n"
-        + " </tr>\n"
-        + "</table>\n");
-    } else {
-      out.print("<input type=\"hidden\" name=\"genericEntryPoint\" value=\"" + Encoder.attributeEscape(server) + "\"/>\n");
-      out.print("<input type=\"hidden\" name=\"genericLogin\" value=\"" + Encoder.attributeEscape(login) + "\"/>\n");
-      out.print("<input type=\"hidden\" name=\"genericPassword\" value=\"" + Encoder.attributeEscape(password) + "\"/>\n");
-      out.print("<input type=\"hidden\" name=\"genericConTimeout\" value=\"" + Encoder.attributeEscape(conTimeout) + "\"/>\n");
-      out.print("<input type=\"hidden\" name=\"genericSoTimeout\" value=\"" + Encoder.attributeEscape(soTimeout) + "\"/>\n");
-      out.print("<input type=\"hidden\" name=\"genericResponseLifetime\" value=\"" + Encoder.attributeEscape(respLifetime) + "\"/>\n");
-    }
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException {
-
-    copyParam(variableContext, parameters, "genericLogin");
-    copyParam(variableContext, parameters, "genericEntryPoint");
-    copyParam(variableContext, parameters, "genericConTimeout");
-    copyParam(variableContext, parameters, "genericSoTimeout");
-    copyParam(variableContext, parameters, "genericResponseLifetime");
-
-    String password = variableContext.getParameter("genericPassword");
-    if (password == null) {
-      password = "";
-    }
-    parameters.setParameter("genericPassword", org.apache.manifoldcf.core.system.ManifoldCF.obfuscate(variableContext.mapKeyToPassword(password)));
-    return null;
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException {
-    String login = getParam(parameters, "genericLogin", "");
-    String server = getParam(parameters, "genericEntryPoint", "");
-    String conTimeout = getParam(parameters, "genericConnectionTimeout", "60000");
-    String soTimeout = getParam(parameters, "genericSocketTimeout", "1800000");
-    String respLifetime = getParam(parameters, "genericResponseLifetime", "60000");
-
-    out.print(
-      "<table class=\"displaytable\">\n"
-      + " <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      + " <tr>\n"
-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.EntryPointColon") + "</nobr></td>\n"
-      + "  <td class=\"value\">" + Encoder.bodyEscape(server) + "</td>\n"
-      + " </tr>\n"
-      + " <tr>\n"
-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.LoginColon") + "</nobr></td>\n"
-      + "  <td class=\"value\">" + Encoder.bodyEscape(login) + "</td>\n"
-      + " </tr>\n"
-      + " <tr>\n"
-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.PasswordColon") + "</nobr></td>\n"
-      + "  <td class=\"value\">**********</td>\n"
-      + " </tr>\n"
-      + " <tr>\n"
-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ConnectionTimeoutColon") + "</nobr></td>\n"
-      + "  <td class=\"value\">" + Encoder.bodyEscape(conTimeout) + "</td>\n"
-      + " </tr>\n"
-      + " <tr>\n"
-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.SocketTimeoutColon") + "</nobr></td>\n"
-      + "  <td class=\"value\">" + Encoder.bodyEscape(soTimeout) + "</td>\n"
-      + " </tr>\n"
-      + " <tr>\n"
-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ResponseLifetimeColon") + "</nobr></td>\n"
-      + "  <td class=\"value\">" + Encoder.bodyEscape(respLifetime) + "</td>\n"
-      + " </tr>\n"
-      + "</table>\n");
-  }
-
-  private String getParam(ConfigParams parameters, String name, String def) {
-    return parameters.getParameter(name) != null ? parameters.getParameter(name) : def;
-  }
-
-  private boolean copyParam(IPostParameters variableContext, ConfigParams parameters, String name) {
-    String val = variableContext.getParameter(name);
-    if (val == null) {
-      return false;
-    }
-    parameters.setParameter(name, val);
-    return true;
-  }
-
-  // Protected methods
-  protected static StringSet emptyStringSet = new StringSet();
-
-  private void disconnectSession() {
-    synchronized (this) {
-      client.getConnectionManager().shutdown();
-      client = null;
-    }
-  }
-
-  /**
-   * This is the cache object descriptor for cached access tokens from this
-   * connector.
-   */
-  protected class GenericAuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription {
-
-    /**
-     * The user name
-     */
-    protected String userName;
-
-    /**
-     * LDAP connection string with server name and base DN
-     */
-    protected String connectionString;
-
-    /**
-     * The response lifetime
-     */
-    protected long responseLifetime;
-
-    /**
-     * The expiration time
-     */
-    protected long expirationTime = -1;
-
-    /**
-     * Constructor.
-     */
-    public GenericAuthorizationResponseDescription(String userName, String connectionString, long responseLifetime, int LRUsize) {
-      super("LDAPAuthority", LRUsize);
-      this.userName = userName;
-      this.connectionString = connectionString;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /**
-     * Return the invalidation keys for this object.
-     */
-    @Override
-    public StringSet getObjectKeys() {
-      return emptyStringSet;
-    }
-
-    /**
-     * Get the critical section name, used for synchronizing the creation of the
-     * object
-     */
-    @Override
-    public String getCriticalSectionName() {
-      StringBuilder sb = new StringBuilder(getClass().getName());
-      sb.append("-").append(userName).append("-").append(connectionString);
-      return sb.toString();
-    }
-
-    /**
-     * Return the object expiration interval
-     */
-    @Override
-    public long getObjectExpirationTime(long currentTime) {
-      if (expirationTime == -1) {
-        expirationTime = currentTime + responseLifetime;
-      }
-      return expirationTime;
-    }
-
-    @Override
-    public int hashCode() {
-      return userName.hashCode() + connectionString.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (!(o instanceof GenericAuthorizationResponseDescription)) {
-        return false;
-      }
-      GenericAuthorizationResponseDescription ard = (GenericAuthorizationResponseDescription) o;
-      if (!ard.userName.equals(userName)) {
-        return false;
-      }
-      if (!ard.connectionString.equals(connectionString)) {
-        return false;
-      }
-      return true;
-    }
-  }
-
-  static class PreemptiveAuth implements HttpRequestInterceptor {
-
-    private Credentials credentials;
-
-    public PreemptiveAuth(Credentials creds) {
-      this.credentials = creds;
-    }
-
-    @Override
-    public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
-      request.addHeader(new BasicScheme(StandardCharsets.US_ASCII).authenticate(credentials, request, context));
-    }
-  }
-
-  protected static class CheckThread extends Thread {
-
-    protected HttpClient client;
-
-    protected String url;
-
-    protected Throwable exception = null;
-
-    protected String result = "Unknown";
-
-    public CheckThread(HttpClient client, String url) {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.url = url;
-    }
-
-    @Override
-    public void run() {
-      HttpGet method = new HttpGet(url);
-      try {
-        HttpResponse response = client.execute(method);
-        try {
-          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-            result = "Connection failed: " + response.getStatusLine().getReasonPhrase();
-            return;
-          }
-          EntityUtils.consume(response.getEntity());
-          result = "Connection OK";
-        } finally {
-          EntityUtils.consume(response.getEntity());
-          method.releaseConnection();
-        }
-      } catch (IOException ex) {
-        exception = ex;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-
-    public String getResult() {
-      return result;
-    }
-  }
-
-  protected static class FetchTokensThread extends Thread {
-
-    protected HttpClient client;
-
-    protected String url;
-
-    protected Throwable exception = null;
-
-    protected Auth auth;
-
-    public FetchTokensThread(HttpClient client, String url) {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.url = url;
-      this.auth = null;
-    }
-
-    @Override
-    public void run() {
-      try {
-        HttpGet method = new HttpGet(url.toString());
-
-        HttpResponse response = client.execute(method);
-        try {
-          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-            exception = new ManifoldCFException("FetchTokensThread error - interface returned incorrect return code for: " + url + " - " + response.getStatusLine().toString());
-            return;
-          }
-          JAXBContext context;
-          context = JAXBContext.newInstance(Auth.class);
-          Unmarshaller m = context.createUnmarshaller();
-          auth = (Auth) m.unmarshal(response.getEntity().getContent());
-        } catch (JAXBException ex) {
-          exception = ex;
-        } finally {
-          EntityUtils.consume(response.getEntity());
-          method.releaseConnection();
-        }
-      } catch (Exception ex) {
-        exception = ex;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-
-    public Auth getAuthResponse() {
-      return auth;
-    }
-  }
-}
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/generic/Messages.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/generic/Messages.java
deleted file mode 100644
index 6c60406..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/generic/Messages.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* $Id: Messages.java 1295926 2012-03-01 21:56:27Z kwright $ */

-/**

- * 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 org.apache.manifoldcf.authorities.authorities.generic;

-

-import java.util.Locale;

-import java.util.Map;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-

-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {

-

-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.authorities.authorities.generic.common";

-

-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.authorities.authorities.generic";

-

-  /**

-   * Constructor - do no instantiate

-   */

-  protected Messages() {

-  }

-

-  public static String getString(Locale locale, String messageKey) {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey) {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey) {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey) {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getString(Locale locale, String messageKey, Object[] args) {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  // More general methods which allow bundlenames and class loaders to be specified.

-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  // Resource output

-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String, String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException {

-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey,

-      substitutionParameters, mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String, String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException {

-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,

-      substitutionParameters, mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String, Object> contextObjects)

-    throws ManifoldCFException {

-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,

-      contextObjects);

-  }

-}

diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java
deleted file mode 100644
index bbb5fcb..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java
+++ /dev/null
@@ -1,1404 +0,0 @@
-/* $Id: SvnConnector.java 994959 2010-09-08 10:04:42Z krycek $ */

-/**

- * 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 org.apache.manifoldcf.crawler.connectors.generic;

-

-import java.io.*;

-import java.net.MalformedURLException;

-import java.net.URL;

-import org.apache.manifoldcf.core.util.URLEncoder;

-import java.nio.charset.StandardCharsets;

-import java.text.SimpleDateFormat;

-import java.util.*;

-import java.util.concurrent.ConcurrentHashMap;

-import javax.xml.bind.JAXBContext;

-import javax.xml.bind.JAXBException;

-import javax.xml.bind.Unmarshaller;

-import javax.xml.parsers.FactoryConfigurationError;

-import javax.xml.parsers.ParserConfigurationException;

-import javax.xml.parsers.SAXParser;

-import javax.xml.parsers.SAXParserFactory;

-import org.apache.http.HttpException;

-import org.apache.http.HttpRequest;

-import org.apache.http.HttpRequestInterceptor;

-import org.apache.http.HttpResponse;

-import org.apache.http.HttpStatus;

-import org.apache.http.auth.AuthScope;

-import org.apache.http.auth.Credentials;

-import org.apache.http.auth.UsernamePasswordCredentials;

-import org.apache.http.client.HttpClient;

-import org.apache.http.client.methods.HttpGet;

-import org.apache.http.impl.auth.BasicScheme;

-import org.apache.http.impl.client.DefaultHttpClient;

-import org.apache.http.params.HttpConnectionParams;

-import org.apache.http.protocol.HttpContext;

-import org.apache.http.util.EntityUtils;

-import org.apache.manifoldcf.agents.interfaces.*;

-import org.apache.manifoldcf.connectorcommon.common.XThreadInputStream;

-import org.apache.manifoldcf.connectorcommon.common.XThreadStringBuffer;

-import org.apache.manifoldcf.core.interfaces.*;

-import org.apache.manifoldcf.core.system.ManifoldCF;

-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;

-import org.apache.manifoldcf.crawler.connectors.generic.api.Item;

-import org.apache.manifoldcf.crawler.connectors.generic.api.Items;

-import org.apache.manifoldcf.crawler.connectors.generic.api.Meta;

-import org.apache.manifoldcf.crawler.interfaces.*;

-import org.apache.manifoldcf.ui.util.Encoder;

-import org.xml.sax.Attributes;

-import org.xml.sax.SAXException;

-import org.xml.sax.helpers.DefaultHandler;

-

-public class GenericConnector extends BaseRepositoryConnector {

-

-  public static final String _rcsid = "@(#)$Id: GenericConnector.java 994959 2010-09-08 10:04:42Z redguy $";

-

-  /**

-   * Deny access token for default authority

-   */

-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";

-

-  private final static String ACTION_PARAM_NAME = "action";

-

-  private final static String ACTION_CHECK = "check";

-

-  private final static String ACTION_SEED = "seed";

-

-  private final static String ACTION_ITEMS = "items";

-

-  private final static String ACTION_ITEM = "item";

-

-  private String genericLogin = null;

-

-  private String genericPassword = null;

-

-  private String genericEntryPoint = null;

-

-  private int connectionTimeoutMillis = 60 * 1000;

-

-  private int socketTimeoutMillis = 30 * 60 * 1000;

-

-  protected static final String RELATIONSHIP_RELATED = "related";

-

-  private ConcurrentHashMap<String, Item> documentCache = new ConcurrentHashMap<String, Item>(10);

-

-  /**

-   * Constructor.

-   */

-  public GenericConnector() {

-  }

-

-  @Override

-  public int getMaxDocumentRequest() {

-    return 10;

-  }

-

-  @Override

-  public String[] getRelationshipTypes() {

-    return new String[]{RELATIONSHIP_RELATED};

-  }

-

-  @Override

-  public int getConnectorModel() {

-    return GenericConnector.MODEL_ADD_CHANGE;

-  }

-

-  /**

-   * For any given document, list the bins that it is a member of.

-   */

-  @Override

-  public String[] getBinNames(String documentIdentifier) {

-    // Return the host name

-    return new String[]{genericEntryPoint};

-  }

-

-  // All methods below this line will ONLY be called if a connect() call succeeded

-  // on this instance!

-  /**

-   * Connect. The configuration parameters are included.

-   *

-   * @param configParams are the configuration parameters for this connection.

-   * Note well: There are no exceptions allowed from this call, since it is

-   * expected to mainly establish connection parameters.

-   */

-  @Override

-  public void connect(ConfigParams configParams) {

-    super.connect(configParams);

-    genericEntryPoint = getParam(configParams, "genericEntryPoint", null);

-    genericLogin = getParam(configParams, "genericLogin", null);

-    genericPassword = "";

-    try {

-      genericPassword = ManifoldCF.deobfuscate(getParam(configParams, "genericPassword", ""));

-    } catch (ManifoldCFException ignore) {

-    }

-    connectionTimeoutMillis = Integer.parseInt(getParam(configParams, "genericConnectionTimeout", "60000"));

-    if (connectionTimeoutMillis == 0) {

-      connectionTimeoutMillis = 60000;

-    }

-    socketTimeoutMillis = Integer.parseInt(getParam(configParams, "genericSocketTimeout", "1800000"));

-    if (socketTimeoutMillis == 0) {

-      socketTimeoutMillis = 1800000;

-    }

-  }

-

-  protected DefaultHttpClient getClient() throws ManifoldCFException {

-    DefaultHttpClient cl = new DefaultHttpClient();

-    if (genericLogin != null && !genericLogin.isEmpty()) {

-      try {

-        URL url = new URL(genericEntryPoint);

-        Credentials credentials = new UsernamePasswordCredentials(genericLogin, genericPassword);

-        cl.getCredentialsProvider().setCredentials(new AuthScope(url.getHost(), url.getPort() > 0 ? url.getPort() : 80, AuthScope.ANY_REALM), credentials);

-        cl.addRequestInterceptor(new PreemptiveAuth(credentials), 0);

-      } catch (MalformedURLException ex) {

-        throw new ManifoldCFException("getClient exception: " + ex.getMessage(), ex);

-      }

-    }

-    HttpConnectionParams.setConnectionTimeout(cl.getParams(), connectionTimeoutMillis);

-    HttpConnectionParams.setSoTimeout(cl.getParams(), socketTimeoutMillis);

-    return cl;

-  }

-

-  @Override

-  public String check() throws ManifoldCFException {

-    HttpClient client = getClient();

-    try {

-      CheckThread checkThread = new CheckThread(client, genericEntryPoint + "?" + ACTION_PARAM_NAME + "=" + ACTION_CHECK);

-      checkThread.start();

-      checkThread.join();

-      if (checkThread.getException() != null) {

-        Throwable thr = checkThread.getException();

-        return "Check exception: " + thr.getMessage();

-      }

-      return checkThread.getResult();

-    } catch (InterruptedException ex) {

-      throw new ManifoldCFException(ex.getMessage(), ex, ManifoldCFException.INTERRUPTED);

-    }

-  }

-

-  @Override

-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,

-    String lastSeedVersion, long seedTime, int jobMode)

-    throws ManifoldCFException, ServiceInterruption {

-

-    long startTime;

-    if (lastSeedVersion == null)

-      startTime = 0L;

-    else

-    {

-      // Unpack seed time from seed version string

-      startTime = new Long(lastSeedVersion).longValue();

-    }

-

-    HttpClient client = getClient();

-    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);

-

-    StringBuilder url = new StringBuilder(genericEntryPoint);

-    url.append("?").append(ACTION_PARAM_NAME).append("=").append(ACTION_SEED);

-    if (startTime > 0) {

-      url.append("&startTime=").append(sdf.format(new Date(startTime)));

-    }

-    url.append("&endTime=").append(sdf.format(new Date(seedTime)));

-    for (int i = 0; i < spec.getChildCount(); i++) {

-      SpecificationNode sn = spec.getChild(i);

-      if (sn.getType().equals("param")) {

-          String paramName = sn.getAttributeValue("name");

-          String paramValue = sn.getValue();

-          url.append("&").append(URLEncoder.encode(paramName)).append("=").append(URLEncoder.encode(paramValue));

-      }

-    }

-    ExecuteSeedingThread t = new ExecuteSeedingThread(client, url.toString());

-    try {

-      t.start();

-      boolean wasInterrupted = false;

-      try {

-        XThreadStringBuffer seedBuffer = t.getBuffer();

-

-        // Pick up the paths, and add them to the activities, before we join with the child thread.

-        while (true) {

-          // The only kind of exceptions this can throw are going to shut the process down.

-          String docPath = seedBuffer.fetch();

-          if (docPath == null) {

-            break;

-          }

-          // Add the pageID to the queue

-          activities.addSeedDocument(docPath);

-        }

-      } catch (InterruptedException e) {

-        wasInterrupted = true;

-        throw e;

-      } catch (ManifoldCFException e) {

-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED) {

-          wasInterrupted = true;

-        }

-        throw e;

-      } finally {

-        if (!wasInterrupted) {

-          t.finishUp();

-        }

-      }

-    } catch (InterruptedException e) {

-      t.interrupt();

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,

-        ManifoldCFException.INTERRUPTED);

-    }

-    return new Long(seedTime).toString();

-  }

-

-  @Override

-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,

-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)

-    throws ManifoldCFException, ServiceInterruption {

-

-    // Forced acls

-    String[] acls = getAcls(spec);

-    // Sort it,

-    java.util.Arrays.sort(acls);

-    String rights = java.util.Arrays.toString(acls);

-

-    String genericAuthMode = "provided";

-    for (int i = 0; i < spec.getChildCount(); i++) {

-      SpecificationNode sn = spec.getChild(i);

-      if (sn.getType().equals("genericAuthMode")) {

-        genericAuthMode = sn.getValue();

-        break;

-      }

-    }

-

-    HttpClient client = getClient();

-    StringBuilder url = new StringBuilder(genericEntryPoint);

-

-    url.append("?").append(ACTION_PARAM_NAME).append("=").append(ACTION_ITEMS);

-    for (int i = 0; i < documentIdentifiers.length; i++) {

-      url.append("&id[]=").append(URLEncoder.encode(documentIdentifiers[i]));

-    }

-    for (int i = 0; i < spec.getChildCount(); i++) {

-      SpecificationNode sn = spec.getChild(i);

-      if (sn.getType().equals("param")) {

-        String paramName = sn.getAttributeValue("name");

-        String paramValue = sn.getValue();

-        url.append("&").append(URLEncoder.encode(paramName)).append("=").append(URLEncoder.encode(paramValue));

-      }

-    }

-    

-    String[] versions = null;

-    try {

-      DocumentVersionThread versioningThread = new DocumentVersionThread(client, url.toString(), documentIdentifiers, genericAuthMode, rights, documentCache);

-      versioningThread.start();

-      try {

-        versions = versioningThread.finishUp();

-      } catch (IOException ex) {

-        handleIOException((IOException)ex);

-      } catch (InterruptedException ex) {

-        throw new ManifoldCFException(ex.getMessage(), ex, ManifoldCFException.INTERRUPTED);

-      }

-      

-      // Figure out which ones we need to process, and which we should delete

-      for (int i = 0; i < documentIdentifiers.length; i++) {

-        String documentIdentifier = documentIdentifiers[i];

-        String versionString = versions[i];

-        if (versionString == null) {

-          activities.deleteDocument(documentIdentifier);

-          continue;

-        }

-        Item item = documentCache.get(documentIdentifier);

-        if (item == null) {

-          throw new ManifoldCFException("processDocuments error - no cache entry for: " + documentIdentifier);

-        }

-

-        if (item.related != null) {

-          for (String rel : item.related) {

-            activities.addDocumentReference(rel, documentIdentifier, RELATIONSHIP_RELATED);

-          }

-        }

-        if (versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)) {

-          

-          // Process the document

-          RepositoryDocument doc = new RepositoryDocument();

-          if (item.mimeType != null) {

-            doc.setMimeType(item.mimeType);

-          }

-          if (item.created != null) {

-            doc.setCreatedDate(item.created);

-          }

-          if (item.updated != null) {

-            doc.setModifiedDate(item.updated);

-          }

-          if (item.fileName != null) {

-            doc.setFileName(item.fileName);

-          }

-          if (item.metadata != null) {

-            HashMap<String, List<String>> meta = new HashMap<String, List<String>>();

-            for (Meta m : item.metadata) {

-              if (meta.containsKey(m.name)) {

-                meta.get(m.name).add(m.value);

-              } else {

-                List<String> list = new ArrayList<String>(1);

-                list.add(m.value);

-                meta.put(m.name, list);

-              }

-            }

-            for (String name : meta.keySet()) {

-              List<String> values = meta.get(name);

-              if (values.size() > 1) {

-                String[] svals = new String[values.size()];

-                for (int j = 0; j < values.size(); j++) {

-                  svals[j] = values.get(j);

-                }

-                doc.addField(name, svals);

-              } else {

-                doc.addField(name, values.get(0));

-              }

-            }

-          }

-          if ("provided".equals(genericAuthMode)) {

-            if (item.auth != null) {

-              String[] acl = new String[item.auth.size()];

-              for (int j = 0; j < item.auth.size(); j++) {

-                acl[j] = item.auth.get(j);

-              }

-              doc.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acl,new String[]{defaultAuthorityDenyToken});

-            }

-          } else {

-            if (acls.length > 0) {

-              doc.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acls,new String[]{defaultAuthorityDenyToken});

-            }

-          }

-          if (item.content != null) {

-            try {

-              byte[] content = item.content.getBytes(StandardCharsets.UTF_8);

-              ByteArrayInputStream is = new ByteArrayInputStream(content);

-              try {

-                doc.setBinary(is, content.length);

-                activities.ingestDocumentWithException(documentIdentifier, versionString, item.url, doc);

-                is.close();

-              } finally {

-                is.close();

-              }

-            } catch (IOException ex) {

-              handleIOException(ex);

-            }

-          } else {

-            url = new StringBuilder(genericEntryPoint);

-

-            url.append("?").append(ACTION_PARAM_NAME).append("=").append(ACTION_ITEM);

-            url.append("&id=").append(URLEncoder.encode(documentIdentifier));

-            for (int j = 0; j < spec.getChildCount(); j++) {

-              SpecificationNode sn = spec.getChild(j);

-              if (sn.getType().equals("param")) {

-                String paramName = sn.getAttributeValue("name");

-                String paramValue = sn.getValue();

-                url.append("&").append(URLEncoder.encode(paramName)).append("=").append(URLEncoder.encode(paramValue));

-              }

-            }

-

-

-            ExecuteProcessThread t = new ExecuteProcessThread(client, url.toString());

-            try {

-              t.start();

-              boolean wasInterrupted = false;

-              try {

-                InputStream is = t.getSafeInputStream();

-                long fileLength = t.getStreamLength();

-                try {

-                  // Can only index while background thread is running!

-                  doc.setBinary(is, fileLength);

-                  activities.ingestDocumentWithException(documentIdentifier, versionString, item.url, doc);

-                } finally {

-                  is.close();

-                }

-              } catch (ManifoldCFException e) {

-                if (e.getErrorCode() == ManifoldCFException.INTERRUPTED) {

-                  wasInterrupted = true;

-                }

-                throw e;

-              } catch (java.net.SocketTimeoutException e) {

-                throw e;

-              } catch (InterruptedIOException e) {

-                wasInterrupted = true;

-                throw e;

-              } finally {

-                if (!wasInterrupted) {

-                  t.finishUp();

-                }

-              }

-            } catch (InterruptedException e) {

-              t.interrupt();

-              throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);

-            } catch (InterruptedIOException e) {

-              t.interrupt();

-              throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);

-            } catch (IOException e) {

-              handleIOException(e);

-            }

-          }

-        }

-      }

-      

-    } finally {

-      for (String documentIdentifier : documentIdentifiers) {

-        if (documentCache.containsKey(documentIdentifier)) {

-          documentCache.remove(documentIdentifier);

-        }

-      }

-    }

-  }

-

-  @Override

-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,

-    Locale locale, ConfigParams parameters, List<String> tabsArray)

-    throws ManifoldCFException, IOException {

-    tabsArray.add(Messages.getString(locale, "generic.EntryPoint"));

-

-    out.print(

-      "<script type=\"text/javascript\">\n"

-      + "<!--\n"

-      + "function checkConfig() {\n"

-      + "  return true;\n"

-      + "}\n"

-      + "\n"

-      + "function checkConfigForSave() {\n"

-      + "  return true;\n"

-      + "}\n"

-      + "//-->\n"

-      + "</script>\n");

-  }

-

-  @Override

-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,

-    Locale locale, ConfigParams parameters, String tabName)

-    throws ManifoldCFException, IOException {

-

-    String server = getParam(parameters, "genericEntryPoint", "");

-    String login = getParam(parameters, "genericLogin", "");

-    String password = "";

-    try {

-      password = out.mapPasswordToKey(ManifoldCF.deobfuscate(getParam(parameters, "genericPassword", "")));

-    } catch (ManifoldCFException ignore) {

-    }

-    String conTimeout = getParam(parameters, "genericConnectionTimeout", "60000");

-    String soTimeout = getParam(parameters, "genericSocketTimeout", "1800000");

-

-    if (tabName.equals(Messages.getString(locale, "generic.EntryPoint"))) {

-      out.print(

-        "<table class=\"displaytable\">\n"

-        + " <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"

-        + " <tr>\n"

-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.EntryPointColon") + "</nobr></td>\n"

-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericEntryPoint\" value=\"" + Encoder.attributeEscape(server) + "\"/></td>\n"

-        + " </tr>\n"

-        + " <tr>\n"

-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.LoginColon") + "</nobr></td>\n"

-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericLogin\" value=\"" + Encoder.attributeEscape(login) + "\"/></td>\n"

-        + " </tr>\n"

-        + " <tr>\n"

-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.PasswordColon") + "</nobr></td>\n"

-        + "  <td class=\"value\"><input type=\"password\" size=\"32\" name=\"genericPassword\" value=\"" + Encoder.attributeEscape(password) + "\"/></td>\n"

-        + " </tr>\n"

-        + " <tr>\n"

-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ConnectionTimeoutColon") + "</nobr></td>\n"

-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericConTimeout\" value=\"" + Encoder.attributeEscape(conTimeout) + "\"/></td>\n"

-        + " </tr>\n"

-        + " <tr>\n"

-        + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.SocketTimeoutColon") + "</nobr></td>\n"

-        + "  <td class=\"value\"><input type=\"text\" size=\"32\" name=\"genericSoTimeout\" value=\"" + Encoder.attributeEscape(soTimeout) + "\"/></td>\n"

-        + " </tr>\n"

-        + "</table>\n");

-    } else {

-      out.print("<input type=\"hidden\" name=\"genericEntryPoint\" value=\"" + Encoder.attributeEscape(server) + "\"/>\n");

-      out.print("<input type=\"hidden\" name=\"genericLogin\" value=\"" + Encoder.attributeEscape(login) + "\"/>\n");

-      out.print("<input type=\"hidden\" name=\"genericPassword\" value=\"" + Encoder.attributeEscape(password) + "\"/>\n");

-      out.print("<input type=\"hidden\" name=\"genericConTimeout\" value=\"" + Encoder.attributeEscape(conTimeout) + "\"/>\n");

-      out.print("<input type=\"hidden\" name=\"genericSoTimeout\" value=\"" + Encoder.attributeEscape(soTimeout) + "\"/>\n");

-    }

-  }

-

-  @Override

-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,

-    Locale locale, ConfigParams parameters)

-    throws ManifoldCFException {

-

-    copyParam(variableContext, parameters, "genericLogin");

-    copyParam(variableContext, parameters, "genericEntryPoint");

-    copyParam(variableContext, parameters, "genericConTimeout");

-    copyParam(variableContext, parameters, "genericSoTimeout");

-

-    String password = variableContext.getParameter("genericPassword");

-    if (password == null) {

-      password = "";

-    }

-    parameters.setParameter("genericPassword", ManifoldCF.obfuscate(variableContext.mapKeyToPassword(password)));

-    return null;

-  }

-

-  @Override

-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,

-    Locale locale, ConfigParams parameters)

-    throws ManifoldCFException, IOException {

-    String login = getParam(parameters, "genericLogin", "");

-    String server = getParam(parameters, "genericEntryPoint", "");

-    String conTimeout = getParam(parameters, "genericConnectionTimeout", "60000");

-    String soTimeout = getParam(parameters, "genericSocketTimeout", "1800000");

-    

-    out.print(

-      "<table class=\"displaytable\">\n"

-      + " <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"

-      + " <tr>\n"

-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.EntryPointColon") + "</nobr></td>\n"

-      + "  <td class=\"value\">" + Encoder.bodyEscape(server) + "</td>\n"

-      + " </tr>\n"

-      + " <tr>\n"

-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.LoginColon") + "</nobr></td>\n"

-      + "  <td class=\"value\">" + Encoder.bodyEscape(login) + "</td>\n"

-      + " </tr>\n"

-      + " <tr>\n"

-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.PasswordColon") + "</nobr></td>\n"

-      + "  <td class=\"value\">**********</td>\n"

-      + " </tr>\n"

-      + " <tr>\n"

-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ConnectionTimeoutColon") + "</nobr></td>\n"

-      + "  <td class=\"value\">" + Encoder.bodyEscape(conTimeout) + "</td>\n"

-      + " </tr>\n"

-      + " <tr>\n"

-      + "  <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.SocketTimeoutColon") + "</nobr></td>\n"

-      + "  <td class=\"value\">" + Encoder.bodyEscape(soTimeout) + "</td>\n"

-      + " </tr>\n"

-      + "</table>\n");

-  }

-

-  @Override

-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,

-    int connectionSequenceNumber, List<String> tabsArray)

-    throws ManifoldCFException, IOException {

-    tabsArray.add(Messages.getString(locale, "generic.Parameters"));

-    tabsArray.add(Messages.getString(locale, "generic.Security"));

-

-    String seqPrefix = "s"+connectionSequenceNumber+"_";

-

-    out.print(

-      "<script type=\"text/javascript\">\n"

-      + "<!--\n"

-      + "function "+seqPrefix+"SpecOp(n, opValue, anchorvalue) {\n"

-      + "  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"

-      + "  postFormSetAnchor(anchorvalue);\n"

-      + "}\n"

-      + "\n"

-      + "function "+seqPrefix+"SpecAddToken(anchorvalue) {\n"

-      + "  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"

-      + "  {\n"

-      + "    alert(\"" + Messages.getBodyJavascriptString(locale, "generic.TypeInAnAccessToken") + "\");\n"

-      + "    editjob."+seqPrefix+"spectoken.focus();\n"

-      + "    return;\n"

-      + "  }\n"

-      + "  "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"

-      + "}\n"

-      + "function "+seqPrefix+"SpecAddParam(anchorvalue) {\n"

-      + "  if (editjob."+seqPrefix+"specparamname.value == \"\")\n"

-      + "  {\n"

-      + "    alert(\"" + Messages.getBodyJavascriptString(locale, "generic.TypeInParamName") + "\");\n"

-      + "    editjob."+seqPrefix+"specparamname.focus();\n"

-      + "    return;\n"

-      + "  }\n"

-      + "  "+seqPrefix+"SpecOp(\""+seqPrefix+"paramop\",\"Add\",anchorvalue);\n"

-      + "}\n"

-      + "//-->\n"

-      + "</script>\n");

-  }

-

-  @Override

-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,

-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)

-    throws ManifoldCFException, IOException {

-

-    String seqPrefix = "s"+connectionSequenceNumber+"_";

-

-    int k, i;

-

-    if (tabName.equals(Messages.getString(locale, "generic.Parameters")) && connectionSequenceNumber == actualSequenceNumber) {

-

-      out.print("<table class=\"displaytable\">"

-        + "<tr><td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.ParametersColon") + "</nobr></td>"

-        + "<td class=\"value\">");

-

-      out.print("<table class=\"formtable\">\n"

-        + "<tr class=\"formheaderrow\">"

-        + "<td class=\"formcolumnheader\"></td>"

-        + "<td class=\"formcolumnheader\">" + Messages.getBodyString(locale, "generic.ParameterName") + "</td>"

-        + "<td class=\"formcolumnheader\">" + Messages.getBodyString(locale, "generic.ParameterValue") + "</td>"

-        + "</tr>");

-

-      i = 0;

-      k = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i++);

-        if (sn.getType().equals("param")) {

-          String paramDescription = "_" + Integer.toString(k);

-          String paramOpName = seqPrefix + "paramop" + paramDescription;

-          String paramName = sn.getAttributeValue("name");

-          String paramValue = sn.getValue();

-          out.print(

-            "  <tr class=\"evenformrow\">\n"

-            + "    <td class=\"formcolumncell\">\n"

-            + "      <input type=\"hidden\" name=\"" + paramOpName + "\" value=\"\"/>\n"

-            + "      <a name=\"" + seqPrefix + "param_" + Integer.toString(k) + "\">\n"

-            + "        <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "generic.Delete") + "\" onClick='Javascript:SpecOp(\"" + paramOpName + "\",\"Delete\",\"param" + paramDescription + "\")' alt=\"" + Messages.getAttributeString(locale, "generic.DeleteParameter") + Integer.toString(k) + "\"/>\n"

-            + "      </a>&nbsp;\n"

-            + "    </td>\n"

-            + "    <td class=\"formcolumncell\">\n"

-            + "      <input type=\"text\" name=\""+seqPrefix+"specparamname" + paramDescription + "\" value=\"" + Encoder.attributeEscape(paramName) + "\"/>\n"

-            + "    </td>\n"

-            + "    <td class=\"formcolumncell\">\n"

-            + "      <input type=\"text\" name=\""+seqPrefix+"specparamvalue" + paramDescription + "\" value=\"" + Encoder.attributeEscape(paramValue) + "\"/>\n"

-            + "    </td>\n"

-            + "  </tr>\n");

-          k++;

-        }

-      }

-      if (k == 0) {

-        out.print(

-          "  <tr>\n"

-          + "    <td class=\"message\" colspan=\"3\">" + Messages.getBodyString(locale, "generic.NoParametersSpecified") + "</td>\n"

-          + "  </tr>\n");

-      }

-      out.print(

-        "  <tr><td class=\"lightseparator\" colspan=\"3\"><hr/></td></tr>\n"

-        + "  <tr class=\"evenformrow\">\n"

-        + "    <td class=\"formcolumncell\">\n"

-        + "      <input type=\"hidden\" name=\""+seqPrefix+"paramcount\" value=\"" + Integer.toString(k) + "\"/>\n"

-        + "      <input type=\"hidden\" name=\""+seqPrefix+"paramop\" value=\"\"/>\n"

-        + "      <a name=\""+seqPrefix+"param_" + Integer.toString(k) + "\">\n"

-        + "        <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "generic.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecAddParam(\""+seqPrefix+"param_" + Integer.toString(k + 1) + "\")' alt=\"" + Messages.getAttributeString(locale, "generic.AddParameter") + "\"/>\n"

-        + "      </a>&nbsp;\n"

-        + "    </td>\n"

-        + "    <td class=\"formcolumncell\">\n"

-        + "      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"specparamname\" value=\"\"/>\n"

-        + "    </td>\n"

-        + "    <td class=\"formcolumncell\">\n"

-        + "      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"specparamvalue\" value=\"\"/>\n"

-        + "    </td>\n"

-        + "  </tr>\n"

-        + "</table>\n");

-      out.print("</td></tr></table>");

-    } else {

-      i = 0;

-      k = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i++);

-        if (sn.getType().equals("param")) {

-          String accessDescription = "_" + Integer.toString(k);

-          String paramName = sn.getAttributeValue("name");

-          String paramValue = sn.getValue();

-          out.print(

-            "<input type=\"hidden\" name=\"" + seqPrefix + "specparamname" + accessDescription + "\" value=\"" + Encoder.attributeEscape(paramName) + "\"/>\n"

-            + "<input type=\"hidden\" name=\"" + seqPrefix + "specparamvalue" + accessDescription + "\" value=\"" + Encoder.attributeEscape(paramValue) + "\"/>\n");

-          k++;

-        }

-      }

-      out.print("<input type=\"hidden\" name=\""+seqPrefix+"paramcount\" value=\"" + Integer.toString(k) + "\"/>\n");

-    }

-

-    // Security tab

-    String genericAuthMode = "provided";

-    for (i = 0; i < ds.getChildCount(); i++) {

-      SpecificationNode sn = ds.getChild(i);

-      if (sn.getType().equals("genericAuthMode")) {

-        genericAuthMode = sn.getValue();

-      }

-    }

-    if (tabName.equals(Messages.getString(locale, "generic.Security")) && connectionSequenceNumber == actualSequenceNumber) {

-      out.print(

-        "<table class=\"displaytable\">\n"

-        + "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n");

-

-      out.print("  <tr>\n"

-        + "    <td class=\"description\">" + Messages.getBodyString(locale, "generic.AuthMode") + "</td>\n"

-        + "    <td class=\"value\" >\n"

-        + "      <input type=\"radio\" name=\""+seqPrefix+"genericAuthMode\" value=\"provided\" " + ("provided".equals(genericAuthMode) ? "checked=\"checked\"" : "") + "/>" + Messages.getBodyString(locale, "generic.AuthModeProvided") + "<br/>\n"

-        + "      <input type=\"radio\" name=\""+seqPrefix+"genericAuthMode\" value=\"forced\" " + ("forced".equals(genericAuthMode) ? "checked=\"checked\"" : "") + "/>" + Messages.getBodyString(locale, "generic.AuthModeForced") + "<br/>\n"

-        + "    </td>\n"

-        + "  </tr>\n");

-      // Go through forced ACL

-      out.print("<tr><td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.TokensColon") + "</nobr></td>"

-        + "<td class=\"value\">");

-      out.print("<table class=\"formtable\">\n"

-        + "<tr class=\"formheaderrow\">"

-        + "<td class=\"formcolumnheader\"></td>"

-        + "<td class=\"formcolumnheader\">" + Messages.getBodyString(locale, "generic.Token") + "</td>"

-        + "</tr>");

-      i = 0;

-      k = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i++);

-        if (sn.getType().equals("access")) {

-          String accessDescription = "_" + Integer.toString(k);

-          String accessOpName = seqPrefix + "accessop" + accessDescription;

-          String token = sn.getAttributeValue("token");

-          out.print(

-            "  <tr class=\"evenformrow\">\n"

-            + "    <td class=\"formcolumncell\">\n"

-            + "      <input type=\"hidden\" name=\"" + accessOpName + "\" value=\"\"/>\n"

-            + "      <input type=\"hidden\" name=\"" + seqPrefix + "spectoken" + accessDescription + "\" value=\"" + Encoder.attributeEscape(token) + "\"/>\n"

-            + "      <a name=\"" + seqPrefix + "token_" + Integer.toString(k) + "\">\n"

-            + "        <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "generic.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\"" + accessOpName + "\",\"Delete\",\""+seqPrefix+"token_" + Integer.toString(k) + "\")' alt=\"" + Messages.getAttributeString(locale, "generic.DeleteToken") + Integer.toString(k) + "\"/>\n"

-            + "      </a>&nbsp;\n"

-            + "    </td>\n"

-            + "    <td class=\"formcolumncell\">\n"

-            + "      " + Encoder.bodyEscape(token) + "\n"

-            + "    </td>\n"

-            + "  </tr>\n");

-          k++;

-        }

-      }

-      if (k == 0) {

-        out.print(

-          "  <tr>\n"

-          + "    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale, "generic.NoAccessTokensSpecified") + "</td>\n"

-          + "  </tr>\n");

-      }

-      out.print(

-        "  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"

-        + "  <tr class=\"evenformrow\">\n"

-        + "    <td class=\"formcolumncell\">\n"

-        + "      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n"

-        + "      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"

-        + "      <a name=\"" + seqPrefix + "token_" + Integer.toString(k) + "\">\n"

-        + "        <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "generic.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_" + Integer.toString(k + 1) + "\")' alt=\"" + Messages.getAttributeString(locale, "generic.AddAccessToken") + "\"/>\n"

-        + "      </a>&nbsp;\n"

-        + "    </td>\n"

-        + "    <td class=\"formcolumncell\">\n"

-        + "      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"

-        + "    </td>\n"

-        + "  </tr>\n"

-        + "</table>\n");

-      out.print("</td></tr></table>");

-    } else {

-      // Finally, go through forced ACL

-      i = 0;

-      k = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i++);

-        if (sn.getType().equals("access")) {

-          String accessDescription = "_" + Integer.toString(k);

-          String token = sn.getAttributeValue("token");

-          out.print(

-            "<input type=\"hidden\" name=\"" + seqPrefix + "spectoken" + accessDescription + "\" value=\"" + Encoder.attributeEscape(token) + "\"/>\n");

-          k++;

-        }

-      }

-      out.print("<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n");

-      out.print("<input type=\"hidden\" name=\""+seqPrefix+"genericAuthMode\" value=\"" + Encoder.attributeEscape(genericAuthMode) + "\"/>\n");

-    }

-  }

-

-  @Override

-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,

-    int connectionSequenceNumber)

-    throws ManifoldCFException {

-    String seqPrefix = "s"+connectionSequenceNumber+"_";

-

-    String xc = variableContext.getParameter(seqPrefix+"paramcount");

-    if (xc != null) {

-      // Delete all tokens first

-      int i = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i);

-        if (sn.getType().equals("param")) {

-          ds.removeChild(i);

-        } else {

-          i++;

-        }

-      }

-

-      int accessCount = Integer.parseInt(xc);

-      i = 0;

-      while (i < accessCount) {

-        String paramDescription = "_" + Integer.toString(i);

-        String paramOpName = seqPrefix + "paramop" + paramDescription;

-        xc = variableContext.getParameter(paramOpName);

-        if (xc != null && xc.equals("Delete")) {

-          // Next row

-          i++;

-          continue;

-        }

-        // Get the stuff we need

-        String paramName = variableContext.getParameter(seqPrefix + "specparamname" + paramDescription);

-        String paramValue = variableContext.getParameter(seqPrefix + "specparamvalue" + paramDescription);

-        SpecificationNode node = new SpecificationNode("param");

-        node.setAttribute("name", paramName);

-        node.setValue(paramValue);

-        ds.addChild(ds.getChildCount(), node);

-        i++;

-      }

-

-      String op = variableContext.getParameter(seqPrefix+"paramop");

-      if (op != null && op.equals("Add")) {

-        String paramName = variableContext.getParameter(seqPrefix+"specparamname");

-        String paramValue = variableContext.getParameter(seqPrefix+"specparamvalue");

-        SpecificationNode node = new SpecificationNode("param");

-        node.setAttribute("name", paramName);

-        node.setValue(paramValue);

-        ds.addChild(ds.getChildCount(), node);

-      }

-    }

-

-    String redmineAuthMode = variableContext.getParameter(seqPrefix+"genericAuthMode");

-    if (redmineAuthMode != null) {

-      // Delete existing seeds record first

-      int i = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i);

-        if (sn.getType().equals("genericAuthMode")) {

-          ds.removeChild(i);

-        } else {

-          i++;

-        }

-      }

-      SpecificationNode cn = new SpecificationNode("genericAuthMode");

-      cn.setValue(redmineAuthMode);

-      ds.addChild(ds.getChildCount(), cn);

-    }

-

-    xc = variableContext.getParameter(seqPrefix+"tokencount");

-    if (xc != null) {

-      // Delete all tokens first

-      int i = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i);

-        if (sn.getType().equals("access")) {

-          ds.removeChild(i);

-        } else {

-          i++;

-        }

-      }

-

-      int accessCount = Integer.parseInt(xc);

-      i = 0;

-      while (i < accessCount) {

-        String accessDescription = "_" + Integer.toString(i);

-        String accessOpName = seqPrefix + "accessop" + accessDescription;

-        xc = variableContext.getParameter(accessOpName);

-        if (xc != null && xc.equals("Delete")) {

-          // Next row

-          i++;

-          continue;

-        }

-        // Get the stuff we need

-        String accessSpec = variableContext.getParameter(seqPrefix + "spectoken" + accessDescription);

-        SpecificationNode node = new SpecificationNode("access");

-        node.setAttribute("token", accessSpec);

-        ds.addChild(ds.getChildCount(), node);

-        i++;

-      }

-

-      String op = variableContext.getParameter(seqPrefix+"accessop");

-      if (op != null && op.equals("Add")) {

-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");

-        SpecificationNode node = new SpecificationNode("access");

-        node.setAttribute("token", accessspec);

-        ds.addChild(ds.getChildCount(), node);

-      }

-    }

-

-    return null;

-  }

-

-  @Override

-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,

-    int connectionSequenceNumber)

-    throws ManifoldCFException, IOException {

-    boolean seenAny;

-    int i;

-

-    i = 0;

-    seenAny = false;

-    while (i < ds.getChildCount()) {

-      SpecificationNode sn = ds.getChild(i++);

-      if (sn.getType().equals("param")) {

-        if (seenAny == false) {

-          out.print(

-            "  <tr>\n"

-            + "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.Parameters") + "</nobr></td>\n"

-            + "    <td class=\"value\">\n");

-          seenAny = true;

-        }

-        String paramName = sn.getAttributeValue("name");

-        String paramValue = sn.getValue();

-        out.print(Encoder.bodyEscape(paramName) + " = " + Encoder.bodyEscape(paramValue) + "<br/>\n");

-      }

-    }

-

-    if (seenAny) {

-      out.print(

-        "    </td>\n"

-        + "  </tr>\n");

-    } else {

-      out.print(

-        "  <tr><td class=\"message\" colspan=\"4\"><nobr>" + Messages.getBodyString(locale, "generic.NoParametersSpecified") + "</nobr></td></tr>\n");

-    }

-

-    out.print(

-      "  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n");

-

-    // Go through looking for access tokens

-    i = 0;

-    seenAny = false;

-    while (i < ds.getChildCount()) {

-      SpecificationNode sn = ds.getChild(i++);

-      if (sn.getType().equals("access")) {

-        if (seenAny == false) {

-          out.print(

-            "  <tr>\n"

-            + "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "generic.AccessTokens") + "</nobr></td>\n"

-            + "    <td class=\"value\">\n");

-          seenAny = true;

-        }

-        String token = sn.getAttributeValue("token");

-        out.print(Encoder.bodyEscape(token) + "<br/>\n");

-      }

-    }

-

-    if (seenAny) {

-      out.print(

-        "    </td>\n"

-        + "  </tr>\n");

-    } else {

-      out.print(

-        "  <tr><td class=\"message\" colspan=\"4\"><nobr>" + Messages.getBodyString(locale, "generic.NoAccessTokensSpecified") + "</nobr></td></tr>\n");

-    }

-    out.print(

-      "  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n");

-  }

-

-  private String getParam(ConfigParams parameters, String name, String def) {

-    return parameters.getParameter(name) != null ? parameters.getParameter(name) : def;

-  }

-

-  private boolean copyParam(IPostParameters variableContext, ConfigParams parameters, String name) {

-    String val = variableContext.getParameter(name);

-    if (val == null) {

-      return false;

-    }

-    parameters.setParameter(name, val);

-    return true;

-  }

-

-  protected static String[] getAcls(Specification spec) {

-    HashMap map = new HashMap();

-    int i = 0;

-    while (i < spec.getChildCount()) {

-      SpecificationNode sn = spec.getChild(i++);

-      if (sn.getType().equals("access")) {

-        String token = sn.getAttributeValue("token");

-        map.put(token, token);

-      }

-    }

-

-    String[] rval = new String[map.size()];

-    Iterator iter = map.keySet().iterator();

-    i = 0;

-    while (iter.hasNext()) {

-      rval[i++] = (String) iter.next();

-    }

-    return rval;

-  }

-

-  protected static void handleIOException(IOException e)

-    throws ManifoldCFException, ServiceInterruption {

-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);

-    }

-    long currentTime = System.currentTimeMillis();

-    throw new ServiceInterruption("IO exception: " + e.getMessage(), e, currentTime + 300000L,

-      currentTime + 3 * 60 * 60000L, -1, false);

-  }

-

-  static class PreemptiveAuth implements HttpRequestInterceptor {

-

-    private Credentials credentials;

-

-    public PreemptiveAuth(Credentials creds) {

-      this.credentials = creds;

-    }

-

-    @Override

-    public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {

-      request.addHeader(new BasicScheme(StandardCharsets.US_ASCII).authenticate(credentials, request, context));

-    }

-  }

-

-  protected static class CheckThread extends Thread {

-

-    protected HttpClient client;

-

-    protected String url;

-

-    protected Throwable exception = null;

-

-    protected String result = "Unknown";

-

-    public CheckThread(HttpClient client, String url) {

-      super();

-      setDaemon(true);

-      this.client = client;

-      this.url = url;

-    }

-

-    @Override

-    public void run() {

-      HttpGet method = new HttpGet(url);

-      try {

-        HttpResponse response = client.execute(method);

-        try {

-          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

-            result = "Connection failed: " + response.getStatusLine().getReasonPhrase();

-            return;

-          }

-          EntityUtils.consume(response.getEntity());

-          result = "Connection OK";

-        } finally {

-          EntityUtils.consume(response.getEntity());

-          method.releaseConnection();

-        }

-      } catch (IOException ex) {

-        exception = ex;

-      }

-    }

-

-    public Throwable getException() {

-      return exception;

-    }

-

-    public String getResult() {

-      return result;

-    }

-  }

-

-  protected static class ExecuteSeedingThread extends Thread {

-

-    protected final HttpClient client;

-

-    protected final String url;

-

-    protected final XThreadStringBuffer seedBuffer;

-

-    protected Throwable exception = null;

-

-    public ExecuteSeedingThread(HttpClient client, String url) {

-      super();

-      setDaemon(true);

-      this.client = client;

-      this.url = url;

-      seedBuffer = new XThreadStringBuffer();

-    }

-

-    public XThreadStringBuffer getBuffer() {

-      return seedBuffer;

-    }

-

-    public void finishUp()

-      throws InterruptedException {

-      seedBuffer.abandon();

-      join();

-      Throwable thr = exception;

-      if (thr != null) {

-        if (thr instanceof RuntimeException) {

-          throw (RuntimeException) thr;

-        } else if (thr instanceof Error) {

-          throw (Error) thr;

-        } else {

-          throw new RuntimeException("Unhandled exception of type: " + thr.getClass().getName(), thr);

-        }

-      }

-    }

-

-    @Override

-    public void run() {

-      HttpGet method = new HttpGet(url.toString());

-

-      try {

-        HttpResponse response = client.execute(method);

-        try {

-          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

-            exception = new ManifoldCFException("addSeedDocuments error - interface returned incorrect return code for: " + url + " - " + response.getStatusLine().toString());

-            return;

-          }

-

-          try {

-            SAXParserFactory factory = SAXParserFactory.newInstance();

-            factory.setNamespaceAware(true);

-            SAXParser parser = factory.newSAXParser();

-            DefaultHandler handler = new SAXSeedingHandler(seedBuffer);

-            parser.parse(response.getEntity().getContent(), handler);

-          } catch (FactoryConfigurationError ex) {

-            exception = new ManifoldCFException("addSeedDocuments error: " + ex.getMessage(), ex);

-          } catch (ParserConfigurationException ex) {

-            exception = new ManifoldCFException("addSeedDocuments error: " + ex.getMessage(), ex);

-          } catch (SAXException ex) {

-            exception = new ManifoldCFException("addSeedDocuments error: " + ex.getMessage(), ex);

-          }

-          seedBuffer.signalDone();

-        } finally {

-          EntityUtils.consume(response.getEntity());

-          method.releaseConnection();

-        }

-      } catch (IOException ex) {

-        exception = ex;

-      }

-    }

-

-    public Throwable getException() {

-      return exception;

-    }

-  }

-

-  protected static class DocumentVersionThread extends Thread {

-

-    protected final HttpClient client;

-

-    protected final String url;

-

-    protected Throwable exception = null;

-

-    protected final String[] versions;

-

-    protected final ConcurrentHashMap<String, Item> documentCache;

-

-    protected final String[] documentIdentifiers;

-

-    protected final String genericAuthMode;

-

-    protected final String defaultRights;

-

-    public DocumentVersionThread(HttpClient client, String url, String[] documentIdentifiers, String genericAuthMode, String defaultRights, ConcurrentHashMap<String, Item> documentCache) {

-      super();

-      setDaemon(true);

-      this.client = client;

-      this.url = url;

-      this.documentCache = documentCache;

-      this.documentIdentifiers = documentIdentifiers;

-      this.genericAuthMode = genericAuthMode;

-      this.defaultRights = defaultRights;

-      this.versions = new String[documentIdentifiers.length];

-      for (int i = 0; i < versions.length; i++) {

-        versions[i] = null;

-      }

-    }

-

-    @Override

-    public void run() {

-      try {

-        HttpGet method = new HttpGet(url.toString());

-

-        HttpResponse response = client.execute(method);

-        try {

-          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

-            exception = new ManifoldCFException("addSeedDocuments error - interface returned incorrect return code for: " + url + " - " + response.getStatusLine().toString());

-            return;

-          }

-          JAXBContext context;

-          context = JAXBContext.newInstance(Items.class);

-          Unmarshaller m = context.createUnmarshaller();

-          Items items = (Items) m.unmarshal(response.getEntity().getContent());

-          if (items.items != null) {

-            for (Item item : items.items) {

-              documentCache.put(item.id, item);

-              for (int i = 0; i < versions.length; i++) {

-                if (documentIdentifiers[i].equals(item.id)) {

-                  if ("provided".equals(genericAuthMode)) {

-                    versions[i] = item.getVersionString();

-                  } else {

-                    versions[i] = item.version + defaultRights;

-                  }

-                  break;

-                }

-              }

-            }

-          }

-        } catch (JAXBException ex) {

-          exception = ex;

-        } finally {

-          EntityUtils.consume(response.getEntity());

-          method.releaseConnection();

-        }

-      } catch (Exception ex) {

-        exception = ex;

-      }

-    }

-

-    public String[] finishUp()

-      throws ManifoldCFException, ServiceInterruption, IOException, InterruptedException {

-      join();

-      Throwable thr = exception;

-      if (thr != null) {

-        if (thr instanceof ManifoldCFException) {

-          throw (ManifoldCFException) thr;

-        } else if (thr instanceof ServiceInterruption) {

-          throw (ServiceInterruption) thr;

-        } else if (thr instanceof IOException) {

-          throw (IOException) thr;

-        } else if (thr instanceof RuntimeException) {

-          throw (RuntimeException) thr;

-        } else if (thr instanceof Error) {

-          throw (Error) thr;

-        }

-        throw new ManifoldCFException("getDocumentVersions error: " + thr.getMessage(), thr);

-      }

-      return versions;

-    }

-  }

-

-  protected static class ExecuteProcessThread extends Thread {

-

-    protected final HttpClient client;

-

-    protected final String url;

-

-    protected Throwable exception = null;

-

-    protected XThreadInputStream threadStream;

-

-    protected boolean abortThread = false;

-

-    protected long streamLength = 0;

-

-    public ExecuteProcessThread(HttpClient client, String url) {

-      super();

-      setDaemon(true);

-      this.client = client;

-      this.url = url;

-    }

-

-    @Override

-    public void run() {

-      try {

-        HttpGet method = new HttpGet(url);

-        HttpResponse response = client.execute(method);

-        try {

-          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

-            exception = new ManifoldCFException("processDocuments error - interface returned incorrect return code for: " + url + " - " + response.getStatusLine().toString());

-            return;

-          }

-          synchronized (this) {

-            if (!abortThread) {

-              streamLength = response.getEntity().getContentLength();

-              threadStream = new XThreadInputStream(response.getEntity().getContent());

-              this.notifyAll();

-            }

-          }

-

-          if (threadStream != null) {

-            // Stuff the content until we are done

-            threadStream.stuffQueue();

-          }

-        } catch (Throwable ex) {

-          exception = ex;

-        } finally {

-          EntityUtils.consume(response.getEntity());

-          method.releaseConnection();

-        }

-      } catch (Throwable e) {

-        exception = e;

-      }

-    }

-

-    public InputStream getSafeInputStream() throws InterruptedException, IOException, ManifoldCFException {

-      while (true) {

-        synchronized (this) {

-          if (exception != null) {

-            throw new IllegalStateException("Check for response before getting stream");

-          }

-          checkException(exception);

-          if (threadStream != null) {

-            return threadStream;

-          }

-          wait();

-        }

-      }

-    }

-

-    public long getStreamLength() throws IOException, InterruptedException, ManifoldCFException {

-      while (true) {

-        synchronized (this) {

-          if (exception != null) {

-            throw new IllegalStateException("Check for response before getting stream");

-          }

-          checkException(exception);

-          if (threadStream != null) {

-            return streamLength;

-          }

-          wait();

-        }

-      }

-    }

-

-    protected synchronized void checkException(Throwable exception)

-      throws IOException, ManifoldCFException {

-      if (exception != null) {

-        Throwable e = exception;

-        if (e instanceof IOException) {

-          throw (IOException) e;

-        } else if (e instanceof ManifoldCFException) {

-          throw (ManifoldCFException) e;

-        } else if (e instanceof RuntimeException) {

-          throw (RuntimeException) e;

-        } else if (e instanceof Error) {

-          throw (Error) e;

-        } else {

-          throw new RuntimeException("Unhandled exception of type: " + e.getClass().getName(), e);

-        }

-      }

-    }

-

-    public void finishUp()

-      throws InterruptedException, IOException, ManifoldCFException {

-      // This will be called during the finally

-      // block in the case where all is well (and

-      // the stream completed) and in the case where

-      // there were exceptions.

-      synchronized (this) {

-        if (threadStream != null) {

-          threadStream.abort();

-        }

-        abortThread = true;

-      }

-      join();

-      checkException(exception);

-    }

-

-    public Throwable getException() {

-      return exception;

-    }

-  }

-

-  static public class SAXSeedingHandler extends DefaultHandler {

-

-    protected XThreadStringBuffer seedBuffer;

-

-    public SAXSeedingHandler(XThreadStringBuffer seedBuffer) {

-      this.seedBuffer = seedBuffer;

-    }

-

-    @Override

-    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

-      if ("seed".equals(localName) && attributes.getValue("id") != null) {

-        try {

-          seedBuffer.add(attributes.getValue("id"));

-        } catch (InterruptedException ex) {

-          throw new SAXException("Adding seed failed: " + ex.getMessage(), ex);

-        }

-      }

-    }

-  }

-}

diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/Messages.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/Messages.java
deleted file mode 100644
index cb7a7ae..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/Messages.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* $Id: Messages.java 1295926 2012-03-01 21:56:27Z kwright $ */

-/**

- * 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 org.apache.manifoldcf.crawler.connectors.generic;

-

-import java.util.Locale;

-import java.util.Map;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-

-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {

-

-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.crawler.connectors.generic.common";

-

-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.generic";

-

-  /**

-   * Constructor - do no instantiate

-   */

-  protected Messages() {

-  }

-

-  public static String getString(Locale locale, String messageKey) {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey) {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey) {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey) {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getString(Locale locale, String messageKey, Object[] args) {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  // More general methods which allow bundlenames and class loaders to be specified.

-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {

-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  // Resource output

-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String, String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException {

-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey,

-      substitutionParameters, mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String, String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException {

-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,

-      substitutionParameters, mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String, Object> contextObjects)

-    throws ManifoldCFException {

-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,

-      contextObjects);

-  }

-}

diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Auth.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Auth.java
deleted file mode 100644
index cecd8e1..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Auth.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import java.util.List;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-@XmlRootElement(name = "auth")
-public class Auth {
-
-  @XmlAttribute(name = "exists", required = true)
-  @XmlJavaTypeAdapter(BooleanAdapter.class)
-  public Boolean exists;
-
-  @XmlElements({
-    @XmlElement(name = "token", type = String.class)})
-  public List<String> tokens;
-}
\ No newline at end of file
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/BooleanAdapter.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/BooleanAdapter.java
deleted file mode 100644
index 0b6289c..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/BooleanAdapter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.Locale;
-
-public class BooleanAdapter extends XmlAdapter<String, Boolean> {
-
-  @Override
-  public Boolean unmarshal(String v) throws Exception {
-    v = v.toLowerCase(Locale.ROOT);
-    return "true".equals(v) || "1".equals(v) || "on".equals(v) || "y".equals(v);
-  }
-
-  @Override
-  public String marshal(Boolean v) throws Exception {
-    if (v) {
-      return "true";
-    }
-    return "false";
-  }
-}
\ No newline at end of file
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/DateAdapter.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/DateAdapter.java
deleted file mode 100644
index 0d60ff0..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/DateAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import java.util.Date;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import org.apache.manifoldcf.core.common.DateParser;
-
-/**
- *
- * @author krycek
- */
-public class DateAdapter extends XmlAdapter<String, Date> {
-
-  @Override
-  public Date unmarshal(String v) throws Exception {
-    return DateParser.parseISO8601Date(v);
-  }
-
-  @Override
-  public String marshal(Date v) throws Exception {
-    return DateParser.formatISO8601Date(v);
-  }
-}
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Item.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Item.java
deleted file mode 100644
index 3b25ab4..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Item.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import java.util.Date;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-/**
- *
- * @author krycek
- */
-@XmlRootElement(name = "item")
-public class Item {
-
-  @XmlAttribute(name = "id", required = true)
-  public String id;
-
-  @XmlElement(name = "url", required = true)
-  public String url;
-
-  @XmlElement(name = "version", required = true)
-  public String version;
-
-  @XmlElement(name = "content")
-  public String content;
-
-  @XmlElement(name = "mimetype")
-  public String mimeType;
-
-  @XmlElement(name = "created")
-  @XmlJavaTypeAdapter(value = DateAdapter.class)
-  public Date created;
-
-  @XmlElement(name = "updated")
-  @XmlJavaTypeAdapter(value = DateAdapter.class)
-  public Date updated;
-
-  @XmlElement(name = "filename")
-  public String fileName;
-
-  @XmlElementWrapper(name = "metadata")
-  @XmlElements(value = {
-    @XmlElement(name = "meta", type = Meta.class)})
-  public List<Meta> metadata;
-
-  @XmlElementWrapper(name = "auth")
-  @XmlElements(value = {
-    @XmlElement(name = "token", type = String.class)})
-  public List<String> auth;
-
-  @XmlElementWrapper(name = "related")
-  @XmlElements(value = {
-    @XmlElement(name = "id", type = String.class)})
-  public List<String> related;
-
-  public String getVersionString() {
-    if (version == null) {
-      return "";
-    }
-    StringBuilder sb = new StringBuilder(version);
-    if (auth != null) {
-      for (String t : auth) {
-        sb.append("|").append(t);
-      }
-    }
-    return sb.toString();
-  }
-}
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Items.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Items.java
deleted file mode 100644
index 0ee3ea5..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Items.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlRootElement;
-
-/**
- *
- * @author krycek
- */
-@XmlRootElement(name = "items")
-public class Items {
-
-  @XmlElements(value = {
-    @XmlElement(name = "item", type = Item.class)})
-  public List<Item> items;
-}
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Meta.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Meta.java
deleted file mode 100644
index 649de85..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Meta.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlValue;
-
-/**
- *
- * @author krycek
- */
-@XmlRootElement(name = "meta")
-public class Meta {
-
-  @XmlAttribute(name = "name")
-  public String name;
-
-  @XmlValue
-  public String value;
-}
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Seed.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Seed.java
deleted file mode 100644
index c515e14..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Seed.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlRootElement;
-
-@XmlRootElement(name = "seed")
-public class Seed {
-
-  @XmlAttribute(name = "id", required = true)
-  public String id;
-}
diff --git a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Seeds.java b/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Seeds.java
deleted file mode 100644
index 7175148..0000000
--- a/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/api/Seeds.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2013 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.generic.api;
-
-import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlRootElement;
-
-@XmlRootElement(name = "seeds")
-public class Seeds {
-
-  @XmlElements({
-    @XmlElement(name = "seed", type = Seed.class)})
-  public List<Seed> seeds;
-}
diff --git a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/generic/common_en_US.properties b/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/generic/common_en_US.properties
deleted file mode 100644
index 8d0fc22..0000000
--- a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/generic/common_en_US.properties
+++ /dev/null
@@ -1,23 +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.

-

-generic.EntryPoint=Entry Point

-generic.EntryPointColon=Entry Point:

-generic.LoginColon=Login:

-generic.PasswordColon=Password:

-generic.EntryPointCannotBeBlank=EntryPoint cannot be blank

-generic.ConnectionTimeoutColon=Connection timeout (milis):

-generic.SocketTimeoutColon=Socket timeout (milis):

-generic.ResponseLifetimeColon=Cache responses (milis):
\ No newline at end of file
diff --git a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/generic/common_es_ES.properties b/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/generic/common_es_ES.properties
deleted file mode 100644
index d373036..0000000
--- a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/generic/common_es_ES.properties
+++ /dev/null
@@ -1,23 +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.

-

-generic.EntryPoint=Punto de Entrada

-generic.EntryPointColon=Punto de Entrada:

-generic.LoginColon=Iniciar sesión:

-generic.PasswordColon=Contraseña:

-generic.EntryPointCannotBeBlank=Punto de entrada no puede estar en blanco

-generic.ConnectionTimeoutColon=El tiempo de conexión expiró (milis):

-generic.SocketTimeoutColon=Tiempo de espera de Socket (milis):

-generic.ResponseLifetimeColon=respuestas de caché (milis):
\ No newline at end of file
diff --git a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/generic/common_en_US.properties b/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/generic/common_en_US.properties
deleted file mode 100644
index 89aa80a..0000000
--- a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/generic/common_en_US.properties
+++ /dev/null
@@ -1,42 +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.

-

-generic.EntryPoint=Entry Point

-generic.EntryPointColon=Entry Point:

-generic.LoginColon=Login:

-generic.PasswordColon=Password:

-generic.ConnectionTimeoutColon=Connection timeout (milis):

-generic.SocketTimeoutColon=Socket timeout (milis):

-

-generic.Parameters=Parameters

-generic.ParametersColon=Parameters:

-generic.Token=Access token

-generic.TokensColon=Tokens:

-generic.Security=Security

-generic.Delete=Delete

-generic.Add=Add

-generic.DeleteToken=Delete token

-genericDeleteParameter=Delete parameter

-generic.NoAccessTokensSpecified=No access tokens defined.

-generic.NoParametersSpecified=No parameters specified.

-generic.TypeInAnAccessToken=Access token cannot be empty

-generic.TypeInParameterName=Parameter name cannot be empty

-generic.AuthMode=Authorization type

-generic.AuthModeForced=forced

-generic.AuthModeProvided=provided from API

-generic.AccessTokens=Access tokens

-

-generic.ParameterName=Parameter name

-generic.ParameterValue=Parameter value

diff --git a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/generic/common_es_ES.properties b/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/generic/common_es_ES.properties
deleted file mode 100644
index 0069931..0000000
--- a/connectors/generic/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/generic/common_es_ES.properties
+++ /dev/null
@@ -1,42 +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.

-

-generic.EntryPoint=Punto de entrada

-generic.EntryPointColon=Punto de entrada:

-generic.LoginColon=Iniciar sesión:

-generic.PasswordColon=Contraseña:

-generic.ConnectionTimeoutColon=El tiempo de conexión expirÒ (milis):

-generic.SocketTimeoutColon=Tiempo de espera de Socket (milis):

-

-generic.Parameters=Parámetros

-generic.ParametersColon=Parámetros:

-generic.Token=token de acceso

-generic.TokensColon=Tokens:

-generic.Security=Seguridad

-generic.Delete=borrar

-generic.Add=añadir

-generic.DeleteToken=eliminar token

-genericDeleteParameter=eliminar parámetro

-generic.NoAccessTokensSpecified=No hay tokens de acceso definidos.

-generic.NoParametersSpecified=No hay parámetros especificados.

-generic.TypeInAnAccessToken=Token de acceso no puede estar vacío

-generic.TypeInParameterName=Nombre del parámetro no puede estar vacío

-generic.AuthMode=tipo de Autorización

-generic.AuthModeForced=forzado

-generic.AuthModeProvided=proporcionado de API

-generic.AccessTokens=tokens de acceso

-

-generic.ParameterName=nombre del parámetro

-generic.ParameterValue=valor del parámetro

diff --git a/connectors/generic/pom.xml b/connectors/generic/pom.xml
deleted file mode 100644
index 82a05f4..0000000
--- a/connectors/generic/pom.xml
+++ /dev/null
@@ -1,383 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

-

-<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/xsd/maven-4.0.0.xsd">

-    <parent>

-        <groupId>org.apache.manifoldcf</groupId>

-        <artifactId>mcf-connectors</artifactId>

-        <version>2.10-SNAPSHOT</version>

-    </parent>

-    <modelVersion>4.0.0</modelVersion>

-

-    <properties>

-      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

-    </properties>

-

-    <artifactId>mcf-generic-connector</artifactId>

-    <name>ManifoldCF - Connectors - Generic</name>

-

-    <build>

-        <defaultGoal>integration-test</defaultGoal>

-        <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>

-        <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>

-        <resources>

-          <resource>

-            <directory>${basedir}/connector/src/main/native2ascii</directory>

-            <includes>

-              <include>**/*.properties</include>

-            </includes>

-          </resource>

-          <resource>

-            <directory>${basedir}/connector/src/main/resources</directory>

-            <includes>

-              <include>**/*.html</include>

-              <include>**/*.js</include>

-            </includes>

-          </resource>

-        </resources> 

-        <testResources>

-          <testResource>

-            <directory>${basedir}/connector/src/test/resources</directory>

-          </testResource>

-        </testResources>

-

-        <plugins>

-

-            <plugin>

-                <groupId>org.codehaus.mojo</groupId>

-                <artifactId>native2ascii-maven-plugin</artifactId>

-                <version>1.0-beta-1</version>

-                <configuration>

-                    <dest>target/classes</dest>

-                    <src>connector/src/main/native2ascii</src>

-                </configuration>

-                <executions>

-                    <execution>

-                        <id>native2ascii-utf8</id>

-                        <goals>

-                            <goal>native2ascii</goal>

-                        </goals>

-                        <configuration>

-                            <encoding>UTF8</encoding>

-                            <includes>

-                                  <include>**/*.properties</include>

-                            </includes>

-                        </configuration>

-                    </execution>

-                </executions>

-            </plugin>

-            

-            <!-- Test plugin configuration -->

-            <plugin>

-              <artifactId>maven-dependency-plugin</artifactId>

-              <executions>

-                 <execution>

-                  <id>copy-war</id>

-                  <phase>generate-resources</phase>

-                  <goals>

-                    <goal>copy</goal>

-                  </goals>

-                  <configuration>

-                    <outputDirectory>target/dependency</outputDirectory>

-                    <artifactItems>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-api-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-api-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-authority-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-authority-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-crawler-ui</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-crawler-ui.war</destFileName>

-                      </artifactItem>

-                    </artifactItems>

-                  </configuration>

-                </execution>

-              </executions>

-            </plugin>

-

-            <plugin>

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

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

-              <configuration>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-            </plugin>

-

-            <plugin>

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

-              <artifactId>maven-failsafe-plugin</artifactId>

-              <version>2.18.1</version>

-              <configuration>

-                <skipTests>${skipITs}</skipTests>

-                <systemPropertyVariables>

-                  <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>

-                  <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>

-                  <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>

-                </systemPropertyVariables>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-              <executions>

-                <execution>

-                  <id>integration-test</id>

-                  <goals>

-                    <goal>integration-test</goal>

-                  </goals>

-                </execution>

-                <execution>

-                  <id>verify</id>

-                  <goals>

-                    <goal>verify</goal>

-                  </goals>

-                </execution>

-              </executions>

-            </plugin>

-

-

-        </plugins>

-    </build>

-

-    <dependencies>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-connector-common</artifactId>

-          <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-agents</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-pull-agent</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-ui-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>commons-logging</groupId>

-            <artifactId>commons-logging</artifactId>

-            <version>${commons-logging.version}</version>

-        </dependency>

-	

-        <!-- Testing dependencies -->

-        

-        <dependency>

-          <groupId>junit</groupId>

-          <artifactId>junit</artifactId>

-          <version>${junit.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-core</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-agents</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-pull-agent</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.postgresql</groupId>

-          <artifactId>postgresql</artifactId>

-          <version>${postgresql.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.hsqldb</groupId>

-          <artifactId>hsqldb</artifactId>

-          <version>${hsqldb.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>mysql</groupId>

-          <artifactId>mysql-connector-java</artifactId>

-          <version>${mysql.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-api-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-authority-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-crawler-ui</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-server</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-util</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-webapp</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-servlet</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-http</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-io</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-security</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-continuation</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-xml</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-api-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>    

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>

-        

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-api</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-simple</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-            <groupId>xerces</groupId>

-            <artifactId>xercesImpl</artifactId>

-            <version>${xerces.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>com.sun.xml.bind</groupId>

-            <artifactId>jaxb-impl</artifactId>

-            <version>${jaxb.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>org.apache.httpcomponents</groupId>

-            <artifactId>httpclient</artifactId>

-            <version>${httpcomponent.httpclient.version}</version>

-        </dependency>

-    </dependencies>

-</project>

-

diff --git a/connectors/googledrive/.gitignore b/connectors/googledrive/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/googledrive/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/googledrive/build.xml b/connectors/googledrive/build.xml
deleted file mode 100644
index 5eca3f9..0000000
--- a/connectors/googledrive/build.xml
+++ /dev/null
@@ -1,58 +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.

--->

-

-<project name="googledrive" default="all">

-

-    <property environment="env"/>

-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">

-        <isset property="env.MCFDISTPATH"/>

-    </condition>

-    <property name="abs-dist" location="../../dist"/>

-    <condition property="mcf-dist" value="${abs-dist}">

-        <not>

-            <isset property="env.MCFDISTPATH"/>

-        </not>

-    </condition>

-

-    <import file="${mcf-dist}/connector-build.xml"/>

-

-    <path id="connector-classpath">

-        <path refid="mcf-connector-build.connector-classpath"/>

-        <fileset dir="../../lib">

-            <include name="google-*.jar"/>

-	    <include name="jackson-core.jar"/>

-        </fileset>

-    </path>

-

-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">

-        <mkdir dir="dist/lib"/>

-        <copy todir="dist/lib">

-            <fileset dir="../../lib">

-                <include name="google-*.jar"/>

-		<include name="jackson-core.jar"/>

-            </fileset>

-        </copy>

-    </target>

-

-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">

-        <antcall target="general-add-repository-connector">

-            <param name="connector-label" value="GoogleDrive"/>

-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.googledrive.GoogleDriveRepositoryConnector"/>

-        </antcall>

-    </target>

-

-</project>

diff --git a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveConfig.java b/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveConfig.java
deleted file mode 100644
index 2d52fad..0000000
--- a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveConfig.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.googledrive;
-
-/**
- *
- * @author andrew
- */
-public class GoogleDriveConfig {
-
-  public static final String CLIENT_ID_PARAM = "clientid";
-  public static final String CLIENT_SECRET_PARAM = "clientsecret";
-  public static final String REFRESH_TOKEN_PARAM = "refreshtoken";
-  public static final String REPOSITORY_ID_DEFAULT_VALUE = "googledrive";
-  public static final String GOOGLEDRIVE_QUERY_PARAM = "googledriveQuery";
-  public static final String GOOGLEDRIVE_QUERY_DEFAULT = "mimeType='application/vnd.google-apps.folder' and trashed=false";
-}
diff --git a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java b/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
deleted file mode 100644
index 7f3a44c..0000000
--- a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
+++ /dev/null
@@ -1,1387 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.googledrive;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Date;
-import java.util.Set;
-import java.util.Iterator;
-
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.log4j.Logger;
-
-import com.google.api.services.drive.model.File;
-import com.google.api.client.repackaged.com.google.common.base.Objects;
-import com.google.api.client.util.DateTime;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.Map.Entry;
-import java.security.GeneralSecurityException;
-/**
- *
- * @author andrew
- */
-public class GoogleDriveRepositoryConnector extends BaseRepositoryConnector {
-
-  protected final static String ACTIVITY_READ = "read document";
-  public final static String ACTIVITY_FETCH = "fetch";
-  protected static final String RELATIONSHIP_CHILD = "child";
-  
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
-
-  // Nodes
-  private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-  private static final String JOB_QUERY_ATTRIBUTE = "query";
-  private static final String JOB_ACCESS_NODE_TYPE = "access";
-  private static final String JOB_TOKEN_ATTRIBUTE = "token";
-
-  // Configuration tabs
-  private static final String GOOGLEDRIVE_SERVER_TAB_PROPERTY = "GoogleDriveRepositoryConnector.Server";
-  
-  // Specification tabs
-  private static final String GOOGLEDRIVE_QUERY_TAB_PROPERTY = "GoogleDriveRepositoryConnector.GoogleDriveQuery";
-  private static final String GOOGLEDRIVE_SECURITY_TAB_PROPERTY = "GoogleDriveRepositoryConnector.Security";
-  
-  // Template names for configuration
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_google_server.js";
-  /**
-   * Server tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_google_server.html";
-  
-  /**
-   * Forward to the HTML template to view the configuration parameters
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_googledrive.html";
-   
-  // Template names for specification
-  /**
-   * Forward to the javascript to check the specification parameters for the job
-   */
-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification_googledrive.js";
-  /**
-   * Forward to the template to edit the query for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_GOOGLEDRIVEQUERY = "editSpecification_googledriveQuery.html";
-  /**
-   * Forward to the template to edit the security parameters for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_SECURITY = "editSpecification_googledriveSecurity.html";
-  
-  /**
-   * Forward to the template to view the specification parameters for the job
-   */
-  private static final String VIEW_SPEC_FORWARD = "viewSpecification_googledrive.html";
-  
-  /**
-   * Endpoint server name
-   */
-  protected String server = "googledrive";
-  protected GoogleDriveSession session = null;
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-  protected String clientid = null;
-  protected String clientsecret = null;
-  protected String refreshtoken = null;
-
-  public GoogleDriveRepositoryConnector() {
-    super();
-  }
-
-  /**
-   * Return the list of activities that this connector supports (i.e. writes
-   * into the log).
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[]{ACTIVITY_FETCH, ACTIVITY_READ};
-  }
-
-  /**
-   * Get the bin name strings for a document identifier. The bin name
-   * describes the queue to which the document will be assigned for throttling
-   * purposes. Throttling controls the rate at which items in a given queue
-   * are fetched; it does not say anything about the overall fetch rate, which
-   * may operate on multiple queues or bins. For example, if you implement a
-   * web crawler, a good choice of bin name would be the server name, since
-   * that is likely to correspond to a real resource that will need real
-   * throttle protection.
-   *
-   * @param documentIdentifier is the document identifier.
-   * @return the set of bin names. If an empty array is returned, it is
-   * equivalent to there being no request rate throttling available for this
-   * identifier.
-   */
-  @Override
-  public String[] getBinNames(String documentIdentifier) {
-    return new String[]{server};
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (session != null) {
-      session.close();
-      session = null;
-      lastSessionFetch = -1L;
-    }
-
-    clientid = null;
-    clientsecret = null;
-    refreshtoken = null;
-  }
-
-  /**
-   * This method create a new GOOGLEDRIVE session for a GOOGLEDRIVE
-   * repository, if the repositoryId is not provided in the configuration, the
-   * connector will retrieve all the repositories exposed for this endpoint
-   * the it will start to use the first one.
-   *
-   * @param configParameters is the set of configuration parameters, which in
-   * this case describe the target appliance, basic auth configuration, etc.
-   * (This formerly came out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    clientid = params.getParameter(GoogleDriveConfig.CLIENT_ID_PARAM);
-    clientsecret = params.getObfuscatedParameter(GoogleDriveConfig.CLIENT_SECRET_PARAM);
-    refreshtoken = params.getParameter(GoogleDriveConfig.REFRESH_TOKEN_PARAM);
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection
-   * integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  protected class CheckConnectionThread extends Thread {
-
-    protected Throwable exception = null;
-
-    public CheckConnectionThread() {
-      super();
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.getRepositoryInfo();
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    getSession();
-    CheckConnectionThread t = new CheckConnectionThread();
-    try {
-      t.start();
-      t.join();
-      Throwable thr = t.getException();
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-      return;
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      Logging.connectors.warn("GOOGLEDRIVE: Socket timeout: " + e.getMessage(), e);
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      Logging.connectors.warn("GOOGLEDRIVE: Error checking repository: " + e.getMessage(), e);
-      handleIOException(e);
-    }
-  }
-
-  /**
-   * Set up a session
-   */
-  protected void getSession() throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      // Check for parameter validity
-
-      if (StringUtils.isEmpty(clientid)) {
-        throw new ManifoldCFException("Parameter " + GoogleDriveConfig.CLIENT_ID_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("GOOGLEDRIVE: Clientid = '" + clientid + "'");
-      }
-
-      if (StringUtils.isEmpty(clientsecret)) {
-        throw new ManifoldCFException("Parameter " + GoogleDriveConfig.CLIENT_SECRET_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("GOOGLEDRIVE: Clientsecret = '" + clientsecret + "'");
-      }
-
-      if (StringUtils.isEmpty(refreshtoken)) {
-        throw new ManifoldCFException("Parameter " + GoogleDriveConfig.REFRESH_TOKEN_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("GOOGLEDRIVE: refreshtoken = '" + refreshtoken + "'");
-      }
-
-
-
-      long currentTime;
-      GetSessionThread t = new GetSessionThread();
-      try {
-        t.start();
-        t.join();
-        Throwable thr = t.getException();
-        if (thr != null) {
-          if (thr instanceof IOException) {
-            throw (IOException) thr;
-          } else if (thr instanceof GeneralSecurityException) {
-            throw (GeneralSecurityException) thr;
-          } else {
-            throw (Error) thr;
-          }
-
-        }
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (java.net.SocketTimeoutException e) {
-        Logging.connectors.warn("GOOGLEDRIVE: Socket timeout: " + e.getMessage(), e);
-        handleIOException(e);
-      } catch (InterruptedIOException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-      } catch (GeneralSecurityException e) {
-        Logging.connectors.error("GOOGLEDRIVE: " +  "General security error initializing transport: " + e.getMessage(), e);
-        handleGeneralSecurityException(e);
-      } catch (IOException e) {
-        Logging.connectors.warn("GOOGLEDRIVE: IO error: " + e.getMessage(), e);
-        handleIOException(e);
-      }
-
-    }
-    lastSessionFetch = System.currentTimeMillis();
-  }
-
-  protected class GetSessionThread extends Thread {
-
-    protected Throwable exception = null;
-
-    public GetSessionThread() {
-      super();
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        // Create a session
-        session = new GoogleDriveSession(clientid, clientsecret, refreshtoken);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException() {
-      return exception;
-    }
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      session.close();
-      session = null;
-      lastSessionFetch = -1L;
-    }
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /**
-   * Get the maximum number of documents to amalgamate together into one
-   * batch, for this connector.
-   *
-   * @return the maximum number. 0 indicates "unlimited".
-   */
-  @Override
-  public int getMaxDocumentRequest() {
-    return 1;
-  }
-
-  /**
-   * Return the list of relationship types that this connector recognizes.
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes() {
-    return new String[]{RELATIONSHIP_CHILD};
-  }
-
-  /**
-   * Fill in a Server tab configuration parameter map for calling a Velocity
-   * template.
-   *
-   * @param newMap is the map to fill in
-   * @param parameters is the current set of configuration parameters
-   */
-  private static void fillInServerConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String clientid = parameters.getParameter(GoogleDriveConfig.CLIENT_ID_PARAM);
-    String clientsecret = parameters.getObfuscatedParameter(GoogleDriveConfig.CLIENT_SECRET_PARAM);
-    String refreshtoken = parameters.getParameter(GoogleDriveConfig.REFRESH_TOKEN_PARAM);
-
-    if (clientid == null) {
-      clientid = StringUtils.EMPTY;
-    }
-    
-    if (clientsecret == null) {
-      clientsecret = StringUtils.EMPTY;
-    } else {
-      clientsecret = mapper.mapPasswordToKey(clientsecret);
-    }
-
-    if (refreshtoken == null) {
-      refreshtoken = StringUtils.EMPTY;
-    }
-
-    newMap.put("CLIENTID", clientid);
-    newMap.put("CLIENTSECRET", clientsecret);
-    newMap.put("REFRESHTOKEN", refreshtoken);
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIG_FORWARD,paramMap);
-  }
-
-  /**
-   *
-   * Output the configuration header section. This method is called in the
-   * head section of the connector's configuration page. Its purpose is to add
-   * the required tabs to the list, and to output any javascript methods that
-   * might be needed by the configuration editing HTML.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @param tabsArray is an array of tab names. Add to this array any tab
-   * names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, GOOGLEDRIVE_SERVER_TAB_PROPERTY));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_HEADER_FORWARD,paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-
-
-    // Call the Velocity templates for each tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-
-    // Server tab
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_SERVER,paramMap);
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post,
-   * including binary file post information.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an
-   * error that should prevent saving of the connection (and cause a
-   * redirection to an error page).
-   *
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, ConfigParams parameters)
-      throws ManifoldCFException {
-
-    String clientid = variableContext.getParameter(GoogleDriveConfig.CLIENT_ID_PARAM);
-    if (clientid != null) {
-      parameters.setParameter(GoogleDriveConfig.CLIENT_ID_PARAM, clientid);
-    }
-
-    String clientsecret = variableContext.getParameter(GoogleDriveConfig.CLIENT_SECRET_PARAM);
-    if (clientsecret != null) {
-      parameters.setObfuscatedParameter(GoogleDriveConfig.CLIENT_SECRET_PARAM, variableContext.mapKeyToPassword(clientsecret));
-    }
-
-    String refreshtoken = variableContext.getParameter(GoogleDriveConfig.REFRESH_TOKEN_PARAM);
-    if (refreshtoken != null) {
-      parameters.setParameter(GoogleDriveConfig.REFRESH_TOKEN_PARAM, refreshtoken);
-    }
-
-    return null;
-  }
-
-  /**
-   * Fill in specification Velocity parameter map for GOOGLEDRIVEQuery tab.
-   */
-  private static void fillInGOOGLEDRIVEQuerySpecificationMap(Map<String, Object> newMap, Specification ds) {
-    String GoogleDriveQuery = GoogleDriveConfig.GOOGLEDRIVE_QUERY_DEFAULT;
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        GoogleDriveQuery = sn.getAttributeValue(JOB_QUERY_ATTRIBUTE);
-      }
-    }
-    newMap.put("GOOGLEDRIVEQUERY", GoogleDriveQuery);
-  }
-
-  /**
-   * Fill in specification Velocity parameter map for GOOGLEDRIVESecurity tab.
-   */
-  private static void fillInGOOGLEDRIVESecuritySpecificationMap(Map<String, Object> newMap, Specification ds) {
-    List<Map<String,String>> accessTokenList = new ArrayList<Map<String,String>>();
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {
-        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);
-        Map<String,String> accessMap = new HashMap<String,String>();
-        accessMap.put("TOKEN",token);
-        accessTokenList.add(accessMap);
-      }
-    }
-    newMap.put("ACCESSTOKENS", accessTokenList);
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInGOOGLEDRIVEQuerySpecificationMap(paramMap, ds);
-    fillInGOOGLEDRIVESecuritySpecificationMap(paramMap, ds);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPEC_FORWARD,paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String googleDriveQuery = variableContext.getParameter(seqPrefix+"googledrivequery");
-    if (googleDriveQuery != null) {
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode oldNode = ds.getChild(i);
-        if (oldNode.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-          ds.removeChild(i);
-          break;
-        }
-        i++;
-      }
-      SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
-      node.setAttribute(JOB_QUERY_ATTRIBUTE, googleDriveQuery);
-      ds.addChild(ds.getChildCount(), node);
-    }
-    
-    String xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null) {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(JOB_ACCESS_NODE_TYPE))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount) {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete")) {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);
-        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);
-        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    return null;
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-
-    // Output GOOGLEDRIVEQuery tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    fillInGOOGLEDRIVEQuerySpecificationMap(paramMap, ds);
-    fillInGOOGLEDRIVESecuritySpecificationMap(paramMap, ds);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_GOOGLEDRIVEQUERY,paramMap);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_SECURITY,paramMap);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-
-    tabsArray.add(Messages.getString(locale, GOOGLEDRIVE_QUERY_TAB_PROPERTY));
-    tabsArray.add(Messages.getString(locale, GOOGLEDRIVE_SECURITY_TAB_PROPERTY));
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInGOOGLEDRIVEQuerySpecificationMap(paramMap, ds);
-    fillInGOOGLEDRIVESecuritySpecificationMap(paramMap, ds);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER_FORWARD,paramMap);
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {
-
-    String googleDriveQuery = GoogleDriveConfig.GOOGLEDRIVE_QUERY_DEFAULT;
-    int i = 0;
-    while (i < spec.getChildCount()) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        googleDriveQuery = sn.getAttributeValue(JOB_QUERY_ATTRIBUTE);
-        break;
-      }
-      i++;
-    }
-
-    getSession();
-    GetSeedsThread t = new GetSeedsThread(googleDriveQuery);
-    try {
-      t.start();
-      boolean wasInterrupted = false;
-      try {
-        XThreadStringBuffer seedBuffer = t.getBuffer();
-        // Pick up the paths, and add them to the activities, before we join with the child thread.
-        while (true) {
-          // The only kind of exceptions this can throw are going to shut the process down.
-          String docPath = seedBuffer.fetch();
-          if (docPath ==  null)
-            break;
-          // Add the pageID to the queue
-          activities.addSeedDocument(docPath);
-        }
-      } catch (InterruptedException e) {
-        wasInterrupted = true;
-        throw e;
-      } catch (ManifoldCFException e) {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          wasInterrupted = true;
-        throw e;
-      } finally {
-        if (!wasInterrupted)
-          t.finishUp();
-      }
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      Logging.connectors.warn("GOOGLEDRIVE: Socket timeout adding seed documents: " + e.getMessage(), e);
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      Logging.connectors.warn("GOOGLEDRIVE: Error adding seed documents: " + e.getMessage(), e);
-      handleIOException(e);
-    }
-    return "";
-  }
-  
-  protected class GetSeedsThread extends Thread {
-
-    protected Throwable exception = null;
-    protected final String googleDriveQuery;
-    protected final XThreadStringBuffer seedBuffer;
-    
-    public GetSeedsThread(String googleDriveQuery) {
-      super();
-      this.googleDriveQuery = googleDriveQuery;
-      this.seedBuffer = new XThreadStringBuffer();
-      setDaemon(true);
-    }
-
-    @Override
-    public void run() {
-      try {
-        session.getSeeds(seedBuffer, googleDriveQuery);
-      } catch (Throwable e) {
-        this.exception = e;
-      } finally {
-        seedBuffer.signalDone();
-      }
-    }
-
-    public XThreadStringBuffer getBuffer() {
-      return seedBuffer;
-    }
-    
-    public void finishUp()
-      throws InterruptedException, IOException {
-      seedBuffer.abandon();
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException)
-          throw (IOException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-      }
-    }
-  }
-
-  protected File getObject(String nodeId)
-    throws ManifoldCFException, ServiceInterruption {
-    getSession();
-    GetObjectThread t = new GetObjectThread(nodeId);
-    try {
-      t.start();
-      t.join();
-      Throwable thr = t.getException();
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      Logging.connectors.warn("GOOGLEDRIVE: Socket timeout getting object: " + e.getMessage(), e);
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      Logging.connectors.warn("GOOGLEDRIVE: Error getting object: " + e.getMessage(), e);
-      handleIOException(e);
-    }
-    return t.getResponse();
-  }
-  
-  protected class GetObjectThread extends Thread {
-
-    protected final String nodeId;
-    protected Throwable exception = null;
-    protected File response = null;
-
-    public GetObjectThread(String nodeId) {
-      super();
-      setDaemon(true);
-      this.nodeId = nodeId;
-    }
-
-    public void run() {
-      try {
-        response = session.getObject(nodeId);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public File getResponse() {
-      return response;
-    }
-    
-    public Throwable getException() {
-      return exception;
-    }
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-      
-    // Forced acls
-    String[] acls = getAcls(spec);
-    // Sort it,
-    java.util.Arrays.sort(acls);
-
-    for (String documentIdentifier : documentIdentifiers) {
-      File googleFile = getObject(documentIdentifier);
-      String versionString;
-      
-      if (googleFile == null || (googleFile.containsKey("explicitlyTrashed") && googleFile.getExplicitlyTrashed())) {
-        //its deleted, move on
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-
-      if (!isDir(googleFile)) {
-        String rev = googleFile.getModifiedDate().toStringRfc3339();
-        if (StringUtils.isNotEmpty(rev)) {
-          StringBuilder sb = new StringBuilder();
-
-          // Acls
-          packList(sb,acls,'+');
-          if (acls.length > 0) {
-            sb.append('+');
-            pack(sb,defaultAuthorityDenyToken,'+');
-          }
-          else
-            sb.append('-');
-
-          sb.append(rev);
-          versionString = sb.toString();
-        } else {
-          //a google document that doesn't contain versioning information will NEVER be processed.
-          // I don't know what this means, and whether it can ever occur.
-          activities.deleteDocument(documentIdentifier);
-          continue;
-        }
-      } else {
-        //a google folder will always be processed
-        versionString = StringUtils.EMPTY;
-      }
-
-      if (versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)) {
-        long startTime = System.currentTimeMillis();
-        String errorCode = null;
-        String errorDesc = StringUtils.EMPTY;
-        Long fileSize = null;
-        boolean doLog = false;
-        String nodeId = documentIdentifier;
-        String version = versionString;
-
-        try {
-          if (Logging.connectors.isDebugEnabled()) {
-            Logging.connectors.debug("GOOGLEDRIVE: Processing document identifier '"
-                + nodeId + "'");
-            Logging.connectors.debug("GOOGLEDRIVE: have this file:\t" + googleFile.getTitle());
-          }
-
-          if ("application/vnd.google-apps.folder".equals(googleFile.getMimeType())) {
-            //if directory add its children
-
-            if (Logging.connectors.isDebugEnabled()) {
-              Logging.connectors.debug("GOOGLEDRIVE: its a directory");
-            }
-
-            // adding all the children + subdirs for a folder
-
-            getSession();
-            GetChildrenThread t = new GetChildrenThread(nodeId);
-            try {
-              t.start();
-              boolean wasInterrupted = false;
-              try {
-                XThreadStringBuffer childBuffer = t.getBuffer();
-                // Pick up the paths, and add them to the activities, before we join with the child thread.
-                while (true) {
-                  // The only kind of exceptions this can throw are going to shut the process down.
-                  String child = childBuffer.fetch();
-                  if (child ==  null)
-                    break;
-                  // Add the pageID to the queue
-                  activities.addDocumentReference(child, nodeId, RELATIONSHIP_CHILD);
-                }
-              } catch (InterruptedException e) {
-                wasInterrupted = true;
-                throw e;
-              } catch (ManifoldCFException e) {
-                if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                  wasInterrupted = true;
-                throw e;
-              } finally {
-                if (!wasInterrupted)
-                  t.finishUp();
-              }
-            } catch (InterruptedException e) {
-              t.interrupt();
-              throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-                ManifoldCFException.INTERRUPTED);
-            } catch (java.net.SocketTimeoutException e) {
-              Logging.connectors.warn("GOOGLEDRIVE: Socket timeout adding child documents: " + e.getMessage(), e);
-              handleIOException(e);
-            } catch (InterruptedIOException e) {
-              t.interrupt();
-              throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-                ManifoldCFException.INTERRUPTED);
-            } catch (IOException e) {
-              Logging.connectors.warn("GOOGLEDRIVE: Error adding child documents: " + e.getMessage(), e);
-              handleIOException(e);
-            }
-
-          } else {
-            // its a file
-            doLog = true;
-
-            if (Logging.connectors.isDebugEnabled()) {
-              Logging.connectors.debug("GOOGLEDRIVE: its a file");
-            }
-
-            // Get the file length
-            Long fileLengthLong = Objects.firstNonNull(googleFile.getFileSize(), 0L);
-            if (fileLengthLong != null) {
-
-              // Now do standard stuff
-              long fileLength = fileLengthLong.longValue();
-              String mimeType = googleFile.getMimeType();
-              DateTime createdDateObject = googleFile.getCreatedDate();
-              DateTime modifiedDateObject = googleFile.getModifiedDate();
-              String extension = googleFile.getFileExtension();
-              String title = googleFile.getTitle();
-              Date createdDate = (createdDateObject==null)?null:new Date(createdDateObject.getValue());
-              Date modifiedDate = (modifiedDateObject==null)?null:new Date(modifiedDateObject.getValue());
-              // We always direct to the PDF except for Spreadsheets
-              String documentURI = null;
-              if (!mimeType.equals("application/vnd.google-apps.spreadsheet")) {
-                documentURI = getUrl(googleFile, "application/pdf");
-              } else {
-                documentURI = getUrl(googleFile, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-              }
-
-              if (!activities.checkLengthIndexable(fileLength))
-              {
-                errorCode = activities.EXCLUDED_LENGTH;
-                errorDesc = "Excluding document because of file length ('"+fileLength+"')";
-                activities.noDocument(nodeId,version);
-                continue;
-              }
-              
-              if (!activities.checkURLIndexable(documentURI))
-              {
-                errorCode = activities.EXCLUDED_URL;
-                errorDesc = "Excluding document because of URL ('"+documentURI+"')";
-                activities.noDocument(nodeId,version);
-                continue;
-              }
-              
-              if (!activities.checkMimeTypeIndexable(mimeType))
-              {
-                errorCode = activities.EXCLUDED_MIMETYPE;
-                errorDesc = "Excluding document because of mime type ("+mimeType+")";
-                activities.noDocument(nodeId,version);
-                continue;
-              }
-              
-              if (!activities.checkDateIndexable(modifiedDate))
-              {
-                errorCode = activities.EXCLUDED_DATE;
-                errorDesc = "Excluding document because of date ("+modifiedDate+")";
-                activities.noDocument(nodeId,version);
-                continue;
-              }
-              
-              RepositoryDocument rd = new RepositoryDocument();
-
-              if (acls != null) {
-                rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acls);
-                if (acls.length > 0) {
-                  String[] denyAclArray = new String[]{defaultAuthorityDenyToken};
-                  rd.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,denyAclArray);
-                }
-              }
-              
-              if (mimeType != null)
-                rd.setMimeType(mimeType);
-              if (createdDate != null)
-                rd.setCreatedDate(createdDate);
-              if (modifiedDate != null)
-                rd.setModifiedDate(modifiedDate);
-              if (extension != null)
-              {
-                if (title == null)
-                  title = "";
-                rd.setFileName(title + "." + extension);
-              }
-
-              // Get general document metadata
-              for (Entry<String, Object> entry : googleFile.entrySet()) {
-                rd.addField(entry.getKey(), entry.getValue().toString());
-              }
-
-              // Fire up the document reading thread
-              DocumentReadingThread t = new DocumentReadingThread(documentURI);
-              try {
-                t.start();
-                boolean wasInterrupted = false;
-                try {
-                  InputStream is = t.getSafeInputStream();
-                  try {
-                    // Can only index while background thread is running!
-                    rd.setBinary(is, fileLength);
-                    activities.ingestDocumentWithException(nodeId, version, documentURI, rd);
-                  } finally {
-                    is.close();
-                  }
-                } catch (ManifoldCFException e) {
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    wasInterrupted = true;
-                  throw e;
-                } catch (java.net.SocketTimeoutException e) {
-                  throw e;
-                } catch (InterruptedIOException e) {
-                  wasInterrupted = true;
-                  throw e;
-                } finally {
-                  if (!wasInterrupted)
-                    t.finishUp();
-                }
-
-                // No errors.  Record the fact that we made it.
-                fileSize = new Long(fileLength);
-                errorCode = "OK";
-              } catch (InterruptedException e) {
-                t.interrupt();
-                throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-                  ManifoldCFException.INTERRUPTED);
-              } catch (java.net.SocketTimeoutException e) {
-                Logging.connectors.warn("GOOGLEDRIVE: Socket timeout reading document: " + e.getMessage(), e);
-                handleIOException(e);
-              } catch (InterruptedIOException e) {
-                t.interrupt();
-                throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-                  ManifoldCFException.INTERRUPTED);
-              } catch (IOException e) {
-                errorCode = "IOEXCEPTION";
-                errorDesc = e.getMessage();
-                Logging.connectors.warn("GOOGLEDRIVE: Error reading document: " + e.getMessage(), e);
-                handleIOException(e);
-              }
-            } else {
-              errorCode = "NOLENGTH";
-              errorDesc = "Document "+nodeId+" had no length; skipping";
-            }
-          }
-        } finally {
-          if (doLog && errorCode != null)
-            activities.recordActivity(new Long(startTime), ACTIVITY_READ,
-              fileSize, nodeId, errorCode, errorDesc, null);
-        }
-      }
-    }
-    
-  }
-  
-  protected class DocumentReadingThread extends Thread {
-
-    protected Throwable exception = null;
-    protected final String fileURL;
-    protected final XThreadInputStream stream;
-    
-    public DocumentReadingThread(String fileURL) {
-      super();
-      this.fileURL = fileURL;
-      this.stream = new XThreadInputStream();
-      setDaemon(true);
-    }
-
-    @Override
-    public void run() {
-      try {
-        session.getGoogleDriveOutputStream(stream, fileURL);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public InputStream getSafeInputStream() {
-      return stream;
-    }
-    
-    public void finishUp()
-      throws InterruptedException, IOException
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      stream.abort();
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException)
-          throw (IOException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-      }
-    }
-
-  }
-
-  /** Get the URL of a file in google land.
-  */
-  protected static String getUrl(File googleFile, String exportType) {
-    if (googleFile.containsKey("fileSize")) {
-      return googleFile.getDownloadUrl();
-    } else {
-      return googleFile.getExportLinks().get(exportType);
-    }
-  }
-
-  protected class GetChildrenThread extends Thread {
-
-    protected Throwable exception = null;
-    protected final String nodeId;
-    protected final XThreadStringBuffer childBuffer;
-    
-    public GetChildrenThread(String nodeId) {
-      super();
-      this.nodeId = nodeId;
-      this.childBuffer = new XThreadStringBuffer();
-      setDaemon(true);
-    }
-
-    @Override
-    public void run() {
-      try {
-        session.getChildren(childBuffer, nodeId);
-      } catch (Throwable e) {
-        this.exception = e;
-      } finally {
-        childBuffer.signalDone();
-      }
-    }
-
-    public XThreadStringBuffer getBuffer() {
-      return childBuffer;
-    }
-    
-    public void finishUp()
-      throws InterruptedException, IOException {
-      childBuffer.abandon();
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException)
-          throw (IOException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-      }
-    }
-  }
-
-  /** Grab forced acl out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getAcls(Specification spec) {
-    Set<String> map = new HashSet<String>();
-    for (int i = 0; i < spec.getChildCount(); i++) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {
-        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);
-        map.add(token);
-      }
-    }
-
-    String[] rval = new String[map.size()];
-    Iterator<String> iter = map.iterator();
-    int i = 0;
-    while (iter.hasNext()) {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  private boolean isDir(File f) {
-    return f.getMimeType().compareToIgnoreCase("application/vnd.google-apps.folder") == 0;
-  }
-  
-  private static void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption {
-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    }
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L,
-      currentTime + 3 * 60 * 60000L,-1,false);
-  }
-  
-  private static void handleGeneralSecurityException(GeneralSecurityException e)
-    throws ManifoldCFException, ServiceInterruption {
-    // Permanent problem: can't initialize transport layer
-    throw new ManifoldCFException("GoogleDrive exception: "+e.getMessage(), e);
-  }
-}
diff --git a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java b/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java
deleted file mode 100644
index 237ce51..0000000
--- a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.googledrive;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
-import com.google.api.client.googleapis.media.MediaHttpDownloader;
-import com.google.api.client.http.GenericUrl;
-import com.google.api.client.http.HttpTransport;
-import com.google.api.client.json.JsonFactory;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.drive.Drive;
-import java.util.Map;
-
-
-
-import java.util.HashMap;
-import java.util.HashSet;
-import com.google.api.services.drive.model.File;
-import com.google.api.services.drive.model.FileList;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import java.security.GeneralSecurityException;
-
-/**
- *
- * @author andrew
- */
-public class GoogleDriveSession {
-
-  private static String APPNAME = "ManifoldCF GoogleDrive Connector";
-  
-  private Drive drive;
-  private HttpTransport HTTP_TRANSPORT;
-  
-  private static final JsonFactory JSON_FACTORY = new JacksonFactory();
-  
-  /** Constructor.  Create a session.
-  */
-  public GoogleDriveSession(String clientId, String clientSecret, String refreshToken)
-    throws IOException, GeneralSecurityException {
-    HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
-
-    GoogleCredential credentials = new GoogleCredential.Builder().setClientSecrets(clientId, clientSecret)
-        .setJsonFactory(JSON_FACTORY).setTransport(HTTP_TRANSPORT).build().setRefreshToken(refreshToken);
-
-    drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials).setApplicationName(APPNAME).build();
-  }
-
-  /** Close session.
-  */
-  public void close() {
-    // MHL - figure out what is needed
-  }
-
-  /** Obtain repository information.
-  */
-  public Map<String, String> getRepositoryInfo() throws IOException {
-    Map<String, String> info = new HashMap<String, String>();
-    info.put("Application Name", drive.getApplicationName());
-    info.put("Base URL", drive.getBaseUrl());
-    // We need something that will actually cause a back-and-forth to the server!
-    drive.files().get("").execute();
-    return info;
-  }
-
-  /** Get the list of matching root documents, e.g. seeds.
-  */
-  public void getSeeds(XThreadStringBuffer idBuffer, String googleDriveQuery)
-    throws IOException, InterruptedException {
-    Drive.Files.List request;
-
-    request = drive.files().list().setQ(googleDriveQuery);
-
-    do {
-      FileList files = request.execute();
-      for (File f : files.getItems()) {
-        idBuffer.add(f.getId());
-      }
-      request.setPageToken(files.getNextPageToken());
-    } while (request.getPageToken() != null
-        && request.getPageToken().length() > 0);
-  }
-
-  /** Get an individual document.
-  */
-  public File getObject(String id) throws IOException {
-    File file = drive.files().get(id).execute();
-    return file;
-  }
-
-  /** Get the list of child documents for a document.
-  */
-  public void getChildren(XThreadStringBuffer idBuffer, String nodeId)
-    throws IOException, InterruptedException {
-    Drive.Files.List request = drive.files().list().setQ("'" + nodeId + "' in parents");
-
-    do {
-      FileList files = request.execute();
-      for (File f : files.getItems()) {
-        idBuffer.add(f.getId());
-      }
-      request.setPageToken(files.getNextPageToken());
-    } while (request.getPageToken() != null
-        && request.getPageToken().length() > 0);
-  }
-
-
-  /** Get a stream representing the specified document.
-  */
-  public void getGoogleDriveOutputStream(XThreadInputStream inputStream, String documentURI) throws IOException {
-    // Create an object that implements outputstream but pushes everything through to the designated input stream
-    OutputStream outputStream = new XThreadOutputStream(inputStream);
-    try {
-      MediaHttpDownloader downloader =
-          new MediaHttpDownloader(HTTP_TRANSPORT, drive.getRequestFactory().getInitializer());
-      downloader.setDirectDownloadEnabled(false);
-      downloader.download(new GenericUrl(documentURI), outputStream);
-    } finally {
-      // Make sure it is closed and flushed
-      outputStream.close();
-    }
-  }
-  
-}
diff --git a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/Messages.java b/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/Messages.java
deleted file mode 100644
index 628ba4a..0000000
--- a/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.googledrive;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.googledrive.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.googledrive";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties b/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties
deleted file mode 100644
index f824667..0000000
--- a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties
+++ /dev/null
@@ -1,38 +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.

-

-GoogleDriveRepositoryConnector.Server=Server

-GoogleDriveRepositoryConnector.GoogleDriveQuery=Seed Query

-GoogleDriveRepositoryConnector.Security=Security

-

-GoogleDriveRepositoryConnector.RefreshTokenColon=RefreshToken:

-GoogleDriveRepositoryConnector.ClientIDColon=Client ID:

-GoogleDriveRepositoryConnector.ClientSecretColon=Client Secret ID:

-

-

-GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull=Refresh Token must not be null

-GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull=Client Secret must not be null

-GoogleDriveRepositoryConnector.ClientMustNotBeNull=Client must not be null

-

-GoogleDriveRepositoryConnector.SeedQueryCannotBeNull=Seed query cannot be null

-GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive seed query:

-

-GoogleDriveRepositoryConnector.NoAccessTokensPresent=No access tokens present

-GoogleDriveRepositoryConnector.Add=Add

-GoogleDriveRepositoryConnector.AddAccessToken=Add access token

-GoogleDriveRepositoryConnector.Delete=Delete

-GoogleDriveRepositoryConnector.DeleteToken=Delete token #

-GoogleDriveRepositoryConnector.AccessTokensColon=Access tokens:

-GoogleDriveRepositoryConnector.TypeInAnAccessToken=Type in an access token

diff --git a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_es_ES.properties b/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_es_ES.properties
deleted file mode 100644
index 7f3deb0..0000000
--- a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_es_ES.properties
+++ /dev/null
@@ -1,38 +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.

-

-GoogleDriveRepositoryConnector.Server=Servidor

-GoogleDriveRepositoryConnector.GoogleDriveQuery=Pregunta de Semilla

-GoogleDriveRepositoryConnector.Security=Seguridad

-

-GoogleDriveRepositoryConnector.RefreshTokenColon=Refresque Token:

-GoogleDriveRepositoryConnector.ClientIDColon=Cliente ID:

-GoogleDriveRepositoryConnector.ClientSecretColon=Secreto de Cliente ID:

-

-

-GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull=Actualizar emergencia no debe ser nulo

-GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull=Cliente Secreto no debe ser nulo

-GoogleDriveRepositoryConnector.ClientMustNotBeNull=El cliente no debe ser nulo

-

-GoogleDriveRepositoryConnector.SeedQueryCannotBeNull=La pregunta de semilla no puede ser nula

-GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive consulta semilla:

-

-GoogleDriveRepositoryConnector.NoAccessTokensPresent=No hay tokens de acceso actuales

-GoogleDriveRepositoryConnector.Add=Añadir

-GoogleDriveRepositoryConnector.AddAccessToken=Añadir token de acceso

-GoogleDriveRepositoryConnector.Delete=borrar

-GoogleDriveRepositoryConnector.DeleteToken=eliminar token #

-GoogleDriveRepositoryConnector.AccessTokensColon=tokens de acceso:

-GoogleDriveRepositoryConnector.TypeInAnAccessToken=Escriba un token de acceso

diff --git a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties b/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties
deleted file mode 100644
index 2f07696..0000000
--- a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties
+++ /dev/null
@@ -1,38 +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.
-
-GoogleDriveRepositoryConnector.Server=Server
-GoogleDriveRepositoryConnector.GoogleDriveQuery=Seed Query
-GoogleDriveRepositoryConnector.Security=Security
-
-GoogleDriveRepositoryConnector.RefreshTokenColon=RefreshToken:
-GoogleDriveRepositoryConnector.ClientIDColon=Client ID:
-GoogleDriveRepositoryConnector.ClientSecretColon=Client Secret ID:
-
-
-GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull=Refresh Token must not be null
-GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull=Client Secret must not be null
-GoogleDriveRepositoryConnector.ClientMustNotBeNull=Client must not be null
-
-GoogleDriveRepositoryConnector.SeedQueryCannotBeNull=Seed query cannot be null
-GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive seed query:
-
-GoogleDriveRepositoryConnector.NoAccessTokensPresent=No access tokens present
-GoogleDriveRepositoryConnector.Add=Add
-GoogleDriveRepositoryConnector.AddAccessToken=Add access token
-GoogleDriveRepositoryConnector.Delete=Delete
-GoogleDriveRepositoryConnector.DeleteToken=Delete token #
-GoogleDriveRepositoryConnector.AccessTokensColon=Access tokens:
-GoogleDriveRepositoryConnector.TypeInAnAccessToken=Type in an access token
diff --git a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_zh_CN.properties b/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_zh_CN.properties
deleted file mode 100644
index 679e915..0000000
--- a/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_zh_CN.properties
+++ /dev/null
@@ -1,38 +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.
-
-GoogleDriveRepositoryConnector.Server=服务器
-GoogleDriveRepositoryConnector.GoogleDriveQuery=种子查询
-GoogleDriveRepositoryConnector.Security=安全
-
-GoogleDriveRepositoryConnector.RefreshTokenColon=刷新令牌:
-GoogleDriveRepositoryConnector.ClientIDColon=Client ID:
-GoogleDriveRepositoryConnector.ClientSecretColon=Client Secret:
-
-
-GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull=刷新令牌不能为Null
-GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull=Client Secret不能为Null
-GoogleDriveRepositoryConnector.ClientMustNotBeNull=客户端不能为Null
-
-GoogleDriveRepositoryConnector.SeedQueryCannotBeNull=种子查询不能为Null
-GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive种子查询:
-
-GoogleDriveRepositoryConnector.NoAccessTokensPresent=访问令牌不存在
-GoogleDriveRepositoryConnector.Add=添加
-GoogleDriveRepositoryConnector.AddAccessToken=添加访问令牌
-GoogleDriveRepositoryConnector.Delete=删除
-GoogleDriveRepositoryConnector.DeleteToken=删除令牌 #
-GoogleDriveRepositoryConnector.AccessTokensColon=访问令牌:
-GoogleDriveRepositoryConnector.TypeInAnAccessToken=输入访问令牌
diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html
deleted file mode 100644
index 94c8673..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html
+++ /dev/null
@@ -1,64 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('GoogleDriveRepositoryConnector.Server'))

-

-<table class="displaytable">

-  <tr>

-    <td class="separator" colspan="2">

-      <hr />

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.RefreshTokenColon'))

-      </nobr>

-    </td>

-    <td class="value">

-      <input type="text" id="refreshtoken" name="refreshtoken" value="$Encoder.attributeEscape($REFRESHTOKEN)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientIDColon'))

-      </nobr>

-    </td>

-    <td class="value">

-      <input type="text" id="clientid" name="clientid" value="$Encoder.attributeEscape($CLIENTID)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientSecretColon'))

-      </nobr>

-    </td>

-    <td class="value">

-      <input type="password" id="clientsecret" name="clientsecret" value="$Encoder.attributeEscape($CLIENTSECRET)" />

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="clientid" value="$Encoder.attributeEscape($CLIENTID)" />

-<input type="hidden" name="clientsecret" value="$Encoder.attributeEscape($CLIENTSECRET)" />

-<input type="hidden" name="refreshtoken" value="$Encoder.attributeEscape($REFRESHTOKEN)" />

-

-#end

diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.js b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.js
deleted file mode 100644
index 5fccbed..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.js
+++ /dev/null
@@ -1,52 +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.

--->

-

-<script type="text/javascript">

-<!--

-function checkConfig()

-{

-  return true;

-}

- 

-function checkConfigForSave()

-{

-    

-  if (editconnection.refreshtoken.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Server'))");

-    editconnection.jsonauth.focus();

-    return false;

-  }

-  if (editconnection.clientid.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Server'))");

-    editconnection.key.focus();

-    return false;

-  }

-  if (editconnection.clientsecret.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Server'))");

-    editconnection.secret.focus();

-    return false;

-  }

-  return true;

-}

-//-->

-</script>
\ No newline at end of file
diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js
deleted file mode 100644
index 4720dd5..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js
+++ /dev/null
@@ -1,54 +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.

--->

-

-<script type="text/javascript">

-<!--

-function s${SeqNum}_checkSpecificationForSave()

-{

-  if (editjob.s${SeqNum}_googledrivequery.value == "") {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.SeedQueryCannotBeNull'))");

-    SelectSequencedTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQuery'))",${SeqNum});

-    editjob.s${SeqNum}_googledrivequery.focus();

-    return false;

-  }

-  return true;

-}

- 

-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)

-{

-  eval("editjob."+n+".value = \""+opValue+"\"");

-  postFormSetAnchor(anchorvalue);

-}

-

-function s${SeqNum}_SpecDeleteToken(i)

-{

-  s${SeqNum}_SpecOp("s${SeqNum}_accessop_"+i,"Delete","s${SeqNum}_token_"+i);

-}

-

-function s${SeqNum}_SpecAddToken(i)

-{

-  if (editjob.s${SeqNum}_spectoken.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.TypeInAnAccessToken'))");

-    editjob.s${SeqNum}_spectoken.focus();

-    return;

-  }

-  s${SeqNum}_SpecOp("s${SeqNum}_accessop","Add","s${SeqNum}_token_"+i);

-}

-

-//-->

-</script>
\ No newline at end of file
diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html
deleted file mode 100644
index b65a911..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html
+++ /dev/null
@@ -1,40 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQuery') && ${SeqNum} == ${SelectedNum})

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQueryColon'))

-      </nobr>

-    </td>

-    <td class="value">

-      <nobr>

-        <input type="text" size="120" name="s${SeqNum}_googledrivequery" value="$Encoder.attributeEscape($GOOGLEDRIVEQUERY)" />

-      </nobr>

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="s${SeqNum}_googledrivequery" value="$Encoder.attributeEscape($GOOGLEDRIVEQUERY)" />

-

-#end

diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html
deleted file mode 100644
index ca4d069..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html
+++ /dev/null
@@ -1,73 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('GoogleDriveRepositoryConnector.Security') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  #set($atcounter = 0)
-  #foreach($atoken in $ACCESSTOKENS)
-
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_accessop_$atcounter" value=""/>
-      <input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>
-      <a name="s${SeqNum}_token_$atcounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Delete'))" onClick='Javascript:s${SeqNum}_SpecDeleteToken($atcounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.DeleteToken'))$atcounter"/>
-      </a>
-    </td>
-    <td class="value">$Encoder.bodyEscape($atoken.get('TOKEN'))</td>
-  </tr>
-
-    #set($atcounter = $atcounter + 1)
-  #end
-
-  #set($nexttoken = $atcounter + 1)
-
-  #if($atcounter == 0)
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.NoAccessTokensPresent'))</td>
-  </tr>
-  #end
-
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>
-      <input type="hidden" name="s${SeqNum}_accessop" value=""/>
-      <a name="s${SeqNum}_token_$atcounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Add'))" onClick='Javascript:s${SeqNum}_SpecAddToken($nexttoken)' alt="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.AddAccessToken'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="s${SeqNum}_spectoken" value=""/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($atcounter = 0)
-  #foreach($atoken in $ACCESSTOKENS)
-<input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>
-    #set($atcounter = $atcounter + 1)
-  #end
-<input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>
-
-#end
diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html
deleted file mode 100644
index b4db034..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html
+++ /dev/null
@@ -1,44 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientIDColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($CLIENTID)</nobr>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientSecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>********</nobr>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.RefreshTokenColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($REFRESHTOKEN)</nobr>

-    </td>

-  </tr>

-</table>

-

diff --git a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html b/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html
deleted file mode 100644
index 5b36b2b..0000000
--- a/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html
+++ /dev/null
@@ -1,47 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQueryColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($GOOGLEDRIVEQUERY)</nobr>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-#if($ACCESSTOKENS.size() == 0)

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.NoAccessTokensPresent'))

-    </td>

-#else

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.AccessTokensColon'))</nobr>

-    </td>

-    <td class="value">

-  #set($atcounter = 0)

-  #foreach($atoken in $ACCESSTOKENS)

-    <nobr>$Encoder.bodyEscape($atoken.get('TOKEN'))</nobr><br/>

-    #set($atcounter = $atcounter + 1)

-  #end

-    </td>

-#end

-  </tr>

-

-</table>

diff --git a/connectors/googledrive/pom.xml b/connectors/googledrive/pom.xml
deleted file mode 100644
index dddff27..0000000
--- a/connectors/googledrive/pom.xml
+++ /dev/null
@@ -1,401 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

-

-<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/xsd/maven-4.0.0.xsd">

-

-    <parent>

-        <groupId>org.apache.manifoldcf</groupId>

-        <artifactId>mcf-connectors</artifactId>

-        <version>2.10-SNAPSHOT</version>

-    </parent>

-    <modelVersion>4.0.0</modelVersion>

-

-    <packaging>jar</packaging>

-

-    <developers>

-        <developer>

-            <name>Andrew Janowczyk</name>

-            <organization>Searchbox</organization>

-            <organizationUrl>http://www.searchbox.com</organizationUrl>

-            <url>http://www.searchbox.com</url>

-        </developer>

-    </developers>

-

-    <properties>

-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

-        <project.http.version>1.19.0</project.http.version>

-        <project.oauth.version>1.19.0</project.oauth.version>

-    </properties>

-

-    <artifactId>mcf-googledrive-connector</artifactId>

-    <name>ManifoldCF - Connectors - GoogleDrive</name>

-

-    <build>

-        <defaultGoal>integration-test</defaultGoal>

-        <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>

-        <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>

-        <resources>

-          <resource>

-            <directory>${basedir}/connector/src/main/native2ascii</directory>

-            <includes>

-              <include>**/*.properties</include>

-            </includes>

-          </resource>

-          <resource>

-            <directory>${basedir}/connector/src/main/resources</directory>

-            <includes>

-              <include>**/*.html</include>

-              <include>**/*.js</include>

-            </includes>

-          </resource>

-        </resources> 

-        <testResources>

-          <testResource>

-            <directory>${basedir}/connector/src/test/resources</directory>

-          </testResource>

-        </testResources>

-        

-        <plugins>

-

-            <plugin>

-                <groupId>org.codehaus.mojo</groupId>

-                <artifactId>native2ascii-maven-plugin</artifactId>

-                <version>1.0-beta-1</version>

-                <configuration>

-                    <workDir>target/classes</workDir>

-                </configuration>

-                <executions>

-                    <execution>

-                        <id>native2ascii-utf8</id>

-                        <goals>

-                            <goal>native2ascii</goal>

-                        </goals>

-                        <configuration>

-                            <encoding>UTF8</encoding>

-                            <includes>

-                                <include>**/*.properties</include>

-                            </includes>

-                        </configuration>

-                    </execution>

-                </executions>

-            </plugin>

-

-            <!-- Test plugin configuration -->

-            <plugin>

-              <artifactId>maven-dependency-plugin</artifactId>

-              <executions>

-                 <execution>

-                  <id>copy-war</id>

-                  <phase>generate-resources</phase>

-                  <goals>

-                    <goal>copy</goal>

-                  </goals>

-                  <configuration>

-                    <outputDirectory>target/dependency</outputDirectory>

-                    <artifactItems>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-api-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-api-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-authority-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-authority-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-crawler-ui</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-crawler-ui.war</destFileName>

-                      </artifactItem>

-                    </artifactItems>

-                  </configuration>

-                </execution>

-              </executions>

-            </plugin>

-

-            <plugin>

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

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

-              <configuration>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-            </plugin>

-

-            <plugin>

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

-              <artifactId>maven-failsafe-plugin</artifactId>

-              <version>2.18.1</version>

-              <configuration>

-                <skipTests>${skipITs}</skipTests>

-                <systemPropertyVariables>

-                  <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>

-                  <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>

-                  <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>

-                </systemPropertyVariables>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-              <executions>

-                <execution>

-                  <id>integration-test</id>

-                  <goals>

-                    <goal>integration-test</goal>

-                  </goals>

-                </execution>

-                <execution>

-                  <id>verify</id>

-                  <goals>

-                    <goal>verify</goal>

-                  </goals>

-                </execution>

-              </executions>

-            </plugin>

-

-        </plugins>

-    </build>

-

-    <dependencies>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-connector-common</artifactId>

-          <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-pull-agent</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-agents</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-ui-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>commons-lang</groupId>

-            <artifactId>commons-lang</artifactId>

-            <version>${commons-lang.version}</version>

-            <type>jar</type>

-        </dependency>

-        

-        <!-- Testing dependencies -->

-        

-        <dependency>

-          <groupId>junit</groupId>

-          <artifactId>junit</artifactId>

-          <version>${junit.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-core</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-agents</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-pull-agent</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.postgresql</groupId>

-          <artifactId>postgresql</artifactId>

-          <version>${postgresql.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.hsqldb</groupId>

-          <artifactId>hsqldb</artifactId>

-          <version>${hsqldb.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>mysql</groupId>

-          <artifactId>mysql-connector-java</artifactId>

-          <version>${mysql.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-api-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-authority-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-crawler-ui</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-server</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-util</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-webapp</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-servlet</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-http</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-io</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-security</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-continuation</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-xml</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-api-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>    

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>

-        

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-api</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-simple</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-       <dependency>

-            <groupId>com.google.apis</groupId>

-            <artifactId>google-api-services-drive</artifactId>

-            <version>v2-rev136-1.19.0</version>

-        </dependency>

-        <dependency>

-            <groupId>com.google.http-client</groupId>

-            <artifactId>google-http-client</artifactId>

-            <version>${project.http.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>com.google.http-client</groupId>

-            <artifactId>google-http-client-jackson2</artifactId>

-            <version>${project.http.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>com.google.oauth-client</groupId>

-            <artifactId>google-oauth-client</artifactId>

-            <version>${project.oauth.version}</version>

-        </dependency> 

-    </dependencies>

-</project>

diff --git a/connectors/gridfs/.gitignore b/connectors/gridfs/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/gridfs/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/gridfs/build.xml b/connectors/gridfs/build.xml
deleted file mode 100644
index 02941f0..0000000
--- a/connectors/gridfs/build.xml
+++ /dev/null
@@ -1,55 +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.
--->
-
-<project name="gridfs" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="mongo-java-driver*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="mongo-java-driver*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="GridFS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.gridfs.GridFSRepositoryConnector"/>
-        </antcall>
-    </target>
-</project>
diff --git a/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSConstants.java b/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSConstants.java
deleted file mode 100644
index 70576c3..0000000
--- a/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSConstants.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2014 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.gridfs;
-
-/**
- *
- * @author molgun
- */
-public class GridFSConstants {
-
-    /**
-     * MongoDB username parameter to get value from the user interface.
-     */
-    protected static final String USERNAME_PARAM = "username";
-    /**
-     * MongoDB password parameter to get value from the user interface.
-     */
-    protected static final String PASSWORD_PARAM = "password";
-    /**
-     * MongoDB host parameter to get value from the user interface.
-     */
-    protected static final String HOST_PARAM = "host";
-    /**
-     * MongoDB port parameter to get value from the user interface.
-     */
-    protected static final String PORT_PARAM = "port";
-    /**
-     * MongoDB database parameter to get value from the user interface.
-     */
-    protected static final String DB_PARAM = "db";
-    /**
-     * MongoDB bucket parameter to get value from the user interface.
-     */
-    protected static final String BUCKET_PARAM = "bucket";
-    /**
-     * MongoDB url field name parameter to get value from the user interface.
-     */
-    protected static final String URL_RETURN_FIELD_NAME_PARAM = "url";
-    /**
-     * MongoDB acl field name parameter to get value from the user interface.
-     */
-    protected static final String ACL_RETURN_FIELD_NAME_PARAM = "acl";
-    /**
-     * MongoDB denyAcl field name parameter to get value from the user interface.
-     */
-    protected static final String DENY_ACL_RETURN_FIELD_NAME_PARAM = "denyAcl";
-    /**
-     * MongoDB default database name.
-     */
-    protected static final String DEFAULT_DB_NAME = "test";
-    /**
-     * MongoDB default bucket name.
-     */
-    protected static final String DEFAULT_BUCKET_NAME = "fs";
-    /**
-     * MongoDB default files subcollection name.
-     */
-    protected static final String FILES_COLLECTION_NAME = "files";
-    /**
-     * MongoDB md5 field name.
-     */
-    protected static final String MD5_FIELD_NAME = "md5";
-    /**
-     * MongoDB subcollection seperator.
-     */
-    protected static final String COLLECTION_SEPERATOR = ".";
-    /**
-     * MongoDB default unique key field name.
-     */
-    protected static final String DEFAULT_ID_FIELD_NAME = "_id";
-    /**
-     * Job start point node type.
-     */
-    protected static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
-}
diff --git a/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java b/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java
deleted file mode 100644
index afd5488..0000000
--- a/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java
+++ /dev/null
@@ -1,842 +0,0 @@
-/**
- * Copyright 2014 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.gridfs;
-
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-import com.mongodb.DBTCPConnector;
-import com.mongodb.Mongo;
-import com.mongodb.MongoClient;
-import com.mongodb.gridfs.GridFS;
-import com.mongodb.gridfs.GridFSDBFile;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.InputStream;
-import java.net.UnknownHostException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.bson.types.ObjectId;
-
-/**
- *
- * @author molgun
- */
-public class GridFSRepositoryConnector extends BaseRepositoryConnector {
-
-    /**
-     * Activity name for the activity record.
-     */
-    protected static final String ACTIVITY_FETCH = "fetch";
-    /**
-     * Server name for declaring bin name.
-     */
-    protected static final String SERVER = "MongoDB - GridFS";
-    /**
-     * Session expiration milliseconds.
-     */
-    protected static final long SESSION_EXPIRATION_MILLISECONDS = 30000L;
-    /**
-     * Endpoint username.
-     */
-    protected String username = null;
-    /**
-     * Endpoint password.
-     */
-    protected String password = null;
-    /**
-     * Endpoint host.
-     */
-    protected String host = null;
-    /**
-     * Endpoint port.
-     */
-    protected String port = null;
-    /**
-     * Endpoint db.
-     */
-    protected String db = null;
-    /**
-     * Endpoint bucket.
-     */
-    protected String bucket = null;
-    /**
-     * Endpoint url.
-     */
-    protected String url = null;
-    /**
-     * Endpoint acl.
-     */
-    protected String acl = null;
-    /**
-     * Endpoint denyAcl.
-     */
-    protected String denyAcl = null;
-    /**
-     * MongoDB session.
-     */
-    protected DB session = null;
-    /**
-     * Last session fetch time.
-     */
-    protected long lastSessionFetch = -1L;
-
-    /**
-     * Forward to the javascript to check the configuration parameters.
-     */
-    private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-    /**
-     * Forward to the HTML template to view the configuration parameters.
-     */
-    private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-
-    /**
-     * Forward to the HTML template to edit the configuration parameters.
-     */
-    private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_Server.html";
-
-    /**
-     * GridFS server tab name.
-     */
-    private static final String GRIDFS_SERVER_TAB_RESOURCE = "GridFSConnector.Server";
-
-    /**
-     * Tab name parameter for managing the view of the Web UI.
-     */
-    private static final String TAB_NAME_PARAM = "TabName";
-
-    /**
-     * Constructer.
-     */
-    public GridFSRepositoryConnector() {
-        super();
-    }
-
-    /**
-     * Tell the world what model this connector uses for addSeedDocuments().
-     * This must return a model value as specified above. The connector does not
-     * have to be connected for this method to be called.
-     *
-     * @return the model type value.
-     */
-    @Override
-    public String[] getBinNames(String documentIdentifier) {
-        return new String[]{host};
-    }
-
-    /**
-     * Tell the world what model this connector uses for addSeedDocuments().
-     * This must return a model value as specified above. The connector does not
-     * have to be connected for this method to be called.
-     *
-     * @return the model type value.
-     */
-    @Override
-    public int getConnectorModel() {
-        return super.getConnectorModel();
-    }
-
-    /**
-     * Return the list of activities that this connector supports (i.e. writes
-     * into the log). The connector does not have to be connected for this
-     * method to be called.
-     *
-     * @return the list.
-     */
-    @Override
-    public String[] getActivitiesList() {
-        return new String[]{ACTIVITY_FETCH};
-    }
-
-    /**
-     * Connect.
-     *
-     * @param configParams is the set of configuration parameters, which in this
-     * case describe the root directory.
-     */
-    @Override
-    public void connect(ConfigParams configParams) {
-        super.connect(configParams);
-        username = params.getParameter(GridFSConstants.USERNAME_PARAM);
-        password = params.getObfuscatedParameter(GridFSConstants.PASSWORD_PARAM);
-        host = params.getParameter(GridFSConstants.HOST_PARAM);
-        port = params.getParameter(GridFSConstants.PORT_PARAM);
-        db = params.getParameter(GridFSConstants.DB_PARAM);
-        bucket = params.getParameter(GridFSConstants.BUCKET_PARAM);
-        url = params.getParameter(GridFSConstants.URL_RETURN_FIELD_NAME_PARAM);
-        acl = params.getParameter(GridFSConstants.ACL_RETURN_FIELD_NAME_PARAM);
-        denyAcl = params.getParameter(GridFSConstants.DENY_ACL_RETURN_FIELD_NAME_PARAM);
-    }
-
-    /**
-     * Test the connection. Returns a string describing the connection
-     * integrity.
-     *
-     * @return the connection's status as a displayable string.
-     * @throws org.apache.manifoldcf.core.interfaces.ManifoldCFException
-     */
-    @Override
-    public String check() throws ManifoldCFException {
-        try {
-            getSession();
-            if (session != null) {
-                Mongo currentMongoSession = session.getMongo();
-                currentMongoSession.getConnector()
-                        .getDBPortPool(currentMongoSession.getAddress())
-                        .get()
-                        .ensureOpen();
-                session.getMongo().close();
-                session = null;
-                return super.check();
-            }
-            return "Not connected.";
-        } catch (ManifoldCFException e) {
-            return e.getMessage();
-        } catch (IOException ex) {
-            return ex.getMessage();
-        }
-    }
-
-    /**
-     * Close the connection. Call this before discarding this instance of the
-     * repository connector.
-     *
-     * @throws org.apache.manifoldcf.core.interfaces.ManifoldCFException
-     */
-    @Override
-    public void disconnect() throws ManifoldCFException {
-        if (session != null) {
-            try {
-                session.getMongo().close();
-            } catch (Exception e) {
-                Logging.connectors.error("GridFS: Error when trying to disconnect: " + e.getMessage());
-                throw new ManifoldCFException("GridFS: Error when trying to disconnect: " + e.getMessage(), e);
-            }
-            session = null;
-            lastSessionFetch = -1L;
-            username = null;
-            password = null;
-            host = null;
-            port = null;
-            db = null;
-            bucket = null;
-            url = null;
-            acl = null;
-            denyAcl = null;
-        }
-    }
-
-    /**
-     * This method is periodically called for all connectors that are connected
-     * but not in active use.
-     *
-     * @throws org.apache.manifoldcf.core.interfaces.ManifoldCFException
-     */
-    @Override
-    public void poll() throws ManifoldCFException {
-        if (lastSessionFetch == -1L) {
-            return;
-        }
-
-        long currentTime = System.currentTimeMillis();
-        if (currentTime >= lastSessionFetch + SESSION_EXPIRATION_MILLISECONDS) {
-            if (session != null) {
-                session.getMongo().close();
-                session = null;
-            }
-            lastSessionFetch = -1L;
-        }
-    }
-
-    /**
-     * This method is called to assess whether to count this connector instance
-     * should actually be counted as being connected.
-     *
-     * @return true if the connector instance is actually connected.
-     */
-    @Override
-    public boolean isConnected() {
-        if (session == null) {
-            return false;
-        }
-        Mongo currentMongoSession = session.getMongo();
-        DBTCPConnector currentTCPConnection = currentMongoSession.getConnector();
-        return currentTCPConnection.isOpen();
-    }
-
-    /**
-     * Get the maximum number of documents to amalgamate together into one
-     * batch, for this connector.
-     *
-     * @return the maximum number. 0 indicates "unlimited".
-     */
-    @Override
-    public int getMaxDocumentRequest() {
-        return super.getMaxDocumentRequest();
-    }
-
-    /**
-     * Return the list of relationship types that this connector recognizes.
-     *
-     * @return the list.
-     */
-    @Override
-    public String[] getRelationshipTypes() {
-        return super.getRelationshipTypes();
-    }
-
-    /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-    * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-     *
-    * This method can choose to find repository changes that happen only during the specified time interval.
-    * The seeds recorded by this method will be viewed by the framework based on what the
-    * getConnectorModel() method returns.
-     *
-    * It is not a big problem if the connector chooses to create more seeds than are
-    * strictly necessary; it is merely a question of overall work required.
-     *
-    * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-    * For continuous crawling jobs, this method will
-    * be called once, when the job starts, and at various periodic intervals as the job executes.
-     *
-    * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-    * seeding version string may also be set to null on each job run, depending on the connector model returned by
-    * getConnectorModel().
-     *
-    * Note that it is always ok to send MORE documents rather than less to this method.
-    * The connector will be connected before this method can be called.
-    *@param activities is the interface this method should use to perform whatever framework actions are desired.
-    *@param spec is a document specification (that comes from the job).
-    *@param seedTime is the end of the time range of documents to consider, exclusive.
-    *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-    *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-    *@return an updated seeding version string, to be stored with the job.
-     */
-    @Override
-    public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-            String lastSeedVersion, long seedTime, int jobMode)
-            throws ManifoldCFException, ServiceInterruption {
-        getSession();
-        DBCollection fsFiles = session.getCollection(
-                bucket + GridFSConstants.COLLECTION_SEPERATOR + GridFSConstants.FILES_COLLECTION_NAME
-        );
-        DBCursor dnc = fsFiles.find();
-        while (dnc.hasNext()) {
-            DBObject dbo = dnc.next();
-            String _id = dbo.get("_id").toString();
-            activities.addSeedDocument(_id);
-            if (Logging.connectors.isDebugEnabled()) {
-                Logging.connectors.debug("GridFS: Document _id = " + _id + " added to queue");
-            }
-        }
-        return "";
-    }
-
-    /** Process a set of documents.
-    * This is the method that should cause each document to be fetched, processed, and the results either added
-    * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-    * The document specification allows this class to filter what is done based on the job.
-    * The connector will be connected before this method can be called.
-    *@param documentIdentifiers is the set of document identifiers to process.
-    *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-    * passed in above.
-    *@param activities is the interface this method should use to queue up new document references
-    * and ingest documents.
-    *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-    *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-     */
-    @Override
-    public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-            IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-            throws ManifoldCFException, ServiceInterruption {
-
-        for (String documentIdentifier : documentIdentifiers) {
-
-            String versionString;
-            GridFS gfs;
-            GridFSDBFile document;
-
-            getSession();
-            String _id = documentIdentifier;
-            gfs = new GridFS(session, bucket);
-            document = gfs.findOne(new ObjectId(_id));
-            if (document == null) {
-                activities.deleteDocument(documentIdentifier);
-                continue;
-            } else {
-                DBObject metadata = document.getMetaData();
-                versionString = document.getMD5() + "+" + metadata != null
-                        ? Integer.toString(metadata.hashCode())
-                        : StringUtils.EMPTY;
-            }
-
-            if (versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier, versionString)) {
-                long startTime = System.currentTimeMillis();
-                String errorCode = null;
-                String errorDesc = null;
-                String version = versionString;
-                try {
-
-                    if (Logging.connectors.isDebugEnabled()) {
-                        Logging.connectors.debug("GridFS: Processing document _id = " + _id);
-                    }
-
-                    DBObject metadata = document.getMetaData();
-                    if (metadata == null) {
-                        errorCode = "NULLMETADATA";
-                        errorDesc = "Excluded because document had a null Metadata";
-                        Logging.connectors.warn("GridFS: Document " + _id + " has a null metadata - skipping.");
-                        activities.noDocument(_id, version);
-                        continue;
-                    }
-
-                    String urlValue = document.getMetaData().get(this.url) == null
-                            ? StringUtils.EMPTY
-                            : document.getMetaData().get(this.url).toString();
-                    if (!StringUtils.isEmpty(urlValue)) {
-                        boolean validURL;
-                        try {
-                            new java.net.URI(urlValue);
-                            validURL = true;
-                        } catch (java.net.URISyntaxException e) {
-                            validURL = false;
-                        }
-                        if (validURL) {
-                            long fileLenght = document.getLength();
-                            Date createdDate = document.getUploadDate();
-                            String fileName = document.getFilename();
-                            String mimeType = document.getContentType();
-
-                            if (!activities.checkURLIndexable(urlValue)) {
-                                Logging.connectors.warn("GridFS: Document " + _id + " has a URL excluded by the output connector ('" + urlValue + "') - skipping.");
-                                errorCode = activities.EXCLUDED_URL;
-                                errorDesc = "Excluded because of URL (" + urlValue + ")";
-                                activities.noDocument(_id, version);
-                                continue;
-                            }
-
-                            if (!activities.checkLengthIndexable(fileLenght)) {
-                                Logging.connectors.warn("GridFS: Document " + _id + " has a length excluded by the output connector (" + fileLenght + ") - skipping.");
-                                errorCode = activities.EXCLUDED_LENGTH;
-                                errorDesc = "Excluded because of length (" + fileLenght + ")";
-                                activities.noDocument(_id, version);
-                                continue;
-                            }
-
-                            if (!activities.checkMimeTypeIndexable(mimeType)) {
-                                Logging.connectors.warn("GridFS: Document " + _id + " has a mime type excluded by the output connector ('" + mimeType + "') - skipping.");
-                                errorCode = activities.EXCLUDED_MIMETYPE;
-                                errorDesc = "Excluded because of mime type (" + mimeType + ")";
-                                activities.noDocument(_id, version);
-                                continue;
-                            }
-
-                            if (!activities.checkDateIndexable(createdDate)) {
-                                Logging.connectors.warn("GridFS: Document " + _id + " has a date excluded by the output connector (" + createdDate + ") - skipping.");
-                                errorCode = activities.EXCLUDED_DATE;
-                                errorDesc = "Excluded because of date (" + createdDate + ")";
-                                activities.noDocument(_id, version);
-                                continue;
-                            }
-
-                            RepositoryDocument rd = new RepositoryDocument();
-                            rd.setCreatedDate(createdDate);
-                            rd.setModifiedDate(createdDate);
-                            rd.setFileName(fileName);
-                            rd.setMimeType(mimeType);
-                            String[] aclsArray = null;
-                            String[] denyAclsArray = null;
-                            if (acl != null) {
-                                try {
-                                    Object aclObject = document.getMetaData().get(acl);
-                                    if (aclObject != null) {
-                                        List<String> acls = (List<String>) aclObject;
-                                        aclsArray = (String[]) acls.toArray();
-                                    }
-                                } catch (ClassCastException e) {
-                                    // This is bad because security will fail
-                                    Logging.connectors.warn("GridFS: Document " + _id + " metadata ACL field doesn't contain List<String> type.");
-                                    errorCode = "ACLTYPE";
-                                    errorDesc = "Allow ACL field doesn't contain List<String> type.";
-                                    throw new ManifoldCFException("Security decoding error: " + e.getMessage(), e);
-                                }
-                            }
-                            if (denyAcl != null) {
-                                try {
-                                    Object denyAclObject = document.getMetaData().get(denyAcl);
-                                    if (denyAclObject != null) {
-                                        List<String> denyAcls = (List<String>) denyAclObject;
-                                        denyAcls.add(GLOBAL_DENY_TOKEN);
-                                        denyAclsArray = (String[]) denyAcls.toArray();
-                                    }
-                                } catch (ClassCastException e) {
-                                    // This is bad because security will fail
-                                    Logging.connectors.warn("GridFS: Document " + _id + " metadata DenyACL field doesn't contain List<String> type.");
-                                    errorCode = "ACLTYPE";
-                                    errorDesc = "Deny ACL field doesn't contain List<String> type.";
-                                    throw new ManifoldCFException("Security decoding error: " + e.getMessage(), e);
-                                }
-                            }
-                            rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT, aclsArray, denyAclsArray);
-
-                            InputStream is = document.getInputStream();
-                            try {
-                                rd.setBinary(is, fileLenght);
-                                try {
-                                    activities.ingestDocumentWithException(_id, version, urlValue, rd);
-                                } catch (IOException e) {
-                                    handleIOException(e);
-                                }
-                            } finally {
-                                try {
-                                    is.close();
-                                } catch (IOException e) {
-                                    handleIOException(e);
-                                }
-                            }
-                            gfs.getDB().getMongo().close();
-                            session = null;
-                            errorCode = "OK";
-                        } else {
-                            Logging.connectors.warn("GridFS: Document " + _id + " has a invalid URL: " + urlValue + " - skipping.");
-                            errorCode = activities.BAD_URL;
-                            errorDesc = "Excluded because document had illegal URL ('" + urlValue + "')";
-                            activities.noDocument(_id, version);
-                        }
-                    } else {
-                        Logging.connectors.warn("GridFS: Document " + _id + " has a null URL - skipping.");
-                        errorCode = activities.NULL_URL;
-                        errorDesc = "Excluded because document had a null URL.";
-                        activities.noDocument(_id, version);
-                    }
-                } finally {
-                    if (errorCode != null) {
-                        activities.recordActivity(startTime, ACTIVITY_FETCH, document.getLength(), _id, errorCode, errorDesc, null);
-                    }
-                }
-            }
-        }
-    }
-
-    protected static void handleIOException(IOException e) throws ManifoldCFException, ServiceInterruption {
-        if (e instanceof InterruptedIOException) {
-            throw new ManifoldCFException(e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-        } else {
-            throw new ManifoldCFException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Output the configuration header section. This method is called in the
-     * head section of the connector's configuration page. Its purpose is to add
-     * the required tabs to the list, and to output any javascript methods that
-     * might be needed by the configuration editing HTML. The connector does not
-     * need to be connected for this method to be called.
-     *
-     * @param threadContext is the local thread context.
-     * @param out is the output to which any HTML should be sent.
-     * @param parameters are the configuration parameters, as they currently
-     * exist, for this connection being configured.
-     * @param tabsArray is an array of tab names. Add to this array any tab
-     * names that are specific to the connector.
-     * @throws org.apache.manifoldcf.core.interfaces.ManifoldCFException
-     * @throws java.io.IOException
-     */
-    @Override
-    public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException {
-        tabsArray.add(Messages.getString(locale, GRIDFS_SERVER_TAB_RESOURCE));
-        Map<String, String> paramMap = new HashMap<String, String>();
-
-        fillInServerParameters(paramMap, out, parameters);
-
-        Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER_FORWARD, paramMap, true);
-    }
-
-    /**
-     * Output the configuration body section. This method is called in the body
-     * section of the connector's configuration page. Its purpose is to present
-     * the required form elements for editing. The coder can presume that the
-     * HTML that is output from this configuration will be within appropriate
-     * <html>, <body>, and <form> tags. The name of the form is always
-     * "editconnection". The connector does not need to be connected for this
-     * method to be called.
-     *
-     * @param threadContext is the local thread context.
-     * @param out is the output to which any HTML should be sent.
-     * @param parameters are the configuration parameters, as they currently
-     * exist, for this connection being configured.
-     * @param tabName is the current tab name.
-     */
-    @Override
-    public void outputConfigurationBody(IThreadContext threadContext,
-            IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName) throws ManifoldCFException, IOException {
-
-        Map<String, String> paramMap = new HashMap<String, String>();
-        paramMap.put(TAB_NAME_PARAM, tabName);
-
-        fillInServerParameters(paramMap, out, parameters);
-
-        Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_FORWARD_SERVER, paramMap, true);
-    }
-
-    /**
-     * Process a configuration post. This method is called at the start of the
-     * connector's configuration page, whenever there is a possibility that form
-     * data for a connection has been posted. Its purpose is to gather form
-     * information and modify the configuration parameters accordingly. The name
-     * of the posted form is always "editconnection". The connector does not
-     * need to be connected for this method to be called.
-     *
-     * @param threadContext is the local thread context.
-     * @param variableContext is the set of variables available from the post,
-     * including binary file post information.
-     * @param parameters are the configuration parameters, as they currently
-     * exist, for this connection being configured.
-     * @return null if all is well, or a string error message if there is an
-     * error that should prevent saving of the connection (and cause a
-     * redirection to an error page).
-     */
-    @Override
-    public String processConfigurationPost(IThreadContext threadContext,
-            IPostParameters variableContext, Locale locale, ConfigParams parameters)
-            throws ManifoldCFException {
-
-        String username = variableContext.getParameter(GridFSConstants.USERNAME_PARAM);
-        if (username != null) {
-            parameters.setParameter(GridFSConstants.USERNAME_PARAM, username);
-        }
-
-        String password = variableContext.getParameter(GridFSConstants.PASSWORD_PARAM);
-        if (password != null) {
-            parameters.setObfuscatedParameter(GridFSConstants.PASSWORD_PARAM, variableContext.mapKeyToPassword(password));
-        }
-
-        String db = variableContext.getParameter(GridFSConstants.DB_PARAM);
-        if (db != null) {
-            parameters.setParameter(GridFSConstants.DB_PARAM, db);
-        }
-
-        String bucket = variableContext.getParameter(GridFSConstants.BUCKET_PARAM);
-        if (bucket != null) {
-            parameters.setParameter(GridFSConstants.BUCKET_PARAM, bucket);
-        }
-
-        String port = variableContext.getParameter(GridFSConstants.PORT_PARAM);
-        if (port != null) {
-            parameters.setParameter(GridFSConstants.PORT_PARAM, port);
-        }
-
-        String host = variableContext.getParameter(GridFSConstants.HOST_PARAM);
-        if (host != null) {
-            parameters.setParameter(GridFSConstants.HOST_PARAM, host);
-        }
-
-        String url = variableContext.getParameter(GridFSConstants.URL_RETURN_FIELD_NAME_PARAM);
-        if (url != null) {
-            parameters.setParameter(GridFSConstants.URL_RETURN_FIELD_NAME_PARAM, url);
-        }
-
-        String acl = variableContext.getParameter(GridFSConstants.ACL_RETURN_FIELD_NAME_PARAM);
-        if (acl != null) {
-            parameters.setParameter(GridFSConstants.ACL_RETURN_FIELD_NAME_PARAM, acl);
-        }
-
-        String denyAcl = variableContext.getParameter(GridFSConstants.DENY_ACL_RETURN_FIELD_NAME_PARAM);
-        if (denyAcl != null) {
-            parameters.setParameter(GridFSConstants.DENY_ACL_RETURN_FIELD_NAME_PARAM, denyAcl);
-        }
-
-        return null;
-    }
-
-    /**
-     * View configuration. This method is called in the body section of the
-     * connector's view configuration page. Its purpose is to present the
-     * connection information to the user. The coder can presume that the HTML
-     * that is output from this configuration will be within appropriate <html>
-     * and <body> tags. The connector does not need to be connected for this
-     * method to be called.
-     *
-     * @param threadContext is the local thread context.
-     * @param out is the output to which any HTML should be sent.
-     * @param parameters are the configuration parameters, as they currently
-     * exist, for this connection being configured.
-     */
-    @Override
-    public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-        Map<String, String> paramMap = new HashMap<String, String>();
-
-        fillInServerParameters(paramMap, out, parameters);
-
-        Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD, paramMap, true);
-    }
-
-    /**
-     * Setup a session.
-     *
-     * @throws ManifoldCFException
-     */
-    protected void getSession() throws ManifoldCFException {
-        if (session == null) {
-
-            if (StringUtils.isEmpty(db) || StringUtils.isEmpty(bucket)) {
-                throw new ManifoldCFException("GridFS: Database or bucket name cannot be empty.");
-            }
-
-            if (StringUtils.isEmpty(url)) {
-                throw new ManifoldCFException("GridFS: Metadata URL field cannot be empty.");
-            }
-
-            if (StringUtils.isEmpty(host) && StringUtils.isEmpty(port)) {
-                try {
-                    session = new MongoClient().getDB(db);
-                } catch (UnknownHostException ex) {
-                    throw new ManifoldCFException("GridFS: Default host is not found. Does mongod process run?" + ex.getMessage(), ex);
-                }
-            } else if (!StringUtils.isEmpty(host) && StringUtils.isEmpty(port)) {
-                try {
-                    session = new MongoClient(host).getDB(db);
-                } catch (UnknownHostException ex) {
-                    throw new ManifoldCFException("GridFS: Given host information is not valid or mongod process doesn't run" + ex.getMessage(), ex);
-                }
-            } else if (!StringUtils.isEmpty(host) && !StringUtils.isEmpty(port)) {
-                try {
-                    int integerPort = Integer.parseInt(port);
-                    session = new MongoClient(host, integerPort).getDB(db);
-                } catch (UnknownHostException ex) {
-                    throw new ManifoldCFException("GridFS: Given information is not valid or mongod process doesn't run" + ex.getMessage(), ex);
-                } catch (NumberFormatException ex) {
-                    throw new ManifoldCFException("GridFS: Given port is not valid number. " + ex.getMessage(), ex);
-                }
-            } else if (StringUtils.isEmpty(host) && !StringUtils.isEmpty(port)) {
-                try {
-                    int integerPort = Integer.parseInt(port);
-                    session = new MongoClient(host, integerPort).getDB(db);
-                } catch (UnknownHostException ex) {
-                    throw new ManifoldCFException("GridFS: Given information is not valid or mongod process doesn't run" + ex.getMessage(), ex);
-                } catch (NumberFormatException ex) {
-                    throw new ManifoldCFException("GridFS: Given port is not valid number. " + ex.getMessage(), ex);
-                }
-            }
-
-            if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
-                boolean auth = session.authenticate(username, password.toCharArray());
-                if (!auth) {
-                    throw new ManifoldCFException("GridFS: Given database username and password doesn't match.");
-                }
-            }
-            lastSessionFetch = System.currentTimeMillis();
-        }
-    }
-
-    /**
-     * Fill in a Server tab configuration parameter map for calling a Velocity
-     * template.
-     *
-     * @param paramMap is the map to fill in
-     * @param parameters is the current set of configuration parameters
-     */
-    public void fillInServerParameters(Map<String, String> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-        String usernameParam = parameters.getParameter(GridFSConstants.USERNAME_PARAM);
-        paramMap.put(GridFSConstants.USERNAME_PARAM, usernameParam);
-
-        String passwordParam = parameters.getObfuscatedParameter(GridFSConstants.PASSWORD_PARAM);
-        if (passwordParam == null) {
-          passwordParam = StringUtils.EMPTY;
-        } else {
-          passwordParam = mapper.mapPasswordToKey(passwordParam);
-        }
-        paramMap.put(GridFSConstants.PASSWORD_PARAM, passwordParam);
-
-        String dbParam = parameters.getParameter(GridFSConstants.DB_PARAM);
-        if (StringUtils.isEmpty(dbParam)) {
-            dbParam = GridFSConstants.DEFAULT_DB_NAME;
-        }
-        paramMap.put(GridFSConstants.DB_PARAM, dbParam);
-        String bucketParam = parameters.getParameter(GridFSConstants.BUCKET_PARAM);
-        if (StringUtils.isEmpty(bucketParam)) {
-            bucketParam = GridFSConstants.DEFAULT_BUCKET_NAME;
-        }
-        paramMap.put(GridFSConstants.BUCKET_PARAM, bucketParam);
-        String hostParam = parameters.getParameter(GridFSConstants.HOST_PARAM);
-        paramMap.put(GridFSConstants.HOST_PARAM, hostParam);
-        String portParam = parameters.getParameter(GridFSConstants.PORT_PARAM);
-        paramMap.put(GridFSConstants.PORT_PARAM, portParam);
-        String urlParam = parameters.getParameter(GridFSConstants.URL_RETURN_FIELD_NAME_PARAM);
-        paramMap.put(GridFSConstants.URL_RETURN_FIELD_NAME_PARAM, urlParam);
-        String aclParam = parameters.getParameter(GridFSConstants.ACL_RETURN_FIELD_NAME_PARAM);
-        paramMap.put(GridFSConstants.ACL_RETURN_FIELD_NAME_PARAM, aclParam);
-        String denyAclParam = parameters.getParameter(GridFSConstants.DENY_ACL_RETURN_FIELD_NAME_PARAM);
-        paramMap.put(GridFSConstants.DENY_ACL_RETURN_FIELD_NAME_PARAM, denyAclParam);
-    }
-
-    /**
-     * Special column names, as far as document queries are concerned
-     */
-    protected static HashMap documentKnownColumns;
-
-    static {
-        documentKnownColumns = new HashMap();
-        documentKnownColumns.put(GridFSConstants.DEFAULT_ID_FIELD_NAME, "");
-        documentKnownColumns.put(GridFSConstants.URL_RETURN_FIELD_NAME_PARAM, "");
-    }
-
-    /**
-     * Apply metadata to a repository document.
-     *
-     * @param rd is the repository document to apply the metadata to.
-     * @param metadataMap is the resultset row to use to get the metadata. All
-     * non-special columns from this row will be considered to be metadata.
-     */
-    protected void applyMetadata(RepositoryDocument rd, DBObject metadataMap)
-            throws ManifoldCFException {
-        // Cycle through the document's fields
-        Iterator iter = metadataMap.keySet().iterator();
-        while (iter.hasNext()) {
-            String fieldName = (String) iter.next();
-            if (documentKnownColumns.get(fieldName) == null) {
-                // Consider this field to contain metadata.
-                // We can only accept non-binary metadata at this time.
-                Object metadata = metadataMap.get(fieldName);
-                if (!(metadata instanceof String)) {
-                    throw new ManifoldCFException("Metadata field '" + fieldName + "' must be convertible to a string.");
-                }
-                rd.addField(fieldName, metadata.toString());
-            }
-        }
-    }
-}
diff --git a/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/Messages.java b/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/Messages.java
deleted file mode 100644
index 5cf4976..0000000
--- a/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/Messages.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2014 The Apache Software Foundation.
- *
- * Licensed 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 org.apache.manifoldcf.crawler.connectors.gridfs;
-
-import java.util.Locale;
-import java.util.Map;
-import static org.apache.manifoldcf.core.i18n.Messages.getString;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import static org.apache.manifoldcf.ui.i18n.Messages.getAttributeJavascriptString;
-import static org.apache.manifoldcf.ui.i18n.Messages.getAttributeString;
-import static org.apache.manifoldcf.ui.i18n.Messages.getBodyJavascriptString;
-import static org.apache.manifoldcf.ui.i18n.Messages.getBodyString;
-import static org.apache.manifoldcf.ui.i18n.Messages.outputResource;
-import static org.apache.manifoldcf.ui.i18n.Messages.outputResourceWithVelocity;
-
-/**
- *
- * @author molgun
- */
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-
-    public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.crawler.connectors.gridfs.common";
-    public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.gridfs";
-
-    /**
-     * Constructor - do no instantiate
-     */
-    protected Messages() {
-    }
-
-    public static String getString(Locale locale, String messageKey) {
-        return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-    }
-
-    public static String getAttributeString(Locale locale, String messageKey) {
-        return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-    }
-
-    public static String getBodyString(Locale locale, String messageKey) {
-        return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-    }
-
-    public static String getAttributeJavascriptString(Locale locale, String messageKey) {
-        return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-    }
-
-    public static String getBodyJavascriptString(Locale locale, String messageKey) {
-        return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-    }
-
-    public static String getString(Locale locale, String messageKey, Object[] args) {
-        return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-    }
-
-    public static String getAttributeString(Locale locale, String messageKey, Object[] args) {
-        return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-    }
-
-    public static String getBodyString(Locale locale, String messageKey, Object[] args) {
-        return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-    }
-
-    public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {
-        return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-    }
-
-    public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {
-        return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-    }
-
-    // More general methods which allow bundlenames and class loaders to be specified.
-    public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {
-        return getString(Messages.class, bundleName, locale, messageKey, args);
-    }
-
-    public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {
-        return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-    }
-
-    public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {
-        return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-    }
-
-    public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-        return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-    }
-
-    public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-        return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-    }
-
-    // Resource output
-    public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-            Map<String, String> substitutionParameters, boolean mapToUpperCase)
-            throws ManifoldCFException {
-        outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey,
-                substitutionParameters, mapToUpperCase);
-    }
-
-    public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-            Map<String, String> substitutionParameters, boolean mapToUpperCase)
-            throws ManifoldCFException {
-        outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-                substitutionParameters, mapToUpperCase);
-    }
-
-    public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-            Map<String, Object> contextObjects)
-            throws ManifoldCFException {
-        outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-                contextObjects);
-    }
-}
diff --git a/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_en_US.properties b/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_en_US.properties
deleted file mode 100644
index 78f7525..0000000
--- a/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_en_US.properties
+++ /dev/null
@@ -1,48 +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.
-
-# Fill in this file with English words and phrases
-
-GridFSConnector.Server=Server
-GridFSConnector.CredentialsColon=Credentials:
-
-GridFSConnector.ParametersColon=Parameters:
-GridFSConnector.Credentials=Credentials
-
-GridFSConnector.UserNameColon=Username:
-GridFSConnector.PasswordColon=Password:
-GridFSConnector.HostColon=Host:
-GridFSConnector.PortColon=Port:
-GridFSConnector.DBColon=Database:
-GridFSConnector.BucketColon=Bucket:
-GridFSConnector.URLColon=Metadata URL field:
-GridFSConnector.ACLColon=Metadata ACL field:
-GridFSConnector.DenyACLColon=Metadata denied ACL field:
-
-GridFSConnector.UserNameEquals=username=
-GridFSConnector.PasswordEquals=password=
-GridFSConnector.HostEquals=host=
-GridFSConnector.PortEquals=port=
-GridFSConnector.DBEquals=database=
-GridFSConnector.BucketEquals=bucket=
-GridFSConnector.URLEquals=url=
-GridFSConnector.ACLEquals=acl=
-GridFSConnector.DenyACLEquals=denyACL=
-
-GridFSConnector.DatabaseNameMustNotBeNull=Database name must not be null
-GridFSConnector.BucketNameMustNotBeNull=Bucket name must not be null
-GridFSConnector.URLMetadataFieldNameMustNotBeNull=URL metadata field name must not be null
-GridFSConnector.PortValueMustBeAValidNumber=Port value must be a valid number
-
diff --git a/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_es_ES.properties b/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_es_ES.properties
deleted file mode 100644
index 035d699..0000000
--- a/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_es_ES.properties
+++ /dev/null
@@ -1,49 +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.
-
-# Fill in this file with English words and phrases
-
-GridFSConnector.Server=Servidor
-GridFSConnector.CredentialsColon=Credenciales:
-
-GridFSConnector.ParametersColon=Paràmetros:
-GridFSConnector.Credentials=Credenciales
-
-GridFSConnector.UserNameColon=Nombre de usuario:
-GridFSConnector.PasswordColon=Contraseña:
-GridFSConnector.HostColon=Host:
-GridFSConnector.PortColon=Puerto:
-GridFSConnector.DBColon=Base de datos:
-GridFSConnector.BucketColon=Cubo:
-GridFSConnector.URLColon=Metadatos URL campo:
-GridFSConnector.ACLColon=Metadatos ACL campo:
-GridFSConnector.DenyACLColon=Metadatos negado ACL campo:
-
-GridFSConnector.UserNameEquals=nombre de usuario=
-GridFSConnector.PasswordEquals=Contraseña=
-GridFSConnector.HostEquals=host=
-GridFSConnector.PortEquals=puerto=
-GridFSConnector.DBEquals=Base de datos=
-GridFSConnector.BucketEquals=Cubo=
-GridFSConnector.URLEquals=url=
-GridFSConnector.ACLEquals=acl=
-GridFSConnector.DenyACLEquals=negarACL=
-
-GridFSConnector.DatabaseNameMustNotBeNull=Nombre de la base no debe ser nulo
-GridFSConnector.BucketNameMustNotBeNull=Nombre del Cubo no debe ser nulo
-GridFSConnector.URLMetadataFieldNameMustNotBeNull=URL metadatos nombre del campo no debe ser nulo
-GridFSConnector.PortValueMustBeAValidNumber=Valor del puerto debe ser un número válido
-
diff --git a/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_ja_JP.properties b/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_ja_JP.properties
deleted file mode 100644
index 3818c9b..0000000
--- a/connectors/gridfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/gridfs/common_ja_JP.properties
+++ /dev/null
@@ -1,44 +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.
-
-# Fill in this file with Japanese words and phrases
-
-GridFSConnector.Server=Server
-GridFSConnector.CredentialsColon=Credentials
-
-GridFSConnector.ParametersColon=Parameters:
-GridFSConnector.CredentialsColon=Credentials:
-
-GridFSConnector.UserNameColon=Username:
-GridFSConnector.PasswordColon=Password:
-GridFSConnector.HostColon=Host:
-GridFSConnector.PortColon=Port:
-GridFSConnector.DBColon=Database:
-GridFSConnector.BucketColon=Bucket:
-GridFSConnector.URLColon=Metadata URL field:
-
-GridFSConnector.UserNameEquals=username=
-GridFSConnector.PasswordEquals=password=
-GridFSConnector.HostEquals=host=
-GridFSConnector.PortEquals=port=
-GridFSConnector.DBEquals=database=
-GridFSConnector.BucketEquals=bucket=
-GridFSConnector.URLEquals=url=
-
-GridFSConnector.DatabaseNameMustNotBeNull=Database name must not be null
-GridFSConnector.BucketNameMustNotBeNull=Bucket name must not be null
-GridFSConnector.URLMetadataFieldNameMustNotBeNull=URL metadata field name must not be null
-GridFSConnector.PortValueMustBeAValidNumber=Port value must be a valid number
-
diff --git a/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/editConfiguration.js b/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/editConfiguration.js
deleted file mode 100644
index 197e586..0000000
--- a/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/editConfiguration.js
+++ /dev/null
@@ -1,53 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  return true;
-}
-
-function checkConfigForSave()
-{
-
-  if (editconnection.url.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GridFSConnector.URLMetadataFieldNameMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GridFSConnector.Server'))");
-    editconnection.socketTimeout.focus();
-    return false;
-  } 
-  
-  if(editconnection.port.value !== "") 
-  {
-    if (!isInteger(editconnection.port.value))
-    {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GridFSConnector.PortValueMustBeAValidNumber'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GridFSConnector.Server'))");
-        editconnection.socketTimeout.focus();
-        return false;
-    }
-  }
-  
-  
-  return true;
-}
-// -->
-</script>
-
-
diff --git a/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/editConfiguration_Server.html b/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/editConfiguration_Server.html
deleted file mode 100644
index 384f31b..0000000
--- a/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/editConfiguration_Server.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright 2014 The Apache Software Foundation.
-
-Licensed 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.
--->
-#if($TABNAME == $ResourceBundle.getString('GridFSConnector.Server'))
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2">
-      <hr />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.UserNameColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input id="username" type="text" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.PasswordColon'))
-      </nobr>
-    </td>
-    <td class="value">
-      <input id="password" type="password" name="password" value="$Encoder.attributeEscape($PASSWORD)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.HostColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="host" name="host" type="text" size="32" value="$Encoder.attributeEscape($HOST)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.PortColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="port" name="port" type="text" size="5" value="$Encoder.attributeEscape($PORT)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.DBColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="db" name="db" type="text" size="32" value="$Encoder.attributeEscape($DB)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.BucketColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="bucket" name="bucket" type="text" size="32" value="$Encoder.attributeEscape($BUCKET)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.URLColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="url" name="url" type="text" size="10" value="$Encoder.attributeEscape($URL)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.ACLColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="acl" name="acl" type="text" size="10" value="$Encoder.attributeEscape($ACL)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.DenyACLColon'))
-      </nobr>
-    </td>
-    <td class="value">
-        <input id="denyAcl" name="denyAcl" type="text" size="10" value="$Encoder.attributeEscape($DENYACL)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-<input type="hidden" name="password" value="$Encoder.attributeEscape($PASSWORD)" />
-<input type="hidden" name="host" value="$Encoder.attributeEscape($HOST)" />
-<input type="hidden" name="port" value="$Encoder.attributeEscape($PORT)" />
-<input type="hidden" name="db" value="$Encoder.attributeEscape($DB)" />
-<input type="hidden" name="bucket" value="$Encoder.attributeEscape($BUCKET)" />
-<input type="hidden" name="url" value="$Encoder.attributeEscape($URL)" />
-
-#end
diff --git a/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/viewConfiguration.html b/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/viewConfiguration.html
deleted file mode 100644
index 9ae0447..0000000
--- a/connectors/gridfs/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/gridfs/viewConfiguration.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright 2014 The Apache Software Foundation.
-
-Licensed 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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description" colspan="1">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.ParametersColon'))
-      </nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.UserNameEquals'))$Encoder.bodyEscape($USERNAME)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.PasswordEquals'))********
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.URLEquals'))$Encoder.bodyEscape($URL)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.HostEquals'))$Encoder.bodyEscape($HOST)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.PortEquals'))$Encoder.bodyEscape($PORT)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.DBEquals'))$Encoder.bodyEscape($DB)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.BucketEquals'))$Encoder.bodyEscape($BUCKET)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.ACLEquals'))$Encoder.bodyEscape($ACL)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GridFSConnector.DenyACLEquals'))$Encoder.bodyEscape($DENYACL)
-      </nobr>
-      <br />
-    </td>
-  </tr>
-</table>
diff --git a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BaseHSQLDB.java b/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BaseHSQLDB.java
deleted file mode 100644
index cae9710..0000000
--- a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,44 +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 org.apache.manifoldcf.crawler.connectors.gridfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"GridFS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.gridfs.GridFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BaseMySQL.java b/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BaseMySQL.java
deleted file mode 100644
index d2a0945..0000000
--- a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BaseMySQL.java
+++ /dev/null
@@ -1,44 +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 org.apache.manifoldcf.crawler.connectors.gridfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.crawler.tests.ConnectorBaseMySQL
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"GridFS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.gridfs.GridFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BasePostgresql.java b/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BasePostgresql.java
deleted file mode 100644
index 2dbfda5..0000000
--- a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/BasePostgresql.java
+++ /dev/null
@@ -1,44 +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 org.apache.manifoldcf.crawler.connectors.gridfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"GridFS"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.gridfs.GridFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityHSQLDBTest.java b/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityHSQLDBTest.java
deleted file mode 100644
index 53f11cf..0000000
--- a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,42 +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 org.apache.manifoldcf.crawler.connectors.gridfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityMySQLTest.java b/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityMySQLTest.java
deleted file mode 100644
index 54be211..0000000
--- a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityMySQLTest.java
+++ /dev/null
@@ -1,42 +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 org.apache.manifoldcf.crawler.connectors.gridfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityPostgresqlTest.java b/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityPostgresqlTest.java
deleted file mode 100644
index f37611c..0000000
--- a/connectors/gridfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/gridfs/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,42 +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 org.apache.manifoldcf.crawler.connectors.gridfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/gridfs/pom.xml b/connectors/gridfs/pom.xml
deleted file mode 100644
index 7d42de1..0000000
--- a/connectors/gridfs/pom.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.manifoldcf</groupId>
-        <artifactId>mcf-connectors</artifactId>
-        <version>2.10-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>mcf-gridfs-connector</artifactId>
-    <name>ManifoldCF - Connectors - GridFS</name>
-    <build>
-        <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-        <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-        <resources>
-            <resource>
-                <directory>${basedir}/connector/src/main/resources</directory>
-                <includes>
-                    <include>**/*.html</include>
-                    <include>**/*.js</include>
-                </includes>
-            </resource>
-            <resource>
-                <directory>${basedir}/connector/src/main/native2ascii</directory>
-                <includes>
-                    <include>**/*.properties</include>
-                </includes>
-            </resource>
-        </resources> 
-
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>**/*Postgresql*.java</exclude>
-                        <exclude>**/*MySQL*.java</exclude>
-                    </excludes>
-                    <forkCount>1</forkCount>
-                    <reuseForks>false</reuseForks>
-                    <workingDirectory>target/test-output</workingDirectory>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>${project.groupId}</groupId>
-          <artifactId>mcf-connector-common</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-agents</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-pull-agent</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-ui-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>${junit.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-core</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-agents</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>mcf-pull-agent</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>${postgresql.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hsqldb</groupId>
-            <artifactId>hsqldb</artifactId>
-            <version>${hsqldb.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>${mysql.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mongodb</groupId>
-            <artifactId>mongo-java-driver</artifactId>
-            <version>2.11.3</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/connectors/gts/.gitignore b/connectors/gts/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/gts/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/gts/build.xml b/connectors/gts/build.xml
deleted file mode 100644
index 4628173..0000000
--- a/connectors/gts/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="gts" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="MetaCarta GTS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.gts.GTSConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConfig.java b/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConfig.java
deleted file mode 100644
index 0f30cbc..0000000
--- a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConfig.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id: GTSConfig.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.gts;
-
-
-/** Parameters and output data for MetaCarta GTS output connector.
-*/
-public class GTSConfig
-{
-  public static final String _rcsid = "@(#)$Id: GTSConfig.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Configuration parameters
-
-  /** Ingest URI */
-  public static final String PARAM_INGESTURI = "Ingestion URI";
-  /** Optional realm */
-  public static final String PARAM_REALM = "Realm";
-  /** Optional user ID */
-  public static final String PARAM_USERID = "User ID";
-  /** Optional user password */
-  public static final String PARAM_PASSWORD = "Password";
-
-  // Output specification
-
-  /** Collection node */
-  public static final String NODE_COLLECTION = "collection";
-  /** Document template node */
-  public static final String NODE_DOCUMENTTEMPLATE = "documenttemplate";
-  /** Name attribute */
-  public static final String ATTRIBUTE_VALUE = "value";
-
-}
diff --git a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java b/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java
deleted file mode 100644
index 703cc90..0000000
--- a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java
+++ /dev/null
@@ -1,1108 +0,0 @@
-/* $Id: GTSConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.gts;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.Logging;
-
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-// POIFS stuff
-import org.apache.poi.poifs.eventfilesystem.POIFSReader;
-import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener;
-import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent;
-import org.apache.poi.poifs.filesystem.POIFSDocumentPath;
-import org.apache.poi.hpsf.SummaryInformation;
-import org.apache.poi.hpsf.PropertySetFactory;
-import org.apache.poi.hpsf.PropertySet;
-import org.apache.poi.hpsf.NoPropertySetStreamException;
-import org.apache.poi.hpsf.MarkUnsupportedException;
-import org.apache.poi.hpsf.UnexpectedPropertySetTypeException;
-
-import java.util.*;
-import java.io.*;
-
-/** This is the output connector for the MetaCarta appliance.  It establishes a notion of
-* collection(s) a document is ingested into, as well as the idea of a document template for the
-* output.
-*/
-public class GTSConnector extends org.apache.manifoldcf.agents.output.BaseOutputConnector
-{
-  public static final String _rcsid = "@(#)$Id: GTSConnector.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Activities we log
-
-  /** Ingestion activity */
-  public final static String INGEST_ACTIVITY = "document ingest";
-  /** Document removal activity */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-
-  // These are the document types the fingerprinter understands
-  protected static final int DT_UNKNOWN = -1;
-  protected static final int DT_COMPOUND_DOC = 0;
-  protected static final int DT_MSWORD = 1;
-  protected static final int DT_MSEXCEL = 2;
-  protected static final int DT_MSPOWERPOINT = 3;
-  protected static final int DT_MSOUTLOOK = 4;
-  protected static final int DT_TEXT = 5;
-  protected static final int DT_ZERO = 6;
-  protected static final int DT_PDF = 7;
-
-  /** Local data */
-  protected HttpPoster poster = null;
-
-  /** Constructor.
-  */
-  public GTSConnector()
-  {
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{INGEST_ACTIVITY,REMOVE_ACTIVITY};
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-  * out of the ini file.)
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-  }
-
-  /** Close the connection.  Call this before discarding the connection.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    poster = null;
-    super.disconnect();
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (poster == null)
-    {
-      String ingestURI = params.getParameter(GTSConfig.PARAM_INGESTURI);
-      if (ingestURI == null)
-        throw new ManifoldCFException("Missing parameter '"+GTSConfig.PARAM_INGESTURI+"'");
-      String userID = params.getParameter(GTSConfig.PARAM_USERID);
-      String password = params.getObfuscatedParameter(GTSConfig.PARAM_PASSWORD);
-      String realm = params.getParameter(GTSConfig.PARAM_REALM);
-      poster = new HttpPoster(currentContext,realm,userID,password,ingestURI);
-    }
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      getSession();
-      poster.checkPost();
-      return super.check();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Transient error: "+e.getMessage();
-    }
-  }
-
-  protected static final String[] ingestableMimeTypeArray = new String[]
-  {
-    "application/excel",
-      "application/powerpoint",
-      "application/ppt",
-      "application/rtf",
-      "application/xls",
-      "text/html",
-      "text/rtf",
-      "text/pdf",
-      "application/x-excel",
-      "application/x-msexcel",
-      "application/x-mspowerpoint",
-      "application/x-msword-doc",
-      "application/x-msword",
-      "application/x-word",
-      "Application/pdf",
-      "text/xml",
-      "no-type",
-      "text/plain",
-      "application/pdf",
-      "application/x-rtf",
-      "application/vnd.ms-excel",
-      "application/vnd.ms-pps",
-      "application/vnd.ms-powerpoint",
-      "application/vnd.ms-word",
-      "application/msword",
-      "application/msexcel",
-      "application/mspowerpoint",
-      "application/ms-powerpoint",
-      "application/ms-word",
-      "application/ms-excel",
-      "Adobe",
-      "application/Vnd.Ms-Excel",
-      "vnd.ms-powerpoint",
-      "application/x-pdf",
-      "winword",
-      "text/richtext",
-      "Text",
-      "Text/html",
-      "application/MSWORD",
-      "application/PDF",
-      "application/MSEXCEL",
-      "application/MSPOWERPOINT"
-  };
-
-  protected static final Map ingestableMimeTypeMap = new HashMap();
-  static
-  {
-    int i = 0;
-    while (i < ingestableMimeTypeArray.length)
-    {
-      String type = ingestableMimeTypeArray[i++];
-      ingestableMimeTypeMap.put(type,type);
-    }
-  }
-
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext outputDescription, String mimeType, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return (ingestableMimeTypeMap.get(mimeType) != null);
-  }
-
-  /** Pre-determine whether a document (passed here as a File object) is indexable by this connector.  This method is used by participating
-  * repository connectors to help reduce the number of unmanageable documents that are passed to this output connector in advance of an
-  * actual transfer.  This hook is provided mainly to support search engines that only handle a small set of accepted file types.
-  *@param localFile is the local file to check.
-  *@return true if the file is indexable.
-  */
-  @Override
-  public boolean checkDocumentIndexable(VersionContext outputDescription, File localFile, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int docType = fingerprint(localFile);
-    return (docType == DT_TEXT ||
-      docType == DT_MSWORD ||
-      docType == DT_MSEXCEL ||
-      docType == DT_PDF ||
-      docType == DT_MSPOWERPOINT);
-  }
-
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param spec is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    List<String> collectionList = new ArrayList<String>();
-    String documentTemplate = "";
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(GTSConfig.NODE_COLLECTION))
-      {
-        collectionList.add(sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE));
-      }
-      else if (sn.getType().equals(GTSConfig.NODE_DOCUMENTTEMPLATE))
-      {
-        documentTemplate = sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE);
-      }
-    }
-
-    // Get the config info too.  This will be constant for any given connector instance, so we don't have to worry about it changing
-    // out from under us.
-    String ingestURI = params.getParameter(GTSConfig.PARAM_INGESTURI);
-
-    // Now, construct the appropriate string
-    // The information we want in this string is:
-    // (1) the collection name(s), in sorted order.
-    // (2) the document template
-    // (3) the ingest URI
-
-    String[] sortArray = new String[collectionList.size()];
-    int j = 0;
-    for (String collection : collectionList)
-    {
-      sortArray[j++] = collection;
-    }
-    java.util.Arrays.sort(sortArray);
-
-    StringBuilder sb = new StringBuilder();
-    packList(sb,sortArray,'+');
-    pack(sb,documentTemplate,'+');
-    // From here on down, unpacking is unnecessary.
-    sb.append(ingestURI);
-
-    return new VersionContext(sb.toString(),params,spec);
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    // Grab the information we need to index
-    Specification spec = pipelineDescription.getSpecification();
-    List<String> collectionList = new ArrayList<String>();
-    String documentTemplate = "";
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(GTSConfig.NODE_COLLECTION))
-      {
-        collectionList.add(sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE));
-      }
-      else if (sn.getType().equals(GTSConfig.NODE_DOCUMENTTEMPLATE))
-      {
-        documentTemplate = sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE);
-      }
-    }
-
-    // Establish a session
-    getSession();
-
-    // Now, go off and call the ingest API.
-    if (poster.indexPost(documentURI,collectionList,documentTemplate,authorityNameString,document,activities))
-      return DOCUMENTSTATUS_ACCEPTED;
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  /** Remove a document using the connector.
-  * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Establish a session
-    getSession();
-
-    // Call the ingestion API.
-    poster.deletePost(documentURI,activities);
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing output specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"GTSConnector.Appliance"));
-    out.print(
-"\n"+
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.ingesturi.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"GTSConnector.PleaseSupplyAValidIngestionURI") + "\");\n"+
-"    editconnection.ingesturi.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.ingesturi.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"GTSConnector.PleaseSupplyAValidIngestionURI") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"GTSConnector.Appliance") + "\");\n"+
-"    editconnection.ingesturi.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String ingestURI = parameters.getParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_INGESTURI);
-    if (ingestURI == null)
-      ingestURI = "http://localhost:7031/HTTPIngest";
-
-    String realm = parameters.getParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_REALM);
-    if (realm == null)
-      realm = "";
-
-    String userID = parameters.getParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_USERID);
-    if (userID == null)
-      userID = "";
-		
-    String password = parameters.getObfuscatedParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_PASSWORD);
-    if (password == null)
-      password = "";
-		
-    // "Appliance" tab
-    if (tabName.equals(Messages.getString(locale,"GTSConnector.Appliance")))
-    {
-      out.print(
-"\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.IngestURI") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"ingesturi\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestURI)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.Realm") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"realm\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(realm)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.UserID") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"userid\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userID)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.Password") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Appliance tab hiddens
-      out.print("\n"+
-"<input type=\"hidden\" name=\"ingesturi\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestURI)+"\"/>\n"+
-"<input type=\"hidden\" name=\"userid\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userID)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String ingestURI = variableContext.getParameter("ingesturi");
-    if (ingestURI != null)
-      parameters.setParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_INGESTURI,ingestURI);
-
-    String realm = variableContext.getParameter("realm");
-    if (realm != null)
-      parameters.setParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_REALM,realm);
-
-    String userID = variableContext.getParameter("userid");
-    if (userID != null)
-      parameters.setParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_USERID,userID);
-		
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(org.apache.manifoldcf.agents.output.gts.GTSConfig.PARAM_PASSWORD,password);
-    
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" certificate(s)&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-    tabsArray.add(Messages.getString(locale,"GTSConnector.GTSCollections"));
-    tabsArray.add(Messages.getString(locale,"GTSConnector.GTSTemplate"));
-    out.print(
-"\n"+
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"checkSpecification()\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"gts_collectionname.value.length > 230)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"GTSConnector.CollectionNameMustBeLessThanOrEqualToCharacters") + "\");\n"+
-"    editjob."+seqPrefix+"gts_collectionname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i = 0;
-    String collectionName = null;
-    String documentTemplate = null;
-    while (i < os.getChildCount())
-    {
-      SpecificationNode sn = os.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_COLLECTION))
-      {
-        collectionName = sn.getAttributeValue(org.apache.manifoldcf.agents.output.gts.GTSConfig.ATTRIBUTE_VALUE);
-      }
-      else if (sn.getType().equals(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_DOCUMENTTEMPLATE))
-      {
-        documentTemplate = sn.getAttributeValue(org.apache.manifoldcf.agents.output.gts.GTSConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    if (collectionName == null)
-      collectionName = "";
-    if (documentTemplate == null)
-      documentTemplate = "";
-
-    // Collections tab
-    if (tabName.equals(Messages.getString(locale,"GTSConnector.GTSCollections")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.CollectionName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\""+seqPrefix+"gts_collectionname\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(collectionName)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for collections
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"gts_collectionname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(collectionName)+"\"/>\n"
-      );
-    }
-
-    // Template tab
-    if (tabName.equals(Messages.getString(locale,"GTSConnector.GTSTemplate")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.DocumentTemplate") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <textarea rows=\"10\" cols=\"96\" name=\""+seqPrefix+"gts_documenttemplate\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(documentTemplate)+"</textarea>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for document template
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"gts_documenttemplate\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(documentTemplate)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Collection name
-    String collectionName = variableContext.getParameter(seqPrefix+"gts_collectionname");
-    if (collectionName != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode sn = os.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_COLLECTION))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      if (collectionName.length() > 0)
-      {
-        SpecificationNode newspec = new SpecificationNode(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_COLLECTION);
-        newspec.setAttribute(org.apache.manifoldcf.agents.output.gts.GTSConfig.ATTRIBUTE_VALUE,collectionName);
-        os.addChild(os.getChildCount(),newspec);
-      }
-    }
-
-    // Document template
-    String documentTemplate = variableContext.getParameter(seqPrefix+"gts_documenttemplate");
-    if (documentTemplate != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode sn = os.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_DOCUMENTTEMPLATE))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode newspec = new SpecificationNode(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_DOCUMENTTEMPLATE);
-      newspec.setAttribute(org.apache.manifoldcf.agents.output.gts.GTSConfig.ATTRIBUTE_VALUE,documentTemplate);
-      os.addChild(os.getChildCount(),newspec);
-    }
-
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    int i = 0;
-    String collectionName = null;
-    String documentTemplate = null;
-    while (i < os.getChildCount())
-    {
-      SpecificationNode sn = os.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_COLLECTION))
-      {
-        collectionName = sn.getAttributeValue(org.apache.manifoldcf.agents.output.gts.GTSConfig.ATTRIBUTE_VALUE);
-      }
-      else if (sn.getType().equals(org.apache.manifoldcf.agents.output.gts.GTSConfig.NODE_DOCUMENTTEMPLATE))
-      {
-        documentTemplate = sn.getAttributeValue(org.apache.manifoldcf.agents.output.gts.GTSConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    if (collectionName == null)
-      collectionName = "";
-    if (documentTemplate == null)
-      documentTemplate = "";
-
-    // Display collections
-    out.print(
-"\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.Collection") + "</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(collectionName)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"GTSConnector.DocumentTemplate") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-    );
-    if (documentTemplate == null || documentTemplate.length() == 0)
-      out.println("None specified");
-    else
-    {
-      out.print(
-"        <textarea name=\"documenttemplate\" cols=\"96\" rows=\"5\" readonly=\"true\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(documentTemplate)+"</textarea>\n"
-
-      );
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-
-  // Protected methods
-
-  /** Fingerprint a file!
-  * Pass in the name of the (local) temporary file that we should be looking at.
-  * This method will read it as needed until the file has been identified (or found
-  * to remain "unknown").
-  * The code here has been lifted algorithmically from products/ShareCrawler/Fingerprinter.pas.
-  */
-  protected static int fingerprint(File file)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Look at the first 4K
-      byte[] byteBuffer = new byte[4096];
-      int amt;
-
-      // Open file for reading.
-      InputStream is = new FileInputStream(file);
-      try
-      {
-        amt = 0;
-        while (amt < byteBuffer.length)
-        {
-          int incr = is.read(byteBuffer,amt,byteBuffer.length-amt);
-          if (incr == -1)
-            break;
-          amt += incr;
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-
-      if (amt == 0)
-        return DT_ZERO;
-
-      if (isText(byteBuffer,amt))
-      {
-        // Treat as ASCII text
-        // We don't need to distinguish between the various flavors (e.g. HTML,
-        // XML, RTF, or plain TEXT, because GTS will eat them all regardless.
-        // Since it's a bit dicey to figure out the encoding, we'll just presume
-        // it's something that GTS will understand.
-        return DT_TEXT;
-      }
-
-      // Treat it as binary
-
-      // Is it PDF?  Does it begin with "%PDF-"?
-      if (byteBuffer[0] == (byte)0x25 && byteBuffer[1] == (byte)0x50 && byteBuffer[2] == (byte)0x44 && byteBuffer[3] == (byte)0x46)
-        return DT_PDF;
-
-      // Is it a compound document? Does it begin with 0xD0CF11E0A1B11AE1?
-      if (Logging.ingest.isDebugEnabled())
-        Logging.ingest.debug("GTS: Document begins with: "+hexprint(byteBuffer[0])+hexprint(byteBuffer[1])+
-        hexprint(byteBuffer[2])+hexprint(byteBuffer[3])+hexprint(byteBuffer[4])+hexprint(byteBuffer[5])+
-        hexprint(byteBuffer[6])+hexprint(byteBuffer[7]));
-      if (byteBuffer[0] == (byte)0xd0 && byteBuffer[1] == (byte)0xcf && byteBuffer[2] == (byte)0x11 && byteBuffer[3] == (byte)0xe0 &&
-        byteBuffer[4] == (byte)0xa1 && byteBuffer[5] == (byte)0xb1 && byteBuffer[6] == (byte)0x1a && byteBuffer[7] == (byte)0xe1)
-      {
-        Logging.ingest.debug("GTS: Compound document signature detected");
-        // Figure out what kind of compound document it is.
-        String appName = getAppName(file);
-        if (appName == null)
-          return DT_UNKNOWN;
-        else
-        {
-          if (Logging.ingest.isDebugEnabled())
-            Logging.ingest.debug("GTS: Appname is '"+appName+"'");
-        }
-        return recognizeApp(appName);
-      }
-
-      return DT_UNKNOWN;
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      return DT_UNKNOWN;
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      // An I/O error indicates that the type is unknown.
-      return DT_UNKNOWN;
-    }
-    catch (IllegalArgumentException e)
-    {
-      // Another POI error, means unknown document type
-      return DT_UNKNOWN;
-    }
-    catch (IllegalStateException e)
-    {
-      // Another POI error, means unknown document type
-      return DT_UNKNOWN;
-    }
-    catch (ArrayIndexOutOfBoundsException e)
-    {
-      // This means that poi couldn't find the bytes it was expecting, so just treat it as unknown
-      return DT_UNKNOWN;
-    }
-    catch (ClassCastException e)
-    {
-      // This means that poi had an internal error
-      return DT_UNKNOWN;
-    }
-    catch (OutOfMemoryError e)
-    {
-      // POI seems to throw this for some kinds of corrupt documents.
-      // I'm not sure this is the right thing to do but it's the best I
-      // can at the moment, until I get some documents from Norway that
-      // demonstrate the problem.
-      return DT_UNKNOWN;
-    }
-  }
-
-  /** Get a binary document's APPNAME field, or return null if the document
-  * does not seem to be an OLE compound document.
-  */
-  protected static String getAppName(File documentPath)
-    throws ManifoldCFException
-  {
-    try
-    {
-      InputStream is = new FileInputStream(documentPath);
-      try
-      {
-        // Use POIFS to traverse the file
-        POIFSReader reader = new POIFSReader();
-        ReaderListener listener = new ReaderListener();
-        reader.registerListener(listener,"\u0005SummaryInformation");
-        reader.read(is);
-        if (Logging.ingest.isDebugEnabled())
-          Logging.ingest.debug("GTS: Done finding appname for '"+documentPath.toString()+"'");
-        return listener.getAppName();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      return null;
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (Throwable e)
-    {
-      // We should eat all errors.  Also, even though our policy is to stop the crawler on out-of-memory errors, in this case we will
-      // not do that, because there's no "collateral damage" that can result from a fingerprinting failure.  No locks can be dropped, and
-      // we cannot screw up the database driver.
-      // Any collateral damage that we *do* need to stop for should manifest itself in another thread.
-
-      // The exception effectively means that we cannot identify the document.
-      return null;
-    }
-  }
-
-  /** Translate a string application name to one of the kinds of documents
-  * we care about.
-  */
-  protected static int recognizeApp(String appName)
-  {
-    appName = appName.toUpperCase(Locale.ROOT);
-    if (appName.indexOf("MICROSOFT WORD") != -1)
-      return DT_MSWORD;
-    if (appName.indexOf("MICROSOFT OFFICE WORD") != -1)
-      return DT_MSWORD;
-    if (appName.indexOf("MICROSOFT EXCEL") != -1)
-      return DT_MSEXCEL;
-    if (appName.indexOf("MICROSOFT POWERPOINT") != -1)
-      return DT_MSPOWERPOINT;
-    if (appName.indexOf("MICROSOFT OFFICE POWERPOINT") != -1)
-      return DT_MSPOWERPOINT;
-    if (appName.indexOf("MICROSOFT OUTLOOK") != -1)
-      return DT_MSOUTLOOK;
-    return DT_COMPOUND_DOC;
-  }
-
-  /** Test to see if a document is text or not.  The first n bytes are passed
-  * in, and this code returns "true" if it thinks they represent text.  The code
-  * has been lifted algorithmically from products/Sharecrawler/Fingerprinter.pas,
-  * which was based on "perldoc -f -T".
-  */
-  protected static boolean isText(byte[] beginChunk, int chunkLength)
-  {
-    if (chunkLength == 0)
-      return true;
-    int i = 0;
-    int count = 0;
-    while (i < chunkLength)
-    {
-      byte x = beginChunk[i++];
-      if (x == 0)
-        return false;
-      if (isStrange(x))
-        count++;
-    }
-    return ((double)count)/((double)chunkLength) < 0.30;
-  }
-
-  /** Check if character is not typical ASCII. */
-  protected static boolean isStrange(byte x)
-  {
-    return (x > 127 || x < 32) && (!isWhiteSpace(x));
-  }
-
-  /** Check if a byte is a whitespace character. */
-  protected static boolean isWhiteSpace(byte x)
-  {
-    return (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20);
-  }
-
-  protected static String hexprint(byte x)
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append(nibbleprint(0x0f & (((int)x)>>4))).append(nibbleprint(0x0f & ((int)x)));
-    return sb.toString();
-  }
-
-  protected static char nibbleprint(int x)
-  {
-    if (x >= 10)
-      return (char)(x - 10 + 'a');
-    return (char)(x + '0');
-  }
-
-  /** Reader listener object that extracts the app name */
-  protected static class ReaderListener implements POIFSReaderListener
-  {
-    protected String appName = null;
-
-    /** Constructor. */
-    public ReaderListener()
-    {
-    }
-
-    /** Get the app name.
-    */
-    public String getAppName()
-    {
-      return appName;
-    }
-
-    /** Process an "event" from POIFS - which is basically just the fact that we saw what we
-    * said we wanted to see, namely the SummaryInfo stream.
-    */
-    public void processPOIFSReaderEvent(POIFSReaderEvent event)
-    {
-      // Catch exceptions
-      try
-      {
-        InputStream is = event.getStream();
-        try
-        {
-          PropertySet ps = PropertySetFactory.create(is);
-          if (!(ps instanceof SummaryInformation))
-          {
-            appName = null;
-            return;
-          }
-          appName = ((SummaryInformation)ps).getApplicationName();
-        }
-        finally
-        {
-          is.close();
-        }
-
-      }
-      catch (NoPropertySetStreamException e)
-      {
-        // This means we couldn't figure out what the application was
-        appName = null;
-        return;
-      }
-      catch (MarkUnsupportedException e)
-      {
-        // Bad code; need to suport mark operation.
-        Logging.ingest.error("Need to feed a stream that supports mark(): "+e.getMessage(),e);
-        appName = null;
-        return;
-      }
-      catch (java.io.UnsupportedEncodingException e)
-      {
-        // Bad code; need to support encoding properly
-        Logging.ingest.error("Need to support encoding: "+e.getMessage(),e);
-        appName = null;
-        return;
-      }
-      catch (IOException e)
-      {
-        appName = null;
-        return;
-      }
-    }
-  }
-
-}
diff --git a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java b/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java
deleted file mode 100644
index d8c01ec..0000000
--- a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java
+++ /dev/null
@@ -1,1463 +0,0 @@
-/* $Id: HttpPoster.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.gts;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.common.Base64;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-import java.io.*;
-import java.net.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import javax.net.*;
-import javax.net.ssl.*;
-
-import org.apache.log4j.*;
-
-/**
-* Posts an input stream to the GTS
-*
-*/
-public class HttpPoster
-{
-  public static final String _rcsid = "@(#)$Id: HttpPoster.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Ingestion buffer size property. */
-  public static String ingestBufferSizeProperty = "org.apache.manifoldcf.ingest.buffersize";
-  public static String ingestCredentialsRealm = "org.apache.manifoldcf.ingest.credentialrealm";
-  public static String ingestResponseRetryCount = "org.apache.manifoldcf.ingest.responseretrycount";
-  public static String ingestResponseRetryInterval = "org.apache.manifoldcf.ingest.retryinterval";
-  public static String ingestRescheduleInterval = "org.apache.manifoldcf.ingest.rescheduleinterval";
-  public static String ingestURIProperty = "org.apache.manifoldcf.ingest.uri";
-  public static String ingestUserProperty = "org.apache.manifoldcf.ingest.user";
-  public static String ingestPasswordProperty = "org.apache.manifoldcf.ingest.password";
-  public static String ingestMaxConnectionsProperty = "org.apache.manifoldcf.ingest.maxconnections";
-
-  // Chunk size for base64-encoded headers
-  protected final static int HEADER_CHUNK = 4096;
-
-  private String encodedCredentials = null;
-  private String realm = null;
-  private String postURI = null;
-  private URL url = null;
-  private URL deleteURL = null;
-  private URL infoURL = null;
-  private String host = null;
-  private int port = 80;
-  private String protocol = null;
-
-  /** Default buffer size */
-  private final int buffersize;
-  /** Size coefficient */
-  private static double sizeCoefficient = 0.0005;    // 20 ms additional timeout per 2000 bytes, pulled out of my butt
-  /** the number of times we should poll for the response */
-  private final int responseRetries;
-  /** how long we should wait before checking for a new stream */
-  private final long responseRetryWait;
-  /** How long to wait before retrying a failed ingestion */
-  private final long interruptionRetryTime;
-
-  /** This is the secure socket factory we will use.  I'm presuming it's thread-safe, but
-  * if not, synchronization blocks are in order when it's used. */
-  protected static javax.net.ssl.SSLSocketFactory secureSocketFactory = null;
-  static
-  {
-    try
-    {
-      secureSocketFactory = getSecureSocketFactory();
-    }
-    catch (ManifoldCFException e)
-    {
-      // If we can't create, print and fail
-      e.printStackTrace();
-      System.exit(100);
-    }
-  }
-
-  /**
-  * Initialized the http poster.
-  * @param userID is the unencoded user name, or null.
-  * @param password is the unencoded password, or null.
-  * @param postURI the uri to post the request to
-  */
-  public HttpPoster(IThreadContext threadContext, String realm, String userID, String password, String postURI)
-    throws ManifoldCFException
-  {
-    if (userID != null && userID.length() > 0 && password != null)
-    {
-      this.encodedCredentials = new org.apache.manifoldcf.core.common.Base64().encodeByteArray((userID+":"+password).getBytes(StandardCharsets.UTF_8));
-      this.realm = realm;
-    }
-    this.postURI = postURI;
-
-    // Create a URL to GTS
-    try
-    {
-      url = new URL(postURI);
-      deleteURL = new URL(postURI+"?DELETE");
-      infoURL = new URL(postURI+"?STATUS");
-    }
-    catch (MalformedURLException murl)
-    {
-      throw new ManifoldCFException("Bad url",murl);
-    }
-
-    // set the port
-    port = url.getPort();
-    host = url.getHost();
-    protocol = url.getProtocol();
-    if (port == -1)
-    {
-      if (protocol.equalsIgnoreCase("https"))
-        port = 443;
-      else
-        port = 80;
-    }
-
-    buffersize = LockManagerFactory.getIntProperty(threadContext,ingestBufferSizeProperty,32768);
-    responseRetries = LockManagerFactory.getIntProperty(threadContext,ingestResponseRetryCount,9000);
-    responseRetryWait = LockManagerFactory.getIntProperty(threadContext,ingestResponseRetryInterval,20);
-    interruptionRetryTime = LockManagerFactory.getIntProperty(threadContext,ingestRescheduleInterval,60000);
-  }
-
-  /**
-  * Post the input stream to ingest
-  * @param documentURI is the document's uri.
-  * @param document is the document structure to ingest.
-  * @return true if the ingestion was successful, or false if the ingestion is illegal.
-  * @throws ManifoldCFException, ServiceInterruption
-  */
-  public boolean indexPost(String documentURI,
-    List<String> collections, String documentTemplate, String authorityNameString,
-    RepositoryDocument document, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    StringBuilder aclXml = new StringBuilder();
-    Iterator<String> securityTypeIterator = document.securityTypesIterator();
-    String[] shareAcls = null;
-    String[] shareDenyAcls = null;
-    String[] documentAcls = null;
-    String[] documentDenyAcls = null;
-    String[] parentAcls = null;
-    String[] parentDenyAcls = null;
-    while (securityTypeIterator.hasNext())
-    {
-      String securityType = securityTypeIterator.next();
-      if (securityType.equals(RepositoryDocument.SECURITY_TYPE_SHARE))
-      {
-        shareAcls = document.getSecurityACL(securityType);
-        shareDenyAcls = document.getSecurityDenyACL(securityType);
-      }
-      else if (securityType.equals(RepositoryDocument.SECURITY_TYPE_DOCUMENT))
-      {
-        documentAcls = document.getSecurityACL(securityType);
-        documentDenyAcls = document.getSecurityDenyACL(securityType);
-      }
-      else if (securityType.equals(RepositoryDocument.SECURITY_TYPE_PARENT))
-      {
-        parentAcls = document.getSecurityACL(securityType);
-        parentDenyAcls = document.getSecurityDenyACL(securityType);
-      }
-      else
-        // Can't accept the document, because we don't know how to secure it
-        activities.recordActivity(null,GTSConnector.INGEST_ACTIVITY,null,documentURI,activities.UNKNOWN_SECURITY,"Rejected document that has security info which GTS does not recognize: '"+ securityType + "'");
-        return false;
-    }
-
-    writeACLs(aclXml,"share",shareAcls,shareDenyAcls,authorityNameString,activities);
-    writeACLs(aclXml,"directory",parentAcls,parentDenyAcls,authorityNameString,activities);
-    writeACLs(aclXml,"file",documentAcls,documentDenyAcls,authorityNameString,activities);
-
-    if (aclXml.length() > 0)
-      aclXml.append("</document-acl>");
-    String aclXmlString = aclXml.toString();
-
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("indexPost(): '" + documentURI + "'");
-
-    // This flag keeps track of whether we read anything from the input stream yet.
-    // If not, we can retry here.  If so, we have to reschedule.
-    boolean readFromDocumentStreamYet = false;
-    int ioErrorRetry = 3;
-
-    while (true)
-    {
-      try
-      {
-        IngestThread t = new IngestThread(documentURI,aclXmlString,collections,documentTemplate,document);
-        try
-        {
-          t.start();
-          t.join();
-
-          // Log the activity, if any, regardless of any exception
-          if (t.getActivityCode() != null)
-            activities.recordActivity(t.getActivityStart(),GTSConnector.INGEST_ACTIVITY,t.getActivityBytes(),documentURI,t.getException().getClass().getSimpleName().toUpperCase(Locale.ROOT),t.getActivityDetails());
-
-          readFromDocumentStreamYet = (readFromDocumentStreamYet || t.getReadFromDocumentStreamYet());
-
-          Throwable thr = t.getException();
-          if (thr != null)
-          {
-            if (thr instanceof ServiceInterruption)
-              throw (ServiceInterruption)thr;
-            if (thr instanceof ManifoldCFException)
-              throw (ManifoldCFException)thr;
-            if (thr instanceof IOException)
-              throw (IOException)thr;
-            if (thr instanceof RuntimeException)
-              throw (RuntimeException)thr;
-            else
-              throw (Error)thr;
-          }
-          return t.getRval();
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-        }
-      }
-      catch (java.net.SocketTimeoutException ioe)
-      {
-        if (readFromDocumentStreamYet || ioErrorRetry == 0)
-        {
-          // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("IO error connecting to ingestion API: "+ioe.getMessage()+"; ingestion will be retried again later",
-            ioe,
-            currentTime + interruptionRetryTime,
-            currentTime + 2L * 60L * 60000L,
-            -1,
-            true);
-        }
-      }
-      catch (IOException ioe)
-      {
-        if (readFromDocumentStreamYet || ioErrorRetry == 0)
-        {
-          // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("IO error ingesting document: "+ioe.getMessage()+"; ingestion will be retried again later",
-            ioe,
-            currentTime + interruptionRetryTime,
-            currentTime + 2L * 60L * 60000L,
-            -1,
-            true);
-        }
-      }
-
-      // Sleep for a time, and retry
-      try
-      {
-        ManifoldCF.sleep(10000L);
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-      ioErrorRetry--;
-
-      // Go back around again!
-
-    }
-
-  }
-
-  /** Write acls into a StringBuilder */
-  protected static void writeACLs(StringBuilder aclXml, String type, String[] acl, String[] denyAcl, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException
-  {
-    if (acl != null && acl.length > 0 || denyAcl != null && denyAcl.length > 0)
-    {
-      if (aclXml.length() == 0)
-        aclXml.append("<document-acl>");
-      aclXml.append("<acl scope=\"").append(type).append("\">");
-      if (acl != null)
-      {
-        for (int i=0; i < acl.length; i++)
-        {
-          if (Logging.ingest.isDebugEnabled())
-            Logging.ingest.debug("Adding "+type+" ACL: " + acl[i]);
-          aclXml.append("<allow>");
-          aclXml.append(activities.qualifyAccessToken(authorityNameString,acl[i]));
-          aclXml.append("</allow>");
-        }
-      }
-      if (denyAcl != null)
-      {
-        for (int i=0; i < denyAcl.length; i++)
-        {
-          if (Logging.ingest.isDebugEnabled())
-            Logging.ingest.debug("Adding "+type+" deny ACL: " + denyAcl[i]);
-          aclXml.append("<deny>");
-          aclXml.append(activities.qualifyAccessToken(authorityNameString,denyAcl[i]));
-          aclXml.append("</deny>");
-        }
-      }
-      aclXml.append("</acl>");
-    }
-  }
-
-  /** Post a check request.
-  */
-  public void checkPost()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("checkPost()");
-
-    int ioErrorRetry = 5;
-    while (true)
-    {
-      // Open a socket to ingest, and to the response stream to get the post result
-      try
-      {
-        StatusThread t = new StatusThread();
-        try
-        {
-          t.start();
-          t.join();
-
-          Throwable thr = t.getException();
-          if (thr != null)
-          {
-            if (thr instanceof ServiceInterruption)
-              throw (ServiceInterruption)thr;
-            if (thr instanceof ManifoldCFException)
-              throw (ManifoldCFException)thr;
-            if (thr instanceof IOException)
-              throw (IOException)thr;
-            if (thr instanceof RuntimeException)
-              throw (RuntimeException)thr;
-            else
-              throw (Error)thr;
-          }
-          return;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-        }
-      }
-      catch (IOException ioe)
-      {
-        if (ioErrorRetry == 0)
-        {
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("IO exception checking: "+ioe.getMessage(),
-            ioe,
-            currentTime + interruptionRetryTime,
-            currentTime + 2L * 60L * 60000L,
-            -1,
-            true);
-        }
-      }
-
-      // Go back around again!
-      // Sleep for a time, and retry
-      try
-      {
-        ManifoldCF.sleep(10000L);
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      ioErrorRetry--;
-
-    }
-
-  }
-
-  /** Post a delete request.
-  *@param documentURI is the document's URI.
-  */
-  public void deletePost(String documentURI, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("deletePost(): '" + documentURI + "'");
-
-    int ioErrorRetry = 5;
-    while (true)
-    {
-      try
-      {
-        DeleteThread t = new DeleteThread(documentURI);
-        try
-        {
-          t.start();
-          t.join();
-
-          // Log the activity, if any, regardless of any exception
-          if (t.getActivityCode() != null)
-            activities.recordActivity(t.getActivityStart(),GTSConnector.REMOVE_ACTIVITY,null,documentURI,t.getException().getClass().getSimpleName().toUpperCase(Locale.ROOT),t.getActivityDetails());
-
-          Throwable thr = t.getException();
-          if (thr != null)
-          {
-            if (thr instanceof ServiceInterruption)
-              throw (ServiceInterruption)thr;
-            if (thr instanceof ManifoldCFException)
-              throw (ManifoldCFException)thr;
-            if (thr instanceof IOException)
-              throw (IOException)thr;
-            if (thr instanceof RuntimeException)
-              throw (RuntimeException)thr;
-            else
-              throw (Error)thr;
-          }
-          return;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-        }
-      }
-      catch (IOException ioe)
-      {
-        if (ioErrorRetry == 0)
-        {
-          long currentTime = System.currentTimeMillis();
-          throw new ServiceInterruption("IO exception deleting: "+ioe.getMessage()+"; deletion will be retried again later",
-            ioe,
-            currentTime + interruptionRetryTime,
-            currentTime + 2L * 60L * 60000L,
-            -1,
-            true);
-        }
-        // Fall through and recycle
-      }
-
-      // Go back around again!
-      // Sleep for a time, and retry
-      try
-      {
-        ManifoldCF.sleep(10000L);
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      ioErrorRetry--;
-
-    }
-
-  }
-
-  /**
-  * Get the response code of the post
-  * @param stream the stream the response is going to come from
-  * @return the response string
-  * @throws ManifoldCFException
-  */
-  protected String getResponse(BufferedReader stream) throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.ingest.debug("Waiting for response stream");
-    StringBuilder res = new StringBuilder();
-    try
-    {
-      // Stream.ready() always returns false for secure sockets :-(.  So
-      // we have to rely on socket timeouts to interrupt us if the server goes down.
-
-      while (true)
-      {
-        int i = stream.read();
-        if (i == -1)
-          break;
-        res.append((char) i);
-      }
-      Logging.ingest.debug("Read of response stream complete");
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Ingestion API socket timeout exception waiting for response code: "+e.getMessage()+"; ingestion will be retried again later",
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 2L * 60L * 60000L,
-        -1,
-        true);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-    }
-    catch (java.net.ConnectException e)
-    {
-      // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Timed out connecting to ingestion API: "+e.getMessage()+"; ingestion will be retried again later",
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 2L * 60L * 60000L,
-        -1,
-        true);
-    }
-    catch (java.net.SocketException e)
-    {
-      // Return 400 error; likely a connection reset which lost us the response data, so
-      // just treat it as something OK.
-      return "HTTP/1.0 400 Connection Reset";
-
-    }
-    catch (IOException ioe)
-    {
-      Logging.ingest.warn("IO exception trying to get response from ingestion API: "+ioe.getMessage(),ioe);
-      // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("IO exception waiting for response code: "+ioe.getMessage()+"; ingestion will be retried again later",
-        ioe,
-        currentTime + interruptionRetryTime,
-        currentTime + 2L * 60L * 60000L,
-        -1,
-        true);
-    }
-
-    return res.toString();
-  }
-
-  /** Write credentials to output */
-  protected void writeCredentials(OutputStream out)
-    throws IOException
-  {
-    // Apply credentials if present
-    if (encodedCredentials != null)
-    {
-      Logging.ingest.debug("Applying credentials");
-      byte[] tmp = ("Authorization: Basic " + encodedCredentials + "\r\n").getBytes(StandardCharsets.UTF_8);
-      out.write(tmp, 0, tmp.length);
-
-      tmp = ("WWW-Authenticate: Basic realm=\"" + ((realm != null) ? realm : "") + "\"\r\n").getBytes(StandardCharsets.UTF_8);
-      out.write(tmp, 0, tmp.length);
-    }
-  }
-
-  /** Encode for metadata.
-  *@param inputString is the input string.
-  *@return output, encoded.
-  */
-  protected static String metadataEncode(String inputString)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < inputString.length())
-    {
-      char x = inputString.charAt(i++);
-      // Certain characters must simply be skipped, because they are illegal in header fields.
-      if (x >= ' ' && x <= (char)127)
-      {
-        if (x == '\\' || x == ',')
-          rval.append('\\');
-        rval.append(x);
-      }
-    }
-    return rval.toString();
-  }
-
-  /** Build a secure socket factory based on no keystore and a lax trust manager.
-  * This allows use of SSL for privacy but not identification. */
-  protected static javax.net.ssl.SSLSocketFactory getSecureSocketFactory()
-    throws ManifoldCFException
-  {
-    try
-    {
-      java.security.SecureRandom secureRandom = java.security.SecureRandom.getInstance("SHA1PRNG");
-
-      // Create an SSL context
-      javax.net.ssl.SSLContext sslContext = javax.net.ssl.SSLContext.getInstance("SSL");
-      sslContext.init(null,new LaxTrustManager[]{new LaxTrustManager()},secureRandom);
-      return sslContext.getSocketFactory();
-    }
-    catch (java.security.NoSuchAlgorithmException e)
-    {
-      throw new ManifoldCFException("No such algorithm",e);
-    }
-    catch (java.security.KeyManagementException e)
-    {
-      throw new ManifoldCFException("Key management exception",e);
-    }
-  }
-
-  /** Create a socket in a manner consistent with all of our specified parameters.
-  */
-  protected Socket createSocket(long responseRetryCount)
-    throws IOException, ManifoldCFException
-  {
-    Socket socket;
-    if (protocol.equals("https"))
-    {
-      try
-      {
-        SocketFactory factory = SSLSocketFactory.getDefault();
-        socket = factory.createSocket(host,port);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw e;
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Couldn't set up SSL connection to ingestion API: "+e.getMessage(),e);
-      }
-    }
-    else
-      socket = new Socket(host, port);
-
-    // Calculate the timeout we want
-    long timeoutMilliseconds = responseRetryWait * responseRetryCount;
-    socket.setSoTimeout((int)timeoutMilliseconds);
-
-    return socket;
-  }
-
-  /** Our own trust manager, which ignores certificate issues */
-  protected static class LaxTrustManager implements X509TrustManager
-  {
-    /** Does nothing */
-    public LaxTrustManager()
-    {
-    }
-
-    /** Return a list of accepted issuers.  There are none. */
-    public java.security.cert.X509Certificate[] getAcceptedIssuers()
-    {
-      return new java.security.cert.X509Certificate[0];
-    }
-
-    /** We have no problem with any clients */
-    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
-      throws java.security.cert.CertificateException
-    {
-    }
-
-    /** We have no problem with any servers */
-    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
-      throws java.security.cert.CertificateException
-    {
-    }
-
-  }
-
-  /** Killable thread that does ingestions.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a single document ingestion.
-  */
-  protected class IngestThread extends java.lang.Thread
-  {
-    protected String documentURI;
-    protected String aclXmlString;
-    protected List<String> collections;
-    protected String documentTemplate;
-    protected RepositoryDocument document;
-
-    protected Long activityStart = null;
-    protected Long activityBytes = null;
-    protected String activityCode = null;
-    protected String activityDetails = null;
-    protected Throwable exception = null;
-    protected boolean readFromDocumentStreamYet = false;
-    protected boolean rval = false;
-
-    public IngestThread(String documentURI, String aclXmlString, List<String> collections, String documentTemplate, RepositoryDocument document)
-    {
-      super();
-      setDaemon(true);
-      this.documentURI = documentURI;
-      this.aclXmlString = aclXmlString;
-      this.collections = collections;
-      this.documentTemplate = documentTemplate;
-      this.document = document;
-    }
-
-    public void run()
-    {
-      long length = document.getBinaryLength();
-      InputStream is = document.getBinaryStream();
-
-      try
-      {
-        // Do the operation!
-        long fullStartTime = System.currentTimeMillis();
-
-        // Open a socket to ingest, and to the response stream to get the post result
-        try
-        {
-          // Set up the socket, and the (optional) secure socket.
-          long responseRetryCount = responseRetries + (long)((float)length * sizeCoefficient);
-          Socket socket = createSocket(responseRetryCount);
-
-          try
-          {
-
-            InputStreamReader isr = new InputStreamReader(socket.getInputStream(),"ASCII");
-            try
-            {
-              BufferedReader in = new BufferedReader(isr);
-              try
-              {
-                OutputStream out = socket.getOutputStream();
-                try
-                {
-                  // Create the output stream to GTS
-                  String uri = url.getFile();
-                  if (uri.length() == 0)
-                    uri = "/";
-                  byte[] tmp = ("POST " + uri + " HTTP/1.0\r\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  // Set all the headers
-                  tmp = ("Document-URI: " + documentURI + "\r\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  writeCredentials(out);
-
-                  // Apply ACL if present
-                  if (aclXmlString.length() > 0)
-                  {
-
-                    String encodedACL = new Base64().encodeByteArray(aclXmlString.getBytes(StandardCharsets.UTF_8));
-
-                    // Break into chunks - 4K each - 'cause otherwise we blow up the ingester.
-                    int index = 0;
-                    while (true)
-                    {
-                      if (index + HEADER_CHUNK >= encodedACL.length())
-                      {
-                        tmp = ("Document-ACL: " + encodedACL.substring(index) + "\r\n").getBytes(StandardCharsets.UTF_8);
-                        out.write(tmp, 0, tmp.length);
-                        break;
-                      }
-                      tmp = ("Document-ACL: " + encodedACL.substring(index,index + HEADER_CHUNK) + "\r\n").getBytes(StandardCharsets.UTF_8);
-                      out.write(tmp, 0, tmp.length);
-                      index += HEADER_CHUNK;
-                    }
-                  }
-
-                  // Do the collections
-                  if (collections != null)
-                  {
-                    for (String collectionName : collections)
-                    {
-                      String encodedValue = metadataEncode(collectionName);
-                      //System.out.println("collection metadata: collection_name = '"+encodedValue+"'");
-                      tmp = ("Document-Metadata: collection_name="+encodedValue+"\r\n").getBytes(StandardCharsets.UTF_8);
-                      out.write(tmp, 0, tmp.length);
-                    }
-                  }
-
-                  // Do the document template
-                  if (documentTemplate != null && documentTemplate.length() > 0)
-                  {
-                    String encodedTemplate = new Base64().encodeByteArray(documentTemplate.getBytes(StandardCharsets.UTF_8));
-                    // Break into chunks - 4K each - 'cause otherwise we blow up the ingester.
-                    int index = 0;
-                    while (true)
-                    {
-                      if (index + HEADER_CHUNK >= encodedTemplate.length())
-                      {
-                        tmp = ("Document-Template: " + encodedTemplate.substring(index) + "\r\n").getBytes(StandardCharsets.UTF_8);
-                        out.write(tmp, 0, tmp.length);
-                        break;
-                      }
-                      tmp = ("Document-Template: " + encodedTemplate.substring(index,index + HEADER_CHUNK) + "\r\n").getBytes(StandardCharsets.UTF_8);
-                      out.write(tmp, 0, tmp.length);
-                      index += HEADER_CHUNK;
-                    }
-                  }
-
-                  // Write all the metadata, if any
-                  Iterator<String> iter = document.getFields();
-                  while (iter.hasNext())
-                  {
-                    String fieldName = iter.next();
-                    String[] values = document.getFieldAsStrings(fieldName);
-                    // We only handle strings right now!!!
-                    int k = 0;
-                    while (k < values.length)
-                    {
-                      String value = (String)values[k++];
-
-                      String encodedValue = metadataEncode(value);
-                      //System.out.println("Metadata: Name = '"+fieldName+"', value = '"+encodedValue+"'");
-                      tmp = ("Document-Metadata: "+ fieldName+"="+encodedValue+"\r\n").getBytes(StandardCharsets.UTF_8);
-                      out.write(tmp, 0, tmp.length);
-                    }
-                  }
-
-                  tmp = ("Content-length: " + new Long(length).toString() + "\r\n\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  long total = 0;
-                  long now, later;
-                  now = System.currentTimeMillis();
-
-                  byte[] bytes = new byte[buffersize];
-
-                  // Write out the contents of the inputstream to the socket
-                  while (true)
-                  {
-                    int count;
-                    // Specially catch all errors that come from reading the input stream itself.
-                    // This will help us segregate errors that come from the stream vs. those that come from the ingestion system.
-                    try
-                    {
-                      count = is.read(bytes);
-                    }
-                    catch (java.net.SocketTimeoutException ioe)
-                    {
-                      // We have to catch socket timeout exceptions specially, because they are derived from InterruptedIOException
-                      // They are otherwise just like IOExceptions
-
-                      // Log the error
-                      Logging.ingest.warn("Error reading data for transmission to Ingestion API: "+ioe.getMessage(),ioe);
-
-                      activityStart = new Long(fullStartTime);
-                      activityCode = "-1";
-                      activityDetails = "Couldn't read document: "+ioe.getMessage();
-
-                      // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-                      long currentTime = System.currentTimeMillis();
-                      throw new ServiceInterruption("IO error reading document for ingestion: "+ioe.getMessage()+"; read will be retried again later",
-                        ioe,
-                        currentTime + interruptionRetryTime,
-                        currentTime + 2L * 60L * 60000L,
-                        -1,
-                        true);
-
-                    }
-                    catch (InterruptedIOException ioe)
-                    {
-                      // If the transfer was interrupted, it may be because we are shutting down the thread.
-
-                      // Third-party library exceptions derived from InterruptedIOException are possible; if the stream comes from httpclient especially.
-                      // If we see one of these, we treat it as "not an interruption".
-                      if (!ioe.getClass().getName().equals("java.io.InterruptedIOException"))
-                      {
-                        // Log the error
-                        Logging.ingest.warn("Error reading data for transmission to Ingestion API: "+ioe.getMessage(),ioe);
-
-                        activityStart = new Long(fullStartTime);
-                        activityCode = "-1";
-                        activityDetails = "Couldn't read document: "+ioe.getMessage();
-
-                        // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-                        long currentTime = System.currentTimeMillis();
-                        throw new ServiceInterruption("IO error reading document for ingestion: "+ioe.getMessage()+"; read will be retried again later",
-                          ioe,
-                          currentTime + interruptionRetryTime,
-                          currentTime + 2L * 60L * 60000L,
-                          -1,
-                          true);
-                      }
-                      else
-                        throw ioe;
-                    }
-                    catch (IOException ioe)
-                    {
-                      // We need to decide whether to throw a service interruption or metacarta exception, based on what went wrong.
-                      // We never retry here; the cause is the repository, so there's not any point.
-
-                      // Log the error
-                      Logging.ingest.warn("Error reading data for transmission to Ingestion API: "+ioe.getMessage(),ioe);
-
-                      activityStart = new Long(fullStartTime);
-                      activityCode = "-1";
-                      activityDetails = "Couldn't read document: "+ioe.getMessage();
-
-                      // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-                      long currentTime = System.currentTimeMillis();
-                      throw new ServiceInterruption("IO error reading document for ingestion: "+ioe.getMessage()+"; read will be retried again later",
-                        ioe,
-                        currentTime + interruptionRetryTime,
-                        currentTime + 2L * 60L * 60000L,
-                        -1,
-                        true);
-                    }
-
-                    if (count == -1)
-                      break;
-                    readFromDocumentStreamYet = true;
-                    out.write(bytes,0,count);
-                    total += (long)count;
-                  }
-
-                  later = System.currentTimeMillis();
-                  if (Logging.ingest.isDebugEnabled())
-                    Logging.ingest.debug("Total bytes posted: " + new Long(total).toString() + ", total time: " + (later - now));
-
-                  out.flush();
-
-                  // Now, process response
-                  String res;
-                  try
-                  {
-                    res = getResponse(in);
-                  }
-                  catch (ServiceInterruption si)
-                  {
-                    activityStart = new Long(now);
-                    activityCode = "-2";
-                    activityDetails = si.getMessage();
-                    throw si;
-                  }
-
-                  if (Logging.ingest.isDebugEnabled())
-                    Logging.ingest.debug("Response code from ingest: '" + res + "'");
-
-                  CodeDetails cd = new CodeDetails(res);
-
-                  activityStart = new Long(now);
-                  activityBytes = new Long(length);
-                  activityCode = cd.getCode();
-                  activityDetails = cd.getDetails();
-
-                  int codeValue = cd.getCodeValue();
-
-                  // A negative number means http error of some kind.
-                  if (codeValue < 0)
-                    throw new ManifoldCFException("Http protocol error");
-
-                  // 200 means everything went OK
-                  if (codeValue == 200)
-                  {
-                    rval = true;
-                    return;
-                  }
-
-                  // Anything else means the document didn't ingest.
-                  // There are three possibilities here:
-                  // 1) The document will NEVER ingest (it's illegal), in which case a 400 or 403 will be returned, and
-                  // 2) There is a transient error, in which case we will want to try again, after a wait.
-                  //    If the situation is (2), then we CAN'T retry if we already read any of the stream; therefore
-                  //    we are forced to throw a "service interrupted" exception, and let the caller reschedule
-                  //    the ingestion.
-                  // 3) Something is wrong with the setup, e.g. bad credentials.  In this case we chuck a ManifoldCFException,
-                  //    since this will abort the current activity entirely.
-
-                  if (codeValue == 401)
-                    throw new ManifoldCFException("Bad credentials for ingestion",ManifoldCFException.SETUP_ERROR);
-
-                  if (codeValue >= 400 && codeValue < 500)
-                  {
-                    rval = false;
-                    return;
-                  }
-
-                  // If this continues, we should indeed abort the job.  Retries should not go on indefinitely either; 2 hours is plenty
-                  long currentTime = System.currentTimeMillis();
-                  throw new ServiceInterruption("Error "+Integer.toString(codeValue)+" from ingestion request; ingestion will be retried again later",
-                    new ManifoldCFException("Ingestion HTTP error code "+Integer.toString(codeValue)),
-                    currentTime + interruptionRetryTime,
-                    currentTime + 2L * 60L * 60000L,
-                    -1,
-                    true);
-                }
-                finally
-                {
-                  out.close();
-                }
-              }
-              finally
-              {
-                in.close();
-              }
-            }
-            finally
-            {
-              isr.close();
-            }
-          }
-          finally
-          {
-            try
-            {
-              socket.close();
-            }
-            catch (InterruptedIOException e)
-            {
-              throw e;
-            }
-            catch (IOException e)
-            {
-              Logging.ingest.debug("Error closing socket: "+e.getMessage(),e);
-              // Do NOT rethrow
-            }
-          }
-        }
-        catch (java.net.SocketTimeoutException ioe)
-        {
-          // These are just like IO errors, but since they are derived from InterruptedIOException, they have to be caught first.
-          // Log the error
-          Logging.ingest.warn("Error connecting to ingestion API: "+ioe.getMessage(),ioe);
-
-          activityStart = new Long(fullStartTime);
-          activityCode = "-1";
-          activityDetails = ioe.getMessage();
-
-          throw ioe;
-        }
-        catch (InterruptedIOException e)
-        {
-          return;
-        }
-        catch (IOException ioe)
-        {
-          activityStart = new Long(fullStartTime);
-
-          // Intercept "broken pipe" exception, since that seems to be what we get if the ingestion API kills the socket right after a 400 goes out.
-          // Basically, we have no choice but to interpret that in the same manner as a 400, since no matter how we do it, it's a race and the 'broken pipe'
-          // result is always possible.  So we might as well expect it and treat it properly.
-          //
-          if (ioe.getClass().getName().equals("java.net.SocketException") && ioe.getMessage().toLowerCase(Locale.ROOT).indexOf("broken pipe") != -1)
-          {
-            // We've seen what looks like the ingestion interface forcibly closing the socket.
-            // We *choose* to interpret this just like a 400 response.  However, we log in the history using a different code,
-            // since we really don't know what happened for sure.
-            // Record the attempt
-
-            activityCode = "-103";
-            activityDetails = "Presuming an ingestion rejection: "+ioe.getMessage();
-            rval = false;
-            return;
-          }
-
-          // Record the attempt
-          activityCode = "-1";
-          activityDetails = ioe.getMessage();
-
-          // Log the error
-          Logging.ingest.warn("Error communicating with Ingestion API: "+ioe.getMessage(),ioe);
-
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-    public Long getActivityStart()
-    {
-      return activityStart;
-    }
-
-    public Long getActivityBytes()
-    {
-      return activityBytes;
-    }
-
-    public String getActivityCode()
-    {
-      return activityCode;
-    }
-
-    public String getActivityDetails()
-    {
-      return activityDetails;
-    }
-
-    public boolean getReadFromDocumentStreamYet()
-    {
-      return readFromDocumentStreamYet;
-    }
-
-    public boolean getRval()
-    {
-      return rval;
-    }
-  }
-
-  /** Killable thread that does deletions.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a single document deletion.
-  */
-  protected class DeleteThread extends java.lang.Thread
-  {
-    protected String documentURI;
-
-    protected Long activityStart = null;
-    protected String activityCode = null;
-    protected String activityDetails = null;
-    protected Throwable exception = null;
-
-    public DeleteThread(String documentURI)
-    {
-      super();
-      setDaemon(true);
-      this.documentURI = documentURI;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Do the operation!
-        long fullStartTime = System.currentTimeMillis();
-        // Open a socket to ingest, and to the response stream to get the post result
-        try
-        {
-          // Set up the socket, and the (optional) secure socket.
-          Socket socket = createSocket(responseRetries);
-          try
-          {
-            InputStreamReader isr = new InputStreamReader(socket.getInputStream(),"ASCII");
-            try
-            {
-              BufferedReader in = new BufferedReader(isr);
-              try
-              {
-                OutputStream out = socket.getOutputStream();
-                try
-                {
-                  long startTime = System.currentTimeMillis();
-                  // Create the output stream to GTS
-                  byte[] tmp = ("POST " + deleteURL.getFile() + " HTTP/1.0\r\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  // Set all the headers
-                  tmp = ("Document-URI: " + documentURI + "\r\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  writeCredentials(out);
-
-                  tmp = ("Content-length: 0\r\n\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  if (Logging.ingest.isDebugEnabled())
-                    Logging.ingest.debug("Delete posted");
-
-                  out.flush();
-
-                  String res;
-                  try
-                  {
-                    res = getResponse(in);
-                  }
-                  catch (ServiceInterruption si)
-                  {
-                    activityStart = new Long(startTime);
-                    activityCode = "-2";
-                    activityDetails = si.getMessage();
-                    throw si;
-                  }
-
-                  if (Logging.ingest.isDebugEnabled())
-                    Logging.ingest.debug("Response code from delete: '" + res + "'");
-
-                  CodeDetails cd = new CodeDetails(res);
-
-                  activityStart = new Long(startTime);
-                  activityCode = cd.getCode();
-                  activityDetails = cd.getDetails();
-
-                  int codeValue = cd.getCodeValue();
-
-                  if (codeValue < 0)
-                    throw new ManifoldCFException("Http protocol error");
-
-                  // 200 means everything went OK
-                  if (codeValue == 200)
-                    return;
-
-                  // We ignore everything in the range from 400-500 now
-                  if (codeValue == 401)
-                    throw new ManifoldCFException("Bad credentials for ingestion",ManifoldCFException.SETUP_ERROR);
-
-                  if (codeValue >= 400 && codeValue < 500)
-                    return;
-
-                  // Anything else means the document didn't delete.  Throw the error.
-                  throw new ManifoldCFException("Error deleting document: '"+res+"'");
-                }
-                finally
-                {
-                  out.close();
-                }
-              }
-              finally
-              {
-                in.close();
-              }
-            }
-            finally
-            {
-              isr.close();
-            }
-          }
-          finally
-          {
-            try
-            {
-              socket.close();
-            }
-            catch (InterruptedIOException e)
-            {
-              throw e;
-            }
-            catch (IOException e)
-            {
-              Logging.ingest.debug("Error closing socket: "+e.getMessage(),e);
-              // Do NOT rethrow
-            }
-          }
-        }
-        catch (InterruptedIOException ioe)
-        {
-          return;
-        }
-        catch (IOException ioe)
-        {
-          // Log the error
-          Logging.ingest.warn("Error communicating with Ingestion API: "+ioe.getMessage(),ioe);
-
-          activityStart = new Long(fullStartTime);
-          activityCode = "-1";
-          activityDetails = ioe.getMessage();
-
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-    public Long getActivityStart()
-    {
-      return activityStart;
-    }
-
-    public String getActivityCode()
-    {
-      return activityCode;
-    }
-
-    public String getActivityDetails()
-    {
-      return activityDetails;
-    }
-  }
-
-  /** Killable thread that does a status check.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a status check.
-  */
-  protected class StatusThread extends java.lang.Thread
-  {
-    protected Throwable exception = null;
-
-    public StatusThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Do the operation!
-        // Open a socket to ingest, and to the response stream to get the post result
-        try
-        {
-          // Set up the socket, and the (optional) secure socket.
-          Socket socket = createSocket(responseRetries);
-          try
-          {
-            InputStreamReader isr = new InputStreamReader(socket.getInputStream(),"ASCII");
-            try
-            {
-              BufferedReader in = new BufferedReader(isr);
-              try
-              {
-                OutputStream out = socket.getOutputStream();
-                try
-                {
-                  // Create the output stream to GTS
-                  byte[] tmp = ("GET " + infoURL.getFile() + " HTTP/1.0\r\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  writeCredentials(out);
-
-                  tmp = ("Content-length: 0\r\n\n").getBytes(StandardCharsets.UTF_8);
-                  out.write(tmp, 0, tmp.length);
-
-                  if (Logging.ingest.isDebugEnabled())
-                    Logging.ingest.debug("Status request posted");
-
-                  out.flush();
-
-                  String res = getResponse(in);
-
-                  if (Logging.ingest.isDebugEnabled())
-                    Logging.ingest.debug("Response code from delete: '" + res + "'");
-
-                  CodeDetails cd = new CodeDetails(res);
-
-                  int codeValue = cd.getCodeValue();
-                  if (codeValue < 0)
-                    throw new ManifoldCFException("Http protocol error");
-
-                  // 200 means everything went OK
-                  if (codeValue == 200)
-                    return;
-
-                  // We ignore everything in the range from 400-500 now
-                  if (codeValue == 401)
-                    throw new ManifoldCFException("Bad credentials for ingestion",ManifoldCFException.SETUP_ERROR);
-
-                  // Anything else means the info request failed.
-                  throw new ManifoldCFException("Error connecting to MetaCarta ingestion API: '"+res+"'");
-                }
-                finally
-                {
-                  out.close();
-                }
-              }
-              finally
-              {
-                in.close();
-              }
-            }
-            finally
-            {
-              isr.close();
-            }
-          }
-          finally
-          {
-            try
-            {
-              socket.close();
-            }
-            catch (InterruptedIOException e)
-            {
-              throw e;
-            }
-            catch (IOException e)
-            {
-              Logging.ingest.debug("Error closing socket: "+e.getMessage(),e);
-              // Do NOT rethrow
-            }
-          }
-        }
-        catch (InterruptedIOException ioe)
-        {
-          // Exit the thread.
-          return;
-        }
-        catch (IOException ioe)
-        {
-          // Log the error
-          Logging.ingest.warn("Error communicating with Ingestion API: "+ioe.getMessage(),ioe);
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-  }
-
-  /** Code+details paper object */
-  protected static class CodeDetails
-  {
-    protected String code;
-    protected int codeValue;
-    protected String details;
-
-    public CodeDetails(String res)
-    {
-      codeValue = -100;
-      code = "-100";
-      details = "Http response was improperly formed";
-
-      int firstSpace = res.indexOf(" ");
-      if (firstSpace != -1)
-      {
-        int secondSpace = res.indexOf(" ", firstSpace + 1);
-        if (secondSpace != -1)
-        {
-          code = res.substring(firstSpace + 1, secondSpace);
-          details = res.substring(secondSpace+1).trim();
-          try
-          {
-            codeValue = (int)(new Double(code).doubleValue());
-            if (codeValue == 200)
-              details = null;
-          }
-          catch (NumberFormatException e)
-          {
-            // Fall through and leave codeValue unaltered
-          }
-        }
-      }
-    }
-
-    public String getCode()
-    {
-      return code;
-    }
-
-    public int getCodeValue()
-    {
-      return codeValue;
-    }
-
-    public String getDetails()
-    {
-      return details;
-    }
-
-  }
-
-}
-
diff --git a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/Messages.java b/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/Messages.java
deleted file mode 100644
index ed4ddf1..0000000
--- a/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.gts;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.gts.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.output.gts";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_en_US.properties b/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_en_US.properties
deleted file mode 100644
index eb426b1..0000000
--- a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_en_US.properties
+++ /dev/null
@@ -1,29 +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.
-
-GTSConnector.Appliance=Appliance
-GTSConnector.IngestURI=Ingest URI:
-GTSConnector.Realm=Realm:
-GTSConnector.UserID=User ID:
-GTSConnector.Password=Password:
-GTSConnector.CollectionName=Collection name:
-GTSConnector.GTSCollections=GTS Collections
-GTSConnector.GTSTemplate=GTS Template
-GTSConnector.DocumentTemplate=Document template:
-GTSConnector.Collection=Collection:
-GTSConnector.PleaseSupplyAValidIngestionURI=Please supply a valid ingestion URI
-GTSConnector.Parameters=Parameters:
-GTSConnector.CollectionNameMustBeLessThanOrEqualToCharacters=Collection name must be less than or equal to 230 characters
-
diff --git a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_es_ES.properties b/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_es_ES.properties
deleted file mode 100644
index 1e9599a..0000000
--- a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_es_ES.properties
+++ /dev/null
@@ -1,29 +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.
-
-GTSConnector.Appliance=Aplicaciòn
-GTSConnector.IngestURI=Ingresar URI:
-GTSConnector.Realm=Esfera:
-GTSConnector.UserID=ID de usuario:
-GTSConnector.Password=Contraseña:
-GTSConnector.CollectionName=nombre de la colección:
-GTSConnector.GTSCollections=GTS Colecciones
-GTSConnector.GTSTemplate=GTS Plantilla
-GTSConnector.DocumentTemplate=plantilla de documento:
-GTSConnector.Collection=Colección:
-GTSConnector.PleaseSupplyAValidIngestionURI=Por favor, facilite una ingreso válido URI
-GTSConnector.Parameters=Parámetros:
-GTSConnector.CollectionNameMustBeLessThanOrEqualToCharacters=Nombre de la colección debe ser menor que o igual a 230 caràcteres
-
diff --git a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_ja_JP.properties b/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_ja_JP.properties
deleted file mode 100644
index 506a772..0000000
--- a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_ja_JP.properties
+++ /dev/null
@@ -1,28 +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.
-
-GTSConnector.Appliance=アプライアンス
-GTSConnector.IngestURI=読込みURI:
-GTSConnector.Realm=領域:
-GTSConnector.UserID=ユーザID:
-GTSConnector.Password=パスワード:
-GTSConnector.CollectionName=コレクション名:
-GTSConnector.GTSCollections=GTSコレクション
-GTSConnector.GTSTemplate=GTSテンプレート
-GTSConnector.DocumentTemplate=コンテンツテンプレート:
-GTSConnector.Collection=コレクション:
-GTSConnector.PleaseSupplyAValidIngestionURI=正しいコンテンツ読込みURIを指定してください
-GTSConnector.Parameters=引数:
-GTSConnector.CollectionNameMustBeLessThanOrEqualToCharacters=コレクション名は230文字以下にしてください
diff --git a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_zh_CN.properties b/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_zh_CN.properties
deleted file mode 100644
index 054bb2f..0000000
--- a/connectors/gts/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/gts/common_zh_CN.properties
+++ /dev/null
@@ -1,28 +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.
-
-GTSConnector.Appliance=设备
-GTSConnector.IngestURI=爬取URI:
-GTSConnector.Realm=区域: 
-GTSConnector.UserID=用户ID: 
-GTSConnector.Password=密码: 
-GTSConnector.CollectionName=采集名: 
-GTSConnector.GTSCollections=GTS采集
-GTSConnector.GTSTemplate=GTS模版
-GTSConnector.DocumentTemplate=文档模版: 
-GTSConnector.Collection=采集: 
-GTSConnector.PleaseSupplyAValidIngestionURI=请指定有效的爬取URI
-GTSConnector.Parameters=参数: 
-GTSConnector.CollectionNameMustBeLessThanOrEqualToCharacters=采集名需少于或等于230字符
diff --git a/connectors/gts/connector/src/test/java/org/apache/manifoldcf/agents/output/gts/tests/BaseUIHSQLDB.java b/connectors/gts/connector/src/test/java/org/apache/manifoldcf/agents/output/gts/tests/BaseUIHSQLDB.java
deleted file mode 100644
index b4c2736..0000000
--- a/connectors/gts/connector/src/test/java/org/apache/manifoldcf/agents/output/gts/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.gts.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Test Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"GTS Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.gts.GTSConnector"};
-  }
-
-}
diff --git a/connectors/gts/connector/src/test/java/org/apache/manifoldcf/agents/output/gts/tests/NavigationHSQLDBUI.java b/connectors/gts/connector/src/test/java/org/apache/manifoldcf/agents/output/gts/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 251576c..0000000
--- a/connectors/gts/connector/src/test/java/org/apache/manifoldcf/agents/output/gts/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.gts.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.output.gts.GTSConnector");
-    testerInstance.clickButton("Continue",120);
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Visit the Appliance tab
-    testerInstance.clickTab("Appliance");
-    
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save",60);
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // GTS Template
-    testerInstance.clickTab("GTS Template");
-    
-    // GTS Collections
-    testerInstance.clickTab("GTS Collections");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-    //Make sure that we don't land in an error after deleting output connection
-    testerInstance.verifyThereIsNoError();
-
-  }
-}
diff --git a/connectors/gts/pom.xml b/connectors/gts/pom.xml
deleted file mode 100644
index af019d8..0000000
--- a/connectors/gts/pom.xml
+++ /dev/null
@@ -1,366 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-gts-connector</artifactId>
-  <name>ManifoldCF - Connectors - MetaCarta GTS</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.poi</groupId>
-      <artifactId>poi</artifactId>
-      <version>${poi.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
-
diff --git a/connectors/hdfs/.gitignore b/connectors/hdfs/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/hdfs/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/hdfs/build.xml b/connectors/hdfs/build.xml
deleted file mode 100644
index d833b73..0000000
--- a/connectors/hdfs/build.xml
+++ /dev/null
@@ -1,74 +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.
--->
-
-<project name="hdfs" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="commons-cli*.jar"/>
-            <include name="commons-configuration*.jar"/>
-            <include name="hadoop-common*.jar"/>
-            <include name="hadoop-annotations*.jar"/>
-            <include name="hadoop-auth*.jar"/>
-            <include name="hadoop-hdfs*.jar"/>
-            <include name="htrace-core*.jar"/>
-            <include name="protobuf-java*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="commons-cli*.jar"/>
-                <include name="commons-configuration*.jar"/>
-                <include name="hadoop-common*.jar"/>
-                <include name="hadoop-annotations*.jar"/>
-                <include name="hadoop-auth*.jar"/>
-                <include name="hadoop-hdfs*.jar"/>
-                <include name="htrace-core*.jar"/>
-                <include name="protobuf-java*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-    
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="HDFS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"/>
-        </antcall>
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="HDFS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.hdfs.HDFSOutputConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConfig.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConfig.java
deleted file mode 100644
index cb1da57..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConfig.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id: FileOutputConfig.java 1299512 2013-05-31 22:59:38Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-
-import java.util.Locale;
-
-
-public class HDFSOutputConfig extends HDFSOutputParam {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = -2062295503498352538L;
-
-  /** Parameters used for the configuration */
-  final private static ParameterEnum[] CONFIGURATIONLIST = {
-    ParameterEnum.namenodeprotocol,
-    ParameterEnum.namenodehost,
-    ParameterEnum.namenodeport,
-    ParameterEnum.user
-  };
-
-  /** Build a set of ElasticSearchParameters by reading ConfigParams. If the
-   * value returned by ConfigParams.getParameter is null, the default value is
-   * set.
-   * 
-   * @param params
-   */
-  public HDFSOutputConfig(ConfigParams params)
-  {
-    super(CONFIGURATIONLIST);
-    for (ParameterEnum param : CONFIGURATIONLIST) {
-      String value = params.getParameter(param.name());
-      if (value == null) {
-        value = param.defaultValue;
-      }
-      put(param, value);
-    }
-  }
-
-  /**
-   * @param variableContext
-   * @param parameters
-   */
-  public final static void contextToConfig(IPostParameters variableContext, ConfigParams parameters) {
-    for (ParameterEnum param : CONFIGURATIONLIST) {
-      String p = variableContext.getParameter(param.name().toLowerCase(Locale.ROOT));
-      if (p != null) {
-        parameters.setParameter(param.name(), p);
-      }
-    }
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java
deleted file mode 100644
index d991d57..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java
+++ /dev/null
@@ -1,960 +0,0 @@
-/* $Id: FileOutputConnector.java 991374 2013-05-31 23:04:08Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.InputStream;
-import java.io.BufferedReader;
-import java.io.StringReader;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.commons.io.IOUtils;
-
-import org.apache.hadoop.fs.FSDataOutputStream;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.agents.system.Logging;
-import org.apache.manifoldcf.agents.output.BaseOutputConnector;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-
-public class HDFSOutputConnector extends BaseOutputConnector {
-
-  public static final String _rcsid = "@(#)$Id: FileOutputConnector.java 988245 2010-08-23 18:39:35Z minoru $";
-
-  // Activities we log
-
-  /** Ingestion activity */
-  public final static String INGEST_ACTIVITY = "document ingest";
-  /** Document removal activity */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-
-  // Activities list
-  protected static final String[] activitiesList = new String[]{INGEST_ACTIVITY, REMOVE_ACTIVITY};
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIGURATION_HTML = "editConfiguration.html";
-
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-
-  /** Forward to the javascript to check the specification parameters for the job */
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-
-  /** Forward to the template to edit the configuration parameters for the job */
-  private static final String EDIT_SPECIFICATION_HTML = "editSpecification.html";
-
-  /** Forward to the template to view the specification parameters for the job */
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  protected String nameNodeProtocol = null;
-  protected String nameNodeHost = null;
-  protected String nameNodePort = null;
-  protected String user = null;
-  protected HDFSSession session = null;
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-
-  /** Constructor.
-   */
-  public HDFSOutputConnector() {
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-   *@return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return activitiesList;
-  }
-
-  /** Connect.
-   *@param configParameters is the set of configuration parameters, which
-   * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-   * out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    nameNodeProtocol = configParams.getParameter(ParameterEnum.namenodeprotocol.name());
-    if (nameNodeProtocol == null)
-      nameNodeProtocol = "hdfs";
-    nameNodeHost = configParams.getParameter(ParameterEnum.namenodehost.name());
-    nameNodePort = configParams.getParameter(ParameterEnum.namenodeport.name());
-    user = configParams.getParameter(ParameterEnum.user.name());
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /** Close the connection.  Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    closeSession();
-    nameNodeProtocol = null;
-    nameNodeHost = null;
-    nameNodePort = null;
-    user = null;
-    super.disconnect();
-  }
-
-  /**
-   * @throws ManifoldCFException
-   */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      closeSession();
-    }
-  }
-
-  protected void closeSession()
-    throws ManifoldCFException {
-    if (session != null) {
-      try {
-        // This can in theory throw an IOException, so it is possible it is doing socket
-        // communication.  In practice, it's unlikely that there's any real IO, so I'm
-        // NOT putting it in a background thread for now.
-        session.close();
-      } catch (InterruptedIOException e) {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      } catch (IOException e) {
-        Logging.agents.warn("HDFS: Error closing connection: "+e.getMessage(),e);
-        // Eat the exception
-      } finally {
-        session = null;
-        lastSessionFetch = -1L;
-      }
-    }
-  }
-
-  /** Set up a session */
-  protected HDFSSession getSession() throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      if (nameNodeProtocol == null)
-        nameNodeProtocol = "hdfs";
-
-      if (nameNodeHost == null)
-        throw new ManifoldCFException("Namenodehost must be specified");
-
-      if (nameNodePort == null)
-        throw new ManifoldCFException("Namenodeport must be specified");
-      
-      if (user == null)
-        throw new ManifoldCFException("User must be specified");
-      
-      String nameNode = nameNodeProtocol + "://"+nameNodeHost+":"+nameNodePort;
-      //System.out.println("Namenode = '"+nameNode+"'");
-
-      /*
-       * get connection to HDFS
-       */
-      GetSessionThread t = new GetSessionThread(nameNode,user);
-      try {
-        t.start();
-        t.finishUp();
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-      } catch (java.net.SocketTimeoutException e) {
-        handleIOException(e);
-      } catch (InterruptedIOException e) {
-        t.interrupt();
-        handleIOException(e);
-      } catch (URISyntaxException e) {
-        handleURISyntaxException(e);
-      } catch (IOException e) {
-        handleIOException(e);
-      }
-      
-      session = t.getResult();
-    }
-    lastSessionFetch = System.currentTimeMillis();
-    return session;
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-   *@return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-   * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-   * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-   * is used to describe the version of the actual document.
-   *
-   * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-   * necessary.
-   *@param spec is the current output specification for the job that is doing the crawling.
-   *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-   * the document will not need to be sent again to the output data store.
-   */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec) throws ManifoldCFException, ServiceInterruption {
-    HDFSOutputSpecs specs = new HDFSOutputSpecs(getSpecNode(spec));
-    return new VersionContext(specs.toVersionString(),params,spec);
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException {
-    HDFSOutputSpecs specs = new HDFSOutputSpecs(getSpecNode(pipelineDescription.getSpecification()));
-    try {
-
-      /*
-       * make file path
-       */
-      StringBuffer strBuff = new StringBuffer();
-      if (specs.getRootPath() != null) {
-        strBuff.append(specs.getRootPath());
-      }
-      strBuff.append("/");
-      strBuff.append(documentURItoFilePath(documentURI));
-      Path path = new Path(strBuff.toString());
-
-      Long startTime = new Long(System.currentTimeMillis());
-      createFile(path, document.getBinaryStream(),activities,documentURI);
-      activities.recordActivity(startTime, INGEST_ACTIVITY, new Long(document.getBinaryLength()), documentURI, "OK", null);
-      return DOCUMENTSTATUS_ACCEPTED;
-    } catch (URISyntaxException e) {
-      activities.recordActivity(null,INGEST_ACTIVITY,new Long(document.getBinaryLength()),documentURI,e.getClass().getSimpleName().toUpperCase(Locale.ROOT),"Failed to write document due to: " + e.getMessage());
-      handleURISyntaxException(e);
-      return DOCUMENTSTATUS_REJECTED;
-    }
-
-  }
-
-  /** Remove a document using the connector.
-   * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-   *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-   * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-   *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-   *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-   */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities) throws ManifoldCFException, ServiceInterruption {
-
-    try {
-      HDFSOutputSpecs specs = new HDFSOutputSpecs(outputDescription);
-
-      /*
-       * make path
-       */
-      StringBuffer strBuff = new StringBuffer();
-      if (specs.getRootPath() != null) {
-        strBuff.append(specs.getRootPath());
-      }
-      strBuff.append("/");
-      strBuff.append(documentURItoFilePath(documentURI));
-      Path path = new Path(strBuff.toString());
-      Long startTime = new Long(System.currentTimeMillis());
-      deleteFile(path,activities,documentURI);
-      activities.recordActivity(startTime, REMOVE_ACTIVITY, null, documentURI, "OK", null);
-    } catch (URISyntaxException e) {
-      activities.recordActivity(null,REMOVE_ACTIVITY,null,documentURI,e.getClass().getSimpleName().toUpperCase(Locale.ROOT),"Failed to delete document due to: " + e.getMessage());
-      handleURISyntaxException(e);
-    }
-  }
-
-  /** Output the configuration header section.
-   * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-   * javascript methods that might be needed by the configuration editing HTML.
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException {
-    super.outputConfigurationHeader(threadContext, out, locale, parameters, tabsArray);
-    tabsArray.add(Messages.getString(locale,"HDFSOutputConnector.ServerTabName"));
-    outputResource(EDIT_CONFIGURATION_JS, out, locale, null, null, null, null);
-  }
-
-  /** Output the configuration body section.
-   * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-   * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-   * form is "editconnection".
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@param tabName is the current tab name.
-   */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName) throws ManifoldCFException, IOException {
-    super.outputConfigurationBody(threadContext, out, locale, parameters, tabName);
-    HDFSOutputConfig config = this.getConfigParameters(parameters);
-    outputResource(EDIT_CONFIGURATION_HTML, out, locale, config, tabName, null, null);
-  }
-
-  /** Process a configuration post.
-   * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-   * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-   * The name of the posted form is "editconnection".
-   *@param threadContext is the local thread context.
-   *@param variableContext is the set of variables available from the post, including binary file post information.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters) throws ManifoldCFException {
-    HDFSOutputConfig.contextToConfig(variableContext, parameters);
-    return null;
-  }
-
-  /** View configuration.
-   * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-   * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    outputResource(VIEW_CONFIGURATION_HTML, out, locale, getConfigParameters(parameters), null, null, null);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    super.outputSpecificationHeader(out, locale, os, connectionSequenceNumber, tabsArray);
-    tabsArray.add(Messages.getString(locale, "HDFSOutputConnector.PathTabName"));
-    outputResource(EDIT_SPECIFICATION_JS, out, locale, null, null, new Integer(connectionSequenceNumber), null);
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-    super.outputSpecificationBody(out, locale, os, connectionSequenceNumber, actualSequenceNumber, tabName);
-    HDFSOutputSpecs specs = getSpecParameters(os);
-    outputResource(EDIT_SPECIFICATION_HTML, out, locale, specs, tabName, new Integer(connectionSequenceNumber), new Integer(actualSequenceNumber));
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    ConfigurationNode specNode = getSpecNode(os);
-    boolean bAdd = (specNode == null);
-    if (bAdd) {
-      specNode = new SpecificationNode(ParameterEnum.rootpath.name());
-    }
-    HDFSOutputSpecs.contextToSpecNode(variableContext, specNode, connectionSequenceNumber);
-    if (bAdd) {
-      os.addChild(os.getChildCount(), specNode);
-    }
-
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-    outputResource(VIEW_SPECIFICATION_HTML, out, locale, getSpecParameters(os), null, new Integer(connectionSequenceNumber), null);
-  }
-
-  /**
-   * @param os
-   * @return
-   */
-  final private SpecificationNode getSpecNode(Specification os)
-  {
-    int l = os.getChildCount();
-    for (int i = 0; i < l; i++) {
-      SpecificationNode node = os.getChild(i);
-      if (node.getType().equals(ParameterEnum.rootpath.name())) {
-        return node;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @param os
-   * @return
-   * @throws ManifoldCFException
-   */
-  final private HDFSOutputSpecs getSpecParameters(Specification os) throws ManifoldCFException {
-    return new HDFSOutputSpecs(getSpecNode(os));
-  }
-
-  /**
-   * @param configParams
-   * @return
-   */
-  final private HDFSOutputConfig getConfigParameters(ConfigParams configParams) {
-    if (configParams == null)
-      configParams = getConfiguration();
-    return new HDFSOutputConfig(configParams);
-  }
-
-  /** Read the content of a resource, replace the variable ${PARAMNAME} with the
-   * value and copy it to the out.
-   * 
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException */
-  private static void outputResource(String resName, IHTTPOutput out, Locale locale, HDFSOutputParam params, String tabName, Integer sequenceNumber, Integer actualSequenceNumber) throws ManifoldCFException {
-    Map<String,String> paramMap = null;
-    if (params != null) {
-      paramMap = params.buildMap();
-      if (tabName != null) {
-        paramMap.put("TabName", tabName);
-      }
-      if (actualSequenceNumber != null)
-        paramMap.put("SelectedNum",actualSequenceNumber.toString());
-    }
-    else
-    {
-      paramMap = new HashMap<String,String>();
-    }
-    if (sequenceNumber != null)
-      paramMap.put("SeqNum",sequenceNumber.toString());
-    Messages.outputResourceWithVelocity(out, locale, resName, paramMap, true);
-  }
-
-  /**
-   * @param documentURI
-   * @return
-   * @throws URISyntaxException
-   */
-  final private String documentURItoFilePath(String documentURI) throws URISyntaxException {
-    StringBuffer path = new StringBuffer();
-    URI uri = null;
-
-    uri = new URI(documentURI);
-
-    if (uri.getScheme() != null) {
-      path.append(uri.getScheme());
-      path.append("/");
-    }
-
-    if (uri.getHost() != null) {
-      path.append(uri.getHost());
-      if (uri.getPort() != -1) {
-        path.append(":");
-        path.append(Integer.toString(uri.getPort()));
-      }
-      if (uri.getRawPath() != null) {
-        if (uri.getRawPath().length() == 0) {
-          path.append("/");
-        } else if (uri.getRawPath().equals("/")) {
-          path.append(uri.getRawPath());
-        } else {
-          for (String name : uri.getRawPath().split("/")) {
-            if (name != null && name.length() > 0) {
-              path.append("/");
-              path.append(name);
-            }
-          }
-        }
-      }
-      if (uri.getRawQuery() != null) {
-        path.append("?");
-        path.append(uri.getRawQuery());
-      }
-    } else {
-      if (uri.getRawSchemeSpecificPart() != null) {
-        for (String name : uri.getRawSchemeSpecificPart().split("/")) {
-          if (name != null && name.length() > 0) {
-            path.append("/");
-            path.append(name);
-          }
-        }
-      }
-    }
-
-    if (path.toString().endsWith("/")) {
-      path.append(".content");
-    }
-    return path.toString();
-  }
-  
-  /** Handle URISyntaxException */
-  protected static void handleURISyntaxException(URISyntaxException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.agents.error("Namenode URI is malformed: "+e.getMessage(),e);
-    throw new ManifoldCFException("Namenode URI is malformed: "+e.getMessage(),e);
-  }
-  
-  /** Handle IOException */
-  protected static void handleIOException(IOException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    }
-    long currentTime = System.currentTimeMillis();
-    Logging.agents.warn("HDFS output connection: IO exception: "+e.getMessage(),e);
-    throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L,-1,false);
-  }
-
-  protected static class CreateFileThread extends Thread {
-    protected final HDFSSession session;
-    protected final Path path;
-    protected final InputStream input;
-    protected Throwable exception = null;
-
-    public CreateFileThread(HDFSSession session, Path path, InputStream input) {
-      super();
-      this.session = session;
-      this.path = path;
-      this.input = input;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.createFile(path,input);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp() throws InterruptedException, IOException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-  }
-
-  protected void createFile(Path path, InputStream input,IOutputAddActivity activities, String documentURI)
-    throws ManifoldCFException, ServiceInterruption {
-    CreateFileThread t = new CreateFileThread(getSession(), path, input);
-    String errorCode = null;
-    String errorDesc = null;
-    try {
-      t.start();
-      t.finishUp();
-    } catch (InterruptedException e) {
-      t.interrupt();
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleIOException(e);
-    } catch (IOException e) {
-      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-      errorDesc = "Failed to write document due to: " + e.getMessage();
-      handleIOException(e);
-    } finally {
-      if(errorCode != null & errorDesc != null){
-        activities.recordActivity(null,INGEST_ACTIVITY,null,documentURI,errorCode,errorDesc);
-      }
-    }
-  }
-
-  protected static class DeleteFileThread extends Thread {
-    protected final HDFSSession session;
-    protected final Path path;
-    protected Throwable exception = null;
-
-    public DeleteFileThread(HDFSSession session, Path path) {
-      super();
-      this.session = session;
-      this.path = path;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.deleteFile(path);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp() throws InterruptedException, IOException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-  }
-
-  protected void deleteFile(Path path,IOutputRemoveActivity activities,String documentURI)
-    throws ManifoldCFException, ServiceInterruption {
-    // Establish a session
-    DeleteFileThread t = new DeleteFileThread(getSession(),path);
-    String errorCode = null;
-    String errorDesc = null;
-    try {
-      t.start();
-      t.finishUp();
-    } catch (InterruptedException e) {
-        t.interrupt();
-        errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-        errorDesc = "Failed to write document due to: " + e.getMessage();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-        errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-        errorDesc = "Failed to write document due to: " + e.getMessage();
-        handleIOException(e);
-    } catch (InterruptedIOException e) {
-        t.interrupt();
-        errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-        errorDesc = "Failed to write document due to: " + e.getMessage();
-        handleIOException(e);
-    } catch (IOException e) {
-        errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-        errorDesc = "Failed to write document due to: " + e.getMessage();
-        handleIOException(e);
-    } finally {
-        if(errorCode != null & errorDesc != null){
-            activities.recordActivity(null,REMOVE_ACTIVITY,null,documentURI,errorCode,errorDesc);
-        }
-    }
-  }
-
-
-  protected static class CheckConnectionThread extends Thread {
-    protected final HDFSSession session;
-    protected Throwable exception = null;
-
-    public CheckConnectionThread(HDFSSession session) {
-      super();
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.getRepositoryInfo();
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp() throws InterruptedException, IOException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-  }
-
-  /**
-   * @throws ManifoldCFException
-   * @throws ServiceInterruption
-   */
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    CheckConnectionThread t = new CheckConnectionThread(getSession());
-    try {
-      t.start();
-      t.finishUp();
-      return;
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      handleIOException(e);
-    } catch (IOException e) {
-      handleIOException(e);
-    }
-  }
-
-  protected static class GetSessionThread extends Thread {
-    protected final String nameNode;
-    protected final String user;
-    protected Throwable exception = null;
-    protected HDFSSession session = null;
-
-    public GetSessionThread(String nameNode, String user) {
-      super();
-      this.nameNode = nameNode;
-      this.user = user;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        // Create a session
-        session = new HDFSSession(nameNode, user);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, IOException, URISyntaxException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof URISyntaxException) {
-          throw (URISyntaxException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-    
-    public HDFSSession getResult() {
-      return session;
-    }
-  }
-
-  public static class HDFSOutputSpecs extends HDFSOutputParam {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1145652730572662025L;
-
-    final public static ParameterEnum[] SPECIFICATIONLIST = {
-      ParameterEnum.rootpath
-    };
-
-    private final String rootPath;
-
-    /** Build a set of ElasticSearch parameters by reading an JSON object
-     * 
-     * @param json
-     * @throws JSONException
-     * @throws ManifoldCFException
-     */
-    public HDFSOutputSpecs(String versionString) throws ManifoldCFException {
-      super(SPECIFICATIONLIST);
-      int index = 0;
-      StringBuilder rootPathBuffer = new StringBuilder();
-      index = unpack(rootPathBuffer,versionString,index,'+');
-      this.rootPath = rootPathBuffer.toString();
-      // MHL
-    }
-
-    /** Build a set of ElasticSearch parameters by reading an instance of
-     * SpecificationNode.
-     * 
-     * @param node
-     * @throws ManifoldCFException
-     */
-    public HDFSOutputSpecs(ConfigurationNode node) throws ManifoldCFException {
-      super(SPECIFICATIONLIST);
-      String rootPath = null;
-      for (ParameterEnum param : SPECIFICATIONLIST) {
-        String value = null;
-        if (node != null) {
-          value = node.getAttributeValue(param.name());
-        }
-        if (value == null) {
-          value = param.defaultValue;
-        }
-        put(param, value);
-      }
-      rootPath = getRootPath();
-      this.rootPath = rootPath;
-    }
-
-    /**
-      * @param variableContext
-      * @param specNode
-      */
-    public static void contextToSpecNode(IPostParameters variableContext, ConfigurationNode specNode, int sequenceNumber) {
-      for (ParameterEnum param : SPECIFICATIONLIST) {
-        String p = variableContext.getParameter("s"+sequenceNumber+"_"+param.name().toLowerCase(Locale.ROOT));
-        if (p != null) {
-          specNode.setAttribute(param.name(), p);
-        }
-      }
-    }
-
-    /** @return a JSON representation of the parameter list */
-    public String toVersionString() {
-      StringBuilder sb = new StringBuilder();
-      pack(sb,rootPath,'+');
-      return sb.toString();
-    }
-
-    /**
-     * @return
-     */
-    public String getRootPath() {
-      return get(ParameterEnum.rootpath);
-    }
-
-    /**
-     * @param content
-     * @return
-     * @throws ManifoldCFException
-     */
-    private final static TreeSet<String> createStringSet(String content) throws ManifoldCFException {
-      TreeSet<String> set = new TreeSet<String>();
-      BufferedReader br = null;
-      StringReader sr = null;
-      try {
-        sr = new StringReader(content);
-        br = new BufferedReader(sr);
-        String line = null;
-        while ((line = br.readLine()) != null) {
-          line = line.trim();
-          if (line.length() > 0) {
-            set.add(line);
-          }
-        }
-        return set;
-      } catch (IOException e) {
-        throw new ManifoldCFException(e.getMessage(),e);
-      } finally {
-        if (br != null) {
-          IOUtils.closeQuietly(br);
-        }
-      }
-    }
-
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputParam.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputParam.java
deleted file mode 100644
index ac2a76f..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputParam.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: FileOutputParam.java 1299512 2013-05-31 22:59:38Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/** 
- * Parameters data for the elasticsearch output connector.
- */
-public class HDFSOutputParam extends HashMap<ParameterEnum, String>
-{
-
-  private static final long serialVersionUID = -140994685772720029L;
-
-  protected HDFSOutputParam(ParameterEnum[] params) {
-    super(params.length);
-  }
-
-  final public Map<String, String> buildMap() {
-    Map<String, String> rval = new HashMap<String, String>();
-    for (Map.Entry<ParameterEnum, String> entry : this.entrySet()) {
-      rval.put(entry.getKey().name(), entry.getValue());
-    }
-    return rval;
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSSession.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSSession.java
deleted file mode 100644
index 93b7d07..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSSession.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/* $Id$ */
-
-/**
-* 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.
-*/
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FSDataOutputStream;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.manifoldcf.core.common.*;
-
-import java.io.InputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- */
-public class HDFSSession {
-
-  private final FileSystem fileSystem;
-  private final String nameNode;
-  private final Configuration config;
-  private final String user;
-  
-  public HDFSSession(String nameNode, String user) throws URISyntaxException, IOException, InterruptedException {
-    this.nameNode = nameNode;
-    this.user = user;
-    // Switch class loaders so that scheme registration works properly
-    ClassLoader ocl = Thread.currentThread().getContextClassLoader();
-    try {
-      Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-      config = new Configuration();
-      config.set("fs.defaultFS", nameNode);
-      fileSystem = FileSystem.get(new URI(nameNode), config, user);
-    } finally {
-      Thread.currentThread().setContextClassLoader(ocl);
-    }
-  }
-
-  public Map<String, String> getRepositoryInfo() {
-    Map<String, String> info = new HashMap<String, String>();
-
-    info.put("Name Node", nameNode);
-    info.put("Config", config.toString());
-    info.put("User", user);
-    info.put("Canonical Service Name", fileSystem.getCanonicalServiceName());
-    //info.put("Default Block Size", Long.toString(fileSystem.getDefaultBlockSize()));
-    //info.put("Default Replication", Short.toString(fileSystem.getDefaultReplication()));
-    //info.put("Home Directory", fileSystem.getHomeDirectory().toUri().toString());
-    //info.put("Working Directory", fileSystem.getWorkingDirectory().toUri().toString());
-    return info;
-  }
-
-  public void deleteFile(Path path)
-    throws IOException {
-    if (fileSystem.exists(path)) {
-      fileSystem.delete(path, true);
-    }
-  }
-
-  public void createFile(Path path, InputStream input)
-    throws IOException {
-    /*
-      * make directory
-      */
-    if (!fileSystem.exists(path.getParent())) {
-      fileSystem.mkdirs(path.getParent());
-    }
-
-    /*
-      * delete old file
-      */
-    if (fileSystem.exists(path)) {
-      fileSystem.delete(path, true);
-    }
-
-    FSDataOutputStream output = fileSystem.create(path);
-    try {
-      /*
-       * write file
-       */
-      byte buf[] = new byte[65536];
-      int len;
-      while((len = input.read(buf)) != -1) {
-        output.write(buf, 0, len);
-      }
-      output.flush();
-    } finally {
-      output.close();
-    }
-
-    // Do NOT close input; it's closed by the caller.
-  }
-
-  public URI getUri() {
-    return fileSystem.getUri();
-  }
-
-  public void close() throws IOException {
-    fileSystem.close();
-  }
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/Messages.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/Messages.java
deleted file mode 100644
index 051b614..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1295926 2013-05-31 23:00:00Z minoru $ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.hdfs.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.output.hdfs";
-
-  /** Constructor - do no instantiate
-   */
-  protected Messages()
-  {
-  }
-
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String,String> substitutionParameters, boolean mapToUpperCase)
-          throws ManifoldCFException
-          {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-        substitutionParameters,mapToUpperCase);
-          }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String,String> substitutionParameters, boolean mapToUpperCase)
-          throws ManifoldCFException
-          {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-        substitutionParameters,mapToUpperCase);
-          }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String,Object> contextObjects)
-          throws ManifoldCFException
-          {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-        contextObjects);
-          }
-
-}
-
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/ParameterEnum.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/ParameterEnum.java
deleted file mode 100644
index 8b5454e..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/ParameterEnum.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/** Parameters constants */
-public enum ParameterEnum {
-  namenodeprotocol("hdfs"),
-  namenodehost("localhost"),
-  namenodeport("9000"),
-  user(""),
-  rootpath("");
-
-  final protected String defaultValue;
-
-  private ParameterEnum(String defaultValue) {
-    this.defaultValue = defaultValue;
-  }
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java
deleted file mode 100644
index b48bb13..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java
+++ /dev/null
@@ -1,1982 +0,0 @@
-/* $Id: FileConnector.java 995085 2010-09-08 15:13:38Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.Path;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.connectors.hdfs.HDFSSession;
-import org.apache.manifoldcf.crawler.connectors.hdfs.Messages;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.connectorcommon.common.XThreadInputStream;
-import org.apache.manifoldcf.connectorcommon.common.XThreadStringBuffer;
-import org.apache.manifoldcf.connectorcommon.extmimemap.ExtensionMimeMap;
-
-import java.util.*;
-import java.io.*;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/** This is the "repository connector" for a file system.  It's a relative of the share crawler, and should have
- * comparable basic functionality, with the exception of the ability to use ActiveDirectory and look at other shares.
- */
-public class HDFSRepositoryConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: FileConnector.java 995085 2010-09-08 15:13:38Z kwright $";
-
-  // Activities that we know about
-  protected final static String ACTIVITY_READ = "read document";
-
-  // Relationships we know about
-  protected static final String RELATIONSHIP_CHILD = "child";
-
-  // Activities list
-  protected static final String[] activitiesList = new String[]{ACTIVITY_READ};
-
-  protected String nameNodeProtocol = null;
-  protected String nameNodeHost = null;
-  protected String nameNodePort = null;
-  protected String user = null;
-  protected HDFSSession session = null;
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-
-  /*
-   * Constructor.
-   */
-  public HDFSRepositoryConnector()
-  {
-  }
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-   * This must return a model value as specified above.
-   *@return the model type value.
-   */
-  @Override
-  public int getConnectorModel()
-  {
-    return MODEL_CHAINED_ADD_CHANGE;
-  }
-
-  /** Return the list of relationship types that this connector recognizes.
-   *@return the list.
-   */
-  @Override
-  public String[] getRelationshipTypes()
-  {
-    return new String[]{RELATIONSHIP_CHILD};
-  }
-
-  /** List the activities we might report on.
-   */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** For any given document, list the bins that it is a member of.
-   */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    return new String[]{nameNodeHost};
-  }
-
-  /**
-   * Get the maximum number of documents to amalgamate together into one
-   * batch, for this connector.
-   *
-   * @return the maximum number. 0 indicates "unlimited".
-   */
-  @Override
-  public int getMaxDocumentRequest() {
-    return 1;
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.manifoldcf.core.connector.BaseConnector#connect(org.apache.manifoldcf.core.interfaces.ConfigParams)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    nameNodeProtocol = configParams.getParameter("namenodeprotocol");
-    if (nameNodeProtocol == null)
-      nameNodeProtocol = "hdfs";
-    nameNodeHost = configParams.getParameter("namenodehost");
-    nameNodePort = configParams.getParameter("namenodeport");
-    user = configParams.getParameter("user");
-    
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.manifoldcf.core.connector.BaseConnector#disconnect()
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    closeSession();
-    user = null;
-    nameNodeProtocol = null;
-    nameNodeHost = null;
-    nameNodePort = null;
-    super.disconnect();
-  }
-
-  /**
-   * Set up a session
-   */
-  protected HDFSSession getSession() throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-      if (StringUtils.isEmpty(nameNodeProtocol)) {
-        throw new ManifoldCFException("Parameter namenodeprotocol required but not set");
-      }
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("HDFS: NameNodeProtocol = '" + nameNodeProtocol + "'");
-      }
-      if (StringUtils.isEmpty(nameNodeHost)) {
-        throw new ManifoldCFException("Parameter namenodehost required but not set");
-      }
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("HDFS: NameNodeHost = '" + nameNodeHost + "'");
-      }
-      if (StringUtils.isEmpty(nameNodePort)) {
-        throw new ManifoldCFException("Parameter namenodeport required but not set");
-      }
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("HDFS: NameNodePort = '" + nameNodePort + "'");
-      }
-
-      if (StringUtils.isEmpty(user)) {
-        throw new ManifoldCFException("Parameter user required but not set");
-      }
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("HDFS: User = '" + user + "'");
-      }
-
-      String nameNode = nameNodeProtocol+"://"+nameNodeHost+":"+nameNodePort;
-
-      GetSessionThread t = new GetSessionThread(nameNode,user);
-      try {
-        t.start();
-        t.finishUp();
-      } catch (InterruptedException e) {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-      } catch (java.net.SocketTimeoutException e) {
-        handleIOException(e);
-      } catch (InterruptedIOException e) {
-        t.interrupt();
-        handleIOException(e);
-      } catch (URISyntaxException e) {
-        handleURISyntaxException(e);
-      } catch (IOException e) {
-        handleIOException(e);
-      }
-      session = t.getResult();
-    }
-    lastSessionFetch = System.currentTimeMillis();
-    return session;
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection
-   * integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /**
-   * @throws ManifoldCFException
-   */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      closeSession();
-    }
-  }
-
-  protected void closeSession()
-    throws ManifoldCFException {
-    if (session != null) {
-      try {
-        // This can in theory throw an IOException, so it is possible it is doing socket
-        // communication.  In practice, it's unlikely that there's any real IO, so I'm
-        // NOT putting it in a background thread for now.
-        session.close();
-      } catch (InterruptedIOException e) {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      } catch (IOException e) {
-        Logging.connectors.warn("HDFS: Error closing connection: "+e.getMessage(),e);
-        // Eat the exception
-      } finally {
-        session = null;
-        lastSessionFetch = -1L;
-      }
-    }
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {
-
-    String path = StringUtils.EMPTY;
-    int i = 0;
-    while (i < spec.getChildCount()) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals("startpoint")) {
-        path = sn.getAttributeValue("path");
-        
-        FileStatus fileStatus = getObject(new Path(path));
-        if (fileStatus.isDirectory()) {
-          activities.addSeedDocument(fileStatus.getPath().toUri().toString());
-        }
-      }
-      i++;
-    }
-    return "";
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption {
-      
-    for (String documentIdentifier : documentIdentifiers) {
-      
-      String versionString;
-      
-      FileStatus fileStatus = getObject(new Path(documentIdentifier));
-      if (fileStatus != null) {
-        
-        boolean isDirectory = fileStatus.isDirectory();
-        
-        if (isDirectory) {
-          // If HDFS directory modify dates are transitive, as they are on Unix,
-          // then getting the modify date of the current version is sufficient
-          // to detect any downstream changes we need to be aware of.
-          // (If this turns out to be a bad assumption, this should simply set rval[i] ="").
-          long lastModified = fileStatus.getModificationTime();
-          versionString = new Long(lastModified).toString();
-          
-          if (activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)) {
-            // Process directory!
-            String entityReference = documentIdentifier;
-            FileStatus[] fileStatuses = getChildren(fileStatus.getPath());
-            if (fileStatuses == null) {
-              continue;
-            }
-            for (int j = 0; j < fileStatuses.length; j++) {
-              FileStatus fs = fileStatuses[j++];
-              String canonicalPath = fs.getPath().toString();
-              if (checkInclude(session.getUri().toString(),fs,canonicalPath,spec)) {
-                activities.addDocumentReference(canonicalPath,documentIdentifier,RELATIONSHIP_CHILD);
-              }
-            }
-          }
-        } else {
-          long lastModified = fileStatus.getModificationTime();
-          StringBuilder sb = new StringBuilder();
-          // Check if the path is to be converted.  We record that info in the version string so that we'll reindex documents whose
-          // URI's change.
-          String nameNode = nameNodeProtocol + "://" + nameNodeHost + ":" + nameNodePort;
-          String convertPath = findConvertPath(nameNode, spec, fileStatus.getPath());
-          if (convertPath != null)
-          {
-            // Record the path.
-            sb.append("+");
-            pack(sb,convertPath,'+');
-          }
-          else
-            sb.append("-");
-          sb.append(new Long(lastModified).toString());
-          versionString = sb.toString();
-          // We will record document fetch as an activity
-          long startTime = System.currentTimeMillis();
-          String errorCode = null;
-          String errorDesc = null;
-          long fileSize = 0;
-          
-          if (activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)) {
-            // Process file!
-            if (!checkIngest(session.getUri().toString(),fileStatus,spec)) {
-              activities.noDocument(documentIdentifier,versionString);
-              continue;
-            }
-
-            // It is a file to be indexed.
-            long fileLength = fileStatus.getLen();
-            String fileName = fileStatus.getPath().getName();
-            String mimeType = mapExtensionToMimeType(fileStatus.getPath().getName());
-            Date modifiedDate = new Date(fileStatus.getModificationTime());
-            try {
-                String uri;
-                if (convertPath != null) {
-                    uri = convertToWGETURI(convertPath);
-                } else {
-                    uri = fileStatus.getPath().toUri().toString();
-                }
-            
-                if (!activities.checkLengthIndexable(fileLength))
-                {
-                    errorCode = activities.EXCLUDED_LENGTH;
-                    errorDesc = "Excluding document because of file length ('"+fileLength+"')";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                }
-            
-                if (!activities.checkURLIndexable(uri))
-                {
-                    errorCode = activities.EXCLUDED_URL;
-                    errorDesc = "Excluding document because of URL ('"+uri+"')";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                }
-            
-                if (!activities.checkMimeTypeIndexable(mimeType))
-                {
-                    errorCode = activities.EXCLUDED_MIMETYPE;
-                    errorDesc = "Excluding document because of mime type ("+mimeType+")";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                }
-            
-                if (!activities.checkDateIndexable(modifiedDate))
-                {
-                    errorCode = activities.EXCLUDED_DATE;
-                    errorDesc = "Excluding document because of date ("+modifiedDate+")";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                }
-            
-                // Prepare the metadata part of RepositoryDocument
-                RepositoryDocument data = new RepositoryDocument();
-
-                data.setFileName(fileName);
-                data.setMimeType(mimeType);
-                data.setModifiedDate(modifiedDate);
-
-                data.addField("uri",uri);
-
-            
-            
-                BackgroundStreamThread t = new BackgroundStreamThread(getSession(),new Path(documentIdentifier));
-                try {
-                    t.start();
-                    boolean wasInterrupted = false;
-                    try {
-                        InputStream is = t.getSafeInputStream();
-                        try {
-                            data.setBinary(is, fileSize);
-                            activities.ingestDocumentWithException(documentIdentifier,versionString,uri,data);
-                        } finally {
-                            is.close();
-                        }
-                    } catch (java.net.SocketTimeoutException e) {
-                        throw e;
-                    } catch (InterruptedIOException e) {
-                        wasInterrupted = true;
-                        throw e;
-                    } catch (ManifoldCFException e) {
-                        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED) {
-                            wasInterrupted = true;
-                        }
-                        throw e;
-                    } finally {
-                        if (!wasInterrupted) {
-                            // This does a join
-                            t.finishUp();
-                        }
-                    }
-
-                    // No errors.  Record the fact that we made it.
-                    errorCode = "OK";
-                    // Length we did in bytes
-                    fileSize = fileStatus.getLen();
-
-                } catch (InterruptedException e) {
-                    // We were interrupted out of the join, most likely.  Before we abandon the thread,
-                    // send a courtesy interrupt.
-                    t.interrupt();
-                    throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-                } catch (java.net.SocketTimeoutException e) {
-                    errorCode = "IOERROR";
-                    errorDesc = e.getMessage();
-                    handleIOException(e);
-                } catch (InterruptedIOException e) {
-                    t.interrupt();
-                    throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-                } catch (IOException e) {
-                    errorCode = "IOERROR";
-                    errorDesc = e.getMessage();
-                    handleIOException(e);
-                }
-            } finally {
-                if(errorCode != null){
-                    activities.recordActivity(new Long(startTime),ACTIVITY_READ,new Long(fileSize),documentIdentifier,errorCode,errorDesc,null);
-                }
-            }
-          }
-        }
-      } else {
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-    }
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-   * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-   * javascript methods that might be needed by the configuration editing HTML.
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"HDFSRepositoryConnector.ServerTabName"));
-    
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.namenodehost.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.NameNodeHostCannotBeNull")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.ServerTabName")+"\");\n"+
-"    editconnection.namenodehost.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.namenodeport.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.NameNodePortCannotBeNull")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.ServerTabName")+"\");\n"+
-"    editconnection.namenodeport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (!isInteger(editconnection.namenodeport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.NameNodePortMustBeAnInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.ServerTabName")+"\");\n"+
-"    editconnection.namenodeport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.user.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.UserCannotBeNull")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"HDFSRepositoryConnector.ServerTabName")+"\");\n"+
-"    editconnection.user.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String nameNodeProtocol = parameters.getParameter("namenodeprotocol");
-    if (nameNodeProtocol == null) {
-      nameNodeProtocol = "hdfs";
-    }
-    
-    String nameNodeHost = parameters.getParameter("namenodehost");
-    if (nameNodeHost == null) {
-      nameNodeHost = "localhost";
-    }
-    
-    String nameNodePort = parameters.getParameter("namenodeport");
-    if (nameNodePort == null) {
-      nameNodePort = "9000";
-    }
-
-    String user = parameters.getParameter("user");
-    if (user == null) {
-      user = "";
-    }
-    
-    if (tabName.equals(Messages.getString(locale,"HDFSRepositoryConnector.ServerTabName")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NameNodeProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"namenodeprotocol\" size=\"2\">\n"+
-"        <option value=\"file\"" + (nameNodeProtocol.equals("file")?" selected=\"true\"":"") + ">file</option>\n"+
-"        <option value=\"ftp\"" + (nameNodeProtocol.equals("ftp")?" selected=\"true\"":"") + ">ftp</option>\n"+
-"        <option value=\"har\"" + (nameNodeProtocol.equals("har")?" selected=\"true\"":"") + ">har</option>\n"+
-"        <option value=\"hdfs\"" + (nameNodeProtocol.equals("hdfs")?" selected=\"true\"":"") + ">hdfs</option>\n"+
-"        <option value=\"s3\"" + (nameNodeProtocol.equals("s3")?" selected=\"true\"":"") + ">s3</option>\n"+
-"        <option value=\"s3n\"" + (nameNodeProtocol.equals("s3n")?" selected=\"true\"":"") + ">s3n</option>\n"+
-"        <option value=\"viewfs\"" + (nameNodeProtocol.equals("viewfs")?" selected=\"true\"":"") + ">viewfs</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NameNodeHost") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"namenodehost\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodeHost)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NameNodePort") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"namenodeport\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodePort)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.User") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"user\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(user)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Server tab hiddens
-      out.print(
-"<input type=\"hidden\" name=\"namenodeprotocol\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodeProtocol)+"\"/>\n"+
-"<input type=\"hidden\" name=\"namenodehost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodeHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"namenodeport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodePort)+"\"/>\n"+
-"<input type=\"hidden\" name=\"user\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(user)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-   * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-   * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-   * The name of the posted form is "editconnection".
-   *@param threadContext is the local thread context.
-   *@param variableContext is the set of variables available from the post, including binary file post information.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String nameNodeProtocol = variableContext.getParameter("namenodeprotocol");
-    if (nameNodeProtocol != null) {
-      parameters.setParameter("namenodeprotocol", nameNodeProtocol);
-    }
-    
-    String nameNodeHost = variableContext.getParameter("namenodehost");
-    if (nameNodeHost != null) {
-      parameters.setParameter("namenodehost", nameNodeHost);
-    }
-
-    String nameNodePort = variableContext.getParameter("namenodeport");
-    if (nameNodePort != null) {
-      parameters.setParameter("namenodeport", nameNodePort);
-    }
-
-    String user = variableContext.getParameter("user");
-    if (user != null) {
-      parameters.setParameter("user", user);
-    }
-
-    return null;
-  }
-  
-  /** View configuration.
-   * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-   * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    String nameNodeProtocol = parameters.getParameter("namenodeprotocol");
-    if (nameNodeProtocol == null)
-      nameNodeProtocol = "hdfs";
-
-    String nameNodeHost = parameters.getParameter("namenodehost");
-    String nameNodePort = parameters.getParameter("namenodeport");
-    String user = parameters.getParameter("user");
-    
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NameNodeProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodeProtocol)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NameNodeHost") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodeHost)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NameNodePort") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nameNodePort)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.User") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(user)+"</td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"HDFSRepositoryConnector.Paths"));
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-    int k;
-
-    // Paths tab
-    if (tabName.equals(Messages.getString(locale,"HDFSRepositoryConnector.Paths")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"3\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Paths2") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.RootPath") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.ConvertToURI") + "<br/>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.ConvertToURIExample")+ "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Rules") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("startpoint"))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          String pathOpName = seqPrefix+"specop"+pathDescription;
-          
-          String path = sn.getAttributeValue("path");
-          String convertToURIString = sn.getAttributeValue("converttouri");
-
-          boolean convertToURI = false;
-          if (convertToURIString != null && convertToURIString.equals("true"))
-            convertToURI = true;
-
-          out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <input type=\"hidden\" name=\""+pathOpName+"\" value=\"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sn.getAttributeValue("path"))+"\"/>\n"+
-"            <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Delete\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")' alt=\""+Messages.getAttributeString(locale,"HDFSRepositoryConnector.DeletePath")+Integer.toString(k)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(path)+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"converttouri"+pathDescription+"\" value=\""+(convertToURI?"true":"false")+"\">\n"+
-"            <nobr>\n"+
-"              "+(convertToURI?Messages.getBodyString(locale,"HDFSRepositoryConnector.Yes"):Messages.getBodyString(locale,"HDFSRepositoryConnector.No"))+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"specchildcount"+pathDescription+"\" value=\""+Integer.toString(sn.getChildCount())+"\"/>\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.IncludeExclude") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.FileDirectory") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Match") + "</nobr></td>\n"+
-"              </tr>\n"
-          );
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode excludeNode = sn.getChild(j);
-            String instanceDescription = "_"+Integer.toString(k)+"_"+Integer.toString(j);
-            String instanceOpName = seqPrefix + "specop" + instanceDescription;
-
-            String nodeFlavor = excludeNode.getType();
-            String nodeType = excludeNode.getAttributeValue("type");
-            String nodeMatch = excludeNode.getAttributeValue("match");
-            out.print(
-"              <tr class=\"evenformrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.InsertHere") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specop"+instanceDescription+"\",\"Insert Here\",\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j+1)+"\")' alt=\""+Messages.getAttributeString(locale,"HDFSRepositoryConnector.InsertNewMatchForPath")+Integer.toString(k)+" before position #"+Integer.toString(j)+"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"specflavor"+instanceDescription+"\">\n"+
-"                      <option value=\"include\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.include") + "</option>\n"+
-"                      <option value=\"exclude\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.exclude") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"spectype"+instanceDescription+"\">\n"+
-"                      <option value=\"file\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.File") + "</option>\n"+
-"                      <option value=\"directory\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Directory") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"text\" size=\"10\" name=\""+seqPrefix+"specmatch"+instanceDescription+"\" value=\"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"+
-"              <tr class=\"oddformrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"hidden\" name=\""+instanceOpName+"\" value=\"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specfl"+instanceDescription+"\" value=\""+nodeFlavor+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specty"+instanceDescription+"\" value=\""+nodeType+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specma"+instanceDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nodeMatch)+"\"/>\n"+
-"                    <a name=\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j)+"\">\n"+
-"                      <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+instanceOpName+"\",\"Delete\",\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j)+"\")' alt=\""+Messages.getAttributeString(locale,"HDFSRepositoryConnector.DeletePath")+Integer.toString(k)+", match spec #"+Integer.toString(j)+"\"/>\n"+
-"                    </a>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeFlavor+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeType+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(nodeMatch)+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"
-            );
-            j++;
-          }
-          if (j == 0)
-          {
-            out.print(
-"              <tr class=\"formrow\"><td class=\"formcolumnmessage\" colspan=\"4\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NoRulesDefined") + "</td></tr>\n"
-            );
-          }
-          out.print(
-"              <tr class=\"formrow\"><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"              <tr class=\"formrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <a name=\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j)+"\">\n"+
-"                    <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Add\",\""+seqPrefix+"match_"+Integer.toString(k)+"_"+Integer.toString(j+1)+"\")' alt=\""+Messages.getAttributeString(locale,"HDFSRepositoryConnector.AddNewMatchForPath")+Integer.toString(k)+"\"/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"specflavor"+pathDescription+"\">\n"+
-"                      <option value=\"include\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.include") + "</option>\n"+
-"                      <option value=\"exclude\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.exclude") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"spectype"+pathDescription+"\">\n"+
-"                      <option value=\"file\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.File") + "</option>\n"+
-"                      <option value=\"directory\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Directory") + "</option>\n"+
-"                    </select>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"text\" size=\"10\" name=\""+seqPrefix+"specmatch"+pathDescription+"\" value=\"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"+
-"            </table>\n"+
-"          </td>\n"+
-"        </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formcolumnmessage\" colspan=\"4\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NoDocumentsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"                <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specop\",\"Add\",\""+seqPrefix+"path_"+Integer.toString(i+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.AddNewPath") + "\"/>\n"+
-"                <input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"                <input type=\"hidden\" name=\""+seqPrefix+"specop\" value=\"\"/>\n"+
-"              </a>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <input type=\"text\" size=\"30\" name=\""+seqPrefix+"specpath\" value=\"\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <input name=\""+seqPrefix+"converttouri\" type=\"checkbox\" value=\"true\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("startpoint"))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          
-          String path = sn.getAttributeValue("path");
-          String convertToURIString = sn.getAttributeValue("converttouri");
-
-          boolean convertToURI = false;
-          if (convertToURIString != null && convertToURIString.equals("true"))
-            convertToURI = true;
-
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(path)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"converttouri"+pathDescription+"\" value=\""+(convertToURI?"true":"false")+"\">\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specchildcount"+pathDescription+"\" value=\""+Integer.toString(sn.getChildCount())+"\"/>\n"
-          );
-
-          int j = 0;
-	  while (j < sn.getChildCount())
-	  {
-            SpecificationNode excludeNode = sn.getChild(j);
-            String instanceDescription = "_"+Integer.toString(k)+"_"+Integer.toString(j);
-
-            String nodeFlavor = excludeNode.getType();
-            String nodeType = excludeNode.getAttributeValue("type");
-            String nodeMatch = excludeNode.getAttributeValue("match");
-            out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfl"+instanceDescription+"\" value=\""+nodeFlavor+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specty"+instanceDescription+"\" value=\""+nodeType+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specma"+instanceDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(nodeMatch)+"\"/>\n"
-            );
-            j++;
-          }
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String x = variableContext.getParameter(seqPrefix+"pathcount");
-    if (x != null)
-    {
-      ds.clearChildren();
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(x);
-      // Gather up these
-      int i = 0;
-      int k = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specop"+pathDescription;
-        x = variableContext.getParameter(pathOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Path inserts won't happen until the very end
-        String path = variableContext.getParameter(seqPrefix+"specpath"+pathDescription);
-        String convertToURI = variableContext.getParameter(seqPrefix+"converttouri"+pathDescription);
-
-        SpecificationNode node = new SpecificationNode("startpoint");
-        node.setAttribute("path",path);
-        if (convertToURI != null)
-          node.setAttribute("converttouri",convertToURI);
-
-        // Now, get the number of children
-        String y = variableContext.getParameter(seqPrefix+"specchildcount"+pathDescription);
-        int childCount = Integer.parseInt(y);
-        int j = 0;
-        int w = 0;
-        while (j < childCount)
-        {
-          String instanceDescription = "_"+Integer.toString(i)+"_"+Integer.toString(j);
-          // Look for an insert or a delete at this point
-          String instanceOp = seqPrefix+"specop"+instanceDescription;
-          String z = variableContext.getParameter(instanceOp);
-          String flavor;
-          String type;
-          String match;
-          SpecificationNode sn;
-          if (z != null && z.equals("Delete"))
-          {
-            // Process the deletion as we gather
-            j++;
-            continue;
-          }
-          if (z != null && z.equals("Insert Here"))
-          {
-            // Process the insertion as we gather.
-            flavor = variableContext.getParameter(seqPrefix+"specflavor"+instanceDescription);
-            type = variableContext.getParameter(seqPrefix+"spectype"+instanceDescription);
-            match = variableContext.getParameter(seqPrefix+"specmatch"+instanceDescription);
-            sn = new SpecificationNode(flavor);
-            sn.setAttribute("type",type);
-            sn.setAttribute("match",match);
-            node.addChild(w++,sn);
-          }
-          flavor = variableContext.getParameter(seqPrefix+"specfl"+instanceDescription);
-          type = variableContext.getParameter(seqPrefix+"specty"+instanceDescription);
-          match = variableContext.getParameter(seqPrefix+"specma"+instanceDescription);
-          sn = new SpecificationNode(flavor);
-          sn.setAttribute("type",type);
-          sn.setAttribute("match",match);
-          node.addChild(w++,sn);
-          j++;
-        }
-        if (x != null && x.equals("Add"))
-        {
-          // Process adds to the end of the rules in-line
-          String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-          String type = variableContext.getParameter(seqPrefix+"spectype"+pathDescription);
-          String flavor = variableContext.getParameter(seqPrefix+"specflavor"+pathDescription);
-          SpecificationNode sn = new SpecificationNode(flavor);
-          sn.setAttribute("type",type);
-          sn.setAttribute("match",match);
-          node.addChild(w,sn);
-        }
-        ds.addChild(k++,node);
-        i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"specop");
-      if (op != null && op.equals("Add"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        String convertToURI = variableContext.getParameter(seqPrefix+"converttouri");
-
-        SpecificationNode node = new SpecificationNode("startpoint");
-        node.setAttribute("path",path);
-        if (convertToURI != null)
-          node.setAttribute("converttouri",convertToURI);
-        
-        // Now add in the defaults; these will be "include all directories" and "include all files".
-        SpecificationNode sn = new SpecificationNode("include");
-        sn.setAttribute("type","file");
-        sn.setAttribute("match","*");
-        node.addChild(node.getChildCount(),sn);
-        sn = new SpecificationNode("include");
-        sn.setAttribute("type","directory");
-        sn.setAttribute("match","*");
-        node.addChild(node.getChildCount(),sn);
-
-        ds.addChild(k,node);
-      }
-    }
-    
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\">" + Messages.getAttributeString(locale,"HDFSRepositoryConnector.Paths2") + "</td>\n"+    
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.RootPath") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.ConvertToURI") + "<br/>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.ConvertToURIExample")+ "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Rules") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-    
-    int k = 0;
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("startpoint"))
-      {
-        String path = sn.getAttributeValue("path");
-        String convertToURIString = sn.getAttributeValue("converttouri");
-        boolean convertToURI = false;
-        if (convertToURIString != null && convertToURIString.equals("true"))
-          convertToURI = true;
-        
-        out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(path)+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+(convertToURI?Messages.getBodyString(locale,"HDFSRepositoryConnector.Yes"):Messages.getBodyString(locale,"HDFSRepositoryConnector.No"))+" \n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.IncludeExclude") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.FileDirectory") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"HDFSRepositoryConnector.Match") + "</nobr></td>\n"+
-"              </tr>\n"
-        );
-        
-        int l = 0;
-        for (int j = 0; j < sn.getChildCount(); j++)
-        {
-          SpecificationNode excludeNode = sn.getChild(j);
-
-          String nodeFlavor = excludeNode.getType();
-          String nodeType = excludeNode.getAttributeValue("type");
-          String nodeMatch = excludeNode.getAttributeValue("match");
-          out.print(
-"              <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeFlavor+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+nodeType+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr>\n"+
-"                    "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(nodeMatch)+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"
-          );
-          l++;
-        }
-
-        if (l == 0)
-        {
-          out.print(
-"              <tr><td class=\"formcolumnmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NoRulesDefined") + "</td></tr>\n"
-          );
-        }
-
-        out.print(
-"            </table>\n"+
-"           </td>\n"
-        );
-
-        out.print(
-"        </tr>\n"
-        );
-
-        k++;
-      }
-      
-    }
-
-    if (k == 0)
-    {
-      out.print(
-"        <tr><td class=\"formcolumnmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"HDFSRepositoryConnector.NoDocumentsSpecified") + "</td></tr>\n"
-      );
-    }
-    
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-    );
-
-    out.print(
-"</table>\n"
-    );
-    
-  }
-
-  // Protected static methods
-
-  /** Convert a path to an HDFS wget URI.  The URI is the URI that will be the unique key from
-  * the search index, and will be presented to the user as part of the search results.
-  *@param filePath is the document filePath.
-  *@param repositoryPath is the document repositoryPath.
-  *@return the document uri.
-  */
-  protected static String convertToWGETURI(String path)
-    throws ManifoldCFException
-  {
-    //
-    // Note well:  This MUST be a legal URI!!!
-    try
-    {
-      StringBuffer sb = new StringBuffer();
-      String[] tmp = path.split("/", 3);
-      String scheme = "";
-      String host = "";
-      String other = "";
-      if (tmp.length >= 1)
-        scheme = tmp[0];
-      else
-        scheme = "hdfs";
-      if (tmp.length >= 2)
-        host = tmp[1];
-      else
-        host = "localhost:9000";
-      if (tmp.length >= 3)
-        other = "/" + tmp[2];
-      else
-        other = "/";
-      return new URI(scheme + "://" + host + other).toURL().toString();
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad url: "+e.getMessage(),e);
-    }
-    catch (URISyntaxException e)
-    {
-      throw new ManifoldCFException("Bad url: "+e.getMessage(),e);
-    }
-  }
-
-  /** This method finds the part of the path that should be converted to a URI.
-  * Returns null if the path should not be converted.
-  *@param spec is the document specification.
-  *@param documentIdentifier is the document identifier.
-  *@return the part of the path to be converted, or null.
-  */
-  protected static String findConvertPath(String nameNode, Specification spec, Path theFile)
-  {
-    String fullpath = theFile.toString();
-    for (int j = 0; j < spec.getChildCount(); j++)
-    {
-      SpecificationNode sn = spec.getChild(j);
-      if (sn.getType().equals("startpoint"))
-      {
-        String path = sn.getAttributeValue("path");
-        String convertToURI = sn.getAttributeValue("converttouri");
-        if (path.length() > 0 && convertToURI != null && convertToURI.equals("true"))
-        {
-          path = nameNode + path;
-          if (!path.endsWith("/"))
-            path += "/";
-          if (fullpath.startsWith(path))
-            return fullpath.substring(path.length());
-        }
-      }
-    }
-    return null;
-  }
-
-  /** Map an extension to a mime type */
-  protected static String mapExtensionToMimeType(String fileName)
-  {
-    int slashIndex = fileName.lastIndexOf("/");
-    if (slashIndex != -1)
-      fileName = fileName.substring(slashIndex+1);
-    int dotIndex = fileName.lastIndexOf(".");
-    if (dotIndex == -1)
-      return null;
-    return ExtensionMimeMap.mapToMimeType(fileName.substring(dotIndex+1).toLowerCase(java.util.Locale.ROOT));
-  }
-
-  /** Check if a file or directory should be included, given a document specification.
-   *@param fileName is the canonical file name.
-   *@param documentSpecification is the specification.
-   *@return true if it should be included.
-   */
-  protected static boolean checkInclude(String nameNode, FileStatus fileStatus, String fileName, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-    {
-      Logging.connectors.debug("Checking whether to include file '"+fileName+"'");
-    }
-
-    String pathPart;
-    String filePart;
-    if (fileStatus.isDirectory())
-    {
-      pathPart = fileName;
-      filePart = null;
-    }
-    else
-    {
-      pathPart = fileStatus.getPath().getParent().toString();
-      filePart = fileStatus.getPath().getName();
-    }
-
-    // Scan until we match a startpoint
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i++);
-      if (sn.getType().equals("startpoint"))
-      {
-        String path = null;
-        try {
-			path = new URI(nameNode).resolve(sn.getAttributeValue("path")).toString();
-		} catch (URISyntaxException e) {
-			e.printStackTrace();
-		}
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Checking path '"+path+"' against canonical '"+pathPart+"'");
-        }
-        // Compare with filename
-        int matchEnd = matchSubPath(path,pathPart);
-        if (matchEnd == -1)
-        {
-          if (Logging.connectors.isDebugEnabled())
-          {
-            Logging.connectors.debug("Match check '"+path+"' against canonical '"+pathPart+"' failed");
-          }
-
-          continue;
-        }
-        // matchEnd is the start of the rest of the path (after the match) in fileName.
-        // We need to walk through the rules and see whether it's in or out.
-        int j = 0;
-        while (j < sn.getChildCount())
-        {
-          SpecificationNode node = sn.getChild(j++);
-          String flavor = node.getType();
-          String match = node.getAttributeValue("match");
-          String type = node.getAttributeValue("type");
-          // If type is "file", then our match string is against the filePart.
-          // If filePart is null, then this rule is simply skipped.
-          String sourceMatch;
-          int sourceIndex;
-          if (type.equals("file"))
-          {
-            if (filePart == null)
-            {
-              continue;
-            }
-            sourceMatch = filePart;
-            sourceIndex = 0;
-          }
-          else
-          {
-            if (filePart != null)
-            {
-              continue;
-            }
-            sourceMatch = pathPart;
-            sourceIndex = matchEnd;
-          }
-
-          if (flavor.equals("include"))
-          {
-            if (checkMatch(sourceMatch,sourceIndex,match))
-            {
-              return true;
-            }
-          }
-          else if (flavor.equals("exclude"))
-          {
-            if (checkMatch(sourceMatch,sourceIndex,match))
-            {
-              return false;
-            }
-          }
-        }
-      }
-    }
-    if (Logging.connectors.isDebugEnabled())
-    {
-      Logging.connectors.debug("Not including '"+fileName+"' because no matching rules");
-    }
-
-    return false;
-  }
-
-  /** Check if a file should be ingested, given a document specification.  It is presumed that
-   * documents that do not pass checkInclude() will be checked with this method.
-   *@param file is the file.
-   *@param documentSpecification is the specification.
-   */
-  protected static boolean checkIngest(String nameNode, FileStatus fileStatus, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    // Since the only exclusions at this point are not based on file contents, this is a no-op.
-    // MHL
-    return true;
-  }
-
-  /** Match a sub-path.  The sub-path must match the complete starting part of the full path, in a path
-   * sense.  The returned value should point into the file name beyond the end of the matched path, or
-   * be -1 if there is no match.
-   *@param subPath is the sub path.
-   *@param fullPath is the full path.
-   *@return the index of the start of the remaining part of the full path, or -1.
-   */
-  protected static int matchSubPath(String subPath, String fullPath)
-  {
-    if (subPath.length() > fullPath.length())
-      return -1;
-    if (fullPath.startsWith(subPath) == false)
-      return -1;
-    int rval = subPath.length();
-    if (fullPath.length() == rval)
-      return rval;
-    char x = fullPath.charAt(rval);
-    if (x == Path.SEPARATOR_CHAR)
-      rval++;
-    return rval;
-  }
-
-  /** Check a match between two strings with wildcards.
-   *@param sourceMatch is the expanded string (no wildcards)
-   *@param sourceIndex is the starting point in the expanded string.
-   *@param match is the wildcard-based string.
-   *@return true if there is a match.
-   */
-  protected static boolean checkMatch(String sourceMatch, int sourceIndex, String match)
-  {
-    // Note: The java regex stuff looks pretty heavyweight for this purpose.
-    // I've opted to try and do a simple recursive version myself, which is not compiled.
-    // Basically, the match proceeds by recursive descent through the string, so that all *'s cause
-    // recursion.
-    boolean caseSensitive = true;
-
-    return processCheck(caseSensitive, sourceMatch, sourceIndex, match, 0);
-  }
-
-  /** Recursive worker method for checkMatch.  Returns 'true' if there is a path that consumes both
-   * strings in their entirety in a matched way.
-   *@param caseSensitive is true if file names are case sensitive.
-   *@param sourceMatch is the source string (w/o wildcards)
-   *@param sourceIndex is the current point in the source string.
-   *@param match is the match string (w/wildcards)
-   *@param matchIndex is the current point in the match string.
-   *@return true if there is a match.
-   */
-  protected static boolean processCheck(boolean caseSensitive, String sourceMatch, int sourceIndex,
-    String match, int matchIndex)
-  {
-    // Logging.connectors.debug("Matching '"+sourceMatch+"' position "+Integer.toString(sourceIndex)+
-    //      " against '"+match+"' position "+Integer.toString(matchIndex));
-
-    // Match up through the next * we encounter
-    while (true)
-    {
-      // If we've reached the end, it's a match.
-      if (sourceMatch.length() == sourceIndex && match.length() == matchIndex)
-        return true;
-      // If one has reached the end but the other hasn't, no match
-      if (match.length() == matchIndex)
-        return false;
-      if (sourceMatch.length() == sourceIndex)
-      {
-        if (match.charAt(matchIndex) != '*')
-          return false;
-        matchIndex++;
-        continue;
-      }
-      char x = sourceMatch.charAt(sourceIndex);
-      char y = match.charAt(matchIndex);
-      if (!caseSensitive)
-      {
-        if (x >= 'A' && x <= 'Z')
-          x -= 'A'-'a';
-        if (y >= 'A' && y <= 'Z')
-          y -= 'A'-'a';
-      }
-      if (y == '*')
-      {
-        // Wildcard!
-        // We will recurse at this point.
-        // Basically, we want to combine the results for leaving the "*" in the match string
-        // at this point and advancing the source index, with skipping the "*" and leaving the source
-        // string alone.
-        return processCheck(caseSensitive,sourceMatch,sourceIndex+1,match,matchIndex) ||
-          processCheck(caseSensitive,sourceMatch,sourceIndex,match,matchIndex+1);
-      }
-      if (y == '?' || x == y)
-      {
-        sourceIndex++;
-        matchIndex++;
-      }
-      else
-        return false;
-    }
-  }
-
-  /**
-   * @param e
-   * @throws ManifoldCFException
-   * @throws ServiceInterruption
-   */
-  private static void handleIOException(IOException e) throws ManifoldCFException, ServiceInterruption {
-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    }
-    Logging.connectors.warn("HDFS: IO exception: "+e.getMessage(),e);
-    long currentTime = System.currentTimeMillis();
-    throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L,-1,false);
-  }
-  
-  /**
-   * @param e
-   * @throws ManifoldCFException
-   * @throws ServiceInterruption
-   */
-  private static void handleURISyntaxException(URISyntaxException e) throws ManifoldCFException, ServiceInterruption {
-    // Permanent problem
-    Logging.connectors.error("HDFS: Bad namenode specification: "+e.getMessage(), e);
-    throw new ManifoldCFException("Bad namenode specification: "+e.getMessage(), e);
-  }
-
-  protected static class CheckConnectionThread extends Thread {
-    protected final HDFSSession session;
-    protected Throwable exception = null;
-
-    public CheckConnectionThread(HDFSSession session) {
-      super();
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.getRepositoryInfo();
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp() throws InterruptedException, IOException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-  }
-
-  /**
-   * @throws ManifoldCFException
-   * @throws ServiceInterruption
-   */
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    CheckConnectionThread t = new CheckConnectionThread(getSession());
-    try {
-      t.start();
-      t.finishUp();
-      return;
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      handleIOException(e);
-    }
-  }
-
-  protected static class GetSessionThread extends Thread {
-    protected final String nameNode;
-    protected final String user;
-    protected Throwable exception = null;
-    protected HDFSSession session;
-
-    public GetSessionThread(String nameNode, String user) {
-      super();
-      this.nameNode = nameNode;
-      this.user = user;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        // Create a session
-        session = new HDFSSession(nameNode, user);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, IOException, URISyntaxException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof URISyntaxException) {
-          throw (URISyntaxException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-    
-    public HDFSSession getResult() {
-      return session;
-    }
-  }
-
-  protected FileStatus[] getChildren(Path path)
-    throws ManifoldCFException, ServiceInterruption {
-    GetChildrenThread t = new GetChildrenThread(getSession(), path);
-    try {
-      t.start();
-      t.finishUp();
-      return t.getResult();
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      handleIOException(e);
-    } catch (IOException e) {
-      handleIOException(e);
-    }
-    return null;
-  }
-
-  protected class GetChildrenThread extends Thread {
-    protected Throwable exception = null;
-    protected FileStatus[] result = null;
-    protected final HDFSSession session;
-    protected final Path path;
-
-    public GetChildrenThread(HDFSSession session, Path path) {
-      super();
-      this.session = session;
-      this.path = path;
-      setDaemon(true);
-    }
-
-    @Override
-    public void run() {
-      try {
-        result = session.listStatus(path);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp() throws InterruptedException, IOException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else if (thr instanceof Error) {
-          throw (Error) thr;
-        } else if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else {
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-        }
-      }
-    }
-    
-    public FileStatus[] getResult() {
-      return result;
-    }
-  }
-
-  protected FileStatus getObject(Path path)
-    throws ManifoldCFException, ServiceInterruption {
-    GetObjectThread objt = new GetObjectThread(getSession(),path);
-    try {
-      objt.start();
-      objt.finishUp();
-      return objt.getResponse();
-    } catch (InterruptedException e) {
-      objt.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      objt.interrupt();
-      handleIOException(e);
-    } catch (IOException e) {
-      handleIOException(e);
-    }
-    return null;
-  }
-  
-  protected static class GetObjectThread extends Thread {
-    protected final HDFSSession session;
-    protected final Path nodeId;
-    protected Throwable exception = null;
-    protected FileStatus response = null;
-
-    public GetObjectThread(HDFSSession session, Path nodeId) {
-      super();
-      setDaemon(true);
-      this.session = session;
-      this.nodeId = nodeId;
-    }
-
-    public void run() {
-      try {
-        response = session.getObject(nodeId);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp() throws InterruptedException, IOException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else if (thr instanceof Error) {
-          throw (Error) thr;
-        } else if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else {
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-        }
-      }
-    }
-
-    public FileStatus getResponse() {
-      return response;
-    }
-
-  }
-
-  protected static class BackgroundStreamThread extends Thread
-  {
-    protected final HDFSSession session;
-    protected final Path nodeId;
-    
-    protected boolean abortThread = false;
-    protected Throwable responseException = null;
-    protected InputStream sourceStream = null;
-    protected XThreadInputStream threadStream = null;
-    
-    public BackgroundStreamThread(HDFSSession session, Path nodeId)
-    {
-      super();
-      setDaemon(true);
-      this.session = session;
-      this.nodeId = nodeId;
-    }
-
-    public void run()
-    {
-      try {
-        try {
-          synchronized (this) {
-            if (!abortThread) {
-              sourceStream = session.getFSDataInputStream(nodeId);
-              threadStream = new XThreadInputStream(sourceStream);
-              this.notifyAll();
-            }
-          }
-          
-          if (threadStream != null)
-          {
-            // Stuff the content until we are done
-            threadStream.stuffQueue();
-          }
-        } finally {
-          if (sourceStream != null) {
-            sourceStream.close();
-          }
-        }
-      } catch (Throwable e) {
-        responseException = e;
-      }
-    }
-
-    public InputStream getSafeInputStream() throws InterruptedException, IOException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null) {
-            throw new IllegalStateException("Check for response before getting stream");
-          }
-          checkException(responseException);
-          if (threadStream != null) {
-            return threadStream;
-          }
-          wait();
-        }
-      }
-    }
-    
-    public void finishUp() throws InterruptedException, IOException
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      synchronized (this) {
-        if (threadStream != null) {
-          threadStream.abort();
-        }
-        abortThread = true;
-      }
-
-      join();
-
-      checkException(responseException);
-    }
-    
-    protected synchronized void checkException(Throwable exception) throws IOException
-    {
-      if (exception != null)
-      {
-        Throwable e = exception;
-        if (e instanceof IOException) {
-          throw (IOException)e;
-        } else if (e instanceof RuntimeException) {
-          throw (RuntimeException)e;
-        } else if (e instanceof Error) {
-          throw (Error)e;
-        } else {
-          throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
-        }
-      }
-    }
-  }
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSSession.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSSession.java
deleted file mode 100644
index 931b7e3..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSSession.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/* $Id: DropboxSession.java 1490621 2013-06-07 12:55:04Z kwright $ */
-
-/**
-* 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.
-*/
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.apache.manifoldcf.crawler.connectors.hdfs;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FSDataInputStream;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.manifoldcf.core.common.*;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- *
- * @author andrew
- */
-public class HDFSSession {
-
-  private final FileSystem fileSystem;
-  private final String nameNode;
-  private final Configuration config;
-  private final String user;
-  
-  public HDFSSession(String nameNode, String user) throws URISyntaxException, IOException, InterruptedException {
-    this.nameNode = nameNode;
-    this.user = user;
-    // Switch class loaders so that scheme registration works properly
-    ClassLoader ocl = Thread.currentThread().getContextClassLoader();
-    try {
-      Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-      config = new Configuration();
-      config.set("fs.defaultFS", nameNode);
-      fileSystem = FileSystem.get(new URI(nameNode), config, user);
-    } finally {
-      Thread.currentThread().setContextClassLoader(ocl);
-    }
-  }
-
-  public static void runMe()
-  {
-  }
-  
-  public Map<String, String> getRepositoryInfo() {
-    Map<String, String> info = new HashMap<String, String>();
-
-    info.put("Name Node", nameNode);
-    info.put("Config", config.toString());
-    info.put("User", user);
-    // Commented much of this out because each timeout is too long if there's no connection
-    info.put("Canonical Service Name", fileSystem.getCanonicalServiceName());
-    //info.put("Default Block Size", Long.toString(fileSystem.getDefaultBlockSize()));
-    //info.put("Default Replication", Short.toString(fileSystem.getDefaultReplication()));
-    //info.put("Home Directory", fileSystem.getHomeDirectory().toUri().toString());
-    //info.put("Working Directory", fileSystem.getWorkingDirectory().toUri().toString());
-    return info;
-  }
-
-  public FileStatus[] listStatus(Path path)
-    throws IOException {
-    try {
-      return fileSystem.listStatus(path);
-    } catch (FileNotFoundException e) {
-      return null;
-    }
-  }
-  
-  public URI getUri() {
-    return fileSystem.getUri();
-  }
-
-  public FileStatus getObject(Path path) throws IOException {
-    try {
-      return fileSystem.getFileStatus(path);
-    } catch(FileNotFoundException e) {
-      return null;
-    }
-  }
-
-  public FSDataInputStream getFSDataInputStream(Path path) throws IOException {
-    try {
-      return fileSystem.open(path);
-    } catch (FileNotFoundException e) {
-      return null;
-    }
-  }
-  
-  public void close() throws IOException {
-    fileSystem.close();
-  }
-}
diff --git a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/Messages.java b/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/Messages.java
deleted file mode 100644
index d16a2ad..0000000
--- a/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1295926 2012-03-01 21:56:27Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.hdfs.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.hdfs";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_en_US.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_en_US.properties
deleted file mode 100644
index b0bc28c..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_en_US.properties
+++ /dev/null
@@ -1,30 +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.
-
-HDFSOutputConnector.ServerTabName=Server
-HDFSOutputConnector.NameNodeProtocol=Name node protocol:
-HDFSOutputConnector.NameNodeHost=Name node host:
-HDFSOutputConnector.NameNodePort=Name node port:
-HDFSOutputConnector.User=User:
-HDFSOutputConnector.NameNodeHostCannotBeNull=Name node host cannot be null
-HDFSOutputConnector.NameNodePortCannotBeNull=Name node port cannot be null
-HDFSOutputConnector.NameNodePortMustBeAnInteger=Name node port must be an integer
-HDFSOutputConnector.UserCannotBeNull=User cannot be null
-
-HDFSOutputConnector.PathTabName=Output Path
-HDFSOutputConnector.Path=Output Path:
-HDFSOutputConnector.RootPath=Root path:
-HDFSOutputConnector.RootPathCannotBeNull=Root path cannot be null
-
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_es_ES.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_es_ES.properties
deleted file mode 100644
index 171b21e..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_es_ES.properties
+++ /dev/null
@@ -1,30 +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.
-
-HDFSOutputConnector.ServerTabName=Servidor
-HDFSOutputConnector.NameNodeProtocol= Nombre del Protocolo de nodo:
-HDFSOutputConnector.NameNodeHost=Nombre de host del nodo:
-HDFSOutputConnector.NameNodePort=Name node port:
-HDFSOutputConnector.User=Usuario:
-HDFSOutputConnector.NameNodeHostCannotBeNull=Nombre de host del nodo no puede ser nulo
-HDFSOutputConnector.NameNodePortCannotBeNull=Nombre Puerto de nodo no puede ser nulo
-HDFSOutputConnector.NameNodePortMustBeAnInteger=Puerto de nodo Nombre tiene que ser un número entero
-HDFSOutputConnector.UserCannotBeNull=El usuario no puede ser nulo
-
-HDFSOutputConnector.PathTabName=Ruta de salida
-HDFSOutputConnector.Path=Ruta de salida:
-HDFSOutputConnector.RootPath=ruta raíz:
-HDFSOutputConnector.RootPathCannotBeNull=Ruta de raíz no puede ser nulo
-
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_ja_JP.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_ja_JP.properties
deleted file mode 100644
index 39e189c..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_ja_JP.properties
+++ /dev/null
@@ -1,30 +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.
-
-HDFSOutputConnector.ServerTabName=サーバー
-HDFSOutputConnector.NameNodeProtocol=Name node protocol:
-HDFSOutputConnector.NameNodeHost=Name node host:
-HDFSOutputConnector.NameNodePort=Name node port:
-HDFSOutputConnector.User=ユーザー:
-HDFSOutputConnector.NameNodeHostCannotBeNull=Name node host cannot be null
-HDFSOutputConnector.NameNodePortCannotBeNull=Name node port cannot be null
-HDFSOutputConnector.NameNodePortMustBeAnInteger=Name node port must be an integer
-HDFSOutputConnector.UserCannotBeNull=User cannot be null
-
-HDFSOutputConnector.PathTabName=出力パス
-HDFSOutputConnector.Path=出力パス:
-HDFSOutputConnector.RootPath=ルートパス:
-HDFSOutputConnector.RootPathCannotBeNull=Root path cannot be null
-
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_zh_CN.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_zh_CN.properties
deleted file mode 100644
index 5e5b423..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/hdfs/common_zh_CN.properties
+++ /dev/null
@@ -1,30 +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.
-
-HDFSOutputConnector.ServerTabName=服务器标签名
-HDFSOutputConnector.NameNodeProtocol=名称节点协议:
-HDFSOutputConnector.NameNodeHost=名称节点主机:
-HDFSOutputConnector.NameNodePort=名称节点端口:
-HDFSOutputConnector.User=用户:
-HDFSOutputConnector.NameNodeHostCannotBeNull=名称节点主机不能为Null
-HDFSOutputConnector.NameNodePortCannotBeNull=名称节点端口不能为Null
-HDFSOutputConnector.NameNodePortMustBeAnInteger=名称节点端口必须为整数
-HDFSOutputConnector.UserCannotBeNull=用户不能为Null
-
-HDFSOutputConnector.PathTabName=路径标签名
-HDFSOutputConnector.Path=路径: 
-HDFSOutputConnector.RootPath=根路径: 
-HDFSOutputConnector.RootPathCannotBeNull=根路径不能为Null
-
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_en_US.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_en_US.properties
deleted file mode 100644
index 062057d..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_en_US.properties
+++ /dev/null
@@ -1,51 +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.
-
-HDFSRepositoryConnector.ServerTabName=Server
-HDFSRepositoryConnector.NameNodeProtocol=Name node protocol:
-HDFSRepositoryConnector.NameNodeHost=Name node host:
-HDFSRepositoryConnector.NameNodePort=Name node port:
-HDFSRepositoryConnector.User=User:
-HDFSRepositoryConnector.NameNodeHostCannotBeNull=Name node host cannot be null
-HDFSRepositoryConnector.NameNodePortCannotBeNull=Name node port cannot be null
-HDFSRepositoryConnector.NameNodePortMustBeAnInteger=Name node port must be an integer
-HDFSRepositoryConnector.UserCannotBeNull=User cannot be null
-
-HDFSRepositoryConnector.Paths=Repository Paths
-HDFSRepositoryConnector.Paths2=Repository Paths:
-HDFSRepositoryConnector.RootPath=Root path
-HDFSRepositoryConnector.ConvertToURI=Convert path to URI?
-HDFSRepositoryConnector.ConvertToURIExample= (e.g. http/xyz/index.html => http://xyz/index.html)
-HDFSRepositoryConnector.Yes=Yes
-HDFSRepositoryConnector.No=No
-HDFSRepositoryConnector.Rules=Rules
-HDFSRepositoryConnector.Delete=Delete
-HDFSRepositoryConnector.DeletePath=Delete path #
-HDFSRepositoryConnector.IncludeExclude=Include/exclude
-HDFSRepositoryConnector.FileDirectory=File/directory
-HDFSRepositoryConnector.Match=Match
-HDFSRepositoryConnector.include=include
-HDFSRepositoryConnector.exclude=exclude
-HDFSRepositoryConnector.File=File
-HDFSRepositoryConnector.Directory=Directory
-HDFSRepositoryConnector.NoDocumentsSpecified=No documents specified
-HDFSRepositoryConnector.Add=Add
-HDFSRepositoryConnector.InsertHere=Insert Here
-HDFSRepositoryConnector.include=include
-HDFSRepositoryConnector.NoRulesDefined=No rules defined
-HDFSRepositoryConnector.InsertNewMatchForPath=Insert new match for path #
-HDFSRepositoryConnector.DeletePath=Delete path #
-HDFSRepositoryConnector.AddNewMatchForPath=Add new match for path #
-HDFSRepositoryConnector.AddNewPath=Add new path
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_es_ES.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_es_ES.properties
deleted file mode 100644
index 568ac51..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_es_ES.properties
+++ /dev/null
@@ -1,51 +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.
-
-HDFSRepositoryConnector.ServerTabName=Servidor
-HDFSRepositoryConnector.NameNodeProtocol=Protocolo de nodo Nombre:
-HDFSRepositoryConnector.NameNodeHost=Nombre de host del nodo:
-HDFSRepositoryConnector.NameNodePort=Nombre de puerto del nodo:
-HDFSRepositoryConnector.User=Usuario:
-HDFSRepositoryConnector.NameNodeHostCannotBeNull=Nombre de host del nodo no puede ser nulo
-HDFSRepositoryConnector.NameNodePortCannotBeNull=Nombre de Puerto del nodo no puede ser nulo
-HDFSRepositoryConnector.NameNodePortMustBeAnInteger=Nombre de Puerto del nodo tiene que ser un número entero
-HDFSRepositoryConnector.UserCannotBeNull=El usuario no puede ser nulo
-
-HDFSRepositoryConnector.Paths=Caminos del repositorio
-HDFSRepositoryConnector.Paths2=Caminos del repositorio:
-HDFSRepositoryConnector.RootPath=ruta raíz
-HDFSRepositoryConnector.ConvertToURI=Convertir camino hacia la URI?
-HDFSRepositoryConnector.ConvertToURIExample= (e.g. http/xyz/index.html => http://xyz/index.html)
-HDFSRepositoryConnector.Yes=Si
-HDFSRepositoryConnector.No=No
-HDFSRepositoryConnector.Rules=Reglas
-HDFSRepositoryConnector.Delete=Borrar
-HDFSRepositoryConnector.DeletePath=eliminar ruta #
-HDFSRepositoryConnector.IncludeExclude=Incluir/excluir
-HDFSRepositoryConnector.FileDirectory=Archivo/directorio
-HDFSRepositoryConnector.Match=Partido
-HDFSRepositoryConnector.include=incluir
-HDFSRepositoryConnector.exclude=excluir
-HDFSRepositoryConnector.File=Archivo
-HDFSRepositoryConnector.Directory=Directorio
-HDFSRepositoryConnector.NoDocumentsSpecified=No hay documentos especificados
-HDFSRepositoryConnector.Add=añadir
-HDFSRepositoryConnector.InsertHere=Inserte aquí
-HDFSRepositoryConnector.include=incluir
-HDFSRepositoryConnector.NoRulesDefined=No hay reglas definidas
-HDFSRepositoryConnector.InsertNewMatchForPath=Insertar nuevo partido para la ruta #
-HDFSRepositoryConnector.DeletePath=eliminar ruta #
-HDFSRepositoryConnector.AddNewMatchForPath=Escribir un partido para la ruta #
-HDFSRepositoryConnector.AddNewPath=Añadir nuevo camino
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_ja_JP.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_ja_JP.properties
deleted file mode 100644
index 636e478..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_ja_JP.properties
+++ /dev/null
@@ -1,51 +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.
-
-HDFSRepositoryConnector.ServerTabName=サーバー
-HDFSRepositoryConnector.NameNodeProtocol=Name node protocol:
-HDFSRepositoryConnector.NameNodeHost=Name node host:
-HDFSRepositoryConnector.NameNodePort=Name node port:
-HDFSRepositoryConnector.User=ユーザー:
-HDFSRepositoryConnector.NameNodeHostCannotBeNull=Name node host cannot be null
-HDFSRepositoryConnector.NameNodePortCannotBeNull=Name node port cannot be null
-HDFSRepositoryConnector.NameNodePortMustBeAnInteger=Name node port must be an integer
-HDFSRepositoryConnector.UserCannotBeNull=User cannot be null
-
-HDFSRepositoryConnector.Paths=リポジトリパス
-HDFSRepositoryConnector.Paths2=リポジトリパス:
-HDFSRepositoryConnector.RootPath=ルートパス
-HDFSRepositoryConnector.ConvertToURI=Convert path to URI?
-HDFSRepositoryConnector.ConvertToURIExample= (e.g. http/xyz/index.html => http://xyz/index.html)
-HDFSRepositoryConnector.Yes=Yes
-HDFSRepositoryConnector.No=No
-HDFSRepositoryConnector.Rules=ルール
-HDFSRepositoryConnector.Delete=削除
-HDFSRepositoryConnector.DeletePath=パスを削除 #
-HDFSRepositoryConnector.IncludeExclude=含む/除外
-HDFSRepositoryConnector.FileDirectory=ファイル/ディレクトリ
-HDFSRepositoryConnector.Match=一致
-HDFSRepositoryConnector.include=含む
-HDFSRepositoryConnector.exclude=除外
-HDFSRepositoryConnector.File=ファイル
-HDFSRepositoryConnector.Directory=ディレクトリ
-HDFSRepositoryConnector.NoDocumentsSpecified=コンテンツは指定されていません
-HDFSRepositoryConnector.Add=追加
-HDFSRepositoryConnector.InsertHere=挿入
-HDFSRepositoryConnector.include=含む
-HDFSRepositoryConnector.NoRulesDefined=ルールが未定義です
-HDFSRepositoryConnector.InsertNewMatchForPath=パス用に新しいパターンを挿入: #
-HDFSRepositoryConnector.DeletePath=パスを削除: #
-HDFSRepositoryConnector.AddNewMatchForPath=パス用に新しいパターンを追加: #
-HDFSRepositoryConnector.AddNewPath=新しいパスを追加
diff --git a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_zh_CN.properties b/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_zh_CN.properties
deleted file mode 100644
index f3e4775..0000000
--- a/connectors/hdfs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/hdfs/common_zh_CN.properties
+++ /dev/null
@@ -1,51 +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.
-
-HDFSRepositoryConnector.ServerTabName=服务器
-HDFSRepositoryConnector.NameNodeProtocol=名称节点协议:
-HDFSRepositoryConnector.NameNodeHost=名称节点主机:
-HDFSRepositoryConnector.NameNodePort=名称节点端口:
-HDFSRepositoryConnector.User=用户: 
-HDFSRepositoryConnector.NameNodeHostCannotBeNull=名称节点主机不能为Null
-HDFSRepositoryConnector.NameNodePortCannotBeNull=名称节点端口不能为Null
-HDFSRepositoryConnector.NameNodePortMustBeAnInteger=名称节点端口必须为整数
-HDFSRepositoryConnector.UserCannotBeNull=用户不能为Null
-
-HDFSRepositoryConnector.Paths=存储库路径
-HDFSRepositoryConnector.Paths2=存储库路径: 
-HDFSRepositoryConnector.RootPath=根路径
-HDFSRepositoryConnector.ConvertToURI=转换成URI?
-HDFSRepositoryConnector.ConvertToURIExample= 例) http/xyz/index.html => http://xyz/index.html
-HDFSRepositoryConnector.Yes=是
-HDFSRepositoryConnector.No=否
-HDFSRepositoryConnector.Rules=规则
-HDFSRepositoryConnector.Delete=删除
-HDFSRepositoryConnector.DeletePath=删除路径 #
-HDFSRepositoryConnector.IncludeExclude=包含/排除
-HDFSRepositoryConnector.FileDirectory=文件/目录
-HDFSRepositoryConnector.Match=匹配
-HDFSRepositoryConnector.include=包含
-HDFSRepositoryConnector.exclude=排除
-HDFSRepositoryConnector.File=文件
-HDFSRepositoryConnector.Directory=目录
-HDFSRepositoryConnector.NoDocumentsSpecified=文档未指定
-HDFSRepositoryConnector.Add=添加
-HDFSRepositoryConnector.InsertHere=在这里插入
-HDFSRepositoryConnector.include=包含
-HDFSRepositoryConnector.NoRulesDefined=规则未定义
-HDFSRepositoryConnector.InsertNewMatchForPath=为路径插入新匹配:  #
-HDFSRepositoryConnector.DeletePath=删除路径:  #
-HDFSRepositoryConnector.AddNewMatchForPath=为路径添加新匹配:  #
-HDFSRepositoryConnector.AddNewPath=添加新路径
diff --git a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editConfiguration.html b/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editConfiguration.html
deleted file mode 100644
index b36bbf3..0000000
--- a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editConfiguration.html
+++ /dev/null
@@ -1,84 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('HDFSOutputConnector.ServerTabName'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodeProtocol'))</nobr></td>
-    <td class="value">
-     <select name="namenodeprotocol" size="2">
-  #if($NAMENODEPROTOCOL == 'file')
-       <option value="file" selected="true">file</option>
-  #else
-       <option value="file">file</option>
-  #end
-  #if($NAMENODEPROTOCOL == 'ftp')
-       <option value="ftp" selected="true">ftp</option>
-  #else
-       <option value="ftp">ftp</option>
-  #end
-  #if($NAMENODEPROTOCOL == 'har')
-       <option value="har" selected="true">har</option>
-  #else
-       <option value="har">har</option>
-  #end
-  #if($NAMENODEPROTOCOL == 'hdfs')
-       <option value="hdfs" selected="true">hdfs</option>
-  #else
-       <option value="hdfs">hdfs</option>
-  #end
-  #if($NAMENODEPROTOCOL == 's3')
-       <option value="s3" selected="true">s3</option>
-  #else
-       <option value="s3">s3</option>
-  #end
-  #if($NAMENODEPROTOCOL == 's3n')
-       <option value="s3n" selected="true">s3n</option>
-  #else
-       <option value="s3n">s3n</option>
-  #end
-  #if($NAMENODEPROTOCOL == 'viewfs')
-       <option value="viewfs" selected="true">viewfs</option>
-  #else
-       <option value="viewfs">viewfs</option>
-  #end
-     </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodeHost'))</nobr></td>
-    <td class="value"><input name="namenodehost" type="text" value="$Encoder.attributeEscape($NAMENODEHOST)" size="32" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodePort'))</nobr></td>
-    <td class="value"><input name="namenodeport" type="text" value="$Encoder.attributeEscape($NAMENODEPORT)" size="5" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.User'))</nobr></td>
-    <td class="value"><input name="user" type="text" value="$Encoder.attributeEscape($USER)" size="32" /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="namenodehost" value="$Encoder.attributeEscape($NAMENODEHOST)" />
-<input type="hidden" name="namenodeport" value="$Encoder.attributeEscape($NAMENODEPORT)" />
-<input type="hidden" name="user" value="$Encoder.attributeEscape($USER)" />
-
-#end
diff --git a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editConfiguration.js b/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editConfiguration.js
deleted file mode 100644
index b84915d..0000000
--- a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editConfiguration.js
+++ /dev/null
@@ -1,53 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfigForSave()
-{
-  if (editconnection.namenodehost.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodeHostCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.ServerTabName'))");
-    editconnection.namenodehost.focus();
-    return false;
-  }
-  if (editconnection.namenodeport.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodePortCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.ServerTabName'))");
-    editconnection.namenodeport.focus();
-    return false;
-  }
-  if (!isInteger(editconnection.namenodeport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodePortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.ServerTabName'))");
-    editconnection.namenodeport.focus();
-    return false;
-  }
-  if (editconnection.user.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.UserCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.ServerTabName'))");
-    editconnection.user.focus();
-    return false;
-  }
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editSpecification.html b/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editSpecification.html
deleted file mode 100644
index 2aaad58..0000000
--- a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editSpecification.html
+++ /dev/null
@@ -1,32 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('HDFSOutputConnector.PathTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.RootPath'))</nobr></td>
-    <td class="value"><input type="text" name="s${SEQNUM}_rootpath" size="64" value="$Encoder.attributeEscape($ROOTPATH)" /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SEQNUM}_rootpath" value="$Encoder.attributeEscape($ROOTPATH)" />
-
-#end
diff --git a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editSpecification.js b/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editSpecification.js
deleted file mode 100644
index b56c6ab..0000000
--- a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/editSpecification.js
+++ /dev/null
@@ -1,32 +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.
--->
-
-<script type="text/javascript">
-<!--
-function s${SEQNUM}_checkSpecificationForSave()
-{
-  if (editjob.s${SEQNUM}_rootpath.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.RootPathCannotBeNull'))");
-    SelectSequencedTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('HDFSOutputConnector.PathTabName'))",${SEQNUM});
-    editjob.s${SEQNUM}_rootpath.focus();
-    return false;
-  }
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/viewConfiguration.html b/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/viewConfiguration.html
deleted file mode 100644
index ef7742b..0000000
--- a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/viewConfiguration.html
+++ /dev/null
@@ -1,35 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodeProtocol'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($NAMENODEPROTOCOL)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodeHost'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($NAMENODEHOST)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.NameNodePort'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($NAMENODEPORT)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.User'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($USER)</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/viewSpecification.html b/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/viewSpecification.html
deleted file mode 100644
index 7d256b7..0000000
--- a/connectors/hdfs/connector/src/main/resources/org/apache/manifoldcf/agents/output/hdfs/viewSpecification.html
+++ /dev/null
@@ -1,23 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('HDFSOutputConnector.RootPath'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($ROOTPATH)</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BaseHSQLDB.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BaseHSQLDB.java
deleted file mode 100644
index ad92daf..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BaseHSQLDB.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: BaseHSQLDB.java 1147086 2011-07-15 10:58:30Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFS Repository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BaseMySQL.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BaseMySQL.java
deleted file mode 100644
index 2cd2289..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BaseMySQL.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: BaseMySQL.java 1221585 2011-12-21 03:10:03Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.crawler.tests.ConnectorBaseMySQL
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFSRepository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BasePostgresql.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BasePostgresql.java
deleted file mode 100644
index a004fa6..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/BasePostgresql.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFSRepository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityHSQLDBTest.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityHSQLDBTest.java
deleted file mode 100644
index f53e0f6..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: SanityHSQLDBTest.java 1147086 2011-07-15 10:58:30Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityMySQLTest.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityMySQLTest.java
deleted file mode 100644
index e931062..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityMySQLTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: SanityMySQLTest.java 1221585 2011-12-21 03:10:03Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityPostgresqlTest.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityPostgresqlTest.java
deleted file mode 100644
index a4ead9c..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/agents/output/hdfs/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.hdfs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseHSQLDB.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseHSQLDB.java
deleted file mode 100644
index 8fde1ff..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: BaseHSQLDB.java 1147086 2011-07-15 10:58:30Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFS Repository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseMySQL.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseMySQL.java
deleted file mode 100644
index e752ec6..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseMySQL.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: BaseMySQL.java 1221585 2011-12-21 03:10:03Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.crawler.tests.ConnectorBaseMySQL
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFS Repository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BasePostgresql.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BasePostgresql.java
deleted file mode 100644
index a890a5d..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BasePostgresql.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFS Repository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseUIHSQLDB.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 2de7c3f..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id: BaseUIDerby.java 1231798 2012-01-15 23:58:22Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"HDFS Repository Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/NavigationHSQLDBUI.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 048a755..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id: NavigationDerbyUI.java 1422222 2012-12-15 11:29:02Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.HTMLTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    new NavigationUITester(testerInstance,"http://localhost:8346/mcf-crawler-ui/index.jsp").createConnectionsAndJob();
-  }
-  
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/NavigationUITester.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/NavigationUITester.java
deleted file mode 100644
index 0d7657b..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/NavigationUITester.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationUITester
-{
-  protected final SeleniumTester testerInstance;
-  protected final String startURL;
-  
-  public NavigationUITester(SeleniumTester tester, String startURL)
-  {
-    this.testerInstance = tester;
-    this.startURL = startURL;
-  }
-  
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", startURL);
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.hdfs.HDFSRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Server tab
-    testerInstance.clickTab("Server");
-    testerInstance.setValue("user", "foo");
-
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // Now, HopFilters
-    testerInstance.clickTab("Hop Filters");
-    testerInstance.clickRadioButton("hopcountmode","2");
-
-    // Repository Paths tab
-    testerInstance.clickTab("Repository Paths");
-    
-    // MHL
-    
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityHSQLDBTest.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityHSQLDBTest.java
deleted file mode 100644
index ac0d321..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: SanityHSQLDBTest.java 1147086 2011-07-15 10:58:30Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityMySQLTest.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityMySQLTest.java
deleted file mode 100644
index 3207ce1..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityMySQLTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: SanityMySQLTest.java 1221585 2011-12-21 03:10:03Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityPostgresqlTest.java b/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityPostgresqlTest.java
deleted file mode 100644
index 8246bdb..0000000
--- a/connectors/hdfs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/hdfs/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.hdfs.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/hdfs/pom.xml b/connectors/hdfs/pom.xml
deleted file mode 100644
index e86b959..0000000
--- a/connectors/hdfs/pom.xml
+++ /dev/null
@@ -1,372 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-hdfs-connector</artifactId>
-  <name>ManifoldCF - Connectors - HDFS</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-    
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-      
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-common</artifactId>
-      <version>${hadoop.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/connectors/jcifs/.gitignore b/connectors/jcifs/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/jcifs/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/jcifs/build.xml b/connectors/jcifs/build.xml
deleted file mode 100644
index 87028a1..0000000
--- a/connectors/jcifs/build.xml
+++ /dev/null
@@ -1,86 +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.
--->
-
-<project name="jcifs" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <property name="jcifs.version" value="1.3.17"/>
-    
-    <target name="calculate-condition">
-        <available file="lib-proprietary/jcifs-${jcifs.version}.jar" property="jcifsStatus"/>
-        <condition property="build-present">
-            <isset property="jcifsStatus"/>
-        </condition>
-    </target>
-
-    <target name="precompile-warn" depends="calculate-condition" unless="build-present">
-        <echo message="JCifs Connector cannot be built without jcifs.jar"/>
-    </target>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="lib-proprietary" includes="*.jar"/>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib-proprietary-only"/>
-        <copy todir="dist/lib-proprietary-only">
-            <fileset dir="lib-proprietary" includes="*.jar"/>
-        </copy>
-    </target>
-
-    <target name="download-jcifs">
-        <antcall target="download-via-maven">
-            <param name="project-path" value="jcifs"/>
-            <param name="artifact-version" value="${jcifs.version}"/>
-            <param name="target" value="lib-proprietary"/>
-            <param name="artifact-name" value="jcifs"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-dependencies" depends="download-jcifs"/>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="lib-proprietary">
-                <exclude name="README.txt"/>
-                <exclude name="*.diffs"/>
-            </fileset>
-        </delete>
-    </target>
-    
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Windows shares"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/GetConnectionInfo.java b/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/GetConnectionInfo.java
deleted file mode 100644
index f530ffb..0000000
--- a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/GetConnectionInfo.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $Id: GetConnectionInfo.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharedrive;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-public class GetConnectionInfo
-{
-  public static final String _rcsid = "@(#)$Id: GetConnectionInfo.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private GetConnectionInfo()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: GetConnectionInfo <connection_name>");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, and will contain the following columns:");
-      System.err.println("    share_server");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-        throw new ManifoldCFException("Connection "+connectionName+" does not exist");
-
-      if (connection.getClassName() == null || !connection.getClassName().equals("org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector"))
-        throw new ManifoldCFException("Command can only be used on working share connector connections.");
-
-      ConfigParams cfg = connection.getConfigParams();
-
-      UTF8Stdout.println(commaEscape(cfg.getParameter(SharedDriveParameters.server)));
-
-      System.err.println("Connection info done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-}
diff --git a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/MatchMap.java b/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/MatchMap.java
deleted file mode 100644
index 4ec442e..0000000
--- a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/MatchMap.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/* $Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharedrive;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** An instance of this class describes a "match map", which describes a translation of an input
-* string using regexp technology.
-* A match map consists of multiple clauses, which are fired in sequence.  Each clause is a regexp
-* search and replace, where the replace string can include references to the groups present in the
-* search regexp.
-* MatchMaps can be converted to strings in two different ways.  The first way is to build a single
-* string of the form "match1=replace1&match2=replace2...".  Strings of this kind must escape & and =
-* characters in the match and replace strings, where found.  The second way is to generate an array
-* of match strings and a corresponding array of replace strings.  This method requires no escaping
-* of the string contents.
-*/
-public class MatchMap
-{
-  public static final String _rcsid = "@(#)$Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the set of match regexp strings */
-  protected ArrayList matchStrings;
-  /** This is the set of Pattern objects corresponding to the match regexp strings.
-  * It's null if the patterns have not been built yet. */
-  protected Pattern[] matchPatterns = null;
-  /** This is the set of replace strings */
-  protected ArrayList replaceStrings;
-
-  /** Constructor.  Build an empty matchmap. */
-  public MatchMap()
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-  }
-
-  /** Constructor.  Build a matchmap from a single string. */
-  public MatchMap(String stringForm)
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-    StringBuilder matchString = new StringBuilder();
-    StringBuilder replaceString = new StringBuilder();
-    int i = 0;
-    while (i < stringForm.length())
-    {
-      matchString.setLength(0);
-      replaceString.setLength(0);
-      while (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&' || x == '=')
-          break;
-        i++;
-        if (x == '\\' && i < stringForm.length())
-          x = stringForm.charAt(i++);
-        matchString.append(x);
-      }
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '=')
-        {
-          i++;
-          // Pick up the second string
-          while (i < stringForm.length())
-          {
-            x = stringForm.charAt(i);
-            if (x == '&')
-              break;
-            i++;
-            if (x == '\\' && i < stringForm.length())
-              x = stringForm.charAt(i++);
-            replaceString.append(x);
-          }
-        }
-      }
-
-      matchStrings.add(matchString.toString());
-      replaceStrings.add(replaceString.toString());
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&')
-          i++;
-      }
-    }
-  }
-
-  /** Constructor.  Build a matchmap from two arraylists representing match and replace strings */
-  public MatchMap(ArrayList matchStrings, ArrayList replaceStrings)
-  {
-    this.matchStrings = (ArrayList)matchStrings.clone();
-    this.replaceStrings = (ArrayList)replaceStrings.clone();
-  }
-
-  /** Get the number of match/replace strings */
-  public int getMatchCount()
-  {
-    return matchStrings.size();
-  }
-
-  /** Get a specific match string */
-  public String getMatchString(int index)
-  {
-    return (String)matchStrings.get(index);
-  }
-
-  /** Get a specific replace string */
-  public String getReplaceString(int index)
-  {
-    return (String)replaceStrings.get(index);
-  }
-
-  /** Delete a specified match/replace string pair */
-  public void deleteMatchPair(int index)
-  {
-    matchStrings.remove(index);
-    replaceStrings.remove(index);
-    matchPatterns = null;
-  }
-
-  /** Insert a match/replace string pair */
-  public void insertMatchPair(int index, String match, String replace)
-  {
-    matchStrings.add(index,match);
-    replaceStrings.add(index,replace);
-    matchPatterns = null;
-  }
-
-  /** Append a match/replace string pair */
-  public void appendMatchPair(String match, String replace)
-  {
-    matchStrings.add(match);
-    replaceStrings.add(replace);
-    matchPatterns = null;
-  }
-
-  /** Append old-style match/replace pair.
-  * This method translates old-style regexp and group output form to the
-  * current style before adding to the map.
-  */
-  public void appendOldstyleMatchPair(String oldstyleMatch, String oldstyleReplace)
-  {
-    String newStyleMatch = "^" + oldstyleMatch + "$";
-
-    // Need to build a new-style replace string from the old one.  To do that, use the
-    // original parser (which basically will guarantee that we get it right)
-
-    EvaluatorTokenStream et = new EvaluatorTokenStream(oldstyleReplace);
-    StringBuilder newStyleReplace = new StringBuilder();
-
-    while (true)
-    {
-      EvaluatorToken t = et.peek();
-      if (t == null)
-        break;
-      switch (t.getType())
-      {
-      case EvaluatorToken.TYPE_COMMA:
-        et.advance();
-        break;
-      case EvaluatorToken.TYPE_GROUP:
-        et.advance();
-        int groupNumber = t.getGroupNumber();
-        switch (t.getGroupStyle())
-        {
-        case EvaluatorToken.GROUPSTYLE_NONE:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append(")");
-          break;
-        case EvaluatorToken.GROUPSTYLE_LOWER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("l)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_UPPER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("u)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_MIXED:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("m)");
-          break;
-        default:
-          break;
-        }
-        break;
-      case EvaluatorToken.TYPE_TEXT:
-        et.advance();
-        escape(newStyleReplace,t.getTextValue());
-        break;
-      default:
-        break;
-      }
-    }
-
-    appendMatchPair(newStyleMatch,newStyleReplace.toString());
-  }
-
-  /** Escape a string so it is verbatim */
-  protected static void escape(StringBuilder output, String input)
-  {
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '$')
-        output.append(x);
-      output.append(x);
-    }
-  }
-
-  /** Convert the matchmap to string form. */
-  public String toString()
-  {
-    int i = 0;
-    StringBuilder rval = new StringBuilder();
-    while (i < matchStrings.size())
-    {
-      String matchString = (String)matchStrings.get(i);
-      String replaceString = (String)replaceStrings.get(i);
-      if (i > 0)
-        rval.append('&');
-      stuff(rval,matchString);
-      rval.append('=');
-      stuff(rval,replaceString);
-      i++;
-    }
-    return rval.toString();
-  }
-
-  /** Stuff characters */
-  protected static void stuff(StringBuilder sb, String value)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '&' || x == '=')
-        sb.append('\\');
-      sb.append(x);
-    }
-  }
-
-  /** Perform a translation.
-  */
-  public String translate(String input)
-    throws ManifoldCFException
-  {
-    // Build pattern vector if not already there
-    if (matchPatterns == null)
-    {
-      matchPatterns = new Pattern[matchStrings.size()];
-      int i = 0;
-      while (i < matchPatterns.length)
-      {
-        String regexp = (String)matchStrings.get(i);
-        try
-        {
-          matchPatterns[i] = Pattern.compile(regexp);
-        }
-        catch (java.util.regex.PatternSyntaxException e)
-        {
-          matchPatterns = null;
-          throw new ManifoldCFException("For match expression '"+regexp+"', found pattern syntax error: "+e.getMessage(),e);
-        }
-        i++;
-      }
-    }
-
-    int j = 0;
-    while (j < matchPatterns.length)
-    {
-      Pattern p = matchPatterns[j];
-      // Construct a matcher
-      Matcher m = p.matcher(input);
-      // Grab the output description
-      String outputDescription = (String)replaceStrings.get(j);
-      j++;
-      // Create a copy buffer
-      StringBuilder outputBuffer = new StringBuilder();
-      // Keep track of the index in the original string we have done up to
-      int currentIndex = 0;
-      // Scan the string using find, and for each one found, do a translation
-      while (true)
-      {
-        boolean foundOne = m.find();
-        if (foundOne == false)
-        {
-          // No subsequent match found.
-          // Copy everything from currentIndex until the end of input
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-
-        // Do a translation.  This involves copying everything in the input
-        // string up until the start of the match, then doing a replace for
-        // the match itself, and finally setting the currentIndex to the end
-        // of the match.
-
-        int matchStart = m.start(0);
-        int matchEnd = m.end(0);
-        if (matchStart == -1)
-        {
-          // The expression was degenerate; treat this as the end.
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-        outputBuffer.append(input.substring(currentIndex,matchStart));
-
-        // Process translation description!
-        int i = 0;
-        while (i < outputDescription.length())
-        {
-          char x = outputDescription.charAt(i++);
-          if (x == '$' && i < outputDescription.length())
-          {
-            x = outputDescription.charAt(i++);
-            if (x == '(')
-            {
-              // Process evaluation expression
-              StringBuilder numberBuf = new StringBuilder();
-              boolean upper = false;
-              boolean lower = false;
-              boolean mixed = false;
-              while (i < outputDescription.length())
-              {
-                char y = outputDescription.charAt(i++);
-                if (y == ')')
-                  break;
-                else if (y >= '0' && y <= '9')
-                  numberBuf.append(y);
-                else if (y == 'u' || y == 'U')
-                  upper = true;
-                else if (y == 'l' || y == 'L')
-                  lower = true;
-                else if (y == 'm' || y == 'M')
-                  mixed = true;
-              }
-              String number = numberBuf.toString();
-              try
-              {
-                int groupnum = Integer.parseInt(number);
-                String groupValue = m.group(groupnum);
-                if (upper)
-                  outputBuffer.append(groupValue.toUpperCase(Locale.ROOT));
-                else if (lower)
-                  outputBuffer.append(groupValue.toLowerCase(Locale.ROOT));
-                else if (mixed && groupValue.length() > 0)
-                  outputBuffer.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT)).append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-                else
-                  outputBuffer.append(groupValue);
-
-              }
-              catch (NumberFormatException e)
-              {
-                // Silently skip, because it's an illegal group number, so nothing
-                // gets added.
-              }
-
-              // Go back around, so we don't add the $ in
-              continue;
-            }
-          }
-          outputBuffer.append(x);
-        }
-
-        currentIndex = matchEnd;
-      }
-
-      input = outputBuffer.toString();
-    }
-
-    return input;
-  }
-
-
-  // Protected classes
-
-  // These classes are used to process the old token-based replacement strings
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-}
diff --git a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/Messages.java b/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/Messages.java
deleted file mode 100644
index aca576c..0000000
--- a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharedrive;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.sharedrive.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.sharedrive";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java b/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
deleted file mode 100644
index 202adda..0000000
--- a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
+++ /dev/null
@@ -1,4924 +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 org.apache.manifoldcf.crawler.connectors.sharedrive;
-
-import jcifs.smb.ACE;
-import jcifs.smb.NtlmPasswordAuthentication;
-import jcifs.smb.SmbException;
-import jcifs.smb.SmbFile;
-import jcifs.smb.SmbFileFilter;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.connectorcommon.extmimemap.ExtensionMimeMap;
-import org.apache.manifoldcf.connectorcommon.interfaces.IKeystoreManager;
-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;
-import org.apache.manifoldcf.core.common.DateParser;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.Configuration;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.LockManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IFingerprintActivity;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.net.MalformedURLException;
-import java.net.UnknownHostException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-
-/** This is the "repository connector" for a smb/cifs shared drive file system.  It's a relative of the share crawler, and should have
-* comparable basic functionality.
-*/
-public class SharedDriveConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: SharedDriveConnector.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Activities we log
-  public final static String ACTIVITY_ACCESS = "access";
-
-  // These are the share connector nodes and attributes in the document specification
-  public static final String NODE_STARTPOINT = "startpoint";
-  public static final String NODE_INCLUDE = "include";
-  public static final String NODE_EXCLUDE = "exclude";
-  public static final String NODE_PATHNAMEATTRIBUTE = "pathnameattribute";
-  public static final String NODE_PATHMAP = "pathmap";
-  public static final String NODE_FILEMAP = "filemap";
-  public static final String NODE_URIMAP = "urimap";
-  public static final String NODE_SHAREACCESS = "shareaccess";
-  public static final String NODE_SHARESECURITY = "sharesecurity";
-  public static final String NODE_PARENTFOLDERACCESS = "parentfolderaccess";
-  public static final String NODE_PARENTFOLDERSECURITY = "parentfoldersecurity";
-  public static final String NODE_MAXLENGTH = "maxlength";
-  public static final String NODE_ACCESS = "access";
-  public static final String NODE_SECURITY = "security";
-  public static final String ATTRIBUTE_PATH = "path";
-  public static final String ATTRIBUTE_TYPE = "type";
-  public static final String ATTRIBUTE_INDEXABLE = "indexable";
-  public static final String ATTRIBUTE_FILESPEC = "filespec";
-  public static final String ATTRIBUTE_VALUE = "value";
-  public static final String ATTRIBUTE_TOKEN = "token";
-  public static final String ATTRIBUTE_MATCH = "match";
-  public static final String ATTRIBUTE_REPLACE = "replace";
-  public static final String VALUE_DIRECTORY = "directory";
-  public static final String VALUE_FILE = "file";
-
-  // Properties this connector needs (that can only be configured once)
-  public final static String PROPERTY_JCIFS_USE_NTLM_V1 = "org.apache.manifoldcf.crawler.connectors.jcifs.usentlmv1";
-  
-  // Static initialization of various system properties.  This hopefully takes place
-  // before jcifs is loaded.
-  static
-  {
-    System.setProperty("jcifs.smb.client.soTimeout","150000");
-    System.setProperty("jcifs.smb.client.responseTimeout","120000");
-    System.setProperty("jcifs.resolveOrder","LMHOSTS,DNS,WINS");
-    System.setProperty("jcifs.smb.client.listCount","20");
-    System.setProperty("jcifs.smb.client.dfs.strictView","true");
-  }
-  
-  private String smbconnectionPath = null;
-  private String server = null;
-  private String domain = null;
-  private String username = null;
-  private String password = null;
-  private boolean useSIDs = true;
-  private String binName = null;
-  
-  private NtlmPasswordAuthentication pa;
-  
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;
-
-  /** Constructor.
-  */
-  public SharedDriveConnector()
-  {
-  }
-
-  /** Set thread context.
-  * Use the opportunity to set the system properties we'll need.
-  */
-  @Override
-  public void setThreadContext(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(threadContext);
-    // We need to know whether to operate in NTLMv2 mode, or in NTLM mode.  We do this before jcifs called the first time.
-    boolean useV1 = LockManagerFactory.getBooleanProperty(threadContext, PROPERTY_JCIFS_USE_NTLM_V1, false);
-    if (!useV1)
-    {
-      System.setProperty("jcifs.smb.lmCompatibility","3");
-      System.setProperty("jcifs.smb.client.useExtendedSecurity","true");
-    }
-    else
-    {
-      System.setProperty("jcifs.smb.lmCompatibility","0");
-      System.setProperty("jcifs.smb.client.useExtendedSecurity","false");
-    }
-  }
-  
-  /** Establish a "session".  In the case of the jcifs connector, this just builds the appropriate smbconnectionPath string, and does the necessary checks. */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (smbconnectionPath == null)
-    {
-      
-      // Get the server
-      if (server == null || server.length() == 0)
-        throw new ManifoldCFException("Missing parameter '"+SharedDriveParameters.server+"'");
-
-      // make the smb connection to the server
-      String authenticationString;
-      if (domain == null || domain.length() == 0)
-        domain = null;
-      
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Connecting to: " + "smb://" + ((domain==null)?"":domain)+";"+username+":<password>@" + server + "/");
-
-      try
-      {
-        // use NtlmPasswordAuthentication so that we can reuse credential for DFS support
-        pa = new NtlmPasswordAuthentication(domain,username,password);
-        SmbFile smbconnection = new SmbFile("smb://" + server + "/",pa);
-        smbconnectionPath = getFileCanonicalPath(smbconnection);
-      }
-      catch (MalformedURLException e)
-      {
-        Logging.connectors.error("Unable to access SMB/CIFS share: "+"smb://" + ((domain==null)?"":domain)+";"+username+":<password>@"+ server + "/\n" + e);
-        throw new ManifoldCFException("Unable to access SMB/CIFS share: "+server, e, ManifoldCFException.REPOSITORY_CONNECTION_ERROR);
-      }
-    }
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{ACTIVITY_ACCESS};
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    server = null;
-    domain = null;
-    username = null;
-    password = null;
-    pa = null;
-    smbconnectionPath = null;
-    binName = null;
-    super.disconnect();
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the root directory.
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-
-    // Get the server
-    server = configParameters.getParameter(SharedDriveParameters.server);
-    domain   = configParameters.getParameter(SharedDriveParameters.domain);
-    username = configParameters.getParameter(SharedDriveParameters.username);
-    if (username == null)
-      username = "";
-    password = configParameters.getObfuscatedParameter(SharedDriveParameters.password);
-    if (password == null)
-      password = "";
-    String useSIDsString = configParameters.getParameter(SharedDriveParameters.useSIDs);
-    if (useSIDsString == null)
-      useSIDsString = "true";
-    useSIDs = "true".equals(useSIDsString);
-
-    
-    String configBinName = configParameters.getParameter(SharedDriveParameters.binName);
-    
-    binName = (configBinName == null || configBinName.length() == 0) ? server : configBinName;
-
-    if (binName.length() > 255) // trim the bin name to fit in the database
-      binName = binName.substring(0, 255);
-
-    // Rejigger the username/domain to be sure we PASS in a domain and we do not include the domain attached to the user!
-    // (This became essential at jcifs 1.3.0)
-    int index = username.indexOf("@");
-    if (index != -1)
-    {
-      // Strip off the domain from the user
-      String userDomain = username.substring(index+1);
-      if (domain == null || domain.length() == 0)
-        domain = userDomain;
-      username = username.substring(0,index);
-    }
-    index = username.indexOf("\\");
-    if (index != -1)
-    {
-      String userDomain = username.substring(0,index);
-      if (domain == null || domain.length() == 0)
-        domain = userDomain;
-      username = username.substring(index+1);
-    }
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    return new String[]{binName};
-  }
-
-  /**
-  * Convert a document identifier to a URI. The URI is the URI that will be
-  * the unique key from the search index, and will be presented to the user
-  * as part of the search results.
-  *
-  * @param documentIdentifier
-  *            is the document identifier.
-  * @return the document uri.
-  */
-  protected static String convertToURI(String documentIdentifier, MatchMap fileMap, MatchMap uriMap)
-    throws ManifoldCFException
-  {
-    //
-    // Note well: This MUST be a legal URI!!
-    // e.g.
-    // smb://10.33.65.1/Test Folder/PPT Docs/Dearman_University of Texas 20030220.ppt
-    // file:////10.33.65.1/Test Folder/PPT Docs/Dearman_University of Texas 20030220.ppt
-
-    String serverPath = documentIdentifier.substring("smb://".length());
-
-    // The first mapping converts one server path to another.
-    // If not present, we leave the original path alone.
-    serverPath = fileMap.translate(serverPath);
-
-    // The second mapping, if present, creates a URI, using certain rules.  If not present, the old standard IRI conversion is done.
-    if (uriMap.getMatchCount() != 0)
-    {
-      // URI translation.
-      // First step is to perform utf-8 translation and %-encoding.
-
-        byte[] byteArray = serverPath.getBytes(StandardCharsets.UTF_8);
-        StringBuilder output = new StringBuilder();
-        int i = 0;
-        while (i < byteArray.length)
-        {
-          int x = ((int)byteArray[i++]) & 0xff;
-          if (x >= 0x80 || (x >= 0 && x <= ' ') || x == ':' || x == '?' || x == '^' || x == '{' || x == '}' ||
-            x == '%' || x == '#' || x == '`' || x == ';' || x == '@' || x == '&' || x == '=' || x == '+' ||
-            x == '$' || x == ',')
-          {
-            output.append('%');
-            String hexValue = Integer.toHexString((int)x).toUpperCase(Locale.ROOT);
-            if (hexValue.length() == 1)
-              output.append('0');
-            output.append(hexValue);
-          }
-          else
-            output.append((char)x);
-        }
-
-        // Second step is to perform the mapping.  This strips off the server name and glues on the protocol and web server name, most likely.
-        return uriMap.translate(output.toString());
-    }
-    else
-    {
-      // Convert to a URI that begins with file://///.  This used to be done according to the following IE7 specification:
-      //   http://blogs.msdn.com/ie/archive/2006/12/06/file-uris-in-windows.aspx
-      // However, two factors required change.  First, IE8 decided to no longer adhere to the same specification as IE7.
-      // Second, the ingestion API does not (and will never) accept anything other than a well-formed URI.  Thus, file
-      // specifications are ingested in a canonical form (which happens to be pretty much what this connector used prior to
-      // 3.9.0), and the various clients are responsible for converting that form into something the browser will accept.
-
-        StringBuilder output = new StringBuilder();
-
-        int i = 0;
-        while (i < serverPath.length())
-        {
-          int pos = serverPath.indexOf("/",i);
-          if (pos == -1)
-            pos = serverPath.length();
-          String piece = serverPath.substring(i,pos);
-          // Note well.  This does *not* %-encode some characters such as '#', which are legal in URI's but have special meanings!
-          String replacePiece = URLEncoder.encode(piece);
-          // Convert the +'s back to %20's
-          int j = 0;
-          while (j < replacePiece.length())
-          {
-            int plusPos = replacePiece.indexOf("+",j);
-            if (plusPos == -1)
-              plusPos = replacePiece.length();
-            output.append(replacePiece.substring(j,plusPos));
-            if (plusPos < replacePiece.length())
-            {
-              output.append("%20");
-              plusPos++;
-            }
-            j = plusPos;
-          }
-
-          if (pos < serverPath.length())
-          {
-            output.append("/");
-            pos++;
-          }
-          i = pos;
-        }
-        return "file://///"+output.toString();
-    }
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    if (command.startsWith("folders/"))
-    {
-      String parentFolder = command.substring("folders/".length());
-      try
-      {
-        String[] folders = getChildFolderNames(parentFolder);
-        int i = 0;
-        while (i < folders.length)
-        {
-          String folder = folders[i++];
-          ConfigurationNode node = new ConfigurationNode("folder");
-          node.setValue(folder);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("folder/"))
-    {
-      String folder = command.substring("folder/".length());
-      try
-      {
-        String canonicalFolder = validateFolderName(folder);
-        if (canonicalFolder != null)
-        {
-          ConfigurationNode node = new ConfigurationNode("folder");
-          node.setValue(canonicalFolder);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else
-      return super.requestInfo(output,command);
-    return true;
-  }
-  
-  
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersion is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    try
-    {
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode n = spec.getChild(i);
-        if (n.getType().equals(NODE_STARTPOINT))
-        {
-          // The id returned MUST be in canonical form!!!
-          String seed = mapToIdentifier(n.getAttributeValue(ATTRIBUTE_PATH));
-          if (Logging.connectors.isDebugEnabled())
-          {
-            Logging.connectors.debug("Seed = '"+seed+"'");
-          }
-          activities.addSeedDocument(seed);
-        }
-      }
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("Could not get a canonical path: "+e.getMessage(),e);
-    }
-    catch (UnknownHostException e)
-    {
-      throw new ManifoldCFException("Could not get a canonical path: "+e.getMessage(),e);
-    }
-    return "";
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Read the forced acls.  A null return indicates that security is disabled!!!
-    // A zero-length return indicates that the native acls should be used.
-    // All of this is germane to how we ingest the document, so we need to note it in
-    // the version string completely.
-    String[] acls = getForcedAcls(spec);
-    String[] shareAcls = getForcedShareAcls(spec);
-    String[] parentFolderAcls = getForcedParentFolderAcls(spec);
-    
-    String pathAttributeName = null;
-    MatchMap matchMap = new MatchMap();
-    MatchMap fileMap = new MatchMap();
-    MatchMap uriMap = new MatchMap();
-
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i++);
-      if (n.getType().equals(NODE_PATHNAMEATTRIBUTE))
-        pathAttributeName = n.getAttributeValue(ATTRIBUTE_VALUE);
-      else if (n.getType().equals(NODE_PATHMAP))
-      {
-        // Path mapping info also needs to be looked at, because it affects what is
-        // ingested.
-        String pathMatch = n.getAttributeValue(ATTRIBUTE_MATCH);
-        String pathReplace = n.getAttributeValue(ATTRIBUTE_REPLACE);
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-      else if (n.getType().equals(NODE_FILEMAP))
-      {
-        String pathMatch = n.getAttributeValue(ATTRIBUTE_MATCH);
-        String pathReplace = n.getAttributeValue(ATTRIBUTE_REPLACE);
-        fileMap.appendMatchPair(pathMatch,pathReplace);
-      }
-      else if (n.getType().equals(NODE_URIMAP))
-      {
-        String pathMatch = n.getAttributeValue(ATTRIBUTE_MATCH);
-        String pathReplace = n.getAttributeValue(ATTRIBUTE_REPLACE);
-        uriMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      getSession();
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("JCIFS: Processing '"+documentIdentifier+"'");
-
-      String versionString;
-      SmbFile file;
-      
-      String ingestionURI = null;
-      String pathAttributeValue = null;
-      
-      String[] shareAllow = null;
-      String[] shareDeny = null;
-      boolean shareSecurityOn = false;
-      
-      String[] parentAllow = null;
-      String[] parentDeny = null;
-      boolean parentSecurityOn = false;
-      
-      String[] documentAllow = null;
-      String[] documentDeny = null;
-      boolean documentSecurityOn = false;
-      
-      // Common info we really need to fetch only once
-      long fileLength = 0L;
-      long lastModified = 0L;
-      boolean fileExists = false;
-      boolean fileIsDirectory = false;
-      
-      try
-      {
-        file = new SmbFile(documentIdentifier,pa);
-        fileExists = fileExists(file);
-
-        // File has to exist AND have a non-null canonical path to be readable.  If the canonical path is
-        // null, it means that the windows permissions are not right and directory/file is not readable!!!
-        String newPath = getFileCanonicalPath(file);
-        // We MUST check the specification here, otherwise a recrawl may not delete what it's supposed to!
-        if (fileExists && newPath != null)
-        {
-          fileIsDirectory = fileIsDirectory(file);
-          if (checkInclude(fileIsDirectory,newPath,spec))
-          {
-            if (fileIsDirectory)
-            {
-              // Hmm, this is not correct; version string should be empty for windows directories, since
-              // they are not hierarchical in modified date propagation.
-              // It's a directory. The version ID will be the
-              // last modified date.
-              //long lastModified = fileLastModified(file);
-              //versionString = new Long(lastModified).toString();
-              versionString = "";
-
-            }
-            else
-            {
-              fileLength = fileLength(file);
-              if (checkIncludeFile(fileLength,newPath,spec,activities))
-              {
-                // It's a file of acceptable length.
-                // The ability to get ACLs, list files, and an inputstream under DFS all work now.
-                // The SmbFile for parentFolder acls.
-                SmbFile parentFolder = new SmbFile(file.getParent(),pa);
-
-                // Compute the security information
-                String[] modelArray = new String[0];
-                
-                List<String> allowList = new ArrayList<String>();
-                List<String> denyList = new ArrayList<String>();
-                shareSecurityOn = getFileShareSecuritySet(allowList, denyList, file, shareAcls);
-                shareAllow = allowList.toArray(modelArray);
-                shareDeny = denyList.toArray(modelArray);
-
-                allowList.clear();
-                denyList.clear();
-                parentSecurityOn = getFileSecuritySet(allowList, denyList, parentFolder, parentFolderAcls);
-                parentAllow = allowList.toArray(modelArray);
-                parentDeny = denyList.toArray(modelArray);
-
-                allowList.clear();
-                denyList.clear();
-                documentSecurityOn = getFileSecuritySet(allowList, denyList, file, acls);
-                documentAllow = allowList.toArray(modelArray);
-                documentDeny = denyList.toArray(modelArray);
-                
-                // This is stuff we need for computing the version string AND for indexing
-                lastModified = fileLastModified(file);
-                
-                // The format of this string changed on 11/8/2006 to be comformant with the standard way
-                // acls and metadata descriptions are being stuffed into the version string across connectors.
-
-                // The format of this string changed again on 7/3/2009 to permit the ingestion uri/iri to be included.
-                // This was to support filename/uri mapping functionality.
-
-                StringBuilder sb = new StringBuilder();
-
-                addSecuritySet(sb,shareSecurityOn,shareAllow,shareDeny);
-                addSecuritySet(sb,parentSecurityOn,parentAllow,parentDeny);
-                addSecuritySet(sb,documentSecurityOn,documentAllow,documentDeny);
-
-                // Include the path attribute name and value in the parseable area.
-                if (pathAttributeName != null)
-                {
-                  sb.append('+');
-                  pack(sb,pathAttributeName,'+');
-                  // Calculate path string; we'll include that wholesale in the version
-                  pathAttributeValue = documentIdentifier;
-                  // 3/13/2008
-                  // In looking at what comes into the path metadata attribute by default, and cogitating a bit, I've concluded that
-                  // the smb:// and the server/domain name at the start of the path are just plain old noise, and should be stripped.
-                  // This changes a behavior that has been around for a while, so there is a risk, but a quick back-and-forth with the
-                  // SE's leads me to believe that this is safe.
-
-                  if (pathAttributeValue.startsWith("smb://"))
-                  {
-                    int index = pathAttributeValue.indexOf("/","smb://".length());
-                    if (index == -1)
-                      index = pathAttributeValue.length();
-                    pathAttributeValue = pathAttributeValue.substring(index);
-                  }
-                  // Now, translate
-                  pathAttributeValue = matchMap.translate(pathAttributeValue);
-                  pack(sb,pathAttributeValue,'+');
-                }
-                else
-                  sb.append('-');
-
-                // Calculate the ingestion IRI/URI, and include that in the parseable area.
-                ingestionURI = convertToURI(documentIdentifier,fileMap,uriMap);
-                pack(sb,ingestionURI,'+');
-
-                // The stuff from here on down is non-parseable.
-                sb.append(new Long(lastModified).toString()).append(":")
-                  .append(new Long(fileLength).toString());
-                // Also include the specification-based answer for the question of whether fingerprinting is
-                // going to be done.  Although we may not consider this to truly be "version" information, the
-                // specification does affect whether anything is ingested or not, so it really is.  The alternative
-                // is to fingerprint right here, in the version part of the world, but that's got a performance
-                // downside, because it means that we'd have to suck over pretty much everything just to determine
-                // what we wanted to ingest.
-                boolean ifIndexable = wouldFileBeIncluded(newPath,spec,true);
-                boolean ifNotIndexable = wouldFileBeIncluded(newPath,spec,false);
-                if (ifIndexable == ifNotIndexable)
-                  sb.append("I");
-                else
-                  sb.append(ifIndexable?"Y":"N");
-                versionString = sb.toString();
-              }
-              else
-              {
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-            }
-          }
-          else
-          {
-            activities.deleteDocument(documentIdentifier);
-            continue;
-          }
-        }
-        else
-        {
-          activities.deleteDocument(documentIdentifier);
-          continue;
-        }
-      }
-      catch (jcifs.smb.SmbAuthException e)
-      {
-        Logging.connectors.warn("JCIFS: Authorization exception reading version information for "+documentIdentifier+" - skipping");
-        if(e.getMessage().equals("Logon failure: unknown user name or bad password."))
-            throw new ManifoldCFException( "SmbAuthException thrown: " + e.getMessage(), e );
-        else {
-            activities.deleteDocument(documentIdentifier );
-            continue;
-          }
-      }
-      catch (MalformedURLException mue)
-      {
-        Logging.connectors.error("JCIFS: MalformedURLException thrown: "+mue.getMessage(),mue);
-        throw new ManifoldCFException("MalformedURLException thrown: "+mue.getMessage(),mue);
-      }
-      catch (SmbException se)
-      {
-        processSMBException(se,documentIdentifier,"getting document version","fetching share security");
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        Logging.connectors.warn("JCIFS: Socket timeout reading version information for document "+documentIdentifier+": "+e.getMessage(),e);
-        throw new ServiceInterruption("Timeout or other service interruption: "+e.getMessage(),e,currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        Logging.connectors.warn("JCIFS: I/O error reading version information for document "+documentIdentifier+": "+e.getMessage(),e);
-        throw new ServiceInterruption("Timeout or other service interruption: "+e.getMessage(),e,currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-      
-      if (versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-      {
-        String errorCode = null;
-        String errorDesc = null;
-        Long fileLengthLong = null;
-        long startFetchTime = System.currentTimeMillis();
-        try
-        {
-          byte[] transferBuffer = null;
-
-          try
-          {
-
-            if (fileExists)
-            {
-              if (fileIsDirectory)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("JCIFS: '"+documentIdentifier+"' is a directory");
-
-                // Queue up stuff for directory
-                // DFS special support no longer needed, because JCifs now does the right thing.
-
-                // This is the string we replace in the child canonical paths.
-                // String matchPrefix = "";
-                // This is what we replace it with, to get back to a DFS path.
-                // String matchReplace = "";
-
-                // DFS resolved.
-
-                // Use a filter to actually do the work here.  This prevents large arrays from being
-                // created when there are big directories.
-                ProcessDocumentsFilter filter = new ProcessDocumentsFilter(activities,spec);
-                fileListFiles(file,filter);
-                filter.checkAndThrow();
-              }
-              else
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("JCIFS: '"+documentIdentifier+"' is a file");
-
-                // We've already avoided queuing documents that we
-                // don't want, based on file specifications.
-                // We still need to check based on file data.
-
-                // DFS support is now implicit in JCifs.
-
-                String fileName = getFileCanonicalPath(file);
-                if (fileName != null && !file.isHidden())
-                {
-                  String uri = ingestionURI;
-                  String fileNameString = file.getName();
-                  Date lastModifiedDate = new Date(lastModified);
-                  Date creationDate = new Date(file.createTime());
-                  Long originalLength = new Long(fileLength);
-                  String contentType = mapExtensionToMimeType(fileNameString);
-
-                  if (!activities.checkURLIndexable(uri))
-                  {
-                    Logging.connectors.debug("JCIFS: Skipping file because output connector cannot accept URL ('"+uri+"')");
-                    errorCode = activities.EXCLUDED_URL;
-                    errorDesc = "Rejected due to URL ('"+uri+"')";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                  }
-
-                  if (!activities.checkMimeTypeIndexable(contentType))
-                  {
-                    Logging.connectors.debug("JCIFS: Skipping file because output connector cannot accept content type ('"+contentType+"')");
-                    errorCode = activities.EXCLUDED_MIMETYPE;
-                    errorDesc = "Rejected due to mime type ("+contentType+")";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                  }
-
-                  if (!activities.checkDateIndexable(lastModifiedDate))
-                  {
-                    Logging.connectors.debug("JCIFS: Skipping file because output connector cannot accept date ("+lastModifiedDate+")");
-                    errorCode = activities.EXCLUDED_DATE;
-                    errorDesc = "Rejected due to date ("+lastModifiedDate+")";
-                    activities.noDocument(documentIdentifier,versionString);
-                    continue;
-                  }
-
-                  // Initialize repository document with common stuff, and find the URI
-                  RepositoryDocument rd = new RepositoryDocument();
-                  
-                  //If using the lastAccess patched/Google version of jcifs then this can be uncommented
-                  //Date lastAccessDate = new Date(file.lastAccess());
-                  Integer attributes = file.getAttributes();
-                  String shareName = file.getShare();
-
-                  rd.setFileName(fileNameString);
-                  rd.setOriginalSize(originalLength);
-                  
-                  if (contentType != null)
-                    rd.setMimeType(contentType);
-                  rd.addField("lastModified", lastModifiedDate.toString());
-                  rd.addField("fileLastModified",DateParser.formatISO8601Date(lastModifiedDate));
-                  rd.setModifiedDate(lastModifiedDate);
-                  
-                  // Add extra obtainable fields to the field map
-                  rd.addField("createdOn", creationDate.toString());
-                  rd.addField("fileCreatedOn",DateParser.formatISO8601Date(creationDate));
-                  rd.setCreatedDate(creationDate);
-
-                  //rd.addField("lastAccess", lastModifiedDate.toString());
-                  rd.addField("attributes", Integer.toString(attributes));
-                  rd.addField("shareName", shareName);
-
-                  setDocumentSecurity(rd,shareAllow,shareDeny,parentAllow,parentDeny,documentAllow,documentDeny);
-                  setPathMetadata(rd,pathAttributeName,pathAttributeValue);
-
-                  // manipulate path to include the DFS alias, not the literal path
-                  // String newPath = matchPrefix + fileName.substring(matchReplace.length());
-                  String newPath = fileName;
-                  if (checkNeedFileData(newPath, spec))
-                  {
-                    if (Logging.connectors.isDebugEnabled())
-                      Logging.connectors.debug("JCIFS: Local file data needed for '"+documentIdentifier+"'");
-
-                    // Create a temporary file, and use that for the check and then the ingest
-                    File tempFile = File.createTempFile("_sdc_",null);
-                    try
-                    {
-                      FileOutputStream os = new FileOutputStream(tempFile);
-                      try
-                      {
-
-                        // Now, make a local copy so we can fingerprint
-                        InputStream inputStream = getFileInputStream(file);
-                        try
-                        {
-                          // Copy!
-                          if (transferBuffer == null)
-                            transferBuffer = new byte[65536];
-                          while (true)
-                          {
-                            int amt = inputStream.read(transferBuffer,0,transferBuffer.length);
-                            if (amt == -1)
-                              break;
-                            os.write(transferBuffer,0,amt);
-                          }
-                        }
-                        finally
-                        {
-                          inputStream.close();
-                        }
-                      }
-                      finally
-                      {
-                        os.close();
-                      }
-
-                      if (checkIngest(tempFile, newPath, spec, activities))
-                      {
-                        // Not needed; fetched earlier: long fileLength = tempFile.length();
-                        if (!activities.checkLengthIndexable(fileLength))
-                        {
-                          Logging.connectors.debug("JCIFS: Skipping file because output connector cannot accept length ("+fileLength+")");
-                          errorCode = activities.EXCLUDED_LENGTH;
-                          errorDesc = "Rejected due to length ("+fileLength+")";
-                          activities.noDocument(documentIdentifier,versionString);
-                          continue;
-                        }
-
-                        if (Logging.connectors.isDebugEnabled())
-                          Logging.connectors.debug("JCIFS: Decided to ingest '"+documentIdentifier+"'");
-                        // OK, do ingestion itself!
-                        InputStream inputStream = new FileInputStream(tempFile);
-                        try
-                        {
-                          rd.setBinary(inputStream, fileLength);
-                            
-                          activities.ingestDocumentWithException(documentIdentifier, versionString, uri, rd);
-                          errorCode = "OK";
-                          fileLengthLong = new Long(fileLength);
-                        }
-                        finally
-                        {
-                          inputStream.close();
-                        }
-
-                      }
-                      else
-                      {
-                        // We must actively remove the document here, because the getDocumentVersions()
-                        // method has no way of signalling this, since it does not do the fingerprinting.
-                        if (Logging.connectors.isDebugEnabled())
-                          Logging.connectors.debug("JCIFS: Decided to remove '"+documentIdentifier+"'");
-                        activities.noDocument(documentIdentifier, versionString);
-                        errorCode = "NOWORKNEEDED";
-                        errorDesc = "No indexing needed for document at this time";
-                      }
-                    }
-                    finally
-                    {
-                      tempFile.delete();
-                    }
-                  }
-                  else
-                  {
-                    if (Logging.connectors.isDebugEnabled())
-                      Logging.connectors.debug("JCIFS: Local file data not needed for '"+documentIdentifier+"'");
-
-                    // Not needed; fetched earlier: long fileLength = fileLength(file);
-                    if (!activities.checkLengthIndexable(fileLength))
-                    {
-                      Logging.connectors.debug("JCIFS: Skipping file because output connector cannot accept length ("+fileLength+")");
-                      errorCode = activities.EXCLUDED_LENGTH;
-                      errorDesc = "Rejected because of length ("+fileLength+")";
-                      activities.noDocument(documentIdentifier,versionString);
-                      continue;
-                    }
-
-                    // Presume that since the file was queued that it fulfilled the needed criteria.
-                    // Go off and ingest the fast way.
-                    
-                    // Ingest the document.
-                    InputStream inputStream = getFileInputStream(file);
-                    try
-                    {
-                      rd.setBinary(inputStream, fileLength);
-                        
-                      activities.ingestDocumentWithException(documentIdentifier, versionString, uri, rd);
-                      errorCode = "OK";
-                      fileLengthLong = new Long(fileLength);
-                    }
-                    finally
-                    {
-                      inputStream.close();
-                    }
-                  }
-                }
-                else
-                {
-                  Logging.connectors.debug("JCIFS: Skipping file because canonical path is null, or because file is hidden");
-                  errorCode = "NULLORHIDDEN";
-                  errorDesc = "Null canonical path or hidden file";
-                  activities.noDocument(documentIdentifier,versionString);
-                  continue;
-                }
-              }
-            }
-          }
-          catch (MalformedURLException mue)
-          {
-            Logging.connectors.error("MalformedURLException tossed: "+mue.getMessage(),mue);
-            errorCode = mue.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = "Malformed URL: "+mue.getMessage();
-            throw new ManifoldCFException("MalformedURLException tossed: "+mue.getMessage(),mue);
-          }
-          catch (jcifs.smb.SmbAuthException e)
-          {
-            Logging.connectors.warn("JCIFS: Authorization exception reading document/directory "+documentIdentifier+" - skipping");
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = "Authorization: "+e.getMessage();
-              if(e.getMessage().equals("Logon failure: unknown user name or bad password."))
-                  throw new ManifoldCFException( "SmbAuthException thrown: " + e.getMessage(), e );
-              else {
-                  activities.noDocument(documentIdentifier, versionString);
-                  continue;
-              }
-          }
-          catch (SmbException se)
-          {
-            // At least some of these are transport errors, and should be treated as service
-            // interruptions.
-            long currentTime = System.currentTimeMillis();
-            Throwable cause = se.getRootCause();
-            if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-            {
-              // See if it's an interruption
-              jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-              if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-                throw new ManifoldCFException(te.getRootCause().getMessage(),te.getRootCause(),ManifoldCFException.INTERRUPTED);
-
-              Logging.connectors.warn("JCIFS: Timeout processing document/directory "+documentIdentifier+": retrying...",se);
-              errorCode = cause.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Transport: "+cause.getMessage();
-              throw new ServiceInterruption("Timeout or other service interruption: "+cause.getMessage(),cause,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,false);
-            }
-            if (se.getMessage().indexOf("reset by peer") != -1 ||
-              se.getMessage().indexOf("busy") != -1 || 
-            se.getMessage().toLowerCase(Locale.ROOT).indexOf("file in use") != -1 || 
-            se.getMessage().toLowerCase(Locale.ROOT).indexOf("is being used") != -1)
-            {
-              Logging.connectors.warn("JCIFS: 'Busy' response when processing document/directory for "+documentIdentifier+": retrying...",se);
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Busy: "+se.getMessage();
-              throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-                currentTime + 3 * 60 * 60000L,-1,true);
-            }
-            else if (se.getMessage().indexOf("handle is invalid") != -1)
-            {
-              Logging.connectors.warn("JCIFS: 'Handle is invalid' response when processing document/directory for "+documentIdentifier+": retrying...",se);
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Expiration: "+se.getMessage();
-              throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-                currentTime + 3 * 60 * 60000L,-1,false);
-            }
-            else if (se.getMessage().indexOf("parameter is incorrect") != -1)
-            {
-              Logging.connectors.warn("JCIFS: 'Parameter is incorrect' response when processing document/directory for "+documentIdentifier+": retrying...",se);
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Expiration: "+se.getMessage();
-              throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-                currentTime + 3 * 60 * 60000L,-1,false);
-            }
-            else if (se.getMessage().indexOf("no longer available") != -1)
-            {
-              Logging.connectors.warn("JCIFS: 'No longer available' response when processing document/directory for "+documentIdentifier+": retrying...",se);
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Expiration: "+se.getMessage();
-              throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-                currentTime + 3 * 60 * 60000L,-1,false);
-            }
-            else if (se.getMessage().indexOf("cannot find") != -1 || se.getMessage().indexOf("cannot be found") != -1)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("JCIFS: Skipping document/directory "+documentIdentifier+" because it cannot be found");
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Not found: "+se.getMessage();
-              activities.noDocument(documentIdentifier, versionString);
-            }
-            else if (se.getMessage().indexOf("0xC0000205") != -1)
-            {
-              Logging.connectors.warn("JCIFS: Out of resources exception reading document/directory "+documentIdentifier+" - skipping");
-              // We call the delete even if it's a directory; this is harmless and it cleans up the jobqueue row.
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Resources: "+se.getMessage();
-              activities.noDocument(documentIdentifier, versionString);
-            }
-            else if (se.getMessage().indexOf("is denied") != -1)
-            {
-              Logging.connectors.warn("JCIFS: Access exception reading document/directory "+documentIdentifier+" - skipping");
-              // We call the delete even if it's a directory; this is harmless and it cleans up the jobqueue row.
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Authorization: "+se.getMessage();
-              activities.noDocument(documentIdentifier, versionString);
-            }
-            else
-            {
-              Logging.connectors.error("JCIFS: SmbException tossed processing "+documentIdentifier,se);
-              errorCode = se.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = "Unknown: "+se.getMessage();
-              throw new ManifoldCFException("SmbException tossed: "+se.getMessage(),se);
-            }
-          }
-          catch (IOException e)
-          {
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            handleIOException(documentIdentifier,e);
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            errorCode = null;
-          throw e;
-        }
-        finally
-        {
-          if (errorCode != null)
-            activities.recordActivity(new Long(startFetchTime),ACTIVITY_ACCESS,
-              fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-        }
-        
-      }
-    }
-  }
-
-  protected static void handleIOException(String documentIdentifier, IOException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      long currentTime = System.currentTimeMillis();
-      Logging.connectors.warn("JCIFS: Socket timeout processing "+documentIdentifier+": "+e.getMessage(),e);
-            throw new ServiceInterruption("Timeout or other service interruption: "+e.getMessage(),e,currentTime + 300000L,
-              currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    else if (e instanceof InterruptedIOException)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    else
-    {
-      long currentTime = System.currentTimeMillis();
-      Logging.connectors.warn("JCIFS: IO error processing "+documentIdentifier+": "+e.getMessage(),e);
-      throw new ServiceInterruption("Timeout or other service interruption: "+e.getMessage(),e,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-  }
-  
-  /** Map an extension to a mime type */
-  protected static String mapExtensionToMimeType(String fileName)
-  {
-    int slashIndex = fileName.lastIndexOf("/");
-    if (slashIndex != -1)
-      fileName = fileName.substring(slashIndex+1);
-    int dotIndex = fileName.lastIndexOf(".");
-    if (dotIndex == -1)
-      return null;
-    return ExtensionMimeMap.mapToMimeType(fileName.substring(dotIndex+1).toLowerCase(java.util.Locale.ROOT));
-  }
-  
-  protected static void addSecuritySet(StringBuilder description,
-    boolean enabled, String[] allowTokens, String[] denyTokens)
-  {
-    if (enabled)
-    {
-      description.append("+");
-      java.util.Arrays.sort(allowTokens);
-      java.util.Arrays.sort(denyTokens);
-      // Stuff the acls into the description string.
-      packList(description,allowTokens,'+');
-      packList(description,denyTokens,'+');
-    }
-    else
-      description.append("-");
-
-  }
-  
-  protected boolean getFileSecuritySet(List<String> allowList, List<String> denyList, SmbFile file, String[] forced)
-    throws ManifoldCFException, IOException
-  {
-    if (forced != null)
-    {
-      if (forced.length == 0)
-      {
-        convertACEs(allowList,denyList,getFileSecurity(file, useSIDs));
-      }
-      else
-      {
-        for (String forcedToken : forced)
-        {
-          allowList.add(forcedToken);
-        }
-        denyList.add(defaultAuthorityDenyToken);
-      }
-      return true;
-    }
-    else
-      return false;
-  }
-
-  protected boolean getFileShareSecuritySet(List<String> allowList, List<String> denyList, SmbFile file, String[] forced)
-    throws ManifoldCFException, IOException
-  {
-    if (forced != null)
-    {
-      if (forced.length == 0)
-      {
-        convertACEs(allowList,denyList,getFileShareSecurity(file, useSIDs));
-      }
-      else
-      {
-        for (String forcedToken : forced)
-        {
-          allowList.add(forcedToken);
-        }
-        denyList.add(defaultAuthorityDenyToken);
-      }
-      return true;
-    }
-    else
-      return false;
-  }
-  
-  protected void convertACEs(List<String> allowList, List<String> denyList, ACE[] aces)
-  {
-    if (aces == null)
-    {
-      // "Public" share: S-1-1-0
-      allowList.add("S-1-1-0");
-      denyList.add(defaultAuthorityDenyToken);
-    }
-    else
-    {
-      denyList.add(defaultAuthorityDenyToken);
-      for (ACE ace : aces)
-      {
-        if ((ace.getAccessMask() & ACE.FILE_READ_DATA) != 0)
-        {
-          if (ace.isAllow())
-            allowList.add(useSIDs ? ace.getSID().toString() : ace.getSID().getAccountName());
-          else
-            denyList.add(useSIDs ? ace.getSID().toString() : ace.getSID().getAccountName());
-        }
-      }
-    }
-  }
-  
-
-  protected static void processSMBException(SmbException se, String documentIdentifier, String activity, String operation)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // At least some of these are transport errors, and should be treated as service
-    // interruptions.
-    long currentTime = System.currentTimeMillis();
-    Throwable cause = se.getRootCause();
-    if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-    {
-      // See if it's an interruption
-      jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-      if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-        throw new ManifoldCFException(te.getRootCause().getMessage(),te.getRootCause(),ManifoldCFException.INTERRUPTED);
-      Logging.connectors.warn("JCIFS: Timeout "+activity+" for "+documentIdentifier+": retrying...",se);
-      // Transport exceptions no longer abort when they give up, so we can't get notified that there is a problem.
-
-      throw new ServiceInterruption("Timeout or other service interruption: "+cause.getMessage(),cause,currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,false);
-    }
-    if (se.getMessage().indexOf("busy") != -1)
-    {
-      Logging.connectors.warn("JCIFS: 'Busy' response when "+activity+" for "+documentIdentifier+": retrying...",se);
-      // Busy exceptions just skip the document and keep going
-      throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    else if (se.getMessage().indexOf("handle is invalid") != -1)
-    {
-      Logging.connectors.warn("JCIFS: 'Handle is invalid' response when "+activity+" for "+documentIdentifier+": retrying...",se);
-      // Invalid handle errors treated like "busy"
-      throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    else if (se.getMessage().indexOf("parameter is incorrect") != -1)
-    {
-      Logging.connectors.warn("JCIFS: 'Parameter is incorrect' response when "+activity+" for "+documentIdentifier+": retrying...",se);
-      // Invalid handle errors treated like "busy"
-      throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    else if (se.getMessage().indexOf("no longer available") != -1)
-    {
-      Logging.connectors.warn("JCIFS: 'No longer available' response when "+activity+" for "+documentIdentifier+": retrying...",se);
-      // No longer available == busy
-      throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    else if(se.getMessage().indexOf("No process is on the other end of the pipe") != -1)
-    {
-      Logging.connectors.warn("JCIFS: 'No process is on the other end of the pipe' response when "+activity+" for "+documentIdentifier+": retrying...",se);
-      // 'No process is on the other end of the pipe' skip the document and keep going
-      throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    else if (se.getMessage().toLowerCase(Locale.ROOT).indexOf("busy") != -1 || 
-      se.getMessage().toLowerCase(Locale.ROOT).indexOf("file in use") != -1 ||
-      se.getMessage().toLowerCase(Locale.ROOT).indexOf("is being used") != -1)
-    {
-      Logging.connectors.warn("JCIFS: 'File in Use' response when "+activity+" for "+documentIdentifier+": retrying...",se);
-      // 'File in Use' skip the document and keep going
-      throw new ServiceInterruption("Timeout or other service interruption: "+se.getMessage(),se,currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,true);
-    }
-    else if (se.getMessage().indexOf("cannot find") != -1 || se.getMessage().indexOf("cannot be found") != -1)
-    {
-      return;
-    }
-    else if (se.getMessage().indexOf("is denied") != -1)
-    {
-      Logging.connectors.warn("JCIFS: Access exception when "+activity+" for "+documentIdentifier+" - skipping");
-      return;
-    }
-    else if (se.getMessage().indexOf("Incorrect function") != -1)
-    {
-      Logging.connectors.error("JCIFS: Server does not support a required operation ("+operation+"?) for "+documentIdentifier);
-      throw new ManifoldCFException("Server does not support a required operation ("+operation+", possibly?) accessing document "+documentIdentifier,se);
-    }
-    else
-    {
-      Logging.connectors.error("SmbException thrown "+activity+" for "+documentIdentifier,se);
-      throw new ManifoldCFException("SmbException thrown: "+se.getMessage(),se);
-    }
-  }
-
-  protected static void setDocumentSecurity(RepositoryDocument rd,
-    String[] shareAllow, String[] shareDeny,
-    String[] parentAllow, String[] parentDeny,
-    String[] allow, String[] deny)
-  {
-    // set share acls
-    if (shareAllow.length > 0 || shareDeny.length > 0)
-      rd.setSecurity(RepositoryDocument.SECURITY_TYPE_SHARE,shareAllow,shareDeny);
-    // set parent folder acls
-    if (parentAllow.length > 0 || parentDeny.length > 0)
-      rd.setSecurity(RepositoryDocument.SECURITY_TYPE_PARENT,parentAllow,parentDeny);
-    // set native file acls
-    if (allow.length > 0 || deny.length > 0)
-      rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,allow,deny);
-  }
-
-  protected static void setPathMetadata(RepositoryDocument rd, String pathAttributeName, String pathAttributeValue)
-    throws ManifoldCFException
-  {
-    if (pathAttributeName != null && pathAttributeValue != null) {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("JCIFS: Path attribute name is '"+pathAttributeName+"'");
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("JCIFS: Path attribute value is '"+pathAttributeValue+"'");
-      rd.addField(pathAttributeName,pathAttributeValue);
-    }
-    else
-      Logging.connectors.debug("JCIFS: Path attribute name is null");
-  }
-
-  /** Check status of connection.
-  */
-  @Override
-
-  public String check()
-    throws ManifoldCFException
-  {
-    getSession();
-    String serverURI = smbconnectionPath;
-    SmbFile server = null;
-    try
-    {
-      server = new SmbFile(serverURI,pa);
-    }
-    catch (MalformedURLException e1)
-    {
-      return "Malformed URL: '"+serverURI+"': "+e1.getMessage();
-    }
-    try
-    {
-      // check to make sure it's a server or a folder
-      int type = getFileType(server);
-      if (type==SmbFile.TYPE_SERVER || type==SmbFile.TYPE_SHARE
-        || type==SmbFile.TYPE_FILESYSTEM)
-      {
-        try
-        {
-          server.connect();
-          if (!server.exists())
-            return "Server or path does not exist";
-        }
-        catch (java.net.SocketTimeoutException e)
-        {
-          return "Timeout connecting to server: "+e.getMessage();
-        }
-        catch (InterruptedIOException e)
-        {
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (IOException e)
-        {
-          return "Couldn't connect to server: "+e.getMessage();
-        }
-        return super.check();
-      }
-      else
-        return "URI is not a server URI: '"+serverURI+"'";
-    }
-    catch (SmbException e)
-    {
-      return "Could not connect: "+e.getMessage();
-    }
-  }
-
-  // Protected methods
-
-  /** Check if a file's stats are OK for inclusion.
-  */
-  protected static boolean checkIncludeFile(long fileLength, String fileName, Specification documentSpecification, IFingerprintActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // If it's a file, make sure the maximum length is not exceeded
-    if (!activities.checkLengthIndexable(fileLength) ||
-      !activities.checkMimeTypeIndexable(mapExtensionToMimeType(fileName)))
-      return false;
-    long maxFileLength = Long.MAX_VALUE;
-    for (int i = 0; i < documentSpecification.getChildCount(); i++)
-    {
-      SpecificationNode sn = documentSpecification.getChild(i);
-      if (sn.getType().equals(NODE_MAXLENGTH))
-      {
-        try
-        {
-          String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-          if (value != null && value.length() > 0)
-            maxFileLength = new Long(value).longValue();
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-        }
-      }
-    }
-    if (fileLength > maxFileLength)
-      return false;
-    return true;
-  }
-
-
-  /** Check if a file or directory should be included, given a document specification.
-  *@param isDirectory is true if the file is a directory.
-  *@param fileName is the canonical file name.
-  *@param documentSpecification is the specification.
-  *@return true if it should be included.
-  */
-  protected boolean checkInclude(boolean isDirectory, String fileName, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("JCIFS: In checkInclude for '"+fileName+"'");
-
-    // This method does not attempt to do any fingerprinting.  Instead, it will opt to include any
-    // file that may depend on fingerprinting, and exclude everything else.  The actual setup for
-    // the fingerprinting test is in checkNeedFileData(), while the actual code that determines in vs.
-    // out using the file data is in checkIngest().
-    try
-    {
-      String pathPart;
-      String filePart;
-      if (isDirectory)
-      {
-
-        pathPart = fileName;
-        filePart = null;
-      }
-      else
-      {
-        int lastSlash = fileName.lastIndexOf("/");
-        if (lastSlash == -1)
-        {
-          pathPart = "";
-          filePart = fileName;
-        }
-        else
-        {
-          // Pathpart has to include the slash
-          pathPart = fileName.substring(0,lastSlash+1);
-          filePart = fileName.substring(lastSlash+1);
-        }
-      }
-
-      int i;
-
-      // Scan until we match a startpoint
-      i = 0;
-      while (i < documentSpecification.getChildCount())
-      {
-        SpecificationNode sn = documentSpecification.getChild(i++);
-        if (sn.getType().equals(NODE_STARTPOINT))
-        {
-          // Prepend the server URL to the path, since that's what pathpart will have.
-          String path = mapToIdentifier(sn.getAttributeValue(ATTRIBUTE_PATH));
-
-          // Compare with filename
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("JCIFS: Matching startpoint '"+path+"' against actual '"+pathPart+"'");
-          int matchEnd = matchSubPath(path,pathPart);
-          if (matchEnd == -1)
-          {
-            Logging.connectors.debug("JCIFS: No match");
-            continue;
-          }
-
-          Logging.connectors.debug("JCIFS: Startpoint found!");
-
-          // If this is the root, it's always included.
-          if (matchEnd == fileName.length())
-          {
-            Logging.connectors.debug("JCIFS: Startpoint: always included");
-            return true;
-          }
-
-          // matchEnd is the start of the rest of the path (after the match) in fileName.
-          // We need to walk through the rules and see whether it's in or out.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode node = sn.getChild(j++);
-            String flavor = node.getType();
-            if (flavor.equals(NODE_INCLUDE) || flavor.equals(NODE_EXCLUDE))
-            {
-              String type = node.getAttributeValue(ATTRIBUTE_TYPE);
-              if (type == null)
-                type = "";
-              String indexable = node.getAttributeValue(ATTRIBUTE_INDEXABLE);
-              if (indexable == null)
-                indexable = "";
-              String match = node.getAttributeValue(ATTRIBUTE_FILESPEC);
-
-              // Check if there's a match against the filespec
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("JCIFS: Checking '"+match+"' against '"+fileName.substring(matchEnd-1)+"'");
-              boolean isMatch = checkMatch(fileName,matchEnd-1,match);
-              boolean isKnown = true;
-
-              // Check the directory/file criteria
-              if (isMatch)
-              {
-                Logging.connectors.debug("JCIFS: Match found.");
-                isMatch = type.length() == 0 ||
-                  (type.equals(VALUE_DIRECTORY) && isDirectory) ||
-                  (type.equals(VALUE_FILE) && !isDirectory);
-              }
-              else
-                Logging.connectors.debug("JCIFS: No match!");
-
-              // Check the indexable criteria
-              if (isMatch)
-              {
-                if (indexable.length() != 0)
-                {
-                  // Directories are never considered indexable.
-                  // But if this is not a directory, things become ambiguous.
-                  boolean isIndexable;
-                  if (isDirectory)
-                  {
-                    isIndexable = false;
-                    isMatch = (indexable.equals("yes") && isIndexable) ||
-                      (indexable.equals("no") && !isIndexable);
-                  }
-                  else
-                    isKnown = false;
-
-                }
-              }
-
-              if (isKnown)
-              {
-                if (isMatch)
-                {
-                  if (flavor.equals(NODE_INCLUDE))
-                    return true;
-                  else
-                    return false;
-                }
-              }
-              else
-              {
-                // Not known
-                // What we do depends on whether this is an include rule or an exclude one.
-                // We want to err on the side of inclusion, which means for include rules
-                // we return true, and for exclude rules we simply continue.
-                if (flavor.equals(NODE_INCLUDE))
-                  return true;
-                // Continue
-              }
-            }
-          }
-
-        }
-      }
-      return false;
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("Couldn't map to canonical path: "+e.getMessage(),e);
-    }
-    catch (UnknownHostException e)
-    {
-      throw new ManifoldCFException("Couldn't map to canonical path: "+e.getMessage(),e);
-    }
-    finally
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("JCIFS: Leaving checkInclude for '"+fileName+"'");
-    }
-
-  }
-
-  /** Pretend that a file is either indexable or not, and return whether or not it would be ingested.
-  * This is only ever called for files.
-  *@param fileName is the canonical file name.
-  *@param documentSpecification is the specification.
-  *@param pretendIndexable should be set to true if the document's contents would be fingerprinted as "indexable",
-  *       or false otherwise.
-  *@return true if the file would be ingested given the parameters.
-  */
-  protected boolean wouldFileBeIncluded(String fileName, Specification documentSpecification,
-    boolean pretendIndexable)
-    throws ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("JCIFS: In wouldFileBeIncluded for '"+fileName+"', pretendIndexable="+(pretendIndexable?"true":"false"));
-
-    // This file was flagged as needing file data.  However, that doesn't tell us *for what* we need it.
-    // So we need to redo the decision tree, but this time do everything completely.
-
-    try
-    {
-      String pathPart;
-      String filePart;
-      boolean isDirectory = false;
-
-      int lastSlash = fileName.lastIndexOf("/");
-      if (lastSlash == -1)
-      {
-        pathPart = "";
-        filePart = fileName;
-      }
-      else
-      {
-        pathPart = fileName.substring(0,lastSlash+1);
-        filePart = fileName.substring(lastSlash+1);
-      }
-
-      // Scan until we match a startpoint
-      int i = 0;
-      while (i < documentSpecification.getChildCount())
-      {
-        SpecificationNode sn = documentSpecification.getChild(i++);
-        if (sn.getType().equals(NODE_STARTPOINT))
-        {
-          // Prepend the server URL to the path, since that's what pathpart will have.
-          String path = mapToIdentifier(sn.getAttributeValue(ATTRIBUTE_PATH));
-
-          // Compare with filename
-          int matchEnd = matchSubPath(path,pathPart);
-          if (matchEnd == -1)
-          {
-            continue;
-          }
-
-          // matchEnd is the start of the rest of the path (after the match) in fileName.
-          // We need to walk through the rules and see whether it's in or out.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode node = sn.getChild(j++);
-            String flavor = node.getType();
-            if (flavor.equals(NODE_INCLUDE) || flavor.equals(NODE_EXCLUDE))
-            {
-              String type = node.getAttributeValue(ATTRIBUTE_TYPE);
-              if (type == null)
-                type = "";
-              String indexable = node.getAttributeValue(ATTRIBUTE_INDEXABLE);
-              if (indexable == null)
-                indexable = "";
-              String match = node.getAttributeValue(ATTRIBUTE_FILESPEC);
-
-              // Check if there's a match against the filespec
-              boolean isMatch = checkMatch(fileName,matchEnd-1,match);
-
-              // Check the directory/file criteria
-              if (isMatch)
-              {
-                isMatch = type.length() == 0 ||
-                  (type.equals(VALUE_DIRECTORY) && isDirectory) ||
-                  (type.equals(VALUE_FILE) && !isDirectory);
-              }
-
-              // Check the indexable criteria
-              if (isMatch)
-              {
-                if (indexable.length() != 0)
-                {
-                  // Directories are never considered indexable.
-                  // But if this is not a directory, things become ambiguous.
-                  boolean isIndexable;
-                  if (isDirectory)
-                    isIndexable = false;
-                  else
-                  {
-                    // Evaluate the parts of being indexable that are based on the filename, mime type, and url
-                    isIndexable = pretendIndexable;
-                  }
-
-                  isMatch = (indexable.equals("yes") && isIndexable) ||
-                    (indexable.equals("no") && !isIndexable);
-
-
-                }
-              }
-
-              if (isMatch)
-              {
-                if (flavor.equals(NODE_INCLUDE))
-                  return true;
-                else
-                  return false;
-              }
-            }
-          }
-
-        }
-      }
-      return false;
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("Couldn't map to canonical path: "+e.getMessage(),e);
-    }
-    catch (UnknownHostException e)
-    {
-      throw new ManifoldCFException("Couldn't map to canonical path: "+e.getMessage(),e);
-    }
-    finally
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("JCIFS: Leaving wouldFileBeIncluded for '"+fileName+"'");
-    }
-  }
-
-  /** Check to see whether we need the contents of the file for anything.  We do this by assuming that
-  * the file is indexable, and assuming that it's not, and seeing if the same thing would happen.
-  *@param fileName is the name of the file.
-  *@param documentSpecification is the document specification.
-  *@return true if the file needs to be fingerprinted.
-  */
-  protected boolean checkNeedFileData(String fileName, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    return wouldFileBeIncluded(fileName,documentSpecification,true) != wouldFileBeIncluded(fileName,documentSpecification,false);
-  }
-
-  /** Check if a file should be ingested, given a document specification and a local copy of the
-  * file.  It is presumed that only files that passed checkInclude() and were also flagged as needing
-  * file data by checkNeedFileData() will be checked by this method.
-  *@param localFile is the file.
-  *@param fileName is the JCIFS file name.
-  *@param documentSpecification is the specification.
-  *@param activities are the activities available to determine indexability.
-  *@return true if the file should be ingested.
-  */
-  protected boolean checkIngest(File localFile, String fileName, Specification documentSpecification, IFingerprintActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("JCIFS: In checkIngest for '"+fileName+"'");
-
-    // This file was flagged as needing file data.  However, that doesn't tell us *for what* we need it.
-    // So we need to redo the decision tree, but this time do everything completely.
-
-    try
-    {
-      String pathPart;
-      String filePart;
-      boolean isDirectory = false;
-
-      int lastSlash = fileName.lastIndexOf("/");
-      if (lastSlash == -1)
-      {
-        pathPart = "";
-        filePart = fileName;
-      }
-      else
-      {
-        pathPart = fileName.substring(0,lastSlash+1);
-        filePart = fileName.substring(lastSlash+1);
-      }
-
-      // Scan until we match a startpoint
-      int i = 0;
-      while (i < documentSpecification.getChildCount())
-      {
-        SpecificationNode sn = documentSpecification.getChild(i++);
-        if (sn.getType().equals(NODE_STARTPOINT))
-        {
-          // Prepend the server URL to the path, since that's what pathpart will have.
-          String path = mapToIdentifier(sn.getAttributeValue(ATTRIBUTE_PATH));
-
-          // Compare with filename
-          int matchEnd = matchSubPath(path,pathPart);
-          if (matchEnd == -1)
-          {
-            continue;
-          }
-
-          // matchEnd is the start of the rest of the path (after the match) in fileName.
-          // We need to walk through the rules and see whether it's in or out.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode node = sn.getChild(j++);
-            String flavor = node.getType();
-            if (flavor.equals(NODE_INCLUDE) || flavor.equals(NODE_EXCLUDE))
-            {
-              String type = node.getAttributeValue(ATTRIBUTE_TYPE);
-              if (type == null)
-                type = "";
-              String indexable = node.getAttributeValue(ATTRIBUTE_INDEXABLE);
-              if (indexable == null)
-                indexable = "";
-              String match = node.getAttributeValue(ATTRIBUTE_FILESPEC);
-
-              // Check if there's a match against the filespec
-              boolean isMatch = checkMatch(fileName,matchEnd-1,match);
-
-              // Check the directory/file criteria
-              if (isMatch)
-              {
-                isMatch = type.length() == 0 ||
-                  (type.equals(VALUE_DIRECTORY) && isDirectory) ||
-                  (type.equals(VALUE_FILE) && !isDirectory);
-              }
-
-              // Check the indexable criteria
-              if (isMatch)
-              {
-                if (indexable.length() != 0)
-                {
-                  // Directories are never considered indexable.
-                  // But if this is not a directory, things become ambiguous.
-                  boolean isIndexable;
-                  if (isDirectory)
-                    isIndexable = false;
-                  else
-                  {
-                    isIndexable = activities.checkDocumentIndexable(localFile);
-                  }
-
-                  isMatch = (indexable.equals("yes") && isIndexable) ||
-                    (indexable.equals("no") && !isIndexable);
-
-
-                }
-              }
-
-              if (isMatch)
-              {
-                if (flavor.equals(NODE_INCLUDE))
-                  return true;
-                else
-                  return false;
-              }
-            }
-          }
-
-        }
-      }
-      return false;
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("Couldn't map to canonical path: "+e.getMessage(),e);
-    }
-    catch (UnknownHostException e)
-    {
-      throw new ManifoldCFException("Couldn't map to canonical path: "+e.getMessage(),e);
-    }
-    finally
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("JCIFS: Leaving checkIngest for '"+fileName+"'");
-    }
-
-  }
-
-  /** Match a sub-path.  The sub-path must match the complete starting part of the full path, in a path
-  * sense.  The returned value should point into the file name beyond the end of the matched path, or
-  * be -1 if there is no match.
-  *@param subPath is the sub path.
-  *@param fullPath is the full path.
-  *@return the index of the start of the remaining part of the full path, or -1.
-  */
-  protected static int matchSubPath(String subPath, String fullPath)
-  {
-    if (subPath.length() > fullPath.length())
-      return -1;
-    if (fullPath.startsWith(subPath) == false)
-      return -1;
-    int rval = subPath.length();
-    if (fullPath.length() == rval)
-      return rval;
-    char x = fullPath.charAt(rval);
-    if (x == File.separatorChar)
-      rval++;
-    return rval;
-  }
-
-  /** Check a match between two strings with wildcards.
-  *@param sourceMatch is the expanded string (no wildcards)
-  *@param sourceIndex is the starting point in the expanded string.
-  *@param match is the wildcard-based string.
-  *@return true if there is a match.
-  */
-  protected static boolean checkMatch(String sourceMatch, int sourceIndex, String match)
-  {
-    // Note: The java regex stuff looks pretty heavyweight for this purpose.
-    // I've opted to try and do a simple recursive version myself, which is not compiled.
-    // Basically, the match proceeds by recursive descent through the string, so that all *'s cause
-    // recursion.
-    boolean caseSensitive = false;
-
-    return processCheck(caseSensitive, sourceMatch, sourceIndex, match, 0);
-  }
-
-  /** Recursive worker method for checkMatch.  Returns 'true' if there is a path that consumes both
-  * strings in their entirety in a matched way.
-  *@param caseSensitive is true if file names are case sensitive.
-  *@param sourceMatch is the source string (w/o wildcards)
-  *@param sourceIndex is the current point in the source string.
-  *@param match is the match string (w/wildcards)
-  *@param matchIndex is the current point in the match string.
-  *@return true if there is a match.
-  */
-  protected static boolean processCheck(boolean caseSensitive, String sourceMatch, int sourceIndex,
-    String match, int matchIndex)
-  {
-    // Logging.connectors.debug("Matching '"+sourceMatch+"' position "+Integer.toString(sourceIndex)+
-    //      " against '"+match+"' position "+Integer.toString(matchIndex));
-
-    // Match up through the next * we encounter
-    while (true)
-    {
-      // If we've reached the end, it's a match.
-      if (sourceMatch.length() == sourceIndex && match.length() == matchIndex)
-        return true;
-      // If one has reached the end but the other hasn't, no match
-      if (match.length() == matchIndex)
-        return false;
-      if (sourceMatch.length() == sourceIndex)
-      {
-        if (match.charAt(matchIndex) != '*')
-          return false;
-        matchIndex++;
-        continue;
-      }
-      char x = sourceMatch.charAt(sourceIndex);
-      char y = match.charAt(matchIndex);
-      if (!caseSensitive)
-      {
-        if (x >= 'A' && x <= 'Z')
-          x -= 'A'-'a';
-        if (y >= 'A' && y <= 'Z')
-          y -= 'A'-'a';
-      }
-      if (y == '*')
-      {
-        // Wildcard!
-        // We will recurse at this point.
-        // Basically, we want to combine the results for leaving the "*" in the match string
-        // at this point and advancing the source index, with skipping the "*" and leaving the source
-        // string alone.
-        return processCheck(caseSensitive,sourceMatch,sourceIndex+1,match,matchIndex) ||
-          processCheck(caseSensitive,sourceMatch,sourceIndex,match,matchIndex+1);
-      }
-      if (y == '?' || x == y)
-      {
-        sourceIndex++;
-        matchIndex++;
-      }
-      else
-        return false;
-    }
-  }
-
-  /** Grab forced acl out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getForcedAcls(Specification spec)
-  {
-    HashMap map = new HashMap();
-    int i = 0;
-    boolean securityOn = true;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals(NODE_ACCESS))
-      {
-        String token = sn.getAttributeValue(ATTRIBUTE_TOKEN);
-        map.put(token,token);
-      }
-      else if (sn.getType().equals(NODE_SECURITY))
-      {
-        String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-        if (value.equals("on"))
-          securityOn = true;
-        else if (value.equals("off"))
-          securityOn = false;
-      }
-    }
-    if (!securityOn)
-      return null;
-
-    String[] rval = new String[map.size()];
-    Iterator iter = map.keySet().iterator();
-    i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  /** Grab forced share acls out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getForcedShareAcls(Specification spec)
-  {
-    HashMap map = new HashMap();
-    int i = 0;
-    boolean securityOn = true;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals(NODE_SHAREACCESS))
-      {
-        String token = sn.getAttributeValue(ATTRIBUTE_TOKEN);
-        map.put(token,token);
-      }
-      else if (sn.getType().equals(NODE_SHARESECURITY))
-      {
-        String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-        if (value.equals("on"))
-          securityOn = true;
-        else if (value.equals("off"))
-          securityOn = false;
-      }
-    }
-    if (!securityOn)
-      return null;
-    String[] rval = new String[map.size()];
-    Iterator iter = map.keySet().iterator();
-    i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  /** Grab forced parent folder acls out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getForcedParentFolderAcls(Specification spec)
-  {
-    HashMap map = new HashMap();
-    int i = 0;
-    boolean securityOn = false;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals(NODE_PARENTFOLDERACCESS))
-      {
-        String token = sn.getAttributeValue(ATTRIBUTE_TOKEN);
-        map.put(token,token);
-      }
-      else if (sn.getType().equals(NODE_PARENTFOLDERSECURITY))
-      {
-        String value = sn.getAttributeValue(ATTRIBUTE_VALUE);
-        if (value.equals("on"))
-          securityOn = true;
-        else if (value.equals("off"))
-          securityOn = false;
-      }
-    }
-    if (!securityOn)
-      return null;
-    String[] rval = new String[map.size()];
-    Iterator iter = map.keySet().iterator();
-    i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  /** Map a "path" specification to a full identifier.
-  */
-  protected String mapToIdentifier(String path)
-    throws MalformedURLException, UnknownHostException
-  {
-    String smburi = smbconnectionPath;
-    String uri = smburi + path + "/";
-    return getFileCanonicalPath(new SmbFile(uri,pa));
-  }
-
-  // These methods allow me to experiment with cluster-mandated error handling on an entirely local level.  They correspond to individual SMBFile methods.
-
-  /** Get canonical path */
-  protected static String getFileCanonicalPath(SmbFile file)
-  {
-    return file.getCanonicalPath();
-  }
-
-  /** Check for file/directory existence */
-  protected static boolean fileExists(SmbFile file)
-    throws SmbException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    SmbException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.exists();
-      }
-      catch (SmbException e)
-      {
-        // If it's an interruption, throw it right away.
-        Throwable cause = e.getRootCause();
-        if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-        {
-          // See if it's an interruption
-          jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-          if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-            throw e;
-        }
-
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while checking if file exists: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentSmbExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Check if file is a directory */
-  protected static boolean fileIsDirectory(SmbFile file)
-    throws SmbException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    SmbException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.isDirectory();
-      }
-      catch (SmbException e)
-      {
-        // If it's an interruption, throw it right away.
-        Throwable cause = e.getRootCause();
-        if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-        {
-          // See if it's an interruption
-          jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-          if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-            throw e;
-        }
-
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while seeing if file is a directory: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentSmbExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Get last modified date for file */
-  protected static long fileLastModified(SmbFile file)
-    throws SmbException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    SmbException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.lastModified();
-      }
-      catch (SmbException e)
-      {
-        // If it's an interruption, throw it right away.
-        Throwable cause = e.getRootCause();
-        if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-        {
-          // See if it's an interruption
-          jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-          if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-            throw e;
-        }
-
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while getting file last-modified date: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentSmbExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Get file length */
-  protected static long fileLength(SmbFile file)
-    throws SmbException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    SmbException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.length();
-      }
-      catch (SmbException e)
-      {
-        // If it's an interruption, throw it right away.
-        Throwable cause = e.getRootCause();
-        if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-        {
-          // See if it's an interruption
-          jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-          if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-            throw e;
-        }
-
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while getting file length: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentSmbExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** List files */
-  protected static SmbFile[] fileListFiles(SmbFile file, SmbFileFilter filter)
-    throws SmbException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    SmbException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.listFiles(filter);
-      }
-      catch (SmbException e)
-      {
-        // If it's an interruption, throw it right away.
-        Throwable cause = e.getRootCause();
-        if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-        {
-          // See if it's an interruption
-          jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-          if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-            throw e;
-        }
-        if (e.getMessage().equals("0x8000002D")) {
-          // Symlink
-          Logging.connectors.warn("JCIFS: Symlink detected: "+file);
-          return new SmbFile[0];
-        }
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while listing files: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentSmbExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Get input stream for file */
-  protected static InputStream getFileInputStream(SmbFile file)
-    throws IOException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    IOException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.getInputStream();
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        throw e;
-      }
-      catch (InterruptedIOException e)
-      {
-        throw e;
-      }
-      catch (IOException e)
-      {
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while getting file input stream: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentIOExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Get file security */
-  protected static ACE[] getFileSecurity(SmbFile file, boolean useSIDs)
-    throws IOException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    IOException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.getSecurity(!useSIDs);
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        throw e;
-      }
-      catch (InterruptedIOException e)
-      {
-        throw e;
-      }
-      catch (IOException e)
-      {
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while getting file security: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentIOExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Get share security */
-  protected static ACE[] getFileShareSecurity(SmbFile file, boolean useSIDs)
-    throws IOException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    IOException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.getShareSecurity(!useSIDs);
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        throw e;
-      }
-      catch (InterruptedIOException e)
-      {
-        throw e;
-      }
-      catch (IOException e)
-      {
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while getting share security: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentIOExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Get file type */
-  protected static int getFileType(SmbFile file)
-    throws SmbException
-  {
-    int totalTries = 0;
-    int retriesRemaining = 3;
-    SmbException currentException = null;
-    while (retriesRemaining > 0 && totalTries < 5)
-    {
-      retriesRemaining--;
-      totalTries++;
-      try
-      {
-        return file.getType();
-      }
-      catch (SmbException e)
-      {
-        // If it's an interruption, throw it right away.
-        Throwable cause = e.getRootCause();
-        if (cause != null && (cause instanceof jcifs.util.transport.TransportException))
-        {
-          // See if it's an interruption
-          jcifs.util.transport.TransportException te = (jcifs.util.transport.TransportException)cause;
-          if (te.getRootCause() != null && te.getRootCause() instanceof java.lang.InterruptedException)
-            throw e;
-        }
-
-        Logging.connectors.warn("JCIFS: Possibly transient exception detected on attempt "+Integer.toString(totalTries)+" while getting file type: "+e.getMessage(),e);
-        if (currentException != null)
-        {
-          // Compare exceptions.  If they differ, reset the retry count.
-          if (!equivalentSmbExceptions(currentException,e))
-            retriesRemaining = 3;
-        }
-        currentException = e;
-      }
-    }
-    throw currentException;
-  }
-
-  /** Check if two SmbExceptions are equivalent */
-  protected static boolean equivalentSmbExceptions(SmbException e1, SmbException e2)
-  {
-    // The thing we want to compare is the message.  This is a little risky in that if there are (for example) object addresses in the message, the comparison will always fail.
-    // However, I don't think we expect any such thing in this case.
-    String e1m = e1.getMessage();
-    String e2m = e2.getMessage();
-    if (e1m == null)
-      e1m = "";
-    if (e2m == null)
-      e2m = "";
-    return e1m.equals(e2m);
-  }
-
-  /** Check if two IOExceptions are equivalent */
-  protected static boolean equivalentIOExceptions(IOException e1, IOException e2)
-  {
-    // The thing we want to compare is the message.  This is a little risky in that if there are (for example) object addresses in the message, the comparison will always fail.
-    // However, I don't think we expect any such thing in this case.
-    String e1m = e1.getMessage();
-    String e2m = e2.getMessage();
-    if (e1m == null)
-      e1m = "";
-    if (e2m == null)
-      e2m = "";
-    return e1m.equals(e2m);
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.Server"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.server.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.NeedAServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.Server2") + "\");\n"+
-"    editconnection.server.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  if (editconnection.server.value.indexOf(\"/\") != -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.ServerNameCannotIncludePathInformation") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.Server2") + "\");\n"+
-"    editconnection.server.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"		\n"+
-"  if (editconnection.username.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.NeedAUserName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.Server2") + "\");\n"+
-"    editconnection.username.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String server   = parameters.getParameter(SharedDriveParameters.server);
-    if (server==null) server = "";
-    String domain = parameters.getParameter(SharedDriveParameters.domain);
-    if (domain==null) domain = "";
-    String username = parameters.getParameter(SharedDriveParameters.username);
-    if (username==null) username = "";
-    String password = parameters.getObfuscatedParameter(SharedDriveParameters.password);
-    if (password==null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-    String resolvesids = parameters.getParameter(SharedDriveParameters.useSIDs);
-    if (resolvesids==null) resolvesids = "true";
-    String binName = parameters.getParameter(SharedDriveParameters.binName);
-    if (binName == null) binName = "";
-
-    // "Server" tab
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.Server")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.Server3") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"server\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(server)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.AuthenticationDomain") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"domain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(domain)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.UserName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"username\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(username)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.Password") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.UseSIDSForSecurity") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\"resolvesidspresent\" value=\"true\"/><input type=\"checkbox\" value=\"true\" name=\"resolvesids\" "+("true".equals(resolvesids)?"checked=\"true\"":"")+"/></td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.BinName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"binname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(binName)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"server\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(server)+"\"/>\n"+
-"<input type=\"hidden\" name=\"domain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(domain)+"\"/>\n"+
-"<input type=\"hidden\" name=\"username\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(username)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"+
-"<input type=\"hidden\" name=\"resolvesidspresent\" value=\"true\"/>\n"+
-"<input type=\"hidden\" name=\"resolvesids\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(resolvesids)+"\"/>\n"+
-"<input type=\"hidden\" name=\"binname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(binName)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String server = variableContext.getParameter("server");
-    if (server != null)
-      parameters.setParameter(SharedDriveParameters.server,server);
-	
-    String domain = variableContext.getParameter("domain");
-    if (domain != null)
-      parameters.setParameter(SharedDriveParameters.domain,domain);
-	
-    String username = variableContext.getParameter("username");
-    if (username != null)
-      parameters.setParameter(SharedDriveParameters.username,username);
-		
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(SharedDriveParameters.password,variableContext.mapKeyToPassword(password));
-    
-    String resolvesidspresent = variableContext.getParameter("resolvesidspresent");
-    if (resolvesidspresent != null)
-    {
-      parameters.setParameter(SharedDriveParameters.useSIDs,"false");
-      String resolvesids = variableContext.getParameter("resolvesids");
-      if (resolvesids != null)
-        parameters.setParameter(SharedDriveParameters.useSIDs, resolvesids);
-    }
-    String binName = variableContext.getParameter("binname");
-    if (binName != null)
-    	parameters.setParameter(SharedDriveParameters.binName, binName);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+ Messages.getBodyString(locale,"SharedDriveConnector.certificate") + "&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.Paths"));
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.Security"));
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.Metadata"));
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.ContentLength"));
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.FileMapping"));
-    tabsArray.add(Messages.getString(locale,"SharedDriveConnector.URLMapping"));
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"//<!--\n"+
-"\n"+
-"function "+seqPrefix+"checkSpecification()\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specmaxlength.value != \"\" && !isInteger(editjob."+seqPrefix+"specmaxlength.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.NeedAValidNumberForMaximumDocumentLength") + "\");\n"+
-"    editjob."+seqPrefix+"specmaxlength.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToPath(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"pathaddon.value == \"\" && editjob."+seqPrefix+"pathtypein.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.SelectAFolderOrTypeInAPathFirst") + "\");\n"+
-"    editjob."+seqPrefix+"pathaddon.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"pathaddon.value != \"\" && editjob."+seqPrefix+"pathtypein.value != \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.EitherSelectAFolderORTypeInAPath") + "\");\n"+
-"    editjob."+seqPrefix+"pathaddon.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"AddToPath\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddSpec(suffix,anchorvalue)\n"+
-"{\n"+
-"  if (eval(\"editjob."+seqPrefix+"specfile\"+suffix+\".value\") == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.EnterAFileSpecificationFirst") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"specfile\"+suffix+\".focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\"+suffix,\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecInsertSpec(postfix,anchorvalue)\n"+
-"{\n"+
-"  if (eval(\"editjob."+seqPrefix+"specfile_i\"+postfix+\".value\") == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.EnterAFileSpecificationFirst") + "\");\n"+
-"    eval(\"editjob."+seqPrefix+"specfile_i\"+postfix+\".focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specop\"+postfix,\"Insert Here\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.NullAccessTokensNotAllowed") + "\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddMapping(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specmatch.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.MatchStringCannotBeEmpty") + "\");\n"+
-"    editjob."+seqPrefix+"specmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editjob."+seqPrefix+"specmatch.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.MatchStringMustBeValidRegularExpression") + "\");\n"+
-"    editjob."+seqPrefix+"specmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specmappingop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddFMap(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specfmapmatch.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.MatchStringCannotBeEmpty") + "\");\n"+
-"    editjob."+seqPrefix+"specfmapmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editjob."+seqPrefix+"specfmapmatch.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.MatchStringMustBeValidRegularExpression") + "\");\n"+
-"    editjob."+seqPrefix+"specfmapmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specfmapop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddUMap(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specumapmatch.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.MatchStringCannotBeEmpty") + "\");\n"+
-"    editjob."+seqPrefix+"specumapmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editjob."+seqPrefix+"specumapmatch.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SharedDriveConnector.MatchStringMustBeValidRegularExpression") + "\");\n"+
-"    editjob."+seqPrefix+"specumapmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specumapop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-    int k;
-
-    // "Content Length" tab
-    i = 0;
-    String maxLength = null;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_MAXLENGTH))
-        maxLength = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-    }
-    if (maxLength == null)
-      maxLength = "";
-
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.ContentLength")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.MaximumDocumentLength") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" name=\""+seqPrefix+"specmaxlength\" size=\"10\" value=\""+maxLength+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmaxlength\" value=\""+maxLength+"\"/>\n"
-      );
-    }
-
-    // Check for Paths tab
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.Paths")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Now, loop through paths.  There will be a row in the current table for each one.
-      // The row will contain a delete button on the left.  On the right will be the startpoint itself at the top,
-      // and underneath it the table where the filter criteria are edited.
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_STARTPOINT))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          String pathOpName = seqPrefix+"pathop"+pathDescription;
-          String startPath = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_PATH);
-          out.print(
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.DeletePath")+Integer.toString(k)+"\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+pathOpName+"\",\"Delete\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"+
-"        <tr>\n"+
-"          <td class=\"value\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_PATH))+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+pathOpName+"\" value=\"\"/>\n"+
-"            <nobr>"+((startPath.length() == 0)?"(root)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(startPath))+"</nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"        <tr>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"displaytable\">\n"
-          );
-          // Now go through the include/exclude children of this node, and display one line per node, followed
-          // an "add" line.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode excludeNode = sn.getChild(j);
-            String instanceDescription = "_"+Integer.toString(k)+"_"+Integer.toString(j);
-            String instanceOpName = seqPrefix + "specop" + instanceDescription;
-
-            String nodeFlavor = excludeNode.getType();
-            String nodeType = excludeNode.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE);
-            if (nodeType == null)
-              nodeType = "";
-            String filespec = excludeNode.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC);
-            String indexable = excludeNode.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE);
-            if (indexable == null)
-              indexable = "";
-            out.print(
-"              <tr>\n"+
-"                <td class=\"value\">\n"+
-"                    <input type=\"button\" value=\"Insert\" onClick='Javascript:"+seqPrefix+"SpecInsertSpec(\""+instanceDescription+"\",\""+seqPrefix+"filespec_"+Integer.toString(k)+"_"+Integer.toString(j+1)+"\")' alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.InsertNewMatchForPath")+Integer.toString(k)+" before position #"+Integer.toString(j)+"\"/>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"specfl_i"+instanceDescription+"\">\n"+
-"                      <option value=\"include\">" + Messages.getBodyString(locale,"SharedDriveConnector.Include") + "</option>\n"+
-"                      <option value=\"exclude\">" + Messages.getBodyString(locale,"SharedDriveConnector.Exclude") + "</option>\n"+
-"                    </select>&nbsp;\n"+
-"                    <select name=\""+seqPrefix+"spectin_i"+instanceDescription+"\">\n"+
-"                      <option value=\"\" selected=\"selected\">" + Messages.getBodyString(locale,"SharedDriveConnector.AnyFileOrDirectory") + "</option>\n"+
-"                      <option value=\"file\">" + Messages.getBodyString(locale,"SharedDriveConnector.files") + "</option>\n"+
-"                      <option value=\"indexable-file\">" + Messages.getBodyString(locale,"SharedDriveConnector.indexableFiles") + "</option>\n"+
-"                      <option value=\"unindexable-file\">" + Messages.getBodyString(locale,"SharedDriveConnector.unindexableFiles") + "</option>\n"+
-"                      <option value=\"directory\">" + Messages.getBodyString(locale,"SharedDriveConnector.directorys") + "</option>\n"+
-"                    </select>&nbsp;" + Messages.getBodyString(locale,"SharedDriveConnector.matching") + "&nbsp;\n"+
-"                    <input type=\"text\" size=\"20\" name=\""+seqPrefix+"specfile_i"+instanceDescription+"\" value=\"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"\n"+
-"              </tr>\n"+
-"              <tr>\n"+
-"                <td class=\"value\">\n"+
-"                  <a name=\""+seqPrefix+"filespec_"+Integer.toString(k)+"_"+Integer.toString(j)+"\">\n"+
-"                    <input type=\"button\" value=\"Delete\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+instanceOpName+"\",\"Delete\",\""+seqPrefix+"filespec_"+Integer.toString(k)+"_"+Integer.toString(j)+"\")' alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.DeletePath")+Integer.toString(k)+Messages.getAttributeString(locale,"SharedDriveConnector.matchSpec")+Integer.toString(j)+"\"/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <nobr>\n"+
-"                    <input type=\"hidden\" name=\""+instanceOpName+"\" value=\"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specfl"+instanceDescription+"\" value=\""+nodeFlavor+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specty"+instanceDescription+"\" value=\""+nodeType+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specin"+instanceDescription+"\" value=\""+indexable+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+seqPrefix+"specfile"+instanceDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filespec)+"\"/>\n"+
-"                    "+Integer.toString(j+1)+".&nbsp;"+(nodeFlavor.equals("include")?"Include":"")+""+(nodeFlavor.equals("exclude")?"Exclude":"")+""+(indexable.equals("yes")?"&nbsp;indexable":"")+""+(indexable.equals("no")?"&nbsp;un-indexable":"")+""+(nodeType.equals("file")?"&nbsp;file(s)":"")+""+(nodeType.equals("directory")?"&nbsp;directory(s)":"")+""+(nodeType.equals("")?"&nbsp;file(s)&nbsp;or&nbsp;directory(s)":"")+"&nbsp;matching&nbsp;"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filespec)+"\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"
-            );
-            j++;
-          }
-          if (j == 0)
-          {
-            out.print(
-"              <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoRulesDefined") + "</td></tr>\n"
-            );
-          }
-          out.print(
-"              <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"              <tr>\n"+
-"                <td class=\"value\">\n"+
-"                  <input type=\"hidden\" name=\""+seqPrefix+"specchildcount"+pathDescription+"\" value=\""+Integer.toString(j)+"\"/>\n"+
-"                  <a name=\""+seqPrefix+"filespec_"+Integer.toString(k)+"_"+Integer.toString(j)+"\">\n"+
-"                    <input type=\"button\" value=\"Add\" onClick='Javascript:"+seqPrefix+"SpecAddSpec(\""+pathDescription+"\",\""+seqPrefix+"filespec_"+Integer.toString(k)+"_"+Integer.toString(j+1)+"\")' alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.AddNewMatchForPath")+Integer.toString(k)+"\"/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"                <td class=\"value\">\n"+
-"                  <nobr>\n"+
-"                    <select name=\""+seqPrefix+"specfl"+pathDescription+"\">\n"+
-"                      <option value=\"include\">" + Messages.getBodyString(locale,"SharedDriveConnector.Include") + "</option>\n"+
-"                      <option value=\"exclude\">" + Messages.getBodyString(locale,"SharedDriveConnector.Exclude") + "</option>\n"+
-"                    </select>&nbsp;\n"+
-"                    <select name=\""+seqPrefix+"spectin"+pathDescription+"\">\n"+
-"                      <option value=\"\">" + Messages.getBodyString(locale,"SharedDriveConnector.AnyFileOrDirectory") + "</option>\n"+
-"                      <option value=\"file\">" + Messages.getBodyString(locale,"SharedDriveConnector.files") + "</option>\n"+
-"                      <option value=\"indexable-file\">" + Messages.getBodyString(locale,"SharedDriveConnector.indexableFiles") + "</option>\n"+
-"                      <option value=\"unindexable-file\">" + Messages.getBodyString(locale,"SharedDriveConnector.unindexableFiles") + "</option>\n"+
-"                      <option value=\"directory\">" + Messages.getBodyString(locale,"SharedDriveConnector.directorys") + "</option>\n"+
-"                    </select>&nbsp;" + Messages.getBodyString(locale,"SharedDriveConnector.matching") + "&nbsp;\n"+
-"                    <input type=\"text\" size=\"20\" name=\""+seqPrefix+"specfile"+pathDescription+"\" value=\"\"/>\n"+
-"                  </nobr>\n"+
-"                </td>\n"+
-"              </tr>\n"+
-"            </table>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoStartingPointsDefined") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\" colspan=\"2\">\n"+
-"      <nobr>\n"+
-"        <input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"        <a name=\""+seqPrefix+"path_"+Integer.toString(k)+"\">\n"
-      );
-	
-      String pathSoFar = (String)currentContext.get(seqPrefix+"specpath");
-      if (pathSoFar == null)
-        pathSoFar = "";
-
-      // Grab next folder/project list
-      try
-      {
-        String[] childList;
-        childList = getChildFolderNames(pathSoFar);
-        if (childList == null)
-        {
-          // Illegal path - set it back
-          pathSoFar = "";
-          childList = getChildFolderNames("");
-          if (childList == null)
-            throw new ManifoldCFException("Can't find any children for root folder");
-        }
-        out.print(
-"          <input type=\"hidden\" name=\""+seqPrefix+"specpath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathSoFar)+"\"/>\n"+
-"          <input type=\"hidden\" name=\""+seqPrefix+"pathop\" value=\"\"/>\n"+
-"          <input type=\"button\" value=\"Add\" alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.AddPath") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"Add\",\""+seqPrefix+"path_"+Integer.toString(k+1)+"\")'/>\n"+
-"          &nbsp;"+((pathSoFar.length()==0)?"(root)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathSoFar))+"\n"
-        );
-        if (pathSoFar.length() > 0)
-        {
-          out.print(
-"          <input type=\"button\" value=\"-\" alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.RemoveFromPath") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"pathop\",\"Up\",\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>\n"
-          );
-        }
-        if (childList.length > 0)
-        {
-          out.print(
-"          <nobr>\n"+
-"            <input type=\"button\" value=\"+\" alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.AddPath") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToPath(\""+seqPrefix+"path_"+Integer.toString(k)+"\")'/>&nbsp;\n"+
-"            <select multiple=\"false\" name=\""+seqPrefix+"pathaddon\" size=\"4\">\n"+
-"              <option value=\"\" selected=\"selected\">" + Messages.getBodyString(locale,"SharedDriveConnector.PickAFolder") + "</option>\n"
-          );
-          int j = 0;
-          while (j < childList.length)
-          {
-            String folder = org.apache.manifoldcf.ui.util.Encoder.attributeEscape(childList[j]);
-            out.print(
-"              <option value=\""+folder+"\">"+folder+"</option>\n"
-            );
-            j++;
-          }
-          out.print(
-"            </select>" + Messages.getBodyString(locale,"SharedDriveConnector.orTypeAPath") +
-"            <input type=\"text\" name=\""+seqPrefix+"pathtypein\" size=\"16\" value=\"\"/>\n"+
-"          </nobr>\n"
-          );
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        out.println(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage()));
-      }
-      out.print(
-"        </a>\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Generate hiddens for the pathspec tab
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_STARTPOINT))
-        {
-          String pathDescription = "_"+Integer.toString(k);
-          String startPath = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_PATH);
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(startPath)+"\"/>\n"
-          );
-          // Now go through the include/exclude children of this node.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode excludeNode = sn.getChild(j);
-            String instanceDescription = "_"+Integer.toString(k)+"_"+Integer.toString(j);
-
-            String nodeFlavor = excludeNode.getType();
-            String nodeType = excludeNode.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE);
-            if (nodeType == null)
-              nodeType = "";
-            String filespec = excludeNode.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC);
-            String indexable = excludeNode.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE);
-            if (indexable == null)
-              indexable = "";
-            out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfl"+instanceDescription+"\" value=\""+nodeFlavor+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specty"+instanceDescription+"\" value=\""+nodeType+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specin"+instanceDescription+"\" value=\""+indexable+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specfile"+instanceDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(filespec)+"\"/>\n"
-            );
-            j++;
-          }
-          k++;
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specchildcount"+pathDescription+"\" value=\""+Integer.toString(j)+"\"/>\n"
-          );
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-
-
-    // Security tab
-
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    boolean shareSecurityOn = true;
-    boolean parentFolderSecurityOn = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SECURITY))
-      {
-        String securityValue = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SHARESECURITY))
-      {
-        String securityValue = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-        if (securityValue.equals("off"))
-          shareSecurityOn = false;
-        else if (securityValue.equals("on"))
-          shareSecurityOn = true;
-      }
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PARENTFOLDERSECURITY))
-      {
-        String securityValue = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-        if (securityValue.equals("off"))
-          parentFolderSecurityOn = false;
-        else if (securityValue.equals("on"))
-          parentFolderSecurityOn = true;
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.Security")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.FileSecurity") + "</nobr></td>\n"+
-"    <td colspan=\"3\" class=\"value\">\n"+
-"      <nobr>\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"on\" "+(securityOn?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"SharedDriveConnector.Enabled") + "&nbsp;\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"off\" "+((securityOn==false)?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"SharedDriveConnector.Disabled") + "\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"
-      );
-      // Finally, go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_ACCESS))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String accessOpName = seqPrefix+"accessop"+accessDescription;
-          String token = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TOKEN);
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\">\n"+
-"      <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.DeleteToken")+Integer.toString(k)+"\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")'/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"+
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"</nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"4\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoFileAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Add\" alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.AddToken") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")'/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"+
-"      <nobr><input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/></nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.ShareSecurity") + "</nobr></td>\n"+
-"    <td colspan=\"3\" class=\"value\">\n"+
-"      <nobr>\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"specsharesecurity\" value=\"on\" "+(shareSecurityOn?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"SharedDriveConnector.Enabled") + "&nbsp;\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"specsharesecurity\" value=\"off\" "+((shareSecurityOn==false)?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"SharedDriveConnector.Disabled") + "\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.ParentFolderSecurity") + "</nobr></td>\n"+
-"    <td colspan=\"3\" class=\"value\">\n"+
-"      <nobr>\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"specparentfoldersecurity\" value=\"on\" "+(parentFolderSecurityOn?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"SharedDriveConnector.Enabled") + "&nbsp;\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"specparentfoldersecurity\" value=\"off\" "+((parentFolderSecurityOn==false)?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"SharedDriveConnector.Disabled") + "\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specsecurity\" value=\""+(securityOn?"on":"off")+"\"/>\n"
-      );
-      // Finally, go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_ACCESS))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String token = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TOKEN);
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specsharesecurity\" value=\""+(shareSecurityOn?"on":"off")+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specparentfoldersecurity\" value=\""+(parentFolderSecurityOn?"on":"off")+"\"/>\n"
-      );
-    }
-
-
-
-    // Metadata tab
-
-    // Find the path-value metadata attribute name
-    // Find the path-value mapping data
-    i = 0;
-    String pathNameAttribute = "";
-    org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHNAMEATTRIBUTE))
-      {
-        pathNameAttribute = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-      }
-      else if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHMAP))
-      {
-        String pathMatch = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH);
-        String pathReplace = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE);
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.Metadata")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingcount\" value=\""+Integer.toString(matchMap.getMatchCount())+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingop\" value=\"\"/>\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.PathAttributeName") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"+
-"      <input type=\"text\" name=\""+seqPrefix+"specpathnameattribute\" size=\"20\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathNameAttribute)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"
-      );
-      i = 0;
-      while (i < matchMap.getMatchCount())
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specmappingop_"+Integer.toString(i)+"\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"mapping_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specmappingop_"+Integer.toString(i)+"\",\"Delete\",\""+seqPrefix+"mapping_"+Integer.toString(i)+"\")' alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.DeleteMapping")+Integer.toString(i)+"\" value=\"Delete\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</td>\n"+
-"  </tr>\n"
-        );
-        i++;
-      }
-      if (i == 0)
-      {
-        out.print(
-"  <tr><td colspan=\"4\" class=\"message\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoMappingsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <a name=\""+seqPrefix+"mapping_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecAddMapping(\""+seqPrefix+"mapping_"+Integer.toString(i+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.AddToMappings") + "\" value=\"Add\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.MatchRegexp") + "<input type=\"text\" name=\""+seqPrefix+"specmatch\" size=\"32\" value=\"\"/></nobr></td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.ReplaceString") + "<input type=\"text\" name=\""+seqPrefix+"specreplace\" size=\"32\" value=\"\"/></nobr></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpathnameattribute\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathNameAttribute)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingcount\" value=\""+Integer.toString(matchMap.getMatchCount())+"\"/>\n"
-      );
-      i = 0;
-      while (i < matchMap.getMatchCount())
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>\n"
-        );
-        i++;
-      }
-    }
-	
-    // File and URL Mapping tabs
-	
-    // Find the filename mapping data
-    // Find the URL mapping data
-    org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap fileMap = new org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap();
-    org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap uriMap = new org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap();
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_FILEMAP))
-      {
-        String pathMatch = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH);
-        String pathReplace = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE);
-        fileMap.appendMatchPair(pathMatch,pathReplace);
-      }
-      else if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_URIMAP))
-      {
-        String pathMatch = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH);
-        String pathReplace = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE);
-        uriMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.FileMapping")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfmapcount\" value=\""+Integer.toString(fileMap.getMatchCount())+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specfmapop\" value=\"\"/>\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"
-      );
-      i = 0;
-      while (i < fileMap.getMatchCount())
-      {
-        String matchString = fileMap.getMatchString(i);
-        String replaceString = fileMap.getReplaceString(i);
-        out.print(
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specfmapop_"+Integer.toString(i)+"\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"fmap_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specfmapop_"+Integer.toString(i)+"\",\"Delete\",\""+seqPrefix+"fmap_"+Integer.toString(i)+"\")' alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.DeleteFileMapping")+Integer.toString(i)+"\" value=\"Delete\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specfmapmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specfmapreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</td>\n"+
-"  </tr>\n"
-        );
-        i++;
-      }
-      if (i == 0)
-      {
-        out.print(
-"  <tr><td colspan=\"4\" class=\"message\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoFileMappingsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <a name=\""+seqPrefix+"fmap_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecAddFMap(\""+seqPrefix+"fmap_"+Integer.toString(i+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.AddToFileMappings") + "\" value=\"Add\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"SharedDriveConnector.MatchRegexp") + "<input type=\"text\" name=\""+seqPrefix+"specfmapmatch\" size=\"32\" value=\"\"/></td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"SharedDriveConnector.ReplaceString") + "<input type=\"text\" name=\""+seqPrefix+"specfmapreplace\" size=\"32\" value=\"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfmapcount\" value=\""+Integer.toString(fileMap.getMatchCount())+"\"/>\n"
-      );
-      i = 0;
-      while (i < fileMap.getMatchCount())
-      {
-        String matchString = fileMap.getMatchString(i);
-        String replaceString = fileMap.getReplaceString(i);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specfmapmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specfmapreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>\n"
-        );
-        i++;
-      }
-    }
-	
-    if (tabName.equals(Messages.getString(locale,"SharedDriveConnector.URLMapping")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specumapcount\" value=\""+Integer.toString(uriMap.getMatchCount())+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specumapop\" value=\"\"/>\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"
-      );
-      i = 0;
-      while (i < uriMap.getMatchCount())
-      {
-        String matchString = uriMap.getMatchString(i);
-        String replaceString = uriMap.getReplaceString(i);
-        out.print(
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specumapop_"+Integer.toString(i)+"\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"umap_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+seqPrefix+"specumapop_"+Integer.toString(i)+"\",\"Delete\",\""+seqPrefix+"umap_"+Integer.toString(i)+"\")' alt=\""+Messages.getAttributeString(locale,"SharedDriveConnector.DeleteUrlMapping")+Integer.toString(i)+"\" value=\"Delete\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specumapmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"\n"+
-"    </td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specumapreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-        );
-        i++;
-      }
-      if (i == 0)
-      {
-        out.print(
-"  <tr><td colspan=\"4\" class=\"message\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoURLMappingsSpecifiedWillProduceAFileIRI") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"      \n"+
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <a name=\""+seqPrefix+"umap_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecAddUMap(\""+seqPrefix+"umap_"+Integer.toString(i+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"SharedDriveConnector.AddToURLMappings") + "\" value=\"Add\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"SharedDriveConnector.MatchRegexp") + "<input type=\"text\" name=\""+seqPrefix+"specumapmatch\" size=\"32\" value=\"\"/></td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"SharedDriveConnector.ReplaceString") + "<input type=\"text\" name=\""+seqPrefix+"specumapreplace\" size=\"32\" value=\"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specumapcount\" value=\""+Integer.toString(uriMap.getMatchCount())+"\"/>\n"
-      );
-      i = 0;
-      while (i < uriMap.getMatchCount())
-      {
-        String matchString = uriMap.getMatchString(i);
-        String replaceString = uriMap.getReplaceString(i);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specumapmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specumapreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>\n"
-        );
-        i++;
-      }
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String x = variableContext.getParameter(seqPrefix+"pathcount");
-    if (x != null)
-    {
-      // Delete all path specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_STARTPOINT))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(x);
-      // Gather up these
-      i = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"pathop"+pathDescription;
-        x = variableContext.getParameter(pathOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Path inserts won't happen until the very end
-        String path = variableContext.getParameter(seqPrefix+"specpath"+pathDescription);
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_STARTPOINT);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_PATH,path);
-
-        // Now, get the number of children
-        String y = variableContext.getParameter(seqPrefix+"specchildcount"+pathDescription);
-        int childCount = Integer.parseInt(y);
-        int j = 0;
-        int w = 0;
-        while (j < childCount)
-        {
-          String instanceDescription = "_"+Integer.toString(i)+"_"+Integer.toString(j);
-          // Look for an insert or a delete at this point
-          String instanceOp = seqPrefix+"specop"+instanceDescription;
-          String z = variableContext.getParameter(instanceOp);
-          String flavor;
-          String type;
-          String indexable;
-          String match;
-          SpecificationNode sn;
-          if (z != null && z.equals("Delete"))
-          {
-            // Process the deletion as we gather
-            j++;
-            continue;
-          }
-          if (z != null && z.equals("Insert Here"))
-          {
-            // Process the insertion as we gather.
-            flavor = variableContext.getParameter(seqPrefix+"specfl_i"+instanceDescription);
-            indexable = "";
-            type = "";
-            String xxx = variableContext.getParameter(seqPrefix+"spectin_i"+instanceDescription);
-            if (xxx.equals("file") || xxx.equals("directory"))
-              type = xxx;
-            else if (xxx.equals("indexable-file"))
-            {
-              indexable = "yes";
-              type = "file";
-            }
-            else if (xxx.equals("unindexable-file"))
-            {
-              indexable = "no";
-              type = "file";
-            }
-
-            match = variableContext.getParameter(seqPrefix+"specfile_i"+instanceDescription);
-            sn = new SpecificationNode(flavor);
-            if (type != null && type.length() > 0)
-              sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE,type);
-            if (indexable != null && indexable.length() > 0)
-              sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE,indexable);
-            sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC,match);
-            node.addChild(w++,sn);
-          }
-          flavor = variableContext.getParameter(seqPrefix+"specfl"+instanceDescription);
-          type = variableContext.getParameter(seqPrefix+"specty"+instanceDescription);
-          match = variableContext.getParameter(seqPrefix+"specfile"+instanceDescription);
-          indexable = variableContext.getParameter(seqPrefix+"specin"+instanceDescription);
-          sn = new SpecificationNode(flavor);
-          if (type != null && type.length() > 0)
-            sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE,type);
-          if (indexable != null && indexable.length() > 0)
-            sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE,indexable);
-          sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC,match);
-          node.addChild(w++,sn);
-          j++;
-        }
-        if (x != null && x.equals("Add"))
-        {
-          // Process adds to the end of the rules in-line
-          String match = variableContext.getParameter(seqPrefix+"specfile"+pathDescription);
-          String indexable = "";
-          String type = "";
-          String xxx = variableContext.getParameter(seqPrefix+"spectin"+pathDescription);
-          if (xxx.equals("file") || xxx.equals("directory"))
-            type = xxx;
-          else if (xxx.equals("indexable-file"))
-          {
-            indexable = "yes";
-            type = "file";
-          }
-          else if (xxx.equals("unindexable-file"))
-          {
-            indexable = "no";
-            type = "file";
-          }
-
-          String flavor = variableContext.getParameter(seqPrefix+"specfl"+pathDescription);
-          SpecificationNode sn = new SpecificationNode(flavor);
-          if (type != null && type.length() > 0)
-            sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE,type);
-          if (indexable != null && indexable.length() > 0)
-            sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE,indexable);
-          sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC,match);
-          node.addChild(w,sn);
-        }
-
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"pathop");
-      if (op != null && op.equals("Add"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_STARTPOINT);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_PATH,path);
-        ds.addChild(ds.getChildCount(),node);
-
-        // Now add in the defaults; these will be "include all directories" and "include all indexable files".
-        SpecificationNode sn = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_INCLUDE);
-        sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE,"file");
-        sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE,"yes");
-        sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC,"*");
-        node.addChild(node.getChildCount(),sn);
-        sn = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_INCLUDE);
-        sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE,"directory");
-        sn.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC,"*");
-        node.addChild(node.getChildCount(),sn);
-      }
-      else if (op != null && op.equals("Up"))
-      {
-        // Strip off end
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        int k = path.lastIndexOf("/");
-        if (k == -1)
-          path = "";
-        else
-          path = path.substring(0,k);
-        currentContext.save(seqPrefix+"specpath",path);
-      }
-      else if (op != null && op.equals("AddToPath"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        String addon = variableContext.getParameter(seqPrefix+"pathaddon");
-        String typein = variableContext.getParameter(seqPrefix+"pathtypein");
-        if (addon != null && addon.length() > 0)
-        {
-          if (path.length() == 0)
-            path = addon;
-          else
-            path += "/" + addon;
-        }
-        else if (typein != null && typein.length() > 0)
-        {
-          String trialPath = path;
-          if (trialPath.length() == 0)
-            trialPath = typein;
-          else
-            trialPath += "/" + typein;
-          // Validate trial path
-          try
-          {
-            trialPath = validateFolderName(trialPath);
-            if (trialPath != null)
-              path = trialPath;
-          }
-          catch (ManifoldCFException e)
-          {
-            // Effectively, this just means we can't add a typein to the path right now.
-          }
-        }
-        currentContext.save(seqPrefix+"specpath",path);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specmaxlength");
-    if (x != null)
-    {
-      // Delete max length entry
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_MAXLENGTH))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      if (x.length() > 0)
-      {
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_MAXLENGTH);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE,x);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (x != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SECURITY))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SECURITY);
-      node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE,x);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    x = variableContext.getParameter(seqPrefix+"tokencount");
-    if (x != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_ACCESS))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(x);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        x = variableContext.getParameter(accessOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_ACCESS);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TOKEN,accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_ACCESS);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TOKEN,accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specsharesecurity");
-    if (x != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SHARESECURITY))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SHARESECURITY);
-      node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE,x);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specparentfoldersecurity");
-    if (x != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PARENTFOLDERSECURITY))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PARENTFOLDERSECURITY);
-      node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE,x);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    String xc = variableContext.getParameter(seqPrefix+"specpathnameattribute");
-    if (xc != null)
-    {
-      // Delete old one
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHNAMEATTRIBUTE))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      if (xc.length() > 0)
-      {
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHNAMEATTRIBUTE);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE,xc);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specmappingcount");
-    if (xc != null)
-    {
-      // Delete old spec
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHMAP))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(xc);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specmappingop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Inserts won't happen until the very end
-        String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-        String replace = variableContext.getParameter(seqPrefix+"specreplace"+pathDescription);
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHMAP);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH,match);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE,replace);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // Check for add
-      xc = variableContext.getParameter(seqPrefix+"specmappingop");
-      if (xc != null && xc.equals("Add"))
-      {
-        String match = variableContext.getParameter(seqPrefix+"specmatch");
-        String replace = variableContext.getParameter(seqPrefix+"specreplace");
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHMAP);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH,match);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE,replace);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-	
-    xc = variableContext.getParameter(seqPrefix+"specfmapcount");
-    if (xc != null)
-    {
-      // Delete old spec
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_FILEMAP))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(xc);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specfmapop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Inserts won't happen until the very end
-        String match = variableContext.getParameter(seqPrefix+"specfmapmatch"+pathDescription);
-        String replace = variableContext.getParameter(seqPrefix+"specfmapreplace"+pathDescription);
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_FILEMAP);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH,match);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE,replace);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // Check for add
-      xc = variableContext.getParameter(seqPrefix+"specfmapop");
-      if (xc != null && xc.equals("Add"))
-      {
-        String match = variableContext.getParameter(seqPrefix+"specfmapmatch");
-        String replace = variableContext.getParameter(seqPrefix+"specfmapreplace");
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_FILEMAP);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH,match);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE,replace);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specumapcount");
-    if (xc != null)
-    {
-      // Delete old spec
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_URIMAP))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(xc);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specumapop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Inserts won't happen until the very end
-        String match = variableContext.getParameter(seqPrefix+"specumapmatch"+pathDescription);
-        String replace = variableContext.getParameter(seqPrefix+"specumapreplace"+pathDescription);
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_URIMAP);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH,match);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE,replace);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // Check for add
-      xc = variableContext.getParameter(seqPrefix+"specumapop");
-      if (xc != null && xc.equals("Add"))
-      {
-        String match = variableContext.getParameter(seqPrefix+"specumapmatch");
-        String replace = variableContext.getParameter(seqPrefix+"specumapreplace");
-        SpecificationNode node = new SpecificationNode(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_URIMAP);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH,match);
-        node.setAttribute(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE,replace);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"
-    );
-    int i = 0;
-    boolean seenAny = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode spn = ds.getChild(i++);
-      if (spn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_STARTPOINT))
-      {
-        if (seenAny == false)
-        {
-          seenAny = true;
-        }
-        out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(spn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_PATH))+":"+"</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"
-        );
-        int j = 0;
-        while (j < spn.getChildCount())
-        {
-          SpecificationNode sn = spn.getChild(j++);
-          // This is "include" or "exclude"
-          String nodeFlavor = sn.getType();
-          // This is the file/directory name match
-          String filespec = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_FILESPEC);
-          // This has a value of null, "", "file", or "directory".
-          String nodeType = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TYPE);
-          if (nodeType == null)
-            nodeType = "";
-          // This has a value of null, "", "yes", or "no".
-          String ingestableFlag = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_INDEXABLE);
-          if (ingestableFlag == null)
-            ingestableFlag = "";
-          out.print(
-"      <nobr>\n"+
-"        "+Integer.toString(j)+".\n"+
-"        "+(nodeFlavor.equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_INCLUDE)?"Include":"")+"\n"+
-"        "+(nodeFlavor.equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_EXCLUDE)?"Exclude":"")+"\n"+
-"        "+(ingestableFlag.equals("yes")?"&nbsp;indexable":"")+"\n"+
-"        "+(ingestableFlag.equals("no")?"&nbsp;un-indexable":"")+"\n"+
-"        "+(nodeType.equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.VALUE_FILE)?"&nbsp;file(s)":"")+"\n"+
-"        "+(nodeType.equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.VALUE_DIRECTORY)?"&nbsp;directory(s)":"")+"\n"+
-"        "+(nodeType.equals("")?"&nbsp;file(s)&nbsp;or&nbsp;directory(s)":"")+"&nbsp;matching&nbsp;\n"+
-"        "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(filespec)+"\n"+
-"      </nobr>\n"+
-"      <br/>\n"
-          );
-        }
-        out.print(
-"    </td>\n"+
-"  </tr>\n"
-        );
-      }
-    }
-    if (seenAny == false)
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoDocumentsSpecified") + "</td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"
-    );
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    boolean shareSecurityOn = true;
-    boolean parentFolderSecurityOn = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SECURITY))
-      {
-        String securityValue = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_SHARESECURITY))
-      {
-        String securityValue = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-        if (securityValue.equals("off"))
-          shareSecurityOn = false;
-        else if (securityValue.equals("on"))
-          shareSecurityOn = true;
-      }
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PARENTFOLDERSECURITY))
-      {
-        String securityValue = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-        if (securityValue.equals("off"))
-          parentFolderSecurityOn = false;
-        else if (securityValue.equals("on"))
-          parentFolderSecurityOn = true;
-      }
-    }
-    out.print(
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.FileSecurity") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+(securityOn?Messages.getBodyString(locale,"SharedDriveConnector.Enabled"):Messages.getBodyString(locale,"SharedDriveConnector.Disabled"))+"</nobr></td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Go through looking for access tokens
-    seenAny = false;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_ACCESS))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr><td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.FileAccessTokens") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_TOKEN);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"</nobr><br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoFileAccessTokensSpecified") + "</td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"    \n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.ShareSecurity") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+(shareSecurityOn?Messages.getBodyString(locale,"SharedDriveConnector.Enabled"):Messages.getBodyString(locale,"SharedDriveConnector.Disabled"))+"</nobr></td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"    \n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.ParentFolderSecurity") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+(parentFolderSecurityOn?Messages.getBodyString(locale,"SharedDriveConnector.Enabled"):Messages.getBodyString(locale,"SharedDriveConnector.Disabled"))+"</nobr></td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Find the path-name metadata attribute name
-    i = 0;
-    String pathNameAttribute = "";
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHNAMEATTRIBUTE))
-      {
-        pathNameAttribute = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-      }
-    }
-    out.print(
-"  <tr>\n"
-    );
-    if (pathNameAttribute.length() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.PathNameMetadataAttribute") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathNameAttribute)+"</nobr></td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoPathNameMetadataAttributeSpecified") + "</td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"\n"
-    );
-    
-    // Find the path-value mapping data
-    i = 0;
-    org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_PATHMAP))
-      {
-        String pathMatch = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH);
-        String pathReplace = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE);
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-    if (matchMap.getMatchCount() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.PathValueMapping") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      i = 0;
-      while (i < matchMap.getMatchCount())
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"        <tr>\n"+
-"          <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</nobr></td>\n"+
-"          <td class=\"value\">==></td>\n"+
-"          <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</nobr></td>\n"+
-"        </tr>\n"
-        );
-        i++;
-      }
-      out.print(
-"      </table>\n"+
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoMappingsSpecified") + "</td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"
-    );
-    // Find the file name mapping data
-    i = 0;
-    org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap fileMap = new org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_FILEMAP))
-      {
-        String pathMatch = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH);
-        String pathReplace = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE);
-        fileMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-    if (fileMap.getMatchCount() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.FileNameMapping") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      i = 0;
-      while (i < fileMap.getMatchCount())
-      {
-        String matchString = fileMap.getMatchString(i);
-        String replaceString = fileMap.getReplaceString(i);
-        out.print(
-"        <tr>\n"+
-"          <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</nobr></td>\n"+
-"          <td class=\"value\">==></td>\n"+
-"          <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</nobr></td>\n"+
-"        </tr>\n"
-        );
-        i++;
-      }
-      out.print(
-"      </table>\n"+
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoFileNameMappingsSpecified") + "</td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"
-    );
-
-    // Find the url mapping data
-    i = 0;
-    org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap uriMap = new org.apache.manifoldcf.crawler.connectors.sharedrive.MatchMap();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_URIMAP))
-      {
-        String pathMatch = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_MATCH);
-        String pathReplace = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_REPLACE);
-        uriMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-    if (uriMap.getMatchCount() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.URLMappingColon") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      i = 0;
-      while (i < uriMap.getMatchCount())
-      {
-        String matchString = uriMap.getMatchString(i);
-        String replaceString = uriMap.getReplaceString(i);
-        out.print(
-"        <tr>\n"+
-"          <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</nobr></td>\n"+
-"          <td class=\"value\">==></td>\n"+
-"          <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</nobr></td>\n"+
-"        </tr>\n"
-        );
-        i++;
-      }
-      out.print(
-"      </table>\n"+
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"SharedDriveConnector.NoURLMappingsSpecifiedWillProduceAFileIRI") + "</td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SharedDriveConnector.MaximumDocumentLength") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <nobr>\n"
-    );
-    // Find the path-value mapping data
-    i = 0;
-    String maxLength = null;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.NODE_MAXLENGTH))
-      {
-        maxLength = sn.getAttributeValue(org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector.ATTRIBUTE_VALUE);
-      }
-    }
-    if (maxLength == null || maxLength.length() == 0)
-      maxLength = "Unlimited";
-    out.print(
-"        "+maxLength+"\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-  /* The following are additional methods used by the UI */
-
-  /**
-  * given a server uri, return all shares
-  *
-  * @param serverURI -
-  * @return an array of SmbFile
-  */
-  public SmbFile[] getShareNames(String serverURI)
-    throws ManifoldCFException
-  {
-    getSession();
-    SmbFile server = null;
-    try
-    {
-      server = new SmbFile(serverURI,pa);
-    }
-    catch (MalformedURLException e1)
-    {
-      throw new ManifoldCFException("MalformedURLException tossed",e1);
-    }
-    SmbFile[] shares = null;
-    try
-    {
-      // check to make sure it's a server
-      if (getFileType(server)==SmbFile.TYPE_SERVER)
-      {
-        shares = fileListFiles(server,new ShareFilter());
-      }
-    }
-    catch (SmbException e)
-    {
-      throw new ManifoldCFException("SmbException tossed: "+e.getMessage(),e);
-    }
-    return shares;
-  }
-
-  /**
-  * Given a folder path, determine if the folder is in fact legal and accessible (and is a folder).
-  * @param folder is the relative folder from the network root
-  * @return the canonical folder name if valid, or null if not.
-  * @throws ManifoldCFException
-  */
-  public String validateFolderName(String folder) throws ManifoldCFException
-  {
-    getSession();
-    //create new connection by appending to the old connection
-    String smburi = smbconnectionPath;
-    String uri = smburi;
-    if (folder.length() > 0) {
-      uri = smburi + folder + "/";
-    }
-
-    SmbFile currentDirectory = null;
-    try
-    {
-      currentDirectory = new SmbFile(uri,pa);
-    }
-    catch (MalformedURLException e1)
-    {
-      throw new ManifoldCFException("validateFolderName: Can't get parent file: " + uri,e1);
-    }
-
-    try
-    {
-      currentDirectory.connect();
-      if (fileIsDirectory(currentDirectory) == false)
-        return null;
-      String newCanonicalPath = currentDirectory.getCanonicalPath();
-      String rval = newCanonicalPath.substring(smburi.length());
-      if (rval.endsWith("/"))
-        rval = rval.substring(0,rval.length()-1);
-      return rval;
-    }
-    catch (SmbException se)
-    {
-      try
-      {
-        processSMBException(se, folder, "checking folder", "getting canonical path");
-        return null;
-      }
-      catch (ServiceInterruption si)
-      {
-        throw new ManifoldCFException("Service interruption: "+si.getMessage(),si);
-      }
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("MalformedURLException tossed: "+e.getMessage(),e);
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("IOException tossed: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IOException tossed: "+e.getMessage(),e);
-    }
-
-  }
-
-  /**
-  * given a smb uri, return all children directories
-  *
-  * @param folder is the relative folder from the network root
-  * @return array of child folder names
-  * @throws ManifoldCFException
-  */
-  public String[] getChildFolderNames(String folder) throws ManifoldCFException
-  {
-    getSession();
-    //create new connection by appending to the old connection
-    String smburi = smbconnectionPath;
-    String uri = smburi;
-    if (folder.length() > 0) {
-      uri = smburi + folder + "/";
-    }
-
-    SmbFile currentDirectory = null;
-    try
-    {
-      currentDirectory = new SmbFile(uri,pa);
-    }
-    catch (MalformedURLException e1)
-    {
-      throw new ManifoldCFException("getChildFolderNames: Can't get parent file: " + uri,e1);
-    }
-
-    // add DFS support
-    SmbFile[] children = null;
-    try
-    {
-      currentDirectory.connect();
-      children = currentDirectory.listFiles(new DirectoryFilter());
-    }
-    catch (SmbException se)
-    {
-      try
-      {
-        processSMBException(se, folder, "getting child folder names", "listing files");
-        children = new SmbFile[0];
-      }
-      catch (ServiceInterruption si)
-      {
-        throw new ManifoldCFException("Service interruption: "+si.getMessage(),si);
-      }
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("MalformedURLException tossed: "+e.getMessage(),e);
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("IOException tossed: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IOException tossed: "+e.getMessage(),e);
-    }
-
-    // populate a String array
-    String[] directories = new String[children.length];
-    for (int i=0;i < children.length;i++){
-      String directoryName = children[i].getName();
-      // strip the trailing slash
-      directoryName = directoryName.replaceAll("/","");
-      directories[i] = directoryName;
-    }
-
-    java.util.Arrays.sort(directories);
-    return directories;
-  }
-
-  /**
-  * inner class which returns only shares. used by listfiles(SmbFileFilter)
-  *
-  * @author James Maupin
-  */
-
-  class ShareFilter implements SmbFileFilter
-  {
-    /* (non-Javadoc)
-    * @see jcifs.smb.SmbFileFilter#accept(jcifs.smb.SmbFile)
-    */
-    public boolean accept(SmbFile arg0) throws SmbException
-    {
-      if (getFileType(arg0)==SmbFile.TYPE_SHARE){
-        return true;
-      } else {
-        return false;
-      }
-    }
-  }
-
-  /**
-  * inner class which returns only directories. used by listfiles(SmbFileFilter)
-  *
-  * @author James Maupin
-  */
-
-  class DirectoryFilter implements SmbFileFilter
-  {
-    /* (non-Javadoc)
-    * @see jcifs.smb.SmbFileFilter#accept(jcifs.smb.SmbFile)
-    */
-    public boolean accept(SmbFile arg0) throws SmbException {
-      int type = getFileType(arg0);
-      if (type==SmbFile.TYPE_SHARE || (type==SmbFile.TYPE_FILESYSTEM && fileIsDirectory(arg0))){
-        return true;
-      } else {
-        return false;
-      }
-    }
-  }
-
-  /** This is the filter class that actually receives the files in batches.  We do it this way
-  * so that the client won't run out of memory loading a huge directory.
-  */
-  protected class ProcessDocumentsFilter implements SmbFileFilter
-  {
-
-    /** This is the activities object, where matching references will be logged */
-    protected final IProcessActivity activities;
-    /** Document specification */
-    protected final Specification spec;
-    /** Exceptions that we saw.  These are saved here so that they can be rethrown when done */
-    protected ManifoldCFException lcfException = null;
-    protected ServiceInterruption serviceInterruption = null;
-
-    /** Constructor */
-    public ProcessDocumentsFilter(IProcessActivity activities, Specification spec)
-    {
-      this.activities = activities;
-      this.spec = spec;
-    }
-
-    /** Decide if we accept the file.  This is where we will actually do the work. */
-    public boolean accept(SmbFile f) throws SmbException
-    {
-      if (lcfException != null || serviceInterruption != null)
-        return false;
-
-      try
-      {
-        int type = f.getType();
-        if (type != SmbFile.TYPE_SERVER && type != SmbFile.TYPE_FILESYSTEM && type != SmbFile.TYPE_SHARE)
-          return false;
-        String canonicalPath = getFileCanonicalPath(f);
-        if (canonicalPath != null)
-        {
-          // manipulate path to include the DFS alias, not the literal path
-          // String newPath = matchPrefix + canonicalPath.substring(matchReplace.length());
-          String newPath = canonicalPath;
-
-          // Check against the current specification.  This is a nicety to avoid queuing
-          // documents that we will immediately turn around and remove.  However, if this
-          // check was not here, everything should still function, provided the getDocumentVersions()
-          // method does the right thing.
-          boolean fileIsDirectory = fileIsDirectory(f);
-          if (checkInclude(fileIsDirectory, newPath, spec))
-          {
-            if (fileIsDirectory)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("JCIFS: Recorded path is '" + newPath + "' and is included.");
-              activities.addDocumentReference(newPath);
-            }
-            else
-            {
-              long fileLength = fileLength(f);
-              if (checkIncludeFile(fileLength, newPath, spec, activities))
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("JCIFS: Recorded path is '" + newPath + "' and is included.");
-                activities.addDocumentReference(newPath);
-              }
-              else
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("JCIFS: Recorded path '"+newPath+"' is excluded!");
-              }
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("JCIFS: Recorded path '"+newPath+"' is excluded!");
-          }
-        }
-        else
-          Logging.connectors.debug("JCIFS: Excluding a child file because canonical path is null");
-
-
-        return false;
-      }
-      catch (ManifoldCFException e)
-      {
-        if (lcfException == null)
-          lcfException = e;
-        return false;
-      }
-      catch (ServiceInterruption e)
-      {
-        if (serviceInterruption == null)
-          serviceInterruption = e;
-        return false;
-      }
-    }
-
-    /** Check for exception, and throw if there is one */
-    public void checkAndThrow()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      if (lcfException != null)
-        throw lcfException;
-      if (serviceInterruption != null)
-        throw serviceInterruption;
-    }
-  }
-
-}
diff --git a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveHelpers.java b/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveHelpers.java
deleted file mode 100644
index d865ba0..0000000
--- a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveHelpers.java
+++ /dev/null
@@ -1,208 +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 org.apache.manifoldcf.crawler.connectors.sharedrive;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import jcifs.smb.ACE;
-import jcifs.smb.NtlmPasswordAuthentication;
-import jcifs.smb.SmbException;
-import jcifs.smb.SmbFile;
-import jcifs.smb.SmbFileFilter;
-
-/** This class contains test code that is useful for performing test operations
-using JCifs from the appliance.  Basic operations are: addDocument, deleteDocument,
-  addFolderUser, and deleteFolderUser.
-*/
-public class SharedDriveHelpers
-{
-  public static final String _rcsid = "@(#)$Id: SharedDriveHelpers.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private NtlmPasswordAuthentication pa;
-  private SmbFile smbconnection;
-
-  /** Construct the helper and initialize the connection.
-  *@param serverName is the DNS name of the server.
-  *@param userName is the name to use to log in.
-  *@param password is the password.
-  */
-  public SharedDriveHelpers(String serverName, String userName, String password)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // make the smb connection to the server
-      // use NtlmPasswordAuthentication so that we can reuse credential for DFS support
-      pa = new NtlmPasswordAuthentication(userName + ":" + password);
-      smbconnection = new SmbFile("smb://" + serverName + "/",pa);
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException("Unable to access SMB/CIFS share: "+serverName, e, ManifoldCFException.SETUP_ERROR);
-    }
-  }
-
-  /** Close the connection.
-  */
-  public void close()
-    throws ManifoldCFException
-  {
-    // Just let stuff go
-    pa = null;
-    smbconnection = null;
-  }
-
-  /** See if a document exists.
-  *@param targetPath is the document's path, beginning with the share name and
-  *       separated by "/" characters.
-  *@return the target path if the document is found, or "" if it is not.
-  */
-  public String lookupDocument(String targetPath)
-    throws ManifoldCFException
-  {
-    try
-    {
-      String identifier = mapToIdentifier(targetPath);
-      SmbFile file = new SmbFile(identifier,pa);
-      if (file.exists())
-        return targetPath;
-      return "";
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Add a document.
-  *@param targetPath is the target path, beginning with the share name and separated
-  *       by "/" characters.
-  *@param sourceFile is the local source file name to copy to the target.
-  *@return the target path.
-  */
-  public String addDocument(String targetPath, String sourceFile)
-    throws ManifoldCFException
-  {
-    try
-    {
-      String identifier = mapToIdentifier(targetPath);
-      SmbFile file = new SmbFile(identifier,pa);
-      // Open source file for read
-      InputStream is = new FileInputStream(sourceFile);
-      try
-      {
-        // Open smbfile for write
-        if (!file.exists())
-        {
-          file.createNewFile();
-          file = new SmbFile(identifier,pa);
-        }
-        OutputStream os = file.getOutputStream();
-        try
-        {
-          byte[] bytes = new byte[65536];
-          while (true)
-          {
-            int amt = is.read(bytes,0,bytes.length);
-            if (amt == -1)
-              break;
-            if (amt > 0)
-              os.write(bytes,0,amt);
-          }
-        }
-        finally
-        {
-          os.close();
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-      return targetPath;
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Delete a document.
-  *@param targetPath is the file path to delete, beginning with the share name and
-  *       separated by "/" characters.
-  */
-  public void deleteDocument(String targetPath)
-    throws ManifoldCFException
-  {
-    try
-    {
-      String identifier = mapToIdentifier(targetPath);
-      SmbFile file = new SmbFile(identifier,pa);
-      file.delete();
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Add user ACL to folder.
-  *@param targetPath is the folder path to add the acl to, beginning with the share
-  *       name and separated by "/" characters.
-  *@param userName is the user to add.
-  */
-  public void addUserToFolder(String targetPath, String userName)
-    throws ManifoldCFException
-  {
-    // MHL
-  }
-
-  /** Remove user ACL from folder.
-  *@param targetPath is the folder path to add the acl to, beginning with the share
-  *       name and separated by "/" characters.
-  *@param userName is the user to remove.
-  */
-  public void removeUserFromFolder(String targetPath, String userName)
-    throws ManifoldCFException
-  {
-    // MHL
-  }
-
-  /** Map a "path" specification to a full identifier.
-  */
-  protected String mapToIdentifier(String path)
-    throws IOException
-  {
-    String smburi = smbconnection.getCanonicalPath();
-    String uri = smburi + path + "/";
-    return new SmbFile(uri,pa).getCanonicalPath();
-  }
-
-}
diff --git a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveParameters.java b/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveParameters.java
deleted file mode 100644
index fe7b788..0000000
--- a/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveParameters.java
+++ /dev/null
@@ -1,43 +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 org.apache.manifoldcf.crawler.connectors.sharedrive;
-
-
-/** This class describes shared drive connection parameters.
-*/
-public class SharedDriveParameters
-{
-  public static final String _rcsid = "@(#)$Id: SharedDriveParameters.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /* SMB/CIFS share server */
-  public final static String server = "Server";
-
-  /* Optional domain/realm */
-  public final static String domain = "Domain/Realm";
-
-  /* username for the above server */
-  public final static String username = "User Name";
-
-  /* password for the above server */
-  public final static String password = "Password";
-  
-  /* SIDs handling */
-  public final static String useSIDs = "Use SIDs";
-
-  /* User-settable bin name */
-  public final static String binName = "Bin Name";
-}
diff --git a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_en_US.properties b/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_en_US.properties
deleted file mode 100644
index 3752eab..0000000
--- a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_en_US.properties
+++ /dev/null
@@ -1,99 +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.
-
-SharedDriveConnector.Paths=Paths
-SharedDriveConnector.Security=Security
-SharedDriveConnector.Metadata=Metadata
-SharedDriveConnector.ContentLength=Content Length
-SharedDriveConnector.FileMapping=File Mapping
-SharedDriveConnector.URLMapping=URL Mapping
-
-SharedDriveConnector.NeedAServerName=Need a server name
-SharedDriveConnector.Server=Server
-SharedDriveConnector.UseSIDSForSecurity=Use SIDS for security:
-SharedDriveConnector.Server2=Server
-SharedDriveConnector.ServerNameCannotIncludePathInformation=Server name cannot include path information
-SharedDriveConnector.NeedAUserName=Need a user name
-SharedDriveConnector.Server3=Server:
-SharedDriveConnector.AuthenticationDomain=Authentication domain (optional):
-SharedDriveConnector.UserName=User name:
-SharedDriveConnector.Password=Password:
-SharedDriveConnector.Parameters=Parameters:
-SharedDriveConnector.certificate= certificate(s)
-SharedDriveConnector.NeedAValidNumberForMaximumDocumentLength=Need a valid number for maximum document length
-SharedDriveConnector.SelectAFolderOrTypeInAPathFirst=Select a folder or type in a path first
-SharedDriveConnector.EitherSelectAFolderORTypeInAPath=Either select a folder, OR type in a path
-SharedDriveConnector.EnterAFileSpecificationFirst=Enter a file specification first
-SharedDriveConnector.EnterAFileSpecificationFirst=Enter a file specification first
-SharedDriveConnector.NullAccessTokensNotAllowed=Null access tokens not allowed
-SharedDriveConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=Match string must be valid regular expression
-SharedDriveConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=Match string must be valid regular expression
-SharedDriveConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=Match string must be valid regular expression
-SharedDriveConnector.MaximumDocumentLength=Maximum document length:
-SharedDriveConnector.DeletePath=Delete path #
-SharedDriveConnector.InsertNewMatchForPath=Insert new match for path #
-SharedDriveConnector.Include=Include
-SharedDriveConnector.Exclude=Exclude
-SharedDriveConnector.AnyFileOrDirectory=-- Any file or directory --
-SharedDriveConnector.files=file(s)
-SharedDriveConnector.indexableFiles=indexable file(s)
-SharedDriveConnector.unindexableFiles=un-indexable file(s)
-SharedDriveConnector.directorys=directory(s)
-SharedDriveConnector.matching=matching
-SharedDriveConnector.DeletePath=Delete path #
-SharedDriveConnector.matchSpec=, match spec #
-SharedDriveConnector.NoRulesDefined=No rules defined
-SharedDriveConnector.AddNewMatchForPath=Add new match for path #
-SharedDriveConnector.NoStartingPointsDefined=No starting points defined
-SharedDriveConnector.AddPath=Add path
-SharedDriveConnector.RemoveFromPath=Remove from path
-SharedDriveConnector.PickAFolder=-- Pick a folder --
-SharedDriveConnector.orTypeAPath= or type a path:\n"
-SharedDriveConnector.FileSecurity=File security:
-SharedDriveConnector.Enabled=Enabled
-SharedDriveConnector.Disabled=Disabled
-SharedDriveConnector.DeleteToken=Delete token #
-SharedDriveConnector.NoFileAccessTokensPresent=No file access tokens present
-SharedDriveConnector.AddToken=Add token
-SharedDriveConnector.ShareSecurity=Share security:
-SharedDriveConnector.ParentFolderSecurity=Parent folder security:
-SharedDriveConnector.PathAttributeName=Path attribute name:
-SharedDriveConnector.DeleteMapping=Delete mapping #
-SharedDriveConnector.NoMappingsSpecified=No mappings specified
-SharedDriveConnector.AddToMappings=Add to mappings
-SharedDriveConnector.MatchRegexp=Match regexp:
-SharedDriveConnector.ReplaceString=Replace string:
-SharedDriveConnector.DeleteFileMapping=Delete file mapping #
-SharedDriveConnector.NoFileMappingsSpecified=No file mappings specified
-SharedDriveConnector.AddToFileMappings=Add to file mappings
-SharedDriveConnector.DeleteUrlMapping=Delete url mapping #
-SharedDriveConnector.NoURLMappingsSpecifiedWillProduceAFileIRI=No URL mappings specified; will produce a file IRI
-SharedDriveConnector.AddToURLMappings=Add to URL mappings
-SharedDriveConnector.NoDocumentsSpecified=No documents specified
-SharedDriveConnector.FileSecurity=File security:
-SharedDriveConnector.FileAccessTokens=File access tokens:
-SharedDriveConnector.NoFileAccessTokensSpecified=No file access tokens specified
-SharedDriveConnector.ShareSecurity=Share security:
-SharedDriveConnector.PathNameMetadataAttribute=Path-name metadata attribute:
-SharedDriveConnector.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-SharedDriveConnector.PathValueMapping=Path-value mapping:
-SharedDriveConnector.FileNameMapping=File name mapping:
-SharedDriveConnector.NoFileNameMappingsSpecified=No file name mappings specified
-SharedDriveConnector.URLMappingColon=URL Mapping:
-SharedDriveConnector.MaximumDocumentLength=Maximum document length:
-SharedDriveConnector.BinName=Bin Name (optional):
diff --git a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_es_ES.properties b/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_es_ES.properties
deleted file mode 100644
index fe50636..0000000
--- a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_es_ES.properties
+++ /dev/null
@@ -1,99 +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.
-
-SharedDriveConnector.Paths=Caminos
-SharedDriveConnector.Security=Securidad
-SharedDriveConnector.Metadata=Metadata
-SharedDriveConnector.ContentLength=contenido Longitud
-SharedDriveConnector.FileMapping=Trazar un mapa de Archivo
-SharedDriveConnector.URLMapping=URL Trazar un mapa
-
-SharedDriveConnector.NeedAServerName=Necesita un nombre de servidor
-SharedDriveConnector.Server=Servidor
-SharedDriveConnector.UseSIDSForSecurity=Utilice SIDS para la seguridad:
-SharedDriveConnector.Server2=Servidor
-SharedDriveConnector.ServerNameCannotIncludePathInformation=Nombre del servidor no puede incluir información de la ruta
-SharedDriveConnector.NeedAUserName=Necesita un nombre de usuario
-SharedDriveConnector.Server3=Servidor:
-SharedDriveConnector.AuthenticationDomain=dominio de autenticación (opcional):
-SharedDriveConnector.UserName=Nombre de usuario:
-SharedDriveConnector.Password=Contraseña:
-SharedDriveConnector.Parameters=Paràmetros:
-SharedDriveConnector.certificate= certificado( s )
-SharedDriveConnector.NeedAValidNumberForMaximumDocumentLength=Necesita un número válido para la longitud máxima del documento
-SharedDriveConnector.SelectAFolderOrTypeInAPathFirst=Seleccione una carpeta o escriba en un camino primero
-SharedDriveConnector.EitherSelectAFolderORTypeInAPath=O bien seleccione una carpeta, o escriba una ruta
-SharedDriveConnector.EnterAFileSpecificationFirst=Introduzca una especificación de archivo primero
-SharedDriveConnector.EnterAFileSpecificationFirst=Introduzca una especificación de archivo primero
-SharedDriveConnector.NullAccessTokensNotAllowed=Tokens de acceso nulos no permitidos
-SharedDriveConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=Cadena de ajuste debe ser expresión regular válida
-SharedDriveConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=Cadena de ajuste debe ser expresión regular válida
-SharedDriveConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=Cadena de ajuste debe ser expresión regular válida
-SharedDriveConnector.MaximumDocumentLength=Longitud máxima del documento:
-SharedDriveConnector.DeletePath=eliminar ruta #
-SharedDriveConnector.InsertNewMatchForPath=Insertar nuevo partido para la ruta #
-SharedDriveConnector.Include=incluir
-SharedDriveConnector.Exclude=Excluir
-SharedDriveConnector.AnyFileOrDirectory=-- Cualquier archivo o directorio --
-SharedDriveConnector.files=archivo( s )
-SharedDriveConnector.indexableFiles=archivo indexable( s )
-SharedDriveConnector.unindexableFiles=archivo un-indexable( s )
-SharedDriveConnector.directorys=directorio(s)
-SharedDriveConnector.matching=correspondencia
-SharedDriveConnector.DeletePath=eliminar ruta #
-SharedDriveConnector.matchSpec=, partido de especificaciones #
-SharedDriveConnector.NoRulesDefined=No rules defined
-SharedDriveConnector.AddNewMatchForPath=Escribir un partido para la ruta #
-SharedDriveConnector.NoStartingPointsDefined=No hay puntos de partida definidos
-SharedDriveConnector.AddPath=Añadir ruta
-SharedDriveConnector.RemoveFromPath=Eliminar de ruta
-SharedDriveConnector.PickAFolder=-- Elija una carpeta --
-SharedDriveConnector.orTypeAPath= o escriba una ruta:\n"
-SharedDriveConnector.FileSecurity=seguridad de archivos:
-SharedDriveConnector.Enabled=Activado
-SharedDriveConnector.Disabled=Imposibilitado
-SharedDriveConnector.DeleteToken=eliminar token #
-SharedDriveConnector.NoFileAccessTokensPresent=No hay tokens de acceso de archivos presentes
-SharedDriveConnector.AddToken=Añadir token
-SharedDriveConnector.ShareSecurity=seguridad Compartir:
-SharedDriveConnector.ParentFolderSecurity=Seguridad de carpeta paternal:
-SharedDriveConnector.PathAttributeName=Nombre de atributo de camino:
-SharedDriveConnector.DeleteMapping=Suprima trazar un mapa #
-SharedDriveConnector.NoMappingsSpecified=Ningún trazado de mapa especificado
-SharedDriveConnector.AddToMappings=Añadir a asignaciones
-SharedDriveConnector.MatchRegexp=Correspondencia regexp:
-SharedDriveConnector.ReplaceString=Reemplazar cadena:
-SharedDriveConnector.DeleteFileMapping=Eliminar asignación de archivo #
-SharedDriveConnector.NoFileMappingsSpecified=No hay asignaciones de archivo especificados
-SharedDriveConnector.AddToFileMappings=Añada al trazado un mapa de archivo
-SharedDriveConnector.DeleteUrlMapping=Suprima el trazado un mapa de url #
-SharedDriveConnector.NoURLMappingsSpecifiedWillProduceAFileIRI=No hay trazado del mapa de URL especificado; producirá un archivo IRI
-SharedDriveConnector.AddToURLMappings=Añadir a asignaciones de URL
-SharedDriveConnector.NoDocumentsSpecified=No hay documentos especificados
-SharedDriveConnector.FileSecurity=Seguridad de archivo:
-SharedDriveConnector.FileAccessTokens=Tokens de acceso del archivo:
-SharedDriveConnector.NoFileAccessTokensSpecified=No hay tokens de acceso de archivos especificados
-SharedDriveConnector.ShareSecurity=seguridad Compartir:
-SharedDriveConnector.PathNameMetadataAttribute=Camino-atributo de nombre metadatos:
-SharedDriveConnector.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-SharedDriveConnector.PathValueMapping=Camino-asignación de valores:
-SharedDriveConnector.FileNameMapping=Trazar un mapa de nombre del archivo:
-SharedDriveConnector.NoFileNameMappingsSpecified=No hay trazado de mapa de nombre del archivo especificado
-SharedDriveConnector.URLMappingColon=URL Trazar un mapa:
-SharedDriveConnector.MaximumDocumentLength=Longitud máxima del documento:
-SharedDriveConnector.BinName=Bin Name (optional):
diff --git a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_ja_JP.properties b/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_ja_JP.properties
deleted file mode 100644
index 4da45d8..0000000
--- a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_ja_JP.properties
+++ /dev/null
@@ -1,98 +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.
-
-SharedDriveConnector.Paths=パス
-SharedDriveConnector.Security=セキュリティ
-SharedDriveConnector.Metadata=メタデータ
-SharedDriveConnector.ContentLength=コンテンツ長
-SharedDriveConnector.FileMapping=ファイルマッピング
-SharedDriveConnector.URLMapping=URLマッピング
-SharedDriveConnector.NeedAServerName=サーバ名を入力してください
-SharedDriveConnector.UseSIDSForSecurity=Use SIDS for security:
-SharedDriveConnector.Server=サーバ
-SharedDriveConnector.Server2=サーバ
-SharedDriveConnector.ServerNameCannotIncludePathInformation=サーバ名にパス情報を含めないでください
-SharedDriveConnector.NeedAUserName=ユーザ名を入力してください
-SharedDriveConnector.Server3=サーバ:
-SharedDriveConnector.AuthenticationDomain=認証ドメイン(任意):
-SharedDriveConnector.UserName=ユーザ名:
-SharedDriveConnector.Password=パスワード:
-SharedDriveConnector.Parameters=引数:
-SharedDriveConnector.certificate= 証明書
-SharedDriveConnector.NeedAValidNumberForMaximumDocumentLength=最大コンテンツ長さに正しい数字を入力してください
-SharedDriveConnector.SelectAFolderOrTypeInAPathFirst=パスのタイプ又はフォルダを選択してください
-SharedDriveConnector.EitherSelectAFolderORTypeInAPath=フォルダを選択するかパスを入力してください
-SharedDriveConnector.EnterAFileSpecificationFirst=ファイルパターンを入力してください
-SharedDriveConnector.EnterAFileSpecificationFirst=ファイルパターンを入力してください
-SharedDriveConnector.NullAccessTokensNotAllowed=アクセストークンを入力してください
-SharedDriveConnector.MatchStringCannotBeEmpty=パターンを入力してください
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=パターンには正規表現式を入力してください
-SharedDriveConnector.MatchStringCannotBeEmpty=パターンを入力してください
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=パターンには正規表現を入力してください
-SharedDriveConnector.MatchStringCannotBeEmpty=パターンを入力してください
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=パターンには正規表現を入力してください
-SharedDriveConnector.MaximumDocumentLength=最大コンテンツ長:
-SharedDriveConnector.DeletePath=パスを削除: #
-SharedDriveConnector.InsertNewMatchForPath=パスに新しいパターンを挿入: #
-SharedDriveConnector.Include=含む
-SharedDriveConnector.Exclude=除外
-SharedDriveConnector.AnyFileOrDirectory=-- 任意のファイル又はディレクトリ --
-SharedDriveConnector.files=ファイル
-SharedDriveConnector.indexableFiles=索引可能のファイル
-SharedDriveConnector.unindexableFiles=索引不可のファイル
-SharedDriveConnector.directorys=ディレクトリ
-SharedDriveConnector.matching=一致
-SharedDriveConnector.DeletePath=パスを削除: #
-SharedDriveConnector.matchSpec=、パターン仕様: #
-SharedDriveConnector.NoRulesDefined=ルールが定義されていません
-SharedDriveConnector.AddNewMatchForPath=パスに新しいパターンを追加: #
-SharedDriveConnector.NoStartingPointsDefined=開始点が指定されていません
-SharedDriveConnector.AddPath=パスを追加
-SharedDriveConnector.RemoveFromPath=パスから削除
-SharedDriveConnector.PickAFolder=-- フォルダを選択してください --
-SharedDriveConnector.orTypeAPath= 又はパス:\n"
-SharedDriveConnector.FileSecurity=ファイルセキュリティ:
-SharedDriveConnector.Enabled=有効
-SharedDriveConnector.Disabled=無効
-SharedDriveConnector.DeleteToken=トークンを削除: #
-SharedDriveConnector.NoFileAccessTokensPresent=ファイルアクセストークンが定義されていません
-SharedDriveConnector.AddToken=トークンを追加
-SharedDriveConnector.ShareSecurity=共有セキュリティ:
-SharedDriveConnector.ParentFolderSecurity=親フォルダセキュリティ:
-SharedDriveConnector.PathAttributeName=パス属性名:
-SharedDriveConnector.DeleteMapping=マップを削除: #
-SharedDriveConnector.NoMappingsSpecified=マップが指定されていません
-SharedDriveConnector.AddToMappings=マップを追加
-SharedDriveConnector.MatchRegexp=正規表現:
-SharedDriveConnector.ReplaceString=文字列の置換:
-SharedDriveConnector.DeleteFileMapping=削除するファイルパターン #
-SharedDriveConnector.NoFileMappingsSpecified=ファイルパターンを指定してください
-SharedDriveConnector.AddToFileMappings=ファイルマップに追加
-SharedDriveConnector.DeleteUrlMapping=URIマップを削除: #
-SharedDriveConnector.NoURLMappingsSpecifiedWillProduceAFileIRI=URIマップが指定されていません。ファイルIRIを作成します
-SharedDriveConnector.AddToURLMappings=URIマップに追加
-SharedDriveConnector.NoDocumentsSpecified=コンテンツが指定されていません
-SharedDriveConnector.FileSecurity=ファイルセキュリティ:
-SharedDriveConnector.FileAccessTokens=ファイルアクセストークン:
-SharedDriveConnector.NoFileAccessTokensSpecified=ファイルアクセストークンが指定されていません
-SharedDriveConnector.ShareSecurity=共有セキュリティ:
-SharedDriveConnector.PathNameMetadataAttribute=パスー名メタデータ属性:
-SharedDriveConnector.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性が指定されていません
-SharedDriveConnector.PathValueMapping=パスー値パターン:
-SharedDriveConnector.FileNameMapping=ファイル名パターン:
-SharedDriveConnector.NoFileNameMappingsSpecified=ファイル名パターンを指定してください
-SharedDriveConnector.URLMappingColon=URLパターン:
-SharedDriveConnector.MaximumDocumentLength=最大コンテンツ長:
-SharedDriveConnector.BinName=Bin Name (optional):
diff --git a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_zh_CN.properties b/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_zh_CN.properties
deleted file mode 100644
index 8befc03..0000000
--- a/connectors/jcifs/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharedrive/common_zh_CN.properties
+++ /dev/null
@@ -1,98 +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.
-
-SharedDriveConnector.Paths=路径
-SharedDriveConnector.Security=安全
-SharedDriveConnector.Metadata=元数据
-SharedDriveConnector.ContentLength=文档长度
-SharedDriveConnector.FileMapping=文件映射
-SharedDriveConnector.URLMapping=URL映射
-SharedDriveConnector.NeedAServerName=请输入服务器名
-SharedDriveConnector.UseSIDSForSecurity=为了安全起见使用SIDS:
-SharedDriveConnector.Server=服务器
-SharedDriveConnector.Server2=服务器
-SharedDriveConnector.ServerNameCannotIncludePathInformation=服务器名不能包含路径信息
-SharedDriveConnector.NeedAUserName=请输入用户名
-SharedDriveConnector.Server3=服务器: 
-SharedDriveConnector.AuthenticationDomain=认证域(可选): 
-SharedDriveConnector.UserName=用户名: 
-SharedDriveConnector.Password=密码: 
-SharedDriveConnector.Parameters=参数: 
-SharedDriveConnector.certificate= 证书
-SharedDriveConnector.NeedAValidNumberForMaximumDocumentLength=最大文档长度需为有效的数字
-SharedDriveConnector.SelectAFolderOrTypeInAPathFirst=先选择文件夹或输入路径
-SharedDriveConnector.EitherSelectAFolderORTypeInAPath=选择文件夹或输入路径
-SharedDriveConnector.EnterAFileSpecificationFirst=请先输入文件规范
-SharedDriveConnector.EnterAFileSpecificationFirst=请先输入文件规范
-SharedDriveConnector.NullAccessTokensNotAllowed=请输入访问令牌
-SharedDriveConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=匹配字符串必须为有效的正则表达式
-SharedDriveConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=匹配字符串必须为有效的正则表达式
-SharedDriveConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-SharedDriveConnector.MatchStringMustBeValidRegularExpression=匹配字符串必须为有效的正则表达式
-SharedDriveConnector.MaximumDocumentLength=最大文档长度: 
-SharedDriveConnector.DeletePath=删除路径:  #
-SharedDriveConnector.InsertNewMatchForPath=为路径插入新匹配模式:  #
-SharedDriveConnector.Include=包含
-SharedDriveConnector.Exclude=排除
-SharedDriveConnector.AnyFileOrDirectory=-- 可选文件或目录 --
-SharedDriveConnector.files=文件
-SharedDriveConnector.indexableFiles=可索引化的文件
-SharedDriveConnector.unindexableFiles=不可索引化的文件
-SharedDriveConnector.directorys=目录
-SharedDriveConnector.matching=匹配
-SharedDriveConnector.DeletePath=删除路径:  #
-SharedDriveConnector.matchSpec=,匹配规范:  #
-SharedDriveConnector.NoRulesDefined=规则未定义
-SharedDriveConnector.AddNewMatchForPath=为路径添加新匹配模式:  #
-SharedDriveConnector.NoStartingPointsDefined=开始点未指定
-SharedDriveConnector.AddPath=添加路径
-SharedDriveConnector.RemoveFromPath=从路径删除
-SharedDriveConnector.PickAFolder=-- 请选择文件夹 --
-SharedDriveConnector.orTypeAPath= 或输入路径: \n"
-SharedDriveConnector.FileSecurity=文件安全: 
-SharedDriveConnector.Enabled=有效
-SharedDriveConnector.Disabled=无效
-SharedDriveConnector.DeleteToken=删除令牌:  #
-SharedDriveConnector.NoFileAccessTokensPresent=文件访问令牌不存在
-SharedDriveConnector.AddToken=添加令牌
-SharedDriveConnector.ShareSecurity=共享安全: 
-SharedDriveConnector.ParentFolderSecurity=父文件夹安全: 
-SharedDriveConnector.PathAttributeName=路径属性名: 
-SharedDriveConnector.DeleteMapping=删除映射:  #
-SharedDriveConnector.NoMappingsSpecified=映射未指定
-SharedDriveConnector.AddToMappings=添加到映射
-SharedDriveConnector.MatchRegexp=匹配正则表达式: 
-SharedDriveConnector.ReplaceString=替换字符串: 
-SharedDriveConnector.DeleteFileMapping=删除文件映射 #
-SharedDriveConnector.NoFileMappingsSpecified=请指定文件规范
-SharedDriveConnector.AddToFileMappings=添加到文件映射
-SharedDriveConnector.DeleteUrlMapping=删除URI映射:  #
-SharedDriveConnector.NoURLMappingsSpecifiedWillProduceAFileIRI=URI映射未指定。将生成文件IRI
-SharedDriveConnector.AddToURLMappings=添加到URI映射
-SharedDriveConnector.NoDocumentsSpecified=文档未指定
-SharedDriveConnector.FileSecurity=文件安全: 
-SharedDriveConnector.FileAccessTokens=文件访问令牌: 
-SharedDriveConnector.NoFileAccessTokensSpecified=文件访问令牌未指定
-SharedDriveConnector.ShareSecurity=共享安全: 
-SharedDriveConnector.PathNameMetadataAttribute=路径名元数据属性: 
-SharedDriveConnector.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-SharedDriveConnector.PathValueMapping=路径值映射: 
-SharedDriveConnector.FileNameMapping=文件名映射: 
-SharedDriveConnector.NoFileNameMappingsSpecified=请指定文件名映射
-SharedDriveConnector.URLMappingColon=URL映射: 
-SharedDriveConnector.MaximumDocumentLength=最大文档长度: 
-SharedDriveConnector.BinName=Bin Name (optional):
diff --git a/connectors/jcifs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharedrive/tests/BaseUIHSQLDB.java b/connectors/jcifs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharedrive/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 98356e6..0000000
--- a/connectors/jcifs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharedrive/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharedrive.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"JCIFS Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/jcifs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharedrive/tests/NavigationHSQLDBUI.java b/connectors/jcifs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharedrive/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index bb4cf0f..0000000
--- a/connectors/jcifs/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharedrive/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharedrive.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Server tab
-    testerInstance.clickTab("Server");
-    testerInstance.setValue("server", "localhost");
-    testerInstance.setValue("username", "foo");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the connector tabs.
-    // Paths
-    testerInstance.clickTab("Paths");
-    // Security
-    testerInstance.clickTab("Security");
-    // Metadata
-    testerInstance.clickTab("Metadata");
-    // Content Length
-    testerInstance.clickTab("Content Length");
-    // File Mapping
-    testerInstance.clickTab("File Mapping");
-    // URL Mapping
-    testerInstance.clickTab("URL Mapping");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/jcifs/lib-proprietary/README.txt b/connectors/jcifs/lib-proprietary/README.txt
deleted file mode 100644
index 093b14b..0000000
--- a/connectors/jcifs/lib-proprietary/README.txt
+++ /dev/null
@@ -1,25 +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.
-
-For the jcifs connector, certain changes were made to jcifs itself to work reliably
-with Samba systems.  This set of upstream changes is encapsulated in the following file:
-
-jcifs.diffs, against version 1.3.9 as downloaded from http://jcifs.samba.org.
-
-To build this connector, copy the jcifs.jar into this directory, and build the connector
-using the standard ant build.  You can read more about the process on the
-"how-to-build-and-deploy.html" documentation page.
-
-
diff --git a/connectors/jcifs/lib-proprietary/jcifs.diffs b/connectors/jcifs/lib-proprietary/jcifs.diffs
deleted file mode 100644
index 7124bd3..0000000
--- a/connectors/jcifs/lib-proprietary/jcifs.diffs
+++ /dev/null
@@ -1,35 +0,0 @@
-Index: src/jcifs/smb/ServerMessageBlock.java
-===================================================================
---- src/jcifs/smb/ServerMessageBlock.java	(.../tags/jcifs_samba-1.3.9-2)	(revision 104528)
-+++ src/jcifs/smb/ServerMessageBlock.java	(.../branches/kwright/apache-lcf-software-grant/third/jcifs)	(revision 104528)
-@@ -186,13 +186,15 @@
-     ServerMessageBlock response;

- 

-     ServerMessageBlock() {

--        flags = (byte)( FLAGS_PATH_NAMES_CASELESS | FLAGS_PATH_NAMES_CANONICALIZED );

-+	// KDW: I removed the FLAGS_PATH_NAMES_CASELESS flag.

-+        flags = (byte)( FLAGS_PATH_NAMES_CANONICALIZED );

-         pid = PID;

-         batchLevel = 0;

-     }

- 

-     void reset() {

--        flags = (byte)( FLAGS_PATH_NAMES_CASELESS | FLAGS_PATH_NAMES_CANONICALIZED );

-+	// KDW: I removed the FLAGS_PATH_NAMES_CASELESS flag.

-+        flags = (byte)( FLAGS_PATH_NAMES_CANONICALIZED );

-         flags2 = 0;

-         errorCode = 0;

-         received = false;

-Index: src/jcifs/smb/SmbConstants.java
-===================================================================
---- src/jcifs/smb/SmbConstants.java	(.../tags/jcifs_samba-1.3.9-2)	(revision 104528)
-+++ src/jcifs/smb/SmbConstants.java	(.../branches/kwright/apache-lcf-software-grant/third/jcifs)	(revision 104528)
-@@ -10,7 +10,7 @@
-     static final int DEFAULT_PORT = 445;

- 

-     static final int DEFAULT_MAX_MPX_COUNT = 10;

--    static final int DEFAULT_RESPONSE_TIMEOUT = 30000;

-+    static final int DEFAULT_RESPONSE_TIMEOUT = 60000;

-     static final int DEFAULT_SO_TIMEOUT = 35000;

-     static final int DEFAULT_RCV_BUF_SIZE = 60416;

-     static final int DEFAULT_SND_BUF_SIZE = 16644;

diff --git a/connectors/jcifs/pom.xml b/connectors/jcifs/pom.xml
deleted file mode 100644
index 1773c01..0000000
--- a/connectors/jcifs/pom.xml
+++ /dev/null
@@ -1,368 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-jcifs-connector</artifactId>
-  <name>ManifoldCF - Connectors - jCIFS</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <!-- try installing manually from http://jcifs.samba.org if not available 
-      in your repository -->
-    <dependency>
-      <groupId>jcifs</groupId>
-      <artifactId>jcifs</artifactId>
-      <version>1.3.17</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
-
diff --git a/connectors/jcifs/proprietary-library-instructions.txt b/connectors/jcifs/proprietary-library-instructions.txt
deleted file mode 100644
index 5e86938..0000000
--- a/connectors/jcifs/proprietary-library-instructions.txt
+++ /dev/null
@@ -1,26 +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.
-
-For the jcifs connector, certain changes were made to jcifs itself to
-work reliably with Samba systems.  This set of upstream changes is
-encapsulated in the following file:
-
-jcifs.diffs, against version 1.3.9 as downloaded from http://jcifs.samba.org.
-
-To run this connector, copy the jcifs.jar into this directory, and run
-ManifoldCF in the normal way.  You can read more about the
-process on the "how-to-build-and-deploy.html" documentation page.
-
-
diff --git a/connectors/jdbc/.gitignore b/connectors/jdbc/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/jdbc/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/jdbc/build.xml b/connectors/jdbc/build.xml
deleted file mode 100644
index 8178587..0000000
--- a/connectors/jdbc/build.xml
+++ /dev/null
@@ -1,44 +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.
--->
-
-<project name="jdbc" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="JDBC"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.jdbc.JDBCConnector"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="JDBC"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.jdbc.JDBCAuthority"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java
deleted file mode 100644
index 19f6e45..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java
+++ /dev/null
@@ -1,902 +0,0 @@
-/*

- * Copyright 2012 The Apache Software Foundation.

- *

- * Licensed 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 org.apache.manifoldcf.authorities.authorities.jdbc;

-

-import java.io.IOException;

-import java.sql.PreparedStatement;

-import java.sql.ResultSet;

-import java.util.ArrayList;

-import java.util.HashMap;

-import java.util.Iterator;

-import java.util.List;

-import java.util.Locale;

-import java.util.Map;

-import java.util.logging.Level;

-import java.util.logging.Logger;

-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;

-import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;

-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;

-import org.apache.manifoldcf.core.cachemanager.BaseDescription;

-import org.apache.manifoldcf.core.interfaces.BinaryInput;

-import org.apache.manifoldcf.core.interfaces.CacheManagerFactory;

-import org.apache.manifoldcf.core.interfaces.ConfigParams;

-import org.apache.manifoldcf.core.interfaces.ICacheCreateHandle;

-import org.apache.manifoldcf.core.interfaces.ICacheDescription;

-import org.apache.manifoldcf.core.interfaces.ICacheHandle;

-import org.apache.manifoldcf.core.interfaces.ICacheManager;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-import org.apache.manifoldcf.connectorcommon.interfaces.IKeystoreManager;

-import org.apache.manifoldcf.core.interfaces.IPostParameters;

-import org.apache.manifoldcf.core.interfaces.IThreadContext;

-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-import org.apache.manifoldcf.core.interfaces.StringSet;

-import org.apache.manifoldcf.core.interfaces.TimeMarker;

-import org.apache.manifoldcf.core.interfaces.IResultRow;

-import org.apache.manifoldcf.jdbc.JDBCConnection;

-import org.apache.manifoldcf.jdbc.JDBCConstants;

-import org.apache.manifoldcf.jdbc.IDynamicResultSet;

-import org.apache.manifoldcf.jdbc.IDynamicResultRow;

-import org.apache.manifoldcf.authorities.system.Logging;

-

-/**

- *

- * @author krycek

- */

-public class JDBCAuthority extends BaseAuthorityConnector {

-

-  public static final String _rcsid = "@(#)$Id: JDBCAuthority.java $";

-

-  protected JDBCConnection connection = null;

-  protected String jdbcProvider = null;

-  protected String accessMethod = null;

-  protected String host = null;

-  protected String databaseName = null;

-  protected String rawDriverString = null;

-  protected String userName = null;

-  protected String password = null;

-

-  protected String idQuery = null;

-  protected String tokenQuery = null;

-

-  private long responseLifetime = 60000L; //60sec

-  private int LRUsize = 1000;

-  /**

-   * Cache manager.

-   */

-  private ICacheManager cacheManager = null;

-

-  /**

-   * Set thread context.

-   */

-  @Override

-  public void setThreadContext(IThreadContext tc)

-    throws ManifoldCFException {

-    super.setThreadContext(tc);

-    cacheManager = CacheManagerFactory.make(tc);

-  }

-

-  /**

-   * Connect. The configuration parameters are included.

-   *

-   * @param configParams are the configuration parameters for this connection.

-   */

-  @Override

-  public void connect(ConfigParams configParams) {

-    super.connect(configParams);

-

-    jdbcProvider = configParams.getParameter(JDBCConstants.providerParameter);

-    accessMethod = configParams.getParameter(JDBCConstants.methodParameter);

-    host = configParams.getParameter(JDBCConstants.hostParameter);

-    databaseName = configParams.getParameter(JDBCConstants.databaseNameParameter);

-    rawDriverString = configParams.getParameter(JDBCConstants.driverStringParameter);

-    userName = configParams.getParameter(JDBCConstants.databaseUserName);

-    password = configParams.getObfuscatedParameter(JDBCConstants.databasePassword);

-

-    idQuery = configParams.getParameter(JDBCConstants.databaseUserIdQuery);

-    tokenQuery = configParams.getParameter(JDBCConstants.databaseTokensQuery);

-  }

-

-  /**

-   * Check status of connection.

-   */

-  @Override

-  public String check()

-    throws ManifoldCFException {

-    try {

-      getSession();

-      // Attempt to fetch a connection; if this succeeds we pass

-      connection.testConnection();

-      return super.check();

-    } catch (ServiceInterruption e) {

-      if (Logging.authorityConnectors.isDebugEnabled()) {

-        Logging.authorityConnectors.debug("Service interruption in check(): " + e.getMessage(), e);

-      }

-      return "Transient error: " + e.getMessage();

-    }

-  }

-

-  /**

-   * Close the connection. Call this before discarding the repository connector.

-   */

-  @Override

-  public void disconnect()

-    throws ManifoldCFException {

-    connection = null;

-    host = null;

-    jdbcProvider = null;

-    accessMethod = null;

-    databaseName = null;

-    rawDriverString = null;

-    userName = null;

-    password = null;

-

-    super.disconnect();

-  }

-

-  /**

-   * Set up a session

-   */

-  protected void getSession()

-    throws ManifoldCFException, ServiceInterruption {

-    if (connection == null) {

-      if (jdbcProvider == null || jdbcProvider.length() == 0) {

-        throw new ManifoldCFException("Missing parameter '" + JDBCConstants.providerParameter + "'");

-      }

-      if ((host == null || host.length() == 0) && (rawDriverString == null || rawDriverString.length() == 0))

-        throw new ManifoldCFException("Missing parameter '"+JDBCConstants.hostParameter+"' or '"+JDBCConstants.driverStringParameter+"'");

-

-      connection = new JDBCConnection(jdbcProvider,(accessMethod==null || accessMethod.equals("name")),host,databaseName,rawDriverString,userName,password);

-    }

-  }

-

-  private String createCacheConnectionString() {

-    StringBuilder sb = new StringBuilder();

-    sb.append(jdbcProvider).append("|")

-      .append((host==null)?"":host).append("|")

-      .append((databaseName==null)?"":databaseName).append("|")

-      .append((rawDriverString==null)?"":rawDriverString).append("|")

-      .append(userName);

-    return sb.toString();

-  }

-

-  /**

-   * Obtain the access tokens for a given user name.

-   *

-   * @param userName is the user name or identifier.

-   * @return the response tokens (according to the current authority). (Should

-   * throws an exception only when a condition cannot be properly described

-   * within the authorization response object.)

-   */

-  @Override

-  public AuthorizationResponse getAuthorizationResponse(String userName)

-    throws ManifoldCFException {

-    // Construct a cache description object

-    ICacheDescription objectDescription = new JdbcAuthorizationResponseDescription(userName, createCacheConnectionString(), idQuery, tokenQuery, this.responseLifetime, this.LRUsize);

-

-    // Enter the cache

-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription}, null, null);

-    try {

-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);

-      try {

-        // Lookup the object

-        AuthorizationResponse response = (AuthorizationResponse) cacheManager.lookupObject(createHandle, objectDescription);

-        if (response != null) {

-          return response;

-        }

-        // Create the object.

-        response = getAuthorizationResponseUncached(userName);

-        // Save it in the cache

-        cacheManager.saveObject(createHandle, objectDescription, response);

-        // And return it...

-        return response;

-      } finally {

-        cacheManager.leaveCreateSection(createHandle);

-      }

-    } finally {

-      cacheManager.leaveCache(ch);

-    }

-  }

-

-  public AuthorizationResponse getAuthorizationResponseUncached(String userName)

-    throws ManifoldCFException {

-    try

-    {

-      getSession();

-

-      VariableMap vm = new VariableMap();

-      addConstant(vm, JDBCConstants.idReturnVariable, JDBCConstants.idReturnColumnName);

-      addVariable(vm, JDBCConstants.userNameVariable, userName);

-

-      // Find user id

-      ArrayList paramList = new ArrayList();

-      StringBuilder sb = new StringBuilder();

-      substituteQuery(idQuery, vm, sb, paramList);

-

-      IDynamicResultSet idSet;

-      try {

-        idSet = connection.executeUncachedQuery(sb.toString(),paramList,-1);

-      }

-      catch (ServiceInterruption e)

-      {

-        return RESPONSE_UNREACHABLE;

-      }

-      catch (ManifoldCFException e)

-      {

-        throw e;

-      }

-

-      String uid;

-      try {

-        IDynamicResultRow row = idSet.getNextRow();

-        if (row == null)

-          return RESPONSE_USERNOTFOUND;

-        try

-        {

-          Object oUid = row.getValue(JDBCConstants.idReturnColumnName);

-          if (oUid == null)

-            throw new ManifoldCFException("Bad id query; doesn't return $(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. \"$(IDCOLUMN)\".");

-          uid = JDBCConnection.readAsString(oUid);

-        }

-        finally

-        {

-          row.close();

-        }

-      } finally {

-        idSet.close();

-      }

-

-      if (uid.isEmpty()) {

-        return RESPONSE_USERNOTFOUND;

-      }

-

-      // now check tokens

-      vm = new VariableMap();

-      addConstant(vm, JDBCConstants.tokenReturnVariable, JDBCConstants.tokenReturnColumnName);

-      addVariable(vm, JDBCConstants.userNameVariable, userName);

-      addVariable(vm, JDBCConstants.userIDVariable, uid);

-      sb = new StringBuilder();

-      paramList = new ArrayList();

-      substituteQuery(tokenQuery, vm, sb, paramList);

-      

-      try {

-        idSet = connection.executeUncachedQuery(sb.toString(),paramList,-1);

-      }

-      catch (ServiceInterruption e)

-      {

-        return RESPONSE_UNREACHABLE;

-      }

-      catch (ManifoldCFException e)

-      {

-        throw e;

-      }

-

-      ArrayList<String> tokenArray = new ArrayList<String>();

-      try {

-        while (true)

-        {

-          IDynamicResultRow row = idSet.getNextRow();

-          if (row == null)

-            break;

-          try

-          {

-            Object oToken = row.getValue(JDBCConstants.tokenReturnColumnName);

-            if (oToken == null)

-              throw new ManifoldCFException("Bad token query; doesn't return $(TOKENCOLUMN) column.  Try using quotes around $(TOKENCOLUMN) variable, e.g. \"$(TOKENCOLUMN)\".");

-            String token = JDBCConnection.readAsString(oToken);

-

-            if (!token.isEmpty()) {

-              tokenArray.add(token);

-            }

-          }

-          finally

-          {

-            row.close();

-          }

-        }

-      } finally {

-        idSet.close();

-      }

-      return new AuthorizationResponse(tokenArray.toArray(new String[0]), AuthorizationResponse.RESPONSE_OK);

-    }

-    catch (ServiceInterruption e)

-    {

-      Logging.authorityConnectors.warn("JDBCAuthority: Service interruption: "+e.getMessage(),e);

-      return RESPONSE_UNREACHABLE;

-    }

-  }

-

-  // UI support methods.

-  //

-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch

-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,

-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch

-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()

-  // method, above).

-  /**

-   * Output the configuration header section. This method is called in the head

-   * section of the connector's configuration page. Its purpose is to add the

-   * required tabs to the list, and to output any javascript methods that might

-   * be needed by the configuration editing HTML.

-   *

-   * @param threadContext is the local thread context.

-   * @param out is the output to which any HTML should be sent.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   * @param tabsArray is an array of tab names. Add to this array any tab names

-   * that are specific to the connector.

-   */

-  @Override

-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,

-    Locale locale, ConfigParams parameters, List<String> tabsArray)

-    throws ManifoldCFException, IOException {

-    tabsArray.add(Messages.getString(locale, "JDBCAuthority.DatabaseType"));

-    tabsArray.add(Messages.getString(locale, "JDBCAuthority.Server"));

-    tabsArray.add(Messages.getString(locale, "JDBCAuthority.Credentials"));

-    tabsArray.add(Messages.getString(locale, "JDBCAuthority.Queries"));

-

-    out.print(

-"<script type=\"text/javascript\">\n"+

-"<!--\n"+

-"function checkConfigForSave()\n"+

-"{\n"+

-"  if (editconnection.databasehost.value == \"\" && editconnection.rawjdbcstring.value == \"\")\n"+

-"  {\n"+

-"    alert(\"" + Messages.getBodyJavascriptString(locale, "JDBCAuthority.PleaseFillInADatabaseServerName") + "\");\n"+

-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale, "JDBCAuthority.Server") + "\");\n"+

-"    editconnection.databasehost.focus();\n"+

-"    return false;\n"+

-"  }\n"+

-"  if (editconnection.databasename.value == \"\" && editconnection.rawjdbcstring.value == \"\")\n"+

-"  {\n"+

-"    alert(\"" + Messages.getBodyJavascriptString(locale, "JDBCAuthority.PleaseFillInTheNameOfTheDatabase") + "\");\n"+

-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale, "JDBCAuthority.Server") + "\");\n"+

-"    editconnection.databasename.focus();\n"+

-"    return false;\n"+

-"  }\n"+

-"  if (editconnection.username.value == \"\")\n"+

-"  {\n"+

-"    alert(\"" + Messages.getBodyJavascriptString(locale, "JDBCAuthority.PleaseSupplyTheDatabaseUsernameForThisConnection") + "\");\n"+

-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale, "JDBCAuthority.Credentials") + "\");\n"+

-"    editconnection.username.focus();\n"+

-"    return false;\n"+

-"  }\n"+

-"  return true;\n"+

-"}\n"+

-"\n"+

-"//-->\n"+

-"</script>\n"

-    );

-  }

-

-  /**

-   * Output the configuration body section. This method is called in the body

-   * section of the connector's configuration page. Its purpose is to present

-   * the required form elements for editing. The coder can presume that the HTML

-   * that is output from this configuration will be within appropriate <html>,

-   * <body>, and <form> tags. The name of the form is "editconnection".

-   *

-   * @param threadContext is the local thread context.

-   * @param out is the output to which any HTML should be sent.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   * @param tabName is the current tab name.

-   */

-  @Override

-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,

-    Locale locale, ConfigParams parameters, String tabName)

-    throws ManifoldCFException, IOException {

-    String lJdbcProvider = parameters.getParameter(JDBCConstants.providerParameter);

-    if (lJdbcProvider == null) {

-      lJdbcProvider = "oracle:thin:@";

-    }

-    String lAccessMethod = parameters.getParameter(JDBCConstants.methodParameter);

-    if (lAccessMethod == null)

-      lAccessMethod = "name";

-    String lHost = parameters.getParameter(JDBCConstants.hostParameter);

-    if (lHost == null) {

-      lHost = "localhost";

-    }

-    String lDatabaseName = parameters.getParameter(JDBCConstants.databaseNameParameter);

-    if (lDatabaseName == null) {

-      lDatabaseName = "database";

-    }

-    String rawJDBCString = parameters.getParameter(JDBCConstants.driverStringParameter);

-    if (rawJDBCString == null)

-      rawJDBCString = "";

-    String databaseUser = parameters.getParameter(JDBCConstants.databaseUserName);

-    if (databaseUser == null) {

-      databaseUser = "";

-    }

-    String databasePassword = parameters.getObfuscatedParameter(JDBCConstants.databasePassword);

-    if (databasePassword == null) {

-      databasePassword = "";

-    } else {

-      databasePassword = out.mapPasswordToKey(databasePassword);

-    }

-    String lIdQuery = parameters.getParameter(JDBCConstants.databaseUserIdQuery);

-    if (lIdQuery == null) {

-      lIdQuery = "SELECT idfield AS $(IDCOLUMN) FROM usertable WHERE login = $(USERNAME)";

-    }

-    String lTokenQuery = parameters.getParameter(JDBCConstants.databaseTokensQuery);

-    if (lTokenQuery == null) {

-      lTokenQuery = "SELECT groupnamefield AS $(TOKENCOLUMN) FROM grouptable WHERE user_id = $(UID) OR login = $(USERNAME)";

-    }

-

-    // "Database Type" tab

-    if (tabName.equals(Messages.getString(locale, "JDBCAuthority.DatabaseType"))) {

-      out.print(

-"<table class=\"displaytable\">\n"+

-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+

-"  <tr>\n"+

-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.DatabaseType2") + "</nobr></td><td class=\"value\">\n"+

-"      <select multiple=\"false\" name=\"databasetype\" size=\"2\">\n"+

-"        <option value=\"oracle:thin:@\" " + (lJdbcProvider.equals("oracle:thin:@") ? "selected=\"selected\"" : "") + ">Oracle</option>\n"+

-"        <option value=\"postgresql://\" " + (lJdbcProvider.equals("postgresql:") ? "selected=\"selected\"" : "") + ">Postgres SQL</option>\n"+

-"        <option value=\"jtds:sqlserver://\" " + (lJdbcProvider.equals("jtds:sqlserver:") ? "selected=\"selected\"" : "") + ">MS SQL Server (&gt; V6.5)</option>\n"+

-"        <option value=\"jtds:sybase://\" " + (lJdbcProvider.equals("jtds:sybase:") ? "selected=\"selected\"" : "") + ">Sybase (&gt;= V10)</option>\n"+

-"        <option value=\"mysql://\" " + (lJdbcProvider.equals("mysql:") ? "selected=\"selected\"" : "") + ">MySQL (&gt;= V5)</option>\n"+

-"      </select>\n"+

-"    </td>\n"+

-"  </tr>\n"+

-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+

-"  <tr>\n"+

-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCAuthority.AccessMethod") + "</nobr></td><td class=\"value\">\n"+

-"      <select multiple=\"false\" name=\"accessmethod\" size=\"2\">\n"+

-"        <option value=\"name\" "+(lAccessMethod.equals("name")?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"JDBCAuthority.ByName")+"</option>\n"+

-"        <option value=\"label\" "+(lAccessMethod.equals("label")?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"JDBCAuthority.ByLabel")+"</option>\n"+

-"      </select>\n"+

-"    </td>\n"+

-"  </tr>\n"+

-"</table>\n");

-    } else {

-      out.print(

-"<input type=\"hidden\" name=\"databasetype\" value=\"" + lJdbcProvider + "\"/>\n"+

-"<input type=\"hidden\" name=\"accessmethod\" value=\""+lAccessMethod+"\"/>\n"

-      );

-    }

-

-    // "Server" tab

-    if (tabName.equals(Messages.getString(locale, "JDBCAuthority.Server"))) {

-      out.print(

-"<table class=\"displaytable\">\n"+

-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+

-"  <tr>\n"+

-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.DatabaseHostAndPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"databasehost\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(lHost) + "\"/></td>\n"+

-"  </tr>\n"+

-"  <tr>\n"+

-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.DatabaseServiceNameOrInstanceDatabase") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"databasename\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(lDatabaseName) + "\"/></td>\n"+

-"  </tr>\n"+

-"  <tr>\n"+

-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCAuthority.RawDatabaseConnectString") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"80\" name=\"rawjdbcstring\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rawJDBCString)+"\"/></td>\n"+

-"  </tr>\n"+

-"</table>\n"

-      );

-    } else {

-      out.print(

-"<input type=\"hidden\" name=\"databasehost\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(lHost) + "\"/>\n"+

-"<input type=\"hidden\" name=\"databasename\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(lDatabaseName) + "\"/>\n"+

-"<input type=\"hidden\" name=\"rawjdbcstring\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rawJDBCString)+"\"/>\n"

-      );

-    }

-

-    // "Credentials" tab

-    if (tabName.equals(Messages.getString(locale, "JDBCAuthority.Credentials"))) {

-      out.print(

-        "<table class=\"displaytable\">\n"

-        + "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"

-        + "  <tr>\n"

-        + "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.UserName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"username\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databaseUser) + "\"/></td>\n"

-        + "  </tr>\n"

-        + "  <tr>\n"

-        + "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.Password") + "</nobr></td><td class=\"value\"><input type=\"password\" size=\"32\" name=\"password\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databasePassword) + "\"/></td>\n"

-        + "  </tr>\n"

-        + "</table>\n");

-    } else {

-      out.print(

-        "<input type=\"hidden\" name=\"username\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databaseUser) + "\"/>\n"

-        + "<input type=\"hidden\" name=\"password\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databasePassword) + "\"/>\n");

-    }

-

-    if (tabName.equals(Messages.getString(locale, "JDBCAuthority.Queries"))) {

-      out.print(

-        "<table class=\"displaytable\">\n"

-        + "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"

-        + "  <tr>\n"

-        + "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.UserIdQuery") + "</nobr><br/><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.returnUserIdOrEmptyResultset") + "</nobr></td>\n"

-        + "    <td class=\"value\"><textarea name=\"idquery\" cols=\"64\" rows=\"6\">" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(lIdQuery) + "</textarea></td>\n"

-        + "  </tr>\n"

-        + "  <tr>\n"

-        + "    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.TokenQuery") + "</nobr><br/><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.returnTokensForUser") + "</nobr></td>\n"

-        + "    <td class=\"value\"><textarea name=\"tokenquery\" cols=\"64\" rows=\"6\">" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(lTokenQuery) + "</textarea></td>\n"

-        + "  </tr>\n"

-        + "</table>\n");

-    } else {

-      out.print(

-        "<input type=\"hidden\" name=\"idquery\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(lIdQuery) + "\"/>\n"

-        + "<input type=\"hidden\" name=\"tokenquery\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(lTokenQuery) + "\"/>\n");

-    }

-

-  }

-

-  /**

-   * Process a configuration post. This method is called at the start of the

-   * connector's configuration page, whenever there is a possibility that form

-   * data for a connection has been posted. Its purpose is to gather form

-   * information and modify the configuration parameters accordingly. The name

-   * of the posted form is "editconnection".

-   *

-   * @param threadContext is the local thread context.

-   * @param variableContext is the set of variables available from the post,

-   * including binary file post information.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   * @return null if all is well, or a string error message if there is an error

-   * that should prevent saving of the connection (and cause a redirection to an

-   * error page).

-   */

-  @Override

-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,

-    Locale locale, ConfigParams parameters)

-    throws ManifoldCFException {

-    String type = variableContext.getParameter("databasetype");

-    if (type != null) {

-      parameters.setParameter(JDBCConstants.providerParameter, type);

-    }

-

-    String accessMethod = variableContext.getParameter("accessmethod");

-    if (accessMethod != null)

-      parameters.setParameter(JDBCConstants.methodParameter,accessMethod);

-

-    String lHost = variableContext.getParameter("databasehost");

-    if (lHost != null) {

-      parameters.setParameter(JDBCConstants.hostParameter, lHost);

-    }

-

-    String lDatabaseName = variableContext.getParameter("databasename");

-    if (lDatabaseName != null) {

-      parameters.setParameter(JDBCConstants.databaseNameParameter, lDatabaseName);

-    }

-

-    String rawJDBCString = variableContext.getParameter("rawjdbcstring");

-    if (rawJDBCString != null)

-      parameters.setParameter(JDBCConstants.driverStringParameter,rawJDBCString);

-

-    String lUserName = variableContext.getParameter("username");

-    if (lUserName != null) {

-      parameters.setParameter(JDBCConstants.databaseUserName, lUserName);

-    }

-

-    String lPassword = variableContext.getParameter("password");

-    if (lPassword != null) {

-      parameters.setObfuscatedParameter(JDBCConstants.databasePassword, variableContext.mapKeyToPassword(lPassword));

-    }

-

-    String lIdQuery = variableContext.getParameter("idquery");

-    if (lIdQuery != null) {

-      parameters.setParameter(JDBCConstants.databaseUserIdQuery, lIdQuery);

-    }

-

-    String lTokenQuery = variableContext.getParameter("tokenquery");

-    if (lTokenQuery != null) {

-      parameters.setParameter(JDBCConstants.databaseTokensQuery, lTokenQuery);

-    }

-

-    return null;

-  }

-

-  /**

-   * View configuration. This method is called in the body section of the

-   * connector's view configuration page. Its purpose is to present the

-   * connection information to the user. The coder can presume that the HTML

-   * that is output from this configuration will be within appropriate <html>

-   * and <body> tags.

-   *

-   * @param threadContext is the local thread context.

-   * @param out is the output to which any HTML should be sent.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   */

-  @Override

-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,

-    Locale locale, ConfigParams parameters)

-    throws ManifoldCFException, IOException {

-    out.print(

-      "<table class=\"displaytable\">\n"

-      + "  <tr>\n"

-      + "    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale, "JDBCAuthority.Parameters") + "</nobr></td>\n"

-      + "    <td class=\"value\" colspan=\"3\">\n");

-    Iterator iter = parameters.listParameters();

-    while (iter.hasNext()) {

-      String param = (String) iter.next();

-      String value = parameters.getParameter(param);

-      if (param.length() >= "password".length() && param.substring(param.length() - "password".length()).equalsIgnoreCase("password")) {

-        out.print(

-          "      <nobr>" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param) + "=********</nobr><br/>\n");

-      } else if (param.length() >= "keystore".length() && param.substring(param.length() - "keystore".length()).equalsIgnoreCase("keystore")) {

-        IKeystoreManager kmanager = KeystoreManagerFactory.make("", value);

-        out.print(

-          "      <nobr>" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param) + "=&lt;" + Integer.toString(kmanager.getContents().length) + " certificate(s)&gt;</nobr><br/>\n");

-      } else {

-        out.print(

-          "      <nobr>" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param) + "=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value) + "</nobr><br/>\n");

-      }

-    }

-    out.print(

-      "    </td>\n"

-      + "  </tr>\n"

-      + "</table>\n");

-  }

-

-  /**

-   * Given a query, and a parameter map, substitute it. Each variable

-   * substitutes the string, and it also substitutes zero or more query

-   * parameters.

-   */

-  protected static void substituteQuery(String inputString, VariableMap inputMap, StringBuilder outputQuery, ArrayList outputParams)

-    throws ManifoldCFException {

-    // We are looking for strings that look like this: $(something)

-    // Right at the moment we don't care even about quotes, so we just want to look for $(.

-    int startIndex = 0;

-    while (true) {

-      int nextIndex = inputString.indexOf("$(", startIndex);

-      if (nextIndex == -1) {

-        outputQuery.append(inputString.substring(startIndex));

-        break;

-      }

-      int endIndex = inputString.indexOf(")", nextIndex);

-      if (endIndex == -1) {

-        outputQuery.append(inputString.substring(startIndex));

-        break;

-      }

-      String variableName = inputString.substring(nextIndex + 2, endIndex);

-      VariableMapItem item = inputMap.getVariable(variableName);

-      if (item == null) {

-        throw new ManifoldCFException("No such substitution variable: $(" + variableName + ")");

-      }

-      outputQuery.append(inputString.substring(startIndex, nextIndex));

-      outputQuery.append(item.getValue());

-      ArrayList inputParams = item.getParameters();

-      if (inputParams != null) {

-        int i = 0;

-        while (i < inputParams.size()) {

-          Object x = inputParams.get(i++);

-          outputParams.add(x);

-        }

-      }

-      startIndex = endIndex + 1;

-    }

-  }

-

-  /**

-   * Add string query variables

-   */

-  protected static void addVariable(VariableMap map, String varName, String variable) {

-    ArrayList params = new ArrayList();

-    params.add(variable);

-    map.addVariable(varName, "?", params);

-  }

-

-  /**

-   * Add string query constants

-   */

-  protected static void addConstant(VariableMap map, String varName, String value) {

-    map.addVariable(varName, value, null);

-  }

-

-  // pass params to preparedStatement

-  protected static void loadPS(PreparedStatement ps, ArrayList data)

-    throws java.sql.SQLException, ManifoldCFException {

-    if (data != null) {

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

-        // If the input type is a string, then set it as such.

-        // Otherwise, if it's an input stream, we make a blob out of it.

-        Object x = data.get(i);

-        if (x instanceof String) {

-          String value = (String) x;

-          // letting database do lame conversion!

-          ps.setString(i + 1, value);

-        }

-        if (x instanceof BinaryInput) {

-          BinaryInput value = (BinaryInput) x;

-          // System.out.println("Blob length on write = "+Long.toString(value.getLength()));

-          // The oracle driver does a binary conversion to base 64 when writing data

-          // into a clob column using a binary stream operator.  Since at this

-          // point there is no way to distinguish the two, and since our tests use CLOB,

-          // this code doesn't work for them.

-          // So, for now, use the ascii stream method.

-          //ps.setBinaryStream(i+1,value.getStream(),(int)value.getLength());

-          ps.setAsciiStream(i + 1, value.getStream(), (int) value.getLength());

-        }

-        if (x instanceof java.util.Date) {

-          ps.setDate(i + 1, new java.sql.Date(((java.util.Date) x).getTime()));

-        }

-        if (x instanceof Long) {

-          ps.setLong(i + 1, ((Long) x).longValue());

-        }

-        if (x instanceof TimeMarker) {

-          ps.setTimestamp(i + 1, new java.sql.Timestamp(((Long) x).longValue()));

-        }

-        if (x instanceof Double) {

-          ps.setDouble(i + 1, ((Double) x).doubleValue());

-        }

-        if (x instanceof Integer) {

-          ps.setInt(i + 1, ((Integer) x).intValue());

-        }

-        if (x instanceof Float) {

-          ps.setFloat(i + 1, ((Float) x).floatValue());

-        }

-      }

-    }

-  }

-

-  /**

-   * Variable map entry.

-   */

-  protected static class VariableMapItem {

-

-    protected String value;

-    protected ArrayList params;

-

-    /**

-     * Constructor.

-     */

-    public VariableMapItem(String value, ArrayList params) {

-      this.value = value;

-      this.params = params;

-    }

-

-    /**

-     * Get value.

-     */

-    public String getValue() {

-      return value;

-    }

-

-    /**

-     * Get parameters.

-     */

-    public ArrayList getParameters() {

-      return params;

-    }

-  }

-

-  /**

-   * Variable map.

-   */

-  protected static class VariableMap {

-

-    protected Map variableMap = new HashMap();

-

-    /**

-     * Constructor

-     */

-    public VariableMap() {

-    }

-

-    /**

-     * Add a variable map entry

-     */

-    public void addVariable(String variableName, String value, ArrayList parameters) {

-      VariableMapItem e = new VariableMapItem(value, parameters);

-      variableMap.put(variableName, e);

-    }

-

-    /**

-     * Get a variable map entry

-     */

-    public VariableMapItem getVariable(String variableName) {

-      return (VariableMapItem) variableMap.get(variableName);

-    }

-  }

-  protected static StringSet emptyStringSet = new StringSet();

-

-  /**

-   * This is the cache object descriptor for cached access tokens from this

-   * connector.

-   */

-  protected class JdbcAuthorizationResponseDescription extends BaseDescription {

-

-    /**

-     * The user name

-     */

-    protected final String userName;

-    /**

-     * LDAP connection string with server name and base DN

-     */

-    protected final String connectionString;

-    /** The user query. */

-    protected final String userQuery;

-    /** The token query. */

-    protected final String tokenQuery;

-    /**

-     * The response lifetime

-     */

-    protected final long responseLifetime;

-    /**

-     * The expiration time

-     */

-    protected long expirationTime = -1;

-

-    /**

-     * Constructor.

-     */

-    public JdbcAuthorizationResponseDescription(String userName, String connectionString, String userQuery, String tokenQuery, long responseLifetime, int LRUsize) {

-      super("JDBCAuthority", LRUsize);

-      this.userName = userName;

-      this.connectionString = connectionString;

-      this.userQuery = userQuery;

-      this.tokenQuery = tokenQuery;

-      this.responseLifetime = responseLifetime;

-    }

-

-    /**

-     * Return the invalidation keys for this object.

-     */

-    public StringSet getObjectKeys() {

-      return emptyStringSet;

-    }

-

-    /**

-     * Get the critical section name, used for synchronizing the creation of the

-     * object

-     */

-    public String getCriticalSectionName() {

-      StringBuilder sb = new StringBuilder(getClass().getName());

-      sb.append("-").append(userName).append("-").append(connectionString).append("-")

-        .append(userQuery).append("-").append(tokenQuery);

-      return sb.toString();

-    }

-

-    /**

-     * Return the object expiration interval

-     */

-    @Override

-    public long getObjectExpirationTime(long currentTime) {

-      if (expirationTime == -1) {

-        expirationTime = currentTime + responseLifetime;

-      }

-      return expirationTime;

-    }

-

-    @Override

-    public int hashCode() {

-      return userName.hashCode() + connectionString.hashCode() +

-        userQuery.hashCode() + tokenQuery.hashCode();

-    }

-

-    @Override

-    public boolean equals(Object o) {

-      if (!(o instanceof JdbcAuthorizationResponseDescription)) {

-        return false;

-      }

-      JdbcAuthorizationResponseDescription ard = (JdbcAuthorizationResponseDescription) o;

-      if (!ard.userName.equals(userName)) {

-        return false;

-      }

-      if (!ard.connectionString.equals(connectionString)) {

-        return false;

-      }

-      if (!ard.userQuery.equals(userQuery)) {

-        return false;

-      }

-      if (!ard.tokenQuery.equals(tokenQuery)) {

-        return false;

-      }

-      return true;

-    }

-  }

-}

diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/Messages.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/Messages.java
deleted file mode 100644
index ec69a51..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jdbc;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.jdbc.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.jdbc";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java
deleted file mode 100644
index c6a4157..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java
+++ /dev/null
@@ -1,2497 +0,0 @@
-/* $Id: JDBCConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jdbc;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.core.database.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.jdbc.JDBCConnection;
-import org.apache.manifoldcf.jdbc.JDBCConstants;
-import org.apache.manifoldcf.jdbc.IDynamicResultSet;
-import org.apache.manifoldcf.jdbc.IDynamicResultRow;
-
-import java.nio.charset.StandardCharsets;
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-
-import java.io.*;
-import java.util.*;
-
-/** JDBC repository connector.
-*/
-public class JDBCConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: JDBCConnector.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Activities that we know about
-  protected final static String ACTIVITY_EXTERNAL_QUERY = "external query";
-  protected final static String ACTIVITY_FETCH = "fetch";
-  
-  // Activities list
-  protected static final String[] activitiesList = new String[]{ACTIVITY_EXTERNAL_QUERY, ACTIVITY_FETCH};
-
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
-
-  protected JDBCConnection connection = null;
-  protected String jdbcProvider = null;
-  protected String accessMethod = null;
-  protected String host = null;
-  protected String databaseName = null;
-  protected String rawDriverString = null;
-  protected String userName = null;
-  protected String password = null;
-
-  /** Constructor.
-  */
-  public JDBCConnector()
-  {
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (connection == null)
-    {
-      if (jdbcProvider == null || jdbcProvider.length() == 0)
-        throw new ManifoldCFException("Missing parameter '"+JDBCConstants.providerParameter+"'");
-      if ((host == null || host.length() == 0) && (rawDriverString == null || rawDriverString.length() == 0))
-        throw new ManifoldCFException("Missing parameter '"+JDBCConstants.hostParameter+"' or '"+JDBCConstants.driverStringParameter+"'");
-
-      connection = new JDBCConnection(jdbcProvider,(accessMethod==null || accessMethod.equals("name")),host,databaseName,rawDriverString,userName,password);
-    }
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** Model.  Depending on what people enter for the seeding query, this could be either ALL or
-  * could be less than that.  So, I've decided it will be at least the adds and changes, and
-  * won't include the deletes.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    return MODEL_ADD_CHANGE;
-  }
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    jdbcProvider = configParams.getParameter(JDBCConstants.providerParameter);
-    accessMethod = configParams.getParameter(JDBCConstants.methodParameter);
-    host = configParams.getParameter(JDBCConstants.hostParameter);
-    databaseName = configParams.getParameter(JDBCConstants.databaseNameParameter);
-    rawDriverString = configParams.getParameter(JDBCConstants.driverStringParameter);
-    userName= configParams.getParameter(JDBCConstants.databaseUserName);
-    password = configParams.getObfuscatedParameter(JDBCConstants.databasePassword);
-  }
-
-  /** Check status of connection.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      getSession();
-      // Attempt to fetch a connection; if this succeeds we pass
-      connection.testConnection();
-      return super.check();
-    }
-    catch (ServiceInterruption e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Service interruption in check(): "+e.getMessage(),e);
-      return "Transient error: "+e.getMessage();
-    }
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    connection = null;
-    host = null;
-    jdbcProvider = null;
-    accessMethod = null;
-    databaseName = null;
-    rawDriverString = null;
-    userName = null;
-    password = null;
-
-    super.disconnect();
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    return new String[]{(rawDriverString==null||rawDriverString.length()==0)?host:rawDriverString};
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else
-    {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-
-    getSession();
-
-    // Set up the query
-    TableSpec ts = new TableSpec(spec);
-
-    VariableMap vm = new VariableMap();
-    addConstant(vm,JDBCConstants.idReturnVariable,JDBCConstants.idReturnColumnName);
-    addVariable(vm,JDBCConstants.startTimeVariable,startTime);
-    addVariable(vm,JDBCConstants.endTimeVariable,seedTime);
-
-    // Do the substitution
-    ArrayList paramList = new ArrayList();
-    StringBuilder sb = new StringBuilder();
-    substituteQuery(ts.idQuery,vm,sb,paramList);
-
-    IDynamicResultSet idSet;
-
-    String queryText = sb.toString();
-    long startQueryTime = System.currentTimeMillis();
-    // Contract for IDynamicResultset indicates that if successfully obtained, it MUST
-    // be closed.
-    try
-    {
-      idSet = connection.executeUncachedQuery(queryText,paramList,-1);
-    }
-    catch (ServiceInterruption e)
-    {
-      // If failure, record the failure.
-      activities.recordActivity(new Long(startQueryTime), ACTIVITY_EXTERNAL_QUERY, null,
-        createQueryString(queryText,paramList), "ERROR", e.getMessage(), null);
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      // If failure, record the failure.
-      activities.recordActivity(new Long(startQueryTime), ACTIVITY_EXTERNAL_QUERY, null,
-        createQueryString(queryText,paramList), "ERROR", e.getMessage(), null);
-      throw e;
-    }
-
-    try
-    {
-      // If success, record that too.
-      activities.recordActivity(new Long(startQueryTime), ACTIVITY_EXTERNAL_QUERY, null,
-        createQueryString(queryText,paramList), "OK", null, null);
-
-      while (true)
-      {
-        IDynamicResultRow row = idSet.getNextRow();
-        if (row == null)
-          break;
-        try
-        {
-          Object o = row.getValue(JDBCConstants.idReturnColumnName);
-          if (o == null)
-            throw new ManifoldCFException("Bad seed query; doesn't return $(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. \"$(IDCOLUMN)\", or, for MySQL, select \"by label\" in your repository connection.");
-          String idValue = JDBCConnection.readAsString(o);
-          activities.addSeedDocument(idValue);
-        }
-        finally
-        {
-          row.close();
-        }
-      }
-    }
-    finally
-    {
-      idSet.close();
-    }
-    return new Long(seedTime).toString();
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    TableSpec ts = new TableSpec(spec);
-    
-    Set<String> acls = ts.getAcls();
-
-    String[] versionsReturned = new String[documentIdentifiers.length];
-
-    // If there is no version query, then always return empty string for all documents.
-    // This will mean that processDocuments will be called
-    // for all.  ProcessDocuments will then be responsible for doing document deletes itself,
-    // based on the query results.
-
-    Map<String,String> documentVersions = new HashMap<String,String>();
-    if (ts.versionQuery != null && ts.versionQuery.length() > 0)
-    {
-      // If there IS a versions query, do it.  First set up the variables, then do the substitution.
-      VariableMap vm = new VariableMap();
-      addConstant(vm,JDBCConstants.idReturnVariable,JDBCConstants.idReturnColumnName);
-      addConstant(vm,JDBCConstants.versionReturnVariable,JDBCConstants.versionReturnColumnName);
-      if (addIDList(vm,JDBCConstants.idListVariable,documentIdentifiers,null))
-      {
-        // Do the substitution
-        ArrayList paramList = new ArrayList();
-        StringBuilder sb = new StringBuilder();
-        substituteQuery(ts.versionQuery,vm,sb,paramList);
-
-        // Now, build a result return, and a hash table so we can correlate the returned values with the place to put them.
-        // We presume that if the row is missing, the document is gone.
-        // Fire off the query!
-        getSession();
-        IDynamicResultSet result;
-        String queryText = sb.toString();
-        long startTime = System.currentTimeMillis();
-        // Get a dynamic resultset.  Contract for dynamic resultset is that if
-        // one is returned, it MUST be closed, or a connection will leak.
-        try
-        {
-          result = connection.executeUncachedQuery(queryText,paramList,-1);
-        }
-        catch (ManifoldCFException e)
-        {
-          // If failure, record the failure.
-          if (e.getErrorCode() != ManifoldCFException.INTERRUPTED)
-            activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-              createQueryString(queryText,paramList), "ERROR", e.getMessage(), null);
-          throw e;
-        }
-        try
-        {
-          // If success, record that too.
-          activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-            createQueryString(queryText,paramList), "OK", null, null);
-          // Now, go through resultset
-          while (true)
-          {
-            IDynamicResultRow row = result.getNextRow();
-            if (row == null)
-              break;
-            try
-            {
-              Object o = row.getValue(JDBCConstants.idReturnColumnName);
-              if (o == null)
-                throw new ManifoldCFException("Bad version query; doesn't return $(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. \"$(IDCOLUMN)\", or, for MySQL, select \"by label\" in your repository connection.");
-              String idValue = JDBCConnection.readAsString(o);
-              o = row.getValue(JDBCConstants.versionReturnColumnName);
-              String versionValue;
-              // Null version is OK; make it a ""
-              if (o == null)
-                versionValue = "";
-              else
-                versionValue = JDBCConnection.readAsString(o);
-              documentVersions.put(idValue,versionValue);
-            }
-            finally
-            {
-              row.close();
-            }
-          }
-        }
-        finally
-        {
-          result.close();
-        }
-      }
-    }
-    else
-    {
-      for (String documentIdentifier : documentIdentifiers)
-      {
-        documentVersions.put(documentIdentifier,"");
-      }
-    }
-
-    // Delete the documents that had no version, and work only on ones that did
-    final Set<String> fetchDocuments = documentVersions.keySet();
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      String documentVersion = documentVersions.get(documentIdentifier);
-      if (documentVersion == null)
-      {
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-    }
-
-    // Pick up document acls
-    Map<String,Set<String>> documentAcls = new HashMap<String,Set<String>>();
-    if (ts.securityOn)
-    {
-      if (acls.size() == 0 && ts.aclQuery != null && ts.aclQuery.length() > 0)
-      {
-        // If there IS an acls query, do it.  First set up the variables, then do the substitution.
-        VariableMap vm = new VariableMap();
-        addConstant(vm,JDBCConstants.idReturnVariable,JDBCConstants.idReturnColumnName);
-        addConstant(vm,JDBCConstants.tokenReturnVariable,JDBCConstants.tokenReturnColumnName);
-        if (addIDList(vm,JDBCConstants.idListVariable,documentIdentifiers,fetchDocuments))
-        {
-          // Do the substitution
-          ArrayList paramList = new ArrayList();
-          StringBuilder sb = new StringBuilder();
-          substituteQuery(ts.aclQuery,vm,sb,paramList);
-
-          // Fire off the query!
-          getSession();
-          IDynamicResultSet result;
-          String queryText = sb.toString();
-          long startTime = System.currentTimeMillis();
-          // Get a dynamic resultset.  Contract for dynamic resultset is that if
-          // one is returned, it MUST be closed, or a connection will leak.
-          try
-          {
-            result = connection.executeUncachedQuery(queryText,paramList,-1);
-          }
-          catch (ManifoldCFException e)
-          {
-            // If failure, record the failure.
-            if (e.getErrorCode() != ManifoldCFException.INTERRUPTED)
-              activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-                createQueryString(queryText,paramList), "ERROR", e.getMessage(), null);
-            throw e;
-          }
-          try
-          {
-            // If success, record that too.
-            activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-              createQueryString(queryText,paramList), "OK", null, null);
-            // Now, go through resultset
-            while (true)
-            {
-              IDynamicResultRow row = result.getNextRow();
-              if (row == null)
-                break;
-              try
-              {
-                Object o = row.getValue(JDBCConstants.idReturnColumnName);
-                if (o == null)
-                  throw new ManifoldCFException("Bad acl query; doesn't return $(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. \"$(IDCOLUMN)\", or, for MySQL, select \"by label\" in your repository connection.");
-                String idValue = JDBCConnection.readAsString(o);
-                o = row.getValue(JDBCConstants.tokenReturnColumnName);
-                String tokenValue;
-                if (o == null)
-                  tokenValue = "";
-                else
-                  tokenValue = JDBCConnection.readAsString(o);
-                // Versions that are "", when processed, will have their acls fetched at that time...
-                Set<String> dcs = documentAcls.get(idValue);
-                if (dcs == null)
-                {
-                  dcs = new HashSet<String>();
-                  documentAcls.put(idValue,dcs);
-                }
-                dcs.add(tokenValue);
-              }
-              finally
-              {
-                row.close();
-              }
-            }
-          }
-          finally
-          {
-            result.close();
-          }
-        }
-      }
-      else
-      {
-        for (String documentIdentifier : fetchDocuments)
-        {
-          documentAcls.put(documentIdentifier,acls);
-        }
-      }
-    }
-    
-    // Map from identifier to version string
-    final Map<String,String> map = new HashMap<>();
-    // This is the set of documents actually seen
-    final Set<String> seenDocuments = new HashSet<>();
-    
-    for (String documentIdentifier : fetchDocuments)
-    {
-      String documentVersion = documentVersions.get(documentIdentifier);
-      if (documentVersion.length() == 0)
-      {
-        map.put(documentIdentifier,documentVersion);
-      }
-      else
-      {
-        // Compute a full version string
-        StringBuilder sb = new StringBuilder();
-        Set<String> dAcls = documentAcls.get(documentIdentifier);
-        if (dAcls == null)
-          sb.append('-');
-        else
-        {
-          sb.append('+');
-          String[] aclValues = new String[dAcls.size()];
-          int k = 0;
-          for (String acl : dAcls)
-          {
-            aclValues[k++] = acl;
-          }
-          java.util.Arrays.sort(aclValues);
-          packList(sb,aclValues,'+');
-        }
-
-        sb.append(documentVersion).append("=").append(ts.dataQuery);
-        String versionValue = sb.toString();
-
-        if (activities.checkDocumentNeedsReindexing(documentIdentifier,versionValue))
-        {
-          map.put(documentIdentifier,versionValue);
-        }
-      }
-    }
-    
-    // We have a primary query and a number of attribute queries to execute.
-    // We execute the attribute queries first because those do not include binary data.
-    final Map<String, Map<String, Set<String>>> attributeValues = new HashMap<String, Map<String, Set<String>>>();
-    int index = 0;
-    while (index < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(index++);
-      if (sn.getType().equals(JDBCConstants.attributeQueryNode))
-      {
-        final String attributeName = sn.getAttributeValue(JDBCConstants.attributeName);
-        final String attributeQuery = sn.getValue();
-        // Fire off attribute query
-        VariableMap attrVm = new VariableMap();
-        addConstant(attrVm,JDBCConstants.idReturnVariable,JDBCConstants.idReturnColumnName);
-        addConstant(attrVm,JDBCConstants.dataReturnVariable,JDBCConstants.dataReturnColumnName);
-        if (!addIDList(attrVm,JDBCConstants.idListVariable,documentIdentifiers,map.keySet()))
-          continue;
-        
-        // Do the substitution
-        ArrayList paramList = new ArrayList();
-        StringBuilder sb = new StringBuilder();
-        substituteQuery(attributeQuery,attrVm,sb,paramList);
-
-        // Fire off the query!
-        getSession();
-        IDynamicResultSet result;
-        String queryText = sb.toString();
-        long startTime = System.currentTimeMillis();
-        // Get a dynamic resultset.  Contract for dynamic resultset is that if
-        // one is returned, it MUST be closed, or a connection will leak.
-        try
-        {
-          result = connection.executeUncachedQuery(queryText,paramList,-1);
-        }
-        catch (ManifoldCFException e)
-        {
-          // If failure, record the failure.
-          if (e.getErrorCode() != ManifoldCFException.INTERRUPTED)
-            activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-              createQueryString(queryText,paramList), "ERROR", e.getMessage(), null);
-          throw e;
-        }
-        try
-        {
-          // If success, record that too.
-          activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-            createQueryString(queryText,paramList), "OK", null, null);
-          // Now, go through resultset
-          while (true)
-          {
-            IDynamicResultRow row = result.getNextRow();
-            if (row == null)
-              break;
-            try
-            {
-              Object o = row.getValue(JDBCConstants.idReturnColumnName);
-              if (o == null)
-                throw new ManifoldCFException("Bad attribute query; doesn't return $(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. \"$(IDCOLUMN)\", or, for MySQL, select \"by label\" in your repository connection.");
-              String idValue = JDBCConnection.readAsString(o);
-              o = row.getValue(JDBCConstants.dataReturnColumnName);
-              String dataValue;
-              if (o == null)
-                dataValue = "";
-              else
-                dataValue = JDBCConnection.readAsString(o);
-              Map<String, Set<String>> avs = attributeValues.get(idValue);
-              if (avs == null)
-              {
-                avs = new HashMap<String, Set<String>>();
-                attributeValues.put(idValue,avs);
-              }
-              Set<String> dataValues = avs.get(attributeName);
-              if (dataValues == null)
-              {
-                dataValues = new HashSet<String>();
-                avs.put(attributeName, dataValues);
-              }
-              dataValues.add(dataValue);
-            }
-            finally
-            {
-              row.close();
-            }
-          }
-        }
-        finally
-        {
-          result.close();
-        }
-      }
-    }
-    
-    // For all the documents not marked "scan only", form a query and pick up the contents.
-    // If the contents is not found, then explicitly call the delete action method.
-    VariableMap vm = new VariableMap();
-    addConstant(vm,JDBCConstants.idReturnVariable,JDBCConstants.idReturnColumnName);
-    addConstant(vm,JDBCConstants.urlReturnVariable,JDBCConstants.urlReturnColumnName);
-    addConstant(vm,JDBCConstants.dataReturnVariable,JDBCConstants.dataReturnColumnName);
-    addConstant(vm,JDBCConstants.contentTypeReturnVariable,JDBCConstants.contentTypeReturnColumnName);
-    if (!addIDList(vm,JDBCConstants.idListVariable,documentIdentifiers,map.keySet()))
-      return;
-
-    // Do the substitution
-    ArrayList paramList = new ArrayList();
-    StringBuilder sb = new StringBuilder();
-    substituteQuery(ts.dataQuery,vm,sb,paramList);
-
-    // Execute the query
-    getSession();
-    IDynamicResultSet result;
-    String queryText = sb.toString();
-    long startTime = System.currentTimeMillis();
-    // Get a dynamic resultset.  Contract for dynamic resultset is that if
-    // one is returned, it MUST be closed, or a connection will leak.
-    try
-    {
-      result = connection.executeUncachedQuery(queryText,paramList,-1);
-    }
-    catch (ManifoldCFException e)
-    {
-      // If failure, record the failure.
-      activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-        createQueryString(queryText,paramList), "ERROR", e.getMessage(), null);
-      throw e;
-    }
-    try
-    {
-      // If success, record that too.
-      activities.recordActivity(new Long(startTime), ACTIVITY_EXTERNAL_QUERY, null,
-        createQueryString(queryText,paramList), "OK", null, null);
-
-      while (true)
-      {
-        IDynamicResultRow row = result.getNextRow();
-        if (row == null)
-          break;
-        try
-        {
-          Object o = row.getValue(JDBCConstants.idReturnColumnName);
-          if (o == null)
-            throw new ManifoldCFException("Bad document query; doesn't return $(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. \"$(IDCOLUMN)\", or, for MySQL, select \"by label\" in your repository connection.");
-          final String id = JDBCConnection.readAsString(o);
-          seenDocuments.add(id);
-          
-          String errorCode = null;
-          String errorDesc = null;
-          Long fileLengthLong = null;
-          long fetchStartTime = System.currentTimeMillis();
-          
-          try
-          {
-            String version = map.get(id);
-            if (version == null)
-              // Does not need refetching
-              continue;
-
-            // This document was marked as "not scan only", so we expect to find it.
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("JDBC: Document data result found for '"+id+"'");
-            o = row.getValue(JDBCConstants.urlReturnColumnName);
-            if (o == null)
-            {
-              Logging.connectors.debug("JDBC: Document '"+id+"' has a null url - skipping");
-              errorCode = activities.NULL_URL;
-              errorDesc = "Excluded because document had a null URL";
-              activities.noDocument(id,version);
-              continue;
-            }
-            
-            // This is not right - url can apparently be a BinaryInput
-            String url = JDBCConnection.readAsString(o);
-            boolean validURL;
-            try
-            {
-              // Check to be sure url is valid
-              new java.net.URI(url);
-              validURL = true;
-            }
-            catch (java.net.URISyntaxException e)
-            {
-              validURL = false;
-            }
-
-            if (!validURL)
-            {
-              Logging.connectors.debug("JDBC: Document '"+id+"' has an illegal url: '"+url+"' - skipping");
-              errorCode = activities.BAD_URL;
-              errorDesc = "Excluded because document had illegal URL ('"+url+"')";
-              activities.noDocument(id,version);
-              continue;
-            }
-            
-            // Process the document itself
-            Object contents = row.getValue(JDBCConstants.dataReturnColumnName);
-            // Null data is allowed; we just ignore these
-            if (contents == null)
-            {
-              Logging.connectors.debug("JDBC: Document '"+id+"' seems to have null data - skipping");
-              errorCode = "NULLDATA";
-              errorDesc = "Excluded because document had null data";
-              activities.noDocument(id,version);
-              continue;
-            }
-            
-            // We will ingest something, so remove this id from the map in order that we know what we still
-            // need to delete when all done.
-            map.remove(id);
-            String contentType;
-            o = row.getValue(JDBCConstants.contentTypeReturnColumnName);
-            if (o != null)
-              contentType = JDBCConnection.readAsString(o);
-            else
-            {
-              if (contents instanceof BinaryInput)
-                contentType = "application/octet-stream";
-              else if (contents instanceof CharacterInput)
-                contentType = "text/plain; charset=utf-8";
-              else
-                contentType = "text/plain";
-            }
-                    
-            if (!activities.checkMimeTypeIndexable(contentType))
-            {
-              Logging.connectors.debug("JDBC: Document '"+id+"' excluded because of mime type - skipping");
-              errorCode = activities.EXCLUDED_MIMETYPE;
-              errorDesc = "Excluded because of mime type ("+contentType+")";
-              activities.noDocument(id,version);
-              continue;
-            }
-                    
-            if (!activities.checkURLIndexable(url))
-            {
-              Logging.connectors.debug("JDBC: Document '"+id+"' excluded because of url - skipping");
-              errorCode = activities.EXCLUDED_URL;
-              errorDesc = "Excluded because of URL ('"+url+"')";
-              activities.noDocument(id,version);
-              continue;
-            }
-
-            // An ingestion will take place for this document.
-            RepositoryDocument rd = new RepositoryDocument();
-            rd.setMimeType(contentType);
-
-            applyMultiAttributeValues(rd,attributeValues.get(id));
-            applyAccessTokens(rd,documentAcls.get(id));
-            applyMetadata(rd,row);
-
-            if (contents instanceof BinaryInput)
-            {
-
-              BinaryInput bi = (BinaryInput)contents;
-              long fileLength = bi.getLength();
-                      
-              if (!activities.checkLengthIndexable(fileLength))
-              {
-                Logging.connectors.debug("JDBC: Document '"+id+"' excluded because of length - skipping");
-                errorCode = activities.EXCLUDED_LENGTH;
-                errorDesc = "Excluded because of length ("+fileLength+")";
-                activities.noDocument(id, version);
-                continue;
-              }
-
-              try
-              {
-                // Read the stream
-                InputStream is = bi.getStream();
-                try
-                {
-                  rd.setBinary(is,fileLength);
-                  activities.ingestDocumentWithException(id, version, url, rd);
-                  errorCode = "OK";
-                  fileLengthLong = new Long(fileLength);
-                }
-                finally
-                {
-                  is.close();
-                }
-              }
-              catch (IOException e)
-              {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(id,e);
-              }
-            }
-            else if (contents instanceof CharacterInput)
-            {
-              CharacterInput ci = (CharacterInput)contents;
-              long fileLength = ci.getUtf8StreamLength();
-              
-              if (!activities.checkLengthIndexable(fileLength))
-              {
-                Logging.connectors.debug("JDBC: Document '"+id+"' excluded because of length - skipping");
-                errorCode = activities.EXCLUDED_LENGTH;
-                errorDesc = "Excluded because of length ("+fileLength+")";
-                activities.noDocument(id, version);
-                continue;
-              }
-                      
-              try
-              {
-                // Read the stream
-                InputStream is = ci.getUtf8Stream();
-                try
-                {
-                  rd.setBinary(is,fileLength);
-                  activities.ingestDocumentWithException(id, version, url, rd);
-                  errorCode = "OK";
-                  fileLengthLong = new Long(fileLength);
-                }
-                finally
-                {
-                  is.close();
-                }
-              }
-              catch (IOException e)
-              {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(id,e);
-              }
-            }
-            else
-            {
-              // Turn it into a string, and then into a stream
-              String value = contents.toString();
-              byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
-              long fileLength = bytes.length;
-              
-              if (!activities.checkLengthIndexable(fileLength))
-              {
-                Logging.connectors.debug("JDBC: Document '"+id+"' excluded because of length - skipping");
-                errorCode = activities.EXCLUDED_LENGTH;
-                errorDesc = "Excluded because of length ("+fileLength+")";
-                activities.noDocument(id, version);
-                continue;
-              }
-
-              try
-              {
-                InputStream is = new ByteArrayInputStream(bytes);
-                try
-                {
-                  rd.setBinary(is,fileLength);
-                  activities.ingestDocumentWithException(id, version, url, rd);
-                  errorCode = "OK";
-                  fileLengthLong = new Long(fileLength);
-                }
-                finally
-                {
-                  is.close();
-                }
-              }
-              catch (IOException e)
-              {
-                errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                errorDesc = e.getMessage();
-                handleIOException(id,e);
-              }
-            }
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              errorCode = null;
-            throw e;
-          }
-          finally
-          {
-            if (errorCode != null)
-              activities.recordActivity(new Long(fetchStartTime), ACTIVITY_FETCH,
-                fileLengthLong, id, errorCode, errorDesc, null);
-          }
-        }
-        finally
-        {
-          row.close();
-        }
-      }
-
-    }
-    finally
-    {
-      result.close();
-    }
-    
-    // Now, go through the original id's, and see which ones are still in the map.  These
-    // did not appear in the result and are presumed to be gone from the database, and thus must be deleted.
-    for (final String documentIdentifier : fetchDocuments)
-    {
-      if (!seenDocuments.contains(documentIdentifier))
-      {
-        // Never saw it in the fetch attempt
-        activities.deleteDocument(documentIdentifier);
-      }
-      else
-      {
-        // Saw it in the fetch attempt, and we might have fetched it
-        final String documentVersion = map.get(documentIdentifier);
-        if (documentVersion != null)
-        {
-          // This means we did not see it (or data for it) in the result set.  Delete it!
-          activities.noDocument(documentIdentifier,documentVersion);
-          activities.recordActivity(null, ACTIVITY_FETCH,
-            null, documentIdentifier, "NOTFETCHED", "Document was not seen by processing query", null);
-        }
-      }
-    }
-
-  }
-  
-  protected static void handleIOException(String id, IOException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      throw new ManifoldCFException("Socket timeout reading database data: "+e.getMessage(),e);
-    }
-    if (e instanceof InterruptedIOException)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    throw new ManifoldCFException("Error reading database data: "+e.getMessage(),e);
-  }
-  
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"JDBCConnector.DatabaseType"));
-    tabsArray.add(Messages.getString(locale,"JDBCConnector.Server"));
-    tabsArray.add(Messages.getString(locale,"JDBCConnector.Credentials"));
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.databasehost.value == \"\" && editconnection.rawjdbcstring.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.PleaseFillInADatabaseServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.Server") + "\");\n"+
-"    editconnection.databasehost.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.databasename.value == \"\" && editconnection.rawjdbcstring.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.PleaseFillInTheNameOfTheDatabase") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.Server") + "\");\n"+
-"    editconnection.databasename.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.username.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.PleaseSupplyTheDatabaseUsernameForThisConnection") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.Credentials") + "\");\n"+
-"    editconnection.username.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String jdbcProvider = parameters.getParameter(JDBCConstants.providerParameter);
-    if (jdbcProvider == null)
-      jdbcProvider = "oracle:thin:@";
-    String accessMethod = parameters.getParameter(JDBCConstants.methodParameter);
-    if (accessMethod == null)
-      accessMethod = "name";
-    String host = parameters.getParameter(JDBCConstants.hostParameter);
-    if (host == null)
-      host = "localhost";
-    String databaseName = parameters.getParameter(JDBCConstants.databaseNameParameter);
-    if (databaseName == null)
-      databaseName = "database";
-    String rawJDBCString = parameters.getParameter(JDBCConstants.driverStringParameter);
-    if (rawJDBCString == null)
-      rawJDBCString = "";
-    String databaseUser = parameters.getParameter(JDBCConstants.databaseUserName);
-    if (databaseUser == null)
-      databaseUser = "";
-    String databasePassword = parameters.getObfuscatedParameter(JDBCConstants.databasePassword);
-    if (databasePassword == null)
-      databasePassword = "";
-    else
-      databasePassword = out.mapPasswordToKey(databasePassword);
-
-    // "Database Type" tab
-    if (tabName.equals(Messages.getString(locale,"JDBCConnector.DatabaseType")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.DatabaseType2") + "</nobr></td><td class=\"value\">\n"+
-"      <select multiple=\"false\" name=\"databasetype\" size=\"2\">\n"+
-"        <option value=\"oracle:thin:@\" "+(jdbcProvider.equals("oracle:thin:@")?"selected=\"selected\"":"")+">Oracle</option>\n"+
-"        <option value=\"postgresql://\" "+(jdbcProvider.equals("postgresql:")?"selected=\"selected\"":"")+">Postgres SQL</option>\n"+
-"        <option value=\"jtds:sqlserver://\" "+(jdbcProvider.equals("jtds:sqlserver:")?"selected=\"selected\"":"")+">MS SQL Server (&gt; V6.5)</option>\n"+
-"        <option value=\"jtds:sybase://\" "+(jdbcProvider.equals("jtds:sybase:")?"selected=\"selected\"":"")+">Sybase (&gt;= V10)</option>\n"+
-"        <option value=\"mysql://\" "+(jdbcProvider.equals("mysql:")?"selected=\"selected\"":"")+">MySQL (&gt;= V5)</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AccessMethod") + "</nobr></td><td class=\"value\">\n"+
-"      <select multiple=\"false\" name=\"accessmethod\" size=\"2\">\n"+
-"        <option value=\"name\" "+(accessMethod.equals("name")?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"JDBCConnector.ByName")+"</option>\n"+
-"        <option value=\"label\" "+(accessMethod.equals("label")?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"JDBCConnector.ByLabel")+"</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"databasetype\" value=\""+jdbcProvider+"\"/>\n"+
-"<input type=\"hidden\" name=\"accessmethod\" value=\""+accessMethod+"\"/>\n"
-      );
-    }
-
-    // "Server" tab
-    if (tabName.equals(Messages.getString(locale,"JDBCConnector.Server")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.DatabaseHostAndPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"databasehost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(host)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.DatabaseServiceNameOrInstanceDatabase") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"databasename\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databaseName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.RawDatabaseConnectString") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"80\" name=\"rawjdbcstring\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rawJDBCString)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"databasehost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(host)+"\"/>\n"+
-"<input type=\"hidden\" name=\"databasename\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databaseName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rawjdbcstring\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rawJDBCString)+"\"/>\n"
-      );
-    }
-
-    // "Credentials" tab
-    if (tabName.equals(Messages.getString(locale,"JDBCConnector.Credentials")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.UserName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"username\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databaseUser)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.Password") + "</nobr></td><td class=\"value\"><input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databasePassword)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"username\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databaseUser)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(databasePassword)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String type = variableContext.getParameter("databasetype");
-    if (type != null)
-      parameters.setParameter(JDBCConstants.providerParameter,type);
-
-    String accessMethod = variableContext.getParameter("accessmethod");
-    if (accessMethod != null)
-      parameters.setParameter(JDBCConstants.methodParameter,accessMethod);
-
-    String host = variableContext.getParameter("databasehost");
-    if (host != null)
-      parameters.setParameter(JDBCConstants.hostParameter,host);
-
-    String databaseName = variableContext.getParameter("databasename");
-    if (databaseName != null)
-      parameters.setParameter(JDBCConstants.databaseNameParameter,databaseName);
-
-    String rawJDBCString = variableContext.getParameter("rawjdbcstring");
-    if (rawJDBCString != null)
-      parameters.setParameter(JDBCConstants.driverStringParameter,rawJDBCString);
-
-    String userName = variableContext.getParameter("username");
-    if (userName != null)
-      parameters.setParameter(JDBCConstants.databaseUserName,userName);
-
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(JDBCConstants.databasePassword,variableContext.mapKeyToPassword(password));
-    
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" certificate(s)&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"JDBCConnector.Queries"));
-    tabsArray.add(Messages.getString(locale,"JDBCConnector.Security"));
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"DeleteAttr(index)\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"attr_\"+index+\"_op\", \"Delete\", \""+seqPrefix+"attr_\" + index);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"AddAttr(index)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"attr_name.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.TypeInAnAttributeName") + "\");\n"+
-"    editjob."+seqPrefix+"attr_name.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"attr_query.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.AttributeQueryCannotBeNull") + "\");\n"+
-"    editjob."+seqPrefix+"attr_query.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"attr_query.value.indexOf(\"$(IDCOLUMN)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnIDCOLUMNInTheResult") + "\");\n"+
-"    editjob."+seqPrefix+"attr_query.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"attr_query.value.indexOf(\"$(DATACOLUMN)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnDATACOLUMNInTheResult") + "\");\n"+
-"    editjob."+seqPrefix+"attr_query.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"attr_query.value.indexOf(\"$(IDLIST)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustUseIDLISTInWHEREClause") + "\");\n"+
-"    editjob."+seqPrefix+"attr_query.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"attr_op\", \"Add\", \""+seqPrefix+"attr_\"+(index+1));\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.TypeInAnAccessToken") + "\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"checkSpecification()\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"idquery.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.EnterASeedingQuery") + "\");\n"+
-"    editjob."+seqPrefix+"idquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"idquery.value.indexOf(\"$(IDCOLUMN)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnIDCOLUMNInTheResult") + "\");\n"+
-"    editjob."+seqPrefix+"idquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"versionquery.value != \"\")\n"+
-"  {\n"+
-"    if (editjob."+seqPrefix+"versionquery.value.indexOf(\"$(IDCOLUMN)\") == -1)\n"+
-"    {\n"+
-"      alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnIDCOLUMNInTheResult") + "\");\n"+
-"      editjob."+seqPrefix+"versionquery.focus();\n"+
-"      return false;\n"+
-"    }\n"+
-"    if (editjob."+seqPrefix+"versionquery.value.indexOf(\"$(VERSIONCOLUMN)\") == -1)\n"+
-"    {\n"+
-"      alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnVERSIONCOLUMNInTheResult") + "\");\n"+
-"      editjob."+seqPrefix+"versionquery.focus();\n"+
-"      return false;\n"+
-"    }\n"+
-"    if (editjob."+seqPrefix+"versionquery.value.indexOf(\"$(IDLIST)\") == -1)\n"+
-"    {\n"+
-"      alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustUseIDLISTInWHEREClause") + "\");\n"+
-"      editjob."+seqPrefix+"versionquery.focus();\n"+
-"      return false;\n"+
-"    }\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"aclquery.value != \"\")\n"+
-"  {\n"+
-"    if (editjob."+seqPrefix+"aclquery.value.indexOf(\"$(IDCOLUMN)\") == -1)\n"+
-"    {\n"+
-"      alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnIDCOLUMNInTheResult") + "\");\n"+
-"      editjob."+seqPrefix+"aclquery.focus();\n"+
-"      return false;\n"+
-"    }\n"+
-"    if (editjob."+seqPrefix+"aclquery.value.indexOf(\"$(TOKENCOLUMN)\") == -1)\n"+
-"    {\n"+
-"      alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnTOKENCOLUMNInTheResult") + "\");\n"+
-"      editjob."+seqPrefix+"aclquery.focus();\n"+
-"      return false;\n"+
-"    }\n"+
-"    if (editjob."+seqPrefix+"aclquery.value.indexOf(\"$(IDLIST)\") == -1)\n"+
-"    {\n"+
-"      alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustUseIDLISTInWHEREClause") + "\");\n"+
-"      editjob."+seqPrefix+"aclquery.focus();\n"+
-"      return false;\n"+
-"    }\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"dataquery.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.EnterADataQuery") + "\");\n"+
-"    editjob."+seqPrefix+"dataquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"dataquery.value.indexOf(\"$(IDCOLUMN)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnIDCOLUMNInTheResult2") + "\");\n"+
-"    editjob."+seqPrefix+"dataquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"dataquery.value.indexOf(\"$(URLCOLUMN)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnURLCOLUMNInTheResult") + "\");\n"+
-"    editjob."+seqPrefix+"dataquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"dataquery.value.indexOf(\"$(DATACOLUMN)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustReturnDATACOLUMNInTheResult") + "\");\n"+
-"    editjob."+seqPrefix+"dataquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"dataquery.value.indexOf(\"$(IDLIST)\") == -1)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"JDBCConnector.MustUseIDLISTInWHEREClause") + "\");\n"+
-"    editjob."+seqPrefix+"dataquery.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String idQuery = "SELECT idfield AS $(IDCOLUMN) FROM documenttable WHERE modifydatefield > $(STARTTIME) AND modifydatefield <= $(ENDTIME)";
-    String versionQuery = "SELECT idfield AS $(IDCOLUMN), versionfield AS $(VERSIONCOLUMN) FROM documenttable WHERE idfield IN $(IDLIST)";
-    String dataQuery = "SELECT idfield AS $(IDCOLUMN), urlfield AS $(URLCOLUMN), datafield AS $(DATACOLUMN) FROM documenttable WHERE idfield IN $(IDLIST)";
-    String aclQuery = "SELECT docidfield AS $(IDCOLUMN), aclfield AS $(TOKENCOLUMN) FROM acltable WHERE docidfield IN $(IDLIST)";
-    
-    final Map<String, String> attributeQueryMap = new HashMap<String, String>();
-    int i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(JDBCConstants.idQueryNode))
-      {
-        idQuery = sn.getValue();
-        if (idQuery == null)
-          idQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.versionQueryNode))
-      {
-        versionQuery = sn.getValue();
-        if (versionQuery == null)
-          versionQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.dataQueryNode))
-      {
-        dataQuery = sn.getValue();
-        if (dataQuery == null)
-          dataQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.aclQueryNode))
-      {
-        aclQuery = sn.getValue();
-        if (aclQuery == null)
-          aclQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.attributeQueryNode))
-      {
-        String attributeName = sn.getAttributeValue(JDBCConstants.attributeName);
-        String attributeQuery = sn.getValue();
-        attributeQueryMap.put(attributeName, attributeQuery);
-      }
-    }
-
-    // Sort the attribute query list
-    final String[] attributeNames = attributeQueryMap.keySet().toArray(new String[0]);
-    java.util.Arrays.sort(attributeNames);
-    
-    // The Queries tab
-
-    if (tabName.equals(Messages.getString(locale,"JDBCConnector.Queries")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.SeedingQuery") + "</nobr><br/><nobr>" + Messages.getBodyString(locale,"JDBCConnector.returnIdsThatNeedToBeChecked") + "</nobr></td>\n"+
-"    <td class=\"value\"><textarea name=\""+seqPrefix+"idquery\" cols=\"64\" rows=\"6\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(idQuery)+"</textarea></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.VersionCheckQuery") + "</nobr><br/><nobr>" + Messages.getBodyString(locale,"JDBCConnector.returnIdsAndVersionsForASetOfDocuments") + "</nobr><br/><nobr>" + Messages.getBodyString(locale,"JDBCConnector.leaveBlankIfNoVersioningCapability") + "</nobr></td>\n"+
-"    <td class=\"value\"><textarea name=\""+seqPrefix+"versionquery\" cols=\"64\" rows=\"6\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(versionQuery)+"</textarea></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AccessTokenQuery") + "</nobr><br/><nobr>" + Messages.getBodyString(locale,"JDBCConnector.returnIdsAndAccessTokensForASetOfDocuments") + "</nobr><br/><nobr>" + Messages.getBodyString(locale,"JDBCConnector.leaveBlankIfNoSecurityCapability") + "</nobr></td>\n"+
-"    <td class=\"value\"><textarea name=\""+seqPrefix+"aclquery\" cols=\"64\" rows=\"6\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(aclQuery)+"</textarea></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.DataQuery") + "</nobr><br/><nobr>" + Messages.getBodyString(locale,"JDBCConnector.returnIdsUrlsAndDataForASetOfDocuments") + "</nobr></td>\n"+
-"    <td class=\"value\"><textarea name=\""+seqPrefix+"dataquery\" cols=\"64\" rows=\"6\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(dataQuery)+"</textarea></td>\n"+
-"  </tr>\n");
-      out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AttributeQueries") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AttributeName") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AttributeQuery") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      int attributeIndex = 0;
-      for (final String attributeName : attributeNames) {
-        final String attributeQuery = attributeQueryMap.get(attributeName);
-        if (attributeIndex % 2 == 0)
-        {
-          out.print(
-"        <tr class=\"evenformrow\">\n"
-          );
-        }
-        else 
-        {
-          out.print(
-"        <tr class=\"oddformrow\">\n"
-          );
-        }
-        // Delete button
-        out.print(
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+seqPrefix+"attr_"+attributeIndex+"\">\n"+
-"              <nobr>\n"+
-"                <input type=\"button\" value=\""+Messages.getAttributeString(locale,"JDBCConnector.Delete")+"\"\n"+
-"                alt=\""+Messages.getAttributeString(locale,"JDBCConnector.DeleteAttributeQueryNumber")+attributeIndex+"\" onclick=\"javascript:"+seqPrefix+"DeleteAttr("+attributeIndex+");\"/>\n"+
-"              </nobr>\n"+
-"            </a>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"attr_"+attributeIndex+"_op"+"\" value=\"Continue\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"attr_"+attributeIndex+"_name\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(attributeName)+"\"/>\n"+
-"          </td>\n"
-        );
-        // Attribute name
-        out.print(
-"          <td class=\"formcolumncell\">\n"+
-"            "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(attributeName)+"\n"+
-"          </td>\n"
-        );
-        // Query
-        out.print(
-"          <td class=\"formcolumncell\">\n"+
-"            <textarea name=\""+seqPrefix+"attr_"+attributeIndex+"_query\" cols=\"64\" rows=\"6\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(attributeQuery)+"</textarea>\n"+
-"          </td>\n"
-        );
-        out.print(
-"        </tr>\n"
-        );
-        attributeIndex++;
-      }
-      if (attributeIndex == 0)
-      {
-        out.print(
-"        <tr><td class=\"formmessage\" colspan=\"3\">"+Messages.getBodyString(locale,"JDBCConnector.NoAttributeQueries")+"</td></tr>\n"
-        );
-      }
-      // Add button
-      out.print(
-"        <tr><td class=\"formseparator\" colspan=\"3\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+seqPrefix+"attr_"+attributeIndex+"\">\n"+
-"              <input type=\"button\" value=\""+Messages.getAttributeString(locale,"JDBCConnector.Add")+"\"\n"+
-"              alt=\""+Messages.getAttributeString(locale,"JDBCConnector.AddAttribute")+"\" onclick=\"javascript:"+seqPrefix+"AddAttr("+attributeIndex+");\"/>\n"+
-"            </a>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"attr_count\" value=\""+attributeIndex+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"attr_op\" value=\"Continue\"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\"><nobr><input name=\""+seqPrefix+"attr_name\" type=\"text\" size=\"16\" value=\"\"/></nobr></td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <textarea name=\""+seqPrefix+"attr_query\" cols=\"64\" rows=\"6\">SELECT idfield AS $(IDCOLUMN), datafield AS $(DATACOLUMN) FROM attributetable WHERE idfield IN $(IDLIST)</textarea>\n"+
-"          </td>\n"+
-"        </tr>\n"
-      );
-      out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"idquery\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(idQuery)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"versionquery\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(versionQuery)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"aclquery\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(aclQuery)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"dataquery\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dataQuery)+"\"/>\n"
-      );
-      int attributeIndex = 0;
-      for (final String attributeName : attributeNames) {
-        final String attributeQuery = attributeQueryMap.get(attributeName);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"attr_"+attributeIndex+"_name\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(attributeName)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"attr_"+attributeIndex+"_query\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(attributeQuery)+"\"/>\n"
-        );
-        attributeIndex++;
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"attr_count\" value=\""+attributeIndex+"\"/>\n"
-      );
-    }
-	
-    // Security tab
-    // There is no native security, so all we care about are the tokens.
-    i = 0;
-    boolean securityOn = true;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"JDBCConnector.Security")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"JDBCConnector.SecurityColon")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"on\" "+(securityOn?"checked=\"true\"":"")+" />"+Messages.getBodyString(locale,"JDBCConnector.Enabled")+"\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"off\" "+((securityOn==false)?"checked=\"true\"":"")+" />"+Messages.getBodyString(locale,"JDBCConnector.Disabled")+"\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Go through forced ACL
-      i = 0;
-      int k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String accessOpName = seqPrefix+"accessop"+accessDescription;
-          String token = sn.getAttributeValue("token");
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")' alt=\"" + Messages.getAttributeString(locale,"JDBCConnector.DeleteToken") + "\""+Integer.toString(k)+"\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"JDBCConnector.NoAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Add\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"JDBCConnector.AddAccessToken") + "\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specsecurity\" value=\""+(securityOn?"on":"off")+"\"/>\n"
-      );
-      // Finally, go through forced ACL
-      i = 0;
-      int k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String token = sn.getAttributeValue("token");
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String idQuery = variableContext.getParameter(seqPrefix+"idquery");
-    String versionQuery = variableContext.getParameter(seqPrefix+"versionquery");
-    String dataQuery = variableContext.getParameter(seqPrefix+"dataquery");
-    String aclQuery = variableContext.getParameter(seqPrefix+"aclquery");
-    
-    SpecificationNode sn;
-    if (idQuery != null)
-    {
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        if (ds.getChild(i).getType().equals(JDBCConstants.idQueryNode))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      sn = new SpecificationNode(JDBCConstants.idQueryNode);
-      sn.setValue(idQuery);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-    if (versionQuery != null)
-    {
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        if (ds.getChild(i).getType().equals(JDBCConstants.versionQueryNode))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      sn = new SpecificationNode(JDBCConstants.versionQueryNode);
-      sn.setValue(versionQuery);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-    if (aclQuery != null)
-    {
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        if (ds.getChild(i).getType().equals(JDBCConstants.aclQueryNode))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      sn = new SpecificationNode(JDBCConstants.aclQueryNode);
-      sn.setValue(aclQuery);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-    if (dataQuery != null)
-    {
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        if (ds.getChild(i).getType().equals(JDBCConstants.dataQueryNode))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      sn = new SpecificationNode(JDBCConstants.dataQueryNode);
-      sn.setValue(dataQuery);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-
-    String xc;
-    xc = variableContext.getParameter(seqPrefix+"attr_count");
-    if (xc != null)
-    {
-      // Delete all attribute queries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        sn = ds.getChild(i);
-        if (sn.getType().equals(JDBCConstants.attributeQueryNode))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, maybe do add
-      final String newAttributeName;
-      final String newAttributeOp = variableContext.getParameter(seqPrefix+"attr_op");
-      if (newAttributeOp != null && newAttributeOp.equals("Add"))
-      {
-        final String attributeName = variableContext.getParameter(seqPrefix+"attr_name");
-        final String attributeQuery = variableContext.getParameter(seqPrefix+"attr_query");
-        SpecificationNode node = new SpecificationNode(JDBCConstants.attributeQueryNode);
-        node.setAttribute(JDBCConstants.attributeName, attributeName);
-        newAttributeName = attributeName;
-        node.setValue(attributeQuery);
-        ds.addChild(ds.getChildCount(),node);
-      }
-      else
-      {
-        newAttributeName = null;
-      }
-
-      int attributeCount = Integer.parseInt(xc);
-      for (int attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++)
-      {
-        final String attributeOp = variableContext.getParameter(seqPrefix+"attr_"+attributeIndex+"_op");
-        if (!(attributeOp != null && attributeOp.equals("Delete")))
-        {
-          // Include this!!
-          final String attributeName = variableContext.getParameter(seqPrefix+"attr_"+attributeIndex+"_name");
-          if (newAttributeName == null || !attributeName.equals(newAttributeName)) {
-            final String attributeQuery = variableContext.getParameter(seqPrefix+"attr_"+attributeIndex+"_query");
-            SpecificationNode node = new SpecificationNode(JDBCConstants.attributeQueryNode);
-            node.setAttribute(JDBCConstants.attributeName, attributeName);
-            node.setValue(attributeQuery);
-            ds.addChild(ds.getChildCount(),node);
-          }
-        }
-      }
-      
-    }
-    
-    xc = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (xc != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        sn = ds.getChild(i);
-        if (sn.getType().equals("security"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode("security");
-      node.setAttribute("value",xc);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null)
-    {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    String idQuery = "";
-    String versionQuery = "";
-    String dataQuery = "";
-    String aclQuery = "";
-    
-    final Map<String, String> attributeQueryMap = new HashMap<String, String>();
-    
-    int i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(JDBCConstants.idQueryNode))
-      {
-        idQuery = sn.getValue();
-        if (idQuery == null)
-          idQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.versionQueryNode))
-      {
-        versionQuery = sn.getValue();
-        if (versionQuery == null)
-          versionQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.dataQueryNode))
-      {
-        dataQuery = sn.getValue();
-        if (dataQuery == null)
-          dataQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.aclQueryNode))
-      {
-        aclQuery = sn.getValue();
-        if (aclQuery == null)
-          aclQuery = "";
-      }
-      else if (sn.getType().equals(JDBCConstants.attributeQueryNode))
-      {
-        String attributeName = sn.getAttributeValue(JDBCConstants.attributeName);
-        String attributeQuery = sn.getValue();
-        attributeQueryMap.put(attributeName, attributeQuery);
-      }
-    }
-
-    // Sort the attribute query list
-    final String[] attributeNames = attributeQueryMap.keySet().toArray(new String[0]);
-    java.util.Arrays.sort(attributeNames);
-
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.SeedingQuery") + "</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(idQuery)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.VersionCheckQuery") + "</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(versionQuery)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AccessTokenQuery") + "</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(aclQuery)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.DataQuery") + "</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(dataQuery)+"</td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AttributeQueries") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AttributeName") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AttributeQuery") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-    int attributeIndex = 0;
-    for (final String attributeName : attributeNames) {
-      final String attributeQuery = attributeQueryMap.get(attributeName);
-      if (attributeIndex % 2 == 0)
-      {
-        out.print(
-"        <tr class=\"evenformrow\">\n"
-        );
-      }
-      else 
-      {
-        out.print(
-"        <tr class=\"oddformrow\">\n"
-        );
-      }
-      // Attribute name
-      out.print(
-"          <td class=\"formcolumncell\">\n"+
-"            "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(attributeName)+"\n"+
-"          </td>\n"
-      );
-      // Query
-      out.print(
-"          <td class=\"formcolumncell\">\n"+
-"            "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(attributeQuery)+"\n"+
-"          </td>\n"
-      );
-      out.print(
-"        </tr>\n"
-      );
-      attributeIndex++;
-    }
-    if (attributeIndex == 0)
-    {
-      out.print(
-"        <tr><td class=\"formmessage\" colspan=\"2\">"+Messages.getBodyString(locale,"JDBCConnector.NoAttributeQueries")+"</td></tr>\n"
-      );
-    }
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-    out.print(
-"  <tr>\n"+
-"    <td class=\"description\">"+Messages.getBodyString(locale,"JDBCConnector.SecurityColon")+"</td>\n"+
-"    <td class=\"value\">"+(securityOn?Messages.getBodyString(locale,"JDBCConnector.Enabled"):Messages.getBodyString(locale,"JDBCConnector.Disabled"))+"</td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-
-    // Go through looking for access tokens
-    boolean seenAny = false;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("access"))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr><td class=\"description\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.AccessTokens") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue("token");
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"JDBCConnector.NoAccessTokensSpecified") + "</nobr></td></tr>\n"
-      );
-    }
-
-    out.print(
-"</table>\n"
-    );
-  }
-
-  /** Special column names, as far as document queries are concerned */
-  protected static HashMap documentKnownColumns;
-  static
-  {
-    documentKnownColumns = new HashMap();
-    documentKnownColumns.put(JDBCConstants.idReturnColumnName,"");
-    documentKnownColumns.put(JDBCConstants.urlReturnColumnName,"");
-    documentKnownColumns.put(JDBCConstants.dataReturnColumnName,"");
-    documentKnownColumns.put(JDBCConstants.contentTypeReturnColumnName,"");
-  }
-  
-  /** Apply metadata to a repository document.
-  *@param rd is the repository document to apply the metadata to.
-  *@param row is the resultset row to use to get the metadata.  All non-special columns from this row will be considered to be metadata.
-  */
-  protected void applyMetadata(RepositoryDocument rd, IResultRow row)
-    throws ManifoldCFException
-  {
-    // Cycle through the row's columns
-    Iterator iter = row.getColumns();
-    while (iter.hasNext())
-    {
-      String columnName = (String)iter.next();
-      if (documentKnownColumns.get(columnName) == null)
-      {
-        // Consider this column to contain metadata.
-        // We can only accept non-binary metadata at this time.
-        Object metadata = row.getValue(columnName);
-        rd.addField(columnName,JDBCConnection.readAsString(metadata));
-      }
-    }
-  }
-
-  /** Apply multi-valued attribute values to a repository document.
-  */
-  protected void applyMultiAttributeValues(final RepositoryDocument rd, final Map<String, Set<String>> values)
-    throws ManifoldCFException
-  {
-    if (values == null)
-    {
-      return;
-    }
-    
-    for (final String attributeName : values.keySet())
-    {
-      final Set<String> attributes = values.get(attributeName);
-      final String[] attributeValues = new String[values.size()];
-      int i = 0;
-      for (final String attributeValue : attributes)
-      {
-        attributeValues[i++] = attributeValue;
-      }
-      rd.addField(attributeName, attributeValues);
-    }
-  }
-  
-  /** Apply access tokens to a repository document.
-  *@param rd is the repository document to apply the access tokens to.
-  *@param version is the version string.
-  *@param spec is the document specification.
-  */
-  protected void applyAccessTokens(RepositoryDocument rd, Set<String> accessTokens)
-    throws ManifoldCFException
-  {
-    if (accessTokens == null)
-      return;
-    
-    String[] accessAcls = new String[accessTokens.size()];
-    int i = 0;
-    for (String accessToken : accessTokens)
-    {
-      accessAcls[i++] = accessToken;
-    }
-    java.util.Arrays.sort(accessAcls);
-    String[] denyAcls = new String[]{defaultAuthorityDenyToken};
-      
-    rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,accessAcls,denyAcls);
-
-  }
-  
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // This is a number that is comfortably processed by the query processor as part of an IN clause.
-    return 100;
-  }
-
-
-  // These are protected helper methods
-
-  /** Add starttime and endtime query variables
-  */
-  protected static void addVariable(VariableMap map, String varName, long variable)
-  {
-    ArrayList params = new ArrayList();
-    params.add(new Long(variable));
-    map.addVariable(varName,"?",params);
-  }
-
-  /** Add string query variables
-  */
-  protected static void addVariable(VariableMap map, String varName, String variable)
-  {
-    ArrayList params = new ArrayList();
-    params.add(variable);
-    map.addVariable(varName,"?",params);
-  }
-
-  /** Add string query constants
-  */
-  protected static void addConstant(VariableMap map, String varName, String value)
-  {
-    map.addVariable(varName,value,null);
-  }
-
-  /** Build an idlist variable, and add it to the specified variable map.
-  */
-  protected static boolean addIDList(VariableMap map, String varName, String[] documentIdentifiers, Set<String> fetchDocuments)
-  {
-    ArrayList params = new ArrayList();
-    StringBuilder sb = new StringBuilder(" (");
-    int k = 0;
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      if (fetchDocuments == null || fetchDocuments.contains(documentIdentifier))
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append("?");
-        params.add(documentIdentifier);
-        k++;
-      }
-    }
-    sb.append(") ");
-    map.addVariable(varName,sb.toString(),params);
-    return (k > 0);
-  }
-
-  /** Given a query, and a parameter map, substitute it.
-  * Each variable substitutes the string, and it also substitutes zero or more query parameters.
-  */
-  protected static void substituteQuery(String inputString, VariableMap inputMap, StringBuilder outputQuery, ArrayList outputParams)
-    throws ManifoldCFException
-  {
-    // We are looking for strings that look like this: $(something)
-    // Right at the moment we don't care even about quotes, so we just want to look for $(.
-    int startIndex = 0;
-    while (true)
-    {
-      int nextIndex = inputString.indexOf("$(",startIndex);
-      if (nextIndex == -1)
-      {
-        outputQuery.append(inputString.substring(startIndex));
-        break;
-      }
-      int endIndex = inputString.indexOf(")",nextIndex);
-      if (endIndex == -1)
-      {
-        outputQuery.append(inputString.substring(startIndex));
-        break;
-      }
-      String variableName = inputString.substring(nextIndex+2,endIndex);
-      VariableMapItem item = inputMap.getVariable(variableName);
-      if (item == null)
-        throw new ManifoldCFException("No such substitution variable: $("+variableName+")");
-      outputQuery.append(inputString.substring(startIndex,nextIndex));
-      outputQuery.append(item.getValue());
-      ArrayList inputParams = item.getParameters();
-      if (inputParams != null)
-      {
-        int i = 0;
-        while (i < inputParams.size())
-        {
-          Object x = inputParams.get(i++);
-          outputParams.add(x);
-        }
-      }
-      startIndex = endIndex+1;
-    }
-  }
-
-  /** Create an entity identifier from a querystring and a parameter list.
-  */
-  protected static String createQueryString(String queryText, ArrayList paramList)
-  {
-    StringBuilder sb = new StringBuilder(queryText);
-    sb.append("; arguments = (");
-    int i = 0;
-    while (i < paramList.size())
-    {
-      if (i > 0)
-        sb.append(",");
-      Object parameter = paramList.get(i++);
-      if (parameter instanceof String)
-        sb.append(quoteSQLString((String)parameter));
-      else
-        sb.append(parameter.toString());
-    }
-    sb.append(")");
-    return sb.toString();
-  }
-
-  /** Quote a sql string.
-  */
-  protected static String quoteSQLString(String input)
-  {
-    StringBuilder sb = new StringBuilder("\'");
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '\'')
-        sb.append('\'').append(x);
-      else if (x >= 0 && x < ' ')
-        sb.append(' ');
-      else
-        sb.append(x);
-    }
-    sb.append("\'");
-    return sb.toString();
-  }
-
-
-  /** Variable map entry.
-  */
-  protected static class VariableMapItem
-  {
-    protected String value;
-    protected ArrayList params;
-
-    /** Constructor.
-    */
-    public VariableMapItem(String value, ArrayList params)
-    {
-      this.value = value;
-      this.params = params;
-    }
-
-    /** Get value.
-    */
-    public String getValue()
-    {
-      return value;
-    }
-
-    /** Get parameters.
-    */
-    public ArrayList getParameters()
-    {
-      return params;
-    }
-  }
-
-  /** Variable map.
-  */
-  protected static class VariableMap
-  {
-    protected Map variableMap = new HashMap();
-
-    /** Constructor
-    */
-    public VariableMap()
-    {
-    }
-
-    /** Add a variable map entry */
-    public void addVariable(String variableName, String value, ArrayList parameters)
-    {
-      VariableMapItem e = new VariableMapItem(value,parameters);
-      variableMap.put(variableName,e);
-    }
-
-    /** Get a variable map entry */
-    public VariableMapItem getVariable(String variableName)
-    {
-      return (VariableMapItem)variableMap.get(variableName);
-    }
-  }
-
-  /** This class represents data gleaned from a document specification, in a more usable form.
-  */
-  protected static class TableSpec
-  {
-    public final String idQuery;
-    public final String versionQuery;
-    public final String dataQuery;
-    public final String aclQuery;
-    public final boolean securityOn;
-    public final Set<String> aclMap = new HashSet<String>();
-
-    public TableSpec(Specification ds)
-    {
-      String idQuery = null;
-      String versionQuery = null;
-      String dataQuery = null;
-      String aclQuery = null;
-      boolean securityOn = false;
-      for (int i = 0; i < ds.getChildCount(); i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(JDBCConstants.idQueryNode))
-        {
-          idQuery = sn.getValue();
-          if (idQuery == null)
-            idQuery = "";
-        }
-        else if (sn.getType().equals(JDBCConstants.versionQueryNode))
-        {
-          versionQuery = sn.getValue();
-          if (versionQuery == null)
-            versionQuery = "";
-        }
-        else if (sn.getType().equals(JDBCConstants.dataQueryNode))
-        {
-          dataQuery = sn.getValue();
-          if (dataQuery == null)
-            dataQuery = "";
-        }
-        else if (sn.getType().equals(JDBCConstants.aclQueryNode))
-        {
-          aclQuery = sn.getValue();
-          if (aclQuery == null)
-            aclQuery = "";
-        }
-        else if (sn.getType().equals("access"))
-        {
-          String token = sn.getAttributeValue("token");
-          aclMap.add(token);
-        }
-        else if (sn.getType().equals("security"))
-        {
-          String value = sn.getAttributeValue("value");
-          securityOn = value.equals("on");
-        }
-      }
-      this.idQuery = idQuery;
-      this.versionQuery = versionQuery;
-      this.dataQuery = dataQuery;
-      this.aclQuery = aclQuery;
-      this.securityOn = securityOn;
-    }
-
-    public Set<String> getAcls()
-    {
-      return aclMap;
-    }
-
-    public boolean isSecurityOn()
-    {
-      return securityOn;
-    }
-    
-  }
-
-}
-
-
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/Messages.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/Messages.java
deleted file mode 100644
index 1ac02fe..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jdbc;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.jdbc.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.jdbc";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultRow.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultRow.java
deleted file mode 100644
index 066a34c..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultRow.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.jdbc;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This object describes an (open) jdbc resultrow.  Semantics are identical to
-* org.apache.manifoldcf.core.interfaces.IResultRow, EXCEPT that a close() method is
-* provided and must be called, in order to clean up any blobs or clobs in the set that
-* were unused.
-*/
-public interface IDynamicResultRow extends IResultRow
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Close this resultrow.
-  */
-  public void close()
-    throws ManifoldCFException;
-}
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java
deleted file mode 100644
index 3dbc85d..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id: IDynamicResultSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.jdbc;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This object describes an (open) jdbc resultset.  Semantics are identical to
-* org.apache.manifoldcf.core.interfaces.IResultSet, EXCEPT that a close() method is
-* provided and must be called, and there is no method to get the entire resultset
-* at once.
-*/
-public interface IDynamicResultSet
-{
-  public static final String _rcsid = "@(#)$Id: IDynamicResultSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the next row from the resultset.
-  *@return the immutable row description, or null if there is no such row.
-  */
-  public IDynamicResultRow getNextRow()
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Close this resultset.
-  */
-  public void close()
-    throws ManifoldCFException, ServiceInterruption;
-}
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java
deleted file mode 100644
index fb3547f..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java
+++ /dev/null
@@ -1,1518 +0,0 @@
-/* $Id: JDBCConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.jdbc;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.database.*;
-import org.apache.manifoldcf.core.jdbcpool.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.nio.charset.StandardCharsets;
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This object describes a connection to a particular JDBC instance.
-*/
-public class JDBCConnection
-{
-  public static final String _rcsid = "@(#)$Id: JDBCConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected String jdbcProvider = null;
-  protected boolean useName;
-  protected String driverString = null;
-  protected String userName = null;
-  protected String password = null;
-
-  /** Constructor.
-  */
-  public JDBCConnection(String jdbcProvider, boolean useName, String host, String databaseName, String rawDriverString,
-    String userName, String password)
-    throws ManifoldCFException
-  {
-    this.jdbcProvider = jdbcProvider;
-    this.useName = useName;
-    this.driverString = JDBCConnectionFactory.getJDBCDriverString(jdbcProvider, host, databaseName, rawDriverString);
-    this.userName = userName;
-    this.password = password;
-  }
-
-  protected static IDynamicResultRow readNextResultRowViaThread(ResultSet rs, ResultSetMetaData rsmd, String[] resultCols)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    NextResultRowThread t = new NextResultRowThread(rs,rsmd,resultCols);
-    try
-    {
-      t.start();
-      return t.finishUp();
-    }
-    catch (InterruptedException e)
-    {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  protected static class NextResultRowThread extends Thread
-  {
-    protected ResultSet rs;
-    protected ResultSetMetaData rsmd;
-    protected String[] resultCols;
-
-    protected Throwable exception = null;
-    protected IDynamicResultRow response = null;
-
-    public NextResultRowThread(ResultSet rs, ResultSetMetaData rsmd, String[] resultCols)
-    {
-      super();
-      setDaemon(true);
-      this.rs = rs;
-      this.rsmd = rsmd;
-      this.resultCols = resultCols;
-    }
-
-    public void run()
-    {
-      try
-      {
-        response = readNextResultRow(rs,rsmd,resultCols);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public IDynamicResultRow finishUp()
-      throws ManifoldCFException, ServiceInterruption, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof java.sql.SQLException)
-          throw new ManifoldCFException("Error fetching next JDBC result row: "+thr.getMessage(),thr);
-        else if (thr instanceof ManifoldCFException)
-          throw (ManifoldCFException)thr;
-        else if (thr instanceof ServiceInterruption)
-          throw (ServiceInterruption)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else
-          throw (Error)thr;
-      }
-      return response;
-    }
-    
-  }
-
-  protected static IDynamicResultRow readNextResultRow(ResultSet rs, ResultSetMetaData rsmd, String[] resultCols)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      if (rs.next())
-      {
-        return readResultRow(rs,rsmd,resultCols);
-      }
-      return null;
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Result set error: "+e.getMessage(),e);
-    }
-  }
-
-  protected static void closeResultset(ResultSet rs)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      rs.close();
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Exception closing resultset: "+e.getMessage(),e);
-    }
-  }
-
-  protected static void closeStmt(Statement stmt)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      stmt.close();
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Exception closing statement: "+e.getMessage(),e);
-    }
-  }
-
-  protected static void closePS(PreparedStatement ps)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      ps.close();
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Exception closing statement: "+e.getMessage(),e);
-    }
-  }
-
-
-  /** Test connection.
-  */
-  public void testConnection()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    TestConnectionThread t = new TestConnectionThread();
-    try
-    {
-      t.start();
-      t.finishUp();
-    }
-    catch (InterruptedException e)
-    {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  protected class TestConnectionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public TestConnectionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        WrappedConnection tempConnection = JDBCConnectionFactory.getConnection(jdbcProvider,driverString,userName,password);
-        JDBCConnectionFactory.releaseConnection(tempConnection);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws ManifoldCFException, ServiceInterruption, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof java.sql.SQLException)
-          throw new ManifoldCFException("Error doing JDBC connection test: "+thr.getMessage(),thr);
-        else if (thr instanceof ManifoldCFException)
-          throw (ManifoldCFException)thr;
-        else if (thr instanceof ServiceInterruption)
-          throw (ServiceInterruption)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else
-          throw (Error)thr;
-      }
-    }
-  }
-
-  /** Execute query.
-  */
-  public IDynamicResultSet executeUncachedQuery(String query, ArrayList params, int maxResults)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (params == null)
-      return new JDBCResultSet(query,maxResults);
-    else
-      return new JDBCPSResultSet(query,params,maxResults);
-  }
-
-  /** Execute operation.
-  */
-  public void executeOperation(String query, ArrayList params)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    ExecuteOperationThread t = new ExecuteOperationThread(query,params);
-    try
-    {
-      t.start();
-      t.finishUp();
-    }
-    catch (InterruptedException e)
-    {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Read object as a string */
-  public static String readAsString(Object o)
-    throws ManifoldCFException
-  {
-    if (o instanceof BinaryInput)
-    {
-      // Convert this input to a string, since mssql can mess us up with the wrong column types here.
-      BinaryInput bi = (BinaryInput)o;
-      try
-      {
-        InputStream is = bi.getStream();
-        try
-        {
-          InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
-          StringBuilder sb = new StringBuilder();
-          while (true)
-          {
-            int x = reader.read();
-            if (x == -1)
-              break;
-            sb.append((char)x);
-          }
-          return sb.toString();
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      finally
-      {
-        bi.doneWithStream();
-      }
-    }
-    else if (o instanceof CharacterInput)
-    {
-      CharacterInput ci = (CharacterInput)o;
-      try
-      {
-        Reader reader = ci.getStream();
-        try
-        {
-          StringBuilder sb = new StringBuilder();
-          while (true)
-          {
-            int x = reader.read();
-            if (x == -1)
-              break;
-            sb.append((char)x);
-          }
-          return sb.toString();
-        }
-        finally
-        {
-          reader.close();
-        }
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      finally
-      {
-        ci.doneWithStream();
-      }
-    }
-    else
-    {
-      return o.toString();
-    }
-  }
-
-  protected class ExecuteOperationThread extends Thread
-  {
-    protected String query;
-    protected ArrayList params;
-
-    protected Throwable exception = null;
-
-    public ExecuteOperationThread(String query, ArrayList params)
-    {
-      super();
-      setDaemon(true);
-      this.query = query;
-      this.params = params;
-    }
-
-    public void run()
-    {
-      try
-      {
-        WrappedConnection tempConnection = JDBCConnectionFactory.getConnection(jdbcProvider,driverString,userName,password);
-        try
-        {
-          execute(tempConnection.getConnection(),query,params,false,0,useName);
-        }
-        finally
-        {
-          JDBCConnectionFactory.releaseConnection(tempConnection);
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws ManifoldCFException, ServiceInterruption, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof java.sql.SQLException)
-          throw new ManifoldCFException("Exception doing connector query '"+query+"': "+thr.getMessage(),thr);
-        else if (thr instanceof ManifoldCFException)
-          throw (ManifoldCFException)thr;
-        else if (thr instanceof ServiceInterruption)
-          throw (ServiceInterruption)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else
-          throw (Error)thr;
-      }
-    }
-  }
-
-  /** Run a query.  No caching is involved at all at this level.
-  * @param query String the query string
-  * @param maxResults is the maximum number of results to load: -1 if all
-  * @param params ArrayList if params !=null, use preparedStatement
-  */
-  protected static IResultSet execute(Connection connection, String query, ArrayList params, boolean bResults, int maxResults, boolean useName)
-    throws ManifoldCFException, ServiceInterruption
-  {
-
-    ResultSet rs;
-
-    try
-    {
-
-      if (params==null)
-      {
-        // lightest statement type
-        Statement stmt = connection.createStatement();
-        try
-        {
-          stmt.execute(query);
-          rs = stmt.getResultSet();
-          try
-          {
-            // Suck data from resultset
-            if (bResults)
-              return getData(rs,maxResults,useName);
-            return null;
-          }
-          finally
-          {
-            if (rs != null)
-              rs.close();
-          }
-        }
-        finally
-        {
-          stmt.close();
-        }
-      }
-      else
-      {
-        PreparedStatement ps = connection.prepareStatement(query);
-        try
-        {
-          loadPS(ps, params);
-
-          if (bResults)
-          {
-            rs = ps.executeQuery();
-            try
-            {
-              // Suck data from resultset
-              return getData(rs,maxResults,useName);
-            }
-            finally
-            {
-              if (rs != null)
-                rs.close();
-            }
-          }
-          else
-          {
-            ps.executeUpdate();
-            return null;
-          }
-
-        }
-        finally
-        {
-          ps.close();
-          cleanupParameters(params);
-        }
-      }
-
-    }
-    catch (ManifoldCFException e)
-    {
-      throw e;
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Exception doing connector query '"+query+"': "+e.getMessage(),e);
-    }
-  }
-
-  /** Read the current row from the resultset */
-  protected static IDynamicResultRow readResultRow(ResultSet rs, ResultSetMetaData rsmd, String[] resultCols)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      Object value = null;
-      RDynamicRow m = new RDynamicRow();
-
-      // We have 'colcount' cols to look thru
-      for (int i = 0; i < resultCols.length; i++)
-      {
-        String key = resultCols[i];
-        // System.out.println("Key = "+key);
-        int colnum = findColumn(rs,key);
-        if (colnum > -1)
-        {
-          if (isBinaryData(rsmd,colnum))
-          {
-            InputStream bis = rs.getBinaryStream(colnum);
-            if (bis != null)
-            {
-              try
-              {
-                value = new TempFileInput(bis);
-              }
-              catch (IOException e)
-              {
-                handleIOException(e,"reading binary data");
-              }
-            }
-          }
-          else if (isBLOB(rsmd,colnum))
-          {
-            // System.out.println("It's a blob!");
-            Blob blob = getBLOB(rs,colnum);
-            // Create a tempfileinput object!
-            // Cleanup should happen by the user of the resultset.
-            // System.out.println(" Blob length = "+Long.toString(blob.length()));
-            if (blob != null)
-            {
-              try
-              {
-                value = new TempFileInput(blob.getBinaryStream(),blob.length());
-              }
-              catch (IOException e)
-              {
-                handleIOException(e,"reading blob");
-              }
-            }
-          }
-          else if (isCLOB(rsmd,colnum))
-          {
-            Clob clob = getCLOB(rs,colnum);
-            if (clob != null)
-            {
-              try
-              {
-                value = new TempFileCharacterInput(clob.getCharacterStream(),clob.length());
-              }
-              catch (IOException e)
-              {
-                handleIOException(e,"reading clob");
-              }
-            }
-          }
-          else
-          {
-            // System.out.println("It's not a blob");
-            value = getObject(rs,rsmd,colnum);
-          }
-        }
-        if (value != null)
-          m.put(key, value);
-      }
-      return m;
-
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Resultset error: "+e.getMessage(),e);
-    }
-  }
-
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException
-  {
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException("IO exception while "+context+": "+e.getMessage(),e);
-  }
-  
-  protected static String[] readColumnNames(ResultSetMetaData rsmd, boolean useName)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      String[] resultCols;
-      if (rsmd != null)
-      {
-        int colcount = rsmd.getColumnCount();
-        resultCols = new String[colcount];
-        for (int i = 0; i < colcount; i++)
-        {
-          String name;
-          if (useName)
-            name = rsmd.getColumnName(i+1);
-          else
-            name = rsmd.getColumnLabel(i+1);
-          resultCols[i] = name;
-        }
-      }
-      else
-        resultCols = new String[0];
-      return resultCols;
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Sql exception reading column names: "+e.getMessage(),e);
-    }
-  }
-
-  // Read data from a resultset
-  protected static IResultSet getData(ResultSet rs, int maxResults, boolean useName)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      RSet results = new RSet();  // might be empty but not an error
-
-      if (rs != null)
-      {
-        // Optionally we're going to suck the data
-        // out of the db and return it in a
-        // readonly structure
-        ResultSetMetaData rsmd = rs.getMetaData();
-        String[] resultCols = readColumnNames(rsmd, useName);
-        if (resultCols.length == 0)
-        {
-          // This is an error situation; if a result with no columns is
-          // necessary, bResults must be false!!!
-          throw new ManifoldCFException("Empty query, no columns returned",ManifoldCFException.GENERAL_ERROR);
-        }
-
-        while (rs.next() && (maxResults == -1 || maxResults > 0))
-        {
-          IResultRow m = readResultRow(rs,rsmd,resultCols);
-          if (maxResults != -1)
-            maxResults--;
-          results.addRow(m);
-        }
-      }
-      return results;
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Resultset error: "+e.getMessage(),e);
-    }
-  }
-
-  // pass params to preparedStatement
-  protected static void loadPS(PreparedStatement ps, ArrayList data)
-    throws java.sql.SQLException, ManifoldCFException
-  {
-    if (data!=null)
-    {
-      for (int i = 0; i < data.size(); i++)
-      {
-        // If the input type is a string, then set it as such.
-        // Otherwise, if it's an input stream, we make a blob out of it.
-        Object x = data.get(i);
-        if (x instanceof String)
-        {
-          String value = (String)x;
-          // letting database do lame conversion!
-          ps.setString(i+1, value);
-        }
-        else if (x instanceof BinaryInput)
-        {
-          BinaryInput value = (BinaryInput)x;
-          ps.setBinaryStream(i+1,value.getStream(),value.getLength());
-          // Hopefully with the introduction of CharacterInput below, this hackery is no longer needed.
-          // System.out.println("Blob length on write = "+Long.toString(value.getLength()));
-          // The oracle driver does a binary conversion to base 64 when writing data
-          // into a clob column using a binary stream operator.  Since at this
-          // point there is no way to distinguish the two, and since our tests use CLOB,
-          // this code doesn't work for them.
-          // So, for now, use the ascii stream method.
-          //ps.setAsciiStream(i+1,value.getStream(),value.getLength());
-        }
-        else if (x instanceof CharacterInput)
-        {
-          CharacterInput value = (CharacterInput)x;
-          ps.setCharacterStream(i+1,value.getStream(),value.getCharacterLength());
-        }
-        else if (x instanceof java.util.Date)
-        {
-          ps.setDate(i+1,new java.sql.Date(((java.util.Date)x).getTime()));
-        }
-        else if (x instanceof Long)
-        {
-          ps.setLong(i+1,((Long)x).longValue());
-        }
-        else if (x instanceof TimeMarker)
-        {
-          ps.setTimestamp(i+1,new java.sql.Timestamp(((Long)x).longValue()));
-        }
-        else if (x instanceof Double)
-        {
-          ps.setDouble(i+1,((Double)x).doubleValue());
-        }
-        else if (x instanceof Integer)
-        {
-          ps.setInt(i+1,((Integer)x).intValue());
-        }
-        else if (x instanceof Float)
-        {
-          ps.setFloat(i+1,((Float)x).floatValue());
-        }
-        else
-          throw new ManifoldCFException("Unknown data type: "+x.getClass().getName());
-      }
-    }
-  }
-
-  /** Permanently discard database object.
-  */
-  protected static void discardDatabaseObject(Object x)
-    throws ManifoldCFException
-  {
-    if (x instanceof PersistentDatabaseObject)
-    {
-      PersistentDatabaseObject value = (PersistentDatabaseObject)x;
-      value.discard();
-    }
-  }
-  
-  /** Call this method on every parameter or result object, when we're done with it, if it's possible that the object is a BLOB
-  * or CLOB.
-  */
-  protected static void cleanupDatabaseObject(Object x)
-    throws ManifoldCFException
-  {
-    if (x instanceof PersistentDatabaseObject)
-    {
-      PersistentDatabaseObject value = (PersistentDatabaseObject)x;
-      value.doneWithStream();
-    }
-  }
-  
-  /** Clean up parameters after query has been triggered.
-  */
-  protected static void cleanupParameters(ArrayList data)
-    throws ManifoldCFException
-  {
-    if (data != null)
-    {
-      for (Object x : data)
-      {
-        cleanupDatabaseObject(x);
-      }
-    }
-  }
-
-  protected static int findColumn(ResultSet rs, String name)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      return rs.findColumn(name);
-    }
-    catch (java.sql.SQLException e)
-    {
-      return -1;
-    }
-  }
-
-  protected static Blob getBLOB(ResultSet rs, int col)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      return rs.getBlob(col);
-    }
-    catch (java.sql.SQLException sqle)
-    {
-      throw new ManifoldCFException("Error in getBlob("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected static Clob getCLOB(ResultSet rs, int col)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      return rs.getClob(col);
-    }
-    catch (java.sql.SQLException sqle)
-    {
-      throw new ManifoldCFException("Error in getClob("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected static boolean isBLOB(ResultSetMetaData rsmd, int col)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      int type = rsmd.getColumnType(col);
-      return (type == java.sql.Types.BLOB);
-    }
-    catch (java.sql.SQLException sqle)
-    {
-      throw new ManifoldCFException("Error in isBlob("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected static boolean isBinaryData(ResultSetMetaData rsmd, int col)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      int type = rsmd.getColumnType(col);
-      return (type == java.sql.Types.VARBINARY ||
-        type == java.sql.Types.BINARY || type == java.sql.Types.LONGVARBINARY);
-    }
-    catch (java.sql.SQLException sqle)
-    {
-      throw new ManifoldCFException("Error in isBinaryData("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected static boolean isCLOB(ResultSetMetaData rsmd, int col)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      int type = rsmd.getColumnType(col);
-      return (type == java.sql.Types.CLOB || type == java.sql.Types.LONGVARCHAR);
-    }
-    catch (java.sql.SQLException sqle)
-    {
-      throw new ManifoldCFException("Error in isClob("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected static Object getObject(ResultSet rs, ResultSetMetaData rsmd, int col)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Object result = null;
-
-    try
-    {
-      Timestamp timestamp;
-      java.sql.Date date;
-      Clob clob;
-      String resultString;
-
-      switch (rsmd.getColumnType(col))
-      {
-      case java.sql.Types.CHAR :
-        if ((resultString = rs.getString(col)) != null)
-        {
-          if (rsmd.getColumnDisplaySize(col) < resultString.length())
-          {
-            result = resultString.substring(0,rsmd.getColumnDisplaySize(col));
-          }
-          else
-            result = resultString;
-        }
-        break;
-      case java.sql.Types.CLOB :
-        if ((clob = rs.getClob(col)) != null)
-        {
-          result = clob.getSubString(1, (int) clob.length());
-        }
-        break;
-
-      case java.sql.Types.BIGINT :
-        long l = rs.getLong(col);
-        if (!rs.wasNull())
-          result = new Long(l);
-        break;
-
-      case java.sql.Types.INTEGER :
-        int i = rs.getInt(col);
-        if (!rs.wasNull())
-          result = new Integer(i);
-        break;
-
-      case java.sql.Types.REAL :
-      case java.sql.Types.FLOAT :
-        float f = rs.getFloat(col);
-        if (!rs.wasNull())
-          result = new Float(f);
-        break;
-
-      case java.sql.Types.DOUBLE :
-        double d = rs.getDouble(col);
-        if (!rs.wasNull())
-          result = new Double(d);
-        break;
-
-      case java.sql.Types.DATE :
-        if ((date = rs.getDate(col)) != null)
-        {
-          result = new java.util.Date(date.getTime());
-        }
-        break;
-
-      case java.sql.Types.TIMESTAMP :
-        if ((timestamp = rs.getTimestamp(col)) != null)
-        {
-          result = new TimeMarker(timestamp.getTime());
-        }
-        break;
-
-      case java.sql.Types.BLOB:
-      case java.sql.Types.VARBINARY:
-      case java.sql.Types.BINARY:
-      case java.sql.Types.LONGVARBINARY:
-        throw new ManifoldCFException("Binary type is not a string, column = " + col,ManifoldCFException.GENERAL_ERROR);
-        //break
-
-      default :
-        result = rs.getString(col);
-        break;
-      }
-      if (rs.wasNull())
-      {
-        result = null;
-      }
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("Exception in getString(): "+e.getMessage(),e,ManifoldCFException.DATABASE_ERROR);
-    }
-    return result;
-  }
-
-  protected class JDBCResultSet implements IDynamicResultSet
-  {
-    protected WrappedConnection connection;
-    protected Statement stmt;
-    protected ResultSet rs;
-    protected ResultSetMetaData rsmd;
-    protected String[] resultCols;
-    protected int maxResults;
-
-    /** Constructor */
-    public JDBCResultSet(String query, int maxResults)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      this.maxResults = maxResults;
-      StatementQueryThread t = new StatementQueryThread(query);
-      try
-      {
-        t.start();
-        t.finishUp();
-        connection = t.getConnection();
-        stmt = t.getStatement();
-        rs = t.getResultSet();
-        rsmd = t.getResultSetMetaData();
-        resultCols = t.getColumnNames();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-
-    /** Get the next row from the resultset.
-    *@return the immutable row description, or null if there is no such row.
-    */
-    public IDynamicResultRow getNextRow()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (maxResults == -1 || maxResults > 0)
-      {
-        IDynamicResultRow row = readNextResultRowViaThread(rs,rsmd,resultCols);
-        if (row != null && maxResults != -1)
-          maxResults--;
-        return row;
-      }
-      return null;
-    }
-
-    /** Close this resultset.
-    */
-    public void close()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      ManifoldCFException rval = null;
-      Error error = null;
-      RuntimeException rtException = null;
-      if (rs != null)
-      {
-        try
-        {
-          closeResultset(rs);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (rval == null || e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            rval = e;
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          rs = null;
-        }
-      }
-      if (stmt != null)
-      {
-        try
-        {
-          closeStmt(stmt);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (rval == null || e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            rval = e;
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          stmt = null;
-        }
-      }
-      if (connection != null)
-      {
-        try
-        {
-          JDBCConnectionFactory.releaseConnection(connection);
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          connection = null;
-        }
-      }
-      if (error != null)
-        throw error;
-      if (rtException != null)
-        throw rtException;
-      if (rval != null)
-        throw rval;
-    }
-
-  }
-
-  protected class StatementQueryThread extends Thread
-  {
-    protected String query;
-
-    protected Throwable exception = null;
-    protected WrappedConnection connection = null;
-    protected Statement stmt = null;
-    protected ResultSet rs = null;
-    protected ResultSetMetaData rsmd = null;
-    protected String[] resultCols = null;
-
-    public StatementQueryThread(String query)
-    {
-      super();
-      setDaemon(true);
-      this.query = query;
-    }
-
-    public void run()
-    {
-      try
-      {
-        connection = JDBCConnectionFactory.getConnection(jdbcProvider,driverString,userName,password);
-        // lightest statement type
-        stmt = connection.getConnection().createStatement();
-        stmt.execute(query);
-        rs = stmt.getResultSet();
-        rsmd = rs.getMetaData();
-        resultCols = readColumnNames(rsmd,useName);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-        if (rs != null)
-        {
-          try
-          {
-            closeResultset(rs);
-          }
-          catch (ManifoldCFException e2)
-          {
-            if (e2.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              this.exception = e2;
-            // Ignore
-          }
-          catch (Throwable e2)
-          {
-            // We already have an exception to report.
-            // Eat any other exceptions from closing
-          }
-          finally
-          {
-            rs = null;
-          }
-        }
-        if (stmt != null)
-        {
-          try
-          {
-            closeStmt(stmt);
-          }
-          catch (ManifoldCFException e2)
-          {
-            if (e2.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              this.exception = e2;
-            // Ignore
-          }
-          catch (Throwable e2)
-          {
-            // We already have an exception to report.
-            // Eat any other exceptions from closing statements
-          }
-          finally
-          {
-            stmt = null;
-          }
-        }
-        if (connection != null)
-        {
-          JDBCConnectionFactory.releaseConnection(connection);
-          connection = null;
-        }
-      }
-    }
-
-    public void finishUp()
-      throws ManifoldCFException, ServiceInterruption, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof java.sql.SQLException)
-          throw new ManifoldCFException("Exception doing connector query '"+query+"': "+thr.getMessage(),thr);
-        else if (thr instanceof ManifoldCFException)
-          throw (ManifoldCFException)thr;
-        else if (thr instanceof ServiceInterruption)
-          throw (ServiceInterruption)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else
-          throw (Error)thr;
-      }
-    }
-
-    public WrappedConnection getConnection()
-    {
-      return connection;
-    }
-
-    public Statement getStatement()
-    {
-      return stmt;
-    }
-
-    public ResultSet getResultSet()
-    {
-      return rs;
-    }
-
-    public ResultSetMetaData getResultSetMetaData()
-    {
-      return rsmd;
-    }
-
-    public String[] getColumnNames()
-    {
-      return resultCols;
-    }
-  }
-
-  protected class JDBCPSResultSet implements IDynamicResultSet
-  {
-    protected WrappedConnection connection;
-    protected PreparedStatement ps;
-    protected ResultSet rs;
-    protected ResultSetMetaData rsmd;
-    protected String[] resultCols;
-    protected int maxResults;
-    protected ArrayList params;
-
-    /** Constructor */
-    public JDBCPSResultSet(String query, ArrayList params, int maxResults)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      this.maxResults = maxResults;
-      this.params = params;
-      PreparedStatementQueryThread t = new PreparedStatementQueryThread(query,params);
-      try
-      {
-        t.start();
-        t.finishUp();
-        connection = t.getConnection();
-        ps = t.getPreparedStatement();
-        rs = t.getResultSet();
-        rsmd = t.getResultSetMetaData();
-        resultCols = t.getColumnNames();
-      }
-      catch (InterruptedException e)
-      {
-        cleanupParameters(params);
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-
-    /** Get the next row from the resultset.
-    *@return the immutable row description, or null if there is no such row.
-    */
-    public IDynamicResultRow getNextRow()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (maxResults == -1 || maxResults > 0)
-      {
-        IDynamicResultRow row = readNextResultRowViaThread(rs,rsmd,resultCols);
-        if (row != null && maxResults != -1)
-          maxResults--;
-        return row;
-      }
-      return null;
-    }
-
-    /** Close this resultset.
-    */
-    public void close()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      ManifoldCFException rval = null;
-      Error error = null;
-      RuntimeException rtException = null;
-      if (rs != null)
-      {
-        try
-        {
-          closeResultset(rs);
-        }
-        catch (ServiceInterruption e)
-        {
-        }
-        catch (ManifoldCFException e)
-        {
-          if (rval == null || e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            rval = e;
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          rs = null;
-        }
-      }
-      if (ps != null)
-      {
-        try
-        {
-          closePS(ps);
-        }
-        catch (ServiceInterruption e)
-        {
-        }
-        catch (ManifoldCFException e)
-        {
-          if (rval == null || e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            rval = e;
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          ps = null;
-        }
-      }
-      if (connection != null)
-      {
-        try
-        {
-          JDBCConnectionFactory.releaseConnection(connection);
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          connection = null;
-        }
-      }
-      if (params != null)
-      {
-        try
-        {
-          cleanupParameters(params);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (rval == null || e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            rval = e;
-        }
-        catch (Error e)
-        {
-          error = e;
-        }
-        catch (RuntimeException e)
-        {
-          rtException = e;
-        }
-        finally
-        {
-          params = null;
-        }
-      }
-      if (error != null)
-        throw error;
-      if (rtException != null)
-        throw rtException;
-      if (rval != null)
-        throw rval;
-
-    }
-
-  }
-
-  protected class PreparedStatementQueryThread extends Thread
-  {
-    protected ArrayList params;
-    protected String query;
-
-    protected WrappedConnection connection = null;
-    protected Throwable exception = null;
-    protected PreparedStatement ps = null;
-    protected ResultSet rs = null;
-    protected ResultSetMetaData rsmd = null;
-    protected String[] resultCols = null;
-
-    public PreparedStatementQueryThread(String query, ArrayList params)
-    {
-      super();
-      setDaemon(true);
-      this.query = query;
-      this.params = params;
-    }
-
-    public void run()
-    {
-      try
-      {
-        connection = JDBCConnectionFactory.getConnection(jdbcProvider,driverString,userName,password);
-        ps = connection.getConnection().prepareStatement(query);
-        loadPS(ps, params);
-        rs = ps.executeQuery();
-        rsmd = rs.getMetaData();
-        resultCols = readColumnNames(rsmd,useName);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-        if (rs != null)
-        {
-          try
-          {
-            closeResultset(rs);
-          }
-          catch (ManifoldCFException e2)
-          {
-            if (e2.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              this.exception = e2;
-          }
-          catch (Throwable e2)
-          {
-          }
-          finally
-          {
-            rs = null;
-          }
-        }
-        if (ps != null)
-        {
-          try
-          {
-            closePS(ps);
-          }
-          catch (ManifoldCFException e2)
-          {
-            if (e2.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              this.exception = e2;
-          }
-          catch (Throwable e2)
-          {
-          }
-          finally
-          {
-            ps = null;
-          }
-        }
-        if (connection != null)
-        {
-          JDBCConnectionFactory.releaseConnection(connection);
-          connection = null;
-        }
-      }
-    }
-
-    public void finishUp()
-      throws ManifoldCFException, ServiceInterruption, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        // Cleanup of parameters happens even if exception doing query
-        cleanupParameters(params);
-        if (thr instanceof java.sql.SQLException)
-          throw new ManifoldCFException("Exception doing connector query '"+query+"': "+thr.getMessage(),thr);
-        else if (thr instanceof ManifoldCFException)
-          throw (ManifoldCFException)thr;
-        else if (thr instanceof ServiceInterruption)
-          throw (ServiceInterruption)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else
-          throw (Error)thr;
-      }
-    }
-
-    public WrappedConnection getConnection()
-    {
-      return connection;
-    }
-
-    public PreparedStatement getPreparedStatement()
-    {
-      return ps;
-    }
-
-    public ResultSet getResultSet()
-    {
-      return rs;
-    }
-
-    public ResultSetMetaData getResultSetMetaData()
-    {
-      return rsmd;
-    }
-
-    public String[] getColumnNames()
-    {
-      return resultCols;
-    }
-  }
-
-  /** Dynamic result row implementation */
-  protected static class RDynamicRow extends RRow implements IDynamicResultRow
-  {
-    public RDynamicRow()
-    {
-      super();
-    }
-    
-    /** Close this resultrow.
-    */
-    public void close()
-      throws ManifoldCFException
-    {
-      // Discard everything permanently from the row
-      Iterator<String> columns = getColumns();
-      while (columns.hasNext())
-      {
-        String column = columns.next();
-        Object o = getValue(column);
-        discardDatabaseObject(o);
-      }
-    }
-
-  }
-  
-}
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
deleted file mode 100644
index 765e90c..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.jdbc;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.jdbcpool.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.util.*;
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-import java.util.*;
-
-/** This class creates a connection
-*/
-public class JDBCConnectionFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private static Map<String,String> driverMap;
-
-  private static ConnectionPoolManager _pool = null;
-
-  static
-  {
-    driverMap = new HashMap<String,String>();
-    driverMap.put("oracle:thin:@", "oracle.jdbc.OracleDriver");
-    driverMap.put("postgresql://", "org.postgresql.Driver");
-    driverMap.put("jtds:sqlserver://", "net.sourceforge.jtds.jdbc.Driver");
-    driverMap.put("jtds:sybase://", "net.sourceforge.jtds.jdbc.Driver");
-    driverMap.put("mysql://", "com.mysql.jdbc.Driver");
-    try
-    {
-      _pool = new ConnectionPoolManager(120,false);
-    }
-    catch (Exception e)
-    {
-      System.err.println("Can't set up pool");
-      e.printStackTrace(System.err);
-    }
-  }
-
-  private JDBCConnectionFactory()
-  {
-  }
-
-  /** Convert various connection parameters to a JDBC connection string, used in conjunction with the
-  * provider name.
-  */
-  public static String getJDBCDriverString(String providerName, String host, String database, String rawDriverString)
-  {
-    if (rawDriverString != null && rawDriverString.length() > 0)
-      return rawDriverString;
-
-    if (database.length() == 0)
-      database = "_root_";
-
-    String instanceName = null;
-    // Special for MSSQL: Allow database spec to contain an instance name too, in form:
-    // <instance>/<database>
-    if (providerName.startsWith("jtds:"))
-    {
-      int slashIndex = database.indexOf("/");
-      if (slashIndex != -1)
-      {
-        instanceName = database.substring(0,slashIndex);
-        database = database.substring(slashIndex+1);
-      }
-    }
-
-    return host + "/" + database + ((instanceName==null)?"":";instance="+instanceName);
-  }
-  
-  public static WrappedConnection getConnection(String providerName, String jdbcDriverString, String userName, String password)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String driverClassName = driverMap.get(providerName);
-    if (driverClassName == null)
-      throw new ManifoldCFException("Unrecognized jdbc provider: '"+providerName+"'");
-
-    String dburl = "jdbc:" + providerName + jdbcDriverString;
-    if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("JDBC: The connect string is '"+dburl+"'");
-    try
-    {
-      // Hope for a connection now
-      if (_pool != null)
-      {
-        // Build a unique string to identify the pool.  This has to include
-        // the database and host at a minimum.
-
-        // Provider is part of the pool key, so that the pools can distinguish between different databases
-        String poolKey = providerName + "/" + jdbcDriverString;
-
-        // Better include the credentials on the pool key, or we won't be able to change those and have it build new connections
-        // The password value is SHA-1 hashed, because the pool driver reports the password in many exceptions and we don't want it
-        // to be displayed.
-        poolKey += "/" + userName + "/" + ManifoldCF.hash(password);
-
-        ConnectionPool cp;
-        synchronized (_pool)
-        {
-          cp = _pool.getPool(poolKey);
-          if (cp == null)
-          {
-            // Register the driver here
-            Class.forName(driverClassName);
-            //System.out.println("Class name '"+driverClassName+"'; URL = '"+dburl+"'");
-            cp =_pool.addAlias(poolKey, driverClassName, dburl,
-              userName, password, 30, 300000L);
-          }
-        }
-        return cp.getConnection();
-      }
-      else
-        throw new ManifoldCFException("Can't get connection since pool driver did not initialize properly");
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-    catch (java.sql.SQLException e)
-    {
-      e.printStackTrace();
-      // Unfortunately, the connection pool manager manages to eat all actual connection setup errors.  This makes it very hard to figure anything out
-      // when something goes wrong.  So, we try again, going directly this time as a means of getting decent error feedback.
-      try
-      {
-        if (userName != null && userName.length() > 0)
-        {
-          DriverManager.getConnection(dburl, userName, password).close();
-        }
-        else
-        {
-          DriverManager.getConnection(dburl).close();
-        }
-      }
-      catch (java.sql.SQLException e2)
-      {
-        throw new ManifoldCFException("Error getting connection: "+e2.getMessage(),e2,ManifoldCFException.SETUP_ERROR);
-      }
-      // By definition, this must be a service interruption, because the direct route in setting up the connection succeeded.
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Error getting connection: "+e.getMessage(),e,currentTime + 300000L,currentTime + 6 * 60 * 60000L,-1,true);
-    }
-    catch (java.lang.ClassNotFoundException e)
-    {
-      throw new ManifoldCFException("Driver class not found: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-    catch (java.lang.InstantiationException e)
-    {
-      throw new ManifoldCFException("Driver class not instantiable: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-    catch (java.lang.IllegalAccessException e)
-    {
-      throw new ManifoldCFException("Driver class not accessible: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-  }
-
-  public static void releaseConnection(WrappedConnection c)
-  {
-    c.release();
-  }
-
-}
-
diff --git a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java b/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java
deleted file mode 100644
index 8b5f50e..0000000
--- a/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* $Id: JDBCConstants.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.jdbc;
-
-/** These are the constant strings needed by the Oracle connector.
-*/
-public class JDBCConstants
-{
-  public static final String _rcsid = "@(#)$Id: JDBCConstants.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The jdbc provider parameter */
-  public static String providerParameter = "JDBC Provider";
-  /** The column interrogation method name parameter */
-  public static String methodParameter = "JDBC column access method";
-  /** The host machine config parameter */
-  public static String hostParameter = "Host";
-  /** The database name config parameter */
-  public static String databaseNameParameter = "Database name";
-  /** The raw configuration string */
-  public static String driverStringParameter = "Raw driver string";
-  /** The user name config parameter */
-  public static String databaseUserName = "User name";
-  /** The password config parameter */
-  public static String databasePassword = "Password";
-
-  /** The node containing the identifier query */
-  public static String idQueryNode = "idquery";
-  /** The node containing the version query */
-  public static String versionQueryNode = "versionquery";
-  /** The node containing the process query */
-  public static String dataQueryNode = "dataquery";
-  /** The node containing the acl query */
-  public static String aclQueryNode = "aclquery";
-  /** The node containing an attribute query */
-  public static String attributeQueryNode = "attrquery";
-  /** The attribute name for an attribute query */
-  public static String attributeName = "attributename";
-
-  /** The name of the id return column */
-  public static String idReturnColumnName = "lcf__id";
-  /** The name of the version return column */
-  public static String versionReturnColumnName = "lcf__version";
-  /** The name of the url return column */
-  public static String urlReturnColumnName = "lcf__url";
-  /** The name of the data return column */
-  public static String dataReturnColumnName = "lcf__data";
-  /** The name of the content type return column */
-  public static String contentTypeReturnColumnName = "lcf__contenttype";
-  /** The name of the token return column */
-  public static String tokenReturnColumnName = "lcf__token";
-  
-  /** The name of the id return variable */
-  public static String idReturnVariable = "IDCOLUMN";
-  /** The name of the version return variable */
-  public static String versionReturnVariable = "VERSIONCOLUMN";
-  /** The name of the url return variable */
-  public static String urlReturnVariable = "URLCOLUMN";
-  /** The name of the data return variable */
-  public static String dataReturnVariable = "DATACOLUMN";
-  /** The name of the content type return variable */
-  public static String contentTypeReturnVariable = "CONTENTTYPE";
-  /** The name of the start time variable */
-  public static String startTimeVariable = "STARTTIME";
-  /** The name of the end time variable */
-  public static String endTimeVariable = "ENDTIME";
-  /** The name of the id list */
-  public static String idListVariable = "IDLIST";
-  /** The name of token return variable */
-  public static String tokenReturnVariable = "TOKENCOLUMN";
-
-  /** JDBCAuthority */
-  /** Query returning user Id parameter name */
-  public static String databaseUserIdQuery = "User Id Query";
-  /** Query returning user tokens parameter name */
-  public static String databaseTokensQuery = "User Tokens Query";
-  /** The name of the user name variable */
-  public static String userNameVariable = "USERNAME";
-  /** The name of the user id variable */
-  public static String userIDVariable = "UID";
-}
-
-
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_en_US.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_en_US.properties
deleted file mode 100644
index 241079b..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_en_US.properties
+++ /dev/null
@@ -1,38 +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.
-
-JDBCAuthority.DatabaseType=Database Type
-JDBCAuthority.AccessMethod=Access Method
-JDBCAuthority.ByName=by name
-JDBCAuthority.ByLabel=by label
-JDBCAuthority.Server=Server
-JDBCAuthority.Credentials=Credentials
-JDBCAuthority.DatabaseType2=Database type:
-JDBCAuthority.DatabaseHostAndPort=Database host and port:
-JDBCAuthority.DatabaseServiceNameOrInstanceDatabase=Database service name or instance/database:
-JDBCAuthority.RawDatabaseConnectString=Raw database connect string:
-JDBCAuthority.UserName=User name:
-JDBCAuthority.Password=Password:
-JDBCAuthority.Parameters=Parameters:
-JDBCAuthority.Queries=Queries
-JDBCAuthority.UserIdQuery=User ID query:
-JDBCAuthority.TokenQuery=Authorization tokens query:
-JDBCAuthority.returnUserIdOrEmptyResultset=(return user id if user exists or empty resultset)
-JDBCAuthority.returnTokensForUser=(return authorization tokens for user)
-JDBCAuthority.NoAccessTokensPresent=No access tokens present
-JDBCAuthority.NoAccessTokensSpecified=No access tokens specified
-JDBCAuthority.PleaseFillInADatabaseServerName=Please fill in a database server name
-JDBCAuthority.PleaseFillInTheNameOfTheDatabase=Please fill in the name of the database
-JDBCAuthority.PleaseSupplyTheDatabaseUsernameForThisConnection=Please supply the database username for this connection
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_es_ES.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_es_ES.properties
deleted file mode 100644
index f6b4a55..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_es_ES.properties
+++ /dev/null
@@ -1,38 +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.
-
-JDBCAuthority.DatabaseType=Tipo de base de datos
-JDBCAuthority.AccessMethod=Método de acceso
-JDBCAuthority.ByName=por nombre
-JDBCAuthority.ByLabel=por etiqueta
-JDBCAuthority.Server=Server
-JDBCAuthority.Credentials=Credenciales
-JDBCAuthority.DatabaseType2=tipo de base de datos
-JDBCAuthority.DatabaseHostAndPort=Base de datos de host y el puerto
-JDBCAuthority.DatabaseServiceNameOrInstanceDatabase=Base de datos el nombre del servicio o instancia base de datos
-JDBCAuthority.RawDatabaseConnectString=Base de datos RAW cadena de conexión:
-JDBCAuthority.UserName=Nombre de usuario:
-JDBCAuthority.Password=Password:
-JDBCAuthority.Parameters=Parámetros:
-JDBCAuthority.Queries=consultas
-JDBCAuthority.UserIdQuery=Usuario consulta ID:
-JDBCAuthority.TokenQuery=Autorización fichas de consulta:
-JDBCAuthority.returnUserIdOrEmptyResultset=(volver Identificación del usuario si existe usuario o conjunto de resultados vacío)
-JDBCAuthority.returnTokensForUser=(autorización de devolución fichas de usuario)
-JDBCAuthority.NoAccessTokensPresent=No hay tokens de acceso actuales
-JDBCAuthority.NoAccessTokensSpecified=No hay tokens de acceso especificados
-JDBCAuthority.PleaseFillInADatabaseServerName=Por favor, rellene un nombre de servidor de base de datos
-JDBCAuthority.PleaseFillInTheNameOfTheDatabase=Por favor escriba el nombre de la base de datos
-JDBCAuthority.PleaseSupplyTheDatabaseUsernameForThisConnection=Por favor, facilite el nombre de usuario de base de datos para esta conexión
\ No newline at end of file
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_ja_JP.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_ja_JP.properties
deleted file mode 100644
index 3dd4986..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_ja_JP.properties
+++ /dev/null
@@ -1,38 +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.
-
-JDBCAuthority.DatabaseType=データベースタイプ
-JDBCAuthority.AccessMethod=アクセス方式
-JDBCAuthority.ByName=by name
-JDBCAuthority.ByLabel=by label
-JDBCAuthority.Server=サーバ
-JDBCAuthority.Credentials=証明書
-JDBCAuthority.DatabaseType2=データベースタイプ:
-JDBCAuthority.DatabaseHostAndPort=データベースホスト/ポート:
-JDBCAuthority.DatabaseServiceNameOrInstanceDatabase=データベースサービス名又はインスタンス/データベース:
-JDBCAuthority.RawDatabaseConnectString=Raw database connect string:
-JDBCAuthority.UserName=ユーザ名:
-JDBCAuthority.Password=パスワード:
-JDBCAuthority.Parameters=引数:
-JDBCAuthority.Queries=クエリ
-JDBCAuthority.UserIdQuery=ユーザIDクエリ:
-JDBCAuthority.TokenQuery=認証トークンクエリ:
-JDBCAuthority.returnUserIdOrEmptyResultset=(return user id if user exists or empty resultset)
-JDBCAuthority.returnTokensForUser=(return authorization tokens for user)
-JDBCAuthority.NoAccessTokensPresent=No access tokens present
-JDBCAuthority.NoAccessTokensSpecified=No access tokens specified
-JDBCAuthority.PleaseFillInADatabaseServerName=データベースサーバ名を入力してください
-JDBCAuthority.PleaseFillInTheNameOfTheDatabase=データベース名を入力してください
-JDBCAuthority.PleaseSupplyTheDatabaseUsernameForThisConnection=このコネクションに対するデータベースユーザ名を提供してください
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_zh_CN.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_zh_CN.properties
deleted file mode 100644
index 9609294..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jdbc/common_zh_CN.properties
+++ /dev/null
@@ -1,38 +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.
-
-JDBCAuthority.DatabaseType=数据库类型
-JDBCAuthority.AccessMethod=访问方式
-JDBCAuthority.ByName=按名称
-JDBCAuthority.ByLabel=按标签
-JDBCAuthority.Server=服务器
-JDBCAuthority.Credentials=凭证
-JDBCAuthority.DatabaseType2=数据库类型:
-JDBCAuthority.DatabaseHostAndPort=数据库主机/端口:
-JDBCAuthority.DatabaseServiceNameOrInstanceDatabase=数据库服务名或实例/数据库:
-JDBCAuthority.RawDatabaseConnectString=原始数据库连接字符串:
-JDBCAuthority.UserName=用户名:
-JDBCAuthority.Password=密码:
-JDBCAuthority.Parameters=参数:
-JDBCAuthority.Queries=查询
-JDBCAuthority.UserIdQuery=用户ID查询:
-JDBCAuthority.TokenQuery=证书令牌查询:
-JDBCAuthority.returnUserIdOrEmptyResultset=(用户存在则返回用户ID,否则返回空结果集)
-JDBCAuthority.returnTokensForUser=(返回用户的授权令牌)
-JDBCAuthority.NoAccessTokensPresent=访问令牌不存在
-JDBCAuthority.NoAccessTokensSpecified=访问令牌未指定
-JDBCAuthority.PleaseFillInADatabaseServerName=请输入数据库服务器名
-JDBCAuthority.PleaseFillInTheNameOfTheDatabase=请输入数据库名
-JDBCAuthority.PleaseSupplyTheDatabaseUsernameForThisConnection=请输入此连接的数据库用户名
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_en_US.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_en_US.properties
deleted file mode 100644
index 24d5580..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_en_US.properties
+++ /dev/null
@@ -1,74 +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.
-
-JDBCConnector.DatabaseType=Database Type
-JDBCConnector.AccessMethod=Access Method
-JDBCConnector.ByName=by name
-JDBCConnector.ByLabel=by label
-JDBCConnector.Server=Server
-JDBCConnector.Credentials=Credentials
-JDBCConnector.DatabaseType2=Database type:
-JDBCConnector.DatabaseHostAndPort=Database host and port:
-JDBCConnector.DatabaseServiceNameOrInstanceDatabase=Database service name or instance/database:
-JDBCConnector.RawDatabaseConnectString=Raw database connect string:
-JDBCConnector.UserName=User name:
-JDBCConnector.Password=Password:
-JDBCConnector.Parameters=Parameters:
-JDBCConnector.TypeInAnAccessToken=Type in an access token
-JDBCConnector.Queries=Queries
-JDBCConnector.Security=Security
-JDBCConnector.SeedingQuery=Seeding query:
-JDBCConnector.VersionCheckQuery=Version check query:
-JDBCConnector.returnIdsAndVersionsForASetOfDocuments=(return ids and versions for a set of documents;
-JDBCConnector.leaveBlankIfNoVersioningCapability=leave blank if no versioning capability)
-JDBCConnector.DataQuery=Data query:
-JDBCConnector.returnIdsUrlsAndDataForASetOfDocuments=(return ids, urls, and data for a set of documents)
-JDBCConnector.returnIdsThatNeedToBeChecked=(return ids that need to be checked)
-JDBCConnector.NoAccessTokensPresent=No access tokens present
-JDBCConnector.NoAccessTokensSpecified=No access tokens specified
-JDBCConnector.PleaseFillInADatabaseServerName=Please fill in a database server name
-JDBCConnector.PleaseFillInTheNameOfTheDatabase=Please fill in the name of the database
-JDBCConnector.PleaseSupplyTheDatabaseUsernameForThisConnection=Please supply the database username for this connection
-JDBCConnector.EnterASeedingQuery=Enter a seeding query
-JDBCConnector.MustReturnIDCOLUMNInTheResult=Must return $(IDCOLUMN) in the result.  Example: SELECT idfield AS $(IDCOLUMN) FROM ...
-JDBCConnector.MustReturnVERSIONCOLUMNInTheResult=Must return $(VERSIONCOLUMN) in the result, containing the document version.  Example: SELECT versionfield AS $(VERSIONCOLUMN), ...
-JDBCConnector.MustUseIDLISTInWHEREClause=Must use $(IDLIST) in WHERE clause.  Example: SELECT ... WHERE idfield IN $(IDLIST) ...
-JDBCConnector.EnterADataQuery=Enter a data query
-JDBCConnector.MustReturnIDCOLUMNInTheResult2=Must return $(IDCOLUMN) in the result.  Example: SELECT idfield AS $(IDCOLUMN), ...
-JDBCConnector.MustReturnURLCOLUMNInTheResult=Must return $(URLCOLUMN) in the result, containing the url to use to reach the document.  Example: SELECT urlfield AS $(URLCOLUMN), ...
-JDBCConnector.MustReturnDATACOLUMNInTheResult=Must return $(DATACOLUMN) in the result, containing the document data.  Example: SELECT datafield AS $(DATACOLUMN), ...
-JDBCConnector.MustReturnTOKENCOLUMNInTheResult=Must return $(TOKENCOLUMN) in the result, containing the access token.  Example: SELECT actoken AS $(TOKENCOLUMN), ...
-JDBCConnector.DeleteToken=Delete token #
-JDBCConnector.AddAccessToken=Add access token
-JDBCConnector.SeedingQuery=Seeding query:
-JDBCConnector.VersionCheckQuery=Version check query:
-JDBCConnector.DataQuery=Data query:
-JDBCConnector.AccessTokens=Access tokens:
-JDBCConnector.AccessTokenQuery=Access token query:
-JDBCConnector.returnIdsAndAccessTokensForASetOfDocuments=(return ids and access tokens for a set of documents;
-JDBCConnector.leaveBlankIfNoSecurityCapability=leave blank if no security capability)
-JDBCConnector.SecurityColon=Security:
-JDBCConnector.Enabled=Enabled
-JDBCConnector.Disabled=Disabled
-JDBCConnector.AttributeQueries=Attribute queries:
-JDBCConnector.AttributeName=Attribute name
-JDBCConnector.AttributeQuery=Attribute query
-JDBCConnector.Delete=Delete
-JDBCConnector.DeleteAttributeQueryNumber=Delete attribute query #
-JDBCConnector.NoAttributeQueries=No attribute queries
-JDBCConnector.Add=Add
-JDBCConnector.AddAttribute=Add attribute
-JDBCConnector.TypeInAnAttributeName=Type in an attribute name
-JDBCConnector.AttributeQueryCannotBeNull=Attribute query must not be null
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_es_ES.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_es_ES.properties
deleted file mode 100644
index ecbd599..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_es_ES.properties
+++ /dev/null
@@ -1,74 +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.
-
-JDBCConnector.DatabaseType=Tipo de base de datos
-JDBCConnector.AccessMethod=Método de acceso
-JDBCConnector.ByName=por nombre
-JDBCConnector.ByLabel=por etiqueta
-JDBCConnector.Server=Servidor
-JDBCConnector.Credentials=Credenciales
-JDBCConnector.DatabaseType2=Tipo de base de datos:
-JDBCConnector.DatabaseHostAndPort=Base de datos de host y el puerto:
-JDBCConnector.DatabaseServiceNameOrInstanceDatabase=Base de datos el nombre del servicio o instancia / base de datos:
-JDBCConnector.RawDatabaseConnectString=Base de datos RAW cadena de conexión:
-JDBCConnector.UserName=nombre de usuario:
-JDBCConnector.Password=Contraseña:
-JDBCConnector.Parameters=Paràmetros:
-JDBCConnector.TypeInAnAccessToken=Escriba un token de acceso
-JDBCConnector.Queries=consultas
-JDBCConnector.Security=Seguridad
-JDBCConnector.SeedingQuery=consulta Siembra:
-JDBCConnector.VersionCheckQuery=Pregunta de comprobación de versión:
-JDBCConnector.returnIdsAndVersionsForASetOfDocuments=(devolver los identificadores y las versiones para un conjunto de documentos;
-JDBCConnector.leaveBlankIfNoVersioningCapability=salir si hay capacidad de versiones en blanco)
-JDBCConnector.DataQuery=consulta de datos:
-JDBCConnector.returnIdsUrlsAndDataForASetOfDocuments=(volver identificadores , urls , y los datos de un conjunto de documentos)
-JDBCConnector.returnIdsThatNeedToBeChecked=(volver ids que necesitan ser comprobado)
-JDBCConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-JDBCConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-JDBCConnector.PleaseFillInADatabaseServerName=Por favor, rellene un nombre de servidor de base de datos
-JDBCConnector.PleaseFillInTheNameOfTheDatabase=Por favor escriba el nombre de la base de datos
-JDBCConnector.PleaseSupplyTheDatabaseUsernameForThisConnection=Por favor, facilite el nombre de usuario de base de datos para esta conexión
-JDBCConnector.EnterASeedingQuery=Escriba una consulta de siembra
-JDBCConnector.MustReturnIDCOLUMNInTheResult=Debe volver $(ID COLUMNA) en el resultado.  Ejemplo: SELECCIONAR campo ID AS $(ID DE COLUMNA) DE ...
-JDBCConnector.MustReturnVERSIONCOLUMNInTheResult=Debe volver $(COLUMNA DE VERSIÓN) en el resultado, que contiene la versión del documento.  Ejemplo: SELECCIONAR campo de versión AS $(COLUMNA DE VERSIÓN), ...
-JDBCConnector.MustUseIDLISTInWHEREClause=Debe usar $(LISTA ID) en DONDE cláusula.  Ejemplo: SELECCIONAR ... DÓNDE campo id IN $(LISTA ID) ...
-JDBCConnector.EnterADataQuery=Escriba una consulta de datos
-JDBCConnector.MustReturnIDCOLUMNInTheResult2=Debe volver $(ID COLUMNA) en el resultado.  Ejemplo: SELECCIONAR campo id AS $(ID DE COLUMNA), ...
-JDBCConnector.MustReturnURLCOLUMNInTheResult=Debe volver $(URL COLUMNA) en el resultado, que contiene la URL a utilizar para alcanzar el documento.  Ejemplo: SELECCIONAR campo url AS $(URL COLUMNA), ...
-JDBCConnector.MustReturnDATACOLUMNInTheResult=Debe volver $(DATA COLUMNA) en el resultado, que contiene los datos del documento.  Ejemplo: SELECCIONAR campo de datos AS $(DATOS DE COLUMNA), ...
-JDBCConnector.MustReturnTOKENCOLUMNInTheResult=Debe volver $(TOKEN COLUMNA) en el resultado, que contiene el token de acceso.  Ejemplo: SELECCIONAR ac token AS $(TOKEN COLUMNA), ...
-JDBCConnector.DeleteToken=eliminar token #
-JDBCConnector.AddAccessToken=Añadir token de acceso
-JDBCConnector.SeedingQuery=consulta Siembra:
-JDBCConnector.VersionCheckQuery=Verificaciòn de la versiòn:
-JDBCConnector.DataQuery=consulta de datos:
-JDBCConnector.AccessTokens=Tokens de acceso:
-JDBCConnector.AccessTokenQuery=Acceso consulta token:
-JDBCConnector.returnIdsAndAccessTokensForASetOfDocuments=(volver identificadores y tokens de acceso para un conjunto de documentos;
-JDBCConnector.leaveBlankIfNoSecurityCapability=salir si no hay capacidad de seguridad en blanco)
-JDBCConnector.SecurityColon=Seguridad:
-JDBCConnector.Enabled=Activado
-JDBCConnector.Disabled=Imposibilitado
-JDBCConnector.AttributeQueries=Attribute queries:
-JDBCConnector.AttributeName=Attribute name
-JDBCConnector.AttributeQuery=Attribute query
-JDBCConnector.Delete=Delete
-JDBCConnector.DeleteAttributeQueryNumber=Delete attribute query #
-JDBCConnector.NoAttributeQueries=No attribute queries
-JDBCConnector.Add=Add
-JDBCConnector.AddAttribute=Add attribute
-JDBCConnector.TypeInAnAttributeName=Type in an attribute name
-JDBCConnector.AttributeQueryCannotBeNull=Attribute query must not be null
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_ja_JP.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_ja_JP.properties
deleted file mode 100644
index 581017e..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_ja_JP.properties
+++ /dev/null
@@ -1,74 +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.
-
-JDBCConnector.DatabaseType=データベースタイプ
-JDBCConnector.AccessMethod=アクセス方式
-JDBCConnector.ByName=by name
-JDBCConnector.ByLabel=by label
-JDBCConnector.Server=サーバ
-JDBCConnector.Credentials=証明書
-JDBCConnector.DatabaseType2=データベースタイプ:
-JDBCConnector.DatabaseHostAndPort=データベースホスト/ポート:
-JDBCConnector.DatabaseServiceNameOrInstanceDatabase=データベースサービス名又はインスタンス/データベース:
-JDBCConnector.RawDatabaseConnectString=Raw database connect string:
-JDBCConnector.UserName=ユーザ名:
-JDBCConnector.Password=パスワード:
-JDBCConnector.Parameters=引数:
-JDBCConnector.TypeInAnAccessToken=アクセストークンを入力してください
-JDBCConnector.Queries=クエリ
-JDBCConnector.Security=セキュリティ
-JDBCConnector.SeedingQuery=シードクエリー:
-JDBCConnector.VersionCheckQuery=バージョンチェッククエリー:
-JDBCConnector.returnIdsAndVersionsForASetOfDocuments=(コンテンツのIDとバージョンを取得
-JDBCConnector.leaveBlankIfNoVersioningCapability=バージョン管理を行っていない場合は空白)
-JDBCConnector.DataQuery=データクエリー:
-JDBCConnector.returnIdsUrlsAndDataForASetOfDocuments=(コンテンツのID、URL、データを取得)
-JDBCConnector.returnIdsThatNeedToBeChecked=(チェックするIDを取得)
-JDBCConnector.NoAccessTokensPresent=アクセストークンが存在しません
-JDBCConnector.NoAccessTokensSpecified=アクセストークンが未定義です
-JDBCConnector.PleaseFillInADatabaseServerName=データベースサーバ名を入力してください
-JDBCConnector.PleaseFillInTheNameOfTheDatabase=データベース名を入力しうてください
-JDBCConnector.PleaseSupplyTheDatabaseUsernameForThisConnection=コネクション用のデータベースユーザ名を入力してください
-JDBCConnector.EnterASeedingQuery=シードクエリーを入力してください
-JDBCConnector.MustReturnIDCOLUMNInTheResult=結果に$(IDCOLUMN)を返す必要があります。 例:SELECT idfield AS $(IDCOLUMN) FROM ...
-JDBCConnector.MustReturnVERSIONCOLUMNInTheResult=結果にコンテンツのバージョン情報を含む$(VERSIONCOLUMN)を返す必要があります。 例:SELECT versionfield AS $(VERSIONCOLUMN), ...
-JDBCConnector.MustUseIDLISTInWHEREClause=WHERE句に$(IDLIST)を使ってください。 例:SELECT ... WHERE idfield IN $(IDLIST) ...
-JDBCConnector.EnterADataQuery=データクエリーを入力してください
-JDBCConnector.MustReturnIDCOLUMNInTheResult2=結果に$(IDCOLUMN)を返す必要があります。 例:SELECT idfield AS $(IDCOLUMN), ...
-JDBCConnector.MustReturnURLCOLUMNInTheResult=結果にコンテンツを取得するURIを含む$(URLCOLUMN)を返す必要があります。 例:SELECT urlfield AS $(URLCOLUMN), ...
-JDBCConnector.MustReturnDATACOLUMNInTheResult=結果にコンテンツ内容を含む$(DATACOLUMN)を返す必要があります。 例:SELECT datafield AS $(DATACOLUMN), ...
-JDBCConnector.MustReturnTOKENCOLUMNInTheResult=Must return $(TOKENCOLUMN) in the result, containing the access token.  Example: SELECT actoken AS $(TOKENCOLUMN), ...
-JDBCConnector.DeleteToken=トークンを削除: #
-JDBCConnector.AddAccessToken=アクセストークンを追加
-JDBCConnector.SeedingQuery=シードクエリー:
-JDBCConnector.VersionCheckQuery=バージョンチェッククエリー:
-JDBCConnector.DataQuery=データクエリー:
-JDBCConnector.AccessTokens=アクセストークン:
-JDBCConnector.AccessTokenQuery=Access token query:
-JDBCConnector.returnIdsAndAccessTokensForASetOfDocuments=(return ids and access tokens for a set of documents;
-JDBCConnector.leaveBlankIfNoSecurityCapability=leave blank if no security capability)
-JDBCConnector.SecurityColon=Security:
-JDBCConnector.Enabled=Enabled
-JDBCConnector.Disabled=Disabled
-JDBCConnector.AttributeQueries=Attribute queries:
-JDBCConnector.AttributeName=Attribute name
-JDBCConnector.AttributeQuery=Attribute query
-JDBCConnector.Delete=Delete
-JDBCConnector.DeleteAttributeQueryNumber=Delete attribute query #
-JDBCConnector.NoAttributeQueries=No attribute queries
-JDBCConnector.Add=Add
-JDBCConnector.AddAttribute=Add attribute
-JDBCConnector.TypeInAnAttributeName=Type in an attribute name
-JDBCConnector.AttributeQueryCannotBeNull=Attribute query must not be null
diff --git a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_zh_CN.properties b/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_zh_CN.properties
deleted file mode 100644
index 92985e1..0000000
--- a/connectors/jdbc/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jdbc/common_zh_CN.properties
+++ /dev/null
@@ -1,74 +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.
-
-JDBCConnector.DatabaseType=数据库类型
-JDBCConnector.AccessMethod=访问方式
-JDBCConnector.ByName=按名称
-JDBCConnector.ByLabel=按标签
-JDBCConnector.Server=服务器
-JDBCConnector.Credentials=凭证
-JDBCConnector.DatabaseType2=数据库类型: 
-JDBCConnector.DatabaseHostAndPort=数据库主机/端口: 
-JDBCConnector.DatabaseServiceNameOrInstanceDatabase=数据库服务名或实例/数据库: 
-JDBCConnector.RawDatabaseConnectString=原始数据库连接字符串:
-JDBCConnector.UserName=用户名: 
-JDBCConnector.Password=密码: 
-JDBCConnector.Parameters=参数: 
-JDBCConnector.TypeInAnAccessToken=请输入访问令牌
-JDBCConnector.Queries=查询
-JDBCConnector.Security=安全
-JDBCConnector.SeedingQuery=播种查询: 
-JDBCConnector.VersionCheckQuery=版本检查查询: 
-JDBCConnector.returnIdsAndVersionsForASetOfDocuments=(返回文档集的ID和版本
-JDBCConnector.leaveBlankIfNoVersioningCapability=若无版本管理则置空)
-JDBCConnector.DataQuery=数据查询: 
-JDBCConnector.returnIdsUrlsAndDataForASetOfDocuments=(返回文档集的ID,URL,数据)
-JDBCConnector.returnIdsThatNeedToBeChecked=(返回检查对象ID)
-JDBCConnector.NoAccessTokensPresent=访问令牌不存在
-JDBCConnector.NoAccessTokensSpecified=访问令牌未指定
-JDBCConnector.PleaseFillInADatabaseServerName=请输入数据库服务器名
-JDBCConnector.PleaseFillInTheNameOfTheDatabase=请输入数据库名
-JDBCConnector.PleaseSupplyTheDatabaseUsernameForThisConnection=请输入此连接的数据库用户名
-JDBCConnector.EnterASeedingQuery=请输入播种查询
-JDBCConnector.MustReturnIDCOLUMNInTheResult=结果需要返回$(IDCOLUMN)。 例: SELECT idfield AS $(IDCOLUMN) FROM ...
-JDBCConnector.MustReturnVERSIONCOLUMNInTheResult=返回结果必须包含文档版本信息$(VERSIONCOLUMN)。 例: SELECT versionfield AS $(VERSIONCOLUMN), ...
-JDBCConnector.MustUseIDLISTInWHEREClause=WHERE语句务必使用$(IDLIST)。 例: SELECT ... WHERE idfield IN $(IDLIST) ...
-JDBCConnector.EnterADataQuery=请输入数据查询
-JDBCConnector.MustReturnIDCOLUMNInTheResult2=结果需要返回$(IDCOLUMN)。 例: SELECT idfield AS $(IDCOLUMN), ...
-JDBCConnector.MustReturnURLCOLUMNInTheResult=返回结果必须包含取得文档用URI$(URLCOLUMN)。 例: SELECT urlfield AS $(URLCOLUMN), ...
-JDBCConnector.MustReturnDATACOLUMNInTheResult=返回结果必须包含文档内容$(DATACOLUMN)。 例: SELECT datafield AS $(DATACOLUMN), ...
-JDBCConnector.MustReturnTOKENCOLUMNInTheResult=Must return $(TOKENCOLUMN) in the result, containing the access token.  Example: SELECT actoken AS $(TOKENCOLUMN), ...
-JDBCConnector.DeleteToken=删除令牌:  #
-JDBCConnector.AddAccessToken=添加访问令牌
-JDBCConnector.SeedingQuery=播种查询: 
-JDBCConnector.VersionCheckQuery=版本检查查询: 
-JDBCConnector.DataQuery=数据查询: 
-JDBCConnector.AccessTokens=访问令牌: 
-JDBCConnector.AccessTokenQuery=Access token query:
-JDBCConnector.returnIdsAndAccessTokensForASetOfDocuments=(return ids and access tokens for a set of documents;
-JDBCConnector.leaveBlankIfNoSecurityCapability=leave blank if no security capability)
-JDBCConnector.SecurityColon=Security:
-JDBCConnector.Enabled=Enabled
-JDBCConnector.Disabled=Disabled
-JDBCConnector.AttributeQueries=Attribute queries:
-JDBCConnector.AttributeName=Attribute name
-JDBCConnector.AttributeQuery=Attribute query
-JDBCConnector.Delete=Delete
-JDBCConnector.DeleteAttributeQueryNumber=Delete attribute query #
-JDBCConnector.NoAttributeQueries=No attribute queries
-JDBCConnector.Add=Add
-JDBCConnector.AddAttribute=Add attribute
-JDBCConnector.TypeInAnAttributeName=Type in an attribute name
-JDBCConnector.AttributeQueryCannotBeNull=Attribute query must not be null
diff --git a/connectors/jdbc/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/jdbc/tests/BaseUIHSQLDB.java b/connectors/jdbc/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/jdbc/tests/BaseUIHSQLDB.java
deleted file mode 100644
index b3f040c..0000000
--- a/connectors/jdbc/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/jdbc/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jdbc.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  @Override
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"JDBC Connector"};
-  }
-  
-  @Override
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.jdbc.JDBCConnector"};
-  }
-  
-  @Override
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  @Override
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-  @Override
-  protected String[] getAuthorityNames()
-  {
-    return new String[]{"JDBC Authority"};
-  }
-  
-  @Override
-  protected String[] getAuthorityClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.authorities.authorities.jdbc.JDBCAuthority"};
-  }
-
-}
diff --git a/connectors/jdbc/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/jdbc/tests/NavigationHSQLDBUI.java b/connectors/jdbc/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/jdbc/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 9dea226..0000000
--- a/connectors/jdbc/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/jdbc/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jdbc.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.jdbc.JDBCConnector");
-    testerInstance.clickButton("Continue");
-
-    // Credentials tab
-    testerInstance.clickTab("Credentials");
-    testerInstance.setValue("username", "foo");
-    
-    // Server
-    testerInstance.clickTab("Server");
-
-    // Database Type
-    testerInstance.clickTab("Database Type");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the connector tabs.
-    // Queries
-    testerInstance.clickTab("Queries");
-    
-    // Security
-    testerInstance.clickTab("Security");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-    // Exercise authority UI
-    
-    // Add an authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButton("Add a new authority group");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("groupname");
-    testerInstance.setValue("groupname","MyAuthorityGroup");
-
-    // Save the authority group
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Add an authority
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButton("Add a new connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyAuthorityConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.authorities.authorities.jdbc.JDBCAuthority");
-    testerInstance.selectValue("authoritygroup", "MyAuthorityGroup");
-    testerInstance.clickButton("Continue");
-    
-    // Credentials tab
-    testerInstance.clickTab("Credentials");
-    testerInstance.setValue("username", "foo");
-    
-    // Server
-    testerInstance.clickTab("Server");
-
-    // Database Type
-    testerInstance.clickTab("Database Type");
-
-    // Back to the name tab
-    testerInstance.clickTab("Name");
-    
-    // Now, save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Delete the authority connection
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityGroup");
-    testerInstance.acceptAlert();
-  }
-  
-}
diff --git a/connectors/jdbc/jdbc-drivers/README.txt b/connectors/jdbc/jdbc-drivers/README.txt
deleted file mode 100644
index d52582f..0000000
--- a/connectors/jdbc/jdbc-drivers/README.txt
+++ /dev/null
@@ -1,40 +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.
-
-The jdbc connector can, in theory, work with any JDBC driver that has been
-added into the list it knows about.  The code as granted knows about the following:
-
-Mssql/Sybase (via open-source jtds)
-Postgresql (via an appropriate open-source postgresql JDBC driver)
-Oracle (via a proprietary, but freely downloadable Oracle JDBC driver)
-
-The connector was tested against the following versions of the above:
-
-Oracle: oracle ojdbc5 jdk1.5 and ojdbc6 jdk1.6
-Jtds: version 1.2.2, downloadable from SourceForge
-Postgresql: the debian postgresql driver package for postgresql 8.3.7, aka libpg-java, version 8.2-504-2.
-
-None of these required custom changes.
-
-To build this connector with Oracle support, copy the Oracle JDBC
-driver into the root "lib-proprietary" directory, calling it "ojdbc.jar", before building.
-To build with Mssql/Sybase, copy a version of the jtds driver into that same directory,
-and call it "jtds.jar".  DO NOT COPY JDBC DRIVERS TO THIS DIRECTORY;
-they will not be picked up by ManifoldCF.
-
-Then, build the connector using the normal ant build script.  Further information can be
-found on the "how-to-build-and-deploy.html" documentation page.
-
-
diff --git a/connectors/jdbc/pom.xml b/connectors/jdbc/pom.xml
deleted file mode 100644
index 67931a5..0000000
--- a/connectors/jdbc/pom.xml
+++ /dev/null
@@ -1,360 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-jdbc-connector</artifactId>
-  <name>ManifoldCF - Connectors - JDBC</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/jira/.gitignore b/connectors/jira/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/jira/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/jira/build.xml b/connectors/jira/build.xml
deleted file mode 100644
index d34ceb1..0000000
--- a/connectors/jira/build.xml
+++ /dev/null
@@ -1,44 +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.

--->

-

-<project name="jira" default="all">

-

-    <property environment="env"/>

-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">

-        <isset property="env.MCFDISTPATH"/>

-    </condition>

-    <property name="abs-dist" location="../../dist"/>

-    <condition property="mcf-dist" value="${abs-dist}">

-        <not>

-            <isset property="env.MCFDISTPATH"/>

-        </not>

-    </condition>

-

-    <import file="${mcf-dist}/connector-build.xml"/>

-

-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">

-        <antcall target="general-add-repository-connector">

-            <param name="connector-label" value="Jira"/>

-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.jira.JiraRepositoryConnector"/>

-        </antcall>

-        <antcall target="general-add-authority-connector">

-            <param name="connector-label" value="Jira"/>

-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.jira.JiraAuthorityConnector"/>

-        </antcall>

-    </target>

-

-</project>

diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraAuthorityConnector.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraAuthorityConnector.java
deleted file mode 100644
index fc4b3e9..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraAuthorityConnector.java
+++ /dev/null
@@ -1,674 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-import org.apache.manifoldcf.core.common.*;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Date;
-import java.util.Set;
-import java.util.Iterator;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import java.util.Map.Entry;
-
-/** Jira Authority Connector.  This connector verifies user existence against Jira.
- */
-public class JiraAuthorityConnector extends BaseAuthorityConnector {
-
-  // Configuration tabs
-  private static final String JIRA_SERVER_TAB_PROPERTY = "JiraAuthorityConnector.Server";
-  private static final String JIRA_PROXY_TAB_PROPERTY = "JiraAuthorityConnector.Proxy";
-  
-  // Template names for configuration
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_jira.js";
-  /**
-   * Server tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_jira_server.html";
-  /**
-   * Proxy tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_PROXY = "editConfiguration_jira_proxy.html";
-  
-  /**
-   * Forward to the HTML template to view the configuration parameters
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_jira.html";
-   
-  // Session data
-  protected JiraSession session = null;
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-  
-  // Parameter data
-  protected String jiraprotocol = null;
-  protected String jirahost = null;
-  protected String jiraport = null;
-  protected String jirapath = null;
-  protected String clientid = null;
-  protected String clientsecret = null;
-
-  protected String jiraproxyhost = null;
-  protected String jiraproxyport = null;
-  protected String jiraproxydomain = null;
-  protected String jiraproxyusername = null;
-  protected String jiraproxypassword = null;
-  
-  public JiraAuthorityConnector() {
-    super();
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (session != null) {
-      session.close();
-      session = null;
-      lastSessionFetch = -1L;
-    }
-
-    jiraprotocol = null;
-    jirahost = null;
-    jiraport = null;
-    jirapath = null;
-    clientid = null;
-    clientsecret = null;
-    
-    jiraproxyhost = null;
-    jiraproxyport = null;
-    jiraproxydomain = null;
-    jiraproxyusername = null;
-    jiraproxypassword = null;
-  }
-
-  /**
-   * This method create a new JIRA session for a JIRA
-   * repository, if the repositoryId is not provided in the configuration, the
-   * connector will retrieve all the repositories exposed for this endpoint
-   * the it will start to use the first one.
-   *
-   * @param configParameters is the set of configuration parameters, which in
-   * this case describe the target appliance, basic auth configuration, etc.
-   * (This formerly came out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    jiraprotocol = params.getParameter(JiraConfig.JIRA_PROTOCOL_PARAM);
-    jirahost = params.getParameter(JiraConfig.JIRA_HOST_PARAM);
-    jiraport = params.getParameter(JiraConfig.JIRA_PORT_PARAM);
-    jirapath = params.getParameter(JiraConfig.JIRA_PATH_PARAM);
-    clientid = params.getParameter(JiraConfig.CLIENT_ID_PARAM);
-    clientsecret = params.getObfuscatedParameter(JiraConfig.CLIENT_SECRET_PARAM);
-    
-    jiraproxyhost = params.getParameter(JiraConfig.JIRA_PROXYHOST_PARAM);
-    jiraproxyport = params.getParameter(JiraConfig.JIRA_PROXYPORT_PARAM);
-    jiraproxydomain = params.getParameter(JiraConfig.JIRA_PROXYDOMAIN_PARAM);
-    jiraproxyusername = params.getParameter(JiraConfig.JIRA_PROXYUSERNAME_PARAM);
-    jiraproxypassword = params.getObfuscatedParameter(JiraConfig.JIRA_PROXYPASSWORD_PARAM);
-    
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection
-   * integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-
-  /**
-   * Set up a session
-   */
-  protected JiraSession getSession() throws ManifoldCFException {
-    if (session == null) {
-      // Check for parameter validity
-
-      if (StringUtils.isEmpty(jiraprotocol)) {
-        throw new ManifoldCFException("Parameter " + JiraConfig.JIRA_PROTOCOL_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("JIRA: jiraprotocol = '" + jiraprotocol + "'");
-      }
-
-      if (StringUtils.isEmpty(jirahost)) {
-        throw new ManifoldCFException("Parameter " + JiraConfig.JIRA_HOST_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("JIRA: jirahost = '" + jirahost + "'");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("JIRA: jiraport = '" + jiraport + "'");
-      }
-
-      if (StringUtils.isEmpty(jirapath)) {
-        throw new ManifoldCFException("Parameter " + JiraConfig.JIRA_PATH_PARAM
-            + " required but not set");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("JIRA: jirapath = '" + jirapath + "'");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("JIRA: Clientid = '" + clientid + "'");
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled()) {
-        Logging.authorityConnectors.debug("JIRA: Clientsecret = '" + clientsecret + "'");
-      }
-
-      int portInt;
-      if (jiraport != null && jiraport.length() > 0)
-      {
-        try
-        {
-          portInt = Integer.parseInt(jiraport);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-        }
-      }
-      else
-      {
-        if (jiraprotocol.toLowerCase(Locale.ROOT).equals("http"))
-          portInt = 80;
-        else
-          portInt = 443;
-      }
-
-      int proxyPortInt;
-      if (jiraproxyport != null && jiraproxyport.length() > 0)
-      {
-        try
-        {
-          proxyPortInt = Integer.parseInt(jiraproxyport);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-        }
-      }
-      else
-        proxyPortInt = 8080;
-
-      session = new JiraSession(clientid, clientsecret,
-        jiraprotocol, jirahost, portInt, jirapath,
-        jiraproxyhost, proxyPortInt, jiraproxydomain, jiraproxyusername, jiraproxypassword);
-
-    }
-    lastSessionFetch = System.currentTimeMillis();
-    return session;
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= lastSessionFetch + timeToRelease) {
-      session.close();
-      session = null;
-      lastSessionFetch = -1L;
-    }
-  }
-
-  /**
-   * Fill in a Server tab configuration parameter map for calling a Velocity
-   * template.
-   *
-   * @param newMap is the map to fill in
-   * @param parameters is the current set of configuration parameters
-   */
-  private static void fillInServerConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String jiraprotocol = parameters.getParameter(JiraConfig.JIRA_PROTOCOL_PARAM);
-    String jirahost = parameters.getParameter(JiraConfig.JIRA_HOST_PARAM);
-    String jiraport = parameters.getParameter(JiraConfig.JIRA_PORT_PARAM);
-    String jirapath = parameters.getParameter(JiraConfig.JIRA_PATH_PARAM);
-    String clientid = parameters.getParameter(JiraConfig.CLIENT_ID_PARAM);
-    String clientsecret = parameters.getObfuscatedParameter(JiraConfig.CLIENT_SECRET_PARAM);
-
-    if (jiraprotocol == null)
-      jiraprotocol = JiraConfig.JIRA_PROTOCOL_DEFAULT;
-    if (jirahost == null)
-      jirahost = JiraConfig.JIRA_HOST_DEFAULT;
-    if (jiraport == null)
-      jiraport = JiraConfig.JIRA_PORT_DEFAULT;
-    if (jirapath == null)
-      jirapath = JiraConfig.JIRA_PATH_DEFAULT;
-    
-    if (clientid == null)
-      clientid = JiraConfig.CLIENT_ID_DEFAULT;
-    if (clientsecret == null)
-      clientsecret = JiraConfig.CLIENT_SECRET_DEFAULT;
-    else
-      clientsecret = mapper.mapPasswordToKey(clientsecret);
-
-    newMap.put("JIRAPROTOCOL", jiraprotocol);
-    newMap.put("JIRAHOST", jirahost);
-    newMap.put("JIRAPORT", jiraport);
-    newMap.put("JIRAPATH", jirapath);
-    newMap.put("CLIENTID", clientid);
-    newMap.put("CLIENTSECRET", clientsecret);
-  }
-
-  /**
-   * Fill in a Proxy tab configuration parameter map for calling a Velocity
-   * template.
-   *
-   * @param newMap is the map to fill in
-   * @param parameters is the current set of configuration parameters
-   */
-  private static void fillInProxyConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String jiraproxyhost = parameters.getParameter(JiraConfig.JIRA_PROXYHOST_PARAM);
-    String jiraproxyport = parameters.getParameter(JiraConfig.JIRA_PROXYPORT_PARAM);
-    String jiraproxydomain = parameters.getParameter(JiraConfig.JIRA_PROXYDOMAIN_PARAM);
-    String jiraproxyusername = parameters.getParameter(JiraConfig.JIRA_PROXYUSERNAME_PARAM);
-    String jiraproxypassword = parameters.getObfuscatedParameter(JiraConfig.JIRA_PROXYPASSWORD_PARAM);
-
-    if (jiraproxyhost == null)
-      jiraproxyhost = JiraConfig.JIRA_PROXYHOST_DEFAULT;
-    if (jiraproxyport == null)
-      jiraproxyport = JiraConfig.JIRA_PROXYPORT_DEFAULT;
-
-    if (jiraproxydomain == null)
-      jiraproxydomain = JiraConfig.JIRA_PROXYDOMAIN_DEFAULT;
-    if (jiraproxyusername == null)
-      jiraproxyusername = JiraConfig.JIRA_PROXYUSERNAME_DEFAULT;
-    if (jiraproxypassword == null)
-      jiraproxypassword = JiraConfig.JIRA_PROXYPASSWORD_DEFAULT;
-    else
-      jiraproxypassword = mapper.mapPasswordToKey(jiraproxypassword);
-
-    newMap.put("JIRAPROXYHOST", jiraproxyhost);
-    newMap.put("JIRAPROXYPORT", jiraproxyport);
-    newMap.put("JIRAPROXYDOMAIN", jiraproxydomain);
-    newMap.put("JIRAPROXYUSERNAME", jiraproxyusername);
-    newMap.put("JIRAPROXYPASSWORD", jiraproxypassword);
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIG_FORWARD,paramMap);
-  }
-
-  /**
-   *
-   * Output the configuration header section. This method is called in the
-   * head section of the connector's configuration page. Its purpose is to add
-   * the required tabs to the list, and to output any javascript methods that
-   * might be needed by the configuration editing HTML.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @param tabsArray is an array of tab names. Add to this array any tab
-   * names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-      throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, JIRA_SERVER_TAB_PROPERTY));
-    // Add the Proxy tab
-    tabsArray.add(Messages.getString(locale, JIRA_PROXY_TAB_PROPERTY));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-        
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_HEADER_FORWARD,paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException {
-
-
-    // Call the Velocity templates for each tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    fillInProxyConfigurationMap(paramMap, out, parameters);
-        
-    // Server tab
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_SERVER,paramMap);
-    // Proxy tab
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_PROXY,paramMap);
-
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post,
-   * including binary file post information.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an
-   * error that should prevent saving of the connection (and cause a
-   * redirection to an error page).
-   *
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-    IPostParameters variableContext, ConfigParams parameters)
-    throws ManifoldCFException {
-
-    // Server tab parameters
-
-    String jiraprotocol = variableContext.getParameter("jiraprotocol");
-    if (jiraprotocol != null)
-      parameters.setParameter(JiraConfig.JIRA_PROTOCOL_PARAM, jiraprotocol);
-
-    String jirahost = variableContext.getParameter("jirahost");
-    if (jirahost != null)
-      parameters.setParameter(JiraConfig.JIRA_HOST_PARAM, jirahost);
-
-    String jiraport = variableContext.getParameter("jiraport");
-    if (jiraport != null)
-      parameters.setParameter(JiraConfig.JIRA_PORT_PARAM, jiraport);
-
-    String jirapath = variableContext.getParameter("jirapath");
-    if (jirapath != null)
-      parameters.setParameter(JiraConfig.JIRA_PATH_PARAM, jirapath);
-
-    String clientid = variableContext.getParameter("clientid");
-    if (clientid != null)
-      parameters.setParameter(JiraConfig.CLIENT_ID_PARAM, clientid);
-
-    String clientsecret = variableContext.getParameter("clientsecret");
-    if (clientsecret != null)
-      parameters.setObfuscatedParameter(JiraConfig.CLIENT_SECRET_PARAM, variableContext.mapKeyToPassword(clientsecret));
-
-    // Proxy tab parameters
-    
-    String jiraproxyhost = variableContext.getParameter("jiraproxyhost");
-    if (jiraproxyhost != null)
-      parameters.setParameter(JiraConfig.JIRA_PROXYHOST_PARAM, jiraproxyhost);
-
-    String jiraproxyport = variableContext.getParameter("jiraproxyport");
-    if (jiraproxyport != null)
-      parameters.setParameter(JiraConfig.JIRA_PROXYPORT_PARAM, jiraproxyport);
-    
-    String jiraproxydomain = variableContext.getParameter("jiraproxydomain");
-    if (jiraproxydomain != null)
-      parameters.setParameter(JiraConfig.JIRA_PROXYDOMAIN_PARAM, jiraproxydomain);
-
-    String jiraproxyusername = variableContext.getParameter("jiraproxyusername");
-    if (jiraproxyusername != null)
-      parameters.setParameter(JiraConfig.JIRA_PROXYUSERNAME_PARAM, jiraproxyusername);
-
-    String jiraproxypassword = variableContext.getParameter("jiraproxypassword");
-    if (jiraproxypassword != null)
-      parameters.setObfuscatedParameter(JiraConfig.JIRA_PROXYPASSWORD_PARAM, variableContext.mapKeyToPassword(jiraproxypassword));
-
-    return null;
-  }
-
-  /** Obtain the access tokens for a given Active Directory user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException {
-    if (checkUserExists(userName))
-      return new AuthorizationResponse(new String[]{userName},AuthorizationResponse.RESPONSE_OK);
-    return RESPONSE_USERNOTFOUND;
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-    return RESPONSE_UNREACHABLE;
-  }
-
-  private static void handleIOException(IOException e)
-    throws ManifoldCFException {
-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    }
-    Logging.authorityConnectors.warn("JIRA: IO exception: "+e.getMessage(), e);
-    throw new ManifoldCFException("IO exception: "+e.getMessage(), e);
-  }
-
-  private static void handleResponseException(ResponseException e)
-    throws ManifoldCFException {
-    throw new ManifoldCFException("Response exception: "+e.getMessage(),e);
-  }
-  
-  // Background threads
-
-  protected static class CheckUserExistsThread extends Thread {
-    protected final JiraSession session;
-    protected final String userName;
-    protected Throwable exception = null;
-    protected boolean result = false;
-
-    public CheckUserExistsThread(JiraSession session, String userName) {
-      super();
-      this.session = session;
-      this.userName = userName;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        result = session.checkUserExists(userName);
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, IOException, ResponseException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof ResponseException) {
-          throw (ResponseException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-    
-    public boolean getResult() {
-      return result;
-    }
-    
-  }
-  
-  protected boolean checkUserExists(String userName) throws ManifoldCFException {
-    CheckUserExistsThread t = new CheckUserExistsThread(getSession(), userName);
-    try {
-      t.start();
-      t.finishUp();
-      return t.getResult();
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      handleIOException(e);
-    } catch (IOException e) {
-      handleIOException(e);
-    } catch (ResponseException e) {
-      handleResponseException(e);
-    }
-    return false;
-  }
-
-  protected static class CheckConnectionThread extends Thread {
-
-    protected final JiraSession session;
-    protected Throwable exception = null;
-
-    public CheckConnectionThread(JiraSession session) {
-      super();
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run() {
-      try {
-        session.getRepositoryInfo();
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, IOException, ResponseException {
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof IOException) {
-          throw (IOException) thr;
-        } else if (thr instanceof ResponseException) {
-          throw (ResponseException) thr;
-        } else if (thr instanceof RuntimeException) {
-          throw (RuntimeException) thr;
-        } else {
-          throw (Error) thr;
-        }
-      }
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException {
-    CheckConnectionThread t = new CheckConnectionThread(getSession());
-    try {
-      t.start();
-      t.finishUp();
-      return;
-    } catch (InterruptedException e) {
-      t.interrupt();
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-        ManifoldCFException.INTERRUPTED);
-    } catch (java.net.SocketTimeoutException e) {
-      handleIOException(e);
-    } catch (InterruptedIOException e) {
-      t.interrupt();
-      handleIOException(e);
-    } catch (IOException e) {
-      handleIOException(e);
-    } catch (ResponseException e) {
-      handleResponseException(e);
-    }
-  }
-
-}
-
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraConfig.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraConfig.java
deleted file mode 100644
index 82ea914..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraConfig.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-/** Parameters for Jira Authority.
- */
-public class JiraConfig {
-
-  public static final String CLIENT_ID_PARAM = "clientid";
-  public static final String CLIENT_SECRET_PARAM = "clientsecret";
-  public static final String JIRA_PROTOCOL_PARAM = "jiraprotocol";
-  public static final String JIRA_HOST_PARAM = "jirahost";
-  public static final String JIRA_PORT_PARAM = "jiraport";
-  public static final String JIRA_PATH_PARAM = "jirapath";
-  
-  public static final String JIRA_PROXYHOST_PARAM = "jiraproxyhost";
-  public static final String JIRA_PROXYPORT_PARAM = "jiraproxyport";
-  public static final String JIRA_PROXYDOMAIN_PARAM = "jiraproxydomain";
-  public static final String JIRA_PROXYUSERNAME_PARAM = "jiraproxyusername";
-  public static final String JIRA_PROXYPASSWORD_PARAM = "jiraproxypassword";
-  
-  public static final String CLIENT_ID_DEFAULT = "";
-  public static final String CLIENT_SECRET_DEFAULT = "";
-  public static final String JIRA_PROTOCOL_DEFAULT = "http";
-  public static final String JIRA_HOST_DEFAULT = "";
-  public static final String JIRA_PORT_DEFAULT = "";
-  public static final String JIRA_PATH_DEFAULT = "/rest/api/2/";
-    
-  public static final String JIRA_PROXYHOST_DEFAULT = "";
-  public static final String JIRA_PROXYPORT_DEFAULT = "";
-  public static final String JIRA_PROXYDOMAIN_DEFAULT = "";
-  public static final String JIRA_PROXYUSERNAME_DEFAULT = "";
-  public static final String JIRA_PROXYPASSWORD_DEFAULT = "";
-
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraJSONResponse.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraJSONResponse.java
deleted file mode 100644
index d3d76f6..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraJSONResponse.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-import org.json.simple.JSONObject;
-
-/** An instance of this class represents a Jira JSON object, and the parser hooks
-* needed to understand it.
-*
-* If we needed streaming anywhere, this would implement org.json.simple.parser.ContentHandler,
-* where we would extract the data from a JSON event stream.  But since we don't need that
-* functionality, instead we're just going to accept an already-parsed JSONObject.
-*
-* This class is meant to be overridden (selectively) by derived classes.
-*/
-public class JiraJSONResponse {
-
-  protected Object object = null;
-
-  public JiraJSONResponse() {
-  }
-  
-  /** Receive a parsed JSON object.
-  */
-  public void acceptJSONObject(Object object) {
-    this.object = object;
-  }
-  
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraSession.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraSession.java
deleted file mode 100644
index bdc17d0..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraSession.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/* $Id$ */
-/**
- * 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-import java.io.Reader;
-import java.io.Writer;
-import java.io.ByteArrayInputStream;
-import java.io.StringWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.net.URL;
-import java.nio.charset.Charset;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpHost;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.entity.ContentType;
-import org.apache.http.client.AuthCache;
-import org.apache.http.impl.client.BasicAuthCache;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.client.protocol.HttpClientContext;
-
-import org.apache.http.ParseException;
-
-import org.json.simple.JSONObject;
-import org.json.simple.JSONValue;
-import org.json.simple.JSONArray;
-
-/**
- *
- * @author andrew
- */
-public class JiraSession {
-
-  private final HttpHost host;
-  private final String path;
-  private final String clientId;
-  private final String clientSecret;
-  
-  private HttpClientConnectionManager connectionManager;
-  private HttpClient httpClient;
-  
-  // Current host name
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (java.net.UnknownHostException e)
-    {
-    }
-  }
-
-  /**
-   * Constructor. Create a session.
-   */
-  public JiraSession(String clientId, String clientSecret,
-    String protocol, String host, int port, String path,
-    String proxyHost, int proxyPort, String proxyDomain, String proxyUsername, String proxyPassword)
-    throws ManifoldCFException {
-    this.host = new HttpHost(host,port,protocol);
-    this.path = path;
-    this.clientId = clientId;
-    this.clientSecret = clientSecret;
-
-    int socketTimeout = 900000;
-    int connectionTimeout = 60000;
-
-    javax.net.ssl.SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();
-    SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeout),
-      NoopHostnameVerifier.INSTANCE);
-
-    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-    poolingConnectionManager.setDefaultMaxPerRoute(1);
-    poolingConnectionManager.setValidateAfterInactivity(2000);
-    poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-      .setTcpNoDelay(true)
-      .setSoTimeout(socketTimeout)
-      .build());
-    connectionManager = poolingConnectionManager;
-
-    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-    // If authentication needed, set that
-    if (clientId != null)
-    {
-      credentialsProvider.setCredentials(
-        AuthScope.ANY,
-        new UsernamePasswordCredentials(clientId,clientSecret));
-    }
-
-    RequestConfig.Builder requestBuilder = RequestConfig.custom()
-      .setCircularRedirectsAllowed(true)
-      .setSocketTimeout(socketTimeout)
-      .setExpectContinueEnabled(true)
-      .setConnectTimeout(connectionTimeout)
-      .setConnectionRequestTimeout(socketTimeout);
-
-    // If there's a proxy, set that too.
-    if (proxyHost != null && proxyHost.length() > 0)
-    {
-
-      // Configure proxy authentication
-      if (proxyUsername != null && proxyUsername.length() > 0)
-      {
-        if (proxyPassword == null)
-          proxyPassword = "";
-        if (proxyDomain == null)
-          proxyDomain = "";
-
-        credentialsProvider.setCredentials(
-          new AuthScope(proxyHost, proxyPort),
-          new NTCredentials(proxyUsername, proxyPassword, currentHost, proxyDomain));
-      }
-
-      HttpHost proxy = new HttpHost(proxyHost, proxyPort);
-      requestBuilder.setProxy(proxy);
-    }
-
-    httpClient = HttpClients.custom()
-      .setConnectionManager(connectionManager)
-      .disableAutomaticRetries()
-      .setDefaultRequestConfig(requestBuilder.build())
-      .setDefaultCredentialsProvider(credentialsProvider)
-      .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-      .setRedirectStrategy(new LaxRedirectStrategy())
-      .build();
-
-  }
-
-  /**
-   * Close session.
-   */
-  public void close() {
-    httpClient = null;
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-  }
-
-  private static Object convertToJSON(HttpResponse httpResponse)
-    throws IOException {
-    HttpEntity entity = httpResponse.getEntity();
-    if (entity != null) {
-      InputStream is = entity.getContent();
-      try {
-        Reader r = new InputStreamReader(is,getCharSet(entity));
-        return JSONValue.parse(r);
-      } finally {
-        is.close();
-      }
-    }
-    return null;
-  }
-
-  private static String convertToString(HttpResponse httpResponse)
-    throws IOException {
-    HttpEntity entity = httpResponse.getEntity();
-    if (entity != null) {
-      InputStream is = entity.getContent();
-      try {
-        char[] buffer = new char[65536];
-        Reader r = new InputStreamReader(is,getCharSet(entity));
-        Writer w = new StringWriter();
-        try {
-          while (true) {
-            int amt = r.read(buffer);
-            if (amt == -1)
-              break;
-            w.write(buffer,0,amt);
-          }
-        } finally {
-          w.flush();
-        }
-        return w.toString();
-      } finally {
-        is.close();
-      }
-    }
-    return "";
-  }
-
-  private static Charset getCharSet(HttpEntity entity)
-  {
-    Charset charSet;
-    try
-    {
-      ContentType ct = ContentType.get(entity);
-      if (ct == null)
-        charSet = StandardCharsets.UTF_8;
-      else
-        charSet = ct.getCharset();
-    }
-    catch (ParseException e)
-    {
-      charSet = StandardCharsets.UTF_8;
-    }
-    return charSet;
-  }
-
-  private void getRest(String rightside, JiraJSONResponse response) 
-    throws IOException, ResponseException {
-
-    // Create AuthCache instance
-    AuthCache authCache = new BasicAuthCache();
-    // Generate BASIC scheme object and add it to the local
-    // auth cache
-    BasicScheme basicAuth = new BasicScheme();
-    authCache.put(host, basicAuth);
-
-    // Add AuthCache to the execution context
-    HttpClientContext localContext = HttpClientContext.create();
-    localContext.setAuthCache(authCache);
-
-    final HttpRequestBase method = new HttpGet(host.toURI() + path + rightside);
-    method.addHeader("Accept", "application/json");
-
-    try {
-      HttpResponse httpResponse = httpClient.execute(method,localContext);
-      int resultCode = httpResponse.getStatusLine().getStatusCode();
-      if (resultCode != 200)
-        throw new ResponseException("Unexpected result code "+resultCode+": "+convertToString(httpResponse));
-      Object jo = convertToJSON(httpResponse);
-      response.acceptJSONObject(jo);
-    } finally {
-      method.abort();
-    }
-  }
-
-  /**
-   * Obtain repository information.
-   */
-  public Map<String, String> getRepositoryInfo() throws IOException, ResponseException {
-    HashMap<String, String> statistics = new HashMap<String, String>();
-    JiraUserQueryResults qr = new JiraUserQueryResults();
-    getRest("user/search?username=%27%27&maxResults=1&startAt=0", qr);
-    return statistics;
-  }
-
-  /** Check if user exists.
-  */
-  public boolean checkUserExists(String userName) throws IOException, ResponseException, ManifoldCFException {
-    JiraUserQueryResults qr = new JiraUserQueryResults();
-    getRest("user?username="+URLEncoder.encode(userName)+"&maxResults=1&startAt=0", qr);
-    List<String> values = new ArrayList<String>();
-    qr.getNames(values);
-    if (values.size() == 0)
-      return false;
-    for (String value : values) {
-      if (userName.equals(value))
-        return true;
-    }
-    return false;
-  }
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraUserQueryResults.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraUserQueryResults.java
deleted file mode 100644
index 8812076..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/JiraUserQueryResults.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-import org.apache.manifoldcf.core.common.*;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.ArrayList;
-
-import org.json.simple.JSONObject;
-import org.json.simple.JSONArray;
-
-/** An instance of this class represents the results of a Jira user query, and
-* the ability to parse the corresponding JSON response.
-*/
-public class JiraUserQueryResults extends JiraJSONResponse {
-
-  // Specific keys we care about
-  private final static String KEY_NAME = "name";
-
-  public JiraUserQueryResults() {
-    super();
-  }
-
-  public void getNames(List<String> nameBuffer) {
-    if (object instanceof JSONArray) {
-      JSONArray users = (JSONArray)object;
-      for (Object user : users) {
-        addName(user, nameBuffer);
-      }
-    } else {
-      addName(object, nameBuffer);
-    }
-  }
-
-  private void addName(Object object, List<String> nameBuffer) {
-    if (object instanceof JSONObject) {
-      JSONObject jo = (JSONObject)object;
-      nameBuffer.add(jo.get(KEY_NAME).toString());
-    }
-  }
-  
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/Messages.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/Messages.java
deleted file mode 100644
index e248ba3..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.jira.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.jira";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/ResponseException.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/ResponseException.java
deleted file mode 100644
index 4a110cf..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jira/ResponseException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.jira;
-
-/** This exception is thrown when the response from REST is not what
-* was expected.
- */
-public class ResponseException extends Exception {
-
-  public ResponseException(String msg) {
-    super(msg);
-  }
-  
-  public ResponseException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraConfig.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraConfig.java
deleted file mode 100644
index d7c11cf..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraConfig.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id: JiraConfig.java 1488537 2013-06-01 15:30:15Z kwright $ */

-

-/**

-* 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 org.apache.manifoldcf.crawler.connectors.jira;

-

-/**

- *

- * @author andrew

- */

-public class JiraConfig {

-

-  public static final String CLIENT_ID_PARAM = "clientid";

-  public static final String CLIENT_SECRET_PARAM = "clientsecret";

-  public static final String JIRA_PROTOCOL_PARAM = "jiraprotocol";

-  public static final String JIRA_HOST_PARAM = "jirahost";

-  public static final String JIRA_PORT_PARAM = "jiraport";

-  public static final String JIRA_PATH_PARAM = "jirapath";

-  

-  public static final String JIRA_PROXYHOST_PARAM = "jiraproxyhost";

-  public static final String JIRA_PROXYPORT_PARAM = "jiraproxyport";

-  public static final String JIRA_PROXYDOMAIN_PARAM = "jiraproxydomain";

-  public static final String JIRA_PROXYUSERNAME_PARAM = "jiraproxyusername";

-  public static final String JIRA_PROXYPASSWORD_PARAM = "jiraproxypassword";

-

-  public static final String JIRA_QUERY_PARAM = "jiraquery";

-  

-  public static final String CLIENT_ID_DEFAULT = "";

-  public static final String CLIENT_SECRET_DEFAULT = "";

-  public static final String JIRA_PROTOCOL_DEFAULT = "http";

-  public static final String JIRA_HOST_DEFAULT = "";

-  public static final String JIRA_PORT_DEFAULT = "";

-  public static final String JIRA_PATH_DEFAULT = "/rest/api/2/";

-  

-  public static final String JIRA_PROXYHOST_DEFAULT = "";

-  public static final String JIRA_PROXYPORT_DEFAULT = "";

-  public static final String JIRA_PROXYDOMAIN_DEFAULT = "";

-  public static final String JIRA_PROXYUSERNAME_DEFAULT = "";

-  public static final String JIRA_PROXYPASSWORD_DEFAULT = "";

-

-  public static final String JIRA_QUERY_DEFAULT = "ORDER BY createdDate Asc";

-

-    

-}

diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraIssue.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraIssue.java
deleted file mode 100644
index b9f1438..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraIssue.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jira;
-
-import org.apache.manifoldcf.core.common.*;
-
-import java.util.Date;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-
-import org.json.simple.JSONObject;
-import org.json.simple.JSONArray;
-
-/** An instance of this class represents a Jira issue, and the parser hooks
-* needed to extract the data from the JSON event stream we use to parse it.
-*/
-public class JiraIssue extends JiraJSONResponse {
-
-  // Specific keys we care about
-  private final static String KEY_FIELDS = "fields";
-  private final static String KEY_KEY = "key";
-  private final static String KEY_SELF = "self";
-  private final static String KEY_CREATED = "created";
-  private final static String KEY_UPDATED = "updated";
-  private final static String KEY_DESCRIPTION = "description";
-  private final static String KEY_SUMMARY = "summary";
-
-  public JiraIssue() {
-    super();
-  }
-
-  public String getKey() {
-    Object key = ((JSONObject)object).get(KEY_KEY);
-    if (key == null)
-      return null;
-    return key.toString();
-  }
-  
-  public String getSelf() {
-    Object key = ((JSONObject)object).get(KEY_SELF);
-    if (key == null)
-      return null;
-    return key.toString();
-  }
-  
-  public Date getCreatedDate() {
-    JSONObject fields = (JSONObject)((JSONObject)object).get(KEY_FIELDS);
-    if (fields == null)
-      return null;
-    Object createdDate = fields.get(KEY_CREATED);
-    if (createdDate == null)
-      return null;
-    return DateParser.parseISO8601Date(createdDate.toString());
-  }
-  
-  public Date getUpdatedDate() {
-    JSONObject fields = (JSONObject)((JSONObject)object).get(KEY_FIELDS);
-    if (fields == null)
-      return null;
-    Object updatedDate = fields.get(KEY_UPDATED);
-    if (updatedDate == null)
-      return null;
-    return DateParser.parseISO8601Date(updatedDate.toString());
-  }
-  
-  public String getDescription() {
-    JSONObject fields = (JSONObject)((JSONObject)object).get(KEY_FIELDS);
-    if (fields == null)
-      return null;
-    Object description = fields.get(KEY_DESCRIPTION);
-    if (description == null)
-      return null;
-    return description.toString();
-  }
-  
-  public String getSummary() {
-    JSONObject fields = (JSONObject)((JSONObject)object).get(KEY_FIELDS);
-    if (fields == null)
-      return null;
-    Object summary = fields.get(KEY_SUMMARY);
-    if (summary == null)
-      return null;
-    return summary.toString();
-  }
-  
-  public Map<String,String[]> getMetadata() {
-    Map<String,List<String>> map = new HashMap<String,List<String>>();
-    JSONObject fields = (JSONObject)((JSONObject)object).get(KEY_FIELDS);
-    if (fields != null)
-      addMetadataToMap("", fields, map);
-    
-    // Now convert to a form more suited for RepositoryDocument
-    Map<String,String[]> rmap = new HashMap<String,String[]>();
-    for (String key : map.keySet()) {
-      List<String> values = map.get(key);
-      String[] valueArray = values.toArray(new String[0]);
-      rmap.put(key,valueArray);
-    }
-    return rmap;
-  }
-
-  protected static void addMetadataToMap(String parent, Object cval, Map<String,List<String>> currentMap) {
-
-    if (cval == null)
-      return;
-
-    // See if it is a basic type
-    if (cval instanceof String || cval instanceof Number || cval instanceof Boolean) {
-      List<String> current = currentMap.get(parent);
-      if (current == null) {
-        current = new ArrayList<String>();
-        currentMap.put(parent,current);
-      }
-      current.add(cval.toString());
-      return;
-    }
-
-    // See if it is an array
-    if (cval instanceof JSONArray) {
-      JSONArray ja = (JSONArray)cval;
-      for (Object subpiece : ja) {
-        addMetadataToMap(parent, subpiece, currentMap);
-      }
-      return;
-    }
-    
-    // See if it is a JSONObject
-    if (cval instanceof JSONObject) {
-      JSONObject jo = (JSONObject)cval;
-      String append="";
-      if (parent.length() > 0) {
-        append=parent+"_";
-      }
-      for (Object key : jo.keySet()) {
-        Object value = jo.get(key);
-        if (value == null) {
-          continue;
-        }
-        String newKey = append + key;
-        addMetadataToMap(newKey, value, currentMap);
-      }
-      return;
-    }
-    
-
-    throw new IllegalArgumentException("Unknown object to addMetadataToMap: "+cval.getClass().getName());
-  }
-
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraJSONResponse.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraJSONResponse.java
deleted file mode 100644
index 2789663..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraJSONResponse.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jira;
-
-import org.json.simple.JSONObject;
-
-/** An instance of this class represents a Jira JSON object, and the parser hooks
-* needed to understand it.
-*
-* If we needed streaming anywhere, this would implement org.json.simple.parser.ContentHandler,
-* where we would extract the data from a JSON event stream.  But since we don't need that
-* functionality, instead we're just going to accept an already-parsed JSONObject.
-*
-* This class is meant to be overridden (selectively) by derived classes.
-*/
-public class JiraJSONResponse {
-
-  protected Object object = null;
-
-  public JiraJSONResponse() {
-  }
-  
-  /** Receive a parsed JSON object.
-  */
-  public void acceptJSONObject(Object object) {
-    this.object = object;
-  }
-  
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraQueryResults.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraQueryResults.java
deleted file mode 100644
index 96893bc..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraQueryResults.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jira;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-
-import java.io.IOException;
-
-import org.json.simple.JSONObject;
-import org.json.simple.JSONArray;
-
-/** An instance of this class represents the results of a Jira query, and
-* the ability to parse the corresponding JSON response.
-*/
-public class JiraQueryResults extends JiraJSONResponse {
-
-  // Specific keys we care about
-  private final static String KEY_TOTAL = "total";
-  private final static String KEY_ISSUES = "issues";
-  private final static String KEY_KEY = "key";
-
-  public JiraQueryResults() {
-    super();
-  }
-
-  public Long getTotal() {
-    return (Long)((JSONObject)object).get(KEY_TOTAL);
-  }
-  
-  public void pushIds(XThreadStringBuffer seedBuffer)
-    throws IOException, InterruptedException {
-    JSONArray issues = (JSONArray)((JSONObject)object).get(KEY_ISSUES);
-    for (Object issue : issues) {
-      if (issue instanceof JSONObject) {
-        JSONObject jo = (JSONObject)issue;
-        seedBuffer.add(jo.get(KEY_KEY).toString());
-      }
-    }
-  }
-
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraRepositoryConnector.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraRepositoryConnector.java
deleted file mode 100644
index d34df63..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraRepositoryConnector.java
+++ /dev/null
@@ -1,1437 +0,0 @@
-/* $Id: JiraRepositoryConnector.java 1490585 2013-06-07 11:13:35Z kwright $ */

-

-/**

-* 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 org.apache.manifoldcf.crawler.connectors.jira;

-

-import java.io.ByteArrayInputStream;

-import org.apache.manifoldcf.core.common.*;

-import org.apache.manifoldcf.connectorcommon.common.*;

-

-import java.io.IOException;

-import java.io.InputStream;

-import java.io.InterruptedIOException;

-import java.nio.charset.StandardCharsets;

-import java.util.HashMap;

-import java.util.HashSet;

-import java.util.ArrayList;

-import java.util.List;

-import java.util.Locale;

-import java.util.Map;

-import java.util.Date;

-import java.util.Set;

-import java.util.Iterator;

-

-import org.apache.manifoldcf.crawler.system.Logging;

-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;

-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;

-import org.apache.manifoldcf.core.interfaces.ConfigParams;

-import org.apache.manifoldcf.core.interfaces.Specification;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-import org.apache.commons.lang.StringUtils;

-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;

-import org.apache.manifoldcf.core.interfaces.IPostParameters;

-import org.apache.manifoldcf.core.interfaces.IThreadContext;

-import org.apache.manifoldcf.core.interfaces.SpecificationNode;

-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;

-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;

-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;

-

-import java.util.Map.Entry;

-

-/**

- *

- * @author andrew

- */

-public class JiraRepositoryConnector extends BaseRepositoryConnector {

-

-  protected final static String ACTIVITY_READ = "read document";

-  

-  /** Deny access token for default authority */

-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;

-

-  // Nodes

-  private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";

-  private static final String JOB_QUERY_ATTRIBUTE = "query";

-  private static final String JOB_SECURITY_NODE_TYPE = "security";

-  private static final String JOB_VALUE_ATTRIBUTE = "value";

-  private static final String JOB_ACCESS_NODE_TYPE = "access";

-  private static final String JOB_TOKEN_ATTRIBUTE = "token";

-

-  // Configuration tabs

-  private static final String JIRA_SERVER_TAB_PROPERTY = "JiraRepositoryConnector.Server";

-  private static final String JIRA_PROXY_TAB_PROPERTY = "JiraRepositoryConnector.Proxy";

-

-  // Specification tabs

-  private static final String JIRA_QUERY_TAB_PROPERTY = "JiraRepositoryConnector.JiraQuery";

-  private static final String JIRA_SECURITY_TAB_PROPERTY = "JiraRepositoryConnector.Security";

-  

-  // Template names for configuration

-  /**

-   * Forward to the javascript to check the configuration parameters

-   */

-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_jira.js";

-  /**

-   * Server tab template

-   */

-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_jira_server.html";

-  /**

-   * Proxy tab template

-   */

-  private static final String EDIT_CONFIG_FORWARD_PROXY = "editConfiguration_jira_proxy.html";

-

-  /**

-   * Forward to the HTML template to view the configuration parameters

-   */

-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_jira.html";

-   

-  // Template names for specification

-  /**

-   * Forward to the javascript to check the specification parameters for the job

-   */

-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification_jira.js";

-  /**

-   * Forward to the template to edit the query for the job

-   */

-  private static final String EDIT_SPEC_FORWARD_JIRAQUERY = "editSpecification_jiraQuery.html";

-  /**

-   * Forward to the template to edit the security parameters for the job

-   */

-  private static final String EDIT_SPEC_FORWARD_SECURITY = "editSpecification_jiraSecurity.html";

-  

-  /**

-   * Forward to the template to view the specification parameters for the job

-   */

-  private static final String VIEW_SPEC_FORWARD = "viewSpecification_jira.html";

-  

-  // Session data

-  protected JiraSession session = null;

-  protected long lastSessionFetch = -1L;

-  protected static final long timeToRelease = 300000L;

-  

-  // Parameter data

-  protected String jiraprotocol = null;

-  protected String jirahost = null;

-  protected String jiraport = null;

-  protected String jirapath = null;

-  protected String clientid = null;

-  protected String clientsecret = null;

-

-  protected String jiraproxyhost = null;

-  protected String jiraproxyport = null;

-  protected String jiraproxydomain = null;

-  protected String jiraproxyusername = null;

-  protected String jiraproxypassword = null;

-

-  public JiraRepositoryConnector() {

-    super();

-  }

-

-  /**

-   * Return the list of activities that this connector supports (i.e. writes

-   * into the log).

-   *

-   * @return the list.

-   */

-  @Override

-  public String[] getActivitiesList() {

-    return new String[]{ACTIVITY_READ};

-  }

-

-  /**

-   * Get the bin name strings for a document identifier. The bin name

-   * describes the queue to which the document will be assigned for throttling

-   * purposes. Throttling controls the rate at which items in a given queue

-   * are fetched; it does not say anything about the overall fetch rate, which

-   * may operate on multiple queues or bins. For example, if you implement a

-   * web crawler, a good choice of bin name would be the server name, since

-   * that is likely to correspond to a real resource that will need real

-   * throttle protection.

-   *

-   * @param documentIdentifier is the document identifier.

-   * @return the set of bin names. If an empty array is returned, it is

-   * equivalent to there being no request rate throttling available for this

-   * identifier.

-   */

-  @Override

-  public String[] getBinNames(String documentIdentifier) {

-    return new String[]{jirahost};

-  }

-

-  /**

-   * Close the connection. Call this before discarding the connection.

-   */

-  @Override

-  public void disconnect() throws ManifoldCFException {

-    if (session != null) {

-      session.close();

-      session = null;

-      lastSessionFetch = -1L;

-    }

-

-    jiraprotocol = null;

-    jirahost = null;

-    jiraport = null;

-    jirapath = null;

-    clientid = null;

-    clientsecret = null;

-    

-    jiraproxyhost = null;

-    jiraproxyport = null;

-    jiraproxydomain = null;

-    jiraproxyusername = null;

-    jiraproxypassword = null;

-  }

-

-  /**

-   * This method create a new JIRA session for a JIRA

-   * repository, if the repositoryId is not provided in the configuration, the

-   * connector will retrieve all the repositories exposed for this endpoint

-   * the it will start to use the first one.

-   *

-   * @param configParameters is the set of configuration parameters, which in

-   * this case describe the target appliance, basic auth configuration, etc.

-   * (This formerly came out of the ini file.)

-   */

-  @Override

-  public void connect(ConfigParams configParams) {

-    super.connect(configParams);

-

-    jiraprotocol = params.getParameter(JiraConfig.JIRA_PROTOCOL_PARAM);

-    jirahost = params.getParameter(JiraConfig.JIRA_HOST_PARAM);

-    jiraport = params.getParameter(JiraConfig.JIRA_PORT_PARAM);

-    jirapath = params.getParameter(JiraConfig.JIRA_PATH_PARAM);

-    clientid = params.getParameter(JiraConfig.CLIENT_ID_PARAM);

-    clientsecret = params.getObfuscatedParameter(JiraConfig.CLIENT_SECRET_PARAM);

-    

-    jiraproxyhost = params.getParameter(JiraConfig.JIRA_PROXYHOST_PARAM);

-    jiraproxyport = params.getParameter(JiraConfig.JIRA_PROXYPORT_PARAM);

-    jiraproxydomain = params.getParameter(JiraConfig.JIRA_PROXYDOMAIN_PARAM);

-    jiraproxyusername = params.getParameter(JiraConfig.JIRA_PROXYUSERNAME_PARAM);

-    jiraproxypassword = params.getObfuscatedParameter(JiraConfig.JIRA_PROXYPASSWORD_PARAM);

-

-  }

-

-  /**

-   * Test the connection. Returns a string describing the connection

-   * integrity.

-   *

-   * @return the connection's status as a displayable string.

-   */

-  @Override

-  public String check() throws ManifoldCFException {

-    try {

-      checkConnection();

-      return super.check();

-    } catch (ServiceInterruption e) {

-      return "Connection temporarily failed: " + e.getMessage();

-    } catch (ManifoldCFException e) {

-      return "Connection failed: " + e.getMessage();

-    }

-  }

-

-

-  /**

-   * Set up a session

-   */

-  protected JiraSession getSession() throws ManifoldCFException, ServiceInterruption {

-    if (session == null) {

-      // Check for parameter validity

-

-      if (StringUtils.isEmpty(jiraprotocol)) {

-        throw new ManifoldCFException("Parameter " + JiraConfig.JIRA_PROTOCOL_PARAM

-            + " required but not set");

-      }

-

-      if (Logging.connectors.isDebugEnabled()) {

-        Logging.connectors.debug("JIRA: jiraprotocol = '" + jiraprotocol + "'");

-      }

-

-      if (StringUtils.isEmpty(jirahost)) {

-        throw new ManifoldCFException("Parameter " + JiraConfig.JIRA_HOST_PARAM

-            + " required but not set");

-      }

-

-      if (Logging.connectors.isDebugEnabled()) {

-        Logging.connectors.debug("JIRA: jirahost = '" + jirahost + "'");

-      }

-

-      if (Logging.connectors.isDebugEnabled()) {

-        Logging.connectors.debug("JIRA: jiraport = '" + jiraport + "'");

-      }

-

-      if (StringUtils.isEmpty(jirapath)) {

-        throw new ManifoldCFException("Parameter " + JiraConfig.JIRA_PATH_PARAM

-            + " required but not set");

-      }

-

-      if (Logging.connectors.isDebugEnabled()) {

-        Logging.connectors.debug("JIRA: jirapath = '" + jirapath + "'");

-      }

-

-      if (Logging.connectors.isDebugEnabled()) {

-        Logging.connectors.debug("JIRA: Clientid = '" + clientid + "'");

-      }

-

-      if (Logging.connectors.isDebugEnabled()) {

-        Logging.connectors.debug("JIRA: Clientsecret = '" + clientsecret + "'");

-      }

-

-      int portInt;

-      if (jiraport != null && jiraport.length() > 0)

-      {

-        try

-        {

-          portInt = Integer.parseInt(jiraport);

-        }

-        catch (NumberFormatException e)

-        {

-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);

-        }

-      }

-      else

-      {

-        if (jiraprotocol.toLowerCase(Locale.ROOT).equals("http"))

-          portInt = 80;

-        else

-          portInt = 443;

-      }

-

-      int proxyPortInt;

-      if (jiraproxyport != null && jiraproxyport.length() > 0)

-      {

-        try

-        {

-          proxyPortInt = Integer.parseInt(jiraproxyport);

-        }

-        catch (NumberFormatException e)

-        {

-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);

-        }

-      }

-      else

-        proxyPortInt = 8080;

-

-      session = new JiraSession(clientid, clientsecret,

-        jiraprotocol, jirahost, portInt, jirapath,

-        jiraproxyhost, proxyPortInt, jiraproxydomain, jiraproxyusername, jiraproxypassword);

-

-    }

-    lastSessionFetch = System.currentTimeMillis();

-    return session;

-  }

-

-  /** This method is called to assess whether to count this connector instance should

-  * actually be counted as being connected.

-  *@return true if the connector instance is actually connected.

-  */

-  @Override

-  public boolean isConnected()

-  {

-    return session != null;

-  }

-

-  @Override

-  public void poll() throws ManifoldCFException {

-    if (lastSessionFetch == -1L) {

-      return;

-    }

-

-    long currentTime = System.currentTimeMillis();

-    if (currentTime >= lastSessionFetch + timeToRelease) {

-      session.close();

-      session = null;

-      lastSessionFetch = -1L;

-    }

-  }

-

-  /**

-   * Get the maximum number of documents to amalgamate together into one

-   * batch, for this connector.

-   *

-   * @return the maximum number. 0 indicates "unlimited".

-   */

-  @Override

-  public int getMaxDocumentRequest() {

-    return 1;

-  }

-

-  /**

-   * Return the list of relationship types that this connector recognizes.

-   *

-   * @return the list.

-   */

-  @Override

-  public String[] getRelationshipTypes() {

-    return new String[]{};

-  }

-

-  /**

-   * Fill in a Server tab configuration parameter map for calling a Velocity

-   * template.

-   *

-   * @param newMap is the map to fill in

-   * @param parameters is the current set of configuration parameters

-   */

-  private static void fillInServerConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {

-    String jiraprotocol = parameters.getParameter(JiraConfig.JIRA_PROTOCOL_PARAM);

-    String jirahost = parameters.getParameter(JiraConfig.JIRA_HOST_PARAM);

-    String jiraport = parameters.getParameter(JiraConfig.JIRA_PORT_PARAM);

-    String jirapath = parameters.getParameter(JiraConfig.JIRA_PATH_PARAM);

-    String clientid = parameters.getParameter(JiraConfig.CLIENT_ID_PARAM);

-    String clientsecret = parameters.getObfuscatedParameter(JiraConfig.CLIENT_SECRET_PARAM);

-

-    if (jiraprotocol == null)

-      jiraprotocol = JiraConfig.JIRA_PROTOCOL_DEFAULT;

-    if (jirahost == null)

-      jirahost = JiraConfig.JIRA_HOST_DEFAULT;

-    if (jiraport == null)

-      jiraport = JiraConfig.JIRA_PORT_DEFAULT;

-    if (jirapath == null)

-      jirapath = JiraConfig.JIRA_PATH_DEFAULT;

-    

-    if (clientid == null)

-      clientid = JiraConfig.CLIENT_ID_DEFAULT;

-    if (clientsecret == null)

-      clientsecret = JiraConfig.CLIENT_SECRET_DEFAULT;

-    else

-      clientsecret = mapper.mapPasswordToKey(clientsecret);

-

-    newMap.put("JIRAPROTOCOL", jiraprotocol);

-    newMap.put("JIRAHOST", jirahost);

-    newMap.put("JIRAPORT", jiraport);

-    newMap.put("JIRAPATH", jirapath);

-    newMap.put("CLIENTID", clientid);

-    newMap.put("CLIENTSECRET", clientsecret);

-  }

-

-  /**

-   * Fill in a Proxy tab configuration parameter map for calling a Velocity

-   * template.

-   *

-   * @param newMap is the map to fill in

-   * @param parameters is the current set of configuration parameters

-   */

-  private static void fillInProxyConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {

-    String jiraproxyhost = parameters.getParameter(JiraConfig.JIRA_PROXYHOST_PARAM);

-    String jiraproxyport = parameters.getParameter(JiraConfig.JIRA_PROXYPORT_PARAM);

-    String jiraproxydomain = parameters.getParameter(JiraConfig.JIRA_PROXYDOMAIN_PARAM);

-    String jiraproxyusername = parameters.getParameter(JiraConfig.JIRA_PROXYUSERNAME_PARAM);

-    String jiraproxypassword = parameters.getObfuscatedParameter(JiraConfig.JIRA_PROXYPASSWORD_PARAM);

-

-    if (jiraproxyhost == null)

-      jiraproxyhost = JiraConfig.JIRA_PROXYHOST_DEFAULT;

-    if (jiraproxyport == null)

-      jiraproxyport = JiraConfig.JIRA_PROXYPORT_DEFAULT;

-

-    if (jiraproxydomain == null)

-      jiraproxydomain = JiraConfig.JIRA_PROXYDOMAIN_DEFAULT;

-    if (jiraproxyusername == null)

-      jiraproxyusername = JiraConfig.JIRA_PROXYUSERNAME_DEFAULT;

-    if (jiraproxypassword == null)

-      jiraproxypassword = JiraConfig.JIRA_PROXYPASSWORD_DEFAULT;

-    else

-      jiraproxypassword = mapper.mapPasswordToKey(jiraproxypassword);

-

-    newMap.put("JIRAPROXYHOST", jiraproxyhost);

-    newMap.put("JIRAPROXYPORT", jiraproxyport);

-    newMap.put("JIRAPROXYDOMAIN", jiraproxydomain);

-    newMap.put("JIRAPROXYUSERNAME", jiraproxyusername);

-    newMap.put("JIRAPROXYPASSWORD", jiraproxypassword);

-  }

-

-  /**

-   * View configuration. This method is called in the body section of the

-   * connector's view configuration page. Its purpose is to present the

-   * connection information to the user. The coder can presume that the HTML

-   * that is output from this configuration will be within appropriate <html>

-   * and <body> tags.

-   *

-   * @param threadContext is the local thread context.

-   * @param out is the output to which any HTML should be sent.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   */

-  @Override

-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,

-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {

-    Map<String, Object> paramMap = new HashMap<String, Object>();

-

-    // Fill in map from each tab

-    fillInServerConfigurationMap(paramMap, out, parameters);

-    fillInProxyConfigurationMap(paramMap, out, parameters);

-

-    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIG_FORWARD,paramMap);

-  }

-

-  /**

-   *

-   * Output the configuration header section. This method is called in the

-   * head section of the connector's configuration page. Its purpose is to add

-   * the required tabs to the list, and to output any javascript methods that

-   * might be needed by the configuration editing HTML.

-   *

-   * @param threadContext is the local thread context.

-   * @param out is the output to which any HTML should be sent.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   * @param tabsArray is an array of tab names. Add to this array any tab

-   * names that are specific to the connector.

-   */

-  @Override

-  public void outputConfigurationHeader(IThreadContext threadContext,

-      IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)

-      throws ManifoldCFException, IOException {

-    // Add the Server tab

-    tabsArray.add(Messages.getString(locale, JIRA_SERVER_TAB_PROPERTY));

-    // Add the Proxy tab

-    tabsArray.add(Messages.getString(locale, JIRA_PROXY_TAB_PROPERTY));

-    // Map the parameters

-    Map<String, Object> paramMap = new HashMap<String, Object>();

-

-    // Fill in the parameters from each tab

-    fillInServerConfigurationMap(paramMap, out, parameters);

-    fillInProxyConfigurationMap(paramMap, out, parameters);

-

-    // Output the Javascript - only one Velocity template for all tabs

-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_HEADER_FORWARD,paramMap);

-  }

-

-  @Override

-  public void outputConfigurationBody(IThreadContext threadContext,

-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)

-      throws ManifoldCFException, IOException {

-

-

-    // Call the Velocity templates for each tab

-    Map<String, Object> paramMap = new HashMap<String, Object>();

-    // Set the tab name

-    paramMap.put("TabName", tabName);

-

-    // Fill in the parameters

-    fillInServerConfigurationMap(paramMap, out, parameters);

-    fillInProxyConfigurationMap(paramMap, out, parameters);

-

-    // Server tab

-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_SERVER,paramMap);

-    // Proxy tab

-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_PROXY,paramMap);

-

-  }

-

-  /**

-   * Process a configuration post. This method is called at the start of the

-   * connector's configuration page, whenever there is a possibility that form

-   * data for a connection has been posted. Its purpose is to gather form

-   * information and modify the configuration parameters accordingly. The name

-   * of the posted form is "editconnection".

-   *

-   * @param threadContext is the local thread context.

-   * @param variableContext is the set of variables available from the post,

-   * including binary file post information.

-   * @param parameters are the configuration parameters, as they currently

-   * exist, for this connection being configured.

-   * @return null if all is well, or a string error message if there is an

-   * error that should prevent saving of the connection (and cause a

-   * redirection to an error page).

-   *

-   */

-  @Override

-  public String processConfigurationPost(IThreadContext threadContext,

-    IPostParameters variableContext, ConfigParams parameters)

-    throws ManifoldCFException {

-

-    // Server tab parameters

-

-    String jiraprotocol = variableContext.getParameter("jiraprotocol");

-    if (jiraprotocol != null)

-      parameters.setParameter(JiraConfig.JIRA_PROTOCOL_PARAM, jiraprotocol);

-

-    String jirahost = variableContext.getParameter("jirahost");

-    if (jirahost != null)

-      parameters.setParameter(JiraConfig.JIRA_HOST_PARAM, jirahost);

-

-    String jiraport = variableContext.getParameter("jiraport");

-    if (jiraport != null)

-      parameters.setParameter(JiraConfig.JIRA_PORT_PARAM, jiraport);

-

-    String jirapath = variableContext.getParameter("jirapath");

-    if (jirapath != null)

-      parameters.setParameter(JiraConfig.JIRA_PATH_PARAM, jirapath);

-

-    String clientid = variableContext.getParameter("clientid");

-    if (clientid != null)

-      parameters.setParameter(JiraConfig.CLIENT_ID_PARAM, clientid);

-

-    String clientsecret = variableContext.getParameter("clientsecret");

-    if (clientsecret != null)

-      parameters.setObfuscatedParameter(JiraConfig.CLIENT_SECRET_PARAM, variableContext.mapKeyToPassword(clientsecret));

-

-    // Proxy tab parameters

-    

-    String jiraproxyhost = variableContext.getParameter("jiraproxyhost");

-    if (jiraproxyhost != null)

-      parameters.setParameter(JiraConfig.JIRA_PROXYHOST_PARAM, jiraproxyhost);

-

-    String jiraproxyport = variableContext.getParameter("jiraproxyport");

-    if (jiraproxyport != null)

-      parameters.setParameter(JiraConfig.JIRA_PROXYPORT_PARAM, jiraproxyport);

-    

-    String jiraproxydomain = variableContext.getParameter("jiraproxydomain");

-    if (jiraproxydomain != null)

-      parameters.setParameter(JiraConfig.JIRA_PROXYDOMAIN_PARAM, jiraproxydomain);

-

-    String jiraproxyusername = variableContext.getParameter("jiraproxyusername");

-    if (jiraproxyusername != null)

-      parameters.setParameter(JiraConfig.JIRA_PROXYUSERNAME_PARAM, jiraproxyusername);

-

-    String jiraproxypassword = variableContext.getParameter("jiraproxypassword");

-    if (jiraproxypassword != null)

-      parameters.setObfuscatedParameter(JiraConfig.JIRA_PROXYPASSWORD_PARAM, variableContext.mapKeyToPassword(jiraproxypassword));

-

-    return null;

-  }

-

-  /**

-   * Fill in specification Velocity parameter map for JIRAQuery tab.

-   */

-  private static void fillInJIRAQuerySpecificationMap(Map<String, Object> newMap, Specification ds) {

-    String JiraQuery = JiraConfig.JIRA_QUERY_DEFAULT;

-    for (int i = 0; i < ds.getChildCount(); i++) {

-      SpecificationNode sn = ds.getChild(i);

-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {

-        JiraQuery = sn.getAttributeValue(JOB_QUERY_ATTRIBUTE);

-      }

-    }

-    newMap.put("JIRAQUERY", JiraQuery);

-  }

-

-  /**

-   * Fill in specification Velocity parameter map for JIRASecurity tab.

-   */

-  private static void fillInJIRASecuritySpecificationMap(Map<String, Object> newMap, Specification ds) {

-    List<Map<String,String>> accessTokenList = new ArrayList<Map<String,String>>();

-    String securityValue = "on";

-    for (int i = 0; i < ds.getChildCount(); i++) {

-      SpecificationNode sn = ds.getChild(i);

-      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {

-        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);

-        Map<String,String> accessMap = new HashMap<String,String>();

-        accessMap.put("TOKEN",token);

-        accessTokenList.add(accessMap);

-      } else if (sn.getType().equals(JOB_SECURITY_NODE_TYPE)) {

-        securityValue = sn.getAttributeValue(JOB_VALUE_ATTRIBUTE);

-      }

-    }

-    newMap.put("ACCESSTOKENS", accessTokenList);

-    newMap.put("SECURITYON", securityValue);

-  }

-

-  /** View specification.

-  * This method is called in the body section of a job's view page.  Its purpose is to present the document

-  * specification information to the user.  The coder can presume that the HTML that is output from

-  * this configuration will be within appropriate <html> and <body> tags.

-  * The connector will be connected before this method can be called.

-  *@param out is the output to which any HTML should be sent.

-  *@param locale is the locale the output is preferred to be in.

-  *@param ds is the current document specification for this job.

-  *@param connectionSequenceNumber is the unique number of this connection within the job.

-  */

-  @Override

-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,

-    int connectionSequenceNumber)

-    throws ManifoldCFException, IOException {

-

-    Map<String, Object> paramMap = new HashMap<String, Object>();

-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));

-

-    // Fill in the map with data from all tabs

-    fillInJIRAQuerySpecificationMap(paramMap, ds);

-    fillInJIRASecuritySpecificationMap(paramMap, ds);

-

-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPEC_FORWARD,paramMap);

-  }

-

-  /** Process a specification post.

-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form

-  * data for a connection has been posted.  Its purpose is to gather form information and modify the

-  * document specification accordingly.  The name of the posted form is always "editjob".

-  * The connector will be connected before this method can be called.

-  *@param variableContext contains the post data, including binary file-upload information.

-  *@param locale is the locale the output is preferred to be in.

-  *@param ds is the current document specification for this job.

-  *@param connectionSequenceNumber is the unique number of this connection within the job.

-  *@return null if all is well, or a string error message if there is an error that should prevent saving of

-  * the job (and cause a redirection to an error page).

-  */

-  @Override

-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,

-    int connectionSequenceNumber)

-    throws ManifoldCFException {

-    String seqPrefix = "s"+connectionSequenceNumber+"_";

-

-    String jiraDriveQuery = variableContext.getParameter(seqPrefix+"jiraquery");

-    if (jiraDriveQuery != null) {

-      int i = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode oldNode = ds.getChild(i);

-        if (oldNode.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {

-          ds.removeChild(i);

-          break;

-        }

-        i++;

-      }

-      SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);

-      node.setAttribute(JOB_QUERY_ATTRIBUTE, jiraDriveQuery);

-      ds.addChild(ds.getChildCount(), node);

-    }

-    

-    String securityOn = variableContext.getParameter(seqPrefix+"specsecurity");

-    if (securityOn != null) {

-      // Delete all security records first

-      int i = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i);

-        if (sn.getType().equals(JOB_SECURITY_NODE_TYPE))

-          ds.removeChild(i);

-        else

-          i++;

-      }

-      SpecificationNode node = new SpecificationNode(JOB_SECURITY_NODE_TYPE);

-      node.setAttribute(JOB_VALUE_ATTRIBUTE,securityOn);

-      ds.addChild(ds.getChildCount(),node);

-    }

-    

-    String xc = variableContext.getParameter(seqPrefix+"tokencount");

-    if (xc != null) {

-      // Delete all tokens first

-      int i = 0;

-      while (i < ds.getChildCount()) {

-        SpecificationNode sn = ds.getChild(i);

-        if (sn.getType().equals(JOB_ACCESS_NODE_TYPE))

-          ds.removeChild(i);

-        else

-          i++;

-      }

-

-      int accessCount = Integer.parseInt(xc);

-      i = 0;

-      while (i < accessCount) {

-        String accessDescription = "_"+Integer.toString(i);

-        String accessOpName = seqPrefix+"accessop"+accessDescription;

-        xc = variableContext.getParameter(accessOpName);

-        if (xc != null && xc.equals("Delete")) {

-          // Next row

-          i++;

-          continue;

-        }

-        // Get the stuff we need

-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);

-        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);

-        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessSpec);

-        ds.addChild(ds.getChildCount(),node);

-        i++;

-      }

-

-      String op = variableContext.getParameter(seqPrefix+"accessop");

-      if (op != null && op.equals("Add"))

-      {

-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");

-        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);

-        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessspec);

-        ds.addChild(ds.getChildCount(),node);

-      }

-    }

-

-    return null;

-  }

-

-  /** Output the specification body section.

-  * This method is called in the body section of a job page which has selected a repository connection of the

-  * current type.  Its purpose is to present the required form elements for editing.

-  * The coder can presume that the HTML that is output from this configuration will be within appropriate

-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".

-  * The connector will be connected before this method can be called.

-  *@param out is the output to which any HTML should be sent.

-  *@param locale is the locale the output is preferred to be in.

-  *@param ds is the current document specification for this job.

-  *@param connectionSequenceNumber is the unique number of this connection within the job.

-  *@param actualSequenceNumber is the connection within the job that has currently been selected.

-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within

-  *  the job.

-  */

-  @Override

-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,

-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)

-    throws ManifoldCFException, IOException {

-

-    // Output JIRAQuery tab

-    Map<String, Object> paramMap = new HashMap<String, Object>();

-    paramMap.put("TabName", tabName);

-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));

-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));

-

-    fillInJIRAQuerySpecificationMap(paramMap, ds);

-    fillInJIRASecuritySpecificationMap(paramMap, ds);

-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_JIRAQUERY,paramMap);

-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_SECURITY,paramMap);

-  }

-

-  /** Output the specification header section.

-  * This method is called in the head section of a job page which has selected a repository connection of the

-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods

-  * that might be needed by the job editing HTML.

-  * The connector will be connected before this method can be called.

-  *@param out is the output to which any HTML should be sent.

-  *@param locale is the locale the output is preferred to be in.

-  *@param ds is the current document specification for this job.

-  *@param connectionSequenceNumber is the unique number of this connection within the job.

-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.

-  */

-  @Override

-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,

-    int connectionSequenceNumber, List<String> tabsArray)

-    throws ManifoldCFException, IOException {

-

-    tabsArray.add(Messages.getString(locale, JIRA_QUERY_TAB_PROPERTY));

-    tabsArray.add(Messages.getString(locale, JIRA_SECURITY_TAB_PROPERTY));

-

-    Map<String, Object> paramMap = new HashMap<String, Object>();

-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));

-

-    // Fill in the specification header map, using data from all tabs.

-    fillInJIRAQuerySpecificationMap(paramMap, ds);

-    fillInJIRASecuritySpecificationMap(paramMap, ds);

-

-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER_FORWARD,paramMap);

-  }

-

-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents

-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.

-  *

-  * This method can choose to find repository changes that happen only during the specified time interval.

-  * The seeds recorded by this method will be viewed by the framework based on what the

-  * getConnectorModel() method returns.

-  *

-  * It is not a big problem if the connector chooses to create more seeds than are

-  * strictly necessary; it is merely a question of overall work required.

-  *

-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.

-  * For continuous crawling jobs, this method will

-  * be called once, when the job starts, and at various periodic intervals as the job executes.

-  *

-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The

-  * seeding version string may also be set to null on each job run, depending on the connector model returned by

-  * getConnectorModel().

-  *

-  * Note that it is always ok to send MORE documents rather than less to this method.

-  * The connector will be connected before this method can be called.

-  *@param activities is the interface this method should use to perform whatever framework actions are desired.

-  *@param spec is a document specification (that comes from the job).

-  *@param seedTime is the end of the time range of documents to consider, exclusive.

-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.

-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.

-  *@return an updated seeding version string, to be stored with the job.

-  */

-  @Override

-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,

-    String lastSeedVersion, long seedTime, int jobMode)

-    throws ManifoldCFException, ServiceInterruption {

-

-    String jiraDriveQuery = JiraConfig.JIRA_QUERY_DEFAULT;

-    int i = 0;

-    while (i < spec.getChildCount()) {

-      SpecificationNode sn = spec.getChild(i);

-      if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {

-        jiraDriveQuery = sn.getAttributeValue(JOB_QUERY_ATTRIBUTE);

-        break;

-      }

-      i++;

-    }

-

-    GetSeedsThread t = new GetSeedsThread(getSession(), jiraDriveQuery);

-    try {

-      t.start();

-      boolean wasInterrupted = false;

-      try {

-        XThreadStringBuffer seedBuffer = t.getBuffer();

-        // Pick up the paths, and add them to the activities, before we join with the child thread.

-        while (true) {

-          // The only kind of exceptions this can throw are going to shut the process down.

-          String issueKey = seedBuffer.fetch();

-          if (issueKey ==  null)

-            break;

-          // Add the pageID to the queue

-          activities.addSeedDocument("I-"+issueKey);

-        }

-      } catch (InterruptedException e) {

-        wasInterrupted = true;

-        throw e;

-      } catch (ManifoldCFException e) {

-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)

-          wasInterrupted = true;

-        throw e;

-      } finally {

-        if (!wasInterrupted)

-          t.finishUp();

-      }

-    } catch (InterruptedException e) {

-      t.interrupt();

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,

-        ManifoldCFException.INTERRUPTED);

-    } catch (java.net.SocketTimeoutException e) {

-      handleIOException(e);

-    } catch (InterruptedIOException e) {

-      t.interrupt();

-      handleIOException(e);

-    } catch (IOException e) {

-      handleIOException(e);

-    } catch (ResponseException e) {

-      handleResponseException(e);

-    }

-    return "";

-  }

-  

-

-  /** Process a set of documents.

-  * This is the method that should cause each document to be fetched, processed, and the results either added

-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.

-  * The document specification allows this class to filter what is done based on the job.

-  * The connector will be connected before this method can be called.

-  *@param documentIdentifiers is the set of document identifiers to process.

-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers

-  * passed in above.

-  *@param activities is the interface this method should use to queue up new document references

-  * and ingest documents.

-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.

-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.

-  */

-  @Override

-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,

-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)

-    throws ManifoldCFException, ServiceInterruption {

-

-    // Forced acls

-    String[] acls = getAcls(spec);

-    if (acls != null)

-      java.util.Arrays.sort(acls);

-

-    for (String documentIdentifier : documentIdentifiers) {

-      

-      if (documentIdentifier.startsWith("I-")) {

-        // It is an issue

-        String versionString;

-        String[] aclsToUse;

-        String issueID;

-        JiraIssue jiraFile;

-        

-        issueID = documentIdentifier.substring(2);

-        jiraFile = getIssue(issueID);

-        if (jiraFile == null) {

-          activities.deleteDocument(documentIdentifier);

-          continue;

-        }

-        Date rev = jiraFile.getUpdatedDate();

-        if (rev == null) {

-          //a jira document that doesn't contain versioning information will NEVER be processed.

-          // I don't know what this means, and whether it can ever occur.

-          activities.deleteDocument(documentIdentifier);

-          continue;

-        }

-        

-        StringBuilder sb = new StringBuilder();

-

-        if (acls == null) {

-          // Get acls from issue

-          List<String> users = getUsers(issueID);

-          aclsToUse = (String[])users.toArray(new String[0]);

-          java.util.Arrays.sort(aclsToUse);

-        } else {

-          aclsToUse = acls;

-        }

-          

-        // Acls

-        packList(sb,aclsToUse,'+');

-        if (aclsToUse.length > 0) {

-          sb.append('+');

-          pack(sb,defaultAuthorityDenyToken,'+');

-        } else

-          sb.append('-');

-        sb.append(rev.toString());

-        

-        versionString = sb.toString();

-

-        if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))

-          continue;

-

-        if (Logging.connectors.isDebugEnabled()) {

-          Logging.connectors.debug("JIRA: Processing document identifier '"

-              + documentIdentifier + "'");

-        }

-

-        long startTime = System.currentTimeMillis();

-        String errorCode = null;

-        String errorDesc = null;

-        Long fileSize = null;

-          

-        try {

-          // Now do standard stuff

-            

-          String mimeType = "text/plain";

-          Date createdDate = jiraFile.getCreatedDate();

-          Date modifiedDate = jiraFile.getUpdatedDate();

-          String documentURI = composeDocumentURI(getBaseUrl(session), jiraFile.getKey());

-

-          if (!activities.checkURLIndexable(documentURI))

-          {

-            errorCode = activities.EXCLUDED_URL;

-            errorDesc = "Excluded because of URL ('"+documentURI+"')";

-            activities.noDocument(documentIdentifier, versionString);

-            continue;

-          }

-            

-          if (!activities.checkMimeTypeIndexable(mimeType))

-          {

-            errorCode = activities.EXCLUDED_MIMETYPE;

-            errorDesc = "Excluded because of mime type ('"+mimeType+"')";

-            activities.noDocument(documentIdentifier, versionString);

-            continue;

-          }

-            

-          if (!activities.checkDateIndexable(modifiedDate))

-          {

-            errorCode = activities.EXCLUDED_DATE;

-            errorDesc = "Excluded because of date ("+modifiedDate+")";

-            activities.noDocument(documentIdentifier, versionString);

-            continue;

-          }

-            

-          //otherwise process

-          RepositoryDocument rd = new RepositoryDocument();

-              

-          // Turn into acls and add into description

-          String[] denyAclsToUse;

-          if (aclsToUse.length > 0)

-            denyAclsToUse = new String[]{defaultAuthorityDenyToken};

-          else

-            denyAclsToUse = new String[0];

-          rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,aclsToUse,denyAclsToUse);

-

-          rd.setMimeType(mimeType);

-          if (createdDate != null)

-            rd.setCreatedDate(createdDate);

-          if (modifiedDate != null)

-            rd.setModifiedDate(modifiedDate);

-            

-          rd.addField("webUrl", documentURI);

-          rd.addField("key", jiraFile.getKey());

-          rd.addField("self", jiraFile.getSelf());

-          rd.addField("description", jiraFile.getDescription());

-

-          // Get general document metadata

-          Map<String,String[]> metadataMap = jiraFile.getMetadata();

-              

-          for (Entry<String, String[]> entry : metadataMap.entrySet()) {

-            rd.addField(entry.getKey(), entry.getValue());

-          }

-

-          String document = getJiraBody(jiraFile);

-          try {

-            byte[] documentBytes = document.getBytes(StandardCharsets.UTF_8);

-            long fileLength = documentBytes.length;

-              

-            if (!activities.checkLengthIndexable(fileLength))

-            {

-              errorCode = activities.EXCLUDED_LENGTH;

-              errorDesc = "Excluded because of document length ("+fileLength+")";

-              activities.noDocument(documentIdentifier, versionString);

-              continue;

-            }

-                

-            InputStream is = new ByteArrayInputStream(documentBytes);

-            try {

-              rd.setBinary(is, fileLength);

-              activities.ingestDocumentWithException(documentIdentifier, versionString, documentURI, rd);

-              // No errors.  Record the fact that we made it.

-              errorCode = "OK";

-              fileSize = new Long(fileLength);

-            } finally {

-              is.close();

-            }

-          } catch (java.io.IOException e) {

-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);

-            errorDesc = e.getMessage();

-            handleIOException(e);

-          }

-        } catch (ManifoldCFException e) {

-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)

-            errorCode = null;

-          throw e;

-        } finally {

-          if (errorCode != null)

-            activities.recordActivity(new Long(startTime), ACTIVITY_READ,

-              fileSize, documentIdentifier, errorCode, errorDesc, null);

-        }

-

-      } else {

-        // Unrecognized identifier type

-        activities.deleteDocument(documentIdentifier);

-        continue;

-      }

-    }

-  }

-  

-  protected static String getJiraBody(JiraIssue jiraFile) {

-    String summary = jiraFile.getSummary();

-    String description = jiraFile.getDescription();

-    StringBuilder body = new StringBuilder();

-    if (summary != null)

-      body.append(summary);

-    if (description != null) {

-      if (body.length() > 0)

-        body.append(" : ");

-      body.append(description);

-    }

-    return body.toString();

-  }

-  

-  

-  /**

-   * Compose the "real" url of the jira issue (BASEURL+/browse/+ISSUEKEY)

-   * @param baseUrl

-   * @param key

-   * @return

-   */

-  private String composeDocumentURI(String baseUrl, String key) {

-	  if (!baseUrl.endsWith("/"))

-	  	baseUrl = baseUrl + "/";

-      return baseUrl + "browse/" + key;

-  }

-

-  /** Grab forced acl out of document specification.

-  *@param spec is the document specification.

-  *@return the acls, or null if security is on (and the acls need to be fetched)

-  */

-  protected static String[] getAcls(Specification spec) {

-    Set<String> map = new HashSet<String>();

-    for (int i = 0; i < spec.getChildCount(); i++) {

-      SpecificationNode sn = spec.getChild(i);

-      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {

-        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);

-        map.add(token);

-      }

-      else if (sn.getType().equals(JOB_SECURITY_NODE_TYPE)) {

-        String onOff = sn.getAttributeValue(JOB_VALUE_ATTRIBUTE);

-        if (onOff != null && onOff.equals("on"))

-          return null;

-      }

-    }

-

-    String[] rval = new String[map.size()];

-    Iterator<String> iter = map.iterator();

-    int i = 0;

-    while (iter.hasNext()) {

-      rval[i++] = (String)iter.next();

-    }

-    return rval;

-  }

-

-  private static void handleIOException(IOException e)

-    throws ManifoldCFException, ServiceInterruption {

-    if (!(e instanceof java.net.SocketTimeoutException) && (e instanceof InterruptedIOException)) {

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,

-        ManifoldCFException.INTERRUPTED);

-    }

-    Logging.connectors.warn("JIRA: IO exception: "+e.getMessage(), e);

-    long currentTime = System.currentTimeMillis();

-    throw new ServiceInterruption("IO exception: "+e.getMessage(), e, currentTime + 300000L,

-      currentTime + 3 * 60 * 60000L,-1,false);

-  }

-  

-  private static void handleResponseException(ResponseException e)

-    throws ManifoldCFException, ServiceInterruption {

-    throw new ManifoldCFException("Unexpected response: "+e.getMessage(),e);

-  }

-

-  // Background threads

-

-  protected static class GetUsersThread extends Thread {

-

-    protected final JiraSession session;

-    protected final String issueKey;

-    protected Throwable exception = null;

-    protected List<String> result = null;

-

-    public GetUsersThread(JiraSession session, String issueKey) {

-      super();

-      this.session = session;

-      this.issueKey = issueKey;

-      setDaemon(true);

-    }

-

-    public void run() {

-      try {

-        result = session.getUsers(issueKey);

-      } catch (Throwable e) {

-        this.exception = e;

-      }

-    }

-

-    public void finishUp()

-      throws InterruptedException, IOException, ResponseException {

-      join();

-      Throwable thr = exception;

-      if (thr != null) {

-        if (thr instanceof IOException) {

-          throw (IOException) thr;

-        } else if (thr instanceof ResponseException) {

-          throw (ResponseException) thr;

-        } else if (thr instanceof RuntimeException) {

-          throw (RuntimeException) thr;

-        } else {

-          throw (Error) thr;

-        }

-      }

-    }

-    

-    public List<String> getResult() {

-      return result;

-    }

-

-  }

-

-  protected List<String> getUsers(String issueKey) throws ManifoldCFException, ServiceInterruption {

-    GetUsersThread t = new GetUsersThread(getSession(), issueKey);

-    try {

-      t.start();

-      t.finishUp();

-      return t.getResult();

-    } catch (InterruptedException e) {

-      t.interrupt();

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,

-        ManifoldCFException.INTERRUPTED);

-    } catch (java.net.SocketTimeoutException e) {

-      handleIOException(e);

-    } catch (InterruptedIOException e) {

-      t.interrupt();

-      handleIOException(e);

-    } catch (IOException e) {

-      handleIOException(e);

-    } catch (ResponseException e) {

-      handleResponseException(e);

-    }

-    return null;

-  }

-

-  protected static class CheckConnectionThread extends Thread {

-

-    protected final JiraSession session;

-    protected Throwable exception = null;

-

-    public CheckConnectionThread(JiraSession session) {

-      super();

-      this.session = session;

-      setDaemon(true);

-    }

-

-    public void run() {

-      try {

-        session.getRepositoryInfo();

-      } catch (Throwable e) {

-        this.exception = e;

-      }

-    }

-

-    public void finishUp()

-      throws InterruptedException, IOException, ResponseException {

-      join();

-      Throwable thr = exception;

-      if (thr != null) {

-        if (thr instanceof IOException) {

-          throw (IOException) thr;

-        } else if (thr instanceof ResponseException) {

-          throw (ResponseException) thr;

-        } else if (thr instanceof RuntimeException) {

-          throw (RuntimeException) thr;

-        } else {

-          throw (Error) thr;

-        }

-      }

-    }

-  }

-

-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {

-    CheckConnectionThread t = new CheckConnectionThread(getSession());

-    try {

-      t.start();

-      t.finishUp();

-      return;

-    } catch (InterruptedException e) {

-      t.interrupt();

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,

-        ManifoldCFException.INTERRUPTED);

-    } catch (java.net.SocketTimeoutException e) {

-      handleIOException(e);

-    } catch (InterruptedIOException e) {

-      t.interrupt();

-      handleIOException(e);

-    } catch (IOException e) {

-      handleIOException(e);

-    } catch (ResponseException e) {

-      handleResponseException(e);

-    }

-  }

-

-  protected static class GetSeedsThread extends Thread {

-

-    protected Throwable exception = null;

-    protected final JiraSession session;

-    protected final String jiraDriveQuery;

-    protected final XThreadStringBuffer seedBuffer;

-    

-    public GetSeedsThread(JiraSession session, String jiraDriveQuery) {

-      super();

-      this.session = session;

-      this.jiraDriveQuery = jiraDriveQuery;

-      this.seedBuffer = new XThreadStringBuffer();

-      setDaemon(true);

-    }

-

-    @Override

-    public void run() {

-      try {

-        session.getSeeds(seedBuffer, jiraDriveQuery);

-      } catch (Throwable e) {

-        this.exception = e;

-      } finally {

-        seedBuffer.signalDone();

-      }

-    }

-

-    public XThreadStringBuffer getBuffer() {

-      return seedBuffer;

-    }

-    

-    public void finishUp()

-      throws InterruptedException, IOException, ResponseException {

-      seedBuffer.abandon();

-      join();

-      Throwable thr = exception;

-      if (thr != null) {

-        if (thr instanceof IOException)

-          throw (IOException) thr;

-        else if (thr instanceof ResponseException)

-          throw (ResponseException) thr;

-        else if (thr instanceof RuntimeException)

-          throw (RuntimeException) thr;

-        else if (thr instanceof Error)

-          throw (Error) thr;

-        else

-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);

-      }

-    }

-  }

-

-  protected JiraIssue getIssue(String issueID)

-    throws ManifoldCFException, ServiceInterruption {

-    GetIssueThread t = new GetIssueThread(getSession(), issueID);

-    try {

-      t.start();

-      t.finishUp();

-    } catch (InterruptedException e) {

-      t.interrupt();

-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,

-        ManifoldCFException.INTERRUPTED);

-    } catch (java.net.SocketTimeoutException e) {

-      handleIOException(e);

-    } catch (InterruptedIOException e) {

-      t.interrupt();

-      handleIOException(e);

-    } catch (IOException e) {

-      handleIOException(e);

-    } catch (ResponseException e) {

-      handleResponseException(e);

-    }

-    return t.getResponse();

-  }

-  

-  

-  protected String getBaseUrl(JiraSession jiraSession) throws ManifoldCFException, ServiceInterruption {

-	  String url = "";

-	  try {

-		  url = jiraSession.getBaseUrl();

-		  return url;

-	    } catch (java.net.SocketTimeoutException e) {

-	        handleIOException(e);

-	    } catch (InterruptedIOException e) {

-	        handleIOException(e);

-	    } catch (IOException e) {

-	        handleIOException(e);

-	    } catch (ResponseException e) {

-	        handleResponseException(e);

-	    }

-	return url;

-  }

-  

-  protected static class GetIssueThread extends Thread {

-

-    protected final JiraSession session;

-    protected final String nodeId;

-    protected Throwable exception = null;

-    protected JiraIssue response = null;

-

-    public GetIssueThread(JiraSession session, String nodeId) {

-      super();

-      setDaemon(true);

-      this.session = session;

-      this.nodeId = nodeId;

-    }

-

-    public void run() {

-      try {

-        response = session.getIssue(nodeId);

-      } catch (Throwable e) {

-        this.exception = e;

-      }

-    }

-

-    public JiraIssue getResponse() {

-      return response;

-    }

-    

-    public void finishUp() throws InterruptedException, IOException, ResponseException {

-      join();

-      Throwable thr = exception;

-      if (thr != null) {

-        if (thr instanceof IOException) {

-          throw (IOException) thr;

-        } else if (thr instanceof ResponseException) {

-          throw (ResponseException) thr;

-        } else if (thr instanceof RuntimeException) {

-          throw (RuntimeException) thr;

-        } else {

-          throw (Error) thr;

-        }

-      }

-    }

-  }

-

-}

-

diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraServerInfo.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraServerInfo.java
deleted file mode 100644
index 10767a0..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraServerInfo.java
+++ /dev/null
@@ -1,48 +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 org.apache.manifoldcf.crawler.connectors.jira;
-
-import org.json.simple.JSONObject;
-
-/** An instance of this class represents the ServerInfo, but is used only to get the baseUrl.
- * Other fields that are available: versionNumbers, buildDate, serverTime, scmInfo, serverTitle
-*/
-public class JiraServerInfo extends JiraJSONResponse {
-	
-  // Specific keys we care about
-  private final static String BASEURL = "baseUrl";
-  private final static String BUILDNUMBER = "buildNumber";
-  private final static String VERSION = "version";
-
-  public JiraServerInfo() {
-    super();
-  }
-
-  public String getBaseUrl() {
-    return (String)((JSONObject)object).get(BASEURL);
-  }
-
-  public Long getBuildNumber() {
-    return (Long)((JSONObject)object).get(BUILDNUMBER);
-  }
-  
-  public String getVersion() {
-    return (String)((JSONObject)object).get(VERSION);
-  }
-  
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraSession.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraSession.java
deleted file mode 100644
index 24ba2c0..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraSession.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/* $Id: JiraSession.java 1490586 2013-06-07 11:14:52Z kwright $ */

-/**

- * 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 org.apache.manifoldcf.crawler.connectors.jira;

-

-import org.apache.manifoldcf.core.common.*;

-import org.apache.manifoldcf.connectorcommon.common.*;

-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-

-import java.io.Reader;

-import java.io.Writer;

-import java.io.ByteArrayInputStream;

-import java.io.StringWriter;

-import java.io.IOException;

-import java.io.InputStream;

-import java.io.InputStreamReader;

-

-import org.apache.manifoldcf.core.util.URLEncoder;

-

-import java.nio.charset.Charset;

-import java.nio.charset.StandardCharsets;

-import java.util.Map;

-import java.util.HashMap;

-import java.util.List;

-import java.util.ArrayList;

-

-import org.apache.http.conn.HttpClientConnectionManager;

-import org.apache.http.client.HttpClient;

-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

-import org.apache.http.impl.client.HttpClientBuilder;

-import org.apache.http.protocol.HttpRequestExecutor;

-import org.apache.http.impl.client.HttpClients;

-import org.apache.http.client.config.RequestConfig;

-import org.apache.http.client.CredentialsProvider;

-import org.apache.http.impl.client.BasicCredentialsProvider;

-import org.apache.http.config.SocketConfig;

-import org.apache.http.HttpEntity;

-import org.apache.http.HttpResponse;

-import org.apache.http.HttpHost;

-import org.apache.http.auth.AuthScope;

-import org.apache.http.auth.UsernamePasswordCredentials;

-import org.apache.http.auth.NTCredentials;

-import org.apache.http.client.methods.HttpGet;

-import org.apache.http.client.methods.HttpRequestBase;

-import org.apache.http.impl.client.LaxRedirectStrategy;

-import org.apache.http.util.EntityUtils;

-import org.apache.http.client.HttpRequestRetryHandler;

-import org.apache.http.protocol.HttpContext;

-import org.apache.http.config.RegistryBuilder;

-import org.apache.http.conn.socket.ConnectionSocketFactory;

-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

-import org.apache.http.conn.socket.PlainConnectionSocketFactory;

-import org.apache.http.conn.ssl.NoopHostnameVerifier;

-import org.apache.http.entity.ContentType;

-import org.apache.http.client.AuthCache;

-import org.apache.http.impl.client.BasicAuthCache;

-import org.apache.http.impl.auth.BasicScheme;

-import org.apache.http.client.protocol.HttpClientContext;

-import org.apache.http.ParseException;

-import org.json.simple.JSONObject;

-import org.json.simple.JSONValue;

-import org.json.simple.JSONArray;

-

-/**

- *

- * @author andrew

- */

-public class JiraSession {

-

-  private final HttpHost host;

-  private final String path;

-  private final String clientId;

-  private final String clientSecret;

-  private String baseUrl;

-  

-  private HttpClientConnectionManager connectionManager;

-  private HttpClient httpClient;

-  

-  // Current host name

-  private static String currentHost = null;

-  static

-  {

-    // Find the current host name

-    try

-    {

-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();

-

-      // Get hostname

-      currentHost = addr.getHostName();

-    }

-    catch (java.net.UnknownHostException e)

-    {

-    }

-  }

-

-  /**

-   * Constructor. Create a session.

-   */

-  public JiraSession(String clientId, String clientSecret,

-    String protocol, String host, int port, String path,

-    String proxyHost, int proxyPort, String proxyDomain, String proxyUsername, String proxyPassword)

-    throws ManifoldCFException {

-    this.host = new HttpHost(host,port,protocol);

-    this.path = path;

-    this.clientId = clientId;

-    this.clientSecret = clientSecret;

-

-    int socketTimeout = 900000;

-    int connectionTimeout = 60000;

-

-    javax.net.ssl.SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();

-    SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeout),

-      NoopHostnameVerifier.INSTANCE);

-

-    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()

-        .register("http", PlainConnectionSocketFactory.getSocketFactory())

-        .register("https", myFactory)

-        .build());

-    poolingConnectionManager.setDefaultMaxPerRoute(1);

-    poolingConnectionManager.setValidateAfterInactivity(2000);

-    poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()

-      .setTcpNoDelay(true)

-      .setSoTimeout(socketTimeout)

-      .build());

-    connectionManager = poolingConnectionManager;

-

-    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

-

-    // If authentication needed, set that

-    if (clientId != null)

-    {

-      credentialsProvider.setCredentials(

-        AuthScope.ANY,

-        new UsernamePasswordCredentials(clientId,clientSecret));

-    }

-

-    RequestConfig.Builder requestBuilder = RequestConfig.custom()

-      .setCircularRedirectsAllowed(true)

-      .setSocketTimeout(socketTimeout)

-      .setExpectContinueEnabled(true)

-      .setConnectTimeout(connectionTimeout)

-      .setConnectionRequestTimeout(socketTimeout);

-

-    // If there's a proxy, set that too.

-    if (proxyHost != null && proxyHost.length() > 0)

-    {

-

-

-      // Configure proxy authentication

-      if (proxyUsername != null && proxyUsername.length() > 0)

-      {

-        if (proxyPassword == null)

-          proxyPassword = "";

-        if (proxyDomain == null)

-          proxyDomain = "";

-

-        credentialsProvider.setCredentials(

-          new AuthScope(proxyHost, proxyPort),

-          new NTCredentials(proxyUsername, proxyPassword, currentHost, proxyDomain));

-      }

-

-      HttpHost proxy = new HttpHost(proxyHost, proxyPort);

-      requestBuilder.setProxy(proxy);

-    }

-

-    httpClient = HttpClients.custom()

-      .setConnectionManager(connectionManager)

-      .disableAutomaticRetries()

-      .setDefaultRequestConfig(requestBuilder.build())

-      .setDefaultCredentialsProvider(credentialsProvider)

-      .setRequestExecutor(new HttpRequestExecutor(socketTimeout))

-      .setRedirectStrategy(new LaxRedirectStrategy())

-      .build();

-

-  }

-

-  /**

-   * Close session.

-   */

-  public void close() {

-    httpClient = null;

-    if (connectionManager != null)

-      connectionManager.shutdown();

-    connectionManager = null;

-  }

-

-  private static Object convertToJSON(HttpResponse httpResponse)

-    throws IOException {

-    HttpEntity entity = httpResponse.getEntity();

-    if (entity != null) {

-      InputStream is = entity.getContent();

-      try {

-        Reader r = new InputStreamReader(is,getCharSet(entity));

-        return JSONValue.parse(r);

-      } finally {

-        is.close();

-      }

-    }

-    return null;

-  }

-

-  private static String convertToString(HttpResponse httpResponse)

-    throws IOException {

-    HttpEntity entity = httpResponse.getEntity();

-    if (entity != null) {

-      InputStream is = entity.getContent();

-      try {

-        char[] buffer = new char[65536];

-        Reader r = new InputStreamReader(is,getCharSet(entity));

-        Writer w = new StringWriter();

-        try {

-          while (true) {

-            int amt = r.read(buffer);

-            if (amt == -1)

-              break;

-            w.write(buffer,0,amt);

-          }

-        } finally {

-          w.flush();

-        }

-        return w.toString();

-      } finally {

-        is.close();

-      }

-    }

-    return "";

-  }

-

-  private static Charset getCharSet(HttpEntity entity)

-  {

-    Charset charSet;

-    try

-    {

-      ContentType ct = ContentType.get(entity);

-      if (ct == null)

-        charSet = StandardCharsets.UTF_8;

-      else

-        charSet = ct.getCharset();

-    }

-    catch (ParseException e)

-    {

-      charSet = StandardCharsets.UTF_8;

-    }

-    return charSet;

-  }

-  

-  private void getRest(String rightside, JiraJSONResponse response) 

-    throws IOException, ResponseException {

-

-    // Create AuthCache instance

-    AuthCache authCache = new BasicAuthCache();

-    // Generate BASIC scheme object and add it to the local

-    // auth cache

-    BasicScheme basicAuth = new BasicScheme();

-    authCache.put(host, basicAuth);

-

-    // Add AuthCache to the execution context

-    HttpClientContext localContext = HttpClientContext.create();

-    localContext.setAuthCache(authCache);

-

-    final HttpRequestBase method = new HttpGet(host.toURI() + path + rightside);

-    method.addHeader("Accept", "application/json");

-

-    try {

-      HttpResponse httpResponse = httpClient.execute(method,localContext);

-      int resultCode = httpResponse.getStatusLine().getStatusCode();

-      if (resultCode != 200)

-        throw new IOException("Unexpected result code "+resultCode+": "+convertToString(httpResponse));

-      Object jo = convertToJSON(httpResponse);

-      response.acceptJSONObject(jo);

-    } finally {

-      method.abort();

-    }

-  }

-

-  /**

-   * Obtain repository information.

-   */

-  public Map<String, String> getRepositoryInfo()

-    throws IOException, ResponseException {

-    HashMap<String, String> statistics = new HashMap<String, String>();

-    JiraQueryResults qr = new JiraQueryResults();

-    getRest("search?maxResults=1&jql=", qr);

-    statistics.put("Total Issues", qr.getTotal().toString());

-    return statistics;

-  }

-  

-  /**

-   * Get baseUrl via serverInfo API call

-   * @return

-   * @throws IOException

-   * @throws ResponseException

-   */

-  public String getBaseUrl() throws IOException, ResponseException {

-    if (this.baseUrl == null) {

-      JiraServerInfo jiraServerInfo = new JiraServerInfo();

-      getRest("serverInfo",jiraServerInfo);

-      this.baseUrl = jiraServerInfo.getBaseUrl();

-    }

-    return this.baseUrl;

-  }

-

-  /**

-   * Get the list of matching root documents, e.g. seeds.

-   */

-  public void getSeeds(XThreadStringBuffer idBuffer, String jiraDriveQuery)

-      throws IOException, ResponseException, InterruptedException, ManifoldCFException {

-    long startAt = 0L;

-    long setSize = 800L;

-    long totalAmt = 0L;

-    do {

-      JiraQueryResults qr = new JiraQueryResults();

-      getRest("search?maxResults=" + setSize + "&startAt=" + startAt + "&jql=" + URLEncoder.encode(jiraDriveQuery), qr);

-      Long total = qr.getTotal();

-      if (total == null)

-        return;

-      totalAmt = total.longValue();

-      qr.pushIds(idBuffer);

-      startAt += setSize;

-    } while (startAt < totalAmt);

-  }

-

-  /**

-  * Get the list of users that can see the specified issue.

-  */

-  public List<String> getUsers(String issueKey)

-    throws IOException, ResponseException, ManifoldCFException {

-    List<String> rval = new ArrayList<String>();

-    long startAt = 0L;

-    long setSize = 800L;

-    while (true) {

-      JiraUserQueryResults qr = new JiraUserQueryResults();

-      getRest("user/viewissue/search?username=%27%27&issueKey="+URLEncoder.encode(issueKey)+"&maxResults=" + setSize + "&startAt=" + startAt, qr);

-      qr.getNames(rval);

-      startAt += setSize;

-      if (rval.size() < startAt)

-        break;

-    }

-    return rval;

-  }

-

-  /**

-   * Get an individual issue.

-   */

-  public JiraIssue getIssue(String issueKey)

-    throws IOException, ResponseException, ManifoldCFException {

-    JiraIssue ji = new JiraIssue();

-    getRest("issue/" + URLEncoder.encode(issueKey), ji);

-    return ji;

-  }

-

-

-}

diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraUserQueryResults.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraUserQueryResults.java
deleted file mode 100644
index a53dedf..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraUserQueryResults.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jira;
-
-import org.apache.manifoldcf.core.common.*;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.ArrayList;
-
-import org.json.simple.JSONObject;
-import org.json.simple.JSONArray;
-
-/** An instance of this class represents the results of a Jira user query, and
-* the ability to parse the corresponding JSON response.
-*/
-public class JiraUserQueryResults extends JiraJSONResponse {
-
-  // Specific keys we care about
-  private final static String KEY_NAME = "name";
-
-  public JiraUserQueryResults() {
-    super();
-  }
-
-  public void getNames(List<String> nameBuffer) {
-    JSONArray users = (JSONArray)object;
-    for (Object user : users) {
-      if (user instanceof JSONObject) {
-        JSONObject jo = (JSONObject)user;
-        nameBuffer.add(jo.get(KEY_NAME).toString());
-      }
-    }
-  }
-  
-}
diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/Messages.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/Messages.java
deleted file mode 100644
index c8d4841..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1488537 2013-06-01 15:30:15Z kwright $ */

-

-/**

-* 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 org.apache.manifoldcf.crawler.connectors.jira;

-

-import java.util.Locale;

-import java.util.Map;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-

-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages

-{

-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.jira.common";

-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.jira";

-  

-  /** Constructor - do no instantiate

-  */

-  protected Messages()

-  {

-  }

-  

-  public static String getString(Locale locale, String messageKey)

-  {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey)

-  {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey)

-  {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey)

-  {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey)

-  {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getString(Locale locale, String messageKey, Object[] args)

-  {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-  

-  public static String getBodyString(Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  // More general methods which allow bundlenames and class loaders to be specified.

-  

-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);

-  }

-  

-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  // Resource output

-  

-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException

-  {

-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,

-      substitutionParameters,mapToUpperCase);

-  }

-  

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException

-  {

-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,

-      substitutionParameters,mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,Object> contextObjects)

-    throws ManifoldCFException

-  {

-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,

-      contextObjects);

-  }

-  

-}

-

diff --git a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/ResponseException.java b/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/ResponseException.java
deleted file mode 100644
index 94b4f4d..0000000
--- a/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/ResponseException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.jira;
-
-/** This exception is thrown when the response from REST is not what
-* was expected.
- */
-public class ResponseException extends Exception {
-
-  public ResponseException(String msg) {
-    super(msg);
-  }
-  
-  public ResponseException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-}
diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_en_US.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_en_US.properties
deleted file mode 100644
index 4c6dfd6..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_en_US.properties
+++ /dev/null
@@ -1,40 +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.
-
-JiraAuthorityConnector.Server=Server
-JiraAuthorityConnector.Proxy=Proxy
-
-JiraAuthorityConnector.JiraProtocolColon=JIRA protocol:
-JiraAuthorityConnector.JiraHostColon=JIRA host:
-JiraAuthorityConnector.JiraPortColon=JIRA port:
-JiraAuthorityConnector.JiraRESTAPIPathColon=JIRA REST API path:
-JiraAuthorityConnector.ClientIDColon=Client ID (Optional):
-JiraAuthorityConnector.ClientSecretColon=Client Secret (Optional):
-
-JiraAuthorityConnector.JiraProxyHostColon=Proxy host:
-JiraAuthorityConnector.JiraProxyPortColon=Proxy port:
-JiraAuthorityConnector.JiraProxyDomainColon=Proxy authentication domain:
-JiraAuthorityConnector.JiraProxyUsernameColon=Proxy authentication user name:
-JiraAuthorityConnector.JiraProxyPasswordColon=Proxy authentication password:
-
-JiraAuthorityConnector.JiraHostMustNotBeNull=JIRA host must not be null
-JiraAuthorityConnector.JiraHostMustNotIncludeSlash=JIRA host must not include a '/' character
-JiraAuthorityConnector.JiraPortMustBeAnInteger=JIRA port must be an integer
-JiraAuthorityConnector.JiraPathMustNotBeNull=JIRA path must not be null
-JiraAuthorityConnector.JiraPathMustBeginWithASlash=JIRA path must begin with a '/' character
-
-JiraAuthorityConnector.JiraProxyPortMustBeAnInteger=Proxy port must be an integer
-JiraAuthorityConnector.JiraProxyHostMustNotIncludeSlash=Proxy host cannot include a '/' character
-
diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_es_ES.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_es_ES.properties
deleted file mode 100644
index 0808c53..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_es_ES.properties
+++ /dev/null
@@ -1,40 +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.
-
-JiraAuthorityConnector.Server=Servidor
-JiraAuthorityConnector.Proxy=Proxy
-
-JiraAuthorityConnector.JiraProtocolColon=protocolo de JIRA:
-JiraAuthorityConnector.JiraHostColon=JIRA host:
-JiraAuthorityConnector.JiraPortColon=JIRA puerto:
-JiraAuthorityConnector.JiraRESTAPIPathColon=JIRA Ruta API REST:
-JiraAuthorityConnector.ClientIDColon=Cliente ID (Opcional):
-JiraAuthorityConnector.ClientSecretColon=Cliente Secreto (Opcional):
-
-JiraAuthorityConnector.JiraProxyHostColon=Proxy host:
-JiraAuthorityConnector.JiraProxyPortColon=Proxy puerto:
-JiraAuthorityConnector.JiraProxyDomainColon=Proxy dominio de autenticación:
-JiraAuthorityConnector.JiraProxyUsernameColon=Proxy nombre de usuario de autenticación:
-JiraAuthorityConnector.JiraProxyPasswordColon=Proxy contraseña de autenticación:
-
-JiraAuthorityConnector.JiraHostMustNotBeNull=JIRA host no debe ser nulo
-JiraAuthorityConnector.JiraHostMustNotIncludeSlash=JIRA host no debe incluir una '/' carácter
-JiraAuthorityConnector.JiraPortMustBeAnInteger=JIRA puerto debe ser un número entero
-JiraAuthorityConnector.JiraPathMustNotBeNull=JIRA camino no debe ser nulo
-JiraAuthorityConnector.JiraPathMustBeginWithASlash=JIRA ruta debe comenzar con una '/' carácter
-
-JiraAuthorityConnector.JiraProxyPortMustBeAnInteger=Proxy puerto debe ser un número entero
-JiraAuthorityConnector.JiraProxyHostMustNotIncludeSlash=Proxy host no puede incluir una '/' carácter
-
diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_ja_JP.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_ja_JP.properties
deleted file mode 100644
index 96237dc..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_ja_JP.properties
+++ /dev/null
@@ -1,39 +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.
-
-JiraAuthorityConnector.Server=Server
-JiraAuthorityConnector.Proxy=Proxy
-
-JiraAuthorityConnector.JiraProtocolColon=JIRA protocol:
-JiraAuthorityConnector.JiraHostColon=JIRA host:
-JiraAuthorityConnector.JiraPortColon=JIRA port:
-JiraAuthorityConnector.JiraRESTAPIPathColon=JIRA REST API path:
-JiraAuthorityConnector.ClientIDColon=Client ID (Optional):
-JiraAuthorityConnector.ClientSecretColon=Client Secret (Optional):
-
-JiraAuthorityConnector.JiraProxyHostColon=Proxy host:
-JiraAuthorityConnector.JiraProxyPortColon=Proxy port:
-JiraAuthorityConnector.JiraProxyDomainColon=Proxy authentication domain:
-JiraAuthorityConnector.JiraProxyUsernameColon=Proxy authentication user name:
-JiraAuthorityConnector.JiraProxyPasswordColon=Proxy authentication password:
-
-JiraAuthorityConnector.JiraHostMustNotBeNull=JIRA host must not be null
-JiraAuthorityConnector.JiraHostMustNotIncludeSlash=JIRA host must not include a '/' character
-JiraAuthorityConnector.JiraPortMustBeAnInteger=JIRA port must be an integer
-JiraAuthorityConnector.JiraPathMustNotBeNull=JIRA path must not be null
-JiraAuthorityConnector.JiraPathMustBeginWithASlash=JIRA path must begin with a '/' character
-
-JiraAuthorityConnector.JiraProxyPortMustBeAnInteger=Proxy port must be an integer
-JiraAuthorityConnector.JiraProxyHostMustNotIncludeSlash=Proxy host cannot include a '/' character
diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_zh_CN.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_zh_CN.properties
deleted file mode 100644
index 7602a9f..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/jira/common_zh_CN.properties
+++ /dev/null
@@ -1,39 +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.
-
-JiraAuthorityConnector.Server=服务器
-JiraAuthorityConnector.Proxy=代理
-
-JiraAuthorityConnector.JiraProtocolColon=JIRA协议:
-JiraAuthorityConnector.JiraHostColon=JIRA主机:
-JiraAuthorityConnector.JiraPortColon=JIRA端口:
-JiraAuthorityConnector.JiraRESTAPIPathColon=JIRA REST API路径:
-JiraAuthorityConnector.ClientIDColon=Client ID(可选):
-JiraAuthorityConnector.ClientSecretColon=Client Secret(可选):
-
-JiraAuthorityConnector.JiraProxyHostColon=代理主机:
-JiraAuthorityConnector.JiraProxyPortColon=代理端口:
-JiraAuthorityConnector.JiraProxyDomainColon=代理授权域:
-JiraAuthorityConnector.JiraProxyUsernameColon=代理授权用户名:
-JiraAuthorityConnector.JiraProxyPasswordColon=代理授权密码:
-
-JiraAuthorityConnector.JiraHostMustNotBeNull=JIRA主机不能为Null
-JiraAuthorityConnector.JiraHostMustNotIncludeSlash=JIRA主机不能包含‘/’字符
-JiraAuthorityConnector.JiraPortMustBeAnInteger=JIRA端口必须为整数
-JiraAuthorityConnector.JiraPathMustNotBeNull=JIRA路径不能为Null
-JiraAuthorityConnector.JiraPathMustBeginWithASlash=JIRA路径的第一个字符必须为‘/’字符
-
-JiraAuthorityConnector.JiraProxyPortMustBeAnInteger=代理端口必须为整数
-JiraAuthorityConnector.JiraProxyHostMustNotIncludeSlash=代理主机不能包含‘/’字符
diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_en_US.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_en_US.properties
deleted file mode 100644
index bcb529a..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_en_US.properties
+++ /dev/null
@@ -1,56 +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.

-

-JiraRepositoryConnector.Server=Server

-JiraRepositoryConnector.Proxy=Proxy

-JiraRepositoryConnector.JiraQuery=Seed Query

-JiraRepositoryConnector.Security=Security

-

-JiraRepositoryConnector.JiraProtocolColon=JIRA protocol:

-JiraRepositoryConnector.JiraHostColon=JIRA host:

-JiraRepositoryConnector.JiraPortColon=JIRA port:

-JiraRepositoryConnector.JiraRESTAPIPathColon=JIRA REST API path:

-JiraRepositoryConnector.ClientIDColon=Client ID (Optional):

-JiraRepositoryConnector.ClientSecretColon=Client Secret (Optional):

-

-JiraRepositoryConnector.JiraProxyHostColon=Proxy host:

-JiraRepositoryConnector.JiraProxyPortColon=Proxy port:

-JiraRepositoryConnector.JiraProxyDomainColon=Proxy authentication domain:

-JiraRepositoryConnector.JiraProxyUsernameColon=Proxy authentication user name:

-JiraRepositoryConnector.JiraProxyPasswordColon=Proxy authentication password:

-

-JiraRepositoryConnector.JiraHostMustNotBeNull=JIRA host must not be null

-JiraRepositoryConnector.JiraHostMustNotIncludeSlash=JIRA host must not include a '/' character

-JiraRepositoryConnector.JiraPortMustBeAnInteger=JIRA port must be an integer

-JiraRepositoryConnector.JiraPathMustNotBeNull=JIRA path must not be null

-JiraRepositoryConnector.JiraPathMustBeginWithASlash=JIRA path must begin with a '/' character

-

-JiraRepositoryConnector.JiraProxyPortMustBeAnInteger=Proxy port must be an integer

-JiraRepositoryConnector.JiraProxyHostMustNotIncludeSlash=Proxy host cannot include a '/' character

-

-JiraRepositoryConnector.JiraQueryColon=JIRA query:

-JiraRepositoryConnector.SeedQueryCannotBeNull=Seed query cannot be null

-

-JiraRepositoryConnector.SecurityColon=Security:

-JiraRepositoryConnector.Enabled=Enabled

-JiraRepositoryConnector.Disabled=Disabled

-

-JiraRepositoryConnector.NoAccessTokensPresent=No access tokens present

-JiraRepositoryConnector.Add=Add

-JiraRepositoryConnector.AddAccessToken=Add access token

-JiraRepositoryConnector.Delete=Delete

-JiraRepositoryConnector.DeleteToken=Delete token #

-JiraRepositoryConnector.AccessTokensColon=Access tokens:

-JiraRepositoryConnector.TypeInAnAccessToken=Type in an access token

diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_es_ES.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_es_ES.properties
deleted file mode 100644
index 3a3103a..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_es_ES.properties
+++ /dev/null
@@ -1,56 +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.

-

-JiraRepositoryConnector.Server=Servidor

-JiraRepositoryConnector.Proxy=Proxy

-JiraRepositoryConnector.JiraQuery=consulta Semilla

-JiraRepositoryConnector.Security=Seguridad

-

-JiraRepositoryConnector.JiraProtocolColon=JIRA protocolo:

-JiraRepositoryConnector.JiraHostColon=JIRA host:

-JiraRepositoryConnector.JiraPortColon=JIRA Puerto:

-JiraRepositoryConnector.JiraRESTAPIPathColon=JIRA Ruta API REST:

-JiraRepositoryConnector.ClientIDColon=Cliente ID (Opcional):

-JiraRepositoryConnector.ClientSecretColon=Cliente Secreto (Opcional):

-

-JiraRepositoryConnector.JiraProxyHostColon=Proxy host:

-JiraRepositoryConnector.JiraProxyPortColon=Proxy Puerto:

-JiraRepositoryConnector.JiraProxyDomainColon=Proxy dominio de autenticación:

-JiraRepositoryConnector.JiraProxyUsernameColon=Proxy nombre de usuario de autenticación:

-JiraRepositoryConnector.JiraProxyPasswordColon=Proxy contraseña de autenticación:

-

-JiraRepositoryConnector.JiraHostMustNotBeNull=JIRA host no debe ser nulo

-JiraRepositoryConnector.JiraHostMustNotIncludeSlash=JIRA host no debe incluir una '/' carácter

-JiraRepositoryConnector.JiraPortMustBeAnInteger=JIRA puerto debe ser un número entero

-JiraRepositoryConnector.JiraPathMustNotBeNull=JIRA camino no debe ser nulo

-JiraRepositoryConnector.JiraPathMustBeginWithASlash=JIRA ruta debe comenzar con una '/' carácter

-

-JiraRepositoryConnector.JiraProxyPortMustBeAnInteger=Proxy puerto debe ser un número entero

-JiraRepositoryConnector.JiraProxyHostMustNotIncludeSlash=Proxy host no puede incluir una '/' carácter

-

-JiraRepositoryConnector.JiraQueryColon=consulta JIRA:
-JiraRepositoryConnector.SeedQueryCannotBeNull=Consulta de semilla no puede ser nulo
-
-JiraRepositoryConnector.SecurityColon=Seguridad
-JiraRepositoryConnector.Enabled=Habilitado
-JiraRepositoryConnector.Disabled=Imposibilitado
-
-JiraRepositoryConnector.NoAccessTokensPresent=No hay señales de acceso token
-JiraRepositoryConnector.Add=Añadir
-JiraRepositoryConnector.AddAccessToken=Añadir token de acceso
-JiraRepositoryConnector.Delete=Borrar
-JiraRepositoryConnector.DeleteToken=Borrar token #
-JiraRepositoryConnector.AccessTokensColon=Acceso de señal tokens:
-JiraRepositoryConnector.TypeInAnAccessToken=Escriba en un token de acceso
diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_ja_JP.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_ja_JP.properties
deleted file mode 100644
index bcb529a..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_ja_JP.properties
+++ /dev/null
@@ -1,56 +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.

-

-JiraRepositoryConnector.Server=Server

-JiraRepositoryConnector.Proxy=Proxy

-JiraRepositoryConnector.JiraQuery=Seed Query

-JiraRepositoryConnector.Security=Security

-

-JiraRepositoryConnector.JiraProtocolColon=JIRA protocol:

-JiraRepositoryConnector.JiraHostColon=JIRA host:

-JiraRepositoryConnector.JiraPortColon=JIRA port:

-JiraRepositoryConnector.JiraRESTAPIPathColon=JIRA REST API path:

-JiraRepositoryConnector.ClientIDColon=Client ID (Optional):

-JiraRepositoryConnector.ClientSecretColon=Client Secret (Optional):

-

-JiraRepositoryConnector.JiraProxyHostColon=Proxy host:

-JiraRepositoryConnector.JiraProxyPortColon=Proxy port:

-JiraRepositoryConnector.JiraProxyDomainColon=Proxy authentication domain:

-JiraRepositoryConnector.JiraProxyUsernameColon=Proxy authentication user name:

-JiraRepositoryConnector.JiraProxyPasswordColon=Proxy authentication password:

-

-JiraRepositoryConnector.JiraHostMustNotBeNull=JIRA host must not be null

-JiraRepositoryConnector.JiraHostMustNotIncludeSlash=JIRA host must not include a '/' character

-JiraRepositoryConnector.JiraPortMustBeAnInteger=JIRA port must be an integer

-JiraRepositoryConnector.JiraPathMustNotBeNull=JIRA path must not be null

-JiraRepositoryConnector.JiraPathMustBeginWithASlash=JIRA path must begin with a '/' character

-

-JiraRepositoryConnector.JiraProxyPortMustBeAnInteger=Proxy port must be an integer

-JiraRepositoryConnector.JiraProxyHostMustNotIncludeSlash=Proxy host cannot include a '/' character

-

-JiraRepositoryConnector.JiraQueryColon=JIRA query:

-JiraRepositoryConnector.SeedQueryCannotBeNull=Seed query cannot be null

-

-JiraRepositoryConnector.SecurityColon=Security:

-JiraRepositoryConnector.Enabled=Enabled

-JiraRepositoryConnector.Disabled=Disabled

-

-JiraRepositoryConnector.NoAccessTokensPresent=No access tokens present

-JiraRepositoryConnector.Add=Add

-JiraRepositoryConnector.AddAccessToken=Add access token

-JiraRepositoryConnector.Delete=Delete

-JiraRepositoryConnector.DeleteToken=Delete token #

-JiraRepositoryConnector.AccessTokensColon=Access tokens:

-JiraRepositoryConnector.TypeInAnAccessToken=Type in an access token

diff --git a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_zh_CN.properties b/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_zh_CN.properties
deleted file mode 100644
index a48acf4..0000000
--- a/connectors/jira/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/jira/common_zh_CN.properties
+++ /dev/null
@@ -1,56 +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.
-
-JiraRepositoryConnector.Server=服务器
-JiraRepositoryConnector.Proxy=代理
-JiraRepositoryConnector.JiraQuery=JIRA查询
-JiraRepositoryConnector.Security=安全
-
-JiraRepositoryConnector.JiraProtocolColon=JIRA协议:
-JiraRepositoryConnector.JiraHostColon=JIRA主机:
-JiraRepositoryConnector.JiraPortColon=JIRA端口:
-JiraRepositoryConnector.JiraRESTAPIPathColon=JIRA REST API路径:
-JiraRepositoryConnector.ClientIDColon=Client ID (可选):
-JiraRepositoryConnector.ClientSecretColon=Client Secret(可选):
-
-JiraRepositoryConnector.JiraProxyHostColon=代理主机:
-JiraRepositoryConnector.JiraProxyPortColon=代理端口:
-JiraRepositoryConnector.JiraProxyDomainColon=代理授权域:
-JiraRepositoryConnector.JiraProxyUsernameColon=代理授权用户名:
-JiraRepositoryConnector.JiraProxyPasswordColon=代理授权密码:
-
-JiraRepositoryConnector.JiraHostMustNotBeNull=JIRA主机不能为Null
-JiraRepositoryConnector.JiraHostMustNotIncludeSlash=JIRA主机不能包含‘/’字符
-JiraRepositoryConnector.JiraPortMustBeAnInteger=JIRA端口必须为整数
-JiraRepositoryConnector.JiraPathMustNotBeNull=JIRA路径不能为空
-JiraRepositoryConnector.JiraPathMustBeginWithASlash=JIRA路径的第一个字符必须为‘/’字符
-
-JiraRepositoryConnector.JiraProxyPortMustBeAnInteger=代理端口必须为整数
-JiraRepositoryConnector.JiraProxyHostMustNotIncludeSlash=代理主机不能包含‘/’字符
-
-JiraRepositoryConnector.JiraQueryColon=JIRA查询:
-JiraRepositoryConnector.SeedQueryCannotBeNull=种子查询不能为Null
-
-JiraRepositoryConnector.SecurityColon=安全:
-JiraRepositoryConnector.Enabled=有效
-JiraRepositoryConnector.Disabled=无效
-
-JiraRepositoryConnector.NoAccessTokensPresent=访问令牌不存在
-JiraRepositoryConnector.Add=添加
-JiraRepositoryConnector.AddAccessToken=添加访问令牌
-JiraRepositoryConnector.Delete=删除
-JiraRepositoryConnector.DeleteToken=删除令牌 #
-JiraRepositoryConnector.AccessTokensColon=访问令牌:
-JiraRepositoryConnector.TypeInAnAccessToken=请输入访问令牌
diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira.js b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira.js
deleted file mode 100644
index ce40411..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira.js
+++ /dev/null
@@ -1,122 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.jiraport.value != "" && !isInteger(editconnection.jiraport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPortMustBeAnInteger'))");
-    editconnection.jiraport.focus();
-    return false;
-  }
-
-  if (editconnection.jirahost.value != "" && editconnection.jirahost.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraHostMustNotIncludeSlash'))");
-    editconnection.jirahost.focus();
-    return false;
-  }
-
-  if (editconnection.jirapath.value != "" && !(editconnection.jirapath.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPathMustBeginWithASlash'))");
-    editconnection.jirapath.focus();
-    return false;
-  }
-
-  if (editconnection.jiraproxyport.value != "" && !isInteger(editconnection.jiraproxyport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyPortMustBeAnInteger'))");
-    editconnection.jiraproxyport.focus();
-    return false;
-  }
-
-  if (editconnection.jiraproxyhost.value != "" && editconnection.jiraproxyhost.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyHostMustNotIncludeSlash'))");
-    editconnection.jiraproxyhost.focus();
-    return false;
-  }
-
-  return true;
-}
- 
-function checkConfigForSave()
-{
-    
-  if (editconnection.jirahost.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraHostMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Server'))");
-    editconnection.jirahost.focus();
-    return false;
-  }
-  
-  if (editconnection.jirahost.value != "" && editconnection.jirahost.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraHostMustNotIncludeSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Server'))");
-    editconnection.jirahost.focus();
-    return false;
-  }
-
-  if (editconnection.jiraport.value != "" && !isInteger(editconnection.jiraport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Server'))");
-    editconnection.jiraport.focus();
-    return false;
-  }
-
-  if (editconnection.jirapath.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPathMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Server'))");
-    editconnection.jirapath.focus();
-    return false;
-  }
-  
-  if (editconnection.jirapath.value != "" && !(editconnection.jirapath.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPathMustBeginWithASlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Server'))");
-    editconnection.jirapath.focus();
-    return false;
-  }
-
-  if (editconnection.jiraproxyhost.value != "" && editconnection.jiraproxyhost.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyHostMustNotIncludeSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Proxy'))");
-    editconnection.jirahost.focus();
-    return false;
-  }
-
-  if (editconnection.jiraproxyport.value != "" && !isInteger(editconnection.jiraproxyport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyPortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraAuthorityConnector.Proxy'))");
-    editconnection.jiraport.focus();
-    return false;
-  }
-
-  return true;
-}
-//-->
-</script>
diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira_proxy.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira_proxy.html
deleted file mode 100644
index 07df4bf..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira_proxy.html
+++ /dev/null
@@ -1,78 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('JiraAuthorityConnector.Proxy'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="jiraproxyhost" name="jiraproxyhost" value="$Encoder.attributeEscape($JIRAPROXYHOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="jiraproxyport" name="jiraproxyport" value="$Encoder.attributeEscape($JIRAPROXYPORT)" />
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="jiraproxydomain" name="jiraproxydomain" value="$Encoder.attributeEscape($JIRAPROXYDOMAIN)" />
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="jiraproxyusername" name="jiraproxyusername" value="$Encoder.attributeEscape($JIRAPROXYUSERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="jiraproxypassword" name="jiraproxypassword" value="$Encoder.attributeEscape($JIRAPROXYPASSWORD)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="jiraproxyhost" value="$Encoder.attributeEscape($JIRAPROXYHOST)" />
-<input type="hidden" name="jiraproxyport" value="$Encoder.attributeEscape($JIRAPROXYPORT)" />
-<input type="hidden" name="jiraproxydomain" value="$Encoder.attributeEscape($JIRAPROXYDOMAIN)" />
-<input type="hidden" name="jiraproxyusername" value="$Encoder.attributeEscape($JIRAPROXYUSERNAME)" />
-<input type="hidden" name="jiraproxypassword" value="$Encoder.attributeEscape($JIRAPROXYPASSWORD)" />
-
-#end
diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira_server.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira_server.html
deleted file mode 100644
index 1ee9e03..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/editConfiguration_jira_server.html
+++ /dev/null
@@ -1,99 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('JiraAuthorityConnector.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <select size="2" name="jiraprotocol">
-#if($JIRAPROTOCOL == 'http')
-        <option value="http" selected="true">http</option>
-#else
-        <option value="http">http</option>
-#end
-#if($JIRAPROTOCOL == 'https')
-        <option value="https" selected="true">https</option>
-#else
-        <option value="https">https</option>
-#end
-      </select>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="jirahost" name="jirahost" value="$Encoder.attributeEscape($JIRAHOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="jiraport" name="jiraport" value="$Encoder.attributeEscape($JIRAPORT)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraRESTAPIPathColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="jirapath" name="jirapath" value="$Encoder.attributeEscape($JIRAPATH)" />
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.ClientIDColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="clientid" name="clientid" value="$Encoder.attributeEscape($CLIENTID)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.ClientSecretColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="clientsecret" name="clientsecret" value="$Encoder.attributeEscape($CLIENTSECRET)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="jiraprotocol" value="$Encoder.attributeEscape($JIRAPROTOCOL)" />
-<input type="hidden" name="jirahost" value="$Encoder.attributeEscape($JIRAHOST)" />
-<input type="hidden" name="jiraport" value="$Encoder.attributeEscape($JIRAPORT)" />
-<input type="hidden" name="jirapath" value="$Encoder.attributeEscape($JIRAPATH)" />
-<input type="hidden" name="clientid" value="$Encoder.attributeEscape($CLIENTID)" />
-<input type="hidden" name="clientsecret" value="$Encoder.attributeEscape($CLIENTSECRET)" />
-
-#end
diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/viewConfiguration_jira.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/viewConfiguration_jira.html
deleted file mode 100644
index cb5cde2..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/jira/viewConfiguration_jira.html
+++ /dev/null
@@ -1,125 +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.
--->
-
-<table class="displaytable">
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProtocolColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPROTOCOL)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAHOST)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPORT)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraRESTAPIPathColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPATH)</nobr>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.ClientIDColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($CLIENTID)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.ClientSecretColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>********</nobr>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPROXYHOST)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPROXYPORT)</nobr>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPROXYDOMAIN)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($JIRAPROXYUSERNAME)</nobr>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraAuthorityConnector.JiraProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>********</nobr>
-    </td>
-  </tr>
-
-</table>
-
diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira.js b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira.js
deleted file mode 100644
index dfcde63..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira.js
+++ /dev/null
@@ -1,122 +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.

--->

-

-<script type="text/javascript">

-<!--

-function checkConfig()

-{

-  if (editconnection.jiraport.value != "" && !isInteger(editconnection.jiraport.value))

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPortMustBeAnInteger'))");

-    editconnection.jiraport.focus();

-    return false;

-  }

-

-  if (editconnection.jirahost.value != "" && editconnection.jirahost.value.indexOf("/") != -1)

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraHostMustNotIncludeSlash'))");

-    editconnection.jirahost.focus();

-    return false;

-  }

-

-  if (editconnection.jirapath.value != "" && !(editconnection.jirapath.value.indexOf("/") == 0))

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPathMustBeginWithASlash'))");

-    editconnection.jirapath.focus();

-    return false;

-  }

-

-  if (editconnection.jiraproxyport.value != "" && !isInteger(editconnection.jiraproxyport.value))

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyPortMustBeAnInteger'))");

-    editconnection.jiraproxyport.focus();

-    return false;

-  }

-

-  if (editconnection.jiraproxyhost.value != "" && editconnection.jiraproxyhost.value.indexOf("/") != -1)

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyHostMustNotIncludeSlash'))");

-    editconnection.jiraproxyhost.focus();

-    return false;

-  }

-

-  return true;

-}

- 

-function checkConfigForSave()

-{

-    

-  if (editconnection.jirahost.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraHostMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Server'))");

-    editconnection.jirahost.focus();

-    return false;

-  }

-  

-  if (editconnection.jirahost.value != "" && editconnection.jirahost.value.indexOf("/") != -1)

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraHostMustNotIncludeSlash'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Server'))");

-    editconnection.jirahost.focus();

-    return false;

-  }

-

-  if (editconnection.jiraport.value != "" && !isInteger(editconnection.jiraport.value))

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPortMustBeAnInteger'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Server'))");

-    editconnection.jiraport.focus();

-    return false;

-  }

-

-  if (editconnection.jirapath.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPathMustNotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Server'))");

-    editconnection.jirapath.focus();

-    return false;

-  }

-  

-  if (editconnection.jirapath.value != "" && !(editconnection.jirapath.value.indexOf("/") == 0))

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPathMustBeginWithASlash'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Server'))");

-    editconnection.jirapath.focus();

-    return false;

-  }

-  

-  if (editconnection.jiraproxyhost.value != "" && editconnection.jiraproxyhost.value.indexOf("/") != -1)

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyHostMustNotIncludeSlash'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Proxy'))");

-    editconnection.jirahost.focus();

-    return false;

-  }

-

-  if (editconnection.jiraproxyport.value != "" && !isInteger(editconnection.jiraproxyport.value))

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyPortMustBeAnInteger'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.Proxy'))");

-    editconnection.jiraport.focus();

-    return false;

-  }

-

-  return true;

-}

-//-->

-</script>

diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira_proxy.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira_proxy.html
deleted file mode 100644
index 90e059b..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira_proxy.html
+++ /dev/null
@@ -1,78 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('JiraRepositoryConnector.Proxy'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="jiraproxyhost" name="jiraproxyhost" value="$Encoder.attributeEscape($JIRAPROXYHOST)" />
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="5" type="text" id="jiraproxyport" name="jiraproxyport" value="$Encoder.attributeEscape($JIRAPROXYPORT)" />
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="32" type="text" id="jiraproxydomain" name="jiraproxydomain" value="$Encoder.attributeEscape($JIRAPROXYDOMAIN)" />
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="text" id="jiraproxyusername" name="jiraproxyusername" value="$Encoder.attributeEscape($JIRAPROXYUSERNAME)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input size="16" type="password" id="jiraproxypassword" name="jiraproxypassword" value="$Encoder.attributeEscape($JIRAPROXYPASSWORD)" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="jiraproxyhost" value="$Encoder.attributeEscape($JIRAPROXYHOST)" />
-<input type="hidden" name="jiraproxyport" value="$Encoder.attributeEscape($JIRAPROXYPORT)" />
-<input type="hidden" name="jiraproxydomain" value="$Encoder.attributeEscape($JIRAPROXYDOMAIN)" />
-<input type="hidden" name="jiraproxyusername" value="$Encoder.attributeEscape($JIRAPROXYUSERNAME)" />
-<input type="hidden" name="jiraproxypassword" value="$Encoder.attributeEscape($JIRAPROXYPASSWORD)" />
-
-#end
diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira_server.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira_server.html
deleted file mode 100644
index ca724f1..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editConfiguration_jira_server.html
+++ /dev/null
@@ -1,99 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('JiraRepositoryConnector.Server'))

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProtocolColon'))</nobr>

-    </td>

-    <td class="value">

-      <select size="2" name="jiraprotocol">

-#if($JIRAPROTOCOL == 'http')

-        <option value="http" selected="true">http</option>

-#else

-        <option value="http">http</option>

-#end

-#if($JIRAPROTOCOL == 'https')

-        <option value="https" selected="true">https</option>

-#else

-        <option value="https">https</option>

-#end

-      </select>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraHostColon'))</nobr>

-    </td>

-    <td class="value">

-      <input size="32" type="text" id="jirahost" name="jirahost" value="$Encoder.attributeEscape($JIRAHOST)" />

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPortColon'))</nobr>

-    </td>

-    <td class="value">

-      <input size="5" type="text" id="jiraport" name="jiraport" value="$Encoder.attributeEscape($JIRAPORT)" />

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraRESTAPIPathColon'))</nobr>

-    </td>

-    <td class="value">

-      <input size="32" type="text" id="jirapath" name="jirapath" value="$Encoder.attributeEscape($JIRAPATH)" />

-    </td>

-  </tr>

-  

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.ClientIDColon'))</nobr>

-    </td>

-    <td class="value">

-      <input size="16" type="text" id="clientid" name="clientid" value="$Encoder.attributeEscape($CLIENTID)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.ClientSecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <input size="16" type="password" id="clientsecret" name="clientsecret" value="$Encoder.attributeEscape($CLIENTSECRET)" />

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="jiraprotocol" value="$Encoder.attributeEscape($JIRAPROTOCOL)" />

-<input type="hidden" name="jirahost" value="$Encoder.attributeEscape($JIRAHOST)" />

-<input type="hidden" name="jiraport" value="$Encoder.attributeEscape($JIRAPORT)" />

-<input type="hidden" name="jirapath" value="$Encoder.attributeEscape($JIRAPATH)" />

-<input type="hidden" name="clientid" value="$Encoder.attributeEscape($CLIENTID)" />

-<input type="hidden" name="clientsecret" value="$Encoder.attributeEscape($CLIENTSECRET)" />

-

-#end

diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jira.js b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jira.js
deleted file mode 100644
index f717472..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jira.js
+++ /dev/null
@@ -1,54 +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.

--->

-

-<script type="text/javascript">

-<!--

-function s${SeqNum}_checkSpecificationForSave()

-{

-  if (editjob.s${SeqNum}_jiraquery.value == "") {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.SeedQueryCannotBeNull'))");

-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraQuery'))");

-    editjob.s${SeqNum}_jiraquery.focus();

-    return false;

-  }

-  return true;

-}

- 

-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)

-{

-  eval("editjob."+n+".value = \""+opValue+"\"");

-  postFormSetAnchor(anchorvalue);

-}

-

-function s${SeqNum}_SpecDeleteToken(i)

-{

-  s${SeqNum}_SpecOp("s${SeqNum}_accessop_"+i,"Delete","s${SeqNum}_token_"+i);

-}

-

-function s${SeqNum}_SpecAddToken(i)

-{

-  if (editjob.s${SeqNum}_spectoken.value == "")

-  {

-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('JiraRepositoryConnector.TypeInAnAccessToken'))");

-    editjob.s${SeqNum}_spectoken.focus();

-    return;

-  }

-  s${SeqNum}_SpecOp("s${SeqNum}_accessop","Add","s${SeqNum}_token_"+i);

-}

-

-//-->

-</script>

diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jiraQuery.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jiraQuery.html
deleted file mode 100644
index 877375d..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jiraQuery.html
+++ /dev/null
@@ -1,40 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('JiraRepositoryConnector.JiraQuery') && ${SeqNum} == ${SelectedNum})

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraQueryColon'))

-      </nobr>

-    </td>

-    <td class="value">

-      <nobr>

-        <input type="text" size="120" name="s${SeqNum}_jiraquery" value="$Encoder.attributeEscape($JIRAQUERY)" />

-      </nobr>

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="s${SeqNum}_jiraquery" value="$Encoder.attributeEscape($JIRAQUERY)" />

-

-#end

diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jiraSecurity.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jiraSecurity.html
deleted file mode 100644
index c060e79..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/editSpecification_jiraSecurity.html
+++ /dev/null
@@ -1,95 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('JiraRepositoryConnector.Security') && ${SeqNum} == ${SelectedNum})

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.SecurityColon'))</nobr></td>

-    <td class="value">

-  #if($SECURITYON == 'on')

-      <input type="radio" name="s${SeqNum}_specsecurity" value="on" checked="true"/>

-  #else

-      <input type="radio" name="s${SeqNum}_specsecurity" value="on"/>

-  #end

-      $Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.Enabled'))

-  #if($SECURITYON == 'off')

-      <input type="radio" name="s${SeqNum}_specsecurity" value="off" checked="true"/>

-  #else

-      <input type="radio" name="s${SeqNum}_specsecurity" value="off"/>

-  #end

-      $Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.Disabled'))

-    </td>

-  </tr>

-  

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  #set($atcounter = 0)

-  #foreach($atoken in $ACCESSTOKENS)

-

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_accessop_$atcounter" value=""/>

-      <input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>

-      <a name="s${SeqNum}_token_$atcounter">

-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('JiraRepositoryConnector.Delete'))" onClick='Javascript:s${SeqNum}_SpecDeleteToken($atcounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('JiraRepositoryConnector.DeleteToken'))$atcounter"/>

-      </a>

-    </td>

-    <td class="value">$Encoder.bodyEscape($atoken.get('TOKEN'))</td>

-  </tr>

-

-    #set($atcounter = $atcounter + 1)

-  #end

-

-  #set($nexttoken = $atcounter + 1)

-

-  #if($atcounter == 0)

-  <tr>

-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.NoAccessTokensPresent'))</td>

-  </tr>

-  #end

-

-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>

-  

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>

-      <input type="hidden" name="s${SeqNum}_accessop" value=""/>

-      <a name="s${SeqNum}_token_$atcounter">

-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('JiraRepositoryConnector.Add'))" onClick='Javascript:s${SeqNum}_SpecAddToken($nexttoken)' alt="$Encoder.attributeEscape($ResourceBundle.getString('JiraRepositoryConnector.AddAccessToken'))"/>

-      </a>

-    </td>

-    <td class="value">

-      <input type="text" size="30" name="s${SeqNum}_spectoken" value=""/>

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="s${SeqNum}_specsecurity" value="$SECURITYON"/>

-

-  #set($atcounter = 0)

-  #foreach($atoken in $ACCESSTOKENS)

-<input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>

-    #set($atcounter = $atcounter + 1)

-  #end

-<input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>

-

-#end

diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/viewConfiguration_jira.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/viewConfiguration_jira.html
deleted file mode 100644
index bb1073b..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/viewConfiguration_jira.html
+++ /dev/null
@@ -1,126 +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.

--->

-

-<table class="displaytable">

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProtocolColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPROTOCOL)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraHostColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAHOST)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraPortColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPORT)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraRESTAPIPathColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPATH)</nobr>

-    </td>

-  </tr>

-

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.ClientIDColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($CLIENTID)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.ClientSecretColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>********</nobr>

-    </td>

-  </tr>

-  

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyHostColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPROXYHOST)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyPortColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPROXYPORT)</nobr>

-    </td>

-  </tr>

-

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyDomainColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPROXYDOMAIN)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyUsernameColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAPROXYUSERNAME)</nobr>

-    </td>

-  </tr>

-

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraProxyPasswordColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>********</nobr>

-    </td>

-  </tr>

-

-</table>

-

diff --git a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/viewSpecification_jira.html b/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/viewSpecification_jira.html
deleted file mode 100644
index 9dde5ae..0000000
--- a/connectors/jira/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/jira/viewSpecification_jira.html
+++ /dev/null
@@ -1,60 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.JiraQueryColon'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($JIRAQUERY)</nobr>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.SecurityColon'))</nobr>

-    </td>

-    <td class="value">

-#if($SECURITYON == 'on')

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.Enabled'))</nobr>

-#else

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.Disabled'))</nobr>

-#end

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-#if($ACCESSTOKENS.size() == 0)

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.NoAccessTokensPresent'))

-    </td>

-#else

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('JiraRepositoryConnector.AccessTokensColon'))</nobr>

-    </td>

-    <td class="value">

-  #set($atcounter = 0)

-  #foreach($atoken in $ACCESSTOKENS)

-    <nobr>$Encoder.bodyEscape($atoken.get('TOKEN'))</nobr><br/>

-    #set($atcounter = $atcounter + 1)

-  #end

-    </td>

-#end

-  </tr>

-

-</table>

diff --git a/connectors/jira/pom.xml b/connectors/jira/pom.xml
deleted file mode 100644
index 542167e..0000000
--- a/connectors/jira/pom.xml
+++ /dev/null
@@ -1,380 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

-

-<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/xsd/maven-4.0.0.xsd">

-

-    <parent>

-        <groupId>org.apache.manifoldcf</groupId>

-        <artifactId>mcf-connectors</artifactId>

-        <version>2.10-SNAPSHOT</version>

-    </parent>

-    <modelVersion>4.0.0</modelVersion>

-

-    <packaging>jar</packaging>

-

-    <developers>

-        <developer>

-            <name>Andrew Janowczyk</name>

-            <organization>Searchbox</organization>

-            <organizationUrl>http://www.searchbox.com</organizationUrl>

-            <url>http://www.searchbox.com</url>

-        </developer>

-    </developers>

-

-    <properties>

-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

-        <project.http.version>1.14.1-beta</project.http.version>

-        <project.oauth.version>1.14.1-beta</project.oauth.version>

-    </properties>

-

-    <artifactId>mcf-jira-connector</artifactId>

-    <name>ManifoldCF - Connectors - Jira</name>

-

-    <build>

-        <defaultGoal>integration-test</defaultGoal>

-        <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>

-        <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>

-        <resources>

-          <resource>

-            <directory>${basedir}/connector/src/main/native2ascii</directory>

-            <includes>

-              <include>**/*.properties</include>

-            </includes>

-          </resource>

-          <resource>

-            <directory>${basedir}/connector/src/main/resources</directory>

-            <includes>

-              <include>**/*.html</include>

-              <include>**/*.js</include>

-            </includes>

-          </resource>

-        </resources> 

-        <testResources>

-          <testResource>

-            <directory>${basedir}/connector/src/test/resources</directory>

-          </testResource>

-        </testResources>

-

-        <plugins>

-

-            <plugin>

-                <groupId>org.codehaus.mojo</groupId>

-                <artifactId>native2ascii-maven-plugin</artifactId>

-                <version>1.0-beta-1</version>

-                <configuration>

-                    <workDir>target/classes</workDir>

-                </configuration>

-                <executions>

-                    <execution>

-                        <id>native2ascii-utf8</id>

-                        <goals>

-                            <goal>native2ascii</goal>

-                        </goals>

-                        <configuration>

-                            <encoding>UTF8</encoding>

-                            <includes>

-                                <include>**/*.properties</include>

-                            </includes>

-                        </configuration>

-                    </execution>

-                </executions>

-            </plugin>

-

-            <!-- Test plugin configuration -->

-            <plugin>

-              <artifactId>maven-dependency-plugin</artifactId>

-              <executions>

-                 <execution>

-                  <id>copy-war</id>

-                  <phase>generate-resources</phase>

-                  <goals>

-                    <goal>copy</goal>

-                  </goals>

-                  <configuration>

-                    <outputDirectory>target/dependency</outputDirectory>

-                    <artifactItems>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-api-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-api-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-authority-service</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-authority-service.war</destFileName>

-                      </artifactItem>

-                      <artifactItem>

-                        <groupId>${project.groupId}</groupId>

-                        <artifactId>mcf-crawler-ui</artifactId>

-                        <version>${project.version}</version>

-                        <type>war</type>

-                        <overWrite>false</overWrite>

-                        <destFileName>mcf-crawler-ui.war</destFileName>

-                      </artifactItem>

-                    </artifactItems>

-                  </configuration>

-                </execution>

-              </executions>

-            </plugin>

-

-            <plugin>

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

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

-              <configuration>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-            </plugin>

-

-            <plugin>

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

-              <artifactId>maven-failsafe-plugin</artifactId>

-              <version>2.18.1</version>

-              <configuration>

-                <skipTests>${skipITs}</skipTests>

-                <systemPropertyVariables>

-                  <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>

-                  <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>

-                  <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>

-                </systemPropertyVariables>

-                <excludes>

-                  <exclude>**/*Postgresql*.java</exclude>

-                  <exclude>**/*MySQL*.java</exclude>

-                </excludes>

-                <forkCount>1</forkCount>

-                <reuseForks>false</reuseForks>

-                <workingDirectory>target/test-output</workingDirectory>

-              </configuration>

-              <executions>

-                <execution>

-                  <id>integration-test</id>

-                  <goals>

-                    <goal>integration-test</goal>

-                  </goals>

-                </execution>

-                <execution>

-                  <id>verify</id>

-                  <goals>

-                    <goal>verify</goal>

-                  </goals>

-                </execution>

-              </executions>

-            </plugin>

-

-        </plugins>

-    </build>

-

-    <dependencies>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-connector-common</artifactId>

-          <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-pull-agent</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-agents</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>${project.groupId}</groupId>

-            <artifactId>mcf-ui-core</artifactId>

-            <version>${project.version}</version>

-        </dependency>

-        <dependency>

-            <groupId>commons-lang</groupId>

-            <artifactId>commons-lang</artifactId>

-            <version>${commons-lang.version}</version>

-            <type>jar</type>

-        </dependency>

-

-        <!-- Testing dependencies -->

-        

-        <dependency>

-          <groupId>junit</groupId>

-          <artifactId>junit</artifactId>

-          <version>${junit.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-core</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-agents</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-pull-agent</artifactId>

-          <version>${project.version}</version>

-          <type>test-jar</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.postgresql</groupId>

-          <artifactId>postgresql</artifactId>

-          <version>${postgresql.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.hsqldb</groupId>

-          <artifactId>hsqldb</artifactId>

-          <version>${hsqldb.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>mysql</groupId>

-          <artifactId>mysql-connector-java</artifactId>

-          <version>${mysql.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-api-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-authority-service</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>${project.groupId}</groupId>

-          <artifactId>mcf-crawler-ui</artifactId>

-          <version>${project.version}</version>

-          <type>war</type>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-server</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-util</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-webapp</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-servlet</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-http</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-io</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-security</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-continuation</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.eclipse.jetty</groupId>

-          <artifactId>jetty-xml</artifactId>

-          <version>${jetty.version}</version>

-          <scope>test</scope>

-        </dependency>

-

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-api-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>    

-        <dependency>

-          <groupId>org.mortbay.jetty</groupId>

-          <artifactId>jsp-2.1-glassfish</artifactId>

-          <version>${glassfish.version}</version>

-          <scope>test</scope>

-        </dependency>

-        

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-api</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-        <dependency>

-          <groupId>org.slf4j</groupId>

-          <artifactId>slf4j-simple</artifactId>

-          <version>${slf4j.version}</version>

-          <scope>test</scope>

-        </dependency>

-    </dependencies>

-</project>

diff --git a/connectors/kafka/build.xml b/connectors/kafka/build.xml
deleted file mode 100644
index e12fd1b..0000000
--- a/connectors/kafka/build.xml
+++ /dev/null
@@ -1,156 +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.
--->
-
-<project name="kafka" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <property name="kafka.version" value="0.8.2.1"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="kafka-clients*.jar"/>
-            <include name="lz4*.jar"/>
-            <include name="snappy-java*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="kafka-clients*.jar"/>
-                <include name="lz4*.jar"/>
-                <include name="snappy-java*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="download-dependencies">
-        <mkdir dir="test-materials"/>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="org/apache/kafka"/>
-            <param name="artifact-version" value="${kafka.version}"/>
-            <param name="artifact-name" value="kafka_2.11"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="org/apache/commons"/>
-            <param name="artifact-version" value="3.4"/>
-            <param name="artifact-name" value="commons-lang3"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="com/yammer/metrics"/>
-            <param name="artifact-version" value="2.2.0"/>
-            <param name="artifact-name" value="metrics-core"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="org/scala-lang"/>
-            <param name="artifact-version" value="2.11.0"/>
-            <param name="artifact-name" value="scala-library"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="net/sf/jopt-simple"/>
-            <param name="artifact-version" value="3.2"/>
-            <param name="artifact-name" value="jopt-simple"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="org/scala-lang/modules"/>
-            <param name="artifact-version" value="1.0.4"/>
-            <param name="artifact-name" value="scala-xml_2.11"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="org/scala-lang/modules"/>
-            <param name="artifact-version" value="1.0.4"/>
-            <param name="artifact-name" value="scala-parser-combinators_2.11"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-        <antcall target="download-via-maven">
-            <param name="target" value="test-materials"/>
-            <param name="project-path" value="com/101tec"/>
-            <param name="artifact-version" value="0.6"/>
-            <param name="artifact-name" value="zkclient"/>
-            <param name="artifact-type" value="jar"/>
-        </antcall>
-    </target>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="test-materials" excludes="README*.txt"/>
-        </delete>
-    </target>
-
-    <target name="calculate-testcode-condition">
-        <available file="test-materials/kafka_2.11-${kafka.version}.jar" property="tests-present"/>
-    </target>
-
-    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present">
-        <echo message="Need Kafka download in order to compile tests - run ant make-deps"/>
-    </target>
-
-    <path id="connector-test-classpath">
-        <path refid="mcf-connector-build.connector-test-classpath"/>
-        <fileset dir="../../lib">
-            <include name="zookeeper*.jar"/>
-            <include name="kafka-clients*.jar"/>
-            <include name="lz4*.jar"/>
-            <include name="snappy-java*.jar"/>
-        </fileset>
-        <fileset dir="test-materials">
-            <include name="zkclient*.jar"/>
-            <include name="commons-lang3*.jar"/>
-            <include name="metrics-core*.jar"/>
-            <include name="jopt-simple*.jar"/>
-            <include name="scala-library*.jar"/>
-            <include name="kafka_2.11*.jar"/>
-            <include name="scala-xml_2.11*.jar"/>
-            <include name="scala-parser-combinators_2.11*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="Kafka"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector"/>
-        </antcall>
-    </target>
-	
-</project>
diff --git a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaConfig.java b/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaConfig.java
deleted file mode 100644
index 50c44fe..0000000
--- a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaConfig.java
+++ /dev/null
@@ -1,30 +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 org.apache.manifoldcf.agents.output.kafka;
-
-public class KafkaConfig {
-
-  // Configuration parameters
-  public static final String IP = "ip";
-  public static final String PORT = "port";
-  public static final String TOPIC = "topic";
-
-  public static final String IP_DEFAULT = "localhost";
-  public static final String PORT_DEFAULT = "9092";
-  public static final String TOPIC_DEFAULT = "topic";
-}
diff --git a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaMessage.java b/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaMessage.java
deleted file mode 100644
index 73266a5..0000000
--- a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaMessage.java
+++ /dev/null
@@ -1,184 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.Iterator;
-import org.apache.commons.io.IOUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import static org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector.allowAttributeName;
-import static org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector.denyAttributeName;
-import static org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector.noSecurityToken;
-import static org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector.useNullValue;
-import org.apache.manifoldcf.core.common.Base64;
-
-/**
- *
- * @author tugba
- */
-public class KafkaMessage {
-
-  private final String[] acls = null;
-  private final String[] denyAcls = null;
-  private final String[] shareAcls = null;
-  private final String[] shareDenyAcls = null;
-  private final String[] parentAcls = null;
-  private final String[] parentDenyAcls = null;
-  private InputStream inputStream = null;
-
-  public byte[] createJSON(RepositoryDocument document) {
-    String finalString = null;
-    // create temporaray byte array output stream
-    OutputStream out = new ByteArrayOutputStream();
-    try {
-      inputStream = document.getBinaryStream();
-
-      // print to our byte array output stream
-      PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
-
-      pw.print("{");
-      Iterator<String> i = document.getFields();
-      boolean needComma = false;
-      while (i.hasNext()) {
-        String fieldName = i.next();
-        String[] fieldValues = document.getFieldAsStrings(fieldName);
-        needComma = writeField(pw, needComma, fieldName, fieldValues);
-      }
-
-      needComma = writeACLs(pw, needComma, "document", acls, denyAcls);
-      needComma = writeACLs(pw, needComma, "share", shareAcls, shareDenyAcls);
-      needComma = writeACLs(pw, needComma, "parent", parentAcls, parentDenyAcls);
-
-      if (inputStream != null) {
-        if (needComma) {
-          pw.print(",");
-        }
-        // I'm told this is not necessary: see CONNECTORS-690
-        //pw.print("\"type\" : \"attachment\",");
-        pw.print("\"file\" : {");
-        String contentType = document.getMimeType();
-        if (contentType != null) {
-          pw.print("\"_content_type\" : " + jsonStringEscape(contentType) + ",");
-        }
-        String fileName = document.getFileName();
-        if (fileName != null) {
-          pw.print("\"_name\" : " + jsonStringEscape(fileName) + ",");
-        }
-        // Since ES 1.0
-        pw.print(" \"_content\" : \"");
-        Base64 base64 = new Base64();
-        base64.encodeStream(inputStream, pw);
-        pw.print("\"}");
-      }
-      pw.print("}");
-      pw.flush();
-      IOUtils.closeQuietly(pw);
-      finalString = new String(((ByteArrayOutputStream) out).toByteArray(), StandardCharsets.UTF_8);
-      //System.out.println("FINAL: " + finalString);
-    } catch (Exception e) {
-      e.printStackTrace();
-      // throw new IOException(e.getMessage());
-    }
-    return ((ByteArrayOutputStream) out).toByteArray();
-  }
-
-  protected static boolean writeField(PrintWriter pw, boolean needComma,
-          String fieldName, String[] fieldValues)
-          throws IOException {
-    if (fieldValues == null) {
-      return needComma;
-    }
-
-    if (fieldValues.length == 1) {
-      if (needComma) {
-        pw.print(",");
-      }
-      pw.print(jsonStringEscape(fieldName) + " : " + jsonStringEscape(fieldValues[0]));
-      needComma = true;
-      return needComma;
-    }
-
-    if (fieldValues.length > 1) {
-      if (needComma) {
-        pw.print(",");
-      }
-      StringBuilder sb = new StringBuilder();
-      sb.append("[");
-      for (int j = 0; j < fieldValues.length; j++) {
-        sb.append(jsonStringEscape(fieldValues[j])).append(",");
-      }
-      sb.setLength(sb.length() - 1); // discard last ","
-      sb.append("]");
-      pw.print(jsonStringEscape(fieldName) + " : " + sb.toString());
-      needComma = true;
-    }
-    return needComma;
-  }
-
-  /**
-   * Output an acl level
-   */
-  protected static boolean writeACLs(PrintWriter pw, boolean needComma,
-          String aclType, String[] acl, String[] denyAcl)
-          throws IOException {
-    String metadataACLName = allowAttributeName + aclType;
-    if (acl != null && acl.length > 0) {
-      needComma = writeField(pw, needComma, metadataACLName, acl);
-    } else if (!useNullValue) {
-      needComma = writeField(pw, needComma, metadataACLName, new String[]{noSecurityToken});
-    }
-    String metadataDenyACLName = denyAttributeName + aclType;
-    if (denyAcl != null && denyAcl.length > 0) {
-      needComma = writeField(pw, needComma, metadataDenyACLName, denyAcl);
-    } else if (!useNullValue) {
-      needComma = writeField(pw, needComma, metadataDenyACLName, new String[]{noSecurityToken});
-    }
-    return needComma;
-  }
-
-  protected static String jsonStringEscape(String value) {
-    StringBuilder sb = new StringBuilder("\"");
-    for (int i = 0; i < value.length(); i++) {
-      char x = value.charAt(i);
-      if (x == '\n') {
-        sb.append('\\').append('n');
-      } else if (x == '\r') {
-        sb.append('\\').append('r');
-      } else if (x == '\t') {
-        sb.append('\\').append('t');
-      } else if (x == '\b') {
-        sb.append('\\').append('b');
-      } else if (x == '\f') {
-        sb.append('\\').append('f');
-      } else {
-        if (x == '\"' || x == '\\' || x == '/') {
-          sb.append('\\');
-        }
-        sb.append(x);
-      }
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-}
diff --git a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaOutputConnector.java b/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaOutputConnector.java
deleted file mode 100644
index 8bac089..0000000
--- a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/KafkaOutputConnector.java
+++ /dev/null
@@ -1,364 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-import java.util.Properties;
-import java.util.concurrent.ExecutionException;
-import org.apache.kafka.clients.producer.KafkaProducer;
-import org.apache.kafka.clients.producer.ProducerConfig;
-import org.apache.kafka.clients.producer.ProducerRecord;
-import org.apache.kafka.common.PartitionInfo;
-
-/**
- * This is a kafka output connector.
- */
-public class KafkaOutputConnector extends org.apache.manifoldcf.agents.output.BaseOutputConnector {
-
-  public static final String _rcsid = "@(#)$Id: KafkaOutputConnector.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Activities we log
-  /**
-   * Ingestion activity
-   */
-  public final static String INGEST_ACTIVITY = "document ingest";
-
-  /**
-   * Job notify activity
-   */
-  public final static String JOB_COMPLETE_ACTIVITY = "output notification";
-
-  private final static String KAFKA_TAB_PARAMETERS = "KafkaConnector.Parameters";
-
-  /**
-   * Forward to the javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-  /**
-   * Forward to the HTML template to edit the configuration parameters
-   */
-  private static final String EDIT_CONFIG_FORWARD_PARAMETERS = "editConfiguration_Parameters.html";
-
-  /**
-   * Forward to the HTML template to view the configuration parameters
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-
-  /**
-   * cloudsearch field name for file body text.
-   */
-  private static final String FILE_BODY_TEXT_FIELDNAME = "f_bodytext";
-
-  /**
-   * Field name we use for document's URI.
-   */
-  private static final String DOCUMENT_URI_FIELDNAME = "document_URI";
-
-  /**
-   * The allow attribute name
-   */
-  protected final static String allowAttributeName = "allow_token_";
-  /**
-   * The deny attribute name
-   */
-  protected final static String denyAttributeName = "deny_token_";
-  /**
-   * The no-security token
-   */
-  protected final static String noSecurityToken = "__nosecurity__";
-
-  protected final static boolean useNullValue = false;
-
-  KafkaProducer producer = null;
-
-  /**
-   * Constructor.
-   */
-  public KafkaOutputConnector() {
-  }
-
-  public void setProducer(KafkaProducer producer) {
-    this.producer = producer;
-  }
-
-  /**
-   * Return the list of activities that this connector supports (i.e. writes
-   * into the log).
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[]{INGEST_ACTIVITY, JOB_COMPLETE_ACTIVITY};
-  }
-
-  /**
-   * Connect.
-   *
-   * @param configParameters is the set of configuration parameters, which in
-   * this case describe the target appliance, basic auth configuration, etc.
-   * (This formerly came out of the ini file.)
-   */
-  @Override
-  public void connect(ConfigParams configParameters) {
-    super.connect(configParameters);
-
-    Properties props = new Properties();
-    String IP = params.getParameter(KafkaConfig.IP);
-    String PORT = params.getParameter(KafkaConfig.PORT);
-    //System.out.println("Kafka IP: " + IP);
-    //System.out.println("Kafka Port: " + PORT);
-    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, IP + ":" + PORT);
-    props.put(ProducerConfig.RETRIES_CONFIG, "3");
-    props.put(ProducerConfig.ACKS_CONFIG, "all");
-    props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "none");
-    props.put(ProducerConfig.BATCH_SIZE_CONFIG, 200);
-    props.put(ProducerConfig.BLOCK_ON_BUFFER_FULL_CONFIG, true);
-    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
-    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.ByteArraySerializer");
-    producer = new KafkaProducer(props);
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect()
-          throws ManifoldCFException {
-    super.disconnect();
-  }
-
-  /**
-   * Fill in a Server tab configuration parameter map for calling a Velocity
-   * template.
-   *
-   * @param newMap is the map to fill in
-   * @param parameters is the current set of configuration parameters
-   */
-  private static void fillInServerConfigurationMap(Map<String, Object> newMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String IP = parameters.getParameter(KafkaConfig.IP);
-    String port = parameters.getParameter(KafkaConfig.PORT);
-    String topic = parameters.getParameter(KafkaConfig.TOPIC);
-
-    if (IP == null) {
-      IP = "localhost";
-    }
-    if (port == null) {
-      port = "9092";
-    }
-    if (topic == null) {
-      topic = "topic";
-    }
-
-    newMap.put("IP", IP);
-    newMap.put("PORT", port);
-    newMap.put("TOPIC", topic);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-          IHTTPOutput out, Locale locale, ConfigParams parameters,
-          List<String> tabsArray) throws ManifoldCFException, IOException {
-    // Add the Server tab
-    tabsArray.add(Messages.getString(locale, KAFKA_TAB_PARAMETERS));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER_FORWARD, paramMap);
-
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-          IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-          throws ManifoldCFException, IOException {
-
-    // Call the Velocity templates for each tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_FORWARD_PARAMETERS, paramMap);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-          Locale locale, ConfigParams parameters) throws ManifoldCFException,
-          IOException {
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD, paramMap);
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-          IPostParameters variableContext, ConfigParams parameters)
-          throws ManifoldCFException {
-    // Server tab parameters
-    String IP = variableContext.getParameter(KafkaConfig.IP);
-    if (IP != null) {
-      parameters.setParameter(KafkaConfig.IP, IP);
-    }
-    String port = variableContext.getParameter(KafkaConfig.PORT);
-    if (port != null) {
-      parameters.setParameter(KafkaConfig.PORT, port);
-    }
-    String topic = variableContext.getParameter(KafkaConfig.TOPIC);
-    if (topic != null) {
-      parameters.setParameter(KafkaConfig.TOPIC, topic);
-    }
-    return null;
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check()
-          throws ManifoldCFException {
-    try {
-      List<PartitionInfo> partitions = producer.partitionsFor(params.getParameter(KafkaConfig.TOPIC));
-      return super.check();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  /**
-   * Get an output version string, given an output specification. The output
-   * version string is used to uniquely describe the pertinent details of the
-   * output specification and the configuration, to allow the Connector
-   * Framework to determine whether a document will need to be output again.
-   * Note that the contents of the document cannot be considered by this method,
-   * and that a different version string (defined in IRepositoryConnector) is
-   * used to describe the version of the actual document.
-   *
-   * This method presumes that the connector object has been configured, and it
-   * is thus able to communicate with the output data store should that be
-   * necessary.
-   *
-   * @param spec is the current output specification for the job that is doing
-   * the crawling.
-   * @return a string, of unlimited length, which uniquely describes output
-   * configuration and specification in such a way that if two such strings are
-   * equal, the document will not need to be sent again to the output data
-   * sstore.
-   */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-          throws ManifoldCFException, ServiceInterruption {
-    return new VersionContext("", params, spec);
-  }
-
-  /**
-   * Add (or replace) a document in the output data store using the connector.
-   * This method presumes that the connector object has been configured, and it
-   * is thus able to communicate with the output data store should that be
-   * necessary.
-   *
-   * @param documentURI is the URI of the document. The URI is presumed to be
-   * the unique identifier which the output data store will use to process and
-   * serve the document. This URI is constructed by the repository connector
-   * which fetches the document, and is thus universal across all output
-   * connectors.
-   * @param pipelineDescription includes the description string that was
-   * constructed for this document by the getOutputDescription() method.
-   * @param document is the document data to be processed (handed to the output
-   * data store).
-   * @param authorityNameString is the name of the authority responsible for
-   * authorizing any access tokens passed in with the repository document. May
-   * be null.
-   * @param activities is the handle to an object that the implementer of a
-   * pipeline connector may use to perform operations, such as logging
-   * processing activity, or sending a modified document to the next stage in
-   * the pipeline.
-   * @return the document status (accepted or permanently rejected).
-   * @throws IOException only if there's a stream error reading the document
-   * data.
-   */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-          throws ManifoldCFException, ServiceInterruption, IOException {
-    //System.out.println("Starting to ingest document....");
-    try {
-      KafkaMessage kafkaMessage = new KafkaMessage();
-      // Get document info in JSON format
-      byte[] finalString = kafkaMessage.createJSON(document);
-      String topic = getConfig(params, KafkaConfig.TOPIC, "topic");
-
-      ProducerRecord record = new ProducerRecord(topic, finalString);
-      producer.send(record).get();
-    } catch (InterruptedException e) {
-      new ManifoldCFException("interrupted", ManifoldCFException.INTERRUPTED);
-    } catch (ExecutionException e) {
-      new ManifoldCFException("interrupted", ManifoldCFException.INTERRUPTED);
-    }
-
-    activities.recordActivity(null, INGEST_ACTIVITY, new Long(document.getBinaryLength()), documentURI, "OK", null);
-    return DOCUMENTSTATUS_ACCEPTED;
-  }
-
-  private static String getConfig(ConfigParams config,
-          String parameter,
-          String defaultValue) {
-    if (config == null) {
-      return defaultValue;
-    }
-    final String protocol = config.getParameter(parameter);
-    if (protocol == null) {
-      return defaultValue;
-    }
-    return protocol;
-  }
-
-  /**
-   * Notify the connector of a completed job. This is meant to allow the
-   * connector to flush any internal data structures it has been keeping around,
-   * or to tell the output repository that this is a good time to synchronize
-   * things. It is called whenever a job is either completed or aborted.
-   *
-   * @param activities is the handle to an object that the implementer of an
-   * output connector may use to perform operations, such as logging processing
-   * activity.
-   */
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-          throws ManifoldCFException, ServiceInterruption {
-    activities.recordActivity(null, JOB_COMPLETE_ACTIVITY, null, "", "OK", null);
-  }
-}
diff --git a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/Messages.java b/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/Messages.java
deleted file mode 100644
index 5b86d6f..0000000
--- a/connectors/kafka/connector/src/main/java/org/apache/manifoldcf/agents/output/kafka/Messages.java
+++ /dev/null
@@ -1,119 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-
-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.agents.output.kafka.common";
-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.agents.output.kafka";
-
-  /**
-   * Constructor - do no instantiate
-   */
-  protected Messages() {
-  }
-
-  public static String getString(Locale locale, String messageKey) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-          Map<String, String> substitutionParameters, boolean mapToUpperCase)
-          throws ManifoldCFException {
-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey,
-            substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-          Map<String, String> substitutionParameters, boolean mapToUpperCase)
-          throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-            substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-          Map<String, Object> contextObjects)
-          throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-            contextObjects);
-  }
-
-}
diff --git a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_en_US.properties b/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_en_US.properties
deleted file mode 100644
index 43a0d6d..0000000
--- a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_en_US.properties
+++ /dev/null
@@ -1,27 +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.
-
-# Add stuff as needed
-KafkaConnector.Parameters=Parameters
-
-KafkaConnector.IPColon=IP:
-KafkaConnector.PortColon=Port:
-KafkaConnector.TopicColon=Topic:
-
-KafkaConnector.PleaseSupplyValidIP=Please supply a valid Kafka IP
-KafkaConnector.PleaseSupplyValidPort=Please supply a valid port
-KafkaConnector.PleaseSupplyValidTopic=Please supply a valid topic name
-
-KafkaConnector.Kafka=Kafka
diff --git a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_es_ES.properties b/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_es_ES.properties
deleted file mode 100644
index baa1317..0000000
--- a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_es_ES.properties
+++ /dev/null
@@ -1,27 +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.
-
-# Add stuff as needed
-KafkaConnector.Parameters=Parámetros
-
-KafkaConnector.IPColon=IP:
-KafkaConnector.PortColon=Puerto:
-KafkaConnector.TopicColon=Tema:
-
-KafkaConnector.PleaseSupplyValidIP=Por favor, facilite un Kafka válida IP
-KafkaConnector.PleaseSupplyValidPort=Por favor, facilite un puerto válido
-KafkaConnector.PleaseSupplyValidTopic=Por favor proporcione un nombre de tema válido
-
-KafkaConnector.Kafka=Kafka
diff --git a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_ja_JP.properties b/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_ja_JP.properties
deleted file mode 100644
index 9fe9639..0000000
--- a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_ja_JP.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff as needed
diff --git a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_zh_CN.properties b/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_zh_CN.properties
deleted file mode 100644
index 9fe9639..0000000
--- a/connectors/kafka/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/kafka/common_zh_CN.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff as needed
diff --git a/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/editConfiguration.js b/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/editConfiguration.js
deleted file mode 100644
index 58ef7df..0000000
--- a/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/editConfiguration.js
+++ /dev/null
@@ -1,73 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig() {
-  if (editconnection.ip) {
-    if (editconnection.ip.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('KafkaConnector.PleaseSupplyValidKafkaLocation'))");
-      editconnection.ip.focus();
-      return false;
-    }
-  }
-  if (editconnection.port) {
-    if (editconnection.port.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('KafkaConnector.PleaseSupplyValidPort'))");
-      editconnection.port.focus();
-      return false;
-    }
-  }
-  if (editconnection.topic) {
-    if (editconnection.topic.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('KafkaConnector.PleaseSupplyValidTopic'))");
-      editconnection.topic.focus();
-      return false;
-    }
-  }
-  return true;
-}
-
-function checkConfigForSave() {
-  if (editconnection.ip) {
-    if (editconnection.ip.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('KafkaConnector.PleaseSupplyValidIP'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('KafkaConnector.Parameters'))");
-      editconnection.ip.focus();
-      return false;
-    }
-  }
-  if (editconnection.port) {
-    if (editconnection.port.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('KafkaConnector.PleaseSupplyValidPort'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('KafkaConnector.Parameters'))");
-      editconnection.port.focus();
-      return false;
-    }
-  }
-  if (editconnection.topic) {
-    if (editconnection.topic.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('KafkaConnector.PleaseSupplyValidTopic'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('KafkaConnector.Parameters'))");
-      editconnection.topic.focus();
-      return false;
-    }
-  }
-  return true;
-}
-//-->
-</script>
diff --git a/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/editConfiguration_Parameters.html b/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/editConfiguration_Parameters.html
deleted file mode 100644
index 6cc8e72..0000000
--- a/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/editConfiguration_Parameters.html
+++ /dev/null
@@ -1,48 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('KafkaConnector.Parameters'))
-
-<table class="displaytable">
-    <tr>
-        <td class="description">
-    <nobr>$Encoder.bodyEscape($ResourceBundle.getString('KafkaConnector.IPColon'))</nobr>
-
-</td>
-<td class="value"><input name="ip" type="text"
-                         value="$Encoder.attributeEscape($IP)" size="48" />
-</td>
-</tr>
-<tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('KafkaConnector.PortColon'))</nobr></td>
-<td class="value"><input name="port" type="text" value="$Encoder.attributeEscape($PORT)"
-                         size="24" /></td>
-</tr>
-<tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('KafkaConnector.TopicColon'))</nobr></td>
-<td class="value"><input name="topic" type="text" value="$Encoder.attributeEscape($TOPIC)"
-                         size="24" /></td>
-</tr>
-</table>
-
-#else
-
-<input type="hidden" name="ip" value="$Encoder.attributeEscape($IP)" />
-<input type="hidden" name="port" value="$Encoder.attributeEscape($PORT)" />
-<input type="hidden" name="topic" value="$Encoder.attributeEscape($TOPIC)" />
-
-#end
diff --git a/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/viewConfiguration.html b/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/viewConfiguration.html
deleted file mode 100644
index 5f509ee..0000000
--- a/connectors/kafka/connector/src/main/resources/org/apache/manifoldcf/agents/output/kafka/viewConfiguration.html
+++ /dev/null
@@ -1,31 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('KafkaConnector.IPColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($IP)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('KafkaConnector.PortColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($PORT)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('KafkaConnector.TopicColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($TOPIC)</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/APISanityHSQLDBIT.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/APISanityHSQLDBIT.java
deleted file mode 100644
index 45b91f0..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/APISanityHSQLDBIT.java
+++ /dev/null
@@ -1,305 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import org.apache.manifoldcf.core.interfaces.Configuration;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.junit.Test;
-
-/**
- * @author tugba
- */
-public class APISanityHSQLDBIT extends BaseITHSQLDB {
-
-  @Test
-  public void sanityCheck()
-          throws Exception {
-      int i;
-
-      // Create a basic file system connection, and save it.
-      ConfigurationNode connectionObject;
-      ConfigurationNode child;
-      Configuration requestObject;
-      Configuration result;
-      connectionObject = new ConfigurationNode("repositoryconnection");
-
-      child = new ConfigurationNode("name");
-      child.setValue("Test Connection");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("description");
-      child.setValue("Test Connection");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("10");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("configuration");
-
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      requestObject = new Configuration();
-      requestObject.addChild(0, connectionObject);
-
-      result = performAPIPutOperationViaNodes("repositoryconnections/Test%20Connection", 201, requestObject);
-
-      i = 0;
-      while (i < result.getChildCount()) {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error")) {
-          throw new Exception(resultNode.getValue());
-        }
-      }
-
-      // Create a basic null output connection, and save it.
-      connectionObject = new ConfigurationNode("outputconnection");
-
-      child = new ConfigurationNode("name");
-      child.setValue("Kafka");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("class_name");
-      child.setValue("org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("description");
-      child.setValue("Kafka Connection");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("max_connections");
-      child.setValue("100");
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-
-      child = new ConfigurationNode("configuration");
-
-      //Kafka Output Connector parameters
-      //IP
-      ConfigurationNode ip = new ConfigurationNode("_PARAMETER_");
-      ip.setAttribute("name", "ip");
-      ip.setValue("localhost");
-      child.addChild(child.getChildCount(), ip);
-      //port
-      ConfigurationNode port = new ConfigurationNode("_PARAMETER_");
-      port.setAttribute("name", "port");
-      port.setValue("9092");
-      child.addChild(child.getChildCount(), port);
-      //topic
-      ConfigurationNode topic = new ConfigurationNode("_PARAMETER_");
-      topic.setAttribute("name", "topic");
-      topic.setValue("topic");
-      child.addChild(child.getChildCount(), topic);
-      connectionObject.addChild(connectionObject.getChildCount(), child);
-      requestObject = new Configuration();
-      requestObject.addChild(0, connectionObject);
-      result = performAPIPutOperationViaNodes("outputconnections/Kafka", 201, requestObject);
-      i = 0;
-      while (i < result.getChildCount()) {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error")) {
-          throw new Exception(resultNode.getValue());
-        }
-      }
-      // Create a job.
-      ConfigurationNode jobObject = new ConfigurationNode("job");
-      child = new ConfigurationNode("description");
-      child.setValue("Test Job");
-      jobObject.addChild(jobObject.getChildCount(), child);
-
-      child = new ConfigurationNode("repository_connection");
-      child.setValue("Test Connection");
-      jobObject.addChild(jobObject.getChildCount(), child);
-
-      // Revamped way of adding output connection
-      child = new ConfigurationNode("pipelinestage");
-      ConfigurationNode pipelineChild = new ConfigurationNode("stage_id");
-      pipelineChild.setValue("0");
-      child.addChild(child.getChildCount(), pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_isoutput");
-      pipelineChild.setValue("true");
-      child.addChild(child.getChildCount(), pipelineChild);
-      pipelineChild = new ConfigurationNode("stage_connectionname");
-      pipelineChild.setValue("Kafka");
-      child.addChild(child.getChildCount(), pipelineChild);
-      jobObject.addChild(jobObject.getChildCount(), child);
-      child = new ConfigurationNode("run_mode");
-      child.setValue("scan once");
-      jobObject.addChild(jobObject.getChildCount(), child);
-      child = new ConfigurationNode("start_mode");
-      child.setValue("manual");
-      jobObject.addChild(jobObject.getChildCount(), child);
-      child = new ConfigurationNode("hopcount_mode");
-      child.setValue("accurate");
-      jobObject.addChild(jobObject.getChildCount(), child);
-
-      child = new ConfigurationNode("document_specification");
-
-      jobObject.addChild(jobObject.getChildCount(), child);
-      requestObject = new Configuration();
-      requestObject.addChild(0, jobObject);
-      result = performAPIPostOperationViaNodes("jobs", 201, requestObject);
-      String jobIDString = null;
-      i = 0;
-      while (i < result.getChildCount()) {
-        ConfigurationNode resultNode = result.findChild(i++);
-        if (resultNode.getType().equals("error")) {
-          throw new Exception(resultNode.getValue());
-        } else if (resultNode.getType().equals("job_id")) {
-          jobIDString = resultNode.getValue();
-        }
-      }
-      if (jobIDString == null) {
-        throw new Exception("Missing job_id from return!");
-      }
-      // Now, start the job, and wait until it completes.
-      startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      long count;
-      count = getJobDocumentsProcessed(jobIDString);
-      if (count != 3) {
-        throw new ManifoldCFException("Wrong number of documents processed - expected 3, saw " + new Long(count).toString());
-      }
-
-      // Now, delete the job.
-      deleteJob(jobIDString);
-
-      waitJobDeleted(jobIDString, 120000L);
-
-      // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-
-  protected void startJob(String jobIDString)
-          throws Exception {
-    Configuration requestObject = new Configuration();
-
-    Configuration result = performAPIPutOperationViaNodes("start/" + jobIDString, 201, requestObject);
-    int i = 0;
-    while (i < result.getChildCount()) {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error")) {
-        throw new Exception(resultNode.getValue());
-      }
-    }
-  }
-
-  protected void deleteJob(String jobIDString)
-          throws Exception {
-    Configuration result = performAPIDeleteOperationViaNodes("jobs/" + jobIDString, 200);
-    int i = 0;
-    while (i < result.getChildCount()) {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error")) {
-        throw new Exception(resultNode.getValue());
-      }
-    }
-
-  }
-
-  protected String getJobStatus(String jobIDString)
-          throws Exception {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/" + jobIDString, 200);
-    String status = null;
-    int i = 0;
-    while (i < result.getChildCount()) {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error")) {
-        throw new Exception(resultNode.getValue());
-      } else if (resultNode.getType().equals("jobstatus")) {
-        int j = 0;
-        while (j < resultNode.getChildCount()) {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("status")) {
-            status = childNode.getValue();
-          }
-        }
-      }
-    }
-    return status;
-  }
-
-  protected long getJobDocumentsProcessed(String jobIDString)
-          throws Exception {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/" + jobIDString, 200);
-    String documentsProcessed = null;
-    int i = 0;
-    while (i < result.getChildCount()) {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error")) {
-        throw new Exception(resultNode.getValue());
-      } else if (resultNode.getType().equals("jobstatus")) {
-        int j = 0;
-        while (j < resultNode.getChildCount()) {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("documents_processed")) {
-            documentsProcessed = childNode.getValue();
-          }
-        }
-      }
-    }
-    if (documentsProcessed == null) {
-      throw new Exception("Expected a documents_processed field, didn't find it");
-    }
-    return new Long(documentsProcessed).longValue();
-  }
-
-  protected void waitJobInactive(String jobIDString, long maxTime)
-          throws Exception {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime) {
-      String status = getJobStatus(jobIDString);
-      if (status == null) {
-        throw new Exception("No such job: '" + jobIDString + "'");
-      }
-      if (status.equals("not yet run")) {
-        throw new Exception("Job was never started.");
-      }
-      if (status.equals("done")) {
-        return;
-      }
-      if (status.equals("error")) {
-        throw new Exception("Job reports error.");
-      }
-      ManifoldCF.sleep(1000L);
-      continue;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of " + new Long(maxTime).toString() + " milliseconds");
-  }
-
-  protected void waitJobDeleted(String jobIDString, long maxTime)
-          throws Exception {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime) {
-      String status = getJobStatus(jobIDString);
-      if (status == null) {
-        return;
-      }
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of " + new Long(maxTime).toString() + " milliseconds");
-  }
-
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseHSQLDB.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseHSQLDB.java
deleted file mode 100644
index e749069..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseHSQLDB.java
+++ /dev/null
@@ -1,34 +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 org.apache.manifoldcf.agents.output.kafka;
-
-/**
- * This is a testing base class that is responsible for setting up/tearing down
- * the agents framework.
- */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB {
-
-  protected String[] getOutputNames() {
-    return new String[]{"Kafka"};
-  }
-
-  protected String[] getOutputClasses() {
-    return new String[]{"org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector"};
-  }
-
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseITHSQLDB.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseITHSQLDB.java
deleted file mode 100644
index 305608a..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseITHSQLDB.java
+++ /dev/null
@@ -1,95 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.io.File;
-
-import java.util.Properties;
-import org.junit.After;
-import static org.junit.Assert.fail;
-import org.junit.Before;
-
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB {
-
-  KafkaLocal kafka;
-
-  protected String[] getConnectorNames() {
-    return new String[]{"CMIS"};
-  }
-
-  protected String[] getConnectorClasses() {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-
-  protected String[] getOutputNames() {
-    return new String[]{"Kafka"};
-  }
-
-  protected String[] getOutputClasses() {
-    return new String[]{"org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector"};
-  }
-
-  @Before
-  public void setupKafka()
-          throws Exception {
-    Properties kafkaProperties = new Properties();
-    Properties zkProperties = new Properties();
-
-    String tmpDir = System.getProperty("java.io.tmpdir");
-    File logDir = new File(tmpDir, "kafka-logs");
-    logDir.mkdir();
-    File zookeeperDir = new File(tmpDir, "zookeeper");
-    zookeeperDir.mkdir();
-            
-    //load properties
-    kafkaProperties.put("broker.id", "0");
-    kafkaProperties.put("port", "9092");
-    kafkaProperties.put("num.network.threads", "3");
-    kafkaProperties.put("num.io.threads", "8");
-    kafkaProperties.put("socket.send.buffer.bytes", "102400");
-    kafkaProperties.put("socket.receive.buffer.bytes", "102400");
-    kafkaProperties.put("socket.request.max.bytes", "104857600");
-    kafkaProperties.put("log.dirs", logDir.getAbsolutePath());
-    kafkaProperties.put("num.partitions", "1");
-    kafkaProperties.put("num.recovery.threads.per.data.dir", "1");
-    kafkaProperties.put("log.retention.hours", "168");
-    kafkaProperties.put("log.segment.bytes", "1073741824");
-    kafkaProperties.put("log.retention.check.interval.ms", "300000");
-    kafkaProperties.put("log.cleaner.enable", "false");
-    kafkaProperties.put("zookeeper.connect", "localhost:2181");
-    kafkaProperties.put("zookeeper.connection.timeout.ms", "6000");
-
-    zkProperties.put("dataDir", zookeeperDir.getAbsolutePath());
-    zkProperties.put("clientPort", "2181");
-    zkProperties.put("maxClientCnxns", "0");
-
-    //kafkaProperties.load(Class.class.getResourceAsStream("/kafkalocal.properties"));
-    //zkProperties.load(Class.class.getResourceAsStream("/zklocal.properties"));
-    System.out.println("Kafka is starting...");
-
-    //start kafka
-    kafka = new KafkaLocal(kafkaProperties, zkProperties);
-    Thread.sleep(5000);
-  }
-
-  @After
-  public void cleanUpKafka() {
-    kafka.stop();
-  }
-
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BasePostgresql.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BasePostgresql.java
deleted file mode 100644
index f73f8da..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BasePostgresql.java
+++ /dev/null
@@ -1,30 +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 org.apache.manifoldcf.agents.output.kafka;
-
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql {
-
-  protected String[] getOutputNames() {
-    return new String[]{"Kafka"};
-  }
-
-  protected String[] getOutputClasses() {
-    return new String[]{"org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector"};
-  }
-
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseUIHSQLDB.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseUIHSQLDB.java
deleted file mode 100644
index 5511df0..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,95 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.io.File;
-
-import java.util.Properties;
-import org.junit.After;
-import static org.junit.Assert.fail;
-import org.junit.Before;
-
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB {
-
-  KafkaLocal kafka;
-
-  protected String[] getConnectorNames() {
-    return new String[]{"Test Connector"};
-  }
-
-  protected String[] getConnectorClasses() {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-
-  protected String[] getOutputNames() {
-    return new String[]{"Kafka"};
-  }
-
-  protected String[] getOutputClasses() {
-    return new String[]{"org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector"};
-  }
-
-  @Before
-  public void setupKafka()
-          throws Exception {
-    Properties kafkaProperties = new Properties();
-    Properties zkProperties = new Properties();
-
-    String tmpDir = System.getProperty("java.io.tmpdir");
-    File logDir = new File(tmpDir, "kafka-logs");
-    logDir.mkdir();
-    File zookeeperDir = new File(tmpDir, "zookeeper");
-    zookeeperDir.mkdir();
-            
-    //load properties
-    kafkaProperties.put("broker.id", "0");
-    kafkaProperties.put("port", "9092");
-    kafkaProperties.put("num.network.threads", "3");
-    kafkaProperties.put("num.io.threads", "8");
-    kafkaProperties.put("socket.send.buffer.bytes", "102400");
-    kafkaProperties.put("socket.receive.buffer.bytes", "102400");
-    kafkaProperties.put("socket.request.max.bytes", "104857600");
-    kafkaProperties.put("log.dirs", logDir.getAbsolutePath());
-    kafkaProperties.put("num.partitions", "1");
-    kafkaProperties.put("num.recovery.threads.per.data.dir", "1");
-    kafkaProperties.put("log.retention.hours", "168");
-    kafkaProperties.put("log.segment.bytes", "1073741824");
-    kafkaProperties.put("log.retention.check.interval.ms", "300000");
-    kafkaProperties.put("log.cleaner.enable", "false");
-    kafkaProperties.put("zookeeper.connect", "localhost:2181");
-    kafkaProperties.put("zookeeper.connection.timeout.ms", "6000");
-
-    zkProperties.put("dataDir", zookeeperDir.getAbsolutePath());
-    zkProperties.put("clientPort", "2181");
-    zkProperties.put("maxClientCnxns", "0");
-
-    //kafkaProperties.load(Class.class.getResourceAsStream("/kafkalocal.properties"));
-    //zkProperties.load(Class.class.getResourceAsStream("/zklocal.properties"));
-    System.out.println("Kafka is starting...");
-
-    //start kafka
-    kafka = new KafkaLocal(kafkaProperties, zkProperties);
-    Thread.sleep(5000);
-  }
-
-  @After
-  public void cleanUpKafka() {
-    kafka.stop();
-  }
-
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/KafkaConnectorTest.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/KafkaConnectorTest.java
deleted file mode 100644
index fc383fe..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/KafkaConnectorTest.java
+++ /dev/null
@@ -1,72 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import org.apache.kafka.clients.producer.KafkaProducer;
-import org.apache.kafka.clients.producer.ProducerRecord;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.commons.lang3.concurrent.ConcurrentUtils;
-
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import org.mockito.runners.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class KafkaConnectorTest {
-
-  @Mock
-  private KafkaProducer producer;
-
-  private KafkaOutputConnector connector;
-
-  @Before
-  public void setup() throws Exception {
-    connector = new KafkaOutputConnector();
-    connector.setProducer(producer);
-
-    when(producer.send(Mockito.any(ProducerRecord.class))).thenReturn(ConcurrentUtils.constantFuture(true));
-  }
-
-  @Test
-  public void whenSendingDocumenttoKafka() throws Exception {
-    RepositoryDocument document;
-
-    document = new RepositoryDocument();
-
-    document.setMimeType("text\'/plain");
-    document.setFileName("test.txt");
-
-    KafkaMessage kafkaMessage = new KafkaMessage();
-    byte[] finalString = kafkaMessage.createJSON(document);
-
-    IOutputAddActivity activities = mock(IOutputAddActivity.class);
-    VersionContext version = mock(VersionContext.class);
-    //ProducerRecord record = new ProducerRecord("topic", finalString);
-
-    connector.addOrReplaceDocumentWithException("", version, document, "", activities);
-    verify(producer).send(Mockito.any(ProducerRecord.class));
-  }
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/KafkaLocal.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/KafkaLocal.java
deleted file mode 100644
index 7e3b94e..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/KafkaLocal.java
+++ /dev/null
@@ -1,52 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.io.IOException;
-import java.util.Properties;
-import kafka.server.KafkaConfig;
-import kafka.server.KafkaServerStartable;
-
-public class KafkaLocal {
-
-  public KafkaServerStartable kafka;
-  public ZooKeeperLocal zookeeper;
-
-  public KafkaLocal(Properties kafkaProperties, Properties zkProperties) throws IOException, InterruptedException {
-    KafkaConfig kafkaConfig = new KafkaConfig(kafkaProperties);
-
-    //start local zookeeper
-    System.out.println("starting local zookeeper...");
-    zookeeper = new ZooKeeperLocal(zkProperties);
-    System.out.println("done");
-
-    //start local kafka broker
-    kafka = new KafkaServerStartable(kafkaConfig);
-    System.out.println("starting local kafka broker...");
-
-    kafka.startup();
-    System.out.println("done");
-  }
-
-  public void stop() {
-    //stop kafka broker
-    System.out.println("stopping kafka...");
-    kafka.shutdown();
-    System.out.println("done");
-  }
-
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/NavigationHSQLDBUI.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/NavigationHSQLDBUI.java
deleted file mode 100644
index 4de33ee..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,154 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.util.Locale;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-import org.junit.Test;
-import org.junit.Ignore;
-
-public class NavigationHSQLDBUI extends BaseUIHSQLDB {
-
-  @Test
-  public void createConnectionsAndJob()
-          throws Exception {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.output.kafka.KafkaOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Parameters tab
-    testerInstance.clickTab("Parameters");
-    testerInstance.setValue("ip", "localhost");
-    testerInstance.setValue("port", "9092");
-    testerInstance.setValue("topic", "topic");
-    
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save",60);
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // MHL
-    
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-    
-    testerInstance.verifyThereIsNoError();
-  }
-}
diff --git a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/ZooKeeperLocal.java b/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/ZooKeeperLocal.java
deleted file mode 100644
index fe5d56f..0000000
--- a/connectors/kafka/connector/src/test/java/org/apache/manifoldcf/agents/output/kafka/ZooKeeperLocal.java
+++ /dev/null
@@ -1,53 +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 org.apache.manifoldcf.agents.output.kafka;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Properties;
-import org.apache.zookeeper.server.ServerConfig;
-import org.apache.zookeeper.server.ZooKeeperServerMain;
-import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
-
-public class ZooKeeperLocal {
-
-  ZooKeeperServerMain zooKeeperServer;
-
-  public ZooKeeperLocal(Properties zkProperties) throws FileNotFoundException, IOException {
-    QuorumPeerConfig quorumConfiguration = new QuorumPeerConfig();
-    try {
-      quorumConfiguration.parseProperties(zkProperties);
-    } catch (Exception e) {
-      throw new RuntimeException(e);
-    }
-
-    zooKeeperServer = new ZooKeeperServerMain();
-    final ServerConfig configuration = new ServerConfig();
-    configuration.readFrom(quorumConfiguration);
-
-    new Thread() {
-      public void run() {
-        try {
-          zooKeeperServer.runFromConfig(configuration);
-        } catch (IOException e) {
-          System.out.println("ZooKeeper Failed");
-          e.printStackTrace(System.err);
-        }
-      }
-    }.start();
-  }
-}
diff --git a/connectors/kafka/pom.xml b/connectors/kafka/pom.xml
deleted file mode 100644
index b4b35c3..0000000
--- a/connectors/kafka/pom.xml
+++ /dev/null
@@ -1,466 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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 LiceFnse.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-kafka-connector</artifactId>
-  <name>ManifoldCF - Connectors - Kafka</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-          <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-          <execution>
-            <id>native2ascii-utf8</id>
-            <goals>
-              <goal>native2ascii</goal>
-            </goals>
-            <configuration>
-              <encoding>UTF8</encoding>
-              <includes>
-                <include>**/*.properties</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkMode>always</forkMode>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.12.3</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkMode>always</forkMode>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-        
-    <dependency>
-      <groupId>org.apache.kafka</groupId>
-      <artifactId>kafka-clients</artifactId>
-      <version>0.8.2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.kafka</groupId>
-      <artifactId>kafka_2.11</artifactId>
-      <version>0.8.2.1</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.scala-lang</groupId>
-      <artifactId>scala-library</artifactId>
-      <version>2.11.0</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>net.sf.jopt-simple</groupId>
-      <artifactId>jopt-simple</artifactId>
-      <version>3.2</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.scala-lang.modules</groupId>
-      <artifactId>scala-xml_2.11</artifactId>
-      <version>1.0.4</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.scala-lang.modules</groupId>
-      <artifactId>scala-parser-combinators_2.11</artifactId>
-      <version>1.0.4</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.yammer.metrics</groupId>
-      <artifactId>metrics-core</artifactId>
-      <version>2.2.0</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <version>3.4</version>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>${mockito.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.github.tomakehurst</groupId>
-      <artifactId>wiremock</artifactId>
-      <version>${wiremock.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-      <version>${zookeeper.version}</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/connectors/kafka/test-materials/README.txt b/connectors/kafka/test-materials/README.txt
deleted file mode 100644
index 376b37e..0000000
--- a/connectors/kafka/test-materials/README.txt
+++ /dev/null
@@ -1,19 +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.
-
-To test this connector, copy the appropriate Kafka jars and dependencies into
-this directory, and use the "ant test" target for the standard ant build.
-You can read more about the process on the "how-to-build-and-deploy.html"
-documentation page.
diff --git a/connectors/ldap/.gitignore b/connectors/ldap/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/ldap/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/ldap/build.xml b/connectors/ldap/build.xml
deleted file mode 100644
index 954af97..0000000
--- a/connectors/ldap/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="ldap" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-    
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="LDAP"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.ldap.LDAPAuthority"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/LDAPAuthority.java b/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/LDAPAuthority.java
deleted file mode 100644
index a92ffe3..0000000
--- a/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/LDAPAuthority.java
+++ /dev/null
@@ -1,1067 +0,0 @@
-/* $Id$ */
-/**
- * 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 org.apache.manifoldcf.authorities.authorities.ldap;
-
-import java.io.*;
-import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.naming.*;
-import javax.naming.directory.*;
-import javax.naming.ldap.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.ui.util.Encoder;
-import org.apache.manifoldcf.core.common.LDAPSSLSocketFactory;
-
-/**
- * This is the Active Directory implementation of the IAuthorityConnector
- * interface. Access tokens for this connector are simple SIDs, except for the
- * "global deny" token, which is designed to allow the authority to shut off
- * access to all authorized documents when the user is unrecognized or the
- * domain controller does not respond.
- */
-public class LDAPAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector {
-
-  public static final String _rcsid = "@(#)$Id$";
-
-  /**
-   * Session information for all DC's we talk with.
-   */
-  private LdapContext session = null;
-  private StartTlsResponse tls = null;
-  
-  private long sessionExpirationTime = -1L;
-
-  //private ConfigParams parameters;
-
-  private String bindUser;
-  private String bindPass;
-  private String serverProtocol;
-  private String serverName;
-  private String serverPort;
-  private String serverBase;
-  private String userBase;
-  private String userSearch;
-  private String groupBase;
-  private String groupSearch;
-  private String groupNameAttr;
-  private boolean groupMemberDN;
-  private boolean addUserRecord;
-  private List<String> forcedTokens;
-  private String userNameAttr;
-  private String sslKeystoreData;
-  
-  private IKeystoreManager sslKeystore;
-  
-  private long responseLifetime = 60000L; //60sec
-
-  private int LRUsize = 1000;
-
-  /**
-   * Cache manager.
-   */
-  private ICacheManager cacheManager = null;
-
-  /**
-   * Constructor.
-   */
-  public LDAPAuthority() {
-  }
-
-  /**
-   * Set thread context.
-   */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-
-  /**
-   * Connect. The configuration parameters are included.
-   *
-   * @param configParams are the configuration parameters for this connection.
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    //parameters = configParams;
-
-    // Credentials
-    bindUser = configParams.getParameter("ldapBindUser");
-    bindPass = configParams.getObfuscatedParameter("ldapBindPass");
-
-    // We get the parameters here, so we can check them in case they are missing
-    serverProtocol = configParams.getParameter("ldapProtocol");
-    serverName = configParams.getParameter("ldapServerName");
-    serverPort = configParams.getParameter("ldapServerPort");
-    serverBase = configParams.getParameter("ldapServerBase");
-
-    sslKeystoreData = configParams.getParameter("sslKeystore");
-    
-    userBase = configParams.getParameter("ldapUserBase");
-    userSearch = configParams.getParameter("ldapUserSearch");
-    groupBase = configParams.getParameter("ldapGroupBase");
-    groupSearch = configParams.getParameter("ldapGroupSearch");
-    groupNameAttr = configParams.getParameter("ldapGroupNameAttr");
-    userNameAttr = configParams.getParameter("ldapUserNameAttr");
-    groupMemberDN = "1".equals(getParam(configParams, "ldapGroupMemberDn", ""));
-    addUserRecord = "1".equals(getParam(configParams, "ldapAddUserRecord", ""));
-
-    forcedTokens = new ArrayList<String>();
-    int i = 0;
-    while (i < configParams.getChildCount()) {
-      ConfigNode sn = configParams.getChild(i++);
-      if (sn.getType().equals("access")) {
-        String token = "" + sn.getAttributeValue("token");
-        forcedTokens.add(token);
-      }
-    }
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-  /**
-   * Session setup. Anything that might need to throw an exception should go
-   * here.
-   */
-  protected LdapContext getSession()
-    throws ManifoldCFException {
-
-    try {
-      LDAPProtocolEnum ldapProtocol = retrieveLDAPProtocol();
-      if (session == null) {
-        if (serverName == null || serverName.length() == 0) {
-          Logging.authorityConnectors.error("Server name parameter missing but required");
-          throw new ManifoldCFException("Server name parameter missing but required");
-        }
-        if (serverPort == null || serverPort.length() == 0) {
-          Logging.authorityConnectors.error("Server port parameter missing but required");
-          throw new ManifoldCFException("Server port parameter missing but required");
-        }
-        if (serverBase == null) {
-          Logging.authorityConnectors.error("Server base parameter missing but required");
-          throw new ManifoldCFException("Server base parameter missing but required");
-        }
-        if (userBase == null) {
-          Logging.authorityConnectors.error("User base parameter missing but required");
-          throw new ManifoldCFException("User base parameter missing but required");
-        }
-        if (userSearch == null || userSearch.length() == 0) {
-          Logging.authorityConnectors.error("User search expression missing but required");
-          throw new ManifoldCFException("User search expression missing but required");
-        }
-        if (groupBase == null) {
-          Logging.authorityConnectors.error("Group base parameter missing but required");
-          throw new ManifoldCFException("Group base parameter missing but required");
-        }
-        if (groupSearch == null || groupSearch.length() == 0) {
-          Logging.authorityConnectors.error("Group search expression missing but required");
-          throw new ManifoldCFException("Group search expression missing but required");
-        }
-        if (groupNameAttr == null || groupNameAttr.length() == 0) {
-          Logging.authorityConnectors.error("Group name attribute missing but required");
-          throw new ManifoldCFException("Group name attribute missing but required");
-        }
-        if (userNameAttr == null || userNameAttr.length() == 0) {
-          Logging.authorityConnectors.error("User name attribute missing but required");
-          throw new ManifoldCFException("User name attribute missing but required");
-        }
-
-        if (sslKeystoreData != null) {
-          sslKeystore = KeystoreManagerFactory.make("", sslKeystoreData);
-        } else {
-          sslKeystore = KeystoreManagerFactory.make("");
-        }
-
-        final Hashtable env = new Hashtable();
-        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
-        env.put(Context.PROVIDER_URL, "ldap://" + serverName + ":" + serverPort + "/" + serverBase);
-        if (LDAPProtocolEnum.LDAPS.equals(ldapProtocol)) {
-          // Set thread local for keystore stuff
-          LDAPSSLSocketFactory.setSocketFactoryProducer(sslKeystore);
-          env.put(Context.SECURITY_PROTOCOL, "ssl");
-          env.put("java.naming.ldap.factory.socket", "org.apache.manifoldcf.core.common.LDAPSSLSocketFactory");
-        }
-        
-        if (bindUser != null && !bindUser.isEmpty()) {
-          env.put(Context.SECURITY_AUTHENTICATION, "simple");
-          env.put(Context.SECURITY_PRINCIPAL, bindUser);
-          env.put(Context.SECURITY_CREDENTIALS, bindPass);
-        }
-
-        Logging.authorityConnectors.info("LDAP Context environment properties: " + printLdapContextEnvironment(env));
-        session = new InitialLdapContext(env, null);
-        
-        if (isLDAPTLS(ldapProtocol)) {
-          // Start TLS
-          StartTlsResponse tls = (StartTlsResponse) session.extendedOperation(new StartTlsRequest());
-          tls.negotiate(sslKeystore.getSecureSocketFactory());
-        }
-        
-      } else {
-        if (isLDAPS(ldapProtocol)) {
-          // Set thread local for keystore stuff
-          LDAPSSLSocketFactory.setSocketFactoryProducer(sslKeystore);
-        }
-        session.reconnect(null);
-      }
-      sessionExpirationTime = System.currentTimeMillis() + 300000L;
-      return session;
-    } catch (AuthenticationException e) {
-      session = null;
-      sessionExpirationTime = -1L;
-      Logging.authorityConnectors.error("Authentication error: " + e.getMessage() + ", explanation: " + e.getExplanation(), e);
-      throw new ManifoldCFException("Authentication error: " + e.getMessage() + ", explanation: " + e.getExplanation(), e);
-    } catch (CommunicationException e) {
-      session = null;
-      sessionExpirationTime = -1L;
-      Logging.authorityConnectors.error("Communication error: " + e.getMessage(), e);
-      throw new ManifoldCFException("Communication error: " + e.getMessage(), e);
-    } catch (NamingException e) {
-      session = null;
-      sessionExpirationTime = -1L;
-      Logging.authorityConnectors.error("Naming exception: " + e.getMessage(), e);
-      throw new ManifoldCFException("Naming exception: " + e.getMessage(), e);
-    } catch (InterruptedIOException e) {
-      session = null;
-      sessionExpirationTime = -1L;
-      Logging.authorityConnectors.error("Interrupted IO error: " + e.getMessage());
-      throw new ManifoldCFException(e.getMessage(), ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      session = null;
-      sessionExpirationTime = -1L;
-      Logging.authorityConnectors.error("IO error: " + e.getMessage(), e);
-      throw new ManifoldCFException("IO error: " + e.getMessage(), e);
-    }
-  }
-
-  /**
-   * Retrieves LDAPProtocol from serverProtocol String
-   *
-   * @return LDAPProtocolEnum
-   */
-  private LDAPProtocolEnum retrieveLDAPProtocol() {
-    if (serverProtocol == null || serverProtocol.length() == 0) {
-      return  LDAPProtocolEnum.LDAP;
-    }
-
-    final LDAPProtocolEnum ldapProtocol;
-    switch (serverProtocol.toUpperCase(Locale.ENGLISH)){
-      case "LDAP":
-        ldapProtocol = LDAPProtocolEnum.LDAP;
-        break;
-      case "LDAPS":
-        ldapProtocol = LDAPProtocolEnum.LDAPS;
-        break;
-      case "LDAP+TLS":
-        ldapProtocol = LDAPProtocolEnum.LDAP_TLS;
-        break;
-      case "LDAPS+TLS":
-        ldapProtocol = LDAPProtocolEnum.LDAPS_TLS;
-        break;
-      default:
-        ldapProtocol = LDAPProtocolEnum.LDAP;
-    }
-    return ldapProtocol;
-  }
-
-  /**
-   * Checks whether TLS is enabled for given LDAP Protocol
-   *
-   * @param ldapProtocol to check
-   * @return whether TLS is enabled or not
-   */
-  private boolean isLDAPTLS (LDAPProtocolEnum ldapProtocol){
-    return LDAPProtocolEnum.LDAP_TLS.equals(ldapProtocol) || LDAPProtocolEnum.LDAPS_TLS.equals(ldapProtocol);
-  }
-
-  /**
-   * Checks whether LDAPS or LDAPS with TLS is enabled for given LDAP Protocol
-   *
-   * @param ldapProtocol to check
-   * @return whether LDAPS or LDAPS with TLS is enabled or not
-   */
-  private boolean isLDAPS (LDAPProtocolEnum ldapProtocol){
-    return LDAPProtocolEnum.LDAPS.equals(ldapProtocol) || LDAPProtocolEnum.LDAPS_TLS.equals(ldapProtocol);
-  }
-
-  /**
-   * Check connection for sanity.
-   */
-  @Override
-  public String check()
-    throws ManifoldCFException {
-    disconnectSession();
-    getSession();
-    // MHL for a real check of all the search etc.
-    return super.check();
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return session != null;
-  }
-
-  /**
-   * Poll. The connection should be closed if it has been idle for too long.
-   */
-  @Override
-  public void poll()
-    throws ManifoldCFException {
-    if (session != null && System.currentTimeMillis() > sessionExpirationTime) {
-      disconnectSession();
-    }
-    super.poll();
-  }
-
-  /**
-   * Disconnect a session.
-   */
-  protected void disconnectSession() {
-    if (session != null) {
-      try {
-        if (tls != null)
-          tls.close();
-        session.close();
-      } catch (NamingException e) {
-        // Eat this error
-      } catch (IOException e) {
-        // Eat this error
-      }
-      tls = null;
-      session = null;
-      sessionExpirationTime = -1L;
-    }
-  }
-
-  /**
-   * Close the connection. Call this before discarding the repository connector.
-   */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException {
-    disconnectSession();
-    super.disconnect();
-    // Zero out all the stuff that we want to be sure we don't use again
-    serverName = null;
-    serverPort = null;
-    serverBase = null;
-    userBase = null;
-    userSearch = null;
-    groupBase = null;
-    groupSearch = null;
-    groupNameAttr = null;
-    userNameAttr = null;
-    forcedTokens = null;
-    sslKeystoreData = null;
-    sslKeystore = null;
-  }
-
-  protected String createCacheConnectionString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(serverName).append(":").append(serverPort).append("/").append(serverBase);
-    return sb.toString();
-  }
-
-  protected String createUserSearchString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(userBase).append("|").append(userSearch).append("|").append(userNameAttr).append("|").append(addUserRecord ? 'Y' : 'N');
-    return sb.toString();
-  }
-
-  protected String createGroupSearchString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(groupBase).append("|").append(groupSearch).append("|").append(groupNameAttr).append("|").append(groupMemberDN ? 'Y' : 'N');
-    return sb.toString();
-  }
-
-  /**
-   * Obtain the access tokens for a given user name.
-   *
-   * @param userName is the user name or identifier.
-   * @return the response tokens (according to the current authority). (Should
-   * throws an exception only when a condition cannot be properly described
-   * within the authorization response object.)
-   */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException {
-
-    getSession();
-    // Construct a cache description object
-    ICacheDescription objectDescription = new LdapAuthorizationResponseDescription(userName,
-      createCacheConnectionString(), createUserSearchString(), createGroupSearchString(), this.responseLifetime, this.LRUsize);
-
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription}, null, null);
-    try {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse) cacheManager.lookupObject(createHandle, objectDescription);
-        if (response != null) {
-          return response;
-        }
-        // Create the object.
-        response = getAuthorizationResponseUncached(userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle, objectDescription, response);
-        // And return it...
-        return response;
-      } finally {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    } finally {
-      cacheManager.leaveCache(ch);
-    }
-  }
-
-  protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-    throws ManifoldCFException {
-    getSession();
-    try {
-      //find user in LDAP tree
-      SearchResult usrRecord = getUserEntry(session, userName);
-      if (usrRecord == null) {
-        return RESPONSE_USERNOTFOUND;
-      }
-
-      ArrayList theGroups = new ArrayList();
-      theGroups.addAll(forcedTokens);
-
-      String usrName = userName.split("@")[0];
-      if (userNameAttr != null && !"".equals(userNameAttr)) {
-        if (usrRecord.getAttributes() != null) {
-          Attribute attr = usrRecord.getAttributes().get(userNameAttr);
-          if (attr != null) {
-            usrName = attr.get().toString();
-            if (addUserRecord) {
-              NamingEnumeration values = attr.getAll();
-              while (values.hasMore()) {
-                theGroups.add(values.next().toString());
-              }
-            }
-          }
-        }
-      }
-
-      if (groupSearch != null && !groupSearch.isEmpty()) {
-        //specify the LDAP search filter
-        String searchFilter = groupSearch.replaceAll("\\{0\\}", escapeLDAPSearchFilter(groupMemberDN ? usrRecord.getNameInNamespace() : usrName));
-        SearchControls searchCtls = new SearchControls();
-        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-        String returnedAtts[] = {groupNameAttr};
-        searchCtls.setReturningAttributes(returnedAtts);
-
-        NamingEnumeration answer = session.search(groupBase, searchFilter, searchCtls);
-
-        while (answer.hasMoreElements()) {
-          SearchResult sr = (SearchResult) answer.next();
-          Attributes attrs = sr.getAttributes();
-          if (attrs != null) {
-            NamingEnumeration values = attrs.get(groupNameAttr).getAll();
-            while (values.hasMore()) {
-              theGroups.add(values.next().toString());
-            }
-          }
-        }
-      }
-
-      String[] tokens = new String[theGroups.size()];
-      int k = 0;
-      while (k < tokens.length) {
-        tokens[k] = (String) theGroups.get(k);
-        k++;
-      }
-
-      return new AuthorizationResponse(tokens, AuthorizationResponse.RESPONSE_OK);
-
-    } catch (NameNotFoundException e) {
-      // This means that the user doesn't exist
-      Logging.authorityConnectors.error("User does not exists: "+ e.getMessage(), e);
-      return RESPONSE_USERNOTFOUND;
-    } catch (NamingException e) {
-      // Unreachable
-      Logging.authorityConnectors.error("Response Unreachable: "+ e.getMessage(), e);
-      return RESPONSE_UNREACHABLE;
-    }
-  }
-
-  /**
-   * Obtain the default access tokens for a given user name.
-   *
-   * @param userName is the user name or identifier.
-   * @return the default response tokens, presuming that the connect method
-   * fails.
-   */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-    // The default response if the getConnection method fails
-    return RESPONSE_UNREACHABLE;
-  }
-
-  /**
-   * Stringifies LDAP Context environment variable
-   * @param env LDAP Context environment variable
-   * @return Stringified LDAP Context environment. Password is masked if set.
-   */
-  private String printLdapContextEnvironment(Hashtable env) {
-    Hashtable copyEnv = new Hashtable<>(env);
-    if (copyEnv.containsKey(Context.SECURITY_CREDENTIALS)){
-      copyEnv.put(Context.SECURITY_CREDENTIALS, "********");
-    }
-    return Arrays.toString(copyEnv.entrySet().toArray());
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-  /**
-   * Output the configuration header section. This method is called in the head
-   * section of the connector's configuration page. Its purpose is to add the
-   * required tabs to the list, and to output any javascript methods that might
-   * be needed by the configuration editing HTML.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @param tabsArray is an array of tab names. Add to this array any tab names
-   * that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "LDAP.LDAP"));
-    tabsArray.add(Messages.getString(locale, "LDAP.ForcedTokens"));
-    final Map<String,Object> paramMap = new HashMap<String,Object>();
-    fillInLDAPTab(paramMap, out, parameters);
-    fillInForcedTokensTab(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "editConfiguration.js", paramMap);    
-  }
-
-  /**
-   * Output the configuration body section. This method is called in the body
-   * section of the authority connector's configuration page. Its purpose is to
-   * present the required form elements for editing. The coder can presume that
-   * the HTML that is output from this configuration will be within appropriate
-   * <html>, <body>, and <form> tags. The name of the form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @param tabName is the current tab name.
-   */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException {
-    final Map<String,Object> paramMap = new HashMap<String,Object>();
-    paramMap.put("TabName",tabName);
-    fillInLDAPTab(paramMap, out, parameters);
-    fillInForcedTokensTab(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "editConfiguration_LDAP.html", paramMap);    
-    Messages.outputResourceWithVelocity(out, locale, "editConfiguration_ForcedTokens.html", paramMap);    
-  }
-
-  private boolean copyParam(IPostParameters variableContext, ConfigParams parameters, String name) {
-    String val = variableContext.getParameter(name);
-    if (val == null) {
-      return false;
-    }
-    parameters.setParameter(name, val);
-    return true;
-  }
-
-  private void copyParam(IPostParameters variableContext, ConfigParams parameters, String name, String def) {
-    String val = variableContext.getParameter(name);
-    if (val == null) {
-      val = def;
-    }
-    parameters.setParameter(name, val);
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * authority connector's configuration page, whenever there is a possibility
-   * that form data for a connection has been posted. Its purpose is to gather
-   * form information and modify the configuration parameters accordingly. The
-   * name of the posted form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post,
-   * including binary file post information.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an error
-   * that should prevent saving of the connection (and cause a redirection to an
-   * error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException {
-    copyParam(variableContext, parameters, "ldapProtocol");
-    copyParam(variableContext, parameters, "ldapServerName");
-    copyParam(variableContext, parameters, "ldapServerPort");
-    copyParam(variableContext, parameters, "ldapServerBase");
-    copyParam(variableContext, parameters, "ldapUserBase");
-    copyParam(variableContext, parameters, "ldapUserSearch");
-    copyParam(variableContext, parameters, "ldapUserNameAttr");
-    copyParam(variableContext, parameters, "ldapGroupBase");
-    copyParam(variableContext, parameters, "ldapGroupSearch");
-    copyParam(variableContext, parameters, "ldapGroupNameAttr");
-
-    copyParam(variableContext, parameters, "ldapGroupMemberDn", "0"); //checkbox boolean value
-    copyParam(variableContext, parameters, "ldapAddUserRecord", "0"); //checkbox boolean value
-
-    copyParam(variableContext, parameters, "ldapBindUser");
-    final String bindPass = variableContext.getParameter("ldapBindPass");
-    if (bindPass != null) {
-      parameters.setObfuscatedParameter("ldapBindPass", variableContext.mapKeyToPassword(bindPass));
-    }
-
-    final String xc = variableContext.getParameter("tokencount");
-    if (xc != null) {
-      // Delete all tokens first
-      int i = 0;
-      while (i < parameters.getChildCount()) {
-        ConfigNode sn = parameters.getChild(i);
-        if (sn.getType().equals("access")) {
-          parameters.removeChild(i);
-        } else {
-          i++;
-        }
-      }
-
-      final int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount) {
-        final String accessDescription = "_" + Integer.toString(i);
-        final String accessOpName = "accessop" + accessDescription;
-        final String command = variableContext.getParameter(accessOpName);
-        if (command != null && command.equals("Delete")) {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter("spectoken" + accessDescription);
-        ConfigNode node = new ConfigNode("access");
-        node.setAttribute("token", accessSpec);
-        parameters.addChild(parameters.getChildCount(), node);
-        i++;
-      }
-
-      String op = variableContext.getParameter("accessop");
-      if (op != null && op.equals("Add")) {
-        String accessspec = variableContext.getParameter("spectoken");
-        ConfigNode node = new ConfigNode("access");
-        node.setAttribute("token", accessspec);
-        parameters.addChild(parameters.getChildCount(), node);
-      }
-    }
-
-    String sslKeystoreValue = variableContext.getParameter("sslkeystoredata");
-    final String sslConfigOp = variableContext.getParameter("sslconfigop");
-    if (sslConfigOp != null)
-    {
-      if (sslConfigOp.equals("Delete"))
-      {
-        final String alias = variableContext.getParameter("sslkeystorealias");
-        final IKeystoreManager mgr;
-        if (sslKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",sslKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        sslKeystoreValue = mgr.getString();
-      }
-      else if (sslConfigOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("sslcertificate");
-        final IKeystoreManager mgr;
-        if (sslKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",sslKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Eat this exception
-          }
-        }
-
-        if (certError != null)
-        {
-          return "Illegal certificate: "+certError;
-        }
-        sslKeystoreValue = mgr.getString();
-      }
-    }
-    if (sslKeystoreValue != null)
-      parameters.setParameter("sslkeystore",sslKeystoreValue);
-    
-    return null;
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * authority connector's view configuration page. Its purpose is to present
-   * the connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException {
-    final Map<String,Object> paramMap = new HashMap<String,Object>();
-    fillInLDAPTab(paramMap, out, parameters);
-    fillInForcedTokensTab(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "viewConfiguration.html", paramMap);    
-  }
-
-  // Protected methods
-  
-  private static String getParam(final ConfigParams parameters, final String name, final String def) {
-    String rval = parameters.getParameter(name);
-    return rval != null ? rval : def;
-  }
-
-  /** Fill in ForcedTokens tab */
-  protected static void fillInForcedTokensTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    final List<String> forcedTokenList = new ArrayList<String>();
-    for (int i = 0; i < parameters.getChildCount(); i++) {
-      final ConfigNode sn = parameters.getChild(i);
-      if (sn.getType().equals("access")) {
-        forcedTokenList.add(sn.getAttributeValue("token"));
-      }
-    }
-    velocityContext.put("FORCEDTOKENS", forcedTokenList);
-  }
-  
-  /** Fill in LDAP tab */
-  protected static void fillInLDAPTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    velocityContext.put("FSERVERPROTOCOL", getParam(parameters, "ldapProtocol", "ldap"));
-    velocityContext.put("FSERVERNAME", getParam(parameters, "ldapServerName", ""));
-    velocityContext.put("FSERVERPORT", getParam(parameters, "ldapServerPort", "389"));
-    velocityContext.put("FSERVERBASE", getParam(parameters, "ldapServerBase", ""));
-    String sslKeystoreData = parameters.getParameter("sslkeystore");
-    if (sslKeystoreData != null)
-      velocityContext.put("SSLKEYSTOREDATA", sslKeystoreData);
-    velocityContext.put("FUSERBASE", getParam(parameters, "ldapUserBase", "ou=People"));
-    velocityContext.put("FUSERSEARCH", getParam(parameters, "ldapUserSearch", "(&(objectClass=inetOrgPerson)(uid={0}))"));
-    velocityContext.put("FUSERNAMEATTR", getParam(parameters, "ldapUserNameAttr", "uid"));
-    velocityContext.put("FADDUSERRECORD", getParam(parameters, "ldapAddUserRecord", ""));
-    velocityContext.put("FGROUPBASE", getParam(parameters, "ldapGroupBase", "ou=Groups"));
-    velocityContext.put("FGROUPSEARCH", getParam(parameters, "ldapGroupSearch", "(&(objectClass=groupOfNames)(member={0}))"));
-    velocityContext.put("FGROUPNAMEATTR", getParam(parameters, "ldapGroupNameAttr", "cn"));
-    velocityContext.put("FGROUPMEMBERDN", getParam(parameters, "ldapGroupMemberDn", ""));
-    velocityContext.put("FBINDUSER", getParam(parameters, "ldapBindUser", ""));
-    String fBindPass = parameters.getObfuscatedParameter("ldapBindPass");
-    if (fBindPass == null)
-      fBindPass = "";
-    else
-      fBindPass = out.mapPasswordToKey(fBindPass);
-    velocityContext.put("FBINDPASS", fBindPass);
-    
-    Map<String,String> sslCertificatesMap = null;
-    String message = null;
-
-    try {
-      final IKeystoreManager localSslKeystore;
-      if (sslKeystoreData == null)
-        localSslKeystore = KeystoreManagerFactory.make("");
-      else
-        localSslKeystore = KeystoreManagerFactory.make("",sslKeystoreData);
-
-      // List the individual certificates in the store, with a delete button for each
-      final String[] contents = localSslKeystore.getContents();
-      if (contents.length > 0)
-      {
-        sslCertificatesMap = new HashMap<>();
-        for (final String alias : contents)
-        {
-          String description = localSslKeystore.getDescription(alias);
-          if (description.length() > 128)
-            description = description.substring(0,125) + "...";
-          sslCertificatesMap.put(alias, description);
-        }
-      }
-    } catch (ManifoldCFException e) {
-      message = e.getMessage();
-      Logging.authorityConnectors.warn(e);
-    }
-
-    if(sslCertificatesMap != null)
-      velocityContext.put("SSLCERTIFICATESMAP", sslCertificatesMap);
-    if(message != null)
-      velocityContext.put("MESSAGE", message);
-  }
-
-  /**
-   * Obtain the user LDAP record for a given user logon name.
-   *
-   * @param ctx is the ldap context to use.
-   * @param userName (Domain Logon Name) is the user name or identifier.
-   * DC=qa-ad-76,DC=metacarta,DC=com)
-   * @return SearchResult for given domain user logon name. (Should throws an
-   * exception if user is not found.)
-   */
-  protected SearchResult getUserEntry(LdapContext ctx, String userName)
-    throws ManifoldCFException {
-    String searchFilter = userSearch.replaceAll("\\{0\\}", escapeDN(userName.split("@")[0]));
-    SearchControls searchCtls = new SearchControls();
-    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-
-    try {
-      NamingEnumeration answer = ctx.search(userBase, searchFilter, searchCtls);
-      if (answer.hasMoreElements()) {
-        return (SearchResult) answer.next();
-      }
-      return null;
-    } catch (Exception e) {
-      throw new ManifoldCFException(e.getMessage(), e);
-    }
-  }
-
-  /**
-   * LDAP escape a string.
-   */
-  protected static String ldapEscape(String input) {
-    //Add escape sequence to all commas
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true) {
-      int oldIndex = index;
-      index = input.indexOf(",", oldIndex);
-      if (index == -1) {
-        sb.append(input.substring(oldIndex));
-        break;
-      }
-      sb.append(input.substring(oldIndex, index)).append("\\,");
-      index++;
-    }
-    return sb.toString();
-  }
-
-  public static String escapeDN(String name) {
-    StringBuilder sb = new StringBuilder(); // If using JDK >= 1.5 consider using StringBuilder
-    if ((name.length() > 0) && ((name.charAt(0) == ' ') || (name.charAt(0) == '#'))) {
-      sb.append('\\'); // add the leading backslash if needed
-    }
-    for (int i = 0; i < name.length(); i++) {
-      char curChar = name.charAt(i);
-      switch (curChar) {
-        case '\\':
-          sb.append("\\\\");
-          break;
-        case ',':
-          sb.append("\\,");
-          break;
-        case '+':
-          sb.append("\\+");
-          break;
-        case '"':
-          sb.append("\\\"");
-          break;
-        case '<':
-          sb.append("\\<");
-          break;
-        case '>':
-          sb.append("\\>");
-          break;
-        case ';':
-          sb.append("\\;");
-          break;
-        default:
-          sb.append(curChar);
-      }
-    }
-    if ((name.length() > 1) && (name.charAt(name.length() - 1) == ' ')) {
-      sb.insert(sb.length() - 1, '\\'); // add the trailing backslash if needed
-    }
-    return sb.toString();
-  }
-
-  public static String escapeLDAPSearchFilter(String filter) {
-    StringBuilder sb = new StringBuilder(); // If using JDK >= 1.5 consider using StringBuilder
-    for (int i = 0; i < filter.length(); i++) {
-      char curChar = filter.charAt(i);
-      switch (curChar) {
-        case '\\':
-          sb.append("\\5c");
-          break;
-        case '*':
-          sb.append("\\2a");
-          break;
-        case '(':
-          sb.append("\\28");
-          break;
-        case ')':
-          sb.append("\\29");
-          break;
-        case '\u0000':
-          sb.append("\\00");
-          break;
-        default:
-          sb.append(curChar);
-      }
-    }
-    return sb.toString();
-  }
-
-  protected static StringSet emptyStringSet = new StringSet();
-
-  /**
-   * This is the cache object descriptor for cached access tokens from this
-   * connector.
-   */
-  protected class LdapAuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription {
-
-    /**
-     * The user name
-     */
-    protected String userName;
-
-    /**
-     * LDAP connection string with server name and base DN
-     */
-    protected String connectionString;
-
-    /**
-     * User search definition
-     */
-    protected String userSearch;
-
-    /**
-     * Group search definition
-     */
-    protected String groupSearch;
-
-    /**
-     * The response lifetime
-     */
-    protected long responseLifetime;
-
-    /**
-     * The expiration time
-     */
-    protected long expirationTime = -1;
-
-    /**
-     * Constructor.
-     */
-    public LdapAuthorizationResponseDescription(String userName, String connectionString, String userSearch, String groupSearch, long responseLifetime, int LRUsize) {
-      super("LDAPAuthority", LRUsize);
-      this.userName = userName;
-      this.connectionString = connectionString;
-      this.userSearch = userSearch;
-      this.groupSearch = groupSearch;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /**
-     * Return the invalidation keys for this object.
-     */
-    public StringSet getObjectKeys() {
-      return emptyStringSet;
-    }
-
-    /**
-     * Get the critical section name, used for synchronizing the creation of the
-     * object
-     */
-    public String getCriticalSectionName() {
-      StringBuilder sb = new StringBuilder(getClass().getName());
-      sb.append("-").append(userName).append("-").append(connectionString);
-      return sb.toString();
-    }
-
-    /**
-     * Return the object expiration interval
-     */
-    @Override
-    public long getObjectExpirationTime(long currentTime) {
-      if (expirationTime == -1) {
-        expirationTime = currentTime + responseLifetime;
-      }
-      return expirationTime;
-    }
-
-    @Override
-    public int hashCode() {
-      return userName.hashCode() + connectionString.hashCode() + userSearch.hashCode() + groupSearch.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (!(o instanceof LdapAuthorizationResponseDescription)) {
-        return false;
-      }
-      LdapAuthorizationResponseDescription ard = (LdapAuthorizationResponseDescription) o;
-      if (!ard.userName.equals(userName)) {
-        return false;
-      }
-      if (!ard.connectionString.equals(connectionString)) {
-        return false;
-      }
-      if (!ard.userSearch.equals(userSearch)) {
-        return false;
-      }
-      if (!ard.groupSearch.equals(groupSearch)) {
-        return false;
-      }
-      return true;
-    }
-  }
-}
diff --git a/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/LDAPProtocolEnum.java b/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/LDAPProtocolEnum.java
deleted file mode 100644
index c3edb01..0000000
--- a/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/LDAPProtocolEnum.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-/**
- * 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 org.apache.manifoldcf.authorities.authorities.ldap;
-
-enum LDAPProtocolEnum {
-    LDAP,
-    LDAPS,
-    LDAP_TLS,
-    LDAPS_TLS
-}
diff --git a/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/Messages.java b/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/Messages.java
deleted file mode 100644
index 1ec76bb..0000000
--- a/connectors/ldap/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/ldap/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.ldap;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.ldap.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.ldap";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_en_US.properties b/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_en_US.properties
deleted file mode 100644
index 25e0f7e..0000000
--- a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_en_US.properties
+++ /dev/null
@@ -1,61 +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.
-
-LDAP.LDAP=LDAP
-LDAP.LDAPServerNameColon=LDAP server name:
-LDAP.LDAPServerPortColon=LDAP server port:
-LDAP.LDAPServerBaseColon=LDAP server base (e.g. 'dc=office,dc=com'):
-LDAP.LDAPBindUserColon=Bind to server as user (leave empty if not needed):
-LDAP.LDAPBindPasswordColon=Bind to server with password:
-LDAP.UserSearchBaseColon=User search base:
-LDAP.UserSearchFilterColon=User search filter:
-LDAP.GroupSearchBaseColon=Group search base:
-LDAP.GroupSearchFilterColon=Group search filter:
-LDAP.GroupNameAttributeColon=Group name attribute:
-LDAP.AddUserAuthColon=Add user as authorization token:
-LDAP.UserNameAttrColon=User name attribute:
-LDAP.GroupMemberDnColon=Member attribute is DN:
-
-LDAP.ForcedTokens=Forced tokens
-LDAP.ForcedTokensColon=Forced tokens:
-LDAP.Add=Add
-LDAP.Delete=Delete
-LDAP.AddToken=Add token
-LDAP.TypeInToken=Token cannot be empty
-LDAP.NoTokensSpecified=No tokens specified
-LDAP.NoTokensPresent=No tokens specified
-LDAP.ForcedTokensDisclaimer=Forced tokens are meant to enrich results with common tokens explicitly handled by authorization center, like "Everyone". Use with extreme attention as this mechanism can grant privileges to every user outside authorization directory!
-
-LDAP.ServerNameCannotBeBlank=Server name cannot be blank
-LDAP.ServerPortCannotBeBlank=Server port cannot be blank
-LDAP.UserSearchCannotBeBlank=User search expression cannot be blank
-LDAP.GroupSearchCannotBeBlank=Group search expression cannot be blank
-LDAP.GroupNameAttrCannotBeBlank=Group name attribute cannot be blank
-LDAP.UserSearchMustIncludeSubstitution=User search must include user substitution ({0})
-LDAP.GroupSearchMustIncludeSubstitution=Group search must include user substitution ({0})
-LDAP.ServerPortMustBeAnInteger=Server port must be an integer
-LDAP.ServerNameCannotIncludeSlash=Server name cannot include "/" character
-LDAP.ServerBaseCannotIncludeSlash=Server base cannot include "/" character
-
-LDAP.Yes=Yes
-LDAP.No=No
-LDAP.NoCertificatesPresent=No certificates present
-LDAP.SSLCertificateList=SSL certificate list:
-LDAP.AddCert=Add certificate
-LDAP.Add=Add
-LDAP.Certificate=Certificate:
-LDAP.ChooseACertificateFile=Choose a certificate file
-LDAP.LDAPProtocolColon=LDAP protocol:
-
diff --git a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_es_ES.properties b/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_es_ES.properties
deleted file mode 100644
index 616f0f5..0000000
--- a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_es_ES.properties
+++ /dev/null
@@ -1,61 +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.
-
-LDAP.LDAP=LDAP
-LDAP.LDAPServerNameColon=LDAP nombre del servidor:
-LDAP.LDAPServerPortColon=LDAP puerto de servidor:
-LDAP.LDAPServerBaseColon=LDAP base del servidor (e.g. 'dc=oficina,dc=com'):
-LDAP.LDAPBindUserColon=Enlazar al servidor como usuario (dejar en blanco si no es necesario):
-LDAP.LDAPBindPasswordColon=Enlazar a servidor con contraseña:
-LDAP.UserSearchBaseColon=Base de búsqueda del usuario:
-LDAP.UserSearchFilterColon=Filtro de búsqueda de usuario:
-LDAP.GroupSearchBaseColon=Base de búsqueda de grupo:
-LDAP.GroupSearchFilterColon=Filtro de búsqueda del Grupo:
-LDAP.GroupNameAttributeColon=Atributo de nombre de grupo:
-LDAP.AddUserAuthColon=Añadir usuario como token de autorización:
-LDAP.UserNameAttrColon=Atributo de nombre de usuario:
-LDAP.GroupMemberDnColon=Miembro atributo es DN:
-
-LDAP.ForcedTokens=tokens forzadas
-LDAP.ForcedTokensColon=tokens forzadas:
-LDAP.Add=Añadir
-LDAP.Delete=Borrar
-LDAP.AddToken=Añadir token
-LDAP.TypeInToken=Token no puede estar vacío
-LDAP.NoTokensSpecified=No hay tokens especificados
-LDAP.NoTokensPresent=No hay tokens especificados
-LDAP.ForcedTokensDisclaimer=Tokens forzosos tienen el propósito de enriquecer los resultados con fichas comunes manejados explícitamente por centro de autorización , como "Cada uno". Utilizar con extrema atención ya que este mecanismo puede otorgar privilegios a cada usuario fuera del directorio de autorización!
-
-LDAP.ServerNameCannotBeBlank=Nombre del servidor no puede estar en blanco
-LDAP.ServerPortCannotBeBlank=Puerto del servidor no puede estar en blanco
-LDAP.UserSearchCannotBeBlank=Búsqueda de usuarios expresión no puede estar en blanco
-LDAP.GroupSearchCannotBeBlank=Búsqueda del Grupo expresión no puede estar en blanco
-LDAP.GroupNameAttrCannotBeBlank=Atributo de nombre de grupo no puede estar en blanco
-LDAP.UserSearchMustIncludeSubstitution=Búsqueda de usuarios debe incluir la sustitución de usuario ({0})
-LDAP.GroupSearchMustIncludeSubstitution=Búsqueda del Grupo debe incluir la sustitución de usuario ({0})
-LDAP.ServerPortMustBeAnInteger=Puerto del servidor debe ser un entero
-LDAP.ServerNameCannotIncludeSlash=Nombre del servidor no puede incluir "/" carácter
-LDAP.ServerBaseCannotIncludeSlash=Base de servidor no puede incluir "/" carácter
-
-LDAP.Yes=Si
-LDAP.No=No
-LDAP.NoCertificatesPresent=No hay certificados presentes
-LDAP.SSLCertificateList=Lista de certificado SSL:
-LDAP.AddCert=Añadir certificado
-LDAP.Add=Añadir
-LDAP.Certificate=Certificado:
-LDAP.ChooseACertificateFile=Elija un archivo de certificado
-LDAP.LDAPProtocolColon=Protocolo LDAP:
-                                                                                              
diff --git a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_ja_JP.properties b/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_ja_JP.properties
deleted file mode 100644
index 5634d94..0000000
--- a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_ja_JP.properties
+++ /dev/null
@@ -1,60 +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.
-
-LDAP.LDAP=LDAP
-LDAP.LDAPServerNameColon=LDAPサーバ名:
-LDAP.LDAPServerPortColon=LDAPサーバポート:
-LDAP.LDAPServerBaseColon=LDAPサーバベース (例 'dc=office,dc=com'):
-LDAP.LDAPBindUserColon=Bindユーザ (必要なければ空白):
-LDAP.LDAPBindPasswordColon=Bindパスワード:
-LDAP.UserSearchBaseColon=Userサーチベース:
-LDAP.UserSearchFilterColon=Userサーチフィルタ:
-LDAP.GroupSearchBaseColon=Groupサーチベース:
-LDAP.GroupSearchFilterColon=Groupサーチフィルタ:
-LDAP.GroupNameAttributeColon=Group名属性:
-LDAP.AddUserAuthColon=認証トークンとしてユーザを追加:
-LDAP.UserNameAttrColon=ユーザ名属性:
-LDAP.GroupMemberDnColon=メンバ属性がDN:
-
-LDAP.ServerNameCannotBeBlank=サーバ名は空白にできません
-LDAP.ServerPortCannotBeBlank=サーバポートは空白にできません
-LDAP.UserSearchCannotBeBlank=Userサーチ表現は空白にできません
-LDAP.GroupSearchCannotBeBlank=Groupサーチ表現は空白にできません
-LDAP.GroupNameAttrCannotBeBlank=Group名属性は空白にできません
-LDAP.UserSearchMustIncludeSubstitution=Userサーチではユーザ代入句 ({0})を含まなければなりません
-LDAP.GroupSearchMustIncludeSubstitution=Groupサーチではユーザ代入句 ({0})を含まなければなりません
-LDAP.ServerPortMustBeAnInteger=サーバポートは整数でなければなりません
-LDAP.ServerNameCannotIncludeSlash=サーバ名は"/"文字を含むことができません
-LDAP.ServerBaseCannotIncludeSlash=サーバベースは"/"文字を含むことができません
-
-LDAP.ForcedTokens=Forced tokens
-LDAP.ForcedTokensColon=Forced tokens:
-LDAP.Add=Add
-LDAP.Delete=Delete
-LDAP.AddToken=Add token
-LDAP.TypeInToken=Token cannot be empty
-LDAP.NoTokensSpecified=No tokens specified
-LDAP.NoTokensPresent=No tokens specified
-LDAP.ForcedTokensDisclaimer=Forced tokens are meant to enrich results with common tokens explicitly handled by authorization center, like "Everyone". Use with extreme attention as this mechanism can grant privileges to every user outside authorization directory!
-
-LDAP.Yes=Yes
-LDAP.No=No
-LDAP.NoCertificatesPresent=No certificates present
-LDAP.SSLCertificateList=SSL certificate list:
-LDAP.AddCert=Add certificate
-LDAP.Add=Add
-LDAP.Certificate=Certificate:
-LDAP.ChooseACertificateFile=Choose a certificate file
-LDAP.LDAPProtocolColon=LDAP protocol:
diff --git a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_pl_PL.properties b/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_pl_PL.properties
deleted file mode 100644
index e075a63..0000000
--- a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_pl_PL.properties
+++ /dev/null
@@ -1,60 +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.

-

-LDAP.LDAP=LDAP

-LDAP.LDAPServerNameColon=Serwer LDAP:

-LDAP.LDAPServerPortColon=Port LDAP:

-LDAP.LDAPServerBaseColon=Baza DN (np. 'dc=office,dc=com'):

-LDAP.LDAPBindUserColon=Podłącz do serwera jako użytkownik (pozostaw puste jeśli niepotrzebne):

-LDAP.LDAPBindPasswordColon=Podłącz do serwera z hasłem:

-LDAP.UserSearchBaseColon=Baza wyszukiwania użytkowników:

-LDAP.UserSearchFilterColon=Filtr użytkowników:

-LDAP.GroupSearchBaseColon=Baza wyszukiwania grup:

-LDAP.GroupSearchFilterColon=Filtr grup:

-LDAP.GroupNameAttributeColon=Atrybut nazwy grupy:

-LDAP.AddUserAuthColon=Dodaj nazwę użytkownika jako token:

-LDAP.UserNameAttrColon=Atrybut nazwy użytkownika:

-LDAP.GroupMemberDnColon=Elementy atrybutu "member" są w postaci DN:

-

-LDAP.ForcedTokens=Wymuszone tokeny

-LDAP.ForcedTokensColon=Wymuszone tokeny:

-LDAP.Add=Dodaj

-LDAP.Delete=Usuń

-LDAP.AddToken=Dodaj token

-LDAP.TypeInToken=Token nie może być pusty

-LDAP.NoTokensSpecified=Brak zdefiniowanych tokenów

-LDAP.NoTokensPresent=Brak zdefiniowanych tokenów

-LDAP.ForcedTokensDisclaimer=Wymuszone tokeny służą do wzbogacania zwracanych wyników o grupy obsługiwane niejawnie przez centra autoryzacji, jak np. "Wszyscy"/"Everyone". Uzywaj z rozwagą, gdyż mozna w ten sposób nadawać wszystkim użytkownikom dodatkowe uprawnienia poze centrum autoryzacji!

-

-LDAP.ServerNameCannotBeBlank=Nazwa serwera nie może być pusta

-LDAP.ServerPortCannotBeBlank=Port nie może być pusty

-LDAP.UserSearchCannotBeBlank=Filtr użytkowników nie może być pusty

-LDAP.GroupSearchCannotBeBlank=Filtr grup nie może być pusty

-LDAP.GroupNameAttrCannotBeBlank=Atrybut nazwy grupy nie może być pusty

-LDAP.UserSearchMustIncludeSubstitution=Filtr użytkowników musi zawierać odwołanie do nazwy użytkownika ({0})

-LDAP.GroupSearchMustIncludeSubstitution=Filtr grupy musi zawierać odwołanie do nazwy użytkownika ({0})

-LDAP.ServerPortMustBeAnInteger=Port musi być liczbą całkowitą

-LDAP.ServerNameCannotIncludeSlash=Nazwa serwera nie może zawierać znaku "/"

-LDAP.ServerBaseCannotIncludeSlash=Baza DN nie może zawierać znaku "/"

-

-LDAP.Yes=Yes

-LDAP.No=No

-LDAP.NoCertificatesPresent=No certificates present

-LDAP.SSLCertificateList=SSL certificate list:

-LDAP.AddCert=Add certificate

-LDAP.Add=Add

-LDAP.Certificate=Certificate:

-LDAP.ChooseACertificateFile=Choose a certificate file

-LDAP.LDAPProtocolColon=LDAP protocol:

diff --git a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_zh_CN.properties b/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_zh_CN.properties
deleted file mode 100644
index ba1efd3..0000000
--- a/connectors/ldap/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/ldap/common_zh_CN.properties
+++ /dev/null
@@ -1,60 +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.
-
-LDAP.LDAP=LDAP
-LDAP.LDAPServerNameColon=LDAP服务器名:
-LDAP.LDAPServerPortColon=LDAP服务器端口:
-LDAP.LDAPServerBaseColon=LDAP服务器基(例 'dc=office,dc=com'):
-LDAP.LDAPBindUserColon=绑定用户(不需要则置空):
-LDAP.LDAPBindPasswordColon=绑定密码:
-LDAP.UserSearchBaseColon=用户搜索基:
-LDAP.UserSearchFilterColon=用户搜索过滤器:
-LDAP.GroupSearchBaseColon=组搜索基:
-LDAP.GroupSearchFilterColon=组搜索过滤器:
-LDAP.GroupNameAttributeColon=组名属性:
-LDAP.AddUserAuthColon=添加用户认证令牌:
-LDAP.UserNameAttrColon=用户名属性:
-LDAP.GroupMemberDnColon=组成员DN:
-
-LDAP.ServerNameCannotBeBlank=服务器名不能为空
-LDAP.ServerPortCannotBeBlank=服务器端口不能为空
-LDAP.UserSearchCannotBeBlank=用户搜索不能为空
-LDAP.GroupSearchCannotBeBlank=组搜索不能为空
-LDAP.GroupNameAttrCannotBeBlank=组名属性不能为空
-LDAP.UserSearchMustIncludeSubstitution=用户搜索必须要包含用户替代式({0})
-LDAP.GroupSearchMustIncludeSubstitution=组搜索必须要包含用户替代式({0})
-LDAP.ServerPortMustBeAnInteger=服务器端口必须为整数
-LDAP.ServerNameCannotIncludeSlash=服务器名不能包含‘/’字符
-LDAP.ServerBaseCannotIncludeSlash=服务器基不能包含‘/’字符
-
-LDAP.ForcedTokens=强制令牌
-LDAP.ForcedTokensColon=强制令牌:
-LDAP.Add=添加
-LDAP.Delete=删除
-LDAP.AddToken=添加令牌
-LDAP.TypeInToken=令牌不能为空
-LDAP.NoTokensSpecified=令牌未指定
-LDAP.NoTokensPresent=令牌不存在
-LDAP.ForcedTokensDisclaimer=强制令牌是为了充实由授权中心明确处理的通常令牌如“Everyone”的结果。使用时要特别注意,因为这种机制可以授予权限给授权目录外的每一个用户!
-
-LDAP.Yes=Yes
-LDAP.No=No
-LDAP.NoCertificatesPresent=No certificates present
-LDAP.SSLCertificateList=SSL certificate list:
-LDAP.AddCert=Add certificate
-LDAP.Add=Add
-LDAP.Certificate=Certificate:
-LDAP.ChooseACertificateFile=Choose a certificate file
-LDAP.LDAPProtocolColon=LDAP protocol:
diff --git a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration.js b/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration.js
deleted file mode 100644
index d379cb8..0000000
--- a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration.js
+++ /dev/null
@@ -1,147 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright 2014 The Apache Software Foundation.
-
-Licensed 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.
--->
-<script type="text/javascript">
-    <!--
-    function SSLDeleteCertificate(aliasName)
-    {
-      editconnection.sslkeystorealias.value = aliasName;
-      editconnection.sslconfigop.value = "Delete";
-      postForm();
-    }
-
-    function SSLAddCertificate()
-    {
-      if (editconnection.sslcertificate.value == "")
-      {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ChooseACertificateFile'))");
-        editconnection.sslcertificate.focus();
-      }
-      else
-      {
-        editconnection.sslconfigop.value = "Add";
-        postForm();
-      }
-    }
-
-    function checkConfig() {
-      if (editconnection.ldapServerName.value.indexOf("/") != -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerNameCannotIncludeSlash'))");
-        editconnection.ldapServerName.focus();
-        return false;
-      }
-      if (editconnection.ldapServerPort.value != "" && !isInteger(editconnection.ldapServerPort.value)) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerPortMustBeAnInteger'))");
-        editconnection.ldapServerPort.focus();
-        return false;
-      }
-      if (editconnection.ldapServerBase.value.indexOf("/") != -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerBaseCannotIncludeSlash'))");
-        editconnection.ldapServerBase.focus();
-        return false;
-      }
-      if (editconnection.ldapUserSearch.value != "" && editconnection.ldapUserSearch.value.indexOf("{0}") == -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.UserSearchMustIncludeSubstitution'))");
-        editconnection.ldapUserSearch.focus();
-        return false;
-      }
-      if (editconnection.ldapGroupSearch.value != "" && editconnection.ldapGroupSearch.value.indexOf("{0}") == -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.GroupSearchMustIncludeSubstitution'))");
-        editconnection.ldapGroupSearch.focus();
-        return false;
-      }
-      return true;
-    }
-
-    function checkConfigForSave() {
-      if (editconnection.ldapServerName.value == "") {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerNameCannotBeBlank'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapServerName.focus();
-        return false;
-      }
-      if (editconnection.ldapServerPort.value == "") {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerPortCannotBeBlank'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapServerPort.focus();
-        return false;
-      }
-      if (editconnection.ldapUserSearch.value == "") {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.UserSearchCannotBeBlank'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapUserSearch.focus();
-        return false;
-      }
-      if (editconnection.ldapGroupSearch.value == "") {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.GroupSearchCannotBeBlank'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapGroupSearch.focus();
-        return false;
-      }
-      if (editconnection.ldapGroupNameAttr.value == "") {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.GroupNameAttrCannotBeBlank'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapGroupNameAttr.focus();
-        return false;
-      }
-      if (editconnection.ldapUserSearch.value != "" && editconnection.ldapUserSearch.value.indexOf("{0}") == -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.UserSearchMustIncludeSubstitution'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapUserSearch.focus();
-        return false;
-      }
-      if (editconnection.ldapGroupSearch.value != "" && editconnection.ldapGroupSearch.value.indexOf("{0}") == -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.GroupSearchMustIncludeSubstitution'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapGroupSearch.focus();
-        return false;
-      }
-      if (editconnection.ldapServerPort.value != "" && !isInteger(editconnection.ldapServerPort.value)) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerPortMustBeAnInteger'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapServerPort.focus();
-        return false;
-      }
-      if (editconnection.ldapServerName.value.indexOf("/") != -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerNameCannotIncludeSlash'))");
-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.LDAP'))");
-        editconnection.ldapServerName.focus();
-        return false;
-      }
-      if (editconnection.ldapServerBase.value.indexOf("/") != -1) {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.ServerBaseCannotIncludeSlash'))");
-        editconnection.ldapServerBase.focus();
-        return false;
-      }
-      return true;
-    }
-    
-    function SpecOp(n, opValue, anchorvalue) {
-      eval("editconnection."+n+".value = \""+opValue+"\"");
-      postFormSetAnchor(anchorvalue);
-    }
-    
-    function SpecAddToken(anchorvalue) {
-      if (editconnection.spectoken.value == "")
-      {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LDAP.TypeInToken'))");
-        editconnection.spectoken.focus();
-        return;
-      }
-      SpecOp("accessop","Add",anchorvalue);
-    }
-    //-->
-</script>
diff --git a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration_ForcedTokens.html b/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration_ForcedTokens.html
deleted file mode 100644
index c846409..0000000
--- a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration_ForcedTokens.html
+++ /dev/null
@@ -1,68 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('LDAP.ForcedTokens'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr><td class="value" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('LDAP.ForcedTokensDisclaimer'))</td></tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  #set($counter = 0)
-  #foreach($forcedtoken in $FORCEDTOKENS)
-  <tr>
-    <td class="description">
-      <input type="hidden" name="accessop_$counter" value=""/>
-      <input type="hidden" name="spectoken_$counter" value="$Encoder.attributeEscape($forcedtoken)"/>
-      <a name="token_$counter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.Delete'))" onClick='Javascript:SpecOp("accessop_$counter","Delete","token_$counter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.DeleteToken'))$counter"/>
-      </a>
-    </td>
-    <td class="value">
-      $Encoder.bodyEscape($forcedtoken)
-    </td>
-  </tr>
-    #set($counter = $counter + 1)
-  #end
-  #if ($counter == 0)
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('LDAP.NoTokensPresent'))</td>
-  </tr>
-  #end
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <input type="hidden" name="tokencount" value="$counter"/>
-  #set($counterplusone = $counter + 1)
-      <input type="hidden" name="accessop" value=""/>
-      <a name="token_$counter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.Add'))" onClick='Javascript:SpecAddToken("token_$counterplusone")' alt="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.AddToken'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="spectoken" value=""/>
-    </td>
-  </tr>
-</table>
-#else
-  #set($counter = 0)
-  #foreach($forcedtoken in $FORCEDTOKENS)
-<input type="hidden" name="spectoken_$counter" value="$Encoder.attributeEscape($forcedtoken)"/>
-    #set($counter = $counter + 1)
-  #end
-<input type="hidden" name="tokencount" value="$counter"/>
-#end
-
diff --git a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration_LDAP.html b/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration_LDAP.html
deleted file mode 100644
index bb98a35..0000000
--- a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/editConfiguration_LDAP.html
+++ /dev/null
@@ -1,171 +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.
--->
-
-<input name="sslconfigop" type="hidden" value="Continue"/>
-#if($SSLKEYSTOREDATA)
-<input type="hidden" name="sslkeystoredata" value="$Encoder.attributeEscape($SSLKEYSTOREDATA)"/>
-#end
-
-#if($TabName == $ResourceBundle.getString('LDAP.LDAP'))
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPProtocolColon'))</nobr></td>
-    <td class="value">
-      <select name="ldapProtocol" size="4">
-  #if($FSERVERPROTOCOL == '' || $FSERVERPROTOCOL == 'ldap')
-        <option value="ldap" selected="true">LDAP</option>
-  #else
-        <option value="ldap">LDAP</option>
-  #end
-  #if($FSERVERPROTOCOL == 'ldaps')
-        <option value="ldaps" selected="true">LDAPS</option>
-  #else
-        <option value="ldaps">LDAPS</option>
-  #end
-  #if($FSERVERPROTOCOL == 'ldap+tls')
-        <option value="ldap+tls" selected="true">LDAP+TLS</option>
-  #else
-        <option value="ldap+tls">LDAP+TLS</option>
-  #end
-  #if($FSERVERPROTOCOL == 'ldaps+tls')
-        <option value="ldaps+tls" selected="true">LDAPS+TLS</option>
-  #else
-        <option value="ldaps+tls">LDAPS+TLS</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPServerNameColon'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="ldapServerName" value="$Encoder.attributeEscape($FSERVERNAME)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPServerPortColon'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="ldapServerPort" value="$Encoder.attributeEscape($FSERVERPORT)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPServerBaseColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapServerBase" value="$Encoder.attributeEscape($FSERVERBASE)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPBindUserColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapBindUser" value="$Encoder.attributeEscape($FBINDUSER)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPBindPasswordColon'))</nobr></td>
-    <td class="value"><input type="password" size="64" name="ldapBindPass" value="$Encoder.attributeEscape($FBINDPASS)"/></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.UserSearchBaseColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapUserBase" value="$Encoder.attributeEscape($FUSERBASE)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.UserSearchFilterColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapUserSearch" value="$Encoder.attributeEscape($FUSERSEARCH)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.AddUserAuthColon'))</nobr></td>
-    <td class="value">
-  #if($FADDUSERRECORD == '1')
-      <input type="checkbox" value="1" name="ldapAddUserRecord" checked="true"/>
-  #else
-      <input type="checkbox" value="1" name="ldapAddUserRecord"/>
-  #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.UserNameAttrColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapUserNameAttr" value="$Encoder.attributeEscape($FUSERNAMEATTR)"/></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupSearchBaseColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapGroupBase" value="$Encoder.attributeEscape($FGROUPBASE)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupSearchFilterColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapGroupSearch" value="$Encoder.attributeEscape($FGROUPSEARCH)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupNameAttributeColon'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="ldapGroupNameAttr" value="$Encoder.attributeEscape($FGROUPNAMEATTR)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupMemberDnColon'))</nobr></td>
-    <td class="value">
-  #if($FGROUPMEMBERDN == '1')
-      <input type="checkbox" value="1" name="ldapGroupMemberDn" checked="true"/>
-  #else
-      <input type="checkbox" value="1" name="ldapGroupMemberDn"/>
-  #end
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.SSLCertificateList'))</nobr>
-    </td>
-    <td class="value">
-      <input type="hidden" name="sslkeystorealias" value=""/>
-      <table class="displaytable">
-        #if($SSLCERTIFICATESMAP)
-          #foreach($cert in $SSLCERTIFICATESMAP.entrySet())
-        <tr>
-          <td class="description">
-            <input type="button" onclick='Javascript:SSLDeleteCertificate($Encoder.attributeJavascriptEscape($cert.Key))'
-                   alt="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.DeleteCert'))$Encoder.attributeEscape($cert.Key)"
-                   value="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.Delete'))"/>
-          </td>
-          <td class="value">
-            $Encoder.bodyEscape($cert.Value)
-          </td>
-        </tr>
-          #end
-        #else
-        <tr>
-          <td class="message" colspan="2">
-            <nobr>$ResourceBundle.getString('LDAP.NoCertificatesPresent')</nobr>
-          </td>
-        </tr>
-        #end
-      </table>
-      <input type="button" onclick='Javascript:SSLAddCertificate()' alt="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.AddCert'))"
-             value="$Encoder.attributeEscape($ResourceBundle.getString('LDAP.Add'))"/>&nbsp;
-      $Encoder.bodyEscape($ResourceBundle.getString('LDAP.Certificate'))
-      <input name="sslcertificate" size="50" type="file"/>
-    </td>
-  </tr>
-
-</table>
-#else
-<input type="hidden" name="ldapProtocol" value="$Encoder.attributeEscape($FSERVERPROTOCOL)"/>
-<input type="hidden" name="ldapServerName" value="$Encoder.attributeEscape($FSERVERNAME)"/>
-<input type="hidden" name="ldapServerPort" value="$Encoder.attributeEscape($FSERVERPORT)"/>
-<input type="hidden" name="ldapServerBase" value="$Encoder.attributeEscape($FSERVERBASE)"/>
-<input type="hidden" name="ldapBindUser" value="$Encoder.attributeEscape($FBINDUSER)"/>
-<input type="hidden" name="ldapBindPass" value="$Encoder.attributeEscape($FBINDPASS)"/>
-<input type="hidden" name="ldapUserBase" value="$Encoder.attributeEscape($FUSERBASE)"/>
-<input type="hidden" name="ldapUserSearch" value="$Encoder.attributeEscape($FUSERSEARCH)"/>
-<input type="hidden" name="ldapGroupBase" value="$Encoder.attributeEscape($FGROUPBASE)"/>
-<input type="hidden" name="ldapGroupSearch" value="$Encoder.attributeEscape($FGROUPSEARCH)"/>
-<input type="hidden" name="ldapGroupNameAttr" value="$Encoder.attributeEscape($FGROUPNAMEATTR)"/>
-<input type="hidden" name="ldapUserNameAttr" value="$Encoder.attributeEscape($FUSERNAMEATTR)"/>
-<input type="hidden" name="ldapAddUserRecord" value="$Encoder.attributeEscape($FADDUSERRECORD)"/>
-<input type="hidden" name="ldapGroupMemberDn" value="$Encoder.attributeEscape($FGROUPMEMBERDN)"/>
-#end
\ No newline at end of file
diff --git a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/viewConfiguration.html b/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/viewConfiguration.html
deleted file mode 100644
index 7fc6ad6..0000000
--- a/connectors/ldap/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/ldap/viewConfiguration.html
+++ /dev/null
@@ -1,130 +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.
--->
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPServerNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FSERVERNAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPServerPortColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FSERVERPORT)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPServerBaseColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FSERVERBASE)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPBindUserColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FBINDUSER)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.LDAPBindPasswordColon'))</nobr></td>
-    <td class="value">*******</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.UserSearchBaseColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FUSERBASE)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.UserSearchFilterColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FUSERSEARCH)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.AddUserAuthColon'))</nobr></td>
-    <td class="value">
-#if($FADDUSERRECORD == '1')
-    $Encoder.bodyEscape($ResourceBundle.getString('LDAP.Yes'))
-#else
-    $Encoder.bodyEscape($ResourceBundle.getString('LDAP.No'))
-#end
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.UserNameAttrColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FUSERNAMEATTR)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupSearchBaseColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FGROUPBASE)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupSearchFilterColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FGROUPSEARCH)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupNameAttributeColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($FGROUPNAMEATTR)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.GroupMemberDnColon'))</nobr></td>
-    <td class="value">
-#if($FGROUPMEMBERDN == '1')
-    $Encoder.bodyEscape($ResourceBundle.getString('LDAP.Yes'))
-#else
-    $Encoder.bodyEscape($ResourceBundle.getString('LDAP.No'))
-#end
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="4"><hr/></td></tr>
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.SSLCertificateList'))</nobr>
-    </td>
-    <td class="value">
-      <table class="displaytable">
-        #if($SSLCERTIFICATESMAP)
-          #foreach($cert in $SSLCERTIFICATESMAP.entrySet())
-        <tr>
-          <td class="value">
-            $Encoder.bodyEscape($cert.Value)
-          </td>
-        </tr>
-          #end
-        #else
-        <tr>
-          <td class="message" colspan="2">
-            <nobr>$ResourceBundle.getString('LDAP.NoCertificatesPresent')</nobr>
-          </td>
-        </tr>
-        #end
-      </table>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="4"><hr/></td></tr>
-  
-#set($seenany = false)
-#foreach($forcedtoken in $FORCEDTOKENS)
-  #if(!$seenany)
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.ForcedTokensColon'))</nobr></td>
-    <td class="value">
-  #end
-  #set($seenany = true)
-        $Encoder.bodyEscape($forcedtoken)<br/>
-#end
-#if($seenany)
-    </td>
-  </tr>
-#else
-  <tr><td class="message" colspan="4"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LDAP.NoTokensSpecified'))</nobr></td></tr>
-#end
-</table>
diff --git a/connectors/ldap/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/ldap/tests/BaseUIHSQLDB.java b/connectors/ldap/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/ldap/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 45a5afd..0000000
--- a/connectors/ldap/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/ldap/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.ldap.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getAuthorityClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.authorities.authorities.ldap.LDAPAuthority"};
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[]{"LDAP authority"};
-  }
-
-}
diff --git a/connectors/ldap/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/ldap/tests/NavigationHSQLDBUI.java b/connectors/ldap/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/ldap/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index c50a003..0000000
--- a/connectors/ldap/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/ldap/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.ldap.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-
-    // Add an authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButton("Add a new authority group");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("groupname");
-    testerInstance.setValue("groupname","MyAuthorityGroup");
-
-    // Save the authority group
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Add an authority
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButton("Add a new connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyAuthorityConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.authorities.authorities.ldap.LDAPAuthority");
-    testerInstance.selectValue("authoritygroup", "MyAuthorityGroup");
-    testerInstance.clickButton("Continue");
-    
-    // Visit LDAP tab
-    testerInstance.clickTab("LDAP");
-    testerInstance.setValue("ldapServerName", "localhost");
-    testerInstance.setValue("ldapServerBase", "dc=localhost");
-    
-    // Back to the name tab
-    testerInstance.clickTab("Name");
-    
-    // Now, save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Delete the authority connection
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityGroup");
-    testerInstance.acceptAlert();
-    
-
-  }
-  
-}
diff --git a/connectors/ldap/pom.xml b/connectors/ldap/pom.xml
deleted file mode 100644
index b3d1427..0000000
--- a/connectors/ldap/pom.xml
+++ /dev/null
@@ -1,359 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-ldap-connector</artifactId>
-  <name>ManifoldCF - Connectors - LDAP</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_ATTRIBUTES.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_ATTRIBUTES.java
deleted file mode 100644
index b37f311..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_ATTRIBUTES.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LAPI_ATTRIBUTES
-{
-  public final static int CATEGORY_TYPE_LIBRARY = 0;
-
-  public LAPI_ATTRIBUTES(LLConnect session)
-  {
-  }
-  
-  public int AttrGetValues(LLValue catVersion, String attrName, int something, LLValue somethingelse, LLValue result)
-  {
-    return 0;
-  }
-  
-  public int AttrListNames(LLValue catVersion, LLValue something, LLValue rvalue)
-  {
-    return 0;
-  }
-  
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_DOCUMENTS.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_DOCUMENTS.java
deleted file mode 100644
index c955669..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_DOCUMENTS.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LAPI_DOCUMENTS
-{
-  public static final int PERM_SEE = 2;
-  public static final int PERM_SEECONTENTS = 36865;
-  public static final int RIGHT_GROUP = -4;
-  public static final int RIGHT_SYSTEM = -2;
-  public static final int RIGHT_WORLD = -1;
-  public static final int RIGHT_OWNER = -3;
-  public static final int PROJECTSUBTYPE = 202;
-  public static final int CATEGORYSUBTYPE = 131;
-  public static final int DOCUMENTSUBTYPE = 144;
-  public static final int COMPOUNDDOCUMENTSUBTYPE = 136;
-  public static final int FOLDERSUBTYPE = 0;
-	
-  public LAPI_DOCUMENTS(LLConnect session)
-  {
-  }
-  
-  public int ListObjectCategoryIDs(LLValue object, LLValue catID)
-  {
-    return 0;
-  }
-  
-  public int GetObjectInfo(int vol, int id, LLValue objinfo)
-  {
-    return 0;
-  }
-
-  public int GetVersionInfo(int vol, int id, int revNumber, LLValue objinfo)
-  {
-    return 0;
-  }
-  
-  public int FetchVersion(int vol, int id, int revNumber, java.io.OutputStream output)
-  {
-    return 0;
-  }
-
-  public int GetObjectRights(int vol, int objID, LLValue objinfo)
-  {
-    return 0;
-  }
-  
-  public int GetObjectAttributesEx(LLValue objID, LLValue catID, LLValue returnval)
-  {
-    return 0;
-  }
-  
-  public int FetchCategoryVersion(LLValue catID, LLValue catVersion)
-  {
-    return 0;
-  }
-  
-  public int ListObjects(int vol, int objID, String something, String filterString, int perms, LLValue childrenDocs)
-  {
-    return 0;
-  }
-  
-  public int AccessCategoryWS(LLValue entinfo)
-  {
-    return 0;
-  }
-  
-  public int AccessEnterpriseWS(LLValue entinfo)
-  {
-    return 0;
-  }
-  
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_USERS.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_USERS.java
deleted file mode 100644
index d1710bc..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LAPI_USERS.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LAPI_USERS
-{
-  public final static int USER = 0;
-  public final static int PRIV_PERM_BYPASS = 256;
-  public final static int PRIV_PERM_WORLD = 2048;
-
-  public LAPI_USERS(LLConnect session)
-  {
-  }
-  
-  public int ListRights(int user, String domainAndUser, LLValue retval)
-  {
-    return 0;
-  }
-  
-  public int GetUserInfo(String domainAndUser, LLValue retval)
-  {
-    return 0;
-  }
-  
-  public int GetUserByID(int user, LLValue retval)
-  {
-    return 0;
-  }
-  
-  public int ListUsers(LLValue rval)
-  {
-    return 0;
-  }
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLBadServerCertificateException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLBadServerCertificateException.java
deleted file mode 100644
index 92ee369..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLBadServerCertificateException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLBadServerCertificateException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLConnect.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLConnect.java
deleted file mode 100644
index fee1ea3..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLConnect.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id: LLSession.java 1346308 2012-06-05 09:24:09Z kwright $ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLConnect
-{
-
-  public LLConnect(String server, int port, String something, String somethingelse)
-  {
-  }
-  
-  public String getStatusMessage()
-  {
-    return null;
-  }
-  
-  public String getErrMsg()
-  {
-    return null;
-  }
-  
-  public String getApiError()
-  {
-    return null;
-  }
-  
-  public int getStatus()
-  {
-    return 0;
-  }
-  
-  public String getHost()
-  {
-    return null;
-  }
-  
-  public int getPort()
-  {
-    return 0;
-  }
-
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLCouldNotConnectHTTPException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLCouldNotConnectHTTPException.java
deleted file mode 100644
index a031acc..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLCouldNotConnectHTTPException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLCouldNotConnectHTTPException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPAccessDeniedException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPAccessDeniedException.java
deleted file mode 100644
index b09a698..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPAccessDeniedException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPAccessDeniedException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPCGINotFoundException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPCGINotFoundException.java
deleted file mode 100644
index f16857c..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPCGINotFoundException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPCGINotFoundException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPClientException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPClientException.java
deleted file mode 100644
index 106d23e..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPClientException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPClientException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPForbiddenException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPForbiddenException.java
deleted file mode 100644
index b54a9dc..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPForbiddenException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPForbiddenException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPProxyAuthRequiredException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPProxyAuthRequiredException.java
deleted file mode 100644
index 6859655..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPProxyAuthRequiredException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPProxyAuthRequiredException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPRedirectionException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPRedirectionException.java
deleted file mode 100644
index d7068db..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPRedirectionException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPRedirectionException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPServerException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPServerException.java
deleted file mode 100644
index 7267558..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLHTTPServerException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLHTTPServerException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIOException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIOException.java
deleted file mode 100644
index 3bc2afe..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIOException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLIOException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIllegalOperationException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIllegalOperationException.java
deleted file mode 100644
index 0eedc5d..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIllegalOperationException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLIllegalOperationException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIndexOutOfBoundsException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIndexOutOfBoundsException.java
deleted file mode 100644
index 7f64246..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLIndexOutOfBoundsException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLIndexOutOfBoundsException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLNoFieldSpecifiedException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLNoFieldSpecifiedException.java
deleted file mode 100644
index f1e4374..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLNoFieldSpecifiedException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLNoFieldSpecifiedException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLNoValueSpecifiedException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLNoValueSpecifiedException.java
deleted file mode 100644
index e62113f..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLNoValueSpecifiedException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLNoValueSpecifiedException extends RuntimeException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSSLNotAvailableException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSSLNotAvailableException.java
deleted file mode 100644
index 6342e41..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSSLNotAvailableException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLSSLNotAvailableException extends LLIOException
-{
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSecurityProviderException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSecurityProviderException.java
deleted file mode 100644
index d0416b8..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSecurityProviderException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLSecurityProviderException extends RuntimeException
-{
-  public LLSecurityProviderException(String text)
-  {
-    super(text);
-  }
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSession.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSession.java
deleted file mode 100644
index 586a87b..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLSession.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLSession extends LLConnect
-{
-
-  public LLSession(String server, int port, String something, String user, String password, LLValue whoknows)
-  {
-    super(server,port,null,null);
-  }
-
-  public static void GetCARootCerts(String path, LLValue something)
-  {
-  }
-
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLUnknownFieldException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLUnknownFieldException.java
deleted file mode 100644
index 72322de..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLUnknownFieldException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLUnknownFieldException extends RuntimeException
-{
-  public LLUnknownFieldException(String text)
-  {
-    super(text);
-  }
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLUnsupportedAuthMethodException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLUnsupportedAuthMethodException.java
deleted file mode 100644
index d9bef97..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLUnsupportedAuthMethodException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLUnsupportedAuthMethodException extends RuntimeException
-{
-  public LLUnsupportedAuthMethodException(String text)
-  {
-    super(text);
-  }
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLValue.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLValue.java
deleted file mode 100644
index 5f4fcfc..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLValue.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-import java.util.*;
-
-/** Stub classes to get connector to build.
-*/
-public class LLValue
-{
-  public static final int LL_TRUE = 1;
-  public static final int LL_FALSE = 0;
-  
-  public LLValue()
-  {
-  }
-  
-  public long toLong(int index, String attributeName)
-  {
-    return 0;
-  }
-  
-  public long toLong(String attributeName)
-  {
-    return 0;
-  }
-
-  public int toInteger(int index, String attributeName)
-  {
-    return 0;
-  }
-  
-  public int toInteger(String attributeName)
-  {
-    return 0;
-  }
-  
-  public int size()
-  {
-    return 0;
-  }
-  
-  public LLValue toValue(int index)
-  {
-    return null;
-  }
-  
-  public String toString(String attributeName)
-  {
-     return null;
-  }
-  
-  public LLValue setAssocNotSet()
-  {
-    return null;
-  }
-  
-  public LLValue setAssoc()
-  {
-    return null;
-  }
-  
-  public int add(String attributeName, int intValue)
-  {
-    return 0;
-  }
-
-  public int add(String attributeName, String strValue)
-  {
-    return 0;
-  }
-
-  public int add(String attributeName, LLValue llValue)
-  {
-    return 0;
-  }
-  
-  public boolean isTable()
-  {
-    return false;
-  }
-  
-  public boolean isRecord()
-  {
-    return false;
-  }
-  
-  public LLValueEnumeration enumerateValues()
-  {
-    return null;
-  }
-  
-  public String toString(int index, String attributeName)
-  {
-    return null;
-  }
-  
-  public Date toDate(String attributeName)
-  {
-    return null;
-  }
-  
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLValueEnumeration.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLValueEnumeration.java
deleted file mode 100644
index 4d876bb..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLValueEnumeration.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-import java.util.Enumeration;
-
-/** Stub classes to get connector to build.
-*/
-public class LLValueEnumeration implements Enumeration
-{
-  public LLValueEnumeration()
-  {
-  }
-  
-  public LLValueEnumeration(Enumeration e)
-  {
-  }
-  
-  public boolean hasMoreElements()
-  {
-    return false;
-  }
-  
-  public Object nextElement()
-  {
-    return null;
-  }
-  
-  public LLValue nextValue()
-  {
-    return null;
-  }
-}
-
diff --git a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLWebAuthInitException.java b/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLWebAuthInitException.java
deleted file mode 100644
index 3f9bff8..0000000
--- a/connectors/livelink/build-stub/src/main/java/com/opentext/api/LLWebAuthInitException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 com.opentext.api;
-
-/** Stub classes to get connector to build.
-*/
-public class LLWebAuthInitException extends RuntimeException
-{
-  public LLWebAuthInitException(String text)
-  {
-    super(text);
-  }
-}
-
diff --git a/connectors/livelink/build.xml b/connectors/livelink/build.xml
deleted file mode 100644
index 272693f..0000000
--- a/connectors/livelink/build.xml
+++ /dev/null
@@ -1,76 +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.
--->
-
-<project name="livelink" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="lib-proprietary" includes="*.jar"/>
-    </path>
-
-    <target name="has-proprietary-materials-check">
-        <available file="lib-proprietary/lapi.jar" property="lapiStatus"/>
-        <condition property="proprietaryMaterialsAvailable">
-            <isset property="lapiStatus"/>
-        </condition>
-    </target>
-    
-    <target name="calculate-run-condition" depends="has-proprietary-materials-check">
-        <condition property="libs-present">
-            <isset property="proprietaryMaterialsAvailable"/>
-        </condition>
-    </target>
-    
-    <target name="prerun-warn" depends="calculate-run-condition" unless="libs-present">
-        <echo message="LiveLink connector requires lapi.jar to be runnable"/>
-    </target>
-    
-    <target name="copy-proprietary-libs" depends="prerun-check" if="canRun">
-        <mkdir dir="dist/lib-proprietary-only"/>
-        <copy todir="dist/lib-proprietary-only">
-            <fileset dir="lib-proprietary" includes="*.jar"/>
-        </copy>
-    </target>
-    
-    <target name="lib" depends="mcf-connector-build.lib,copy-proprietary-libs,precompile-check" if="canBuild">
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="LiveLink"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.livelink.LivelinkAuthority"/>
-        </antcall>
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="LiveLink"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.livelink.LivelinkConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/livelink/LivelinkAuthority.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/livelink/LivelinkAuthority.java
deleted file mode 100644
index b304353..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/livelink/LivelinkAuthority.java
+++ /dev/null
@@ -1,1062 +0,0 @@
-/* $Id: LivelinkAuthority.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.livelink;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-import org.apache.manifoldcf.livelink.*;
-
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import java.util.regex.*;
-
-import com.opentext.api.*;
-
-/** This is the Livelink implementation of the IAuthorityConnector interface.
-* This is not based on Volant code, but has been developed by me at the behest of
-* James Maupin for use at Shell.
-*
-* Access tokens for livelink are simply user and usergroup node identifiers.  Therefore,
-* this class retrieves those using the standard livelink call, being sure to map anything
-* that looks like an active directory user name to something that looks like a Livelink
-* domain/username form.
-*
-*/
-public class LivelinkAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id: LivelinkAuthority.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  //Forward to the javascript to check the configuration parameters.
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-
-  //Forward to the HTML template to edit the configuration parameters.
-  private static final String EDIT_CONFIGURATION_SERVER_HTML = "editConfiguration_Server.html";
-  private static final String EDIT_CONFIGURATION_CACHE_HTML = "editConfiguration_Cache.html";
-
-  //Forward to the HTML template to view the configuration parameters.
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-
-  // Signal that we have set up connection parameters properly
-  private boolean hasSessionParameters = false;
-  // Signal that we have set up a connection properly
-  private boolean hasConnected = false;
-  // Session expiration time
-  private long expirationTime = -1L;
-  // Idle session expiration interval
-  private final static long expirationInterval = 300000L;
-  
-  // Data from the parameters
-  private String serverProtocol = null;
-  private String serverName = null;
-  private int serverPort = -1;
-  private String serverUsername = null;
-  private String serverPassword = null;
-  private String serverHTTPCgi = null;
-  private String serverHTTPNTLMDomain = null;
-  private String serverHTTPNTLMUsername = null;
-  private String serverHTTPNTLMPassword = null;
-  private IKeystoreManager serverHTTPSKeystore = null;
-
-  // Data required for maintaining livelink connection
-  private LAPI_USERS LLUsers = null;
-  private LLSERVER llServer = null;
-
-  // Cache variables
-  private String cacheLifetime = null;
-  private String cacheLRUsize = null;
-  private long responseLifetime = 60000L;
-  private int LRUsize = 1000;
-
-  // Retry count.  This is so we can try to install some measure of sanity into situations where LAPI gets confused communicating to the server.
-  // So, for some kinds of errors, we just retry for a while hoping it will go away.
-  private static final int FAILURE_RETRY_COUNT = 5;
-
-  /** Cache manager. */
-  protected ICacheManager cacheManager = null;
-  
-  // Livelink does not have "deny" permissions, and there is no such thing as a document with no tokens, so it is safe to not have a local "deny" token.
-  // However, people feel that a suspenders-and-belt approach is called for, so this restriction has been added.
-  // Livelink tokens are numbers, "SYSTEM", or "GUEST", so they can't collide with the standard form.
-
-  /** Constructor.
-  */
-  public LivelinkAuthority()
-  {
-  }
-
-  /** Set thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-  
-  /** Clear thread context.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    cacheManager = null;
-  }
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-  }
-
-  /** Initialize the parameters, including the ones needed for caching.
-  */
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (!hasSessionParameters)
-    {
-      // Server parameters
-      serverProtocol = params.getParameter(LiveLinkParameters.serverProtocol);
-      serverName = params.getParameter(LiveLinkParameters.serverName);
-      String serverPortString = params.getParameter(LiveLinkParameters.serverPort);
-      serverUsername = params.getParameter(LiveLinkParameters.serverUsername);
-      serverPassword = params.getObfuscatedParameter(LiveLinkParameters.serverPassword);
-      serverHTTPCgi = params.getParameter(LiveLinkParameters.serverHTTPCgiPath);
-      serverHTTPNTLMDomain = params.getParameter(LiveLinkParameters.serverHTTPNTLMDomain);
-      serverHTTPNTLMUsername = params.getParameter(LiveLinkParameters.serverHTTPNTLMUsername);
-      serverHTTPNTLMPassword = params.getObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword);
-
-      // Server parameter processing
-
-      if (serverProtocol == null || serverProtocol.length() == 0)
-        serverProtocol = "internal";
-        
-      if (serverPortString == null)
-        serverPort = 2099;
-      else
-        serverPort = new Integer(serverPortString).intValue();
-        
-      if (serverHTTPNTLMDomain != null && serverHTTPNTLMDomain.length() == 0)
-        serverHTTPNTLMDomain = null;
-      if (serverHTTPNTLMUsername == null || serverHTTPNTLMUsername.length() == 0)
-      {
-        serverHTTPNTLMUsername = null;
-        serverHTTPNTLMPassword = null;
-      }
-
-      // Set up server ssl if indicated
-      String serverHTTPSKeystoreData = params.getParameter(LiveLinkParameters.serverHTTPSKeystore);
-      if (serverHTTPSKeystoreData != null)
-        serverHTTPSKeystore = KeystoreManagerFactory.make("",serverHTTPSKeystoreData);
-
-      cacheLifetime = params.getParameter(LiveLinkParameters.cacheLifetime);
-      if (cacheLifetime == null)
-        cacheLifetime = "1";
-      cacheLRUsize = params.getParameter(LiveLinkParameters.cacheLRUSize);
-      if (cacheLRUsize == null)
-        cacheLRUsize = "1000";
-      
-      try
-      {
-        responseLifetime = Long.parseLong(this.cacheLifetime) * 60L * 1000L;
-        LRUsize = Integer.parseInt(this.cacheLRUsize);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Cache lifetime or Cache LRU size must be an integer: "+e.getMessage(),e);
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-      {
-        String passwordExists = (serverPassword!=null && serverPassword.length() > 0)?"password exists":"";
-        Logging.authorityConnectors.debug("Livelink: Livelink connection parameters: Server='"+serverName+"'; port='"+serverPort+"'; user name='"+serverUsername+"'; "+passwordExists);
-      }
-      hasSessionParameters = true;
-    }
-  }
-  
-  /** Set up a session.
-  */
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSessionParameters();
-    if (!hasConnected)
-    {
-
-      int sanityRetryCount = FAILURE_RETRY_COUNT;
-      while (true)
-      {
-        try
-        {
-          // Create the session
-          llServer = new LLSERVER(!serverProtocol.equals("internal"),serverProtocol.equals("https"),
-            serverName,serverPort,serverUsername,serverPassword,
-            serverHTTPCgi,serverHTTPNTLMDomain,serverHTTPNTLMUsername,serverHTTPNTLMPassword,
-            serverHTTPSKeystore);
-
-          LLUsers = new LAPI_USERS(llServer.getLLSession());
-          if (Logging.authorityConnectors.isDebugEnabled())
-          {
-            Logging.authorityConnectors.debug("Livelink: Livelink session created.");
-          }
-          hasConnected = true;
-          break;
-        }
-        catch (RuntimeException e)
-        {
-          sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount);
-        }
-      }
-    }
-    expirationTime = System.currentTimeMillis() + expirationInterval;
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Check connection for sanity.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Reestablish the session
-      hasConnected = false;
-      getSession();
-      // Get user info for the crawl user, to make sure it works
-      int sanityRetryCount = FAILURE_RETRY_COUNT;
-      while (true)
-      {
-        try
-        {
-          LLValue userObject = new LLValue();
-          int status = LLUsers.GetUserInfo("Admin", userObject);
-          // User Not Found is ok; the server user name may include the domain.
-          if (status == 103101 || status == 401203)
-            return super.check();
-          if (status != 0)
-            return "Connection failed: User authentication failed";
-          return super.check();
-        }
-        catch (RuntimeException e)
-        {
-          sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount);
-        }
-      }
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Temporary service interruption: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      return "Connection failed: "+e.getMessage();
-    }
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    if (!hasConnected)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= expirationTime)
-    {
-      hasConnected = false;
-      expirationTime = -1L;
-
-      // Shutdown livelink connection
-      if (llServer != null)
-      {
-        llServer.disconnect();
-        llServer = null;
-      }
-      
-      LLUsers = null;
-    }
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return hasConnected;
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    hasSessionParameters = false;
-    hasConnected = false;
-    expirationTime = -1L;
-    
-    if (llServer != null)
-    {
-      llServer.disconnect();
-      llServer = null;
-    }
-    LLUsers = null;
-    
-    serverProtocol = null;
-    serverName = null;
-    serverPort = -1;
-    serverUsername = null;
-    serverPassword = null;
-    serverHTTPCgi = null;
-    serverHTTPNTLMDomain = null;
-    serverHTTPNTLMUsername = null;
-    serverHTTPNTLMPassword = null;
-    serverHTTPSKeystore = null;
-
-    cacheLifetime = null;
-    cacheLRUsize = null;
-
-    super.disconnect();
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    // We need the session parameters here
-    getSessionParameters();
-
-    // Construct a cache description object
-    ICacheDescription objectDescription = new AuthorizationResponseDescription(userName,
-      serverProtocol,serverName,serverPort,
-      serverUsername,serverPassword,
-      serverHTTPCgi,serverHTTPNTLMDomain,serverHTTPNTLMUsername,serverHTTPNTLMPassword,
-      serverHTTPSKeystore,
-      responseLifetime,LRUsize);
-      
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-    try
-    {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try
-      {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-        if (response != null)
-          return response;
-        // Create the object.
-        response = getAuthorizationResponseUncached(userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle,objectDescription,response);
-        // And return it...
-        return response;
-      }
-      finally
-      {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-  
-  /** Uncached method to get access tokens for a user name. */
-  protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      getSession();
-      // First, do what's necessary to map the user name that comes in to a reasonable
-      // Livelink domain\\user combination.
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-      {
-        Logging.authorityConnectors.debug("Authentication user name = '"+userName+"'");
-      }
-
-      String domainAndUser = userName;
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-      {
-        Logging.authorityConnectors.debug("Livelink: Livelink user name = '"+domainAndUser+"'");
-      }
-
-      int sanityRetryCount = FAILURE_RETRY_COUNT;
-      while (true)
-      {
-        try
-        {
-          ArrayList list = new ArrayList();
-
-          // Find out if the specified user is a member of the Guest group, or is a member
-          // of the System group.
-          // Get information about the current user.  This is how we will determine if the
-          // user exists, and also what permissions s/he has.
-          LLValue userObject = new LLValue();
-          int status = LLUsers.GetUserInfo(domainAndUser, userObject);
-          if (status == 103101 || status == 401203)
-          {
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("Livelink: Livelink user '"+domainAndUser+"' does not exist");
-            return RESPONSE_USERNOTFOUND;
-          }
-
-          if (status != 0)
-          {
-            Logging.authorityConnectors.warn("Livelink: User '"+domainAndUser+"' GetUserInfo error # "+Integer.toString(status)+" "+llServer.getErrors());
-            // The server is probably down.
-            return RESPONSE_UNREACHABLE;
-          }
-
-          int deleted = userObject.toInteger("Deleted");
-          if (deleted == 1)
-          {
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("Livelink: Livelink user '"+domainAndUser+"' has been deleted");
-            // Since the user cannot become undeleted, then this should be treated as 'user does not exist'.
-            return RESPONSE_USERNOTFOUND;
-          }
-          int privs = userObject.toInteger("UserPrivileges");
-          if ((privs & LAPI_USERS.PRIV_PERM_WORLD) == LAPI_USERS.PRIV_PERM_WORLD)
-            list.add("GUEST");
-          if ((privs & LAPI_USERS.PRIV_PERM_BYPASS) == LAPI_USERS.PRIV_PERM_BYPASS)
-            list.add("SYSTEM");
-
-          LLValue childrenObjects = new LLValue();
-          status = LLUsers.ListRights(LAPI_USERS.USER, domainAndUser, childrenObjects);
-          if (status == 103101 || status == 401203)
-          {
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("Livelink: Livelink error looking up user rights for '"+domainAndUser+"' - user does not exist");
-            return RESPONSE_USERNOTFOUND;
-          }
-
-          if (status != 0)
-          {
-            // If the user doesn't exist, return null.  Right now, not sure how to figure out the
-            // right error code, so just stuff it in the log.
-            Logging.authorityConnectors.warn("Livelink: For user '"+domainAndUser+"', ListRights error # "+Integer.toString(status)+" "+llServer.getErrors());
-            // An error code at this level has to indicate a suddenly unreachable authority
-            return RESPONSE_UNREACHABLE;
-          }
-
-          // Go through the individual objects, and get their IDs.  These id's will be the access tokens
-          int size;
-
-          if (childrenObjects.isRecord())
-            size = 1;
-          else if (childrenObjects.isTable())
-            size = childrenObjects.size();
-          else
-            size = 0;
-
-          // We need also to add in support for the special rights objects.  These are:
-          // -1: RIGHT_WORLD
-          // -2: RIGHT_SYSTEM
-          // -3: RIGHT_OWNER
-          // -4: RIGHT_GROUP
-          //
-          // RIGHT_WORLD means guest access.
-          // RIGHT_SYSTEM is "Public Access".
-          // RIGHT_OWNER is access by the owner of the object.
-          // RIGHT_GROUP is access by a member of the base group containing the owner
-          //
-          // These objects are returned by the corresponding GetObjectRights() call made during
-          // the ingestion process.  We have to figure out how to map these to things that are
-          // the equivalent of acls.
-
-          // Idea:
-          // 1) RIGHT_WORLD is based on some property of the user.
-          // 2) RIGHT_SYSTEM is based on some property of the user.
-          // 3) RIGHT_OWNER and RIGHT_GROUP are managed solely in the ingestion side of the world.
-
-          // NOTE:  It turns out that -1 and -2 are in fact returned as part of the list of
-          // rights requested above.  They get mapped to special keywords already in the above
-          // code, so it *may* be reasonable to filter them from here.  It's not a real problem because
-          // it's effectively just a duplicate of what we are doing.
-
-          int j = 0;
-          while (j < size)
-          {
-            int token = childrenObjects.toInteger(j, "ID");
-            list.add(Integer.toString(token));
-            j++;
-          }
-          String[] rval = new String[list.size()];
-          j = 0;
-          while (j < rval.length)
-          {
-            rval[j] = (String)list.get(j);
-            j++;
-          }
-
-          return new AuthorizationResponse(rval,AuthorizationResponse.RESPONSE_OK);
-        }
-        catch (RuntimeException e)
-        {
-          sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount);
-        }
-      }
-    }
-    catch (ServiceInterruption e)
-    {
-      Logging.authorityConnectors.warn("Livelink: Server seems to be down: "+e.getMessage(),e);
-      return RESPONSE_UNREACHABLE;
-    }
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    // The default response if the getConnection method fails
-    return RESPONSE_UNREACHABLE;
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Server"));
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Cache"));
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_JS, null, true);  
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {        
-    Map<String, Object> velocityContext = new HashMap<>();
-    velocityContext.put("TabName",tabName);
-
-    fillInServerTab(velocityContext, out, parameters);
-    fillInCacheTab(velocityContext, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_SERVER_HTML, velocityContext);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_CACHE_HTML, velocityContext);
-  }
-
-  /** Fill in Server tab */
-  protected static void fillInServerTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    // LAPI parameters
-    String serverProtocol = parameters.getParameter(LiveLinkParameters.serverProtocol);
-    if (serverProtocol == null)
-      serverProtocol = "internal";
-    String serverName = parameters.getParameter(LiveLinkParameters.serverName);
-    if (serverName == null)
-      serverName = "localhost";
-    String serverPort = parameters.getParameter(LiveLinkParameters.serverPort);
-    if (serverPort == null)
-      serverPort = "2099";
-    String serverUserName = parameters.getParameter(LiveLinkParameters.serverUsername);
-    if (serverUserName == null)
-      serverUserName = "";
-    String serverPassword = parameters.getObfuscatedParameter(LiveLinkParameters.serverPassword);
-    if (serverPassword == null)
-      serverPassword = "";
-    else
-      serverPassword = out.mapPasswordToKey(serverPassword);
-    String serverHTTPCgiPath = parameters.getParameter(LiveLinkParameters.serverHTTPCgiPath);
-    if (serverHTTPCgiPath == null)
-      serverHTTPCgiPath = "/livelink/livelink.exe";
-    String serverHTTPNTLMDomain = parameters.getParameter(LiveLinkParameters.serverHTTPNTLMDomain);
-    if (serverHTTPNTLMDomain == null)
-      serverHTTPNTLMDomain = "";
-    String serverHTTPNTLMUserName = parameters.getParameter(LiveLinkParameters.serverHTTPNTLMUsername);
-    if (serverHTTPNTLMUserName == null)
-      serverHTTPNTLMUserName = "";
-    String serverHTTPNTLMPassword = parameters.getObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword);
-    if (serverHTTPNTLMPassword == null)
-      serverHTTPNTLMPassword = "";
-    else
-      serverHTTPNTLMPassword = out.mapPasswordToKey(serverHTTPNTLMPassword);
-    String serverHTTPSKeystore = parameters.getParameter(LiveLinkParameters.serverHTTPSKeystore);
-
-    IKeystoreManager localServerHTTPSKeystore;
-    Map<String,String> serverCertificatesMap = null;
-    String message = null;
-
-    try {
-      if (serverHTTPSKeystore == null)
-        localServerHTTPSKeystore = KeystoreManagerFactory.make("");
-      else
-        localServerHTTPSKeystore = KeystoreManagerFactory.make("",serverHTTPSKeystore);
-
-      // List the individual certificates in the store, with a delete button for each
-      String[] contents = localServerHTTPSKeystore.getContents();
-      if (contents.length > 0)
-      {
-        serverCertificatesMap = new HashMap<>();
-        int i = 0;
-        while (i < contents.length)
-        {
-          String alias = contents[i];
-          String description = localServerHTTPSKeystore.getDescription(alias);
-          if (description.length() > 128)
-            description = description.substring(0,125) + "...";
-          serverCertificatesMap.put(alias, description);
-          i++;
-        }
-      }
-    } catch (ManifoldCFException e) {
-      message = e.getMessage();
-      org.apache.manifoldcf.crawler.system.Logging.connectors.warn(e);
-    }
-
-    velocityContext.put("SERVERPROTOCOL",serverProtocol);
-    velocityContext.put("SERVERNAME",serverName);
-    velocityContext.put("SERVERPORT",serverPort);
-    velocityContext.put("SERVERUSERNAME",serverUserName);
-    velocityContext.put("SERVERPASSWORD",serverPassword);
-    velocityContext.put("SERVERHTTPCGIPATH",serverHTTPCgiPath);
-    velocityContext.put("SERVERHTTPNTLMDOMAIN",serverHTTPNTLMDomain);
-    velocityContext.put("SERVERHTTPNTLMUSERNAME",serverHTTPNTLMUserName);
-    velocityContext.put("SERVERHTTPNTLMPASSWORD",serverHTTPNTLMPassword);
-    if(serverHTTPSKeystore != null)
-      velocityContext.put("SERVERHTTPSKEYSTORE",serverHTTPSKeystore);
-    if(serverCertificatesMap != null)
-      velocityContext.put("SERVERCERTIFICATESMAP", serverCertificatesMap);
-    if(message != null)
-      velocityContext.put("MESSAGE", message);
-  }
-
-  /** Fill in Cache tab */
-  private void fillInCacheTab(Map<String, Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    String cacheLifetime = parameters.getParameter(LiveLinkParameters.cacheLifetime);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    String cacheLRUsize = parameters.getParameter(LiveLinkParameters.cacheLRUSize);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";
-
-    velocityContext.put("CACHELIFETIME",cacheLifetime);
-    velocityContext.put("CACHELRUSIZE",cacheLRUsize);
-  }  
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    // Server parameters
-    String serverProtocol = variableContext.getParameter("serverprotocol");
-    if (serverProtocol != null)
-      parameters.setParameter(LiveLinkParameters.serverProtocol,serverProtocol);
-    String serverName = variableContext.getParameter("servername");
-    if (serverName != null)
-      parameters.setParameter(LiveLinkParameters.serverName,serverName);
-    String serverPort = variableContext.getParameter("serverport");
-    if (serverPort != null)
-      parameters.setParameter(LiveLinkParameters.serverPort,serverPort);
-    String serverUserName = variableContext.getParameter("serverusername");
-    if (serverUserName != null)
-      parameters.setParameter(LiveLinkParameters.serverUsername,serverUserName);
-    String serverPassword = variableContext.getParameter("serverpassword");
-    if (serverPassword != null)
-      parameters.setObfuscatedParameter(LiveLinkParameters.serverPassword,variableContext.mapKeyToPassword(serverPassword));
-    String serverHTTPCgiPath = variableContext.getParameter("serverhttpcgipath");
-    if (serverHTTPCgiPath != null)
-      parameters.setParameter(LiveLinkParameters.serverHTTPCgiPath,serverHTTPCgiPath);
-    String serverHTTPNTLMDomain = variableContext.getParameter("serverhttpntlmdomain");
-    if (serverHTTPNTLMDomain != null)
-      parameters.setParameter(LiveLinkParameters.serverHTTPNTLMDomain,serverHTTPNTLMDomain);
-    String serverHTTPNTLMUserName = variableContext.getParameter("serverhttpntlmusername");
-    if (serverHTTPNTLMUserName != null)
-      parameters.setParameter(LiveLinkParameters.serverHTTPNTLMUsername,serverHTTPNTLMUserName);
-    String serverHTTPNTLMPassword = variableContext.getParameter("serverhttpntlmpassword");
-    if (serverHTTPNTLMPassword != null)
-      parameters.setObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword,variableContext.mapKeyToPassword(serverHTTPNTLMPassword));
-    
-    String serverHTTPSKeystoreValue = variableContext.getParameter("serverhttpskeystoredata");
-    final String serverConfigOp = variableContext.getParameter("serverconfigop");
-    if (serverConfigOp != null)
-    {
-      if (serverConfigOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("serverkeystorealias");
-        final IKeystoreManager mgr;
-        if (serverHTTPSKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",serverHTTPSKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        serverHTTPSKeystoreValue = mgr.getString();
-      }
-      else if (serverConfigOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("servercertificate");
-        final IKeystoreManager mgr;
-        if (serverHTTPSKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",serverHTTPSKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Eat this exception
-          }
-        }
-
-        if (certError != null)
-        {
-          return "Illegal certificate: "+certError;
-        }
-        
-        serverHTTPSKeystoreValue = mgr.getString();
-      }
-    }
-    parameters.setParameter(LiveLinkParameters.serverHTTPSKeystore, serverHTTPSKeystoreValue);
-
-    // Cache parameters
-    String cacheLifetime = variableContext.getParameter("cachelifetime");
-    if (cacheLifetime != null)
-      parameters.setParameter(LiveLinkParameters.cacheLifetime,cacheLifetime);
-    String cacheLRUsize = variableContext.getParameter("cachelrusize");
-    if (cacheLRUsize != null)
-      parameters.setParameter(LiveLinkParameters.cacheLRUSize,cacheLRUsize);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<>();
-    Map<String,String> configMap = new HashMap<>();
-
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        configMap.put(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param),"********");
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore") ||
-        param.length() > "truststore".length() && param.substring(param.length()-"truststore".length()).equalsIgnoreCase("truststore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        configMap.put(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param),"=&lt;"+Integer.toString(kmanager.getContents().length)+Messages.getBodyString(locale,"LivelinkConnector.certificates")+"&gt;");
-      }
-      else
-      {
-        configMap.put(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param), org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value));
-      }
-    }
-
-    paramMap.put("CONFIGMAP",configMap);
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIGURATION_HTML, paramMap);    
-  }
-
-  /** Interpret runtimeexception to search for livelink API errors.  Throws an appropriately reinterpreted exception, or
-  * just returns if the exception indicates that a short-cycle retry attempt should be made.  (In that case, the appropriate
-  * wait has been already performed).
-  *@param e is the RuntimeException caught
-  */
-  protected int handleLivelinkRuntimeException(RuntimeException e, int sanityRetryCount)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (
-      e instanceof com.opentext.api.LLHTTPAccessDeniedException ||
-      e instanceof com.opentext.api.LLHTTPClientException ||
-      e instanceof com.opentext.api.LLHTTPServerException ||
-      e instanceof com.opentext.api.LLIndexOutOfBoundsException ||
-      e instanceof com.opentext.api.LLNoFieldSpecifiedException ||
-      e instanceof com.opentext.api.LLNoValueSpecifiedException ||
-      e instanceof com.opentext.api.LLSecurityProviderException ||
-      e instanceof com.opentext.api.LLUnknownFieldException
-    )
-    {
-      String details = llServer.getErrors();
-      throw new ManifoldCFException("Livelink API error: "+e.getMessage()+((details==null)?"":"; "+details),e,ManifoldCFException.REPOSITORY_CONNECTION_ERROR);
-    }
-    else if (
-      e instanceof com.opentext.api.LLBadServerCertificateException ||
-      e instanceof com.opentext.api.LLHTTPCGINotFoundException ||
-      e instanceof com.opentext.api.LLCouldNotConnectHTTPException ||
-      e instanceof com.opentext.api.LLHTTPForbiddenException ||
-      e instanceof com.opentext.api.LLHTTPProxyAuthRequiredException ||
-      e instanceof com.opentext.api.LLHTTPRedirectionException ||
-      e instanceof com.opentext.api.LLUnsupportedAuthMethodException ||
-      e instanceof com.opentext.api.LLWebAuthInitException
-    )
-    {
-      String details = llServer.getErrors();
-      throw new ManifoldCFException("Livelink API error: "+e.getMessage()+((details==null)?"":"; "+details),e);
-    }
-    else if (e instanceof com.opentext.api.LLSSLNotAvailableException)
-    {
-      String details = llServer.getErrors();
-      throw new ManifoldCFException("Missing llssl.jar error: "+e.getMessage()+((details==null)?"":"; "+details),e);
-    }
-    else if (e instanceof com.opentext.api.LLIllegalOperationException)
-    {
-      // This usually means that LAPI has had a minor communication difficulty but hasn't reported it accurately.
-      // We *could* throw a ServiceInterruption, but OpenText recommends to just retry almost immediately.
-      String details = llServer.getErrors();
-      return assessRetry(sanityRetryCount,new ManifoldCFException("Livelink API illegal operation error: "+e.getMessage()+((details==null)?"":"; "+details),e));
-    }
-    else if (e instanceof com.opentext.api.LLIOException || (e instanceof RuntimeException && e.getClass().getName().startsWith("com.opentext.api.")))
-    {
-      // Catching obfuscated and unspecified opentext runtime exceptions now too - these come from llssl.jar.  We
-      // have to presume these are SSL connection errors; nothing else to go by unfortunately.  UGH.
-
-      // LAPI is returning errors that are not terribly explicit, and I don't have control over their wording, so check that server can be resolved by DNS,
-      // so that a better error message can be returned.
-      try
-      {
-        InetAddress.getByName(serverName);
-      }
-      catch (UnknownHostException e2)
-      {
-        throw new ManifoldCFException("Server name '"+serverName+"' cannot be resolved",e2);
-      }
-
-      throw new ServiceInterruption("Transient error: "+e.getMessage(),e,System.currentTimeMillis()+5*60000L,System.currentTimeMillis()+12*60*60000L,-1,true);
-    }
-    else
-      throw e;
-  }
-
-  /** Do a retry, or throw an exception if the retry count has been exhausted
-  */
-  protected static int assessRetry(int sanityRetryCount, ManifoldCFException e)
-    throws ManifoldCFException
-  {
-    if (sanityRetryCount == 0)
-    {
-      throw e;
-    }
-
-    sanityRetryCount--;
-
-    try
-    {
-      ManifoldCF.sleep(1000L);
-    }
-    catch (InterruptedException e2)
-    {
-      throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-    }
-    // Exit the method
-    return sanityRetryCount;
-
-  }
-
-  protected static StringSet emptyStringSet = new StringSet();
-  
-  /** This is the cache object descriptor for cached access tokens from
-  * this connector.
-  */
-  protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    /** The user name associated with the access tokens */
-    protected final String userName;
-    
-    // The server connection parameters
-    protected final String serverProtocol;
-    protected final String serverName;
-    protected final int serverPort;
-    protected final String serverUsername;
-    protected final String serverPassword;
-    protected final String serverHTTPCgi;
-    protected final String serverHTTPNTLMDomain;
-    protected final String serverHTTPNTLMUsername;
-    protected final String serverHTTPNTLMPassword;
-    protected final String serverHTTPSKeystore;
-
-    protected long responseLifetime;
-    
-    /** The expiration time */
-    protected long expirationTime = -1;
-    
-    /** Constructor. */
-    public AuthorizationResponseDescription(String userName,
-      String serverProtocol,
-      String serverName, int serverPort,
-      String serverUsername, String serverPassword,
-      String serverHTTPCgi, String serverHTTPNTLMDomain, String serverHTTPNTLMUsername, String serverHTTPNTLMPassword,
-      IKeystoreManager serverHTTPSKeystore,
-      long responseLifetime, int LRUsize)
-      throws ManifoldCFException
-    {
-      super("LiveLinkAuthority",LRUsize);
-      this.userName = userName;
-      
-      this.serverProtocol = serverProtocol;
-      this.serverName = serverName;
-      this.serverPort = serverPort;
-      this.serverUsername = serverUsername;
-      this.serverPassword = serverPassword;
-      this.serverHTTPCgi = (serverHTTPCgi==null)?"":serverHTTPCgi;
-      this.serverHTTPNTLMDomain = (serverHTTPNTLMDomain==null)?"":serverHTTPNTLMDomain;
-      this.serverHTTPNTLMUsername = (serverHTTPNTLMUsername==null)?"":serverHTTPNTLMUsername;
-      this.serverHTTPNTLMPassword = (serverHTTPNTLMPassword==null)?"":serverHTTPNTLMPassword;
-      if (serverHTTPSKeystore != null)
-        this.serverHTTPSKeystore = serverHTTPSKeystore.getString();
-      else
-        this.serverHTTPSKeystore = null;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /** Return the invalidation keys for this object. */
-    public StringSet getObjectKeys()
-    {
-      return emptyStringSet;
-    }
-
-    /** Get the critical section name, used for synchronizing the creation of the object */
-    public String getCriticalSectionName()
-    {
-      return getClass().getName() + "-" + userName + "-" + serverProtocol + "-" + serverName +
-        "-" + Integer.toString(serverPort) + "-" + serverUsername + "-" + serverPassword +
-        "-" + serverHTTPCgi + "-" + serverHTTPNTLMDomain + "-" + serverHTTPNTLMUsername +
-        "-" + serverHTTPNTLMPassword + "-" + ((serverHTTPSKeystore==null)?"":serverHTTPSKeystore);
-    }
-
-    /** Return the object expiration interval */
-    public long getObjectExpirationTime(long currentTime)
-    {
-      if (expirationTime == -1)
-        expirationTime = currentTime + responseLifetime;
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      return userName.hashCode() +
-        serverProtocol.hashCode() + serverName.hashCode() + new Integer(serverPort).hashCode() +
-        serverUsername.hashCode() + serverPassword.hashCode() +
-        serverHTTPCgi.hashCode() + serverHTTPNTLMDomain.hashCode() + serverHTTPNTLMUsername.hashCode() +
-        serverHTTPNTLMPassword.hashCode() + ((serverHTTPSKeystore==null)?0:serverHTTPSKeystore.hashCode());
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorizationResponseDescription))
-        return false;
-      AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-      return ard.userName.equals(userName) &&
-        ard.serverProtocol.equals(serverProtocol) && ard.serverName.equals(serverName) && ard.serverPort == serverPort &&
-        ard.serverUsername.equals(serverUsername) && ard.serverPassword.equals(serverPassword) &&
-        ard.serverHTTPCgi.equals(serverHTTPCgi) && ard.serverHTTPNTLMDomain.equals(serverHTTPNTLMDomain) &&
-        ard.serverHTTPNTLMUsername.equals(serverHTTPNTLMUsername) && ard.serverHTTPNTLMPassword.equals(serverHTTPNTLMPassword) &&
-        ((ard.serverHTTPSKeystore != null && serverHTTPSKeystore != null && ard.serverHTTPSKeystore.equals(serverHTTPSKeystore)) ||
-          ((ard.serverHTTPSKeystore == null || serverHTTPSKeystore == null) && ard.serverHTTPSKeystore == serverHTTPSKeystore));
-    }
-    
-  }
-
-}
-
-
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/livelink/Messages.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/livelink/Messages.java
deleted file mode 100644
index f5408c2..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/livelink/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.livelink;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.livelink.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.livelink";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/GetConnectionInfo.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/GetConnectionInfo.java
deleted file mode 100644
index 5873636..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/GetConnectionInfo.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/* $Id: GetConnectionInfo.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.livelink;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.livelink.*;
-
-/** Get a livelink connection's information in printed form.
-*/
-public class GetConnectionInfo
-{
-  public static final String _rcsid = "@(#)$Id: GetConnectionInfo.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private GetConnectionInfo()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: GetConnectionInfo <connection_name>");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, in UTF-8 encoding, and will contain the following columns:");
-      System.err.println("    livelink_server");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-        throw new ManifoldCFException("Connection "+connectionName+" does not exist");
-
-      if (connection.getClassName() == null || !connection.getClassName().equals("org.apache.manifoldcf.crawler.connectors.livelink.LivelinkConnector"))
-        throw new ManifoldCFException("Command can only be used on working Livelink connections.");
-
-      ConfigParams cfg = connection.getConfigParams();
-
-      UTF8Stdout.println(commaEscape(cfg.getParameter(LiveLinkParameters.serverName)));
-
-      System.err.println("Connection info done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-}
-
-
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java
deleted file mode 100644
index a819cb2..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java
+++ /dev/null
@@ -1,6604 +0,0 @@
-/* $Id: LivelinkConnector.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.livelink;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.common.XThreadInputStream;
-import org.apache.manifoldcf.connectorcommon.common.XThreadOutputStream;
-import org.apache.manifoldcf.connectorcommon.common.InterruptibleSocketFactory;
-import org.apache.manifoldcf.core.common.DateParser;
-
-import org.apache.manifoldcf.livelink.*;
-
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import java.util.concurrent.TimeUnit;
-
-import com.opentext.api.*;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.NameValuePair;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpHost;
-import org.apache.http.Header;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-
-
-/** This is the Livelink implementation of the IRepositoryConnectr interface.
-* The original Volant code forced there to be one livelink session per JVM, with
-* lots of buggy synchronization present to try to enforce this.  This implementation
-* is multi-session.  However, since it is possible that the Volant restriction was
-* indeed needed, I have attempted to structure things to allow me to turn on
-* single-session if needed.
-*
-* For livelink, the document identifiers are the object identifiers.
-*
-*/
-public class LivelinkConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: LivelinkConnector.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  //Forward to the javascript to check the configuration parameters.
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-
-  //Forward to the HTML template to edit the configuration parameters.
-  private static final String EDIT_SPECIFICATION_PATHS_HTML = "editSpecification_Paths.html";
-  private static final String EDIT_SPECIFICATION_FILTERS_HTML = "editSpecification_Filters.html";
-  private static final String EDIT_SPECIFICATION_SECURITY_HTML = "editSpecification_Security.html";
-  private static final String EDIT_SPECIFICATION_METADATA_HTML = "editSpecification_Metadata.html";
-
-  private static final String EDIT_CONFIGURATION_SERVER_HTML = "editConfiguration_Server.html";
-  private static final String EDIT_CONFIGURATION_ACCESS_HTML = "editConfiguration_Access.html";
-  private static final String EDIT_CONFIGURATION_VIEW_HTML = "editConfiguration_View.html";
-
-  //Forward to the HTML template to view the configuration parameters.
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-
-  //Tab name parameter for managing the view of the Web UI.
-  private static final String TAB_NAME_PARAM = "TabName";
-
-  // Activities we will report on
-  private final static String ACTIVITY_SEED = "find documents";
-  private final static String ACTIVITY_FETCH = "fetch document";
-
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;
-
-  // A couple of very important points.
-  // First, the canonical document identifier has the following form:
-  // <D|F>[<volume_id>:]<object_id>
-  // Second, the only LEGAL objects for a document identifier to describe
-  // are folders, documents, and volume objects.  Project objects are NOT
-  // allowed; they must be mapped to the appropriate volume object before
-  // being returned to the crawler.
-
-  // Metadata names for general metadata fields
-  protected final static String GENERAL_NAME_FIELD = "general_name";
-  protected final static String GENERAL_DESCRIPTION_FIELD = "general_description";
-  protected final static String GENERAL_CREATIONDATE_FIELD = "general_creationdate";
-  protected final static String GENERAL_MODIFYDATE_FIELD = "general_modifydate";
-  protected final static String GENERAL_OWNER = "general_owner";
-  protected final static String GENERAL_CREATOR = "general_creator";
-  protected final static String GENERAL_MODIFIER = "general_modifier";
-  protected final static String GENERAL_PARENTID = "general_parentid";
-  
-  // Signal that we have set up connection parameters properly
-  private boolean hasSessionParameters = false;
-  // Signal that we have set up a connection properly
-  private boolean hasConnected = false;
-  // Session expiration time
-  private long expirationTime = -1L;
-  // Idle session expiration interval
-  private final static long expirationInterval = 300000L;
-
-  // Data required for maintaining livelink connection
-  private LAPI_DOCUMENTS LLDocs = null;
-  private LAPI_ATTRIBUTES LLAttributes = null;
-  private LAPI_USERS LLUsers = null;
-  
-  private LLSERVER llServer = null;
-  private int LLENTWK_VOL;
-  private int LLENTWK_ID;
-  private int LLCATWK_VOL;
-  private int LLCATWK_ID;
-
-  // Parameter values we need
-  private String serverProtocol = null;
-  private String serverName = null;
-  private int serverPort = -1;
-  private String serverUsername = null;
-  private String serverPassword = null;
-  private String serverHTTPCgi = null;
-  private String serverHTTPNTLMDomain = null;
-  private String serverHTTPNTLMUsername = null;
-  private String serverHTTPNTLMPassword = null;
-  private IKeystoreManager serverHTTPSKeystore = null;
-
-  private String ingestProtocol = null;
-  private String ingestPort = null;
-  private String ingestCgiPath = null;
-
-  private String viewProtocol = null;
-  private String viewServerName = null;
-  private String viewPort = null;
-  private String viewCgiPath = null;
-  private String viewAction = null;
-
-  private String ingestNtlmDomain = null;
-  private String ingestNtlmUsername = null;
-  private String ingestNtlmPassword = null;
-
-  // SSL support for ingestion
-  private IKeystoreManager ingestKeystoreManager = null;
-
-  // Connection management
-  private HttpClientConnectionManager connectionManager = null;
-  private HttpClient httpClient = null;
-  
-  // Base path for viewing
-  private String viewBasePath = null;
-
-  // Ingestion port number
-  private int ingestPortNumber = -1;
-
-  // Activities list
-  private static final String[] activitiesList = new String[]{ACTIVITY_SEED,ACTIVITY_FETCH};
-
-  // Retry count.  This is so we can try to install some measure of sanity into situations where LAPI gets confused communicating to the server.
-  // So, for some kinds of errors, we just retry for a while hoping it will go away.
-  private static final int FAILURE_RETRY_COUNT = 10;
-
-  // Current host name
-  private static String currentHost = null;
-  private static java.net.InetAddress currentAddr = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      currentAddr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = currentAddr.getHostName();
-    }
-    catch (UnknownHostException e)
-    {
-    }
-  }
-
-
-  /** Constructor.
-  */
-  public LivelinkConnector()
-  {
-  }
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    // Livelink is a chained hierarchy model
-    return MODEL_CHAINED_ADD_CHANGE;
-  }
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    // This is required by getBins()
-    serverName = params.getParameter(LiveLinkParameters.serverName);
-  }
-
-  protected class GetSessionThread extends Thread
-  {
-    protected Throwable exception = null;
-
-    public GetSessionThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Create the session
-        llServer = new LLSERVER(!serverProtocol.equals("internal"),serverProtocol.equals("https"),
-          serverName,serverPort,serverUsername,serverPassword,
-          serverHTTPCgi,serverHTTPNTLMDomain,serverHTTPNTLMUsername,serverHTTPNTLMPassword,
-          serverHTTPSKeystore);
-
-        LLDocs = new LAPI_DOCUMENTS(llServer.getLLSession());
-        LLAttributes = new LAPI_ATTRIBUTES(llServer.getLLSession());
-        LLUsers = new LAPI_USERS(llServer.getLLSession());
-        
-        if (Logging.connectors.isDebugEnabled())
-        {
-          String passwordExists = (serverPassword!=null&&serverPassword.length()>0)?"password exists":"";
-          Logging.connectors.debug("Livelink: Livelink Session: Server='"+serverName+"'; port='"+serverPort+"'; user name='"+serverUsername+"'; "+passwordExists);
-        }
-        LLValue entinfo = new LLValue().setAssoc();
-
-        int status;
-        status = LLDocs.AccessEnterpriseWS(entinfo);
-        if (status == 0)
-        {
-          LLENTWK_ID = entinfo.toInteger("ID");
-          LLENTWK_VOL = entinfo.toInteger("VolumeID");
-        }
-        else
-          throw new ManifoldCFException("Error accessing enterprise workspace: "+status);
-
-        entinfo = new LLValue().setAssoc();
-        status = LLDocs.AccessCategoryWS(entinfo);
-        if (status == 0)
-        {
-          LLCATWK_ID = entinfo.toInteger("ID");
-          LLCATWK_VOL = entinfo.toInteger("VolumeID");
-        }
-        else
-          throw new ManifoldCFException("Error accessing category workspace: "+status);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-    
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    // This should return server name
-    return new String[]{serverName};
-  }
-
-  protected HttpHost getHost()
-  {
-    return new HttpHost(llServer.getHost(),ingestPortNumber,ingestProtocol);
-  }
-
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (hasSessionParameters == false)
-    {
-      // Do the initial setup part (what used to be part of connect() itself)
-
-      // Get the parameters
-      ingestProtocol = params.getParameter(LiveLinkParameters.ingestProtocol);
-      ingestPort = params.getParameter(LiveLinkParameters.ingestPort);
-      ingestCgiPath = params.getParameter(LiveLinkParameters.ingestCgiPath);
-
-      viewProtocol = params.getParameter(LiveLinkParameters.viewProtocol);
-      viewServerName = params.getParameter(LiveLinkParameters.viewServerName);
-      viewPort = params.getParameter(LiveLinkParameters.viewPort);
-      viewCgiPath = params.getParameter(LiveLinkParameters.viewCgiPath);
-      viewAction = params.getParameter(LiveLinkParameters.viewAction);
-
-      ingestNtlmDomain = params.getParameter(LiveLinkParameters.ingestNtlmDomain);
-      ingestNtlmUsername = params.getParameter(LiveLinkParameters.ingestNtlmUsername);
-      ingestNtlmPassword = params.getObfuscatedParameter(LiveLinkParameters.ingestNtlmPassword);
-
-      serverProtocol = params.getParameter(LiveLinkParameters.serverProtocol);
-      String serverPortString = params.getParameter(LiveLinkParameters.serverPort);
-      serverUsername = params.getParameter(LiveLinkParameters.serverUsername);
-      serverPassword = params.getObfuscatedParameter(LiveLinkParameters.serverPassword);
-      serverHTTPCgi = params.getParameter(LiveLinkParameters.serverHTTPCgiPath);
-      serverHTTPNTLMDomain = params.getParameter(LiveLinkParameters.serverHTTPNTLMDomain);
-      serverHTTPNTLMUsername = params.getParameter(LiveLinkParameters.serverHTTPNTLMUsername);
-      serverHTTPNTLMPassword = params.getObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword);
-
-      if (ingestProtocol == null || ingestProtocol.length() == 0)
-        ingestProtocol = null;
-      if (viewProtocol == null || viewProtocol.length() == 0)
-      {
-        if (ingestProtocol == null)
-          viewProtocol = "http";
-        else
-          viewProtocol = ingestProtocol;
-      }
-
-      if (ingestPort == null || ingestPort.length() == 0)
-      {
-        if (ingestProtocol != null)
-        {
-          if (!ingestProtocol.equals("https"))
-            ingestPort = "80";
-          else
-            ingestPort = "443";
-        }
-        else
-          ingestPort = null;
-      }
-
-      if (viewPort == null || viewPort.length() == 0)
-      {
-        if (ingestProtocol == null || !viewProtocol.equals(ingestProtocol))
-        {
-          if (!viewProtocol.equals("https"))
-            viewPort = "80";
-          else
-            viewPort = "443";
-        }
-        else
-          viewPort = ingestPort;
-      }
-
-      if (ingestPort != null)
-      {
-        try
-        {
-          ingestPortNumber = Integer.parseInt(ingestPort);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad ingest port: "+e.getMessage(),e);
-        }
-      }
-
-      String viewPortString;
-      try
-      {
-        int portNumber = Integer.parseInt(viewPort);
-        viewPortString = ":" + Integer.toString(portNumber);
-        if (!viewProtocol.equals("https"))
-        {
-          if (portNumber == 80)
-            viewPortString = "";
-        }
-        else
-        {
-          if (portNumber == 443)
-            viewPortString = "";
-        }
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Bad view port: "+e.getMessage(),e);
-      }
-
-      if (viewCgiPath == null || viewCgiPath.length() == 0)
-        viewCgiPath = ingestCgiPath;
-
-      if (ingestNtlmDomain != null && ingestNtlmDomain.length() == 0)
-        ingestNtlmDomain = null;
-      if (ingestNtlmDomain == null)
-      {
-        ingestNtlmUsername = null;
-        ingestNtlmPassword = null;
-      }
-      else
-      {
-        if (ingestNtlmUsername == null || ingestNtlmUsername.length() == 0)
-        {
-          ingestNtlmUsername = serverUsername;
-          if (ingestNtlmPassword == null || ingestNtlmPassword.length() == 0)
-            ingestNtlmPassword = serverPassword;
-        }
-        else
-        {
-          if (ingestNtlmPassword == null)
-            ingestNtlmPassword = "";
-        }
-      }
-
-      // Set up ingest ssl if indicated
-      String ingestKeystoreData = params.getParameter(LiveLinkParameters.ingestKeystore);
-      if (ingestKeystoreData != null)
-        ingestKeystoreManager = KeystoreManagerFactory.make("",ingestKeystoreData);
-
-
-      // Server parameter processing
-
-      if (serverProtocol == null || serverProtocol.length() == 0)
-        serverProtocol = "internal";
-      
-      if (serverPortString == null)
-        serverPort = 2099;
-      else
-        serverPort = new Integer(serverPortString).intValue();
-      
-      if (serverHTTPNTLMDomain != null && serverHTTPNTLMDomain.length() == 0)
-        serverHTTPNTLMDomain = null;
-      if (serverHTTPNTLMUsername == null || serverHTTPNTLMUsername.length() == 0)
-      {
-        serverHTTPNTLMUsername = null;
-        serverHTTPNTLMPassword = null;
-      }
-      
-      // Set up server ssl if indicated
-      String serverHTTPSKeystoreData = params.getParameter(LiveLinkParameters.serverHTTPSKeystore);
-      if (serverHTTPSKeystoreData != null)
-        serverHTTPSKeystore = KeystoreManagerFactory.make("",serverHTTPSKeystoreData);
-
-      // View parameters
-      if (viewServerName == null || viewServerName.length() == 0)
-        viewServerName = serverName;
-
-      viewBasePath = viewProtocol+"://"+viewServerName+viewPortString+viewCgiPath;
-
-      hasSessionParameters = true;
-    }
-  }
-  
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSessionParameters();
-    if (hasConnected == false)
-    {
-      int socketTimeout = 900000;
-      int connectionTimeout = 300000;
-
-      // Set up ingest ssl if indicated
-      SSLConnectionSocketFactory myFactory = null;
-      if (ingestKeystoreManager != null)
-      {
-        myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(ingestKeystoreManager.getSecureSocketFactory(), connectionTimeout),
-          NoopHostnameVerifier.INSTANCE);
-      }
-      else
-      {
-        myFactory = SSLConnectionSocketFactory.getSocketFactory();
-      }
-
-      // Set up connection manager
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      connectionManager = poolingConnectionManager;
-      
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      // Set up authentication to use
-      if (ingestNtlmDomain != null)
-      {
-        credentialsProvider.setCredentials(AuthScope.ANY,
-          new NTCredentials(ingestNtlmUsername,ingestNtlmPassword,currentHost,ingestNtlmDomain));
-      }
-
-      HttpClientBuilder builder = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(true)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout)
-          .build())
-        .setDefaultCredentialsProvider(credentialsProvider)
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new LaxRedirectStrategy());
-
-      httpClient = builder.build();
-
-      // System.out.println("Connection server object = "+llServer.toString());
-
-      // Establish the actual connection
-      int sanityRetryCount = FAILURE_RETRY_COUNT;
-      while (true)
-      {
-        GetSessionThread t = new GetSessionThread();
-        try
-        {
-          t.start();
-	  t.finishUp();
-          hasConnected = true;
-          break;
-        }
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (RuntimeException e2)
-        {
-          sanityRetryCount = handleLivelinkRuntimeException(e2,sanityRetryCount,true);
-        }
-      }
-    }
-    expirationTime = System.currentTimeMillis() + expirationInterval;
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-
-  protected static int executeMethodViaThread(HttpClient client, HttpRequestBase executeMethod)
-    throws InterruptedException, HttpException, IOException
-  {
-    ExecuteMethodThread t = new ExecuteMethodThread(client,executeMethod);
-    t.start();
-    try
-    {
-      return t.getResponseCode();
-    }
-    catch (InterruptedException e)
-    {
-      t.interrupt();
-      throw e;
-    }
-    finally
-    {
-      t.abort();
-      t.finishUp();
-    }
-  }
-
-  /** Check status of connection.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Destroy saved session setup and repeat it
-      hasConnected = false;
-      getSession();
-
-      // Now, set up trial of ingestion connection
-      if (ingestProtocol != null)
-      {
-        String contextMsg = "for document access";
-        String ingestHttpAddress = ingestCgiPath;
-
-        HttpClient client = getInitializedClient(contextMsg);
-        HttpGet method = new HttpGet(getHost().toURI() + ingestHttpAddress);
-        method.setHeader(new BasicHeader("Accept","*/*"));
-        try
-        {
-          int statusCode = executeMethodViaThread(client,method);
-          switch (statusCode)
-          {
-          case 502:
-            return "Fetch test had transient 502 error response";
-
-          case HttpStatus.SC_UNAUTHORIZED:
-            return "Fetch test returned UNAUTHORIZED (401) response; check the security credentials and configuration";
-
-          case HttpStatus.SC_OK:
-            return super.check();
-
-          default:
-            return "Fetch test returned an unexpected response code of "+Integer.toString(statusCode);
-          }
-        }
-        catch (InterruptedException e)
-        {
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (java.net.SocketTimeoutException e)
-        {
-          return "Fetch test timed out reading from the Livelink HTTP Server: "+e.getMessage();
-        }
-        catch (java.net.SocketException e)
-        {
-          return "Fetch test received a socket error reading from Livelink HTTP Server: "+e.getMessage();
-        }
-        catch (javax.net.ssl.SSLHandshakeException e)
-        {
-          return "Fetch test was unable to set up a SSL connection to Livelink HTTP Server: "+e.getMessage();
-        }
-        catch (ConnectTimeoutException e)
-        {
-          return "Fetch test connection timed out reading from Livelink HTTP Server: "+e.getMessage();
-        }
-        catch (InterruptedIOException e)
-        {
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (HttpException e)
-        {
-          return "Fetch test had an HTTP exception: "+e.getMessage();
-        }
-        catch (IOException e)
-        {
-          return "Fetch test had an IO failure: "+e.getMessage();
-        }
-      }
-      else
-        return super.check();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Transient error: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        throw e;
-      return "Error: "+e.getMessage();
-    }
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    if (!hasConnected)
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    if (currentTime >= expirationTime)
-    {
-      hasConnected = false;
-      expirationTime = -1L;
-
-      // Shutdown livelink connection
-      if (llServer != null)
-      {
-        llServer.disconnect();
-        llServer = null;
-      }
-      
-      // Shutdown pool
-      if (connectionManager != null)
-      {
-        connectionManager.shutdown();
-        connectionManager = null;
-      }
-    }
-  }
-  
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return hasConnected;
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    hasSessionParameters = false;
-    hasConnected = false;
-    expirationTime = -1L;
-    if (llServer != null)
-    {
-      llServer.disconnect();
-      llServer = null;
-    }
-    LLDocs = null;
-    LLAttributes = null;
-    ingestKeystoreManager = null;
-    ingestPortNumber = -1;
-
-    serverProtocol = null;
-    serverName = null;
-    serverPort = -1;
-    serverUsername = null;
-    serverPassword = null;
-    serverHTTPCgi = null;
-    serverHTTPNTLMDomain = null;
-    serverHTTPNTLMUsername = null;
-    serverHTTPNTLMPassword = null;
-    serverHTTPSKeystore = null;
-
-    ingestPort = null;
-    ingestProtocol = null;
-    ingestCgiPath = null;
-
-    viewPort = null;
-    viewServerName = null;
-    viewProtocol = null;
-    viewCgiPath = null;
-
-    viewBasePath = null;
-
-    ingestNtlmDomain = null;
-    ingestNtlmUsername = null;
-    ingestNtlmPassword = null;
-
-    if (connectionManager != null)
-    {
-      connectionManager.shutdown();
-      connectionManager = null;
-    }
-
-    super.disconnect();
-  }
-
-  /** List the activities we might report on.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** Convert a document identifier to a relative URI to read data from.  This is not the search URI; that's constructed
-  * by a different method.
-  *@param documentIdentifier is the document identifier.
-  *@return the relative document uri.
-  */
-  protected String convertToIngestURI(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    // The document identifier is the string form of the object ID for this connector.
-    if (!documentIdentifier.startsWith("D"))
-      return null;
-    int colonPosition = documentIdentifier.indexOf(":",1);
-    if (colonPosition == -1)
-      return ingestCgiPath+"?func=ll&objID="+documentIdentifier.substring(1)+"&objAction=download";
-    else
-      return ingestCgiPath+"?func=ll&objID="+documentIdentifier.substring(colonPosition+1)+"&objAction=download";
-  }
-
-  /** Convert a document identifier to a URI to view.  The URI is the URI that will be the unique key from
-  * the search index, and will be presented to the user as part of the search results.  It must therefore
-  * be a unique way of describing the document.
-  *@param documentIdentifier is the document identifier.
-  *@return the document uri.
-  */
-  protected String convertToViewURI(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    // The document identifier is the string form of the object ID for this connector.
-    if (!documentIdentifier.startsWith("D"))
-      return null;
-    String objectID = null;
-    int colonPosition = documentIdentifier.indexOf(":",1);
-    if (colonPosition == -1)
-      objectID = documentIdentifier.substring(1);
-    else
-      objectID = documentIdentifier.substring(colonPosition+1);
-    String viewURL = null;
-    switch(viewAction)
-    {
-      case "download":
-        viewURL =  viewBasePath+"?func=ll&objAction=download&objID=" + objectID;
-      break;
-      case "open":
-        viewURL = viewBasePath+"/open/" + objectID;
-      break;
-      case "overview":
-        viewURL = viewBasePath+"?func=ll&objAction=overview&objID=" + objectID;
-      break;
-      default:
-        viewURL = viewBasePath+"?func=ll&objAction=download&objID=" + objectID;
-    }
-    return viewURL;
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    if (command.equals("workspaces"))
-    {
-      try
-      {
-        String[] workspaces = getWorkspaceNames();
-        int i = 0;
-        while (i < workspaces.length)
-        {
-          String workspace = workspaces[i++];
-          ConfigurationNode node = new ConfigurationNode("workspace");
-          node.setValue(workspace);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("folders/"))
-    {
-      String path = command.substring("folders/".length());
-      
-      try
-      {
-        String[] folders = getChildFolderNames(path);
-        int i = 0;
-        while (i < folders.length)
-        {
-          String folder = folders[i++];
-          ConfigurationNode node = new ConfigurationNode("folder");
-          node.setValue(folder);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("categories/"))
-    {
-      String path = command.substring("categories/".length());
-
-      try
-      {
-        String[] categories = getChildCategoryNames(path);
-        int i = 0;
-        while (i < categories.length)
-        {
-          String category = categories[i++];
-          ConfigurationNode node = new ConfigurationNode("category");
-          node.setValue(category);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-
-    }
-    else if (command.startsWith("categoryattributes/"))
-    {
-      String path = command.substring("categoryattributes/".length());
-
-      try
-      {
-        String[] attributes = getCategoryAttributes(path);
-        int i = 0;
-        while (i < attributes.length)
-        {
-          String attribute = attributes[i++];
-          ConfigurationNode node = new ConfigurationNode("attribute");
-          node.setValue(attribute);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else
-      return super.requestInfo(output,command);
-    return true;
-  }
-  
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    LivelinkContext llc = new LivelinkContext();
-    
-    // First, grab the root LLValue
-    ObjectInformation rootValue = llc.getObjectInformation(LLENTWK_VOL,LLENTWK_ID);
-    if (!rootValue.exists())
-    {
-      // If we get here, it HAS to be a bad network/transient problem.
-      Logging.connectors.warn("Livelink: Could not look up root workspace object during seeding!  Retrying -");
-      throw new ServiceInterruption("Service interruption during seeding",new ManifoldCFException("Could not looking root workspace object during seeding"),System.currentTimeMillis()+60000L,
-        System.currentTimeMillis()+600000L,-1,true);
-    }
-
-    // Walk the specification for the "startpoint" types.  Amalgamate these into a list of strings.
-    // Presume that all roots are startpoint nodes
-    boolean doUserWorkspaces = false;
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode n = spec.getChild(i);
-      if (n.getType().equals("startpoint"))
-      {
-        // The id returned is simply the node path, which can't be messed up
-        long beginTime = System.currentTimeMillis();
-        String path = n.getAttributeValue("path");
-        VolumeAndId vaf = rootValue.getPathId(path);
-        if (vaf != null)
-        {
-          activities.recordActivity(new Long(beginTime),ACTIVITY_SEED,null,
-            path,"OK",null,null);
-
-          String newID = "F" + new Integer(vaf.getVolumeID()).toString()+":"+ new Integer(vaf.getPathId()).toString();
-          activities.addSeedDocument(newID);
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("Livelink: Seed = '"+newID+"'");
-        }
-        else
-        {
-          activities.recordActivity(new Long(beginTime),ACTIVITY_SEED,null,
-            path,"NOT FOUND",null,null);
-        }
-      }
-      else if (n.getType().equals("userworkspace"))
-      {
-        String value = n.getAttributeValue("value");
-        if (value != null && value.equals("true"))
-          doUserWorkspaces = true;
-        else if (value != null && value.equals("false"))
-          doUserWorkspaces = false;
-      }
-      
-      if (doUserWorkspaces)
-      {
-        // Do ListUsers and enumerate the values.
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          ListUsersThread t = new ListUsersThread();
-          try
-          {
-            t.start();
-	    LLValue childrenDocs;
-	    try
-	    {
-	      childrenDocs = t.finishUp();
-	    }
-	    catch (ManifoldCFException e)
-	    {
-	      sanityRetryCount = assessRetry(sanityRetryCount,e);
-	      continue;
-	    }
-
-            int size = 0;
-
-            if (childrenDocs.isRecord())
-              size = 1;
-            if (childrenDocs.isTable())
-              size = childrenDocs.size();
-
-            // Do the scan
-            for (int j = 0; j < size; j++)
-            {
-              int childID = childrenDocs.toInteger(j, "ID");
-              
-              // Skip admin user
-              if (childID == 1000 || childID == 1001)
-                continue;
-              
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Livelink: Found a user: ID="+Integer.toString(childID));
-
-              activities.addSeedDocument("F0:"+Integer.toString(childID));
-            }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-          }
-        }
-      }
-      
-    }
-    return "";
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    
-    // Initialize a "livelink context", to minimize the number of objects we have to fetch
-    LivelinkContext llc = new LivelinkContext();
-    // Initialize the table of catid's.
-    // Keeping this around will allow us to benefit from batching of documents.
-    MetadataDescription desc = new MetadataDescription(llc);
-    
-    // First, process the spec to get the string we tack on
-    SystemMetadataDescription sDesc = new SystemMetadataDescription(llc,spec);
-
-
-    // Read the forced acls.  A null return indicates that security is disabled!!!
-    // A zero-length return indicates that the native acls should be used.
-    // All of this is germane to how we ingest the document, so we need to note it in
-    // the version string completely.
-    String[] acls = sDesc.getAcls();
-    // Sort it, in case it is needed.
-    if (acls != null)
-      java.util.Arrays.sort(acls);
-
-    // Prepare the specified metadata
-    String metadataString = null;
-    String[] specifiedMetadataAttributes = null;
-    CategoryPathAccumulator catAccum = null;
-    if (!sDesc.includeAllMetadata())
-    {
-      StringBuilder sb = new StringBuilder();
-      specifiedMetadataAttributes = sDesc.getMetadataAttributes();
-      // Sort!
-      java.util.Arrays.sort(specifiedMetadataAttributes);
-      // Build the metadata string piece now
-      packList(sb,specifiedMetadataAttributes,'+');
-      metadataString = sb.toString();
-    }
-    else
-      catAccum = new CategoryPathAccumulator(llc);
-
-    // Calculate the part of the version string that comes from path name and mapping.
-    // This starts with = since ; is used by another optional component (the forced acls)
-    String pathNameAttributeVersion;
-    StringBuilder sb2 = new StringBuilder();
-    if (sDesc.getPathAttributeName() != null)
-      sb2.append("=").append(sDesc.getPathAttributeName()).append(":").append(sDesc.getPathSeparator()).append(":").append(sDesc.getMatchMapString());
-    pathNameAttributeVersion = sb2.toString();
-
-    // Since the identifier indicates it is a directory, then queue up all the current children which pass the filter.
-    String filterString = sDesc.getFilterString();
-
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      // Since each livelink access is time-consuming, be sure that we abort if the job has gone inactive
-      activities.checkJobStillActive();
-
-      // Read the document or folder metadata, which includes the ModifyDate
-      String docID = documentIdentifier;
-      
-      boolean isFolder = docID.startsWith("F");
-
-      int colonPos = docID.indexOf(":",1);
-
-      int objID;
-      int vol;
-
-      if (colonPos == -1)
-      {
-        objID = new Integer(docID.substring(1)).intValue();
-        vol = LLENTWK_VOL;
-      }
-      else
-      {
-        objID = new Integer(docID.substring(colonPos+1)).intValue();
-        vol = new Integer(docID.substring(1,colonPos)).intValue();
-      }
-
-      getSession();
-      ObjectInformation value = llc.getObjectInformation(vol,objID);
-      if (!value.exists())
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Object "+Integer.toString(vol)+":"+Integer.toString(objID)+" has no information - deleting");
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-        
-      // Make sure we have permission to see the object's contents
-      int permissions = value.getPermissions().intValue();
-      if ((permissions & LAPI_DOCUMENTS.PERM_SEECONTENTS) == 0)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Crawl user cannot see contents of object "+Integer.toString(vol)+":"+Integer.toString(objID)+" - deleting");
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-        
-        
-      Date dt = value.getModifyDate();
-      // The rights don't change when the object changes, so we have to include those too.
-      int[] rights = getObjectRights(vol,objID);
-      if (rights == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Could not get rights for object "+Integer.toString(vol)+":"+Integer.toString(objID)+" - deleting");
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-        
-      // We were able to get rights, so object still exists.
-          
-      // Changed folder versioning for MCF 2.0
-      if (isFolder)
-      {
-        // === Livelink folder ===
-        // I'm still not sure if Livelink folder modified dates are one-level or hierarchical.
-        // The code below assumes one-level only, so we always scan folders and there's no versioning
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Processing folder "+Integer.toString(vol)+":"+Integer.toString(objID));
-
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          ListObjectsThread t = new ListObjectsThread(vol,objID,filterString);
-          try
-          {
-            t.start();
-            LLValue childrenDocs;
-            try
-            {
-              childrenDocs = t.finishUp();
-            }
-            catch (ManifoldCFException e)
-            {
-              sanityRetryCount = assessRetry(sanityRetryCount,e);
-              continue;
-            }
-
-            int size = 0;
-            
-            if (childrenDocs.isRecord())
-              size = 1;
-            if (childrenDocs.isTable())
-              size = childrenDocs.size();
-
-            // System.out.println("Total child count = "+Integer.toString(size));
-            // Do the scan
-            for (int j = 0; j < size; j++)
-            {
-              int childID = childrenDocs.toInteger(j, "ID");
-
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Livelink: Found a child of folder "+Integer.toString(vol)+":"+Integer.toString(objID)+" : ID="+Integer.toString(childID));
-
-              int subtype = childrenDocs.toInteger(j, "SubType");
-              boolean childIsFolder = (subtype == LAPI_DOCUMENTS.FOLDERSUBTYPE || subtype == LAPI_DOCUMENTS.PROJECTSUBTYPE ||
-                subtype == LAPI_DOCUMENTS.COMPOUNDDOCUMENTSUBTYPE);
-
-              // If it's a folder, we just let it through for now
-              if (!childIsFolder && checkInclude(childrenDocs.toString(j,"Name") + "." + childrenDocs.toString(j,"FileType"), spec) == false)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Livelink: Child identifier "+Integer.toString(childID)+" was excluded by inclusion criteria");
-                continue;
-              }
-
-              if (childIsFolder)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Livelink: Child identifier "+Integer.toString(childID)+" is a folder, project, or compound document; adding a reference");
-                if (subtype == LAPI_DOCUMENTS.PROJECTSUBTYPE)
-                {
-                  // If we pick up a project object, we need to describe the volume object (which
-                  // will be the root of all documents beneath)
-                  activities.addDocumentReference("F"+new Integer(childID).toString()+":"+new Integer(-childID).toString());
-                }
-                else
-                  activities.addDocumentReference("F"+new Integer(vol).toString()+":"+new Integer(childID).toString());
-              }
-              else
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Livelink: Child identifier "+Integer.toString(childID)+" is a simple document; adding a reference");
-
-                activities.addDocumentReference("D"+new Integer(vol).toString()+":"+new Integer(childID).toString());
-              }
-
-            }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Done processing folder "+Integer.toString(vol)+":"+Integer.toString(objID));
-      }
-      else
-      {
-        // === Livelink document ===
-              
-        // The version string includes the following:
-        // 1) The modify date for the document
-        // 2) The rights for the document, ordered (which can change without changing the ModifyDate field)
-        // 3) The requested metadata fields (category and attribute, ordered) for the document
-        //
-        // The document identifiers are object id's.
-  
-        StringBuilder sb = new StringBuilder();
-
-        String[] categoryPaths;
-        if (sDesc.includeAllMetadata())
-        {
-          // Find all the metadata associated with this object, and then
-          // find the set of category pathnames that correspond to it.
-          int[] catIDs = getObjectCategoryIDs(vol,objID);
-          categoryPaths = catAccum.getCategoryPathsAttributeNames(catIDs);
-          // Sort!
-          java.util.Arrays.sort(categoryPaths);
-          // Build the metadata string piece now
-          packList(sb,categoryPaths,'+');
-        }
-        else
-        {
-          categoryPaths = specifiedMetadataAttributes;
-          sb.append(metadataString);
-        }
-              
-        String[] actualAcls;
-        String[] denyAcls;
-              
-        String denyAcl;
-        if (acls != null && acls.length == 0)
-        {
-          // No forced acls.  Read the actual acls from livelink, as a set of rights.
-          // We need also to add in support for the special rights objects.  These are:
-          // -1: RIGHT_WORLD
-          // -2: RIGHT_SYSTEM
-          // -3: RIGHT_OWNER
-          // -4: RIGHT_GROUP
-          //
-          // RIGHT_WORLD means guest access.
-          // RIGHT_SYSTEM is "Public Access".
-          // RIGHT_OWNER is access by the owner of the object.
-          // RIGHT_GROUP is access by a member of the base group containing the owner
-          //
-          // These objects are returned by the GetObjectRights() call made above, and NOT
-          // returned by LLUser.ListObjects().  We have to figure out how to map these to
-          // things that are
-          // the equivalent of acls.
-
-          actualAcls = lookupTokens(rights, value);
-          java.util.Arrays.sort(actualAcls);
-          // If security is on, no deny acl is needed for the local authority, since the repository does not support "deny".  But this was added
-          // to be really really really sure.
-          denyAcl = defaultAuthorityDenyToken;
-              
-        }
-        else if (acls != null && acls.length > 0)
-        {
-          // Forced acls
-          actualAcls = acls;
-          denyAcl = defaultAuthorityDenyToken;
-        }
-        else
-        {
-          // Security is OFF
-          actualAcls = acls;
-          denyAcl = null;
-        }
-
-        // Now encode the acls.  If null, we write a special value.
-        if (actualAcls == null)
-        {
-          sb.append('-');
-          denyAcls = null;
-        }
-        else
-        {
-          sb.append('+');
-          packList(sb,actualAcls,'+');
-          // This was added on 4/21/2008 to support forced acls working with the global default authority.
-          pack(sb,denyAcl,'+');
-          denyAcls = new String[]{denyAcl};
-        }
-
-        // The date does not need to be parseable
-        sb.append(new Long(dt.getTime()).toString());
-
-        // PathNameAttributeVersion comes completely from the spec, so we don't
-        // have to worry about it changing.  No need, therefore, to parse it during
-        // processDocuments.
-        sb.append("=").append(pathNameAttributeVersion);
-          
-        // Tack on ingestCgiPath, to insulate us against changes to the repository connection setup.  Added 9/7/07.
-        sb.append("_").append(viewBasePath);
-
-        String versionString = sb.toString();
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Successfully calculated version string for document "+Integer.toString(vol)+":"+Integer.toString(objID)+" : '"+versionString+"'");
-              
-        if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-          continue;
-        
-        // Index the document
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Processing document "+Integer.toString(vol)+":"+Integer.toString(objID));
-        if (!checkIngest(llc,objID,spec))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("Livelink: Decided not to ingest document "+Integer.toString(vol)+":"+Integer.toString(objID)+" - Did not match ingestion criteria");
-          activities.noDocument(documentIdentifier,versionString);
-          continue;
-        }
-
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Decided to ingest document "+Integer.toString(vol)+":"+Integer.toString(objID));
-
-        // Grab the access tokens for this file from the version string, inside ingest method.
-        ingestFromLiveLink(llc,documentIdentifier,versionString,actualAcls,denyAcls,categoryPaths,activities,desc,sDesc);
-          
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Done processing document "+Integer.toString(vol)+":"+Integer.toString(objID));
-      }
-    }
-  }
-
-  protected class ListObjectsThread extends Thread
-  {
-    protected final int vol;
-    protected final int objID;
-    protected final String filterString;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public ListObjectsThread(int vol, int objID, String filterString)
-    {
-      super();
-      setDaemon(true);
-      this.vol = vol;
-      this.objID = objID;
-      this.filterString = filterString;
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue childrenDocs = new LLValue();
-        int status = LLDocs.ListObjects(vol, objID, null, filterString, LAPI_DOCUMENTS.PERM_SEECONTENTS, childrenDocs);
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving contents of folder "+Integer.toString(vol)+":"+Integer.toString(objID)+" : Status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-        }
-        rval = childrenDocs;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // Intrinsically, Livelink doesn't batch well.  Multiple chunks have no advantage over one-at-a-time requests,
-    // since apparently the Livelink API does not support multiples.  HOWEVER - when metadata is considered,
-    // it becomes worthwhile, because we will be able to do what is needed to look up the correct CATID node
-    // only once per n requests!  So it's a tradeoff between the advantage gained by threading, and the
-    // savings gained by CATID lookup.
-    // Note that at Shell, the fact that the network hiccups a lot makes it better to choose a smaller value.
-    return 6;
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Server"));
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.DocumentAccess"));
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.DocumentView"));
-    
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_JS, null, true);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {    
-    Map<String, Object> velocityContext = new HashMap<>();
-    velocityContext.put(TAB_NAME_PARAM,tabName);
-
-    fillInServerTab(velocityContext, out, parameters);
-    fillInDocumentAccessTab(velocityContext, out, parameters);
-    fillInDocumentViewTab(velocityContext, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_SERVER_HTML, velocityContext);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_ACCESS_HTML, velocityContext);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_VIEW_HTML, velocityContext);
-  }
-
-  /** Fill in Server tab */
-  protected static void fillInServerTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    // LAPI parameters
-    String serverProtocol = parameters.getParameter(LiveLinkParameters.serverProtocol);
-    if (serverProtocol == null)
-      serverProtocol = "internal";
-    String serverName = parameters.getParameter(LiveLinkParameters.serverName);
-    if (serverName == null)
-      serverName = "localhost";
-    String serverPort = parameters.getParameter(LiveLinkParameters.serverPort);
-    if (serverPort == null)
-      serverPort = "2099";
-    String serverUserName = parameters.getParameter(LiveLinkParameters.serverUsername);
-    if(serverUserName == null)
-      serverUserName = "";
-    String serverPassword = parameters.getObfuscatedParameter(LiveLinkParameters.serverPassword);
-    if (serverPassword == null)
-      serverPassword = "";
-    else
-      serverPassword = out.mapPasswordToKey(serverPassword);
-    String serverHTTPCgiPath = parameters.getParameter(LiveLinkParameters.serverHTTPCgiPath);
-    if (serverHTTPCgiPath == null)
-      serverHTTPCgiPath = "/livelink/livelink.exe";
-    String serverHTTPNTLMDomain = parameters.getParameter(LiveLinkParameters.serverHTTPNTLMDomain);
-    if(serverHTTPNTLMDomain == null)
-      serverHTTPNTLMDomain = "";
-    String serverHTTPNTLMUserName = parameters.getParameter(LiveLinkParameters.serverHTTPNTLMUsername);
-    if(serverHTTPNTLMUserName == null)
-      serverHTTPNTLMUserName = "";
-    String serverHTTPNTLMPassword = parameters.getObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword);
-    if (serverHTTPNTLMPassword == null)
-      serverHTTPNTLMPassword = "";
-    else
-      serverHTTPNTLMPassword = out.mapPasswordToKey(serverHTTPNTLMPassword);
-    String serverHTTPSKeystore = parameters.getParameter(LiveLinkParameters.serverHTTPSKeystore);
-
-    IKeystoreManager localServerHTTPSKeystore;
-    Map<String,String> serverCertificatesMap = null;
-    String message = null;
-
-    try {
-      if (serverHTTPSKeystore == null)
-        localServerHTTPSKeystore = KeystoreManagerFactory.make("");
-      else
-        localServerHTTPSKeystore = KeystoreManagerFactory.make("",serverHTTPSKeystore);
-
-      // List the individual certificates in the store, with a delete button for each
-      String[] contents = localServerHTTPSKeystore.getContents();
-      if (contents.length > 0)
-      {
-        serverCertificatesMap = new HashMap<>();
-        int i = 0;
-        while (i < contents.length)
-        {
-          String alias = contents[i];
-          String description = localServerHTTPSKeystore.getDescription(alias);
-          if (description.length() > 128)
-            description = description.substring(0,125) + "...";
-          serverCertificatesMap.put(alias, description);
-          i++;
-        }
-      }
-    } catch (ManifoldCFException e) {
-      message = e.getMessage();
-      Logging.connectors.warn(e);
-    }
-
-    velocityContext.put("SERVERPROTOCOL",serverProtocol);
-    velocityContext.put("SERVERNAME",serverName);
-    velocityContext.put("SERVERPORT",serverPort);
-    velocityContext.put("SERVERUSERNAME",serverUserName);
-    velocityContext.put("SERVERPASSWORD",serverPassword);
-    velocityContext.put("SERVERHTTPCGIPATH",serverHTTPCgiPath);
-    velocityContext.put("SERVERHTTPNTLMDOMAIN",serverHTTPNTLMDomain);
-    velocityContext.put("SERVERHTTPNTLMUSERNAME",serverHTTPNTLMUserName);
-    velocityContext.put("SERVERHTTPNTLMPASSWORD",serverHTTPNTLMPassword);
-    if(serverHTTPSKeystore != null)
-      velocityContext.put("SERVERHTTPSKEYSTORE",serverHTTPSKeystore);
-    if(serverCertificatesMap != null)
-    velocityContext.put("SERVERCERTIFICATESMAP", serverCertificatesMap);
-    if(message != null)
-      velocityContext.put("MESSAGE", message);
-  }
-
-  /** Fill in Document Access tab */
-  protected static void fillInDocumentAccessTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    // Document access parameters
-    String ingestProtocol = parameters.getParameter(LiveLinkParameters.ingestProtocol);
-    if(ingestProtocol == null)
-      ingestProtocol = "";
-    String ingestPort = parameters.getParameter(LiveLinkParameters.ingestPort);
-    if(ingestPort == null)
-      ingestPort = "";
-    String ingestCgiPath = parameters.getParameter(LiveLinkParameters.ingestCgiPath);
-    if(ingestCgiPath == null)
-      ingestCgiPath = "";
-    String ingestNtlmUsername = parameters.getParameter(LiveLinkParameters.ingestNtlmUsername);
-    if(ingestNtlmUsername == null)
-      ingestNtlmUsername = "";
-    String ingestNtlmPassword = parameters.getObfuscatedParameter(LiveLinkParameters.ingestNtlmPassword);
-    if (ingestNtlmPassword == null)
-      ingestNtlmPassword = "";
-    else
-      ingestNtlmPassword = out.mapPasswordToKey(ingestNtlmPassword);
-    String ingestNtlmDomain = parameters.getParameter(LiveLinkParameters.ingestNtlmDomain);
-    if(ingestNtlmDomain == null)
-      ingestNtlmDomain = "";
-    String ingestKeystore = parameters.getParameter(LiveLinkParameters.ingestKeystore);
-
-    IKeystoreManager localIngestKeystore;
-    Map<String,String> ingestCertificatesMap = null;
-    String message = null;
-
-    try{
-      if (ingestKeystore == null)
-        localIngestKeystore = KeystoreManagerFactory.make("");
-      else
-        localIngestKeystore = KeystoreManagerFactory.make("",ingestKeystore);
-
-      String[] contents = localIngestKeystore.getContents();
-      if (contents.length > 0)
-      {
-        ingestCertificatesMap = new HashMap<>();
-        int i = 0;
-        while (i < contents.length)
-        {
-          String alias = contents[i];
-          String description = localIngestKeystore.getDescription(alias);
-          if (description.length() > 128)
-            description = description.substring(0,125) + "...";
-          ingestCertificatesMap.put(alias,description);
-          i++;
-        }
-      }
-
-    } catch (ManifoldCFException e) {
-      message = e.getMessage();
-      Logging.connectors.warn(e);
-    }
-
-    velocityContext.put("INGESTPROTOCOL",ingestProtocol);
-    velocityContext.put("INGESTPORT",ingestPort);
-    velocityContext.put("INGESTCGIPATH",ingestCgiPath);
-    velocityContext.put("INGESTNTLMUSERNAME",ingestNtlmUsername);
-    velocityContext.put("INGESTNTLMPASSWORD",ingestNtlmPassword);
-    velocityContext.put("INGESTNTLMDOMAIN",ingestNtlmDomain);
-    velocityContext.put("INGESTKEYSTORE",ingestKeystore);
-    if(ingestCertificatesMap != null)
-      velocityContext.put("INGESTCERTIFICATESMAP", ingestCertificatesMap);
-    if(message != null)
-      velocityContext.put("MESSAGE", message);
-  }
-
-  /** Fill in Document View tab */
-  protected static void fillInDocumentViewTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    // Document view parameters
-    String viewProtocol = parameters.getParameter(LiveLinkParameters.viewProtocol);
-    if (viewProtocol == null)
-      viewProtocol = "http";
-
-    String viewServerName = parameters.getParameter(LiveLinkParameters.viewServerName);
-    if(viewServerName == null)
-      viewServerName = "";
-    String viewPort = parameters.getParameter(LiveLinkParameters.viewPort);
-    if(viewPort == null)
-      viewPort = "";
-    String viewCgiPath = parameters.getParameter(LiveLinkParameters.viewCgiPath);
-    if (viewCgiPath == null)
-      viewCgiPath = "/livelink/livelink.exe";
-    String viewAction = parameters.getParameter(LiveLinkParameters.viewAction);
-    if (viewAction == null)
-      viewAction = "download";
-
-    velocityContext.put("VIEWPROTOCOL",viewProtocol);
-    velocityContext.put("VIEWSERVERNAME",viewServerName);
-    velocityContext.put("VIEWPORT",viewPort);
-    velocityContext.put("VIEWCGIPATH",viewCgiPath);
-    velocityContext.put("VIEWACTION",viewAction);
-  }  
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    // View parameters
-    String viewProtocol = variableContext.getParameter("viewprotocol");
-    if (viewProtocol != null)
-      parameters.setParameter(LiveLinkParameters.viewProtocol,viewProtocol);
-    String viewServerName = variableContext.getParameter("viewservername");
-    if (viewServerName != null)
-      parameters.setParameter(LiveLinkParameters.viewServerName,viewServerName);
-    String viewPort = variableContext.getParameter("viewport");
-    if (viewPort != null)
-      parameters.setParameter(LiveLinkParameters.viewPort,viewPort);
-    String viewCgiPath = variableContext.getParameter("viewcgipath");
-    if (viewCgiPath != null)
-      parameters.setParameter(LiveLinkParameters.viewCgiPath,viewCgiPath);
-    String viewAction = variableContext.getParameter("viewaction");
-    if (viewAction != null)
-      parameters.setParameter(LiveLinkParameters.viewAction,viewAction);
-    
-    // Server parameters
-    String serverProtocol = variableContext.getParameter("serverprotocol");
-    if (serverProtocol != null)
-      parameters.setParameter(LiveLinkParameters.serverProtocol,serverProtocol);
-    String serverName = variableContext.getParameter("servername");
-    if (serverName != null)
-      parameters.setParameter(LiveLinkParameters.serverName,serverName);
-    String serverPort = variableContext.getParameter("serverport");
-    if (serverPort != null)
-      parameters.setParameter(LiveLinkParameters.serverPort,serverPort);
-    String serverUserName = variableContext.getParameter("serverusername");
-    if (serverUserName != null)
-      parameters.setParameter(LiveLinkParameters.serverUsername,serverUserName);
-    String serverPassword = variableContext.getParameter("serverpassword");
-    if (serverPassword != null)
-      parameters.setObfuscatedParameter(LiveLinkParameters.serverPassword,variableContext.mapKeyToPassword(serverPassword));
-    String serverHTTPCgiPath = variableContext.getParameter("serverhttpcgipath");
-    if (serverHTTPCgiPath != null)
-      parameters.setParameter(LiveLinkParameters.serverHTTPCgiPath,serverHTTPCgiPath);
-    String serverHTTPNTLMDomain = variableContext.getParameter("serverhttpntlmdomain");
-    if (serverHTTPNTLMDomain != null)
-      parameters.setParameter(LiveLinkParameters.serverHTTPNTLMDomain,serverHTTPNTLMDomain);
-    String serverHTTPNTLMUserName = variableContext.getParameter("serverhttpntlmusername");
-    if (serverHTTPNTLMUserName != null)
-      parameters.setParameter(LiveLinkParameters.serverHTTPNTLMUsername,serverHTTPNTLMUserName);
-    String serverHTTPNTLMPassword = variableContext.getParameter("serverhttpntlmpassword");
-    if (serverHTTPNTLMPassword != null)
-      parameters.setObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword,variableContext.mapKeyToPassword(serverHTTPNTLMPassword));
-    
-    String serverHTTPSKeystoreValue = variableContext.getParameter("serverhttpskeystoredata");
-    final String serverConfigOp = variableContext.getParameter("serverconfigop");
-    if (serverConfigOp != null)
-    {
-      if (serverConfigOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("serverkeystorealias");
-        final IKeystoreManager mgr;
-        if (serverHTTPSKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",serverHTTPSKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        serverHTTPSKeystoreValue = mgr.getString();
-      }
-      else if (serverConfigOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("servercertificate");
-        final IKeystoreManager mgr;
-        if (serverHTTPSKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",serverHTTPSKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Eat this exception
-          }
-        }
-
-        if (certError != null)
-        {
-          return "Illegal certificate: "+certError;
-        }
-        serverHTTPSKeystoreValue = mgr.getString();
-      }
-    }
-    parameters.setParameter(LiveLinkParameters.serverHTTPSKeystore,serverHTTPSKeystoreValue);
-    
-    // Ingest parameters
-    String ingestProtocol = variableContext.getParameter("ingestprotocol");
-    if (ingestProtocol != null)
-      parameters.setParameter(LiveLinkParameters.ingestProtocol,ingestProtocol);
-    String ingestPort = variableContext.getParameter("ingestport");
-    if (ingestPort != null)
-      parameters.setParameter(LiveLinkParameters.ingestPort,ingestPort);
-    String ingestCgiPath = variableContext.getParameter("ingestcgipath");
-    if (ingestCgiPath != null)
-      parameters.setParameter(LiveLinkParameters.ingestCgiPath,ingestCgiPath);
-    String ingestNtlmDomain = variableContext.getParameter("ingestntlmdomain");
-    if (ingestNtlmDomain != null)
-      parameters.setParameter(LiveLinkParameters.ingestNtlmDomain,ingestNtlmDomain);
-    String ingestNtlmUsername = variableContext.getParameter("ingestntlmusername");
-    if (ingestNtlmUsername != null)
-      parameters.setParameter(LiveLinkParameters.ingestNtlmUsername,ingestNtlmUsername);
-    String ingestNtlmPassword = variableContext.getParameter("ingestntlmpassword");
-    if (ingestNtlmPassword != null)
-      parameters.setObfuscatedParameter(LiveLinkParameters.ingestNtlmPassword,variableContext.mapKeyToPassword(ingestNtlmPassword));
-    
-    String ingestKeystoreValue = variableContext.getParameter("ingestkeystoredata");
-    final String ingestConfigOp = variableContext.getParameter("ingestconfigop");
-    if (ingestConfigOp != null)
-    {
-      if (ingestConfigOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("ingestkeystorealias");
-        final IKeystoreManager mgr;
-        if (ingestKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",ingestKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        ingestKeystoreValue = mgr.getString();
-      }
-      else if (ingestConfigOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("ingestcertificate");
-        final IKeystoreManager mgr;
-        if (ingestKeystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",ingestKeystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Eat this exception
-          }
-        }
-
-        if (certError != null)
-        {
-          return "Illegal certificate: "+certError;
-        }
-        ingestKeystoreValue = mgr.getString();
-      }
-    }
-    parameters.setParameter(LiveLinkParameters.ingestKeystore,ingestKeystoreValue);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<>();
-    Map<String,String> configMap = new HashMap<>();
-
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        configMap.put(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param),"********");
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore") ||
-              param.length() > "truststore".length() && param.substring(param.length()-"truststore".length()).equalsIgnoreCase("truststore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        configMap.put(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param),"=&lt;"+Integer.toString(kmanager.getContents().length)+Messages.getBodyString(locale,"LivelinkConnector.certificates")+"&gt;");
-      }
-      else
-      {
-        configMap.put(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param), org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value));
-      }
-    }
-
-    paramMap.put("CONFIGMAP",configMap);
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIGURATION_HTML, paramMap);
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Paths"));
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Filters"));
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Security"));
-    tabsArray.add(Messages.getString(locale,"LivelinkConnector.Metadata"));
-    
-    String seqPrefixParam = "s" + connectionSequenceNumber + "_";
-
-    Map<String, String> paramMap = new HashMap<String, String>();  
-    paramMap.put("seqPrefix", seqPrefixParam);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPECIFICATION_JS, paramMap, true);
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<>();
-    velocityContext.put("TabName",tabName);
-    velocityContext.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    velocityContext.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    fillInPathsTab(velocityContext,out,ds);
-    fillInFiltersTab(velocityContext, out, ds);
-    fillInSecurityTab(velocityContext,out,ds);
-    fillInMetadataTab(velocityContext,out,ds);
-
-    // Now, do the part of the tabs that requires context logic
-    if (tabName.equals(Messages.getString(locale,"LivelinkConnector.Paths")))
-      fillInTransientPathsInfo(velocityContext,connectionSequenceNumber);
-    else if (tabName.equals(Messages.getString(locale,"LivelinkConnector.Metadata")))
-      fillInTransientMetadataInfo(velocityContext,connectionSequenceNumber);
-
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_PATHS_HTML,velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_FILTERS_HTML,velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_SECURITY_HTML,velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_METADATA_HTML,velocityContext);
-  }
-
-  /** Fill in paths tab */
-  protected static void fillInPathsTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    boolean userWorkspaces = false;
-    List<String> paths = new ArrayList<>();
-
-    int i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("userworkspace"))
-      {
-        String value = sn.getAttributeValue("value");
-        if (value != null && value.equals("true"))
-          userWorkspaces = true;
-      }
-      else if (sn.getType().equals("startpoint"))
-      {
-        paths.add(sn.getAttributeValue("path"));
-      }
-    }
-
-    velocityContext.put("USERWORKSPACES",userWorkspaces);
-    velocityContext.put("PATHS",paths);
-  }
-
-  /** Fill in the transient portion of the Paths tab */
-  protected void fillInTransientPathsInfo(Map<String,Object> velocityContext, int connectionSequenceNumber)
-  {
-    String message = null;
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String pathSoFar = (String)currentContext.get(seqPrefix+"specpath");
-    if (pathSoFar == null)
-      pathSoFar = "";
-
-    String[] childList = null;
-    // Grab next folder/project list
-    try
-    {
-      childList = getChildFolderNames(pathSoFar);
-      if (childList == null)
-      {
-        // Illegal path - set it back
-        pathSoFar = "";
-        childList = getChildFolderNames("");
-        if (childList == null)
-          throw new ManifoldCFException("Can't find any children for root folder");
-      }
-    }
-    catch (ServiceInterruption e)
-    {
-      //e.printStackTrace();
-      message = e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      //e.printStackTrace();
-      message = e.getMessage();
-    }
-
-    velocityContext.put("PATHSOFAR",pathSoFar);
-    if (message != null)
-      velocityContext.put("MESSAGE",message);
-    if (childList != null)
-      velocityContext.put("CHILDLIST",childList);
-  }
-
-  /** Fill in filters tab */
-  protected static void fillInFiltersTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    List<Pair<String,String>> fileSpecs = new ArrayList<>();
-
-    int i = 0;
-    // Next, go through include/exclude filespecs
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("include") || sn.getType().equals("exclude"))
-      {
-        fileSpecs.add(new Pair<>(sn.getType(),sn.getAttributeValue("filespec")));
-      }
-    }
-
-    velocityContext.put("FILESPECS",fileSpecs);
-  }
-
-  /** Fill in security tab */
-  protected static void fillInSecurityTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    // Security tab
-    String security = "on";
-    List<String> accessTokens = new ArrayList<String>();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("security"))
-      {
-        security = sn.getAttributeValue("value");
-      }
-      else if (sn.getType().equals("access"))
-      {
-        String token = sn.getAttributeValue("token");
-        accessTokens.add(token);
-      }
-    }
-
-    velocityContext.put("SECURITY",security);
-    velocityContext.put("ACCESSTOKENS",accessTokens);
-  }
-
-  /** Fill in Metadata tab */
-  protected static void fillInMetadataTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    boolean ingestAllMetadata = false;
-    String pathNameAttribute = "";
-    String pathNameSeparator = "/";
-    Map<String,String> matchMap = new HashMap<>();
-    //We are actually trying to create a Triple<L,M,R> by using Pair<L,R> where R is Pair<L,R>
-    List<Pair<String,Pair<String,String>>> metadataList = new ArrayList<>();
-
-    int i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("allmetadata"))
-      {
-        String value = sn.getAttributeValue("all");
-        if (value != null && value.equals("true"))
-          ingestAllMetadata = true;
-      }
-      // Find the path-value metadata attribute name
-      else if (sn.getType().equals("pathnameattribute"))
-      {
-        pathNameAttribute = sn.getAttributeValue("value");
-        if (sn.getAttributeValue("separator") != null)
-          pathNameSeparator = sn.getAttributeValue("separator");
-      }
-      // Find the path-value mapping data
-      else if (sn.getType().equals("pathmap"))
-      {
-        String pathMatch = sn.getAttributeValue("match");
-        String pathReplace = sn.getAttributeValue("replace");
-        matchMap.put(pathMatch, pathReplace);
-      }
-      // Go through the selected metadata attributes
-      else if (sn.getType().equals("metadata"))
-      {
-        String categoryPath = sn.getAttributeValue("category");
-        String isAll = sn.getAttributeValue("all");
-        if (isAll == null)
-          isAll = "false";
-        String attributeName = sn.getAttributeValue("attribute");
-        if (attributeName == null)
-          attributeName = "";
-        metadataList.add(new Pair<>(categoryPath,new Pair<>(isAll,attributeName)));
-      }
-    }
-
-
-    velocityContext.put("INGESTALLMETADATA",ingestAllMetadata);
-    velocityContext.put("PATHNAMEATTRIBUTE",pathNameAttribute);
-    velocityContext.put("PATHNAMESEPARATOR",pathNameSeparator);
-    velocityContext.put("MATCHMAP",matchMap);
-    velocityContext.put("METADATA",metadataList);
-  }
-
-  /** Fill in the transient portion of the Metadata tab */
-  protected void fillInTransientMetadataInfo(Map<String,Object> velocityContext, int connectionSequenceNumber)
-  {
-    String message = null;
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String categorySoFar = (String)currentContext.get(seqPrefix+"speccategory");
-    if (categorySoFar == null)
-      categorySoFar = "";
-
-    String[] childList = null;
-    String[] workspaceList = null;
-    String[] categoryList = null;
-    String[] attributeList = null;
-
-    // Grab next folder/project list, and the appropriate category list
-    try
-    {
-      if (categorySoFar.length() == 0)
-      {
-        workspaceList = getWorkspaceNames();
-      }
-      else
-      {
-        attributeList = getCategoryAttributes(categorySoFar);
-        if (attributeList == null)
-        {
-          childList = getChildFolderNames(categorySoFar);
-          if (childList == null)
-          {
-            // Illegal path - set it back
-            categorySoFar = "";
-            childList = getChildFolderNames("");
-            if (childList == null)
-              throw new ManifoldCFException("Can't find any children for root folder");
-          }
-          categoryList = getChildCategoryNames(categorySoFar);
-          if (categoryList == null)
-            throw new ManifoldCFException("Can't find any categories for root folder folder");
-        }
-      }
-
-    }
-    catch (ServiceInterruption e)
-    {
-      //e.printStackTrace();
-      message = e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      //e.printStackTrace();
-      message = e.getMessage();
-    }
-
-    velocityContext.put("CATEGORYSOFAR",categorySoFar);
-    if (message != null)
-      velocityContext.put("MESSAGE",message);
-    if (childList != null)
-      velocityContext.put("CHILDLIST",childList);
-    if (workspaceList != null)
-      velocityContext.put("WORKSPACELIST",workspaceList);
-    if (categoryList != null)
-      velocityContext.put("CATEGORYLIST",categoryList);
-    if (attributeList != null)
-      velocityContext.put("ATTRIBUTELIST",attributeList);
-  }
-
-  /**
-   * A class to store a pair structure, where none of the properties can behave as a key.
-   * @param <L> value to store in left.
-   * @param <R> value to store in right.
-   */
-  public static final class Pair<L,R> {
-    private final L left;
-    private final R right;
-    public Pair(L left, R right){
-      this.left = left;
-      this.right = right;
-    }
-    public L getLeft(){ return left; }
-    public R getRight(){ return right; }
-
-    @Override
-    public String toString() {
-      return left + "=" + right;
-    }
-  }  
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String userWorkspacesPresent = variableContext.getParameter(seqPrefix+"userworkspace_present");
-    if (userWorkspacesPresent != null)
-    {
-      String value = variableContext.getParameter(seqPrefix+"userworkspace");
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("userworkspace"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode sn = new SpecificationNode("userworkspace");
-      sn.setAttribute("value",value);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-    
-    String xc = variableContext.getParameter(seqPrefix+"pathcount");
-    if (xc != null)
-    {
-      // Delete all path specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("startpoint"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(xc);
-      // Gather up these
-      i = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"pathop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Path inserts won't happen until the very end
-        String path = variableContext.getParameter(seqPrefix+"specpath"+pathDescription);
-        SpecificationNode node = new SpecificationNode("startpoint");
-        node.setAttribute("path",path);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"pathop");
-      if (op != null && op.equals("Add"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        SpecificationNode node = new SpecificationNode("startpoint");
-        node.setAttribute("path",path);
-        ds.addChild(ds.getChildCount(),node);
-      }
-      else if (op != null && op.equals("Up"))
-      {
-        // Strip off end
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        int lastSlash = -1;
-        int k = 0;
-        while (k < path.length())
-        {
-          char x = path.charAt(k++);
-          if (x == '/')
-          {
-            lastSlash = k-1;
-            continue;
-          }
-          if (x == '\\')
-            k++;
-        }
-        if (lastSlash == -1)
-          path = "";
-        else
-          path = path.substring(0,lastSlash);
-        currentContext.save(seqPrefix+"specpath",path);
-      }
-      else if (op != null && op.equals("AddToPath"))
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath");
-        String addon = variableContext.getParameter(seqPrefix+"pathaddon");
-        if (addon != null && addon.length() > 0)
-        {
-          StringBuilder sb = new StringBuilder();
-          int k = 0;
-          while (k < addon.length())
-          {
-            char x = addon.charAt(k++);
-            if (x == '/' || x == '\\' || x == ':')
-              sb.append('\\');
-            sb.append(x);
-          }
-          if (path.length() == 0)
-            path = sb.toString();
-          else
-            path += "/" + sb.toString();
-        }
-        currentContext.save(seqPrefix+"specpath",path);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"filecount");
-    if (xc != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("include") || sn.getType().equals("exclude"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int fileCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < fileCount)
-      {
-        String fileSpecDescription = "_"+Integer.toString(i);
-        String fileOpName = seqPrefix+"fileop"+fileSpecDescription;
-        xc = variableContext.getParameter(fileOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String filespecType = variableContext.getParameter(seqPrefix+"specfiletype"+fileSpecDescription);
-        String filespec = variableContext.getParameter(seqPrefix+"specfile"+fileSpecDescription);
-        SpecificationNode node = new SpecificationNode(filespecType);
-        node.setAttribute("filespec",filespec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"fileop");
-      if (op != null && op.equals("Add"))
-      {
-        String filespec = variableContext.getParameter(seqPrefix+"specfile");
-        String filespectype = variableContext.getParameter(seqPrefix+"specfiletype");
-        SpecificationNode node = new SpecificationNode(filespectype);
-        node.setAttribute("filespec",filespec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (xc != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("security"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode("security");
-      node.setAttribute("value",xc);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specallmetadata");
-    if (xc != null)
-    {
-      // Look for the 'all metadata' checkbox
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("allmetadata"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      if (xc.equals("true"))
-      {
-        SpecificationNode newNode = new SpecificationNode("allmetadata");
-        newNode.setAttribute("all",xc);
-        ds.addChild(ds.getChildCount(),newNode);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"metadatacount");
-    if (xc != null)
-    {
-      // Delete all metadata specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("metadata"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int metadataCount = Integer.parseInt(xc);
-      // Gather up these
-      i = 0;
-      while (i < metadataCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"metadataop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Metadata inserts won't happen until the very end
-        String category = variableContext.getParameter(seqPrefix+"speccategory"+pathDescription);
-        String attributeName = variableContext.getParameter(seqPrefix+"specattribute"+pathDescription);
-        String isAll = variableContext.getParameter(seqPrefix+"specattributeall"+pathDescription);
-        SpecificationNode node = new SpecificationNode("metadata");
-        node.setAttribute("category",category);
-        if (isAll != null && isAll.equals("true"))
-          node.setAttribute("all","true");
-        else
-          node.setAttribute("attribute",attributeName);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // See if there's a global add operation
-      String op = variableContext.getParameter(seqPrefix+"metadataop");
-      if (op != null && op.equals("Add"))
-      {
-        String category = variableContext.getParameter(seqPrefix+"speccategory");
-        String isAll = variableContext.getParameter(seqPrefix+"attributeall");
-        if (isAll != null && isAll.equals("true"))
-        {
-          SpecificationNode node = new SpecificationNode("metadata");
-          node.setAttribute("category",category);
-          node.setAttribute("all","true");
-          ds.addChild(ds.getChildCount(),node);
-        }
-        else
-        {
-          String[] attributes = variableContext.getParameterValues(seqPrefix+"attributeselect");
-          if (attributes != null && attributes.length > 0)
-          {
-            int k = 0;
-            while (k < attributes.length)
-            {
-              String attribute = attributes[k++];
-              SpecificationNode node = new SpecificationNode("metadata");
-              node.setAttribute("category",category);
-              node.setAttribute("attribute",attribute);
-              ds.addChild(ds.getChildCount(),node);
-            }
-          }
-        }
-      }
-      else if (op != null && op.equals("Up"))
-      {
-        // Strip off end
-        String category = variableContext.getParameter(seqPrefix+"speccategory");
-        int lastSlash = -1;
-        int firstColon = -1;      
-        int k = 0;
-        while (k < category.length())
-        {
-          char x = category.charAt(k++);
-          if (x == '/')
-          {
-            lastSlash = k-1;
-            continue;
-          }
-          if (x == ':')
-          {
-            firstColon = k;
-            continue;
-          }
-          if (x == '\\')
-            k++;
-        }
-
-        if (lastSlash == -1)
-        {
-          if (firstColon == -1 || firstColon == category.length())
-            category = "";
-          else
-            category = category.substring(0,firstColon);
-        }
-        else
-          category = category.substring(0,lastSlash);
-        currentContext.save(seqPrefix+"speccategory",category);
-      }
-      else if (op != null && op.equals("AddToPath"))
-      {
-        String category = variableContext.getParameter(seqPrefix+"speccategory");
-        String addon = variableContext.getParameter(seqPrefix+"metadataaddon");
-        if (addon != null && addon.length() > 0)
-        {
-          StringBuilder sb = new StringBuilder();
-          int k = 0;
-          while (k < addon.length())
-          {
-            char x = addon.charAt(k++);
-            if (x == '/' || x == '\\' || x == ':')
-              sb.append('\\');
-            sb.append(x);
-          }
-          if (category.length() == 0 || category.endsWith(":"))
-            category += sb.toString();
-          else
-            category += "/" + sb.toString();
-        }
-        currentContext.save(seqPrefix+"speccategory",category);
-      }
-      else if (op != null && op.equals("SetWorkspace"))
-      {
-        String addon = variableContext.getParameter(seqPrefix+"metadataaddon");
-        if (addon != null && addon.length() > 0)
-        {
-          StringBuilder sb = new StringBuilder();
-          int k = 0;
-          while (k < addon.length())
-          {
-            char x = addon.charAt(k++);
-            if (x == '/' || x == '\\' || x == ':')
-              sb.append('\\');
-            sb.append(x);
-          }
-
-          String category = sb.toString() + ":";
-          currentContext.save(seqPrefix+"speccategory",category);
-        }
-      }
-      else if (op != null && op.equals("AddCategory"))
-      {
-        String category = variableContext.getParameter(seqPrefix+"speccategory");
-        String addon = variableContext.getParameter(seqPrefix+"categoryaddon");
-        if (addon != null && addon.length() > 0)
-        {
-          StringBuilder sb = new StringBuilder();
-          int k = 0;
-          while (k < addon.length())
-          {
-            char x = addon.charAt(k++);
-            if (x == '/' || x == '\\' || x == ':')
-              sb.append('\\');
-            sb.append(x);
-          }
-          if (category.length() == 0 || category.endsWith(":"))
-            category += sb.toString();
-          else
-            category += "/" + sb.toString();
-        }
-        currentContext.save(seqPrefix+"speccategory",category);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specpathnameattribute");
-    if (xc != null)
-    {
-      String separator = variableContext.getParameter(seqPrefix+"specpathnameseparator");
-      if (separator == null)
-        separator = "/";
-      // Delete old one
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathnameattribute"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      if (xc.length() > 0)
-      {
-        SpecificationNode node = new SpecificationNode("pathnameattribute");
-        node.setAttribute("value",xc);
-        node.setAttribute("separator",separator);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specmappingcount");
-    if (xc != null)
-    {
-      // Delete old spec
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathmap"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(xc);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specmappingop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Inserts won't happen until the very end
-        String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-        String replace = variableContext.getParameter(seqPrefix+"specreplace"+pathDescription);
-        SpecificationNode node = new SpecificationNode("pathmap");
-        node.setAttribute("match",match);
-        node.setAttribute("replace",replace);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // Check for add
-      xc = variableContext.getParameter(seqPrefix+"specmappingop");
-      if (xc != null && xc.equals("Add"))
-      {
-        String match = variableContext.getParameter(seqPrefix+"specmatch");
-        String replace = variableContext.getParameter(seqPrefix+"specreplace");
-        SpecificationNode node = new SpecificationNode("pathmap");
-        node.setAttribute("match",match);
-        node.setAttribute("replace",replace);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<>();
-
-    fillInPathsTab(velocityContext,out,ds);
-    fillInFiltersTab(velocityContext, out, ds);
-    fillInSecurityTab(velocityContext,out,ds);
-    fillInMetadataTab(velocityContext,out,ds);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_SPECIFICATION_HTML, velocityContext);
-  }
-
-  // The following public methods are NOT part of the interface.  They are here so that the UI can present information
-  // that will allow users to select what they need.
-
-  protected final static String CATEGORY_NAME = "CATEGORY";
-  protected final static String ENTWKSPACE_NAME = "ENTERPRISE";
-
-  /** Get the allowed workspace names.
-  *@return a list of workspace names.
-  */
-  public String[] getWorkspaceNames()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return new String[]{CATEGORY_NAME,ENTWKSPACE_NAME};
-  }
-
-  /** Given a path string, get a list of folders and projects under that node.
-  *@param pathString is the current path (folder names and project names, separated by dots (.)).
-  *@return a list of folder and project names, in sorted order, or null if the path was invalid.
-  */
-  public String[] getChildFolderNames(String pathString)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    return getChildFolders(new LivelinkContext(),pathString);
-  }
-
-
-  /** Given a path string, get a list of categories under that node.
-  *@param pathString is the current path (folder names and project names, separated by dots (.)).
-  *@return a list of category names, in sorted order, or null if the path was invalid.
-  */
-  public String[] getChildCategoryNames(String pathString)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    return getChildCategories(new LivelinkContext(),pathString);
-  }
-
-  /** Given a category path, get a list of legal attribute names.
-  *@param pathString is the current path of a category (with path components separated by dots).
-  *@return a list of attribute names, in sorted order, or null of the path was invalid.
-  */
-  public String[] getCategoryAttributes(String pathString)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    return getCategoryAttributes(new LivelinkContext(), pathString);
-  }
-  
-  protected String[] getCategoryAttributes(LivelinkContext llc, String pathString)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Start at root
-    RootValue rv = new RootValue(llc,pathString);
-
-    // Get the object id of the category the path describes
-    int catObjectID = getCategoryId(rv);
-    if (catObjectID == -1)
-      return null;
-
-    String[] rval = getCategoryAttributes(catObjectID);
-    if (rval == null)
-      return new String[0];
-    return rval;
-  }
-
-  // Protected methods and classes
-
-
-  /** Create the login URI.  This must be a relative URI.
-  */
-  protected String createLivelinkLoginURI()
-    throws ManifoldCFException
-  {
-      StringBuilder llURI = new StringBuilder();
-
-      llURI.append(ingestCgiPath);
-      llURI.append("?func=ll.login&CurrentClientTime=D%2F2005%2F3%2F9%3A13%3A16%3A30&NextURL=");
-      llURI.append(org.apache.manifoldcf.core.util.URLEncoder.encode(ingestCgiPath));
-      llURI.append("%3FRedirect%3D1&Username=");
-      llURI.append(org.apache.manifoldcf.core.util.URLEncoder.encode(llServer.getLLUser()));
-      llURI.append("&Password=");
-      llURI.append(org.apache.manifoldcf.core.util.URLEncoder.encode(llServer.getLLPwd()));
-
-      return llURI.toString();
-  }
-
-  /**
-  * Connects to the specified Livelink document using HTTP protocol
-  * @param documentIdentifier is the document identifier (as far as the crawler knows).
-  * @param activities is the process activity structure, so we can ingest
-  */
-  protected void ingestFromLiveLink(LivelinkContext llc,
-    String documentIdentifier, String version,
-    String[] actualAcls, String[] denyAcls,
-    String[] categoryPaths,
-    IProcessActivity activities,
-    MetadataDescription desc, SystemMetadataDescription sDesc)
-    throws ManifoldCFException, ServiceInterruption
-  {
-
-    String contextMsg = "for '"+documentIdentifier+"'";
-
-
-    // Fetch logging
-    long startTime = System.currentTimeMillis();
-    String resultCode = null;
-    String resultDescription = null;
-    Long readSize = null;
-    int objID;
-    int vol;
-
-    int colonPos = documentIdentifier.indexOf(":",1);
-        
-    if (colonPos == -1)
-    {
-      objID = new Integer(documentIdentifier.substring(1)).intValue();
-      vol = LLENTWK_VOL;
-    }
-    else
-    {
-      objID = new Integer(documentIdentifier.substring(colonPos+1)).intValue();
-      vol = new Integer(documentIdentifier.substring(1,colonPos)).intValue();
-    }
-    
-    // Try/finally for fetch logging
-    try
-    {
-      String viewHttpAddress = convertToViewURI(documentIdentifier);
-      if (viewHttpAddress == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: No view URI "+contextMsg+" - not ingesting");
-        resultCode = "NOVIEWURI";
-        resultDescription = "Document had no view URI";
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-      
-      // Check URL first
-      if (!activities.checkURLIndexable(viewHttpAddress))
-      {
-        // Document not ingestable due to URL
-        resultCode = activities.EXCLUDED_URL;
-        resultDescription = "URL ("+viewHttpAddress+") was rejected by output connector";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Excluding document "+documentIdentifier+" because its URL ("+viewHttpAddress+") was rejected by output connector");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-      
-      // Add general metadata
-      ObjectInformation objInfo = llc.getObjectInformation(vol,objID);
-      VersionInformation versInfo = llc.getVersionInformation(vol,objID,0);
-      if (!objInfo.exists())
-      {
-        resultCode = "OBJECTNOTFOUND";
-        resultDescription = "Object was not found in Livelink";
-        Logging.connectors.debug("Livelink: No object "+contextMsg+": not ingesting");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-      if (!versInfo.exists())
-      {
-        resultCode = "VERSIONNOTFOUND";
-        resultDescription = "Version was not found in Livelink";
-        Logging.connectors.debug("Livelink: No version data "+contextMsg+": not ingesting");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-
-      String mimeType = versInfo.getMimeType();
-      if (!activities.checkMimeTypeIndexable(mimeType))
-      {
-        // Document not indexable because of its mime type
-        resultCode = activities.EXCLUDED_MIMETYPE;
-        resultDescription = "Mime type ("+mimeType+") was rejected by output connector";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Excluding document "+documentIdentifier+" because its mime type ("+mimeType+") was rejected by output connector");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-        
-      Long dataSize = versInfo.getDataSize();
-      if (dataSize == null)
-      {
-        // Document had no length
-        resultCode = "DOCUMENTNOLENGTH";
-        resultDescription = "Document had no length in Livelink";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Excluding document "+documentIdentifier+" because it had no length");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-      
-      if (!activities.checkLengthIndexable(dataSize.longValue()))
-      {
-        // Document not indexable because of its length
-        resultCode = activities.EXCLUDED_LENGTH;
-        resultDescription = "Document length ("+dataSize+") was rejected by output connector";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Excluding document "+documentIdentifier+" because its length ("+dataSize+") was rejected by output connector");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-
-      Date modifyDate = versInfo.getModifyDate();
-      if (!activities.checkDateIndexable(modifyDate))
-      {
-        // Document not indexable because of its date
-        resultCode = activities.EXCLUDED_DATE;
-        resultDescription = "Document date ("+modifyDate+") was rejected by output connector";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Livelink: Excluding document "+documentIdentifier+" because its date ("+modifyDate+") was rejected by output connector");
-        activities.noDocument(documentIdentifier,version);
-        return;
-      }
-      
-      String fileName = versInfo.getFileName();
-      Date creationDate = objInfo.getCreationDate();
-      Integer parentID = objInfo.getParentId();
-      
-      
-      RepositoryDocument rd = new RepositoryDocument();
-
-      // Add general data we need for the output connector
-      if (mimeType != null)
-        rd.setMimeType(mimeType);
-      if (fileName != null)
-        rd.setFileName(fileName);
-      if (creationDate != null)
-        rd.setCreatedDate(creationDate);
-      if (modifyDate != null)
-        rd.setModifiedDate(modifyDate);
-            
-      rd.addField(GENERAL_NAME_FIELD,objInfo.getName());
-      rd.addField(GENERAL_DESCRIPTION_FIELD,objInfo.getComments());
-      if (creationDate != null)
-        rd.addField(GENERAL_CREATIONDATE_FIELD,DateParser.formatISO8601Date(creationDate));
-      if (modifyDate != null)
-        rd.addField(GENERAL_MODIFYDATE_FIELD,DateParser.formatISO8601Date(modifyDate));
-      if (parentID != null)
-        rd.addField(GENERAL_PARENTID,parentID.toString());
-      UserInformation owner = llc.getUserInformation(objInfo.getOwnerId().intValue());
-      UserInformation creator = llc.getUserInformation(objInfo.getCreatorId().intValue());
-      UserInformation modifier = llc.getUserInformation(versInfo.getOwnerId().intValue());
-      if (owner != null)
-        rd.addField(GENERAL_OWNER,owner.getName());
-      if (creator != null)
-        rd.addField(GENERAL_CREATOR,creator.getName());
-      if (modifier != null)
-        rd.addField(GENERAL_MODIFIER,modifier.getName());
-
-      // Iterate over the metadata items.  These are organized by category
-      // for speed of lookup.
-
-      Iterator<MetadataItem> catIter = desc.getItems(categoryPaths);
-      while (catIter.hasNext())
-      {
-        MetadataItem item = catIter.next();
-        MetadataPathItem pathItem = item.getPathItem();
-        if (pathItem != null)
-        {
-          int catID = pathItem.getCatID();
-          // grab the associated catversion
-          LLValue catVersion = getCatVersion(objID,catID);
-          if (catVersion != null)
-          {
-            // Go through attributes now
-            Iterator<String> attrIter = item.getAttributeNames();
-            while (attrIter.hasNext())
-            {
-              String attrName = attrIter.next();
-              // Create a unique metadata name
-              String metadataName = pathItem.getCatName()+":"+attrName;
-              // Fetch the metadata and stuff it into the RepositoryData structure
-              String[] metadataValue = getAttributeValue(catVersion,attrName);
-              if (metadataValue != null)
-                rd.addField(metadataName,metadataValue);
-              else
-                Logging.connectors.warn("Livelink: Metadata attribute '"+metadataName+"' does not seem to exist; please correct the job");
-            }
-          }
-          
-        }
-      }
-
-      if (actualAcls != null && denyAcls != null)
-        rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,actualAcls,denyAcls);
-
-      // Add the path metadata item into the mix, if enabled
-      String pathAttributeName = sDesc.getPathAttributeName();
-      if (pathAttributeName != null && pathAttributeName.length() > 0)
-      {
-        String pathString = sDesc.getPathAttributeValue(documentIdentifier);
-        if (pathString != null)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("Livelink: Path attribute name is '"+pathAttributeName+"'"+contextMsg+", value is '"+pathString+"'");
-          rd.addField(pathAttributeName,pathString);
-        }
-      }
-
-      if (ingestProtocol != null)
-      {
-        // Use HTTP to fetch document!
-        String ingestHttpAddress = convertToIngestURI(documentIdentifier);
-        if (ingestHttpAddress == null)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("Livelink: No fetch URI "+contextMsg+" - not ingesting");
-          resultCode = "NOURI";
-          resultDescription = "Document had no fetch URI";
-          activities.noDocument(documentIdentifier,version);
-          return;
-        }
-
-        // Set up connection
-        HttpClient client = getInitializedClient(contextMsg);
-
-        long currentTime;
-
-        if (Logging.connectors.isInfoEnabled())
-          Logging.connectors.info("Livelink: " + ingestHttpAddress);
-
-
-        HttpGet method = new HttpGet(getHost().toURI() + ingestHttpAddress);
-        method.setHeader(new BasicHeader("Accept","*/*"));
-
-        boolean wasInterrupted = false;
-        ExecuteMethodThread methodThread = new ExecuteMethodThread(client,method);
-        methodThread.start();
-        try
-        {
-          int statusCode = methodThread.getResponseCode();
-          switch (statusCode)
-          {
-          case 500:
-          case 502:
-            Logging.connectors.warn("Livelink: Service interruption during fetch "+contextMsg+" with Livelink HTTP Server, retrying...");
-            resultCode = "FETCHFAILED";
-            resultDescription = "HTTP error code "+statusCode+" fetching document";
-            throw new ServiceInterruption("Service interruption during fetch",new ManifoldCFException(Integer.toString(statusCode)+" error while fetching"),System.currentTimeMillis()+60000L,
-              System.currentTimeMillis()+600000L,-1,true);
-
-          case HttpStatus.SC_UNAUTHORIZED:
-            Logging.connectors.warn("Livelink: Document fetch unauthorized for "+ingestHttpAddress+" ("+contextMsg+")");
-            // Since we logged in, we should fail here if the ingestion user doesn't have access to the
-            // the document, but if we do, don't fail hard.
-            resultCode = "UNAUTHORIZED";
-            resultDescription = "Document fetch was unauthorized by IIS";
-            activities.noDocument(documentIdentifier,version);
-            return;
-
-          case HttpStatus.SC_OK:
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Livelink: Created http document connection to Livelink "+contextMsg);
-            // A non-existent content length will cause a value of -1 to be returned.  This seems to indicate that the session login did not work right.
-            if (methodThread.getResponseContentLength() < 0)
-            {
-              resultCode = "SESSIONLOGINFAILED";
-              resultDescription = "Response content length was -1, which usually means session login did not succeed";
-              activities.noDocument(documentIdentifier,version);
-              return;
-            }
-              
-            try
-            {
-              InputStream is = methodThread.getSafeInputStream();
-              try
-              {
-                rd.setBinary(is,dataSize);
-                            
-                activities.ingestDocumentWithException(documentIdentifier,version,viewHttpAddress,rd);
-                resultCode = "OK";
-                readSize = dataSize;
-                    
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Livelink: Ingesting done "+contextMsg);
-
-              }
-              finally
-              {
-                // Close stream via thread, since otherwise this can hang
-                is.close();
-              }
-            }
-            catch (InterruptedException e)
-            {
-              wasInterrupted = true;
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (HttpException e)
-            {
-              resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              resultDescription = e.getMessage();
-              handleHttpException(contextMsg,e);
-            }
-            catch (IOException e)
-            {
-              resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              resultDescription = e.getMessage();
-              handleIOException(contextMsg,e);
-            }
-            break;
-          case HttpStatus.SC_BAD_REQUEST:
-          case HttpStatus.SC_USE_PROXY:
-          case HttpStatus.SC_GONE:
-            resultCode = "HTTPERROR";
-            resultDescription = "Http request returned status "+Integer.toString(statusCode);
-            throw new ManifoldCFException("Unrecoverable request failure; error = "+Integer.toString(statusCode));
-          default:
-            resultCode = "UNKNOWNHTTPCODE";
-            resultDescription = "Http request returned status "+Integer.toString(statusCode);
-            Logging.connectors.warn("Livelink: Attempt to retrieve document from '"+ingestHttpAddress+"' received a response of "+Integer.toString(statusCode)+"; retrying in one minute");
-            currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Fetch failed; retrying in 1 minute",new ManifoldCFException("Fetch failed with unknown code "+Integer.toString(statusCode)),
-              currentTime+60000L,currentTime+600000L,-1,true);
-          }
-        }
-        catch (InterruptedException e)
-        {
-          // Drop the connection on the floor
-          methodThread.interrupt();
-          methodThread = null;
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (HttpException e)
-        {
-          resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          resultDescription = e.getMessage();
-          handleHttpException(contextMsg,e);
-        }
-        catch (IOException e)
-        {
-          resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          resultDescription = e.getMessage();
-          handleIOException(contextMsg,e);
-        }
-        finally
-        {
-          if (methodThread != null)
-          {
-            methodThread.abort();
-            try
-            {
-              if (!wasInterrupted)
-                methodThread.finishUp();
-            }
-            catch (InterruptedException e)
-            {
-              throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-          }
-        }
-      }
-      else
-      {
-        // Use FetchVersion instead
-        long currentTime;
-              
-        // Fire up the document reading thread
-        DocumentReadingThread t = new DocumentReadingThread(vol,objID,0);
-        boolean wasInterrupted = false;
-        t.start();
-        try 
-        {
-          try
-          {
-            InputStream is = t.getSafeInputStream();
-            try 
-            {
-              // Can only index while background thread is running!
-              rd.setBinary(is, dataSize);
-              activities.ingestDocumentWithException(documentIdentifier, version, viewHttpAddress, rd);
-              resultCode = "OK";
-              readSize = dataSize;
-            }
-            finally
-            {
-              is.close();
-            }
-          }
-          catch (java.net.SocketTimeoutException e)
-          {
-            throw e;
-          }
-          catch (InterruptedIOException e)
-          {
-            wasInterrupted = true;
-            throw e;
-          }
-          finally
-          {
-            if (!wasInterrupted)
-              t.finishUp();
-          }
-
-          // No errors.  Record the fact that we made it.
-        }
-        catch (InterruptedException e) 
-        {
-          t.interrupt();
-          throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
-            ManifoldCFException.INTERRUPTED);
-        }
-        catch (IOException e)
-        {
-          resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          resultDescription = e.getMessage();
-          handleIOException(contextMsg,e);
-        }
-        catch (RuntimeException e)
-        {
-          resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          resultDescription = e.getMessage();
-          handleLivelinkRuntimeException(e,0,true);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        resultCode = null;
-      throw e;
-    }
-    finally
-    {
-      if (resultCode != null)
-        activities.recordActivity(new Long(startTime),ACTIVITY_FETCH,readSize,vol+":"+objID,resultCode,resultDescription,null);
-    }
-  }
-
-  protected static void handleHttpException(String contextMsg, HttpException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime = System.currentTimeMillis();
-    // Treat unknown error ingesting data as a transient condition
-    Logging.connectors.warn("Livelink: HTTP exception ingesting "+contextMsg+": "+e.getMessage(),e);
-    throw new ServiceInterruption("HTTP exception ingesting "+contextMsg+": "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,false);
-  }
-  
-  protected static void handleIOException(String contextMsg, IOException e)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime = System.currentTimeMillis();
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      Logging.connectors.warn("Livelink: Livelink socket timed out ingesting from the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ServiceInterruption("Socket timed out: "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,false);
-    }
-    if (e instanceof java.net.SocketException)
-    {
-      Logging.connectors.warn("Livelink: Livelink socket error ingesting from the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ServiceInterruption("Socket error: "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,false);
-    }
-    if (e instanceof javax.net.ssl.SSLHandshakeException)
-    {
-      Logging.connectors.warn("Livelink: SSL handshake failed authenticating "+contextMsg+": "+e.getMessage(),e);
-      throw new ServiceInterruption("SSL handshake error: "+e.getMessage(),e,currentTime+60000L,currentTime+300000L,-1,true);
-    }
-    if (e instanceof ConnectTimeoutException)
-    {
-      Logging.connectors.warn("Livelink: Livelink socket timed out connecting to the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ServiceInterruption("Connect timed out: "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,false);
-    }
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    // Treat unknown error ingesting data as a transient condition
-    Logging.connectors.warn("Livelink: IO exception ingesting "+contextMsg+": "+e.getMessage(),e);
-    throw new ServiceInterruption("IO exception ingesting "+contextMsg+": "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,false);
-  }
-  
-  /** Initialize a livelink client connection */
-  protected HttpClient getInitializedClient(String contextMsg)
-    throws ServiceInterruption, ManifoldCFException
-  {
-    long currentTime;
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("Livelink: Session authenticating via http "+contextMsg+"...");
-    HttpGet authget = new HttpGet(getHost().toURI() + createLivelinkLoginURI());
-    authget.setHeader(new BasicHeader("Accept","*/*"));
-    try
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Livelink: Created new HttpGet "+contextMsg+"; executing authentication method");
-      int statusCode = executeMethodViaThread(httpClient,authget);
-
-      if (statusCode == 502 || statusCode == 500)
-      {
-        Logging.connectors.warn("Livelink: Service interruption during authentication "+contextMsg+" with Livelink HTTP Server, retrying...");
-        currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("502 error during authentication",new ManifoldCFException("502 error while authenticating"),
-          currentTime+60000L,currentTime+600000L,-1,true);
-      }
-      if (statusCode != HttpStatus.SC_OK)
-      {
-        Logging.connectors.error("Livelink: Failed to authenticate "+contextMsg+" against Livelink HTTP Server; Status code: " + statusCode);
-        // Ok, so we didn't get in - simply do not ingest
-        if (statusCode == HttpStatus.SC_UNAUTHORIZED)
-          throw new ManifoldCFException("Session authorization failed with a 401 code; are credentials correct?");
-        else
-          throw new ManifoldCFException("Session authorization failed with code "+Integer.toString(statusCode));
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      currentTime = System.currentTimeMillis();
-      Logging.connectors.warn("Livelink: Socket timed out authenticating to the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ServiceInterruption("Socket timed out: "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,true);
-    }
-    catch (java.net.SocketException e)
-    {
-      currentTime = System.currentTimeMillis();
-      Logging.connectors.warn("Livelink: Socket error authenticating to the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ServiceInterruption("Socket error: "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,true);
-    }
-    catch (javax.net.ssl.SSLHandshakeException e)
-    {
-      currentTime = System.currentTimeMillis();
-      Logging.connectors.warn("Livelink: SSL handshake failed authenticating "+contextMsg+": "+e.getMessage(),e);
-      throw new ServiceInterruption("SSL handshake error: "+e.getMessage(),e,currentTime+60000L,currentTime+300000L,-1,true);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      currentTime = System.currentTimeMillis();
-      Logging.connectors.warn("Livelink: Connect timed out authenticating to the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ServiceInterruption("Connect timed out: "+e.getMessage(),e,currentTime+300000L,currentTime+6*3600000L,-1,true);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (HttpException e)
-    {
-      Logging.connectors.error("Livelink: HTTP exception when authenticating to the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ManifoldCFException("Unable to communicate with the Livelink HTTP Server: "+e.getMessage(), e);
-    }
-    catch (IOException e)
-    {
-      Logging.connectors.error("Livelink: IO exception when authenticating to the Livelink HTTP Server "+contextMsg+": "+e.getMessage(), e);
-      throw new ManifoldCFException("Unable to communicate with the Livelink HTTP Server: "+e.getMessage(), e);
-    }
-
-    return httpClient;
-  }
-
-  /** Pack category and attribute */
-  protected static String packCategoryAttribute(String category, String attribute)
-  {
-    StringBuilder sb = new StringBuilder();
-    pack(sb,category,':');
-    pack(sb,attribute,':');
-    return sb.toString();
-  }
-
-  /** Unpack category and attribute */
-  protected static void unpackCategoryAttribute(StringBuilder category, StringBuilder attribute, String value)
-  {
-    int startPos = 0;
-    startPos = unpack(category,value,startPos,':');
-    startPos = unpack(attribute,value,startPos,':');
-  }
-
-  /** Given a path string, get a list of folders and projects under that node.
-  *@param pathString is the current path (folder names and project names, separated by dots (.)).
-  *@return a list of folder and project names, in sorted order, or null if the path was invalid.
-  */
-  protected String[] getChildFolders(LivelinkContext llc, String pathString)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    RootValue rv = new RootValue(llc,pathString);
-
-    // Get the volume, object id of the folder/project the path describes
-    VolumeAndId vid = getPathId(rv);
-    if (vid == null)
-      return null;
-
-    String filterString = "(SubType="+ LAPI_DOCUMENTS.FOLDERSUBTYPE + " or SubType=" + LAPI_DOCUMENTS.PROJECTSUBTYPE +
-      " or SubType=" + LAPI_DOCUMENTS.COMPOUNDDOCUMENTSUBTYPE + ")";
-
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      ListObjectsThread t = new ListObjectsThread(vid.getVolumeID(), vid.getPathId(), filterString);
-      try
-      {
-        t.start();
-	LLValue children;
-	try
-	{
-	  children = t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-	}
-
-        String[] rval = new String[children.size()];
-        int j = 0;
-        while (j < children.size())
-        {
-          rval[j] = children.toString(j,"Name");
-          j++;
-        }
-        return rval;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-
-  /** Given a path string, get a list of categories under that node.
-  *@param pathString is the current path (folder names and project names, separated by dots (.)).
-  *@return a list of category names, in sorted order, or null if the path was invalid.
-  */
-  protected String[] getChildCategories(LivelinkContext llc, String pathString)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Start at root
-    RootValue rv = new RootValue(llc,pathString);
-
-    // Get the volume, object id of the folder/project the path describes
-    VolumeAndId vid = getPathId(rv);
-    if (vid == null)
-      return null;
-
-    // We want only folders that are children of the current object and which match the specified subfolder
-    String filterString = "SubType="+ LAPI_DOCUMENTS.CATEGORYSUBTYPE;
-
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      ListObjectsThread t = new ListObjectsThread(vid.getVolumeID(), vid.getPathId(), filterString);
-      try
-      {
-        t.start();
-	LLValue children;
-	try
-	{
-	  children = t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-        }
-
-        String[] rval = new String[children.size()];
-        int j = 0;
-        while (j < children.size())
-        {
-          rval[j] = children.toString(j,"Name");
-          j++;
-        }
-        return rval;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-  protected class GetCategoryAttributesThread extends Thread
-  {
-    protected final int catObjectID;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetCategoryAttributesThread(int catObjectID)
-    {
-      super();
-      setDaemon(true);
-      this.catObjectID = catObjectID;
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue catID = new LLValue();
-        catID.setAssoc();
-        catID.add("ID", catObjectID);
-        catID.add("Type", LAPI_ATTRIBUTES.CATEGORY_TYPE_LIBRARY);
-
-        LLValue catVersion = new LLValue();
-        int status = LLDocs.FetchCategoryVersion(catID,catVersion);
-        if (status == 107105 || status == 107106)
-          return;
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error getting category version: "+Integer.toString(status));
-        }
-
-        LLValue children = new LLValue();
-        status = LLAttributes.AttrListNames(catVersion,null,children);
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error getting attribute names: "+Integer.toString(status));
-        }
-        rval = children;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-
-  /** Given a category path, get a list of legal attribute names.
-  *@param catObjectID is the object id of the category.
-  *@return a list of attribute names, in sorted order, or null of the path was invalid.
-  */
-  protected String[] getCategoryAttributes(int catObjectID)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      GetCategoryAttributesThread t = new GetCategoryAttributesThread(catObjectID);
-      try
-      {
-        t.start();
-	LLValue children;
-	try
-	{
-	  children = t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-        }
-
-        if (children == null)
-          return null;
-
-        String[] rval = new String[children.size()];
-        LLValueEnumeration en = children.enumerateValues();
-
-        int j = 0;
-        while (en.hasMoreElements())
-        {
-          LLValue v = (LLValue)en.nextElement();
-          rval[j] = v.toString();
-          j++;
-        }
-        return rval;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-  protected class GetCategoryVersionThread extends Thread
-  {
-    protected final int objID;
-    protected final int catID;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetCategoryVersionThread(int objID, int catID)
-    {
-      super();
-      setDaemon(true);
-      this.objID = objID;
-      this.catID = catID;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Set up the right llvalues
-
-        // Object ID
-        LLValue objIDValue = new LLValue().setAssoc();
-        objIDValue.add("ID", objID);
-        // Current version, so don't set the "Version" field
-
-        // CatID
-        LLValue catIDValue = new LLValue().setAssoc();
-        catIDValue.add("ID", catID);
-        catIDValue.add("Type", LAPI_ATTRIBUTES.CATEGORY_TYPE_LIBRARY);
-
-        LLValue rvalue = new LLValue();
-
-        int status = LLDocs.GetObjectAttributesEx(objIDValue,catIDValue,rvalue);
-        // If either the object is wrong, or the object does not have the specified category, return null.
-        if (status == 103101 || status == 107205)
-          return;
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving category version: "+Integer.toString(status)+": "+llServer.getErrors());
-        }
-
-        rval = rvalue;
-
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  /** Get a category version for document.
-  */
-  protected LLValue getCatVersion(int objID, int catID)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      GetCategoryVersionThread t = new GetCategoryVersionThread(objID,catID);
-      try
-      {
-        t.start();
-	try
-	{
-	  return t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-        }
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (NullPointerException npe)
-      {
-        // LAPI throws a null pointer exception under very rare conditions when the GetObjectAttributesEx is
-        // called.  The conditions are not clear at this time - it could even be due to Livelink corruption.
-        // However, I'm going to have to treat this as
-        // indicating that this category version does not exist for this document.
-        Logging.connectors.warn("Livelink: Null pointer exception thrown trying to get cat version for category "+
-          Integer.toString(catID)+" for object "+Integer.toString(objID));
-        return null;
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-  protected class GetAttributeValueThread extends Thread
-  {
-    protected final LLValue categoryVersion;
-    protected final String attributeName;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetAttributeValueThread(LLValue categoryVersion, String attributeName)
-    {
-      super();
-      setDaemon(true);
-      this.categoryVersion = categoryVersion;
-      this.attributeName = attributeName;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Set up the right llvalues
-        LLValue children = new LLValue();
-        int status = LLAttributes.AttrGetValues(categoryVersion,attributeName,
-          0,null,children);
-        // "Not found" status - I don't know if it possible to get this here, but if so, behave civilly
-        if (status == 103101)
-          return;
-        // This seems to be the real error LAPI returns if you don't have an attribute of this name
-        if (status == 8000604)
-          return;
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving attribute value: "+Integer.toString(status)+": "+llServer.getErrors());
-        }
-        rval = children;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  /** Get an attribute value from a category version.
-  */
-  protected String[] getAttributeValue(LLValue categoryVersion, String attributeName)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      GetAttributeValueThread t = new GetAttributeValueThread(categoryVersion, attributeName);
-      try
-      {
-        t.start();
-	LLValue children;
-	try
-	{
-	  children = t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-        }
-	
-        if (children == null)
-          return null;
-        String[] rval = new String[children.size()];
-        LLValueEnumeration en = children.enumerateValues();
-
-        int j = 0;
-        while (en.hasMoreElements())
-        {
-          LLValue v = (LLValue)en.nextElement();
-          rval[j] = v.toString();
-          j++;
-        }
-        return rval;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-  protected class GetObjectRightsThread extends Thread
-  {
-    protected final int vol;
-    protected final int objID;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetObjectRightsThread(int vol, int objID)
-    {
-      super();
-      setDaemon(true);
-      this.vol = vol;
-      this.objID = objID;
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue childrenObjects = new LLValue();
-        int status = LLDocs.GetObjectRights(vol, objID, childrenObjects);
-        // If the rights object doesn't exist, behave civilly
-        if (status == 103101)
-          return;
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving document rights: "+Integer.toString(status)+": "+llServer.getErrors());
-        }
-
-        rval = childrenObjects;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  /** Get an object's rights.  This will be an array of right id's, including the special
-  * ones defined by Livelink, or null will be returned (if the object is not found).
-  *@param vol is the volume id
-  *@param objID is the object id
-  *@return the array.
-  */
-  protected int[] getObjectRights(int vol, int objID)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      GetObjectRightsThread t = new GetObjectRightsThread(vol,objID);
-      try
-      {
-        t.start();
-	LLValue childrenObjects;
-	try
-	{
-	  childrenObjects = t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-        }
-
-        if (childrenObjects == null)
-          return null;
-
-        int size;
-        if (childrenObjects.isRecord())
-          size = 1;
-        else if (childrenObjects.isTable())
-          size = childrenObjects.size();
-        else
-          size = 0;
-
-        int minPermission = LAPI_DOCUMENTS.PERM_SEE +
-          LAPI_DOCUMENTS.PERM_SEECONTENTS;
-
-
-        int j = 0;
-        int count = 0;
-        while (j < size)
-        {
-          int permission = childrenObjects.toInteger(j, "Permissions");
-          // Only if the permission is "see contents" can we consider this
-          // access token!
-          if ((permission & minPermission) == minPermission)
-            count++;
-          j++;
-        }
-
-        int[] rval = new int[count];
-        j = 0;
-        count = 0;
-        while (j < size)
-        {
-          int token = childrenObjects.toInteger(j, "RightID");
-          int permission = childrenObjects.toInteger(j, "Permissions");
-          // Only if the permission is "see contents" can we consider this
-          // access token!
-          if ((permission & minPermission) == minPermission)
-            rval[count++] = token;
-          j++;
-        }
-        return rval;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-  /** Local cache for various kinds of objects that may be useful more than once.
-  */
-  protected class LivelinkContext
-  {
-    /** Cache of ObjectInformation objects. */
-    protected final Map<ObjectInformation,ObjectInformation> objectInfoMap = new HashMap<ObjectInformation,ObjectInformation>();
-    /** Cache of VersionInformation objects. */
-    protected final Map<VersionInformation,VersionInformation> versionInfoMap = new HashMap<VersionInformation,VersionInformation>();
-    /** Cache of UserInformation objects */
-    protected final Map<UserInformation,UserInformation> userInfoMap = new HashMap<UserInformation,UserInformation>();
-    
-    public LivelinkContext()
-    {
-    }
-    
-    public ObjectInformation getObjectInformation(int volumeID, int objectID)
-    {
-      ObjectInformation oi = new ObjectInformation(volumeID,objectID);
-      ObjectInformation lookupValue = objectInfoMap.get(oi);
-      if (lookupValue == null)
-      {
-        objectInfoMap.put(oi,oi);
-        return oi;
-      }
-      return lookupValue;
-    }
-    
-    public VersionInformation getVersionInformation(int volumeID, int objectID, int revisionNumber)
-    {
-      VersionInformation vi = new VersionInformation(volumeID,objectID,revisionNumber);
-      VersionInformation lookupValue = versionInfoMap.get(vi);
-      if (lookupValue == null)
-      {
-        versionInfoMap.put(vi,vi);
-        return vi;
-      }
-      return lookupValue;
-    }
-    
-    public UserInformation getUserInformation(int userID)
-    {
-      UserInformation ui = new UserInformation(userID);
-      UserInformation lookupValue = userInfoMap.get(ui);
-      if (lookupValue == null)
-      {
-        userInfoMap.put(ui,ui);
-        return ui;
-      }
-      return lookupValue;
-    }
-  }
-
-  /** This object represents a cache of user information.
-  * Initialize it with the user ID.  Then, request desired fields from it.
-  */
-  protected class UserInformation
-  {
-    protected final int userID;
-    
-    protected LLValue userValue = null;
-    
-    public UserInformation(int userID)
-    {
-      this.userID = userID;
-    }
-    
-    public boolean exists()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      return getUserValue() != null;
-    }
-    
-    public String getName()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue userValue = getUserValue();
-      if (userValue == null)
-        return null;
-      return userValue.toString("NAME");
-    }
-      
-    protected LLValue getUserValue()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      if (userValue == null)
-      {
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          GetUserInfoThread t = new GetUserInfoThread(userID);
-          try
-          {
-            t.start();
-	    try
-	    {
-	      userValue = t.finishUp();
-	    }
-	    catch (ManifoldCFException e)
-	    {
-	      sanityRetryCount = assessRetry(sanityRetryCount,e);
-	      continue;
-	    }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-          }
-        }
-      }
-      return userValue;
-    }
-
-    @Override
-    public String toString()
-    {
-      return "("+userID+")";
-    }
-    
-    @Override
-    public int hashCode()
-    {
-      return (userID << 5) ^ (userID >> 3);
-    }
-    
-    @Override
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof UserInformation))
-        return false;
-      UserInformation other = (UserInformation)o;
-      return userID == other.userID;
-    }
-
-  }
-  
-  /** This object represents a cache of version information.
-  * Initialize it with the volume ID and object ID and revision number (usually zero).
-  * Then, request the desired fields from it.
-  */
-  protected class VersionInformation
-  {
-    protected final int volumeID;
-    protected final int objectID;
-    protected final int revisionNumber;
-    
-    protected LLValue versionValue = null;
-    
-    public VersionInformation(int volumeID, int objectID, int revisionNumber)
-    {
-      this.volumeID = volumeID;
-      this.objectID = objectID;
-      this.revisionNumber = revisionNumber;
-    }
-    
-    public boolean exists()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      return getVersionValue() != null;
-    }
-
-    /** Get data size.
-    */
-    public Long getDataSize()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getVersionValue();
-      if (elem == null)
-        return null;
-      return new Long(elem.toLong("FILEDATASIZE"));
-    }
-
-    /** Get file name.
-    */
-    public String getFileName()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getVersionValue();
-      if (elem == null)
-        return null;
-      return elem.toString("FILENAME");
-    }
-
-    /** Get mime type.
-    */
-    public String getMimeType()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getVersionValue();
-      if (elem == null)
-        return null;
-      return elem.toString("MIMETYPE");
-    }
-
-    /** Get modify date.
-    */
-    public Date getModifyDate()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getVersionValue();
-      if (elem == null)
-        return null;
-      return elem.toDate("MODIFYDATE"); 
-    }
-
-    /** Get modifier.
-    */
-    public Integer getOwnerId()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getVersionValue();
-      if (elem == null)
-        return null;
-      return new Integer(elem.toInteger("OWNER")); 
-    }
-
-    /** Get version LLValue */
-    protected LLValue getVersionValue()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      if (versionValue == null)
-      {
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          GetVersionInfoThread t = new GetVersionInfoThread(volumeID,objectID,revisionNumber);
-          try
-          {
-            t.start();
-	    try
-	    {
-	      versionValue = t.finishUp();
-	    }
-	    catch (ManifoldCFException e)
-	    {
-	      sanityRetryCount = assessRetry(sanityRetryCount,e);
-	      continue;
-            }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-          }
-        }
-      }
-      return versionValue;
-    }
-    
-    @Override
-    public int hashCode()
-    {
-      return (volumeID << 5) ^ (volumeID >> 3) ^ (objectID << 5) ^ (objectID >> 3) ^ (revisionNumber << 5) ^ (revisionNumber >> 3);
-    }
-    
-    @Override
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof VersionInformation))
-        return false;
-      VersionInformation other = (VersionInformation)o;
-      return volumeID == other.volumeID && objectID == other.objectID && revisionNumber == other.revisionNumber;
-    }
-
-  }
-  
-  /** This object represents an object information cache.
-  * Initialize it with the volume ID and object ID, and then request
-  * the appropriate fields from it.  Keep it around as long as needed; it functions as a cache
-  * of sorts...
-  */
-  protected class ObjectInformation
-  {
-    protected final int volumeID;
-    protected final int objectID;
-    
-    protected LLValue objectValue = null;
-    
-    public ObjectInformation(int volumeID, int objectID)
-    {
-      this.volumeID = volumeID;
-      this.objectID = objectID;
-    }
-
-    /**
-    * Check whether object seems to exist or not.
-    */
-    public boolean exists()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      return getObjectValue() != null;
-    }
-
-    /** Check if this object is the category workspace.
-    */
-    public boolean isCategoryWorkspace()
-    {
-      return objectID == LLCATWK_ID;
-    }
-    
-    /** Check if this object is the entity workspace.
-    */
-    public boolean isEntityWorkspace()
-    {
-      return objectID == LLENTWK_ID;
-    }
-    
-    /** toString override */
-    @Override
-    public String toString()
-    {
-      return "(Volume: "+volumeID+", Object: "+objectID+")";
-    }
-    
-    /**
-    * Returns the object ID specified by the path name.
-    * @param startPath is the folder name (a string with dots as separators)
-    */
-    public VolumeAndId getPathId(String startPath)
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue objInfo = getObjectValue();
-      if (objInfo == null)
-        return null;
-
-      // Grab the volume ID and starting object
-      int obj = objInfo.toInteger("ID");
-      int vol = objInfo.toInteger("VolumeID");
-
-      // Pick apart the start path.  This is a string separated by slashes.
-      int charindex = 0;
-      while (charindex < startPath.length())
-      {
-        StringBuilder currentTokenBuffer = new StringBuilder();
-        // Find the current token
-        while (charindex < startPath.length())
-        {
-          char x = startPath.charAt(charindex++);
-          if (x == '/')
-            break;
-          if (x == '\\')
-          {
-            // Attempt to escape what follows
-            x = startPath.charAt(charindex);
-            charindex++;
-          }
-          currentTokenBuffer.append(x);
-        }
-
-        String subFolder = currentTokenBuffer.toString();
-        // We want only folders that are children of the current object and which match the specified subfolder
-        String filterString = "(SubType="+ LAPI_DOCUMENTS.FOLDERSUBTYPE + " or SubType=" + LAPI_DOCUMENTS.PROJECTSUBTYPE +
-          " or SubType=" + LAPI_DOCUMENTS.COMPOUNDDOCUMENTSUBTYPE + ") and Name='" + subFolder + "'";
-
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          ListObjectsThread t = new ListObjectsThread(vol,obj,filterString);
-          try
-          {
-            t.start();
-	    LLValue children;
-	    try
-	    {
-	      children = t.finishUp();
-	    }
-	    catch (ManifoldCFException e)
-	    {
-	      sanityRetryCount = assessRetry(sanityRetryCount,e);
-	      continue;
-            }
-
-            if (children == null)
-              return null;
-
-            // If there is one child, then we are okay.
-            if (children.size() == 1)
-            {
-              // New starting point is the one we found.
-              obj = children.toInteger(0, "ID");
-              int subtype = children.toInteger(0, "SubType");
-              if (subtype == LAPI_DOCUMENTS.PROJECTSUBTYPE)
-              {
-                vol = obj;
-                obj = -obj;
-              }
-            }
-            else
-            {
-              // Couldn't find the path.  Instead of throwing up, return null to indicate
-              // illegal node.
-              return null;
-            }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-
-          }
-        }
-
-      }
-      return new VolumeAndId(vol,obj);
-    }
-
-    /**
-    * Returns the category ID specified by the path name.
-    * @param startPath is the folder name, ending in a category name (a string with slashes as separators)
-    */
-    public int getCategoryId(String startPath)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      LLValue objInfo = getObjectValue();
-      if (objInfo == null)
-        return -1;
-
-      // Grab the volume ID and starting object
-      int obj = objInfo.toInteger("ID");
-      int vol = objInfo.toInteger("VolumeID");
-
-      // Pick apart the start path.  This is a string separated by slashes.
-      if (startPath.length() == 0)
-        return -1;
-
-      int charindex = 0;
-      while (charindex < startPath.length())
-      {
-        StringBuilder currentTokenBuffer = new StringBuilder();
-        // Find the current token
-        while (charindex < startPath.length())
-        {
-          char x = startPath.charAt(charindex++);
-          if (x == '/')
-            break;
-          if (x == '\\')
-          {
-            // Attempt to escape what follows
-            x = startPath.charAt(charindex);
-            charindex++;
-          }
-          currentTokenBuffer.append(x);
-        }
-        String subFolder = currentTokenBuffer.toString();
-        String filterString;
-
-        // We want only folders that are children of the current object and which match the specified subfolder
-        if (charindex < startPath.length())
-          filterString = "(SubType="+ LAPI_DOCUMENTS.FOLDERSUBTYPE + " or SubType=" + LAPI_DOCUMENTS.PROJECTSUBTYPE +
-          " or SubType=" + LAPI_DOCUMENTS.COMPOUNDDOCUMENTSUBTYPE + ")";
-        else
-          filterString = "SubType="+LAPI_DOCUMENTS.CATEGORYSUBTYPE;
-
-        filterString += " and Name='" + subFolder + "'";
-
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          ListObjectsThread t = new ListObjectsThread(vol,obj,filterString);
-          try
-          {
-            t.start();
-	    LLValue children;
-	    try
-	    {
-	      children = t.finishUp();
-	    }
-	    catch (ManifoldCFException e)
-	    {
-	      sanityRetryCount = assessRetry(sanityRetryCount,e);
-	      continue;
-            }
-
-            if (children == null)
-              return -1;
-
-            // If there is one child, then we are okay.
-            if (children.size() == 1)
-            {
-              // New starting point is the one we found.
-              obj = children.toInteger(0, "ID");
-              int subtype = children.toInteger(0, "SubType");
-              if (subtype == LAPI_DOCUMENTS.PROJECTSUBTYPE)
-              {
-                vol = obj;
-                obj = -obj;
-              }
-            }
-            else
-            {
-              // Couldn't find the path.  Instead of throwing up, return null to indicate
-              // illegal node.
-              return -1;
-            }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-          }
-        }
-      }
-      return obj;
-    }
-
-    /** Get permissions.
-    */
-    public Integer getPermissions()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return new Integer(objectValue.toInteger("Permissions"));
-    }
-    
-    /** Get OpenText document name.
-    */
-    public String getName()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return elem.toString("NAME"); 
-    }
-
-    /** Get OpenText comments/description.
-    */
-    public String getComments()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return elem.toString("COMMENT"); 
-    }
-
-    /** Get parent ID.
-    */
-    public Integer getParentId()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return new Integer(elem.toInteger("ParentId")); 
-    }
-
-    /** Get owner ID.
-    */
-    public Integer getOwnerId()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return new Integer(elem.toInteger("UserId")); 
-    }
-
-    /** Get group ID.
-    */
-    public Integer getGroupId()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return new Integer(elem.toInteger("GroupId")); 
-    }
-    
-    /** Get creation date.
-    */
-    public Date getCreationDate()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return elem.toDate("CREATEDATE"); 
-    }
-    
-    /** Get creator ID.
-    */
-    public Integer getCreatorId()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return new Integer(elem.toInteger("CREATEDBY")); 
-    }
-
-    /* Get modify date.
-    */
-    public Date getModifyDate()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      LLValue elem = getObjectValue();
-      if (elem == null)
-        return null;
-      return elem.toDate("ModifyDate"); 
-    }
-
-    /** Get the objInfo object.
-    */
-    protected LLValue getObjectValue()
-      throws ServiceInterruption, ManifoldCFException
-    {
-      if (objectValue == null)
-      {
-        int sanityRetryCount = FAILURE_RETRY_COUNT;
-        while (true)
-        {
-          GetObjectInfoThread t = new GetObjectInfoThread(volumeID,objectID);
-          try
-          {
-            t.start();
-	    try
-	    {
-	      objectValue = t.finishUp();
-	    }
-	    catch (ManifoldCFException e)
-	    {
-	      sanityRetryCount = assessRetry(sanityRetryCount,e);
-	      continue;
-            }
-            break;
-          }
-          catch (InterruptedException e)
-          {
-            t.interrupt();
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (RuntimeException e)
-          {
-            sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-            continue;
-          }
-        }
-      }
-      return objectValue;
-    }
-    
-    @Override
-    public int hashCode()
-    {
-      return (volumeID << 5) ^ (volumeID >> 3) ^ (objectID << 5) ^ (objectID >> 3);
-    }
-    
-    @Override
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ObjectInformation))
-        return false;
-      ObjectInformation other = (ObjectInformation)o;
-      return volumeID == other.volumeID && objectID == other.objectID;
-    }
-  }
-
-  /** Thread we can abandon that lists all users (except admin).
-  */
-  protected class ListUsersThread extends Thread
-  {
-    protected LLValue rval = null;
-    protected Throwable exception = null;
-
-    public ListUsersThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue userList = new LLValue();
-        int status = LLUsers.ListUsers(userList);
-
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: User list retrieved: status="+Integer.toString(status));
-        }
-
-        if (status < 0)
-        {
-          Logging.connectors.debug("Livelink: User list inaccessable ("+llServer.getErrors()+")");
-          return;
-        }
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving user list: status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-        }
-        
-        rval = userList;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-
-  }
-
-  /** Thread we can abandon that gets user information for a userID.
-  */
-  protected class GetUserInfoThread extends Thread
-  {
-    protected final int user;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetUserInfoThread(int user)
-    {
-      super();
-      setDaemon(true);
-      this.user = user;
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue userinfo = new LLValue().setAssoc();
-        int status = LLUsers.GetUserByID(user,userinfo);
-
-        // Need to detect if object was deleted, and return null in this case!!!
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: User status retrieved for "+Integer.toString(user)+": status="+Integer.toString(status));
-        }
-
-        // Treat both 103101 and 103102 as 'object not found'. 401101 is 'user not found'.
-        if (status == 103101 || status == 103102 || status == 401101)
-          return;
-
-        // This error means we don't have permission to get the object's status, apparently
-        if (status < 0)
-        {
-          Logging.connectors.debug("Livelink: User info inaccessable for user "+Integer.toString(user)+
-            " ("+llServer.getErrors()+")");
-          return;
-        }
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving user "+Integer.toString(user)+": status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-        }
-        rval = userinfo;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Thread we can abandon that gets version information for a volume and an id and a revision.
-  */
-  protected class GetVersionInfoThread extends Thread
-  {
-    protected final int vol;
-    protected final int id;
-    protected final int revNumber;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetVersionInfoThread(int vol, int id, int revNumber)
-    {
-      super();
-      setDaemon(true);
-      this.vol = vol;
-      this.id = id;
-      this.revNumber = revNumber;
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue versioninfo = new LLValue().setAssocNotSet();
-        int status = LLDocs.GetVersionInfo(vol,id,revNumber,versioninfo);
-
-        // Need to detect if object was deleted, and return null in this case!!!
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: Version status retrieved for "+Integer.toString(vol)+":"+Integer.toString(id)+", rev "+revNumber+": status="+Integer.toString(status));
-        }
-
-        // Treat both 103101 and 103102 as 'object not found'.
-        if (status == 103101 || status == 103102)
-          return;
-
-        // This error means we don't have permission to get the object's status, apparently
-        if (status < 0)
-        {
-          Logging.connectors.debug("Livelink: Version info inaccessable for object "+Integer.toString(vol)+":"+Integer.toString(id)+", rev "+revNumber+
-            " ("+llServer.getErrors()+")");
-          return;
-        }
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving document version "+Integer.toString(vol)+":"+Integer.toString(id)+", rev "+revNumber+": status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-        }
-        rval = versioninfo;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Thread we can abandon that gets object information for a volume and an id.
-  */
-  protected class GetObjectInfoThread extends Thread
-  {
-    protected int vol;
-    protected int id;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetObjectInfoThread(int vol, int id)
-    {
-      super();
-      setDaemon(true);
-      this.vol = vol;
-      this.id = id;
-    }
-
-    public void run()
-    {
-      try
-      {
-        LLValue objinfo = new LLValue().setAssocNotSet();
-        int status = LLDocs.GetObjectInfo(vol,id,objinfo);
-
-        // Need to detect if object was deleted, and return null in this case!!!
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: Status retrieved for "+Integer.toString(vol)+":"+Integer.toString(id)+": status="+Integer.toString(status));
-        }
-
-        // Treat both 103101 and 103102 as 'object not found'.
-        if (status == 103101 || status == 103102)
-          return;
-
-        // This error means we don't have permission to get the object's status, apparently
-        if (status < 0)
-        {
-          Logging.connectors.debug("Livelink: Object info inaccessable for object "+Integer.toString(vol)+":"+Integer.toString(id)+
-            " ("+llServer.getErrors()+")");
-          return;
-        }
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving document object "+Integer.toString(vol)+":"+Integer.toString(id)+": status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-        }
-        rval = objinfo;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Build a set of actual acls given a set of rights */
-  protected String[] lookupTokens(int[] rights, ObjectInformation objInfo)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (!objInfo.exists())
-      return null;
-    
-    String[] convertedAcls = new String[rights.length];
-
-    LLValue infoObject = null;
-    int j = 0;
-    int k = 0;
-    while (j < rights.length)
-    {
-      int token = rights[j++];
-      String tokenValue;
-      // Consider this token
-      switch (token)
-      {
-      case LAPI_DOCUMENTS.RIGHT_OWNER:
-        // Look up user for current document (UserID attribute)
-        tokenValue = objInfo.getOwnerId().toString();
-        break;
-      case LAPI_DOCUMENTS.RIGHT_GROUP:
-        tokenValue = objInfo.getGroupId().toString();
-        break;
-      case LAPI_DOCUMENTS.RIGHT_WORLD:
-        // Add "Guest" token
-        tokenValue = "GUEST";
-        break;
-      case LAPI_DOCUMENTS.RIGHT_SYSTEM:
-        // Add "System" token
-        tokenValue = "SYSTEM";
-        break;
-      default:
-        tokenValue = Integer.toString(token);
-        break;
-      }
-
-      // This might return a null if we could not look up the object corresponding to the right.  If so, it is safe to skip it because
-      // that always RESTRICTS view of the object (maybe erroneously), but does not expand visibility.
-      if (tokenValue != null)
-        convertedAcls[k++] = tokenValue;
-    }
-    String[] actualAcls = new String[k];
-    j = 0;
-    while (j < k)
-    {
-      actualAcls[j] = convertedAcls[j];
-      j++;
-    }
-    return actualAcls;
-  }
-
-  protected class GetObjectCategoryIDsThread extends Thread
-  {
-    protected final int vol;
-    protected final int id;
-    protected Throwable exception = null;
-    protected LLValue rval = null;
-
-    public GetObjectCategoryIDsThread(int vol, int id)
-    {
-      super();
-      setDaemon(true);
-      this.vol = vol;
-      this.id = id;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Object ID
-        LLValue objIDValue = new LLValue().setAssocNotSet();
-        objIDValue.add("ID", id);
-
-        // Category ID List
-        LLValue catIDList = new LLValue().setAssocNotSet();
-
-        int status = LLDocs.ListObjectCategoryIDs(objIDValue,catIDList);
-
-        // Need to detect if object was deleted, and return null in this case!!!
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: Status value for getting object categories for "+Integer.toString(vol)+":"+Integer.toString(id)+" is: "+Integer.toString(status));
-        }
-
-        if (status == 103101)
-          return;
-
-        if (status != 0)
-        {
-          throw new ManifoldCFException("Error retrieving document categories for "+Integer.toString(vol)+":"+Integer.toString(id)+": status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-        }
-        rval = catIDList;
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public LLValue finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-	if (thr instanceof RuntimeException)
-	  throw (RuntimeException)thr;
-	else if (thr instanceof ManifoldCFException)
-	  throw (ManifoldCFException)thr;
-	else if (thr instanceof Error)
-	  throw (Error)thr;
-	else
-	  throw new RuntimeException("Unrecognized exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Get category IDs associated with an object.
-  * @param vol is the volume ID
-  * @param id the object ID
-  * @return an array of integers containing category identifiers, or null if the object is not found.
-  */
-  protected int[] getObjectCategoryIDs(int vol, int id)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int sanityRetryCount = FAILURE_RETRY_COUNT;
-    while (true)
-    {
-      GetObjectCategoryIDsThread t = new GetObjectCategoryIDsThread(vol,id);
-      try
-      {
-        t.start();
-	LLValue catIDList;
-	try
-	{
-	  catIDList = t.finishUp();
-	}
-	catch (ManifoldCFException e)
-	{
-	  sanityRetryCount = assessRetry(sanityRetryCount,e);
-	  continue;
-        }
-
-        if (catIDList == null)
-          return null;
-
-        int size = catIDList.size();
-
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: Object "+Integer.toString(vol)+":"+Integer.toString(id)+" has "+Integer.toString(size)+" attached categories");
-        }
-
-        // Count the category ids
-        int count = 0;
-        int j = 0;
-        while (j < size)
-        {
-          int type = catIDList.toValue(j).toInteger("Type");
-          if (type == LAPI_ATTRIBUTES.CATEGORY_TYPE_LIBRARY)
-            count++;
-          j++;
-        }
-
-        int[] rval = new int[count];
-
-        // Do the scan
-        j = 0;
-        count = 0;
-        while (j < size)
-        {
-          int type = catIDList.toValue(j).toInteger("Type");
-          if (type == LAPI_ATTRIBUTES.CATEGORY_TYPE_LIBRARY)
-          {
-            int childID = catIDList.toValue(j).toInteger("ID");
-            rval[count++] = childID;
-          }
-          j++;
-        }
-
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("Livelink: Object "+Integer.toString(vol)+":"+Integer.toString(id)+" has "+Integer.toString(rval.length)+" attached library categories");
-        }
-
-        return rval;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (RuntimeException e)
-      {
-        sanityRetryCount = handleLivelinkRuntimeException(e,sanityRetryCount,true);
-        continue;
-      }
-    }
-  }
-
-  /** RootValue version of getPathId.
-  */
-  protected VolumeAndId getPathId(RootValue rv)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return rv.getRootValue().getPathId(rv.getRemainderPath());
-  }
-
-  /** Rootvalue version of getCategoryId.
-  */
-  protected int getCategoryId(RootValue rv)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return rv.getRootValue().getCategoryId(rv.getRemainderPath());
-  }
-
-  // Protected static methods
-
-  /** Check if a file or directory should be included, given a document specification.
-  *@param filename is the name of the "file".
-  *@param documentSpecification is the specification.
-  *@return true if it should be included.
-  */
-  protected static boolean checkInclude(String filename, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    // Scan includes to insure we match
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i);
-      if (sn.getType().equals("include"))
-      {
-        String filespec = sn.getAttributeValue("filespec");
-        // If it matches, we can exit this loop.
-        if (checkMatch(filename,0,filespec))
-          break;
-      }
-      i++;
-    }
-    if (i == documentSpecification.getChildCount())
-      return false;
-
-    // We matched an include.  Now, scan excludes to ditch it if needed.
-    i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i);
-      if (sn.getType().equals("exclude"))
-      {
-        String filespec = sn.getAttributeValue("filespec");
-        // If it matches, we return false.
-        if (checkMatch(filename,0,filespec))
-          return false;
-      }
-      i++;
-    }
-
-    // System.out.println("Match!");
-    return true;
-  }
-
-  /** Check if a file should be ingested, given a document specification.  It is presumed that
-  * documents that pass checkInclude() will be checked with this method.
-  *@param objID is the file ID.
-  *@param documentSpecification is the specification.
-  */
-  protected boolean checkIngest(LivelinkContext llc, int objID, Specification documentSpecification)
-    throws ManifoldCFException
-  {
-    // Since the only exclusions at this point are not based on file contents, this is a no-op.
-    return true;
-  }
-
-  /** Check a match between two strings with wildcards.
-  *@param sourceMatch is the expanded string (no wildcards)
-  *@param sourceIndex is the starting point in the expanded string.
-  *@param match is the wildcard-based string.
-  *@return true if there is a match.
-  */
-  protected static boolean checkMatch(String sourceMatch, int sourceIndex, String match)
-  {
-    // Note: The java regex stuff looks pretty heavyweight for this purpose.
-    // I've opted to try and do a simple recursive version myself, which is not compiled.
-    // Basically, the match proceeds by recursive descent through the string, so that all *'s cause
-    // recursion.
-    boolean caseSensitive = false;
-
-    return processCheck(caseSensitive, sourceMatch, sourceIndex, match, 0);
-  }
-
-  /** Recursive worker method for checkMatch.  Returns 'true' if there is a path that consumes both
-  * strings in their entirety in a matched way.
-  *@param caseSensitive is true if file names are case sensitive.
-  *@param sourceMatch is the source string (w/o wildcards)
-  *@param sourceIndex is the current point in the source string.
-  *@param match is the match string (w/wildcards)
-  *@param matchIndex is the current point in the match string.
-  *@return true if there is a match.
-  */
-  protected static boolean processCheck(boolean caseSensitive, String sourceMatch, int sourceIndex,
-    String match, int matchIndex)
-  {
-    // Logging.connectors.debug("Matching '"+sourceMatch+"' position "+Integer.toString(sourceIndex)+
-    //      " against '"+match+"' position "+Integer.toString(matchIndex));
-
-    // Match up through the next * we encounter
-    while (true)
-    {
-      // If we've reached the end, it's a match.
-      if (sourceMatch.length() == sourceIndex && match.length() == matchIndex)
-        return true;
-      // If one has reached the end but the other hasn't, no match
-      if (match.length() == matchIndex)
-        return false;
-      if (sourceMatch.length() == sourceIndex)
-      {
-        if (match.charAt(matchIndex) != '*')
-          return false;
-        matchIndex++;
-        continue;
-      }
-      char x = sourceMatch.charAt(sourceIndex);
-      char y = match.charAt(matchIndex);
-      if (!caseSensitive)
-      {
-        if (x >= 'A' && x <= 'Z')
-          x -= 'A'-'a';
-        if (y >= 'A' && y <= 'Z')
-          y -= 'A'-'a';
-      }
-      if (y == '*')
-      {
-        // Wildcard!
-        // We will recurse at this point.
-        // Basically, we want to combine the results for leaving the "*" in the match string
-        // at this point and advancing the source index, with skipping the "*" and leaving the source
-        // string alone.
-        return processCheck(caseSensitive,sourceMatch,sourceIndex+1,match,matchIndex) ||
-          processCheck(caseSensitive,sourceMatch,sourceIndex,match,matchIndex+1);
-      }
-      if (y == '?' || x == y)
-      {
-        sourceIndex++;
-        matchIndex++;
-      }
-      else
-        return false;
-    }
-  }
-
-  /** Class for returning volume id/folder id combination on path lookup.
-  */
-  protected static class VolumeAndId
-  {
-    protected final int volumeID;
-    protected final int folderID;
-
-    public VolumeAndId(int volumeID, int folderID)
-    {
-      this.volumeID = volumeID;
-      this.folderID = folderID;
-    }
-
-    public int getVolumeID()
-    {
-      return volumeID;
-    }
-
-    public int getPathId()
-    {
-      return folderID;
-    }
-  }
-
-  /** Class that describes a metadata catid and path.
-  */
-  protected static class MetadataPathItem
-  {
-    protected final int catID;
-    protected final String catName;
-
-    /** Constructor.
-    */
-    public MetadataPathItem(int catID, String catName)
-    {
-      this.catID = catID;
-      this.catName = catName;
-    }
-
-    /** Get the cat ID.
-    *@return the id.
-    */
-    public int getCatID()
-    {
-      return catID;
-    }
-
-    /** Get the cat name.
-    *@return the category name path.
-    */
-    public String getCatName()
-    {
-      return catName;
-    }
-
-  }
-
-  /** Class that describes a metadata catid and attribute set.
-  */
-  protected static class MetadataItem
-  {
-    protected final MetadataPathItem pathItem;
-    protected final Set<String> attributeNames = new HashSet<String>();
-
-    /** Constructor.
-    */
-    public MetadataItem(MetadataPathItem pathItem)
-    {
-      this.pathItem = pathItem;
-    }
-
-    /** Add an attribute name.
-    */
-    public void addAttribute(String attributeName)
-    {
-      attributeNames.add(attributeName);
-    }
-
-    /** Get the path object.
-    *@return the object.
-    */
-    public MetadataPathItem getPathItem()
-    {
-      return pathItem;
-    }
-
-    /** Get an iterator over the attribute names.
-    *@return the iterator.
-    */
-    public Iterator<String> getAttributeNames()
-    {
-      return attributeNames.iterator();
-    }
-
-  }
-
-  /** Class that tracks paths associated with nodes, and also keeps track of the name
-  * of the metadata attribute to use for the path.
-  */
-  protected class SystemMetadataDescription
-  {
-    // The livelink context
-    protected final LivelinkContext llc;
-    
-    // The path attribute name
-    protected final String pathAttributeName;
-
-    // The path separator
-    protected final String pathSeparator;
-    
-    // The node ID to path name mapping (which acts like a cache)
-    protected final Map<String,String> pathMap = new HashMap<String,String>();
-
-    // The path name map
-    protected final MatchMap matchMap = new MatchMap();
-
-    // Acls
-    protected final Set<String> aclMap = new HashSet<String>();
-    protected final boolean securityOn;
-    
-    // Filter string
-    protected final String filterString;
-    
-    protected final Set<String> holder = new HashSet<String>();
-    protected final boolean includeAllMetadata;
-
-    /** Constructor */
-    public SystemMetadataDescription(LivelinkContext llc, Specification spec)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      this.llc = llc;
-      String pathAttributeName = null;
-      String pathSeparator = null;
-      boolean securityOn = true;
-      StringBuilder fsb = new StringBuilder();
-      boolean first = true;
-      boolean includeAllMetadata = false;
-      
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode n = spec.getChild(i);
-        if (n.getType().equals("pathnameattribute"))
-        {
-          pathAttributeName = n.getAttributeValue("value");
-          pathSeparator = n.getAttributeValue("separator");
-          if (pathSeparator == null)
-            pathSeparator = "/";
-        }
-        else if (n.getType().equals("pathmap"))
-        {
-          String pathMatch = n.getAttributeValue("match");
-          String pathReplace = n.getAttributeValue("replace");
-          matchMap.appendMatchPair(pathMatch,pathReplace);
-        }
-        else if (n.getType().equals("access"))
-        {
-          String token = n.getAttributeValue("token");
-          aclMap.add(token);
-        }
-        else if (n.getType().equals("security"))
-        {
-          String value = n.getAttributeValue("value");
-          if (value.equals("on"))
-            securityOn = true;
-          else if (value.equals("off"))
-            securityOn = false;
-        }
-        else if (n.getType().equals("include"))
-        {
-          String includeMatch = n.getAttributeValue("filespec");
-          if (includeMatch != null)
-          {
-            // Peel off the extension
-            int index = includeMatch.lastIndexOf(".");
-            if (index != -1)
-            {
-              String type = includeMatch.substring(index+1).toLowerCase(Locale.ROOT).replace('*','%');
-              if (first)
-                first = false;
-              else
-                fsb.append(" or ");
-              fsb.append("lower(FileType) like '").append(type).append("'");
-            }
-          }
-        }
-        else if (n.getType().equals("allmetadata"))
-        {
-          String isAll = n.getAttributeValue("all");
-          if (isAll != null && isAll.equals("true"))
-            includeAllMetadata = true;
-        }
-        else if (n.getType().equals("metadata"))
-        {
-          String category = n.getAttributeValue("category");
-          String attributeName = n.getAttributeValue("attribute");
-          String isAll = n.getAttributeValue("all");
-          if (isAll != null && isAll.equals("true"))
-          {
-            // Locate all metadata items for the specified category path,
-            // and enter them into the array
-            getSession();
-            String[] attrs = getCategoryAttributes(llc,category);
-            if (attrs != null)
-            {
-              int j = 0;
-              while (j < attrs.length)
-              {
-                attributeName = attrs[j++];
-                String metadataName = packCategoryAttribute(category,attributeName);
-                holder.add(metadataName);
-              }
-            }
-          }
-          else
-          {
-            String metadataName = packCategoryAttribute(category,attributeName);
-            holder.add(metadataName);
-          }
-
-        }
-      }
-      
-      this.includeAllMetadata = includeAllMetadata;
-      this.pathAttributeName = pathAttributeName;
-      this.pathSeparator = pathSeparator;
-      this.securityOn = securityOn;
-      String filterStringPiece = fsb.toString();
-      if (filterStringPiece.length() == 0)
-        this.filterString = "0>1";
-      else
-      {
-        StringBuilder sb = new StringBuilder();
-        sb.append("SubType=").append(new Integer(LAPI_DOCUMENTS.FOLDERSUBTYPE).toString());
-        sb.append(" or SubType=").append(new Integer(LAPI_DOCUMENTS.COMPOUNDDOCUMENTSUBTYPE).toString());
-        sb.append(" or SubType=").append(new Integer(LAPI_DOCUMENTS.PROJECTSUBTYPE).toString());
-        sb.append(" or (SubType=").append(new Integer(LAPI_DOCUMENTS.DOCUMENTSUBTYPE).toString());
-        sb.append(" and (");
-        // Walk through the document spec to find the documents that match under the specified root
-        // include lower(column)=spec
-        sb.append(filterStringPiece);
-        sb.append("))");
-        this.filterString = sb.toString();
-      }
-    }
-
-    public boolean includeAllMetadata()
-    {
-      return includeAllMetadata;
-    }
-    
-    public String[] getMetadataAttributes()
-    {
-      // Put into an array
-      String[] specifiedMetadataAttributes = new String[holder.size()];
-      int i = 0;
-      for (String attrName : holder)
-      {
-        specifiedMetadataAttributes[i++] = attrName;
-      }
-      return specifiedMetadataAttributes;
-    }
-    
-    public String getFilterString()
-    {
-      return filterString;
-    }
-    
-    public String[] getAcls()
-    {
-      if (!securityOn)
-        return null;
-
-      String[] rval = new String[aclMap.size()];
-      int i = 0;
-      for (String token : aclMap)
-      {
-        rval[i++] = token;
-      }
-      return rval;
-    }
-  
-    /** Get the path attribute name.
-    *@return the path attribute name, or null if none specified.
-    */
-    public String getPathAttributeName()
-    {
-      return pathAttributeName;
-    }
-
-    /** Get the path separator.
-    */
-    public String getPathSeparator()
-    {
-      return pathSeparator;
-    }
-    
-    /** Given an identifier, get the translated string that goes into the metadata.
-    */
-    public String getPathAttributeValue(String documentIdentifier)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      String path = getNodePathString(documentIdentifier);
-      if (path == null)
-        return null;
-      return matchMap.translate(path);
-    }
-
-    /** Get the matchmap string.
-    */
-    public String getMatchMapString()
-    {
-      return matchMap.toString();
-    }
-    
-    /** For a given node, get its path.
-    */
-    public String getNodePathString(String documentIdentifier)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Looking up path for '"+documentIdentifier+"'");
-      String path = pathMap.get(documentIdentifier);
-      if (path == null)
-      {
-        // Not yet present.  Look it up, recursively
-        String identifierPart = documentIdentifier;
-        // Get the current node's name first
-        // D = Document; anything else = Folder
-        if (identifierPart.startsWith("D") || identifierPart.startsWith("F"))
-        {
-          // Strip off the letter
-          identifierPart = identifierPart.substring(1);
-        }
-        // See if there's a volume label; if not, use the default.
-        int colonPosition = identifierPart.indexOf(":");
-        int volumeID;
-        int objectID;
-        try
-        {
-          if (colonPosition == -1)
-          {
-            // Default volume ID
-            volumeID = LLENTWK_VOL;
-            objectID = Integer.parseInt(identifierPart);
-          }
-          else
-          {
-            volumeID = Integer.parseInt(identifierPart.substring(0,colonPosition));
-            objectID = Integer.parseInt(identifierPart.substring(colonPosition+1));
-          }
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad document identifier: "+e.getMessage(),e);
-        }
-
-        ObjectInformation objInfo = llc.getObjectInformation(volumeID,objectID);
-        if (!objInfo.exists())
-        {
-          // The document identifier describes a path that does not exist.
-          // This is unexpected, but don't die: just log a warning and allow the higher level to deal with it.
-          Logging.connectors.warn("Livelink: Bad document identifier: '"+documentIdentifier+"' apparently does not exist, but need to find its path");
-          return null;
-        }
-
-        // Get the name attribute
-        String name = objInfo.getName();
-        // Get the parentID attribute
-        int parentID = objInfo.getParentId().intValue();
-        if (parentID == -1)
-          path = name;
-        else
-        {
-          String parentIdentifier = "F"+Integer.toString(volumeID)+":"+Integer.toString(parentID);
-          String parentPath = getNodePathString(parentIdentifier);
-          if (parentPath == null)
-            return null;
-          path = parentPath + pathSeparator + name;
-        }
-
-        pathMap.put(documentIdentifier,path);
-      }
-
-      return path;
-    }
-  }
-
-
-  /** Class that manages to find catid's and attribute names that have been specified.
-  * This accepts a part of the version string which contains the string-ified metadata
-  * spec, rather than pulling it out of the document specification.  That guarantees that
-  * the version string actually corresponds to the document that was ingested.
-  */
-  protected class MetadataDescription
-  {
-    protected final LivelinkContext llc;
-    
-    // This is a map of category name to category ID and attributes
-    protected final Map<String,MetadataPathItem> categoryMap = new HashMap<String,MetadataPathItem>();
-
-    /** Constructor.
-    */
-    public MetadataDescription(LivelinkContext llc)
-    {
-      this.llc = llc;
-    }
-
-    /** Iterate over the metadata items represented by the specified chunk of version string.
-    *@return an iterator over MetadataItem objects.
-    */
-    public Iterator<MetadataItem> getItems(String[] metadataItems)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // This is the map that will be iterated over for a return value.
-      // It gets built out of (hopefully cached) data from categoryMap.
-      Map<String,MetadataItem> newMap = new HashMap<String,MetadataItem>();
-
-      // Start at root
-      ObjectInformation rootValue = null;
-
-      // Walk through string and process each metadata element in turn.
-      for (String metadataSpec : metadataItems)
-      {
-        StringBuilder categoryBuffer = new StringBuilder();
-        StringBuilder attributeBuffer = new StringBuilder();
-        unpackCategoryAttribute(categoryBuffer,attributeBuffer,metadataSpec);
-        String category = categoryBuffer.toString();
-        String attributeName = attributeBuffer.toString();
-
-        // If there's already an entry for this category in the return map, use it
-        MetadataItem mi = newMap.get(category);
-        if (mi == null)
-        {
-          // Now, look up the node information
-          // Convert category to cat id.
-          MetadataPathItem item = categoryMap.get(category);
-          if (item == null)
-          {
-            RootValue rv = new RootValue(llc,category);
-            if (rootValue == null)
-            {
-              rootValue = rv.getRootValue();
-            }
-
-            // Get the object id of the category the path describes.
-            // NOTE: We don't use the RootValue version of getCategoryId because
-            // we want to use the cached value of rootValue, if it was around.
-            int catObjectID = rootValue.getCategoryId(rv.getRemainderPath());
-            if (catObjectID != -1)
-            {
-              item = new MetadataPathItem(catObjectID,rv.getRemainderPath());
-              categoryMap.put(category,item);
-            }
-          }
-          mi = new MetadataItem(item);
-          newMap.put(category,mi);
-        }
-        // Add attribute name to category
-        mi.addAttribute(attributeName);
-      }
-
-      return newMap.values().iterator();
-    }
-
-  }
-
-
-  /** This class caches the category path strings associated with a given category object identifier.
-  * The goal is to allow reasonably speedy lookup of the path name, so we can put it into the metadata part of the
-  * version string.
-  */
-  protected class CategoryPathAccumulator
-  {
-    // Livelink context
-    protected final LivelinkContext llc;
-    
-    // This is the map from category ID to category path name.
-    // It's keyed by an Integer formed from the id, and has String values.
-    protected final Map<Integer,String> categoryPathMap = new HashMap<Integer,String>();
-
-    // This is the map from category ID to attribute names.  Keyed
-    // by an Integer formed from the id, and has a String[] value.
-    protected final Map<Integer,String[]> attributeMap = new HashMap<Integer,String[]>();
-
-    /** Constructor */
-    public CategoryPathAccumulator(LivelinkContext llc)
-    {
-      this.llc = llc;
-    }
-
-    /** Get a specified set of packed category paths with attribute names, given the category identifiers */
-    public String[] getCategoryPathsAttributeNames(int[] catIDs)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      Set<String> set = new HashSet<String>();
-      for (int x : catIDs)
-      {
-        Integer key = new Integer(x);
-        String pathValue = categoryPathMap.get(key);
-        if (pathValue == null)
-        {
-          // Chase the path back up the chain
-          pathValue = findPath(key.intValue());
-          if (pathValue == null)
-            continue;
-          categoryPathMap.put(key,pathValue);
-        }
-        String[] attributeNames = attributeMap.get(key);
-        if (attributeNames == null)
-        {
-          // Get the attributes for this category
-          attributeNames = findAttributes(key.intValue());
-          if (attributeNames == null)
-            continue;
-          attributeMap.put(key,attributeNames);
-        }
-        // Now, put the path and the attributes into the hash.
-        for (String attributeName : attributeNames)
-        {
-          String metadataName = packCategoryAttribute(pathValue,attributeName);
-          set.add(metadataName);
-        }
-      }
-
-      String[] rval = new String[set.size()];
-      int i = 0;
-      for (String value : set)
-      {
-        rval[i++] = value;
-      }
-
-      return rval;
-    }
-
-    /** Find a category path given a category ID */
-    protected String findPath(int catID)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return getObjectPath(llc.getObjectInformation(0,catID));
-    }
-
-    /** Get the complete path for an object.
-    */
-    protected String getObjectPath(ObjectInformation currentObject)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      String path = null;
-      while (true)
-      {
-        if (currentObject.isCategoryWorkspace())
-          return CATEGORY_NAME + ((path==null)?"":":" + path);
-        else if (currentObject.isEntityWorkspace())
-          return ENTWKSPACE_NAME + ((path==null)?"":":" + path);
-
-        if (!currentObject.exists())
-        {
-          // The document identifier describes a path that does not exist.
-          // This is unexpected, but an exception would terminate the job, and we don't want that.
-          Logging.connectors.warn("Livelink: Bad identifier found? "+currentObject.toString()+" apparently does not exist, but need to look up its path");
-          return null;
-        }
-
-        // Get the name attribute
-        String name = currentObject.getName();
-        if (path == null)
-          path = name;
-        else
-          path = name + "/" + path;
-
-        // Get the parentID attribute
-        int parentID = currentObject.getParentId().intValue();
-        if (parentID == -1)
-        {
-          // Oops, hit the top of the path without finding the workspace we're in.
-          // No idea where it lives; note this condition and exit.
-          Logging.connectors.warn("Livelink: Object ID "+currentObject.toString()+" doesn't seem to live in enterprise or category workspace!  Path I got was '"+path+"'");
-          return null;
-        }
-        currentObject = llc.getObjectInformation(0,parentID);
-      }
-    }
-
-    /** Find a set of attributes given a category ID */
-    protected String[] findAttributes(int catID)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return getCategoryAttributes(catID);
-    }
-
-  }
-
-  /** Class representing a root value object, plus remainder string.
-  * This class peels off the workspace name prefix from a path string or
-  * attribute string, and finds the right workspace root node and remainder
-  * path.
-  */
-  protected class RootValue
-  {
-    protected final LivelinkContext llc;
-    protected final String workspaceName;
-    protected ObjectInformation rootValue = null;
-    protected final String remainderPath;
-
-    /** Constructor.
-    *@param pathString is the path string.
-    */
-    public RootValue(LivelinkContext llc, String pathString)
-    {
-      this.llc = llc;
-      int colonPos = pathString.indexOf(":");
-      if (colonPos == -1)
-      {
-        remainderPath = pathString;
-        workspaceName = ENTWKSPACE_NAME;
-      }
-      else
-      {
-        workspaceName = pathString.substring(0,colonPos);
-        remainderPath = pathString.substring(colonPos+1);
-      }
-    }
-
-    /** Get the path string.
-    *@return the path string (without the workspace name prefix).
-    */
-    public String getRemainderPath()
-    {
-      return remainderPath;
-    }
-
-    /** Get the root node.
-    *@return the root node.
-    */
-    public ObjectInformation getRootValue()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (rootValue == null)
-      {
-        if (workspaceName.equals(CATEGORY_NAME))
-          rootValue = llc.getObjectInformation(LLCATWK_VOL,LLCATWK_ID);
-        else if (workspaceName.equals(ENTWKSPACE_NAME))
-          rootValue = llc.getObjectInformation(LLENTWK_VOL,LLENTWK_ID);
-        else
-          throw new ManifoldCFException("Bad workspace name: "+workspaceName);
-      }
-      
-      if (!rootValue.exists())
-      {
-        Logging.connectors.warn("Livelink: Could not get workspace/volume ID!  Retrying...");
-        // This cannot mean a real failure; it MUST mean that we have had an intermittent communication hiccup.  So, pass it off as a service interruption.
-        throw new ServiceInterruption("Service interruption getting root value",new ManifoldCFException("Could not get workspace/volume id"),System.currentTimeMillis()+60000L,
-          System.currentTimeMillis()+600000L,-1,true);
-      }
-
-      return rootValue;
-    }
-  }
-
-  // Here's an interesting note.  All of the LAPI exceptions are subclassed off of RuntimeException.  This makes life
-  // hell because there is no superclass exception to capture, and even tweaky server communication issues wind up throwing
-  // uncaught RuntimeException's up the stack.
-  //
-  // To fix this rather bad design, all places that invoke LAPI need to catch RuntimeException and run it through the following
-  // method for interpretation and logging.
-  //
-
-  /** Interpret runtimeexception to search for livelink API errors.  Throws an appropriately reinterpreted exception, or
-  * just returns if the exception indicates that a short-cycle retry attempt should be made.  (In that case, the appropriate
-  * wait has been already performed).
-  *@param e is the RuntimeException caught
-  *@param failIfTimeout is true if, for transient conditions, we want to signal failure if the timeout condition is acheived.
-  */
-  protected int handleLivelinkRuntimeException(RuntimeException e, int sanityRetryCount, boolean failIfTimeout)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (
-      e instanceof com.opentext.api.LLHTTPAccessDeniedException ||
-      e instanceof com.opentext.api.LLHTTPClientException ||
-      e instanceof com.opentext.api.LLHTTPServerException ||
-      e instanceof com.opentext.api.LLIndexOutOfBoundsException ||
-      e instanceof com.opentext.api.LLNoFieldSpecifiedException ||
-      e instanceof com.opentext.api.LLNoValueSpecifiedException ||
-      e instanceof com.opentext.api.LLSecurityProviderException ||
-      e instanceof com.opentext.api.LLUnknownFieldException ||
-      e instanceof NumberFormatException ||
-      e instanceof ArrayIndexOutOfBoundsException
-    )
-    {
-      String details = llServer.getErrors();
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Livelink API error: "+e.getMessage()+((details==null)?"":"; "+details),e,currentTime + 5*60000L,currentTime+12*60*60000L,-1,failIfTimeout);
-    }
-    else if (
-      e instanceof com.opentext.api.LLBadServerCertificateException ||
-      e instanceof com.opentext.api.LLHTTPCGINotFoundException ||
-      e instanceof com.opentext.api.LLCouldNotConnectHTTPException ||
-      e instanceof com.opentext.api.LLHTTPForbiddenException ||
-      e instanceof com.opentext.api.LLHTTPProxyAuthRequiredException ||
-      e instanceof com.opentext.api.LLHTTPRedirectionException ||
-      e instanceof com.opentext.api.LLUnsupportedAuthMethodException ||
-      e instanceof com.opentext.api.LLWebAuthInitException
-    )
-    {
-      String details = llServer.getErrors();
-      throw new ManifoldCFException("Livelink API error: "+e.getMessage()+((details==null)?"":"; "+details),e);
-    }
-    else if (e instanceof com.opentext.api.LLSSLNotAvailableException)
-    {
-      String details = llServer.getErrors();
-      throw new ManifoldCFException("Missing llssl.jar error: "+e.getMessage()+((details==null)?"":"; "+details),e);
-    }
-    else if (e instanceof com.opentext.api.LLIllegalOperationException)
-    {
-      // This usually means that LAPI has had a minor communication difficulty but hasn't reported it accurately.
-      // We *could* throw a ServiceInterruption, but OpenText recommends to just retry almost immediately.
-      String details = llServer.getErrors();
-      return assessRetry(sanityRetryCount,new ManifoldCFException("Livelink API illegal operation error: "+e.getMessage()+((details==null)?"":"; "+details),e));
-    }
-    else if (e instanceof com.opentext.api.LLIOException || (e instanceof RuntimeException && e.getClass().getName().startsWith("com.opentext.api.")))
-    {
-      // Catching obfuscated and unspecified opentext runtime exceptions now too - these come from llssl.jar.  We
-      // have to presume these are SSL connection errors; nothing else to go by unfortunately.  UGH.
-      
-      // Treat this as a transient error; try again in 5 minutes, and only fail after 12 hours of trying
-
-      // LAPI is returning errors that are not terribly explicit, and I don't have control over their wording, so check that server can be resolved by DNS,
-      // so that a better error message can be returned.
-      try
-      {
-        InetAddress.getByName(serverName);
-      }
-      catch (UnknownHostException e2)
-      {
-        throw new ManifoldCFException("Server name '"+serverName+"' cannot be resolved",e2);
-      }
-
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption(e.getMessage(),e,currentTime + 5*60000L,currentTime+12*60*60000L,-1,failIfTimeout);
-    }
-    else
-      throw e;
-  }
-
-  /** Do a retry, or throw an exception if the retry count has been exhausted
-  */
-  protected static int assessRetry(int sanityRetryCount, ManifoldCFException e)
-    throws ManifoldCFException
-  {
-    if (sanityRetryCount == 0)
-    {
-      throw e;
-    }
-
-    sanityRetryCount--;
-
-    try
-    {
-      ManifoldCF.sleep(1000L);
-    }
-    catch (InterruptedException e2)
-    {
-      throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-    }
-    // Exit the method
-    return sanityRetryCount;
-
-  }
-
-  /** This thread performs a LAPI FetchVersion command, streaming the resulting
-  * document back through a XThreadInputStream to the invoking thread.
-  */
-  protected class DocumentReadingThread extends Thread 
-  {
-
-    protected Throwable exception = null;
-    protected final int volumeID;
-    protected final int docID;
-    protected final int versionNumber;
-    protected final XThreadInputStream stream;
-    
-    public DocumentReadingThread(int volumeID, int docID, int versionNumber)
-    {
-      super();
-      this.volumeID = volumeID;
-      this.docID = docID;
-      this.versionNumber = versionNumber;
-      this.stream = new XThreadInputStream();
-      setDaemon(true);
-    }
-
-    @Override
-    public void run()
-    {
-      try
-      {
-        XThreadOutputStream outputStream = new XThreadOutputStream(stream);
-        try 
-        {
-          int status = LLDocs.FetchVersion(volumeID, docID, versionNumber, outputStream);
-          if (status != 0)
-          {
-            throw new ManifoldCFException("Error retrieving contents of document "+Integer.toString(volumeID)+":"+Integer.toString(docID)+" revision "+versionNumber+" : Status="+Integer.toString(status)+" ("+llServer.getErrors()+")");
-          }
-        }
-        finally
-        {
-          outputStream.close();
-        }
-      } catch (Throwable e) {
-        this.exception = e;
-      }
-    }
-
-    public InputStream getSafeInputStream() {
-      return stream;
-    }
-    
-    public void finishUp()
-      throws InterruptedException, ManifoldCFException
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      stream.abort();
-      join();
-      Throwable thr = exception;
-      if (thr != null) {
-        if (thr instanceof ManifoldCFException)
-          throw (ManifoldCFException) thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException) thr;
-        else if (thr instanceof Error)
-          throw (Error) thr;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+thr.getClass().getName(),thr);
-      }
-    }
-
-  }
-
-  /** This thread does the actual socket communication with the server.
-  * It's set up so that it can be abandoned at shutdown time.
-  *
-  * The way it works is as follows:
-  * - it starts the transaction
-  * - it receives the response, and saves that for the calling class to inspect
-  * - it transfers the data part to an input stream provided to the calling class
-  * - it shuts the connection down
-  *
-  * If there is an error, the sequence is aborted, and an exception is recorded
-  * for the calling class to examine.
-  *
-  * The calling class basically accepts the sequence above.  It starts the
-  * thread, and tries to get a response code.  If instead an exception is seen,
-  * the exception is thrown up the stack.
-  */
-  protected static class ExecuteMethodThread extends Thread
-  {
-    /** Client and method, all preconfigured */
-    protected final HttpClient httpClient;
-    protected final HttpRequestBase executeMethod;
-    
-    protected HttpResponse response = null;
-    protected Throwable responseException = null;
-    protected XThreadInputStream threadStream = null;
-    protected InputStream bodyStream = null;
-    protected boolean streamCreated = false;
-    protected Throwable streamException = null;
-    protected boolean abortThread = false;
-
-    protected Throwable shutdownException = null;
-
-    protected Throwable generalException = null;
-    
-    public ExecuteMethodThread(HttpClient httpClient, HttpRequestBase executeMethod)
-    {
-      super();
-      setDaemon(true);
-      this.httpClient = httpClient;
-      this.executeMethod = executeMethod;
-    }
-
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          // Call the execute method appropriately
-          synchronized (this)
-          {
-            if (!abortThread)
-            {
-              try
-              {
-                response = httpClient.execute(executeMethod);
-              }
-              catch (java.net.SocketTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (ConnectTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (InterruptedIOException e)
-              {
-                throw e;
-              }
-              catch (Throwable e)
-              {
-                responseException = e;
-              }
-              this.notifyAll();
-            }
-          }
-          
-          // Start the transfer of the content
-          if (responseException == null)
-          {
-            synchronized (this)
-            {
-              if (!abortThread)
-              {
-                try
-                {
-                  bodyStream = response.getEntity().getContent();
-                  if (bodyStream != null)
-                  {
-                    threadStream = new XThreadInputStream(bodyStream);
-                  }
-                  streamCreated = true;
-                }
-                catch (java.net.SocketTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (ConnectTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (InterruptedIOException e)
-                {
-                  throw e;
-                }
-                catch (Throwable e)
-                {
-                  streamException = e;
-                }
-                this.notifyAll();
-              }
-            }
-          }
-          
-          if (responseException == null && streamException == null)
-          {
-            if (threadStream != null)
-            {
-              // Stuff the content until we are done
-              threadStream.stuffQueue();
-            }
-          }
-          
-        }
-        finally
-        {
-          if (bodyStream != null)
-          {
-            try
-            {
-              bodyStream.close();
-            }
-            catch (IOException e)
-            {
-            }
-            bodyStream = null;
-          }
-          synchronized (this)
-          {
-            try
-            {
-              executeMethod.abort();
-            }
-            catch (Throwable e)
-            {
-              shutdownException = e;
-            }
-            this.notifyAll();
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        // We catch exceptions here that should ONLY be InterruptedExceptions, as a result of the thread being aborted.
-        this.generalException = e;
-      }
-    }
-
-    public int getResponseCode()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until the response object is there
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-            return response.getStatusLine().getStatusCode();
-          wait();
-        }
-      }
-    }
-
-    public long getResponseContentLength()
-      throws InterruptedException, IOException, HttpException
-    {
-      String contentLength = getFirstHeader("Content-Length");
-      if (contentLength == null || contentLength.length() == 0)
-        return -1L;
-      return new Long(contentLength.trim()).longValue();
-    }
-    
-    public String getFirstHeader(String headerName)
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait for the response object to appear
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-          {
-            Header h = response.getFirstHeader(headerName);
-            if (h == null)
-              return null;
-            return h.getValue();
-          }
-          wait();
-        }
-      }
-    }
-
-    public InputStream getSafeInputStream()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          checkException(streamException);
-          if (streamCreated)
-            return threadStream;
-          wait();
-        }
-      }
-    }
-    
-    public void abort()
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      synchronized (this)
-      {
-        if (streamCreated)
-        {
-          if (threadStream != null)
-            threadStream.abort();
-        }
-        abortThread = true;
-      }
-    }
-    
-    public void finishUp()
-      throws InterruptedException
-    {
-      join();
-    }
-    
-    protected synchronized void checkException(Throwable exception)
-      throws IOException, HttpException
-    {
-      if (exception != null)
-      {
-        // Throw the current exception, but clear it, so no further throwing is possible on the same problem.
-        Throwable e = exception;
-        if (e instanceof IOException)
-          throw (IOException)e;
-        else if (e instanceof HttpException)
-          throw (HttpException)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof Error)
-          throw (Error)e;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
-      }
-    }
-
-  }
-  
-}
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/MatchMap.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/MatchMap.java
deleted file mode 100644
index 7f4266a..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/MatchMap.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/* $Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.livelink;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** An instance of this class describes a "match map", which describes a translation of an input
-* string using regexp technology.
-* A match map consists of multiple clauses, which are fired in sequence.  Each clause is a regexp
-* search and replace, where the replace string can include references to the groups present in the
-* search regexp.
-* MatchMaps can be converted to strings in two different ways.  The first way is to build a single
-* string of the form "match1=replace1&match2=replace2...".  Strings of this kind must escape & and =
-* characters in the match and replace strings, where found.  The second way is to generate an array
-* of match strings and a corresponding array of replace strings.  This method requires no escaping
-* of the string contents.
-*/
-public class MatchMap
-{
-  public static final String _rcsid = "@(#)$Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the set of match regexp strings */
-  protected ArrayList matchStrings;
-  /** This is the set of Pattern objects corresponding to the match regexp strings.
-  * It's null if the patterns have not been built yet. */
-  protected Pattern[] matchPatterns = null;
-  /** This is the set of replace strings */
-  protected ArrayList replaceStrings;
-
-  /** Constructor.  Build an empty matchmap. */
-  public MatchMap()
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-  }
-
-  /** Constructor.  Build a matchmap from a single string. */
-  public MatchMap(String stringForm)
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-    StringBuilder matchString = new StringBuilder();
-    StringBuilder replaceString = new StringBuilder();
-    int i = 0;
-    while (i < stringForm.length())
-    {
-      matchString.setLength(0);
-      replaceString.setLength(0);
-      while (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&' || x == '=')
-          break;
-        i++;
-        if (x == '\\' && i < stringForm.length())
-          x = stringForm.charAt(i++);
-        matchString.append(x);
-      }
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '=')
-        {
-          i++;
-          // Pick up the second string
-          while (i < stringForm.length())
-          {
-            x = stringForm.charAt(i);
-            if (x == '&')
-              break;
-            i++;
-            if (x == '\\' && i < stringForm.length())
-              x = stringForm.charAt(i++);
-            replaceString.append(x);
-          }
-        }
-      }
-
-      matchStrings.add(matchString.toString());
-      replaceStrings.add(replaceString.toString());
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&')
-          i++;
-      }
-    }
-  }
-
-  /** Constructor.  Build a matchmap from two arraylists representing match and replace strings */
-  public MatchMap(ArrayList matchStrings, ArrayList replaceStrings)
-  {
-    this.matchStrings = (ArrayList)matchStrings.clone();
-    this.replaceStrings = (ArrayList)replaceStrings.clone();
-  }
-
-  /** Get the number of match/replace strings */
-  public int getMatchCount()
-  {
-    return matchStrings.size();
-  }
-
-  /** Get a specific match string */
-  public String getMatchString(int index)
-  {
-    return (String)matchStrings.get(index);
-  }
-
-  /** Get a specific replace string */
-  public String getReplaceString(int index)
-  {
-    return (String)replaceStrings.get(index);
-  }
-
-  /** Delete a specified match/replace string pair */
-  public void deleteMatchPair(int index)
-  {
-    matchStrings.remove(index);
-    replaceStrings.remove(index);
-    matchPatterns = null;
-  }
-
-  /** Insert a match/replace string pair */
-  public void insertMatchPair(int index, String match, String replace)
-  {
-    matchStrings.add(index,match);
-    replaceStrings.add(index,replace);
-    matchPatterns = null;
-  }
-
-  /** Append a match/replace string pair */
-  public void appendMatchPair(String match, String replace)
-  {
-    matchStrings.add(match);
-    replaceStrings.add(replace);
-    matchPatterns = null;
-  }
-
-  /** Append old-style match/replace pair.
-  * This method translates old-style regexp and group output form to the
-  * current style before adding to the map.
-  */
-  public void appendOldstyleMatchPair(String oldstyleMatch, String oldstyleReplace)
-  {
-    String newStyleMatch = "^" + oldstyleMatch + "$";
-
-    // Need to build a new-style replace string from the old one.  To do that, use the
-    // original parser (which basically will guarantee that we get it right)
-
-    EvaluatorTokenStream et = new EvaluatorTokenStream(oldstyleReplace);
-    StringBuilder newStyleReplace = new StringBuilder();
-
-    while (true)
-    {
-      EvaluatorToken t = et.peek();
-      if (t == null)
-        break;
-      switch (t.getType())
-      {
-      case EvaluatorToken.TYPE_COMMA:
-        et.advance();
-        break;
-      case EvaluatorToken.TYPE_GROUP:
-        et.advance();
-        int groupNumber = t.getGroupNumber();
-        switch (t.getGroupStyle())
-        {
-        case EvaluatorToken.GROUPSTYLE_NONE:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append(")");
-          break;
-        case EvaluatorToken.GROUPSTYLE_LOWER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("l)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_UPPER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("u)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_MIXED:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("m)");
-          break;
-        default:
-          break;
-        }
-        break;
-      case EvaluatorToken.TYPE_TEXT:
-        et.advance();
-        escape(newStyleReplace,t.getTextValue());
-        break;
-      default:
-        break;
-      }
-    }
-
-    appendMatchPair(newStyleMatch,newStyleReplace.toString());
-  }
-
-  /** Escape a string so it is verbatim */
-  protected static void escape(StringBuilder output, String input)
-  {
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '$')
-        output.append(x);
-      output.append(x);
-    }
-  }
-
-  /** Convert the matchmap to string form. */
-  public String toString()
-  {
-    int i = 0;
-    StringBuilder rval = new StringBuilder();
-    while (i < matchStrings.size())
-    {
-      String matchString = (String)matchStrings.get(i);
-      String replaceString = (String)replaceStrings.get(i);
-      if (i > 0)
-        rval.append('&');
-      stuff(rval,matchString);
-      rval.append('=');
-      stuff(rval,replaceString);
-      i++;
-    }
-    return rval.toString();
-  }
-
-  /** Stuff characters */
-  protected static void stuff(StringBuilder sb, String value)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '&' || x == '=')
-        sb.append('\\');
-      sb.append(x);
-    }
-  }
-
-  /** Perform a translation.
-  */
-  public String translate(String input)
-    throws ManifoldCFException
-  {
-    // Build pattern vector if not already there
-    if (matchPatterns == null)
-    {
-      matchPatterns = new Pattern[matchStrings.size()];
-      int i = 0;
-      while (i < matchPatterns.length)
-      {
-        String regexp = (String)matchStrings.get(i);
-        try
-        {
-          matchPatterns[i] = Pattern.compile(regexp);
-        }
-        catch (java.util.regex.PatternSyntaxException e)
-        {
-          matchPatterns = null;
-          throw new ManifoldCFException("For match expression '"+regexp+"', found pattern syntax error: "+e.getMessage(),e);
-        }
-        i++;
-      }
-    }
-
-    int j = 0;
-    while (j < matchPatterns.length)
-    {
-      Pattern p = matchPatterns[j];
-      // Construct a matcher
-      Matcher m = p.matcher(input);
-      // Grab the output description
-      String outputDescription = (String)replaceStrings.get(j);
-      j++;
-      // Create a copy buffer
-      StringBuilder outputBuffer = new StringBuilder();
-      // Keep track of the index in the original string we have done up to
-      int currentIndex = 0;
-      // Scan the string using find, and for each one found, do a translation
-      while (true)
-      {
-        boolean foundOne = m.find();
-        if (foundOne == false)
-        {
-          // No subsequent match found.
-          // Copy everything from currentIndex until the end of input
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-
-        // Do a translation.  This involves copying everything in the input
-        // string up until the start of the match, then doing a replace for
-        // the match itself, and finally setting the currentIndex to the end
-        // of the match.
-
-        int matchStart = m.start(0);
-        int matchEnd = m.end(0);
-        if (matchStart == -1)
-        {
-          // The expression was degenerate; treat this as the end.
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-        outputBuffer.append(input.substring(currentIndex,matchStart));
-
-        // Process translation description!
-        int i = 0;
-        while (i < outputDescription.length())
-        {
-          char x = outputDescription.charAt(i++);
-          if (x == '$' && i < outputDescription.length())
-          {
-            x = outputDescription.charAt(i++);
-            if (x == '(')
-            {
-              // Process evaluation expression
-              StringBuilder numberBuf = new StringBuilder();
-              boolean upper = false;
-              boolean lower = false;
-              boolean mixed = false;
-              while (i < outputDescription.length())
-              {
-                char y = outputDescription.charAt(i++);
-                if (y == ')')
-                  break;
-                else if (y >= '0' && y <= '9')
-                  numberBuf.append(y);
-                else if (y == 'u' || y == 'U')
-                  upper = true;
-                else if (y == 'l' || y == 'L')
-                  lower = true;
-                else if (y == 'm' || y == 'M')
-                  mixed = true;
-              }
-              String number = numberBuf.toString();
-              try
-              {
-                int groupnum = Integer.parseInt(number);
-                String groupValue = m.group(groupnum);
-                if (upper)
-                  outputBuffer.append(groupValue.toUpperCase(Locale.ROOT));
-                else if (lower)
-                  outputBuffer.append(groupValue.toLowerCase(Locale.ROOT));
-                else if (mixed && groupValue.length() > 0)
-                  outputBuffer.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT)).append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-                else
-                  outputBuffer.append(groupValue);
-
-              }
-              catch (NumberFormatException e)
-              {
-                // Silently skip, because it's an illegal group number, so nothing
-                // gets added.
-              }
-
-              // Go back around, so we don't add the $ in
-              continue;
-            }
-          }
-          outputBuffer.append(x);
-        }
-
-        currentIndex = matchEnd;
-      }
-
-      input = outputBuffer.toString();
-    }
-
-    return input;
-  }
-
-
-  // Protected classes
-
-  // These classes are used to process the old token-based replacement strings
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-}
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/Messages.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/Messages.java
deleted file mode 100644
index 9c152d4..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.livelink;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.livelink.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.livelink";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/livelink/LLSERVER.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/livelink/LLSERVER.java
deleted file mode 100644
index b8b1ac4..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/livelink/LLSERVER.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/* $Id: LLSERVER.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.livelink;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.common.Base64;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-import com.opentext.api.LLSession;
-import com.opentext.api.LLValue;
-
-/**
-* @author Riccardo, modified extensively by Karl Wright
-*
-* This class represents information about a particular
-* Livelink Server. It also maintains a particular server session.
-* NOTE: The original Volant code insisted at a fundamental level that there be only
-* one session per JVM.  Not sure why they did this, and this is a vile restriction
-* if true.  I've therefore reworked this class to be able to work in a multi-session
-* environment, if possible; the instantiator gets to determine how many there will be.
-*/
-public class LLSERVER
-{
-  public static final String _rcsid = "@(#)$Id: LLSERVER.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final boolean useHttp;
-  private final boolean useSSL;
-  private final String LLServer;
-  private final int LLPort;
-  private final String LLUser;
-  private final String LLPwd;
-  private final String httpCgiPath;
-  private final String httpNtlmDomain;
-  private final String httpNtlmUser;
-  private final String httpNtlmPassword;
-  private final IKeystoreManager keystore;
-  
-  private LLSession session = null;
-  private File certFolder = null;
-
-
-  public LLSERVER(boolean useHttp, boolean useSSL, String server, int port, String user, String pwd,
-    String httpCgiPath, String httpNtlmDomain, String httpNtlmUser, String httpNtlmPassword,
-    IKeystoreManager keystoreManager)
-    throws ManifoldCFException
-  {
-    this.useHttp = useHttp;
-    this.useSSL = useSSL;
-    LLServer = server;
-    LLPort = port;
-    LLUser = user;
-    LLPwd = pwd;
-    this.httpCgiPath = httpCgiPath;
-    this.httpNtlmDomain = httpNtlmDomain;
-    this.httpNtlmUser = httpNtlmUser;
-    this.httpNtlmPassword = httpNtlmPassword;
-    this.keystore = keystoreManager;
-
-    connect();
-  }
-
-  private void connect()
-    throws ManifoldCFException
-  {
-    try
-    {
-      LLValue configuration;
-
-      if (useHttp)
-      {
-        boolean useNTLM;
-        String userNameAndDomain;
-
-        if (httpNtlmDomain != null && httpNtlmUser != null)
-        {
-          useNTLM = true;
-          userNameAndDomain = httpNtlmDomain + "\\" + httpNtlmUser;
-        }
-        else
-        {
-          useNTLM = false;
-          userNameAndDomain = httpNtlmUser;
-        }
-        configuration = new LLValue();
-        configuration.setAssoc();
-        configuration.add("Encoding","UTF-8");
-        configuration.add("LivelinkCGI", httpCgiPath);
-        if (userNameAndDomain != null)
-        {
-          configuration.add("HTTPUserName", userNameAndDomain);
-          configuration.add("HTTPPassword", httpNtlmPassword);
-        }
-        if (useNTLM)
-          configuration.add("EnableNTLM", LLValue.LL_TRUE);
-        else
-          configuration.add("EnableNTLM", LLValue.LL_FALSE);
-
-        if (useSSL)
-        {
-          configuration.add("HTTPS", LLValue.LL_TRUE);
-          // Create the place to put the certs
-          createCertFolder();
-          if (keystore != null)
-          {
-            // Now, write the certs themselves
-            String[] aliases = keystore.getContents();
-            for (String alias : aliases)
-            {
-              java.security.cert.Certificate cert = keystore.getCertificate(alias);
-              byte[] certData = cert.getEncoded();
-              File fileName = new File(certFolder,ManifoldCF.safeFileName(alias) + ".cer");
-              OutputStream fos = new FileOutputStream(fileName);
-              try
-              {
-                Writer osw = new OutputStreamWriter(fos,StandardCharsets.UTF_8);
-                try
-                {
-                  String certBase64 = new Base64().encodeByteArray(certData);
-                  osw.write("-----BEGIN CERTIFICATE-----\n");
-                  int index = 0;
-                  while (true)
-                  {
-                    if (certBase64.length() - index > 64)
-                    {
-                      osw.write(certBase64.substring(index,index+64) + "\n");
-                      index += 64;
-                    }
-                    else
-                    {
-                      osw.write(certBase64.substring(index) + "\n");
-                      break;
-                    }
-                  }
-                  osw.write("-----END CERTIFICATE-----\n");
-                }
-                finally
-                {
-                  osw.flush();
-                }
-              }
-              finally
-              {
-                fos.flush();
-                fos.close();
-              }
-            }
-          }
-          LLValue rootCACertList = new LLValue();
-          LLSession.GetCARootCerts(certFolder.toString(),rootCACertList);
-          configuration.add("CARootCerts", rootCACertList);
-        }
-        else
-        {
-          configuration.add("HTTPS", LLValue.LL_FALSE);
-        }
-      }
-      else
-        configuration = null;
-
-      session = new LLSession (this.LLServer, this.LLPort, "", this.LLUser, this.LLPwd, configuration);
-    }
-    catch (IOException e)
-    {
-      releaseCertFolder();
-      throw new ManifoldCFException("IO Exception writing cert files: "+e.getMessage(),e);
-    }
-    catch (java.security.cert.CertificateEncodingException e)
-    {
-      releaseCertFolder();
-      throw new ManifoldCFException("Bad certificate: "+e.getMessage(),e);
-    }
-    catch (ManifoldCFException e)
-    {
-      releaseCertFolder();
-      throw e;
-    }
-    catch (Error e)
-    {
-      releaseCertFolder();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      releaseCertFolder();
-      throw e;
-    }
-  }
-
-
-  /**
-  * Disconnects
-  *
-  */
-  public void disconnect()
-  {
-    releaseCertFolder();
-    session = null;
-  }
-
-  /** Create temporary session-bound cert directory.
-  */
-  protected void createCertFolder()
-    throws ManifoldCFException
-  {
-    certFolder = ManifoldCF.createTempDir("llcrt_",".d");
-    ManifoldCF.addFile(certFolder);
-  }
-  
-  /** Release temporary session-bound cert directory.
-  */
-  protected void releaseCertFolder()
-  {
-    if (certFolder != null)
-    {
-      ManifoldCF.deleteFile(certFolder);
-      certFolder = null;
-    }
-  }
-
-  /**
-  * Returns the server name where the Livelink
-  * Server has been installed on
-  *
-  * @return the server name
-  */
-  public String getHost()
-  {
-
-    if (session != null)
-    {
-      return session.getHost();
-    }
-
-    return null;
-  }
-
-
-  /**
-  * Returns the port Livelink is listening on
-  * @return the port number
-  */
-  public int getPort ()
-  {
-
-    if (session != null)
-    {
-      return session.getPort();
-    }
-
-    return -1;
-  }
-
-
-  /**
-  * Returns the Livelink user currently connected
-  * to the Livelink Server
-  * @return the user name
-  */
-  public String getLLUser()
-  {
-
-    return LLUser;
-  }
-
-
-
-  /**
-  * Returns the password of the user currently connected
-  * to the Livelink Server
-  * @return the user password
-  */
-  public String getLLPwd()
-  {
-
-    return LLPwd;
-  }
-
-
-  /**
-  * Returns the Livelink session
-  * @return Livelink session
-  */
-  public LLSession getLLSession()
-  {
-
-    return session;
-  }
-
-  /**
-  * Get the current session errors as a string.
-  */
-  public String getErrors()
-  {
-    if (session == null)
-      return null;
-    StringBuilder rval = new StringBuilder();
-    if (session.getStatus() != 0)
-      rval.append("LAPI status code: ").append(session.getStatus());
-    if (session.getApiError().length() > 0)
-    {
-      if (rval.length() > 0)
-        rval.append("; ");
-      rval.append("LAPI error detail: ").append(session.getApiError());
-    }
-    if (session.getErrMsg().length() > 0)
-    {
-      if (rval.length() > 0)
-        rval.append("; ");
-      rval.append("LAPI error message: ").append(session.getErrMsg());
-    }
-    if (session.getStatusMessage().length() > 0)
-    {
-      if (rval.length() > 0)
-        rval.append("; ");
-      rval.append("LAPI status message: ").append(session.getStatusMessage());
-    }
-    if (rval.length() > 0)
-      return rval.toString();
-    return null;
-  }
-
-}
diff --git a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/livelink/LiveLinkParameters.java b/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/livelink/LiveLinkParameters.java
deleted file mode 100644
index f423be9..0000000
--- a/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/livelink/LiveLinkParameters.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id: LiveLinkParameters.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.livelink;
-
-/** This class describes live link connection parameters.
-*/
-public class LiveLinkParameters
-{
-  public static final String _rcsid = "@(#)$Id: LiveLinkParameters.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // These parameters are for ingestion: picking up a document after we discover it through LAPI
-  /** Ingestion CGI protocol */
-  public final static String ingestProtocol = "Protocol";
-  /** Ingestion CGI port **/
-  public final static String ingestPort = "Port";
-  /** Ingestion CGI path (path to fetch document from for ingestion) */
-  public final static String ingestCgiPath = "CGI path";
-  /** NTLM username */
-  public final static String ingestNtlmUsername = "NTLM user name";
-  /** NTLM password */
-  public final static String ingestNtlmPassword = "NTLM password";
-  /** NTLM domain (set if NTLM desired) */
-  public final static String ingestNtlmDomain = "NTLM domain";
-  /** Livelink SSL keystore */
-  public final static String ingestKeystore = "Livelink SSL keystore";
-  
-  // These parameters are for viewing: constructing a URL the user can use to view the document
-  /** View CGI protocol */
-  public final static String viewProtocol = "View protocol";
-  /** View CGI server name */
-  public final static String viewServerName = "View server name";
-  /** View CGI port **/
-  public final static String viewPort = "View port";
-  /** View CGI path (path to use for viewing) */
-  public final static String viewCgiPath = "View CGI path";
-  /** Document View Action**/
-  public final static String viewAction = "View Action";
-  
-  // These parameters are for LAPI
-  /** Connection options; choices are "internal", "http", "https" */
-  public final static String serverProtocol = "Server protocol";
-  /** Server name */
-  public final static String serverName = "Server name";
-  /** Server port */
-  public final static String serverPort = "Server port";
-  /** Server user */
-  public final static String serverUsername = "Server user name";
-  /** Server password */
-  public final static String serverPassword = "Server password";
-  /** Server CGI path (path to use for viewing) */
-  public final static String serverHTTPCgiPath = "Server HTTP CGI path";
-  /** Server domain, if NTLM */
-  public final static String serverHTTPNTLMDomain = "Server HTTP NTLM domain";
-  /** Server HTTP user */
-  public final static String serverHTTPNTLMUsername = "Server HTTP NTLM user name";
-  /** Server password */
-  public final static String serverHTTPNTLMPassword = "Server HTTP NTLM password";
-  /** Keystore for LAPI */
-  public final static String serverHTTPSKeystore = "Server HTTPS truststore";
-  
-  
-  // These parameters are for the LiveLink Authority
-  /** Cache time in seconds */
-  public final static String cacheLifetime = "Cache lifetime minutes";
-  /** Max LRU size */
-  public final static String cacheLRUSize = "Max cache LRU size";
-  
-}
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_en_US.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_en_US.properties
deleted file mode 100644
index baecde2..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_en_US.properties
+++ /dev/null
@@ -1,151 +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.
-
-LivelinkConnector.NoAccessTokensPresent=No access tokens present
-LivelinkConnector.NoAccessTokensSpecified=No access tokens specified
-LivelinkConnector.Cache=Cache
-LivelinkConnector.CacheLifetime=Cache lifetime:
-LivelinkConnector.CacheLRUSize=Cache LRU size:
-LivelinkConnector.minutes=minutes
-LivelinkConnector.Server=Server
-LivelinkConnector.DocumentAccess=Document Access
-LivelinkConnector.DocumentView=Document View
-LivelinkConnector.Paths=Paths
-LivelinkConnector.Filters=Filters
-LivelinkConnector.Security=Security
-LivelinkConnector.Metadata=Metadata
-LivelinkConnector.UserMapping=User Mapping
-LivelinkConnector.AValidNumberIsRequired=A valid number is required
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=User name regular expression must be valid regular expression
-LivelinkConnector.EnterALivelinkServerName=Enter a livelink server name
-LivelinkConnector.AServerPortNumberIsRequired=A server port number is required
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=User name regular expression cannot be null
-LivelinkConnector.ServerName=Server name:
-LivelinkConnector.ServerPort=Server port:
-LivelinkConnector.ServerUserName=Server user name:
-LivelinkConnector.ServerPassword=Server password:
-LivelinkConnector.UserNameRegularExpression=User name regular expression:
-LivelinkConnector.LivelinkUserExpression=Livelink user expression:
-LivelinkConnector.Parameters=Parameters:
-LivelinkConnector.ChooseACertificateFile=Choose a certificate file
-LivelinkConnector.AValidNumberIsRequired=A valid number is required
-LivelinkConnector.AValidNumberOrBlankIsRequired=A valid number, or blank, is required
-LivelinkConnector.EnterALivelinkServerName=Enter a livelink server name
-LivelinkConnector.AServerPortNumberIsRequired=A server port number is required
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=Enter the crawl cgi path to livelink
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=The ingest cgi path must begin with a / character
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=The view cgi path must be blank, or begin with a / character
-LivelinkConnector.DocumentFetchProtocol=Document fetch protocol:
-LivelinkConnector.DocumentFetchPort=Document fetch port:
-LivelinkConnector.DocumentFetchSSLCertificateList=Document fetch SSL certificate list:
-LivelinkConnector.NoCertificatesPresent=No certificates present
-LivelinkConnector.DeleteCert=Delete cert 
-LivelinkConnector.AddCert=Add cert
-LivelinkConnector.Certificate=Certificate:
-LivelinkConnector.DocumentFetchCGIPath=Document fetch CGI path:
-LivelinkConnector.DocumentFetchNTLMDomain=Document fetch NTLM domain:
-LivelinkConnector.SetIfNTLMAuthDesired=(set if NTLM auth desired)
-LivelinkConnector.DocumentFetchNTLMUserName=Document fetch NTLM user name:
-LivelinkConnector.SetIfDifferentFromServerUserName=(set if different from server user name)
-LivelinkConnector.DocumentFetchNTLMPassword=Document fetch NTLM password:
-LivelinkConnector.SetIfDifferentFromServerPassword=(set if different from server password)
-LivelinkConnector.DocumentViewProtocol=Document view protocol:
-LivelinkConnector.SameAsFetchProtocol=Same as fetch protocol
-LivelinkConnector.DocumentViewServerName=Document view server name:
-LivelinkConnector.BlankSameAsFetchServer=(blank = same as fetch server)
-LivelinkConnector.DocumentViewPort=Document view port:
-LivelinkConnector.DocumentViewCGIPath=Document view CGI path
-LivelinkConnector.Parameters=Parameters:
-LivelinkConnector.certificates= certificate(s)
-LivelinkConnector.SelectAFolderFirst=Select a folder first
-LivelinkConnector.TypeInAFileSpecification=Type in a file specification
-LivelinkConnector.TypeInAnAccessToken=Type in an access token
-LivelinkConnector.SelectAWorkspaceFirst=Select a workspace first
-LivelinkConnector.SelectACategoryFirst=Select a category first
-LivelinkConnector.SelectAtLeastOneAttributeFirst=Select at least one attribute first, and do not select the pulldown title
-LivelinkConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-LivelinkConnector.MatchStringMustBeValidRegularExpression=Match string must be valid regular expression
-LivelinkConnector.DeletePath=Delete path #
-LivelinkConnector.NoStartingPointsDefined=No starting points defined
-LivelinkConnector.AddPath=Add path
-LivelinkConnector.AddToPath=Add to path
-LivelinkConnector.PickAFolder=-- Pick a folder --
-LivelinkConnector.DeleteFilespec=Delete filespec #
-LivelinkConnector.NoIncludeExcludeFilesDefined=No include/exclude files defined
-LivelinkConnector.AddFileSpecification=Add file specification
-LivelinkConnector.Include=Include
-LivelinkConnector.Exclude=Exclude
-LivelinkConnector.SecurityColon=Security:
-LivelinkConnector.Enabled=Enabled
-LivelinkConnector.Disabled=Disabled
-LivelinkConnector.DeleteToken=Delete token #
-LivelinkConnector.AddAccessToken=Add access token
-LivelinkConnector.IngestALLMetadata=Ingest ALL metadata?
-LivelinkConnector.Yes=Yes
-LivelinkConnector.No=No
-LivelinkConnector.DeleteMetadata=Delete metadata #
-LivelinkConnector.NoMetadataSpecified=No metadata specified
-LivelinkConnector.AddMetadataItem=Add metadata item
-LivelinkConnector.BackUpMetadataPath=Back up metadata path
-LivelinkConnector.AllAttributesInThisCategory=&nbsp;All attributes in this category
-LivelinkConnector.PickAttributes=-- Pick attributes --
-LivelinkConnector.AddToMetadataPath=Add to metadata path
-LivelinkConnector.PickWorkspace=-- Pick workspace --
-LivelinkConnector.BackUpMetadataPath=Back up metadata path
-LivelinkConnector.PickAFolder=-- Pick a folder --
-LivelinkConnector.AddCategory=Add category
-LivelinkConnector.PickACategory=-- Pick a category --
-LivelinkConnector.PathAttributeName=Path attribute name:
-LivelinkConnector.PathSeparatorString=Path separator string:
-LivelinkConnector.DeleteMapping=Delete mapping #
-LivelinkConnector.NoMappingsSpecified=No mappings specified
-LivelinkConnector.AddToMappings=Add to mappings
-LivelinkConnector.Roots=Roots:
-LivelinkConnector.NoStartPointsSpecified=No start points specified
-LivelinkConnector.FileSpecs=File specs:
-LivelinkConnector.NoFileSpecsSpecified=No file specs specified
-LivelinkConnector.Enabled2=Enabled
-LivelinkConnector.AccessTokens=Access tokens:
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=Only specified metadata will be ingested
-LivelinkConnector.AllDocumentMetadataWillBeIngested=All document metadata will be ingested
-LivelinkConnector.MetadataSpecification=Metadata specification:
-LivelinkConnector.SpecificMetadata=Specific metadata:
-LivelinkConnector.NoMetadataSpecified=No metadata specified
-LivelinkConnector.PathNameMetadataAttribute=Path-name metadata attribute:
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-LivelinkConnector.PathValueMapping=Path-value mapping:
-LivelinkConnector.NoMappingsSpecified=No mappings specified
-LivelinkConnector.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-LivelinkConnector.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-LivelinkConnector.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-
-LivelinkConnector.ServerProtocol=Server protocol:
-LivelinkConnector.internal=internal
-LivelinkConnector.ServerHTTPCGIPath=Server HTTP CGI path:
-LivelinkConnector.ServerHTTPNTLMDomain=Server HTTP domain:
-LivelinkConnector.ServerHTTPNTLMUserName=Server HTTP NTLM user name:
-LivelinkConnector.ServerHTTPNTLMPassword=Server HTTP NTLM password:
-LivelinkConnector.ServerSSLCertificateList=Server SSL certificate list:
-LivelinkConnector.EnterTheServerCgiPathToLivelink=Enter the server CGI path to reach Livelink
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=The server CGI path must begin with a '/' character
-LivelinkConnector.Delete=Delete
-LivelinkConnector.Add=Add
-LivelinkConnector.CrawlUserWorkspaces=Crawl user workspaces?
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=Enter the view CGI path to LiveLink
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=The ingestion CGI path must be blank or begin with a '/' character
-LivelinkConnector.UseLAPI=Use LAPI
-LivelinkConnector.SelectAViewProtocol=Select a view protocol
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_es_ES.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_es_ES.properties
deleted file mode 100644
index 538f1eb..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_es_ES.properties
+++ /dev/null
@@ -1,151 +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.
-
-LivelinkConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-LivelinkConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-LivelinkConnector.Cache=caché
-LivelinkConnector.CacheLifetime=caché tiempo de vida:
-LivelinkConnector.CacheLRUSize=Tamaño de caché LRU:
-LivelinkConnector.minutes=minutOS
-LivelinkConnector.Server=Servidor
-LivelinkConnector.DocumentAccess=Acceso Documento
-LivelinkConnector.DocumentView=Vista de documentos
-LivelinkConnector.Paths=Caminos
-LivelinkConnector.Filters=Filtros
-LivelinkConnector.Security=Seguridad
-LivelinkConnector.Metadata=metadatos
-LivelinkConnector.UserMapping=Trazar un mapa de Usuario
-LivelinkConnector.AValidNumberIsRequired=Se requiere un número válido
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=El nombre de usuario la expresión regular debe ser la expresión válida regular
-LivelinkConnector.EnterALivelinkServerName=Introduzca un nombre de servidor de acoplamiento directo
-LivelinkConnector.AServerPortNumberIsRequired=Se requiere un número de puerto del servidor
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=Nombre de usuario expresión regular no puede ser nulo
-LivelinkConnector.ServerName=Nombre del servidor:
-LivelinkConnector.ServerPort=Puerto de servidor:
-LivelinkConnector.ServerUserName=Nombre de usuario del servidor:
-LivelinkConnector.ServerPassword=Contraseña del servidor:
-LivelinkConnector.UserNameRegularExpression=Nombre de usuario expresión regular:
-LivelinkConnector.LivelinkUserExpression=Expresión user link directo:
-LivelinkConnector.Parameters=Paràmetros:
-LivelinkConnector.ChooseACertificateFile=Elija un archivo de certificado
-LivelinkConnector.AValidNumberIsRequired=Se requiere un número válido
-LivelinkConnector.AValidNumberOrBlankIsRequired=Un número válido, o en blanco, es requerido
-LivelinkConnector.EnterALivelinkServerName=Introduzca un nombre de servidor de acoplamiento directo
-LivelinkConnector.AServerPortNumberIsRequired=Se requiere un número de puerto del servidor
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=Introduzca la ruta cgi rastreo directo enlace
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=El camino cgi ingesta debe comenzar con una / carácter
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=El camino vista cgi debe estar en blanco, o comenzar con una / carácter
-LivelinkConnector.DocumentFetchProtocol=Protocolo de traída de documento:
-LivelinkConnector.DocumentFetchPort=Puerto de traída de documento:
-LivelinkConnector.DocumentFetchSSLCertificateList=Traída de documento SSL lista de certificado:
-LivelinkConnector.NoCertificatesPresent=No hay certificados actuales
-LivelinkConnector.DeleteCert=eliminar cert 
-LivelinkConnector.AddCert=Añadir cert
-LivelinkConnector.Certificate=Certificado:
-LivelinkConnector.DocumentFetchCGIPath=Traída de documento CGI camino:
-LivelinkConnector.DocumentFetchNTLMDomain=Traída de documento NTLM dominio:
-LivelinkConnector.SetIfNTLMAuthDesired=(establecer si NTLM autenticación deseado)
-LivelinkConnector.DocumentFetchNTLMUserName=Documento buscar a nombre de usuario NTLM:
-LivelinkConnector.SetIfDifferentFromServerUserName=(establecer si es diferente del nombre de usuario del servidor)
-LivelinkConnector.DocumentFetchNTLMPassword=Traída de documento NTLM contraseña:
-LivelinkConnector.SetIfDifferentFromServerPassword=(establecer si es diferente de la contraseña del servidor)
-LivelinkConnector.DocumentViewProtocol=Protocolo de vista del documento:
-LivelinkConnector.SameAsFetchProtocol=Mismo como protocolo de traída
-LivelinkConnector.DocumentViewServerName=Nombre del servidor de vista del documento:
-LivelinkConnector.BlankSameAsFetchServer=(blanco = mismo que se ha podido recuperar del servidor)
-LivelinkConnector.DocumentViewPort=Puerto de vista del documento:
-LivelinkConnector.DocumentViewCGIPath=Vista de documento CGI camino
-LivelinkConnector.Parameters=Paràmetros:
-LivelinkConnector.certificates= certificado(s)
-LivelinkConnector.SelectAFolderFirst=Seleccione una carpeta primero
-LivelinkConnector.TypeInAFileSpecification=Escriba una especificación de archivo
-LivelinkConnector.TypeInAnAccessToken=Escriba un token de acceso
-LivelinkConnector.SelectAWorkspaceFirst=Seleccione un espacio de trabajo primero
-LivelinkConnector.SelectACategoryFirst=Seleccione una categoría primero
-LivelinkConnector.SelectAtLeastOneAttributeFirst=Seleccione al menos un atributo primero , y no seleccione el título desplegable
-LivelinkConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-LivelinkConnector.MatchStringMustBeValidRegularExpression=Cadena de ajuste debe ser expresión regular válida
-LivelinkConnector.DeletePath=eliminar ruta #
-LivelinkConnector.NoStartingPointsDefined=No hay puntos de partida definidos
-LivelinkConnector.AddPath=Añadir ruta
-LivelinkConnector.AddToPath=Añadir a la trayectoria
-LivelinkConnector.PickAFolder=-- Elija una carpeta --
-LivelinkConnector.DeleteFilespec=Eliminar archivos de la PEC #
-LivelinkConnector.NoIncludeExcludeFilesDefined=No se incluirán/excluir archivos definidos
-LivelinkConnector.AddFileSpecification=Añadir especificación de archivo
-LivelinkConnector.Include=incluir
-LivelinkConnector.Exclude=ExcluIR
-LivelinkConnector.SecurityColon=Securidad:
-LivelinkConnector.Enabled=Activado
-LivelinkConnector.Disabled=Imposibilitado
-LivelinkConnector.DeleteToken=eliminar token #
-LivelinkConnector.AddAccessToken=Añadir token de acceso
-LivelinkConnector.IngestALLMetadata=Ingresar todos los metadatos?
-LivelinkConnector.Yes=Si
-LivelinkConnector.No=No
-LivelinkConnector.DeleteMetadata=eliminar metadatos #
-LivelinkConnector.NoMetadataSpecified=Sin metadatos especificada
-LivelinkConnector.AddMetadataItem=Añadir elemento de metadatos
-LivelinkConnector.BackUpMetadataPath=Copia de seguridad de camino de metadatos
-LivelinkConnector.AllAttributesInThisCategory=&nbsp;Todos los atributos de esta categoría
-LivelinkConnector.PickAttributes=-- Escoja atributos --
-LivelinkConnector.AddToMetadataPath=Añadir a metadatos ruta
-LivelinkConnector.PickWorkspace=-- Escoja espacio de trabajo --
-LivelinkConnector.BackUpMetadataPath=Copia de seguridad de camino de metadatos
-LivelinkConnector.PickAFolder=-- Elija una carpeta --
-LivelinkConnector.AddCategory=Añadir categoría
-LivelinkConnector.PickACategory=-- Elija una categoría --
-LivelinkConnector.PathAttributeName=Sendero nombre de atributo:
-LivelinkConnector.PathSeparatorString=Cadena separador de ruta:
-LivelinkConnector.DeleteMapping=eliminar la cartografía #
-LivelinkConnector.NoMappingsSpecified=Ningùn trazado de mapa especificado
-LivelinkConnector.AddToMappings=Añadir al trazar un mapa
-LivelinkConnector.Roots=Roots:
-LivelinkConnector.NoStartPointsSpecified=No hay puntos de inicio especificados
-LivelinkConnector.FileSpecs=especificaciones de archivo:
-LivelinkConnector.NoFileSpecsSpecified=No hay especificaciones de archivo especificados
-LivelinkConnector.Enabled2=Activado
-LivelinkConnector.AccessTokens=tokens de acceso:
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=Sólo metadatos especificada se ingresa
-LivelinkConnector.AllDocumentMetadataWillBeIngested=Todo documento de metadatos se ingresa
-LivelinkConnector.MetadataSpecification=especificación de metadatos:
-LivelinkConnector.SpecificMetadata=metadatos específico:
-LivelinkConnector.NoMetadataSpecified=Sin metadatos especificada
-LivelinkConnector.PathNameMetadataAttribute=Camino-atributo de nombre metadatos:
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-LivelinkConnector.PathValueMapping=Camino-trazar un mapa de valor:
-LivelinkConnector.NoMappingsSpecified=Ningùn trazado de mapa especificado
-LivelinkConnector.CacheLifetimeCannotBeNull=Vida útil de la caché no puede ser nulo
-LivelinkConnector.CacheLifetimeMustBeAnInteger=Vida útil de la caché debe ser un entero
-LivelinkConnector.CacheLRUSizeCannotBeNull=Tamaño de caché LRU no puede ser nulo
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=Tamaño de caché LRU debe ser un entero
-
-LivelinkConnector.ServerProtocol=protocolo de servidor:
-LivelinkConnector.internal=interna
-LivelinkConnector.ServerHTTPCGIPath=Ruta de acceso HTTP CGI del servidor:
-LivelinkConnector.ServerHTTPNTLMDomain=Servidor dominio de HTTP:
-LivelinkConnector.ServerHTTPNTLMUserName=Servidor HTTP NTLM nombre de usuario:
-LivelinkConnector.ServerHTTPNTLMPassword=Servidor HTTP NTLM contraseña:
-LivelinkConnector.ServerSSLCertificateList=Servidor SSL lista de certificado:
-LivelinkConnector.EnterTheServerCgiPathToLivelink=Introduzca la ruta CGI del servidor para llegar enlace en directo
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=El camino CGI del servidor debe comenzar con una '/' carácter
-LivelinkConnector.Delete=Borrar
-LivelinkConnector.Add=añadir
-LivelinkConnector.CrawlUserWorkspaces=El usuario de velocidad lenta trabaja a pasos?
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=Introduzca la ruta vista CGI para un directo Enlace
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=El camino CGI ingresado debe estar en blanco o comenzar con un '/' character
-LivelinkConnector.UseLAPI=Uso LAPI
-LivelinkConnector.SelectAViewProtocol=Seleccione un protocolo de vista
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_ja_JP.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_ja_JP.properties
deleted file mode 100644
index d179f83..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_ja_JP.properties
+++ /dev/null
@@ -1,151 +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.
-
-LivelinkConnector.NoAccessTokensPresent=アクセストークンが存在しません
-LivelinkConnector.NoAccessTokensSpecified=アクセストークンが未定義です
-LivelinkConnector.Cache=キャッシュ
-LivelinkConnector.CacheLifetime=キャッシュライフタイム:
-LivelinkConnector.CacheLRUSize=キャッシュLRUサイズ:
-LivelinkConnector.minutes=分
-LivelinkConnector.Server=サーバ
-LivelinkConnector.DocumentAccess=ドキュメントアクセス
-LivelinkConnector.DocumentView=ドキュメント表示
-LivelinkConnector.Paths=パス
-LivelinkConnector.Filters=フィルタ
-LivelinkConnector.Security=セキュリティ
-LivelinkConnector.Metadata=メタデータ
-LivelinkConnector.UserMapping=ユーザマップ
-LivelinkConnector.AValidNumberIsRequired=数値を入力してください
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=正しいユーザ名正規表現式を入力してください
-LivelinkConnector.EnterALivelinkServerName=LiveLinkサーバ名を入力してください
-LivelinkConnector.AServerPortNumberIsRequired=サーバポート番号を入力してください
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=ユーザ名正規表現を入力してください
-LivelinkConnector.ServerName=サーバ名:
-LivelinkConnector.ServerPort=サーバポート:
-LivelinkConnector.ServerUserName=サーバユーザ名:
-LivelinkConnector.ServerPassword=サーバパスワード:
-LivelinkConnector.UserNameRegularExpression=ユーザ名正規表現式:
-LivelinkConnector.LivelinkUserExpression=Livelinkユーザ式:
-LivelinkConnector.Parameters=引数:
-LivelinkConnector.ChooseACertificateFile=証明書ファイルを選択してください
-LivelinkConnector.AValidNumberIsRequired=正しい数字を入力してください
-LivelinkConnector.AValidNumberOrBlankIsRequired=正しい数字を入力又は空白に設定してください
-LivelinkConnector.EnterALivelinkServerName=LiveLinkサーバ名を入力してください
-LivelinkConnector.AServerPortNumberIsRequired=サーバポート番号を入力してください
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=LiveLinkへのクロールCGIパスを入力してください
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=収集CGIパスは「/」から始めてください
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=表示CGIパスは空白又は「/」から始めてください
-LivelinkConnector.DocumentFetchProtocol=コンテンツ収集プロトコル:
-LivelinkConnector.DocumentFetchPort=ポート番号:
-LivelinkConnector.DocumentFetchSSLCertificateList=コンテンツ収集SSL証明書一覧:
-LivelinkConnector.NoCertificatesPresent=証明書がありません
-LivelinkConnector.DeleteCert=証明書を削除 
-LivelinkConnector.AddCert=証明書を追加
-LivelinkConnector.Certificate=証明書
-LivelinkConnector.DocumentFetchCGIPath=コンテンツ収集CGIパス:
-LivelinkConnector.DocumentFetchNTLMDomain=コンテンツを収集するNTLMドメイン:
-LivelinkConnector.SetIfNTLMAuthDesired=(NTLM権限を利用する場合)
-LivelinkConnector.DocumentFetchNTLMUserName=コンテンツ収集NTLMユーザ名:
-LivelinkConnector.SetIfDifferentFromServerUserName=(サーバユーザ名と異なる場合に設定)
-LivelinkConnector.DocumentFetchNTLMPassword=コンテンツ収集NTLMパスワード:
-LivelinkConnector.SetIfDifferentFromServerPassword=(サーバパスワードと異なる場合に設定)
-LivelinkConnector.DocumentViewProtocol=コンテンツ表示プロトコル:
-LivelinkConnector.SameAsFetchProtocol=収集プロトコルと同じ
-LivelinkConnector.DocumentViewServerName=コンテンツ表示サーバ名:
-LivelinkConnector.BlankSameAsFetchServer=(空白 = 収集サーバと同じ)
-LivelinkConnector.DocumentViewPort=コンテンツ表示ポート番号:
-LivelinkConnector.DocumentViewCGIPath=コンテンツ表示CGIパス
-LivelinkConnector.Parameters=引数:
-LivelinkConnector.certificates= 証明書
-LivelinkConnector.SelectAFolderFirst=フォルダを選択してください
-LivelinkConnector.TypeInAFileSpecification=ファイルパターンを入力してください
-LivelinkConnector.TypeInAnAccessToken=アクセストークンを入力してください
-LivelinkConnector.SelectAWorkspaceFirst=ワークスペースを選択してください
-LivelinkConnector.SelectACategoryFirst=カテゴリを選択してください
-LivelinkConnector.SelectAtLeastOneAttributeFirst=1つ以上の属性を選択してください。プールダウン題名を選択しないでください
-LivelinkConnector.MatchStringCannotBeEmpty=パターンを入力してください
-LivelinkConnector.MatchStringMustBeValidRegularExpression=パターンを正規表現で定義してください
-LivelinkConnector.DeletePath=パスを削除: #
-LivelinkConnector.NoStartingPointsDefined=開始ポイントを指定してください
-LivelinkConnector.AddPath=パスの追加
-LivelinkConnector.AddToPath=パスに追加
-LivelinkConnector.PickAFolder=-- フォルダを選択してください --
-LivelinkConnector.DeleteFilespec=ファイルパターンを削除: #
-LivelinkConnector.NoIncludeExcludeFilesDefined=ファイルを含む/除外するかを選択してください
-LivelinkConnector.AddFileSpecification=ファイルパターンを追加
-LivelinkConnector.Include=含む
-LivelinkConnector.Exclude=除外
-LivelinkConnector.SecurityColon=セキュリティ:
-LivelinkConnector.Enabled=有効
-LivelinkConnector.Disabled=無効
-LivelinkConnector.DeleteToken=トークンを削除: #
-LivelinkConnector.AddAccessToken=アクセストークンを追加
-LivelinkConnector.IngestALLMetadata=すべてのメタデータを収集?
-LivelinkConnector.Yes=はい
-LivelinkConnector.No=いいえ
-LivelinkConnector.DeleteMetadata=メタデータを削除: #
-LivelinkConnector.NoMetadataSpecified=メタデータは選択されていません
-LivelinkConnector.AddMetadataItem=メタデータを追加
-LivelinkConnector.BackUpMetadataPath=バックアップメタデータパス
-LivelinkConnector.AllAttributesInThisCategory=カテゴリのすべての属性
-LivelinkConnector.PickAttributes=-- 属性を選択してください --
-LivelinkConnector.AddToMetadataPath=メタデータパスに追加
-LivelinkConnector.PickWorkspace=-- ワークスペースを選択してください --
-LivelinkConnector.BackUpMetadataPath=バックアップメタデータパス
-LivelinkConnector.PickAFolder=-- フォルダを選択してください --
-LivelinkConnector.AddCategory=カテゴリの追加
-LivelinkConnector.PickACategory=-- カテゴリを選択してください --
-LivelinkConnector.PathAttributeName=パス属性名:
-LivelinkConnector.PathSeparatorString=Path separator string:
-LivelinkConnector.DeleteMapping=マップを削除: #
-LivelinkConnector.NoMappingsSpecified=マップが指定されていません
-LivelinkConnector.AddToMappings=マップに追加
-LivelinkConnector.Roots=ルート:
-LivelinkConnector.NoStartPointsSpecified=開始ポイントを指定してください
-LivelinkConnector.FileSpecs=ファイルパターン:
-LivelinkConnector.NoFileSpecsSpecified=ファイルパターンは指定されていません
-LivelinkConnector.Enabled2=有効
-LivelinkConnector.AccessTokens=アクセストークン:
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=指定されたメタデータのみを収集します
-LivelinkConnector.AllDocumentMetadataWillBeIngested=すべてのコンテンツメタデータを収集します
-LivelinkConnector.MetadataSpecification=メタデータパターン:
-LivelinkConnector.SpecificMetadata=特定のメタデータ:
-LivelinkConnector.NoMetadataSpecified=メタデータは指定されていません
-LivelinkConnector.PathNameMetadataAttribute=Path-nameメタデータ属性:
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性は指定されていません
-LivelinkConnector.PathValueMapping=Path-valueマップ:
-LivelinkConnector.NoMappingsSpecified=マップが指定されていません
-LivelinkConnector.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-LivelinkConnector.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-LivelinkConnector.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
-
-LivelinkConnector.ServerProtocol=サーバプロトコル:
-LivelinkConnector.internal=internal
-LivelinkConnector.ServerHTTPCGIPath=サーバ HTTP CGI パス: 
-LivelinkConnector.ServerHTTPNTLMDomain=サーバ HTTP ドメイン: 
-LivelinkConnector.ServerHTTPNTLMUserName=サーバ HTTP NTLM ユーザ名: 
-LivelinkConnector.ServerHTTPNTLMPassword=サーバ HTTP NTLM パスワード: 
-LivelinkConnector.ServerSSLCertificateList=サーバ SSL 証明書一覧: 
-LivelinkConnector.EnterTheServerCgiPathToLivelink=Enter the server CGI path to reach Livelink
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=The server CGI path must begin with a '/' character
-LivelinkConnector.Delete=削除
-LivelinkConnector.Add=追加
-LivelinkConnector.CrawlUserWorkspaces=Crawl user workspaces?
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=Enter the view CGI path to LiveLink
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=The ingestion CGI path must be blank or begin with a '/' character
-LivelinkConnector.UseLAPI=Use LAPI
-LivelinkConnector.SelectAViewProtocol=Select a view protocol
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_zh_CN.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_zh_CN.properties
deleted file mode 100644
index 501e184..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/livelink/common_zh_CN.properties
+++ /dev/null
@@ -1,151 +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.
-
-LivelinkConnector.NoAccessTokensPresent=访问令牌不存在
-LivelinkConnector.NoAccessTokensSpecified=访问令牌未指定
-LivelinkConnector.Cache=缓存
-LivelinkConnector.CacheLifetime=缓存寿命: 
-LivelinkConnector.CacheLRUSize=缓存LRU大小: 
-LivelinkConnector.minutes=分
-LivelinkConnector.Server=服务器
-LivelinkConnector.DocumentAccess=文档访问
-LivelinkConnector.DocumentView=文档显示
-LivelinkConnector.Paths=路径
-LivelinkConnector.Filters=过滤器
-LivelinkConnector.Security=安全
-LivelinkConnector.Metadata=元数据
-LivelinkConnector.UserMapping=用户映射
-LivelinkConnector.AValidNumberIsRequired=请输入有效的数字
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=请输入有效的用户名正则表达式
-LivelinkConnector.EnterALivelinkServerName=请输入LiveLink服务器名
-LivelinkConnector.AServerPortNumberIsRequired=请输入服务器端口号
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=请输入用户名正则表达式
-LivelinkConnector.ServerName=服务器名: 
-LivelinkConnector.ServerPort=服务器端口: 
-LivelinkConnector.ServerUserName=服务器用户名: 
-LivelinkConnector.ServerPassword=服务器密码: 
-LivelinkConnector.UserNameRegularExpression=用户名正则表达式: 
-LivelinkConnector.LivelinkUserExpression=Livelink用户表达式: 
-LivelinkConnector.Parameters=参数: 
-LivelinkConnector.ChooseACertificateFile=请选择证书文件
-LivelinkConnector.AValidNumberIsRequired=请输入有效的数字
-LivelinkConnector.AValidNumberOrBlankIsRequired=请输入有效的数字或设为空
-LivelinkConnector.EnterALivelinkServerName=请输入LiveLink服务器名
-LivelinkConnector.AServerPortNumberIsRequired=请输入服务器端口号
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=请输入指向LiveLink的爬取CGI路径
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=爬取CGI路径的第一个字符必须为‘/’
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=显示CGI路径需设为空或始于‘/’字符
-LivelinkConnector.DocumentFetchProtocol=文档提取协议: 
-LivelinkConnector.DocumentFetchPort=文档提取端口号: 
-LivelinkConnector.DocumentFetchSSLCertificateList=文档提取SSL证书列表: 
-LivelinkConnector.NoCertificatesPresent=证书不存在
-LivelinkConnector.DeleteCert=删除证书 
-LivelinkConnector.AddCert=添加证书
-LivelinkConnector.Certificate=证书
-LivelinkConnector.DocumentFetchCGIPath=文档提取CGI路径: 
-LivelinkConnector.DocumentFetchNTLMDomain=文档提取NTLM域: 
-LivelinkConnector.SetIfNTLMAuthDesired=(使用NTLM权限时设置)
-LivelinkConnector.DocumentFetchNTLMUserName=文档提取NTLM用户名: 
-LivelinkConnector.SetIfDifferentFromServerUserName=(与服务器用户名不同时设置)
-LivelinkConnector.DocumentFetchNTLMPassword=文档提取NTLM密码: 
-LivelinkConnector.SetIfDifferentFromServerPassword=(与服务器密码不同时设置)
-LivelinkConnector.DocumentViewProtocol=文档显示协议: 
-LivelinkConnector.SameAsFetchProtocol=与提取协议相同
-LivelinkConnector.DocumentViewServerName=文档显示服务器名: 
-LivelinkConnector.BlankSameAsFetchServer=(空白 = 与提取服务器相同)
-LivelinkConnector.DocumentViewPort=文档显示端口号: 
-LivelinkConnector.DocumentViewCGIPath=文档显示CGI路径
-LivelinkConnector.Parameters=参数: 
-LivelinkConnector.certificates=证书
-LivelinkConnector.SelectAFolderFirst=请选择文件夹
-LivelinkConnector.TypeInAFileSpecification=请输入文件规范
-LivelinkConnector.TypeInAnAccessToken=请输入访问令牌
-LivelinkConnector.SelectAWorkspaceFirst=请选择工作区
-LivelinkConnector.SelectACategoryFirst=请选择分类
-LivelinkConnector.SelectAtLeastOneAttributeFirst=请至少选择一个属性。不要选择下拉式标题
-LivelinkConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-LivelinkConnector.MatchStringMustBeValidRegularExpression=匹配字符串需输入有效的正则表达式
-LivelinkConnector.DeletePath=删除路径:  #
-LivelinkConnector.NoStartingPointsDefined=请指定起点
-LivelinkConnector.AddPath=添加路径
-LivelinkConnector.AddToPath=添加到路径
-LivelinkConnector.PickAFolder=-- 请选择文件夹 --
-LivelinkConnector.DeleteFilespec=删除文件规范:  #
-LivelinkConnector.NoIncludeExcludeFilesDefined=请选择包含/排除文件
-LivelinkConnector.AddFileSpecification=添加文件规范
-LivelinkConnector.Include=包含
-LivelinkConnector.Exclude=排除
-LivelinkConnector.SecurityColon=安全: 
-LivelinkConnector.Enabled=有效
-LivelinkConnector.Disabled=无效
-LivelinkConnector.DeleteToken=删除令牌:  #
-LivelinkConnector.AddAccessToken=添加访问令牌
-LivelinkConnector.IngestALLMetadata=爬取所有元数据?
-LivelinkConnector.Yes=是
-LivelinkConnector.No=否
-LivelinkConnector.DeleteMetadata=删除元数据:  #
-LivelinkConnector.NoMetadataSpecified=元数据未指定
-LivelinkConnector.AddMetadataItem=添加元数据
-LivelinkConnector.BackUpMetadataPath=备份元数据路径
-LivelinkConnector.AllAttributesInThisCategory=此分类的所有属性
-LivelinkConnector.PickAttributes=-- 请选择属性 --
-LivelinkConnector.AddToMetadataPath=添加到元数据路径
-LivelinkConnector.PickWorkspace=-- 请选择工作区 --
-LivelinkConnector.BackUpMetadataPath=备份元数据路径
-LivelinkConnector.PickAFolder=-- 请选择文件夹 --
-LivelinkConnector.AddCategory=添加分类
-LivelinkConnector.PickACategory=-- 请选择分类 --
-LivelinkConnector.PathAttributeName=路径属性名: 
-LivelinkConnector.PathSeparatorString=路径分隔符:
-LivelinkConnector.DeleteMapping=删除映射:  #
-LivelinkConnector.NoMappingsSpecified=映射未指定
-LivelinkConnector.AddToMappings=添加到映射
-LivelinkConnector.Roots=根: 
-LivelinkConnector.NoStartPointsSpecified=起点未指定
-LivelinkConnector.FileSpecs=文件规范: 
-LivelinkConnector.NoFileSpecsSpecified=文件规范未指定
-LivelinkConnector.Enabled2=有效
-LivelinkConnector.AccessTokens=访问令牌: 
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=只爬取指定的元数据
-LivelinkConnector.AllDocumentMetadataWillBeIngested=爬取所有文档元数据
-LivelinkConnector.MetadataSpecification=元数据规范: 
-LivelinkConnector.SpecificMetadata=特定元数据: 
-LivelinkConnector.NoMetadataSpecified=元数据未指定
-LivelinkConnector.PathNameMetadataAttribute=路径名元数据属性: 
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-LivelinkConnector.PathValueMapping=路径值映射: 
-LivelinkConnector.NoMappingsSpecified=映射未指定
-LivelinkConnector.CacheLifetimeCannotBeNull=请输入缓存寿命
-LivelinkConnector.CacheLifetimeMustBeAnInteger=缓存寿命需输入整数
-LivelinkConnector.CacheLRUSizeCannotBeNull=缓存LRU大小不能为空
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=缓存LRU大小需输入整数
-
-LivelinkConnector.ServerProtocol=服务器协议: 
-LivelinkConnector.internal=内部
-LivelinkConnector.ServerHTTPCGIPath=服务器HTTP CGI路径:  
-LivelinkConnector.ServerHTTPNTLMDomain=服务器HTTP域:  
-LivelinkConnector.ServerHTTPNTLMUserName=服务器HTTP NTLM用户名:  
-LivelinkConnector.ServerHTTPNTLMPassword=服务器HTTP NTLM密码:  
-LivelinkConnector.ServerSSLCertificateList=服务器SSL证书列表:  
-LivelinkConnector.EnterTheServerCgiPathToLivelink=请输入指向Livelink的服务器CGI路径 
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=服务器CGI路径需始于'/'字符
-LivelinkConnector.Delete=删除
-LivelinkConnector.Add=添加
-LivelinkConnector.CrawlUserWorkspaces=爬取用户工作区
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=请输入指向LiveLink的显示CGI路径 
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=爬取CGI路径需设为空或始于'/'字符
-LivelinkConnector.UseLAPI=使用LAPI
-LivelinkConnector.SelectAViewProtocol=请选择显示协议
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties
deleted file mode 100644
index a8a4ac0..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties
+++ /dev/null
@@ -1,155 +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.
-
-LivelinkConnector.NoAccessTokensPresent=No access tokens present
-LivelinkConnector.NoAccessTokensSpecified=No access tokens specified
-LivelinkConnector.Cache=Cache
-LivelinkConnector.CacheLifetime=Cache lifetime:
-LivelinkConnector.CacheLRUSize=Cache LRU size:
-LivelinkConnector.minutes=minutes
-LivelinkConnector.Server=Server
-LivelinkConnector.DocumentAccess=Document Access
-LivelinkConnector.DocumentView=Document View
-LivelinkConnector.Paths=Paths
-LivelinkConnector.Filters=Filters
-LivelinkConnector.Security=Security
-LivelinkConnector.Metadata=Metadata
-LivelinkConnector.UserMapping=User Mapping
-LivelinkConnector.AValidNumberIsRequired=A valid number is required
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=User name regular expression must be valid regular expression
-LivelinkConnector.EnterALivelinkServerName=Enter a livelink server name
-LivelinkConnector.AServerPortNumberIsRequired=A server port number is required
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=User name regular expression cannot be null
-LivelinkConnector.ServerName=Server name:
-LivelinkConnector.ServerPort=Server port:
-LivelinkConnector.ServerUserName=Server user name:
-LivelinkConnector.ServerPassword=Server password:
-LivelinkConnector.UserNameRegularExpression=User name regular expression:
-LivelinkConnector.LivelinkUserExpression=Livelink user expression:
-LivelinkConnector.Parameters=Parameters:
-LivelinkConnector.ChooseACertificateFile=Choose a certificate file
-LivelinkConnector.AValidNumberIsRequired=A valid number is required
-LivelinkConnector.AValidNumberOrBlankIsRequired=A valid number, or blank, is required
-LivelinkConnector.EnterALivelinkServerName=Enter a livelink server name
-LivelinkConnector.AServerPortNumberIsRequired=A server port number is required
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=Enter the crawl cgi path to livelink
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=The ingest cgi path must begin with a / character
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=The view cgi path must be blank, or begin with a / character
-LivelinkConnector.DocumentFetchProtocol=Document fetch protocol:
-LivelinkConnector.DocumentFetchPort=Document fetch port:
-LivelinkConnector.DocumentFetchSSLCertificateList=Document fetch SSL certificate list:
-LivelinkConnector.NoCertificatesPresent=No certificates present
-LivelinkConnector.DeleteCert=Delete cert 
-LivelinkConnector.AddCert=Add cert
-LivelinkConnector.Certificate=Certificate:
-LivelinkConnector.DocumentFetchCGIPath=Document fetch CGI path:
-LivelinkConnector.DocumentFetchNTLMDomain=Document fetch NTLM domain:
-LivelinkConnector.SetIfNTLMAuthDesired=(set if NTLM auth desired)
-LivelinkConnector.DocumentFetchNTLMUserName=Document fetch NTLM user name:
-LivelinkConnector.SetIfDifferentFromServerUserName=(set if different from server user name)
-LivelinkConnector.DocumentFetchNTLMPassword=Document fetch NTLM password:
-LivelinkConnector.SetIfDifferentFromServerPassword=(set if different from server password)
-LivelinkConnector.DocumentViewProtocol=Document view protocol:
-LivelinkConnector.SameAsFetchProtocol=Same as fetch protocol
-LivelinkConnector.DocumentViewServerName=Document view server name:
-LivelinkConnector.BlankSameAsFetchServer=(blank = same as fetch server)
-LivelinkConnector.DocumentViewPort=Document view port:
-LivelinkConnector.DocumentViewCGIPath=Document view CGI path
-LivelinkConnector.DocumentViewAction=Document view action
-LivelinkConnector.DocumentViewActionDownload=Download
-LivelinkConnector.DocumentViewActionOpen=Open
-LivelinkConnector.DocumentViewActionOverview=Overview
-LivelinkConnector.Parameters=Parameters:
-LivelinkConnector.certificates= certificate(s)
-LivelinkConnector.SelectAFolderFirst=Select a folder first
-LivelinkConnector.TypeInAFileSpecification=Type in a file specification
-LivelinkConnector.TypeInAnAccessToken=Type in an access token
-LivelinkConnector.SelectAWorkspaceFirst=Select a workspace first
-LivelinkConnector.SelectACategoryFirst=Select a category first
-LivelinkConnector.SelectAtLeastOneAttributeFirst=Select at least one attribute first, and do not select the pulldown title
-LivelinkConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-LivelinkConnector.MatchStringMustBeValidRegularExpression=Match string must be valid regular expression
-LivelinkConnector.DeletePath=Delete path #
-LivelinkConnector.NoStartingPointsDefined=No starting points defined
-LivelinkConnector.AddPath=Add path
-LivelinkConnector.AddToPath=Add to path
-LivelinkConnector.PickAFolder=-- Pick a folder --
-LivelinkConnector.DeleteFilespec=Delete filespec #
-LivelinkConnector.NoIncludeExcludeFilesDefined=No include/exclude files defined
-LivelinkConnector.AddFileSpecification=Add file specification
-LivelinkConnector.Include=Include
-LivelinkConnector.Exclude=Exclude
-LivelinkConnector.SecurityColon=Security:
-LivelinkConnector.Enabled=Enabled
-LivelinkConnector.Disabled=Disabled
-LivelinkConnector.DeleteToken=Delete token #
-LivelinkConnector.AddAccessToken=Add access token
-LivelinkConnector.IngestALLMetadata=Ingest ALL metadata?
-LivelinkConnector.Yes=Yes
-LivelinkConnector.No=No
-LivelinkConnector.DeleteMetadata=Delete metadata #
-LivelinkConnector.NoMetadataSpecified=No metadata specified
-LivelinkConnector.AddMetadataItem=Add metadata item
-LivelinkConnector.BackUpMetadataPath=Back up metadata path
-LivelinkConnector.AllAttributesInThisCategory=&nbsp;All attributes in this category
-LivelinkConnector.PickAttributes=-- Pick attributes --
-LivelinkConnector.AddToMetadataPath=Add to metadata path
-LivelinkConnector.PickWorkspace=-- Pick workspace --
-LivelinkConnector.BackUpMetadataPath=Back up metadata path
-LivelinkConnector.PickAFolder=-- Pick a folder --
-LivelinkConnector.AddCategory=Add category
-LivelinkConnector.PickACategory=-- Pick a category --
-LivelinkConnector.PathAttributeName=Path attribute name:
-LivelinkConnector.PathSeparatorString=Path separator string:
-LivelinkConnector.DeleteMapping=Delete mapping #
-LivelinkConnector.NoMappingsSpecified=No mappings specified
-LivelinkConnector.AddToMappings=Add to mappings
-LivelinkConnector.Roots=Roots:
-LivelinkConnector.NoStartPointsSpecified=No start points specified
-LivelinkConnector.FileSpecs=File specs:
-LivelinkConnector.NoFileSpecsSpecified=No file specs specified
-LivelinkConnector.Enabled2=Enabled
-LivelinkConnector.AccessTokens=Access tokens:
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=Only specified metadata will be ingested
-LivelinkConnector.AllDocumentMetadataWillBeIngested=All document metadata will be ingested
-LivelinkConnector.MetadataSpecification=Metadata specification:
-LivelinkConnector.SpecificMetadata=Specific metadata:
-LivelinkConnector.NoMetadataSpecified=No metadata specified
-LivelinkConnector.PathNameMetadataAttribute=Path-name metadata attribute:
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-LivelinkConnector.PathValueMapping=Path-value mapping:
-LivelinkConnector.NoMappingsSpecified=No mappings specified
-LivelinkConnector.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-LivelinkConnector.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-LivelinkConnector.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-
-LivelinkConnector.ServerProtocol=Server protocol:
-LivelinkConnector.internal=internal
-LivelinkConnector.ServerHTTPCGIPath=Server HTTP CGI path:
-LivelinkConnector.ServerHTTPNTLMDomain=Server HTTP domain:
-LivelinkConnector.ServerHTTPNTLMUserName=Server HTTP NTLM user name:
-LivelinkConnector.ServerHTTPNTLMPassword=Server HTTP NTLM password:
-LivelinkConnector.ServerSSLCertificateList=Server SSL certificate list:
-LivelinkConnector.EnterTheServerCgiPathToLivelink=Enter the server CGI path to reach Livelink
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=The server CGI path must begin with a '/' character
-LivelinkConnector.Delete=Delete
-LivelinkConnector.Add=Add
-LivelinkConnector.CrawlUserWorkspaces=Crawl user workspaces?
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=Enter the view CGI path to LiveLink
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=The ingestion CGI path must be blank or begin with a '/' character
-LivelinkConnector.UseLAPI=Use LAPI
-LivelinkConnector.SelectAViewProtocol=Select a view protocol
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_es_ES.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_es_ES.properties
deleted file mode 100644
index 597e045..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_es_ES.properties
+++ /dev/null
@@ -1,155 +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.
-
-LivelinkConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-LivelinkConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-LivelinkConnector.Cache=caché
-LivelinkConnector.CacheLifetime=Tiempo de vida de la caché:
-LivelinkConnector.CacheLRUSize=Tamaño de caché LRU:
-LivelinkConnector.minutes=minutos
-LivelinkConnector.Server=Servidor
-LivelinkConnector.DocumentAccess=Acceso de Documento
-LivelinkConnector.DocumentView=Vista de Documento
-LivelinkConnector.Paths=Caminos
-LivelinkConnector.Filters=Filtros
-LivelinkConnector.Security=Seguridad
-LivelinkConnector.Metadata=Metadatos
-LivelinkConnector.UserMapping=Trazar un mapa de Usuario
-LivelinkConnector.AValidNumberIsRequired=Requieren un número válido
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=El nombre de usuario la expresión regular debe ser la expresión válida regular
-LivelinkConnector.EnterALivelinkServerName=Introduzca un nombre de servidor de acoplamiento directo
-LivelinkConnector.AServerPortNumberIsRequired=Se requiere un número de puerto del servidor
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=Nombre de usuario expresión regular no puede ser nulo
-LivelinkConnector.ServerName=Nombre del servidor:
-LivelinkConnector.ServerPort=Puerto de servidor:
-LivelinkConnector.ServerUserName=Nombre de usuario del servidor:
-LivelinkConnector.ServerPassword=Contraseña del servidor:
-LivelinkConnector.UserNameRegularExpression=Nombre de usuario expresión regular:
-LivelinkConnector.LivelinkUserExpression=Expresión user link directo:
-LivelinkConnector.Parameters=Paràmetros:
-LivelinkConnector.ChooseACertificateFile=Elija un archivo de certificado
-LivelinkConnector.AValidNumberIsRequired=Se requiere un número válido
-LivelinkConnector.AValidNumberOrBlankIsRequired=Un número válido , o en blanco, se requiere
-LivelinkConnector.EnterALivelinkServerName=Introduzca un nombre de servidor de acoplamiento directo
-LivelinkConnector.AServerPortNumberIsRequired=Se requiere un número de puerto del servidor
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=Introduzca la ruta cgi rastreo directo enlace
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=El camino cgi ingresado debe comenzar con una / carácter
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=El camino vista cgi debe estar en blanco , o comenzar con un / carácter
-LivelinkConnector.DocumentFetchProtocol=Protocolo de traída de documento:
-LivelinkConnector.DocumentFetchPort=Puerto de traída de documento:
-LivelinkConnector.DocumentFetchSSLCertificateList=Traída de documento SSL lista de certificado:
-LivelinkConnector.NoCertificatesPresent=Ningún presente de certificados
-LivelinkConnector.DeleteCert=eliminar cert 
-LivelinkConnector.AddCert=Añadir cert
-LivelinkConnector.Certificate=Certificado:
-LivelinkConnector.DocumentFetchCGIPath=Documento ha podido recuperar la senda CGI:
-LivelinkConnector.DocumentFetchNTLMDomain=Traída de documento NTLM dominio:
-LivelinkConnector.SetIfNTLMAuthDesired=(establecer si NTLM autenticación deseado)
-LivelinkConnector.DocumentFetchNTLMUserName=Traída de documento NTLM nombre de usuario:
-LivelinkConnector.SetIfDifferentFromServerUserName=(establecer si es diferente del nombre de usuario del servidor)
-LivelinkConnector.DocumentFetchNTLMPassword=Traída de documento NTLM contraseña:
-LivelinkConnector.SetIfDifferentFromServerPassword=(establecer si es diferente de la contraseña del servidor)
-LivelinkConnector.DocumentViewProtocol=Protocolo de vista del documento:
-LivelinkConnector.SameAsFetchProtocol=Igual que se ha podido recuperar protocolo
-LivelinkConnector.DocumentViewServerName=Nombre del servidor de vista del documento:
-LivelinkConnector.BlankSameAsFetchServer=(blanco = mismo que se ha podido recuperar del servidor)
-LivelinkConnector.DocumentViewPort=Documento puerto vista:
-LivelinkConnector.DocumentViewCGIPath=Ruta vista CGI Documento
-LivelinkConnector.DocumentViewAction=Vista de documento CGI camino
-LivelinkConnector.DocumentViewActionDownload=Descargar
-LivelinkConnector.DocumentViewActionOpen=Abierto
-LivelinkConnector.DocumentViewActionOverview=Información general
-LivelinkConnector.Parameters=Paràmetros:
-LivelinkConnector.certificates= certificado(s)
-LivelinkConnector.SelectAFolderFirst=Seleccione una carpeta primero
-LivelinkConnector.TypeInAFileSpecification=Escriba una especificación de archivo
-LivelinkConnector.TypeInAnAccessToken=Escriba un token de acceso
-LivelinkConnector.SelectAWorkspaceFirst=Seleccione un espacio de trabajo primero
-LivelinkConnector.SelectACategoryFirst=Seleccione una categoría primero
-LivelinkConnector.SelectAtLeastOneAttributeFirst=Seleccione al menos un atributo primero , y no seleccione el título desplegable
-LivelinkConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-LivelinkConnector.MatchStringMustBeValidRegularExpression=Cadena de ajuste debe ser expresión regular válida
-LivelinkConnector.DeletePath=eliminar ruta #
-LivelinkConnector.NoStartingPointsDefined=No hay puntos de partida definidos
-LivelinkConnector.AddPath=Añadir ruta
-LivelinkConnector.AddToPath=Añadir a la trayectoria
-LivelinkConnector.PickAFolder=-- Elija una carpeta --
-LivelinkConnector.DeleteFilespec=Eliminar la especificación de archivo #
-LivelinkConnector.NoIncludeExcludeFilesDefined=No se incluirán/excluir archivos definidos
-LivelinkConnector.AddFileSpecification=Añadir especificación de archivo
-LivelinkConnector.Include=incluir
-LivelinkConnector.Exclude=excluir
-LivelinkConnector.SecurityColon=Seguridad:
-LivelinkConnector.Enabled=Activado
-LivelinkConnector.Disabled=Imposibilitado
-LivelinkConnector.DeleteToken=eliminar token #
-LivelinkConnector.AddAccessToken=Añadir token de acceso
-LivelinkConnector.IngestALLMetadata=Ingerir todos los metadatos?
-LivelinkConnector.Yes=Si
-LivelinkConnector.No=No
-LivelinkConnector.DeleteMetadata=eliminar metadatos #
-LivelinkConnector.NoMetadataSpecified=Sin metadatos especificada
-LivelinkConnector.AddMetadataItem=Añadir elemento de metadatos
-LivelinkConnector.BackUpMetadataPath=Copia de seguridad de camino de metadatos
-LivelinkConnector.AllAttributesInThisCategory=&nbsp;Todos los atributos de esta categoría
-LivelinkConnector.PickAttributes=-- Escoja atributos --
-LivelinkConnector.AddToMetadataPath=Añadir a metadatos ruta
-LivelinkConnector.PickWorkspace=-- Escoja espacio de trabajo --
-LivelinkConnector.BackUpMetadataPath=Copia de seguridad de camino de metadatos
-LivelinkConnector.PickAFolder=-- Elija una carpeta --
-LivelinkConnector.AddCategory=Añadir categoría
-LivelinkConnector.PickACategory=-- Elija una categoría --
-LivelinkConnector.PathAttributeName=Nombre de atributo de camino:
-LivelinkConnector.PathSeparatorString=Cadena separador de ruta:
-LivelinkConnector.DeleteMapping=Eliminar trazar un mapa #
-LivelinkConnector.NoMappingsSpecified=No hay trazado de mapa especificado
-LivelinkConnector.AddToMappings=Añada al trazar un mapa
-LivelinkConnector.Roots=Raìz:
-LivelinkConnector.NoStartPointsSpecified=No hay puntos de inicio especificados
-LivelinkConnector.FileSpecs=Especificaciones de archivo:
-LivelinkConnector.NoFileSpecsSpecified=No hay especificaciones de archivo especificados
-LivelinkConnector.Enabled2=Activado
-LivelinkConnector.AccessTokens=tokens de acceso:
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=Metadata sólo especificado será ingresado
-LivelinkConnector.AllDocumentMetadataWillBeIngested=Todo documento de metadatos se ingresa
-LivelinkConnector.MetadataSpecification=especificación de metadatos:
-LivelinkConnector.SpecificMetadata=Metadata específico:
-LivelinkConnector.NoMetadataSpecified=Ningún metadata especificado
-LivelinkConnector.PathNameMetadataAttribute=Camino-atributo de nombre metadatos:
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-LivelinkConnector.PathValueMapping=Camino-trazar un mapa de valor:
-LivelinkConnector.NoMappingsSpecified=No hay trazado de mapa especificado
-LivelinkConnector.CacheLifetimeCannotBeNull=Vida útil de la caché no puede ser nulo
-LivelinkConnector.CacheLifetimeMustBeAnInteger=Vida útil de la caché debe ser un entero
-LivelinkConnector.CacheLRUSizeCannotBeNull=Tamaño de caché LRU no puede ser nulo
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=Tamaño de caché LRU debe ser un entero
-
-LivelinkConnector.ServerProtocol=protocolo de servidor:
-LivelinkConnector.internal=interna
-LivelinkConnector.ServerHTTPCGIPath=Ruta de acceso HTTP CGI del servidor:
-LivelinkConnector.ServerHTTPNTLMDomain=Servidor dominio de HTTP:
-LivelinkConnector.ServerHTTPNTLMUserName=Servidor HTTP NTLM nombre de usuario:
-LivelinkConnector.ServerHTTPNTLMPassword=Servidor HTTP NTLM contraseña:
-LivelinkConnector.ServerSSLCertificateList=Servidor SSL lista de certificado:
-LivelinkConnector.EnterTheServerCgiPathToLivelink=Introduzca la ruta CGI del servidor para llegar enlace en directo
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=El camino CGI del servidor debe comenzar con una '/' carácter
-LivelinkConnector.Delete=Borrar
-LivelinkConnector.Add=Add
-LivelinkConnector.CrawlUserWorkspaces=Espacios de trabajo de usuario de velocidad lenta?
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=Introduzca la ruta vista CGI para un Enlace directo
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=El camino CGI ingreso debe estar en blanco o comenzar con un '/' carácter
-LivelinkConnector.UseLAPI=Usar LAPI
-LivelinkConnector.SelectAViewProtocol=Seleccione un protocolo de vista
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties
deleted file mode 100644
index d179f83..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties
+++ /dev/null
@@ -1,151 +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.
-
-LivelinkConnector.NoAccessTokensPresent=アクセストークンが存在しません
-LivelinkConnector.NoAccessTokensSpecified=アクセストークンが未定義です
-LivelinkConnector.Cache=キャッシュ
-LivelinkConnector.CacheLifetime=キャッシュライフタイム:
-LivelinkConnector.CacheLRUSize=キャッシュLRUサイズ:
-LivelinkConnector.minutes=分
-LivelinkConnector.Server=サーバ
-LivelinkConnector.DocumentAccess=ドキュメントアクセス
-LivelinkConnector.DocumentView=ドキュメント表示
-LivelinkConnector.Paths=パス
-LivelinkConnector.Filters=フィルタ
-LivelinkConnector.Security=セキュリティ
-LivelinkConnector.Metadata=メタデータ
-LivelinkConnector.UserMapping=ユーザマップ
-LivelinkConnector.AValidNumberIsRequired=数値を入力してください
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=正しいユーザ名正規表現式を入力してください
-LivelinkConnector.EnterALivelinkServerName=LiveLinkサーバ名を入力してください
-LivelinkConnector.AServerPortNumberIsRequired=サーバポート番号を入力してください
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=ユーザ名正規表現を入力してください
-LivelinkConnector.ServerName=サーバ名:
-LivelinkConnector.ServerPort=サーバポート:
-LivelinkConnector.ServerUserName=サーバユーザ名:
-LivelinkConnector.ServerPassword=サーバパスワード:
-LivelinkConnector.UserNameRegularExpression=ユーザ名正規表現式:
-LivelinkConnector.LivelinkUserExpression=Livelinkユーザ式:
-LivelinkConnector.Parameters=引数:
-LivelinkConnector.ChooseACertificateFile=証明書ファイルを選択してください
-LivelinkConnector.AValidNumberIsRequired=正しい数字を入力してください
-LivelinkConnector.AValidNumberOrBlankIsRequired=正しい数字を入力又は空白に設定してください
-LivelinkConnector.EnterALivelinkServerName=LiveLinkサーバ名を入力してください
-LivelinkConnector.AServerPortNumberIsRequired=サーバポート番号を入力してください
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=LiveLinkへのクロールCGIパスを入力してください
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=収集CGIパスは「/」から始めてください
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=表示CGIパスは空白又は「/」から始めてください
-LivelinkConnector.DocumentFetchProtocol=コンテンツ収集プロトコル:
-LivelinkConnector.DocumentFetchPort=ポート番号:
-LivelinkConnector.DocumentFetchSSLCertificateList=コンテンツ収集SSL証明書一覧:
-LivelinkConnector.NoCertificatesPresent=証明書がありません
-LivelinkConnector.DeleteCert=証明書を削除 
-LivelinkConnector.AddCert=証明書を追加
-LivelinkConnector.Certificate=証明書
-LivelinkConnector.DocumentFetchCGIPath=コンテンツ収集CGIパス:
-LivelinkConnector.DocumentFetchNTLMDomain=コンテンツを収集するNTLMドメイン:
-LivelinkConnector.SetIfNTLMAuthDesired=(NTLM権限を利用する場合)
-LivelinkConnector.DocumentFetchNTLMUserName=コンテンツ収集NTLMユーザ名:
-LivelinkConnector.SetIfDifferentFromServerUserName=(サーバユーザ名と異なる場合に設定)
-LivelinkConnector.DocumentFetchNTLMPassword=コンテンツ収集NTLMパスワード:
-LivelinkConnector.SetIfDifferentFromServerPassword=(サーバパスワードと異なる場合に設定)
-LivelinkConnector.DocumentViewProtocol=コンテンツ表示プロトコル:
-LivelinkConnector.SameAsFetchProtocol=収集プロトコルと同じ
-LivelinkConnector.DocumentViewServerName=コンテンツ表示サーバ名:
-LivelinkConnector.BlankSameAsFetchServer=(空白 = 収集サーバと同じ)
-LivelinkConnector.DocumentViewPort=コンテンツ表示ポート番号:
-LivelinkConnector.DocumentViewCGIPath=コンテンツ表示CGIパス
-LivelinkConnector.Parameters=引数:
-LivelinkConnector.certificates= 証明書
-LivelinkConnector.SelectAFolderFirst=フォルダを選択してください
-LivelinkConnector.TypeInAFileSpecification=ファイルパターンを入力してください
-LivelinkConnector.TypeInAnAccessToken=アクセストークンを入力してください
-LivelinkConnector.SelectAWorkspaceFirst=ワークスペースを選択してください
-LivelinkConnector.SelectACategoryFirst=カテゴリを選択してください
-LivelinkConnector.SelectAtLeastOneAttributeFirst=1つ以上の属性を選択してください。プールダウン題名を選択しないでください
-LivelinkConnector.MatchStringCannotBeEmpty=パターンを入力してください
-LivelinkConnector.MatchStringMustBeValidRegularExpression=パターンを正規表現で定義してください
-LivelinkConnector.DeletePath=パスを削除: #
-LivelinkConnector.NoStartingPointsDefined=開始ポイントを指定してください
-LivelinkConnector.AddPath=パスの追加
-LivelinkConnector.AddToPath=パスに追加
-LivelinkConnector.PickAFolder=-- フォルダを選択してください --
-LivelinkConnector.DeleteFilespec=ファイルパターンを削除: #
-LivelinkConnector.NoIncludeExcludeFilesDefined=ファイルを含む/除外するかを選択してください
-LivelinkConnector.AddFileSpecification=ファイルパターンを追加
-LivelinkConnector.Include=含む
-LivelinkConnector.Exclude=除外
-LivelinkConnector.SecurityColon=セキュリティ:
-LivelinkConnector.Enabled=有効
-LivelinkConnector.Disabled=無効
-LivelinkConnector.DeleteToken=トークンを削除: #
-LivelinkConnector.AddAccessToken=アクセストークンを追加
-LivelinkConnector.IngestALLMetadata=すべてのメタデータを収集?
-LivelinkConnector.Yes=はい
-LivelinkConnector.No=いいえ
-LivelinkConnector.DeleteMetadata=メタデータを削除: #
-LivelinkConnector.NoMetadataSpecified=メタデータは選択されていません
-LivelinkConnector.AddMetadataItem=メタデータを追加
-LivelinkConnector.BackUpMetadataPath=バックアップメタデータパス
-LivelinkConnector.AllAttributesInThisCategory=カテゴリのすべての属性
-LivelinkConnector.PickAttributes=-- 属性を選択してください --
-LivelinkConnector.AddToMetadataPath=メタデータパスに追加
-LivelinkConnector.PickWorkspace=-- ワークスペースを選択してください --
-LivelinkConnector.BackUpMetadataPath=バックアップメタデータパス
-LivelinkConnector.PickAFolder=-- フォルダを選択してください --
-LivelinkConnector.AddCategory=カテゴリの追加
-LivelinkConnector.PickACategory=-- カテゴリを選択してください --
-LivelinkConnector.PathAttributeName=パス属性名:
-LivelinkConnector.PathSeparatorString=Path separator string:
-LivelinkConnector.DeleteMapping=マップを削除: #
-LivelinkConnector.NoMappingsSpecified=マップが指定されていません
-LivelinkConnector.AddToMappings=マップに追加
-LivelinkConnector.Roots=ルート:
-LivelinkConnector.NoStartPointsSpecified=開始ポイントを指定してください
-LivelinkConnector.FileSpecs=ファイルパターン:
-LivelinkConnector.NoFileSpecsSpecified=ファイルパターンは指定されていません
-LivelinkConnector.Enabled2=有効
-LivelinkConnector.AccessTokens=アクセストークン:
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=指定されたメタデータのみを収集します
-LivelinkConnector.AllDocumentMetadataWillBeIngested=すべてのコンテンツメタデータを収集します
-LivelinkConnector.MetadataSpecification=メタデータパターン:
-LivelinkConnector.SpecificMetadata=特定のメタデータ:
-LivelinkConnector.NoMetadataSpecified=メタデータは指定されていません
-LivelinkConnector.PathNameMetadataAttribute=Path-nameメタデータ属性:
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性は指定されていません
-LivelinkConnector.PathValueMapping=Path-valueマップ:
-LivelinkConnector.NoMappingsSpecified=マップが指定されていません
-LivelinkConnector.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-LivelinkConnector.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-LivelinkConnector.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
-
-LivelinkConnector.ServerProtocol=サーバプロトコル:
-LivelinkConnector.internal=internal
-LivelinkConnector.ServerHTTPCGIPath=サーバ HTTP CGI パス: 
-LivelinkConnector.ServerHTTPNTLMDomain=サーバ HTTP ドメイン: 
-LivelinkConnector.ServerHTTPNTLMUserName=サーバ HTTP NTLM ユーザ名: 
-LivelinkConnector.ServerHTTPNTLMPassword=サーバ HTTP NTLM パスワード: 
-LivelinkConnector.ServerSSLCertificateList=サーバ SSL 証明書一覧: 
-LivelinkConnector.EnterTheServerCgiPathToLivelink=Enter the server CGI path to reach Livelink
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=The server CGI path must begin with a '/' character
-LivelinkConnector.Delete=削除
-LivelinkConnector.Add=追加
-LivelinkConnector.CrawlUserWorkspaces=Crawl user workspaces?
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=Enter the view CGI path to LiveLink
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=The ingestion CGI path must be blank or begin with a '/' character
-LivelinkConnector.UseLAPI=Use LAPI
-LivelinkConnector.SelectAViewProtocol=Select a view protocol
diff --git a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_zh_CN.properties b/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_zh_CN.properties
deleted file mode 100644
index 501e184..0000000
--- a/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_zh_CN.properties
+++ /dev/null
@@ -1,151 +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.
-
-LivelinkConnector.NoAccessTokensPresent=访问令牌不存在
-LivelinkConnector.NoAccessTokensSpecified=访问令牌未指定
-LivelinkConnector.Cache=缓存
-LivelinkConnector.CacheLifetime=缓存寿命: 
-LivelinkConnector.CacheLRUSize=缓存LRU大小: 
-LivelinkConnector.minutes=分
-LivelinkConnector.Server=服务器
-LivelinkConnector.DocumentAccess=文档访问
-LivelinkConnector.DocumentView=文档显示
-LivelinkConnector.Paths=路径
-LivelinkConnector.Filters=过滤器
-LivelinkConnector.Security=安全
-LivelinkConnector.Metadata=元数据
-LivelinkConnector.UserMapping=用户映射
-LivelinkConnector.AValidNumberIsRequired=请输入有效的数字
-LivelinkConnector.UserNameRegularExpressionMustBeValidRegularExpression=请输入有效的用户名正则表达式
-LivelinkConnector.EnterALivelinkServerName=请输入LiveLink服务器名
-LivelinkConnector.AServerPortNumberIsRequired=请输入服务器端口号
-LivelinkConnector.UserNameRegularExpressionCannotBeNull=请输入用户名正则表达式
-LivelinkConnector.ServerName=服务器名: 
-LivelinkConnector.ServerPort=服务器端口: 
-LivelinkConnector.ServerUserName=服务器用户名: 
-LivelinkConnector.ServerPassword=服务器密码: 
-LivelinkConnector.UserNameRegularExpression=用户名正则表达式: 
-LivelinkConnector.LivelinkUserExpression=Livelink用户表达式: 
-LivelinkConnector.Parameters=参数: 
-LivelinkConnector.ChooseACertificateFile=请选择证书文件
-LivelinkConnector.AValidNumberIsRequired=请输入有效的数字
-LivelinkConnector.AValidNumberOrBlankIsRequired=请输入有效的数字或设为空
-LivelinkConnector.EnterALivelinkServerName=请输入LiveLink服务器名
-LivelinkConnector.AServerPortNumberIsRequired=请输入服务器端口号
-LivelinkConnector.EnterTheCrawlCgiPathToLivelink=请输入指向LiveLink的爬取CGI路径
-LivelinkConnector.TheIngestCgiPathMustBeginWithACharacter=爬取CGI路径的第一个字符必须为‘/’
-LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter=显示CGI路径需设为空或始于‘/’字符
-LivelinkConnector.DocumentFetchProtocol=文档提取协议: 
-LivelinkConnector.DocumentFetchPort=文档提取端口号: 
-LivelinkConnector.DocumentFetchSSLCertificateList=文档提取SSL证书列表: 
-LivelinkConnector.NoCertificatesPresent=证书不存在
-LivelinkConnector.DeleteCert=删除证书 
-LivelinkConnector.AddCert=添加证书
-LivelinkConnector.Certificate=证书
-LivelinkConnector.DocumentFetchCGIPath=文档提取CGI路径: 
-LivelinkConnector.DocumentFetchNTLMDomain=文档提取NTLM域: 
-LivelinkConnector.SetIfNTLMAuthDesired=(使用NTLM权限时设置)
-LivelinkConnector.DocumentFetchNTLMUserName=文档提取NTLM用户名: 
-LivelinkConnector.SetIfDifferentFromServerUserName=(与服务器用户名不同时设置)
-LivelinkConnector.DocumentFetchNTLMPassword=文档提取NTLM密码: 
-LivelinkConnector.SetIfDifferentFromServerPassword=(与服务器密码不同时设置)
-LivelinkConnector.DocumentViewProtocol=文档显示协议: 
-LivelinkConnector.SameAsFetchProtocol=与提取协议相同
-LivelinkConnector.DocumentViewServerName=文档显示服务器名: 
-LivelinkConnector.BlankSameAsFetchServer=(空白 = 与提取服务器相同)
-LivelinkConnector.DocumentViewPort=文档显示端口号: 
-LivelinkConnector.DocumentViewCGIPath=文档显示CGI路径
-LivelinkConnector.Parameters=参数: 
-LivelinkConnector.certificates=证书
-LivelinkConnector.SelectAFolderFirst=请选择文件夹
-LivelinkConnector.TypeInAFileSpecification=请输入文件规范
-LivelinkConnector.TypeInAnAccessToken=请输入访问令牌
-LivelinkConnector.SelectAWorkspaceFirst=请选择工作区
-LivelinkConnector.SelectACategoryFirst=请选择分类
-LivelinkConnector.SelectAtLeastOneAttributeFirst=请至少选择一个属性。不要选择下拉式标题
-LivelinkConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-LivelinkConnector.MatchStringMustBeValidRegularExpression=匹配字符串需输入有效的正则表达式
-LivelinkConnector.DeletePath=删除路径:  #
-LivelinkConnector.NoStartingPointsDefined=请指定起点
-LivelinkConnector.AddPath=添加路径
-LivelinkConnector.AddToPath=添加到路径
-LivelinkConnector.PickAFolder=-- 请选择文件夹 --
-LivelinkConnector.DeleteFilespec=删除文件规范:  #
-LivelinkConnector.NoIncludeExcludeFilesDefined=请选择包含/排除文件
-LivelinkConnector.AddFileSpecification=添加文件规范
-LivelinkConnector.Include=包含
-LivelinkConnector.Exclude=排除
-LivelinkConnector.SecurityColon=安全: 
-LivelinkConnector.Enabled=有效
-LivelinkConnector.Disabled=无效
-LivelinkConnector.DeleteToken=删除令牌:  #
-LivelinkConnector.AddAccessToken=添加访问令牌
-LivelinkConnector.IngestALLMetadata=爬取所有元数据?
-LivelinkConnector.Yes=是
-LivelinkConnector.No=否
-LivelinkConnector.DeleteMetadata=删除元数据:  #
-LivelinkConnector.NoMetadataSpecified=元数据未指定
-LivelinkConnector.AddMetadataItem=添加元数据
-LivelinkConnector.BackUpMetadataPath=备份元数据路径
-LivelinkConnector.AllAttributesInThisCategory=此分类的所有属性
-LivelinkConnector.PickAttributes=-- 请选择属性 --
-LivelinkConnector.AddToMetadataPath=添加到元数据路径
-LivelinkConnector.PickWorkspace=-- 请选择工作区 --
-LivelinkConnector.BackUpMetadataPath=备份元数据路径
-LivelinkConnector.PickAFolder=-- 请选择文件夹 --
-LivelinkConnector.AddCategory=添加分类
-LivelinkConnector.PickACategory=-- 请选择分类 --
-LivelinkConnector.PathAttributeName=路径属性名: 
-LivelinkConnector.PathSeparatorString=路径分隔符:
-LivelinkConnector.DeleteMapping=删除映射:  #
-LivelinkConnector.NoMappingsSpecified=映射未指定
-LivelinkConnector.AddToMappings=添加到映射
-LivelinkConnector.Roots=根: 
-LivelinkConnector.NoStartPointsSpecified=起点未指定
-LivelinkConnector.FileSpecs=文件规范: 
-LivelinkConnector.NoFileSpecsSpecified=文件规范未指定
-LivelinkConnector.Enabled2=有效
-LivelinkConnector.AccessTokens=访问令牌: 
-LivelinkConnector.OnlySpecifiedMetadataWillBeIngested=只爬取指定的元数据
-LivelinkConnector.AllDocumentMetadataWillBeIngested=爬取所有文档元数据
-LivelinkConnector.MetadataSpecification=元数据规范: 
-LivelinkConnector.SpecificMetadata=特定元数据: 
-LivelinkConnector.NoMetadataSpecified=元数据未指定
-LivelinkConnector.PathNameMetadataAttribute=路径名元数据属性: 
-LivelinkConnector.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-LivelinkConnector.PathValueMapping=路径值映射: 
-LivelinkConnector.NoMappingsSpecified=映射未指定
-LivelinkConnector.CacheLifetimeCannotBeNull=请输入缓存寿命
-LivelinkConnector.CacheLifetimeMustBeAnInteger=缓存寿命需输入整数
-LivelinkConnector.CacheLRUSizeCannotBeNull=缓存LRU大小不能为空
-LivelinkConnector.CacheLRUSizeMustBeAnInteger=缓存LRU大小需输入整数
-
-LivelinkConnector.ServerProtocol=服务器协议: 
-LivelinkConnector.internal=内部
-LivelinkConnector.ServerHTTPCGIPath=服务器HTTP CGI路径:  
-LivelinkConnector.ServerHTTPNTLMDomain=服务器HTTP域:  
-LivelinkConnector.ServerHTTPNTLMUserName=服务器HTTP NTLM用户名:  
-LivelinkConnector.ServerHTTPNTLMPassword=服务器HTTP NTLM密码:  
-LivelinkConnector.ServerSSLCertificateList=服务器SSL证书列表:  
-LivelinkConnector.EnterTheServerCgiPathToLivelink=请输入指向Livelink的服务器CGI路径 
-LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=服务器CGI路径需始于'/'字符
-LivelinkConnector.Delete=删除
-LivelinkConnector.Add=添加
-LivelinkConnector.CrawlUserWorkspaces=爬取用户工作区
-
-LivelinkConnector.EnterTheViewCgiPathToLivelink=请输入指向LiveLink的显示CGI路径 
-LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter=爬取CGI路径需设为空或始于'/'字符
-LivelinkConnector.UseLAPI=使用LAPI
-LivelinkConnector.SelectAViewProtocol=请选择显示协议
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration.js b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration.js
deleted file mode 100644
index 07eb1bb..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration.js
+++ /dev/null
@@ -1,98 +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.

--->

-<script type="text/javascript">

-    <!--

-    function ServerDeleteCertificate(aliasName)

-    {

-      editconnection.serverkeystorealias.value = aliasName;

-      editconnection.serverconfigop.value = "Delete";

-      postForm();

-    }

-

-    function ServerAddCertificate()

-    {

-      if (editconnection.servercertificate.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.ChooseACertificateFile'))");

-        editconnection.servercertificate.focus();

-      }

-      else

-      {

-        editconnection.serverconfigop.value = "Add";

-        postForm();

-      }

-    }

-

-    function checkConfig()

-    {

-      if (editconnection.serverport.value != "" && !isInteger(editconnection.serverport.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.AValidNumberIsRequired'))");

-        editconnection.serverport.focus();

-        return false;

-      }

-      return true;

-    }

-

-    function checkConfigForSave()

-    {

-      if (editconnection.servername.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.EnterALivelinkServerName'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Server'))");

-        editconnection.servername.focus();

-        return false;

-      }

-      if (editconnection.serverport.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.AServerPortNumberIsRequired'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Server'))");

-        editconnection.serverport.focus();

-        return false;

-      }

-      if (editconnection.cachelifetime.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.CacheLifetimeCannotBeNull'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Cache'))");

-        editconnection.cachelifetime.focus();

-        return false;

-      }

-      if (editconnection.cachelifetime.value != "" && !isInteger(editconnection.cachelifetime.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.CacheLifetimeMustBeAnInteger'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Cache'))");

-        editconnection.cachelifetime.focus();

-        return false;

-      }

-      if (editconnection.cachelrusize.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.CacheLRUSizeCannotBeNull'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Cache'))");

-        editconnection.cachelrusize.focus();

-        return false;

-      }

-      if (editconnection.cachelrusize.value != "" && !isInteger(editconnection.cachelrusize.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.CacheLRUSizeMustBeAnInteger'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Cache'))");

-        editconnection.cachelrusize.focus();

-        return false;

-      }

-      return true;

-    }

-    //-->

-</script>
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration_Cache.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration_Cache.html
deleted file mode 100644
index c806979..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration_Cache.html
+++ /dev/null
@@ -1,37 +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.

--->

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Cache'))

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.CacheLifetime'))</nobr></td>

-    <td class="value">

-      <input type="text" size="5" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/>

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.minutes'))

-    </td>

-  </tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.CacheLRUSize'))</nobr></td>

-    <td class="value">

-      <input type="text" size="5" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/>

-    </td>

-  </tr>

-</table>

-#else

-<input type="hidden" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/>

-<input type="hidden" name="cachelrusize"  value="$Encoder.attributeEscape($CACHELRUSIZE)"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration_Server.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration_Server.html
deleted file mode 100644
index 92d6498..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/editConfiguration_Server.html
+++ /dev/null
@@ -1,145 +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.

--->

-<input name="serverconfigop" type="hidden" value="Continue"/>

-#if($SERVERHTTPSKEYSTORE)

-<input type="hidden" name="serverhttpskeystoredata" value="$Encoder.attributeEscape($SERVERHTTPSKEYSTORE)"/>

-#end

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Server'))

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerProtocol'))</td>

-    <td class="value">

-      <select name="serverprotocol" size="2">

-        <option value="internal" #if($SERVERPROTOCOL == 'internal') selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.internal'))</option>

-        <option value="http"     #if($SERVERPROTOCOL == 'http')     selected="selected" #{else} "" #end >http</option>

-        <option value="https"    #if($SERVERPROTOCOL == 'https')    selected="selected" #{else} "" #end >https</option>

-       </select>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="64" name="servername" value="$Encoder.attributeEscape($SERVERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerPort'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="5" name="serverport" value="$SERVERPORT"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerUserName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverusername" value="$Encoder.attributeEscape($SERVERUSERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerPassword'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" size="32" name="serverpassword" value="$Encoder.attributeEscape($SERVERPASSWORD)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPCGIPath'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverhttpcgipath" value="$Encoder.attributeEscape($SERVERHTTPCGIPATH)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPNTLMDomain'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SetIfNTLMAuthDesired'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverhttpntlmdomain" value="$Encoder.attributeEscape($SERVERHTTPNTLMDOMAIN)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPNTLMUserName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverhttpntlmusername" value="$Encoder.attributeEscape($SERVERHTTPNTLMUSERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPNTLMPassword'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" size="32" name="serverhttpntlmpassword" value="$Encoder.attributeEscape($SERVERHTTPNTLMPASSWORD)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerSSLCertificateList'))</nobr>

-    </td>

-    <td class="value">

-      <input type="hidden" name="serverkeystorealias" value=""/>

-      <table class="displaytable">

-        #if($SERVERCERTIFICATESMAP)

-          #foreach($cert in $SERVERCERTIFICATESMAP.entrySet())

-        <tr>

-          <td class="value">

-            <input type="button" onclick='Javascript:ServerDeleteCertificate($Encoder.attributeJavascriptEscape($cert.Key))'

-                   alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.DeleteCert'))$Encoder.attributeEscape($cert.Key)"

-                   value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Delete'))"/>

-            $Encoder.bodyEscape($cert.Value)

-          </td>

-        </tr>

-          #end

-        #else

-        <tr>

-          <td class="message" colspan="2">

-            <nobr>$ResourceBundle.getString('LivelinkConnector.NoCertificatesPresent')</nobr>

-          </td>

-        </tr>

-        #end

-      </table>

-      <input type="button" onclick='Javascript:ServerAddCertificate()' alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddCert'))"

-             value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Add'))"/>&nbsp;

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Certificate'))

-      <input name="servercertificate" size="50" type="file"/>

-    </td>

-  </tr>

-</table>

-#else

-<input type="hidden" name="serverprotocol"          value="$!SERVERPROTOCOL"/>

-<input type="hidden" name="servername"              value="$Encoder.attributeEscape($SERVERNAME)"/>

-<input type="hidden" name="serverport"              value="$!SERVERPORT"/>

-<input type="hidden" name="serverusername"          value="$Encoder.attributeEscape($SERVERUSERNAME)"/>

-<input type="hidden" name="serverpassword"          value="$Encoder.attributeEscape($SERVERPASSWORD)"/>

-<input type="hidden" name="serverhttpcgipath"       value="$Encoder.attributeEscape($SERVERHTTPCGIPATH)"/>

-<input type="hidden" name="serverhttpntlmdomain"    value="$Encoder.attributeEscape($SERVERHTTPNTLMDOMAIN)"/>

-<input type="hidden" name="serverhttpntlmusername"  value="$Encoder.attributeEscape($SERVERHTTPNTLMUSERNAME)"/>

-<input type="hidden" name="serverhttpntlmpassword"  value="$Encoder.attributeEscape($SERVERHTTPNTLMPASSWORD)"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/viewConfiguration.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/viewConfiguration.html
deleted file mode 100644
index 26a2ad7..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/livelink/viewConfiguration.html
+++ /dev/null
@@ -1,34 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description" colspan="1">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Parameters'))

-      </nobr>

-    </td>

-    <td class="value" colspan="3">

-      #foreach($entry in $CONFIGMAP.entrySet())

-      <nobr>

-        ${entry.Key}=${entry.Value}

-      </nobr>

-      <br/>

-      #end

-    </td>

-  </tr>

-</table>

diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration.js b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration.js
deleted file mode 100644
index 4e8a934..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration.js
+++ /dev/null
@@ -1,147 +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.

--->

-

-<script type="text/javascript">

-    <!--

-    function ServerDeleteCertificate(aliasName)

-    {

-      editconnection.serverkeystorealias.value = aliasName;

-      editconnection.serverconfigop.value = "Delete";

-      postForm();

-    }

-

-    function ServerAddCertificate()

-    {

-      if (editconnection.servercertificate.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.ChooseACertificateFile'))");

-        editconnection.servercertificate.focus();

-      }

-      else

-      {

-        editconnection.serverconfigop.value = "Add";

-        postForm();

-      }

-    }

-

-    function IngestDeleteCertificate(aliasName)

-    {

-      editconnection.ingestkeystorealias.value = aliasName;

-      editconnection.ingestconfigop.value = "Delete";

-      postForm();

-    }

-

-    function IngestAddCertificate()

-    {

-      if (editconnection.ingestcertificate.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.ChooseACertificateFile'))");

-        editconnection.ingestcertificate.focus();

-      }

-      else

-      {

-        editconnection.ingestconfigop.value = "Add";

-        postForm();

-      }

-    }

-

-    function checkConfig()

-    {

-      if (editconnection.serverport.value != "" && !isInteger(editconnection.serverport.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.AValidNumberIsRequired'))");

-        editconnection.serverport.focus();

-        return false;

-      }

-      if (editconnection.ingestport.value != "" && !isInteger(editconnection.ingestport.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.AValidNumberOrBlankIsRequired'))");

-        editconnection.ingestport.focus();

-        return false;

-      }

-      if (editconnection.viewport.value != "" && !isInteger(editconnection.viewport.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.AValidNumberOrBlankIsRequired'))");

-        editconnection.viewport.focus();

-        return false;

-      }

-      return true;

-    }

-

-    function checkConfigForSave()

-    {

-      if (editconnection.servername.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.EnterALivelinkServerName'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Server'))");

-        editconnection.servername.focus();

-        return false;

-      }

-      if (editconnection.serverport.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.AServerPortNumberIsRequired'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Server'))");

-        editconnection.serverport.focus();

-        return false;

-      }

-      if (editconnection.serverhttpcgipath.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.EnterTheServerCgiPathToLivelink'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Server'))");

-        editconnection.serverhttpcgipath.focus();

-        return false;

-      }

-      if (editconnection.serverhttpcgipath.value.substring(0,1) != "/")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.TheServerCgiPathMustBeginWithACharacter'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.Server'))");

-        editconnection.serverhttpcgipath.focus();

-        return false;

-      }

-      if (editconnection.viewprotocol.value == "" && editconnection.ingestprotocol.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.SelectAViewProtocol'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.DocumentView'))");

-        editconnection.viewprotocol.focus();

-        return false;

-      }

-      if (editconnection.viewcgipath.value == "" && editconnection.ingestcgipath.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.EnterTheViewCgiPathToLivelink'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.DocumentView'))");

-        editconnection.viewcgipath.focus();

-        return false;

-      }

-      if (editconnection.ingestcgipath.value != "" && editconnection.ingestcgipath.value.substring(0,1) != "/")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.TheIngestCgiPathMustBeBlankOrBeginWithACharacter'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.DocumentAccess'))");

-        editconnection.ingestcgipath.focus();

-        return false;

-      }

-      if (editconnection.viewcgipath.value != "" && editconnection.viewcgipath.value.substring(0,1) != "/")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.TheViewCgiPathMustBeBlankOrBeginWithACharacter'))");

-        SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.DocumentView'))");

-        editconnection.viewcgipath.focus();

-        return false;

-      }

-      return true;

-    }

-

-    //-->

-</script>
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_Access.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_Access.html
deleted file mode 100644
index 6602a95..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_Access.html
+++ /dev/null
@@ -1,127 +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.

--->

-<input name="ingestconfigop" type="hidden" value="Continue"/>

-#if($INGESTKEYSTORE)

-<input type="hidden" name="ingestkeystoredata" value="$Encoder.attributeEscape($INGESTKEYSTORE)"/>

-#end

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.DocumentAccess'))

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  #if($MESSAGE)

-  <tr><td class="message">

-    $Encoder.bodyEscape($MESSAGE)

-  </td></tr>

-  #end

-  <tr>

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchProtocol'))</td>

-    <td class="value">

-      <select name="ingestprotocol" size="3">

-        <option value=""      #if($INGESTPROTOCOL == '')      selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.UseLAPI'))</option>

-        <option value="http"  #if($INGESTPROTOCOL == 'http')  selected="selected" #{else} "" #end >http</option>

-        <option value="https" #if($INGESTPROTOCOL == 'https') selected="selected" #{else} "" #end >https</option>

-      </select>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchPort'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="5" name="ingestport" value="$!INGESTPORT"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchCGIPath'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="ingestcgipath" value="$Encoder.attributeEscape($INGESTCGIPATH)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchNTLMDomain'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SetIfNTLMAuthDesired'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="ingestntlmdomain" value="$Encoder.attributeEscape($INGESTNTLMDOMAIN)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchNTLMUserName'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SetIfDifferentFromServerUserName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="ingestntlmusername" value="$Encoder.attributeEscape($INGESTNTLMUSERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchNTLMPassword'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SetIfDifferentFromServerPassword'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" size="32" name="ingestntlmpassword" value="$Encoder.attributeEscape($INGESTNTLMPASSWORD)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentFetchSSLCertificateList'))</nobr>

-    </td>

-    <td class="value">

-      <input type="hidden" name="ingestkeystorealias" value=""/>

-      <table class="displaytable">

-        #if($INGESTCERTIFICATESMAP)

-          #foreach($cert in $INGESTCERTIFICATESMAP.entrySet())

-        <tr>

-          <td class="value">

-            <input type="button" onclick='Javascript:IngestDeleteCertificate($Encoder.attributeJavascriptEscape($cert.Key))'

-                   alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.DeleteCert'))$Encoder.attributeEscape($cert.Key)"

-                   value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Delete'))"/>

-            $Encoder.bodyEscape($cert.Value)

-          </td>

-        </tr>

-          #end

-        #else

-        <tr>

-          <td class="message" colspan="2">

-            <nobr>$ResourceBundle.getString('LivelinkConnector.NoCertificatesPresent')</nobr>

-          </td>

-        </tr>

-        #end

-      </table>

-      <input type="button" onclick='Javascript:IngestAddCertificate()' alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddCert'))"

-             value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Add'))"/>&nbsp;

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Certificate'))

-      <input name="ingestcertificate" size="50" type="file"/>

-    </td>

-  </tr>

-</table>

-#else

-<input type="hidden" name="ingestprotocol"      value="$!INGESTPROTOCOL"/>

-<input type="hidden" name="ingestport"          value="$!INGESTPORT"/>

-<input type="hidden" name="ingestcgipath"       value="$Encoder.attributeEscape($INGESTCGIPATH)"/>

-<input type="hidden" name="ingestntlmusername"  value="$Encoder.attributeEscape($INGESTNTLMUSERNAME)"/>

-<input type="hidden" name="ingestntlmpassword"  value="$Encoder.attributeEscape($INGESTNTLMPASSWORD)"/>

-<input type="hidden" name="ingestntlmdomain"    value="$Encoder.attributeEscape($INGESTNTLMDOMAIN)"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_Server.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_Server.html
deleted file mode 100644
index 92d6498..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_Server.html
+++ /dev/null
@@ -1,145 +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.

--->

-<input name="serverconfigop" type="hidden" value="Continue"/>

-#if($SERVERHTTPSKEYSTORE)

-<input type="hidden" name="serverhttpskeystoredata" value="$Encoder.attributeEscape($SERVERHTTPSKEYSTORE)"/>

-#end

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Server'))

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerProtocol'))</td>

-    <td class="value">

-      <select name="serverprotocol" size="2">

-        <option value="internal" #if($SERVERPROTOCOL == 'internal') selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.internal'))</option>

-        <option value="http"     #if($SERVERPROTOCOL == 'http')     selected="selected" #{else} "" #end >http</option>

-        <option value="https"    #if($SERVERPROTOCOL == 'https')    selected="selected" #{else} "" #end >https</option>

-       </select>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="64" name="servername" value="$Encoder.attributeEscape($SERVERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerPort'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="5" name="serverport" value="$SERVERPORT"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerUserName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverusername" value="$Encoder.attributeEscape($SERVERUSERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerPassword'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" size="32" name="serverpassword" value="$Encoder.attributeEscape($SERVERPASSWORD)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPCGIPath'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverhttpcgipath" value="$Encoder.attributeEscape($SERVERHTTPCGIPATH)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPNTLMDomain'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SetIfNTLMAuthDesired'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverhttpntlmdomain" value="$Encoder.attributeEscape($SERVERHTTPNTLMDOMAIN)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPNTLMUserName'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="serverhttpntlmusername" value="$Encoder.attributeEscape($SERVERHTTPNTLMUSERNAME)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerHTTPNTLMPassword'))</nobr>

-    </td>

-    <td class="value">

-      <input type="password" size="32" name="serverhttpntlmpassword" value="$Encoder.attributeEscape($SERVERHTTPNTLMPASSWORD)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.ServerSSLCertificateList'))</nobr>

-    </td>

-    <td class="value">

-      <input type="hidden" name="serverkeystorealias" value=""/>

-      <table class="displaytable">

-        #if($SERVERCERTIFICATESMAP)

-          #foreach($cert in $SERVERCERTIFICATESMAP.entrySet())

-        <tr>

-          <td class="value">

-            <input type="button" onclick='Javascript:ServerDeleteCertificate($Encoder.attributeJavascriptEscape($cert.Key))'

-                   alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.DeleteCert'))$Encoder.attributeEscape($cert.Key)"

-                   value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Delete'))"/>

-            $Encoder.bodyEscape($cert.Value)

-          </td>

-        </tr>

-          #end

-        #else

-        <tr>

-          <td class="message" colspan="2">

-            <nobr>$ResourceBundle.getString('LivelinkConnector.NoCertificatesPresent')</nobr>

-          </td>

-        </tr>

-        #end

-      </table>

-      <input type="button" onclick='Javascript:ServerAddCertificate()' alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddCert'))"

-             value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Add'))"/>&nbsp;

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Certificate'))

-      <input name="servercertificate" size="50" type="file"/>

-    </td>

-  </tr>

-</table>

-#else

-<input type="hidden" name="serverprotocol"          value="$!SERVERPROTOCOL"/>

-<input type="hidden" name="servername"              value="$Encoder.attributeEscape($SERVERNAME)"/>

-<input type="hidden" name="serverport"              value="$!SERVERPORT"/>

-<input type="hidden" name="serverusername"          value="$Encoder.attributeEscape($SERVERUSERNAME)"/>

-<input type="hidden" name="serverpassword"          value="$Encoder.attributeEscape($SERVERPASSWORD)"/>

-<input type="hidden" name="serverhttpcgipath"       value="$Encoder.attributeEscape($SERVERHTTPCGIPATH)"/>

-<input type="hidden" name="serverhttpntlmdomain"    value="$Encoder.attributeEscape($SERVERHTTPNTLMDOMAIN)"/>

-<input type="hidden" name="serverhttpntlmusername"  value="$Encoder.attributeEscape($SERVERHTTPNTLMUSERNAME)"/>

-<input type="hidden" name="serverhttpntlmpassword"  value="$Encoder.attributeEscape($SERVERHTTPNTLMPASSWORD)"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_View.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_View.html
deleted file mode 100644
index 0a937ab..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editConfiguration_View.html
+++ /dev/null
@@ -1,80 +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.

--->

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.DocumentView'))

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewProtocol'))</td>

-    <td class="value">

-      <select name="viewprotocol">

-        <option value=""      #if($VIEWPROTOCOL == '')      selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SameAsFetchProtocol'))</option>

-        <option value="http"  #if($VIEWPROTOCOL == 'http')  selected="selected" #{else} "" #end >http</option>

-        <option value="https" #if($VIEWPROTOCOL == 'https') selected="selected" #{else} "" #end >https</option>

-      </select>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewServerName'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.BlankSameAsFetchServer'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="64" name="viewservername" value="$Encoder.attributeEscape($VIEWSERVERNAME)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewPort'))</nobr>

-      <br/>

-      <nobr>(blank = same as fetch port)</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="5" name="viewport" value="$!VIEWPORT"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewCGIPath'))</nobr>

-      <br/>

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.BlankSameAsFetchServer'))</nobr>

-    </td>

-    <td class="value">

-      <input type="text" size="32" name="viewcgipath" value="$Encoder.attributeEscape($VIEWCGIPATH)"/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewAction'))</nobr>

-    </td>

-    <td class="value">

-      <select name="viewaction">

-        <option value="download"  #if($VIEWACTION == 'download')  selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewActionDownload'))</option>

-        <option value="open"      #if($VIEWACTION == 'open')      selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewActionOpen'))</option>

-        <option value="overview"  #if($VIEWACTION == 'overview')  selected="selected" #{else} "" #end >$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DocumentViewActionOverview'))</option>

-      </select>

-    </td>

-  </tr>

-</table>

-#else

-<input type="hidden" name="viewprotocol"    value="$!VIEWPROTOCOL"/>

-<input type="hidden" name="viewservername"  value="$!VIEWSERVERNAME"/>

-<input type="hidden" name="viewport"        value="$!VIEWPORT"/>

-<input type="hidden" name="viewcgipath"     value="$Encoder.attributeEscape($VIEWCGIPATH)"/>

-<input type="hidden" name="viewaction"        value="$!VIEWACTION"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification.js b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification.js
deleted file mode 100644
index 3c8d28b..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification.js
+++ /dev/null
@@ -1,123 +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.

--->

-

-<script type="text/javascript">

-    <!--

-

-    function ${SEQPREFIX}SpecOp(n, opValue, anchorvalue)

-    {

-      eval("editjob."+n+".value = \""+opValue+"\"");

-      postFormSetAnchor(anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddToPath(anchorvalue)

-    {

-    console.log(anchorvalue);

-      if (editjob.${SEQPREFIX}pathaddon.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.SelectAFolderFirst'))");

-        editjob.${SEQPREFIX}pathaddon.focus();

-        return;

-      }

-

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}pathop","AddToPath",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddFilespec(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}specfile.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.TypeInAFileSpecification'))");

-        editjob.${SEQPREFIX}specfile.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}fileop","Add",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddToken(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}spectoken.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.TypeInAnAccessToken'))");

-        editjob.${SEQPREFIX}spectoken.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}accessop","Add",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddToMetadata(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}metadataaddon.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.SelectAFolderFirst'))");

-        editjob.${SEQPREFIX}metadataaddon.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}metadataop","AddToPath",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecSetWorkspace(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}metadataaddon.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.SelectAWorkspaceFirst'))");

-        editjob.${SEQPREFIX}metadataaddon.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}metadataop","SetWorkspace",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddCategory(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}categoryaddon.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.SelectACategoryFirst'))");

-        editjob.${SEQPREFIX}categoryaddon.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}metadataop","AddCategory",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddMetadata(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}attributeselect.value == "" && editjob.${SEQPREFIX}attributeall.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.SelectAtLeastOneAttributeFirst'))");

-        editjob.${SEQPREFIX}attributeselect.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}metadataop","Add",anchorvalue);

-    }

-

-    function ${SEQPREFIX}SpecAddMapping(anchorvalue)

-    {

-      if (editjob.${SEQPREFIX}specmatch.value == "")

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.MatchStringCannotBeEmpty'))");

-        editjob.${SEQPREFIX}specmatch.focus();

-        return;

-      }

-      if (!isRegularExpression(editjob.${SEQPREFIX}specmatch.value))

-      {

-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('LivelinkConnector.MatchStringMustBeValidRegularExpression'))");

-        editjob.${SEQPREFIX}specmatch.focus();

-        return;

-      }

-      ${SEQPREFIX}SpecOp("${SEQPREFIX}specmappingop","Add",anchorvalue);

-    }

-    //-->

-</script>
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Filters.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Filters.html
deleted file mode 100644
index 39c278b..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Filters.html
+++ /dev/null
@@ -1,85 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Filters') && ${SeqNum} == ${SelectedNum})

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  #set($filtercounter = 0)

-  #foreach($fileSpec in $FILESPECS)

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_specfiletype_${filtercounter}" value="$Encoder.attributeEscape($fileSpec.Left)"/>

-      <input type="hidden" name="s${SeqNum}_fileop_${filtercounter}" value=""/>

-      <a name="s${SeqNum}_filespec_${filtercounter}">

-        <input type="button" value="Delete"

-               onClick="Javascript:s${SeqNum}_SpecOp('s${SeqNum}_fileop_${filtercounter}','Delete','s${SeqNum}_filespec_${filtercounter}')"

-               alt="$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DeleteFilespec'))${filtercounter}"/>

-      </a>

-    </td>

-    <td class="value">

-    <input type="hidden" name="s${SeqNum}_specfile_${filtercounter}" value="$Encoder.attributeEscape($fileSpec.Right)"/>

-    #if($fileSpec.Left == "include")

-      Include:

-    #elseif($fileSpec.Left == "exclude")

-      Exclude:

-    #end

-    $Encoder.bodyEscape($fileSpec.Right)

-    </td>

-  </tr>

-    #set($filtercounter = $filtercounter + 1)

-  #end

-

-  #if($filtercounter == 0)

-  <tr>

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoIncludeExcludeFilesDefined'))

-    </td>

-  </tr>

-  #end

-

-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>

-

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_filecount" value="${filtercounter}"/>

-      <input type="hidden" name="s${SeqNum}_fileop" value=""/>

-      <a name="s${SeqNum}_path_${filtercounter}">

-        #set($anchorSuffix = $filtercounter+1)

-        <input type="button" value="Add"

-               onClick="Javascript:s${SeqNum}_SpecAddFilespec('s${SeqNum}_filespec_${anchorSuffix}')"

-              alt="$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.AddFileSpecification'))"/>

-      </a>

-    </td>

-    <td class="value">

-      <select name="s${SeqNum}_specfiletype">

-      <option value="include" selected="selected">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Include'))</option>

-      <option value="exclude">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Exclude'))</option>

-      </select>

-      <input type="text" size="30" name="s${SeqNum}_specfile" value=""/>

-    </td>

-  </tr>

-</table>

-#else

-  #set($filtercounter = 0)

-  #foreach($fileSpec in $FILESPECS)

-  <input type="hidden" name="s${SeqNum}_specfiletype_${filtercounter}" value="$Encoder.attributeEscape($fileSpec.Left)"/>

-  <input type="hidden" name="s${SeqNum}_specfile_${filtercounter}" value="$Encoder.attributeEscape($fileSpec.Right)"/>

-    #set($filtercounter = $filtercounter + 1)

-  #end

-  <input type="hidden" name="s${SeqNum}_filecount" value="$filtercounter"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Metadata.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Metadata.html
deleted file mode 100644
index c9f5bb9..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Metadata.html
+++ /dev/null
@@ -1,238 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Metadata') && ${SeqNum} == ${SelectedNum})

-<input type="hidden" name="s${SeqNum}_specmappingcount" value="$MATCHMAP.size()"/>

-<input type="hidden" name="s${SeqNum}_specmappingop" value=""/>

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description" colspan="1">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.IngestALLMetadata'))</nobr>

-    </td>

-    <td class="value" colspan="3">

-      <nobr>

-        <input type="radio" name="s${SeqNum}_specallmetadata" value="true"  #if($INGESTALLMETADATA) checked="true" #{else} "" #end />

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Yes'))

-      </nobr>&nbsp;

-      <nobr>

-        <input type="radio" name="s${SeqNum}_specallmetadata" value="false" #if(!$INGESTALLMETADATA) checked="true" #{else} "" #end/>

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.No'))

-      </nobr>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  #set($counter = 0)

-  #foreach($meta in $METADATA)

-  <tr>

-    <td class="description" colspan="1">

-      <input type="hidden" name="s${SeqNum}_metadataop_${counter}" value=""/>

-      <input type="hidden" name="s${SeqNum}_speccategory_${counter}" value="$Encoder.attributeEscape($meta.Left)"/>

-      <input type="hidden" name="s${SeqNum}_specattributeall_${counter}" value="$meta.Right.Left"/>

-      <input type="hidden" name="s${SeqNum}_specattribute_${counter}" value="$Encoder.attributeEscape($meta.Right.Right)"/>

-      <a name="s${SeqNum}_metadata_${counter}">

-        <input type="button" value="Delete"

-               onClick="Javascript:s${SeqNum}_SpecOp('s${SeqNum}_metadataop_${counter}','Delete','s${SeqNum}_metadata_${counter}')"

-               alt="$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DeleteMetadata'))${counter}"/>

-      </a>

-    </td>

-    <td class="value" colspan="3">

-      $Encoder.bodyEscape($meta.Left):

-    #if($meta.Right.Left == "true")

-      (All metadata attributes)

-    #else

-      $Encoder.bodyEscape($meta.Right.Right)

-    #end

-    </td>

-  </tr>

-    #set($counter = $counter + 1)

-  #end

-

-  #if($counter == 0)

-  <tr>

-    <td class="message" colspan="4">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoMetadataSpecified'))

-    </td>

-  </tr>

-  #end

-

-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>

-

-  <tr>

-  #if($MESSAGE)

-    <td class="message" colspan="4">$Encoder.bodyEscape($MESSAGE)</td>

-  #else

-    <td class="description" colspan="1">

-      <input type="hidden" name="s${SeqNum}_metadatacount" value="${counter}"/>

-      <input type="hidden" name="s${SeqNum}_speccategory" value="$Encoder.attributeEscape($CATEGORYSOFAR)"/>

-      <input type="hidden" name="s${SeqNum}_metadataop" value=""/>

-    #set($anchorSuffix = $counter+1)

-    #if($ATTRIBUTELIST && $ATTRIBUTELIST.size() > 0)

-      <a name="s${SeqNum}_metadata_${counter}">

-        <input type="button" value="Add"

-               onClick="Javascript:s${SeqNum}_SpecAddMetadata('s${SeqNum}_metadata_${anchorSuffix}')"

-              alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddMetadataItem'))"/>

-      </a>

-    </td>

-    <td class="value" colspan="3">

-      $Encoder.bodyEscape($CATEGORYSOFAR):

-      <table class="displaytable">

-        <tr>

-          <td class="value">

-            <input type="checkbox" name="s${SeqNum}_attributeall" value="true"/>

-            $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.AllAttributesInThisCategory'))

-            <br/>

-            <select name="s${SeqNum}_attributeselect">

-              <option value="" selected="selected">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PickAttributes'))</option>

-              #foreach($attrName in $ATTRIBUTELIST)

-              <option value="$Encoder.attributeEscape($attrName)">$Encoder.bodyEscape($attrName)</option>

-              #end

-            </select>

-          </td>

-        </tr>

-      </table>

-    #elseif($WORKSPACELIST && $WORKSPACELIST.size() > 0)

-    </td>

-    <td class="value" colspan="3">

-      <a name="s${SeqNum}_metadata_${counter}">

-        <input type="button" value="+"

-               onClick="Javascript:s${SeqNum}_SpecSetWorkspace('s${SeqNum}_metadata_${anchorSuffix}')"

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddToMetadataPath'))"/>

-      </a>

-      <select name="s${SeqNum}_metadataaddon">

-        <option value="" selected="selected">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PickWorkspace'))</option>

-        #foreach($workSpace in $WORKSPACELIST)

-          <option value="$Encoder.attributeEscape($workSpace)">$Encoder.bodyEscape($workSpace)</option>

-        #end

-      </select>

-    #else

-    </td>

-    <td class="value" colspan="3">

-      #if($CATEGORYSOFAR.length() == 0)

-        (root)

-      #else

-        <input type="button" value="-"

-               onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_metadataop","Up","s${SeqNum}_metadata_${counter}")'

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.BackUpMetadataPath'))"/>&nbsp;

-        $Encoder.bodyEscape($CATEGORYSOFAR)

-      #end

-      #if($CHILDLIST && $CHILDLIST.size() > 0)

-        <input type="button" value="+"

-               onClick='Javascript:s${SeqNum}_SpecAddToMetadata("s${SeqNum}_metadata_${counter}")'

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddToMetadataPath'))"/>&nbsp;

-        <select name="s${SeqNum}_metadataaddon">

-          <option value="" selected="selected">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PickAFolder'))</option>

-        #foreach($child in $CHILDLIST)

-          <option value="$Encoder.attributeEscape($child)">$Encoder.bodyEscape($child)</option>

-        #end

-        </select>

-      #end

-      #if($CATEGORYLIST && $CATEGORYLIST.size() > 0)

-        <input type="button" value="+"

-               onClick='Javascript:s${SeqNum}_SpecAddCategory("s${SeqNum}_metadata_${counter}")'

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddCategory'))"/>&nbsp;

-        <select name="s${SeqNum}_categoryaddon">

-          <option value="" selected="selected">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PickACategory'))</option>

-          #foreach($category in $CATEGORYLIST)

-            <option value="$Encoder.attributeEscape($category)">$Encoder.bodyEscape($category)</option>

-          #end

-        </select>

-      #end

-    #end

-  #end

-  </tr>

-  <tr><td class="separator" colspan="4"><hr/></td></tr>

-  <tr>

-    <td class="description" colspan="1">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PathAttributeName'))</nobr>

-    </td>

-    <td class="value" colspan="1">

-      <input type="text" name="s${SeqNum}_specpathnameattribute" size="20"

-             value="$Encoder.attributeEscape($PATHNAMEATTRIBUTE)"/>

-    </td>

-    <td class="description" colspan="1">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PathSeparatorString'))</nobr>

-    </td>

-    <td class="value" colspan="1">

-      <input type="text" name="s${SeqNum}_specpathnameseparator" size="20"

-             value="$Encoder.attributeEscape($PATHNAMESEPARATOR)"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="4"><hr/></td></tr>

-  #set($matchMapCount = $MATCHMAP.size())

-  #foreach($entry in $MATCHMAP.entrySet())

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_specmappingop_${foreach.index}" value=""/>

-      <a name="s${SeqNum}_mapping_${foreach.index}">

-        <input type="button" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_specmappingop_${foreach.index}","Delete","s${SeqNum}_mapping_${foreach.index}")'

-                 alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.DeleteMapping'))${foreach.index}" value="Delete"/>

-      </a>

-    </td>

-    <td class="value">

-      <input type="hidden" name="s${SeqNum}_specmatch_${foreach.index}" value="$Encoder.attributeEscape($entry.Key)"/>

-      $Encoder.bodyEscape($entry.Key)

-    </td>

-    <td class="value">==></td>

-    <td class="value">

-      <input type="hidden" name="s${SeqNum}_specreplace_${foreach.index}" value="$Encoder.attributeEscape($entry.Value)"/>

-      $Encoder.bodyEscape($entry.Value)

-    </td>

-  </tr>

-  #end

-  #if($matchMapCount == 0)

-    <tr>

-      <td colspan="4" class="message">

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoMappingsSpecified'))

-      </td>

-    </tr>

-  #end

-  <tr><td class="separator" colspan="4"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      #set($anchorSuffix = $matchMapCount +1)

-      <a name="s${SeqNum}_mapping_${matchMapCount}">

-        <input type="button" onClick='Javascript:s${SeqNum}_SpecAddMapping("s${SeqNum}_mapping_${anchorSuffix}")'

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddToMappings'))" value="Add"/>

-      </a>

-    </td>

-    <td class="value">Match regexp:&nbsp;<input type="text" name="s${SeqNum}_specmatch" size="32" value=""/></td>

-    <td class="value">==></td>

-    <td class="value">Replace string:&nbsp;<input type="text" name="s${SeqNum}_specreplace" size="32" value=""/></td>

-  </tr>

-</table>

-#else

-  <input type="hidden" name="s${SeqNum}_specallmetadata" value="$INGESTALLMETADATA"/>

-  #set($counter = 0)

-  #foreach($meta in $METADATA)

-  <input type="hidden" name="s${SeqNum}_speccategory_${counter}" value="$Encoder.attributeEscape($meta.Left)"/>

-  <input type="hidden" name="s${SeqNum}_specattributeall_${counter}" value="$meta.Right.Left"/>

-  <input type="hidden" name="s${SeqNum}_specattribute_${counter}" value="$Encoder.attributeEscape($meta.Right.Right)"/>

-    #set($counter = $counter + 1)

-  #end

-  <input type="hidden" name="s${SeqNum}_metadatacount" value="${counter}"/>

-  <input type="hidden" name="s${SeqNum}_specpathnameattribute" value="$Encoder.attributeEscape($PATHNAMEATTRIBUTE)"/>

-  <input type="hidden" name="s${SeqNum}_specpathnameseparator" value="$Encoder.attributeEscape($PATHNAMESEPARATOR)"/>

-

-  <input type="hidden" name="s${SeqNum}_specmappingcount" value="$MATCHMAP.size()"/>

-

-  #foreach($entry in $MATCHMAP.entrySet())

-  <input type="hidden" name="s${SeqNum}_specmatch_${foreach.index}"   value="$Encoder.attributeEscape($entry.Key)"/>

-  <input type="hidden" name="s${SeqNum}_specreplace_${foreach.index}" value="$Encoder.attributeEscape($entry.Value)"/>

-  #end

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Paths.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Paths.html
deleted file mode 100644
index 9f285ff..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Paths.html
+++ /dev/null
@@ -1,121 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Paths') && ${SeqNum} == ${SelectedNum})

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.CrawlUserWorkspaces'))</nobr>

-    </td>

-    <td class="value">

-  #if($USERWORKSPACES)

-        <input type="checkbox" name="s${SeqNum}_userworkspace" value="true" checked="true"/>

-  #else

-        <input type="checkbox" name="s${SeqNum}_userworkspace" value="true"/>

-  #end

-      <input type="hidden" name="s${SeqNum}_userworkspace_present" value="true"/>

-    </td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  #set($pathcounter = 0)

-  #foreach($path in $PATHS)

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_specpath_${pathcounter}" value="$Encoder.attributeEscape($path)"/>

-      <input type="hidden" name="s${SeqNum}_pathop_${pathcounter}" value=""/>

-      <a name="s${SeqNum}_path_${pathcounter}">

-        <input type="button" value="Delete"

-               onClick="Javascript:s${SeqNum}_SpecOp('s${SeqNum}_pathop_${pathcounter}','Delete','s${SeqNum}_path_${pathcounter}')"

-               alt="$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.DeletePath'))${pathcounter}"/>

-      </a>

-    </td>

-    <td class="value">

-    #if($path && $path.length() > 0)

-      $Encoder.bodyEscape($path)

-    #else

-      (root)

-    #end

-    </td>

-  </tr>

-    #set($pathcounter = $pathcounter + 1)

-  #end

-

-  #if($pathcounter == 0)

-  <tr>

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoStartingPointsDefined'))

-    </td>

-  </tr>

-  #end

-

-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>

-

-  <tr>

-  #if($MESSAGE)

-    <td class="message" colspan="2">$Encoder.bodyEscape($MESSAGE)</td>

-  #else

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_pathcount" value="${pathcounter}"/>

-      <input type="hidden" name="s${SeqNum}_specpath" value="$Encoder.attributeEscape($PATHSOFAR)"/>

-      <input type="hidden" name="s${SeqNum}_pathop" value=""/>

-      <a name="s${SeqNum}_path_${pathcounter}">

-        #set($anchorSuffix = $pathcounter+1)

-        <input type="button" value="Add"

-               onClick="Javascript:s${SeqNum}_SpecOp('s${SeqNum}_pathop','Add','s${SeqNum}_path_${anchorSuffix}')"

-              alt="$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.AddPath'))"/>

-      </a>

-    </td>

-    <td class="value">

-    #if($PATHSOFAR && $PATHSOFAR.length() > 0)

-      $Encoder.bodyEscape($PATHSOFAR)

-      <input type="button" value="-"

-        onClick="Javascript:s${SeqNum}_SpecOp('s${SeqNum}_pathop','Up','s${SeqNum}_path_${pathcounter}')"

-        alt="Back up path"/>

-    #else

-        (root)

-    #end

-    #if($CHILDLIST && $CHILDLIST.size() > 0)

-      <input type="button" value="+"

-             onClick="Javascript:s${SeqNum}_SpecAddToPath('s${SeqNum}_path_${pathcounter}')"

-             alt="$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.AddPath'))"/>

-      <select name="s${SeqNum}_pathaddon">

-        <option value="" selected="selected">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PickAFolder'))</option>

-        #foreach($child in $CHILDLIST)

-          <option value="$Encoder.attributeEscape($child)">$Encoder.bodyEscape($child)</option>

-        #end

-      </select>

-    #end

-    </td>

-  #end

-  </tr>

-</table>

-#else

-  #set($pathcounter = 0)

-  #foreach($path in $PATHS)

-  <input type="hidden" name="s${SeqNum}_specpath_${pathcounter}" value="$Encoder.attributeEscape($path)"/>

-    #set($pathcounter = $pathcounter + 1)

-  #end

-  <input type="hidden" name="s${SeqNum}_pathcount" value="$pathcounter"/>

-  #if($USERWORKSPACES)

-  <input type="hidden" name="s${SeqNum}_userworkspace" value="true"/>

-  #else

-  <input type="hidden" name="s${SeqNum}_userworkspace" value="false"/>

-  #end

-  <input type="hidden" name="s${SeqNum}_userworkspace_present" value="true"/>

-#end
\ No newline at end of file
diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Security.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Security.html
deleted file mode 100644
index 29fe7c3..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/editSpecification_Security.html
+++ /dev/null
@@ -1,103 +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.

--->

-

-#if($TabName == $ResourceBundle.getString('LivelinkConnector.Security') && ${SeqNum} == ${SelectedNum})

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SecurityColon'))</nobr></td>

-    <td class="value" colspan="1">

-      <nobr>

-        #if($SECURITY == 'on')

-        <input type="radio" name="s${SeqNum}_specsecurity" value="on" checked="true"/>

-        #else

-        <input type="radio" name="s${SeqNum}_specsecurity" value="on"/>

-        #end

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Enabled'))&nbsp;

-        #if($SECURITY == 'off')

-        <input type="radio" name="s${SeqNum}_specsecurity" value="off" checked="true"/>

-        #else

-        <input type="radio" name="s${SeqNum}_specsecurity" value="off"/>

-        #end

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Disabled'))

-      </nobr>

-    </td>

-  </tr>

-

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-

-  #set($atcounter = 0)

-  #foreach($accesstoken in $ACCESSTOKENS)

-

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_accessop_$atcounter" value=""/>

-      <input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($accesstoken)"/>

-      <a name="s${SeqNum}_token_$atcounter">

-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Delete'))"

-               onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_accessop_$atcounter","Delete","s${SeqNum}_token_$atcounter")'

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.DeleteToken'))$atcounter"/>

-      </a>

-    </td>

-    <td class="value">

-      <nobr>$Encoder.bodyEscape($accesstoken)</nobr>

-    </td>

-  </tr>

-

-  #set($atcounter = $atcounter + 1)

-  #end

-  #if($atcounter == 0)

-

-  <tr>

-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoAccessTokensPresent'))</td>

-  </tr>

-

-  #end

-

-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description">

-      <input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>

-      <input type="hidden" name="s${SeqNum}_accessop" value=""/>

-      <a name="s${SeqNum}_token_$atcounter">

-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.Add'))"

-               onClick='Javascript:s${SeqNum}_SpecAddToken("s${SeqNum}_token_$atcounter")'

-               alt="$Encoder.attributeEscape($ResourceBundle.getString('LivelinkConnector.AddAccessToken'))"/>

-      </a>

-    </td>

-    <td class="value">

-      <input type="text" size="30" name="s${SeqNum}_spectoken" value=""/>

-    </td>

-  </tr>

-</table>

-

-#else

-

-<input type="hidden" name="s${SeqNum}_specsecurity" value="$SECURITY"/>

-

-#set($atcounter = 0)

-#foreach($accesstoken in $ACCESSTOKENS)

-

-<input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($accesstoken)"/>

-

-#set($atcounter = $atcounter + 1)

-#end

-

-<input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>

-

-#end

diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/viewConfiguration.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/viewConfiguration.html
deleted file mode 100644
index 26a2ad7..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/viewConfiguration.html
+++ /dev/null
@@ -1,34 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description" colspan="1">

-      <nobr>

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Parameters'))

-      </nobr>

-    </td>

-    <td class="value" colspan="3">

-      #foreach($entry in $CONFIGMAP.entrySet())

-      <nobr>

-        ${entry.Key}=${entry.Value}

-      </nobr>

-      <br/>

-      #end

-    </td>

-  </tr>

-</table>

diff --git a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/viewSpecification.html b/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/viewSpecification.html
deleted file mode 100644
index 8ac10e1..0000000
--- a/connectors/livelink/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/livelink/viewSpecification.html
+++ /dev/null
@@ -1,194 +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.

--->

-

-<table class="displaytable">

-  <tr>

-    <td class="description"/>

-    <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.CrawlUserWorkspaces'))</nobr>

-    </td>

-    <td class="value"/>

-    #if($USERWORKSPACES)$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Yes'))#{else}$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.No'))#end

-    </td>

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    #if($PATHS && $PATHS.size() > 0)

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Roots'))</td>

-    <td class="value">

-      #foreach($path in $PATHS)

-      $path

-      <br/>

-      #end

-    </td>

-    #else

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoStartPointsSpecified'))

-    </td>

-    #end

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    #if($FILESPECS && $FILESPECS.size() > 0)

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.FileSpecs'))</td>

-    <td class="value">

-      #foreach($fileSpec in $FILESPECS)

-      $fileSpec.Left:&nbsp;$fileSpec.Right

-      <br/>

-      #end

-    </td>

-    #else

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoFileSpecsSpecified'))

-    </td>

-    #end

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SecurityColon'))</td>

-    <td class="value">

-      #if($SECURITY == "on")

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Enabled2'))

-      #else

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.Disabled'))

-      #end

-    </td>

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    #if($ACCESSTOKENS && $ACCESSTOKENS.size() > 0)

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.AccessTokens'))</td>

-    <td class="value">

-      #foreach($accessToken in $ACCESSTOKENS)

-      $accessToken

-      <br/>

-      #end

-    </td>

-    #else

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoAccessTokensSpecified'))

-    </td>

-    #end

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    <td class="description">

-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.MetadataSpecification'))</nobr>

-    </td>

-    <td class="value">

-      <nobr>

-        #if($INGESTALLMETADATA)

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.AllDocumentMetadataWillBeIngested'))

-        #else

-        $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.OnlySpecifiedMetadataWillBeIngested'))

-        #end

-      </nobr>

-    </td>

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    #if($METADATA && $METADATA.size() > 0)

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.SpecificMetadata'))</td>

-    <td class="value">

-      #foreach($meta in $METADATA)

-      $Encoder.bodyEscape($meta.Left):

-      #if($meta.Right.Left == "true")

-      (All metadata attributes)

-      #else

-      $Encoder.bodyEscape($meta.Right.Right)

-      #end

-      <br/>

-      #end

-    </td>

-    #else

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoMetadataSpecified'))

-    </td>

-    #end

-  </tr>

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  #if($PATHNAMEATTRIBUTE && $PATHNAMEATTRIBUTE.length() > 0)

-  <tr>

-    <td class="description">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PathNameMetadataAttribute'))

-    </td>

-    <td class="value">$Encoder.bodyEscape($PATHNAMEATTRIBUTE)</td>

-  </tr>

-  <tr>

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PathSeparatorString'))</td>

-    <td class="value">$Encoder.bodyEscape($PATHNAMESEPARATOR)</td>

-  </tr>

-  #else

-  <tr>

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoPathNameMetadataAttributeSpecified'))

-    </td>

-  </tr>

-  #end

-  <tr>

-    <td class="separator" colspan="2">

-      <hr/>

-    </td>

-  </tr>

-  <tr>

-    #if($MATCHMAP && $MATCHMAP.size() > 0)

-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.PathValueMapping'))</td>

-    <td class="value">

-      <table class="displaytable">

-        #foreach($entry in $MATCHMAP.entrySet())

-        <tr>

-          <td colspan="2">$Encoder.bodyEscape($entry.Key)</td>

-          <td colspan="1">--</td>

-          <td colspan="2">$Encoder.bodyEscape($entry.Value)</td>

-        </tr>

-        #end

-      </table>

-    </td>

-    #else

-    <td class="message" colspan="2">

-      $Encoder.bodyEscape($ResourceBundle.getString('LivelinkConnector.NoMappingsSpecified'))

-    </td>

-    #end

-  </tr>

-</table>

diff --git a/connectors/livelink/lib-proprietary/README.txt b/connectors/livelink/lib-proprietary/README.txt
deleted file mode 100644
index 6f3a8df..0000000
--- a/connectors/livelink/lib-proprietary/README.txt
+++ /dev/null
@@ -1,24 +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.
-
-The LiveLink connector requires a client library from OpenText in order
-to function.  The client jar is call lapi.jar, and the version we have
-tested against can be found in the LAPI 9.7.1 package from OpenText.
-For some modes of operation, the jar llssl.jar from the same package
-may also be required.  Copy these jars to this directory, and build the
-connector using the standard ant build process.  More can be found in the
-"how-to-build-and-deploy.html" documentation page.
-
-
diff --git a/connectors/livelink/proprietary-library-instructions.txt b/connectors/livelink/proprietary-library-instructions.txt
deleted file mode 100644
index 4675312..0000000
--- a/connectors/livelink/proprietary-library-instructions.txt
+++ /dev/null
@@ -1,30 +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.
-
-The LiveLink connector requires a client library from OpenText in
-order to function.  The client jar is call lapi.jar, and the version we
-have tested against can be found in the LAPI 9.7.1 package from
-OpenText.  For some modes of operation, you may also need llssl.jar
-from the same package.  Copy those jars to this directory, and run
-ManifoldCF using the appropriate means.
-
-If you find there are incompatibilities between your version of lapi.jar
-and the one your release of ManifoldCF was built against, you must build
-ManifoldCF yourself, and include a copy of your jars prior to building,
-in the directory "connectors/livelink/lib-proprietary".
-
-More can be found in the "how-to-build-and-deploy.html"
-documentation page.
-
diff --git a/connectors/meridio/build.xml b/connectors/meridio/build.xml
deleted file mode 100644
index 74e034b..0000000
--- a/connectors/meridio/build.xml
+++ /dev/null
@@ -1,115 +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.
--->
-
-<project name="meridio" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <!-- target name="calculate-condition">
-        <available file="lib-proprietary/MeridioDMWS_axis.wsdl" property="meridioDMWS_axisStatus"/>
-        <available file="lib-proprietary/MeridioRMWS_axis.wsdl" property="meridioRMWS_axisStatus"/>
-        <available file="lib-proprietary/DMDataSet_castor.xsd" property="DMDataSetStatus"/>
-        <available file="lib-proprietary/RMDataSet_castor.xsd" property="RMDataSetStatus"/>
-        <available file="lib-proprietary/RMClassificationDataSet_castor.xsd" property="RMClassificationDataSetStatus"/>
-        <condition property="canBuild">
-            <and>
-                <isset property="meridioDMWS_axisStatus"/>
-                <isset property="meridioRMWS_axisStatus"/>
-                <isset property="DMDataSetStatus"/>
-                <isset property="RMDataSetStatus"/>
-                <isset property="RMClassificationDataSetStatus"/>
-            </and>
-        </condition>
-    </target>
-
-    <target name="precompile-check" depends="calculate-condition" unless="canBuild">
-        <echo message="Meridio Connector cannot be built without MeridioDMWS_axis.wsdl, MeridioRMWS_axis.wsdl, DMDataSet_castor.xsd, RMDataSet_castor.xsd, and RMClassificationDataSet_castor.xsd"/>
-    </target -->
-
-    <target name="copy-wsdls" depends="precompile-check" if="canBuild">
-        <mkdir dir="build/wsdls"/>
-        <copy tofile="build/wsdls/MeridioRMWS.wsdl" file="wsdls/MeridioRMWS_axis.wsdl"/>
-        <copy tofile="build/wsdls/MeridioDMWS.wsdl" file="wsdls/MeridioDMWS_axis.wsdl"/>
-        <copy tofile="build/wsdls/RMDataSet.xsd" file="wsdls/RMDataSet_castor.xsd"/>
-        <copy tofile="build/wsdls/DMDataSet.xsd" file="wsdls/DMDataSet_castor.xsd"/>
-        <copy tofile="build/wsdls/RMClassificationDataSet.xsd" file="wsdls/RMClassificationDataSet_castor.xsd"/>
-        <copy tofile="build/wsdls/MetaCartaWS.wsdl" file="wsdls/MetaCartaWS_axis.wsdl"/>
-    </target>
-    
-    <target name="classcreate-wsdls" depends="copy-wsdls,precompile-check" if="canBuild">
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="build/wsdls/MeridioDMWS.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="build/wsdls/MeridioRMWS.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="build/wsdls/MetaCartaWS.wsdl"/>
-        </antcall>
-    </target>
-    
-    <target name="classcreate-xsds" depends="precompile-check" if="canBuild">
-        <delete dir="build/xsdjava"/>
-        <antcall target="classcreate-xsd">
-            <param name="xsdname" value="build/wsdls/DMDataSet.xsd"/>
-            <param name="packagename" value="meridio.DMDataSet"/>
-        </antcall>
-        <antcall target="classcreate-xsd">
-            <param name="xsdname" value="build/wsdls/RMClassificationDataSet.xsd"/>
-            <param name="packagename" value="meridio.RMClassificationDataSet"/>
-        </antcall>
-        <antcall target="classcreate-xsd">
-            <param name="xsdname" value="build/wsdls/RMDataSet.xsd"/>
-            <param name="packagename" value="meridio.RMDataSet"/>
-        </antcall>
-    </target>
-
-    <target name="integration" depends="precompile-check" if="canBuild">
-        <mkdir dir="dist/integration"/>
-        <copy todir="dist/integration">
-          <fileset dir="integration">
-              <include name="**/*.Exe"/>
-              <include name="**/*.Ini"/>
-              <include name="**/*.msi"/>
-              <include name="*.txt"/>
-          </fileset>
-        </copy>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="Meridio"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.meridio.MeridioAuthority"/>
-        </antcall>
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Meridio"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.meridio.MeridioConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/meridio/MeridioAuthority.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/meridio/MeridioAuthority.java
deleted file mode 100644
index cf4efea..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/meridio/MeridioAuthority.java
+++ /dev/null
@@ -1,1511 +0,0 @@
-/* $Id: MeridioAuthority.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.meridio;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.connectors.meridio.DMDataSet.DMDataSet;
-import org.apache.manifoldcf.meridio.MeridioDataSetException;
-import org.apache.manifoldcf.meridio.MeridioWrapper;
-import org.apache.manifoldcf.crawler.connectors.meridio.RMDataSet.RMDataSet;
-import org.tempuri.GroupResult;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-import java.rmi.RemoteException;
-import java.util.*;
-import java.io.*;
-import java.net.*;
-
-
-
-/** This is the Meridio implementation of the IAuthorityConnector interface.
-*
-*/
-public class MeridioAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id: MeridioAuthority.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private MeridioWrapper meridio_       = null;  // A handle to the Meridio Java API Wrapper
-
-  // URLs initialized by 'connect' code
-  private URL DmwsURL = null;
-  private URL RmwsURL = null;
-  private URL MetaCartawsURL = null;
-
-  private javax.net.ssl.SSLSocketFactory mySSLFactory = null;
-
-  private String DMWSProxyHost = null;
-  private String DMWSProxyPort = null;
-  private String RMWSProxyHost = null;
-  private String RMWSProxyPort = null;
-  private String MetaCartaWSProxyHost = null;
-  private String MetaCartaWSProxyPort = null;
-  private String UserName = null;
-  private String Password = null;
-
-  private String cacheLifetime = null;
-  private String cacheLRUsize = null;
-  private long responseLifetime = 60000L;
-  private int LRUsize = 1000;
-
-  /** Cache manager. */
-  protected ICacheManager cacheManager = null;
-  
-  final private static int MANAGE_DOCUMENT_PRIVILEGE = 17;
-
-  /** Constructor.
-  */
-  public MeridioAuthority() {}
-
-  /** Set thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-  
-  /** Clear thread context.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    cacheManager = null;
-  }
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    /*=================================================================
-    * Construct the URL strings from the parameters
-    *
-    *================================================================*/
-    DMWSProxyHost = configParams.getParameter("DMWSProxyHost");
-    DMWSProxyPort = configParams.getParameter("DMWSProxyPort");
-    RMWSProxyHost = configParams.getParameter("RMWSProxyHost");
-    RMWSProxyPort = configParams.getParameter("RMWSProxyPort");
-    MetaCartaWSProxyHost = configParams.getParameter("MetaCartaWSProxyHost");
-    MetaCartaWSProxyPort = configParams.getParameter("MetaCartaWSProxyPort");
-    UserName = configParams.getParameter("UserName");
-    Password = configParams.getObfuscatedParameter("Password");
-
-    cacheLifetime = configParams.getParameter("CacheLifetimeMins");
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    cacheLRUsize = configParams.getParameter("CacheLRUSize");
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";    
-
-  }
-
-  /** Set up connection before attempting to use it */
-  protected void attemptToConnect()
-    throws ManifoldCFException
-  {
-    try
-    {
-      responseLifetime = Long.parseLong(this.cacheLifetime) * 60L * 1000L;
-      LRUsize = Integer.parseInt(this.cacheLRUsize);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Cache lifetime or Cache LRU size must be an integer: "+e.getMessage(),e);
-    }
-
-    if (meridio_ == null)
-    {
-
-      // This stuff used to be in connect(); was moved here so proper exception handling could be done
-      /*=================================================================
-      * Construct the URL strings from the parameters
-      *
-      *================================================================*/
-
-      String DMWSProtocol = params.getParameter("DMWSServerProtocol");
-      if (DMWSProtocol == null)
-        throw new ManifoldCFException("Missing required configuration parameter: DMWSServerProtocol");
-      String DMWSPort = params.getParameter("DMWSServerPort");
-      if (DMWSPort == null || DMWSPort.length() == 0)
-        DMWSPort = "";
-      else
-        DMWSPort = ":" + DMWSPort;
-
-      String DMWSUrlString = DMWSProtocol + "://" +
-        params.getParameter("DMWSServerName") +
-        DMWSPort +
-        params.getParameter("DMWSLocation");
-
-      String RMWSProtocol = params.getParameter("RMWSServerProtocol");
-      if (RMWSProtocol == null)
-        throw new ManifoldCFException("Missing required configuration parameter: RMWSServerProtocol");
-      String RMWSPort = params.getParameter("RMWSServerPort");
-      if (RMWSPort == null || RMWSPort.length() == 0)
-        RMWSPort = "";
-      else
-        RMWSPort = ":" + RMWSPort;
-
-      String RMWSUrlString = RMWSProtocol + "://" +
-        params.getParameter("RMWSServerName") +
-        RMWSPort +
-        params.getParameter("RMWSLocation");
-
-      String MetaCartaWSProtocol = params.getParameter("MetaCartaWSServerProtocol");
-      if (MetaCartaWSProtocol == null)
-        throw new ManifoldCFException("Missing required configuration parameter: MetaCartaWSServerProtocol");
-      String MetaCartaWSPort = params.getParameter("MetaCartaWSServerPort");
-      if (MetaCartaWSPort == null || MetaCartaWSPort.length() == 0)
-        MetaCartaWSPort = "";
-      else
-        MetaCartaWSPort = ":" + MetaCartaWSPort;
-
-      String ManifoldCFWSUrlString = MetaCartaWSProtocol + "://" +
-        params.getParameter("MetaCartaWSServerName") +
-        MetaCartaWSPort +
-        params.getParameter("MetaCartaWSLocation");
-
-
-      // Set up ssl if indicated
-      String keystoreData = params.getParameter( "MeridioKeystore" );
-
-      if (keystoreData != null)
-        mySSLFactory = KeystoreManagerFactory.make("",keystoreData).getSecureSocketFactory();
-      else
-        mySSLFactory = null;
-
-      try
-      {
-        DmwsURL = new URL(DMWSUrlString);
-        RmwsURL = new URL(RMWSUrlString);
-        MetaCartawsURL = new URL(ManifoldCFWSUrlString);
-
-        if (Logging.authorityConnectors.isDebugEnabled())
-        {
-          Logging.authorityConnectors.debug("Meridio: Document Management Web Service (DMWS) URL is [" + DmwsURL + "]");
-          Logging.authorityConnectors.debug("Meridio: Record Management Web Service (RMWS) URL is [" + RmwsURL + "]");
-          Logging.authorityConnectors.debug("Meridio: MetaCarta Web Service (MCWS) URL is [" + MetaCartawsURL + "]");
-        }
-
-      }
-      catch (MalformedURLException malformedURLException)
-      {
-        throw new ManifoldCFException("Meridio: Could not construct the URL for either " +
-          "the Meridio DM, Meridio RM, or MetaCarta Meridio Web Service: "+malformedURLException, malformedURLException);
-      }
-
-      try
-      {
-        /*=================================================================
-        * Now try and login to Meridio; the wrapper's constructor can be
-        * used as it calls the Meridio login method
-        *================================================================*/
-        meridio_ = new MeridioWrapper(Logging.authorityConnectors, DmwsURL, RmwsURL, MetaCartawsURL,
-          DMWSProxyHost, DMWSProxyPort, RMWSProxyHost, RMWSProxyPort, MetaCartaWSProxyHost, MetaCartaWSProxyPort,
-          UserName, Password,
-          InetAddress.getLocalHost().getHostName(),
-          mySSLFactory,
-          org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender.class,
-          "client-config.wsdd");
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Meridio: bad number: "+e.getMessage(),e);
-      }
-      catch (UnknownHostException unknownHostException)
-      {
-        throw new ManifoldCFException("Meridio: A Unknown Host Exception occurred while " +
-          "connecting - is a network software and hardware configuration: "+unknownHostException.getMessage(), unknownHostException);
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage(),e);
-          }
-          throw new ManifoldCFException("Unknown http error occurred while connecting: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (Logging.authorityConnectors.isDebugEnabled())
-          Logging.authorityConnectors.debug("Meridio: Got an unknown remote exception connecting - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-        throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: An unknown remote exception occurred while " +
-          "connecting: "+remoteException.getMessage(), remoteException);
-      }
-
-    }
-
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Check connection for sanity.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    Logging.authorityConnectors.debug("Meridio: Entering 'check' method");
-    attemptToConnect();
-    try
-    {
-      /*=================================================================
-      * Call a method in the Web Services API to get the Meridio system
-      * name back - just something simple to test the connection
-      * end-to-end
-      *================================================================*/
-      DMDataSet ds = meridio_.getStaticData();
-      if (null == ds)
-      {
-        Logging.authorityConnectors.warn("Meridio: DM DataSet returned was null in 'check' method");
-        return "Connection Failed - Internal Error Contact Support";
-      }
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("Meridio System Name is [" +
-        ds.getSYSTEMINFO().getSystemName() + "] and the comment is [" +
-        ds.getSYSTEMINFO().getComment() + "]");
-
-      /*=================================================================
-      * For completeness, we also call a method in the RM Web
-      * Service API
-      *================================================================*/
-      RMDataSet rmws = meridio_.getConfiguration();
-      if (null == rmws)
-      {
-        Logging.authorityConnectors.warn("Meridio: RM DataSet returned was null in 'check' method");
-        return "Connection Failed - RM DataSet Error, contact Support";
-      }
-
-      /*=================================================================
-      * Finally, try to get the group parents of user ID 2 (which is the admin user always).
-      * This tests the MetaCarta web service setup.
-      */
-      meridio_.getUsersGroups(2);
-
-      Logging.authorityConnectors.debug("Meridio: Exiting 'check' method");
-
-      return super.check();
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      long currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          return "Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage();
-        }
-        return "Unknown http error occurred while connecting: "+e.getMessage();
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("Meridio: Got an unknown remote exception checking - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      return "Axis fault: "+e.getMessage();
-    }
-    catch (RemoteException remoteException)
-    {
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("Meridio: Unknown remote exception occurred during 'check' method: "+remoteException.getMessage(),
-        remoteException);
-      return "Meridio: An unknown remote exception occurred while connecting: "+remoteException.getMessage();
-    }
-    catch (MeridioDataSetException meridioDataSetException)
-    {
-      /*=================================================================
-      * Log the exception because we will then discard it
-      *
-      * If it is a DataSet exception it means that we could not marshal
-      * or unmarshall the XML returned from the Web Service call. This
-      * means there is either a problem with the code, or perhaps the
-      * connector is pointing at an incorrect/unsupported version of
-      * Meridio
-      *================================================================*/
-      Logging.authorityConnectors.warn("Meridio: DataSet Exception occurred during 'check' method",
-        meridioDataSetException);
-
-      return "Connection Failed - DataSet error: "+meridioDataSetException.getMessage();
-    }
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    Logging.authorityConnectors.debug("Meridio: Entering 'disconnect' method");
-    try
-    {
-      if (meridio_ != null)
-      {
-        meridio_.logout();
-      }
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      long currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          Logging.authorityConnectors.warn("Unexpected http error code "+httpErrorCode+" logging out: "+e.getMessage());
-          return;
-        }
-        Logging.authorityConnectors.warn("Unknown http error occurred while logging out: "+e.getMessage());
-        return;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        if (e.getFaultString().indexOf(" 23031#") != -1)
-        {
-          // This means that the session has expired, so reset it and retry
-          meridio_ = null;
-          return;
-        }
-      }
-
-      Logging.authorityConnectors.warn("Meridio: Got an unknown remote exception logging out - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      return;
-    }
-    catch (RemoteException remoteException)
-    {
-      Logging.authorityConnectors.warn("Meridio: A remote exception occurred while " +
-        "logging out: "+remoteException.getMessage(), remoteException);
-    }
-    finally
-    {
-      super.disconnect();
-      meridio_ = null;
-      DmwsURL = null;
-      RmwsURL = null;
-      MetaCartawsURL = null;
-      mySSLFactory = null;
-      DMWSProxyHost = null;
-      DMWSProxyPort = null;
-      RMWSProxyHost = null;
-      RMWSProxyPort = null;
-      MetaCartaWSProxyHost = null;
-      MetaCartaWSProxyPort = null;
-      UserName = null;
-      Password = null;
-      cacheLifetime = null;
-      cacheLRUsize = null;
-    }
-    Logging.authorityConnectors.debug("Meridio: Exiting 'disconnect' method");
-  }
-
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    // We need this here to be able to create an AuthorizationResponseDescription correctly
-    attemptToConnect();
-    
-    // Construct a cache description object
-    ICacheDescription objectDescription = new AuthorizationResponseDescription(userName,
-      DmwsURL.toString(),RmwsURL.toString(),MetaCartawsURL.toString(),
-      DMWSProxyHost,DMWSProxyPort,RMWSProxyHost,RMWSProxyPort,
-      MetaCartaWSProxyHost,MetaCartaWSProxyPort,this.UserName,this.Password,
-      responseLifetime,LRUsize);
-    
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-    try
-    {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try
-      {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-        if (response != null)
-          return response;
-        // Create the object.
-        response = getAuthorizationResponseUncached(userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle,objectDescription,response);
-        // And return it...
-        return response;
-      }
-      finally
-      {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-  
-  /** Uncached method to get an authorization response. */
-  protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-    throws ManifoldCFException
-  {
-    if (Logging.authorityConnectors.isDebugEnabled())
-      Logging.authorityConnectors.debug("Meridio: Authentication user name = '" + userName + "'");
-
-    while (true)
-    {
-      attemptToConnect();
-
-      // Strip off everything after the @-sign
-      int index = userName.indexOf("@");
-      if (index != -1)
-        userName = userName.substring(0,index);
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("Meridio: Meridio user name = '"+userName+"'");
-
-      ArrayList aclList = new ArrayList();
-
-      try
-      {
-        /*=================================================================
-        * Search for the user in Meridio to find their internal user ID.
-        * The method returns 0 if the user is not found
-        *
-        * We expect the user name passed in to be the user's login name
-        * without the "domain" prefix or suffix (i.e. domain\\username
-        * or username@domain.com)
-        *
-        * If the username is passed in a different format, then it should
-        * be transformed first
-        *================================================================*/
-        //TODO: We could also possibly search on the user's directory name to
-        //      avoid the transformation
-        long userId = meridio_.getUserIdFromName(userName);
-        if (0L == userId)
-        {
-          if (Logging.authorityConnectors.isDebugEnabled())
-            Logging.authorityConnectors.debug("Meridio: User '" + userName + "' does not exist");
-          return RESPONSE_USERNOTFOUND;
-        }
-        if (Logging.authorityConnectors.isDebugEnabled())
-          Logging.authorityConnectors.debug("Meridio: Found user - the User Id for '" + userName +
-          "' is " + userId);
-
-        aclList.add("U" + userId);
-
-        /** This is the new, MetaCarta-service way of getting the groups, which relies on the custom
-        * MetaCarta web service developed by Meridio.  The old way was too inefficient to be workable for
-        * installations that had more than a few users and groups.
-        */
-        GroupResult [] userGroups = null;
-        userGroups = meridio_.getUsersGroups(new Long(userId).intValue());
-        if (userGroups != null)
-        {
-          for (int i = 0; i < userGroups.length; i++)
-          {
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("Group ID '" + userGroups[i].getGroupID() +
-              "' Group Name '" + userGroups[i].getGroupName() + ">'");
-            aclList.add("G" + userGroups[i].getGroupID());
-          }
-        }
-
-        /*=================================================================
-        * Protective markings
-        *================================================================*/
-        //TODO: Check if we must cater for protective markings since there
-        //      is the complexity of informative markings and
-        //      hierarchical markings to deal with
-        //
-        // Hierarchical ones are CONFIDENTIAL, RESTRICTED, SECRET, TOP SECRET
-        // Non-hierarchical ones might be UK Eyes Only, US Eyes Only, etc.
-        //
-
-
-        /*=================================================================
-        * Get the user's privileges
-        *
-        * The "Manage Documents" privilege will effectively grant the user
-        * "manage" access to all documents/records within Meridio, so if
-        * the user has been granted that privilege, or one of the groups
-        * of which they are a member has that privilege then add it to
-        * the token list
-        *================================================================*/
-        RMDataSet userPrivileges = meridio_.getUserPrivilegeList(new Long(userId).intValue());
-
-        for (int i = 0; i < userPrivileges.getRm2Privilege().length; i++)
-        {
-          if (Logging.authorityConnectors.isDebugEnabled())
-            Logging.authorityConnectors.debug("Meridio: Privilege ID '" + userPrivileges.getRm2Privilege()[i].getId() + "' " +
-            "Name '" + userPrivileges.getRm2Privilege()[i].getName() + "'");
-
-          if (userPrivileges.getRm2Privilege()[i].getId() == MANAGE_DOCUMENT_PRIVILEGE)
-          {
-            Logging.authorityConnectors.debug("Meridio: User has Manage Document privilege so adding READ_ALL to token list");
-            aclList.add("READ_ALL");
-          }
-        }
-
-        String[] rval = new String[aclList.size()];
-        for (int i = 0; i < rval.length; i++)
-        {
-          rval[i] = (String)aclList.get(i);
-        }
-
-        Logging.authorityConnectors.debug("Meridio: Exiting method getAccessTokens");
-        return new AuthorizationResponse(rval,AuthorizationResponse.RESPONSE_OK);
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage(),e);
-          }
-          throw new ManifoldCFException("Unknown http error occurred while getting doc versions: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          if (e.getFaultString().indexOf(" 23031#") != -1)
-          {
-            // This means that the session has expired, so reset it and retry
-            meridio_ = null;
-            continue;
-          }
-        }
-
-        if (Logging.authorityConnectors.isDebugEnabled())
-          Logging.authorityConnectors.debug("Meridio: Got an unknown remote exception getting user tokens - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-        throw new ManifoldCFException("Axis fault: "+e.getMessage(),  e);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: A remote exception occurred while getting user tokens: " +
-          remoteException.getMessage(), remoteException);
-      }
-      catch (MeridioDataSetException meridioDataSetException)
-      {
-        Logging.authorityConnectors.error("Meridio: A provlem occurred manipulating the Web Service XML: " +
-          meridioDataSetException.getMessage(), meridioDataSetException);
-        throw new ManifoldCFException("Meridio: A problem occurred manipulating the Web " +
-          "Service XML: "+meridioDataSetException.getMessage(), meridioDataSetException);
-      }
-    }
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    return RESPONSE_UNREACHABLE;
-  }
-  
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.DocumentServer"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.RecordsServer"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.UserServiceServer"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.Credentials"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.Cache"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.dmwsServerPort.value != \"\" && !isInteger(editconnection.dmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.dmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsServerPort.value != \"\" && !isInteger(editconnection.rmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.rmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.dmwsProxyPort.value != \"\" && !isInteger(editconnection.dmwsProxyPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.dmwsProxyPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsProxyPort.value != \"\" && !isInteger(editconnection.rmwsProxyPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.rmwsProxyPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.metacartawsServerPort.value != \"\" && !isInteger(editconnection.metacartawsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.metacartawsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.metacartawsProxyPort.value != \"\" && !isInteger(editconnection.metacartawsProxyPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.metacartawsProxyPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.userName.value != \"\" && editconnection.userName.value.indexOf(\"\\\") <= 0)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.AValidMeridioUserNameHasTheForm") + "\");\n"+
-"    editconnection.userName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.dmwsServerName.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.DocumentServer") + "\");\n"+
-"    editconnection.dmwsServerName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsServerName.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.RecordsServer") + "\");\n"+
-"    editconnection.rmwsServerName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.metacartawsServerName.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseFillInAUserServiceServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.UserServiceServer") + "\");\n"+
-"    editconnection.metacartawsServerName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  if (editconnection.dmwsServerPort.value != \"\" && !isInteger(editconnection.dmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.DocumentServer") + "\");\n"+
-"    editconnection.dmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsServerPort.value != \"\" && !isInteger(editconnection.rmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.RecordsServer") + "\");\n"+
-"    editconnection.rmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.metacartawsServerPort.value != \"\" && !isInteger(editconnection.metacartawsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAUserServicePortNumber") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.UserServiceServer") + "\");\n"+
-"    editconnection.metacartawsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  if (editconnection.userName.value == \"\" || editconnection.userName.value.indexOf(\"\\\") <= 0)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.Credentials") + "\");\n"+
-"    editconnection.userName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelifetime.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.CacheLifetimeCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.Cache") + "\");\n"+
-"    editconnection.cachelifetime.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelifetime.value != \"\" && !isInteger(editconnection.cachelifetime.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.CacheLifetimeMustBeAnInteger") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.Cache") + "\");\n"+
-"    editconnection.cachelifetime.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelrusize.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.CacheLRUSizeCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.Cache") + "\");\n"+
-"    editconnection.cachelrusize.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.cachelrusize.value != \"\" && !isInteger(editconnection.cachelrusize.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.CacheLRUSizeMustBeAnInteger") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.Cache") + "\");\n"+
-"    editconnection.cachelrusize.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function DeleteCertificate(aliasName)\n"+
-"{\n"+
-"  editconnection.keystorealias.value = aliasName;\n"+
-"  editconnection.configop.value = \"Delete\";\n"+
-"  postForm();\n"+
-"}\n"+
-"\n"+
-"function AddCertificate()\n"+
-"{\n"+
-"  if (editconnection.certificate.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.ChooseACertificateFile") + "\");\n"+
-"    editconnection.certificate.focus();\n"+
-"  }\n"+
-"  else\n"+
-"  {\n"+
-"    editconnection.configop.value = \"Add\";\n"+
-"    postForm();\n"+
-"  }\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String dmwsServerProtocol = parameters.getParameter("DMWSServerProtocol");
-    if (dmwsServerProtocol == null)
-      dmwsServerProtocol = "http";
-    String rmwsServerProtocol = parameters.getParameter("RMWSServerProtocol");
-    if (rmwsServerProtocol == null)
-      rmwsServerProtocol = "http";
-    String metacartawsServerProtocol = parameters.getParameter("MetaCartaWSServerProtocol");
-    if (metacartawsServerProtocol == null)
-      metacartawsServerProtocol = "http";
-
-    String dmwsServerName = parameters.getParameter("DMWSServerName");
-    if (dmwsServerName == null)
-      dmwsServerName = "";
-    String rmwsServerName = parameters.getParameter("RMWSServerName");
-    if (rmwsServerName == null)
-      rmwsServerName = "";
-    String metacartawsServerName = parameters.getParameter("MetaCartaWSServerName");
-    if (metacartawsServerName == null)
-      metacartawsServerName = "";
-
-    String dmwsServerPort = parameters.getParameter("DMWSServerPort");
-    if (dmwsServerPort == null)
-      dmwsServerPort = "";
-    String rmwsServerPort = parameters.getParameter("RMWSServerPort");
-    if (rmwsServerPort == null)
-      rmwsServerPort = "";
-    String metacartawsServerPort = parameters.getParameter("MetaCartaWSServerPort");
-    if (metacartawsServerPort == null)
-      metacartawsServerPort = "";
-
-    String dmwsLocation = parameters.getParameter("DMWSLocation");
-    if (dmwsLocation == null)
-      dmwsLocation = "/DMWS/MeridioDMWS.asmx";
-    String rmwsLocation = parameters.getParameter("RMWSLocation");
-    if (rmwsLocation == null)
-      rmwsLocation = "/RMWS/MeridioRMWS.asmx";
-    String metacartawsLocation = parameters.getParameter("MetaCartaWSLocation");
-    if (metacartawsLocation == null)
-      metacartawsLocation = "/MetaCartaWebService/MetaCarta.asmx";
-
-    String dmwsProxyHost = parameters.getParameter("DMWSProxyHost");
-    if (dmwsProxyHost == null)
-      dmwsProxyHost = "";
-    String rmwsProxyHost = parameters.getParameter("RMWSProxyHost");
-    if (rmwsProxyHost == null)
-      rmwsProxyHost = "";
-    String metacartawsProxyHost = parameters.getParameter("MetaCartaWSProxyHost");
-    if (metacartawsProxyHost == null)
-      metacartawsProxyHost = "";
-
-    String dmwsProxyPort = parameters.getParameter("DMWSProxyPort");
-    if (dmwsProxyPort == null)
-      dmwsProxyPort = "";
-    String rmwsProxyPort = parameters.getParameter("RMWSProxyPort");
-    if (rmwsProxyPort == null)
-      rmwsProxyPort = "";
-    String metacartawsProxyPort = parameters.getParameter("MetaCartaWSProxyPort");
-    if (metacartawsProxyPort == null)
-      metacartawsProxyPort = "";
-
-    String userName = parameters.getParameter("UserName");
-    if (userName == null)
-      userName = "";
-
-    String password = parameters.getObfuscatedParameter("Password");
-    if (password == null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-
-    String meridioKeystore = parameters.getParameter("MeridioKeystore");
-    IKeystoreManager localKeystore;
-    if (meridioKeystore == null)
-      localKeystore = KeystoreManagerFactory.make("");
-    else
-      localKeystore = KeystoreManagerFactory.make("",meridioKeystore);
-
-    String cacheLifetime = parameters.getParameter("CacheLifetimeMins");
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    
-    String cacheLRUsize = parameters.getParameter("CacheLRUSize");
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";    
-
-    out.print(
-"<input name=\"configop\" type=\"hidden\" value=\"Continue\"/>\n"
-    );
-    
-    // "Document Server" tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.DocumentServer")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerProtocol") + "</nobr></td><td class=\"value\"><select name=\"dmwsServerProtocol\"><option value=\"http\" "+(dmwsServerProtocol.equals("http")?"selected=\"true\"":"")+">http</option><option value=\"https\" "+(dmwsServerProtocol.equals("https")?"selected=\"true\"":"")+">https</option></select></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"dmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsServerName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"dmwsServerPort\" value=\""+dmwsServerPort+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceLocation") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"dmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsLocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"separator\" colspan=\"2\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerProxyHost") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"dmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsProxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerProxyPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"dmwsProxyPort\" value=\""+dmwsProxyPort+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the Document Server tab.
-      out.print(
-"<input type=\"hidden\" name=\"dmwsServerProtocol\" value=\""+dmwsServerProtocol+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsServerName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsServerPort\" value=\""+dmwsServerPort+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsLocation)+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsProxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsProxyPort\" value=\""+dmwsProxyPort+"\"/>\n"
-      );
-    }
-
-    // "Records Server" tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.RecordsServer")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerProtocol") + "</nobr></td><td class=\"value\"><select name=\"rmwsServerProtocol\"><option value=\"http\" "+(rmwsServerProtocol.equals("http")?"selected=\"true\"":"")+">http</option><option value=\"https\" "+(rmwsServerProtocol.equals("https")?"selected=\"true\"":"")+">https</option></select></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"rmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsServerName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"rmwsServerPort\" value=\""+rmwsServerPort+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceLocation") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"rmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsLocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"separator\" colspan=\"2\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerProxyHost") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"rmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsProxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerProxyPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"rmwsProxyPort\" value=\""+rmwsProxyPort+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the Records Server tab.
-      out.print(
-"<input type=\"hidden\" name=\"rmwsServerProtocol\" value=\""+rmwsServerProtocol+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsServerName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsServerPort\" value=\""+rmwsServerPort+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsLocation)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsProxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsProxyPort\" value=\""+rmwsProxyPort+"\"/>\n"
-      );
-    }
-
-    // The "User Service Server" tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.UserServiceServer")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>User webservice server protocol:</nobr></td><td class=\"value\"><select name=\"metacartawsServerProtocol\"><option value=\"http\" "+(metacartawsServerProtocol.equals("http")?"selected=\"true\"":"")+">http</option><option value=\"https\" "+(metacartawsServerProtocol.equals("https")?"selected=\"true\"":"")+">https</option></select></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserWebserviceServerName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"metacartawsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(metacartawsServerName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserWebserviceServerPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"metacartawsServerPort\" value=\""+metacartawsServerPort+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserWebserviceLocation") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"metacartawsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(metacartawsLocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"separator\" colspan=\"2\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserWebserviceServerProxyHost") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"64\" name=\"metacartawsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(metacartawsProxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserWebserviceServerProxyPort") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"5\" name=\"metacartawsProxyPort\" value=\""+metacartawsProxyPort+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the User Service Server tab.
-      out.print(
-"<input type=\"hidden\" name=\"metacartawsServerProtocol\" value=\""+metacartawsServerProtocol+"\"/>\n"+
-"<input type=\"hidden\" name=\"metacartawsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(metacartawsServerName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"metacartawsServerPort\" value=\""+metacartawsServerPort+"\"/>\n"+
-"<input type=\"hidden\" name=\"metacartawsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(metacartawsLocation)+"\"/>\n"+
-"<input type=\"hidden\" name=\"metacartawsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(metacartawsProxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"metacartawsProxyPort\" value=\""+metacartawsProxyPort+"\"/>\n"
-      );
-    }
-
-    // The "Credentials" tab
-    // Always pass the whole keystore as a hidden.
-    if (meridioKeystore != null)
-    {
-      out.print(
-"<input type=\"hidden\" name=\"keystoredata\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(meridioKeystore)+"\"/>\n"
-      );
-    }
-
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.Credentials")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserName") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"userName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Password") + "</nobr></td><td class=\"value\"><input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.SSLCertificateList") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\"keystorealias\" value=\"\"/>\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      // List the individual certificates in the store, with a delete button for each
-      String[] contents = localKeystore.getContents();
-      if (contents.length == 0)
-      {
-        out.print(
-"        <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.NoCertificatesPresent") + "</nobr></td></tr>\n"
-        );
-      }
-      else
-      {
-        int i = 0;
-        while (i < contents.length)
-        {
-          String alias = contents[i];
-          String description = localKeystore.getDescription(alias);
-          if (description.length() > 128)
-          description = description.substring(0,125) + "...";
-          out.print(
-"        <tr>\n"+
-"          <td class=\"value\"><input type=\"button\" onclick='Javascript:DeleteCertificate(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(alias)+"\")' alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.DeleteCert") + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(alias)+"\" value=\"Delete\"/></td>\n"+
-"          <td>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
-"        </tr>\n"
-          );
-          i++;
-        }
-      }
-      
-      out.print(
-"      </table>\n"+
-"      <input type=\"button\" onclick=\"Javascript:AddCertificate()\" alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.AddCert") + "\" value=\"Add\"/>&nbsp;\n"+
-"        Certificate:&nbsp;<input name=\"certificate\" size=\"50\" type=\"file\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the "Credentials" tab
-      out.print(
-"<input type=\"hidden\" name=\"userName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"
-      );
-    }
-    
-    // "Cache" tab
-    if(tabName.equals(Messages.getString(locale,"MeridioConnector.Cache")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.CacheLifetime") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"cachelifetime\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLifetime) + "\"/> " + Messages.getBodyString(locale,"MeridioConnector.minutes") + "</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.CacheLRUSize") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"cachelrusize\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLRUsize) + "\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for "Cache" tab
-      out.print(
-"<input type=\"hidden\" name=\"cachelifetime\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLifetime) + "\"/>\n"+
-"<input type=\"hidden\" name=\"cachelrusize\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(cacheLRUsize) + "\"/>\n"
-      );
-    }
-
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String dmwsServerProtocol = variableContext.getParameter("dmwsServerProtocol");
-    if (dmwsServerProtocol != null)
-      parameters.setParameter("DMWSServerProtocol",dmwsServerProtocol);
-    String rmwsServerProtocol = variableContext.getParameter("rmwsServerProtocol");
-    if (rmwsServerProtocol != null)
-      parameters.setParameter("RMWSServerProtocol",rmwsServerProtocol);
-    String metacartawsServerProtocol = variableContext.getParameter("metacartawsServerProtocol");
-    if (metacartawsServerProtocol != null)
-      parameters.setParameter("MetaCartaWSServerProtocol",metacartawsServerProtocol);
-
-    String dmwsServerName = variableContext.getParameter("dmwsServerName");
-    if (dmwsServerName != null)
-      parameters.setParameter("DMWSServerName",dmwsServerName);
-    String rmwsServerName = variableContext.getParameter("rmwsServerName");
-    if (rmwsServerName != null)
-      parameters.setParameter("RMWSServerName",rmwsServerName);
-    String metacartawsServerName = variableContext.getParameter("metacartawsServerName");
-    if (metacartawsServerName != null)
-      parameters.setParameter("MetaCartaWSServerName",metacartawsServerName);
-
-    String dmwsServerPort = variableContext.getParameter("dmwsServerPort");
-    if (dmwsServerPort != null)
-    {
-      if (dmwsServerPort.length() > 0)
-        parameters.setParameter("DMWSServerPort",dmwsServerPort);
-      else
-        parameters.setParameter("DMWSServerPort",null);
-    }
-    String rmwsServerPort = variableContext.getParameter("rmwsServerPort");
-    if (rmwsServerPort != null)
-    {
-      if (rmwsServerPort.length() > 0)
-        parameters.setParameter("RMWSServerPort",rmwsServerPort);
-      else
-        parameters.setParameter("RMWSServerPort",null);
-    }
-    String metacartawsServerPort = variableContext.getParameter("metacartawsServerPort");
-    if (metacartawsServerPort != null)
-    {
-      if (metacartawsServerPort.length() > 0)
-        parameters.setParameter("MetaCartaWSServerPort",metacartawsServerPort);
-      else
-        parameters.setParameter("MetaCartaWSServerPort",null);
-    }
-
-    String dmwsLocation = variableContext.getParameter("dmwsLocation");
-    if (dmwsLocation != null)
-      parameters.setParameter("DMWSLocation",dmwsLocation);
-    String rmwsLocation = variableContext.getParameter("rmwsLocation");
-    if (rmwsLocation != null)
-      parameters.setParameter("RMWSLocation",rmwsLocation);
-    String metacartawsLocation = variableContext.getParameter("metacartawsLocation");
-    if (metacartawsLocation != null)
-      parameters.setParameter("MetaCartaWSLocation",metacartawsLocation);
-
-    String dmwsProxyHost = variableContext.getParameter("dmwsProxyHost");
-    if (dmwsProxyHost != null)
-      parameters.setParameter("DMWSProxyHost",dmwsProxyHost);
-    String rmwsProxyHost = variableContext.getParameter("rmwsProxyHost");
-    if (rmwsProxyHost != null)
-      parameters.setParameter("RMWSProxyHost",rmwsProxyHost);
-    String metacartawsProxyHost = variableContext.getParameter("metacartawsProxyHost");
-    if (metacartawsProxyHost != null)
-      parameters.setParameter("MetaCartaWSProxyHost",metacartawsProxyHost);
-		
-    String dmwsProxyPort = variableContext.getParameter("dmwsProxyPort");
-    if (dmwsProxyPort != null && dmwsProxyPort.length() > 0)
-      parameters.setParameter("DMWSProxyPort",dmwsProxyPort);
-    String rmwsProxyPort = variableContext.getParameter("rmwsProxyPort");
-    if (rmwsProxyPort != null && rmwsProxyPort.length() > 0)
-      parameters.setParameter("RMWSProxyPort",rmwsProxyPort);
-    String metacartawsProxyPort = variableContext.getParameter("metacartawsProxyPort");
-    if (metacartawsProxyPort != null && metacartawsProxyPort.length() > 0)
-      parameters.setParameter("MetaCartaWSProxyPort",metacartawsProxyPort);
-
-    String userName = variableContext.getParameter("userName");
-    if (userName != null)
-      parameters.setParameter("UserName",userName);
-
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter("Password",variableContext.mapKeyToPassword(password));
-
-    String configOp = variableContext.getParameter("configop");
-    if (configOp != null)
-    {
-      String keystoreValue;
-      if (configOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("keystorealias");
-        keystoreValue = parameters.getParameter("MeridioKeystore");
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        parameters.setParameter("MeridioKeystore",mgr.getString());
-      }
-      else if (configOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("certificate");
-        keystoreValue = parameters.getParameter("MeridioKeystore");
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            throw new ManifoldCFException(e.getMessage(),e);
-          }
-        }
-
-        if (certError != null)
-        {
-          // Redirect to error page
-          return "Illegal certificate: "+certError;
-        }
-        parameters.setParameter("MeridioKeystore",mgr.getString());
-      }
-    }
-    
-    String cacheLifetime = variableContext.getParameter("cachelifetime");
-    if (cacheLifetime != null)
-      parameters.setParameter("CacheLifetimeMins",cacheLifetime);
-
-    String cacheLRUsize = variableContext.getParameter("cachelrusize");
-    if (cacheLRUsize != null)
-      parameters.setParameter("CacheLRUSize",cacheLRUsize);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+Messages.getBodyString(locale,"MeridioConnector.certificates") + "&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-  protected static StringSet emptyStringSet = new StringSet();
-  
-  /** This is the cache object descriptor for cached access tokens from
-  * this connector.
-  */
-  protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    /** The user name associated with the access tokens */
-    protected String userName;
-    
-    // The server connection parameters
-    protected String DmwsURL;
-    protected String RmwsURL;
-    protected String wsURL;
-    protected String DMWSProxyHost;
-    protected String DMWSProxyPort;
-    protected String RMWSProxyHost;
-    protected String RMWSProxyPort;
-    protected String wsProxyHost;
-    protected String wsProxyPort;
-    protected String adminUserName;
-    protected String adminPassword;
-
-    protected long responseLifetime;
-    
-    /** The expiration time */
-    protected long expirationTime = -1;
-    
-    /** Constructor. */
-    public AuthorizationResponseDescription(String userName, String DmwsURL, String RmwsURL, String wsURL,
-      String DMWSProxyHost, String DMWSProxyPort, String RMWSProxyHost, String RMWSProxyPort,
-      String wsProxyHost, String wsProxyPort, String adminUserName, String adminPassword,
-      long responseLifetime, int LRUsize)
-    {
-      super("MeridioAuthority",LRUsize);
-      this.userName = userName;
-      this.DmwsURL = DmwsURL;
-      this.RmwsURL = RmwsURL;
-      this.wsURL = wsURL;
-      this.DMWSProxyHost = DMWSProxyHost;
-      this.DMWSProxyPort = DMWSProxyPort;
-      this.RMWSProxyHost = RMWSProxyHost;
-      this.RMWSProxyPort = RMWSProxyPort;
-      this.wsProxyHost = wsProxyHost;
-      this.wsProxyPort = wsProxyPort;
-      this.adminUserName = adminUserName;
-      this.adminPassword = adminPassword;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /** Return the invalidation keys for this object. */
-    public StringSet getObjectKeys()
-    {
-      return emptyStringSet;
-    }
-
-    /** Get the critical section name, used for synchronizing the creation of the object */
-    public String getCriticalSectionName()
-    {
-      return getClass().getName() + "-" + userName + "-" + DmwsURL +
-        "-" + RmwsURL+ "-" + wsURL + "-" + 
-        ((DMWSProxyHost==null)?"":DMWSProxyHost) + "-" +
-        ((DMWSProxyPort==null)?"":DMWSProxyPort) + "-" +
-        ((RMWSProxyHost==null)?"":RMWSProxyHost) + "-" +
-        ((RMWSProxyPort==null)?"":RMWSProxyPort) + "-" +
-        ((wsProxyHost==null)?"":wsProxyHost) + "-" +
-        ((wsProxyPort==null)?"":wsProxyPort) + "-" +
-        adminUserName + "-" + adminPassword;
-    }
-
-    /** Return the object expiration interval */
-    public long getObjectExpirationTime(long currentTime)
-    {
-      if (expirationTime == -1)
-        expirationTime = currentTime + responseLifetime;
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      return userName.hashCode() + DmwsURL.hashCode() + RmwsURL.hashCode() + wsURL.hashCode() +
-        ((DMWSProxyHost==null)?0:DMWSProxyHost.hashCode()) +
-        ((DMWSProxyPort==null)?0:DMWSProxyPort.hashCode()) +
-        ((RMWSProxyHost==null)?0:RMWSProxyHost.hashCode()) +
-        ((RMWSProxyPort==null)?0:RMWSProxyPort.hashCode()) +
-        ((wsProxyHost==null)?0:wsProxyHost.hashCode()) +
-        ((wsProxyPort==null)?0:wsProxyPort.hashCode()) +
-        adminUserName.hashCode() + adminPassword.hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorizationResponseDescription))
-        return false;
-      AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-      return ard.userName.equals(userName) &&
-        ard.DmwsURL.equals(DmwsURL) && ard.RmwsURL.equals(RmwsURL) && ard.wsURL.equals(wsURL) &&
-        ((ard.DMWSProxyHost==null||DMWSProxyHost==null)?ard.DMWSProxyHost==DMWSProxyHost:ard.DMWSProxyHost.equals(DMWSProxyHost)) &&
-        ((ard.DMWSProxyPort==null||DMWSProxyPort==null)?ard.DMWSProxyPort==DMWSProxyPort:ard.DMWSProxyPort.equals(DMWSProxyPort)) &&
-        ((ard.RMWSProxyHost==null||RMWSProxyHost==null)?ard.RMWSProxyHost==RMWSProxyHost:ard.RMWSProxyHost.equals(RMWSProxyHost)) &&
-        ((ard.RMWSProxyPort==null||RMWSProxyPort==null)?ard.RMWSProxyPort==RMWSProxyPort:ard.RMWSProxyPort.equals(RMWSProxyPort)) &&
-        ((ard.wsProxyHost==null||wsProxyHost==null)?ard.wsProxyHost==wsProxyHost:ard.wsProxyHost.equals(wsProxyHost)) &&
-        ((ard.wsProxyPort==null||wsProxyPort==null)?ard.wsProxyPort==wsProxyPort:ard.wsProxyPort.equals(wsProxyPort)) &&
-        ard.adminUserName.equals(adminUserName) && ard.adminPassword.equals(adminPassword);
-    }
-    
-  }
-
-}
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/meridio/Messages.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/meridio/Messages.java
deleted file mode 100644
index ac1e95c..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/meridio/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.meridio;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.meridio.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.meridio";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MatchMap.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MatchMap.java
deleted file mode 100644
index ad5ef73..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MatchMap.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/* $Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.meridio;
-
-import java.util.*;
-import java.util.regex.*;
-
-/** An instance of this class describes a "match map", which describes a translation of an input
-* string using regexp technology.
-* A match map consists of multiple clauses, which are fired in sequence.  Each clause is a regexp
-* search and replace, where the replace string can include references to the groups present in the
-* search regexp.
-* MatchMaps can be converted to strings in two different ways.  The first way is to build a single
-* string of the form "match1=replace1&match2=replace2...".  Strings of this kind must escape & and =
-* characters in the match and replace strings, where found.  The second way is to generate an array
-* of match strings and a corresponding array of replace strings.  This method requires no escaping
-* of the string contents.
-*/
-public class MatchMap
-{
-  public static final String _rcsid = "@(#)$Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the set of match regexp strings */
-  protected ArrayList matchStrings;
-  /** This is the set of Pattern objects corresponding to the match regexp strings.
-  * It's null if the patterns have not been built yet. */
-  protected Pattern[] matchPatterns = null;
-  /** This is the set of replace strings */
-  protected ArrayList replaceStrings;
-
-  /** Constructor.  Build an empty matchmap. */
-  public MatchMap()
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-  }
-
-  /** Constructor.  Build a matchmap from a single string. */
-  public MatchMap(String stringForm)
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-    StringBuilder matchString = new StringBuilder();
-    StringBuilder replaceString = new StringBuilder();
-    int i = 0;
-    while (i < stringForm.length())
-    {
-      matchString.setLength(0);
-      replaceString.setLength(0);
-      while (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&' || x == '=')
-          break;
-        i++;
-        if (x == '\\' && i < stringForm.length())
-          x = stringForm.charAt(i++);
-        matchString.append(x);
-      }
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '=')
-        {
-          i++;
-          // Pick up the second string
-          while (i < stringForm.length())
-          {
-            x = stringForm.charAt(i);
-            if (x == '&')
-              break;
-            i++;
-            if (x == '\\' && i < stringForm.length())
-              x = stringForm.charAt(i++);
-            replaceString.append(x);
-          }
-        }
-      }
-
-      matchStrings.add(matchString.toString());
-      replaceStrings.add(replaceString.toString());
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&')
-          i++;
-      }
-    }
-  }
-
-  /** Constructor.  Build a matchmap from two arraylists representing match and replace strings */
-  public MatchMap(ArrayList matchStrings, ArrayList replaceStrings)
-  {
-    this.matchStrings = (ArrayList)matchStrings.clone();
-    this.replaceStrings = (ArrayList)replaceStrings.clone();
-  }
-
-  /** Get the number of match/replace strings */
-  public int getMatchCount()
-  {
-    return matchStrings.size();
-  }
-
-  /** Get a specific match string */
-  public String getMatchString(int index)
-  {
-    return (String)matchStrings.get(index);
-  }
-
-  /** Get a specific replace string */
-  public String getReplaceString(int index)
-  {
-    return (String)replaceStrings.get(index);
-  }
-
-  /** Delete a specified match/replace string pair */
-  public void deleteMatchPair(int index)
-  {
-    matchStrings.remove(index);
-    replaceStrings.remove(index);
-    matchPatterns = null;
-  }
-
-  /** Insert a match/replace string pair */
-  public void insertMatchPair(int index, String match, String replace)
-  {
-    matchStrings.add(index,match);
-    replaceStrings.add(index,replace);
-    matchPatterns = null;
-  }
-
-  /** Append a match/replace string pair */
-  public void appendMatchPair(String match, String replace)
-  {
-    matchStrings.add(match);
-    replaceStrings.add(replace);
-    matchPatterns = null;
-  }
-
-  /** Append old-style match/replace pair.
-  * This method translates old-style regexp and group output form to the
-  * current style before adding to the map.
-  */
-  public void appendOldstyleMatchPair(String oldstyleMatch, String oldstyleReplace)
-  {
-    String newStyleMatch = "^" + oldstyleMatch + "$";
-
-    // Need to build a new-style replace string from the old one.  To do that, use the
-    // original parser (which basically will guarantee that we get it right)
-
-    EvaluatorTokenStream et = new EvaluatorTokenStream(oldstyleReplace);
-    StringBuilder newStyleReplace = new StringBuilder();
-
-    while (true)
-    {
-      EvaluatorToken t = et.peek();
-      if (t == null)
-        break;
-      switch (t.getType())
-      {
-      case EvaluatorToken.TYPE_COMMA:
-        et.advance();
-        break;
-      case EvaluatorToken.TYPE_GROUP:
-        et.advance();
-        int groupNumber = t.getGroupNumber();
-        switch (t.getGroupStyle())
-        {
-        case EvaluatorToken.GROUPSTYLE_NONE:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append(")");
-          break;
-        case EvaluatorToken.GROUPSTYLE_LOWER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("l)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_UPPER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("u)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_MIXED:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("m)");
-          break;
-        default:
-          break;
-        }
-        break;
-      case EvaluatorToken.TYPE_TEXT:
-        et.advance();
-        escape(newStyleReplace,t.getTextValue());
-        break;
-      default:
-        break;
-      }
-    }
-
-    appendMatchPair(newStyleMatch,newStyleReplace.toString());
-  }
-
-  /** Escape a string so it is verbatim */
-  protected static void escape(StringBuilder output, String input)
-  {
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '$')
-        output.append(x);
-      output.append(x);
-    }
-  }
-
-  /** Convert the matchmap to string form. */
-  public String toString()
-  {
-    int i = 0;
-    StringBuilder rval = new StringBuilder();
-    while (i < matchStrings.size())
-    {
-      String matchString = (String)matchStrings.get(i);
-      String replaceString = (String)replaceStrings.get(i);
-      if (i > 0)
-        rval.append('&');
-      stuff(rval,matchString);
-      rval.append('=');
-      stuff(rval,replaceString);
-      i++;
-    }
-    return rval.toString();
-  }
-
-  /** Stuff characters */
-  protected static void stuff(StringBuilder sb, String value)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '&' || x == '=')
-        sb.append('\\');
-      sb.append(x);
-    }
-  }
-
-  /** Perform a translation.
-  */
-  public String translate(String input)
-  {
-    // Build pattern vector if not already there
-    if (matchPatterns == null)
-    {
-      matchPatterns = new Pattern[matchStrings.size()];
-      int i = 0;
-      while (i < matchPatterns.length)
-      {
-        matchPatterns[i] = Pattern.compile((String)matchStrings.get(i));
-        i++;
-      }
-    }
-
-    int j = 0;
-    while (j < matchPatterns.length)
-    {
-      Pattern p = matchPatterns[j];
-      // Construct a matcher
-      Matcher m = p.matcher(input);
-      // Grab the output description
-      String outputDescription = (String)replaceStrings.get(j);
-      j++;
-      // Create a copy buffer
-      StringBuilder outputBuffer = new StringBuilder();
-      // Keep track of the index in the original string we have done up to
-      int currentIndex = 0;
-      // Scan the string using find, and for each one found, do a translation
-      while (true)
-      {
-        boolean foundOne = m.find();
-        if (foundOne == false)
-        {
-          // No subsequent match found.
-          // Copy everything from currentIndex until the end of input
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-
-        // Do a translation.  This involves copying everything in the input
-        // string up until the start of the match, then doing a replace for
-        // the match itself, and finally setting the currentIndex to the end
-        // of the match.
-
-        int matchStart = m.start(0);
-        int matchEnd = m.end(0);
-        if (matchStart == -1)
-        {
-          // The expression was degenerate; treat this as the end.
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-        outputBuffer.append(input.substring(currentIndex,matchStart));
-
-        // Process translation description!
-        int i = 0;
-        while (i < outputDescription.length())
-        {
-          char x = outputDescription.charAt(i++);
-          if (x == '$' && i < outputDescription.length())
-          {
-            x = outputDescription.charAt(i++);
-            if (x == '(')
-            {
-              // Process evaluation expression
-              StringBuilder numberBuf = new StringBuilder();
-              boolean upper = false;
-              boolean lower = false;
-              boolean mixed = false;
-              while (i < outputDescription.length())
-              {
-                char y = outputDescription.charAt(i++);
-                if (y == ')')
-                  break;
-                else if (y >= '0' && y <= '9')
-                  numberBuf.append(y);
-                else if (y == 'u' || y == 'U')
-                  upper = true;
-                else if (y == 'l' || y == 'L')
-                  lower = true;
-                else if (y == 'm' || y == 'M')
-                  mixed = true;
-              }
-              String number = numberBuf.toString();
-              try
-              {
-                int groupnum = Integer.parseInt(number);
-                String groupValue = m.group(groupnum);
-                if (upper)
-                  outputBuffer.append(groupValue.toUpperCase(Locale.ROOT));
-                else if (lower)
-                  outputBuffer.append(groupValue.toLowerCase(Locale.ROOT));
-                else if (mixed && groupValue.length() > 0)
-                  outputBuffer.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT)).append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-                else
-                  outputBuffer.append(groupValue);
-
-              }
-              catch (NumberFormatException e)
-              {
-                // Silently skip, because it's an illegal group number, so nothing
-                // gets added.
-              }
-
-              // Go back around, so we don't add the $ in
-              continue;
-            }
-          }
-          outputBuffer.append(x);
-        }
-
-        currentIndex = matchEnd;
-      }
-
-      input = outputBuffer.toString();
-    }
-
-    return input;
-  }
-
-
-  // Protected classes
-
-  // These classes are used to process the old token-based replacement strings
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-}
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioClassContents.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioClassContents.java
deleted file mode 100644
index 353eeaf..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioClassContents.java
+++ /dev/null
@@ -1,28 +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 org.apache.manifoldcf.crawler.connectors.meridio;
-
-public class MeridioClassContents
-{
-  public static final int FOLDER = 0;
-  public static final int CLASS = 1;
-
-  public int classOrFolderId;
-  public String classOrFolderName;
-  public int containerType;
-}
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java
deleted file mode 100644
index 9cf20fb..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java
+++ /dev/null
@@ -1,4583 +0,0 @@
-/* $Id: MeridioConnector.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.meridio;
-
-import com.meridio.www.MeridioDMWS.DmLogicalOp;
-import com.meridio.www.MeridioDMWS.DmPermission;
-import com.meridio.www.MeridioDMWS.DmSearchScope;
-import com.meridio.www.MeridioDMWS.DmVersionInfo;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.meridio.DMSearchResults;
-import org.apache.manifoldcf.meridio.MeridioDataSetException;
-import org.apache.manifoldcf.meridio.MeridioWrapper;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-import org.apache.http.conn.ConnectTimeoutException;
-
-import java.io.File;
-import java.io.InterruptedIOException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.FileInputStream;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.rmi.RemoteException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Map;
-
-import javax.xml.soap.SOAPException;
-
-import org.apache.axis.attachments.AttachmentPart;
-
-import org.apache.manifoldcf.crawler.connectors.meridio.DMDataSet.*;
-import org.apache.manifoldcf.crawler.connectors.meridio.RMDataSet.*;
-
-/** This is the "repository connector" for a file system.
-*/
-public class MeridioConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: MeridioConnector.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // This is the base url to use.
-  protected String urlBase = null;
-  protected String urlVersionBase = null;
-
-  private final static int maxHitsToReturn      = 100;
-
-  /** Deny access token for Meridio */
-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;
-
-  private static final long interruptionRetryTime = 60000L;
-
-  // These are the variables needed to establish a connection
-  protected URL DmwsURL = null;
-  protected URL RmwsURL = null;
-  protected javax.net.ssl.SSLSocketFactory mySSLFactory = null;
-  protected MeridioWrapper meridio_  = null;  // A handle to the Meridio Java API Wrapper
-
-  /** Constructor.
-  */
-  public MeridioConnector() {}
-
-
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    // Return the simplest model - full everything
-    return MODEL_ADD_CHANGE;
-  }
-
-
-  /** Set up the session with Meridio */
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (meridio_ == null)
-    {
-      // Do the first part (which used to be in connect() itself)
-      try
-      {
-        /*=================================================================
-        * Construct the URL strings from the parameters
-        *================================================================*/
-        String DMWSProtocol = params.getParameter("DMWSServerProtocol");
-        String DMWSPort = params.getParameter("DMWSServerPort");
-        if (DMWSPort == null || DMWSPort.length() == 0)
-          DMWSPort = "";
-        else
-          DMWSPort = ":" + DMWSPort;
-
-        String Url = DMWSProtocol + "://" +
-          params.getParameter("DMWSServerName") +
-          DMWSPort +
-          params.getParameter("DMWSLocation");
-
-        Logging.connectors.debug("Meridio: Document Management Web Service (DMWS) URL is [" + Url + "]");
-        DmwsURL = new URL(Url);
-
-        String RMWSProtocol = params.getParameter("RMWSServerProtocol");
-        String RMWSPort = params.getParameter("RMWSServerPort");
-        if (RMWSPort == null || RMWSPort.length() == 0)
-          RMWSPort = "";
-        else
-          RMWSPort = ":" + RMWSPort;
-
-        Url = RMWSProtocol + "://" +
-          params.getParameter("RMWSServerName") +
-          RMWSPort +
-          params.getParameter("RMWSLocation");
-
-        Logging.connectors.debug("Meridio: Record Management Web Service (RMWS) URL is [" + Url + "]");
-        RmwsURL = new URL(Url);
-
-        // Set up ssl if indicated
-        String keystoreData = params.getParameter( "MeridioKeystore" );
-
-        if (keystoreData != null)
-          mySSLFactory = KeystoreManagerFactory.make("",keystoreData).getSecureSocketFactory();
-        else
-          mySSLFactory = null;
-
-        // Put together the url base
-        String clientProtocol = params.getParameter("MeridioWebClientProtocol");
-        String clientPort = params.getParameter("MeridioWebClientServerPort");
-        if (clientPort == null || clientPort.length() == 0)
-          clientPort = "";
-        else
-          clientPort = ":"+clientPort;
-        urlVersionBase = clientProtocol + "://" + params.getParameter("MeridioWebClientServerName") + clientPort +
-          params.getParameter("MeridioWebClientDocDownloadLocation");
-        urlBase = urlVersionBase + "?launchMode=1&launchAs=0&documentId=";
-
-      }
-      catch (MalformedURLException malformedURLException)
-      {
-        throw new ManifoldCFException("Meridio: Could not construct the URL for either " +
-          "the DM or RM Meridio Web Service", malformedURLException, ManifoldCFException.REPOSITORY_CONNECTION_ERROR);
-      }
-
-      // Do the second part (where we actually try to connect to the system)
-      try
-      {
-        /*=================================================================
-        * Now try and login to Meridio; the wrapper's constructor can be
-        * used as it calls the Meridio login method
-        *================================================================*/
-        meridio_ = new MeridioWrapper(Logging.connectors, DmwsURL, RmwsURL, null,
-          params.getParameter("DMWSProxyHost"),
-          params.getParameter("DMWSProxyPort"),
-          params.getParameter("RMWSProxyHost"),
-          params.getParameter("RMWSProxyPort"),
-          null,
-
-          null,
-          params.getParameter("UserName"),
-          params.getObfuscatedParameter("Password"),
-          InetAddress.getLocalHost().getHostName(),
-          mySSLFactory,
-          org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender.class,
-          "client-config.wsdd");
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Meridio: bad number: "+e.getMessage(),e);
-      }
-      catch (UnknownHostException unknownHostException)
-      {
-        throw new ManifoldCFException("Meridio: A Unknown Host Exception occurred while " +
-          "connecting - is a network software and hardware configuration: "+unknownHostException.getMessage(), unknownHostException);
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage(),e);
-          }
-          throw new ManifoldCFException("Unknown http error occurred while connecting: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Meridio: Got an unknown remote exception connecting - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-        throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(),  e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: An unknown remote exception occurred while " +
-          "connecting: "+remoteException.getMessage(), remoteException);
-      }
-
-    }
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    String dmwshost = params.getParameter("DMWSServerName");
-    String rmwshost = params.getParameter("RMWSServerName");
-    return new String[]{dmwshost,rmwshost};
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    Logging.connectors.debug("Meridio: Entering 'check' method");
-
-    try
-    {
-      // Force a relogin
-      meridio_ = null;
-      getSession();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Meridio temporarily unavailable: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      return e.getMessage();
-    }
-
-    try
-    {
-
-      /*=================================================================
-      * Call a method in the Web Services API to get the Meridio system
-      * name back - just something simple to test the connection
-      * end-to-end
-      *================================================================*/
-      DMDataSet ds = meridio_.getStaticData();
-      if (null == ds)
-      {
-        Logging.connectors.debug("Meridio: DM DataSet returned was null in 'check' method");
-        return "Connection failed - null DM DataSet";
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Meridio System Name is [" +
-        ds.getSYSTEMINFO().getSystemName() + "] and the comment is [" +
-        ds.getSYSTEMINFO().getComment() + "]");
-
-      /*=================================================================
-      * For completeness, we also call a method in the RM Web
-      * Service API
-      *================================================================*/
-      RMDataSet rmws = meridio_.getConfiguration();
-      if (null == rmws)
-      {
-        Logging.connectors.warn("Meridio: RM DataSet returned was null in 'check' method");
-        return "Connection failed - null RM DataSet returned";
-      }
-
-      return super.check();
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      long currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          return "Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage();
-        }
-        return "Unknown http error occurred while checking: "+e.getMessage();
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Meridio: Got an unknown remote exception checking - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      return "Axis fault: "+e.getMessage();
-    }
-    catch (RemoteException remoteException)
-    {
-      /*=================================================================
-      * Log the exception because we will then discard it
-      *
-      * Potentially attempting to re-login may resolve this error but
-      * if it is being called soon after a successful login, then that
-      * is unlikely.
-      *
-      * A RemoteException could be a transient network error
-      *================================================================*/
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Meridio: Unknown remote exception occurred during 'check' method: "+remoteException.getMessage(),
-        remoteException);
-
-      return "Connection failed - Remote exception: "+remoteException.getMessage();
-    }
-    catch (MeridioDataSetException meridioDataSetException)
-    {
-      /*=================================================================
-      * Log the exception because we will then discard it
-      *
-      * If it is a DataSet exception it means that we could not marshal
-      * or unmarshall the XML returned from the Web Service call. This
-      * means there is either a problem with the code, or perhaps the
-      * connector is pointing at an incorrect/unsupported version of
-      * Meridio
-      *================================================================*/
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("Meridio: DataSet exception occurred during 'check' method: "+meridioDataSetException.getMessage(),
-        meridioDataSetException);
-
-      return "Connection failed - DataSet exception: "+meridioDataSetException.getMessage();
-    }
-    finally
-    {
-      Logging.connectors.debug("Meridio: Exiting 'check' method");
-    }
-  }
-
-
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    Logging.connectors.debug("Meridio: Entering 'disconnect' method");
-
-    try
-    {
-      if (meridio_ != null)
-      {
-        meridio_.logout();
-      }
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      long currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          Logging.connectors.warn("Unexpected http error code "+httpErrorCode+" logging out: "+e.getMessage());
-          return;
-        }
-        Logging.connectors.warn("Unknown http error occurred while logging out: "+e.getMessage());
-        return;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        if (e.getFaultString().indexOf(" 23031#") != -1)
-        {
-          // This means that the session has expired, so reset it and retry
-          meridio_ = null;
-          return;
-        }
-      }
-
-      Logging.connectors.warn("Meridio: Got an unknown remote exception logging out - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      return;
-    }
-    catch (RemoteException remoteException)
-    {
-      Logging.connectors.warn("Meridio: A remote exception occurred while " +
-        "logging out: "+remoteException.getMessage(), remoteException);
-    }
-    finally
-    {
-      super.disconnect();
-      meridio_ = null;
-      urlBase = null;
-      urlVersionBase = null;
-      DmwsURL = null;
-      RmwsURL = null;
-      mySSLFactory = null;
-      Logging.connectors.debug("Meridio: Exiting 'disconnect' method");
-    }
-  }
-
-
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    return 10;
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    if (command.equals("categories"))
-    {
-      try
-      {
-        String[] categories = getMeridioCategories();
-        int i = 0;
-        while (i < categories.length)
-        {
-          String category = categories[i++];
-          ConfigurationNode node = new ConfigurationNode("category");
-          node.setValue(category);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.equals("documentproperties"))
-    {
-      try
-      {
-        String[] properties = getMeridioDocumentProperties();
-        int i = 0;
-        while (i < properties.length)
-        {
-          String property = properties[i++];
-          ConfigurationNode node = new ConfigurationNode("document_property");
-          node.setValue(property);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("classorfolder/"))
-    {
-      String classOrFolderIdString = command.substring("classorfolder/".length());
-      int classOrFolderId;
-      try
-      {
-        classOrFolderId = Integer.parseInt(classOrFolderIdString);
-      }
-      catch (NumberFormatException e)
-      {
-        ManifoldCF.createErrorNode(output,new ManifoldCFException(e.getMessage(),e));
-	return false;
-      }
-      try
-      {
-        MeridioClassContents[] contents = getClassOrFolderContents(classOrFolderId);
-        int i = 0;
-        while (i < contents.length)
-        {
-          MeridioClassContents content = contents[i++];
-          ConfigurationNode node = new ConfigurationNode("content");
-          ConfigurationNode child;
-          child = new ConfigurationNode("id");
-          child.setValue(Integer.toString(content.classOrFolderId));
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("name");
-          child.setValue(content.classOrFolderName);
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("type");
-          String typeString;
-          if (content.containerType == MeridioClassContents.CLASS)
-            typeString = "class";
-          else if (content.containerType == MeridioClassContents.FOLDER)
-            typeString = "folder";
-          else
-            typeString = "unknown";
-          child.setValue(typeString);
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else
-      return super.requestInfo(output,command);
-    return true;
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.debug("Meridio: Entering 'addSeedDocuments' method");
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else
-    {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-    // Adjust start time so that we don't miss documents that squeeze in with earlier timestamps after we've already scanned that interval.
-    // Chose an interval of 15 minutes, but I've never seen this effect take place over a time interval even 1/10 of that.
-    long timeAdjust = 15L * 60000L;
-    if (startTime > timeAdjust)
-      startTime -= timeAdjust;
-    else
-      startTime = 0L;
-
-    while (true)
-    {
-      getSession();
-
-      try
-      {
-        DMSearchResults searchResults;
-        int numResultsReturnedByStream = 0;
-
-        while (true)
-        {
-          searchResults = documentSpecificationSearch(spec,
-            startTime, seedTime, numResultsReturnedByStream + 1, maxHitsToReturn);
-
-          for (int i = 0; i < searchResults.returnedHitsCount; i++)
-          {
-            long documentId =
-              searchResults.dsDM.getSEARCHRESULTS_DOCUMENTS()[i].getDocId();
-
-            String strDocumentId = new Long(documentId).toString();
-            activities.addSeedDocument(strDocumentId);
-          }
-          
-          numResultsReturnedByStream += searchResults.returnedHitsCount;
-          if (numResultsReturnedByStream == searchResults.totalHitsCount)
-            break;
-        }
-        return new Long(seedTime).toString();
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage(),e);
-          }
-          throw new ManifoldCFException("Unknown http error occurred while performing search: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          if (e.getFaultString().indexOf(" 23031#") != -1)
-          {
-            // This means that the session has expired, so reset it and retry
-            meridio_ = null;
-            continue;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Meridio: Got an unknown remote exception while performing search - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-        throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(),  e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: A Remote Exception occurred while " +
-          "performing a search: "+remoteException.getMessage(), remoteException);
-      }
-      catch (MeridioDataSetException meridioDataSetException)
-      {
-        throw new ManifoldCFException("Meridio: A problem occurred manipulating the Web " +
-          "Service XML: "+meridioDataSetException.getMessage(), meridioDataSetException);
-      }
-    }
-
-  }
-
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Get forced acls/security enable/disable
-    String[] acls = getAcls(spec);
-    // Sort it, in case it is needed.
-    if (acls != null)
-      java.util.Arrays.sort(acls);
-
-    // Look at the metadata attributes.
-    // So that the version strings are comparable, we will put them in an array first, and sort them.
-    Set<String> holder = new HashSet<String>();
-
-    String pathAttributeName = null;
-    MatchMap matchMap = new MatchMap();
-    boolean allMetadata = false;
-
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i++);
-      if (n.getType().equals("ReturnedMetadata"))
-      {
-        String category = n.getAttributeValue("category");
-        String attributeName = n.getAttributeValue("property");
-        String metadataName;
-        if (category == null || category.length() == 0)
-          metadataName = attributeName;
-        else
-          metadataName = category + "." + attributeName;
-        holder.add(metadataName);
-      }
-      else if (n.getType().equals("AllMetadata"))
-      {
-        String value = n.getAttributeValue("value");
-        if (value != null && value.equals("true"))
-        {
-          allMetadata = true;
-        }
-      }
-      else if (n.getType().equals("pathnameattribute"))
-        pathAttributeName = n.getAttributeValue("value");
-      else if (n.getType().equals("pathmap"))
-      {
-        // Path mapping info also needs to be looked at, because it affects what is
-        // ingested.
-        String pathMatch = n.getAttributeValue("match");
-        String pathReplace = n.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-
-    while (true)
-    {
-
-      getSession();
-
-      // The version string returned must include everything that could affect what is ingested.  In meridio's
-      // case, this includes the date stamp, but it also includes the part of the specification that describes
-      // the metadata desired.
-
-      // The code here relies heavily on the search method to do it's thing.  The search method originally
-      // used the document specification to determine what metadata to return, which was problematic because that
-      // meant this method had to modify the specification (not good practice), and was also wrong from the point
-      // of view that we need to get the metadata specification appended to the version string in some way, and
-      // use THAT data in processDocuments().  So I've broken all that up.
-
-      try
-      {
-        // Put into an array
-        ReturnMetadata[] categoryPropertyValues;
-        String[] categoryPropertyStringValues;
-        String[] sortArray;
-        if (allMetadata)
-        {
-          categoryPropertyStringValues = getMeridioDocumentProperties();
-        }
-        else
-        {
-          categoryPropertyStringValues = new String[holder.size()];
-          i = 0;
-          for (String value : holder)
-          {
-            categoryPropertyStringValues[i++] = value;
-          }
-        }
-        // Sort!
-        java.util.Arrays.sort(categoryPropertyStringValues);
-        categoryPropertyValues = new ReturnMetadata[categoryPropertyStringValues.length];
-        i = 0;
-        for (String value : categoryPropertyStringValues)
-        {
-          int dotIndex = value.indexOf(".");
-          String categoryName = null;
-          String propertyName;
-          if (dotIndex == -1)
-            propertyName = value;
-          else
-          {
-            categoryName = value.substring(0,dotIndex);
-            propertyName = value.substring(dotIndex+1);
-          }
-
-          categoryPropertyValues[i++] = new ReturnMetadata(categoryName,propertyName);
-        }
-        
-        // Prepare the part of the version string that is decodeable
-        StringBuilder decodeableString = new StringBuilder();
-
-        // Add the metadata piece first
-        packList(decodeableString,categoryPropertyStringValues,'+');
-        
-        // Now, put in the forced acls.
-        // The version string needs only to contain the forced acls, since the version date captures changes
-        // made to the acls that are actually associated with the document.
-        if (acls == null)
-          decodeableString.append('-');
-        else
-        {
-          decodeableString.append('+');
-          packList(decodeableString,acls,'+');
-          decodeableString.append('+');
-          pack(decodeableString,defaultAuthorityDenyToken,'+');
-        }
-
-        // Calculate the part of the version string that comes from path name and mapping.
-        if (pathAttributeName != null)
-        {
-          decodeableString.append("+");
-          pack(decodeableString,pathAttributeName,'+');
-          pack(decodeableString,matchMap.toString(),'+');
-        }
-        else
-          decodeableString.append("-");
-
-        long[] docIds = new long[documentIdentifiers.length];
-        for (i = 0; i < documentIdentifiers.length; i++)
-        {
-          docIds[i] = new Long(documentIdentifiers[i]).longValue();
-        }
-        
-        /*=================================================================
-        * Call the search, with the document specification and the list of
-        * document ids - the search will never return more than exactly
-        * one match per document id
-        *
-        * We are assuming that the maximum number of hits to return
-        * should never be more than the maximum batch size set up for this
-        * class
-        *
-        * We are just making one web service call (to the search API)
-        * rather than iteratively calling a web service method for each
-        * document passed in as part of the document array
-        *
-        * Additionally, re-using the same search method as for the
-        * "getDocumentIdentifiers" method ensures that we are not
-        * duplicating any logic which ensures that the document/records
-        * in question match the search criteria or not.
-        *================================================================*/
-        DMSearchResults searchResults = documentSpecificationSearch(spec,
-          0, 0, 1, this.getMaxDocumentRequest(), docIds, null);
-
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Found a total of <" + searchResults.totalHitsCount + "> hit(s) " +
-          "and <" + searchResults.returnedHitsCount + "> were returned by the method call");
-
-        // If we are searching based on document identifier, then it is possible that we will not
-        // find a document we are looking for, if it was removed from the system between the time
-        // it was put in the queue and when it's version is obtained.  Documents where this happens
-        // should return a version string of null.
-
-        // Let's go through the search results and build a hash based on the document identifier.
-        Map<Long,SEARCHRESULTS_DOCUMENTS> documentMap = new HashMap<Long,SEARCHRESULTS_DOCUMENTS>();
-        if (searchResults.dsDM != null)
-        {
-          SEARCHRESULTS_DOCUMENTS [] srd = searchResults.dsDM.getSEARCHRESULTS_DOCUMENTS();
-          for (i = 0; i < srd.length; i++)
-          {
-            documentMap.put(new Long(srd[i].getDocId()),srd[i]);
-          }
-        }
-
-        // Now, walk through the individual documents.
-        Map<Long,String> versionStrings = new HashMap<Long,String>();
-        for (int j = 0; j < docIds.length; j++)
-        {
-          String documentIdentifier = documentIdentifiers[j];
-          long docId = docIds[j];
-          Long docKey = new Long(docId);
-          // Look up the record.
-          SEARCHRESULTS_DOCUMENTS doc = documentMap.get(docKey);
-          if (doc != null)
-          {
-            // Set the version string.  The parseable stuff goes first, so parsing is easy.
-            String version = doc.getStr_value();
-            StringBuilder composedVersion = new StringBuilder();
-            composedVersion.append(decodeableString);
-            composedVersion.append(version);
-            // Added 9/7/2007
-            composedVersion.append("_").append(urlVersionBase);
-            //
-            String versionString = composedVersion.toString();
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Meridio: Document "+docKey+" has version "+versionString);
-            if (activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-              versionStrings.put(docKey,versionString);
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Meridio: Document "+docKey+" is no longer in the search set, or has been deleted - removing.");
-            activities.deleteDocument(documentIdentifier);
-          }
-        }
-
-        // Now submit search requests for all the documents requiring fetch.
-        
-        Map<Long,Map<String,String>> documentPropertyMap = new HashMap<Long,Map<String,String>>();
-
-        // Only look up metadata if we need some!
-        if (versionStrings.size() > 0 && categoryPropertyValues.length > 0)
-        {
-          long[] fetchIds = new long[versionStrings.size()];
-          i = 0;
-          for (Long docKey : versionStrings.keySet())
-          {
-            fetchIds[i++] = docKey;
-          }
-
-          /*=================================================================
-          * Call the search, with the document specification and the list of
-          * document ids - the search will never return more than exactly
-          * one match per document id
-          *
-          * This call will return all the metadata that was specified in the
-          * document specification for all the documents and
-          * records in one call.
-          *================================================================*/
-          searchResults = documentSpecificationSearch(spec,
-            0, 0, 1, fetchIds.length,
-            fetchIds, categoryPropertyValues);
-
-          // If we ask for a document and it is no longer there, we should treat this as a deletion.
-          // The activity in that case is to delete the document.  A similar thing should happen if
-          // any of the other methods (like getting the document's content) also fail to find the
-          // document.
-
-          // Let's build a hash which contains all the document metadata returned.  The form of
-          // the hash will be: key = the document identifier, value = another hash, which is keyed
-          // by the metadata category/property, and which has a value that is the metadata value.
-
-          Map<Long,MutableInteger> counterMap = new HashMap<Long,MutableInteger>();
-
-          if (searchResults.dsDM != null)
-          {
-            SEARCHRESULTS_DOCUMENTS [] searchResultsDocuments = searchResults.dsDM.getSEARCHRESULTS_DOCUMENTS();
-            for (SEARCHRESULTS_DOCUMENTS searchResultsDocument : searchResultsDocuments)
-            {
-              long docId = searchResultsDocument.getDocId();
-              Long docKey = new Long(docId);
-              MutableInteger counterMapItem = counterMap.get(docKey);
-              if (counterMapItem == null)
-              {
-                counterMapItem = new MutableInteger();
-                counterMap.put(docKey,counterMapItem);
-              }
-
-              String propertyName = categoryPropertyStringValues[counterMapItem.getValue()];
-              counterMapItem.increment();
-              String propertyValue = searchResultsDocuments[i].getStr_value();
-              Map<String,String> propertyMap = documentPropertyMap.get(docKey);
-              if (propertyMap == null)
-              {
-                propertyMap = new HashMap<String,String>();
-                documentPropertyMap.put(docKey,propertyMap);
-              }
-              if (propertyValue != null && propertyValue.length() > 0)
-                propertyMap.put(propertyName,propertyValue);
-            }
-          }
-        }
-
-        // Okay, we are ready now to go through the individual documents and do the ingestion or deletion.
-        for (String documentIdentifier : documentIdentifiers)
-        {
-          Long docKey = new Long(documentIdentifier);
-          long docId = docKey.longValue();
-          String docVersion = versionStrings.get(docKey);
-          if (docVersion != null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Processing document identifier '" + documentIdentifier + "' " +
-              "with version string '" + docVersion + "'");
-
-            // For each document, be sure the job is still allowed to run.
-            activities.checkJobStillActive();
-
-            RepositoryDocument repositoryDocument = new RepositoryDocument();
-
-            // Load the metadata items into the ingestion document object
-            Map<String,String> docMetadataMap = documentPropertyMap.get(docKey);
-            if (docMetadataMap != null)
-            {
-              for (String categoryPropertyName : categoryPropertyStringValues)
-              {
-                String propertyValue = docMetadataMap.get(categoryPropertyName);
-                if (propertyValue != null && propertyValue.length() > 0)
-                  repositoryDocument.addField(categoryPropertyName,propertyValue);
-              }
-            }
-
-            /*=================================================================
-            * Construct the URL to the object
-            *
-            * HTTP://HOST:PORT/meridio/browse/downloadcontent.aspx?documentId=<docId>&launchMode=1&launchAs=0
-            *
-            * I expect we need to add additional parameters to the configuration
-            * specification
-            *================================================================*/
-            String fileURL = urlBase + new Long(docId).toString();
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("URL for document '" + new Long(docId).toString() + "' is '" + fileURL + "'");
-
-            /*=================================================================
-            * Get the object's ACLs and owner information
-            *================================================================*/
-            DMDataSet documentData = null;
-            documentData = meridio_.getDocumentData((int)docId, true, true, false, false,
-              DmVersionInfo.LATEST, false, false, false);
-
-            if (null == documentData)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Meridio: Could not retrieve document data for document id '" +
-                new Long(docId).toString() + "' in processDocuments method - deleting document.");
-              activities.noDocument(documentIdentifier,docVersion);
-              continue;
-            }
-
-            if (null == documentData.getDOCUMENTS() ||
-              documentData.getDOCUMENTS().length != 1)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Meridio: Could not retrieve document owner for document id '" +
-                new Long(docId).toString() + "' in processDocuments method. No information or incorrect amount " +
-                "of information was returned");
-              activities.noDocument(documentIdentifier,docVersion);
-              continue;
-            }
-
-            // Do path metadata
-            if (pathAttributeName != null && pathAttributeName.length() > 0)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Meridio: Path attribute name is "+pathAttributeName);
-              RMDataSet partList;
-              int recordType = documentData.getDOCUMENTS()[0].getPROP_recordType();
-              if (recordType == 0 || recordType == 4 || recordType == 19)
-                partList = meridio_.getRecordPartList((int)docId, false, false);
-              else
-                partList = meridio_.getDocumentPartList((int)docId);
-              if (partList != null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Meridio: Document '"+new Long(docId).toString()+"' has a part list with "+Integer.toString(partList.getRm2vPart().length)+" values");
-
-                for (int k = 0; k < partList.getRm2vPart().length; k++)
-                {
-                  repositoryDocument.addField(pathAttributeName,matchMap.translate(partList.getRm2vPart()[k].getParentTitlePath()));
-                }
-              }
-              else
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Meridio: Document '"+new Long(docId).toString()+"' has no part list, so no path attribute");
-              }
-            }
-
-            // Process acls.  If there are forced acls, use those, otherwise get them from Meridio.
-            String [] allowAcls;
-            String [] denyAcls;
-
-            // forcedAcls will be null if security is off, or nonzero length if security is on but hard-wired
-            if (acls != null && acls.length == 0)
-            {
-              ACCESSCONTROL [] documentAcls = documentData.getACCESSCONTROL();
-              List<String> allowAclsArrayList = new ArrayList<String>();
-              List<String> denyAclsArrayList = new ArrayList<String>();
-
-              // Allow a broken authority to disable all Meridio documents, even if the document is 'wide open', because
-              // Meridio does not permit viewing of the document if the user does not exist (at least, I don't know of a way).
-              denyAclsArrayList.add(defaultAuthorityDenyToken);
-
-              if (documentAcls != null)
-              {
-                for (int j = 0; j < documentAcls.length; j++)
-                {
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug(
-                    "Object Id '" + documentAcls[j].getObjectId() + "' " +
-                    "Object Type '" + documentAcls[j].getObjectType() + "' " +
-                    "Permission '" + documentAcls[j].getPermission() + "' " +
-                    "User Id '" + documentAcls[j].getUserId() + "' " +
-                    "Group Id '" + documentAcls[j].getGroupId() + "'");
-
-                  if (documentAcls[j].getPermission() == 0)  // prohibit permission
-                  {
-                    if (documentAcls[j].getGroupId() > 0)
-                    {
-                      denyAclsArrayList.add("G" + documentAcls[j].getGroupId());
-                    } else if (documentAcls[j].getUserId() > 0)
-                    {
-                      denyAclsArrayList.add("U" + documentAcls[j].getUserId());
-                    }
-                  }
-                  else                                       // read, amend or manage
-                  {
-                    if (documentAcls[j].getGroupId() > 0)
-                    {
-                      allowAclsArrayList.add("G" + documentAcls[j].getGroupId());
-                    } else if (documentAcls[j].getUserId() > 0)
-                    {
-                      allowAclsArrayList.add("U" + documentAcls[j].getUserId());
-                    }
-                  }
-                }
-              }
-
-              DOCUMENTS document = documentData.getDOCUMENTS()[0];
-
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Document id '" + new Long(docId).toString() + "' is owned by owner id '" +
-                document.getPROP_ownerId() + "' having the owner name '" +
-                document.getPROP_ownerName() + "' Record Type is '" +
-                document.getPROP_recordType() + "'");
-
-              if (document.getPROP_recordType() == 4 ||
-                document.getPROP_recordType() == 19)
-              {
-                RMDataSet rmds = meridio_.getRecord((int)docId, false, false, false);
-                Rm2vRecord record = rmds.getRm2vRecord()[0];
-
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Record User Id Owner is '" + record.getOwnerID() +
-                  "' Record Group Owner Id is '" + record.getGroupOwnerID() + "'");
-
-                /*=================================================================
-                * Either a group or a user owns a record, cannot be both and the
-                * group takes priority if it is set
-                *================================================================*/
-                if (record.getGroupOwnerID() > 0)
-                {
-                  allowAclsArrayList.add("G" + record.getGroupOwnerID());
-                } else if (record.getOwnerID() > 0)
-                {
-                  allowAclsArrayList.add("U" + record.getOwnerID());
-                }
-              }
-              else
-              {
-                allowAclsArrayList.add("U" + document.getPROP_ownerId());
-              }
-
-              /*=================================================================
-              * Set up the string arrays and then set the ACLs in the
-              * repository document
-              *================================================================*/
-              allowAcls = new String[allowAclsArrayList.size()];
-              for (int j = 0; j < allowAclsArrayList.size(); j++)
-              {
-                allowAcls[j] = allowAclsArrayList.get(j);
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Meridio: Adding '" + allowAcls[j] + "' to allow ACLs");
-              }
-
-              denyAcls = new String[denyAclsArrayList.size()];
-              for (int j = 0; j < denyAclsArrayList.size(); j++)
-              {
-                denyAcls[j] = denyAclsArrayList.get(j);
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Meridio: Adding '" + denyAcls[j] + "' to deny ACLs");
-              }
-            }
-            else
-            {
-              allowAcls = acls;
-              if (allowAcls == null)
-                denyAcls = null;
-              else
-                denyAcls = new String[]{defaultAuthorityDenyToken};
-            }
-
-            repositoryDocument.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,allowAcls,denyAcls);
-
-            /*=================================================================
-            * Get the object's content, and ingest the document
-            *================================================================*/
-            try
-            {
-              AttachmentPart ap = meridio_.getLatestVersionFile((int)docId);
-              if (null == ap)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Meridio: Failed to get content for document '" + new Long(docId).toString() + "'");
-                // No document.  Delete what's there
-                activities.noDocument(documentIdentifier,docVersion);
-                continue;
-              }
-              try
-              {
-                // Get the file name.
-                String fileName = ap.getDataHandler().getName();
-                // Log what we are about to do.
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("Meridio: File data is supposedly in "+fileName);
-                File theTempFile = new File(fileName);
-                if (theTempFile.isFile())
-                {
-                  long fileSize = theTempFile.length();                   // ap.getSize();
-                  if (activities.checkLengthIndexable(fileSize))
-                  {
-                    InputStream is = new FileInputStream(theTempFile);      // ap.getDataHandler().getInputStream();
-                    try
-                    {
-                      repositoryDocument.setBinary(is, fileSize);
-
-                      if (null != activities)
-                      {
-                        activities.ingestDocumentWithException(documentIdentifier, docVersion,
-                          fileURL, repositoryDocument);
-                      }
-                    }
-                    finally
-                    {
-                      is.close();
-                    }
-                  }
-                  else
-                  {
-                    activities.noDocument(documentIdentifier, docVersion);
-                    continue;
-                  }
-                }
-                else
-                {
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug("Meridio: Expected temporary file was not present - skipping document '"+new Long(docId).toString() + "'");
-                  activities.deleteDocument(documentIdentifier);
-                  continue;
-                }
-              }
-              finally
-              {
-                ap.dispose();
-              }
-
-            }
-            catch (java.net.SocketTimeoutException ioex)
-            {
-              throw new ManifoldCFException("Socket timeout exception: "+ioex.getMessage(), ioex);
-            }
-            catch (ConnectTimeoutException ioex)
-            {
-              throw new ManifoldCFException("Connect timeout exception: "+ioex.getMessage(), ioex);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (org.apache.axis.AxisFault e)
-            {
-              throw e;
-            }
-            catch (RemoteException e)
-            {
-              throw e;
-            }
-            catch (SOAPException soapEx)
-            {
-              throw new ManifoldCFException("SOAP Exception encountered while retrieving document content: "+soapEx.getMessage(),
-                soapEx);
-            }
-            catch (IOException ioex)
-            {
-              throw new ManifoldCFException("Input stream failure: "+ioex.getMessage(), ioex);
-            }
-          }
-        }
-
-        Logging.connectors.debug("Meridio: Exiting 'processDocuments' method");
-        return;
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing Meridio: "+e.getMessage(),e);
-          }
-          throw new ManifoldCFException("Unknown http error occurred while getting doc versions: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          if (e.getFaultString().indexOf(" 23031#") != -1)
-          {
-            // This means that the session has expired, so reset it and retry
-            meridio_ = null;
-            continue;
-          }
-        }
-
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Meridio: Got an unknown remote exception getting doc versions - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-        throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(),  e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: A remote exception occurred while getting doc versions: " +
-          remoteException.getMessage(), remoteException);
-      }
-      catch (MeridioDataSetException meridioDataSetException)
-      {
-        throw new ManifoldCFException("Meridio: A problem occurred manipulating the Web " +
-          "Service XML: "+meridioDataSetException.getMessage(), meridioDataSetException);
-      }
-    }
-  }
-
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.DocumentServer"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.RecordsServer"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.Credentials"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.WebClient"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.dmwsServerPort.value != \"\" && !isInteger(editconnection.dmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.dmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsServerPort.value != \"\" && !isInteger(editconnection.rmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.dmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.dmwsProxyPort.value != \"\" && !isInteger(editconnection.dmwsProxyPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.dmwsProxyPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsProxyPort.value != \"\" && !isInteger(editconnection.rmwsProxyPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.dmwsProxyPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  if (editconnection.webClientServerPort.value != \"\" && !isInteger(editconnection.webClientServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAValidNumber") + "\");\n"+
-"    editconnection.webClientServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.userName.value != \"\" && editconnection.userName.value.indexOf(\"\\\\\") <= 0)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.AValidMeridioUserNameHasTheForm") + "\");\n"+
-"    editconnection.userName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.dmwsServerName.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.DocumentServer") + "\");\n"+
-"    editconnection.dmwsServerName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsServerName.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.RecordsServer") + "\");\n"+
-"    editconnection.rmwsServerName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webClientServerName.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseFillInAMeridioWebClientServerName") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.WebClient") + "\");\n"+
-"    editconnection.webClientServerName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.dmwsServerPort.value != \"\" && !isInteger(editconnection.dmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.DocumentServer") + "\");\n"+
-"    editconnection.dmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.rmwsServerPort.value != \"\" && !isInteger(editconnection.rmwsServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.RecordsServer") + "\");\n"+
-"    editconnection.rmwsServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webClientServerPort.value != \"\" && !isInteger(editconnection.webClientServerPort.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.WebClient") + "\");\n"+
-"    editconnection.webClientServerPort.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.userName.value == \"\" || editconnection.userName.value.indexOf(\"\\\\\") <= 0)\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.Credentials") + "\");\n"+
-"    editconnection.userName.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function DeleteCertificate(aliasName)\n"+
-"{\n"+
-"  editconnection.keystorealias.value = aliasName;\n"+
-"  editconnection.configop.value = \"Delete\";\n"+
-"  postForm();\n"+
-"}\n"+
-"\n"+
-"function AddCertificate()\n"+
-"{\n"+
-"  if (editconnection.certificate.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.ChooseACertificateFile") + "\");\n"+
-"    editconnection.certificate.focus();\n"+
-"  }\n"+
-"  else\n"+
-"  {\n"+
-"    editconnection.configop.value = \"Add\";\n"+
-"    postForm();\n"+
-"  }\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String dmwsServerProtocol = parameters.getParameter("DMWSServerProtocol");
-    if (dmwsServerProtocol == null)
-      dmwsServerProtocol = "http";
-    String rmwsServerProtocol = parameters.getParameter("RMWSServerProtocol");
-    if (rmwsServerProtocol == null)
-      rmwsServerProtocol = "http";
-
-    String dmwsServerName = parameters.getParameter("DMWSServerName");
-    if (dmwsServerName == null)
-      dmwsServerName = "";
-    String rmwsServerName = parameters.getParameter("RMWSServerName");
-    if (rmwsServerName == null)
-      rmwsServerName = "";
-
-    String dmwsServerPort = parameters.getParameter("DMWSServerPort");
-    if (dmwsServerPort == null)
-      dmwsServerPort = "";
-    String rmwsServerPort = parameters.getParameter("RMWSServerPort");
-    if (rmwsServerPort == null)
-      rmwsServerPort = "";
-
-    String dmwsLocation = parameters.getParameter("DMWSLocation");
-    if (dmwsLocation == null)
-      dmwsLocation = "/DMWS/MeridioDMWS.asmx";
-    String rmwsLocation = parameters.getParameter("RMWSLocation");
-    if (rmwsLocation == null)
-      rmwsLocation = "/RMWS/MeridioRMWS.asmx";
-
-    String dmwsProxyHost = parameters.getParameter("DMWSProxyHost");
-    if (dmwsProxyHost == null)
-      dmwsProxyHost = "";
-    String rmwsProxyHost = parameters.getParameter("RMWSProxyHost");
-    if (rmwsProxyHost == null)
-      rmwsProxyHost = "";
-
-    String dmwsProxyPort = parameters.getParameter("DMWSProxyPort");
-    if (dmwsProxyPort == null)
-      dmwsProxyPort = "";
-    String rmwsProxyPort = parameters.getParameter("RMWSProxyPort");
-    if (rmwsProxyPort == null)
-      rmwsProxyPort = "";
-
-    String userName = parameters.getParameter("UserName");
-    if (userName == null)
-      userName = "";
-
-    String password = parameters.getObfuscatedParameter("Password");
-    if (password == null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-
-    String webClientProtocol = parameters.getParameter("MeridioWebClientProtocol");
-    if (webClientProtocol == null)
-      webClientProtocol = "http";
-    String webClientServerName = parameters.getParameter("MeridioWebClientServerName");
-    if (webClientServerName == null)
-      webClientServerName = "";
-    String webClientServerPort = parameters.getParameter("MeridioWebClientServerPort");
-    if (webClientServerPort == null)
-      webClientServerPort = "";
-    String webClientDocDownloadLocation = parameters.getParameter("MeridioWebClientDocDownloadLocation");
-    if (webClientDocDownloadLocation == null)
-      webClientDocDownloadLocation = "/meridio/browse/downloadcontent.aspx";
-
-    String meridioKeystore = parameters.getParameter("MeridioKeystore");
-    IKeystoreManager localKeystore;
-    if (meridioKeystore == null)
-      localKeystore = KeystoreManagerFactory.make("");
-    else
-      localKeystore = KeystoreManagerFactory.make("",meridioKeystore);
-    out.print(
-"<input name=\"configop\" type=\"hidden\" value=\"Continue\"/>\n"
-    );
-
-    // "Document Server" tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.DocumentServer")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"dmwsServerProtocol\">\n"+
-"        <option value=\"http\" "+((dmwsServerProtocol.equals("http"))?"selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\"https\" "+(dmwsServerProtocol.equals("https")?"selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"dmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsServerName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerPort") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"dmwsServerPort\" value=\""+dmwsServerPort+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceLocation") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"dmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsLocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"separator\" colspan=\"2\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerProxyHost") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"dmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsProxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DocumentWebserviceServerProxyPort") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"dmwsProxyPort\" value=\""+dmwsProxyPort+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the Document Server tab.
-      out.print(
-"<input type=\"hidden\" name=\"dmwsServerProtocol\" value=\""+dmwsServerProtocol+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsServerName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsServerPort\" value=\""+dmwsServerPort+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsLocation)+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dmwsProxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"dmwsProxyPort\" value=\""+dmwsProxyPort+"\"/>\n"
-      );
-    }
-
-    // "Records Server" tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.RecordsServer")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"rmwsServerProtocol\">\n"+
-"        <option value=\"http\" "+((rmwsServerProtocol.equals("http"))?"selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\"https\" "+(rmwsServerProtocol.equals("https")?"selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"rmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsServerName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerPort") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"rmwsServerPort\" value=\""+rmwsServerPort+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceLocation") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"rmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsLocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"separator\" colspan=\"2\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerProxyHost") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"rmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsProxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.RecordWebserviceServerProxyPort") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"rmwsProxyPort\" value=\""+rmwsProxyPort+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the Records Server tab.
-      out.print(
-"<input type=\"hidden\" name=\"rmwsServerProtocol\" value=\""+rmwsServerProtocol+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsServerName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsServerPort\" value=\""+rmwsServerPort+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsLocation)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsProxyHost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(rmwsProxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"rmwsProxyPort\" value=\""+rmwsProxyPort+"\"/>\n"
-      );
-    }
-
-    // The "Credentials" tab
-    // Always pass the whole keystore as a hidden.
-    if (meridioKeystore != null)
-    {
-      out.print(
-"<input type=\"hidden\" name=\"keystoredata\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(meridioKeystore)+"\"/>\n"
-      );
-    }
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.Credentials")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.UserName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"userName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Password") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.SSLCertificateList") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\"keystorealias\" value=\"\"/>\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      // List the individual certificates in the store, with a delete button for each
-      String[] contents = localKeystore.getContents();
-      if (contents.length == 0)
-      {
-        out.print(
-"        <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.NoCertificatesPresent") + "</nobr></td></tr>\n"
-        );
-      }
-      else
-      {
-        int i = 0;
-        while (i < contents.length)
-        {
-          String alias = contents[i];
-          String description = localKeystore.getDescription(alias);
-          if (description.length() > 128)
-            description = description.substring(0,125) + "...";
-          out.print(
-"        <tr>\n"+
-"          <td class=\"value\"><input type=\"button\" onclick='Javascript:DeleteCertificate(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(alias)+"\")' alt=\""+Messages.getAttributeString(locale,"MeridioConnector.DeleteCert")+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(alias)+"\" value=\"Delete\"/></td>\n"+
-"          <td>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
-"        </tr>\n"
-          );
-
-          i++;
-        }
-      }
-      out.print(
-"      </table>\n"+
-"      <input type=\"button\" onclick='Javascript:AddCertificate()' alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.AddCert") + "\" value=\"Add\"/>&nbsp;\n"+
-"      Certificate:&nbsp;<input name=\"certificate\" size=\"50\" type=\"file\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the "Credentials" tab
-      out.print(
-"<input type=\"hidden\" name=\"userName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"
-      );
-    }
-
-    // Web Client tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.WebClient")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.WebClientProtocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"webClientProtocol\">\n"+
-"        <option value=\"http\" "+((webClientProtocol.equals("http"))?"selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\"https\" "+(webClientProtocol.equals("https")?"selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.WebClientServerName") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"webClientServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webClientServerName)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.WebClientServerPort") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"webClientServerPort\" value=\""+webClientServerPort+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.WebClientServerDocLocation") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"webClientDocDownloadLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webClientDocDownloadLocation)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for the "Web Client" tab
-      out.print(
-"<input type=\"hidden\" name=\"webClientProtocol\" value=\""+webClientProtocol+"\"/>\n"+
-"<input type=\"hidden\" name=\"webClientServerName\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webClientServerName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"webClientServerPort\" value=\""+webClientServerPort+"\"/>\n"+
-"<input type=\"hidden\" name=\"webClientDocDownloadLocation\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webClientDocDownloadLocation)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String dmwsServerProtocol = variableContext.getParameter("dmwsServerProtocol");
-    if (dmwsServerProtocol != null)
-      parameters.setParameter("DMWSServerProtocol",dmwsServerProtocol);
-    String rmwsServerProtocol = variableContext.getParameter("rmwsServerProtocol");
-    if (rmwsServerProtocol != null)
-      parameters.setParameter("RMWSServerProtocol",rmwsServerProtocol);
-
-    String dmwsServerName = variableContext.getParameter("dmwsServerName");
-    if (dmwsServerName != null)
-      parameters.setParameter("DMWSServerName",dmwsServerName);
-    String rmwsServerName = variableContext.getParameter("rmwsServerName");
-    if (rmwsServerName != null)
-      parameters.setParameter("RMWSServerName",rmwsServerName);
-
-    String dmwsServerPort = variableContext.getParameter("dmwsServerPort");
-    if (dmwsServerPort != null)
-    {
-      if (dmwsServerPort.length() > 0)
-        parameters.setParameter("DMWSServerPort",dmwsServerPort);
-      else
-        parameters.setParameter("DMWSServerPort",null);
-    }
-    String rmwsServerPort = variableContext.getParameter("rmwsServerPort");
-    if (rmwsServerPort != null)
-    {
-      if (rmwsServerPort.length() > 0)
-        parameters.setParameter("RMWSServerPort",rmwsServerPort);
-      else
-        parameters.setParameter("RMWSServerPort",null);
-    }
-
-    String dmwsLocation = variableContext.getParameter("dmwsLocation");
-    if (dmwsLocation != null)
-      parameters.setParameter("DMWSLocation",dmwsLocation);
-    String rmwsLocation = variableContext.getParameter("rmwsLocation");
-    if (rmwsLocation != null)
-      parameters.setParameter("RMWSLocation",rmwsLocation);
-
-    String dmwsProxyHost = variableContext.getParameter("dmwsProxyHost");
-    if (dmwsProxyHost != null)
-      parameters.setParameter("DMWSProxyHost",dmwsProxyHost);
-    String rmwsProxyHost = variableContext.getParameter("rmwsProxyHost");
-    if (rmwsProxyHost != null)
-      parameters.setParameter("RMWSProxyHost",rmwsProxyHost);
-    String dmwsProxyPort = variableContext.getParameter("dmwsProxyPort");
-    if (dmwsProxyPort != null && dmwsProxyPort.length() > 0)
-      parameters.setParameter("DMWSProxyPort",dmwsProxyPort);
-    String rmwsProxyPort = variableContext.getParameter("rmwsProxyPort");
-    if (rmwsProxyPort != null && rmwsProxyPort.length() > 0)
-      parameters.setParameter("RMWSProxyPort",rmwsProxyPort);
-
-    String userName = variableContext.getParameter("userName");
-    if (userName != null)
-      parameters.setParameter("UserName",userName);
-
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter("Password",variableContext.mapKeyToPassword(password));
-
-    String webClientProtocol = variableContext.getParameter("webClientProtocol");
-    if (webClientProtocol != null)
-      parameters.setParameter("MeridioWebClientProtocol",webClientProtocol);
-    String webClientServerName = variableContext.getParameter("webClientServerName");
-    if (webClientServerName != null)
-      parameters.setParameter("MeridioWebClientServerName",webClientServerName);
-    String webClientServerPort = variableContext.getParameter("webClientServerPort");
-    if (webClientServerPort != null)
-    {
-      if (webClientServerPort.length() > 0)
-        parameters.setParameter("MeridioWebClientServerPort",webClientServerPort);
-      else
-        parameters.setParameter("MeridioWebClientServerPort",null);
-    }
-
-    String webClientDocDownloadLocation = variableContext.getParameter("webClientDocDownloadLocation");
-    if (webClientDocDownloadLocation != null)
-      parameters.setParameter("MeridioWebClientDocDownloadLocation",webClientDocDownloadLocation);
-
-    String configOp = variableContext.getParameter("configop");
-    if (configOp != null)
-    {
-      String keystoreValue;
-      if (configOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("keystorealias");
-        keystoreValue = parameters.getParameter("MeridioKeystore");
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        parameters.setParameter("MeridioKeystore",mgr.getString());
-      }
-      else if (configOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("certificate");
-        keystoreValue = parameters.getParameter("MeridioKeystore");
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Eat this exception
-          }
-        }
-
-        if (certError != null)
-        {
-          // Redirect to error page
-          return "Illegal certificate: "+certError;
-        }
-        parameters.setParameter("MeridioKeystore",mgr.getString());
-      }
-    }
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" certificate(s)&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-  // The allowed mime types, which are those that the ingestion API understands
-  private static String[] allowedMimeTypes;
-  static
-  {
-    allowedMimeTypes = new String[]
-    {
-      "application/excel",
-      "application/powerpoint",
-      "application/ppt",
-      "application/rtf",
-      "application/xls",
-      "text/html",
-      "text/rtf",
-      "text/pdf",
-      "application/x-excel",
-      "application/x-msexcel",
-      "application/x-mspowerpoint",
-      "application/x-msword-doc",
-      "application/x-msword",
-      "application/x-word",
-      "Application/pdf",
-      "text/xml",
-      "no-type",
-      "text/plain",
-      "application/pdf",
-      "application/x-rtf",
-      "application/vnd.ms-excel",
-      "application/vnd.ms-pps",
-      "application/vnd.ms-powerpoint",
-      "application/vnd.ms-word",
-      "application/msword",
-      "application/msexcel",
-      "application/mspowerpoint",
-      "application/ms-powerpoint",
-      "application/ms-word",
-      "application/ms-excel",
-      "Adobe",
-      "application/Vnd.Ms-Excel",
-      "vnd.ms-powerpoint",
-      "application/x-pdf",
-      "winword",
-      "text/richtext",
-      "Text",
-      "Text/html",
-      "application/MSWORD",
-      "application/PDF",
-      "application/MSEXCEL",
-      "application/MSPOWERPOINT"
-    };
-    java.util.Arrays.sort(allowedMimeTypes);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.SearchPaths"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.ContentTypes"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.Categories"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.DataTypes"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.Security"));
-    tabsArray.add(Messages.getString(locale,"MeridioConnector.Metadata"));
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"\n"+
-"function "+seqPrefix+"SpecDeletePath(n)\n"+
-"{\n"+
-"  var anchor;\n"+
-"  if (n == 0)\n"+
-"    anchor = \""+seqPrefix+"SpecPathAdd\";\n"+
-"  else\n"+
-"    anchor = \""+seqPrefix+"SpecPath_\"+(n-1);\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specpathop_\"+n,\"Delete\",anchor);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddPath()\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specpathop\",\"Add\",\""+seqPrefix+"SpecPathAdd\");\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecDeleteFromPath()\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specpathop\",\"DeleteFromPath\",\""+seqPrefix+"SpecPathAdd\");\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToPath()\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specpath.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.SelectAFolderOrClassFirst") + "\");\n"+
-"    editjob."+seqPrefix+"specpath.focus();\n"+
-"  }\n"+
-"  else\n"+
-"    "+seqPrefix+"SpecOp(\""+seqPrefix+"specpathop\",\"AddToPath\",\""+seqPrefix+"SpecPathAdd\");\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddAccessToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.AccessTokenCannotBeNull") + "\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"  }\n"+
-"  else\n"+
-"    "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecDeleteMapping(item, anchorvalue)\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specmappingop_\"+item,\"Delete\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddMapping(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"specmatch.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"MeridioConnector.MatchStringCannotBeEmpty") + "\");\n"+
-"    editjob."+seqPrefix+"specmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"specmappingop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-    int k;
-
-    // Search Paths tab
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.SearchPaths")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("SearchPath"))
-        {
-          // Found a search path.  Not clear from the spec what the attribute is, or whether this is
-          // body data, so I'm going to presume it's a path attribute.
-          String pathString = sn.getAttributeValue("path");
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specpathop_"+Integer.toString(k)+"\" value=\"Continue\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specpath_"+Integer.toString(k)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathString)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"SpecPath_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" onclick='javascript:"+seqPrefix+"SpecDeletePath("+Integer.toString(k)+");' alt=\""+Messages.getAttributeString(locale,"MeridioConnector.DeletePath")+Integer.toString(k)+"\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathString)+"</nobr></td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.NoPathsSpecified") + "</nobr></td></tr>\n"
-        );
-      }
-      out.print(
-"  <tr>\n"+
-"    <td class=\"lightseparator\" colspan=\"2\"><input type=\"hidden\" name=\""+seqPrefix+"specpath_total\" value=\""+Integer.toString(k)+"\"/><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"
-      );
-      // The path, and the corresponding IDs
-      String pathSoFar = (String)currentContext.get(seqPrefix+"specpath");
-      String idsSoFar = (String)currentContext.get(seqPrefix+"specpathids");
-
-      // The type of the object described by the path
-      Integer containerType = (Integer)currentContext.get(seqPrefix+"specpathtype");
-
-      if (pathSoFar == null)
-        pathSoFar = "/";
-      if (idsSoFar == null)
-        idsSoFar = "0";
-      if (containerType == null)
-        containerType = new Integer(org.apache.manifoldcf.crawler.connectors.meridio.MeridioClassContents.CLASS);
-
-      int currentInt = 0;
-      if (idsSoFar.length() > 0)
-      {
-        String[] ids = idsSoFar.split(",");
-        currentInt = Integer.parseInt(ids[ids.length-1]);
-      }
-
-      // Grab next folder/project list
-      try
-      {
-        org.apache.manifoldcf.crawler.connectors.meridio.MeridioClassContents[] childList;
-        if (containerType.intValue() == org.apache.manifoldcf.crawler.connectors.meridio.MeridioClassContents.CLASS)
-        {
-          childList = getClassOrFolderContents(currentInt);
-        }
-        else
-          childList = new org.apache.manifoldcf.crawler.connectors.meridio.MeridioClassContents[0];
-        out.print(
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specpathop\" value=\"Continue\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specpathbase\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathSoFar)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specidsbase\" value=\""+idsSoFar+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"spectype\" value=\""+containerType.toString()+"\"/>\n"+
-"      <a name=\""+seqPrefix+"SpecPathAdd\"><input type=\"button\" value=\"Add\" onclick=\"javascript:"+seqPrefix+"SpecAddPath();\" alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.AddPath") + "\"/></a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <nobr>\n"+
-"        "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathSoFar)+"\n"
-        );
-        if (pathSoFar.length() > 1)
-        {
-          out.print(
-"        <input type=\"button\" value=\"-\" onclick=\"javascript:"+seqPrefix+"SpecDeleteFromPath();\" alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.DeleteFromPath") + "\"/>\n"
-          );
-        }
-        if (childList.length > 0)
-        {
-          out.print(
-"        <input type=\"button\" value=\"+\" onclick=\"javascript:"+seqPrefix+"SpecAddToPath();\" alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.AddToPath") + "\"/>\n"+
-"        <select name=\""+seqPrefix+"specpath\" size=\"10\">\n"+
-"          <option value=\"\" selected=\"\">" + Messages.getBodyString(locale,"MeridioConnector.PickAFolder") + "</option>\n"
-          );
-          int j = 0;
-          while (j < childList.length)
-          {
-            // The option selected needs to include both the id and the name, since I have no way
-            // to get to the name from the id.  So, put the id first, then a semicolon, then the name.
-            out.print(
-"          <option value=\""+Integer.toString(childList[j].classOrFolderId)+";"+Integer.toString(childList[j].containerType)+";"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(childList[j].classOrFolderName)+"\">\n"+
-"            "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(childList[j].classOrFolderName)+"\n"+
-"          </option>\n"
-            );
-            j++;
-          }
-          out.print(
-"        </select>\n"
-          );
-        }
-        out.print(
-"      </nobr>\n"+
-"    </td>\n"
-        );
-
-      }
-      catch (ServiceInterruption e)
-      {
-        e.printStackTrace();
-        out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"MeridioConnector.ServiceInterruption") +org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td>\n"
-        );
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        out.print(
-"    <td class=\"message\" colspan=\"2\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td>\n"
-        );
-      }
-      out.print(
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // The path tab is hidden; just preserve the contents
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("SearchPath"))
-        {
-          // Found a search path.  Not clear from the spec what the attribute is, or whether this is
-          // body data, so I'm going to presume it's a value attribute.
-          String pathString = sn.getAttributeValue("path");
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpath_"+Integer.toString(k)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathString)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specpath_total\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-
-    // Content Types tab
-    Set<String> mimeTypeMap = new HashSet<String>();
-    for (i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("MIMEType"))
-      {
-        String type = sn.getAttributeValue("type");
-        mimeTypeMap.add(type);
-      }
-    }
-    // If there are none selected, then check them all, since no mime types would be nonsensical.
-    if (mimeTypeMap.size() == 0)
-    {
-      for (String allowedMimeType : allowedMimeTypes)
-      {
-        mimeTypeMap.add(allowedMimeType);
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.ContentTypes")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.MimeTypes") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-      );
-      i = 0;
-      while (i < allowedMimeTypes.length)
-      {
-        String mimeType = allowedMimeTypes[i++];
-        out.print(
-"      <nobr>\n"+
-"        <input type=\"checkbox\" name=\""+seqPrefix+"specmimetypes\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeType)+"\" "+(mimeTypeMap.contains(mimeType)?"checked=\"true\"":"")+">\n"+
-"          "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mimeType)+"\n"+
-"        </input>\n"+
-"      </nobr>\n"+
-"      <br/>\n"
-
-        );
-      }
-      out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Tab is not selected.  Submit a separate hidden for each value that was selected before.
-      Iterator<String> iter = mimeTypeMap.iterator();
-      while (iter.hasNext())
-      {
-        String mimeType = iter.next();
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmimetypes\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeType)+"\"/>\n"
-        );
-      }
-    }
-
-    // Categories tab
-
-    Set<String> categoriesMap = new HashSet<String>();
-    for (i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("SearchCategory"))
-      {
-        String category = sn.getAttributeValue("category");
-        categoriesMap.add(category);
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.Categories")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"
-      );
-      // Grab the list of available categories from Meridio
-      try
-      {
-        String[] categoryList;
-        categoryList = getMeridioCategories();
-        out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Categories") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-        );
-        k = 0;
-        while (k < categoryList.length)
-        {
-          String category = categoryList[k++];
-          out.print(
-"      <nobr>\n"+
-"        <input type=\"checkbox\" name=\""+seqPrefix+"speccategories\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(category)+"\" "+(categoriesMap.contains(category)?"checked=\"true\"":"")+">\n"+
-"        "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(category)+"\n"+
-"        </input>\n"+
-"      </nobr>\n"+
-"      <br/>\n"
-          );
-        }
-        out.print(
-"    </td>\n"
-        );
-      }
-      catch (ServiceInterruption e)
-      {
-        e.printStackTrace();
-        out.print(
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"MeridioConnector.ServiceInterruption") +org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td>\n"
-        );
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        out.print(
-"    <td class=\"message\" colspan=\"2\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td>\n"
-        );
-      }
-
-      out.print(
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Tab is not selected.  Submit a separate hidden for each value that was selected before.
-      Iterator<String> iter = categoriesMap.iterator();
-      while (iter.hasNext())
-      {
-        String category = iter.next();
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"speccategories\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(category)+"\"/>\n"
-        );
-      }
-    }
-
-    // Data Types tab
-    String mode = "DOCUMENTS_AND_RECORDS";
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("SearchOn"))
-        mode = sn.getAttributeValue("value");
-    }
-
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.DataTypes")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DataTypesToIngest") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <nobr><input type=\"radio\" name=\""+seqPrefix+"specsearchon\" value=\"DOCUMENTS\" "+(mode.equals("DOCUMENTS")?"checked=\"true\"":"")+"/>" + Messages.getBodyString(locale,"MeridioConnector.Documents") + "</nobr><br/>\n"+
-"      <nobr><input type=\"radio\" name=\""+seqPrefix+"specsearchon\" value=\"RECORDS\" "+(mode.equals("RECORDS")?"checked=\"true\"":"")+"/>" + Messages.getBodyString(locale,"MeridioConnector.Records") + "</nobr><br/>\n"+
-"      <nobr><input type=\"radio\" name=\""+seqPrefix+"specsearchon\" value=\"DOCUMENTS_AND_RECORDS\" "+(mode.equals("DOCUMENTS_AND_RECORDS")?"checked=\"true\"":"")+"/>" + Messages.getBodyString(locale,"MeridioConnector.DocumentsAndRecords") + "</nobr><br/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specsearchon\" value=\""+mode+"\"/>\n"
-      );
-    }
-
-    // Security tab
-
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.Security")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Security2") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"on\" "+(securityOn?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"MeridioConnector.Enabled") + "&nbsp;\n"+
-"      <input type=\"radio\" name=\""+seqPrefix+"specsecurity\" value=\"off\" "+((securityOn==false)?"checked=\"true\"":"")+" />" + Messages.getBodyString(locale,"MeridioConnector.Disabled") + "\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String accessOpName = seqPrefix+"accessop"+accessDescription;
-          String token = sn.getAttributeValue("token");
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")' alt=\""+Messages.getAttributeString(locale,"MeridioConnector.DeleteToken")+Integer.toString(k)+"\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"MeridioConnector.NoAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Add\" onClick='Javascript:"+seqPrefix+"SpecAddAccessToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.AddAccessToken") + "\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specsecurity\" value=\""+(securityOn?"on":"off")+"\"/>\n"
-      );
-      // Finally, go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access"))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String token = sn.getAttributeValue("token");
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-
-    // Metadata tab
-
-    // Find the path-value metadata attribute name
-    i = 0;
-    String pathNameAttribute = "";
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("pathnameattribute"))
-      {
-        pathNameAttribute = sn.getAttributeValue("value");
-      }
-    }
-
-    // Find the path-value mapping data
-    i = 0;
-    org.apache.manifoldcf.crawler.connectors.meridio.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.meridio.MatchMap();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("pathmap"))
-      {
-        String pathMatch = sn.getAttributeValue("match");
-        String pathReplace = sn.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-
-    boolean allMetadata = false;
-    HashMap metadataSelected = new HashMap();
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("ReturnedMetadata"))
-      {
-        String category = sn.getAttributeValue("category");
-        String property = sn.getAttributeValue("property");
-        String descriptor;
-        if (category == null || category.length() == 0)
-          descriptor = property;
-        else
-          descriptor = category + "." + property;
-        metadataSelected.put(descriptor,descriptor);
-      }
-      else if (sn.getType().equals("AllMetadata"))
-      {
-        String value = sn.getAttributeValue("value");
-        if (value != null && value.equals("true"))
-        {
-          allMetadata = true;
-        }
-        else
-          allMetadata = false;
-      }
-    }
-    if (tabName.equals(Messages.getString(locale,"MeridioConnector.Metadata")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingcount\" value=\""+Integer.toString(matchMap.getMatchCount())+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingop\" value=\"\"/>\n"+
-"\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\">\n"+
-"      <nobr>" + Messages.getBodyString(locale,"MeridioConnector.IncludeAllMetadata") + "</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"+
-"      <nobr>\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"allmetadata\" value=\"false\" "+((allMetadata==false)?"checked=\"true\"":"")+">" + Messages.getBodyString(locale,"MeridioConnector.IncludeSpecified") + "</input>\n"+
-"        <input type=\"radio\" name=\""+seqPrefix+"allmetadata\" value=\"true\" "+(allMetadata?"checked=\"true\"":"")+">" + Messages.getBodyString(locale,"MeridioConnector.IncludeAll") + "</input>\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"  <tr>\n"
-      );
-      // get the list of properties from the repository
-      try
-      {
-        String[] propertyList;
-        propertyList = getMeridioDocumentProperties();
-        out.print(
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Metadata") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"specproperties_edit\" value=\"true\"/>\n"
-        );
-        k = 0;
-        while (k < propertyList.length)
-        {
-          String descriptor = propertyList[k++];
-          out.print(
-"      <nobr>\n"+
-"        <input type=\"checkbox\" name=\""+seqPrefix+"specproperties\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(descriptor)+"\" "+((metadataSelected.get(descriptor)!=null)?"checked=\"true\"":"")+">\n"+
-"          "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(descriptor)+"\n"+
-"        </input>\n"+
-"      </nobr>\n"+
-"      <br/>\n"
-          );
-        }
-        out.print(
-"    </td>\n"
-        );
-      }
-      catch (ServiceInterruption e)
-      {
-        e.printStackTrace();
-        out.print(
-"    <td class=\"message\" colspan=\"4\">" + Messages.getBodyString(locale,"MeridioConnector.ServiceInterruption") + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td>\n"
-        );
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        out.print(
-"    <td class=\"message\" colspan=\"4\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td>\n"
-        );
-      }
-      out.print(
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.PathAttributeMetadataName") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\"><nobr>\n"+
-"      <input type=\"text\" size=\"16\" name=\""+seqPrefix+"specpathnameattribute\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathNameAttribute)+"\"/></nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"
-      );
-      i = 0;
-      while (i < matchMap.getMatchCount())
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><input type=\"hidden\" name=\""+seqPrefix+"specmappingop_"+Integer.toString(i)+"\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"mapping_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecDeleteMapping(Integer.toString(i),\""+seqPrefix+"mapping_"+Integer.toString(i)+"\")' alt=\""+Messages.getAttributeString(locale,"MeridioConnector.DeleteMapping")+Integer.toString(i)+"\" value=\"Delete\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+seqPrefix+"specreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</td>\n"+
-"  </tr>\n"
-        );
-        i++;
-      }
-      if (i == 0)
-      {
-        out.print(
-"  <tr><td colspan=\"4\" class=\"message\">" + Messages.getBodyString(locale,"MeridioConnector.NoMappingsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <a name=\""+seqPrefix+"mapping_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" onClick='Javascript:"+seqPrefix+"SpecAddMapping(\""+seqPrefix+"mapping_"+Integer.toString(i+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"MeridioConnector.AddToMappings") + "\" value=\"Add\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"MeridioConnector.MatchRegexp") + "&nbsp;<input type=\"text\" name=\""+seqPrefix+"specmatch\" size=\"32\" value=\"\"/></td>\n"+
-"    <td class=\"value\">==></td>\n"+
-"    <td class=\"value\">" + Messages.getBodyString(locale,"MeridioConnector.ReplaceString") + "&nbsp;<input type=\"text\" name=\""+seqPrefix+"specreplace\" size=\"32\" value=\"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specproperties_edit\" value=\"true\"/>\n"
-      );
-      Iterator iter = metadataSelected.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String descriptor = (String)iter.next();
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specproperties\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(descriptor)+"\"/>\n"
-        );
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"allmetadata\" value=\""+(allMetadata?"true":"false")+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specpathnameattribute\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathNameAttribute)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specmappingcount\" value=\""+Integer.toString(matchMap.getMatchCount())+"\"/>\n"
-      );
-      i = 0;
-      while (i < matchMap.getMatchCount())
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"specmatch_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(matchString)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"specreplace_"+Integer.toString(i)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(replaceString)+"\"/>\n"
-        );
-        i++;
-      }
-    }
-
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-
-    // Gather the path names
-    String x = variableContext.getParameter(seqPrefix+"specpath_total");
-    if (x != null)
-    {
-      // Get rid of old specpath entries
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("SearchPath"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Gather into spec node, paying attention to any delete requests.
-      i = 0;
-      int count = Integer.parseInt(x);
-      while (i < count)
-      {
-        String path = variableContext.getParameter(seqPrefix+"specpath_"+Integer.toString(i));
-        String pathOp = variableContext.getParameter(seqPrefix+"specpathop_"+Integer.toString(i));
-        if (pathOp == null || !pathOp.equals("Delete"))
-        {
-          SpecificationNode sn = new SpecificationNode("SearchPath");
-          sn.setAttribute("path",path);
-          ds.addChild(ds.getChildCount(),sn);
-        }
-        i++;
-      }
-
-
-      // Do operation
-      x = variableContext.getParameter(seqPrefix+"specpathop");
-      if (x != null)
-      {
-        // Retrieve current state information
-        String pathSoFar = variableContext.getParameter(seqPrefix+"specpathbase");
-        String idsSoFar = variableContext.getParameter(seqPrefix+"specidsbase");
-        Integer containerType = new Integer(variableContext.getParameter(seqPrefix+"spectype"));
-
-        if (x.equals("Add"))
-        {
-          // Tack the current path onto the specification
-          SpecificationNode sn = new SpecificationNode("SearchPath");
-          sn.setAttribute("path",pathSoFar);
-          ds.addChild(ds.getChildCount(),sn);
-          pathSoFar = null;
-          idsSoFar = null;
-          containerType = null;
-        }
-        else if (x.equals("AddToPath"))
-        {
-          String pathField = variableContext.getParameter(seqPrefix+"specpath");
-          int index = pathField.indexOf(";");
-          int secondIndex = pathField.indexOf(";",index+1);
-          pathSoFar = pathSoFar + pathField.substring(secondIndex+1) + "/";
-          idsSoFar = idsSoFar + "," + pathField.substring(0,index);
-          containerType = new Integer(pathField.substring(index+1,secondIndex));
-        }
-        else if (x.equals("DeleteFromPath"))
-        {
-          pathSoFar = pathSoFar.substring(0,pathSoFar.lastIndexOf("/"));
-          pathSoFar = pathSoFar.substring(0,pathSoFar.lastIndexOf("/")+1);
-          idsSoFar = idsSoFar.substring(0,idsSoFar.lastIndexOf(",")-1);
-          containerType = new Integer(org.apache.manifoldcf.crawler.connectors.meridio.MeridioClassContents.CLASS);
-        }
-
-        currentContext.save(seqPrefix+"specpath",pathSoFar);
-        currentContext.save(seqPrefix+"specpathids",idsSoFar);
-        currentContext.save(seqPrefix+"specpathtype",containerType);
-      }
-
-    }
-
-    // Searchon parameter
-    x = variableContext.getParameter(seqPrefix+"specsearchon");
-    if (x != null)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("SearchOn"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode newNode = new SpecificationNode("SearchOn");
-      newNode.setAttribute("value",x);
-      ds.addChild(ds.getChildCount(),newNode);
-    }
-
-    // Categories parameter
-    String[] y = variableContext.getParameterValues(seqPrefix+"speccategories");
-    if (y != null)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("SearchCategory"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      i = 0;
-      while (i < y.length)
-      {
-        String category = y[i++];
-        SpecificationNode newNode = new SpecificationNode("SearchCategory");
-        newNode.setAttribute("category",category);
-        ds.addChild(ds.getChildCount(),newNode);
-      }
-    }
-
-    // Properties parameter
-    x = variableContext.getParameter(seqPrefix+"specproperties_edit");
-    if (x != null && x.length() > 0)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("ReturnedMetadata"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      y = variableContext.getParameterValues(seqPrefix+"specproperties");
-      if (y != null)
-      {
-        i = 0;
-        while (i < y.length)
-        {
-          String descriptor = y[i++];
-          SpecificationNode newNode = new SpecificationNode("ReturnedMetadata");
-          int index = descriptor.indexOf(".");
-          String category;
-          String property;
-          if (index == -1)
-          {
-            category = null;
-            property = descriptor;
-          }
-          else
-          {
-            category = descriptor.substring(0,index);
-            property = descriptor.substring(index+1);
-          }
-          if (category != null)
-            newNode.setAttribute("category",category);
-          newNode.setAttribute("property",property);
-          ds.addChild(ds.getChildCount(),newNode);
-        }
-      }
-    }
-
-
-    // Mime types parameter
-    y = variableContext.getParameterValues(seqPrefix+"specmimetypes");
-    if (y != null)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("MIMEType"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      i = 0;
-      while (i < y.length)
-      {
-        String category = y[i++];
-        SpecificationNode newNode = new SpecificationNode("MIMEType");
-        newNode.setAttribute("type",category);
-        ds.addChild(ds.getChildCount(),newNode);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (x != null)
-    {
-      // Delete all security entries first
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("security"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode("security");
-      node.setAttribute("value",x);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-
-    x = variableContext.getParameter(seqPrefix+"tokencount");
-    if (x != null)
-    {
-      // Delete all file specs first
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(x);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        String xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"specpathnameattribute");
-    if (x != null && x.length() > 0)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathnameattribute"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode node = new SpecificationNode("pathnameattribute");
-      node.setAttribute("value",x);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    
-    x = variableContext.getParameter(seqPrefix+"specmappingcount");
-    if (x != null && x.length() > 0)
-    {
-      // Delete old spec
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathmap"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(x);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specmappingop"+pathDescription;
-        x = variableContext.getParameter(pathOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Inserts won't happen until the very end
-        String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-        String replace = variableContext.getParameter(seqPrefix+"specreplace"+pathDescription);
-        SpecificationNode node = new SpecificationNode("pathmap");
-        node.setAttribute("match",match);
-        node.setAttribute("replace",replace);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // Check for add
-      x = variableContext.getParameter(seqPrefix+"specmappingop");
-      if (x != null && x.equals("Add"))
-      {
-        String match = variableContext.getParameter(seqPrefix+"specmatch");
-        String replace = variableContext.getParameter(seqPrefix+"specreplace");
-        SpecificationNode node = new SpecificationNode("pathmap");
-        node.setAttribute("match",match);
-        node.setAttribute("replace",replace);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter(seqPrefix+"allmetadata");
-    if (x != null)
-    {
-      i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("AllMetadata"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      SpecificationNode node = new SpecificationNode("AllMetadata");
-      node.setAttribute("value",x);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"
-    );
-    int i = 0;
-    boolean seenAny = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("SearchPath"))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Paths") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue("path"))+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"MeridioConnector.NoPathsSpecified") + "</td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.DataType") + "</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <nobr>\n"
-    );
-    i = 0;
-    String mode = "DOCUMENTS_AND_RECORDS";
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("SearchOn"))
-        mode = sn.getAttributeValue("value");
-    }
-    String displayMode;
-    if (mode.equals("DOCUMENTS"))
-      displayMode = "Documents only";
-    else if (mode.equals("RECORDS"))
-      displayMode = "Records only";
-    else
-      displayMode = "Documents and Records";
-    out.print(
-"        "+displayMode+"\n"+
-"      </nobr>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.Categories") + "</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"
-    );
-    int count = 0;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("SearchCategory"))
-        count++;
-    }
-    String[] sortArray = new String[count];
-    count = 0;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("SearchCategory"))
-        sortArray[count++] = sn.getAttributeValue("category");
-    }
-    java.util.Arrays.sort(sortArray);
-    i = 0;
-    while (i < sortArray.length)
-    {
-      String category = sortArray[i++];
-      out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(category)+"</nobr><br/>\n"
-      );
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.MimeTypes") + "</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"
-    );
-    count = 0;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("MIMEType"))
-        count++;
-    }
-    sortArray = new String[count];
-    count = 0;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("MIMEType"))
-        sortArray[count++] = sn.getAttributeValue("type");
-    }
-    java.util.Arrays.sort(sortArray);
-    i = 0;
-    while (i < sortArray.length)
-    {
-      String mimeType = sortArray[i++];
-      out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mimeType)+"</nobr><br/>\n"
-      );
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"
-    );
-    // Find whether security is on or off
-    i = 0;
-    boolean securityOn = true;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("security"))
-      {
-        String securityValue = sn.getAttributeValue("value");
-        if (securityValue.equals("off"))
-          securityOn = false;
-        else if (securityValue.equals("on"))
-          securityOn = true;
-      }
-    }
-    out.print(
-"  <tr>\n"+
-"    <td class=\"description\">" + Messages.getBodyString(locale,"MeridioConnector.Security2") + "</td>\n"+
-"    <td class=\"value\">"+(securityOn?Messages.getBodyString(locale,"MeridioConnector.Enabled"):Messages.getBodyString(locale,"MeridioConnector.Disabled"))+"</td>\n"+
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Go through looking for access tokens
-    seenAny = false;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("access"))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">" + Messages.getBodyString(locale,"MeridioConnector.AccessTokens") + "</td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue("token");
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"MeridioConnector.NoAccessTokensSpecified") + "</td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"
-    );
-    count = 0;
-    i = 0;
-    boolean allMetadata = false;
-
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("ReturnedMetadata"))
-        count++;
-      else if (sn.getType().equals("AllMetadata"))
-      {
-        String value = sn.getAttributeValue("value");
-        if (value != null && value.equals("true"))
-        {
-          allMetadata = true;
-        }
-      }
-    }
-
-    if (allMetadata)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.MetadataPropertiesToIngest") + "</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><nobr><b>" + Messages.getBodyString(locale,"MeridioConnector.AllMetadata") + "</b></nobr></td>\n"
-      );
-    }
-    else if (count > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.MetadataPropertiesToIngest") + "</nobr>\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"
-      );
-      sortArray = new String[count];
-      i = 0;
-      count = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("ReturnedMetadata"))
-        {
-          String category = sn.getAttributeValue("category");
-          String property = sn.getAttributeValue("property");
-          String descriptor;
-          if (category == null || category.length() == 0)
-            descriptor = property;
-          else
-            descriptor = category + "." + property;
-
-          sortArray[count++] = descriptor;
-        }
-      }
-
-      java.util.Arrays.sort(sortArray);  
-      i = 0;
-      while (i < sortArray.length)
-      {
-        String descriptor = sortArray[i++];
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(descriptor)+"</nobr><br/>\n"
-        );
-      }
-      out.print(
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.NoMetadataPropertiesToIngest") + "</nobr></td> \n"
-      );
-    } 
-    out.print(
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    // Find the path-name metadata attribute name i = 0;
-    String pathNameAttribute = "";
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("pathnameattribute"))
-      {
-        pathNameAttribute = sn.getAttributeValue("value");
-      }
-    }
-    out.print(
-"  <tr>\n"
-    );
-    if (pathNameAttribute.length() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.PathNameMetadataAttribute") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathNameAttribute)+"</nobr></td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.NoPathNameMetadataAttributeSpecified") + "</nobr></td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"
-    );
-    // Find the path-value mapping data
-    i = 0;
-    org.apache.manifoldcf.crawler.connectors.meridio.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.meridio.MatchMap();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("pathmap"))
-      {
-        String pathMatch = sn.getAttributeValue("match");
-        String pathReplace = sn.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-    }
-    if (matchMap.getMatchCount() > 0)
-    {
-      out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"MeridioConnector.PathValueMapping") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      i = 0;
-      while (i < matchMap.getMatchCount())
-      {
-        String matchString = matchMap.getMatchString(i);
-        String replaceString = matchMap.getReplaceString(i);
-        out.print(
-"        <tr>\n"+
-"          <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(matchString)+"</td>\n"+
-"          <td class=\"value\">--></td><td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(replaceString)+"</td>\n"+
-"        </tr>\n"
-        );
-        i++;
-      }
-      out.print(
-"      </table>\n"+
-"    </td>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"    <td class=\"message\" colspan=\"2\"><nobr>"+Messages.getBodyString(locale,"MeridioConnector.NoMappingsSpecified")+"</nobr></td>\n"
-      );
-    }
-    out.print(
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-
-// Protected methods
-
-  /** Grab forced acl out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getAcls(Specification spec)
-  {
-    HashMap map = new HashMap();
-    int i = 0;
-    boolean securityOn = true;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals("access"))
-      {
-        String token = sn.getAttributeValue("token");
-        map.put(token,token);
-      }
-      else if (sn.getType().equals("security"))
-      {
-        String value = sn.getAttributeValue("value");
-        if (value.equals("on"))
-          securityOn = true;
-        else if (value.equals("off"))
-          securityOn = false;
-      }
-    }
-    if (!securityOn)
-      return null;
-
-    String[] rval = new String[map.size()];
-    Iterator iter = map.keySet().iterator();
-    i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  private static String [] getMIMETypes
-  (
-    Specification spec
-  )
-  {
-    ArrayList al = new ArrayList ();
-
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-
-      if (sn.getType().equals("MIMEType"))
-      {
-        al.add(sn.getAttributeValue("type"));
-      }
-    }
-
-    String [] mimeTypes = new String[al.size()];
-    Iterator it = al.iterator();
-    for (int i = 0; it.hasNext(); i++)
-    {
-      mimeTypes[i] = (String) it.next();
-    }
-
-    return mimeTypes;
-  }
-
-
-
-  /** Returns all objects from the Meridio repository matching the document specification,
-  * and constrained by the start/end object addition times, and the subset of the total
-  * results to return (startPositionOfHits and maxHitsToReturn)
-  *
-  * @see documentSpecificationSearch Specification docSpec,      long startTime,
-  long endTime, int startPositionOfHits, int maxHitsToReturn,
-    int restrictDocumentId
-  */
-  private DMSearchResults documentSpecificationSearch
-  (
-    Specification docSpec,      // The castor representation of the Document Specification
-    long startTime,
-    long endTime,
-    int startPositionOfHits,
-    int maxHitsToReturn
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    return documentSpecificationSearch(docSpec, startTime, endTime,
-      startPositionOfHits, maxHitsToReturn, null, null);
-  }
-
-
-
-  /** Returns objects from the Meridio repository matching the document specification,
-  * and constrained by the start/end object addition times, and the subset of the total
-  * results to return (startPositionOfHits and maxHitsToReturn)
-  *
-  * @param docSpec                                       the criteria to determine if an object should be returned
-  * @param startTime                 the date/time after which the object must have been added (inclusive)
-  * @param endTime                   the date/time before which the object must have been added (exclusive)
-  * @param startPositionOfHits       the starting position in the hits to begin returning results from
-  * @param maxHitsToReturn           the maximum number of hits to return
-  * @param restrictDocumentId        if zero, then consider all objects, otherwise if set consider only
-  *                                                                      the indicated document identifier - this is used to check if a
-  *                                                                      give document id subsequently matches the document specification
-  *                                                                      at some point after it was initially returned from the search results
-  *
-  * @see documentSpecificationSearch Specification docSpec,      long startTime,
-  long endTime, int startPositionOfHits, int maxHitsToReturn,
-    int [] restrictDocumentId
-  */
-  private DMSearchResults documentSpecificationSearch
-  (
-    Specification docSpec,      // The castor representation of the Document Specification
-    long startTime,
-    long endTime,
-    int startPositionOfHits,
-    int maxHitsToReturn,
-    long restrictDocumentId
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (restrictDocumentId > 0)
-    {
-      return documentSpecificationSearch(docSpec, startTime, endTime,
-        startPositionOfHits, maxHitsToReturn, new long [] {restrictDocumentId}, null);
-    }
-    else
-    {
-      return documentSpecificationSearch(docSpec, startTime, endTime,
-        startPositionOfHits, maxHitsToReturn, null, null);
-    }
-  }
-
-
-
-  /** Returns objects from the Meridio repository matching the document specification,
-  * and constrained by the start/end object addition times, and the subset of the total
-  * results to return (startPositionOfHits and maxHitsToReturn)
-  *
-  *  The search method can return the results in "batches" results, based on the start position
-  *  and maximum hits to return.
-  *
-  * @param docSpec                                       the criteria to determine if an object should be returned
-  * @param startTime                 the date/time after which the object must have been added (inclusive)
-  * @param endTime                   the date/time before which the object must have been added (exclusive)
-  * @param startPositionOfHits       the starting position in the hits to begin returning results from
-  * @param maxHitsToReturn           the maximum number of hits to return
-  * @param restrictDocumentId        if the array is empty then return all matching objects, otherwise
-  *
-  *                                                                      Search results are returned in the SEARCHRESULTS_DOCUMENTS DataTable.
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  protected DMSearchResults documentSpecificationSearch
-  (
-    Specification docSpec,
-    long startTime,
-    long endTime,
-    int startPositionOfHits,
-    int maxHitsToReturn,
-    long [] restrictDocumentId,
-    ReturnMetadata[] returnMetadata
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    try
-    {
-      Logging.connectors.debug("Entering documentSpecificationSearch");
-
-      int currentSearchTerm = 1;
-      DMDataSet dsSearchCriteria = new DMDataSet();
-
-      /*====================================================================
-      * Exclude things marked for delete
-      *===================================================================*/
-      PROPERTY_TERMS drDeleteSearch = new PROPERTY_TERMS();
-      drDeleteSearch.setId(currentSearchTerm++);
-      drDeleteSearch.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-      drDeleteSearch.setPropertyName("PROP_markedForDelete");
-      drDeleteSearch.setCategoryId(4);                               //Global Standard/Fixed Property
-      drDeleteSearch.setNum_relation(new Short("0").shortValue());   //dmNumRelation.EQUAL
-      drDeleteSearch.setNum_value(0);
-      drDeleteSearch.setParentId(1);
-      drDeleteSearch.setIsVersionProperty(false);
-      dsSearchCriteria.addPROPERTY_TERMS(drDeleteSearch);
-
-      /*====================================================================
-      * Restrict based on start & end date/time, if necessssary
-      *===================================================================*/
-      if (startTime > 0L)
-      {
-        Logging.connectors.debug("Start Date/time is <" + new Date(startTime) + "> in ms <" + startTime + ">" +
-          " End Date/time is <" + new Date(endTime) + "> in ms <" + endTime + ">");
-
-        PROPERTY_TERMS drDateStart = new PROPERTY_TERMS();
-        drDateStart.setId(currentSearchTerm++);
-        drDateStart.setTermType(new Short("2").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDateStart.setPropertyName("PROP_lastModifiedDate");
-        drDateStart.setCategoryId(4);                                 //Global Standard/Fixed Property
-        drDateStart.setDate_relation(new Short("11").shortValue());   //dtONORAFTER
-        drDateStart.setDate_value(new Date(startTime));
-        drDateStart.setParentId(1);
-        drDateStart.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDateStart);
-
-        PROPERTY_TERMS drDateEnd = new PROPERTY_TERMS();
-        drDateEnd.setId(currentSearchTerm++);
-        drDateEnd.setTermType(new Short("2").shortValue());        //0=STRING, 1=NUMBER, 2=DATE
-        drDateEnd.setPropertyName("PROP_lastModifiedDate");
-        drDateEnd.setCategoryId(4);                                //Global Standard/Fixed Property
-        drDateEnd.setDate_relation(new Short("8").shortValue());  //dtBEFORE
-        drDateEnd.setDate_value(new Date(endTime));
-        drDateEnd.setParentId(1);
-        drDateEnd.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDateEnd);
-      }
-
-      /*====================================================================
-      * Just add a dummy term to make the conditional logic easier; i.e.
-      * always add an "AND" - the dummy term is required in case there are
-      * no other search criteria - i.e. we could be searching the whole
-      * Meridio repository
-      *
-      * Search for document id's which are > 0 - this will always be true
-      *===================================================================*/
-      PROPERTY_TERMS drDocIdSearch = new PROPERTY_TERMS();
-      drDocIdSearch.setId(currentSearchTerm++);
-      drDocIdSearch.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-      drDocIdSearch.setPropertyName("PROP_documentId");
-      drDocIdSearch.setCategoryId(4);                               //Global Standard/Fixed Property
-      drDocIdSearch.setNum_relation(new Short("3").shortValue());   //dmNumRelation.GREATER
-      drDocIdSearch.setNum_value(0);
-      drDocIdSearch.setParentId(1);
-      drDocIdSearch.setIsVersionProperty(false);
-      dsSearchCriteria.addPROPERTY_TERMS(drDocIdSearch);
-
-      if (restrictDocumentId != null && restrictDocumentId.length == 1)
-      {
-        /*====================================================================
-        * Restrict the search query to just the 1 document ID passed in
-        *===================================================================*/
-        PROPERTY_TERMS drDocIdSearchRestricted = new PROPERTY_TERMS();
-        drDocIdSearchRestricted.setId(currentSearchTerm++);
-        drDocIdSearchRestricted.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDocIdSearchRestricted.setPropertyName("PROP_documentId");
-        drDocIdSearchRestricted.setCategoryId(4);                               //Global Standard/Fixed Property
-        drDocIdSearchRestricted.setNum_relation(new Short("0").shortValue());   //dmNumRelation.EQUAL
-        drDocIdSearchRestricted.setNum_value(restrictDocumentId[0]);            //Search for the specific doc ID
-        drDocIdSearchRestricted.setParentId(1);
-        drDocIdSearchRestricted.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDocIdSearchRestricted);
-      }
-      else if (restrictDocumentId != null && restrictDocumentId.length > 1)
-      {
-        /*====================================================================
-        * Multiple document id's have been passed in, so we need to "or"
-        * them together
-        *===================================================================*/
-        for (int i = 0; i < restrictDocumentId.length; i++)
-        {
-          PROPERTY_TERMS drDocIdSearchRestricted = new PROPERTY_TERMS();
-          drDocIdSearchRestricted.setId(currentSearchTerm++);
-          drDocIdSearchRestricted.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-          drDocIdSearchRestricted.setPropertyName("PROP_documentId");
-          drDocIdSearchRestricted.setCategoryId(4);                               //Global Standard/Fixed Property
-          drDocIdSearchRestricted.setNum_relation(new Short("0").shortValue());   //dmNumRelation.EQUAL
-          drDocIdSearchRestricted.setNum_value(restrictDocumentId[i]);            //Search for the specific doc ID
-          drDocIdSearchRestricted.setParentId(4);
-          drDocIdSearchRestricted.setIsVersionProperty(false);
-          dsSearchCriteria.addPROPERTY_TERMS(drDocIdSearchRestricted);
-        }
-
-        PROPERTY_OPS drMIMETypeOps = new PROPERTY_OPS();
-        drMIMETypeOps.setId(4);
-        drMIMETypeOps.setParentId(1);
-        drMIMETypeOps.setOperator(new Short("1").shortValue());    // OR
-        dsSearchCriteria.addPROPERTY_OPS(drMIMETypeOps);
-      }
-
-      PROPERTY_OPS drPropertyOps = new PROPERTY_OPS();
-      drPropertyOps.setId(1);
-      drPropertyOps.setOperator(new Short("0").shortValue());   //AND
-      dsSearchCriteria.addPROPERTY_OPS(drPropertyOps);
-
-      /*====================================================================
-      * Filter on documents, records, or documents and records
-      *
-      * The "SearchDocuments" method returns both documents and records; to
-      * return just documents, get things where the recordType is not
-      * 0, 4 or 19 (refer to Meridio Documentation)
-      *===================================================================*/
-      String searchOn = null;
-      for (int i = 0; i < docSpec.getChildCount(); i++)
-      {
-        SpecificationNode sn = docSpec.getChild(i);
-
-        if (sn.getType().equals("SearchOn"))
-        {
-          searchOn = sn.getAttributeValue("value");
-        }
-      }
-
-      if (searchOn != null && searchOn.equals("DOCUMENTS_ONLY"))
-      {
-        PROPERTY_TERMS drDocsOrRecsSearch = new PROPERTY_TERMS();
-        drDocsOrRecsSearch.setId(currentSearchTerm++);
-        drDocsOrRecsSearch.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDocsOrRecsSearch.setPropertyName("PROP_recordType");
-        drDocsOrRecsSearch.setCategoryId(4);                               //Global Standard/Fixed Property
-        drDocsOrRecsSearch.setNum_relation(new Short("1").shortValue());   //dmNumberRelation.NOTEQUAL=1
-        drDocsOrRecsSearch.setNum_value(0);
-        drDocsOrRecsSearch.setParentId(1);
-        drDocsOrRecsSearch.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDocsOrRecsSearch);
-
-        PROPERTY_TERMS drDocsOrRecsSearch2 = new PROPERTY_TERMS();
-        drDocsOrRecsSearch2.setId(currentSearchTerm++);
-        drDocsOrRecsSearch2.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDocsOrRecsSearch2.setPropertyName("PROP_recordType");
-        drDocsOrRecsSearch2.setCategoryId(4);                               //Global Standard/Fixed Property
-        drDocsOrRecsSearch2.setNum_relation(new Short("1").shortValue());   //dmNumberRelation.NOTEQUAL=1
-        drDocsOrRecsSearch2.setNum_value(4);
-        drDocsOrRecsSearch2.setParentId(1);
-        drDocsOrRecsSearch2.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDocsOrRecsSearch2);
-
-        PROPERTY_TERMS drDocsOrRecsSearch3 = new PROPERTY_TERMS();
-        drDocsOrRecsSearch3.setId(currentSearchTerm++);
-        drDocsOrRecsSearch3.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDocsOrRecsSearch3.setPropertyName("PROP_recordType");
-        drDocsOrRecsSearch3.setCategoryId(4);                               //Global Standard/Fixed Property
-        drDocsOrRecsSearch3.setNum_relation(new Short("1").shortValue());   //dmNumberRelation.NOTEQUAL=1
-        drDocsOrRecsSearch3.setNum_value(19);
-        drDocsOrRecsSearch3.setParentId(1);
-        drDocsOrRecsSearch3.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDocsOrRecsSearch3);
-      }
-
-      /*====================================================================
-      * Filter on documents, records, or documents and records
-      *
-      * The "SearchDocuments" method returns both documents and records; to
-      * return just records, get things where the recordType is 4 or greater
-      *===================================================================*/
-      if (searchOn != null && searchOn.equals("RECORDS_ONLY"))
-      {
-        PROPERTY_TERMS drDocsOrRecsSearch = new PROPERTY_TERMS();
-        drDocsOrRecsSearch.setId(currentSearchTerm++);
-        drDocsOrRecsSearch.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDocsOrRecsSearch.setPropertyName("PROP_recordType");
-        drDocsOrRecsSearch.setCategoryId(4);                               //Global Standard/Fixed Property
-        drDocsOrRecsSearch.setNum_relation(new Short("5").shortValue());   //dmNumberRelation.GREATEROREQUAL=5
-        drDocsOrRecsSearch.setNum_value(4);
-        drDocsOrRecsSearch.setParentId(1);
-        drDocsOrRecsSearch.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDocsOrRecsSearch);
-      }
-
-      /*====================================================================
-      * Filter on class or folder (if any)
-      *===================================================================*/
-      for (int i = 0; i < docSpec.getChildCount(); i++)
-      {
-        SpecificationNode sn = docSpec.getChild(i);
-
-        if (sn.getType().equals("SearchPath"))
-        {
-          String searchPath   = sn.getAttributeValue("path");
-          int searchContainer = meridio_.findClassOrFolder(searchPath);
-
-          if (searchContainer > 0)
-          {
-            SEARCH_CONTAINERS drSearchContainers = new SEARCH_CONTAINERS();
-            drSearchContainers.setContainerId(searchContainer);
-            dsSearchCriteria.addSEARCH_CONTAINERS(drSearchContainers);
-
-            Logging.connectors.debug("Found path [" +  searchPath + "] id: [" +
-              searchContainer + "]");
-          }
-          else if (searchContainer == 0)
-          {
-            Logging.connectors.debug("Meridio: Found FilePlan root, so not including in search criteria!");
-          }
-          else
-          {
-            /*====================================================================
-            * We can't find the path, so ignore it.
-            *
-            * This is potentially opening up the search scope, i.e. if there was
-            * one path which was being searched and then the Meridio FilePlan is
-            * re-organised and the path no longer exists (but the original content
-            * has just been moved in the tree) then this could cause all the
-            * Meridio content to be returned
-            *===================================================================*/
-            Logging.connectors.warn("Meridio: Did not find FilePlan path [" +  searchPath + "]. " +
-              "The path is therefore *not* being used to restrict the search scope");
-          }
-        }
-      }
-
-      /*====================================================================
-      * Filter on category (if any)
-      *===================================================================*/
-      CATEGORIES [] meridioCategories = meridio_.getCategories().getCATEGORIES();
-      // Create a map from title to category ID
-      HashMap categoryMap = new HashMap();
-      int i = 0;
-      while (i < meridioCategories.length)
-      {
-        String title = meridioCategories[i].getPROP_title();
-        long categoryID = meridioCategories[i].getPROP_categoryId();
-        categoryMap.put(title,new Long(categoryID));
-        i++;
-      }
-
-      ArrayList categoriesToAdd = new ArrayList ();
-
-      for (i = 0; i < docSpec.getChildCount(); i++)
-      {
-        SpecificationNode sn = docSpec.getChild(i);
-
-        if (sn.getType().equals("SearchCategory"))
-        {
-          String searchCategory   = sn.getAttributeValue("category");
-          Long categoryIDObject = (Long)categoryMap.get(searchCategory);
-          if (categoryIDObject != null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Meridio: Category [" + searchCategory + "] match, ID=[" + categoryIDObject + "]");
-            categoriesToAdd.add(categoryIDObject);
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Meridio: No match found for Category [" + searchCategory + "]");
-          }
-        }
-      }
-
-      for (i = 0; i < categoriesToAdd.size(); i++)
-      {
-        PROPERTY_TERMS drDocsOrRecsSearch = new PROPERTY_TERMS();
-        drDocsOrRecsSearch.setId(currentSearchTerm++);
-        drDocsOrRecsSearch.setTermType(new Short("1").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drDocsOrRecsSearch.setPropertyName("PROP_categoryId");
-        drDocsOrRecsSearch.setCategoryId(4);                               //Global Standard/Fixed Property
-        drDocsOrRecsSearch.setNum_relation(new Short("0").shortValue());   //dmNumberRelation.GREATEROREQUAL=5
-        drDocsOrRecsSearch.setNum_value(((Long) categoriesToAdd.get(i)).longValue());
-        if (categoriesToAdd.size() == 1)  // If there is one term, we can use the AND clause
-        {
-          drDocsOrRecsSearch.setParentId(1);
-        }
-        else                      // Otherwise, need to have an OR subclause
-        {
-          drDocsOrRecsSearch.setParentId(2);
-        }
-        drDocsOrRecsSearch.setIsVersionProperty(false);
-        dsSearchCriteria.addPROPERTY_TERMS(drDocsOrRecsSearch);
-      }
-
-      /*====================================================================
-      * Filter on MIME Type (if any are in the Document Specification)
-      *===================================================================*/
-      String [] mimeTypes = getMIMETypes(docSpec);
-      for (i = 0; i < mimeTypes.length; i++)
-      {
-        PROPERTY_TERMS drMIMETypesSearch = new PROPERTY_TERMS();
-        drMIMETypesSearch.setId(currentSearchTerm++);
-        drMIMETypesSearch.setTermType(new Short("0").shortValue());       //0=STRING, 1=NUMBER, 2=DATE
-        drMIMETypesSearch.setPropertyName("PROP_W_mimeType");
-        drMIMETypesSearch.setCategoryId(4);                               //Global Standard/Fixed Property
-        drMIMETypesSearch.setStr_relation(new Short("0").shortValue());   //dmNumberRelation.GREATEROREQUAL=5
-        drMIMETypesSearch.setStr_value(mimeTypes[i]);
-        if (mimeTypes.length == 1)  // If there is one term, we can use the AND clause
-        {
-          drMIMETypesSearch.setParentId(1);
-        }
-        else                      // Otherwise, need to have an OR subclause
-        {
-          drMIMETypesSearch.setParentId(3);
-        }
-        drMIMETypesSearch.setIsVersionProperty(true);
-        dsSearchCriteria.addPROPERTY_TERMS(drMIMETypesSearch);
-      }
-
-      if (categoriesToAdd.size() > 1)
-      {
-        PROPERTY_OPS drCategoryOps = new PROPERTY_OPS();
-        drCategoryOps.setId(2);
-        drCategoryOps.setParentId(1);
-        drCategoryOps.setOperator(new Short("1").shortValue());    // OR
-        dsSearchCriteria.addPROPERTY_OPS(drCategoryOps);
-      }
-      if (mimeTypes.length > 1)
-      {
-        PROPERTY_OPS drMIMETypeOps = new PROPERTY_OPS();
-        drMIMETypeOps.setId(3);
-        drMIMETypeOps.setParentId(1);
-        drMIMETypeOps.setOperator(new Short("1").shortValue());    // OR
-        dsSearchCriteria.addPROPERTY_OPS(drMIMETypeOps);
-      }
-
-      /*====================================================================
-      * Define what is being returned: include the properties that are
-      * present within the document specification
-      *===================================================================*/
-      int returnResultsAdded = 0;
-      if (returnMetadata != null && returnMetadata.length > 0)
-      {
-        PROPERTYDEFS [] propertyDefs = meridio_.getStaticData().getPROPERTYDEFS();
-
-        // Build a hash table containing standard and custom properties
-        HashMap propertyMap = new HashMap();
-        HashMap customMap = new HashMap();
-        i = 0;
-        while (i < propertyDefs.length)
-        {
-          PROPERTYDEFS def = propertyDefs[i++];
-          if (def.getTableName().equals("DOCUMENTS"))
-          {
-            propertyMap.put(def.getDisplayName(),def.getColumnName());
-          }
-          else if (def.getTableName().equals("DOCUMENT_CUSTOMPROPS"))
-          {
-            Long categoryID = new Long(def.getCategoryId());
-            HashMap dataMap = (HashMap)customMap.get(categoryID);
-            if (dataMap == null)
-            {
-              dataMap = new HashMap();
-              customMap.put(categoryID,dataMap);
-            }
-            dataMap.put(def.getDisplayName(),def.getColumnName());
-          }
-        }
-
-        for (i = 0; i < returnMetadata.length; i++)
-        {
-          long categoryMatch = 0;
-          boolean isCategoryMatch    = false;
-
-          RESULTDEFS drResultDefs = new RESULTDEFS();
-          drResultDefs.setIsVersionProperty(false);
-
-          if (returnMetadata[i].getCategoryName() == null ||
-            returnMetadata[i].getCategoryName().length() == 0)
-          {
-            isCategoryMatch = true;
-            categoryMatch   = 4;
-          }
-          else
-          {
-            Long categoryIDObject = (Long)categoryMap.get(returnMetadata[i].getCategoryName());
-            if (categoryIDObject != null)
-            {
-              isCategoryMatch = true;
-              categoryMatch = categoryIDObject.longValue();
-            }
-          }
-
-          if (!isCategoryMatch)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Meridio: Category '" + returnMetadata[i].getCategoryName() + "' no match found for search results criteria!");
-            continue;
-          }
-          else
-          {
-
-            /*====================================================================
-            * Find the matching property name for the display name (as it is the
-            * property column name that is required by the search)
-            *===================================================================*/
-
-            String columnName = (String)propertyMap.get(returnMetadata[i].getPropertyName());
-            if (columnName == null)
-            {
-              HashMap categoryMatchMap = (HashMap)customMap.get(new Long(categoryMatch));
-              if (categoryMatchMap != null)
-
-              {
-                columnName = (String)categoryMatchMap.get(returnMetadata[i].getPropertyName());
-              }
-
-            }
-
-            if (columnName != null)
-              drResultDefs.setPropertyName(columnName);
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Meridio: No property match found for '" + returnMetadata[i].getPropertyName() + "'");
-              continue;
-            }
-
-            drResultDefs.setCategoryId(categoryMatch);
-            dsSearchCriteria.addRESULTDEFS(drResultDefs);
-            returnResultsAdded++;
-          }
-        }
-      }
-
-      /*====================================================================
-      * We always need to return something in the search results, so add
-      * the last modified date if nothing else was provided
-      *===================================================================*/
-      if (returnResultsAdded == 0)
-      {
-        RESULTDEFS drResultDefs = new RESULTDEFS();
-        drResultDefs.setPropertyName("PROP_lastModifiedDate");
-        drResultDefs.setIsVersionProperty(false);
-        drResultDefs.setCategoryId(4);
-        dsSearchCriteria.addRESULTDEFS(drResultDefs);
-      }
-
-      /*====================================================================
-      * Call the search method
-      *===================================================================*/
-      DMSearchResults searchResults = meridio_.searchDocuments(dsSearchCriteria,
-        maxHitsToReturn, startPositionOfHits, DmPermission.READ, false,
-        DmSearchScope.BOTH, false, true, false, DmLogicalOp.AND);
-
-      return searchResults;
-    }
-    finally
-    {
-      Logging.connectors.debug("Exiting documentSpecificationSearch method.");
-    }
-  }
-
-
-
-  private static class ReturnMetadata
-  {
-    protected String categoryName_;
-    protected String propertyName_;
-
-    public ReturnMetadata
-    (
-      String categoryName,
-      String propertyName
-    )
-    {
-      categoryName_ = categoryName;
-      propertyName_ = propertyName;
-    }
-
-    public String getCategoryName ()
-    {
-      return categoryName_;
-    }
-
-    public String getPropertyName ()
-    {
-      return propertyName_;
-    }
-
-  }
-
-
-  /** Returns the categories set up in the Meridio system; these are used by the UI for two
-  * purposes
-  *
-  *              1)      To populate the "SearchCategory"
-  *                              Use "getPROP_title()" on the list of CATEGORIES object in
-  *                              the return ArrayList
-  *              2)  To assist with population of the metadata values to return. The
-  *                      available metadata depends on the chosen category
-  *
-  *@return Sorted array of strings containing the category names
-  */
-  public String [] getMeridioCategories ()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.debug("Entering 'getMeridioCategories' method");
-
-    while (true)
-    {
-      getSession();
-      ArrayList returnCategories = new ArrayList();
-
-      try
-      {
-        CATEGORIES [] categories = meridio_.getCategories().getCATEGORIES();
-        for (int i = 0; i < categories.length; i++)
-        {
-          if (categories[i].getPROP_categoryId() == 4 ||   // Global Document Category
-            categories[i].getPROP_categoryId() == 5 ||   // Mail Message
-          categories[i].getPROP_categoryId() > 100)    // Custom Document Category
-          {
-            if (!categories[i].getPROP_title().equals("<None>"))
-            {
-              Logging.connectors.debug("Adding category <" +
-                categories[i].getPROP_title() + ">");
-              returnCategories.add(categories[i].getPROP_title());
-            }
-          }
-        }
-
-        String [] returnStringArray = new String[returnCategories.size()];
-        Iterator it = returnCategories.iterator();
-        for (int i = 0; it.hasNext(); i++)
-        {
-          returnStringArray[i] = (String) it.next();
-        }
-
-        java.util.Arrays.sort(returnStringArray);
-
-        Logging.connectors.debug("Exiting 'getMeridioCategories' method");
-
-        return returnStringArray;
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" getting categories: "+e.getMessage());
-          }
-          throw new ManifoldCFException("Unknown http error occurred while getting categories: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          if (e.getFaultString().indexOf(" 23031#") != -1)
-          {
-            // This means that the session has expired, so reset it and retry
-            meridio_ = null;
-            continue;
-          }
-        }
-
-        throw new ManifoldCFException("Meridio: Got an unknown remote exception getting categories - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: A Remote Exception occurred while " +
-          "retrieving the Meridio categories: "+remoteException.getMessage(), remoteException);
-      }
-      catch (MeridioDataSetException meridioDataSetException)
-      {
-        throw new ManifoldCFException("Meridio: DataSet Exception occurred retrieving the Meridio categories: "+meridioDataSetException.getMessage(),
-          meridioDataSetException);
-      }
-    }
-  }
-
-
-
-  public String [] getMeridioDocumentProperties ()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.debug("Entering 'getMeridioDocumentProperties' method");
-
-    while (true)
-    {
-      getSession();
-      ArrayList meridioDocumentProperties = new ArrayList();
-
-      try
-      {
-        CATEGORIES [] categories = meridio_.getCategories().getCATEGORIES();
-        PROPERTYDEFS [] propertyDefs = meridio_.getStaticData().getPROPERTYDEFS();
-
-        for (int i = 0; i < propertyDefs.length; i++)
-        {
-          if (propertyDefs[i].getTableName() == null)
-          {
-            continue;
-          }
-
-          if (propertyDefs[i].getTableName().compareTo("DOCUMENTS") == 0)
-          {
-            meridioDocumentProperties.add(propertyDefs[i].getDisplayName());
-          }
-
-          if (   (propertyDefs[i].getCategoryId() == 4 ||   // Global Document Category
-            propertyDefs[i].getCategoryId()  == 5 ||   // Mail Message
-          propertyDefs[i].getCategoryId() > 100) &&  // Custom Category
-          propertyDefs[i].getTableName().compareTo("DOCUMENT_CUSTOMPROPS") == 0)
-          {
-            for (int j = 0; j < categories.length; j++)
-            {
-              if (categories[j].getPROP_categoryId() == propertyDefs[i].getCategoryId())
-              {
-                meridioDocumentProperties.add(categories[j].getPROP_title() + "." +
-                  propertyDefs[i].getDisplayName());
-
-                Logging.connectors.debug("Prop: <" +
-                  categories[j].getPROP_title() + "." +
-                  propertyDefs[i].getDisplayName() + "> Column <" +
-                  propertyDefs[i].getColumnName() + ">");
-
-                break;
-              }
-            }
-          }
-        }
-
-        String [] returnStringArray = new String[meridioDocumentProperties.size()];
-        Iterator it = meridioDocumentProperties.iterator();
-        for (int i = 0; it.hasNext(); i++)
-        {
-          returnStringArray[i] = (String) it.next();
-        }
-
-        java.util.Arrays.sort(returnStringArray);
-        Logging.connectors.debug("Exiting 'getMeridioDocumentProperties' method");
-
-        return returnStringArray;
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" getting document properties: "+e.getMessage());
-          }
-          throw new ManifoldCFException("Unknown http error occurred while getting document properties: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          if (e.getFaultString().indexOf(" 23031#") != -1)
-          {
-            // This means that the session has expired, so reset it and retry
-            meridio_ = null;
-            continue;
-          }
-        }
-
-        throw new ManifoldCFException("Meridio: Got an unknown remote exception getting document properties - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: A Remote Exception occurred while " +
-          "retrieving the Meridio document properties: "+remoteException.getMessage(), remoteException);
-      }
-      catch (MeridioDataSetException meridioDataSetException)
-      {
-        throw new ManifoldCFException("Meridio: DataSet Exception occurred retrieving the Meridio document properties: "+meridioDataSetException.getMessage(),
-          meridioDataSetException);
-      }
-    }
-  }
-
-
-
-  public MeridioClassContents [] getClassOrFolderContents
-  (
-    int classOrFolderId
-  )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.debug("Entering 'getClassOrFolderContents' method");
-
-    while (true)
-    {
-      getSession();
-      ArrayList meridioContainers = new ArrayList();
-
-      try
-      {
-        RMDataSet ds = meridio_.getClassContents(classOrFolderId, false, false, false);
-        if (ds == null)
-        {
-          Logging.connectors.debug("No classes or folders in returned DataSet");
-          return new MeridioClassContents [] {};
-        }
-
-        Rm2vClass [] classes  = ds.getRm2vClass();
-        Rm2vFolder [] folders = ds.getRm2vFolder();
-
-        for (int i = 0; i < classes.length; i++)
-        {
-          if (classes[i].getHomePage() == null ||
-            classes[i].getHomePage().length() == 0) // Not a federated link
-          {
-            MeridioClassContents classContents = new MeridioClassContents();
-
-            classContents.containerType = MeridioClassContents.CLASS;
-            classContents.classOrFolderId = classes[i].getId();
-            classContents.classOrFolderName = classes[i].getName();
-
-            meridioContainers.add(classContents);
-          }
-        }
-
-        for (int i = 0; i < folders.length; i++)
-        {
-          MeridioClassContents classContents = new MeridioClassContents();
-
-          classContents.containerType = MeridioClassContents.FOLDER;
-          classContents.classOrFolderId = folders[i].getId();
-          classContents.classOrFolderName = folders[i].getName();
-
-          meridioContainers.add(classContents);
-        }
-
-        MeridioClassContents [] classArray = new MeridioClassContents[meridioContainers.size()];
-        Iterator it = meridioContainers.iterator();
-        for (int i = 0; it.hasNext(); i++)
-        {
-          classArray[i] = (MeridioClassContents) it.next();
-        }
-        Logging.connectors.debug("Exiting 'getClassOrFolderContents' method");
-
-        return classArray;
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        long currentTime = System.currentTimeMillis();
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" getting class or folder contents: "+e.getMessage());
-          }
-          throw new ManifoldCFException("Unknown http error occurred while getting class or folder contents: "+e.getMessage(),e);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-        {
-          String exceptionName = e.getFaultString();
-          if (exceptionName.equals("java.lang.InterruptedException"))
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-        }
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          if (e.getFaultString().indexOf(" 23031#") != -1)
-          {
-            // This means that the session has expired, so reset it and retry
-            meridio_ = null;
-            continue;
-          }
-        }
-
-        throw new ManifoldCFException("Meridio: Got an unknown remote exception getting class or folder contents - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      }
-      catch (RemoteException remoteException)
-      {
-        throw new ManifoldCFException("Meridio: A Remote Exception occurred while " +
-          "retrieving class or folder contents: "+remoteException.getMessage(), remoteException);
-      }
-      catch (MeridioDataSetException meridioDataSetException)
-      {
-        throw new ManifoldCFException("Meridio: A problem occurred manipulating the Web " +
-          "Service XML: "+meridioDataSetException.getMessage(), meridioDataSetException);
-      }
-    }
-  }
-
-
-  /** Helper class for keeping track of metadata index for each document */
-  protected static class MutableInteger
-  {
-    int value = 0;
-
-    public MutableInteger()
-    {
-    }
-
-    public int getValue()
-    {
-      return value;
-    }
-
-    public void increment()
-    {
-      value++;
-    }
-  }
-
-}
-
-
-
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/Messages.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/Messages.java
deleted file mode 100644
index 52d33a7..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.meridio;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.meridio.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.meridio";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/DMSearchResults.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/DMSearchResults.java
deleted file mode 100644
index f4ae7a3..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/DMSearchResults.java
+++ /dev/null
@@ -1,27 +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 org.apache.manifoldcf.meridio;
-
-import org.apache.manifoldcf.crawler.connectors.meridio.DMDataSet.*;
-
-public class DMSearchResults
-{
-  public DMDataSet dsDM;
-  public int totalHitsCount;
-  public int returnedHitsCount;
-}
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioDataSetException.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioDataSetException.java
deleted file mode 100644
index fc00a82..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioDataSetException.java
+++ /dev/null
@@ -1,38 +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 org.apache.manifoldcf.meridio;
-
-public class MeridioDataSetException extends Exception
-{
-
-  public MeridioDataSetException(Throwable cause)
-  {
-    super(cause);
-  }
-
-  public MeridioDataSetException(String errString, Throwable cause)
-  {
-    super(errString, cause);
-  }
-
-  public MeridioDataSetException(String errString)
-  {
-    super(errString);
-  }
-
-}
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioWrapper.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioWrapper.java
deleted file mode 100644
index 38bbeb3..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioWrapper.java
+++ /dev/null
@@ -1,2531 +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 org.apache.manifoldcf.meridio;
-
-import java.net.*;
-import java.rmi.RemoteException;
-import java.io.*;
-import java.util.*;
-
-import javax.activation.DataHandler;
-import javax.activation.FileDataSource;
-import javax.xml.parsers.*;
-import javax.xml.rpc.Service;
-
-import org.w3c.dom.*;
-import org.w3c.dom.ls.*;
-import org.xml.sax.*;
-import org.apache.xerces.dom.*;
-import org.apache.axis.types.*;
-import org.apache.axis.attachments.AttachmentPart;
-import org.apache.axis.client.Call;
-import org.apache.axis.holders.*;
-import org.apache.axis.message.*;
-import org.apache.log4j.Logger;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axis.EngineConfiguration;
-import org.apache.axis.AxisEngine;
-import org.apache.axis.ConfigurationException;
-import org.apache.axis.Handler;
-import org.apache.axis.WSDDEngineConfiguration;
-import org.apache.axis.components.logger.LogFactory;
-import org.apache.axis.deployment.wsdd.WSDDDeployment;
-import org.apache.axis.deployment.wsdd.WSDDDocument;
-import org.apache.axis.deployment.wsdd.WSDDGlobalConfiguration;
-import org.apache.axis.encoding.TypeMappingRegistry;
-import org.apache.axis.handlers.soap.SOAPService;
-import org.apache.axis.utils.Admin;
-import org.apache.axis.utils.Messages;
-import org.apache.axis.utils.XMLUtils;
-import org.w3c.dom.Document;
-
-import org.exolab.castor.xml.MarshalException;
-import org.exolab.castor.xml.ValidationException;
-
-import org.apache.manifoldcf.crawler.connectors.meridio.DMDataSet.*;
-import com.meridio.www.MeridioDMWS.*;
-//import com.meridio.www.MeridioDMWS.ApplyChangesWTResponseApplyChangesWTResult;
-import com.meridio.www.MeridioDMWS.holders.*;
-
-import org.apache.manifoldcf.crawler.connectors.meridio.RMDataSet.*;
-import com.meridio.www.MeridioRMWS.*;
-import com.meridio.www.MeridioRMWS.ApplyChangesWTResponseApplyChangesWTResult;
-
-import org.tempuri.*;
-import org.tempuri.holders.*;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.HttpHost;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-
-
-public class MeridioWrapper
-{
-
-  public static final String HTTPCLIENT_PROPERTY = "ManifoldCF_HttpClient";
-
-  // Current host name
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (UnknownHostException e)
-    {
-    }
-  }
-
-  // This is the local cache
-  protected long meridioCategoriesTime                    = -1L;
-  protected DMDataSet meridioCategories_                    = null;
-  protected final static long meridioCategoriesExpire     = 300000L;
-
-  protected long meridioStaticDataTime                    = -1L;
-  protected DMDataSet meridioStaticData_                    = null;
-  protected final static long meridioStaticDataExpire     = 300000L;
-
-  // These are the properties that are set in the constructor.  They are kept around so
-  // that we can relogin when necessary.
-  protected EngineConfiguration engineConfiguration               = null;
-  protected Logger oLog                                   = null;
-  protected String clientWorkstation                      = null;
-
-  protected HttpClientConnectionManager dmwsConnectionManager = null;
-  protected HttpClientConnectionManager rmwsConnectionManager = null;
-  protected HttpClientConnectionManager mcwsConnectionManager = null;
-  protected HttpClient dmwsHttpClient = null;
-  protected HttpClient rmwsHttpClient = null;
-  protected HttpClient mcwsHttpClient = null;
-
-  // These are set up during construction of this class.
-  protected MeridioDMSoapStub meridioDMWebService_        = null;
-  protected MeridioRMSoapStub meridioRMWebService_        = null;
-  protected MetaCartaSoapStub meridioMCWS_                = null;
-
-  // This is set up as a result of login.  This MUST NOT be a static because
-  // multiple different connections may be using this same class!!!
-  protected String            loginToken_                 = null;
-
-  public MeridioDMSoapStub getDMWebService ()
-  {
-    return meridioDMWebService_;
-  }
-
-  public MeridioRMSoapStub getRMWebService ()
-  {
-    return meridioRMWebService_;
-  }
-
-  public MetaCartaSoapStub getMCWSWebService ()
-  {
-    return meridioMCWS_;
-  }
-
-  public String getLoginToken ()
-  {
-    return loginToken_;
-  }
-
-  public void clearCache ()
-  {
-    meridioCategories_ = null;
-    meridioStaticData_ = null;
-  }
-
-
-
-  /** The Meridio Wrapper constructor that calls the Meridio login method
-  *
-  *@param log                                     a handle to a Log4j logger
-  *@param meridioDmwsUrl          the URL to the Meridio Document Management Web Service
-  *@param meridioRmwsUrl          the URL to the Meridio Records Management Web Service
-  *@param dmwsProxyHost           the proxy for DMWS, or null if none
-  *@param dmwsProxyPort           the proxy port for DMWS, or -1 if default
-  *@param rmwsProxyHost           the proxy for RMWS, or null if none
-  *@param rmwsProxyPort           the proxy port for RMWS, or -1 if default
-  *@param userName                        the username of the user to log in as, must include the Windows, e.g. domain\\user
-  *@param password                        the password of the user who is logging in
-  *@param clientWorkstation       an identifier for the client workstation, could be the IP address, for auditing purposes
-  *@param protocolFactory         the protocol factory object to use for https communication
-  *@param engineConfigurationFile the engine configuration object to use to communicate with the web services
-  *
-  *@throws RemoteException        if an error is encountered logging into Meridio
-  */
-  public MeridioWrapper
-  (
-    Logger log,
-    URL    meridioDmwsUrl,
-    URL    meridioRmwsUrl,
-    URL    meridioManifoldCFWSUrl,
-    String dmwsProxyHost,
-    String dmwsProxyPort,
-    String rmwsProxyHost,
-    String rmwsProxyPort,
-    String mcwsProxyHost,
-    String mcwsProxyPort,
-    String userName,
-    String password,
-    String clientWorkstation,
-    javax.net.ssl.SSLSocketFactory mySSLFactory,
-    Class resourceClass,
-    String engineConfigurationFile
-  )
-    throws RemoteException, NumberFormatException
-  {
-    // Initialize local instance variables
-    oLog = log;
-    this.engineConfiguration = new ResourceProvider(resourceClass,engineConfigurationFile);
-    this.clientWorkstation = clientWorkstation;
-
-    SSLConnectionSocketFactory myFactory = null;
-    if (mySSLFactory != null)
-    {
-      myFactory = new SSLConnectionSocketFactory(mySSLFactory, new NoopHostnameVerifier());
-    }
-    else
-    {
-      myFactory = SSLConnectionSocketFactory.getSocketFactory();
-    }
-
-    // Set up the pool.
-    // We have a choice: We can either have one httpclient instance, which gets reinitialized for every service
-    // it connects with (because each one has a potentially different proxy setup), OR we can have a different
-    // httpclient for each service.  The latter approach is obviously the more efficient, so I've chosen to do it
-    // that way.
-
-    // Parse the user and password values
-    int index = userName.indexOf("\\");
-    String domainUser;
-    String domain;
-    if (index != -1)
-    {
-      domainUser = userName.substring(index+1);
-      domain = userName.substring(0,index);
-      if (oLog != null && oLog.isDebugEnabled())
-        oLog.debug("Meridio: User is '"+domainUser+"', domain is '"+domain+"'");
-    }
-    else
-    {
-      domain = null;
-      domainUser = userName;
-      if (oLog != null && oLog.isDebugEnabled())
-        oLog.debug("Meridio: User is '"+domainUser+"'; there is no domain specified");
-    }
-
-    if (oLog != null && oLog.isDebugEnabled())
-    {
-      if (password != null && password.length() > 0)
-        oLog.debug("Meridio: Password exists");
-      else
-        oLog.debug("Meridio: Password is null");
-    }
-
-    int socketTimeout = 900000;
-    int connectionTimeout = 300000;
-
-    PoolingHttpClientConnectionManager poolingDmwsConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-    poolingDmwsConnectionManager.setDefaultMaxPerRoute(1);
-    poolingDmwsConnectionManager.setValidateAfterInactivity(2000);
-    poolingDmwsConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-      .setTcpNoDelay(true)
-      .setSoTimeout(socketTimeout)
-      .build());
-    dmwsConnectionManager = poolingDmwsConnectionManager;
-    
-    PoolingHttpClientConnectionManager poolingRmwsConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-    poolingRmwsConnectionManager.setDefaultMaxPerRoute(1);
-    poolingRmwsConnectionManager.setValidateAfterInactivity(2000);
-    poolingRmwsConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-      .setTcpNoDelay(true)
-      .setSoTimeout(socketTimeout)
-      .build());
-    rmwsConnectionManager = poolingRmwsConnectionManager;
-    
-    PoolingHttpClientConnectionManager poolingMcwsConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-    poolingMcwsConnectionManager.setDefaultMaxPerRoute(1);
-    poolingMcwsConnectionManager.setValidateAfterInactivity(2000);
-    poolingMcwsConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-      .setTcpNoDelay(true)
-      .setSoTimeout(socketTimeout)
-      .build());
-    mcwsConnectionManager = poolingMcwsConnectionManager;
-
-    // Initialize the three httpclient objects
-
-    CredentialsProvider dmwsCredentialsProvider = new BasicCredentialsProvider();
-    CredentialsProvider rmwsCredentialsProvider = new BasicCredentialsProvider();
-
-    RequestConfig.Builder dmwsRequestBuilder = RequestConfig.custom()
-      .setCircularRedirectsAllowed(true)
-      .setSocketTimeout(socketTimeout)
-      .setExpectContinueEnabled(false)
-      .setConnectTimeout(connectionTimeout)
-      .setConnectionRequestTimeout(socketTimeout);
-    RequestConfig.Builder rmwsRequestBuilder = RequestConfig.custom()
-      .setCircularRedirectsAllowed(true)
-      .setSocketTimeout(socketTimeout)
-      .setExpectContinueEnabled(true)
-      .setConnectTimeout(connectionTimeout)
-      .setConnectionRequestTimeout(socketTimeout);
-
-    // Set up credentials
-    if (domainUser != null)
-    {
-      dmwsCredentialsProvider.setCredentials(
-        new AuthScope(meridioDmwsUrl.getHost(),meridioDmwsUrl.getPort()),
-        new NTCredentials(domainUser, password, currentHost, domain));
-      rmwsCredentialsProvider.setCredentials(
-        new AuthScope(meridioRmwsUrl.getHost(),meridioRmwsUrl.getPort()),
-        new NTCredentials(domainUser, password, currentHost, domain));
-    }
-    
-    // Initialize DMWS proxy
-    if (dmwsProxyHost != null && dmwsProxyHost.length() > 0)
-    {
-      int port = (dmwsProxyPort == null || dmwsProxyPort.length() == 0)?8080:Integer.parseInt(dmwsProxyPort);
-      // Configure proxy authentication
-      if (domainUser != null && domainUser.length() > 0)
-      {
-        dmwsCredentialsProvider.setCredentials(
-          new AuthScope(dmwsProxyHost, port),
-          new NTCredentials(domainUser, password, currentHost, domain));
-      }
-
-      HttpHost proxy = new HttpHost(dmwsProxyHost, port);
-      dmwsRequestBuilder.setProxy(proxy);
-    }
-
-    // Initialize RMWS proxy
-    if (rmwsProxyHost != null && rmwsProxyHost.length() > 0)
-    {
-      int port = (rmwsProxyPort == null || rmwsProxyPort.length() == 0)?8080:Integer.parseInt(rmwsProxyPort);
-      // Configure proxy authentication
-      if (domainUser != null && domainUser.length() > 0)
-      {
-        rmwsCredentialsProvider.setCredentials(
-          new AuthScope(rmwsProxyHost, port),
-          new NTCredentials(domainUser, password, currentHost, domain));
-      }
-
-      HttpHost proxy = new HttpHost(rmwsProxyHost, port);
-      rmwsRequestBuilder.setProxy(proxy);
-    }
-
-    dmwsHttpClient = HttpClients.custom()
-      .setConnectionManager(dmwsConnectionManager)
-      .disableAutomaticRetries()
-      .setDefaultRequestConfig(dmwsRequestBuilder.build())
-      .setDefaultCredentialsProvider(dmwsCredentialsProvider)
-      .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-      .setRedirectStrategy(new LaxRedirectStrategy())
-      .build();
-    
-    rmwsHttpClient = HttpClients.custom()
-      .setConnectionManager(rmwsConnectionManager)
-      .disableAutomaticRetries()
-      .setDefaultRequestConfig(rmwsRequestBuilder.build())
-      .setDefaultCredentialsProvider(rmwsCredentialsProvider)
-      .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-      .setRedirectStrategy(new LaxRedirectStrategy())
-      .build();
-
-    if (meridioManifoldCFWSUrl != null)
-    {
-      CredentialsProvider mcwsCredentialsProvider = new BasicCredentialsProvider();
-
-      RequestConfig.Builder mcwsRequestBuilder = RequestConfig.custom()
-        .setCircularRedirectsAllowed(true)
-        .setSocketTimeout(socketTimeout)
-        .setExpectContinueEnabled(true)
-        .setConnectTimeout(connectionTimeout)
-        .setConnectionRequestTimeout(socketTimeout);
-
-      if (domainUser != null)
-      {
-        mcwsCredentialsProvider.setCredentials(
-          new AuthScope(meridioManifoldCFWSUrl.getHost(),meridioManifoldCFWSUrl.getPort()),
-          new NTCredentials(domainUser, password, currentHost, domain));
-      }
-
-      // Initialize MCWS proxy
-      if (mcwsProxyHost != null && mcwsProxyHost.length() > 0)
-      {
-        int port = (mcwsProxyPort == null || mcwsProxyPort.length() == 0)?8080:Integer.parseInt(mcwsProxyPort);
-        // Configure proxy authentication
-        if (domainUser != null && domainUser.length() > 0)
-        {
-          mcwsCredentialsProvider.setCredentials(
-            new AuthScope(mcwsProxyHost, port),
-            new NTCredentials(domainUser, password, currentHost, domain));
-        }
-
-        HttpHost proxy = new HttpHost(mcwsProxyHost, port);
-        mcwsRequestBuilder.setProxy(proxy);
-      }
-      
-      mcwsHttpClient = HttpClients.custom()
-        .setConnectionManager(mcwsConnectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(mcwsRequestBuilder.build())
-        .setDefaultCredentialsProvider(mcwsCredentialsProvider)
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new LaxRedirectStrategy())
-        .build();
-    }
-
-    // Set up the stub handles
-    /*=================================================================
-    * Get a handle to the DMWS
-    *================================================================*/
-    MeridioDMLocator meridioDMLocator = new MeridioDMLocator(engineConfiguration);
-    MeridioDMSoapStub meridioDMWebService = new MeridioDMSoapStub(meridioDmwsUrl, meridioDMLocator);
-
-    meridioDMWebService.setPortName(meridioDMLocator.getMeridioDMSoapWSDDServiceName());
-    meridioDMWebService.setUsername(userName);
-    meridioDMWebService.setPassword(password);
-    meridioDMWebService._setProperty( HTTPCLIENT_PROPERTY, dmwsHttpClient);
-
-    meridioDMWebService_ = meridioDMWebService;
-
-    /*=================================================================
-    * Get a handle to the RMWS
-    *================================================================*/
-    MeridioRMLocator meridioRMLocator = new MeridioRMLocator(engineConfiguration);
-    MeridioRMSoapStub meridioRMWebService = new MeridioRMSoapStub(meridioRmwsUrl, meridioRMLocator);
-
-    meridioRMWebService.setPortName(meridioRMLocator.getMeridioRMSoapWSDDServiceName());
-    meridioRMWebService.setUsername(userName);
-    meridioRMWebService.setPassword(password);
-    meridioRMWebService._setProperty( HTTPCLIENT_PROPERTY, rmwsHttpClient);
-
-    meridioRMWebService_ = meridioRMWebService;
-
-    /*=================================================================
-    * Get a handle to the MeridioMetaCarta Web Service
-    *================================================================*/
-    if (meridioManifoldCFWSUrl != null)
-    {
-      MetaCartaLocator meridioMCWS = new MetaCartaLocator(engineConfiguration);
-      Service McWsService = null;
-      MetaCartaSoapStub meridioMetaCartaWebService = new MetaCartaSoapStub(meridioManifoldCFWSUrl, McWsService);
-
-      meridioMetaCartaWebService.setPortName(meridioMCWS.getMetaCartaSoapWSDDServiceName());
-      meridioMetaCartaWebService.setUsername(userName);
-      meridioMetaCartaWebService.setPassword(password);
-      meridioMetaCartaWebService._setProperty( HTTPCLIENT_PROPERTY, mcwsHttpClient );
-      
-      meridioMCWS_ = meridioMetaCartaWebService;
-    }
-
-
-    this.loginUnified();
-  }
-
-
-  /** Checks if login needed, and if so performs a login to Meridio, using integrated Windows NT authentication (NTLM)
-  *
-  *
-  *@throws RemoteException        if an error is encountered locating the web services, or logging in
-  */
-  public void loginUnified
-  (
-    )
-    throws RemoteException
-  {
-    if (loginToken_ == null)
-    {
-      if (oLog != null) oLog.debug("Meridio: Calling Meridio Login Web Service");
-        String loginToken = meridioDMWebService_.loginUnified(clientWorkstation);
-      // String loginToken = meridioDMWebService_.login("Admin","Admin",clientWorkstation);
-      if (oLog != null && oLog.isDebugEnabled())
-        oLog.debug("Meridio: Successfully logged in - Login Token is '" + loginToken + "'");
-
-      loginToken_          = loginToken;
-      if (oLog != null) oLog.debug("Meridio: Exiting login method");
-    }
-  }
-
-
-
-  /** Logs out from Meridio
-  *
-  *@throws RemoteException        if an error is encountered calling the Meridio Web Service logout method
-  */
-  public void logout      ()
-    throws RemoteException
-  {
-    if (loginToken_ != null)
-    {
-      try
-      {
-        if (oLog != null) oLog.debug("Meridio: Logging out of Meridio");
-          meridioDMWebService_.logout(loginToken_);
-        if (oLog != null) oLog.debug("Meridio: Successfully logged out of Meridio");
-      }
-      finally
-      {
-        loginToken_ = null;
-        dmwsConnectionManager.shutdown();
-        dmwsConnectionManager = null;
-        rmwsConnectionManager.shutdown();
-        rmwsConnectionManager = null;
-        mcwsConnectionManager.shutdown();
-        mcwsConnectionManager = null;
-      }
-    }
-  }
-
-  /** Given a user id, find all the groups that it belongs to (including parents of parents)
-  */
-  public GroupResult [] getUsersGroups
-  (
-    int userId
-  )
-    throws RemoteException
-  {
-
-    if (oLog != null) oLog.debug("Meridio: Entered getUsersGroups method.");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-
-        ArrayOfGroupResultHolder groupArray = new  ArrayOfGroupResultHolder();
-        javax.xml.rpc.holders.BooleanHolder boolHolder = new javax.xml.rpc.holders.BooleanHolder();
-
-        meridioMCWS_.getUsersGroups(loginToken_, userId, boolHolder, groupArray);
-
-        if (oLog != null) oLog.debug("Success? <" + boolHolder.value + ">");
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getUsersGroups method");
-
-        if (boolHolder.value)
-        {
-          return groupArray.value;
-        }
-
-        return null;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getUsersGroups method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-  /** This method is a wrapper around the Meridio "GetStaticData" Web Service Method
-  *
-  * The following is the text from the Meridio Web Services Programming Guide
-  *
-  * Returns data that may be considered as static in a typical Meridio system, and that is not
-  * subject to access control. Such data is therefore amenable to caching at Application
-  * scope.
-  *
-  * The method can be used to retrieve all property definitions (fixed and custom) in the
-  * Meridio system, for all Meridio object types supported via the Meridio SOAP API,
-  * independently of the permissions of the session user on the categories holding the
-  * property definitions. Lookups, policies, rendition definitions and system information
-  * (e.g. the name of the target Meridio system) can also be retrieved, depending on the
-  * value of the relevant Boolean input argument.
-  *
-  * The DataTables returned (in the DataSet) are as follows:
-  *
-  * PROPERTYDEFS
-  * LOOKUPS
-  * LOOKUP_VALUES
-  * POLICIES
-  * RENDITIONDEFS
-  * SYSTEMINFO
-  *
-  *@return                   the DM DataSet with the appropriate elements (see above) populated
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMDataSet getStaticData ()
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getStaticData method.");
-
-      long currentTime = System.currentTimeMillis();
-    if (meridioStaticData_ != null && meridioStaticDataTime < currentTime)
-      meridioStaticData_ = null;
-
-    if (meridioStaticData_ == null)
-    {
-      boolean loginTried = false;
-      while (true)
-      {
-        loginUnified();
-        try
-        {
-          GetStaticDataWTResponseGetStaticDataWTResult staticDataResult = null;
-          staticDataResult =
-            meridioDMWebService_.getStaticData(loginToken_, true,
-            true, true, true, true);
-
-          meridioStaticData_ = getDMDataSet(staticDataResult.get_any());
-          meridioStaticDataTime = currentTime + meridioStaticDataExpire;
-          break;
-        }
-        catch (RemoteException e)
-        {
-          if (loginTried == false)
-          {
-            if (oLog != null) oLog.debug("Meridio: Retrying getStaticData method with login.");
-              loginToken_ = null;
-            loginTried = true;
-            continue;
-          }
-          throw e;
-        }
-      }
-    }
-    if (oLog != null) oLog.debug("Meridio: Exiting getStaticData method.");
-      return meridioStaticData_;
-
-  }
-
-
-
-  /** This method is a wrapper around the Meridio "GetConfiguration" RM Web Service Method
-  *
-  * The following is the text from the Meridio Web Services Programming Guide
-  *
-  * Returns a DataSet containing information about all system configuration settings.
-  *
-  * The DataTables returned are as follows:
-  *
-  * Table                Comment
-  * rm2Config    Contains a row for each system configuration setting.
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public RMDataSet getConfiguration       ()
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getConfiguration method.");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetConfigurationResponseGetConfigurationResult configurationResult = null;
-        configurationResult = meridioRMWebService_.getConfiguration();
-
-        RMDataSet ds = getRMDataSet(configurationResult.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getConfiguration method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getConfiguration method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  /** This method is a wrapper around the Meridio "GetPropertyDefs" RM Web Service Method
-  *
-  * The following is the text from the Meridio Web Services Programming Guide
-  *
-  * Returns a DataSet containing information about all fixed property definitions for objects
-  * in the RM Web Service.
-  *
-  * The DataTables returned are as follows:
-  *
-  * Table                        Comment
-  * rm2PropertyDef       Contains a row for each fixed property definition for each object in the
-  *                                      RM Web Service.
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public RMDataSet getPropertyDefs ()
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getPropertyDefs method.");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetPropertyDefsResponseGetPropertyDefsResult configurationResult = null;
-        configurationResult = meridioRMWebService_.getPropertyDefs();
-
-        RMDataSet ds = getRMDataSet(configurationResult.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getPropertyDefs method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getPropertyDefs method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-  /** This method is a wrapper around the Meridio "GetCategories" Web Service Method
-  *
-  * The following is the text from the Meridio Web Services Programming Guide
-  *
-  * Retrieves all categories accessible by the user.
-  *
-  * The DataTables returned are as described in the following table.
-  *
-  * DataTable            Comments
-  * CATEGORIES           contains a row for each category in the system, subject to access control.
-  * CATEGORIES_EXTRA contains a row for each category in the system, subject to access control.
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMDataSet getCategories ()
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getCategories method.");
-
-      long currentTime = System.currentTimeMillis();
-    if (meridioCategories_ != null && meridioCategoriesTime < currentTime)
-      meridioCategories_ = null;
-
-    if (meridioCategories_ == null)
-    {
-      boolean loginTried = false;
-      while (true)
-      {
-        loginUnified();
-        try
-        {
-          GetCategoriesWTResponseGetCategoriesWTResult staticDataResult = null;
-          staticDataResult =
-            meridioDMWebService_.getCategories(loginToken_);
-
-          meridioCategories_ = getDMDataSet(staticDataResult.get_any());
-          meridioCategoriesTime = currentTime + meridioCategoriesExpire;
-          break;
-        }
-        catch (RemoteException e)
-        {
-          if (loginTried == false)
-          {
-            if (oLog != null) oLog.debug("Meridio: Retrying getCategories method with login.");
-              loginToken_ = null;
-            loginTried = true;
-            continue;
-          }
-          throw e;
-        }
-      }
-
-    }
-    if (oLog != null) oLog.debug("Meridio: Exiting getCategories method.");
-      return meridioCategories_;
-  }
-
-
-
-  /** Returns a dataset containing information about the classes or folders within the
-  * class specified by the "classOrFolderId" parameter
-  *
-  * @param classOrFolderId                       the Identifier of the class or folder for which the contents
-  *                                                                      are required. 0 indicated the root of the FilePlan
-  * @param getPropDefs
-  * @param getActivities
-  * @param getCustomProperties
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public RMDataSet getClassContents
-  (
-    int      classOrFolderId,
-    boolean  getPropDefs,
-    boolean  getActivities,
-    boolean  getCustomProperties
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getClassContents method. Class/folder ID <" +
-      classOrFolderId + ">");
-
-    boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetClassContentsWTResponseGetClassContentsWTResult classContents = null;
-        classContents = meridioRMWebService_.getClassContents(loginToken_,
-          classOrFolderId, getPropDefs, getActivities, getCustomProperties);
-
-        RMDataSet ds = getRMDataSet(classContents.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getClassContents method");
-
-          return ds;
-
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getClassContents method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  /** Given a string representing the path to a class or folder within the FilePlan, this
-  * method returns the identifier of the matching class (if any). This method matches
-  * a path from the root of the FilePlan
-  *
-  * @param classOrFolder         is the path to the class or folder to be matched, for example
-  *                          /Finances/Audit, Finances/Audit/, or //Finances///Audit//
-  *                          will all match the class or folder "Audit" that exists in the
-  *                          "Finances" class which is located directly under the root of
-  *                          the FilePlan. The forward-slash "/" must be used.
-  * @return                              an integer representing the class or folder id, or zero if not found
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public int findClassOrFolder
-  (
-    String classOrFolder
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    return this.findClassOrFolder(classOrFolder, 0);
-  }
-
-
-  /** Given a string representing the path to a class or folder within the FilePlan, this
-  * method returns the identifier of the matching class (if any). This method matches
-  * a path from the root of the FilePlan
-  *
-  * @param classOrFolder                 is the path to the class or folder to be matched, for example
-  *                              /Finances/Audit, Finances/Audit/, or //Finances///Audit//
-  * @param startClassOrFolder    the id of the class of folder to start searching at (zero for root)
-  * @return                                      an integer representing the class or folder id, or zero if not found
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public int findClassOrFolder
-  (
-    String classOrFolder,
-    int    startClassOrFolder
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered findClassOrFolder method. Path = <" + classOrFolder + "> " +
-      "Starting class/folder ID <" + startClassOrFolder + ">");
-
-    if (classOrFolder == null)
-    {
-      if (oLog != null) oLog.debug("Meridio: Class/folder path provided is null, so returning top level FilePlan");
-        return 0;
-    }
-
-    String [] classTokens = classOrFolder.split("/");
-
-    if (classTokens.length == 0)
-    {
-      if (oLog != null) oLog.debug("Meridio: No classes in path, so returning top level FilePlan");
-      if (oLog != null) oLog.debug("Meridio: Exiting findClassOrFolder method");
-        return 0;
-    }
-
-    int currentClassOrFolder = startClassOrFolder;
-    boolean isMatchFound     = false;
-    for (int i=0; i<classTokens.length; i++)
-    {
-      if (classTokens[i].length() == 0)
-      {
-        continue;
-      }
-
-      RMDataSet ds = this.getClassContents(currentClassOrFolder,
-        false, false, false);
-
-      Rm2vClass [] classes = ds.getRm2vClass();
-      isMatchFound = false;
-      for (int j=0; j<classes.length; j++)
-      {
-        if (oLog != null && oLog.isDebugEnabled())
-          oLog.debug("Meridio: Comparing [" + classTokens[i] +"] with [" + classes[j].getName() + "]");
-        if (classTokens[i].compareTo(classes[j].getName()) == 0)
-        {
-          currentClassOrFolder = classes[j].getId();
-          isMatchFound = true;
-          break;
-        }
-      }
-      if (!isMatchFound)
-      {
-        /*=============================================================
-        * If we didn't find a match and we are at the last node then
-        * check to see if it is a folder
-        *============================================================*/
-        if (i == classTokens.length - 1)
-        {
-          Rm2vFolder [] folders = ds.getRm2vFolder();
-          for (int j=0; j<folders.length; j++)
-          {
-            if (classTokens[i].compareTo(folders[j].getName()) == 0)
-            {
-              currentClassOrFolder = folders[j].getId();
-              isMatchFound = true;
-              break;
-            }
-          }
-        }
-        else
-        {
-          break;
-        }
-      }
-    }
-
-    if (isMatchFound)
-    {
-      if (oLog != null && oLog.isDebugEnabled())
-        oLog.debug("Meridio: Found match: " + currentClassOrFolder);
-      if (oLog != null) oLog.debug("Meridio: Exiting findClassOrFolder method");
-        return currentClassOrFolder;
-    }
-    else
-    {
-      if (oLog != null) oLog.debug("Meridio: No match found");
-      if (oLog != null) oLog.debug("Meridio: Exiting findClassOrFolder method");
-        return -1;
-    }
-  }
-
-
-  /**
-  * This method is a wrapper around the Meridio "SearchDocuments" Web Service Method
-  *
-  * The following is the text is paraphrased from the Meridio Web Services Programming Guide
-  *
-  *@param searchInfo                                     contains the search definition and may also specify
-  *                                                                      rendition types, containers, keywords and result definitions
-  *                                                              Tables that may be included in searchInfo are:
-  *                                                                              CONTENT_OPS
-  *                                                                              CONTENT_TERMS
-  *                                                                              PROPERTY_OPS
-  *                                                                              PROPERTY_TERMS
-  *                                                                              RESULTDEFS
-  *                                                                              SEARCH_CONTAINERS
-  *                                                                              SEARCH_KEYWORDS
-  *                                                                              SEARCH_RENDITIONDEFS
-  *@param maxHitsToReturn                        controls the maximum number of hits to return on this call
-  *@param startPositionOfHits            controls what position to start from, 1 is the first result
-  *@param permissionFilter                       documents for which the current user's permission is
-  *                                                              lower than permissionFilter will be excluded from the search results
-  *@param searchAll                                      indicates whether the search should return hits on all versions of
-  *                                                              documents or on the latest versions only. If searchAll is true then
-  *                                                              hits on all versions will be returned; if false then hits on the latest
-  *                                                              versions only will be returned
-  *@param scope                                          enditions of the specified type(s) will be included in the search, as long
-  *                                                                      as renditions are included in the search scope
-  *@param useThesaurus                           controls use of word synonyms in content searches
-  *@param searchChildren                         specifies whether subcontainers are searched within any containers
-  *                                                              specified in searchInfo. This argument is ignored if the search is not
-  *                                                              restricted to specific containers.
-  *@param searchKeywordHierarchy         Only documents associated with the specified keywords will be returned,
-  *                                                              depending on the operator used to logically combine them (keywordOperator)
-  *                                                              and whether all keywords under the specified keywords are to be considered
-  *                                                              (searchKeywordHierarchy). However, if no keywords are specified in
-  *                                                              searchInfo then searching will ignore keyword associations.
-  *@param keywordOperator                        see searchKeywordHierarchy
-  *@return                                                       object containing the eturns the total number of hits found in Meridio
-  *                                                                      for the search, the actual number of hits returned by the current
-  *                                                                      search call, and the results of the search.
-  *                                                                      Search results are returned in the SEARCHRESULTS_DOCUMENTS DataTable.
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMSearchResults searchDocuments
-  (
-    DMDataSet searchInfo,
-    int maxHitsToReturn,
-    int startPositionOfHits,
-    DmPermission permissionFilter,
-    boolean searchAll,
-    DmSearchScope scope,
-    boolean useThesaurus,
-    boolean searchChildren,
-    boolean searchKeywordHierarchy,
-    DmLogicalOp keywordOperator
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null && oLog.isDebugEnabled())
-      oLog.debug("Meridio: Entering searchDocuments method\n" +
-      "\tMax Hits to Return <" + maxHitsToReturn + "> " +
-      "\tStart Position <" + startPositionOfHits + "> " +
-      "\tPermission Folder <" + permissionFilter + "> " +
-      "\tSearch All <" + searchAll + "> " +
-      "\tSearch Scope <" + scope + "> " +
-      "\tUse Thesaurus <" + useThesaurus + "> " +
-      "\tSearch Children <" + searchChildren + "> " +
-      "\tSearch Keyword Hierarchy <" + searchKeywordHierarchy + "> " +
-      "\tKeyword Operator <" + keywordOperator + ">");
-
-    boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-
-        UnsignedIntHolder totalHitsCount    = new UnsignedIntHolder();
-        UnsignedIntHolder returnedHitsCount = new UnsignedIntHolder();
-        SearchDocumentsWTSearchInfo searchDocumentsInfo = new SearchDocumentsWTSearchInfo();
-        SearchDocumentsWTResponseSearchDocumentsWTResultHolder searchDocumentsWTResult =
-          new SearchDocumentsWTResponseSearchDocumentsWTResultHolder();
-
-        searchDocumentsInfo.set_any(getSOAPMessage(searchInfo));
-
-        meridioDMWebService_.searchDocuments(loginToken_, searchDocumentsInfo,
-          new UnsignedInt(maxHitsToReturn), new UnsignedInt(startPositionOfHits),
-          permissionFilter, searchAll, scope, useThesaurus, searchChildren,
-          searchKeywordHierarchy, keywordOperator, searchDocumentsWTResult,
-          totalHitsCount, returnedHitsCount);
-
-        DMSearchResults dsDMSearchResults = new DMSearchResults();
-        dsDMSearchResults.dsDM = getDMDataSet(searchDocumentsWTResult.value.get_any());
-        dsDMSearchResults.returnedHitsCount = returnedHitsCount.value.intValue();
-        dsDMSearchResults.totalHitsCount = totalHitsCount.value.intValue();
-
-        if (oLog != null && oLog.isDebugEnabled())
-          oLog.debug("Meridio: Returned Hits <" + dsDMSearchResults.returnedHitsCount + "> " +
-          "Total Hits <" + dsDMSearchResults.totalHitsCount +">");
-
-        if (oLog != null) oLog.debug("Meridio: Exiting searchDocuments method.");
-
-          return dsDMSearchResults;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying searchDocuments method with login.");
-
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-  /**
-  * This method is a wrapper around the Meridio "SearchRecords" Web Service Method
-  *
-  * @see SearchDocuments DMDataSet searchInfo, int maxHitsToReturn, int startPositionOfHits,     DmPermission permissionFilter,
-  boolean searchAll, DmSearchScope scope, boolean useThesaurus, boolean searchChildren,
-    boolean searchKeywordHierarchy, DmLogicalOp keywordOperator
-  */
-  public DMSearchResults searchRecords
-  (
-    DMDataSet searchInfo,
-    int maxHitsToReturn,
-    int startPositionOfHits,
-    DmPermission permissionFilter,
-    boolean searchAll,
-    DmSearchScope scope,
-    boolean useThesaurus,
-    boolean searchChildren,
-    boolean searchKeywordHierarchy,
-    DmLogicalOp keywordOperator
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null && oLog.isDebugEnabled())
-      oLog.debug("Meridio: Entering searchRecords method\n" +
-      "\n\tMax Hits to Return <" + maxHitsToReturn + "> " +
-      "\n\tStart Position <" + startPositionOfHits + "> " +
-      "\n\tPermission Folder <" + permissionFilter + "> " +
-      "\n\tSearch All <" + searchAll + "> " +
-      "\n\tSearch Scope <" + scope + "> " +
-      "\n\tUse Thesaurus <" + useThesaurus + "> " +
-      "\n\tSearch Children <" + searchChildren + "> " +
-      "\n\tSearch Keyword Hierarchy <" + searchKeywordHierarchy + "> " +
-      "\n\tKeyword Operator <" + keywordOperator + ">");
-
-    boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        UnsignedIntHolder totalHitsCount    = new UnsignedIntHolder();
-        UnsignedIntHolder returnedHitsCount = new UnsignedIntHolder();
-        SearchRecordsWTSearchInfo searchDocumentsInfo = new SearchRecordsWTSearchInfo();
-        SearchRecordsWTResponseSearchRecordsWTResultHolder searchRecordsWTResult =
-          new SearchRecordsWTResponseSearchRecordsWTResultHolder();
-
-        searchDocumentsInfo.set_any(getSOAPMessage(searchInfo));
-
-        meridioDMWebService_.searchRecords(loginToken_, searchDocumentsInfo,
-          new UnsignedInt(maxHitsToReturn), new UnsignedInt(startPositionOfHits),
-          permissionFilter, searchAll, scope, useThesaurus, searchChildren,
-          searchKeywordHierarchy, keywordOperator, searchRecordsWTResult,
-          totalHitsCount, returnedHitsCount);
-
-        DMSearchResults dsDMSearchResults = new DMSearchResults();
-        dsDMSearchResults.dsDM = getDMDataSet(searchRecordsWTResult.value.get_any());
-        dsDMSearchResults.returnedHitsCount = returnedHitsCount.value.intValue();
-        dsDMSearchResults.totalHitsCount = totalHitsCount.value.intValue();
-
-        if (oLog != null) oLog.debug("Meridio: Exiting searchRecords method.");
-
-          return dsDMSearchResults;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying searchRecords method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  /**
-  * This method is a wrapper around the Meridio "SearchUsers" Web Service Method
-  *
-  *@param  searchInfo  contains the search definition and may also specify groups
-  *                    and result definitions. See "Search Expressions" on page 23 for an overview of how a
-  *                    search expression can be recorded in searchInfo.
-  *
-  *                    Only groups that belong to the groups specified in searchInfo will be included in
-  *                    the search results. However, if no groups are specified in searchInfo then
-  *                    searching will not be restricted to any specific groups, and will instead take place
-  *                    across all groups in the Meridio system.
-  *
-  *                    The result definitions specified by searchInfo will be applied when returning
-  *                    property search results.
-  *
-  *@param maxHitsToReturn      maxHitsToReturn may be NULL in which case the default limit is 100 hits.
-  *@param startPositionOfHits  may be NULL in which case the default start position is 1.
-  *@param searchChildren       specifies whether subgroups are searched within any groups specified in searchInfo.
-  *                            This argument is ignored if the search is not restricted to specific groups.
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMSearchResults searchUsers
-  (
-    DMDataSet searchInfo,
-    int maxHitsToReturn,
-    int startPositionOfHits,
-    boolean searchChildren
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null && oLog.isDebugEnabled())
-      oLog.debug("Meridio: Entering searchUsers method\n" +
-      "\n\tMax Hits to Return <" + maxHitsToReturn + "> " +
-      "\n\tStart Position <" + startPositionOfHits + "> " +
-      "\n\tSearch Children <" + searchChildren + ">");
-
-    boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        UnsignedIntHolder totalHitsCount    = new UnsignedIntHolder();
-        UnsignedIntHolder returnedHitsCount = new UnsignedIntHolder();
-        SearchUsersWTSearchInfo searchUsersInfo = new SearchUsersWTSearchInfo();
-        SearchUsersWTResponseSearchUsersWTResultHolder searchUsersWTResult =
-          new SearchUsersWTResponseSearchUsersWTResultHolder();
-
-        searchUsersInfo.set_any(getSOAPMessage(searchInfo));
-
-        meridioDMWebService_.searchUsers(loginToken_, searchUsersInfo,
-          new UnsignedInt(maxHitsToReturn), new UnsignedInt(startPositionOfHits),
-          searchChildren, searchUsersWTResult, totalHitsCount, returnedHitsCount);
-
-        DMSearchResults dsDMSearchResults = new DMSearchResults();
-        dsDMSearchResults.dsDM = getDMDataSet(searchUsersWTResult.value.get_any());
-        dsDMSearchResults.returnedHitsCount = returnedHitsCount.value.intValue();
-        dsDMSearchResults.totalHitsCount = totalHitsCount.value.intValue();
-
-        if (oLog != null) oLog.debug("Meridio: Exiting searchUsers method.");
-
-          return dsDMSearchResults;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying searchUsers method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  public long getUserIdFromName
-  (
-    String userName
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null && oLog.isDebugEnabled())
-      oLog.debug("Meridio: Entering getUserIdFromName method\n" +
-      "User name is <" + userName + ">");
-
-    //=============================================================
-    // Create the search criteria to determine the user id
-    //
-    // Create a dataset and a property terms row (search for
-    // user properties
-    //=============================================================
-    DMDataSet dsSearchCriteria = new DMDataSet();
-    PROPERTY_TERMS drUserSearch = new PROPERTY_TERMS();
-
-    //=============================================================
-    // Populate the property row with the search criteria
-    //
-    // Find the user that matches based on their name
-    //=============================================================
-    drUserSearch.setId(1);
-    drUserSearch.setTermType(new Short("0").shortValue());          // STRING
-    drUserSearch.setPropertyName("PROP_loginName");
-    drUserSearch.setStr_relation(new Short("0").shortValue());      // IS
-    drUserSearch.setStr_value(userName);
-    drUserSearch.setParentId(1);
-    dsSearchCriteria.addPROPERTY_TERMS(drUserSearch);
-
-    //=============================================================
-    // Only return the user account if it is enabled
-    //=============================================================
-    PROPERTY_TERMS drUserEnabled = new PROPERTY_TERMS();
-    drUserEnabled.setId(2);
-    drUserEnabled.setTermType(new Short("1").shortValue());         // NUMBER
-    drUserEnabled.setPropertyName("PROP_enabled");
-    drUserEnabled.setNum_relation(new Short("0").shortValue());     // EQUAL
-    drUserEnabled.setNum_value(1);
-    drUserEnabled.setParentId(1);
-    dsSearchCriteria.addPROPERTY_TERMS(drUserEnabled);
-
-    //=============================================================
-    // 'AND' the two terms together
-    //=============================================================
-    PROPERTY_OPS drPropertyOps = new PROPERTY_OPS();
-    drPropertyOps.setId(1);
-    drPropertyOps.setOperator(new Short("0").shortValue());   //AND
-    dsSearchCriteria.addPROPERTY_OPS(drPropertyOps);
-
-    //=============================================================
-    // Create the result definitions criteria: just the user ID is
-    // required
-    //=============================================================
-    RESULTDEFS drResultDefs = new RESULTDEFS();
-    drResultDefs.setPropertyName("PROP_id");
-    drResultDefs.setIsVersionProperty(false);
-    dsSearchCriteria.addRESULTDEFS(drResultDefs);
-
-    DMSearchResults dsSearchResults = null;
-    dsSearchResults = this.searchUsers(dsSearchCriteria, 1, 1, false);
-
-    long rval;
-
-    if (dsSearchResults.totalHitsCount != 1 ||
-      null == dsSearchResults.dsDM)
-    rval = 0L;
-    else
-      rval = dsSearchResults.dsDM.getSEARCHRESULTS_USERS()[0].getUserId();
-
-    if (oLog != null) oLog.debug("Meridio: Exiting searchUsers method.");
-
-      return rval;
-  }
-
-
-
-  public RMDataSet getRolesAndMembership ()
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getRolesAndMembership method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetRolesAndMembershipWTResponseGetRolesAndMembershipWTResult rolesAndMembershipResult = null;
-        rolesAndMembershipResult = meridioRMWebService_.getRolesAndMembership(loginToken_);
-
-        RMDataSet ds = getRMDataSet(rolesAndMembershipResult.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getRolesAndMembership method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getRolesAndMembership method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-
-  }
-
-
-
-  public RMDataSet getProtectiveMarkingList
-  (
-    int id,
-    int objectType
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getProtectiveMarkingList method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetProtectiveMarkingListWTResponseGetProtectiveMarkingListWTResult getProtectiveMarkingList = null;
-        getProtectiveMarkingList = meridioRMWebService_.getProtectiveMarkingList(loginToken_,
-          id, objectType);
-
-        RMDataSet ds = getRMDataSet(getProtectiveMarkingList.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getProtectiveMarkingList method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getProtectiveMarkingList method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  public RMDataSet getUserPrivilegeList
-  (
-    int userId
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getUserPrivilegeList method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetUserPrivilegeListWTResponseGetUserPrivilegeListWTResult getUserPrivilegeList = null;
-        getUserPrivilegeList = meridioRMWebService_.getUserPrivilegeList(loginToken_, userId);
-
-        RMDataSet ds = getRMDataSet(getUserPrivilegeList.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getUserPrivilegeList method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getUserPrivilegeList method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  public RMDataSet getRecord
-  (
-    int recordId,
-    boolean getPropDefs,
-    boolean getActivities,
-    boolean getCustomProperties
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getRecord method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetRecordWTResponseGetRecordWTResult getRecord = null;
-        getRecord = meridioRMWebService_.getRecord(loginToken_, recordId,
-          getPropDefs, getActivities, getCustomProperties);
-
-        RMDataSet ds = getRMDataSet(getRecord.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getRecord method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getRecord method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-  public RMDataSet getFolder
-  (
-    int folderId,
-    boolean getPropDefs,
-    boolean getActivities,
-    boolean getContents,
-    boolean getCustomProperties
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getFolder method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetFolderWTResponseGetFolderWTResult getFolder = null;
-        getFolder = meridioRMWebService_.getFolder(loginToken_, folderId,
-          getPropDefs, getActivities, getContents, getCustomProperties);
-
-        RMDataSet ds = getRMDataSet(getFolder.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getFolder method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getFolder method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  /**
-  * This method is a wrapper around the Meridio "GetUsersData" Web Service Method
-  *
-  * The following table shows which results are populated in the return result
-  * if they are set to "true"
-  *
-  * ACCESSCONTROL        getCanDo    (also controls retrieval of activity information for
-  *                                                              requested groups, containers, stored searches and
-  *                                                              locked documents)
-  * CONTAINERS                   getSharedContainers
-  * DOCUMENT_CUSTOMPROPS getLockedDocuments
-  * GROUP_CUSTOMPROPS    getGroupList
-  * USER_CUSTOMPROPS     getPropList
-  * DOCUMENTS                    getLockedDocuments
-  * GROUPS                               getGroupList
-  * STOREDSEARCHES               getStoredSearches
-  * USERS                                getPropList
-  *
-  *@param userId         Retrieves data relating to the user specified by the userId argument.
-  *                                      The data retrieved can be selected by supplying a true value for those
-  *                                      Boolean arguments in which the caller is interested
-  *@param getPropList
-  *@param getCanDo
-  *@param getGroups  if true then the returned groups are only those of which the specified user
-  *                                      is a direct member, i.e. they do not include groups of which the user is
-  *                                      indirectly a member by virtue of the user's membership of an intermediate subgroup
-  *@param getSharedContainers returns the user's shared containers (if any)
-  *@param getStoredSearches      getLockedDocuments and getStoredSearches arguments control retrieval
-  *                                                      of the specified user's (userId) locked documents and stored searches.
-  *                                                      Only documents or stored searches to which the current session user has
-  *                                                      access are returned when the getLockedDocuments or getStoredSearches
-  *                                                      arguments are true.
-  *@param getLockedDocuments see getStoredSearches
-  *
-  *
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMDataSet getUserData
-  (
-    long userId,
-    boolean getPropList,
-    boolean getCanDo,
-    boolean getGroups,
-    boolean getSharedContainers,
-    boolean getStoredSearches,
-    boolean getLockedDocuments
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null && oLog.isDebugEnabled())
-      oLog.debug("Meridio: Entering getUserData method\n" +
-      "\n\tUser Identifier <" + userId + "> " +
-      "\n\tGet Property List <" + getPropList + "> " +
-      "\n\tGet Can Do <" + getCanDo + "> " +
-      "\n\tGet Groups <" + getGroups + "> " +
-      "\n\tGet Shared Containers <" + getSharedContainers + ">" +
-      "\n\tSet Stored Searches <" + getStoredSearches + "> " +
-      "\n\tGet Locked Documents <" + getLockedDocuments + ">");
-
-    boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetUserDataWTResponseGetUserDataWTResult userData = null;
-
-        userData = meridioDMWebService_.getUserData(loginToken_, new UnsignedInt(userId),
-          getPropList, getCanDo, getGroups, getSharedContainers, getStoredSearches, getLockedDocuments);
-
-        DMDataSet dmDS = getDMDataSet(userData.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getUserData method.");
-
-          return dmDS;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getUserData method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  /**
-  * This method is a wrapper around the Meridio "GetDocumentData" Web Service Method
-  *
-  * Retrieves data relating to a specified document. The data retrieved can be selected by
-  * supplying a true value for those Boolean arguments in which the caller is interested.
-  * Similarly, if getVersions is ALL then all versions of the specified document will be
-  *
-  * DataTable                            Controlling flag
-  * ACCESSCONTROL                        getAcl (ACL of document docId only)
-  * ACTIVITIES                           getCanDo (also controls retrieval of activity information for requested policy,
-  *                                                                              lock, keywords and referencing containers)
-  * CONTAINERS                           getReferencingContainers
-  * CONTAINER_DOCUMENTREFS       getReferencingContainers
-  * CONTAINER_CUSTOMPROPS        getReferencingContainers
-  * DOCUMENT_CUSTOMPROPS         getPropList
-  * DOCUMENT_POLICIES            getPolicy
-  * DOCUMENT_REFERENCEPATHS      getReferencePaths
-  * LOCK_CUSTOMPROPS             getLockInfo
-  * VERSION_CUSTOMPROPS          getVersions
-  * DOCUMENTS                            getPropList
-  * DOCUMENT_KEYWORDS            getKeywords
-  * GROUPS                                       getAcl
-  * KEYWORDS                             getKeywords
-  * LOCKS                                        getLockInfo
-  * USERS                                        getAcl
-  * VERSIONS                             getVersions
-  *
-  *@return                                                       Meridio DMDataSet with elements populated as per controlling flags
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMDataSet getDocumentData
-  (
-    int docId,
-    boolean getPropList,
-    boolean getAcl,
-    boolean getCanDo,
-    boolean getPolicy,
-    DmVersionInfo getVersions,
-    boolean getKeywords,
-    boolean getReferencingContainers,
-    boolean getLockInfo
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-
-    if (oLog != null) oLog.debug("Meridio: Entered getDocumentData method.");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetDocumentDataWTResponseGetDocumentDataWTResult getDocumentResponse = null;
-
-        getDocumentResponse = meridioDMWebService_.getDocumentData(loginToken_, new UnsignedInt(docId),
-          getPropList, getAcl, getCanDo, getPolicy, getVersions, getKeywords,
-          getReferencingContainers, getLockInfo);
-
-        DMDataSet ds = getDMDataSet(getDocumentResponse.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getDocumentData method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getDocumentData method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-  /**
-  * This method is a wrapper around the Meridio "GetContainerData" Web Service Method
-  *
-  * Retrieves data relating to a specified container. The data retrieved can be selected by supplying
-  * a true value for those arguments in which the caller is interested. The DataTables returned are
-  * as described below.
-  *
-  * DataTable                                            Controlling flag
-  * ACCESSCONTROL                                        getAcl
-  *                                                                      (ACL of container containerId only)
-  * ACTIVITIES                                           getCanDo
-  *                                                                      (also controls retrieval of activity information for
-  *                                                                      requested references, child containers, keywords and
-  *                                                                      referencing containers)
-  * CONTAINERS                                           getPropList
-  *                                                                      getContainerRefs
-  *                                                                      getReferencingContainers
-  * CONTAINER_CHILDCONTAINERS            getChildContainers
-  *                                                                      (always includes specified container's parent)
-  * CONTAINER_CONTAINERREFS                      getContainerRefs
-  *                                                                      (includes containers referenced by specified container)
-  *                                                                      getReferencingContainers
-  *                                                                      (includes containers that specified container is referenced by)
-  * CONTAINER_DOCUMENTREFS                       getDocumentRefs
-  * CONTAINER_STOREDSEARCHREFS           getStoredSearchRefs
-  * CONTAINER_CUSTOMPROPS                        getPropList
-  *                                                                      getChildContainers
-  *                                                                      getContainerRefs
-  *                                                                      getReferencingContainers
-  * CONTAINER_KEYWORDS                           getKeywords
-  * DOCUMENT_CUSTOMPROPS                         getDocumentRefs
-  * DOCUMENTS                                            getDocumentRefs
-  * GROUPS                                                       getAcl
-  * KEYWORDS                                             getKeywords
-  * STOREDSEARCHES                                       getStoredSearchRefs
-  * USERS                                                        getAcl
-  *
-  *@return                                                       Meridio DMDataSet with elements populated as per controlling flags
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public DMDataSet getContainerData
-  (
-    int containerId,
-    boolean getPropList,
-    boolean getAcl,
-    boolean getCanDo,
-    boolean getChildContainers,
-    boolean getContainerRefs,
-    boolean getDocumentRefs,
-    boolean getStoredSearchRefs,
-    boolean getKeywords,
-    boolean getReferencingContainers
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-
-    if (oLog != null) oLog.debug("Meridio: Entered getContainerData method.");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetContainerDataWTResponseGetContainerDataWTResult getContainerDataResponse = null;
-
-        getContainerDataResponse = meridioDMWebService_.getContainerData(loginToken_, new UnsignedInt(containerId),
-          getPropList, getAcl, getCanDo, getChildContainers, getContainerRefs, getDocumentRefs,
-          getStoredSearchRefs, getKeywords, getReferencingContainers);
-
-        DMDataSet ds = getDMDataSet(getContainerDataResponse.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getContainerData method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getContainerData method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-
-
-
-  /**
-  * This method is a wrapper around the Meridio "GetLatestVersionFile" Web Service Method
-  *
-  * These methods retrieve a copy of a the latest version of a file that is stored in Meridio.
-  *@param  docId                     the identifier of the document for the version file to return
-  *@return                                                       An attachment part object, containing the version file
-  *
-  *@throws RemoteException                       if an error is encountered call the Meridio web service method(s)
-  *@throws MeridioDataSetException       if an error is encountered manipulating the Meridio DataSet
-  */
-  public AttachmentPart getLatestVersionFile
-  (
-    int docId
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-
-    if (oLog != null) oLog.debug("Meridio: Entered getLatestVersionFile method.");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        String mimeType = null;
-
-        meridioDMWebService_._setProperty(
-          Call.ATTACHMENT_ENCAPSULATION_FORMAT,
-          Call.ATTACHMENT_ENCAPSULATION_FORMAT_DIME);
-
-        mimeType = meridioDMWebService_.getLatestVersionFile
-        (loginToken_, new UnsignedInt(docId));
-
-        Object [] attachments = meridioDMWebService_.getAttachments();
-        if (oLog != null && oLog.isDebugEnabled())
-          oLog.debug("Meridio: Mime Type is: <" + mimeType + "> - " + attachments.length + " attachment(s)");
-
-        if (attachments.length != 1)  // There should be exactly 1 attachment
-        {
-          if (oLog != null) oLog.debug("Meridio: Exiting getLatestVersionFile method with null.");
-            return null;
-        }
-
-        AttachmentPart ap = (AttachmentPart) attachments[0];
-        if (oLog != null && oLog.isDebugEnabled())
-          oLog.debug("Meridio: Temp File is <" + ap.getAttachmentFile() + ">");
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getLatestVersionFile method.");
-          return ap;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getLatestVersionFile method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-  public RMDataSet getRecordPartList
-  (
-    int recordId,
-    boolean getPropDefs,
-    boolean getActivities
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getRecordPartList method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetRecordPartListWTResponseGetRecordPartListWTResult getRecordPartList = null;
-        getRecordPartList = meridioRMWebService_.getRecordPartList(loginToken_, recordId,
-          getPropDefs, getActivities);
-
-        RMDataSet ds = getRMDataSet(getRecordPartList.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getRecordPartList method.");
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getRecordPartList method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-  public RMDataSet getDocumentPartList
-  (
-    int documentId
-  )
-    throws RemoteException, MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entering getDocumentPartList method");
-
-      boolean loginTried = false;
-    while (true)
-    {
-      loginUnified();
-      try
-      {
-        GetDocumentPartListWTResponseGetDocumentPartListWTResult getDocumentPartList = null;
-        getDocumentPartList = meridioRMWebService_.getDocumentPartList(loginToken_, documentId);
-
-        RMDataSet ds = getRMDataSet(getDocumentPartList.get_any());
-
-        if (oLog != null) oLog.debug("Meridio: Exiting getDocumentPartList method.");
-
-          return ds;
-      }
-      catch (RemoteException e)
-      {
-        if (loginTried == false)
-        {
-          if (oLog != null) oLog.debug("Meridio: Retrying getDocumentPartList method with login.");
-            loginToken_ = null;
-          loginTried = true;
-          continue;
-        }
-        throw e;
-      }
-    }
-  }
-
-  /** Given the SOAP response received by AXIS on the successful call to a Meridio
-  * Web Service, this helper method returns a castor DMDataSet object which represents
-  * the XML
-  *
-  * This makes it much easier to subsequently manipulate the data that has been
-  * returned from the web service, and ensures that the Meridio wrapper implementation
-  * is as close to native .NET code as we can get.
-  */
-  protected DMDataSet getDMDataSet
-  (
-    MessageElement [] messageElement
-  )
-    throws MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getDMDataSet method.");
-
-      try
-    {
-      if (messageElement.length != 2)
-      {
-        if (oLog != null) oLog.warn("Meridio: SOAP Message not of expected length");
-        if (oLog != null) oLog.debug("Meridio: Exiting getDMDataSet method with null.");
-          return null;
-      }
-
-      /*
-      for (int i = 0; i < messageElement.length; i++)
-      {
-        oLog.debug("Meridio: Message Part: " + i + " " + messageElement[i]);
-      }
-      */
-
-
-      Document document         = messageElement[1].getAsDocument();
-      NodeList nl               = document.getElementsByTagName("DMDataSet");
-
-
-      NodeList errors           = document.getElementsByTagName("diffgr:errors");
-      if (errors.getLength() != 0)
-      {
-        String errorXML = "";
-
-        if (oLog != null) oLog.error("Found <" + errors.getLength() + "> errors in returned data set");
-        for (int i = 0; i < errors.getLength(); i++)
-        {
-
-          Element e                 = (Element) errors.item(i);
-
-          Document resultDocument   = new DocumentImpl();
-          Node node                 = resultDocument.importNode(e, true);
-
-          resultDocument.appendChild(node);
-
-          DOMImplementation domImpl = DOMImplementationImpl.getDOMImplementation();
-          DOMImplementationLS implLS = (DOMImplementationLS) domImpl;
-          LSSerializer writer = implLS.createLSSerializer();
-          errorXML += writer.writeToString(resultDocument) + "\n";
-
-          if (oLog != null) oLog.warn("..." + errorXML);
-        }
-        throw new MeridioDataSetException(errorXML);
-      }
-
-
-      if (nl.getLength() != 1)
-      {
-        if (oLog != null) oLog.warn("Meridio: Returning null - could not find DMDataSet in SOAP Message");
-        if (oLog != null) oLog.debug("Meridio: Exiting getDMDataSet method with null.");
-          return null;
-      }
-
-      Element e                 = (Element) nl.item(0);
-      Document resultDocument   = new DocumentImpl();
-      Node node                 = resultDocument.importNode(e, true);
-
-      resultDocument.appendChild(node);
-
-      DOMImplementation domImpl = DOMImplementationImpl.getDOMImplementation();
-      DOMImplementationLS implLS = (DOMImplementationLS) domImpl;
-      LSSerializer writer = implLS.createLSSerializer();
-      String documentXML = writer.writeToString(resultDocument);
-
-      //oLog.debug("Meridio: Result: " + documentXML);
-
-      StringReader sr = new StringReader(documentXML);
-      DMDataSet dsDM  = new DMDataSet();
-      dsDM            = DMDataSet.unmarshal(sr);
-
-      if (oLog != null) oLog.debug("Meridio: Exiting getDMDataSet method.");
-
-        return dsDM;
-    }
-    catch (ClassNotFoundException classNotFoundException)
-    {
-      throw new MeridioDataSetException(
-        "Could not find the DOM Parser class when unmarshalling the Meridio Dataset",
-        classNotFoundException);
-    }
-    catch (InstantiationException instantiationException)
-    {
-      throw new MeridioDataSetException(
-        "Error instantiating the DOM Parser when unmarshalling the Meridio Dataset",
-        instantiationException);
-    }
-    catch (IllegalAccessException illegalAccessException)
-    {
-      throw new MeridioDataSetException(
-        "DOM Parser illegal access when unmarshalling the Meridio Dataset",
-        illegalAccessException);
-    }
-    catch (MarshalException marshalException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in marshalling the XML from the Meridio Dataset",
-        marshalException);
-    }
-    catch (ValidationException validationException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in validating the XML from the Meridio Dataset",
-        validationException);
-    }
-    catch (Exception ex) // from messageElement[1].getAsDocument();
-    {
-      throw new MeridioDataSetException(
-        "Error retrieving the XML Document from the Web Service response",
-        ex);
-    }
-  }
-
-
-
-  /** Given the SOAP response received by AXIS on the successful call to a Meridio
-  * Web Service, this helper method returns a castor RMDataSet object which represents
-  * the XML
-  *
-  * This makes it much easier to subsequently manipulate the data that has been
-  * returned from the web service, and ensures that the Meridio wrapper implementation
-  * is as close to native .NET code as we can get.
-  */
-  protected RMDataSet getRMDataSet
-  (
-    MessageElement [] messageElement
-  )
-    throws MeridioDataSetException
-  {
-    if (oLog != null) oLog.debug("Meridio: Entered getRMDataSet method.");
-
-      try
-    {
-      if (messageElement.length != 2)
-      {
-        if (oLog != null) oLog.warn("Meridio: SOAP Message not of expected length");
-        if (oLog != null) oLog.debug("Meridio: Exiting getRMDataSet method with null.");
-          return null;
-      }
-
-      /*
-      for (int i = 0; i < messageElement.length; i++)
-      {
-        oLog.debug("Meridio: Message Part: " + i + " " + messageElement[i]);
-      }
-      */
-
-      Document document         = messageElement[1].getAsDocument();
-      NodeList nl               = document.getElementsByTagName("RMDataSet");
-
-
-      NodeList errors           = document.getElementsByTagName("diffgr:errors");
-      if (errors.getLength() != 0)
-      {
-        String errorXML = "";
-
-        if (oLog != null) oLog.error("Found <" + errors.getLength() + "> errors in returned data set");
-        for (int i = 0; i < errors.getLength(); i++)
-        {
-
-          Element e                 = (Element) errors.item(i);
-
-          Document resultDocument   = new DocumentImpl();
-          Node node                 = resultDocument.importNode(e, true);
-
-          resultDocument.appendChild(node);
-
-          DOMImplementation domImpl = DOMImplementationImpl.getDOMImplementation();
-          DOMImplementationLS implLS = (DOMImplementationLS) domImpl;
-          LSSerializer writer = implLS.createLSSerializer();
-          errorXML += writer.writeToString(resultDocument) + "\n";
-
-          if (oLog != null) oLog.warn("..." + errorXML);
-        }
-        throw new MeridioDataSetException(errorXML);
-      }
-
-
-      if (nl.getLength() != 1)
-      {
-        if (oLog != null) oLog.warn("Meridio: Returning null - could not find RMDataSet in SOAP Message");
-        if (oLog != null) oLog.debug("Meridio: Exiting getRMDataSet method with null.");
-          return null;
-      }
-
-      Element e                 = (Element) nl.item(0);
-      Document resultDocument   = new DocumentImpl();
-      Node node                 = resultDocument.importNode(e, true);
-
-      resultDocument.appendChild(node);
-
-      DOMImplementation domImpl = DOMImplementationImpl.getDOMImplementation();
-      DOMImplementationLS implLS = (DOMImplementationLS) domImpl;
-      LSSerializer writer = implLS.createLSSerializer();
-      String documentXML = writer.writeToString(resultDocument);
-
-      StringReader sr = new StringReader(documentXML);
-      RMDataSet dsRM  = new RMDataSet();
-      dsRM            = RMDataSet.unmarshal(sr);
-      if (oLog != null) oLog.debug("Meridio: Exiting getRMDataSet method.");
-        return dsRM;
-    }
-    catch (ClassNotFoundException classNotFoundException)
-    {
-      throw new MeridioDataSetException(
-        "Could not find the DOM Parser class when unmarshalling the Meridio Dataset",
-        classNotFoundException);
-    }
-    catch (InstantiationException instantiationException)
-    {
-      throw new MeridioDataSetException(
-        "Error instantiating the DOM Parser when unmarshalling the Meridio Dataset",
-        instantiationException);
-    }
-    catch (IllegalAccessException illegalAccessException)
-    {
-      throw new MeridioDataSetException(
-        "DOM Parser illegal access when unmarshalling the Meridio Dataset",
-        illegalAccessException);
-    }
-    catch (MarshalException marshalException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in marshalling the XML from the Meridio Dataset",
-        marshalException);
-    }
-    catch (ValidationException validationException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in validating the XML from the Meridio Dataset",
-        validationException);
-    }
-    catch (Exception ex) // from messageElement[1].getAsDocument();
-    {
-      throw new MeridioDataSetException(
-        "Error retrieving the XML Document from the Web Service response",
-        ex);
-    }
-  }
-
-
-
-  /** Given the castor object representing the Meridio DMDataSet XSD, this method generates
-  * the XML that must be passed over the wire to invoke the Meridio DM Web Service
-  */
-  protected MessageElement [] getSOAPMessage
-  (
-    DMDataSet dsDM
-  )
-    throws MeridioDataSetException
-  {
-
-    if (oLog != null) oLog.debug("Meridio: Entered getSOAPMessage method.");
-
-      try
-    {
-      Writer writer = new StringWriter();
-      dsDM.marshal(writer);
-      writer.close();
-      //oLog.debug("Meridio: Marshalled XML: " + writer.toString());
-
-      StringReader stringReader = new StringReader(writer.toString());
-      InputSource inputSource   = new InputSource(stringReader);
-
-      DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-      documentBuilderFactory.setValidating(false);
-      Document document = documentBuilderFactory.newDocumentBuilder().parse(inputSource);
-      Element element = document.getDocumentElement();
-      MessageElement messageElement = new MessageElement(element);
-
-      MessageElement [] messageElementArray = {messageElement};
-      if (oLog != null) oLog.debug("Meridio: Exiting getSOAPMessage method.");
-        return messageElementArray;
-
-    }
-    catch (MarshalException marshalException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in marshalling the XML from the Meridio Dataset",
-        marshalException);
-    }
-    catch (ValidationException validationException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in validating the XML from the Meridio Dataset",
-        validationException);
-    }
-    catch (IOException IoException)
-    {
-      throw new MeridioDataSetException(
-        "IO Error in marshalling the Meridio Dataset",
-        IoException);
-    }
-    catch (SAXException SaxException)
-    {
-      throw new MeridioDataSetException(
-        "XML Error in marshalling the Meridio Dataset",
-        SaxException);
-    }
-    catch (ParserConfigurationException parserConfigurationException)
-    {
-      throw new MeridioDataSetException(
-        "XML Error in parsing the Meridio Dataset",
-        parserConfigurationException);
-    }
-  }
-
-
-
-  /** Given the castor object representing the Meridio DMDataSet XSD, this method generates
-  * the XML that must be passed over the wire to invoke the Meridio DM Web Service
-  */
-
-  protected MessageElement [] getSOAPMessage
-  (
-    RMDataSet dsRM
-  )
-    throws MeridioDataSetException
-  {
-
-    if (oLog != null) oLog.debug("Meridio: Entered getSOAPMessage method.");
-
-      try
-    {
-      Writer writer = new StringWriter();
-      dsRM.marshal(writer);
-      writer.close();
-      //oLog.debug("Meridio: Marshalled XML: " + writer.toString());
-
-      StringReader stringReader = new StringReader(writer.toString());
-      InputSource inputSource   = new InputSource(stringReader);
-
-      DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-      documentBuilderFactory.setValidating(false);
-      Document document = documentBuilderFactory.newDocumentBuilder().parse(inputSource);
-      Element element = document.getDocumentElement();
-      MessageElement messageElement = new MessageElement(element);
-
-      MessageElement [] messageElementArray = {messageElement};
-      if (oLog != null) oLog.debug("Meridio: Exiting getSOAPMessage method.");
-        return messageElementArray;
-
-    }
-    catch (MarshalException marshalException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in marshalling the XML from the Meridio Dataset",
-        marshalException);
-    }
-    catch (ValidationException validationException)
-    {
-      throw new MeridioDataSetException(
-        "Castor error in validating the XML from the Meridio Dataset",
-        validationException);
-    }
-    catch (IOException IoException)
-    {
-      throw new MeridioDataSetException(
-        "IO Error in marshalling the Meridio Dataset",
-        IoException);
-    }
-    catch (SAXException SaxException)
-    {
-      throw new MeridioDataSetException(
-        "XML Error in marshalling the Meridio Dataset",
-        SaxException);
-    }
-    catch (ParserConfigurationException parserConfigurationException)
-    {
-      throw new MeridioDataSetException(
-        "XML Error in parsing the Meridio Dataset",
-        parserConfigurationException);
-    }
-  }
-
-  /** Implementation of EngineConfiguration that we'll use to get the wsdd file from a
-  * local resource.
-  */
-  protected static class ResourceProvider implements WSDDEngineConfiguration
-  {
-    private WSDDDeployment deployment = null;
-
-    private Class resourceClass;
-    private String resourceName;
-
-    /**
-     * Constructor setting the resource name.
-     */
-    public ResourceProvider(Class resourceClass, String resourceName) 
-    {
-      this.resourceClass = resourceClass;
-      this.resourceName = resourceName;
-    }
-
-    public WSDDDeployment getDeployment() {
-        return deployment;
-    }
-
-    public void configureEngine(AxisEngine engine)
-      throws ConfigurationException
-    {
-      try
-      {
-        InputStream resourceStream = resourceClass.getResourceAsStream(resourceName);
-        if (resourceStream == null)
-          throw new ConfigurationException("Resource not found: '"+resourceName+"'");
-        try
-        {
-          WSDDDocument doc = new WSDDDocument(XMLUtils.newDocument(resourceStream));
-          deployment = doc.getDeployment();
-
-          deployment.configureEngine(engine);
-          engine.refreshGlobalOptions();
-        }
-        finally
-        {
-          resourceStream.close();
-        }
-      }
-      catch (ConfigurationException e)
-      {
-        throw e;
-      }
-      catch (Exception e)
-      {
-        throw new ConfigurationException(e);
-      }
-    }
-
-    public void writeEngineConfig(AxisEngine engine)
-      throws ConfigurationException
-    {
-      // Do nothing
-    }
-
-    /**
-     * retrieve an instance of the named handler
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public Handler getHandler(QName qname) throws ConfigurationException
-    {
-      return deployment.getHandler(qname);
-    }
-
-    /**
-     * retrieve an instance of the named service
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public SOAPService getService(QName qname) throws ConfigurationException
-    {
-      SOAPService service = deployment.getService(qname);
-      if (service == null)
-      {
-        throw new ConfigurationException(Messages.getMessage("noService10",
-          qname.toString()));
-      }
-      return service;
-    }
-
-    /**
-     * Get a service which has been mapped to a particular namespace
-     * 
-     * @param namespace a namespace URI
-     * @return an instance of the appropriate Service, or null
-     */
-    public SOAPService getServiceByNamespaceURI(String namespace)
-      throws ConfigurationException
-    {
-      return deployment.getServiceByNamespaceURI(namespace);
-    }
-
-    /**
-     * retrieve an instance of the named transport
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public Handler getTransport(QName qname) throws ConfigurationException
-    {
-      return deployment.getTransport(qname);
-    }
-
-    public TypeMappingRegistry getTypeMappingRegistry()
-        throws ConfigurationException
-    {
-      return deployment.getTypeMappingRegistry();
-    }
-
-    /**
-     * Returns a global request handler.
-     */
-    public Handler getGlobalRequest() throws ConfigurationException
-    {
-      return deployment.getGlobalRequest();
-    }
-
-    /**
-     * Returns a global response handler.
-     */
-    public Handler getGlobalResponse() throws ConfigurationException
-    {
-      return deployment.getGlobalResponse();
-    }
-
-    /**
-     * Returns the global configuration options.
-     */
-    public Hashtable getGlobalOptions() throws ConfigurationException
-    {
-      WSDDGlobalConfiguration globalConfig = deployment.getGlobalConfiguration();
-            
-      if (globalConfig != null)
-        return globalConfig.getParametersTable();
-
-      return null;
-    }
-
-    /**
-     * Get an enumeration of the services deployed to this engine
-     */
-    public Iterator getDeployedServices() throws ConfigurationException
-    {
-      return deployment.getDeployedServices();
-    }
-
-    /**
-     * Get a list of roles that this engine plays globally.  Services
-     * within the engine configuration may also add additional roles.
-     *
-     * @return a <code>List</code> of the roles for this engine
-     */
-    public List getRoles()
-    {
-      return deployment.getRoles();
-    }
-  }
-
-}
diff --git a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioWrapperException.java b/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioWrapperException.java
deleted file mode 100644
index 1c4a7e4..0000000
--- a/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/meridio/MeridioWrapperException.java
+++ /dev/null
@@ -1,38 +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 org.apache.manifoldcf.meridio;
-
-public class MeridioWrapperException extends Exception
-{
-
-  public MeridioWrapperException(Throwable cause)
-  {
-    super(cause);
-  }
-
-  public MeridioWrapperException(String errString, Throwable cause)
-  {
-    super(errString, cause);
-  }
-
-  public MeridioWrapperException(String errString)
-  {
-    super(errString);
-  }
-
-}
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_en_US.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_en_US.properties
deleted file mode 100644
index 6125f96..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_en_US.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=No access tokens present
-MeridioConnector.NoAccessTokensSpecified=No access tokens specified
-MeridioConnector.Cache=Cache
-MeridioConnector.CacheLifetime=Cache lifetime:
-MeridioConnector.CacheLRUSize=Cache LRU size:
-MeridioConnector.minutes=minutes
-MeridioConnector.DocumentServer=Document Server
-MeridioConnector.RecordsServer=Records Server
-MeridioConnector.UserServiceServer=User Service Server
-MeridioConnector.Credentials=Credentials
-MeridioConnector.PleaseSupplyAValidNumber=Please supply a valid number
-MeridioConnector.AValidMeridioUserNameHasTheForm=A valid Meridio user name has the form <domain>\\<user>
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=Please fill in a Meridio document management server name
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=Please fill in a Meridio records management server name
-MeridioConnector.PleaseFillInAUserServiceServerName=Please fill in a User Service server name
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=Please supply a Meridio document management port number, or none for default
-MeridioConnector.PleaseSupplyAUserServicePortNumber=Please supply a User Service port number, or none for default
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=The connection requires a valid Meridio user name of the form <domain>\\<user>
-MeridioConnector.ChooseACertificateFile=Choose a certificate file
-MeridioConnector.DocumentWebserviceServerProtocol=Document webservice server protocol:
-MeridioConnector.DocumentWebserviceServerName=Document webservice server name:
-MeridioConnector.DocumentWebserviceServerPort=Document webservice server port:
-MeridioConnector.DocumentWebserviceLocation=Document webservice location:
-MeridioConnector.DocumentWebserviceServerProxyHost=Document webservice server proxy host:
-MeridioConnector.DocumentWebserviceServerProxyPort=Document webservice server proxy port:
-MeridioConnector.RecordWebserviceServerProtocol=Record webservice server protocol:
-MeridioConnector.RecordWebserviceServerName=Record webservice server name:
-MeridioConnector.RecordWebserviceServerPort=Record webservice server port:
-MeridioConnector.RecordWebserviceLocation=Record webservice location:
-MeridioConnector.RecordWebserviceServerProxyHost=Record webservice server proxy host:
-MeridioConnector.RecordWebserviceServerProxyPort=Record webservice server proxy port:
-MeridioConnector.UserWebserviceServerName=User webservice server name:
-MeridioConnector.UserWebserviceServerPort=User webservice server port:
-MeridioConnector.UserWebserviceLocation=User webservice location:
-MeridioConnector.UserWebserviceServerProxyHost=User webservice server proxy host:
-MeridioConnector.UserWebserviceServerProxyPort=User webservice server proxy port:
-MeridioConnector.UserName=User name:
-MeridioConnector.Password=Password:
-MeridioConnector.SSLCertificateList=SSL certificate list:
-MeridioConnector.NoCertificatesPresent=No certificates present
-MeridioConnector.DeleteCert=Delete cert 
-MeridioConnector.AddCert=Add cert
-MeridioConnector.Parameters=Parameters:
-MeridioConnector.certificates= certificate(s)
-MeridioConnector.WebClient=Web Client
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=Please fill in a Meridio web client server name
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=Please supply a Meridio web client port number, or none for default
-MeridioConnector.DocumentWebserviceServerProtocol=Document webservice server protocol:
-MeridioConnector.WebClientProtocol=Web client protocol
-MeridioConnector.WebClientServerName=Web client server name:
-MeridioConnector.WebClientServerPort=Web client server port:
-MeridioConnector.WebClientServerDocLocation=Web client server doc location:
-MeridioConnector.Parameters=Parameters:
-MeridioConnector.SearchPaths=Search Paths
-MeridioConnector.ContentTypes=Content Types
-MeridioConnector.Categories=Categories
-MeridioConnector.DataTypes=Data Types
-MeridioConnector.Security=Security
-MeridioConnector.Metadata=Metadata
-MeridioConnector.SelectAFolderOrClassFirst=Select a folder or class first
-MeridioConnector.AccessTokenCannotBeNull=Access token cannot be null
-MeridioConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-MeridioConnector.DeletePath=Delete path #
-MeridioConnector.NoPathsSpecified=No paths specified.
-MeridioConnector.AddPath=Add path
-MeridioConnector.DeleteFromPath=Delete from path
-MeridioConnector.AddToPath=Add to path
-MeridioConnector.PickAFolder=-- Pick a folder --
-MeridioConnector.ServiceInterruption=Service interruption: 
-MeridioConnector.MimeTypes=Mime types:
-MeridioConnector.Categories=Categories:
-MeridioConnector.DataTypesToIngest=Data types to ingest:
-MeridioConnector.Documents=Documents
-MeridioConnector.Records=Records
-MeridioConnector.DocumentsAndRecords=Documents and records
-MeridioConnector.Security2=Security:
-MeridioConnector.Enabled=Enabled
-MeridioConnector.Disabled=Disabled
-MeridioConnector.DeleteToken=Delete token #
-MeridioConnector.AddAccessToken=Add access token
-MeridioConnector.IncludeAllMetadata=Include all metadata:
-MeridioConnector.IncludeSpecified=Include specified
-MeridioConnector.IncludeAll=Include all
-MeridioConnector.Metadata=Metadata:
-MeridioConnector.PathAttributeMetadataName=Path attribute metadata name:
-MeridioConnector.DeleteMapping=Delete mapping #
-MeridioConnector.NoMappingsSpecified=No mappings specified
-MeridioConnector.AddToMappings=Add to mappings
-MeridioConnector.MatchRegexp=Match regexp:
-MeridioConnector.ReplaceString=Replace string:
-MeridioConnector.Paths=Paths:
-MeridioConnector.NoPathsSpecified=No paths specified
-MeridioConnector.DataType=Data Type:
-MeridioConnector.Categories=Categories:
-MeridioConnector.MimeTypes=Mime types:
-MeridioConnector.AccessTokens=Access tokens:
-MeridioConnector.MetadataPropertiesToIngest=Metadata properties to ingest:
-MeridioConnector.AllMetadata=All metadata
-MeridioConnector.MetadataPropertiesToIngest=Metadata properties to ingest:
-MeridioConnector.NoMetadataPropertiesToIngest=No metadata properties to ingest
-MeridioConnector.PathNameMetadataAttribute=Path-name metadata attribute:
-MeridioConnector.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-MeridioConnector.PathValueMapping=Path-value mapping:
-MeridioConnector.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-MeridioConnector.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-MeridioConnector.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-MeridioConnector.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_es_ES.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_es_ES.properties
deleted file mode 100644
index ba8e81a..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_es_ES.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-MeridioConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-MeridioConnector.Cache=Cachè
-MeridioConnector.CacheLifetime=vida útil de la caché:
-MeridioConnector.CacheLRUSize=Tamaño de caché LRU:
-MeridioConnector.minutes=minutos
-MeridioConnector.DocumentServer=Servidor de Documento
-MeridioConnector.RecordsServer=Registros del servidor
-MeridioConnector.UserServiceServer=Servidor de Servicio de Usuario
-MeridioConnector.Credentials=Credenciales
-MeridioConnector.PleaseSupplyAValidNumber=Por favor, facilite un número válido
-MeridioConnector.AValidMeridioUserNameHasTheForm=Un nombre de usuario válido Meridio tiene la forma <dominio>\\<usuario>
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=Por favor, rellene un documento nombre de servidor de administración Meridio
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=Por favor, rellene un nombre de servidor de administración de registros de Meridio
-MeridioConnector.PleaseFillInAUserServiceServerName=Por favor, rellene un Servicio de nombre de servidor del usuario
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=Por favor, facilite un número de puerto de gestión de documentos Meridio, o ninguno de forma predeterminada
-MeridioConnector.PleaseSupplyAUserServicePortNumber=Por favor, facilite un número de puerto de servicio de usuario, o ninguno de forma predeterminada
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=La conexión requiere un nombre de usuario válido Meridio de la forma <dominio>\\<usuario>
-MeridioConnector.ChooseACertificateFile=Elija un archivo de certificado
-MeridioConnector.DocumentWebserviceServerProtocol=Documento protocolo de servidor de servicios web:
-MeridioConnector.DocumentWebserviceServerName=Documento nombre del servidor de servicio web:
-MeridioConnector.DocumentWebserviceServerPort=Documento de puerto del servidor de servicio web:
-MeridioConnector.DocumentWebserviceLocation=Documento de la ubicación del servicio web:
-MeridioConnector.DocumentWebserviceServerProxyHost=Documento servicio web host proxy de servidor:
-MeridioConnector.DocumentWebserviceServerProxyPort=Documento puerto de servidor proxy de servicio web:
-MeridioConnector.RecordWebserviceServerProtocol=Protocolo de servidor servicio web Record:
-MeridioConnector.RecordWebserviceServerName=Registre el nombre del servidor de servicio web:
-MeridioConnector.RecordWebserviceServerPort=Registro de puerto del servidor de servicios web:
-MeridioConnector.RecordWebserviceLocation=Registro de ubicación de servicio Web:
-MeridioConnector.RecordWebserviceServerProxyHost=Registro de host de servidor proxy de servicio web:
-MeridioConnector.RecordWebserviceServerProxyPort=Registro de puerto de servidor proxy de servicio web:
-MeridioConnector.UserWebserviceServerName=Nombre de usuario del servidor de servicios web:
-MeridioConnector.UserWebserviceServerPort=Usuario puerto del servidor de servicios web:
-MeridioConnector.UserWebserviceLocation=Usuario ubicación del servicio web:
-MeridioConnector.UserWebserviceServerProxyHost=Usuario servicio web host proxy de servidor:
-MeridioConnector.UserWebserviceServerProxyPort=Servicio web Usuario puerto proxy del servidor:
-MeridioConnector.UserName=Nombre de usuario:
-MeridioConnector.Password=Contraseña:
-MeridioConnector.SSLCertificateList=Lista de certificados SSL:
-MeridioConnector.NoCertificatesPresent=No hay certificados actuales
-MeridioConnector.DeleteCert=eliminar cert 
-MeridioConnector.AddCert=Añadir cert
-MeridioConnector.Parameters=Parámetros:
-MeridioConnector.certificates= certificado(s)
-MeridioConnector.WebClient=Cliente Web
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=Por favor, rellene un web server name cliente Meridio
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=Por favor, facilite un número Meridio cliente web de puerto, o ninguno de forma predeterminada
-MeridioConnector.DocumentWebserviceServerProtocol=Documento protocolo de servidor de servicios web:
-MeridioConnector.WebClientProtocol=Protocolo cliente Web
-MeridioConnector.WebClientServerName=Nombre del servidor cliente web:
-MeridioConnector.WebClientServerPort=Puerto del servidor cliente web:
-MeridioConnector.WebClientServerDocLocation=Cliente Web ubicación doc servidor:
-MeridioConnector.Parameters=Parámetros:
-MeridioConnector.SearchPaths=Rutas de búsqueda
-MeridioConnector.ContentTypes=Tipos de contenido
-MeridioConnector.Categories=Categorías
-MeridioConnector.DataTypes=Tipos de datos
-MeridioConnector.Security=Seguridad
-MeridioConnector.Metadata=metadatos
-MeridioConnector.SelectAFolderOrClassFirst=Seleccione una carpeta o una clase de primero
-MeridioConnector.AccessTokenCannotBeNull=Token de acceso no puede ser nulo
-MeridioConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-MeridioConnector.DeletePath=eliminar ruta #
-MeridioConnector.NoPathsSpecified=No hay rutas especificadas.
-MeridioConnector.AddPath=Añadir ruta
-MeridioConnector.DeleteFromPath=Eliminar de la ruta
-MeridioConnector.AddToPath=Añadir a la trayectoria
-MeridioConnector.PickAFolder=-- Elija una carpeta --
-MeridioConnector.ServiceInterruption=interrupción del servicio: 
-MeridioConnector.MimeTypes=tipos Mime:
-MeridioConnector.Categories=Categorías:
-MeridioConnector.DataTypesToIngest=Los tipos de datos que ingresan:
-MeridioConnector.Documents=Documentos
-MeridioConnector.Records=Registros
-MeridioConnector.DocumentsAndRecords=Los documentos y registros
-MeridioConnector.Security2=Seguridad:
-MeridioConnector.Enabled=Activado
-MeridioConnector.Disabled=Imposibilitado
-MeridioConnector.DeleteToken=eliminar token #
-MeridioConnector.AddAccessToken=Añadir token de acceso
-MeridioConnector.IncludeAllMetadata=Incluir todos los metadatos:
-MeridioConnector.IncludeSpecified=Incluya especificado
-MeridioConnector.IncludeAll=Incluye todo
-MeridioConnector.Metadata=Metadatos:
-MeridioConnector.PathAttributeMetadataName=Atributo de camino metadata nombre:
-MeridioConnector.DeleteMapping=Suprima trazar un mapa #
-MeridioConnector.NoMappingsSpecified=Ningún trazar un mapa de especificado
-MeridioConnector.AddToMappings=Añada al trazar un mapa
-MeridioConnector.MatchRegexp=regexp Partido:
-MeridioConnector.ReplaceString=Reemplazar cadena:
-MeridioConnector.Paths=Caminos:
-MeridioConnector.NoPathsSpecified=No hay rutas especificadas
-MeridioConnector.DataType=Tipo de datos:
-MeridioConnector.Categories=Categorías:
-MeridioConnector.MimeTypes=Mime types:
-MeridioConnector.AccessTokens=tokens de acceso:
-MeridioConnector.MetadataPropertiesToIngest=Propiedades de metadatos que ingresan:
-MeridioConnector.AllMetadata=Todos los metadatos
-MeridioConnector.MetadataPropertiesToIngest=Propiedades de metadatos que ingresan:
-MeridioConnector.NoMetadataPropertiesToIngest=No hay propiedades de metadatos que ingresar
-MeridioConnector.PathNameMetadataAttribute=Camino-atributo de nombre metadatos:
-MeridioConnector.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-MeridioConnector.PathValueMapping=Camino-asignación de valores:
-MeridioConnector.CacheLifetimeCannotBeNull=Vida útil de la caché no puede ser nulo
-MeridioConnector.CacheLifetimeMustBeAnInteger=Vida útil de la caché debe ser un entero
-MeridioConnector.CacheLRUSizeCannotBeNull=Tamaño de caché LRU no puede ser nulo
-MeridioConnector.CacheLRUSizeMustBeAnInteger=Tamaño de caché LRU debe ser un entero
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_ja_JP.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_ja_JP.properties
deleted file mode 100644
index 09968bc..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_ja_JP.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=アクセストークンが存在しません
-MeridioConnector.NoAccessTokensSpecified=アクセストークンが未定義です
-MeridioConnector.Cache=キャッシュ
-MeridioConnector.CacheLifetime=キャッシュライフタイム:
-MeridioConnector.CacheLRUSize=キャッシュLRUサイズ:
-MeridioConnector.minutes=分
-MeridioConnector.DocumentServer=ドキュメントサーバ
-MeridioConnector.RecordsServer=レコードサーバ
-MeridioConnector.UserServiceServer=ユーザサービスサーバ
-MeridioConnector.Credentials=証明書
-MeridioConnector.PleaseSupplyAValidNumber=数字を入力してください
-MeridioConnector.AValidMeridioUserNameHasTheForm=Meridioユーザ名を<ドメイン>\\<ユーザ>\形式で入力してください
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=Meridioドキュメント管理サーバ名を入力してください
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=Meridioレコード管理サーバ名を入力してくだし
-MeridioConnector.PleaseFillInAUserServiceServerName=ユーザサービスサーバ名を入力してください
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=Meridioドキュメント管理ポート番号を入力してください(デフォルト値を利用する場合は空白)
-MeridioConnector.PleaseSupplyAUserServicePortNumber=ユーザサービスポート番号を入力してください(デフォルト値を利用する場合は空白)
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=Meridioユーザ名を<ドメイン>\\<ユーザ>\形式で入力してください
-MeridioConnector.ChooseACertificateFile=証明書ファイルを選択してください
-MeridioConnector.DocumentWebserviceServerProtocol=ドキュメントwebserviceサーバプロトコル:
-MeridioConnector.DocumentWebserviceServerName=ドキュメントwebserviceサーバ名:
-MeridioConnector.DocumentWebserviceServerPort=ドキュメントwebserviceサーバポート:
-MeridioConnector.DocumentWebserviceLocation=ドキュメントwebserviceアドレス:
-MeridioConnector.DocumentWebserviceServerProxyHost=ドキュメントwebserviceサーバプロキシホスト:
-MeridioConnector.DocumentWebserviceServerProxyPort=ドキュメントwebserviceサーバプロキシポート:
-MeridioConnector.RecordWebserviceServerProtocol=レコードwebserviceサーバプロトコル:
-MeridioConnector.RecordWebserviceServerName=レコードwebserviceサーバ名:
-MeridioConnector.RecordWebserviceServerPort=レコードwebserviceサーバポート:
-MeridioConnector.RecordWebserviceLocation=レコードwebserviceアドレス:
-MeridioConnector.RecordWebserviceServerProxyHost=レコードwebserviceサーバプロキシホスト:
-MeridioConnector.RecordWebserviceServerProxyPort=レコードwebserviceサーバプロキシポート:
-MeridioConnector.UserWebserviceServerName=ユーザwebserviceサーバ名:
-MeridioConnector.UserWebserviceServerPort=ユーザwebserviceサーバポート:
-MeridioConnector.UserWebserviceLocation=ユーザwebserviceアドレス:
-MeridioConnector.UserWebserviceServerProxyHost=ユーザwebserviceサーバプロキシホスト:
-MeridioConnector.UserWebserviceServerProxyPort=ユーザwebserviceサーバプロキシポート:
-MeridioConnector.UserName=ユーザ名:
-MeridioConnector.Password=パスワード:
-MeridioConnector.SSLCertificateList=SSL証明書一覧:
-MeridioConnector.NoCertificatesPresent=証明書がありません
-MeridioConnector.DeleteCert=証明書を削除 
-MeridioConnector.AddCert=証明書を追加
-MeridioConnector.Parameters=引数:
-MeridioConnector.certificates=証明書
-MeridioConnector.WebClient=Webクライアント
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=Meridio webクライアントサーバ名を入力してください
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=Meridio webクライアントポート番号を入力してください(デフォルト値を利用する場合は空白)
-MeridioConnector.DocumentWebserviceServerProtocol=ドキュメントwebserviceサーバプロトコル:
-MeridioConnector.WebClientProtocol=Webクライアントプロトコル
-MeridioConnector.WebClientServerName=Webクライアントサーバ名:
-MeridioConnector.WebClientServerPort=Webクライアントサーバポート:
-MeridioConnector.WebClientServerDocLocation=Webクライアントサーバドキュメントアドレス:
-MeridioConnector.Parameters=引数:
-MeridioConnector.SearchPaths=検索パス
-MeridioConnector.ContentTypes=コンテンツタイプ
-MeridioConnector.Categories=カテゴリ
-MeridioConnector.DataTypes=データタイプ
-MeridioConnector.Security=セキュリティ
-MeridioConnector.Metadata=メタデータ
-MeridioConnector.SelectAFolderOrClassFirst=フォルダ又はクラスを選択してください
-MeridioConnector.AccessTokenCannotBeNull=アクセストークンを選択してください
-MeridioConnector.MatchStringCannotBeEmpty=パターンを入力してください
-MeridioConnector.DeletePath=パスを削除: #
-MeridioConnector.NoPathsSpecified=パスが指定されていません
-MeridioConnector.AddPath=パスを追加
-MeridioConnector.DeleteFromPath=パスから削除
-MeridioConnector.AddToPath=パスに追加
-MeridioConnector.PickAFolder=-- フォルダを選択 --
-MeridioConnector.ServiceInterruption=サービスをイントラプト: 
-MeridioConnector.MimeTypes=MIMEタイプ:
-MeridioConnector.Categories=カテゴリ:
-MeridioConnector.DataTypesToIngest=収集するデータタイプ:
-MeridioConnector.Documents=ドキュメント
-MeridioConnector.Records=レコード
-MeridioConnector.DocumentsAndRecords=ドキュメントとレコード
-MeridioConnector.Security2=セキュリティ:
-MeridioConnector.Enabled=有効
-MeridioConnector.Disabled=無効
-MeridioConnector.DeleteToken=トークンを削除: #
-MeridioConnector.AddAccessToken=アクセストークを追加
-MeridioConnector.IncludeAllMetadata=すべてのメタデータを含む:
-MeridioConnector.IncludeSpecified=指定した項目を含む
-MeridioConnector.IncludeAll=すべてを含む
-MeridioConnector.Metadata=メタデータ:
-MeridioConnector.PathAttributeMetadataName=パス属性メタデータ名:
-MeridioConnector.DeleteMapping=マップを削除: #
-MeridioConnector.NoMappingsSpecified=マップが指定されていません
-MeridioConnector.AddToMappings=マップに追加
-MeridioConnector.MatchRegexp=パターン:
-MeridioConnector.ReplaceString=置換文字列:
-MeridioConnector.Paths=パス:
-MeridioConnector.NoPathsSpecified=パスが指定されていません
-MeridioConnector.DataType=データタイプ:
-MeridioConnector.Categories=カテゴリ:
-MeridioConnector.MimeTypes=MIMEタイプ:
-MeridioConnector.AccessTokens=アクセストークン:
-MeridioConnector.MetadataPropertiesToIngest=収集するメタデータプロパティ:
-MeridioConnector.AllMetadata=すべてのメタデータ
-MeridioConnector.MetadataPropertiesToIngest=収集するメタデータプロパティ:
-MeridioConnector.NoMetadataPropertiesToIngest=収集するメタデータプロパティがありません
-MeridioConnector.PathNameMetadataAttribute=Path-nameメタデータ属性:
-MeridioConnector.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性が指定されていません
-MeridioConnector.PathValueMapping=Path-valueマップ:
-MeridioConnector.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-MeridioConnector.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-MeridioConnector.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-MeridioConnector.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_zh_CN.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_zh_CN.properties
deleted file mode 100644
index d74ebfc..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/meridio/common_zh_CN.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=访问令牌不存在
-MeridioConnector.NoAccessTokensSpecified=访问令牌未指定
-MeridioConnector.Cache=缓存
-MeridioConnector.CacheLifetime=缓存寿命: 
-MeridioConnector.CacheLRUSize=缓存LRU大小: 
-MeridioConnector.minutes=分
-MeridioConnector.DocumentServer=文档服务器
-MeridioConnector.RecordsServer=记录服务器
-MeridioConnector.UserServiceServer=用户服务服务器
-MeridioConnector.Credentials=凭证
-MeridioConnector.PleaseSupplyAValidNumber=请输入有效的数字
-MeridioConnector.AValidMeridioUserNameHasTheForm=Meridio用户名需指定为 <域>\\<用户>\ 的格式
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=请输入Meridio文档管理服务器名
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=请输入Meridio记录管理服务器名
-MeridioConnector.PleaseFillInAUserServiceServerName=请输入用户服务服务器名
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=请输入Meridio文档管理端口号(如使用缺省值则设为空)
-MeridioConnector.PleaseSupplyAUserServicePortNumber=请输入用户服务端口号(如使用缺省值则设为空)
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=连接的Meridio用户名需指定为 <域>\\<用户>\ 的格式
-MeridioConnector.ChooseACertificateFile=请选择证书文件
-MeridioConnector.DocumentWebserviceServerProtocol=文档Web服务服务器协议: 
-MeridioConnector.DocumentWebserviceServerName=文档Web服务服务器名: 
-MeridioConnector.DocumentWebserviceServerPort=文档Web服务服务器端口: 
-MeridioConnector.DocumentWebserviceLocation=文档Web服务位置: 
-MeridioConnector.DocumentWebserviceServerProxyHost=文档Web服务服务器代理主机: 
-MeridioConnector.DocumentWebserviceServerProxyPort=文档Web服务服务器代理端口: 
-MeridioConnector.RecordWebserviceServerProtocol=记录Web服务服务器协议: 
-MeridioConnector.RecordWebserviceServerName=记录Web服务服务器名: 
-MeridioConnector.RecordWebserviceServerPort=记录Web服务服务器端口: 
-MeridioConnector.RecordWebserviceLocation=记录Web服务位置: 
-MeridioConnector.RecordWebserviceServerProxyHost=记录Web服务服务器代理主机: 
-MeridioConnector.RecordWebserviceServerProxyPort=记录Web服务服务器代理端口: 
-MeridioConnector.UserWebserviceServerName=用户Web服务服务器名: 
-MeridioConnector.UserWebserviceServerPort=用户Web服务服务器端口: 
-MeridioConnector.UserWebserviceLocation=用户Web服务位置: 
-MeridioConnector.UserWebserviceServerProxyHost=用户Web服务服务器代理主机: 
-MeridioConnector.UserWebserviceServerProxyPort=用户Web服务服务器代理端口: 
-MeridioConnector.UserName=用户名: 
-MeridioConnector.Password=密码: 
-MeridioConnector.SSLCertificateList=SSL证书列表: 
-MeridioConnector.NoCertificatesPresent=证书不存在
-MeridioConnector.DeleteCert=删除证书 
-MeridioConnector.AddCert=添加证书
-MeridioConnector.Parameters=参数: 
-MeridioConnector.certificates=证书
-MeridioConnector.WebClient=Web客户端
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=请输入Meridio的Web客户端服务器名
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=请输入Meridio的Web客户端端口号(如使用缺省值则设为空)
-MeridioConnector.DocumentWebserviceServerProtocol=文档Web服务服务器协议: 
-MeridioConnector.WebClientProtocol=Web客户端协议
-MeridioConnector.WebClientServerName=Web客户端服务器名: 
-MeridioConnector.WebClientServerPort=Web客户端服务器端口: 
-MeridioConnector.WebClientServerDocLocation=Web客户端服务器文档位置: 
-MeridioConnector.Parameters=参数: 
-MeridioConnector.SearchPaths=検索路径
-MeridioConnector.ContentTypes=文档类型
-MeridioConnector.Categories=分类
-MeridioConnector.DataTypes=数据类型
-MeridioConnector.Security=安全
-MeridioConnector.Metadata=元数据
-MeridioConnector.SelectAFolderOrClassFirst=请先选择文件夹或类
-MeridioConnector.AccessTokenCannotBeNull=访问令牌不能为空
-MeridioConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-MeridioConnector.DeletePath=删除路径:  #
-MeridioConnector.NoPathsSpecified=路径未指定
-MeridioConnector.AddPath=添加路径
-MeridioConnector.DeleteFromPath=从路径删除
-MeridioConnector.AddToPath=添加到路径
-MeridioConnector.PickAFolder=-- 选择文件夹 --
-MeridioConnector.ServiceInterruption=服务中断:  
-MeridioConnector.MimeTypes=MIME类型: 
-MeridioConnector.Categories=分类: 
-MeridioConnector.DataTypesToIngest=爬取对象数据类型: 
-MeridioConnector.Documents=文档
-MeridioConnector.Records=记录
-MeridioConnector.DocumentsAndRecords=文档和记录
-MeridioConnector.Security2=安全: 
-MeridioConnector.Enabled=有效
-MeridioConnector.Disabled=无效
-MeridioConnector.DeleteToken=删除令牌:  #
-MeridioConnector.AddAccessToken=添加访问令牌
-MeridioConnector.IncludeAllMetadata=包含所有元数据: 
-MeridioConnector.IncludeSpecified=包含指定项目
-MeridioConnector.IncludeAll=包含所有
-MeridioConnector.Metadata=元数据: 
-MeridioConnector.PathAttributeMetadataName=路径属性元数据名: 
-MeridioConnector.DeleteMapping=删除映射:  #
-MeridioConnector.NoMappingsSpecified=映射未指定
-MeridioConnector.AddToMappings=添加到映射
-MeridioConnector.MatchRegexp=匹配正则表达式: 
-MeridioConnector.ReplaceString=替换字符串: 
-MeridioConnector.Paths=路径: 
-MeridioConnector.NoPathsSpecified=路径未指定
-MeridioConnector.DataType=数据类型: 
-MeridioConnector.Categories=分类: 
-MeridioConnector.MimeTypes=MIME类型: 
-MeridioConnector.AccessTokens=访问令牌: 
-MeridioConnector.MetadataPropertiesToIngest=爬取对象元数据属性: 
-MeridioConnector.AllMetadata=所有元数据
-MeridioConnector.MetadataPropertiesToIngest=爬取对象元数据属性: 
-MeridioConnector.NoMetadataPropertiesToIngest=没有爬取对象元数据属性
-MeridioConnector.PathNameMetadataAttribute=路径名元数据属性: 
-MeridioConnector.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-MeridioConnector.PathValueMapping=路径值映射: 
-MeridioConnector.CacheLifetimeCannotBeNull=缓存寿命不能为空
-MeridioConnector.CacheLifetimeMustBeAnInteger=缓存寿命必须为整数
-MeridioConnector.CacheLRUSizeCannotBeNull=缓存LRU大小不能为空
-MeridioConnector.CacheLRUSizeMustBeAnInteger=缓存LRU大小必须为整数
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_en_US.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_en_US.properties
deleted file mode 100644
index 6125f96..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_en_US.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=No access tokens present
-MeridioConnector.NoAccessTokensSpecified=No access tokens specified
-MeridioConnector.Cache=Cache
-MeridioConnector.CacheLifetime=Cache lifetime:
-MeridioConnector.CacheLRUSize=Cache LRU size:
-MeridioConnector.minutes=minutes
-MeridioConnector.DocumentServer=Document Server
-MeridioConnector.RecordsServer=Records Server
-MeridioConnector.UserServiceServer=User Service Server
-MeridioConnector.Credentials=Credentials
-MeridioConnector.PleaseSupplyAValidNumber=Please supply a valid number
-MeridioConnector.AValidMeridioUserNameHasTheForm=A valid Meridio user name has the form <domain>\\<user>
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=Please fill in a Meridio document management server name
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=Please fill in a Meridio records management server name
-MeridioConnector.PleaseFillInAUserServiceServerName=Please fill in a User Service server name
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=Please supply a Meridio document management port number, or none for default
-MeridioConnector.PleaseSupplyAUserServicePortNumber=Please supply a User Service port number, or none for default
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=The connection requires a valid Meridio user name of the form <domain>\\<user>
-MeridioConnector.ChooseACertificateFile=Choose a certificate file
-MeridioConnector.DocumentWebserviceServerProtocol=Document webservice server protocol:
-MeridioConnector.DocumentWebserviceServerName=Document webservice server name:
-MeridioConnector.DocumentWebserviceServerPort=Document webservice server port:
-MeridioConnector.DocumentWebserviceLocation=Document webservice location:
-MeridioConnector.DocumentWebserviceServerProxyHost=Document webservice server proxy host:
-MeridioConnector.DocumentWebserviceServerProxyPort=Document webservice server proxy port:
-MeridioConnector.RecordWebserviceServerProtocol=Record webservice server protocol:
-MeridioConnector.RecordWebserviceServerName=Record webservice server name:
-MeridioConnector.RecordWebserviceServerPort=Record webservice server port:
-MeridioConnector.RecordWebserviceLocation=Record webservice location:
-MeridioConnector.RecordWebserviceServerProxyHost=Record webservice server proxy host:
-MeridioConnector.RecordWebserviceServerProxyPort=Record webservice server proxy port:
-MeridioConnector.UserWebserviceServerName=User webservice server name:
-MeridioConnector.UserWebserviceServerPort=User webservice server port:
-MeridioConnector.UserWebserviceLocation=User webservice location:
-MeridioConnector.UserWebserviceServerProxyHost=User webservice server proxy host:
-MeridioConnector.UserWebserviceServerProxyPort=User webservice server proxy port:
-MeridioConnector.UserName=User name:
-MeridioConnector.Password=Password:
-MeridioConnector.SSLCertificateList=SSL certificate list:
-MeridioConnector.NoCertificatesPresent=No certificates present
-MeridioConnector.DeleteCert=Delete cert 
-MeridioConnector.AddCert=Add cert
-MeridioConnector.Parameters=Parameters:
-MeridioConnector.certificates= certificate(s)
-MeridioConnector.WebClient=Web Client
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=Please fill in a Meridio web client server name
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=Please supply a Meridio web client port number, or none for default
-MeridioConnector.DocumentWebserviceServerProtocol=Document webservice server protocol:
-MeridioConnector.WebClientProtocol=Web client protocol
-MeridioConnector.WebClientServerName=Web client server name:
-MeridioConnector.WebClientServerPort=Web client server port:
-MeridioConnector.WebClientServerDocLocation=Web client server doc location:
-MeridioConnector.Parameters=Parameters:
-MeridioConnector.SearchPaths=Search Paths
-MeridioConnector.ContentTypes=Content Types
-MeridioConnector.Categories=Categories
-MeridioConnector.DataTypes=Data Types
-MeridioConnector.Security=Security
-MeridioConnector.Metadata=Metadata
-MeridioConnector.SelectAFolderOrClassFirst=Select a folder or class first
-MeridioConnector.AccessTokenCannotBeNull=Access token cannot be null
-MeridioConnector.MatchStringCannotBeEmpty=Match string cannot be empty
-MeridioConnector.DeletePath=Delete path #
-MeridioConnector.NoPathsSpecified=No paths specified.
-MeridioConnector.AddPath=Add path
-MeridioConnector.DeleteFromPath=Delete from path
-MeridioConnector.AddToPath=Add to path
-MeridioConnector.PickAFolder=-- Pick a folder --
-MeridioConnector.ServiceInterruption=Service interruption: 
-MeridioConnector.MimeTypes=Mime types:
-MeridioConnector.Categories=Categories:
-MeridioConnector.DataTypesToIngest=Data types to ingest:
-MeridioConnector.Documents=Documents
-MeridioConnector.Records=Records
-MeridioConnector.DocumentsAndRecords=Documents and records
-MeridioConnector.Security2=Security:
-MeridioConnector.Enabled=Enabled
-MeridioConnector.Disabled=Disabled
-MeridioConnector.DeleteToken=Delete token #
-MeridioConnector.AddAccessToken=Add access token
-MeridioConnector.IncludeAllMetadata=Include all metadata:
-MeridioConnector.IncludeSpecified=Include specified
-MeridioConnector.IncludeAll=Include all
-MeridioConnector.Metadata=Metadata:
-MeridioConnector.PathAttributeMetadataName=Path attribute metadata name:
-MeridioConnector.DeleteMapping=Delete mapping #
-MeridioConnector.NoMappingsSpecified=No mappings specified
-MeridioConnector.AddToMappings=Add to mappings
-MeridioConnector.MatchRegexp=Match regexp:
-MeridioConnector.ReplaceString=Replace string:
-MeridioConnector.Paths=Paths:
-MeridioConnector.NoPathsSpecified=No paths specified
-MeridioConnector.DataType=Data Type:
-MeridioConnector.Categories=Categories:
-MeridioConnector.MimeTypes=Mime types:
-MeridioConnector.AccessTokens=Access tokens:
-MeridioConnector.MetadataPropertiesToIngest=Metadata properties to ingest:
-MeridioConnector.AllMetadata=All metadata
-MeridioConnector.MetadataPropertiesToIngest=Metadata properties to ingest:
-MeridioConnector.NoMetadataPropertiesToIngest=No metadata properties to ingest
-MeridioConnector.PathNameMetadataAttribute=Path-name metadata attribute:
-MeridioConnector.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-MeridioConnector.PathValueMapping=Path-value mapping:
-MeridioConnector.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-MeridioConnector.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-MeridioConnector.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-MeridioConnector.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_es_ES.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_es_ES.properties
deleted file mode 100644
index dc70ddd..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_es_ES.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=No hay acceso a la actualidad token
-MeridioConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-MeridioConnector.Cache=Cache
-MeridioConnector.CacheLifetime=vida útil de la caché:
-MeridioConnector.CacheLRUSize=Tamaño de caché LRU:
-MeridioConnector.minutes=minutos
-MeridioConnector.DocumentServer=Servidor de Documento
-MeridioConnector.RecordsServer=Servidor de Registros
-MeridioConnector.UserServiceServer=Servidor de Servicio de Usuario
-MeridioConnector.Credentials=Cartas credenciales
-MeridioConnector.PleaseSupplyAValidNumber=Por favor, facilite un número válido
-MeridioConnector.AValidMeridioUserNameHasTheForm=Un nombre de usuario válido Meridio tiene la forma <dominio>\\<usuario>
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=Por favor, rellene un documento nombre de servidor de administración Meridio
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=Por favor, rellene un nombre de servidor de administración de registros de Meridio
-MeridioConnector.PleaseFillInAUserServiceServerName=Por favor, rellene un Servicio de nombre de servidor del usuario
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=Por favor, facilite un número de puerto de gestión de documentos Meridio, o ninguno de forma predeterminada
-MeridioConnector.PleaseSupplyAUserServicePortNumber=Por favor, facilite un número de puerto de servicio del usuario , o ninguno de forma predeterminada
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=La conexión requiere un nombre de usuario válido Meridio de la forma <dominio>\\<usuario>
-MeridioConnector.ChooseACertificateFile=Elija un archivo de certificado
-MeridioConnector.DocumentWebserviceServerProtocol=Documento protocolo de servidor de servicios web:
-MeridioConnector.DocumentWebserviceServerName=Documento nombre del servidor de servicios web:
-MeridioConnector.DocumentWebserviceServerPort=Documento de puerto del servidor de servicio web:
-MeridioConnector.DocumentWebserviceLocation=Documento de la ubicación del servicio web:
-MeridioConnector.DocumentWebserviceServerProxyHost=Documento servicio web host proxy de servidor:
-MeridioConnector.DocumentWebserviceServerProxyPort=Documento servicio web puerto proxy del servidor:
-MeridioConnector.RecordWebserviceServerProtocol=Registre el protocolo de servidor del servicio web:
-MeridioConnector.RecordWebserviceServerName=Registre el nombre de servidor del servicio web:
-MeridioConnector.RecordWebserviceServerPort=Registre el puerto de servidor del servivio web:
-MeridioConnector.RecordWebserviceLocation=Registre la posición del servicio web:
-MeridioConnector.RecordWebserviceServerProxyHost=Registro de host de servidor proxy de servicio web:
-MeridioConnector.RecordWebserviceServerProxyPort=Registro de puerto de servidor proxy de servicio web:
-MeridioConnector.UserWebserviceServerName=Nombre de usuario del servidor de servicio web:
-MeridioConnector.UserWebserviceServerPort=Usuario puerto del servidor de servicio web:
-MeridioConnector.UserWebserviceLocation=Usuario ubicación del servicio web:
-MeridioConnector.UserWebserviceServerProxyHost=Usuario servicio web host proxy de servidor:
-MeridioConnector.UserWebserviceServerProxyPort=Servicio web Usuario puerto proxy del servidor:
-MeridioConnector.UserName=Nombre de usuario:
-MeridioConnector.Password=Contraseña:
-MeridioConnector.SSLCertificateList=Lista de certificados SSL:
-MeridioConnector.NoCertificatesPresent=No hay certificados actuales
-MeridioConnector.DeleteCert=eliminar cert 
-MeridioConnector.AddCert=Añadir cert
-MeridioConnector.Parameters=Parámetros:
-MeridioConnector.certificates= certificado(s)
-MeridioConnector.WebClient=Cliente Web
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=Por favor, rellene un nombre de servidor de cliente Meridio de web
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=Por favor, facilite un número Meridio puerto de cliente web, o ninguno de forma predeterminada
-MeridioConnector.DocumentWebserviceServerProtocol=Documento protocolo de servidor de servicios web:
-MeridioConnector.WebClientProtocol=Protocolo cliente Web
-MeridioConnector.WebClientServerName=Nombre del servidor cliente web:
-MeridioConnector.WebClientServerPort=Puerto del servidor cliente web:
-MeridioConnector.WebClientServerDocLocation=Cliente Web ubicación doc servidor:
-MeridioConnector.Parameters=Parámetros:
-MeridioConnector.SearchPaths=Rutas de búsqueda
-MeridioConnector.ContentTypes=Tipos de contenido
-MeridioConnector.Categories=Categorías
-MeridioConnector.DataTypes=Tipos de datos
-MeridioConnector.Security=Seguridad
-MeridioConnector.Metadata=metadatos
-MeridioConnector.SelectAFolderOrClassFirst=Seleccione una carpeta o una clase de primero
-MeridioConnector.AccessTokenCannotBeNull=Token de acceso no puede ser nulo
-MeridioConnector.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-MeridioConnector.DeletePath=eliminar ruta #
-MeridioConnector.NoPathsSpecified=No hay rutas especificadas.
-MeridioConnector.AddPath=Añadir ruta
-MeridioConnector.DeleteFromPath=Eliminar de la ruta
-MeridioConnector.AddToPath=Añadir a la trayectoria
-MeridioConnector.PickAFolder=-- Elija una carpeta --
-MeridioConnector.ServiceInterruption=interrupción del servicio: 
-MeridioConnector.MimeTypes=tipos Mime:
-MeridioConnector.Categories=Categorías:
-MeridioConnector.DataTypesToIngest=Los tipos de datos que ingieren:
-MeridioConnector.Documents=Documentos
-MeridioConnector.Records=Registros
-MeridioConnector.DocumentsAndRecords=Los documentos y registros
-MeridioConnector.Security2=Seguridad:
-MeridioConnector.Enabled=Activado
-MeridioConnector.Disabled=Imposibilitado
-MeridioConnector.DeleteToken=eliminar token #
-MeridioConnector.AddAccessToken=Añadir token de acceso
-MeridioConnector.IncludeAllMetadata=Incluir todos los metadatos:
-MeridioConnector.IncludeSpecified=Incluya especificada
-MeridioConnector.IncludeAll=Incluye todo
-MeridioConnector.Metadata=Metadatos:
-MeridioConnector.PathAttributeMetadataName=Atributo de camino metadata nombre:
-MeridioConnector.DeleteMapping=Suprima trazar un mapa #
-MeridioConnector.NoMappingsSpecified=No hay asignaciones especificadas
-MeridioConnector.AddToMappings=Añadir a asignaciones
-MeridioConnector.MatchRegexp=Regexp Partido:
-MeridioConnector.ReplaceString=Reemplazar cadena:
-MeridioConnector.Paths=Caminos:
-MeridioConnector.NoPathsSpecified=No hay rutas especificadas
-MeridioConnector.DataType=Tipo de datos:
-MeridioConnector.Categories=Categorías:
-MeridioConnector.MimeTypes=Tipos Mime:
-MeridioConnector.AccessTokens=Tokens de acceso:
-MeridioConnector.MetadataPropertiesToIngest=Propiedades de metadatos para ingresar:
-MeridioConnector.AllMetadata=Todos los metadatos
-MeridioConnector.MetadataPropertiesToIngest=Propiedades de metadatos para ingresar:
-MeridioConnector.NoMetadataPropertiesToIngest=No hay propiedades de metadatos para ingresar
-MeridioConnector.PathNameMetadataAttribute=Camino-atributo de nombre metadatos:
-MeridioConnector.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-MeridioConnector.PathValueMapping=Camino-asignación de valores:
-MeridioConnector.CacheLifetimeCannotBeNull=Vida útil de la caché no puede ser nulo
-MeridioConnector.CacheLifetimeMustBeAnInteger=Vida útil de la caché debe ser un entero
-MeridioConnector.CacheLRUSizeCannotBeNull=Tamaño de caché LRU no puede ser nulo
-MeridioConnector.CacheLRUSizeMustBeAnInteger=Tamaño de caché LRU debe ser un entero
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_ja_JP.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_ja_JP.properties
deleted file mode 100644
index 09968bc..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_ja_JP.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=アクセストークンが存在しません
-MeridioConnector.NoAccessTokensSpecified=アクセストークンが未定義です
-MeridioConnector.Cache=キャッシュ
-MeridioConnector.CacheLifetime=キャッシュライフタイム:
-MeridioConnector.CacheLRUSize=キャッシュLRUサイズ:
-MeridioConnector.minutes=分
-MeridioConnector.DocumentServer=ドキュメントサーバ
-MeridioConnector.RecordsServer=レコードサーバ
-MeridioConnector.UserServiceServer=ユーザサービスサーバ
-MeridioConnector.Credentials=証明書
-MeridioConnector.PleaseSupplyAValidNumber=数字を入力してください
-MeridioConnector.AValidMeridioUserNameHasTheForm=Meridioユーザ名を<ドメイン>\\<ユーザ>\形式で入力してください
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=Meridioドキュメント管理サーバ名を入力してください
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=Meridioレコード管理サーバ名を入力してくだし
-MeridioConnector.PleaseFillInAUserServiceServerName=ユーザサービスサーバ名を入力してください
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=Meridioドキュメント管理ポート番号を入力してください(デフォルト値を利用する場合は空白)
-MeridioConnector.PleaseSupplyAUserServicePortNumber=ユーザサービスポート番号を入力してください(デフォルト値を利用する場合は空白)
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=Meridioユーザ名を<ドメイン>\\<ユーザ>\形式で入力してください
-MeridioConnector.ChooseACertificateFile=証明書ファイルを選択してください
-MeridioConnector.DocumentWebserviceServerProtocol=ドキュメントwebserviceサーバプロトコル:
-MeridioConnector.DocumentWebserviceServerName=ドキュメントwebserviceサーバ名:
-MeridioConnector.DocumentWebserviceServerPort=ドキュメントwebserviceサーバポート:
-MeridioConnector.DocumentWebserviceLocation=ドキュメントwebserviceアドレス:
-MeridioConnector.DocumentWebserviceServerProxyHost=ドキュメントwebserviceサーバプロキシホスト:
-MeridioConnector.DocumentWebserviceServerProxyPort=ドキュメントwebserviceサーバプロキシポート:
-MeridioConnector.RecordWebserviceServerProtocol=レコードwebserviceサーバプロトコル:
-MeridioConnector.RecordWebserviceServerName=レコードwebserviceサーバ名:
-MeridioConnector.RecordWebserviceServerPort=レコードwebserviceサーバポート:
-MeridioConnector.RecordWebserviceLocation=レコードwebserviceアドレス:
-MeridioConnector.RecordWebserviceServerProxyHost=レコードwebserviceサーバプロキシホスト:
-MeridioConnector.RecordWebserviceServerProxyPort=レコードwebserviceサーバプロキシポート:
-MeridioConnector.UserWebserviceServerName=ユーザwebserviceサーバ名:
-MeridioConnector.UserWebserviceServerPort=ユーザwebserviceサーバポート:
-MeridioConnector.UserWebserviceLocation=ユーザwebserviceアドレス:
-MeridioConnector.UserWebserviceServerProxyHost=ユーザwebserviceサーバプロキシホスト:
-MeridioConnector.UserWebserviceServerProxyPort=ユーザwebserviceサーバプロキシポート:
-MeridioConnector.UserName=ユーザ名:
-MeridioConnector.Password=パスワード:
-MeridioConnector.SSLCertificateList=SSL証明書一覧:
-MeridioConnector.NoCertificatesPresent=証明書がありません
-MeridioConnector.DeleteCert=証明書を削除 
-MeridioConnector.AddCert=証明書を追加
-MeridioConnector.Parameters=引数:
-MeridioConnector.certificates=証明書
-MeridioConnector.WebClient=Webクライアント
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=Meridio webクライアントサーバ名を入力してください
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=Meridio webクライアントポート番号を入力してください(デフォルト値を利用する場合は空白)
-MeridioConnector.DocumentWebserviceServerProtocol=ドキュメントwebserviceサーバプロトコル:
-MeridioConnector.WebClientProtocol=Webクライアントプロトコル
-MeridioConnector.WebClientServerName=Webクライアントサーバ名:
-MeridioConnector.WebClientServerPort=Webクライアントサーバポート:
-MeridioConnector.WebClientServerDocLocation=Webクライアントサーバドキュメントアドレス:
-MeridioConnector.Parameters=引数:
-MeridioConnector.SearchPaths=検索パス
-MeridioConnector.ContentTypes=コンテンツタイプ
-MeridioConnector.Categories=カテゴリ
-MeridioConnector.DataTypes=データタイプ
-MeridioConnector.Security=セキュリティ
-MeridioConnector.Metadata=メタデータ
-MeridioConnector.SelectAFolderOrClassFirst=フォルダ又はクラスを選択してください
-MeridioConnector.AccessTokenCannotBeNull=アクセストークンを選択してください
-MeridioConnector.MatchStringCannotBeEmpty=パターンを入力してください
-MeridioConnector.DeletePath=パスを削除: #
-MeridioConnector.NoPathsSpecified=パスが指定されていません
-MeridioConnector.AddPath=パスを追加
-MeridioConnector.DeleteFromPath=パスから削除
-MeridioConnector.AddToPath=パスに追加
-MeridioConnector.PickAFolder=-- フォルダを選択 --
-MeridioConnector.ServiceInterruption=サービスをイントラプト: 
-MeridioConnector.MimeTypes=MIMEタイプ:
-MeridioConnector.Categories=カテゴリ:
-MeridioConnector.DataTypesToIngest=収集するデータタイプ:
-MeridioConnector.Documents=ドキュメント
-MeridioConnector.Records=レコード
-MeridioConnector.DocumentsAndRecords=ドキュメントとレコード
-MeridioConnector.Security2=セキュリティ:
-MeridioConnector.Enabled=有効
-MeridioConnector.Disabled=無効
-MeridioConnector.DeleteToken=トークンを削除: #
-MeridioConnector.AddAccessToken=アクセストークを追加
-MeridioConnector.IncludeAllMetadata=すべてのメタデータを含む:
-MeridioConnector.IncludeSpecified=指定した項目を含む
-MeridioConnector.IncludeAll=すべてを含む
-MeridioConnector.Metadata=メタデータ:
-MeridioConnector.PathAttributeMetadataName=パス属性メタデータ名:
-MeridioConnector.DeleteMapping=マップを削除: #
-MeridioConnector.NoMappingsSpecified=マップが指定されていません
-MeridioConnector.AddToMappings=マップに追加
-MeridioConnector.MatchRegexp=パターン:
-MeridioConnector.ReplaceString=置換文字列:
-MeridioConnector.Paths=パス:
-MeridioConnector.NoPathsSpecified=パスが指定されていません
-MeridioConnector.DataType=データタイプ:
-MeridioConnector.Categories=カテゴリ:
-MeridioConnector.MimeTypes=MIMEタイプ:
-MeridioConnector.AccessTokens=アクセストークン:
-MeridioConnector.MetadataPropertiesToIngest=収集するメタデータプロパティ:
-MeridioConnector.AllMetadata=すべてのメタデータ
-MeridioConnector.MetadataPropertiesToIngest=収集するメタデータプロパティ:
-MeridioConnector.NoMetadataPropertiesToIngest=収集するメタデータプロパティがありません
-MeridioConnector.PathNameMetadataAttribute=Path-nameメタデータ属性:
-MeridioConnector.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性が指定されていません
-MeridioConnector.PathValueMapping=Path-valueマップ:
-MeridioConnector.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-MeridioConnector.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-MeridioConnector.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-MeridioConnector.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
-
diff --git a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_zh_CN.properties b/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_zh_CN.properties
deleted file mode 100644
index d74ebfc..0000000
--- a/connectors/meridio/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/meridio/common_zh_CN.properties
+++ /dev/null
@@ -1,123 +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.
-
-MeridioConnector.NoAccessTokensPresent=访问令牌不存在
-MeridioConnector.NoAccessTokensSpecified=访问令牌未指定
-MeridioConnector.Cache=缓存
-MeridioConnector.CacheLifetime=缓存寿命: 
-MeridioConnector.CacheLRUSize=缓存LRU大小: 
-MeridioConnector.minutes=分
-MeridioConnector.DocumentServer=文档服务器
-MeridioConnector.RecordsServer=记录服务器
-MeridioConnector.UserServiceServer=用户服务服务器
-MeridioConnector.Credentials=凭证
-MeridioConnector.PleaseSupplyAValidNumber=请输入有效的数字
-MeridioConnector.AValidMeridioUserNameHasTheForm=Meridio用户名需指定为 <域>\\<用户>\ 的格式
-MeridioConnector.PleaseFillInAMeridioDocumentManagementServerName=请输入Meridio文档管理服务器名
-MeridioConnector.PleaseFillInAMeridioRecordsManagementServerName=请输入Meridio记录管理服务器名
-MeridioConnector.PleaseFillInAUserServiceServerName=请输入用户服务服务器名
-MeridioConnector.PleaseSupplyAMeridioDocumentManagementPortNumber=请输入Meridio文档管理端口号(如使用缺省值则设为空)
-MeridioConnector.PleaseSupplyAUserServicePortNumber=请输入用户服务端口号(如使用缺省值则设为空)
-MeridioConnector.TheConnectionRequiresAValidMeridioUserNameOfTheForm=连接的Meridio用户名需指定为 <域>\\<用户>\ 的格式
-MeridioConnector.ChooseACertificateFile=请选择证书文件
-MeridioConnector.DocumentWebserviceServerProtocol=文档Web服务服务器协议: 
-MeridioConnector.DocumentWebserviceServerName=文档Web服务服务器名: 
-MeridioConnector.DocumentWebserviceServerPort=文档Web服务服务器端口: 
-MeridioConnector.DocumentWebserviceLocation=文档Web服务位置: 
-MeridioConnector.DocumentWebserviceServerProxyHost=文档Web服务服务器代理主机: 
-MeridioConnector.DocumentWebserviceServerProxyPort=文档Web服务服务器代理端口: 
-MeridioConnector.RecordWebserviceServerProtocol=记录Web服务服务器协议: 
-MeridioConnector.RecordWebserviceServerName=记录Web服务服务器名: 
-MeridioConnector.RecordWebserviceServerPort=记录Web服务服务器端口: 
-MeridioConnector.RecordWebserviceLocation=记录Web服务位置: 
-MeridioConnector.RecordWebserviceServerProxyHost=记录Web服务服务器代理主机: 
-MeridioConnector.RecordWebserviceServerProxyPort=记录Web服务服务器代理端口: 
-MeridioConnector.UserWebserviceServerName=用户Web服务服务器名: 
-MeridioConnector.UserWebserviceServerPort=用户Web服务服务器端口: 
-MeridioConnector.UserWebserviceLocation=用户Web服务位置: 
-MeridioConnector.UserWebserviceServerProxyHost=用户Web服务服务器代理主机: 
-MeridioConnector.UserWebserviceServerProxyPort=用户Web服务服务器代理端口: 
-MeridioConnector.UserName=用户名: 
-MeridioConnector.Password=密码: 
-MeridioConnector.SSLCertificateList=SSL证书列表: 
-MeridioConnector.NoCertificatesPresent=证书不存在
-MeridioConnector.DeleteCert=删除证书 
-MeridioConnector.AddCert=添加证书
-MeridioConnector.Parameters=参数: 
-MeridioConnector.certificates=证书
-MeridioConnector.WebClient=Web客户端
-MeridioConnector.PleaseFillInAMeridioWebClientServerName=请输入Meridio的Web客户端服务器名
-MeridioConnector.PleaseSupplyAMeridioWebClientPortNumberOrNoneForDefault=请输入Meridio的Web客户端端口号(如使用缺省值则设为空)
-MeridioConnector.DocumentWebserviceServerProtocol=文档Web服务服务器协议: 
-MeridioConnector.WebClientProtocol=Web客户端协议
-MeridioConnector.WebClientServerName=Web客户端服务器名: 
-MeridioConnector.WebClientServerPort=Web客户端服务器端口: 
-MeridioConnector.WebClientServerDocLocation=Web客户端服务器文档位置: 
-MeridioConnector.Parameters=参数: 
-MeridioConnector.SearchPaths=検索路径
-MeridioConnector.ContentTypes=文档类型
-MeridioConnector.Categories=分类
-MeridioConnector.DataTypes=数据类型
-MeridioConnector.Security=安全
-MeridioConnector.Metadata=元数据
-MeridioConnector.SelectAFolderOrClassFirst=请先选择文件夹或类
-MeridioConnector.AccessTokenCannotBeNull=访问令牌不能为空
-MeridioConnector.MatchStringCannotBeEmpty=匹配字符串不能为空
-MeridioConnector.DeletePath=删除路径:  #
-MeridioConnector.NoPathsSpecified=路径未指定
-MeridioConnector.AddPath=添加路径
-MeridioConnector.DeleteFromPath=从路径删除
-MeridioConnector.AddToPath=添加到路径
-MeridioConnector.PickAFolder=-- 选择文件夹 --
-MeridioConnector.ServiceInterruption=服务中断:  
-MeridioConnector.MimeTypes=MIME类型: 
-MeridioConnector.Categories=分类: 
-MeridioConnector.DataTypesToIngest=爬取对象数据类型: 
-MeridioConnector.Documents=文档
-MeridioConnector.Records=记录
-MeridioConnector.DocumentsAndRecords=文档和记录
-MeridioConnector.Security2=安全: 
-MeridioConnector.Enabled=有效
-MeridioConnector.Disabled=无效
-MeridioConnector.DeleteToken=删除令牌:  #
-MeridioConnector.AddAccessToken=添加访问令牌
-MeridioConnector.IncludeAllMetadata=包含所有元数据: 
-MeridioConnector.IncludeSpecified=包含指定项目
-MeridioConnector.IncludeAll=包含所有
-MeridioConnector.Metadata=元数据: 
-MeridioConnector.PathAttributeMetadataName=路径属性元数据名: 
-MeridioConnector.DeleteMapping=删除映射:  #
-MeridioConnector.NoMappingsSpecified=映射未指定
-MeridioConnector.AddToMappings=添加到映射
-MeridioConnector.MatchRegexp=匹配正则表达式: 
-MeridioConnector.ReplaceString=替换字符串: 
-MeridioConnector.Paths=路径: 
-MeridioConnector.NoPathsSpecified=路径未指定
-MeridioConnector.DataType=数据类型: 
-MeridioConnector.Categories=分类: 
-MeridioConnector.MimeTypes=MIME类型: 
-MeridioConnector.AccessTokens=访问令牌: 
-MeridioConnector.MetadataPropertiesToIngest=爬取对象元数据属性: 
-MeridioConnector.AllMetadata=所有元数据
-MeridioConnector.MetadataPropertiesToIngest=爬取对象元数据属性: 
-MeridioConnector.NoMetadataPropertiesToIngest=没有爬取对象元数据属性
-MeridioConnector.PathNameMetadataAttribute=路径名元数据属性: 
-MeridioConnector.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-MeridioConnector.PathValueMapping=路径值映射: 
-MeridioConnector.CacheLifetimeCannotBeNull=缓存寿命不能为空
-MeridioConnector.CacheLifetimeMustBeAnInteger=缓存寿命必须为整数
-MeridioConnector.CacheLRUSizeCannotBeNull=缓存LRU大小不能为空
-MeridioConnector.CacheLRUSizeMustBeAnInteger=缓存LRU大小必须为整数
-
diff --git a/connectors/meridio/integration/Download readme.txt b/connectors/meridio/integration/Download readme.txt
deleted file mode 100644
index cd31de5..0000000
--- a/connectors/meridio/integration/Download readme.txt
+++ /dev/null
@@ -1,35 +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.
-
-The ManifoldCF Meridio Plugin is required for the Meridio authority connector
-to properly work with a Meridio system.  Its function is to provide lookup of user
-ACLs that is fast enough to actually use.  Unfortunately, although work on
-the plugin was directed and paid-for by MetaCarta, Inc., under terms where
-MetaCarta, Inc. technically owned the source code, the source code was
-never transferred to MetaCarta, Inc., and the compiled plugin installation package is
-all that is currently available.  Although MetaCarta, Inc. granted the compiled
-plugin installation package to the Apache Software Foundation, this does not
-meet Apache's guidelines for what "open source" should mean.
-
-The Apache ManifoldCF project has thus chosen to move this installation package for this plugin
-to the Google Code package called "manifoldcf-meridio-plugin", until such
-time as we can obtain the source files or redevelop them.  You may obtain
-the plugin and its applicable licenses by checking out a URL using
-Subversion (svn), as follows:
-
-svn co https://github.com/DaddyWri/manifoldcf-meridio-plugin.git/trunk manifoldcf-meridio-plugin
-
-License and building instructions are to be found in this package, and installation instructions
-can be found right here in the file "Installation readme.txt".
diff --git a/connectors/meridio/integration/Installation readme.txt b/connectors/meridio/integration/Installation readme.txt
deleted file mode 100644
index 1a3797b..0000000
--- a/connectors/meridio/integration/Installation readme.txt
+++ /dev/null
@@ -1,80 +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.
-
-======================================================================
- MetaCartaWS
- Installation Guide
- 1st September 2007
-======================================================================
-
-PREREQUISITES
-==============
-
-The .NET framework version 1.1 should be installed
-
-
-INSTALL INSTRUCTIONS
-====================
-
-1. Web Service Installation
-
-To install the MetaCarta web service navigate to the 'Web Service\Installation files' folder and run the 'setup.exe' file
-The installer will guide you through the rest of the process, We recommend you do not change the default settings.
-
-IMPORTANT
-=========
-When the installation is complete navigate to the virtual directory chosen for installation (default: C:\Inetpub\wwwroot\MetaCartaWebService)
-Find the following text at the bottom of the 'Web.config' document
-
-<appSettings>
-	<add key="ConnectionInfo" value=..."
-	<add key="MetaCartaWebService.DMWebRef.MeridioDM" value=..."
- </appSettings>
-
-amend these values to be a valid connection string to the Meridio DMSDB and a valid location to the Meridio DM web service respectively
-
-
-2. Test Harness Installation
-To install the test harness navigate to the 'Test Harness\Installation files' folder and run the 'setup.exe' file
-The installer will guide you through the rest of the process. We recommend you do not change the default settings.
-
-IMPORTANT
-=========
-When the installation is complete navigate to your chosen installation path (default: C:\Program Files\Meridio\MetaCarta Test Harness\)
-If the MetaCarta webservice has been installed on a different machine to the test harness and/or you have chosen a virtual directory other than the default
-then the 'MetaCartaTestHarness.exe.config' file will require the following changes:
-
-Amend the key value '<add key="MetaCartaTestHarness.MetaCartaWebService.MetaCarta value=...' to point to the correct location where the MetaCarta web service is installed.
-Amend the key value '<add key="MetaCartaTestHarness.DMWebRef.MeridioDM" value=...' to point to the correct location where the meridio DM web service is installed.
-
-The test harness can be executed by running the file 'MetaCartaTestHarness.exe'
-
-
-
-
-UNINSTALL INSTRUCTIONS
-======================
-
-1. MetaCarta web service uninstall
-Go to: control panel --> add/remove programs --> MetaCarta WebService --> Remove
-The uninstaller will guide you through the rest of the process
-
-
-2. Test Harness uninstall
-Go to: control panel --> add/remove programs --> MetaCarta Test Harness --> Remove
-The uninstaller will guide you through the rest of the process
-
-
-
diff --git a/connectors/meridio/wsdls/DMDataSet_castor.xsd b/connectors/meridio/wsdls/DMDataSet_castor.xsd
deleted file mode 100644
index c86c91f..0000000
--- a/connectors/meridio/wsdls/DMDataSet_castor.xsd
+++ /dev/null
@@ -1,950 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<xs:schema xmlns:mstns="http://www.meridio.com/DMDataSet.xsd"
-           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
-           xmlns="http://www.meridio.com/DMDataSet.xsd"
-           attributeFormDefault="qualified"
-           elementFormDefault="qualified"
-           targetNamespace="http://www.meridio.com/DMDataSet.xsd"
-          id="DMDataSet"
-          xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-
-  <xs:element name="DMDataSet">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="ACCESSCONTROL" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="ACTIVITIES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CATEGORIES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CATEGORIES_EXTRA" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINERS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_CASCADEFAILURES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_CHILDCONTAINERS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_CONTAINERREFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_CUSTOMPROPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_DOCUMENTREFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_KEYWORDS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTAINER_STOREDSEARCHREFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTENT_OPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="CONTENT_TERMS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="DOCUMENTS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="DOCUMENT_CASCADEFAILURES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="DOCUMENT_CUSTOMPROPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="DOCUMENT_KEYWORDS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="DOCUMENT_POLICIES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="DOCUMENT_REFERENCEPATHS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="GROUPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="GROUP_CUSTOMPROPS" maxOccurs="unbounded" minOccurs="0"/>
-	<xs:element ref="HITHIGHLIGHTINFO" maxOccurs="unbounded" minOccurs="0"/>
-	<xs:element ref="HITHIGHLIGHTTABLES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="INDEXACTION" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="KEYWORDS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="LOCKS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="LOCK_CUSTOMPROPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="LOOKUPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="LOOKUP_VALUES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="POLICIES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="PROPERTYDEFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="PROPERTY_OPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="PROPERTY_TERMS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="RELATIONSHIPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="RELATIONSHIPS_EXTRA" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="RENDITIONDEFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="RENDITIONS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="RENDITIONS_EXTRA" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="RESULTDEFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCH_CONTAINERS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCH_GROUPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCH_KEYWORDS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCH_RENDITIONDEFS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCHRESULTS_CONTAINERS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCHRESULTS_DOCUMENTS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCHRESULTS_GROUPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="SEARCHRESULTS_USERS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="STOREDSEARCHES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="USERS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="USER_CUSTOMPROPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="VERSIONS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="VERSION_CUSTOMPROPS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="STOREDSEARCHES_EXTRA" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="VERSIONS_EXTRA" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="VERSIONS_SIGNATURES" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="KOTHERSYSTEM" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="KREPLICATETOSLAVE" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="KUNRESOLVEDGROUPACCOUNTS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="KUNRESOLVEDUSERACCOUNTS" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="KEDCCONFIG" maxOccurs="unbounded" minOccurs="0"/>
-	<xs:element ref="RELATIONSHIP_CLASSES" maxOccurs="unbounded" minOccurs="0"/>
-	<xs:element ref="SYSTEMINFO" maxOccurs="1" minOccurs="0"/>
-
-     </xs:sequence>
-    </xs:complexType>
-   </xs:element>
-
-
-
-       <xs:element name="ACCESSCONTROL">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="permission" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="groupId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="userId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="ACTIVITIES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="objectId2" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="objectId3" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="objectId4" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="objectId5" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="objectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="activity" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="cando" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CATEGORIES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_objectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_creationDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_title" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_W_defaultWorkflowProcess" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_W_enforceDefaultProcess" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_W_workflowInvocationMode" type="xs:long" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CATEGORIES_EXTRA">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="enforceDefaultAccess" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINERS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_W_title" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_creationDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_isShared" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_containerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_ownerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_ownerName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_folderType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_W_inherit" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_W_cascadeBehaviour" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_homeSystemId" type="xs:int" />
-              <xs:element minOccurs="0" name="PROP_homeSystemName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_globalId" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_lastSynchTime" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="newOwnerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="cascadeType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="keywordCascadeType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="customPropertyCascadeType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_fullPath" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_CASCADEFAILURES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="path" type="xs:string" />
-              <xs:element minOccurs="0" name="errorCode" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="errorDesc" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_CHILDCONTAINERS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="containerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="childId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_CONTAINERREFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="ContainerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="ContainerRefId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_CUSTOMPROPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="valueColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textValue" type="xs:string" />
-              <xs:element minOccurs="0" name="numValue" type="xs:long" />
-              <xs:element minOccurs="0" name="dateValue" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_DOCUMENTREFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="ContainerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="DocumentRefId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_KEYWORDS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="containerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="keywordId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTAINER_STOREDSEARCHREFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="ContainerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="StoredSearchRefId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTENT_OPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="parentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="operator" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="CONTENT_TERMS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="parentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="word_text" type="xs:string" />
-              <xs:element minOccurs="0" name="expression_text" type="xs:string" />
-              <xs:element minOccurs="0" name="phrase_text" type="xs:string" />
-              <xs:element minOccurs="0" name="phrase_type" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="phrase_proximity" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="xword_TV_Tag" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_TV_Value" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_TWV_Tag" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_TWV_Root" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_AV_Tag" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_AV_Attribute" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_AV_Value" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_AWV_Tag" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_AWV_Attribute" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_AWV_Root" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_PV_Tag" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_PV_Path" type="xs:string" />
-              <xs:element minOccurs="0" name="xword_PV_Value" type="xs:string" />
-              <xs:element minOccurs="0" name="termType" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="DOCUMENTS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_documentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_addedByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_dateAdded" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_title" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_onlineVersionsSize" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_onlineViewsSize" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_markedForDelete" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_originalFileName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_defaultLockFileName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_latestVersionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_isLocked" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_onlineVersionsCount" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_W_indexingType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_categoryName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_ownerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_ownerName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_recordType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_lastModifiedDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_lastModifiedByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_lastModifiedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_Author" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_workflowProcess" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_documentPolicyId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_W_cascadeBehaviour" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_W_documentDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_A_homeSystemId" type="xs:int" />
-              <xs:element minOccurs="0" name="PROP_homeSystemName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_globalId" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_lastSynchTime" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="newDocCategoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="newOwnerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_relationshipCount" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_latestVersionFingerprint" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_isCollaborativeCopy" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="DOCUMENT_CASCADEFAILURES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="path" type="xs:string" />
-              <xs:element minOccurs="0" name="errorCode" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="errorDesc" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="DOCUMENT_CUSTOMPROPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="valueColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textValue" type="xs:string" />
-              <xs:element minOccurs="0" name="numValue" type="xs:long" />
-              <xs:element minOccurs="0" name="dateValue" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="DOCUMENT_KEYWORDS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="keywordId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="DOCUMENT_POLICIES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="documentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="policyId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="DOCUMENT_REFERENCEPATHS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="containerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="path" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="GROUPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_groupName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_groupId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_directoryName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_objectClass" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_active" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_groupGUID" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="GROUP_CUSTOMPROPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="valueColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textValue" type="xs:string" />
-              <xs:element minOccurs="0" name="numValue" type="xs:long" />
-              <xs:element minOccurs="0" name="dateValue" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="HITHIGHLIGHTINFO">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="startPos" type="xs:unsignedInt" />
-              <xs:element name="endPos" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="HITHIGHLIGHTTABLES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="translationTable" type="xs:base64Binary" />
-              <xs:element minOccurs="0" name="vccTable" type="xs:base64Binary" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="INDEXACTION">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="versionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="renditionDefId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="indexAction" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="immediate" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="KEYWORDS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="title" type="xs:string" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="keywordId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="parentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="hierarchyName" type="xs:string" />
-              <xs:element minOccurs="0" name="keywordPath" type="xs:string" />
-              <xs:element minOccurs="0" name="hasChildren" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="LOCKS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_userName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_dateLocked" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_filePath" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_clientWorkstationName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_userId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="LOCK_CUSTOMPROPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="valueColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textValue" type="xs:string" />
-              <xs:element minOccurs="0" name="numValue" type="xs:long" />
-              <xs:element minOccurs="0" name="dateValue" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="LOOKUPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_title" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_creationDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_lookupId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="LOOKUP_VALUES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="lookupId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="POLICIES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_maxOnlineVersions" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_numCompressedVersions" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_description" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_offlineDecision" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_name" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_policyId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_policyType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_duration" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_durationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_W_deleteDocuments" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_W_offlineMinorVersions" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="PROPERTYDEFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="type" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="displayName" type="xs:string" />
-              <xs:element minOccurs="0" name="lookupId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="isReadOnly" type="xs:boolean" />
-              <xs:element minOccurs="0" name="isRequired" type="xs:boolean" />
-              <xs:element minOccurs="0" name="tableName" type="xs:string" />
-              <xs:element minOccurs="0" name="columnName" type="xs:string" />
-              <xs:element minOccurs="0" name="lupTable" type="xs:string" />
-              <xs:element minOccurs="0" name="lupTextColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="lupKeyColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textDefault" type="xs:string" />
-              <xs:element minOccurs="0" name="textMaxLength" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="numDefault" type="xs:long" />
-              <xs:element minOccurs="0" name="numMin" type="xs:long" />
-              <xs:element minOccurs="0" name="numMax" type="xs:long" />
-              <xs:element minOccurs="0" name="dateDefault" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="dateMin" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="dateMax" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="keyColumn1" type="xs:string" />
-              <xs:element minOccurs="0" name="keyColumn2" type="xs:string" />
-              <xs:element minOccurs="0" name="keyColumn3" type="xs:string" />
-              <xs:element minOccurs="0" name="keyColumn4" type="xs:string" />
-              <xs:element minOccurs="0" name="keyColumn5" type="xs:string" />
-              <xs:element minOccurs="0" name="numKeys" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="PROPERTY_OPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="parentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="operator" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="PROPERTY_TERMS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="parentId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="termType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="str_value" type="xs:string" />
-              <xs:element minOccurs="0" name="str_relation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="num_value" type="xs:long" />
-              <xs:element minOccurs="0" name="num_relation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="date_value" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="date_interval" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="date_relation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="isVersionProperty" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RELATIONSHIPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_A_description" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_A_strength" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_A_contains" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_A_class" type="xs:long" />
-              <xs:element minOccurs="0" name="sourceDocId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="sourceVersionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="destDocId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="destVersionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_className" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_classChildName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RELATIONSHIPS_EXTRA">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="sourceDocId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="sourceVersionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="destDocId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="destVersionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="isCurrent" type="xs:boolean" />
-              <xs:element minOccurs="0" name="order" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="firstApplicableVersion" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="currentVersionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="type" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RENDITIONDEFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_description" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_name" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_type" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RENDITIONS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="versionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="renditionDefId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_creationDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_formatId" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_originalFileSize" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_storedFileSize" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_W_applicationString" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_mimeType" type="xs:string" />
-              <xs:element minOccurs="0" name="newRenditionFileName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RENDITIONS_EXTRA">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="versionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="renditionDefId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="indexState" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RESULTDEFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="sortAscending" type="xs:boolean" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="isVersionProperty" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCH_CONTAINERS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="storedSearchId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="containerId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCH_GROUPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="storedSearchId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="groupId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCH_KEYWORDS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="storedSearchId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="keywordId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCH_RENDITIONDEFS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="storedSearchId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="renditionDefId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCHRESULTS_CONTAINERS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="containerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="str_value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCHRESULTS_DOCUMENTS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="versionId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="renditionDefId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="str_value" type="xs:string" />
-              <xs:element minOccurs="0" name="type" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="rank" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCHRESULTS_GROUPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="groupId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="str_value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SEARCHRESULTS_USERS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="userId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="str_value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="STOREDSEARCHES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_title" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_W_isSearchAgent" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_W_searchAgentPriority" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_lastExecuteDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_ownerId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_ownerName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="SYSTEMINFO">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="systemName" type="xs:string" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="isLockedDown" type="xs:boolean" />
-              <xs:element minOccurs="0" name="usesReplication" type="xs:boolean" />
-              <xs:element minOccurs="0" name="webTransferProtocol" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="defaultWebServer" type="xs:string" />
-              <xs:element minOccurs="0" name="URLTemplate" type="xs:string" />
-              <xs:element minOccurs="0" name="URLType" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="defaultPolicy" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="webClientURL" type="xs:string" />
-              <xs:element minOccurs="0" name="sharePointURL" type="xs:unsignedInt" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="USERS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_loginName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_enabled" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_languageId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_emailAddress" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_passwordExpire" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_realName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_createdByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_directoryName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_objectClass" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_userPrincipalName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_privateCertificateStore" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_homeSystem" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_defaultPolicy" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_userGUID" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="USER_CUSTOMPROPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="valueColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textValue" type="xs:string" />
-              <xs:element minOccurs="0" name="numValue" type="xs:long" />
-              <xs:element minOccurs="0" name="dateValue" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="VERSIONS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="PROP_versionNumber" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_checkedInByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_checkedInDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_comment" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_formatId" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_lastAccessDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_lastAccessedByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_originalFileSize" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_storedFileSize" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_fileAvailability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="PROP_W_reclaimPending" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_reclaimedDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="PROP_W_keepOnline" type="xs:boolean" />
-              <xs:element minOccurs="0" name="PROP_W_versionMark" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_referenceCount" type="xs:long" />
-              <xs:element minOccurs="0" name="PROP_checkedInByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_lastAccessedByUserId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_W_applicationString" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_W_mimeType" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_MajorVersionNumber" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="PROP_MinorVersionNumber" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="newVersionFileName" type="xs:string" />
-              <xs:element minOccurs="0" name="PROP_A_fingerprint" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="VERSION_CUSTOMPROPS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="objectId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="objectId2" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="propertyName" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="valueColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="textValue" type="xs:string" />
-              <xs:element minOccurs="0" name="numValue" type="xs:long" />
-              <xs:element minOccurs="0" name="dateValue" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="STOREDSEARCHES_EXTRA">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="keywordOperatorIsAND" type="xs:boolean" />
-              <xs:element minOccurs="0" name="searchSubKeywords" type="xs:boolean" />
-              <xs:element minOccurs="0" name="type" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="permission" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="searchAll" type="xs:boolean" />
-              <xs:element minOccurs="0" name="scope" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="searchChildren" type="xs:boolean" />
-              <xs:element minOccurs="0" name="useThesaurus" type="xs:boolean" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="VERSIONS_EXTRA">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="versionNumber" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="indexState" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="VERSIONS_SIGNATURES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="docId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="versionNumber" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="sigId" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="Signer" type="xs:string" />
-              <xs:element minOccurs="0" name="Issuer" type="xs:string" />
-              <xs:element minOccurs="0" name="CertStartDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="CertEndDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="SignatureLength" type="xs:unsignedInt" />
-              <xs:element minOccurs="0" name="SigData" type="xs:base64Binary" />
-              <xs:element minOccurs="0" name="DateSigned" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="VerStatus" type="xs:boolean" />
-              <xs:element minOccurs="0" name="LastVerDate" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="KOTHERSYSTEM">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element msdata:DataType="System.Guid, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="systemGUID" type="xs:string" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="isSlave" type="xs:short" />
-              <xs:element minOccurs="0" name="unregister" type="xs:short" />
-              <xs:element minOccurs="0" name="webServicesUrl" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="KREPLICATETOSLAVE">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="slaveID" type="xs:int" />
-              <xs:element name="objectID" type="xs:int" />
-              <xs:element name="objectType" type="xs:short" />
-              <xs:element minOccurs="0" name="priority" type="xs:short" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="createdByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="dateCreated" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="allContainer" type="xs:short" />
-              <xs:element minOccurs="0" name="allDocument" type="xs:short" />
-              <xs:element minOccurs="0" name="doIndex" type="xs:short" />
-              <xs:element minOccurs="0" name="state" type="xs:short" />
-              <xs:element minOccurs="0" name="stateTimeStamp" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="taskID" type="xs:int" />
-              <xs:element minOccurs="0" name="lastDateModified" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastModifiedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="lastModifiedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="toBeDeleted" type="xs:short" />
-              <xs:element minOccurs="0" name="sendDocuments" type="xs:short" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="KUNRESOLVEDGROUPACCOUNTS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:DataType="System.Guid, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="groupGUID" type="xs:string" />
-              <xs:element name="groupName" type="xs:string" />
-              <xs:element name="objectType" type="xs:short" />
-              <xs:element name="localKey" type="xs:int" />
-              <xs:element name="usedBy" type="xs:short" />
-              <xs:element minOccurs="0" name="permission" type="xs:short" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="KUNRESOLVEDUSERACCOUNTS">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:ReadOnly="true" msdata:AutoIncrement="true" name="id" type="xs:int" />
-              <xs:element msdata:DataType="System.Guid, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="userGUID" type="xs:string" />
-              <xs:element name="userName" type="xs:string" />
-              <xs:element name="objectType" type="xs:short" />
-              <xs:element name="localKeyPart1" type="xs:int" />
-              <xs:element minOccurs="0" name="localKeyPart2" type="xs:int" />
-              <xs:element minOccurs="0" name="localKeyPart3" type="xs:int" />
-              <xs:element name="usedBy" type="xs:short" />
-              <xs:element minOccurs="0" name="permission" type="xs:short" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="KEDCCONFIG">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:ReadOnly="true" msdata:AutoIncrement="true" name="id" type="xs:int" />
-              <xs:element name="type" type="xs:unsignedInt" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element name="value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="RELATIONSHIP_CLASSES">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="childName" type="xs:string" />
-              <xs:element minOccurs="0" name="strength" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="type" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-
-</xs:schema>
\ No newline at end of file
diff --git a/connectors/meridio/wsdls/MeridioDMWS_axis.wsdl b/connectors/meridio/wsdls/MeridioDMWS_axis.wsdl
deleted file mode 100644
index d31dc6e..0000000
--- a/connectors/meridio/wsdls/MeridioDMWS_axis.wsdl
+++ /dev/null
@@ -1,5512 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<wsdl:definitions xmlns:s1="http://microsoft.com/wsdl/types/" 
-                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
-                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
-                  xmlns:s="http://www.w3.org/2001/XMLSchema"
-                  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
-                  xmlns:i0="http://www.meridio.com/DMDataSet.xsd"
-                  xmlns:tns="http://www.meridio.com/MeridioDMWS"
-                  xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
-                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
-                  targetNamespace="http://www.meridio.com/MeridioDMWS"
-                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-
-  <wsdl:import namespace="http://www.meridio.com/DMDataSet.xsd" location="DMDataSet.xsd" />
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://www.meridio.com/MeridioDMWS">
-      <s:import namespace="http://www.meridio.com/DMDataSet.xsd" />
-      <s:import namespace="http://microsoft.com/wsdl/types/" />
-      <s:element name="Login">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="clientWorkstation" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="LoginResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="LoginResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="LoginUnified">
-        <s:complexType />
-      </s:element>
-      <s:element name="LoginUnifiedResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="LoginUnifiedResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="LoginUnifiedWithClientWorkstation">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="clientWorkstation" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="LoginUnifiedWithClientWorkstationResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="LoginUnifiedWithClientWorkstationResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="LogoutWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="LogoutWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="Logout">
-        <s:complexType />
-      </s:element>
-      <s:element name="LogoutResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="MeridioCredentialHeader" type="tns:MeridioCredentialHeader" />
-      <s:complexType name="MeridioCredentialHeader">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="1" name="token" type="s:string" />
-        </s:sequence>
-      </s:complexType>
-      <s:element name="ApplyChangesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="changes">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyChangesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChanges">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="changes">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyChangesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObject2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="additionInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="uploadInfo" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="major" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObject2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddObject2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObject2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="additionInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="uploadInfo" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="major" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObject2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddObject2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObject">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="additionInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="uploadInfo" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObjectResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddObjectResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObjectWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="additionInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="uploadInfo" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddObjectWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddObjectWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteObjectWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="tns:dmObjectType" />
-            <s:element minOccurs="1" maxOccurs="1" name="itemKey" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="dmObjectType">
-        <s:restriction base="s:string">
-          <s:enumeration value="CONTAINER" />
-          <s:enumeration value="DOCUMENT" />
-          <s:enumeration value="GROUP" />
-          <s:enumeration value="LOCK" />
-          <s:enumeration value="POLICY" />
-          <s:enumeration value="RENDITION" />
-          <s:enumeration value="RENDITIONDEF" />
-          <s:enumeration value="reserved1" />
-          <s:enumeration value="reserved2" />
-          <s:enumeration value="STOREDSEARCH" />
-          <s:enumeration value="reserved3" />
-          <s:enumeration value="reserved4" />
-          <s:enumeration value="reserved5" />
-          <s:enumeration value="USER" />
-          <s:enumeration value="reserved6" />
-          <s:enumeration value="VERSION" />
-          <s:enumeration value="RELATIONSHIP" />
-          <s:enumeration value="CATEGORY" />
-          <s:enumeration value="LOOKUP" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="DeleteObjectWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="DeleteObject">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="tns:dmObjectType" />
-            <s:element minOccurs="1" maxOccurs="1" name="itemKey" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteObjectResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="DeleteVersionWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteVersionWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="DeleteVersion">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteVersionResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CancelVersionDeletionWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="versions">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelVersionDeletionWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CancelVersionDeletionWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelVersionDeletion">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="versions">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelVersionDeletionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CancelVersionDeletionResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelDocumentDeletionWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="docs">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelDocumentDeletionWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CancelDocumentDeletionWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelDocumentDeletion">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="docs">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelDocumentDeletionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CancelDocumentDeletionResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocumentWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="versionIds" type="tns:ArrayOfUnsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyReferences" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyIndexing" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyRenditions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copySourceRelationships" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyDestinationRelationships" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="relationshipToCopiedDoc" type="tns:RelationshipInfo" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:complexType name="ArrayOfUnsignedInt">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="unsignedInt" type="s:unsignedInt" />
-        </s:sequence>
-      </s:complexType>
-      <s:complexType name="RelationshipInfo">
-        <s:sequence>
-          <s:element minOccurs="1" maxOccurs="1" name="type" type="tns:dmRelationshipType" />
-          <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-          <s:element minOccurs="1" maxOccurs="1" name="strength" type="tns:dmRelationshipStrength" />
-          <s:element minOccurs="1" maxOccurs="1" name="contains" type="s:boolean" />
-          <s:element minOccurs="1" maxOccurs="1" name="relationshipClass" type="s:int" />
-          <s:element minOccurs="1" maxOccurs="1" name="order" type="s:unsignedInt" />
-          <s:element minOccurs="1" maxOccurs="1" name="useOrder" type="s:boolean" />
-        </s:sequence>
-      </s:complexType>
-      <s:simpleType name="dmRelationshipType">
-        <s:restriction base="s:string">
-          <s:enumeration value="LATEST" />
-          <s:enumeration value="SPECIFIC" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmRelationshipStrength">
-        <s:restriction base="s:string">
-          <s:enumeration value="WEAK" />
-          <s:enumeration value="STRONG" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="CopyDocumentWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="CopyDocumentWTResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="versionIds" type="tns:ArrayOfUnsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyReferences" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyIndexing" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyRenditions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copySourceRelationships" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyDestinationRelationships" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="relationshipToCopiedDoc" type="tns:RelationshipInfo" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="CopyDocumentResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocument2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="versionIds" type="tns:ArrayOfUnsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyReferences" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyIndexing" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyRenditions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copySourceRelationships" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyDestinationRelationships" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="relationshipToCopiedDoc" type="tns:RelationshipInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="customPropData">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocument2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="CopyDocument2WTResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocument2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="versionIds" type="tns:ArrayOfUnsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyReferences" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyIndexing" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyRenditions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copySourceRelationships" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="copyDestinationRelationships" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="relationshipToCopiedDoc" type="tns:RelationshipInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="customPropData">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CopyDocument2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="CopyDocument2Result" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DiscontinueRelationshipWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="relationshipId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DiscontinueRelationshipWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="DiscontinueRelationship">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="relationshipId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DiscontinueRelationshipResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ChangeContainerParentWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="newParentContainerId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ChangeContainerParentWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ChangeContainerParent">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="newParentContainerId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ChangeContainerParentResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="SignVersionWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="signatureData" type="s:base64Binary" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SignVersionWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="SignVersion">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="signatureData" type="s:base64Binary" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SignVersionResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveSignatureWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="signatureId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveSignatureWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveSignature">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="signatureId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveSignatureResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="VerifySignatureWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="signatureId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="VerifySignatureWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="VerifySignature">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="signatureId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="VerifySignatureResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetStaticDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropertyDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLookups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPolicies" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRenditionDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSystemInfo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetStaticDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetStaticDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetStaticData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropertyDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLookups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPolicies" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRenditionDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSystemInfo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetStaticDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetStaticDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetCategoriesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetCategoriesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetCategoriesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetCategories">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetCategoriesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetCategoriesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetKeywordsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywords">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="keywordId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetKeywordsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSignaturesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSignaturesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSignaturesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSignatures">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionNumber" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSignaturesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSignaturesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordContextWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="targetKeywordId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordContextWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetKeywordContextWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordContext">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="targetKeywordId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetKeywordContextResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetKeywordContextResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystems">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getSlaves" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getMasters" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystemsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetOtherSystemsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystemsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSlaves" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getMasters" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystemsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetOtherSystemsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystem">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystemResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetOtherSystemResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystemWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetOtherSystemWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetOtherSystemWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccounts">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getUsers" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccountsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPlaceHolderAccountsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccountsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getUsers" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccountsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPlaceHolderAccountsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccount">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="guid" type="s1:guid" />
-            <s:element minOccurs="1" maxOccurs="1" name="isGroup" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccountResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPlaceHolderAccountResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccountWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="guid" type="s1:guid" />
-            <s:element minOccurs="1" maxOccurs="1" name="isGroup" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPlaceHolderAccountWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPlaceHolderAccountWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlaveMultiple">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectIds" type="tns:ArrayOfInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:complexType name="ArrayOfInt">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" />
-        </s:sequence>
-      </s:complexType>
-      <s:element name="GetReplicationToSlaveMultipleResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReplicationToSlaveMultipleResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlaveMultipleWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectIds" type="tns:ArrayOfInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlaveMultipleWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReplicationToSlaveMultipleWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlave">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlaveResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReplicationToSlaveResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlaveWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlaveWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReplicationToSlaveWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlave1">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="slaveId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlave1Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReplicationToSlave1Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlave1WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="slaveId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReplicationToSlave1WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReplicationToSlave1WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainerWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainerWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetTopContainerWTResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainer">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetTopContainerResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetTopContainerResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainer1WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainer1WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetTopContainer1WTResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainer1">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetTopContainer1Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetTopContainer1Result" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContainerRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetContainerDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContainerRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetContainerDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedContainerDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContainerRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getOtherContainerCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getOtherContainerPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPosition" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxItems" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedContainerDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLimitedContainerDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalChildContainers" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalContainerRefs" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalDocumentRefs" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalStoredSearchRefs" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalKeywords" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalReferencingContainers" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedContainerData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContainerRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getOtherContainerCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getOtherContainerPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPosition" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxItems" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedContainerDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLimitedContainerDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalChildContainers" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalContainerRefs" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalDocumentRefs" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalStoredSearchRefs" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalKeywords" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalReferencingContainers" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForContainersWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="containerIds" type="tns:ArrayOfUnsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForContainersWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForContainersWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForContainers">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="containerIds" type="tns:ArrayOfUnsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForContainersResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForContainersResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerContextWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="targetContainerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContainerRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchRefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerContextWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetContainerContextWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerContext">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="targetContainerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContainerRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDocumentRefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearchRefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContainerContextResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetContainerContextResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentReferencesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPosition" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxRefs" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentReferencesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentReferencesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalRefs" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentReferences">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="containerId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPosition" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxRefs" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentReferencesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentReferencesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalRefs" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPolicy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getVersions" type="tns:dmVersionInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockInfo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="dmVersionInfo">
-        <s:restriction base="s:string">
-          <s:enumeration value="ALL" />
-          <s:enumeration value="LATEST" />
-          <s:enumeration value="NONE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="GetDocumentDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPolicy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getVersions" type="tns:dmVersionInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockInfo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentDataRefPathsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPolicy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getVersions" type="tns:dmVersionInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockInfo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencePaths" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentDataRefPathsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentDataRefPathsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentDataRefPaths">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPolicy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getVersions" type="tns:dmVersionInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="getKeywords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencingContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockInfo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getReferencePaths" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentDataRefPathsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentDataRefPathsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocumentsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="documentIds" type="tns:ArrayOfUnsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocumentsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForDocumentsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocuments">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="documentIds" type="tns:ArrayOfUnsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocumentsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForDocumentsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocuments2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="documentIds" type="tns:ArrayOfUnsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="customProperties" type="tns:ArrayOfString" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:complexType name="ArrayOfString">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
-        </s:sequence>
-      </s:complexType>
-      <s:element name="GetPropertiesForDocuments2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForDocuments2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocuments2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="documentIds" type="tns:ArrayOfUnsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="customProperties" type="tns:ArrayOfString" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForDocuments2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForDocuments2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExtra" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRenditions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSourceRelationships" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDestRelationships" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExtra" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRenditions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSourceRelationships" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDestRelationships" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExtra" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="dmRenditionDef">
-        <s:restriction base="s:string">
-          <s:enumeration value="TEXT" />
-          <s:enumeration value="PDF" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="GetRenditionDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExtra" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelationshipDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="relationshipId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExtra" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelationshipDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRelationshipDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelationshipData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="sourceDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="sourceVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destDocId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="destVersionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="relationshipId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExtra" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelationshipDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRelationshipDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFile">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileCompressedWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCompression" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileCompressedWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileCompressedWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileCompressed">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCompression" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileCompressedResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileCompressedResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileByRefWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileByRefWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileByRefWTResult" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strMIMEtype" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileByRef">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileByRefResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileByRefResult" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strMIMEtype" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileAsHtmlWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileAsHtmlWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileAsHtmlWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileAsHtml">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLatestVersionFileAsHtmlResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLatestVersionFileAsHtmlResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFile">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileNULLWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileNULLWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetVersionFileNULL">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileNULLResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetVersionFileCompressedWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCompression" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileCompressedWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileCompressedWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileCompressed">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCompression" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileCompressedResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileCompressedResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileByRefWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileByRefWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileByRefWTResult" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strMIMEtype" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileByRef">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileByRefResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileByRefResult" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strMIMEtype" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileAsHtmlWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileAsHtmlWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileAsHtmlWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileAsHtml">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionFileAsHtmlResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionFileAsHtmlResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFile">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileCompressedWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCompression" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileCompressedWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileCompressedWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileCompressed">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCompression" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileCompressedResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileCompressedResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileByRefWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileByRefWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileByRefWTResult" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strMIMEtype" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileByRef">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileByRefResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileByRefResult" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strMIMEtype" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileAsHtmlWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileAsHtmlWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileAsHtmlWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileAsHtml">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="docId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="versionId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="renditionDef" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="lifetime" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRenditionFileAsHtmlResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRenditionFileAsHtmlResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchDocumentsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchAll" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="scope" type="tns:dmSearchScope" />
-            <s:element minOccurs="1" maxOccurs="1" name="useThesaurus" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="dmPermission">
-        <s:restriction base="s:string">
-          <s:enumeration value="PROHIBIT" />
-          <s:enumeration value="READ" />
-          <s:enumeration value="AMEND" />
-          <s:enumeration value="MANAGE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmSearchScope">
-        <s:restriction base="s:string">
-          <s:enumeration value="BOTH" />
-          <s:enumeration value="VERSIONS" />
-          <s:enumeration value="RENDITIONS" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmLogicalOp">
-        <s:restriction base="s:string">
-          <s:enumeration value="AND" />
-          <s:enumeration value="OR" />
-          <s:enumeration value="NOT" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="SearchDocumentsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchDocumentsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchDocuments">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchAll" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="scope" type="tns:dmSearchScope" />
-            <s:element minOccurs="1" maxOccurs="1" name="useThesaurus" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchDocumentsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchDocumentsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchRecordsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchAll" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="scope" type="tns:dmSearchScope" />
-            <s:element minOccurs="1" maxOccurs="1" name="useThesaurus" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchRecordsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchRecordsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchRecords">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchAll" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="scope" type="tns:dmSearchScope" />
-            <s:element minOccurs="1" maxOccurs="1" name="useThesaurus" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchRecordsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchRecordsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchContainersWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchContainersWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchContainersWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchContainers">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchContainersResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchContainersResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchFoldersWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchFoldersWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchFoldersWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchFolders">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchFoldersResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchFoldersResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchPartsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchPartsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchPartsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchParts">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionFilter" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchKeywordHierarchy" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="keywordOperator" type="tns:dmLogicalOp" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchPartsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchPartsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchUsersWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchUsersWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchUsersWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchUsers">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchUsersResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchUsersResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchGroupsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchGroupsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchGroupsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchGroups">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="searchInfo">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="maxHitsToReturn" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPositionOfHits" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="searchChildren" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SearchGroupsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SearchGroupsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalHitsCount" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="returnedHitsCount" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetStoredSearchDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="storedSearchId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSearchCriteria" type="tns:dmSearchCriteriaConfig" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="dmSearchCriteriaConfig">
-        <s:restriction base="s:string">
-          <s:enumeration value="NONE" />
-          <s:enumeration value="EXCLUDE_KEYWORD_DATA" />
-          <s:enumeration value="ALL" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="GetStoredSearchDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetStoredSearchDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetStoredSearchData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="storedSearchId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getAcl" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSearchCriteria" type="tns:dmSearchCriteriaConfig" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetStoredSearchDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetStoredSearchDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSharedContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearches" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockedDocuments" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSharedContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearches" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockedDocuments" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedUserDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSharedContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearches" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockedDocuments" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPosition" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxItems" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedUserDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLimitedUserDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalLockedDocuments" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalStoredSearches" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalSharedContainers" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedUserData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getSharedContainers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getStoredSearches" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getLockedDocuments" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="startPosition" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxItems" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLimitedUserDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLimitedUserDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="totalLockedDocuments" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalStoredSearches" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="totalSharedContainers" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSessionUserWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSessionUserWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetSessionUserWTResult" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="canAddDocuments" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="canAddStoredSearches" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="canAddTemplates" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSessionUser">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetSessionUserResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetSessionUserResult" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="canAddDocuments" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="canAddStoredSearches" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="canAddTemplates" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSessionUserIdWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSessionUserIdWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetSessionUserIdWTResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSessionUserId">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetSessionUserIdResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetSessionUserIdResult" type="s:unsignedInt" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ChangePasswordWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="oldPassword" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="newPassword" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ChangePasswordWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ChangePassword">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="oldPassword" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="newPassword" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ChangePasswordResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetGroupDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="groupId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getUsers" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="groupId" type="s:unsignedInt" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropList" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCanDo" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getGroups" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getUsers" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEdcConfigWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="authenticationToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEdcConfigWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEdcConfigWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEdcConfig">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetEdcConfigResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEdcConfigResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/DMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="TypeExport">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="dummy1" type="tns:dmRenditionDef" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy2" type="tns:dmLogicalOp" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy3" type="tns:dmContentTermType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy4" type="tns:dmPropertyTermType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy5" type="tns:dmIndexType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy6" type="tns:dmIndexAction" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy7" type="tns:dmOfflineDecision" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy8" type="tns:dmPolicyType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy9" type="tns:dmDurationType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy10" type="tns:dmRelationshipStrength" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy11" type="tns:dmSearchAgentPriority" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy12" type="tns:dmFileAvailability" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy13" type="tns:dmVersionInfo" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy14" type="tns:dmActivity" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy15" type="tns:dmObjectType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy16" type="tns:dmPropertyType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy17" type="tns:dmPermission" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy18" type="tns:dmSearchScope" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy19" type="tns:dmStringRelation" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy20" type="tns:dmNumberRelation" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy21" type="tns:dmDateRelation" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy22" type="tns:dmIndexState" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy23" type="tns:dmPhraseType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy24" type="tns:dmSearchResultType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy25" type="tns:dmRelationshipType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy26" type="tns:dmSearchObjectType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy27" type="tns:dmSearchCriteriaConfig" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy28" type="tns:dmCascadeType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy29" type="tns:dmKeywordCascadeType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy30" type="tns:dmCustomPropertyCascadeType" />
-            <s:element minOccurs="1" maxOccurs="1" name="dummy31" type="tns:dmDateInterval" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="dmContentTermType">
-        <s:restriction base="s:string">
-          <s:enumeration value="WORD" />
-          <s:enumeration value="EXPRESSION" />
-          <s:enumeration value="PHRASE" />
-          <s:enumeration value="XWORD" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmPropertyTermType">
-        <s:restriction base="s:string">
-          <s:enumeration value="STRING" />
-          <s:enumeration value="NUMBER" />
-          <s:enumeration value="DATE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmIndexType">
-        <s:restriction base="s:string">
-          <s:enumeration value="NOT_INDEXED" />
-          <s:enumeration value="STATIC" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmIndexAction">
-        <s:restriction base="s:string">
-          <s:enumeration value="INDEX" />
-          <s:enumeration value="DEINDEX" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmOfflineDecision">
-        <s:restriction base="s:string">
-          <s:enumeration value="ARCHIVE" />
-          <s:enumeration value="DELETE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmPolicyType">
-        <s:restriction base="s:string">
-          <s:enumeration value="ONLINE_VERSIONS" />
-          <s:enumeration value="DATE_ADDED" />
-          <s:enumeration value="DATE_ACCESSED" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmDurationType">
-        <s:restriction base="s:string">
-          <s:enumeration value="DAYS" />
-          <s:enumeration value="MONTHS" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmSearchAgentPriority">
-        <s:restriction base="s:string">
-          <s:enumeration value="HIGH" />
-          <s:enumeration value="MEDIUM" />
-          <s:enumeration value="LOW" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmFileAvailability">
-        <s:restriction base="s:string">
-          <s:enumeration value="ONLINE" />
-          <s:enumeration value="reserved" />
-          <s:enumeration value="AVAILABLE_FOR_ARCHIVE" />
-          <s:enumeration value="AVAILABLE_FOR_DELETION" />
-          <s:enumeration value="ARCHIVED" />
-          <s:enumeration value="DELETED" />
-          <s:enumeration value="ARCHIVING" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmActivity">
-        <s:restriction base="s:string">
-          <s:enumeration value="ADD_DOCUMENT" />
-          <s:enumeration value="ADD_STOREDSEARCH" />
-          <s:enumeration value="READ_PROPERTIES" />
-          <s:enumeration value="CHANGE_PROPERTIES" />
-          <s:enumeration value="REMOVE" />
-          <s:enumeration value="ADD_AND_REMOVE_ACCESS" />
-          <s:enumeration value="GET_ACCESS" />
-          <s:enumeration value="ATTACH_OWNER" />
-          <s:enumeration value="GET_OWNER" />
-          <s:enumeration value="ATTACH_POLICY" />
-          <s:enumeration value="GET_POLICY" />
-          <s:enumeration value="ADD_LOCK" />
-          <s:enumeration value="GET_LOCK" />
-          <s:enumeration value="ADD_VERSION" />
-          <s:enumeration value="GET_VERSIONS" />
-          <s:enumeration value="GET_CATEGORY" />
-          <s:enumeration value="TAKE_OWNERSHIP" />
-          <s:enumeration value="ADD_RELATIONSHIP" />
-          <s:enumeration value="GET_RELATIONSHIPS" />
-          <s:enumeration value="GET_PARENT_CONTAINER" />
-          <s:enumeration value="GET_CHILD_CONTAINERS" />
-          <s:enumeration value="ADD_CONTAINERS" />
-          <s:enumeration value="GET_CONTAINERREFS" />
-          <s:enumeration value="ATTACH_AND_DETACH_CONTAINERREFS" />
-          <s:enumeration value="GET_DOCUMENTREFS" />
-          <s:enumeration value="ATTACH_AND_DETACH_DOCUMENTREFS" />
-          <s:enumeration value="GET_STOREDSEARCHREFS" />
-          <s:enumeration value="ATTACH_AND_DETACH_STOREDSEARCHREFS" />
-          <s:enumeration value="GET_HASCHILDREN" />
-          <s:enumeration value="GET_USERS" />
-          <s:enumeration value="GET_GROUPS" />
-          <s:enumeration value="ATTACH_AND_DETACH_USERS" />
-          <s:enumeration value="ATTACH_AND_DETACH_GROUPS" />
-          <s:enumeration value="DISCONTINUE" />
-          <s:enumeration value="GET_PARENT_DOCUMENT" />
-          <s:enumeration value="GET_FILE_CONTENT" />
-          <s:enumeration value="GET_URL" />
-          <s:enumeration value="GET_INDEX_STATE" />
-          <s:enumeration value="GET_RENDITIONS" />
-          <s:enumeration value="ADD_RENDITION" />
-          <s:enumeration value="INDEX_AND_DEINDEX" />
-          <s:enumeration value="GET_STOREDSEARCHES" />
-          <s:enumeration value="GET_TEMPLATES" />
-          <s:enumeration value="GET_TOPCONTAINER" />
-          <s:enumeration value="GET_SHAREDCONTAINERS" />
-          <s:enumeration value="GET_LOCKEDDOCUMENTS" />
-          <s:enumeration value="CHANGE_PASSWORD" />
-          <s:enumeration value="ADD_AND_REMOVE_VALUES" />
-          <s:enumeration value="GET_PARENT_VERSION" />
-          <s:enumeration value="GET_RENDITIONDEF" />
-          <s:enumeration value="READ_SEARCH" />
-          <s:enumeration value="CHANGE_SEARCH" />
-          <s:enumeration value="MAKE_SEARCH_AGENT" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmPropertyType">
-        <s:restriction base="s:string">
-          <s:enumeration value="FIXED_TEXT" />
-          <s:enumeration value="FIXED_NUMBER" />
-          <s:enumeration value="FIXED_DATE" />
-          <s:enumeration value="CUSTOM_TEXT" />
-          <s:enumeration value="CUSTOM_NUMBER" />
-          <s:enumeration value="CUSTOM_DATE" />
-          <s:enumeration value="CUSTOM_LONGTEXT" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmStringRelation">
-        <s:restriction base="s:string">
-          <s:enumeration value="IS" />
-          <s:enumeration value="ISNOT" />
-          <s:enumeration value="LIKE" />
-          <s:enumeration value="NOTLIKE" />
-          <s:enumeration value="LESS" />
-          <s:enumeration value="GREATER" />
-          <s:enumeration value="LESSORIS" />
-          <s:enumeration value="GREATERORIS" />
-          <s:enumeration value="STARTSWITH" />
-          <s:enumeration value="ENDSWITH" />
-          <s:enumeration value="CONTAINSWORDS" />
-          <s:enumeration value="NOTCONTAINSWORDS" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmNumberRelation">
-        <s:restriction base="s:string">
-          <s:enumeration value="EQUAL" />
-          <s:enumeration value="NOTEQUAL" />
-          <s:enumeration value="LESS" />
-          <s:enumeration value="GREATER" />
-          <s:enumeration value="LESSOREQUAL" />
-          <s:enumeration value="GREATEROREQUAL" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmDateRelation">
-        <s:restriction base="s:string">
-          <s:enumeration value="dON" />
-          <s:enumeration value="dNOTON" />
-          <s:enumeration value="dBEFORE" />
-          <s:enumeration value="dONORBEFORE" />
-          <s:enumeration value="dAFTER" />
-          <s:enumeration value="dONORAFTER" />
-          <s:enumeration value="dtON" />
-          <s:enumeration value="dtNOTON" />
-          <s:enumeration value="dtBEFORE" />
-          <s:enumeration value="dtONORBEFORE" />
-          <s:enumeration value="dtAFTER" />
-          <s:enumeration value="dtONORAFTER" />
-          <s:enumeration value="iON" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmIndexState">
-        <s:restriction base="s:string">
-          <s:enumeration value="INDEX_PENDING" />
-          <s:enumeration value="INDEXED" />
-          <s:enumeration value="DEINDEX_PENDING" />
-          <s:enumeration value="DEINDEXED" />
-          <s:enumeration value="NONINDEXED" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmPhraseType">
-        <s:restriction base="s:string">
-          <s:enumeration value="ORDERED" />
-          <s:enumeration value="UNORDERED" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmSearchResultType">
-        <s:restriction base="s:string">
-          <s:enumeration value="PROPERTY" />
-          <s:enumeration value="CONTENT" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmSearchObjectType">
-        <s:restriction base="s:string">
-          <s:enumeration value="CONTAINER" />
-          <s:enumeration value="DOCUMENT" />
-          <s:enumeration value="USER" />
-          <s:enumeration value="GROUP" />
-          <s:enumeration value="RECORD" />
-          <s:enumeration value="FOLDER" />
-          <s:enumeration value="PART" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmCascadeType">
-        <s:restriction base="s:string">
-          <s:enumeration value="REPLACE" />
-          <s:enumeration value="REPLACEMENT_MERGE" />
-          <s:enumeration value="OPEN_UP_MERGE" />
-          <s:enumeration value="LOCK_DOWN_MERGE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmKeywordCascadeType">
-        <s:restriction base="s:string">
-          <s:enumeration value="REPLACE" />
-          <s:enumeration value="MERGE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmCustomPropertyCascadeType">
-        <s:restriction base="s:string">
-          <s:enumeration value="REPLACE" />
-          <s:enumeration value="MERGE" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="dmDateInterval">
-        <s:restriction base="s:string">
-          <s:enumeration value="YESTERDAY" />
-          <s:enumeration value="TODAY" />
-          <s:enumeration value="TOMORROW" />
-          <s:enumeration value="LAST_WEEK" />
-          <s:enumeration value="THIS_WEEK" />
-          <s:enumeration value="NEXT_WEEK" />
-          <s:enumeration value="LAST_MONTH" />
-          <s:enumeration value="THIS_MONTH" />
-          <s:enumeration value="NEXT_MONTH" />
-          <s:enumeration value="LAST_YEAR" />
-          <s:enumeration value="THIS_YEAR" />
-          <s:enumeration value="NEXT_YEAR" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="TypeExportResponse">
-        <s:complexType />
-      </s:element>
-    </s:schema>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://microsoft.com/wsdl/types/">
-      <s:simpleType name="guid">
-        <s:restriction base="s:string">
-          <s:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
-        </s:restriction>
-      </s:simpleType>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="LoginSoapIn">
-    <wsdl:part name="parameters" element="tns:Login" />
-  </wsdl:message>
-  <wsdl:message name="LoginSoapOut">
-    <wsdl:part name="parameters" element="tns:LoginResponse" />
-  </wsdl:message>
-  <wsdl:message name="LoginUnifiedSoapIn">
-    <wsdl:part name="parameters" element="tns:LoginUnified" />
-  </wsdl:message>
-  <wsdl:message name="LoginUnifiedSoapOut">
-    <wsdl:part name="parameters" element="tns:LoginUnifiedResponse" />
-  </wsdl:message>
-  <wsdl:message name="LoginUnifiedWithClientWorkstationSoapIn">
-    <wsdl:part name="parameters" element="tns:LoginUnifiedWithClientWorkstation" />
-  </wsdl:message>
-  <wsdl:message name="LoginUnifiedWithClientWorkstationSoapOut">
-    <wsdl:part name="parameters" element="tns:LoginUnifiedWithClientWorkstationResponse" />
-  </wsdl:message>
-  <wsdl:message name="LogoutWTSoapIn">
-    <wsdl:part name="parameters" element="tns:LogoutWT" />
-  </wsdl:message>
-  <wsdl:message name="LogoutWTSoapOut">
-    <wsdl:part name="parameters" element="tns:LogoutWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="LogoutSoapIn">
-    <wsdl:part name="parameters" element="tns:Logout" />
-  </wsdl:message>
-  <wsdl:message name="LogoutSoapOut">
-    <wsdl:part name="parameters" element="tns:LogoutResponse" />
-  </wsdl:message>
-  <wsdl:message name="LogoutMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyChangesWT" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyChangesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyChanges" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyChangesResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="AddObject2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:AddObject2WT" />
-  </wsdl:message>
-  <wsdl:message name="AddObject2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:AddObject2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddObject2SoapIn">
-    <wsdl:part name="parameters" element="tns:AddObject2" />
-  </wsdl:message>
-  <wsdl:message name="AddObject2SoapOut">
-    <wsdl:part name="parameters" element="tns:AddObject2Response" />
-  </wsdl:message>
-  <wsdl:message name="AddObject2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="AddObjectSoapIn">
-    <wsdl:part name="parameters" element="tns:AddObject" />
-  </wsdl:message>
-  <wsdl:message name="AddObjectSoapOut">
-    <wsdl:part name="parameters" element="tns:AddObjectResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddObjectMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="AddObjectWTSoapIn">
-    <wsdl:part name="parameters" element="tns:AddObjectWT" />
-  </wsdl:message>
-  <wsdl:message name="AddObjectWTSoapOut">
-    <wsdl:part name="parameters" element="tns:AddObjectWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteObjectWTSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteObjectWT" />
-  </wsdl:message>
-  <wsdl:message name="DeleteObjectWTSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteObjectWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteObjectSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteObject" />
-  </wsdl:message>
-  <wsdl:message name="DeleteObjectSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteObjectResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteObjectMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionWTSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteVersionWT" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionWTSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteVersionWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteVersion" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteVersionResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CancelVersionDeletionWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CancelVersionDeletionWT" />
-  </wsdl:message>
-  <wsdl:message name="CancelVersionDeletionWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CancelVersionDeletionWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CancelVersionDeletionSoapIn">
-    <wsdl:part name="parameters" element="tns:CancelVersionDeletion" />
-  </wsdl:message>
-  <wsdl:message name="CancelVersionDeletionSoapOut">
-    <wsdl:part name="parameters" element="tns:CancelVersionDeletionResponse" />
-  </wsdl:message>
-  <wsdl:message name="CancelVersionDeletionMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CancelDocumentDeletionWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CancelDocumentDeletionWT" />
-  </wsdl:message>
-  <wsdl:message name="CancelDocumentDeletionWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CancelDocumentDeletionWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CancelDocumentDeletionSoapIn">
-    <wsdl:part name="parameters" element="tns:CancelDocumentDeletion" />
-  </wsdl:message>
-  <wsdl:message name="CancelDocumentDeletionSoapOut">
-    <wsdl:part name="parameters" element="tns:CancelDocumentDeletionResponse" />
-  </wsdl:message>
-  <wsdl:message name="CancelDocumentDeletionMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocumentWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CopyDocumentWT" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocumentWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CopyDocumentWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:CopyDocument" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:CopyDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocumentMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocument2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:CopyDocument2WT" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocument2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:CopyDocument2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocument2SoapIn">
-    <wsdl:part name="parameters" element="tns:CopyDocument2" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocument2SoapOut">
-    <wsdl:part name="parameters" element="tns:CopyDocument2Response" />
-  </wsdl:message>
-  <wsdl:message name="CopyDocument2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="DiscontinueRelationshipWTSoapIn">
-    <wsdl:part name="parameters" element="tns:DiscontinueRelationshipWT" />
-  </wsdl:message>
-  <wsdl:message name="DiscontinueRelationshipWTSoapOut">
-    <wsdl:part name="parameters" element="tns:DiscontinueRelationshipWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="DiscontinueRelationshipSoapIn">
-    <wsdl:part name="parameters" element="tns:DiscontinueRelationship" />
-  </wsdl:message>
-  <wsdl:message name="DiscontinueRelationshipSoapOut">
-    <wsdl:part name="parameters" element="tns:DiscontinueRelationshipResponse" />
-  </wsdl:message>
-  <wsdl:message name="DiscontinueRelationshipMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ChangeContainerParentWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ChangeContainerParentWT" />
-  </wsdl:message>
-  <wsdl:message name="ChangeContainerParentWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ChangeContainerParentWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ChangeContainerParentSoapIn">
-    <wsdl:part name="parameters" element="tns:ChangeContainerParent" />
-  </wsdl:message>
-  <wsdl:message name="ChangeContainerParentSoapOut">
-    <wsdl:part name="parameters" element="tns:ChangeContainerParentResponse" />
-  </wsdl:message>
-  <wsdl:message name="ChangeContainerParentMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SignVersionWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SignVersionWT" />
-  </wsdl:message>
-  <wsdl:message name="SignVersionWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SignVersionWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SignVersionSoapIn">
-    <wsdl:part name="parameters" element="tns:SignVersion" />
-  </wsdl:message>
-  <wsdl:message name="SignVersionSoapOut">
-    <wsdl:part name="parameters" element="tns:SignVersionResponse" />
-  </wsdl:message>
-  <wsdl:message name="SignVersionMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="RemoveSignatureWTSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveSignatureWT" />
-  </wsdl:message>
-  <wsdl:message name="RemoveSignatureWTSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveSignatureWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveSignatureSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveSignature" />
-  </wsdl:message>
-  <wsdl:message name="RemoveSignatureSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveSignatureResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveSignatureMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="VerifySignatureWTSoapIn">
-    <wsdl:part name="parameters" element="tns:VerifySignatureWT" />
-  </wsdl:message>
-  <wsdl:message name="VerifySignatureWTSoapOut">
-    <wsdl:part name="parameters" element="tns:VerifySignatureWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="VerifySignatureSoapIn">
-    <wsdl:part name="parameters" element="tns:VerifySignature" />
-  </wsdl:message>
-  <wsdl:message name="VerifySignatureSoapOut">
-    <wsdl:part name="parameters" element="tns:VerifySignatureResponse" />
-  </wsdl:message>
-  <wsdl:message name="VerifySignatureMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetStaticDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetStaticDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetStaticDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetStaticDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetStaticDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetStaticData" />
-  </wsdl:message>
-  <wsdl:message name="GetStaticDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetStaticDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetStaticDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetCategoriesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetCategoriesWT" />
-  </wsdl:message>
-  <wsdl:message name="GetCategoriesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetCategoriesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetCategoriesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetCategories" />
-  </wsdl:message>
-  <wsdl:message name="GetCategoriesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetCategoriesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetCategoriesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetKeywordsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetKeywordsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetKeywords" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetKeywordsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetSignaturesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSignaturesWT" />
-  </wsdl:message>
-  <wsdl:message name="GetSignaturesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSignaturesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSignaturesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSignatures" />
-  </wsdl:message>
-  <wsdl:message name="GetSignaturesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSignaturesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSignaturesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordContextWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetKeywordContextWT" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordContextWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetKeywordContextWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordContextSoapIn">
-    <wsdl:part name="parameters" element="tns:GetKeywordContext" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordContextSoapOut">
-    <wsdl:part name="parameters" element="tns:GetKeywordContextResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetKeywordContextMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetOtherSystems" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetOtherSystemsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetOtherSystemsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetOtherSystemsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemsWTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemSoapIn">
-    <wsdl:part name="parameters" element="tns:GetOtherSystem" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemSoapOut">
-    <wsdl:part name="parameters" element="tns:GetOtherSystemResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetOtherSystemWT" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetOtherSystemWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetOtherSystemWTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccounts" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccountsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccountsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccountsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountsWTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccount" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccountResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccountWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPlaceHolderAccountWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPlaceHolderAccountWTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMultipleSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveMultiple" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMultipleSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveMultipleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMultipleMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMultipleWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveMultipleWT" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMultipleWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveMultipleWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMultipleWTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlave" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveWT" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlaveWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlaveWTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlave1SoapIn">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlave1" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlave1SoapOut">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlave1Response" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlave1MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlave1WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlave1WT" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlave1WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReplicationToSlave1WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReplicationToSlave1WTMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainerWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetTopContainerWT" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainerWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetTopContainerWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainerSoapIn">
-    <wsdl:part name="parameters" element="tns:GetTopContainer" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainerSoapOut">
-    <wsdl:part name="parameters" element="tns:GetTopContainerResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainerMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainer1WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetTopContainer1WT" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainer1WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetTopContainer1WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainer1SoapIn">
-    <wsdl:part name="parameters" element="tns:GetTopContainer1" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainer1SoapOut">
-    <wsdl:part name="parameters" element="tns:GetTopContainer1Response" />
-  </wsdl:message>
-  <wsdl:message name="GetTopContainer1MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetContainerDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetContainerDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetContainerData" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetContainerDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedContainerDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLimitedContainerDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedContainerDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLimitedContainerDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedContainerDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLimitedContainerData" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedContainerDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLimitedContainerDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedContainerDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForContainersWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForContainersWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForContainersWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForContainersWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForContainersSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForContainers" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForContainersSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForContainersResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForContainersMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerContextWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetContainerContextWT" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerContextWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetContainerContextWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerContextSoapIn">
-    <wsdl:part name="parameters" element="tns:GetContainerContext" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerContextSoapOut">
-    <wsdl:part name="parameters" element="tns:GetContainerContextResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetContainerContextMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentReferencesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentReferencesWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentReferencesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentReferencesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentReferencesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentReferences" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentReferencesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentReferencesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentReferencesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentData" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataRefPathsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataRefPathsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataRefPathsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataRefPathsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataRefPathsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataRefPaths" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataRefPathsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentDataRefPathsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentDataRefPathsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocumentsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocumentsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocumentsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocumentsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocumentsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocuments" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocumentsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocumentsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocumentsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocuments2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocuments2WT" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocuments2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocuments2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocuments2SoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocuments2" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocuments2SoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForDocuments2Response" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForDocuments2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionData" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionData" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRelationshipDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRelationshipDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRelationshipDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRelationshipDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRelationshipDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRelationshipData" />
-  </wsdl:message>
-  <wsdl:message name="GetRelationshipDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRelationshipDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRelationshipDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFile" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileCompressedWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileCompressedWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileCompressedWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileCompressedWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileCompressedSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileCompressed" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileCompressedSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileCompressedResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileCompressedMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileByRefWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileByRefWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileByRefWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileByRefWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileByRefSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileByRef" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileByRefSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileByRefResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileByRefMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileAsHtmlWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileAsHtmlWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileAsHtmlWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileAsHtmlWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileAsHtmlSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileAsHtml" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileAsHtmlSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLatestVersionFileAsHtmlResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLatestVersionFileAsHtmlMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileWT" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFile" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileNULLWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileNULLWT" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileNULLWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileNULLWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileNULLSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileNULL" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileNULLSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileNULLResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileNULLMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileCompressedWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileCompressedWT" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileCompressedWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileCompressedWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileCompressedSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileCompressed" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileCompressedSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileCompressedResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileCompressedMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileByRefWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileByRefWT" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileByRefWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileByRefWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileByRefSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileByRef" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileByRefSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileByRefResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileByRefMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileAsHtmlWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileAsHtmlWT" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileAsHtmlWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileAsHtmlWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileAsHtmlSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionFileAsHtml" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileAsHtmlSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionFileAsHtmlResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionFileAsHtmlMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFile" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileCompressedWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileCompressedWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileCompressedWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileCompressedWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileCompressedSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileCompressed" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileCompressedSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileCompressedResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileCompressedMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileByRefWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileByRefWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileByRefWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileByRefWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileByRefSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileByRef" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileByRefSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileByRefResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileByRefMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileAsHtmlWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileAsHtmlWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileAsHtmlWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileAsHtmlWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileAsHtmlSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileAsHtml" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileAsHtmlSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRenditionFileAsHtmlResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRenditionFileAsHtmlMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchDocumentsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchDocumentsWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchDocumentsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchDocumentsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchDocumentsSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchDocuments" />
-  </wsdl:message>
-  <wsdl:message name="SearchDocumentsSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchDocumentsResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchDocumentsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchRecordsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchRecordsWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchRecordsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchRecordsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchRecordsSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchRecords" />
-  </wsdl:message>
-  <wsdl:message name="SearchRecordsSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchRecordsResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchRecordsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchContainersWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchContainersWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchContainersWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchContainersWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchContainersSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchContainers" />
-  </wsdl:message>
-  <wsdl:message name="SearchContainersSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchContainersResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchContainersMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchFoldersWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchFoldersWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchFoldersWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchFoldersWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchFoldersSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchFolders" />
-  </wsdl:message>
-  <wsdl:message name="SearchFoldersSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchFoldersResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchFoldersMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchPartsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchPartsWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchPartsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchPartsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchPartsSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchParts" />
-  </wsdl:message>
-  <wsdl:message name="SearchPartsSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchPartsResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchPartsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchUsersWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchUsersWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchUsersWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchUsersWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchUsersSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchUsers" />
-  </wsdl:message>
-  <wsdl:message name="SearchUsersSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchUsersResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchUsersMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SearchGroupsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchGroupsWT" />
-  </wsdl:message>
-  <wsdl:message name="SearchGroupsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchGroupsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchGroupsSoapIn">
-    <wsdl:part name="parameters" element="tns:SearchGroups" />
-  </wsdl:message>
-  <wsdl:message name="SearchGroupsSoapOut">
-    <wsdl:part name="parameters" element="tns:SearchGroupsResponse" />
-  </wsdl:message>
-  <wsdl:message name="SearchGroupsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetStoredSearchDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetStoredSearchDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetStoredSearchDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetStoredSearchDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetStoredSearchDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetStoredSearchData" />
-  </wsdl:message>
-  <wsdl:message name="GetStoredSearchDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetStoredSearchDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetStoredSearchDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetUserDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetUserDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserData" />
-  </wsdl:message>
-  <wsdl:message name="GetUserDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedUserDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLimitedUserDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedUserDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLimitedUserDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedUserDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLimitedUserData" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedUserDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLimitedUserDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLimitedUserDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSessionUserWT" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSessionUserWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSessionUser" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSessionUserResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserIdWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSessionUserIdWT" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserIdWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSessionUserIdWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserIdSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSessionUserId" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserIdSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSessionUserIdResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSessionUserIdMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ChangePasswordWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ChangePasswordWT" />
-  </wsdl:message>
-  <wsdl:message name="ChangePasswordWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ChangePasswordWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ChangePasswordSoapIn">
-    <wsdl:part name="parameters" element="tns:ChangePassword" />
-  </wsdl:message>
-  <wsdl:message name="ChangePasswordSoapOut">
-    <wsdl:part name="parameters" element="tns:ChangePasswordResponse" />
-  </wsdl:message>
-  <wsdl:message name="ChangePasswordMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupDataWT" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupDataSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupData" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupDataSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetEdcConfigWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEdcConfigWT" />
-  </wsdl:message>
-  <wsdl:message name="GetEdcConfigWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEdcConfigWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEdcConfigSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEdcConfig" />
-  </wsdl:message>
-  <wsdl:message name="GetEdcConfigSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEdcConfigResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEdcConfigMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="TypeExportSoapIn">
-    <wsdl:part name="parameters" element="tns:TypeExport" />
-  </wsdl:message>
-  <wsdl:message name="TypeExportSoapOut">
-    <wsdl:part name="parameters" element="tns:TypeExportResponse" />
-  </wsdl:message>
-  <wsdl:portType name="MeridioDMSoap">
-    <wsdl:operation name="Login">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Performs SOAP login using explicit login credentials</documentation>
-      <wsdl:input message="tns:LoginSoapIn" />
-      <wsdl:output message="tns:LoginSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="LoginUnified">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Performs SOAP unified login</documentation>
-      <wsdl:input name="LoginUnifiedWithClientWorkstation" message="tns:LoginUnifiedWithClientWorkstationSoapIn" />
-      <wsdl:output name="LoginUnifiedWithClientWorkstation" message="tns:LoginUnifiedWithClientWorkstationSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="Logout">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Removes the SOAP session specified by the supplied token</documentation>
-      <wsdl:input name="LogoutWT" message="tns:LogoutWTSoapIn" />
-      <wsdl:output name="LogoutWT" message="tns:LogoutWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ApplyChanges">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Generic method used to make changes and deletions in Meridio</documentation>
-      <wsdl:input name="ApplyChangesWT" message="tns:ApplyChangesWTSoapIn" />
-      <wsdl:output name="ApplyChangesWT" message="tns:ApplyChangesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddObject">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Generic method used to add a single object to Meridio</documentation>
-      <wsdl:input name="AddObject2WT" message="tns:AddObject2WTSoapIn" />
-      <wsdl:output name="AddObject2WT" message="tns:AddObject2WTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteObject">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for deleting a single document, container or stored search </documentation>
-      <wsdl:input name="DeleteObjectWT" message="tns:DeleteObjectWTSoapIn" />
-      <wsdl:output name="DeleteObjectWT" message="tns:DeleteObjectWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteVersion">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for deleting a single version of a document.</documentation>
-      <wsdl:input name="DeleteVersionWT" message="tns:DeleteVersionWTSoapIn" />
-      <wsdl:output name="DeleteVersionWT" message="tns:DeleteVersionWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CancelVersionDeletion">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Cancels deletion of one or more versions</documentation>
-      <wsdl:input name="CancelVersionDeletionWT" message="tns:CancelVersionDeletionWTSoapIn" />
-      <wsdl:output name="CancelVersionDeletionWT" message="tns:CancelVersionDeletionWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CancelDocumentDeletion">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Cancels deletion of one or more documents</documentation>
-      <wsdl:input name="CancelDocumentDeletionWT" message="tns:CancelDocumentDeletionWTSoapIn" />
-      <wsdl:output name="CancelDocumentDeletionWT" message="tns:CancelDocumentDeletionWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CopyDocument">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Creates a copy of the specified document and returns the ID of the new copy. The new document has as its first version a copy of the latest version of the source document.</documentation>
-      <wsdl:input name="CopyDocumentWT" message="tns:CopyDocumentWTSoapIn" />
-      <wsdl:output name="CopyDocumentWT" message="tns:CopyDocumentWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CopyDocument">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Creates a copy of the specified document and returns the ID of the new copy. The new document has as its first version a copy of the latest version of the source document.</documentation>
-      <wsdl:input name="CopyDocument2WT" message="tns:CopyDocument2WTSoapIn" />
-      <wsdl:output name="CopyDocument2WT" message="tns:CopyDocument2WTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DiscontinueRelationship">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for discontinuing a single relationship</documentation>
-      <wsdl:input name="DiscontinueRelationshipWT" message="tns:DiscontinueRelationshipWTSoapIn" />
-      <wsdl:output name="DiscontinueRelationshipWT" message="tns:DiscontinueRelationshipWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ChangeContainerParent">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Change Container parent</documentation>
-      <wsdl:input name="ChangeContainerParentWT" message="tns:ChangeContainerParentWTSoapIn" />
-      <wsdl:output name="ChangeContainerParentWT" message="tns:ChangeContainerParentWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SignVersion">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for adding a signature to a single version of a document.</documentation>
-      <wsdl:input name="SignVersionWT" message="tns:SignVersionWTSoapIn" />
-      <wsdl:output name="SignVersionWT" message="tns:SignVersionWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveSignature">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for removing signature(s) of a version of a document.</documentation>
-      <wsdl:input name="RemoveSignatureWT" message="tns:RemoveSignatureWTSoapIn" />
-      <wsdl:output name="RemoveSignatureWT" message="tns:RemoveSignatureWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="VerifySignature">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for verifying signature(s) of a version of a document.</documentation>
-      <wsdl:input name="VerifySignatureWT" message="tns:VerifySignatureWTSoapIn" />
-      <wsdl:output name="VerifySignatureWT" message="tns:VerifySignatureWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetStaticData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves cachable static data</documentation>
-      <wsdl:input name="GetStaticDataWT" message="tns:GetStaticDataWTSoapIn" />
-      <wsdl:output name="GetStaticDataWT" message="tns:GetStaticDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetCategories">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves all categories accessible by the user identified with token authenticationToken</documentation>
-      <wsdl:input name="GetCategoriesWT" message="tns:GetCategoriesWTSoapIn" />
-      <wsdl:output name="GetCategoriesWT" message="tns:GetCategoriesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetKeywords">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves the keyword given by keywordId and all its immediate child keywords</documentation>
-      <wsdl:input name="GetKeywordsWT" message="tns:GetKeywordsWTSoapIn" />
-      <wsdl:output name="GetKeywordsWT" message="tns:GetKeywordsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetSignatures">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convenience method for retrieving signatures of a version of a document.</documentation>
-      <wsdl:input name="GetSignaturesWT" message="tns:GetSignaturesWTSoapIn" />
-      <wsdl:output name="GetSignaturesWT" message="tns:GetSignaturesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetKeywordContext">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves the specified keyword and all its parent keywords above it in the keyword hierarchy, including the immediate children of each parent keyword.</documentation>
-      <wsdl:input name="GetKeywordContextWT" message="tns:GetKeywordContextWTSoapIn" />
-      <wsdl:output name="GetKeywordContextWT" message="tns:GetKeywordContextWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetOtherSystems">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves either or both Master and Slave systems held in KOTHERSYSTEM table.</documentation>
-      <wsdl:input name="GetOtherSystemsWT" message="tns:GetOtherSystemsWTSoapIn" />
-      <wsdl:output name="GetOtherSystemsWT" message="tns:GetOtherSystemsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetOtherSystem">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves a system held in KOTHERSYSTEM table using its ID.</documentation>
-      <wsdl:input message="tns:GetOtherSystemSoapIn" />
-      <wsdl:output message="tns:GetOtherSystemSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPlaceHolderAccounts">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves either or both User and Group placeholder accounts.</documentation>
-      <wsdl:input name="GetPlaceHolderAccountsWT" message="tns:GetPlaceHolderAccountsWTSoapIn" />
-      <wsdl:output name="GetPlaceHolderAccountsWT" message="tns:GetPlaceHolderAccountsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPlaceHolderAccount">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves either a User or Group place holder account using the Guid specified.</documentation>
-      <wsdl:input name="GetPlaceHolderAccountWT" message="tns:GetPlaceHolderAccountWTSoapIn" />
-      <wsdl:output name="GetPlaceHolderAccountWT" message="tns:GetPlaceHolderAccountWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetReplicationToSlaveMultiple">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves current replication setup for the sepecified objects.</documentation>
-      <wsdl:input name="GetReplicationToSlaveMultipleWT" message="tns:GetReplicationToSlaveMultipleWTSoapIn" />
-      <wsdl:output name="GetReplicationToSlaveMultipleWT" message="tns:GetReplicationToSlaveMultipleWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetReplicationToSlave">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves </documentation>
-      <wsdl:input name="GetReplicationToSlaveWT" message="tns:GetReplicationToSlaveWTSoapIn" />
-      <wsdl:output name="GetReplicationToSlaveWT" message="tns:GetReplicationToSlaveWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetReplicationToSlave">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves current replication setup for sepecified slave.</documentation>
-      <wsdl:input name="GetReplicationToSlave1WT" message="tns:GetReplicationToSlave1WTSoapIn" />
-      <wsdl:output name="GetReplicationToSlave1WT" message="tns:GetReplicationToSlave1WTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetTopContainer">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Returns top container of session user</documentation>
-      <wsdl:input name="GetTopContainerWT" message="tns:GetTopContainerWTSoapIn" />
-      <wsdl:output name="GetTopContainerWT" message="tns:GetTopContainerWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetContainerData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to specified container.</documentation>
-      <wsdl:input name="GetContainerDataWT" message="tns:GetContainerDataWTSoapIn" />
-      <wsdl:output name="GetContainerDataWT" message="tns:GetContainerDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLimitedContainerData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves a page-worth of data relating to specified container.</documentation>
-      <wsdl:input name="GetLimitedContainerDataWT" message="tns:GetLimitedContainerDataWTSoapIn" />
-      <wsdl:output name="GetLimitedContainerDataWT" message="tns:GetLimitedContainerDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertiesForContainers">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves fixed properties of each container in the supplied list.</documentation>
-      <wsdl:input name="GetPropertiesForContainersWT" message="tns:GetPropertiesForContainersWTSoapIn" />
-      <wsdl:output name="GetPropertiesForContainersWT" message="tns:GetPropertiesForContainersWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetContainerContext">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves the specified container and all its parent containers above it in the container hierarchy, including the specified data for each parent container.</documentation>
-      <wsdl:input name="GetContainerContextWT" message="tns:GetContainerContextWTSoapIn" />
-      <wsdl:output name="GetContainerContextWT" message="tns:GetContainerContextWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDocumentReferences">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves the fixed properties of the document references in the specified container.</documentation>
-      <wsdl:input name="GetDocumentReferencesWT" message="tns:GetDocumentReferencesWTSoapIn" />
-      <wsdl:output name="GetDocumentReferencesWT" message="tns:GetDocumentReferencesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDocumentData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to specified document</documentation>
-      <wsdl:input name="GetDocumentDataWT" message="tns:GetDocumentDataWTSoapIn" />
-      <wsdl:output name="GetDocumentDataWT" message="tns:GetDocumentDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertiesForDocuments">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves fixed properties of each document in the supplied list.</documentation>
-      <wsdl:input name="GetPropertiesForDocumentsWT" message="tns:GetPropertiesForDocumentsWTSoapIn" />
-      <wsdl:output name="GetPropertiesForDocumentsWT" message="tns:GetPropertiesForDocumentsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified document version</documentation>
-      <wsdl:input name="GetVersionDataWT" message="tns:GetVersionDataWTSoapIn" />
-      <wsdl:output name="GetVersionDataWT" message="tns:GetVersionDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified rendition</documentation>
-      <wsdl:input name="GetRenditionDataWT" message="tns:GetRenditionDataWTSoapIn" />
-      <wsdl:output name="GetRenditionDataWT" message="tns:GetRenditionDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRelationshipData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified relationship</documentation>
-      <wsdl:input name="GetRelationshipDataWT" message="tns:GetRelationshipDataWTSoapIn" />
-      <wsdl:output name="GetRelationshipDataWT" message="tns:GetRelationshipDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFile">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves content of latest version of specified document</documentation>
-      <wsdl:input name="GetLatestVersionFileWT" message="tns:GetLatestVersionFileWTSoapIn" />
-      <wsdl:output name="GetLatestVersionFileWT" message="tns:GetLatestVersionFileWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFileCompressed">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves compressed content of latest version of specified document, using DIME.</documentation>
-      <wsdl:input name="GetLatestVersionFileCompressedWT" message="tns:GetLatestVersionFileCompressedWTSoapIn" />
-      <wsdl:output name="GetLatestVersionFileCompressedWT" message="tns:GetLatestVersionFileCompressedWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFileByRef">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves UNC name of a copy of the latest version of the specified document</documentation>
-      <wsdl:input name="GetLatestVersionFileByRefWT" message="tns:GetLatestVersionFileByRefWTSoapIn" />
-      <wsdl:output name="GetLatestVersionFileByRefWT" message="tns:GetLatestVersionFileByRefWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFileAsHtml">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Returns URL of HTML conversion of the latest version of the specified document</documentation>
-      <wsdl:input name="GetLatestVersionFileAsHtmlWT" message="tns:GetLatestVersionFileAsHtmlWTSoapIn" />
-      <wsdl:output name="GetLatestVersionFileAsHtmlWT" message="tns:GetLatestVersionFileAsHtmlWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFile">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves content of specific document version</documentation>
-      <wsdl:input name="GetVersionFileWT" message="tns:GetVersionFileWTSoapIn" />
-      <wsdl:output name="GetVersionFileWT" message="tns:GetVersionFileWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileNULL">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Triggers server-side retrieval side-effects without returning file content</documentation>
-      <wsdl:input name="GetVersionFileNULLWT" message="tns:GetVersionFileNULLWTSoapIn" />
-      <wsdl:output name="GetVersionFileNULLWT" message="tns:GetVersionFileNULLWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileCompressed">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves compressed content of specific document version, using DIME.</documentation>
-      <wsdl:input name="GetVersionFileCompressedWT" message="tns:GetVersionFileCompressedWTSoapIn" />
-      <wsdl:output name="GetVersionFileCompressedWT" message="tns:GetVersionFileCompressedWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileByRef">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves UNC name of a copy of the specified document version</documentation>
-      <wsdl:input name="GetVersionFileByRefWT" message="tns:GetVersionFileByRefWTSoapIn" />
-      <wsdl:output name="GetVersionFileByRefWT" message="tns:GetVersionFileByRefWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileAsHtml">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Returns URL of HTML conversion of the specified document version</documentation>
-      <wsdl:input name="GetVersionFileAsHtmlWT" message="tns:GetVersionFileAsHtmlWTSoapIn" />
-      <wsdl:output name="GetVersionFileAsHtmlWT" message="tns:GetVersionFileAsHtmlWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFile">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves rendition content</documentation>
-      <wsdl:input name="GetRenditionFileWT" message="tns:GetRenditionFileWTSoapIn" />
-      <wsdl:output name="GetRenditionFileWT" message="tns:GetRenditionFileWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFileCompressed">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves compressed content of a rendition, using DIME.</documentation>
-      <wsdl:input name="GetRenditionFileCompressedWT" message="tns:GetRenditionFileCompressedWTSoapIn" />
-      <wsdl:output name="GetRenditionFileCompressedWT" message="tns:GetRenditionFileCompressedWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFileByRef">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves UNC name of a copy of the specified rendition</documentation>
-      <wsdl:input name="GetRenditionFileByRefWT" message="tns:GetRenditionFileByRefWTSoapIn" />
-      <wsdl:output name="GetRenditionFileByRefWT" message="tns:GetRenditionFileByRefWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFileAsHtml">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves URL of HTML conversion of the specified rendition</documentation>
-      <wsdl:input name="GetRenditionFileAsHtmlWT" message="tns:GetRenditionFileAsHtmlWTSoapIn" />
-      <wsdl:output name="GetRenditionFileAsHtmlWT" message="tns:GetRenditionFileAsHtmlWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchDocuments">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for documents in Meridio</documentation>
-      <wsdl:input name="SearchDocumentsWT" message="tns:SearchDocumentsWTSoapIn" />
-      <wsdl:output name="SearchDocumentsWT" message="tns:SearchDocumentsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchRecords">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for records in Meridio</documentation>
-      <wsdl:input name="SearchRecordsWT" message="tns:SearchRecordsWTSoapIn" />
-      <wsdl:output name="SearchRecordsWT" message="tns:SearchRecordsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchContainers">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for containers in Meridio</documentation>
-      <wsdl:input name="SearchContainersWT" message="tns:SearchContainersWTSoapIn" />
-      <wsdl:output name="SearchContainersWT" message="tns:SearchContainersWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchFolders">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for folders in Meridio</documentation>
-      <wsdl:input name="SearchFoldersWT" message="tns:SearchFoldersWTSoapIn" />
-      <wsdl:output name="SearchFoldersWT" message="tns:SearchFoldersWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchParts">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for parts in Meridio</documentation>
-      <wsdl:input name="SearchPartsWT" message="tns:SearchPartsWTSoapIn" />
-      <wsdl:output name="SearchPartsWT" message="tns:SearchPartsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchUsers">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for users in Meridio</documentation>
-      <wsdl:input name="SearchUsersWT" message="tns:SearchUsersWTSoapIn" />
-      <wsdl:output name="SearchUsersWT" message="tns:SearchUsersWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SearchGroups">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Searches for groups in Meridio</documentation>
-      <wsdl:input name="SearchGroupsWT" message="tns:SearchGroupsWTSoapIn" />
-      <wsdl:output name="SearchGroupsWT" message="tns:SearchGroupsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetStoredSearchData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified stored search</documentation>
-      <wsdl:input name="GetStoredSearchDataWT" message="tns:GetStoredSearchDataWTSoapIn" />
-      <wsdl:output name="GetStoredSearchDataWT" message="tns:GetStoredSearchDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified user</documentation>
-      <wsdl:input name="GetUserDataWT" message="tns:GetUserDataWTSoapIn" />
-      <wsdl:output name="GetUserDataWT" message="tns:GetUserDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLimitedUserData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified user</documentation>
-      <wsdl:input name="GetLimitedUserDataWT" message="tns:GetLimitedUserDataWTSoapIn" />
-      <wsdl:output name="GetLimitedUserDataWT" message="tns:GetLimitedUserDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetSessionUser">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Gets ID of session user and indicates user privileges</documentation>
-      <wsdl:input name="GetSessionUserWT" message="tns:GetSessionUserWTSoapIn" />
-      <wsdl:output name="GetSessionUserWT" message="tns:GetSessionUserWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ChangePassword">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Changes password for session user</documentation>
-      <wsdl:input name="ChangePasswordWT" message="tns:ChangePasswordWTSoapIn" />
-      <wsdl:output name="ChangePasswordWT" message="tns:ChangePasswordWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves data relating to a specified group.</documentation>
-      <wsdl:input name="GetGroupDataWT" message="tns:GetGroupDataWTSoapIn" />
-      <wsdl:output name="GetGroupDataWT" message="tns:GetGroupDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetEdcConfig">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Retrieves all Enterprise Document Capture configuration settings.</documentation>
-      <wsdl:input name="GetEdcConfigWT" message="tns:GetEdcConfigWTSoapIn" />
-      <wsdl:output name="GetEdcConfigWT" message="tns:GetEdcConfigWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="TypeExport">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">This method exists only to export enum types from DMWS. It should never be called by clients.</documentation>
-      <wsdl:input message="tns:TypeExportSoapIn" />
-      <wsdl:output message="tns:TypeExportSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="MeridioDMSoap" type="tns:MeridioDMSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
-    <wsdl:operation name="Login">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/Login" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="LoginUnified">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/LoginUnifiedWithClientWorkstation" style="document" />
-      <wsdl:input name="LoginUnifiedWithClientWorkstation">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="LoginUnifiedWithClientWorkstation">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="Logout">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/LogoutWT" style="document" />
-      <wsdl:input name="LogoutWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="LogoutWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ApplyChanges">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/ApplyChanges" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-        <soap:header message="tns:ApplyChangesMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddObject">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/AddObject2WT" style="document" />
-      <wsdl:input name="AddObject2WT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="AddObject2WT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteObject">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/DeleteObjectWT" style="document" />
-      <wsdl:input name="DeleteObjectWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="DeleteObjectWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteVersion">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/DeleteVersionWT" style="document" />
-      <wsdl:input name="DeleteVersionWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="DeleteVersionWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CancelVersionDeletion">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/CancelVersionDeletionWT" style="document" />
-      <wsdl:input name="CancelVersionDeletionWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CancelVersionDeletionWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CancelDocumentDeletion">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/CancelDocumentDeletionWT" style="document" />
-      <wsdl:input name="CancelDocumentDeletionWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CancelDocumentDeletionWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CopyDocument">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/CopyDocumentWT" style="document" />
-      <wsdl:input name="CopyDocumentWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CopyDocumentWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CopyDocument">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/CopyDocument2WT" style="document" />
-      <wsdl:input name="CopyDocument2WT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CopyDocument2WT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DiscontinueRelationship">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/DiscontinueRelationshipWT" style="document" />
-      <wsdl:input name="DiscontinueRelationshipWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="DiscontinueRelationshipWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ChangeContainerParent">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/ChangeContainerParentWT" style="document" />
-      <wsdl:input name="ChangeContainerParentWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ChangeContainerParentWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SignVersion">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SignVersionWT" style="document" />
-      <wsdl:input name="SignVersionWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SignVersionWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveSignature">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/RemoveSignatureWT" style="document" />
-      <wsdl:input name="RemoveSignatureWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="RemoveSignatureWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="VerifySignature">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/VerifySignatureWT" style="document" />
-      <wsdl:input name="VerifySignatureWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="VerifySignatureWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetStaticData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetStaticDataWT" style="document" />
-      <wsdl:input name="GetStaticDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetStaticDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetCategories">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetCategoriesWT" style="document" />
-      <wsdl:input name="GetCategoriesWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetCategoriesWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetKeywords">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetKeywordsWT" style="document" />
-      <wsdl:input name="GetKeywordsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetKeywordsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetSignatures">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetSignaturesWT" style="document" />
-      <wsdl:input name="GetSignaturesWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetSignaturesWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetKeywordContext">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetKeywordContextWT" style="document" />
-      <wsdl:input name="GetKeywordContextWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetKeywordContextWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetOtherSystems">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetOtherSystemsWT" style="document" />
-      <wsdl:input name="GetOtherSystemsWT">
-        <soap:body use="literal" />
-        <soap:header message="tns:GetOtherSystemsWTMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetOtherSystemsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetOtherSystem">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetOtherSystem" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-        <soap:header message="tns:GetOtherSystemMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPlaceHolderAccounts">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetPlaceHolderAccountsWT" style="document" />
-      <wsdl:input name="GetPlaceHolderAccountsWT">
-        <soap:body use="literal" />
-        <soap:header message="tns:GetPlaceHolderAccountsWTMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPlaceHolderAccountsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPlaceHolderAccount">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetPlaceHolderAccountWT" style="document" />
-      <wsdl:input name="GetPlaceHolderAccountWT">
-        <soap:body use="literal" />
-        <soap:header message="tns:GetPlaceHolderAccountWTMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPlaceHolderAccountWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetReplicationToSlaveMultiple">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetReplicationToSlaveMultipleWT" style="document" />
-      <wsdl:input name="GetReplicationToSlaveMultipleWT">
-        <soap:body use="literal" />
-        <soap:header message="tns:GetReplicationToSlaveMultipleWTMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetReplicationToSlaveMultipleWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetReplicationToSlave">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetReplicationToSlaveWT" style="document" />
-      <wsdl:input name="GetReplicationToSlaveWT">
-        <soap:body use="literal" />
-        <soap:header message="tns:GetReplicationToSlaveWTMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetReplicationToSlaveWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetReplicationToSlave">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetReplicationToSlave1WT" style="document" />
-      <wsdl:input name="GetReplicationToSlave1WT">
-        <soap:body use="literal" />
-        <soap:header message="tns:GetReplicationToSlave1WTMeridioCredentialHeader" part="MeridioCredentialHeader" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetReplicationToSlave1WT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetTopContainer">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetTopContainerWT" style="document" />
-      <wsdl:input name="GetTopContainerWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetTopContainerWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetContainerData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetContainerDataWT" style="document" />
-      <wsdl:input name="GetContainerDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetContainerDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLimitedContainerData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetLimitedContainerDataWT" style="document" />
-      <wsdl:input name="GetLimitedContainerDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLimitedContainerDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertiesForContainers">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetPropertiesForContainersWT" style="document" />
-      <wsdl:input name="GetPropertiesForContainersWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPropertiesForContainersWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetContainerContext">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetContainerContextWT" style="document" />
-      <wsdl:input name="GetContainerContextWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetContainerContextWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDocumentReferences">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetDocumentReferencesWT" style="document" />
-      <wsdl:input name="GetDocumentReferencesWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDocumentReferencesWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDocumentData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetDocumentDataWT" style="document" />
-      <wsdl:input name="GetDocumentDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDocumentDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertiesForDocuments">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetPropertiesForDocumentsWT" style="document" />
-      <wsdl:input name="GetPropertiesForDocumentsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPropertiesForDocumentsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetVersionDataWT" style="document" />
-      <wsdl:input name="GetVersionDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetVersionDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetRenditionDataWT" style="document" />
-      <wsdl:input name="GetRenditionDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRenditionDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRelationshipData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetRelationshipDataWT" style="document" />
-      <wsdl:input name="GetRelationshipDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRelationshipDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFile">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetLatestVersionFileWT" style="document" />
-      <wsdl:input name="GetLatestVersionFileWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLatestVersionFileWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFileCompressed">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetLatestVersionFileCompressedWT" style="document" />
-      <wsdl:input name="GetLatestVersionFileCompressedWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLatestVersionFileCompressedWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFileByRef">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetLatestVersionFileByRefWT" style="document" />
-      <wsdl:input name="GetLatestVersionFileByRefWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLatestVersionFileByRefWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLatestVersionFileAsHtml">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetLatestVersionFileAsHtmlWT" style="document" />
-      <wsdl:input name="GetLatestVersionFileAsHtmlWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLatestVersionFileAsHtmlWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFile">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetVersionFileWT" style="document" />
-      <wsdl:input name="GetVersionFileWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetVersionFileWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileNULL">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetVersionFileNULLWT" style="document" />
-      <wsdl:input name="GetVersionFileNULLWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetVersionFileNULLWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileCompressed">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetVersionFileCompressedWT" style="document" />
-      <wsdl:input name="GetVersionFileCompressedWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetVersionFileCompressedWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileByRef">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetVersionFileByRefWT" style="document" />
-      <wsdl:input name="GetVersionFileByRefWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetVersionFileByRefWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionFileAsHtml">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetVersionFileAsHtmlWT" style="document" />
-      <wsdl:input name="GetVersionFileAsHtmlWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetVersionFileAsHtmlWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFile">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetRenditionFileWT" style="document" />
-      <wsdl:input name="GetRenditionFileWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRenditionFileWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFileCompressed">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetRenditionFileCompressedWT" style="document" />
-      <wsdl:input name="GetRenditionFileCompressedWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRenditionFileCompressedWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFileByRef">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetRenditionFileByRefWT" style="document" />
-      <wsdl:input name="GetRenditionFileByRefWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRenditionFileByRefWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRenditionFileAsHtml">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetRenditionFileAsHtmlWT" style="document" />
-      <wsdl:input name="GetRenditionFileAsHtmlWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRenditionFileAsHtmlWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchDocuments">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchDocumentsWT" style="document" />
-      <wsdl:input name="SearchDocumentsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchDocumentsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchRecords">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchRecordsWT" style="document" />
-      <wsdl:input name="SearchRecordsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchRecordsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchContainers">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchContainersWT" style="document" />
-      <wsdl:input name="SearchContainersWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchContainersWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchFolders">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchFoldersWT" style="document" />
-      <wsdl:input name="SearchFoldersWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchFoldersWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchParts">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchPartsWT" style="document" />
-      <wsdl:input name="SearchPartsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchPartsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchUsers">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchUsersWT" style="document" />
-      <wsdl:input name="SearchUsersWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchUsersWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SearchGroups">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/SearchGroupsWT" style="document" />
-      <wsdl:input name="SearchGroupsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SearchGroupsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetStoredSearchData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetStoredSearchDataWT" style="document" />
-      <wsdl:input name="GetStoredSearchDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetStoredSearchDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetUserDataWT" style="document" />
-      <wsdl:input name="GetUserDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetUserDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLimitedUserData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetLimitedUserDataWT" style="document" />
-      <wsdl:input name="GetLimitedUserDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLimitedUserDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetSessionUser">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetSessionUserWT" style="document" />
-      <wsdl:input name="GetSessionUserWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetSessionUserWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ChangePassword">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/ChangePasswordWT" style="document" />
-      <wsdl:input name="ChangePasswordWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ChangePasswordWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetGroupDataWT" style="document" />
-      <wsdl:input name="GetGroupDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetGroupDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetEdcConfig">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/GetEdcConfigWT" style="document" />
-      <wsdl:input name="GetEdcConfigWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetEdcConfigWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="TypeExport">
-      <soap:operation soapAction="http://www.meridio.com/MeridioDMWS/TypeExport" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="MeridioDM">
-    <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Meridio Document Management Web Service.</documentation>
-    <wsdl:port name="MeridioDMSoap" binding="tns:MeridioDMSoap">
-      <soap:address location="http://mersvr01/DMWS/MeridioDMWS.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
\ No newline at end of file
diff --git a/connectors/meridio/wsdls/MeridioRMWS_axis.wsdl b/connectors/meridio/wsdls/MeridioRMWS_axis.wsdl
deleted file mode 100644
index 18de26d..0000000
--- a/connectors/meridio/wsdls/MeridioRMWS_axis.wsdl
+++ /dev/null
@@ -1,7248 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<wsdl:definitions xmlns:s1="http://microsoft.com/wsdl/types/"
-                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
-                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
-                  xmlns:i1="http://www.meridio.com/RMClassificationDataSet.xsd"
-                  xmlns:s="http://www.w3.org/2001/XMLSchema"
-                  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
-                  xmlns:i0="http://www.meridio.com/RMDataSet.xsd"
-                  xmlns:tns="http://www.meridio.com/MeridioRMWS"
-                  xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
-                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
-                  targetNamespace="http://www.meridio.com/MeridioRMWS"
-                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:import namespace="http://www.meridio.com/RMDataSet.xsd" location="RMDataSet.xsd" />
-  <wsdl:import namespace="http://www.meridio.com/RMClassificationDataSet.xsd" location="RMClassificationDataSet.xsd" />
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://www.meridio.com/MeridioRMWS">
-      <s:import namespace="http://www.meridio.com/RMDataSet.xsd" />
-      <s:import namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-      <s:import namespace="http://microsoft.com/wsdl/types/" />
-      <s:element name="ResolveServiceUrl">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="majorVersion" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="minorVersion" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="build" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="revision" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ResolveServiceUrlResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ResolveServiceUrlResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertyDefs">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetPropertyDefsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertyDefsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetConfiguration">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetConfigurationResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetConfigurationResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEvent">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEventResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetExternalEventResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="MeridioCredentialHeader" type="tns:MeridioCredentialHeader" />
-      <s:complexType name="MeridioCredentialHeader">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="1" name="Token" type="s:string" />
-        </s:sequence>
-      </s:complexType>
-      <s:element name="GetExternalEventWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEventWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetExternalEventWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEventList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEventListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetExternalEventListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEventListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetExternalEventListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetExternalEventListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEventTypeListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEventTypeListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeFilteredList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeFilteredListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEventTypeFilteredListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeFilteredListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEventTypeFilteredListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEventTypeFilteredListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriod">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getEventTypes" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExternalEvents" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRetentionPeriodResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getEventTypes" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExternalEvents" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRetentionPeriodWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getEventTypes" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExternalEvents" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRetentionPeriodListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getEventTypes" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getExternalEvents" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRetentionPeriodListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRetentionPeriodListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelocationHistory">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelocationHistoryResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRelocationHistoryResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelocationHistoryWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelocationHistoryWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRelocationHistoryWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelatedFolders">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildren" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelatedFoldersResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRelatedFoldersResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelatedFoldersWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getChildren" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRelatedFoldersWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRelatedFoldersWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalSchedule">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChain">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleFilteredListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleFilteredListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredList2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredList2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleFilteredList2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredList2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalInstructions" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRetentionPeriods" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleFilteredList2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleFilteredList2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainFilteredListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainFilteredListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredList2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredList2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainFilteredList2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredList2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainFilteredList2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainFilteredList2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainForCategory">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="categoryId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainForCategoryResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainForCategoryResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainForCategoryWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleChainForCategoryWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleChainForCategoryWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleForCategory">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="categoryId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleForCategoryResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleForCategoryResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleForCategoryWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="categoryId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleForCategoryWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleForCategoryWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalInstructionList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalInstructionListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalInstructionListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalInstructionListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalInstructionListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalInstructionListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleHistory">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleHistoryResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleHistoryResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleHistoryWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisposalScheduleHistoryWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisposalScheduleHistoryWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategory">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getProtectiveMarkingDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingCategoryResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getProtectiveMarkingDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingCategoryWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getProtectiveMarkingDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingCategoryListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getProtectiveMarkingDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingCategoryListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingCategoryListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDef">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingDefResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingDefWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingDefListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingDefListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingDefListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingHistoryList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingHistoryListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingHistoryListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingHistoryListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingHistoryListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingHistoryListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListForObjects">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectIds" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListForObjectsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingListForObjectsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListForObjectsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectIds" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetProtectiveMarkingListForObjectsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetProtectiveMarkingListForObjectsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetActivitiesListForObject">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetActivitiesListForObjectResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetActivitiesListForObjectResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetActivitiesListForObjectWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetActivitiesListForObjectWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetActivitiesListForObjectWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAccessControlHistoryList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAccessControlHistoryListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetAccessControlHistoryListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAccessControlHistoryListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAccessControlHistoryListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetAccessControlHistoryListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchy">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchyResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationHierarchyResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchyWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchyWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationHierarchyWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchy2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="blnGetChildClasses" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxNumChildren" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchy2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationHierarchy2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchy2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="blnGetChildClasses" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="maxNumChildren" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationHierarchy2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationHierarchy2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContents">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContentsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassContentsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContentsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContentsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassContentsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContents2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="nStartClassPos" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nStartFolderPos" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nMaxClassEntries" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nMaxFolderEntries" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContents2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassContents2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="nTotalClassEntries" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nTotalFolderEntries" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContents2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="nStartClassPos" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nStartFolderPos" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nMaxClassEntries" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nMaxFolderEntries" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassContents2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassContents2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="nTotalClassEntries" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nTotalFolderEntries" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForObjects">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectIds" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForObjectsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForObjectsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForObjectsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectIds" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPropertiesForObjectsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPropertiesForObjectsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClass">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderParts">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="nStartPartPos" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nMaxParts" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderPartsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderPartsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="nTotalParts" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderPartsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="nStartPartPos" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="nMaxParts" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderPartsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderPartsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="nTotalParts" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolder">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolder2">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolder2Response">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolder2Result">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolder2WT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolder2WTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolder2WTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderContents">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderContentsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderContentsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderContentsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderContentsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderContentsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPart">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getContents" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartContents">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentStartPosition" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentMax" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordStartPosition" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordMax" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartContentsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartContentsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="documentTotal" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordTotal" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartContentsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentStartPosition" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentMax" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordStartPosition" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordMax" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartContentsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartContentsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="1" maxOccurs="1" name="documentTotal" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordTotal" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecord">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordVersions">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="recordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordVersionsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordVersionsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordVersionsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordVersionsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordVersionsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordPartList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordPartListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordPartListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordPartListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getActivities" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordPartListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordPartListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentPartList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="documentId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentPartListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentPartListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentPartListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDocumentPartListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDocumentPartListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRequestCheckoutDetails">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="requestState" type="tns:RMRequestStateType" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getFolders" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getMarkers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="RMRequestStateType">
-        <s:restriction base="s:string">
-          <s:enumeration value="AllItems" />
-          <s:enumeration value="RequestedItems" />
-          <s:enumeration value="RequestedOrCheckedOutItems" />
-          <s:enumeration value="CurrentlyCheckedOutItems" />
-          <s:enumeration value="CollectionRequestedItems" />
-          <s:enumeration value="CheckedInItems" />
-          <s:enumeration value="TransitOutgoing" />
-          <s:enumeration value="TransitIncoming" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="GetRequestCheckoutDetailsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRequestCheckoutDetailsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRequestCheckoutDetailsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="userId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="requestState" type="tns:RMRequestStateType" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getFolders" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getMarkers" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRequestCheckoutDetailsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRequestCheckoutDetailsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReleaseHistory">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReleaseHistoryResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReleaseHistoryResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReleaseHistoryWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReleaseHistoryWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReleaseHistoryWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReviewHistoryList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReviewHistoryListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReviewHistoryListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReviewHistoryListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReviewHistoryListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReviewHistoryListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChanges">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ds">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyChangesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="ds">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyChangesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEffectiveItemList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getFolders" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEffectiveItemListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEffectiveItemListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEffectiveItemListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getFolders" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetEffectiveItemListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetEffectiveItemListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderConflictingItemList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderConflictingItemListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderConflictingItemListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderConflictingItemListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFolderConflictingItemListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFolderConflictingItemListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartConflictingItemList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartConflictingItemListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartConflictingItemListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartConflictingItemListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartConflictingItemListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartConflictingItemListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordConflictingPartList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordConflictingPartListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordConflictingPartListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordConflictingPartListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordConflictingPartListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordConflictingPartListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFoldersWithConflictsList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFoldersWithConflictsListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFoldersWithConflictsListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFoldersWithConflictsListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFoldersWithConflictsListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFoldersWithConflictsListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartsWithConflictsList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartsWithConflictsListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartsWithConflictsListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartsWithConflictsListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPartsWithConflictsListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPartsWithConflictsListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordsWithConflictsList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordsWithConflictsListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordsWithConflictsListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordsWithConflictsListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getDisposalSchedules" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="filter" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getCustomProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecordsWithConflictsListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecordsWithConflictsListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ExecuteDisposal">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="markDocumentsForDelete" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="approvePhysicalItemDispose" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ExecuteDisposalResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ExecuteDisposalWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="markDocumentsForDelete" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="approvePhysicalItemDispose" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ExecuteDisposalWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRecentFolderList">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRecentFolderListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecentFolderListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecentFolderListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRecentFolderListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRecentFolderListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestFoldersForDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="documentOrRecordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestFoldersForDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SuggestFoldersForDocumentResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestFoldersForDocumentWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentOrRecordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestFoldersForDocumentWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SuggestFoldersForDocumentWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestPartsForDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="documentOrRecordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestPartsForDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SuggestPartsForDocumentResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestPartsForDocumentWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentOrRecordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SuggestPartsForDocumentWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SuggestPartsForDocumentWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserPrivilegeList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserPrivilegeListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserPrivilegeListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserPrivilegeListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserPrivilegeListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserPrivilegeListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLookupValueList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLookupValueListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLookupValueListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLookupValueListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetLookupValueListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetLookupValueListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSystemLookupAndValueList">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetSystemLookupAndValueListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSystemLookupAndValueListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSystemLookupAndValueListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSystemLookupAndValueListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSystemLookupAndValueListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SelectData">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fillTable" type="tns:ArrayOfString" />
-            <s:element minOccurs="0" maxOccurs="1" name="fromClause" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="whereClause" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:complexType name="ArrayOfString">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
-        </s:sequence>
-      </s:complexType>
-      <s:element name="SelectDataResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SelectDataResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SelectDataWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="fillTable" type="tns:ArrayOfString" />
-            <s:element minOccurs="0" maxOccurs="1" name="fromClause" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="whereClause" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SelectDataWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SelectDataWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRmObjects">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="whereClause" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getClasses" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getFolders" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRmObjectsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRmObjectsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRmObjectsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="whereClause" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getClasses" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getFolders" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getParts" type="s:boolean" />
-            <s:element minOccurs="1" maxOccurs="1" name="getRecords" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRmObjectsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRmObjectsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSystemActivityList">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetSystemActivityListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSystemActivityListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSystemActivityListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSystemActivityListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSystemActivityListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreatePhysicalMarker">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="partId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="facilityId" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="barcode" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalHomeLocation" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalCurrentLocation" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalContentsList" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreatePhysicalMarkerResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CreatePhysicalMarkerWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="partId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="facilityId" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="barcode" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalHomeLocation" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalCurrentLocation" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalContentsList" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreatePhysicalMarkerWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CreatePhysicalMarkerWithoutFacility">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="partId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentId" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="barcode" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalCurrentLocation" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalContentsList" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreatePhysicalMarkerWithoutFacilityResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CreatePhysicalMarkerWithoutFacilityWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="partId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="documentId" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="barcode" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalCurrentLocation" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="physicalContentsList" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreatePhysicalMarkerWithoutFacilityWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetHold">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldItemList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldItemListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldItemListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetItemHoldListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetItemHoldListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetItemHoldListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListFilter">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="createdByUserName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="namedAuthority" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListFilterResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldListFilterResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListFilterWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="createdByUserName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="namedAuthority" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldListFilterWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldListFilterWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetItemHoldList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetItemHoldListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetItemHoldListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldItemListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetHoldItemListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetHoldItemListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisclosabilityHistoryList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisclosabilityHistoryListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisclosabilityHistoryListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisclosabilityHistoryListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetDisclosabilityHistoryListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetDisclosabilityHistoryListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdatePartRetrievalDate">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="partId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdatePartRetrievalDateResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="UpdatePartRetrievalDateWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="partId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="recordId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdatePartRetrievalDateWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRolesAndMembership">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRolesAndMembershipResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRolesAndMembershipResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRolesAndMembershipWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRolesAndMembershipWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRolesAndMembershipWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSelectedRolesAndMembership">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupIds" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSelectedRolesAndMembershipResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSelectedRolesAndMembershipResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSelectedRolesAndMembershipWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="groupIds" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetSelectedRolesAndMembershipWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetSelectedRolesAndMembershipWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacility">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFacilityResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFacilityWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFacilityListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="getPropDefs" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetFacilityListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetFacilityListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSettingList">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetUserSettingListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserSettingListResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSettingListWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSettingListWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserSettingListWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSetting">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSettingResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserSettingResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSettingWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserSettingWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserSettingWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SetUserSetting">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="value" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SetUserSettingResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="SetUserSettingWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="value" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SetUserSettingWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CascadeApplyChanges">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="dsChanges">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CascadeApplyChangesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CascadeApplyChangesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CascadeApplyChangesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="dsChanges">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CascadeApplyChangesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CascadeApplyChangesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetObjectAndContents">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetObjectAndContentsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetObjectAndContentsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetObjectAndContentsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetObjectAndContentsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetObjectAndContentsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApproveDisposal">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApproveDisposalResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ApproveDisposalWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApproveDisposalWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CancelDisposal">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelDisposalResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CancelDisposalWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CancelDisposalWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="SelectReferenceCodePattern">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="ParentObjectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SelectReferenceCodePatternResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SelectReferenceCodePatternResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SelectReferenceCodePatternWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="ParentObjectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="SelectReferenceCodePatternWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="SelectReferenceCodePatternWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCode">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="ParentObjectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCodeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GenerateReferenceCodeResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCodeWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="ParentObjectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCodeWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GenerateReferenceCodeWTResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ClearAllReferenceCodes">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ClearAllReferenceCodesResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ClearAllReferenceCodeWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectType" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ClearAllReferenceCodeWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetReferenceCodePattern">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReferenceCodePatternResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReferenceCodePatternResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReferenceCodePatternWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetReferenceCodePatternWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetReferenceCodePatternWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetChildReferenceCodePattern">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetChildReferenceCodePatternResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetChildReferenceCodePatternResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetChildReferenceCodePatternWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetChildReferenceCodePatternWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetChildReferenceCodePatternWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCodesForClassHierarchy">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="topMostClassObjectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="classId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="subLevel" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCodesForClassHierarchyResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GenerateReferenceCodesForHierarchyWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="topMostClassObjectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="classId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="subLevel" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GenerateReferenceCodesForHierarchyWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetClassification">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectid" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getClassificationGuides" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="objectid" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="getClassificationGuides" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuides">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetClassificationGuidesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationGuidesResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuidesWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuidesWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationGuidesWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuide">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="guideId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuideResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationGuideResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuideWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="guideId" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationGuideWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationGuideWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationEnums">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetClassificationEnumsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationEnumsResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationEnumsWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetClassificationEnumsWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetClassificationEnumsWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesClassification">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ds">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesClassificationResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyChangesClassificationResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-
-<!--
-      <s:element name="ApplyChangesClassificationWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="ds">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyChangesClassificationWTResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyChangesClassificationWTResult">
-              <s:complexType>
-                <s:sequence>
-                  <s:any namespace="http://www.meridio.com/RMClassificationDataSet.xsd" />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
--->
-      <s:element name="ReleaseRecordOwnership">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ReleaseRecordOwnershipResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ReleaseRecordOwnershipWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ReleaseRecordOwnershipWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ConvertReplicaToOriginal">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="parentObjectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="parentObjectType" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCopiedDocs" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ConvertReplicaToOriginalResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ConvertReplicaToOriginalWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="parentObjectId" type="s:int" />
-            <s:element minOccurs="1" maxOccurs="1" name="parentObjectType" type="s:int" />
-            <s:element minOccurs="0" maxOccurs="1" name="strCopiedDocs" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ConvertReplicaToOriginalWTResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ConvertReplicasFromHomeSystemToOriginal">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="homeSystemGuid" type="s1:guid" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ConvertReplicasFromHomeSystemToOriginalResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="ConvertReplicasFromHomeSystemToOriginalWT">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strAuthToken" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="homeSystemGuid" type="s1:guid" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ConvertReplicasFromHomeSystemToOriginalWTResponse">
-        <s:complexType />
-      </s:element>
-    </s:schema>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://microsoft.com/wsdl/types/">
-      <s:simpleType name="guid">
-        <s:restriction base="s:string">
-          <s:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
-        </s:restriction>
-      </s:simpleType>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="ResolveServiceUrlSoapIn">
-    <wsdl:part name="parameters" element="tns:ResolveServiceUrl" />
-  </wsdl:message>
-  <wsdl:message name="ResolveServiceUrlSoapOut">
-    <wsdl:part name="parameters" element="tns:ResolveServiceUrlResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertyDefsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertyDefs" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertyDefsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertyDefsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetConfigurationSoapIn">
-    <wsdl:part name="parameters" element="tns:GetConfiguration" />
-  </wsdl:message>
-  <wsdl:message name="GetConfigurationSoapOut">
-    <wsdl:part name="parameters" element="tns:GetConfigurationResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventSoapIn">
-    <wsdl:part name="parameters" element="tns:GetExternalEvent" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventSoapOut">
-    <wsdl:part name="parameters" element="tns:GetExternalEventResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetExternalEventWT" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetExternalEventWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetExternalEventList" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetExternalEventListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetExternalEventListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetExternalEventListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetExternalEventListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEventTypeList" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEventTypeListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEventTypeListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEventTypeListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeFilteredListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEventTypeFilteredList" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeFilteredListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEventTypeFilteredListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeFilteredListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeFilteredListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEventTypeFilteredListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetEventTypeFilteredListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEventTypeFilteredListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriod" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodList" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRetentionPeriodListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRetentionPeriodListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRelocationHistorySoapIn">
-    <wsdl:part name="parameters" element="tns:GetRelocationHistory" />
-  </wsdl:message>
-  <wsdl:message name="GetRelocationHistorySoapOut">
-    <wsdl:part name="parameters" element="tns:GetRelocationHistoryResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRelocationHistoryMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRelocationHistoryWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRelocationHistoryWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRelocationHistoryWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRelocationHistoryWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRelatedFoldersSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRelatedFolders" />
-  </wsdl:message>
-  <wsdl:message name="GetRelatedFoldersSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRelatedFoldersResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRelatedFoldersMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRelatedFoldersWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRelatedFoldersWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRelatedFoldersWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRelatedFoldersWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalSchedule" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChain" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainList" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleList" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredList" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredList2SoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredList2" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredList2SoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredList2Response" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredList2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredList2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredList2WT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleFilteredList2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleFilteredList2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredList" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredList2SoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredList2" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredList2SoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredList2Response" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredList2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredList2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredList2WT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainFilteredList2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainFilteredList2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainForCategorySoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainForCategory" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainForCategorySoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainForCategoryResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainForCategoryMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainForCategoryWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainForCategoryWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleChainForCategoryWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleChainForCategoryWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleForCategorySoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleForCategory" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleForCategorySoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleForCategoryResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleForCategoryMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleForCategoryWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleForCategoryWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleForCategoryWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleForCategoryWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalInstructionListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalInstructionList" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalInstructionListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalInstructionListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalInstructionListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalInstructionListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalInstructionListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalInstructionListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalInstructionListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleHistorySoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleHistory" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleHistorySoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleHistoryResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleHistoryMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleHistoryWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleHistoryWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisposalScheduleHistoryWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisposalScheduleHistoryWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategorySoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategory" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategorySoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryList" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingCategoryListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingCategoryListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDef" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefList" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingDefListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingDefListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingList" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingHistoryListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingHistoryList" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingHistoryListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingHistoryListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingHistoryListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingHistoryListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingHistoryListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingHistoryListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingHistoryListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListForObjectsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListForObjects" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListForObjectsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListForObjectsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListForObjectsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListForObjectsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListForObjectsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetProtectiveMarkingListForObjectsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetProtectiveMarkingListForObjectsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetActivitiesListForObjectSoapIn">
-    <wsdl:part name="parameters" element="tns:GetActivitiesListForObject" />
-  </wsdl:message>
-  <wsdl:message name="GetActivitiesListForObjectSoapOut">
-    <wsdl:part name="parameters" element="tns:GetActivitiesListForObjectResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetActivitiesListForObjectMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetActivitiesListForObjectWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetActivitiesListForObjectWT" />
-  </wsdl:message>
-  <wsdl:message name="GetActivitiesListForObjectWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetActivitiesListForObjectWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetAccessControlHistoryListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetAccessControlHistoryList" />
-  </wsdl:message>
-  <wsdl:message name="GetAccessControlHistoryListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetAccessControlHistoryListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetAccessControlHistoryListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetAccessControlHistoryListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetAccessControlHistoryListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetAccessControlHistoryListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetAccessControlHistoryListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchySoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchy" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchySoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchyResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchyMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchyWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchyWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchyWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchyWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchy2SoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchy2" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchy2SoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchy2Response" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchy2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchy2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchy2WT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationHierarchy2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationHierarchy2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContentsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassContents" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContentsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassContentsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContentsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContentsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassContentsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContentsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassContentsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContents2SoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassContents2" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContents2SoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassContents2Response" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContents2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContents2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassContents2WT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassContents2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassContents2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForObjectsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForObjects" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForObjectsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForObjectsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForObjectsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForObjectsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForObjectsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPropertiesForObjectsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPropertiesForObjectsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClass" />
-  </wsdl:message>
-  <wsdl:message name="GetClassSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderPartsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderParts" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderPartsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderPartsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderPartsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderPartsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderPartsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderPartsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderPartsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolder" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolder2SoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolder2" />
-  </wsdl:message>
-  <wsdl:message name="GetFolder2SoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolder2Response" />
-  </wsdl:message>
-  <wsdl:message name="GetFolder2MeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFolder2WTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolder2WT" />
-  </wsdl:message>
-  <wsdl:message name="GetFolder2WTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolder2WTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderContentsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderContents" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderContentsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderContentsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderContentsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderContentsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderContentsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderContentsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderContentsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPart" />
-  </wsdl:message>
-  <wsdl:message name="GetPartSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPartWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPartWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartContentsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartContents" />
-  </wsdl:message>
-  <wsdl:message name="GetPartContentsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartContentsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartContentsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPartContentsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartContentsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPartContentsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartContentsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecord" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordVersionsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordVersions" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordVersionsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordVersionsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordVersionsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordVersionsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordVersionsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordVersionsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordVersionsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordPartListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordPartList" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordPartListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordPartListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordPartListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordPartListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordPartListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordPartListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordPartListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentPartListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentPartList" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentPartListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentPartListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentPartListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentPartListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDocumentPartListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDocumentPartListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDocumentPartListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRequestCheckoutDetailsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRequestCheckoutDetails" />
-  </wsdl:message>
-  <wsdl:message name="GetRequestCheckoutDetailsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRequestCheckoutDetailsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRequestCheckoutDetailsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRequestCheckoutDetailsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRequestCheckoutDetailsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRequestCheckoutDetailsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRequestCheckoutDetailsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReleaseHistorySoapIn">
-    <wsdl:part name="parameters" element="tns:GetReleaseHistory" />
-  </wsdl:message>
-  <wsdl:message name="GetReleaseHistorySoapOut">
-    <wsdl:part name="parameters" element="tns:GetReleaseHistoryResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReleaseHistoryMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReleaseHistoryWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReleaseHistoryWT" />
-  </wsdl:message>
-  <wsdl:message name="GetReleaseHistoryWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReleaseHistoryWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReviewHistoryListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReviewHistoryList" />
-  </wsdl:message>
-  <wsdl:message name="GetReviewHistoryListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReviewHistoryListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReviewHistoryListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReviewHistoryListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReviewHistoryListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetReviewHistoryListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReviewHistoryListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyChanges" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyChangesResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyChangesWT" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyChangesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEffectiveItemListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEffectiveItemList" />
-  </wsdl:message>
-  <wsdl:message name="GetEffectiveItemListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEffectiveItemListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetEffectiveItemListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetEffectiveItemListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetEffectiveItemListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetEffectiveItemListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetEffectiveItemListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderConflictingItemListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderConflictingItemList" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderConflictingItemListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderConflictingItemListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderConflictingItemListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderConflictingItemListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFolderConflictingItemListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFolderConflictingItemListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFolderConflictingItemListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartConflictingItemListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartConflictingItemList" />
-  </wsdl:message>
-  <wsdl:message name="GetPartConflictingItemListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartConflictingItemListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartConflictingItemListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPartConflictingItemListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartConflictingItemListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPartConflictingItemListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartConflictingItemListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordConflictingPartListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordConflictingPartList" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordConflictingPartListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordConflictingPartListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordConflictingPartListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordConflictingPartListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordConflictingPartListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordConflictingPartListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordConflictingPartListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFoldersWithConflictsListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFoldersWithConflictsList" />
-  </wsdl:message>
-  <wsdl:message name="GetFoldersWithConflictsListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFoldersWithConflictsListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFoldersWithConflictsListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFoldersWithConflictsListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFoldersWithConflictsListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFoldersWithConflictsListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFoldersWithConflictsListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartsWithConflictsListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartsWithConflictsList" />
-  </wsdl:message>
-  <wsdl:message name="GetPartsWithConflictsListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartsWithConflictsListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetPartsWithConflictsListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetPartsWithConflictsListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPartsWithConflictsListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetPartsWithConflictsListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPartsWithConflictsListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordsWithConflictsListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordsWithConflictsList" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordsWithConflictsListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordsWithConflictsListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordsWithConflictsListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordsWithConflictsListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecordsWithConflictsListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRecordsWithConflictsListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecordsWithConflictsListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ExecuteDisposalSoapIn">
-    <wsdl:part name="parameters" element="tns:ExecuteDisposal" />
-  </wsdl:message>
-  <wsdl:message name="ExecuteDisposalSoapOut">
-    <wsdl:part name="parameters" element="tns:ExecuteDisposalResponse" />
-  </wsdl:message>
-  <wsdl:message name="ExecuteDisposalMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ExecuteDisposalWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ExecuteDisposalWT" />
-  </wsdl:message>
-  <wsdl:message name="ExecuteDisposalWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ExecuteDisposalWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecentFolderListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecentFolderList" />
-  </wsdl:message>
-  <wsdl:message name="GetRecentFolderListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecentFolderListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRecentFolderListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRecentFolderListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRecentFolderListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRecentFolderListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRecentFolderListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SuggestFoldersForDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:SuggestFoldersForDocument" />
-  </wsdl:message>
-  <wsdl:message name="SuggestFoldersForDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:SuggestFoldersForDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="SuggestFoldersForDocumentMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SuggestFoldersForDocumentWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SuggestFoldersForDocumentWT" />
-  </wsdl:message>
-  <wsdl:message name="SuggestFoldersForDocumentWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SuggestFoldersForDocumentWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SuggestPartsForDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:SuggestPartsForDocument" />
-  </wsdl:message>
-  <wsdl:message name="SuggestPartsForDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:SuggestPartsForDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="SuggestPartsForDocumentMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SuggestPartsForDocumentWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SuggestPartsForDocumentWT" />
-  </wsdl:message>
-  <wsdl:message name="SuggestPartsForDocumentWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SuggestPartsForDocumentWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserPrivilegeListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserPrivilegeList" />
-  </wsdl:message>
-  <wsdl:message name="GetUserPrivilegeListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserPrivilegeListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserPrivilegeListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetUserPrivilegeListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserPrivilegeListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetUserPrivilegeListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserPrivilegeListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLookupValueListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLookupValueList" />
-  </wsdl:message>
-  <wsdl:message name="GetLookupValueListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLookupValueListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetLookupValueListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetLookupValueListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetLookupValueListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetLookupValueListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetLookupValueListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemLookupAndValueListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSystemLookupAndValueList" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemLookupAndValueListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSystemLookupAndValueListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemLookupAndValueListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemLookupAndValueListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSystemLookupAndValueListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemLookupAndValueListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSystemLookupAndValueListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SelectDataSoapIn">
-    <wsdl:part name="parameters" element="tns:SelectData" />
-  </wsdl:message>
-  <wsdl:message name="SelectDataSoapOut">
-    <wsdl:part name="parameters" element="tns:SelectDataResponse" />
-  </wsdl:message>
-  <wsdl:message name="SelectDataMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SelectDataWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SelectDataWT" />
-  </wsdl:message>
-  <wsdl:message name="SelectDataWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SelectDataWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRmObjectsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRmObjects" />
-  </wsdl:message>
-  <wsdl:message name="GetRmObjectsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRmObjectsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRmObjectsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRmObjectsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRmObjectsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRmObjectsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRmObjectsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemActivityListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSystemActivityList" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemActivityListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSystemActivityListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemActivityListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemActivityListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSystemActivityListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetSystemActivityListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSystemActivityListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerSoapIn">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarker" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerSoapOut">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerResponse" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerWT" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWithoutFacilitySoapIn">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerWithoutFacility" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWithoutFacilitySoapOut">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerWithoutFacilityResponse" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWithoutFacilityMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWithoutFacilityWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerWithoutFacilityWT" />
-  </wsdl:message>
-  <wsdl:message name="CreatePhysicalMarkerWithoutFacilityWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CreatePhysicalMarkerWithoutFacilityWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHold" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldWT" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldList" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldItemListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldItemList" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldItemListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldItemListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldItemListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetItemHoldListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetItemHoldListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetItemHoldListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetItemHoldListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListFilterSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldListFilter" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListFilterSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldListFilterResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListFilterMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListFilterWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldListFilterWT" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldListFilterWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldListFilterWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetItemHoldListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetItemHoldList" />
-  </wsdl:message>
-  <wsdl:message name="GetItemHoldListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetItemHoldListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetItemHoldListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldItemListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetHoldItemListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetHoldItemListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetHoldItemListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisclosabilityHistoryListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisclosabilityHistoryList" />
-  </wsdl:message>
-  <wsdl:message name="GetDisclosabilityHistoryListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisclosabilityHistoryListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetDisclosabilityHistoryListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetDisclosabilityHistoryListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetDisclosabilityHistoryListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetDisclosabilityHistoryListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetDisclosabilityHistoryListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePartRetrievalDateSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdatePartRetrievalDate" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePartRetrievalDateSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdatePartRetrievalDateResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePartRetrievalDateMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePartRetrievalDateWTSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdatePartRetrievalDateWT" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePartRetrievalDateWTSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdatePartRetrievalDateWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndMembershipSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRolesAndMembership" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndMembershipSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRolesAndMembershipResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndMembershipMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndMembershipWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRolesAndMembershipWT" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndMembershipWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRolesAndMembershipWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSelectedRolesAndMembershipSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSelectedRolesAndMembership" />
-  </wsdl:message>
-  <wsdl:message name="GetSelectedRolesAndMembershipSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSelectedRolesAndMembershipResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetSelectedRolesAndMembershipMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetSelectedRolesAndMembershipWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetSelectedRolesAndMembershipWT" />
-  </wsdl:message>
-  <wsdl:message name="GetSelectedRolesAndMembershipWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetSelectedRolesAndMembershipWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilitySoapIn">
-    <wsdl:part name="parameters" element="tns:GetFacility" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilitySoapOut">
-    <wsdl:part name="parameters" element="tns:GetFacilityResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFacilityWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFacilityWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFacilityList" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFacilityListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetFacilityListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetFacilityListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetFacilityListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserSettingList" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserSettingListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingListMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingListWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserSettingListWT" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingListWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserSettingListWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserSetting" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserSettingResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserSettingWT" />
-  </wsdl:message>
-  <wsdl:message name="GetUserSettingWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserSettingWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SetUserSettingSoapIn">
-    <wsdl:part name="parameters" element="tns:SetUserSetting" />
-  </wsdl:message>
-  <wsdl:message name="SetUserSettingSoapOut">
-    <wsdl:part name="parameters" element="tns:SetUserSettingResponse" />
-  </wsdl:message>
-  <wsdl:message name="SetUserSettingMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SetUserSettingWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SetUserSettingWT" />
-  </wsdl:message>
-  <wsdl:message name="SetUserSettingWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SetUserSettingWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CascadeApplyChangesSoapIn">
-    <wsdl:part name="parameters" element="tns:CascadeApplyChanges" />
-  </wsdl:message>
-  <wsdl:message name="CascadeApplyChangesSoapOut">
-    <wsdl:part name="parameters" element="tns:CascadeApplyChangesResponse" />
-  </wsdl:message>
-  <wsdl:message name="CascadeApplyChangesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CascadeApplyChangesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CascadeApplyChangesWT" />
-  </wsdl:message>
-  <wsdl:message name="CascadeApplyChangesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CascadeApplyChangesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectAndContentsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetObjectAndContents" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectAndContentsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetObjectAndContentsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectAndContentsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectAndContentsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetObjectAndContentsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectAndContentsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetObjectAndContentsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApproveDisposalSoapIn">
-    <wsdl:part name="parameters" element="tns:ApproveDisposal" />
-  </wsdl:message>
-  <wsdl:message name="ApproveDisposalSoapOut">
-    <wsdl:part name="parameters" element="tns:ApproveDisposalResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApproveDisposalMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ApproveDisposalWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ApproveDisposalWT" />
-  </wsdl:message>
-  <wsdl:message name="ApproveDisposalWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ApproveDisposalWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="CancelDisposalSoapIn">
-    <wsdl:part name="parameters" element="tns:CancelDisposal" />
-  </wsdl:message>
-  <wsdl:message name="CancelDisposalSoapOut">
-    <wsdl:part name="parameters" element="tns:CancelDisposalResponse" />
-  </wsdl:message>
-  <wsdl:message name="CancelDisposalMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="CancelDisposalWTSoapIn">
-    <wsdl:part name="parameters" element="tns:CancelDisposalWT" />
-  </wsdl:message>
-  <wsdl:message name="CancelDisposalWTSoapOut">
-    <wsdl:part name="parameters" element="tns:CancelDisposalWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="SelectReferenceCodePatternSoapIn">
-    <wsdl:part name="parameters" element="tns:SelectReferenceCodePattern" />
-  </wsdl:message>
-  <wsdl:message name="SelectReferenceCodePatternSoapOut">
-    <wsdl:part name="parameters" element="tns:SelectReferenceCodePatternResponse" />
-  </wsdl:message>
-  <wsdl:message name="SelectReferenceCodePatternMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="SelectReferenceCodePatternWTSoapIn">
-    <wsdl:part name="parameters" element="tns:SelectReferenceCodePatternWT" />
-  </wsdl:message>
-  <wsdl:message name="SelectReferenceCodePatternWTSoapOut">
-    <wsdl:part name="parameters" element="tns:SelectReferenceCodePatternWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodeSoapIn">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCode" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodeSoapOut">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodeResponse" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodeMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodeWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodeWT" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodeWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodeWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ClearAllReferenceCodesSoapIn">
-    <wsdl:part name="parameters" element="tns:ClearAllReferenceCodes" />
-  </wsdl:message>
-  <wsdl:message name="ClearAllReferenceCodesSoapOut">
-    <wsdl:part name="parameters" element="tns:ClearAllReferenceCodesResponse" />
-  </wsdl:message>
-  <wsdl:message name="ClearAllReferenceCodesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ClearAllReferenceCodeWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ClearAllReferenceCodeWT" />
-  </wsdl:message>
-  <wsdl:message name="ClearAllReferenceCodeWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ClearAllReferenceCodeWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReferenceCodePatternSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReferenceCodePattern" />
-  </wsdl:message>
-  <wsdl:message name="GetReferenceCodePatternSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReferenceCodePatternResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetReferenceCodePatternMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetReferenceCodePatternWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetReferenceCodePatternWT" />
-  </wsdl:message>
-  <wsdl:message name="GetReferenceCodePatternWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetReferenceCodePatternWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetChildReferenceCodePatternSoapIn">
-    <wsdl:part name="parameters" element="tns:GetChildReferenceCodePattern" />
-  </wsdl:message>
-  <wsdl:message name="GetChildReferenceCodePatternSoapOut">
-    <wsdl:part name="parameters" element="tns:GetChildReferenceCodePatternResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetChildReferenceCodePatternMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetChildReferenceCodePatternWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetChildReferenceCodePatternWT" />
-  </wsdl:message>
-  <wsdl:message name="GetChildReferenceCodePatternWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetChildReferenceCodePatternWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodesForClassHierarchySoapIn">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodesForClassHierarchy" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodesForClassHierarchySoapOut">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodesForClassHierarchyResponse" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodesForClassHierarchyMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodesForHierarchyWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodesForHierarchyWT" />
-  </wsdl:message>
-  <wsdl:message name="GenerateReferenceCodesForHierarchyWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GenerateReferenceCodesForHierarchyWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassification" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuidesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuides" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuidesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuidesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuidesMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuidesWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuidesWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuidesWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuidesWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuideSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuide" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuideSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuideResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuideMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuideWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuideWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationGuideWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationGuideWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationEnumsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationEnums" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationEnumsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationEnumsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationEnumsMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationEnumsWTSoapIn">
-    <wsdl:part name="parameters" element="tns:GetClassificationEnumsWT" />
-  </wsdl:message>
-  <wsdl:message name="GetClassificationEnumsWTSoapOut">
-    <wsdl:part name="parameters" element="tns:GetClassificationEnumsWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesClassificationSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyChangesClassification" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesClassificationSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyChangesClassificationResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesClassificationMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-
-<!--
-  <wsdl:message name="ApplyChangesClassificationWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyChangesClassificationWT" />
-  </wsdl:message>
-  <wsdl:message name="ApplyChangesClassificationWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyChangesClassificationWTResponse" />
-  </wsdl:message>
--->
-
-  <wsdl:message name="ReleaseRecordOwnershipSoapIn">
-    <wsdl:part name="parameters" element="tns:ReleaseRecordOwnership" />
-  </wsdl:message>
-  <wsdl:message name="ReleaseRecordOwnershipSoapOut">
-    <wsdl:part name="parameters" element="tns:ReleaseRecordOwnershipResponse" />
-  </wsdl:message>
-  <wsdl:message name="ReleaseRecordOwnershipMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ReleaseRecordOwnershipWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ReleaseRecordOwnershipWT" />
-  </wsdl:message>
-  <wsdl:message name="ReleaseRecordOwnershipWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ReleaseRecordOwnershipWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicaToOriginalSoapIn">
-    <wsdl:part name="parameters" element="tns:ConvertReplicaToOriginal" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicaToOriginalSoapOut">
-    <wsdl:part name="parameters" element="tns:ConvertReplicaToOriginalResponse" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicaToOriginalMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicaToOriginalWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ConvertReplicaToOriginalWT" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicaToOriginalWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ConvertReplicaToOriginalWTResponse" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicasFromHomeSystemToOriginalSoapIn">
-    <wsdl:part name="parameters" element="tns:ConvertReplicasFromHomeSystemToOriginal" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicasFromHomeSystemToOriginalSoapOut">
-    <wsdl:part name="parameters" element="tns:ConvertReplicasFromHomeSystemToOriginalResponse" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicasFromHomeSystemToOriginalMeridioCredentialHeader">
-    <wsdl:part name="MeridioCredentialHeader" element="tns:MeridioCredentialHeader" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicasFromHomeSystemToOriginalWTSoapIn">
-    <wsdl:part name="parameters" element="tns:ConvertReplicasFromHomeSystemToOriginalWT" />
-  </wsdl:message>
-  <wsdl:message name="ConvertReplicasFromHomeSystemToOriginalWTSoapOut">
-    <wsdl:part name="parameters" element="tns:ConvertReplicasFromHomeSystemToOriginalWTResponse" />
-  </wsdl:message>
-
-
-
-
-  <wsdl:portType name="MeridioRMSoap">
-    <wsdl:operation name="ResolveServiceUrl">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Resolve the target RMWS url based upon supplied version information.</documentation>
-      <wsdl:input message="tns:ResolveServiceUrlSoapIn" />
-      <wsdl:output message="tns:ResolveServiceUrlSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertyDefs">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2PropertyDef table populated with property definitions.</documentation>
-      <wsdl:input message="tns:GetPropertyDefsSoapIn" />
-      <wsdl:output message="tns:GetPropertyDefsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetConfiguration">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Config table populated with system configuration values.</documentation>
-      <wsdl:input message="tns:GetConfigurationSoapIn" />
-      <wsdl:output message="tns:GetConfigurationSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetExternalEvent">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ExternalEvent table populated with a row for the requested external event.</documentation>
-      <wsdl:input name="GetExternalEventWT" message="tns:GetExternalEventWTSoapIn" />
-      <wsdl:output name="GetExternalEventWT" message="tns:GetExternalEventWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetExternalEventList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ExternalEvent table populated with rows for all external events in the system.</documentation>
-      <wsdl:input name="GetExternalEventListWT" message="tns:GetExternalEventListWTSoapIn" />
-      <wsdl:output name="GetExternalEventListWT" message="tns:GetExternalEventListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetEventTypeList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2EventType table populated with rows for all event types in the system.</documentation>
-      <wsdl:input name="GetEventTypeListWT" message="tns:GetEventTypeListWTSoapIn" />
-      <wsdl:output name="GetEventTypeListWT" message="tns:GetEventTypeListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetEventTypeFilteredList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2EventType table populated with rows for filtered events for the objecttype passed in the system.</documentation>
-      <wsdl:input name="GetEventTypeFilteredListWT" message="tns:GetEventTypeFilteredListWTSoapIn" />
-      <wsdl:output name="GetEventTypeFilteredListWT" message="tns:GetEventTypeFilteredListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRetentionPeriod">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2RetentionPeriod table populated with a row for the requested retention period.</documentation>
-      <wsdl:input name="GetRetentionPeriodWT" message="tns:GetRetentionPeriodWTSoapIn" />
-      <wsdl:output name="GetRetentionPeriodWT" message="tns:GetRetentionPeriodWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRetentionPeriodList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2RetentionPeriod table populated with rows for all retention periods in the system.</documentation>
-      <wsdl:input name="GetRetentionPeriodListWT" message="tns:GetRetentionPeriodListWTSoapIn" />
-      <wsdl:output name="GetRetentionPeriodListWT" message="tns:GetRetentionPeriodListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRelocationHistory">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2RelocationHistory table populated with the relocation history for the specified object.</documentation>
-      <wsdl:input name="GetRelocationHistoryWT" message="tns:GetRelocationHistoryWTSoapIn" />
-      <wsdl:output name="GetRelocationHistoryWT" message="tns:GetRelocationHistoryWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRelatedFolders">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2RelatedFolder table populated with the related folders for the specified object.</documentation>
-      <wsdl:input name="GetRelatedFoldersWT" message="tns:GetRelatedFoldersWTSoapIn" />
-      <wsdl:output name="GetRelatedFoldersWT" message="tns:GetRelatedFoldersWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalSchedule">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalSchedule table populated with a row for the requested disposal schedule.</documentation>
-      <wsdl:input name="GetDisposalScheduleWT" message="tns:GetDisposalScheduleWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleWT" message="tns:GetDisposalScheduleWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleChain">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalSchedule table populated with a row for the requested disposal schedule.</documentation>
-      <wsdl:input name="GetDisposalScheduleChainWT" message="tns:GetDisposalScheduleChainWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleChainWT" message="tns:GetDisposalScheduleChainWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleChainList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalScheduleChain table populated with rows for all disposal schedule chains in the system.</documentation>
-      <wsdl:input name="GetDisposalScheduleChainListWT" message="tns:GetDisposalScheduleChainListWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleChainListWT" message="tns:GetDisposalScheduleChainListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalSchedule table populated with rows for all disposal schedules in the system.</documentation>
-      <wsdl:input name="GetDisposalScheduleListWT" message="tns:GetDisposalScheduleListWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleListWT" message="tns:GetDisposalScheduleListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleFilteredList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalSchedule table populated with all the non-category specified filtered disposal schedules.</documentation>
-      <wsdl:input name="GetDisposalScheduleFilteredListWT" message="tns:GetDisposalScheduleFilteredListWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleFilteredListWT" message="tns:GetDisposalScheduleFilteredListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleChainForCategory">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Populate the rmDisposalScheduleChain table with the disposal schedule chain for the requested document category id.</documentation>
-      <wsdl:input name="GetDisposalScheduleChainForCategoryWT" message="tns:GetDisposalScheduleChainForCategoryWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleChainForCategoryWT" message="tns:GetDisposalScheduleChainForCategoryWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleForCategory">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Populate the rmDisposalSchedule table with the disposal schedule for the requested document category id.</documentation>
-      <wsdl:input name="GetDisposalScheduleForCategoryWT" message="tns:GetDisposalScheduleForCategoryWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleForCategoryWT" message="tns:GetDisposalScheduleForCategoryWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalInstructionList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalSchedule_Instruction table populated with rows relating to the disposal instructions associated with a disposal schedule.</documentation>
-      <wsdl:input name="GetDisposalInstructionListWT" message="tns:GetDisposalInstructionListWTSoapIn" />
-      <wsdl:output name="GetDisposalInstructionListWT" message="tns:GetDisposalInstructionListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleHistory">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisposalScheduleHistory table populated with rows for the requested disposal schedule.</documentation>
-      <wsdl:input name="GetDisposalScheduleHistoryWT" message="tns:GetDisposalScheduleHistoryWTSoapIn" />
-      <wsdl:output name="GetDisposalScheduleHistoryWT" message="tns:GetDisposalScheduleHistoryWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingCategory">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarkingCategory table populated with a row for the requested protective marking category.</documentation>
-      <wsdl:input name="GetProtectiveMarkingCategoryWT" message="tns:GetProtectiveMarkingCategoryWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingCategoryWT" message="tns:GetProtectiveMarkingCategoryWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingCategoryList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarkingCategory table populated with rows for all protective marking categories in the system.</documentation>
-      <wsdl:input name="GetProtectiveMarkingCategoryListWT" message="tns:GetProtectiveMarkingCategoryListWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingCategoryListWT" message="tns:GetProtectiveMarkingCategoryListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingDef">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarkingDef table populated with a row for the requested protective marking definition.</documentation>
-      <wsdl:input name="GetProtectiveMarkingDefWT" message="tns:GetProtectiveMarkingDefWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingDefWT" message="tns:GetProtectiveMarkingDefWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingDefList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarkingDef table populated with rows for all protective marking definitions in the system.</documentation>
-      <wsdl:input name="GetProtectiveMarkingDefListWT" message="tns:GetProtectiveMarkingDefListWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingDefListWT" message="tns:GetProtectiveMarkingDefListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarking table populated with rows for the requested objects' protective marking.</documentation>
-      <wsdl:input name="GetProtectiveMarkingListWT" message="tns:GetProtectiveMarkingListWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingListWT" message="tns:GetProtectiveMarkingListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingHistoryList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarkingHistory table populated with rows for the requested objects' protective marking history.</documentation>
-      <wsdl:input name="GetProtectiveMarkingHistoryListWT" message="tns:GetProtectiveMarkingHistoryListWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingHistoryListWT" message="tns:GetProtectiveMarkingHistoryListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingListForObjects">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ProtectiveMarking table populated with rows for the requested objects.</documentation>
-      <wsdl:input name="GetProtectiveMarkingListForObjectsWT" message="tns:GetProtectiveMarkingListForObjectsWTSoapIn" />
-      <wsdl:output name="GetProtectiveMarkingListForObjectsWT" message="tns:GetProtectiveMarkingListForObjectsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetActivitiesListForObject">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2AccessControlHistory table populated with rows for the requested objects</documentation>
-      <wsdl:input name="GetActivitiesListForObjectWT" message="tns:GetActivitiesListForObjectWTSoapIn" />
-      <wsdl:output name="GetActivitiesListForObjectWT" message="tns:GetActivitiesListForObjectWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetAccessControlHistoryList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2AccessControlHistory table populated with rows for the requested objects' access control history.</documentation>
-      <wsdl:input name="GetAccessControlHistoryListWT" message="tns:GetAccessControlHistoryListWTSoapIn" />
-      <wsdl:output name="GetAccessControlHistoryListWT" message="tns:GetAccessControlHistoryListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationHierarchy">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vClass table populated with rows detailing all classes in the hierarchy above a point specified by the id param.</documentation>
-      <wsdl:input name="GetClassificationHierarchyWT" message="tns:GetClassificationHierarchyWTSoapIn" />
-      <wsdl:output name="GetClassificationHierarchyWT" message="tns:GetClassificationHierarchyWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClassContents">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vClass and rm2vFolder tables populated with rows for the contents of the specified class.</documentation>
-      <wsdl:input name="GetClassContentsWT" message="tns:GetClassContentsWTSoapIn" />
-      <wsdl:output name="GetClassContentsWT" message="tns:GetClassContentsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertiesForObjects">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the objects table table populated with a row for each requested object.</documentation>
-      <wsdl:input name="GetPropertiesForObjectsWT" message="tns:GetPropertiesForObjectsWTSoapIn" />
-      <wsdl:output name="GetPropertiesForObjectsWT" message="tns:GetPropertiesForObjectsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClass">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vClass table populated with a row for the requested class.</documentation>
-      <wsdl:input name="GetClassWT" message="tns:GetClassWTSoapIn" />
-      <wsdl:output name="GetClassWT" message="tns:GetClassWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFolderParts">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vFolder table populated with a row for the requested folder, and the rm2vPart table populated with part rows.</documentation>
-      <wsdl:input name="GetFolderPartsWT" message="tns:GetFolderPartsWTSoapIn" />
-      <wsdl:output name="GetFolderPartsWT" message="tns:GetFolderPartsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFolder">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vFolder table populated with a row for the requested folder.</documentation>
-      <wsdl:input name="GetFolderWT" message="tns:GetFolderWTSoapIn" />
-      <wsdl:output name="GetFolderWT" message="tns:GetFolderWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFolderContents">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart and optionally the rm2vRecord table populated with rows for the contents of the requested folder.</documentation>
-      <wsdl:input name="GetFolderContentsWT" message="tns:GetFolderContentsWTSoapIn" />
-      <wsdl:output name="GetFolderContentsWT" message="tns:GetFolderContentsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPart">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart table populated with a row for the requested part.</documentation>
-      <wsdl:input name="GetPartWT" message="tns:GetPartWTSoapIn" />
-      <wsdl:output name="GetPartWT" message="tns:GetPartWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPartContents">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Part_Record, rm2Part_Document and rm2vRecord table populated with rows for the contents of the requested part.</documentation>
-      <wsdl:input name="GetPartContentsWT" message="tns:GetPartContentsWTSoapIn" />
-      <wsdl:output name="GetPartContentsWT" message="tns:GetPartContentsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRecord">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vRecord table populated with a row for the requested record.</documentation>
-      <wsdl:input name="GetRecordWT" message="tns:GetRecordWTSoapIn" />
-      <wsdl:output name="GetRecordWT" message="tns:GetRecordWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordVersions">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2RecordVersion and rm2vRecord tables populated with rows for the requested record.</documentation>
-      <wsdl:input name="GetRecordVersionsWT" message="tns:GetRecordVersionsWTSoapIn" />
-      <wsdl:output name="GetRecordVersionsWT" message="tns:GetRecordVersionsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordPartList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart table populated with rows for parts that reference the requested record.</documentation>
-      <wsdl:input name="GetRecordPartListWT" message="tns:GetRecordPartListWTSoapIn" />
-      <wsdl:output name="GetRecordPartListWT" message="tns:GetRecordPartListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDocumentPartList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Returns a DataSet with the rm2vPart table populated with rows for parts that reference the specified document.</documentation>
-      <wsdl:input name="GetDocumentPartListWT" message="tns:GetDocumentPartListWTSoapIn" />
-      <wsdl:output name="GetDocumentPartListWT" message="tns:GetDocumentPartListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRequestCheckoutDetails">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2RequestHistory table populated with rows relating to the request history of physical or hybrid objects in the system.</documentation>
-      <wsdl:input name="GetRequestCheckoutDetailsWT" message="tns:GetRequestCheckoutDetailsWTSoapIn" />
-      <wsdl:output name="GetRequestCheckoutDetailsWT" message="tns:GetRequestCheckoutDetailsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetReleaseHistory">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ReleaseHistory table populated with rows for the requested object.</documentation>
-      <wsdl:input name="GetReleaseHistoryWT" message="tns:GetReleaseHistoryWTSoapIn" />
-      <wsdl:output name="GetReleaseHistoryWT" message="tns:GetReleaseHistoryWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetReviewHistoryList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2ReviewHistory table populated with rows for the requested object.</documentation>
-      <wsdl:input name="GetReviewHistoryListWT" message="tns:GetReviewHistoryListWTSoapIn" />
-      <wsdl:output name="GetReviewHistoryListWT" message="tns:GetReviewHistoryListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ApplyChanges">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">When supplied with a dataset that has pending inserts, updates or deletes the changes will be comitted to the system, the returned dataset contains the updated data, any errors will be recorded against the RowError property of the DataRow objects in each DataTable.</documentation>
-      <wsdl:input name="ApplyChangesWT" message="tns:ApplyChangesWTSoapIn" />
-      <wsdl:output name="ApplyChangesWT" message="tns:ApplyChangesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetEffectiveItemList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vFolder, rm2vPart and rm2vRecord tables populated with rows for objects in the system for the disposal schedule is in effect.</documentation>
-      <wsdl:input name="GetEffectiveItemListWT" message="tns:GetEffectiveItemListWTSoapIn" />
-      <wsdl:output name="GetEffectiveItemListWT" message="tns:GetEffectiveItemListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFolderConflictingItemList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart and rm2vRecord tables populated with rows for parts and records in the folder that have a disposal schedule conflict.</documentation>
-      <wsdl:input name="GetFolderConflictingItemListWT" message="tns:GetFolderConflictingItemListWTSoapIn" />
-      <wsdl:output name="GetFolderConflictingItemListWT" message="tns:GetFolderConflictingItemListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPartConflictingItemList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vRecord table populated with rows for records in the part that have a disposal schedule conflict.</documentation>
-      <wsdl:input name="GetPartConflictingItemListWT" message="tns:GetPartConflictingItemListWTSoapIn" />
-      <wsdl:output name="GetPartConflictingItemListWT" message="tns:GetPartConflictingItemListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordConflictingPartList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart table populated with rows for parts the record has a disposal schedule conflict with.</documentation>
-      <wsdl:input name="GetRecordConflictingPartListWT" message="tns:GetRecordConflictingPartListWTSoapIn" />
-      <wsdl:output name="GetRecordConflictingPartListWT" message="tns:GetRecordConflictingPartListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFoldersWithConflictsList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vFolder table populated with rows for folders in the system who contents have a disposal schedule conflict.</documentation>
-      <wsdl:input name="GetFoldersWithConflictsListWT" message="tns:GetFoldersWithConflictsListWTSoapIn" />
-      <wsdl:output name="GetFoldersWithConflictsListWT" message="tns:GetFoldersWithConflictsListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetPartsWithConflictsList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart table populated with rows for parts in the system who contents have a disposal schedule conflict.</documentation>
-      <wsdl:input name="GetPartsWithConflictsListWT" message="tns:GetPartsWithConflictsListWTSoapIn" />
-      <wsdl:output name="GetPartsWithConflictsListWT" message="tns:GetPartsWithConflictsListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordsWithConflictsList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vRecord table populated with rows for records in the system who contents have a disposal schedule conflict.</documentation>
-      <wsdl:input name="GetRecordsWithConflictsListWT" message="tns:GetRecordsWithConflictsListWTSoapIn" />
-      <wsdl:output name="GetRecordsWithConflictsListWT" message="tns:GetRecordsWithConflictsListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ExecuteDisposal">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Execute the next disposal instruction for the specified object.</documentation>
-      <wsdl:input name="ExecuteDisposalWT" message="tns:ExecuteDisposalWTSoapIn" />
-      <wsdl:output name="ExecuteDisposalWT" message="tns:ExecuteDisposalWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRecentFolderList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vFolder table populated with rows for the users recently used folders.</documentation>
-      <wsdl:input name="GetRecentFolderListWT" message="tns:GetRecentFolderListWTSoapIn" />
-      <wsdl:output name="GetRecentFolderListWT" message="tns:GetRecentFolderListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SuggestFoldersForDocument">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vFolder table populated with rows of folders that have similar records to the document or record specified by documentOrRecordId.</documentation>
-      <wsdl:input name="SuggestFoldersForDocumentWT" message="tns:SuggestFoldersForDocumentWTSoapIn" />
-      <wsdl:output name="SuggestFoldersForDocumentWT" message="tns:SuggestFoldersForDocumentWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SuggestPartsForDocument">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2vPart table populated with rows of parts that have similar records to the document or record specified by documentOrRecordId.</documentation>
-      <wsdl:input name="SuggestPartsForDocumentWT" message="tns:SuggestPartsForDocumentWTSoapIn" />
-      <wsdl:output name="SuggestPartsForDocumentWT" message="tns:SuggestPartsForDocumentWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserPrivilegeList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Privilege table populated with rows for the requested users privileges.</documentation>
-      <wsdl:input name="GetUserPrivilegeListWT" message="tns:GetUserPrivilegeListWTSoapIn" />
-      <wsdl:output name="GetUserPrivilegeListWT" message="tns:GetUserPrivilegeListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetLookupValueList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2LookupValue table populated with rows for the requested lookup.</documentation>
-      <wsdl:input name="GetLookupValueListWT" message="tns:GetLookupValueListWTSoapIn" />
-      <wsdl:output name="GetLookupValueListWT" message="tns:GetLookupValueListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetSystemLookupAndValueList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2LookupValue table populated with rows for all lookup values within the system.</documentation>
-      <wsdl:input name="GetSystemLookupAndValueListWT" message="tns:GetSystemLookupAndValueListWTSoapIn" />
-      <wsdl:output name="GetSystemLookupAndValueListWT" message="tns:GetSystemLookupAndValueListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SelectData">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Generic data selection method.</documentation>
-      <wsdl:input name="SelectDataWT" message="tns:SelectDataWTSoapIn" />
-      <wsdl:output name="SelectDataWT" message="tns:SelectDataWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRmObjects">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Generic data selection method.</documentation>
-      <wsdl:input name="GetRmObjectsWT" message="tns:GetRmObjectsWTSoapIn" />
-      <wsdl:output name="GetRmObjectsWT" message="tns:GetRmObjectsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetSystemActivityList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Activity table populated with rows for the activities the current user can perform on the system.</documentation>
-      <wsdl:input name="GetSystemActivityListWT" message="tns:GetSystemActivityListWTSoapIn" />
-      <wsdl:output name="GetSystemActivityListWT" message="tns:GetSystemActivityListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CreatePhysicalMarker">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convert a document into a physical record marker.</documentation>
-      <wsdl:input name="CreatePhysicalMarkerWT" message="tns:CreatePhysicalMarkerWTSoapIn" />
-      <wsdl:output name="CreatePhysicalMarkerWT" message="tns:CreatePhysicalMarkerWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CreatePhysicalMarkerWithoutFacility">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convert a document into a physical record marker without specifying a facility.</documentation>
-      <wsdl:input name="CreatePhysicalMarkerWithoutFacilityWT" message="tns:CreatePhysicalMarkerWithoutFacilityWTSoapIn" />
-      <wsdl:output name="CreatePhysicalMarkerWithoutFacilityWT" message="tns:CreatePhysicalMarkerWithoutFacilityWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetHold">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Hold table populated with a row for the requested hold.</documentation>
-      <wsdl:input name="GetHoldWT" message="tns:GetHoldWTSoapIn" />
-      <wsdl:output name="GetHoldWT" message="tns:GetHoldWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetHoldList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Hold table populated with rows for all holds in the system.</documentation>
-      <wsdl:input name="GetHoldListWT" message="tns:GetHoldListWTSoapIn" />
-      <wsdl:output name="GetHoldListWT" message="tns:GetHoldListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetHoldItemList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Hold_item table populated with rows for all the items associated with a hold.</documentation>
-      <wsdl:input name="GetItemHoldListWT" message="tns:GetItemHoldListWTSoapIn" />
-      <wsdl:output name="GetItemHoldListWT" message="tns:GetItemHoldListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetHoldListFilter">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Hold table populated with rows for all holds in the system.</documentation>
-      <wsdl:input name="GetHoldListFilterWT" message="tns:GetHoldListFilterWTSoapIn" />
-      <wsdl:output name="GetHoldListFilterWT" message="tns:GetHoldListFilterWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetItemHoldList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Hold_item table populated with rows for all the items associated with a hold.</documentation>
-      <wsdl:input name="GetHoldItemListWT" message="tns:GetHoldItemListWTSoapIn" />
-      <wsdl:output name="GetHoldItemListWT" message="tns:GetHoldItemListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetDisclosabilityHistoryList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2DisclosabilityHistory table populated with rows for the requested object.</documentation>
-      <wsdl:input name="GetDisclosabilityHistoryListWT" message="tns:GetDisclosabilityHistoryListWTSoapIn" />
-      <wsdl:output name="GetDisclosabilityHistoryListWT" message="tns:GetDisclosabilityHistoryListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdatePartRetrievalDate">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Update the last retrieval date of a folder part when retrieving a record from it.</documentation>
-      <wsdl:input name="UpdatePartRetrievalDateWT" message="tns:UpdatePartRetrievalDateWTSoapIn" />
-      <wsdl:output name="UpdatePartRetrievalDateWT" message="tns:UpdatePartRetrievalDateWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndMembership">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a dataset with the KGroup, KUser, KUser_Group tables populated with all groups and users in the system.</documentation>
-      <wsdl:input name="GetRolesAndMembershipWT" message="tns:GetRolesAndMembershipWTSoapIn" />
-      <wsdl:output name="GetRolesAndMembershipWT" message="tns:GetRolesAndMembershipWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetSelectedRolesAndMembership">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a dataset with the KGroup, KUser, KUser_Group tables populated with groups specified in groupIds and users in those groups.</documentation>
-      <wsdl:input name="GetSelectedRolesAndMembershipWT" message="tns:GetSelectedRolesAndMembershipWTSoapIn" />
-      <wsdl:output name="GetSelectedRolesAndMembershipWT" message="tns:GetSelectedRolesAndMembershipWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFacility">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Facility table populated with a row for the requested facility.</documentation>
-      <wsdl:input name="GetFacilityWT" message="tns:GetFacilityWTSoapIn" />
-      <wsdl:output name="GetFacilityWT" message="tns:GetFacilityWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetFacilityList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2Facility table populated with rows for all facilities in the system.</documentation>
-      <wsdl:input name="GetFacilityListWT" message="tns:GetFacilityListWTSoapIn" />
-      <wsdl:output name="GetFacilityListWT" message="tns:GetFacilityListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserSettingList">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with the rm2UserSetting table populated with rows for all user setting entries for this user.</documentation>
-      <wsdl:input name="GetUserSettingListWT" message="tns:GetUserSettingListWTSoapIn" />
-      <wsdl:output name="GetUserSettingListWT" message="tns:GetUserSettingListWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserSetting">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get the value for the requested user setting.</documentation>
-      <wsdl:input name="GetUserSettingWT" message="tns:GetUserSettingWTSoapIn" />
-      <wsdl:output name="GetUserSettingWT" message="tns:GetUserSettingWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SetUserSetting">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Set the value for the requested user setting.</documentation>
-      <wsdl:input name="SetUserSettingWT" message="tns:SetUserSettingWTSoapIn" />
-      <wsdl:output name="SetUserSettingWT" message="tns:SetUserSettingWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CascadeApplyChanges">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Apply changes to child objects.</documentation>
-      <wsdl:input name="CascadeApplyChangesWT" message="tns:CascadeApplyChangesWTSoapIn" />
-      <wsdl:output name="CascadeApplyChangesWT" message="tns:CascadeApplyChangesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetObjectAndContents">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get object and all contents.</documentation>
-      <wsdl:input name="GetObjectAndContentsWT" message="tns:GetObjectAndContentsWTSoapIn" />
-      <wsdl:output name="GetObjectAndContentsWT" message="tns:GetObjectAndContentsWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ApproveDisposal">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Approve the disposal of the specified physical object.</documentation>
-      <wsdl:input name="ApproveDisposalWT" message="tns:ApproveDisposalWTSoapIn" />
-      <wsdl:output name="ApproveDisposalWT" message="tns:ApproveDisposalWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CancelDisposal">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Cancel the disposal of the specified physical object.</documentation>
-      <wsdl:input name="CancelDisposalWT" message="tns:CancelDisposalWTSoapIn" />
-      <wsdl:output name="CancelDisposalWT" message="tns:CancelDisposalWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="SelectReferenceCodePattern">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a DataSet with rm2ReferenceCodePattern table data for a top class</documentation>
-      <wsdl:input name="SelectReferenceCodePatternWT" message="tns:SelectReferenceCodePatternWTSoapIn" />
-      <wsdl:output name="SelectReferenceCodePatternWT" message="tns:SelectReferenceCodePatternWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GenerateReferenceCode">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Return a Reference Code as suggestion, for the class/folder, based on the pattern defined for the sublevel of class/folder w.r.t. top class</documentation>
-      <wsdl:input name="GenerateReferenceCodeWT" message="tns:GenerateReferenceCodeWTSoapIn" />
-      <wsdl:output name="GenerateReferenceCodeWT" message="tns:GenerateReferenceCodeWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ClearAllReferenceCodes">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Removes reference codes and reference code paths for all classes/folders within the parent object but for the parent object only reference code is removed.</documentation>
-      <wsdl:input name="ClearAllReferenceCodeWT" message="tns:ClearAllReferenceCodeWTSoapIn" />
-      <wsdl:output name="ClearAllReferenceCodeWT" message="tns:ClearAllReferenceCodeWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetReferenceCodePattern">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">This method gets the reference Code Pattern details for the object.</documentation>
-      <wsdl:input name="GetReferenceCodePatternWT" message="tns:GetReferenceCodePatternWTSoapIn" />
-      <wsdl:output name="GetReferenceCodePatternWT" message="tns:GetReferenceCodePatternWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetChildReferenceCodePattern">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">This method gets the reference Code Pattern details for the Child object(Class/Folder).</documentation>
-      <wsdl:input name="GetChildReferenceCodePatternWT" message="tns:GetChildReferenceCodePatternWTSoapIn" />
-      <wsdl:output name="GetChildReferenceCodePatternWT" message="tns:GetChildReferenceCodePatternWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GenerateReferenceCodesForClassHierarchy">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">This method generates reference codes for a Class and its children.</documentation>
-      <wsdl:input name="GenerateReferenceCodesForHierarchyWT" message="tns:GenerateReferenceCodesForHierarchyWTSoapIn" />
-      <wsdl:output name="GenerateReferenceCodesForHierarchyWT" message="tns:GenerateReferenceCodesForHierarchyWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClassification">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get the classification dataset for a record.</documentation>
-      <wsdl:input name="GetClassificationWT" message="tns:GetClassificationWTSoapIn" />
-      <wsdl:output name="GetClassificationWT" message="tns:GetClassificationWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationGuides">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get the classification dataset for a record.</documentation>
-      <wsdl:input name="GetClassificationGuidesWT" message="tns:GetClassificationGuidesWTSoapIn" />
-      <wsdl:output name="GetClassificationGuidesWT" message="tns:GetClassificationGuidesWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationGuide">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get the classification fuide information dataset for a guide.</documentation>
-      <wsdl:input name="GetClassificationGuideWT" message="tns:GetClassificationGuideWTSoapIn" />
-      <wsdl:output name="GetClassificationGuideWT" message="tns:GetClassificationGuideWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationEnums">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get the classification fuide information dataset for a guide.</documentation>
-      <wsdl:input name="GetClassificationEnumsWT" message="tns:GetClassificationEnumsWTSoapIn" />
-      <wsdl:output name="GetClassificationEnumsWT" message="tns:GetClassificationEnumsWTSoapOut" />
-    </wsdl:operation>
-
-<!--
-    <wsdl:operation name="ApplyChanges">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">When supplied with a dataset that has pending inserts, updates or deletes the changes will be comitted to the system, the returned dataset contains the updated data, any errors will be recorded against the RowError property of the DataRow objects in each DataTable.</documentation>
-      <wsdl:input name="ApplyChangesClassificationWT" message="tns:ApplyChangesClassificationWTSoapIn" />
-      <wsdl:output name="ApplyChangesClassificationWT" message="tns:ApplyChangesClassificationWTSoapOut" />
-    </wsdl:operation>
--->
-
-    <wsdl:operation name="ReleaseRecordOwnership">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Releases the owner of the record.</documentation>
-      <wsdl:input name="ReleaseRecordOwnershipWT" message="tns:ReleaseRecordOwnershipWTSoapIn" />
-      <wsdl:output name="ReleaseRecordOwnershipWT" message="tns:ReleaseRecordOwnershipWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ConvertReplicaToOriginal">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convert a replica object to an original.</documentation>
-      <wsdl:input name="ConvertReplicaToOriginalWT" message="tns:ConvertReplicaToOriginalWTSoapIn" />
-      <wsdl:output name="ConvertReplicaToOriginalWT" message="tns:ConvertReplicaToOriginalWTSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ConvertReplicasFromHomeSystemToOriginal">
-      <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Convert all the replicas from a specific home system to originals.</documentation>
-      <wsdl:input name="ConvertReplicasFromHomeSystemToOriginalWT" message="tns:ConvertReplicasFromHomeSystemToOriginalWTSoapIn" />
-      <wsdl:output name="ConvertReplicasFromHomeSystemToOriginalWT" message="tns:ConvertReplicasFromHomeSystemToOriginalWTSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="MeridioRMSoap" type="tns:MeridioRMSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
-    <wsdl:operation name="ResolveServiceUrl">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ResolveServiceUrl" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertyDefs">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetPropertyDefs" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetConfiguration">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetConfiguration" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetExternalEvent">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetExternalEventWT" style="document" />
-      <wsdl:input name="GetExternalEventWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetExternalEventWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetExternalEventList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetExternalEventListWT" style="document" />
-      <wsdl:input name="GetExternalEventListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetExternalEventListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetEventTypeList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetEventTypeListWT" style="document" />
-      <wsdl:input name="GetEventTypeListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetEventTypeListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetEventTypeFilteredList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetEventTypeFilteredListWT" style="document" />
-      <wsdl:input name="GetEventTypeFilteredListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetEventTypeFilteredListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRetentionPeriod">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRetentionPeriodWT" style="document" />
-      <wsdl:input name="GetRetentionPeriodWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRetentionPeriodWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRetentionPeriodList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRetentionPeriodListWT" style="document" />
-      <wsdl:input name="GetRetentionPeriodListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRetentionPeriodListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRelocationHistory">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRelocationHistoryWT" style="document" />
-      <wsdl:input name="GetRelocationHistoryWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRelocationHistoryWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRelatedFolders">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRelatedFoldersWT" style="document" />
-      <wsdl:input name="GetRelatedFoldersWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRelatedFoldersWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalSchedule">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleChain">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleChainWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleChainWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleChainWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleChainList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleChainListWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleChainListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleChainListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleListWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    
-    
-    <wsdl:operation name="GetDisposalScheduleFilteredList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleFilteredListWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleFilteredListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleFilteredListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    
-    <!--
-    <wsdl:operation name="GetDisposalScheduleChainFilteredList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleChainFilteredListWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleChainFilteredListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleChainFilteredListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    -->
-    
-    <wsdl:operation name="GetDisposalScheduleChainForCategory">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleChainForCategoryWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleChainForCategoryWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleChainForCategoryWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleForCategory">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleForCategoryWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleForCategoryWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleForCategoryWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalInstructionList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalInstructionListWT" style="document" />
-      <wsdl:input name="GetDisposalInstructionListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalInstructionListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisposalScheduleHistory">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisposalScheduleHistoryWT" style="document" />
-      <wsdl:input name="GetDisposalScheduleHistoryWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisposalScheduleHistoryWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingCategory">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingCategoryWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingCategoryWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingCategoryWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingCategoryList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingCategoryListWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingCategoryListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingCategoryListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingDef">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingDefWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingDefWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingDefWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingDefList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingDefListWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingDefListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingDefListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingListWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingHistoryList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingHistoryListWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetProtectiveMarkingListForObjects">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetProtectiveMarkingListForObjectsWT" style="document" />
-      <wsdl:input name="GetProtectiveMarkingListForObjectsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetProtectiveMarkingListForObjectsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetActivitiesListForObject">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetActivitiesListForObjectWT" style="document" />
-      <wsdl:input name="GetActivitiesListForObjectWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetActivitiesListForObjectWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAccessControlHistoryList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetAccessControlHistoryListWT" style="document" />
-      <wsdl:input name="GetAccessControlHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetAccessControlHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationHierarchy">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassificationHierarchyWT" style="document" />
-      <wsdl:input name="GetClassificationHierarchyWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassificationHierarchyWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClassContents">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassContentsWT" style="document" />
-      <wsdl:input name="GetClassContentsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassContentsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPropertiesForObjects">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetPropertiesForObjectsWT" style="document" />
-      <wsdl:input name="GetPropertiesForObjectsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPropertiesForObjectsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClass">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassWT" style="document" />
-      <wsdl:input name="GetClassWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFolderParts">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFolderPartsWT" style="document" />
-      <wsdl:input name="GetFolderPartsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFolderPartsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFolder">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFolderWT" style="document" />
-      <wsdl:input name="GetFolderWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFolderWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFolderContents">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFolderContentsWT" style="document" />
-      <wsdl:input name="GetFolderContentsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFolderContentsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPart">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetPartWT" style="document" />
-      <wsdl:input name="GetPartWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPartWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPartContents">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetPartContentsWT" style="document" />
-      <wsdl:input name="GetPartContentsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPartContentsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRecord">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRecordWT" style="document" />
-      <wsdl:input name="GetRecordWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRecordWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordVersions">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRecordVersionsWT" style="document" />
-      <wsdl:input name="GetRecordVersionsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRecordVersionsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordPartList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRecordPartListWT" style="document" />
-      <wsdl:input name="GetRecordPartListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRecordPartListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDocumentPartList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDocumentPartListWT" style="document" />
-      <wsdl:input name="GetDocumentPartListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDocumentPartListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRequestCheckoutDetails">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRequestCheckoutDetailsWT" style="document" />
-      <wsdl:input name="GetRequestCheckoutDetailsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRequestCheckoutDetailsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetReleaseHistory">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetReleaseHistoryWT" style="document" />
-      <wsdl:input name="GetReleaseHistoryWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetReleaseHistoryWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetReviewHistoryList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetReviewHistoryListWT" style="document" />
-      <wsdl:input name="GetReviewHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetReviewHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ApplyChanges">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ApplyChangesWT" style="document" />
-      <wsdl:input name="ApplyChangesWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ApplyChangesWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetEffectiveItemList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetEffectiveItemListWT" style="document" />
-      <wsdl:input name="GetEffectiveItemListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetEffectiveItemListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFolderConflictingItemList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFolderConflictingItemListWT" style="document" />
-      <wsdl:input name="GetFolderConflictingItemListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFolderConflictingItemListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPartConflictingItemList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetPartConflictingItemListWT" style="document" />
-      <wsdl:input name="GetPartConflictingItemListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPartConflictingItemListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordConflictingPartList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRecordConflictingPartListWT" style="document" />
-      <wsdl:input name="GetRecordConflictingPartListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRecordConflictingPartListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFoldersWithConflictsList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFoldersWithConflictsListWT" style="document" />
-      <wsdl:input name="GetFoldersWithConflictsListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFoldersWithConflictsListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetPartsWithConflictsList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetPartsWithConflictsListWT" style="document" />
-      <wsdl:input name="GetPartsWithConflictsListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetPartsWithConflictsListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRecordsWithConflictsList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRecordsWithConflictsListWT" style="document" />
-      <wsdl:input name="GetRecordsWithConflictsListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRecordsWithConflictsListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ExecuteDisposal">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ExecuteDisposalWT" style="document" />
-      <wsdl:input name="ExecuteDisposalWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ExecuteDisposalWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRecentFolderList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRecentFolderListWT" style="document" />
-      <wsdl:input name="GetRecentFolderListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRecentFolderListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SuggestFoldersForDocument">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/SuggestFoldersForDocumentWT" style="document" />
-      <wsdl:input name="SuggestFoldersForDocumentWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SuggestFoldersForDocumentWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SuggestPartsForDocument">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/SuggestPartsForDocumentWT" style="document" />
-      <wsdl:input name="SuggestPartsForDocumentWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SuggestPartsForDocumentWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserPrivilegeList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetUserPrivilegeListWT" style="document" />
-      <wsdl:input name="GetUserPrivilegeListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetUserPrivilegeListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetLookupValueList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetLookupValueListWT" style="document" />
-      <wsdl:input name="GetLookupValueListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetLookupValueListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetSystemLookupAndValueList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetSystemLookupAndValueListWT" style="document" />
-      <wsdl:input name="GetSystemLookupAndValueListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetSystemLookupAndValueListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SelectData">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/SelectDataWT" style="document" />
-      <wsdl:input name="SelectDataWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SelectDataWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRmObjects">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRmObjectsWT" style="document" />
-      <wsdl:input name="GetRmObjectsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRmObjectsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetSystemActivityList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetSystemActivityListWT" style="document" />
-      <wsdl:input name="GetSystemActivityListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetSystemActivityListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CreatePhysicalMarker">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/CreatePhysicalMarkerWT" style="document" />
-      <wsdl:input name="CreatePhysicalMarkerWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CreatePhysicalMarkerWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CreatePhysicalMarkerWithoutFacility">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/CreatePhysicalMarkerWithoutFacilityWT" style="document" />
-      <wsdl:input name="CreatePhysicalMarkerWithoutFacilityWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CreatePhysicalMarkerWithoutFacilityWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetHold">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetHoldWT" style="document" />
-      <wsdl:input name="GetHoldWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetHoldWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetHoldList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetHoldListWT" style="document" />
-      <wsdl:input name="GetHoldListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetHoldListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetHoldItemList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetItemHoldListWT" style="document" />
-      <wsdl:input name="GetItemHoldListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetItemHoldListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetHoldListFilter">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetHoldListFilterWT" style="document" />
-      <wsdl:input name="GetHoldListFilterWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetHoldListFilterWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetItemHoldList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetHoldItemListWT" style="document" />
-      <wsdl:input name="GetHoldItemListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetHoldItemListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetDisclosabilityHistoryList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetDisclosabilityHistoryListWT" style="document" />
-      <wsdl:input name="GetDisclosabilityHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetDisclosabilityHistoryListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdatePartRetrievalDate">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/UpdatePartRetrievalDateWT" style="document" />
-      <wsdl:input name="UpdatePartRetrievalDateWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="UpdatePartRetrievalDateWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndMembership">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetRolesAndMembershipWT" style="document" />
-      <wsdl:input name="GetRolesAndMembershipWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetRolesAndMembershipWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetSelectedRolesAndMembership">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetSelectedRolesAndMembershipWT" style="document" />
-      <wsdl:input name="GetSelectedRolesAndMembershipWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetSelectedRolesAndMembershipWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFacility">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFacilityWT" style="document" />
-      <wsdl:input name="GetFacilityWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFacilityWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetFacilityList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetFacilityListWT" style="document" />
-      <wsdl:input name="GetFacilityListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetFacilityListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserSettingList">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetUserSettingListWT" style="document" />
-      <wsdl:input name="GetUserSettingListWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetUserSettingListWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserSetting">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetUserSettingWT" style="document" />
-      <wsdl:input name="GetUserSettingWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetUserSettingWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SetUserSetting">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/SetUserSettingWT" style="document" />
-      <wsdl:input name="SetUserSettingWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SetUserSettingWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CascadeApplyChanges">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/CascadeApplyChangesWT" style="document" />
-      <wsdl:input name="CascadeApplyChangesWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CascadeApplyChangesWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetObjectAndContents">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetObjectAndContentsWT" style="document" />
-      <wsdl:input name="GetObjectAndContentsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetObjectAndContentsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ApproveDisposal">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ApproveDisposalWT" style="document" />
-      <wsdl:input name="ApproveDisposalWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ApproveDisposalWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CancelDisposal">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/CancelDisposalWT" style="document" />
-      <wsdl:input name="CancelDisposalWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="CancelDisposalWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="SelectReferenceCodePattern">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/SelectReferenceCodePatternWT" style="document" />
-      <wsdl:input name="SelectReferenceCodePatternWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="SelectReferenceCodePatternWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GenerateReferenceCode">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GenerateReferenceCodeWT" style="document" />
-      <wsdl:input name="GenerateReferenceCodeWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GenerateReferenceCodeWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ClearAllReferenceCodes">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ClearAllReferenceCodeWT" style="document" />
-      <wsdl:input name="ClearAllReferenceCodeWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ClearAllReferenceCodeWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetReferenceCodePattern">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetReferenceCodePatternWT" style="document" />
-      <wsdl:input name="GetReferenceCodePatternWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetReferenceCodePatternWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetChildReferenceCodePattern">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetChildReferenceCodePatternWT" style="document" />
-      <wsdl:input name="GetChildReferenceCodePatternWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetChildReferenceCodePatternWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GenerateReferenceCodesForClassHierarchy">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GenerateReferenceCodesForHierarchyWT" style="document" />
-      <wsdl:input name="GenerateReferenceCodesForHierarchyWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GenerateReferenceCodesForHierarchyWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClassification">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassificationWT" style="document" />
-      <wsdl:input name="GetClassificationWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassificationWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationGuides">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassificationGuidesWT" style="document" />
-      <wsdl:input name="GetClassificationGuidesWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassificationGuidesWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationGuide">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassificationGuideWT" style="document" />
-      <wsdl:input name="GetClassificationGuideWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassificationGuideWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetClassificationEnums">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/GetClassificationEnumsWT" style="document" />
-      <wsdl:input name="GetClassificationEnumsWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="GetClassificationEnumsWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-
-<!--
-    <wsdl:operation name="ApplyChanges">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ApplyChangesClassificationWT" style="document" />
-      <wsdl:input name="ApplyChangesClassificationWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ApplyChangesClassificationWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
--->
-
-    <wsdl:operation name="ReleaseRecordOwnership">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ReleaseRecordOwnershipWT" style="document" />
-      <wsdl:input name="ReleaseRecordOwnershipWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ReleaseRecordOwnershipWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ConvertReplicaToOriginal">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ConvertReplicaToOriginalWT" style="document" />
-      <wsdl:input name="ConvertReplicaToOriginalWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ConvertReplicaToOriginalWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ConvertReplicasFromHomeSystemToOriginal">
-      <soap:operation soapAction="http://www.meridio.com/MeridioRMWS/ConvertReplicasFromHomeSystemToOriginalWT" style="document" />
-      <wsdl:input name="ConvertReplicasFromHomeSystemToOriginalWT">
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output name="ConvertReplicasFromHomeSystemToOriginalWT">
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="MeridioRM">
-    <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Meridio Record Management Service. Most methods require a Meridio Soap Token which can be obtained from the Meridio Document Management Web Service.</documentation>
-    <wsdl:port name="MeridioRMSoap" binding="tns:MeridioRMSoap">
-      <soap:address location="http://localhost/RMWS/MeridioRMWS.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
\ No newline at end of file
diff --git a/connectors/meridio/wsdls/MetaCartaWS_axis.wsdl b/connectors/meridio/wsdls/MetaCartaWS_axis.wsdl
deleted file mode 100755
index 97b0c6d..0000000
--- a/connectors/meridio/wsdls/MetaCartaWS_axis.wsdl
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
-      <s:element name="GetUsersGroups">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="token" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="userID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUsersGroupsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetUsersGroupsResult" type="s:boolean" />
-            <s:element minOccurs="0" maxOccurs="1" name="groupResults" type="tns:ArrayOfGroupResult" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:complexType name="ArrayOfGroupResult">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="GroupResult" nillable="true" type="tns:GroupResult" />
-        </s:sequence>
-      </s:complexType>
-      <s:complexType name="GroupResult">
-        <s:sequence>
-          <s:element minOccurs="1" maxOccurs="1" name="groupID" type="s:int" />
-          <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-        </s:sequence>
-      </s:complexType>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetUsersGroupsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUsersGroups" />
-  </wsdl:message>
-  <wsdl:message name="GetUsersGroupsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUsersGroupsResponse" />
-  </wsdl:message>
-  <wsdl:portType name="MetaCartaSoap">
-    <wsdl:operation name="GetUsersGroups">
-      <wsdl:input message="tns:GetUsersGroupsSoapIn" />
-      <wsdl:output message="tns:GetUsersGroupsSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="MetaCartaSoap" type="tns:MetaCartaSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
-    <wsdl:operation name="GetUsersGroups">
-      <soap:operation soapAction="http://tempuri.org/GetUsersGroups" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="MetaCarta">
-    <wsdl:port name="MetaCartaSoap" binding="tns:MetaCartaSoap">
-      <soap:address location="http://localhost/MetaCartaWebService/MetaCarta.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/meridio/wsdls/RMClassificationDataSet_castor.xsd b/connectors/meridio/wsdls/RMClassificationDataSet_castor.xsd
deleted file mode 100644
index 7f56083..0000000
--- a/connectors/meridio/wsdls/RMClassificationDataSet_castor.xsd
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<xs:schema xmlns:mstns="http://www.meridio.com/RMClassificationDataSet.xsd" 
-           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
-           xmlns="http://www.meridio.com/RMClassificationDataSet.xsd"
-           attributeFormDefault="qualified"
-           elementFormDefault="qualified"
-           targetNamespace="http://www.meridio.com/RMClassificationDataSet.xsd"
-           id="RMClassificationDataSet"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-
-
-  <xs:element msdata:IsDataSet="true" name="RMClassificationDataSet">
-    <xs:complexType>
-      <xs:choice maxOccurs="unbounded">
-        <xs:element name="rm2Classification">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="objectId" type="xs:int" />
-              <xs:element minOccurs="0" name="initialClassification" type="xs:int" />
-              <xs:element minOccurs="0" name="currentClassification" type="xs:int" />
-              <xs:element minOccurs="0" name="derivedFromGuideTopic" type="xs:int" />
-              <xs:element minOccurs="0" name="declassifyOnDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="declassifyOnEvent" type="xs:string" />
-              <xs:element name="classifyingAgency" type="xs:string" />
-              <xs:element minOccurs="0" name="downgradeOnDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="downgradeOnEvent" type="xs:string" />
-              <xs:element minOccurs="0" name="downgradeInstructions" type="xs:string" />
-              <xs:element minOccurs="0" name="classificationReason" type="xs:string" />
-              <xs:element minOccurs="0" name="classifiedBy" type="xs:string" />
-              <xs:element minOccurs="0" name="derivedFrom" type="xs:string" />
-              <xs:element minOccurs="0" name="exemptionCategory" type="xs:string" />
-              <xs:element minOccurs="0" name="downgradedOn" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="downgradedBy" type="xs:int" />
-              <xs:element minOccurs="0" name="downgradedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="declassifiedOn" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="declassifiedBy" type="xs:int" />
-              <xs:element minOccurs="0" name="declassifiedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="upgradedOn" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="reasonsForUpgrade" type="xs:string" />
-              <xs:element minOccurs="0" name="upgradedBy" type="xs:int" />
-              <xs:element minOccurs="0" name="upgradedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="reviewedOn" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="reviewedBy" type="xs:int" />
-              <xs:element minOccurs="0" name="reviewedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ClassificationGuide">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ClassificationGuideTopic">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="guideId" type="xs:int" />
-              <xs:element minOccurs="0" name="topic" type="xs:string" />
-              <xs:element minOccurs="0" name="classification" type="xs:int" />
-              <xs:element minOccurs="0" name="reasonsForClassification" type="xs:string" />
-              <xs:element minOccurs="0" name="declassifyOnDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="declassifyOnEvent" type="xs:string" />
-              <xs:element minOccurs="0" name="exemptionCategory" type="xs:string" />
-              <xs:element minOccurs="0" name="remarks" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ClassificationReasonDef">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="classificationReason" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ExemptionCategoryDef">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="exemptionCategory" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-      </xs:choice>
-    </xs:complexType>
-  </xs:element>
-</xs:schema>
\ No newline at end of file
diff --git a/connectors/meridio/wsdls/RMDataSet_castor.xsd b/connectors/meridio/wsdls/RMDataSet_castor.xsd
deleted file mode 100644
index 413d7fb..0000000
--- a/connectors/meridio/wsdls/RMDataSet_castor.xsd
+++ /dev/null
@@ -1,909 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<xs:schema xmlns:mstns="http://www.meridio.com/RMDataSet.xsd"
-	   xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
-           xmlns="http://www.meridio.com/RMDataSet.xsd"
-           attributeFormDefault="qualified"
-           elementFormDefault="qualified"
-           targetNamespace="http://www.meridio.com/RMDataSet.xsd"
-           id="RMDataSet"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-<xs:element name="RMDataSet">
-    <xs:complexType>
-      <xs:sequence>
-        
-        <xs:element ref="rm2DisposalInstruction" maxOccurs="unbounded" minOccurs="0"/>            
-        <xs:element ref="rm2DisposalSchedule" maxOccurs="unbounded" minOccurs="0"/>            
-        <xs:element ref="rm2DisposalScheduleChain" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2DisposalScheduleChain_DisposalSchedule" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="rm2EventType" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2ExternalEvent" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2RetentionPeriod" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2ProtectiveMarkingCategory" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2ProtectiveMarkingDef" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2vClass" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2vFolder" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2vPart" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2vRecord" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2Part_Record" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2Part_Document" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2PropertyDef" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2ProtectiveMarking" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2RequestHistory" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2ReleaseHistory" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2ReviewHistory" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2ExportHistory" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2vClassCustomProperties" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2vFolderCustomProperties" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2vRecordCustomProperties" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2Config" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2RelocationHistory" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2AccessControlHistory" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2DisposalScheduleHistory" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2DisposalScheduleChain_Category" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2DisposalSchedule_Category" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2Privilege" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2LookupValue" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2Activities" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2Hold" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2Hold_Object" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2RelatedFolders" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2DisclosabilityHistory" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="rm2Facility" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2ProtectiveMarkingHistory" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2RecordVersion" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="rm2ReferenceCodePattern" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="rm2UserSetting" maxOccurs="unbounded" minOccurs="0"/>
-        <xs:element ref="kGroup" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="kGroup_Users" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="kUser" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="eltCheckoutStatus" maxOccurs="unbounded" minOccurs="0"/>             
-        <xs:element ref="eltDateFrequency" maxOccurs="unbounded" minOccurs="0"/>              
-        <xs:element ref="eltPhysical" maxOccurs="unbounded" minOccurs="0"/>              
-
-
-     </xs:sequence>
-    </xs:complexType>
-   </xs:element>
-
-
-<!--
-  <xs:element msdata:IsDataSet="true" name="RMDataSet">
-    <xs:complexType>
-      <xs:choice maxOccurs="unbounded">
-
--->
-        <xs:element name="rm2DisposalInstruction">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="priority" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisposalSchedule">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="description" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="objectType" type="xs:int" />
-              <xs:element minOccurs="0" name="categoryID" type="xs:int" />
-              <xs:element name="disposalInstructionID" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisposalScheduleChain">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="description" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="objectType" type="xs:int" />
-              <xs:element minOccurs="0" name="categoryID" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisposalScheduleChain_DisposalSchedule">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectID" type="xs:int" />
-              <xs:element name="disposalScheduleID" type="xs:int" />
-              <xs:element name="priority" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2EventType">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="tableName" type="xs:string" />
-              <xs:element minOccurs="0" name="columnName" type="xs:string" />
-              <xs:element minOccurs="0" name="objectType" type="xs:int" />
-              <xs:element minOccurs="0" name="categoryID" type="xs:int" />
-              <xs:element name="isCustom" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ExternalEvent">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="triggerDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="isTriggered" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2RetentionPeriod">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="months" type="xs:int" />
-              <xs:element minOccurs="0" name="years" type="xs:int" />
-              <xs:element minOccurs="0" name="explicitDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="eventId" type="xs:int" />
-              <xs:element minOccurs="0" name="externalEventId" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="disposalScheduleId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ProtectiveMarkingCategory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="type" type="xs:unsignedByte" />
-              <xs:element default="0" name="readOnly" type="xs:unsignedByte" />
-              <xs:element default="0" name="informative" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ProtectiveMarkingDef">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="rank" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vClass">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:AutoIncrement="true" minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="ownerID" type="xs:int" />
-              <xs:element minOccurs="0" name="ownerName" type="xs:string" />
-              <xs:element minOccurs="0" name="referenceCode" type="xs:string" />
-              <xs:element minOccurs="0" name="parentTitlePath" type="xs:string" />
-              <xs:element minOccurs="0" name="parentRefCodePath" type="xs:string" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" default="0" name="openStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="openDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="closeDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastAdditionDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastRetrievalDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReleaseDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="recordCountClosure" type="xs:int" />
-              <xs:element minOccurs="0" name="recordSizeClosure" type="xs:int" />
-              <xs:element minOccurs="0" name="annualClosureDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="cutOffFrequency" type="xs:int" />
-              <xs:element minOccurs="0" name="autoGenerateNewPart" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="generateSequenceNumber" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="hold" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="explicitDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="inheritedDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="destinationExportOrg" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="dpaDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="dpaExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="dpaNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="foiNotes" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="foiDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="foiExemption" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="eirDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="eirExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="eirNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="groupOwnerID" type="xs:int" />
-              <xs:element minOccurs="0" name="inherit" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="cascadeBehaviour" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="currentDisposalScheduleId" type="xs:int" />
-              <xs:element minOccurs="0" default="0" name="permanentPreservation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecord" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecordReviewPeriod" type="xs:int" />
-              <xs:element minOccurs="0" name="homePage" type="xs:string" />
-              <xs:element minOccurs="0" name="replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="homeSystemId" type="xs:int" />
-              <xs:element minOccurs="0" name="homeSystemName" type="xs:string" />
-              <xs:element minOccurs="0" name="globalId" type="xs:string" />
-              <xs:element minOccurs="0" name="lastSynchTime" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vFolder">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:AutoIncrement="true" minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="ownerID" type="xs:int" />
-              <xs:element minOccurs="0" name="ownerName" type="xs:string" />
-              <xs:element minOccurs="0" name="referenceCode" type="xs:string" />
-              <xs:element minOccurs="0" name="parentTitlePath" type="xs:string" />
-              <xs:element minOccurs="0" name="parentRefCodePath" type="xs:string" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" default="0" name="openStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="openDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="closeDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastAdditionDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastRetrievalDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReleaseDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="currentPartId" type="xs:int" />
-              <xs:element minOccurs="0" name="recordCountClosure" type="xs:int" />
-              <xs:element minOccurs="0" name="recordSizeClosure" type="xs:int" />
-              <xs:element minOccurs="0" name="annualClosureDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="cutOffFrequency" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveCutOffDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="autoGenerateNewPart" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="generateSequenceNumber" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="explicitDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="inheritedDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="currentDisposalScheduleId" type="xs:int" />
-              <xs:element minOccurs="0" name="lastInstructionExecuted" type="xs:int" />
-              <xs:element minOccurs="0" name="nextInstructionToExecute" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="hold" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="destinationExportOrg" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="dpaDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="dpaExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="dpaNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="foiNotes" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="foiDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="foiExemption" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="eirDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="eirExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="eirNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="physical" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="physicalHomeLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="physicalCurrentLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="physicalContentsList" type="xs:string" />
-              <xs:element minOccurs="0" name="availableForCheckout" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="checkoutStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="checkedOutByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="checkedOutToUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="requestStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="facilityId" type="xs:int" />
-              <xs:element minOccurs="0" name="barcode" type="xs:string" />
-              <xs:element minOccurs="0" name="inherit" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="groupOwnerID" type="xs:int" />
-              <xs:element minOccurs="0" name="cascadeBehaviour" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="disposalApproved" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="disposed" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" default="0" name="permanentPreservation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecord" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecordReviewPeriod" type="xs:int" />
-              <xs:element minOccurs="0" name="lastVitalRecordReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="homeSystemId" type="xs:int" />
-              <xs:element minOccurs="0" name="homeSystemName" type="xs:string" />
-              <xs:element minOccurs="0" name="globalId" type="xs:string" />
-              <xs:element minOccurs="0" name="lastSynchTime" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vPart">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="partNumber" type="xs:int" />
-              <xs:element minOccurs="0" name="parentTitlePath" type="xs:string" />
-              <xs:element minOccurs="0" name="parentRefCodePath" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" default="0" name="openStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="openDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="closeDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastAdditionDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastRetrievalDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReleaseDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="recordCountClosure" type="xs:int" />
-              <xs:element minOccurs="0" name="recordSizeClosure" type="xs:int" />
-              <xs:element minOccurs="0" name="annualClosureDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="cutOffFrequency" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveCutOffDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="inheritedDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="explicitDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="currentDisposalScheduleId" type="xs:int" />
-              <xs:element minOccurs="0" name="lastInstructionExecuted" type="xs:int" />
-              <xs:element minOccurs="0" name="nextInstructionToExecute" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="hold" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="destinationExportOrg" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="dpaDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="dpaExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="dpaNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="foiNotes" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="foiDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="foiExemption" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="eirDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="eirExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="eirNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="physical" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="physicalHomeLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="physicalCurrentLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="physicalContentsList" type="xs:string" />
-              <xs:element minOccurs="0" name="availableForCheckout" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="checkoutStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="checkedOutByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="checkedOutToUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="requestStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="facilityId" type="xs:int" />
-              <xs:element minOccurs="0" name="barcode" type="xs:string" />
-              <xs:element minOccurs="0" name="disposalApproved" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="disposed" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" default="0" name="permanentPreservation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecord" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecordReviewPeriod" type="xs:int" />
-              <xs:element minOccurs="0" name="lastVitalRecordReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="homeSystemId" type="xs:int" />
-              <xs:element minOccurs="0" name="homeSystemName" type="xs:string" />
-              <xs:element minOccurs="0" name="globalId" type="xs:string" />
-              <xs:element minOccurs="0" name="lastSynchTime" type="xs:dateTime" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vRecord">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserID" type="xs:int" />
-              <xs:element minOccurs="0" name="createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="ownerID" type="xs:int" />
-              <xs:element minOccurs="0" name="ownerName" type="xs:string" />
-              <xs:element minOccurs="0" name="author" type="xs:string" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:int" />
-              <xs:element minOccurs="0" name="categoryTitle" type="xs:string" />
-              <xs:element minOccurs="0" name="sequenceNumber" type="xs:string" />
-              <xs:element minOccurs="0" name="circulationList" type="xs:string" />
-              <xs:element minOccurs="0" name="declaredByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="declaredByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="declarationDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastRetrievalDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="lastReleaseDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="inheritedDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="explicitDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDisposalScheduleChainId" type="xs:int" />
-              <xs:element minOccurs="0" name="currentDisposalScheduleId" type="xs:int" />
-              <xs:element minOccurs="0" name="lastInstructionExecuted" type="xs:int" />
-              <xs:element minOccurs="0" name="nextInstructionToExecute" type="xs:int" />
-              <xs:element minOccurs="0" name="effectiveDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="hold" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" default="0" name="permanentPreservation" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="destinationExportOrg" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="dpaDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="dpaExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="dpaNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="foiNotes" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="foiDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="foiExemption" type="xs:string" />
-              <xs:element minOccurs="0" default="1" name="eirDisclosability" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="eirExemption" type="xs:string" />
-              <xs:element minOccurs="0" name="eirNotes" type="xs:string" />
-              <xs:element minOccurs="0" name="physical" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="physicalHomeLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="physicalCurrentLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="physicalContentsList" type="xs:string" />
-              <xs:element minOccurs="0" name="availableForCheckout" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="checkoutStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="checkedOutByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="checkedOutToUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="requestStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="facilityId" type="xs:int" />
-              <xs:element minOccurs="0" name="barcode" type="xs:string" />
-              <xs:element minOccurs="0" name="groupOwnerID" type="xs:int" />
-              <xs:element minOccurs="0" name="cascadeBehaviour" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="disposalApproved" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="superseded" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="supersededOnDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="disposed" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecord" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="vitalRecordReviewPeriod" type="xs:int" />
-              <xs:element minOccurs="0" name="lastVitalRecordReviewDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="documentDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="cutOffDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="replicationType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="homeSystemId" type="xs:int" />
-              <xs:element minOccurs="0" name="homeSystemName" type="xs:string" />
-              <xs:element minOccurs="0" name="globalId" type="xs:string" />
-              <xs:element minOccurs="0" name="lastSynchTime" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="relationshipCount" type="xs:int" />
-              <xs:element minOccurs="0" name="fingerprint" type="xs:string" />
-              <xs:element minOccurs="0" name="defaultLockFileName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Part_Record">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="recordId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Part_Document">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="documentId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2PropertyDef">
-          <xs:complexType>
-            <xs:sequence>
-
-              <!-- Added ID as it is in the XML and otherwise castor complains -->
-	      <xs:element minOccurs="0" name="id" type="xs:int" />
-
-              <xs:element name="keyColumn" type="xs:string" />
-              <xs:element name="tableName" type="xs:string" />
-              <xs:element name="columnName" type="xs:string" />
-              <xs:element minOccurs="0" name="lookupTable" type="xs:string" />
-              <xs:element minOccurs="0" name="lookupKeyColumn" type="xs:string" />
-              <xs:element minOccurs="0" name="lookupTextColumn" type="xs:string" />
-              <xs:element name="displayName" type="xs:string" />
-              <xs:element name="type" type="xs:unsignedByte" />
-              <xs:element name="readOnly" type="xs:unsignedByte" />
-              <xs:element name="required" type="xs:unsignedByte" />
-              <xs:element name="systemGenerated" type="xs:unsignedByte" />
-              <xs:element name="hasRange" type="xs:unsignedByte" />
-              <xs:element name="hasDefault" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="min" type="xs:string" />
-              <xs:element minOccurs="0" name="max" type="xs:string" />
-              <xs:element minOccurs="0" name="default" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ProtectiveMarking">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element name="protectiveMarkingDefId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2RequestHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:AutoIncrement="true" minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" default="0" name="checkoutStatus" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="requestDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="checkoutDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="checkinDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="bringForwardDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="requestedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="requestedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="checkedoutByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="checkedoutByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="checkedinByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="checkedinByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="requestedLocation" type="xs:string" />
-              <xs:element minOccurs="0" name="requestCollection" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ReleaseHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="releaseType" type="xs:string" />
-              <xs:element name="released" type="xs:unsignedByte" />
-              <xs:element name="releaseDetails" type="xs:string" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ReviewHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element name="reviewDetails" type="xs:string" />
-              <xs:element name="reviewDecision" type="xs:string" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ExportHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="exportDetails" type="xs:string" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vClassCustomProperties">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="value" type="xs:string" />
-              <xs:element minOccurs="0" name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vFolderCustomProperties">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="value" type="xs:string" />
-              <xs:element minOccurs="0" name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2vRecordCustomProperties">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="value" type="xs:string" />
-              <xs:element minOccurs="0" name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="categoryId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Config">
-          <xs:complexType>
-            <xs:sequence>
-	      <!-- Added 'id' because it's returned in the SOAP response!!! -->
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2RelocationHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="objectId" type="xs:int" />
-              <xs:element name="objectType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="oldParentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="oldParentobjectType" type="xs:int" />
-              <xs:element minOccurs="0" name="newParentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="newParentObjectType" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="reason" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2AccessControlHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="objectName" type="xs:string" />
-              <xs:element name="objectType" type="xs:int" />
-              <xs:element name="permission" type="xs:int" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:int" />
-              <xs:element name="createdate" type="xs:dateTime" />
-              <xs:element name="action" type="xs:unsignedByte" />
-              <xs:element name="actionedByUserId" type="xs:int" />
-              <xs:element name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisposalScheduleHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="changeType" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="details" type="xs:string" />
-              <xs:element minOccurs="0" name="reason" type="xs:string" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUsername" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisposalScheduleChain_Category">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="disposalScheduleChainId" type="xs:int" />
-              <xs:element name="categoryId" type="xs:int" />
-              <xs:element name="noVersions" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisposalSchedule_Category">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="categoryId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Privilege">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element name="comment" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2LookupValue">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Activities">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="objectId" type="xs:int" />
-              <xs:element name="objectType" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="permission" type="xs:int" />
-              <xs:element name="cando" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Hold">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="description" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="createdByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="namedAuthority" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Hold_Object">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="objectId" type="xs:int" />
-              <xs:element name="objectType" type="xs:unsignedByte" />
-              <xs:element name="state" type="xs:int" />
-              <xs:element minOccurs="0" name="isExplicit" type="xs:unsignedByte" />
-              <xs:element minOccurs="0" name="referenceCount" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2RelatedFolders">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="childId" type="xs:int" />
-              <xs:element minOccurs="0" name="description" type="xs:string" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2DisclosabilityHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element msdata:ReadOnly="true" msdata:AutoIncrement="true" name="id" type="xs:int" />
-              <xs:element name="createDate" type="xs:dateTime" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element name="columnName" type="xs:string" />
-              <xs:element minOccurs="0" name="originalValue" type="xs:string" />
-              <xs:element minOccurs="0" name="newValue" type="xs:string" />
-              <xs:element minOccurs="0" name="actionedByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2Facility">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="description" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="createdByUserName" type="xs:string" />
-              <xs:element minOccurs="0" name="homeLocationFormat" type="xs:string" />
-              <xs:element name="city" type="xs:string" />
-              <xs:element name="stateProvince" type="xs:string" />
-              <xs:element minOccurs="0" name="facOperator" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ProtectiveMarkingHistory">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element name="protectiveMarkingCategoryName" type="xs:string" />
-              <xs:element name="protectiveMarkingCategoryId" type="xs:int" />
-              <xs:element name="protectiveMarkingDefName" type="xs:string" />
-              <xs:element name="protectiveMarkingDefId" type="xs:int" />
-              <xs:element minOccurs="0" name="protectiveMarkingDefRank" type="xs:unsignedByte" />
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="parentObjectType" type="xs:unsignedByte" />
-              <xs:element name="createDate" type="xs:dateTime" />
-              <xs:element name="action" type="xs:unsignedByte" />
-              <xs:element name="actionDate" type="xs:dateTime" />
-              <xs:element name="actionedByUserId" type="xs:int" />
-              <xs:element name="actionedByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2RecordVersion">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="parentObjectId" type="xs:int" />
-              <xs:element name="recordVersionId" type="xs:int" />
-              <xs:element name="recordVersionNumber" type="xs:int" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="createdByUserName" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2ReferenceCodePattern">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="id" type="xs:int" />
-              <xs:element minOccurs="0" name="parentObjectId" type="xs:int" />
-              <xs:element minOccurs="0" name="subLevel" type="xs:int" />
-              <xs:element minOccurs="0" name="pattern" type="xs:string" />
-              <xs:element minOccurs="0" name="startValue" type="xs:string" />
-              <xs:element minOccurs="0" name="increment" type="xs:int" />
-              <xs:element minOccurs="0" name="autoGenerate" type="xs:unsignedByte" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="rm2UserSetting">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element minOccurs="0" name="userId" type="xs:int" />
-              <xs:element minOccurs="0" name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="value" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="kGroup">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUser" type="xs:string" />
-              <xs:element minOccurs="0" name="createdByUserId" type="xs:int" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-              <xs:element minOccurs="0" name="active" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="kGroup_Users">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="parentObjectId" type="xs:int" />
-              <xs:element name="userId" type="xs:int" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="kUser">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-              <xs:element minOccurs="0" name="realName" type="xs:string" />
-              <xs:element minOccurs="0" name="createDate" type="xs:dateTime" />
-              <xs:element minOccurs="0" name="comment" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="eltCheckoutStatus">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="eltDateFrequency">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-        <xs:element name="eltPhysical">
-          <xs:complexType>
-            <xs:sequence>
-              <xs:element name="id" type="xs:int" />
-              <xs:element name="name" type="xs:string" />
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-
-<!--
-      </xs:choice>
-    </xs:complexType>
-  </xs:element>
--->
-
-
-</xs:schema>
\ No newline at end of file
diff --git a/connectors/nullauthority/.gitignore b/connectors/nullauthority/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/nullauthority/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/nullauthority/build.xml b/connectors/nullauthority/build.xml
deleted file mode 100644
index dfc932d..0000000
--- a/connectors/nullauthority/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="nullauthority" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="Null"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.nullauthority.NullAuthority"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/nullauthority/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nullauthority/Messages.java b/connectors/nullauthority/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nullauthority/Messages.java
deleted file mode 100644
index 46ff6d1..0000000
--- a/connectors/nullauthority/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nullauthority/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.nullauthority;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.nullauthority";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.nullauthority";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/nullauthority/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nullauthority/NullAuthority.java b/connectors/nullauthority/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nullauthority/NullAuthority.java
deleted file mode 100644
index 4f61268..0000000
--- a/connectors/nullauthority/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nullauthority/NullAuthority.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.nullauthority;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is the null authority implementation, which simply returns the user name as the single access token.
-* This is useful for situations where all the documents are being indexed using forced acls, and a demonstration of
-* security is desired.  It's also quite useful for testing.
-*/
-public class NullAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** This is the active directory global deny token.  This should be ingested with all documents. */
-  private static final String globalDenyToken = "DEAD_AUTHORITY";
-  
-  private static final AuthorizationResponse unreachableResponse = new AuthorizationResponse(new String[]{globalDenyToken},
-    AuthorizationResponse.RESPONSE_UNREACHABLE);
-
-  /** Constructor.
-  */
-  public NullAuthority()
-  {
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Check connection for sanity.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    return super.check();
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    String[] tokens = new String[]{userName};
-    return new AuthorizationResponse(tokens,AuthorizationResponse.RESPONSE_OK);
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    // The default response if the getConnection method fails, which should never happen.
-    return unreachableResponse;
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    // Does nothing
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    // Does nothing
-  }
-
-}
-
-
diff --git a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_en_US.properties b/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_en_US.properties
deleted file mode 100644
index ee20027..0000000
--- a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_en_US.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff here as needed
diff --git a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_es_ES.properties b/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_es_ES.properties
deleted file mode 100644
index ee20027..0000000
--- a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_es_ES.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff here as needed
diff --git a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_ja_JP.properties b/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_ja_JP.properties
deleted file mode 100644
index ee20027..0000000
--- a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_ja_JP.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff here as needed
diff --git a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_zh_CN.properties b/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_zh_CN.properties
deleted file mode 100644
index ee20027..0000000
--- a/connectors/nullauthority/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nullauthority/common_zh_CN.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff here as needed
diff --git a/connectors/nullauthority/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nullauthority/tests/BaseUIHSQLDB.java b/connectors/nullauthority/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nullauthority/tests/BaseUIHSQLDB.java
deleted file mode 100644
index b435f7c..0000000
--- a/connectors/nullauthority/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nullauthority/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.nullauthority.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getAuthorityClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.authorities.authorities.nullauthority.NullAuthority"};
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[]{"Null authority"};
-  }
-
-}
diff --git a/connectors/nullauthority/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nullauthority/tests/NavigationHSQLDBUI.java b/connectors/nullauthority/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nullauthority/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index d100571..0000000
--- a/connectors/nullauthority/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nullauthority/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.nullauthority.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-
-    // Add an authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButton("Add a new authority group");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("groupname");
-    testerInstance.setValue("groupname","MyAuthorityGroup");
-
-    // Save the authority group
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Add an authority
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButton("Add a new connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyAuthorityConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.authorities.authorities.nullauthority.NullAuthority");
-    testerInstance.selectValue("authoritygroup", "MyAuthorityGroup");
-    testerInstance.clickButton("Continue");
-    
-    // Back to the name tab
-    testerInstance.clickTab("Name");
-    
-    // Now, save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Delete the authority connection
-    testerInstance.navigateTo("List authorities");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the authority group
-    testerInstance.navigateTo("List authority groups");
-    testerInstance.clickButtonByTitle("Delete MyAuthorityGroup");
-    testerInstance.acceptAlert();
-    
-  }
-  
-}
diff --git a/connectors/nullauthority/pom.xml b/connectors/nullauthority/pom.xml
deleted file mode 100644
index 700822a..0000000
--- a/connectors/nullauthority/pom.xml
+++ /dev/null
@@ -1,360 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-nullauthority-connector</artifactId>
-  <name>ManifoldCF - Connectors - Null Authority</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/nulloutput/.gitignore b/connectors/nulloutput/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/nulloutput/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/nulloutput/build.xml b/connectors/nulloutput/build.xml
deleted file mode 100644
index 336a831..0000000
--- a/connectors/nulloutput/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="nulloutput" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="Null"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.nullconnector.NullConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/nulloutput/connector/src/main/java/org/apache/manifoldcf/agents/output/nullconnector/Messages.java b/connectors/nulloutput/connector/src/main/java/org/apache/manifoldcf/agents/output/nullconnector/Messages.java
deleted file mode 100644
index 9a98c57..0000000
--- a/connectors/nulloutput/connector/src/main/java/org/apache/manifoldcf/agents/output/nullconnector/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.nullconnector;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.nullconnector.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.output.nullconnector";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/nulloutput/connector/src/main/java/org/apache/manifoldcf/agents/output/nullconnector/NullConnector.java b/connectors/nulloutput/connector/src/main/java/org/apache/manifoldcf/agents/output/nullconnector/NullConnector.java
deleted file mode 100644
index 9425951..0000000
--- a/connectors/nulloutput/connector/src/main/java/org/apache/manifoldcf/agents/output/nullconnector/NullConnector.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/* $Id: NullConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.nullconnector;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** This is a null output connector.  It eats all output and simply logs the events.
-*/
-public class NullConnector extends org.apache.manifoldcf.agents.output.BaseOutputConnector
-{
-  public static final String _rcsid = "@(#)$Id: NullConnector.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Activities we log
-
-  /** Ingestion activity */
-  public final static String INGEST_ACTIVITY = "document ingest";
-  /** Document removal activity */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-  /** Job notify activity */
-  public final static String JOB_COMPLETE_ACTIVITY = "output notification";
-
-  /** Constructor.
-  */
-  public NullConnector()
-  {
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{INGEST_ACTIVITY,REMOVE_ACTIVITY,JOB_COMPLETE_ACTIVITY};
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-  * out of the ini file.)
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-  }
-
-  /** Close the connection.  Call this before discarding the connection.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    super.disconnect();
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      getSession();
-      return super.check();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Transient error: "+e.getMessage();
-    }
-  }
-
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param spec is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return new VersionContext("",params,spec);
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  *@return the document status (accepted or permanently rejected).
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    // Establish a session
-    getSession();
-    final StringBuffer sb = new StringBuffer();
-    final Iterator<String> metadataKeys = document.getFields();
-    boolean needComma = false;
-    while (metadataKeys.hasNext()) {
-      final String key = metadataKeys.next();
-      final String[] values = document.getFieldAsStrings(key);
-      if (needComma) {
-        sb.append(",");
-      } else {
-        needComma = true;
-      }
-      sb.append("\"").append(key).append("\":").append(Integer.toString(values.length));
-    }
-    activities.recordActivity(null,INGEST_ACTIVITY,new Long(document.getBinaryLength()),documentURI,"OK",sb.toString());
-    return DOCUMENTSTATUS_ACCEPTED;
-  }
-
-  /** Remove a document using the connector.
-  * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Establish a session
-    getSession();
-    activities.recordActivity(null,REMOVE_ACTIVITY,null,documentURI,"OK",null);
-  }
-
-  /** Notify the connector of a completed job.
-  * This is meant to allow the connector to flush any internal data structures it has been keeping around, or to tell the output repository that this
-  * is a good time to synchronize things.  It is called whenever a job is either completed or aborted.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    activities.recordActivity(null,JOB_COMPLETE_ACTIVITY,null,"","OK",null);
-  }
-
-}
diff --git a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_en_US.properties b/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_en_US.properties
deleted file mode 100644
index 9fe9639..0000000
--- a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_en_US.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff as needed
diff --git a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_es_ES.properties b/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_es_ES.properties
deleted file mode 100644
index 9fe9639..0000000
--- a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_es_ES.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff as needed
diff --git a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_ja_JP.properties b/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_ja_JP.properties
deleted file mode 100644
index 9fe9639..0000000
--- a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_ja_JP.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff as needed
diff --git a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_zh_CN.properties b/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_zh_CN.properties
deleted file mode 100644
index 9fe9639..0000000
--- a/connectors/nulloutput/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/nullconnector/common_zh_CN.properties
+++ /dev/null
@@ -1,16 +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.
-
-# Add stuff as needed
diff --git a/connectors/nulloutput/pom.xml b/connectors/nulloutput/pom.xml
deleted file mode 100644
index d3f515f..0000000
--- a/connectors/nulloutput/pom.xml
+++ /dev/null
@@ -1,355 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-nulloutput-connector</artifactId>
-  <name>ManifoldCF - Connectors - Null Output</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/nulltransformation/.gitignore b/connectors/nulltransformation/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/nulltransformation/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/nulltransformation/build.xml b/connectors/nulltransformation/build.xml
deleted file mode 100644
index 53a16e0..0000000
--- a/connectors/nulltransformation/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="nulltransformation" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="Null"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.nullconnector.NullConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/nulltransformation/connector/src/main/java/org/apache/manifoldcf/agents/transformation/nullconnector/NullConnector.java b/connectors/nulltransformation/connector/src/main/java/org/apache/manifoldcf/agents/transformation/nullconnector/NullConnector.java
deleted file mode 100644
index 6fe24a2..0000000
--- a/connectors/nulltransformation/connector/src/main/java/org/apache/manifoldcf/agents/transformation/nullconnector/NullConnector.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.nullconnector;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This connector works as a transformation connector, but does nothing other than logging.
-*
-*/
-public class NullConnector extends org.apache.manifoldcf.agents.transformation.BaseTransformationConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected static final String ACTIVITY_PROCESS = "process";
-
-  protected static final String[] activitiesList = new String[]{ACTIVITY_PROCESS};
-  
-  /** Return a list of activities that this connector generates.
-  * The connector does NOT need to be connected before this method is called.
-  *@return the set of activities.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    long startTime = System.currentTimeMillis();
-    String resultCode = "OK";
-    String description = null;
-    Long length = null;
-    try
-    {
-      long binaryLength = document.getBinaryLength();
-      int rval = activities.sendDocument(documentURI,document);
-      length =  new Long(binaryLength);
-      resultCode = (rval == DOCUMENTSTATUS_ACCEPTED)?"ACCEPTED":"REJECTED";
-      return rval;
-    }
-    catch (ServiceInterruption e)
-    {
-      resultCode = "SERVICEINTERRUPTION";
-      description = e.getMessage();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      resultCode = "EXCEPTION";
-      description = e.getMessage();
-      throw e;
-    }
-    catch (IOException e)
-    {
-      resultCode = "IOEXCEPTION";
-      description = e.getMessage();
-      throw e;
-    }
-    finally
-    {
-      activities.recordActivity(new Long(startTime), ACTIVITY_PROCESS, length, documentURI,
-        resultCode, description);
-    }
-
-  }
-
-}
-
-
diff --git a/connectors/nulltransformation/pom.xml b/connectors/nulltransformation/pom.xml
deleted file mode 100644
index 7ce6d1f..0000000
--- a/connectors/nulltransformation/pom.xml
+++ /dev/null
@@ -1,355 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-nulltransformation-connector</artifactId>
-  <name>ManifoldCF - Connectors - Null Transformation</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/nuxeo/README.md b/connectors/nuxeo/README.md
deleted file mode 100755
index 96e237f..0000000
--- a/connectors/nuxeo/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# ManifoldCF - Connectors - Nuxeo Connector
-
-### Nuxeo repository connector
-
-The repository connector has been developed using an incremental mode for seeding. Each time a job is executed is stored the current date and the request is done using the last seed version. Except if it is the first run, then all documents are crawled if it meet the specifications [1].
-
-The metadata include with de document are: Uid, title, last modified, state, path, type, is checked out, repository, parent reference, description, language, coverage, valid, creators, contributors, last contributor, rights, expired, created, issued, nature, source, publisher, subjects and, optionally, attachments and tags. Specifically to note are included the notes and mime type.
-
-##### **Configurations**
-Required fields to connect are: protocol (http or https), host, port (default is 8080), path and if necessary a username and password.
-
-##### **Specifications**
-There are four possible specifications:
-- Select domains to be crawled.
-- Give the option of choosing if the tags must be processed.
-- Select documents type to be crawled.
-- Give the option of choosing if the attachments must be processed.
-
-### Nuxeo authority connector
-
-The authority connector has been developed using Acls [2]. Each document stores users and groups which have read permissions[3]. 
-
-When a user searches then their username and groups are obtained and it are compared with the usernames and groups of the documents. In this way, they can only see the documents which contain his groups or his username.
-
-##### **Configurations**
-It is the same as for the repository connector.
-
-[1] https://doc.nuxeo.com/display/NXDOC/REST+API  
-[2] https://doc.nuxeo.com/display/NXDOC/ACLs  
-[3] https://doc.nuxeo.com/display/NXDOC/Web+Adapters+for+the+REST+API
\ No newline at end of file
diff --git a/connectors/nuxeo/build.xml b/connectors/nuxeo/build.xml
deleted file mode 100644
index 08687b9..0000000
--- a/connectors/nuxeo/build.xml
+++ /dev/null
@@ -1,66 +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.
--->
-
-<project name="nuxeo" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="nuxeo-java-client*.jar"/>
-            <include name="retrofit*.jar"/>
-            <include name="okhttp*.jar"/>
-            <include name="okio*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="nuxeo-java-client*.jar"/>
-                <include name="retrofit*.jar"/>
-                <include name="okhttp*.jar"/>
-                <include name="okio*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Nuxeo"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.nuxeo.NuxeoRepositoryConnector"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="Nuxeo"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.nuxeo.NuxeoAuthorityConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nuxeo/Messages.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nuxeo/Messages.java
deleted file mode 100755
index 8caa5d8..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nuxeo/Messages.java
+++ /dev/null
@@ -1,121 +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 org.apache.manifoldcf.authorities.authorities.nuxeo;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-
-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.authorities.authorities.nuxeo.common";
-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.authorities.authorities.nuxeo";
-
-  /** Constructor - do no instantiate
-    */
-  protected Messages()
-  {
-  }
-
-  public static String getString(Locale locale, String messageKey) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be
-  // specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey,
-      Object[] args) {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String, String> substitutionParameters, boolean mapToUpperCase) throws ManifoldCFException {
-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey, substitutionParameters,
-        mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String, String> substitutionParameters, boolean mapToUpperCase) throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String, Object> contextObjects) throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        contextObjects);
-  }
-
-}
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nuxeo/NuxeoAuthorityConnector.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nuxeo/NuxeoAuthorityConnector.java
deleted file mode 100755
index 62b4d70..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/nuxeo/NuxeoAuthorityConnector.java
+++ /dev/null
@@ -1,363 +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 org.apache.manifoldcf.authorities.authorities.nuxeo;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.nuxeo.NuxeoConfiguration;
-import org.nuxeo.client.api.NuxeoClient;
-import org.nuxeo.client.api.objects.user.User;
-import org.nuxeo.client.internals.spi.NuxeoClientException;
-
-/**
- *
- * Nuxeo Authority Connector class
- * 
- * @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
- *
- */
-public class NuxeoAuthorityConnector extends BaseAuthorityConnector {
-
-  // Configuration tabs
-  private static final String CONF_SERVER_TAB_PROPERTY = "NuxeoAuthorityConnector.Server";
-
-  // Prefix for nuxeo configuration and specification parameters
-  private static final String PARAMETER_PREFIX = "nuxeo_";
-
-  // Templates
-  /**
-   * Javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_conf.js";
-
-  /**
-   * Server edit tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_conf_server.html";
-
-  /**
-   * Server view tab template
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_conf.html";
-
-  /* Nuxeo instance parameters */
-  protected String protocol = null;
-  protected String host = null;
-  protected String port = null;
-  protected String path = null;
-  protected String username = null;
-  protected String password = null;
-
-  protected NuxeoClient nuxeoClient = null;
-
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-
-  // Constructor
-  public NuxeoAuthorityConnector() {
-    super();
-  }
-
-  void setNuxeoClient(NuxeoClient nuxeoClient) {
-    this.nuxeoClient = nuxeoClient;
-  }
-
-  /** CONNECTION **/
-
-  // Makes connection to server
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    protocol = params.getParameter(NuxeoConfiguration.Server.PROTOCOL);
-    host = params.getParameter(NuxeoConfiguration.Server.HOST);
-    port = params.getParameter(NuxeoConfiguration.Server.PORT);
-    path = params.getParameter(NuxeoConfiguration.Server.PATH);
-    username = params.getParameter(NuxeoConfiguration.Server.USERNAME);
-    password = params.getObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD);
-
-  }
-
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    shutdownNuxeoClient();
-    protocol = null;
-    host = null;
-    port = null;
-    path = null;
-    username = null;
-    password = null;
-    super.disconnect();
-  }
-
-  /**
-   * Check the connection
-   */
-  @Override
-  public String check() throws ManifoldCFException {
-    shutdownNuxeoClient();
-    initNuxeoClient();
-    try {
-      nuxeoClient.repository().getDocumentRoot();
-    } catch (NuxeoClientException ex) {
-      return "Connection failed: "+ex.getMessage();
-    }
-
-    return super.check();
-  }
-
-  /**
-   * Initialize Nuxeo client using the configured parameters.
-   * 
-   * @throws ManifoldCFException
-   */
-  private void initNuxeoClient() throws ManifoldCFException {
-    if (nuxeoClient == null) {
-
-      if (StringUtils.isEmpty(protocol)) {
-        throw new ManifoldCFException(
-            "Parameter " + NuxeoConfiguration.Server.PROTOCOL + " required but not set");
-      }
-
-      if (StringUtils.isEmpty(host)) {
-        throw new ManifoldCFException("Parameter " + NuxeoConfiguration.Server.HOST + " required but not set");
-      }
-
-      String url = getUrl();
-      nuxeoClient = new NuxeoClient(url, username, password);
-
-    }
-
-  }
-  
-  /**
-   * Shut down Nuxeo client
-   */
-  private void shutdownNuxeoClient() {
-    if (nuxeoClient != null) {
-      nuxeoClient.shutdown();
-      nuxeoClient = null;
-      lastSessionFetch = -1L;
-    }
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-
-    if (currentTime > lastSessionFetch + timeToRelease) {
-      shutdownNuxeoClient();
-    }
-  }
-
-  /**
-   * Formatter URL
-   * 
-   * @throws ManifoldCFException
-   */
-  String getUrl() throws ManifoldCFException {
-    int portInt;
-    if (port != null && port.length() > 0) {
-      try {
-        portInt = Integer.parseInt(port);
-      } catch (NumberFormatException formatException) {
-        throw new ManifoldCFException("Bad number: " + formatException.getMessage(), formatException);
-      }
-    } else {
-      if (protocol.toLowerCase(Locale.ROOT).equals("http")) {
-        portInt = 80;
-      } else {
-        portInt = 443;
-      }
-    }
-
-    String url = protocol + "://" + host + ":" + portInt + "/" + path;
-
-    return url;
-  }
-
-  /**
-   * @return true if the connector instance is connected.
-   */
-  @Override
-  public boolean isConnected() {
-    return nuxeoClient != null;
-  }
-
-  /** VIEW CONFIGURATION **/
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD, paramMap, true);
-  }
-
-  private static void fillInServerConfigurationMap(Map<String, String> serverMap, IPasswordMapperActivity mapper,
-      ConfigParams parameters) {
-
-    String nuxeoProtocol = parameters.getParameter(NuxeoConfiguration.Server.PROTOCOL);
-    String nuxeoHost = parameters.getParameter(NuxeoConfiguration.Server.HOST);
-    String nuxeoPort = parameters.getParameter(NuxeoConfiguration.Server.PORT);
-    String nuxeoPath = parameters.getParameter(NuxeoConfiguration.Server.PATH);
-    String nuxeoUsername = parameters.getParameter(NuxeoConfiguration.Server.USERNAME);
-    String nuxeoPassword = parameters.getObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD);
-
-    if (nuxeoProtocol == null)
-      nuxeoProtocol = NuxeoConfiguration.Server.PROTOCOL_DEFAULT_VALUE;
-    if (nuxeoHost == null)
-      nuxeoHost = NuxeoConfiguration.Server.HOST_DEFAULT_VALUE;
-    if (nuxeoPort == null)
-      nuxeoPort = NuxeoConfiguration.Server.PORT_DEFAULT_VALUE;
-    if (nuxeoPath == null)
-      nuxeoPath = NuxeoConfiguration.Server.PATH_DEFAULT_VALUE;
-    if (nuxeoUsername == null)
-      nuxeoUsername = NuxeoConfiguration.Server.USERNAME_DEFAULT_VALUE;
-    if (nuxeoPassword == null)
-      nuxeoPassword = NuxeoConfiguration.Server.PASSWORD_DEFAULT_VALUE;
-    else
-      nuxeoPassword = mapper.mapPasswordToKey(nuxeoPassword);
-
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PROTOCOL, nuxeoProtocol);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.HOST, nuxeoHost);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PORT, nuxeoPort);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PATH, nuxeoPath);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.USERNAME, nuxeoUsername);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PASSWORD, nuxeoPassword);
-  }
-
-  /** CONFIGURATION CONNECTOR **/
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale,
-      ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException {
-
-    // Server tab
-    tabsArray.add(Messages.getString(locale, CONF_SERVER_TAB_PROPERTY));
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    // Fill in the parameters form each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER_FORWARD, paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale,
-      ConfigParams parameters, String tabName) throws ManifoldCFException, IOException {
-
-    // Call the Velocity tempaltes for each tab
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_FORWARD_SERVER, paramMap, true);
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext thredContext, IPostParameters variableContext,
-      ConfigParams parameters) {
-
-    String nuxeoProtocol = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PROTOCOL);
-    if (nuxeoProtocol != null)
-      parameters.setParameter(NuxeoConfiguration.Server.PROTOCOL, nuxeoProtocol);
-
-    String nuxeoHost = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.HOST);
-    if (nuxeoHost != null)
-      parameters.setParameter(NuxeoConfiguration.Server.HOST, nuxeoHost);
-
-    String nuxeoPort = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PORT);
-    if (nuxeoPort != null)
-      parameters.setParameter(NuxeoConfiguration.Server.PORT, nuxeoPort);
-
-    String nuxeoPath = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PATH);
-    if (nuxeoPath != null)
-      parameters.setParameter(NuxeoConfiguration.Server.PATH, nuxeoPath);
-
-    String nuxeoUsername = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.USERNAME);
-    if (nuxeoUsername != null)
-      parameters.setParameter(NuxeoConfiguration.Server.USERNAME, nuxeoUsername);
-
-    String nuxeoPassword = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PASSWORD);
-    if (nuxeoPassword != null)
-      parameters.setObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD,
-          variableContext.mapKeyToPassword(nuxeoPassword));
-
-    return null; // It returns null if the configuration has been successful
-  }
-
-  /** AUTHORITY **/
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
-    return RESPONSE_UNREACHABLE;
-  }
-
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String username) throws ManifoldCFException {
-    initNuxeoClient();
-    try {
-      List<String> authorities = getGroupsByUser(username);
-      if (authorities == null || authorities.isEmpty()) {
-        return RESPONSE_USERNOTFOUND;
-      } else {
-        return new AuthorizationResponse(authorities.toArray(new String[0]), AuthorizationResponse.RESPONSE_OK);
-      }
-
-    } catch (NuxeoClientException e) {
-      return RESPONSE_UNREACHABLE;
-    }
-  }
-
-  List<String> getGroupsByUser(String username) {
-
-    List<String> authorities = null;
-
-    User user = nuxeoClient.getUserManager().fetchUser(username);
-    if (user != null) {
-      authorities = user.getGroups();
-      authorities.add(user.getUserName());
-    }
-
-    return authorities;
-  }
-}
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/Messages.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/Messages.java
deleted file mode 100755
index ecf8aa4..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/Messages.java
+++ /dev/null
@@ -1,122 +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 org.apache.manifoldcf.crawler.connectors.nuxeo;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages {
-
-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.crawler.connectors.nuxeo.common";
-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.nuxeo";
-
-  /** Constructor - do no instantiate
-   * @
-    */
-  protected Messages()
-  {
-  }
-
-  public static String getString(Locale locale, String messageKey) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args) {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args) {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be
-  // specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey,
-      Object[] args) {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args) {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String, String> substitutionParameters, boolean mapToUpperCase) throws ManifoldCFException {
-    outputResource(output, Messages.class, DEFAULT_PATH_NAME, locale, resourceKey, substitutionParameters,
-        mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String, String> substitutionParameters, boolean mapToUpperCase) throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        substitutionParameters, mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-      Map<String, Object> contextObjects) throws ManifoldCFException {
-    outputResourceWithVelocity(output, Messages.class, DEFAULT_BUNDLE_NAME, DEFAULT_PATH_NAME, locale, resourceKey,
-        contextObjects);
-  }
-
-}
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoConfiguration.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoConfiguration.java
deleted file mode 100755
index 37cc9de..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoConfiguration.java
+++ /dev/null
@@ -1,62 +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 org.apache.manifoldcf.crawler.connectors.nuxeo;
-
-/**
- * 
- * NuxeoConfiguration class
- * 
- * Class to keep the server configuration and specification paramenters.
- * 
- * @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
- *
- */
-public class NuxeoConfiguration {
-
-  public static interface Server {
-
-    public static final String USERNAME = "username";
-    public static final String PASSWORD = "password";
-    public static final String PROTOCOL = "protocol";
-    public static final String HOST = "host";
-    public static final String PORT = "port";
-    public static final String PATH = "path";
-
-    public static final String PROTOCOL_DEFAULT_VALUE = "http";
-    public static final String HOST_DEFAULT_VALUE = "";
-    public static final String PORT_DEFAULT_VALUE = "8080";
-    public static final String PATH_DEFAULT_VALUE = "/nuxeo";
-    public static final String USERNAME_DEFAULT_VALUE = "";
-    public static final String PASSWORD_DEFAULT_VALUE = "";
-
-  }
-
-  public static interface Specification {
-
-    public static final String DOMAINS = "domains";
-    public static final String DOMAIN = "domain";
-    public static final String DOMAIN_KEY = "key";
-    public static final String DOCUMENTS = "documents";
-    public static final String PROCESS_TAGS = "process_tags";
-    public static final String PROCESS_ATTACHMENTS = "process_attachments";
-    public static final String DOCUMENTS_TYPE = "documentsType";
-    public static final String DOCUMENT_TYPE = "documentType";
-    public static final String DOCUMENT_TYPE_KEY = "key";
-
-  }
-}
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoRepositoryConnector.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoRepositoryConnector.java
deleted file mode 100755
index e85336a..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoRepositoryConnector.java
+++ /dev/null
@@ -1,917 +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 org.apache.manifoldcf.crawler.connectors.nuxeo;
-
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TimeZone;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.connectors.nuxeo.model.Attachment;
-import org.apache.manifoldcf.crawler.connectors.nuxeo.model.DocumentManifold;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.interfaces.IRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.nuxeo.client.api.NuxeoClient;
-import org.nuxeo.client.api.objects.Document;
-import org.nuxeo.client.api.objects.Documents;
-import org.nuxeo.client.internals.spi.NuxeoClientException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * 
- * Nuxeo Repository Connector class
- * 
- * @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
- *
- */
-public class NuxeoRepositoryConnector extends BaseRepositoryConnector {
-
-  private static final String URI_DOCUMENT = "SELECT * FROM Document";
-
-  protected final static String ACTIVITY_READ = "read document";
-
-  // Configuration tabs
-  private static final String NUXEO_SERVER_TAB_PROPERTY = "NuxeoRepositoryConnector.Server";
-
-  // Specification tabs
-  private static final String CONF_DOMAINS_TAB_PROPERTY = "NuxeoRepositoryConnector.Domains";
-  private static final String CONF_DOCUMENTS_TYPE_TAB_PROPERTY = "NuxeoRepositoryConnector.DocumentsType";
-  private static final String CONF_DOCUMENT_PROPERTY = "NuxeoRepositoryConnector.Documents";
-
-  // Prefix for nuxeo configuration and specification parameters
-  private static final String PARAMETER_PREFIX = "nuxeo_";
-
-  // Templates for Nuxeo configuration
-  /**
-   * Javascript to check the configuration parameters
-   */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_conf.js";
-
-  /**
-   * Server edit tab template
-   */
-  private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_conf_server.html";
-
-  /**
-   * Server view tab template
-   */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_conf.html";
-
-  // Templates for Nuxeo specification
-  /**
-   * Forward to the javascript to check the specification parameters for the
-   * job
-   */
-  private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification_conf.js";
-
-  /**
-   * Forward to the template to edit domains for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_CONF_DOMAINS = "editSpecification_confDomains.html";
-
-  /**
-   * Forward to the template to edit documents type for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_CONF_DOCUMENTS_TYPE = "editSpecification_confDocumentsType.html";
-
-  /**
-   * Forward to the template to edit document properties for the job
-   */
-  private static final String EDIT_SPEC_FORWARD_CONF_DOCUMENTS = "editSpecification_confDocuments.html";
-
-  /**
-   * Forward to the template to view the specification parameters for the job
-   */
-  private static final String VIEW_SPEC_FORWARD = "viewSpecification_conf.html";
-
-  protected long lastSessionFetch = -1L;
-  protected static final long timeToRelease = 300000L;
-
-  private Logger logger = LoggerFactory.getLogger(NuxeoRepositoryConnector.class);
-
-  /* Nuxeo instance parameters */
-  protected String protocol = null;
-  protected String host = null;
-  protected String port = null;
-  protected String path = null;
-  protected String username = null;
-  protected String password = null;
-
-  protected NuxeoClient nuxeoClient = null;
-
-  // Constructor
-  public NuxeoRepositoryConnector() {
-    super();
-  }
-
-  void setNuxeoClient(NuxeoClient nuxeoClient) {
-    this.nuxeoClient = nuxeoClient;
-  }
-
-  @Override
-  public String[] getActivitiesList() {
-    return new String[] { ACTIVITY_READ };
-  }
-
-  @Override
-  public String[] getBinNames(String documentIdenfitier) {
-    return new String[] { host };
-  }
-
-  /** CONFIGURATION CONNECTOR **/
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale,
-      ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException {
-
-    // Server tab
-    tabsArray.add(Messages.getString(locale, NUXEO_SERVER_TAB_PROPERTY));
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    // Fill in the parameters form each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER_FORWARD, paramMap, true);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale,
-      ConfigParams parameters, String tabName) throws ManifoldCFException, IOException {
-
-    // Call the Velocity tempaltes for each tab
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Server tab
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_FORWARD_SERVER, paramMap, true);
-
-  }
-
-  private static void fillInServerConfigurationMap(Map<String, String> serverMap, IPasswordMapperActivity mapper,
-      ConfigParams parameters) {
-
-    String nuxeoProtocol = parameters.getParameter(NuxeoConfiguration.Server.PROTOCOL);
-    String nuxeoHost = parameters.getParameter(NuxeoConfiguration.Server.HOST);
-    String nuxeoPort = parameters.getParameter(NuxeoConfiguration.Server.PORT);
-    String nuxeoPath = parameters.getParameter(NuxeoConfiguration.Server.PATH);
-    String nuxeoUsername = parameters.getParameter(NuxeoConfiguration.Server.USERNAME);
-    String nuxeoPassword = parameters.getObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD);
-
-    if (nuxeoProtocol == null)
-      nuxeoProtocol = NuxeoConfiguration.Server.PROTOCOL_DEFAULT_VALUE;
-    if (nuxeoHost == null)
-      nuxeoHost = NuxeoConfiguration.Server.HOST_DEFAULT_VALUE;
-    if (nuxeoPort == null)
-      nuxeoPort = NuxeoConfiguration.Server.PORT_DEFAULT_VALUE;
-    if (nuxeoPath == null)
-      nuxeoPath = NuxeoConfiguration.Server.PATH_DEFAULT_VALUE;
-    if (nuxeoUsername == null)
-      nuxeoUsername = NuxeoConfiguration.Server.USERNAME_DEFAULT_VALUE;
-    if (nuxeoPassword == null)
-      nuxeoPassword = NuxeoConfiguration.Server.PASSWORD_DEFAULT_VALUE;
-    else
-      nuxeoPassword = mapper.mapPasswordToKey(nuxeoPassword);
-
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PROTOCOL, nuxeoProtocol);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.HOST, nuxeoHost);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PORT, nuxeoPort);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PATH, nuxeoPath);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.USERNAME, nuxeoUsername);
-    serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PASSWORD, nuxeoPassword);
-
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext thredContext, IPostParameters variableContext,
-      ConfigParams parameters) {
-
-    String nuxeoProtocol = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PROTOCOL);
-    if (nuxeoProtocol != null)
-      parameters.setParameter(NuxeoConfiguration.Server.PROTOCOL, nuxeoProtocol);
-
-    String nuxeoHost = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.HOST);
-    if (nuxeoHost != null)
-      parameters.setParameter(NuxeoConfiguration.Server.HOST, nuxeoHost);
-
-    String nuxeoPort = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PORT);
-    if (nuxeoPort != null)
-      parameters.setParameter(NuxeoConfiguration.Server.PORT, nuxeoPort);
-
-    String nuxeoPath = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PATH);
-    if (nuxeoPath != null)
-      parameters.setParameter(NuxeoConfiguration.Server.PATH, nuxeoPath);
-
-    String nuxeoUsername = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.USERNAME);
-    if (nuxeoUsername != null)
-      parameters.setParameter(NuxeoConfiguration.Server.USERNAME, nuxeoUsername);
-
-    String nuxeoPassword = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PASSWORD);
-    if (nuxeoPassword != null)
-      parameters.setObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD,
-          variableContext.mapKeyToPassword(nuxeoPassword));
-
-    return null;
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD, paramMap, true);
-  }
-
-  /** CONNECTION **/
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-
-    protocol = params.getParameter(NuxeoConfiguration.Server.PROTOCOL);
-    host = params.getParameter(NuxeoConfiguration.Server.HOST);
-    port = params.getParameter(NuxeoConfiguration.Server.PORT);
-    path = params.getParameter(NuxeoConfiguration.Server.PATH);
-    username = params.getParameter(NuxeoConfiguration.Server.USERNAME);
-    password = params.getObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD);
-
-  }
-
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    shutdownNuxeoClient();
-    protocol = null;
-    host = null;
-    port = null;
-    path = null;
-    username = null;
-    password = null;
-    super.disconnect();
-  }
-  
-  // Check the connection
-  @Override
-  public String check() throws ManifoldCFException {
-    shutdownNuxeoClient();
-    initNuxeoClient();
-    try {
-      nuxeoClient.repository().getDocumentRoot();
-    } catch (NuxeoClientException ex) {
-      return "Connection failed: "+ex.getMessage();
-    }
-
-    return super.check();
-  }
-
-  /**
-   * Initialize Nuxeo client using the configured parameters.
-   * 
-   * @throws ManifoldCFException
-   */
-  private void initNuxeoClient() throws ManifoldCFException {
-    if (nuxeoClient == null) {
-
-      if (StringUtils.isEmpty(protocol)) {
-        throw new ManifoldCFException(
-            "Parameter " + NuxeoConfiguration.Server.PROTOCOL + " required but not set");
-      }
-
-      if (StringUtils.isEmpty(host)) {
-        throw new ManifoldCFException("Parameter " + NuxeoConfiguration.Server.HOST + " required but not set");
-      }
-
-      String url = getUrl();
-      nuxeoClient = new NuxeoClient(url, username, password);
-
-      lastSessionFetch = System.currentTimeMillis();
-
-    }
-
-  }
-
-  /**
-   * Shut down Nuxeo client
-   */
-  private void shutdownNuxeoClient() {
-    if (nuxeoClient != null) {
-      nuxeoClient.shutdown();
-      nuxeoClient = null;
-      lastSessionFetch = -1L;
-    }
-  }
-  
-  /**
-   * Formatter URL
-   * 
-   * @throws ManifoldCFException
-   */
-  String getUrl() throws ManifoldCFException {
-    int portInt;
-    if (port != null && port.length() > 0) {
-      try {
-        portInt = Integer.parseInt(port);
-      } catch (NumberFormatException formatException) {
-        throw new ManifoldCFException("Bad number: " + formatException.getMessage(), formatException);
-      }
-    } else {
-      if (protocol.toLowerCase(Locale.ROOT).equals("http")) {
-        portInt = 80;
-      } else {
-        portInt = 443;
-      }
-    }
-
-    String url = protocol + "://" + host + ":" + portInt + "/" + path;
-
-    return url;
-  }
-
-  @Override
-  public boolean isConnected() {
-    return nuxeoClient != null;
-  }
-
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (lastSessionFetch == -1L) {
-      return;
-    }
-
-    long currentTime = System.currentTimeMillis();
-
-    if (currentTime > lastSessionFetch + timeToRelease) {
-      shutdownNuxeoClient();
-    }
-  }
-
-  /** SEEDING **/
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec, String lastSeedVersion,
-      long seedTime, int jobMode) throws ManifoldCFException, ServiceInterruption {
-
-    initNuxeoClient();
-    try {
-
-      int lastStart = 0;
-      int defaultSize = 50;
-      Boolean isLast = true;
-      NuxeoSpecification ns = NuxeoSpecification.from(spec);
-      List<String> domains = ns.getDomains();
-      List<String> documentsType = ns.getDocumentsType();
-
-      do {
-
-        Documents docs = getDocsByDate(nuxeoClient, lastSeedVersion, domains, documentsType,
-            defaultSize, lastStart);
-
-        for (Document doc : docs.getDocuments()) {
-          activities.addSeedDocument(doc.getUid());
-        }
-
-        lastStart++;
-        isLast = docs.getIsNextPageAvailable();
-
-      } while (isLast);
-
-      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-      sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
-
-      lastSeedVersion = sdf.format(new Date());
-
-      return lastSeedVersion;
-    } catch (NuxeoClientException exception) {
-      throw new ManifoldCFException("Failure during seeding: "+exception.getMessage(), exception);
-      /*
-      exception.printStackTrace();
-      long interruptionRetryTime = 5L * 60L * 1000L;
-      String message = "Server appears down during seeding: " + exception.getMessage();
-      throw new ServiceInterruption(message, exception, System.currentTimeMillis() + interruptionRetryTime, -1L,
-          3, true);
-      */
-    }
-  }
-  
-  /**
-   * 
-   * @param nuxeoClient
-   * @param date
-   * @param domains
-   * @param documentsType
-   * @param limit
-   * @param start
-   * @return Documents
-   */
-  Documents getDocsByDate(NuxeoClient nuxeoClient, String date, List<String> domains,
-      List<String> documentsType, int limit, int start) {
-
-    String query = "";
-
-    if (date == null || date.isEmpty()) {
-      SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
-      date = DATE_FORMAT.format(new Date(0));
-    }
-    query = "dc:modified > '" + date + "'";
-
-    if (!domains.isEmpty()) {
-      Iterator<String> itdom = domains.iterator();
-
-      query = String.format(" %s AND ( ecm:path STARTSWITH '/%s'", query, itdom.next());
-
-      while (itdom.hasNext()) {
-        query = String.format("%s OR ecm:path STARTSWITH '/%s'", query, itdom.next());
-      }
-
-      query = String.format("%s )", query);
-    }
-
-    if (!documentsType.isEmpty()) {
-      Iterator<String> itDocTy = documentsType.iterator();
-
-      query = String.format(" %s AND ( ecm:primaryType = '%s'", query, itDocTy.next());
-
-      while (itDocTy.hasNext()) {
-        query = String.format("%s OR ecm:primaryType = '%s'", query, itDocTy.next());
-      }
-
-      query = String.format("%s )", query);
-    }
-
-    query = String.format(URI_DOCUMENT + " where %s ", query);
-
-    nuxeoClient.header("X-NXDocumentProperties", "*");
-    Documents docs = nuxeoClient.repository().query(query, String.valueOf(limit), String.valueOf(start), null, null,
-        null, null);
-
-    return docs;
-  }
-
-  /** PROCESS DOCUMENTS **/
-
-  @Override
-  public void processDocuments(String[] documentsIdentifieres, IExistingVersions statuses, Specification spec,
-      IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-      throws ManifoldCFException, ServiceInterruption {
-
-    initNuxeoClient();
-        
-    for (int i = 0; i < documentsIdentifieres.length; i++) {
-
-      String documentId = documentsIdentifieres[i];
-      String version = statuses.getIndexedVersionString(documentId);
-
-      long startTime = System.currentTimeMillis();
-      ProcessResult pResult = null;
-      boolean doLog = true;
-
-      try {
-
-        pResult = processDocument(documentId, spec, version, activities, doLog,
-            Maps.<String, String> newHashMap());
-      } catch (NuxeoClientException exception) {
-        throw new ManifoldCFException("Client exception: "+exception.getMessage(), exception);
-      } catch (IOException exception) {
-        long interruptionRetryTime = 5L * 60L * 1000L;
-        String message = "Server appears down during seeding: " + exception.getMessage();
-        throw new ServiceInterruption(message, exception, System.currentTimeMillis() + interruptionRetryTime,
-            -1L, 3, true);
-      } finally {
-        if (doLog)
-          if (pResult != null && pResult.errorCode != null && !pResult.errorCode.isEmpty())
-            activities.recordActivity(new Long(startTime), ACTIVITY_READ, pResult.fileSize, documentId,
-                pResult.errorCode, pResult.errorDecription, null);
-      }
-
-    }
-  }
-
-  /**
-   * @param documentId
-   * @param version
-   * @param activities
-   * @param doLog
-   * @param newHashMap
-   * @return
-   */
-
-  private ProcessResult processDocument(String documentId, Specification spec, String version,
-      IProcessActivity activities, boolean doLog, HashMap<String, String> extraProperties)
-      throws ManifoldCFException, ServiceInterruption, IOException {
-
-    DocumentManifold doc = new DocumentManifold(nuxeoClient.repository().fetchDocumentById(documentId));
-
-    return processDocumentInternal(doc, documentId, spec, version, activities, doLog, extraProperties);
-  }
-
-  /**
-   * @param doc
-   * @param documentId
-   * @param version
-   * @param activities
-   * @param doLog
-   * @param extraProperties
-   * @return
-   */
-
-  private ProcessResult processDocumentInternal(DocumentManifold doc, String manifoldDocumentIdentifier,
-      Specification spec, String version, IProcessActivity activities, boolean doLog,
-      HashMap<String, String> extraProperties) throws ManifoldCFException, ServiceInterruption, IOException {
-
-    RepositoryDocument rd = new RepositoryDocument();
-    NuxeoSpecification ns = NuxeoSpecification.from(spec);
-
-    String lastModified = doc.getDocument().getLastModified();
-    Date lastModifiedDate = null;
-
-    if (lastModified != null) {
-      DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
-      try {
-        lastModifiedDate = formatter.parse(lastModified);
-      } catch (Exception ex) {
-        lastModifiedDate = new Date(0);
-      }
-    }
-
-    int lenght = doc.getLenght();
-    if (doc.getDocument().getState() != null
-        && doc.getDocument().getState().equalsIgnoreCase(DocumentManifold.DELETED)) {
-      activities.deleteDocument(manifoldDocumentIdentifier);
-      return new ProcessResult(lenght, "DELETED", "");
-    }
-
-    if (!activities.checkDocumentNeedsReindexing(manifoldDocumentIdentifier, lastModified)) {
-      return new ProcessResult(lenght, "RETAINED", "");
-    }
-
-    if (doc.getDocument().getUid() == null) {
-      activities.deleteDocument(manifoldDocumentIdentifier);
-      return new ProcessResult(lenght, "DELETED", "");
-    }
-
-    // Add respository document information
-    rd.setMimeType(doc.getMimeType());
-    rd.setModifiedDate(lastModifiedDate);
-    rd.setIndexingDate(new Date());
-
-    // Adding Document metadata
-    Map<String, Object> docMetadata = doc.getMetadata();
-
-    for (Entry<String, Object> entry : docMetadata.entrySet()) {
-      if (entry.getValue() instanceof List) {
-        List<?> list = (List<?>) entry.getValue();
-        rd.addField(entry.getKey(), list.toArray(new String[list.size()]));
-      } else {
-        rd.addField(entry.getKey(), entry.getValue().toString());
-      }
-    }
-
-    if (ns.isProcessTags())
-      rd.addField("Tags", doc.getTags(nuxeoClient));
-
-    String documentUri = null;
-    try {
-      documentUri = getUrl() + "/nxpath/" + doc.getDocument().getRepositoryName() + doc.getDocument().getPath()
-          + "@view_documents";
-    } catch (NuxeoClientException ex) {
-      documentUri = doc.getDocument().getUid();
-    }
-
-    // Set repository ACLs
-    String[] permissions = doc.getPermissions(nuxeoClient);
-    rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT, permissions);
-    rd.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT, new String[] { GLOBAL_DENY_TOKEN });
-    rd.setBinary(doc.getContent(), lenght);
-
-    // Action
-    activities.ingestDocumentWithException(manifoldDocumentIdentifier, lastModified, documentUri, rd);
-
-    if (ns.isProcessAttachments()) {
-      for (Attachment att : doc.getAttachments(nuxeoClient)) {
-        RepositoryDocument att_rd = new RepositoryDocument();
-        String attDocumentUri = att.getUrl();
-
-        att_rd.setMimeType(att.getMime_type());
-        att_rd.setBinary(att.getData(), att.getLength());
-
-        if (lastModified != null)
-          att_rd.setModifiedDate(lastModifiedDate);
-        att_rd.setIndexingDate(new Date());
-
-        att_rd.addField(Attachment.ATT_KEY_NAME, att.getName());
-        att_rd.addField(Attachment.ATT_KEY_LENGTH, String.valueOf(att.getLength()));
-        att_rd.addField(Attachment.ATT_KEY_DIGEST, att.getDigest());
-        att_rd.addField(Attachment.ATT_KEY_DIGEST_ALGORITHM, att.getDigestAlgorithm());
-        att_rd.addField(Attachment.ATT_KEY_ENCODING, att.getEncoding());
-        // Set repository ACLs
-        att_rd.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT, permissions);
-        att_rd.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,
-            new String[] { GLOBAL_DENY_TOKEN });
-
-        activities.ingestDocumentWithException(manifoldDocumentIdentifier, attDocumentUri, lastModified,
-            attDocumentUri, att_rd);
-      }
-    }
-
-    return new ProcessResult(lenght, "OK", StringUtils.EMPTY);
-  }
-
-  private class ProcessResult {
-    private long fileSize;
-    private String errorCode;
-    private String errorDecription;
-
-    private ProcessResult(long fileSize, String errorCode, String errorDescription) {
-      this.fileSize = fileSize;
-      this.errorCode = errorCode;
-      this.errorDecription = errorDescription;
-    }
-
-  }
-
-  @Override
-  public int getConnectorModel() {
-    return IRepositoryConnector.MODEL_ADD_CHANGE_DELETE;
-  }
-
-  /** Specifications **/
-
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification spec, int connectionSequenceNumber)
-      throws ManifoldCFException, IOException {
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    NuxeoSpecification ns = NuxeoSpecification.from(spec);
-
-    paramMap.put(NuxeoConfiguration.Specification.DOMAINS.toUpperCase(), ns.getDomains());
-    paramMap.put(NuxeoConfiguration.Specification.DOCUMENTS_TYPE.toUpperCase(), ns.documentsType);
-    paramMap.put(NuxeoConfiguration.Specification.PROCESS_TAGS.toUpperCase(), ns.isProcessTags().toString());
-    paramMap.put(NuxeoConfiguration.Specification.PROCESS_ATTACHMENTS.toUpperCase(),
-        ns.isProcessAttachments().toString());
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_SPEC_FORWARD, paramMap);
-  }
-
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-      int connectionSequenceNumber) throws ManifoldCFException {
-
-    String seqPrefix = "s" + connectionSequenceNumber + "_";
-
-    // DOMAINS
-    String xc = variableContext.getParameter(seqPrefix + "domainscount");
-
-    if (xc != null) {
-      // Delete all preconfigured domains
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(NuxeoConfiguration.Specification.DOMAINS)) {
-          ds.removeChild(i);
-        } else {
-          i++;
-        }
-      }
-
-      SpecificationNode domains = new SpecificationNode(NuxeoConfiguration.Specification.DOMAINS);
-      ds.addChild(ds.getChildCount(), domains);
-      int domainsCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < domainsCount) {
-        String domainDescription = "_" + Integer.toString(i);
-        String domainOpName = seqPrefix + "domainop" + domainDescription;
-        xc = variableContext.getParameter(domainOpName);
-        if (xc != null && xc.equals("Delete")) {
-          i++;
-          continue;
-        }
-
-        String domainKey = variableContext.getParameter(seqPrefix + "domain" + domainDescription);
-        SpecificationNode node = new SpecificationNode(NuxeoConfiguration.Specification.DOMAIN);
-        node.setAttribute(NuxeoConfiguration.Specification.DOMAIN_KEY, domainKey);
-        domains.addChild(domains.getChildCount(), node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix + "domainop");
-      if (op != null && op.equals("Add")) {
-        String domainSpec = variableContext.getParameter(seqPrefix + "domain");
-        SpecificationNode node = new SpecificationNode(NuxeoConfiguration.Specification.DOMAIN);
-        node.setAttribute(NuxeoConfiguration.Specification.DOMAIN_KEY, domainSpec);
-        domains.addChild(domains.getChildCount(), node);
-      }
-    }
-
-    // TYPE OF DOCUMENTS
-    String xt = variableContext.getParameter(seqPrefix + "documentsTypecount");
-
-    if (xt != null) {
-      // Delete all preconfigured type of documents
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(NuxeoConfiguration.Specification.DOCUMENTS_TYPE)) {
-          ds.removeChild(i);
-        } else {
-          i++;
-        }
-      }
-
-      SpecificationNode documentsType = new SpecificationNode(NuxeoConfiguration.Specification.DOCUMENTS_TYPE);
-      ds.addChild(ds.getChildCount(), documentsType);
-      int documentsTypeCount = Integer.parseInt(xt);
-      i = 0;
-      while (i < documentsTypeCount) {
-        String documentTypeDescription = "_" + Integer.toString(i);
-        String documentTypeOpName = seqPrefix + "documentTypeop" + documentTypeDescription;
-        xt = variableContext.getParameter(documentTypeOpName);
-        if (xt != null && xt.equals("Delete")) {
-          i++;
-          continue;
-        }
-
-        String documentTypeKey = variableContext
-            .getParameter(seqPrefix + "documentType" + documentTypeDescription);
-        SpecificationNode node = new SpecificationNode(NuxeoConfiguration.Specification.DOCUMENT_TYPE);
-        node.setAttribute(NuxeoConfiguration.Specification.DOCUMENT_TYPE_KEY, documentTypeKey);
-        documentsType.addChild(documentsType.getChildCount(), node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix + "documentTypeop");
-      if (op != null && op.equals("Add")) {
-        String documentTypeSpec = variableContext.getParameter(seqPrefix + "documentType");
-        SpecificationNode node = new SpecificationNode(NuxeoConfiguration.Specification.DOCUMENT_TYPE);
-        node.setAttribute(NuxeoConfiguration.Specification.DOCUMENT_TYPE_KEY, documentTypeSpec);
-        documentsType.addChild(documentsType.getChildCount(), node);
-      }
-
-    }
-
-    // TAGS
-    SpecificationNode documents = new SpecificationNode(NuxeoConfiguration.Specification.DOCUMENTS);
-    ds.addChild(ds.getChildCount(), documents);
-
-    String processTags = variableContext.getParameter(seqPrefix + NuxeoConfiguration.Specification.PROCESS_TAGS);
-    String processAttachments = variableContext
-        .getParameter(seqPrefix + NuxeoConfiguration.Specification.PROCESS_ATTACHMENTS);
-
-    if (processTags != null && !processTags.isEmpty()) {
-      documents.setAttribute(NuxeoConfiguration.Specification.PROCESS_TAGS, String.valueOf(processTags));
-    }
-    if (processAttachments != null && !processAttachments.isEmpty()) {
-      documents.setAttribute(NuxeoConfiguration.Specification.PROCESS_ATTACHMENTS,
-          String.valueOf(processAttachments));
-    }
-
-    return null;
-  }
-
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification spec,
-      int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-      throws ManifoldCFException, IOException {
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    NuxeoSpecification ns = NuxeoSpecification.from(spec);
-
-    paramMap.put(NuxeoConfiguration.Specification.DOMAINS.toUpperCase(), ns.getDomains());
-    paramMap.put(NuxeoConfiguration.Specification.DOCUMENTS_TYPE.toUpperCase(), ns.getDocumentsType());
-    paramMap.put(NuxeoConfiguration.Specification.PROCESS_TAGS.toUpperCase(), ns.isProcessTags());
-    paramMap.put(NuxeoConfiguration.Specification.PROCESS_ATTACHMENTS.toUpperCase(), ns.isProcessAttachments());
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPEC_FORWARD_CONF_DOMAINS, paramMap);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPEC_FORWARD_CONF_DOCUMENTS_TYPE, paramMap);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPEC_FORWARD_CONF_DOCUMENTS, paramMap);
-
-  }
-
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification spec,
-      int connectionSequenceNumber, List<String> tabsArray) throws ManifoldCFException, IOException {
-
-    tabsArray.add(Messages.getString(locale, CONF_DOMAINS_TAB_PROPERTY));
-    tabsArray.add(Messages.getString(locale, CONF_DOCUMENTS_TYPE_TAB_PROPERTY));
-    tabsArray.add(Messages.getString(locale, CONF_DOCUMENT_PROPERTY));
-
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPEC_HEADER_FORWARD, paramMap);
-  }
-
-  static class NuxeoSpecification {
-
-    private List<String> domains;
-    private List<String> documentsType;
-    private Boolean processTags = false;
-    private Boolean processAttahcments = false;
-
-    public List<String> getDomains() {
-      return this.domains;
-    }
-
-    public List<String> getDocumentsType() {
-      return this.documentsType;
-    }
-
-    public Boolean isProcessTags() {
-      return this.processTags;
-    }
-
-    public Boolean isProcessAttachments() {
-      return this.processAttahcments;
-    }
-
-    /**
-     * @param spec
-     * @return
-     */
-    public static NuxeoSpecification from(Specification spec) {
-      NuxeoSpecification ns = new NuxeoSpecification();
-
-      ns.domains = Lists.newArrayList();
-      ns.documentsType = Lists.newArrayList();
-
-      for (int i = 0, len = spec.getChildCount(); i < len; i++) {
-        SpecificationNode sn = spec.getChild(i);
-
-        if (sn.getType().equals(NuxeoConfiguration.Specification.DOMAINS)) {
-          for (int j = 0, sLen = sn.getChildCount(); j < sLen; j++) {
-            SpecificationNode spectNode = sn.getChild(j);
-            if (spectNode.getType().equals(NuxeoConfiguration.Specification.DOMAIN)) {
-              ns.domains.add(spectNode.getAttributeValue(NuxeoConfiguration.Specification.DOMAIN_KEY));
-            }
-          }
-        } else if (sn.getType().equals(NuxeoConfiguration.Specification.DOCUMENTS_TYPE)) {
-          for (int j = 0, sLen = sn.getChildCount(); j < sLen; j++) {
-            SpecificationNode spectNode = sn.getChild(j);
-            if (spectNode.getType().equals(NuxeoConfiguration.Specification.DOCUMENT_TYPE)) {
-              ns.documentsType.add(
-                  spectNode.getAttributeValue(NuxeoConfiguration.Specification.DOCUMENT_TYPE_KEY));
-            }
-          }
-        } else if (sn.getType().equals(NuxeoConfiguration.Specification.DOCUMENTS)) {
-          String procTags = sn.getAttributeValue(NuxeoConfiguration.Specification.PROCESS_TAGS);
-          ns.processTags = Boolean.valueOf(procTags);
-          String procAtt = sn.getAttributeValue(NuxeoConfiguration.Specification.PROCESS_ATTACHMENTS);
-          ns.processAttahcments = Boolean.valueOf(procAtt);
-        }
-      }
-
-      return ns;
-    }
-
-  }
-}
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/exception/NuxeoException.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/exception/NuxeoException.java
deleted file mode 100755
index db3fe37..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/exception/NuxeoException.java
+++ /dev/null
@@ -1,34 +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 org.apache.manifoldcf.crawler.connectors.nuxeo.exception;
-
-public class NuxeoException extends Exception {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = -7504820888917970500L;
-
-  public NuxeoException(String message) {
-    super(message);
-  }
-
-  public NuxeoException(String message, Throwable throwable) {
-    super(message, throwable);
-  }
-}
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/model/Attachment.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/model/Attachment.java
deleted file mode 100755
index ae3c322..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/model/Attachment.java
+++ /dev/null
@@ -1,82 +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 org.apache.manifoldcf.crawler.connectors.nuxeo.model;
-
-import java.io.InputStream;
-
-/**
- * @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
- *
- */
-public class Attachment{
-
-  public static final String ATT_KEY_FILES = "files:files";
-  public static final String ATT_KEY_FILE = "file";
-  
-  public static final String ATT_KEY_NAME = "name";
-  public static final String ATT_KEY_MIME_TYPE = "mime-type";
-  public static final String ATT_KEY_ENCODING = "encoding";
-  public static final String ATT_KEY_DIGEST = "digest";
-  public static final String ATT_KEY_DIGEST_ALGORITHM = "digestAlgorithm";
-  public static final String ATT_KEY_URL = "data";
-  public static final String ATT_KEY_LENGTH = "length";
-  
-  //Properties
-  protected String name;
-  protected String mime_type;
-  protected String url;
-  protected String encoding;
-  protected String digest;
-  protected String digestAlgorithm;
-  protected long length;
-  protected InputStream data;
-  
-  //Getters
-  public String getName() {
-    return name;
-  }
-
-  public String getMime_type() {
-    return mime_type;
-  }
-
-  public String getUrl() {
-    return url;
-  }
-  
-  public long getLength() {
-    return length;
-  }
-
-  public String getEncoding() {
-    return encoding;
-  }
-
-  public String getDigest() {
-    return digest;
-  }
-
-  public String getDigestAlgorithm() {
-    return digestAlgorithm;
-  }
-
-  public InputStream getData() {
-    return data;
-  }
-
-}
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/model/DocumentManifold.java b/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/model/DocumentManifold.java
deleted file mode 100755
index 919f9e5..0000000
--- a/connectors/nuxeo/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/nuxeo/model/DocumentManifold.java
+++ /dev/null
@@ -1,206 +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 org.apache.manifoldcf.crawler.connectors.nuxeo.model;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.nuxeo.client.api.NuxeoClient;
-import org.nuxeo.client.api.objects.Document;
-import org.nuxeo.client.api.objects.Documents;
-import org.nuxeo.client.api.objects.Operation;
-import org.nuxeo.client.api.objects.acl.ACE;
-import org.nuxeo.client.api.objects.acl.ACL;
-import org.nuxeo.client.api.objects.blob.Blob;
-
-import com.google.common.collect.Maps;
-
-public class DocumentManifold {
-
-  private static final String URI_TAGGING = "SELECT * FROM Tagging";
-
-  private static final String DEFAULT_MIMETYPE = "text/html; charset=utf-8";
-  private static final String[] avoid_properties = { "file:filename", "file:content", "files:files" };
-
-  public Document document;
-  public InputStream content;
-  protected String mimetype;
-
-  public static final String DELETED = "deleted";
-
-  public static final String DOC_UID = "uid";
-  public static final String DOC_ENTITY_TYPE = "entity-type";
-  public static final String DOC_LAST_MODIFIED = "last-modified";
-  public static final String DOC_STATE = "state";
-
-  // Constructor
-  public DocumentManifold(Document document) {
-    this.document = document;
-    processDocument();
-  }
-
-
-  /**
-   * 
-   * 
-   * @return Map<String, Object>
-   */
-  public Map<String, Object> getMetadata() {
-    Map<String, Object> docMetadata = Maps.newHashMap();
-
-    for (Entry<String, Object> property : this.document.getProperties().entrySet()) {
-      if (!Arrays.asList(avoid_properties).contains(property.getKey())) {
-        addIfNotEmpty(docMetadata, property.getKey(), property.getValue());
-      }
-    }
-    addIfNotEmpty(docMetadata, DOC_UID, this.document.getUid());
-    addIfNotEmpty(docMetadata, DOC_ENTITY_TYPE, this.document.getEntityType());
-    addIfNotEmpty(docMetadata, DOC_LAST_MODIFIED, this.document.getLastModified());
-    addIfNotEmpty(docMetadata, DOC_STATE, this.document.getState());
-
-    return docMetadata;
-  }
-
-  public void addIfNotEmpty(Map<String, Object> docMetadata, String key, Object obj) {
-    if (obj != null && ((obj instanceof String && !((String) obj).isEmpty()) || !(obj instanceof String))) {
-      docMetadata.put(key, obj);
-    }
-  }
-
-  private void processDocument() {
-
-    // Content
-    InputStream is = null;
-    String mimetype = null;
-    try {
-      is = document.fetchBlob().getStream();
-      this.mimetype = (String) ((LinkedHashMap<?, ?>) this.getDocument().get("file:content")).get("mime-type");
-    } catch (Exception ex) {
-      is = new ByteArrayInputStream("".getBytes());
-      mimetype = DEFAULT_MIMETYPE;
-    }
-    this.content = is;
-    this.mimetype = mimetype;
-  }
-
-  // GETTERS AND SETERS
-  public Document getDocument() {
-    return this.document;
-  }
-
-  public String getMimeType() {
-    return this.mimetype;
-  }
-
-  public int getLenght() {
-    int size;
-    try {
-      size = this.getContent().available();
-    } catch (IOException ex) {
-      size = 0;
-    }
-    return size;
-  }
-
-  public InputStream getContent() {
-    return this.content;
-  }
-
-  public String[] getPermissions(NuxeoClient nuxeoClient) {
-
-    List<String> permissions = new ArrayList<String>();
-    try {
-      for (ACL acl : this.getDocument().fetchPermissions().getAcls()) {
-        for (ACE ace : acl.getAces()) {
-          if (ace.getStatus().equalsIgnoreCase("effective") && ace.getGranted().equalsIgnoreCase("true")) {
-            permissions.add(ace.getUsername());
-          }
-        }
-      }
-
-      return permissions.toArray(new String[permissions.size()]);
-    } catch (Exception e) {
-      return new String[] {};
-    }
-  }
-
-  public List<Attachment> getAttachments(NuxeoClient nuxeoClient) {
-    List<Attachment> attachments = new ArrayList<Attachment>();
-    List<?> arrayList = (List<?>) this.document.get(Attachment.ATT_KEY_FILES);
-
-    for (Object object : arrayList) {
-      Attachment attach = new Attachment();
-      LinkedHashMap<?, ?> file = (LinkedHashMap<?, ?>) ((LinkedHashMap<?, ?>) object)
-          .get(Attachment.ATT_KEY_FILE);
-
-      attach.name = (String) file.get("name");
-      attach.encoding = (String) file.get("encoding");
-      attach.mime_type = (String) file.get("mime-type");
-      attach.digestAlgorithm = (String) file.get("digestAlgorithm");
-      attach.digest = (String) file.get("digest");
-      attach.length = Long.valueOf((String) file.get("length"));
-      attach.url = (String) file.get("data");
-
-      try {
-        Blob blob = nuxeoClient.repository().fetchBlobById(this.document.getUid(), 
-            getAttachPath(attach.url));
-        
-        attach.data = blob.getStream();
-
-      } catch (Exception ex) {
-        attach.data = new ByteArrayInputStream("".getBytes());
-      }
-
-      attachments.add(attach);
-
-    }
-
-    return attachments;
-  }
-
-  public String getAttachPath(String absolutePath) {
-    String[] splitPath = absolutePath.split("/");
-    int size = splitPath.length;
-    String path = String.join("/", splitPath[size - 4], splitPath[size - 3], splitPath[size - 2]);
-
-    return path;
-  }
-
-  public String[] getTags(NuxeoClient nuxeoClient) {
-    try {
-      Operation op = nuxeoClient.automation("Repository.Query").param("query",
-          URI_TAGGING + " where relation:source='" + this.document.getUid() + "'");
-      Documents tags = op.execute();
-      List<String> ls = new ArrayList<String>();
-
-      for (Document tag : tags.getDocuments()) {
-        ls.add(tag.getTitle());
-      }
-      return ls.toArray(new String[tags.size()]);
-    } catch (Exception e) {
-      return new String[] {};
-    }
-  }
-
-}
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_en_US.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_en_US.properties
deleted file mode 100755
index a5b230c..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_en_US.properties
+++ /dev/null
@@ -1,36 +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.
-
-#Tabs
-NuxeoAuthorityConnector.Server = Server
-
-#Properties
-NuxeoAuthorityConnector.Protocol	= Protocol
-NuxeoAuthorityConnector.Host		= Host
-NuxeoAuthorityConnector.Port		= Port
-NuxeoAuthorityConnector.Path		= Path
-NuxeoAuthorityConnector.Username	= Username
-NuxeoAuthorityConnector.Password	= Password
-
-#Errors
-NuxeoAuthorityConnector.HostMustNotBeNull = Nuxeo host must not be null
-NuxeoAuthorityConnector.PasswordMustNotBeNull = Nuxeo password must not be null
-NuxeoAuthorityConnector.HostMustNotIncludeSlash = Nuxeo host must not include a '/' character
-NuxeoAuthorityConnector.PortMustBeAnInteger = Nuxeo port must be an integer
-NuxeoAuthorityConnector.PathMustNotBeNull = Nuxeo path must not be null
-NuxeoAuthorityConnector.PathMustBeginWithASlash = Nuxeo path must begin with '/' character
-
-#Buttons
-NuxeoAuthorityConnector.Add		= Add
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_es_ES.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_es_ES.properties
deleted file mode 100755
index 10e0cc4..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_es_ES.properties
+++ /dev/null
@@ -1,38 +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.
-
-
-#Tabs
-NuxeoAuthorityConnector.Server 	= Servidor
-
-#Properties
-NuxeoAuthorityConnector.Protocol	= Protocolo
-NuxeoAuthorityConnector.Host		= Host
-NuxeoAuthorityConnector.Port		= Puerto
-NuxeoAuthorityConnector.Path		= Ruta
-NuxeoAuthorityConnector.Username	= Nombre de usuario
-NuxeoAuthorityConnector.Password	= Contraseña
-
-#Errors
-NuxeoAuthorityConnector.HostMustNotBeNull = El host de Nuxeo no debe ser nulo
-NuxeoAuthorityConnector.PasswordMustNotBeNull = La contraseña de nuxeo no debe ser nula.
-NuxeoAuthorityConnector.HostMustNotIncludeSlash = El host de Nuxeo no debe incluir el carácter '/'
-NuxeoAuthorityConnector.PortMustBeAnInteger = El puerto de Nuxeo debe ser un entero
-NuxeoAuthorityConnector.PathMustNotBeNull = La ruta de Nuxeo no debe ser nula
-NuxeoAuthorityConnector.PathMustBeginWithASlash = La ruta de Nuxeo debe comenzar por el carácter '/'
-
-#Buttons
-NuxeoAuthorityConnector.Add		= Añadir
-
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_ja_JP.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_ja_JP.properties
deleted file mode 100644
index a5b230c..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_ja_JP.properties
+++ /dev/null
@@ -1,36 +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.
-
-#Tabs
-NuxeoAuthorityConnector.Server = Server
-
-#Properties
-NuxeoAuthorityConnector.Protocol	= Protocol
-NuxeoAuthorityConnector.Host		= Host
-NuxeoAuthorityConnector.Port		= Port
-NuxeoAuthorityConnector.Path		= Path
-NuxeoAuthorityConnector.Username	= Username
-NuxeoAuthorityConnector.Password	= Password
-
-#Errors
-NuxeoAuthorityConnector.HostMustNotBeNull = Nuxeo host must not be null
-NuxeoAuthorityConnector.PasswordMustNotBeNull = Nuxeo password must not be null
-NuxeoAuthorityConnector.HostMustNotIncludeSlash = Nuxeo host must not include a '/' character
-NuxeoAuthorityConnector.PortMustBeAnInteger = Nuxeo port must be an integer
-NuxeoAuthorityConnector.PathMustNotBeNull = Nuxeo path must not be null
-NuxeoAuthorityConnector.PathMustBeginWithASlash = Nuxeo path must begin with '/' character
-
-#Buttons
-NuxeoAuthorityConnector.Add		= Add
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_zh_CN.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_zh_CN.properties
deleted file mode 100644
index a5b230c..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/nuxeo/common_zh_CN.properties
+++ /dev/null
@@ -1,36 +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.
-
-#Tabs
-NuxeoAuthorityConnector.Server = Server
-
-#Properties
-NuxeoAuthorityConnector.Protocol	= Protocol
-NuxeoAuthorityConnector.Host		= Host
-NuxeoAuthorityConnector.Port		= Port
-NuxeoAuthorityConnector.Path		= Path
-NuxeoAuthorityConnector.Username	= Username
-NuxeoAuthorityConnector.Password	= Password
-
-#Errors
-NuxeoAuthorityConnector.HostMustNotBeNull = Nuxeo host must not be null
-NuxeoAuthorityConnector.PasswordMustNotBeNull = Nuxeo password must not be null
-NuxeoAuthorityConnector.HostMustNotIncludeSlash = Nuxeo host must not include a '/' character
-NuxeoAuthorityConnector.PortMustBeAnInteger = Nuxeo port must be an integer
-NuxeoAuthorityConnector.PathMustNotBeNull = Nuxeo path must not be null
-NuxeoAuthorityConnector.PathMustBeginWithASlash = Nuxeo path must begin with '/' character
-
-#Buttons
-NuxeoAuthorityConnector.Add		= Add
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_en_US.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_en_US.properties
deleted file mode 100755
index eba5ee1..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_en_US.properties
+++ /dev/null
@@ -1,57 +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.
-
-#Configuration tabs
-NuxeoRepositoryConnector.Server	= Server
-
-#Specifications tabs
-NuxeoRepositoryConnector.Domains 	=	Domains
-NuxeoRepositoryConnector.DocumentsType = Documents type
-NuxeoRepositoryConnector.Documents = Documents
-
-
-#Properties
-NuxeoRepositoryConnector.Protocol	= Protocol
-NuxeoRepositoryConnector.Host		= Host
-NuxeoRepositoryConnector.Port		= Port
-NuxeoRepositoryConnector.Path		= Path
-NuxeoRepositoryConnector.Username	= Username
-NuxeoRepositoryConnector.Password	= Password
-
-#Errors
-NuxeoRepositoryConnector.HostMustNotBeNull 		 = Nuxeo host must not be null
-NuxeoRepositoryConnector.PasswordMustNotBeNull   = Nuxeo password must not be null
-NuxeoRepositoryConnector.HostMustNotIncludeSlash = Nuxeo host must not include a '/' character
-NuxeoRepositoryConnector.PortMustBeAnInteger 	 = Nuxeo port must be an integer
-NuxeoRepositoryConnector.PathMustNotBeNull 		 = Nuxeo path must not be null
-NuxeoRepositoryConnector.PathMustBeginWithASlash = Nuxeo path must begin with '/' character
-
-#Buttons
-NuxeoRepositoryConnector.Add			=	Add
-NuxeoRepositoryConnector.AddDomain  	=	Add domain
-NuxeoRepositoryConnector.AddDocumentType  	=	Add document type
-NuxeoRepositoryConnector.Delete			=	Delete
-NuxeoRepositoryConnector.DeleteDomain	=	Delete domain
-NuxeoRepositoryConnector.DeleteDocumentType	=	Delete document type
-
-
-NuxeoRepositoryConnector.NoDomainsConfigured	=	No domains configured. All domains will be crawled
-NuxeoRepositoryConnector.TypeInADomain			=	Type in a domain
-
-NuxeoRepositoryConnector.NoDocumentsTypeConfigured	=	No documents type configured. All documents type will be crawled
-NuxeoRepositoryConnector.TypeInADocumentType		=	Type in a document type
-
-NuxeoRepositoryConnector.ProcessTags= Process tags
-NuxeoRepositoryConnector.ProcessAttachments= Process attachments
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_es_ES.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_es_ES.properties
deleted file mode 100755
index e751ac6..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_es_ES.properties
+++ /dev/null
@@ -1,60 +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.
-
-#Configuration tabs
-NuxeoRepositoryConnector.Server 	= Servidor
-NuxeoRepositoryConnector.DocumentsType = Tipos de documentos
-NuxeoRepositoryConnector.Documents = Documentos
-
-
-#Specifications tabs
-NuxeoRepositoryConnector.Domains 	= Dominios
-
-#Properties
-NuxeoRepositoryConnector.Protocol	= Protocolo
-NuxeoRepositoryConnector.Host		= Host
-NuxeoRepositoryConnector.Port		= Puerto
-NuxeoRepositoryConnector.Path		= Ruta
-NuxeoRepositoryConnector.Username	= Nombre de usuario
-NuxeoRepositoryConnector.Password	= Contraseña
-
-#Errors
-NuxeoRepositoryConnector.HostMustNotBeNull 		 = El host de Nuxeo no debe ser nulo
-NuxeoRepositoryConnector.PasswordMustNotBeNull 	 = La contraseña de nuxeo no debe ser nula.
-NuxeoRepositoryConnector.HostMustNotIncludeSlash = El host de Nuxeo no debe incluir el carácter '/'
-NuxeoRepositoryConnector.PortMustBeAnInteger 	 = El puerto de Nuxeo debe ser un entero
-NuxeoRepositoryConnector.PathMustNotBeNull 		 = La ruta de Nuxeo no debe ser nula
-NuxeoRepositoryConnector.PathMustBeginWithASlash = La ruta de Nuxeo debe comenzar por el carácter '/'
-
-#Buttons
-NuxeoRepositoryConnector.Add			=	Añadir
-NuxeoRepositoryConnector.AddDomain  	=	Añadir dominio
-NuxeoRepositoryConnector.AddDocumentType  	=	Añadir tipo de documento
-NuxeoRepositoryConnector.Delete			=	Borrar
-NuxeoRepositoryConnector.DeleteDomain	=	Borrar dominio
-NuxeoRepositoryConnector.DeleteDocumentType	=	Borrar tipo de documento
-
-
-NuxeoRepositoryConnector.NoDomainsConfigured	=	Sin dominios configurados. Todos los dominios se rastrearán.
-NuxeoRepositoryConnector.TypeInADomain			=	Escriba un dominio
-
-NuxeoRepositoryConnector.NoDocumentsTypeConfigured	=	Sin tipo de documentos configurados. Todos los tipos de documentos se rastrearán.
-NuxeoRepositoryConnector.TypeInADocumentType		=	Escriba un tipo de documento
-
-NuxeoRepositoryConnector.ProcessTags= Procesar etiquetas
-NuxeoRepositoryConnector.ProcessAttachments = Procesar archivos adjuntos
-
-
-
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_ja_JP.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_ja_JP.properties
deleted file mode 100644
index eba5ee1..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_ja_JP.properties
+++ /dev/null
@@ -1,57 +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.
-
-#Configuration tabs
-NuxeoRepositoryConnector.Server	= Server
-
-#Specifications tabs
-NuxeoRepositoryConnector.Domains 	=	Domains
-NuxeoRepositoryConnector.DocumentsType = Documents type
-NuxeoRepositoryConnector.Documents = Documents
-
-
-#Properties
-NuxeoRepositoryConnector.Protocol	= Protocol
-NuxeoRepositoryConnector.Host		= Host
-NuxeoRepositoryConnector.Port		= Port
-NuxeoRepositoryConnector.Path		= Path
-NuxeoRepositoryConnector.Username	= Username
-NuxeoRepositoryConnector.Password	= Password
-
-#Errors
-NuxeoRepositoryConnector.HostMustNotBeNull 		 = Nuxeo host must not be null
-NuxeoRepositoryConnector.PasswordMustNotBeNull   = Nuxeo password must not be null
-NuxeoRepositoryConnector.HostMustNotIncludeSlash = Nuxeo host must not include a '/' character
-NuxeoRepositoryConnector.PortMustBeAnInteger 	 = Nuxeo port must be an integer
-NuxeoRepositoryConnector.PathMustNotBeNull 		 = Nuxeo path must not be null
-NuxeoRepositoryConnector.PathMustBeginWithASlash = Nuxeo path must begin with '/' character
-
-#Buttons
-NuxeoRepositoryConnector.Add			=	Add
-NuxeoRepositoryConnector.AddDomain  	=	Add domain
-NuxeoRepositoryConnector.AddDocumentType  	=	Add document type
-NuxeoRepositoryConnector.Delete			=	Delete
-NuxeoRepositoryConnector.DeleteDomain	=	Delete domain
-NuxeoRepositoryConnector.DeleteDocumentType	=	Delete document type
-
-
-NuxeoRepositoryConnector.NoDomainsConfigured	=	No domains configured. All domains will be crawled
-NuxeoRepositoryConnector.TypeInADomain			=	Type in a domain
-
-NuxeoRepositoryConnector.NoDocumentsTypeConfigured	=	No documents type configured. All documents type will be crawled
-NuxeoRepositoryConnector.TypeInADocumentType		=	Type in a document type
-
-NuxeoRepositoryConnector.ProcessTags= Process tags
-NuxeoRepositoryConnector.ProcessAttachments= Process attachments
diff --git a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_zh_CN.properties b/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_zh_CN.properties
deleted file mode 100644
index eba5ee1..0000000
--- a/connectors/nuxeo/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/nuxeo/common_zh_CN.properties
+++ /dev/null
@@ -1,57 +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.
-
-#Configuration tabs
-NuxeoRepositoryConnector.Server	= Server
-
-#Specifications tabs
-NuxeoRepositoryConnector.Domains 	=	Domains
-NuxeoRepositoryConnector.DocumentsType = Documents type
-NuxeoRepositoryConnector.Documents = Documents
-
-
-#Properties
-NuxeoRepositoryConnector.Protocol	= Protocol
-NuxeoRepositoryConnector.Host		= Host
-NuxeoRepositoryConnector.Port		= Port
-NuxeoRepositoryConnector.Path		= Path
-NuxeoRepositoryConnector.Username	= Username
-NuxeoRepositoryConnector.Password	= Password
-
-#Errors
-NuxeoRepositoryConnector.HostMustNotBeNull 		 = Nuxeo host must not be null
-NuxeoRepositoryConnector.PasswordMustNotBeNull   = Nuxeo password must not be null
-NuxeoRepositoryConnector.HostMustNotIncludeSlash = Nuxeo host must not include a '/' character
-NuxeoRepositoryConnector.PortMustBeAnInteger 	 = Nuxeo port must be an integer
-NuxeoRepositoryConnector.PathMustNotBeNull 		 = Nuxeo path must not be null
-NuxeoRepositoryConnector.PathMustBeginWithASlash = Nuxeo path must begin with '/' character
-
-#Buttons
-NuxeoRepositoryConnector.Add			=	Add
-NuxeoRepositoryConnector.AddDomain  	=	Add domain
-NuxeoRepositoryConnector.AddDocumentType  	=	Add document type
-NuxeoRepositoryConnector.Delete			=	Delete
-NuxeoRepositoryConnector.DeleteDomain	=	Delete domain
-NuxeoRepositoryConnector.DeleteDocumentType	=	Delete document type
-
-
-NuxeoRepositoryConnector.NoDomainsConfigured	=	No domains configured. All domains will be crawled
-NuxeoRepositoryConnector.TypeInADomain			=	Type in a domain
-
-NuxeoRepositoryConnector.NoDocumentsTypeConfigured	=	No documents type configured. All documents type will be crawled
-NuxeoRepositoryConnector.TypeInADocumentType		=	Type in a document type
-
-NuxeoRepositoryConnector.ProcessTags= Process tags
-NuxeoRepositoryConnector.ProcessAttachments= Process attachments
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/editConfiguration_conf.js b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/editConfiguration_conf.js
deleted file mode 100755
index 6d7764c..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/editConfiguration_conf.js
+++ /dev/null
@@ -1,102 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.nuxeo_port.value != "" && !isInteger(editconnection.nuxeo_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.PortMustBeAnInteger'))");
-    editconnection.nuxeo_port.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_host.value != "" && editconnection.nuxeo_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.HostMustNotIncludeSlash'))");
-    editconnection.nuxeo_host.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_path.value != "" &&
-    !(editconnection.nuxeo_path.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.PathMustBeginWithASlash'))");
-    editconnection.nuxeo_path.focus();
-    return false;
-  }
-
-  return true;
-}
- 
-function checkConfigForSave()
-{
-    
-  if (editconnection.nuxeo_host.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.HostMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Server'))");
-    editconnection.nuxeo_host.focus();
-    return false;
-  }
-  
-  if (editconnection.nuxeo_host.value != "" && editconnection.nuxeo_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.HostMustNotIncludeSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Server'))");
-    editconnection.nuxeo_host.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_port.value != "" && !isInteger(editconnection.nuxeo_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.PortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Server'))");
-    editconnection.nuxeo_port.focus();
-    return false;
-  }
-  
-  if (editconnection.nuxeo_username.value != "" && editconnection.nuxeo_password.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.PasswordMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Server'))");
-    editconnection.nuxeo_password.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_path.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.PathMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Server'))");
-    editconnection.nuxeo_path.focus();
-    return false;
-  }
-  
-  if (editconnection.nuxeo_path.value != "" &&
-    !(editconnection.nuxeo_path.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.PathMustBeginWithASlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Server'))");
-    editconnection.nuxeo_path.focus();
-    return false;
-  }
-  
-  return true;
-}
-// -->
-</script>
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/editConfiguration_conf_server.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/editConfiguration_conf_server.html
deleted file mode 100755
index f8ef713..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/editConfiguration_conf_server.html
+++ /dev/null
@@ -1,98 +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.
--->
-
-#if($TABNAME ==
-$ResourceBundle.getString('NuxeoAuthorityConnector.Server'))
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Protocol'))</nobr>
-    </td>
-    <td class="value">
-      <select size="2" name="nuxeo_protocol">
-        #if($NUXEO_PROTOCOL == 'https')
-          <option value="http">http</option>
-          <option value="https" selected>https</option>
-        #else
-          <option value="http" selected>http</option>
-          <option value="https" >https</option>
-        #end 
-      </select>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Host'))</nobr>
-    </td>
-    <td class="value"><input size="32" type="text" id="nuxeo_host"
-      name="nuxeo_host" value="$Encoder.attributeEscape($NUXEO_HOST)" /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Port'))</nobr>
-    </td>
-    <td class="value"><input size="5" type="text" id="nuxeo_port"
-      name="nuxeo_port" value="$Encoder.attributeEscape($NUXEO_PORT)" /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Path'))</nobr>
-    </td>
-    <td class="value"><input size="32" type="text" id="nuxeo_path"
-      name="nuxeo_path" value="$Encoder.attributeEscape($NUXEO_PATH)" /></td>
-  </tr>
-
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Username'))</nobr>
-    </td>
-    <td class="value"><input size="16" type="text"
-      id="nuxeo_username" name="nuxeo_username"
-      value="$Encoder.attributeEscape($NUXEO_USERNAME)" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Password'))</nobr>
-    </td>
-    <td class="value"><input size="16" type="password"
-      id="nuxeo_password" name="nuxeo_password"
-      value="$Encoder.attributeEscape($NUXEO_PASSWORD)" /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="nuxeo_protocol"
-  value="$Encoder.attributeEscape($NUXEO_PROTOCOL)" />
-<input type="hidden" name="nuxeo_host"
-  value="$Encoder.attributeEscape($NUXEO_HOST)" />
-<input type="hidden" name="nuxeo_port"
-  value="$Encoder.attributeEscape($NUXEO_PORT)" />
-<input type="hidden" name="nuxeo_path"
-  value="$Encoder.attributeEscape($NUXEO_PATH)" />
-<input type="hidden" name="nuxeo_username"
-  value="$Encoder.attributeEscape($NUXEO_USERNAME)" />
-<input type="hidden" name="nuxeo_password"
-  value="$Encoder.attributeEscape($NUXEO_PASSWORD)" />
-
-#end
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/viewConfiguration_conf.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/viewConfiguration_conf.html
deleted file mode 100755
index b5f9676..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/nuxeo/viewConfiguration_conf.html
+++ /dev/null
@@ -1,48 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Protocol'))</nobr>
-    </td>
-    <td class="value"><nobr>$Encoder.bodyEscape($NUXEO_PROTOCOL)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Host'))</nobr>
-    </td>
-    <td class="value"><nobr>$Encoder.bodyEscape($NUXEO_HOST)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Port'))</nobr>
-    </td>
-    <td class="value"><nobr>$Encoder.bodyEscape($NUXEO_PORT)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Path'))</nobr>
-    </td>
-    <td class="value"><nobr>$Encoder.bodyEscape($NUXEO_PATH)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Username'))</nobr>
-    </td>
-    <td class="value"><nobr>$Encoder.bodyEscape($NUXEO_USERNAME)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoAuthorityConnector.Password'))</nobr>
-    </td>
-    <td class="value"><nobr>*****</nobr></td>
-</table>
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editConfiguration_conf.js b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editConfiguration_conf.js
deleted file mode 100755
index 882a20e..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editConfiguration_conf.js
+++ /dev/null
@@ -1,102 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.nuxeo_port.value != "" && !isInteger(editconnection.nuxeo_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.PortMustBeAnInteger'))");
-    editconnection.nuxeo_port.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_host.value != "" && editconnection.nuxeo_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.HostMustNotIncludeSlash'))");
-    editconnection.nuxeo_host.focus();
-    return false;
-  }
-
- if (editconnection.nuxeo_path.value != "" &&
- !(editconnection.nuxeo_path.value.indexOf("/") == 0))
- {
- alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.PathMustBeginWithASlash'))");
- editconnection.nuxeo_path.focus();
- return false;
- }
-
-  return true;
-}
- 
-function checkConfigForSave()
-{
-    
-  if (editconnection.nuxeo_host.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.HostMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Server'))");
-    editconnection.nuxeo_host.focus();
-    return false;
-  }
-  
-  if (editconnection.nuxeo_host.value != "" && editconnection.nuxeo_host.value.indexOf("/") != -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.HostMustNotIncludeSlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Server'))");
-    editconnection.nuxeo_host.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_port.value != "" && !isInteger(editconnection.nuxeo_port.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.PortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Server'))");
-    editconnection.nuxeo_port.focus();
-    return false;
-  }
-
-  if (editconnection.nuxeo_username.value != "" && editconnection.nuxeo_password.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.PasswordMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Server'))");
-    editconnection.nuxeo_password.focus();
-    return false;
-  }
-  
-  if (editconnection.nuxeo_path.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.PathMustNotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Server'))");
-    editconnection.nuxeo_path.focus();
-    return false;
-  }
-  
-  if (editconnection.nuxeo_path.value != "" &&
-    !(editconnection.nuxeo_path.value.indexOf("/") == 0))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.PathMustBeginWithASlash'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Server'))");
-    editconnection.nuxeo_path.focus();
-    return false;
-  }
-  
-  return true;
-}
-// -->
-</script>
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editConfiguration_conf_server.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editConfiguration_conf_server.html
deleted file mode 100755
index 9d1de3c..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editConfiguration_conf_server.html
+++ /dev/null
@@ -1,98 +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.
--->
-
-#if($TABNAME ==
-$ResourceBundle.getString('NuxeoRepositoryConnector.Server'))
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Protocol'))</nobr>
-    </td>
-    <td class="value">
-      <select size="2" name="nuxeo_protocol">
-        #if($NUXEO_PROTOCOL == 'https')
-          <option value="http">http</option>
-          <option value="https" selected>https</option>
-        #else
-          <option value="http" selected>http</option>
-          <option value="https" >https</option>
-        #end 
-      </select>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Host'))</nobr>
-    </td>
-    <td class="value"><input size="32" type="text" id="nuxeo_host"
-      name="nuxeo_host" value="$Encoder.attributeEscape($NUXEO_HOST)" /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Port'))</nobr>
-    </td>
-    <td class="value"><input size="5" type="text" id="nuxeo_port"
-      name="nuxeo_port" value="$Encoder.attributeEscape($NUXEO_PORT)" /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Path'))</nobr>
-    </td>
-    <td class="value"><input size="32" type="text" id="nuxeo_path"
-      name="nuxeo_path" value="$Encoder.attributeEscape($NUXEO_PATH)" /></td>
-  </tr>
-
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Username'))</nobr>
-    </td>
-    <td class="value"><input size="16" type="text"
-      id="nuxeo_username" name="nuxeo_username"
-      value="$Encoder.attributeEscape($NUXEO_USERNAME)" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Password'))</nobr>
-    </td>
-    <td class="value"><input size="16" type="password"
-      id="nuxeo_password" name="nuxeo_password"
-      value="$Encoder.attributeEscape($NUXEO_PASSWORD)" /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="nuxeo_protocol"
-  value="$Encoder.attributeEscape($NUXEO_PROTOCOL)" />
-<input type="hidden" name="nuxeo_host"
-  value="$Encoder.attributeEscape($NUXEO_HOST)" />
-<input type="hidden" name="nuxeo_port"
-  value="$Encoder.attributeEscape($NUXEO_PORT)" />
-<input type="hidden" name="nuxeo_path"
-  value="$Encoder.attributeEscape($NUXEO_PATH)" />
-<input type="hidden" name="nuxeo_username"
-  value="$Encoder.attributeEscape($NUXEO_USERNAME)" />
-<input type="hidden" name="nuxeo_password"
-  value="$Encoder.attributeEscape($NUXEO_PASSWORD)" />
-
-#end
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_conf.js b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_conf.js
deleted file mode 100755
index 6fbe358..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_conf.js
+++ /dev/null
@@ -1,66 +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.
--->
-
-<script type="text/javascript">
-
-function checkSpecificationForSave(){
-  return true;
-}
-
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-//Domains
-function s${SeqNum}_SpecDeleteDomain(i)
-{
-  s${SeqNum}_SpecOp("s${SeqNum}_domainop_"+i,"Delete","domain_"+i);
-}
-
-function s${SeqNum}_SpecAddDomain(i)
-{
-  var x = i-1;
-  if (editjob["s${SeqNum}_domain"].value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.TypeInADomain'))");
-    editjob.s${SeqNum}_domain.focus();
-    return;
-  }
-  s${SeqNum}_SpecOp("s${SeqNum}_domainop","Add","domain_"+i);
-}
-
-//Documents
-function s${SeqNum}_SpecDeleteDocumentType(i)
-{
-  s${SeqNum}_SpecOp("s${SeqNum}_documentTypeop_"+i,"Delete","documentType_"+i);
-}
-
-function s${SeqNum}_SpecAddDocumentType(i)
-{
-  var x = i-1;
-  if (editjob["s${SeqNum}_documentType"].value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('NuxeoRepositoryConnector.TypeInADocumentType'))");
-    editjob.s${SeqNum}_documentType.focus();
-    return;
-  }
-  s${SeqNum}_SpecOp("s${SeqNum}_documentTypeop","Add","documentType_"+i);
-}
-
-</script>
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDocuments.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDocuments.html
deleted file mode 100755
index 6d5f58f..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDocuments.html
+++ /dev/null
@@ -1,54 +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.
--->
-
-#if($TabName ==
-$ResourceBundle.getString('NuxeoRepositoryConnector.Documents') &&
-${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-
-  <tr>
-    <td class="description" colspan="2">
-      $Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.ProcessTags'))
-    </td>
-    <td class="value"><input type="checkbox"
-      name="s${SeqNum}_process_tags" value="true"
-      #if($PROCESS_TAGS) checked 
-      #end /></td>
-  </tr>
-  <tr>
-    <td class="description" colspan="2">
-      $Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.ProcessAttachments'))
-    </td>
-    <td class="value"><input type="checkbox"
-      name="s${SeqNum}_process_attachments" value="true"
-      #if($PROCESS_ATTACHMENTS) checked 
-      #end /></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SeqNum}_process_tags"
-  value="$PROCESS_TAGS" />
-<input type="hidden" name="s${SeqNum}_process_attachments"
-  value="$PROCESS_ATTACHMENTS" />
-
-#end
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDocumentsType.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDocumentsType.html
deleted file mode 100755
index 368ea8f..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDocumentsType.html
+++ /dev/null
@@ -1,73 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('NuxeoRepositoryConnector.DocumentsType') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  #set($documentTypecounter = 0)
-  #foreach($documentType in $DOCUMENTSTYPE)
-
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_documentTypeop_$documentTypecounter" value=""/>
-      <input type="hidden" name="s${SeqNum}_documentType_$documentTypecounter" value="$Encoder.attributeEscape($documentType)"/>
-      <a name="s${SeqNum}_tokendocumentType_$documentTypecounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Delete'))" onClick='Javascript:s${SeqNum}_SpecDeleteDocumentType($documentTypecounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.DeleteDocumentType'))$documentTypecounter"/>
-      </a>
-    </td>
-    <td class="value">$Encoder.bodyEscape($documentType)</td>
-  </tr>
-
-    #set($documentTypecounter = $documentTypecounter + 1)
-  #end
-
-  #set($nextdocumentType = $documentTypecounter + 1)
-
-  #if($documentTypecounter == 0)
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.NoDocumentsTypeConfigured'))</td>
-  </tr>
-  #end
-
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_documentsTypecount" value="$documentTypecounter"/>
-      <input type="hidden" name="s${SeqNum}_documentTypeop" value=""/>
-      <a name="documentType_$documentTypecounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Add'))" onClick='Javascript:s${SeqNum}_SpecAddDocumentType($nextdocumentType)' alt="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.AddDocumentType'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="s${SeqNum}_documentType" value=""/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($documentTypecounter = 0)
-  #foreach($documentType in $DOCUMENTSTYPE)
-<input type="hidden" name="s${SeqNum}_documentType_$documentTypecounter" value="$Encoder.attributeEscape($documentType)"/>
-    #set($documentTypecounter = $documentTypecounter + 1)
-  #end
-<input type="hidden" name="s${SeqNum}_documentsTypecount" value="$documentTypecounter"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDomains.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDomains.html
deleted file mode 100755
index e5a10da..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/editSpecification_confDomains.html
+++ /dev/null
@@ -1,73 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('NuxeoRepositoryConnector.Domains') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  #set($domaincounter = 0)
-  #foreach($domain in $DOMAINS)
-
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_domainop_$domaincounter" value=""/>
-      <input type="hidden" name="s${SeqNum}_domain_$domaincounter" value="$Encoder.attributeEscape($domain)"/>
-      <a name="s${SeqNum}_tokendomain_$domaincounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Delete'))" onClick='Javascript:s${SeqNum}_SpecDeleteDomain($domaincounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.DeleteDomain'))$domaincounter"/>
-      </a>
-    </td>
-    <td class="value">$Encoder.bodyEscape($domain)</td>
-  </tr>
-
-    #set($domaincounter = $domaincounter + 1)
-  #end
-
-  #set($nextdomain = $domaincounter + 1)
-
-  #if($domaincounter == 0)
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.NoDomainsConfigured'))</td>
-  </tr>
-  #end
-
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_domainscount" value="$domaincounter"/>
-      <input type="hidden" name="s${SeqNum}_domainop" value=""/>
-      <a name="domain_$domaincounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Add'))" onClick='Javascript:s${SeqNum}_SpecAddDomain($nextdomain)' alt="$Encoder.attributeEscape($ResourceBundle.getString('NuxeoRepositoryConnector.AddDomain'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="s${SeqNum}_domain" value=""/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($domaincounter = 0)
-  #foreach($domain in $DOMAINS)
-<input type="hidden" name="s${SeqNum}_domain_$domaincounter" value="$Encoder.attributeEscape($domain)"/>
-    #set($domaincounter = $domaincounter + 1)
-  #end
-<input type="hidden" name="s${SeqNum}_domainscount" value="$domaincounter"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/viewConfiguration_conf.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/viewConfiguration_conf.html
deleted file mode 100755
index 493ba2b..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/viewConfiguration_conf.html
+++ /dev/null
@@ -1,68 +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.
--->
-
-<table class="displaytable">
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Protocol'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($NUXEO_PROTOCOL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Host'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($NUXEO_HOST)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Port'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($NUXEO_PORT)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Path'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($NUXEO_PATH)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Username'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($NUXEO_USERNAME)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Password'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>*****</nobr>
-    </td>
-
-</table>
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/viewSpecification_conf.html b/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/viewSpecification_conf.html
deleted file mode 100755
index 3e49e4d..0000000
--- a/connectors/nuxeo/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/nuxeo/viewSpecification_conf.html
+++ /dev/null
@@ -1,55 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    #if($DOMAINS.size() == 0)
-    <td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.NoDomainsConfigured'))</nobr>
-    </td> #else
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.Domains')):</nobr>
-    </td>
-    <td class="value">#set($domaincounter = 0) #foreach($domain in
-      $DOMAINS) <nobr>$Encoder.bodyEscape($domain)</nobr><br />
-      #set($domaincounter = $domaincounter + 1) #end
-    </td> #end
-  </tr>
-  <tr>
-    #if($DOCUMENTSTYPE.size() == 0)
-    <td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.NoDocumentsTypeConfigured'))</nobr>
-    </td> #else
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.DocumentsType')):</nobr>
-    </td>
-    <td class="value">#set($documentTypecounter = 0)
-      #foreach($documentType in $DOCUMENTSTYPE) <nobr>$Encoder.bodyEscape($documentType)</nobr><br />
-      #set($documentTypecounter = $documentTypecounter + 1) #end
-    </td> #end
-  </tr>
-  <tr>
-    <td class="description"><nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.ProcessTags')):
-      </nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($PROCESS_TAGS)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('NuxeoRepositoryConnector.ProcessAttachments')):
-      </nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($PROCESS_ATTACHMENTS)</nobr>
-    </td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/nuxeo/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nuxeo/NuxeoAuthorityTest.java b/connectors/nuxeo/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nuxeo/NuxeoAuthorityTest.java
deleted file mode 100755
index bc473b2..0000000
--- a/connectors/nuxeo/connector/src/test/java/org/apache/manifoldcf/authorities/authorities/nuxeo/NuxeoAuthorityTest.java
+++ /dev/null
@@ -1,94 +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 org.apache.manifoldcf.authorities.authorities.nuxeo;
-
-import org.apache.manifoldcf.authorities.authorities.nuxeo.NuxeoAuthorityConnector;
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.manifoldcf.authorities.interfaces.IAuthorityConnector;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.Ignore;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import org.nuxeo.client.api.NuxeoClient;
-import org.nuxeo.client.api.objects.user.User;
-import org.nuxeo.client.api.objects.user.UserManager;
-import org.mockito.Mock;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import static org.mockito.Matchers.anyString;
-
-import org.mockito.runners.MockitoJUnitRunner;
-
-/**
- * @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
- *
- */
-@RunWith(MockitoJUnitRunner.class)
-public class NuxeoAuthorityTest {
-
-  @Mock
-  private NuxeoClient client;
-
-  private NuxeoAuthorityConnector authorityConnector;
-
-  @Before
-  public void setup() throws Exception {
-    authorityConnector = new NuxeoAuthorityConnector();
-    authorityConnector.setNuxeoClient(client);
-  }
-
-  @Test
-  @Ignore
-  public void check() throws Exception {
-
-    when(client.getUserManager()).thenReturn(mock(UserManager.class));
-    when(client.getUserManager().fetchUser(anyString())).thenReturn(mock(User.class));
-    
-    assertEquals(authorityConnector.check(), "Connection working");
-  }
-
-  @Test
-  public void checkUserNotFound() throws Exception {
-    UserManager userManager = mock(UserManager.class);
-    User user = mock(User.class);
-    
-    when(client.getUserManager()).thenReturn(userManager);
-    when(client.getUserManager().fetchUser("")).thenReturn(user);
-    
-    AuthorizationResponse response = authorityConnector.getAuthorizationResponse("NOT_USER_EXIST");
-    String[] tokens = response.getAccessTokens();
-    
-    assertEquals(tokens.length, 1);
-    assertEquals(tokens[0], IAuthorityConnector.GLOBAL_DENY_TOKEN);
-    assertEquals(response.getResponseStatus(), AuthorizationResponse.RESPONSE_USERNOTFOUND);
-  }
-
-  @Test
-  public void checkUserFound() throws Exception {
-    when(client.getUserManager()).thenReturn(mock(UserManager.class));
-    when(client.getUserManager().fetchUser(anyString())).thenReturn(mock(User.class));
-    
-    AuthorizationResponse response = authorityConnector.getAuthorizationResponse("Administrator");
-    
-    String[] tokens = response.getAccessTokens();
-    
-    assertEquals(tokens.length, 1);
-    assertEquals(response.getResponseStatus(), AuthorizationResponse.RESPONSE_OK);
-  }
-}
diff --git a/connectors/nuxeo/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoConnectorTest.java b/connectors/nuxeo/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoConnectorTest.java
deleted file mode 100755
index 43a4715..0000000
--- a/connectors/nuxeo/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/nuxeo/NuxeoConnectorTest.java
+++ /dev/null
@@ -1,231 +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 org.apache.manifoldcf.crawler.connectors.nuxeo;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.connectors.nuxeo.NuxeoRepositoryConnector;
-import org.apache.manifoldcf.crawler.connectors.nuxeo.model.DocumentManifold;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.apache.manifoldcf.crawler.system.SeedingActivity;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.Ignore;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.nuxeo.client.api.NuxeoClient;
-import org.nuxeo.client.api.objects.Document;
-import org.nuxeo.client.api.objects.Documents;
-import org.nuxeo.client.api.objects.Repository;
-
-/**
- * @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
- *
- */
-@RunWith(MockitoJUnitRunner.class)
-public class NuxeoConnectorTest {
-
-  @Mock
-  public NuxeoClient client;
-
-  public NuxeoRepositoryConnector repositoryConnector;
-
-  @Before
-  public void setup() throws Exception {
-
-    repositoryConnector = new NuxeoRepositoryConnector();
-    repositoryConnector.setNuxeoClient(client);
-  };
-
-  @Test
-  @Ignore
-  public void checkMockInjection() throws Exception {
-    Document doc = mock(Document.class);
-    Repository repository = mock(Repository.class);
-    
-    when(client.repository()).thenReturn(repository);
-    when(client.repository().getDocumentRoot()).thenReturn(doc);
-    assertEquals(repositoryConnector.check(), "Connection working");
-  }
-
-  @Test
-  public void mockSeeding() throws Exception {
-    SeedingActivity activities = mock(SeedingActivity.class);
-    Specification spec = new Specification();
-    Repository repository = mock(Repository.class);
-    Document document = mock(Document.class);
-    List<Document> documents = new ArrayList<>();
-    documents.add(document);
-    documents.add(document);
-    Documents docs = mock(Documents.class);
-    long seedTime = 0;
-    
-
-    when(client.repository()).thenReturn(repository);
-    when(client.repository().query(anyString(), anyString(), anyString(), anyString(), anyString(),
-        anyString(), anyString())).thenReturn(docs);
-    when(docs.getIsNextPageAvailable()).thenReturn(false);
-    when(docs.getDocuments()).thenReturn(documents);
-    
-    repositoryConnector.addSeedDocuments(activities, spec, "", seedTime,
-        BaseRepositoryConnector.JOBMODE_CONTINUOUS);
-
-    verify(activities, times(2)).addSeedDocument(anyString());
-    
-  }
-
-  @Test
-  public void mockEmptySeeding() throws Exception {
-    SeedingActivity activities = mock(SeedingActivity.class);
-    Specification spec = new Specification();
-    Repository repository = mock(Repository.class);
-    List<Document> documents = new ArrayList<>();    
-    Documents docs = mock(Documents.class);
-    long seedTime = 0;
-    
-
-    when(client.repository()).thenReturn(repository);
-    when(client.repository().query(anyString(), anyString(), anyString(), anyString(), anyString(),
-        anyString(), anyString())).thenReturn(docs);
-    when(docs.getIsNextPageAvailable()).thenReturn(false);
-    when(docs.getDocuments()).thenReturn(documents);
-    
-    repositoryConnector.addSeedDocuments(activities, spec, "", seedTime,
-        BaseRepositoryConnector.JOBMODE_CONTINUOUS);
-
-    verify(activities, times(0)).addSeedDocument(anyString());
-  }
-
-  @Test
-  public void mockDeleteDocument() throws Exception {
-    DocumentManifold docMa = mock(DocumentManifold.class);
-    Repository repository = mock(Repository.class);
-    Document doc = mock(Document.class);
-    Specification spec = new Specification();
-    IProcessActivity activities = mock(IProcessActivity.class);
-    IExistingVersions statuses = mock(IExistingVersions.class);
-
-    when(client.repository()).thenReturn(repository);
-    when(client.repository().fetchDocumentById(anyString())).thenReturn(doc);
-    when(docMa.getDocument()).thenReturn(doc);
-    when(doc.getState()).thenReturn("deleted");
-
-    repositoryConnector.processDocuments(new String[] { anyString() }, statuses, spec, activities,
-        BaseRepositoryConnector.JOBMODE_CONTINUOUS, true);
-
-    verify(activities, times(1)).deleteDocument(anyString());
-  }
-
-  @Test
-  @Ignore
-  public void mockSimpleIngestion() throws Exception {
-
-    Document doc = mock(Document.class);
-    DocumentManifold docMa = mock(DocumentManifold.class);
-    Date date = new Date();
-    DateFormat df = DateFormat.getDateTimeInstance();
-    String version = df.format(date);
-    Long size = 0L;
-    String id;
-    String uri = "http://localhost:8080/nuxeo/site/api/v1/id/7995ff6d-1eda-41db-b9de-3ea4037fdb81";
-    Map<String, Object> metadata = new HashMap<String, Object>();
-    IProcessActivity activities = mock(IProcessActivity.class);
-    IExistingVersions statuses = mock(IExistingVersions.class);
-    Specification spec = new Specification();
-    Repository repository = mock(Repository.class);
-
-
-    metadata.put("key", "value");
-    id = df.format(date);
-
-    when(doc.get("lenght")).thenReturn(size);
-    when(doc.getLastModified()).thenReturn(version);
-    when(docMa.getMetadata()).thenReturn(metadata);
-    when(doc.getUid()).thenReturn(uri);
-    when(client.repository()).thenReturn(repository);
-    when(client.repository().fetchDocumentById(anyString())).thenReturn(doc);
-
-    when(activities.checkDocumentNeedsReindexing(anyString(), anyString())).thenReturn(true);
-    when(statuses.getIndexedVersionString(id)).thenReturn(null);
-
-
-    repositoryConnector.processDocuments(new String[] { id }, statuses, spec, activities,
-        BaseRepositoryConnector.JOBMODE_CONTINUOUS, true);
-    ArgumentCaptor<RepositoryDocument> ac = ArgumentCaptor.forClass(RepositoryDocument.class);
-
-    verify(activities, times(1)).ingestDocumentWithException(eq(id), eq(df.format(date)), eq(uri), ac.capture());
-    verify(activities, times(1)).recordActivity(anyLong(), eq("read document"), eq(size), eq(id), eq("OK"),
-        anyString(), Mockito.isNull(String[].class));
-
-    RepositoryDocument rd = ac.getValue();
-    Long rdSize = rd.getBinaryLength();
-
-    String[] keyValue = rd.getFieldAsStrings("uid");
-    
-    assertEquals(size, rdSize);
-    assertEquals(keyValue.length, 1);
-  }
-
-  @Test
-  public void mockNotNeedReindexing() throws Exception {
-    Document doc = mock(Document.class);
-    Date date = new Date();
-    Repository repository = mock(Repository.class);
-    DateFormat df = DateFormat.getDateTimeInstance();
-    String version = df.format(date);
-    String uid = "297529bf-191a-4c87-8259-28b692394229";
-
-    IProcessActivity activities = mock(IProcessActivity.class);
-    IExistingVersions statuses = mock(IExistingVersions.class);
-    Specification spec = new Specification();
-
-    when(doc.getLastModified()).thenReturn(version);
-    when(statuses.getIndexedVersionString(uid)).thenReturn(version);
-    when(client.repository()).thenReturn(repository);
-    when(client.repository().fetchDocumentById(anyString())).thenReturn(doc);
-
-    repositoryConnector.processDocuments(new String[] { uid }, statuses, spec, activities,
-        BaseRepositoryConnector.JOBMODE_CONTINUOUS, true);
-    ArgumentCaptor<RepositoryDocument> ac = ArgumentCaptor.forClass(RepositoryDocument.class);
-
-    verify(activities, times(1)).checkDocumentNeedsReindexing(uid, version);
-    verify(activities, times(0)).ingestDocumentWithException(anyString(), anyString(), anyString(), ac.capture());
-
-  }
-
-}
diff --git a/connectors/nuxeo/pom.xml b/connectors/nuxeo/pom.xml
deleted file mode 100755
index fcddcfd..0000000
--- a/connectors/nuxeo/pom.xml
+++ /dev/null
@@ -1,379 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-
-  <name>ManifoldCF - Connectors - Nuxeo Connector</name>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>mcf-nuxeo-connector</artifactId>
-  <packaging>jar</packaging>
-
-  <url>http://maven.apache.org</url>
-
-  <developers>
-    <developer>
-      <name>David Arroyo Escobar</name>
-      <email>arroyoescobardavid@gmail.com</email>
-    </developer>
-  </developers>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <!-- Nuxeo repositories -->
-  <repositories>
-    <repository>
-	  <id>public-releases</id>
-	  <url>http://maven.nuxeo.com/nexus/content/repositories/public-releases/</url>
-    </repository>
-    <repository>
-	  <id>public-snapshots</id>
-	  <url>http://maven.nuxeo.com/nexus/content/repositories/public-snapshots/</url>
-    </repository>
-  </repositories>
-  <!-- Nuxeo repositories -->
-	
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-          <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-          <execution>
-            <id>native2ascii-utf8</id>
-            <goals>
-              <goal>native2ascii</goal>
-            </goals>
-            <configuration>
-              <encoding>UTF8</encoding>
-              <includes>
-                <include>**/*.properties</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <!--This plugin's configuration is used to store Eclipse m2e settings 
-          only. It has no influence on the Maven build itself. -->
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.apache.maven.plugins
-                    </groupId>
-                    <artifactId>
-                      maven-dependency-plugin
-                    </artifactId>
-                    <versionRange>
-                      [2.8,)
-                    </versionRange>
-                    <goals>
-                      <goal>copy</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.codehaus.mojo
-                    </groupId>
-                    <artifactId>
-                      native2ascii-maven-plugin
-                    </artifactId>
-                    <versionRange>
-                      [1.0-beta-1,)
-                    </versionRange>
-                    <goals>
-                      <goal>native2ascii</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.apache.maven.plugins
-                    </groupId>
-                    <artifactId>
-                      maven-remote-resources-plugin
-                    </artifactId>
-                    <versionRange>
-                      [1.5,)
-                    </versionRange>
-                    <goals>
-                      <goal>process</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-
-
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>${commons-lang.version}</version>
-      <type>jar</type>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>15.0</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>${mockito.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.github.tomakehurst</groupId>
-      <artifactId>wiremock</artifactId>
-      <version>${wiremock.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.googlecode.json-simple</groupId>
-      <artifactId>json-simple</artifactId>
-      <version>1.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>1.8</version>
-    </dependency>
-    
-    <!-- Nuxeo client -->
-    <dependency>
-        <groupId>org.nuxeo.client</groupId>
-        <artifactId>nuxeo-java-client</artifactId>
-        <version>2.5</version>
-      </dependency>
-      <!-- End nuxeo client -->
-  </dependencies>
-
-</project>
diff --git a/connectors/opennlp/build.xml b/connectors/opennlp/build.xml
deleted file mode 100644
index 3389f87..0000000
--- a/connectors/opennlp/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="opennlp" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="OpenNLP transformer"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.opennlp.OpenNlpExtractor"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/Messages.java b/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/Messages.java
deleted file mode 100644
index 9c0c18c..0000000
--- a/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/Messages.java
+++ /dev/null
@@ -1,139 +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 org.apache.manifoldcf.agents.transformation.opennlp;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.transformation.opennlp.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.transformation.opennlp";
-  
-  /** Constructor - do no instantiate
-   */
-   protected Messages()
-   {
-   }
-   
-   public static String getString(Locale locale, String messageKey)
-   {
-     return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-   }
-
-   public static String getAttributeString(Locale locale, String messageKey)
-   {
-     return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-   }
-
-   public static String getBodyString(Locale locale, String messageKey)
-   {
-     return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-   }
-
-   public static String getAttributeJavascriptString(Locale locale, String messageKey)
-   {
-     return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-   }
-
-   public static String getBodyJavascriptString(Locale locale, String messageKey)
-   {
-     return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-   }
-
-   public static String getString(Locale locale, String messageKey, Object[] args)
-   {
-     return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-   }
-
-   public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-   {
-     return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-   }
-   
-   public static String getBodyString(Locale locale, String messageKey, Object[] args)
-   {
-     return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-   }
-
-   public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-   {
-     return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-   }
-
-   public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-   {
-     return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-   }
-
-   // More general methods which allow bundlenames and class loaders to be specified.
-   
-   public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-   {
-     return getString(Messages.class, bundleName, locale, messageKey, args);
-   }
-
-   public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-   {
-     return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-   }
-
-   public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-   {
-     return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-   }
-   
-   public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-   {
-     return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-   }
-
-   public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-   {
-     return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-   }
-
-   // Resource output
-   
-   public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-     Map<String,String> substitutionParameters, boolean mapToUpperCase)
-     throws ManifoldCFException
-   {
-     outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-     substitutionParameters,mapToUpperCase);
-   }
-   
-   public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-     Map<String,String> substitutionParameters, boolean mapToUpperCase)
-     throws ManifoldCFException
-   {
-     outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-     substitutionParameters,mapToUpperCase);
-   }
-
-   public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-     Map<String,Object> contextObjects)
-     throws ManifoldCFException
-   {
-     outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-     contextObjects);
-   }
-
-}
diff --git a/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/OpenNlpExtractor.java b/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/OpenNlpExtractor.java
deleted file mode 100644
index fc02dc6..0000000
--- a/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/OpenNlpExtractor.java
+++ /dev/null
@@ -1,848 +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 org.apache.manifoldcf.agents.transformation.opennlp;
-
-import java.io.*;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.TreeMap;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.HashSet;
-
-import opennlp.tools.namefind.NameFinderME;
-import opennlp.tools.sentdetect.SentenceDetector;
-import opennlp.tools.tokenize.Tokenizer;
-import opennlp.tools.util.Span;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputCheckActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.agents.system.Logging;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import org.apache.manifoldcf.agents.transformation.BaseTransformationConnector;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-
-public class OpenNlpExtractor extends BaseTransformationConnector {
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  private static final String EDIT_SPECIFICATION_OPENNLP_HTML = "editSpecification_OpenNLP.html";
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  protected static int maximumExtractionCharacters = 524288;
-  
-  // Meta-data fields added by this connector
-  private static final String PERSONS = "ner_people";
-  private static final String LOCATIONS = "ner_locations";
-  private static final String ORGANIZATIONS = "ner_organizations";
-
-  protected static final String ACTIVITY_EXTRACT = "extract";
-
-  protected static final String[] activitiesList = new String[] { ACTIVITY_EXTRACT };
-
-  protected final File fileDirectory = ManifoldCF.getFileProperty(ManifoldCF.fileResourcesProperty);
-
-  /** We handle up to 64K in memory; after that we go to disk. */
-  protected static final long inMemoryMaximumFile = 65536;
-
-  
-  /**
-   * Return a list of activities that this connector generates. The connector
-   * does NOT need to be connected before this method is called.
-   * 
-   * @return the set of activities.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return activitiesList;
-  }
-
-  /**
-   * Get a pipeline version string, given a pipeline specification object. The
-   * version string is used to uniquely describe the pertinent details of the
-   * specification and the configuration, to allow the Connector Framework to
-   * determine whether a document will need to be processed again. Note that
-   * the contents of any document cannot be considered by this method; only
-   * configuration and specification information can be considered.
-   * 
-   * This method presumes that the underlying connector object has been
-   * configured.
-   * 
-   * @param spec
-   *            is the current pipeline specification object for this
-   *            connection for the job that is doing the crawling.
-   * @return a string, of unlimited length, which uniquely describes
-   *         configuration and specification in such a way that if two such
-   *         strings are equal, nothing that affects how or whether the
-   *         document is indexed will be different.
-   */
-  @Override
-  public VersionContext getPipelineDescription(Specification os) throws ManifoldCFException, ServiceInterruption {
-    SpecPacker sp = new SpecPacker(os);
-    return new VersionContext(sp.toPackedString(), params, os);
-  }
-
-  /**
-   * Add (or replace) a document in the output data store using the connector.
-   * This method presumes that the connector object has been configured, and
-   * it is thus able to communicate with the output data store should that be
-   * necessary. The OutputSpecification is *not* provided to this method,
-   * because the goal is consistency, and if output is done it must be
-   * consistent with the output description, since that was what was partly
-   * used to determine if output should be taking place. So it may be
-   * necessary for this method to decode an output description string in order
-   * to determine what should be done.
-   * 
-   * @param documentURI
-   *            is the URI of the document. The URI is presumed to be the
-   *            unique identifier which the output data store will use to
-   *            process and serve the document. This URI is constructed by the
-   *            repository connector which fetches the document, and is thus
-   *            universal across all output connectors.
-   * @param outputDescription
-   *            is the description string that was constructed for this
-   *            document by the getOutputDescription() method.
-   * @param document
-   *            is the document data to be processed (handed to the output
-   *            data store).
-   * @param authorityNameString
-   *            is the name of the authority responsible for authorizing any
-   *            access tokens passed in with the repository document. May be
-   *            null.
-   * @param activities
-   *            is the handle to an object that the implementer of a pipeline
-   *            connector may use to perform operations, such as logging
-   *            processing activity, or sending a modified document to the
-   *            next stage in the pipeline.
-   * @return the document status (accepted or permanently rejected).
-   * @throws IOException
-   *             only if there's a stream error reading the document data.
-   */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription,
-    RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException {
-    // assumes use of Tika extractor before using this connector
-    Logging.agents.debug("Starting OpenNlp extraction");
-
-    SpecPacker sp = new SpecPacker(pipelineDescription.getSpecification());
-
-    // In order to be able to replay the input stream both for extraction and for downstream use,
-    // we need to page through it, some number of characters at a time, and write those into a local buffer.
-    // We can do this at the same time we're extracting, if we're clever.
-      
-    // Set up to spool back the original content, using either memory or disk, whichever makes sense.
-    DestinationStorage ds;
-    if (document.getBinaryLength() <= inMemoryMaximumFile) {
-      ds = new MemoryDestinationStorage((int)document.getBinaryLength());
-    } else {
-      ds = new FileDestinationStorage();
-    }
-    
-    try {
-
-      // For logging, we'll need all of this
-      long startTime = System.currentTimeMillis();
-      String resultCode = "OK";
-      String description = null;
-      Long length = null;
-
-      final MetadataAccumulator ma = new MetadataAccumulator(sp, document.getBinaryLength());
-      
-      try {
-
-        // Page through document content, saving it aside into destination storage, while also extracting the content
-        final OutputStream os = ds.getOutputStream();
-        try {
-          // We presume that the content is utf-8!!  Thus it has to have been run through the TikaExtractor, or equivalent.
-          //
-          // We're going to be paging through the input stream by chunks of characters.  Each chunk will then be passed to the
-          // output stream (os) via a writer, as well as to the actual code that invokes the nlp sentence extraction.  
-          
-          // We need an output writer that converts the input into characters.  
-          // 
-          Writer w = new OutputStreamWriter(os, "utf-8");
-          try {
-            Reader r = new InputStreamReader(document.getBinaryStream(), "utf-8");
-            try {
-              // Now, page through!
-              // It's too bad we have to convert FROM utf-8 and then back TO utf-8, but that can't be helped.
-              char[] characterBuffer = new char[65536];
-              while (true) {
-                int amt = r.read(characterBuffer);
-                if (amt == -1) {
-                  break;
-                }
-                // Write into the copy buffer
-                w.write(characterBuffer,0,amt);
-                // Also do the processing
-                ma.acceptCharacters(characterBuffer,amt);
-              }
-              // Do not close the reader; the underlying stream will be closed by our caller when the RepositoryDocument is done with
-            } catch (IOException e) {
-              // These are errors from reading the RepositoryDocument input stream; we handle them accordingly.
-              resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              description = e.getMessage();
-              throw e;
-            }
-          } finally {
-            w.flush();
-          }
-        }
-        finally
-        {
-          os.close();
-          length = new Long(ds.getBinaryLength());
-        }
-
-      }
-      finally
-      {
-        // Log the extraction processing
-        activities.recordActivity(new Long(startTime), ACTIVITY_EXTRACT, length, documentURI,
-          resultCode, description);
-      }
-      
-      ma.done();
-      
-      // Parsing complete!
-      // Create a copy of Repository Document
-      RepositoryDocument docCopy = document.duplicate();
-        
-      // Get new stream length
-      long newBinaryLength = ds.getBinaryLength();
-      // Open new input stream
-      InputStream is = ds.getInputStream();
-      try
-      {
-        docCopy.setBinary(is,newBinaryLength);
-
-        // add named entity meta-data
-        Map<String,Set<String>> nerMap = ma.getMetadata();
-        if (!nerMap.isEmpty()) {
-          for (Entry<String, Set<String>> entry : nerMap.entrySet()) {
-            Set<String> neList = entry.getValue();
-            String[] neArray = neList.toArray(new String[0]);
-            docCopy.addField(entry.getKey(), neArray);
-          }
-        }
-
-        // Send new document downstream
-        return activities.sendDocument(documentURI,docCopy);
-      } finally {
-        is.close();
-      }
-    } finally {
-      ds.close();
-    }
-  }
-
-  private final static Set<String> acceptableMimeTypes = new HashSet<String>();
-  static
-  {
-    acceptableMimeTypes.add("text/plain;charset=utf-8");
-    acceptableMimeTypes.add("text/plain;charset=ascii");
-    acceptableMimeTypes.add("text/plain;charset=us-ascii");
-    acceptableMimeTypes.add("text/plain");
-  }
-
-  /** Detect if a mime type is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param mimeType is the mime type of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the mime type can be accepted by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext pipelineDescription, String mimeType, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (mimeType == null || !acceptableMimeTypes.contains(mimeType.toLowerCase(Locale.ROOT))) {
-      return false;
-    }
-    // Do a downstream check too
-    return super.checkMimeTypeIndexable(pipelineDescription, mimeType, checkActivity);
-  }
-
-  // ////////////////////////
-  // UI Methods
-  // ////////////////////////
-
-  /**
-   * Obtain the name of the form check javascript method to call.
-   * 
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @return the name of the form check javascript method.
-   */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber) {
-    return "s" + connectionSequenceNumber + "_checkSpecification";
-  }
-
-  /**
-   * Obtain the name of the form presave check javascript method to call.
-   * 
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @return the name of the form presave check javascript method.
-   */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber) {
-    return "s" + connectionSequenceNumber + "_checkSpecificationForSave";
-  }
-
-  /**
-   * Output the specification header section. This method is called in the
-   * head section of a job page which has selected an output connection of the
-   * current type. Its purpose is to add the required tabs to the list, and to
-   * output any javascript methods that might be needed by the job editing
-   * HTML.
-   * 
-   * @param out
-   *            is the output to which any HTML should be sent.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param os
-   *            is the current output specification for this job.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @param tabsArray
-   *            is an array of tab names. Add to this array any tab names that
-   *            are specific to the connector.
-   */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-      int connectionSequenceNumber, List<String> tabsArray) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    tabsArray.add(Messages.getString(locale, "OpenNlpExtractor.OpenNLPTabName"));
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPECIFICATION_JS, paramMap);
-  }
-
-  /**
-   * Output the specification body section. This method is called in the body
-   * section of a job page which has selected an output connection of the
-   * current type. Its purpose is to present the required form elements for
-   * editing. The coder can presume that the HTML that is output from this
-   * configuration will be within appropriate <html>, <body>, and <form> tags.
-   * The name of the form is "editjob".
-   * 
-   * @param out
-   *            is the output to which any HTML should be sent.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param os
-   *            is the current output specification for this job.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @param actualSequenceNumber
-   *            is the connection within the job that has currently been
-   *            selected.
-   * @param tabName
-   *            is the current tab name.
-   */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os, int connectionSequenceNumber,
-      int actualSequenceNumber, String tabName) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM", Integer.toString(actualSequenceNumber));
-
-    fillInOpenNLPSpecificationMap(paramMap, os);
-    setUpOpenNLPSpecificationMap(paramMap);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPECIFICATION_OPENNLP_HTML, paramMap);
-  }
-
-  /**
-   * Process a specification post. This method is called at the start of job's
-   * edit or view page, whenever there is a possibility that form data for a
-   * connection has been posted. Its purpose is to gather form information and
-   * modify the output specification accordingly. The name of the posted form
-   * is "editjob".
-   * 
-   * @param variableContext
-   *            contains the post data, including binary file-upload
-   *            information.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param os
-   *            is the current output specification for this job.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @return null if all is well, or a string error message if there is an
-   *         error that should prevent saving of the job (and cause a
-   *         redirection to an error page).
-   */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-      int connectionSequenceNumber) throws ManifoldCFException {
-    String seqPrefix = "s" + connectionSequenceNumber + "_";
-
-    SpecificationNode node = new SpecificationNode(OpenNlpExtractorConfig.NODE_SMODEL_PATH);
-    String smodelPath = variableContext.getParameter(seqPrefix + "smodelpath");
-    if (smodelPath != null) {
-      node.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_VALUE, smodelPath);
-    } else {
-      node.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_VALUE, "");
-    }
-    os.addChild(os.getChildCount(), node);
-
-    node = new SpecificationNode(OpenNlpExtractorConfig.NODE_TMODEL_PATH);
-    String tmodelPath = variableContext.getParameter(seqPrefix + "tmodelpath");
-    if (tmodelPath != null) {
-      node.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_VALUE, tmodelPath);
-    } else {
-      node.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_VALUE, "");
-    }
-    os.addChild(os.getChildCount(), node);
-
-    String modelCount = variableContext.getParameter(seqPrefix+"model_count");
-    if (modelCount != null)
-    {
-      int count = Integer.parseInt(modelCount);
-      // Delete old spec data, including legacy node types we no longer use
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode cn = os.getChild(i);
-        if (cn.getType().equals(OpenNlpExtractorConfig.NODE_FINDERMODEL))
-          os.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through form data
-      for (int j = 0; j < count; j++)
-      {
-        String op = variableContext.getParameter(seqPrefix+"model_"+j+"_op");
-        if (op != null && op.equals("Delete"))
-          continue;
-        String paramName = variableContext.getParameter(seqPrefix+"model_"+j+"_parametername");
-        String modelFile = variableContext.getParameter(seqPrefix+"model_"+j+"_modelfile");
-        SpecificationNode sn = new SpecificationNode(OpenNlpExtractorConfig.NODE_FINDERMODEL);
-        sn.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_PARAMETERNAME,paramName);
-        sn.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_MODELFILE,modelFile);
-        os.addChild(os.getChildCount(),sn);
-      }
-      // Look for add operation
-      String addOp = variableContext.getParameter(seqPrefix+"model_op");
-      if (addOp != null && addOp.equals("Add"))
-      {
-        String paramName = variableContext.getParameter(seqPrefix+"model_parametername");
-        String modelFile = variableContext.getParameter(seqPrefix+"model_modelfile");
-        SpecificationNode sn = new SpecificationNode(OpenNlpExtractorConfig.NODE_FINDERMODEL);
-        sn.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_PARAMETERNAME,paramName);
-        sn.setAttribute(OpenNlpExtractorConfig.ATTRIBUTE_MODELFILE,modelFile);
-        os.addChild(os.getChildCount(),sn);
-      }
-
-    }
-
-    return null;
-  }
-
-  /**
-   * View specification. This method is called in the body section of a job's
-   * view page. Its purpose is to present the output specification information
-   * to the user. The coder can presume that the HTML that is output from this
-   * configuration will be within appropriate <html> and <body> tags.
-   * 
-   * @param out
-   *            is the output to which any HTML should be sent.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @param os
-   *            is the current output specification for this job.
-   */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os, int connectionSequenceNumber)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    fillInOpenNLPSpecificationMap(paramMap, os);
-    Messages.outputResourceWithVelocity(out, locale, VIEW_SPECIFICATION_HTML, paramMap);
-  }
-
-  protected void setUpOpenNLPSpecificationMap(Map<String, Object> paramMap)
-    throws ManifoldCFException {
-    final String[] fileNames = getModelList();
-    paramMap.put("FILENAMES", fileNames);
-  }
-  
-  protected static void fillInOpenNLPSpecificationMap(Map<String, Object> paramMap, Specification os) {
-    String sModelPath = "";
-    String tModelPath = "";
-    final List<Map<String,String>> finderModels = new ArrayList<>();
-    
-    for (int i = 0; i < os.getChildCount(); i++) {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(OpenNlpExtractorConfig.NODE_SMODEL_PATH)) {
-        sModelPath = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_VALUE);
-        if (sModelPath == null) {
-          sModelPath = "";
-        }
-      } else if (sn.getType().equals(OpenNlpExtractorConfig.NODE_TMODEL_PATH)) {
-        tModelPath = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_VALUE);
-        if (tModelPath == null) {
-          tModelPath = "";
-        }
-      } else if (sn.getType().equals(OpenNlpExtractorConfig.NODE_FINDERMODEL)) {
-        final String parameterName = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_PARAMETERNAME);
-        final String modelFile = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_MODELFILE);
-        final Map<String,String> modelRecord = new HashMap<>();
-        modelRecord.put("parametername", parameterName);
-        modelRecord.put("modelfile", modelFile);
-        finderModels.add(modelRecord);
-      }
-
-    }
-    paramMap.put("SMODELPATH", sModelPath);
-    paramMap.put("TMODELPATH", tModelPath);
-    paramMap.put("MODELS", finderModels);
-  }
-
-  protected static int handleIOException(IOException e)
-    throws ManifoldCFException
-  {
-    // IOException reading from our local storage...
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-
-  protected String[] getModelList() throws ManifoldCFException {
-    if (fileDirectory == null) {
-      return new String[0];
-    }
-    final String[] files = fileDirectory.list(new FileFilter());
-    // Sort it!!
-    java.util.Arrays.sort(files);
-    return files;
-  }
-  
-  protected static class FileFilter implements FilenameFilter {
-    @Override
-    public boolean accept(final File dir, final String name) {
-      return new File(dir, name).isFile();
-    }
-  }
-  
-  /** An instance of this class receives characters in 64K chunks, and needs to accumulate
-  * extracted metadata that this transformer will pass down.
-  */
-  protected class MetadataAccumulator {
-
-    char[] characterBuffer = null;
-    int bufferPointer = 0;
-    
-    final int bufferSize;
-    
-    final SentenceDetector sentenceDetector;
-    final Tokenizer tokenizer;
-    final Map<String,NameFinderME> finders = new HashMap<>();
-    final Map<String,Set<String>> tokenLists = new HashMap<>();
-   
-    public MetadataAccumulator(final SpecPacker sp,
-      final long bytesize)
-      throws ManifoldCFException {
-      try {
-        sentenceDetector = OpenNlpExtractorConfig.sentenceDetector(new File(fileDirectory,sp.getSModelPath()));
-        tokenizer = OpenNlpExtractorConfig.tokenizer(new File(fileDirectory,sp.getTModelPath()));
-        final Map<String,String> finderFiles = sp.getFinderModels();
-        for (String paramName : finderFiles.keySet()) {
-          finders.put(paramName, OpenNlpExtractorConfig.finder(new File(fileDirectory,finderFiles.get(paramName))));
-        }
-      } catch (IOException e) {
-        throw new ManifoldCFException(e.getMessage(), e);
-      }
-      if (bytesize > maximumExtractionCharacters) {
-        bufferSize = maximumExtractionCharacters;
-      } else {
-        bufferSize = (int)bytesize;
-      }
-    }
-    
-    /** Accept characters, including actual count.
-    */
-    public void acceptCharacters(final char[] buffer, int amt) {
-      if (characterBuffer == null) {
-        characterBuffer = new char[bufferSize];
-      }
-      int copyAmt;
-      if (amt > bufferSize - bufferPointer) {
-        copyAmt = bufferSize - bufferPointer;
-      } else {
-        copyAmt = amt;
-      }
-      int sourcePtr = 0;
-      while (copyAmt > 0) {
-        characterBuffer[bufferPointer++] = buffer[sourcePtr++];
-        copyAmt--;
-      }
-    }
-
-    public void done() {
-      if (bufferPointer == 0 || characterBuffer == null) {
-        return;
-      }
-      
-      // Make a string freom the character array
-      final String textContent = new String(characterBuffer, 0, bufferPointer);
-
-      // Break into sentences, tokens, and then people, locations, and organizations
-      String[] sentences = sentenceDetector.sentDetect(textContent);
-      for (String sentence : sentences) {
-        String[] tokens = tokenizer.tokenize(sentence);
-
-        for (String parameterName : finders.keySet()) {
-          Set<String> stringSet = tokenLists.get(parameterName);
-          if (stringSet == null) {
-            stringSet = new HashSet<String>();
-            tokenLists.put(parameterName, stringSet);
-          }
-          
-          Span[] spans = finders.get(parameterName).find(tokens);
-          stringSet.addAll(Arrays.asList(Span.spansToStrings(spans, tokens)));
-        }
-      }
-    }
-    
-    public Map<String,Set<String>> getMetadata() {
-      return tokenLists;
-    }
-    
-  }
-  
-  protected static interface DestinationStorage {
-    /** Get the output stream to write to.  Caller should explicitly close this stream when done writing.
-    */
-    public OutputStream getOutputStream()
-      throws ManifoldCFException;
-    
-    /** Get new binary length.
-    */
-    public long getBinaryLength()
-      throws ManifoldCFException;
-
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    public InputStream getInputStream()
-      throws ManifoldCFException;
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    public void close()
-      throws ManifoldCFException;
-  }
-  
-  protected static class FileDestinationStorage implements DestinationStorage {
-    protected final File outputFile;
-    protected final OutputStream outputStream;
-
-    public FileDestinationStorage()
-      throws ManifoldCFException
-    {
-      File outputFile;
-      OutputStream outputStream;
-      try
-      {
-        outputFile = File.createTempFile("mcftika","tmp");
-        outputStream = new FileOutputStream(outputFile);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e);
-        outputFile = null;
-        outputStream = null;
-      }
-      this.outputFile = outputFile;
-      this.outputStream = outputStream;
-    }
-    
-    @Override
-    public OutputStream getOutputStream()
-      throws ManifoldCFException
-    {
-      return outputStream;
-    }
-    
-    /** Get new binary length.
-    */
-    @Override
-    public long getBinaryLength()
-      throws ManifoldCFException
-    {
-      return outputFile.length();
-    }
-
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    @Override
-    public InputStream getInputStream()
-      throws ManifoldCFException
-    {
-      try
-      {
-        return new FileInputStream(outputFile);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e);
-        return null;
-      }
-    }
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    @Override
-    public void close()
-      throws ManifoldCFException
-    {
-      outputFile.delete();
-    }
-
-  }
-  
-  protected static class MemoryDestinationStorage implements DestinationStorage {
-    protected final ByteArrayOutputStream outputStream;
-    
-    public MemoryDestinationStorage(int sizeHint)
-    {
-      outputStream = new ByteArrayOutputStream(sizeHint);
-    }
-    
-    @Override
-    public OutputStream getOutputStream()
-      throws ManifoldCFException
-    {
-      return outputStream;
-    }
-
-    /** Get new binary length.
-    */
-    @Override
-    public long getBinaryLength()
-      throws ManifoldCFException
-    {
-      return outputStream.size();
-    }
-    
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    @Override
-    public InputStream getInputStream()
-      throws ManifoldCFException
-    {
-      return new ByteArrayInputStream(outputStream.toByteArray());
-    }
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    public void close()
-      throws ManifoldCFException
-    {
-    }
-
-  }
-
-  protected static class SpecPacker {
-
-    private final String sModelPath;
-    private final String tModelPath;
-    private final Map<String, String> models = new TreeMap<>();
-
-    public SpecPacker(Specification os) {
-      String sModelPath = null;
-      String tModelPath = null;
-
-      for (int i = 0; i < os.getChildCount(); i++) {
-        SpecificationNode sn = os.getChild(i);
-
-        if (sn.getType().equals(OpenNlpExtractorConfig.NODE_SMODEL_PATH)) {
-          sModelPath = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_VALUE);
-        }
-        if (sn.getType().equals(OpenNlpExtractorConfig.NODE_TMODEL_PATH)) {
-          tModelPath = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_VALUE);
-        }
-        if (sn.getType().equals(OpenNlpExtractorConfig.NODE_FINDERMODEL)) {
-          final String parameterName = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_PARAMETERNAME);
-          final String modelFile = sn.getAttributeValue(OpenNlpExtractorConfig.ATTRIBUTE_MODELFILE);
-          models.put(parameterName, modelFile);
-        }
-
-      }
-      this.sModelPath = sModelPath;
-      this.tModelPath = tModelPath;
-    }
-
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-
-      // extract nouns
-      if (sModelPath != null)
-        sb.append(sModelPath);
-      sb.append(",");
-      if (tModelPath != null)
-        sb.append(tModelPath);
-      sb.append("[");
-      for (String parameterName : models.keySet()) {
-        sb.append(parameterName).append("=").append(models.get(parameterName)).append(",");
-      }
-
-      return sb.toString();
-    }
-
-    public String getSModelPath() {
-      return sModelPath;
-    }
-
-    public String getTModelPath() {
-      return tModelPath;
-    }
-
-    public Map<String, String> getFinderModels() {
-      return models;
-    }
-
-  }
-
-}
diff --git a/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/OpenNlpExtractorConfig.java b/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/OpenNlpExtractorConfig.java
deleted file mode 100644
index 9425f4e..0000000
--- a/connectors/opennlp/connector/src/main/java/org/apache/manifoldcf/agents/transformation/opennlp/OpenNlpExtractorConfig.java
+++ /dev/null
@@ -1,115 +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 org.apache.manifoldcf.agents.transformation.opennlp;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.File;
-import java.io.InputStream;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import opennlp.tools.namefind.NameFinderME;
-import opennlp.tools.namefind.TokenNameFinderModel;
-import opennlp.tools.sentdetect.SentenceDetector;
-import opennlp.tools.sentdetect.SentenceDetectorME;
-import opennlp.tools.sentdetect.SentenceModel;
-import opennlp.tools.tokenize.Tokenizer;
-import opennlp.tools.tokenize.TokenizerME;
-import opennlp.tools.tokenize.TokenizerModel;
-import opennlp.tools.util.InvalidFormatException;
-
-public class OpenNlpExtractorConfig
-{
-  
-  // Specification nodes and values
-  public static final String NODE_SMODEL_PATH = "SModelPath";
-  public static final String NODE_TMODEL_PATH = "TModelPath";
-  public static final String NODE_FINDERMODEL = "FinderModel";
-
-  public static final String ATTRIBUTE_VALUE = "value";
-  public static final String ATTRIBUTE_PARAMETERNAME = "parametername";
-  public static final String ATTRIBUTE_MODELFILE = "modelfile";
-    
-  private final static Map<File,SentenceModel> sModels = new HashMap<>();
-  private final static Map<File,TokenizerModel> tModels = new HashMap<>();
-  private final static Map<File,TokenNameFinderModel> tnfModels = new HashMap<>();
-    
-  protected static SentenceModel loadSModel(final File path) throws InvalidFormatException, FileNotFoundException, IOException {
-    synchronized (sModels) {
-      SentenceModel sd = sModels.get(path);
-      if (sd == null) {
-        final InputStream is = new FileInputStream(path);
-        try {
-          sd = new SentenceModel(is);
-        } finally {
-          is.close();
-        }
-        sModels.put(path, sd);
-      }
-      return sd;
-    }
-  }
-
-  protected static TokenizerModel loadTModel(final File path) throws InvalidFormatException, FileNotFoundException, IOException {
-    synchronized (tModels) {
-      TokenizerModel sd = tModels.get(path);
-      if (sd == null) {
-        final InputStream is = new FileInputStream(path);
-        try {
-          sd = new TokenizerModel(is);
-        } finally {
-          is.close();
-        }
-        tModels.put(path, sd);
-      }
-      return sd;
-    }
-  }
-  
-  protected static TokenNameFinderModel loadTnfModel(final File path) throws InvalidFormatException, FileNotFoundException, IOException {
-    synchronized (tnfModels) {
-      TokenNameFinderModel sd = tnfModels.get(path);
-      if (sd == null) {
-        final InputStream is = new FileInputStream(path);
-        try {
-          sd = new TokenNameFinderModel(is);
-        } finally {
-          is.close();
-        }
-        tnfModels.put(path, sd);
-      }
-      return sd;
-    }
-  }
-
-  public static final SentenceDetector sentenceDetector(File path) throws InvalidFormatException, FileNotFoundException, IOException{
-    return new SentenceDetectorME(loadSModel(path));
-  }
-    
-  public static final Tokenizer tokenizer(File path) throws InvalidFormatException, FileNotFoundException, IOException{
-    return new TokenizerME(loadTModel(path));
-  }
-    
-  public static final NameFinderME finder(File path) throws InvalidFormatException, FileNotFoundException, IOException{
-    return new NameFinderME(loadTnfModel(path));
-  }
-    
-
-}
diff --git a/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_en_US.properties b/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_en_US.properties
deleted file mode 100644
index bfcd944..0000000
--- a/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_en_US.properties
+++ /dev/null
@@ -1,31 +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.
-
-OpenNlpExtractor.OpenNLPTabName=OpenNlp Extraction
-OpenNlpExtractor.SelectOne=-- Select Model File --
-OpenNlpExtractor.SentenceDetectorModelPath=Sentence detector model:
-OpenNlpExtractor.TokenizerModelPath=Tokenizer model:
-OpenNlpExtractor.FinderModelList=Finder model list:
-OpenNlpExtractor.ParameterName=Parameter name
-OpenNlpExtractor.ModelFile=Model file
-OpenNlpExtractor.YouMustSpecifyASentenceModel=You must specify a sentence model
-OpenNlpExtractor.YouMustSpecifyATokenizationModel=You must specify a tokenization model
-OpenNlpExtractor.PleaseProvideAParameterName=Please provide a parameter name
-OpenNlpExtractor.PleaseSelectAModelFile=Please select a finder model file
-OpenNlpExtractor.Delete=Delete
-OpenNlpExtractor.Deletemodelnumber=Delete model #
-OpenNlpExtractor.NoModelsSpecified=No finder models specified
-OpenNlpExtractor.Add=Add
-OpenNlpExtractor.Addmodel=Add finder model
diff --git a/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_ja_JP.properties b/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_ja_JP.properties
deleted file mode 100644
index bfcd944..0000000
--- a/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_ja_JP.properties
+++ /dev/null
@@ -1,31 +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.
-
-OpenNlpExtractor.OpenNLPTabName=OpenNlp Extraction
-OpenNlpExtractor.SelectOne=-- Select Model File --
-OpenNlpExtractor.SentenceDetectorModelPath=Sentence detector model:
-OpenNlpExtractor.TokenizerModelPath=Tokenizer model:
-OpenNlpExtractor.FinderModelList=Finder model list:
-OpenNlpExtractor.ParameterName=Parameter name
-OpenNlpExtractor.ModelFile=Model file
-OpenNlpExtractor.YouMustSpecifyASentenceModel=You must specify a sentence model
-OpenNlpExtractor.YouMustSpecifyATokenizationModel=You must specify a tokenization model
-OpenNlpExtractor.PleaseProvideAParameterName=Please provide a parameter name
-OpenNlpExtractor.PleaseSelectAModelFile=Please select a finder model file
-OpenNlpExtractor.Delete=Delete
-OpenNlpExtractor.Deletemodelnumber=Delete model #
-OpenNlpExtractor.NoModelsSpecified=No finder models specified
-OpenNlpExtractor.Add=Add
-OpenNlpExtractor.Addmodel=Add finder model
diff --git a/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_zh_CN.properties b/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_zh_CN.properties
deleted file mode 100644
index bfcd944..0000000
--- a/connectors/opennlp/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/opennlp/common_zh_CN.properties
+++ /dev/null
@@ -1,31 +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.
-
-OpenNlpExtractor.OpenNLPTabName=OpenNlp Extraction
-OpenNlpExtractor.SelectOne=-- Select Model File --
-OpenNlpExtractor.SentenceDetectorModelPath=Sentence detector model:
-OpenNlpExtractor.TokenizerModelPath=Tokenizer model:
-OpenNlpExtractor.FinderModelList=Finder model list:
-OpenNlpExtractor.ParameterName=Parameter name
-OpenNlpExtractor.ModelFile=Model file
-OpenNlpExtractor.YouMustSpecifyASentenceModel=You must specify a sentence model
-OpenNlpExtractor.YouMustSpecifyATokenizationModel=You must specify a tokenization model
-OpenNlpExtractor.PleaseProvideAParameterName=Please provide a parameter name
-OpenNlpExtractor.PleaseSelectAModelFile=Please select a finder model file
-OpenNlpExtractor.Delete=Delete
-OpenNlpExtractor.Deletemodelnumber=Delete model #
-OpenNlpExtractor.NoModelsSpecified=No finder models specified
-OpenNlpExtractor.Add=Add
-OpenNlpExtractor.Addmodel=Add finder model
diff --git a/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/editSpecification.js b/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/editSpecification.js
deleted file mode 100644
index c57b326..0000000
--- a/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/editSpecification.js
+++ /dev/null
@@ -1,73 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SEQNUM}_AddModel()
-{
-  if (editjob.s${SEQNUM}_model_parametername.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenNlpExtractor.PleaseProvideAParameterName'))");
-    editjob.s${SEQNUM}_model_parametername.focus();
-    return;
-  }
-  if (editjob.s${SEQNUM}_model_modelfile.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenNlpExtractor.PleaseSelectAModelFile'))");
-    editjob.s${SEQNUM}_model_modelfile.focus();
-    return;
-  }
-  document.editjob.s${SEQNUM}_model_op.value="Add";
-  postFormSetAnchor("s${SEQNUM}_model_tag");
-}
-	
-function s${SEQNUM}_DeleteModel(n)
-{
-  eval("document.editjob.s${SEQNUM}_model_"+n+"_op.value = 'Delete'");
-  if (n == 0)
-    postFormSetAnchor("s${SEQNUM}_model_tag");
-  else
-    postFormSetAnchor("s${SEQNUM}_model_"+(n-1)+"_tag");
-}
-
-function s${SEQNUM}_checkSpecificationForSave()
-{
-  if (editjob.s${SEQNUM}_smodelpath.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenNlpExtractor.YouMustSpecifyASentenceModel'))");
-    SelectSequencedTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenNlpExtractor.OpenNLPTabName'))", ${SEQNUM});
-    editjob.s${SEQNUM}_smodelpath.focus();
-    return false;
-  }
-  if (editjob.s${SEQNUM}_tmodelpath.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenNlpExtractor.YouMustSpecifyATokenizationModel'))");
-    SelectSequencedTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenNlpExtractor.OpenNLPTabName'))", ${SEQNUM});
-    editjob.s${SEQNUM}_tmodelpath.focus();
-    return false;
-  }
-  return true;
-}
-
-function s${SEQNUM}_checkSpecification()
-{
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/editSpecification_OpenNLP.html b/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/editSpecification_OpenNLP.html
deleted file mode 100644
index 0b767cd..0000000
--- a/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/editSpecification_OpenNLP.html
+++ /dev/null
@@ -1,142 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('OpenNlpExtractor.OpenNLPTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SentenceDetectorModelPath'))</nobr></td>
-    <td class="value">
-      <select name="s${SEQNUM}_smodelpath" size="3">
-  #if($SMODELPATH == "")
-        <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SelectOne'))</option>
-  #else
-        <option value="">$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SelectOne'))</option>
-  #end
-  #foreach ($FILENAME in $FILENAMES)
-    #if($FILENAME == $SMODELPATH)
-        <option value="$Encoder.attributeEscape($FILENAME)" selected="true">$Encoder.bodyEscape($FILENAME)</option>
-    #else
-        <option value="$Encoder.attributeEscape($FILENAME)">$Encoder.bodyEscape($FILENAME)</option>
-    #end
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.TokenizerModelPath'))</nobr></td>
-    <td class="value">
-      <select name="s${SEQNUM}_tmodelpath" size="3">
-  #if($TMODELPATH == "")
-        <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SelectOne'))</option>
-  #else
-        <option value="">$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SelectOne'))</option>
-  #end
-  #foreach ($FILENAME in $FILENAMES)
-    #if($FILENAME == $TMODELPATH)
-        <option value="$Encoder.attributeEscape($FILENAME)" selected="true">$Encoder.bodyEscape($FILENAME)</option>
-    #else
-        <option value="$Encoder.attributeEscape($FILENAME)">$Encoder.bodyEscape($FILENAME)</option>
-    #end
-  #end
-      </select>
-    </td>
-  </tr>
-  
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.FinderModelList'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.ParameterName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.ModelFile'))</nobr></td>
-        </tr>
-  #set($modelcounter = 0)
-  #foreach($modelrecord in $MODELS)
-    #if(($modelcounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <a name="s${SEQNUM}_model_${modelcounter}_tag"/>
-            <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('OpenNlpExtractor.Delete'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('OpenNlpExtractor.Deletemodelnumber'))${modelcounter}" onclick='javascript:s${SEQNUM}_DeleteModel(${modelcounter});'/>
-            <input type="hidden" name="s${SEQNUM}_model_${modelcounter}_op" value="Continue"/>
-            <input type="hidden" name="s${SEQNUM}_model_${modelcounter}_parametername" value="$Encoder.attributeEscape($modelrecord.get('parametername'))"/>
-            <input type="hidden" name="s${SEQNUM}_model_${modelcounter}_modelfile" value="$Encoder.attributeEscape($modelrecord.get('modelfile'))"/>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($modelrecord.get('parametername'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($modelrecord.get('modelfile'))</nobr>
-          </td>
-        </tr>
-    #set($modelcounter = $modelcounter + 1)
-  #end
-  #if($modelcounter == 0)
-        <tr class="formrow"><td colspan="3" class="formcolumnmessage"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.NoModelsSpecified'))</nobr></td></tr>
-  #end
-        <tr class="formrow"><td colspan="3" class="formseparator"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <a name="s${SEQNUM}_model_tag"/>
-            <input type="hidden" name="s${SEQNUM}_model_op" value="Continue"/>
-            <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('OpenNlpExtractor.Add'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('OpenNlpExtractor.Addmodel'))" onclick="javascript:s${SEQNUM}_AddModel();"/>
-            <input type="hidden" name="s${SEQNUM}_model_count" value="${modelcounter}"/>
-          </td>
-          <td class="formcolumncell">
-            <input type="text" name="s${SEQNUM}_model_parametername" size="30" value=""/>
-          </td>
-          <td class="formcolumncell">
-            <select name="s${SEQNUM}_model_modelfile" size="3">
-              <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SelectOne'))</option>
-  #foreach ($FILENAME in $FILENAMES)
-              <option value="$Encoder.attributeEscape($FILENAME)">$Encoder.bodyEscape($FILENAME)</option>
-  #end
-            </select>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-
-</table>
-
-#else
-<input type="hidden" name="s${SEQNUM}_smodelpath" value="$Encoder.bodyEscape($SMODELPATH)"/>
-<input type="hidden" name="s${SEQNUM}_tmodelpath" value="$Encoder.bodyEscape($TMODELPATH)"/>
-
-  #set($modelcounter = 0)
-  #foreach($modelrecord in $MODELS)
-<input type="hidden" name="s${SEQNUM}_model_${modelcounter}_parametername" value="$Encoder.attributeEscape($modelrecord.get('parametername'))"/>
-<input type="hidden" name="s${SEQNUM}_model_${modelcounter}_modelfile" value="$Encoder.attributeEscape($modelrecord.get('modelfile'))"/>
-    #set($modelcounter = $modelcounter + 1)
-  #end
-<input type="hidden" name="s${SEQNUM}_model_count" value="${modelcounter}"/>
-#end
diff --git a/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/viewSpecification.html b/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/viewSpecification.html
deleted file mode 100644
index de28895..0000000
--- a/connectors/opennlp/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/opennlp/viewSpecification.html
+++ /dev/null
@@ -1,68 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.SentenceDetectorModelPath'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($SMODELPATH)</nobr></td>
-  </tr>
-
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.TokenizerModelPath'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($TMODELPATH)</nobr></td>
-  </tr>
-
-  <tr>
-    <td class="separator" colspan="2"><hr /></td>
-  </tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.FinderModelList'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.ParameterName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.ModelFile'))</nobr></td>
-        </tr>
-  #set($modelcounter = 0)
-  #foreach($modelrecord in $MODELS)
-    #if(($modelcounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($modelrecord.get('parametername'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($modelrecord.get('modelfile'))</nobr>
-          </td>
-        </tr>
-    #set($modelcounter = $modelcounter + 1)
-  #end
-  #if($modelcounter == 0)
-        <tr class="formrow"><td colspan="4" class="formcolumnmessage"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenNlpExtractor.NoModelsSpecified'))</nobr></td></tr>
-  #end
-      </table>
-    </td>
-  </tr>
-
-</table>
diff --git a/connectors/opennlp/download-models.sh b/connectors/opennlp/download-models.sh
deleted file mode 100644
index 356e9eb..0000000
--- a/connectors/opennlp/download-models.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-MODELS_DIR=nlpmodels
-
-if [ ! -d "$MODELS_DIR" ]; then
-  echo “$MODELS_DIR does not exist…”
-  echo “creating $MODELS_DIR …”
-  mkdir -p ${MODELS_DIR}
-fi
-
-echo “downloading models…”
-wget -O ${MODELS_DIR}/en-sent.bin http://opennlp.sourceforge.net/models-1.5/en-sent.bin
-wget -O ${MODELS_DIR}/en-token.bin http://opennlp.sourceforge.net/models-1.5/en-token.bin
-wget -O ${MODELS_DIR}/en-ner-person.bin http://opennlp.sourceforge.net/models-1.5/en-ner-person.bin
-wget -O ${MODELS_DIR}/en-ner-location.bin http://opennlp.sourceforge.net/models-1.5/en-ner-location.bin
-wget -O ${MODELS_DIR}/en-ner-organization.bin http://opennlp.sourceforge.net/models-1.5/en-ner-organization.bin
-echo “downloading finished…”
\ No newline at end of file
diff --git a/connectors/opennlp/pom.xml b/connectors/opennlp/pom.xml
deleted file mode 100644
index f900436..0000000
--- a/connectors/opennlp/pom.xml
+++ /dev/null
@@ -1,367 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-opennlp-connector</artifactId>
-  <name>ManifoldCF - Connectors - OpenNlp Extractor</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-          <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-          <execution>
-            <id>native2ascii-utf8</id>
-            <goals>
-              <goal>native2ascii</goal>
-            </goals>
-            <configuration>
-              <encoding>UTF8</encoding>
-              <includes>
-                <include>**/*.properties</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkMode>always</forkMode>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkMode>always</forkMode>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.opennlp</groupId>
-      <artifactId>opennlp-tools</artifactId>
-      <version>1.6.0</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/connectors/opensearchserver/.gitignore b/connectors/opensearchserver/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/opensearchserver/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/opensearchserver/build.xml b/connectors/opensearchserver/build.xml
deleted file mode 100644
index 74237ff..0000000
--- a/connectors/opensearchserver/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="opensearchserver" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="OpenSearchServer"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.opensearchserver.OpenSearchServerConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/Messages.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/Messages.java
deleted file mode 100644
index 8934f34..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.opensearchserver.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.opensearchserver";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerAction.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerAction.java
deleted file mode 100644
index 76a3825..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerAction.java
+++ /dev/null
@@ -1,44 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class OpenSearchServerAction extends OpenSearchServerConnection {
-
-  public enum CommandEnum {
-    optimize, reload;
-  }
-
-  public OpenSearchServerAction(HttpClient client, CommandEnum cmd, OpenSearchServerConfig config)
-      throws ManifoldCFException {
-    super(client, config);
-    StringBuffer url = getApiUrl("action");
-    url.append("&action=");
-    url.append(cmd.name());
-    HttpGet method = new HttpGet(url.toString());
-    call(method);
-    if ("OK".equals(checkXPath(xPathStatus)))
-      return;
-    setResult("XPATHEXCEPTION",Result.ERROR, checkXPath(xPathException));
-  }
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConfig.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConfig.java
deleted file mode 100644
index 7782c03..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConfig.java
+++ /dev/null
@@ -1,99 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-
-import java.util.Locale;
-
-public class OpenSearchServerConfig extends OpenSearchServerParam {
-
-  /**
-	 * 
-	 */
-  private static final long serialVersionUID = -2071296573398352538L;
-
-  /**
-   * Parameters used for the configuration
-   */
-  final private static ParameterEnum[] CONFIGURATIONLIST = {
-      ParameterEnum.SERVERLOCATION, ParameterEnum.INDEXNAME,
-      ParameterEnum.USERNAME, ParameterEnum.APIKEY, ParameterEnum.SCHEDULERJOB };
-
-  /**
-   * Build a set of OpenSearchServerParameters by reading ConfigParams. If the
-   * value returned by ConfigParams.getParameter is null, the default value is
-   * set.
-   * 
-   * @param paramList
-   * @param params
-   */
-  public OpenSearchServerConfig(ConfigParams params) {
-    super(CONFIGURATIONLIST);
-    for (ParameterEnum param : CONFIGURATIONLIST) {
-      String value = params.getParameter(param.name());
-      if (value == null)
-        value = param.defaultValue;
-      put(param, value);
-    }
-  }
-
-  /**
-   * 
-   * @return a unique identifier for one index on one OpenSearchServer instance.
-   */
-  public String getUniqueIndexIdentifier() {
-    StringBuffer sb = new StringBuffer();
-    sb.append(getServerLocation());
-    if (sb.charAt(sb.length() - 1) != '/')
-      sb.append('/');
-    sb.append(getIndexName());
-    return sb.toString();
-  }
-
-  public final static void contextToConfig(IPostParameters variableContext,
-      ConfigParams parameters) {
-    for (ParameterEnum param : CONFIGURATIONLIST) {
-      String p = variableContext.getParameter(param.name().toLowerCase(Locale.ROOT));
-      if (p != null)
-        parameters.setParameter(param.name(), p);
-    }
-  }
-
-  final public String getServerLocation() {
-    return get(ParameterEnum.SERVERLOCATION);
-  }
-
-  final public String getIndexName() {
-    return get(ParameterEnum.INDEXNAME);
-  }
-
-  final public String getUserName() {
-    return get(ParameterEnum.USERNAME);
-  }
-
-  final public String getApiKey() {
-    return get(ParameterEnum.APIKEY);
-  }
-  
- final public String getSchedulerJob() {
-    return get(ParameterEnum.SCHEDULERJOB);
-  }
-  
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnection.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnection.java
deleted file mode 100644
index 4273c82..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnection.java
+++ /dev/null
@@ -1,339 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.Writer;
-import java.io.StringWriter;
-import java.io.Reader;
-import java.io.InputStreamReader;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Locale;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.entity.ContentType;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-import org.apache.http.ParseException;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.w3c.dom.Document;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-public class OpenSearchServerConnection {
-
-  private String serverLocation;
-
-  private String indexName;
-
-  private String userName;
-
-  private String apiKey;
-
-  private String resultDescription;
-
-  private String callUrlSnippet;
-
-  private String response;
-
-  private Document xmlResponse;
-
-  private HttpClient httpClient;
-  
-  protected String xPathStatus = "/response/entry[@key='Status']/text()";
-  protected String xPathException = "/response/entry[@key='Exception']/text()";
-
-  public enum Result {
-    OK, ERROR, UNKNOWN;
-  }
-
-  private Result result;
-
-  private String resultCode;
-    
-  protected OpenSearchServerConnection(HttpClient client, OpenSearchServerConfig config) {
-    this.httpClient = client;
-    result = Result.UNKNOWN;
-    response = null;
-    xmlResponse = null;
-    resultDescription = "";
-    callUrlSnippet = null;
-    serverLocation = config.getServerLocation();
-    indexName = config.getIndexName();
-    userName = config.getUserName();
-    apiKey = config.getApiKey();
-  }
-
-  protected StringBuffer getApiUrl(String command) throws ManifoldCFException {
-    StringBuffer url = new StringBuffer(serverLocation);
-    if (!serverLocation.endsWith("/"))
-      url.append('/');
-    url.append(command);
-    url.append("?use=");
-    url.append(URLEncoder.encode(indexName));
-    callUrlSnippet = url.toString();
-    if (userName != null && apiKey != null && userName.length() > 0
-        && apiKey.length() > 0) {
-      url.append("&login=");
-      url.append(URLEncoder.encode(userName));
-      url.append("&key=");
-      url.append(apiKey);
-    }
-    return url;
-  }
-
-  protected StringBuffer getApiUrlV2(String path) throws ManifoldCFException {
-    StringBuffer url = new StringBuffer(serverLocation);
-    if (!serverLocation.endsWith("/"))
-        url.append('/');
-    url.append(path);
-    callUrlSnippet = url.toString();
-    if (userName != null && apiKey != null && userName.length() > 0
-        && apiKey.length() > 0) {
-      url.append("&login=");
-      url.append(URLEncoder.encode(userName));
-      url.append("&key=");
-      url.append(apiKey);
-    }
-    return url;
-  }
-
-  protected static class CallThread extends Thread
-  {
-    protected final HttpClient client;
-    protected final HttpRequestBase method;
-    protected int resultCode = -1;
-    protected String response = null;
-    protected Throwable exception = null;
-    
-    public CallThread(HttpClient client, HttpRequestBase method)
-    {
-      this.client = client;
-      this.method = method;
-      setDaemon(true);
-    }
-    
-    @Override
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          HttpResponse resp = client.execute(method);
-          resultCode = resp.getStatusLine().getStatusCode();
-          HttpEntity entity = resp.getEntity();
-          response = EntityUtils.toString(entity, StandardCharsets.UTF_8);
-        }
-        finally
-        {
-          method.abort();
-        }
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        exception = e;
-      }
-      catch (InterruptedIOException e)
-      {
-        // Just exit
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public int getResultCode()
-    {
-      return resultCode;
-    }
-    
-    public String getResponse()
-    {
-      return response;
-    }
-    
-    public void finishUp()
-      throws InterruptedException, HttpException, IOException
-    {
-      join();
-      Throwable t = exception;
-      if (t != null)
-      {
-        if (t instanceof HttpException)
-          throw (HttpException)t;
-        else if (t instanceof IOException)
-          throw (IOException)t;
-        else if (t instanceof RuntimeException)
-          throw (RuntimeException)t;
-        else if (t instanceof Error)
-          throw (Error)t;
-        else
-          throw new RuntimeException("Unexpected exception thrown: "+t.getMessage(),t);
-      }
-    }
-  }
-  
-  protected void call(HttpRequestBase method) throws ManifoldCFException
-  {
-    CallThread ct = new CallThread(httpClient, method);
-    try
-    {
-      ct.start();
-      try
-      {
-        ct.finishUp();
-        
-        if (!checkResultCode(ct.getResultCode()))
-          throw new ManifoldCFException(getResultDescription());
-        response = ct.getResponse();
-      }
-      catch (InterruptedException e)
-      {
-        ct.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-      throw new ManifoldCFException("SocketTimeoutException while calling " + method.getURI() +": " + e.getMessage(), e);
-    }
-    catch (InterruptedIOException e)
-    {
-      setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    }
-    catch (HttpException e)
-    {
-      setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-      throw new ManifoldCFException("HttpException while calling " + method.getURI() +": " + e.getMessage(), e);
-    }
-    catch (IOException e)
-    {
-      setResult(e.getClass().getSimpleName().toUpperCase(Locale.ROOT),Result.ERROR, e.getMessage());
-      throw new ManifoldCFException("IOException while calling " + method.getURI() +": " + e.getMessage(), e);
-    }
-  }
-
-  private void readXmlResponse() throws ManifoldCFException {
-    if (xmlResponse != null)
-      return;
-    StringReader sw = null;
-    try {
-      sw = new StringReader(response);
-      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-      dbf.setNamespaceAware(true); // never forget this!
-      DocumentBuilder builder;
-      builder = dbf.newDocumentBuilder();
-      xmlResponse = builder.parse(new InputSource(sw));
-    } catch (ParserConfigurationException e) {
-      throw new ManifoldCFException(e);
-    } catch (SAXException e) {
-      throw new ManifoldCFException(e);
-    } catch (IOException e) {
-      throw new ManifoldCFException(e);
-    } finally {
-      if (sw != null) {
-        sw.close();
-      }
-    }
-  }
-
-  protected String checkXPath(String xPathQuery) throws ManifoldCFException {
-    try {
-      readXmlResponse();
-      XPathFactory factory = XPathFactory.newInstance();
-      XPath xpath = factory.newXPath();
-      XPathExpression xPathExpr = xpath.compile(xPathQuery);
-      return xPathExpr.evaluate(xmlResponse);
-    } catch (XPathExpressionException e) {
-      throw new ManifoldCFException(e);
-    }
-  }
-
-  protected void setResult(String resultCode,Result res, String desc) {
-    if (res != null)
-      result = res;
-    if (desc != null)
-      if (desc.length() > 0)
-        resultDescription = desc;
-    setResultCode(resultCode);
-  }
-
-  public String getResultDescription() {
-    return resultDescription;
-  }
-
-  protected String getResponse() {
-    return response;
-  }
-
-  private boolean checkResultCode(int code) {
-    switch (code) {
-    case 0:
-      setResult(IOutputHistoryActivity.HTTP_ERROR,Result.UNKNOWN, null);
-      return false;
-    case 200:
-      setResult("OK",Result.OK, null);
-      return true;
-    case 404:
-      setResult(IOutputHistoryActivity.HTTP_ERROR,Result.ERROR, "Server/page not found");
-      return false;
-    default:
-      setResult(IOutputHistoryActivity.HTTP_ERROR,Result.ERROR, null);
-      return false;
-    }
-  }
-
-  public Result getResult() {
-    return result;
-  }
-
-  public String getCallUrlSnippet() {
-    return callUrlSnippet;
-  }
-
-  public void setResultCode(String resultCode){ this.resultCode = resultCode; }
-
-  public String getResultCode(){ return resultCode; }
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
deleted file mode 100644
index 7a6b517..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
+++ /dev/null
@@ -1,406 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputNotifyActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputCheckActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.agents.output.BaseOutputConnector;
-import org.apache.manifoldcf.agents.output.opensearchserver.OpenSearchServerConnection.Result;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-
-public class OpenSearchServerConnector extends BaseOutputConnector
-{
-
-  private final static String OPENSEARCHSERVER_INDEXATION_ACTIVITY = "Indexation";
-  private final static String OPENSEARCHSERVER_DELETION_ACTIVITY = "Deletion";
-  private final static String OPENSEARCHSERVER_SCHEDULER_ACTIVITY = "Scheduler";
-
-  private final static String[] OPENSEARCHSERVER_ACTIVITIES = {
-      OPENSEARCHSERVER_INDEXATION_ACTIVITY, OPENSEARCHSERVER_DELETION_ACTIVITY,
-      OPENSEARCHSERVER_SCHEDULER_ACTIVITY };
-
-  // Tab resources
-
-  private final static String OPENSEARCHSERVER_TAB_MESSAGE = "OpenSearchServerConnector.OpenSearchServer";
-  private final static String PARAMETERS_TAB_MESSAGE = "OpenSearchServerConnector.Parameters";
-
-  // Velocity templates
-  // These are not broken down by tabs because the design of this connector makes it difficult to do it that way.
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIG_FORWARD = "editConfiguration.html";
-
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-  /** Connection expiration interval */
-  private static final long EXPIRATION_INTERVAL = 60000L;
-
-  private HttpClientConnectionManager connectionManager = null;
-  private HttpClient client = null;
-  private long expirationTime = -1L;
-
-  public OpenSearchServerConnector()
-  {
-  }
-
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-  }
-
-  protected HttpClient getSession()
-      throws ManifoldCFException
-  {
-    if (client == null)
-    {
-      final int executorTimeout = 300000;
-      final int socketTimeout = 60000;
-      final int connectionTimeout = 60000;
-
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      connectionManager = poolingConnectionManager;
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true).setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(true)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-
-      HttpClientBuilder clientBuilder = HttpClients
-          .custom()
-          .setConnectionManager(connectionManager)
-          .disableAutomaticRetries()
-          .setDefaultRequestConfig(requestBuilder.build())
-          .setRequestExecutor(new HttpRequestExecutor(executorTimeout));
-
-      client = clientBuilder.build();
-
-    }
-    expirationTime = System.currentTimeMillis() + EXPIRATION_INTERVAL;
-    return client;
-  }
-
-  protected void closeSession()
-  {
-    if (connectionManager != null)
-    {
-      connectionManager.shutdown();
-      connectionManager = null;
-    }
-    client = null;
-    expirationTime = -1L;
-  }
-
-  @Override
-  public void disconnect()
-      throws ManifoldCFException
-  {
-    super.disconnect();
-    closeSession();
-  }
-
-  @Override
-  public void poll()
-      throws ManifoldCFException
-  {
-    super.poll();
-    if (connectionManager != null)
-    {
-      if (System.currentTimeMillis() > expirationTime)
-      {
-        closeSession();
-      }
-    }
-  }
-
-  /**
-   * This method is called to assess whether to count this connector instance should
-   * actually be counted as being connected.
-   *
-   * @return true if the connector instance is actually connected.
-   */
-  @Override
-  public boolean isConnected()
-  {
-    return connectionManager != null;
-  }
-
-  @Override
-  public String[] getActivitiesList()
-  {
-    return OPENSEARCHSERVER_ACTIVITIES;
-  }
-
-  /**
-   * Read the content of a resource, replace the variable ${PARAMNAME} with the
-   * value and copy it to the out.
-   * 
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException
-   */
-  private static void outputResource(String resName, IHTTPOutput out,
-      Locale locale, OpenSearchServerParam params, String tabName,
-      Integer sequenceNumber, Integer actualSequenceNumber)
-      throws ManifoldCFException
-  {
-    Map<String, String> paramMap = null;
-    if (params != null)
-    {
-      paramMap = params.buildMap();
-      if (tabName != null)
-      {
-        paramMap.put("TabName", tabName);
-      }
-      if (actualSequenceNumber != null)
-        paramMap.put("SelectedNum", actualSequenceNumber.toString());
-    }
-    else
-    {
-      paramMap = new HashMap<String, String>();
-    }
-    if (sequenceNumber != null)
-      paramMap.put("SeqNum", sequenceNumber.toString());
-
-    Messages.outputResourceWithVelocity(out, locale, resName, paramMap, false);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray)
-      throws ManifoldCFException, IOException
-  {
-    super.outputConfigurationHeader(threadContext, out, locale, parameters,
-        tabsArray);
-    tabsArray.add(Messages.getString(locale, PARAMETERS_TAB_MESSAGE));
-    outputResource(EDIT_CONFIG_HEADER_FORWARD, out, locale, null, null, null,
-        null);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-      throws ManifoldCFException, IOException
-  {
-    super.outputConfigurationBody(threadContext, out, locale, parameters,
-        tabName);
-    OpenSearchServerConfig config = this.getConfigParameters(parameters);
-    outputResource(EDIT_CONFIG_FORWARD, out, locale, config, tabName, null,
-        null);
-  }
-
-  /**
-   * Build a Set of OpenSearchServer parameters. If configParams is null,
-   * getConfiguration() is used.
-   * 
-   * @param configParams
-   */
-  final private OpenSearchServerConfig getConfigParameters(
-      ConfigParams configParams)
-  {
-    if (configParams == null)
-      configParams = getConfiguration();
-    return new OpenSearchServerConfig(configParams);
-  }
-
-  @Override
-  public VersionContext getPipelineDescription(Specification os)
-      throws ManifoldCFException
-  {
-    return new VersionContext("", params, os);
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException
-  {
-    outputResource(VIEW_CONFIG_FORWARD, out, locale,
-        getConfigParameters(parameters), null, null, null);
-  }
-
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, ConfigParams parameters)
-      throws ManifoldCFException
-  {
-    OpenSearchServerConfig.contextToConfig(variableContext, parameters);
-    return null;
-  }
-
-  // Apparently, only one connection to any given Open Search Server instance is allowed at a time.
-  
-  private static Map<String, Integer> ossInstances = new TreeMap<String, Integer>();
-
-  private final Integer addInstance(OpenSearchServerConfig config)
-  {
-    synchronized (ossInstances)
-    {
-      String uii = config.getUniqueIndexIdentifier();
-      Integer count = ossInstances.get(uii);
-      if (count == null)
-      {
-        count = new Integer(1);
-        ossInstances.put(uii, count);
-      }
-      else
-        count++;
-      return count;
-    }
-  }
-
-  private final void removeInstance(OpenSearchServerConfig config)
-  {
-    synchronized (ossInstances)
-    {
-      String uii = config.getUniqueIndexIdentifier();
-      Integer count = ossInstances.get(uii);
-      if (count == null)
-        return;
-      if (--count == 0)
-        ossInstances.remove(uii);
-    }
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription,
-      RepositoryDocument document, String authorityNameString,
-      IOutputAddActivity activities)
-      throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    HttpClient client = getSession();
-    OpenSearchServerConfig config = getConfigParameters(null);
-
-    Integer count = addInstance(config);
-    synchronized (count)
-    {
-      try
-      {
-        long startTime = System.currentTimeMillis();
-        OpenSearchServerIndex oi = new OpenSearchServerIndex(client,
-            documentURI, config, document, authorityNameString, activities);
-        activities.recordActivity(startTime,
-            OPENSEARCHSERVER_INDEXATION_ACTIVITY, document.getBinaryLength(),
-            documentURI, oi.getResultCode(), oi.getResultDescription());
-        if (oi.getResult() != Result.OK)
-          return DOCUMENTSTATUS_REJECTED;
-      }
-      finally
-      {
-        removeInstance(config);
-      }
-      return DOCUMENTSTATUS_ACCEPTED;
-    }
-  }
-
-  @Override
-  public void removeDocument(String documentURI, String outputDescription,
-      IOutputRemoveActivity activities)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    HttpClient client = getSession();
-    long startTime = System.currentTimeMillis();
-    OpenSearchServerDelete od = new OpenSearchServerDelete(client, documentURI,
-        getConfigParameters(null));
-    activities.recordActivity(startTime, OPENSEARCHSERVER_DELETION_ACTIVITY,
-        null, documentURI, od.getResultCode(), od.getResultDescription());
-  }
-
-  @Override
-  public String check()
-      throws ManifoldCFException
-  {
-    HttpClient client = getSession();
-    OpenSearchServerSchema oss = new OpenSearchServerSchema(client,
-        getConfigParameters(null));
-    return oss.getResult().name() + " " + oss.getResultDescription();
-  }
-
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    HttpClient client = getSession();
-    long startTime = System.currentTimeMillis();
-    OpenSearchServerConfig config = getConfigParameters(null);
-    String schedulerJob = config.getSchedulerJob();
-    if (schedulerJob != null && schedulerJob.trim().length() > 0)
-    {
-      OpenSearchServerScheduler oo = new OpenSearchServerScheduler(client,
-          getConfigParameters(null), schedulerJob.trim());
-      activities.recordActivity(startTime, OPENSEARCHSERVER_SCHEDULER_ACTIVITY,
-          null, oo.getCallUrlSnippet(), oo.getResultCode(),
-          oo.getResultDescription());
-    }
-  }
-
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerDelete.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerDelete.java
deleted file mode 100644
index 7e02332..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerDelete.java
+++ /dev/null
@@ -1,41 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-public class OpenSearchServerDelete extends OpenSearchServerConnection {
-
-  public OpenSearchServerDelete(HttpClient client, String documentURI,
-      OpenSearchServerConfig config) throws ManifoldCFException {
-    super(client, config);
-    StringBuffer url = getApiUrl("delete");
-    url.append("&uniq=");
-    url.append(URLEncoder.encode(documentURI));
-    HttpGet method = new HttpGet(url.toString());
-    call(method);
-    if ("OK".equals(checkXPath(xPathStatus)))
-      return;
-    setResult("XPATHEXCEPTION",Result.ERROR, checkXPath(xPathException));
-  }
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerIndex.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerIndex.java
deleted file mode 100644
index 8e90d36..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerIndex.java
+++ /dev/null
@@ -1,321 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.util.EntityUtils;
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.common.Base64;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class OpenSearchServerIndex extends OpenSearchServerConnection
-{
-
-  private static class Acls
-  {
-    private String[] acls = null;
-    private String[] denyAcls = null;
-    private String[] shareAcls = null;
-    private String[] shareDenyAcls = null;
-
-    private void setDocument(String[] acls, String[] denyAcls)
-    {
-      this.acls = acls;
-      this.denyAcls = denyAcls;
-    }
-
-    private void setShare(String[] acls, String[] denyAcls)
-    {
-      this.shareAcls = acls;
-      this.shareDenyAcls = denyAcls;
-    }
-  }
-
-  private static class IndexRequestEntity implements HttpEntity
-  {
-
-    private final String documentURI;
-    private final RepositoryDocument document;
-    private final String fileName;
-    private final Acls acls;
-
-    public IndexRequestEntity(String documentURI, RepositoryDocument document,
-        Acls acls)
-    {
-      this.documentURI = documentURI;
-      this.document = document;
-      this.fileName = FilenameUtils.getName(documentURI);
-      this.acls = acls;
-    }
-
-    @Override
-    public boolean isChunked()
-    {
-      return false;
-    }
-
-    @Override
-    @Deprecated
-    public void consumeContent()
-        throws IOException
-    {
-      EntityUtils.consume(this);
-    }
-
-    @Override
-    public boolean isRepeatable()
-    {
-      return false;
-    }
-
-    @Override
-    public boolean isStreaming()
-    {
-      return true;
-    }
-
-    @Override
-    public InputStream getContent()
-        throws IOException, IllegalStateException
-    {
-      return null;
-    }
-
-    private static final void writeFieldCdata(String fieldName,
-        Collection<String> values, PrintWriter pw)
-    {
-      if (CollectionUtils.isEmpty(values))
-        return;
-      pw.print("<field name=\"");
-      pw.print(StringEscapeUtils.escapeXml(fieldName));
-      pw.print("\">");
-      for (String value : values)
-      {
-        pw.print("<value><![CDATA[");
-        pw.print(value);
-        pw.print("]]></value>");
-      }
-      pw.println("</field>");
-    }
-
-    private static final void writeField(String fieldName, String value,
-        PrintWriter pw)
-    {
-      if (StringUtils.isEmpty(value))
-        return;
-      pw.print("<field name=\"");
-      pw.print(fieldName);
-      pw.print("\"><value>");
-      pw.print(value);
-      pw.println("</value></field>");
-    }
-
-    private static final void writeFieldValues(String fieldName,
-        String[] values, PrintWriter pw)
-    {
-      if (values == null || values.length == 0)
-        return;
-      pw.print("<field name=\"");
-      pw.print(fieldName);
-      pw.println("\">");
-      for (String value : values)
-      {
-        pw.print("<value>");
-        pw.print(value);
-        pw.println("</value>");
-      }
-      pw.println("</field>");
-    }
-
-    @Override
-    public void writeTo(OutputStream out)
-        throws IOException
-    {
-      PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8), false);
-      try
-      {
-        pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
-        pw.println("<index>);");
-        pw.print("<document>");
-        List<String> values = new ArrayList<String>(1);
-        Iterator<String> iter = document.getFields();
-        if (iter != null)
-        {
-          while (iter.hasNext())
-          {
-            String fieldName = iter.next();
-            if ("uri".equals(fieldName))
-              continue;
-            Object[] fieldValues = document.getField(fieldName);
-            if (fieldValues != null && fieldValues.length > 0)
-            {
-              values.clear();
-              for (Object fieldValue : fieldValues)
-                if (fieldValue != null)
-                  values.add(fieldValue.toString());
-              writeFieldCdata(fieldName, values, pw);
-            }
-          }
-        }
-        writeField("uri", documentURI, pw);
-        if (document.getBinaryLength() > 0)
-        {
-          Base64 base64 = new Base64();
-          pw.print("<binary fileName=\"");
-          pw.print(fileName);
-          pw.println("\">");
-          base64.encodeStream(document.getBinaryStream(), pw);
-          pw.println("</binary>");
-        }
-        if (acls != null)
-        {
-          writeFieldValues("userAllow", acls.acls, pw);
-          writeFieldValues("userDeny", acls.denyAcls, pw);
-          writeFieldValues("groupAllow", acls.shareAcls, pw);
-          writeFieldValues("groupDeny", acls.shareDenyAcls, pw);
-        }
-        pw.println("</document>");
-        pw.println("</index>");
-      }
-      catch (ManifoldCFException e)
-      {
-        throw new IOException(e.getMessage(), e);
-      }
-      finally
-      {
-        IOUtils.closeQuietly(pw);
-      }
-    }
-
-    @Override
-    public long getContentLength()
-    {
-      // Unknown (chunked) length
-      return -1L;
-    }
-
-    @Override
-    public Header getContentType()
-    {
-      return new BasicHeader("Content-type", "text/xml; charset=utf-8");
-    }
-
-    @Override
-    public Header getContentEncoding()
-    {
-      return null;
-    }
-  }
-
-  /**
-   * Convert an unqualified ACL to qualified form.
-   * 
-   * @param acl
-   *          is the initial, unqualified ACL.
-   * @param authorityNameString
-   *          is the name of the governing authority for this document's acls,
-   *          or null if none.
-   * @param activities
-   *          is the activities object, so we can report what's happening.
-   * @return the modified ACL.
-   */
-  protected static String[] convertACL(String[] acl,
-      String authorityNameString, IOutputAddActivity activities)
-      throws ManifoldCFException
-  {
-    if (acl != null)
-    {
-      String[] rval = new String[acl.length];
-      int i = 0;
-      while (i < rval.length)
-      {
-        rval[i] = activities.qualifyAccessToken(authorityNameString, acl[i]);
-        i++;
-      }
-      return rval;
-    }
-    return new String[0];
-  }
-
-  public OpenSearchServerIndex(HttpClient client, String documentURI,
-      OpenSearchServerConfig config, RepositoryDocument document,
-      String authorityNameString, IOutputAddActivity activities)
-      throws ManifoldCFException
-  {
-    super(client, config);
-
-    Acls acls = new Acls();
-    Iterator<String> a = document.securityTypesIterator();
-    if (a != null)
-    {
-      while (a.hasNext())
-      {
-        String securityType = a.next();
-        String[] convertedAcls = convertACL(
-            document.getSecurityACL(securityType), authorityNameString,
-            activities);
-        String[] convertedDenyAcls = convertACL(
-            document.getSecurityDenyACL(securityType), authorityNameString,
-            activities);
-        if (securityType.equals(RepositoryDocument.SECURITY_TYPE_DOCUMENT))
-        {
-          acls.setDocument(convertedAcls, convertedDenyAcls);
-        }
-        else if (securityType.equals(RepositoryDocument.SECURITY_TYPE_SHARE))
-        {
-          acls.setShare(convertedAcls, convertedDenyAcls);
-        }
-        else
-        {
-          // Don't know how to deal with it
-          setResult(activities.UNKNOWN_SECURITY,Result.ERROR, "Unhandled security type: " + securityType);
-          return;
-        }
-      }
-    }
-
-    StringBuffer url = getApiUrl("update");
-    HttpPut put = new HttpPut(url.toString());
-    put.setEntity(new IndexRequestEntity(documentURI, document, acls));
-    call(put);
-    if ("OK".equals(checkXPath(xPathStatus)))
-      return;
-    String error = checkXPath(xPathException);
-    setResult("XPATHEXCEPTION",Result.ERROR, error);
-    throw new ManifoldCFException("Error, unexpected response: " + error);
-  }
-
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerParam.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerParam.java
deleted file mode 100644
index c3d1dbb..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerParam.java
+++ /dev/null
@@ -1,85 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.manifoldcf.agents.output.opensearchserver.OpenSearchServerParam.ParameterEnum;
-
-public class OpenSearchServerParam extends HashMap<ParameterEnum, String> {
-
-  /**
-   * Parameters constants
-   */
-  public enum ParameterEnum {
-    SERVERLOCATION("http://localhost:8080/"),
-
-    INDEXNAME("index"),
-
-    USERNAME(""),
-
-    APIKEY(""),
-    
-    SCHEDULERJOB(""),
-
-    FIELDLIST(""),
-
-    MAXFILESIZE("16777216"),
-
-    MIMETYPES(
-        "application/msword\n"
-            + "application/vnd.ms-excel\n"
-            + "application/vnd.openxmlformats-officedocument.wordprocessingml.document\n"
-            + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n"
-            + "text/html\n"
-            + "application/pdf\n"
-            + "application/vnd.ms-powerpoint\n"
-            + "application/vnd.openxmlformats-officedocument.presentationml.presentation\n"
-            + "application/vnd.oasis.opendocument.text\n"
-            + "application/vnd.oasis.opendocument.spreadsheet\n"
-            + "application/vnd.oasis.opendocument.formula\n"
-            + "application/rtf\n" + "text/plain\n" + "audio/mpeg\n"
-            + "audio/x-wav\n" + "audio/ogg\n" + "audio/flac\n"
-            + "application/x-bittorrent"),
-
-    EXTENSIONS("doc\n" + "docx\n" + "xls\n" + "xlsx\n" + "ppt\n" + "pptx\n"
-        + "html\n" + "pdf\n" + "odt\n" + "ods\n" + "rtf\n" + "txt\n" + "mp3\n"
-        + "mp4\n" + "wav\n" + "ogg\n" + "flac\n" + "torrent");
-
-    final protected String defaultValue;
-
-    private ParameterEnum(String defaultValue) {
-      this.defaultValue = defaultValue;
-    }
-  }
-
-  private static final long serialVersionUID = -1593234685772720029L;
-
-  protected OpenSearchServerParam(ParameterEnum[] params) {
-    super(params.length);
-  }
-
-  final public Map<String,String> buildMap() {
-    Map<String,String> rval = new HashMap<String,String>();
-    for (Map.Entry<ParameterEnum, String> entry : this.entrySet())
-      rval.put(entry.getKey().name(), entry.getValue());
-    return rval;
-  }
-  
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerScheduler.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerScheduler.java
deleted file mode 100644
index 6a54add..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerScheduler.java
+++ /dev/null
@@ -1,64 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.HttpEntity;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.Header;
-import org.apache.http.util.EntityUtils;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.core.common.Base64;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-public class OpenSearchServerScheduler extends OpenSearchServerConnection {
-
-  private final static String PATH = "services/rest/index/{index_name}/scheduler/{scheduler_name}/run";
-  
-  public OpenSearchServerScheduler(HttpClient client, OpenSearchServerConfig config, String schedulerName)
-    throws ManifoldCFException {
-    super(client, config);
-    String path = StringUtils.replace(PATH, "{index_name}", URLEncoder.encode(config.getIndexName()));
-    path = StringUtils.replace(path, "{scheduler_name}", URLEncoder.encode(schedulerName));
-    StringBuffer url = getApiUrlV2(path);
-    HttpPut put = new HttpPut(url.toString());
-    put.setEntity(new StringEntity("{}", ContentType.APPLICATION_JSON));
-    call(put);
-  }
-
-}
diff --git a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerSchema.java b/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerSchema.java
deleted file mode 100644
index b646925..0000000
--- a/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerSchema.java
+++ /dev/null
@@ -1,41 +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 org.apache.manifoldcf.agents.output.opensearchserver;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class OpenSearchServerSchema extends OpenSearchServerConnection {
-
-  public OpenSearchServerSchema(HttpClient client, OpenSearchServerConfig config)
-      throws ManifoldCFException {
-    super(client, config);
-    String indexName = config.getIndexName();
-    StringBuffer url = getApiUrl("schema");
-    url.append("&cmd=indexList");
-    HttpGet method = new HttpGet(url.toString());
-    String xpath = "count(/response/index[@name='" + indexName + "'])";
-    call(method);
-    if ("1".equals(checkXPath(xpath)))
-      return;
-    setResult("INDEXNOTFOUND",Result.ERROR, "Index not found");
-  }
-}
diff --git a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_en_US.properties b/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_en_US.properties
deleted file mode 100644
index 3055d2e..0000000
--- a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_en_US.properties
+++ /dev/null
@@ -1,33 +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.
-
-OpenSearchServerConnector.Parameters=Parameters
-
-OpenSearchServerConnector.ServerLocation=Server location
-OpenSearchServerConnector.URLColon=(URL):
-OpenSearchServerConnector.ServerLocationColon=Server location:
-OpenSearchServerConnector.IndexNameColon=Index name:
-OpenSearchServerConnector.UserNameColon=User name:
-OpenSearchServerConnector.APIKeyColon=API key:
-OpenSearchServerConnector.SchedulerJob=Final scheduler job:
-
-OpenSearchServerConnector.PleaseSupplyValidLocation=Please supply a valid OpenSearchServer server location
-OpenSearchServerConnector.PleaseSupplyValidIndexName=Please supply a valid index name
-
-OpenSearchServerConnector.OpenSearchServer=OpenSearchServer
-
-OpenSearchServerConnector.MaxFileSizeBytesColon=Max file size (bytes):
-OpenSearchServerConnector.AllowedMIMETypesColon=Allowed MIME types:
-OpenSearchServerConnector.AllowedFileExtensionsColon=Allowed file extensions:
diff --git a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_es_ES.properties b/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_es_ES.properties
deleted file mode 100644
index 00fdbe3..0000000
--- a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_es_ES.properties
+++ /dev/null
@@ -1,33 +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.
-
-OpenSearchServerConnector.Parameters=Parámetros
-
-OpenSearchServerConnector.ServerLocation=ubicación del servidor
-OpenSearchServerConnector.URLColon=(URL):
-OpenSearchServerConnector.ServerLocationColon=ubicación del servidor:
-OpenSearchServerConnector.IndexNameColon=El nombre de índice:
-OpenSearchServerConnector.UserNameColon=Nombre de usuario:
-OpenSearchServerConnector.APIKeyColon=clave de la API:
-OpenSearchServerConnector.SchedulerJob=Trabajo de planificador final:
-
-OpenSearchServerConnector.PleaseSupplyValidLocation=Por favor suministre una posición de Servidor válida Abierta De búsqueda
-OpenSearchServerConnector.PleaseSupplyValidIndexName=Por favor proporcione un nombre de índice válido
-
-OpenSearchServerConnector.OpenSearchServer=Servidor Abierto De búsqueda
-
-OpenSearchServerConnector.MaxFileSizeBytesColon=Tamaño máximo de archivo (bytes):
-OpenSearchServerConnector.AllowedMIMETypesColon=Tipos MIME permitidos:
-OpenSearchServerConnector.AllowedFileExtensionsColon=Extensiones de archivo permitidos:
diff --git a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_ja_JP.properties b/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_ja_JP.properties
deleted file mode 100644
index 547ac1f..0000000
--- a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_ja_JP.properties
+++ /dev/null
@@ -1,32 +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.
-
-OpenSearchServerConnector.Parameters=引数
-
-OpenSearchServerConnector.ServerLocation=サーバ
-OpenSearchServerConnector.URLColon=(URL):
-OpenSearchServerConnector.ServerLocationColon=サーバ:
-OpenSearchServerConnector.IndexNameColon=索引名:
-OpenSearchServerConnector.UserNameColon=ユーザ名:
-OpenSearchServerConnector.APIKeyColon=APIキー:
-
-OpenSearchServerConnector.PleaseSupplyValidLocation=正しいOpenSearchServerサーバURLを入力してください
-OpenSearchServerConnector.PleaseSupplyValidIndexName=正しい索引名を入力してください
-
-OpenSearchServerConnector.OpenSearchServer=OpenSearchServer
-
-OpenSearchServerConnector.MaxFileSizeBytesColon=最大ファイルサイズ (バイト:):
-OpenSearchServerConnector.AllowedMIMETypesColon=利用可能なMIMEタイプ:
-OpenSearchServerConnector.AllowedFileExtensionsColon=利用可能なファイル拡張子:
diff --git a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_zh_CN.properties b/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_zh_CN.properties
deleted file mode 100644
index aedc638..0000000
--- a/connectors/opensearchserver/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/opensearchserver/common_zh_CN.properties
+++ /dev/null
@@ -1,32 +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.
-
-OpenSearchServerConnector.Parameters=参数
-
-OpenSearchServerConnector.ServerLocation=服务器位置
-OpenSearchServerConnector.URLColon=(URL):
-OpenSearchServerConnector.ServerLocationColon=服务器位置:
-OpenSearchServerConnector.IndexNameColon=索引名: 
-OpenSearchServerConnector.UserNameColon=用户名: 
-OpenSearchServerConnector.APIKeyColon=APIKey: 
-
-OpenSearchServerConnector.PleaseSupplyValidLocation=请输入有效的OpenSearchServer服务器URL
-OpenSearchServerConnector.PleaseSupplyValidIndexName=请输入有效的索引名
-
-OpenSearchServerConnector.OpenSearchServer=OpenSearchServer
-
-OpenSearchServerConnector.MaxFileSizeBytesColon=最大文件大小(字节):
-OpenSearchServerConnector.AllowedMIMETypesColon=被允许的MIME类型: 
-OpenSearchServerConnector.AllowedFileExtensionsColon=被允许的文件扩展名: 
diff --git a/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/editConfiguration.html b/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/editConfiguration.html
deleted file mode 100644
index 848ec54..0000000
--- a/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/editConfiguration.html
+++ /dev/null
@@ -1,60 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('OpenSearchServerConnector.Parameters'))
-
-<table class="displaytable">
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.ServerLocation'))</nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.URLColon'))
-    </td>
-    <td class="value"><input name="serverlocation" type="text"
-      value="$Encoder.attributeEscape($SERVERLOCATION)" size="48" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.IndexNameColon'))</nobr></td>
-    <td class="value"><input name="indexname" type="text" value="$Encoder.attributeEscape($INDEXNAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.UserNameColon'))</nobr></td>
-    <td class="value"><input name="username" type="text" value="$Encoder.attributeEscape($USERNAME)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.APIKeyColon'))</nobr></td>
-    <td class="value"><input name="apikey" type="text" value="$Encoder.attributeEscape($APIKEY)"
-      size="40" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.SchedulerJob'))</nobr></td>
-    <td class="value"><input name="schedulerjob" type="text"
-      value="$Encoder.attributeEscape($SCHEDULERJOB)" size="24" /></td>
-   </tr>
-</table>
-
-#else
-
-<input type="hidden" name="serverlocation" value="$Encoder.attributeEscape($SERVERLOCATION)" />
-<input type="hidden" name="indexname" value="$Encoder.attributeEscape($INDEXNAME)" />
-<input type="hidden" name="username" value="$Encoder.attributeEscape($USERNAME)" />
-<input type="hidden" name="apikey" value="$Encoder.attributeEscape($APIKEY)" />
-<input type="hidden" name="schedulerjob" value="$Encoder.attributeEscape($SCHEDULERJOB)" />
-
-#end
diff --git a/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/editConfiguration.js b/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/editConfiguration.js
deleted file mode 100644
index d37b865..0000000
--- a/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/editConfiguration.js
+++ /dev/null
@@ -1,58 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig() {
-  if (editconnection.serverlocation) {
-    if (editconnection.serverlocation.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenSearchServerConnector.PleaseSupplyValidLocation'))");
-      editconnection.serverlocation.focus();
-      return false;
-    }
-  }
-  if (editconnection.indexname) {
-    if (editconnection.indexname.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenSearchServerConnector.PleaseSupplyValidIndexName'))");
-      editconnection.indexname.focus();
-      return false;
-    }
-  }
-  return true;
-}
-
-function checkConfigForSave() {
-  if (editconnection.serverlocation) {
-    if (editconnection.serverlocation.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenSearchServerConnector.PleaseSupplyValidLocation'))");
-      SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenSearchServerConnector.OpenSearchServer'))");
-      editconnection.serverlocation.focus();
-      return false;
-    }
-  }
-  if (editconnection.indexname) {
-    if (editconnection.indexname.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenSearchServerConnector.PleaseSupplyValidIndexName'))");
-      SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('OpenSearchServerConnector.OpenSearchServer'))");
-      editconnection.indexname.focus();
-      return false;
-    }
-  }
-  return true;
-}
-//-->
-</script>
\ No newline at end of file
diff --git a/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/viewConfiguration.html b/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/viewConfiguration.html
deleted file mode 100644
index 11e160a..0000000
--- a/connectors/opensearchserver/connector/src/main/resources/org/apache/manifoldcf/agents/output/opensearchserver/viewConfiguration.html
+++ /dev/null
@@ -1,39 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.ServerLocationColon'))</nobr> (URL):</td>
-    <td class="value">$Encoder.bodyEscape($SERVERLOCATION)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.IndexNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($INDEXNAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.UserNameColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($USERNAME)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.APIKeyColon'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($APIKEY)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('OpenSearchServerConnector.SchedulerJob'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($SCHEDULERJOB)</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/opensearchserver/connector/src/test/java/org/apache/manifoldcf/agents/output/opensearchserver/tests/BaseUIHSQLDB.java b/connectors/opensearchserver/connector/src/test/java/org/apache/manifoldcf/agents/output/opensearchserver/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 6097979..0000000
--- a/connectors/opensearchserver/connector/src/test/java/org/apache/manifoldcf/agents/output/opensearchserver/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.opensearchserver.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Test Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"OSS Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.opensearchserver.OpenSearchServerConnector"};
-  }
-
-}
diff --git a/connectors/opensearchserver/connector/src/test/java/org/apache/manifoldcf/agents/output/opensearchserver/tests/NavigationHSQLDBUI.java b/connectors/opensearchserver/connector/src/test/java/org/apache/manifoldcf/agents/output/opensearchserver/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 9334b08..0000000
--- a/connectors/opensearchserver/connector/src/test/java/org/apache/manifoldcf/agents/output/opensearchserver/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.opensearchserver.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.output.opensearchserver.OpenSearchServerConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Parameters tab
-    testerInstance.clickTab("Parameters");
-    
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs. 
-    // MHL
-    
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/opensearchserver/pom.xml b/connectors/opensearchserver/pom.xml
deleted file mode 100644
index a6d8de9..0000000
--- a/connectors/opensearchserver/pom.xml
+++ /dev/null
@@ -1,385 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  
-  <developers>
-    <developer>
-      <name>Emmanuel Keller</name>
-      <organization />
-      <organizationUrl />
-      <url />
-    </developer>
-  </developers>
-  
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-opensearchserver-connector</artifactId>
-  <name>ManifoldCF - Connectors - OpenSearchServer</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/pom.xml b/connectors/pom.xml
deleted file mode 100644
index 47d10a7..0000000
--- a/connectors/pom.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-parent</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>org.apache.manifoldcf</groupId>
-  <artifactId>mcf-connectors</artifactId>
-  <version>2.10-SNAPSHOT</version>
-
-  <name>ManifoldCF - Connectors</name>
-  <packaging>pom</packaging>
-
-  <modules>
-    <!-- common modules -->
-    <module>activedirectory</module>
-    <module>alfresco-webscript</module>
-    <module>filesystem</module>
-    <module>gts</module>
-    <module>hdfs</module>
-    <module>jcifs</module>
-    <module>jdbc</module>
-    <module>gridfs</module>
-    <module>ldap</module>
-    <module>nullauthority</module>
-    <module>nulloutput</module>
-    <module>nulltransformation</module>
-    <module>rss</module>
-    <module>sharepoint</module>
-    <module>solr</module>
-    <module>webcrawler</module>
-    <module>cmis</module>
-    <module>opensearchserver</module>
-    <module>wiki</module>
-    <module>alfresco</module>
-    <module>elasticsearch</module>
-    <module>dropbox</module>
-    <module>googledrive</module>
-    <module>jira</module>
-    <module>generic</module>
-    <module>regexpmapper</module>
-    <module>email</module>
-    <module>amazoncloudsearch</module>
-    <module>forcedmetadata</module>
-    <module>tika</module>
-    <module>tikaservice</module>
-    <module>documentfilter</module>
-    <module>searchblox</module>
-    <module>confluence</module>
-    <module>amazons3</module>
-    <module>kafka</module>
-    <module>opennlp</module>
-    <module>nuxeo</module>
-    <module>contentlimiter</module>
-    <module>slack</module>
-    <module>rocketchat</module>
-  </modules>
-
-</project>
diff --git a/connectors/regexpmapper/.gitignore b/connectors/regexpmapper/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/regexpmapper/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/regexpmapper/build.xml b/connectors/regexpmapper/build.xml
deleted file mode 100644
index e757bf9..0000000
--- a/connectors/regexpmapper/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="regexpmapper" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-mapping-connector">
-            <param name="connector-label" value="Regular expression mapper"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.mappers.regexp.RegexpMapper"/>
-        </antcall>
-    </target>
-    
-</project>
diff --git a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/MatchMap.java b/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/MatchMap.java
deleted file mode 100644
index 73b4aa2..0000000
--- a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/MatchMap.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mappers.regexp;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** An instance of this class describes a "match map", which describes a translation of an input
-* string using regexp technology.
-* A match map consists of multiple clauses, which are fired in sequence.  Each clause is a regexp
-* search and replace, where the replace string can include references to the groups present in the
-* search regexp.
-* MatchMaps can be converted to strings in two different ways.  The first way is to build a single
-* string of the form "match1=replace1&match2=replace2...".  Strings of this kind must escape & and =
-* characters in the match and replace strings, where found.  The second way is to generate an array
-* of match strings and a corresponding array of replace strings.  This method requires no escaping
-* of the string contents.
-*/
-public class MatchMap
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** This is the set of match regexp strings */
-  protected List<String> matchStrings;
-  /** This is the set of Pattern objects corresponding to the match regexp strings.
-  * It's null if the patterns have not been built yet. */
-  protected Pattern[] matchPatterns = null;
-  /** This is the set of replace strings */
-  protected List<String> replaceStrings;
-
-  /** Constructor.  Build an empty matchmap. */
-  public MatchMap()
-  {
-    matchStrings = new ArrayList<String>();
-    replaceStrings = new ArrayList<String>();
-  }
-
-  /** Constructor.  Build a matchmap from a single string. */
-  public MatchMap(String stringForm)
-  {
-    matchStrings = new ArrayList<String>();
-    replaceStrings = new ArrayList<String>();
-    StringBuilder matchString = new StringBuilder();
-    StringBuilder replaceString = new StringBuilder();
-    int i = 0;
-    while (i < stringForm.length())
-    {
-      matchString.setLength(0);
-      replaceString.setLength(0);
-      while (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&' || x == '=')
-          break;
-        i++;
-        if (x == '\\' && i < stringForm.length())
-          x = stringForm.charAt(i++);
-        matchString.append(x);
-      }
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '=')
-        {
-          i++;
-          // Pick up the second string
-          while (i < stringForm.length())
-          {
-            x = stringForm.charAt(i);
-            if (x == '&')
-              break;
-            i++;
-            if (x == '\\' && i < stringForm.length())
-              x = stringForm.charAt(i++);
-            replaceString.append(x);
-          }
-        }
-      }
-
-      matchStrings.add(matchString.toString());
-      replaceStrings.add(replaceString.toString());
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&')
-          i++;
-      }
-    }
-  }
-
-  /** Constructor.  Build a matchmap from two lists representing match and replace strings */
-  public MatchMap(List<String> matchStrings, List<String> replaceStrings)
-  {
-    this.matchStrings = matchStrings;
-    this.replaceStrings = replaceStrings;
-  }
-
-  /** Get the number of match/replace strings */
-  public int getMatchCount()
-  {
-    return matchStrings.size();
-  }
-
-  /** Get a specific match string */
-  public String getMatchString(int index)
-  {
-    return matchStrings.get(index);
-  }
-
-  /** Get a specific replace string */
-  public String getReplaceString(int index)
-  {
-    return replaceStrings.get(index);
-  }
-
-  /** Delete a specified match/replace string pair */
-  public void deleteMatchPair(int index)
-  {
-    matchStrings.remove(index);
-    replaceStrings.remove(index);
-    matchPatterns = null;
-  }
-
-  /** Insert a match/replace string pair */
-  public void insertMatchPair(int index, String match, String replace)
-  {
-    matchStrings.add(index,match);
-    replaceStrings.add(index,replace);
-    matchPatterns = null;
-  }
-
-  /** Append a match/replace string pair */
-  public void appendMatchPair(String match, String replace)
-  {
-    matchStrings.add(match);
-    replaceStrings.add(replace);
-    matchPatterns = null;
-  }
-
-  /** Append old-style match/replace pair.
-  * This method translates old-style regexp and group output form to the
-  * current style before adding to the map.
-  */
-  public void appendOldstyleMatchPair(String oldstyleMatch, String oldstyleReplace)
-  {
-    String newStyleMatch = "^" + oldstyleMatch + "$";
-
-    // Need to build a new-style replace string from the old one.  To do that, use the
-    // original parser (which basically will guarantee that we get it right)
-
-    EvaluatorTokenStream et = new EvaluatorTokenStream(oldstyleReplace);
-    StringBuilder newStyleReplace = new StringBuilder();
-
-    while (true)
-    {
-      EvaluatorToken t = et.peek();
-      if (t == null)
-        break;
-      switch (t.getType())
-      {
-      case EvaluatorToken.TYPE_COMMA:
-        et.advance();
-        break;
-      case EvaluatorToken.TYPE_GROUP:
-        et.advance();
-        int groupNumber = t.getGroupNumber();
-        switch (t.getGroupStyle())
-        {
-        case EvaluatorToken.GROUPSTYLE_NONE:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append(")");
-          break;
-        case EvaluatorToken.GROUPSTYLE_LOWER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("l)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_UPPER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("u)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_MIXED:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("m)");
-          break;
-        default:
-          break;
-        }
-        break;
-      case EvaluatorToken.TYPE_TEXT:
-        et.advance();
-        escape(newStyleReplace,t.getTextValue());
-        break;
-      default:
-        break;
-      }
-    }
-
-    appendMatchPair(newStyleMatch,newStyleReplace.toString());
-  }
-
-  /** Escape a string so it is verbatim */
-  protected static void escape(StringBuilder output, String input)
-  {
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '$')
-        output.append(x);
-      output.append(x);
-    }
-  }
-
-  /** Convert the matchmap to string form. */
-  public String toString()
-  {
-    int i = 0;
-    StringBuilder rval = new StringBuilder();
-    while (i < matchStrings.size())
-    {
-      String matchString = matchStrings.get(i);
-      String replaceString = replaceStrings.get(i);
-      if (i > 0)
-        rval.append('&');
-      stuff(rval,matchString);
-      rval.append('=');
-      stuff(rval,replaceString);
-      i++;
-    }
-    return rval.toString();
-  }
-
-  /** Stuff characters */
-  protected static void stuff(StringBuilder sb, String value)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '&' || x == '=')
-        sb.append('\\');
-      sb.append(x);
-    }
-  }
-
-  /** Perform a translation.
-  */
-  public String translate(String input)
-    throws ManifoldCFException
-  {
-    // Build pattern vector if not already there
-    if (matchPatterns == null)
-    {
-      matchPatterns = new Pattern[matchStrings.size()];
-      int i = 0;
-      while (i < matchPatterns.length)
-      {
-        String regexp = matchStrings.get(i);
-        try
-        {
-          matchPatterns[i] = Pattern.compile(regexp);
-        }
-        catch (java.util.regex.PatternSyntaxException e)
-        {
-          matchPatterns = null;
-          throw new ManifoldCFException("For match expression '"+regexp+"', found pattern syntax error: "+e.getMessage(),e);
-        }
-        i++;
-      }
-    }
-
-    int j = 0;
-    while (j < matchPatterns.length)
-    {
-      Pattern p = matchPatterns[j];
-      // Construct a matcher
-      Matcher m = p.matcher(input);
-      // Grab the output description
-      String outputDescription = replaceStrings.get(j);
-      j++;
-      // Create a copy buffer
-      StringBuilder outputBuffer = new StringBuilder();
-      // Keep track of the index in the original string we have done up to
-      int currentIndex = 0;
-      // Scan the string using find, and for each one found, do a translation
-      while (true)
-      {
-        boolean foundOne = m.find();
-        if (foundOne == false)
-        {
-          // No subsequent match found.
-          // Copy everything from currentIndex until the end of input
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-
-        // Do a translation.  This involves copying everything in the input
-        // string up until the start of the match, then doing a replace for
-        // the match itself, and finally setting the currentIndex to the end
-        // of the match.
-
-        int matchStart = m.start(0);
-        int matchEnd = m.end(0);
-        if (matchStart == -1)
-        {
-          // The expression was degenerate; treat this as the end.
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-        outputBuffer.append(input.substring(currentIndex,matchStart));
-
-        // Process translation description!
-        int i = 0;
-        while (i < outputDescription.length())
-        {
-          char x = outputDescription.charAt(i++);
-          if (x == '$' && i < outputDescription.length())
-          {
-            x = outputDescription.charAt(i++);
-            if (x == '(')
-            {
-              // Process evaluation expression
-              StringBuilder numberBuf = new StringBuilder();
-              boolean upper = false;
-              boolean lower = false;
-              boolean mixed = false;
-              while (i < outputDescription.length())
-              {
-                char y = outputDescription.charAt(i++);
-                if (y == ')')
-                  break;
-                else if (y >= '0' && y <= '9')
-                  numberBuf.append(y);
-                else if (y == 'u' || y == 'U')
-                  upper = true;
-                else if (y == 'l' || y == 'L')
-                  lower = true;
-                else if (y == 'm' || y == 'M')
-                  mixed = true;
-              }
-              String number = numberBuf.toString();
-              try
-              {
-                int groupnum = Integer.parseInt(number);
-                String groupValue = m.group(groupnum);
-                if (upper)
-                  outputBuffer.append(groupValue.toUpperCase(Locale.ROOT));
-                else if (lower)
-                  outputBuffer.append(groupValue.toLowerCase(Locale.ROOT));
-                else if (mixed && groupValue.length() > 0)
-                  outputBuffer.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT)).append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-                else
-                  outputBuffer.append(groupValue);
-
-              }
-              catch (NumberFormatException e)
-              {
-                // Silently skip, because it's an illegal group number, so nothing
-                // gets added.
-              }
-
-              // Go back around, so we don't add the $ in
-              continue;
-            }
-          }
-          outputBuffer.append(x);
-        }
-
-        currentIndex = matchEnd;
-      }
-
-      input = outputBuffer.toString();
-    }
-
-    return input;
-  }
-
-
-  // Protected classes
-
-  // These classes are used to process the old token-based replacement strings
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-}
diff --git a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/Messages.java b/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/Messages.java
deleted file mode 100644
index 49f8d85..0000000
--- a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mappers.regexp;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.mappers.regexp.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.mappers.regexp";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/RegexpMapper.java b/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/RegexpMapper.java
deleted file mode 100644
index 83737f3..0000000
--- a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/RegexpMapper.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mappers.regexp;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is the regexp mapper implementation, which uses a regular expression to manipulate a user name.
-*/
-public class RegexpMapper extends org.apache.manifoldcf.authorities.mappers.BaseMappingConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Match map for username
-  private MatchMap matchMap = null;
-
-  /** Constructor.
-  */
-  public RegexpMapper()
-  {
-  }
-
-  /** Close the connection.  Call this before discarding the mapping connection.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    matchMap = null;
-    super.disconnect();
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  private MatchMap getSession()
-    throws ManifoldCFException
-  {
-    if (matchMap == null)
-      matchMap = new MatchMap(params.getParameter(RegexpParameters.userNameMapping));
-    return matchMap;
-  }
-
-  /** Map an input user name to an output name.
-  *@param userName is the name to map
-  *@return the mapped user name
-  */
-  @Override
-  public String mapUser(String userName)
-    throws ManifoldCFException
-  {
-    MatchMap mm = getSession();
-    
-    String outputUserName = mm.translate(userName);
-    
-    if (Logging.mappingConnectors.isDebugEnabled())
-      Logging.mappingConnectors.debug("RegexpMapper: Input user name '"+userName+"'; output user name '"+outputUserName+"'");
-    
-    return outputUserName;
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"RegexpMapper.UserMapping"));
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.usernameregexp.value != \"\" && !isRegularExpression(editconnection.usernameregexp.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"RegexpMapper.UserNameRegularExpressionMustBeValidRegularExpression") + "\");\n"+
-"    editconnection.usernameregexp.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.usernameregexp.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"RegexpMapper.UserNameRegularExpressionCannotBeNull") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"RegexpMapper.UserMapping") + "\");\n"+
-"    editconnection.usernameregexp.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String userNameMapping = parameters.getParameter(RegexpParameters.userNameMapping);
-    if (userNameMapping == null)
-      userNameMapping = "^(.*)\\\\@([A-Z|a-z|0-9|_|-]*)\\\\.(.*)$=$(2)\\\\$(1l)";
-    MatchMap matchMap = new MatchMap(userNameMapping);
-
-    String usernameRegexp = matchMap.getMatchString(0);
-    String livelinkUserExpr = matchMap.getReplaceString(0);
-
-    // The "User Mapping" tab
-    if (tabName.equals(Messages.getString(locale,"RegexpMapper.UserMapping")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RegexpMapper.UserNameRegularExpressionColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"40\" name=\"usernameregexp\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(usernameRegexp)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RegexpMapper.UserExpressionColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"40\" name=\"livelinkuserexpr\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(livelinkUserExpr)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for "User Mapping" tab
-      out.print(
-"<input type=\"hidden\" name=\"usernameregexp\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(usernameRegexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\"livelinkuserexpr\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(livelinkUserExpr)+"\"/>\n"
-      );
-    }
-
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    // User name parameters
-    String usernameRegexp = variableContext.getParameter("usernameregexp");
-    String livelinkUserExpr = variableContext.getParameter("livelinkuserexpr");
-    if (usernameRegexp != null && livelinkUserExpr != null)
-    {
-      MatchMap matchMap = new MatchMap();
-      matchMap.appendMatchPair(usernameRegexp,livelinkUserExpr);
-      parameters.setParameter(RegexpParameters.userNameMapping,matchMap.toString());
-    }
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    MatchMap matchMap = new MatchMap(parameters.getParameter(RegexpParameters.userNameMapping));
-
-    String usernameRegexp = matchMap.getMatchString(0);
-    String livelinkUserExpr = matchMap.getReplaceString(0);
-
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RegexpMapper.UserNameRegularExpressionColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(usernameRegexp)+"</nobr></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RegexpMapper.UserExpressionColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(livelinkUserExpr)+"</nobr></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-
-  }
-
-}
-
-
diff --git a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/RegexpParameters.java b/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/RegexpParameters.java
deleted file mode 100644
index 6b39353..0000000
--- a/connectors/regexpmapper/connector/src/main/java/org/apache/manifoldcf/authorities/mappers/regexp/RegexpParameters.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mappers.regexp;
-
-/** This class describes regexp mapper parameters.
-*/
-public class RegexpParameters
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** User name mapping description. */
-  public final static String userNameMapping = "User name map";
-
-}
diff --git a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_en_US.properties b/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_en_US.properties
deleted file mode 100644
index 60cd844..0000000
--- a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_en_US.properties
+++ /dev/null
@@ -1,20 +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.
-
-RegexpMapper.UserMapping=User Mapping
-RegexpMapper.UserNameRegularExpressionColon=User name regular expression:
-RegexpMapper.UserExpressionColon=User expression:
-RegexpMapper.UserNameRegularExpressionMustBeValidRegularExpression=User name regular expression must be a valid regular expression
-RegexpMapper.UserNameRegularExpressionCannotBeNull=User name regular expression cannot be null
diff --git a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_es_ES.properties b/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_es_ES.properties
deleted file mode 100644
index 6c6258b..0000000
--- a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_es_ES.properties
+++ /dev/null
@@ -1,20 +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.
-
-RegexpMapper.UserMapping=Trazar un mapa de Usuario
-RegexpMapper.UserNameRegularExpressionColon=Nombre de usuario expresión regular:
-RegexpMapper.UserExpressionColon=expresión del usuario:
-RegexpMapper.UserNameRegularExpressionMustBeValidRegularExpression=Nombre de usuario expresión regular debe ser una expresión regular válida
-RegexpMapper.UserNameRegularExpressionCannotBeNull=Nombre de usuario expresión regular no puede ser nulo
diff --git a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_ja_JP.properties b/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_ja_JP.properties
deleted file mode 100644
index 8c82d09..0000000
--- a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_ja_JP.properties
+++ /dev/null
@@ -1,20 +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.
-
-RegexpMapper.UserMapping=ユーザーマッピング
-RegexpMapper.UserNameRegularExpressionColon=ユーザー名正規表現:
-RegexpMapper.UserExpressionColon=ユーザー表現:
-RegexpMapper.UserNameRegularExpressionMustBeValidRegularExpression=ユーザー名正規表現に正しい正規表現を指定してください
-RegexpMapper.UserNameRegularExpressionCannotBeNull=ユーザー名正規表現をNullに指定できません
diff --git a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_zh_CN.properties b/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_zh_CN.properties
deleted file mode 100644
index 0c03bc8..0000000
--- a/connectors/regexpmapper/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/mappers/regexp/common_zh_CN.properties
+++ /dev/null
@@ -1,20 +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.
-
-RegexpMapper.UserMapping=用户映射
-RegexpMapper.UserNameRegularExpressionColon=用户映射正则表达式:
-RegexpMapper.UserExpressionColon=用户表达式:
-RegexpMapper.UserNameRegularExpressionMustBeValidRegularExpression=用户名正则表达式必须为有效的正则表达式
-RegexpMapper.UserNameRegularExpressionCannotBeNull=用户名正则表达式不能为Null
diff --git a/connectors/regexpmapper/pom.xml b/connectors/regexpmapper/pom.xml
deleted file mode 100644
index 98e2c30..0000000
--- a/connectors/regexpmapper/pom.xml
+++ /dev/null
@@ -1,361 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-regexpmapper-connector</artifactId>
-  <name>ManifoldCF - Connectors - Regexp Mapper</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/rocketchat/.gitignore b/connectors/rocketchat/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/rocketchat/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/rocketchat/build.xml b/connectors/rocketchat/build.xml
deleted file mode 100644
index b2db665..0000000
--- a/connectors/rocketchat/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="rocketchat" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-notification-connector">
-            <param name="connector-label" value="Rocket.Chat"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.notifications.rocketchat.RocketChatConnector"/>
-        </antcall>
-    </target>
-
-</project>
\ No newline at end of file
diff --git a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/Messages.java b/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/Messages.java
deleted file mode 100644
index 5330d61..0000000
--- a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/Messages.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.rocketchat;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.notifications.rocketchat.Messages;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.notifications.rocketchat.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.notifications.rocketchat";
-
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-
-}
-
diff --git a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatConfig.java b/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatConfig.java
deleted file mode 100644
index 9763007..0000000
--- a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatConfig.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.rocketchat;
-
-
-/**
-* Parameters data for the Rocket.Chat notification connector.
-*/
-public class RocketChatConfig {
-
-  /**
-   * Rocket.Chat Server URL
-   */
-  public static final String SERVER_URL_PARAM = "serverUrl";
-  
-  /**
-   * Rocket.Chat Username or Email
-   */
-  public static final String USER_PARAM = "user";
-  
-  /**
-   * Rocket.Chat Password
-   */
-  public static final String PASSWORD_PARAM = "password";
-
-  /**
-   * Proxy Host
-   */
-  public static final String PROXY_HOST_PARAM = "proxyHost";
-
-  /**
-   * Proxy Port
-   */
-
-  public static final String PROXY_PORT_PARAM = "proxyPort";
-
-  /**
-   * Proxy Username
-   */
-  public static final String PROXY_USERNAME_PARAM = "proxyUsername";
-
-  /**
-   * Proxy Password
-   */
-  public static final String PROXY_PASSWORD_PARAM = "proxyPassword";
-
-  /**
-   * Proxy Domain
-   */
-  public static final String PROXY_DOMAIN_PARAM = "proxyDomain";
-
-  /**
-  * URL template
-  */
-  public static final String URL_PARAM = "url";
-
-  // Specification nodes
-  public static final String NODE_FINISHED = "finished";
-  public static final String NODE_ERRORABORTED = "erroraborted";
-  public static final String NODE_MANUALABORTED = "manualaborted";
-  public static final String NODE_MANUALPAUSED = "manualpaused";
-  public static final String NODE_SCHEDULEPAUSED = "schedulepaused";
-  public static final String NODE_RESTARTED = "restarted";
-
-  public static final String NODE_GLOBALS = "globals";
-  public static final String NODE_CHANNEL = "channel";
-  public static final String NODE_MESSAGE = "message";
-  public static final String NODE_DEFAULT_CHANNEL = "default_channel";
-  public static final String NODE_ALIAS = "alias";
-  public static final String NODE_EMOJI = "emoji";
-  public static final String NODE_AVATAR = "avatar";
-  
-  public static final String ATTRIBUTE_NAME = "name";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-
-}
\ No newline at end of file
diff --git a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatConnector.java b/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatConnector.java
deleted file mode 100644
index 3f16696..0000000
--- a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatConnector.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.crawler.notifications.rocketchat;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-/**
- */
-public class RocketChatConnector extends org.apache.manifoldcf.crawler.notifications.BaseNotificationConnector {
-
-  protected final static long SESSION_EXPIRATION_MILLISECONDS = 300000L;
-
-  // Local variables.
-  protected long sessionExpiration = -1L;
-
-  // Parameters for establishing a session
-
-  protected String serverUrl = null;
-  protected String user;
-  protected String password;
-
-  // Parameters for proxy connection
-  protected RocketChatSession.ProxySettings proxySettings = null;
-
-  // Local session handle
-  protected RocketChatSession session = null;
-
-  //////////////////////////////////Start of Basic Connector Methods/////////////////////////
-
-  /**
-   * Connect.
-   *
-   * @param configParameters is the set of configuration parameters, which
-   * in this case describe the root directory.
-   */
-  @Override
-  public void connect(ConfigParams configParameters) {
-    super.connect(configParameters);
-    this.serverUrl = configParameters.getParameter(RocketChatConfig.SERVER_URL_PARAM);
-    this.user = configParameters.getParameter(RocketChatConfig.USER_PARAM);
-    this.password = configParameters.getObfuscatedParameter(RocketChatConfig.PASSWORD_PARAM);
-
-    String proxyHost = configParameters.getParameter(RocketChatConfig.PROXY_HOST_PARAM);
-    String proxyPortString = configParameters.getParameter(RocketChatConfig.PROXY_PORT_PARAM);
-    if(StringUtils.isNotEmpty(proxyHost) && StringUtils.isNotEmpty(proxyPortString)) {
-      String proxyUsername = configParameters.getParameter(RocketChatConfig.PROXY_USERNAME_PARAM);
-      String proxyPassword = configParameters.getObfuscatedParameter(RocketChatConfig.PROXY_PASSWORD_PARAM);
-      String proxyDomain = configParameters.getParameter(RocketChatConfig.PROXY_DOMAIN_PARAM);
-      this.proxySettings = new RocketChatSession.ProxySettings(proxyHost, proxyPortString, proxyUsername, proxyPassword, proxyDomain);
-    } else {
-      Logging.connectors.info("Using no proxy settings - no proxyHost and no proxyPort found.");
-    }
-  }
-
-  /**
-   * Close the connection. Call this before discarding this instance of the
-   * repository connector.
-   */
-  @Override
-  public void disconnect()
-      throws ManifoldCFException {
-    this.serverUrl = null;
-    this.user = null;
-    this.password = null;
-    this.proxySettings = null;
-    finalizeConnection();
-    super.disconnect();
-  }
-
-  /**
-   * This method is periodically called for all connectors that are connected but not
-   * in active use.
-   */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (session != null)
-    {
-      if (System.currentTimeMillis() >= sessionExpiration)
-        finalizeConnection();
-    }
-  }
-
-  /**
-   * Test the connection. Returns a string describing the connection integrity.
-   *
-   * @return the connection's status as a displayable string.
-   */
-  @Override
-  public String check()
-      throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    // Force a re-connection
-    finalizeConnection();
-    getSession();
-    try {
-      CheckConnectionThread cct = new CheckConnectionThread(session);
-      cct.start();
-      cct.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      handleIOException(e,"checking the connection");
-    }
-  }
-
-  protected void getSession()
-      throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-
-      // Check that all the required parameters are there.
-      if (serverUrl == null)
-        throw new ManifoldCFException("Missing serverUrl parameter");
-      if (user == null)
-        throw new ManifoldCFException("Missing user parameter");
-      if (password == null)
-        throw new ManifoldCFException("Missing password parameter");
-
-      // Create a session.
-      try {
-        ConnectThread connectThread = new ConnectThread(serverUrl, user, password, proxySettings);
-        connectThread.start();
-        session = connectThread.finishUp();
-      } catch (InterruptedException e) {
-        throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-      } catch (IOException e) {
-        handleIOException(e, "connecting");
-      }
-    }
-    sessionExpiration = System.currentTimeMillis() + SESSION_EXPIRATION_MILLISECONDS;
-  }
-
-  protected void finalizeConnection() {
-    if (session != null) {
-      try {
-        CloseSessionThread closeSessionThread = new CloseSessionThread(session);
-        closeSessionThread.start();
-        closeSessionThread.finishUp();
-      } catch (InterruptedException e) {
-      } catch (IOException e) {
-        Logging.connectors.warn("Error while closing connection to server: " + e.getMessage(),e);
-      } finally {
-        session = null;
-      }
-    }
-  }
-
-  ///////////////////////////////End of Basic Connector Methods////////////////////////////////////////
-
-  //////////////////////////////Start of Notification Connector Method///////////////////////////////////
-
-  /** Notify of job stop due to error abort.
-   *@param spec is the notification specification.
-   */
-  @Override
-  public void notifyOfJobStopErrorAbort(final Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    sendRocketChatMessage(spec, RocketChatConfig.NODE_ERRORABORTED);
-  }
-
-  /** Notify of job stop due to manual abort.
-   *@param spec is the notification specification.
-   */
-  @Override
-  public void notifyOfJobStopManualAbort(final Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    sendRocketChatMessage(spec, RocketChatConfig.NODE_MANUALABORTED);
-  }
-
-  /** Notify of job stop due to manual pause.
-   *@param spec is the notification specification.
-   */
-  @Override
-  public void notifyOfJobStopManualPause(final Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    sendRocketChatMessage(spec, RocketChatConfig.NODE_MANUALPAUSED);
-  }
-
-  /** Notify of job stop due to schedule pause.
-   *@param spec is the notification specification.
-   */
-  @Override
-  public void notifyOfJobStopSchedulePause(final Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    sendRocketChatMessage(spec, RocketChatConfig.NODE_SCHEDULEPAUSED);
-  }
-
-  /** Notify of job stop due to restart.
-   *@param spec is the notification specification.
-   */
-  @Override
-  public void notifyOfJobStopRestart(final Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    sendRocketChatMessage(spec, RocketChatConfig.NODE_RESTARTED);
-  }
-
-  /** Notify of job end.
-   *@param spec is the notification specification.
-   */
-  @Override
-  public void notifyOfJobEnd(final Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    sendRocketChatMessage(spec, RocketChatConfig.NODE_FINISHED);
-  }
-
-  protected void sendRocketChatMessage(final Specification spec, final String nodeType)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    
-    String defaultChannel = null;
-    String alias = null;
-    String emoji = null;
-    String avatar = null;
-    
-    String channel = "";
-    String message = "";
-    // Look for node of the specified type
-    if (nodeType != null)
-    {
-      for (int i = 0; i < spec.getChildCount(); i++) {
-        SpecificationNode childNode = spec.getChild(i);
-        
-        // Global settings
-        if (childNode.getType().equals(RocketChatConfig.NODE_GLOBALS)) {
-          for (int j = 0; j < childNode.getChildCount(); j++) {
-            SpecificationNode sn = childNode.getChild(j);
-            if (sn.getType().equals(RocketChatConfig.NODE_DEFAULT_CHANNEL)) {
-              defaultChannel = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-            }
-            else if (sn.getType().equals(RocketChatConfig.NODE_ALIAS)) {
-              alias = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-            }
-            else if (sn.getType().equals(RocketChatConfig.NODE_EMOJI)) {
-              emoji = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-            }
-            else if (sn.getType().equals(RocketChatConfig.NODE_AVATAR)) {
-              avatar = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-            }
-          }
-        }
-        
-        // notification type specific settings
-        else if (childNode.getType().equals(nodeType))
-        {
-          for (int j = 0; j < childNode.getChildCount(); j++) {
-            SpecificationNode sn = childNode.getChild(j);
-            if (sn.getType().equals(RocketChatConfig.NODE_CHANNEL))
-              channel = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-            else if (sn.getType().equals(RocketChatConfig.NODE_MESSAGE))
-              message = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-          }
-        }
-      }
-    }
-
-    if (StringUtils.isBlank(message)) {
-      return;
-    }
-
-    if (StringUtils.isBlank(channel)) {
-      if (StringUtils.isBlank(defaultChannel)) {
-        return;
-      } else {
-        channel = defaultChannel;
-      }
-    }
-
-    // Construct and send a rocketchat message
-    getSession();
-
-    RocketChatMessage chatMessage = new RocketChatMessage();
-    chatMessage.setChannel(channel);
-    chatMessage.setText(message);
-    chatMessage.setAlias(alias);
-    chatMessage.setEmoji(emoji);
-    chatMessage.setAvatar(avatar);
-
-    SendThread st = new SendThread(session, chatMessage);
-    st.start();
-    try {
-      st.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      handleIOException(e,"sending rocketchat message");
-    }
-  }
-
-
-  //////////////////////////////End of Notification Connector Methods///////////////////////////////////
-
-
-  ///////////////////////////////////////Start of Configuration UI/////////////////////////////////////
-
-  /**
-   * Output the configuration header section.
-   * This method is called in the head section of the connector's configuration page. Its purpose is to
-   * add the required tabs to the list, and to output any javascript methods that might be needed by
-   * the configuration editing HTML.
-   * The connector does not need to be connected for this method to be called.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param locale is the desired locale.
-   * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   * @param tabsArray is an array of tab names. Add to this array any tab names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters, List<String> tabsArray)
-          throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "RocketChatConnector.RestAPI"));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationHeader.js", paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters, String tabName)
-          throws ManifoldCFException, IOException {
-    // Output the Server tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "Configuration_Server.html", paramMap);
-  }
-
-  private static void fillInServerConfigurationMap(Map<String, Object> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String serverUrl = getEmptyOnNull(parameters, RocketChatConfig.SERVER_URL_PARAM);
-    String user = getEmptyOnNull(parameters, RocketChatConfig.USER_PARAM);
-    String password = parameters.getObfuscatedParameter(RocketChatConfig.PASSWORD_PARAM);
-    if (password == null) {
-      password = StringUtils.EMPTY;
-    } else {
-      password = mapper.mapPasswordToKey(password);
-    }
-
-    String proxyHost = getEmptyOnNull(parameters, RocketChatConfig.PROXY_HOST_PARAM);
-    String proxyPort = getEmptyOnNull(parameters, RocketChatConfig.PROXY_PORT_PARAM);
-    String proxyUsername = getEmptyOnNull(parameters, RocketChatConfig.PROXY_USERNAME_PARAM);
-
-    String proxyPassword = parameters.getObfuscatedParameter(RocketChatConfig.PROXY_PASSWORD_PARAM);
-    if(proxyPassword == null) {
-      proxyPassword = StringUtils.EMPTY;
-    } else {
-      proxyPassword = mapper.mapPasswordToKey(proxyPassword);
-    }
-
-    String proxyDomain = getEmptyOnNull(parameters, RocketChatConfig.PROXY_DOMAIN_PARAM);
-
-    paramMap.put("SERVER_URL", serverUrl);
-    paramMap.put("USER", user);
-    paramMap.put("PASSWORD", password);
-    paramMap.put("PROXY_HOST", proxyHost);
-    paramMap.put("PROXY_PORT", proxyPort);
-    paramMap.put("PROXY_USERNAME", proxyUsername);
-    paramMap.put("PROXY_PASSWORD", proxyPassword);
-    paramMap.put("PROXY_DOMAIN", proxyDomain);
-  }
-
-  private static String getEmptyOnNull(ConfigParams parameters, String key) {
-    String value = parameters.getParameter(key);
-    if (value == null) {
-      value = StringUtils.EMPTY;
-    }
-    return value;
-  }
-
-  /**
-   * Process a configuration post.
-   * This method is called at the start of the connector's configuration page, whenever there is a possibility
-   * that form data for a connection has been posted. Its purpose is to gather form information and modify
-   * the configuration parameters accordingly.
-   * The name of the posted form is always "editconnection".
-   * The connector does not need to be connected for this method to be called.
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post, including binary file post information.
-   * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an error that should prevent saving of the
-   * connection (and cause a redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-      ConfigParams parameters) throws ManifoldCFException {
-
-    final String serverUrl = variableContext.getParameter("serverUrl");
-    if (serverUrl != null) {
-      parameters.setParameter(RocketChatConfig.SERVER_URL_PARAM, serverUrl);
-    }
-
-    final String user = variableContext.getParameter("user");
-    if (user != null) {
-      parameters.setParameter(RocketChatConfig.USER_PARAM, user);
-    }
-
-    final String password = variableContext.getParameter("password");
-    if (password != null) {
-      parameters.setObfuscatedParameter(RocketChatConfig.PASSWORD_PARAM, variableContext.mapKeyToPassword(password));
-    }
-
-    final String proxyHost = variableContext.getParameter("proxyHost");
-    if (proxyHost != null) {
-      parameters.setParameter(RocketChatConfig.PROXY_HOST_PARAM, proxyHost);
-    }
-
-    final String proxyPort = variableContext.getParameter("proxyPort");
-    if (StringUtils.isNotEmpty(proxyPort)) {
-      try {
-        Integer.parseInt(proxyPort);
-      } catch (NumberFormatException e) {
-        Logging.connectors.warn("Proxy port must be a number. Found " + proxyPort);
-        throw new ManifoldCFException("Proxy Port must be a number: " + e.getMessage(), e);
-      }
-      parameters.setParameter(RocketChatConfig.PROXY_PORT_PARAM, proxyPort);
-    } else if(proxyPort != null){
-      parameters.setParameter(RocketChatConfig.PROXY_PORT_PARAM, proxyPort);
-    }
-
-    final String proxyUsername = variableContext.getParameter("proxyUsername");
-    if (proxyUsername != null) {
-      parameters.setParameter(RocketChatConfig.PROXY_USERNAME_PARAM, proxyUsername);
-    }
-
-    final String proxyPassword = variableContext.getParameter("proxyPassword");
-    if (proxyPassword != null) {
-      parameters.setObfuscatedParameter(RocketChatConfig.PROXY_PASSWORD_PARAM, variableContext.mapKeyToPassword(proxyPassword));
-    }
-
-    final String proxyDomain = variableContext.getParameter("proxyDomain");
-    if (proxyDomain != null) {
-      parameters.setParameter(RocketChatConfig.PROXY_DOMAIN_PARAM, proxyDomain);
-    }
-
-    return null;
-  }
-
-  /**
-   * View configuration. This method is called in the body section of the
-   * connector's view configuration page. Its purpose is to present the
-   * connection information to the user. The coder can presume that the HTML that
-   * is output from this configuration will be within appropriate <html> and
-   * <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently exist, for
-   * this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-      Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationView.html", paramMap);
-  }
-
-
-  /////////////////////////////////End of configuration UI////////////////////////////////////////////////////
-
-
-  /////////////////////////////////Start of Specification UI//////////////////////////////////////////////////
-
-  /** Output the specification header section.
-   * This method is called in the head section of a job page which has selected a repository connection of the
-   * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-   * that might be needed by the job editing HTML.
-   * The connector will be connected before this method can be called.
-   *@param out is the output to which any HTML should be sent.
-   *@param locale is the locale the output is preferred to be in.
-   *@param ds is the current document specification for this job.
-   *@param connectionSequenceNumber is the unique number of this connection within the job.
-   *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-   */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-      int connectionSequenceNumber, List<String> tabsArray)
-          throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    // Add the tabs
-    tabsArray.add(Messages.getString(locale, "RocketChatConnector.Message"));
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationHeader.js", paramMap);
-  }
-
-  /** Output the specification body section.
-   * This method is called in the body section of a job page which has selected a repository connection of the
-   * current type.  Its purpose is to present the required form elements for editing.
-   * The coder can presume that the HTML that is output from this configuration will be within appropriate
-   *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-   * The connector will be connected before this method can be called.
-   *@param out is the output to which any HTML should be sent.
-   *@param locale is the locale the output is preferred to be in.
-   *@param ds is the current document specification for this job.
-   *@param connectionSequenceNumber is the unique number of this connection within the job.
-   *@param actualSequenceNumber is the connection within the job that has currently been selected.
-   *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-   *  the job.
-   */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-      int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-          throws ManifoldCFException, IOException {
-    outputMessageTab(out, locale, ds, tabName, connectionSequenceNumber, actualSequenceNumber);
-  }
-
-  /**
-   * Take care of "Message" tab.
-   */
-  protected void outputMessageTab(IHTTPOutput out, Locale locale,
-      Specification ds, String tabName, int connectionSequenceNumber, int actualSequenceNumber)
-          throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-    fillInMessageTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "Specification_Message.html", paramMap);
-  }
-
-  /**
-   * Fill in Velocity context for Metadata tab.
-   */
-  protected static void fillInMessageTab(Map<String, Object> paramMap,
-      Specification ds) {
-
-    // Initialize all records with blanks
-    addRecord(paramMap, RocketChatConfig.NODE_FINISHED, "", "");
-    addRecord(paramMap, RocketChatConfig.NODE_ERRORABORTED, "", "");
-    addRecord(paramMap, RocketChatConfig.NODE_MANUALABORTED, "", "");
-    addRecord(paramMap, RocketChatConfig.NODE_MANUALPAUSED, "", "");
-    addRecord(paramMap, RocketChatConfig.NODE_SCHEDULEPAUSED, "", "");
-    addRecord(paramMap, RocketChatConfig.NODE_RESTARTED, "" ,"");
-
-    String channel;
-    String message;
-    // Loop through nodes and pick them out that way
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode childNode = ds.getChild(i);
-      if (childNode.getType().equals(RocketChatConfig.NODE_FINISHED) ||
-          childNode.getType().equals(RocketChatConfig.NODE_ERRORABORTED) ||
-          childNode.getType().equals(RocketChatConfig.NODE_MANUALABORTED) ||
-          childNode.getType().equals(RocketChatConfig.NODE_MANUALPAUSED) ||
-          childNode.getType().equals(RocketChatConfig.NODE_SCHEDULEPAUSED) ||
-          childNode.getType().equals(RocketChatConfig.NODE_RESTARTED)) {
-        channel = "";
-        message = "";
-        for (int j = 0; j < childNode.getChildCount(); j++) {
-          SpecificationNode sn = childNode.getChild(j);
-          if (sn.getType().equals(RocketChatConfig.NODE_CHANNEL)) {
-            channel = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-          } else if (sn.getType().equals(RocketChatConfig.NODE_MESSAGE)) {
-            message = sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE);
-          }
-        }
-        addRecord(paramMap, childNode.getType(), channel, message);
-      }
-    }
-
-    // Global Settings
-    
-    // Initialize globals with blanks
-    paramMap.put(RocketChatConfig.NODE_DEFAULT_CHANNEL, "");
-    paramMap.put(RocketChatConfig.NODE_ALIAS, "");
-    paramMap.put(RocketChatConfig.NODE_EMOJI, "");
-    paramMap.put(RocketChatConfig.NODE_AVATAR, "");
-    
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode childNode = ds.getChild(i);
-      if (childNode.getType().equals(RocketChatConfig.NODE_GLOBALS)) {
-        for (int j = 0; j < childNode.getChildCount(); j++) {
-          SpecificationNode sn = childNode.getChild(j);
-          if (sn.getType().equals(RocketChatConfig.NODE_DEFAULT_CHANNEL)) {
-            paramMap.put(RocketChatConfig.NODE_DEFAULT_CHANNEL, sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE));
-          } else if (sn.getType().equals(RocketChatConfig.NODE_ALIAS)) {
-            paramMap.put(RocketChatConfig.NODE_ALIAS, sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE));
-          } else if (sn.getType().equals(RocketChatConfig.NODE_EMOJI)) {
-            paramMap.put(RocketChatConfig.NODE_EMOJI, sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE));
-          } else if (sn.getType().equals(RocketChatConfig.NODE_AVATAR)) {
-            paramMap.put(RocketChatConfig.NODE_AVATAR, sn.getAttributeValue(RocketChatConfig.ATTRIBUTE_VALUE));
-          }
-        }
-      }
-      
-    }
-
-  }
-
-  protected static void addRecord(Map<String,Object> paramMap, String nodeType, String channel, String message) {
-    paramMap.put(nodeType+"_CHANNEL", channel);
-    paramMap.put(nodeType+"_MESSAGE", message);
-  }
-
-  /** Process a specification post.
-   * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-   * data for a connection has been posted.  Its purpose is to gather form information and modify the
-   * document specification accordingly.  The name of the posted form is always "editjob".
-   * The connector will be connected before this method can be called.
-   *@param variableContext contains the post data, including binary file-upload information.
-   *@param locale is the locale the output is preferred to be in.
-   *@param ds is the current document specification for this job.
-   *@param connectionSequenceNumber is the unique number of this connection within the job.
-   *@return null if all is well, or a string error message if there is an error that should prevent saving of
-   * the job (and cause a redirection to an error page).
-   */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-      int connectionSequenceNumber)
-          throws ManifoldCFException {
-
-    return processMessageTab(variableContext, ds, connectionSequenceNumber);
-  }
-
-  protected String processMessageTab(IPostParameters variableContext, Specification ds,
-      int connectionSequenceNumber)
-          throws ManifoldCFException {
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Gather all different kinds.
-    gatherRecord(ds, seqPrefix, variableContext, RocketChatConfig.NODE_FINISHED);
-    gatherRecord(ds, seqPrefix, variableContext, RocketChatConfig.NODE_ERRORABORTED);
-    gatherRecord(ds, seqPrefix, variableContext, RocketChatConfig.NODE_MANUALABORTED);
-    gatherRecord(ds, seqPrefix, variableContext, RocketChatConfig.NODE_MANUALPAUSED);
-    gatherRecord(ds, seqPrefix, variableContext, RocketChatConfig.NODE_SCHEDULEPAUSED);
-    gatherRecord(ds, seqPrefix, variableContext, RocketChatConfig.NODE_RESTARTED);
-
-    // Gather global settings
-    SpecificationNode sn = new SpecificationNode(RocketChatConfig.NODE_GLOBALS);
-    
-    String defaultChannel = variableContext.getParameter(RocketChatConfig.NODE_DEFAULT_CHANNEL);
-    if (defaultChannel != null) {
-      addNodeValue(sn, RocketChatConfig.NODE_DEFAULT_CHANNEL, defaultChannel);
-    }
-    String alias = variableContext.getParameter(RocketChatConfig.NODE_ALIAS);
-    if (alias != null) {
-      addNodeValue(sn, RocketChatConfig.NODE_ALIAS, alias);
-    }
-    String emoji = variableContext.getParameter(RocketChatConfig.NODE_EMOJI);
-    if (emoji != null) {
-      addNodeValue(sn, RocketChatConfig.NODE_EMOJI, emoji);
-    }
-    String avatar = variableContext.getParameter(RocketChatConfig.NODE_AVATAR);
-    if (avatar != null) {
-      addNodeValue(sn, RocketChatConfig.NODE_AVATAR, avatar);
-    }
-    ds.addChild(ds.getChildCount(), sn);
-    
-    return null;
-  }
-
-  protected static void gatherRecord(Specification ds, String seqPrefix, IPostParameters variableContext, String nodeType) {
-    removeNodes(ds, nodeType);
-    SpecificationNode sn = new SpecificationNode(nodeType);
-    String channel = variableContext.getParameter(seqPrefix + nodeType + "_channel");
-    if (channel != null)
-    {
-      addNodeValue(sn, RocketChatConfig.NODE_CHANNEL, channel);
-    }
-    String message = variableContext.getParameter(seqPrefix + nodeType + "_message");
-    if (message != null)
-    {
-      addNodeValue(sn, RocketChatConfig.NODE_MESSAGE, message);
-    }
-    ds.addChild(ds.getChildCount(),sn);
-  }
-
-  /** View specification.
-   * This method is called in the body section of a job's view page.  Its purpose is to present the document
-   * specification information to the user.  The coder can presume that the HTML that is output from
-   * this configuration will be within appropriate <html> and <body> tags.
-   * The connector will be connected before this method can be called.
-   *@param out is the output to which any HTML should be sent.
-   *@param locale is the locale the output is preferred to be in.
-   *@param ds is the current document specification for this job.
-   *@param connectionSequenceNumber is the unique number of this connection within the job.
-   */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-      int connectionSequenceNumber)
-          throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    fillInMessageTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationView.html", paramMap);
-  }
-
-  ///////////////////////////////////////End of specification UI///////////////////////////////////////////////
-
-  protected static void removeNodes(Specification ds, String nodeTypeName) {
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(nodeTypeName))
-        ds.removeChild(i);
-      else
-        i++;
-    }
-  }
-
-  protected static void addNodeValue(SpecificationNode ds, String nodeType, String value)
-  {
-    SpecificationNode sn = new SpecificationNode(nodeType);
-    sn.setAttribute(RocketChatConfig.ATTRIBUTE_VALUE,value);
-    ds.addChild(ds.getChildCount(),sn);
-  }
-
-
-  /** Handle Messaging exceptions in a consistent global manner */
-  protected static void handleIOException(IOException e, String context)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.error("RocketChat: Error "+context+": "+e.getMessage(),e);
-    throw new ManifoldCFException("Error "+context+": "+e.getMessage(),e);
-  }
-
-  /** Class to set up connection.
-   */
-  protected static class ConnectThread extends Thread
-  {
-    protected final String serverUrl;
-    protected final String user;
-    protected final String password;
-    protected final RocketChatSession.ProxySettings proxySettings;
-
-    // Local session handle
-    protected RocketChatSession session = null;
-    protected Throwable exception = null;
-
-    public ConnectThread(String serverUrl, String user, String password, RocketChatSession.ProxySettings proxySettings)
-    {
-      this.serverUrl = serverUrl;
-      this.user = user;
-      this.password = password;
-      this.proxySettings = proxySettings;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session = new RocketChatSession(serverUrl, user, password, proxySettings);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public RocketChatSession finishUp()
-        throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return session;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to close the session.
-   */
-  protected static class CloseSessionThread extends Thread
-  {
-    protected final RocketChatSession session;
-
-    protected Throwable exception = null;
-
-    public CloseSessionThread(RocketChatSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.close();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-        throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to check the connection.
-   */
-  protected static class CheckConnectionThread extends Thread
-  {
-    protected final RocketChatSession session;
-
-    protected Throwable exception = null;
-
-    public CheckConnectionThread(RocketChatSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-        throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to send Rocket.Chat messages.
-   */
-  protected static class SendThread extends Thread
-  {
-    protected final RocketChatSession session;
-    protected final RocketChatMessage message;
-
-    protected Throwable exception = null;
-
-    public SendThread(RocketChatSession session, RocketChatMessage message)
-    {
-      this.session = session;
-      this.message = message;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.send(message);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-        throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatCredentials.java b/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatCredentials.java
deleted file mode 100644
index e95517d..0000000
--- a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatCredentials.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.rocketchat;
-
-public class RocketChatCredentials {
-
-  private String user;
-  
-  private String password;
-
-  public String getUser() {
-    return user;
-  }
-
-  public void setUser(String user) {
-    this.user = user;
-  }
-
-  public String getPassword() {
-    return password;
-  }
-
-  public void setPassword(String password) {
-    this.password = password;
-  }
-  
-}
diff --git a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatMessage.java b/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatMessage.java
deleted file mode 100644
index c8300db..0000000
--- a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatMessage.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.rocketchat;
-
-public class RocketChatMessage {
-
-  private String channel;
-
-  private String text;
-
-  private String alias;
-  
-  private String emoji;
-  
-  private String avatar;
-  
-  public String getChannel() {
-    return channel;
-  }
-
-  public void setChannel(String channel) {
-    this.channel = channel;
-  }
-
-  public String getText() {
-    return text;
-  }
-
-  public void setText(String text) {
-    this.text = text;
-  }
-
-  public String getAlias() {
-    return alias;
-  }
-
-  public void setAlias(String alias) {
-    this.alias = alias;
-  }
-
-  public String getEmoji() {
-    return emoji;
-  }
-
-  public void setEmoji(String emoji) {
-    this.emoji = emoji;
-  }
-
-  public String getAvatar() {
-    return avatar;
-  }
-
-  public void setAvatar(String avatar) {
-    this.avatar = avatar;
-  }
-
-}
diff --git a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatSession.java b/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatSession.java
deleted file mode 100644
index a271858..0000000
--- a/connectors/rocketchat/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/rocketchat/RocketChatSession.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.rocketchat;
-
-import java.io.IOException;
-
-import javax.net.ssl.SSLSocketFactory;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.HttpResponseException;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.entity.EntityBuilder;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.util.EntityUtils;
-import org.apache.manifoldcf.connectorcommon.common.InterruptibleSocketFactory;
-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** This class represents a Rocket.Chat REST API session, without any protection
-* from threads waiting on sockets, etc.
-*/
-public class RocketChatSession
-{
-
-  private static String currentHost = null;
-
-  private CloseableHttpClient httpClient;
-  private ObjectMapper objectMapper;
-  private final String serverUrl;
-  private final String user;
-  private final String password;
-
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (java.net.UnknownHostException e)
-    {
-    }
-  }
-
-  /**
-   * Create a session.
-   * @param serverUrl - the serverUrl of the Rocket.Chat server to post the message to.
-   * @param user
-   * @param password
-   * @param proxySettingsOrNull - the proxy settings or null if not necessary.
-   * @throws ManifoldCFException
-   */
-  public RocketChatSession(final String serverUrl, String user, String password, final ProxySettings proxySettingsOrNull) throws ManifoldCFException
-  {
-    this.serverUrl = serverUrl.replaceAll("/$", "");
-    this.user = user;
-    this.password = password;
-    this.objectMapper = new ObjectMapper();
-    this.objectMapper.setSerializationInclusion(Include.NON_NULL);
-
-    int connectionTimeout = 60000;
-    int socketTimeout = 900000;
-
-    final RequestConfig.Builder requestBuilder = RequestConfig.custom()
-        .setSocketTimeout(socketTimeout)
-        .setConnectTimeout(connectionTimeout)
-        .setConnectionRequestTimeout(socketTimeout);
-
-    if(proxySettingsOrNull != null) {
-      addProxySettings(requestBuilder, proxySettingsOrNull);
-    }
-
-    // Create a ssl socket factory trusting everything.
-    // Reason: manifoldcf wishes connectors to encapsulate certificate handling
-    //         per connection and not rely on the global keystore.
-    //         A configurable keystore seems overkill for the Rocket.Chat notification use case
-    //         so we trust everything.
-    SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();
-    SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeout),
-        NoopHostnameVerifier.INSTANCE);
-
-    httpClient = HttpClientBuilder.create()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setSSLSocketFactory(myFactory)
-        .build();
-  }
-
-  private void addProxySettings(RequestConfig.Builder requestBuilder, ProxySettings proxySettingsOrNull)
-  {
-    if (proxySettingsOrNull.hasUsername()) {
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-      credentialsProvider.setCredentials(
-          new AuthScope(proxySettingsOrNull.getHost(), proxySettingsOrNull.getPort()),
-          new NTCredentials(proxySettingsOrNull.getUsername(),
-              (proxySettingsOrNull.getPassword() == null) ? "" : proxySettingsOrNull.getPassword(),
-                  currentHost,
-                  (proxySettingsOrNull.getDomain() == null) ? "" : proxySettingsOrNull.getDomain()));
-    }
-
-    HttpHost proxy = new HttpHost(proxySettingsOrNull.getHost(), proxySettingsOrNull.getPort());
-    requestBuilder.setProxy(proxy);
-  }
-
-  public void checkConnection() throws IOException
-  {
-    // test login
-    Header[] authHeader = null;
-    try {
-      authHeader = login();
-    } finally {
-      if (authHeader != null) {
-        logout(authHeader);
-      }
-    }
-  }
-
-  public void send(RocketChatMessage message) throws IOException
-  {
-    Header[] authHeader = null;
-    try {
-      authHeader = login();
-    
-      HttpPost messagePost = new HttpPost(serverUrl + "/api/v1/chat.postMessage");
-      messagePost.setHeaders(authHeader);
-  
-      String json = objectMapper.writeValueAsString(message);
-  
-      HttpEntity entity = EntityBuilder.create()
-          .setContentType(ContentType.APPLICATION_JSON)
-          .setText(json)
-          .build();
-  
-      messagePost.setEntity(entity);
-      try (CloseableHttpResponse response = httpClient.execute(messagePost)) {
-        int statusCode = response.getStatusLine().getStatusCode();
-        if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) {
-          EntityUtils.consume(response.getEntity());
-        } else {
-          Logging.connectors.error("Sending Rocket.Chat message failed with statusline " + response.getStatusLine());
-          Logging.connectors.error("  Response was: " + EntityUtils.toString(response.getEntity()));
-        }
-      }
-    } finally {
-      if (authHeader != null) {
-        logout(authHeader);
-      }
-    }
-  }
-  
-  private Header[] login() throws IOException {
-    HttpPost loginPost = new HttpPost(serverUrl + "/api/v1/login");
-    RocketChatCredentials credentials = new RocketChatCredentials();
-    credentials.setUser(user);
-    credentials.setPassword(password);
-    String json = objectMapper.writeValueAsString(credentials);
-    
-    HttpEntity entity = EntityBuilder.create()
-        .setContentType(ContentType.APPLICATION_JSON)
-        .setText(json)
-        .build();
-
-    loginPost.setEntity(entity);
-    try (CloseableHttpResponse response = httpClient.execute(loginPost)) {
-      int statusCode = response.getStatusLine().getStatusCode();
-      if (statusCode == HttpStatus.SC_OK) {
-        
-        JsonNode jsonResponse = objectMapper.readTree(response.getEntity().getContent());
-        JsonNode dataNode = jsonResponse.get("data");
-        if (dataNode != null) {
-          String authToken = dataNode.get("authToken").asText();
-          String userId = dataNode.get("userId").asText();
-          
-          return new Header[] {
-              new BasicHeader("X-Auth-Token", authToken),
-              new BasicHeader("X-User-Id", userId)
-          };  
-        } else {
-          Logging.connectors.error("The login returned OK, but the response did not contain any authentication data.");
-          Logging.connectors.error("  Response was: " + objectMapper.writeValueAsString(jsonResponse));
-          throw new ClientProtocolException("login response did not contain any authentication data");
-        }
-        
-        
-      } else {
-        Logging.connectors.error("Login to Rocket.Chat failed with statusline " + response.getStatusLine());
-        Logging.connectors.error("  Response was: " + EntityUtils.toString(response.getEntity()));
-        throw new HttpResponseException(statusCode, response.getStatusLine().getReasonPhrase());
-      }
-    }
-  }
-  
-  private void logout(Header[] authHeader) throws IOException {
-    HttpGet logoutGet = new HttpGet(serverUrl + "/api/v1/logout");
-    logoutGet.setHeaders(authHeader);
-    try (CloseableHttpResponse response = httpClient.execute(logoutGet)) {
-      int statusCode = response.getStatusLine().getStatusCode();
-      if (statusCode != HttpStatus.SC_OK) {
-        Logging.connectors.error("Logout from Rocket.Chat failed with statusline " + response.getStatusLine());
-        Logging.connectors.error("  Response was: " + EntityUtils.toString(response.getEntity()));
-      }
-    }
-  }
-
-  public void close() throws IOException
-  {
-    httpClient.close();
-    httpClient = null;
-    objectMapper = null;
-  }
-
-  protected static final class ProxySettings {
-    private String host;
-    private int port = -1;
-    private String username;
-    private String password;
-    private String domain;
-
-    public ProxySettings(String host, String portString, String username, String password, String domain) {
-      this.host = host;
-      if(StringUtils.isNotEmpty(portString)) {
-        try {
-          this.port = Integer.parseInt(portString);
-        } catch (NumberFormatException e) {
-          Logging.connectors.warn("Proxy port must be an number. Found " + portString);
-        }
-      }
-      this.username = username;
-      this.password = password;
-      this.domain = domain;
-    }
-
-    public String getHost() {
-      return host;
-    }
-
-    public int getPort() {
-      return port;
-    }
-
-    public String getUsername() {
-      return username;
-    }
-
-    public boolean hasUsername() {
-      return StringUtils.isNotEmpty(this.username);
-    }
-
-    public String getPassword() {
-      return password;
-    }
-
-    public String getDomain() {
-      return domain;
-    }
-
-    @Override
-    public String toString() {
-      final StringBuilder sb = new StringBuilder("ProxySettings{");
-      sb.append("host='").append(host).append('\'');
-      sb.append(", port=").append(port);
-      sb.append(", username='").append(username).append('\'');
-      sb.append(", password='").append(password).append('\'');
-      sb.append(", domain='").append(domain).append('\'');
-      sb.append('}');
-      return sb.toString();
-    }
-  }
-}
\ No newline at end of file
diff --git a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_en_US.properties b/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_en_US.properties
deleted file mode 100644
index 00ca30f..0000000
--- a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_en_US.properties
+++ /dev/null
@@ -1,48 +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.
-
-RocketChatConnector.RestAPI=Rocket.Chat REST API
-RocketChatConnector.Message=Rocket.Chat Notifications
-
-RocketChatConnector.EnterAServerUrl=Enter a Rocket.Chat server URL
-RocketChatConnector.EnterAUser=Enter a user (username or email)
-RocketChatConnector.EnterAPassword=Enter a password
-RocketChatConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-RocketChatConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-RocketChatConnector.ServerUrlColon=Server URL:
-RocketChatConnector.UserColon=User:
-RocketChatConnector.PasswordColon=Password:
-RocketChatConnector.ProxyHostColon=Proxy Host:
-RocketChatConnector.ProxyPortColon=Proxy Port:
-RocketChatConnector.ProxyUsernameColon=Proxy NTLM Username:
-RocketChatConnector.ProxyPasswordColon=Proxy NTLM Password:
-RocketChatConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-RocketChatConnector.Globals=Global Rocket.Chat Settings
-
-RocketChatConnector.JobFinished=Job finished
-RocketChatConnector.JobStopErrorAbort=Job stopped due to error abort
-RocketChatConnector.JobStopManualAbort=Job stopped due to manual abort
-RocketChatConnector.JobStopManualPause=Job stopped due to manual pause
-RocketChatConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-RocketChatConnector.JobStopRestart=Job stopped due to job restart
-
-RocketChatConnector.ChannelColon=Channel:
-RocketChatConnector.MessageColon=Message:
-RocketChatConnector.DefaultChannelColon=Default Channel:
-RocketChatConnector.AliasColon=Alias:
-RocketChatConnector.EmojiColon=Emoji:
-RocketChatConnector.AvatarColon=Avatar:
diff --git a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_es_ES.properties b/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_es_ES.properties
deleted file mode 100644
index 00ca30f..0000000
--- a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_es_ES.properties
+++ /dev/null
@@ -1,48 +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.
-
-RocketChatConnector.RestAPI=Rocket.Chat REST API
-RocketChatConnector.Message=Rocket.Chat Notifications
-
-RocketChatConnector.EnterAServerUrl=Enter a Rocket.Chat server URL
-RocketChatConnector.EnterAUser=Enter a user (username or email)
-RocketChatConnector.EnterAPassword=Enter a password
-RocketChatConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-RocketChatConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-RocketChatConnector.ServerUrlColon=Server URL:
-RocketChatConnector.UserColon=User:
-RocketChatConnector.PasswordColon=Password:
-RocketChatConnector.ProxyHostColon=Proxy Host:
-RocketChatConnector.ProxyPortColon=Proxy Port:
-RocketChatConnector.ProxyUsernameColon=Proxy NTLM Username:
-RocketChatConnector.ProxyPasswordColon=Proxy NTLM Password:
-RocketChatConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-RocketChatConnector.Globals=Global Rocket.Chat Settings
-
-RocketChatConnector.JobFinished=Job finished
-RocketChatConnector.JobStopErrorAbort=Job stopped due to error abort
-RocketChatConnector.JobStopManualAbort=Job stopped due to manual abort
-RocketChatConnector.JobStopManualPause=Job stopped due to manual pause
-RocketChatConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-RocketChatConnector.JobStopRestart=Job stopped due to job restart
-
-RocketChatConnector.ChannelColon=Channel:
-RocketChatConnector.MessageColon=Message:
-RocketChatConnector.DefaultChannelColon=Default Channel:
-RocketChatConnector.AliasColon=Alias:
-RocketChatConnector.EmojiColon=Emoji:
-RocketChatConnector.AvatarColon=Avatar:
diff --git a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_ja_JP.properties b/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_ja_JP.properties
deleted file mode 100644
index 00ca30f..0000000
--- a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_ja_JP.properties
+++ /dev/null
@@ -1,48 +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.
-
-RocketChatConnector.RestAPI=Rocket.Chat REST API
-RocketChatConnector.Message=Rocket.Chat Notifications
-
-RocketChatConnector.EnterAServerUrl=Enter a Rocket.Chat server URL
-RocketChatConnector.EnterAUser=Enter a user (username or email)
-RocketChatConnector.EnterAPassword=Enter a password
-RocketChatConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-RocketChatConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-RocketChatConnector.ServerUrlColon=Server URL:
-RocketChatConnector.UserColon=User:
-RocketChatConnector.PasswordColon=Password:
-RocketChatConnector.ProxyHostColon=Proxy Host:
-RocketChatConnector.ProxyPortColon=Proxy Port:
-RocketChatConnector.ProxyUsernameColon=Proxy NTLM Username:
-RocketChatConnector.ProxyPasswordColon=Proxy NTLM Password:
-RocketChatConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-RocketChatConnector.Globals=Global Rocket.Chat Settings
-
-RocketChatConnector.JobFinished=Job finished
-RocketChatConnector.JobStopErrorAbort=Job stopped due to error abort
-RocketChatConnector.JobStopManualAbort=Job stopped due to manual abort
-RocketChatConnector.JobStopManualPause=Job stopped due to manual pause
-RocketChatConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-RocketChatConnector.JobStopRestart=Job stopped due to job restart
-
-RocketChatConnector.ChannelColon=Channel:
-RocketChatConnector.MessageColon=Message:
-RocketChatConnector.DefaultChannelColon=Default Channel:
-RocketChatConnector.AliasColon=Alias:
-RocketChatConnector.EmojiColon=Emoji:
-RocketChatConnector.AvatarColon=Avatar:
diff --git a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_zh_CN.properties b/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_zh_CN.properties
deleted file mode 100644
index 00ca30f..0000000
--- a/connectors/rocketchat/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/rocketchat/common_zh_CN.properties
+++ /dev/null
@@ -1,48 +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.
-
-RocketChatConnector.RestAPI=Rocket.Chat REST API
-RocketChatConnector.Message=Rocket.Chat Notifications
-
-RocketChatConnector.EnterAServerUrl=Enter a Rocket.Chat server URL
-RocketChatConnector.EnterAUser=Enter a user (username or email)
-RocketChatConnector.EnterAPassword=Enter a password
-RocketChatConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-RocketChatConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-RocketChatConnector.ServerUrlColon=Server URL:
-RocketChatConnector.UserColon=User:
-RocketChatConnector.PasswordColon=Password:
-RocketChatConnector.ProxyHostColon=Proxy Host:
-RocketChatConnector.ProxyPortColon=Proxy Port:
-RocketChatConnector.ProxyUsernameColon=Proxy NTLM Username:
-RocketChatConnector.ProxyPasswordColon=Proxy NTLM Password:
-RocketChatConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-RocketChatConnector.Globals=Global Rocket.Chat Settings
-
-RocketChatConnector.JobFinished=Job finished
-RocketChatConnector.JobStopErrorAbort=Job stopped due to error abort
-RocketChatConnector.JobStopManualAbort=Job stopped due to manual abort
-RocketChatConnector.JobStopManualPause=Job stopped due to manual pause
-RocketChatConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-RocketChatConnector.JobStopRestart=Job stopped due to job restart
-
-RocketChatConnector.ChannelColon=Channel:
-RocketChatConnector.MessageColon=Message:
-RocketChatConnector.DefaultChannelColon=Default Channel:
-RocketChatConnector.AliasColon=Alias:
-RocketChatConnector.EmojiColon=Emoji:
-RocketChatConnector.AvatarColon=Avatar:
diff --git a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/ConfigurationHeader.js b/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/ConfigurationHeader.js
deleted file mode 100644
index 49620a2..0000000
--- a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/ConfigurationHeader.js
+++ /dev/null
@@ -1,71 +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.
--->
-
-<script type="text/javascript">
-function checkConfig()
-{
-  if (editconnection.proxyPort.value != "" && !isInteger(editconnection.proxyPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.ProxyPortMustBeAnInteger'))");
-    editconnection.proxyPort.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.serverUrl.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.EnterAServerUrl'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.RestAPI'))");
-    editconnection.serverUrl.focus();
-    return false;
-  }
-  if (editconnection.user.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.EnterAUser'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.RestAPI'))");
-    editconnection.user.focus();
-    return false;
-  }
-  if (editconnection.password.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.EnterAPasswordUrl'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.RestAPI'))");
-    editconnection.password.focus();
-    return false;
-  }
-  if (editconnection.proxyHost.value != "" && editconnection.proxyPort.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.ProxyPortMustBeGivenWithHost'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.RestAPI'))");
-    editconnection.proxyPort.focus();
-    return false;
-  }
-  if (editconnection.proxyPort.value != "" && !isInteger(editconnection.proxyPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.ProxyPortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('RocketChatConnector.RestAPI'))");
-    editconnection.proxyPort.focus();
-    return false;
-  }
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/ConfigurationView.html b/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/ConfigurationView.html
deleted file mode 100644
index fc98df4..0000000
--- a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/ConfigurationView.html
+++ /dev/null
@@ -1,88 +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.
--->
-
-<table class="displaytable">
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ServerUrlColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($SERVER_URL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.UserColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($USER)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      #if($PASSWORD && !$PASSWORD.empty)
-      <nobr>********</nobr>
-      #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_HOST)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_PORT)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_USERNAME)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      #if($PROXY_PASSWORD && !$PROXY_PASSWORD.empty)
-      <nobr>********</nobr>
-      #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_DOMAIN)</nobr>
-    </td>
-</table>
-
diff --git a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/Configuration_Server.html b/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/Configuration_Server.html
deleted file mode 100644
index e6b869c..0000000
--- a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/Configuration_Server.html
+++ /dev/null
@@ -1,99 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('RocketChatConnector.RestAPI'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ServerUrlColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="serverUrl" name="serverUrl" type="text" size="80" value="$Encoder.attributeEscape($SERVER_URL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.UserColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="user" name="user" type="text" size="80" value="$Encoder.attributeEscape($USER)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.PasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="password" name="password" type="password" size="80" value="$Encoder.attributeEscape($PASSWORD)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyHost" name="proxyHost" type="text" size="32" value="$Encoder.attributeEscape($PROXY_HOST)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyPort" name="proxyPort" type="text" size="5" value="$Encoder.attributeEscape($PROXY_PORT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyUsername" name="proxyUsername" type="text" size="32" value="$Encoder.attributeEscape($PROXY_USERNAME)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyPassword" name="proxyPassword" type="password" size="32" value="$Encoder.attributeEscape($PROXY_PASSWORD)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyDomain" name="proxyDomain" type="text" size="32" value="$Encoder.attributeEscape($PROXY_DOMAIN)"/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="serverUrl" value="$Encoder.attributeEscape($SERVER_URL)"/>
-<input type="hidden" name="user" value="$Encoder.attributeEscape($USER)"/>
-<input type="hidden" name="password" value="$Encoder.attributeEscape($PASSWORD)"/>
-<input type="hidden" name="proxyHost" value="$Encoder.attributeEscape($PROXY_HOST)"/>
-<input type="hidden" name="proxyPort" value="$Encoder.attributeEscape($PROXY_PORT)"/>
-<input type="hidden" name="proxyUsername" value="$Encoder.attributeEscape($PROXY_USERNAME)"/>
-<input type="hidden" name="proxyPassword" value="$Encoder.attributeEscape($PROXY_PASSWORD)"/>
-<input type="hidden" name="proxyDomain" value="$Encoder.attributeEscape($PROXY_DOMAIN)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/SpecificationHeader.js b/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/SpecificationHeader.js
deleted file mode 100644
index 0707450..0000000
--- a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/SpecificationHeader.js
+++ /dev/null
@@ -1,40 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SeqNum}_checkSpecificationForSave()
-{
-  if (s${SeqNum}_checkMessageTabForSave() == false)
-    return false;
-  return true;
-}
-
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function s${SeqNum}_checkMessageTabForSave()
-{
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/SpecificationView.html b/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/SpecificationView.html
deleted file mode 100644
index 8eeb76e..0000000
--- a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/SpecificationView.html
+++ /dev/null
@@ -1,136 +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.
--->
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.Globals'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.DefaultChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($default_channel)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.AliasColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($alias)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.EmojiColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($emoji)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.AvatarColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($avatar)</nobr>
-    </td>
-  </tr>
-  
-</table>
-
-<hr/>
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobFinished'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($finished_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($finished_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopErrorAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($erroraborted_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($erroraborted_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopManualAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualaborted_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualaborted_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopManualPause'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualpaused_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualpaused_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopSchedulePause'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($schedulepaused_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($schedulepaused_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopRestart'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($restarted_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($restarted_MESSAGE)
-    </td>
-  </tr>
-
-</table>
diff --git a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/Specification_Message.html b/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/Specification_Message.html
deleted file mode 100644
index 1417441..0000000
--- a/connectors/rocketchat/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/rocketchat/Specification_Message.html
+++ /dev/null
@@ -1,196 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('RocketChatConnector.Message') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.Globals'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.DefaultChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="default_channel" size="32" value="$Encoder.attributeEscape($default_channel)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.AliasColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="alias" size="32" value="$Encoder.attributeEscape($alias)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.EmojiColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="emoji" size="32" value="$Encoder.attributeEscape($emoji)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.AvatarColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="avatar" size="32" value="$Encoder.attributeEscape($avatar)"/>
-    </td>
-  </tr>
-</table>
-
-<hr/>
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobFinished'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_finished_channel" size="32" value="$Encoder.attributeEscape($finished_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_finished_message" rows="10" cols="50">$Encoder.bodyEscape($finished_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopErrorAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_erroraborted_channel" size="32" value="$Encoder.attributeEscape($erroraborted_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_erroraborted_message" rows="10" cols="50">$Encoder.bodyEscape($erroraborted_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopManualAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualaborted_channel" size="32" value="$Encoder.attributeEscape($manualaborted_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_manualaborted_message" rows="10" cols="50">$Encoder.bodyEscape($manualaborted_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopManualPause'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualpaused_channel" size="32" value="$Encoder.attributeEscape($manualpaused_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_manualpaused_message" rows="10" cols="50">$Encoder.bodyEscape($manualpaused_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopSchedulePause'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_schedulepaused_channel" size="32" value="$Encoder.attributeEscape($schedulepaused_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_schedulepaused_message" rows="10" cols="50">$Encoder.bodyEscape($schedulepaused_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.JobStopRestart'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_restarted_channel" size="32" value="$Encoder.attributeEscape($restarted_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('RocketChatConnector.MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_restarted_message" rows="10" cols="50">$Encoder.bodyEscape($restarted_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="default_channel" value="$Encoder.attributeEscape($default_channel)"/>
-<input type="hidden" name="alias" value="$Encoder.attributeEscape($alias)"/>
-<input type="hidden" name="emoji" value="$Encoder.attributeEscape($emoji)"/>
-<input type="hidden" name="avatar" value="$Encoder.attributeEscape($avatar)"/>
-
-<input type="hidden" name="s${SeqNum}_finished_channel" value="$Encoder.attributeEscape($finished_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_finished_message" value="$Encoder.attributeEscape($finished_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_erroraborted_channel" value="$Encoder.attributeEscape($erroraborted_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_erroraborted_message" value="$Encoder.attributeEscape($erroraborted_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_manualaborted_channel" value="$Encoder.attributeEscape($manualaborted_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_manualaborted_message" value="$Encoder.attributeEscape($manualaborted_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_manualpaused_channel" value="$Encoder.attributeEscape($manualpaused_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_manualpaused_message" value="$Encoder.attributeEscape($manualpaused_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_schedulepaused_channel" value="$Encoder.attributeEscape($schedulepaused_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_schedulepaused_message" value="$Encoder.attributeEscape($schedulepaused_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_restarted_channel" value="$Encoder.attributeEscape($restarted_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_restarted_message" value="$Encoder.attributeEscape($restarted_MESSAGE)"/>
-
-#end
diff --git a/connectors/rocketchat/pom.xml b/connectors/rocketchat/pom.xml
deleted file mode 100644
index 8e2ab33..0000000
--- a/connectors/rocketchat/pom.xml
+++ /dev/null
@@ -1,371 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-rocketchat-connector</artifactId>
-  <name>ManifoldCF - Connectors - Rocket.Chat</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-	<dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>2.3.2</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-annotations</artifactId>
-      <version>2.3.0</version>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/rss/.gitignore b/connectors/rss/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/rss/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/rss/build.xml b/connectors/rss/build.xml
deleted file mode 100644
index fa5edf5..0000000
--- a/connectors/rss/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="rss" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="RSS"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.rss.RSSConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/DataCache.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/DataCache.java
deleted file mode 100644
index 5555286..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/DataCache.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/* $Id: DataCache.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-
-/** This class is a cache of a specific URL's data.  It's fetched early and kept,
-* so that (1) an accurate data length can be found, and (2) we can compute a version
-* checksum.
-*/
-public class DataCache
-{
-  public static final String _rcsid = "@(#)$Id: DataCache.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Hashmap containing the cache
-  protected Map<String,DocumentData> cacheData = new HashMap<String,DocumentData>();
-
-  /** Constructor.
-  */
-  public DataCache()
-  {
-  }
-
-
-  /** Add binary data entry into the cache.  Does NOT close the input stream when done!
-  *@param documentIdentifier is the document identifier (url).
-  *@param contentType is the content type for the data.
-  *@param dataStream is the data stream.
-  *@return the checksum value.
-  */
-  public long addData(IProcessActivity activities, String documentIdentifier, String contentType, InputStream dataStream)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Create a temporary file; that's what we will cache
-    try
-    {
-      File tempFile = File.createTempFile("_rsscache_","tmp");
-      try
-      {
-        // Causes memory leaks if left around; there's no way to release
-        // the record specifying that the file should be deleted, even
-        // after it's removed.  So disable this and live with the occasional
-        // dangling file left as a result of shutdown or error. :-(
-        // tempFile.deleteOnExit();
-        ManifoldCF.addFile(tempFile);
-
-        // Transfer data to temporary file
-        long checkSum = 0L;
-        OutputStream os = new FileOutputStream(tempFile);
-        try
-        {
-          byte[] byteArray = new byte[65536];
-          while (true)
-          {
-            int amt;
-            try
-            {
-              amt = dataStream.read(byteArray,0,byteArray.length);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              Logging.connectors.warn("RSS: Socket timeout exception reading socket stream: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("Read timeout: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,false);
-            }
-            catch (ConnectTimeoutException e)
-            {
-              Logging.connectors.warn("RSS: Connect timeout exception reading socket stream: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("Read timeout: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,false);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              Logging.connectors.warn("RSS: IO exception reading socket stream: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("Read timeout: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,false);
-            }
-            if (amt == -1)
-              break;
-            int i = 0;
-            while (i < amt)
-            {
-              byte x = byteArray[i++];
-              long bytevalue = (long)x;
-              checkSum = (checkSum << 5) ^ (checkSum >> 3) ^ (bytevalue << 2) ^ (bytevalue >> 3);
-            }
-
-            os.write(byteArray,0,amt);
-            // Before we go 'round again, do a check
-            activities.checkJobStillActive();
-          }
-        }
-        finally
-        {
-          os.close();
-        }
-
-        deleteData(documentIdentifier);
-        
-        synchronized(this)
-        {
-          cacheData.put(documentIdentifier,new DocumentData(tempFile,contentType));
-        }
-        
-        return checkSum;
-      }
-      catch (IOException e)
-      {
-        ManifoldCF.deleteFile(tempFile);
-        throw e;
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.deleteFile(tempFile);
-        throw e;
-      }
-      catch (Error e)
-      {
-        ManifoldCF.deleteFile(tempFile);
-        throw e;
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception creating temporary file: "+e.getMessage(),e);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket connect timeout exception creating temporary file: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception creating temporary file: "+e.getMessage(),e);
-    }
-  }
-
-  /** Fetch binary data length.
-  *@param documentIdentifier is the document identifier.
-  *@return the length.
-  */
-  public long getDataLength(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    DocumentData f;
-    synchronized (this)
-    {
-      f = cacheData.get(documentIdentifier);
-    }
-    if (f == null)
-      return 0L;
-    return f.getData().length();
-  }
-
-  /** Fetch binary data entry from the cache.
-  *@param documentIdentifier is the document identifier (url).
-  *@return a binary data stream.
-  */
-  public InputStream getData(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    DocumentData f;
-    synchronized (this)
-    {
-      f = cacheData.get(documentIdentifier);
-    }
-    if (f == null)
-      return null;
-    try
-    {
-      return new FileInputStream(f.getData());
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception getting data length: "+e.getMessage(),e);
-    }
-  }
-
-  /** Get the content type.
-  *@param documentIdentifier is the document identifier.
-  *@return the content type, or null if there is none.
-  */
-  public String getContentType(String documentIdentifier)
-  {
-    DocumentData dd;
-    synchronized (this)
-    {
-      dd = cacheData.get(documentIdentifier);
-    }
-    if (dd == null)
-      return null;
-    return dd.getContentType();
-  }
-
-  /** Delete specified item of data.
-  *@param documentIdentifier is the document identifier (url).
-  */
-  public void deleteData(String documentIdentifier)
-  {
-    DocumentData f;
-    synchronized (this)
-    {
-      f = cacheData.remove(documentIdentifier);
-    }
-    if (f != null)
-    {
-      ManifoldCF.deleteFile(f.getData());
-    }
-  }
-
-  // Protected classes
-
-  /** This class represents everything we need to know about a document that's getting passed from the
-  * getDocumentVersions() phase to the processDocuments() phase.
-  */
-  protected static class DocumentData
-  {
-    /** The cache file for the data */
-    protected File data;
-    /** The content-type header value */
-    protected String contentType;
-
-    /** Constructor. */
-    public DocumentData(File data, String contentType)
-    {
-      this.data = data;
-      this.contentType = contentType;
-    }
-
-    /** Get the data */
-    public File getData()
-    {
-      return data;
-    }
-
-    /** Get the contentType */
-    public String getContentType()
-    {
-      return contentType;
-    }
-
-  }
-
-}
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/GetSeedList.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/GetSeedList.java
deleted file mode 100644
index 600b02d..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/GetSeedList.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id: GetSeedList.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used to set the seed list for a specified RSS job.
-*/
-public class GetSeedList
-{
-  public static final String _rcsid = "@(#)$Id: GetSeedList.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private GetSeedList()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: GetSeedList <job_id>");
-      System.err.println("(Writes a set of urls to stdout)");
-      System.exit(-1);
-    }
-
-    String jobString = args[0];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription desc = jobManager.load(new Long(jobString));
-
-      // Edit the job specification
-      Specification ds = desc.getSpecification();
-
-      // Delete all url specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("feed"))
-        {
-          String url = sn.getAttributeValue("url");
-          System.out.println(url);
-        }
-        i++;
-      }
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(-2);
-    }
-  }
-
-}
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/IThrottledConnection.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/IThrottledConnection.java
deleted file mode 100644
index 075a86d..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/IThrottledConnection.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/* $Id: IThrottledConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.io.*;
-
-/** This interface represents an established connection to a URL.
-*/
-public interface IThrottledConnection
-{
-  public static final String _rcsid = "@(#)$Id: IThrottledConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Status code for fetch: OK */
-  public static final int STATUS_OK = 0;
-  /** Status code for fetch: Static error; retries won't help, overall access to site in question */
-  public static final int STATUS_SITEERROR = 1;
-  /** Status code for fetch: Static error; retries won't help, individual page access failed */
-  public static final int STATUS_PAGEERROR = 2;
-  /** Status code for fetch: No change. */
-  public static final int STATUS_NOCHANGE = 3;
-
-  // Issue codes.
-  public static final int FETCH_NOT_TRIED = -1;
-  public static final int FETCH_CIRCULAR_REDIRECT = -100;
-  public static final int FETCH_BAD_URI = -101;
-  public static final int FETCH_SEQUENCE_ERROR = -102;
-  public static final int FETCH_IO_ERROR = -103;
-  public static final int FETCH_UNKNOWN_ERROR = -999;
-
-  /** Begin the fetch process.
-  * @param fetchType is a short descriptive string describing the kind of fetch being requested.  This
-  *        is used solely for logging purposes.
-  */
-  public void beginFetch(String fetchType)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Execute the fetch and get the return code.  This method uses the
-  * standard logging mechanism to keep track of the fetch attempt.  It also
-  * signals the following three conditions: ServiceInterruption (if a dynamic
-  * error occurs), OK, or a static error code (for a condition where retry is
-  * not likely to be helpful).  The actual HTTP error code is NOT returned by
-  * this method.
-  * @param protocol is the protocol to use to perform the access, e.g. "http"
-  * @param port is the port to use to perform the access, where -1 means "use the default"
-  * @param urlPath is the path part of the url, e.g. "/robots.txt"
-  * @param userAgent is the value of the userAgent header to use.
-  * @param from is the value of the from header to use.
-  * @return the status code: success, static error, or dynamic error.
-  */
-  public int executeFetch(String protocol, int port, String urlPath, String userAgent, String from,
-    String lastETag, String lastModified)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get the http response code.
-  *@return the response code.  This is either an HTTP response code, or one of the codes above.
-  */
-  public int getResponseCode()
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get the response input stream.  It is the responsibility of the caller
-  * to close this stream when done.
-  */
-  public InputStream getResponseBodyStream()
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get a specified response header, if it exists.
-  *@param headerName is the name of the header.
-  *@return the header value, or null if it doesn't exist.
-  */
-  public String getResponseHeader(String headerName)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Done with the fetch.  Call this when the fetch has been completed.  A log entry will be generated
-  * describing what was done.
-  */
-  public void doneFetch(IProcessActivity activities)
-    throws ManifoldCFException;
-
-  /** Close the connection.  Call this to end this server connection.
-  */
-  public void close()
-    throws ManifoldCFException;
-}
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/Messages.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/Messages.java
deleted file mode 100644
index 3765495..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.rss.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.rss";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConfig.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConfig.java
deleted file mode 100644
index 7aefee4..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConfig.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-
-/** Constants for the RSS connector configuration.
-*/
-public class RSSConfig
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-
-  // Constants describing the configuration structure.  This structure describes the "how" of
-  // fetching page data - e.g. bandwidth and fetch constraints, adherance to robots conventions,
-  // etc.
-  // For the throttling part of the connector, the scheduler handles average fetch-rate limits.
-  // The per-connection configuration describes the maximum number of connections per some user-defined criteria, as
-  // well as bandwidth maximums and fetch rate absolute maximums.
-  //
-
-  // Parameters
-  
-  /** Robots usage parameter */
-  public static final String PARAMETER_ROBOTSUSAGE = "Robots usage";
-  /** Email parameter */
-  public static final String PARAMETER_EMAIL = "Email address";
-  /** Max kilobytes per second per server */
-  public static final String PARAMETER_BANDWIDTH = "KB per second";
-  /** Max simultaneous open connections per server */
-  public static final String PARAMETER_MAXOPEN = "Max server connections";
-  /** Max fetches per minute per server */
-  public static final String PARAMETER_MAXFETCHES = "Max fetches per minute";
-  /** The throttle group name */
-  public static final String PARAMETER_THROTTLEGROUP = "Throttle group";
-  /** Proxy host name */
-  public static final String PARAMETER_PROXYHOST = "Proxy host";
-  /** Proxy port */
-  public static final String PARAMETER_PROXYPORT = "Proxy port";
-  /** Proxy auth domain */
-  public static final String PARAMETER_PROXYAUTHDOMAIN = "Proxy authentication domain";
-  /** Proxy auth username */
-  public static final String PARAMETER_PROXYAUTHUSERNAME = "Proxy authentication user name";
-  /** Proxy auth password */
-  public static final String PARAMETER_PROXYAUTHPASSWORD = "Proxy authentication password";
-
-  // Constants used in the document specification part of the configuration structure.
-  // This describes the "what" of the job.
-
-  /** Feed specification node.  Has one attribute, 'url'. */
-  public static final String NODE_FEED = "feed";
-  /** Map entry specification node.  Has two attributes: 'match' and 'map'. */
-  public static final String NODE_MAP = "map";
-  /** Feed timeout.  Attribute = 'value' */
-  public static final String NODE_FEEDTIMEOUT = "feedtimeout";
-  /** Feed rescan time.  Attribute = 'value' */
-  public static final String NODE_FEEDRESCAN = "feedrescan";
-  /** Min feed rescan time.  Attribute = 'value' */
-  public static final String NODE_MINFEEDRESCAN = "minfeedrescan";
-  /** Bad feed rescan time.  Attribute = 'value' */
-  public static final String NODE_BADFEEDRESCAN = "badfeedrescan";
-  /** Access node (forced ACLs).  Attribute is 'token' */
-  public static final String NODE_ACCESS = "access";
-  /** Dechromed mode.  Attribute is 'mode' */
-  public static final String NODE_DECHROMEDMODE = "dechromedmode";
-  /** Chromed mode.  Attribute is 'mode' */
-  public static final String NODE_CHROMEDMODE = "chromedmode";
-  /** Url normalization specification; attrs are 'regexp', 'description', 'reorder',
-  * 'javasessionremoval', 'aspsessionremoval', 'bvsessionremoval', 'phpsessionremoval' */
-  public static final String NODE_URLSPEC = "urlspec";
-  /** Exclude regexps node.  The value of this node contains the regexps that
-  * if any one matches, causes the URL to be excluded from the crawl.  These
-  * regexps are newline separated, and # starts a comment.  */
-  public static final String NODE_EXCLUDES = "excludes";
-  
-  // Attributes
-  
-  /** Url attribute */
-  public static final String ATTR_URL = "url";
-  /** Value attribute */
-  public static final String ATTR_VALUE = "value";
-  /** Name attribute */
-  public static final String ATTR_NAME = "name";
-  /** Token attribute */
-  public static final String ATTR_TOKEN = "token";
-  /** Mode attribute */
-  public static final String ATTR_MODE = "mode";
-  /** Regexp attribute */
-  public static final String ATTR_REGEXP = "regexp";
-  /** Description attribute */
-  public static final String ATTR_DESCRIPTION = "description";
-  /** Reorder attribute */
-  public static final String ATTR_REORDER = "reorder";
-  /** Javasessionremoval attribute */
-  public static final String ATTR_JAVASESSIONREMOVAL = "javasessionremoval";
-  /** Aspsessionremoval attribute */
-  public static final String ATTR_ASPSESSIONREMOVAL = "aspsessionremoval";
-  /** Phpsessionremoval attribute */
-  public static final String ATTR_PHPSESSIONREMOVAL = "phpsessionremoval";
-  /** Bvsessionremoval attribute */
-  public static final String ATTR_BVSESSIONREMOVAL = "bvsessionremoval";
-  /** Match attribute */
-  public static final String ATTR_MATCH = "match";
-  /** Map attribute */
-  public static final String ATTR_MAP = "map";
-  
-  // Values
-  
-  // Robots usage values
-  /** All */
-  public static final String VALUE_ALL = "all";
-  /** None */
-  public static final String VALUE_NONE = "none";
-  /** Data */
-  public static final String VALUE_DATA = "data";
-  
-  // Dechromedmode mode values
-  /** None */
-  //public static final String VALUE_NONE = "none";
-  /** Description */
-  public static final String VALUE_DESCRIPTION = "description";
-  /** Content */
-  public static final String VALUE_CONTENT = "content";
-  
-  // Chromedmode mode values
-  /** Use */
-  public static final String VALUE_USE = "use";
-  /** Skip */
-  public static final String VALUE_SKIP = "skip";
-  /** Metadata */
-  public static final String VALUE_METADATA = "metadata";
-  
-  // Yes/no
-  /** No */
-  public static final String VALUE_NO = "no";
-  /** Yes */
-  public static final String VALUE_YES = "yes";
-  
-}
-
-
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConnector.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConnector.java
deleted file mode 100644
index 7b6df6f..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConnector.java
+++ /dev/null
@@ -1,5967 +0,0 @@
-/* $Id: RSSConnector.java 994959 2010-09-08 10:04:42Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.fuzzyml.*;
-import org.apache.manifoldcf.core.common.DateParser;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import java.text.*;
-import java.util.regex.*;
-
-/** This is the RSS implementation of the IRepositoryConnector interface.
-* This connector basically looks at an RSS document in order to seed the
-* document queue.  The document is always fetched from the same URL (it's
-* specified in the configuration parameters).  The documents subsequently
-* crawled are not scraped for additional links; only the primary document is
-* ingested.  On the other hand, redirections ARE honored, so that various
-* sites that use this trick can be supported (e.g. the BBC)
-*
-*/
-public class RSSConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: RSSConnector.java 994959 2010-09-08 10:04:42Z kwright $";
-
-  protected final static String rssThrottleGroupType = "_RSS_";
-
-  // Usage flag values
-  protected static final int ROBOTS_NONE = 0;
-  protected static final int ROBOTS_DATA = 1;
-  protected static final int ROBOTS_ALL = 2;
-
-  /** Dechromed content mode - none */
-  public static final int DECHROMED_NONE = 0;
-  /** Dechromed content mode - description field */
-  public static final int DECHROMED_DESCRIPTION = 1;
-  /** Dechromed content mode - content field */
-  public static final int DECHROMED_CONTENT = 2;
-
-  /** Chromed suppression mode - use chromed content if dechromed content not available */
-  public static final int CHROMED_USE = 0;
-  /** Chromed suppression mode - skip documents if dechromed content not available */
-  public static final int CHROMED_SKIP = 1;
-  /** Chromed suppression mode - index metadata only if dechromed content not available */
-  public static final int CHROMED_METADATA_ONLY = 2;
-  
-  /** Robots usage flag */
-  protected int robotsUsage = ROBOTS_ALL;
-
-  /** The user-agent for this connector instance */
-  protected String userAgent = null;
-  /** The email address for this connector instance */
-  protected String from = null;
-  /** The minimum milliseconds between fetches */
-  protected long minimumMillisecondsPerFetchPerServer = -1L;
-  /** The maximum open connections */
-  protected int maxOpenConnectionsPerServer = 0;
-  /** The minimum milliseconds between bytes */
-  protected double minimumMillisecondsPerBytePerServer = 0.0;
-  /** The throttle group name */
-  protected String throttleGroupName = null;
-  /** The proxy host */
-  protected String proxyHost = null;
-  /** The proxy port */
-  protected int proxyPort = -1;
-  /** Proxy auth domain */
-  protected String proxyAuthDomain = null;
-  /** Proxy auth username */
-  protected String proxyAuthUsername = null;
-  /** Proxy auth password */
-  protected String proxyAuthPassword = null;
-
-  /** The throttled fetcher used by this instance */
-  protected ThrottledFetcher fetcher = null;
-  /** The robots object used by this instance */
-  protected Robots robots = null;
-
-  /** Storage for fetcher objects */
-  protected static Map<String,ThrottledFetcher> fetcherMap = new HashMap<String,ThrottledFetcher>();
-  /** Storage for robots objects */
-  protected static Map robotsMap = new HashMap();
-
-  /** Flag indicating whether session data is initialized */
-  protected boolean isInitialized = false;
-
-  // A couple of very important points.
-  // The canonical document identifier is simply a URL.
-  // Versions of the document are calculated using a checksum technique
-
-  protected static DataCache cache = new DataCache();
-
-
-  protected static final Map understoodProtocols = new HashMap();
-  static
-  {
-    understoodProtocols.put("http","http");
-    understoodProtocols.put("https","https");
-  }
-
-  // Activity types
-  public final static String ACTIVITY_FETCH = "fetch";
-  public final static String ACTIVITY_ROBOTSPARSE = "robots parse";
-  public final static String ACTIVITY_PROCESS = "process";
-  
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
-
-  /** Constructor.
-  */
-  public RSSConnector()
-  {
-  }
-
-  /** Establish a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (!isInitialized)
-    {
-      String x;
-
-      String emailAddress = params.getParameter(RSSConfig.PARAMETER_EMAIL);
-      if (emailAddress == null)
-        throw new ManifoldCFException("Missing email address");
-      userAgent = "Mozilla/5.0 (ApacheManifoldCFRSSFeedReader; "+((emailAddress==null)?"":emailAddress)+")";
-      from = emailAddress;
-
-      String robotsUsageString = params.getParameter(RSSConfig.PARAMETER_ROBOTSUSAGE);
-      robotsUsage = ROBOTS_ALL;
-      if (robotsUsageString == null || robotsUsageString.length() == 0 || robotsUsageString.equals(RSSConfig.VALUE_ALL))
-        robotsUsage = ROBOTS_ALL;
-      else if (robotsUsageString.equals(RSSConfig.VALUE_NONE))
-        robotsUsage = ROBOTS_NONE;
-      else if (robotsUsageString.equals(RSSConfig.VALUE_DATA))
-        robotsUsage = ROBOTS_DATA;
-
-      proxyHost = params.getParameter(RSSConfig.PARAMETER_PROXYHOST);
-      String proxyPortString = params.getParameter(RSSConfig.PARAMETER_PROXYPORT);
-      proxyAuthDomain = params.getParameter(RSSConfig.PARAMETER_PROXYAUTHDOMAIN);
-      proxyAuthUsername = params.getParameter(RSSConfig.PARAMETER_PROXYAUTHUSERNAME);
-      proxyAuthPassword = params.getObfuscatedParameter(RSSConfig.PARAMETER_PROXYAUTHPASSWORD);
-
-      proxyPort = -1;
-      if (proxyPortString != null && proxyPortString.length() > 0)
-      {
-        try
-        {
-          proxyPort = Integer.parseInt(proxyPortString);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-
-      // Read throttling configuration parameters
-      minimumMillisecondsPerBytePerServer = 0.0;
-      maxOpenConnectionsPerServer = 10;
-      minimumMillisecondsPerFetchPerServer = 0L;
-
-      x = params.getParameter(RSSConfig.PARAMETER_BANDWIDTH);
-      if (x != null && x.length() > 0)
-      {
-        try
-        {
-          int maxKBytesPerSecondPerServer = Integer.parseInt(x);
-          if (maxKBytesPerSecondPerServer > 0)
-            minimumMillisecondsPerBytePerServer = 1.0/(double)maxKBytesPerSecondPerServer;
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-        }
-      }
-
-      x = params.getParameter(RSSConfig.PARAMETER_MAXOPEN);
-      if (x != null && x.length() > 0)
-      {
-        try
-        {
-          maxOpenConnectionsPerServer = Integer.parseInt(x);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-        }
-      }
-
-      x = params.getParameter(RSSConfig.PARAMETER_MAXFETCHES);
-      if (x != null && x.length() > 0)
-      {
-        try
-        {
-          int maxFetches = Integer.parseInt(x);
-          if (maxFetches == 0)
-            maxFetches = 1;
-          minimumMillisecondsPerFetchPerServer = 60000L/((long)maxFetches);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-        }
-
-      }
-
-      IThrottleGroups tg = ThrottleGroupsFactory.make(currentContext);
-      // Create the throttle group
-      tg.createOrUpdateThrottleGroup(rssThrottleGroupType, throttleGroupName, new ThrottleSpec(maxOpenConnectionsPerServer,
-        minimumMillisecondsPerFetchPerServer, minimumMillisecondsPerBytePerServer));
-      
-      isInitialized = true;
-    }
-  }
-
-  
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{ACTIVITY_FETCH, ACTIVITY_ROBOTSPARSE, ACTIVITY_PROCESS};
-  }
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    // This connector is currently structured that the RSS feeds are the seeds.
-    return MODEL_ALL;
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  * Note well: There are no exceptions allowed from this call, since it is expected to mainly establish connection parameters.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    // Do the necessary bookkeeping around connection counting
-    throttleGroupName = params.getParameter(RSSConfig.PARAMETER_THROTTLEGROUP);
-    if (throttleGroupName == null)
-      throttleGroupName = "";
-
-    fetcher = getFetcher();
-    robots = getRobots(fetcher);
-
-    // Let the system know we have a connection.
-    fetcher.noteConnectionEstablished();
-    robots.noteConnectionEstablished();
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    fetcher.poll();
-    robots.poll();
-  }
-
-  /** Check status of connection.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    getSession();
-    return super.check();
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    isInitialized = false;
-
-    // Let the system know we are freeing the connection
-    robots.noteConnectionReleased();
-    fetcher.noteConnectionReleased();
-
-    userAgent = null;
-    from = null;
-    minimumMillisecondsPerFetchPerServer = -1L;
-    maxOpenConnectionsPerServer = 0;
-    minimumMillisecondsPerBytePerServer = 0.0;
-    throttleGroupName = null;
-    proxyHost = null;
-    proxyPort = -1;
-    proxyAuthDomain = null;
-    proxyAuthUsername = null;
-    proxyAuthPassword = null;
-
-    super.disconnect();
-  }
-
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    try
-    {
-      WebURL uri = new WebURL(documentIdentifier);
-      return new String[]{uri.getHost()};
-    }
-    catch (URISyntaxException e)
-    {
-      return new String[]{""};
-    }
-
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-
-    Filter f = new Filter(spec,true);
-
-    // Go through all the seeds.
-    Iterator<String> iter = f.getSeeds();
-    while (iter.hasNext())
-    {
-      String canonicalURL = iter.next();
-      activities.addSeedDocument(canonicalURL);
-    }
-    return "";
-  }
-
-  /** Convert an absolute or relative URL to a document identifier.  This may involve several steps at some point,
-  * but right now it does NOT involve converting the host name to a canonical host name.
-  * (Doing so would destroy the ability of virtually hosted sites to do the right thing,
-  * since the original host name would be lost.)  Thus, we do the conversion to IP address
-  * right before we actually fetch the document.
-  *@param policies are the canonicalization policies in effect.
-  *@param parentIdentifier the identifier of the document in which the raw url was found, or null if none.
-  *@param rawURL is the raw, un-normalized and un-canonicalized url.
-  *@return the canonical URL (the document identifier), or null if the url was illegal.
-  */
-  protected static String makeDocumentIdentifier(CanonicalizationPolicies policies, String parentIdentifier, String rawURL)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // First, find the matching canonicalization policy, if any
-      CanonicalizationPolicy p = policies.findMatch(rawURL);
-
-      // Filter out control characters
-      StringBuilder sb = new StringBuilder();
-      int i = 0;
-      while (i < rawURL.length())
-      {
-        char x = rawURL.charAt(i++);
-        // Only 7-bit ascii is allowed in URLs - and that has limits too (no control characters)
-        if (x >= ' ' && x < 128)
-          sb.append(x);
-      }
-      rawURL = sb.toString();
-
-      WebURL url;
-      if (parentIdentifier != null)
-      {
-        WebURL parentURL = new WebURL(parentIdentifier);
-        url = parentURL.resolve(rawURL);
-      }
-      else
-        url = new WebURL(rawURL);
-
-      String protocol = url.getScheme();
-      String host = url.getHost();
-
-      // The new URL better darn well have a host and a protocol, and we only know how to deal with
-      // http and https.
-      if (protocol == null || host == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because it has no protocol or host");
-        return null;
-      }
-      if (understoodProtocols.get(protocol) == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because it has an unsupported protocol '"+protocol+"'");
-        return null;
-      }
-
-      // Canonicalization procedure.
-      // The query part of the URL may contain bad parameters (session id's, for instance), or may be ordered in such a
-      // way as to prevent an effectively identical URL from being matched.  The anchor part of the URL should also be stripped.
-      // This code performs both of these activities in a simple way; rewrites of various pieces may get more involved if we add
-      // the ability to perform mappings using criteria specified in the UI.  Right now we don't.
-      String id = doCanonicalization(p,url);
-      if (id == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because it could not be canonicalized");
-        return null;
-      }
-
-      // As a last basic legality check, go through looking for illegal characters.
-      i = 0;
-      while (i < id.length())
-      {
-        char x = id.charAt(i++);
-        // Only 7-bit ascii is allowed in URLs - and that has limits too (no control characters)
-        if (x < ' ' || x > 127)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because it has illegal characters in it");
-          return null;
-        }
-      }
-
-      return id;
-    }
-    catch (java.net.URISyntaxException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because it is badly formed: "+e.getMessage());
-      return null;
-    }
-    catch (java.lang.IllegalArgumentException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because there was an argument error: "+e.getMessage(),e);
-      return null;
-    }
-    catch (java.lang.NullPointerException e)
-    {
-      // This gets tossed by url.toAsciiString() for reasons I don't understand, but which have to do with a malformed URL.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: Can't use url '"+rawURL+"' because it is missing fields: "+e.getMessage(),e);
-      return null;
-    }
-  }
-
-  /** Code to canonicalize a URL.  If URL cannot be canonicalized (and is illegal) return null.
-  */
-  protected static String doCanonicalization(CanonicalizationPolicy p, WebURL url)
-    throws ManifoldCFException, java.net.URISyntaxException
-  {
-    // Note well: The java.net.URI class mistreats the query part of the URI, near as I can tell, in the following ways:
-    // (1) It decodes the whole thing without regards to the argument interpretation, so the escaped ampersands etc in the arguments are converted
-    //     to non-escaped ones (ugh).  This is why I changed the code below to parse the RAW query string and decode it myself.
-    // (2) On reassembly of the query string, the class does not properly escape ":", "/", or a bunch of other characters the class description *says*
-    //     it will escape.  This means it creates URI's that are illegal according to RFC 2396 - although it is true that RFC 2396 also contains
-    //     apparent errors.
-    //
-    // I've therefore opted to deal with this problem by doing much of the query string processing myself - including its final reassembly into the
-    // URI at the end of the processing.
-    //
-
-    // To make the url be canonical, we need to strip off everything after the #.  We also need to order the arguments in a canonical
-    // way, and remove session identifiers of the types we know about.
-    String queryString = url.getRawQuery();
-    if (queryString != null)
-    {
-      // Rewrite the query string.  To do this, we first parse it (by looking for ampersands and equal signs), and then
-      // we ditch any keys that we really don't want (session identifiers particularly).  Finally, we go through the
-      // keys in sorted order and reassemble the query, making sure that any arguments that have the same name
-      // appear in the same order.
-
-      // I don't use the 'split' operation because I think it's a lot more oomph (and performance loss) than is needed
-      // for this simple parsing task.
-
-      // When reordering a url, the following is done:
-      // (1) The individual order of all arguments with the same name is preserved
-      // (2) The arguments themselves appear in sorted order, minus any arguments that should be removed because they
-      //      are interpreted to be session arguments.
-      //
-      // When a url is NOT reordered, the following is done:
-      // (1) Each argument is examined IN TURN.
-      // (2) If the argument is a session argument and should be excluded, it is simply skipped.
-
-      // Canonicalization note: Broadvision
-      //
-      // The format of Broadvision's urls is as follows:
-      // http://blah/path/path?arg|arg|arg|BVSession@@@@=xxxx&more stuff
-      // The session identifier is the BVSession@@@@.  In theory I could strip this away, but I've found that
-      // most Broadvision sites require session even for basic navigation!
-
-      if (p == null || p.canReorder())
-      {
-        // Reorder the arguments.
-        HashMap argumentMap = new HashMap();
-        int index = 0;
-        while (index < queryString.length())
-        {
-          int newIndex = queryString.indexOf("&",index);
-          if (newIndex == -1)
-            newIndex = queryString.length();
-          String argument = queryString.substring(index,newIndex);
-          int valueIndex = argument.indexOf("=");
-          String key;
-          if (valueIndex == -1)
-            key = argument;
-          else
-            key = argument.substring(0,valueIndex);
-
-          // If this is a disallowed argument, simply don't include it in the final map.
-          boolean includeArgument = true;
-          if ((p == null || p.canRemovePhpSession()) && key.equals("PHPSESSID"))
-            includeArgument = false;
-          if ((p == null || p.canRemoveBvSession()) && key.indexOf("BVSession@@@@") != -1)
-            includeArgument = false;
-
-          if (includeArgument)
-          {
-            ArrayList list = (ArrayList)argumentMap.get(key);
-            if (list == null)
-            {
-              list = new ArrayList();
-              argumentMap.put(key,list);
-            }
-            list.add(argument);
-          }
-
-          if (newIndex < queryString.length())
-            index = newIndex + 1;
-          else
-            index = newIndex;
-        }
-
-        // Reassemble query string in sorted order
-        String[] sortArray = new String[argumentMap.size()];
-        int i = 0;
-        Iterator iter = argumentMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          sortArray[i++] = (String)iter.next();
-        }
-        java.util.Arrays.sort(sortArray);
-
-        StringBuilder newString = new StringBuilder();
-        boolean isFirst = true;
-        i = 0;
-        while (i < sortArray.length)
-        {
-          String key = sortArray[i++];
-          ArrayList list = (ArrayList)argumentMap.get(key);
-          int j = 0;
-          while (j < list.size())
-          {
-            if (isFirst == false)
-            {
-              newString.append("&");
-            }
-            else
-              isFirst = false;
-            newString.append((String)list.get(j++));
-          }
-        }
-        queryString = newString.toString();
-      }
-      else
-      {
-        // Do not reorder!
-        StringBuilder newString = new StringBuilder();
-        int index = 0;
-        boolean isFirst = true;
-        while (index < queryString.length())
-        {
-          int newIndex = queryString.indexOf("&",index);
-          if (newIndex == -1)
-            newIndex = queryString.length();
-          String argument = queryString.substring(index,newIndex);
-          int valueIndex = argument.indexOf("=");
-          String key;
-          if (valueIndex == -1)
-            key = argument;
-          else
-            key = argument.substring(0,valueIndex);
-
-          // If this is a disallowed argument, simply don't include it in the final query.
-          boolean includeArgument = true;
-          if ((p == null || p.canRemovePhpSession()) && key.equals("PHPSESSID"))
-            includeArgument = false;
-          if ((p == null || p.canRemoveBvSession()) && key.indexOf("BVSession@@@@") != -1)
-            includeArgument = false;
-
-          if (includeArgument)
-          {
-            if (!isFirst)
-              newString.append("&");
-            else
-              isFirst = false;
-            newString.append(argument);
-          }
-
-          if (newIndex < queryString.length())
-            index = newIndex + 1;
-          else
-            index = newIndex;
-        }
-        queryString = newString.toString();
-      }
-    }
-
-    // Now, rewrite path to get rid of jsessionid etc.
-    String pathString = url.getPath();
-    if (pathString != null)
-    {
-      int index = pathString.indexOf(";jsessionid=");
-      if ((p == null || p.canRemoveJavaSession()) && index != -1)
-      {
-        // There's a ";jsessionid="
-        // Strip the java session id
-        pathString = pathString.substring(0,index);
-      }
-      if ((p == null || p.canRemoveAspSession()) && pathString.startsWith("/s("))
-      {
-        // It's asp.net
-        index = pathString.indexOf(")");
-        if (index != -1)
-          pathString = pathString.substring(index+1);
-      }
-
-    }
-
-    // Put it back into the URL without the ref, and with the modified query and path parts.
-    url = new WebURL(url.getScheme(),url.getHost(),url.getPort(),pathString,queryString);
-    String rval = url.toASCIIString();
-    return rval;
-  }
-
-  protected static Set<String> xmlContentTypes;
-  static
-  {
-    xmlContentTypes = new HashSet<String>();
-    xmlContentTypes.add("text/xml");
-    xmlContentTypes.add("application/rss+xml");
-    xmlContentTypes.add("application/xml");
-    xmlContentTypes.add("application/atom+xml");
-    xmlContentTypes.add("application/xhtml+xml");
-    xmlContentTypes.add("text/XML");
-    xmlContentTypes.add("application/rdf+xml");
-    xmlContentTypes.add("text/application");
-    xmlContentTypes.add("XML");
-  }
-
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-
-    // The connection limit is designed to permit this connector to coexist with potentially other connectors, such as the web connector.
-    // There is currently no good way to enforce connection limits across all installed connectors - this will require considerably more
-    // thought to set up properly.
-    int connectionLimit = 200;
-
-    String[] fixedList = new String[2];
-
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("RSS: In getDocumentVersions for "+Integer.toString(documentIdentifiers.length)+" documents");
-
-    Filter f = new Filter(spec,false);
-
-    String[] acls = f.getAcls();
-    // Sort it,
-    java.util.Arrays.sort(acls);
-
-    // NOTE: There are two kinds of documents in here; documents that are RSS feeds (that presumably have a content-type
-    // of text/xml), and documents that need to be indexed.
-    //
-    // For the latter, the metadata etc is part of the version string.  For the former, the only thing that is part of the version string is the
-    // document's checksum.
-    //
-    // The need to exclude documents from fetch based on whether they match an expression causes some difficulties, because we really
-    // DON'T want this to apply to the feeds themselves.  Since the distinguishing characteristic of a feed is that it is in the seed list,
-    // and that its content-type is text/xml, we could use either of these characteristics to treat feeds differently from
-    // fetchable urls.  But the latter approach requires a fetch, which is forbidden.  So - the spec will be used to characterize the url.
-    // However, the spec might change, and the url might be dropped from the list - and then what??
-    //
-    // The final solution is to simply not queue what cannot be mapped.
-
-    int feedTimeout = f.getFeedTimeoutValue();
-
-    // The document specification has already been used to trim out documents that are not
-    // allowed from appearing in the queue.  So, even that has already been done.
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      // If it is in this list, we presume that it has been vetted against the map etc., so we don't do that again.  We just fetch it.
-      // And, if the content type is xml, we calculate the version as if it is a feed rather than a document.
-
-      // Get the url
-      String urlValue = documentIdentifier;
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: Getting version string for '"+urlValue+"'");
-
-      String versionString;
-      String ingestURL = null;
-      String[] pubDates = null;
-      String[] sources = null;
-      String[] titles = null;
-      String[] authorNames = null;
-      String[] authorEmails = null;
-      String[] categories = null;
-      String[] descriptions = null;
-                  
-      try
-      {
-        // If there's a carrydown "data" value for this url, we use that value rather than actually fetching the document.  This also means we don't need to
-        // do a robots check, because we aren't actually crawling anything.  So, ALWAYS do this first...
-        CharacterInput[] dechromedData = activities.retrieveParentDataAsFiles(urlValue,"data");
-        try
-        {
-          if (dechromedData.length > 0)
-          {
-            // Data already available.  The fetch cycle can be entirely avoided, as can the robots check.
-            ingestURL = f.mapDocumentURL(urlValue);
-            if (ingestURL != null)
-            {
-              // Open up an input stream corresponding to the carrydown data.  The stream will be encoded as utf-8.
-              try
-              {
-                InputStream is = dechromedData[0].getUtf8Stream();
-                try
-                {
-                  StringBuilder sb = new StringBuilder();
-                  long checkSum = cache.addData(activities,urlValue,"text/html",is);
-                  // Grab what we need from the passed-down data for the document.  These will all become part
-                  // of the version string.
-                  pubDates = activities.retrieveParentData(urlValue,"pubdate");
-                  sources = activities.retrieveParentData(urlValue,"source");
-                  titles = activities.retrieveParentData(urlValue,"title");
-                  authorNames = activities.retrieveParentData(urlValue,"authorname");
-                  authorEmails = activities.retrieveParentData(urlValue,"authoremail");
-                  categories = activities.retrieveParentData(urlValue,"category");
-                  descriptions = activities.retrieveParentData(urlValue,"description");
-                  java.util.Arrays.sort(pubDates);
-                  java.util.Arrays.sort(sources);
-                  java.util.Arrays.sort(titles);
-                  java.util.Arrays.sort(authorNames);
-                  java.util.Arrays.sort(authorEmails);
-                  java.util.Arrays.sort(categories);
-                  java.util.Arrays.sort(descriptions);
-
-                  if (sources.length == 0)
-                  {
-                    if (Logging.connectors.isDebugEnabled())
-                      Logging.connectors.debug("RSS: Warning; URL '"+ingestURL+"' doesn't seem to have any RSS feed source!");
-                  }
-
-                  sb.append('+');
-                  packList(sb,acls,'+');
-                  if (acls.length > 0)
-                  {
-                    sb.append('+');
-                    pack(sb,defaultAuthorityDenyToken,'+');
-                  }
-                  else
-                    sb.append('-');
-                  // The ingestion URL
-                  pack(sb,ingestURL,'+');
-                  // The pub dates
-                  packList(sb,pubDates,'+');
-                  // The titles
-                  packList(sb,titles,'+');
-                  // The sources
-                  packList(sb,sources,'+');
-                  // The categories
-                  packList(sb,categories,'+');
-                  // The descriptions
-                  packList(sb,descriptions,'+');
-                  // The author names
-                  packList(sb,authorNames,'+');
-                  // The author emails
-                  packList(sb,authorEmails,'+');
-
-                  // Do the checksum part, which does not need to be parseable.
-                  sb.append(new Long(checkSum).toString());
-
-                  versionString = sb.toString();
-                }
-                finally
-                {
-                  is.close();
-                }
-              }
-              catch (java.net.SocketTimeoutException e)
-              {
-                throw new ManifoldCFException("IO exception reading data from string: "+e.getMessage(),e);
-              }
-              catch (InterruptedIOException e)
-              {
-                throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-              }
-              catch (IOException e)
-              {
-                throw new ManifoldCFException("IO exception reading data from string: "+e.getMessage(),e);
-              }
-            }
-            else
-            {
-              // Document a seed or unmappable; just skip
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Skipping carry-down document '"+urlValue+"' because it is unmappable or is a seed.");
-            }
-          }
-          else
-          {
-            // Get the old version string
-            String oldVersionString = statuses.getIndexedVersionString(documentIdentifier);
-
-            // Unpack the old version as much as possible.
-            // We are interested in what the ETag and Last-Modified headers were last time.
-            String lastETagValue = null;
-            String lastModifiedValue = null;
-            // Note well: Non-continuous jobs cannot use etag because the rss document MUST be fetched each time for such jobs,
-            // or the documents it points at would get deleted.
-            //
-            // NOTE: I disabled this code because we really need the feed's TTL value in order to reschedule properly.  I can't get the
-            // TTL value without refetching the document - therefore ETag and Last-Modified cannot be used :-(
-            if (false && jobMode == JOBMODE_CONTINUOUS && oldVersionString != null && oldVersionString.startsWith("-"))
-            {
-              // It's a feed, so the last etag and last-modified fields should be encoded in this version string.
-              StringBuilder lastETagBuffer = new StringBuilder();
-              int unpackPos = unpack(lastETagBuffer,oldVersionString,1,'+');
-              StringBuilder lastModifiedBuffer = new StringBuilder();
-              unpackPos = unpack(lastModifiedBuffer,oldVersionString,unpackPos,'+');
-              if (lastETagBuffer.length() > 0)
-                lastETagValue = lastETagBuffer.toString();
-              if (lastModifiedBuffer.length() > 0)
-                lastModifiedValue = lastModifiedBuffer.toString();
-            }
-
-            if (Logging.connectors.isDebugEnabled() && (lastETagValue != null || lastModifiedValue != null))
-              Logging.connectors.debug("RSS: Document '"+urlValue+"' was found to have a previous ETag value of '"+((lastETagValue==null)?"null":lastETagValue)+
-              "' and a previous Last-Modified value of '"+((lastModifiedValue==null)?"null":lastModifiedValue)+"'");
-
-            // Robots check.  First, we need to separate the url into its components
-            URL url;
-            try
-            {
-              url = new URL(urlValue);
-            }
-            catch (MalformedURLException e)
-            {
-              Logging.connectors.debug("RSS: URL '"+urlValue+"' is malformed; skipping",e);
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            String protocol = url.getProtocol();
-            int port = url.getPort();
-            String hostName = url.getHost();
-            String pathPart = url.getFile();
-
-            // Check with robots to see if it's allowed
-            if (robotsUsage >= ROBOTS_DATA && !robots.isFetchAllowed(currentContext,throttleGroupName,
-              protocol,port,hostName,url.getPath(),
-              userAgent,from,
-              proxyHost, proxyPort, proxyAuthDomain, proxyAuthUsername, proxyAuthPassword,
-              activities, connectionLimit))
-            {
-              activities.recordActivity(null,ACTIVITY_FETCH,
-                null,urlValue,Integer.toString(-2),"Robots exclusion",null);
-
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Skipping url '"+urlValue+"' because robots.txt says to");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-              
-            // Now, use the fetcher, and get the file.
-            IThrottledConnection connection = fetcher.createConnection(currentContext,
-              throttleGroupName,
-              hostName,
-              connectionLimit,
-              feedTimeout,
-              proxyHost,
-              proxyPort,
-              proxyAuthDomain,
-              proxyAuthUsername,
-              proxyAuthPassword,
-              activities);
-            try
-            {
-              // Begin the fetch
-              connection.beginFetch("Data");
-              try
-              {
-                // Execute the request.
-                // Use the connect timeout from the document specification!
-                int status = connection.executeFetch(protocol,port,pathPart,userAgent,from,
-                  lastETagValue,lastModifiedValue);
-                switch (status)
-                {
-                case IThrottledConnection.STATUS_NOCHANGE:
-                  versionString = oldVersionString;
-                  break;
-                case IThrottledConnection.STATUS_OK:
-                  try
-                  {
-                    if (Logging.connectors.isDebugEnabled())
-                      Logging.connectors.debug("RSS: Successfully fetched "+urlValue);
-                    // Document successfully fetched!
-                    // If its content is xml, presume it's a feed...
-                    String contentType = connection.getResponseHeader("Content-Type");
-                    // Some sites have multiple content types.  We just look at the LAST one in that case.
-                    if (contentType != null)
-                    {
-                      String[] contentTypes = contentType.split(",");
-                      if (contentTypes.length > 0)
-                        contentType = contentTypes[contentTypes.length-1].trim();
-                      else
-                        contentType = null;
-                    }
-                    String strippedContentType = contentType;
-                    if (strippedContentType != null)
-                    {
-                      int pos = strippedContentType.indexOf(";");
-                      if (pos != -1)
-                        strippedContentType = strippedContentType.substring(0,pos).trim();
-                    }
-                    boolean isXML = (strippedContentType != null && xmlContentTypes.contains(strippedContentType));
-                    ingestURL = null;
-                    if (!isXML)
-                    {
-                      // If the chromed content mode is set to "skip", and we got here, it means
-                      // we should not include the content.
-                      if (f.getChromedContentMode() == CHROMED_SKIP)
-                      {
-                        if (Logging.connectors.isDebugEnabled())
-                          Logging.connectors.debug("RSS: Removing url '"+urlValue+"' because it no longer has dechromed content available");
-                        versionString = null;
-                        break;
-                      }
-
-                      // Decide whether to exclude this document based on what we see here.
-                      // Basically, we want to get rid of everything that we don't know what
-                      // to do with in the ingestion system.
-                      if (!activities.checkMimeTypeIndexable(contentType))
-                      {
-                        if (Logging.connectors.isDebugEnabled())
-                          Logging.connectors.debug("RSS: Removing url '"+urlValue+"' because it had the wrong content type: "+((contentType==null)?"null":"'"+contentType+"'"));
-                        versionString = null;
-                        break;
-                      }
-
-                      ingestURL = f.mapDocumentURL(urlValue);
-                    }
-                    else
-                    {
-                      if (Logging.connectors.isDebugEnabled())
-                        Logging.connectors.debug("RSS: The url '"+urlValue+"' is a feed");
-
-                      if (!f.isSeed(urlValue))
-                      {
-                        // Remove the feed from consideration, since it has left the list of seeds
-                        if (Logging.connectors.isDebugEnabled())
-                          Logging.connectors.debug("RSS: Removing feed url '"+urlValue+"' because it is not a seed.");
-                        versionString = null;
-                        break;
-                      }
-                    }
-
-                    InputStream is = connection.getResponseBodyStream();
-                    try
-                    {
-                      long checkSum = cache.addData(activities,urlValue,contentType,is);
-                      StringBuilder sb = new StringBuilder();
-                      if (ingestURL != null)
-                      {
-                        // We think it is ingestable.  The version string accordingly starts with a "+".
-
-                        // Grab what we need from the passed-down data for the document.  These will all become part
-                        // of the version string.
-                        pubDates = activities.retrieveParentData(urlValue,"pubdate");
-                        sources = activities.retrieveParentData(urlValue,"source");
-                        titles = activities.retrieveParentData(urlValue,"title");
-                        authorNames = activities.retrieveParentData(urlValue,"authorname");
-                        authorEmails = activities.retrieveParentData(urlValue,"authoremail");
-                        categories = activities.retrieveParentData(urlValue,"category");
-                        descriptions = activities.retrieveParentData(urlValue,"description");
-                        java.util.Arrays.sort(pubDates);
-                        java.util.Arrays.sort(sources);
-                        java.util.Arrays.sort(titles);
-                        java.util.Arrays.sort(authorNames);
-                        java.util.Arrays.sort(authorEmails);
-                        java.util.Arrays.sort(categories);
-                        java.util.Arrays.sort(descriptions);
-
-                        if (sources.length == 0)
-                        {
-                          if (Logging.connectors.isDebugEnabled())
-                            Logging.connectors.debug("RSS: Warning; URL '"+ingestURL+"' doesn't seem to have any RSS feed source!");
-                        }
-
-                        sb.append('+');
-                        packList(sb,acls,'+');
-                        if (acls.length > 0)
-                        {
-                          sb.append('+');
-                          pack(sb,defaultAuthorityDenyToken,'+');
-                        }
-                        else
-                          sb.append('-');
-                        // The ingestion URL
-                        pack(sb,ingestURL,'+');
-                        // The pub dates
-                        packList(sb,pubDates,'+');
-                        // The titles
-                        packList(sb,titles,'+');
-                        // The sources
-                        packList(sb,sources,'+');
-                        // The categories
-                        packList(sb,categories,'+');
-                        // The descriptions
-                        packList(sb,descriptions,'+');
-                        // The author names
-                        packList(sb,authorNames,'+');
-                        // The author emails
-                        packList(sb,authorEmails,'+');
-                      }
-                      else
-                      {
-                        sb.append('-');
-                        String etag = connection.getResponseHeader("ETag");
-                        if (etag == null)
-                          pack(sb,"",'+');
-                        else
-                          pack(sb,etag,'+');
-                        String lastModified = connection.getResponseHeader("Last-Modified");
-                        if (lastModified == null)
-                          pack(sb,"",'+');
-                        else
-                          pack(sb,lastModified,'+');
-
-                      }
-
-                      // Do the checksum part, which does not need to be parseable.
-                      sb.append(new Long(checkSum).toString());
-
-                      versionString = sb.toString();
-                    }
-                    finally
-                    {
-                      is.close();
-                    }
-                  }
-                  catch (java.net.SocketTimeoutException e)
-                  {
-                    Logging.connectors.warn("RSS: Socket timeout exception fetching document contents '"+urlValue+"' - skipping: "+e.getMessage(), e);
-                    versionString = null;
-                  }
-                  catch (ConnectTimeoutException e)
-                  {
-                    Logging.connectors.warn("RSS: Connecto timeout exception fetching document contents '"+urlValue+"' - skipping: "+e.getMessage(), e);
-                    versionString = null;
-                  }
-                  catch (InterruptedIOException e)
-                  {
-                    throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-                  }
-                  catch (IOException e)
-                  {
-                    Logging.connectors.warn("RSS: IO exception fetching document contents '"+urlValue+"' - skipping: "+e.getMessage(), e);
-                    versionString = null;
-                  }
-
-                  break;
-
-                case IThrottledConnection.STATUS_SITEERROR:
-                case IThrottledConnection.STATUS_PAGEERROR:
-                default:
-                  // Record an *empty* version.
-                  // This signals the processDocuments() method that we really don't want to ingest this document, but we also don't
-                  // want to blow the document out of the queue, since then we'd wind up perhaps fetching it multiple times.
-                  versionString = "";
-                  break;
-                }
-              }
-              finally
-              {
-                connection.doneFetch(activities);
-              }
-            }
-            finally
-            {
-              connection.close();
-            }
-                
-            if (versionString == null)
-            {
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-                
-            if (!(versionString.length() == 0 || activities.checkDocumentNeedsReindexing(documentIdentifier,versionString)))
-              continue;
-              
-            // Process document!
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: Processing '"+urlValue+"'");
-
-            // The only links we extract come from documents that we think are RSS feeds.
-            // When we think that's the case, we attempt to parse it as RSS XML.
-            if (ingestURL == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Interpreting document '"+urlValue+"' as a feed");
-
-              // We think it is a feed.
-              // If this is a continuous job, AND scanonly is true, it means that the document was either identical to the
-              // previous fetch, or was not fetched at all.  In that case, it may not even be there, and we *certainly* don't
-              // want to attempt to process it in any case.
-              //
-
-              // NOTE: I re-enabled the scan permanently because we need the TTL value to be set whatever the cost.  If the
-              // TTL value is not set, we default to the specified job's feed-rescan time, which is not going to be current enough for some feeds.
-              if (true || jobMode != JOBMODE_CONTINUOUS)
-              {
-                handleRSSFeedSAX(urlValue,activities,f);
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("RSS: Extraction of feed '"+urlValue+"' complete");
-
-                // Record the feed's version string, so we won't refetch unless needed.
-                // This functionality is required for the last ETag and Last-Modified fields to be sent to the rss server, and to
-                // keep track of the adaptive parameters.
-                activities.recordDocument(documentIdentifier,versionString);
-              }
-              else
-              {
-                // The problem here is that we really do need to set the rescan time to something reasonable.
-                // But we might not even have read the feed!  So what to do??
-                // One answer is to build a connector-specific table that carries the last value of every feed around.
-                // Another answer is to change the version code to always read the feed (and the heck with ETag and Last-Modified).
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("RSS: Feed '"+urlValue+"' does not appear to differ from previous fetch for a continuous job; not extracting!");
-
-                long currentTime = System.currentTimeMillis();
-                
-                Long defaultRescanTime = f.getDefaultRescanTime(currentTime);
-
-                if (defaultRescanTime != null)
-                {
-                  Long minimumTime = f.getMinimumRescanTime(currentTime);
-                  if (minimumTime != null)
-                  {
-                    if (defaultRescanTime.longValue() < minimumTime.longValue())
-                      defaultRescanTime = minimumTime;
-                  }
-                }
-
-                activities.setDocumentScheduleBounds(urlValue,defaultRescanTime,defaultRescanTime,null,null);
-
-              }
-            }
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Interpreting '"+urlValue+"' as a document");
-              
-              String errorCode = null;
-              String errorDesc = null;
-              long startTime = System.currentTimeMillis();
-              Long fileLengthLong = null;
-              try
-              {
-                long documentLength = cache.getDataLength(documentIdentifier);
-                if (!activities.checkLengthIndexable(documentLength))
-                {
-                  activities.noDocument(documentIdentifier,versionString);
-                  errorCode = activities.EXCLUDED_LENGTH;
-                  errorDesc = "Document rejected because of length ("+documentLength+")";
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug("RSS: Skipping document '"+urlValue+"' because its length was rejected ("+documentLength+")");
-                  continue;
-                }
-
-                if (!activities.checkURLIndexable(documentIdentifier))
-                {
-                  activities.noDocument(documentIdentifier,versionString);
-                  errorCode = activities.EXCLUDED_URL;
-                  errorDesc = "Document rejected because of URL ('"+documentIdentifier+"')";
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug("RSS: Skipping document '"+urlValue+"' because its URL was rejected ('"+documentIdentifier+"')");
-                  continue;
-                }
-
-                // Check if it's a recognized content type
-                String contentType = cache.getContentType(documentIdentifier);
-                // Some sites have multiple content types.  We just look at the LAST one in that case.
-                if (contentType != null)
-                {
-                  String[] contentTypes = contentType.split(",");
-                  if (contentTypes.length > 0)
-                    contentType = contentTypes[contentTypes.length-1].trim();
-                  else
-                    contentType = null;
-                }
-                if (!activities.checkMimeTypeIndexable(contentType))
-                {
-                  activities.noDocument(documentIdentifier,versionString);
-                  errorCode = activities.EXCLUDED_MIMETYPE;
-                  errorDesc = "Document rejected because of mime type ("+contentType+")";
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug("RSS: Skipping document '"+urlValue+"' because its mime type was rejected ('"+contentType+"')");
-                  continue;
-                }
-                
-                // Treat it as an ingestable document.
-                    
-                long dataSize = cache.getDataLength(urlValue);
-                RepositoryDocument rd = new RepositoryDocument();
-
-                // Set content type
-                if (contentType != null)
-                  rd.setMimeType(contentType);
-
-                // Turn into acls and add into description
-                String[] denyAcls;
-                if (acls == null)
-                  denyAcls = null;
-                else if (acls.length == 0)
-                  denyAcls = new String[0];
-                else
-                  denyAcls = new String[]{defaultAuthorityDenyToken};
-                        
-                if (acls != null && denyAcls != null)
-                  rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acls,denyAcls);
-
-                if (titles != null && titles.length > 0)
-                  rd.addField("title",titles);
-                if (authorNames != null && authorNames.length > 0)
-                  rd.addField("authorname",authorNames);
-                if (authorEmails != null && authorEmails.length > 0)
-                  rd.addField("authoremail",authorEmails);
-                if (descriptions != null && descriptions.length > 0)
-                  rd.addField("summary",descriptions);
-                if (sources != null && sources.length > 0)
-                  rd.addField("source",sources);
-                if (categories != null && categories.length > 0)
-                  rd.addField("category",categories);
-
-                // The pubdates are a ms since epoch value; we want the minimum one for the origination time.
-                Long minimumOrigTime = null;
-                if (pubDates != null && pubDates.length > 0)
-                {
-                  String[] pubDateValuesISO = new String[pubDates.length];
-                  TimeZone tz = TimeZone.getTimeZone("UTC");
-                  DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.ROOT);
-                  df.setTimeZone(tz);
-                  for (int k = 0; k < pubDates.length; k++)
-                  {
-                    String pubDate = pubDates[k];
-                    try
-                    {
-                      Long pubDateLong = new Long(pubDate);
-                      if (minimumOrigTime == null || pubDateLong.longValue() < minimumOrigTime.longValue())
-                        minimumOrigTime = pubDateLong;
-                      pubDateValuesISO[k] = df.format(new Date(pubDateLong.longValue()));
-                    }
-                    catch (NumberFormatException e)
-                    {
-                      // Do nothing; the version string seems to not mean anything
-                      pubDateValuesISO[k] = "";
-                    }
-                  }
-                  rd.addField("pubdate",pubDates);
-                  rd.addField("pubdateiso",pubDateValuesISO);
-                }
-
-                if (minimumOrigTime != null)
-                  activities.setDocumentOriginationTime(urlValue,minimumOrigTime);
-
-                InputStream is = cache.getData(urlValue);
-                if (is != null)
-                {
-                  try
-                  {
-                    rd.setBinary(is,dataSize);
-                    try
-                    {
-                      activities.ingestDocumentWithException(documentIdentifier,versionString,ingestURL,rd);
-                      errorCode = "OK";
-                      fileLengthLong = new Long(dataSize);
-                    }
-                    catch (IOException e)
-                    {
-                      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                      errorDesc = e.getMessage();
-                      handleIOException(e,"reading data");
-                    }
-                  }
-                  finally
-                  {
-                    try
-                    {
-                      is.close();
-                    }
-                    catch (IOException e)
-                    {
-                      errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                      errorDesc = e.getMessage();
-                      handleIOException(e,"closing stream");
-                    }
-                  }
-                }
-              }
-              catch (ManifoldCFException e)
-              {
-                if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                  errorCode = null;
-                throw e;
-              }
-              finally
-              {
-                if (errorCode != null)
-                  activities.recordActivity(new Long(startTime),ACTIVITY_PROCESS,
-                    null,urlValue,errorCode,errorDesc,null);
-              }
-            }
-          }
-        }
-        finally
-        {
-          for (CharacterInput ci : dechromedData)
-          {
-            if (ci != null)
-              ci.discard();
-          }
-
-        }
-      }
-      finally
-      {
-        // Remove any fetched documents.
-        cache.deleteData(documentIdentifier);
-      }
-    }
-  }
-
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-      throw new ManifoldCFException("IO error "+context+": "+e.getMessage(),e);
-    else if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    else
-      throw new ManifoldCFException("IO error "+context+": "+e.getMessage(),e);
-  }
-  
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Email"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Robots"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Bandwidth"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Proxy"));
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.email.value != \"\" && editconnection.email.value.indexOf(\"@\") == -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.NeedAValidEmailAddress")+"\");\n"+
-"    editconnection.email.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.bandwidth.value != \"\" && !isInteger(editconnection.bandwidth.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.EnterAValidNumberOrBlankForNoLimit")+"\");\n"+
-"    editconnection.bandwidth.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.connections.value == \"\" || !isInteger(editconnection.connections.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.EnterAValidNumberForTheMaxNumberOfOpenConnectionsPerServer")+"\");\n"+
-"    editconnection.connections.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.fetches.value != \"\" && !isInteger(editconnection.fetches.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.EnterAValidNumberOrBlankForNoLimit")+"\");\n"+
-"    editconnection.fetches.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.email.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.Email")+"\");\n"+
-"    editconnection.email.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String email = parameters.getParameter(RSSConfig.PARAMETER_EMAIL);
-    if (email == null)
-      email = "";
-    String robotsUsage = parameters.getParameter(RSSConfig.PARAMETER_ROBOTSUSAGE);
-    if (robotsUsage == null)
-      robotsUsage = RSSConfig.VALUE_ALL;
-    String bandwidth = parameters.getParameter(RSSConfig.PARAMETER_BANDWIDTH);
-    if (bandwidth == null)
-      bandwidth = "64";
-    String connections = parameters.getParameter(RSSConfig.PARAMETER_MAXOPEN);
-    if (connections == null)
-      connections = "2";
-    String fetches = parameters.getParameter(RSSConfig.PARAMETER_MAXFETCHES);
-    if (fetches == null)
-      fetches = "12";
-    String throttleGroup = parameters.getParameter(RSSConfig.PARAMETER_THROTTLEGROUP);
-    if (throttleGroup == null)
-      throttleGroup = "";
-    String proxyHost = parameters.getParameter(RSSConfig.PARAMETER_PROXYHOST);
-    if (proxyHost == null)
-      proxyHost = "";
-    String proxyPort = parameters.getParameter(RSSConfig.PARAMETER_PROXYPORT);
-    if (proxyPort == null)
-      proxyPort = "";
-    String proxyAuthDomain = parameters.getParameter(RSSConfig.PARAMETER_PROXYAUTHDOMAIN);
-    if (proxyAuthDomain == null)
-      proxyAuthDomain = "";
-    String proxyAuthUsername = parameters.getParameter(RSSConfig.PARAMETER_PROXYAUTHUSERNAME);
-    if (proxyAuthUsername == null)
-      proxyAuthUsername = "";
-    String proxyAuthPassword = parameters.getObfuscatedParameter(RSSConfig.PARAMETER_PROXYAUTHPASSWORD);
-    if (proxyAuthPassword == null)
-      proxyAuthPassword = "";
-    else
-      proxyAuthPassword = out.mapPasswordToKey(proxyAuthPassword);
-      
-    // Email tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Email")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.EmailAddressToContactColon") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"email\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(email)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"email\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(email)+"\"/>\n"
-      );
-    }
-
-    // Robots tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Robots")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.RobotsTxtUsageColon") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"robotsusage\" size=\"3\">\n"+
-"        <option value=\"none\" "+(robotsUsage.equals(RSSConfig.VALUE_NONE)?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"RSSConnector.DontLookAtRobotsTxt") + "</option>\n"+
-"        <option value=\"data\" "+(robotsUsage.equals(RSSConfig.VALUE_DATA)?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"RSSConnector.ObeyRobotsTxtForDataFetchesOnly") + "</option>\n"+
-"        <option value=\"all\" "+(robotsUsage.equals(RSSConfig.VALUE_ALL)?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"RSSConnector.ObeyRobotsTxtForAllFetches") + "</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"robotsusage\" value=\""+robotsUsage+"\"/>\n"
-      );
-    }
-
-    // Bandwidth tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Bandwidth")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.MaxKBytesPerSecondPerServerColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"6\" name=\"bandwidth\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(bandwidth)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.MaxConnectionsPerServerColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"4\" name=\"connections\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connections)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.MaxFetchesPerMinutePerServerColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"4\" name=\"fetches\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(fetches)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ThrottleGroupNameColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"throttlegroup\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(throttleGroup)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"bandwidth\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(bandwidth)+"\"/>\n"+
-"<input type=\"hidden\" name=\"connections\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connections)+"\"/>\n"+
-"<input type=\"hidden\" name=\"fetches\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(fetches)+"\"/>\n"+
-"<input type=\"hidden\" name=\"throttlegroup\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(throttleGroup)+"\"/>\n"
-      );
-    }
-    
-    // Proxy tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Proxy")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ProxyHostColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"40\" name=\"proxyhost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ProxyPortColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"proxyport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyPort)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ProxyAuthenticationDomainColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"proxyauthdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyAuthDomain)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ProxyAuthenticationUserNameColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"proxyauthusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyAuthUsername)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ProxyAuthenticationPasswordColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"password\" size=\"16\" name=\"proxyauthpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyAuthPassword)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"proxyhost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyPort)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyauthusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyAuthUsername)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyauthdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyAuthDomain)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyauthpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyAuthPassword)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String email = variableContext.getParameter("email");
-    if (email != null)
-      parameters.setParameter(RSSConfig.PARAMETER_EMAIL,email);
-    String robotsUsage = variableContext.getParameter("robotsusage");
-    if (robotsUsage != null)
-      parameters.setParameter(RSSConfig.PARAMETER_ROBOTSUSAGE,robotsUsage);
-    String bandwidth = variableContext.getParameter("bandwidth");
-    if (bandwidth != null)
-      parameters.setParameter(RSSConfig.PARAMETER_BANDWIDTH,bandwidth);
-    String connections = variableContext.getParameter("connections");
-    if (connections != null)
-      parameters.setParameter(RSSConfig.PARAMETER_MAXOPEN,connections);
-    String fetches = variableContext.getParameter("fetches");
-    if (fetches != null)
-      parameters.setParameter(RSSConfig.PARAMETER_MAXFETCHES,fetches);
-    String throttleGroup = variableContext.getParameter("throttlegroup");
-    if (throttleGroup != null)
-      parameters.setParameter(RSSConfig.PARAMETER_THROTTLEGROUP,throttleGroup);
-    String proxyHost = variableContext.getParameter("proxyhost");
-    if (proxyHost != null)
-      parameters.setParameter(RSSConfig.PARAMETER_PROXYHOST,proxyHost);
-    String proxyPort = variableContext.getParameter("proxyport");
-    if (proxyPort != null)
-      parameters.setParameter(RSSConfig.PARAMETER_PROXYPORT,proxyPort);
-    String proxyAuthDomain = variableContext.getParameter("proxyauthdomain");
-    if (proxyAuthDomain != null)
-      parameters.setParameter(RSSConfig.PARAMETER_PROXYAUTHDOMAIN,proxyAuthDomain);
-    String proxyAuthUsername = variableContext.getParameter("proxyauthusername");
-    if (proxyAuthUsername != null)
-      parameters.setParameter(RSSConfig.PARAMETER_PROXYAUTHUSERNAME,proxyAuthUsername);
-    String proxyAuthPassword = variableContext.getParameter("proxyauthpassword");
-    if (proxyAuthPassword != null)
-      parameters.setObfuscatedParameter(RSSConfig.PARAMETER_PROXYAUTHPASSWORD,variableContext.mapKeyToPassword(proxyAuthPassword));
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.ParametersColon") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=<"+Integer.toString(kmanager.getContents().length)+Messages.getBodyString(locale,"RSSConnector.certificates")+"></nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"RSSConnector.URLs"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Canonicalization"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.URLMappings"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Exclusions"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.TimeValues"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.Security"));
-    tabsArray.add(Messages.getString(locale,"RSSConnector.DechromedContent"));
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"AddRegexp(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"rssmatch.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.MatchMustHaveARegexpValue")+"\");\n"+
-"    editjob."+seqPrefix+"rssmatch.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"rssop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"RemoveRegexp(index, anchorvalue)\n"+
-"{\n"+
-"  editjob."+seqPrefix+"rssindex.value = index;\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"rssop\",\"Delete\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.TypeInAnAccessToken")+"\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"URLRegexpDelete(index, anchorvalue)\n"+
-"{\n"+
-"  editjob."+seqPrefix+"urlregexpnumber.value = index;\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"urlregexpop\",\"Delete\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"URLRegexpAdd(anchorvalue)\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"urlregexpop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"checkSpecification()\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"feedtimeout.value == \"\" || !isInteger(editjob."+seqPrefix+"feedtimeout.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.ATimeoutValueInSecondsIsRequired")+"\");\n"+
-"    editjob."+seqPrefix+"feedtimeout.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"feedrefetch.value == \"\" || !isInteger(editjob."+seqPrefix+"feedrefetch.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.ARefetchIntervalInMinutesIsRequired")+"\");\n"+
-"    editjob."+seqPrefix+"feedrefetch.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"minfeedrefetch.value == \"\" || !isInteger(editjob."+seqPrefix+"minfeedrefetch.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.AMinimumRefetchIntervalInMinutesIsRequire")+"\");\n"+
-"    editjob."+seqPrefix+"minfeedrefetch.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editjob."+seqPrefix+"badfeedrefetch.value != \"\" && !isInteger(editjob."+seqPrefix+"badfeedrefetch.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"RSSConnector.ABadFeedRefetchIntervalInMinutesIsRequired")+"\");\n"+
-"    editjob."+seqPrefix+"badfeedrefetch.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    int i;
-    int k;
-
-
-    // Build the url seed string, and the url regexp match and map
-    StringBuilder sb = new StringBuilder();
-    ArrayList regexp = new ArrayList();
-    ArrayList matchStrings = new ArrayList();
-    int feedTimeoutValue = 60;
-    int feedRefetchValue = 60;
-    int minFeedRefetchValue = 15;
-    Integer badFeedRefetchValue = null;
-    String exclusions = "";
-
-    // Now, loop through paths
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_FEED))
-      {
-        String rssURL = sn.getAttributeValue(RSSConfig.ATTR_URL);
-        if (rssURL != null)
-        {
-          sb.append(rssURL).append("\n");
-        }
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_EXCLUDES))
-      {
-        exclusions = sn.getValue();
-        if (exclusions == null)
-          exclusions = "";
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_MAP))
-      {
-        String match = sn.getAttributeValue(RSSConfig.ATTR_MATCH);
-        String map = sn.getAttributeValue(RSSConfig.ATTR_MAP);
-        if (match != null)
-        {
-          regexp.add(match);
-          if (map == null)
-            map = "";
-          matchStrings.add(map);
-        }
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_FEEDTIMEOUT))
-      {
-        String value = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-        feedTimeoutValue = Integer.parseInt(value);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_FEEDRESCAN))
-      {
-        String value = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-        feedRefetchValue = Integer.parseInt(value);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_MINFEEDRESCAN))
-      {
-        String value = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-        minFeedRefetchValue = Integer.parseInt(value);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_BADFEEDRESCAN))
-      {
-        String value = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-        badFeedRefetchValue = new Integer(value);
-      }
-    }
-
-    // URLs tab
-
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.URLs")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\" colspan=\"2\">\n"+
-"      <textarea rows=\"25\" cols=\"80\" name=\""+seqPrefix+"rssurls\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sb.toString())+"</textarea>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"rssurls\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sb.toString())+"\"/>\n"
-      );
-    }
-
-    // Exclusions tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Exclusions")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.Exclude") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"1\">\n"+
-"      <textarea rows=\"25\" cols=\"60\" name=\""+seqPrefix+"exclusions\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(exclusions)+"</textarea>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"exclusions\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(exclusions)+"\"/>\n"
-      );
-    }
-
-    // Canonicalization tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Canonicalization")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"boxcell\" colspan=\"2\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"urlregexpop\" value=\"Continue\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"urlregexpnumber\" value=\"\"/>\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.URLRegularExpression")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.Description")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.Reorder")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemoveJSPSessions")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemoveASPSessions")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemovePHPSessions")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemoveBVSessions")+"</nobr></td>\n"+
-"        </tr>\n"
-      );
-      int q = 0;
-      int l = 0;
-      while (q < ds.getChildCount())
-      {
-        SpecificationNode specNode = ds.getChild(q++);
-        if (specNode.getType().equals(RSSConfig.NODE_URLSPEC))
-        {
-          // Ok, this node matters to us
-          String regexpString = specNode.getAttributeValue(RSSConfig.ATTR_REGEXP);
-          String description = specNode.getAttributeValue(RSSConfig.ATTR_DESCRIPTION);
-          if (description == null)
-            description = "";
-          String allowReorder = specNode.getAttributeValue(RSSConfig.ATTR_REORDER);
-          if (allowReorder == null || allowReorder.length() == 0)
-            allowReorder = RSSConfig.VALUE_NO;
-          String allowJavaSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_JAVASESSIONREMOVAL);
-          if (allowJavaSessionRemoval == null || allowJavaSessionRemoval.length() == 0)
-            allowJavaSessionRemoval = RSSConfig.VALUE_NO;
-          String allowASPSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_ASPSESSIONREMOVAL);
-          if (allowASPSessionRemoval == null || allowASPSessionRemoval.length() == 0)
-            allowASPSessionRemoval = RSSConfig.VALUE_NO;
-          String allowPHPSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_PHPSESSIONREMOVAL);
-          if (allowPHPSessionRemoval == null || allowPHPSessionRemoval.length() == 0)
-            allowPHPSessionRemoval = RSSConfig.VALUE_NO;
-          String allowBVSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_BVSESSIONREMOVAL);
-          if (allowBVSessionRemoval == null || allowBVSessionRemoval.length() == 0)
-            allowBVSessionRemoval = RSSConfig.VALUE_NO;
-          out.print(
-"        <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\">\n"+
-"              <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"RSSConnector.DeleteUrlRegexp")+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(regexpString)+"\" onclick='javascript:"+seqPrefix+"URLRegexpDelete("+Integer.toString(l)+",\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\");'/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(regexpString)+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexpdesc_"+Integer.toString(l)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexpreorder_"+Integer.toString(l)+"\" value=\""+allowReorder+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexpjava_"+Integer.toString(l)+"\" value=\""+allowJavaSessionRemoval+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexpasp_"+Integer.toString(l)+"\" value=\""+allowASPSessionRemoval+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexpphp_"+Integer.toString(l)+"\" value=\""+allowPHPSessionRemoval+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+seqPrefix+"urlregexpbv_"+Integer.toString(l)+"\" value=\""+allowBVSessionRemoval+"\"/>\n"+
-"            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(regexpString)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
-"          <td class=\"formcolumncell\">"+allowReorder+"</td>\n"+
-"          <td class=\"formcolumncell\">"+allowJavaSessionRemoval+"</td>\n"+
-"          <td class=\"formcolumncell\">"+allowASPSessionRemoval+"</td>\n"+
-"          <td class=\"formcolumncell\">"+allowPHPSessionRemoval+"</td>\n"+
-"          <td class=\"formcolumncell\">"+allowBVSessionRemoval+"</td>\n"+
-"        </tr>\n"
-          );
-
-          l++;
-        }
-      }
-      if (l == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td colspan=\"8\" class=\"formcolumnmessage\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.NoCanonicalizationSpecified")+"</nobr></td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td colspan=\"8\" class=\"formseparator\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\">\n"+
-"              <input type=\"button\" value=\"Add\" alt=\""+Messages.getAttributeString(locale,"RSSConnector.AddUlRegexp")+"\" onclick='javascript:"+seqPrefix+"URLRegexpAdd(\""+seqPrefix+"urlregexp_"+Integer.toString(l+1)+"\");'/>\n"+
-"              <input type=\"hidden\" name=\""+seqPrefix+"urlregexpcount\" value=\""+Integer.toString(l)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"text\" name=\""+seqPrefix+"urlregexp\" size=\"30\" value=\"\"/></td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"text\" name=\""+seqPrefix+"urlregexpdesc\" size=\"30\" value=\"\"/></td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpreorder\" value=\"yes\"/></td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpjava\" value=\"yes\" checked=\"true\"/></td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpasp\" value=\"yes\" checked=\"true\"/></td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpphp\" value=\"yes\" checked=\"true\"/></td>\n"+
-"          <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpbv\" value=\"yes\" checked=\"true\"/></td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Post the canonicalization specification
-      int q = 0;
-      int l = 0;
-      while (q < ds.getChildCount())
-      {
-        SpecificationNode specNode = ds.getChild(q++);
-        if (specNode.getType().equals(RSSConfig.NODE_URLSPEC))
-        {
-          // Ok, this node matters to us
-          String regexpString = specNode.getAttributeValue(RSSConfig.ATTR_REGEXP);
-          String description = specNode.getAttributeValue(RSSConfig.ATTR_DESCRIPTION);
-          if (description == null)
-            description = "";
-          String allowReorder = specNode.getAttributeValue(RSSConfig.ATTR_REORDER);
-          if (allowReorder == null || allowReorder.length() == 0)
-            allowReorder = RSSConfig.VALUE_NO;
-          String allowJavaSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_JAVASESSIONREMOVAL);
-          if (allowJavaSessionRemoval == null || allowJavaSessionRemoval.length() == 0)
-            allowJavaSessionRemoval = RSSConfig.VALUE_NO;
-          String allowASPSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_ASPSESSIONREMOVAL);
-          if (allowASPSessionRemoval == null || allowASPSessionRemoval.length() == 0)
-            allowASPSessionRemoval = RSSConfig.VALUE_NO;
-          String allowPHPSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_PHPSESSIONREMOVAL);
-          if (allowPHPSessionRemoval == null || allowPHPSessionRemoval.length() == 0)
-            allowPHPSessionRemoval = RSSConfig.VALUE_NO;
-          String allowBVSessionRemoval = specNode.getAttributeValue(RSSConfig.ATTR_BVSESSIONREMOVAL);
-          if (allowBVSessionRemoval == null || allowBVSessionRemoval.length() == 0)
-            allowBVSessionRemoval = RSSConfig.VALUE_NO;
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(regexpString)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpdesc_"+Integer.toString(l)+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpreorder_"+Integer.toString(l)+"\" value=\""+allowReorder+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpjava_"+Integer.toString(l)+"\" value=\""+allowJavaSessionRemoval+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpasp_"+Integer.toString(l)+"\" value=\""+allowASPSessionRemoval+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpphp_"+Integer.toString(l)+"\" value=\""+allowPHPSessionRemoval+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpbv_"+Integer.toString(l)+"\" value=\""+allowBVSessionRemoval+"\"/>\n"
-          );
-          l++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpcount\" value=\""+Integer.toString(l)+"\"/>\n"
-      );
-    }
-  
-    // Mappings tab
-
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.URLMappings")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"rssop\" value=\"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"rssindex\" value=\"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"rssmapcount\" value=\""+Integer.toString(regexp.size())+"\"/>\n"+
-"\n"+
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"4\"><hr/></td></tr>\n"
-      );
-
-      i = 0;
-      while (i < regexp.size())
-      {
-        String prefix = seqPrefix+"rssregexp_"+Integer.toString(i)+"_";
-        out.print(
-"  <tr>\n"+
-"    <td class=\"value\">\n"+
-"      <a name=\""+seqPrefix+"regexp_"+Integer.toString(i)+"\">\n"+
-"        <input type=\"button\" value=\""+Messages.getAttributeString(locale,"RSSConnector.Remove")+"\" onclick='javascript:"+seqPrefix+"RemoveRegexp("+Integer.toString(i)+",\""+seqPrefix+"regexp_"+Integer.toString(i)+"\")' alt=\""+Messages.getAttributeString(locale,"RSSConnector.RemoveRegexp")+Integer.toString(i)+"\"/>\n"+
-"      </a>\n"+
-"    </td>\n"+
-"    <td class=\"value\"><input type=\"hidden\" name=\""+prefix+"match"+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape((String)regexp.get(i))+"\"/>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape((String)regexp.get(i))+"</td>\n"+
-"    <td class=\"value\">--&gt;</td>\n"+
-"    <td class=\"value\">\n"
-        );
-        String match = (String)matchStrings.get(i);
-        out.print(
-"      <input type=\"hidden\" name=\""+prefix+"map"+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(match)+"\"/>\n"
-        );
-        if (match.length() == 0)
-        {
-          out.print(
-"      &lt;as is&gt;\n"
-          );
-        }
-        else
-        {
-          out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(match)+"\n"
-          );
-        }
-        out.print(
-"    </td>\n"+
-"  </tr>\n"
-        );
-        i++;
-      }
-      out.print(
-"  <tr>\n"+
-"    <td class=\"value\"><a name=\""+seqPrefix+"regexp_"+Integer.toString(i)+"\"><input type=\"button\" value=\""+Messages.getAttributeString(locale,"RSSConnector.Add")+"\" onclick='javascript:"+seqPrefix+"AddRegexp(\""+seqPrefix+"regexp_"+Integer.toString(i+1)+"\")' alt=\""+Messages.getAttributeString(locale,"RSSConnector.AddRegexp")+"\"/></a></td>\n"+
-"    <td class=\"value\"><input type=\"text\" name=\""+seqPrefix+"rssmatch\" size=\"16\" value=\"\"/></td>\n"+
-"    <td class=\"value\">--&gt;</td>\n"+
-"    <td class=\"value\"><input type=\"text\" name=\""+seqPrefix+"rssmap\" size=\"16\" value=\"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"rssmapcount\" value=\""+Integer.toString(regexp.size())+"\"/>\n"
-      );
-      i = 0;
-      while (i < regexp.size())
-      {
-        String prefix = seqPrefix+"rssregexp_"+Integer.toString(i)+"_";
-        String match = (String)matchStrings.get(i);
-        out.print(
-"<input type=\"hidden\" name=\""+prefix+"match"+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape((String)regexp.get(i))+"\"/>\n"+
-"<input type=\"hidden\" name=\""+prefix+"map"+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(match)+"\"/>\n"
-        );
-        i++;
-      }
-    }
-
-    // Timeout Value tab
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.TimeValues")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.FeedConnectTimeout")+"</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\""+seqPrefix+"feedtimeout\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(feedTimeoutValue))+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.DefaultFeedRefetchTime")+"</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\""+seqPrefix+"feedrefetch\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(feedRefetchValue))+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.MinimumFeedRefetchTime")+"</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\""+seqPrefix+"minfeedrefetch\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(minFeedRefetchValue))+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.BadFeedRefetchTime")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"badfeedrefetch_present\" value=\"true\"/>\n"+
-"      <input type=\"text\" size=\"5\" name=\""+seqPrefix+"badfeedrefetch\" value=\""+((badFeedRefetchValue==null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(badFeedRefetchValue.toString()))+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"feedtimeout\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(feedTimeoutValue))+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"feedrefetch\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(feedRefetchValue))+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"minfeedrefetch\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(minFeedRefetchValue))+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"badfeedrefetch_present\" value=\"true\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"badfeedrefetch\" value=\""+((badFeedRefetchValue==null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(badFeedRefetchValue.toString()))+"\"/>\n"
-      );
-    }
-
-    // Dechromed content tab
-    String dechromedMode = RSSConfig.VALUE_NONE;
-    String chromedMode = RSSConfig.VALUE_USE;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_DECHROMEDMODE))
-        dechromedMode = sn.getAttributeValue(RSSConfig.ATTR_MODE);
-      else if (sn.getType().equals(RSSConfig.NODE_CHROMEDMODE))
-        chromedMode = sn.getAttributeValue(RSSConfig.ATTR_MODE);
-    }
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.DechromedContent")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"1\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\"><nobr><input type=\"radio\" name=\""+seqPrefix+"dechromedmode\" value=\"none\" "+(dechromedMode.equals(RSSConfig.VALUE_NONE)?"checked=\"true\"":"")+"/>"+Messages.getBodyString(locale,"RSSConnector.NoDechromedContent")+"</nobr></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\"><nobr><input type=\"radio\" name=\""+seqPrefix+"dechromedmode\" value=\"description\" "+(dechromedMode.equals(RSSConfig.VALUE_DESCRIPTION)?"checked=\"true\"":"")+"/>"+Messages.getBodyString(locale,"RSSConnector.DechromedContentIfPresentInDescriptionField")+"</nobr></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\"><nobr><input type=\"radio\" name=\""+seqPrefix+"dechromedmode\" value=\"content\" "+(dechromedMode.equals(RSSConfig.VALUE_CONTENT)?"checked=\"true\"":"")+"/>"+Messages.getBodyString(locale,"RSSConnector.DechromedContentIfPresentInContentField")+"</nobr></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"separator\"><hr/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\"><nobr><input type=\"radio\" name=\""+seqPrefix+"chromedmode\" value=\"use\" "+(chromedMode.equals(RSSConfig.VALUE_USE)?"checked=\"true\"":"")+"/>"+Messages.getBodyString(locale,"RSSConnector.UseChromedContentIfNoDechromedContentFound")+"</nobr></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\"><nobr><input type=\"radio\" name=\""+seqPrefix+"chromedmode\" value=\"skip\" "+(chromedMode.equals(RSSConfig.VALUE_SKIP)?"checked=\"true\"":"")+"/>"+Messages.getBodyString(locale,"RSSConnector.NeverUseChromedContent")+"</nobr></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"value\"><nobr><input type=\"radio\" name=\""+seqPrefix+"chromedmode\" value=\"metadata\" "+(chromedMode.equals(RSSConfig.VALUE_METADATA)?"checked=\"true\"":"")+"/>"+Messages.getBodyString(locale,"RSSConnector.NoContentMetadataOnly")+"</nobr></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"dechromedmode\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(dechromedMode)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+seqPrefix+"chromedmode\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(chromedMode)+"\"/>\n"
-      );
-    }
-  
-    // Security tab
-    // There is no native security, so all we care about are the tokens.
-    i = 0;
-
-    if (tabName.equals(Messages.getString(locale,"RSSConnector.Security")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(RSSConfig.NODE_ACCESS))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String accessOpName = seqPrefix+"accessop"+accessDescription;
-          String token = sn.getAttributeValue(RSSConfig.ATTR_TOKEN);
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Delete\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")' alt=\""+Messages.getAttributeString(locale,"RSSConnector.DeleteToken")+Integer.toString(k)+"\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0)
-      {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale,"RSSConnector.NoAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+
-"        <input type=\"button\" value=\"Add\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")' alt=\""+Messages.getAttributeString(locale,"RSSConnector.AddAccessToken")+"\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Finally, go through forced ACL
-      i = 0;
-      k = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals(RSSConfig.NODE_ACCESS))
-        {
-          String accessDescription = "_"+Integer.toString(k);
-          String token = sn.getAttributeValue(RSSConfig.ATTR_TOKEN);
-          out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"
-      );
-    }
-
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Get the map
-    String value = variableContext.getParameter(seqPrefix+"rssmapcount");
-    if (value != null)
-    {
-      int mapsize = Integer.parseInt(value);
-
-      // Clear it first
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_MAP))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-
-      // Grab the map values
-      j = 0;
-      while (j < mapsize)
-      {
-        String prefix = seqPrefix+"rssregexp_"+Integer.toString(j)+"_";
-        String match = variableContext.getParameter(prefix+"match");
-        String map = variableContext.getParameter(prefix+"map");
-        if (map == null)
-          map = "";
-        // Add to the documentum specification
-        SpecificationNode node = new SpecificationNode(RSSConfig.NODE_MAP);
-        node.setAttribute(RSSConfig.ATTR_MATCH,match);
-        node.setAttribute(RSSConfig.ATTR_MAP,map);
-        ds.addChild(ds.getChildCount(),node);
-
-        j++;
-      }
-    }
-
-    // Get the cgiPath
-    String rssURLSequence = variableContext.getParameter(seqPrefix+"rssurls");
-    if (rssURLSequence != null)
-    {
-      // Delete all url specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(RSSConfig.NODE_FEED))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      try
-      {
-        java.io.Reader str = new java.io.StringReader(rssURLSequence);
-        try
-        {
-          java.io.BufferedReader is = new java.io.BufferedReader(str);
-          try
-          {
-            while (true)
-            {
-              String nextString = is.readLine();
-              if (nextString == null)
-                break;
-              if (nextString.length() == 0)
-                continue;
-              SpecificationNode node = new SpecificationNode(RSSConfig.NODE_FEED);
-              node.setAttribute(RSSConfig.ATTR_URL,nextString);
-              ds.addChild(ds.getChildCount(),node);
-            }
-          }
-          finally
-          {
-            is.close();
-          }
-        }
-        finally
-        {
-          str.close();
-        }
-      }
-      catch (java.io.IOException e)
-      {
-        throw new ManifoldCFException("IO error: "+e.getMessage(),e);
-      }
-    }
-
-    // Read the url specs
-    String urlRegexpCount = variableContext.getParameter(seqPrefix+"urlregexpcount");
-    if (urlRegexpCount != null && urlRegexpCount.length() > 0)
-    {
-      int regexpCount = Integer.parseInt(urlRegexpCount);
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_URLSPEC))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      
-      // Grab the operation and the index (if any)
-      String operation = variableContext.getParameter(seqPrefix+"urlregexpop");
-      if (operation == null)
-        operation = "Continue";
-      int opIndex = -1;
-      if (operation.equals("Delete"))
-        opIndex = Integer.parseInt(variableContext.getParameter(seqPrefix+"urlregexpnumber"));
-      
-      // Reconstruct urlspec nodes
-      j = 0;
-      while (j < regexpCount)
-      {
-        // For each index, first look for a delete operation
-        if (!operation.equals("Delete") || j != opIndex)
-        {
-          // Add the jth node
-          String regexp = variableContext.getParameter(seqPrefix+"urlregexp_"+Integer.toString(j));
-          String regexpDescription = variableContext.getParameter(seqPrefix+"urlregexpdesc_"+Integer.toString(j));
-          String reorder = variableContext.getParameter(seqPrefix+"urlregexpreorder_"+Integer.toString(j));
-          String javaSession = variableContext.getParameter(seqPrefix+"urlregexpjava_"+Integer.toString(j));
-          String aspSession = variableContext.getParameter(seqPrefix+"urlregexpasp_"+Integer.toString(j));
-          String phpSession = variableContext.getParameter(seqPrefix+"urlregexpphp_"+Integer.toString(j));
-          String bvSession = variableContext.getParameter(seqPrefix+"urlregexpbv_"+Integer.toString(j));
-          SpecificationNode newSn = new SpecificationNode(RSSConfig.NODE_URLSPEC);
-          newSn.setAttribute(RSSConfig.ATTR_REGEXP,regexp);
-          if (regexpDescription != null && regexpDescription.length() > 0)
-            newSn.setAttribute(RSSConfig.VALUE_DESCRIPTION,regexpDescription);
-          if (reorder != null && reorder.length() > 0)
-            newSn.setAttribute(RSSConfig.ATTR_REORDER,reorder);
-          if (javaSession != null && javaSession.length() > 0)
-            newSn.setAttribute(RSSConfig.ATTR_JAVASESSIONREMOVAL,javaSession);
-          if (aspSession != null && aspSession.length() > 0)
-            newSn.setAttribute(RSSConfig.ATTR_ASPSESSIONREMOVAL,aspSession);
-          if (phpSession != null && phpSession.length() > 0)
-            newSn.setAttribute(RSSConfig.ATTR_PHPSESSIONREMOVAL,phpSession);
-          if (bvSession != null && bvSession.length() > 0)
-            newSn.setAttribute(RSSConfig.ATTR_BVSESSIONREMOVAL,bvSession);
-          ds.addChild(ds.getChildCount(),newSn);
-        }
-        j++;
-      }
-      if (operation.equals("Add"))
-      {
-        String regexp = variableContext.getParameter(seqPrefix+"urlregexp");
-        String regexpDescription = variableContext.getParameter(seqPrefix+"urlregexpdesc");
-        String reorder = variableContext.getParameter(seqPrefix+"urlregexpreorder");
-        String javaSession = variableContext.getParameter(seqPrefix+"urlregexpjava");
-        String aspSession = variableContext.getParameter(seqPrefix+"urlregexpasp");
-        String phpSession = variableContext.getParameter(seqPrefix+"urlregexpphp");
-        String bvSession = variableContext.getParameter(seqPrefix+"urlregexpbv");
-
-        // Add a new node at the end
-        SpecificationNode newSn = new SpecificationNode(RSSConfig.NODE_URLSPEC);
-        newSn.setAttribute(RSSConfig.ATTR_REGEXP,regexp);
-        if (regexpDescription != null && regexpDescription.length() > 0)
-          newSn.setAttribute(RSSConfig.VALUE_DESCRIPTION,regexpDescription);
-        if (reorder != null && reorder.length() > 0)
-          newSn.setAttribute(RSSConfig.ATTR_REORDER,reorder);
-        if (javaSession != null && javaSession.length() > 0)
-          newSn.setAttribute(RSSConfig.ATTR_JAVASESSIONREMOVAL,javaSession);
-        if (aspSession != null && aspSession.length() > 0)
-          newSn.setAttribute(RSSConfig.ATTR_ASPSESSIONREMOVAL,aspSession);
-        if (phpSession != null && phpSession.length() > 0)
-          newSn.setAttribute(RSSConfig.ATTR_PHPSESSIONREMOVAL,phpSession);
-        if (bvSession != null && bvSession.length() > 0)
-          newSn.setAttribute(RSSConfig.ATTR_BVSESSIONREMOVAL,bvSession);
-        ds.addChild(ds.getChildCount(),newSn);
-      }
-    }
-
-    // Get the exclusions
-    String exclusions = variableContext.getParameter(seqPrefix+"exclusions");
-    if (exclusions != null)
-    {
-      // Delete existing exclusions record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(RSSConfig.NODE_EXCLUDES))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(RSSConfig.NODE_EXCLUDES);
-      cn.setValue(exclusions);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Read the feed timeout, if present
-    String feedTimeoutValue = variableContext.getParameter(seqPrefix+"feedtimeout");
-    if (feedTimeoutValue != null && feedTimeoutValue.length() > 0)
-    {
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_FEEDTIMEOUT))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      SpecificationNode node = new SpecificationNode(RSSConfig.NODE_FEEDTIMEOUT);
-      node.setAttribute(RSSConfig.ATTR_VALUE,feedTimeoutValue);
-      ds.addChild(ds.getChildCount(),node);
-    }
-
-    // Read the feed refetch interval, if present
-    String feedRefetchValue = variableContext.getParameter(seqPrefix+"feedrefetch");
-    if (feedRefetchValue != null && feedRefetchValue.length() > 0)
-    {
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_FEEDRESCAN))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      SpecificationNode node = new SpecificationNode(RSSConfig.NODE_FEEDRESCAN);
-      node.setAttribute(RSSConfig.ATTR_VALUE,feedRefetchValue);
-      ds.addChild(ds.getChildCount(),node);
-    }
-
-    // Read the minimum feed refetch interval, if present
-    String minFeedRefetchValue = variableContext.getParameter(seqPrefix+"minfeedrefetch");
-    if (minFeedRefetchValue != null && minFeedRefetchValue.length() > 0)
-    {
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_MINFEEDRESCAN))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      SpecificationNode node = new SpecificationNode(RSSConfig.NODE_MINFEEDRESCAN);
-      node.setAttribute(RSSConfig.ATTR_VALUE,minFeedRefetchValue);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    
-    // Read the bad feed refetch interval (which is allowed to be null)
-    String badFeedRefetchValuePresent = variableContext.getParameter(seqPrefix+"badfeedrefetch_present");
-    if (badFeedRefetchValuePresent != null && badFeedRefetchValuePresent.length() > 0)
-    {
-      String badFeedRefetchValue = variableContext.getParameter(seqPrefix+"badfeedrefetch");
-      int k = 0;
-      while (k < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(k);
-        if (sn.getType().equals(RSSConfig.NODE_BADFEEDRESCAN))
-          ds.removeChild(k);
-        else
-          k++;
-      }
-      if (badFeedRefetchValue != null && badFeedRefetchValue.length() > 0)
-      {
-        SpecificationNode node = new SpecificationNode(RSSConfig.NODE_BADFEEDRESCAN);
-        node.setAttribute(RSSConfig.ATTR_VALUE,badFeedRefetchValue);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-    
-    // Read the dechromed mode
-    String dechromedMode = variableContext.getParameter(seqPrefix+"dechromedmode");
-    if (dechromedMode != null && dechromedMode.length() > 0)
-    {
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_DECHROMEDMODE))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      SpecificationNode node = new SpecificationNode(RSSConfig.NODE_DECHROMEDMODE);
-      node.setAttribute(RSSConfig.ATTR_MODE,dechromedMode);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    
-    // Read the chromed mode
-    String chromedMode = variableContext.getParameter(seqPrefix+"chromedmode");
-    if (chromedMode != null && chromedMode.length() > 0)
-    {
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_CHROMEDMODE))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      SpecificationNode node = new SpecificationNode(RSSConfig.NODE_CHROMEDMODE);
-      node.setAttribute(RSSConfig.ATTR_MODE,chromedMode);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    
-    // Now, do whatever action we were told to do.
-    String rssop = variableContext.getParameter(seqPrefix+"rssop");
-    if (rssop != null && rssop.equals("Add"))
-    {
-      // Add a match to the end
-      String match = variableContext.getParameter(seqPrefix+"rssmatch");
-      String map = variableContext.getParameter(seqPrefix+"rssmap");
-      SpecificationNode node = new SpecificationNode(RSSConfig.NODE_MAP);
-      node.setAttribute(RSSConfig.ATTR_MATCH,match);
-      node.setAttribute(RSSConfig.ATTR_MAP,map);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    else if (rssop != null && rssop.equals("Delete"))
-    {
-      int index = Integer.parseInt(variableContext.getParameter(seqPrefix+"rssindex"));
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(RSSConfig.NODE_MAP))
-        {
-          if (index == 0)
-          {
-            ds.removeChild(j);
-            break;
-          }
-          index--;
-        }
-        j++;
-      }
-    }
-
-    String xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null)
-    {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(RSSConfig.NODE_ACCESS))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode(RSSConfig.NODE_ACCESS);
-        node.setAttribute(RSSConfig.ATTR_TOKEN,accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode(RSSConfig.NODE_ACCESS);
-        node.setAttribute(RSSConfig.ATTR_TOKEN,accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    String exclusions = "";
-
-    out.print(
-"<table class=\"displaytable\">\n"
-    );
-    int i = 0;
-    boolean seenAny = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_FEED))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RSSUrls")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue(RSSConfig.ATTR_URL))+"</nobr><br/>\n"
-        );
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_EXCLUDES))
-      {
-        exclusions = sn.getValue();
-        if (exclusions == null)
-          exclusions = "";
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.NoRSSUrlsSpecified")+"</nobr></td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    i = 0;
-    int l = 0;
-    seenAny = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_URLSPEC))
-      {
-        if (l == 0)
-        {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.URLCanonicalization")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.URLRegexp")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.Description")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.Reorder")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemoveJSPSessions")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemoveASPSessions")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemovePHPSessions")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.RemoveBVSessions")+"</nobr></td>\n"+
-"        </tr>\n"
-          );
-        }
-        String regexpString = sn.getAttributeValue(RSSConfig.ATTR_REGEXP);
-        String description = sn.getAttributeValue(RSSConfig.ATTR_DESCRIPTION);
-        if (description == null)
-          description = "";
-        String allowReorder = sn.getAttributeValue(RSSConfig.ATTR_REORDER);
-        if (allowReorder == null || allowReorder.length() == 0)
-          allowReorder = RSSConfig.VALUE_NO;
-        String allowJavaSessionRemoval = sn.getAttributeValue(RSSConfig.ATTR_JAVASESSIONREMOVAL);
-        if (allowJavaSessionRemoval == null || allowJavaSessionRemoval.length() == 0)
-          allowJavaSessionRemoval = RSSConfig.VALUE_NO;
-        String allowASPSessionRemoval = sn.getAttributeValue(RSSConfig.ATTR_ASPSESSIONREMOVAL);
-        if (allowASPSessionRemoval == null || allowASPSessionRemoval.length() == 0)
-          allowASPSessionRemoval = RSSConfig.VALUE_NO;
-        String allowPHPSessionRemoval = sn.getAttributeValue(RSSConfig.ATTR_PHPSESSIONREMOVAL);
-        if (allowPHPSessionRemoval == null || allowPHPSessionRemoval.length() == 0)
-          allowPHPSessionRemoval = RSSConfig.VALUE_NO;
-        String allowBVSessionRemoval = sn.getAttributeValue(RSSConfig.ATTR_BVSESSIONREMOVAL);
-        if (allowBVSessionRemoval == null || allowBVSessionRemoval.length() == 0)
-          allowBVSessionRemoval = RSSConfig.VALUE_NO;
-        out.print(
-"        <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(regexpString)+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+allowReorder+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+allowJavaSessionRemoval+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+allowASPSessionRemoval+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+allowPHPSessionRemoval+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+allowBVSessionRemoval+"</nobr></td>\n"+
-"        </tr>\n"
-        );
-        l++;
-      }
-    }
-    if (l > 0)
-    {
-      out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.NoCanonicalizationSpecified")+"</nobr></td></tr>\n"
-      );
-    }
-
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    i = 0;
-    seenAny = false;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_MAP))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.URLMappingsColon")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String match = sn.getAttributeValue(RSSConfig.ATTR_MATCH);
-        String map = sn.getAttributeValue(RSSConfig.ATTR_MAP);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(match)+"</nobr>\n"
-        );
-        if (map != null && map.length() > 0)
-        {
-          out.print(
-"      &nbsp;--&gt;&nbsp;<nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(map)+"</nobr>\n"
-          );
-        }
-        out.print(
-"      <br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.NoMappingsSpecifiedWillAcceptAllUrls")+"</nobr></td></tr>\n"
-      );
-    }
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.Exclude") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-    );
-    try
-    {
-      java.io.Reader str = new java.io.StringReader(exclusions);
-      try
-      {
-        java.io.BufferedReader is = new java.io.BufferedReader(str);
-        try
-        {
-          while (true)
-          {
-            String nextString = is.readLine();
-            if (nextString == null)
-              break;
-            if (nextString.length() == 0)
-              continue;
-            out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(nextString)+"</nobr><br/>\n"
-            );
-          }
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        str.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      throw new ManifoldCFException("IO error: "+e.getMessage(),e);
-    }
-    out.print(
-"    </td>\n"+
-"  </tr>\n"
-    );
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-    String feedTimeoutValue = "60";
-    String feedRefetchValue = "60";
-    String minFeedRefetchValue = "15";
-    String badFeedRefetchValue = null;
-    String dechromedMode = RSSConfig.VALUE_NONE;
-    String chromedMode = RSSConfig.VALUE_USE;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_FEEDTIMEOUT))
-      {
-        feedTimeoutValue = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_FEEDRESCAN))
-      {
-        feedRefetchValue = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_MINFEEDRESCAN))
-      {
-        minFeedRefetchValue = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_BADFEEDRESCAN))
-      {
-        badFeedRefetchValue = sn.getAttributeValue(RSSConfig.ATTR_VALUE);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_DECHROMEDMODE))
-      {
-        dechromedMode = sn.getAttributeValue(RSSConfig.ATTR_MODE);
-      }
-      else if (sn.getType().equals(RSSConfig.NODE_CHROMEDMODE))
-      {
-        chromedMode = sn.getAttributeValue(RSSConfig.ATTR_MODE);
-      }
-    }
-    out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.FeedConnectionTimeout")+"</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(feedTimeoutValue)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.DefaultFeedRescanInterval")+"</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(feedRefetchValue)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.MinimumFeedRescanInterval")+"</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(minFeedRefetchValue)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.BadFeedRescanInterval")+"</nobr></td>\n"+
-"    <td class=\"value\">"+((badFeedRefetchValue==null)?"(Default feed rescan value)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(badFeedRefetchValue))+"</td>\n"+
-
-"  </tr>\n"+
-"      \n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.DechromedContentSource")+"</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(dechromedMode)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.ChromedContent")+"</nobr></td>\n"+
-"    <td class=\"value\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(chromedMode)+"</td>\n"+
-"  </tr>\n"+
-"\n"
-    );
-    out.print(
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-    );
-
-    // Go through looking for access tokens
-    seenAny = false;
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(RSSConfig.NODE_ACCESS))
-      {
-        if (seenAny == false)
-        {
-          out.print(
-"  <tr><td class=\"description\"><nobr>"+Messages.getBodyString(locale,"RSSConnector.AccessTokens")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue(RSSConfig.ATTR_TOKEN);
-        out.print(
-"      "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token)+"<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny)
-    {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"RSSConnector.NoAccessTokensSpecified") + "</nobr></td></tr>\n"
-      );
-    }
-    out.print(
-"</table>\n"
-    );
-  }
-
-  /** Handle an RSS feed document, using SAX to limit the memory impact */
-  protected void handleRSSFeedSAX(String documentIdentifier, IProcessActivity activities, Filter filter)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // The SAX model uses parsing events to control parsing, which allows me to manage memory usage much better.
-    // This is essential for when a feed contains dechromed content as well as links.
-
-    // First, catch all flavors of IO exception, and handle them properly
-    try
-    {
-      // Open the input stream, and set up the parse
-      InputStream is = cache.getData(documentIdentifier);
-      if (is == null)
-      {
-        Logging.connectors.error("RSS: Document '"+documentIdentifier+"' should be in cache but isn't");
-        return;
-      }
-      try
-      {
-        Parser p = new Parser();
-        // Parse the document.  This will cause various things to occur, within the instantiated XMLParsingContext class.
-        XMLFuzzyHierarchicalParseState x = new XMLFuzzyHierarchicalParseState();
-        OuterContextClass c = new OuterContextClass(x,documentIdentifier,activities,filter);
-        x.setContext(c);
-        try
-        {
-          // Believe it or not, there are no parsing errors we can get back now.
-          p.parseWithCharsetDetection(null,is,x);
-          c.checkIfValidFeed();
-          c.setDefaultRescanTimeIfNeeded();
-        }
-        finally
-        {
-          x.cleanup();
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout error: "+e.getMessage(),e);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket connect timeout error: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error: "+e.getMessage(),e);
-    }
-
-  }
-
-  /** This class handles the outermost XML context for the feed document. */
-  protected class OuterContextClass extends XMLParsingContext
-  {
-    /** Keep track of the number of valid feed signals we saw */
-    protected int outerTagCount = 0;
-    /** The document identifier */
-    protected String documentIdentifier;
-    /** Activities interface */
-    protected IProcessActivity activities;
-    /** Filter */
-    protected Filter filter;
-    /** Flag indicating the the rescan time was set for this feed */
-    protected boolean rescanTimeSet = false;
-
-    public OuterContextClass(XMLFuzzyHierarchicalParseState theStream, String documentIdentifier, IProcessActivity activities, Filter filter)
-    {
-      super(theStream);
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-    }
-
-    /** Check if feed was valid */
-    public void checkIfValidFeed()
-    {
-      if (outerTagCount == 0)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: RSS document '"+documentIdentifier+"' does not have rss, feed, or rdf:RDF tag - not valid feed");
-      }
-    }
-
-    /** Check if the rescan flag was set or not, and if not, make sure it gets set properly */
-    public void setDefaultRescanTimeIfNeeded()
-      throws ManifoldCFException
-    {
-      if (rescanTimeSet == false)
-      {
-        // Set it!
-        // Need to set the requeue parameters appropriately, since otherwise the feed reverts to default document
-        // rescan or expire behavior.
-        long currentTime = System.currentTimeMillis();
-        Long rescanTime = filter.getBadFeedRescanTime(currentTime);
-        if (rescanTime == null)
-          rescanTime = filter.getDefaultRescanTime(currentTime);
-
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: In RSS document '"+documentIdentifier+"' setting default rescan time to "+((rescanTime==null)?"null":rescanTime.toString()));
-
-        activities.setDocumentScheduleBounds(documentIdentifier,rescanTime,rescanTime,null,null);
-        rescanTimeSet = true;
-      }
-    }
-
-    /** Handle the tag beginning to set the correct second-level parsing context */
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      if (localName.equals("rss"))
-      {
-        // RSS feed detected
-        outerTagCount++;
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: Parsed bottom-level XML for RSS document '"+documentIdentifier+"'");
-        return new RSSContextClass(theStream,namespace,localName,qName,atts,documentIdentifier,activities,filter);
-      }
-      else if (localName.toLowerCase(Locale.ROOT).equals("rdf"))
-      {
-        // RDF/Atom feed detected
-        outerTagCount++;
-        return new RDFContextClass(theStream,namespace,localName,qName,atts,documentIdentifier,activities,filter);
-      }
-      else if (localName.equals("feed"))
-      {
-        // Basic feed detected
-        outerTagCount++;
-        return new FeedContextClass(theStream,namespace,localName,qName,atts,documentIdentifier,activities,filter);
-      }
-      else if (localName.equals("urlset") || localName.equals("sitemapindex"))
-      {
-        // Sitemap detected
-        outerTagCount++;
-        return new UrlsetContextClass(theStream,namespace,localName,qName,atts,documentIdentifier,activities,filter);
-      }
-      
-      // The default action is to establish a new default context.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    /** Handle the tag ending */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext context = theStream.getContext();
-      String tagName = context.getLocalname();
-      if (tagName.equals("rss"))
-      {
-        rescanTimeSet = ((RSSContextClass)context).process();
-      }
-      else if (tagName.toLowerCase(Locale.ROOT).equals("rdf"))
-      {
-        rescanTimeSet = ((RDFContextClass)context).process();
-      }
-      else if (tagName.equals("feed"))
-      {
-        rescanTimeSet = ((FeedContextClass)context).process();
-      }
-      else if (tagName.equals("urlset") || tagName.equals("sitemapindex"))
-      {
-        rescanTimeSet = ((UrlsetContextClass)context).process();
-      }
-      else
-        super.endTag();
-    }
-
-  }
-
-  protected class RSSContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentIdentifier;
-    /** Activities interface */
-    protected IProcessActivity activities;
-    /** Filter */
-    protected Filter filter;
-    /** Rescan time set flag */
-    protected boolean rescanTimeSet = false;
-
-    public RSSContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentIdentifier, IProcessActivity activities, Filter filter)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // Handle each channel
-      if (localName.equals("channel"))
-      {
-        // Channel detected
-        return new RSSChannelContextClass(theStream,namespace,localName,qName,atts,documentIdentifier,activities,filter);
-      }
-
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      // If it's our channel tag, process global channel information
-      XMLParsingContext context = theStream.getContext();
-      String tagName = context.getLocalname();
-      if (tagName.equals("channel"))
-      {
-        rescanTimeSet = ((RSSChannelContextClass)context).process();
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected boolean process()
-      throws ManifoldCFException
-    {
-      return rescanTimeSet;
-    }
-
-  }
-
-  protected class RSSChannelContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentIdentifier;
-    /** Activities interface */
-    protected IProcessActivity activities;
-    /** Filter */
-    protected Filter filter;
-
-    /** TTL value is set on a per-channel basis */
-    protected String ttlValue = null;
-
-    public RSSChannelContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentIdentifier, IProcessActivity activities, Filter filter)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("ttl"))
-      {
-        // TTL value seen.  Prepare to record it, as a string.
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("item"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new RSSItemContextClass(theStream,namespace,localName,qName,atts,filter.getDechromedContentMode());
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("ttl"))
-        // If the current context must be the TTL one, record its data value.
-        ttlValue = ((XMLStringParsingContext)theContext).getValue();
-      else if (theTag.equals("item"))
-      {
-        // It's an item.
-        RSSItemContextClass itemContext = (RSSItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) File name (if any), containing dechromed content
-        // (2) Link name(s)
-        // (3) Pubdate
-        // (4) Title
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(documentIdentifier,activities,filter);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data, return true if rescan time was set */
-    protected boolean process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      long currentTime = System.currentTimeMillis();
-      Long rescanTime = filter.getDefaultRescanTime(currentTime);
-      if (ttlValue != null)
-      {
-        try
-        {
-          int minutes = Integer.parseInt(ttlValue);
-          long nextTime = currentTime + minutes * 60000L;
-          rescanTime = new Long(nextTime);
-          // Set the upper bound time; we want to scan the feeds aggressively.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: In RSS document '"+documentIdentifier+"', found a ttl value of "+ttlValue+"; setting refetch time accordingly");
-        }
-        catch (NumberFormatException e)
-        {
-          Logging.connectors.warn("RSS: RSS document '"+documentIdentifier+"' has illegal ttl value '"+ttlValue+"'");
-        }
-      }
-
-      if (rescanTime != null)
-      {
-        Long minimumTime = filter.getMinimumRescanTime(currentTime);
-        if (minimumTime != null)
-        {
-          if (rescanTime.longValue() < minimumTime.longValue())
-            rescanTime = minimumTime;
-        }
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: In RSS document '"+documentIdentifier+"' setting rescan time to "+((rescanTime==null)?"null":rescanTime.toString()));
-
-      activities.setDocumentScheduleBounds(documentIdentifier,rescanTime,rescanTime,null,null);
-      return true;
-    }
-  }
-
-  protected class RSSItemContextClass extends XMLParsingContext
-  {
-    protected int dechromedContentMode;
-    protected String guidField = null;
-    protected String linkField = null;
-    protected String pubDateField = null;
-    protected String titleField = null;
-    protected String descriptionField = null;
-    protected String authorEmailField = null;
-    protected String authorNameField = null;
-    protected ArrayList categoryField = new ArrayList();
-    protected File contentsFile = null;
-
-    public RSSItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, int dechromedContentMode)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.dechromedContentMode = dechromedContentMode;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("link"))
-      {
-        // "link" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("guid"))
-      {
-        // "guid" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("pubdate"))
-      {
-        // "pubDate" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("title"))
-      {
-        // "title" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("category"))
-      {
-        // "category" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("author"))
-      {
-        // "author" tag, which contains email
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("creator"))
-      {
-        // "creator" tag which contains name (like dc:creator)
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Handle potentially longer fields.  Both "description" and "content" fields can potentially be large; they are thus
-        // processed as temporary files.  But the dance is complicated because (a) we only want one PRIMARY content source,
-        // and (b) we want access to the description field, if it is not used as primary content.
-        switch (dechromedContentMode)
-        {
-        case DECHROMED_NONE:
-          if (localName.equals("description"))
-          {
-            return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-          }
-          break;
-        case DECHROMED_DESCRIPTION:
-          if (localName.equals("description"))
-          {
-            try
-            {
-              File tempFile = File.createTempFile("_rssdata_","tmp");
-              return new XMLFileParsingContext(theStream,namespace,localName,qName,atts,tempFile);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-          }
-          break;
-        case DECHROMED_CONTENT:
-          if (localName.equals("content"))
-          {
-            try
-            {
-              File tempFile = File.createTempFile("_rssdata_","tmp");
-              return new XMLFileParsingContext(theStream,namespace,localName,qName,atts,tempFile);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-          }
-          else if (localName.equals("description"))
-          {
-            return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-          }
-          break;
-        default:
-          break;
-        }
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("link"))
-      {
-        linkField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("guid"))
-      {
-        guidField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("pubdate"))
-      {
-        pubDateField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("title"))
-      {
-        titleField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("category"))
-      {
-        categoryField.add(((XMLStringParsingContext)theContext).getValue());
-      }
-      else if (theTag.equals("author"))
-      {
-        authorEmailField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("creator"))
-      {
-        authorNameField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        // What we want is: (a) if dechromed mode is NONE, just put the description file in the description field; (b)
-        // if dechromed mode is "description", put the description field in the primary content field; (c)
-        // if dechromed mode is "content", put the content field in the primary content field, and the description field in the description field.
-        switch (dechromedContentMode)
-        {
-        case DECHROMED_NONE:
-          if (theTag.equals("description"))
-          {
-            descriptionField = ((XMLStringParsingContext)theContext).getValue();
-          }
-          break;
-        case DECHROMED_DESCRIPTION:
-          if (theTag.equals("description"))
-          {
-            // Content file has been written; retrieve it (being sure not to leak any files already hanging around!)
-            tagCleanup();
-            contentsFile = ((XMLFileParsingContext)theContext).getCompletedFile();
-            return;
-          }
-          break;
-        case DECHROMED_CONTENT:
-          if (theTag.equals("content"))
-          {
-            tagCleanup();
-            // Retrieve content file
-            contentsFile = ((XMLFileParsingContext)theContext).getCompletedFile();
-            return;
-          }
-          else if (theTag.equals("description"))
-          {
-            descriptionField = ((XMLStringParsingContext)theContext).getValue();
-          }
-          break;
-        default:
-          break;
-        }
-
-        super.endTag();
-      }
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentsFile != null)
-      {
-        contentsFile.delete();
-        contentsFile = null;
-      }
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(String documentIdentifier, IProcessActivity activities, Filter filter)
-      throws ManifoldCFException
-    {
-      if (linkField == null || linkField.length() == 0)
-        linkField = guidField;
-
-      if (linkField != null && linkField.length() > 0)
-      {
-        Date origDateDate = null;
-        if (pubDateField != null && pubDateField.length() > 0)
-        {
-          origDateDate = DateParser.parseRFC822Date(pubDateField);
-          // Special for China Daily News
-          if (origDateDate == null)
-            origDateDate = DateParser.parseChinaDate(pubDateField);
-          // Special for LL
-          if (origDateDate == null)
-            origDateDate = DateParser.parseISO8601Date(pubDateField);
-        }
-        Long origDate;
-        if (origDateDate != null)
-          origDate = new Long(origDateDate.getTime());
-        else
-          origDate = null;
-        
-        String[] links = linkField.split(", ");
-        int l = 0;
-        while (l < links.length)
-        {
-          String rawURL = links[l++].trim();
-          // Process the link
-          String newIdentifier = makeDocumentIdentifier(filter.getCanonicalizationPolicies(),documentIdentifier,rawURL);
-          if (newIdentifier != null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: In RSS document '"+documentIdentifier+"', found a link to '"+newIdentifier+"', which has origination date "+
-              ((origDate==null)?"null":origDate.toString()));
-            if (filter.isLegalURL(newIdentifier))
-            {
-              if (contentsFile == null && filter.getChromedContentMode() != CHROMED_METADATA_ONLY)
-              {
-                // It's a reference!  Add it.
-                String[] dataNames = new String[]{"pubdate","title","source","authoremail","authorname","category","description"};
-                String[][] dataValues = new String[dataNames.length][];
-                if (origDate != null)
-                  dataValues[0] = new String[]{origDate.toString()};
-                if (titleField != null)
-                  dataValues[1] = new String[]{titleField};
-                dataValues[2] = new String[]{documentIdentifier};
-                if (authorEmailField != null)
-                  dataValues[3] = new String[]{authorEmailField};
-                if (authorNameField != null)
-                  dataValues[4] = new String[]{authorNameField};
-                dataValues[5] = new String[categoryField.size()];
-                int q = 0;
-                while (q < categoryField.size())
-                {
-                  (dataValues[5])[q] = (String)categoryField.get(q);
-                  q++;
-                }
-                if (descriptionField != null)
-                  dataValues[6] = new String[]{descriptionField};
-                // Add document reference, not including the data to pass down, but including a description
-                activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-              }
-              else
-              {
-                // The issue here is that if a document is ingested without a jobqueue entry, the document will not
-                // be cleaned up if the job is deleted; nor is there any expiration possibility.  So, we really do need to make
-                // sure a jobqueue entry gets created somehow.  Therefore I can't just ingest the document
-                // right here.
-
-                // Since the dechromed data is available from the feed, the possibility remains of passing the document
-
-                // Now, set up the carrydown info
-                String[] dataNames = new String[]{"pubdate","title","source","authoremail","authorname","category","data","description"};
-                Object[][] dataValues = new Object[dataNames.length][];
-                if (origDate != null)
-                  dataValues[0] = new String[]{origDate.toString()};
-                if (titleField != null)
-                  dataValues[1] = new String[]{titleField};
-                dataValues[2] = new String[]{documentIdentifier};
-                if (authorEmailField != null)
-                  dataValues[3] = new String[]{authorEmailField};
-                if (authorNameField != null)
-                  dataValues[4] = new String[]{authorNameField};
-                dataValues[5] = new String[categoryField.size()];
-                int q = 0;
-                while (q < categoryField.size())
-                {
-                  (dataValues[5])[q] = (String)categoryField.get(q);
-                  q++;
-                }
-
-                if (descriptionField != null)
-                  dataValues[7] = new String[]{descriptionField};
-                  
-                if (contentsFile == null)
-                {
-                  CharacterInput ci = new NullCharacterInput();
-                  try
-                  {
-                    dataValues[6] = new Object[]{ci};
-
-                    // Add document reference, including the data to pass down, and the dechromed content too
-                    activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                  }
-                  finally
-                  {
-                    ci.discard();
-                  }
-                }
-                else
-                {
-                  CharacterInput ci = new TempFileCharacterInput(contentsFile);
-                  try
-                  {
-                    contentsFile = null;
-                    dataValues[6] = new Object[]{ci};
-
-                    // Add document reference, including the data to pass down, and the dechromed content too
-                    activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                  }
-                  finally
-                  {
-                    ci.discard();
-                  }
-                }
-              }
-            }
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Identifier '"+newIdentifier+"' is excluded");
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: In RSS document '"+documentIdentifier+"', found an unincluded URL '"+rawURL+"'");
-          }
-        }
-      }
-    }
-  }
-
-  protected class RDFContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentIdentifier;
-    /** Activities interface */
-    protected IProcessActivity activities;
-    /** Filter */
-    protected Filter filter;
-
-    /** ttl value */
-    protected String ttlValue = null;
-
-    public RDFContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentIdentifier, IProcessActivity activities, Filter filter)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("ttl"))
-      {
-        // TTL value seen.  Prepare to record it, as a string.
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("item"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new RDFItemContextClass(theStream,namespace,localName,qName,atts,filter.getDechromedContentMode());
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("ttl"))
-        // If the current context must be the TTL one, record its data value.
-        ttlValue = ((XMLStringParsingContext)theContext).getValue();
-      else if (theTag.equals("item"))
-      {
-        // It's an item.
-        RDFItemContextClass itemContext = (RDFItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) File name (if any), containing dechromed content
-        // (2) Link name(s)
-        // (3) Pubdate
-        // (4) Title
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(documentIdentifier,activities,filter);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected boolean process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      long currentTime = System.currentTimeMillis();
-      Long rescanTime = filter.getDefaultRescanTime(currentTime);
-      if (ttlValue != null)
-      {
-        try
-        {
-          int minutes = Integer.parseInt(ttlValue);
-          long nextTime = currentTime + minutes * 60000L;
-          rescanTime = new Long(nextTime);
-          // Set the upper bound time; we want to scan the feeds aggressively.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: In RDF document '"+documentIdentifier+"', found a ttl value of "+ttlValue+"; setting refetch time accordingly");
-        }
-        catch (NumberFormatException e)
-        {
-          Logging.connectors.warn("RSS: RDF document '"+documentIdentifier+"' has illegal ttl value '"+ttlValue+"'");
-        }
-      }
-
-      if (rescanTime != null)
-      {
-        Long minimumTime = filter.getMinimumRescanTime(currentTime);
-        if (minimumTime != null)
-        {
-          if (rescanTime.longValue() < minimumTime.longValue())
-            rescanTime = minimumTime;
-        }
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: In RDF document '"+documentIdentifier+"' setting rescan time to "+((rescanTime==null)?"null":rescanTime.toString()));
-
-      activities.setDocumentScheduleBounds(documentIdentifier,rescanTime,rescanTime,null,null);
-      return true;
-    }
-  }
-
-  protected class RDFItemContextClass extends XMLParsingContext
-  {
-    protected int dechromedContentMode;
-    protected String linkField = null;
-    protected String pubDateField = null;
-    protected String titleField = null;
-    protected String authorNameField = null;
-    protected String descriptionField = null;
-    protected File contentsFile = null;
-
-    public RDFItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, int dechromedContentMode)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.dechromedContentMode = dechromedContentMode;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("link"))
-      {
-        // "link" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("date"))
-      {
-        // "dc:date" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("title"))
-      {
-        // "title" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("creator"))
-      {
-        // "creator" tag (e.g. "dc:creator")
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        switch (dechromedContentMode)
-        {
-        case DECHROMED_NONE:
-          if (localName.equals("description"))
-          {
-            return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-          }
-          break;
-        case DECHROMED_DESCRIPTION:
-          if (localName.equals("description"))
-          {
-            try
-            {
-              File tempFile = File.createTempFile("_rssdata_","tmp");
-              return new XMLFileParsingContext(theStream,namespace,localName,qName,atts,tempFile);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-          }
-          break;
-        case DECHROMED_CONTENT:
-          if (localName.equals("content"))
-          {
-            try
-            {
-              File tempFile = File.createTempFile("_rssdata_","tmp");
-              return new XMLFileParsingContext(theStream,namespace,localName,qName,atts,tempFile);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-          }
-          else if (localName.equals("description"))
-          {
-            return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-          }
-          break;
-        default:
-          break;
-        }
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("link"))
-      {
-        linkField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("date"))
-      {
-        pubDateField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("title"))
-      {
-        titleField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("creator"))
-      {
-        authorNameField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        switch (dechromedContentMode)
-        {
-        case DECHROMED_NONE:
-          if (theTag.equals("description"))
-          {
-            descriptionField = ((XMLStringParsingContext)theContext).getValue();
-          }
-          break;
-        case DECHROMED_DESCRIPTION:
-          if (theTag.equals("description"))
-          {
-            // Content file has been written; retrieve it (being sure not to leak any files already hanging around!)
-            tagCleanup();
-            contentsFile = ((XMLFileParsingContext)theContext).getCompletedFile();
-            return;
-          }
-          break;
-        case DECHROMED_CONTENT:
-          if (theTag.equals("dc:content"))
-          {
-            // Retrieve content file
-            tagCleanup();
-            contentsFile = ((XMLFileParsingContext)theContext).getCompletedFile();
-            return;
-          }
-          else if (theTag.equals("description"))
-          {
-            descriptionField = ((XMLStringParsingContext)theContext).getValue();
-          }
-          break;
-        default:
-          break;
-        }
-
-        super.endTag();
-      }
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentsFile != null)
-      {
-        contentsFile.delete();
-        contentsFile = null;
-      }
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(String documentIdentifier, IProcessActivity activities, Filter filter)
-      throws ManifoldCFException
-    {
-      if (linkField != null && linkField.length() > 0)
-      {
-        Date origDateDate = null;
-        if (pubDateField != null && pubDateField.length() > 0)
-          origDateDate = DateParser.parseISO8601Date(pubDateField);
-
-        Long origDate;
-        if (origDateDate != null)
-          origDate = new Long(origDateDate.getTime());
-        else
-          origDate = null;
-        
-        String[] links = linkField.split(", ");
-        int l = 0;
-        while (l < links.length)
-        {
-          String rawURL = links[l++].trim();
-          // Process the link
-          String newIdentifier = makeDocumentIdentifier(filter.getCanonicalizationPolicies(),documentIdentifier,rawURL);
-          if (newIdentifier != null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: In RDF document '"+documentIdentifier+"', found a link to '"+newIdentifier+"', which has origination date "+
-              ((origDate==null)?"null":origDate.toString()));
-            if (filter.isLegalURL(newIdentifier))
-            {
-              if (contentsFile == null && filter.getChromedContentMode() != CHROMED_METADATA_ONLY)
-              {
-                // It's a reference!  Add it.
-                String[] dataNames = new String[]{"pubdate","title","source","authorname","description"};
-                String[][] dataValues = new String[dataNames.length][];
-                if (origDate != null)
-                  dataValues[0] = new String[]{origDate.toString()};
-                if (titleField != null)
-                  dataValues[1] = new String[]{titleField};
-                dataValues[2] = new String[]{documentIdentifier};
-                if (authorNameField != null)
-                  dataValues[3] = new String[]{authorNameField};
-                if (descriptionField != null)
-                  dataValues[4] = new String[]{descriptionField};
-
-                // Add document reference, including the data to pass down
-                activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-              }
-              else
-              {
-                // The issue here is that if a document is ingested without a jobqueue entry, the document will not
-                // be cleaned up if the job is deleted; nor is there any expiration possibility.  So, we really do need to make
-                // sure a jobqueue entry gets created somehow.  Therefore I can't just ingest the document
-                // right here.
-
-                // Now, set up the carrydown info
-                String[] dataNames = new String[]{"pubdate","title","source","authorname","data","description"};
-                Object[][] dataValues = new Object[dataNames.length][];
-                if (origDate != null)
-                  dataValues[0] = new String[]{origDate.toString()};
-                if (titleField != null)
-                  dataValues[1] = new String[]{titleField};
-                dataValues[2] = new String[]{documentIdentifier};
-                if (authorNameField != null)
-                  dataValues[3] = new String[]{authorNameField};
-                if (descriptionField != null)
-                  dataValues[5] = new String[]{descriptionField};
-                  
-                if (contentsFile == null)
-                {
-                  CharacterInput ci = new NullCharacterInput();
-                  try
-                  {
-                    dataValues[4] = new Object[]{ci};
-
-                    // Add document reference, including the data to pass down, and the dechromed content too
-                    activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                  }
-                  finally
-                  {
-                    ci.discard();
-                  }
-                }
-                else
-                {
-                  CharacterInput ci = new TempFileCharacterInput(contentsFile);
-                  try
-                  {
-                    contentsFile = null;
-                    dataValues[4] = new Object[]{ci};
-
-                    // Add document reference, including the data to pass down, and the dechromed content too
-                    activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                  }
-                  finally
-                  {
-                    ci.discard();
-                  }
-                }
-              }
-            }
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Identifier '"+newIdentifier+"' is excluded");
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: In RSS document '"+documentIdentifier+"', found an unincluded URL '"+rawURL+"'");
-          }
-        }
-      }
-    }
-  }
-
-  protected class FeedContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentIdentifier;
-    /** Activities interface */
-    protected IProcessActivity activities;
-    /** Filter */
-    protected Filter filter;
-
-    /** ttl value */
-    protected String ttlValue = null;
-
-    public FeedContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentIdentifier, IProcessActivity activities, Filter filter)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("ttl"))
-      {
-        // TTL value seen.  Prepare to record it, as a string.
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("entry"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new FeedItemContextClass(theStream,namespace,localName,qName,atts,filter.getDechromedContentMode());
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("ttl"))
-        // If the current context must be the TTL one, record its data value.
-        ttlValue = ((XMLStringParsingContext)theContext).getValue();
-      else if (theTag.equals("entry"))
-      {
-        // It's an item.
-        FeedItemContextClass itemContext = (FeedItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) File name (if any), containing dechromed content
-        // (2) Link name(s)
-        // (3) Pubdate
-        // (4) Title
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(documentIdentifier,activities,filter);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected boolean process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      long currentTime = System.currentTimeMillis();
-      Long rescanTime = filter.getDefaultRescanTime(currentTime);
-      if (ttlValue != null)
-      {
-        try
-        {
-          int minutes = Integer.parseInt(ttlValue);
-          long nextTime = currentTime + minutes * 60000L;
-          rescanTime = new Long(nextTime);
-          // Set the upper bound time; we want to scan the feeds aggressively.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: In Atom document '"+documentIdentifier+"', found a ttl value of "+ttlValue+"; setting refetch time accordingly");
-        }
-        catch (NumberFormatException e)
-        {
-          Logging.connectors.warn("RSS: Atom document '"+documentIdentifier+"' has illegal ttl value '"+ttlValue+"'");
-        }
-      }
-
-      if (rescanTime != null)
-      {
-        Long minimumTime = filter.getMinimumRescanTime(currentTime);
-        if (minimumTime != null)
-        {
-          if (rescanTime.longValue() < minimumTime.longValue())
-            rescanTime = minimumTime;
-        }
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: In Atom document '"+documentIdentifier+"' setting rescan time to "+((rescanTime==null)?"null":rescanTime.toString()));
-
-      activities.setDocumentScheduleBounds(documentIdentifier,rescanTime,rescanTime,null,null);
-      return true;
-    }
-  }
-
-  protected class FeedItemContextClass extends XMLParsingContext
-  {
-    protected int dechromedContentMode;
-    protected List<String> linkField = new ArrayList<String>();
-    protected String pubDateField = null;
-    protected String titleField = null;
-    protected String authorNameField = null;
-    protected String authorEmailField = null;
-    protected ArrayList categoryField = new ArrayList();
-    protected File contentsFile = null;
-    protected String descriptionField = null;
-
-    public FeedItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, int dechromedContentMode)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.dechromedContentMode = dechromedContentMode;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("link"))
-      {
-        // "link" tag
-        String ref = atts.get("href");
-        if (ref != null && ref.length() > 0)
-          linkField.add(ref);
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-      else if (localName.equals("published") || localName.equals("updated"))
-      {
-        // "published" pr "updated" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("title"))
-      {
-        // "title" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("author"))
-      {
-        return new FeedAuthorContextClass(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("category"))
-      {
-        String category = atts.get("term");
-        if (category != null && category.length() > 0)
-          categoryField.add(category);
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-      else
-      {
-        switch (dechromedContentMode)
-        {
-        case DECHROMED_NONE:
-          if (localName.equals("subtitle"))
-          {
-            return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-          }
-          break;
-        case DECHROMED_DESCRIPTION:
-          if (localName.equals("subtitle"))
-          {
-            try
-            {
-              File tempFile = File.createTempFile("_rssdata_","tmp");
-              return new XMLFileParsingContext(theStream,namespace,localName,qName,atts,tempFile);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-          }
-          break;
-        case DECHROMED_CONTENT:
-          if (localName.equals("content"))
-          {
-            try
-            {
-              File tempFile = File.createTempFile("_rssdata_","tmp");
-              return new XMLFileParsingContext(theStream,namespace,localName,qName,atts,tempFile);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-            }
-          }
-          else if (localName.equals("subtitle"))
-          {
-            return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-          }
-          break;
-        default:
-          break;
-        }
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("published") || theTag.equals("updated"))
-      {
-        pubDateField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("title"))
-      {
-        titleField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("author"))
-      {
-        FeedAuthorContextClass authorContext = (FeedAuthorContextClass)theContext;
-        authorEmailField = authorContext.getAuthorEmail();
-        authorNameField = authorContext.getAuthorName();
-      }
-      else
-      {
-        switch (dechromedContentMode)
-        {
-        case DECHROMED_NONE:
-          if (theTag.equals("subtitle"))
-          {
-            titleField = ((XMLStringParsingContext)theContext).getValue();
-          }
-          break;
-        case DECHROMED_DESCRIPTION:
-          if (theTag.equals("subtitle"))
-          {
-            // Content file has been written; retrieve it (being sure not to leak any files already hanging around!)
-            tagCleanup();
-            contentsFile = ((XMLFileParsingContext)theContext).getCompletedFile();
-            return;
-          }
-          break;
-        case DECHROMED_CONTENT:
-          if (theTag.equals("content"))
-          {
-            // Retrieve content file
-            tagCleanup();
-            contentsFile = ((XMLFileParsingContext)theContext).getCompletedFile();
-            return;
-          }
-          else if (theTag.equals("subtitle"))
-          {
-            titleField = ((XMLStringParsingContext)theContext).getValue();
-          }
-          break;
-        default:
-          break;
-        }
-
-        super.endTag();
-      }
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentsFile != null)
-      {
-        contentsFile.delete();
-        contentsFile = null;
-      }
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(String documentIdentifier, IProcessActivity activities, Filter filter)
-      throws ManifoldCFException
-    {
-      if (linkField.size() > 0)
-      {
-        Date origDateDate = null;
-        if (pubDateField != null && pubDateField.length() > 0)
-          origDateDate = DateParser.parseISO8601Date(pubDateField);
-
-        Long origDate;
-        if (origDateDate != null)
-          origDate = new Long(origDateDate.getTime());
-        else
-          origDate = null;
-
-        for (String linkValue : linkField)
-        {
-          String[] links = linkValue.split(", ");
-          int l = 0;
-          while (l < links.length)
-          {
-            String rawURL = links[l++].trim();
-            // Process the link
-            String newIdentifier = makeDocumentIdentifier(filter.getCanonicalizationPolicies(),documentIdentifier,rawURL);
-            if (newIdentifier != null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: In Atom document '"+documentIdentifier+"', found a link to '"+newIdentifier+"', which has origination date "+
-                ((origDate==null)?"null":origDate.toString()));
-              if (filter.isLegalURL(newIdentifier))
-              {
-                if (contentsFile == null && filter.getChromedContentMode() != CHROMED_METADATA_ONLY)
-                {
-                  // It's a reference!  Add it.
-                  String[] dataNames = new String[]{"pubdate","title","source","category","description"};
-                  String[][] dataValues = new String[dataNames.length][];
-                  if (origDate != null)
-                    dataValues[0] = new String[]{origDate.toString()};
-                  if (titleField != null)
-                    dataValues[1] = new String[]{titleField};
-                  dataValues[2] = new String[]{documentIdentifier};
-                  dataValues[3] = new String[categoryField.size()];
-                  int q = 0;
-                  while (q < categoryField.size())
-                  {
-                    (dataValues[3])[q] = (String)categoryField.get(q);
-                    q++;
-                  }
-                  if (descriptionField != null)
-                    dataValues[4] = new String[]{descriptionField};
-                    
-                  // Add document reference, including the data to pass down
-                  activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                }
-                else
-                {
-                  // The issue here is that if a document is ingested without a jobqueue entry, the document will not
-                  // be cleaned up if the job is deleted; nor is there any expiration possibility.  So, we really do need to make
-                  // sure a jobqueue entry gets created somehow.  Therefore I can't just ingest the document
-                  // right here.
-
-                  // Now, set up the carrydown info
-                  String[] dataNames = new String[]{"pubdate","title","source","category","data","description"};
-                  Object[][] dataValues = new Object[dataNames.length][];
-                  if (origDate != null)
-                    dataValues[0] = new String[]{origDate.toString()};
-                  if (titleField != null)
-                    dataValues[1] = new String[]{titleField};
-                  dataValues[2] = new String[]{documentIdentifier};
-                  dataValues[3] = new String[categoryField.size()];
-                  int q = 0;
-                  while (q < categoryField.size())
-                  {
-                    (dataValues[3])[q] = (String)categoryField.get(q);
-                    q++;
-                  }
-                  if (descriptionField != null)
-                    dataValues[5] = new String[]{descriptionField};
-                  
-                  if (contentsFile == null)
-                  {
-                    CharacterInput ci = new NullCharacterInput();
-                    try
-                    {
-                      dataValues[4] = new Object[]{ci};
-
-                      // Add document reference, including the data to pass down, and the dechromed content too
-                      activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                    }
-                    finally
-                    {
-                      ci.discard();
-                    }
-                  }
-                  else
-                  {
-                    CharacterInput ci = new TempFileCharacterInput(contentsFile);
-                    try
-                    {
-                      contentsFile = null;
-
-                      dataValues[4] = new Object[]{ci};
-
-                      // Add document reference, including the data to pass down, and the dechromed content too
-                      activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-                    }
-                    finally
-                    {
-                      ci.discard();
-                    }
-                  }
-                }
-              }
-              else
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("RSS: Identifier '"+newIdentifier+"' is excluded");
-              }
-            }
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: In Atom document '"+documentIdentifier+"', found an unincluded URL '"+rawURL+"'");
-            }
-          }
-        }
-      }
-    }
-  }
-  
-  protected class FeedAuthorContextClass extends XMLParsingContext
-  {
-    protected String authorNameField = null;
-    protected String authorEmailField = null;
-
-    public FeedAuthorContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts)
-    {
-      super(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      if (localName.equals("name"))
-      {
-        // "name" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("email"))
-      {
-        // "email" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("name"))
-      {
-        authorNameField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("email"))
-      {
-        authorEmailField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        super.endTag();
-      }
-    }
-    
-    public String getAuthorName()
-    {
-      return authorNameField;
-    }
-    
-    public String getAuthorEmail()
-    {
-      return authorEmailField;
-    }
-  }
-
-  protected class UrlsetContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentIdentifier;
-    /** Activities interface */
-    protected IProcessActivity activities;
-    /** Filter */
-    protected Filter filter;
-
-    /** ttl value */
-    protected String ttlValue = null;
-
-    public UrlsetContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentIdentifier, IProcessActivity activities, Filter filter)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "url", nothing else.
-      if (localName.equals("url") || localName.equals("sitemap"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new UrlsetItemContextClass(theStream,namespace,localName,qName,atts);
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("url") || theTag.equals("sitemap"))
-      {
-        // It's an item.
-        UrlsetItemContextClass itemContext = (UrlsetItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) File name (if any), containing dechromed content
-        // (2) Link name(s)
-        // (3) Pubdate
-        // (4) Title
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(documentIdentifier,activities,filter);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected boolean process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      long currentTime = System.currentTimeMillis();
-      Long rescanTime = filter.getDefaultRescanTime(currentTime);
-      if (ttlValue != null)
-      {
-        try
-        {
-          int minutes = Integer.parseInt(ttlValue);
-          long nextTime = currentTime + minutes * 60000L;
-          rescanTime = new Long(nextTime);
-          // Set the upper bound time; we want to scan the feeds aggressively.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: In SiteMap document '"+documentIdentifier+"', found a ttl value of "+ttlValue+"; setting refetch time accordingly");
-        }
-        catch (NumberFormatException e)
-        {
-          Logging.connectors.warn("RSS: SiteMap document '"+documentIdentifier+"' has illegal ttl value '"+ttlValue+"'");
-        }
-      }
-
-      if (rescanTime != null)
-      {
-        Long minimumTime = filter.getMinimumRescanTime(currentTime);
-        if (minimumTime != null)
-        {
-          if (rescanTime.longValue() < minimumTime.longValue())
-            rescanTime = minimumTime;
-        }
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("RSS: In SiteMap document '"+documentIdentifier+"' setting rescan time to "+((rescanTime==null)?"null":rescanTime.toString()));
-
-      activities.setDocumentScheduleBounds(documentIdentifier,rescanTime,rescanTime,null,null);
-      return true;
-    }
-  }
-
-  protected class UrlsetItemContextClass extends XMLParsingContext
-  {
-    protected String linkField = null;
-    protected String pubDateField = null;
-
-    public UrlsetItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts)
-    {
-      super(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "loc" and "lastmod", nothing else.
-      if (localName.equals("loc"))
-      {
-        // "loc" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("lastmod"))
-      {
-        // "lastmod" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("loc"))
-      {
-        linkField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("lastmod"))
-      {
-        pubDateField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        super.endTag();
-      }
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(String documentIdentifier, IProcessActivity activities, Filter filter)
-      throws ManifoldCFException
-    {
-      if (linkField != null && linkField.length() > 0)
-      {
-        Date origDateDate = null;
-        if (pubDateField != null && pubDateField.length() > 0)
-          origDateDate = DateParser.parseISO8601Date(pubDateField);
-
-        Long origDate;
-        if (origDateDate != null)
-          origDate = new Long(origDateDate.getTime());
-        else
-          origDate = null;
-
-        String[] links = linkField.split(", ");
-        int l = 0;
-        while (l < links.length)
-        {
-          String rawURL = links[l++].trim();
-          // Process the link
-          String newIdentifier = makeDocumentIdentifier(filter.getCanonicalizationPolicies(),documentIdentifier,rawURL);
-          if (newIdentifier != null)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: In SiteMap document '"+documentIdentifier+"', found a link to '"+newIdentifier+"', which has origination date "+
-              ((origDate==null)?"null":origDate.toString()));
-            if (filter.isLegalURL(newIdentifier))
-            {
-              // It's a reference!  Add it.
-              String[] dataNames = new String[]{"pubdate","source"};
-              String[][] dataValues = new String[dataNames.length][];
-              if (origDate != null)
-                dataValues[0] = new String[]{origDate.toString()};
-              dataValues[1] = new String[]{documentIdentifier};
-                  
-              // Add document reference, including the data to pass down
-              activities.addDocumentReference(newIdentifier,documentIdentifier,null,dataNames,dataValues,origDate);
-            }
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("RSS: Identifier '"+newIdentifier+"' is excluded");
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("RSS: In SiteMap document '"+documentIdentifier+"', found an unincluded URL '"+rawURL+"'");
-          }
-        }
-      }
-    }
-  }
-
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  public int getMaxDocumentRequest()
-  {
-    // RSS and the web in general do not batch well.  Multiple chunks have no advantage over one-at-a-time requests.
-    return 1;
-  }
-
-  // Protected methods and classes
-
-  /** Given the current parameters, find the correct throttled fetcher object
-  * (or create one if not there).
-  */
-  protected ThrottledFetcher getFetcher()
-  {
-    synchronized (fetcherMap)
-    {
-      ThrottledFetcher tf = fetcherMap.get(throttleGroupName);
-      if (tf == null)
-      {
-        tf = new ThrottledFetcher();
-        fetcherMap.put(throttleGroupName,tf);
-      }
-      return tf;
-    }
-  }
-
-  /** Read a string as a sequence of individual expressions, urls, etc.
-  */
-  protected static List<String> stringToArray(String input)
-  {
-    List<String> list = new ArrayList<String>();
-    try
-    {
-      java.io.Reader str = new java.io.StringReader(input);
-      try
-      {
-        java.io.BufferedReader is = new java.io.BufferedReader(str);
-        try
-        {
-          while (true)
-          {
-            String nextString = is.readLine();
-            if (nextString == null)
-              break;
-            if (nextString.length() == 0)
-              continue;
-            nextString.trim();
-            if (nextString.startsWith("#"))
-              continue;
-            list.add(nextString);
-          }
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        str.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      // Eat the exception and exit.
-    }
-    return list;
-  }
-
-  /** Compile all regexp entries in the passed in list, and add them to the output
-  * list.
-  */
-  protected static void compileList(List<Pattern> output, List<String> input)
-    throws ManifoldCFException
-  {
-    for (String inputString : input)
-    {
-      try
-      {
-        output.add(Pattern.compile(inputString));
-      }
-      catch (PatternSyntaxException e)
-      {
-        throw new ManifoldCFException("Mapping regular expression '"+inputString+"' is illegal: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  /** Given the current parameters, find the correct robots object (or create
-  * one if none found).
-  */
-  protected Robots getRobots(ThrottledFetcher fetcher)
-  {
-    synchronized (robotsMap)
-    {
-      Robots r = (Robots)robotsMap.get(throttleGroupName);
-      if (r == null)
-      {
-        r = new Robots(fetcher);
-        robotsMap.put(throttleGroupName,r);
-      }
-      return r;
-    }
-  }
-
-  // Protected classes
-
-  /** The throttle specification class.  Each server name is a different bin in this model.
-  */
-  protected static class ThrottleSpec implements IThrottleSpec
-  {
-    protected final int maxOpenConnectionsPerServer;
-    protected final long minimumMillisecondsPerFetchPerServer;
-    protected final double minimumMillisecondsPerBytePerServer;
-    
-    public ThrottleSpec(int maxOpenConnectionsPerServer, long minimumMillisecondsPerFetchPerServer,
-      double minimumMillisecondsPerBytePerServer)
-    {
-      this.maxOpenConnectionsPerServer = maxOpenConnectionsPerServer;
-      this.minimumMillisecondsPerFetchPerServer = minimumMillisecondsPerFetchPerServer;
-      this.minimumMillisecondsPerBytePerServer = minimumMillisecondsPerBytePerServer;
-    }
-    
-    /** Given a bin name, find the max open connections to use for that bin.
-    *@return Integer.MAX_VALUE if no limit found.
-    */
-    public int getMaxOpenConnections(String binName)
-    {
-      return maxOpenConnectionsPerServer;
-    }
-
-    /** Look up minimum milliseconds per byte for a bin.
-    *@return 0.0 if no limit found.
-    */
-    public double getMinimumMillisecondsPerByte(String binName)
-    {
-      return minimumMillisecondsPerBytePerServer;
-    }
-
-    /** Look up minimum milliseconds for a fetch for a bin.
-    *@return 0 if no limit found.
-    */
-    public long getMinimumMillisecondsPerFetch(String binName)
-    {
-      return minimumMillisecondsPerFetchPerServer;
-    }
-  }
-
-  /** Name/value class */
-  protected static class NameValue
-  {
-    protected String name;
-    protected String value;
-
-    public NameValue(String name, String value)
-    {
-      this.name = name;
-      this.value = value;
-    }
-
-    public String getName()
-    {
-      return name;
-    }
-
-    public String getValue()
-    {
-      return value;
-    }
-  }
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-      throws ManifoldCFException
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-      throws ManifoldCFException
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-        else
-          throw new ManifoldCFException("Unknown style: "+modifier);
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-  /** Class representing a URL regular expression match, for the purposes of determining canonicalization policy */
-  protected static class CanonicalizationPolicy
-  {
-    protected final Pattern matchPattern;
-    protected final boolean reorder;
-    protected final boolean removeJavaSession;
-    protected final boolean removeAspSession;
-    protected final boolean removePhpSession;
-    protected final boolean removeBVSession;
-
-    public CanonicalizationPolicy(Pattern matchPattern, boolean reorder, boolean removeJavaSession, boolean removeAspSession,
-      boolean removePhpSession, boolean removeBVSession)
-    {
-      this.matchPattern = matchPattern;
-      this.reorder = reorder;
-      this.removeJavaSession = removeJavaSession;
-      this.removeAspSession = removeAspSession;
-      this.removePhpSession = removePhpSession;
-      this.removeBVSession = removeBVSession;
-    }
-
-    public boolean checkMatch(String url)
-    {
-      Matcher matcher = matchPattern.matcher(url);
-      return matcher.find();
-    }
-
-    public boolean canReorder()
-    {
-      return reorder;
-    }
-
-    public boolean canRemoveJavaSession()
-    {
-      return removeJavaSession;
-    }
-
-    public boolean canRemoveAspSession()
-    {
-      return removeAspSession;
-    }
-
-    public boolean canRemovePhpSession()
-    {
-      return removePhpSession;
-    }
-
-    public boolean canRemoveBvSession()
-    {
-      return removeBVSession;
-    }
-
-  }
-
-  /** Class representing a list of canonicalization rules */
-  protected static class CanonicalizationPolicies
-  {
-    protected final List<CanonicalizationPolicy> rules = new ArrayList<CanonicalizationPolicy>();
-
-    public CanonicalizationPolicies()
-    {
-    }
-
-    public void addRule(CanonicalizationPolicy rule)
-    {
-      rules.add(rule);
-    }
-
-    public CanonicalizationPolicy findMatch(String url)
-    {
-      for (CanonicalizationPolicy rule : rules)
-      {
-        if (rule.checkMatch(url))
-          return rule;
-      }
-      return null;
-    }
-  }
-
-  /** Class representing a mapping rule */
-  protected static class MappingRule
-  {
-    protected final Pattern matchPattern;
-    protected final String evalExpression;
-
-    public MappingRule(Pattern matchPattern, String evalExpression)
-    {
-      this.matchPattern = matchPattern;
-      this.evalExpression = evalExpression;
-    }
-
-    public boolean checkMatch(String url)
-    {
-      Matcher matcher = matchPattern.matcher(url);
-      return matcher.matches();
-    }
-
-    public String map(String url)
-      throws ManifoldCFException
-    {
-      // Create a matcher, and attempt to do a match
-      Matcher matcher = matchPattern.matcher(url);
-      if (!matcher.matches())
-      {
-        return null;
-      }
-
-      // A match!  Now, interpret the output expression
-      if (evalExpression == null || evalExpression.length() == 0)
-        return url;
-
-      StringBuilder sb = new StringBuilder();
-      EvaluatorTokenStream et = new EvaluatorTokenStream(evalExpression);
-
-      while (true)
-      {
-        EvaluatorToken t = et.peek();
-        if (t == null)
-          break;
-        switch (t.getType())
-        {
-        case EvaluatorToken.TYPE_COMMA:
-          et.advance();
-          break;
-        case EvaluatorToken.TYPE_GROUP:
-          et.advance();
-          String groupValue = matcher.group(t.getGroupNumber());
-          switch (t.getGroupStyle())
-          {
-          case EvaluatorToken.GROUPSTYLE_NONE:
-            sb.append(groupValue);
-            break;
-          case EvaluatorToken.GROUPSTYLE_LOWER:
-            sb.append(groupValue.toLowerCase(Locale.ROOT));
-            break;
-          case EvaluatorToken.GROUPSTYLE_UPPER:
-            sb.append(groupValue.toUpperCase(Locale.ROOT));
-            break;
-          case EvaluatorToken.GROUPSTYLE_MIXED:
-            if (groupValue.length() > 0)
-            {
-              sb.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT));
-              sb.append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-            }
-            break;
-          default:
-            throw new ManifoldCFException("Illegal group style");
-          }
-          break;
-        case EvaluatorToken.TYPE_TEXT:
-          et.advance();
-          sb.append(t.getTextValue());
-          break;
-        default:
-          throw new ManifoldCFException("Illegal token type");
-        }
-      }
-      return sb.toString();
-    }
-
-  }
-
-  /** Class that represents all mappings */
-  protected static class MappingRules
-  {
-    protected final List<MappingRule> mappings = new ArrayList<MappingRule>();
-
-    public MappingRules()
-    {
-    }
-
-    public void add(MappingRule rule)
-    {
-      mappings.add(rule);
-    }
-
-    public boolean isMatch(String url)
-    {
-      if (mappings.size() == 0)
-        return true;
-      for (MappingRule p : mappings)
-      {
-        if (p.checkMatch(url))
-          return true;
-      }
-      return false;
-    }
-
-    public String map(String url)
-      throws ManifoldCFException
-    {
-      if (mappings.size() == 0)
-        return url;
-      for (MappingRule p : mappings)
-      {
-        String rval = p.map(url);
-        if (rval != null)
-          return rval;
-      }
-      return null;
-    }
-  }
-
-  /** Class that handles parsing and interpretation of the document specification.
-  * Note that I believe it to be faster to do this once, gathering all the data, than to scan the document specification multiple times.
-  * Therefore, this class contains the *entire* interpreted set of data from a document specification.
-  */
-  protected static class Filter
-  {
-    protected final MappingRules mappings = new MappingRules();
-    protected final Set<String> seeds;
-    protected Integer defaultRescanInterval = null;
-    protected Integer minimumRescanInterval = null;
-    protected Integer badFeedRescanInterval = null;
-    protected int dechromedContentMode = DECHROMED_NONE;
-    protected int chromedContentMode = CHROMED_USE;
-    protected int feedTimeoutValue = 60000;
-    protected final Set<String> acls = new HashSet<String>();
-    protected final CanonicalizationPolicies canonicalizationPolicies = new CanonicalizationPolicies();
-    /** The arraylist of exclude patterns */
-    protected final List<Pattern> excludePatterns = new ArrayList<Pattern>();
-
-    /** Constructor. */
-    public Filter(Specification spec, boolean warnOnBadSeed)
-      throws ManifoldCFException
-    {
-      String excludes = "";
-
-      // To save allocation, preallocate the seeds map assuming that it will require 1.5x the number of nodes in the spec
-      int initialSize = spec.getChildCount();
-      if (initialSize == 0)
-        initialSize = 1;
-      seeds = new HashSet<String>((initialSize * 3) >> 1);
-
-      int i = 0;
-
-      // First pass.  Find all of the rules (which are necessary to canonicalize the seeds, etc.)
-      while (i < spec.getChildCount())
-      {
-        SpecificationNode n = spec.getChild(i++);
-        if (n.getType().equals(RSSConfig.NODE_MAP))
-        {
-          String match = n.getAttributeValue(RSSConfig.ATTR_MATCH);
-          String map = n.getAttributeValue(RSSConfig.ATTR_MAP);
-          if (match != null && match.length() > 0)
-          {
-            Pattern p;
-            try
-            {
-              p = Pattern.compile(match);
-            }
-            catch (java.util.regex.PatternSyntaxException e)
-            {
-              throw new ManifoldCFException("Regular expression '"+match+"' is illegal: "+e.getMessage(),e);
-            }
-            if (map == null)
-              map = "";
-            mappings.add(new MappingRule(p,map));
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_EXCLUDES))
-        {
-          excludes = n.getValue();
-          if (excludes == null)
-            excludes = "";
-        }
-        else if (n.getType().equals(RSSConfig.NODE_URLSPEC))
-        {
-          String urlRegexp = n.getAttributeValue(RSSConfig.ATTR_REGEXP);
-          if (urlRegexp == null)
-            urlRegexp = "";
-          String reorder = n.getAttributeValue(RSSConfig.ATTR_REORDER);
-          boolean reorderValue;
-          if (reorder == null)
-            reorderValue = false;
-          else
-          {
-            if (reorder.equals(RSSConfig.VALUE_YES))
-              reorderValue = true;
-            else
-              reorderValue = false;
-          }
-
-          String javaSession = n.getAttributeValue(RSSConfig.ATTR_JAVASESSIONREMOVAL);
-          boolean javaSessionValue;
-          if (javaSession == null)
-            javaSessionValue = false;
-          else
-          {
-            if (javaSession.equals(RSSConfig.VALUE_YES))
-              javaSessionValue = true;
-            else
-              javaSessionValue = false;
-          }
-
-          String aspSession = n.getAttributeValue(RSSConfig.ATTR_ASPSESSIONREMOVAL);
-          boolean aspSessionValue;
-          if (aspSession == null)
-            aspSessionValue = false;
-          else
-          {
-            if (aspSession.equals(RSSConfig.VALUE_YES))
-              aspSessionValue = true;
-            else
-              aspSessionValue = false;
-          }
-
-          String phpSession = n.getAttributeValue(RSSConfig.ATTR_PHPSESSIONREMOVAL);
-          boolean phpSessionValue;
-          if (phpSession == null)
-            phpSessionValue = false;
-          else
-          {
-            if (phpSession.equals(RSSConfig.VALUE_YES))
-              phpSessionValue = true;
-            else
-              phpSessionValue = false;
-          }
-
-          String bvSession = n.getAttributeValue(RSSConfig.ATTR_BVSESSIONREMOVAL);
-          boolean bvSessionValue;
-          if (bvSession == null)
-            bvSessionValue = false;
-          else
-          {
-            if (bvSession.equals(RSSConfig.VALUE_YES))
-              bvSessionValue = true;
-            else
-              bvSessionValue = false;
-          }
-          try
-          {
-            canonicalizationPolicies.addRule(new CanonicalizationPolicy(Pattern.compile(urlRegexp),reorderValue,javaSessionValue,aspSessionValue,
-              phpSessionValue, bvSessionValue));
-          }
-          catch (java.util.regex.PatternSyntaxException e)
-          {
-            throw new ManifoldCFException("Canonicalization regular expression '"+urlRegexp+"' is illegal: "+e.getMessage(),e);
-          }
-        }
-      }
-
-      compileList(excludePatterns,stringToArray(excludes));
-
-      // Second pass.  Do the rest of the work,
-      i = 0;
-      while (i < spec.getChildCount())
-      {
-        SpecificationNode n = spec.getChild(i++);
-        if (n.getType().equals(RSSConfig.NODE_FEED))
-        {
-          String rssURL = n.getAttributeValue(RSSConfig.ATTR_URL);
-          if (rssURL != null && rssURL.length() > 0)
-          {
-            String canonicalURL = makeDocumentIdentifier(canonicalizationPolicies,null,rssURL);
-            if (canonicalURL != null)
-            {
-              seeds.add(canonicalURL);
-            }
-            else
-            {
-              if (warnOnBadSeed)
-                Logging.connectors.warn("RSS: Illegal seed feed '"+rssURL+"'");
-            }
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_ACCESS))
-        {
-          String token = n.getAttributeValue(RSSConfig.ATTR_TOKEN);
-          acls.add(token);
-        }
-        else if (n.getType().equals(RSSConfig.NODE_FEEDRESCAN))
-        {
-          String interval = n.getAttributeValue(RSSConfig.ATTR_VALUE);
-          if (interval != null && interval.length() > 0)
-          {
-            try
-            {
-              defaultRescanInterval = new Integer(interval);
-            }
-            catch (NumberFormatException e)
-            {
-              throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-            }
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_MINFEEDRESCAN))
-        {
-          String interval = n.getAttributeValue(RSSConfig.ATTR_VALUE);
-          if (interval != null && interval.length() > 0)
-          {
-            try
-            {
-              minimumRescanInterval = new Integer(interval);
-            }
-            catch (NumberFormatException e)
-            {
-              throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-            }
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_BADFEEDRESCAN))
-        {
-          String interval = n.getAttributeValue(RSSConfig.ATTR_VALUE);
-          if (interval != null && interval.length() > 0)
-          {
-            try
-            {
-              badFeedRescanInterval = new Integer(interval);
-            }
-            catch (NumberFormatException e)
-            {
-              throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-            }
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_FEEDTIMEOUT))
-        {
-          String value = n.getAttributeValue(RSSConfig.ATTR_VALUE);
-          if (value != null && value.length() > 0)
-          {
-            try
-            {
-              feedTimeoutValue= Integer.parseInt(value) * 1000;
-            }
-            catch (NumberFormatException e)
-            {
-              throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-            }
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_DECHROMEDMODE))
-        {
-          String mode = n.getAttributeValue(RSSConfig.ATTR_MODE);
-          if (mode != null && mode.length() > 0)
-          {
-            if (mode.equals(RSSConfig.VALUE_NONE))
-              dechromedContentMode = DECHROMED_NONE;
-            else if (mode.equals(RSSConfig.VALUE_DESCRIPTION))
-              dechromedContentMode = DECHROMED_DESCRIPTION;
-            else if (mode.equals(RSSConfig.VALUE_CONTENT))
-              dechromedContentMode = DECHROMED_CONTENT;
-          }
-        }
-        else if (n.getType().equals(RSSConfig.NODE_CHROMEDMODE))
-        {
-          String mode = n.getAttributeValue(RSSConfig.ATTR_MODE);
-          if (mode != null && mode.length() > 0)
-          {
-            if (mode.equals(RSSConfig.VALUE_USE))
-              chromedContentMode = CHROMED_USE;
-            else if (mode.equals(RSSConfig.VALUE_SKIP))
-              chromedContentMode = CHROMED_SKIP;
-            else if (mode.equals(RSSConfig.VALUE_METADATA))
-              chromedContentMode = CHROMED_METADATA_ONLY;
-          }
-        }
-      }
-    }
-
-    /** Check if document is a seed */
-    public boolean isSeed(String canonicalUrl)
-    {
-      return seeds.contains(canonicalUrl);
-    }
-
-    /** Iterate over all canonicalized seeds */
-    public Iterator<String> getSeeds()
-    {
-      return seeds.iterator();
-    }
-
-    /** Get the acls */
-    public String[] getAcls()
-    {
-      String[] rval = new String[acls.size()];
-      Iterator<String> iter = acls.iterator();
-      int i = 0;
-      while (iter.hasNext())
-      {
-        rval[i++] = iter.next();
-      }
-      return rval;
-    }
-
-    /** Get the feed timeout value */
-    public int getFeedTimeoutValue()
-    {
-      return feedTimeoutValue;
-    }
-
-    /** Get the dechromed content mode */
-    public int getDechromedContentMode()
-    {
-      return dechromedContentMode;
-    }
-
-    /** Get the chromed content mode */
-    public int getChromedContentMode()
-    {
-      return chromedContentMode;
-    }
-
-    /** Get the next time (by default) a feed should be scanned */
-    public Long getDefaultRescanTime(long currentTime)
-    {
-      if (defaultRescanInterval == null)
-        return null;
-      return new Long(defaultRescanInterval.intValue() * 60000L + currentTime);
-    }
-
-    /** Get the minimum next time a feed should be scanned */
-    public Long getMinimumRescanTime(long currentTime)
-    {
-      if (minimumRescanInterval == null)
-        return null;
-      return new Long(minimumRescanInterval.intValue() * 60000L + currentTime);
-    }
-
-    /** Get the next time a "bad feed" should be rescanned */
-    public Long getBadFeedRescanTime(long currentTime)
-    {
-      if (badFeedRescanInterval == null)
-        return null;
-      return new Long(badFeedRescanInterval.intValue() * 60000L + currentTime);
-    }
-
-    /** Check for legality of a url.
-    * @return true if the passed-in url is either a seed, or a legal url, according to this
-    * filter.
-    */
-    public boolean isLegalURL(String url)
-    {
-      if (seeds.contains(url))
-        return true;
-      if (mappings.isMatch(url) == false)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("RSS: Url '"+url+"' is illegal because it did not match a mapping rule");
-        return false;
-      }
-      // Now make sure it's not in the exclude list.
-      for (Pattern p : excludePatterns)
-      {
-        Matcher m = p.matcher(url);
-        if (m.find())
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: Url '"+url+"' is illegal because exclude pattern '"+p.toString()+"' matched it");
-          return false;
-        }
-      }
-
-      return true;
-    }
-
-    /** Scan patterns and return the one that matches first.
-    * @return null if the url doesn't match or should not be ingested, or the new string if it does.
-    */
-    public String mapDocumentURL(String url)
-      throws ManifoldCFException
-    {
-      if (seeds.contains(url))
-        return null;
-      return mappings.map(url);
-    }
-
-    /** Get canonicalization policies */
-    public CanonicalizationPolicies getCanonicalizationPolicies()
-    {
-      return canonicalizationPolicies;
-    }
-  }
-
-}
-
-
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/Robots.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/Robots.java
deleted file mode 100644
index 962b41b..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/Robots.java
+++ /dev/null
@@ -1,813 +0,0 @@
-/* $Id: Robots.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-import java.net.*;
-
-
-/** This class is a cache of a specific robots data.  It is loaded and fetched according to standard
-* robots rules; namely, caching for up to 24 hrs, format and parsing rules consistent with
-* http://www.robotstxt.org/wc/robots.html.  The apache Httpclient is used to fetch the robots files, when necessary.
-* An instance of this class should be constructed statically in order for the caching properties to work to
-* maximum advantage.
-*/
-public class Robots
-{
-  public static final String _rcsid = "@(#)$Id: Robots.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Robots fetch timeout value */
-  protected static final int ROBOT_TIMEOUT_MILLISECONDS = 60000;
-  /** Robots connection type value */
-  protected static final String ROBOT_CONNECTION_TYPE = "Robot";
-  /** Robot file name value */
-  protected static final String ROBOT_FILE_NAME = "/robots.txt";
-
-  /** Fetcher to use to get the data from wherever */
-  protected ThrottledFetcher fetcher;
-  /** Reference count */
-  protected int refCount = 0;
-
-  /** This is the cache hash - which is keyed by the protocol/host/port, and has a Host object as the
-  * value.
-  */
-  protected Map cache = new HashMap();
-
-  /** Constructor.
-  */
-  public Robots(ThrottledFetcher fetcher)
-  {
-    this.fetcher = fetcher;
-  }
-
-  /** Note that a connection has been established. */
-  public synchronized void noteConnectionEstablished()
-  {
-    refCount++;
-  }
-
-  /** Note that a connection has been released, and free resources if no reason
-  * to retain them. */
-  public synchronized void noteConnectionReleased()
-  {
-    refCount--;
-    if (refCount == 0)
-    {
-      // Clear the cache!
-      cache.clear();
-    }
-  }
-
-  /** Clean idle stuff out of cache */
-  public synchronized void poll()
-  {
-    // What we want to do is get the current time and
-    // expire all entries that are marked for death before that time.
-
-    Map newCache = new HashMap();
-    long currentTime = System.currentTimeMillis();
-    Iterator iter = cache.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String identifyingString = (String)iter.next();
-      Host host = (Host)cache.get(identifyingString);
-      if (!host.canBeFlushed(currentTime))
-        newCache.put(identifyingString,host);
-    }
-    cache = newCache;
-  }
-
-  /** Decide whether a specific robot can crawl a specific URL.
-  * A ServiceInterruption exception is thrown if the fetch itself fails in a transient way.
-  * A permanent failure (such as an invalid URL) with throw a ManifoldCFException.
-  *@param userAgent is the user-agent string used by the robot.
-  *@param from is the email address.
-  *@param protocol is the name of the protocol (e.g. "http")
-  *@param port is the port number (-1 being the default for the protocol)
-  *@param hostName is the fqdn of the host
-  *@param pathString is the path (non-query) part of the URL
-  *@return true if fetch is allowed, false otherwise.
-  */
-  public boolean isFetchAllowed(IThreadContext threadContext, String throttleGroupName,
-    String protocol, int port, String hostName, String pathString,
-    String userAgent, String from,
-    String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-    IProcessActivity activities, int connectionLimit)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String identifyingString = protocol + "://" + hostName;
-    if (port != -1)
-      identifyingString += ":" + Integer.toString(port);
-
-    // Now, look for a valid Host object, and create one if none exists.
-    Host host;
-
-    synchronized (this)
-    {
-      host = (Host)cache.get(identifyingString);
-      if (host == null)
-      {
-        host = new Host(protocol,port,hostName);
-        cache.put(identifyingString,host);
-      }
-    }
-
-    return host.isFetchAllowed(threadContext,throttleGroupName,
-      System.currentTimeMillis(),pathString,
-      userAgent,from,
-      proxyHost, proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,activities,connectionLimit);
-  }
-
-  // Protected methods and classes
-
-  /** Convert a string from the robots file into a readable form that does NOT contain NUL characters (since postgresql does not accept those).
-  */
-  protected static String makeReadable(String inputString)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < inputString.length())
-    {
-      char y = inputString.charAt(i++);
-      if (y >= ' ')
-        sb.append(y);
-      else
-      {
-        sb.append('^');
-        sb.append((char)(y + '@'));
-      }
-    }
-    return sb.toString();
-  }
-
-  /** Check if path matches specification */
-  protected static boolean doesPathMatch(String path, String spec)
-  {
-    // For robots 1.0, this function would do just this:
-    // return path.startsWith(spec);
-    // However, we implement the "google bot" spec, which allows wildcard matches that are, in fact, regular-expression-like in some ways.
-    // The "specification" can be found here: http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=40367
-    return doesPathMatch(path,0,spec,0);
-  }
-
-  /** Recursive method for matching specification to path. */
-  protected static boolean doesPathMatch(String path, int pathIndex, String spec, int specIndex)
-  {
-    while (true)
-    {
-      if (specIndex == spec.length())
-        // Hit the end of the specification!  We're done.
-        return true;
-      char specChar = spec.charAt(specIndex++);
-      if (specChar == '*')
-      {
-        // Found a specification wildcard.
-        // Eat up all the '*' characters at this position - otherwise each additional one increments the exponent of how long this can take,
-        // making denial-of-service via robots parsing a possibility.
-        while (specIndex < spec.length())
-        {
-          if (spec.charAt(specIndex) != '*')
-            break;
-          specIndex++;
-        }
-        // It represents zero or more characters, so we must recursively try for a match against all remaining characters in the path string.
-        while (true)
-        {
-          boolean match = doesPathMatch(path,pathIndex,spec,specIndex);
-          if (match)
-            return true;
-          if (path.length() == pathIndex)
-            // Nothing further to try, and no match
-            return false;
-          pathIndex++;
-          // Try again
-        }
-      }
-      else if (specChar == '$' && specIndex == spec.length())
-      {
-        // Found a specification end-of-path character.
-        // (It can only be legitimately the last character of the specification.)
-        return pathIndex == path.length();
-      }
-      if (pathIndex == path.length())
-        // Hit the end of the path! (but not the end of the specification!)
-        return false;
-      if (path.charAt(pathIndex) != specChar)
-        return false;
-      // On to the next match
-      pathIndex++;
-    }
-  }
-
-  /** This class maintains status for a given host.  There's an instance of this class for
-  * each host in the robots cache.
-  */
-  protected class Host
-  {
-    /** Protocol */
-    protected String protocol;
-    /** Port */
-    protected int port;
-    /** Host name */
-    protected String hostName;
-    /** Timestamp.  This is the time that the cache record becomes invalid. */
-    protected long invalidTime = -1L;
-    /** This flag describes whether or not the host record is valid yet. */
-    protected boolean isValid = false;
-    /** This is the list of robots records for the host, or null if no robots.txt found. */
-    protected ArrayList records = null;
-    /** This will be set to "true" if the robots.txt for this host is in the process of being read. */
-    protected boolean readingRobots = false;
-    /** This will be set to nonzero if the robots structure is currently in use */
-    protected int checkingRobots = 0;
-
-    /** Constructor.
-    */
-    public Host(String protocol, int port, String hostName)
-    {
-      this.protocol = protocol;
-      this.port = port;
-      this.hostName = hostName;
-    }
-
-    /** Check a given path string against this host's robots file.
-    *@param currentTime is the current time in milliseconds since epoch.
-    *@param pathString is the path string to check.
-    *@return true if crawling is allowed, false otherwise.
-    */
-    public boolean isFetchAllowed(IThreadContext threadContext, String throttleGroupName,
-      long currentTime, String pathString,
-      String userAgent, String from,
-      String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-      IProcessActivity activities, int connectionLimit)
-      throws ServiceInterruption, ManifoldCFException
-    {
-      synchronized (this)
-      {
-        while (true)
-        {
-          if (readingRobots)
-          {
-            // Some other thread is already reading it, so wait until awakened
-            try
-            {
-              wait();
-            }
-            catch (InterruptedException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            // Back around...
-          }
-          else if (isValid == false || currentTime >= invalidTime)
-          {
-            // Need to read!  If checking is going on, need to wait also
-            if (checkingRobots > 0)
-            {
-              // Some other thread is in the midst of checking the previous version of the robots data.  Wait until awakened.
-              try
-              {
-                wait();
-              }
-              catch (InterruptedException e)
-              {
-                throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-              }
-              // Back around...
-            }
-            else
-            {
-              // Nobody is doing anything, so note that we are now reading robots, and invalidate the record if it isn't already
-              isValid = false;
-              records = null;
-              readingRobots = true;
-              break;
-            }
-          }
-          else
-          {
-            // The current cached robots is valid; note that we are accessing it, and resume.
-            checkingRobots++;
-            break;
-          }
-        }
-      }
-      // Go into a try so we have some guarantee of cleaning up if there's an exception
-      try
-      {
-        // Note well: This section of code, while not in a synchronizer, is in fact protected so that EITHER one thread is in here to read the
-        // robots file, or multiple threads are but only to access the cached robots data.
-
-        if (readingRobots)
-          // This doesn't need to be synchronized because readingRobots blocks all other threads from getting at this object
-          makeValid(threadContext,throttleGroupName,currentTime,userAgent,from,
-          proxyHost, proxyPort, proxyAuthDomain, proxyAuthUsername, proxyAuthPassword,
-          hostName, activities, connectionLimit);
-
-        // If we get this far, the records should all be in good shape, so interpret them
-        if (records == null)
-          return true;
-
-        boolean wasDisallowed = false;
-        boolean wasAllowed = false;
-
-        // First matching user-agent takes precedence, according to the following chunk of spec:
-        // "These name tokens are used in User-agent lines in /robots.txt to
-        // identify to which specific robots the record applies. The robot
-        // must obey the first record in /robots.txt that contains a User-
-        // Agent line whose value contains the name token of the robot as a
-        // substring. The name comparisons are case-insensitive. If no such
-        // record exists, it should obey the first record with a User-agent
-        // line with a "*" value, if present. If no record satisfied either
-        // condition, or no records are present at all, access is unlimited."
-
-        boolean sawAgent = false;
-        String userAgentUpper = userAgent.toUpperCase(Locale.ROOT);
-
-        int i = 0;
-        while (i < records.size())
-        {
-          Record r = (Record)records.get(i++);
-          if (r.isAgentMatch(userAgentUpper,false))
-          {
-            if (r.isDisallowed(pathString))
-              wasDisallowed = true;
-            if (r.isAllowed(pathString))
-              wasAllowed = true;
-            sawAgent = true;
-            break;
-          }
-        }
-
-        if (sawAgent == false)
-        {
-          i = 0;
-          while (i < records.size())
-          {
-            Record r = (Record)records.get(i++);
-            if (r.isAgentMatch("*",true))
-            {
-              if (r.isDisallowed(pathString))
-                wasDisallowed = true;
-              if (r.isAllowed(pathString))
-                wasAllowed = true;
-              sawAgent = true;
-              break;
-            }
-          }
-        }
-
-        if (sawAgent == false)
-          return true;
-
-        // Allowed always overrides disallowed
-        if (wasAllowed)
-          return true;
-        if (wasDisallowed)
-          return false;
-
-        // No match -> crawl allowed
-        return true;
-
-      }
-      finally
-      {
-        synchronized (this)
-        {
-          if (readingRobots)
-            readingRobots = false;
-          else
-            checkingRobots--;
-          // Wake up any sleeping threads
-          notifyAll();
-        }
-      }
-
-    }
-
-    /** Check if the current record can be flushed.
-    * This is not quite the same as whether the record is valid, since a not-yet-valid record still should not be flushed when there
-    * is activity going on with that record!
-    */
-    public synchronized boolean canBeFlushed(long currentTime)
-    {
-      // Check if active FIRST.  readingRobots or checkingRobots will be properly set if there is activity going on with this Host.
-      // In that case, the Host record must persist.
-      if (readingRobots || checkingRobots > 0)
-        return false;
-      // Now, since the record is known not active, see if we can flush it.
-      if (!isValid)
-        return true;
-      if (currentTime >= invalidTime)
-      {
-        isValid = false;
-        records = null;
-        return true;
-      }
-      return false;
-    }
-
-    /** Initialize the record.  This method reads the robots file on the specified protocol/host/port,
-    * and parses it according to the rules.
-    */
-    protected void makeValid(IThreadContext threadContext, String throttleGroupName,
-      long currentTime, String userAgent, String from,
-      String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-      String hostName, IProcessActivity activities, int connectionLimit)
-      throws ServiceInterruption, ManifoldCFException
-    {
-      invalidTime = currentTime + 24L * 60L * 60L * 1000L;
-
-      // Do the fetch
-      IThrottledConnection connection = fetcher.createConnection(threadContext,throttleGroupName,
-        hostName,connectionLimit,ROBOT_TIMEOUT_MILLISECONDS,
-        proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-        activities);
-      try
-      {
-        connection.beginFetch(ROBOT_CONNECTION_TYPE);
-        try
-        {
-          int responseCode = connection.executeFetch(protocol,port,ROBOT_FILE_NAME,userAgent,from,
-            null,null);
-          switch (responseCode)
-          {
-          case IThrottledConnection.STATUS_OK:
-            InputStream is = connection.getResponseBodyStream();
-            try
-            {
-              Reader r = new InputStreamReader(is, StandardCharsets.UTF_8);
-              try
-              {
-                BufferedReader br = new BufferedReader(r);
-                try
-                {
-                  parseRobotsTxt(br,hostName,activities);
-                }
-                finally
-                {
-                  br.close();
-                }
-              }
-              finally
-              {
-                r.close();
-              }
-            }
-            finally
-            {
-              is.close();
-            }
-            break;
-
-          case IThrottledConnection.STATUS_SITEERROR:
-            // Permanent errors that mean, "fetch not allowed"
-            Record r = new Record();
-            r.addAgent("*");
-            r.addDisallow("/");
-            records = new ArrayList();
-            records.add(r);
-            break;
-
-          case IThrottledConnection.STATUS_PAGEERROR:
-          default:
-            // Permanent errors that mean essentially "do what we want"
-            break;
-          }
-        }
-        finally
-        {
-          connection.doneFetch(activities);
-        }
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ServiceInterruption("Couldn't fetch robots.txt from "+protocol+"://"+hostName+((port==-1)?"":":"+Integer.toString(port)),currentTime + 300000L);
-      }
-      finally
-      {
-        connection.close();
-      }
-      isValid = true;
-    }
-
-    /** Parse the robots.txt file using a reader.
-    * Is NOT expected to close the stream.
-    */
-    protected void parseRobotsTxt(BufferedReader r, String hostName, IProcessActivity activities)
-      throws IOException, ManifoldCFException
-    {
-      boolean parseCompleted = false;
-      boolean robotsWasHtml = false;
-      boolean foundErrors = false;
-      String description = null;
-
-      long startParseTime = System.currentTimeMillis();
-      try
-      {
-        records = new ArrayList();
-        Record record = null;
-        boolean seenAction = false;
-        while (true)
-        {
-          String x = r.readLine();
-          if (x == null)
-            break;
-          int numSignPos = x.indexOf("#");
-          if (numSignPos != -1)
-            x = x.substring(0,numSignPos);
-          String lowercaseLine = x.toLowerCase(Locale.ROOT).trim();
-          if (lowercaseLine.startsWith("user-agent:"))
-          {
-            if (seenAction)
-            {
-              records.add(record);
-              record = null;
-              seenAction = false;
-            }
-            if (record == null)
-              record = new Record();
-
-            String agentName = x.substring("User-agent:".length()).trim();
-            record.addAgent(agentName);
-          }
-          else if (lowercaseLine.startsWith("user-agent"))
-          {
-            if (seenAction)
-            {
-              records.add(record);
-              record = null;
-              seenAction = false;
-            }
-            if (record == null)
-              record = new Record();
-
-            String agentName = x.substring("User-agent".length()).trim();
-            record.addAgent(agentName);
-          }
-          else if (lowercaseLine.startsWith("disallow:"))
-          {
-            if (record == null)
-            {
-              description = "Disallow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String disallowPath = x.substring("Disallow:".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (disallowPath.length() > 0)
-                record.addDisallow(disallowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("disallow"))
-          {
-            if (record == null)
-            {
-              description = "Disallow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String disallowPath = x.substring("Disallow".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (disallowPath.length() > 0)
-                record.addDisallow(disallowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("allow:"))
-          {
-            if (record == null)
-            {
-              description = "Allow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String allowPath = x.substring("Allow:".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (allowPath.length() > 0)
-                record.addAllow(allowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("allow"))
-          {
-            if (record == null)
-            {
-              description = "Allow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String allowPath = x.substring("Allow".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (allowPath.length() > 0)
-                record.addAllow(allowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("crawl-delay:"))
-          {
-            // We don't complain about this, but right now we don't listen to it either.
-          }
-          else if (lowercaseLine.startsWith("crawl-delay"))
-          {
-            // We don't complain about this, but right now we don't listen to it either.
-          }
-          else if (lowercaseLine.startsWith("sitemap:"))
-          {
-            // We don't complain about this, but right now we don't listen to it either.
-          }
-          else if (lowercaseLine.startsWith("sitemap"))
-          {
-            // We don't complain about this, but right now we don't listen to it either.
-          }
-          else
-          {
-            // If it's not just a blank line, complain
-            if (x.trim().length() > 0)
-            {
-              String problemLine = makeReadable(x);
-              description = "Unknown robots.txt line: '"+problemLine+"'";
-              Logging.connectors.warn("Web: Unknown robots.txt line from '"+hostName+"': '"+problemLine+"'");
-              if (x.indexOf("<html") != -1 || x.indexOf("<HTML") != -1)
-              {
-                // Looks like some kind of an html file, probably as a result of a redirection, so just abort as if we have a page error
-                robotsWasHtml = true;
-                parseCompleted = true;
-                break;
-              }
-              foundErrors = true;
-            }
-          }
-        }
-        if (record != null)
-          records.add(record);
-        parseCompleted = true;
-      }
-      finally
-      {
-        // Log the fact that we attempted to parse robots.txt, as well as what happened
-        // These are the following situations we will report:
-        // (1) INCOMPLETE - Parsing did not complete - if the stream was interrupted
-        // (2) HTML - Robots was html - if the robots data seemed to be html
-        // (3) ERRORS - Robots had errors - if the robots data was accepted but had errors in it
-        // (4) SUCCESS - Robots parsed successfully - if the robots data was parsed without problem
-        String status;
-        if (parseCompleted)
-        {
-          if (robotsWasHtml)
-          {
-            status = "HTML";
-            description = "Robots file contained HTML, skipped";
-          }
-          else
-          {
-            if (foundErrors)
-            {
-              status = "ERRORS";
-              // description should already be set
-            }
-            else
-            {
-              status = "SUCCESS";
-              description = null;
-            }
-          }
-        }
-        else
-        {
-          status = "INCOMPLETE";
-          description = "Parsing was interrupted";
-        }
-
-        activities.recordActivity(new Long(startParseTime),RSSConnector.ACTIVITY_ROBOTSPARSE,
-          null,hostName,status,description,null);
-      }
-    }
-  }
-
-
-  /** This class represents a record in a robots.txt file.  It contains one or
-  * more user-agents, and one or more disallows.
-  */
-  protected static class Record
-  {
-    protected ArrayList userAgents = new ArrayList();
-    protected ArrayList disallows = new ArrayList();
-    protected ArrayList allows = new ArrayList();
-
-    /** Constructor.
-    */
-    public Record()
-    {
-    }
-
-    /** Add a user-agent.
-    */
-    public void addAgent(String agentName)
-    {
-      userAgents.add(agentName);
-    }
-
-    /** Add a disallow.
-    */
-    public void addDisallow(String disallowPath)
-    {
-      disallows.add(disallowPath);
-    }
-
-    /** Add an allow.
-    */
-    public void addAllow(String allowPath)
-    {
-      allows.add(allowPath);
-    }
-
-    /** See if user-agent matches.
-    */
-    public boolean isAgentMatch(String agentNameUpper, boolean exactMatch)
-    {
-      int i = 0;
-      while (i < userAgents.size())
-      {
-        String agent = ((String)userAgents.get(i++)).toUpperCase(Locale.ROOT);
-        if (exactMatch && agent.trim().equals(agentNameUpper))
-          return true;
-        if (!exactMatch && agentNameUpper.indexOf(agent) != -1)
-          return true;
-      }
-      return false;
-    }
-
-
-    /** See if path is disallowed.  Only called if user-agent has already
-    * matched.  (This checks if there's an explicit match with one of the
-    * Disallows clauses.)
-    */
-    public boolean isDisallowed(String path)
-    {
-      int i = 0;
-      while (i < disallows.size())
-      {
-        String disallow = (String)disallows.get(i++);
-        if (doesPathMatch(path,disallow))
-          return true;
-      }
-      return false;
-    }
-
-    /** See if path is allowed.  Only called if user-agent has already
-    * matched.  (This checks if there's an explicit match with one of the
-    * Allows clauses).
-    */
-    public boolean isAllowed(String path)
-    {
-      int i = 0;
-      while (i < allows.size())
-      {
-        String allow = (String)allows.get(i++);
-        if (doesPathMatch(path,allow))
-          return true;
-      }
-      return false;
-    }
-
-  }
-
-}
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/SetSeedList.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/SetSeedList.java
deleted file mode 100644
index b711cd2..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/SetSeedList.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/* $Id: SetSeedList.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-/** This class is used to set the seed list for a specified RSS job.
-*/
-public class SetSeedList
-{
-  public static final String _rcsid = "@(#)$Id: SetSeedList.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private SetSeedList()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: SetSeedList <job_id>");
-      System.err.println("(Reads a set of urls from stdin)");
-      System.exit(-1);
-    }
-
-    String jobString = args[0];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription desc = jobManager.load(new Long(jobString));
-
-      // Edit the job specification
-      Specification ds = desc.getSpecification();
-
-      // Delete all url specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("feed"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      java.io.Reader str = new java.io.InputStreamReader(System.in, StandardCharsets.UTF_8);
-      try
-      {
-        java.io.BufferedReader is = new java.io.BufferedReader(str);
-        try
-        {
-          while (true)
-          {
-            String nextString = is.readLine();
-            if (nextString == null)
-              break;
-            if (nextString.length() == 0)
-              continue;
-            SpecificationNode node = new SpecificationNode("feed");
-            node.setAttribute("url",nextString);
-            ds.addChild(ds.getChildCount(),node);
-          }
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        str.close();
-      }
-
-      // Now, save
-      jobManager.save(desc);
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(-2);
-    }
-  }
-
-}
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/ThrottledFetcher.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/ThrottledFetcher.java
deleted file mode 100644
index 7835dd9..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/ThrottledFetcher.java
+++ /dev/null
@@ -1,1251 +0,0 @@
-/* $Id: ThrottledFetcher.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.common.XThreadInputStream;
-import org.apache.manifoldcf.connectorcommon.common.InterruptibleSocketFactory;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-import java.net.*;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpHost;
-import org.apache.http.Header;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-
-/** This class uses httpclient to fetch stuff from webservers.  However, it additionally controls the fetch
-* rate in two ways: first, controlling the overall bandwidth used per server, and second, limiting the number
-* of simultaneous open connections per server.  It's also capable of limiting the maximum number of fetches
-* per time period per server as well; however, this functionality is not strictly necessary at this time because
-* the CF scheduler does that at a higher layer.
-* An instance of this class would very probably need to have a lifetime consistent with the long-term nature
-* of these values, and be static.
-* This class sets up a different Http connection pool for each server, so that we can foist off onto the httpclient
-* library the task of limiting the number of connections.  This means that we need periodic polling to determine
-* when idle pooled connections can be freed.
-*/
-public class ThrottledFetcher
-{
-  public static final String _rcsid = "@(#)$Id: ThrottledFetcher.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This flag determines whether we record everything to the disk, as a means of doing a web snapshot */
-  protected static final boolean recordEverything = false;
-
-  /** The read chunk length */
-  protected static final int READ_CHUNK_LENGTH = 4096;
-
-  /** This counter keeps track of the total outstanding handles across everything, because we do try to control that */
-  protected static int globalHandleCount = 0;
-  /** This is the lock object for that global handle counter */
-  protected static Integer globalHandleCounterLock = new Integer(0);
-
-  /** This hash maps the server string (without port) to a pool throttling object, where
-  * we can track the statistics and make sure we throttle appropriately */
-  protected final Map<String,IConnectionThrottler> serverMap = new HashMap<String,IConnectionThrottler>();
-
-  /** Reference count for how many connections to this pool there are */
-  protected int refCount = 0;
-
-  // Current host name
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (java.net.UnknownHostException e)
-    {
-    }
-  }
-
-  /** Note that we're about to need a handle (and make sure we have enough) */
-  protected static void registerGlobalHandle(int maxHandles)
-    throws ManifoldCFException
-  {
-    try
-    {
-      synchronized (globalHandleCounterLock)
-      {
-        while (globalHandleCount >= maxHandles)
-        {
-          globalHandleCounterLock.wait();
-        }
-        globalHandleCount++;
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Note that we're done with a handle (so we can free it) */
-  protected static void releaseGlobalHandle()
-  {
-    synchronized (globalHandleCounterLock)
-    {
-      globalHandleCount--;
-      globalHandleCounterLock.notifyAll();
-    }
-  }
-
-  /** Constructor.
-  */
-  public ThrottledFetcher()
-  {
-  }
-
-  /** Establish a connection to a specified URL.
-  * @param serverName is the FQDN of the server, e.g. foo.metacarta.com
-  * @param connectionLimit is the maximum desired outstanding connections at any one time.
-  * @param connectionTimeoutMilliseconds is the number of milliseconds to wait for the connection before timing out.
-  */
-  public synchronized IThrottledConnection createConnection(IThreadContext threadContext, String throttleGroupName,
-    String serverName, int connectionLimit, int connectionTimeoutMilliseconds,
-    String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-    IAbortActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    IConnectionThrottler server;
-    server = serverMap.get(serverName);
-    if (server == null)
-    {
-      // Create a connection throttler for this server
-      IThrottleGroups tg = ThrottleGroupsFactory.make(threadContext);
-      server = tg.obtainConnectionThrottler(RSSConnector.rssThrottleGroupType, throttleGroupName, new String[]{serverName});
-      serverMap.put(serverName,server);
-    }
-
-    return new ThrottledConnection(serverName, server,
-      connectionTimeoutMilliseconds,connectionLimit,
-      proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-      activities);
-  }
-
-  /** Poll.  This method is designed to allow idle connections to be closed and freed.
-  */
-  public synchronized void poll()
-    throws ManifoldCFException
-  {
-    // Nothing needed now; connections are released when we're done with them.
-  }
-
-  /** Note that there is a repository connection that is using this object. */
-  public synchronized void noteConnectionEstablished()
-  {
-    refCount++;
-  }
-
-  /** Connection pool no longer needed.  Call this to indicate that this object no
-  * longer needs to keep its pools available, for the moment.
-  */
-  public synchronized void noteConnectionReleased()
-  {
-    refCount--;
-    if (refCount == 0)
-    {
-      // Since we don't have any actual pools here, this can be a no-op for now
-      // MHL
-      serverMap.clear();
-    }
-  }
-
-  /** This class represents an established connection to a URL.
-  */
-  protected static class ThrottledConnection implements IThrottledConnection
-  {
-    /** The server fqdn */
-    protected final String serverName;
-    /** The throttling object we use to track connections */
-    protected final IConnectionThrottler connectionThrottler;
-    /** The throttling object we use to track fetches */
-    protected final IFetchThrottler fetchThrottler;
-    /** Connection timeout in milliseconds */
-    protected final int connectionTimeoutMilliseconds;
-    /** The client connection manager */
-    protected final HttpClientConnectionManager connectionManager;
-    /** The httpclient */
-    protected final HttpClient httpClient;
-
-    /** The method object */
-    protected HttpRequestBase executeMethod = null;
-    /** The start-fetch time */
-    protected long startFetchTime = -1L;
-    /** The error trace, if any */
-    protected Throwable throwable = null;
-    /** The current URL being fetched */
-    protected String myUrl = null;
-    /** The status code fetched, if any */
-    protected int statusCode = FETCH_NOT_TRIED;
-    /** The kind of fetch we are doing */
-    protected String fetchType = null;
-    /** The current bytes in the current fetch */
-    protected long fetchCounter = 0L;
-
-    /** The thread that is actually doing the work */
-    protected ExecuteMethodThread methodThread = null;
-    /** Set if thread has been started */
-    protected boolean threadStarted = false;
-    
-    /** Abort checker */
-    protected final AbortChecker abortChecker;
-    
-    /** Constructor.
-    */
-    public ThrottledConnection(String serverName,
-      IConnectionThrottler connectionThrottler,
-      int connectionTimeoutMilliseconds, int connectionLimit,
-      String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-      IAbortActivity activities)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      this.serverName = serverName;
-      this.connectionThrottler = connectionThrottler;
-      this.connectionTimeoutMilliseconds = connectionTimeoutMilliseconds;
-      this.abortChecker = new AbortChecker(activities);
-      
-      // Create the https scheme for this connection
-      javax.net.ssl.SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();;
-      SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeoutMilliseconds),
-        NoopHostnameVerifier.INSTANCE);
-
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(connectionTimeoutMilliseconds)
-        .build());
-      connectionManager = poolingConnectionManager;
-
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(connectionTimeoutMilliseconds)
-          .setExpectContinueEnabled(true)
-          .setConnectTimeout(connectionTimeoutMilliseconds)
-          .setConnectionRequestTimeout(connectionTimeoutMilliseconds);
-
-      // If there's a proxy, set that too.
-      if (proxyHost != null && proxyHost.length() > 0)
-      {
-
-        // Configure proxy authentication
-        if (proxyAuthUsername != null && proxyAuthUsername.length() > 0)
-        {
-          if (proxyAuthPassword == null)
-            proxyAuthPassword = "";
-          if (proxyAuthDomain == null)
-            proxyAuthDomain = "";
-
-          credentialsProvider.setCredentials(
-            new AuthScope(proxyHost, proxyPort),
-            new NTCredentials(proxyAuthUsername, proxyAuthPassword, currentHost, proxyAuthDomain));
-        }
-
-        HttpHost proxy = new HttpHost(proxyHost, proxyPort);
-
-        requestBuilder.setProxy(proxy);
-      }
-
-      httpClient = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .setMaxConnTotal(1)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setDefaultCredentialsProvider(credentialsProvider)
-        .setRequestExecutor(new HttpRequestExecutor(connectionTimeoutMilliseconds))
-        .setRedirectStrategy(new LaxRedirectStrategy())
-        .build();
-
-      registerGlobalHandle(connectionLimit);
-      try
-      {
-        int result = connectionThrottler.waitConnectionAvailable(abortChecker);
-        if (result != IConnectionThrottler.CONNECTION_FROM_CREATION)
-          throw new IllegalStateException("Got back unexpected value from waitForAConnection() of "+result);
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-      catch (BreakException e)
-      {
-        abortChecker.rethrowExceptions();
-      }
-      fetchThrottler = connectionThrottler.getNewConnectionFetchThrottler();
-    }
-
-    /** Begin the fetch process.
-    * @param fetchType is a short descriptive string describing the kind of fetch being requested.  This
-    *        is used solely for logging purposes.
-    */
-    @Override
-    public void beginFetch(String fetchType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      this.fetchType = fetchType;
-      fetchCounter = 0L;
-      try
-      {
-        if (fetchThrottler.obtainFetchDocumentPermission(abortChecker) == false)
-          throw new IllegalStateException("obtainFetchDocumentPermission() had unexpected return value");
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      catch (BreakException e)
-      {
-        abortChecker.rethrowExceptions();
-      }
-      threadStarted = false;
-    }
-
-    /** Log the fetch of a number of bytes. */
-    public void logFetchCount(int count)
-    {
-      fetchCounter += (long)count;
-    }
-
-
-    /** Execute the fetch and get the return code.  This method uses the
-    * standard logging mechanism to keep track of the fetch attempt.  It also
-    * signals the following three conditions: ServiceInterruption (if a dynamic
-    * error occurs), OK, or a static error code (for a condition where retry is
-    * not likely to be helpful).  The actual HTTP error code is NOT returned by
-    * this method.
-    * @param protocol is the protocol to use to perform the access, e.g. "http"
-    * @param port is the port to use to perform the access, where -1 means "use the default"
-    * @param urlPath is the path part of the url, e.g. "/robots.txt"
-    * @param userAgent is the value of the userAgent header to use.
-    * @param from is the value of the from header to use.
-    * @param proxyHost is the proxy host, or null if none.
-    * @param proxyPort is the proxy port, or -1 if none.
-    * @param proxyAuthDomain is the proxy authentication domain, or null.
-    * @param proxyAuthUsername is the proxy authentication user name, or null.
-    * @param proxyAuthPassword is the proxy authentication password, or null.
-    * @param lastETag is the requested lastETag header value.
-    * @param lastModified is the requested lastModified header value.
-    * @return the status code: success, static error, or dynamic error.
-    */
-    @Override
-    public int executeFetch(String protocol, int port, String urlPath, String userAgent, String from,
-      String lastETag, String lastModified)
-      throws ManifoldCFException, ServiceInterruption
-    {
-
-      StringBuilder sb = new StringBuilder(protocol);
-      sb.append("://").append(serverName);
-      if (port != -1)
-        sb.append(":").append(Integer.toString(port));
-      sb.append(urlPath);
-      myUrl = sb.toString();
-
-      // Create the get method
-      executeMethod = new HttpGet(myUrl);
-      
-      startFetchTime = System.currentTimeMillis();
-
-      // Set all appropriate headers
-      executeMethod.setHeader(new BasicHeader("User-Agent",userAgent));
-      executeMethod.setHeader(new BasicHeader("From",from));
-      executeMethod.setHeader(new BasicHeader("Accept","*/*"));
-
-      if (lastETag != null)
-        executeMethod.setHeader(new BasicHeader("ETag",lastETag));
-      if (lastModified != null)
-        executeMethod.setHeader(new BasicHeader("Last-Modified",lastModified));
-      // Create the execution thread.
-      methodThread = new ExecuteMethodThread(this, fetchThrottler,
-        httpClient, executeMethod);
-      // Start the method thread, which will start the transaction
-      try
-      {
-        methodThread.start();
-        threadStarted = true;
-        // We want to wait until at least the execution has fired, and then figure out where we
-        // stand
-        try
-        {
-          statusCode = methodThread.getResponseCode();
-          long currentTime;
-          switch (statusCode)
-          {
-          case HttpStatus.SC_OK:
-            return STATUS_OK;
-          case HttpStatus.SC_UNAUTHORIZED:
-          case HttpStatus.SC_USE_PROXY:
-            // Permanent errors that mean, "fetch not allowed"
-            return STATUS_SITEERROR;
-          case HttpStatus.SC_REQUEST_TIMEOUT:
-          case HttpStatus.SC_GATEWAY_TIMEOUT:
-          case HttpStatus.SC_SERVICE_UNAVAILABLE:
-            // Temporary service interruption
-            // May want to make the retry time a parameter someday
-            currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Http response temporary error on '"+myUrl+"': "+Integer.toString(statusCode),
-              null,currentTime + 60L * 60000L,currentTime + 1440L * 60000L,-1,false);
-          case HttpStatus.SC_NOT_MODIFIED:
-            return STATUS_NOCHANGE;
-          case HttpStatus.SC_INTERNAL_SERVER_ERROR:
-            // Fail for a while, but give up after 24 hours
-            currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Http response internal server error on '"+myUrl+"': "+Integer.toString(statusCode),
-              null,currentTime + 60L * 60000L,currentTime + 1440L * 60000L,-1,false);
-          case HttpStatus.SC_GONE:
-          case HttpStatus.SC_NOT_FOUND:
-          case HttpStatus.SC_BAD_GATEWAY:
-          case HttpStatus.SC_BAD_REQUEST:
-          default:
-            return STATUS_PAGEERROR;
-          }
-        }
-        catch (InterruptedException e)
-        {
-          methodThread.interrupt();
-          methodThread = null;
-          threadStarted = false;
-          throw e;
-        }
-
-      }
-      catch (InterruptedException e)
-      {
-        // Drop the current connection on the floor, so it cannot be reused.
-        executeMethod = null;
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.MalformedURLException e)
-      {
-        throwable = new ManifoldCFException("Illegal URI: '"+myUrl+"'",e);
-        statusCode = FETCH_BAD_URI;
-        return STATUS_PAGEERROR;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for IO for '"+myUrl+"': "+e.getMessage(), e, currentTime + 300000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for connect for '"+myUrl+"': "+e.getMessage(), e, currentTime + 60L * 60000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      catch (CircularRedirectException e)
-      {
-        throwable = e;
-        statusCode = FETCH_CIRCULAR_REDIRECT;
-        return STATUS_PAGEERROR;
-      }
-      catch (NoHttpResponseException e)
-      {
-        throwable = e;
-        // Give up after 2 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for response for '"+myUrl+"'", e, currentTime + 15L * 60000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      catch (java.net.ConnectException e)
-      {
-        throwable = e;
-        // Give up after 6 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for a connection for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (java.net.NoRouteToHostException e)
-      {
-        // This exception means we know the IP address but can't get there.  That's either a firewall issue, or it's something transient
-        // with the network.  Some degree of retry is probably wise.
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("No route to host for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (HttpException e)
-      {
-        throwable = e;
-        statusCode = FETCH_IO_ERROR;
-        return STATUS_PAGEERROR;
-      }
-      catch (IOException e)
-      {
-        // Treat this as a bad url.  We don't know what happened, but it isn't something we are going to naively
-        // retry on.
-        throwable = e;
-        statusCode = FETCH_IO_ERROR;
-        return STATUS_PAGEERROR;
-      }
-      catch (Throwable e)
-      {
-        Logging.connectors.debug("RSS: Caught an unexpected exception: "+e.getMessage(),e);
-        throwable = e;
-        statusCode = FETCH_UNKNOWN_ERROR;
-        return STATUS_PAGEERROR;
-      }
-    }
-
-    /** Get the http response code.
-    *@return the response code.  This is either an HTTP response code, or one of the codes above.
-    */
-    @Override
-    public int getResponseCode()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return statusCode;
-    }
-
-    /** Get the response input stream.  It is the responsibility of the caller
-    * to close this stream when done.
-    */
-    @Override
-    public InputStream getResponseBodyStream()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (executeMethod == null)
-        throw new ManifoldCFException("Attempt to get an input stream when there is no method");
-      if (methodThread == null || threadStarted == false)
-        throw new ManifoldCFException("Attempt to get an input stream when no method thread");
-      try
-      {
-        return methodThread.getSafeInputStream();
-      }
-      catch (InterruptedException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for IO for '"+myUrl+"': "+e.getMessage(), e, currentTime + 300000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for connect for '"+myUrl+"': "+e.getMessage(), e, currentTime + 60L * 60000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      catch (NoHttpResponseException e)
-      {
-        // Give up after 2 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for response for '"+myUrl+"'", e, currentTime + 15L * 60000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      catch (java.net.ConnectException e)
-      {
-        // Give up after 6 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for a stream connection for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (java.net.NoRouteToHostException e)
-      {
-        // This exception means we know the IP address but can't get there.  That's either a firewall issue, or it's something transient
-        // with the network.  Some degree of retry is probably wise.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("No route to host for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (HttpException e)
-      {
-        throw new ManifoldCFException("Http exception reading stream: "+e.getMessage(),e);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("I/O exception reading stream: "+e.getMessage(),e);
-      }
-    }
-
-    /** Get a specified response header, if it exists.
-    *@param headerName is the name of the header.
-    *@return the header value, or null if it doesn't exist.
-    */
-    @Override
-    public String getResponseHeader(String headerName)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (executeMethod == null)
-        throw new ManifoldCFException("Attempt to get a header when there is no method");
-      if (methodThread == null || threadStarted == false)
-        throw new ManifoldCFException("Attempt to get a header when no method thread");
-      try
-      {
-        return methodThread.getFirstHeader(headerName);
-      }
-      catch (InterruptedException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for IO for '"+myUrl+"': "+e.getMessage(), e, currentTime + 300000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for connect for '"+myUrl+"': "+e.getMessage(), e, currentTime + 60L * 60000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      catch (NoHttpResponseException e)
-      {
-        // Give up after 2 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for response for '"+myUrl+"'", e, currentTime + 15L * 60000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      catch (java.net.ConnectException e)
-      {
-        // Give up after 6 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for a connection for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (java.net.NoRouteToHostException e)
-      {
-        // This exception means we know the IP address but can't get there.  That's either a firewall issue, or it's something transient
-        // with the network.  Some degree of retry is probably wise.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("No route to host for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      catch (HttpException e)
-      {
-        throw new ManifoldCFException("Http exception reading response: "+e.getMessage(),e);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("I/O exception reading response: "+e.getMessage(),e);
-      }
-    }
-
-    /** Done with the fetch.  Call this when the fetch has been completed.  A log entry will be generated
-    * describing what was done.
-    */
-    @Override
-    public void doneFetch(IProcessActivity activities)
-      throws ManifoldCFException
-    {
-      
-      if (fetchType != null)
-      {
-        if (methodThread != null && threadStarted)
-          methodThread.abort();
-        long endTime = System.currentTimeMillis();
-
-        activities.recordActivity(new Long(startFetchTime),RSSConnector.ACTIVITY_FETCH,
-          new Long(fetchCounter),myUrl,Integer.toString(statusCode),(throwable==null)?null:throwable.getMessage(),null);
-
-        Logging.connectors.info("RSS: FETCH "+fetchType+"|"+myUrl+"|"+new Long(startFetchTime).toString()+"+"+new Long(endTime-startFetchTime).toString()+"|"+
-          Integer.toString(statusCode)+"|"+new Long(fetchCounter).toString()+"|"+((throwable==null)?"":(throwable.getClass().getName()+"| "+throwable.getMessage())));
-        if (throwable != null)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("RSS: Fetch exception for '"+myUrl+"'",throwable);
-        }
-        
-        // Shut down (join) the connection thread, if any, and if it started
-        if (methodThread != null)
-        {
-          if (threadStarted)
-          {
-            try
-            {
-              methodThread.finishUp();
-            }
-            catch (InterruptedException e)
-            {
-              throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            threadStarted = false;
-          }
-          methodThread = null;
-        }
-        
-        executeMethod = null;
-        throwable = null;
-        startFetchTime = -1L;
-        myUrl = null;
-        statusCode = -1;
-        fetchType = null;
-      }
-    }
-
-    /** Close the connection.  Call this to end this server connection.
-    */
-    @Override
-    public void close()
-      throws ManifoldCFException
-    {
-      // Clean up the connection pool.  This should do the necessary bookkeeping to release the one connection that's sitting there.
-      connectionManager.shutdown();
-      connectionThrottler.noteConnectionDestroyed();
-      releaseGlobalHandle();
-    }
-
-  }
-
-  /** This class throttles an input stream based on the specified byte rate parameters.  The
-  * throttling takes place across all streams that are open to the server in question.
-  */
-  protected static class ThrottledInputstream extends InputStream
-  {
-    /** Throttled connection */
-    protected final ThrottledConnection throttledConnection;
-    /** Stream throttler */
-    protected final IStreamThrottler streamThrottler;
-    /** The stream we are wrapping. */
-    protected final InputStream inputStream;
-
-    /** Constructor.
-    */
-    public ThrottledInputstream(ThrottledConnection throttledConnection, IStreamThrottler streamThrottler, InputStream is)
-    {
-      this.throttledConnection = throttledConnection;
-      this.streamThrottler = streamThrottler;
-      this.inputStream = is;
-    }
-
-    /** Read a byte.
-    */
-    public int read()
-      throws IOException
-    {
-      byte[] byteArray = new byte[1];
-      int count = read(byteArray,0,1);
-      if (count == -1)
-        return count;
-      return (int)byteArray[0];
-    }
-
-    /** Read lots of bytes.
-    */
-    public int read(byte[] b)
-      throws IOException
-    {
-      return read(b,0,b.length);
-    }
-
-    /** Read lots of specific bytes.
-    */
-    public int read(byte[] b, int off, int len)
-      throws IOException
-    {
-      int totalCount = 0;
-      while (len > ThrottledFetcher.READ_CHUNK_LENGTH)
-      {
-        int amt = basicRead(b,off,ThrottledFetcher.READ_CHUNK_LENGTH,totalCount);
-        if (amt == -1)
-        {
-          if (totalCount == 0)
-            return amt;
-          return totalCount;
-        }
-        totalCount += amt;
-        off += amt;
-        len -= amt;
-      }
-      if (len > 0)
-      {
-        int amt = basicRead(b,off,len,totalCount);
-        if (amt == -1)
-        {
-          if (totalCount == 0)
-            return amt;
-          return totalCount;
-        }
-        return totalCount + amt;
-      }
-      return totalCount;
-    }
-
-    /** Basic read, which uses the server object to throttle activity.
-    */
-    protected int basicRead(byte[] b, int off, int len, int totalSoFar)
-      throws IOException
-    {
-      try
-      {
-        if (streamThrottler.obtainReadPermission(len) == false)
-          throw new IllegalStateException("Throttler shut down while still active");
-        int amt = 0;
-        try
-        {
-          amt = inputStream.read(b,off,len);
-          return amt;
-        }
-        finally
-        {
-          if (amt == -1)
-            streamThrottler.releaseReadPermission(len,0);
-          else
-          {
-            streamThrottler.releaseReadPermission(len,amt);
-            throttledConnection.logFetchCount(amt);
-          }
-        }
-      }
-      catch (InterruptedException e)
-      {
-        InterruptedIOException e2 = new InterruptedIOException("Interrupted");
-        e2.bytesTransferred = totalSoFar;
-        throw e2;
-      }
-    }
-
-    /** Skip
-    */
-    public long skip(long n)
-      throws IOException
-    {
-      // Not sure whether we should bother doing anything with this; it's not used.
-      return inputStream.skip(n);
-    }
-
-    /** Get available.
-    */
-    public int available()
-      throws IOException
-    {
-      return inputStream.available();
-    }
-
-    /** Mark.
-    */
-    public void mark(int readLimit)
-    {
-      inputStream.mark(readLimit);
-    }
-
-    /** Reset.
-    */
-    public void reset()
-      throws IOException
-    {
-      inputStream.reset();
-    }
-
-    /** Check if mark is supported.
-    */
-    public boolean markSupported()
-    {
-      return inputStream.markSupported();
-    }
-
-    /** Close.
-    */
-    public void close()
-      throws IOException
-    {
-      try
-      {
-        inputStream.close();
-      }
-      finally
-      {
-        streamThrottler.closeStream();
-      }
-    }
-
-  }
-
-  /** This thread does the actual socket communication with the server.
-  * It's set up so that it can be abandoned at shutdown time.
-  *
-  * The way it works is as follows:
-  * - it starts the transaction
-  * - it receives the response, and saves that for the calling class to inspect
-  * - it transfers the data part to an input stream provided to the calling class
-  * - it shuts the connection down
-  *
-  * If there is an error, the sequence is aborted, and an exception is recorded
-  * for the calling class to examine.
-  *
-  * The calling class basically accepts the sequence above.  It starts the
-  * thread, and tries to get a response code.  If instead an exception is seen,
-  * the exception is thrown up the stack.
-  */
-  protected static class ExecuteMethodThread extends Thread
-  {
-    /** The connection */
-    protected final ThrottledConnection theConnection;
-    /** The fetch throttler */
-    protected final IFetchThrottler fetchThrottler;
-    /** Client and method, all preconfigured */
-    protected final HttpClient httpClient;
-    protected final HttpRequestBase executeMethod;
-    
-    protected HttpResponse response = null;
-    protected Throwable responseException = null;
-    protected XThreadInputStream threadStream = null;
-    protected InputStream bodyStream = null;
-    protected boolean streamCreated = false;
-    protected Throwable streamException = null;
-
-    protected boolean abortThread = false;
-    
-    protected Throwable shutdownException = null;
-
-    protected Throwable generalException = null;
-    
-    public ExecuteMethodThread(ThrottledConnection theConnection, IFetchThrottler fetchThrottler,
-      HttpClient httpClient, HttpRequestBase executeMethod)
-    {
-      super();
-      setDaemon(true);
-      this.theConnection = theConnection;
-      this.fetchThrottler = fetchThrottler;
-      this.httpClient = httpClient;
-      this.executeMethod = executeMethod;
-    }
-
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          // Call the execute method appropriately
-          synchronized (this)
-          {
-            if (!abortThread)
-            {
-              try
-              {
-                response = httpClient.execute(executeMethod);
-              }
-              catch (java.net.SocketTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (ConnectTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (InterruptedIOException e)
-              {
-                throw e;
-              }
-              catch (Throwable e)
-              {
-                responseException = e;
-              }
-              this.notifyAll();
-            }
-          }
-            
-          // Start the transfer of the content
-          if (responseException == null)
-          {
-            synchronized (this)
-            {
-              if (!abortThread)
-              {
-                try
-                {
-                  bodyStream = response.getEntity().getContent();
-                  if (bodyStream != null)
-                  {
-                    bodyStream = new ThrottledInputstream(theConnection,fetchThrottler.createFetchStream(),bodyStream);
-                    threadStream = new XThreadInputStream(bodyStream);
-                  }
-                  streamCreated = true;
-                }
-                catch (java.net.SocketTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (ConnectTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (InterruptedIOException e)
-                {
-                  throw e;
-                }
-                catch (Throwable e)
-                {
-                  streamException = e;
-                }
-                this.notifyAll();
-              }
-            }
-          }
-          
-          if (responseException == null && streamException == null)
-          {
-            if (threadStream != null)
-            {
-              // Stuff the content until we are done
-              threadStream.stuffQueue();
-            }
-          }
-          
-        }
-        finally
-        {
-          if (bodyStream != null)
-          {
-            try
-            {
-              bodyStream.close();
-            }
-            catch (IOException e)
-            {
-            }
-            bodyStream = null;
-          }
-          synchronized (this)
-          {
-            try
-            {
-              executeMethod.abort();
-            }
-            catch (Throwable e)
-            {
-              shutdownException = e;
-            }
-            this.notifyAll();
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        // We catch exceptions here that should ONLY be InterruptedExceptions, as a result of the thread being aborted.
-        this.generalException = e;
-      }
-    }
-
-    public int getResponseCode()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until the response object is there
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-            return response.getStatusLine().getStatusCode();
-          wait();
-        }
-      }
-    }
-      
-    public String getFirstHeader(String headerName)
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait for the response object to appear
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-          {
-            Header h = response.getFirstHeader(headerName);
-            if (h == null)
-              return null;
-            return h.getValue();
-          }
-          wait();
-        }
-      }
-    }
-      
-    public InputStream getSafeInputStream()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          checkException(streamException);
-          if (streamCreated)
-            return threadStream;
-          wait();
-        }
-      }
-    }
-    
-    public void abort()
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      synchronized (this)
-      {
-        if (streamCreated)
-        {
-          if (threadStream != null)
-            threadStream.abort();
-        }
-        abortThread = true;
-      }
-    }
-    
-    public void finishUp()
-      throws InterruptedException
-    {
-      join();
-    }
-    
-    protected synchronized void checkException(Throwable exception)
-      throws IOException, HttpException
-    {
-      if (exception != null)
-      {
-        // Throw the current exception, but clear it, so no further throwing is possible on the same problem.
-        Throwable e = exception;
-        if (e instanceof IOException)
-          throw (IOException)e;
-        else if (e instanceof HttpException)
-          throw (HttpException)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof Error)
-          throw (Error)e;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
-      }
-    }
-
-  }
-
-  /** This class furnishes an abort signal whenever the job activity says it should.
-  * It should never be invoked from a background thread, only from a ManifoldCF thread.
-  */
-  protected static class AbortChecker implements IBreakCheck
-  {
-    protected final IAbortActivity activities;
-    protected ServiceInterruption serviceInterruption = null;
-    protected ManifoldCFException mcfException = null;
-    
-    public AbortChecker(IAbortActivity activities)
-    {
-      this.activities = activities;
-    }
-    
-    @Override
-    public long abortCheck()
-      throws BreakException, InterruptedException
-    {
-      try
-      {
-        activities.checkJobStillActive();
-        return 1000L;
-      }
-      catch (ServiceInterruption e)
-      {
-        serviceInterruption = e;
-        throw new BreakException("Break requested: "+e.getMessage(),e);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          throw new InterruptedException("Interrupted: "+e.getMessage());
-        mcfException = e;
-        throw new BreakException("Error during break check: "+e.getMessage(),e);
-      }
-    }
-    
-    public void rethrowExceptions()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (serviceInterruption != null)
-        throw serviceInterruption;
-      if (mcfException != null)
-        throw mcfException;
-    }
-  }
-  
-}
diff --git a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/WebURL.java b/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/WebURL.java
deleted file mode 100644
index b8839e4..0000000
--- a/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/WebURL.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/** Replacement class for java.net.URI, which is broken in many ways.
-*/
-public class WebURL
-{
-  protected URI theURL;
-  protected String rawQueryPart;
-  
-  public WebURL(String url)
-    throws URISyntaxException
-  {
-    theURL = new URI(url);
-    rawQueryPart = null;
-  }
-  
-  public WebURL(String scheme, String host, int port, String path, String queryPart)
-    throws URISyntaxException
-  {
-    theURL = new URI(scheme, null, host, port, path, null, null);
-    rawQueryPart = queryPart;
-  }
-  
-  public WebURL(URI theURL)
-  {
-    this(theURL,null);
-  }
-  
-  public WebURL(URI theURL, String rawQueryPart)
-  {
-    this.theURL = theURL;
-    this.rawQueryPart = rawQueryPart;
-  }
-  
-  public WebURL resolve(String raw)
-    throws URISyntaxException
-  {
-    URI rawURL = new URI(raw);
-    if (rawURL.isAbsolute())
-      return new WebURL(rawURL);
-    URI fixedURL = theURL;
-    if (theURL.getPath() == null || theURL.getPath().length() == 0)
-      fixedURL = new URI(theURL.getScheme(),null,theURL.getHost(),theURL.getPort(),"/",null,null);
-
-    if (raw.startsWith("?"))
-      return new WebURL(fixedURL.getScheme(),fixedURL.getHost(),fixedURL.getPort(),fixedURL.getPath(),rawURL.getRawQuery());
-    
-    return new WebURL(fixedURL.resolve(rawURL));
-  }
-  
-  public String getPath()
-  {
-    return theURL.getPath();
-  }
-  
-  public String getHost()
-  {
-    return theURL.getHost();
-  }
-  
-  public String getScheme()
-  {
-    return theURL.getScheme();
-  }
-  
-  public int getPort()
-  {
-    return theURL.getPort();
-  }
-  
-  public String getRawQuery()
-  {
-    if (rawQueryPart != null)
-      return rawQueryPart;
-    return theURL.getRawQuery();
-  }
-  
-  public String toASCIIString()
-  {
-    String rval = theURL.toASCIIString();
-    if (rval != null && rawQueryPart != null && rawQueryPart.length() > 0)
-      rval += "?" + rawQueryPart;
-    return rval;
-  }
-  
-  public String toString()
-  {
-    String rval = theURL.toString();
-    if (rval != null && rawQueryPart != null && rawQueryPart.length() > 0)
-      rval += "?" + rawQueryPart;
-    return rval;
-  }
-}
diff --git a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_en_US.properties b/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_en_US.properties
deleted file mode 100644
index 92eb793..0000000
--- a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_en_US.properties
+++ /dev/null
@@ -1,102 +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.
-
-RSSConnector.EmailAddressToContactColon=Email address to contact:
-RSSConnector.Email=Email
-RSSConnector.Robots=Robots
-RSSConnector.Bandwidth=Bandwidth
-RSSConnector.Proxy=Proxy
-RSSConnector.RobotsTxtUsageColon=Robots.txt usage:
-RSSConnector.DontLookAtRobotsTxt=Don't look at robots.txt
-RSSConnector.ObeyRobotsTxtForDataFetchesOnly=Obey robots.txt for data fetches only
-RSSConnector.ObeyRobotsTxtForAllFetches=Obey robots.txt for all fetches
-RSSConnector.MaxKBytesPerSecondPerServerColon=Max KBytes per second per server:
-RSSConnector.MaxConnectionsPerServerColon=Max connections per server:
-RSSConnector.MaxFetchesPerMinutePerServerColon=Max fetches per minute per server:
-RSSConnector.ThrottleGroupNameColon=Throttle group name:
-RSSConnector.ProxyHostColon=Proxy host:
-RSSConnector.ProxyPortColon=Proxy port:
-RSSConnector.ProxyAuthenticationDomainColon=Proxy authentication domain:
-RSSConnector.ProxyAuthenticationUserNameColon=Proxy authentication user name:
-RSSConnector.ProxyAuthenticationPasswordColon=Proxy authentication password:
-RSSConnector.ParametersColon=Parameters:
-RSSConnector.URLs=URLs
-RSSConnector.Canonicalization=Canonicalization
-RSSConnector.URLMappings=URL Mappings
-RSSConnector.TimeValues=Time Values
-RSSConnector.Security=Security
-RSSConnector.Metadata=Metadata
-RSSConnector.DechromedContent=Dechromed Content
-RSSConnector.NoAccessTokensSpecified=No access tokens specified
-RSSConnector.MetadataColon=Metadata:
-RSSConnector.NoMetadataSpecified=No metadata specified
-RSSConnector.NoAccessTokensPresent=No access tokens present
-RSSConnector.NeedAValidEmailAddress=Need a valid email address
-RSSConnector.EnterAValidNumberOrBlankForNoLimit=Enter a valid number, or blank for no limit
-RSSConnector.EnterAValidNumberForTheMaxNumberOfOpenConnectionsPerServer=Enter a valid number for the max number of open connections per server
-RSSConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=Email address required, to be included in all request headers
-RSSConnector.certificates= certificate(s)
-RSSConnector.MatchMustHaveARegexpValue=Match must have a regexp value
-RSSConnector.TypeInAnAccessToken=Type in an access token
-RSSConnector.TypeInMetadataName=Type in metadata name
-RSSConnector.TypeInMetadataValue=Type in metadata value
-RSSConnector.ATimeoutValueInSecondsIsRequired=A timeout value, in seconds, is required
-RSSConnector.ARefetchIntervalInMinutesIsRequired=A refetch interval, in minutes, is required
-RSSConnector.AMinimumRefetchIntervalInMinutesIsRequire=A minimum refetch interval, in minutes, is required
-RSSConnector.ABadFeedRefetchIntervalInMinutesIsRequired=A bad feed refetch interval, in minutes, is required
-RSSConnector.URLRegularExpression=URL regular expression
-RSSConnector.Description=Description
-RSSConnector.Reorder=Reorder?
-RSSConnector.RemoveJSPSessions=Remove JSP sessions?
-RSSConnector.RemoveASPSessions=Remove ASP sessions?
-RSSConnector.RemovePHPSessions=Remove PHP sessions?
-RSSConnector.RemoveBVSessions=Remove BV sessions?
-RSSConnector.DeleteUrlRegexp=Delete url regexp
-RSSConnector.NoCanonicalizationSpecified=No canonicalization specified - all URLs will be reordered and have all sessions removed
-RSSConnector.AddUlRegexp=Add url regexp
-RSSConnector.RemoveRegexp=Remove regexp #
-RSSConnector.AddRegexp=Add regexp
-RSSConnector.FeedConnectTimeout=Feed connect timeout (seconds):
-RSSConnector.DefaultFeedRefetchTime=Default feed refetch time (minutes)
-RSSConnector.MinimumFeedRefetchTime=Minimum feed refetch time (minutes)
-RSSConnector.BadFeedRefetchTime=Bad feed refetch time (minutes)
-RSSConnector.NoDechromedContent=No dechromed content
-RSSConnector.DechromedContentIfPresentInDescriptionField=Dechromed content, if present, in 'description' field
-RSSConnector.DechromedContentIfPresentInContentField=Dechromed content, if present, in 'content' field
-RSSConnector.UseChromedContentIfNoDechromedContentFound=Use chromed content if no dechromed content found
-RSSConnector.NeverUseChromedContent=Skip documents if dechromed content unavailable
-RSSConnector.NoContentMetadataOnly=Include only metadata if dechromed content unavailable
-RSSConnector.DeleteToken=Delete token #
-RSSConnector.AddAccessToken=Add access token
-RSSConnector.DeleteMetadata=Delete metadata #
-RSSConnector.NoMetadataPresent=No metadata present
-RSSConnector.AddMetadata=Add metadata
-RSSConnector.RSSUrls=RSS urls:
-RSSConnector.NoRSSUrlsSpecified=No RSS urls specified
-RSSConnector.URLCanonicalization=URL canonicalization:
-RSSConnector.URLRegexp=URL regexp
-RSSConnector.URLMappingsColon=URL mappings:
-RSSConnector.NoMappingsSpecifiedWillAcceptAllUrls=No mappings specified; will accept all urls
-RSSConnector.FeedConnectionTimeout=Feed connection timeout (seconds):
-RSSConnector.DefaultFeedRescanInterval=Default feed rescan interval (minutes):
-RSSConnector.MinimumFeedRescanInterval=Minimum feed rescan interval (minutes):
-RSSConnector.BadFeedRescanInterval=Bad feed rescan interval (minutes):
-RSSConnector.DechromedContentSource=Dechromed content source:
-RSSConnector.ChromedContent=Chromed content:
-RSSConnector.AccessTokens=Access tokens:
-RSSConnector.Exclusions=Exclusions
-RSSConnector.Exclude=Exclude:
-RSSConnector.Remove=Remove
-RSSConnector.Add=Add
diff --git a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_es_ES.properties b/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_es_ES.properties
deleted file mode 100644
index 9b42e04..0000000
--- a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_es_ES.properties
+++ /dev/null
@@ -1,102 +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.
-
-RSSConnector.EmailAddressToContactColon=Dirección de correo electrónico para ponerse en contacto:
-RSSConnector.Email=Email
-RSSConnector.Robots=Robots
-RSSConnector.Bandwidth=Ancho de banda
-RSSConnector.Proxy=Poder
-RSSConnector.RobotsTxtUsageColon=Robots.txt uso:
-RSSConnector.DontLookAtRobotsTxt=No mires a los robots.txt
-RSSConnector.ObeyRobotsTxtForDataFetchesOnly=Obedecer robots.txt para los datos sólo se obtiene
-RSSConnector.ObeyRobotsTxtForAllFetches=Obedecer robots.txt para todas las traídas
-RSSConnector.MaxKBytesPerSecondPerServerColon=Max KBytes por segundo por servidor:
-RSSConnector.MaxConnectionsPerServerColon=Conexiones Max por servidor:
-RSSConnector.MaxFetchesPerMinutePerServerColon=Max obtiene por minuto por servidor:
-RSSConnector.ThrottleGroupNameColon=Grupo del acelerador:
-RSSConnector.ProxyHostColon=host por poderes:
-RSSConnector.ProxyPortColon=Puerto por poderes:
-RSSConnector.ProxyAuthenticationDomainColon=Dominio por poderes de autenticación:
-RSSConnector.ProxyAuthenticationUserNameColon=Nombre de usuario por poderes de autenticación:
-RSSConnector.ProxyAuthenticationPasswordColon=Contraseña por poderes de autenticación:
-RSSConnector.ParametersColon=Parámetros:
-RSSConnector.URLs=URLs
-RSSConnector.Canonicalization=canonicalización
-RSSConnector.URLMappings=URL Trazar un mapa
-RSSConnector.TimeValues=Valores de Tiempo
-RSSConnector.Security=Seguridad
-RSSConnector.Metadata=Metadatos
-RSSConnector.DechromedContent=contenido Dechromed
-RSSConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-RSSConnector.MetadataColon=Metadatos:
-RSSConnector.NoMetadataSpecified=Sin metadatos especificada
-RSSConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-RSSConnector.NeedAValidEmailAddress=Necesitas una dirección de correo electrónico válida
-RSSConnector.EnterAValidNumberOrBlankForNoLimit=Introduzca un número válido, o en blanco para ningún límite
-RSSConnector.EnterAValidNumberForTheMaxNumberOfOpenConnectionsPerServer=Introduzca un número válido para el número máximo de conexiones abiertas por servidor
-RSSConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=Dirección de correo electrónico necesario, que se incluirá en todos los encabezados de solicitud
-RSSConnector.certificates= certificados
-RSSConnector.MatchMustHaveARegexpValue=Partido debe tener un valor de expresiones regulares
-RSSConnector.TypeInAnAccessToken=Escriba un token de acceso
-RSSConnector.TypeInMetadataName=Escriba el nombre de metadatos
-RSSConnector.TypeInMetadataValue=Tipo de valor metadatos
-RSSConnector.ATimeoutValueInSecondsIsRequired=Un valor de tiempo de espera, en segundos, es requerido
-RSSConnector.ARefetchIntervalInMinutesIsRequired=Un intervalo de nueva traída, en minutos, es requerido
-RSSConnector.AMinimumRefetchIntervalInMinutesIsRequire=Un intervalo de nueva traída mínimo, en minutos, es requerido
-RSSConnector.ABadFeedRefetchIntervalInMinutesIsRequired=Un intervalo de nueva traída de mala alimentación, en minutos, es requerido
-RSSConnector.URLRegularExpression=URL expresión regular
-RSSConnector.Description=Descripción
-RSSConnector.Reorder=reordenar?
-RSSConnector.RemoveJSPSessions=Retire sesiones JSP?
-RSSConnector.RemoveASPSessions=Retire sesiones ASP?
-RSSConnector.RemovePHPSessions=Retire las sesiones de PHP?
-RSSConnector.RemoveBVSessions=Retire sesiones BV?
-RSSConnector.DeleteUrlRegexp=Eliminar regexp url
-RSSConnector.NoCanonicalizationSpecified=No canonicalización especificada - todas las direcciones URL se reordenan y se han eliminado todas las sesiones
-RSSConnector.AddUlRegexp=Añadir regexp url
-RSSConnector.RemoveRegexp=Retire regexp #
-RSSConnector.AddRegexp=Añadir regexp
-RSSConnector.FeedConnectTimeout=Alimente tiempo de espera de conexión (segundos):
-RSSConnector.DefaultFeedRefetchTime=Por defecto el tiempo de nueva traída de alimentación (minutos)
-RSSConnector.MinimumFeedRefetchTime=Alimentación tiempo mínimo de nueva traída (minutos)
-RSSConnector.BadFeedRefetchTime=Mala alimentación tiempo de nueva traída (minutos)
-RSSConnector.NoDechromedContent=Ningún contenido de dechromed
-RSSConnector.DechromedContentIfPresentInDescriptionField=Contenido decromado, si está presente, en el campo ' Descripción '
-RSSConnector.DechromedContentIfPresentInContentField=Contenido decromado, si está presente, en el campo "contenido"
-RSSConnector.UseChromedContentIfNoDechromedContentFound=Use el contenido cromado si ningún contenido de decromado se encontrara
-RSSConnector.NeverUseChromedContent=Omita documentos si el contenido de decromado no es disponible
-RSSConnector.NoContentMetadataOnly=Incluya solamente metadatos si decromado contenido es disponible
-RSSConnector.DeleteToken=eliminar token #
-RSSConnector.AddAccessToken=Añadir token de acceso
-RSSConnector.DeleteMetadata=eliminar metadatos #
-RSSConnector.NoMetadataPresent=Sin metadatos presente
-RSSConnector.AddMetadata=Añadir metadatos
-RSSConnector.RSSUrls=RSS urls:
-RSSConnector.NoRSSUrlsSpecified=No hay urls RSS especificados
-RSSConnector.URLCanonicalization=canonicalización URL:
-RSSConnector.URLRegexp=URL regexp
-RSSConnector.URLMappingsColon=URL trazar un mapa:
-RSSConnector.NoMappingsSpecifiedWillAcceptAllUrls=Ningún trazar un mapa de especificado;aceptará todas las urls
-RSSConnector.FeedConnectionTimeout=La conexión de alimentación de tiempo de espera (segundos):
-RSSConnector.DefaultFeedRescanInterval=Alimentación predeterminado intervalo nueva búsqueda (minutos):
-RSSConnector.MinimumFeedRescanInterval=Alimentación mínimo intervalo nueva búsqueda (minutos):
-RSSConnector.BadFeedRescanInterval=Mala alimentación intervalo nueva búsqueda (minutos):
-RSSConnector.DechromedContentSource=Fuente de contenido decromado:
-RSSConnector.ChromedContent=contenido cromado:
-RSSConnector.AccessTokens=tokens de acceso:
-RSSConnector.Exclusions=Exclusiones
-RSSConnector.Exclude=Exclude:
-RSSConnector.Remove=Eliminar
-RSSConnector.Add=Añadir
diff --git a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_ja_JP.properties b/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_ja_JP.properties
deleted file mode 100644
index 8398915..0000000
--- a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_ja_JP.properties
+++ /dev/null
@@ -1,103 +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.
-
-RSSConnector.EmailAddressToContactColon=メールアドレス:
-RSSConnector.Email=メール
-RSSConnector.Robots=ロボット
-RSSConnector.Bandwidth=バンド幅
-RSSConnector.Proxy=プロキシ
-RSSConnector.RobotsTxtUsageColon=Robots.txt:
-RSSConnector.DontLookAtRobotsTxt=robots.txtを利用しない
-RSSConnector.ObeyRobotsTxtForDataFetchesOnly=データ取得の場合のみにrobots.txtに従う
-RSSConnector.ObeyRobotsTxtForAllFetches=すべてrobots.txtに従う
-RSSConnector.MaxKBytesPerSecondPerServerColon=(最大KBytes/秒)/サーバ:
-RSSConnector.MaxConnectionsPerServerColon=最大コネクション/サーバ:
-RSSConnector.MaxFetchesPerMinutePerServerColon=(最大フェッチ/分)/サーバ:
-RSSConnector.ThrottleGroupNameColon=スロットルグループ名:
-RSSConnector.ProxyHostColon=プロキシホスト:
-RSSConnector.ProxyPortColon=プロキシポート:
-RSSConnector.ProxyAuthenticationDomainColon=プロキシ認証ドメイン:
-RSSConnector.ProxyAuthenticationUserNameColon=プロキシ認証ユーザ名:
-RSSConnector.ProxyAuthenticationPasswordColon=プロキシ認証パスワード:
-RSSConnector.ParametersColon=引数:
-RSSConnector.URLs=URLs
-RSSConnector.Canonicalization=正規表現
-RSSConnector.URLMappings=URLマップ
-RSSConnector.TimeValues=時間
-RSSConnector.Security=セキュリティ
-RSSConnector.Metadata=メタデータ
-RSSConnector.DechromedContent=デクロムコンテンツ
-RSSConnector.NoAccessTokensSpecified=アクセストークンを指定してください
-RSSConnector.MetadataColon=メタデータ:
-RSSConnector.NoMetadataSpecified=メタデータを指定してください
-RSSConnector.NoAccessTokensPresent=アクセストークンが存在しません
-RSSConnector.NeedAValidEmailAddress=正しいメールアドレスを入力してください
-RSSConnector.EnterAValidNumberOrBlankForNoLimit=数字を入力してください。無限の場合は空白にしてください
-RSSConnector.EnterAValidNumberForTheMaxNumberOfOpenConnectionsPerServer=サーバ毎の最大に開けるコネクション数を入力してください
-RSSConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=メールアドレスを入力してください。すべてのリクエストヘッダに含まれます
-RSSConnector.certificates= certificate(s)
-RSSConnector.MatchMustHaveARegexpValue=パターンは正規表現を入力してください
-RSSConnector.TypeInAnAccessToken=アクセストークンを入力してください
-RSSConnector.TypeInMetadataName=メタデータ名を入力してください
-RSSConnector.TypeInMetadataValue=メタデータ値を入力してください
-RSSConnector.ATimeoutValueInSecondsIsRequired=タイムアウト(秒)を入力してください
-RSSConnector.ARefetchIntervalInMinutesIsRequired=再収集間隔(分)を入力してください
-RSSConnector.AMinimumRefetchIntervalInMinutesIsRequire=最小再収集間隔(分)を入力してください
-RSSConnector.ABadFeedRefetchIntervalInMinutesIsRequired=フィードの再収集間隔(分)が不正です
-RSSConnector.URLRegularExpression=URI正規表現
-RSSConnector.Description=説明
-RSSConnector.Reorder=ソート
-RSSConnector.RemoveJSPSessions=JSPセッションを削除
-RSSConnector.RemoveASPSessions=ASPセッションを削除
-RSSConnector.RemovePHPSessions=PHPセッションを削除
-RSSConnector.RemoveBVSessions=BVセッションを削除
-RSSConnector.DeleteUrlRegexp=URI正規表現を削除
-RSSConnector.NoCanonicalizationSpecified=正規化が指定されていません。すべてのURIをソートしてすべてのセッションを削除します
-RSSConnector.AddUlRegexp=URI正規表現を追加
-RSSConnector.RemoveRegexp=正規表現を削除: #
-RSSConnector.AddRegexp=正規表現を追加
-RSSConnector.FeedConnectTimeout=フィード接続タイムアウト(秒):
-RSSConnector.DefaultFeedRefetchTime=デフォルト再収集間隔(分):
-RSSConnector.MinimumFeedRefetchTime=最小再収集間隔(分):
-RSSConnector.BadFeedRefetchTime=不正な再収集間隔(分):
-RSSConnector.NoDechromedContent=デクロムコンテンツがない
-RSSConnector.DechromedContentIfPresentInDescriptionField=デクロムコンテンツが項目「description」にある場合
-RSSConnector.DechromedContentIfPresentInContentField=デクロムコンテンツが項目「content」にある場合
-RSSConnector.UseChromedContentIfNoDechromedContentFound=デクロムコンテンツが見つからない場合はクロムコンテンツを使う
-#RSSConnector.NeverUseChromedContent=クロムコンテンツは使わない
-RSSConnector.NeverUseChromedContent=デクロムコンテンツが得られない場合はドキュメントをスキップする
-RSSConnector.NoContentMetadataOnly=デクロムコンテンツが得られない場合はメタデータのみを含める
-RSSConnector.DeleteToken=トークンを削除: #
-RSSConnector.AddAccessToken=アクセストークンを追加
-RSSConnector.DeleteMetadata=メタデータを削除: #
-RSSConnector.NoMetadataPresent=メタデータがありません
-RSSConnector.AddMetadata=メタデータを追加
-RSSConnector.RSSUrls=RSS URL:
-RSSConnector.NoRSSUrlsSpecified=RSS URLが指定されていません
-RSSConnector.URLCanonicalization=URL正規化:
-RSSConnector.URLRegexp=URL正規表現
-RSSConnector.URLMappingsColon=URLマップ:
-RSSConnector.NoMappingsSpecifiedWillAcceptAllUrls=マップが指定されていません。すべてのURLを収集します
-RSSConnector.FeedConnectionTimeout=フィード接続タイムアウト(秒):
-RSSConnector.DefaultFeedRescanInterval=デフォルト再収集間隔(分):
-RSSConnector.MinimumFeedRescanInterval=最小再収集間隔(分):
-RSSConnector.BadFeedRescanInterval=不正な再収集間隔(分):
-RSSConnector.DechromedContentSource=デクロムコンテンツソース:
-RSSConnector.ChromedContent=クロムコンテンツ:
-RSSConnector.AccessTokens=アクセストークン:
-RSSConnector.Exclusions=除外
-RSSConnector.Exclude=除外:
-RSSConnector.Remove=削除
-RSSConnector.Add=追加
diff --git a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_zh_CN.properties b/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_zh_CN.properties
deleted file mode 100644
index 997dece..0000000
--- a/connectors/rss/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/rss/common_zh_CN.properties
+++ /dev/null
@@ -1,103 +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.
-
-RSSConnector.EmailAddressToContactColon=邮箱联系地址: 
-RSSConnector.Email=电子邮件
-RSSConnector.Robots=机器人
-RSSConnector.Bandwidth=带宽
-RSSConnector.Proxy=代理
-RSSConnector.RobotsTxtUsageColon=使用Robots.txt: 
-RSSConnector.DontLookAtRobotsTxt=不使用robots.txt
-RSSConnector.ObeyRobotsTxtForDataFetchesOnly=只在提取数据时服从robots.txt
-RSSConnector.ObeyRobotsTxtForAllFetches=每次提取均服从robots.txt
-RSSConnector.MaxKBytesPerSecondPerServerColon=(最大Kbytes/秒)/服务器: 
-RSSConnector.MaxConnectionsPerServerColon=最大连接数/服务器: 
-RSSConnector.MaxFetchesPerMinutePerServerColon=(最大提取数/分)/服务器: 
-RSSConnector.ThrottleGroupNameColon=限流器组名: 
-RSSConnector.ProxyHostColon=代理主机: 
-RSSConnector.ProxyPortColon=代理端口: 
-RSSConnector.ProxyAuthenticationDomainColon=代理认证域: 
-RSSConnector.ProxyAuthenticationUserNameColon=代理认证用户名: 
-RSSConnector.ProxyAuthenticationPasswordColon=代理认证密码: 
-RSSConnector.ParametersColon=参数: 
-RSSConnector.URLs=URLs
-RSSConnector.Canonicalization=规范化
-RSSConnector.URLMappings=URL映射
-RSSConnector.TimeValues=时间
-RSSConnector.Security=安全
-RSSConnector.Metadata=元数据
-RSSConnector.DechromedContent=脱鉻内容
-RSSConnector.NoAccessTokensSpecified=请指定访问令牌
-RSSConnector.MetadataColon=元数据: 
-RSSConnector.NoMetadataSpecified=请指定元数据
-RSSConnector.NoAccessTokensPresent=访问令牌不存在
-RSSConnector.NeedAValidEmailAddress=请输入有效的邮箱地址
-RSSConnector.EnterAValidNumberOrBlankForNoLimit=请输入有效的数字或置空(表示无限)
-RSSConnector.EnterAValidNumberForTheMaxNumberOfOpenConnectionsPerServer=请输入有效的数字指定每台服务器可打开的最大连接数
-RSSConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=请输入邮箱地址。它将包含在所有请求头中
-RSSConnector.certificates= 证书
-RSSConnector.MatchMustHaveARegexpValue=匹配必须为正则表达式
-RSSConnector.TypeInAnAccessToken=请输入访问令牌
-RSSConnector.TypeInMetadataName=请输入元数据名
-RSSConnector.TypeInMetadataValue=请输入元数据值
-RSSConnector.ATimeoutValueInSecondsIsRequired=请输入超时(秒)
-RSSConnector.ARefetchIntervalInMinutesIsRequired=请输入重新提取间隔(分)
-RSSConnector.AMinimumRefetchIntervalInMinutesIsRequire=请输入重新提取最小间隔(分)
-RSSConnector.ABadFeedRefetchIntervalInMinutesIsRequired=馈送重新提取间隔(分)无效
-RSSConnector.URLRegularExpression=URI正则表达式
-RSSConnector.Description=説明
-RSSConnector.Reorder=重排
-RSSConnector.RemoveJSPSessions=删除JSP会话
-RSSConnector.RemoveASPSessions=删除ASP会话
-RSSConnector.RemovePHPSessions=删除PHP会话
-RSSConnector.RemoveBVSessions=删除BV会话
-RSSConnector.DeleteUrlRegexp=删除URI正则表达式
-RSSConnector.NoCanonicalizationSpecified=规范化未指定。将排序所有URI并删除所有会话
-RSSConnector.AddUlRegexp=添加URI正则表达式
-RSSConnector.RemoveRegexp=删除正则表达式:  #
-RSSConnector.AddRegexp=添加正则表达式
-RSSConnector.FeedConnectTimeout=馈送连接超时(秒): 
-RSSConnector.DefaultFeedRefetchTime=馈送重新提取缺省间隔(分): 
-RSSConnector.MinimumFeedRefetchTime=馈送重新提取最小间隔(分): 
-RSSConnector.BadFeedRefetchTime=无效的馈送重新提取间隔(分): 
-RSSConnector.NoDechromedContent=脱鉻内容不存在
-RSSConnector.DechromedContentIfPresentInDescriptionField=当脱鉻内容存在于Description字段时
-RSSConnector.DechromedContentIfPresentInContentField=当脱鉻内容存在于Content字段时
-RSSConnector.UseChromedContentIfNoDechromedContentFound=当未发现脱鉻内容时使用镀鉻内容
-#RSSConnector.NeverUseChromedContent=不使用镀鉻内容
-RSSConnector.NeverUseChromedContent=当无法获取脱鉻内容时跳过文档
-RSSConnector.NoContentMetadataOnly=当无法获取脱鉻内容时只包含元数据
-RSSConnector.DeleteToken=删除令牌:  #
-RSSConnector.AddAccessToken=添加访问令牌
-RSSConnector.DeleteMetadata=删除元数据:  #
-RSSConnector.NoMetadataPresent=元数据不存在
-RSSConnector.AddMetadata=添加元数据
-RSSConnector.RSSUrls=RSS URL: 
-RSSConnector.NoRSSUrlsSpecified=RSS URL未指定
-RSSConnector.URLCanonicalization=URL规范化: 
-RSSConnector.URLRegexp=URL正则表达式
-RSSConnector.URLMappingsColon=URL映射: 
-RSSConnector.NoMappingsSpecifiedWillAcceptAllUrls=映射未指定。搜集所有URL
-RSSConnector.FeedConnectionTimeout=馈送连接超时(秒): 
-RSSConnector.DefaultFeedRescanInterval=重新馈送缺省间隔(分): 
-RSSConnector.MinimumFeedRescanInterval=重新馈送最小间隔(分): 
-RSSConnector.BadFeedRescanInterval=无效重新馈送间隔(分): 
-RSSConnector.DechromedContentSource=脱鉻内容源: 
-RSSConnector.ChromedContent=镀鉻内容: 
-RSSConnector.AccessTokens=访问令牌: 
-RSSConnector.Exclusions=排除
-RSSConnector.Exclude=排除: 
-RSSConnector.Remove=删除
-RSSConnector.Add=添加
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITHSQLDB.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITHSQLDB.java
deleted file mode 100644
index 3ac1cf5..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  public BaseITHSQLDB()
-  {
-    super();
-  }
-  
-  public BaseITHSQLDB(boolean singleWar)
-  {
-    super(singleWar);
-  }
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.rss.RSSConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITMySQL.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITMySQL.java
deleted file mode 100644
index e79d7b8..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITMySQL.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITMySQL extends org.apache.manifoldcf.crawler.tests.BaseITMySQL
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.rss.RSSConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITPostgresql.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITPostgresql.java
deleted file mode 100644
index 2c50b9d..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseITPostgresql.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITPostgresql extends org.apache.manifoldcf.crawler.tests.BaseITPostgresql
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"File Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.rss.RSSConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseUIHSQLDB.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 8ebd855..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"RSS Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.rss.RSSConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlHSQLDBLT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlHSQLDBLT.java
deleted file mode 100644
index 3642ca3..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlHSQLDBLT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlHSQLDBLT extends BaseITHSQLDB
-{
-
-  protected BigCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public BigCrawlHSQLDBLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlMySQLLT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlMySQLLT.java
deleted file mode 100644
index 28f4f3c..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlMySQLLT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlMySQLLT extends BaseITMySQL
-{
-
-  protected BigCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public BigCrawlMySQLLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlPostgresqlLT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlPostgresqlLT.java
deleted file mode 100644
index 744569c..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlPostgresqlLT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlPostgresqlLT extends BaseITPostgresql
-{
-
-  protected BigCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public BigCrawlPostgresqlLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlTester.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlTester.java
deleted file mode 100644
index 3d53b96..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/BigCrawlTester.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.connectors.rss.RSSConfig;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a 100000-document crawl */
-public class BigCrawlTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public BigCrawlTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("RSS Connection");
-    conn.setDescription("RSS Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.rss.RSSConnector");
-    conn.setMaxConnections(100);
-    ConfigParams cp = conn.getConfigParams();
-    cp.setParameter(RSSConfig.PARAMETER_EMAIL,"somebody@somewhere.com");
-    cp.setParameter(RSSConfig.PARAMETER_MAXOPEN,"100");
-    cp.setParameter(RSSConfig.PARAMETER_MAXFETCHES,"1000000");
-    cp.setParameter(RSSConfig.PARAMETER_BANDWIDTH,"1000000");
-    cp.setParameter(RSSConfig.PARAMETER_ROBOTSUSAGE,"none");
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("RSS Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    // For 100000 documents, set up 10000 seeds
-    for (int i = 0 ; i < 10000 ; i++)
-    {
-      SpecificationNode sn = new SpecificationNode("feed");
-      sn.setAttribute("url","http://localhost:8189/rss/gen.php?type=feed&feed="+i);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it completes.
-    long startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),44000000L);
-    System.err.println("Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 110000)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 110000, saw "+new Long(status.getDocumentsProcessed()).toString());
-      
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),18000000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/FlakyHSQLDBInstance.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/FlakyHSQLDBInstance.java
deleted file mode 100644
index 0f12d07..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/FlakyHSQLDBInstance.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-import java.util.concurrent.atomic.*;
-
-/** This is a very basic sanity check */
-public class FlakyHSQLDBInstance extends org.apache.manifoldcf.core.database.DBInterfaceHSQLDB
-{
-
-  protected final static AtomicBoolean lostConnection = new AtomicBoolean(false);
-  
-  public FlakyHSQLDBInstance(IThreadContext tc, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    super(tc,databaseName,userName,password);
-  }
-
-  /*
-  public FlakyHSQLDBInstance(IThreadContext tc, String databaseName)
-    throws ManifoldCFException
-  {
-    super(tc,databaseName);
-  }
-  */
-  
-  @Override
-  protected IResultSet execute(Connection connection, String query, List params, boolean bResults, int maxResults,
-    ResultSpecification spec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    if (!lostConnection.get())
-      return super.execute(connection,query,params,bResults,maxResults,spec,returnLimit);
-    // Simulate a dead connection by throwing a database error
-    try
-    {
-      // Sleep, to limit log noise.
-      Thread.sleep(1000L);
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-    
-    throw new ManifoldCFException("Database error", new Exception("Manufactured db error"), ManifoldCFException.DATABASE_CONNECTION_ERROR);
-  }
-
-  public static void setConnectionWorking(boolean value)
-  {
-    lostConnection.set(!value);
-  }
-  
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/MockRSSService.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/MockRSSService.java
deleted file mode 100644
index ff658ad..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/MockRSSService.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.*;
-import java.util.*;
-
-/** Mock wiki service */
-public class MockRSSService
-{
-  Server server;
-  RSSServlet servlet;
-    
-  public MockRSSService(int docsPerFeed)
-  {
-    server = new Server(new QueuedThreadPool(35));
-    ServerConnector connector = new ServerConnector(server);
-    connector.setPort(8189);
-    server.addConnector(connector);
-    servlet = new RSSServlet(docsPerFeed);
-    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    context.setContextPath("/rss");
-    server.setHandler(context);
-    context.addServlet(new ServletHolder(servlet), "/gen.php");
-  }
-    
-  public void start() throws Exception
-  {
-    server.start();
-  }
-    
-  public void stop() throws Exception
-  {
-    server.stop();
-  }
-
-  
-  public static class RSSServlet extends HttpServlet
-  {
-    int docsPerFeed;
-    
-    public RSSServlet(int docsPerFeed)
-    {
-      this.docsPerFeed = docsPerFeed;
-    }
-    
-    @Override
-    public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException
-    {
-      String resourceName = null;
-      
-      String type = req.getParameter("type");
-      String feednum = req.getParameter("feed");
-      if (feednum == null)
-        throw new IOException("Feed number parameter must be set");
-      int theFeed;
-      try
-      {
-        theFeed = Integer.parseInt(feednum);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new IOException("Feed number must be a number: "+feednum);
-      }
-      // Now that we parsed it, we don't actually need it (yet)
-      
-      if (type != null && type.equals("feed"))
-      {
-        // Generate feed response
-        res.setStatus(HttpServletResponse.SC_OK);
-        // Randomly choose a different encoding, to make life interesting for the parser
-        if ((theFeed % 3) == 0)
-        {
-          res.setContentType("text/xml; charset=utf-8");
-          res.getWriter().printf(Locale.ROOT, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-        }
-        else if ((theFeed % 3) ==1)
-        {
-          res.setContentType("text/xml");
-          res.setCharacterEncoding("UTF-16BE");
-          // Write BOM + preamble
-          res.getWriter().printf(Locale.ROOT, "\uFEFF<?xml version=\"1.0\" encoding=\"UTF-16BE\"?>\n");
-        }
-        else
-        {
-          res.setContentType("text/xml");
-          res.setCharacterEncoding("UTF-16LE");
-          // Write BOM + preamble
-          res.getWriter().printf(Locale.ROOT, "\uFEFF<?xml version=\"1.0\" encoding=\"UTF-16LE\"?>\n");
-        }
-        // Write out an rss 2.0 response, with docsperfeed docs
-        res.getWriter().printf(Locale.ROOT, "<rss>\n");
-        res.getWriter().printf(Locale.ROOT, "  <channel>\n");
-        for (int i = 0 ; i < docsPerFeed ; i++)
-        {
-          res.getWriter().printf(Locale.ROOT, "    <item>\n");
-          // Test CDATA feeds
-          if ((i % 2) == 0)
-            res.getWriter().printf(Locale.ROOT, "      <link>http://localhost:8189/rss/gen.php?type=doc&#38;feed="+theFeed+"&#38;doc="+i+"</link>\n");
-          else
-            res.getWriter().printf(Locale.ROOT, "      <link><![CDATA[http://localhost:8189/rss/gen.php?type=doc&feed="+theFeed+"&doc="+i+"]]></link>\n");
-          res.getWriter().printf(Locale.ROOT, "      <title>Feed "+theFeed+" Document "+i+"</title>\n");
-          res.getWriter().printf(Locale.ROOT, "    </item>\n");
-        }
-        res.getWriter().printf(Locale.ROOT, "  </channel>\n");
-        res.getWriter().printf(Locale.ROOT, "</rss>\n");
-        res.getWriter().flush();
-      }
-      else if (type != null && type.equals("doc"))
-      {
-        String docnum = req.getParameter("doc");
-        if (docnum == null)
-          throw new IOException("Doc number parameter must be set");
-        int theDoc;
-        try
-        {
-          theDoc = Integer.parseInt(docnum);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new IOException("Doc number must be a number: "+docnum);
-        }
-        
-        // Generate doc response
-        res.setStatus(HttpServletResponse.SC_OK);
-        res.setContentType("text/plain; charset=utf-8");
-        res.getWriter().printf(Locale.ROOT, "This is feed number "+theFeed+" and document number "+theDoc+"\n");
-        res.getWriter().flush();
-      }
-      else
-        throw new IOException("Illegal type parameter: "+type);
-      
-    }
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/NavigationHSQLDBUI.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 6520139..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","Null Output Connection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","RSS Repository Connection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.rss.RSSConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Visit the rest of the tabs - Email first
-    testerInstance.clickTab("Email");
-    testerInstance.setValue("email","kishore@apache.org");
-
-    // Robots
-    testerInstance.clickTab("Robots");
-    testerInstance.selectValue("robotsusage","none");
-
-    // Bandwidth
-    testerInstance.clickTab("Bandwidth");
-
-    // Proxy
-    testerInstance.clickTab("Proxy");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","RSS Job");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","Null Output Connection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","RSS Repository Connection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    //URLs tab
-    testerInstance.clickTab("URLs");
-    testerInstance.setValue("s0_rssurls","https://www.cnn.com");
-
-    // Canonicalization tab
-    testerInstance.clickTab("Canonicalization");
-    testerInstance.clickButton("Add",true);
-
-    // URL Mappings tab
-    testerInstance.clickTab("URL Mappings");
-    //Time values tab
-    testerInstance.clickTab("Time Values");
-    //Security tab
-    testerInstance.clickTab("Security");
-    // Dechromed Content tab
-    testerInstance.clickTab("Dechromed Content");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-    System.out.println("JobId: " + jobID);
-    
-    /* Can't do this because we wind up crawling CNN and that's not allowed for a test like this.
-    
-    //Start the job
-    testerInstance.performJobActionEN(jobID,"Start minimal");
-    testerInstance.waitForJobStatusEN(jobID,"Done",120);
-    */
-    
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete RSS Repository Connection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete Null Output Connection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSFlakyHSQLDBIT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSFlakyHSQLDBIT.java
deleted file mode 100644
index dcf00e4..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSFlakyHSQLDBIT.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class RSSFlakyHSQLDBIT extends BaseITHSQLDB
-{
-  protected RSSSimpleCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public RSSFlakyHSQLDBIT()
-  {
-    tester = new RSSSimpleCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void simpleCrawl()
-    throws Exception
-  {
-    tester.executeTest(new DBInterruptionNotification());
-  }
-  
-  /** Method to get database implementation class */
-  @Override
-  protected String getDatabaseImplementationClass()
-    throws Exception
-  {
-    return FlakyHSQLDBInstance.class.getName();
-  }
-
-  protected static class DBInterruptionNotification implements RSSSimpleCrawlTester.TestNotification
-  {
-    public void notifyMe()
-      throws Exception
-    {
-      // Wait 5 seconds, then turn of database access for 10 seconds.  Then, do it again.
-      Thread.sleep(5000L);
-      FlakyHSQLDBInstance.setConnectionWorking(false);
-      System.out.println("Database connectivity is OFF");
-      Thread.sleep(10000L);
-      FlakyHSQLDBInstance.setConnectionWorking(true);
-      System.out.println("Database connectivity restored");
-      Thread.sleep(5000L);
-      FlakyHSQLDBInstance.setConnectionWorking(false);
-      System.out.println("Database connectivity is OFF");
-      Thread.sleep(10000L);
-      FlakyHSQLDBInstance.setConnectionWorking(true);
-      System.out.println("Database connectivity restored");
-    }
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlCombinedHSQLDBIT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlCombinedHSQLDBIT.java
deleted file mode 100644
index 3a78444..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlCombinedHSQLDBIT.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class RSSSimpleCrawlCombinedHSQLDBIT extends BaseITHSQLDB
-{
-
-  protected RSSSimpleCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public RSSSimpleCrawlCombinedHSQLDBIT()
-  {
-    super(true);
-    tester = new RSSSimpleCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void simpleCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlHSQLDBIT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlHSQLDBIT.java
deleted file mode 100644
index ad30525..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlHSQLDBIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class RSSSimpleCrawlHSQLDBIT extends BaseITHSQLDB
-{
-
-  protected RSSSimpleCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public RSSSimpleCrawlHSQLDBIT()
-  {
-    tester = new RSSSimpleCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void simpleCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlMySQLIT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlMySQLIT.java
deleted file mode 100644
index 8c962fe..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlMySQLIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class RSSSimpleCrawlMySQLIT extends BaseITMySQL
-{
-
-  protected RSSSimpleCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public RSSSimpleCrawlMySQLIT()
-  {
-    tester = new RSSSimpleCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void simpleCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlPostgresqlIT.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlPostgresqlIT.java
deleted file mode 100644
index 75ff5b8..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlPostgresqlIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class RSSSimpleCrawlPostgresqlIT extends BaseITPostgresql
-{
-
-  protected RSSSimpleCrawlTester tester;
-  protected MockRSSService rssService = null;
-  
-  public RSSSimpleCrawlPostgresqlIT()
-  {
-    tester = new RSSSimpleCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createRSSService()
-    throws Exception
-  {
-    rssService = new MockRSSService(10);
-    rssService.start();
-  }
-  
-  @After
-  public void shutdownRSSService()
-    throws Exception
-  {
-    if (rssService != null)
-      rssService.stop();
-  }
-
-  @Test
-  public void simpleCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlTester.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlTester.java
deleted file mode 100644
index af206b4..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/RSSSimpleCrawlTester.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.connectors.rss.RSSConfig;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a small simple crawl */
-public class RSSSimpleCrawlTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public RSSSimpleCrawlTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    executeTest(null);
-  }
-  
-  public void executeTest(TestNotification tn)
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("RSS Connection");
-    conn.setDescription("RSS Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.rss.RSSConnector");
-    conn.setMaxConnections(100);
-    ConfigParams cp = conn.getConfigParams();
-    // Put some utf-8 into the config data somewhere; it's the only way we test non-ascii functionality at the moment
-    cp.setParameter(RSSConfig.PARAMETER_EMAIL,"somebody李敏慧@somewhere.com");
-    cp.setParameter(RSSConfig.PARAMETER_MAXOPEN,"100");
-    cp.setParameter(RSSConfig.PARAMETER_MAXFETCHES,"1000000");
-    cp.setParameter(RSSConfig.PARAMETER_BANDWIDTH,"1000000");
-    cp.setParameter(RSSConfig.PARAMETER_ROBOTSUSAGE,"none");
-    // Now, save
-    mgr.save(conn);
-    
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("RSS Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    // For 100 documents, set up 10 seeds
-    for (int i = 0 ; i < 10 ; i++)
-    {
-      SpecificationNode sn = new SpecificationNode("feed");
-      sn.setAttribute("url","http://localhost:8189/rss/gen.php?type=feed&feed="+i);
-      ds.addChild(ds.getChildCount(),sn);
-    }
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it completes.
-    long startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    // Wait 15 seconds, then do a notification
-    if (tn != null)
-    {
-      tn.notifyMe();
-    }
-    instance.waitJobInactiveNative(jobManager,job.getID(),600000L);
-    System.err.println("Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    // The test data area has 3 documents and one directory, and we have to count the root directory too.
-    if (status.getDocumentsProcessed() != 110)
-      throw new ManifoldCFException("Wrong number of documents processed - expected 110, saw "+new Long(status.getDocumentsProcessed()).toString());
-      
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),60000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-  public static interface TestNotification
-  {
-    public void notifyMe()
-      throws Exception;
-  }
-}
diff --git a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/URLTest.java b/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/URLTest.java
deleted file mode 100644
index 54466d3..0000000
--- a/connectors/rss/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/rss/tests/URLTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.rss.tests;
-
-import org.apache.manifoldcf.crawler.connectors.rss.WebURL;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class URLTest
-{
-
-  @Test
-  public void absolutePath()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com");
-    WebURL resolved = parent.resolve("http://bar.com");
-    assertEquals(resolved.toASCIIString(),"http://bar.com");
-  }
-
-  @Test
-  public void relativePath()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com/abc/def.html");
-    WebURL resolved = parent.resolve("/def/ghi.html");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/def/ghi.html");
-  }
-
-  @Test
-  public void noSlashDocument()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com");
-    WebURL resolved = parent.resolve("hello.pdf");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/hello.pdf");
-  }
-
-  @Test
-  public void relativeQuery()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com/abc/def/ghi.asmx?q=foo");
-    WebURL resolved = parent.resolve("?q=bar");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/abc/def/ghi.asmx?q=bar");
-  }
-
-  @Test
-  public void queryEscaping()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com/abc/def/ghi.asmx?q=foo%3Dbar");
-    WebURL resolved = parent.resolve("?q=bar%3Dfoo");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/abc/def/ghi.asmx?q=bar%3Dfoo");
-  }
-
-
-}
diff --git a/connectors/rss/pom.xml b/connectors/rss/pom.xml
deleted file mode 100644
index 16e8525..0000000
--- a/connectors/rss/pom.xml
+++ /dev/null
@@ -1,396 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-rss-connector</artifactId>
-  <name>ManifoldCF - Connectors - RSS</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-combined-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-            <combinedWarPath>../dependency/mcf-combined-service-${project.version}.war</combinedWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-combined-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
-
diff --git a/connectors/searchblox/.gitignore b/connectors/searchblox/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/searchblox/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/searchblox/build.xml b/connectors/searchblox/build.xml
deleted file mode 100644
index a198f7a..0000000
--- a/connectors/searchblox/build.xml
+++ /dev/null
@@ -1,57 +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.

--->

-

-<project name="searchblox" default="all">

-    <property environment="env"/>

-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">

-        <isset property="env.MCFDISTPATH"/>

-    </condition>

-    <property name="abs-dist" location="../../dist"/>

-    <condition property="mcf-dist" value="${abs-dist}">

-        <not>

-            <isset property="env.MCFDISTPATH"/>

-        </not>

-    </condition>

-

-    <import file="${mcf-dist}/connector-build.xml"/>

-

-    <path id="connector-classpath">

-        <path refid="mcf-connector-build.connector-classpath"/>

-        <fileset dir="../../lib">

-              <include name="jsoup*.jar" />

-              <include name="resteasy-*.jar" />

-        </fileset>

-    </path>

-

-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">

-        <mkdir dir="dist/lib"/>

-        <copy todir="dist/lib">

-            <fileset dir="../../lib">

-              <include name="jsoup*.jar" />

-              <include name="resteasy-*.jar" />

-            </fileset>

-        </copy>

-    </target>

-

-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">

-        <antcall target="general-add-output-connector">

-            <param name="connector-label" value="Searchblox"/>

-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.searchblox.SearchBloxConnector"/>

-        </antcall>

-    </target>

-

-</project>

diff --git a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/Messages.java b/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/Messages.java
deleted file mode 100644
index 36b9a35..0000000
--- a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/Messages.java
+++ /dev/null
@@ -1,144 +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 org.apache.manifoldcf.agents.output.searchblox;

-

-import java.util.Locale;

-import java.util.Map;

-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;

-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;

-

-/**

- * 

- * @author Rafa Haro <rharo@apache.org>

- *

- */

-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages

-{

-  public static final String DEFAULT_BUNDLE_NAME = "org.apache.manifoldcf.agents.output.searchblox.common";

-  public static final String DEFAULT_PATH_NAME = "org.apache.manifoldcf.crawler.connectors.searchblox";

-  

-  /** Constructor - do no instantiate

-  */

-  protected Messages()

-  {

-  }

-  

-  public static String getString(Locale locale, String messageKey)

-  {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey)

-  {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyString(Locale locale, String messageKey)

-  {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey)

-  {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey)

-  {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);

-  }

-

-  public static String getString(Locale locale, String messageKey, Object[] args)

-  {

-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-  

-  public static String getBodyString(Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);

-  }

-

-  // More general methods which allow bundlenames and class loaders to be specified.

-  

-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);

-  }

-  

-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)

-  {

-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);

-  }

-

-  // Resource output

-  

-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException

-  {

-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,

-      substitutionParameters,mapToUpperCase);

-  }

-  

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,String> substitutionParameters, boolean mapToUpperCase)

-    throws ManifoldCFException

-  {

-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,

-      substitutionParameters,mapToUpperCase);

-  }

-

-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,

-    Map<String,Object> contextObjects)

-    throws ManifoldCFException

-  {

-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,

-      contextObjects);

-  }

-  

-}

-

diff --git a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxClient.java b/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxClient.java
deleted file mode 100644
index 5f1381b..0000000
--- a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxClient.java
+++ /dev/null
@@ -1,262 +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 org.apache.manifoldcf.agents.output.searchblox;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Locale;
-import java.util.UUID;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation.Builder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
-
-import org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.IndexingFormat;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.xerces.parsers.DOMParser;
-import org.jboss.resteasy.plugins.providers.StringTextStar;
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-/**
- * SearchBox REST Client
- *
- * @author Rafa Haro <rharo@apache.org>
- */
-public class SearchBloxClient {
-
-  // TODO All this might need to be included in a configuration file
-  public static final String DEFAULT_ENDPOINT = "http://localhost:8080/searchblox/rest/v1/api";
-
-  private static final String ADD_PATH = "add";
-
-  private static final String DELETE_PATH = "delete";
-
-  private static final String STATUS_PATH = "status";
-
-  private static final String CREATE_PATH = "coladd";
-
-  private static final String CLEAR_PATH = "clear";
-
-  private static final String STATUS_NODE = "statuscode";
-  
-  private static final Pattern status_pattern = Pattern.compile("^status code\\s?:\\s([0-9]+)$");
-
-  public static enum ResponseCode {
-    DOCUMENT_INDEXED(100),
-    DOCUMENT_REJECTED(101),
-    DOCUMENT_DELETED(200, 2001),
-    DOCUMENT_NOT_EXIST(201, 2002),
-    DOCUMENT_NOT_FOUND(301),
-    COLLECTION_CLEARED(400),
-    ERROR_CLEARING_COLLECTION(401),
-    COLLECTION_CREATED(900),
-    INVALID_COLLECTION_NAME(500, 501),
-    INVALID_REQUEST(501),
-    INVALID_DOCUMENT_LOCATION(502),
-    NOT_CUSTOM_COLLECTION(503),
-    LIMIT_EXCEEDED(504),
-    INVALID_LICENSE_ID(601),
-    SERVER_UNREACHABLE(700);
-
-    private int code;
-    private int jsonCode;
-    
-    ResponseCode(int code) {
-      this.code = code;
-    }
-    
-    ResponseCode(int code, int jsonCode) {
-      this.code = code;
-      this.jsonCode = jsonCode;
-    }
-    
-    static ResponseCode getCodeFromValue(int value){
-        for(ResponseCode e:ResponseCode.values())
-            if(value == e.code)
-                return e;
-        return null;
-    }
-    
-    static ResponseCode getCodeFromValue(int value, boolean json){
-      for(ResponseCode e:ResponseCode.values())
-        if((json && value == e.jsonCode) || (value == e.code)) {
-          return e;
-        }
-      return null;
-    }
-    
-    int getCode(){
-      return code;
-    }
-    
-    int getJsonCode() {
-      return jsonCode;
-    }
-  }
-  
-
-  private String apikey;
-  private Client client;
-  private UriBuilder uriBuilder;
-
-  public SearchBloxClient(String apikey, ClientBuilder builder, String endpoint) {
-    this.apikey = apikey;
-    builder.register(StringTextStar.class);
-    this.client = builder.build();
-    if (endpoint != null && !endpoint.isEmpty()) {
-      uriBuilder = UriBuilder.fromUri(endpoint);
-    } else {
-      uriBuilder = UriBuilder.fromUri(DEFAULT_ENDPOINT);
-    }
-  }
-
-
-  public ResponseCode addUpdateDocument(SearchBloxDocument document, String format)
-      throws SearchBloxException {
-    return post(document, format, SearchBloxDocument.DocumentAction.ADD_UPDATE);
-  }
-
-  public ResponseCode deleteDocument(SearchBloxDocument document, String format)
-      throws SearchBloxException {
-    return post(document, format, SearchBloxDocument.DocumentAction.DELETE);
-  }
-
-  public ResponseCode createCollection(String colname, String format)
-      throws SearchBloxException {
-    SearchBloxDocument document = new SearchBloxDocument(apikey);
-    document.colName = colname;
-    return post(document, format, SearchBloxDocument.DocumentAction.CREATE);
-  }
-
-  public ResponseCode clearCollection(String colname, String format)
-      throws SearchBloxException {
-    SearchBloxDocument document = new SearchBloxDocument(apikey);
-    document.colName = colname;
-    return post(document, format, SearchBloxDocument.DocumentAction.CLEAR);
-  }
-
-  public boolean ping(String format)
-      throws SearchBloxException {
-    SearchBloxDocument document = new SearchBloxDocument(apikey);
-    document.colName = UUID.randomUUID().toString();
-    document.uid = UUID.randomUUID().toString();
-    ResponseCode result = post(document, format, SearchBloxDocument.DocumentAction.STATUS);
-    return result == ResponseCode.INVALID_COLLECTION_NAME;
-  }
-
-  private ResponseCode post(SearchBloxDocument document, String format, SearchBloxDocument.DocumentAction action)
-      throws SearchBloxException {
-    
-    SearchBloxDocument.IndexingFormat iFormat = SearchBloxDocument.IndexingFormat.valueOf(format.toUpperCase(Locale.ROOT));
-      
-    if (iFormat == null) {
-      Logging.connectors.error("[Post request] Format not recognized " +format);
-      throw new SearchBloxException("Unknown Serialization Format " + format);
-    }
-      
-    boolean isJson = iFormat.equals(SearchBloxDocument.IndexingFormat.JSON);
-      
-    
-
-    UriBuilder uri = uriBuilder.clone();
-    if (action == SearchBloxDocument.DocumentAction.ADD_UPDATE) {
-      uri = uri.path(ADD_PATH);
-    } else if (action == SearchBloxDocument.DocumentAction.DELETE) {
-      uri = uri.path(DELETE_PATH);
-    } else if (action == SearchBloxDocument.DocumentAction.STATUS) {
-      uri = uri.path(STATUS_PATH);
-    } else if (action == SearchBloxDocument.DocumentAction.CREATE) {
-      uri = uri.path(CREATE_PATH);
-    } else if (action == SearchBloxDocument.DocumentAction.CLEAR) {
-      uri = uri.path(CLEAR_PATH);
-    }
-
-    WebTarget target = client.target(uri.build());
-    Builder httpRequest = target.request();
-    if (iFormat == SearchBloxDocument.IndexingFormat.JSON) {
-      httpRequest.accept(MediaType.APPLICATION_JSON_TYPE);
-    }else{
-      httpRequest.accept(MediaType.APPLICATION_XML_TYPE);
-    }
-    
-
-    document.apiKey = this.apikey;
-    
-    String body = document.toString(iFormat, action);
-    Logging.connectors.debug("Document for document: " + document.uid +":" + body);
-    MediaType type = MediaType.TEXT_PLAIN_TYPE;
-    if (iFormat == SearchBloxDocument.IndexingFormat.JSON) {
-      type = MediaType.APPLICATION_JSON_TYPE;
-    }
-
-    
-    Entity<String> entity = Entity.entity(body, type);
-    Response response = null;
-    try {
-      response = httpRequest.post(entity);
-    }
-    catch(Exception e) {
-    //    return e.getCause() instanceof ConnectException ? ResponseCode.SERVER_UNREACHABLE : ResponseCode.INVALID_COLLECTION_NAME;
-      Logging.connectors.error("[No Connection] Error trying to connect ",e);
-      return ResponseCode.SERVER_UNREACHABLE;
-    }
-    
-    String rawResponse = response.readEntity(String.class);
-    if(iFormat == IndexingFormat.XML){
-      DOMParser parser = new DOMParser();
-      try {
-        parser.parse(new InputSource(new StringReader(rawResponse)));
-      } catch (SAXException | IOException e) {
-        Logging.connectors.error("[Response parsing] Dom parsing error", e);
-        throw new SearchBloxException(e);
-      }
-      Document doc = parser.getDocument();
-      NodeList nodeList = doc.getElementsByTagName(STATUS_NODE);
-      if (nodeList == null || nodeList.getLength() == 0) {
-        String message = "[Response Parsing] Status code not found";
-        Logging.connectors.error(message);
-        throw new SearchBloxException(message);
-      }
-      String codeStr = nodeList.item(0).getTextContent();
-      int statusCode = Integer.parseInt(codeStr);
-      return ResponseCode.getCodeFromValue(statusCode, isJson);
-    }else{
-      Matcher matcher = status_pattern.matcher(rawResponse);
-      String codeStr = null;
-      if(matcher.find())
-        codeStr = matcher.group(1);
-      if(codeStr == null){
-        String message = "[Response parsing] Response code parsing error";
-        Logging.connectors.error(message);
-        throw new SearchBloxException(message);
-      }
-                
-      int statusCode = Integer.parseInt(codeStr);
-      return ResponseCode.getCodeFromValue(statusCode, isJson);
-    }
-  }
-}
diff --git a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxConfig.java b/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxConfig.java
deleted file mode 100644
index 0bcf7f1..0000000
--- a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxConfig.java
+++ /dev/null
@@ -1,34 +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 org.apache.manifoldcf.agents.output.searchblox;
-
-/**
- * <p>SearchBloxConfig class</p>
- * @author Antonio David Perez Morales <adperezmorales@apache.org>
- * 
- */
-class SearchBloxConfig {
-
-  static final String NODE_CONFIGURATION = "configuration";
-  static final String ATTRIBUTE_TITLEBOOST = "title_boost";
-  static final String ATTRIBUTE_CONTENTBOOST = "content_boost";
-  static final String ATTRIBUTE_KEYWORDSBOOST = "keywords_boost";
-  static final String ATTRIBUTE_DESCRIPTIONBOOST = "description_boost";
-  static final String ATTRIBUTE_INDEX_FORMAT = "indexformat";
-  static final String ATTRIBUTE_COLLECTION_NAME = "collection";
-
-}
diff --git a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxConnector.java b/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxConnector.java
deleted file mode 100644
index fb1db41..0000000
--- a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxConnector.java
+++ /dev/null
@@ -1,841 +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 org.apache.manifoldcf.agents.output.searchblox;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.output.BaseOutputConnector;
-import org.apache.manifoldcf.agents.output.searchblox.SearchBloxClient.ResponseCode;
-import org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.IndexingFormat;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * SearchBox Output Connector. SearchBox (http://www.searchblox.com/) is a Cloud
- * Based Search Engine. This connector index ManifoldCF crawled content and
- * metadata using the SearchBox REST API
- * (http://www.searchblox.com/developers-2/api-2)
- *
- * @author Rafa Haro <rharo@apache.org>
- * @author Antonio David Perez Morales <adperezmorales@apache.org>
- */
-public class SearchBloxConnector extends BaseOutputConnector {
-
-  private final static String SEARCHBLOX_TAB_PARAMETERS = "SearchBloxConnector.Parameters";
-
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  private static final String EDIT_SPECIFICATION_CONFIGURATION_HTML = "editSpecification_Configuration.html";
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  /** Forward to the javascript to check the configuration parameters */
-  private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration.js";
-
-  /** Forward to the HTML template to edit the configuration parameters */
-  private static final String EDIT_CONFIG_FORWARD_PARAMETERS = "editConfiguration_Parameters.html";
-
-  /** Forward to the HTML template to view the configuration parameters */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration.html";
-
-  /**
-   * Default collection name
-   */
-  private static final String DEFAULT_COLLECTION = "Custom";
-  
-  /**
-   * Default apiKey
-   */
-  private static final String DEFAULT_APIKEY = "apiKey";
-  
-  /**
-   * Ingestion activity
-   */
-  public final static String INGEST_ACTIVITY = "document ingest";
-
-  /**
-   * Document removal activity
-   */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-
-  /**
-   * Collection Creation activity
-   */
-  public final static String CREATION_ACTIVITY = "collection created";
-
-  
-  private static final String SEARCHBLOX_ENDPOINT = "endpoint";
-  private static final String SEARCHBLOX_INDEXING_FORMAT = "indexformat";
-  private static final String SEARCHBLOX_SOCKET_TIMEOUT = "sockettimeout";
-  private static final String SEARCHBLOX_CONNECTION_TIMEOUT = "connectiontimeout";
-  
-  private static final String BUILDER_DEFAULT_SOCKET_TIMEOUT = "60";
-  private static final String BUILDER_DEFAULT_CONNECTION_TIMEOUT = "60";
-
-  private SearchBloxClient client = null;
-  private String apiKey = null;
-
-  public SearchBloxConnector() {
-
-  }
-
-  /** Connect.
-  */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-  }
-  
-  /**
-   * This method is called to assess whether to count this connector instance
-   * should actually be counted as being connected.
-   *
-   * @return true if the connector instance is actually connected.
-   */
-  @Override
-  public boolean isConnected() {
-    return client != null;
-  }
-
-  /**
-   * Close the connection. Call this before discarding the connection.
-   */
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    if (client != null) {
-      apiKey = null;
-      client = null;
-    }
-    super.disconnect();
-  }
-
-  /**
-   * Return the list of activities that this connector supports (i.e. writes
-   * into the log).
-   *
-   * @return the list.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return new String[] { INGEST_ACTIVITY, REMOVE_ACTIVITY,
-        CREATION_ACTIVITY };
-  }
-
-  protected void getSession()
-    throws ManifoldCFException {
-    if (client == null) {
-      String connectionTimeoutString = params.getParameter(SEARCHBLOX_CONNECTION_TIMEOUT);
-      if (connectionTimeoutString == null)
-        connectionTimeoutString = BUILDER_DEFAULT_CONNECTION_TIMEOUT;
-      long connectionTimeout;
-      try {
-        connectionTimeout = Integer.parseInt(connectionTimeoutString);
-      } catch (NumberFormatException e) {
-        throw new ManifoldCFException("Bad connection timeout: "+e.getMessage(),e);
-      }
-      String socketTimeoutString = params.getParameter(SEARCHBLOX_SOCKET_TIMEOUT);
-      if (socketTimeoutString == null)
-        socketTimeoutString = BUILDER_DEFAULT_SOCKET_TIMEOUT;
-      long socketTimeout;
-      try {
-        socketTimeout = Integer.parseInt(socketTimeoutString);
-      } catch (NumberFormatException e) {
-        throw new ManifoldCFException("Bad socket timeout: "+e.getMessage(),e);
-      }
-      final String endpoint = params.getParameter(SEARCHBLOX_ENDPOINT);
-      this.apiKey = params.getParameter(SearchBloxDocument.API_KEY);
-      ResteasyClientBuilder builder = new ResteasyClientBuilder();
-      builder.connectionPoolSize(1);
-      builder.establishConnectionTimeout(connectionTimeout, TimeUnit.SECONDS);
-      builder.socketTimeout(socketTimeout, TimeUnit.SECONDS);
-      client = new SearchBloxClient(apiKey, builder, endpoint);
-    }
-    
-  }
-
-  @Override
-  public String check() throws ManifoldCFException {
-    getSession();
-    try {
-      String format = getConfiguration().getParameter(SEARCHBLOX_INDEXING_FORMAT);
-      if (client.ping(format)) {
-        return super.check();
-      } else {
-        return "Connection Not Working!. Check SearchBlox Server is up and the configuration is correct.";
-      }
-    } catch (SearchBloxException e) {
-      Logging.connectors.error("Connection Not Working", e);
-      return "Connection Not Working!" + e.getMessage();
-    }
-  }
-
-  /**
-   * Get an output version string, given an output specification. The output
-   * version string is used to uniquely describe the pertinent details of the
-   * output specification and the configuration, to allow the Connector
-   * Framework to determine whether a document will need to be output again.
-   * Note that the contents of the document cannot be considered by this
-   * method, and that a different version string (defined in
-   * IRepositoryConnector) is used to describe the version of the actual
-   * document.
-   * <p/>
-   * This method presumes that the connector object has been configured, and
-   * it is thus able to communicate with the output data store should that be
-   * necessary.
-   *
-   * @param spec
-   *            is the current output specification for the job that is doing
-   *            the crawling.
-   * @return a string, of unlimited length, which uniquely describes output
-   *         configuration and specification in such a way that if two such
-   *         strings are equal, the document will not need to be sent again to
-   *         the output data store.
-   */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-      throws ManifoldCFException, ServiceInterruption {
-    SpecPacker sp = new SpecPacker(spec);
-    return new VersionContext(sp.toPackedString(), params, spec);
-  }
-
-  /**
-   * Detect if a mime type is indexable or not. This method is used by
-   * participating repository connectors to pre-filter the number of unusable
-   * documents that will be passed to this output connector.
-   *
-   * @param outputDescription
-   *            is the document's output version.
-   * @param mimeType
-   *            is the mime type of the document.
-   * @return true if the mime type is indexable by this connector.
-   */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext outputDescription,
-      String mimeType, IOutputCheckActivity activities)
-      throws ManifoldCFException, ServiceInterruption {
-    // We work against the API, so we need to suppose the content reached by
-    // the connector is a String convertible stream
-    return true;
-  }
-
-  /**
-   * Pre-determine whether a document's length is indexable by this connector.
-   * This method is used by participating repository connectors to help filter
-   * out documents that are too long to be indexable.
-   *
-   * @param outputDescription
-   *            is the document's output version.
-   * @param length
-   *            is the length of the document.
-   * @return true if the file is indexable.
-   */
-  @Override
-  public boolean checkLengthIndexable(VersionContext outputDescription,
-      long length, IOutputCheckActivity activities)
-      throws ManifoldCFException, ServiceInterruption {
-    // No Size Limit for SearchBlox
-    return true;
-  }
-
-  /**
-   * Add (or replace) a document in the output data store using the connector.
-   * This method presumes that the connector object has been configured, and
-   * it is thus able to communicate with the output data store should that be
-   * necessary.
-   *
-   * @param documentURI
-   *            is the URI of the document. The URI is presumed to be the
-   *            unique identifier which the output data store will use to
-   *            process and serve the document. This URI is constructed by the
-   *            repository connector which fetches the document, and is thus
-   *            universal across all output connectors.
-   * @param pipelineDescription
-   *            includes the description string that was constructed for this
-   *            document by the getOutputDescription() method.
-   * @param document
-   *            is the document data to be processed (handed to the output
-   *            data store).
-   * @param authorityNameString
-   *            is the name of the authority responsible for authorizing any
-   *            access tokens passed in with the repository document. May be
-   *            null.
-   * @param activities
-   *            is the handle to an object that the implementer of a pipeline
-   *            connector may use to perform operations, such as logging
-   *            processing activity, or sending a modified document to the
-   *            next stage in the pipeline.
-   * @return the document status (accepted or permanently rejected).
-   * @throws IOException
-   *             only if there's a stream error reading the document data.
-   */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI,
-      VersionContext pipelineDescription, RepositoryDocument document,
-      String authorityNameString, IOutputAddActivity activities)
-      throws ManifoldCFException, ServiceInterruption, IOException {
-
-    Logging.connectors.info("Indexing Document " + documentURI);
-    long indexingTime = System.currentTimeMillis();
-    SpecPacker sp = new SpecPacker(pipelineDescription.getSpecification());
-    Map<String, List<String>> args = sp.getArgs();
-    // Establish a session
-    getSession();
-
-    SearchBloxDocument sbDoc = new SearchBloxDocument(this.apiKey,
-        documentURI, document, args);
-    String format = this.getConfiguration().getParameter(SEARCHBLOX_INDEXING_FORMAT);
-    long startTime = System.currentTimeMillis();
-    try {
-      ResponseCode code = client.addUpdateDocument(sbDoc, format);
-      if (code == ResponseCode.DOCUMENT_INDEXED) {
-                Logging.connectors.info("Document Indexed" + documentURI);
-        activities.recordActivity(startTime, INGEST_ACTIVITY, null,
-            documentURI, "OK", "Document Indexed");}
-      else
-        activities.recordActivity(startTime, INGEST_ACTIVITY, null,
-            documentURI, "" + code.getCode(), code.name());
-    } catch (SearchBloxException e) {
-      Logging.connectors
-          .error("[Indexing - Add] Exception indexing document :"
-              + document, e);
-      String activityCode = e.getClass().getSimpleName()
-          .toUpperCase(Locale.ROOT);
-      String activityDetails = e.getMessage()
-          + ((e.getCause() != null) ? ": "
-              + e.getCause().getMessage() : "");
-      activities.recordActivity(startTime, INGEST_ACTIVITY, null,
-          documentURI, activityCode, activityDetails);
-      return DOCUMENTSTATUS_REJECTED;
-    }
-    indexingTime = System.currentTimeMillis() - indexingTime;
-    Logging.connectors.info("Indexing Time for document " + documentURI + ": " + indexingTime);
-    return DOCUMENTSTATUS_ACCEPTED;
-  }
-
-  /**
-   * Remove a document using the connector. Note that the last
-   * outputDescription is included, since it may be necessary for the
-   * connector to use such information to know how to properly remove the
-   * document.
-   *
-   * @param documentURI
-   *            is the URI of the document. The URI is presumed to be the
-   *            unique identifier which the output data store will use to
-   *            process and serve the document. This URI is constructed by the
-   *            repository connector which fetches the document, and is thus
-   *            universal across all output connectors.
-   * @param outputDescription
-   *            is the last description string that was constructed for this
-   *            document by the getOutputDescription() method above.
-   * @param activities
-   *            is the handle to an object that the implementer of an output
-   *            connector may use to perform operations, such as logging
-   *            processing activity.
-   */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription,
-      IOutputRemoveActivity activities) throws ManifoldCFException,
-      ServiceInterruption {
-    Logging.ingest.debug("Deleting SearchBlox Document: '" + documentURI
-        + "'");
-
-    SpecPacker packer = new SpecPacker(outputDescription);
-    Map<String, List<String>> args = packer.getArgs();
-    // Establish a session
-    getSession();
-    
-    SearchBloxDocument document = new SearchBloxDocument(this.apiKey);
-    document.uid = documentURI;
-    // document.apiKey = args.get(API_KEY).get(0);
-    document.colName = args.get(SearchBloxDocument.SEARCHBLOX_COLLECTION).get(0);
-    String format = this.getConfiguration().getParameter(SEARCHBLOX_INDEXING_FORMAT);
-    long startTime = System.currentTimeMillis();
-    try {
-      ResponseCode code = client.deleteDocument(document, format);
-      if (code == ResponseCode.DOCUMENT_DELETED)
-        activities.recordActivity(startTime, REMOVE_ACTIVITY, null,
-            documentURI, "OK", "Document Deleted");
-      else
-        activities.recordActivity(startTime, REMOVE_ACTIVITY, null,
-            documentURI, "" + code.getCode(), code.name());
-    } catch (SearchBloxException e) {
-      Logging.connectors.error(
-          "[Indexing - Remove] Exception indexing document :"
-              + document, e);
-      String activityCode = e.getClass().getSimpleName()
-          .toUpperCase(Locale.ROOT);
-      String activityDetails = e.getMessage()
-          + ((e.getCause() != null) ? ": "
-              + e.getCause().getMessage() : "");
-      activities.recordActivity(startTime, REMOVE_ACTIVITY, null,
-          documentURI, activityCode, activityDetails);
-    }
-  }
-
-  /**
-   * Read the content of a resource, replace the variable ${PARAMNAME} with
-   * the value and copy it to the out.
-   * 
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException
-   */
-  private static void outputResource(String resName, IHTTPOutput out,
-      Locale locale, Map<String, String> params, String tabName,
-      Integer sequenceNumber, Integer currentSequenceNumber)
-      throws ManifoldCFException {
-    Map<String, String> paramMap = null;
-    if (params != null) {
-      paramMap = params;
-      if (tabName != null) {
-        paramMap.put("TabName", tabName);
-      }
-      if (currentSequenceNumber != null)
-        paramMap.put("SelectedNum", currentSequenceNumber.toString());
-    } else {
-      paramMap = new HashMap<String, String>();
-    }
-    if (sequenceNumber != null)
-      paramMap.put("SeqNum", sequenceNumber.toString());
-
-    Messages.outputResourceWithVelocity(out, locale, resName, paramMap,
-        true);
-  }
-
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    super.outputConfigurationHeader(threadContext, out, locale, parameters,
-        tabsArray);
-    tabsArray.add(Messages.getString(locale, SEARCHBLOX_TAB_PARAMETERS));
-    outputResource(EDIT_CONFIG_HEADER_FORWARD, out, locale, null, null,
-        null, null);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters,
-      String tabName) throws ManifoldCFException, IOException {
-    super.outputConfigurationBody(threadContext, out, locale, parameters,
-        tabName);
-    Map<String, String> config = getConfigParameters(parameters);
-    outputResource(EDIT_CONFIG_FORWARD_PARAMETERS, out, locale, config,
-        tabName, null, null);
-  }
-
-  /**
-   * Build a Map of SearchBlox parameters. If configParams is null,
-   * getConfiguration() is used.
-   * 
-   * @param configParams
-   */
-  final private Map<String, String> getConfigParameters(
-      ConfigParams configParams) {
-    Map<String, String> map = new HashMap<String, String>();
-
-    String apiKey = configParams.getParameter(SearchBloxDocument.API_KEY);
-    if(apiKey == null)
-      apiKey = DEFAULT_APIKEY;
-    map.put(SearchBloxDocument.API_KEY, apiKey);
-    
-    String endpoint = configParams.getParameter(SEARCHBLOX_ENDPOINT);
-    if(endpoint == null) {
-      endpoint = SearchBloxClient.DEFAULT_ENDPOINT;
-    }
-    map.put(SEARCHBLOX_ENDPOINT,
-        endpoint);
-    
-    String indexFormat = configParams.getParameter(SEARCHBLOX_INDEXING_FORMAT);
-    if (indexFormat == null) {
-      indexFormat = IndexingFormat.JSON.name();
-    }
-    map.put(SEARCHBLOX_INDEXING_FORMAT, indexFormat);
-    
-    String connectionTimeout = configParams.getParameter(SEARCHBLOX_CONNECTION_TIMEOUT);
-    if (connectionTimeout == null) {
-      connectionTimeout = BUILDER_DEFAULT_CONNECTION_TIMEOUT;
-    }
-    map.put(SEARCHBLOX_CONNECTION_TIMEOUT, connectionTimeout);
-    
-    String socketTimeout = configParams.getParameter(SEARCHBLOX_SOCKET_TIMEOUT);
-    if (socketTimeout == null) {
-      socketTimeout = BUILDER_DEFAULT_SOCKET_TIMEOUT;
-    }
-    map.put(SEARCHBLOX_SOCKET_TIMEOUT, socketTimeout);
-    
-    return map;
-  }
-
-  @Override
-  public void viewConfiguration(IThreadContext threadContext,
-      IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    outputResource(VIEW_CONFIG_FORWARD, out, locale,
-        getConfigParameters(parameters), null, null, null);
-  }
-
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * connector's configuration page, whenever there is a possibility that form
-   * data for a connection has been posted. Its purpose is to gather form
-   * information and modify the configuration parameters accordingly. The name
-   * of the posted form is "editconnection".
-   *
-   * @param threadContext
-   *            is the local thread context.
-   * @param variableContext
-   *            is the set of variables available from the post, including
-   *            binary file post information.
-   * @param parameters
-   *            are the configuration parameters, as they currently exist, for
-   *            this connection being configured.
-   * @return null if all is well, or a string error message if there is an
-   *         error that should prevent saving of the connection (and cause a
-   *         redirection to an error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext,
-      IPostParameters variableContext, Locale locale,
-      ConfigParams parameters) throws ManifoldCFException {
-    String apiKey = variableContext.getParameter(SearchBloxDocument.API_KEY);
-    if (apiKey != null)
-      parameters.setParameter(SearchBloxDocument.API_KEY, apiKey);
-
-    String endpoint = variableContext.getParameter(SEARCHBLOX_ENDPOINT);
-    if (endpoint != null)
-      parameters.setParameter(SEARCHBLOX_ENDPOINT, endpoint);
-    
-    String indexformat = variableContext.getParameter(SEARCHBLOX_INDEXING_FORMAT);
-    if (indexformat != null)
-      parameters.setParameter(SEARCHBLOX_INDEXING_FORMAT, indexformat);
-
-    String connectionTimeout = variableContext.getParameter(SEARCHBLOX_CONNECTION_TIMEOUT);
-    if (connectionTimeout != null)
-      parameters.setParameter(SEARCHBLOX_CONNECTION_TIMEOUT, connectionTimeout);
-    
-    String socketTimeout = variableContext.getParameter(SEARCHBLOX_SOCKET_TIMEOUT);
-    if (socketTimeout != null)
-      parameters.setParameter(SEARCHBLOX_SOCKET_TIMEOUT, socketTimeout);
-    
-    return null;
-  }
-
-  /**
-   * Output the specification header section. This method is called in the
-   * head section of a job page which has selected a pipeline connection of
-   * the current type. Its purpose is to add the required tabs to the list,
-   * and to output any javascript methods that might be needed by the job
-   * editing HTML.
-   *
-   * @param out
-   *            is the output to which any HTML should be sent.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param os
-   *            is the current pipeline specification for this connection.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @param tabsArray
-   *            is an array of tab names. Add to this array any tab names that
-   *            are specific to the connector.
-   */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale,
-      Specification os, int connectionSequenceNumber,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    tabsArray.add(Messages.getString(locale,
-        "SearchBloxConnector.Configuration"));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPECIFICATION_JS,
-        paramMap);
-  }
-
-  private void fillInSpecificationMap(
-      Map<String, Object> paramMap, Specification os) {
-
-    for (int i = 0, len = os.getChildCount(); i < len; i++) {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(SearchBloxConfig.NODE_CONFIGURATION)) {
-
-        String titleBoost = sn
-            .getAttributeValue(SearchBloxConfig.ATTRIBUTE_TITLEBOOST);
-        if (titleBoost == null || titleBoost.isEmpty())
-          titleBoost = "0";
-        String contentBoost = sn
-            .getAttributeValue(SearchBloxConfig.ATTRIBUTE_CONTENTBOOST);
-        if (contentBoost == null || contentBoost.isEmpty())
-          contentBoost = "0";
-        String keywordsBoost = sn
-            .getAttributeValue(SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST);
-        if (keywordsBoost == null || keywordsBoost.isEmpty())
-          keywordsBoost = "0";
-        String descriptionBoost = sn
-            .getAttributeValue(SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST);
-        if (descriptionBoost == null || descriptionBoost.isEmpty())
-          descriptionBoost = "0";
-
-        String collection = sn
-            .getAttributeValue(SearchBloxConfig.ATTRIBUTE_COLLECTION_NAME);
-        if (collection == null)
-          collection = DEFAULT_COLLECTION;
-        
-        paramMap.put(SearchBloxConfig.ATTRIBUTE_TITLEBOOST.toUpperCase(Locale.ROOT),
-            titleBoost);
-        paramMap.put(SearchBloxConfig.ATTRIBUTE_CONTENTBOOST.toUpperCase(Locale.ROOT),
-            contentBoost);
-        paramMap.put(SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST.toUpperCase(Locale.ROOT),
-            keywordsBoost);
-        paramMap.put(SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST.toUpperCase(Locale.ROOT),
-            descriptionBoost);
-        paramMap.put(SearchBloxConfig.ATTRIBUTE_COLLECTION_NAME
-            .toUpperCase(Locale.ROOT), collection);
-
-        return;
-      }
-
-    }
-
-    paramMap.put(SearchBloxConfig.ATTRIBUTE_TITLEBOOST.toUpperCase(Locale.ROOT), 0);
-    paramMap.put(SearchBloxConfig.ATTRIBUTE_CONTENTBOOST.toUpperCase(Locale.ROOT), 0);
-    paramMap.put(SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST.toUpperCase(Locale.ROOT), 0);
-    paramMap.put(SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST.toUpperCase(Locale.ROOT), 0);
-    paramMap.put(SearchBloxConfig.ATTRIBUTE_INDEX_FORMAT.toUpperCase(Locale.ROOT),
-        IndexingFormat.XML.name());
-    paramMap.put(SearchBloxConfig.ATTRIBUTE_COLLECTION_NAME.toUpperCase(Locale.ROOT),
-        "");
-
-  }
-
-  /**
-   * View specification. This method is called in the body section of a job's
-   * view page. Its purpose is to present the pipeline specification
-   * information to the user. The coder can presume that the HTML that is
-   * output from this configuration will be within appropriate <html> and
-   * <body> tags.
-   *
-   * @param out
-   *            is the output to which any HTML should be sent.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @param os
-   *            is the current pipeline specification for this job.
-   */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale,
-      Specification os, int connectionSequenceNumber)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out, locale,
-        VIEW_SPECIFICATION_HTML, paramMap);
-
-  }
-
-  /**
-   * Output the specification body section. This method is called in the body
-   * section of a job page which has selected a pipeline connection of the
-   * current type. Its purpose is to present the required form elements for
-   * editing. The coder can presume that the HTML that is output from this
-   * configuration will be within appropriate <html>, <body>, and <form> tags.
-   * The name of the form is "editjob".
-   *
-   * @param out
-   *            is the output to which any HTML should be sent.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param os
-   *            is the current pipeline specification for this job.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @param actualSequenceNumber
-   *            is the connection within the job that has currently been
-   *            selected.
-   * @param tabName
-   *            is the current tab name.
-   */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale,
-      Specification os, int connectionSequenceNumber,
-      int actualSequenceNumber, String tabName)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM", Integer.toString(actualSequenceNumber));
-
-    // Fill in the field mapping tab data
-    fillInSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out, locale,
-        EDIT_SPECIFICATION_CONFIGURATION_HTML, paramMap);
-
-  }
-
-  /**
-   * Process a specification post. This method is called at the start of job's
-   * edit or view page, whenever there is a possibility that form data for a
-   * connection has been posted. Its purpose is to gather form information and
-   * modify the transformation specification accordingly. The name of the
-   * posted form is "editjob".
-   *
-   * @param variableContext
-   *            contains the post data, including binary file-upload
-   *            information.
-   * @param locale
-   *            is the preferred local of the output.
-   * @param os
-   *            is the current pipeline specification for this job.
-   * @param connectionSequenceNumber
-   *            is the unique number of this connection within the job.
-   * @return null if all is well, or a string error message if there is an
-   *         error that should prevent saving of the job (and cause a
-   *         redirection to an error page).
-   */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext,
-      Locale locale, Specification os, int connectionSequenceNumber)
-      throws ManifoldCFException {
-    String seqPrefix = "s" + connectionSequenceNumber + "_";
-    String titleBoost = variableContext.getParameter(seqPrefix
-        + SearchBloxConfig.ATTRIBUTE_TITLEBOOST);
-    String contentBoost = variableContext.getParameter(seqPrefix
-        + SearchBloxConfig.ATTRIBUTE_CONTENTBOOST);
-    String keywordsBoost = variableContext.getParameter(seqPrefix
-        + SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST);
-    String descriptionBoost = variableContext.getParameter(seqPrefix
-        + SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST);
-    String collection = variableContext.getParameter(seqPrefix
-        + SearchBloxConfig.ATTRIBUTE_COLLECTION_NAME);
-    String indexFormat = variableContext.getParameter(seqPrefix
-        + SearchBloxConfig.ATTRIBUTE_INDEX_FORMAT);
-
-    // About to gather the configuration values, so get rid of the old one.
-    int i = 0, len = os.getChildCount();
-    while (i < len) {
-      SpecificationNode node = os.getChild(i);
-      if (node.getType().equals(SearchBloxConfig.NODE_CONFIGURATION))
-        os.removeChild(i);
-      else
-        i++;
-    }
-
-    SpecificationNode node = new SpecificationNode(
-        SearchBloxConfig.NODE_CONFIGURATION);
-    node.setAttribute(SearchBloxConfig.ATTRIBUTE_TITLEBOOST, titleBoost);
-    node.setAttribute(SearchBloxConfig.ATTRIBUTE_CONTENTBOOST, contentBoost);
-    node.setAttribute(SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST, keywordsBoost);
-    node.setAttribute(SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST, descriptionBoost);
-    node.setAttribute(SearchBloxConfig.ATTRIBUTE_COLLECTION_NAME,
-        collection);
-    node.setAttribute(SearchBloxConfig.ATTRIBUTE_INDEX_FORMAT, indexFormat);
-    os.addChild(os.getChildCount(), node);
-
-    return null;
-
-  }
-  
-
-  protected static class SpecPacker {
-    /** Arguments, from configuration */
-    private final Multimap<String, String> args = HashMultimap.create();
-      
-    public SpecPacker(String outputDescription) {
-      String[] parts = outputDescription.split(",");
-      for(String part : parts) {
-        String[] keyValue = part.split("=");
-        if(keyValue.length != 2) {
-          continue;
-        }
-          
-        args.put(keyValue[0], keyValue[1]);
-      }
-    }
-      
-    public SpecPacker(Specification spec) {
-      // Process arguments
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode node = spec.getChild(i);
-        if (node.getType().equals(SearchBloxConfig.NODE_CONFIGURATION))
-        {
-          String titleBoost = node.getAttributeValue(SearchBloxConfig.ATTRIBUTE_TITLEBOOST);
-          String contentBoost = node.getAttributeValue(SearchBloxConfig.ATTRIBUTE_CONTENTBOOST);
-          String keywordsBoost = node.getAttributeValue(SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST);
-          String descriptionBoost = node.getAttributeValue(SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST);
-          String collection = node.getAttributeValue(SearchBloxConfig.ATTRIBUTE_COLLECTION_NAME);
-          args.put(SearchBloxConfig.ATTRIBUTE_TITLEBOOST, titleBoost);
-          args.put(SearchBloxConfig.ATTRIBUTE_CONTENTBOOST, contentBoost);
-          args.put(SearchBloxConfig.ATTRIBUTE_KEYWORDSBOOST, keywordsBoost);
-          args.put(SearchBloxConfig.ATTRIBUTE_DESCRIPTIONBOOST, descriptionBoost);
-          args.put(SearchBloxDocument.SEARCHBLOX_COLLECTION, collection);
-            
-        }
-      }
-      
-    }
-      
-    public String toPackedString() {
-      Map<String, List<String>> mapList = getArgs();
-      StringBuilder sb = new StringBuilder();
-      for(String s : mapList.keySet()) {
-        sb.append(s).append("=").append(mapList.get(s).get(0));
-        sb.append(",");
-      }
-      if(sb.toString().length()!=0)
-        return sb.substring(0, sb.length()-1);
-      else
-        return "";
-        
-    }
-      
-    public Map<String,List<String>> getArgs() {
-      Map<String,List<String>> result = Maps.newHashMap();
-      for(String s : args.keySet()) {
-        Collection<String> list = args.get(s);
-        if(list instanceof List) {
-          result.put(s,  (List<String>) list);
-        }
-        else {
-          List<String> l = Lists.newArrayList(list);
-          result.put(s,  l);
-        }
-      }
-      return result;
-    }
-  }
-}
diff --git a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxDocument.java b/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxDocument.java
deleted file mode 100644
index e7f8b84..0000000
--- a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxDocument.java
+++ /dev/null
@@ -1,362 +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 org.apache.manifoldcf.agents.output.searchblox;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.jsoup.Jsoup;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-/**
- * "Package" class modeling a SearchBox document as a POJO
- *
- * @author Rafa Haro <rharo@apache.org>
- * @author Antonio David Perez Morales <adperezmorales@apache.org>
- */
-public class SearchBloxDocument {
-
-  static final String API_KEY = "apikey";
-  static final String SEARCHBLOX_COLLECTION = "collection";
-  static final String DATE_FORMAT = "dd MMMM yyyy HH:mm:ss z";
-
-  public enum IndexingFormat {
-    JSON, XML
-  }
-
-  public enum DocumentAction {
-    ADD_UPDATE, DELETE, STATUS, CREATE, CLEAR
-  }
-  static final List<String> xmlElements= Lists.newArrayList("searchblox","document","url","title","keywords","content","description","lastmodified","size",
-      "alpha","contenttype","category","meta","uid");
-
-  static final String COLNAME_ATTRIBUTE = "colname";
-  static final String APIKEY_ATTRIBUTE = "apikey";
-  static final String NAME_ATTRIBUTE = "name";
-  static final String UID_ATTRIBUTE = "uid";
-  static final String BOOST_ATTRIBUTE = "boost";
-
-  private Multimap<String, Object> data_fields = HashMultimap.create();
-
-  /**
-   * API key accessible in the SearchBlox Admin Console.
-   */
-  String apiKey;
-
-  /**
-   * Name of the Custom collection
-   */
-  String colName;
-
-  /**
-   * unique identifer for a document (default when unassigned is url location)
-   */
-  String uid;
-
-  public SearchBloxDocument(String apikey) {
-    this.apiKey = apikey;
-  }
-
-  public SearchBloxDocument(String apikey, String documentURI,
-      RepositoryDocument rd, Map<String, List<String>> args) {
-    this(apikey);
-    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.ROOT);
-
-    this.uid = documentURI;
-    this.colName = args.get(SEARCHBLOX_COLLECTION).get(0);
-
-    Date date = rd.getModifiedDate();
-    if(date!=null){
-      data_fields.put(xmlElements.get(7),
-          dateFormat.format(rd.getModifiedDate()));
-    }  
-
-    // content
-    String content = "";
-    try {
-      if (rd.getField(xmlElements.get(5)) != null)
-        content = (String) rd.getField(xmlElements.get(5))[0];
-      else
-        content = this.buildString(rd.getBinaryStream());
-    } catch (IOException e) {
-      Logging.connectors
-      .error("[Parsing Content]Content is not text plain, verify you are properly using Apache Tika Transformer",
-          e);
-    }
-    data_fields.put(xmlElements.get(5), this.clean(content));
-
-    // Content Type
-    data_fields.put(xmlElements.get(10), rd.getMimeType());
-
-    // Size
-    data_fields.put(xmlElements.get(8), "" + rd.getBinaryLength());
-
-    // Boosting
-    for(String boostId:args.keySet()){
-      if(boostId.endsWith("_boost")){
-        List<String> argBoost = args.get(boostId);
-        if(argBoost!=null && !argBoost.isEmpty())
-          data_fields.put(boostId,argBoost.get(0));
-      }
-    }
-
-    // Metadata
-    Multimap<String, String> metadata = HashMultimap.create();
-    Iterator<String> it = rd.getFields();
-    while (it.hasNext()) {
-      String name = it.next();
-      try {
-        String[] values = rd.getFieldAsStrings(name);
-        for (String value : values) {
-          String key = name.toLowerCase(Locale.ROOT);
-          int indexOf = xmlElements.indexOf(key);
-          if(indexOf != 5)
-            if (indexOf != -1 &&
-              indexOf != 0 &&
-              indexOf != 7 &&
-              indexOf != 8) {
-              data_fields.put(key, value);
-            } else
-              metadata.put(name, value);
-        }
-      } catch (IOException e) {
-        Logging.connectors.error(
-            "[Getting Field Values]Impossible to read value for metadata "
-                + name, e);
-      }
-    }
-
-    // ACLS must be stored as metadata, as Searchblox use that construct to index custom named fields
-    //the approach has been implemented and tested live
-    Iterator<String> aclTypes = rd.securityTypesIterator();
-    while (aclTypes.hasNext()) {
-      String aclType = aclTypes.next();
-      String[] allow_tokens = rd.getSecurityACL(aclType);
-      for (String token : allow_tokens)
-        metadata.put(aclType+"_allow", token);
-      String[] deny_tokens = rd.getSecurityDenyACL(aclType);
-      for (String token : deny_tokens)
-        metadata.put(aclType+"_deny", token);
-    }
-    data_fields.put(xmlElements.get(12), metadata);
-  }
-
-  /**
-   * Clean a String from html tags or  break lines
-   * @param content
-   * @return
-   */
-  private String clean(String content) {
-    content = content.replaceAll("(\r\n|\n)", " ");
-    String cleanContent= Jsoup.parseBodyFragment(content).text();
-    return cleanContent;
-  }
-
-  private String buildString(InputStream binaryStream) throws IOException {
-    StringWriter writer = new StringWriter();
-    IOUtils.copy(binaryStream, writer, "UTF-8");
-    return writer.toString();
-  }
-
-  public String toString(IndexingFormat format, DocumentAction action)
-      throws SearchBloxException {
-    if(format == IndexingFormat.XML)
-      return toStringXML(action);
-    else
-      return toStringJSON(action);
-  }
-
-  private String toStringJSON(DocumentAction action) throws SearchBloxException {
-    JSONObject result = new JSONObject();
-    if (apiKey == null)
-      throw new SearchBloxException(
-          "The API Key for accessing SearchBlox Server CAN'T be NULL");
-    
-    result.put(APIKEY_ATTRIBUTE, apiKey);
-
-    JSONObject document = new JSONObject();
-    if (colName == null)
-      throw new SearchBloxException(
-          "The Collection Name of the SearchBlox Server CAN'T be NULL");
-    document.put(COLNAME_ATTRIBUTE, colName);
-    document.put(UID_ATTRIBUTE, uid);
-
-    if(action == DocumentAction.ADD_UPDATE){
-      for(String element:xmlElements){
-        if (!element.equals(xmlElements.get(12))) {
-          Collection<Object> values = data_fields.get(element);
-          if (values!=null && values.size()>0) {
-            Object next = values.iterator()
-                .next();
-            String value =(String) next;
-            if (value != null && !value.isEmpty()) {
-              if(element.equals("keywords"))
-                document.put(element, StringUtils.join(values, ','));
-              else
-                document.put(element, value);
-                
-            }
-          }
-        }
-      }
-
-      // Metadata
-      Collection<Object> metadataSet = data_fields
-          .get(xmlElements.get(12));
-      JSONObject metaObject = new JSONObject();
-      if(metadataSet!=null && metadataSet.size()>0){
-        Multimap<String, String> metadata = (Multimap<String, String>) metadataSet.iterator().next();
-        if (metadata != null && !metadata.isEmpty()) {
-          for (String name : metadata.keySet()){
-            JSONArray nextMetadata = new JSONArray();
-            for (String value : metadata.get(name)) {
-              nextMetadata.add(value);
-            }
-            metaObject.put(name, nextMetadata);
-          }
-        }  
-      }
-      document.put(xmlElements.get(12), metaObject);
-    }
-
-    result.put(xmlElements.get(1), document);
-
-    return result.toJSONString();
-  }
-
-  private String toStringXML(DocumentAction action) throws SearchBloxException{
-    Document doc = null;
-    try {
-      doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
-          .newDocument();
-
-    } catch (ParserConfigurationException e) {
-      throw new SearchBloxException(e);
-    }
-
-    // Document Base Data
-    Element root = doc.createElement(xmlElements.get(0));
-    if (apiKey == null)
-      throw new SearchBloxException(
-          "The API Key for accessing SearchBlox Server CAN'T be NULL");
-    root.setAttribute(APIKEY_ATTRIBUTE, apiKey);
-    doc.appendChild(root);
-    Element document = doc.createElement(xmlElements.get(1));
-    if (colName == null)
-      throw new SearchBloxException(
-          "The Collection Name of the SearchBlox Server CAN'T be NULL");
-    document.setAttribute(COLNAME_ATTRIBUTE, colName);
-    if(action == DocumentAction.DELETE)
-      document.setAttribute(UID_ATTRIBUTE,uid);
-    root.appendChild(document);
-
-    if (action == DocumentAction.ADD_UPDATE) {
-      // Uid
-      if (uid != null && !uid.isEmpty()) {
-        Element uidElement = doc.createElement(xmlElements.get(13));
-        uidElement.setTextContent(uid);
-        document.appendChild(uidElement);
-      }
-
-      for(String element:xmlElements){
-        if (!element.equals(xmlElements.get(12))) {
-          Collection<Object> values = data_fields.get(element);
-          if (values!=null && values.size()>0) {
-            Object next = values.iterator()
-                .next();
-            String value =(String) next;
-            if (value != null && !value.isEmpty()) {
-              Element eValue = doc.createElement(element);
-              if(element.equals("keywords"))
-                eValue.setTextContent(StringUtils.join(values, ','));
-              else
-                eValue.setTextContent(value);
-              Collection<Object> boostElement = data_fields
-                  .get(element + "_boost");
-              if(boostElement!=null && boostElement.size()>0){
-                String value_boost = (String) boostElement.iterator()
-                    .next();
-                eValue.setAttribute(BOOST_ATTRIBUTE, "" + value_boost);
-              }
-              document.appendChild(eValue);
-            }
-          }
-        }
-      }
-
-      // Metadata
-      Collection<Object> metadataSet = data_fields
-          .get(xmlElements.get(12));
-      if(metadataSet!=null && metadataSet.size()>0){
-        Multimap<String, String> metadata = (Multimap<String, String>) metadataSet.iterator().next();
-        if (metadata != null && !metadata.isEmpty()) {
-          for (String name : metadata.keySet())
-            for (String value : metadata.get(name)) {
-              Element metaElement = doc.createElement(xmlElements.get(12));
-              metaElement.setAttribute(NAME_ATTRIBUTE, name);
-              metaElement.setTextContent(value);
-              document.appendChild(metaElement);
-            }
-        }
-      }
-    }
-
-    return getStringFromDocument(doc);
-  }
-
-  /**
-   * <p>Transform a {@code Document} to its XML string representation</p>
-   * @param doc the document to transform
-   * @return the document in the XML-String format
-   */
-  private String getStringFromDocument(Document doc) {
-    try {
-      DOMSource domSource = new DOMSource(doc);
-      StringWriter writer = new StringWriter();
-      StreamResult result = new StreamResult(writer);
-      TransformerFactory tf = TransformerFactory.newInstance();
-      Transformer transformer = tf.newTransformer();
-      //      transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
-      transformer.transform(domSource, result);
-      return writer.toString();
-    } catch (TransformerException ex) {
-      ex.printStackTrace();
-      return null;
-    }
-
-  }
-}
diff --git a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxException.java b/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxException.java
deleted file mode 100644
index 2888d8d..0000000
--- a/connectors/searchblox/connector/src/main/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxException.java
+++ /dev/null
@@ -1,39 +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 org.apache.manifoldcf.agents.output.searchblox;
-
-
-/**
- * @author Rafa Haro <rharo@apache.org>
- */
-public class SearchBloxException
-    extends Exception {
-
-  private static final long serialVersionUID = -6792055510634993398L;
-
-  public SearchBloxException(String reason, Throwable cause) {
-    super(reason, cause);
-  }
-
-  public SearchBloxException(String reason) {
-    super(reason);
-  }
-
-  public SearchBloxException(Throwable cause) {
-    super(cause);
-  }
-}
diff --git a/connectors/searchblox/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/searchblox/common_en_US.properties b/connectors/searchblox/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/searchblox/common_en_US.properties
deleted file mode 100644
index 3a968b2..0000000
--- a/connectors/searchblox/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/searchblox/common_en_US.properties
+++ /dev/null
@@ -1,38 +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.
-
-SearchBloxConnector.Parameters=SearchBlox Settings
-SearchBloxConnector.Configuration=SearchBlox
-
-SearchBloxConnector.ApiKey=Api Key
-SearchBloxConnector.Endpoint=Endpoint
-
-
-SearchBloxConnector.PleaseSupplyValidEndpoint=Endpoint can't be empty. Please supply a valid endpoint
-SearchBloxConnector.PleaseSupplyValidApiKey=Api Key can't be empty. Please supply a valid api key
-
-SearchBloxConnector.IndexFormat=Indexing format
-SearchBloxConnector.JSON=JSON
-SearchBloxConnector.XML=XML
-
-SearchBloxConnector.TitleBoost=Title boost
-SearchBloxConnector.ContentBoost=Content Boost
-SearchBloxConnector.KeywordsBoost=Keyword Boost
-SearchBloxConnector.DescriptionBoost=Description Boost
-
-SearchBloxConnector.PoolSize=Pool Size
-SearchBloxConnector.TimeoutConnection=Timeout Connection
-SearchBloxConnector.TimeoutSocket=Timeout Socket
-SearchBloxConnector.Collection=Collection Name
diff --git a/connectors/searchblox/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/searchblox/common_es_ES.properties b/connectors/searchblox/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/searchblox/common_es_ES.properties
deleted file mode 100644
index 1124d27..0000000
--- a/connectors/searchblox/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/searchblox/common_es_ES.properties
+++ /dev/null
@@ -1,38 +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.
-
-SearchBloxConnector.Parameters=Buscar Ajustes Blox
-SearchBloxConnector.Configuration=Buscar Blox
-
-SearchBloxConnector.ApiKey=clave api
-SearchBloxConnector.Endpoint=Punto final
-
-
-SearchBloxConnector.PleaseSupplyValidEndpoint=Punto de llegada no puede estar vacío. Por favor, facilite un punto final válido
-SearchBloxConnector.PleaseSupplyValidApiKey=Clave de API no puede estar vacío. Por favor suministrar una clave de API válida
-
-SearchBloxConnector.IndexFormat=formato de indexación
-SearchBloxConnector.JSON=JSON
-SearchBloxConnector.XML=XML
-
-SearchBloxConnector.TitleBoost=Título impulso
-SearchBloxConnector.ContentBoost=Boost contenido
-SearchBloxConnector.KeywordsBoost=Boost palabra clave
-SearchBloxConnector.DescriptionBoost=Descripción Boost
-
-SearchBloxConnector.PoolSize=Tamaño de Fondo
-SearchBloxConnector.TimeoutConnection=Conexión Tiempo de espera
-SearchBloxConnector.TimeoutSocket=Tiempo de espera de Socket
-SearchBloxConnector.Collection=Nombre de la colección
diff --git a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editConfiguration.js b/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editConfiguration.js
deleted file mode 100644
index 83bc9b3..0000000
--- a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editConfiguration.js
+++ /dev/null
@@ -1,61 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig() {
-  if (editconnection.endpoint) {
-    if (editconnection.endpoint.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SearchBloxConnector.PleaseSupplyValidEndpoint'))");
-      editconnection.endpoint.focus();
-      return false;
-    }
-  }
-  
-  if (editconnection.apikey) {
-    if (editconnection.apikey.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SearchBloxConnector.PleaseSupplyValidApiKey'))");
-      editconnection.apikey.focus();
-      return false;
-    }
-  }
-  
-  return true;
-}
-
-function checkConfigForSave() {
-  if (editconnection.endpoint) {
-    if (editconnection.endpoint.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SearchBloxConnector.PleaseSupplyValidEndpoint'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('SearchBloxConnector.Parameters'))");
-      editconnection.serverlocation.focus();
-      return false;
-    }
-  }
-  if (editconnection.apikey) {
-    if (editconnection.apikey.value == "") {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SearchBloxConnector.PleaseSupplyValidApiKey'))");
-      SelectTab("$Encoder.javascriptBodyEscape($ResourceBundle.getString('SearchBloxConnector.Parameters'))");
-      editconnection.apikey.focus();
-      return false;
-    }
-  }
-
-  return true;
-}
-//-->
-</script>
diff --git a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editConfiguration_Parameters.html b/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editConfiguration_Parameters.html
deleted file mode 100644
index dde5487..0000000
--- a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editConfiguration_Parameters.html
+++ /dev/null
@@ -1,70 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('SearchBloxConnector.Parameters'))
-
-<table class="displaytable">
-  <tr>
-    <td class="description">
-      $Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.ApiKey'))
-    </td>
-    <td class="value"><input name="apikey" type="text"
-      value="$Encoder.attributeEscape($APIKEY)" size="48" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.Endpoint'))</nobr></td>
-    <td class="value"><input name="endpoint" type="text" value="$Encoder.attributeEscape($ENDPOINT)"
-      size="24" /></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.IndexFormat'))</nobr></td>
-    <td class="value">
-      <select name="indexformat">
-  
-        <option value="JSON" #if($INDEXFORMAT == 'JSON') selected="true" #end>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.JSON'))</option>
- 
-        <option value="XML" #if($INDEXFORMAT == 'XML') selected="true" #end>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.XML'))</option>
- 	  </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.TimeoutConnection'))</nobr></td>
-    <td class="value">
-      <input type="text" name="connectiontimeout" size="16" value="$Encoder.attributeEscape($CONNECTIONTIMEOUT)" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.TimeoutSocket'))</nobr></td>
-    <td class="value">
-      <input type="text" name="sockettimeout" size="16" value="$Encoder.attributeEscape($SOCKETTIMEOUT)" />
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="apikey" value="$Encoder.attributeEscape($APIKEY)" />
-<input type="hidden" name="endpoint" value="$Encoder.attributeEscape($ENDPOINT)" />
-<input type="hidden" name="indexformat" value="$Encoder.attributeEscape($INDEXFORMAT)"/>
-<input type="hidden" name="connectiontimeout" value="$Encoder.attributeEscape($CONNECTIONTIMEOUT)"/>
-<input type="hidden" name="sockettimeout" value="$Encoder.attributeEscape($SOCKETTIMEOUT)"/>
-
-
-
-#end
diff --git a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editSpecification.js b/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editSpecification.js
deleted file mode 100644
index 7766a98..0000000
--- a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editSpecification.js
+++ /dev/null
@@ -1,23 +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.

--->

-

-<script type="text/javascript">

-<!--

-

-

-//-->

-</script>

diff --git a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editSpecification_Configuration.html b/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editSpecification_Configuration.html
deleted file mode 100644
index 2feffb8..0000000
--- a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/editSpecification_Configuration.html
+++ /dev/null
@@ -1,63 +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.

--->

-

-#if($TABNAME == $ResourceBundle.getString('SearchBloxConnector.Configuration') && ${SEQNUM} == ${SELECTEDNUM})

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.TitleBoost'))</nobr></td>

-    <td class="value">

-      <input type="text" name="s${SEQNUM}_title_boost" value="$Encoder.attributeEscape($TITLE_BOOST)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.ContentBoost'))</nobr></td>

-    <td class="value">

-      <input type="text" name="s${SEQNUM}_content_boost" value="$Encoder.attributeEscape($CONTENT_BOOST)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.KeywordsBoost'))</nobr></td>

-    <td class="value">

-      <input type="text" name="s${SEQNUM}_keywords_boost" value="$Encoder.attributeEscape($KEYWORDS_BOOST)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.DescriptionBoost'))</nobr></td>

-    <td class="value">

-      <input type="text" name="s${SEQNUM}_description_boost" value="$Encoder.attributeEscape($DESCRIPTION_BOOST)" />

-    </td>

-  </tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.Collection'))</nobr></td>

-    <td class="value">

-      <input type="text" name="s${SEQNUM}_collection" value="$Encoder.attributeEscape($COLLECTION)" />

-    </td>

-  </tr>

-  

-</table>

-      

-#else

-

-<input type="hidden" name="s${SEQNUM}_title_boost" value="${TITLE_BOOST}"/>

-<input type="hidden" name="s${SEQNUM}_content_boost" value="${CONTENT_BOOST}"/>

-<input type="hidden" name="s${SEQNUM}_description_boost" value="${DESCRIPTION_BOOST}"/>

-<input type="hidden" name="s${SEQNUM}_keywords_boost" value="${KEYWORDS_BOOST}"/>

-<input type="hidden" name="s${SEQNUM}_collection" value="${COLLECTION}"/>

-

-#end
\ No newline at end of file
diff --git a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/viewConfiguration.html b/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/viewConfiguration.html
deleted file mode 100644
index 5cd9a90..0000000
--- a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/viewConfiguration.html
+++ /dev/null
@@ -1,40 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.Endpoint'))</nobr>
-    <td class="value">$Encoder.bodyEscape($ENDPOINT)</td>
-  </tr>
-    <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.ApiKey'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($APIKEY)</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.IndexFormat'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($INDEXFORMAT)</td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.TimeoutConnection'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CONNECTIONTIMEOUT)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.TimeoutSocket'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($SOCKETTIMEOUT)</nobr></td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/viewSpecification.html b/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/viewSpecification.html
deleted file mode 100644
index 35764dc..0000000
--- a/connectors/searchblox/connector/src/main/resources/org/apache/manifoldcf/agents/output/searchblox/viewSpecification.html
+++ /dev/null
@@ -1,47 +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.

--->

-

-<table class="displaytable">

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.TitleBoost'))</nobr></td>

-    <td class="value"><nobr>$Encoder.bodyEscape($TITLE_BOOST)</nobr></td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.ContentBoost'))</nobr></td>

-    <td class="value"><nobr>$Encoder.bodyEscape($CONTENT_BOOST)</nobr></td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.KeywordsBoost'))</nobr></td>

-    <td class="value"><nobr>$Encoder.bodyEscape($KEYWORDS_BOOST)</nobr></td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.DescriptionBoost'))</nobr></td>

-    <td class="value"><nobr>$Encoder.bodyEscape($DESCRIPTION_BOOST)</nobr></td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

-  <tr>

-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SearchBloxConnector.Collection'))</nobr></td>

-    <td class="value"><nobr>$Encoder.bodyEscape($COLLECTION)</nobr></td>

-  </tr>

-  <tr><td class="separator" colspan="2"><hr/></td></tr>

- 

-

-</table>

diff --git a/connectors/searchblox/connector/src/test/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxDocumentTest.java b/connectors/searchblox/connector/src/test/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxDocumentTest.java
deleted file mode 100644
index a6520d6..0000000
--- a/connectors/searchblox/connector/src/test/java/org/apache/manifoldcf/agents/output/searchblox/SearchBloxDocumentTest.java
+++ /dev/null
@@ -1,328 +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 org.apache.manifoldcf.agents.output.searchblox;
-
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.DocumentAction;
-import org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.IndexingFormat;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.junit.Before;
-import org.junit.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-import static org.apache.manifoldcf.agents.output.searchblox.SearchBloxConfig.*;
-import static org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class SearchBloxDocumentTest {
-    private SearchBloxDocument toTest;
-    @Before
-   public void setUp() throws ManifoldCFException {
-       Map<String, List<String>> args=initArgs();
-       String apikey="apikey";
-        RepositoryDocument rd=initRepoDocument();
-       String docURI = "URI";
-       toTest=new SearchBloxDocument(apikey, docURI,rd,args);
-   }
-
-    @Test
-    public void updateXmlString() throws SearchBloxException, ParserConfigurationException, SAXException, IOException {
-        String xmlGenerated = toTest.toString(IndexingFormat.XML, DocumentAction.ADD_UPDATE);
-
-        InputSource is = new InputSource(new ByteArrayInputStream(xmlGenerated.getBytes(StandardCharsets.UTF_8)));
-
-        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
-        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
-        Document doc = dBuilder.parse(is);
-        doc.getDocumentElement().normalize();
-
-        Element root = doc.getDocumentElement();
-        assertEquals("searchblox", root.getNodeName());
-        assertEquals("apikey", root.getAttribute(APIKEY_ATTRIBUTE));
-
-        assertEquals(1, root.getElementsByTagName("document").getLength());
-        assertEquals(Node.ELEMENT_NODE, root.getElementsByTagName("document").item(0).getNodeType());
-
-        Element document = (Element) root.getElementsByTagName("document").item(0);
-        assertEquals("collection1", document.getAttribute(COLNAME_ATTRIBUTE));
-
-        NodeList nList = document.getChildNodes();
-        assertEquals(18, nList.getLength());
-
-        nList = document.getElementsByTagName(UID_ATTRIBUTE);
-        assertEquals(1, nList.getLength());
-        assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType());
-        assertEquals("URI", nList.item(0).getTextContent());
-
-        nList = document.getElementsByTagName("title");
-        assertEquals(1, nList.getLength());
-        assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType());
-        assertEquals("I am a nice title", nList.item(0).getTextContent());
-        assertEquals("1", ((Element) nList.item(0)).getAttribute(BOOST_ATTRIBUTE));
-
-        nList = document.getElementsByTagName("content");
-        assertEquals(1, nList.getLength());
-        assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType());
-        assertEquals("I am a nice content in english!", nList.item(0).getTextContent());
-        assertEquals("2", ((Element) nList.item(0)).getAttribute(BOOST_ATTRIBUTE));
-
-        nList = document.getElementsByTagName("description");
-        assertEquals(1, nList.getLength());
-        assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType());
-        assertEquals("I am a little tiny description", nList.item(0).getTextContent());
-        assertEquals("4", ((Element) nList.item(0)).getAttribute(BOOST_ATTRIBUTE));
-
-        nList = document.getElementsByTagName("size");
-        assertEquals(1, nList.getLength());
-        assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType());
-        assertEquals("100", nList.item(0).getTextContent());
-
-        nList = document.getElementsByTagName("contenttype");
-        assertEquals(1, nList.getLength());
-        assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType());
-        assertEquals("html", nList.item(0).getTextContent());
-
-        nList = document.getElementsByTagName("meta");
-        assertEquals(12, nList.getLength());
-
-        assertTrue(find(nList, "meta2", "I am META2!"));
-        assertTrue(find(nList, "meta1", "I am META1!"));
-
-        assertTrue(find(nList, "share_allow", "user1"));
-        assertTrue(find(nList, "share_allow", "user2"));
-        assertTrue(find(nList, "share_allow", "user3"));
-
-        assertTrue(find(nList, "document_deny", "user42"));
-        assertTrue(find(nList, "document_deny", "user52"));
-
-        assertTrue(find(nList, "share_deny", "user5"));
-        assertTrue(find(nList, "share_deny", "user4"));
-
-        assertTrue(find(nList, "document_allow", "user22"));
-        assertTrue(find(nList, "document_allow", "user33"));
-        assertTrue(find(nList, "document_allow", "user12"));
-
-
-    }
-
-    private boolean find(NodeList nList, String name, String textContent) {
-        for (int i = 0; i < nList.getLength(); i++) {
-            Node node = nList.item(i);
-
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                Element element = (Element) node;
-
-                if (name.equals(element.getAttribute(NAME_ATTRIBUTE)) && textContent.equals(element.getTextContent()))
-                    return true;
-            }
-        }
-        return false;
-    }
-
-    @Test
-    public void updateJsonString() throws Exception {
-
-        String jsonGenerated = toTest.toString(IndexingFormat.JSON, DocumentAction.ADD_UPDATE);
-
-        final JSONParser parser = new JSONParser();
-        JSONObject json = (JSONObject)parser.parse(new java.io.StringReader(jsonGenerated));
-
-        assertTrue(json.get(APIKEY_ATTRIBUTE) != null);
-        assertTrue(json.get("document") != null);
-
-        Object apiObject = json.get(APIKEY_ATTRIBUTE);
-        assertTrue(apiObject instanceof String);
-        assertEquals("apikey", apiObject);
-
-        Object documentObject = json.get("document");
-        assertTrue(documentObject instanceof JSONObject);
-        JSONObject document = (JSONObject) documentObject;
-
-        assertTrue(document.get(UID_ATTRIBUTE) != null);
-        assertTrue(document.get(UID_ATTRIBUTE) instanceof String);
-        assertEquals("URI", document.get(UID_ATTRIBUTE));
-
-
-        assertTrue(document.get(COLNAME_ATTRIBUTE)  != null);
-        assertTrue(document.get(COLNAME_ATTRIBUTE) instanceof String);
-        assertEquals("collection1", document.get(COLNAME_ATTRIBUTE));
-
-
-        assertTrue(document.get("size") != null);
-        assertTrue(document.get("size") instanceof String);
-        assertEquals("100", document.get("size"));
-
-        assertTrue(document.get("meta") != null);
-        Object metaObject = document.get("meta");
-        assertTrue(metaObject instanceof JSONObject);
-        JSONObject meta = (JSONObject) metaObject;
-        assertEquals(6, meta.size());
-
-        assertTrue(find(meta, "meta2", "I am META2!", 1));
-        assertTrue(find(meta, "meta1", "I am META1!", 1));
-
-        assertTrue(find(meta, "share_allow", "user1", 3));
-        assertTrue(find(meta, "share_allow", "user2", 3));
-        assertTrue(find(meta, "share_allow", "user3", 3));
-
-        assertTrue(find(meta, "document_deny", "user42", 2));
-        assertTrue(find(meta, "document_deny", "user52", 2));
-
-        assertTrue(find(meta, "share_deny", "user5", 2));
-        assertTrue(find(meta, "share_deny", "user4", 2));
-
-        assertTrue(find(meta, "document_allow", "user22", 3));
-        assertTrue(find(meta, "document_allow", "user33", 3));
-        assertTrue(find(meta, "document_allow", "user12", 3));
-
-
-        assertTrue(document.get("description") != null);
-        assertTrue(document.get("description") instanceof String);
-        assertEquals("I am a little tiny description", document.get("description"));
-
-
-        assertTrue(document.get("title") != null);
-        assertTrue(document.get("title") instanceof String);
-        assertEquals("I am a nice title", document.get("title"));
-
-        assertTrue(document.get("content") != null);
-        assertTrue(document.get("content") instanceof String);
-        assertEquals("I am a nice content in english!", document.get("content"));
-
-        assertTrue(document.get("contenttype") != null);
-        assertTrue(document.get("contenttype") instanceof String);
-        assertEquals("html", document.get("contenttype"));
-    }
-
-    private boolean find(JSONObject meta, String name, String textContent, int size) {
-
-        assertTrue(meta.get(name) != null);
-        assertTrue(meta.get(name) instanceof JSONArray);
-
-        assertEquals(size, ((JSONArray) meta.get(name)).size());
-
-        for (int i = 0; i < size; i++) {
-            if (textContent.equals(((JSONArray) meta.get(name)).get(i).toString()))
-                return true;
-        }
-        return false;
-    }
-
-    @Test
-    public void deleteJsonString() throws Exception {
-        String jsonGenerated=toTest.toString(IndexingFormat.JSON, DocumentAction.DELETE);
-
-        final JSONParser parser = new JSONParser();
-        JSONObject json = (JSONObject)parser.parse(new java.io.StringReader(jsonGenerated));
-
-        assertTrue(json.get(APIKEY_ATTRIBUTE) != null);
-        assertTrue(json.get("document") != null);
-
-        Object apiObject = json.get(APIKEY_ATTRIBUTE);
-        assertTrue(apiObject instanceof String);
-        assertEquals("apikey", apiObject);
-
-        Object documentObject = json.get("document");
-        assertTrue(documentObject instanceof JSONObject);
-        JSONObject document = (JSONObject) documentObject;
-
-        assertTrue(document.get(UID_ATTRIBUTE) != null);
-        assertTrue(document.get(COLNAME_ATTRIBUTE) != null);
-
-        Object uidObject = document.get(UID_ATTRIBUTE);
-        assertTrue(uidObject instanceof String);
-        assertEquals("URI", uidObject);
-
-        Object colObject = document.get(COLNAME_ATTRIBUTE);
-        assertTrue(colObject instanceof String);
-        assertEquals("collection1", colObject);
-    }
-
-    @Test
-    public void deleteXmlString() throws SearchBloxException, ParserConfigurationException, SAXException, IOException {
-        String xmlGenerated=toTest.toString(IndexingFormat.XML, DocumentAction.DELETE);
-
-        InputSource is = new InputSource(new ByteArrayInputStream(xmlGenerated.getBytes(StandardCharsets.UTF_8)));
-
-        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
-        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
-        Document doc = dBuilder.parse(is);
-        doc.getDocumentElement().normalize();
-
-        Element root = doc.getDocumentElement();
-        assertEquals("searchblox", root.getNodeName());
-        assertEquals("apikey", root.getAttribute(APIKEY_ATTRIBUTE));
-
-        assertEquals(1, root.getElementsByTagName("document").getLength());
-        assertEquals(Node.ELEMENT_NODE, root.getElementsByTagName("document").item(0).getNodeType());
-
-        Element document = (Element) root.getElementsByTagName("document").item(0);
-        assertEquals("collection1", document.getAttribute(COLNAME_ATTRIBUTE));
-        assertEquals("URI", document.getAttribute(UID_ATTRIBUTE));
-    }
-
-    private Map<String, List<String>> initArgs() {
-        Map<String, List<String>> argMap=new HashMap<>();
-        argMap.put(ATTRIBUTE_COLLECTION_NAME, Collections.singletonList("collection1"));
-        argMap.put(ATTRIBUTE_TITLEBOOST, Collections.singletonList("1"));
-        argMap.put(ATTRIBUTE_CONTENTBOOST, Collections.singletonList("2"));
-        argMap.put(ATTRIBUTE_KEYWORDSBOOST, Collections.singletonList("3"));
-        argMap.put(ATTRIBUTE_DESCRIPTIONBOOST, Collections.singletonList("4"));
-        return argMap;
-
-    }
-
-    private RepositoryDocument initRepoDocument() throws ManifoldCFException {
-        RepositoryDocument realRepoDoc=new RepositoryDocument();
-        String binaryContent="I am the binary content of an Amazing Document";
-        InputStream stream = new ByteArrayInputStream(binaryContent.getBytes(StandardCharsets.UTF_8));
-
-        realRepoDoc.addField("title","I am a nice title");
-        realRepoDoc.addField("content","I am a nice content in english!");
-        realRepoDoc.addField("description","I am a little tiny description");
-        realRepoDoc.addField("meta1","I am META1!");
-        realRepoDoc.addField("meta2","I am META2!");
-        realRepoDoc.setMimeType("html");
-        realRepoDoc.setBinary(stream,100);
-        realRepoDoc.setCreatedDate(new Date(System.currentTimeMillis()));
-        realRepoDoc.setSecurityACL(RepositoryDocument.SECURITY_TYPE_SHARE,new String[]{"user1","user2","user3"});
-        realRepoDoc.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,new String[]{"user12","user22","user33"});
-        realRepoDoc.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_SHARE, new String[]{"user4", "user5"});
-        realRepoDoc.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT, new String[]{"user42", "user52"});
-        //allowAttributeName + aclType
-        return realRepoDoc;
-    }
-
-}
diff --git a/connectors/searchblox/pom.xml b/connectors/searchblox/pom.xml
deleted file mode 100644
index 1eb9f09..0000000
--- a/connectors/searchblox/pom.xml
+++ /dev/null
@@ -1,484 +0,0 @@
-<?xml version="1.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.
--->
-
-<project
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>mcf-searchblox-connector</artifactId>
-  <name>ManifoldCF - Connectors - SearchBlox</name>
-
-  <url>http://www.searchblox.com/</url>
-  <properties>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-          <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-          <execution>
-            <id>native2ascii-utf8</id>
-            <goals>
-              <goal>native2ascii</goal>
-            </goals>
-            <configuration>
-              <encoding>UTF8</encoding>
-              <includes>
-                <include>**/*.properties</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <configuration>
-          <finalName>${project.artifactId}</finalName>
-          <descriptorRefs>
-            <descriptorRef>jar-with-dependencies</descriptorRef>
-          </descriptorRefs>
-          <appendAssemblyId>false</appendAssemblyId>
-        </configuration>
-        <executions>
-          <execution>
-            <id>make-assembly</id>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <!--This plugin's configuration is used to store Eclipse m2e settings 
-          only. It has no influence on the Maven build itself. -->
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.apache.maven.plugins
-                    </groupId>
-                    <artifactId>
-                      maven-dependency-plugin
-                    </artifactId>
-                    <versionRange>[2.8,)</versionRange>
-                    <goals>
-                      <goal>copy</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>
-                      native2ascii-maven-plugin
-                    </artifactId>
-                    <versionRange>
-                      [1.0-beta-1,)
-                    </versionRange>
-                    <goals>
-                      <goal>native2ascii</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.apache.maven.plugins
-                    </groupId>
-                    <artifactId>
-                      maven-remote-resources-plugin
-                    </artifactId>
-                    <versionRange>[1.5,)</versionRange>
-                    <goals>
-                      <goal>process</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore></ignore>
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.resteasy</groupId>
-      <artifactId>resteasy-client</artifactId>
-      <version>3.0.16.Final</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-simple</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.resteasy</groupId>
-      <artifactId>resteasy-jaxb-provider</artifactId>
-      <version>3.0.16.Final</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>15.0</version>
-    </dependency>
-    
-    <dependency>
-      <!-- jsoup HTML parser library @ http://jsoup.org/ -->
-      <groupId>org.jsoup</groupId>
-      <artifactId>jsoup</artifactId>
-      <version>1.8.1</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>2.10.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-      <version>1.9.5</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/connectors/sharepoint/.gitignore b/connectors/sharepoint/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/sharepoint/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/sharepoint/build.xml b/connectors/sharepoint/build.xml
deleted file mode 100644
index e83d664..0000000
--- a/connectors/sharepoint/build.xml
+++ /dev/null
@@ -1,129 +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.
--->
-
-<project name="sharepoint" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <!-- target name="calculate-condition">
-        <available file="lib-proprietary/DspSts.wsdl" property="DspStsStatus"/>
-        <available file="lib-proprietary/Lists.wsdl" property="ListsStatus"/>
-        <available file="lib-proprietary/Permissions.wsdl" property="PermissionsStatus"/>
-        <available file="lib-proprietary/usergroup.wsdl" property="usergroupStatus"/>
-        <available file="lib-proprietary/versions.wsdl" property="versionsStatus"/>
-        <available file="lib-proprietary/webs.wsdl" property="websStatus"/>
-        <condition property="canBuild">
-            <and>
-                <isset property="DspStsStatus"/>
-                <isset property="ListsStatus"/>
-                <isset property="PermissionsStatus"/>
-                <isset property="usergroupStatus"/>
-                <isset property="versionsStatus"/>
-                <isset property="websStatus"/>
-            </and>
-        </condition>
-    </target>
-    
-    <target name="precompile-check" depends="calculate-condition" unless="canBuild">
-        <echo message="SharePoint Connector cannot be built without DspSts.wsdl, Lists.wsdl, Permissions.wsdl, usergroup.wsdl, versions.wsdl, and webs.wsdl"/>
-    </target -->
-
-    <target name="classcreate-wsdls" depends="precompile-check" if="canBuild">
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/DspSts.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/Lists.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/MCPermissions.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/Permissions.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/usergroup.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/versions.wsdl"/>
-        </antcall>
-        <antcall target="classcreate-wsdl">
-            <param name="wsdlname" value="wsdls/webs.wsdl"/>
-        </antcall>
-    </target>
-
-    <target name="integration">
-        <mkdir dir="dist/integration/sharepoint-2007"/>
-        <copy todir="dist/integration/sharepoint-2007">
-          <fileset dir="../../lib/sharepoint-2007"/>
-        </copy>
-        <mkdir dir="dist/integration/sharepoint-2010"/>
-        <copy todir="dist/integration/sharepoint-2010">
-          <fileset dir="../../lib/sharepoint-2010"/>
-        </copy>
-        <mkdir dir="dist/integration/sharepoint-2013"/>
-        <copy todir="dist/integration/sharepoint-2013">
-          <fileset dir="../../lib/sharepoint-2013"/>
-        </copy>
-        <mkdir dir="dist/integration/sharepoint-2016"/>
-        <copy todir="dist/integration/sharepoint-2016">
-          <fileset dir="../../lib/sharepoint-2016"/>
-        </copy>
-    </target>
-
-    <!-- target name="download-dependencies">
-        <get src="http://www.wssdemo.com/_vti_bin/Permissions.asmx?wsdl=true" dest="lib-proprietary/Permissions.wsdl"/>
-        <get src="http://www.wssdemo.com/_vti_bin/DspSts.asmx?wsdl=true" dest="lib-proprietary/DspSts.wsdl"/>
-        <get src="http://www.wssdemo.com/_vti_bin/Lists.asmx?wsdl=true" dest="lib-proprietary/Lists.wsdl"/>
-        <get src="http://www.wssdemo.com/_vti_bin/usergroup.asmx?wsdl=true" dest="lib-proprietary/usergroup.wsdl"/>
-        <get src="http://www.wssdemo.com/_vti_bin/versions.asmx?wsdl=true" dest="lib-proprietary/versions.wsdl"/>
-        <get src="http://www.wssdemo.com/_vti_bin/webs.asmx?wsdl=true" dest="lib-proprietary/webs.wsdl"/>
-    </target>
-
-    <target name="download-cleanup">
-        <delete>
-            <fileset dir="lib-proprietary" excludes="README.txt"/>
-        </delete>
-    </target -->
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="SharePoint"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.sharepoint.SharePointRepository"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="SharePoint/ActiveDirectory"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.sharepoint.SharePointADAuthority"/>
-        </antcall>
-        <antcall target="general-add-authority-connector">
-            <param name="connector-label" value="SharePoint/Native"/>
-            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.sharepoint.SharePointAuthority"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/Messages.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/Messages.java
deleted file mode 100644
index 5385b1c..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.sharepoint;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.authorities.authorities.sharepoint.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.authorities.authorities.sharepoint";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SPSProxyHelper.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SPSProxyHelper.java
deleted file mode 100644
index 852987b..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SPSProxyHelper.java
+++ /dev/null
@@ -1,676 +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 org.apache.manifoldcf.authorities.authorities.sharepoint;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.*;
-
-import java.io.InputStream;
-
-import javax.xml.soap.*;
-
-import org.apache.manifoldcf.core.common.XMLDoc;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.authorities.system.Logging;
-
-import com.microsoft.schemas.sharepoint.dsp.*;
-import com.microsoft.schemas.sharepoint.soap.*;
-
-import org.apache.http.client.HttpClient;
-
-import org.apache.axis.EngineConfiguration;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axis.message.MessageElement;
-import org.apache.axis.AxisEngine;
-import org.apache.axis.ConfigurationException;
-import org.apache.axis.Handler;
-import org.apache.axis.WSDDEngineConfiguration;
-import org.apache.axis.components.logger.LogFactory;
-import org.apache.axis.deployment.wsdd.WSDDDeployment;
-import org.apache.axis.deployment.wsdd.WSDDDocument;
-import org.apache.axis.deployment.wsdd.WSDDGlobalConfiguration;
-import org.apache.axis.encoding.TypeMappingRegistry;
-import org.apache.axis.handlers.soap.SOAPService;
-import org.apache.axis.utils.Admin;
-import org.apache.axis.utils.Messages;
-import org.apache.axis.utils.XMLUtils;
-import org.w3c.dom.Document;
-
-/**
-*
-* @author Michael Cummings
-*
-*/
-public class SPSProxyHelper {
-
-
-  public static final String HTTPCLIENT_PROPERTY = org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender.HTTPCLIENT_PROPERTY;
-
-  private final String serverUrl;
-  private final String serverLocation;
-  private final String decodedServerLocation;
-  private final String baseUrl;
-  private final String userName;
-  private final String password;
-  private final boolean isClaimSpace;
-  private final EngineConfiguration configuration;
-  private final HttpClient httpClient;
-
-  /**
-  *
-  * @param serverUrl
-  * @param userName
-  * @param password
-  */
-  public SPSProxyHelper( String serverUrl, String serverLocation, String decodedServerLocation, String userName, String password,
-    Class resourceClass, String configFileName, HttpClient httpClient, boolean isClaimSpace )
-  {
-    this.serverUrl = serverUrl;
-    this.serverLocation = serverLocation;
-    this.decodedServerLocation = decodedServerLocation;
-    if (serverLocation.equals("/"))
-      baseUrl = serverUrl;
-    else
-      baseUrl = serverUrl + serverLocation;
-    this.userName = userName;
-    this.password = password;
-    this.configuration = new ResourceProvider(resourceClass,configFileName);
-    this.httpClient = httpClient;
-    this.isClaimSpace = isClaimSpace;
-  }
-
-  /**
-  * Get the access tokens for a user principal.
-  */
-  public List<String> getAccessTokens( String site, String userLoginName )
-    throws ManifoldCFException
-  {
-    try
-    {
-      if ( site.compareTo("/") == 0 )
-        site = ""; // root case
-
-      userLoginName = mapToClaimSpace(userLoginName);
-      
-      UserGroupWS userService = new UserGroupWS( baseUrl + site, userName, password, configuration, httpClient  );
-      com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall = userService.getUserGroupSoapHandler( );
-
-      com.microsoft.schemas.sharepoint.soap.directory.GetUserInfoResponseGetUserInfoResult userResp = userCall.getUserInfo( userLoginName );
-      org.apache.axis.message.MessageElement[] usersList = userResp.get_any();
-
-      /* Response looks like this:
-          <GetUserInfo xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/">
-             <User ID="4" Sid="S-1-5-21-2127521184-1604012920-1887927527-34577" Name="User1_Display_Name" 
-                LoginName="DOMAIN\User1_Alias" Email="User1_E-mail" 
-                Notes="Notes" IsSiteAdmin="False" IsDomainGroup="False" />
-          </GetUserInfo>
-        */
-
-      if (usersList.length != 1)
-        throw new ManifoldCFException("Bad response - expecting one outer 'GetUserInfo' node, saw "+Integer.toString(usersList.length));
-      
-      if (Logging.authorityConnectors.isDebugEnabled()){
-        Logging.authorityConnectors.debug("SharePoint authority: getUserInfo xml response: '" + usersList[0].toString() + "'");
-      }
-
-      MessageElement users = usersList[0];
-      if (!users.getElementName().getLocalName().equals("GetUserInfo"))
-        throw new ManifoldCFException("Bad response - outer node should have been 'GetUserInfo' node");
-          
-      String userID = null;
-      String userName = null;
-      
-      Iterator userIter = users.getChildElements();
-      while (userIter.hasNext())
-      {
-        MessageElement child = (MessageElement)userIter.next();
-        if (child.getElementName().getLocalName().equals("User"))
-        {
-          userID = child.getAttribute("ID");
-          userName = child.getAttribute("LoginName");
-        }
-      }
-
-      // If userID is null, no such user
-      if (userID == null)
-        return null;
-
-      List<String> accessTokens = new ArrayList<String>();
-      accessTokens.add("U"+userName);
-      
-      com.microsoft.schemas.sharepoint.soap.directory.GetGroupCollectionFromUserResponseGetGroupCollectionFromUserResult userGroupResp =
-        userCall.getGroupCollectionFromUser( userLoginName );
-      org.apache.axis.message.MessageElement[] groupsList = userGroupResp.get_any();
-      
-      /* Response looks like this:
-          <GetGroupCollectionFromUser xmlns=
-             "http://schemas.microsoft.com/sharepoint/soap/directory/">
-             <Groups>
-                <Group ID="3" Name="Group1" Description="Description" OwnerID="1" 
-                   OwnerIsUser="False" />
-                <Group ID="15" Name="Group2" Description="Description" 
-                   OwnerID="12" OwnerIsUser="True" />
-                <Group ID="16" Name="Group3" Description="Description" 
-                   OwnerID="7" OwnerIsUser="False" />
-             </Groups>
-          </GetGroupCollectionFromUser>
-        */
-
-      if (groupsList.length != 1)
-        throw new ManifoldCFException("Bad response - expecting one outer 'GetGroupCollectionFromUser' node, saw "+Integer.toString(groupsList.length));
-
-      if (Logging.authorityConnectors.isDebugEnabled()){
-        Logging.authorityConnectors.debug("SharePoint authority: getGroupCollectionFromUser xml response: '" + groupsList[0].toString() + "'");
-      }
-
-      MessageElement groups = groupsList[0];
-      if (!groups.getElementName().getLocalName().equals("GetGroupCollectionFromUser"))
-        throw new ManifoldCFException("Bad response - outer node should have been 'GetGroupCollectionFromUser' node");
-          
-      Iterator groupsIter = groups.getChildElements();
-      while (groupsIter.hasNext())
-      {
-        MessageElement child = (MessageElement)groupsIter.next();
-        if (child.getElementName().getLocalName().equals("Groups"))
-        {
-          Iterator groupIter = child.getChildElements();
-          while (groupIter.hasNext())
-          {
-            MessageElement group = (MessageElement)groupIter.next();
-            if (group.getElementName().getLocalName().equals("Group"))
-            {
-              String groupID = group.getAttribute("ID");
-              String groupName = group.getAttribute("Name");
-              // Add to the access token list
-              accessTokens.add("G"+groupName);
-            }
-          }
-        }
-      }
-
-      // AxisFault is expected for case where user has no assigned roles
-      try
-      {
-        com.microsoft.schemas.sharepoint.soap.directory.GetRoleCollectionFromUserResponseGetRoleCollectionFromUserResult userRoleResp =
-          userCall.getRoleCollectionFromUser( userLoginName );
-        org.apache.axis.message.MessageElement[] rolesList = userRoleResp.get_any();
-
-        if (rolesList.length != 1)
-          throw new ManifoldCFException("Bad response - expecting one outer 'GetRoleCollectionFromUser' node, saw "+Integer.toString(rolesList.length));
-        
-        if (Logging.authorityConnectors.isDebugEnabled()){
-          Logging.authorityConnectors.debug("SharePoint authority: getRoleCollectionFromUser xml response: '" + rolesList[0].toString() + "'");
-        }
-
-        // Not specified in doc and must be determined experimentally
-        /*
-<ns1:GetRoleCollectionFromUser xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/directory/">
-  <ns1:Roles>
-    <ns1:Role ID="1073741825" Name="Limited Access" Description="Can view specific lists, document libraries, list items, folders, or documents when given permissions."
-      Order="160" Hidden="True" Type="Guest" BasePermissions="ViewFormPages, Open, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs"/>
-  </ns1:Roles>
-</ns1:GetRoleCollectionFromUser>'
-        */
-        
-        MessageElement roles = rolesList[0];
-        if (!roles.getElementName().getLocalName().equals("GetRoleCollectionFromUser"))
-          throw new ManifoldCFException("Bad response - outer node should have been 'GetRoleCollectionFromUser' node");
-            
-        Iterator rolesIter = roles.getChildElements();
-        while (rolesIter.hasNext())
-        {
-          MessageElement child = (MessageElement)rolesIter.next();
-          if (child.getElementName().getLocalName().equals("Roles"))
-          {
-            Iterator roleIter = child.getChildElements();
-            while (roleIter.hasNext())
-            {
-              MessageElement role = (MessageElement)roleIter.next();
-              if (role.getElementName().getLocalName().equals("Role"))
-              {
-                String roleID = role.getAttribute("ID");
-                String roleName = role.getAttribute("Name");
-                // Add to the access token list
-                accessTokens.add("R"+roleName);
-              }
-            }
-          }
-        }
-      }
-      catch (org.apache.axis.AxisFault e)
-      {
-        if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-        {
-          org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-          if (elem != null)
-          {
-            elem.normalize();
-            String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-            if (!sharepointErrorCode.equals("0x80131600"))
-              throw e;
-          }
-        }
-        else
-          throw e;
-      }
-      
-      return accessTokens;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("SharePoint: Got a service exception getting the acls for site "+site,e);
-      throw new ManifoldCFException("Service exception: "+e.getMessage(), e);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (httpErrorCode.equals("404"))
-          {
-            // Page did not exist
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("SharePoint: The page at "+baseUrl+site+" did not exist");
-            throw new ManifoldCFException("The page at "+baseUrl+site+" did not exist");
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to get the acls
-            if (Logging.authorityConnectors.isDebugEnabled())
-              Logging.authorityConnectors.debug("SharePoint: The user did not have access to the usergroups service for "+baseUrl+site);
-            throw new ManifoldCFException("The user did not have access to the usergroups service at "+baseUrl+site);
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x80131600"))
-          {
-            // No such user
-            return null;
-          }
-          if (Logging.authorityConnectors.isDebugEnabled())
-          {
-            org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-            String errorString = "";
-            if (elem != null)
-              errorString = elem2.getFirstChild().getNodeValue().trim();
-
-            Logging.authorityConnectors.debug("SharePoint: Getting usergroups in site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString,e);
-          }
-          throw new ManifoldCFException("SharePoint server error code: "+sharepointErrorCode);
-        }
-        if (Logging.authorityConnectors.isDebugEnabled())
-          Logging.authorityConnectors.debug("SharePoint: Unknown SharePoint server error getting usergroups for site "+site+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-
-        throw new ManifoldCFException("Unknown SharePoint server error: "+e.getMessage());
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("SharePoint: Got an unknown remote exception getting usergroups for "+site+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(), e);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("SharePoint: Got an unexpected remote exception usergroups for site "+site,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-  /**
-  *
-  * @return true if connection OK
-  * @throws java.net.MalformedURLException
-  * @throws javax.xml.rpc.ServiceException
-  * @throws java.rmi.RemoteException
-  */
-  public boolean checkConnection( String site )
-    throws ManifoldCFException
-  {
-    try
-    {
-      if (site.equals("/"))
-        site = "";
-
-      UserGroupWS userService = new UserGroupWS( baseUrl + site, userName, password, configuration, httpClient  );
-      com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall = userService.getUserGroupSoapHandler( );
-
-      // Get the info for the admin user
-      com.microsoft.schemas.sharepoint.soap.directory.GetUserInfoResponseGetUserInfoResult userResp = userCall.getUserInfo( mapToClaimSpace(userName) );
-      org.apache.axis.message.MessageElement[] userList = userResp.get_any();
-
-      return true;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.authorityConnectors.isDebugEnabled())
-        Logging.authorityConnectors.debug("SharePoint: Got a service exception checking connection",e);
-      throw new ManifoldCFException("Service exception: "+e.getMessage(), e);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (httpErrorCode.equals("404"))
-          {
-            // Page did not exist
-            throw new ManifoldCFException("The site at "+baseUrl+site+" did not exist");
-          }
-          else if (httpErrorCode.equals("401"))
-            throw new ManifoldCFException("User did not authenticate properly, or has insufficient permissions to access "+baseUrl+site+": "+e.getMessage(),e);
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-          String errorString = "";
-          if (elem != null)
-            errorString = elem2.getFirstChild().getNodeValue().trim();
-
-          throw new ManifoldCFException("Accessing site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString,e);
-        }
-        throw new ManifoldCFException("Unknown SharePoint server error accessing site "+site+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      throw new ManifoldCFException("Got an unknown remote exception accessing site "+site+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      throw new ManifoldCFException("Got an unexpected remote exception accessing site "+site+": "+e.getMessage(),e);
-    }
-  }
-  
-  /** Conditionally map SharePoint user login name to claim space.
-  */
-  protected String mapToClaimSpace(String userLoginName)
-  {
-    if (isClaimSpace)
-    {
-      return "i:0#.w|" + userLoginName.toLowerCase(java.util.Locale.ROOT);
-    }
-    return userLoginName;
-  }
-
-  /**
-  * SharePoint UserGroup Service Wrapper Class
-  */
-  protected static class UserGroupWS extends com.microsoft.schemas.sharepoint.soap.directory.UserGroupLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = -2052484076803624502L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public UserGroupWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/usergroup.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap getUserGroupSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoapStub _stub = new com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoapStub(endPoint, this);
-      _stub.setPortName(getUserGroupSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /** Implementation of EngineConfiguration that we'll use to get the wsdd file from a
-  * local resource.
-  */
-  protected static class ResourceProvider implements WSDDEngineConfiguration
-  {
-    private WSDDDeployment deployment = null;
-
-    private Class resourceClass;
-    private String resourceName;
-
-    /**
-     * Constructor setting the resource name.
-     */
-    public ResourceProvider(Class resourceClass, String resourceName)
-    {
-      this.resourceClass = resourceClass;
-      this.resourceName = resourceName;
-    }
-
-    public WSDDDeployment getDeployment() {
-        return deployment;
-    }
-
-    public void configureEngine(AxisEngine engine)
-      throws ConfigurationException
-    {
-      try
-      {
-        InputStream resourceStream = resourceClass.getResourceAsStream(resourceName);
-        if (resourceStream == null)
-          throw new ConfigurationException("Resource not found: '"+resourceName+"'");
-        try
-        {
-          WSDDDocument doc = new WSDDDocument(XMLUtils.newDocument(resourceStream));
-          deployment = doc.getDeployment();
-
-          deployment.configureEngine(engine);
-          engine.refreshGlobalOptions();
-        }
-        finally
-        {
-          resourceStream.close();
-        }
-      }
-      catch (ConfigurationException e)
-      {
-        throw e;
-      }
-      catch (Exception e)
-      {
-        throw new ConfigurationException(e);
-      }
-    }
-
-    public void writeEngineConfig(AxisEngine engine)
-      throws ConfigurationException
-    {
-      // Do nothing
-    }
-
-    /**
-     * retrieve an instance of the named handler
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public Handler getHandler(QName qname) throws ConfigurationException
-    {
-      return deployment.getHandler(qname);
-    }
-
-    /**
-     * retrieve an instance of the named service
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public SOAPService getService(QName qname) throws ConfigurationException
-    {
-      SOAPService service = deployment.getService(qname);
-      if (service == null)
-      {
-        throw new ConfigurationException(Messages.getMessage("noService10",
-          qname.toString()));
-      }
-      return service;
-    }
-
-    /**
-     * Get a service which has been mapped to a particular namespace
-     *
-     * @param namespace a namespace URI
-     * @return an instance of the appropriate Service, or null
-     */
-    public SOAPService getServiceByNamespaceURI(String namespace)
-      throws ConfigurationException
-    {
-      return deployment.getServiceByNamespaceURI(namespace);
-    }
-
-    /**
-     * retrieve an instance of the named transport
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public Handler getTransport(QName qname) throws ConfigurationException
-    {
-      return deployment.getTransport(qname);
-    }
-
-    public TypeMappingRegistry getTypeMappingRegistry()
-        throws ConfigurationException
-    {
-      return deployment.getTypeMappingRegistry();
-    }
-
-    /**
-     * Returns a global request handler.
-     */
-    public Handler getGlobalRequest() throws ConfigurationException
-    {
-      return deployment.getGlobalRequest();
-    }
-
-    /**
-     * Returns a global response handler.
-     */
-    public Handler getGlobalResponse() throws ConfigurationException
-    {
-      return deployment.getGlobalResponse();
-    }
-
-    /**
-     * Returns the global configuration options.
-     */
-    public Hashtable getGlobalOptions() throws ConfigurationException
-    {
-      WSDDGlobalConfiguration globalConfig = deployment.getGlobalConfiguration();
-
-      if (globalConfig != null)
-        return globalConfig.getParametersTable();
-
-      return null;
-    }
-
-    /**
-     * Get an enumeration of the services deployed to this engine
-     */
-    public Iterator getDeployedServices() throws ConfigurationException
-    {
-      return deployment.getDeployedServices();
-    }
-
-    /**
-     * Get a list of roles that this engine plays globally.  Services
-     * within the engine configuration may also add additional roles.
-     *
-     * @return a <code>List</code> of the roles for this engine
-     */
-    public List getRoles()
-    {
-      return deployment.getRoles();
-    }
-  }
-
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointADAuthority.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointADAuthority.java
deleted file mode 100644
index aef67ab..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointADAuthority.java
+++ /dev/null
@@ -1,1107 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.sharepoint;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import java.util.concurrent.TimeUnit;
-import javax.naming.*;
-import javax.naming.ldap.*;
-import javax.naming.directory.*;
-
-
-/** This is the Active Directory implementation of the IAuthorityConnector interface, as used
-* by SharePoint in Claim Space.  It is meant to be used in conjunction with other SharePoint authorities,
-* and should ONLY be used if SharePoint native authorization is being performed in ClaimSpace mode.
-*/
-public class SharePointADAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Data from the parameters
-  
-  /** The list of suffixes and the associated domain controllers */
-  private List<DCRule> dCRules = null;
-  /** How to create a connection for a DC, keyed by DC name */
-  private Map<String,DCConnectionParameters> dCConnectionParameters = null;
-  
-  private boolean hasSessionParameters = false;
-  private String cacheLifetime = null;
-  private String cacheLRUsize = null;
-  private long responseLifetime = 60000L;
-  private int LRUsize = 1000;
-
-  /** Session information for all DC's we talk with. */
-  private Map<String,DCSessionInfo> sessionInfo = null;
-  
-  /** Cache manager. */
-  private ICacheManager cacheManager = null;
-  
-  /** The length of time in milliseconds that an connection remains idle before expiring.  Currently 5 minutes. */
-  private static final long ADExpirationInterval = 300000L;
-  
-  /** Constructor.
-  */
-  public SharePointADAuthority()
-  {
-  }
-
-  /** Set thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-  
-  /** Clear thread context.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    cacheManager = null;
-  }
-  
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-
-    // Allocate the session data, currently empty
-    sessionInfo = new HashMap<String,DCSessionInfo>();
-    
-    // Set up the DC param set, and the rules
-    dCRules = new ArrayList<DCRule>();
-    dCConnectionParameters = new HashMap<String,DCConnectionParameters>();
-    // Read DC info from the config parameters
-    for (int i = 0; i < params.getChildCount(); i++)
-    {
-      ConfigNode cn = params.getChild(i);
-      if (cn.getType().equals(SharePointConfig.NODE_DOMAINCONTROLLER))
-      {
-        // Domain controller name is the actual key...
-        String dcName = cn.getAttributeValue(SharePointConfig.ATTR_DOMAINCONTROLLER);
-        // Set up the parameters for the domain controller
-        dCConnectionParameters.put(dcName,new DCConnectionParameters(cn.getAttributeValue(SharePointConfig.ATTR_USERNAME),
-          deobfuscate(cn.getAttributeValue(SharePointConfig.ATTR_PASSWORD)),
-          cn.getAttributeValue(SharePointConfig.ATTR_AUTHENTICATION),
-          cn.getAttributeValue(SharePointConfig.ATTR_USERACLsUSERNAME)));
-        // Order-based rule, as well
-        dCRules.add(new DCRule(cn.getAttributeValue(SharePointConfig.ATTR_SUFFIX),dcName));
-      }
-    }
-    
-    cacheLifetime = params.getParameter(SharePointConfig.PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    cacheLRUsize = params.getParameter(SharePointConfig.PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";    
-  }
-
-  protected static String deobfuscate(String input)
-  {
-    if (input == null)
-      return null;
-    try
-    {
-      return ManifoldCF.deobfuscate(input);
-    }
-    catch (ManifoldCFException e)
-    {
-      return "";
-    }
-  }
-  
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Check connection for sanity.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    // Set up the basic AD session...
-    getSessionParameters();
-    // Clear the DC session info, so we're forced to redo it
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      sessionEntry.getValue().closeConnection();
-    }
-    // Loop through all domain controllers and attempt to establish a session with each one.
-    for (String domainController : dCConnectionParameters.keySet())
-    {
-      createDCSession(domainController);
-    }
-    
-    return super.check();
-  }
-
-  /** Create or lookup a session for a domain controller.
-  */
-  protected LdapContext createDCSession(String domainController)
-    throws ManifoldCFException
-  {
-    getSessionParameters();
-    DCConnectionParameters parms = dCConnectionParameters.get(domainController);
-    // Find the session in the hash, if it exists
-    DCSessionInfo session = sessionInfo.get(domainController);
-    if (session == null)
-    {
-      session = new DCSessionInfo();
-      sessionInfo.put(domainController,session);
-    }
-    return session.getADSession(domainController,parms);
-  }
-  
-  /** Poll.  The connection should be closed if it has been idle for too long.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    long currentTime = System.currentTimeMillis();
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      sessionEntry.getValue().closeIfExpired(currentTime);
-    }
-    super.poll();
-  }
-  
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      if (sessionEntry.getValue().isOpen())
-        return true;
-    }
-    return false;
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    // Clean up caching parameters
-    
-    cacheLifetime = null;
-    cacheLRUsize = null;
-    
-    // Clean up AD parameters
-    
-    hasSessionParameters = false;
-
-    // Close all connections
-    for (Map.Entry<String,DCSessionInfo> sessionEntry : sessionInfo.entrySet())
-    {
-      sessionEntry.getValue().closeConnection();
-    }
-    sessionInfo = null;
-    
-    super.disconnect();
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    // This sets up parameters we need to construct the response description
-    getSessionParameters();
-
-    // Construct a cache description object
-    ICacheDescription objectDescription = new AuthorizationResponseDescription(userName,
-      dCConnectionParameters,dCRules,this.responseLifetime,this.LRUsize);
-    
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-    try
-    {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try
-      {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-        if (response != null)
-          return response;
-        // Create the object.
-        response = getAuthorizationResponseUncached(userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle,objectDescription,response);
-        // And return it...
-        return response;
-      }
-      finally
-      {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-  
-  /** Obtain the access tokens for a given user name, uncached.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-    throws ManifoldCFException
-  {
-    //String searchBase = "CN=Administrator,CN=Users,DC=qa-ad-76,DC=metacarta,DC=com";
-    int index = userName.indexOf("@");
-    if (index == -1)
-      throw new ManifoldCFException("Username is in unexpected form (no @): '"+userName+"'");
-
-    String userPart = userName.substring(0,index);
-    String domainPart = userName.substring(index+1);
-
-    try
-    {
-      List<String> adTokens = getADTokens(userPart,domainPart,userName);
-      if (adTokens == null)
-        return RESPONSE_USERNOTFOUND_ADDITIVE;
-      return new AuthorizationResponse(adTokens.toArray(new String[0]),AuthorizationResponse.RESPONSE_OK);
-    }
-    catch (NameNotFoundException e)
-    {
-      // This means that the user doesn't exist
-      return RESPONSE_USERNOTFOUND_ADDITIVE;
-    }
-    catch (NamingException e)
-    {
-      // Unreachable
-      return RESPONSE_UNREACHABLE_ADDITIVE;
-    }
-    
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    // The default response if the getConnection method fails
-    return RESPONSE_UNREACHABLE_ADDITIVE;
-  }
-
-  /** Get the AD-derived access tokens for a user and domain */
-  protected List<String> getADTokens(String userPart, String domainPart, String userName)
-    throws NameNotFoundException, NamingException, ManifoldCFException
-  {
-    // Now, look through the rules for the matching domain controller
-    String domainController = null;
-    for (DCRule rule : dCRules)
-    {
-      String suffix = rule.getSuffix();
-      if (suffix.length() == 0 || domainPart.toLowerCase(Locale.ROOT).endsWith(suffix.toLowerCase(Locale.ROOT)) &&
-        (suffix.length() == domainPart.length() || domainPart.charAt((domainPart.length()-suffix.length())-1) == '.'))
-      {
-        domainController = rule.getDomainControllerName();
-        break;
-      }
-    }
-    
-    if (domainController == null)
-      // No AD user
-      return null;
-    
-    // Look up connection parameters
-    DCConnectionParameters dcParams = dCConnectionParameters.get(domainController);
-    if (dcParams == null)
-      // No AD user
-      return null;
-        
-    // Use the complete fqn if the field is the "userPrincipalName"
-    String userBase;
-    String userACLsUsername = dcParams.getUserACLsUsername();
-    if (userACLsUsername != null && userACLsUsername.equals("userPrincipalName")){
-      userBase = userName;
-    }
-    else
-    {
-      userBase = userPart;
-    }
-        
-    //Build the DN searchBase from domain part
-    StringBuilder domainsb = new StringBuilder();
-    int j = 0;
-    while (true)
-    {
-      if (j > 0)
-        domainsb.append(",");
-
-      int k = domainPart.indexOf(".",j);
-      if (k == -1)
-      {
-        domainsb.append("DC=").append(ldapEscape(domainPart.substring(j)));
-        break;
-      }
-      domainsb.append("DC=").append(ldapEscape(domainPart.substring(j,k)));
-      j = k+1;
-    }
-
-    // Establish a session with the selected domain controller
-    LdapContext ctx = createDCSession(domainController);  
-        
-    //Get DistinguishedName (for this method we are using DomainPart as a searchBase ie: DC=qa-ad-76,DC=metacarta,DC=com")
-    String searchBase = getDistinguishedName(ctx, userBase, domainsb.toString(), userACLsUsername);
-    if (searchBase == null)
-      return null;
-
-    //specify the LDAP search filter
-    String searchFilter = "(objectClass=user)";
-
-    //Create the search controls for finding the access tokens	
-    SearchControls searchCtls = new SearchControls();
-
-    //Specify the search scope, must be base level search for tokenGroups
-    searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
-       
-    //Specify the attributes to return
-    String returnedAtts[]={"tokenGroups","objectSid"};
-    searchCtls.setReturningAttributes(returnedAtts);
-
-    //Search for tokens.  Since every user *must* have a SID, the "no user" detection should be safe.
-    NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
-
-    List<String> theGroups = new ArrayList<String>();
-    String userToken = userTokenFromLoginName(domainPart + "\\" + userPart);
-    if (userToken != null)
-      theGroups.add(userToken);
-    
-    //Loop through the search results
-    while (answer.hasMoreElements())
-    {
-      SearchResult sr = (SearchResult)answer.next();
-     
-      //the sr.GetName should be null, as it is relative to the base object
-            
-      Attributes attrs = sr.getAttributes();
-      if (attrs != null)
-      {
-        try
-        {
-          for (NamingEnumeration ae = attrs.getAll();ae.hasMore();) 
-          {
-            Attribute attr = (Attribute)ae.next();
-            for (NamingEnumeration e = attr.getAll();e.hasMore();)
-            {
-              String sid = sid2String((byte[])e.next());
-              String token = attr.getID().equals("objectSid")?userTokenFromSID(sid):groupTokenFromSID(sid);
-              theGroups.add(token);
-            }
-          }
-        }	 
-        catch (NamingException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-    }
-
-    if (theGroups.size() == 0)
-      return null;
-    
-    // User is in AD, so add the 'everyone' group
-    theGroups.add(everyoneGroup());
-    theGroups.add(authenticatedUserGroup());
-    return theGroups;
-  }
-
-  protected static String everyoneGroup()
-  {
-    return "Uc:0!.s|windows";
-  }
-  
-  protected static String authenticatedUserGroup()
-  {
-    return "Uc:0(.s|true";
-  }
-  
-  protected static String groupTokenFromSID(String SID)
-  {
-    return "Uc:0+.w|"+SID.toLowerCase(Locale.ROOT);
-  }
-
-  protected static String userTokenFromSID(String SID)
-  {
-    return "Ui:0+.w|"+SID.toLowerCase(Locale.ROOT);
-  }
-  
-  protected static String userTokenFromLoginName(String loginName)
-  {
-      return "Ui:0#.w|"+URLEncoder.encode(loginName).toLowerCase(Locale.ROOT);
-  }
-  
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SharePointAuthority.DomainController"));
-    tabsArray.add(Messages.getString(locale,"SharePointAuthority.Cache"));
-    Messages.outputResourceWithVelocity(out,locale,"editADConfiguration.js",null);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TabName",tabName);
-    fillInDomainControllerTab(velocityContext,out,parameters);
-    fillInCacheTab(velocityContext, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "editADConfiguration_DomainController.html", velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,"editADConfiguration_Cache.html",velocityContext);
-  }
-
-  protected static void fillInDomainControllerTab(Map<String,Object> velocityContext, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    List<Map<String,String>> domainControllers = new ArrayList<Map<String,String>>();
-    
-    // Go through nodes looking for DC nodes
-    for (int i = 0; i < parameters.getChildCount(); i++)
-    {
-      ConfigNode cn = parameters.getChild(i);
-      if (cn.getType().equals(SharePointConfig.NODE_DOMAINCONTROLLER))
-      {
-        // Grab the info
-        String dcSuffix = cn.getAttributeValue(SharePointConfig.ATTR_SUFFIX);
-        String dcDomainController = cn.getAttributeValue(SharePointConfig.ATTR_DOMAINCONTROLLER);
-        String dcUserName = cn.getAttributeValue(SharePointConfig.ATTR_USERNAME);
-        String dcPassword = deobfuscate(cn.getAttributeValue(SharePointConfig.ATTR_PASSWORD));
-        String dcAuthentication = cn.getAttributeValue(SharePointConfig.ATTR_AUTHENTICATION);
-        String dcUserACLsUsername = cn.getAttributeValue(SharePointConfig.ATTR_USERACLsUSERNAME);
-        domainControllers.add(createDomainControllerMap(mapper,dcSuffix,dcDomainController,dcUserName,dcPassword,dcAuthentication,dcUserACLsUsername));
-      }
-    }
-    velocityContext.put("DOMAINCONTROLLERS", domainControllers);
-  }
-
-  protected static Map<String,String> createDomainControllerMap(IPasswordMapperActivity mapper, String suffix, String domainControllerName,
-    String userName, String password, String authentication, String userACLsUsername)
-  {
-    Map<String,String> defaultMap = new HashMap<String,String>();
-    if (suffix != null)
-      defaultMap.put("SUFFIX",suffix);
-    if (domainControllerName != null)
-      defaultMap.put("DOMAINCONTROLLER",domainControllerName);
-    if (userName != null)
-      defaultMap.put("USERNAME",userName);
-    if (password != null)
-      defaultMap.put("PASSWORD",mapper.mapPasswordToKey(password));
-    if (authentication != null)
-      defaultMap.put("AUTHENTICATION",authentication);
-    if (userACLsUsername != null)
-      defaultMap.put("USERACLsUSERNAME",userACLsUsername);
-    return defaultMap;
-  }
-  
-  protected static void fillInCacheTab(Map<String,Object> velocityContext, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    String cacheLifetime = parameters.getParameter(SharePointConfig.PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    velocityContext.put("CACHELIFETIME",cacheLifetime);
-    String cacheLRUsize = parameters.getParameter(SharePointConfig.PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";
-    velocityContext.put("CACHELRUSIZE",cacheLRUsize);
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String x = variableContext.getParameter("dcrecord_count");
-    if (x != null)
-    {
-      // Delete old nodes
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i);
-        if (cn.getType().equals(SharePointConfig.NODE_DOMAINCONTROLLER))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      // Scan form fields and apply operations
-      int count = Integer.parseInt(x);
-      i = 0;
-      String op;
-      
-      Set<String> seenDomains = new HashSet<String>();
-      
-      while (i < count)
-      {
-        op = variableContext.getParameter("dcrecord_op_"+i);
-        if (op != null && op.equals("Insert"))
-        {
-          // Insert a new record right here
-          addDomainController(seenDomains,parameters,
-            variableContext.getParameter("dcrecord_suffix"),
-            variableContext.getParameter("dcrecord_domaincontrollername"),
-            variableContext.getParameter("dcrecord_username"),
-            variableContext.mapKeyToPassword(variableContext.getParameter("dcrecord_password")),
-            variableContext.getParameter("dcrecord_authentication"),
-            variableContext.getParameter("dcrecord_userACLsUsername"));
-        }
-        if (op == null || !op.equals("Delete"))
-        {
-          // Add this record back in
-          addDomainController(seenDomains,parameters,
-            variableContext.getParameter("dcrecord_suffix_"+i),
-            variableContext.getParameter("dcrecord_domaincontrollername_"+i),
-            variableContext.getParameter("dcrecord_username_"+i),
-            variableContext.mapKeyToPassword(variableContext.getParameter("dcrecord_password_"+i)),
-            variableContext.getParameter("dcrecord_authentication_"+i),
-            variableContext.getParameter("dcrecord_userACLsUsername_"+i));
-        }
-        i++;
-      }
-      op = variableContext.getParameter("dcrecord_op");
-      if (op != null && op.equals("Add"))
-      {
-        // Insert a new record right here
-        addDomainController(seenDomains,parameters,
-          variableContext.getParameter("dcrecord_suffix"),
-          variableContext.getParameter("dcrecord_domaincontrollername"),
-          variableContext.getParameter("dcrecord_username"),
-          variableContext.getParameter("dcrecord_password"),
-          variableContext.getParameter("dcrecord_authentication"),
-          variableContext.getParameter("dcrecord_userACLsUsername"));
-      }
-    }
-
-    // Cache parameters
-    
-    String cacheLifetime = variableContext.getParameter("cachelifetime");
-    if (cacheLifetime != null)
-      parameters.setParameter(SharePointConfig.PARAM_CACHELIFETIME,cacheLifetime);
-    String cacheLRUsize = variableContext.getParameter("cachelrusize");
-    if (cacheLRUsize != null)
-      parameters.setParameter(SharePointConfig.PARAM_CACHELRUSIZE,cacheLRUsize);
-    
-    return null;
-  }
-  
-  protected static void addDomainController(Set<String> seenDomains, ConfigParams parameters,
-    String suffix, String domainControllerName, String userName, String password, String authentication,
-    String userACLsUsername)
-    throws ManifoldCFException
-  {
-    if (!seenDomains.contains(domainControllerName))
-    {
-      ConfigNode cn = new ConfigNode(SharePointConfig.NODE_DOMAINCONTROLLER);
-      cn.setAttribute(SharePointConfig.ATTR_SUFFIX,suffix);
-      cn.setAttribute(SharePointConfig.ATTR_DOMAINCONTROLLER,domainControllerName);
-      cn.setAttribute(SharePointConfig.ATTR_USERNAME,userName);
-      cn.setAttribute(SharePointConfig.ATTR_PASSWORD,ManifoldCF.obfuscate(password));
-      cn.setAttribute(SharePointConfig.ATTR_AUTHENTICATION,authentication);
-      cn.setAttribute(SharePointConfig.ATTR_USERACLsUSERNAME,userACLsUsername);
-      parameters.addChild(parameters.getChildCount(),cn);
-      seenDomains.add(domainControllerName);
-    }
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    fillInDomainControllerTab(velocityContext,out,parameters);
-    fillInCacheTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"viewADConfiguration.html",velocityContext);
-  }
-
-  // Protected methods
-
-  /** Get parameters needed for caching.
-  */
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (!hasSessionParameters)
-    {
-      try
-      {
-        responseLifetime = Long.parseLong(this.cacheLifetime) * 60L * 1000L;
-        LRUsize = Integer.parseInt(this.cacheLRUsize);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Cache lifetime or Cache LRU size must be an integer: "+e.getMessage(),e);
-      }
-      hasSessionParameters = true;
-    }
-  }
-  
-  /** Obtain the DistinguishedName for a given user logon name.
-  *@param ctx is the ldap context to use.
-  *@param userName (Domain Logon Name) is the user name or identifier.
-  *@param searchBase (Full Domain Name for the search ie: DC=qa-ad-76,DC=metacarta,DC=com)
-  *@return DistinguishedName for given domain user logon name. 
-  * (Should throws an exception if user is not found.)
-  */
-  protected String getDistinguishedName(LdapContext ctx, String userName, String searchBase, String userACLsUsername)
-    throws ManifoldCFException
-  {
-    String returnedAtts[] = {"distinguishedName"};
-    String searchFilter = "(&(objectClass=user)(" + userACLsUsername + "=" + userName + "))";
-    SearchControls searchCtls = new SearchControls();
-    searchCtls.setReturningAttributes(returnedAtts);
-    //Specify the search scope  
-    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-    searchCtls.setReturningAttributes(returnedAtts);
-
-    try
-    {
-      NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
-      while (answer.hasMoreElements())
-      {
-        SearchResult sr = (SearchResult)answer.next();
-        Attributes attrs = sr.getAttributes();
-        if (attrs != null)
-        {
-          String dn = attrs.get("distinguishedName").get().toString();
-          return dn;
-        }
-      }
-      return null;
-    }
-    catch (NamingException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-   
-  /** LDAP escape a string.
-  */
-  protected static String ldapEscape(String input)
-  {
-    //Add escape sequence to all commas
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      int oldIndex = index;
-      index = input.indexOf(",",oldIndex);
-      if (index == -1)
-      {
-        sb.append(input.substring(oldIndex));
-        break;
-      }
-      sb.append(input.substring(oldIndex,index)).append("\\,");
-      index++;
-    }
-    return sb.toString();
-  }
-    	
-  /** Convert a binary SID to a string */
-  protected static String sid2String(byte[] SID)
-  {
-    StringBuilder strSID = new StringBuilder("S");
-    long version = SID[0];
-    strSID.append("-").append(Long.toString(version));
-    long authority = SID[4];
-    for (int i = 0;i<4;i++)
-    {
-      authority <<= 8;
-      authority += SID[4+i] & 0xFF;
-    }
-    strSID.append("-").append(Long.toString(authority));
-    long count = SID[2];
-    count <<= 8;
-    count += SID[1] & 0xFF;
-    for (int j=0;j<count;j++)
-    {
-      long rid = SID[11 + (j*4)] & 0xFF;
-      for (int k=1;k<4;k++)
-      {
-        rid <<= 8;
-        rid += SID[11-k + (j*4)] & 0xFF;
-      }
-      strSID.append("-").append(Long.toString(rid));
-    }
-    return strSID.toString();
-  }
-
-  /** Class representing the session information for a specific domain controller
-  * connection.
-  */
-  protected static class DCSessionInfo
-  {
-    /** The initialized LDAP context (which functions as a session) */
-    private LdapContext ctx = null;
-    /** The time of last access to this ctx object */
-    private long expiration = -1L;
-    
-    public DCSessionInfo()
-    {
-    }
-
-    /** Initialize the session. */
-    public LdapContext getADSession(String domainControllerName, DCConnectionParameters params)
-      throws ManifoldCFException
-    {
-      String authentication = params.getAuthentication();
-      String userName = params.getUserName();
-      String password = params.getPassword();
-      
-      while (true)
-      {
-        if (ctx == null)
-        {
-          // Calculate the ldap url first
-          String ldapURL = "ldap://" + domainControllerName + ":389";
-          
-          Hashtable env = new Hashtable();
-          env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
-          env.put(Context.SECURITY_AUTHENTICATION,authentication);      
-          env.put(Context.SECURITY_PRINCIPAL,userName);
-          env.put(Context.SECURITY_CREDENTIALS,password);
-                                    
-          //connect to my domain controller
-          env.put(Context.PROVIDER_URL,ldapURL);
-                    
-          //specify attributes to be returned in binary format
-          env.put("java.naming.ldap.attributes.binary","tokenGroups objectSid");
-     
-          // Now, try the connection...
-          try
-          {
-            ctx = new InitialLdapContext(env,null);
-            // If successful, break
-            break;
-          }
-          catch (AuthenticationException e)
-          {
-            // This means we couldn't authenticate!
-            throw new ManifoldCFException("Authentication problem authenticating admin user '"+userName+"': "+e.getMessage(),e);
-          }
-          catch (CommunicationException e)
-          {
-            // This means we couldn't connect, most likely
-            throw new ManifoldCFException("Couldn't communicate with domain controller '"+domainControllerName+"': "+e.getMessage(),e);
-          }
-          catch (NamingException e)
-          {
-            throw new ManifoldCFException(e.getMessage(),e);
-          }
-        }
-        else
-        {
-          // Attempt to reconnect.  I *hope* this is efficient and doesn't do unnecessary work.
-          try
-          {
-            ctx.reconnect(null);
-            // Break on apparent success
-            break;
-          }
-          catch (AuthenticationException e)
-          {
-            // This means we couldn't authenticate!  Log it and retry creating a whole new context.
-            Logging.authorityConnectors.warn("Reconnect: Authentication problem authenticating admin user '"+userName+"': "+e.getMessage(),e);
-          }
-          catch (CommunicationException e)
-          {
-            // This means we couldn't connect, most likely.  Log it and retry creating a whole new context.
-            Logging.authorityConnectors.warn("Reconnect: Couldn't communicate with domain controller '"+domainControllerName+"': "+e.getMessage(),e);
-          }
-          catch (NamingException e)
-          {
-            Logging.authorityConnectors.warn("Reconnect: Naming exception: "+e.getMessage(),e);
-          }
-          
-          // So we have no chance of leaking resources, attempt to close the context.
-          closeConnection();
-          // Loop back around to try our luck with a fresh connection.
-
-        }
-      }
-      
-      // Set the expiration time anew
-      expiration = System.currentTimeMillis() + ADExpirationInterval;
-      return ctx;
-    }
-    
-    /** Close the connection handle. */
-    protected void closeConnection()
-    {
-      if (ctx != null)
-      {
-        try
-        {
-          ctx.close();
-        }
-        catch (NamingException e)
-        {
-          // Eat this error
-        }
-        ctx = null;
-        expiration = -1L;
-      }
-    }
-
-    /** Close connection if it has expired. */
-    protected void closeIfExpired(long currentTime)
-    {
-      if (expiration != -1L && currentTime > expiration)
-        closeConnection();
-    }
-
-    /** Check if open */
-    protected boolean isOpen()
-    {
-      return ctx != null;
-    }
-
-  }
-
-  /** Class describing a domain suffix and corresponding domain controller name rule.
-  */
-  protected static class DCRule
-  {
-    private String suffix;
-    private String domainControllerName;
-    
-    public DCRule(String suffix, String domainControllerName)
-    {
-      this.suffix = suffix;
-      this.domainControllerName = domainControllerName;
-    }
-    
-    public String getSuffix()
-    {
-      return suffix;
-    }
-    
-    public String getDomainControllerName()
-    {
-      return domainControllerName;
-    }
-  }
-  
-  /** Class describing the connection parameters to a domain controller.
-  */
-  protected static class DCConnectionParameters
-  {
-    private String userName;
-    private String password;
-    private String authentication;
-    private String userACLsUsername;
-
-    public DCConnectionParameters(String userName, String password, String authentication, String userACLsUsername)
-    {
-      this.userName = userName;
-      this.password = password;
-      this.authentication = authentication;
-      this.userACLsUsername = userACLsUsername;
-    }
-    
-    public String getUserName()
-    {
-      return userName;
-    }
-    
-    public String getPassword()
-    {
-      return password;
-    }
-    
-    public String getAuthentication()
-    {
-      return authentication;
-    }
-    
-    public String getUserACLsUsername()
-    {
-      return userACLsUsername;
-    }
-  }
-  
-  protected static StringSet emptyStringSet = new StringSet();
-  
-  /** This is the cache object descriptor for cached access tokens from
-  * this connector.
-  */
-  protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    /** The user name */
-    protected String userName;
-    /** Connection parameters */
-    protected Map<String,DCConnectionParameters> dcConnectionParams;
-    /** Rules */
-    protected List<DCRule> dcRules;
-    /** The response lifetime */
-    protected long responseLifetime;
-    /** The expiration time */
-    protected long expirationTime = -1;
-    
-    /** Constructor. */
-    public AuthorizationResponseDescription(String userName, Map<String,DCConnectionParameters> dcConnectionParams,
-      List<DCRule> dcRules, long responseLifetime, int LRUsize)
-    {
-      super("SharePointADAuthority",LRUsize);
-      this.userName = userName;
-      this.dcConnectionParams = dcConnectionParams;
-      this.dcRules = dcRules;
-      this.responseLifetime = responseLifetime;
-    }
-
-    /** Return the invalidation keys for this object. */
-    public StringSet getObjectKeys()
-    {
-      return emptyStringSet;
-    }
-
-    /** Get the critical section name, used for synchronizing the creation of the object */
-    public String getCriticalSectionName()
-    {
-      StringBuilder sb = new StringBuilder(getClass().getName());
-      sb.append("-").append(userName);
-      for (DCRule rule : dcRules)
-      {
-        sb.append("-").append(rule.getSuffix());
-        String domainController = rule.getDomainControllerName();
-        DCConnectionParameters params = dcConnectionParams.get(domainController);
-        sb.append("-").append(domainController).append("-").append(params.getUserName()).append("-").append(params.getPassword());
-      }
-      return sb.toString();
-    }
-
-    /** Return the object expiration interval */
-    public long getObjectExpirationTime(long currentTime)
-    {
-      if (expirationTime == -1)
-        expirationTime = currentTime + responseLifetime;
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      int rval = userName.hashCode();
-      for (DCRule rule : dcRules)
-      {
-        String domainController = rule.getDomainControllerName();
-        DCConnectionParameters params = dcConnectionParams.get(domainController);
-        rval += rule.getSuffix().hashCode() + domainController.hashCode() + params.getUserName().hashCode() + params.getPassword().hashCode();
-      }
-      return rval;
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorizationResponseDescription))
-        return false;
-      AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-      if (!ard.userName.equals(userName))
-        return false;
-      if (ard.dcRules.size() != dcRules.size())
-        return false;
-      for (int i = 0 ; i < dcRules.size() ; i++)
-      {
-        DCRule rule = dcRules.get(i);
-        DCRule ardRule = ard.dcRules.get(i);
-        if (!rule.getSuffix().equals(ardRule.getSuffix()) || !rule.getDomainControllerName().equals(ardRule.getDomainControllerName()))
-          return false;
-        String domainController = rule.getDomainControllerName();
-        DCConnectionParameters params = dcConnectionParams.get(domainController);
-        DCConnectionParameters ardParams = ard.dcConnectionParams.get(domainController);
-        if (!params.getUserName().equals(ardParams.getUserName()) || !params.getPassword().equals(ardParams.getPassword()))
-          return false;
-      }
-      return true;
-    }
-    
-  }
-  
-}
-
-
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointAuthority.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointAuthority.java
deleted file mode 100644
index 5f3b57f..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointAuthority.java
+++ /dev/null
@@ -1,1051 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.sharepoint;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.core.util.URLDecoder;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import java.util.concurrent.TimeUnit;
-import javax.naming.*;
-import javax.naming.ldap.*;
-import javax.naming.directory.*;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.HttpHost;
-
-
-/** This is the native SharePoint implementation of the IAuthorityConnector interface.
-*/
-public class SharePointAuthority extends org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Data from the parameters
-  
-  /** Cache manager. */
-  private ICacheManager cacheManager = null;
-  
-  private boolean hasSessionParameters = false;
-  
-  /** Length of time that a SharePoint session can remain idle */
-  private static final long SharePointExpirationInterval = 300000L;
-  
-  // SharePoint server parameters
-  // These are needed for caching, so they are set at connect() time
-  private boolean isClaimSpace = false;
-  private String serverProtocol = null;
-  private String serverUrl = null;
-  private String fileBaseUrl = null;
-  private String serverUserName = null;
-  private String password = null;
-  private String ntlmDomain = null;
-  private String serverName = null;
-  private String serverPortString = null;
-  private String serverLocation = null;
-  private String strippedUserName = null;
-  private String encodedServerLocation = null;
-  private String keystoreData = null;
-  
-  private String proxyHost = null;
-  private String proxyPortString = null;
-  private String proxyUsername = null;
-  private String proxyPassword = null;
-  private String proxyDomain = null;
-  
-  private String cacheLRUsize = null;
-  private String cacheLifetime = null;
-  
-  // These are calculated when the session is set up
-  private int serverPort = -1;
-  private SPSProxyHelper proxy = null;
-  private long sharepointSessionTimeout;
-  
-  private long responseLifetime = -1L;
-  private int LRUsize = -1;
-  
-  private IKeystoreManager keystoreManager = null;
-  
-  private HttpClientConnectionManager connectionManager = null;
-  private HttpClient httpClient = null;
-
-
-  // Current host name
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (UnknownHostException e)
-    {
-    }
-  }
-
-  /** Constructor.
-  */
-  public SharePointAuthority()
-  {
-  }
-
-  /** Set thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    super.setThreadContext(tc);
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-  
-  /** Clear thread context.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    cacheManager = null;
-  }
-  
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    super.connect(configParams);
-
-    // Pick up all the parameters that go into the cache key here
-    cacheLifetime = configParams.getParameter(SharePointConfig.PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    cacheLRUsize = configParams.getParameter(SharePointConfig.PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";
-    
-    String serverVersion = configParams.getParameter( SharePointConfig.PARAM_SERVERVERSION );
-    if (serverVersion == null)
-      serverVersion = "4.0";
-    // Authority needs to do nothing with SharePoint version right now.
-
-    String serverClaimSpace = configParams.getParameter( SharePointConfig.PARAM_SERVERCLAIMSPACE);
-    if (serverClaimSpace == null)
-      serverClaimSpace = "false";
-    isClaimSpace = serverClaimSpace.equals("true");
-    
-    serverProtocol = configParams.getParameter( SharePointConfig.PARAM_SERVERPROTOCOL );
-    if (serverProtocol == null)
-      serverProtocol = "http";
-      
-    serverName = configParams.getParameter( SharePointConfig.PARAM_SERVERNAME );
-    serverPortString = configParams.getParameter( SharePointConfig.PARAM_SERVERPORT );
-    serverLocation = configParams.getParameter(SharePointConfig.PARAM_SERVERLOCATION);
-    if (serverLocation == null)
-      serverLocation = "";
-    if (serverLocation.endsWith("/"))
-      serverLocation = serverLocation.substring(0,serverLocation.length()-1);
-    if (serverLocation.length() > 0 && !serverLocation.startsWith("/"))
-      serverLocation = "/" + serverLocation;
-    encodedServerLocation = serverLocation;
-    serverLocation = decodePath(serverLocation);
-
-    serverUserName = configParams.getParameter(SharePointConfig.PARAM_SERVERUSERNAME);
-    password = configParams.getObfuscatedParameter(SharePointConfig.PARAM_SERVERPASSWORD);
-    int index = serverUserName.indexOf("\\");
-    if (index != -1)
-    {
-      strippedUserName = serverUserName.substring(index+1);
-      ntlmDomain = serverUserName.substring(0,index);
-    }
-    else
-    {
-      strippedUserName = null;
-      ntlmDomain = null;
-    }
-    
-    proxyHost = params.getParameter(SharePointConfig.PARAM_PROXYHOST);
-    proxyPortString = params.getParameter(SharePointConfig.PARAM_PROXYPORT);
-    proxyUsername = params.getParameter(SharePointConfig.PARAM_PROXYUSER);
-    proxyPassword = params.getObfuscatedParameter(SharePointConfig.PARAM_PROXYPASSWORD);
-    proxyDomain = params.getParameter(SharePointConfig.PARAM_PROXYDOMAIN);
-
-    keystoreData = params.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Check connection for sanity.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    getSharePointSession();
-    try
-    {
-      URL urlServer = new URL( serverUrl );
-    }
-    catch ( MalformedURLException e )
-    {
-      return "Illegal SharePoint url: "+e.getMessage();
-    }
-
-    try
-    {
-      proxy.checkConnection( "/" );
-    }
-    catch (ManifoldCFException e)
-    {
-      return e.getMessage();
-    }
-
-    return super.check();
-  }
-
-  /** Poll.  The connection should be closed if it has been idle for too long.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    long currentTime = System.currentTimeMillis();
-    if (proxy != null && System.currentTimeMillis() >= sharepointSessionTimeout)
-      expireSharePointSession();
-    if (connectionManager != null)
-      connectionManager.closeIdleConnections(60000L,TimeUnit.MILLISECONDS);
-    super.poll();
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return connectionManager != null;
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    // Clean up caching parameters
-    
-    cacheLifetime = null;
-    cacheLRUsize = null;
-    
-    // Clean up SharePoint parameters
-    
-    isClaimSpace = false;
-    serverUrl = null;
-    fileBaseUrl = null;
-    serverUserName = null;
-    strippedUserName = null;
-    password = null;
-    ntlmDomain = null;
-    serverName = null;
-    serverLocation = null;
-    encodedServerLocation = null;
-    serverPort = -1;
-
-    proxyHost = null;
-    proxyPortString = null;
-    proxyUsername = null;
-    proxyPassword = null;
-    proxyDomain = null;
-    
-    keystoreData = null;
-    keystoreManager = null;
-
-    proxy = null;
-    httpClient = null;
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-
-    hasSessionParameters = false;
-    
-    super.disconnect();
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    getSessionParameters();
-    // Construct a cache description object
-    ICacheDescription objectDescription = new AuthorizationResponseDescription(userName,
-      serverName,serverPortString,serverLocation,serverProtocol,serverUserName,password,
-      this.responseLifetime,this.LRUsize);
-    
-    // Enter the cache
-    ICacheHandle ch = cacheManager.enterCache(new ICacheDescription[]{objectDescription},null,null);
-    try
-    {
-      ICacheCreateHandle createHandle = cacheManager.enterCreateSection(ch);
-      try
-      {
-        // Lookup the object
-        AuthorizationResponse response = (AuthorizationResponse)cacheManager.lookupObject(createHandle,objectDescription);
-        if (response != null)
-          return response;
-        // Create the object.
-        response = getAuthorizationResponseUncached(userName);
-        // Save it in the cache
-        cacheManager.saveObject(createHandle,objectDescription,response);
-        // And return it...
-        return response;
-      }
-      finally
-      {
-        cacheManager.leaveCreateSection(createHandle);
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-  
-  /** Obtain the access tokens for a given user name, uncached.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  protected AuthorizationResponse getAuthorizationResponseUncached(String userName)
-    throws ManifoldCFException
-  {
-    //String searchBase = "CN=Administrator,CN=Users,DC=qa-ad-76,DC=metacarta,DC=com";
-    int index = userName.indexOf("@");
-    if (index == -1)
-      throw new ManifoldCFException("Username is in unexpected form (no @): '"+userName+"'");
-
-    String userPart = userName.substring(0,index);
-    String domainPart = userName.substring(index+1);
-
-    // First, look up user in SharePoint.
-    getSharePointSession();
-    List<String> sharePointTokens = proxy.getAccessTokens("/", domainPart + "\\" + userPart);
-    if (sharePointTokens == null)
-      return RESPONSE_USERNOTFOUND_ADDITIVE;
-    
-    return new AuthorizationResponse(sharePointTokens.toArray(new String[0]),AuthorizationResponse.RESPONSE_OK);
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    // The default response if the getConnection method fails
-    return RESPONSE_UNREACHABLE_ADDITIVE;
-  }
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up authority connection configuration information. The configuration methods cannot assume that the
-  // current authority object is connected.  That is why they receive a thread context argument.
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SharePointAuthority.Server"));
-    tabsArray.add(Messages.getString(locale,"SharePointAuthority.Cache"));
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration.js",null);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TabName",tabName);
-    fillInCacheTab(velocityContext,out,parameters);
-    fillInServerTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Cache.html",velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Server.html",velocityContext);
-  }
-
-  protected static void fillInServerTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String serverVersion = parameters.getParameter(SharePointConfig.PARAM_SERVERVERSION);
-    if (serverVersion == null)
-      serverVersion = "2.0";
-    
-    String serverClaimSpace = parameters.getParameter(SharePointConfig.PARAM_SERVERCLAIMSPACE);
-    if (serverClaimSpace == null)
-      serverClaimSpace = "false";
-
-    String serverProtocol = parameters.getParameter(SharePointConfig.PARAM_SERVERPROTOCOL);
-    if (serverProtocol == null)
-      serverProtocol = "http";
-
-    String serverName = parameters.getParameter(SharePointConfig.PARAM_SERVERNAME);
-    if (serverName == null)
-      serverName = "localhost";
-
-    String serverPort = parameters.getParameter(SharePointConfig.PARAM_SERVERPORT);
-    if (serverPort == null)
-      serverPort = "";
-
-    String serverLocation = parameters.getParameter(SharePointConfig.PARAM_SERVERLOCATION);
-    if (serverLocation == null)
-      serverLocation = "";
-      
-    String userName = parameters.getParameter(SharePointConfig.PARAM_SERVERUSERNAME);
-    if (userName == null)
-      userName = "";
-
-    String password = parameters.getObfuscatedParameter(SharePointConfig.PARAM_SERVERPASSWORD);
-    if (password == null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-
-    String keystore = parameters.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-    IKeystoreManager localKeystore;
-    if (keystore == null)
-      localKeystore = KeystoreManagerFactory.make("");
-    else
-      localKeystore = KeystoreManagerFactory.make("",keystore);
-
-    List<Map<String,String>> certificates = new ArrayList<Map<String,String>>();
-    
-    String[] contents = localKeystore.getContents();
-    for (String alias : contents)
-    {
-      String description = localKeystore.getDescription(alias);
-      if (description.length() > 128)
-        description = description.substring(0,125) + "...";
-      Map<String,String> certificate = new HashMap<String,String>();
-      certificate.put("ALIAS", alias);
-      certificate.put("DESCRIPTION", description);
-      certificates.add(certificate);
-    }
-    
-    String proxyHost = parameters.getParameter(SharePointConfig.PARAM_PROXYHOST);
-    if (proxyHost == null)
-      proxyHost = "";
-    
-    String proxyPort = parameters.getParameter(SharePointConfig.PARAM_PROXYPORT);
-    if (proxyPort == null)
-      proxyPort = "";
-    
-    String proxyUser = parameters.getParameter(SharePointConfig.PARAM_PROXYUSER);
-    if (proxyUser == null)
-      proxyUser = "";
-    
-    String proxyPassword = parameters.getObfuscatedParameter(SharePointConfig.PARAM_PROXYPASSWORD);
-    if (proxyPassword == null)
-      proxyPassword = "";
-    else
-      proxyPassword = out.mapPasswordToKey(proxyPassword);
-
-    String proxyDomain = parameters.getParameter(SharePointConfig.PARAM_PROXYDOMAIN);
-    if (proxyDomain == null)
-      proxyDomain = "";
-
-    // Fill in context
-    velocityContext.put("SERVERVERSION", serverVersion);
-    velocityContext.put("SERVERCLAIMSPACE", serverClaimSpace);
-    velocityContext.put("SERVERPROTOCOL", serverProtocol);
-    velocityContext.put("SERVERNAME", serverName);
-    velocityContext.put("SERVERPORT", serverPort);
-    velocityContext.put("SERVERLOCATION", serverLocation);
-    velocityContext.put("SERVERUSERNAME", userName);
-    velocityContext.put("SERVERPASSWORD", password);
-    if (keystore != null)
-      velocityContext.put("KEYSTORE", keystore);
-    velocityContext.put("CERTIFICATELIST", certificates);
-
-    velocityContext.put("PROXYHOST", proxyHost);
-    velocityContext.put("PROXYPORT", proxyPort);
-    velocityContext.put("PROXYUSER", proxyUser);
-    velocityContext.put("PROXYPASSWORD", proxyPassword);
-    velocityContext.put("PROXYDOMAIN", proxyDomain);
-
-  }
-
-  protected static void fillInCacheTab(Map<String,Object> velocityContext, IPasswordMapperActivity mapper, ConfigParams parameters)
-  {
-    String cacheLifetime = parameters.getParameter(SharePointConfig.PARAM_CACHELIFETIME);
-    if (cacheLifetime == null)
-      cacheLifetime = "1";
-    velocityContext.put("CACHELIFETIME",cacheLifetime);
-    String cacheLRUsize = parameters.getParameter(SharePointConfig.PARAM_CACHELRUSIZE);
-    if (cacheLRUsize == null)
-      cacheLRUsize = "1000";
-    velocityContext.put("CACHELRUSIZE",cacheLRUsize);
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    // Cache parameters
-    
-    String cacheLifetime = variableContext.getParameter("cachelifetime");
-    if (cacheLifetime != null)
-      parameters.setParameter(SharePointConfig.PARAM_CACHELIFETIME,cacheLifetime);
-    String cacheLRUsize = variableContext.getParameter("cachelrusize");
-    if (cacheLRUsize != null)
-      parameters.setParameter(SharePointConfig.PARAM_CACHELRUSIZE,cacheLRUsize);
-    
-    // SharePoint server parameters
-    
-    String serverVersion = variableContext.getParameter("serverVersion");
-    if (serverVersion != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERVERSION,serverVersion);
-
-    String serverClaimSpace = variableContext.getParameter("serverClaimSpace");
-    if (serverClaimSpace != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERCLAIMSPACE,serverClaimSpace);
-    
-    String serverProtocol = variableContext.getParameter("serverProtocol");
-    if (serverProtocol != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERPROTOCOL,serverProtocol);
-
-    String serverName = variableContext.getParameter("serverName");
-
-    if (serverName != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERNAME,serverName);
-
-    String serverPort = variableContext.getParameter("serverPort");
-    if (serverPort != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERPORT,serverPort);
-
-    String serverLocation = variableContext.getParameter("serverLocation");
-    if (serverLocation != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERLOCATION,serverLocation);
-
-    String userName = variableContext.getParameter("serverUserName");
-    if (userName != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERUSERNAME,userName);
-
-    String password = variableContext.getParameter("serverPassword");
-    if (password != null)
-      parameters.setObfuscatedParameter(SharePointConfig.PARAM_SERVERPASSWORD,variableContext.mapKeyToPassword(password));
-
-    String proxyHost = variableContext.getParameter("proxyhost");
-    if (proxyHost != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYHOST,proxyHost);
-    
-    String proxyPort = variableContext.getParameter("proxyport");
-    if (proxyPort != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYPORT,proxyPort);
-    
-    String proxyUser = variableContext.getParameter("proxyuser");
-    if (proxyUser != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYUSER,proxyUser);
-    
-    String proxyPassword = variableContext.getParameter("proxypassword");
-    if (proxyPassword != null)
-      parameters.setObfuscatedParameter(SharePointConfig.PARAM_PROXYPASSWORD,variableContext.mapKeyToPassword(proxyPassword));
-    
-    String proxyDomain = variableContext.getParameter("proxydomain");
-    if (proxyDomain != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYDOMAIN,proxyDomain);
-
-    String keystoreValue = variableContext.getParameter("keystoredata");
-    if (keystoreValue != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERKEYSTORE,keystoreValue);
-
-    String configOp = variableContext.getParameter("configop");
-    if (configOp != null)
-    {
-      if (configOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("shpkeystorealias");
-        keystoreValue = parameters.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        parameters.setParameter(SharePointConfig.PARAM_SERVERKEYSTORE,mgr.getString());
-      }
-      else if (configOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("shpcertificate");
-        keystoreValue = parameters.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Don't report anything
-          }
-        }
-
-        if (certError != null)
-        {
-          // Redirect to error page
-          return "Illegal certificate: "+certError;
-        }
-        parameters.setParameter(SharePointConfig.PARAM_SERVERKEYSTORE,mgr.getString());
-      }
-    }
-    
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    fillInCacheTab(velocityContext,out,parameters);
-    fillInServerTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"viewConfiguration.html",velocityContext);
-  }
-
-  // Protected methods
-
-  /** Get parameters needed for caching.
-  */
-  protected void getSessionParameters()
-    throws ManifoldCFException
-  {
-    if (!hasSessionParameters)
-    {
-      try
-      {
-        responseLifetime = Long.parseLong(this.cacheLifetime) * 60L * 1000L;
-        LRUsize = Integer.parseInt(this.cacheLRUsize);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException("Cache lifetime or Cache LRU size must be an integer: "+e.getMessage(),e);
-      }
-      hasSessionParameters = true;
-    }
-  }
-  
-  protected void getSharePointSession()
-    throws ManifoldCFException
-  {
-    if (proxy == null)
-    {
-      // Set up server URL
-      try
-      {
-        if (serverPortString == null || serverPortString.length() == 0)
-        {
-          if (serverProtocol.equals("https"))
-            this.serverPort = 443;
-          else
-            this.serverPort = 80;
-        }
-        else
-          this.serverPort = Integer.parseInt(serverPortString);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      
-      int proxyPort = 8080;
-      if (proxyPortString != null && proxyPortString.length() > 0)
-      {
-        try
-        {
-          proxyPort = Integer.parseInt(proxyPortString);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-
-      serverUrl = serverProtocol + "://" + serverName;
-      if (serverProtocol.equals("https"))
-      {
-        if (serverPort != 443)
-          serverUrl += ":" + Integer.toString(serverPort);
-      }
-      else
-      {
-        if (serverPort != 80)
-          serverUrl += ":" + Integer.toString(serverPort);
-      }
-
-      fileBaseUrl = serverUrl + encodedServerLocation;
-
-      int connectionTimeout = 60000;
-      int socketTimeout = 900000;
-      
-      // Set up ssl if indicated
-
-      SSLConnectionSocketFactory myFactory = null;
-      if (keystoreData != null)
-      {
-        keystoreManager = KeystoreManagerFactory.make("",keystoreData);
-        myFactory = new SSLConnectionSocketFactory(keystoreManager.getSecureSocketFactory(), new DefaultHostnameVerifier());
-      }
-      else
-      {
-        myFactory = SSLConnectionSocketFactory.getSocketFactory();
-      }
-
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      connectionManager = poolingConnectionManager;
-
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      if (strippedUserName != null)
-      {
-        credentialsProvider.setCredentials(
-          new AuthScope(serverName,serverPort),
-          new NTCredentials(strippedUserName, password, currentHost, ntlmDomain));
-      }
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(false)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-
-      // If there's a proxy, set that too.
-      if (proxyHost != null && proxyHost.length() > 0)
-      {
-
-        // Configure proxy authentication
-        if (proxyUsername != null && proxyUsername.length() > 0)
-        {
-          if (proxyPassword == null)
-            proxyPassword = "";
-          if (proxyDomain == null)
-            proxyDomain = "";
-
-          credentialsProvider.setCredentials(
-            new AuthScope(proxyHost, proxyPort),
-            new NTCredentials(proxyUsername, proxyPassword, currentHost, proxyDomain));
-        }
-
-        HttpHost proxy = new HttpHost(proxyHost, proxyPort);
-
-        requestBuilder.setProxy(proxy);
-      }
-
-      HttpClientBuilder builder = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setDefaultCredentialsProvider(credentialsProvider);
-      builder.setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new LaxRedirectStrategy());
-      httpClient = builder.build();
-      
-      proxy = new SPSProxyHelper( serverUrl, encodedServerLocation, serverLocation, serverUserName, password,
-        org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender.class, "client-config.wsdd",
-        httpClient, isClaimSpace );
-      
-    }
-    sharepointSessionTimeout = System.currentTimeMillis() + SharePointExpirationInterval;
-  }
-  
-  protected void expireSharePointSession()
-    throws ManifoldCFException
-  {
-    serverPort = -1;
-    serverUrl = null;
-    fileBaseUrl = null;
-    keystoreManager = null;
-    proxy = null;
-    httpClient = null;
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-  }
-
-  /** Decode a path item.
-  */
-  public static String pathItemDecode(String pathItem)
-  {
-      return URLDecoder.decode(pathItem.replaceAll("\\%20","+"));
-  }
-
-  /** Encode a path item.
-  */
-  public static String pathItemEncode(String pathItem)
-  {
-      String output = URLEncoder.encode(pathItem);
-      return output.replaceAll("\\+","%20");
-
-  }
-
-  /** Given a path that is /-separated, and otherwise encoded, decode properly to convert to
-  * unencoded form.
-  */
-  public static String decodePath(String relPath)
-  {
-    StringBuilder sb = new StringBuilder();
-    String[] pathEntries = relPath.split("/");
-    int k = 0;
-
-    boolean isFirst = true;
-    while (k < pathEntries.length)
-    {
-      if (isFirst)
-        isFirst = false;
-      else
-        sb.append("/");
-      sb.append(pathItemDecode(pathEntries[k++]));
-    }
-    return sb.toString();
-  }
-
-  /** Given a path that is /-separated, and otherwise unencoded, encode properly for an actual
-  * URI
-  */
-  public static String encodePath(String relPath)
-  {
-    StringBuilder sb = new StringBuilder();
-    String[] pathEntries = relPath.split("/");
-    int k = 0;
-
-    boolean isFirst = true;
-    while (k < pathEntries.length)
-    {
-      if (isFirst)
-        isFirst = false;
-      else
-        sb.append("/");
-      sb.append(pathItemEncode(pathEntries[k++]));
-    }
-    return sb.toString();
-  }
-
-  protected static StringSet emptyStringSet = new StringSet();
-  
-  /** This is the cache object descriptor for cached access tokens from
-  * this connector.
-  */
-  protected static class AuthorizationResponseDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    /** The user name */
-    protected final String userName;
-    /** The response lifetime */
-    protected final long responseLifetime;
-    /** The expiration time */
-    protected long expirationTime = -1;
-    // Parameters designed to guarantee cache key uniqueness
-    protected final String serverName;
-    protected final String serverPortString;
-    protected final String serverLocation;
-    protected final String serverProtocol;
-    protected final String serverUserName;
-    protected final String password;
-    
-    /** Constructor. */
-    public AuthorizationResponseDescription(String userName,
-      String serverName, String serverPortString, String serverLocation, String serverProtocol, String serverUserName, String password,
-      long responseLifetime, int LRUsize)
-    {
-      super("SharePointAuthority",LRUsize);
-      this.userName = userName;
-      this.responseLifetime = responseLifetime;
-      this.serverName = serverName;
-      this.serverPortString = serverPortString;
-      this.serverLocation = serverLocation;
-      this.serverProtocol = serverProtocol;
-      this.serverUserName = serverUserName;
-      this.password = password;
-    }
-
-    /** Return the invalidation keys for this object. */
-    public StringSet getObjectKeys()
-    {
-      return emptyStringSet;
-    }
-
-    /** Get the critical section name, used for synchronizing the creation of the object */
-    public String getCriticalSectionName()
-    {
-      StringBuilder sb = new StringBuilder(getClass().getName());
-      sb.append("-").append(userName);
-      sb.append("-").append(serverName);
-      sb.append("-").append(serverPortString);
-      sb.append("-").append(serverLocation);
-      sb.append("-").append(serverProtocol);
-      sb.append("-").append(serverUserName);
-      sb.append("-").append(password);
-      return sb.toString();
-    }
-
-    /** Return the object expiration interval */
-    public long getObjectExpirationTime(long currentTime)
-    {
-      if (expirationTime == -1)
-        expirationTime = currentTime + responseLifetime;
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      int rval = userName.hashCode();
-      rval += serverName.hashCode();
-      rval += serverPortString.hashCode();
-      rval += serverLocation.hashCode();
-      rval += serverProtocol.hashCode();
-      rval += serverUserName.hashCode();
-      rval += password.hashCode();
-      return rval;
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorizationResponseDescription))
-        return false;
-      AuthorizationResponseDescription ard = (AuthorizationResponseDescription)o;
-      if (!ard.userName.equals(userName))
-        return false;
-      if (!ard.serverName.equals(serverName))
-        return false;
-      if (!ard.serverPortString.equals(serverPortString))
-        return false;
-      if (!ard.serverLocation.equals(serverLocation))
-        return false;
-      if (!ard.serverProtocol.equals(serverProtocol))
-        return false;
-      if (!ard.serverUserName.equals(serverUserName))
-        return false;
-      if (!ard.password.equals(password))
-        return false;
-      return true;
-    }
-    
-  }
-  
-}
-
-
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointConfig.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointConfig.java
deleted file mode 100644
index 8da15ab..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/sharepoint/SharePointConfig.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities.sharepoint;
-
-
-/** Parameters and output data for SharePoint authority.
-*/
-public class SharePointConfig
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Configuration parameters
-
-  /** Cache lifetime */
-  public static final String PARAM_CACHELIFETIME = "Cache lifetime";
-  /** Cache LRU size */
-  public static final String PARAM_CACHELRUSIZE = "Cache LRU size";
-
-  /** SharePoint server version */
-  public static final String PARAM_SERVERVERSION = "serverVersion";
-  /** Claim space enabled? */
-  public static final String PARAM_SERVERCLAIMSPACE = "serverClaimSpace";
-  /** SharePoint server protocol */
-  public static final String PARAM_SERVERPROTOCOL = "serverProtocol";
-  /** SharePoint server name */
-  public static final String PARAM_SERVERNAME = "serverName";
-  /** SharePoint server port */
-  public static final String PARAM_SERVERPORT = "serverPort";
-  /** SharePoint server location */
-  public static final String PARAM_SERVERLOCATION = "serverLocation";
-  /** SharePoint server user name */
-  public static final String PARAM_SERVERUSERNAME = "userName";
-  /** SharePoint server password */
-  public static final String PARAM_SERVERPASSWORD = "password";
-  /** SharePoint server certificate store */
-  public static final String PARAM_SERVERKEYSTORE = "keystore";
-  /** Proxy host */
-  public static final String PARAM_PROXYHOST = "proxyHost";
-  /** Proxy port */
-  public static final String PARAM_PROXYPORT = "proxyPort";
-  /** Proxy user name */
-  public static final String PARAM_PROXYUSER = "proxyUser";
-  /** Proxy password */
-  public static final String PARAM_PROXYPASSWORD = "proxyPassword";
-  /** Proxy authentication domain */
-  public static final String PARAM_PROXYDOMAIN = "proxyDomain";
-
-  // Nodes
-  
-  /** Domain controller node */
-  public static final String NODE_DOMAINCONTROLLER = "domaincontroller";
-  
-  // Attributes
-  
-  /** Domain suffix */
-  public static final String ATTR_SUFFIX = "suffix";
-  /** DC server name */
-  public static final String ATTR_DOMAINCONTROLLER = "domaincontroller";
-  /** DC user name */
-  public static final String ATTR_USERNAME = "username";
-  /** DC password */
-  public static final String ATTR_PASSWORD = "password";
-  /** DC authentication method */
-  public static final String ATTR_AUTHENTICATION = "authentication";
-  /** DC user acls username attribute name */
-  public static final String ATTR_USERACLsUSERNAME = "useraclsusername";
-
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/IFileStream.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/IFileStream.java
deleted file mode 100644
index 97355de..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/IFileStream.java
+++ /dev/null
@@ -1,25 +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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-public interface IFileStream
-{
-  public void addFile(String relPath, String displayURI)
-    throws ManifoldCFException;
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/MatchMap.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/MatchMap.java
deleted file mode 100644
index 52287b7..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/MatchMap.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/* $Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** An instance of this class describes a "match map", which describes a translation of an input
-* string using regexp technology.
-* A match map consists of multiple clauses, which are fired in sequence.  Each clause is a regexp
-* search and replace, where the replace string can include references to the groups present in the
-* search regexp.
-* MatchMaps can be converted to strings in two different ways.  The first way is to build a single
-* string of the form "match1=replace1&match2=replace2...".  Strings of this kind must escape & and =
-* characters in the match and replace strings, where found.  The second way is to generate an array
-* of match strings and a corresponding array of replace strings.  This method requires no escaping
-* of the string contents.
-*/
-public class MatchMap
-{
-  public static final String _rcsid = "@(#)$Id: MatchMap.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the set of match regexp strings */
-  protected ArrayList matchStrings;
-  /** This is the set of Pattern objects corresponding to the match regexp strings.
-  * It's null if the patterns have not been built yet. */
-  protected Pattern[] matchPatterns = null;
-  /** This is the set of replace strings */
-  protected ArrayList replaceStrings;
-
-  /** Constructor.  Build an empty matchmap. */
-  public MatchMap()
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-  }
-
-  /** Constructor.  Build a matchmap from a single string. */
-  public MatchMap(String stringForm)
-  {
-    matchStrings = new ArrayList();
-    replaceStrings = new ArrayList();
-    StringBuilder matchString = new StringBuilder();
-    StringBuilder replaceString = new StringBuilder();
-    int i = 0;
-    while (i < stringForm.length())
-    {
-      matchString.setLength(0);
-      replaceString.setLength(0);
-      while (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&' || x == '=')
-          break;
-        i++;
-        if (x == '\\' && i < stringForm.length())
-          x = stringForm.charAt(i++);
-        matchString.append(x);
-      }
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '=')
-        {
-          i++;
-          // Pick up the second string
-          while (i < stringForm.length())
-          {
-            x = stringForm.charAt(i);
-            if (x == '&')
-              break;
-            i++;
-            if (x == '\\' && i < stringForm.length())
-              x = stringForm.charAt(i++);
-            replaceString.append(x);
-          }
-        }
-      }
-
-      matchStrings.add(matchString.toString());
-      replaceStrings.add(replaceString.toString());
-
-      if (i < stringForm.length())
-      {
-        char x = stringForm.charAt(i);
-        if (x == '&')
-          i++;
-      }
-    }
-  }
-
-  /** Constructor.  Build a matchmap from two arraylists representing match and replace strings */
-  public MatchMap(ArrayList matchStrings, ArrayList replaceStrings)
-  {
-    this.matchStrings = (ArrayList)matchStrings.clone();
-    this.replaceStrings = (ArrayList)replaceStrings.clone();
-  }
-
-  /** Get the number of match/replace strings */
-  public int getMatchCount()
-  {
-    return matchStrings.size();
-  }
-
-  /** Get a specific match string */
-  public String getMatchString(int index)
-  {
-    return (String)matchStrings.get(index);
-  }
-
-  /** Get a specific replace string */
-  public String getReplaceString(int index)
-  {
-    return (String)replaceStrings.get(index);
-  }
-
-  /** Delete a specified match/replace string pair */
-  public void deleteMatchPair(int index)
-  {
-    matchStrings.remove(index);
-    replaceStrings.remove(index);
-    matchPatterns = null;
-  }
-
-  /** Insert a match/replace string pair */
-  public void insertMatchPair(int index, String match, String replace)
-  {
-    matchStrings.add(index,match);
-    replaceStrings.add(index,replace);
-    matchPatterns = null;
-  }
-
-  /** Append a match/replace string pair */
-  public void appendMatchPair(String match, String replace)
-  {
-    matchStrings.add(match);
-    replaceStrings.add(replace);
-    matchPatterns = null;
-  }
-
-  /** Append old-style match/replace pair.
-  * This method translates old-style regexp and group output form to the
-  * current style before adding to the map.
-  */
-  public void appendOldstyleMatchPair(String oldstyleMatch, String oldstyleReplace)
-  {
-    String newStyleMatch = "^" + oldstyleMatch + "$";
-
-    // Need to build a new-style replace string from the old one.  To do that, use the
-    // original parser (which basically will guarantee that we get it right)
-
-    EvaluatorTokenStream et = new EvaluatorTokenStream(oldstyleReplace);
-    StringBuilder newStyleReplace = new StringBuilder();
-
-    while (true)
-    {
-      EvaluatorToken t = et.peek();
-      if (t == null)
-        break;
-      switch (t.getType())
-      {
-      case EvaluatorToken.TYPE_COMMA:
-        et.advance();
-        break;
-      case EvaluatorToken.TYPE_GROUP:
-        et.advance();
-        int groupNumber = t.getGroupNumber();
-        switch (t.getGroupStyle())
-        {
-        case EvaluatorToken.GROUPSTYLE_NONE:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append(")");
-          break;
-        case EvaluatorToken.GROUPSTYLE_LOWER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("l)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_UPPER:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("u)");
-          break;
-        case EvaluatorToken.GROUPSTYLE_MIXED:
-          newStyleReplace.append("$(").append(Integer.toString(groupNumber)).append("m)");
-          break;
-        default:
-          break;
-        }
-        break;
-      case EvaluatorToken.TYPE_TEXT:
-        et.advance();
-        escape(newStyleReplace,t.getTextValue());
-        break;
-      default:
-        break;
-      }
-    }
-
-    appendMatchPair(newStyleMatch,newStyleReplace.toString());
-  }
-
-  /** Escape a string so it is verbatim */
-  protected static void escape(StringBuilder output, String input)
-  {
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '$')
-        output.append(x);
-      output.append(x);
-    }
-  }
-
-  /** Convert the matchmap to string form. */
-  public String toString()
-  {
-    int i = 0;
-    StringBuilder rval = new StringBuilder();
-    while (i < matchStrings.size())
-    {
-      String matchString = (String)matchStrings.get(i);
-      String replaceString = (String)replaceStrings.get(i);
-      if (i > 0)
-        rval.append('&');
-      stuff(rval,matchString);
-      rval.append('=');
-      stuff(rval,replaceString);
-      i++;
-    }
-    return rval.toString();
-  }
-
-  /** Stuff characters */
-  protected static void stuff(StringBuilder sb, String value)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '&' || x == '=')
-        sb.append('\\');
-      sb.append(x);
-    }
-  }
-
-  /** Perform a translation.
-  */
-  public String translate(String input)
-    throws ManifoldCFException
-  {
-    // Build pattern vector if not already there
-    if (matchPatterns == null)
-    {
-      matchPatterns = new Pattern[matchStrings.size()];
-      int i = 0;
-      while (i < matchPatterns.length)
-      {
-        String regexp = (String)matchStrings.get(i);
-        try
-        {
-          matchPatterns[i] = Pattern.compile(regexp);
-        }
-        catch (java.util.regex.PatternSyntaxException e)
-        {
-          matchPatterns = null;
-          throw new ManifoldCFException("For match expression '"+regexp+"', found pattern syntax error: "+e.getMessage(),e);
-        }
-        i++;
-      }
-    }
-
-    int j = 0;
-    while (j < matchPatterns.length)
-    {
-      Pattern p = matchPatterns[j];
-      // Construct a matcher
-      Matcher m = p.matcher(input);
-      // Grab the output description
-      String outputDescription = (String)replaceStrings.get(j);
-      j++;
-      // Create a copy buffer
-      StringBuilder outputBuffer = new StringBuilder();
-      // Keep track of the index in the original string we have done up to
-      int currentIndex = 0;
-      // Scan the string using find, and for each one found, do a translation
-      while (true)
-      {
-        boolean foundOne = m.find();
-        if (foundOne == false)
-        {
-          // No subsequent match found.
-          // Copy everything from currentIndex until the end of input
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-
-        // Do a translation.  This involves copying everything in the input
-        // string up until the start of the match, then doing a replace for
-        // the match itself, and finally setting the currentIndex to the end
-        // of the match.
-
-        int matchStart = m.start(0);
-        int matchEnd = m.end(0);
-        if (matchStart == -1)
-        {
-          // The expression was degenerate; treat this as the end.
-          outputBuffer.append(input.substring(currentIndex));
-          break;
-        }
-        outputBuffer.append(input.substring(currentIndex,matchStart));
-
-        // Process translation description!
-        int i = 0;
-        while (i < outputDescription.length())
-        {
-          char x = outputDescription.charAt(i++);
-          if (x == '$' && i < outputDescription.length())
-          {
-            x = outputDescription.charAt(i++);
-            if (x == '(')
-            {
-              // Process evaluation expression
-              StringBuilder numberBuf = new StringBuilder();
-              boolean upper = false;
-              boolean lower = false;
-              boolean mixed = false;
-              while (i < outputDescription.length())
-              {
-                char y = outputDescription.charAt(i++);
-                if (y == ')')
-                  break;
-                else if (y >= '0' && y <= '9')
-                  numberBuf.append(y);
-                else if (y == 'u' || y == 'U')
-                  upper = true;
-                else if (y == 'l' || y == 'L')
-                  lower = true;
-                else if (y == 'm' || y == 'M')
-                  mixed = true;
-              }
-              String number = numberBuf.toString();
-              try
-              {
-                int groupnum = Integer.parseInt(number);
-                String groupValue = m.group(groupnum);
-                if (upper)
-                  outputBuffer.append(groupValue.toUpperCase(Locale.ROOT));
-                else if (lower)
-                  outputBuffer.append(groupValue.toLowerCase(Locale.ROOT));
-                else if (mixed && groupValue.length() > 0)
-                  outputBuffer.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT)).append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-                else
-                  outputBuffer.append(groupValue);
-
-              }
-              catch (NumberFormatException e)
-              {
-                // Silently skip, because it's an illegal group number, so nothing
-                // gets added.
-              }
-
-              // Go back around, so we don't add the $ in
-              continue;
-            }
-          }
-          outputBuffer.append(x);
-        }
-
-        currentIndex = matchEnd;
-      }
-
-      input = outputBuffer.toString();
-    }
-
-    return input;
-  }
-
-
-  // Protected classes
-
-  // These classes are used to process the old token-based replacement strings
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/Messages.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/Messages.java
deleted file mode 100644
index 0dc80c3..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.sharepoint.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.sharepoint";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/NameValue.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/NameValue.java
deleted file mode 100644
index 8636f72..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/NameValue.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $Id: NameValue.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-/** Helper class which returns pretty names plus actual stuff to append to the sharepoint path */
-public class NameValue
-{
-  public static final String _rcsid = "@(#)$Id: NameValue.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // The pretty name
-  protected String prettyName;
-  // The real value
-  protected String realValue;
-
-  /** Instantiate */
-  public NameValue(String realValue, String prettyName)
-  {
-    this.realValue = realValue;
-    this.prettyName = prettyName;
-  }
-
-  /** Get the real value */
-  public String getValue()
-  {
-    return realValue;
-  }
-
-  /** Get the pretty name */
-  public String getPrettyName()
-  {
-    return prettyName;
-  }
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SPSProxyHelper.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SPSProxyHelper.java
deleted file mode 100644
index 78fb34b..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SPSProxyHelper.java
+++ /dev/null
@@ -1,3338 +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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.regex.*;
-
-import java.io.InputStream;
-
-import javax.xml.soap.*;
-
-import org.apache.manifoldcf.core.common.XMLDoc;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import com.microsoft.schemas.sharepoint.dsp.*;
-import com.microsoft.schemas.sharepoint.soap.*;
-
-import org.apache.http.client.HttpClient;
-
-import org.apache.axis.EngineConfiguration;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axis.message.MessageElement;
-import org.apache.axis.AxisEngine;
-import org.apache.axis.ConfigurationException;
-import org.apache.axis.Handler;
-import org.apache.axis.WSDDEngineConfiguration;
-import org.apache.axis.components.logger.LogFactory;
-import org.apache.axis.deployment.wsdd.WSDDDeployment;
-import org.apache.axis.deployment.wsdd.WSDDDocument;
-import org.apache.axis.deployment.wsdd.WSDDGlobalConfiguration;
-import org.apache.axis.encoding.TypeMappingRegistry;
-import org.apache.axis.handlers.soap.SOAPService;
-import org.apache.axis.utils.Admin;
-import org.apache.axis.utils.Messages;
-import org.apache.axis.utils.XMLUtils;
-import org.w3c.dom.Document;
-
-/**
-*
-* @author Michael Cummings
-*
-*/
-public class SPSProxyHelper {
-
-
-  public static final String HTTPCLIENT_PROPERTY = org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender.HTTPCLIENT_PROPERTY;
-
-  private String serverUrl;
-  private String serverLocation;
-  private String decodedServerLocation;
-  private String baseUrl;
-  private String userName;
-  private String password;
-  private EngineConfiguration configuration;
-  private HttpClient httpClient;
-
-  /**
-  *
-  * @param serverUrl
-  * @param userName
-  * @param password
-  */
-  public SPSProxyHelper( String serverUrl, String serverLocation, String decodedServerLocation, String userName, String password,
-    Class resourceClass, String configFileName, HttpClient httpClient )
-  {
-    this.serverUrl = serverUrl;
-    this.serverLocation = serverLocation;
-    this.decodedServerLocation = decodedServerLocation;
-    if (serverLocation.equals("/"))
-      baseUrl = serverUrl;
-    else
-      baseUrl = serverUrl + serverLocation;
-    this.userName = userName;
-    this.password = password;
-    this.configuration = new ResourceProvider(resourceClass,configFileName);
-    this.httpClient = httpClient;
-  }
-
-  /**
-  * Get the acls for a document library.
-  * @param site
-  * @param guid is the list/library GUID
-  * @return array of sids
-  * @throws Exception
-  */
-  public String[] getACLs(String site, String guid, boolean activeDirectoryAuthority )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getACLs; site='"+site+"', guid='"+guid+"', activeDirectoryAuthority="+activeDirectoryAuthority);
-
-    long currentTime;
-    try
-    {
-      if ( site.compareTo("/") == 0 ) site = ""; // root case
-        UserGroupWS userService = new UserGroupWS( baseUrl + site, userName, password, configuration, httpClient  );
-      com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall = userService.getUserGroupSoapHandler( );
-
-      PermissionsWS aclService = new PermissionsWS( baseUrl + site, userName, password, configuration, httpClient );
-      com.microsoft.schemas.sharepoint.soap.directory.PermissionsSoap aclCall = aclService.getPermissionsSoapHandler( );
-
-      com.microsoft.schemas.sharepoint.soap.directory.GetPermissionCollectionResponseGetPermissionCollectionResult aclResult = aclCall.getPermissionCollection( guid, "List" );
-      org.apache.axis.message.MessageElement[] aclList = aclResult.get_any();
-
-      final String xmlResponse = aclList[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getACLs xml response: "+xmlResponse);
-      
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-      
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:GetPermissionCollection' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:GetPermissionCollection"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'ns1:GetPermissionCollection'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);
-
-      if ( nodeList.size() != 1 )
-      {
-        throw new ManifoldCFException( " No results found." );
-      }
-      parent = nodeList.get(0);
-      nodeList.clear();
-      doc.processPath( nodeList, "*", parent );
-      Set<String> sids = new HashSet<String>();
-      int i = 0;
-      for (; i< nodeList.size(); i++ )
-      {
-        Object node = nodeList.get( i );
-        String mask = doc.getValue( node, "Mask" );
-        long maskValue = new Long(mask).longValue();
-        if ((maskValue & 1L) == 1L)
-        {
-          // Permission to view
-          String isUser = doc.getValue( node, "MemberIsUser" );
-
-          if ( isUser.compareToIgnoreCase("True") == 0 )
-          {
-            // Use AD user or group
-            String userLogin = doc.getValue( node, "UserLogin" );
-            String userSid = getSidForUser( userCall, userLogin, activeDirectoryAuthority );
-            sids.add( userSid );
-          }
-          else
-          {
-            // Role
-            List<String> roleSids;
-            String roleName = doc.getValue( node, "RoleName" );
-            if ( roleName.length() == 0)
-            {
-              roleName = doc.getValue(node,"GroupName");
-              if (roleName != null && roleName.length() > 0)
-              {
-                roleSids = getSidsForGroup(userCall, roleName, activeDirectoryAuthority);
-              }
-              else
-              {
-                Logging.connectors.warn("SharePoint: Unrecognized permission collection entry: no role, no group: "+doc.getXML());
-                roleSids = new ArrayList<String>();
-              }
-            }
-            else
-            {
-              roleSids = getSidsForRole(userCall, roleName, activeDirectoryAuthority);
-            }
-
-            for (String sid : roleSids)
-            {
-              sids.add( sid );
-            }
-          }
-        }
-      }
-
-      return sids.toArray( new String[0] );
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting the acls for site "+site+" guid "+guid+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist or was external reference
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The page at "+baseUrl+site+" did not exist or was external; skipping list/library");
-            return null;
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to get the acls
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The crawl user did not have access to the permissions service for "+baseUrl+site+"; skipping documents within");
-            return null;
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x82000006"))
-          {
-            // List did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The list "+guid+" in site "+site+" did not exist or was external; skipping list/library");
-            return null;
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-              String errorString = "";
-              if (elem != null)
-                errorString = elem2.getFirstChild().getNodeValue().trim();
-
-              Logging.connectors.debug("SharePoint: Getting permissions for the list "+guid+" in site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString+" - Skipping",e);
-            }
-            return null;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting the acls for site "+site+" guid "+guid+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-
-        throw new ServiceInterruption("Unknown SharePoint server error: "+e.getMessage()+" - retrying", e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unknown remote exception getting the acls for site "+site+" guid "+guid+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting the acls for site "+site+" guid "+guid,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-  /**
-  * Get the acls for a document.
-  * NOTE that this function only works for SharePoint 2007+ with the MCPermissions web service installed.
-  * @param site is the encoded subsite path
-  * @param file is the encoded file url (not including protocol or server or location, but including encoded subsite, library and folder/file path)
-  * @return array of document SIDs
-  * @throws ManifoldCFException
-  * @throws ServiceInterruption
-  */
-  public String[] getDocumentACLs(String site, String file, boolean activeDirectoryAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime;
-    try
-    {
-      if ( site.compareTo("/") == 0 ) site = ""; // root case
-
-      // Calculate the full server-relative path of the file
-      String encodedRelativePath = serverLocation + file;
-      if (encodedRelativePath.startsWith("/"))
-        encodedRelativePath = encodedRelativePath.substring(1);
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: In getDocumentACLs for site '"+site+"', file '"+file+"': Encoded relative path is '"+encodedRelativePath+"'");
-      UserGroupWS userService = new UserGroupWS( baseUrl + site, userName, password, configuration, httpClient  );
-      com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall = userService.getUserGroupSoapHandler( );
-
-      MCPermissionsWS aclService = new MCPermissionsWS( baseUrl + site, userName, password, configuration, httpClient );
-      com.microsoft.sharepoint.webpartpages.PermissionsSoap aclCall = aclService.getPermissionsSoapHandler( );
-
-      com.microsoft.sharepoint.webpartpages.GetPermissionCollectionResponseGetPermissionCollectionResult aclResult = aclCall.getPermissionCollection( encodedRelativePath, "Item" );
-      if (aclResult == null)
-      {
-        Logging.connectors.debug("SharePoint: getDocumentACLs: document acls were null");
-        return null;
-      }
-      
-      org.apache.axis.message.MessageElement[] aclList = aclResult.get_any();
-
-      final String xmlResponse = aclList[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-      {
-        Logging.connectors.debug("SharePoint: getDocumentACLs xml response: " + xmlResponse);
-      }
-
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-      
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:GetPermissionCollection' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("GetPermissionCollection"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'GetPermissionCollection'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);
-
-      if ( nodeList.size() != 1 )
-      {
-        throw new ManifoldCFException( " No results found." );
-      }
-      parent = nodeList.get(0);
-      nodeList.clear();
-      doc.processPath( nodeList, "*", parent );
-      Set<String> sids = new HashSet<String>();
-      int i = 0;
-      for (; i< nodeList.size(); i++ )
-      {
-        Object node = nodeList.get( i );
-        String mask = doc.getValue( node, "Mask" );
-        long maskValue = new Long(mask).longValue();
-        if ((maskValue & 1L) == 1L)
-        {
-          // Permission to view
-          String isUser = doc.getValue( node, "MemberIsUser" );
-
-          if ( isUser.compareToIgnoreCase("True") == 0 )
-          {
-            // Use AD user or group
-            String userLogin = doc.getValue( node, "UserLogin" );
-            String userSid = getSidForUser( userCall, userLogin, activeDirectoryAuthority );
-            sids.add( userSid );
-          }
-          else
-          {
-            // Role
-            List<String> roleSids;
-            String roleName = doc.getValue( node, "RoleName" );
-            if ( roleName.length() == 0)
-            {
-              roleName = doc.getValue(node,"GroupName");
-              roleSids = getSidsForGroup(userCall, roleName, activeDirectoryAuthority);
-            }
-            else
-            {
-              roleSids = getSidsForRole(userCall, roleName, activeDirectoryAuthority);
-            }
-
-            for (String sid : roleSids)
-            {
-              sids.add( sid );
-            }
-          }
-        }
-      }
-
-      return sids.toArray( new String[0] );
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting the acls for site "+site+" file "+file+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The page at "+baseUrl+site+" did not exist or was external; skipping library");
-            return null;
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to get the acls
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The crawl user did not have access to the MCPermissions service for "+baseUrl+site+"; skipping documents within");
-            return null;
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x82000006"))
-          {
-            // List did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The file "+file+" in site "+site+" did not exist or was external; skipping file");
-            return null;
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-              String errorString = "";
-              if (elem != null)
-                errorString = elem2.getFirstChild().getNodeValue().trim();
-
-              Logging.connectors.debug("SharePoint: Getting permissions for the file "+file+" in site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString+" - Skipping",e);
-            }
-            return null;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting the acls for site "+site+" file "+file+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-
-        throw new ServiceInterruption("Unknown SharePoint server error: "+e.getMessage()+" - retrying", e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unknown remote exception getting the acls for site "+site+" file "+file+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting the acls for site "+site+" file "+file,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-  /**
-  *
-  * @param site
-  * @param docLibrary
-  * @return an XML document
-  * @throws ManifoldCFException
-  * @throws ServiceInterruption
-  */
-  public boolean getChildren(IFileStream fileStream, String site, String guid, boolean dspStsWorks )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getChildren; site='"+site+"', guid='"+guid+"', dspStsWorks="+dspStsWorks);
-
-    long currentTime;
-    try
-    {
-      if ( site.equals("/") ) site = ""; // root case
-      if ( dspStsWorks )
-      {
-        StsAdapterWS listService = new StsAdapterWS( baseUrl + site, userName, password, configuration, httpClient );
-        StsAdapterSoapStub stub = (StsAdapterSoapStub)listService.getStsAdapterSoapHandler();
-
-        String[] vArray = new String[1];
-        vArray[0] = "1.0";
-        VersionsHeader myVersion = new VersionsHeader();
-        myVersion.setVersion( vArray );
-
-        stub.setHeader( "http://schemas.microsoft.com/sharepoint/dsp", "versions", myVersion );
-
-        RequestHeader reqHeader = new RequestHeader();
-        reqHeader.setDocument( DocumentType.content );
-        reqHeader.setMethod(MethodType.query );
-
-        stub.setHeader( "http://schemas.microsoft.com/sharepoint/dsp", "request", reqHeader );
-
-        QueryRequest myRequest = new QueryRequest();
-
-        DSQuery sQuery = new DSQuery();
-        sQuery.setSelect( "/list[@id='" + guid + "']" );
-        myRequest.setDsQuery( sQuery );
-
-        StsAdapterSoap call = stub;
-        ArrayList nodeList = new ArrayList();
-
-        QueryResponse resp = call.query( myRequest );
-        org.apache.axis.message.MessageElement[] list = resp.get_any();
-
-        final String xmlResponse = list[0].toString();
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: getChildren xml response: "+xmlResponse);
-
-        final XMLDoc doc;
-        try
-        {
-          doc = new XMLDoc( xmlResponse );
-        }
-        catch (ManifoldCFException e) {
-          return false;
-        }
-
-        doc.processPath(nodeList, "*", null);
-        if (nodeList.size() != 1)
-        {
-          throw new ManifoldCFException("Bad xml - missing outer 'ns1:dsQueryResponse' node - there are "+Integer.toString(nodeList.size())+" nodes");
-        }
-
-        Object parent = nodeList.get(0);
-        //System.out.println( "Outer NodeName = " + doc.getNodeName(parent) );
-        if (!doc.getNodeName(parent).equals("ns1:dsQueryResponse"))
-          throw new ManifoldCFException("Bad xml - outer node is not 'ns1:dsQueryResponse'");
-
-        nodeList.clear();
-        doc.processPath(nodeList, "*", parent);
-
-        if ( nodeList.size() != 2 )
-        {
-          throw new ManifoldCFException( " No results found." );
-        }
-
-        // Now, extract the files from the response document
-        XMLDoc docs = doc;
-        ArrayList nodeDocs = new ArrayList();
-
-        docs.processPath( nodeDocs, "*", null );
-        parent = nodeDocs.get(0);                // ns1:dsQueryResponse
-        nodeDocs.clear();
-        docs.processPath(nodeDocs, "*", parent);
-        Object documents = nodeDocs.get(1);
-        nodeDocs.clear();
-        docs.processPath(nodeDocs, "*", documents);
-
-        StringBuilder sb = new StringBuilder();
-        for( int j =0; j < nodeDocs.size(); j++)
-        {
-          Object node = nodeDocs.get(j);
-          Logging.connectors.debug( node.toString() );
-          String relPath = docs.getData( docs.getElement( node, "FileRef" ) );
-          fileStream.addFile( relPath, null );
-        }
-      }
-      else
-      {
-        // New code
-        
-        MCPermissionsWS itemService = new MCPermissionsWS( baseUrl + site, userName, password, configuration, httpClient );
-        com.microsoft.sharepoint.webpartpages.PermissionsSoap itemCall = itemService.getPermissionsSoapHandler( );
-
-        int startingIndex = 0;
-        int amtToRequest = 10000;
-        while (true)
-        {
-          com.microsoft.sharepoint.webpartpages.GetListItemsResponseGetListItemsResult itemsResult =
-            itemCall.getListItems(guid,Integer.toString(startingIndex),Integer.toString(amtToRequest));
-          
-          MessageElement[] itemsList = itemsResult.get_any();
-
-          if (Logging.connectors.isDebugEnabled()){
-            Logging.connectors.debug("SharePoint: getChildren xml response: " + itemsList[0].toString());
-          }
-
-          if (itemsList.length != 1)
-            throw new ManifoldCFException("Bad response - expecting one outer 'GetListItems' node, saw "+Integer.toString(itemsList.length));
-          
-          MessageElement items = itemsList[0];
-          if (!items.getElementName().getLocalName().equals("GetListItems"))
-            throw new ManifoldCFException("Bad response - outer node should have been 'GetListItems' node");
-          
-          int resultCount = 0;
-          Iterator iter = items.getChildElements();
-          while (iter.hasNext())
-          {
-            MessageElement child = (MessageElement)iter.next();
-            if (child.getElementName().getLocalName().equals("GetListItemsResponse"))
-            {
-              Iterator resultIter = child.getChildElements();
-              while (resultIter.hasNext())
-              {
-                MessageElement result = (MessageElement)resultIter.next();
-                if (result.getElementName().getLocalName().equals("GetListItemsResult"))
-                {
-                  resultCount++;
-                  String relPath = result.getAttribute("FileRef");
-                  String displayURL = result.getAttribute("ListItemURL");
-                  fileStream.addFile( relPath, displayURL );
-                }
-              }
-              
-            }
-          }
-          
-          if (resultCount < amtToRequest)
-            break;
-          
-          startingIndex += resultCount;
-        }
-      }
-      
-      return true;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting documents for site "+site+" guid "+guid+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return false;
-      }
-      currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The page at "+baseUrl+site+" did not exist or was external; skipping library");
-            return false;
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to get the acls
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The crawl user did not have access to list documents for "+baseUrl+site+"; skipping documents within");
-            return false;
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x82000006"))
-          {
-            // List did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The list "+guid+" in site "+site+" did not exist or was external; skipping library");
-            return false;
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-              String errorString = "";
-              if (elem != null)
-                errorString = elem2.getFirstChild().getNodeValue().trim();
-
-              Logging.connectors.debug("SharePoint: Getting child documents for the list "+guid+" in site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString+" - Skipping",e);
-            }
-            return false;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting child documents for site "+site+" guid "+guid+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-
-        throw new ServiceInterruption("Unknown SharePoint server error: "+e.getMessage()+" - retrying",  e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unknown remote exception getting child documents for site "+site+" guid "+guid+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(),  e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting child documents for site "+site+" guid "+guid,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-
-  /**
-  *
-  * @param parentSite
-  * @param docLibrary
-  * @return document library ID
-  * @throws ManifoldCFException
-  * @throws ServiceInterruption
-  */
-  public String getDocLibID(String parentSite, String parentSiteDecoded, String docLibrary)
-    throws ServiceInterruption, ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getDocLibID; parentSite='"+parentSite+"', parentSiteDecoded='"+parentSiteDecoded+"', docLibrary='"+docLibrary+"'");
-
-    long currentTime;
-    try
-    {
-      // The old code here used to call the lists service to find the guid, using the doc library url name as the title.
-      // This did not work when the title differed from the url name.
-      // On 5/8/2008 I modified the code to use the lists service to locate the correct record by matching the defaultViewUrl field,
-      // so that we instead iterate through the children.  It's more expensive but it works.
-      String parentSiteRequest = parentSite;
-
-      if ( parentSiteRequest.equals("/"))
-      {
-        parentSiteRequest = ""; // root case
-        parentSiteDecoded = "";
-      }
-
-      ListsWS listsService = new ListsWS( baseUrl + parentSiteRequest, userName, password, configuration, httpClient );
-      ListsSoap listsCall = listsService.getListsSoapHandler( );
-
-      GetListCollectionResponseGetListCollectionResult listResp = listsCall.getListCollection();
-      org.apache.axis.message.MessageElement[] lists = listResp.get_any();
-
-      final String xmlResponse = lists[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getDocLibID xml response: "+xmlResponse);
-      
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:Lists' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:Lists"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Lists'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);  // <ns1:Lists>
-
-      String prefixPath = decodedServerLocation + parentSiteDecoded + "/";
-
-      int i = 0;
-      while (i < nodeList.size())
-      {
-        Object o = nodeList.get( i++ );
-
-        String baseType = doc.getValue( o, "BaseType");
-        if ( baseType.equals("1") )
-        {
-          // We think it's a library
-
-          // This is how we display it, so this has the right path extension
-          String urlPath = doc.getValue( o, "DefaultViewUrl" );
-
-          // If it has no view url, we don't have any idea what to do with it
-          if (urlPath != null && urlPath.length() > 0)
-          {
-            // Normalize conditionally
-            if (!urlPath.startsWith("/"))
-              urlPath = prefixPath + urlPath;
-            // Get rid of what we don't want, unconditionally
-            if (urlPath.startsWith(prefixPath))
-            {
-              urlPath = urlPath.substring(prefixPath.length());
-              // We're at the library name.  Figure out where the end of it is.
-              int index = urlPath.indexOf("/");
-              if (index == -1)
-                throw new ManifoldCFException("Bad library view url without site: '"+urlPath+"'");
-              String pathpart = urlPath.substring(0,index);
-
-              if ( pathpart.equals(docLibrary) )
-              {
-                // We found it!
-                // Return its ID
-                return doc.getValue( o, "ID" );
-              }
-            }
-            else
-            {
-              Logging.connectors.warn("SharePoint: Library view url is not in the expected form: '"+urlPath+"'; it should start with '"+prefixPath+"'; skipping");
-            }
-          }
-        }
-      }
-
-      // Not found - return null
-      return null;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting the library ID for site "+parentSite+" library "+docLibrary+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The page at "+baseUrl+parentSite+" did not exist or was external; skipping library");
-            return null;
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to list libraries
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The crawl user did not have access to list libraries for "+baseUrl+parentSite+"; skipping");
-            return null;
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+parentSite+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+parentSite+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x82000006"))
-          {
-            // List did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The list "+docLibrary+" in site "+parentSite+" did not exist or was external; skipping library");
-            return null;
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-              String errorString = "";
-              if (elem != null)
-                errorString = elem2.getFirstChild().getNodeValue().trim();
-
-              Logging.connectors.debug("SharePoint: Getting library ID for the list "+docLibrary+" in site "+parentSite+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString+" - Skipping",e);
-            }
-            return null;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting library ID for site "+parentSite+" library "+docLibrary+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-
-        throw new ServiceInterruption("Unknown SharePoint server error: "+e.getMessage()+" - retrying", e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unknown remote exception getting library ID for site "+parentSite+" library "+docLibrary+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting library ID for site "+parentSite+" library "+docLibrary,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-  /**
-  *
-  * @param parentSite
-  * @param list name
-  * @return document library ID
-  * @throws ManifoldCFException
-  * @throws ServiceInterruption
-  */
-  public String getListID(String parentSite, String parentSiteDecoded, String listName)
-    throws ServiceInterruption, ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getListID; parentsite='"+parentSite+"', parentSiteDecoded='"+parentSiteDecoded+"', listName='"+listName+"'");
-
-    long currentTime;
-    try
-    {
-      // The old code here used to call the lists service to find the guid, using the doc library url name as the title.
-      // This did not work when the title differed from the url name.
-      // On 5/8/2008 I modified the code to use the lists service to locate the correct record by matching the defaultViewUrl field,
-      // so that we instead iterate through the children.  It's more expensive but it works.
-      String parentSiteRequest = parentSite;
-
-      if ( parentSiteRequest.equals("/"))
-      {
-        parentSiteRequest = ""; // root case
-        parentSiteDecoded = "";
-      }
-
-      ListsWS listsService = new ListsWS( baseUrl + parentSiteRequest, userName, password, configuration, httpClient );
-      ListsSoap listsCall = listsService.getListsSoapHandler( );
-
-      GetListCollectionResponseGetListCollectionResult listResp = listsCall.getListCollection();
-      org.apache.axis.message.MessageElement[] lists = listResp.get_any();
-
-      final String xmlResponse = lists[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getListID xml response: "+xmlResponse);
-      
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:Lists' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:Lists"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Lists'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);  // <ns1:Lists>
-
-      String prefixPath = decodedServerLocation + parentSiteDecoded + "/";
-
-      int i = 0;
-      while (i < nodeList.size())
-      {
-        Object o = nodeList.get( i++ );
-
-        String baseType = doc.getValue( o, "BaseType");
-        if ( baseType.equals("0") )
-        {
-          // We think it's a list
-
-          // This is how we display it, so this has the right path extension
-          String urlPath = doc.getValue( o, "DefaultViewUrl" );
-
-          // If it has no view url, we don't have any idea what to do with it
-          if (urlPath != null && urlPath.length() > 0)
-          {
-            // Normalize conditionally
-            if (!urlPath.startsWith("/"))
-              urlPath = prefixPath + urlPath;
-            // Get rid of what we don't want, unconditionally
-            if (urlPath.startsWith(prefixPath))
-            {
-              urlPath = urlPath.substring(prefixPath.length());
-              // We're at the Lists/listname part of the name.  Figure out where the end of it is.
-              int index = urlPath.indexOf("/");
-              if (index == -1)
-                throw new ManifoldCFException("Bad list view url without site: '"+urlPath+"'");
-              String pathpart = urlPath.substring(0,index);
-              if("Lists".equals(pathpart))
-              {
-                int k = urlPath.indexOf("/",index+1);
-                if (k == -1)
-                  throw new ManifoldCFException("Bad list view url without 'Lists': '"+urlPath+"'");
-                pathpart = urlPath.substring(index+1,k);
-              }
-
-              if ( pathpart.equals(listName) )
-              {
-                // We found it!
-                // Return its ID
-                return doc.getValue( o, "ID" );
-              }
-            }
-            else
-            {
-              Logging.connectors.warn("SharePoint: List view url is not in the expected form: '"+urlPath+"'; expected something beginning with '"+prefixPath+"'; skipping");
-            }
-          }
-        }
-      }
-
-      // Not found - return null
-      return null;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting the list ID for site "+parentSite+" list "+listName+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The page at "+baseUrl+parentSite+" did not exist or was external; skipping list");
-            return null;
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to list libraries
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The crawl user did not have access to list lists for "+baseUrl+parentSite+"; skipping");
-            return null;
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+parentSite+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+parentSite+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x82000006"))
-          {
-            // List did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The list "+listName+" in site "+parentSite+" did not exist or was external; skipping list");
-            return null;
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-              String errorString = "";
-              if (elem != null)
-                errorString = elem2.getFirstChild().getNodeValue().trim();
-
-              Logging.connectors.debug("SharePoint: Getting list ID for the list "+listName+" in site "+parentSite+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString+" - Skipping",e);
-            }
-            return null;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting list ID for site "+parentSite+" list "+listName+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-
-        throw new ServiceInterruption("Unknown SharePoint server error: "+e.getMessage()+" - retrying", e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unknown remote exception getting list ID for site "+parentSite+" list "+listName+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting list ID for site "+parentSite+" list "+listName,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-  /**
-  *
-  * @param site
-  * @param docPath
-  * @return an XML document
-  * @throws ManifoldCFException
-  * @throws ServiceInterruption
-  */
-  public XMLDoc getVersions( String site, String docPath)
-    throws ServiceInterruption, ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getVersions; site='"+site+"', docPath='"+docPath+"'");
-
-    long currentTime;
-    try
-    {
-      if ( site.compareTo("/") == 0 ) site = ""; // root case
-        VersionsWS versionsService = new VersionsWS( baseUrl + site, userName, password, configuration, httpClient );
-      VersionsSoap versionsCall = versionsService.getVersionsSoapHandler( );
-
-      GetVersionsResponseGetVersionsResult versionsResp = versionsCall.getVersions( docPath );
-      org.apache.axis.message.MessageElement[] lists = versionsResp.get_any();
-
-      final String xmlResponse = lists[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getVersions response: "+xmlResponse);
-      
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'results' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("results"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'results'");
-
-      return doc;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting versions for site "+site+" docpath "+docPath+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      currentTime = System.currentTimeMillis();
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The page at "+baseUrl+site+" did not exist or was external; skipping library");
-            return null;
-          }
-          else if (httpErrorCode.equals("401"))
-          {
-            // User did not have permissions for this library to get the acls
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The crawl user did not have access to get versions for "+baseUrl+site+"; skipping");
-            return null;
-          }
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          if (sharepointErrorCode.equals("0x82000006"))
-          {
-            // List did not exist
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: The docpath "+docPath+" in site "+site+" did not exist or was external; skipping library");
-            return null;
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-            {
-              org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-              String errorString = "";
-              if (elem != null)
-                errorString = elem2.getFirstChild().getNodeValue().trim();
-
-              Logging.connectors.debug("SharePoint: Getting versions for the docpath "+docPath+" in site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString+" - Skipping",e);
-            }
-            return null;
-          }
-        }
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting versions for site "+site+" docpath "+docPath+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-
-        throw new ServiceInterruption("Unknown SharePoint server error: "+e.getMessage()+" - retrying", e, currentTime + 300000L,
-          currentTime + 3 * 60 * 60000L,-1,false);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unknown remote exception getting versions for site "+site+" docpath "+docPath+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString()+" - retrying",e);
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting versions for site "+site+" docpath "+docPath,e);
-      throw new ManifoldCFException("Unexpected remote procedure exception: "+e.getMessage(), e);
-    }
-  }
-
-  /**
-  *
-  * @param userCall
-  * @param userLogin
-  * @return
-  * @throws Exception
-  */
-  private String getSidForUser(com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall, String userLogin,
-    boolean activeDirectoryAuthority)
-    throws ManifoldCFException, java.net.MalformedURLException, javax.xml.rpc.ServiceException, java.rmi.RemoteException
-  {
-    String rval;
-    
-    if (!activeDirectoryAuthority)
-    {
-      // Do we want to return user ID via getUserInfo?  A:No; user login is the right thing to return.
-      rval = "U"+userLogin;
-    }
-    else
-    {
-      com.microsoft.schemas.sharepoint.soap.directory.GetUserInfoResponseGetUserInfoResult userResp = userCall.getUserInfo( userLogin );
-      org.apache.axis.message.MessageElement[] userList = userResp.get_any();
-
-      if (userList.length != 1)
-        throw new ManifoldCFException("Bad response - expecting one outer 'GetUserInfo' node, saw "+Integer.toString(userList.length));
-      
-      MessageElement users = userList[0];
-      if (!users.getElementName().getLocalName().equals("GetUserInfo"))
-        throw new ManifoldCFException("Bad response - outer node should have been 'GetUserInfo' node");
-          
-      String userID = null;
-      
-      Iterator userIter = users.getChildElements();
-      while (userIter.hasNext())
-      {
-        MessageElement child = (MessageElement)userIter.next();
-        if (child.getElementName().getLocalName().equals("User"))
-        {
-          userID = child.getAttribute("Sid");
-        }
-      }
-      
-      if (userID == null)
-        throw new ManifoldCFException("Could not find user login '"+userLogin+"' so could not get SID");
-
-      rval = userID;
-    }
-    return rval;
-  }
-
-  /**
-  *
-  * @param userCall
-  * @param groupName
-  * @return
-  * @throws Exception
-  */
-  private List<String> getSidsForGroup(com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall, String groupName,
-    boolean activeDirectoryAuthority)
-    throws ManifoldCFException, java.net.MalformedURLException, javax.xml.rpc.ServiceException, java.rmi.RemoteException
-  {
-    List<String> rval = new ArrayList<String>();
-    
-    com.microsoft.schemas.sharepoint.soap.directory.GetUserCollectionFromGroupResponseGetUserCollectionFromGroupResult roleResp = userCall.getUserCollectionFromGroup(groupName);
-    org.apache.axis.message.MessageElement[] roleList = roleResp.get_any();
-
-    if (roleList.length != 1)
-      throw new ManifoldCFException("Bad response - expecting one outer 'GetUserCollectionFromGroup' node, saw "+Integer.toString(roleList.length));
-
-    MessageElement roles = roleList[0];
-    if (!roles.getElementName().getLocalName().equals("GetUserCollectionFromGroup"))
-      throw new ManifoldCFException("Bad response - outer node should have been 'GetUserCollectionFromGroup' node");
-
-    Iterator rolesIter = roles.getChildElements();
-
-    if (!activeDirectoryAuthority)
-    {
-      // We need not only the group itself, but its user children that are Claims-based entities
-      rval.add("G"+groupName);
-      while (rolesIter.hasNext())
-      {
-        MessageElement child = (MessageElement)rolesIter.next();
-        if (child.getElementName().getLocalName().equals("Users"))
-        {
-          Iterator usersIterator = child.getChildElements();
-          while (usersIterator.hasNext())
-          {
-            MessageElement user = (MessageElement)usersIterator.next();
-            if (user.getElementName().getLocalName().equals("User"))
-            {
-              String isDomainGroup = user.getAttribute("IsDomainGroup");
-              if (isDomainGroup != null && isDomainGroup.equals("True"))
-              {
-                // Add a user token for the domain group
-                rval.add("U"+user.getAttribute("LoginName"));
-              }
-            }
-          }
-        }
-      }      
-    }
-    else
-    {
-      while (rolesIter.hasNext())
-      {
-        MessageElement child = (MessageElement)rolesIter.next();
-        if (child.getElementName().getLocalName().equals("Users"))
-        {
-          Iterator usersIterator = child.getChildElements();
-          while (usersIterator.hasNext())
-          {
-            MessageElement user = (MessageElement)usersIterator.next();
-            if (user.getElementName().getLocalName().equals("User"))
-            {
-              rval.add(user.getAttribute("Sid"));
-            }
-          }
-        }
-      }      
-    }
-    return rval;
-  }
-
-  /**
-  *
-  * @param userCall
-  * @param roleName
-  * @return
-  * @throws Exception
-  */
-  private List<String> getSidsForRole( com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall, String roleName,
-    boolean activeDirectoryAuthority)
-    throws ManifoldCFException, java.net.MalformedURLException, javax.xml.rpc.ServiceException, java.rmi.RemoteException
-  {
-    List<String> rval = new ArrayList<String>();
-    if (!activeDirectoryAuthority)
-    {
-      // Do we want to look up role ID, using usergroup.getRoleInfo?
-      // MHL
-      rval.add("R"+roleName);
-    }
-    else
-    {
-      com.microsoft.schemas.sharepoint.soap.directory.GetUserCollectionFromRoleResponseGetUserCollectionFromRoleResult roleResp = userCall.getUserCollectionFromRole( roleName );
-      org.apache.axis.message.MessageElement[] roleList = roleResp.get_any();
-
-      if (roleList.length != 1)
-        throw new ManifoldCFException("Bad response - expecting one outer 'GetUserCollectionFromRole' node, saw "+Integer.toString(roleList.length));
-
-      MessageElement roles = roleList[0];
-      if (!roles.getElementName().getLocalName().equals("GetUserCollectionFromRole"))
-        throw new ManifoldCFException("Bad response - outer node should have been 'GetUserCollectionFromRole' node");
-
-      Iterator rolesIter = roles.getChildElements();
-      while (rolesIter.hasNext())
-      {
-        MessageElement child = (MessageElement)rolesIter.next();
-        if (child.getElementName().getLocalName().equals("Users"))
-        {
-          Iterator usersIterator = child.getChildElements();
-          while (usersIterator.hasNext())
-          {
-            MessageElement user = (MessageElement)usersIterator.next();
-            if (user.getElementName().getLocalName().equals("User"))
-            {
-              rval.add(user.getAttribute("Sid"));
-            }
-          }
-        }
-      }      
-    }
-    return rval;
-  }
-
-  /**
-  *
-  * @return true if connection OK
-  * @throws java.net.MalformedURLException
-  * @throws javax.xml.rpc.ServiceException
-  * @throws java.rmi.RemoteException
-  */
-  public boolean checkConnection( String site, boolean sps30 )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime;
-    try
-    {
-      if (site.equals("/"))
-        site = "";
-
-      // Attempt a listservice call
-      ListsWS listService = new ListsWS( baseUrl + site, userName, password, configuration, httpClient );
-      ListsSoap listCall = listService.getListsSoapHandler();
-      listCall.getListCollection();
-
-      // If this is 3.0, we should also attempt to reach our custom webservice
-      if (sps30)
-      {
-        // The web service allows us to get acls for a site, so that's what we will attempt
-
-        MCPermissionsWS aclService = new MCPermissionsWS( baseUrl + site, userName, password, configuration, httpClient );
-        com.microsoft.sharepoint.webpartpages.PermissionsSoap aclCall = aclService.getPermissionsSoapHandler( );
-
-        aclCall.getPermissionCollection( "/", "Web" );
-      }
-
-      return true;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception checking connection - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-          {
-            // Page did not exist
-            throw new ManifoldCFException("The site at "+baseUrl+site+" did not exist or was external; skipping");
-          }
-          else if (httpErrorCode.equals("401"))
-            throw new ManifoldCFException("Crawl user did not authenticate properly, or has insufficient permissions to access "+baseUrl+site+": "+e.getMessage(),e);
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Http error "+httpErrorCode+" while reading from "+baseUrl+site+" - check IIS and SharePoint security settings! "+e.getMessage(),e);
-	  else if (httpErrorCode.equals("302"))
-	    throw new ManifoldCFException("The correct version of ManifoldCF's MCPermissions web service may not be installed on the target SharePoint server.  MCPermissions service is needed for SharePoint repositories version 3.0 or higher, to allow access to security information for files and folders.  Consult your system administrator.");
-          else
-            throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorcode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
-          org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/","errorstring"));
-          String errorString = "";
-          if (elem != null)
-            errorString = elem2.getFirstChild().getNodeValue().trim();
-
-          throw new ManifoldCFException("Accessing site "+site+" failed with unexpected SharePoint error code "+sharepointErrorCode+": "+errorString,e);
-        }
-        throw new ManifoldCFException("Unknown SharePoint server error accessing site "+site+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      throw new ManifoldCFException("Got an unknown remote exception accessing site "+site+" - axis fault = "+e.getFaultCode().getLocalPart()+", detail = "+e.getFaultString(),e);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      // We expect the axis exception to be thrown, not this generic one!
-      // So, fail hard if we see it.
-      throw new ManifoldCFException("Got an unexpected remote exception accessing site "+site+": "+e.getMessage(),e);
-    }
-  }
-
-  /** Gets a list of attachment URLs, given a site, list name, and list item ID.  These will be returned
-  * as name/value pairs; the "name" is the name of the attachment, and the "value" is the full URL.
-  */
-  public List<NameValue> getAttachmentNames( String site, String listName, String itemID )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime;
-    try
-    {
-      ArrayList<NameValue> result = new ArrayList<NameValue>();
-      
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: In getAttachmentNames; site='"+site+"', listName='"+listName+"', itemID='"+itemID+"'");
-
-      // The docLibrary must be a GUID, because we don't have  title.
-
-      if ( site.compareTo( "/") == 0 )
-        site = "";
-      ListsWS listService = new ListsWS( baseUrl + site, userName, password, configuration, httpClient );
-      ListsSoap listCall = listService.getListsSoapHandler();
-
-      GetAttachmentCollectionResponseGetAttachmentCollectionResult listResponse =
-        listCall.getAttachmentCollection( listName, itemID );
-      org.apache.axis.message.MessageElement[] List = listResponse.get_any();
-
-      final String xmlResponse = List[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getAttachmentNames response: "+xmlResponse);
-
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-
-      Object attachments = nodeList.get(0);
-      if ( !doc.getNodeName(attachments).equals("ns1:Attachments") )
-        throw new ManifoldCFException( "Bad xml - outer node '" + doc.getNodeName(attachments) + "' is not 'ns1:Attachments'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", attachments);
-
-      int i = 0;
-      while (i < nodeList.size())
-      {
-        Object o = nodeList.get( i++ );
-        if ( !doc.getNodeName(o).equals("ns1:Attachment") )
-          throw new ManifoldCFException( "Bad xml - inner node '" + doc.getNodeName(o) + "' is not 'ns1:Attachment'");
-        String attachmentURL = doc.getData( o );
-        if (attachmentURL != null)
-        {
-          int index = attachmentURL.lastIndexOf("/");
-          if (index == -1)
-            throw new ManifoldCFException("Unexpected attachment URL form: '"+attachmentURL+"'");
-          result.add(new NameValue(attachmentURL.substring(index+1), new java.net.URL(attachmentURL).getPath()));
-        }
-      }
-
-      return result;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting attachments for site "+site+" listName "+listName+" itemID "+itemID+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-            return null;
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-          else if (httpErrorCode.equals("401"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to get attachment list for site "+site+" listName "+listName+" itemID "+itemID+" - skipping",e);
-            return null;
-          }
-          throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      // I don't know if this is what you get when the library is missing, but here's hoping.
-      if (e.getMessage().indexOf("List does not exist") != -1)
-        return null;
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a remote exception getting attachments for site "+site+" listName "+listName+" itemID "+itemID+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      throw new ManifoldCFException("Unexpected remote exception occurred: "+e.getMessage(),e);
-    }
-
-  }
-  
-  /**
-  * Gets a list of field names of the given document library
-  * @param site
-  * @param list/library name
-  * @return list of the fields
-  */
-  public Map<String,String> getFieldList( String site, String listName )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime;
-    try
-    {
-      Map<String,String> result = new HashMap<String,String>();
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: In getFieldList; site='"+site+"', listName='"+listName+"'");
-
-      // The docLibrary must be a GUID, because we don't have  title.
-
-      if ( site.compareTo( "/") == 0 )
-        site = "";
-      ListsWS listService = new ListsWS( baseUrl + site, userName, password, configuration, httpClient );
-      ListsSoap listCall = listService.getListsSoapHandler();
-
-      GetListResponseGetListResult listResponse = listCall.getList( listName );
-      org.apache.axis.message.MessageElement[] List = listResponse.get_any();
-
-      final String xmlResponse = List[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getFieldList xml response: "+xmlResponse);
-
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-      
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:List"))
-        throw new ManifoldCFException("Bad xml - outer node is '" + doc.getNodeName(parent) + "' not 'ns1:List'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);  // <ns1:Fields>
-
-      for (Object metaField : nodeList)
-      {
-        if ( doc.getNodeName(metaField).equals("ns1:Fields") )
-        {
-          ArrayList fieldsList = new ArrayList();
-          doc.processPath(fieldsList, "*", metaField);
-
-          for (Object o : fieldsList)
-          {
-            String name = doc.getValue( o, "DisplayName" );
-            String fieldName = doc.getValue( o, "Name" );
-            String hidden = doc.getValue( o, "Hidden" );
-            // System.out.println( "Hidden :" + hidden );
-            if ( name.length() != 0 && fieldName.length() != 0 && ( !hidden.equalsIgnoreCase( "true") ) )
-            {
-              // make sure we don't include the same field more than once.
-              // This may happen if the Library has more than one view.
-              if ( result.containsKey( fieldName ) == false)
-                result.put(fieldName, name);
-            }
-          }
-        }
-      }
-      // System.out.println(result.size());
-      return result;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting field list for site "+site+" listName "+listName+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-            return null;
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-          else if (httpErrorCode.equals("401"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to get field list for site "+site+" listName "+listName+" - skipping",e);
-            return null;
-          }
-          throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      // I don't know if this is what you get when the library is missing, but here's hoping.
-      if (e.getMessage().indexOf("List does not exist") != -1)
-        return null;
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a remote exception getting field list for site "+site+" listName "+listName+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      throw new ManifoldCFException("Unexpected remote exception occurred: "+e.getMessage(),e);
-    }
-  }
-
-  /**
-  * Gets a list of field values of the given document
-  * @param fieldNames
-  * @param site
-  * @param docId
-  * @return set of the field values
-  */
-  public Map<String,String> getFieldValues( String[] fieldNames, String site, String docLibrary, String docId, boolean dspStsWorks )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getFieldValues; fieldNames="+fieldNames+", site='"+site+"', docLibrary='"+docLibrary+"', docId='"+docId+"', dspStsWorks="+dspStsWorks);
-
-    long currentTime;
-    try
-    {
-      HashMap<String,String> result = new HashMap<String,String>();
-
-      if ( site.compareTo("/") == 0 ) site = ""; // root case
-
-      if ( dspStsWorks )
-      {
-        StsAdapterWS listService = new StsAdapterWS( baseUrl + site, userName, password, configuration, httpClient );
-        StsAdapterSoapStub stub = (StsAdapterSoapStub)listService.getStsAdapterSoapHandler();
-
-        String[] vArray = new String[1];
-        vArray[0] = "1.0";
-        VersionsHeader myVersion = new VersionsHeader();
-        myVersion.setVersion( vArray );
-
-        stub.setHeader( "http://schemas.microsoft.com/sharepoint/dsp", "versions", myVersion );
-
-        RequestHeader reqHeader = new RequestHeader();
-        reqHeader.setDocument( DocumentType.content );
-        reqHeader.setMethod(MethodType.query );
-
-        stub.setHeader( "http://schemas.microsoft.com/sharepoint/dsp", "request", reqHeader );
-
-        QueryRequest myRequest = new QueryRequest();
-
-        DSQuery sQuery = new DSQuery();
-        sQuery.setSelect( "/list[@id='" + docLibrary + "']" );
-        sQuery.setResultContent(ResultContentType.dataOnly);
-        myRequest.setDsQuery( sQuery );
-
-        DspQuery spQuery = new DspQuery();
-        spQuery.setRowLimit( 1 );
-        // For the Requested Fields
-        if ( fieldNames.length > 0 )
-        {
-          Fields spFields = new Fields();
-          Field[] fieldArray = new Field[0];
-          ArrayList fields = new ArrayList();
-
-          Field spField = new Field();
-          //                      spField.setName( "ID" );
-          //                      spField.setAlias( "ID" );
-          //                      fields.add( spField );
-
-          for ( String fieldName : fieldNames )
-          {
-            spField = new Field();
-            spField.setName( fieldName );
-            spField.setAlias( fieldName );
-            fields.add( spField );
-          }
-          spFields.setField( (Field[]) fields.toArray( fieldArray ));
-          spQuery.setFields( spFields );
-        }
-        // Of this document
-        DspQueryWhere spWhere = new DspQueryWhere();
-
-        org.apache.axis.message.MessageElement criterion = new org.apache.axis.message.MessageElement( (String)null, "Contains" );
-        SOAPElement seFieldRef = criterion.addChildElement( "FieldRef" );
-        seFieldRef.addAttribute( SOAPFactory.newInstance().createName("Name") , "FileRef" );
-        SOAPElement seValue = criterion.addChildElement( "Value" );
-        seValue.addAttribute( SOAPFactory.newInstance().createName("Type") , "String" );
-        seValue.setValue( docId );
-
-        org.apache.axis.message.MessageElement[] criteria = { criterion };
-        spWhere.set_any( criteria );
-        spQuery.setWhere( (DspQueryWhere)spWhere );
-
-        // Set Criteria
-        myRequest.getDsQuery().setQuery(spQuery);
-
-        StsAdapterSoap call = stub;
-
-        // Make Request
-        QueryResponse resp = call.query( myRequest );
-        org.apache.axis.message.MessageElement[] list = resp.get_any();
-
-        final String xmlResponse = list[0].toString();
-        if (Logging.connectors.isDebugEnabled())
-        {
-          Logging.connectors.debug("SharePoint: getFieldValues xml response: '" +xmlResponse+ "'");
-        }
-
-        final XMLDoc doc;
-        try
-        {
-          doc = new XMLDoc( xmlResponse );
-        }
-        catch (ManifoldCFException e) {
-          return null;
-        }
-
-        ArrayList nodeList = new ArrayList();
-
-        doc.processPath(nodeList, "*", null);
-        if (nodeList.size() != 1)
-        {
-          throw new ManifoldCFException("Bad xml - missing outer 'ns1:dsQueryResponse' node - there are "+Integer.toString(nodeList.size())+" nodes");
-        }
-
-        Object parent = nodeList.get(0);
-        //System.out.println( "Outer NodeName = " + doc.getNodeName(parent) );
-        if (!doc.getNodeName(parent).equals("ns1:dsQueryResponse"))
-          throw new ManifoldCFException("Bad xml - outer node is not 'ns1:dsQueryResponse'");
-
-        nodeList.clear();
-        doc.processPath(nodeList, "*", parent);
-
-        parent = nodeList.get( 0 ); // <Shared_X0020_Documents />
-
-        nodeList.clear();
-        doc.processPath(nodeList, "*", parent);
-
-        // Process each result (Should only be one )
-        // Get each childs Value and add to return array
-        for ( int i= 0; i < nodeList.size(); i++ )
-        {
-          Object documentNode = nodeList.get( i );
-          ArrayList fieldList = new ArrayList();
-
-          doc.processPath( fieldList, "*", documentNode );
-          for ( int j =0; j < fieldList.size(); j++)
-          {
-            Object field = fieldList.get( j );
-            String fieldData = doc.getData(field);
-            String fieldName = doc.getNodeName(field);
-            // Right now this really only works right for single-valued fields.  For multi-valued
-            // fields, we'd need to know in advance that they were multivalued
-            // so that we could interpret commas as value separators.
-            result.put(fieldName,fieldData);
-          }
-        }
-      }
-      else
-      {
-        // SharePoint 2010: Get field values some other way
-        // Sharepoint 2010; use Lists service instead
-        ListsWS lservice = new ListsWS(baseUrl + site, userName, password, configuration, httpClient );
-        ListsSoapStub stub1 = (ListsSoapStub)lservice.getListsSoapHandler();
-        
-        String sitePlusDocId = serverLocation + site + docId;
-        if (sitePlusDocId.startsWith("/"))
-          sitePlusDocId = sitePlusDocId.substring(1);
-        
-        GetListItemsQuery q = buildMatchQuery("FileRef","Text",sitePlusDocId);
-        GetListItemsViewFields viewFields = buildViewFields(fieldNames);
-
-        GetListItemsResponseGetListItemsResult items =  stub1.getListItems(docLibrary, "", q, viewFields, "1", buildNonPagingQueryOptions(), null);
-        if (items == null)
-          return result;
-
-        MessageElement[] list = items.get_any();
-
-        final String xmlResponse = list[0].toString();
-        if (Logging.connectors.isDebugEnabled()){
-          Logging.connectors.debug("SharePoint: getListItems FileRef value '"+sitePlusDocId+"', xml response: '" + xmlResponse + "'");
-        }
-
-        ArrayList nodeList = new ArrayList();
-        
-        final XMLDoc doc;
-        try
-        {
-          doc = new XMLDoc( xmlResponse );
-        }
-        catch (ManifoldCFException e) {
-          return null;
-        }
-
-        doc.processPath(nodeList, "*", null);
-        if (nodeList.size() != 1)
-          throw new ManifoldCFException("Bad xml - expecting one outer 'ns1:listitems' node - there are " + Integer.toString(nodeList.size()) + " nodes");
-
-        Object parent = nodeList.get(0);
-        if (!"ns1:listitems".equals(doc.getNodeName(parent)))
-          throw new ManifoldCFException("Bad xml - outer node is not 'ns1:listitems'");
-
-        nodeList.clear();
-        doc.processPath(nodeList, "*", parent);
-
-        if (nodeList.size() != 1)
-          throw new ManifoldCFException("Expected rsdata result but no results found.");
-
-        Object rsData = nodeList.get(0);
-
-        int itemCount = Integer.parseInt(doc.getValue(rsData, "ItemCount"));
-        if (itemCount == 0)
-          return result;
-          
-        // Now, extract the files from the response document
-        ArrayList nodeDocs = new ArrayList();
-
-        doc.processPath(nodeDocs, "*", rsData);
-
-        if (nodeDocs.size() != itemCount)
-          throw new ManifoldCFException("itemCount does not match with nodeDocs.size()");
-
-        if (itemCount != 1)
-          throw new ManifoldCFException("Expecting only one item, instead saw '"+itemCount+"'");
-        
-        Object o = nodeDocs.get(0);
-        
-        // Look for all the specified attributes in the record
-        for (Object attrName : fieldNames)
-        {
-          String attrValue = doc.getValue(o,"ows_"+(String)attrName);
-          if (attrValue != null)
-          {
-            result.put(attrName.toString(),valueMunge(attrValue));
-          }
-        }
-      }
-
-      return result;
-    }
-    catch (javax.xml.soap.SOAPException e)
-    {
-      throw new ManifoldCFException("Soap exception: "+e.getMessage(),e);
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting field values for site "+site+" library "+docLibrary+" document '"+docId+"' - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-            return null;
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-          else if (httpErrorCode.equals("401"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to get field values for site "+site+" library "+docLibrary+" - skipping",e);
-            return null;
-          }
-          throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+site+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      // I don't know if this is what you get when the library is missing, but here's hoping.
-      if (e.getMessage().indexOf("List does not exist") != -1)
-        return null;
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a remote exception getting field values for site "+site+" library "+docLibrary+" document ["+docId+"] - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      throw new ManifoldCFException("Unexpected remote exception occurred: "+e.getMessage(),e);
-    }
-  }
-
-  /**
-  * Gets a list of sites given a parent site
-  * @param parentSite the site to search for subsites, empty string for root
-  * @return lists of sites as an arraylist of NameValue objects
-  */
-  public List<NameValue> getSites( String parentSite )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getSites; parentSite='"+parentSite+"'");
-
-    long currentTime;
-    try
-    {
-      ArrayList<NameValue> result = new ArrayList<NameValue>();
-
-      // Call the webs service
-      if ( parentSite.equals( "/") ) parentSite = "";
-        WebsWS webService = new WebsWS( baseUrl + parentSite, userName, password, configuration, httpClient );
-      WebsSoap webCall = webService.getWebsSoapHandler();
-
-      GetWebCollectionResponseGetWebCollectionResult webResp = webCall.getWebCollection();
-      org.apache.axis.message.MessageElement[] webList = webResp.get_any();
-
-      final String xmlResponse = webList[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getSites xml response: "+xmlResponse);
-      
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:Webs' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:Webs"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Webs'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);  // <ns1:Webs>
-
-      int i = 0;
-      while (i < nodeList.size())
-      {
-        Object o = nodeList.get( i++ );
-        //Logging.connectors.debug( i + ": " + o );
-        //System.out.println( i + ": " + o );
-        String url = doc.getValue( o, "Url" );
-        String title = doc.getValue( o, "Title" );
-
-        // Leave here for now
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Subsite list: '"+url+"', '"+title+"'");
-        
-        // A full path to the site is tacked on the front of each one of these.  However, due to nslookup differences, we cannot guarantee that
-        // the server name part of the path will actually match what got passed in.  Therefore, we want to look only at the last path segment, whatever that is.
-        if (url != null && url.length() > 0)
-        {
-          int lastSlash = url.lastIndexOf("/");
-          if (lastSlash != -1)
-          {
-            String pathValue = url.substring(lastSlash + 1);
-            if (pathValue.length() > 0)
-            {
-              if (title == null || title.length() == 0)
-                title = pathValue;
-              result.add(new NameValue(pathValue,title));
-            }
-          }
-        }
-      }
-      
-      return result;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting subsites for site "+parentSite+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-            return null;
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-          else if (httpErrorCode.equals("401"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to get subsites of site "+parentSite+" - skipping",e);
-            return null;
-          }
-          throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+parentSite+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a remote exception getting subsites for site "+parentSite+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      throw new ManifoldCFException("Unexpected remote exception occurred: "+e.getMessage(),e);
-    }
-
-  }
-
-  /**
-  * Gets a list of document libraries given a parent site
-  * @param parentSite the site to search for document libraries, empty string for root
-  * @return lists of NameValue objects, representing document libraries
-  */
-  public List<NameValue> getDocumentLibraries( String parentSite, String parentSiteDecoded )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getDocumentLibraries; parentSite='"+parentSite+"', parentSiteDecoded='"+parentSiteDecoded+"'");
-
-    long currentTime;
-    try
-    {
-      ArrayList<NameValue> result = new ArrayList<NameValue>();
-
-      String parentSiteRequest = parentSite;
-
-      if ( parentSiteRequest.equals("/"))
-      {
-        parentSiteRequest = ""; // root case
-        parentSiteDecoded = "";
-      }
-
-      ListsWS listsService = new ListsWS( baseUrl + parentSiteRequest, userName, password, configuration, httpClient );
-      ListsSoap listsCall = listsService.getListsSoapHandler( );
-
-      GetListCollectionResponseGetListCollectionResult listResp = listsCall.getListCollection();
-      org.apache.axis.message.MessageElement[] lists = listResp.get_any();
-
-      //if ( parentSite.compareTo("/Sample2") == 0) System.out.println( lists[0].toString() );
-
-      final String xmlResponse = lists[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getDocumentLibraries xml response: "+xmlResponse);
-      
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:Lists' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:Lists"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Lists'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);  // <ns1:Lists>
-
-      String prefixPath = decodedServerLocation + parentSiteDecoded + "/";
-
-      int i = 0;
-      while (i < nodeList.size())
-      {
-        Object o = nodeList.get( i++ );
-
-        String baseType = doc.getValue( o, "BaseType");
-        if ( baseType.equals( "1" ) )
-        {
-          // We think it's a library
-
-          // This is how we display it, so this has the right path extension
-          String urlPath = doc.getValue( o, "DefaultViewUrl" );
-          // This is the pretty name
-          String title = doc.getValue( o, "Title" );
-
-          // Leave this in for the moment
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Library list: '"+urlPath+"', '"+title+"'");
-
-          // It's a library.  If it has no view url, we don't have any idea what to do with it
-          if (urlPath != null && urlPath.length() > 0)
-          {
-            // Normalize conditionally
-            if (!urlPath.startsWith("/"))
-              urlPath = prefixPath + urlPath;
-            // Get rid of what we don't want, unconditionally
-            if (urlPath.startsWith(prefixPath))
-            {
-              urlPath = urlPath.substring(prefixPath.length());
-              // We're at the library name.  Figure out where the end of it is.
-              int index = urlPath.indexOf("/");
-              if (index == -1)
-                throw new ManifoldCFException("Bad library view url without site: '"+urlPath+"'");
-              String pathpart = urlPath.substring(0,index);
-
-              if ( pathpart.length() != 0 && !pathpart.equals("_catalogs"))
-              {
-                if (title == null || title.length() == 0)
-                  title = pathpart;
-                result.add( new NameValue(pathpart, title) );
-              }
-            }
-            else
-            {
-              Logging.connectors.warn("SharePoint: Library view url is not in the expected form: '"+urlPath+"'; expected something beginning with '"+prefixPath+"'; skipping");
-            }
-          }
-        }
-      }
-
-      return result;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting document libraries for site "+parentSite+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-            return null;
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-          else if (httpErrorCode.equals("401"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to read document libraries for site "+parentSite+" - skipping",e);
-            return null;
-          }
-          throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+parentSite+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a remote exception reading document libraries for site "+parentSite+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      throw new ManifoldCFException("Unexpected remote exception occurred: "+e.getMessage(),e);
-    }
-  }
-
-  /**
-  * Gets a list of lists given a parent site
-  * @param parentSite the site to search for lists, empty string for root
-  * @return lists of NameValue objects, representing lists
-  */
-  public List<NameValue> getLists( String parentSite, String parentSiteDecoded )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: In getLists; parentSite='"+parentSite+"', parentSiteDecoded='"+parentSiteDecoded+"'");
-
-    long currentTime;
-    try
-    {
-      ArrayList<NameValue> result = new ArrayList<NameValue>();
-
-      String parentSiteRequest = parentSite;
-
-      if ( parentSiteRequest.equals("/"))
-      {
-        parentSiteRequest = ""; // root case
-        parentSiteDecoded = "";
-      }
-
-      ListsWS listsService = new ListsWS( baseUrl + parentSiteRequest, userName, password, configuration, httpClient );
-      ListsSoap listsCall = listsService.getListsSoapHandler( );
-
-      GetListCollectionResponseGetListCollectionResult listResp = listsCall.getListCollection();
-      org.apache.axis.message.MessageElement[] lists = listResp.get_any();
-
-      final String xmlResponse = lists[0].toString();
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: getLists xml response: "+xmlResponse);
-
-      final XMLDoc doc;
-      try
-      {
-        doc = new XMLDoc( xmlResponse );
-      }
-      catch (ManifoldCFException e) {
-        return null;
-      }
-
-      ArrayList nodeList = new ArrayList();
-
-      doc.processPath(nodeList, "*", null);
-      if (nodeList.size() != 1)
-      {
-        throw new ManifoldCFException("Bad xml - missing outer 'ns1:Lists' node - there are "+Integer.toString(nodeList.size())+" nodes");
-      }
-      Object parent = nodeList.get(0);
-      if (!doc.getNodeName(parent).equals("ns1:Lists"))
-        throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Lists'");
-
-      nodeList.clear();
-      doc.processPath(nodeList, "*", parent);  // <ns1:Lists>
-
-      String prefixPath = decodedServerLocation + parentSiteDecoded + "/";
-
-      int i = 0;
-      while (i < nodeList.size())
-      {
-        Object o = nodeList.get( i++ );
-
-        String baseType = doc.getValue( o, "BaseType");
-        if ( baseType.equals( "0" ) )
-        {
-          // We think it's a list
-
-          // This is how we display it, so this has the right path extension
-          String urlPath = doc.getValue( o, "DefaultViewUrl" );
-          // This is the pretty name
-          String title = doc.getValue( o, "Title" );
-
-          // Leave this in for the moment
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: List: '"+urlPath+"', '"+title+"'");
-
-          // If it has no view url, we don't have any idea what to do with it
-          if (urlPath != null && urlPath.length() > 0)
-          {
-            // Normalize conditionally
-            if (!urlPath.startsWith("/"))
-              urlPath = prefixPath + urlPath;
-            // Get rid of what we don't want, unconditionally
-            if (urlPath.startsWith(prefixPath))
-            {
-              urlPath = urlPath.substring(prefixPath.length());
-              // We're at the /Lists/listname part of the name.  Figure out where the end of it is.
-              int index = urlPath.indexOf("/");
-              if (index == -1)
-                continue;
-                //throw new ManifoldCFException("Bad list view url without site: '"+urlPath+"'");
-              String pathpart = urlPath.substring(0,index);
-
-              if("Lists".equals(pathpart))
-              {
-                int k = urlPath.indexOf("/",index+1);
-                if (k == -1)
-                  continue;
-                  //throw new ManifoldCFException("Bad list view url without 'Lists': '"+urlPath+"'");
-                pathpart = urlPath.substring(index+1,k);
-              }
-
-              if ( pathpart.length() != 0 && !pathpart.equals("_catalogs"))
-              {
-                if (title == null || title.length() == 0)
-                  title = pathpart;
-                result.add( new NameValue(pathpart, title) );
-              }
-            }
-            else
-            {
-              Logging.connectors.warn("SharePoint: List view url is not in the expected form: '"+urlPath+"'; expected something beginning with '"+prefixPath+"'; skipping");
-            }
-          }
-        }
-
-      }
-
-      return result;
-    }
-    catch (java.net.MalformedURLException e)
-    {
-      throw new ManifoldCFException("Bad SharePoint url: "+e.getMessage(),e);
-    }
-    catch (javax.xml.rpc.ServiceException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a service exception getting lists for site "+parentSite+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Service exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    catch (org.apache.axis.AxisFault e)
-    {
-      // Bad XML can come from Microsoft.
-      if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException))
-      {
-        return null;
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HTTP")))
-      {
-        org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/","HttpErrorCode"));
-        if (elem != null)
-        {
-          elem.normalize();
-          String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
-          // 302 is what SharePoint returns for external sites
-          if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
-            return null;
-          else if (httpErrorCode.equals("403"))
-            throw new ManifoldCFException("Remote procedure exception: "+e.getMessage(),e);
-          else if (httpErrorCode.equals("401"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to read lists for site "+parentSite+" - skipping",e);
-            return null;
-          }
-          throw new ManifoldCFException("Unexpected http error code "+httpErrorCode+" accessing SharePoint at "+baseUrl+parentSite+": "+e.getMessage(),e);
-        }
-        throw new ManifoldCFException("Unknown http error occurred: "+e.getMessage(),e);
-      }
-      if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/","Server.userException")))
-      {
-        String exceptionName = e.getFaultString();
-        if (exceptionName.equals("java.lang.InterruptedException"))
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Got a remote exception reading lists for site "+parentSite+" - retrying",e);
-      currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Remote procedure exception: "+e.getMessage(), e, currentTime + 300000L,
-        currentTime + 3 * 60 * 60000L,-1,false);
-    }
-    catch (java.rmi.RemoteException e)
-    {
-      throw new ManifoldCFException("Unexpected remote exception occurred: "+e.getMessage(),e);
-    }
-  }
-
-  // Regexp pattern to match 12345;#
-  protected static Pattern subsPattern;
-  static
-  {
-    try
-    {
-      subsPattern = Pattern.compile("[0-9]*;#.*");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(-100);
-    }
-  }
-  
-  /** Substitute progid where found */
-  protected static String valueMunge(String value)
-  {
-    Matcher matcher = subsPattern.matcher(value);
-    if (matcher.matches())
-      return value.substring(value.indexOf("#") + 1);
-    return value;
-  }
-  
-  /** Build viewFields XML for the ListItems call.
-  */
-  protected static GetListItemsViewFields buildViewFields(String[] fieldNames)
-    throws ManifoldCFException
-  {
-    try
-    {
-      GetListItemsViewFields rval = new GetListItemsViewFields();
-      MessageElement viewFieldsNode = new MessageElement((String)null,"ViewFields");
-      rval.set_any(new MessageElement[]{viewFieldsNode});
-      for (String fieldName : fieldNames)
-      {
-        MessageElement child = new MessageElement((String)null,"FieldRef");
-        viewFieldsNode.addChild(child);
-        child.addAttribute(null,"Name",fieldName);
-      }
-      return rval;
-    }
-    catch (javax.xml.soap.SOAPException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /** Build a query XML object that matches a specified field and value pair.
-  */
-  protected static GetListItemsQuery buildMatchQuery(String fieldName, String type, String value)
-    throws ManifoldCFException
-  {
-    try
-    {
-      GetListItemsQuery rval = new GetListItemsQuery();
-      MessageElement queryNode = new MessageElement((String)null,"Query");
-      rval.set_any(new MessageElement[]{queryNode});
-      MessageElement whereNode = new MessageElement((String)null,"Where");
-      queryNode.addChild(whereNode);
-      MessageElement eqNode = new MessageElement((String)null,"Eq");
-      whereNode.addChild(eqNode);
-      MessageElement fieldRefNode = new MessageElement((String)null,"FieldRef");
-      eqNode.addChild(fieldRefNode);
-      fieldRefNode.addAttribute(null,"Name",fieldName);
-      MessageElement valueNode = new MessageElement((String)null,"Value");
-      eqNode.addChild(valueNode);
-      valueNode.addAttribute(null,"Type",type);
-      valueNode.addTextNode(value);
-      return rval;
-    }
-    catch (javax.xml.soap.SOAPException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /** Build a query XML object that orders by an indexed column, for paging.
-  */
-  protected static GetListItemsQuery buildOrderedQuery(String indexedColumn)
-    throws ManifoldCFException
-  {
-    try
-    {
-      GetListItemsQuery rval = new GetListItemsQuery();
-      MessageElement queryNode = new MessageElement((String)null,"Query");
-      rval.set_any(new MessageElement[]{queryNode});
-      MessageElement orderByNode = new MessageElement((String)null,"OrderBy");
-      queryNode.addChild(orderByNode);
-      orderByNode.addAttribute(null,"Override","TRUE");
-      orderByNode.addAttribute(null,"UseIndexForOrderBy","TRUE");
-      MessageElement fieldRefNode = new MessageElement((String)null,"FieldRef");
-      orderByNode.addChild(fieldRefNode);
-      fieldRefNode.addAttribute(null,"Ascending","TRUE");
-      fieldRefNode.addAttribute(null,"Name",indexedColumn);
-      return rval;
-    }
-    catch (javax.xml.soap.SOAPException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /** Build queryOptions XML object that specifies a paging value.
-  */
-  protected static GetListItemsQueryOptions buildPagingQueryOptions(String pageNextString)
-    throws ManifoldCFException
-  {
-    try
-    {
-      GetListItemsQueryOptions rval = new GetListItemsQueryOptions();
-      MessageElement queryOptionsNode = new MessageElement((String)null,"QueryOptions");
-      rval.set_any(new MessageElement[]{queryOptionsNode});
-      MessageElement pagingNode = new MessageElement((String)null,"Paging");
-      queryOptionsNode.addChild(pagingNode);
-      pagingNode.addAttribute(null,"ListItemCollectionPositionNext",pageNextString);
-      MessageElement viewAttributesNode = new MessageElement((String)null,"ViewAttributes");
-      queryOptionsNode.addChild(viewAttributesNode);
-      viewAttributesNode.addAttribute(null,"Scope","Recursive");
-
-      return rval;
-    }
-    catch (javax.xml.soap.SOAPException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Build queryOptions XML object that specifies no paging value.
-  */
-  protected static GetListItemsQueryOptions buildNonPagingQueryOptions()
-    throws ManifoldCFException
-  {
-    try
-    {
-      GetListItemsQueryOptions rval = new GetListItemsQueryOptions();
-      MessageElement queryOptionsNode = new MessageElement((String)null,"QueryOptions");
-      rval.set_any(new MessageElement[]{queryOptionsNode});
-      MessageElement viewAttributesNode = new MessageElement((String)null,"ViewAttributes");
-      queryOptionsNode.addChild(viewAttributesNode);
-      viewAttributesNode.addAttribute(null,"Scope","Recursive");
-
-      return rval;
-    }
-    catch (javax.xml.soap.SOAPException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /**
-  * SharePoint Permissions Service Wrapper Class
-  */
-  protected static class PermissionsWS extends com.microsoft.schemas.sharepoint.soap.directory.PermissionsLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = -2542430113046450050L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public PermissionsWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/Permissions.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.soap.directory.PermissionsSoap getPermissionsSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.soap.directory.PermissionsSoapStub _stub = new com.microsoft.schemas.sharepoint.soap.directory.PermissionsSoapStub(endPoint, this);
-      _stub.setPortName(getPermissionsSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient);
-      return _stub;
-    }
-  }
-
-  /**
-  * MC Permissions Service Wrapper Class
-  */
-  protected static class MCPermissionsWS extends com.microsoft.sharepoint.webpartpages.PermissionsLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = -2542430113046450051L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public MCPermissionsWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/MCPermissions.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.sharepoint.webpartpages.PermissionsSoap getPermissionsSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.sharepoint.webpartpages.PermissionsSoapStub _stub = new com.microsoft.sharepoint.webpartpages.PermissionsSoapStub(endPoint, this);
-      _stub.setPortName(getPermissionsSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /**
-  * SharePoint UserGroup Service Wrapper Class
-  */
-  protected static class UserGroupWS extends com.microsoft.schemas.sharepoint.soap.directory.UserGroupLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = -2052484076803624502L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public UserGroupWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/usergroup.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap getUserGroupSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoapStub _stub = new com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoapStub(endPoint, this);
-      _stub.setPortName(getUserGroupSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /**
-  * SharePoint StsAdapter (List Data Services) Service Wrapper Class
-  */
-  protected static class StsAdapterWS extends StsAdapterLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = -731937337802481409L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public StsAdapterWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/dspsts.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.dsp.StsAdapterSoap getStsAdapterSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.dsp.StsAdapterSoapStub _stub = new com.microsoft.schemas.sharepoint.dsp.StsAdapterSoapStub(endPoint, this);
-      _stub.setPortName(getStsAdapterSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /**
-  * SharePoint Lists Service Wrapper Class
-  */
-  protected static class ListsWS extends ListsLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = 5506842429029882999L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public ListsWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/lists.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.soap.ListsSoap getListsSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.soap.ListsSoapStub _stub = new com.microsoft.schemas.sharepoint.soap.ListsSoapStub(endPoint, this);
-      _stub.setPortName(getListsSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /**
-  * SharePoint Versions Service Wrapper Class
-  */
-  protected static class VersionsWS extends VersionsLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = 4903552161088337964L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public VersionsWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/versions.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.soap.VersionsSoap getVersionsSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.soap.VersionsSoapStub _stub = new com.microsoft.schemas.sharepoint.soap.VersionsSoapStub(endPoint, this);
-      _stub.setPortName(getVersionsSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /**
-  * SharePoint Webs Service Wrapper Class
-  */
-  protected static class WebsWS extends WebsLocator
-  {
-    /**
-    *
-    */
-    private static final long serialVersionUID = 6879757392680147691L;
-    private java.net.URL endPoint;
-    private String userName;
-    private String password;
-    private HttpClient httpClient;
-
-    public WebsWS ( String siteUrl, String userName, String password, EngineConfiguration configuration, HttpClient httpClient )
-      throws java.net.MalformedURLException
-    {
-      super(configuration);
-      endPoint = new java.net.URL(siteUrl + "/_vti_bin/webs.asmx");
-      this.userName = userName;
-      this.password = password;
-      this.httpClient = httpClient;
-    }
-
-    public com.microsoft.schemas.sharepoint.soap.WebsSoap getWebsSoapHandler( )
-      throws javax.xml.rpc.ServiceException, org.apache.axis.AxisFault
-    {
-      com.microsoft.schemas.sharepoint.soap.WebsSoapStub _stub = new com.microsoft.schemas.sharepoint.soap.WebsSoapStub(endPoint, this);
-      _stub.setPortName(getWebsSoapWSDDServiceName());
-      _stub.setUsername( userName );
-      _stub.setPassword( password );
-      _stub._setProperty( HTTPCLIENT_PROPERTY, httpClient );
-      return _stub;
-    }
-  }
-
-  /** Implementation of EngineConfiguration that we'll use to get the wsdd file from a
-  * local resource.
-  */
-  protected static class ResourceProvider implements WSDDEngineConfiguration
-  {
-    private WSDDDeployment deployment = null;
-
-    private Class resourceClass;
-    private String resourceName;
-
-    /**
-     * Constructor setting the resource name.
-     */
-    public ResourceProvider(Class resourceClass, String resourceName)
-    {
-      this.resourceClass = resourceClass;
-      this.resourceName = resourceName;
-    }
-
-    public WSDDDeployment getDeployment() {
-        return deployment;
-    }
-
-    public void configureEngine(AxisEngine engine)
-      throws ConfigurationException
-    {
-      try
-      {
-        InputStream resourceStream = resourceClass.getResourceAsStream(resourceName);
-        if (resourceStream == null)
-          throw new ConfigurationException("Resource not found: '"+resourceName+"'");
-        try
-        {
-          WSDDDocument doc = new WSDDDocument(XMLUtils.newDocument(resourceStream));
-          deployment = doc.getDeployment();
-
-          deployment.configureEngine(engine);
-          engine.refreshGlobalOptions();
-        }
-        finally
-        {
-          resourceStream.close();
-        }
-      }
-      catch (ConfigurationException e)
-      {
-        throw e;
-      }
-      catch (Exception e)
-      {
-        throw new ConfigurationException(e);
-      }
-    }
-
-    public void writeEngineConfig(AxisEngine engine)
-      throws ConfigurationException
-    {
-      // Do nothing
-    }
-
-    /**
-     * retrieve an instance of the named handler
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public Handler getHandler(QName qname) throws ConfigurationException
-    {
-      return deployment.getHandler(qname);
-    }
-
-    /**
-     * retrieve an instance of the named service
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public SOAPService getService(QName qname) throws ConfigurationException
-    {
-      SOAPService service = deployment.getService(qname);
-      if (service == null)
-      {
-        throw new ConfigurationException(Messages.getMessage("noService10",
-          qname.toString()));
-      }
-      return service;
-    }
-
-    /**
-     * Get a service which has been mapped to a particular namespace
-     *
-     * @param namespace a namespace URI
-     * @return an instance of the appropriate Service, or null
-     */
-    public SOAPService getServiceByNamespaceURI(String namespace)
-      throws ConfigurationException
-    {
-      return deployment.getServiceByNamespaceURI(namespace);
-    }
-
-    /**
-     * retrieve an instance of the named transport
-     * @param qname XXX
-     * @return XXX
-     * @throws ConfigurationException XXX
-     */
-    public Handler getTransport(QName qname) throws ConfigurationException
-    {
-      return deployment.getTransport(qname);
-    }
-
-    public TypeMappingRegistry getTypeMappingRegistry()
-        throws ConfigurationException
-    {
-      return deployment.getTypeMappingRegistry();
-    }
-
-    /**
-     * Returns a global request handler.
-     */
-    public Handler getGlobalRequest() throws ConfigurationException
-    {
-      return deployment.getGlobalRequest();
-    }
-
-    /**
-     * Returns a global response handler.
-     */
-    public Handler getGlobalResponse() throws ConfigurationException
-    {
-      return deployment.getGlobalResponse();
-    }
-
-    /**
-     * Returns the global configuration options.
-     */
-    public Hashtable getGlobalOptions() throws ConfigurationException
-    {
-      WSDDGlobalConfiguration globalConfig = deployment.getGlobalConfiguration();
-
-      if (globalConfig != null)
-        return globalConfig.getParametersTable();
-
-      return null;
-    }
-
-    /**
-     * Get an enumeration of the services deployed to this engine
-     */
-    public Iterator getDeployedServices() throws ConfigurationException
-    {
-      return deployment.getDeployedServices();
-    }
-
-    /**
-     * Get a list of roles that this engine plays globally.  Services
-     * within the engine configuration may also add additional roles.
-     *
-     * @return a <code>List</code> of the roles for this engine
-     */
-    public List getRoles()
-    {
-      return deployment.getRoles();
-    }
-  }
-
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointConfig.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointConfig.java
deleted file mode 100644
index 8d8772e..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointConfig.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-
-/** Parameters and output data for SharePoint repository.
-*/
-public class SharePointConfig
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Configuration parameters
-
-  /** SharePoint server version */
-  public static final String PARAM_SERVERVERSION = "serverVersion";
-  /** SharePoint server protocol */
-  public static final String PARAM_SERVERPROTOCOL = "serverProtocol";
-  /** SharePoint server name */
-  public static final String PARAM_SERVERNAME = "serverName";
-  /** SharePoint server port */
-  public static final String PARAM_SERVERPORT = "serverPort";
-  /** SharePoint server location */
-  public static final String PARAM_SERVERLOCATION = "serverLocation";
-  /** SharePoint server user name */
-  public static final String PARAM_SERVERUSERNAME = "userName";
-  /** SharePoint server password */
-  public static final String PARAM_SERVERPASSWORD = "password";
-  /** SharePoint server certificate store */
-  public static final String PARAM_SERVERKEYSTORE = "keystore";
-  /** Proxy host */
-  public static final String PARAM_PROXYHOST = "proxyHost";
-  /** Proxy port */
-  public static final String PARAM_PROXYPORT = "proxyPort";
-  /** Proxy user name */
-  public static final String PARAM_PROXYUSER = "proxyUser";
-  /** Proxy password */
-  public static final String PARAM_PROXYPASSWORD = "proxyPassword";
-  /** Proxy authentication domain */
-  public static final String PARAM_PROXYDOMAIN = "proxyDomain";
-  
-  /** Authority type */
-  public static final String PARAM_AUTHORITYTYPE = "authorityType";
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointRepository.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointRepository.java
deleted file mode 100644
index 28fbeb2..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointRepository.java
+++ /dev/null
@@ -1,4596 +0,0 @@
-/* $Id: SharePointRepository.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.extmimemap.ExtensionMimeMap;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.core.util.URLDecoder;
-
-import java.io.*;
-import java.util.Date;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Locale;
-import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.concurrent.TimeUnit;
-import java.net.*;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.Level;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.HttpHost;
-
-/** This is the "repository connector" for Microsoft SharePoint.
-* Document identifiers for this connector come in three forms:
-* (1) An "S" followed by the encoded subsite/library path, which represents the encoded relative path from the root site to a library. [deprecated and no longer supported];
-* (2) A "D" followed by a subsite/library/folder/file path, which represents the relative path from the root site to a file. [deprecated and no longer supported]
-* (3) Six different kinds of unencoded path, each of which starts with a "/" at the beginning, where the "/" represents the root site of the connection, as follows:
-*   /sitepath/ - the relative path to a site.  The path MUST both begin and end with a single "/".
-*   /sitepath/libraryname// - the relative path to a library.  The path MUST begin with a single "/" and end with "//".
-*   /sitepath/libraryname//folderfilepath - the relative path to a file.  The path MUST begin with a single "/" and MUST include a "//" after the library, and must NOT end with a "/".
-*   /sitepath/listname/// - the relative path to a list.  The path MUST begin with a single "/" and end with "///".
-*   /sitepath/listname///rowid - the relative path to a list item.  The path MUST begin with a single "/" and MUST include a "///" after the list name, and must NOT end in a "/".
-*   /sitepath/listname///rowid//attachment_filename - the relative path to a list attachment.  The path MUST begin with a single "/", MUST include a "///" after the list name, and
-*      MUST include a "//" separating the rowid from the filename.
-*/
-public class SharePointRepository extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: SharePointRepository.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Properties we need
-  public final static String wsddPathProperty = "org.apache.manifoldcf.sharepoint.wsddpath";
-
-  // Activities we log
-  public final static String ACTIVITY_FETCH = "fetch";
-
-  protected final static long sessionExpirationInterval = 300000L;
-  
-  private boolean supportsItemSecurity = false;
-  private boolean dspStsWorks = true;
-  private boolean attachmentsSupported = false;
-  private boolean activeDirectoryAuthority = true;
-  
-  private String serverProtocol = null;
-  private String serverUrl = null;
-  private String fileBaseUrl = null;
-  private String userName = null;
-  private String strippedUserName = null;
-  private String password = null;
-  private String ntlmDomain = null;
-  private String serverName = null;
-  private String serverLocation = null;
-  private String encodedServerLocation = null;
-  private int serverPort = -1;
-
-  private SPSProxyHelper proxy = null;
-
-  private long sessionTimeout;
-  
-  // SSL support
-  private String keystoreData = null;
-  private IKeystoreManager keystoreManager = null;
-  
-  private HttpClientConnectionManager connectionManager = null;
-  private HttpClient httpClient = null;
-
-  // Current host name
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (UnknownHostException e)
-    {
-    }
-  }
-
-  // Turn off AXIS debug output that we don't want
-  static
-  {
-    Logger logger = Logger.getLogger("org.apache.axis.ConfigurationException");
-    logger.setLevel(Level.INFO);
-  }
-  
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = GLOBAL_DENY_TOKEN;
-
-  /** Constructor.
-  */
-  public SharePointRepository()
-  {
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (proxy == null)
-    {
-      String serverVersion = params.getParameter( SharePointConfig.PARAM_SERVERVERSION );
-      if (serverVersion == null)
-        serverVersion = "4.0";
-      supportsItemSecurity = !serverVersion.equals("2.0");
-      dspStsWorks = serverVersion.equals("2.0") || serverVersion.equals("3.0");
-      attachmentsSupported = !serverVersion.equals("2.0");
-      
-      String authorityType = params.getParameter( SharePointConfig.PARAM_AUTHORITYTYPE );
-      if (authorityType == null)
-        authorityType = "ActiveDirectory";
-      
-      activeDirectoryAuthority = authorityType.equals("ActiveDirectory");
-
-      serverProtocol = params.getParameter( SharePointConfig.PARAM_SERVERPROTOCOL );
-      if (serverProtocol == null)
-        serverProtocol = "http";
-      try
-      {
-        String serverPort = params.getParameter( SharePointConfig.PARAM_SERVERPORT );
-        if (serverPort == null || serverPort.length() == 0)
-        {
-          if (serverProtocol.equals("https"))
-            this.serverPort = 443;
-          else
-            this.serverPort = 80;
-        }
-        else
-          this.serverPort = Integer.parseInt(serverPort);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      serverLocation = params.getParameter(SharePointConfig.PARAM_SERVERLOCATION);
-      if (serverLocation == null)
-        serverLocation = "";
-      if (serverLocation.endsWith("/"))
-        serverLocation = serverLocation.substring(0,serverLocation.length()-1);
-      if (serverLocation.length() > 0 && !serverLocation.startsWith("/"))
-        serverLocation = "/" + serverLocation;
-      encodedServerLocation = serverLocation;
-      serverLocation = decodePath(serverLocation);
-
-      userName = params.getParameter(SharePointConfig.PARAM_SERVERUSERNAME);
-      password = params.getObfuscatedParameter(SharePointConfig.PARAM_SERVERPASSWORD);
-      int index = userName.indexOf("\\");
-      if (index != -1)
-      {
-        strippedUserName = userName.substring(index+1);
-        ntlmDomain = userName.substring(0,index);
-      }
-      else
-      {
-        strippedUserName = null;
-        ntlmDomain = null;
-      }
-
-      String proxyHost = params.getParameter(SharePointConfig.PARAM_PROXYHOST);
-      String proxyPortString = params.getParameter(SharePointConfig.PARAM_PROXYPORT);
-      int proxyPort = 8080;
-      if (proxyPortString != null && proxyPortString.length() > 0)
-      {
-        try
-        {
-          proxyPort = Integer.parseInt(proxyPortString);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-      String proxyUsername = params.getParameter(SharePointConfig.PARAM_PROXYUSER);
-      String proxyPassword = params.getObfuscatedParameter(SharePointConfig.PARAM_PROXYPASSWORD);
-      String proxyDomain = params.getParameter(SharePointConfig.PARAM_PROXYDOMAIN);
-      
-      serverUrl = serverProtocol + "://" + serverName;
-      if (serverProtocol.equals("https"))
-      {
-        if (serverPort != 443)
-          serverUrl += ":" + Integer.toString(serverPort);
-      }
-      else
-      {
-        if (serverPort != 80)
-          serverUrl += ":" + Integer.toString(serverPort);
-      }
-      
-      fileBaseUrl = serverUrl + encodedServerLocation;
-
-      // Set up ssl if indicated
-      keystoreData = params.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-
-      int connectionTimeout = 60000;
-      int socketTimeout = 900000;
-
-      SSLConnectionSocketFactory myFactory = null;
-      if (keystoreData != null)
-      {
-        keystoreManager = KeystoreManagerFactory.make("",keystoreData);
-        myFactory = new SSLConnectionSocketFactory(keystoreManager.getSecureSocketFactory(), new DefaultHostnameVerifier());
-      }
-      else
-      {
-        myFactory = SSLConnectionSocketFactory.getSocketFactory();
-      }
-
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      connectionManager = poolingConnectionManager;
-      
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      if (strippedUserName != null)
-      {
-        credentialsProvider.setCredentials(
-          new AuthScope(serverName,serverPort),
-          new NTCredentials(strippedUserName, password, currentHost, ntlmDomain));
-      }
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(false)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-
-      // If there's a proxy, set that too.
-      if (proxyHost != null && proxyHost.length() > 0)
-      {
-
-        // Configure proxy authentication
-        if (proxyUsername != null && proxyUsername.length() > 0)
-        {
-          if (proxyPassword == null)
-            proxyPassword = "";
-          if (proxyDomain == null)
-            proxyDomain = "";
-
-          credentialsProvider.setCredentials(
-            new AuthScope(proxyHost, proxyPort),
-            new NTCredentials(proxyUsername, proxyPassword, currentHost, proxyDomain));
-        }
-
-        HttpHost proxy = new HttpHost(proxyHost, proxyPort);
-
-        requestBuilder.setProxy(proxy);
-      }
-
-      HttpClientBuilder builder = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setDefaultCredentialsProvider(credentialsProvider);
-      builder.setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new LaxRedirectStrategy());
-      httpClient = builder.build();
-
-      proxy = new SPSProxyHelper( serverUrl, encodedServerLocation, serverLocation, userName, password,
-        org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender.class, "client-config.wsdd",
-        httpClient );
-      
-    }
-    sessionTimeout = System.currentTimeMillis() + sessionExpirationInterval;
-  }
-
-  protected void expireSession()
-    throws ManifoldCFException
-  {
-    serverUrl = null;
-    fileBaseUrl = null;
-    userName = null;
-    strippedUserName = null;
-    password = null;
-    ntlmDomain = null;
-    serverLocation = null;
-    encodedServerLocation = null;
-    serverPort = -1;
-
-    keystoreData = null;
-    keystoreManager = null;
-
-    proxy = null;
-    httpClient = null;
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-
-  }
-  
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{ACTIVITY_FETCH};
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the root directory.
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-    // This is needed by getBins()
-    serverName = configParameters.getParameter( SharePointConfig.PARAM_SERVERNAME );
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    serverUrl = null;
-    fileBaseUrl = null;
-    userName = null;
-    strippedUserName = null;
-    password = null;
-    ntlmDomain = null;
-    serverName = null;
-    serverLocation = null;
-    encodedServerLocation = null;
-    serverPort = -1;
-
-    keystoreData = null;
-    keystoreManager = null;
-
-    proxy = null;
-    httpClient = null;
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-
-    super.disconnect();
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    return new String[]{serverName};
-  }
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // Since we went to a carrydown-based implementation, having this greater than 1 does not help.
-    return 1;
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    getSession();
-    try
-    {
-      URL urlServer = new URL( serverUrl );
-    }
-    catch ( MalformedURLException e )
-    {
-      return "Illegal SharePoint url: "+e.getMessage();
-    }
-
-    try
-    {
-      proxy.checkConnection( "/", supportsItemSecurity );
-    }
-    catch ( ServiceInterruption e )
-    {
-      return "SharePoint temporarily unavailable: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      return e.getMessage();
-    }
-
-    return super.check();
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    if (proxy != null && System.currentTimeMillis() >= sessionTimeout)
-      expireSession();
-    if (connectionManager != null)
-      connectionManager.closeIdleConnections(60000L,TimeUnit.MILLISECONDS);
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return connectionManager != null;
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    if (command.startsWith("fields/"))
-    {
-      String library;
-      String sitePath;
-      
-      String remainder = command.substring("fields/".length());
-      
-      try
-      {
-        int index = remainder.indexOf("/");
-        if (index == -1)
-        {
-          library = remainder;
-          sitePath = "";
-        }
-        else
-        {
-          library = remainder.substring(0,index);
-          sitePath = remainder.substring(index+1);
-        }
-        
-        Map<String,String> fieldSet = getLibFieldList(sitePath,library);
-        Iterator<String> iter = fieldSet.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String fieldName = iter.next();
-          String displayName = fieldSet.get(fieldName);
-          ConfigurationNode node = new ConfigurationNode("field");
-          ConfigurationNode child;
-          child = new ConfigurationNode("name");
-          child.setValue(fieldName);
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("display_name");
-          child.setValue(displayName);
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("listfields/"))
-    {
-      String listName;
-      String sitePath;
-      
-      String remainder = command.substring("listfields/".length());
-      
-      try
-      {
-        int index = remainder.indexOf("/");
-        if (index == -1)
-        {
-          listName = remainder;
-          sitePath = "";
-        }
-        else
-        {
-          listName = remainder.substring(0,index);
-          sitePath = remainder.substring(index+1);
-        }
-        
-        Map<String,String> fieldSet = getListFieldList(sitePath,listName);
-        Iterator<String> iter = fieldSet.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String fieldName = iter.next();
-          String displayName = fieldSet.get(fieldName);
-          ConfigurationNode node = new ConfigurationNode("field");
-          ConfigurationNode child;
-          child = new ConfigurationNode("name");
-          child.setValue(fieldName);
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("display_name");
-          child.setValue(displayName);
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("sites/"))
-    {
-      try
-      {
-        String sitePath = command.substring("sites/".length());
-        List<NameValue> sites = getSites(sitePath);
-        int i = 0;
-        while (i < sites.size())
-        {
-          NameValue site = sites.get(i++);
-          ConfigurationNode node = new ConfigurationNode("site");
-          ConfigurationNode child;
-          child = new ConfigurationNode("name");
-          child.setValue(site.getValue());
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("display_name");
-          child.setValue(site.getPrettyName());
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("libraries/"))
-    {
-      try
-      {
-        String sitePath = command.substring("libraries/".length());
-        List<NameValue> libs = getDocLibsBySite(sitePath);
-        int i = 0;
-        while (i < libs.size())
-        {
-          NameValue lib = libs.get(i++);
-          ConfigurationNode node = new ConfigurationNode("library");
-          ConfigurationNode child;
-          child = new ConfigurationNode("name");
-          child.setValue(lib.getValue());
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("display_name");
-          child.setValue(lib.getPrettyName());
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else if (command.startsWith("lists/"))
-    {
-      try
-      {
-        String sitePath = command.substring("lists/".length());
-        List<NameValue> libs = getListsBySite(sitePath);
-        int i = 0;
-        while (i < libs.size())
-        {
-          NameValue lib = libs.get(i++);
-          ConfigurationNode node = new ConfigurationNode("list");
-          ConfigurationNode child;
-          child = new ConfigurationNode("name");
-          child.setValue(lib.getValue());
-          node.addChild(node.getChildCount(),child);
-          child = new ConfigurationNode("display_name");
-          child.setValue(lib.getPrettyName());
-          node.addChild(node.getChildCount(),child);
-          output.addChild(output.getChildCount(),node);
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        ManifoldCF.createServiceInterruptionNode(output,e);
-      }
-      catch (ManifoldCFException e)
-      {
-        ManifoldCF.createErrorNode(output,e);
-      }
-    }
-    else
-      return super.requestInfo(output,command);
-    return true;
-  }
-  
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Check the session
-    getSession();
-    // Add just the root.
-    activities.addSeedDocument("/");
-    return "";
-  }
-
-  protected static final String[] attachmentDataNames = new String[]{"createdDate","modifiedDate","accessTokens","denyTokens","url","guids"};
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Get the forced acls.  (We need this only for the case where documents have their own acls)
-    String[] forcedAcls = getAcls(spec);
-    
-    SystemMetadataDescription sDesc = new SystemMetadataDescription(spec);
-
-    // Look at the metadata attributes.
-    // So that the version strings are comparable, we will put them in an array first, and sort them.
-    String pathAttributeName = null;
-    MatchMap matchMap = new MatchMap();
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i++);
-      if (n.getType().equals("pathnameattribute"))
-        pathAttributeName = n.getAttributeValue("value");
-      else if (n.getType().equals("pathmap"))
-      {
-        // Path mapping info also needs to be looked at, because it affects what is
-        // ingested.
-        String pathMatch = n.getAttributeValue("match");
-        String pathReplace = n.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-
-    }
-
-    // Calculate the part of the version string that comes from path name and mapping.
-    // This starts with = since ; is used by another optional component (the forced acls)
-    StringBuilder pathNameAttributeVersion = new StringBuilder();
-    if (pathAttributeName != null)
-      pathNameAttributeVersion.append("=").append(pathAttributeName).append(":").append(matchMap);
-
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      // Check if we should abort
-      activities.checkJobStillActive();
-
-      getSession();
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug( "SharePoint: Getting version of '" + documentIdentifier + "'");
-      if ( documentIdentifier.startsWith("D") || documentIdentifier.startsWith("S") )
-      {
-        // Old-style document identifier.  We don't recognize these anymore, so signal deletion.
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Removing old-style document identifier '"+documentIdentifier+"'");
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-      else if (documentIdentifier.startsWith("/"))
-      {
-        // New-style document identifier.  A double-slash marks the separation between the library and folder/file levels.
-        // A triple-slash marks the separation between a list name and list row ID.
-        int dListSeparatorIndex = documentIdentifier.indexOf("///");
-        int dLibSeparatorIndex = documentIdentifier.indexOf("//");
-        if (dListSeparatorIndex != -1)
-        {
-          // === List-style identifier ===
-          if (dListSeparatorIndex == documentIdentifier.length() - 3)
-          {
-            // == List path! ==
-            if (!checkIncludeList(documentIdentifier.substring(0,documentIdentifier.length()-3),spec))
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: List specification no longer includes list '"+documentIdentifier+"' - removing");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            // Version string for a list
-            String versionString = "";
-
-            // Chained connectors always scan parent nodes, so they don't bother setting a version
-            String siteListPath = documentIdentifier.substring(0,documentIdentifier.length()-3);
-            int listCutoff = siteListPath.lastIndexOf( "/" );
-            String site = siteListPath.substring(0,listCutoff);
-            String listName = siteListPath.substring( listCutoff + 1 );
-
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug( "SharePoint: Document identifier is a list: '" + siteListPath + "'" );
-
-            String listID = proxy.getListID( encodePath(site), site, listName );
-            if (listID == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: GUID lookup failed for list '"+siteListPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            String encodedSitePath = encodePath(site);
-                
-            // Get the list's fields
-            Map<String,String> fieldNames = proxy.getFieldList( encodedSitePath, listID );
-            if (fieldNames == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Field list lookup failed for list '"+siteListPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            // Note well: There's been a lot of back-and forth about this code.
-            // See CONNECTORS-1324.
-            // The fieldNames map returned by proxy.getFieldList() has the internal name as a key, and the display name as a value.
-            // Since we want the complete list of fields here, by *internal* name, we iterate over the keySet(), not the values.
-            String[] fields = new String[fieldNames.size()];
-            int j = 0;
-            for (String field : fieldNames.keySet())
-            {
-              fields[j++] = field;
-            }
-                  
-            String[] accessTokens;
-            String[] denyTokens;
-                  
-            if (forcedAcls == null)
-            {
-              // Security is off
-              accessTokens = new String[0];
-              denyTokens = new String[0];
-            }
-            else if (forcedAcls.length != 0)
-            {
-              // Forced security
-              accessTokens = forcedAcls;
-              denyTokens = new String[0];
-            }
-            else
-            {
-              // Security enabled, native security
-              accessTokens = proxy.getACLs( encodedSitePath, listID, activeDirectoryAuthority );
-              denyTokens = new String[]{defaultAuthorityDenyToken};
-            }
-
-            if (accessTokens == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Access token lookup failed for list '"+siteListPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            ListItemStream fs = new ListItemStream( activities, encodedServerLocation, site, siteListPath, spec,
-              documentIdentifier, accessTokens, denyTokens, listID, fields );
-            boolean success = proxy.getChildren( fs, encodedSitePath , listID, dspStsWorks );
-            if (!success)
-            {
-              // Site/list no longer exists, so delete entry
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: No list found for list '"+siteListPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            activities.noDocument(documentIdentifier,versionString);
-          }
-          else
-          {
-            // == List item or attachment path! ==
-            // Convert the modified document path to an unmodified one, plus a library path.
-            String decodedListPath = documentIdentifier.substring(0,dListSeparatorIndex);
-            String itemAndAttachment = documentIdentifier.substring(dListSeparatorIndex+2);
-            String decodedItemPath = decodedListPath + itemAndAttachment;
-            
-            int cutoff = decodedListPath.lastIndexOf("/");
-            String sitePath = decodedListPath.substring(0,cutoff);
-            String list = decodedListPath.substring(cutoff+1);
-
-            String encodedSitePath = encodePath(sitePath);
-
-            int attachmentSeparatorIndex = itemAndAttachment.indexOf("//",1);
-            if (attachmentSeparatorIndex == -1)
-            {
-              // == List item path! ==
-              if (!checkIncludeListItem(decodedItemPath,spec))
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: List item '"+documentIdentifier+"' is no longer included - removing");
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-
-              // This file is included, so calculate a version string.  This will include metadata info, so get that first.
-              MetadataInformation metadataInfo = getMetadataSpecification(decodedItemPath,spec);
-
-              String[] accessTokens = activities.retrieveParentData(documentIdentifier, "accessTokens");
-              String[] denyTokens = activities.retrieveParentData(documentIdentifier, "denyTokens");
-              String[] listIDs = activities.retrieveParentData(documentIdentifier, "guids");
-              String[] listFields = activities.retrieveParentData(documentIdentifier, "fields");
-              String[] displayURLs = activities.retrieveParentData(documentIdentifier, "displayURLs");
-                
-              String listID;
-              if (listIDs.length >= 1)
-                listID = listIDs[0];
-              else
-                listID = null;
-
-              String displayURL;
-              if (displayURLs.length >= 1)
-                displayURL = displayURLs[0];
-              else
-                displayURL = null;
-
-              if (listID == null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because list '"+decodedListPath+"' does not exist - removing");
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-              
-              // Get the fields we want (internal field names only at this point), given the list of all fields (internal field names again).
-              String[] sortedMetadataFields = getInterestingFieldSetSorted(metadataInfo,listFields);
-                  
-              // Sort access tokens so they are comparable in the version string
-              java.util.Arrays.sort(accessTokens);
-              java.util.Arrays.sort(denyTokens);
-
-              // Next, get the actual timestamp field for the file.
-              List<String> metadataDescription = new ArrayList<String>();
-              metadataDescription.add("Modified");
-              metadataDescription.add("Created");
-              metadataDescription.add("ID");
-              metadataDescription.add("GUID");
-              // The document path includes the library, with no leading slash, and is decoded.
-              String decodedItemPathWithoutSite = decodedItemPath.substring(cutoff+1);
-              Map<String,String> values = proxy.getFieldValues( metadataDescription.toArray(new String[0]), encodedSitePath, listID, "/Lists/" + decodedItemPathWithoutSite, dspStsWorks );
-              if (values == null) {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because of bad XML characters(?)");
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-              String modifiedDate = values.get("Modified");
-              String createdDate = values.get("Created");
-              String id = values.get("ID");
-              String guid = values.get("GUID");
-              if (modifiedDate == null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because it has no modify date");
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-              
-              // Item has a modified date so we presume it exists.
-                  
-              Date modifiedDateValue = DateParser.parseISO8601Date(modifiedDate);
-              Date createdDateValue = DateParser.parseISO8601Date(createdDate);
-                    
-              // Build version string
-              String versionToken = modifiedDate;
-                      
-              // Revamped version string on 9/21/2013 to make parseability better
-              
-              StringBuilder sb = new StringBuilder();
-
-              packList(sb,sortedMetadataFields,'+');
-              packList(sb,accessTokens,'+');
-              packList(sb,denyTokens,'+');
-              packDate(sb,modifiedDateValue);
-              packDate(sb,createdDateValue);
-              pack(sb,id,'+');
-              pack(sb,guid,'+');
-              pack(sb,displayURL,'+');
-              // The rest of this is unparseable
-              sb.append(versionToken);
-              sb.append(pathNameAttributeVersion);
-              // Added 9/7/07
-              sb.append("_").append(fileBaseUrl);
-              //
-              String versionString = sb.toString();
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug( "SharePoint: Complete version string for '"+documentIdentifier+"': " + versionString);
-              
-              // Before we index, we queue up any attachments
-
-              // Now, do any queuing that is needed.
-              if (attachmentsSupported)
-              {
-                String itemNumber = id;
-
-
-                List<NameValue> attachmentNames = proxy.getAttachmentNames( sitePath, listID, itemNumber );
-                // Now, queue up each attachment as a separate entry
-                for (NameValue attachmentName : attachmentNames)
-                {
-                  // For attachments, we use the carry-down feature to get the data where we need it.  That's why
-                  // we unpacked the version information early above.
-                  
-                  // No check for inclusion; if the list item is included, so is this
-                  String[][] dataValues = new String[attachmentDataNames.length][];
-                  if (createdDateValue == null)
-                    dataValues[0] = new String[0];
-                  else
-                    dataValues[0] = new String[]{new Long(createdDateValue.getTime()).toString()};
-                  if (modifiedDateValue == null)
-                    dataValues[1] = new String[0];
-                  else
-                    dataValues[1] = new String[]{new Long(modifiedDateValue.getTime()).toString()};
-                  if (accessTokens == null)
-                    dataValues[2] = new String[0];
-                  else
-                    dataValues[2] = accessTokens;
-                  if (denyTokens == null)
-                    dataValues[3] = new String[0];
-                  else
-                    dataValues[3] = denyTokens;
-                  dataValues[4] = new String[]{attachmentName.getPrettyName()};
-                  dataValues[5] = new String[]{guid};
-
-                  activities.addDocumentReference(documentIdentifier + "//" + attachmentName.getValue(),
-                    documentIdentifier, null, attachmentDataNames, dataValues);
-                  
-                }
-              }
-
-              if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-                continue;
-                            
-              // Convert the modified document path to an unmodified one, plus a library path.
-              String encodedItemPath = encodePath(decodedListPath.substring(0,cutoff) + "/Lists/" + decodedItemPath.substring(cutoff+1));
-                
-              // Generate the URL we are going to use
-              String itemUrl = serverUrl + displayURL;  //fileBaseUrl + encodedItemPath;
-                
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug( "SharePoint: Processing list item '"+documentIdentifier+"'; url: '" + itemUrl + "'" );
-
-              // Fetch the metadata we will be indexing
-              Map<String,String> metadataValues = null;
-              if (sortedMetadataFields.length > 0)
-              {
-                metadataValues = proxy.getFieldValues( sortedMetadataFields, encodePath(sitePath), listID, "/Lists/" + decodedItemPath.substring(cutoff+1), dspStsWorks );
-                if (metadataValues == null)
-                {
-                  // Item has vanished
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug("SharePoint: Item metadata fetch failure indicated that item is gone: '"+documentIdentifier+"' - removing");
-                  activities.recordActivity(null,ACTIVITY_FETCH,null,documentIdentifier,"NOMETADATA","List item metadata is missing",null);
-                  activities.noDocument(documentIdentifier,versionString);
-                  continue;
-                }
-              }
-                
-              if (!activities.checkLengthIndexable(0L))
-              {
-                // Document too long (should never happen; length is 0)
-                activities.recordActivity(null,ACTIVITY_FETCH,null,documentIdentifier,activities.EXCLUDED_LENGTH,"List item excluded due to content length (0)",null);
-                activities.noDocument( documentIdentifier, versionString );
-                continue;
-              }
-                
-              InputStream is = new ByteArrayInputStream(new byte[0]);
-              try
-              {
-                RepositoryDocument data = new RepositoryDocument();
-                data.setBinary( is, 0L );
-
-                if (modifiedDateValue != null)
-                  data.setModifiedDate(modifiedDateValue);
-                if (createdDateValue != null)
-                  data.setCreatedDate(createdDateValue);
-                    
-                setDataACLs(data,accessTokens,denyTokens);
-                
-                setPathAttribute(data,sDesc,documentIdentifier);
-
-                if (metadataValues != null)
-                {
-                  Iterator<String> iter = metadataValues.keySet().iterator();
-                  while (iter.hasNext())
-                  {
-                    String fieldName = iter.next();
-                    String fieldData = metadataValues.get(fieldName);
-                    data.addField(fieldName,fieldData);
-                  }
-                }
-                data.addField("GUID",guid);
-                try
-                {
-                  activities.ingestDocumentWithException( documentIdentifier, versionString, itemUrl , data );
-                }
-                catch (IOException e)
-                {
-                  handleIOException(e,"reading document");
-                }
-              }
-              finally
-              {
-                try
-                {
-                  is.close();
-                }
-                catch (IOException e)
-                {
-                  handleIOException(e,"closing stream");
-                }
-              }
-
-            }
-            else
-            {
-              // == List item attachment path! ==
-              if (!checkIncludeListItemAttachment(decodedItemPath,spec))
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: List item attachment '"+documentIdentifier+"' is no longer included - removing");
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-              
-              // To save work, we retrieve most of what we need in version info from the parent.
-
-              // Retrieve modified and created dates
-              String[] modifiedDateSet = activities.retrieveParentData(documentIdentifier, "modifiedDate");
-              String[] createdDateSet = activities.retrieveParentData(documentIdentifier, "createdDate");
-              String[] accessTokens = activities.retrieveParentData(documentIdentifier, "accessTokens");
-              String[] denyTokens = activities.retrieveParentData(documentIdentifier, "denyTokens");
-              String[] urlSet = activities.retrieveParentData(documentIdentifier, "url");
-
-              // Only one modifiedDate and createdDate can be used.  If there's more than one, just pick one - the item will be reindexed
-              // anyhow.
-              String modifiedDate;
-              if (modifiedDateSet.length >= 1)
-                modifiedDate = modifiedDateSet[0];
-              else
-                modifiedDate = null;
-              String createdDate;
-              if (createdDateSet.length >= 1)
-                createdDate = createdDateSet[0];
-              else
-                createdDate = null;
-              String url;
-              if (urlSet.length >=1)
-                url = urlSet[0];
-              else
-                url = null;
-
-              // If we have no modified or created date, it means that the parent has gone away, so we go away too.
-              if (modifiedDate == null || url == null)
-              {
-                // Can't look up list ID, which means the list is gone, so delete
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because modified date or attachment url not found");
-                activities.deleteDocument(documentIdentifier);
-                continue;
-              }
-              
-              // Item has a modified date so we presume it exists.
-                      
-              Date modifiedDateValue;
-              if (modifiedDate != null)
-                modifiedDateValue = new Date(new Long(modifiedDate).longValue());
-              else
-                modifiedDateValue = null;
-              Date createdDateValue;
-              if (createdDate != null)
-                createdDateValue = new Date(new Long(createdDate).longValue());
-              else
-                createdDateValue = null;
-                      
-              // Build version string
-              String versionToken = modifiedDate;
-                      
-              StringBuilder sb = new StringBuilder();
-
-              // Pack the URL to get the data from
-              pack(sb,url,'+');
-                  
-              // Do the acls.  If we get this far, we are guaranteed to have them, but we need to sort.
-              java.util.Arrays.sort(accessTokens);
-              java.util.Arrays.sort(denyTokens);
-                  
-              packList(sb,accessTokens,'+');
-              packList(sb,denyTokens,'+');
-              packDate(sb,modifiedDateValue);
-              packDate(sb,createdDateValue);
-
-              // The rest of this is unparseable
-              sb.append(versionToken);
-              sb.append(pathNameAttributeVersion);
-              sb.append("_").append(fileBaseUrl);
-              //
-              String versionString = sb.toString();
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug( "SharePoint: Complete version string for '"+documentIdentifier+"': " + versionString);
-
-              if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-                continue;
-              
-              // We need the list ID, which we've already fetched, so grab that from the parent data.
-              String[] guids = activities.retrieveParentData(documentIdentifier, "guids");
-              String guid;
-              if (guids.length >= 1)
-                guid = guids[0];
-              else
-                guid = null;
-                
-              if (guid == null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Skipping attachment '"+documentIdentifier+"' because no parent guid found");
-                activities.recordActivity(null,ACTIVITY_FETCH,null,documentIdentifier,"NOGUID","List item attachment GUID is missing",null);
-                activities.noDocument(documentIdentifier,versionString);
-                continue;
-              }
-              
-              int lastIndex = url.lastIndexOf("/");
-              guid = guid + ":" + url.substring(lastIndex+1);
-                  
-              // Fetch and index.  This also filters documents based on output connector restrictions.
-              String fileUrl = serverUrl + encodePath(url);
-              String fetchUrl = fileUrl;
-              fetchAndIndexFile(activities, documentIdentifier, versionString, fileUrl, fetchUrl,
-                accessTokens, denyTokens, createdDateValue, modifiedDateValue, null, guid, sDesc);
-            }
-          }
-        }
-        else if (dLibSeparatorIndex != -1)
-        {
-          // === Library-style identifier ===
-          if (dLibSeparatorIndex == documentIdentifier.length() - 2)
-          {
-            // Library path!
-            if (!checkIncludeLibrary(documentIdentifier.substring(0,documentIdentifier.length()-2),spec))
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Library specification no longer includes library '"+documentIdentifier+"' - removing");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-              
-            // This is the path for the library: No versioning
-            String versionString = "";
-            // Chained document parents are always rescanned
-            String siteLibPath = documentIdentifier.substring(0,documentIdentifier.length()-2);
-            int libCutoff = siteLibPath.lastIndexOf( "/" );
-            String site = siteLibPath.substring(0,libCutoff);
-            String libName = siteLibPath.substring( libCutoff + 1 );
-
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug( "SharePoint: Document identifier is a library: '" + siteLibPath + "'" );
-
-            String libID = proxy.getDocLibID( encodePath(site), site, libName );
-            if (libID == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: GUID lookup failed for library '"+siteLibPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            String encodedSitePath = encodePath(site);
-              
-            // Get the lib's fields
-            Map<String,String> fieldNames = proxy.getFieldList( encodedSitePath, libID );
-            if (fieldNames == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Field list lookup failed for library '"+siteLibPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            // See CONNECTORS-1324.  We want internal field names only,
-            // which are the keys of the map.
-            String[] fields = new String[fieldNames.size()];
-            int j = 0;
-            for (String field : fieldNames.keySet())
-            {
-              fields[j++] = field;
-            }
-                  
-            String[] accessTokens;
-            String[] denyTokens;
-                  
-            if (forcedAcls == null)
-            {
-              // Security is off
-              accessTokens = new String[0];
-              denyTokens = new String[0];
-            }
-            else if (forcedAcls.length != 0)
-            {
-              // Forced security
-              accessTokens = forcedAcls;
-              denyTokens = new String[0];
-            }
-            else
-            {
-              // Security enabled, native security
-              accessTokens = proxy.getACLs( encodedSitePath, libID, activeDirectoryAuthority );
-              denyTokens = new String[]{defaultAuthorityDenyToken};
-            }
-
-            if (accessTokens == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Access token lookup failed for library '"+siteLibPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            FileStream fs = new FileStream( activities, encodedServerLocation, site, siteLibPath, spec,
-              documentIdentifier, accessTokens, denyTokens, libID, fields );
-            
-            boolean success = proxy.getChildren( fs, encodedSitePath , libID, dspStsWorks );
-            
-            if (!success)
-            {
-              // Site/library no longer exists, so delete entry
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: No list found for library '"+siteLibPath+"' - deleting");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-
-            activities.noDocument(documentIdentifier,versionString);
-          }
-          else
-          {
-            // == Document path ==
-            // Convert the modified document path to an unmodified one, plus a library path.
-            String decodedLibPath = documentIdentifier.substring(0,dLibSeparatorIndex);
-            String decodedDocumentPath = decodedLibPath + documentIdentifier.substring(dLibSeparatorIndex+1);
-            if (!checkIncludeFile(decodedDocumentPath,spec))
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Document '"+documentIdentifier+"' is no longer included - removing");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            // This file is included, so calculate a version string.  This will include metadata info, so get that first.
-            MetadataInformation metadataInfo = getMetadataSpecification(decodedDocumentPath,spec);
-            
-            int lastIndex = decodedLibPath.lastIndexOf("/");
-            String sitePath = decodedLibPath.substring(0,lastIndex);
-            String lib = decodedLibPath.substring(lastIndex+1);
-
-            // Retrieve the carry-down data we will be using.
-            // Note well: for sharepoint versions that include document/folder acls, these access tokens will be ignored,
-            // but they will still be carried down nonetheless, in case someone switches versions on us.
-            String[] accessTokens = activities.retrieveParentData(documentIdentifier, "accessTokens");
-            String[] denyTokens = activities.retrieveParentData(documentIdentifier, "denyTokens");
-            String[] libIDs = activities.retrieveParentData(documentIdentifier, "guids");
-            String[] libFields = activities.retrieveParentData(documentIdentifier, "fields");
-
-            String libID;
-            if (libIDs.length >= 1)
-              libID = libIDs[0];
-            else
-              libID = null;
-
-            if (libID == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because library '"+decodedLibPath+"' does not exist - removing");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            String encodedSitePath = encodePath(sitePath);
-            // Get the fields we want (internal field names only at this point), given the list of all fields (internal field names again).
-            String[] sortedMetadataFields = getInterestingFieldSetSorted(metadataInfo,libFields);
-                
-            // Sort access tokens
-            java.util.Arrays.sort(accessTokens);
-            java.util.Arrays.sort(denyTokens);
-
-            // Next, get the actual timestamp field for the file.
-            List<String> metadataDescription = new ArrayList<String>();
-            metadataDescription.add("Last_x0020_Modified");
-            metadataDescription.add("Modified");
-            metadataDescription.add("Created");
-            metadataDescription.add("GUID");
-            // The document path includes the library, with no leading slash, and is decoded.
-            int cutoff = decodedLibPath.lastIndexOf("/");
-            String decodedDocumentPathWithoutSite = decodedDocumentPath.substring(cutoff);
-            Map<String,String> values = proxy.getFieldValues( metadataDescription.toArray(new String[0]), encodedSitePath, libID, decodedDocumentPathWithoutSite, dspStsWorks );
-            if (values == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because it has bad characters(?)");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-
-            String modifiedDate = values.get("Modified");
-            String createdDate = values.get("Created");
-            String guid = values.get("GUID");
-            String modifyDate = values.get("Last_x0020_Modified");
-
-            if (modifyDate == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Can't get version of '"+documentIdentifier+"' because it has no modify date");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            // Item has a modified date, so we presume it exists
-            Date modifiedDateValue = DateParser.parseISO8601Date(modifiedDate);
-            Date createdDateValue = DateParser.parseISO8601Date(createdDate);
-
-            // Build version string
-            String versionToken = modifyDate;
-
-            if (supportsItemSecurity)
-            {
-              // Do the acls.
-              if (forcedAcls == null)
-              {
-                // Security is off
-                accessTokens = new String[0];
-                denyTokens = new String[0];
-              }
-              else if (forcedAcls.length > 0)
-              {
-                // Security on, forced acls
-                accessTokens = forcedAcls;
-                denyTokens = new String[0];
-              }
-              else
-              {
-                // Security on, is native
-                accessTokens = proxy.getDocumentACLs( encodedSitePath, encodePath(decodedDocumentPath), activeDirectoryAuthority );
-                denyTokens = new String[]{defaultAuthorityDenyToken};
-              }
-            }
-                  
-            if (accessTokens == null)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Couldn't get access tokens for item '"+decodedDocumentPath+"'; removing document '"+documentIdentifier+"'");
-              activities.deleteDocument(documentIdentifier);
-              continue;
-            }
-            
-            // Revamped version string on 9/21/2013 to make parseability better
-
-            StringBuilder sb = new StringBuilder();
-            packList(sb,sortedMetadataFields,'+');
-            packList(sb,accessTokens,'+');
-            packList(sb,denyTokens,'+');
-            packDate(sb,modifiedDateValue);
-            packDate(sb,createdDateValue);
-            pack(sb,guid,'+');
-            // The rest of this is unparseable
-            sb.append(versionToken);
-            sb.append(pathNameAttributeVersion);
-            // Added 9/7/07
-            sb.append("_").append(fileBaseUrl);
-            //
-            String versionString = sb.toString();
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug( "SharePoint: Complete version string for '"+documentIdentifier+"': " + versionString);
-            
-            if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-              continue;
-            
-            // Convert the modified document path to an unmodified one, plus a library path.
-            String encodedDocumentPath = encodePath(decodedDocumentPath);
-
-            // Parse what we need out of version string.
-
-            // Generate the URL we are going to use
-            String fileUrl = fileBaseUrl + encodedDocumentPath;
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug( "SharePoint: Processing file '"+documentIdentifier+"'; url: '" + fileUrl + "'" );
-
-            // First, fetch the metadata we plan to index.
-            Map<String,String> metadataValues = null;
-            if (sortedMetadataFields.length > 0)
-            {
-              metadataValues = proxy.getFieldValues( sortedMetadataFields, encodePath(sitePath), libID, decodedDocumentPath.substring(cutoff), dspStsWorks );
-              if (metadataValues == null)
-              {
-                // Document has vanished
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Document metadata fetch failure indicated that document is gone: '"+documentIdentifier+"' - removing");
-                activities.recordActivity(null,ACTIVITY_FETCH,null,documentIdentifier,"NOMETADATA","Document metadata is missing",null);
-                activities.noDocument(documentIdentifier,versionString);
-                continue;
-              }
-            }
-
-            // Fetch and index.  This also filters documents based on output connector restrictions.
-            fetchAndIndexFile(activities, documentIdentifier, versionString, fileUrl, serverUrl + encodedServerLocation + encodedDocumentPath,
-              accessTokens, denyTokens, createdDateValue, modifiedDateValue, metadataValues, guid, sDesc);
-          }
-        }
-        else
-        {
-          // === Site-style identifier ===
-          String sitePath = documentIdentifier.substring(0,documentIdentifier.length()-1);
-          if (sitePath.length() == 0)
-            sitePath = "/";
-          if (!checkIncludeSite(sitePath,spec))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Site specification no longer includes site '"+documentIdentifier+"' - removing");
-            activities.deleteDocument(documentIdentifier);
-            continue;
-          }
-          
-          String versionString = "";
-          activities.noDocument(documentIdentifier,versionString);
-
-          // Strip off the trailing "/" to get the site name.
-          String decodedSitePath = documentIdentifier.substring(0,documentIdentifier.length()-1);
-
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug( "SharePoint: Document identifier is a site: '" + decodedSitePath + "'" );
-
-          // Look at subsites
-          List<NameValue> subsites = proxy.getSites( encodePath(decodedSitePath) );
-          if (subsites != null)
-          {
-            for (NameValue subSiteName : subsites)
-            {
-              String newPath = decodedSitePath + "/" + subSiteName.getValue();
-
-              String encodedNewPath = encodePath(newPath);
-              if ( checkIncludeSite(newPath,spec) )
-                activities.addDocumentReference(newPath + "/");
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: No permissions to access subsites of '"+decodedSitePath+"' - skipping");
-          }
-
-          // Look at libraries
-          List<NameValue> libraries = proxy.getDocumentLibraries( encodePath(decodedSitePath), decodedSitePath );
-          if (libraries != null)
-          {
-            for (NameValue library : libraries)
-            {
-              String newPath = decodedSitePath + "/" + library.getValue();
-
-              if (checkIncludeLibrary(newPath,spec))
-                activities.addDocumentReference(newPath + "//");
-
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: No permissions to access libraries of '"+decodedSitePath+"' - skipping");
-          }
-
-          // Look at lists
-          List<NameValue> lists = proxy.getLists( encodePath(decodedSitePath), decodedSitePath );
-          if (lists != null)
-          {
-            for (NameValue list : lists)
-            {
-              String newPath = decodedSitePath + "/" + list.getValue();
-
-              if (checkIncludeList(newPath,spec))
-                activities.addDocumentReference(newPath + "///");
-
-            }
-          }
-          else
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: No permissions to access lists of '"+decodedSitePath+"' - skipping");
-          }
-
-        }
-      }
-      else
-        throw new ManifoldCFException("Invalid document identifier discovered: '"+documentIdentifier+"'");
-    }
-  }
-
-  protected static void packDate(StringBuilder sb, Date dateValue)
-  {
-    if (dateValue != null)
-    {
-      sb.append("+");
-      pack(sb,new Long(dateValue.getTime()).toString(),'+');
-    }
-    else
-      sb.append("-");
-  }
-
-  protected static int unpackDate(String value, int index, Date theDate)
-  {
-    if (value.length() > index)
-    {
-      if (value.charAt(index++) == '+')
-      {
-        StringBuilder sb = new StringBuilder();
-        index = unpack(sb,value,index,'+');
-        if (sb.length() > 0)
-        {
-          theDate.setTime(new Long(sb.toString()).longValue());
-        }
-      }
-    }
-    return index;
-  }
-  
-  protected String[] getInterestingFieldSetSorted(MetadataInformation metadataInfo, String[] allFields)
-  {
-    Set<String> metadataFields = new HashSet<String>();
-
-    // Figure out the actual metadata fields we will request
-    if (metadataInfo.getAllMetadata())
-    {
-      for (String field : allFields)
-      {
-        metadataFields.add(field);
-      }
-    }
-    else
-    {
-      String[] fields = metadataInfo.getMetadataFields();
-      for (String field : fields)
-      {
-        metadataFields.add(field);
-      }
-    }
-    
-    // Convert the hashtable to an array and sort it.
-    String[] sortedMetadataFields = new String[metadataFields.size()];
-    int z = 0;
-    for (String field : metadataFields)
-    {
-      sortedMetadataFields[z++] = field;
-    }
-    java.util.Arrays.sort(sortedMetadataFields);
-
-    return sortedMetadataFields;
-  }
-
-  /** Method that fetches and indexes a file fetched from a SharePoint URL, with appropriate error handling
-  * etc.
-  */
-  protected void fetchAndIndexFile(IProcessActivity activities, String documentIdentifier, String version,
-    String fileUrl, String fetchUrl, String[] accessTokens, String[] denyTokens, Date createdDate, Date modifiedDate,
-    Map<String,String> metadataValues, String guid, SystemMetadataDescription sDesc)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String errorCode = null;
-    String errorDesc = null;
-    long startTime = System.currentTimeMillis();
-    Long fileLengthLong = null;
-    
-    try
-    {
-      // Before we fetch, confirm that the output connector will accept the document
-      if (!activities.checkURLIndexable(fileUrl))
-      {
-        // URL failed
-        errorCode = activities.EXCLUDED_URL;
-        errorDesc = "Document rejected because of URL ("+fileUrl+")";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Skipping document '"+documentIdentifier+"' because output connector says URL '"+fileUrl+"' is not indexable");
-        activities.noDocument(documentIdentifier, version);
-        return;
-      }
-      
-      // Also check mime type
-      String contentType = mapExtensionToMimeType(documentIdentifier);
-      if (!activities.checkMimeTypeIndexable(contentType))
-      {
-        // Mime type failed
-        errorCode = activities.EXCLUDED_MIMETYPE;
-        errorDesc = "Document rejected because of mime type ("+contentType+")";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Skipping document '"+documentIdentifier+"' because output connector says mime type '"+((contentType==null)?"null":contentType)+"' is not indexable");
-        activities.noDocument(documentIdentifier, version);
-        return;
-      }
-      
-      // Now check date stamp
-      if (!activities.checkDateIndexable(modifiedDate))
-      {
-        // Date failed
-        errorCode = activities.EXCLUDED_DATE;
-        errorDesc = "Document rejected because of date ("+modifiedDate+")";
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("SharePoint: Skipping document '"+documentIdentifier+"' because output connector says date '"+((modifiedDate==null)?"null":modifiedDate)+"' is not indexable");
-        activities.noDocument(documentIdentifier, version);
-        return;
-      }
-      
-      // Set stuff up for fetch activity logging
-      try
-      {
-        // Read the document into a local temporary file, so I get a reliable length.
-        File tempFile = File.createTempFile("__shp__",".tmp");
-        try
-        {
-          // Open the output stream
-          OutputStream os = new FileOutputStream(tempFile);
-          try
-          {
-            // Catch all exceptions having to do with reading the document
-            try
-            {
-              ExecuteMethodThread emt = new ExecuteMethodThread(httpClient, fetchUrl, os);
-              emt.start();
-              int returnCode = emt.finishUp();
-                    
-              if (returnCode == 404 || returnCode == 401 || returnCode == 400 || returnCode == 415)
-              {
-                // Well, sharepoint thought the document was there, but it really isn't, so delete it.
-                errorCode = "DOCUMENTNOTFOUND";
-                errorDesc = "Document not found; HTTP code "+returnCode;
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: Document at '"+fileUrl+"' failed to fetch with code "+Integer.toString(returnCode)+", deleting");
-                activities.noDocument(documentIdentifier, version);
-                return;
-              }
-              else if (returnCode != 200)
-              {
-                errorCode = "UNKNOWNHTTPCODE";
-                errorDesc = "Unknown HTTP return code "+returnCode;
-                throw new ManifoldCFException("Error fetching document '"+fileUrl+"': "+Integer.toString(returnCode));
-              }
-
-            }
-            catch (InterruptedException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              Logging.connectors.warn("SharePoint: SocketTimeoutException thrown: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("SharePoint is down attempting to read '"+fileUrl+"', retrying: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,true);
-            }
-            catch (org.apache.http.conn.ConnectTimeoutException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              Logging.connectors.warn("SharePoint: ConnectTimeoutException thrown: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("SharePoint is down attempting to read '"+fileUrl+"', retrying: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,true);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IllegalArgumentException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              Logging.connectors.error("SharePoint: Illegal argument: "+e.getMessage(), e);
-              throw new ManifoldCFException("SharePoint: Illegal argument: "+e.getMessage(),e);
-            }
-            catch (org.apache.http.HttpException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              Logging.connectors.warn("SharePoint: HttpException thrown: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("SharePoint is down attempting to read '"+fileUrl+"', retrying: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,true);
-            }
-            catch (IOException e)
-            {
-              errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              errorDesc = e.getMessage();
-              Logging.connectors.warn("SharePoint: IOException thrown: "+e.getMessage(),e);
-              long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("SharePoint is down attempting to read '"+fileUrl+"', retrying: "+e.getMessage(),e,currentTime + 300000L,
-                currentTime + 12 * 60 * 60000L,-1,true);
-            }
-          }
-          finally
-          {
-            os.close();
-          }
-                        
-          // Ingest the document
-          long documentLength = tempFile.length();
-          if (!activities.checkLengthIndexable(documentLength))
-          {
-            // Document too long
-            errorCode = activities.EXCLUDED_LENGTH;
-            errorDesc = "Document excluded due to length ("+documentLength+")";
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Document '"+documentIdentifier+"' was too long, according to output connector");
-            activities.noDocument(documentIdentifier, version);
-            return;
-          }
-          
-          InputStream is = new FileInputStream(tempFile);
-          try
-          {
-            RepositoryDocument data = new RepositoryDocument();
-            data.setBinary( is, documentLength );
-                  
-            data.setFileName(mapToFileName(documentIdentifier));
-                            
-            if (contentType != null)
-              data.setMimeType(contentType);
-                  
-            setDataACLs(data,accessTokens,denyTokens);
-
-            setPathAttribute(data,sDesc,documentIdentifier);
-            
-            if (modifiedDate != null)
-              data.setModifiedDate(modifiedDate);
-            if (createdDate != null)
-              data.setCreatedDate(createdDate);
-
-            if (metadataValues != null)
-            {
-              Iterator<String> iter = metadataValues.keySet().iterator();
-              while (iter.hasNext())
-              {
-                String fieldName = iter.next();
-                String fieldData = metadataValues.get(fieldName);
-                data.addField(fieldName,fieldData);
-              }
-            }
-            data.addField("GUID",guid);
-                  
-            try
-            {
-              activities.ingestDocumentWithException( documentIdentifier, version, fileUrl , data );
-              errorCode = "OK";
-              fileLengthLong = new Long(documentLength);
-            }
-            catch (IOException e)
-            {
-              handleIOException(e,"reading document");
-            }
-            return;
-          }
-          finally
-          {
-            try
-            {
-              is.close();
-            }
-            catch (java.net.SocketTimeoutException e)
-            {
-              // This is not fatal
-              Logging.connectors.debug("SharePoint: Timeout before read could finish for '"+fileUrl+"': "+e.getMessage(),e);
-            }
-            catch (org.apache.http.conn.ConnectTimeoutException e)
-            {
-              // This is not fatal
-              Logging.connectors.debug("SharePoint: Connect timeout before read could finish for '"+fileUrl+"': "+e.getMessage(),e);
-            }
-            catch (InterruptedIOException e)
-            {
-              throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e)
-            {
-              // This is not fatal
-              Logging.connectors.debug("SharePoint: Server closed connection before read could finish for '"+fileUrl+"': "+e.getMessage(),e);
-            }
-          }
-        }
-        finally
-        {
-          tempFile.delete();
-        }
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        throw new ManifoldCFException("Socket timeout error writing '"+fileUrl+"' to temporary file: "+e.getMessage(),e);
-      }
-      catch (org.apache.http.conn.ConnectTimeoutException e)
-      {
-        throw new ManifoldCFException("Connect timeout error writing '"+fileUrl+"' to temporary file: "+e.getMessage(),e);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("IO error writing '"+fileUrl+"' to temporary file: "+e.getMessage(),e);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        errorCode = null;
-      throw e;
-    }
-    finally
-    {
-      if (errorCode != null)
-        activities.recordActivity(new Long(startTime),ACTIVITY_FETCH,
-          fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-    }
-  }
-
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("SharePoint is down attempting to "+context+", retrying: "+e.getMessage(),e,currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    else if (e instanceof org.apache.http.conn.ConnectTimeoutException)
-    {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("SharePoint is down attempting to "+context+", retrying: "+e.getMessage(),e,currentTime + 300000L,
-        currentTime + 12 * 60 * 60000L,-1,true);
-    }
-    else if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    else
-      throw new ManifoldCFException(e.getMessage(),e);
-  }
-  
-  /** Map an extension to a mime type */
-  protected static String mapExtensionToMimeType(String fileName)
-  {
-    int slashIndex = fileName.lastIndexOf("/");
-    if (slashIndex != -1)
-      fileName = fileName.substring(slashIndex+1);
-    int dotIndex = fileName.lastIndexOf(".");
-    if (dotIndex == -1)
-      return null;
-    return ExtensionMimeMap.mapToMimeType(fileName.substring(dotIndex+1));
-  }
-
-  /** Map document identifier to file name */
-  protected static String mapToFileName(String fileName)
-  {
-    int slashIndex = fileName.lastIndexOf("/");
-    if (slashIndex != -1)
-      fileName = fileName.substring(slashIndex+1);
-    return fileName;
-  }
-  
-  protected static void setDataACLs(RepositoryDocument data, String[] acls, String[] denyAcls)
-  {
-    if (acls != null)
-    {
-      if (Logging.connectors.isDebugEnabled())
-      {
-        StringBuilder sb = new StringBuilder("SharePoint: Acls: [ ");
-        for (String acl : acls)
-        {
-          sb.append(acl).append(" ");
-        }
-        sb.append("]");
-        Logging.connectors.debug( sb.toString() );
-      }
-
-      data.setSecurityACL( RepositoryDocument.SECURITY_TYPE_DOCUMENT, acls );
-    }
-
-    if (denyAcls != null)
-    {
-      if (Logging.connectors.isDebugEnabled())
-      {
-        StringBuilder sb = new StringBuilder("SharePoint: DenyAcls: [ ");
-        for (String denyAcl : denyAcls)
-        {
-          sb.append(denyAcl).append(" ");
-        }
-        sb.append("]");
-        Logging.connectors.debug( sb.toString() );
-      }
-
-      data.setSecurityDenyACL( RepositoryDocument.SECURITY_TYPE_DOCUMENT, denyAcls);
-    }
-  }
-
-  protected static void setPathAttribute(RepositoryDocument data, SystemMetadataDescription sDesc, String documentIdentifier)
-    throws ManifoldCFException
-  {
-    // Add the path metadata item into the mix, if enabled
-    String pathAttributeName = sDesc.getPathAttributeName();
-    if (pathAttributeName != null && pathAttributeName.length() > 0)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Path attribute name is '"+pathAttributeName+"'");
-      String pathString = sDesc.getPathAttributeValue(documentIdentifier);
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("SharePoint: Path attribute value is '"+pathString+"'");
-      data.addField(pathAttributeName,pathString);
-    }
-    else
-      Logging.connectors.debug("SharePoint: Path attribute name is null");
-  }
-
-  protected final static String[] fileStreamDataNames = new String[]{"accessTokens", "denyTokens", "guids", "fields"};
-
-  protected class FileStream implements IFileStream
-  {
-    protected final IProcessActivity activities;
-    protected final Specification spec;
-    protected final String rootPath;
-    protected final String sitePath;
-    protected final String siteLibPath;
-    
-    // For carry-down
-    protected final String documentIdentifier;
-    protected final String[][] dataValues;
-    
-    public FileStream(IProcessActivity activities, String rootPath, String sitePath, String siteLibPath, Specification spec,
-      String documentIdentifier, String[] accessTokens, String denyTokens[], String libID, String[] fields)
-    {
-      this.activities = activities;
-      this.spec = spec;
-      this.rootPath = rootPath;
-      this.sitePath = sitePath;
-      this.siteLibPath = siteLibPath;
-      this.documentIdentifier = documentIdentifier;
-      this.dataValues = new String[fileStreamDataNames.length][];
-      this.dataValues[0] = accessTokens;
-      this.dataValues[1] = denyTokens;
-      this.dataValues[2] = new String[]{libID};
-      this.dataValues[3] = fields;
-    }
-    
-    @Override
-    public void addFile(String relPath, String displayURL)
-      throws ManifoldCFException
-    {
-
-      // First, convert the relative path to a full path
-      if ( !relPath.startsWith("/") )
-      {
-        relPath = rootPath + sitePath + "/" + relPath;
-      }
-      
-      // Now, strip away what we don't want - namely, the root path.  This makes the path relative to the root.
-      if ( relPath.startsWith(rootPath) )
-      {
-        relPath = relPath.substring(rootPath.length());
-      
-        if ( checkIncludeFile( relPath, spec ) )
-        {
-          // Since the processing for a file needs to know the library path, we need a way to signal the cutoff between library and folder levels.
-          // The way I've chosen to do this is to use a double slash at that point, as a separator.
-          if (relPath.startsWith(siteLibPath))
-          {
-            // Split at the libpath/file boundary
-            String modifiedPath = siteLibPath + "/" + relPath.substring(siteLibPath.length());
-            activities.addDocumentReference( modifiedPath, documentIdentifier, null, fileStreamDataNames, dataValues );
-          }
-          else
-          {
-            Logging.connectors.warn("SharePoint: Unexpected relPath structure; path is '"+relPath+"', but expected to see something beginning with '"+siteLibPath+"'");
-          }
-        }
-      }
-      else
-      {
-        Logging.connectors.warn("SharePoint: Unexpected relPath structure; path is '"+relPath+"', but expected to see something beginning with '"+rootPath+"'");
-      }
-    }
-  }
-  
-  protected final static String[] listItemStreamDataNames = new String[]{"accessTokens", "denyTokens", "guids", "fields", "displayURLs"};
-
-  protected class ListItemStream implements IFileStream
-  {
-    protected final IProcessActivity activities;
-    protected final Specification spec;
-    protected final String rootPath;
-    protected final String sitePath;
-    protected final String siteListPath;
-
-    // For carry-down
-    protected final String documentIdentifier;
-    protected final String[][] dataValues;
-
-    public ListItemStream(IProcessActivity activities, String rootPath, String sitePath, String siteListPath, Specification spec,
-      String documentIdentifier, String[] accessTokens, String denyTokens[], String listID, String[] fields)
-    {
-      this.activities = activities;
-      this.spec = spec;
-      this.rootPath = rootPath;
-      this.sitePath = sitePath;
-      this.siteListPath = siteListPath;
-      this.documentIdentifier = documentIdentifier;
-      this.dataValues = new String[listItemStreamDataNames.length][];
-      this.dataValues[0] = accessTokens;
-      this.dataValues[1] = denyTokens;
-      this.dataValues[2] = new String[]{listID};
-      this.dataValues[3] = fields;
-    }
-    
-    @Override
-    public void addFile(String relPath, String displayURL)
-      throws ManifoldCFException
-    {
-      // First, convert the relative path to a full path
-      if ( !relPath.startsWith("/") )
-      {
-        relPath = rootPath + sitePath + "/" + relPath;
-      }
-
-      String fullPath = relPath;
-
-      // Now, strip away what we don't want - namely, the root path.  This makes the path relative to the root.
-      if ( relPath.startsWith(rootPath) )
-      {
-        relPath = relPath.substring(rootPath.length());
-
-        if (relPath.startsWith(sitePath))
-        {
-          relPath = relPath.substring(sitePath.length());
-          
-          // Now, strip "Lists" from relPath.  If it doesn't start with /Lists/, ignore it.
-          if (relPath.startsWith("/Lists/"))
-          {
-            relPath = sitePath + relPath.substring("/Lists".length());
-            if ( checkIncludeListItem( relPath, spec ) )
-            {
-              if (relPath.startsWith(siteListPath))
-              {
-                // Since the processing for a item needs to know the list path, we need a way to signal the cutoff between list and item levels.
-                // The way I've chosen to do this is to use a triple slash at that point, as a separator.
-                String modifiedPath = relPath.substring(0,siteListPath.length()) + "//" + relPath.substring(siteListPath.length());
-                
-                if (displayURL != null)
-                  dataValues[4] = new String[]{displayURL};
-                else
-                  dataValues[4] = new String[]{fullPath};
-
-                activities.addDocumentReference( modifiedPath, documentIdentifier, null, listItemStreamDataNames, dataValues );
-              }
-              else
-              {
-                Logging.connectors.warn("SharePoint: Unexpected relPath structure; site path is '"+relPath+"', but expected to see something beginning with '"+siteListPath+"'");
-              }
-            }
-          }
-          else
-          {
-            Logging.connectors.warn("SharePoint: Unexpected relPath structure; rel path is '"+relPath+"', but expected to see something beginning with '/Lists/'");
-          }
-        }
-        else
-        {
-          Logging.connectors.warn("SharePoint: Unexpected relPath structure; site path is '"+relPath+"', but expected to see something beginning with '"+sitePath+"'");
-        }
-      }
-      else
-      {
-        Logging.connectors.warn("SharePoint: Unexpected relPath structure; path is '"+relPath+"', but expected to see something beginning with '"+rootPath+"'");
-      }
-    }
-
-  }
-  
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SharePointRepository.Server"));
-    tabsArray.add(Messages.getString(locale,"SharePointRepository.AuthorityType"));
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration.js",null);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TabName",tabName);
-    fillInServerTab(velocityContext,out,parameters);
-    fillInAuthorityTypeTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Server.html",velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_AuthorityType.html",velocityContext);
-  }
-  
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String serverVersion = variableContext.getParameter("serverVersion");
-    if (serverVersion != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERVERSION,serverVersion);
-
-    String serverProtocol = variableContext.getParameter("serverProtocol");
-    if (serverProtocol != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERPROTOCOL,serverProtocol);
-
-    String serverName = variableContext.getParameter("serverName");
-
-    if (serverName != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERNAME,serverName);
-
-    String serverPort = variableContext.getParameter("serverPort");
-    if (serverPort != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERPORT,serverPort);
-
-    String serverLocation = variableContext.getParameter("serverLocation");
-    if (serverLocation != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERLOCATION,serverLocation);
-
-    String userName = variableContext.getParameter("serverUserName");
-    if (userName != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERUSERNAME,userName);
-
-    String password = variableContext.getParameter("serverPassword");
-    if (password != null)
-      parameters.setObfuscatedParameter(SharePointConfig.PARAM_SERVERPASSWORD,variableContext.mapKeyToPassword(password));
-
-    String proxyHost = variableContext.getParameter("proxyhost");
-    if (proxyHost != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYHOST,proxyHost);
-    
-    String proxyPort = variableContext.getParameter("proxyport");
-    if (proxyPort != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYPORT,proxyPort);
-    
-    String proxyUser = variableContext.getParameter("proxyuser");
-    if (proxyUser != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYUSER,proxyUser);
-    
-    String proxyPassword = variableContext.getParameter("proxypassword");
-    if (proxyPassword != null)
-      parameters.setObfuscatedParameter(SharePointConfig.PARAM_PROXYPASSWORD,variableContext.mapKeyToPassword(proxyPassword));
-    
-    String proxyDomain = variableContext.getParameter("proxydomain");
-    if (proxyDomain != null)
-      parameters.setParameter(SharePointConfig.PARAM_PROXYDOMAIN,proxyDomain);
-
-    String keystoreValue = variableContext.getParameter("keystoredata");
-    if (keystoreValue != null)
-      parameters.setParameter(SharePointConfig.PARAM_SERVERKEYSTORE,keystoreValue);
-
-    String configOp = variableContext.getParameter("configop");
-    if (configOp != null)
-    {
-      if (configOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("shpkeystorealias");
-        keystoreValue = parameters.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        parameters.setParameter(SharePointConfig.PARAM_SERVERKEYSTORE,mgr.getString());
-      }
-      else if (configOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("shpcertificate");
-        keystoreValue = parameters.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-        IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Don't report anything
-          }
-        }
-
-        if (certError != null)
-        {
-          // Redirect to error page
-          return "Illegal certificate: "+certError;
-        }
-        parameters.setParameter(SharePointConfig.PARAM_SERVERKEYSTORE,mgr.getString());
-      }
-    }
-    
-    String authorityType = variableContext.getParameter("authorityType");
-    if (authorityType != null)
-      parameters.setParameter(SharePointConfig.PARAM_AUTHORITYTYPE,authorityType);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    fillInServerTab(velocityContext,out,parameters);
-    fillInAuthorityTypeTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,"viewConfiguration.html",velocityContext);
-  }
-
-  protected static void fillInAuthorityTypeTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    // Default to Active Directory, for backwards compatibility
-    String authorityType = parameters.getParameter(SharePointConfig.PARAM_AUTHORITYTYPE);
-    if (authorityType == null)
-      authorityType = "ActiveDirectory";
-    velocityContext.put("AUTHORITYTYPE", authorityType);
-  }
-  
-  protected static void fillInServerTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String serverVersion = parameters.getParameter(SharePointConfig.PARAM_SERVERVERSION);
-    if (serverVersion == null)
-      serverVersion = "4.0";
-
-    String serverProtocol = parameters.getParameter(SharePointConfig.PARAM_SERVERPROTOCOL);
-    if (serverProtocol == null)
-      serverProtocol = "http";
-
-    String serverName = parameters.getParameter(SharePointConfig.PARAM_SERVERNAME);
-    if (serverName == null)
-      serverName = "localhost";
-
-    String serverPort = parameters.getParameter(SharePointConfig.PARAM_SERVERPORT);
-    if (serverPort == null)
-      serverPort = "";
-
-    String serverLocation = parameters.getParameter(SharePointConfig.PARAM_SERVERLOCATION);
-    if (serverLocation == null)
-      serverLocation = "";
-      
-    String userName = parameters.getParameter(SharePointConfig.PARAM_SERVERUSERNAME);
-    if (userName == null)
-      userName = "";
-
-    String password = parameters.getObfuscatedParameter(SharePointConfig.PARAM_SERVERPASSWORD);
-    if (password == null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-
-    String keystore = parameters.getParameter(SharePointConfig.PARAM_SERVERKEYSTORE);
-    IKeystoreManager localKeystore;
-    if (keystore == null)
-      localKeystore = KeystoreManagerFactory.make("");
-    else
-      localKeystore = KeystoreManagerFactory.make("",keystore);
-
-    List<Map<String,String>> certificates = new ArrayList<Map<String,String>>();
-    
-    String[] contents = localKeystore.getContents();
-    for (String alias : contents)
-    {
-      String description = localKeystore.getDescription(alias);
-      if (description.length() > 128)
-        description = description.substring(0,125) + "...";
-      Map<String,String> certificate = new HashMap<String,String>();
-      certificate.put("ALIAS", alias);
-      certificate.put("DESCRIPTION", description);
-      certificates.add(certificate);
-    }
-    
-    String proxyHost = parameters.getParameter(SharePointConfig.PARAM_PROXYHOST);
-    if (proxyHost == null)
-      proxyHost = "";
-    
-    String proxyPort = parameters.getParameter(SharePointConfig.PARAM_PROXYPORT);
-    if (proxyPort == null)
-      proxyPort = "";
-    
-    String proxyUser = parameters.getParameter(SharePointConfig.PARAM_PROXYUSER);
-    if (proxyUser == null)
-      proxyUser = "";
-    
-    String proxyPassword = parameters.getObfuscatedParameter(SharePointConfig.PARAM_PROXYPASSWORD);
-    if (proxyPassword == null)
-      proxyPassword = "";
-    else
-      proxyPassword = out.mapPasswordToKey(proxyPassword);
-
-    String proxyDomain = parameters.getParameter(SharePointConfig.PARAM_PROXYDOMAIN);
-    if (proxyDomain == null)
-      proxyDomain = "";
-
-    // Fill in context
-    velocityContext.put("SERVERVERSION", serverVersion);
-    velocityContext.put("SERVERPROTOCOL", serverProtocol);
-    velocityContext.put("SERVERNAME", serverName);
-    velocityContext.put("SERVERPORT", serverPort);
-    velocityContext.put("SERVERLOCATION", serverLocation);
-    velocityContext.put("SERVERUSERNAME", userName);
-    velocityContext.put("SERVERPASSWORD", password);
-    if (keystore != null)
-      velocityContext.put("KEYSTORE", keystore);
-    velocityContext.put("CERTIFICATELIST", certificates);
-    
-    velocityContext.put("PROXYHOST", proxyHost);
-    velocityContext.put("PROXYPORT", proxyPort);
-    velocityContext.put("PROXYUSER", proxyUser);
-    velocityContext.put("PROXYPASSWORD", proxyPassword);
-    velocityContext.put("PROXYDOMAIN", proxyDomain);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SharePointRepository.Paths"));
-    tabsArray.add(Messages.getString(locale,"SharePointRepository.Security"));
-    tabsArray.add(Messages.getString(locale,"SharePointRepository.Metadata"));
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification.js",velocityContext);
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TabName",tabName);
-    velocityContext.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    velocityContext.put("SelectedNum", Integer.toString(actualSequenceNumber));
-
-    fillInSecurityTab(velocityContext,out,ds);
-    fillInPathsTab(velocityContext,out,ds);
-    fillInMetadataTab(velocityContext,out,ds);
-    
-    // Now, do the part of the tabs that requires context logic
-    if (tabName.equals(Messages.getString(locale,"SharePointRepository.Paths")))
-      fillInTransientPathsInfo(velocityContext,connectionSequenceNumber);
-    else if (tabName.equals(Messages.getString(locale,"SharePointRepository.Metadata")))
-      fillInTransientMetadataInfo(velocityContext,connectionSequenceNumber);
-    
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Security.html",velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Paths.html",velocityContext);
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Metadata.html",velocityContext);
-  }
-  
-  /** Fill in metadata tab */
-  protected static void fillInMetadataTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    // Find the path-value metadata attribute name
-    String pathNameAttribute = "";
-    MatchMap matchMap = new MatchMap();
-    List<Map<String,Object>> metadataRules = new ArrayList<Map<String,Object>>();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("pathnameattribute"))
-      {
-        pathNameAttribute = sn.getAttributeValue("value");
-      }
-      else if (sn.getType().equals("pathmap"))
-      {
-        String pathMatch = sn.getAttributeValue("match");
-        String pathReplace = sn.getAttributeValue("replace");
-        matchMap.appendMatchPair(pathMatch,pathReplace);
-      }
-      else if (sn.getType().equals("startpoint"))
-      {
-        String site = sn.getAttributeValue("site");
-        String lib = sn.getAttributeValue("lib");
-        String path = site + "/" + lib + "/*";
-        String allmetadata = sn.getAttributeValue("allmetadata");
-        StringBuilder metadataFieldList = new StringBuilder();
-        List<String> metadataFieldArray = new ArrayList<String>();
-        if (allmetadata == null || !allmetadata.equals("true"))
-        {
-          for (int j = 0; j < sn.getChildCount(); j++)
-          {
-            SpecificationNode node = sn.getChild(j);
-            if (node.getType().equals("metafield"))
-            {
-              if (metadataFieldList.length() > 0)
-                metadataFieldList.append(", ");
-              String val = node.getAttributeValue("value");
-              metadataFieldList.append(val);
-              metadataFieldArray.add(val);
-            }
-          }
-          allmetadata = "false";
-        }
-          
-        if (allmetadata.equals("true") || metadataFieldList.length() > 0)
-        {
-          Map<String,Object> item = new HashMap<String,Object>();
-          item.put("THEPATH",path);
-          item.put("THEACTION","include");
-          item.put("ALLFLAG",allmetadata);
-          item.put("FIELDLIST",metadataFieldArray);
-          item.put("FIELDS",metadataFieldList.toString());
-          metadataRules.add(item);
-        }
-      }
-      else if (sn.getType().equals("metadatarule"))
-      {
-        String path = sn.getAttributeValue("match");
-        String action = sn.getAttributeValue("action");
-        String allmetadata = sn.getAttributeValue("allmetadata");
-        StringBuilder metadataFieldList = new StringBuilder();
-        List<String> metadataFieldArray = new ArrayList<String>();
-        if (action.equals("include"))
-        {
-          if (allmetadata == null || !allmetadata.equals("true"))
-          {
-            for (int j = 0; j < sn.getChildCount(); j++)
-            {
-              SpecificationNode node = sn.getChild(j);
-              if (node.getType().equals("metafield"))
-              {
-                String val = node.getAttributeValue("value");
-                if (metadataFieldList.length() > 0)
-                  metadataFieldList.append(", ");
-                metadataFieldList.append(val);
-                metadataFieldArray.add(val);
-              }
-            }
-            allmetadata="false";
-          }
-        }
-        else
-          allmetadata = "";
-        
-        Map<String,Object> item = new HashMap<String,Object>();
-        item.put("THEPATH",path);
-        item.put("THEACTION",action);
-        item.put("ALLFLAG",allmetadata);
-        item.put("FIELDLIST",metadataFieldArray);
-        item.put("FIELDS",metadataFieldList.toString());
-        metadataRules.add(item);
-      }
-    }
-    
-    List<Map<String,String>> mapList = new ArrayList<Map<String,String>>();
-    for (int i = 0; i < matchMap.getMatchCount(); i++)
-    {
-      String matchString = matchMap.getMatchString(i);
-      String replaceString = matchMap.getReplaceString(i);
-
-      Map<String,String> item = new HashMap<String,String>();
-      item.put("MATCH",matchString);
-      item.put("REPLACE",replaceString);
-      mapList.add(item);
-    }
-    
-    velocityContext.put("PATHNAMEATTRIBUTE",pathNameAttribute);
-    velocityContext.put("MAPLIST",mapList);
-    velocityContext.put("METADATARULES",metadataRules);
-  }
-  
-  /** Fill in transient metadata info */
-  protected void fillInTransientMetadataInfo(Map<String,Object> velocityContext, int connectionSequenceNumber)
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // The following variables may be in the thread context because postspec.jsp put them there:
-    // (1) "metapath", which contains the rule path as it currently stands;
-    // (2) "metapathstate", which describes what the current path represents.  Values are "unknown", "site", "library".
-    // (3) "metapathlibrary" is the library or list path (if this is known yet).
-    // Once the widget is in the state "unknown", it can only be reset, and cannot be further modified
-    String metaPathSoFar = (String)currentContext.get(seqPrefix+"metapath");
-    String metaPathState = (String)currentContext.get(seqPrefix+"metapathstate");
-    String metaPathLibrary = (String)currentContext.get(seqPrefix+"metapathlibrary");
-    if (metaPathState == null)
-      metaPathState = "unknown";
-    if (metaPathSoFar == null)
-    {
-      metaPathSoFar = "/";
-      metaPathState = "site";
-    }
-
-    String message = null;
-    List<NameValue> fieldList = null;
-    if (metaPathLibrary != null)
-    {
-      // Look up metadata fields
-      int index = metaPathLibrary.lastIndexOf("/");
-      String site = metaPathLibrary.substring(0,index);
-      String libOrList = metaPathLibrary.substring(index+1);
-      Map<String,String> metaFieldList = null;
-      try
-      {
-        if (metaPathState.equals("library") || metaPathState.equals("file"))
-          metaFieldList = getLibFieldList(site,libOrList);
-        else if (metaPathState.equals("list"))
-          metaFieldList = getListFieldList(site,libOrList);
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        message = e.getMessage();
-      }
-      catch (ServiceInterruption e)
-      {
-        message = "SharePoint unavailable: "+e.getMessage();
-      }
-      if (metaFieldList != null)
-      {
-        String[] fields = new String[metaFieldList.size()];
-        int j = 0;
-        Iterator<String> iter = metaFieldList.keySet().iterator();
-        while (iter.hasNext())
-        {
-          fields[j++] = iter.next();
-        }
-        java.util.Arrays.sort(fields);
-        fieldList = new ArrayList<NameValue>();
-        for (String field : fields)
-        {
-          fieldList.add(new NameValue(field,metaFieldList.get(field)));
-        }
-      }
-    }
-      
-    // Grab next site list and lib list
-    List<NameValue> childSiteList = null;
-    List<NameValue> childLibList = null;
-    List<NameValue> childListList = null;
-
-    if (message == null && metaPathState.equals("site"))
-    {
-      try
-      {
-        String queryPath = metaPathSoFar;
-        if (queryPath.equals("/"))
-          queryPath = "";
-        childSiteList = getSites(queryPath);
-        if (childSiteList == null)
-        {
-          if (queryPath.length() == 0)
-            throw new ManifoldCFException("Root site is unreachable, or user has no permissions");
-          // Illegal path - state becomes "unknown".
-          metaPathState = "unknown";
-          metaPathLibrary = null;
-        }
-        childLibList = getDocLibsBySite(queryPath);
-        if (childLibList == null)
-        {
-          // Illegal path - state becomes "unknown"
-          if (queryPath.length() == 0)
-            throw new ManifoldCFException("Root site is unreachable, or user has no permissions");
-          metaPathState = "unknown";
-          metaPathLibrary = null;
-        }
-        childListList = getListsBySite(queryPath);
-        if (childListList == null)
-        {
-          // Illegal path - state becomes "unknown"
-          if (queryPath.length() == 0)
-            throw new ManifoldCFException("Root site is unreachable, or user has no permissions");
-          metaPathState = "unknown";
-          metaPathLibrary = null;
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        Logging.connectors.warn(e.getMessage(),e);
-        message = e.getMessage();
-      }
-      catch (ServiceInterruption e)
-      {
-        message = "SharePoint unavailable: "+e.getMessage();
-      }
-    }
-    
-    if (metaPathSoFar != null)
-      velocityContext.put("METAPATHSOFAR",metaPathSoFar);
-    if (metaPathState != null)
-      velocityContext.put("METAPATHSTATE",metaPathState);
-    if (metaPathLibrary != null)
-      velocityContext.put("METAPATHLIBRARY",metaPathLibrary);
-    if (message != null)
-      velocityContext.put("METAMESSAGE",message);
-    if (fieldList != null)
-      velocityContext.put("METAFIELDLIST",fieldList);
-    if (childSiteList != null)
-      velocityContext.put("METACHILDSITELIST",childSiteList);
-    if (childLibList != null)
-      velocityContext.put("METACHILDLIBLIST",childLibList);
-    if (childListList != null)
-      velocityContext.put("METACHILDLISTLIST",childListList);
-  }
-  
-  /** Fill in paths tab */
-  protected static void fillInPathsTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    List<Map<String,String>> rules = new ArrayList<Map<String,String>>();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("startpoint"))
-      {
-        String site = sn.getAttributeValue("site");
-        String lib = sn.getAttributeValue("lib");
-        String siteLib = site + "/" + lib + "/";
-
-        // Go through all the file/folder rules for the startpoint, and generate new "rules" corresponding to each.
-        for (int j = 0; j < sn.getChildCount(); j++)
-        {
-          SpecificationNode node = sn.getChild(j);
-          if (node.getType().equals("include") || node.getType().equals("exclude"))
-          {
-            String matchPart = node.getAttributeValue("match");
-            String ruleType = node.getAttributeValue("type");
-            String theFlavor = node.getType();
-            String thePath = siteLib + matchPart;
-            
-            Map<String,String> item = new HashMap<String,String>();
-            item.put("THEPATH",thePath);
-            item.put("THETYPE","file");
-            item.put("THEACTION",theFlavor);
-            rules.add(item);
-            
-            if (ruleType.equals("file") && !matchPart.startsWith("*"))
-            {
-              thePath = siteLib + "*/" + matchPart;
-              item = new HashMap<String,String>();
-              item.put("THEPATH",thePath);
-              item.put("THETYPE","file");
-              item.put("THEACTION",theFlavor);
-              rules.add(item);
-            }
-          }
-        }
-      }
-      else if (sn.getType().equals("pathrule"))
-      {
-        String match = sn.getAttributeValue("match");
-        String type = sn.getAttributeValue("type");
-        String action = sn.getAttributeValue("action");
-        
-        Map<String,String> item = new HashMap<String,String>();
-        item.put("THEPATH",match);
-        item.put("THETYPE",type);
-        item.put("THEACTION",action);
-        rules.add(item);
-        
-      }
-    }
-    
-    velocityContext.put("RULES",rules);
-  }
-  
-  /** Fill in the transient portion of the Paths tab */
-  protected void fillInTransientPathsInfo(Map<String,Object> velocityContext, int connectionSequenceNumber)
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // The following variables may be in the thread context because postspec.jsp put them there:
-    // (1) "specpath", which contains the rule path as it currently stands;
-    // (2) "specpathstate", which describes what the current path represents.  Values are "unknown", "site", "library", "list".
-    // Once the widget is in the state "unknown", it can only be reset, and cannot be further modified
-    // specsitepath may be in the thread context, put there by postspec.jsp 
-    String pathSoFar = (String)currentContext.get(seqPrefix+"specpath");
-    String pathState = (String)currentContext.get(seqPrefix+"specpathstate");
-    String pathLibrary = (String)currentContext.get(seqPrefix+"specpathlibrary");
-    if (pathState == null)
-    {
-      pathState = "unknown";
-      pathLibrary = null;
-    }
-    if (pathSoFar == null)
-    {
-      pathSoFar = "/";
-      pathState = "site";
-      pathLibrary = null;
-    }
-
-    // Grab next site list and lib list
-    List<NameValue> childSiteList = null;
-    List<NameValue> childLibList = null;
-    List<NameValue> childListList = null;
-    String message = null;
-    if (pathState.equals("site"))
-    {
-      try
-      {
-        String queryPath = pathSoFar;
-        if (queryPath.equals("/"))
-          queryPath = "";
-        childSiteList = getSites(queryPath);
-        if (childSiteList == null)
-        {
-          // Illegal path - state becomes "unknown".
-          if (queryPath.length() == 0)
-            throw new ManifoldCFException("Root site is unreachable, or user has no permissions");
-          pathState = "unknown";
-          pathLibrary = null;
-        }
-        childLibList = getDocLibsBySite(queryPath);
-        if (childLibList == null)
-        {
-          // Illegal path - state becomes "unknown"
-          if (queryPath.length() == 0)
-            throw new ManifoldCFException("Root site is unreachable, or user has no permissions");
-          pathState = "unknown";
-          pathLibrary = null;
-        }
-        childListList = getListsBySite(queryPath);
-        if (childListList == null)
-        {
-          // Illegal path - state becomes "unknown"
-          if (queryPath.length() == 0)
-            throw new ManifoldCFException("Root site is unreachable, or user has no permissions");
-          pathState = "unknown";
-          pathLibrary = null;
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        Logging.connectors.warn(e.getMessage(),e);
-        message = e.getMessage();
-      }
-      catch (ServiceInterruption e)
-      {
-        message = "SharePoint unavailable: "+e.getMessage();
-      }
-    }
-      
-    if (pathSoFar != null)
-      velocityContext.put("PATHSOFAR",pathSoFar);
-    if (pathState != null)
-      velocityContext.put("PATHSTATE",pathState);
-    if (pathLibrary != null)
-      velocityContext.put("PATHLIBRARY",pathLibrary);
-    if (message != null)
-      velocityContext.put("MESSAGE",message);
-    if (childSiteList != null)
-      velocityContext.put("CHILDSITELIST",childSiteList);
-    if (childLibList != null)
-      velocityContext.put("CHILDLIBLIST",childLibList);
-    if (childListList != null)
-      velocityContext.put("CHILDLISTLIST",childListList);
-  }
-  
-  /** Fill in security tab */
-  protected static void fillInSecurityTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-    // Security tab
-    String security = "on";
-    List<String> accessTokens = new ArrayList<String>();
-    for (int i = 0; i < ds.getChildCount(); i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals("security"))
-      {
-        security = sn.getAttributeValue("value");
-      }
-      else if (sn.getType().equals("access"))
-      {
-        String token = sn.getAttributeValue("token");
-        accessTokens.add(token);
-      }
-    }
-
-    velocityContext.put("SECURITY",security);
-    velocityContext.put("ACCESSTOKENS",accessTokens);
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Remove old-style rules, but only if the information would not be lost
-    if (variableContext.getParameter(seqPrefix+"specpathcount") != null && variableContext.getParameter(seqPrefix+"metapathcount") != null)
-    {
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("startpoint"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-    }
-    
-    String x = variableContext.getParameter(seqPrefix+"specpathcount");
-    if (x != null)
-    {
-      // Delete all path rule entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathrule"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(x);
-      // Gather up these
-      i = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specop"+pathDescription;
-        x = variableContext.getParameter(pathOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        
-        // Get the stored information for this rule.
-        String path = variableContext.getParameter(seqPrefix+"specpath"+pathDescription);
-        String type = variableContext.getParameter(seqPrefix+"spectype"+pathDescription);
-        String action = variableContext.getParameter(seqPrefix+"specflav"+pathDescription);
-        
-        SpecificationNode node = new SpecificationNode("pathrule");
-        node.setAttribute("match",path);
-        node.setAttribute("action",action);
-        node.setAttribute("type",type);
-        
-        // If there was an insert operation, do it now
-        if (x != null && x.equals("Insert Here"))
-        {
-          // The global parameters are what are used to create the rule
-          path = variableContext.getParameter(seqPrefix+"specpath");
-          type = variableContext.getParameter(seqPrefix+"spectype");
-          action = variableContext.getParameter(seqPrefix+"specflavor");
-          
-          SpecificationNode sn = new SpecificationNode("pathrule");
-          sn.setAttribute("match",path);
-          sn.setAttribute("action",action);
-          sn.setAttribute("type",type);
-          ds.addChild(ds.getChildCount(),sn);
-        }
-        
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      // See if there's a global path rule operation
-      String op = variableContext.getParameter(seqPrefix+"specop");
-      if (op != null)
-      {
-        if (op.equals("Add"))
-        {
-          String match = variableContext.getParameter(seqPrefix+"specpath");
-          String action = variableContext.getParameter(seqPrefix+"specflavor");
-          String type = variableContext.getParameter(seqPrefix+"spectype");
-          SpecificationNode node = new SpecificationNode("pathrule");
-          node.setAttribute("match",match);
-          node.setAttribute("action",action);
-          node.setAttribute("type",type);
-          ds.addChild(ds.getChildCount(),node);
-        }
-      }
-
-      // See if there's a global pathbuilder operation
-      String pathop = variableContext.getParameter(seqPrefix+"specpathop");
-      if (pathop != null)
-      {
-        if (pathop.equals("Reset"))
-        {
-          currentContext.save(seqPrefix+"specpath","/");
-          currentContext.save(seqPrefix+"specpathstate","site");
-          currentContext.save(seqPrefix+"specpathlibrary",null);
-        }
-        else if (pathop.equals("AppendSite"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"specpath");
-          String addon = variableContext.getParameter(seqPrefix+"specsite");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-          }
-          currentContext.save(seqPrefix+"specpath",path);
-          currentContext.save(seqPrefix+"specpathstate","site");
-          currentContext.save(seqPrefix+"specpathlibrary",null);
-        }
-        else if (pathop.equals("AppendLibrary"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"specpath");
-          String addon = variableContext.getParameter(seqPrefix+"speclibrary");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-            currentContext.save(seqPrefix+"specpathstate","library");
-            currentContext.save(seqPrefix+"specpathlibrary",path);
-          }
-          currentContext.save(seqPrefix+"specpath",path);
-        }
-        else if (pathop.equals("AppendList"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"specpath");
-          String addon = variableContext.getParameter(seqPrefix+"speclist");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-            currentContext.save(seqPrefix+"specpathstate","list");
-            currentContext.save(seqPrefix+"specpathlibrary",path);
-          }
-          currentContext.save(seqPrefix+"specpath",path);
-        }
-        else if (pathop.equals("AppendText"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"specpath");
-          String library = variableContext.getParameter(seqPrefix+"specpathlibrary");
-          String addon = variableContext.getParameter(seqPrefix+"specmatch");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-            currentContext.save(seqPrefix+"specpathstate","unknown");
-          }
-          currentContext.save(seqPrefix+"specpath",path);
-          currentContext.save(seqPrefix+"specpathlibrary",library);
-        }
-        else if (pathop.equals("Remove"))
-        {
-          // Strip off end
-          String path = variableContext.getParameter(seqPrefix+"specpath");
-          int index = path.lastIndexOf("/");
-          path = path.substring(0,index);
-          if (path.length() == 0)
-            path = "/";
-          currentContext.save(seqPrefix+"specpath",path);
-          // Now, adjust state.
-          String pathState = variableContext.getParameter(seqPrefix+"specpathstate");
-          if (pathState.equals("library") || pathState.equals("list"))
-            pathState = "site";
-          currentContext.save(seqPrefix+"specpathstate",pathState);
-        }
-      }
-
-    }
-    
-    x = variableContext.getParameter(seqPrefix+"metapathcount");
-    if (x != null)
-    {
-      // Delete all metadata rule entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("metadatarule"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Find out how many children were sent
-      int pathCount = Integer.parseInt(x);
-      // Gather up these
-      i = 0;
-      while (i < pathCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"metaop"+pathDescription;
-        x = variableContext.getParameter(pathOpName);
-        if (x != null && x.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-
-        // Get the stored information for this rule.
-        String path = variableContext.getParameter(seqPrefix+"metapath"+pathDescription);
-        String action = variableContext.getParameter(seqPrefix+"metaflav"+pathDescription);
-        String allmetadata =  variableContext.getParameter(seqPrefix+"metaall"+pathDescription);
-        String[] metadataFields = variableContext.getParameterValues(seqPrefix+"metafields"+pathDescription);
-        
-        SpecificationNode node = new SpecificationNode("metadatarule");
-        node.setAttribute("match",path);
-        node.setAttribute("action",action);
-        if (action.equals("include"))
-        {
-          if (allmetadata != null)
-            node.setAttribute("allmetadata",allmetadata);
-          if (metadataFields != null)
-          {
-            int j = 0;
-            while (j < metadataFields.length)
-            {
-              SpecificationNode sn = new SpecificationNode("metafield");
-              sn.setAttribute("value",metadataFields[j]);
-              node.addChild(j++,sn);
-            }
-          }
-        }
-        
-        if (x != null && x.equals("Insert Here"))
-        {
-          // Insert the new global rule information now
-          path = variableContext.getParameter(seqPrefix+"metapath");
-          action = variableContext.getParameter(seqPrefix+"metaflavor");
-          allmetadata =  variableContext.getParameter(seqPrefix+"metaall");
-          metadataFields = variableContext.getParameterValues(seqPrefix+"metafields");
-        
-          SpecificationNode sn = new SpecificationNode("metadatarule");
-          sn.setAttribute("match",path);
-          sn.setAttribute("action",action);
-          if (action.equals("include"))
-          {
-            if (allmetadata != null)
-              node.setAttribute("allmetadata",allmetadata);
-            if (metadataFields != null)
-            {
-              int j = 0;
-              while (j < metadataFields.length)
-              {
-                SpecificationNode node2 = new SpecificationNode("metafield");
-                node2.setAttribute("value",metadataFields[j]);
-                sn.addChild(j++,node2);
-              }
-            }
-          }
-
-          ds.addChild(ds.getChildCount(),sn);
-        }
-        
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-      
-      // See if there's a global path rule operation
-      String op = variableContext.getParameter(seqPrefix+"metaop");
-      if (op != null)
-      {
-        if (op.equals("Add"))
-        {
-          String match = variableContext.getParameter(seqPrefix+"metapath");
-          String action = variableContext.getParameter(seqPrefix+"metaflavor");
-          SpecificationNode node = new SpecificationNode("metadatarule");
-          node.setAttribute("match",match);
-          node.setAttribute("action",action);
-          if (action.equals("include"))
-          {
-            String allmetadata = variableContext.getParameter(seqPrefix+"metaall");
-            String[] metadataFields = variableContext.getParameterValues(seqPrefix+"metafields");
-            if (allmetadata != null)
-              node.setAttribute("allmetadata",allmetadata);
-            if (metadataFields != null)
-            {
-              int j = 0;
-              while (j < metadataFields.length)
-              {
-                SpecificationNode sn = new SpecificationNode("metafield");
-                sn.setAttribute("value",metadataFields[j]);
-                node.addChild(j++,sn);
-              }
-            }
-
-          }
-          ds.addChild(ds.getChildCount(),node);
-        }
-      }
-
-      // See if there's a global pathbuilder operation
-      String pathop = variableContext.getParameter(seqPrefix+"metapathop");
-      if (pathop != null)
-      {
-        if (pathop.equals("Reset"))
-        {
-          currentContext.save(seqPrefix+"metapath","/");
-          currentContext.save(seqPrefix+"metapathstate","site");
-          currentContext.save(seqPrefix+"metapathlibrary",null);
-        }
-        else if (pathop.equals("AppendSite"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"metapath");
-          String addon = variableContext.getParameter(seqPrefix+"metasite");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-          }
-          currentContext.save(seqPrefix+"metapath",path);
-          currentContext.save(seqPrefix+"metapathstate","site");
-          currentContext.save(seqPrefix+"metapathlibrary",null);
-        }
-        else if (pathop.equals("AppendLibrary"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"metapath");
-          String addon = variableContext.getParameter(seqPrefix+"metalibrary");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-            currentContext.save(seqPrefix+"metapathstate","library");
-            currentContext.save(seqPrefix+"metapathlibrary",path);
-          }
-          currentContext.save(seqPrefix+"metapath",path);
-        }
-        else if (pathop.equals("AppendList"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"metapath");
-          String addon = variableContext.getParameter(seqPrefix+"metalist");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-            currentContext.save(seqPrefix+"metapathstate","list");
-            currentContext.save(seqPrefix+"metapathlibrary",path);
-            // Automatically add on wildcard for list item part of the match
-            path += "/*";
-          }
-          currentContext.save(seqPrefix+"metapath",path);
-        }
-        else if (pathop.equals("AppendText"))
-        {
-          String path = variableContext.getParameter(seqPrefix+"metapath");
-          String library = variableContext.getParameter(seqPrefix+"metapathlibrary");
-          String addon = variableContext.getParameter(seqPrefix+"metamatch");
-          if (addon != null && addon.length() > 0)
-          {
-            if (path.equals("/"))
-              path = path + addon;
-            else
-              path = path + "/" + addon;
-            if (library != null)
-              currentContext.save(seqPrefix+"metapathstate","file");
-            else
-              currentContext.save(seqPrefix+"metapathstate","unknown");
-          }
-          currentContext.save(seqPrefix+"metapath",path);
-          currentContext.save(seqPrefix+"metapathlibrary",library);
-        }
-        else if (pathop.equals("Remove"))
-        {
-          String pathState = variableContext.getParameter(seqPrefix+"metapathstate");
-          String path;
-          if (pathState.equals("file"))
-          {
-            pathState = "library";
-            path = variableContext.getParameter(seqPrefix+"metapathlibrary");
-          }
-          else if (pathState.equals("list") || pathState.equals("library"))
-          {
-            pathState = "site";
-            path = variableContext.getParameter(seqPrefix+"metapathlibrary");
-            int index = path.lastIndexOf("/");
-            path = path.substring(0,index);
-            if (path.length() == 0)
-              path = "/";
-            currentContext.save(seqPrefix+"metapathlibrary",null);
-          }
-          else
-          {
-            path = variableContext.getParameter(seqPrefix+"metapath");
-            int index = path.lastIndexOf("/");
-            path = path.substring(0,index);
-            if (path.length() == 0)
-              path = "/";
-          }
-
-          currentContext.save(seqPrefix+"metapathstate",pathState);
-          currentContext.save(seqPrefix+"metapath",path);
-        }
-      }
-
-      
-    }
-
-    String xc = variableContext.getParameter(seqPrefix+"specsecurity");
-    if (xc != null)
-    {
-      // Delete all security entries first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("security"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode node = new SpecificationNode("security");
-      node.setAttribute("value",xc);
-      ds.addChild(ds.getChildCount(),node);
-
-    }
-   
-    xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null)
-    {
-      // Delete all file specs first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token",accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specpathnameattribute");
-    if (xc != null)
-    {
-      // Delete old one
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathnameattribute"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      if (xc.length() > 0)
-      {
-        SpecificationNode node = new SpecificationNode("pathnameattribute");
-        node.setAttribute("value",xc);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    xc = variableContext.getParameter(seqPrefix+"specmappingcount");
-    if (xc != null)
-    {
-      // Delete old spec
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("pathmap"))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      // Now, go through the data and assemble a new list.
-      int mappingCount = Integer.parseInt(xc);
-
-      // Gather up these
-      i = 0;
-      while (i < mappingCount)
-      {
-        String pathDescription = "_"+Integer.toString(i);
-        String pathOpName = seqPrefix+"specmappingop"+pathDescription;
-        xc = variableContext.getParameter(pathOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Skip to the next
-          i++;
-          continue;
-        }
-        // Inserts won't happen until the very end
-        String match = variableContext.getParameter(seqPrefix+"specmatch"+pathDescription);
-        String replace = variableContext.getParameter(seqPrefix+"specreplace"+pathDescription);
-        SpecificationNode node = new SpecificationNode("pathmap");
-        node.setAttribute("match",match);
-        node.setAttribute("replace",replace);
-        ds.addChild(ds.getChildCount(),node);
-
-        i++;
-      }
-
-      // Check for add
-      xc = variableContext.getParameter(seqPrefix+"specmappingop");
-      if (xc != null && xc.equals("Add"))
-      {
-        String match = variableContext.getParameter(seqPrefix+"specmatch");
-        String replace = variableContext.getParameter(seqPrefix+"specreplace");
-        SpecificationNode node = new SpecificationNode("pathmap");
-        node.setAttribute("match",match);
-        node.setAttribute("replace",replace);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("SeqNum", Integer.toString(connectionSequenceNumber));
-
-    fillInSecurityTab(velocityContext,out,ds);
-    fillInPathsTab(velocityContext,out,ds);
-    fillInMetadataTab(velocityContext,out,ds);
-    
-    Messages.outputResourceWithVelocity(out,locale,"viewSpecification.html",velocityContext);
-  }
-
-  protected static class ExecuteMethodThread extends Thread
-  {
-    protected final HttpClient httpClient;
-    protected final String url;
-    protected final OutputStream os;
-
-    protected Throwable exception = null;
-    protected int returnCode = 0;
-
-    public ExecuteMethodThread( HttpClient httpClient, String url, OutputStream os )
-    {
-      super();
-      setDaemon(true);
-      this.httpClient = httpClient;
-      this.url = url;
-      this.os = os;
-    }
-
-    public void run()
-    {
-      try
-      {
-        HttpGet method = new HttpGet( url );
-        // Try block to insure that the connection gets cleaned up
-        try
-        {
-          // Begin the fetch
-          HttpResponse response = httpClient.execute(method);
-          returnCode = response.getStatusLine().getStatusCode();
-          
-          if (returnCode == 200)
-          {
-            // Process the data
-            HttpEntity entity = response.getEntity();
-            if (entity != null)
-            {
-              InputStream is = entity.getContent();
-              // Figure out what to do with the data. 
-              byte[] transferBuffer = new byte[65536];
-              while (true)
-              {
-                int amt = is.read(transferBuffer);
-                if (amt == -1)
-                  break;
-                os.write(transferBuffer,0,amt);
-              }
-            }
-          }
-        }
-        finally
-        {
-          // Consumes and closes the stream, releasing the connection
-          method.abort();
-        }
-
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public int finishUp()
-      throws InterruptedException, IOException, org.apache.http.HttpException
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof IOException)
-          throw (IOException)exception;
-        else if (exception instanceof Error)
-          throw (Error)exception;
-        else if (exception instanceof org.apache.http.HttpException)
-          throw (org.apache.http.HttpException)exception;
-        else if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-        else
-          throw new RuntimeException("Unexpected exception type thrown: "+exception.getClass().getName());
-      }
-      return returnCode;
-    }
-  }
-
-
-
-  /**
-  * Gets a list of field names of the given document library or list.
-  * @param parentSite - parent site path
-  * @param docLibrary name
-  * @return list of the fields
-  */
-  public Map<String,String> getLibFieldList( String parentSite, String docLibrary )
-    throws ServiceInterruption, ManifoldCFException
-  {
-    getSession();
-    return proxy.getFieldList( encodePath(parentSite), proxy.getDocLibID( encodePath(parentSite), parentSite, docLibrary ) );
-  }
-
-  /**
-  * Gets a list of field names of the given document library or list.
-  * @param parentSite - parent site path
-  * @param docLibrary name
-  * @return list of the fields
-  */
-  public Map<String,String> getListFieldList( String parentSite, String listName )
-    throws ServiceInterruption, ManifoldCFException
-  {
-    getSession();
-    return proxy.getFieldList( encodePath(parentSite), proxy.getListID( encodePath(parentSite), parentSite, listName ) );
-  }
-
-  /**
-  * Gets a list of sites/subsites of the given parent site
-  * @param parentSite the unencoded parent site path to search for subsites, empty for root.
-  * @return list of the sites
-  */
-  public List<NameValue> getSites( String parentSite )
-    throws ServiceInterruption, ManifoldCFException
-  {
-    getSession();
-    return proxy.getSites( encodePath(parentSite) );
-  }
-
-  /**
-  * Gets a list of document libraries of the given parent site
-  * @param parentSite the unencoded parent site to search for libraries, empty for root.
-  * @return list of the libraries
-  */
-  public List<NameValue> getDocLibsBySite( String parentSite )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    return proxy.getDocumentLibraries( encodePath(parentSite), parentSite );
-  }
-
-  /**
-  * Gets a list of lists of the given parent site
-  * @param parentSite the unencoded parent site to search for lists, empty for root.
-  * @return list of the lists
-  */
-  public List<NameValue> getListsBySite( String parentSite )
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    return proxy.getLists( encodePath(parentSite), parentSite );
-  }
-
-  // Protected static methods
-
-  /** Check if a library should be included, given a document specification.
-  *@param libraryPath is the unencoded canonical library name (including site path from root site), without any starting slash.
-  *@param documentSpecification is the specification.
-  *@return true if it should be included.
-  */
-  protected boolean checkIncludeLibrary( String libraryPath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Checking whether to include library '" + libraryPath + "'" );
-
-    // Scan the specification, looking for the old-style "startpoint" matches and the new-style "libraryrule" matches.
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i++);
-      if ( sn.getType().equals("startpoint") )
-      {
-        // Old style rule!
-
-        String site = sn.getAttributeValue( "site" );
-        String lib = sn.getAttributeValue( "lib" );
-        // Both site and lib are unencoded.  See if they match the library path
-        String pathStart = site + "/" + lib;
-
-        // Old-style matches have a preceding "/" when there's no subsite...
-        if (libraryPath.equals(pathStart))
-        {
-          // Hey, the startpoint rule matches!  It's an implicit inclusion, so we don't need to do anything else except return.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Library path '"+libraryPath+"' matched old-style startpoint with site '"+site+"' and library '"+lib+"' - including");
-          return true;
-        }
-      }
-      else if (sn.getType().equals("pathrule"))
-      {
-        // New-style rule.
-        // Here's the trick: We do what the first matching rule tells us to do.
-        String pathMatch = sn.getAttributeValue("match");
-        String action = sn.getAttributeValue("action");
-        String ruleType = sn.getAttributeValue("type");
-
-        // First, find out if we match EXACTLY.
-        if (checkMatch(libraryPath,0,pathMatch))
-        {
-          // If this is true, the type also has to match if the rule is to apply.
-          if (ruleType.equals("library"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Library '"+libraryPath+"' exactly matched rule path '"+pathMatch+"'");
-            if (action.equals("include"))
-            {
-              // For include rules, partial match is good enough to proceed.
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Including library '"+libraryPath+"'");
-              return true;
-            }
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Excluding library '"+libraryPath+"'");
-            return false;
-          }
-        }
-        else if (ruleType.equals("file") && checkPartialPathMatch(libraryPath,0,pathMatch,1) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Library '"+libraryPath+"' partially matched file rule path '"+pathMatch+"' - including");
-          return true;
-        }
-        else if (ruleType.equals("folder") && checkPartialPathMatch(libraryPath,0,pathMatch,1) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Library '"+libraryPath+"' partially matched folder rule path '"+pathMatch+"' - including");
-          return true;
-        }
-      }
-    }
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: Not including library '"+libraryPath+"' because no matching rule");
-    return false;
-  }
-
-  /** Check if a list should be included, given a document specification.
-  *@param listPath is the unencoded canonical list name (including site path from root site), without any starting slash.
-  *@param documentSpecification is the specification.
-  *@return true if it should be included.
-  */
-  protected boolean checkIncludeList( String listPath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Checking whether to include list '" + listPath + "'" );
-
-    // Scan the specification, looking for new-style "pathrule" matches.
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i++);
-      if (sn.getType().equals("pathrule"))
-      {
-        // New-style rule.
-        // Here's the trick: We do what the first matching rule tells us to do.
-        String pathMatch = sn.getAttributeValue("match");
-        String action = sn.getAttributeValue("action");
-        String ruleType = sn.getAttributeValue("type");
-
-        // First, find out if we match EXACTLY.
-        if (checkMatch(listPath,0,pathMatch))
-        {
-          // If this is true, the type also has to match if the rule is to apply.
-          if (ruleType.equals("list"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: List '"+listPath+"' exactly matched rule path '"+pathMatch+"'");
-            if (action.equals("include"))
-            {
-              // For include rules, partial match is good enough to proceed.
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Including list '"+listPath+"'");
-              return true;
-            }
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Excluding list '"+listPath+"'");
-            return false;
-          }
-        }
-      }
-    }
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: Not including list '"+listPath+"' because no matching rule");
-    return false;
-  }
-
-  /** Check if a site should be included, given a document specification.
-  *@param sitePath is the unencoded canonical site path name from the root site level, without any starting slash.
-  *@param documentSpecification is the specification.
-  *@return true if it should be included.
-  */
-  protected boolean checkIncludeSite( String sitePath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Checking whether to include site '" + sitePath + "'" );
-
-    // Scan the specification, looking for the old-style "startpoint" matches and the new-style "libraryrule" matches.
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i++);
-      if ( sn.getType().equals("startpoint") )
-      {
-        // Old style rule!
-
-        String site = sn.getAttributeValue( "site" );
-        // Both site and lib are unencoded.  See if they match part of the site path.
-        // Note well: We want a complete subsection match!  That is, what's left in the path after the match must
-        // either start with "/" or be empty.
-        if (!site.startsWith("/"))
-          site = "/" + site;
-
-        // Old-style matches have a preceding "/" when there's no subsite...
-        if (site.startsWith(sitePath))
-        {
-          if (sitePath.length() == 1 || site.length() == sitePath.length() || site.charAt(sitePath.length()) == '/')
-          {
-            // Hey, the startpoint rule matches!  It's an implicit inclusion, so we don't need to do anything else except return.
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Site path '"+sitePath+"' matched old-style startpoint with site '"+site+"' - including");
-            return true;
-          }
-        }
-      }
-      else if (sn.getType().equals("pathrule"))
-      {
-        // New-style rule.
-        String pathMatch = sn.getAttributeValue("match");
-        String action = sn.getAttributeValue("action");
-        String ruleType = sn.getAttributeValue("type");
-
-        // First, find out if we match EXACTLY.
-        if (checkMatch(sitePath,0,pathMatch))
-        {
-          // If this is true, the type also has to match if the rule is to apply.
-          if (ruleType.equals("site"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Site '"+sitePath+"' exactly matched rule path '"+pathMatch+"'");
-            if (action.equals("include"))
-            {
-              // For include rules, partial match is good enough to proceed.
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Including site '"+sitePath+"'");
-              return true;
-            }
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Excluding site '"+sitePath+"'");
-            return false;
-          }
-        }
-        else if (ruleType.equals("library") && checkPartialPathMatch(sitePath,0,pathMatch,1) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Site '"+sitePath+"' partially matched library rule path '"+pathMatch+"' - including");
-          return true;
-        }
-        else if (ruleType.equals("list") && checkPartialPathMatch(sitePath,0,pathMatch,1) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Site '"+sitePath+"' partially matched list rule path '"+pathMatch+"' - including");
-          return true;
-        }
-        else if (ruleType.equals("site") && checkPartialPathMatch(sitePath,0,pathMatch,0) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Site '"+sitePath+"' partially matched site rule path '"+pathMatch+"' - including");
-          return true;
-        }
-        else if (ruleType.equals("file") && checkPartialPathMatch(sitePath,0,pathMatch,2) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Site '"+sitePath+"' partially matched file rule path '"+pathMatch+"' - including");
-          return true;
-        }
-        else if (ruleType.equals("folder") && checkPartialPathMatch(sitePath,0,pathMatch,2) && action.equals("include"))
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: Site '"+sitePath+"' partially matched folder rule path '"+pathMatch+"' - including");
-          return true;
-        }
-
-      }
-    }
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: Not including site '"+sitePath+"' because no matching rule");
-    return false;
-  }
-
-  /** Get a file or item's metadata specification, given a path and a document specification.
-  *@param filePath is the unencoded path to a file or item, including sites and library/list, beneath the root site.
-  *@param documentSpecification is the document specification.
-  *@return the metadata description appropriate to the file.
-  */
-  protected MetadataInformation getMetadataSpecification( String filePath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Finding metadata to include for document/item '" + filePath + "'." );
-
-    MetadataInformation rval = new MetadataInformation();
-
-    // Scan the specification, looking for the old-style "startpoint" matches and the new-style "metadatarule" matches.
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i++);
-      if ( sn.getType().equals("startpoint") )
-      {
-        // Old style rule!
-
-        String site = sn.getAttributeValue( "site" );
-        String lib = sn.getAttributeValue( "lib" );
-        // Both site and lib are unencoded.  See if they match the first part of the filepath
-        String pathStart = site + "/" + lib + "/";
-        // Old-style matches have a preceding "/" when there's no subsite...
-        if (filePath.startsWith(pathStart))
-        {
-          // Hey, the startpoint rule matches!  It's an implicit inclusion, so this is where we get the metadata from (and then return)
-          String allmetadata = sn.getAttributeValue("allmetadata");
-          if (allmetadata != null && allmetadata.equals("true"))
-            rval.setAllMetadata();
-          else
-          {
-            // Scan children looking for metadata nodes
-            int j = 0;
-            while (j < sn.getChildCount())
-            {
-              SpecificationNode node = sn.getChild(j++);
-              if (node.getType().equals("metafield"))
-                rval.addMetadataField(node.getAttributeValue("value"));
-            }
-          }
-          return rval;
-        }
-      }
-      else if (sn.getType().equals("metadatarule"))
-      {
-        // New-style rule.
-        // Here's the trick: We do what the first matching rule tells us to do.
-        String pathMatch = sn.getAttributeValue("match");
-        // First, find out if we match...
-        if (checkMatch(filePath,0,pathMatch))
-        {
-          // The rule "fired".  Now, do what it tells us to.
-          String action = sn.getAttributeValue("action");
-          if (action.equals("include"))
-          {
-            // Include: Process the metadata specification, then return
-            String allMetadata = sn.getAttributeValue("allmetadata");
-            if (allMetadata != null && allMetadata.equals("true"))
-              rval.setAllMetadata();
-            else
-            {
-              // Scan children looking for metadata nodes
-              int j = 0;
-              while (j < sn.getChildCount())
-              {
-                SpecificationNode node = sn.getChild(j++);
-                if (node.getType().equals("metafield"))
-                  rval.addMetadataField(node.getAttributeValue("value"));
-              }
-            }
-          }
-          return rval;
-        }
-      }
-    }
-
-    return rval;
-
-  }
-
-  /** Check if a file should be included.
-  *@param filePath is the path to the file, including sites and library, beneath the root site.
-  *@param documentSpecification is the document specification.
-  *@return true if file should be included.
-  */
-  protected boolean checkIncludeFile( String filePath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Checking whether to include document '" + filePath + "'" );
-
-    // Break up the file/folder part of the path
-    int lastSlash = filePath.lastIndexOf("/");
-    String pathPart = filePath.substring(0,lastSlash);
-    String filePart = filePath.substring(lastSlash+1);
-
-    // Scan the spec rules looking for a library match, and extract the information if found.
-    // We need to understand both the old-style rules (startpoints), and the new style (matchrules)
-    int i = 0;
-    while (i < documentSpecification.getChildCount())
-    {
-      SpecificationNode sn = documentSpecification.getChild(i++);
-      if ( sn.getType().equals("startpoint") )
-      {
-        // Old style rule!
-
-        String site = sn.getAttributeValue( "site" );
-        String lib = sn.getAttributeValue( "lib" );
-        // Both site and lib are unencoded.  The string we are matching starts with "/" if the site is empty.
-        String pathMatch = site + "/" + lib + "/";
-        if (filePath.startsWith(pathMatch))
-        {
-          // Hey, it matched!
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: File path '"+filePath+"' matched old-style startpoint with site '"+site+"' and library '"+lib+"'");
-
-          int restOfPathIndex = pathMatch.length();
-
-          // We need to walk through the subrules and see whether it's in or out.
-          int j = 0;
-          while (j < sn.getChildCount())
-          {
-            SpecificationNode node = sn.getChild(j++);
-            String flavor = node.getType();
-            if (flavor.equals("include") || flavor.equals("exclude"))
-            {
-              String match = node.getAttributeValue("match");
-              String type = node.getAttributeValue("type");
-              String sourceMatch;
-              int sourceIndex;
-              if ( type.equals("file") )
-              {
-                sourceMatch = filePart;
-                sourceIndex = 0;
-              }
-              else
-              {
-                sourceMatch = pathPart;
-                sourceIndex = restOfPathIndex;
-              }
-              if ( checkMatch(sourceMatch,sourceIndex,match) )
-              {
-                // Our file path matched the rule.
-                if (flavor.equals("include"))
-                {
-                  if (Logging.connectors.isDebugEnabled())
-                    Logging.connectors.debug("SharePoint: File path '"+filePath+"' matched old-style inclusion rule '"+match+"' - including");
-                  return true;
-                }
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("SharePoint: File path '"+filePath+"' matched old-style exclusion rule '"+match+"' - excluding");
-                return false;
-              }
-            }
-          }
-
-          // Didn't match any of the file rules; therefore exclude.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("SharePoint: File path '"+filePath+"' did not match any old-style inclusion/exclusion rules - excluding");
-          return false;
-        }
-      }
-      else if (sn.getType().equals("pathrule"))
-      {
-        // New style rule!
-        String pathMatch = sn.getAttributeValue("match");
-        String action = sn.getAttributeValue("action");
-        String ruleType = sn.getAttributeValue("type");
-
-        // Find out if we match EXACTLY.  There are no "partial matches" for files.
-        if (checkMatch(filePath,0,pathMatch))
-        {
-          // If this is true, the type also has to match if the rule is to apply.
-          if (ruleType.equals("file"))
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: File '"+filePath+"' exactly matched rule path '"+pathMatch+"'");
-            if (action.equals("include"))
-            {
-              // For include rules, partial match is good enough to proceed.
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("SharePoint: Including file '"+filePath+"'");
-              return true;
-            }
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("SharePoint: Excluding file '"+filePath+"'");
-            return false;
-          }
-        }
-      }
-    }
-
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("SharePoint: File path '"+filePath+"' does not match any rules - excluding");
-
-    return false;
-  }
-
-  /** Check if a list item attachment should be included.
-  *@param attachmentPath is the path to the attachment, including sites and list name, beneath the root site.
-  *@param documentSpecification is the document specification.
-  *@return true if file should be included.
-  */
-  protected boolean checkIncludeListItemAttachment( String attachmentPath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Checking whether to include list item attachment '" + attachmentPath + "'" );
-
-    // There are no attachment rules, so they are always included
-    return true;
-  }
-
-  /** Check if a list item should be included.
-  *@param itemPath is the path to the item, including sites and list name, beneath the root site.
-  *@param documentSpecification is the document specification.
-  *@return true if file should be included.
-  */
-  protected boolean checkIncludeListItem( String itemPath, Specification documentSpecification )
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug( "SharePoint: Checking whether to include list item '" + itemPath + "'" );
-
-    // There are no item rules, so they are always included
-    return true;
-  }
-
-  /** Match a sub-path.  The sub-path must match the complete starting part of the full path, in a path
-  * sense.  The returned value should point into the file name beyond the end of the matched path, or
-  * be -1 if there is no match.
-  *@param subPath is the sub path.
-  *@param fullPath is the full path.
-  *@return the index of the start of the remaining part of the full path, or -1.
-  */
-  protected static int matchSubPath( String subPath, String fullPath )
-  {
-    if ( subPath.length() > fullPath.length() )
-      return -1;
-    if ( fullPath.startsWith( subPath ) == false )
-      return -1;
-    int rval = subPath.length();
-    if ( fullPath.length() == rval )
-      return rval;
-    char x = fullPath.charAt( rval );
-    if ( x == '/' )
-      rval++;
-    return rval;
-  }
-
-  /** Check for a partial path match between two strings with wildcards.
-  * Match allowance also must be made for the minimum path components in the rest of the path.
-  */
-  protected static boolean checkPartialPathMatch( String sourceMatch, int sourceIndex, String match, int requiredExtraPathSections )
-  {
-    // The partial match must be of a complete path, with at least a specified number of trailing path components possible in what remains.
-    // Path components can include everything but the "/" character itself.
-    //
-    // The match string is the one containing the wildcards.  Both the "*" wildcard and the "?" wildcard will match a "/", which is intended but is why this
-    // matcher is a little tricky to write.
-    //
-    // Note also that it is OK to return "true" more than strictly necessary, but it is never OK to return "false" incorrectly.
-
-    // This is a partial path match.  That means that we don't have to completely use up the match string, but what's left on the match string after the source
-    // string is used up MUST either be capable of being null, or be capable of starting with a "/"integral path sections, and MUST include at least n of these sections.
-    //
-
-    boolean caseSensitive = true;
-    if (!sourceMatch.endsWith("/"))
-      sourceMatch = sourceMatch + "/";
-
-    return processPartialPathCheck( caseSensitive, sourceMatch, sourceIndex, match, 0, requiredExtraPathSections );
-  }
-
-  /** Recursive worker method for checkPartialPathMatch.  Returns 'true' if there is a path that consumes the source string entirely,
-  * and leaves the remainder of the match string able to match the required followup.
-  *@param caseSensitive is true if file names are case sensitive.
-  *@param sourceMatch is the source string (w/o wildcards)
-  *@param sourceIndex is the current point in the source string.
-  *@param match is the match string (w/wildcards)
-  *@param matchIndex is the current point in the match string.
-  *@return true if there is a match.
-  */
-  protected static boolean processPartialPathCheck(boolean caseSensitive, String sourceMatch, int sourceIndex, String match, int matchIndex,
-    int requiredExtraPathSections)
-  {
-    // Match up through the next * we encounter
-    while ( true )
-    {
-      // If we've reached the end of the source, verify that it's a match.
-      if ( sourceMatch.length() == sourceIndex)
-      {
-        // The "correct" way to code this is to recursively attempt to generate all different paths that correspond to the required extra sections.  However,
-        // that's computationally very nasty.  In practice, we'll simply distinguish between "some" and "none".
-        // If we've reached the end of the match string too, then it passes (or fails, if we need extra sections)
-        if (match.length() == matchIndex)
-          return (requiredExtraPathSections == 0);
-        // We can match a path separator, so we win
-        return true;
-      }
-      // If we have reached the end of the match (but not the source), match fails
-      if ( match.length() == matchIndex )
-        return false;
-      char x = sourceMatch.charAt( sourceIndex );
-      char y = match.charAt( matchIndex );
-      if ( !caseSensitive )
-      {
-        if ( x >= 'A' && x <= 'Z' )
-          x -= 'A'-'a';
-        if ( y >= 'A' && y <= 'Z' )
-          y -= 'A'-'a';
-      }
-      if ( y == '*' )
-      {
-        // Wildcard!
-        // We will recurse at this point.
-        // Basically, we want to combine the results for leaving the "*" in the match string
-        // at this point and advancing the source index, with skipping the "*" and leaving the source
-        // string alone.
-        return processPartialPathCheck( caseSensitive, sourceMatch, sourceIndex + 1, match, matchIndex, requiredExtraPathSections ) ||
-          processPartialPathCheck( caseSensitive, sourceMatch, sourceIndex, match, matchIndex + 1, requiredExtraPathSections );
-      }
-      if ( y == '?' || x == y )
-      {
-        sourceIndex++;
-        matchIndex++;
-      }
-      else
-        return false;
-    }
-  }
-
-  /** Check a match between two strings with wildcards.
-  *@param sourceMatch is the expanded string (no wildcards)
-  *@param sourceIndex is the starting point in the expanded string.
-  *@param match is the wildcard-based string.
-  *@return true if there is a match.
-  */
-  protected static boolean checkMatch( String sourceMatch, int sourceIndex, String match )
-  {
-    // Note: The java regex stuff looks pretty heavyweight for this purpose.
-    // I've opted to try and do a simple recursive version myself, which is not compiled.
-    // Basically, the match proceeds by recursive descent through the string, so that all *'s cause
-    // recursion.
-    boolean caseSensitive = true;
-
-    return processCheck( caseSensitive, sourceMatch, sourceIndex, match, 0 );
-  }
-
-  /** Recursive worker method for checkMatch.  Returns 'true' if there is a path that consumes both
-  * strings in their entirety in a matched way.
-  *@param caseSensitive is true if file names are case sensitive.
-  *@param sourceMatch is the source string (w/o wildcards)
-  *@param sourceIndex is the current point in the source string.
-  *@param match is the match string (w/wildcards)
-  *@param matchIndex is the current point in the match string.
-  *@return true if there is a match.
-  */
-  protected static boolean processCheck(boolean caseSensitive, String sourceMatch, int sourceIndex, String match, int matchIndex )
-  {
-    // Match up through the next * we encounter
-    while ( true )
-    {
-      // If we've reached the end, it's a match.
-      if ( sourceMatch.length() == sourceIndex && match.length() == matchIndex )
-        return true;
-      // If one has reached the end but the other hasn't, no match
-      if ( match.length() == matchIndex )
-        return false;
-      if ( sourceMatch.length() == sourceIndex )
-      {
-        if ( match.charAt(matchIndex) != '*' )
-          return false;
-        matchIndex++;
-        continue;
-      }
-      char x = sourceMatch.charAt( sourceIndex );
-      char y = match.charAt( matchIndex );
-      if ( !caseSensitive )
-      {
-        if ( x >= 'A' && x <= 'Z' )
-          x -= 'A'-'a';
-        if ( y >= 'A' && y <= 'Z' )
-          y -= 'A'-'a';
-      }
-      if ( y == '*' )
-      {
-        // Wildcard!
-        // We will recurse at this point.
-        // Basically, we want to combine the results for leaving the "*" in the match string
-        // at this point and advancing the source index, with skipping the "*" and leaving the source
-        // string alone.
-        return processCheck( caseSensitive, sourceMatch, sourceIndex + 1, match, matchIndex ) ||
-          processCheck( caseSensitive, sourceMatch, sourceIndex, match, matchIndex + 1 );
-      }
-      if ( y == '?' || x == y )
-      {
-        sourceIndex++;
-        matchIndex++;
-      }
-      else
-        return false;
-    }
-  }
-
-  /** Grab forced acl out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getAcls(Specification spec)
-  {
-    HashMap map = new HashMap();
-    int i = 0;
-    boolean securityOn = true;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals("access"))
-      {
-        String token = sn.getAttributeValue("token");
-        map.put(token,token);
-      }
-      else if (sn.getType().equals("security"))
-      {
-        String value = sn.getAttributeValue("value");
-        if (value.equals("on"))
-          securityOn = true;
-        else if (value.equals("off"))
-          securityOn = false;
-      }
-    }
-    if (!securityOn)
-      return null;
-
-    String[] rval = new String[map.size()];
-    Iterator iter = map.keySet().iterator();
-    i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    return rval;
-  }
-
-  /** Decode a path item.
-  */
-  public static String pathItemDecode(String pathItem)
-  {
-      return URLDecoder.decode(pathItem.replaceAll("\\%20","+"));
-
-  }
-
-  /** Encode a path item.
-  */
-  public static String pathItemEncode(String pathItem)
-  {
-      String output = URLEncoder.encode(pathItem);
-      return output.replaceAll("\\+","%20");
-  }
-
-  /** Given a path that is /-separated, and otherwise encoded, decode properly to convert to
-  * unencoded form.
-  */
-  public static String decodePath(String relPath)
-  {
-    StringBuilder sb = new StringBuilder();
-    String[] pathEntries = relPath.split("/");
-    int k = 0;
-
-    boolean isFirst = true;
-    while (k < pathEntries.length)
-    {
-      if (isFirst)
-        isFirst = false;
-      else
-        sb.append("/");
-      sb.append(pathItemDecode(pathEntries[k++]));
-    }
-    return sb.toString();
-  }
-
-  /** Given a path that is /-separated, and otherwise unencoded, encode properly for an actual
-  * URI
-  */
-  public static String encodePath(String relPath)
-  {
-    StringBuilder sb = new StringBuilder();
-    String[] pathEntries = relPath.split("/");
-    int k = 0;
-
-    boolean isFirst = true;
-    while (k < pathEntries.length)
-    {
-      if (isFirst)
-        isFirst = false;
-      else
-        sb.append("/");
-      sb.append(pathItemEncode(pathEntries[k++]));
-    }
-    return sb.toString();
-  }
-
-  /** Metadata information gleaned from document paths and specification.
-  */
-  protected static class MetadataInformation
-  {
-    protected boolean allMetadata = false;
-    protected Set<String> metadataFields = new HashSet<String>();
-
-    /** Constructor */
-    public MetadataInformation()
-    {
-    }
-
-    /** Set "all metadata" */
-    public void setAllMetadata()
-    {
-      allMetadata = true;
-    }
-
-    /** Add a metadata field */
-    public void addMetadataField(String fieldName)
-    {
-      metadataFields.add(fieldName);
-    }
-
-    /** Get whether "all metadata" is to be used */
-    public boolean getAllMetadata()
-    {
-      return allMetadata;
-    }
-
-    /** Get the set of metadata fields to use */
-    public String[] getMetadataFields()
-    {
-      String[] rval = new String[metadataFields.size()];
-      int i = 0;
-      for (String field : metadataFields)
-      {
-        rval[i++] = field;
-      }
-      return rval;
-    }
-  }
-
-  /** Class that tracks paths associated with id's, and the name
-  * of the metadata attribute to use for the path.
-  */
-  protected class SystemMetadataDescription
-  {
-    // The path attribute name
-    protected final String pathAttributeName;
-
-    // The path name map
-    protected final MatchMap matchMap = new MatchMap();
-
-    /** Constructor */
-    public SystemMetadataDescription(Specification spec)
-      throws ManifoldCFException
-    {
-      String pathAttributeName = null;
-      for (int i = 0; i < spec.getChildCount(); i++)
-      {
-        SpecificationNode n = spec.getChild(i);
-        if (n.getType().equals("pathnameattribute"))
-          pathAttributeName = n.getAttributeValue("value");
-        else if (n.getType().equals("pathmap"))
-        {
-          String pathMatch = n.getAttributeValue("match");
-          String pathReplace = n.getAttributeValue("replace");
-          matchMap.appendMatchPair(pathMatch,pathReplace);
-        }
-      }
-      this.pathAttributeName = pathAttributeName;
-    }
-
-    /** Get the path attribute name.
-    *@return the path attribute name, or null if none specified.
-    */
-    public String getPathAttributeName()
-    {
-      return pathAttributeName;
-    }
-
-    /** Given an identifier, get the translated string that goes into the metadata.
-    */
-    public String getPathAttributeValue(String documentIdentifier)
-      throws ManifoldCFException
-    {
-      String path = getPathString(documentIdentifier);
-      return matchMap.translate(path);
-    }
-
-    /** For a given id, get the portion of its path which the mapping and ingestion
-    * should go against.  Effectively this should include the whole identifer, so this
-    * is easy to calculate.
-    */
-    public String getPathString(String documentIdentifier)
-      throws ManifoldCFException
-    {
-      // There will be a "//" somewhere in the string.  Remove it!
-      int dslashIndex = documentIdentifier.indexOf("//");
-      if (dslashIndex == -1)
-        return documentIdentifier;
-      return documentIdentifier.substring(0,dslashIndex) + documentIdentifier.substring(dslashIndex+1);
-    }
-  }
-
-
-}
diff --git a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/VersionsHeader.java b/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/VersionsHeader.java
deleted file mode 100644
index 01b57e8..0000000
--- a/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/VersionsHeader.java
+++ /dev/null
@@ -1,135 +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.
-*/
-
-/**
-* Versions.java
-*
-* This file was auto-generated from WSDL
-* by the Apache Axis WSDL2Java emitter.
-*/
-
-package org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-public class VersionsHeader  implements java.io.Serializable {
-  private java.lang.String[] version;
-
-  public VersionsHeader() {
-  }
-
-  public java.lang.String[] getVersion() {
-    return version;
-  }
-
-  public void setVersion(java.lang.String[] version) {
-    this.version = version;
-  }
-
-  public java.lang.String getVersion(int i) {
-    return version[i];
-  }
-
-  public void setVersion(int i, java.lang.String value) {
-    this.version[i] = value;
-  }
-
-  private java.lang.Object __equalsCalc = null;
-  public synchronized boolean equals(java.lang.Object obj) {
-    if (!(obj instanceof VersionsHeader)) return false;
-      VersionsHeader other = (VersionsHeader) obj;
-    if (obj == null) return false;
-    if (this == obj) return true;
-      if (__equalsCalc != null) {
-      return (__equalsCalc == obj);
-    }
-    __equalsCalc = obj;
-    boolean _equals;
-    _equals = true &&
-      ((this.version==null && other.getVersion()==null) ||
-      (this.version!=null &&
-      java.util.Arrays.equals(this.version, other.getVersion())));
-    __equalsCalc = null;
-    return _equals;
-  }
-
-  private boolean __hashCodeCalc = false;
-  public synchronized int hashCode() {
-    if (__hashCodeCalc) {
-      return 0;
-    }
-    __hashCodeCalc = true;
-    int _hashCode = 1;
-    if (getVersion() != null) {
-      for (int i=0;
-        i<java.lang.reflect.Array.getLength(getVersion());
-      i++) {
-        java.lang.Object obj = java.lang.reflect.Array.get(getVersion(), i);
-        if (obj != null &&
-          !obj.getClass().isArray()) {
-          _hashCode += obj.hashCode();
-        }
-      }
-    }
-    __hashCodeCalc = false;
-    return _hashCode;
-  }
-
-  // Type metadata
-  private static org.apache.axis.description.TypeDesc typeDesc =
-    new org.apache.axis.description.TypeDesc(VersionsHeader.class);
-
-  static {
-    typeDesc.setXmlType(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/dsp", "Versions"));
-    org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
-    elemField.setFieldName("version");
-    elemField.setXmlName(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/dsp", "version"));
-    elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
-    elemField.setMinOccurs(0);
-    typeDesc.addFieldDesc(elemField);
-  }
-
-  /**
-  * Return type metadata object
-  */
-  public static org.apache.axis.description.TypeDesc getTypeDesc() {
-    return typeDesc;
-  }
-
-  /**
-  * Get Custom Serializer
-  */
-  public static org.apache.axis.encoding.Serializer getSerializer(
-    java.lang.String mechType,
-    java.lang.Class _javaType,
-    javax.xml.namespace.QName _xmlType) {
-    return
-    new  org.apache.axis.encoding.ser.BeanSerializer(
-      _javaType, _xmlType, typeDesc);
-  }
-
-  /**
-  * Get Custom Deserializer
-  */
-  public static org.apache.axis.encoding.Deserializer getDeserializer(
-    java.lang.String mechType,
-    java.lang.Class _javaType,
-    javax.xml.namespace.QName _xmlType) {
-    return
-    new  org.apache.axis.encoding.ser.BeanDeserializer(
-      _javaType, _xmlType, typeDesc);
-  }
-
-}
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_en_US.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_en_US.properties
deleted file mode 100644
index 31269ec..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_en_US.properties
+++ /dev/null
@@ -1,86 +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.
-
-SharePointAuthority.DomainController=Domain Controller
-SharePointAuthority.Cache=Cache
-SharePointAuthority.DomainControllers=Domain Controllers:
-SharePointAuthority.DomainControllerName=Domain controller name
-SharePointAuthority.DomainSuffix=Domain suffix
-SharePointAuthority.AdministrativeUserName=Administrative user name
-SharePointAuthority.AdministrativePassword=Administrative password
-SharePointAuthority.Authentication=Authentication
-SharePointAuthority.LoginNameADAttribute=Login name AD attribute
-SharePointAuthority.CacheLifetime=Cache lifetime:
-SharePointAuthority.CacheLRUSize=Cache LRU size:
-SharePointAuthority.minutes=minutes
-SharePointAuthority.AddToEnd=Add to End
-SharePointAuthority.AddRuleToEnd=Add rule to end of list
-SharePointAuthority.Delete=Delete
-SharePointAuthority.DeleteRuleNumber=Delete rule #
-SharePointAuthority.InsertBefore=Insert Before
-SharePointAuthority.InsertBeforeRuleNumber=Insert before rule #
-SharePointAuthority.EnterADomainControllerServerName=Enter a domain controller server name
-SharePointAuthority.Domain Controller2=Domain Controller
-SharePointAuthority.AdministrativeUserNameCannotBeNull=Administrative user name cannot be null
-SharePointAuthority.AuthenticationCannotBeNull=Authentication cannot be null
-SharePointAuthority.CacheLifetimeCannotBeNull=Cache lifetime cannot be null
-SharePointAuthority.CacheLifetimeMustBeAnInteger=Cache lifetime must be an integer
-SharePointAuthority.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
-SharePointAuthority.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
-SharePointAuthority.certificate=certificate(s)
-
-SharePointAuthority.Server=Server
-SharePointAuthority.ServerSharePointVersion=Server SharePoint version:
-SharePointAuthority.ServerClaimSpace=Claims based authorization:
-SharePointAuthority.Disabled=Disabled
-SharePointAuthority.Enabled=Enabled
-SharePointAuthority.ServerProtocol=Server protocol:
-SharePointAuthority.ServerName=Server name:
-SharePointAuthority.ServerPort=Server port:
-SharePointAuthority.SitePath=Site path:
-SharePointAuthority.UserName=User name:
-SharePointAuthority.Password=Password:
-SharePointAuthority.SSLCertificateList=SSL certificate list:
-SharePointAuthority.NoCertificatesPresent=No certificates present
-SharePointAuthority.Delete=Delete
-SharePointAuthority.DeleteCert=Delete cert
-SharePointAuthority.Add=Add
-SharePointAuthority.AddCert=Add cert
-SharePointAuthority.Parameters=Parameters:
-SharePointAuthority.ChooseACertificateFile=Choose a certificate file
-SharePointAuthority.PleaseSupplyAValidNumber=Please supply a valid number
-SharePointAuthority.PleaseSpecifyAnyServerPathInformation=Please specify any server path information in the site path field, not the server name field
-SharePointAuthority.SitePathMustBeginWithWCharacter=Site path must begin with a '/' character
-SharePointAuthority.SitePathCannotEndWithACharacter=Site path cannot end with a '/' character
-SharePointAuthority.AValidSharePointUserNameHasTheForm=A valid SharePoint user name has the form <domain>\\<user>
-SharePointAuthority.PleaseFillInASharePointServerName=Please fill in a SharePoint server name
-SharePointAuthority.PleaseSpecifyAnyServerPathInformationInTheSitePathField=Please specify any server path information in the site path field, not the server name field
-SharePointAuthority.PleaseSupplyASharePointPortNumber=Please supply a SharePoint port number, or none for default
-SharePointAuthority.TheConnectionRequiresAValidSharePointUserName=The connection requires a valid SharePoint user name of the form <domain>\\<user>
-SharePointAuthority.Certificate=Certificate:
-
-SharePointAuthority.AuthorizationModel=Authorization model
-SharePointAuthority.AuthorizationModelColon=Authorization model:
-SharePointAuthority.Classic=Classic
-SharePointAuthority.ClaimSpace=Claim Space
-
-SharePointAuthority.ProxyHost=Proxy host:
-SharePointAuthority.ProxyPort=Proxy port:
-SharePointAuthority.ProxyUser=Proxy user name:
-SharePointAuthority.ProxyPassword=Proxy password:
-SharePointAuthority.ProxyDomain=Proxy domain:
-
-
-
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_es_ES.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_es_ES.properties
deleted file mode 100644
index 7c80ade..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_es_ES.properties
+++ /dev/null
@@ -1,86 +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.
-
-SharePointAuthority.DomainController=controlador de dominio
-SharePointAuthority.Cache=Cache
-SharePointAuthority.DomainControllers=Controladores de dominio:
-SharePointAuthority.DomainControllerName=Nombre del controlador de dominio
-SharePointAuthority.DomainSuffix=sufijo de dominio
-SharePointAuthority.AdministrativeUserName=Nombre de usuario administrativo
-SharePointAuthority.AdministrativePassword=contraseña administrativa
-SharePointAuthority.Authentication=Autenticación
-SharePointAuthority.LoginNameADAttribute=Atributo AD Iniciar sesión Nombre
-SharePointAuthority.CacheLifetime=vida útil de la caché:
-SharePointAuthority.CacheLRUSize=Tamaño de caché LRU:
-SharePointAuthority.minutes=minutos
-SharePointAuthority.AddToEnd=Añadir a Terminar
-SharePointAuthority.AddRuleToEnd=Añadir regla a final de la lista
-SharePointAuthority.Delete=Borrar
-SharePointAuthority.DeleteRuleNumber=eliminar regla #
-SharePointAuthority.InsertBefore=insertar antes
-SharePointAuthority.InsertBeforeRuleNumber=Inserte antes de la regla #
-SharePointAuthority.EnterADomainControllerServerName=Introduzca un nombre de servidor de controlador de dominio
-SharePointAuthority.Domain Controller2=controlador de dominio
-SharePointAuthority.AdministrativeUserNameCannotBeNull=Nombre de usuario administrativo no nulo Ser PUEDE
-SharePointAuthority.AuthenticationCannotBeNull=Autenticación no puede ser nulo
-SharePointAuthority.CacheLifetimeCannotBeNull=Vida útil de la caché no puede ser nulo
-SharePointAuthority.CacheLifetimeMustBeAnInteger=Vida útil de la caché debe ser un entero
-SharePointAuthority.CacheLRUSizeCannotBeNull=Tamaño de caché LRU no puede ser nulo
-SharePointAuthority.CacheLRUSizeMustBeAnInteger=Tamaño de caché LRU debe ser un entero
-SharePointAuthority.certificate=certificado(s)
-
-SharePointAuthority.Server=Servidor
-SharePointAuthority.ServerSharePointVersion=Servidor Compartir versión Point:
-SharePointAuthority.ServerClaimSpace=Autorización reclamaciones basadas:
-SharePointAuthority.Disabled=Imposibilitado
-SharePointAuthority.Enabled=Activado
-SharePointAuthority.ServerProtocol=protocolo de servidor:
-SharePointAuthority.ServerName=Nombre del servidor:
-SharePointAuthority.ServerPort=Puerto de servicio:
-SharePointAuthority.SitePath=ruta del Sitio:
-SharePointAuthority.UserName=Nombre de usuario:
-SharePointAuthority.Password=Contraseña:
-SharePointAuthority.SSLCertificateList=Lista de certificados SSL:
-SharePointAuthority.NoCertificatesPresent=No hay certificados actuales
-SharePointAuthority.Delete=Borrar
-SharePointAuthority.DeleteCert=eliminar cert
-SharePointAuthority.Add=Añadir
-SharePointAuthority.AddCert=Añadir cert
-SharePointAuthority.Parameters=Parámetros:
-SharePointAuthority.ChooseACertificateFile=Elija un archivo de certificado
-SharePointAuthority.PleaseSupplyAValidNumber=Por favor, facilite un número válido
-SharePointAuthority.PleaseSpecifyAnyServerPathInformation=Por favor especificar cualquier información de la ruta del servidor en el campo Ruta sitio, no el campo Nombre de servidor
-SharePointAuthority.SitePathMustBeginWithWCharacter=Ruta del Sitio debe comenzar con una '/' carácter
-SharePointAuthority.SitePathCannotEndWithACharacter=Ruta del Sitio no puede terminar con una '/' carácter
-SharePointAuthority.AValidSharePointUserNameHasTheForm=Un nombre de usuario de SharePoint válida tiene la forma <dominio>\\<usuario>
-SharePointAuthority.PleaseFillInASharePointServerName=Por favor, rellene una Acción nombre del servidor Point
-SharePointAuthority.PleaseSpecifyAnyServerPathInformationInTheSitePathField=Por favor especificar cualquier información de la ruta del servidor en el campo Ruta sitio, no el campo Nombre de servidor
-SharePointAuthority.PleaseSupplyASharePointPortNumber=Por favor, facilite un número de puerto Share Point, o ninguno de forma predeterminada
-SharePointAuthority.TheConnectionRequiresAValidSharePointUserName=La conexión requiere un nombre de usuario Share Point válida de la forma <dominio>\\<usuario>
-SharePointAuthority.Certificate=Certificado:
-
-SharePointAuthority.AuthorizationModel=modelo de autorización
-SharePointAuthority.AuthorizationModelColon=modelo de autorización:
-SharePointAuthority.Classic=Clásico
-SharePointAuthority.ClaimSpace=Espacio Reclamación
-
-SharePointAuthority.ProxyHost=Proxy host:
-SharePointAuthority.ProxyPort=Puerto de proxy:
-SharePointAuthority.ProxyUser=Nombre de usuario de proxy:
-SharePointAuthority.ProxyPassword=contraseña del proxy:
-SharePointAuthority.ProxyDomain=dominio Proxy:
-
-
-
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_ja_JP.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_ja_JP.properties
deleted file mode 100644
index e8fbe79..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_ja_JP.properties
+++ /dev/null
@@ -1,83 +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.
-
-SharePointAuthority.DomainController=ドメインコントローラ
-SharePointAuthority.Cache=キャッシュ
-SharePointAuthority.DomainControllers=ドメインコントローラ:
-SharePointAuthority.DomainControllerName=ドメインコントローラ名
-SharePointAuthority.DomainSuffix=Domain suffix
-SharePointAuthority.AdministrativeUserName=管理者
-SharePointAuthority.AdministrativePassword=管理者パスワード
-SharePointAuthority.Authentication=認証
-SharePointAuthority.LoginNameADAttribute=ログイン名AD属性
-SharePointAuthority.CacheLifetime=キャッシュライフタイム:
-SharePointAuthority.CacheLRUSize=キャッシュLRUサイズ:
-SharePointAuthority.minutes=分
-SharePointAuthority.AddToEnd=最後に追加する
-SharePointAuthority.AddRuleToEnd=リストの最後にルールを追加します。
-SharePointAuthority.Delete=削除する
-SharePointAuthority.DeleteRuleNumber=ルールを削除します。 #
-SharePointAuthority.InsertBefore=前に挿入します。
-SharePointAuthority.InsertBeforeRuleNumber=ルールの前に挿入 #
-SharePointAuthority.EnterADomainControllerServerName=ドメインコントローラ名を入力してください
-SharePointAuthority.Domain Controller2=ドメインコントローラ
-SharePointAuthority.AdministrativeUserNameCannotBeNull=管理者名を入力してください
-SharePointAuthority.AuthenticationCannotBeNull=認証情報を入力してください
-SharePointAuthority.CacheLifetimeCannotBeNull=キャッシュライフタイムを入力してください
-SharePointAuthority.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
-SharePointAuthority.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
-SharePointAuthority.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
-SharePointAuthority.certificate=証明書
-
-SharePointAuthority.Server=サーバ
-SharePointAuthority.ServerSharePointVersion=サーバSharePointバージョン:
-SharePointAuthority.ServerClaimSpace=Claims based authorization:
-SharePointAuthority.Disabled=Disabled
-SharePointAuthority.Enabled=Enabled
-SharePointAuthority.ServerProtocol=サーバプロトコル:
-SharePointAuthority.ServerName=サーバ名:
-SharePointAuthority.ServerPort=サーバポート番号:
-SharePointAuthority.SitePath=サイトパス:
-SharePointAuthority.UserName=ユーザ名:
-SharePointAuthority.Password=パスワード:
-SharePointAuthority.SSLCertificateList=SSL認証一覧:
-SharePointAuthority.NoCertificatesPresent=認証がありません
-SharePointAuthority.Delete=削除
-SharePointAuthority.DeleteCert=認証の削除
-SharePointAuthority.Add=追加
-SharePointAuthority.AddCert=認証の追加
-SharePointAuthority.Parameters=引数:
-SharePointAuthority.ChooseACertificateFile=証明書ファイルを選択してください
-SharePointAuthority.PleaseSupplyAValidNumber=数字を入力してください
-SharePointAuthority.PleaseSpecifyAnyServerPathInformation=サーバ名ではなく、サイトパスにサーバパス情報を入力してください
-SharePointAuthority.SitePathMustBeginWithWCharacter=サイトパスは文字「/」から始めてください
-SharePointAuthority.SitePathCannotEndWithACharacter=サイトパスの未尾に文字「/」を使わないでください
-SharePointAuthority.AValidSharePointUserNameHasTheForm=SharePointユーザ名は<ドメイン>\\<ユーザ>\で指定してください
-SharePointAuthority.PleaseFillInASharePointServerName=SharePointサーバ名を入力してください
-SharePointAuthority.PleaseSpecifyAnyServerPathInformationInTheSitePathField=サーバ名ではなく、サイトパスにサーバパス情報を入力してください
-SharePointAuthority.PleaseSupplyASharePointPortNumber=SharePointポート番号を入力してください。デフォルト値を利用する場合は空白にしてください
-SharePointAuthority.TheConnectionRequiresAValidSharePointUserName=コネクションのSharePointユーザ名は<ドメイン>\\<ユーザ>\形式で指定してください
-SharePointAuthority.Certificate=証明証:
-
-SharePointAuthority.AuthorizationModel=Authorization model
-SharePointAuthority.AuthorizationModelColon=Authorization model:
-SharePointAuthority.Classic=Classic
-SharePointAuthority.ClaimSpace=Claim Space
-
-SharePointAuthority.ProxyHost=Proxy host:
-SharePointAuthority.ProxyPort=Proxy port:
-SharePointAuthority.ProxyUser=Proxy user name:
-SharePointAuthority.ProxyPassword=Proxy password:
-SharePointAuthority.ProxyDomain=Proxy domain:
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_zh_CN.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_zh_CN.properties
deleted file mode 100644
index efcf8c0..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/authorities/authorities/sharepoint/common_zh_CN.properties
+++ /dev/null
@@ -1,83 +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.
-
-SharePointAuthority.DomainController=域控制器
-SharePointAuthority.Cache=缓存
-SharePointAuthority.DomainControllers=域控制器:
-SharePointAuthority.DomainControllerName=域控制器名
-SharePointAuthority.DomainSuffix=域后缀
-SharePointAuthority.AdministrativeUserName=管理员名
-SharePointAuthority.AdministrativePassword=管理员密码
-SharePointAuthority.Authentication=认证
-SharePointAuthority.LoginNameADAttribute=登录名AD属性
-SharePointAuthority.CacheLifetime=缓存寿命: 
-SharePointAuthority.CacheLRUSize=缓存LRU大小: 
-SharePointAuthority.minutes=分
-SharePointAuthority.AddToEnd=添加到末尾
-SharePointAuthority.AddRuleToEnd=添加规则到列表末尾
-SharePointAuthority.Delete=删除
-SharePointAuthority.DeleteRuleNumber=删除规则号 #
-SharePointAuthority.InsertBefore=向前插入
-SharePointAuthority.InsertBeforeRuleNumber=插入到规则号的前面 #
-SharePointAuthority.EnterADomainControllerServerName=请输入域控制器服务器名
-SharePointAuthority.Domain Controller2=域控制器
-SharePointAuthority.AdministrativeUserNameCannotBeNull=管理员名不能为Null
-SharePointAuthority.AuthenticationCannotBeNull=认证信息不能为Null
-SharePointAuthority.CacheLifetimeCannotBeNull=缓存寿命不能为Null
-SharePointAuthority.CacheLifetimeMustBeAnInteger=缓存寿命必须为整数
-SharePointAuthority.CacheLRUSizeCannotBeNull=缓存LRU大小不能为Null
-SharePointAuthority.CacheLRUSizeMustBeAnInteger=缓存LRU大小必须为整数
-SharePointAuthority.certificate=证书
-
-SharePointAuthority.Server=服务器
-SharePointAuthority.ServerSharePointVersion=服务器共享点版本: 
-SharePointAuthority.ServerClaimSpace=服务器Claim空间:
-SharePointAuthority.Disabled=无效
-SharePointAuthority.Enabled=有效
-SharePointAuthority.ServerProtocol=服务器协议: 
-SharePointAuthority.ServerName=服务器名: 
-SharePointAuthority.ServerPort=服务器端口号: 
-SharePointAuthority.SitePath=网站路径: 
-SharePointAuthority.UserName=用户名: 
-SharePointAuthority.Password=密码: 
-SharePointAuthority.SSLCertificateList=SSL证书列表: 
-SharePointAuthority.NoCertificatesPresent=证书不存在
-SharePointAuthority.Delete=删除
-SharePointAuthority.DeleteCert=删除证书
-SharePointAuthority.Add=添加
-SharePointAuthority.AddCert=添加证书
-SharePointAuthority.Parameters=参数: 
-SharePointAuthority.ChooseACertificateFile=请选择证书文件
-SharePointAuthority.PleaseSupplyAValidNumber=请输入有效的数字
-SharePointAuthority.PleaseSpecifyAnyServerPathInformation=请在网站路径字段输入服务器路径信息,而不是服务器名
-SharePointAuthority.SitePathMustBeginWithWCharacter=网站路径的第一个字符必须为‘/’
-SharePointAuthority.SitePathCannotEndWithACharacter=网站路径的最后一个字符不能为‘/’
-SharePointAuthority.AValidSharePointUserNameHasTheForm=共享点用户名需指定为 <域>\\<用户>\ 的格式
-SharePointAuthority.PleaseFillInASharePointServerName=请输入共享点服务器名
-SharePointAuthority.PleaseSpecifyAnyServerPathInformationInTheSitePathField=请在网站路径字段输入服务器路径信息,而不是服务器名
-SharePointAuthority.PleaseSupplyASharePointPortNumber=请输入共享点端口号。如使用缺省值则设为空
-SharePointAuthority.TheConnectionRequiresAValidSharePointUserName=连接的共享点用户名需指定为 <域>\\<用户>\ 的格式
-SharePointAuthority.Certificate=证书: 
-
-SharePointAuthority.AuthorizationModel=授权模型
-SharePointAuthority.AuthorizationModelColon=授权模型:
-SharePointAuthority.Classic=经典
-SharePointAuthority.ClaimSpace=Claim空间
-
-SharePointAuthority.ProxyHost=Proxy host:
-SharePointAuthority.ProxyPort=Proxy port:
-SharePointAuthority.ProxyUser=Proxy user name:
-SharePointAuthority.ProxyPassword=Proxy password:
-SharePointAuthority.ProxyDomain=Proxy domain:
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_en_US.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_en_US.properties
deleted file mode 100644
index dd62d4d..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_en_US.properties
+++ /dev/null
@@ -1,150 +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.
-
-SharePointRepository.AuthorityTypeColon=Authority type:
-SharePointRepository.SharePoint=SharePoint
-SharePointRepository.ActiveDirectory=Active Directory
-
-SharePointRepository.List=List
-SharePointRepository.AddList=Add List
-SharePointRepository.SelectList=Select list
-SharePointRepository.AddListToRulePath=Add List to Rule Path
-SharePointRepository.PleaseSelectAListFirst=Please select a list first
-SharePointRepository.AddListToMetadataRulePath=Add List to Metadata Rule Path
-
-SharePointRepository.AddToMappings=Add to mappings
-SharePointRepository.AddPathMapping=Add Path Mapping
-
-SharePointRepository.NoAccessTokensPresent=No access tokens present
-SharePointRepository.NoAccessTokensSpecified=No access tokens specified
-SharePointRepository.Server=Server
-SharePointRepository.AuthorityType=Authority type
-SharePointRepository.Paths=Paths
-SharePointRepository.Security=Security
-SharePointRepository.Metadata=Metadata
-SharePointRepository.ServerSharePointVersion=Server SharePoint version:
-SharePointRepository.ServerProtocol=Server protocol:
-SharePointRepository.ServerName=Server name:
-SharePointRepository.ServerPort=Server port:
-SharePointRepository.SitePath=Site path:
-SharePointRepository.UserName=User name:
-SharePointRepository.Password=Password:
-SharePointRepository.SSLCertificateList=SSL certificate list:
-SharePointRepository.NoCertificatesPresent=No certificates present
-SharePointRepository.Delete=Delete
-SharePointRepository.DeleteCert=Delete cert
-SharePointRepository.Add=Add
-SharePointRepository.AddCert=Add cert
-SharePointRepository.Parameters=Parameters:
-SharePointRepository.PathRules=Path rules:
-SharePointRepository.PathMatch=Path match
-SharePointRepository.Type=Type
-SharePointRepository.Action=Action
-SharePointRepository.InsertNewRule=Insert New Rule
-SharePointRepository.Delete=Delete
-SharePointRepository.DeleteRule=Delete rule #
-SharePointRepository.NoDocumentsCurrentlyIncluded=No documents currently included
-SharePointRepository.AddNewRule=Add New Rule
-SharePointRepository.File=File
-SharePointRepository.Library=Library
-SharePointRepository.Site=Site
-SharePointRepository.Include=Include
-SharePointRepository.Exclude=Exclude
-SharePointRepository.AddSite=Add Site
-SharePointRepository.SelectSite=Select site
-SharePointRepository.AddLibrary=Add Library
-SharePointRepository.SelectLibrary=Select library
-SharePointRepository.AddText=Add Text
-SharePointRepository.Security2=Security:
-SharePointRepository.MetadataRules=Metadata rules:
-SharePointRepository.PathMatch=Path match
-SharePointRepository.Action=Action
-SharePointRepository.AllMetadata=All metadata?
-SharePointRepository.Fields=Fields
-SharePointRepository.ResetPath=Reset Path
-SharePointRepository.PathMetadata=Path metadata:
-SharePointRepository.AttributeName=Attribute name:
-SharePointRepository.NoMappingsSpecified=No mappings specified
-SharePointRepository.MatchRegexp=Match regexp:
-SharePointRepository.ReplaceString=Replace string:
-SharePointRepository.PathRules=Path rules:
-SharePointRepository.PathMatch=Path match
-SharePointRepository.RuleType=Rule type
-SharePointRepository.file=file
-SharePointRepository.NoDocumentsWillBeIncluded=No documents will be included
-SharePointRepository.Metadata2=Metadata:
-SharePointRepository.include2=include
-SharePointRepository.NoMetadataWillBeIncluded=No metadata will be included
-SharePointRepository.AccessToken=Access tokens:
-SharePointRepository.PathMetadataAttributeName=Path metadata attribute name:
-SharePointRepository.NoPathNameMetadataAttributeSpecified=No path-name metadata attribute specified
-SharePointRepository.PathValueMapping=Path-value mapping:
-SharePointRepository.NoMappingsSpecified=No mappings specified
-SharePointRepository.ChooseACertificateFile=Choose a certificate file
-SharePointRepository.PleaseSupplyAValidNumber=Please supply a valid number
-SharePointRepository.PleaseSpecifyAnyServerPathInformation=Please specify any server path information in the site path field, not the server name field
-SharePointRepository.SitePathMustBeginWithWCharacter=Site path must begin with a '/' character
-SharePointRepository.SitePathCannotEndWithACharacter=Site path cannot end with a '/' character
-SharePointRepository.AValidSharePointUserNameHasTheForm=A valid SharePoint user name has the form <domain>\\<user>
-SharePointRepository.PleaseFillInASharePointServerName=Please fill in a SharePoint server name
-SharePointRepository.PleaseSpecifyAnyServerPathInformationInTheSitePathField=Please specify any server path information in the site path field, not the server name field
-SharePointRepository.PleaseSupplyASharePointPortNumber=Please supply a SharePoint port number, or none for default
-SharePointRepository.TheConnectionRequiresAValidSharePointUserName=The connection requires a valid SharePoint user name of the form <domain>\\<user>
-SharePointRepository.Certificate=Certificate:
-SharePointRepository.PleaseSelectATypeFirst=Please select a type first
-SharePointRepository.PleaseSelectAnActionFirst=Please select an action first
-SharePointRepository.PleaseSelectASiteFirst=Please select a site first
-SharePointRepository.PleaseSelectALibraryFirst=Please select a library first
-SharePointRepository.PleaseProvideMatchTextFirst=Please provide match text first
-SharePointRepository.PleaseSelectAnActionFirst=Please select an action first
-SharePointRepository.PleaseSelectASiteFirst=Please select a site first
-SharePointRepository.AccessTokenCannotBeNull=Access token cannot be null
-SharePointRepository.MatchStringCannotBeEmpty=Match string cannot be empty
-SharePointRepository.MatchStringMustBeValidRegularExpression=Match string must be valid regular expression
-SharePointRepository.InsertNewRuleBeforeRule=Insert new rule before rule #
-SharePointRepository.DeleteRule=Delete rule #
-SharePointRepository.NewRule=New rule:
-SharePointRepository.ResetRulePath=Reset Rule Path
-SharePointRepository.RemoveFromRulePath=Remove from Rule Path
-SharePointRepository.AddSiteToRulePath=Add Site to Rule Path
-SharePointRepository.AddLibraryToRulePath=Add Library to Rule Path
-SharePointRepository.AddTextToRulePath=Add Text to Rule Path
-SharePointRepository.Enabled=Enabled
-SharePointRepository.Disabled=Disabled
-SharePointRepository.DeleteToken=Delete token #
-SharePointRepository.AddAccessToken=Add access token
-SharePointRepository.InsertNewMetadataRuleBeforeRule=Insert new metadata rule before rule #
-SharePointRepository.DeleteMetadataRule=Delete metadata rule #
-SharePointRepository.include=include
-SharePointRepository.DeleteMetadataRule=Delete metadata rule #
-SharePointRepository.NoMetadataIncluded=No metadata included
-SharePointRepository.AddRule=Add rule
-SharePointRepository.NewRule=New rule:
-SharePointRepository.IncludeAllMetadata= Include all metadata
-SharePointRepository.ResetMetadataRulePath=Reset Metadata Rule Path
-SharePointRepository.RemoveFromMetadataRulePath=Remove from Metadata Rule Path
-SharePointRepository.AddSiteToMetadataRulePath=Add Site to Metadata Rule Path
-SharePointRepository.SelectSite=-- Select site --
-SharePointRepository.AddLibraryToMetadataRulePath=Add Library to Metadata Rule Path
-SharePointRepository.SelectLibrary=-- Select library --
-SharePointRepository.AddTextToMetadataRulePath=Add Text to Metadata Rule Path
-SharePointRepository.DeleteMapping=Delete mapping #
-SharePointRepository.DeletePathMapping=Delete Path Mapping
-SharePointRepository.Enabled2=Enabled
-SharePointRepository.ProxyHost=Proxy host:
-SharePointRepository.ProxyPort=Proxy port:
-SharePointRepository.ProxyUser=Proxy user name:
-SharePointRepository.ProxyPassword=Proxy password:
-SharePointRepository.ProxyDomain=Proxy domain:
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_es_ES.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_es_ES.properties
deleted file mode 100644
index a1ad9bf..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_es_ES.properties
+++ /dev/null
@@ -1,150 +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.
-
-SharePointRepository.AuthorityTypeColon=tipo de Autoridad:
-SharePointRepository.SharePoint=Share Point
-SharePointRepository.ActiveDirectory=Directorio Activo
-
-SharePointRepository.List=Lista
-SharePointRepository.AddList=Añadir lista
-SharePointRepository.SelectList=Seleccione la lista
-SharePointRepository.AddListToRulePath=Añadir Lista de regla de ruta
-SharePointRepository.PleaseSelectAListFirst=Por favor, seleccione una lista primero
-SharePointRepository.AddListToMetadataRulePath=Añadir Lista de Metadatos regla de ruta
-
-SharePointRepository.AddToMappings=Añadir a asignaciones
-SharePointRepository.AddPathMapping=Añada Trazar un mapa de Camino
-
-SharePointRepository.NoAccessTokensPresent=No hay tokens de acceso actuales
-SharePointRepository.NoAccessTokensSpecified=No hay tokens de acceso especificados
-SharePointRepository.Server=Servidor
-SharePointRepository.AuthorityType=tipo de Autoridad
-SharePointRepository.Paths=Caminos
-SharePointRepository.Security=Seguridad
-SharePointRepository.Metadata=Metadatos
-SharePointRepository.ServerSharePointVersion=Servidor Compartir versión Point:
-SharePointRepository.ServerProtocol=protocolo de servidor:
-SharePointRepository.ServerName=Nombre del servidor:
-SharePointRepository.ServerPort=Puerto de servicio:
-SharePointRepository.SitePath=ruta del Sitio:
-SharePointRepository.UserName=Nombre de usuario:
-SharePointRepository.Password=Contraseña:
-SharePointRepository.SSLCertificateList=SSL lista de certificado:
-SharePointRepository.NoCertificatesPresent=No hay certificados actuales
-SharePointRepository.Delete=Borrar
-SharePointRepository.DeleteCert=eliminar cert
-SharePointRepository.Add=Añadir
-SharePointRepository.AddCert=Añadir cert
-SharePointRepository.Parameters=Parámetros:
-SharePointRepository.PathRules=reglas de ruta:
-SharePointRepository.PathMatch=partido Camino
-SharePointRepository.Type=Tipo
-SharePointRepository.Action=Acción
-SharePointRepository.InsertNewRule=Inserte Nueva regla
-SharePointRepository.Delete=Borrar
-SharePointRepository.DeleteRule=eliminar regla #
-SharePointRepository.NoDocumentsCurrentlyIncluded=No hay documentos actualmente incluidos
-SharePointRepository.AddNewRule=Agregar nueva regla
-SharePointRepository.File=Archivo
-SharePointRepository.Library=Biblioteca
-SharePointRepository.Site=Sitio
-SharePointRepository.Include=Incluir
-SharePointRepository.Exclude=Excluir
-SharePointRepository.AddSite=Agregar sitio
-SharePointRepository.SelectSite=Seleccione el sitio
-SharePointRepository.AddLibrary=Añadir Biblioteca
-SharePointRepository.SelectLibrary=Seleccione la biblioteca
-SharePointRepository.AddText=Añadir texto
-SharePointRepository.Security2=Seguridad:
-SharePointRepository.MetadataRules=normas de metadatos:
-SharePointRepository.PathMatch=partido Camino
-SharePointRepository.Action=Acción
-SharePointRepository.AllMetadata=Todos los metadatos?
-SharePointRepository.Fields=Campos
-SharePointRepository.ResetPath=Restablecer Camino
-SharePointRepository.PathMetadata=Camino metadata:
-SharePointRepository.AttributeName=Nombre del Atributo:
-SharePointRepository.NoMappingsSpecified=Ningún trazar un mapa de especificado
-SharePointRepository.MatchRegexp=regexp Partido:
-SharePointRepository.ReplaceString=Reemplazar cadena:
-SharePointRepository.PathRules=reglas de ruta:
-SharePointRepository.PathMatch=partido Camino
-SharePointRepository.RuleType=tipo de Regla
-SharePointRepository.file=archivo
-SharePointRepository.NoDocumentsWillBeIncluded=Ningunos documentos serán incluidos
-SharePointRepository.Metadata2=Metadatos:
-SharePointRepository.include2=include
-SharePointRepository.NoMetadataWillBeIncluded=Ningún metadata será incluido
-SharePointRepository.AccessToken=tokens de acceso:
-SharePointRepository.PathMetadataAttributeName=El camino metadata atribuye el nombre:
-SharePointRepository.NoPathNameMetadataAttributeSpecified=Ningún camino-atributo de nombre de metadatos especificado
-SharePointRepository.PathValueMapping=Camino-asignación de valores:
-SharePointRepository.NoMappingsSpecified=No hay asignaciones especificadas
-SharePointRepository.ChooseACertificateFile=Elija un archivo de certificado
-SharePointRepository.PleaseSupplyAValidNumber=Por favor, facilite un número válido
-SharePointRepository.PleaseSpecifyAnyServerPathInformation=Por favor especificar cualquier información de la ruta del servidor en el campo Ruta sitio, no el campo Nombre de servidor
-SharePointRepository.SitePathMustBeginWithWCharacter=Ruta del Sitio debe comenzar con una'/' carácter
-SharePointRepository.SitePathCannotEndWithACharacter=Ruta del Sitio no puede terminar con una '/' carácter
-SharePointRepository.AValidSharePointUserNameHasTheForm=Un nombre de usuario de SharePoint válida tiene la forma <dominio>\\<usuario>
-SharePointRepository.PleaseFillInASharePointServerName=Por favor, rellene una Acción nombre del servidor Point
-SharePointRepository.PleaseSpecifyAnyServerPathInformationInTheSitePathField=Por favor especificar cualquier información de la ruta del servidor en el campo Ruta sitio, no el campo Nombre de servidor
-SharePointRepository.PleaseSupplyASharePointPortNumber=Por favor, facilite un número de puerto Share Point, o ninguno de forma predeterminada
-SharePointRepository.TheConnectionRequiresAValidSharePointUserName=La conexión requiere un nombre de usuario Share Point válida de la forma <dominio>\\<usuario>
-SharePointRepository.Certificate=Certificado:
-SharePointRepository.PleaseSelectATypeFirst=Por favor, seleccione un tipo de primera
-SharePointRepository.PleaseSelectAnActionFirst=Por favor seleccione una acción primero
-SharePointRepository.PleaseSelectASiteFirst=Por favor, seleccione un sitio de primera
-SharePointRepository.PleaseSelectALibraryFirst=Por favor, seleccione una biblioteca primero
-SharePointRepository.PleaseProvideMatchTextFirst=Sírvanse proporcionar texto partido primero
-SharePointRepository.PleaseSelectAnActionFirst=Por favor seleccione una acción primero
-SharePointRepository.PleaseSelectASiteFirst=Por favor, seleccione un sitio de primera
-SharePointRepository.AccessTokenCannotBeNull=Token de acceso no puede ser nulo
-SharePointRepository.MatchStringCannotBeEmpty=Cadena Partido no puede estar vacío
-SharePointRepository.MatchStringMustBeValidRegularExpression=Cadena de ajuste debe ser expresión regular válida
-SharePointRepository.InsertNewRuleBeforeRule=Inserte nueva regla antes de la regla #
-SharePointRepository.DeleteRule=eliminar regla#
-SharePointRepository.NewRule=Nueva regla:
-SharePointRepository.ResetRulePath=Restablecer Path Regla
-SharePointRepository.RemoveFromRulePath=Eliminar de regla de ruta
-SharePointRepository.AddSiteToRulePath=Agregar Sitio a regla de ruta
-SharePointRepository.AddLibraryToRulePath=Añadir Biblioteca de regla de ruta
-SharePointRepository.AddTextToRulePath=Añadir texto a la regla de ruta
-SharePointRepository.Enabled=Activado
-SharePointRepository.Disabled=Imposibilitado
-SharePointRepository.DeleteToken=eliminar símbolo #
-SharePointRepository.AddAccessToken=Añadir token de acceso
-SharePointRepository.InsertNewMetadataRuleBeforeRule=Inserte nueva norma de metadatos antes de la regla #
-SharePointRepository.DeleteMetadataRule=Eliminar regla de metadatos #
-SharePointRepository.include=incluir
-SharePointRepository.DeleteMetadataRule=Eliminar regla de metadatos #
-SharePointRepository.NoMetadataIncluded=Sin metadatos incluido
-SharePointRepository.AddRule=Añadir regla
-SharePointRepository.NewRule=Nueva regla:
-SharePointRepository.IncludeAllMetadata= Incluir todos los metadatos
-SharePointRepository.ResetMetadataRulePath=Restablecer Metadatos regla de ruta
-SharePointRepository.RemoveFromMetadataRulePath=Eliminar de Metadatos regla de ruta
-SharePointRepository.AddSiteToMetadataRulePath=Agregar Sitio a Metadatos regla de ruta
-SharePointRepository.SelectSite=-- Seleccione el sitio --
-SharePointRepository.AddLibraryToMetadataRulePath=Añadir Biblioteca de metadatos regla de ruta
-SharePointRepository.SelectLibrary=-- Seleccione la biblioteca --
-SharePointRepository.AddTextToMetadataRulePath=Añadir texto a Metadatos regla de ruta
-SharePointRepository.DeleteMapping=Suprima trazar un mapa #
-SharePointRepository.DeletePathMapping=Suprima Trazar un mapa de Camino
-SharePointRepository.Enabled2=Activado
-SharePointRepository.ProxyHost=Proxy host:
-SharePointRepository.ProxyPort=Puerto de proxy:
-SharePointRepository.ProxyUser=Nombre de usuario de proxy:
-SharePointRepository.ProxyPassword=contraseña del proxy:
-SharePointRepository.ProxyDomain=dominio Proxy:
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_ja_JP.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_ja_JP.properties
deleted file mode 100644
index 31969b4..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_ja_JP.properties
+++ /dev/null
@@ -1,156 +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.
-
-SharePointRepository.AuthorityTypeColon=Authority type:
-SharePointRepository.SharePoint=SharePoint
-SharePointRepository.ActiveDirectory=Active Directory
-
-SharePointRepository.List=一覧表
-SharePointRepository.AddList=一覧を追加します
-SharePointRepository.SelectList=一覧を選択
-SharePointRepository.AddListToRulePath=パスの規則にリストを追加
-SharePointRepository.PleaseSelectAListFirst=最初のリストを選択してください
-SharePointRepository.AddListToMetadataRulePath=メタデータ·ルールのパスに一覧を追加します
-
-SharePointRepository.AddToMappings=Add to mappings
-SharePointRepository.AddPathMapping=Add Path Mapping
-
-SharePointRepository.NoAccessTokensPresent=アクセストークンが存在しません
-SharePointRepository.NoAccessTokensSpecified=アクセストークンが未定義です
-SharePointRepository.Server=サーバ
-SharePointRepository.AuthorityType=Authority type
-SharePointRepository.Paths=パス
-SharePointRepository.Security=セキュリティ
-SharePointRepository.Metadata=メタデータ
-SharePointRepository.ServerSharePointVersion=サーバSharePointバージョン:
-SharePointRepository.ServerProtocol=サーバプロトコル:
-SharePointRepository.ServerName=サーバ名:
-SharePointRepository.ServerPort=サーバポート番号:
-SharePointRepository.SitePath=サイトパス:
-SharePointRepository.UserName=ユーザ名:
-SharePointRepository.Password=パスワード:
-SharePointRepository.SSLCertificateList=SSL認証一覧:
-SharePointRepository.NoCertificatesPresent=認証がありません
-SharePointRepository.Delete=削除
-SharePointRepository.DeleteCert=認証の削除
-SharePointRepository.Add=追加
-SharePointRepository.AddCert=認証の追加
-SharePointRepository.Parameters=引数:
-SharePointRepository.PathRules=パスのルール:
-SharePointRepository.PathMatch=パスの一致
-SharePointRepository.Type=タイプ
-SharePointRepository.Action=処理
-SharePointRepository.InsertNewRule=ルールの挿入
-SharePointRepository.Delete=削除
-SharePointRepository.DeleteRule=ルールの削除 #
-SharePointRepository.InsertNewRule=ルールの挿入
-SharePointRepository.NoDocumentsCurrentlyIncluded=含むドキュメントがありません
-SharePointRepository.AddNewRule=ルールの追加
-SharePointRepository.File=ファイル
-SharePointRepository.Library=ライブラリ
-SharePointRepository.Site=サイト
-SharePointRepository.Include=含む
-SharePointRepository.Exclude=除外
-SharePointRepository.AddSite=サイトの追加
-SharePointRepository.SelectSite=サイトの選択
-SharePointRepository.AddLibrary=ライブラリの追加
-SharePointRepository.SelectLibrary=ライブラリの選択
-SharePointRepository.AddText=テキストの追加
-SharePointRepository.Security2=セキュリティ:
-SharePointRepository.MetadataRules=メタデータルール:
-SharePointRepository.PathMatch=パスの一致
-SharePointRepository.Action=処理
-SharePointRepository.AllMetadata=すべてのメタデータ
-SharePointRepository.Fields=フィールド
-SharePointRepository.InsertNewRule=ルールの挿入
-SharePointRepository.AddNewRule=ルールの追加
-SharePointRepository.ResetPath=パスのリセット
-SharePointRepository.PathMetadata=パスメタデータ:
-SharePointRepository.AttributeName=属性名:
-SharePointRepository.NoMappingsSpecified=マッピングを指定してください
-SharePointRepository.MatchRegexp=正規表現:
-SharePointRepository.ReplaceString=置換文字列:
-SharePointRepository.PathRules=パスルール:
-SharePointRepository.PathMatch=パス一致
-SharePointRepository.RuleType=ルールタイプ
-SharePointRepository.file=ファイル
-SharePointRepository.NoDocumentsWillBeIncluded=ドキュメントは含まれません
-SharePointRepository.Metadata2=メタデータ:
-SharePointRepository.include2=含む
-SharePointRepository.NoMetadataWillBeIncluded=データデータは含まれません
-SharePointRepository.AccessToken=アクセストークン:
-SharePointRepository.PathMetadataAttributeName=パスメタデータ属性名:
-SharePointRepository.NoPathNameMetadataAttributeSpecified=path-nameメタデータ属性は指定されていません
-SharePointRepository.PathValueMapping=Path-valueマッピング:
-SharePointRepository.NoMappingsSpecified=マッピングが指定されていません
-SharePointRepository.ChooseACertificateFile=証明書ファイルを選択してください
-SharePointRepository.PleaseSupplyAValidNumber=数字を入力してください
-SharePointRepository.PleaseSpecifyAnyServerPathInformation=サーバ名ではなく、サイトパスにサーバパス情報を入力してください
-SharePointRepository.SitePathMustBeginWithWCharacter=サイトパスは文字「/」から始めてください
-SharePointRepository.SitePathCannotEndWithACharacter=サイトパスの未尾に文字「/」を使わないでください
-SharePointRepository.AValidSharePointUserNameHasTheForm=SharePointユーザ名は<ドメイン>\\<ユーザ>\で指定してください
-SharePointRepository.PleaseFillInASharePointServerName=SharePointサーバ名を入力してください
-SharePointRepository.PleaseSpecifyAnyServerPathInformationInTheSitePathField=サーバ名ではなく、サイトパスにサーバパス情報を入力してください
-SharePointRepository.PleaseSupplyASharePointPortNumber=SharePointポート番号を入力してください。デフォルト値を利用する場合は空白にしてください
-SharePointRepository.TheConnectionRequiresAValidSharePointUserName=コネクションのSharePointユーザ名は<ドメイン>\\<ユーザ>\形式で指定してください
-SharePointRepository.Certificate=証明証:
-SharePointRepository.PleaseSelectATypeFirst=タイプを選択してください
-SharePointRepository.PleaseSelectAnActionFirst=処理を選択してください
-SharePointRepository.PleaseSelectASiteFirst=サイトを選択してください
-SharePointRepository.PleaseSelectALibraryFirst=ライブラリを選択してください
-SharePointRepository.PleaseProvideMatchTextFirst=パターンテキストを入力してください
-SharePointRepository.PleaseSelectAnActionFirst=処理を選択してください
-SharePointRepository.PleaseSelectASiteFirst=サイトを選択してください
-SharePointRepository.AccessTokenCannotBeNull=アクセストークンを選択してください
-SharePointRepository.MatchStringCannotBeEmpty=パターン文字列を入力してください
-SharePointRepository.MatchStringMustBeValidRegularExpression=パターン文字列には正規表現を入力してください
-SharePointRepository.InsertNewRuleBeforeRule=Insert new rule before rule #
-SharePointRepository.DeleteRule=ルールを削除: #
-SharePointRepository.InsertNewRuleBeforeRule=ルールの前に新しいルールを挿入: #
-SharePointRepository.NewRule=新しいルール:
-SharePointRepository.ResetRulePath=ルールパスをリセット
-SharePointRepository.RemoveFromRulePath=ルールパスから削除
-SharePointRepository.AddSiteToRulePath=ルールパスにサイトを追加
-SharePointRepository.AddLibraryToRulePath=ルールパスにライブラリを追加
-SharePointRepository.AddTextToRulePath=ルールパスにテキストを追加
-SharePointRepository.Enabled=有効
-SharePointRepository.Disabled=無効
-SharePointRepository.DeleteToken=トークンを削除: #
-SharePointRepository.AddAccessToken=アクセストークを追加
-SharePointRepository.InsertNewMetadataRuleBeforeRule=ルールの前に新しいメタデータルールを挿入: #
-SharePointRepository.DeleteMetadataRule=Delete metadata rule #
-SharePointRepository.include=含む
-SharePointRepository.DeleteMetadataRule=メタデータルールを削除: #
-SharePointRepository.NoMetadataIncluded=メタデータが含まれていません
-SharePointRepository.AddRule=ルールを追加
-SharePointRepository.NewRule=新しいルール:
-SharePointRepository.IncludeAllMetadata= すべてのメタデータを含む
-SharePointRepository.ResetMetadataRulePath=メタデータルールパスをリセット
-SharePointRepository.RemoveFromMetadataRulePath=メタデータルールパスから削除
-SharePointRepository.AddSiteToMetadataRulePath=メタデータルールパスにサイトを追加
-SharePointRepository.SelectSite=-- サイトを選択してください --
-SharePointRepository.AddLibraryToMetadataRulePath=メタデータルールパスにライブラリを追加
-SharePointRepository.SelectLibrary=-- ライブラリを選択してください --
-SharePointRepository.AddTextToMetadataRulePath=メタデータルールパスにテキストを追加
-SharePointRepository.DeleteMapping=マップを削除: #
-SharePointRepository.DeletePathMapping=パスマップを削除
-SharePointRepository.Enabled2=有効
-
-SharePointRepository.ProxyHost=Proxy host:
-SharePointRepository.ProxyPort=Proxy port:
-SharePointRepository.ProxyUser=Proxy user name:
-SharePointRepository.ProxyPassword=Proxy password:
-SharePointRepository.ProxyDomain=Proxy domain:
-
diff --git a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_zh_CN.properties b/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_zh_CN.properties
deleted file mode 100644
index 0a8a3dd..0000000
--- a/connectors/sharepoint/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/sharepoint/common_zh_CN.properties
+++ /dev/null
@@ -1,155 +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.
-
-SharePointRepository.AuthorityTypeColon=权限类型:
-SharePointRepository.SharePoint=共享点
-SharePointRepository.ActiveDirectory=Active Directory
-
-SharePointRepository.List=列表
-SharePointRepository.AddList=添加列表
-SharePointRepository.SelectList=选择列表
-SharePointRepository.AddListToRulePath=添加列表到规则路径
-SharePointRepository.PleaseSelectAListFirst=请先选择列表
-SharePointRepository.AddListToMetadataRulePath=添加列表到元数据规则路径
-
-SharePointRepository.AddToMappings=添加到映射
-SharePointRepository.AddPathMapping=添加路径映射
-
-SharePointRepository.NoAccessTokensPresent=访问令牌不存在
-SharePointRepository.NoAccessTokensSpecified=访问令牌未指定
-SharePointRepository.Server=服务器
-SharePointRepository.AuthorityType=权限类型
-SharePointRepository.Paths=路径
-SharePointRepository.Security=安全
-SharePointRepository.Metadata=元数据
-SharePointRepository.ServerSharePointVersion=服务器共享点版本: 
-SharePointRepository.ServerProtocol=服务器协议: 
-SharePointRepository.ServerName=服务器名: 
-SharePointRepository.ServerPort=服务器端口号: 
-SharePointRepository.SitePath=网站路径: 
-SharePointRepository.UserName=用户名: 
-SharePointRepository.Password=密码: 
-SharePointRepository.SSLCertificateList=SSL证书列表: 
-SharePointRepository.NoCertificatesPresent=证书不存在
-SharePointRepository.Delete=删除
-SharePointRepository.DeleteCert=删除证书
-SharePointRepository.Add=添加
-SharePointRepository.AddCert=添加证书
-SharePointRepository.Parameters=参数: 
-SharePointRepository.PathRules=路径规则: 
-SharePointRepository.PathMatch=路径匹配
-SharePointRepository.Type=类型
-SharePointRepository.Action=动作
-SharePointRepository.InsertNewRule=插入新规则
-SharePointRepository.Delete=删除
-SharePointRepository.DeleteRule=删除规则 #
-SharePointRepository.InsertNewRule=插入新规则
-SharePointRepository.NoDocumentsCurrentlyIncluded=当前没有可包含的文档
-SharePointRepository.AddNewRule=添加新规则
-SharePointRepository.File=文件
-SharePointRepository.Library=库
-SharePointRepository.Site=网站
-SharePointRepository.Include=包含
-SharePointRepository.Exclude=排除
-SharePointRepository.AddSite=添加网站
-SharePointRepository.SelectSite=选择网站
-SharePointRepository.AddLibrary=添加库
-SharePointRepository.SelectLibrary=选择库
-SharePointRepository.AddText=添加文本
-SharePointRepository.Security2=安全: 
-SharePointRepository.MetadataRules=元数据规则: 
-SharePointRepository.PathMatch=路径匹配
-SharePointRepository.Action=动作
-SharePointRepository.AllMetadata=所有元数据
-SharePointRepository.Fields=字段
-SharePointRepository.InsertNewRule=插入规则
-SharePointRepository.AddNewRule=添加新规则
-SharePointRepository.ResetPath=重置路径
-SharePointRepository.PathMetadata=路径元数据: 
-SharePointRepository.AttributeName=属性名: 
-SharePointRepository.NoMappingsSpecified=映射未指定
-SharePointRepository.MatchRegexp=匹配正则表达式: 
-SharePointRepository.ReplaceString=替换字符串: 
-SharePointRepository.PathRules=路径规则: 
-SharePointRepository.PathMatch=路径匹配
-SharePointRepository.RuleType=规则类型
-SharePointRepository.file=文件
-SharePointRepository.NoDocumentsWillBeIncluded=没有可包含的文档
-SharePointRepository.Metadata2=元数据: 
-SharePointRepository.include2=包含
-SharePointRepository.NoMetadataWillBeIncluded=没有可包含的元数据
-SharePointRepository.AccessToken=访问令牌: 
-SharePointRepository.PathMetadataAttributeName=路径元数据属性名: 
-SharePointRepository.NoPathNameMetadataAttributeSpecified=路径名元数据属性未指定
-SharePointRepository.PathValueMapping=路径值映射: 
-SharePointRepository.NoMappingsSpecified=映射未指定
-SharePointRepository.ChooseACertificateFile=请选择证书文件
-SharePointRepository.PleaseSupplyAValidNumber=请输入有效的数字
-SharePointRepository.PleaseSpecifyAnyServerPathInformation=请在网站路径字段输入服务器路径信息,而不是服务器名
-SharePointRepository.SitePathMustBeginWithWCharacter=网站路径的第一个字符必须为‘/’
-SharePointRepository.SitePathCannotEndWithACharacter=网站路径的最后一个字符不能为‘/’
-SharePointRepository.AValidSharePointUserNameHasTheForm=共享点用户名需指定为 <域>\\<用户>\ 的格式
-SharePointRepository.PleaseFillInASharePointServerName=请输入共享点服务器名
-SharePointRepository.PleaseSpecifyAnyServerPathInformationInTheSitePathField=请在网站路径字段输入服务器路径信息,而不是服务器名
-SharePointRepository.PleaseSupplyASharePointPortNumber=请输入共享点端口号。如使用缺省值则设为空
-SharePointRepository.TheConnectionRequiresAValidSharePointUserName=连接的共享点用户名需指定为 <域>\\<用户>\ 的格式
-SharePointRepository.Certificate=证书: 
-SharePointRepository.PleaseSelectATypeFirst=请先选择类型
-SharePointRepository.PleaseSelectAnActionFirst=请先选择动作
-SharePointRepository.PleaseSelectASiteFirst=请先选择网站
-SharePointRepository.PleaseSelectALibraryFirst=请先选择库
-SharePointRepository.PleaseProvideMatchTextFirst=请先输入匹配文本
-SharePointRepository.PleaseSelectAnActionFirst=请先选择动作
-SharePointRepository.PleaseSelectASiteFirst=请先选择网站
-SharePointRepository.AccessTokenCannotBeNull=请选择访问令牌
-SharePointRepository.MatchStringCannotBeEmpty=请输入匹配字符串
-SharePointRepository.MatchStringMustBeValidRegularExpression=匹配字符串需为有效的正则表达式
-SharePointRepository.InsertNewRuleBeforeRule=在规则前插入新规则:  #
-SharePointRepository.DeleteRule=删除规则:  #
-SharePointRepository.InsertNewRuleBeforeRule=在规则前插入新规则:  #
-SharePointRepository.NewRule=新规则: 
-SharePointRepository.ResetRulePath=重置规则路径
-SharePointRepository.RemoveFromRulePath=从规则路径删除
-SharePointRepository.AddSiteToRulePath=添加网站到规则路径
-SharePointRepository.AddLibraryToRulePath=添加库到规则路径
-SharePointRepository.AddTextToRulePath=添加文本到规则路径
-SharePointRepository.Enabled=有效
-SharePointRepository.Disabled=无效
-SharePointRepository.DeleteToken=删除令牌:  #
-SharePointRepository.AddAccessToken=添加访问令牌
-SharePointRepository.InsertNewMetadataRuleBeforeRule=在规则前插入新元数据规则:  #
-SharePointRepository.DeleteMetadataRule=删除元数据规则 #
-SharePointRepository.include=包含
-SharePointRepository.DeleteMetadataRule=删除元数据规则:  #
-SharePointRepository.NoMetadataIncluded=没有可包含的元数据
-SharePointRepository.AddRule=添加规则
-SharePointRepository.NewRule=新规则: 
-SharePointRepository.IncludeAllMetadata=包含所有元数据
-SharePointRepository.ResetMetadataRulePath=重置元数据规则路径
-SharePointRepository.RemoveFromMetadataRulePath=从元数据规则路径删除
-SharePointRepository.AddSiteToMetadataRulePath=添加网站到元数据规则路径
-SharePointRepository.SelectSite=-- 请选择网站 --
-SharePointRepository.AddLibraryToMetadataRulePath=添加库到元数据规则路径
-SharePointRepository.SelectLibrary=-- 请选择库 --
-SharePointRepository.AddTextToMetadataRulePath=添加文本到元数据规则路径
-SharePointRepository.DeleteMapping=删除映射:  #
-SharePointRepository.DeletePathMapping=删除路径映射
-SharePointRepository.Enabled2=有效
-
-SharePointRepository.ProxyHost=Proxy host:
-SharePointRepository.ProxyPort=Proxy port:
-SharePointRepository.ProxyUser=Proxy user name:
-SharePointRepository.ProxyPassword=Proxy password:
-SharePointRepository.ProxyDomain=Proxy domain:
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration.js b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration.js
deleted file mode 100644
index d3fd88e..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration.js
+++ /dev/null
@@ -1,134 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  var i = 0;
-  var count = editconnection.dcrecord_count.value;
-  while (i < count)
-  {
-    var username = eval("editconnection.dcrecord_username_"+i+".value");
-    if (username == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AdministrativeUserNameCannotBeNull'))");
-      eval("editconnection.dcrecord_username_"+i+".focus()");
-      return false;
-    }
-    var authentication = eval("editconnection.dcrecord_authentication_"+i+".value");
-    if (authentication == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AuthenticationCannotBeNull'))");
-      eval("editconnection.dcrecord_authentication_"+i+".focus()");
-      return false;
-    }
-    i += 1;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.cachelifetime.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetimeCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelifetime.focus();
-    return false;
-  }
-  if (editconnection.cachelifetime.value != "" && !isInteger(editconnection.cachelifetime.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetimeMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelifetime.focus();
-    return false;
-  }
-  if (editconnection.cachelrusize.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSizeCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelrusize.focus();
-    return false;
-  }
-  if (editconnection.cachelrusize.value != "" && !isInteger(editconnection.cachelrusize.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSizeMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelrusize.focus();
-    return false;
-  }
-  return true;
-}
-
-function deleteDC(i)
-{
-  eval("editconnection.dcrecord_op_"+i+".value=\"Delete\"");
-  postFormSetAnchor("dcrecord");
-}
-
-function insertDC(i)
-{
-  if (editconnection.dcrecord_domaincontrollername.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.EnterADomainControllerServerName'))");
-    editconnection.dcrecord_domaincontrollername.focus();
-    return;
-  }
-  if (editconnection.dcrecord_username.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AdministrativeUserNameCannotBeNull'))");
-    editconnection.dcrecord_username.focus();
-    return;
-  }
-  if (editconnection.dcrecord_authentication.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AuthenticationCannotBeNull'))");
-    editconnection.dcrecord_authentication.focus();
-    return;
-  }
-  eval("editconnection.dcrecord_op_"+i+".value=\"Insert\"");
-  postFormSetAnchor("dcrecord_"+i);
-}
-
-function addDC()
-{
-  if (editconnection.dcrecord_domaincontrollername.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.EnterADomainControllerServerName'))");
-    editconnection.dcrecord_domaincontrollername.focus();
-    return;
-  }
-  if (editconnection.dcrecord_username.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AdministrativeUserNameCannotBeNull'))");
-    editconnection.dcrecord_username.focus();
-    return;
-  }
-  if (editconnection.dcrecord_authentication.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AuthenticationCannotBeNull'))");
-    editconnection.dcrecord_authentication.focus();
-    return;
-  }
-  editconnection.dcrecord_op.value="Add";
-  postFormSetAnchor("dcrecord");
-}
-
-//-->
-</script>
-
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration_Cache.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration_Cache.html
deleted file mode 100644
index 384abd1..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration_Cache.html
+++ /dev/null
@@ -1,37 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointAuthority.Cache'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetime'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/> $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.minutes'))</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSize'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/>
-<input type="hidden" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration_DomainController.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration_DomainController.html
deleted file mode 100644
index d5da69f..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editADConfiguration_DomainController.html
+++ /dev/null
@@ -1,132 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointAuthority.DomainController'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.DomainControllers'))</td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.DomainControllerName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.DomainSuffix'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.AdministrativeUserName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.AdministrativePassword'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Authentication'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.LoginNameADAttribute'))</td>
-        </tr>
-  #set($dccounter = 0)
-  #foreach($domaincontroller in $DOMAINCONTROLLERS)
-    #if(($dccounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <a name="dcrecord_$dccounter">
-              <nobr>
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.Delete'))"
-                alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.DeleteRuleNumber'))$dccounter" onclick="javascript:deleteDC($dccounter);"/>
-                <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.InsertBefore'))"
-                alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.InsertBeforeRuleNumber'))$dccounter" onclick="javascript:insertDC($dccounter);"/>
-              </nobr>
-            </a>
-            <input type="hidden" name="dcrecord_op_$dccounter" value="Continue"/>
-            <input type="hidden" name="dcrecord_domaincontrollername_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('DOMAINCONTROLLER'))"/>
-          </td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('DOMAINCONTROLLER'))</nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_suffix_$dccounter" type="text" size="10" value="$Encoder.attributeEscape($domaincontroller.get('SUFFIX'))"/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_username_$dccounter" type="text" size="10" value="$Encoder.attributeEscape($domaincontroller.get('USERNAME'))"/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_password_$dccounter" type="password" size="6" value="$Encoder.attributeEscape($domaincontroller.get('PASSWORD'))"/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_authentication_$dccounter" type="text" size="10" value="$Encoder.attributeEscape($domaincontroller.get('AUTHENTICATION'))"/></nobr></td>
-          <td class="formcolumncell">
-            <nobr>
-              <select name="dcrecord_userACLsUsername_$dccounter">
-    #if($domaincontroller.get('USERACLsUSERNAME') == 'sAMAccountName')
-                <option value="sAMAccountName" selected="true">
-    #else
-                <option value="sAMAccountName">
-    #end
-                  sAMAccountName
-                </option>
-    #if($domaincontroller.get('USERACLsUSERNAME') == 'userPrincipalName')
-                <option value="userPrincipalName" selected="true">
-    #else
-                <option value="userPrincipalName">
-    #end
-                  userPrincipalName
-                </option>
-              </select>
-            </nobr>
-          </td>
-        </tr>
-    #set($dccounter = $dccounter + 1)
-  #end
-        <tr class="formrow"><td class="formseparator" colspan="7"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <a name="dcrecord">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.AddToEnd'))"
-              alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.AddRuleToEnd'))" onclick="javascript:addDC();"/>
-            </a>
-            <input type="hidden" name="dcrecord_count" value="$dccounter"/>
-            <input type="hidden" name="dcrecord_op" value="Continue"/>
-          </td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_domaincontrollername" type="text" size="32" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_suffix" type="text" size="10" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_username" type="text" size="10" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_password" type="password" size="6" value=""/></nobr></td>
-          <td class="formcolumncell"><nobr><input name="dcrecord_authentication" type="text" size="10" value="DIGEST-MD5 GSSAPI"/></nobr></td>
-          <td class="formcolumncell">
-            <nobr>
-              <select name="dcrecord_userACLsUsername">
-                <option value="sAMAccountName" selected="true">
-                  sAMAccountName
-                </option>
-                <option value="userPrincipalName">
-                  userPrincipalName
-                </option>
-              </select>
-            </nobr>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($dccounter = 0)
-  #foreach($domaincontroller in $DOMAINCONTROLLERS)
-
-<input type="hidden" name="dcrecord_suffix_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('SUFFIX'))"/>
-<input type="hidden" name="dcrecord_domaincontrollername_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('DOMAINCONTROLLER'))"/>
-<input type="hidden" name="dcrecord_username_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('USERNAME'))"/>
-<input type="hidden" name="dcrecord_password_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('PASSWORD'))"/>
-<input type="hidden" name="dcrecord_authentication_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('AUTHENTICATION'))"/>
-<input type="hidden" name="dcrecord_userACLsUsername_$dccounter" value="$Encoder.attributeEscape($domaincontroller.get('USERACLsUSERNAME'))"/>
-
-    #set($dccounter = $dccounter + 1)
-  #end
-
-<input type="hidden" name="dcrecord_count" value="$dccounter"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration.js b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration.js
deleted file mode 100644
index 76f5818..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration.js
+++ /dev/null
@@ -1,161 +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.
--->
-
-<script type="text/javascript">
-<!--
-function checkConfig()
-{
-  if (editconnection.serverPort.value != "" && !isInteger(editconnection.serverPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.PleaseSupplyAValidNumber'))");
-    editconnection.serverPort.focus();
-    return false;
-  }
-  if (editconnection.proxyport.value != "" && !isInteger(editconnection.proxyport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.PleaseSupplyAValidNumber'))");
-    editconnection.proxyport.focus();
-    return false;
-  }
-  if (editconnection.serverName.value.indexOf("/") >= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.PleaseSpecifyAnyServerPathInformation'))");
-    editconnection.serverName.focus();
-    return false;
-  }
-  var svrloc = editconnection.serverLocation.value;
-  if (svrloc != "" && svrloc.charAt(0) != "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.SitePathMustBeginWithWCharacter'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (svrloc != "" && svrloc.charAt(svrloc.length - 1) == "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.SitePathCannotEndWithACharacter'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (editconnection.serverUserName.value != "" && editconnection.serverUserName.value.indexOf("\\") <= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.AValidSharePointUserNameHasTheForm'))");
-    editconnection.serverUserName.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.cachelifetime.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetimeCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelifetime.focus();
-    return false;
-  }
-  if (editconnection.cachelifetime.value != "" && !isInteger(editconnection.cachelifetime.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetimeMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelifetime.focus();
-    return false;
-  }
-  if (editconnection.cachelrusize.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSizeCannotBeNull'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelrusize.focus();
-    return false;
-  }
-  if (editconnection.cachelrusize.value != "" && !isInteger(editconnection.cachelrusize.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSizeMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Cache'))");
-    editconnection.cachelrusize.focus();
-    return false;
-  }
-  if (editconnection.serverName.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.PleaseFillInASharePointServerName'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Server'))");
-    editconnection.serverName.focus();
-    return false;
-  }
-  if (editconnection.serverName.value.indexOf("/") >= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.PleaseSpecifyAnyServerPathInformationInTheSitePathField'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Server'))");
-    editconnection.serverName.focus();
-    return false;
-  }
-  var svrloc = editconnection.serverLocation.value;
-  if (svrloc != "" && svrloc.charAt(0) != "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.SitePathMustBeginWithWCharacter'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Server'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (svrloc != "" && svrloc.charAt(svrloc.length - 1) == "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.SitePathCannotEndWithACharacter'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Server'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (editconnection.serverPort.value != "" && !isInteger(editconnection.serverPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.PleaseSupplyASharePointPortNumber'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Server'))");
-    editconnection.serverPort.focus();
-    return false;
-  }
-  if (editconnection.serverUserName.value != "" && editconnection.serverUserName.value.indexOf("\\") <= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.TheConnectionRequiresAValidSharePointUserName'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.Server'))");
-    editconnection.serverUserName.focus();
-    return false;
-  }
-  return true;
-}
-
-function ShpDeleteCertificate(aliasName)
-{
-  editconnection.shpkeystorealias.value = aliasName;
-  editconnection.configop.value = "Delete";
-  postForm();
-}
-
-function ShpAddCertificate()
-{
-  if (editconnection.shpcertificate.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointAuthority.ChooseACertificateFile'))");
-    editconnection.shpcertificate.focus();
-  }
-  else
-  {
-    editconnection.configop.value = "Add";
-    postForm();
-  }
-}
-
-//-->
-</script>
-
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration_Cache.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration_Cache.html
deleted file mode 100644
index 384abd1..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration_Cache.html
+++ /dev/null
@@ -1,37 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointAuthority.Cache'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetime'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/> $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.minutes'))</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSize'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/></td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="cachelifetime" value="$Encoder.attributeEscape($CACHELIFETIME)"/>
-<input type="hidden" name="cachelrusize" value="$Encoder.attributeEscape($CACHELRUSIZE)"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration_Server.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration_Server.html
deleted file mode 100644
index b0746cb..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/editConfiguration_Server.html
+++ /dev/null
@@ -1,178 +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.
--->
-
-#if($KEYSTORE)
-<input type="hidden" name="keystoredata" value="$Encoder.attributeEscape($KEYSTORE)"/>
-#end
-
-#if($TabName == $ResourceBundle.getString('SharePointAuthority.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerSharePointVersion'))</nobr></td>
-    <td class="value">
-      <select name="serverVersion">
-  #if($SERVERVERSION == '2.0')
-        <option value="2.0" selected="true">SharePoint Services 2.0 (2003)</option>
-  #else
-        <option value="2.0">SharePoint Services 2.0 (2003)</option>
-  #end
-  #if($SERVERVERSION == '3.0')
-        <option value="3.0" selected="true">SharePoint Services 3.0 (2007)</option>
-  #else
-        <option value="3.0">SharePoint Services 3.0 (2007)</option>
-  #end
-  #if($SERVERVERSION == '4.0')
-        <option value="4.0" selected="true">SharePoint Services 4.0 (2010)</option>
-  #else
-        <option value="4.0">SharePoint Services 4.0 (2010)</option>
-  #end
-  #if($SERVERVERSION == '5.0')
-        <option value="5.0" selected="true">SharePoint Services 5.0 (2013)</option>
-  #else
-        <option value="5.0">SharePoint Services 5.0 (2013)</option>
-  #end
-  #if($SERVERVERSION == '6.0')
-        <option value="6.0" selected="true">SharePoint Services 6.0 (2016)</option>
-  #else
-        <option value="6.0">SharePoint Services 6.0 (2016)</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerClaimSpace'))</nobr></td>
-    <td class="value">
-      <select name="serverClaimSpace">
-  #if($SERVERCLAIMSPACE == 'false')
-        <option value="false" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Disabled'))</option>
-  #else
-        <option value="false">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Disabled'))</option>
-  #end
-  #if($SERVERCLAIMSPACE == 'true')
-        <option value="true" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Enabled'))</option>
-  #else
-        <option value="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Enabled'))</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerProtocol'))</nobr></td>
-    <td class="value">
-      <select name="serverProtocol">
-  #if($SERVERPROTOCOL == 'http')
-        <option value="http" selected="true">http</option>
-  #else
-        <option value="http">http</option>
-  #end
-  #if($SERVERPROTOCOL == 'https')
-        <option value="https" selected="true">https</option>
-  #else
-        <option value="https">https</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerName'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="serverName" value="$Encoder.attributeEscape($SERVERNAME)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerPort'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="serverPort" value="$SERVERPORT"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.SitePath'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="serverLocation" value="$Encoder.attributeEscape($SERVERLOCATION)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.UserName'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="serverUserName" value="$Encoder.attributeEscape($SERVERUSERNAME)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Password'))</nobr></td>
-    <td class="value"><input type="password" size="32" name="serverPassword" value="$Encoder.attributeEscape($SERVERPASSWORD)"/></td>
-  </tr>
-    <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyHost'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyPort'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="proxyport" value="$PROXYPORT"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyUser'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="proxyuser" value="$Encoder.attributeEscape($PROXYUSER)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyPassword'))</nobr></td>
-    <td class="value"><input type="password" size="32" name="proxypassword" value="$Encoder.attributeEscape($PROXYPASSWORD)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyDomain'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="proxydomain" value="$Encoder.attributeEscape($PROXYDOMAIN)"/></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.SSLCertificateList'))</nobr></td>
-    <td class="value">
-      <input type="hidden" name="configop" value="Continue"/>
-      <input type="hidden" name="shpkeystorealias" value=""/>
-      <table class="displaytable">
-  #if($CERTIFICATELIST.size() == 0)
-        <tr><td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.NoCertificatesPresent'))</td></tr>
-  #else
-    #foreach($certificate in $CERTIFICATELIST)
-        <tr>
-          <td class="description">
-            <input type="button" onclick='Javascript:ShpDeleteCertificate("$Encoder.attributeJavascriptEscape($certificate.get('ALIAS'))")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.DeleteCert'))$Encoder.attributeEscape($certificate.get('ALIAS'))" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.Delete'))"/>
-          </td>
-          <td class="value">
-            $Encoder.bodyEscape($certificate.get('DESCRIPTION'))
-          </td>
-        </tr>
-    #end
-  #end
-      </table>
-      <input type="button" onclick='Javascript:ShpAddCertificate()' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.AddCert'))" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointAuthority.Add'))"/>&nbsp;
-      $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Certificate'))&nbsp;
-      <input name="shpcertificate" size="50" type="file"/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="serverVersion" value="$SERVERVERSION"/>
-<input type="hidden" name="serverClaimSpace" value="$SERVERCLAIMSPACE"/>
-<input type="hidden" name="serverProtocol" value="$SERVERPROTOCOL"/>
-<input type="hidden" name="serverName" value="$Encoder.attributeEscape($SERVERNAME)"/>
-<input type="hidden" name="serverPort" value="$SERVERPORT"/>
-<input type="hidden" name="serverLocation" value="$Encoder.attributeEscape($SERVERLOCATION)"/>
-<input type="hidden" name="serverUserName" value="$Encoder.attributeEscape($SERVERUSERNAME)"/>
-<input type="hidden" name="serverPassword" value="$Encoder.attributeEscape($SERVERPASSWORD)"/>
-<input type="hidden" name="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)"/>
-<input type="hidden" name="proxyport" value="$Encoder.attributeEscape($PROXYPORT)"/>
-<input type="hidden" name="proxyuser" value="$Encoder.attributeEscape($PROXYUSER)"/>
-<input type="hidden" name="proxypassword" value="$Encoder.attributeEscape($PROXYPASSWORD)"/>
-<input type="hidden" name="proxydomain" value="$Encoder.attributeEscape($PROXYDOMAIN)"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/viewADConfiguration.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/viewADConfiguration.html
deleted file mode 100644
index 666c2e3..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/viewADConfiguration.html
+++ /dev/null
@@ -1,62 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.DomainControllers'))</td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.DomainControllerName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.DomainSuffix'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.AdministrativeUserName'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.AdministrativePassword'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Authentication'))</td>
-          <td class="formcolumnheader">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.LoginNameADAttribute'))</td>
-        </tr>
-#set($dccounter = 0)
-#foreach($domaincontroller in $DOMAINCONTROLLERS)
-  #if(($dccounter % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('DOMAINCONTROLLER'))</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('SUFFIX'))</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('USERNAME'))</nobr></td>
-          <td class="formcolumncell"><nobr>******</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('AUTHENTICATION'))</nobr></td>
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($domaincontroller.get('USERACLsUSERNAME'))</nobr></td>
-        </tr>
-  #set($dccounter = $dccounter + 1)
-#end
-      </table>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetime'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CACHELIFETIME)</nobr> $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.minutes'))</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSize'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CACHELRUSIZE)</nobr></td>
-  </tr>
-  
-</table>
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/viewConfiguration.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/viewConfiguration.html
deleted file mode 100644
index 9f9dda9..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/authorities/authorities/sharepoint/viewConfiguration.html
+++ /dev/null
@@ -1,166 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerSharePointVersion'))</nobr></td>
-    <td class="value">
-  #if($SERVERVERSION == '2.0')
-        SharePoint Services 2.0 (2003)
-  #elseif($SERVERVERSION == '3.0')
-        SharePoint Services 3.0 (2007)
-  #elseif($SERVERVERSION == '4.0')
-        SharePoint Services 4.0 (2010)
-  #elseif($SERVERVERSION == '5.0')
-        SharePoint Services 5.0 (2013)
-  #elseif($SERVERVERSION == '6.0')
-        SharePoint Services 6.0 (2016)
-  #else
-        Unknown
-  #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerClaimSpace'))</nobr></td>
-    <td class="value">
-  #if($SERVERCLAIMSPACE == 'false')
-        $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Disabled'))
-  #elseif($SERVERCLAIMSPACE == 'true')
-        $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Enabled'))
-  #else
-        Unknown
-  #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerProtocol'))</nobr></td>
-    <td class="value">
-      $SERVERPROTOCOL
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerName'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($SERVERNAME)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ServerPort'))</nobr></td>
-    <td class="value">
-      $SERVERPORT
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.SitePath'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($SERVERLOCATION)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.UserName'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($SERVERUSERNAME)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Password'))</nobr></td>
-    <td class="value">
-      ********
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyHost'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($PROXYHOST)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyPort'))</nobr></td>
-    <td class="value">
-      $PROXYPORT
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyUser'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($PROXYUSER)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyPassword'))</nobr></td>
-    <td class="value">
-      ********
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ProxyDomain'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($PROXYDOMAIN)
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.SSLCertificateList'))</nobr></td>
-    <td class="value">
-      <table class="displaytable">
-  #if($CERTIFICATELIST.size() == 0)
-        <tr><td class="message" colspan="1">$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.NoCertificatesPresent'))</td></tr>
-  #else
-    #foreach($certificate in $CERTIFICATELIST)
-        <tr>
-          <td class="value">
-            $Encoder.bodyEscape($certificate.get('DESCRIPTION'))
-          </td>
-        </tr>
-    #end
-  #end
-      </table>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.AuthorizationModelColon'))</nobr></td>
-    <td class="value">
-#if($AUTHORIZATIONMODEL == 'Classic')
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.Classic'))</nobr>
-#elseif($AUTHORIZATIONMODEL == 'ClaimSpace')
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.ClaimSpace'))</nobr>
-#else
-      Unknown
-#end
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLifetime'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CACHELIFETIME)</nobr> $Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.minutes'))</td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointAuthority.CacheLRUSize'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($CACHELRUSIZE)</nobr></td>
-  </tr>
-  
-</table>
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration.js b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration.js
deleted file mode 100644
index 0001afe..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration.js
+++ /dev/null
@@ -1,133 +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.
--->
-
-<script type="text/javascript">
-<!--
-function ShpDeleteCertificate(aliasName)
-{
-  editconnection.shpkeystorealias.value = aliasName;
-  editconnection.configop.value = "Delete";
-  postForm();
-}
-
-function ShpAddCertificate()
-{
-  if (editconnection.shpcertificate.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.ChooseACertificateFile'))");
-    editconnection.shpcertificate.focus();
-  }
-  else
-  {
-    editconnection.configop.value = "Add";
-    postForm();
-  }
-}
-
-function checkConfig()
-{
-  if (editconnection.serverPort.value != "" && !isInteger(editconnection.serverPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSupplyAValidNumber'))");
-    editconnection.serverPort.focus();
-    return false;
-  }
-  if (editconnection.proxyport.value != "" && !isInteger(editconnection.proxyport.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSupplyAValidNumber'))");
-    editconnection.proxyport.focus();
-    return false;
-  }
-  if (editconnection.serverName.value.indexOf("/") >= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSpecifyAnyServerPathInformation'))");
-    editconnection.serverName.focus();
-    return false;
-  }
-  var svrloc = editconnection.serverLocation.value;
-  if (svrloc != "" && svrloc.charAt(0) != "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.SitePathMustBeginWithWCharacter'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (svrloc != "" && svrloc.charAt(svrloc.length - 1) == "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.SitePathCannotEndWithACharacter'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (editconnection.serverUserName.value != "" && editconnection.serverUserName.value.indexOf("\\") <= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.AValidSharePointUserNameHasTheForm'))");
-    editconnection.serverUserName.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkConfigForSave() 
-{
-  if (editconnection.serverName.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseFillInASharePointServerName'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.Server'))");
-    editconnection.serverName.focus();
-    return false;
-  }
-  if (editconnection.serverName.value.indexOf("/") >= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSpecifyAnyServerPathInformationInTheSitePathField'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.Server'))");
-    editconnection.serverName.focus();
-    return false;
-  }
-  var svrloc = editconnection.serverLocation.value;
-  if (svrloc != "" && svrloc.charAt(0) != "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.SitePathMustBeginWithWCharacter'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.Server'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (svrloc != "" && svrloc.charAt(svrloc.length - 1) == "/")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.SitePathCannotEndWithACharacter'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.Server'))");
-    editconnection.serverLocation.focus();
-    return false;
-  }
-  if (editconnection.serverPort.value != "" && !isInteger(editconnection.serverPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSupplyASharePointPortNumber'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.Server'))");
-    editconnection.serverPort.focus();
-    return false;
-  }
-  if (editconnection.serverUserName.value != "" && editconnection.serverUserName.value.indexOf("\\") <= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.TheConnectionRequiresAValidSharePointUserName'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.Server'))");
-    editconnection.serverUserName.focus();
-    return false;
-  }
-  return true;
-}
-
-//-->
-</script>
-
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration_AuthorityType.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration_AuthorityType.html
deleted file mode 100644
index 16c249c..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration_AuthorityType.html
+++ /dev/null
@@ -1,43 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointRepository.AuthorityType'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.AuthorityTypeColon'))</nobr></td>
-    <td class="value">
-  #if($AUTHORITYTYPE == 'SharePoint')
-      <input type="radio" name="authorityType" value="SharePoint" checked="true"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SharePoint'))</nobr></input>
-  #else
-      <input type="radio" name="authorityType" value="SharePoint"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SharePoint'))</nobr></input>
-  #end
-  #if($AUTHORITYTYPE == 'ActiveDirectory')
-      <input type="radio" name="authorityType" value="ActiveDirectory" checked="true"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ActiveDirectory'))</nobr></input>
-  #else
-      <input type="radio" name="authorityType" value="ActiveDirectory"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ActiveDirectory'))</nobr></input>
-  #end
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="authorityType" value="$AUTHORITYTYPE"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration_Server.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration_Server.html
deleted file mode 100644
index 80e76e6..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editConfiguration_Server.html
+++ /dev/null
@@ -1,160 +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.
--->
-
-#if($KEYSTORE)
-<input type="hidden" name="keystoredata" value="$Encoder.attributeEscape($KEYSTORE)"/>
-#end
-
-#if($TabName == $ResourceBundle.getString('SharePointRepository.Server'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerSharePointVersion'))</nobr></td>
-    <td class="value">
-      <select name="serverVersion">
-  #if($SERVERVERSION == '2.0')
-        <option value="2.0" selected="true">SharePoint Services 2.0 (2003)</option>
-  #else
-        <option value="2.0">SharePoint Services 2.0 (2003)</option>
-  #end
-  #if($SERVERVERSION == '3.0')
-        <option value="3.0" selected="true">SharePoint Services 3.0 (2007)</option>
-  #else
-        <option value="3.0">SharePoint Services 3.0 (2007)</option>
-  #end
-  #if($SERVERVERSION == '4.0')
-        <option value="4.0" selected="true">SharePoint Services 4.0 (2010)</option>
-  #else
-        <option value="4.0">SharePoint Services 4.0 (2010)</option>
-  #end
-  #if($SERVERVERSION == '5.0')
-        <option value="5.0" selected="true">SharePoint Services 5.0 (2013)</option>
-  #else
-        <option value="5.0">SharePoint Services 5.0 (2013)</option>
-  #end
-  #if($SERVERVERSION == '6.0')
-        <option value="6.0" selected="true">SharePoint Services 6.0 (2016)</option>
-  #else
-        <option value="6.0">SharePoint Services 6.0 (2016)</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerProtocol'))</nobr></td>
-    <td class="value">
-      <select name="serverProtocol">
-  #if($SERVERPROTOCOL == 'http')
-        <option value="http" selected="true">http</option>
-  #else
-        <option value="http">http</option>
-  #end
-  #if($SERVERPROTOCOL == 'https')
-        <option value="https" selected="true">https</option>
-  #else
-        <option value="https">https</option>
-  #end
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerName'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="serverName" value="$Encoder.attributeEscape($SERVERNAME)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerPort'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="serverPort" value="$SERVERPORT"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SitePath'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="serverLocation" value="$Encoder.attributeEscape($SERVERLOCATION)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.UserName'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="serverUserName" value="$Encoder.attributeEscape($SERVERUSERNAME)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Password'))</nobr></td>
-    <td class="value"><input type="password" size="32" name="serverPassword" value="$Encoder.attributeEscape($SERVERPASSWORD)"/></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyHost'))</nobr></td>
-    <td class="value"><input type="text" size="64" name="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyPort'))</nobr></td>
-    <td class="value"><input type="text" size="5" name="proxyport" value="$PROXYPORT"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyUser'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="proxyuser" value="$Encoder.attributeEscape($PROXYUSER)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyPassword'))</nobr></td>
-    <td class="value"><input type="password" size="32" name="proxypassword" value="$Encoder.attributeEscape($PROXYPASSWORD)"/></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyDomain'))</nobr></td>
-    <td class="value"><input type="text" size="32" name="proxydomain" value="$Encoder.attributeEscape($PROXYDOMAIN)"/></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SSLCertificateList'))</nobr></td>
-    <td class="value">
-      <input type="hidden" name="configop" value="Continue"/>
-      <input type="hidden" name="shpkeystorealias" value=""/>
-      <table class="displaytable">
-  #if($CERTIFICATELIST.size() == 0)
-        <tr><td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoCertificatesPresent'))</td></tr>
-  #else
-    #foreach($certificate in $CERTIFICATELIST)
-        <tr>
-          <td class="description">
-            <input type="button" onclick='Javascript:ShpDeleteCertificate("$Encoder.attributeJavascriptEscape($certificate.get('ALIAS'))")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.DeleteCert'))$Encoder.attributeEscape($certificate.get('ALIAS'))" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.Delete'))"/>
-          </td>
-          <td class="value">
-            $Encoder.bodyEscape($certificate.get('DESCRIPTION'))
-          </td>
-        </tr>
-    #end
-  #end
-      </table>
-      <input type="button" onclick='Javascript:ShpAddCertificate()' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddCert'))" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.Add'))"/>&nbsp;
-      $Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Certificate'))&nbsp;
-      <input name="shpcertificate" size="50" type="file"/>
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="serverProtocol" value="$SERVERPROTOCOL"/>
-<input type="hidden" name="serverName" value="$Encoder.attributeEscape($SERVERNAME)"/>
-<input type="hidden" name="serverPort" value="$SERVERPORT"/>
-<input type="hidden" name="serverLocation" value="$Encoder.attributeEscape($SERVERLOCATION)"/>
-<input type="hidden" name="serverUserName" value="$Encoder.attributeEscape($SERVERUSERNAME)"/>
-<input type="hidden" name="serverPassword" value="$Encoder.attributeEscape($SERVERPASSWORD)"/>
-<input type="hidden" name="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)"/>
-<input type="hidden" name="proxyport" value="$Encoder.attributeEscape($PROXYPORT)"/>
-<input type="hidden" name="proxyuser" value="$Encoder.attributeEscape($PROXYUSER)"/>
-<input type="hidden" name="proxypassword" value="$Encoder.attributeEscape($PROXYPASSWORD)"/>
-<input type="hidden" name="proxydomain" value="$Encoder.attributeEscape($PROXYDOMAIN)"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification.js b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification.js
deleted file mode 100644
index f846d0c..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification.js
+++ /dev/null
@@ -1,192 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SeqNum}_SpecRuleAddPath(anchorvalue)
-{
-  if (editjob.s${SeqNum}_spectype.value=="")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectATypeFirst'))");
-    editjob.s${SeqNum}_spectype.focus();
-  }
-  else if (editjob.s${SeqNum}_specflavor.value=="")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectAnActionFirst'))");
-    editjob.s${SeqNum}_specflavor.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_specop","Add",anchorvalue);
-}
-  
-function s${SeqNum}_SpecPathReset(anchorvalue)
-{
-  SpecOp("specpathop","Reset",anchorvalue);
-}
-  
-function s${SeqNum}_SpecPathAppendSite(anchorvalue)
-{
-  if (editjob.s${SeqNum}_specsite.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectASiteFirst'))");
-    editjob.s${SeqNum}_specsite.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_specpathop","AppendSite",anchorvalue);
-}
-
-function s${SeqNum}_SpecPathAppendLibrary(anchorvalue)
-{
-  if (editjob.s${SeqNum}_speclibrary.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectALibraryFirst'))");
-    editjob.s${SeqNum}_speclibrary.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_specpathop","AppendLibrary",anchorvalue);
-}
-
-function s${SeqNum}_SpecPathAppendList(anchorvalue)
-{
-  if (editjob.s${SeqNum}_speclist.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectAListFirst'))");
-    editjob.s${SeqNum}_speclist.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_specpathop","AppendList",anchorvalue);
-}
-
-function s${SeqNum}_SpecPathAppendText(anchorvalue)
-{
-  if (editjob.s${SeqNum}_specmatch.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseProvideMatchTextFirst'))");
-    editjob.s${SeqNum}_specmatch.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_specpathop","AppendText",anchorvalue);
-}
-
-function s${SeqNum}_SpecPathRemove(anchorvalue)
-{
-  s${SeqNum}_SpecOp("s${SeqNum}_specpathop","Remove",anchorvalue);
-}
-
-function s${SeqNum}_MetaRuleAddPath(anchorvalue)
-{
-  if (editjob.s${SeqNum}_metaflavor.value=="")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectAnActionFirst'))");
-    editjob.s${SeqNum}_metaflavor.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_metaop","Add",anchorvalue);
-}
-
-function s${SeqNum}_MetaPathReset(anchorvalue)
-{
-  s${SeqNum}_SpecOp("s${SeqNum}_metapathop","Reset",anchorvalue);
-}
-  
-function s${SeqNum}_MetaPathAppendSite(anchorvalue)
-{
-  if (editjob.s${SeqNum}_metasite.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectASiteFirst'))");
-    editjob.s${SeqNum}_metasite.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_metapathop","AppendSite",anchorvalue);
-}
-
-function s${SeqNum}_MetaPathAppendLibrary(anchorvalue)
-{
-  if (editjob.s${SeqNum}_metalibrary.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectALibraryFirst'))");
-    editjob.s${SeqNum}_metalibrary.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_metapathop","AppendLibrary",anchorvalue);
-}
-
-function s${SeqNum}_MetaPathAppendList(anchorvalue)
-{
-  if (editjob.s${SeqNum}_metalist.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseSelectAListFirst'))");
-    editjob.s${SeqNum}_metalist.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_metapathop","AppendList",anchorvalue);
-}
-
-function s${SeqNum}_MetaPathAppendText(anchorvalue)
-{
-  if (editjob.s${SeqNum}_metamatch.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.PleaseProvideMatchTextFirst'))");
-    editjob.s${SeqNum}_metamatch.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_metapathop","AppendText",anchorvalue);
-}
-
-function s${SeqNum}_MetaPathRemove(anchorvalue)
-{
-  s${SeqNum}_SpecOp("s${SeqNum}_metapathop","Remove",anchorvalue);
-}
-
-function s${SeqNum}_SpecAddAccessToken(anchorvalue)
-{
-  if (editjob.s${SeqNum}_spectoken.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.AccessTokenCannotBeNull'))");
-    editjob.s${SeqNum}_spectoken.focus();
-  }
-  else
-    s${SeqNum}_SpecOp("s${SeqNum}_accessop","Add",anchorvalue);
-}
-
-function s${SeqNum}_SpecAddMapping(anchorvalue)
-{
-  if (editjob.s${SeqNum}_specmatch.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.MatchStringCannotBeEmpty'))");
-    editjob.s${SeqNum}_specmatch.focus();
-    return;
-  }
-  if (!isRegularExpression(editjob.s${SeqNum}_specmatch.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SharePointRepository.MatchStringMustBeValidRegularExpression'))");
-    editjob.s${SeqNum}_specmatch.focus();
-    return;
-  }
-  s${SeqNum}_SpecOp("s${SeqNum}_specmappingop","Add",anchorvalue);
-}
-
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-//-->
-</script>
-
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Metadata.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Metadata.html
deleted file mode 100644
index aa72095..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Metadata.html
+++ /dev/null
@@ -1,313 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointRepository.Metadata') && ${SeqNum} == ${SelectedNum})
-
-<input type="hidden" name="s${SeqNum}_specmappingcount" value="$MAPLIST.size()"/>
-<input type="hidden" name="s${SeqNum}_specmappingop" value=""/>
-
-<table class="displaytable">
-<tr><td class="separator" colspan="4"><hr/></td></tr>
-<tr>
-  <td class="description" colspan="1"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.MetadataRules'))</nobr></td>
-    <td class="boxcell" colspan="3">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathMatch'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Action'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.AllMetadata'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Fields'))</nobr></td>
-        </tr>
-
-  #set($rulecounter = 0)
-  #set($rownumber = 0)
-  #foreach($metadatarule in $METADATARULES)
-
-    #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_meta_$rulecounter"/>
-              <input type="hidden" name="s${SeqNum}_metaop_$rulecounter" value=""/>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.InsertNewRule'))" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_metaop_$rulecounter","Insert Here","s${SeqNum}_meta_$rulecounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.InsertNewMetadataRuleBeforeRule'))$rulecounter"/>
-            </nobr>
-          </td>
-          <td class="formcolumncell" colspan="4"></td>
-        </tr>
-
-    #set($rownumber = $rownumber + 1)
-    
-    #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <nobr>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.Delete'))" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_metaop_$rulecounter","Delete","meta_$rulecounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.DeleteMetadataRule'))$rulecounter"/>
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_metapath_$rulecounter" value="$Encoder.attributeEscape($metadatarule.get('THEPATH'))"/>
-              $Encoder.bodyEscape($metadatarule.get('THEPATH'))
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_metaflav_$rulecounter" value="$metadatarule.get('THEACTION')"/>
-              $metadatarule.get('THEACTION')
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_metaall_$rulecounter" value="$metadatarule.get('ALLFLAG')"/>
-              $metadatarule.get('ALLFLAG')
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-    #foreach($field in $metadatarule.get('FIELDLIST'))
-              <input type="hidden" name="s${SeqNum}_metafields_$rulecounter" value="$Encoder.attributeEscape($field)"/>
-    #end
-            $Encoder.bodyEscape($metadatarule.get('FIELDS'))
-          </td>
-        </tr>
-        
-    #set($rownumber = $rownumber + 1)
-    #set($rulecounter = $rulecounter + 1)
-  #end
-
-  #if($rulecounter == 0)
-        <tr class="formrow"><td class="formcolumnmessage" colspan="5">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoMetadataIncluded'))</td></tr>
-  #end
-  
-  #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-  
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_meta_$rulecounter"/>
-              <input type="hidden" name="s${SeqNum}_metaop" value=""/>
-              <input type="hidden" name="s${SeqNum}_metapathcount" value="$rulecounter"/>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddNewRule'))" onClick='Javascript:s${SeqNum}_MetaRuleAddPath("s${SeqNum}_meta_$rulecounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddRule'))"/>
-            </nobr>
-          </td>
-          <td class="formcolumncell" colspan="4"></td>
-        </tr>
-        <tr class="formrow"><td colspan="5" class="formseparator"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NewRule'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_metapathop" value=""/>
-              <input type="hidden" name="s${SeqNum}_metapath" value="$Encoder.attributeEscape($METAPATHSOFAR)"/>
-              <input type="hidden" name="s${SeqNum}_metapathstate" value="$METAPATHSTATE"/>
-  #if($METAPATHLIBRARY)
-              <input type="hidden" name="s${SeqNum}_metapathlibrary" value="$Encoder.attributeEscape($METAPATHLIBRARY)"/>
-  #end
-              $Encoder.bodyEscape($METAPATHSOFAR)
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <select name="s${SeqNum}_metaflavor" size="2">
-                <option value="include" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Include'))</option>
-                <option value="exclude">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Exclude'))</option>
-              </select>
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="checkbox" name="s${SeqNum}_metaall" value="true"/>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.IncludeAllMetadata'))
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-  #if($METAFIELDLIST && $METAFIELDLIST.size() > 0)
-            <nobr>
-              <select name="s${SeqNum}_metafields" multiple="true" size="5">
-    #foreach($field in $METAFIELDLIST)
-                <option value="$Encoder.attributeEscape($field.getValue())">$Encoder.bodyEscape($field.getPrettyName())</option>
-    #end
-              </select>
-            </nobr>
-  #end
-          </td>
-        </tr>
-
-        <tr class="formrow"><td colspan="5" class="formseparator"><hr/></td></tr>
-
-        <tr class="formrow">
-  #if($METAMESSAGE)
-          <td class="formcolumnmessage" colspan="5">$Encoder.bodyEscape($METAMESSAGE)</td></tr>
-  #else
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_metapathwidget"/>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.ResetPath'))" onClick='Javascript:s${SeqNum}_MetaPathReset("s${SeqNum}_metapathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.ResetMetadataRulePath'))"/>
-    #if($METAPATHSOFAR.length() > 1 && ($METAPATHSTATE == 'site' || $METAPATHSTATE == 'library'))
-              <input type="button" value="-" onClick='Javascript:s${SeqNum}_MetaPathRemove("s${SeqNum}_metapathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.RemoveFromMetadataRulePath'))"/>
-    #end
-            </nobr>
-          </td>
-          <td class="formcolumncell" colspan="4">
-            <nobr>
-    #if($METAPATHSTATE == 'site' && $METACHILDSITELIST && $METACHILDSITELIST.size() > 0)
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddSite'))" onClick='Javascript:s${SeqNum}_MetaPathAppendSite("s${SeqNum}_metapathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddSiteToMetadataRulePath'))"/>
-              <select name="s${SeqNum}_metasite" size="5">
-                <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SelectSite'))</option>
-      #foreach($child in $METACHILDSITELIST)
-                <option value="$Encoder.attributeEscape($child.getValue())">$Encoder.bodyEscape($child.getPrettyName())</option>
-      #end
-              </select>
-    #end
-        
-    #if($METAPATHSTATE == 'site' && $METACHILDLIBLIST && $METACHILDLIBLIST.size() > 0)
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddLibrary'))" onClick='Javascript:s${SeqNum}_MetaPathAppendLibrary("s${SeqNum}_metapathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddLibraryToMetadataRulePath'))"/>
-              <select name="s${SeqNum}_metalibrary" size="5">
-                <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SelectLibrary'))</option>\
-      #foreach($child in $METACHILDLIBLIST)
-                <option value="$Encoder.attributeEscape($child.getValue())">$Encoder.bodyEscape($child.getPrettyName())</option>
-      #end
-              </select>
-    #end
-
-    #if($METAPATHSTATE == 'site' && $METACHILDLISTLIST && $METACHILDLISTLIST.size() > 0)
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddList'))" onClick='Javascript:s${SeqNum}_MetaPathAppendList("s${SeqNum}_metapathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddListToMetadataRulePath'))"/>
-              <select name="s${SeqNum}_metalist" size="5">
-                <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SelectList'))</option>
-      #foreach($child in $METACHILDLISTLIST)
-                <option value="$Encoder.attributeEscape($child.getValue())">$Encoder.bodyEscape($child.getPrettyName())</option>
-      #end
-              </select>
-    #end
-
-    #if($METAPATHSTATE != 'list')
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddText'))" onClick='Javascript:s${SeqNum}_MetaPathAppendText("s${SeqNum}_metapathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddTextToMetadataRulePath'))"/>
-              <input type="text" name="s${SeqNum}_metamatch" size="32" value=""/>
-    #end
-            </nobr>
-          </td>
-  #end
-        </tr>
-      </table>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="4"><hr/></td></tr>
-  
-  <tr>
-    <td class="description" colspan="1"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathMetadata'))</nobr></td>
-    <td class="boxcell" colspan="3">
-      <table class="displaytable">
-        <tr>
-          <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.AttributeName'))</nobr></td>
-          <td class="value" colspan="3">
-            <nobr>
-              <input type="text" name="s${SeqNum}_specpathnameattribute" size="20" value="$Encoder.attributeEscape($PATHNAMEATTRIBUTE)"/>
-            </nobr>
-          </td>
-        </tr>
-        
-        <tr><td class="separator" colspan="4"><hr/></td></tr>
-  
-  #set($mapcounter = 0)
-  #foreach($mapitem in $MAPLIST)
-        <tr>
-          <td class="description">
-            <input type="hidden" name="s${SeqNum}_specmappingop_$mapcounter" value=""/>
-            <a name="s${SeqNum}_mapping_$mapcounter">
-              <input type="button" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_specmappingop_$mapcounter","Delete","s${SeqNum}_mapping_$mapcounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.DeleteMapping'))$mapcounter" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.DeletePathMapping'))"/>
-            </a>
-          </td>
-          <td class="value">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_specmatch_$mapcounter" value="$Encoder.attributeEscape($mapitem.get('MATCH'))"/>
-              $Encoder.bodyEscape($mapitem.get('MATCH'))
-            </nobr>
-          </td>
-          <td class="value">==></td>
-          <td class="value">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_specreplace_$mapcounter" value="$Encoder.attributeEscape($mapitem.get('REPLACE'))"/>
-              $Encoder.bodyEscape($mapitem.get('REPLACE'))
-            </nobr>
-          </td>
-        </tr>
-    #set($mapcounter = $mapcounter + 1)
-  #end
-  
-  #if($mapcounter == 0)
-        <tr><td colspan="4" class="message">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoMappingsSpecified'))</td></tr>
-  #end
-  
-        <tr><td class="lightseparator" colspan="4"><hr/></td></tr>
-
-  #set($mapcounterplusone = $mapcounter + 1)
-  
-        <tr>
-          <td class="description">
-            <a name="s${SeqNum}_mapping_$mapcounter">
-              <input type="hidden" name="s${SeqNum}_specmappingcount" value="$mapcounter"/>
-              <input type="button" onClick='Javascript:s${SeqNum}_SpecAddMapping("s${SeqNum}_mapping_$mapcounterplusone")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddToMappings'))" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddPathMapping'))"/>
-            </a>
-          </td>
-          <td class="value"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.MatchRegexp'))&nbsp;<input type="text" name="s${SeqNum}_specmatch" size="32" value=""/></nobr></td>
-          <td class="value">==></td>
-          <td class="value"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ReplaceString'))&nbsp;<input type="text" name="s${SeqNum}_specreplace" size="32" value=""/></nobr></td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($rulecounter = 0)
-  #foreach($metadatarule in $METADATARULES)
-
-<input type="hidden" name="s${SeqNum}_metapath_$rulecounter" value="$Encoder.attributeEscape($metadatarule.get('THEPATH'))"/>
-<input type="hidden" name="s${SeqNum}_metaflav_$rulecounter" value="$metadatarule.get('THEACTION')"/>
-<input type="hidden" name="s${SeqNum}_metaall_$rulecounter" value="$metadatarule.get('ALLFLAG')"/>
-    #foreach($field in $metadatarule.get('FIELDLIST'))
-<input type="hidden" name="s${SeqNum}_metafields_$rulecounter" value="$Encoder.attributeEscape($field)"/>
-    #end
-     
-    #set($rulecounter = $rulecounter + 1)
-  #end
-  
-<input type="hidden" name="s${SeqNum}_metapathcount" value="$rulecounter"/>
-<input type="hidden" name="s${SeqNum}_specpathnameattribute" value="$Encoder.attributeEscape($PATHNAMEATTRIBUTE)"/>
-  
-  #set($mapcounter = 0)
-  #foreach($mapping in $MAPLIST)
-<input type="hidden" name="s${SeqNum}_specmatch_$mapcounter" value="$Encoder.attributeEscape($mapping.get('MATCH'))"/>
-<input type="hidden" name="s${SeqNum}_specreplace_$mapcounter" value="$Encoder.attributeEscape($mapping.get('REPLACE'))"/>
-    #set($mapcounter = $mapcounter + 1)
-  #end
-
-<input type="hidden" name="s${SeqNum}_specmappingcount" value="$mapcounter"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Paths.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Paths.html
deleted file mode 100644
index ddb3602..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Paths.html
+++ /dev/null
@@ -1,235 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointRepository.Paths') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathRules'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathMatch'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Type'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Action'))</nobr></td>
-        </tr>
-        
-  #set($rulecounter = 0)
-  #set($rownumber = 0)
-  #foreach($rule in $RULES)
-  
-    #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_path_$rulecounter"/>
-              <input type="hidden" name="s${SeqNum}_specop_$rulecounter" value=""/>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.InsertNewRule'))" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_specop_$rulecounter","Insert Here","s${SeqNum}_path_$rulecounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.InsertNewRuleBeforeRule'))$rulecounter"/>
-            </nobr>
-          </td>
-          <td class="formcolumncell" colspan="3"></td>
-        </tr>
-        
-    #set($rownumber = $rownumber + 1)
-    
-    #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <nobr>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.Delete'))" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_specop_$rulecounter","Delete","s${SeqNum}_path_$rulecounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.DeleteRule'))$rulecounter"/>
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_specpath_$rulecounter" value="$Encoder.attributeEscape($rule.get('THEPATH'))"/>
-              $Encoder.bodyEscape($rule.get('THEPATH'))
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_spectype_$rulecounter" value="$rule.get('THETYPE')"/>
-              $rule.get('THETYPE')
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_specflav_$rulecounter" value="$rule.get('THEACTION')"/>
-              $rule.get('THEACTION')
-            </nobr>
-          </td>
-        </tr>
-        
-    #set($rownumber = $rownumber + 1)
-    #set($rulecounter = $rulecounter + 1)
-  #end
-  
-  #if($rulecounter == 0)
-        <tr class="formrow"><td colspan="4" class="formcolumnmessage">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoDocumentsCurrentlyIncluded'))</td></tr>
-  #end
-  
-  #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_path_$rulecounter"/>
-              <input type="hidden" name="s${SeqNum}_specop" value=""/>
-              <input type="hidden" name="s${SeqNum}_specpathcount" value="$rulecounter"/>
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddNewRule'))" onClick='Javascript:s${SeqNum}_SpecRuleAddPath("s${SeqNum}_path_$rulecounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddRule'))"/>
-            </nobr>
-          </td>
-          <td class="formcolumncell" colspan="3"></td>
-        </tr>
-        
-        <tr class="formrow"><td colspan="4" class="formseparator"><hr/></td></tr>
-        
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NewRule'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <input type="hidden" name="s${SeqNum}_specpathop" value=""/>
-              <input type="hidden" name="s${SeqNum}_specpath" value="$Encoder.attributeEscape($PATHSOFAR)"/>
-              <input type="hidden" name="s${SeqNum}_specpathstate" value="$PATHSTATE"/>
-  #if($PATHLIBRARY)
-              <input type="hidden" name="s${SeqNum}_specpathlibrary" value="$Encoder.attributeEscape($PATHLIBRARY)"/>
-  #end
-              $Encoder.bodyEscape($PATHSOFAR)
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-
-  #if($PATHSTATE == 'unknown')
-  
-    #if(!$PATHLIBRARY)
-              <select name="s${SeqNum}_spectype" size="4">
-                <option value="file" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.File'))</option>
-                <option value="library">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Library'))</option>
-                <option value="list">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.List'))</option>
-                <option value="site">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Site'))</option>
-              </select>
-    #else
-              <input type="hidden" name="s${SeqNum}_spectype" value="file"/>
-              file
-    #end
-
-  #else
-              <input type="hidden" name="s${SeqNum}_spectype" value="$Encoder.attributeEscape($PATHSTATE)"/>
-              $PATHSTATE
-  #end
-
-            </nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>
-              <select name="s${SeqNum}_specflavor" size="2">
-                <option value="include" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Include'))</option>
-                <option value="exclude">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Exclude'))</option>
-              </select>
-            </nobr>
-          </td>
-        </tr>
-        <tr class="formrow"><td colspan="4" class="formseparator"><hr/></td></tr>
-        <tr class="formrow">
-        
-  #if($MESSAGE)
-          <td class="formcolumnmessage" colspan="4">$Encoder.bodyEscape($MESSAGE)</td>
-  #else
-  
-          <td class="formcolumncell">
-            <nobr>
-              <a name="s${SeqNum}_pathwidget"/>
-              <input type="button" value="Reset Path" onClick='Javascript:s${SeqNum}_SpecPathReset("s${SeqNum}_pathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.ResetRulePath'))"/>
-    #if($PATHSOFAR.length() > 1 && ($PATHSTATE == 'site' || $PATHSTATE == 'library' || $PATHSTATE == 'list'))
-              <input type="button" value="-" onClick='Javascript:s${SeqNum}_SpecPathRemove("s${SeqNum}_pathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.RemoveFromRulePath'))"/>
-    #end
-            </nobr>
-          </td>
-          <td class="formcolumncell" colspan="3">
-            <nobr>
-    #if($PATHSTATE == 'site' && $CHILDSITELIST && $CHILDSITELIST.size() != 0)
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddSite'))" onClick='Javascript:s${SeqNum}_SpecPathAppendSite("s${SeqNum}_pathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddSiteToRulePath'))"/>
-              <select name="s${SeqNum}_specsite" size="5">
-                <option value="" selected="true">-- $Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SelectSite')) --</option>
-      #foreach($sitechild in $CHILDSITELIST)
-                <option value="$Encoder.attributeEscape($sitechild.getValue())">$Encoder.bodyEscape($sitechild.getPrettyName())</option>
-      #end
-              </select>
-    #end
-    
-    #if($PATHSTATE == 'site' && $CHILDLIBLIST && $CHILDLIBLIST.size() != 0)
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddLibrary'))" onClick='Javascript:s${SeqNum}_SpecPathAppendLibrary("s${SeqNum}_pathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddLibraryToRulePath'))"/>
-              <select name="s${SeqNum}_speclibrary" size="5">
-                <option value="" selected="true">-- $Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SelectLibrary')) --</option>
-      #foreach($libchild in $CHILDLIBLIST)
-                <option value="$Encoder.attributeEscape($libchild.getValue())">$Encoder.bodyEscape($libchild.getPrettyName())</option>
-      #end
-              </select>
-    #end
-
-    #if($PATHSTATE == 'site' && $CHILDLISTLIST && $CHILDLISTLIST.size() != 0)
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddList'))" onClick='Javascript:s${SeqNum}_SpecPathAppendList("s${SeqNum}_pathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddListToRulePath'))"/>
-              <select name="s${SeqNum}_speclist" size="5">
-                <option value="" selected="true">-- $Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SelectList')) --</option>
-      #foreach($listchild in $CHILDLISTLIST)
-                <option value="$Encoder.attributeEscape($listchild.getValue())">$Encoder.bodyEscape($listchild.getPrettyName())</option>
-      #end
-              </select>
-    #end
-        
-    #if($PATHSTATE != 'list')
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddText'))" onClick='Javascript:s${SeqNum}_SpecPathAppendText("s${SeqNum}_pathwidget")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddTextToRulePath'))"/>
-              <input type="text" name="s${SeqNum}_specmatch" size="32" value=""/>
-    #end
-        
-            </nobr>
-          </td>
-  #end
-  
-        </tr>
-      </table>
-    </td>
-  </tr>
-</table>
-
-#else
-
-  #set($rulecounter = 0)
-  #foreach($rule in $RULES)
-
-<input type="hidden" name="s${SeqNum}_specpath_$rulecounter" value="$Encoder.attributeEscape($rule.get('THEPATH'))"/>
-<input type="hidden" name="s${SeqNum}_spectype_$rulecounter" value="$rule.get('THETYPE')"/>
-<input type="hidden" name="s${SeqNum}_specflav_$rulecounter" value="$rule.get('THEACTION')"/>
-      
-    #set($rulecounter = $rulecounter + 1)
-  #end
-
-<input type="hidden" name="s${SeqNum}_specpathcount" value="$rulecounter"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Security.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Security.html
deleted file mode 100644
index 36fa8e0..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/editSpecification_Security.html
+++ /dev/null
@@ -1,99 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SharePointRepository.Security') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Security2'))</nobr></td>
-    <td class="value" colspan="1">
-      <nobr>
-  #if($SECURITY == 'on')
-        <input type="radio" name="s${SeqNum}_specsecurity" value="on" checked="true"/>
-  #else
-        <input type="radio" name="s${SeqNum}_specsecurity" value="on"/>
-  #end
-          $Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Enabled'))&nbsp;
-  #if($SECURITY == 'off')
-        <input type="radio" name="s${SeqNum}_specsecurity" value="off" checked="true"/>
-  #else
-        <input type="radio" name="s${SeqNum}_specsecurity" value="off"/>
-  #end
-          $Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Disabled'))
-      </nobr>
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  #set($atcounter = 0)
-  #foreach($accesstoken in $ACCESSTOKENS)
-
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_accessop_$atcounter" value=""/>
-      <input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($accesstoken)"/>
-      <a name="s${SeqNum}_token_$atcounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.Delete'))" onClick='Javascript:s${SeqNum}_SpecOp("s${SeqNum}_accessop_$atcounter","Delete","s${SeqNum}_token_$atcounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.DeleteToken'))$atcounter"/>
-      </a>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($accesstoken)</nobr>
-    </td>
-  </tr>
-  
-    #set($atcounter = $atcounter + 1)
-  #end
-  #if($atcounter == 0)
-  
-  <tr>
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoAccessTokensPresent'))</td>
-  </tr>
-  
-  #end
-  
-  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>
-      <input type="hidden" name="s${SeqNum}_accessop" value=""/>
-      <a name="s${SeqNum}_token_$atcounter">
-        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.Add'))" onClick='Javascript:s${SeqNum}_SpecAddAccessToken("s${SeqNum}_token_$atcounter")' alt="$Encoder.attributeEscape($ResourceBundle.getString('SharePointRepository.AddAccessToken'))"/>
-      </a>
-    </td>
-    <td class="value">
-      <input type="text" size="30" name="s${SeqNum}_spectoken" value=""/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="s${SeqNum}_specsecurity" value="$SECURITY"/>
-
-  #set($atcounter = 0)
-  #foreach($accesstoken in $ACCESSTOKENS)
-  
-<input type="hidden" name="s${SeqNum}_spectoken_$atcounter" value="$Encoder.attributeEscape($accesstoken)"/>
-
-    #set($atcounter = $atcounter + 1)
-  #end
-
-<input type="hidden" name="s${SeqNum}_tokencount" value="$atcounter"/>
-
-#end
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/viewConfiguration.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/viewConfiguration.html
deleted file mode 100644
index 908932a..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/viewConfiguration.html
+++ /dev/null
@@ -1,142 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerSharePointVersion'))</nobr></td>
-    <td class="value">
-#if($SERVERVERSION == '2.0')
-        SharePoint Services 2.0 (2003)
-#elseif($SERVERVERSION == '3.0')
-        SharePoint Services 3.0 (2007)
-#elseif($SERVERVERSION == '4.0')
-        SharePoint Services 4.0 (2010)
-#elseif($SERVERVERSION == '5.0')
-        SharePoint Services 5.0 (2013)
-  #elseif($SERVERVERSION == '6.0')
-        SharePoint Services 6.0 (2016)
-#else
-        Unknown
-#end
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerProtocol'))</nobr></td>
-    <td class="value">
-      $SERVERPROTOCOL
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerName'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($SERVERNAME)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ServerPort'))</nobr></td>
-    <td class="value">
-      $SERVERPORT
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SitePath'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($SERVERLOCATION)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.UserName'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($SERVERUSERNAME)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Password'))</nobr></td>
-    <td class="value">
-      ********
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyHost'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($PROXYHOST)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyPort'))</nobr></td>
-    <td class="value">
-      $PROXYPORT
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyUser'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($PROXYUSER)
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyPassword'))</nobr></td>
-    <td class="value">
-      ********
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ProxyDomain'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($PROXYDOMAIN)
-    </td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SSLCertificateList'))</nobr></td>
-    <td class="value">
-      <table class="displaytable">
-#if($CERTIFICATELIST.size() == 0)
-        <tr><td class="message" colspan="1">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoCertificatesPresent'))</td></tr>
-#else
-  #foreach($certificate in $CERTIFICATELIST)
-        <tr>
-          <td class="value">
-            $Encoder.bodyEscape($certificate.get('DESCRIPTION'))
-          </td>
-        </tr>
-  #end
-#end
-      </table>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.AuthorityTypeColon'))</nobr></td>
-    <td class="value">
-#if($AUTHORITYTYPE == 'SharePoint')
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.SharePoint'))</nobr>
-#elseif($AUTHORITYTYPE == 'ActiveDirectory')
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.ActiveDirectory'))</nobr>
-#else
-      Unknown
-#end
-    </td>
-  </tr>
-</table>
diff --git a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/viewSpecification.html b/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/viewSpecification.html
deleted file mode 100644
index c86220a..0000000
--- a/connectors/sharepoint/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/sharepoint/viewSpecification.html
+++ /dev/null
@@ -1,138 +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.
--->
-
-<table class="displaytable">
-  <tr>
-#if($RULES.size() != 0)
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathRules'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathMatch'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.RuleType'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Action'))</nobr></td>
-        </tr>
-  
-  #set($rownumber = 0)
-  #foreach($rule in $RULES)
-    #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($rule.get('THEPATH'))</nobr></td>
-          <td class="formcolumncell"><nobr>$rule.get('THETYPE')</nobr></td>
-          <td class="formcolumncell"><nobr>$rule.get('THEACTION')</nobr></td>
-        </tr>
-    #set($rownumber = $rownumber + 1)
-  #end
-      </table>
-    </td>
-#else
-    <td colspan="2" class="message"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoDocumentsWillBeIncluded'))</nobr></td>
-#end
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-#if($METADATARULES.size() > 0)
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Metadata2'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathMatch'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Action'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.AllMetadata'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Fields'))</nobr></td>
-        </tr>
-
-  #set($rownumber = 0)
-  #foreach($metadatarule in $METADATARULES)
-    #if(($rownumber % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell"><nobr>$Encoder.bodyEscape($metadatarule.get('THEPATH'))</nobr></td>
-          <td class="formcolumncell"><nobr>$metadatarule.get('THEACTION')</nobr></td>
-          <td class="formcolumncell"><nobr>$metadatarule.get('ALLFLAG')</nobr></td>
-          <td class="formcolumncell">$Encoder.bodyEscape($metadatarule.get('FIELDS'))</td>
-        </tr>
-    #set($rownumber = $rownumber + 1)
-  #end
-      </table>
-    </td>
-#else
-    <td colspan="2" class="message"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoMetadataWillBeIncluded'))</nobr></td>
-#end
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.Security2'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($SECURITY)</nobr></td>
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-#if($ACCESSTOKENS.size() > 0)
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.AccessToken'))</nobr></td>
-    <td class="value">
-  #foreach($token in $ACCESSTOKENS)
-      <nobr>$Encoder.bodyEscape($token)</nobr><br/>
-  #end
-    </td>
-  </tr>
-#else
-  <tr><td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoAccessTokensSpecified'))</td></tr>
-#end
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-#if($PATHNAMEATTRIBUTE.length() > 0)
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathMetadataAttributeName'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($PATHNAMEATTRIBUTE)</nobr></td>
-#else
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoPathNameMetadataAttributeSpecified'))</td>
-#end
-  </tr>
-
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-
-  <tr>
-#if($MAPLIST.size() > 0)
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.PathValueMapping'))</nobr></td>
-    <td class="value">
-      <table class="displaytable">
-  #foreach($mapitem in $MAPLIST)
-        <tr>
-          <td class="value"><nobr>$Encoder.bodyEscape($mapitem.get('MATCH'))</nobr></td>
-          <td class="value">==></td>
-          <td class="value"><nobr>$Encoder.bodyEscape($mapitem.get('REPLACE'))</nobr></td>
-        </tr>
-  #end
-      </table>
-    </td>
-#else
-    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('SharePointRepository.NoMappingsSpecified'))</td>
-#end
-  </tr>
-</table>
diff --git a/connectors/sharepoint/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharepoint/XMLGenTest.java b/connectors/sharepoint/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharepoint/XMLGenTest.java
deleted file mode 100644
index 754657f..0000000
--- a/connectors/sharepoint/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/sharepoint/XMLGenTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.sharepoint;
-
-import org.junit.*;
-import static org.junit.Assert.*;
-
-import java.util.*;
-
-public class XMLGenTest
-{
-
-  @Test
-  public void buildOrderedQueryTest()
-    throws Exception
-  {
-    String orderedQuery = SPSProxyHelper.buildOrderedQuery("ID").get_any()[0].toString();
-    assertEquals("<Query><OrderBy Override=\"TRUE\" UseIndexForOrderBy=\"TRUE\"><FieldRef Ascending=\"TRUE\" Name=\"ID\"/></OrderBy></Query>",orderedQuery);
-  }
-  
-  @Test
-  public void buildPagingQueryOptionsTest()
-    throws Exception
-  {
-    String pagingXML = SPSProxyHelper.buildPagingQueryOptions("some next string").get_any()[0].toString();
-    assertEquals("<QueryOptions><Paging ListItemCollectionPositionNext=\"some next string\"/><ViewAttributes Scope=\"Recursive\"/></QueryOptions>",pagingXML);
-  }
-  
-  @Test
-  public void buildViewFieldsTest()
-    throws Exception
-  {
-    List<String> list = new ArrayList<String>();
-    list.add("foo");
-    list.add("bar");
-    String viewFieldsXML = SPSProxyHelper.buildViewFields(list.toArray(new String[0])).get_any()[0].toString();
-    assertEquals("<ViewFields><FieldRef Name=\"foo\"/><FieldRef Name=\"bar\"/></ViewFields>",viewFieldsXML);
-  }
-  
-  @Test
-  public void buildMatchQueryTest()
-    throws Exception
-  {
-    String matchQuery = SPSProxyHelper.buildMatchQuery("foo","Text","bar").get_any()[0].toString();
-    assertEquals("<Query><Where><Eq><FieldRef Name=\"foo\"/><Value Type=\"Text\">bar</Value></Eq></Where></Query>",matchQuery);
-  }
-
-}
\ No newline at end of file
diff --git a/connectors/sharepoint/pom.xml b/connectors/sharepoint/pom.xml
deleted file mode 100644
index 4fa0802..0000000
--- a/connectors/sharepoint/pom.xml
+++ /dev/null
@@ -1,473 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-sharepoint-connector</artifactId>
-  <name>ManifoldCF - Connectors - SharePoint</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!--
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-           <phase>generate-sources</phase>
-           <goals><goal>add-source</goal></goals>
-           <configuration>
-             <sources>
-             <source>build/wsdljava</source>
-           </sources>
-          </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      -->
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>axistools-maven-plugin</artifactId>
-        <version>1.4</version>
-        
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.axis</groupId>
-            <artifactId>axis</artifactId>
-            <version>1.4</version>
-          </dependency>
-          <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-            <version>${commons-logging.version}</version>
-          </dependency>
-          <dependency>
-            <groupId>commons-discovery</groupId>
-            <artifactId>commons-discovery</artifactId>
-            <version>0.2</version>
-          </dependency>
-          <dependency>
-            <groupId>javax.xml</groupId>
-            <artifactId>jaxrpc-api</artifactId>
-            <version>1.1</version>
-          </dependency>
-          <dependency>
-            <groupId>wsdl4j</groupId>
-            <artifactId>wsdl4j</artifactId>
-            <version>1.6.2</version>
-          </dependency>
-        </dependencies>
-        
-        <configuration>
-          <sourceDirectory>wsdls</sourceDirectory>
-          <verbose>true</verbose>
-          <allElements>true</allElements>
-        </configuration>
-
-        <executions>
-          <execution>
-            <goals>
-              <goal>wsdl2java</goal>
-            </goals>
-            <configuration>
-             <sourceDirectory>wsdls</sourceDirectory>
-              <verbose>true</verbose>
-              <allElements>true</allElements>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>wsdl4j</groupId>
-      <artifactId>wsdl4j</artifactId>
-      <version>1.6.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.axis</groupId>
-      <artifactId>axis</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.xml</groupId>
-      <artifactId>jaxrpc-api</artifactId>
-      <version>1.1</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-discovery</groupId>
-      <artifactId>commons-discovery</artifactId>
-      <version>0.2</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
-
diff --git a/connectors/sharepoint/wsdls/DspSts.wsdl b/connectors/sharepoint/wsdls/DspSts.wsdl
deleted file mode 100644
index 3af0a1e..0000000
--- a/connectors/sharepoint/wsdls/DspSts.wsdl
+++ /dev/null
@@ -1,232 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://schemas.microsoft.com/sharepoint/dsp" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://schemas.microsoft.com/sharepoint/dsp" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/dsp">
-      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
-      <s:element name="queryRequest" nillable="true" type="tns:QueryRequest" />
-      <s:complexType name="QueryRequest">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="1" name="dsQuery" type="tns:DSQuery" />
-          <s:element minOccurs="0" maxOccurs="1" name="ptQuery" type="tns:PTQuery" />
-        </s:sequence>
-      </s:complexType>
-      <s:complexType name="DSQuery">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="1" name="Query" type="tns:DspQuery" />
-        </s:sequence>
-        <s:attribute name="select" type="s:string" />
-        <s:attribute default="both" name="resultContent" type="tns:ResultContentType" />
-        <s:attribute default="element" name="columnMapping" type="tns:ColumnMappingType" />
-        <s:attribute name="resultNamespace" type="s:string" />
-        <s:attribute name="resultPrefix" type="s:string" />
-        <s:attribute name="resultRoot" type="s:string" />
-        <s:attribute name="resultRow" type="s:string" />
-        <s:attribute name="startPosition" type="s:string" />
-        <s:attribute name="comparisonLocale" type="s:string" />
-      </s:complexType>
-      <s:complexType name="DspQuery">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="1" name="ServerParameterInfo" type="tns:ServerParameterInfo" />
-          <s:element minOccurs="0" maxOccurs="1" name="Fields" type="tns:Fields" />
-          <s:element minOccurs="0" maxOccurs="1" name="ServerParameters" type="tns:ArrayOfServerParameter" />
-          <s:element minOccurs="0" maxOccurs="1" name="Where">
-            <s:complexType mixed="true">
-              <s:sequence>
-                <s:any />
-              </s:sequence>
-            </s:complexType>
-          </s:element>
-          <s:element minOccurs="0" maxOccurs="1" name="OrderBy" type="tns:ArrayOfOrderField" />
-        </s:sequence>
-        <s:attribute default="-1" name="RowLimit" type="s:long" />
-      </s:complexType>
-      <s:complexType name="ServerParameterInfo" />
-      <s:complexType name="Fields">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="Field" type="tns:Field" />
-          <s:element minOccurs="0" maxOccurs="1" name="AllFields" type="tns:AllFields" />
-        </s:sequence>
-      </s:complexType>
-      <s:complexType name="Field">
-        <s:attribute name="Name" type="s:string" />
-        <s:attribute name="Alias" type="s:string" />
-      </s:complexType>
-      <s:complexType name="AllFields">
-        <s:attribute default="false" name="IncludeHiddenFields" type="s:boolean" />
-      </s:complexType>
-      <s:complexType name="ArrayOfServerParameter">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="ServerParameter" type="tns:ServerParameter" />
-        </s:sequence>
-      </s:complexType>
-      <s:complexType name="ServerParameter">
-        <s:simpleContent>
-          <s:extension base="s:string">
-            <s:attribute name="Name" type="s:string" />
-            <s:attribute default="false" name="Null" type="s:boolean" />
-          </s:extension>
-        </s:simpleContent>
-      </s:complexType>
-      <s:complexType name="ArrayOfOrderField">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="OrderField" type="tns:OrderField" />
-        </s:sequence>
-      </s:complexType>
-      <s:complexType name="OrderField">
-        <s:attribute name="Name" type="s:string" />
-        <s:attribute default="ASC" name="Direction" type="tns:OrderDirection" />
-      </s:complexType>
-      <s:simpleType name="OrderDirection">
-        <s:restriction base="s:string">
-          <s:enumeration value="ASC" />
-          <s:enumeration value="DESC" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="ResultContentType">
-        <s:restriction base="s:string">
-          <s:enumeration value="both" />
-          <s:enumeration value="schemaOnly" />
-          <s:enumeration value="dataOnly" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="ColumnMappingType">
-        <s:restriction base="s:string">
-          <s:enumeration value="element" />
-          <s:enumeration value="attribute" />
-        </s:restriction>
-      </s:simpleType>
-      <s:complexType name="PTQuery">
-        <s:sequence>
-          <s:any minOccurs="0" maxOccurs="unbounded" />
-        </s:sequence>
-      </s:complexType>
-      <s:element name="queryResponse">
-        <s:complexType mixed="true">
-          <s:sequence>
-            <s:any />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="authentication" type="tns:Authentication" />
-      <s:complexType name="Authentication">
-        <s:sequence>
-          <s:any minOccurs="0" maxOccurs="unbounded" />
-        </s:sequence>
-        <s:anyAttribute />
-      </s:complexType>
-      <s:element name="dataRoot" type="tns:DataRoot" />
-      <s:complexType name="DataRoot">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="1" name="root" type="s:string" />
-        </s:sequence>
-        <s:attribute default="true" name="allowRemoteDataAccess" type="s:boolean" />
-        <s:anyAttribute />
-      </s:complexType>
-      <s:element name="request" type="tns:RequestHeader" />
-      <s:complexType name="RequestHeader">
-        <s:attribute name="document" type="tns:DocumentType" use="required" />
-        <s:attribute name="method" type="tns:MethodType" use="required" />
-        <s:anyAttribute />
-      </s:complexType>
-      <s:simpleType name="DocumentType">
-        <s:restriction base="s:string">
-          <s:enumeration value="content" />
-          <s:enumeration value="system" />
-        </s:restriction>
-      </s:simpleType>
-      <s:simpleType name="MethodType">
-        <s:restriction base="s:string">
-          <s:enumeration value="query" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="versions" type="tns:Versions" />
-      <s:complexType name="Versions">
-        <s:sequence>
-          <s:element minOccurs="0" maxOccurs="unbounded" name="version" type="s:string" />
-        </s:sequence>
-        <s:anyAttribute />
-      </s:complexType>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="queryRequestSoapIn">
-    <wsdl:part name="Request" element="tns:queryRequest" />
-  </wsdl:message>
-  <wsdl:message name="queryRequestSoapOut">
-    <wsdl:part name="queryRequestResult" element="tns:queryResponse" />
-  </wsdl:message>
-  <wsdl:message name="queryRequestauthentication">
-    <wsdl:part name="authentication" element="tns:authentication" />
-  </wsdl:message>
-  <wsdl:message name="queryRequestdataRoot">
-    <wsdl:part name="dataRoot" element="tns:dataRoot" />
-  </wsdl:message>
-  <wsdl:message name="queryRequestrequest">
-    <wsdl:part name="request" element="tns:request" />
-  </wsdl:message>
-  <wsdl:message name="queryRequestversions">
-    <wsdl:part name="versions" element="tns:versions" />
-  </wsdl:message>
-  <wsdl:portType name="StsAdapterSoap">
-    <wsdl:operation name="Query">
-      <wsdl:input name="queryRequest" message="tns:queryRequestSoapIn" />
-      <wsdl:output name="queryRequest" message="tns:queryRequestSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="StsAdapterSoap" type="tns:StsAdapterSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="Query">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/dsp/queryRequest" style="document" />
-      <wsdl:input name="queryRequest">
-        <soap:body use="literal" />
-        <soap:header message="tns:queryRequestauthentication" part="authentication" use="literal" />
-        <soap:header message="tns:queryRequestdataRoot" part="dataRoot" use="literal" />
-        <soap:header message="tns:queryRequestrequest" part="request" use="literal" />
-        <soap:header message="tns:queryRequestversions" part="versions" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="queryRequest">
-        <soap:body use="literal" />
-        <soap:header message="tns:queryRequestversions" part="versions" use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="StsAdapterSoap12" type="tns:StsAdapterSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="Query">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/dsp/queryRequest" style="document" />
-      <wsdl:input name="queryRequest">
-        <soap12:body use="literal" />
-        <soap12:header message="tns:queryRequestauthentication" part="authentication" use="literal" />
-        <soap12:header message="tns:queryRequestdataRoot" part="dataRoot" use="literal" />
-        <soap12:header message="tns:queryRequestrequest" part="request" use="literal" />
-        <soap12:header message="tns:queryRequestversions" part="versions" use="literal" />
-      </wsdl:input>
-      <wsdl:output name="queryRequest">
-        <soap12:body use="literal" />
-        <soap12:header message="tns:queryRequestversions" part="versions" use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="StsAdapter">
-    <wsdl:port name="StsAdapterSoap" binding="tns:StsAdapterSoap">
-      <soap:address location="http://localhost/_vti_bin/DspSts.asmx" />
-    </wsdl:port>
-    <wsdl:port name="StsAdapterSoap12" binding="tns:StsAdapterSoap12">
-      <soap12:address location="http://localhost/_vti_bin/DspSts.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/sharepoint/wsdls/Lists.wsdl b/connectors/sharepoint/wsdls/Lists.wsdl
deleted file mode 100644
index b0f0e3b..0000000
--- a/connectors/sharepoint/wsdls/Lists.wsdl
+++ /dev/null
@@ -1,1781 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/" xmlns:s1="http://microsoft.com/wsdl/types/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/">
-      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
-      <s:import namespace="http://microsoft.com/wsdl/types/" />
-      <s:element name="GetList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListAndView">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="viewName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListAndViewResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListAndViewResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="listName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteListResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="templateID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddListResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddListFromFeature">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="featureID" type="s1:guid" />
-            <s:element minOccurs="1" maxOccurs="1" name="templateID" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddListFromFeatureResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddListFromFeatureResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="listProperties">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="newFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="updateFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="deleteFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="listVersion" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateListResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListCollection">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetListCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItems">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="viewName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="query">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="viewFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="rowLimit" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="queryOptions">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="webID" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListItemsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemChanges">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="viewFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="since" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contains">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemChangesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListItemChangesResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemChangesWithKnowledge">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="viewName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="query">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="viewFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="rowLimit" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="queryOptions">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="syncScope" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="knowledge">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="contains">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemChangesWithKnowledgeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListItemChangesWithKnowledgeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemChangesSinceToken">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="viewName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="query">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="viewFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="rowLimit" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="queryOptions">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="changeToken" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contains">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemChangesSinceTokenResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListItemChangesSinceTokenResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateListItems">
-        <s:complexType>
-          <s:sequence>
-            <s:element name="listName" type="s:string" />
-            <s:element name="updates">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateListItemsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateListItemsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateListItemsWithKnowledge">
-        <s:complexType>
-          <s:sequence>
-            <s:element name="listName" type="s:string" />
-            <s:element name="updates">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="syncScope" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="knowledge">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateListItemsWithKnowledgeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateListItemsWithKnowledgeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddDiscussionBoardItem">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="message" type="s:base64Binary" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddDiscussionBoardItemResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddDiscussionBoardItemResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddWikiPage">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strListName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="listRelPageUrl" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="wikiContent" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddWikiPageResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddWikiPageResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="strlistID" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strlistItemID" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="strFieldName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddAttachment">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="listItemID" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="attachment" type="s:base64Binary" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddAttachmentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="AddAttachmentResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAttachmentCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="listItemID" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAttachmentCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetAttachmentCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteAttachment">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="listItemID" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="url" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteAttachmentResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CheckOutFile">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="pageUrl" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="checkoutToLocal" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="lastmodified" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CheckOutFileResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="CheckOutFileResult" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UndoCheckOut">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="pageUrl" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UndoCheckOutResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="UndoCheckOutResult" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CheckInFile">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="pageUrl" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="comment" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="CheckinType" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CheckInFileResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="CheckInFileResult" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListContentTypes">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListContentTypesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListContentTypesResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListContentTypesAndProperties">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="propertyPrefix" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="includeWebProperties" type="s:boolean" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListContentTypesAndPropertiesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListContentTypesAndPropertiesResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListContentTypeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreateContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="displayName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="parentType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="fields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeProperties">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="addToView" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreateContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CreateContentTypeResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeProperties">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="newFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="updateFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="deleteFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="addToView" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateContentTypeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="DeleteContentTypeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypeXmlDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="newDocument">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypeXmlDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateContentTypeXmlDocumentResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypesXmlDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="newDocument">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypesXmlDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateContentTypesXmlDocumentResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteContentTypeXmlDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="documentUri" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteContentTypeXmlDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="DeleteContentTypeXmlDocumentResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyContentTypeToList">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="webUrl" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="ApplyContentTypeToListResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="ApplyContentTypeToListResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-    </s:schema>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://microsoft.com/wsdl/types/">
-      <s:simpleType name="guid">
-        <s:restriction base="s:string">
-          <s:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
-        </s:restriction>
-      </s:simpleType>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetListSoapIn">
-    <wsdl:part name="parameters" element="tns:GetList" />
-  </wsdl:message>
-  <wsdl:message name="GetListSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListAndViewSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListAndView" />
-  </wsdl:message>
-  <wsdl:message name="GetListAndViewSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListAndViewResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteListSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteList" />
-  </wsdl:message>
-  <wsdl:message name="DeleteListSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteListResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddListSoapIn">
-    <wsdl:part name="parameters" element="tns:AddList" />
-  </wsdl:message>
-  <wsdl:message name="AddListSoapOut">
-    <wsdl:part name="parameters" element="tns:AddListResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddListFromFeatureSoapIn">
-    <wsdl:part name="parameters" element="tns:AddListFromFeature" />
-  </wsdl:message>
-  <wsdl:message name="AddListFromFeatureSoapOut">
-    <wsdl:part name="parameters" element="tns:AddListFromFeatureResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateListSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateList" />
-  </wsdl:message>
-  <wsdl:message name="UpdateListSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateListResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetListCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListItems" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListItemsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemChangesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListItemChanges" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemChangesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListItemChangesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemChangesWithKnowledgeSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListItemChangesWithKnowledge" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemChangesWithKnowledgeSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListItemChangesWithKnowledgeResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemChangesSinceTokenSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListItemChangesSinceToken" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemChangesSinceTokenSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListItemChangesSinceTokenResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateListItemsSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateListItems" />
-  </wsdl:message>
-  <wsdl:message name="UpdateListItemsSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateListItemsResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateListItemsWithKnowledgeSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateListItemsWithKnowledge" />
-  </wsdl:message>
-  <wsdl:message name="UpdateListItemsWithKnowledgeSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateListItemsWithKnowledgeResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddDiscussionBoardItemSoapIn">
-    <wsdl:part name="parameters" element="tns:AddDiscussionBoardItem" />
-  </wsdl:message>
-  <wsdl:message name="AddDiscussionBoardItemSoapOut">
-    <wsdl:part name="parameters" element="tns:AddDiscussionBoardItemResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddWikiPageSoapIn">
-    <wsdl:part name="parameters" element="tns:AddWikiPage" />
-  </wsdl:message>
-  <wsdl:message name="AddWikiPageSoapOut">
-    <wsdl:part name="parameters" element="tns:AddWikiPageResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersionCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddAttachmentSoapIn">
-    <wsdl:part name="parameters" element="tns:AddAttachment" />
-  </wsdl:message>
-  <wsdl:message name="AddAttachmentSoapOut">
-    <wsdl:part name="parameters" element="tns:AddAttachmentResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetAttachmentCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetAttachmentCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetAttachmentCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetAttachmentCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteAttachmentSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteAttachment" />
-  </wsdl:message>
-  <wsdl:message name="DeleteAttachmentSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteAttachmentResponse" />
-  </wsdl:message>
-  <wsdl:message name="CheckOutFileSoapIn">
-    <wsdl:part name="parameters" element="tns:CheckOutFile" />
-  </wsdl:message>
-  <wsdl:message name="CheckOutFileSoapOut">
-    <wsdl:part name="parameters" element="tns:CheckOutFileResponse" />
-  </wsdl:message>
-  <wsdl:message name="UndoCheckOutSoapIn">
-    <wsdl:part name="parameters" element="tns:UndoCheckOut" />
-  </wsdl:message>
-  <wsdl:message name="UndoCheckOutSoapOut">
-    <wsdl:part name="parameters" element="tns:UndoCheckOutResponse" />
-  </wsdl:message>
-  <wsdl:message name="CheckInFileSoapIn">
-    <wsdl:part name="parameters" element="tns:CheckInFile" />
-  </wsdl:message>
-  <wsdl:message name="CheckInFileSoapOut">
-    <wsdl:part name="parameters" element="tns:CheckInFileResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListContentTypesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListContentTypes" />
-  </wsdl:message>
-  <wsdl:message name="GetListContentTypesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListContentTypesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListContentTypesAndPropertiesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListContentTypesAndProperties" />
-  </wsdl:message>
-  <wsdl:message name="GetListContentTypesAndPropertiesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListContentTypesAndPropertiesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListContentType" />
-  </wsdl:message>
-  <wsdl:message name="GetListContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="CreateContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:CreateContentType" />
-  </wsdl:message>
-  <wsdl:message name="CreateContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:CreateContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateContentType" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteContentType" />
-  </wsdl:message>
-  <wsdl:message name="DeleteContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeXmlDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypeXmlDocument" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeXmlDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypeXmlDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypesXmlDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypesXmlDocument" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypesXmlDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypesXmlDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteContentTypeXmlDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteContentTypeXmlDocument" />
-  </wsdl:message>
-  <wsdl:message name="DeleteContentTypeXmlDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteContentTypeXmlDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="ApplyContentTypeToListSoapIn">
-    <wsdl:part name="parameters" element="tns:ApplyContentTypeToList" />
-  </wsdl:message>
-  <wsdl:message name="ApplyContentTypeToListSoapOut">
-    <wsdl:part name="parameters" element="tns:ApplyContentTypeToListResponse" />
-  </wsdl:message>
-  <wsdl:portType name="ListsSoap">
-    <wsdl:operation name="GetList">
-      <wsdl:input message="tns:GetListSoapIn" />
-      <wsdl:output message="tns:GetListSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListAndView">
-      <wsdl:input message="tns:GetListAndViewSoapIn" />
-      <wsdl:output message="tns:GetListAndViewSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteList">
-      <wsdl:input message="tns:DeleteListSoapIn" />
-      <wsdl:output message="tns:DeleteListSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddList">
-      <wsdl:input message="tns:AddListSoapIn" />
-      <wsdl:output message="tns:AddListSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddListFromFeature">
-      <wsdl:input message="tns:AddListFromFeatureSoapIn" />
-      <wsdl:output message="tns:AddListFromFeatureSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateList">
-      <wsdl:input message="tns:UpdateListSoapIn" />
-      <wsdl:output message="tns:UpdateListSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListCollection">
-      <wsdl:input message="tns:GetListCollectionSoapIn" />
-      <wsdl:output message="tns:GetListCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListItems">
-      <wsdl:input message="tns:GetListItemsSoapIn" />
-      <wsdl:output message="tns:GetListItemsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChanges">
-      <wsdl:input message="tns:GetListItemChangesSoapIn" />
-      <wsdl:output message="tns:GetListItemChangesSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChangesWithKnowledge">
-      <wsdl:input message="tns:GetListItemChangesWithKnowledgeSoapIn" />
-      <wsdl:output message="tns:GetListItemChangesWithKnowledgeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChangesSinceToken">
-      <wsdl:input message="tns:GetListItemChangesSinceTokenSoapIn" />
-      <wsdl:output message="tns:GetListItemChangesSinceTokenSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateListItems">
-      <wsdl:input message="tns:UpdateListItemsSoapIn" />
-      <wsdl:output message="tns:UpdateListItemsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateListItemsWithKnowledge">
-      <wsdl:input message="tns:UpdateListItemsWithKnowledgeSoapIn" />
-      <wsdl:output message="tns:UpdateListItemsWithKnowledgeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddDiscussionBoardItem">
-      <wsdl:input message="tns:AddDiscussionBoardItemSoapIn" />
-      <wsdl:output message="tns:AddDiscussionBoardItemSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddWikiPage">
-      <wsdl:input message="tns:AddWikiPageSoapIn" />
-      <wsdl:output message="tns:AddWikiPageSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionCollection">
-      <wsdl:input message="tns:GetVersionCollectionSoapIn" />
-      <wsdl:output message="tns:GetVersionCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddAttachment">
-      <wsdl:input message="tns:AddAttachmentSoapIn" />
-      <wsdl:output message="tns:AddAttachmentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetAttachmentCollection">
-      <wsdl:input message="tns:GetAttachmentCollectionSoapIn" />
-      <wsdl:output message="tns:GetAttachmentCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteAttachment">
-      <wsdl:input message="tns:DeleteAttachmentSoapIn" />
-      <wsdl:output message="tns:DeleteAttachmentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CheckOutFile">
-      <wsdl:input message="tns:CheckOutFileSoapIn" />
-      <wsdl:output message="tns:CheckOutFileSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UndoCheckOut">
-      <wsdl:input message="tns:UndoCheckOutSoapIn" />
-      <wsdl:output message="tns:UndoCheckOutSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CheckInFile">
-      <wsdl:input message="tns:CheckInFileSoapIn" />
-      <wsdl:output message="tns:CheckInFileSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentTypes">
-      <wsdl:input message="tns:GetListContentTypesSoapIn" />
-      <wsdl:output message="tns:GetListContentTypesSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentTypesAndProperties">
-      <wsdl:input message="tns:GetListContentTypesAndPropertiesSoapIn" />
-      <wsdl:output message="tns:GetListContentTypesAndPropertiesSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentType">
-      <wsdl:input message="tns:GetListContentTypeSoapIn" />
-      <wsdl:output message="tns:GetListContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CreateContentType">
-      <wsdl:input message="tns:CreateContentTypeSoapIn" />
-      <wsdl:output message="tns:CreateContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentType">
-      <wsdl:input message="tns:UpdateContentTypeSoapIn" />
-      <wsdl:output message="tns:UpdateContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentType">
-      <wsdl:input message="tns:DeleteContentTypeSoapIn" />
-      <wsdl:output message="tns:DeleteContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypeXmlDocument">
-      <wsdl:input message="tns:UpdateContentTypeXmlDocumentSoapIn" />
-      <wsdl:output message="tns:UpdateContentTypeXmlDocumentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypesXmlDocument">
-      <wsdl:input message="tns:UpdateContentTypesXmlDocumentSoapIn" />
-      <wsdl:output message="tns:UpdateContentTypesXmlDocumentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentTypeXmlDocument">
-      <wsdl:input message="tns:DeleteContentTypeXmlDocumentSoapIn" />
-      <wsdl:output message="tns:DeleteContentTypeXmlDocumentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="ApplyContentTypeToList">
-      <wsdl:input message="tns:ApplyContentTypeToListSoapIn" />
-      <wsdl:output message="tns:ApplyContentTypeToListSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="ListsSoap" type="tns:ListsSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetList">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetList" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListAndView">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListAndView" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteList">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteList" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddList">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddList" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddListFromFeature">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddListFromFeature" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateList">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateList" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItems">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItems" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChanges">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChanges" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChangesWithKnowledge">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChangesWithKnowledge" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChangesSinceToken">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChangesSinceToken" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateListItems">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateListItems" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateListItemsWithKnowledge">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateListItemsWithKnowledge" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddDiscussionBoardItem">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddDiscussionBoardItem" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddWikiPage">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddWikiPage" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetVersionCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddAttachment">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddAttachment" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAttachmentCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetAttachmentCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteAttachment">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteAttachment" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CheckOutFile">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CheckOutFile" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UndoCheckOut">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UndoCheckOut" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CheckInFile">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CheckInFile" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentTypes">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListContentTypes" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentTypesAndProperties">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListContentTypesAndProperties" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CreateContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CreateContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypeXmlDocument">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypesXmlDocument">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentTypesXmlDocument" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentTypeXmlDocument">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ApplyContentTypeToList">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/ApplyContentTypeToList" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="ListsSoap12" type="tns:ListsSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetList">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetList" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListAndView">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListAndView" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteList">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteList" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddList">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddList" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddListFromFeature">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddListFromFeature" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateList">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateList" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItems">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItems" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChanges">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChanges" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChangesWithKnowledge">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChangesWithKnowledge" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItemChangesSinceToken">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChangesSinceToken" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateListItems">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateListItems" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateListItemsWithKnowledge">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateListItemsWithKnowledge" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddDiscussionBoardItem">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddDiscussionBoardItem" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddWikiPage">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddWikiPage" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetVersionCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetVersionCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddAttachment">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddAttachment" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAttachmentCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetAttachmentCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteAttachment">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteAttachment" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CheckOutFile">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CheckOutFile" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UndoCheckOut">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UndoCheckOut" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CheckInFile">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CheckInFile" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentTypes">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListContentTypes" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentTypesAndProperties">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListContentTypesAndProperties" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CreateContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CreateContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypeXmlDocument">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypesXmlDocument">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentTypesXmlDocument" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentTypeXmlDocument">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="ApplyContentTypeToList">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/ApplyContentTypeToList" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="Lists">
-    <wsdl:port name="ListsSoap" binding="tns:ListsSoap">
-      <soap:address location="http://localhost/_vti_bin/Lists.asmx" />
-    </wsdl:port>
-    <wsdl:port name="ListsSoap12" binding="tns:ListsSoap12">
-      <soap12:address location="http://localhost/_vti_bin/Lists.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/sharepoint/wsdls/MCPermissions.wsdl b/connectors/sharepoint/wsdls/MCPermissions.wsdl
deleted file mode 100755
index 1a1b7ba..0000000
--- a/connectors/sharepoint/wsdls/MCPermissions.wsdl
+++ /dev/null
@@ -1,139 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://microsoft.com/sharepoint/webpartpages/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://microsoft.com/sharepoint/webpartpages/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://microsoft.com/sharepoint/webpartpages/">
-      <s:element name="GetPermissionCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPermissionCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPermissionCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItems">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="startRow" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="rowLimit" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListItemsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListItemsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetPermissionCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPermissionCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetPermissionCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPermissionCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListItems" />
-  </wsdl:message>
-  <wsdl:message name="GetListItemsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListItemsResponse" />
-  </wsdl:message>
-  <wsdl:portType name="PermissionsSoap">
-    <wsdl:operation name="GetPermissionCollection">
-      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Returns the collection of permissions for a site, list, or list item.</wsdl:documentation>
-      <wsdl:input message="tns:GetPermissionCollectionSoapIn" />
-      <wsdl:output message="tns:GetPermissionCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListItems">
-      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Returns the list of contents of a library without interference from administrator-set limits.</wsdl:documentation>
-      <wsdl:input message="tns:GetListItemsSoapIn" />
-      <wsdl:output message="tns:GetListItemsSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="PermissionsSoap" type="tns:PermissionsSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetPermissionCollection">
-      <soap:operation soapAction="http://microsoft.com/sharepoint/webpartpages/GetPermissionCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItems">
-      <soap:operation soapAction="http://microsoft.com/sharepoint/webpartpages/GetListItems" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="PermissionsSoap12" type="tns:PermissionsSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetPermissionCollection">
-      <soap12:operation soapAction="http://microsoft.com/sharepoint/webpartpages/GetPermissionCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListItems">
-      <soap12:operation soapAction="http://microsoft.com/sharepoint/webpartpages/GetListItems" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="Permissions">
-    <wsdl:port name="PermissionsSoap" binding="tns:PermissionsSoap">
-      <soap:address location="http://localhost/_vti_bin/MCPermissions.asmx" />
-    </wsdl:port>
-    <wsdl:port name="PermissionsSoap12" binding="tns:PermissionsSoap12">
-      <soap12:address location="http://localhost/_vti_bin/MCPermissions.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
\ No newline at end of file
diff --git a/connectors/sharepoint/wsdls/Permissions.wsdl b/connectors/sharepoint/wsdls/Permissions.wsdl
deleted file mode 100644
index 2dc4f8a..0000000
--- a/connectors/sharepoint/wsdls/Permissions.wsdl
+++ /dev/null
@@ -1,305 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/directory/">
-      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
-      <s:element name="GetPermissionCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetPermissionCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetPermissionCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddPermission">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionIdentifier" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionType" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionMask" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddPermissionResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddPermissionCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionsInfoXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddPermissionCollectionResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="UpdatePermission">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionIdentifier" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionType" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionMask" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdatePermissionResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemovePermission">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionIdentifier" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="permissionType" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemovePermissionResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemovePermissionCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="objectName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="objectType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="memberIdsXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemovePermissionCollectionResponse">
-        <s:complexType />
-      </s:element>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetPermissionCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetPermissionCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetPermissionCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetPermissionCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddPermissionSoapIn">
-    <wsdl:part name="parameters" element="tns:AddPermission" />
-  </wsdl:message>
-  <wsdl:message name="AddPermissionSoapOut">
-    <wsdl:part name="parameters" element="tns:AddPermissionResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddPermissionCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:AddPermissionCollection" />
-  </wsdl:message>
-  <wsdl:message name="AddPermissionCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:AddPermissionCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePermissionSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdatePermission" />
-  </wsdl:message>
-  <wsdl:message name="UpdatePermissionSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdatePermissionResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemovePermissionSoapIn">
-    <wsdl:part name="parameters" element="tns:RemovePermission" />
-  </wsdl:message>
-  <wsdl:message name="RemovePermissionSoapOut">
-    <wsdl:part name="parameters" element="tns:RemovePermissionResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemovePermissionCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:RemovePermissionCollection" />
-  </wsdl:message>
-  <wsdl:message name="RemovePermissionCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:RemovePermissionCollectionResponse" />
-  </wsdl:message>
-  <wsdl:portType name="PermissionsSoap">
-    <wsdl:operation name="GetPermissionCollection">
-      <wsdl:input message="tns:GetPermissionCollectionSoapIn" />
-      <wsdl:output message="tns:GetPermissionCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddPermission">
-      <wsdl:input message="tns:AddPermissionSoapIn" />
-      <wsdl:output message="tns:AddPermissionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddPermissionCollection">
-      <wsdl:input message="tns:AddPermissionCollectionSoapIn" />
-      <wsdl:output message="tns:AddPermissionCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdatePermission">
-      <wsdl:input message="tns:UpdatePermissionSoapIn" />
-      <wsdl:output message="tns:UpdatePermissionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemovePermission">
-      <wsdl:input message="tns:RemovePermissionSoapIn" />
-      <wsdl:output message="tns:RemovePermissionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemovePermissionCollection">
-      <wsdl:input message="tns:RemovePermissionCollectionSoapIn" />
-      <wsdl:output message="tns:RemovePermissionCollectionSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="PermissionsSoap" type="tns:PermissionsSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetPermissionCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetPermissionCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddPermission">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddPermission" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddPermissionCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddPermissionCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdatePermission">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdatePermission" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemovePermission">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemovePermission" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemovePermissionCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemovePermissionCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="PermissionsSoap12" type="tns:PermissionsSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetPermissionCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetPermissionCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddPermission">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddPermission" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddPermissionCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddPermissionCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdatePermission">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdatePermission" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemovePermission">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemovePermission" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemovePermissionCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemovePermissionCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="Permissions">
-    <wsdl:port name="PermissionsSoap" binding="tns:PermissionsSoap">
-      <soap:address location="http://localhost/_vti_bin/Permissions.asmx" />
-    </wsdl:port>
-    <wsdl:port name="PermissionsSoap12" binding="tns:PermissionsSoap12">
-      <soap12:address location="http://localhost/_vti_bin/Permissions.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/sharepoint/wsdls/usergroup.wsdl b/connectors/sharepoint/wsdls/usergroup.wsdl
deleted file mode 100644
index 7343f34..0000000
--- a/connectors/sharepoint/wsdls/usergroup.wsdl
+++ /dev/null
@@ -1,1986 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/directory/">
-      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
-      <s:element name="GetUserCollectionFromSite">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetUserCollectionFromSiteResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionFromSiteResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollectionFromWeb">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetUserCollectionFromWebResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionFromWebResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAllUserCollectionFromWeb">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetAllUserCollectionFromWebResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetAllUserCollectionFromWebResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollectionFromGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollectionFromGroupResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionFromGroupResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollectionFromRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollectionFromRoleResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionFromRoleResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginNamesXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserInfoResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserInfoResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetCurrentUserInfo">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetCurrentUserInfoResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetCurrentUserInfoResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>      
-      <s:element name="AddUserToGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userEmail" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userNotes" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddUserToGroupResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddUserCollectionToGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="usersInfoXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddUserCollectionToGroupResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddUserToRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userEmail" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userNotes" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddUserToRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddUserCollectionToRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="usersInfoXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddUserCollectionToRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="UpdateUserInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userEmail" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userNotes" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateUserInfoResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserFromSite">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserFromSiteResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserCollectionFromSite">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginNamesXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserCollectionFromSiteResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserFromWeb">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserFromWebResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserFromGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserFromGroupResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserCollectionFromGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginNamesXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserCollectionFromGroupResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserFromRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserFromRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveUserCollectionFromRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginNamesXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveUserCollectionFromRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetGroupCollectionFromSite">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetGroupCollectionFromSiteResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupCollectionFromSiteResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollectionFromWeb">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetGroupCollectionFromWebResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupCollectionFromWebResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollectionFromRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollectionFromRoleResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupCollectionFromRoleResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollectionFromUser">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollectionFromUserResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupCollectionFromUserResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupNamesXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetGroupInfoResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetGroupInfoResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="ownerIdentifier" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="ownerType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="defaultUserLoginName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddGroupResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddGroupToRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddGroupToRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="UpdateGroupInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="oldGroupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="ownerIdentifier" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="ownerType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateGroupInfoResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveGroupResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveGroupFromRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveGroupFromRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRoleCollectionFromWeb">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRoleCollectionFromWebResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRoleCollectionFromWebResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleCollectionFromGroup">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleCollectionFromGroupResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRoleCollectionFromGroupResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleCollectionFromUser">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="userLoginName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleCollectionFromUserResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRoleCollectionFromUserResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleCollection">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleNamesXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRoleCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRoleInfoResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRoleInfoResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionMask" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="AddRoleDef">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionMask" type="s:unsignedLong" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="AddRoleDefResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="UpdateRoleInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="oldRoleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionMask" type="s:int" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateRoleInfoResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="UpdateRoleDefInfo">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="oldRoleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
-            <s:element minOccurs="1" maxOccurs="1" name="permissionMask" type="s:unsignedLong" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateRoleDefInfoResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RemoveRole">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="roleName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveRoleResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetUserLoginFromEmail">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="emailXml">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetUserLoginFromEmailResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetUserLoginFromEmailResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRolesAndPermissionsForCurrentUser">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRolesAndPermissionsForCurrentUserResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRolesAndPermissionsForCurrentUserResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetRolesAndPermissionsForSite">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetRolesAndPermissionsForSiteResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetRolesAndPermissionsForSiteResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetUserCollectionFromSiteSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromSite" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromSiteSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromSiteResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromWebSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromWeb" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromWebSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromWebResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetAllUserCollectionFromWebSoapIn">
-    <wsdl:part name="parameters" element="tns:GetAllUserCollectionFromWeb" />
-  </wsdl:message>
-  <wsdl:message name="GetAllUserCollectionFromWebSoapOut">
-    <wsdl:part name="parameters" element="tns:GetAllUserCollectionFromWebResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromGroup" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromRole" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionFromRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionFromRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetUserCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserInfo" />
-  </wsdl:message>
-  <wsdl:message name="GetUserInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetCurrentUserInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:GetCurrentUserInfo" />
-  </wsdl:message>
-  <wsdl:message name="GetCurrentUserInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:GetCurrentUserInfoResponse" />
-  </wsdl:message>  
-  <wsdl:message name="AddUserToGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:AddUserToGroup" />
-  </wsdl:message>
-  <wsdl:message name="AddUserToGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:AddUserToGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddUserCollectionToGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:AddUserCollectionToGroup" />
-  </wsdl:message>
-  <wsdl:message name="AddUserCollectionToGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:AddUserCollectionToGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddUserToRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:AddUserToRole" />
-  </wsdl:message>
-  <wsdl:message name="AddUserToRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:AddUserToRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddUserCollectionToRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:AddUserCollectionToRole" />
-  </wsdl:message>
-  <wsdl:message name="AddUserCollectionToRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:AddUserCollectionToRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateUserInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateUserInfo" />
-  </wsdl:message>
-  <wsdl:message name="UpdateUserInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateUserInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromSiteSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromSite" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromSiteSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromSiteResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserCollectionFromSiteSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserCollectionFromSite" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserCollectionFromSiteSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserCollectionFromSiteResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromWebSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromWeb" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromWebSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromWebResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromGroup" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserCollectionFromGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserCollectionFromGroup" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserCollectionFromGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserCollectionFromGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromRole" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserFromRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserFromRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserCollectionFromRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveUserCollectionFromRole" />
-  </wsdl:message>
-  <wsdl:message name="RemoveUserCollectionFromRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveUserCollectionFromRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromSiteSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromSite" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromSiteSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromSiteResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromWebSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromWeb" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromWebSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromWebResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromRole" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromUserSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromUser" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionFromUserSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionFromUserResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:GetGroupInfo" />
-  </wsdl:message>
-  <wsdl:message name="GetGroupInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:GetGroupInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:AddGroup" />
-  </wsdl:message>
-  <wsdl:message name="AddGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:AddGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddGroupToRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:AddGroupToRole" />
-  </wsdl:message>
-  <wsdl:message name="AddGroupToRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:AddGroupToRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateGroupInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateGroupInfo" />
-  </wsdl:message>
-  <wsdl:message name="UpdateGroupInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateGroupInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveGroup" />
-  </wsdl:message>
-  <wsdl:message name="RemoveGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveGroupFromRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveGroupFromRole" />
-  </wsdl:message>
-  <wsdl:message name="RemoveGroupFromRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveGroupFromRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionFromWebSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionFromWeb" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionFromWebSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionFromWebResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionFromGroupSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionFromGroup" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionFromGroupSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionFromGroupResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionFromUserSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionFromUser" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionFromUserSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionFromUserResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRoleCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRoleCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRoleInfo" />
-  </wsdl:message>
-  <wsdl:message name="GetRoleInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRoleInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:AddRole" />
-  </wsdl:message>
-  <wsdl:message name="AddRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:AddRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="AddRoleDefSoapIn">
-    <wsdl:part name="parameters" element="tns:AddRoleDef" />
-  </wsdl:message>
-  <wsdl:message name="AddRoleDefSoapOut">
-    <wsdl:part name="parameters" element="tns:AddRoleDefResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateRoleInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateRoleInfo" />
-  </wsdl:message>
-  <wsdl:message name="UpdateRoleInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateRoleInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateRoleDefInfoSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateRoleDefInfo" />
-  </wsdl:message>
-  <wsdl:message name="UpdateRoleDefInfoSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateRoleDefInfoResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveRoleSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveRole" />
-  </wsdl:message>
-  <wsdl:message name="RemoveRoleSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveRoleResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetUserLoginFromEmailSoapIn">
-    <wsdl:part name="parameters" element="tns:GetUserLoginFromEmail" />
-  </wsdl:message>
-  <wsdl:message name="GetUserLoginFromEmailSoapOut">
-    <wsdl:part name="parameters" element="tns:GetUserLoginFromEmailResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndPermissionsForCurrentUserSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRolesAndPermissionsForCurrentUser" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndPermissionsForCurrentUserSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRolesAndPermissionsForCurrentUserResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndPermissionsForSiteSoapIn">
-    <wsdl:part name="parameters" element="tns:GetRolesAndPermissionsForSite" />
-  </wsdl:message>
-  <wsdl:message name="GetRolesAndPermissionsForSiteSoapOut">
-    <wsdl:part name="parameters" element="tns:GetRolesAndPermissionsForSiteResponse" />
-  </wsdl:message>
-  <wsdl:portType name="UserGroupSoap">
-    <wsdl:operation name="GetUserCollectionFromSite">
-      <wsdl:input message="tns:GetUserCollectionFromSiteSoapIn" />
-      <wsdl:output message="tns:GetUserCollectionFromSiteSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromWeb">
-      <wsdl:input message="tns:GetUserCollectionFromWebSoapIn" />
-      <wsdl:output message="tns:GetUserCollectionFromWebSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetAllUserCollectionFromWeb">
-      <wsdl:input message="tns:GetAllUserCollectionFromWebSoapIn" />
-      <wsdl:output message="tns:GetAllUserCollectionFromWebSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromGroup">
-      <wsdl:input message="tns:GetUserCollectionFromGroupSoapIn" />
-      <wsdl:output message="tns:GetUserCollectionFromGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromRole">
-      <wsdl:input message="tns:GetUserCollectionFromRoleSoapIn" />
-      <wsdl:output message="tns:GetUserCollectionFromRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollection">
-      <wsdl:input message="tns:GetUserCollectionSoapIn" />
-      <wsdl:output message="tns:GetUserCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserInfo">
-      <wsdl:input message="tns:GetUserInfoSoapIn" />
-      <wsdl:output message="tns:GetUserInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetCurrentUserInfo">
-      <wsdl:input message="tns:GetCurrentUserInfoSoapIn" />
-      <wsdl:output message="tns:GetCurrentUserInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddUserToGroup">
-      <wsdl:input message="tns:AddUserToGroupSoapIn" />
-      <wsdl:output message="tns:AddUserToGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddUserCollectionToGroup">
-      <wsdl:input message="tns:AddUserCollectionToGroupSoapIn" />
-      <wsdl:output message="tns:AddUserCollectionToGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddUserToRole">
-      <wsdl:input message="tns:AddUserToRoleSoapIn" />
-      <wsdl:output message="tns:AddUserToRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddUserCollectionToRole">
-      <wsdl:input message="tns:AddUserCollectionToRoleSoapIn" />
-      <wsdl:output message="tns:AddUserCollectionToRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateUserInfo">
-      <wsdl:input message="tns:UpdateUserInfoSoapIn" />
-      <wsdl:output message="tns:UpdateUserInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromSite">
-      <wsdl:input message="tns:RemoveUserFromSiteSoapIn" />
-      <wsdl:output message="tns:RemoveUserFromSiteSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromSite">
-      <wsdl:input message="tns:RemoveUserCollectionFromSiteSoapIn" />
-      <wsdl:output message="tns:RemoveUserCollectionFromSiteSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromWeb">
-      <wsdl:input message="tns:RemoveUserFromWebSoapIn" />
-      <wsdl:output message="tns:RemoveUserFromWebSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromGroup">
-      <wsdl:input message="tns:RemoveUserFromGroupSoapIn" />
-      <wsdl:output message="tns:RemoveUserFromGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromGroup">
-      <wsdl:input message="tns:RemoveUserCollectionFromGroupSoapIn" />
-      <wsdl:output message="tns:RemoveUserCollectionFromGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromRole">
-      <wsdl:input message="tns:RemoveUserFromRoleSoapIn" />
-      <wsdl:output message="tns:RemoveUserFromRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromRole">
-      <wsdl:input message="tns:RemoveUserCollectionFromRoleSoapIn" />
-      <wsdl:output message="tns:RemoveUserCollectionFromRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromSite">
-      <wsdl:input message="tns:GetGroupCollectionFromSiteSoapIn" />
-      <wsdl:output message="tns:GetGroupCollectionFromSiteSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromWeb">
-      <wsdl:input message="tns:GetGroupCollectionFromWebSoapIn" />
-      <wsdl:output message="tns:GetGroupCollectionFromWebSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromRole">
-      <wsdl:input message="tns:GetGroupCollectionFromRoleSoapIn" />
-      <wsdl:output message="tns:GetGroupCollectionFromRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromUser">
-      <wsdl:input message="tns:GetGroupCollectionFromUserSoapIn" />
-      <wsdl:output message="tns:GetGroupCollectionFromUserSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollection">
-      <wsdl:input message="tns:GetGroupCollectionSoapIn" />
-      <wsdl:output message="tns:GetGroupCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupInfo">
-      <wsdl:input message="tns:GetGroupInfoSoapIn" />
-      <wsdl:output message="tns:GetGroupInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddGroup">
-      <wsdl:input message="tns:AddGroupSoapIn" />
-      <wsdl:output message="tns:AddGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddGroupToRole">
-      <wsdl:input message="tns:AddGroupToRoleSoapIn" />
-      <wsdl:output message="tns:AddGroupToRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateGroupInfo">
-      <wsdl:input message="tns:UpdateGroupInfoSoapIn" />
-      <wsdl:output message="tns:UpdateGroupInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveGroup">
-      <wsdl:input message="tns:RemoveGroupSoapIn" />
-      <wsdl:output message="tns:RemoveGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveGroupFromRole">
-      <wsdl:input message="tns:RemoveGroupFromRoleSoapIn" />
-      <wsdl:output message="tns:RemoveGroupFromRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromWeb">
-      <wsdl:input message="tns:GetRoleCollectionFromWebSoapIn" />
-      <wsdl:output message="tns:GetRoleCollectionFromWebSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromGroup">
-      <wsdl:input message="tns:GetRoleCollectionFromGroupSoapIn" />
-      <wsdl:output message="tns:GetRoleCollectionFromGroupSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromUser">
-      <wsdl:input message="tns:GetRoleCollectionFromUserSoapIn" />
-      <wsdl:output message="tns:GetRoleCollectionFromUserSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollection">
-      <wsdl:input message="tns:GetRoleCollectionSoapIn" />
-      <wsdl:output message="tns:GetRoleCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleInfo">
-      <wsdl:input message="tns:GetRoleInfoSoapIn" />
-      <wsdl:output message="tns:GetRoleInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddRole">
-      <wsdl:input message="tns:AddRoleSoapIn" />
-      <wsdl:output message="tns:AddRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="AddRoleDef">
-      <wsdl:input message="tns:AddRoleDefSoapIn" />
-      <wsdl:output message="tns:AddRoleDefSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateRoleInfo">
-      <wsdl:input message="tns:UpdateRoleInfoSoapIn" />
-      <wsdl:output message="tns:UpdateRoleInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateRoleDefInfo">
-      <wsdl:input message="tns:UpdateRoleDefInfoSoapIn" />
-      <wsdl:output message="tns:UpdateRoleDefInfoSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveRole">
-      <wsdl:input message="tns:RemoveRoleSoapIn" />
-      <wsdl:output message="tns:RemoveRoleSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetUserLoginFromEmail">
-      <wsdl:input message="tns:GetUserLoginFromEmailSoapIn" />
-      <wsdl:output message="tns:GetUserLoginFromEmailSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndPermissionsForCurrentUser">
-      <wsdl:input message="tns:GetRolesAndPermissionsForCurrentUserSoapIn" />
-      <wsdl:output message="tns:GetRolesAndPermissionsForCurrentUserSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndPermissionsForSite">
-      <wsdl:input message="tns:GetRolesAndPermissionsForSiteSoapIn" />
-      <wsdl:output message="tns:GetRolesAndPermissionsForSiteSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="UserGroupSoap" type="tns:UserGroupSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetUserCollectionFromSite">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromSite" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromWeb">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAllUserCollectionFromWeb">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetAllUserCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetCurrentUserInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetCurrentUserInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserToGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserToGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserCollectionToGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserCollectionToGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserToRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserToRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserCollectionToRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserCollectionToRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateUserInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateUserInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromSite">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromSite" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromSite">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserCollectionFromSite" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromWeb">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromWeb" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserCollectionFromGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserCollectionFromRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromSite">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromSite" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromWeb">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromUser">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromUser" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddGroupToRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddGroupToRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateGroupInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateGroupInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveGroupFromRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveGroupFromRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromWeb">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromGroup">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollectionFromGroup" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromUser">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollectionFromUser" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddRoleDef">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddRoleDef" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateRoleInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateRoleInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateRoleDefInfo">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateRoleDefInfo" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveRole">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveRole" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserLoginFromEmail">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserLoginFromEmail" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndPermissionsForCurrentUser">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRolesAndPermissionsForCurrentUser" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndPermissionsForSite">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRolesAndPermissionsForSite" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="UserGroupSoap12" type="tns:UserGroupSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetUserCollectionFromSite">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromSite" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromWeb">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAllUserCollectionFromWeb">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetAllUserCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollectionFromRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollectionFromRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetCurrentUserInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetCurrentUserInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserToGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserToGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserCollectionToGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserCollectionToGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserToRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserToRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddUserCollectionToRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddUserCollectionToRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateUserInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateUserInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromSite">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromSite" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromSite">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserCollectionFromSite" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromWeb">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromWeb" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserCollectionFromGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserFromRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserFromRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveUserCollectionFromRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveUserCollectionFromRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromSite">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromSite" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromWeb">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollectionFromUser">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollectionFromUser" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetGroupInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetGroupInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddGroupToRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddGroupToRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateGroupInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateGroupInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveGroupFromRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveGroupFromRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromWeb">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollectionFromWeb" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromGroup">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollectionFromGroup" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollectionFromUser">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollectionFromUser" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRoleInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRoleInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="AddRoleDef">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/AddRoleDef" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateRoleInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateRoleInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateRoleDefInfo">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/UpdateRoleDefInfo" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveRole">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/RemoveRole" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetUserLoginFromEmail">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetUserLoginFromEmail" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndPermissionsForCurrentUser">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRolesAndPermissionsForCurrentUser" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetRolesAndPermissionsForSite">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/directory/GetRolesAndPermissionsForSite" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="UserGroup">
-    <wsdl:port name="UserGroupSoap" binding="tns:UserGroupSoap">
-      <soap:address location="http://localhost/_vti_bin/usergroup.asmx" />
-    </wsdl:port>
-    <wsdl:port name="UserGroupSoap12" binding="tns:UserGroupSoap12">
-      <soap12:address location="http://localhost/_vti_bin/usergroup.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/sharepoint/wsdls/versions.wsdl b/connectors/sharepoint/wsdls/versions.wsdl
deleted file mode 100644
index c4dc93b..0000000
--- a/connectors/sharepoint/wsdls/versions.wsdl
+++ /dev/null
@@ -1,233 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/">
-      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
-      <s:element name="GetVersions">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetVersionsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetVersionsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RestoreVersion">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="fileVersion" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RestoreVersionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="RestoreVersionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteVersion">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="fileVersion" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteVersionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="DeleteVersionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteAllVersions">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteAllVersionsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="DeleteAllVersionsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetVersionsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetVersions" />
-  </wsdl:message>
-  <wsdl:message name="GetVersionsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetVersionsResponse" />
-  </wsdl:message>
-  <wsdl:message name="RestoreVersionSoapIn">
-    <wsdl:part name="parameters" element="tns:RestoreVersion" />
-  </wsdl:message>
-  <wsdl:message name="RestoreVersionSoapOut">
-    <wsdl:part name="parameters" element="tns:RestoreVersionResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteVersion" />
-  </wsdl:message>
-  <wsdl:message name="DeleteVersionSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteVersionResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteAllVersionsSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteAllVersions" />
-  </wsdl:message>
-  <wsdl:message name="DeleteAllVersionsSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteAllVersionsResponse" />
-  </wsdl:message>
-  <wsdl:portType name="VersionsSoap">
-    <wsdl:operation name="GetVersions">
-      <wsdl:input message="tns:GetVersionsSoapIn" />
-      <wsdl:output message="tns:GetVersionsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RestoreVersion">
-      <wsdl:input message="tns:RestoreVersionSoapIn" />
-      <wsdl:output message="tns:RestoreVersionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteVersion">
-      <wsdl:input message="tns:DeleteVersionSoapIn" />
-      <wsdl:output message="tns:DeleteVersionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteAllVersions">
-      <wsdl:input message="tns:DeleteAllVersionsSoapIn" />
-      <wsdl:output message="tns:DeleteAllVersionsSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="VersionsSoap" type="tns:VersionsSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetVersions">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetVersions" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RestoreVersion">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RestoreVersion" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteVersion">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteVersion" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteAllVersions">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteAllVersions" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="VersionsSoap12" type="tns:VersionsSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetVersions">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetVersions" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RestoreVersion">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RestoreVersion" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteVersion">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteVersion" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteAllVersions">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteAllVersions" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="Versions">
-    <wsdl:port name="VersionsSoap" binding="tns:VersionsSoap">
-      <soap:address location="http://localhost/_vti_bin/versions.asmx" />
-    </wsdl:port>
-    <wsdl:port name="VersionsSoap12" binding="tns:VersionsSoap12">
-      <soap12:address location="http://localhost/_vti_bin/versions.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/sharepoint/wsdls/webs.wsdl b/connectors/sharepoint/wsdls/webs.wsdl
deleted file mode 100644
index a97ae69..0000000
--- a/connectors/sharepoint/wsdls/webs.wsdl
+++ /dev/null
@@ -1,1033 +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.
--->
-
-<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsdl:types>
-    <s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/">
-      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
-      <s:element name="GetWebCollection">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetWebCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetWebCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetWeb">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="webUrl" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetWebResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetWebResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetListTemplates">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetListTemplatesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetListTemplatesResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetAllSubWebCollection">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetAllSubWebCollectionResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetAllSubWebCollectionResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="WebUrlFromPageUrl">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="pageUrl" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="WebUrlFromPageUrlResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="WebUrlFromPageUrlResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContentTypes">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetContentTypesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetContentTypesResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetContentTypeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreateContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="displayName" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="parentType" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="newFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeProperties">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CreateContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="CreateContentTypeResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeProperties">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="newFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="updateFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="deleteFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateContentTypeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteContentType">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="DeleteContentTypeResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="DeleteContentTypeResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypeXmlDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="newDocument">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateContentTypeXmlDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateContentTypeXmlDocumentResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveContentTypeXmlDocument">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="contentTypeId" type="s:string" />
-            <s:element minOccurs="0" maxOccurs="1" name="documentUri" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RemoveContentTypeXmlDocumentResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="RemoveContentTypeXmlDocumentResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetColumns">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetColumnsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetColumnsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateColumns">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="newFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="updateFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-            <s:element minOccurs="0" maxOccurs="1" name="deleteFields">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="UpdateColumnsResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="UpdateColumnsResult">
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetCustomizedPageStatus">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fileUrl" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetCustomizedPageStatusResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetCustomizedPageStatusResult" type="tns:CustomizedPageStatus" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:simpleType name="CustomizedPageStatus">
-        <s:restriction base="s:string">
-          <s:enumeration value="None" />
-          <s:enumeration value="Uncustomized" />
-          <s:enumeration value="Customized" />
-        </s:restriction>
-      </s:simpleType>
-      <s:element name="RevertFileContentStream">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="fileUrl" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RevertFileContentStreamResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RevertAllFileContentStreams">
-        <s:complexType />
-      </s:element>
-      <s:element name="RevertAllFileContentStreamsResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="CustomizeCss">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="cssFile" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="CustomizeCssResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="RevertCss">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="cssFile" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="RevertCssResponse">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetActivatedFeatures">
-        <s:complexType />
-      </s:element>
-      <s:element name="GetActivatedFeaturesResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="0" maxOccurs="1" name="GetActivatedFeaturesResult" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetObjectIdFromUrl">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="objectUrl" type="s:string" />
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-      <s:element name="GetObjectIdFromUrlResponse">
-        <s:complexType>
-          <s:sequence>
-            <s:element minOccurs="1" maxOccurs="1" name="GetObjectIdFromUrlResult" >
-              <s:complexType mixed="true">
-                <s:sequence>
-                  <s:any />
-                </s:sequence>
-              </s:complexType>
-            </s:element>
-          </s:sequence>
-        </s:complexType>
-      </s:element>
-    </s:schema>
-  </wsdl:types>
-  <wsdl:message name="GetWebCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetWebCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetWebCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetWebCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetWebSoapIn">
-    <wsdl:part name="parameters" element="tns:GetWeb" />
-  </wsdl:message>
-  <wsdl:message name="GetWebSoapOut">
-    <wsdl:part name="parameters" element="tns:GetWebResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetListTemplatesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetListTemplates" />
-  </wsdl:message>
-  <wsdl:message name="GetListTemplatesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetListTemplatesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetAllSubWebCollectionSoapIn">
-    <wsdl:part name="parameters" element="tns:GetAllSubWebCollection" />
-  </wsdl:message>
-  <wsdl:message name="GetAllSubWebCollectionSoapOut">
-    <wsdl:part name="parameters" element="tns:GetAllSubWebCollectionResponse" />
-  </wsdl:message>
-  <wsdl:message name="WebUrlFromPageUrlSoapIn">
-    <wsdl:part name="parameters" element="tns:WebUrlFromPageUrl" />
-  </wsdl:message>
-  <wsdl:message name="WebUrlFromPageUrlSoapOut">
-    <wsdl:part name="parameters" element="tns:WebUrlFromPageUrlResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetContentTypesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetContentTypes" />
-  </wsdl:message>
-  <wsdl:message name="GetContentTypesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetContentTypesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:GetContentType" />
-  </wsdl:message>
-  <wsdl:message name="GetContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:GetContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="CreateContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:CreateContentType" />
-  </wsdl:message>
-  <wsdl:message name="CreateContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:CreateContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateContentType" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="DeleteContentTypeSoapIn">
-    <wsdl:part name="parameters" element="tns:DeleteContentType" />
-  </wsdl:message>
-  <wsdl:message name="DeleteContentTypeSoapOut">
-    <wsdl:part name="parameters" element="tns:DeleteContentTypeResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeXmlDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypeXmlDocument" />
-  </wsdl:message>
-  <wsdl:message name="UpdateContentTypeXmlDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateContentTypeXmlDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="RemoveContentTypeXmlDocumentSoapIn">
-    <wsdl:part name="parameters" element="tns:RemoveContentTypeXmlDocument" />
-  </wsdl:message>
-  <wsdl:message name="RemoveContentTypeXmlDocumentSoapOut">
-    <wsdl:part name="parameters" element="tns:RemoveContentTypeXmlDocumentResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetColumnsSoapIn">
-    <wsdl:part name="parameters" element="tns:GetColumns" />
-  </wsdl:message>
-  <wsdl:message name="GetColumnsSoapOut">
-    <wsdl:part name="parameters" element="tns:GetColumnsResponse" />
-  </wsdl:message>
-  <wsdl:message name="UpdateColumnsSoapIn">
-    <wsdl:part name="parameters" element="tns:UpdateColumns" />
-  </wsdl:message>
-  <wsdl:message name="UpdateColumnsSoapOut">
-    <wsdl:part name="parameters" element="tns:UpdateColumnsResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetCustomizedPageStatusSoapIn">
-    <wsdl:part name="parameters" element="tns:GetCustomizedPageStatus" />
-  </wsdl:message>
-  <wsdl:message name="GetCustomizedPageStatusSoapOut">
-    <wsdl:part name="parameters" element="tns:GetCustomizedPageStatusResponse" />
-  </wsdl:message>
-  <wsdl:message name="RevertFileContentStreamSoapIn">
-    <wsdl:part name="parameters" element="tns:RevertFileContentStream" />
-  </wsdl:message>
-  <wsdl:message name="RevertFileContentStreamSoapOut">
-    <wsdl:part name="parameters" element="tns:RevertFileContentStreamResponse" />
-  </wsdl:message>
-  <wsdl:message name="RevertAllFileContentStreamsSoapIn">
-    <wsdl:part name="parameters" element="tns:RevertAllFileContentStreams" />
-  </wsdl:message>
-  <wsdl:message name="RevertAllFileContentStreamsSoapOut">
-    <wsdl:part name="parameters" element="tns:RevertAllFileContentStreamsResponse" />
-  </wsdl:message>
-  <wsdl:message name="CustomizeCssSoapIn">
-    <wsdl:part name="parameters" element="tns:CustomizeCss" />
-  </wsdl:message>
-  <wsdl:message name="CustomizeCssSoapOut">
-    <wsdl:part name="parameters" element="tns:CustomizeCssResponse" />
-  </wsdl:message>
-  <wsdl:message name="RevertCssSoapIn">
-    <wsdl:part name="parameters" element="tns:RevertCss" />
-  </wsdl:message>
-  <wsdl:message name="RevertCssSoapOut">
-    <wsdl:part name="parameters" element="tns:RevertCssResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetActivatedFeaturesSoapIn">
-    <wsdl:part name="parameters" element="tns:GetActivatedFeatures" />
-  </wsdl:message>
-  <wsdl:message name="GetActivatedFeaturesSoapOut">
-    <wsdl:part name="parameters" element="tns:GetActivatedFeaturesResponse" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectIdFromUrlSoapIn">
-    <wsdl:part name="parameters" element="tns:GetObjectIdFromUrl" />
-  </wsdl:message>
-  <wsdl:message name="GetObjectIdFromUrlSoapOut">
-    <wsdl:part name="parameters" element="tns:GetObjectIdFromUrlResponse" />
-  </wsdl:message>
-  <wsdl:portType name="WebsSoap">
-    <wsdl:operation name="GetWebCollection">
-      <wsdl:input message="tns:GetWebCollectionSoapIn" />
-      <wsdl:output message="tns:GetWebCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetWeb">
-      <wsdl:input message="tns:GetWebSoapIn" />
-      <wsdl:output message="tns:GetWebSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetListTemplates">
-      <wsdl:input message="tns:GetListTemplatesSoapIn" />
-      <wsdl:output message="tns:GetListTemplatesSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetAllSubWebCollection">
-      <wsdl:input message="tns:GetAllSubWebCollectionSoapIn" />
-      <wsdl:output message="tns:GetAllSubWebCollectionSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="WebUrlFromPageUrl">
-      <wsdl:input message="tns:WebUrlFromPageUrlSoapIn" />
-      <wsdl:output message="tns:WebUrlFromPageUrlSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetContentTypes">
-      <wsdl:input message="tns:GetContentTypesSoapIn" />
-      <wsdl:output message="tns:GetContentTypesSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetContentType">
-      <wsdl:input message="tns:GetContentTypeSoapIn" />
-      <wsdl:output message="tns:GetContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CreateContentType">
-      <wsdl:input message="tns:CreateContentTypeSoapIn" />
-      <wsdl:output message="tns:CreateContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentType">
-      <wsdl:input message="tns:UpdateContentTypeSoapIn" />
-      <wsdl:output message="tns:UpdateContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentType">
-      <wsdl:input message="tns:DeleteContentTypeSoapIn" />
-      <wsdl:output message="tns:DeleteContentTypeSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypeXmlDocument">
-      <wsdl:input message="tns:UpdateContentTypeXmlDocumentSoapIn" />
-      <wsdl:output message="tns:UpdateContentTypeXmlDocumentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RemoveContentTypeXmlDocument">
-      <wsdl:input message="tns:RemoveContentTypeXmlDocumentSoapIn" />
-      <wsdl:output message="tns:RemoveContentTypeXmlDocumentSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetColumns">
-      <wsdl:input message="tns:GetColumnsSoapIn" />
-      <wsdl:output message="tns:GetColumnsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="UpdateColumns">
-      <wsdl:input message="tns:UpdateColumnsSoapIn" />
-      <wsdl:output message="tns:UpdateColumnsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetCustomizedPageStatus">
-      <wsdl:input message="tns:GetCustomizedPageStatusSoapIn" />
-      <wsdl:output message="tns:GetCustomizedPageStatusSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RevertFileContentStream">
-      <wsdl:input message="tns:RevertFileContentStreamSoapIn" />
-      <wsdl:output message="tns:RevertFileContentStreamSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RevertAllFileContentStreams">
-      <wsdl:input message="tns:RevertAllFileContentStreamsSoapIn" />
-      <wsdl:output message="tns:RevertAllFileContentStreamsSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="CustomizeCss">
-      <wsdl:input message="tns:CustomizeCssSoapIn" />
-      <wsdl:output message="tns:CustomizeCssSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="RevertCss">
-      <wsdl:input message="tns:RevertCssSoapIn" />
-      <wsdl:output message="tns:RevertCssSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetActivatedFeatures">
-      <wsdl:input message="tns:GetActivatedFeaturesSoapIn" />
-      <wsdl:output message="tns:GetActivatedFeaturesSoapOut" />
-    </wsdl:operation>
-    <wsdl:operation name="GetObjectIdFromUrl">
-      <wsdl:input message="tns:GetObjectIdFromUrlSoapIn" />
-      <wsdl:output message="tns:GetObjectIdFromUrlSoapOut" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="WebsSoap" type="tns:WebsSoap">
-    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetWebCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetWebCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetWeb">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetWeb" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListTemplates">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListTemplates" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAllSubWebCollection">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetAllSubWebCollection" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="WebUrlFromPageUrl">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/WebUrlFromPageUrl" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetContentTypes">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetContentTypes" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CreateContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CreateContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentType">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteContentType" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypeXmlDocument">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveContentTypeXmlDocument">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RemoveContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetColumns">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetColumns" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateColumns">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateColumns" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetCustomizedPageStatus">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetCustomizedPageStatus" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RevertFileContentStream">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RevertFileContentStream" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RevertAllFileContentStreams">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RevertAllFileContentStreams" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CustomizeCss">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CustomizeCss" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RevertCss">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RevertCss" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetActivatedFeatures">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetActivatedFeatures" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetObjectIdFromUrl">
-      <soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetObjectIdFromUrl" style="document" />
-      <wsdl:input>
-        <soap:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:binding name="WebsSoap12" type="tns:WebsSoap">
-    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
-    <wsdl:operation name="GetWebCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetWebCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetWeb">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetWeb" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetListTemplates">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListTemplates" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetAllSubWebCollection">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetAllSubWebCollection" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="WebUrlFromPageUrl">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/WebUrlFromPageUrl" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetContentTypes">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetContentTypes" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CreateContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CreateContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="DeleteContentType">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteContentType" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateContentTypeXmlDocument">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RemoveContentTypeXmlDocument">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RemoveContentTypeXmlDocument" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetColumns">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetColumns" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="UpdateColumns">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateColumns" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetCustomizedPageStatus">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetCustomizedPageStatus" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RevertFileContentStream">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RevertFileContentStream" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RevertAllFileContentStreams">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RevertAllFileContentStreams" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="CustomizeCss">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/CustomizeCss" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="RevertCss">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/RevertCss" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetActivatedFeatures">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetActivatedFeatures" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-    <wsdl:operation name="GetObjectIdFromUrl">
-      <soap12:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetObjectIdFromUrl" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="Webs">
-    <wsdl:port name="WebsSoap" binding="tns:WebsSoap">
-      <soap:address location="http://localhost/_vti_bin/webs.asmx" />
-    </wsdl:port>
-    <wsdl:port name="WebsSoap12" binding="tns:WebsSoap12">
-      <soap12:address location="http://localhost/_vti_bin/webs.asmx" />
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/connectors/slack/.gitignore b/connectors/slack/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/slack/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/slack/build.xml b/connectors/slack/build.xml
deleted file mode 100644
index 5ba854d..0000000
--- a/connectors/slack/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="slack" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-notification-connector">
-            <param name="connector-label" value="Slack"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.notifications.slack.SlackConnector"/>
-        </antcall>
-    </target>
-
-</project>
\ No newline at end of file
diff --git a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/Messages.java b/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/Messages.java
deleted file mode 100644
index 6ff3736..0000000
--- a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.slack;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.notifications.slack.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.notifications.slack";
-
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-
-}
-
diff --git a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackConfig.java b/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackConfig.java
deleted file mode 100644
index 8fc7b4f..0000000
--- a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackConfig.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.slack;
-
-
-/**
-* Parameters data for the Slack notification connector.
-*/
-public class SlackConfig {
-
-  /**
-  * Slack WebHook URL
-  */
-  public static final String WEBHOOK_URL_PARAM = "webHookUrl";
-
-  /**
-   * Proxy Host
-   */
-  public static final String PROXY_HOST_PARAM = "proxyHost";
-
-  /**
-   * Proxy Port
-   */
-
-  public static final String PROXY_PORT_PARAM = "proxyPort";
-
-  /**
-   * Proxy Username
-   */
-  public static final String PROXY_USERNAME_PARAM = "proxyUsername";
-
-  /**
-   * Proxy Password
-   */
-  public static final String PROXY_PASSWORD_PARAM = "proxyPassword";
-
-  /**
-   * Proxy Domain
-   */
-  public static final String PROXY_DOMAIN_PARAM = "proxyDomain";
-
-  /**
-  * URL template
-  */
-  public static final String URL_PARAM = "url";
-
-  // Specification nodes
-  public static final String NODE_FINISHED = "finished";
-  public static final String NODE_ERRORABORTED = "erroraborted";
-  public static final String NODE_MANUALABORTED = "manualaborted";
-  public static final String NODE_MANUALPAUSED = "manualpaused";
-  public static final String NODE_SCHEDULEPAUSED = "schedulepaused";
-  public static final String NODE_RESTARTED = "restarted";
-
-  public static final String NODE_CHANNEL = "channel";
-  public static final String NODE_MESSAGE = "message";
-
-  public static final String ATTRIBUTE_NAME = "name";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-
-}
\ No newline at end of file
diff --git a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackConnector.java b/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackConnector.java
deleted file mode 100644
index bcc8537..0000000
--- a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackConnector.java
+++ /dev/null
@@ -1,896 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.slack;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-/**
-*/
-public class SlackConnector extends org.apache.manifoldcf.crawler.notifications.BaseNotificationConnector {
-
-  protected final static long SESSION_EXPIRATION_MILLISECONDS = 300000L;
-
-  // Local variables.
-  protected long sessionExpiration = -1L;
-
-  // Parameters for establishing a session
-
-  protected String webHookUrl = null;
-
-  // Parameters for proxy connection
-  protected SlackSession.ProxySettings proxySettings = null;
-
-  // Local session handle
-  protected SlackSession session = null;
-
-  //////////////////////////////////Start of Basic Connector Methods/////////////////////////
-
-  /**
-  * Connect.
-  *
-  * @param configParameters is the set of configuration parameters, which
-  * in this case describe the root directory.
-  */
-  @Override
-  public void connect(ConfigParams configParameters) {
-    super.connect(configParameters);
-    this.webHookUrl = configParameters.getObfuscatedParameter(SlackConfig.WEBHOOK_URL_PARAM);
-
-    String proxyHost = configParameters.getParameter(SlackConfig.PROXY_HOST_PARAM);
-    String proxyPortString = configParameters.getParameter(SlackConfig.PROXY_PORT_PARAM);
-    if(StringUtils.isNotEmpty(proxyHost) && StringUtils.isNotEmpty(proxyPortString)) {
-      String proxyUsername = configParameters.getParameter(SlackConfig.PROXY_USERNAME_PARAM);
-      String proxyPassword = configParameters.getObfuscatedParameter(SlackConfig.PROXY_PASSWORD_PARAM);
-      String proxyDomain = configParameters.getParameter(SlackConfig.PROXY_DOMAIN_PARAM);
-      this.proxySettings = new SlackSession.ProxySettings(proxyHost, proxyPortString, proxyUsername, proxyPassword, proxyDomain);
-    } else {
-      Logging.connectors.info("Using no proxy settings - no proxyHost and no proxyPort found.");
-    }
-  }
-
-  /**
-  * Close the connection. Call this before discarding this instance of the
-  * repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException {
-    this.webHookUrl = null;
-    this.proxySettings = null;
-    finalizeConnection();
-    super.disconnect();
-  }
-
-  /**
-  * This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll() throws ManifoldCFException {
-    if (session != null)
-    {
-      if (System.currentTimeMillis() >= sessionExpiration)
-        finalizeConnection();
-    }
-  }
-
-  /**
-  * Test the connection. Returns a string describing the connection integrity.
-  *
-  * @return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-      throws ManifoldCFException {
-    try {
-      checkConnection();
-      return super.check();
-    } catch (ServiceInterruption e) {
-      return "Connection temporarily failed: " + e.getMessage();
-    } catch (ManifoldCFException e) {
-      return "Connection failed: " + e.getMessage();
-    }
-  }
-
-  protected void checkConnection() throws ManifoldCFException, ServiceInterruption {
-    // Force a re-connection
-    finalizeConnection();
-    getSession();
-    try {
-      CheckConnectionThread cct = new CheckConnectionThread(session);
-      cct.start();
-      cct.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      handleIOException(e,"checking the connection");
-    }
-  }
-
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption {
-    if (session == null) {
-
-      // Check that all the required parameters are there.
-      if (webHookUrl == null)
-        throw new ManifoldCFException("Missing webHookUrl parameter");
-
-      // Create a session.
-      try {
-        ConnectThread connectThread = new ConnectThread(webHookUrl, proxySettings);
-        connectThread.start();
-        session = connectThread.finishUp();
-      } catch (InterruptedException e) {
-        throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-      } catch (IOException e) {
-        handleIOException(e, "connecting");
-      }
-    }
-    sessionExpiration = System.currentTimeMillis() + SESSION_EXPIRATION_MILLISECONDS;
-  }
-
-  protected void finalizeConnection() {
-    if (session != null) {
-      try {
-        CloseSessionThread closeSessionThread = new CloseSessionThread(session);
-        closeSessionThread.start();
-        closeSessionThread.finishUp();
-      } catch (InterruptedException e) {
-      } catch (IOException e) {
-        Logging.connectors.warn("Error while closing connection to server: " + e.getMessage(),e);
-      } finally {
-        session = null;
-      }
-    }
-  }
-
-  ///////////////////////////////End of Basic Connector Methods////////////////////////////////////////
-
-  //////////////////////////////Start of Notification Connector Method///////////////////////////////////
-
-  /** Notify of job stop due to error abort.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopErrorAbort(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendSlackMessage(spec, SlackConfig.NODE_ERRORABORTED);
-  }
-
-  /** Notify of job stop due to manual abort.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopManualAbort(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendSlackMessage(spec, SlackConfig.NODE_MANUALABORTED);
-  }
-
-  /** Notify of job stop due to manual pause.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopManualPause(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendSlackMessage(spec, SlackConfig.NODE_MANUALPAUSED);
-  }
-
-  /** Notify of job stop due to schedule pause.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopSchedulePause(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendSlackMessage(spec, SlackConfig.NODE_SCHEDULEPAUSED);
-  }
-
-  /** Notify of job stop due to restart.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopRestart(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendSlackMessage(spec, SlackConfig.NODE_RESTARTED);
-  }
-
-  /** Notify of job end.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobEnd(final Specification spec)
-    throws ManifoldCFException, ServiceInterruption {
-    sendSlackMessage(spec, SlackConfig.NODE_FINISHED);
-  }
-
-  protected void sendSlackMessage(final Specification spec, final String nodeType)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String channel = "";
-    String message = "";
-    for (int i = 0; i < spec.getChildCount(); i++) {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(SlackConfig.NODE_CHANNEL))
-        channel = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-      else if (sn.getType().equals(SlackConfig.NODE_MESSAGE))
-        message = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-    }
-    // Look for node of the specified type
-    if (nodeType != null)
-    {
-      for (int i = 0; i < spec.getChildCount(); i++) {
-        SpecificationNode childNode = spec.getChild(i);
-        if (childNode.getType().equals(nodeType))
-        {
-          for (int j = 0; j < childNode.getChildCount(); j++) {
-            SpecificationNode sn = childNode.getChild(j);
-            if (sn.getType().equals(SlackConfig.NODE_CHANNEL))
-              channel = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-            else if (sn.getType().equals(SlackConfig.NODE_MESSAGE))
-              message = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-          }
-        }
-      }
-    }
-
-    if (StringUtils.isBlank(message)) {
-      return;
-    }
-
-    // Construct and send a slack message
-    getSession();
-
-    SendThread st = new SendThread(session, channel, message);
-    st.start();
-    try {
-      st.finishUp();
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      handleIOException(e,"sending slack message");
-    }
-  }
-
-
-  //////////////////////////////End of Notification Connector Methods///////////////////////////////////
-
-
-  ///////////////////////////////////////Start of Configuration UI/////////////////////////////////////
-
-  /**
-  * Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page. Its purpose is to
-  * add the required tabs to the list, and to output any javascript methods that might be needed by
-  * the configuration editing HTML.
-  * The connector does not need to be connected for this method to be called.
-  *
-  * @param threadContext is the local thread context.
-  * @param out is the output to which any HTML should be sent.
-  * @param locale is the desired locale.
-  * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  * @param tabsArray is an array of tab names. Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "SlackConnector.WebHook"));
-    // Map the parameters
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in the parameters from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    // Output the Javascript - only one Velocity template for all tabs
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationHeader.js", paramMap);
-  }
-
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException {
-    // Output the Server tab
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    // Set the tab name
-    paramMap.put("TabName", tabName);
-    // Fill in the parameters
-    fillInServerConfigurationMap(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, "Configuration_Server.html", paramMap);
-  }
-
-  private static void fillInServerConfigurationMap(Map<String, Object> paramMap, IPasswordMapperActivity mapper, ConfigParams parameters) {
-    String webHookUrl = parameters.getObfuscatedParameter(SlackConfig.WEBHOOK_URL_PARAM);
-    if (webHookUrl == null) {
-      webHookUrl = StringUtils.EMPTY;
-    } else {
-      webHookUrl = mapper.mapPasswordToKey(webHookUrl);
-    }
-
-    String proxyHost = getEmptyOnNull(parameters, SlackConfig.PROXY_HOST_PARAM);
-    String proxyPort = getEmptyOnNull(parameters, SlackConfig.PROXY_PORT_PARAM);
-    String proxyUsername = getEmptyOnNull(parameters, SlackConfig.PROXY_USERNAME_PARAM);
-
-    String proxyPassword = parameters.getObfuscatedParameter(SlackConfig.PROXY_PASSWORD_PARAM);
-    if(proxyPassword == null) {
-      proxyPassword = StringUtils.EMPTY;
-    } else {
-      proxyPassword = mapper.mapPasswordToKey(proxyPassword);
-    }
-
-    String proxyDomain = getEmptyOnNull(parameters, SlackConfig.PROXY_DOMAIN_PARAM);
-
-    paramMap.put("WEBHOOK_URL", webHookUrl);
-    paramMap.put("PROXY_HOST", proxyHost);
-    paramMap.put("PROXY_PORT", proxyPort);
-    paramMap.put("PROXY_USERNAME", proxyUsername);
-    paramMap.put("PROXY_PASSWORD", proxyPassword);
-    paramMap.put("PROXY_DOMAIN", proxyDomain);
-  }
-
-  private static String getEmptyOnNull(ConfigParams parameters, String key) {
-    String value = parameters.getParameter(key);
-    if (value == null) {
-      value = StringUtils.EMPTY;
-    }
-    return value;
-  }
-
-  /**
-  * Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility
-  * that form data for a connection has been posted. Its purpose is to gather form information and modify
-  * the configuration parameters accordingly.
-  * The name of the posted form is always "editconnection".
-  * The connector does not need to be connected for this method to be called.
-  *
-  * @param threadContext is the local thread context.
-  * @param variableContext is the set of variables available from the post, including binary file post information.
-  * @param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  * @return null if all is well, or a string error message if there is an error that should prevent saving of the
-  * connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    ConfigParams parameters) throws ManifoldCFException {
-
-    final String webHookUrl = variableContext.getParameter("webHookUrl");
-    if (webHookUrl != null) {
-      parameters.setObfuscatedParameter(SlackConfig.WEBHOOK_URL_PARAM, variableContext.mapKeyToPassword(webHookUrl));
-    }
-
-    final String proxyHost = variableContext.getParameter("proxyHost");
-    if (proxyHost != null) {
-      parameters.setParameter(SlackConfig.PROXY_HOST_PARAM, proxyHost);
-    }
-
-    final String proxyPort = variableContext.getParameter("proxyPort");
-    if (StringUtils.isNotEmpty(proxyPort)) {
-      try {
-        Integer.parseInt(proxyPort);
-      } catch (NumberFormatException e) {
-        Logging.connectors.warn("Proxy port must be a number. Found " + proxyPort);
-        throw new ManifoldCFException("Proxy Port must be a number: " + e.getMessage(), e);
-      }
-      parameters.setParameter(SlackConfig.PROXY_PORT_PARAM, proxyPort);
-    } else if(proxyPort != null){
-      parameters.setParameter(SlackConfig.PROXY_PORT_PARAM, proxyPort);
-    }
-
-    final String proxyUsername = variableContext.getParameter("proxyUsername");
-    if (proxyUsername != null) {
-      parameters.setParameter(SlackConfig.PROXY_USERNAME_PARAM, proxyUsername);
-    }
-
-    final String proxyPassword = variableContext.getParameter("proxyPassword");
-    if (proxyPassword != null) {
-      parameters.setObfuscatedParameter(SlackConfig.PROXY_PASSWORD_PARAM, variableContext.mapKeyToPassword(proxyPassword));
-    }
-
-    final String proxyDomain = variableContext.getParameter("proxyDomain");
-    if (proxyDomain != null) {
-      parameters.setParameter(SlackConfig.PROXY_DOMAIN_PARAM, proxyDomain);
-    }
-
-    return null;
-  }
-
-  /**
-  * View configuration. This method is called in the body section of the
-  * connector's view configuration page. Its purpose is to present the
-  * connection information to the user. The coder can presume that the HTML that
-  * is output from this configuration will be within appropriate <html> and
-  * <body> tags.
-  *
-  * @param threadContext is the local thread context.
-  * @param out is the output to which any HTML should be sent.
-  * @param parameters are the configuration parameters, as they currently exist, for
-  * this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Fill in map from each tab
-    fillInServerConfigurationMap(paramMap, out, parameters);
-
-    Messages.outputResourceWithVelocity(out, locale, "ConfigurationView.html", paramMap);
-  }
-
-
-  /////////////////////////////////End of configuration UI////////////////////////////////////////////////////
-
-
-  /////////////////////////////////Start of Specification UI//////////////////////////////////////////////////
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    // Add the tabs
-    tabsArray.add(Messages.getString(locale, "SlackConnector.Message"));
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationHeader.js", paramMap);
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException {
-    outputMessageTab(out, locale, ds, tabName, connectionSequenceNumber, actualSequenceNumber);
-  }
-
-  /**
-* Take care of "Message" tab.
-*/
-  protected void outputMessageTab(IHTTPOutput out, Locale locale,
-    Specification ds, String tabName, int connectionSequenceNumber, int actualSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("TabName", tabName);
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SelectedNum", Integer.toString(actualSequenceNumber));
-    fillInMessageTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "Specification_Message.html", paramMap);
-  }
-
-  /**
-  * Fill in Velocity context for Metadata tab.
-  */
-  protected static void fillInMessageTab(Map<String, Object> paramMap,
-    Specification ds) {
-
-    // Preload default values, for backwards compatibility
-    String channel = "";
-    String message = "";
-    for (int i = 0; i < ds.getChildCount(); i++) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(SlackConfig.NODE_CHANNEL)) {
-        channel = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-      } else if (sn.getType().equals(SlackConfig.NODE_MESSAGE)) {
-        message = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    // If ANY of the above are non-empty, we create a new dummy record
-    if (channel.length() > 0) {
-      // Add the dummy records
-      addRecord(paramMap, SlackConfig.NODE_FINISHED, channel, message);
-      addRecord(paramMap, SlackConfig.NODE_ERRORABORTED, channel, message);
-      addRecord(paramMap, SlackConfig.NODE_MANUALABORTED, channel, message);
-      addRecord(paramMap, SlackConfig.NODE_MANUALPAUSED, channel, message);
-      addRecord(paramMap, SlackConfig.NODE_SCHEDULEPAUSED, channel, message);
-      addRecord(paramMap, SlackConfig.NODE_RESTARTED, channel, message);
-
-    }
-    else
-    {
-      // Initialize all records with blanks
-      addRecord(paramMap, SlackConfig.NODE_FINISHED, "", "");
-      addRecord(paramMap, SlackConfig.NODE_ERRORABORTED, "", "");
-      addRecord(paramMap, SlackConfig.NODE_MANUALABORTED, "", "");
-      addRecord(paramMap, SlackConfig.NODE_MANUALPAUSED, "", "");
-      addRecord(paramMap, SlackConfig.NODE_SCHEDULEPAUSED, "", "");
-      addRecord(paramMap, SlackConfig.NODE_RESTARTED, "" ,"");
-
-      // Loop through nodes and pick them out that way
-      for (int i = 0; i < ds.getChildCount(); i++) {
-        SpecificationNode childNode = ds.getChild(i);
-        if (childNode.getType().equals(SlackConfig.NODE_FINISHED) ||
-          childNode.getType().equals(SlackConfig.NODE_ERRORABORTED) ||
-          childNode.getType().equals(SlackConfig.NODE_MANUALABORTED) ||
-          childNode.getType().equals(SlackConfig.NODE_MANUALPAUSED) ||
-          childNode.getType().equals(SlackConfig.NODE_SCHEDULEPAUSED) ||
-          childNode.getType().equals(SlackConfig.NODE_RESTARTED)) {
-          channel = "";
-          message = "";
-          for (int j = 0; j < childNode.getChildCount(); j++) {
-            SpecificationNode sn = childNode.getChild(j);
-            if (sn.getType().equals(SlackConfig.NODE_CHANNEL)) {
-              channel = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-            } else if (sn.getType().equals(SlackConfig.NODE_MESSAGE)) {
-              message = sn.getAttributeValue(SlackConfig.ATTRIBUTE_VALUE);
-            }
-          }
-          addRecord(paramMap, childNode.getType(), channel, message);
-        }
-      }
-    }
-  }
-
-  protected static void addRecord(Map<String,Object> paramMap, String nodeType, String channel, String message) {
-    paramMap.put(nodeType+"_CHANNEL", channel);
-    paramMap.put(nodeType+"_MESSAGE", message);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    return processMessageTab(variableContext, ds, connectionSequenceNumber);
-  }
-
-  protected String processMessageTab(IPostParameters variableContext, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Remove legacy nodes always
-    removeNodes(ds, SlackConfig.NODE_CHANNEL);
-    removeNodes(ds, SlackConfig.NODE_MESSAGE);
-
-    // Gather all different kinds.
-    gatherRecord(ds, seqPrefix, variableContext, SlackConfig.NODE_FINISHED);
-    gatherRecord(ds, seqPrefix, variableContext, SlackConfig.NODE_ERRORABORTED);
-    gatherRecord(ds, seqPrefix, variableContext, SlackConfig.NODE_MANUALABORTED);
-    gatherRecord(ds, seqPrefix, variableContext, SlackConfig.NODE_MANUALPAUSED);
-    gatherRecord(ds, seqPrefix, variableContext, SlackConfig.NODE_SCHEDULEPAUSED);
-    gatherRecord(ds, seqPrefix, variableContext, SlackConfig.NODE_RESTARTED);
-
-    return null;
-  }
-
-  protected static void gatherRecord(Specification ds, String seqPrefix, IPostParameters variableContext, String nodeType) {
-    removeNodes(ds, nodeType);
-    SpecificationNode sn = new SpecificationNode(nodeType);
-    String channel = variableContext.getParameter(seqPrefix + nodeType + "_channel");
-    if (channel != null)
-    {
-      addNodeValue(sn, SlackConfig.NODE_CHANNEL, channel);
-    }
-    String message = variableContext.getParameter(seqPrefix + nodeType + "_message");
-    if (message != null)
-    {
-      addNodeValue(sn, SlackConfig.NODE_MESSAGE, message);
-    }
-    ds.addChild(ds.getChildCount(),sn);
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SeqNum", Integer.toString(connectionSequenceNumber));
-    fillInMessageTab(paramMap, ds);
-    Messages.outputResourceWithVelocity(out, locale, "SpecificationView.html", paramMap);
-  }
-
-  ///////////////////////////////////////End of specification UI///////////////////////////////////////////////
-
-  protected static void removeNodes(Specification ds, String nodeTypeName) {
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(nodeTypeName))
-        ds.removeChild(i);
-      else
-        i++;
-    }
-  }
-
-  protected static void addNodeValue(SpecificationNode ds, String nodeType, String value)
-  {
-    SpecificationNode sn = new SpecificationNode(nodeType);
-    sn.setAttribute(SlackConfig.ATTRIBUTE_VALUE,value);
-    ds.addChild(ds.getChildCount(),sn);
-  }
-
-
-  /** Handle Messaging exceptions in a consistent global manner */
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Logging.connectors.error("Slack: Error "+context+": "+e.getMessage(),e);
-    throw new ManifoldCFException("Error "+context+": "+e.getMessage(),e);
-  }
-
-  /** Class to set up connection.
-  */
-  protected static class ConnectThread extends Thread
-  {
-    protected final String webHookUrl;
-    protected final SlackSession.ProxySettings proxySettings;
-
-    // Local session handle
-    protected SlackSession session = null;
-    protected Throwable exception = null;
-
-    public ConnectThread(String webHookUrl, SlackSession.ProxySettings proxySettings)
-    {
-      this.webHookUrl = webHookUrl;
-      this.proxySettings = proxySettings;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session = new SlackSession(webHookUrl, proxySettings);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public SlackSession finishUp()
-      throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-        return session;
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to close the session.
-  */
-  protected static class CloseSessionThread extends Thread
-  {
-    protected final SlackSession session;
-
-    protected Throwable exception = null;
-
-    public CloseSessionThread(SlackSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.close();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to check the connection.
-  */
-  protected static class CheckConnectionThread extends Thread
-  {
-    protected final SlackSession session;
-
-    protected Throwable exception = null;
-
-    public CheckConnectionThread(SlackSession session)
-    {
-      this.session = session;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.checkConnection();
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-
-  /** Class to send slack messages.
-  */
-  protected static class SendThread extends Thread
-  {
-    protected final SlackSession session;
-    protected final String channel;
-    protected final String message;
-
-    protected Throwable exception = null;
-
-    public SendThread(SlackSession session, String channel, String message)
-    {
-      this.session = session;
-      this.channel = channel;
-      this.message = message;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        session.send(channel, message);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws IOException, InterruptedException
-    {
-      try
-      {
-        join();
-        if (exception != null)
-        {
-          if (exception instanceof RuntimeException)
-            throw (RuntimeException)exception;
-          else if (exception instanceof Error)
-            throw (Error)exception;
-          else if (exception instanceof IOException)
-            throw (IOException)exception;
-          else
-            throw new RuntimeException("Unknown exception type: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-        }
-      } catch (InterruptedException e) {
-        this.interrupt();
-        throw e;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackMessage.java b/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackMessage.java
deleted file mode 100644
index d279560..0000000
--- a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackMessage.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.slack;
-
-public class SlackMessage {
-
-  private String channel;
-
-  private String text;
-
-  private boolean mrkdwn = true;
-
-  public String getChannel() {
-    return channel;
-  }
-
-  public void setChannel(String channel) {
-    this.channel = channel;
-  }
-
-  public String getText() {
-    return text;
-  }
-
-  public void setText(String text) {
-    this.text = text;
-  }
-
-  public boolean isMrkdwn() {
-    return mrkdwn;
-  }
-
-  public void setMrkdwn(boolean mrkdwn) {
-    this.mrkdwn = mrkdwn;
-  }
-
-}
diff --git a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackSession.java b/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackSession.java
deleted file mode 100644
index bf9b342..0000000
--- a/connectors/slack/connector/src/main/java/org/apache/manifoldcf/crawler/notifications/slack/SlackSession.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications.slack;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.text.MessageFormat;
-
-import javax.net.ssl.SSLSocketFactory;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.entity.EntityBuilder;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.util.EntityUtils;
-import org.apache.manifoldcf.connectorcommon.common.InterruptibleSocketFactory;
-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** This class represents a slack web hook session, without any protection
-* from threads waiting on sockets, etc.
-*/
-public class SlackSession
-{
-
-  private static String currentHost = null;
-
-  private CloseableHttpClient httpClient;
-  private ObjectMapper objectMapper;
-  private final String webHookUrl;
-
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (java.net.UnknownHostException e)
-    {
-    }
-  }
-
-  /**
-   * Create a session.
-   * @param webHookUrl - the webHookUrl to use for slack messages.
-   * @param proxySettingsOrNull - the proxy settings or null if not necessary.
-   * @throws ManifoldCFException
-   */
-  public SlackSession(final String webHookUrl, final ProxySettings proxySettingsOrNull) throws ManifoldCFException
-  {
-    this.webHookUrl = webHookUrl;
-    this.objectMapper = new ObjectMapper();
-    this.objectMapper.setSerializationInclusion(Include.NON_NULL);
-
-    int connectionTimeout = 60000;
-    int socketTimeout = 900000;
-
-    final RequestConfig.Builder requestBuilder = RequestConfig.custom()
-        .setSocketTimeout(socketTimeout)
-        .setConnectTimeout(connectionTimeout)
-        .setConnectionRequestTimeout(socketTimeout);
-
-    if(proxySettingsOrNull != null) {
-      addProxySettings(requestBuilder, proxySettingsOrNull);
-    }
-
-    // Create a ssl socket factory trusting everything.
-    // Reason: manifoldcf wishes connectors to encapsulate certificate handling
-    //         per connection and not rely on the global keystore.
-    //         A configurable keystore seems overkill for the slack notification use case
-    //         so we trust everything.
-    SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();
-    SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeout),
-        NoopHostnameVerifier.INSTANCE);
-
-    httpClient = HttpClientBuilder.create()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setSSLSocketFactory(myFactory)
-        .build();
-  }
-
-  private void addProxySettings(RequestConfig.Builder requestBuilder, ProxySettings proxySettingsOrNull)
-  {
-    if (proxySettingsOrNull.hasUsername()) {
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-      credentialsProvider.setCredentials(
-          new AuthScope(proxySettingsOrNull.getHost(), proxySettingsOrNull.getPort()),
-          new NTCredentials(proxySettingsOrNull.getUsername(),
-              (proxySettingsOrNull.getPassword() == null) ? "" : proxySettingsOrNull.getPassword(),
-                  currentHost,
-                  (proxySettingsOrNull.getDomain() == null) ? "" : proxySettingsOrNull.getDomain()));
-    }
-
-    HttpHost proxy = new HttpHost(proxySettingsOrNull.getHost(), proxySettingsOrNull.getPort());
-    requestBuilder.setProxy(proxy);
-  }
-
-  public void checkConnection() throws IOException
-  {
-    HttpPost postRequest = new HttpPost(webHookUrl);
-    int statusCode;
-    String responseBody = null;
-
-    try (CloseableHttpResponse response = httpClient.execute(postRequest)) {
-      responseBody = EntityUtils.toString(response.getEntity());
-      statusCode = response.getStatusLine().getStatusCode();
-    }
-
-    // the API responds with error 400 and payload "invalid_payload"
-    // when called without proper payload. We use this
-    // as a connection check, since there is no specific method to
-    // check if there is a working webhook endpoint.
-    boolean isExpectedStatus = statusCode == HttpStatus.SC_BAD_REQUEST;
-    boolean isExpectedPayload = "invalid_payload".equals(responseBody);
-    boolean isConnectionOk = isExpectedStatus && isExpectedPayload;
-    if (!isConnectionOk) {
-      String messageTemplate = "connection failed: status {0}, payload {1}";
-      String statusInfo = isExpectedStatus ? "ok" : statusCode + " is unexpected";
-      String payloadInfo = isExpectedPayload ? "ok" : "is unexpected";
-      String message = MessageFormat.format(messageTemplate, statusInfo, payloadInfo);
-      throw new ClientProtocolException(message);
-    }
-  }
-
-  public void send(String channel, String message) throws IOException
-  {
-    HttpPost messagePost = new HttpPost(webHookUrl);
-
-    SlackMessage slackMessage = new SlackMessage();
-    if (StringUtils.isNotBlank(channel)) {
-      slackMessage.setChannel(channel);
-    }
-    slackMessage.setText(message);
-
-    String json = objectMapper.writeValueAsString(slackMessage);
-
-    HttpEntity entity = EntityBuilder.create()
-        .setContentType(ContentType.APPLICATION_JSON)
-        .setContentEncoding(StandardCharsets.UTF_8.name())
-        .setText(json)
-        .build();
-
-    messagePost.setEntity(entity);
-    try (CloseableHttpResponse response = httpClient.execute(messagePost)) {
-      int statusCode = response.getStatusLine().getStatusCode();
-      if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) {
-        EntityUtils.consume(response.getEntity());
-      } else {
-        Logging.connectors.error("Sending slack message failed with statusline " + response.getStatusLine());
-        Logging.connectors.debug("  Response was: " + EntityUtils.toString(response.getEntity()));
-      }
-    }
-  }
-
-  public void close() throws IOException
-  {
-    httpClient.close();
-    httpClient = null;
-    objectMapper = null;
-  }
-
-  protected static final class ProxySettings {
-    private String host;
-    private int port = -1;
-    private String username;
-    private String password;
-    private String domain;
-
-    public ProxySettings(String host, String portString, String username, String password, String domain) {
-      this.host = host;
-      if(StringUtils.isNotEmpty(portString)) {
-        try {
-          this.port = Integer.parseInt(portString);
-        } catch (NumberFormatException e) {
-          Logging.connectors.warn("Proxy port must be an number. Found " + portString);
-        }
-      }
-      this.username = username;
-      this.password = password;
-      this.domain = domain;
-    }
-
-    public String getHost() {
-      return host;
-    }
-
-    public int getPort() {
-      return port;
-    }
-
-    public String getUsername() {
-      return username;
-    }
-
-    public boolean hasUsername() {
-      return StringUtils.isNotEmpty(this.username);
-    }
-
-    public String getPassword() {
-      return password;
-    }
-
-    public String getDomain() {
-      return domain;
-    }
-
-    @Override
-    public String toString() {
-      final StringBuilder sb = new StringBuilder("ProxySettings{");
-      sb.append("host='").append(host).append('\'');
-      sb.append(", port=").append(port);
-      sb.append(", username='").append(username).append('\'');
-      sb.append(", password='").append(password).append('\'');
-      sb.append(", domain='").append(domain).append('\'');
-      sb.append('}');
-      return sb.toString();
-    }
-  }
-}
\ No newline at end of file
diff --git a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_en_US.properties b/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_en_US.properties
deleted file mode 100644
index 96a4666..0000000
--- a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_en_US.properties
+++ /dev/null
@@ -1,38 +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.
-
-SlackConnector.WebHook=Slack WebHook
-SlackConnector.Message=Message
-
-SlackConnector.EnterAWebHookUrl=Enter a Slack WebHook URL
-SlackConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-SlackConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-SlackConnector.WebHookUrlColon=WebHook URL:
-SlackConnector.ProxyHostColon=Proxy Host:
-SlackConnector.ProxyPortColon=Proxy Port:
-SlackConnector.ProxyUsernameColon=Proxy NTLM Username:
-SlackConnector.ProxyPasswordColon=Proxy NTLM Password:
-SlackConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-SlackConnector.JobFinished=Job finished
-SlackConnector.JobStopErrorAbort=Job stopped due to error abort
-SlackConnector.JobStopManualAbort=Job stopped due to manual abort
-SlackConnector.JobStopManualPause=Job stopped due to manual pause
-SlackConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-SlackConnector.JobStopRestart=Job stopped due to job restart
-
-SlackConnector.ChannelColon=Channel:
-SlackConnector_MessageColon=Message:
diff --git a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_es_ES.properties b/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_es_ES.properties
deleted file mode 100644
index 96a4666..0000000
--- a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_es_ES.properties
+++ /dev/null
@@ -1,38 +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.
-
-SlackConnector.WebHook=Slack WebHook
-SlackConnector.Message=Message
-
-SlackConnector.EnterAWebHookUrl=Enter a Slack WebHook URL
-SlackConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-SlackConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-SlackConnector.WebHookUrlColon=WebHook URL:
-SlackConnector.ProxyHostColon=Proxy Host:
-SlackConnector.ProxyPortColon=Proxy Port:
-SlackConnector.ProxyUsernameColon=Proxy NTLM Username:
-SlackConnector.ProxyPasswordColon=Proxy NTLM Password:
-SlackConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-SlackConnector.JobFinished=Job finished
-SlackConnector.JobStopErrorAbort=Job stopped due to error abort
-SlackConnector.JobStopManualAbort=Job stopped due to manual abort
-SlackConnector.JobStopManualPause=Job stopped due to manual pause
-SlackConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-SlackConnector.JobStopRestart=Job stopped due to job restart
-
-SlackConnector.ChannelColon=Channel:
-SlackConnector_MessageColon=Message:
diff --git a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_ja_JP.properties b/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_ja_JP.properties
deleted file mode 100644
index 96a4666..0000000
--- a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_ja_JP.properties
+++ /dev/null
@@ -1,38 +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.
-
-SlackConnector.WebHook=Slack WebHook
-SlackConnector.Message=Message
-
-SlackConnector.EnterAWebHookUrl=Enter a Slack WebHook URL
-SlackConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-SlackConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-SlackConnector.WebHookUrlColon=WebHook URL:
-SlackConnector.ProxyHostColon=Proxy Host:
-SlackConnector.ProxyPortColon=Proxy Port:
-SlackConnector.ProxyUsernameColon=Proxy NTLM Username:
-SlackConnector.ProxyPasswordColon=Proxy NTLM Password:
-SlackConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-SlackConnector.JobFinished=Job finished
-SlackConnector.JobStopErrorAbort=Job stopped due to error abort
-SlackConnector.JobStopManualAbort=Job stopped due to manual abort
-SlackConnector.JobStopManualPause=Job stopped due to manual pause
-SlackConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-SlackConnector.JobStopRestart=Job stopped due to job restart
-
-SlackConnector.ChannelColon=Channel:
-SlackConnector_MessageColon=Message:
diff --git a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_zh_CN.properties b/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_zh_CN.properties
deleted file mode 100644
index 96a4666..0000000
--- a/connectors/slack/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/notifications/slack/common_zh_CN.properties
+++ /dev/null
@@ -1,38 +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.
-
-SlackConnector.WebHook=Slack WebHook
-SlackConnector.Message=Message
-
-SlackConnector.EnterAWebHookUrl=Enter a Slack WebHook URL
-SlackConnector.ProxyPortMustBeAnInteger=Proxy port must be an integer
-SlackConnector.ProxyPortMustBeGivenWithHost=Proxy port must be given when proxy host is configured
-
-SlackConnector.WebHookUrlColon=WebHook URL:
-SlackConnector.ProxyHostColon=Proxy Host:
-SlackConnector.ProxyPortColon=Proxy Port:
-SlackConnector.ProxyUsernameColon=Proxy NTLM Username:
-SlackConnector.ProxyPasswordColon=Proxy NTLM Password:
-SlackConnector.ProxyDomainColon=Proxy NTLM Authentication Domain:
-
-SlackConnector.JobFinished=Job finished
-SlackConnector.JobStopErrorAbort=Job stopped due to error abort
-SlackConnector.JobStopManualAbort=Job stopped due to manual abort
-SlackConnector.JobStopManualPause=Job stopped due to manual pause
-SlackConnector.JobStopSchedulePause=Job stopped due to scheduled pause
-SlackConnector.JobStopRestart=Job stopped due to job restart
-
-SlackConnector.ChannelColon=Channel:
-SlackConnector_MessageColon=Message:
diff --git a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/ConfigurationHeader.js b/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/ConfigurationHeader.js
deleted file mode 100644
index 3967757..0000000
--- a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/ConfigurationHeader.js
+++ /dev/null
@@ -1,57 +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.
--->
-
-<script type="text/javascript">
-function checkConfig()
-{
-  if (editconnection.proxyPort.value != "" && !isInteger(editconnection.proxyPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.ProxyPortMustBeAnInteger'))");
-    editconnection.proxyPort.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.webHookUrl.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.EnterAWebHookUrl'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.WebHook'))");
-    editconnection.webHookUrl.focus();
-    return false;
-  }
-  if (editconnection.proxyHost.value != "" && editconnection.proxyPort.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.ProxyPortMustBeGivenWithHost'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.WebHook'))");
-    editconnection.proxyPort.focus();
-    return false;
-  }
-  if (editconnection.proxyPort.value != "" && !isInteger(editconnection.proxyPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.ProxyPortMustBeAnInteger'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('SlackConnector.WebHook'))");
-    editconnection.proxyPort.focus();
-    return false;
-  }
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/ConfigurationView.html b/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/ConfigurationView.html
deleted file mode 100644
index 0236631..0000000
--- a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/ConfigurationView.html
+++ /dev/null
@@ -1,72 +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.
--->
-
-<table class="displaytable">
-
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.WebHookUrlColon'))</nobr>
-    </td>
-    <td class="value">
-      #if($WEBHOOK_URL && !$WEBHOOK_URL.empty)
-      <nobr>https://hooks.slack.com/services/********/********/************************</nobr>
-      #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_HOST)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_PORT)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_USERNAME)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      #if($PROXY_PASSWORD && !$PROXY_PASSWORD.empty)
-      <nobr>********</nobr>
-      #end
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($PROXY_DOMAIN)</nobr>
-    </td>
-</table>
-
diff --git a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/Configuration_Server.html b/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/Configuration_Server.html
deleted file mode 100644
index 8a6d39e..0000000
--- a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/Configuration_Server.html
+++ /dev/null
@@ -1,81 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SlackConnector.WebHook'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.WebHookUrlColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="webHookUrl" name="webHookUrl" type="password" size="80" value="$Encoder.attributeEscape($WEBHOOK_URL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyHostColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyHost" name="proxyHost" type="text" size="32" value="$Encoder.attributeEscape($PROXY_HOST)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyPortColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyPort" name="proxyPort" type="text" size="5" value="$Encoder.attributeEscape($PROXY_PORT)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyUsernameColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyUsername" name="proxyUsername" type="text" size="32" value="$Encoder.attributeEscape($PROXY_USERNAME)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyPasswordColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyPassword" name="proxyPassword" type="password" size="32" value="$Encoder.attributeEscape($PROXY_PASSWORD)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ProxyDomainColon'))</nobr>
-    </td>
-    <td class="value">
-      <input id="proxyDomain" name="proxyDomain" type="text" size="32" value="$Encoder.attributeEscape($PROXY_DOMAIN)"/>
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="webHookUrl" value="$Encoder.attributeEscape($WEBHOOK_URL)"/>
-<input type="hidden" name="proxyHost" value="$Encoder.attributeEscape($PROXY_HOST)"/>
-<input type="hidden" name="proxyPort" value="$Encoder.attributeEscape($PROXY_PORT)"/>
-<input type="hidden" name="proxyUsername" value="$Encoder.attributeEscape($PROXY_USERNAME)"/>
-<input type="hidden" name="proxyPassword" value="$Encoder.attributeEscape($PROXY_PASSWORD)"/>
-<input type="hidden" name="proxyDomain" value="$Encoder.attributeEscape($PROXY_DOMAIN)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/SpecificationHeader.js b/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/SpecificationHeader.js
deleted file mode 100644
index 0707450..0000000
--- a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/SpecificationHeader.js
+++ /dev/null
@@ -1,40 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function s${SeqNum}_checkSpecificationForSave()
-{
-  if (s${SeqNum}_checkMessageTabForSave() == false)
-    return false;
-  return true;
-}
-
-function s${SeqNum}_SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function s${SeqNum}_checkMessageTabForSave()
-{
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/SpecificationView.html b/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/SpecificationView.html
deleted file mode 100644
index e365f63..0000000
--- a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/SpecificationView.html
+++ /dev/null
@@ -1,104 +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.
--->
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobFinished'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($finished_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($finished_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopErrorAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($erroraborted_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($erroraborted_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopManualAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualaborted_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualaborted_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopManualPause'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($manualpaused_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($manualpaused_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopSchedulePause'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($schedulepaused_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($schedulepaused_MESSAGE)
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopRestart'))</nobr></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr></td>
-    <td class="value">
-      <nobr>$Encoder.bodyEscape($restarted_CHANNEL)</nobr>
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr></td>
-    <td class="value">
-      $Encoder.bodyEscape($restarted_MESSAGE)
-    </td>
-  </tr>
-
-</table>
diff --git a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/Specification_Message.html b/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/Specification_Message.html
deleted file mode 100644
index 534d7b2..0000000
--- a/connectors/slack/connector/src/main/resources/org/apache/manifoldcf/crawler/notifications/slack/Specification_Message.html
+++ /dev/null
@@ -1,152 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('SlackConnector.Message') && ${SeqNum} == ${SelectedNum})
-
-<table class="displaytable">
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobFinished'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_finished_channel" size="32" value="$Encoder.attributeEscape($finished_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_finished_message" rows="10" cols="50">$Encoder.bodyEscape($finished_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopErrorAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_erroraborted_channel" size="32" value="$Encoder.attributeEscape($erroraborted_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_erroraborted_message" rows="10" cols="50">$Encoder.bodyEscape($erroraborted_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopManualAbort'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualaborted_channel" size="32" value="$Encoder.attributeEscape($manualaborted_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_manualaborted_message" rows="10" cols="50">$Encoder.bodyEscape($manualaborted_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopManualPause'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_manualpaused_channel" size="32" value="$Encoder.attributeEscape($manualpaused_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_manualpaused_message" rows="10" cols="50">$Encoder.bodyEscape($manualpaused_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopSchedulePause'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_schedulepaused_channel" size="32" value="$Encoder.attributeEscape($schedulepaused_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_schedulepaused_message" rows="10" cols="50">$Encoder.bodyEscape($schedulepaused_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-  <tr><td class="message" colspan="2"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.JobStopRestart'))</nobr></td></tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector.ChannelColon'))</nobr>
-    </td>
-    <td class="value">
-      <input type="text" name="s${SeqNum}_restarted_channel" size="32" value="$Encoder.attributeEscape($restarted_CHANNEL)"/>
-    </td>
-  </tr>
-  <tr>
-    <td class="description">
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('SlackConnector_MessageColon'))</nobr>
-    </td>
-    <td class="value">
-      <textarea name="s${SeqNum}_restarted_message" rows="10" cols="50">$Encoder.bodyEscape($restarted_MESSAGE)</textarea>
-    </td>
-  </tr>
-
-</table>
-
-#else
-
-<input type="hidden" name="s${SeqNum}_finished_channel" value="$Encoder.attributeEscape($finished_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_finished_message" value="$Encoder.attributeEscape($finished_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_erroraborted_channel" value="$Encoder.attributeEscape($erroraborted_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_erroraborted_message" value="$Encoder.attributeEscape($erroraborted_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_manualaborted_channel" value="$Encoder.attributeEscape($manualaborted_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_manualaborted_message" value="$Encoder.attributeEscape($manualaborted_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_manualpaused_channel" value="$Encoder.attributeEscape($manualpaused_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_manualpaused_message" value="$Encoder.attributeEscape($manualpaused_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_schedulepaused_channel" value="$Encoder.attributeEscape($schedulepaused_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_schedulepaused_message" value="$Encoder.attributeEscape($schedulepaused_MESSAGE)"/>
-
-<input type="hidden" name="s${SeqNum}_restarted_channel" value="$Encoder.attributeEscape($restarted_CHANNEL)"/>
-<input type="hidden" name="s${SeqNum}_restarted_message" value="$Encoder.attributeEscape($restarted_MESSAGE)"/>
-
-#end
diff --git a/connectors/slack/pom.xml b/connectors/slack/pom.xml
deleted file mode 100644
index 4959b4c..0000000
--- a/connectors/slack/pom.xml
+++ /dev/null
@@ -1,371 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-slack-connector</artifactId>
-  <name>ManifoldCF - Connectors - Slack</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-	<dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>2.3.2</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-annotations</artifactId>
-      <version>2.3.0</version>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/solr/.gitignore b/connectors/solr/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/solr/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/solr/build.xml b/connectors/solr/build.xml
deleted file mode 100644
index 28ce73e..0000000
--- a/connectors/solr/build.xml
+++ /dev/null
@@ -1,91 +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.
--->
-
-<project name="solr" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-        <fileset dir="../../lib">
-            <include name="solr-solrj*.jar"/>
-            <include name="commons-math3*.jar"/>
-            <include name="noggit*.jar"/>
-            <include name="httpmime*.jar"/>
-            <include name="woodstox-core-asl*.jar"/>
-            <include name="stax2-api*.jar"/>
-            <include name="jcl-over-slf4j*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../../lib">
-                <include name="solr-solrj*.jar"/>
-                <include name="commons-math3*.jar"/>
-                <include name="noggit*.jar"/>
-                <include name="httpmime*.jar"/>
-                <include name="woodstox-core-asl*.jar"/>
-                <include name="stax2-api*.jar"/>
-                <include name="jcl-over-slf4j*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="integration">
-        <mkdir dir="dist/integration/solr-3.x"/>
-        <copy todir="dist/integration/solr-3.x">
-          <fileset dir="../../lib/solr-3.x"/>
-        </copy>
-        <mkdir dir="dist/integration/solr-4.x"/>
-        <copy todir="dist/integration/solr-4.x">
-          <fileset dir="../../lib/solr-4.x"/>
-        </copy>
-        <mkdir dir="dist/integration/solr-5.x"/>
-        <copy todir="dist/integration/solr-5.x">
-          <fileset dir="../../lib/solr-5.x"/>
-        </copy>
-        <mkdir dir="dist/integration/solr-6.x"/>
-        <copy todir="dist/integration/solr-6.x">
-          <fileset dir="../../lib/solr-6.x"/>
-        </copy>
-        <mkdir dir="dist/integration/solr-7.x"/>
-        <copy todir="dist/integration/solr-7.x">
-          <fileset dir="../../lib/solr-7.x"/>
-        </copy>
-    </target>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-output-connector">
-            <param name="connector-label" value="Solr"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.output.solr.SolrConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/HttpPoster.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/HttpPoster.java
deleted file mode 100644
index 2f55115..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/HttpPoster.java
+++ /dev/null
@@ -1,1746 +0,0 @@
-/* $Id: HttpPoster.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr;
-
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.impl.client.*;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.core.common.DateParser;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-import java.io.*;
-import java.net.MalformedURLException;
-import java.util.*;
-import java.util.regex.*;
-
-import org.apache.http.Consts;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.impl.XMLResponseParser;
-import org.apache.solr.common.util.ContentStreamBase;
-import org.apache.solr.client.solrj.SolrResponse;
-import org.apache.solr.client.solrj.response.SolrPingResponse;
-import org.apache.solr.client.solrj.response.UpdateResponse;
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.common.util.ContentStream;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.client.solrj.impl.HttpClientUtil;
-import org.apache.solr.common.SolrInputDocument;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
-* Posts an input stream to SOLR
-*
-* @author James Sablatura, modified by Karl Wright
-*/
-public class HttpPoster
-{
-  public static final String _rcsid = "@(#)$Id: HttpPoster.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  /** Ingestion buffer size property. */
-  public static String ingestBufferSizeProperty = "org.apache.manifoldcf.ingest.buffersize";
-  public static String ingestCredentialsRealm = "org.apache.manifoldcf.ingest.credentialrealm";
-  public static String ingestResponseRetryCount = "org.apache.manifoldcf.ingest.responseretrycount";
-  public static String ingestResponseRetryInterval = "org.apache.manifoldcf.ingest.retryinterval";
-  public static String ingestRescheduleInterval = "org.apache.manifoldcf.ingest.rescheduleinterval";
-  public static String ingestURIProperty = "org.apache.manifoldcf.ingest.uri";
-  public static String ingestUserProperty = "org.apache.manifoldcf.ingest.user";
-  public static String ingestPasswordProperty = "org.apache.manifoldcf.ingest.password";
-  public static String ingestMaxConnectionsProperty = "org.apache.manifoldcf.ingest.maxconnections";
-
-  // Solrj connection-associated objects
-  protected PoolingHttpClientConnectionManager connectionManager = null;
-  protected SolrClient solrServer = null;
-  
-  // Action URI pieces
-  private final String postUpdateAction;
-  private final String postRemoveAction;
-  private final String postStatusAction;
-  
-  // Attribute names
-  private final String allowAttributeName;
-  private final String denyAttributeName;
-  private final String idAttributeName;
-  private final String originalSizeAttributeName;
-  private final String modifiedDateAttributeName;
-  private final String createdDateAttributeName;
-  private final String indexedDateAttributeName;
-  private final String fileNameAttributeName;
-  private final String mimeTypeAttributeName;
-  private final String contentAttributeName;
-  
-  // Whether we use extract/update handler or not
-  private final boolean useExtractUpdateHandler;
-  
-  // Document max length
-  private final Long maxDocumentLength;
-
-  // Included and excluded mime types
-  private final Set<String> includedMimeTypes;
-  private final Set<String>excludedMimeTypes;
-  
-  // Commit-within flag
-  private final String commitWithin;
-
-  // Constants we need
-  private static final String LITERAL = "literal.";
-  private static final String NOTHING = "__NOTHING__";
-  private static final String ID_METADATA = "lcf_metadata_id";
-  private static final String COMMITWITHIN_METADATA = "commitWithin";
-  
-  /** How long to wait before retrying a failed ingestion */
-  private static final long interruptionRetryTime = 60000L;
-
-  /** Initialize the SolrCloud http poster.
-  */
-  public HttpPoster(String zookeeperHosts, String collection,
-    int zkClientTimeout, int zkConnectTimeout,
-    String updatePath, String removePath, String statusPath,
-    String allowAttributeName, String denyAttributeName, String idAttributeName,
-    String originalSizeAttributeName, String modifiedDateAttributeName, String createdDateAttributeName, String indexedDateAttributeName,
-    String fileNameAttributeName, String mimeTypeAttributeName, String contentAttributeName,
-    Long maxDocumentLength,
-    String commitWithin, boolean useExtractUpdateHandler,
-    final Set<String> includedMimeTypes, final Set<String> excludedMimeTypes,
-    boolean allowCompression)
-    throws ManifoldCFException
-  {
-    // These are the paths to the handlers in Solr that deal with the actions we need to do
-    this.postUpdateAction = updatePath;
-    this.postRemoveAction = removePath;
-    this.postStatusAction = statusPath;
-    
-    this.commitWithin = commitWithin;
-    
-    this.allowAttributeName = allowAttributeName;
-    this.denyAttributeName = denyAttributeName;
-    this.idAttributeName = idAttributeName;
-    this.originalSizeAttributeName = originalSizeAttributeName;
-    this.modifiedDateAttributeName = modifiedDateAttributeName;
-    this.createdDateAttributeName = createdDateAttributeName;
-    this.indexedDateAttributeName = indexedDateAttributeName;
-    this.fileNameAttributeName = fileNameAttributeName;
-    this.mimeTypeAttributeName = mimeTypeAttributeName;
-    this.contentAttributeName = contentAttributeName;
-    this.useExtractUpdateHandler = useExtractUpdateHandler;
-    this.includedMimeTypes = includedMimeTypes;
-    this.excludedMimeTypes = excludedMimeTypes;
-    
-    this.maxDocumentLength = maxDocumentLength;
-    
-    try
-    {
-      CloudSolrClient cloudSolrServer = new CloudSolrClient.Builder()
-        .withZkHost(zookeeperHosts)
-        .withLBHttpSolrClient(new ModifiedLBHttpSolrClient(HttpClientUtil.createClient(null), allowCompression))
-        .build();
-      cloudSolrServer.setZkClientTimeout(zkClientTimeout);
-      cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
-      cloudSolrServer.setDefaultCollection(collection);
-      // Set the solrj instance we want to use
-      solrServer = cloudSolrServer;
-    }
-    catch (MalformedURLException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Initialize the standard http poster.
-  */
-  public HttpPoster(String protocol, String server, int port, String webapp, String core,
-    int connectionTimeout, int socketTimeout,
-    String updatePath, String removePath, String statusPath,
-    String realm, String userID, String password,
-    String allowAttributeName, String denyAttributeName, String idAttributeName,
-    String originalSizeAttributeName, String modifiedDateAttributeName, String createdDateAttributeName, String indexedDateAttributeName,
-    String fileNameAttributeName, String mimeTypeAttributeName, String contentAttributeName,
-    IKeystoreManager keystoreManager, Long maxDocumentLength,
-    String commitWithin, boolean useExtractUpdateHandler,
-    final Set<String> includedMimeTypes, final Set<String> excludedMimeTypes,
-    boolean allowCompression)
-    throws ManifoldCFException
-  {
-    // These are the paths to the handlers in Solr that deal with the actions we need to do
-    this.postUpdateAction = updatePath;
-    this.postRemoveAction = removePath;
-    this.postStatusAction = statusPath;
-    
-    this.commitWithin = commitWithin;
-    
-    this.allowAttributeName = allowAttributeName;
-    this.denyAttributeName = denyAttributeName;
-    this.idAttributeName = idAttributeName;
-    this.originalSizeAttributeName = originalSizeAttributeName;
-    this.modifiedDateAttributeName = modifiedDateAttributeName;
-    this.createdDateAttributeName = createdDateAttributeName;
-    this.indexedDateAttributeName = indexedDateAttributeName;
-    this.fileNameAttributeName = fileNameAttributeName;
-    this.mimeTypeAttributeName = mimeTypeAttributeName;
-    this.contentAttributeName = contentAttributeName;
-    this.useExtractUpdateHandler = useExtractUpdateHandler;
-    this.includedMimeTypes = includedMimeTypes;
-    this.excludedMimeTypes = excludedMimeTypes;
-    
-    this.maxDocumentLength = maxDocumentLength;
-
-    String location = "";
-    if (webapp != null)
-      location = "/" + webapp;
-    if (core != null)
-    {
-      if (webapp == null)
-        throw new ManifoldCFException("Webapp must be specified if core is specified.");
-      location += "/" + core;
-    }
-
-    // Initialize standard solr-j.
-    
-    SSLConnectionSocketFactory myFactory;
-    if (keystoreManager != null)
-    {
-      myFactory = new SSLConnectionSocketFactory(keystoreManager.getSecureSocketFactory(), NoopHostnameVerifier.INSTANCE);
-    }
-    else
-    {
-      // Use the "trust everything" one
-      myFactory = new SSLConnectionSocketFactory(KeystoreManagerFactory.getTrustingSecureSocketFactory(),NoopHostnameVerifier.INSTANCE);
-    }
-
-    // First, we need an HttpClient where basic auth is properly set up.
-    connectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-      .register("http", PlainConnectionSocketFactory.getSocketFactory())
-      .register("https", myFactory)
-      .build());
-    connectionManager.setDefaultMaxPerRoute(1);
-    connectionManager.setValidateAfterInactivity(2000);
-    connectionManager.setDefaultSocketConfig(SocketConfig.custom()
-      .setTcpNoDelay(true)
-      .setSoTimeout(socketTimeout)
-      .build());
-    
-    RequestConfig.Builder requestBuilder = RequestConfig.custom()
-      .setCircularRedirectsAllowed(true)
-      .setSocketTimeout(socketTimeout)
-      .setExpectContinueEnabled(true)
-      .setConnectTimeout(connectionTimeout)
-      .setConnectionRequestTimeout(socketTimeout);
-
-    HttpClientBuilder clientBuilder = HttpClients.custom()
-      .setConnectionManager(connectionManager)
-      .disableAutomaticRetries()
-      .setDefaultRequestConfig(requestBuilder.build())
-      .setRedirectStrategy(new LaxRedirectStrategy())
-      .setRequestExecutor(new HttpRequestExecutor(socketTimeout));
-
-
-    if (userID != null && userID.length() > 0 && password != null)
-    {
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-      Credentials credentials = new UsernamePasswordCredentials(userID, password);
-      if (realm != null)
-        credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, realm), credentials);
-      else
-        credentialsProvider.setCredentials(AuthScope.ANY, credentials);
-
-      clientBuilder.setDefaultCredentialsProvider(credentialsProvider);
-    }
-
-    HttpClient localClient = clientBuilder.build();
-
-
-    String httpSolrServerUrl = protocol + "://" + server + ":" + port + location;
-    solrServer = new ModifiedHttpSolrClient(httpSolrServerUrl, localClient, new XMLResponseParser(), allowCompression);
-  }
-
-  /** Shut down the poster.
-  */
-  public void shutdown()
-  {
-    if (solrServer != null)
-    {
-      try
-      {
-        solrServer.close();
-      }
-      catch (IOException ioe)
-      {
-        // Eat this exception
-      }
-      solrServer = null;
-    }
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-  }
-  
-  /** Cause a commit to happen.
-  */
-  public void commitPost()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("commitPost()");
-
-    // Open a socket to ingest, and to the response stream to get the post result
-    try
-    {
-      CommitThread t = new CommitThread();
-      try
-      {
-        t.start();
-        t.finishUp();
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-    }
-    catch (SolrServerException e)
-    {
-      handleSolrServerException(e, "commit");
-      return;
-    }
-    catch (SolrException e)
-    {
-      handleSolrException(e, "commit");
-      return;
-    }
-    catch (RuntimeException e)
-    {
-      handleRuntimeException(e, "commit");
-      return;
-    }
-    catch (IOException ioe)
-    {
-      handleIOException(ioe, "commit");
-      return;
-    }
-  }
-  
-  /** Handle a RuntimeException.
-  * Unfortunately, SolrCloud 4.6.x throws RuntimeExceptions whenever ZooKeeper is not happy.
-  * We have to catch these too.  I've logged a ticket: SOLR-5678.
-  */
-  protected static void handleRuntimeException(RuntimeException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Throwable childException = e.getCause();
-    if (childException != null && childException instanceof java.util.concurrent.TimeoutException)
-    {
-      Logging.ingest.warn("SolrJ runtime exception during "+context+": "+childException.getMessage(),childException);
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption(childException.getMessage(),childException,
-        currentTime + interruptionRetryTime,
-        currentTime + 2L * 60L * 60000L,
-        -1,
-        true);
-    }
-    throw e;
-  }
-  
-  /** Handle a SolrServerException.
-  * These exceptions seem to be catch-all exceptions having to do either with misconfiguration or
-  * with underlying IO exceptions.
-  * If this method doesn't throw an exception, it means that the exception should be interpreted
-  * as meaning that the document or action is illegal and should not be repeated.
-  */
-  protected static void handleSolrServerException(SolrServerException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    Throwable childException = e.getCause();
-    if (childException instanceof IOException)
-    {
-      handleIOException((IOException)childException, context);
-      return;
-    }
-    throw new ManifoldCFException("Unhandled SolrServerException: "+e.getMessage(),e);
-  }
-
-  /** Handle a SolrException.
-  * These exceptions are mainly Http errors having to do with actual responses from Solr.
-  * If this method doesn't throw an exception, it means that the exception should be interpreted
-  * as meaning that the document or action is illegal and should not be repeated.
-  */
-  protected static void handleSolrException(SolrException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    int code = e.code();
-    if (code == 0)
-    {
-      try
-      {
-        // Solrj doesn't always set the code properly.  If it doesn't, we have to parse it out of the exception string.  Ugh.
-        Pattern p = Pattern.compile("non ok status:([0-9]*),");
-        Matcher m = p.matcher(e.getMessage());
-        if (m.find())
-          code = Integer.parseInt(m.group(1));
-      }
-      catch (PatternSyntaxException e2)
-      {
-        throw new ManifoldCFException("Unexpected error: "+e2.getMessage());
-      }
-      catch (NumberFormatException e2)
-      {
-        throw new ManifoldCFException("Unexpected error: "+e2.getMessage());
-      }
-    }
-      
-    // Use the exception text to determine the proper result.
-    if (code == 500 && e.getMessage().indexOf("org.apache.tika.exception.TikaException") != -1)
-      // Can't process the document, so don't keep trying.
-      return;
-
-    // If code is 401, we should abort the job because security credentials are incorrect
-    if (code == 401)
-    {
-      String message = "Solr authorization failure, code "+code+": aborting job";
-      Logging.ingest.error(message);
-      throw new ManifoldCFException(message);
-    }
-    
-    // If the code is in the 400 range, the document will never be accepted, so indicate that.
-    if (code >= 400 && code < 500)
-      return;
-    
-    // The only other kind of return code we know how to handle is 50x.
-    // For these, we should retry for a while.
-    if (code == 500)
-    {
-      long currentTime = System.currentTimeMillis();
-      
-      // Log the error
-      String message = "Solr exception during "+context+" ("+e.code()+"): "+e.getMessage();
-      Logging.ingest.warn(message,e);
-      throw new ServiceInterruption(message,
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 2L * 60L * 60000L,
-        -1,
-        true);
-    }
-    
-    // Unknown code: end the job.
-    throw new ManifoldCFException("Unhandled Solr exception during "+context+" ("+e.code()+"): "+e.getMessage());
-  }
-  
-  /** Handle an IOException.
-  * I'm not actually sure where these exceptions come from in SolrJ, but we handle them
-  * as real I/O errors, meaning they should be retried.
-  */
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if ((e instanceof InterruptedIOException) && (!(e instanceof java.net.SocketTimeoutException)))
-      throw new ManifoldCFException(e.getMessage(), ManifoldCFException.INTERRUPTED);
-
-    long currentTime = System.currentTimeMillis();
-    
-    if (e instanceof java.net.ConnectException)
-    {
-      // Server isn't up at all.  Try for a brief time then give up.
-      String message = "Server could not be contacted during "+context+": "+e.getMessage();
-      Logging.ingest.warn(message,e);
-      throw new ServiceInterruption(message,
-        e,
-        currentTime + interruptionRetryTime,
-        -1L,
-        3,
-        true);
-    }
-    
-    if (e instanceof java.net.SocketTimeoutException)
-    {
-      String message2 = "Socket timeout exception during "+context+": "+e.getMessage();
-      Logging.ingest.warn(message2,e);
-      throw new ServiceInterruption(message2,
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 20L * 60000L,
-        -1,
-        false);
-    }
-      
-    if (e.getClass().getName().equals("java.net.SocketException"))
-    {
-      // In the past we would have treated this as a straight document rejection, and
-      // treated it in the same manner as a 400.  The reasoning is that the server can
-      // perfectly legally send out a 400 and drop the connection immediately thereafter,
-      // this a race condition.
-      // However, Solr 4.0 (or the Jetty version that the example runs on) seems
-      // to have a bug where it drops the connection when two simultaneous documents come in
-      // at the same time.  This is the final version of Solr 4.0 so we need to deal with
-      // this.
-      if (e.getMessage().toLowerCase(Locale.ROOT).indexOf("broken pipe") != -1 ||
-        e.getMessage().toLowerCase(Locale.ROOT).indexOf("connection reset") != -1 ||
-        e.getMessage().toLowerCase(Locale.ROOT).indexOf("target server failed to respond") != -1)
-      {
-        // Treat it as a service interruption, but with a limited number of retries.
-        // In that way we won't burden the user with a huge retry interval; it should
-        // give up fairly quickly, and yet NOT give up if the error was merely transient
-        String message = "Server dropped connection during "+context+": "+e.getMessage();
-        Logging.ingest.warn(message,e);
-        throw new ServiceInterruption(message,
-          e,
-          currentTime + interruptionRetryTime,
-          -1L,
-          3,
-          false);
-      }
-      
-      // Other socket exceptions are service interruptions - but if we keep getting them, it means 
-      // that a socket timeout is probably set too low to accept this particular document.  So
-      // we retry for a while, then skip the document.
-      String message2 = "Socket exception during "+context+": "+e.getMessage();
-      Logging.ingest.warn(message2,e);
-      throw new ServiceInterruption(message2,
-        e,
-        currentTime + interruptionRetryTime,
-        currentTime + 20L * 60000L,
-        -1,
-        false);
-    }
-
-    // Otherwise, no idea what the trouble is, so presume that retries might fix it.
-    String message3 = "IO exception during "+context+": "+e.getMessage();
-    Logging.ingest.warn(message3,e);
-    throw new ServiceInterruption(message3,
-      e,
-      currentTime + interruptionRetryTime,
-      currentTime + 2L * 60L * 60000L,
-      -1,
-      true);
-  }
-  
-  /**
-  * Post the input stream to ingest
-  *
-   * @param documentURI is the document's uri.
-   * @param document is the document structure to ingest.
-   * @param arguments are the configuration arguments to pass in the post.  Key is argument name, value is a list of the argument values.
-   * @param authorityNameString is the name of the governing authority for this document's acls, or null if none.
-   * @param activities is the activities object, so we can report what's happening.   @return true if the ingestion was successful, or false if the ingestion is illegal.
-  * @throws ManifoldCFException, ServiceInterruption
-  */
-  public boolean indexPost(String documentURI,
-    RepositoryDocument document, Map<String,List<String>> arguments,
-    String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("indexPost(): '" + documentURI + "'");
-
-    // If the document is too long, reject it.
-    if (maxDocumentLength != null && document.getBinaryLength() > maxDocumentLength.longValue()){
-      activities.recordActivity(null,SolrConnector.INGEST_ACTIVITY,null,documentURI,activities.EXCLUDED_LENGTH,"Solr connector rejected document due to its big size: ('"+document.getBinaryLength()+"')");
-      return false;
-    }
-
-    // If not the right mime type, reject it.
-    if ((includedMimeTypes !=null || excludedMimeTypes != null) && !checkMimeTypeIndexable(document.getMimeType(), useExtractUpdateHandler, includedMimeTypes, excludedMimeTypes)) {
-      activities.recordActivity(null,SolrConnector.INGEST_ACTIVITY,null,documentURI,activities.EXCLUDED_MIMETYPE,"Solr connector rejected document due to mime type restrictions: ("+document.getMimeType()+")");
-      return false;
-    }
-    
-    // Convert the incoming acls that we know about to qualified forms, and reject the document if
-    // we don't know how to deal with its acls
-    Map<String,String[]> aclsMap = new HashMap<String,String[]>();
-    Map<String,String[]> denyAclsMap = new HashMap<String,String[]>();
-
-    Iterator<String> aclTypes = document.securityTypesIterator();
-    while (aclTypes.hasNext())
-    {
-      String aclType = aclTypes.next();
-      aclsMap.put(aclType,convertACL(document.getSecurityACL(aclType),authorityNameString,activities));
-      denyAclsMap.put(aclType,convertACL(document.getSecurityDenyACL(aclType),authorityNameString,activities));
-      
-      // Reject documents that have security we don't know how to deal with in the Solr plugin!!  Only safe thing to do.
-      if (!aclType.equals(RepositoryDocument.SECURITY_TYPE_DOCUMENT) &&
-        !aclType.equals(RepositoryDocument.SECURITY_TYPE_SHARE) &&
-        !aclType.startsWith(RepositoryDocument.SECURITY_TYPE_PARENT)){
-          activities.recordActivity(null,SolrConnector.INGEST_ACTIVITY,null,documentURI,activities.UNKNOWN_SECURITY,"Solr connector rejected document that has security info which Solr does not recognize: '"+aclType + "'");
-          return false;
-      }
-
-    }
-
-    try
-    {
-      IngestThread t = new IngestThread(documentURI,document,arguments,
-                                        aclsMap,denyAclsMap);
-      try
-      {
-        t.start();
-        t.finishUp();
-
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.INGEST_ACTIVITY,t.getActivityBytes(),documentURI,t.getActivityCode(),t.getActivityDetails());
-
-        return t.getRval();
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-      catch (SolrServerException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.INGEST_ACTIVITY,t.getActivityBytes(),documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-      catch (SolrException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.INGEST_ACTIVITY,t.getActivityBytes(),documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.INGEST_ACTIVITY,t.getActivityBytes(),documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-      catch (IOException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.INGEST_ACTIVITY,t.getActivityBytes(),documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-    }
-    catch (SolrServerException e)
-    {
-      handleSolrServerException(e, "indexing "+documentURI);
-      return false;
-    }
-    catch (SolrException e)
-    {
-      handleSolrException(e, "indexing "+documentURI);
-      return false;
-    }
-    catch (RuntimeException e)
-    {
-      handleRuntimeException(e, "indexing "+documentURI);
-      return false;
-    }
-    catch (IOException ioe)
-    {
-      handleIOException(ioe, "indexing "+documentURI);
-      return false;
-    }
-
-  }
-
-  /** Post a check request.
-  */
-  public void checkPost()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("checkPost()");
-
-    // Open a socket to ingest, and to the response stream to get the post result
-    try
-    {
-      StatusThread t = new StatusThread();
-      try
-      {
-        t.start();
-        t.finishUp();
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-    }
-    catch (SolrServerException e)
-    {
-      handleSolrServerException(e, "check");
-      return;
-    }
-    catch (SolrException e)
-    {
-      handleSolrException(e, "check");
-      return;
-    }
-    catch (RuntimeException e)
-    {
-      handleRuntimeException(e, "check");
-      return;
-    }
-    catch (IOException ioe)
-    {
-      handleIOException(ioe, "check");
-      return;
-    }
-
-  }
-
-  /** Post a delete request.
-  *@param documentURI is the document's URI.
-  */
-  public void deletePost(String documentURI, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (Logging.ingest.isDebugEnabled())
-      Logging.ingest.debug("deletePost(): '" + documentURI + "'");
-
-    try
-    {
-      DeleteThread t = new DeleteThread(documentURI);
-      try
-      {
-        t.start();
-        t.finishUp();
-        
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.REMOVE_ACTIVITY,null,documentURI,t.getActivityCode(),t.getActivityDetails());
-
-        return;
-      }
-      catch (InterruptedException e)
-      {
-        t.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-      catch (SolrServerException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.REMOVE_ACTIVITY,null,documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-      catch (SolrException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.REMOVE_ACTIVITY,null,documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.REMOVE_ACTIVITY,null,documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-      catch (IOException e)
-      {
-        if (t.getActivityCode() != null)
-          activities.recordActivity(t.getActivityStart(),SolrConnector.REMOVE_ACTIVITY,null,documentURI,t.getActivityCode(),t.getActivityDetails());
-        throw e;
-      }
-    }
-    catch (SolrServerException e)
-    {
-      handleSolrServerException(e, "delete");
-      return;
-    }
-    catch (SolrException e)
-    {
-      handleSolrException(e, "delete");
-      return;
-    }
-    catch (RuntimeException e)
-    {
-      handleRuntimeException(e, "delete");
-      return;
-    }
-    catch (IOException ioe)
-    {
-      handleIOException(ioe, "delete");
-      return;
-    }
-
-  }
-
-  private final static Set<String> acceptableMimeTypes = new HashSet<String>();
-  static
-  {
-    acceptableMimeTypes.add("text/plain;charset=utf-8");
-    acceptableMimeTypes.add("text/plain;charset=ascii");
-    acceptableMimeTypes.add("text/plain;charset=us-ascii");
-    acceptableMimeTypes.add("text/plain; charset=utf-8");
-    acceptableMimeTypes.add("text/plain; charset=ascii");
-    acceptableMimeTypes.add("text/plain; charset=us-ascii");
-    acceptableMimeTypes.add("text/plain");
-  }
-
-  public static boolean checkMimeTypeIndexable(final String mimeType, final boolean useExtractUpdateHandler,
-    final Set<String> includedMimeTypes, final Set<String> excludedMimeTypes)
-  {
-    final String lowerMimeType = mimeType.toLowerCase(Locale.ROOT);
-    if (useExtractUpdateHandler)
-    {
-      if (includedMimeTypes != null && !includedMimeTypes.contains(lowerMimeType))
-        return false;
-      if (excludedMimeTypes != null && excludedMimeTypes.contains(lowerMimeType))
-        return false;
-      return true;
-    }
-    return acceptableMimeTypes.contains(lowerMimeType);
-  }
-
-  /** Convert an unqualified ACL to qualified form.
-  * @param acl is the initial, unqualified ACL.
-  * @param authorityNameString is the name of the governing authority for this document's acls, or null if none.
-  * @param activities is the activities object, so we can report what's happening.
-  * @return the modified ACL.
-  */
-  protected static String[] convertACL(String[] acl, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException
-  {
-    if (acl != null)
-    {
-      String[] rval = new String[acl.length];
-      int i = 0;
-      while (i < rval.length)
-      {
-        rval[i] = activities.qualifyAccessToken(authorityNameString,acl[i]);
-        i++;
-      }
-      return rval;
-    }
-    return new String[0];
-  }
-
-  /** Write a field */
-  protected static void writeField(ModifiableSolrParams out, String fieldName, String[] fieldValues)
-  {
-    out.add(fieldName, fieldValues);
-  }
-  
-  /** Write a field */
-  protected static void writeField(ModifiableSolrParams out, String fieldName, List<String> fieldValues)
-  {
-    String[] values = new String[fieldValues.size()];
-    int i = 0;
-    for (String fieldValue : fieldValues) {
-      values[i++] = fieldValue;
-    }
-    writeField(out, fieldName, values);
-  }
-  
-  /** Write a field */
-  protected static void writeField(ModifiableSolrParams out, String fieldName, String fieldValue)
-  {
-    out.add(fieldName, fieldValue);
-  }
-
-  /** Output an acl level */
-  protected void writeACLs(ModifiableSolrParams out, String aclType, String[] acl, String[] denyAcl)
-  {
-    String metadataACLName = LITERAL + allowAttributeName + aclType;
-    for (int i = 0; i < acl.length; i++)
-    {
-      writeField(out,metadataACLName,acl[i]);
-    }
-    String metadataDenyACLName = LITERAL + denyAttributeName + aclType;
-    for (int i = 0; i < denyAcl.length; i++)
-    {
-      writeField(out,metadataDenyACLName,denyAcl[i]);
-    }
-  }
-  
-  /**
-    * Output an acl level in a SolrInputDocument
-    */
-  protected void writeACLsInSolrDoc( SolrInputDocument inputDoc, String aclType, String[] acl, String[] denyAcl )
-  {
-    String metadataACLName = allowAttributeName + aclType;
-    inputDoc.addField( metadataACLName, acl );
-
-    String metadataDenyACLName = denyAttributeName + aclType;
-    inputDoc.addField( metadataDenyACLName, denyAcl );
-  }
-
-  /** Killable thread that does ingestions.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a single document ingestion.
-  */
-  protected class IngestThread extends java.lang.Thread
-  {
-    protected final String documentURI;
-    protected final RepositoryDocument document;
-    protected final Map<String,List<String>> arguments;
-    protected final Map<String,String[]> aclsMap;
-    protected final Map<String,String[]> denyAclsMap;
-    
-    protected Long activityStart = null;
-    protected Long activityBytes = null;
-    protected String activityCode = null;
-    protected String activityDetails = null;
-    protected Throwable exception = null;
-    protected boolean readFromDocumentStreamYet = false;
-    protected boolean rval = false;
-
-    public IngestThread(String documentURI, RepositoryDocument document,
-      Map<String, List<String>> arguments,
-      Map<String,String[]> aclsMap, Map<String,String[]> denyAclsMap)
-    {
-      super();
-      setDaemon(true);
-      this.documentURI = documentURI;
-      this.document = document;
-      this.arguments = arguments;
-      this.aclsMap = aclsMap;
-      this.denyAclsMap = denyAclsMap;
-    }
-
-    public void run()
-    {
-      long length = document.getBinaryLength();
-      InputStream is = document.getBinaryStream();
-      String contentType = document.getMimeType();
-      String contentName = document.getFileName();
-
-      try
-      {
-        // Do the operation!
-        long fullStartTime = System.currentTimeMillis();
-
-        // Open a socket to ingest, and to the response stream to get the post result
-        try
-        {
-          SolrInputDocument currentSolrDoc = new SolrInputDocument();
-          ContentStreamUpdateRequest contentStreamUpdateRequest = new ContentStreamUpdateRequest(postUpdateAction);
-          if ( useExtractUpdateHandler )
-          {
-            buildExtractUpdateHandlerRequest( length, is, contentType, (contentName==null || contentName.length()==0)?"docname":contentName,
-              contentStreamUpdateRequest );
-          }
-          else
-          {
-            currentSolrDoc = buildSolrDocument( length, is );
-          }
-
-          // Fire off the request.
-          // Note: I need to know whether the document has been permanently rejected or not, but we currently have
-          // no means to determine that.  Analysis of SolrServerExceptions that have been thrown is likely needed.
-          try
-          {
-            readFromDocumentStreamYet = true;
-            UpdateResponse response;
-            if ( useExtractUpdateHandler )
-            {
-              response = contentStreamUpdateRequest.process( solrServer );
-            }
-            else
-            {
-              if (commitWithin != null)
-              {
-                response = solrServer.add( currentSolrDoc, Integer.parseInt(commitWithin) );
-              }
-              else
-              {
-                response = solrServer.add( currentSolrDoc );
-              }
-            }
-
-            // Successful completion
-            activityStart = new Long(fullStartTime);
-            activityBytes = new Long(length);
-            activityCode = "OK";
-            activityDetails = null;
-
-            rval = true;
-            return;
-          }
-          catch (SolrServerException e)
-          {
-            // Log what happened to us
-            activityStart = new Long(fullStartTime);
-            activityBytes = new Long(length);
-            activityDetails = e.getMessage() +
-              ((e.getCause() != null)?": "+e.getCause().getMessage():"");
-            
-            // Broken pipe exceptions we log specially because they usually mean
-            // Solr has rejected the document, and the user will want to know that.
-            if (e.getCause() != null && e.getCause().getClass().getName().equals("java.net.SocketException") &&
-              (activityDetails.toLowerCase(Locale.ROOT).indexOf("broken pipe") != -1 ||
-                activityDetails.toLowerCase(Locale.ROOT).indexOf("connection reset") != -1 ||
-                activityDetails.toLowerCase(Locale.ROOT).indexOf("target server failed to respond") != -1))
-              activityCode = "SOLRREJECT";
-            else
-              activityCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-
-            // Rethrow; will interpret at a higher level
-            throw e;
-          }
-          catch (SolrException e)
-          {
-            // Log what happened to us
-            activityStart = new Long(fullStartTime);
-            activityBytes = new Long(length);
-            activityCode = Integer.toString(e.code());
-            activityDetails = e.getMessage() +
-              ((e.getCause() != null)?": "+e.getCause().getMessage():"");
-            
-            // Rethrow; we'll interpret at the next level
-            throw e;
-          }
-        }
-        catch (IOException ioe)
-        {
-          if ((ioe instanceof InterruptedIOException) && (!(ioe instanceof java.net.SocketTimeoutException)))
-            return;
-          
-          activityStart = new Long(fullStartTime);
-          activityCode = ioe.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          activityDetails = ioe.getMessage();
-
-          // Log the error
-          Logging.ingest.warn("Error indexing into Solr: "+ioe.getMessage(),ioe);
-
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    private SolrInputDocument buildSolrDocument( long length, InputStream is )
-      throws IOException
-    {
-      SolrInputDocument outputDoc = new SolrInputDocument();
-
-      // Write the id field
-      outputDoc.addField( idAttributeName, documentURI );
-      
-      if (contentAttributeName != null)
-      {
-        // Copy the content into a string.  This is a bad thing to do, but we have no choice given SolrJ architecture at this time.
-        // We enforce a size limit upstream.
-        Reader r = new InputStreamReader(is, Consts.UTF_8);
-        StringBuilder sb = new StringBuilder((int)length);
-        char[] buffer = new char[65536];
-        while (true)
-        {
-          int amt = r.read(buffer,0,buffer.length);
-          if (amt == -1)
-            break;
-          sb.append(buffer,0,amt);
-        }
-        outputDoc.addField( contentAttributeName, sb.toString() );
-      }
-      
-      // Write the rest of the attributes
-      if ( originalSizeAttributeName != null )
-      {
-        Long size = document.getOriginalSize();
-        if ( size != null )
-        {
-          outputDoc.addField( originalSizeAttributeName, size.toString() );
-        }
-      }
-      if ( modifiedDateAttributeName != null )
-      {
-        Date date = document.getModifiedDate();
-        if ( date != null )
-        {
-          outputDoc.addField( modifiedDateAttributeName, DateParser.formatISO8601Date( date ) );
-        }
-      }
-      if ( createdDateAttributeName != null )
-      {
-        Date date = document.getCreatedDate();
-        if ( date != null )
-        {
-          outputDoc.addField( createdDateAttributeName, DateParser.formatISO8601Date( date ) );
-        }
-
-      }
-      if ( indexedDateAttributeName != null )
-      {
-        Date date = document.getIndexingDate();
-        if ( date != null )
-        {
-          outputDoc.addField( indexedDateAttributeName, DateParser.formatISO8601Date( date ) );
-        }
-      }
-      if ( fileNameAttributeName != null )
-      {
-        String fileName = document.getFileName();
-        if ( !StringUtils.isBlank(fileName) )
-        {
-          outputDoc.addField( fileNameAttributeName, fileName );
-        }
-      }
-      if ( mimeTypeAttributeName != null )
-      {
-        String mimeType = document.getMimeType();
-        if ( !StringUtils.isBlank(mimeType) )
-        {
-          outputDoc.addField( mimeTypeAttributeName, mimeType );
-        }
-      }
-
-      Iterator<String> typeIterator = aclsMap.keySet().iterator();
-      while (typeIterator.hasNext())
-      {
-        String aclType = typeIterator.next();
-        writeACLsInSolrDoc(outputDoc,aclType,aclsMap.get(aclType),denyAclsMap.get(aclType));
-      }
-
-      // Write the arguments
-      for ( String name : arguments.keySet() )
-      {
-        List<String> values = arguments.get( name );
-        outputDoc.addField( name, values );
-      }
-
-      // Write the metadata, each in a field by itself
-      buildSolrParamsFromMetadata( outputDoc );
-
-      return outputDoc;
-    }
-
-    private void buildExtractUpdateHandlerRequest( long length, InputStream is, String contentType,
-      String contentName,
-      ContentStreamUpdateRequest contentStreamUpdateRequest )
-      throws IOException
-    {
-      ModifiableSolrParams out = new ModifiableSolrParams();
-      Logging.ingest.debug("Solr: Writing document '"+documentURI);
-      
-      // Write the id field
-      writeField(out,LITERAL+idAttributeName,documentURI);
-      // Write the rest of the attributes
-      if (originalSizeAttributeName != null)
-      {
-        Long size = document.getOriginalSize();
-        if (size != null)
-          // Write value
-          writeField(out,LITERAL+originalSizeAttributeName,size.toString());
-      }
-      if (modifiedDateAttributeName != null)
-      {
-        Date date = document.getModifiedDate();
-        if (date != null)
-          // Write value
-          writeField(out,LITERAL+modifiedDateAttributeName,DateParser.formatISO8601Date(date));
-      }
-      if (createdDateAttributeName != null)
-      {
-        Date date = document.getCreatedDate();
-        if (date != null)
-          // Write value
-          writeField(out,LITERAL+createdDateAttributeName,DateParser.formatISO8601Date(date));
-      }
-      if (indexedDateAttributeName != null)
-      {
-        Date date = document.getIndexingDate();
-        if (date != null)
-          // Write value
-          writeField(out,LITERAL+indexedDateAttributeName,DateParser.formatISO8601Date(date));
-      }
-      if (fileNameAttributeName != null)
-      {
-        String fileName = document.getFileName();
-        if (!StringUtils.isBlank(fileName))
-          writeField(out,LITERAL+fileNameAttributeName,fileName);
-      }
-      if (mimeTypeAttributeName != null)
-      {
-        String mimeType = document.getMimeType();
-        if (!StringUtils.isBlank(mimeType))
-          writeField(out,LITERAL+mimeTypeAttributeName,mimeType);
-      }
-          
-      // Write the access token information
-      // Both maps have the same keys.
-      Iterator<String> typeIterator = aclsMap.keySet().iterator();
-      while (typeIterator.hasNext())
-      {
-        String aclType = typeIterator.next();
-        writeACLs(out,aclType,aclsMap.get(aclType),denyAclsMap.get(aclType));
-      }
-
-      // Write the arguments
-      for (String name : arguments.keySet())
-      {
-        List<String> values = arguments.get(name);
-        writeField(out,name,values);
-      }
-
-      // Write the metadata, each in a field by itself
-      buildSolrParamsFromMetadata(out);
-             
-      // These are unnecessary now in the case of non-solrcloud setups, because we overrode the SolrJ posting method to use multipart.
-      //writeField(out,LITERAL+"stream_size",String.valueOf(length));
-      //writeField(out,LITERAL+"stream_name",document.getFileName());
-          
-      // General hint for Tika
-      if (!StringUtils.isBlank(document.getFileName()))
-        writeField(out,"resource.name",document.getFileName());
-          
-      // Write the commitWithin parameter
-      if (commitWithin != null)
-        writeField(out,COMMITWITHIN_METADATA,commitWithin);
-
-      contentStreamUpdateRequest.setParams(out);
-          
-      contentStreamUpdateRequest.addContentStream(new RepositoryDocumentStream(is,length,contentType,contentName));
-      
-      Logging.ingest.debug("Solr: Done writing '"+documentURI+"'");
-    }
-
-    /**
-      * builds the solr parameter maps for the update request.
-      * For each mapping expressed is applied the renaming for the metadata field name.
-      * If we set to keep all the metadata, the metadata non present in the mapping will be kept with their original names.
-      * In the other case ignored
-      * @param out
-      * @throws IOException
-      */
-    private void buildSolrParamsFromMetadata(ModifiableSolrParams out) throws IOException
-    {
-      Iterator<String> iter = document.getFields();
-      while (iter.hasNext())
-      {
-        String originalFieldName = iter.next();
-        String fieldName = makeSafeLuceneField(originalFieldName);
-        Logging.ingest.debug("Solr: Saw field '"+originalFieldName+"'; converted to '"+fieldName+"'");
-        applySingleMapping(originalFieldName, out, fieldName);
-      }
-    }
-
-    private void buildSolrParamsFromMetadata(SolrInputDocument outputDocument) throws IOException
-    {
-      Iterator<String> iter = document.getFields();
-      while (iter.hasNext())
-      {
-        String originalFieldName = iter.next();
-        String fieldName = makeSafeLuceneField(originalFieldName);
-        applySingleMapping(originalFieldName, outputDocument, fieldName);
-      }
-    }
-
-    private void applySingleMapping(String originalFieldName, ModifiableSolrParams out, String newFieldName) throws IOException {
-      if(newFieldName != null && !newFieldName.isEmpty()) {
-        if (newFieldName.toLowerCase(Locale.ROOT).equals(idAttributeName.toLowerCase(Locale.ROOT))) {
-          newFieldName = ID_METADATA;
-        }
-        String[] values = document.getFieldAsStrings(originalFieldName);
-        writeField(out,LITERAL+newFieldName,values);
-      }
-    }
-
-    private void applySingleMapping(String originalFieldName, SolrInputDocument outputDocument, String newFieldName) throws IOException {
-      if(newFieldName != null && !newFieldName.isEmpty()) {
-        if (newFieldName.toLowerCase(Locale.ROOT).equals(idAttributeName.toLowerCase(Locale.ROOT))) {
-          newFieldName = ID_METADATA;
-        }
-        String[] values = document.getFieldAsStrings(originalFieldName);
-        outputDocument.addField( newFieldName, values );
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, SolrServerException, IOException
-    {
-      join();
-
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof SolrServerException)
-          throw (SolrServerException)thr;
-        if (thr instanceof IOException)
-          throw (IOException)thr;
-        if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-
-    public Long getActivityStart()
-    {
-      return activityStart;
-    }
-
-    public Long getActivityBytes()
-    {
-      return activityBytes;
-    }
-
-    public String getActivityCode()
-    {
-      return activityCode;
-    }
-
-    public String getActivityDetails()
-    {
-      return activityDetails;
-    }
-
-    public boolean getReadFromDocumentStreamYet()
-    {
-      return readFromDocumentStreamYet;
-    }
-
-    public boolean getRval()
-    {
-      return rval;
-    }
-  }
-
-  /** Killable thread that does deletions.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a single document deletion.
-  */
-  protected class DeleteThread extends java.lang.Thread
-  {
-    protected String documentURI;
-
-    protected Long activityStart = null;
-    protected String activityCode = null;
-    protected String activityDetails = null;
-    protected Throwable exception = null;
-
-    public DeleteThread(String documentURI)
-    {
-      super();
-      setDaemon(true);
-      this.documentURI = documentURI;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Do the operation!
-        long fullStartTime = System.currentTimeMillis();
-        // Open a socket to ingest, and to the response stream to get the post result
-        try
-        {
-          UpdateResponse response = new UpdateRequest(postRemoveAction).deleteById(documentURI).process(solrServer);
-            
-          // Success
-          activityStart = new Long(fullStartTime);
-          activityCode = "OK";
-          activityDetails = null;
-          return;
-        }
-        catch (InterruptedIOException ioe)
-        {
-          return;
-        }
-        catch (SolrServerException e)
-        {
-          activityStart = new Long(fullStartTime);
-          activityCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          activityDetails = e.getMessage() +
-            ((e.getCause() != null)?": "+e.getCause().getMessage():"");
-
-          throw e;
-        }
-        catch (SolrException e)
-        {
-          activityStart = new Long(fullStartTime);
-          activityCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          activityDetails = e.getMessage() +
-            ((e.getCause() != null)?": "+e.getCause().getMessage():"");
-
-          throw e;
-        }
-        catch (IOException ioe)
-        {
-          // Log the error
-          Logging.ingest.warn("Error deleting document: "+ioe.getMessage(),ioe);
-
-          activityStart = new Long(fullStartTime);
-          activityCode = ioe.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-          activityDetails = ioe.getMessage();
-
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, SolrServerException, IOException
-    {
-      join();
-
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof SolrServerException)
-          throw (SolrServerException)thr;
-        if (thr instanceof IOException)
-          throw (IOException)thr;
-        if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-    public Long getActivityStart()
-    {
-      return activityStart;
-    }
-
-    public String getActivityCode()
-    {
-      return activityCode;
-    }
-
-    public String getActivityDetails()
-    {
-      return activityDetails;
-    }
-  }
-  
-  /** Killable thread that does a commit.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a commit.
-  */
-  protected class CommitThread extends java.lang.Thread
-  {
-    protected Throwable exception = null;
-
-    public CommitThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          // Do the operation!
-          UpdateRequest updateRequest = new UpdateRequest(postUpdateAction + "?commit=true");
-          UpdateResponse response = updateRequest.process(solrServer);
-          //UpdateResponse response = solrServer.commit();
-        }
-        catch (InterruptedIOException ioe)
-        {
-          return;
-        }
-        catch (IOException ioe)
-        {
-          // Log the error
-          Logging.ingest.warn("Error committing: "+ioe.getMessage(),ioe);
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, SolrServerException, IOException
-    {
-      join();
-
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof SolrServerException)
-          throw (SolrServerException)thr;
-        if (thr instanceof IOException)
-          throw (IOException)thr;
-        if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-
-  }
-
-
-  /** Killable thread that does a status check.
-  * Java 1.5 stopped permitting thread interruptions to abort socket waits.  As a result, it is impossible to get threads to shutdown cleanly that are doing
-  * such waits.  So, the places where this happens are segregated in their own threads so that they can be just abandoned.
-  *
-  * This thread does a status check.
-  */
-  protected class StatusThread extends java.lang.Thread
-  {
-    protected Throwable exception = null;
-
-    public StatusThread()
-    {
-      super();
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Do the operation!
-        try
-        {
-          SolrResponse response = new SolrPing(postStatusAction).process(solrServer);
-        }
-        catch (InterruptedIOException ioe)
-        {
-          // Exit the thread.
-          return;
-        }
-        catch (IOException ioe)
-        {
-          // Log the error
-          Logging.ingest.warn("Error checking status: "+ioe.getMessage(),ioe);
-          throw ioe;
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, SolrServerException, IOException
-    {
-      join();
-
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof SolrServerException)
-          throw (SolrServerException)thr;
-        if (thr instanceof IOException)
-          throw (IOException)thr;
-        if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        if (thr instanceof Error)
-          throw (Error)thr;
-        else
-          throw new RuntimeException("Unexpected exception type: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-
-  }
-
-  /** Class for importing documents into Solr via SolrJ
-  */
-  protected static class RepositoryDocumentStream extends ContentStreamBase
-  {
-    protected final InputStream is;
-    protected final long length;
-    protected final String contentType;
-    protected final String contentName;
-    
-    public RepositoryDocumentStream(InputStream is, long length, String contentType, String contentName)
-    {
-      this.is = is;
-      this.length = length;
-      this.contentType = contentType;
-      this.contentName = contentName;
-    }
-    
-    @Override
-    public Long getSize()
-    {
-      return new Long(length);
-    }
-    
-    @Override
-    public InputStream getStream() throws IOException
-    {
-      return is;
-    }
-    
-    @Override
-    public Reader getReader() throws IOException
-    {
-      return null;
-    }
-
-    @Override
-    public String getContentType()
-    {
-      return contentType;
-    }
-
-    @Override
-    public String getName()
-    {
-      return contentName;
-    }
-  }
-
-  /** Special version of ping class where we can control the URL
-  */
-  protected static class SolrPing extends SolrRequest
-  {
-    /** Request parameters. */
-    private ModifiableSolrParams params;
-    
-    /**
-     * Create a new SolrPing object.
-     */
-    public SolrPing() {
-      super(METHOD.GET, "/admin/ping");
-      params = new ModifiableSolrParams();
-    }
-    
-    public SolrPing(String url)
-    {
-      super( METHOD.GET, url );
-      params = new ModifiableSolrParams();
-    }
-
-    @Override
-    public Collection<ContentStream> getContentStreams() {
-      return null;
-    }
-
-    @Override
-    protected SolrPingResponse createResponse(SolrClient client) {
-      return new SolrPingResponse();
-    }
-
-    @Override
-    public ModifiableSolrParams getParams() {
-      return params;
-    }
-    
-    /**
-     * Remove the action parameter from this request. This will result in the same
-     * behavior as {@code SolrPing#setActionPing()}. For Solr server version 4.0
-     * and later.
-     * 
-     * @return this
-     */
-    public SolrPing removeAction() {
-      params.remove(CommonParams.ACTION);
-      return this;
-    }
-    
-    /**
-     * Set the action parameter on this request to enable. This will delete the
-     * health-check file for the Solr core. For Solr server version 4.0 and later.
-     * 
-     * @return this
-     */
-    public SolrPing setActionDisable() {
-      params.set(CommonParams.ACTION, CommonParams.DISABLE);
-      return this;
-    }
-    
-    /**
-     * Set the action parameter on this request to enable. This will create the
-     * health-check file for the Solr core. For Solr server version 4.0 and later.
-     * 
-     * @return this
-     */
-    public SolrPing setActionEnable() {
-      params.set(CommonParams.ACTION, CommonParams.ENABLE);
-      return this;
-    }
-    
-    /**
-     * Set the action parameter on this request to ping. This is the same as not
-     * including the action at all. For Solr server version 4.0 and later.
-     * 
-     * @return this
-     */
-    public SolrPing setActionPing() {
-      params.set(CommonParams.ACTION, CommonParams.PING);
-      return this;
-    }
-
-  }
-
-  /** See CONNECTORS-956.  Make a safe lucene field name from a possibly
-  * unsafe input field name from a repository connector.
-  */
-  protected static String makeSafeLuceneField(String inputField)
-  {
-    StringBuilder sb = new StringBuilder();
-    boolean isFirst = true;
-    for (int i = 0; i < inputField.length(); i++)
-    {
-      char x = inputField.charAt(i);
-      if (isFirst && !Character.isJavaIdentifierStart(x) || !isFirst && !Character.isJavaIdentifierPart(x))
-      {
-        // Check for exceptions for Lucene
-        if (!isFirst && (x == '.' || x == '-'))
-          sb.append(x);
-        else
-          sb.append('_');
-      }
-      else
-      {
-        // Check for exceptions for Lucene
-        if (isFirst && x == '$')
-          sb.append('_');
-        else
-          sb.append(x);
-      }
-      isFirst = false;
-    }
-    return sb.toString();
-  }
-  
-}
-
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/Messages.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/Messages.java
deleted file mode 100644
index 49bce7b..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.output.solr.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.output.solr";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedHttpMultipart.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedHttpMultipart.java
deleted file mode 100644
index 2f97323..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedHttpMultipart.java
+++ /dev/null
@@ -1,267 +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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.manifoldcf.agents.output.solr;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.http.entity.mime.content.ContentBody;
-import org.apache.http.entity.mime.MinimalField;
-import org.apache.http.entity.mime.FormBodyPart;
-import org.apache.http.entity.mime.HttpMultipartMode;
-import org.apache.http.entity.mime.MIME;
-import org.apache.http.entity.mime.Header;
-import org.apache.http.util.ByteArrayBuffer;
-
-/**
- * HttpMultipart represents a collection of MIME multipart encoded content bodies. This class is
- * capable of operating either in the strict (RFC 822, RFC 2045, RFC 2046 compliant) or
- * the browser compatible modes.
- *
- * @since 4.0
- */
-public class ModifiedHttpMultipart {
-
-    private static ByteArrayBuffer encode(
-            final Charset charset, final String string) {
-        ByteBuffer encoded = charset.encode(CharBuffer.wrap(string));
-        ByteArrayBuffer bab = new ByteArrayBuffer(encoded.remaining());
-        bab.append(encoded.array(), encoded.position(), encoded.remaining());
-        return bab;
-    }
-
-    private static void writeBytes(
-            final ByteArrayBuffer b, final OutputStream out) throws IOException {
-        out.write(b.buffer(), 0, b.length());
-    }
-
-    private static void writeBytes(
-            final String s, final Charset charset, final OutputStream out) throws IOException {
-        ByteArrayBuffer b = encode(charset, s);
-        writeBytes(b, out);
-    }
-
-    private static void writeBytes(
-            final String s, final OutputStream out) throws IOException {
-        ByteArrayBuffer b = encode(MIME.DEFAULT_CHARSET, s);
-        writeBytes(b, out);
-    }
-
-    private static void writeField(
-            final MinimalField field, final OutputStream out) throws IOException {
-        writeBytes(field.getName(), out);
-        writeBytes(FIELD_SEP, out);
-        writeBytes(field.getBody(), out);
-        writeBytes(CR_LF, out);
-    }
-
-    private static void writeField(
-            final MinimalField field, final Charset charset, final OutputStream out) throws IOException {
-        writeBytes(field.getName(), charset, out);
-        writeBytes(FIELD_SEP, out);
-        writeBytes(field.getBody(), charset, out);
-        writeBytes(CR_LF, out);
-    }
-
-    private static final ByteArrayBuffer FIELD_SEP = encode(MIME.DEFAULT_CHARSET, ": ");
-    private static final ByteArrayBuffer CR_LF = encode(MIME.DEFAULT_CHARSET, "\r\n");
-    private static final ByteArrayBuffer TWO_DASHES = encode(MIME.DEFAULT_CHARSET, "--");
-
-
-    private final String subType;
-    private final Charset charset;
-    private final String boundary;
-    private final List<FormBodyPart> parts;
-
-    private final HttpMultipartMode mode;
-
-    /**
-     * Creates an instance with the specified settings.
-     *
-     * @param subType mime subtype - must not be {@code null}
-     * @param charset the character set to use. May be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
-     * @param boundary to use  - must not be {@code null}
-     * @param mode the mode to use
-     * @throws IllegalArgumentException if charset is null or boundary is null
-     */
-    public ModifiedHttpMultipart(final String subType, final Charset charset, final String boundary, HttpMultipartMode mode) {
-        super();
-        if (subType == null) {
-            throw new IllegalArgumentException("Multipart subtype may not be null");
-        }
-        if (boundary == null) {
-            throw new IllegalArgumentException("Multipart boundary may not be null");
-        }
-        this.subType = subType;
-        this.charset = charset != null ? charset : MIME.DEFAULT_CHARSET;
-        this.boundary = boundary;
-        this.parts = new ArrayList<FormBodyPart>();
-        this.mode = mode;
-    }
-
-    /**
-     * Creates an instance with the specified settings.
-     * Mode is set to {@link HttpMultipartMode#STRICT}
-     *
-     * @param subType mime subtype - must not be {@code null}
-     * @param charset the character set to use. May be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
-     * @param boundary to use  - must not be {@code null}
-     * @throws IllegalArgumentException if charset is null or boundary is null
-     */
-    public ModifiedHttpMultipart(final String subType, final Charset charset, final String boundary) {
-        this(subType, charset, boundary, HttpMultipartMode.STRICT);
-    }
-
-    public ModifiedHttpMultipart(final String subType, final String boundary) {
-        this(subType, null, boundary);
-    }
-
-    public String getSubType() {
-        return this.subType;
-    }
-
-    public Charset getCharset() {
-        return this.charset;
-    }
-
-    public HttpMultipartMode getMode() {
-        return this.mode;
-    }
-
-    public List<FormBodyPart> getBodyParts() {
-        return this.parts;
-    }
-
-    public void addBodyPart(final FormBodyPart part) {
-        if (part == null) {
-            return;
-        }
-        this.parts.add(part);
-    }
-
-    public String getBoundary() {
-        return this.boundary;
-    }
-
-    private void doWriteTo(
-        final HttpMultipartMode mode,
-        final OutputStream out,
-        boolean writeContent) throws IOException {
-
-        ByteArrayBuffer boundary = encode(this.charset, getBoundary());
-        for (FormBodyPart part: this.parts) {
-            writeBytes(TWO_DASHES, out);
-            writeBytes(boundary, out);
-            writeBytes(CR_LF, out);
-
-            Header header = part.getHeader();
-
-            switch (mode) {
-            case STRICT:
-                for (MinimalField field: header) {
-                    writeField(field, this.charset, out);
-                }
-                break;
-            case BROWSER_COMPATIBLE:
-                // Only write Content-Disposition
-                // Use content charset
-                MinimalField cd = part.getHeader().getField(MIME.CONTENT_DISPOSITION);
-                writeField(cd, this.charset, out);
-                String filename = part.getBody().getFilename();
-                if (filename != null) {
-                    MinimalField ct = part.getHeader().getField(MIME.CONTENT_TYPE);
-                    writeField(ct, this.charset, out);
-                }
-                break;
-            }
-            writeBytes(CR_LF, out);
-
-            if (writeContent) {
-                part.getBody().writeTo(out);
-            }
-            writeBytes(CR_LF, out);
-        }
-        writeBytes(TWO_DASHES, out);
-        writeBytes(boundary, out);
-        writeBytes(TWO_DASHES, out);
-        writeBytes(CR_LF, out);
-    }
-
-    /**
-     * Writes out the content in the multipart/form encoding. This method
-     * produces slightly different formatting depending on its compatibility
-     * mode.
-     *
-     * @see #getMode()
-     */
-    public void writeTo(final OutputStream out) throws IOException {
-        doWriteTo(this.mode, out, true);
-    }
-
-    /**
-     * Determines the total length of the multipart content (content length of
-     * individual parts plus that of extra elements required to delimit the parts
-     * from one another). If any of the @{link BodyPart}s contained in this object
-     * is of a streaming entity of unknown length the total length is also unknown.
-     * <p/>
-     * This method buffers only a small amount of data in order to determine the
-     * total length of the entire entity. The content of individual parts is not
-     * buffered.
-     *
-     * @return total length of the multipart entity if known, <code>-1</code>
-     *   otherwise.
-     */
-    public long getTotalLength() {
-        long contentLen = 0;
-        for (FormBodyPart part: this.parts) {
-            ContentBody body = part.getBody();
-            long len = body.getContentLength();
-            if (len >= 0) {
-                contentLen += len;
-            } else {
-                return -1;
-            }
-        }
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        try {
-            doWriteTo(this.mode, out, false);
-            byte[] extra = out.toByteArray();
-            return contentLen + extra.length;
-        } catch (IOException ex) {
-            // Should never happen
-            return -1;
-        }
-    }
-
-}
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedHttpSolrClient.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedHttpSolrClient.java
deleted file mode 100644
index e31ec7d..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedHttpSolrClient.java
+++ /dev/null
@@ -1,313 +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 org.apache.manifoldcf.agents.output.solr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.ConnectException;
-import java.net.SocketTimeoutException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.net.URLEncoder;
-
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.NameValuePair;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.params.ClientPNames;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.entity.mime.FormBodyPart;
-import org.apache.http.entity.mime.HttpMultipartMode;
-import org.apache.http.entity.mime.content.InputStreamBody;
-import org.apache.http.entity.mime.content.StringBody;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.entity.ContentType;
-import org.apache.manifoldcf.core.util.URLDecoder;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.ResponseParser;
-import org.apache.solr.client.solrj.impl.BinaryResponseParser;
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.request.RequestWriter;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.response.UpdateResponse;
-import org.apache.solr.client.solrj.util.ClientUtils;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.ContentStream;
-import org.apache.solr.common.util.NamedList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.nio.charset.Charset;
-
-/** This class overrides and somewhat changes the behavior of the
-* SolrJ HttpSolrServer class.  The point of all this is simply to get
-* the right information to Tika.  When SolrJ uses GET or POST but not
-* multipart-post, it does not include multipart headers that Tika uses -
-* specifically, the name of the document and the length of the document.
-* Patches have been submitted to the SOLR ticket queue to address this
-* problem in a method-insensitive way, but so far there has been no sign that
-* the Solr team is interested in committing them.
-*/
-public class ModifiedHttpSolrClient extends HttpSolrClient
-{
-  // Here we duplicate all the private fields we need
-  
-
-  private static final String DEFAULT_PATH = "/select";
-
-  private static Charset UTF8_CHARSET;
-
-  
-  private final HttpClient httpClient;
-  private final boolean useMultiPartPost = true;
-
-  public ModifiedHttpSolrClient(String baseURL, HttpClient client, ResponseParser parser, boolean allowCompression) {
-    super(baseURL, client, parser, allowCompression);
-    httpClient = client;
-  }
-  
-  @Override
-  protected HttpRequestBase createMethod(final SolrRequest request, String collection) throws IOException, SolrServerException {
-    
-    SolrParams params = request.getParams();
-    Collection<ContentStream> streams = requestWriter.getContentStreams(request);
-    String path = requestWriter.getPath(request);
-    if (path == null || !path.startsWith("/")) {
-      path = DEFAULT_PATH;
-    }
-    
-    ResponseParser parser = request.getResponseParser();
-    if (parser == null) {
-      parser = this.parser;
-    }
-    
-    // The parser 'wt=' and 'version=' params are used instead of the original
-    // params
-    ModifiableSolrParams wparams = new ModifiableSolrParams(params);
-    if (parser != null) {
-      wparams.set(CommonParams.WT, parser.getWriterType());
-      wparams.set(CommonParams.VERSION, parser.getVersion());
-    }
-    if (invariantParams != null) {
-      wparams.add(invariantParams);
-    }
-
-    String basePath = baseUrl;
-    if (collection != null)
-      basePath += "/" + collection;
-
-    if (SolrRequest.METHOD.GET == request.getMethod()) {
-      if (streams != null) {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "GET can't send streams!");
-      }
-      return new HttpGet(basePath + path + toQueryString(wparams, false));
-    }
-
-    if (SolrRequest.METHOD.POST == request.getMethod() || SolrRequest.METHOD.PUT == request.getMethod()) {
-
-      String url = basePath + path;
-      boolean hasNullStreamName = false;
-      if (streams != null) {
-        for (ContentStream cs : streams) {
-          if (cs.getName() == null) {
-            hasNullStreamName = true;
-            break;
-          }
-        }
-      }
-      boolean isMultipart = ((this.useMultiPartPost && SolrRequest.METHOD.POST == request.getMethod())
-          || (streams != null && streams.size() > 1)) && !hasNullStreamName;
-
-      LinkedList<NameValuePair> postOrPutParams = new LinkedList<>();
-      if (streams == null || isMultipart) {
-        // send server list and request list as query string params
-        ModifiableSolrParams queryParams = calculateQueryParams(getQueryParams(), wparams);
-        queryParams.add(calculateQueryParams(request.getQueryParams(), wparams));
-        String fullQueryUrl = url + toQueryString(queryParams, false);
-        HttpEntityEnclosingRequestBase postOrPut = SolrRequest.METHOD.POST == request.getMethod() ?
-            new HttpPost(fullQueryUrl) : new HttpPut(fullQueryUrl);
-        if (!isMultipart) {
-          postOrPut.addHeader("Content-Type",
-              "application/x-www-form-urlencoded; charset=UTF-8");
-        }
-
-        List<FormBodyPart> parts = new LinkedList<>();
-        Iterator<String> iter = wparams.getParameterNamesIterator();
-        while (iter.hasNext()) {
-          String p = iter.next();
-          String[] vals = wparams.getParams(p);
-          if (vals != null) {
-            for (String v : vals) {
-              if (isMultipart) {
-                parts.add(new FormBodyPart(p, new StringBody(v, StandardCharsets.UTF_8)));
-              } else {
-                postOrPutParams.add(new BasicNameValuePair(p, v));
-              }
-            }
-          }
-        }
-
-        if (isMultipart && streams != null) {
-          for (ContentStream content : streams) {
-            String contentType = content.getContentType();
-            if (contentType == null) {
-              contentType = BinaryResponseParser.BINARY_CONTENT_TYPE; // default
-            }
-            String name = content.getName();
-            if (name == null) {
-              name = "";
-            }
-            parts.add(new FormBodyPart(encodeForHeader(name),
-                new InputStreamBody(
-                    content.getStream(),
-                    ContentType.parse(contentType),
-                    encodeForHeader(content.getName()))));
-          }
-        }
-
-        if (parts.size() > 0) {
-          ModifiedMultipartEntity entity = new ModifiedMultipartEntity(HttpMultipartMode.STRICT, null, StandardCharsets.UTF_8);
-          //MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT);
-          for (FormBodyPart p : parts) {
-            entity.addPart(p);
-          }
-          postOrPut.setEntity(entity);
-        } else {
-          //not using multipart
-          postOrPut.setEntity(new UrlEncodedFormEntity(postOrPutParams, StandardCharsets.UTF_8));
-        }
-
-        return postOrPut;
-      }
-      // It is has one stream, it is the post body, put the params in the URL
-      else {
-        String pstr = toQueryString(wparams, false);
-        HttpEntityEnclosingRequestBase postOrPut = SolrRequest.METHOD.POST == request.getMethod() ?
-            new HttpPost(url + pstr) : new HttpPut(url + pstr);
-
-        // Single stream as body
-        // Using a loop just to get the first one
-        final ContentStream[] contentStream = new ContentStream[1];
-        for (ContentStream content : streams) {
-          contentStream[0] = content;
-          break;
-        }
-        if (contentStream[0] instanceof RequestWriter.LazyContentStream) {
-          postOrPut.setEntity(new InputStreamEntity(contentStream[0].getStream(), -1) {
-            @Override
-            public Header getContentType() {
-              return new BasicHeader("Content-Type", contentStream[0].getContentType());
-            }
-
-            @Override
-            public boolean isRepeatable() {
-              return false;
-            }
-
-          });
-        } else {
-          postOrPut.setEntity(new InputStreamEntity(contentStream[0].getStream(), -1) {
-            @Override
-            public Header getContentType() {
-              return new BasicHeader("Content-Type", contentStream[0].getContentType());
-            }
-
-            @Override
-            public boolean isRepeatable() {
-              return false;
-            }
-          });
-        }
-        return postOrPut;
-      }
-    }
-
-    throw new SolrServerException("Unsupported method: " + request.getMethod());
-
-  }
-
-  public static String toQueryString( SolrParams params, boolean xml ) {
-    StringBuilder sb = new StringBuilder(128);
-    try {
-      String amp = xml ? "&amp;" : "&";
-      boolean first=true;
-      Iterator<String> names = params.getParameterNamesIterator();
-      while( names.hasNext() ) {
-        String key = names.next();
-        String[] valarr = params.getParams( key );
-        if( valarr == null ) {
-          sb.append( first?"?":amp );
-          sb.append( URLEncoder.encode(key, "UTF-8") );
-          first=false;
-        }
-        else {
-          for (String val : valarr) {
-            sb.append( first? "?":amp );
-            sb.append(key);
-            if( val != null ) {
-              sb.append('=');
-              sb.append( URLEncoder.encode( val, "UTF-8" ) );
-            }
-            first=false;
-          }
-        }
-      }
-    }
-    catch (IOException e) {throw new RuntimeException(e);}  // can't happen
-    return sb.toString();
-  }
-  
-  // This is a hack added by KDW on 6/21/2017 because HttpClient doesn't do any character
-  // escaping when it puts together header and file names
-  private static String encodeForHeader(final String headerName) {
-    if (headerName == null) {
-      return null;
-    }
-    final StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < headerName.length(); i++) {
-      final char x = headerName.charAt(i);
-      if (x == '"' || x == '\\' || x == '\r') {
-        sb.append("\\");
-      }
-      sb.append(x);
-    }
-    return sb.toString();
-  }
-  
-}
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedLBHttpSolrClient.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedLBHttpSolrClient.java
deleted file mode 100644
index c9195c0..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedLBHttpSolrClient.java
+++ /dev/null
@@ -1,69 +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 org.apache.manifoldcf.agents.output.solr;
-
-import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.impl.BinaryResponseParser;
-import org.apache.solr.client.solrj.request.RequestWriter;
-import org.apache.solr.client.solrj.*;
-import java.net.MalformedURLException;
-import org.apache.http.client.HttpClient;
-import java.util.Set;
-
-/** This class overrides and somewhat changes the behavior of the
-* SolrJ LBHttpSolrServer class.  This is so it instantiates our modified
-* HttpSolrServer class, so that multipart forms work.
-*/
-public class ModifiedLBHttpSolrClient extends LBHttpSolrClient
-{
-  private final HttpClient httpClient;
-  private final ResponseParser parser;
-  private final boolean allowCompression;
-  
-  public ModifiedLBHttpSolrClient(boolean allowCompression, String... solrServerUrls) throws MalformedURLException {
-    this(null, allowCompression, solrServerUrls);
-  }
-  
-  /** The provided httpClient should use a multi-threaded connection manager */ 
-  public ModifiedLBHttpSolrClient(HttpClient httpClient, boolean allowCompression, String... solrServerUrl)
-          throws MalformedURLException {
-    this(httpClient, new BinaryResponseParser(), allowCompression, solrServerUrl);
-  }
-
-  /** The provided httpClient should use a multi-threaded connection manager */  
-  public ModifiedLBHttpSolrClient(HttpClient httpClient, ResponseParser parser, boolean allowCompression, String... solrServerUrl)
-          throws MalformedURLException {
-    super(httpClient, parser, solrServerUrl);
-    this.httpClient = httpClient;
-    this.parser = parser;
-    this.allowCompression = allowCompression;
-  }
-  
-  @Override
-  protected HttpSolrClient makeSolrClient(String server) {
-    HttpSolrClient client = new ModifiedHttpSolrClient(server, httpClient, parser, allowCompression);
-    if (getRequestWriter() != null) {
-      client.setRequestWriter(getRequestWriter());
-    }
-    if (getQueryParams() != null) {
-      client.setQueryParams(getQueryParams());
-    }
-    return client;
-  }
-
-}
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedMultipartEntity.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedMultipartEntity.java
deleted file mode 100644
index 643df72..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/ModifiedMultipartEntity.java
+++ /dev/null
@@ -1,190 +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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.manifoldcf.agents.output.solr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.charset.Charset;
-import java.util.Random;
-
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.entity.mime.content.ContentBody;
-import org.apache.http.entity.mime.FormBodyPart;
-import org.apache.http.entity.mime.HttpMultipartMode;
-import org.apache.http.entity.mime.MIME;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.protocol.HTTP;
-
-/**
- * Multipart/form coded HTTP entity consisting of multiple body parts.
- *
- * @since 4.0
- */
-public class ModifiedMultipartEntity implements HttpEntity {
-
-    /**
-     * The pool of ASCII chars to be used for generating a multipart boundary.
-     */
-    private final static char[] MULTIPART_CHARS =
-        "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-            .toCharArray();
-
-    private final ModifiedHttpMultipart multipart;
-    private final Header contentType;
-
-    // @GuardedBy("dirty") // we always read dirty before accessing length
-    private long length;
-    private volatile boolean dirty; // used to decide whether to recalculate length
-
-    /**
-     * Creates an instance using the specified parameters
-     * @param mode the mode to use, may be {@code null}, in which case {@link HttpMultipartMode#STRICT} is used
-     * @param boundary the boundary string, may be {@code null}, in which case {@link #generateBoundary()} is invoked to create the string
-     * @param charset the character set to use, may be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
-     */
-    public ModifiedMultipartEntity(
-            HttpMultipartMode mode,
-            String boundary,
-            Charset charset) {
-        super();
-        if (boundary == null) {
-            boundary = generateBoundary();
-        }
-        if (mode == null) {
-            mode = HttpMultipartMode.STRICT;
-        }
-        this.multipart = new ModifiedHttpMultipart("form-data", charset, boundary, mode);
-        this.contentType = new BasicHeader(
-                HTTP.CONTENT_TYPE,
-                generateContentType(boundary, charset));
-        this.dirty = true;
-    }
-
-    /**
-     * Creates an instance using the specified {@link HttpMultipartMode} mode.
-     * Boundary and charset are set to {@code null}.
-     * @param mode the desired mode
-     */
-    public ModifiedMultipartEntity(final HttpMultipartMode mode) {
-        this(mode, null, null);
-    }
-
-    /**
-     * Creates an instance using mode {@link HttpMultipartMode#STRICT}
-     */
-    public ModifiedMultipartEntity() {
-        this(HttpMultipartMode.STRICT, null, null);
-    }
-
-    protected String generateContentType(
-            final String boundary,
-            final Charset charset) {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append("multipart/form-data; boundary=");
-        buffer.append(boundary);
-        if (charset != null) {
-            buffer.append("; charset=");
-            buffer.append(charset.name());
-        }
-        return buffer.toString();
-    }
-
-    protected String generateBoundary() {
-        StringBuilder buffer = new StringBuilder();
-        Random rand = new Random();
-        int count = rand.nextInt(11) + 30; // a random size from 30 to 40
-        for (int i = 0; i < count; i++) {
-            buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);
-        }
-        return buffer.toString();
-    }
-
-    public void addPart(final FormBodyPart bodyPart) {
-        this.multipart.addBodyPart(bodyPart);
-        this.dirty = true;
-    }
-
-    public void addPart(final String name, final ContentBody contentBody) {
-        addPart(new FormBodyPart(name, contentBody));
-    }
-
-    public boolean isRepeatable() {
-        for (FormBodyPart part: this.multipart.getBodyParts()) {
-            ContentBody body = part.getBody();
-            if (body.getContentLength() < 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public boolean isChunked() {
-        return !isRepeatable();
-    }
-
-    public boolean isStreaming() {
-        return !isRepeatable();
-    }
-
-    public long getContentLength() {
-        if (this.dirty) {
-            this.length = this.multipart.getTotalLength();
-            this.dirty = false;
-        }
-        return this.length;
-    }
-
-    public Header getContentType() {
-        return this.contentType;
-    }
-
-    public Header getContentEncoding() {
-        return null;
-    }
-
-    @Deprecated
-    public void consumeContent()
-        throws IOException, UnsupportedOperationException{
-        if (isStreaming()) {
-            throw new UnsupportedOperationException(
-                    "Streaming entity does not implement #consumeContent()");
-        }
-    }
-
-    public InputStream getContent() throws IOException, UnsupportedOperationException {
-        throw new UnsupportedOperationException(
-                    "Multipart form entity does not implement #getContent()");
-    }
-
-    public void writeTo(final OutputStream outstream) throws IOException {
-        this.multipart.writeTo(outstream);
-    }
-
-}
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConfig.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConfig.java
deleted file mode 100644
index 0ec1b57..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConfig.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/* $Id: SolrConfig.java 991374 2010-08-31 22:32:08Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr;
-
-
-/** Parameters and output data for SOLR output connector.
-*/
-public class SolrConfig
-{
-  public static final String _rcsid = "@(#)$Id: SolrConfig.java 991374 2010-08-31 22:32:08Z kwright $";
-
-  // Configuration parameters
-
-  /** Solr type */
-  public static final String PARAM_SOLR_TYPE = "Solr type";
-  /** Type: Standard */
-  public static final String SOLR_TYPE_STANDARD = "standard";
-  /** Type: Solr Cloud */
-  public static final String SOLR_TYPE_SOLRCLOUD = "solrcloud";
-  
-  // SolrCloud zookeeper parameters
-  
-  // Zookeeper hosts, as nodes
-  /** Zookeeper node */
-  public static final String NODE_ZOOKEEPER = "zookeeper";
-  /** Zookeeper hostname */
-  public static final String ATTR_HOST = "host";
-  /** Zookeeper port */
-  public static final String ATTR_PORT = "port";
-  
-  /** Zookeeper znode path */
-  public static final String PARAM_ZOOKEEPER_ZNODE_PATH = "ZooKeeper znode path";
-  
-  /** ZooKeeper client timeout */
-  public static final String PARAM_ZOOKEEPER_CLIENT_TIMEOUT = "ZooKeeper client timeout";
-  /** ZooKeeper connect timeout */
-  public static final String PARAM_ZOOKEEPER_CONNECT_TIMEOUT = "ZooKeeper connect timeout";
-  /** Collection name */
-  public static final String PARAM_COLLECTION = "Collection";
-  
-  // General indexing parameters
-  
-  /** Protocol */
-  public static final String PARAM_PROTOCOL = "Server protocol";
-  /** Protocol: http */
-  public static final String PROTOCOL_TYPE_HTTP = "http";
-  /** Protocol: https */
-  public static final String PROTOCOL_TYPE_HTTPS = "https";
-  
-  /** Server name */
-  public static final String PARAM_SERVER = "Server name";
-  /** Port */
-  public static final String PARAM_PORT = "Server port";
-  /** Connection timeout */
-  public static final String PARAM_CONNECTION_TIMEOUT = "Connection timeout";
-  /** Socket timeout */
-  public static final String PARAM_SOCKET_TIMEOUT = "Socket timeout";
-  /** Webapp */
-  public static final String PARAM_WEBAPPNAME = "Server web application";
-  /** Core */
-  public static final String PARAM_CORE = "Solr core name";
-  /** Update path */
-  public static final String PARAM_UPDATEPATH = "Server update handler";
-  /** Remove path */
-  public static final String PARAM_REMOVEPATH = "Server remove handler";
-  /** Status path */
-  public static final String PARAM_STATUSPATH = "Server status handler";
-  /** Id field */
-  public static final String PARAM_IDFIELD = "Solr id field name";
-  /** Optional original size field */
-  public static final String PARAM_ORIGINALSIZEFIELD = "Solr original size field name";
-  /** Optional modified date field */
-  public static final String PARAM_MODIFIEDDATEFIELD = "Solr modified date field name";
-  /** Optional created date field */
-  public static final String PARAM_CREATEDDATEFIELD = "Solr created date field name";
-  /** Optional indexed date field */
-  public static final String PARAM_INDEXEDDATEFIELD = "Solr indexed date field name";
-  /** Optional file name field */
-  public static final String PARAM_FILENAMEFIELD = "Solr filename field name";
-  /** Optional mime type field */
-  public static final String PARAM_MIMETYPEFIELD = "Solr mime type field name";
-  /** Optional basic auth realm */
-  public static final String PARAM_REALM = "Realm";
-  /** Optional user ID */
-  public static final String PARAM_USERID = "User ID";
-  /** Optional user password */
-  public static final String PARAM_PASSWORD = "Password";
-  /** Enable commits */
-  public static final String PARAM_COMMITS = "Commits";
-  /** Commit within time */
-  public static final String PARAM_COMMITWITHIN = "Commit within";
-  /** Keystore */
-  public static final String PARAM_KEYSTORE = "Keystore";
-  /** Maximum document length */
-  public static final String PARAM_MAXLENGTH = "Maximum document length";
-  /** Included mime types */
-  public static final String PARAM_INCLUDEDMIMETYPES = "Included mime types";
-  /** Excluded mime types */
-  public static final String PARAM_EXCLUDEDMIMETYPES="Excluded mime types";
-  /** Parameter describing the use of Extract Update handler */
-  public static final String PARAM_EXTRACTUPDATE = "Use extract update handler";
-  /** Optional content field (if not using extract update handler) */
-  public static final String PARAM_CONTENTFIELD = "Solr content field name";
-  /** Node describing an argument */
-  public static final String NODE_ARGUMENT = "argument";
-  /** Attribute with the argument name */
-  public static final String ATTRIBUTE_NAME = "name";
-  /** Attribute with the argument value */
-  public static final String ATTRIBUTE_VALUE = "value";
-  
-  // Output specification
-
-}
diff --git a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConnector.java b/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConnector.java
deleted file mode 100644
index 775b9d7..0000000
--- a/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConnector.java
+++ /dev/null
@@ -1,2377 +0,0 @@
-/* $Id: SolrConnector.java 998081 2010-09-17 11:33:15Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputAddActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputNotifyActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity;
-import org.apache.manifoldcf.agents.interfaces.IOutputCheckActivity;
-import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
-import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.ConfigNode;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
-import org.apache.manifoldcf.core.interfaces.IDFactory;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.IPostParameters;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.VersionContext;
-import org.apache.manifoldcf.connectorcommon.interfaces.KeystoreManagerFactory;
-import org.apache.manifoldcf.connectorcommon.interfaces.IKeystoreManager;
-
-
-/** This is the output connector for SOLR.  Currently, no frills.
-*/
-public class SolrConnector extends org.apache.manifoldcf.agents.output.BaseOutputConnector
-{
-  public static final String _rcsid = "@(#)$Id: SolrConnector.java 998081 2010-09-17 11:33:15Z kwright $";
-
-  // Activities we log
-
-  /** Ingestion activity */
-  public final static String INGEST_ACTIVITY = "document ingest";
-  /** Document removal activity */
-  public final static String REMOVE_ACTIVITY = "document deletion";
-
-  /** Local connection */
-  protected HttpPoster poster = null;
-  
-  /** Expiration */
-  protected long expirationTime = -1L;
-  
-  /** The allow attribute name */
-  protected String allowAttributeName = "allow_token_";
-  /** The deny attribute name */
-  protected String denyAttributeName = "deny_token_";
-  /** The maximum document length */
-  protected Long maxDocumentLength = null;
-  /** Included mime types string */
-  protected String includedMimeTypesString = null;
-  /** Included mime types */
-  protected Set<String> includedMimeTypes = null;
-  /** Excluded mime types string */
-  protected String excludedMimeTypesString = null;
-  /** Excluded mime types */
-  protected Set<String> excludedMimeTypes = null;
-  
-  // Attributes going into Solr
-  protected String idAttributeName = null;
-  protected String originalSizeAttributeName = null;
-  protected String modifiedDateAttributeName = null;
-  protected String createdDateAttributeName = null;
-  protected String indexedDateAttributeName = null;
-  protected String fileNameAttributeName = null;
-  protected String mimeTypeAttributeName = null;
-  protected String contentAttributeName = null;
-  /** Use extractiing update handler? */
-  protected boolean useExtractUpdateHandler = true;
-  /** Allow compression?  Currently static */
-  protected final static boolean allowCompression = true;
-
-  /** Whether or not to commit */
-  protected boolean doCommits = false;
-
-  /** Collection name (non-empty only if SolrCloud) */
-  protected String collectionName = null;
-  
-  /** Idle connection expiration interval */
-  protected final static long EXPIRATION_INTERVAL = 300000L;
-
-  static
-  {
-    System.setProperty("jdk.xml.maxGeneralEntitySizeLimit",new Integer(Integer.MAX_VALUE).toString());
-  }
-  
-  /** Constructor.
-  */
-  public SolrConnector()
-  {
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{INGEST_ACTIVITY,REMOVE_ACTIVITY};
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the target appliance, basic auth configuration, etc.  (This formerly came
-  * out of the ini file.)
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    if (poster != null)
-    {
-      if (expirationTime <= System.currentTimeMillis())
-      {
-        // Expire connection
-        poster.shutdown();
-        poster = null;
-        expirationTime = -1L;
-      }
-    }
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return poster != null;
-  }
-
-  /** Close the connection.  Call this before discarding the connection.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    if (poster != null)
-    {
-      poster.shutdown();
-      poster = null;
-      expirationTime = -1L;
-    }
-    maxDocumentLength = null;
-    includedMimeTypesString = null;
-    includedMimeTypes = null;
-    excludedMimeTypesString = null;
-    excludedMimeTypes = null;
-    idAttributeName = null;
-    originalSizeAttributeName = null;
-    modifiedDateAttributeName = null;
-    createdDateAttributeName = null;
-    indexedDateAttributeName = null;
-    fileNameAttributeName = null;
-    mimeTypeAttributeName = null;
-    contentAttributeName = null;
-    useExtractUpdateHandler = true;
-    collectionName = null;
-    super.disconnect();
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (poster == null)
-    {
-      String updatePath = params.getParameter(SolrConfig.PARAM_UPDATEPATH);
-      if (updatePath == null || updatePath.length() == 0)
-        updatePath = "";
-
-      String removePath = params.getParameter(SolrConfig.PARAM_REMOVEPATH);
-      if (removePath == null || removePath.length() == 0)
-        removePath = "";
-
-      String statusPath = params.getParameter(SolrConfig.PARAM_STATUSPATH);
-      if (statusPath == null || statusPath.length() == 0)
-        statusPath = "";
-
-      idAttributeName = params.getParameter(SolrConfig.PARAM_IDFIELD);
-      if (idAttributeName == null || idAttributeName.length() == 0)
-        idAttributeName = "id";
-
-      originalSizeAttributeName = params.getParameter(SolrConfig.PARAM_ORIGINALSIZEFIELD);
-      if (originalSizeAttributeName == null || originalSizeAttributeName.length() == 0)
-        originalSizeAttributeName = null;
-      
-      modifiedDateAttributeName = params.getParameter(SolrConfig.PARAM_MODIFIEDDATEFIELD);
-      if (modifiedDateAttributeName == null || modifiedDateAttributeName.length() == 0)
-        modifiedDateAttributeName = null;
-
-      createdDateAttributeName = params.getParameter(SolrConfig.PARAM_CREATEDDATEFIELD);
-      if (createdDateAttributeName == null || createdDateAttributeName.length() == 0)
-        createdDateAttributeName = null;
-  
-      indexedDateAttributeName = params.getParameter(SolrConfig.PARAM_INDEXEDDATEFIELD);
-      if (indexedDateAttributeName == null || indexedDateAttributeName.length() == 0)
-        indexedDateAttributeName = null;
-
-      fileNameAttributeName = params.getParameter(SolrConfig.PARAM_FILENAMEFIELD);
-      if (fileNameAttributeName == null || fileNameAttributeName.length() == 0)
-        fileNameAttributeName = null;
-
-      mimeTypeAttributeName = params.getParameter(SolrConfig.PARAM_MIMETYPEFIELD);
-      if (mimeTypeAttributeName == null || mimeTypeAttributeName.length() == 0)
-        mimeTypeAttributeName = null;
-
-      contentAttributeName = params.getParameter(SolrConfig.PARAM_CONTENTFIELD);
-      if (contentAttributeName == null || contentAttributeName.length() == 0)
-        contentAttributeName = null;
-      
-      String useExtractUpdateHandlerValue = params.getParameter(SolrConfig.PARAM_EXTRACTUPDATE);
-      if (useExtractUpdateHandlerValue == null || useExtractUpdateHandlerValue.length() == 0)
-        useExtractUpdateHandler = true;
-      else
-        useExtractUpdateHandler = !useExtractUpdateHandlerValue.equals("false");
-      if (contentAttributeName == null && !useExtractUpdateHandler)
-        throw new ManifoldCFException("Content attribute name required for non-extract-update indexing");
-
-      String commits = params.getParameter(SolrConfig.PARAM_COMMITS);
-      if (commits == null || commits.length() == 0)
-        commits = "true";
-      
-      doCommits = commits.equals("true");
-      
-      String commitWithin = params.getParameter(SolrConfig.PARAM_COMMITWITHIN);
-      if (commitWithin == null || commitWithin.length() == 0)
-        commitWithin = null;
-      
-      String docMax = params.getParameter(SolrConfig.PARAM_MAXLENGTH);
-      if (docMax == null || docMax.length() == 0)
-        maxDocumentLength = null;
-      else
-        maxDocumentLength = new Long(docMax);
-      if (maxDocumentLength == null && !useExtractUpdateHandler)
-        throw new ManifoldCFException("Maximum document length required for non-extract-update indexing");
-      
-      includedMimeTypesString = params.getParameter(SolrConfig.PARAM_INCLUDEDMIMETYPES);
-      if (includedMimeTypesString == null || includedMimeTypesString.length() == 0)
-      {
-        includedMimeTypesString = null;
-        includedMimeTypes = null;
-      }
-      else
-      {
-        // Parse the included mime types
-        includedMimeTypes = parseMimeTypes(includedMimeTypesString);
-        if (includedMimeTypes.size() == 0)
-        {
-          includedMimeTypesString = null;
-          includedMimeTypes = null;
-        }
-      }
-
-      excludedMimeTypesString = params.getParameter(SolrConfig.PARAM_EXCLUDEDMIMETYPES);
-      if (excludedMimeTypesString == null || excludedMimeTypesString.length() == 0)
-      {
-        excludedMimeTypesString = null;
-        excludedMimeTypes = null;
-      }
-      else
-      {
-        // Parse the included mime types
-        excludedMimeTypes = parseMimeTypes(excludedMimeTypesString);
-        if (excludedMimeTypes.size() == 0)
-        {
-          excludedMimeTypesString = null;
-          excludedMimeTypes = null;
-        }
-      }
-      
-
-      // Now, initialize Solr-j
-      String solrType = params.getParameter(SolrConfig.PARAM_SOLR_TYPE);
-      if (solrType == null)
-        solrType = SolrConfig.SOLR_TYPE_STANDARD;
-
-      if (solrType.equals(SolrConfig.SOLR_TYPE_STANDARD))
-      {
-        String userID = params.getParameter(SolrConfig.PARAM_USERID);
-        String password = params.getObfuscatedParameter(SolrConfig.PARAM_PASSWORD);
-        String realm = params.getParameter(SolrConfig.PARAM_REALM);
-        String keystoreData = params.getParameter(SolrConfig.PARAM_KEYSTORE);
-        IKeystoreManager keystoreManager;
-        if (keystoreData != null)
-          keystoreManager = KeystoreManagerFactory.make("",keystoreData);
-        else
-          keystoreManager = null;
-
-        String protocol = params.getParameter(SolrConfig.PARAM_PROTOCOL);
-        if (protocol == null || protocol.length() == 0)
-          throw new ManifoldCFException("Missing parameter: "+SolrConfig.PARAM_PROTOCOL);
-
-        String server = params.getParameter(SolrConfig.PARAM_SERVER);
-        if (server == null || server.length() == 0)
-          throw new ManifoldCFException("Missing parameter: "+SolrConfig.PARAM_SERVER);
-
-        String port = params.getParameter(SolrConfig.PARAM_PORT);
-        if (port == null || port.length() == 0)
-          port = "80";
-
-        String webapp = params.getParameter(SolrConfig.PARAM_WEBAPPNAME);
-        if (webapp != null && webapp.length() == 0)
-          webapp = null;
-
-        String core = params.getParameter(SolrConfig.PARAM_CORE);
-        if (core != null && core.length() == 0)
-          core = "collection1";
-
-        // Pick up timeouts
-        String socketTimeoutString = params.getParameter(SolrConfig.PARAM_SOCKET_TIMEOUT);
-        if (socketTimeoutString == null)
-          socketTimeoutString = "900";
-        String connectTimeoutString = params.getParameter(SolrConfig.PARAM_CONNECTION_TIMEOUT);
-        if (connectTimeoutString == null)
-          connectTimeoutString = "60";
-        
-        collectionName = null;
-        
-        try
-        {
-          int socketTimeout = Integer.parseInt(socketTimeoutString) * 1000;
-          int connectTimeout = Integer.parseInt(connectTimeoutString) * 1000;
-          
-          poster = new HttpPoster(protocol,server,Integer.parseInt(port),webapp,core,
-            connectTimeout,socketTimeout,
-            updatePath,removePath,statusPath,realm,userID,password,
-            allowAttributeName,denyAttributeName,idAttributeName,
-            originalSizeAttributeName,modifiedDateAttributeName,createdDateAttributeName,indexedDateAttributeName,
-            fileNameAttributeName,mimeTypeAttributeName,contentAttributeName,
-            keystoreManager,maxDocumentLength,commitWithin,useExtractUpdateHandler,
-            includedMimeTypes,excludedMimeTypes,
-            allowCompression);
-          
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage());
-        }
-
-      }
-      else if (solrType.equals(SolrConfig.SOLR_TYPE_SOLRCLOUD))
-      {
-        StringBuilder zookeeperString = new StringBuilder();
-        // Pull together the zookeeper string describing the zookeeper nodes
-        for (int i = 0; i < params.getChildCount(); i++)
-        {
-          ConfigurationNode cn = params.getChild(i);
-          if (cn.getType().equals(SolrConfig.NODE_ZOOKEEPER))
-          {
-            if (zookeeperString.length() > 0)
-              zookeeperString.append(",");
-            zookeeperString.append(cn.getAttributeValue(SolrConfig.ATTR_HOST)).append(":").append(cn.getAttributeValue(SolrConfig.ATTR_PORT));
-          }
-        }
-        
-        String znodePath = params.getParameter(SolrConfig.PARAM_ZOOKEEPER_ZNODE_PATH);
-        if (znodePath == null)
-          znodePath = "";
-        
-        String zookeeperHost = zookeeperString.toString() + znodePath;
-        
-        // Get collection
-        String collection = params.getParameter(SolrConfig.PARAM_COLLECTION);
-        if (collection == null)
-          collection = "collection1";
-        collectionName = collection;
-
-        // Pick up timeouts
-        String zkClientTimeoutString = params.getParameter(SolrConfig.PARAM_ZOOKEEPER_CLIENT_TIMEOUT);
-        if (zkClientTimeoutString == null)
-          zkClientTimeoutString = "60";
-        String zkConnectTimeoutString = params.getParameter(SolrConfig.PARAM_ZOOKEEPER_CONNECT_TIMEOUT);
-        if (zkConnectTimeoutString == null)
-          zkConnectTimeoutString = "60";
-        
-        // Create an httpposter
-        try
-        {
-          int zkClientTimeout = Integer.parseInt(zkClientTimeoutString) * 1000;
-          int zkConnectTimeout = Integer.parseInt(zkConnectTimeoutString) * 1000;
-
-          poster = new HttpPoster(zookeeperHost,collection,
-            zkClientTimeout,zkConnectTimeout,
-            updatePath,removePath,statusPath,
-            allowAttributeName,denyAttributeName,idAttributeName,
-            originalSizeAttributeName,modifiedDateAttributeName,createdDateAttributeName,indexedDateAttributeName,
-            fileNameAttributeName,mimeTypeAttributeName,contentAttributeName,
-            maxDocumentLength,commitWithin,useExtractUpdateHandler,
-            includedMimeTypes,excludedMimeTypes,
-            allowCompression);
-          
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage());
-        }
-
-      }
-      else
-        throw new ManifoldCFException("Illegal value for parameter '"+SolrConfig.PARAM_SOLR_TYPE+"': '"+solrType+"'");
-      
-    }
-    expirationTime = System.currentTimeMillis() + EXPIRATION_INTERVAL;
-  }
-
-  /** Parse a mime type field into individual mime types in a hash */
-  protected static Set<String> parseMimeTypes(final String mimeTypes)
-    throws ManifoldCFException
-  {
-    Set<String> rval = new HashSet<>();
-    try
-    {
-      java.io.Reader str = new java.io.StringReader(mimeTypes);
-      try
-      {
-        java.io.BufferedReader is = new java.io.BufferedReader(str);
-        try
-        {
-          while (true)
-          {
-            String nextString = is.readLine();
-            if (nextString == null)
-              break;
-            if (nextString.length() == 0)
-              continue;
-            rval.add(nextString.toLowerCase(Locale.ROOT));
-          }
-          return rval;
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        str.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      throw new ManifoldCFException("IO error: "+e.getMessage(),e);
-    }
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      getSession();
-      poster.checkPost();
-      return super.check();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Transient error: "+e.getMessage();
-    }
-  }
-
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param spec is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    SpecPacker sp = new SpecPacker(spec);
-    return new VersionContext(sp.toPackedString(),params,spec);
-  }
-
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param outputDescription is the document's output version.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext outputDescription, String mimeType, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    return HttpPoster.checkMimeTypeIndexable(mimeType, useExtractUpdateHandler, includedMimeTypes, excludedMimeTypes);
-  }
-
-  /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that are too long to be indexable.
-  *@param outputDescription is the document's output version.
-  *@param length is the length of the document.
-  *@return true if the file is indexable.
-  */
-  @Override
-  public boolean checkLengthIndexable(VersionContext outputDescription, long length, IOutputCheckActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    if (maxDocumentLength != null && length > maxDocumentLength.longValue())
-      return false;
-    return true;
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    SpecPacker sp = new SpecPacker(pipelineDescription.getSpecification());
-
-    // Establish a session
-    getSession();
-
-    // Now, go off and call the ingest API.
-    if (poster.indexPost(documentURI,document,sp.getArgs(),authorityNameString,activities))
-      return DOCUMENTSTATUS_ACCEPTED;
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  /** Remove a document using the connector.
-  * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Establish a session
-    getSession();
-    poster.deletePost(documentURI,activities);
-  }
-
-  /** Notify the connector of a completed job.
-  * This is meant to allow the connector to flush any internal data structures it has been keeping around, or to tell the output repository that this
-  * is a good time to synchronize things.  It is called whenever a job is either completed or aborted.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Establish a session
-    getSession();
-    
-    // Do a commit post
-    if (doCommits)
-    {
-      poster.commitPost();
-    }
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing output specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"SolrConnector.SolrType"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Server"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Zookeeper"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Paths"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Schema"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Arguments"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Documents"));
-    tabsArray.add(Messages.getString(locale,"SolrConnector.Commits"));
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function SolrDeleteCertificate(aliasName)\n"+
-"{\n"+
-"  editconnection.solrkeystorealias.value = aliasName;\n"+
-"  editconnection.configop.value = \"Delete\";\n"+
-"  postForm();\n"+
-"}\n"+
-"\n"+
-"function SolrAddCertificate()\n"+
-"{\n"+
-"  if (editconnection.solrcertificate.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ChooseACertificateFile")+"\");\n"+
-"    editconnection.solrcertificate.focus();\n"+
-"  }\n"+
-"  else\n"+
-"  {\n"+
-"    editconnection.configop.value = \"Add\";\n"+
-"    postForm();\n"+
-"  }\n"+
-"}\n"+
-"\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.servername.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.PleaseSupplyAValidSolrServerName")+"\");\n"+
-"    editconnection.servername.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverport.value != \"\" && !isInteger(editconnection.serverport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.SolrServerPortMustBeAValidInteger")+"\");\n"+
-"    editconnection.serverport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webappname.value != \"\" && editconnection.webappname.value.indexOf(\"/\") != -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.WebApplicationNameCannotHaveCharacters")+"\");\n"+
-"    editconnection.webappname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.core.value != \"\" && editconnection.core.value.indexOf(\"/\") != -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.CoreNameCannotHaveCharacters")+"\");\n"+
-"    editconnection.core.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webappname.value == \"\" && editconnection.core.value != \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.WebApplicationMustBeSpecifiedIfCoreIsSpecified")+"\");\n"+
-"    editconnection.webappname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (!isInteger(editconnection.connectiontimeout.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ConnectionTimeoutMustBeInteger")+"\");\n"+
-"    editconnection.connectiontimeout.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (!isInteger(editconnection.sockettimeout.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.SocketTimeoutMustBeInteger")+"\");\n"+
-"    editconnection.sockettimeout.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.updatepath.value != \"\" && editconnection.updatepath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.UpdatePathMustStartWithACharacter")+"\");\n"+
-"    editconnection.updatepath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.removepath.value != \"\" && editconnection.removepath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.RemovePathMustStartWithACharacter")+"\");\n"+
-"    editconnection.removepath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.statuspath.value != \"\" && editconnection.statuspath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.StatusPathMustStartWithACharacter")+"\");\n"+
-"    editconnection.statuspath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.maxdocumentlength.value != \"\" && !isInteger(editconnection.maxdocumentlength.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.MaximumDocumentLengthMustBAnInteger")+"\");\n"+
-"    editconnection.maxdocumentlength.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.commitwithin.value != \"\" && !isInteger(editconnection.commitwithin.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.CommitWithinValueMustBeAnInteger")+"\");\n"+
-"    editconnection.commitwithin.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.znodepath.value != \"\" && editconnection.znodepath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ZnodePathMustStartWithACharacter")+"\");\n"+
-"    editconnection.znodepath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.servername.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.PleaseSupplyAValidSolrServerName")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.servername.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverport.value != \"\" && !isInteger(editconnection.serverport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.SolrServerPortMustBeAValidInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.serverport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webappname.value != \"\" && editconnection.webappname.value.indexOf(\"/\") != -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.WebApplicationNameCannotHaveCharacters")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.webappname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.core.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.PleaseSupplySolrCoreName")+"\");\n"+
-"    editconnection.core.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.core.value != \"\" && editconnection.core.value.indexOf(\"/\") != -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.CoreNameCannotHaveCharacters")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.core.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.webappname.value == \"\" && editconnection.core.value != \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.WebApplicationMustBeSpecifiedIfCoreIsSpecified")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.webappname.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (!isInteger(editconnection.connectiontimeout.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ConnectionTimeoutMustBeInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.connectiontimeout.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (!isInteger(editconnection.sockettimeout.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.SocketTimeoutMustBeInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Server")+"\");\n"+
-"    editconnection.sockettimeout.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.updatepath.value != \"\" && editconnection.updatepath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.UpdatePathMustStartWithACharacter")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Paths")+"\");\n"+
-"    editconnection.updatepath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.removepath.value != \"\" && editconnection.removepath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.RemovePathMustStartWithACharacter")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Paths")+"\");\n"+
-"    editconnection.removepath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.statuspath.value != \"\" && editconnection.statuspath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.StatusPathMustStartWithACharacter")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Paths")+"\");\n"+
-"    editconnection.statuspath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.maxdocumentlength.value != \"\" && !isInteger(editconnection.maxdocumentlength.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.MaximumDocumentLengthMustBeAnInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Documents")+"\");\n"+
-"    editconnection.maxdocumentlength.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.maxdocumentlength.value == \"\" && ((editconnection.extractupdatecheckbox.value == \"true\" && editconnection.extractupdate.checked == false) || (editconnection.extractupdatecheckbox.value != \"true\" && editconnection.extractupdate.value != \"true\")))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.MaximumDocumentLengthRequiredUnlessExtractingUpdateHandler")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Documents")+"\");\n"+
-"    editconnection.maxdocumentlength.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.contentfield.value == \"\" && ((editconnection.extractupdatecheckbox.value == \"true\" && editconnection.extractupdate.checked == false) || (editconnection.extractupdatecheckbox.value != \"true\" && editconnection.extractupdate.value != \"true\")))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ContentFieldNameRequiredUnlessExtractingUpdateHandler")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Schema")+"\");\n"+
-"    editconnection.contentfield.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.commitwithin.value != \"\" && !isInteger(editconnection.commitwithin.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.CommitWithinValueMustBeAnInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.Commits")+"\");\n"+
-"    editconnection.commitwithin.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.znodepath.value != \"\" && editconnection.znodepath.value.substring(0,1) != \"/\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ZnodePathMustStartWithACharacter")+"\");\n"+
-"    editconnection.znodepath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function deleteZookeeperHost(i)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.op_zookeeper_\"+i+\".value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (editconnection.count_zookeeper.value==i)\n"+
-"    postFormSetAnchor(\"zookeeper\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"zookeeper_\"+i)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.op_zookeeper_\"+i+\".value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"\n"+
-"function addZookeeperHost()\n"+
-"{\n"+
-"  if (editconnection.host_zookeeper.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"SolrConnector.ZookeeperHostCannotBeNull")+"\");\n"+
-"    editconnection.host_zookeeper.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editconnection.port_zookeeper.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ZookeeperPortCannotBeNull")+"\");\n"+
-"    editconnection.port_zookeeper.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isInteger(editconnection.port_zookeeper.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ZookeeperPortMustBeAnInteger")+"\");\n"+
-"    editconnection.port_zookeeper.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  editconnection.op_zookeeper.value=\"Add\";\n"+
-"  postFormSetAnchor(\"zookeeper\");\n"+
-"}\n"+
-"\n"+
-"function deleteArgument(i)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.argument_\"+i+\"_op.value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (editconnection.argument_count.value==i)\n"+
-"    postFormSetAnchor(\"argument\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"argument_\"+i)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.argument_\"+i+\"_op.value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"\n"+
-"function addArgument()\n"+
-"{\n"+
-"  if (editconnection.argument_name.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"SolrConnector.ArgumentNameCannotBeAnEmptyString")+"\");\n"+
-"    editconnection.argument_name.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  editconnection.argument_op.value=\"Add\";\n"+
-"  postFormSetAnchor(\"argument\");\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String type = parameters.getParameter(SolrConfig.PARAM_SOLR_TYPE);
-    if (type == null)
-      type = SolrConfig.SOLR_TYPE_STANDARD;
-    
-    String protocol = parameters.getParameter(SolrConfig.PARAM_PROTOCOL);
-    if (protocol == null)
-      protocol = SolrConfig.PROTOCOL_TYPE_HTTP;
-		
-    String server = parameters.getParameter(SolrConfig.PARAM_SERVER);
-    if (server == null)
-      server = "localhost";
-
-    String port = parameters.getParameter(SolrConfig.PARAM_PORT);
-    if (port == null)
-      port = "8983";
-
-    String webapp = parameters.getParameter(SolrConfig.PARAM_WEBAPPNAME);
-    if (webapp == null)
-      webapp = "solr";
-
-    String core = parameters.getParameter(SolrConfig.PARAM_CORE);
-    if (core == null)
-      core = "collection1";
-
-    String znodePath = parameters.getParameter(SolrConfig.PARAM_ZOOKEEPER_ZNODE_PATH);
-    if (znodePath == null)
-    	znodePath = "";
-    
-    String collection = parameters.getParameter(SolrConfig.PARAM_COLLECTION);
-    if (collection == null)
-      collection = "collection1";
-    
-    String connectionTimeout = parameters.getParameter(SolrConfig.PARAM_CONNECTION_TIMEOUT);
-    if (connectionTimeout == null)
-      connectionTimeout = "60";
-    
-    String socketTimeout = parameters.getParameter(SolrConfig.PARAM_SOCKET_TIMEOUT);
-    if (socketTimeout == null)
-      socketTimeout = "900";
-
-    String zkClientTimeout = parameters.getParameter(SolrConfig.PARAM_ZOOKEEPER_CLIENT_TIMEOUT);
-    if (zkClientTimeout == null)
-      zkClientTimeout = "60";
-
-    String zkConnectTimeout = parameters.getParameter(SolrConfig.PARAM_ZOOKEEPER_CONNECT_TIMEOUT);
-    if (zkConnectTimeout == null)
-      zkConnectTimeout = "60";
-    
-    String updatePath = parameters.getParameter(SolrConfig.PARAM_UPDATEPATH);
-    if (updatePath == null)
-      updatePath = "/update/extract";
-
-    String removePath = parameters.getParameter(SolrConfig.PARAM_REMOVEPATH);
-    if (removePath == null)
-      removePath = "/update";
-
-    String statusPath = parameters.getParameter(SolrConfig.PARAM_STATUSPATH);
-    if (statusPath == null)
-      statusPath = "/admin/ping";
-
-    String idField = parameters.getParameter(SolrConfig.PARAM_IDFIELD);
-    if (idField == null)
-      idField = "id";
-
-    String originalSizeField = parameters.getParameter(SolrConfig.PARAM_ORIGINALSIZEFIELD);
-    if (originalSizeField == null)
-      originalSizeField = "";
-    
-    String modifiedDateField = parameters.getParameter(SolrConfig.PARAM_MODIFIEDDATEFIELD);
-    if (modifiedDateField == null)
-      modifiedDateField = "";
-    
-    String createdDateField = parameters.getParameter(SolrConfig.PARAM_CREATEDDATEFIELD);
-    if (createdDateField == null)
-      createdDateField = "";
-
-    String indexedDateField = parameters.getParameter(SolrConfig.PARAM_INDEXEDDATEFIELD);
-    if (indexedDateField == null)
-      indexedDateField = "";
-    
-    String fileNameField = parameters.getParameter(SolrConfig.PARAM_FILENAMEFIELD);
-    if (fileNameField == null)
-      fileNameField = "";
-    
-    String mimeTypeField = parameters.getParameter(SolrConfig.PARAM_MIMETYPEFIELD);
-    if (mimeTypeField == null)
-      mimeTypeField = "";
-
-    String contentField = parameters.getParameter(SolrConfig.PARAM_CONTENTFIELD);
-    if (contentField == null)
-      contentField = "";
-    
-    String useExtractUpdate = parameters.getParameter(SolrConfig.PARAM_EXTRACTUPDATE);
-    if (useExtractUpdate == null || useExtractUpdate.length() == 0)
-      useExtractUpdate = "true";
-
-    String realm = parameters.getParameter(SolrConfig.PARAM_REALM);
-    if (realm == null)
-      realm = "";
-
-    String userID = parameters.getParameter(SolrConfig.PARAM_USERID);
-    if (userID == null)
-      userID = "";
-		
-    String password = parameters.getObfuscatedParameter(SolrConfig.PARAM_PASSWORD);
-    if (password == null)
-      password = "";
-    else
-      password = out.mapPasswordToKey(password);
-    
-    String commits = parameters.getParameter(SolrConfig.PARAM_COMMITS);
-    if (commits == null)
-      commits = "true";
-    
-    String commitWithin = parameters.getParameter(SolrConfig.PARAM_COMMITWITHIN);
-    if (commitWithin == null)
-      commitWithin = "";
-
-    String solrKeystore = parameters.getParameter(SolrConfig.PARAM_KEYSTORE);
-    IKeystoreManager localKeystore;
-    if (solrKeystore == null)
-      localKeystore = KeystoreManagerFactory.make("");
-    else
-      localKeystore = KeystoreManagerFactory.make("",solrKeystore);
-
-    String maxLength = parameters.getParameter(SolrConfig.PARAM_MAXLENGTH);
-    if (maxLength == null)
-      maxLength = "";
-    
-    String includedMimeTypes = parameters.getParameter(SolrConfig.PARAM_INCLUDEDMIMETYPES);
-    if (includedMimeTypes == null)
-      includedMimeTypes = "";
-    
-    String excludedMimeTypes = parameters.getParameter(SolrConfig.PARAM_EXCLUDEDMIMETYPES);
-    if (excludedMimeTypes == null)
-      excludedMimeTypes = "";
-    
-    // "SOLR type" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.SolrType")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.SolrType2") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"solrtype\">\n"+
-"        <option value=\""+SolrConfig.SOLR_TYPE_STANDARD+"\""+(type.equals(SolrConfig.SOLR_TYPE_STANDARD)?" selected=\"true\"":"")+">"+Messages.getBodyString(locale,"SolrConnector.SingleServer")+"</option>\n"+
-"        <option value=\""+SolrConfig.SOLR_TYPE_SOLRCLOUD+"\""+(type.equals(SolrConfig.SOLR_TYPE_SOLRCLOUD)?" selected=\"true\"":"")+">"+Messages.getBodyString(locale,"SolrConnector.SolrCloud")+"</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Type tab hiddens
-      out.print(
-"<input type=\"hidden\" name=\"solrtype\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(type)+"\"/>\n"
-      );
-    }
-
-    // "Server" tab
-    // Always pass the whole keystore as a hidden.
-    if (solrKeystore != null)
-    {
-      out.print(
-"<input type=\"hidden\" name=\"keystoredata\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(solrKeystore)+"\"/>\n"
-      );
-    }
-    out.print(
-"<input name=\"configop\" type=\"hidden\" value=\"Continue\"/>\n"
-    );
-    
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Server")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Protocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"serverprotocol\">\n"+
-"        <option value=\""+SolrConfig.PROTOCOL_TYPE_HTTP+"\""+(protocol.equals(SolrConfig.PROTOCOL_TYPE_HTTP)?" selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\""+SolrConfig.PROTOCOL_TYPE_HTTPS+"\""+(protocol.equals(SolrConfig.PROTOCOL_TYPE_HTTPS)?" selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ServerName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"servername\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(server)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Port") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"serverport\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(port)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.WebApplicationName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"webappname\" type=\"text\" size=\"16\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webapp)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.CoreName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"core\" type=\"text\" size=\"16\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(core)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ConnectionTimeout") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"connectiontimeout\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionTimeout)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.SocketTimeout") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"sockettimeout\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(socketTimeout)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Realm") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"realm\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(realm)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.UserID") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"userid\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userID)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Password") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"password\" size=\"32\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.SSLTrustCertificateList") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\"solrkeystorealias\" value=\"\"/>\n"+
-"      <table class=\"displaytable\">\n"
-      );
-      // List the individual certificates in the store, with a delete button for each
-      String[] contents = localKeystore.getContents();
-      if (contents.length == 0)
-      {
-        out.print(
-"        <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.NoCertificatesPresent") + "</nobr></td></tr>\n"
-        );
-      }
-      else
-      {
-        int i = 0;
-        while (i < contents.length)
-        {
-          String alias = contents[i];
-          String description = localKeystore.getDescription(alias);
-          if (description.length() > 128)
-            description = description.substring(0,125) + "...";
-          out.print(
-"        <tr>\n"+
-"          <td class=\"value\"><input type=\"button\" onclick='Javascript:SolrDeleteCertificate(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(alias)+"\")' alt=\""+Messages.getAttributeString(locale,"SolrConnector.DeleteCert")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(alias)+"\" value=\"Delete\"/></td>\n"+
-"          <td>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
-"        </tr>\n"
-          );
-          i++;
-        }
-      }
-      out.print(
-"      </table>\n"+
-"      <input type=\"button\" onclick='Javascript:SolrAddCertificate()' alt=\"" + Messages.getAttributeString(locale,"SolrConnector.AddCert") + "\" value=\"" + Messages.getAttributeString(locale,"SolrConnector.Add") + "\"/>&nbsp;\n"+
-"      " + Messages.getBodyString(locale,"SolrConnector.Certificate") + "&nbsp;<input name=\"solrcertificate\" size=\"50\" type=\"file\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Server tab hiddens
-      out.print(
-"<input type=\"hidden\" name=\"serverprotocol\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(protocol)+"\"/>\n"+
-"<input type=\"hidden\" name=\"servername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(server)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(port)+"\"/>\n"+
-"<input type=\"hidden\" name=\"webappname\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(webapp)+"\"/>\n"+
-"<input type=\"hidden\" name=\"core\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(core)+"\"/>\n"+
-"<input type=\"hidden\" name=\"connectiontimeout\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionTimeout)+"\"/>\n"+
-"<input type=\"hidden\" name=\"sockettimeout\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(socketTimeout)+"\"/>\n"+
-"<input type=\"hidden\" name=\"realm\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(realm)+"\"/>\n"+
-"<input type=\"hidden\" name=\"userid\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(userID)+"\"/>\n"+
-"<input type=\"hidden\" name=\"password\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(password)+"\"/>\n"
-      );
-    }
-
-    // "Zookeeper" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Zookeeper")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ZookeeperHosts") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Host") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Port") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-
-      // Loop through the existing zookeeper nodes
-      int k = 0;
-      for (int i = 0; i < parameters.getChildCount(); i++)
-      {
-        ConfigurationNode cn = parameters.getChild(i);
-        if (cn.getType().equals(SolrConfig.NODE_ZOOKEEPER))
-        {
-          String host = cn.getAttributeValue(SolrConfig.ATTR_HOST);
-          String zkport = cn.getAttributeValue(SolrConfig.ATTR_PORT);
-          String postfix = "zookeeper_"+k;
-          out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+postfix+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"SolrConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"SolrConnector.DeleteZookeeperHost")+Integer.toString(k+1)+"\" onclick='javascript:deleteZookeeperHost("+Integer.toString(k)+");'/>\n"+
-"              <input type=\"hidden\" name=\""+"op_"+postfix+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+"host_"+postfix+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(host)+"\"/>\n"+
-"              <input type=\"hidden\" name=\""+"port_"+postfix+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(zkport)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(host)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(zkport)+"</nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-          );
-          k++;
-        }
-      }
-      // If this looks like the first time through for this connection, add a default zookeeper setup.
-      // Only works because after the first post, parameters always will have children.
-      if (parameters.getChildCount() == 0)
-      {
-        String postfix = "zookeeper_"+k;
-        out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+postfix+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"SolrConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"SolrConnector.DeleteZookeeperHost")+Integer.toString(k+1)+"\" onclick='javascript:deleteZookeeperHost("+Integer.toString(k)+");'/>\n"+
-"              <input type=\"hidden\" name=\""+"op_"+postfix+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+"host_"+postfix+"\" value=\"localhost\"/>\n"+
-"              <input type=\"hidden\" name=\""+"port_"+postfix+"\" value=\"2181\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>localhost</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>2181</nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-        );
-        k++;
-      }
-      if (k == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"3\">"+Messages.getBodyString(locale,"SolrConnector.NoZookeeperHostsSpecified")+"</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"3\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\"zookeeper\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"SolrConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"SolrConnector.AddZookeeperHost") + "\" onclick=\"javascript:addZookeeperHost();\"/>\n"+
-"            </a>\n"+
-"            <input type=\"hidden\" name=\"count_zookeeper\" value=\""+k+"\"/>\n"+
-"            <input type=\"hidden\" name=\"op_zookeeper\" value=\"Continue\"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"host_zookeeper\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"port_zookeeper\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ZnodePath") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"znodepath\" type=\"text\" size=\"16\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(znodePath)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.CollectionName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"collection\" type=\"text\" size=\"16\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(collection)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ZookeeperClientTimeout") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"zkclienttimeout\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(zkClientTimeout)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ZookeeperConnectTimeout") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"zkconnecttimeout\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(zkConnectTimeout)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Zookeeper tab
-      int k = 0;
-      for (int i = 0; i < parameters.getChildCount(); i++)
-      {
-        ConfigurationNode cn = parameters.getChild(i);
-        if (cn.getType().equals(SolrConfig.NODE_ZOOKEEPER))
-        {
-          String host = cn.getAttributeValue(SolrConfig.ATTR_HOST);
-          String zkport = cn.getAttributeValue(SolrConfig.ATTR_PORT);
-          String postfix = "zookeeper_"+k;
-          out.print(
-"<input type=\"hidden\" name=\"host_"+postfix+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(host)+"\"/>\n"+
-"<input type=\"hidden\" name=\"port_"+postfix+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(zkport)+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      if (parameters.getChildCount() == 0)
-      {
-        String postfix = "zookeeper_"+k;
-        out.print(
-"<input type=\"hidden\" name=\"host_"+postfix+"\" value=\"localhost\"/>\n"+
-"<input type=\"hidden\" name=\"port_"+postfix+"\" value=\"2181\"/>\n"
-        );
-        k++;
-      }
-      out.print(
-"<input type=\"hidden\" name=\"count_zookeeper\" value=\""+k+"\"/>\n"+
-"<input type=\"hidden\" name=\"znodepath\" value=\""+znodePath+"\"/>\n"+
-"<input type=\"hidden\" name=\"collection\" value=\""+collection+"\"/>\n"+
-"<input type=\"hidden\" name=\"zkclienttimeout\" value=\""+zkClientTimeout+"\"/>\n"+
-"<input type=\"hidden\" name=\"zkconnecttimeout\" value=\""+zkConnectTimeout+"\"/>\n"
-      );
-    }
-    
-    // "Paths" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Paths")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.UpdateHandler") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"updatepath\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(updatePath)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.RemoveHandler") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"removepath\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(removePath)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.StatusHandler") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"statuspath\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(statusPath)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Paths tab hiddens
-      out.print(
-"<input type=\"hidden\" name=\"updatepath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(updatePath)+"\"/>\n"+
-"<input type=\"hidden\" name=\"removepath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(removePath)+"\"/>\n"+
-"<input type=\"hidden\" name=\"statuspath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(statusPath)+"\"/>\n"
-      );
-    }
-    
-    // "Schema" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Schema")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.IDFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"idfield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(idField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.OriginalSizeFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"originalsizefield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(originalSizeField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ModifiedDateFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"modifieddatefield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(modifiedDateField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.CreatedDateFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"createddatefield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(createdDateField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.IndexedDateFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"indexeddatefield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(indexedDateField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.FileNameFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"filenamefield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(fileNameField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.MimeTypeFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"mimetypefield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeTypeField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.UseExtractUpdateHandler") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"extractupdatecheckbox\" type=\"hidden\" value=\"true\"/>\n"+
-"      <input name=\"extractupdatepresent\" type=\"hidden\" value=\"true\"/>\n"
-      );
-      if (!useExtractUpdate.equals("false"))
-      {
-        out.print(
-"      <input name=\"extractupdate\" type=\"checkbox\" value=\"true\" checked=\"true\"/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <input name=\"extractupdate\" type=\"checkbox\" value=\"true\"/>\n"
-        );
-      }
-      out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ContentFieldName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"contentfield\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(contentField)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"idfield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(idField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"originalsizefield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(originalSizeField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"modifieddatefield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(modifiedDateField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"createddatefield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(createdDateField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"indexeddatefield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(indexedDateField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"filenamefield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(fileNameField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"mimetypefield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mimeTypeField)+"\"/>\n"+
-"<input type=\"hidden\" name=\"contentfield\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(contentField)+"\"/>\n"+
-"<input name=\"extractupdatecheckbox\" type=\"hidden\" value=\"false\"/>\n"+
-"<input type=\"hidden\" name=\"extractupdate\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(useExtractUpdate)+"\"/>\n"+
-"<input name=\"extractupdatepresent\" type=\"hidden\" value=\"true\"/>\n"
-      );
-    }
-    
-    // "Documents" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Documents")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.MaximumDocumentLength") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"maxdocumentlength\" type=\"text\" size=\"16\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(maxLength)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.IncludedMimeTypes") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <textarea rows=\"10\" cols=\"20\" name=\"includedmimetypes\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(includedMimeTypes)+"</textarea>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ExcludedMimeTypes") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <textarea rows=\"10\" cols=\"20\" name=\"excludedmimetypes\">"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(excludedMimeTypes)+"</textarea>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"maxdocumentlength\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(maxLength)+"\"/>\n"+
-"<input type=\"hidden\" name=\"includedmimetypes\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(includedMimeTypes)+"\"/>\n"+
-"<input type=\"hidden\" name=\"excludedmimetypes\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(excludedMimeTypes)+"\"/>\n"
-      );
-    }
-    
-    // "Commits" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Commits")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td colspan=\"2\" class=\"separator\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.CommitAtEndOfEveryJob") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"commits_present\" type=\"hidden\" value=\"true\"/>\n"+
-"      <input name=\"commits\" type=\"checkbox\" value=\"true\""+(commits.equals("true")?" checked=\"yes\"":"")+"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.CommitEachDocumentWithin") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"commitwithin\" type=\"text\" size=\"16\" value=\""+commitWithin+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"commits_present\" value=\"true\"/>\n"+
-"<input name=\"commits\" type=\"hidden\" value=\""+commits+"\"/>\n"+
-"<input name=\"commitwithin\" type=\"hidden\" value=\""+commitWithin+"\"/>\n"
-      );
-    }
-
-    // Prepare for the argument tab
-    Map argumentMap = new HashMap();
-    int i = 0;
-    while (i < parameters.getChildCount())
-    {
-      ConfigNode sn = parameters.getChild(i++);
-      if (sn.getType().equals(SolrConfig.NODE_ARGUMENT))
-      {
-        String name = sn.getAttributeValue(SolrConfig.ATTRIBUTE_NAME);
-        String value = sn.getAttributeValue(SolrConfig.ATTRIBUTE_VALUE);
-        ArrayList values = (ArrayList)argumentMap.get(name);
-        if (values == null)
-        {
-          values = new ArrayList();
-          argumentMap.put(name,values);
-        }
-        values.add(value);
-      }
-    }
-    
-    // "Arguments" tab
-    if (tabName.equals(Messages.getString(locale,"SolrConnector.Arguments")))
-    {
-      // For the display, sort the arguments into alphabetic order
-      String[] sortArray = new String[argumentMap.size()];
-      i = 0;
-      Iterator iter = argumentMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        sortArray[i++] = (String)iter.next();
-      }
-      java.util.Arrays.sort(sortArray);
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Arguments2") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Name") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Value") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      i = 0;
-      int k = 0;
-      while (k < sortArray.length)
-      {
-        String name = sortArray[k++];
-        ArrayList values = (ArrayList)argumentMap.get(name);
-        int j = 0;
-        while (j < values.size())
-        {
-          String value = (String)values.get(j++);
-          // Its prefix will be...
-          String prefix = "argument_" + Integer.toString(i);
-          out.print(
-"        <tr class=\""+(((i % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\"><input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"SolrConnector.DeleteArgument")+" "+Integer.toString(i+1)+"\" onclick=\"javascript:deleteArgument("+Integer.toString(i)+");"+"\"/>\n"+
-"              <input type=\"hidden\" name=\""+prefix+"_op"+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+prefix+"_name"+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\""+prefix+"_value"+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)+"\"</nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-          );
-          i++;
-        }
-      }
-      if (i == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"SolrConnector.NoArgumentsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"3\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\"argument\"><input type=\"button\" value=\"Add\" alt=\"Add argument\" onclick=\"javascript:addArgument();\"/>\n"+
-"              <input type=\"hidden\" name=\"argument_count\" value=\""+Integer.toString(i)+"\"/>\n"+
-"              <input type=\"hidden\" name=\"argument_op\" value=\"Continue\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"argument_name\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"argument_value\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Emit hiddens for argument tab
-      i = 0;
-      Iterator iter = argumentMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String name = (String)iter.next();
-        ArrayList values = (ArrayList)argumentMap.get(name);
-        int j = 0;
-        while (j < values.size())
-        {
-          String value = (String)values.get(j++);
-          // It's prefix will be...
-          String prefix = "argument_" + Integer.toString(i++);
-          out.print(
-"<input type=\"hidden\" name=\""+prefix+"_name\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+prefix+"_value\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)+"\"/>\n"
-          );
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\"argument_count\" value=\""+Integer.toString(i)+"\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String type = variableContext.getParameter("solrtype");
-    if (type != null)
-      parameters.setParameter(SolrConfig.PARAM_SOLR_TYPE,type);
-
-    String protocol = variableContext.getParameter("serverprotocol");
-    if (protocol != null)
-      parameters.setParameter(SolrConfig.PARAM_PROTOCOL,protocol);
-		
-    String server = variableContext.getParameter("servername");
-    if (server != null)
-      parameters.setParameter(SolrConfig.PARAM_SERVER,server);
-
-    String port = variableContext.getParameter("serverport");
-    if (port != null)
-      parameters.setParameter(SolrConfig.PARAM_PORT,port);
-
-    String webapp = variableContext.getParameter("webappname");
-    if (webapp != null)
-      parameters.setParameter(SolrConfig.PARAM_WEBAPPNAME,webapp);
-
-    String core = variableContext.getParameter("core");
-    if (core != null)
-      parameters.setParameter(SolrConfig.PARAM_CORE,core);
-
-    String collection = variableContext.getParameter("collection");
-    if (collection != null)
-      parameters.setParameter(SolrConfig.PARAM_COLLECTION,collection);
-
-    String connectionTimeout = variableContext.getParameter("connectiontimeout");
-    if (connectionTimeout != null)
-      parameters.setParameter(SolrConfig.PARAM_CONNECTION_TIMEOUT,connectionTimeout);
-    
-    String socketTimeout = variableContext.getParameter("sockettimeout");
-    if (socketTimeout != null)
-      parameters.setParameter(SolrConfig.PARAM_SOCKET_TIMEOUT,socketTimeout);
-
-    String znodePath = variableContext.getParameter("znodepath");
-    if (znodePath != null)
-      parameters.setParameter(SolrConfig.PARAM_ZOOKEEPER_ZNODE_PATH,znodePath);
-    
-    String zkClientTimeout = variableContext.getParameter("zkclienttimeout");
-    if (zkClientTimeout != null)
-      parameters.setParameter(SolrConfig.PARAM_ZOOKEEPER_CLIENT_TIMEOUT,zkClientTimeout);
-    
-    String zkConnectTimeout = variableContext.getParameter("zkconnecttimeout");
-    if (zkConnectTimeout != null)
-      parameters.setParameter(SolrConfig.PARAM_ZOOKEEPER_CONNECT_TIMEOUT,zkConnectTimeout);
-    
-    String updatePath = variableContext.getParameter("updatepath");
-    if (updatePath != null)
-      parameters.setParameter(SolrConfig.PARAM_UPDATEPATH,updatePath);
-
-    String removePath = variableContext.getParameter("removepath");
-    if (removePath != null)
-      parameters.setParameter(SolrConfig.PARAM_REMOVEPATH,removePath);
-
-    String statusPath = variableContext.getParameter("statuspath");
-    if (statusPath != null)
-      parameters.setParameter(SolrConfig.PARAM_STATUSPATH,statusPath);
-
-    String idField = variableContext.getParameter("idfield");
-    if (idField != null)
-      parameters.setParameter(SolrConfig.PARAM_IDFIELD,idField);
-
-    String originalSizeField = variableContext.getParameter("originalsizefield");
-    if (originalSizeField != null)
-      parameters.setParameter(SolrConfig.PARAM_ORIGINALSIZEFIELD,originalSizeField);
-
-    String modifiedDateField = variableContext.getParameter("modifieddatefield");
-    if (modifiedDateField != null)
-      parameters.setParameter(SolrConfig.PARAM_MODIFIEDDATEFIELD,modifiedDateField);
-
-    String createdDateField = variableContext.getParameter("createddatefield");
-    if (createdDateField != null)
-      parameters.setParameter(SolrConfig.PARAM_CREATEDDATEFIELD,createdDateField);
-
-    String indexedDateField = variableContext.getParameter("indexeddatefield");
-    if (indexedDateField != null)
-      parameters.setParameter(SolrConfig.PARAM_INDEXEDDATEFIELD,indexedDateField);
-
-    String fileNameField = variableContext.getParameter("filenamefield");
-    if (fileNameField != null)
-      parameters.setParameter(SolrConfig.PARAM_FILENAMEFIELD,fileNameField);
-
-    String mimeTypeField = variableContext.getParameter("mimetypefield");
-    if (mimeTypeField != null)
-      parameters.setParameter(SolrConfig.PARAM_MIMETYPEFIELD,mimeTypeField);
-
-    String contentField = variableContext.getParameter("contentfield");
-    if (contentField != null)
-      parameters.setParameter(SolrConfig.PARAM_CONTENTFIELD,contentField);
-
-    String extractUpdatePresent = variableContext.getParameter("extractupdatepresent");
-    if (extractUpdatePresent != null)
-    {
-      String extractUpdate = variableContext.getParameter("extractupdate");
-      if (extractUpdate == null || extractUpdate.length() == 0)
-        extractUpdate = "false";
-      parameters.setParameter(SolrConfig.PARAM_EXTRACTUPDATE,extractUpdate);
-    }
-
-    String realm = variableContext.getParameter("realm");
-    if (realm != null)
-      parameters.setParameter(SolrConfig.PARAM_REALM,realm);
-
-    String userID = variableContext.getParameter("userid");
-    if (userID != null)
-      parameters.setParameter(SolrConfig.PARAM_USERID,userID);
-		
-    String password = variableContext.getParameter("password");
-    if (password != null)
-      parameters.setObfuscatedParameter(SolrConfig.PARAM_PASSWORD,variableContext.mapKeyToPassword(password));
-    
-    String maxLength = variableContext.getParameter("maxdocumentlength");
-    if (maxLength != null)
-      parameters.setParameter(SolrConfig.PARAM_MAXLENGTH,maxLength);
-    
-    String includedMimeTypes = variableContext.getParameter("includedmimetypes");
-    if (includedMimeTypes != null)
-      parameters.setParameter(SolrConfig.PARAM_INCLUDEDMIMETYPES,includedMimeTypes);
-    
-    String excludedMimeTypes = variableContext.getParameter("excludedmimetypes");
-    if (excludedMimeTypes != null)
-      parameters.setParameter(SolrConfig.PARAM_EXCLUDEDMIMETYPES,excludedMimeTypes);
-    
-    String commitsPresent = variableContext.getParameter("commits_present");
-    if (commitsPresent != null)
-    {
-      String commits = variableContext.getParameter("commits");
-      if (commits == null)
-        commits = "false";
-      parameters.setParameter(SolrConfig.PARAM_COMMITS,commits);
-    }
-    
-    String commitWithin = variableContext.getParameter("commitwithin");
-    if (commitWithin != null)
-      parameters.setParameter(SolrConfig.PARAM_COMMITWITHIN,commitWithin);
-    
-    String keystoreValue = variableContext.getParameter("keystoredata");
-    if (keystoreValue != null)
-    {
-      IKeystoreManager mgr = KeystoreManagerFactory.make("",keystoreValue);
-      parameters.setParameter(SolrConfig.PARAM_KEYSTORE,mgr.getString());
-    }
-
-    String x = variableContext.getParameter("count_zookeeper");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the bandwidth nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode node = parameters.getChild(i);
-        if (node.getType().equals(SolrConfig.NODE_ZOOKEEPER))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String postfix = "zookeeper_"+Integer.toString(i);
-        String op = variableContext.getParameter("op_"+postfix);
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the host etc.
-          String host = variableContext.getParameter("host_"+postfix);
-          String zkport = variableContext.getParameter("port_"+postfix);
-          ConfigNode node = new ConfigNode(SolrConfig.NODE_ZOOKEEPER);
-          node.setAttribute(SolrConfig.ATTR_HOST,host);
-          node.setAttribute(SolrConfig.ATTR_PORT,zkport);
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        i++;
-      }
-      String addop = variableContext.getParameter("op_zookeeper");
-      if (addop != null && addop.equals("Add"))
-      {
-        String host = variableContext.getParameter("host_zookeeper");
-        String zkport = variableContext.getParameter("port_zookeeper");
-        ConfigNode node = new ConfigNode(SolrConfig.NODE_ZOOKEEPER);
-        node.setAttribute(SolrConfig.ATTR_HOST,host);
-        node.setAttribute(SolrConfig.ATTR_PORT,zkport);
-        parameters.addChild(parameters.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter("argument_count");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the argument nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode node = parameters.getChild(i);
-        if (node.getType().equals(SolrConfig.NODE_ARGUMENT))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String prefix = "argument_"+Integer.toString(i);
-        String op = variableContext.getParameter(prefix+"_op");
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the name and value.
-          String name = variableContext.getParameter(prefix+"_name");
-          String value = variableContext.getParameter(prefix+"_value");
-          ConfigNode node = new ConfigNode(SolrConfig.NODE_ARGUMENT);
-          node.setAttribute(SolrConfig.ATTRIBUTE_NAME,name);
-          node.setAttribute(SolrConfig.ATTRIBUTE_VALUE,value);
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        i++;
-      }
-      String addop = variableContext.getParameter("argument_op");
-      if (addop != null && addop.equals("Add"))
-      {
-        String name = variableContext.getParameter("argument_name");
-        String value = variableContext.getParameter("argument_value");
-        ConfigNode node = new ConfigNode(SolrConfig.NODE_ARGUMENT);
-        node.setAttribute(SolrConfig.ATTRIBUTE_NAME,name);
-        node.setAttribute(SolrConfig.ATTRIBUTE_VALUE,value);
-        parameters.addChild(parameters.getChildCount(),node);
-      }
-    }
-    
-    String configOp = variableContext.getParameter("configop");
-    if (configOp != null)
-    {
-      IKeystoreManager mgr;
-      if (configOp.equals("Delete"))
-      {
-        String alias = variableContext.getParameter("solrkeystorealias");
-        keystoreValue = parameters.getParameter(SolrConfig.PARAM_KEYSTORE);
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        mgr.remove(alias);
-        parameters.setParameter(SolrConfig.PARAM_KEYSTORE,mgr.getString());
-      }
-      else if (configOp.equals("Add"))
-      {
-        String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("solrcertificate");
-        keystoreValue = parameters.getParameter(SolrConfig.PARAM_KEYSTORE);
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
-        else
-          mgr = KeystoreManagerFactory.make("");
-        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-        String certError = null;
-        try
-        {
-          mgr.importCertificate(alias,is);
-        }
-        catch (Throwable e)
-        {
-          certError = e.getMessage();
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            // Eat this exception
-          }
-        }
-
-        if (certError != null)
-        {
-          return "Illegal certificate: "+certError;
-        }
-        parameters.setParameter(SolrConfig.PARAM_KEYSTORE,mgr.getString());
-      }
-    }
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Parameters") + "</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+" certificate(s)&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    
-    out.print(
-"    </td>\n"+
-"  </tr>\n"
-    );
-    
-    out.print(
-"\n"
-    );
-    
-    out.print(
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.ZookeeperHosts") + "</nobr></td>\n"+
-"    <td class=\"boxcell\" colspan=\"3\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Host") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Port") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-
-    int instanceNumber = 0;
-    for (int i = 0; i < parameters.getChildCount(); i++)
-    {
-      ConfigNode cn = parameters.getChild(i);
-      if (cn.getType().equals(SolrConfig.NODE_ZOOKEEPER))
-      {
-        // An argument node!  Look for all its parameters.
-        String host = cn.getAttributeValue(SolrConfig.ATTR_HOST);
-        String zkport = cn.getAttributeValue(SolrConfig.ATTR_PORT);
-
-        out.print(
-"        <tr class=\""+(((instanceNumber % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(host)+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(zkport)+"</nobr></td>\n"+
-"        </tr>\n"
-        );
-        
-        instanceNumber++;
-      }
-    }
-    if (instanceNumber == 0)
-    {
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"5\">" + Messages.getBodyString(locale,"SolrConnector.NoZookeeperHostsSpecified") + "</td></tr>\n"
-      );
-    }
-
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-    );
-
-    out.print(
-"\n"
-    );
-
-    out.print(
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Arguments3") + "</nobr></td>\n"+
-"    <td class=\"boxcell\" colspan=\"3\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Name") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"SolrConnector.Value") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-    
-    instanceNumber = 0;
-    for (int i = 0; i < parameters.getChildCount(); i++)
-    {
-      ConfigNode cn = parameters.getChild(i);
-      if (cn.getType().equals(SolrConfig.NODE_ARGUMENT))
-      {
-        // An argument node!  Look for all its parameters.
-        String name = cn.getAttributeValue(SolrConfig.ATTRIBUTE_NAME);
-        String value = cn.getAttributeValue(SolrConfig.ATTRIBUTE_VALUE);
-
-        out.print(
-"        <tr class=\""+(((instanceNumber % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr></td>\n"+
-"        </tr>\n"
-        );
-        
-        instanceNumber++;
-      }
-    }
-    if (instanceNumber == 0)
-    {
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"5\">" + Messages.getBodyString(locale,"SolrConnector.NoArguments") + "</td></tr>\n"
-      );
-    }
-    
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-    );
-    
-    out.print(
-"</table>\n"
-    );
-  }
-  
-  /** This class handles Solr connector version string packing/unpacking/interpretation.
-  */
-  protected class SpecPacker {
-    
-    /** Arguments, from configuration */
-    private final Map<String,List<String>> args = new HashMap<String,List<String>>();
-    
-    public SpecPacker(Specification spec) {
-
-      // Process arguments
-      for (int i = 0; i < params.getChildCount(); i++)
-      {
-        ConfigNode node = params.getChild(i);
-        if (node.getType().equals(SolrConfig.NODE_ARGUMENT))
-        {
-          String attrName = node.getAttributeValue(SolrConfig.ATTRIBUTE_NAME);
-          List<String> list = args.get(attrName);
-          if (list == null)
-          {
-            list = new ArrayList<String>();
-            args.put(attrName,list);
-          }
-          list.add(node.getAttributeValue(SolrConfig.ATTRIBUTE_VALUE));
-        }
-      }
-    
-    }
-    
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-      String[] sortArray = new String[args.size()];
-      Iterator<String> iter = args.keySet().iterator();
-      int i = 0;
-      while (iter.hasNext())
-      {
-        sortArray[i++] = iter.next();
-      }
-      
-      // Always use sorted order, because we need this to be comparable.
-      java.util.Arrays.sort(sortArray);
-      
-      String[] fixedList = new String[2];
-      List<String> nameValues = new ArrayList<String>();
-      for (int k = 0; k < sortArray.length; k++)
-      {
-        String name = sortArray[k];
-        List<String> values = args.get(name);
-        java.util.Collections.sort(values);
-        for (String value : values)
-        {
-          fixedList[0] = name;
-          fixedList[1] = value;
-          StringBuilder pairBuffer = new StringBuilder();
-          packFixedList(pairBuffer,fixedList,'=');
-          nameValues.add(pairBuffer.toString());
-        }
-      }
-      
-      packList(sb,nameValues,'+');
-      
-      // Here, append things which we have no intention of unpacking.  This includes stuff that comes from
-      // the configuration information, for instance.
-
-      if (idAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,idAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (originalSizeAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,originalSizeAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (modifiedDateAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,modifiedDateAttributeName,'+');
-      }
-      else
-        sb.append('-');
-      
-      if (createdDateAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,createdDateAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (indexedDateAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,indexedDateAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (fileNameAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,fileNameAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (mimeTypeAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,mimeTypeAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (contentAttributeName != null)
-      {
-          sb.append('+');
-          pack(sb,contentAttributeName,'+');
-      }
-      else
-        sb.append('-');
-
-      if (useExtractUpdateHandler)
-        sb.append('+');
-      else
-        sb.append('-');
-
-      // Length limitation.  We pack this because when it is changed we want to be sure we get any previously excluded documents.
-      if (maxDocumentLength != null)
-      {
-        sb.append('+');
-        pack(sb,maxDocumentLength.toString(),'+');
-      }
-      else
-        sb.append('-');
-      // Included mime types
-      if (includedMimeTypesString != null)
-      {
-        sb.append('+');
-        pack(sb,includedMimeTypesString,'+');
-      }
-      else
-        sb.append('-');
-      // Excluded mime types
-      if (excludedMimeTypesString != null)
-      {
-        sb.append('+');
-        pack(sb,excludedMimeTypesString,'+');
-      }
-      else
-        sb.append('-');
-
-      if (collectionName != null)
-      {
-        sb.append('+');
-        pack(sb,collectionName,'+');
-      }
-      else
-        sb.append('-');
-      
-      return sb.toString();
-    }
-    
-    public Map<String,List<String>> getArgs() {
-      return args;
-    }
-    
-  }
-
-}
diff --git a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_en_US.properties b/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_en_US.properties
deleted file mode 100644
index d1e1bfb..0000000
--- a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_en_US.properties
+++ /dev/null
@@ -1,109 +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.
-
-SolrConnector.Arguments=Arguments
-SolrConnector.KeepAllMetadata=Keep all metadata:
-SolrConnector.UseExtractUpdateHandler=Use the Extract Update Handler:
-SolrConnector.Arguments2=Arguments:
-SolrConnector.Commits=Commits
-SolrConnector.Documents=Documents
-SolrConnector.Schema=Schema
-SolrConnector.Server=Server
-SolrConnector.Paths=Paths
-SolrConnector.SolrType=Solr type
-SolrConnector.Zookeeper=ZooKeeper
-SolrConnector.SolrType2=Solr type:
-SolrConnector.SingleServer=Single server
-SolrConnector.SolrCloud=SolrCloud
-SolrConnector.ZookeeperHosts=ZooKeeper hosts:
-SolrConnector.Host=Host
-SolrConnector.Port=Port:
-SolrConnector.ZnodePath=Znode path:
-SolrConnector.Protocol=Protocol:
-SolrConnector.ServerName=Server name:
-SolrConnector.WebApplicationName=Web application name:
-SolrConnector.CoreName=Core/Collection name:
-SolrConnector.CollectionName=Collection name:
-SolrConnector.ConnectionTimeout=Connection timeout (seconds):
-SolrConnector.SocketTimeout=Socket timeout (seconds):
-SolrConnector.ZookeeperClientTimeout=ZooKeeper client timeout (seconds):
-SolrConnector.ZookeeperConnectTimeout=ZooKeeper connect timeout (seconds):
-SolrConnector.UpdateHandler=Update handler:
-SolrConnector.RemoveHandler=Remove handler:
-SolrConnector.StatusHandler=Status handler:
-SolrConnector.Realm=Realm:
-SolrConnector.UserID=User ID:
-SolrConnector.Password=Password:
-SolrConnector.SSLTrustCertificateList=SSL trust certificate list:
-SolrConnector.NoCertificatesPresent=No certificates present
-SolrConnector.AddCert=Add cert
-SolrConnector.Add=Add
-SolrConnector.AddZookeeperHost=Add ZooKeeper host
-SolrConnector.Certificate=Certificate:
-SolrConnector.IDFieldName=ID field name:
-SolrConnector.OriginalSizeFieldName=Original size field name:
-SolrConnector.ModifiedDateFieldName=Modified date field name:
-SolrConnector.CreatedDateFieldName=Created date field name:
-SolrConnector.IndexedDateFieldName=Indexed date field name:
-SolrConnector.FileNameFieldName=File name field name:
-SolrConnector.MimeTypeFieldName=Mime type field name:
-SolrConnector.ContentFieldName=Content field name:
-SolrConnector.MaximumDocumentLength=Maximum document length:
-SolrConnector.IncludedMimeTypes=Included mime types:
-SolrConnector.ExcludedMimeTypes=Excluded mime types:
-SolrConnector.CommitAtEndOfEveryJob=Commit at end of every job:
-SolrConnector.CommitEachDocumentWithin=Commit each document within (ms):
-SolrConnector.Name=Name
-SolrConnector.Value=Value
-SolrConnector.NoArgumentsSpecified=No arguments specified
-SolrConnector.Parameters=Parameters:
-SolrConnector.Arguments3=Arguments:
-SolrConnector.NoArguments=No arguments
-SolrConnector.SolrFieldMapping=Solr Field Mapping
-SolrConnector.FieldMappings=Field mappings:
-SolrConnector.MetadataFieldName=Metadata field name
-SolrConnector.SolrFieldName=Solr field name
-SolrConnector.NoFieldMappingSpecified=No field mapping specified
-SolrConnector.NoZookeeperHostsSpecified=No ZooKeeper hosts specified
-SolrConnector.AddFieldMapping=Add field mapping
-SolrConnector.ChooseACertificateFile=Choose a certificate file
-SolrConnector.ZookeeperHostCannotBeNull=ZooKeeper host cannot be null
-SolrConnector.ZookeeperPortCannotBeNull=ZooKeeper port cannot be null
-SolrConnector.ZookeeperPortMustBeAnInteger=ZooKeeper port must be an integer
-SolrConnector.ZnodePathMustStartWithACharacter=Znode path must start with a  '/' character
-SolrConnector.PleaseSupplyAValidSolrServerName=Please supply a valid Solr server name
-SolrConnector.SolrServerPortMustBeAValidInteger=Solr server port must be a valid integer
-SolrConnector.WebApplicationNameCannotHaveCharacters=Web application name cannot have '/' characters
-SolrConnector.PleaseSupplySolrCoreName=Please supply Solr core name
-SolrConnector.CoreNameCannotHaveCharacters=Core name cannot have '/' characters
-SolrConnector.WebApplicationMustBeSpecifiedIfCoreIsSpecified=Web application must be specified if core is specified
-SolrConnector.ConnectionTimeoutMustBeInteger=Connection timeout must be an integer
-SolrConnector.SocketTimeoutMustBeInteger=Socket timeout must be an integer
-SolrConnector.UpdatePathMustStartWithACharacter=Update path must start with a  '/' character
-SolrConnector.RemovePathMustStartWithACharacter=Remove path must start with a  '/' character
-SolrConnector.StatusPathMustStartWithACharacter=Status path must start with a  '/' character
-SolrConnector.MaximumDocumentLengthMustBAnInteger=Maximum document length must be an integer
-SolrConnector.CommitWithinValueMustBeAnInteger=Commit-within value must be an integer
-SolrConnector.MaximumDocumentLengthMustBeAnInteger=Maximum document length must be an integer
-SolrConnector.ArgumentNameCannotBeAnEmptyString=Argument name cannot be an empty string
-SolrConnector.MaximumDocumentLengthRequiredUnlessExtractingUpdateHandler=Maximum document length required unless using extract update handler
-SolrConnector.ContentFieldNameRequiredUnlessExtractingUpdateHandler=Content field name required unless using extract update handler
-SolrConnector.DeleteCert=Delete cert 
-SolrConnector.Delete=Delete
-SolrConnector.DeleteArgument=Delete argument #
-SolrConnector.DeleteZookeeperHost=Delete ZooKeeper host #
-SolrConnector.FieldMapMustHaveNonNullSource=Field map must have non-null source
-SolrConnector.DeleteFieldMapping=Delete field mapping #
-
diff --git a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_es_ES.properties b/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_es_ES.properties
deleted file mode 100644
index ba4e651..0000000
--- a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_es_ES.properties
+++ /dev/null
@@ -1,109 +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.
-
-SolrConnector.Arguments=Argumentos
-SolrConnector.KeepAllMetadata=Mantenga todos los metadatos:
-SolrConnector.UseExtractUpdateHandler=Usa el Extracto de actualización de Manejador:
-SolrConnector.Arguments2=Argumentos:
-SolrConnector.Commits=Los commits
-SolrConnector.Documents=Documentos
-SolrConnector.Schema=Esquema
-SolrConnector.Server=Servidor
-SolrConnector.Paths=Caminos
-SolrConnector.SolrType=tipo de Solr
-SolrConnector.Zookeeper=Encargado del Zoo
-SolrConnector.SolrType2=tipo de Solr:
-SolrConnector.SingleServer=servidor único
-SolrConnector.SolrCloud=SolrCloud
-SolrConnector.ZookeeperHosts=hosts encargado de parque zoológico:
-SolrConnector.Host=Host
-SolrConnector.Port=Puerto:
-SolrConnector.ZnodePath=ruta Znode:
-SolrConnector.Protocol=Protocolo:
-SolrConnector.ServerName=Nombre del servidor:
-SolrConnector.WebApplicationName=Nombre de la aplicación Web:
-SolrConnector.CoreName=Core/nombre de Colección:
-SolrConnector.CollectionName=nombre de la colección:
-SolrConnector.ConnectionTimeout=El tiempo de conexión expiro (segundos):
-SolrConnector.SocketTimeout=Socket timeout (segundos):
-SolrConnector.ZookeeperClientTimeout=Tiempo de espera del cliente ZooKeeper (segundos):
-SolrConnector.ZookeeperConnectTimeout=ZooKeeper tiempo de espera de conexión (segundos):
-SolrConnector.UpdateHandler=actualización de controlador:
-SolrConnector.RemoveHandler=Retire manejador:
-SolrConnector.StatusHandler=manejador de Estado:
-SolrConnector.Realm=Reino:
-SolrConnector.UserID=ID de usuario:
-SolrConnector.Password=Contraseña:
-SolrConnector.SSLTrustCertificateList=SSL lista de certificados de confianza:
-SolrConnector.NoCertificatesPresent=No hay certificados actuales
-SolrConnector.AddCert=Añadir cert
-SolrConnector.Add=Añadir
-SolrConnector.AddZookeeperHost=Añadir ZooKeeper host
-SolrConnector.Certificate=Certificado:
-SolrConnector.IDFieldName=ID nombre del campo:
-SolrConnector.OriginalSizeFieldName=Tamaño original nombre de campo:
-SolrConnector.ModifiedDateFieldName=Fecha de modificación nombre del campo:
-SolrConnector.CreatedDateFieldName=Fecha Creado nombre del campo:
-SolrConnector.IndexedDateFieldName=Fecha indexadas nombre del campo:
-SolrConnector.FileNameFieldName=Nombre de archivo campo de nombre:
-SolrConnector.MimeTypeFieldName=Mime nombre de campo de tipo:
-SolrConnector.ContentFieldName=Contenido nombre del campo:
-SolrConnector.MaximumDocumentLength=Longitud máxima del documento:
-SolrConnector.IncludedMimeTypes=Tipos MIME incluidos:
-SolrConnector.ExcludedMimeTypes=Tipos MIME excluidos:
-SolrConnector.CommitAtEndOfEveryJob=Comprometerse al final de cada trabajo:
-SolrConnector.CommitEachDocumentWithin=Comprometerse cada documento dentro (ms):
-SolrConnector.Name=Nombre
-SolrConnector.Value=Valor
-SolrConnector.NoArgumentsSpecified=No hay argumentos especificados
-SolrConnector.Parameters=Parámetros:
-SolrConnector.Arguments3=Argumentos:
-SolrConnector.NoArguments=No hay argumentos
-SolrConnector.SolrFieldMapping=Solr Trazar un mapa de Campaña
-SolrConnector.FieldMappings=Trazar un mapa de campaña:
-SolrConnector.MetadataFieldName=Metadatos nombre del campo
-SolrConnector.SolrFieldName=Solr nombre del campo
-SolrConnector.NoFieldMappingSpecified=Ninguna asignación campo especificado
-SolrConnector.NoZookeeperHostsSpecified=No hosts Zookeeper especificados
-SolrConnector.AddFieldMapping=Añada el trazar un mapa de campaña
-SolrConnector.ChooseACertificateFile=Escoja un archivo de certificado
-SolrConnector.ZookeeperHostCannotBeNull=ZooKeeper hosts no puede ser nulo
-SolrConnector.ZookeeperPortCannotBeNull=Puerto ZooKeeper no puede ser nulo
-SolrConnector.ZookeeperPortMustBeAnInteger=Puerto ZooKeeper debe ser un entero
-SolrConnector.ZnodePathMustStartWithACharacter=Ruta Znode debe comenzar con una  '/' carácter
-SolrConnector.PleaseSupplyAValidSolrServerName=Por favor, facilite un nombre de servidor Solr válida
-SolrConnector.SolrServerPortMustBeAValidInteger=Puerto del servidor Solr debe ser un entero válido
-SolrConnector.WebApplicationNameCannotHaveCharacters=Nombre de la aplicación Web no puede tener '/' carácter
-SolrConnector.PleaseSupplySolrCoreName=Por favor, facilite el nombre del núcleo Solr
-SolrConnector.CoreNameCannotHaveCharacters=Nombre Core no puede tener '/' carácter
-SolrConnector.WebApplicationMustBeSpecifiedIfCoreIsSpecified=Aplicación Web se debe especificar si se especifica núcleo
-SolrConnector.ConnectionTimeoutMustBeInteger=Tiempo de espera de conexión debe ser un entero
-SolrConnector.SocketTimeoutMustBeInteger=Tiempo de espera de socket debe ser un entero
-SolrConnector.UpdatePathMustStartWithACharacter=Actualización de ruta debe comenzar con un  '/' carácter
-SolrConnector.RemovePathMustStartWithACharacter=Retire ruta debe comenzar con un  '/' carácter
-SolrConnector.StatusPathMustStartWithACharacter=Ruta Estado debe comenzar con una  '/' carácter
-SolrConnector.MaximumDocumentLengthMustBAnInteger=Longitud máxima documento debe ser un número entero
-SolrConnector.CommitWithinValueMustBeAnInteger=Commit-dentro de valor debe ser un número entero
-SolrConnector.MaximumDocumentLengthMustBeAnInteger=Longitud máxima documento debe ser un número entero
-SolrConnector.ArgumentNameCannotBeAnEmptyString=Nombre argumento no puede ser una cadena vacía
-SolrConnector.MaximumDocumentLengthRequiredUnlessExtractingUpdateHandler=Longitud máxima del documento requerido a menos que use manejador actualización extracto
-SolrConnector.ContentFieldNameRequiredUnlessExtractingUpdateHandler=Contenido nombre del campo requiere a menos que use manejador actualización extracto
-SolrConnector.DeleteCert=eliminar cert
-SolrConnector.Delete=Borrar
-SolrConnector.DeleteArgument=eliminar argumento #
-SolrConnector.DeleteZookeeperHost=Eliminar ZooKeeper hots #
-SolrConnector.FieldMapMustHaveNonNullSource=Mapa de campo debe tener una fuente que no sea nulo
-SolrConnector.DeleteFieldMapping=Eliminar asignación de campos #
-
diff --git a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_ja_JP.properties b/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_ja_JP.properties
deleted file mode 100644
index b417dc7..0000000
--- a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_ja_JP.properties
+++ /dev/null
@@ -1,109 +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.
-
-SolrConnector.Arguments=引数
-SolrConnector.KeepAllMetadata=Keep all metadata:
-SolrConnector.UseExtractUpdateHandler=Use the Extract Update Handler:
-SolrConnector.Arguments2=引数:
-SolrConnector.Commits=コミット
-SolrConnector.Documents=コンテンツ
-SolrConnector.Schema=スキーマ
-SolrConnector.Server=サーバ
-SolrConnector.Paths=パス
-SolrConnector.SolrType=Solrタイプ
-SolrConnector.Zookeeper=ZooKeeper
-SolrConnector.SolrType2=Solrタイプ:
-SolrConnector.SingleServer=シングルサーバー
-SolrConnector.SolrCloud=SolrCloud
-SolrConnector.ZookeeperHosts=ZooKeeperホスト:
-SolrConnector.Host=ホスト
-SolrConnector.Port=ポート:
-SolrConnector.ZnodePath=Znodeパス:
-SolrConnector.Protocol=プロトコル:
-SolrConnector.ServerName=サーバ名:
-SolrConnector.WebApplicationName=Webアプリケーション名:
-SolrConnector.CoreName=コア/コレクション名:
-SolrConnector.CollectionName=コレクション名:
-SolrConnector.ConnectionTimeout=コネクションタイムアウト(秒):
-SolrConnector.SocketTimeout=ソケットタイムアウト(秒):
-SolrConnector.ZookeeperClientTimeout=ZooKeeperクライアントタイムアウト(秒):
-SolrConnector.ZookeeperConnectTimeout=ZooKeeper接続タイムアウト(秒):
-SolrConnector.UpdateHandler=更新ハンドラー:
-SolrConnector.RemoveHandler=除外ハンドラー:
-SolrConnector.StatusHandler=状態ハンドラー:
-SolrConnector.Realm=領域:
-SolrConnector.UserID=ユーザID
-SolrConnector.Password=パスワード:
-SolrConnector.SSLTrustCertificateList=SSLトラスト証明証一覧:
-SolrConnector.NoCertificatesPresent=証明証がありません
-SolrConnector.AddCert=証明証の追加
-SolrConnector.Add=追加
-SolrConnector.AddZookeeperHost=ZooKeeperホストを追加
-SolrConnector.Certificate=証明証:
-SolrConnector.IDFieldName=IDフィールド名:
-SolrConnector.OriginalSizeFieldName=Original size field name:
-SolrConnector.ModifiedDateFieldName=更新日付フィールド名:
-SolrConnector.CreatedDateFieldName=作成日付フィールド名:
-SolrConnector.IndexedDateFieldName=Indexed date field name:
-SolrConnector.FileNameFieldName=ファイル名称フィールド名:
-SolrConnector.MimeTypeFieldName=MIMEタイプフィールド名:
-SolrConnector.ContentFieldName=Content field name:
-SolrConnector.MaximumDocumentLength=最大コンテンツ長:
-SolrConnector.IncludedMimeTypes=含むMIMEタイプ:
-SolrConnector.ExcludedMimeTypes=除外するMIMEタイプ:
-SolrConnector.CommitAtEndOfEveryJob=ジョブ毎にコミット:
-SolrConnector.CommitEachDocumentWithin=コンテンツを指定した時間内(ミリ秒)毎にコミット:
-SolrConnector.Name=名前
-SolrConnector.Value=値
-SolrConnector.NoArgumentsSpecified=引数を指定してください
-SolrConnector.Parameters=引数:
-SolrConnector.Arguments3=引数:
-SolrConnector.NoArguments=引数が未指定
-SolrConnector.SolrFieldMapping=Solrフィールドマップ
-SolrConnector.FieldMappings=フィールドマップ:
-SolrConnector.MetadataFieldName=メタデータフィールド名
-SolrConnector.SolrFieldName=Solrフィールド名
-SolrConnector.NoFieldMappingSpecified=フィールドマッピングの指定がありません
-SolrConnector.NoZookeeperHostsSpecified=ZooKeeperホストの指定がありません
-SolrConnector.AddFieldMapping=フィールドマッピングを追加
-SolrConnector.ChooseACertificateFile=証明書ファイルを選択してください
-SolrConnector.ZookeeperHostCannotBeNull=ZooKeeperホストはNullにできません
-SolrConnector.ZookeeperPortCannotBeNull=ZooKeeperポートはNullにできません
-SolrConnector.ZookeeperPortMustBeAnInteger=ZooKeeperポートには整数を入力してください
-SolrConnector.ZnodePathMustStartWithACharacter=Znodeパスは「/」から始めてください
-SolrConnector.PleaseSupplyAValidSolrServerName=正しいSolrサーバ名を入力してください
-SolrConnector.SolrServerPortMustBeAValidInteger=Solrサーバポート番号には整数を入力してください
-SolrConnector.WebApplicationNameCannotHaveCharacters=Webアプリケーション名には文字「/」は使えません
-SolrConnector.PleaseSupplySolrCoreName=コア名を入力してください
-SolrConnector.CoreNameCannotHaveCharacters=コア名には文字「/」は使えません
-SolrConnector.WebApplicationMustBeSpecifiedIfCoreIsSpecified=コアを指定する場合はWebアプリケーションも指定してください
-SolrConnector.ConnectionTimeoutMustBeInteger=コネクションタイムアウトには整数を入力してください
-SolrConnector.SocketTimeoutMustBeInteger=ソケットタイムアウト値には整数を入力してください
-SolrConnector.UpdatePathMustStartWithACharacter=更新パスは文字「/」から始めてください
-SolrConnector.RemovePathMustStartWithACharacter=削除パスは文字「/」から始めてください
-SolrConnector.StatusPathMustStartWithACharacter=状態パスは文字「/」から始めてください
-SolrConnector.MaximumDocumentLengthMustBAnInteger=コンテンツの最大長さには整数を入力してください
-SolrConnector.CommitWithinValueMustBeAnInteger=Commit-within値には整数を入力してください
-SolrConnector.MaximumDocumentLengthMustBeAnInteger=最大コンテンツ長さには整数を入力してください
-SolrConnector.ArgumentNameCannotBeAnEmptyString=引数名を入力してください
-SolrConnector.MaximumDocumentLengthRequiredUnlessExtractingUpdateHandler=Maximum document length required unless using extract update handler
-SolrConnector.ContentFieldNameRequiredUnlessExtractingUpdateHandler=Content field name required unless using extract update handler
-SolrConnector.DeleteCert=証明書を削除 
-SolrConnector.Delete=削除
-SolrConnector.DeleteArgument=引数を削除 #
-SolrConnector.DeleteZookeeperHost=ZooKeeperホストを削除 #
-SolrConnector.FieldMapMustHaveNonNullSource=フィールドマップを入力してください
-SolrConnector.DeleteFieldMapping=フィールドマップを削除 #
-
diff --git a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_zh_CN.properties b/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_zh_CN.properties
deleted file mode 100644
index 906eb70..0000000
--- a/connectors/solr/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/solr/common_zh_CN.properties
+++ /dev/null
@@ -1,109 +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.
-
-SolrConnector.Arguments=参数
-SolrConnector.KeepAllMetadata=保持所有元数据:
-SolrConnector.UseExtractUpdateHandler=Use the Extract Update Handler:
-SolrConnector.Arguments2=参数: 
-SolrConnector.Commits=提交
-SolrConnector.Documents=文档
-SolrConnector.Schema=模式
-SolrConnector.Server=服务器
-SolrConnector.Paths=路径
-SolrConnector.SolrType=Solr类型
-SolrConnector.Zookeeper=ZooKeeper
-SolrConnector.SolrType2=Solr类型:
-SolrConnector.SingleServer=单服务器
-SolrConnector.SolrCloud=SolrCloud
-SolrConnector.ZookeeperHosts=ZooKeeper主机:
-SolrConnector.Host=主机
-SolrConnector.Port=端口:
-SolrConnector.ZnodePath=Znode路径:
-SolrConnector.Protocol=协议: 
-SolrConnector.ServerName=服务器名: 
-SolrConnector.WebApplicationName=Web应用程序名: 
-SolrConnector.CoreName=Core/Collection名:
-SolrConnector.CollectionName=Collection名:
-SolrConnector.ConnectionTimeout=连接超时(秒):
-SolrConnector.SocketTimeout=套接字超时(秒):
-SolrConnector.ZookeeperClientTimeout=ZooKeeper客户端超时(秒):
-SolrConnector.ZookeeperConnectTimeout=ZooKeeper连接超时(秒):
-SolrConnector.UpdateHandler=更新处理器: 
-SolrConnector.RemoveHandler=排除处理器: 
-SolrConnector.StatusHandler=状态处理器: 
-SolrConnector.Realm=区域: 
-SolrConnector.UserID=用户ID
-SolrConnector.Password=密码: 
-SolrConnector.SSLTrustCertificateList=SSL信任证书列表: 
-SolrConnector.NoCertificatesPresent=证书不存在
-SolrConnector.AddCert=添加证书
-SolrConnector.Add=添加
-SolrConnector.AddZookeeperHost=添加ZooKeeper主机
-SolrConnector.Certificate=证书: 
-SolrConnector.IDFieldName=ID字段名: 
-SolrConnector.OriginalSizeFieldName=Original size field name:
-SolrConnector.ModifiedDateFieldName=更新日期字段名: 
-SolrConnector.CreatedDateFieldName=生成日期字段名: 
-SolrConnector.IndexedDateFieldName=索引化的日期字段名:
-SolrConnector.FileNameFieldName=文件名字段名: 
-SolrConnector.MimeTypeFieldName=MIME类型字段名: 
-SolrConnector.ContentFieldName=Content field name:
-SolrConnector.MaximumDocumentLength=最大文档长度: 
-SolrConnector.IncludedMimeTypes=所包含的MIME类型: 
-SolrConnector.ExcludedMimeTypes=被排除的MIME类型: 
-SolrConnector.CommitAtEndOfEveryJob=提交每个作业: 
-SolrConnector.CommitEachDocumentWithin=在指定时间内(毫秒)提交每个文档: 
-SolrConnector.Name=名称
-SolrConnector.Value=值
-SolrConnector.NoArgumentsSpecified=请指定参数
-SolrConnector.Parameters=参数: 
-SolrConnector.Arguments3=参数: 
-SolrConnector.NoArguments=参数未指定
-SolrConnector.SolrFieldMapping=Solr字段映射
-SolrConnector.FieldMappings=字段映射: 
-SolrConnector.MetadataFieldName=元数据字段名
-SolrConnector.SolrFieldName=Solr字段名
-SolrConnector.NoFieldMappingSpecified=字段映射未指定
-SolrConnector.NoZookeeperHostsSpecified=ZooKeeper主机未指定
-SolrConnector.AddFieldMapping=添加字段映射
-SolrConnector.ChooseACertificateFile=请选择证书文件
-SolrConnector.ZookeeperHostCannotBeNull=ZooKeeper主机不能为Null
-SolrConnector.ZookeeperPortCannotBeNull=ZooKeeper端口不能为Null
-SolrConnector.ZookeeperPortMustBeAnInteger=ZooKeeper端口必须为整数
-SolrConnector.ZnodePathMustStartWithACharacter=Znode路径的第一个字符必须为‘/’
-SolrConnector.PleaseSupplyAValidSolrServerName=请输入有效的Solr服务器名
-SolrConnector.SolrServerPortMustBeAValidInteger=Solr服务器端口必须为有效的整数
-SolrConnector.WebApplicationNameCannotHaveCharacters=Web应用程序名不能包含字符‘/’
-SolrConnector.PleaseSupplySolrCoreName==请输入SolrCore名
-SolrConnector.CoreNameCannotHaveCharacters=Core名不能包含字符‘/’
-SolrConnector.WebApplicationMustBeSpecifiedIfCoreIsSpecified=如Core已指定则需指定Web应用程序
-SolrConnector.ConnectionTimeoutMustBeInteger=连接超时值必须为整数
-SolrConnector.SocketTimeoutMustBeInteger=套接字超时值必须为整数
-SolrConnector.UpdatePathMustStartWithACharacter=更新路径的第一个字符必须为‘/’
-SolrConnector.RemovePathMustStartWithACharacter=删除路径的第一个字符必须为‘/’
-SolrConnector.StatusPathMustStartWithACharacter=状态路径的第一个字符必须为‘/’
-SolrConnector.MaximumDocumentLengthMustBAnInteger=最大文档长度必须为整数
-SolrConnector.CommitWithinValueMustBeAnInteger=CommitWithin值必须为整数
-SolrConnector.MaximumDocumentLengthMustBeAnInteger=最大文档长度必须为整数
-SolrConnector.ArgumentNameCannotBeAnEmptyString=请输入参数名
-SolrConnector.MaximumDocumentLengthRequiredUnlessExtractingUpdateHandler=Maximum document length required unless using extract update handler
-SolrConnector.ContentFieldNameRequiredUnlessExtractingUpdateHandler=Content field name required unless using extract update handler
-SolrConnector.DeleteCert=删除证书 
-SolrConnector.Delete=删除
-SolrConnector.DeleteArgument=删除参数 #
-SolrConnector.DeleteZookeeperHost=删除ZooKeeper主机 #
-SolrConnector.FieldMapMustHaveNonNullSource=请输入字段映射
-SolrConnector.DeleteFieldMapping=删除字段映射 #
-
diff --git a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/BaseITHSQLDB.java b/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/BaseITHSQLDB.java
deleted file mode 100644
index b6744c2..0000000
--- a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Test Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Solr Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.solr.SolrConnector"};
-  }
-}
diff --git a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/BaseUIHSQLDB.java b/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 53041d7..0000000
--- a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Test Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Solr Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.output.solr.SolrConnector"};
-  }
-
-}
diff --git a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/MockSolrService.java b/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/MockSolrService.java
deleted file mode 100644
index 237ade0..0000000
--- a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/MockSolrService.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr.tests;
-
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.*;
-import java.util.*;
-
-/** Mock wiki service */
-public class MockSolrService
-{
-  Server server;
-  SolrServlet servlet;
-    
-  public MockSolrService()
-  {
-    server = new Server(new QueuedThreadPool(35));
-    ServerConnector connector = new ServerConnector(server);
-    connector.setPort(8188);
-    server.addConnector(connector);
-    servlet = new SolrServlet();
-    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    context.setInitParameter("org.eclipse.jetty.servlet.SessionIdPathParameterName","none");
-    context.setContextPath("/solr");
-    server.setHandler(context);
-    context.addServlet(new ServletHolder(servlet), "/*");
-  }
-    
-  public void start() throws Exception
-  {
-    server.start();
-  }
-    
-  public void stop() throws Exception
-  {
-    server.stop();
-  }
-
-  
-  public static class SolrServlet extends HttpServlet
-  {
-    public SolrServlet()
-    {
-    }
-    
-    @Override
-    public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException
-    {
-      try
-      {
-        // Get path part of request URL
-        String pathPart = req.getPathInfo();
-        if (pathPart == null)
-          generateMissingPageResponse(res);
-        else if (pathPart.equals("/admin/ping"))
-        {
-          generatePingResponse(res);
-        }
-        else if (pathPart.equals("/update/extract"))
-        {
-          generateUpdateResponse(res);
-        }
-        else if (pathPart.equals("/update"))
-        {
-          generateDeleteResponse(res);
-        }
-        else
-        {
-          generateMissingPageResponse(res);
-        }
-      }
-      catch (IOException e)
-      {
-        e.printStackTrace();
-        throw e;
-      }
-
-    }
-
-    protected static void generatePingResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.setStatus(HttpServletResponse.SC_OK);
-      res.setContentType("application/xml; charset=utf-8");
-      res.getWriter().printf(Locale.ROOT, "<solr>\n");
-      res.getWriter().printf(Locale.ROOT, "</solr>\n");
-      res.getWriter().flush();
-    }
-    
-    protected static void generateUpdateResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.setStatus(HttpServletResponse.SC_OK);
-      res.setContentType("application/xml; charset=utf-8");
-      res.getWriter().printf(Locale.ROOT, "<result>\n");
-      res.getWriter().printf(Locale.ROOT, "  <doc name=\"something\"/>\n");
-      res.getWriter().printf(Locale.ROOT, "</result>\n");
-      res.getWriter().flush();
-    }
-    
-    protected static void generateDeleteResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.setStatus(HttpServletResponse.SC_OK);
-      res.setContentType("application/xml; charset=utf-8");
-      res.getWriter().printf(Locale.ROOT, "<result>\n");
-      res.getWriter().printf(Locale.ROOT, "  <doc name=\"something\"/>\n");
-      res.getWriter().printf(Locale.ROOT, "</result>\n");
-      res.getWriter().flush();
-    }
-    
-    protected static void generateMissingPageResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.sendError(HttpServletResponse.SC_NOT_FOUND);
-    }
-    
-    protected static void generateBadArgumentResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.sendError(HttpServletResponse.SC_BAD_REQUEST);
-    }
-
-  }
-
-}
diff --git a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/NavigationHSQLDBUI.java b/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index 4c6ee10..0000000
--- a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.output.solr.SolrConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Visit the Solr tabs - Server first
-    testerInstance.clickTab("Server");
-    
-    // Solr type
-    testerInstance.clickTab("Solr type");
-    
-    // Zookeeper
-    testerInstance.clickTab("ZooKeeper");
-    
-    // Schema
-    testerInstance.clickTab("Schema");
-    
-    // Arguments
-    testerInstance.clickTab("Arguments");
-    
-    // Documents
-    testerInstance.clickTab("Documents");
-    
-    // Commits
-    testerInstance.clickTab("Commits");
-    
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/SolrCrawlHSQLDBIT.java b/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/SolrCrawlHSQLDBIT.java
deleted file mode 100644
index aeec952..0000000
--- a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/SolrCrawlHSQLDBIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SolrCrawlHSQLDBIT extends BaseITHSQLDB
-{
-
-  protected SolrTester tester;
-  protected MockSolrService solrService = null;
-  
-  public SolrCrawlHSQLDBIT()
-  {
-    tester = new SolrTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createSolrService()
-    throws Exception
-  {
-    System.out.println("Creating mock service");
-    solrService = new MockSolrService();
-    solrService.start();
-    System.out.println("Mock service created");
-  }
-  
-  @After
-  public void shutdownSolrService()
-    throws Exception
-  {
-    if (solrService != null)
-      solrService.stop();
-  }
-
-  @Test
-  public void simpleCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/SolrTester.java b/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/SolrTester.java
deleted file mode 100644
index 72755f2..0000000
--- a/connectors/solr/connector/src/test/java/org/apache/manifoldcf/agents/output/solr/tests/SolrTester.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output.solr.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-import org.apache.manifoldcf.agents.output.solr.SolrConfig;
-
-/** This is a 100 document crawl */
-public class SolrTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public SolrTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("Test Connection");
-    conn.setDescription("Test Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.tests.TestingRepositoryConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Solr Connection");
-    outputConn.setDescription("Solr Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.output.solr.SolrConnector");
-    outputConn.setMaxConnections(10);
-    // Set the connection parameters
-    ConfigParams configParams = outputConn.getConfigParams();
-    configParams.setParameter(SolrConfig.PARAM_PROTOCOL,SolrConfig.PROTOCOL_TYPE_HTTP);
-    configParams.setParameter(SolrConfig.PARAM_SERVER,"localhost");
-    configParams.setParameter(SolrConfig.PARAM_PORT,"8188");
-    configParams.setParameter(SolrConfig.PARAM_WEBAPPNAME,"solr");
-    configParams.setParameter(SolrConfig.PARAM_UPDATEPATH,"/update/extract");
-    configParams.setParameter(SolrConfig.PARAM_REMOVEPATH,"/update");
-    configParams.setParameter(SolrConfig.PARAM_STATUSPATH,"/admin/ping");
-    configParams.setParameter(SolrConfig.PARAM_IDFIELD,"id");
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("Test Connection");
-    job.addPipelineStage(-1,true,"Solr Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-      
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    SpecificationNode sn = new SpecificationNode("documentcount");
-    sn.setAttribute("count","111");
-    ds.addChild(ds.getChildCount(),sn);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    ManifoldCFException exception = null;
-    
-    if (exception == null)
-    {
-      try
-      {
-        // Now, start the job, and wait until it completes.
-        long startTime = System.currentTimeMillis();
-        jobManager.manualStart(job.getID());
-        instance.waitJobInactiveNative(jobManager,job.getID(),300000L);
-        System.err.println("Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-        
-        // Force reindexing, and immediately retry.  This is the case
-        // that always produces IOExceptions.
-        org.apache.manifoldcf.agents.system.ManifoldCF.signalOutputConnectionRedo(tc,"Solr Connection");
-        startTime = System.currentTimeMillis();
-        jobManager.manualStart(job.getID());
-        instance.waitJobInactiveNative(jobManager,job.getID(),300000L);
-        System.err.println("Second crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-      }
-      catch (ManifoldCFException e)
-      {
-        exception = e;
-      }
-    }
-
-    if (exception == null)
-    {
-      // Check to be sure we actually processed the right number of documents.
-      JobStatus status = jobManager.getStatus(job.getID());
-      if (status.getDocumentsProcessed() != 111)
-        exception = new ManifoldCFException("Wrong number of documents processed - expected 111, saw "+new Long(status.getDocumentsProcessed()).toString());
-    }
-    
-    if (exception == null)
-    {
-      // Look in the connection history for anything other than an OK
-      FilterCriteria fc = new FilterCriteria(new String[]{"document ingest (Solr Connection)"},null,null,null,null);
-      SortOrder sc = new SortOrder();
-      IResultSet result = mgr.genHistorySimple("File Connection",fc,sc,0,10000);
-      for (int i = 0; i < result.getRowCount(); i++)
-      {
-        IResultRow row = result.getRow(i);
-        String activity = (String)row.getValue("activity");
-        String resultCode = (String)row.getValue("resultcode");
-        String resultDetails = (String)row.getValue("resultdesc");
-        if (activity.startsWith("document ingest") && !resultCode.equals("OK"))
-          exception = new ManifoldCFException("An indexing operation ("+activity+") failed with result code "+resultCode+" details "+((resultDetails==null)?"none":resultDetails));
-        if (exception != null)
-          break;
-      }
-    }
-    
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),300000L);
-    
-    if (exception != null)
-      throw exception;
-    
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/solr/pom.xml b/connectors/solr/pom.xml
deleted file mode 100644
index 47b4053..0000000
--- a/connectors/solr/pom.xml
+++ /dev/null
@@ -1,410 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-solr-connector</artifactId>
-  <name>ManifoldCF - Connectors - Solr</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.solr</groupId>
-      <artifactId>solr-solrj</artifactId>
-      <version>${solr.version}</version>
-      <exclusions>
-        <!--  Solrj pulls in an older httpclient -->
-        <exclusion>
-          <artifactId>httpclient</artifactId>
-          <groupId>org.apache.httpcomponents</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>httpcore</artifactId>
-          <groupId>org.apache.httpcomponents</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>httpmime</artifactId>
-          <groupId>org.apache.httpcomponents</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.noggit</groupId>
-      <artifactId>noggit</artifactId>
-      <version>${noggit.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-      <version>${zookeeper.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-      <version>${httpcomponent.httpcore.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpmime</artifactId>
-      <version>${httpcomponent.httpmime.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/tika/.gitignore b/connectors/tika/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/connectors/tika/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/tika/build.xml b/connectors/tika/build.xml
deleted file mode 100644
index 8f56e1e..0000000
--- a/connectors/tika/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="tika" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="Tika content extractor"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.tika.TikaExtractor"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/Messages.java b/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/Messages.java
deleted file mode 100644
index 4315ff6..0000000
--- a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1596720 2014-05-22 00:57:29Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.tika;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.transformation.tika.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.transformation.tika";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaConfig.java b/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaConfig.java
deleted file mode 100644
index 9a12c5c..0000000
--- a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaConfig.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.tika;
-
-/**
- * Parameters for Tika transformation connector.
- */
-public class TikaConfig {
-
-  // Configuration parameters
-  // None
-
-  // Specification nodes and values
-  public static final String PARAM_TIKACONFIG = "tikaconfig";
-  public static final String NODE_FIELDMAP = "fieldmap";
-  public static final String NODE_KEEPMETADATA = "keepAllMetadata";
-  public static final String NODE_LOWERNAMES = "lowerNames";
-  public static final String NODE_WRITELIMIT = "writeLimit";
-  public static final int WRITELIMIT_DEFAULT = -1;
-  public static final String NODE_IGNORETIKAEXCEPTION = "ignoreException";
-  public static final String NODE_BOILERPLATEPROCESSOR = "boilerplateprocessor";
-  public static final String ATTRIBUTE_SOURCE = "source";
-  public static final String ATTRIBUTE_TARGET = "target";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-}
diff --git a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaExtractor.java b/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaExtractor.java
deleted file mode 100644
index c3c96ac..0000000
--- a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaExtractor.java
+++ /dev/null
@@ -1,1122 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.tika;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.Logging;
-
-import java.io.*;
-import java.util.*;
-
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.TikaMetadataKeys;
-import org.apache.tika.parser.html.BoilerpipeContentHandler;
-
-import de.l3s.boilerpipe.BoilerpipeExtractor;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-
-/** This connector works as a transformation connector, but does nothing other than logging.
-*
-*/
-public class TikaExtractor extends org.apache.manifoldcf.agents.transformation.BaseTransformationConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-  private static final String EDIT_CONFIGURATION_TIKACONFIG_HTML = "editConfiguration_TikaConfig.html";
-  private static final String EDIT_SPECIFICATION_FIELDMAPPING_HTML = "editSpecification_FieldMapping.html";
-  private static final String EDIT_SPECIFICATION_EXCEPTIONS_HTML = "editSpecification_Exceptions.html";
-  private static final String EDIT_SPECIFICATION_BOILERPLATE_HTML = "editSpecification_Boilerplate.html";
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-
-  protected static final String ACTIVITY_EXTRACT = "extract";
-
-  protected static final String[] activitiesList = new String[]{ACTIVITY_EXTRACT};
-  
-  /** We handle up to 64K in memory; after that we go to disk. */
-  protected static final long inMemoryMaximumFile = 65536;
-
-  protected String tikaConfig = null;
-  protected TikaParser tikaParser = null;
-  
-  /** Return a list of activities that this connector generates.
-  * The connector does NOT need to be connected before this method is called.
-  *@return the set of activities.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param os is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification os)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    SpecPacker sp = new SpecPacker(os);
-    return new VersionContext(sp.toPackedString(),params,os);
-  }
-
-  // We intercept checks pertaining to the document format and send modified checks further down
-  
-  /** Detect if a mime type is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param mimeType is the mime type of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the mime type can be accepted by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext pipelineDescription, String mimeType, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // We should see what Tika will transform
-    // MHL
-    // Do a downstream check
-    return checkActivity.checkMimeTypeIndexable("text/plain;charset=utf-8");
-  }
-
-  /** Pre-determine whether a document (passed here as a File object) is acceptable or not.  This method is
-  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-  * search engines that only handle a small set of accepted file types.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param localFile is the local file to check.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkDocumentIndexable(VersionContext pipelineDescription, File localFile, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Document contents are not germane anymore, unless it looks like Tika won't accept them.
-    // Not sure how to check that...
-    return true;
-  }
-
-  /** Pre-determine whether a document's length is acceptable.  This method is used
-  * to determine whether to fetch a document in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param length is the length of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkLengthIndexable(VersionContext pipelineDescription, long length, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Always true
-    return true;
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    initializeTikaParser();
-
-    // First, make sure downstream pipeline will now accept text/plain;charset=utf-8
-    if (!activities.checkMimeTypeIndexable("text/plain;charset=utf-8"))
-    {
-      activities.noDocument();
-      activities.recordActivity(null, ACTIVITY_EXTRACT, null, documentURI,
-        activities.EXCLUDED_MIMETYPE, "Downstream pipeline rejected mime type 'text/plain;charset=utf-8'");
-      return DOCUMENTSTATUS_REJECTED;
-    }
-
-    SpecPacker sp = new SpecPacker(pipelineDescription.getSpecification());
-
-    BoilerpipeExtractor extractorClassInstance = sp.getExtractorClassInstance();
-    
-    // Tika's API reads from an input stream and writes to an output Writer.
-    // Since a RepositoryDocument includes readers and inputstreams exclusively, AND all downstream
-    // processing needs to occur in a ManifoldCF thread, we have some constraints on the architecture we need to get this done:
-    // (1) The principle worker thread must call the downstream pipeline send() method.
-    // (2) The callee of the send() method must call a reader in the Repository Document.
-    // (3) The Reader, if its databuffer is empty, must pull more data from the original input stream and hand it to Tika, which populates the Reader's databuffer.
-    // So all this can be done in one thread, with some work, and the creation of a special InputStream or Reader implementation.  Where it fails, though, is the
-    // requirement that tika-extracted metadata be included in the RepositoryDocument right from the beginning.  Effectively this means that the entire document
-    // must be parsed before it is handed downstream -- so basically a temporary file (or in-memory buffer if small enough) must be created.
-    // Instead of the elegant flow above, we have the following:
-    // (1) Create a temporary file (or in-memory buffer if file is small enough)
-    // (2) Run Tika to completion, streaming content output to temporary file
-    // (3) Modify RepositoryDocument to read from temporary file, and include Tika-extracted metadata
-    // (4) Call downstream document processing
-      
-    DestinationStorage ds;
-      
-    if (document.getBinaryLength() <= inMemoryMaximumFile)
-    {
-      ds = new MemoryDestinationStorage((int)document.getBinaryLength());
-    }
-    else
-    {
-      ds = new FileDestinationStorage();
-    }
-    try
-    {
-      Metadata metadata = new Metadata();
-      if (document.getFileName() != null)
-      {
-        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, document.getFileName());
-        metadata.add("stream_name", document.getFileName());
-      }
-      if (document.getMimeType() != null)
-        metadata.add("Content-Type", document.getMimeType());
-      metadata.add("stream_size", new Long(document.getBinaryLength()).toString());
-
-      // We only log the extraction
-      long startTime = System.currentTimeMillis();
-      String resultCode = "OK";
-      String description = null;
-      Long length = null;
-      try
-      {
-        OutputStream os = ds.getOutputStream();
-        try
-        {
-          Writer w = new OutputStreamWriter(os,"utf-8");
-          try
-          {
-            // Use tika to parse stuff
-            ContentHandler handler = tikaParser.newWriteOutBodyContentHandler(w, sp.writeLimit());
-            if (extractorClassInstance != null)
-              handler = new BoilerpipeContentHandler(handler, extractorClassInstance);
-            try
-            {
-              tikaParser.parse(document.getBinaryStream(), metadata, handler);
-            }
-            catch (TikaException e)
-            {
-              if (sp.ignoreTikaException())
-              {
-                resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-                description = e.getMessage();
-              }
-              else
-              {
-                resultCode = "TIKAREJECTION";
-                description = e.getMessage();
-                int rval = handleTikaException(e);
-                if (rval == DOCUMENTSTATUS_REJECTED)
-                  activities.noDocument();
-                return rval;
-              }
-            }
-            catch (SAXException e)
-            {
-              resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              description = e.getMessage();
-              int rval = handleSaxException(e);
-              if (rval == DOCUMENTSTATUS_REJECTED)
-                activities.noDocument();
-              return rval;
-            }
-            catch (IOException e)
-            {
-              resultCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-              description = e.getMessage();
-              throw e;
-            }
-          }
-          finally
-          {
-            w.flush();
-          }
-        }
-        finally
-        {
-          os.close();
-          length = new Long(ds.getBinaryLength());
-        }
-        
-        // Check to be sure downstream pipeline will accept document of specified length
-        if (!activities.checkLengthIndexable(ds.getBinaryLength()))
-        {
-          activities.noDocument();
-          resultCode = activities.EXCLUDED_LENGTH;
-          description = "Downstream pipeline rejected document with length "+ds.getBinaryLength();
-          return DOCUMENTSTATUS_REJECTED;
-        }
-
-      }
-      finally
-      {
-        // Log the extraction processing
-        activities.recordActivity(new Long(startTime), ACTIVITY_EXTRACT, length, documentURI,
-          resultCode, description);
-      }
-      
-      // Parsing complete!
-      // Create a copy of Repository Document
-      RepositoryDocument docCopy = document.duplicate();
-        
-      // Get new stream length
-      long newBinaryLength = ds.getBinaryLength();
-      // Open new input stream
-      InputStream is = ds.getInputStream();
-      try
-      {
-        docCopy.setBinary(is,newBinaryLength);
-
-        // Set up all metadata from Tika.  We may want to run this through a mapper eventually...
-        String[] metaNames = metadata.names();
-        for(String mName : metaNames){
-          String value = metadata.get(mName);
-          if (sp.lowerNames())
-          {
-            StringBuilder sb = new StringBuilder();
-            for (int i=0; i<mName.length(); i++) {
-              char ch = mName.charAt(i);
-              if (!Character.isLetterOrDigit(ch)) ch='_';
-              else ch=Character.toLowerCase(ch);
-              sb.append(ch);
-            }
-            mName = sb.toString();
-          }
-          String target = sp.getMapping(mName);
-          if(target!=null)
-          {
-            docCopy.addField(target, value);
-          }
-          else
-          {
-            if(sp.keepAllMetadata())
-            {
-             docCopy.addField(mName, value);
-            }
-          }
-        }
-
-        // Send new document downstream
-        return activities.sendDocument(documentURI,docCopy);
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    finally
-    {
-      ds.close();
-    }
-
-  }
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-  }
-  
-  
-
-  /** Output the configuration header section.
-   * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-   * javascript methods that might be needed by the configuration editing HTML.
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-   */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale,
-      ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException {
-    tabsArray.add(Messages.getString(locale, "TikaExtractor.TikaConfigTabName"));
-
-    final Map<String,Object> paramMap = new HashMap<String,Object>();
-    fillInTikaConfigTab(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_JS, paramMap);  
-  }
-
-  /** Output the configuration body section.
-   * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-   * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-   * form is "editconnection".
-   *@param threadContext is the local thread context.
-   *@param out is the output to which any HTML should be sent.
-   *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-   *@param tabName is the current tab name.
-   */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale,
-      ConfigParams parameters, String tabName) throws ManifoldCFException, IOException {
-    final Map<String,Object> paramMap = new HashMap<String,Object>();
-    paramMap.put("TABNAME",tabName);
-    fillInTikaConfigTab(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIGURATION_TIKACONFIG_HTML, paramMap);    
-  }
-  
-  
-  /**
-   * Process a configuration post. This method is called at the start of the
-   * authority connector's configuration page, whenever there is a possibility
-   * that form data for a connection has been posted. Its purpose is to gather
-   * form information and modify the configuration parameters accordingly. The
-   * name of the posted form is "editconnection".
-   *
-   * @param threadContext is the local thread context.
-   * @param variableContext is the set of variables available from the post,
-   * including binary file post information.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   * @return null if all is well, or a string error message if there is an error
-   * that should prevent saving of the connection (and cause a redirection to an
-   * error page).
-   */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale,
-      ConfigParams parameters) throws ManifoldCFException {
-    
-    String tikaConfigValue = "";
-    if (variableContext.getParameter(TikaConfig.PARAM_TIKACONFIG) != null)
-    {
-      tikaConfigValue = variableContext.getParameter(TikaConfig.PARAM_TIKACONFIG);
-    }
-    parameters.setParameter(TikaConfig.PARAM_TIKACONFIG, tikaConfigValue);
-    
-    return null;
-  }
-  
-  /**
-   * Connect. The configuration parameters are included.
-   *
-   * @param configParams are the configuration parameters for this connection.
-   */
-  @Override
-  public void connect(ConfigParams configParams) {
-    super.connect(configParams);
-    tikaConfig = configParams.getParameter(TikaConfig.PARAM_TIKACONFIG);
-  }
-
-  @Override
-  public void disconnect() throws ManifoldCFException {
-    super.disconnect();
-    tikaConfig = null;
-    tikaParser = null;
-  }
-
-  protected void initializeTikaParser() throws ManifoldCFException {
-    if (tikaParser == null) {
-      tikaParser = new TikaParser(tikaConfig);
-    }
-  }
-  
-  /**
-   * View configuration. This method is called in the body section of the
-   * authority connector's view configuration page. Its purpose is to present
-   * the connection information to the user. The coder can presume that the HTML
-   * that is output from this configuration will be within appropriate <html>
-   * and <body> tags.
-   *
-   * @param threadContext is the local thread context.
-   * @param out is the output to which any HTML should be sent.
-   * @param parameters are the configuration parameters, as they currently
-   * exist, for this connection being configured.
-   */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-      throws ManifoldCFException, IOException {
-    final Map<String,Object> paramMap = new HashMap<String,Object>();
-    fillInTikaConfigTab(paramMap, out, parameters);
-    Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIGURATION_HTML, paramMap);
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    tabsArray.add(Messages.getString(locale, "TikaExtractor.FieldMappingTabName"));
-    tabsArray.add(Messages.getString(locale, "TikaExtractor.ExceptionsTabName"));
-    tabsArray.add(Messages.getString(locale, "TikaExtractor.BoilerplateTabName"));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInFieldMappingSpecificationMap(paramMap, os);
-    fillInExceptionsSpecificationMap(paramMap, os);
-    fillInBoilerplateSpecificationMap(paramMap, os);
-    
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_JS,paramMap);
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM",Integer.toString(actualSequenceNumber));
-
-    // Fill in the field mapping tab data
-    fillInFieldMappingSpecificationMap(paramMap, os);
-    fillInExceptionsSpecificationMap(paramMap, os);
-    fillInBoilerplateSpecificationMap(paramMap, os);
-    
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_FIELDMAPPING_HTML,paramMap);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_EXCEPTIONS_HTML,paramMap);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_SPECIFICATION_BOILERPLATE_HTML,paramMap);
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String x = variableContext.getParameter(seqPrefix+"fieldmapping_count");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the fieldmapping nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(TikaConfig.NODE_FIELDMAP)
-          || node.getType().equals(TikaConfig.NODE_KEEPMETADATA)
-          || node.getType().equals(TikaConfig.NODE_LOWERNAMES)
-          || node.getType().equals(TikaConfig.NODE_WRITELIMIT))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String prefix = seqPrefix+"fieldmapping_";
-        String suffix = "_"+Integer.toString(i);
-        String op = variableContext.getParameter(prefix+"op"+suffix);
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the fieldmap etc.
-          String source = variableContext.getParameter(prefix+"source"+suffix);
-          String target = variableContext.getParameter(prefix+"target"+suffix);
-          if (target == null)
-            target = "";
-          SpecificationNode node = new SpecificationNode(TikaConfig.NODE_FIELDMAP);
-          node.setAttribute(TikaConfig.ATTRIBUTE_SOURCE,source);
-          node.setAttribute(TikaConfig.ATTRIBUTE_TARGET,target);
-          os.addChild(os.getChildCount(),node);
-        }
-        i++;
-      }
-      
-      String addop = variableContext.getParameter(seqPrefix+"fieldmapping_op");
-      if (addop != null && addop.equals("Add"))
-      {
-        String source = variableContext.getParameter(seqPrefix+"fieldmapping_source");
-        String target = variableContext.getParameter(seqPrefix+"fieldmapping_target");
-        if (target == null)
-          target = "";
-        SpecificationNode node = new SpecificationNode(TikaConfig.NODE_FIELDMAP);
-        node.setAttribute(TikaConfig.ATTRIBUTE_SOURCE,source);
-        node.setAttribute(TikaConfig.ATTRIBUTE_TARGET,target);
-        os.addChild(os.getChildCount(),node);
-      }
-      
-      // Gather the keep all metadata parameter to be the last one
-      SpecificationNode node = new SpecificationNode(TikaConfig.NODE_KEEPMETADATA);
-      String keepAll = variableContext.getParameter(seqPrefix+"keepallmetadata");
-      if (keepAll != null)
-      {
-        node.setAttribute(TikaConfig.ATTRIBUTE_VALUE, keepAll);
-      }
-      else
-      {
-        node.setAttribute(TikaConfig.ATTRIBUTE_VALUE, "false");
-      }
-      // Add the new keepallmetadata config parameter 
-      os.addChild(os.getChildCount(), node);
-      
-      SpecificationNode node2 = new SpecificationNode(TikaConfig.NODE_LOWERNAMES);
-      String lower = variableContext.getParameter(seqPrefix+"lowernames");
-      if (lower != null)
-      {
-        node2.setAttribute(TikaConfig.ATTRIBUTE_VALUE, lower);
-      }
-      else
-      {
-        node2.setAttribute(TikaConfig.ATTRIBUTE_VALUE, "false");
-      }
-      os.addChild(os.getChildCount(), node2);
-      
-      SpecificationNode node3 = new SpecificationNode(TikaConfig.NODE_WRITELIMIT);
-      String writeLimit = variableContext.getParameter(seqPrefix+"writelimit");
-      if (writeLimit != null)
-      {
-        node3.setAttribute(TikaConfig.ATTRIBUTE_VALUE, writeLimit);
-      }
-      else
-      {
-        node3.setAttribute(TikaConfig.ATTRIBUTE_VALUE, "");
-      }
-      os.addChild(os.getChildCount(), node3);
-    }
-    
-    if (variableContext.getParameter(seqPrefix+"ignoretikaexceptions_present") != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(TikaConfig.NODE_IGNORETIKAEXCEPTION))
-          os.removeChild(i);
-        else
-          i++;
-      }
-
-      String value = variableContext.getParameter(seqPrefix+"ignoretikaexceptions");
-      if (value == null)
-        value = "false";
-
-      SpecificationNode node = new SpecificationNode(TikaConfig.NODE_IGNORETIKAEXCEPTION);
-      node.setAttribute(TikaConfig.ATTRIBUTE_VALUE, value);
-      os.addChild(os.getChildCount(), node);
-    }
-    
-    x = variableContext.getParameter(seqPrefix+"boilerplateclassname");
-    if (x != null)
-    {
-      int i = 0;
-      while (i < os.getChildCount())
-      {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(TikaConfig.NODE_BOILERPLATEPROCESSOR))
-          os.removeChild(i);
-        else
-          i++;
-      }
-
-      if (x.length() > 0)
-      {
-        SpecificationNode node = new SpecificationNode(TikaConfig.NODE_BOILERPLATEPROCESSOR);
-        node.setAttribute(TikaConfig.ATTRIBUTE_VALUE, x);
-        os.addChild(os.getChildCount(), node);
-      }
-    }
-    
-    return null;
-  }
-  
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM",Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInFieldMappingSpecificationMap(paramMap, os);
-    fillInExceptionsSpecificationMap(paramMap, os);
-    fillInBoilerplateSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out,locale,VIEW_SPECIFICATION_HTML,paramMap);
-    
-  }
-  
-  protected static void fillInTikaConfigTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    String tikaConfigValue = parameters.getParameter(TikaConfig.PARAM_TIKACONFIG);
-    if(tikaConfigValue == null) {
-      tikaConfigValue = "";
-    }
-    velocityContext.put("TIKACONFIG", tikaConfigValue); 
-    
-  }
-
-  protected static void fillInFieldMappingSpecificationMap(Map<String,Object> paramMap, Specification os)
-  {
-    // Prep for field mappings
-    List<Map<String,String>> fieldMappings = new ArrayList<Map<String,String>>();
-    String keepAllMetadataValue = "true";
-    String lowernamesValue = "false";
-    String writeLimitValue = "";
-    for (int i = 0; i < os.getChildCount(); i++)
-    {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(TikaConfig.NODE_FIELDMAP)) {
-        String source = sn.getAttributeValue(TikaConfig.ATTRIBUTE_SOURCE);
-        String target = sn.getAttributeValue(TikaConfig.ATTRIBUTE_TARGET);
-        String targetDisplay;
-        if (target == null)
-        {
-          target = "";
-          targetDisplay = "(remove)";
-        }
-        else
-          targetDisplay = target;
-        Map<String,String> fieldMapping = new HashMap<String,String>();
-        fieldMapping.put("SOURCE",source);
-        fieldMapping.put("TARGET",target);
-        fieldMapping.put("TARGETDISPLAY",targetDisplay);
-        fieldMappings.add(fieldMapping);
-      }
-      else if (sn.getType().equals(TikaConfig.NODE_KEEPMETADATA))
-      {
-        keepAllMetadataValue = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      }
-      else if (sn.getType().equals(TikaConfig.NODE_LOWERNAMES))
-      {
-        lowernamesValue = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      }
-      else if (sn.getType().equals(TikaConfig.NODE_WRITELIMIT))
-      {
-        writeLimitValue = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    paramMap.put("FIELDMAPPINGS",fieldMappings);
-    paramMap.put("KEEPALLMETADATA",keepAllMetadataValue);
-    paramMap.put("LOWERNAMES",lowernamesValue);
-    paramMap.put("WRITELIMIT",writeLimitValue);
-  }
-
-  protected static void fillInExceptionsSpecificationMap(Map<String,Object> paramMap, Specification os)
-  {
-    String ignoreTikaExceptions = "true";
-    for (int i = 0; i < os.getChildCount(); i++)
-    {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(TikaConfig.NODE_IGNORETIKAEXCEPTION))
-      {
-        ignoreTikaExceptions = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    paramMap.put("IGNORETIKAEXCEPTIONS",ignoreTikaExceptions);
-  }
-
-  protected static void fillInBoilerplateSpecificationMap(Map<String,Object> paramMap, Specification os)
-  {
-    String boilerplateClassName = "";
-    for (int i = 0; i < os.getChildCount(); i++)
-    {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(TikaConfig.NODE_BOILERPLATEPROCESSOR))
-      {
-        boilerplateClassName = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    paramMap.put("BOILERPLATECLASSNAME",boilerplateClassName);
-  }
-
-  protected static int handleTikaException(TikaException e)
-    throws IOException, ManifoldCFException, ServiceInterruption
-  {
-    // MHL - what does Tika throw if it gets an IOException reading the stream??
-    Logging.ingest.warn("Tika: Tika exception extracting: "+e.getMessage(),e);
-    return DOCUMENTSTATUS_REJECTED;
-  }
-  
-  protected static int handleSaxException(SAXException e)
-    throws IOException, ManifoldCFException, ServiceInterruption
-  {
-    // MHL - what does this mean?
-    Logging.ingest.warn("Tika: SAX exception extracting: "+e.getMessage(),e);
-    return DOCUMENTSTATUS_REJECTED;
-  }
-  
-  protected static int handleIOException(IOException e)
-    throws ManifoldCFException
-  {
-    // IOException reading from our local storage...
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException(e.getMessage(),e);
-  }
-  
-  protected static interface DestinationStorage
-  {
-    /** Get the output stream to write to.  Caller should explicitly close this stream when done writing.
-    */
-    public OutputStream getOutputStream()
-      throws ManifoldCFException;
-    
-    /** Get new binary length.
-    */
-    public long getBinaryLength()
-      throws ManifoldCFException;
-
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    public InputStream getInputStream()
-      throws ManifoldCFException;
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    public void close()
-      throws ManifoldCFException;
-  }
-  
-  protected static class FileDestinationStorage implements DestinationStorage
-  {
-    protected final File outputFile;
-    protected final OutputStream outputStream;
-
-    public FileDestinationStorage()
-      throws ManifoldCFException
-    {
-      File outputFile;
-      OutputStream outputStream;
-      try
-      {
-        outputFile = File.createTempFile("mcftika","tmp");
-        outputStream = new FileOutputStream(outputFile);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e);
-        outputFile = null;
-        outputStream = null;
-      }
-      this.outputFile = outputFile;
-      this.outputStream = outputStream;
-    }
-    
-    @Override
-    public OutputStream getOutputStream()
-      throws ManifoldCFException
-    {
-      return outputStream;
-    }
-    
-    /** Get new binary length.
-    */
-    @Override
-    public long getBinaryLength()
-      throws ManifoldCFException
-    {
-      return outputFile.length();
-    }
-
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    @Override
-    public InputStream getInputStream()
-      throws ManifoldCFException
-    {
-      try
-      {
-        return new FileInputStream(outputFile);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e);
-        return null;
-      }
-    }
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    @Override
-    public void close()
-      throws ManifoldCFException
-    {
-      outputFile.delete();
-    }
-
-  }
-  
-  protected static class MemoryDestinationStorage implements DestinationStorage
-  {
-    protected final ByteArrayOutputStream outputStream;
-    
-    public MemoryDestinationStorage(int sizeHint)
-    {
-      outputStream = new ByteArrayOutputStream(sizeHint);
-    }
-    
-    @Override
-    public OutputStream getOutputStream()
-      throws ManifoldCFException
-    {
-      return outputStream;
-    }
-
-    /** Get new binary length.
-    */
-    @Override
-    public long getBinaryLength()
-      throws ManifoldCFException
-    {
-      return outputStream.size();
-    }
-    
-    /** Get the input stream to read from.  Caller should explicitly close this stream when done reading.
-    */
-    @Override
-    public InputStream getInputStream()
-      throws ManifoldCFException
-    {
-      return new ByteArrayInputStream(outputStream.toByteArray());
-    }
-    
-    /** Close the object and clean up everything.
-    * This should be called when the data is no longer needed.
-    */
-    public void close()
-      throws ManifoldCFException
-    {
-    }
-
-  }
-
-  protected static class SpecPacker {
-    
-    private final Map<String,String> sourceTargets = new HashMap<String,String>();
-    private final boolean keepAllMetadata;
-    private final boolean lowerNames;
-    private final int writeLimit;
-    private final boolean ignoreTikaException;
-    private final String extractorClassName;
-    
-    public SpecPacker(Specification os) {
-      boolean keepAllMetadata = true;
-      boolean lowerNames = false;
-      int writeLimit = TikaConfig.WRITELIMIT_DEFAULT;
-      boolean ignoreTikaException = true;
-      String extractorClassName = null;
-      for (int i = 0; i < os.getChildCount(); i++) {
-        SpecificationNode sn = os.getChild(i);
-        
-        if(sn.getType().equals(TikaConfig.NODE_KEEPMETADATA)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          keepAllMetadata = Boolean.parseBoolean(value);
-        } else if(sn.getType().equals(TikaConfig.NODE_LOWERNAMES)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          lowerNames = Boolean.parseBoolean(value);
-        } else if(sn.getType().equals(TikaConfig.NODE_WRITELIMIT)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          if (value.length() == 0) {
-            writeLimit = TikaConfig.WRITELIMIT_DEFAULT;
-          } else {
-            writeLimit = Integer.parseInt(value);
-          }
-        } else if (sn.getType().equals(TikaConfig.NODE_FIELDMAP)) {
-          String source = sn.getAttributeValue(TikaConfig.ATTRIBUTE_SOURCE);
-          String target = sn.getAttributeValue(TikaConfig.ATTRIBUTE_TARGET);
-          
-          if (target == null) {
-            target = "";
-          }
-          sourceTargets.put(source, target);
-        } else if (sn.getType().equals(TikaConfig.NODE_IGNORETIKAEXCEPTION)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          ignoreTikaException = Boolean.parseBoolean(value);
-        } else if (sn.getType().equals(TikaConfig.NODE_BOILERPLATEPROCESSOR)) {
-          extractorClassName = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-        }
-      }
-      this.keepAllMetadata = keepAllMetadata;
-      this.lowerNames = lowerNames;
-      this.writeLimit = writeLimit;
-      this.ignoreTikaException = ignoreTikaException;
-      this.extractorClassName = extractorClassName;
-    }
-    
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-      int i;
-      
-      // Mappings
-      final String[] sortArray = new String[sourceTargets.size()];
-      i = 0;
-      for (String source : sourceTargets.keySet()) {
-        sortArray[i++] = source;
-      }
-      java.util.Arrays.sort(sortArray);
-      
-      List<String> packedMappings = new ArrayList<String>();
-      String[] fixedList = new String[2];
-      for (String source : sortArray) {
-        String target = sourceTargets.get(source);
-        StringBuilder localBuffer = new StringBuilder();
-        fixedList[0] = source;
-        fixedList[1] = target;
-        packFixedList(localBuffer,fixedList,':');
-        packedMappings.add(localBuffer.toString());
-      }
-      packList(sb,packedMappings,'+');
-
-      // Keep all metadata
-      if (keepAllMetadata)
-        sb.append('+');
-      else
-        sb.append('-');
-      if (lowerNames)
-          sb.append('+');
-        else
-          sb.append('-');
-
-      if (writeLimit != TikaConfig.WRITELIMIT_DEFAULT)
-      {
-        sb.append('+');
-        sb.append(writeLimit);
-      }
-
-      if (ignoreTikaException)
-        sb.append('+');
-      else
-        sb.append('-');
-
-      if (extractorClassName != null)
-      {
-        sb.append('+');
-        sb.append(extractorClassName);
-      }
-      else
-        sb.append('-');
-      
-      return sb.toString();
-    }
-
-    public String getMapping(String source) {
-      return sourceTargets.get(source);
-    }
-    
-    public boolean keepAllMetadata() {
-      return keepAllMetadata;
-    }
-    
-    public boolean lowerNames() {
-      return lowerNames;
-    }
-    
-    public int writeLimit() {
-      return writeLimit;
-    }
-    
-    public boolean ignoreTikaException() {
-      return ignoreTikaException;
-    }
-    
-    public BoilerpipeExtractor getExtractorClassInstance()
-      throws ManifoldCFException {
-      if (extractorClassName == null)
-        return null;
-      try {
-        ClassLoader loader = BoilerpipeExtractor.class.getClassLoader();
-        Class extractorClass = loader.loadClass(extractorClassName);
-        java.lang.reflect.Field f = extractorClass.getField("INSTANCE");
-        return (BoilerpipeExtractor)f.get(null);
-      } catch (ClassNotFoundException e) {
-        throw new ManifoldCFException("Boilerpipe extractor class '"+extractorClassName+"' not found: "+e.getMessage(),e);
-      } catch (Exception e) {
-        throw new ManifoldCFException("Boilerpipe extractor class '"+extractorClassName+"' exception on instantiation: "+e.getMessage(),e);
-      }
-    }
-
-  }
-
-}
-
-
diff --git a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaParser.java b/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaParser.java
deleted file mode 100644
index 0e79886..0000000
--- a/connectors/tika/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tika/TikaParser.java
+++ /dev/null
@@ -1,77 +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 org.apache.manifoldcf.agents.transformation.tika;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Writer;
-import java.util.Map;
-
-import org.apache.tika.config.TikaConfig;
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.AutoDetectParser;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.parser.Parser;
-import org.apache.tika.parser.html.HtmlParser;
-import org.apache.tika.sax.BodyContentHandler;
-import org.apache.tika.sax.WriteOutContentHandler;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-public class TikaParser {
-
-  private final Parser parser;
-
-  public TikaParser(final String tikaConfig)
-    throws ManifoldCFException {
-    if (tikaConfig == null || tikaConfig.length() == 0) {
-      parser = new AutoDetectParser();
-    } else {
-      final InputStream is = new ByteArrayInputStream(tikaConfig.getBytes());
-      try {
-        final TikaConfig conf = new TikaConfig(is);
-        parser = new AutoDetectParser(conf);
-      } catch (TikaException | IOException | SAXException e) {
-        throw new ManifoldCFException(e.getMessage(), e);
-      }
-    }
-  }
-  
-  /*
-      Map<MediaType, Parser> parsers = ((AutoDetectParser) parser).getParsers();
-      parsers.put(MediaType.APPLICATION_XML, new HtmlParser());
-      ((AutoDetectParser) parser).setParsers(parsers);
-  */
-
-  public static ContentHandler newWriteOutBodyContentHandler(Writer w, int writeLimit) {
-    final ContentHandler writeOutContentHandler = new WriteOutContentHandler(w, writeLimit);
-    return new BodyContentHandler(writeOutContentHandler);
-  }
-
-  public void parse(InputStream stream, Metadata metadata, ContentHandler handler)
-    throws IOException, SAXException, TikaException {
-    ParseContext context = new ParseContext();
-    context.set(Parser.class, parser);
-    parser.parse(stream, handler, metadata, context);
-  }
-
-}
diff --git a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_en_US.properties b/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_en_US.properties
deleted file mode 100644
index 8461865..0000000
--- a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_en_US.properties
+++ /dev/null
@@ -1,41 +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.
-
-TikaExtractor.TikaConfigTabName=Tika Config
-TikaExtractor.TikaConfig=Tika config
-TikaExtractor.FieldMappingTabName=Field mapping
-TikaExtractor.ExceptionsTabName=Exceptions
-TikaExtractor.BoilerplateTabName=Boilerplate
-TikaExtractor.BoilerplateExtractorColon=Boilerplate extractor:
-TikaExtractor.NoExtractionSelected=-- No extraction selected --
-TikaExtractor.ExtractArticles=Extract articles
-TikaExtractor.ExtractArticleSentences=Extract article sentences
-TikaExtractor.BasicExtraction=Basic general-purpose extraction
-TikaExtractor.ExtractEverything=Extract everything
-TikaExtractor.ExtractLargestTextComponent=Extract the largest text component of the document
-TikaExtractor.ExtractNumWords=Extract based on number of words per block
-TikaExtractor.FieldMappings=Field mappings:
-TikaExtractor.MetadataFieldName=Metadata field name
-TikaExtractor.FinalFieldName=Final field name
-TikaExtractor.NoFieldMappingSpecified=No field mapping specified
-TikaExtractor.KeepAllMetadata=Keep all metadata:
-TikaExtractor.LowerNames=Lower names:
-TikaExtractor.WriteLimit=Write limit:
-TikaExtractor.Add=Add
-TikaExtractor.AddFieldMapping=Add field mapping
-TikaExtractor.Delete=Delete
-TikaExtractor.DeleteFieldMapping=Delete field mapping
-TikaExtractor.NoFieldNameSpecified=Please specify a field name
-TikaExtractor.IgnoreTikaExceptions=Ignore Tika exceptions:
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_es_ES.properties b/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_es_ES.properties
deleted file mode 100644
index afbc603..0000000
--- a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_es_ES.properties
+++ /dev/null
@@ -1,41 +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.
-
-TikaExtractor.TikaConfigTabName=Tika Config
-TikaExtractor.TikaConfig=Tika config
-TikaExtractor.FieldMappingTabName=Trazar un mapa de campaña
-TikaExtractor.ExceptionsTabName=excepciones
-TikaExtractor.BoilerplateTabName=repetitivo
-TikaExtractor.BoilerplateExtractorColon=extractora repetitivo:
-TikaExtractor.NoExtractionSelected=-- Sin extracción seleccionado --
-TikaExtractor.ExtractArticles=Extracto de artículos
-TikaExtractor.ExtractArticleSentences=Extraer frases artículo
-TikaExtractor.BasicExtraction=Básica extracción de propósito general
-TikaExtractor.ExtractEverything=extraer todo
-TikaExtractor.ExtractLargestTextComponent=Extraiga el componente de texto más grande del documento
-TikaExtractor.ExtractNumWords=Extraer función del número de palabras por bloque
-TikaExtractor.FieldMappings=asignaciones de campo:
-TikaExtractor.MetadataFieldName=Metadatos nombre del campo
-TikaExtractor.FinalFieldName=Nombre de campo final
-TikaExtractor.NoFieldMappingSpecified=Ninguna asignación campo especificado
-TikaExtractor.KeepAllMetadata=Mantenga todos los metadatos:
-TikaExtractor.LowerNames=nombres Menores:
-TikaExtractor.WriteLimit=límite Comentario:
-TikaExtractor.Add=Añadir
-TikaExtractor.AddFieldMapping=Añadir asignación de campos
-TikaExtractor.Delete=Borrar
-TikaExtractor.DeleteFieldMapping=Eliminar asignación de campos
-TikaExtractor.NoFieldNameSpecified=Por favor, especifique un nombre de campo
-TikaExtractor.IgnoreTikaExceptions=No haga caso de excepciones Tika:
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_ja_JP.properties b/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_ja_JP.properties
deleted file mode 100644
index b706214..0000000
--- a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_ja_JP.properties
+++ /dev/null
@@ -1,41 +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.
-
-TikaExtractor.TikaConfigTabName=Tika Config
-TikaExtractor.TikaConfig=Tika config
-TikaExtractor.FieldMappingTabName=フィールドマッピング
-TikaExtractor.ExceptionsTabName=例外
-TikaExtractor.BoilerplateTabName=Boilerplate
-TikaExtractor.BoilerplateExtractorColon=Boilerplate extractor:
-TikaExtractor.NoExtractionSelected=-- No extraction selected --
-TikaExtractor.ExtractArticles=Extract articles
-TikaExtractor.ExtractArticleSentences=Extract article sentences
-TikaExtractor.BasicExtraction=Basic general-purpose extraction
-TikaExtractor.ExtractEverything=Extract everything
-TikaExtractor.ExtractLargestTextComponent=Extract the largest text component of the document
-TikaExtractor.ExtractNumWords=Extract based on number of words per block
-TikaExtractor.FieldMappings=フィールドマッピング:
-TikaExtractor.MetadataFieldName=メタデータフィールド名
-TikaExtractor.FinalFieldName=最後のフィールド名
-TikaExtractor.NoFieldMappingSpecified=フィールドマッピングを指定してください
-TikaExtractor.KeepAllMetadata=全メタデータを保存:
-TikaExtractor.LowerNames=小文字名:
-TikaExtractor.WriteLimit=最大文字長:
-TikaExtractor.Add=追加
-TikaExtractor.AddFieldMapping=フィールドマッピングを追加
-TikaExtractor.Delete=削除
-TikaExtractor.DeleteFieldMapping=フィールドマッピングを削除
-TikaExtractor.NoFieldNameSpecified=フィールド名を指定してください
-TikaExtractor.IgnoreTikaExceptions=Tika例外を無視してください:
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_zh_CN.properties b/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_zh_CN.properties
deleted file mode 100644
index 8dc8785..0000000
--- a/connectors/tika/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tika/common_zh_CN.properties
+++ /dev/null
@@ -1,41 +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.
-
-TikaExtractor.TikaConfigTabName=Tika Config
-TikaExtractor.TikaConfig=Tika config
-TikaExtractor.FieldMappingTabName=字段映射
-TikaExtractor.ExceptionsTabName=异常
-TikaExtractor.BoilerplateTabName=Boilerplate
-TikaExtractor.BoilerplateExtractorColon=Boilerplate extractor:
-TikaExtractor.NoExtractionSelected=-- No extraction selected --
-TikaExtractor.ExtractArticles=Extract articles
-TikaExtractor.ExtractArticleSentences=Extract article sentences
-TikaExtractor.BasicExtraction=Basic general-purpose extraction
-TikaExtractor.ExtractEverything=Extract everything
-TikaExtractor.ExtractLargestTextComponent=Extract the largest text component of the document
-TikaExtractor.ExtractNumWords=Extract based on number of words per block
-TikaExtractor.FieldMappings=字段映射:
-TikaExtractor.MetadataFieldName=元数据字段名
-TikaExtractor.FinalFieldName=最终字段名
-TikaExtractor.NoFieldMappingSpecified=未指定字段映射
-TikaExtractor.KeepAllMetadata=保存所有元数据:
-TikaExtractor.LowerNames=小写:
-TikaExtractor.WriteLimit=最大字符长度:
-TikaExtractor.Add=添加
-TikaExtractor.AddFieldMapping=添加字段映射
-TikaExtractor.Delete=删除
-TikaExtractor.DeleteFieldMapping=删除字段映射
-TikaExtractor.NoFieldNameSpecified=未指定字段名
-TikaExtractor.IgnoreTikaExceptions=忽略Tika异常:
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editConfiguration.js b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editConfiguration.js
deleted file mode 100644
index f25756c..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editConfiguration.js
+++ /dev/null
@@ -1,23 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-
-//-->
-</script>
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editConfiguration_TikaConfig.html b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editConfiguration_TikaConfig.html
deleted file mode 100644
index 92772e5..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editConfiguration_TikaConfig.html
+++ /dev/null
@@ -1,33 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('TikaExtractor.TikaConfigTabName'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="value" colspan="2">
-      <textarea name="tikaconfig" rows="20" cols="120">$Encoder.bodyEscape($TIKACONFIG)</textarea>
-    </td>
-  </tr>
-</table>
-      
-#else
-
-<input type="hidden" name="tikaconfig" value="$Encoder.attributeEscape($TIKACONFIG)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification.js b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification.js
deleted file mode 100644
index aa69293..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification.js
+++ /dev/null
@@ -1,46 +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.
--->
-
-<script type="text/javascript">
-<!--
-function s${SEQNUM}_addFieldMapping()
-{
-  if (editjob.s${SEQNUM}_fieldmapping_source.value == "")
-  {
-    alert("$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoFieldNameSpecified'))");
-    editjob.s${SEQNUM}_fieldmapping_source.focus();
-    return;
-  }
-  editjob.s${SEQNUM}_fieldmapping_op.value="Add";
-  postFormSetAnchor("s${SEQNUM}_fieldmapping");
-}
-
-function s${SEQNUM}_deleteFieldMapping(i)
-{
-  // Set the operation
-  eval("editjob.s${SEQNUM}_fieldmapping_op_"+i+".value=\"Delete\"");
-  // Submit
-  if (editjob.s${SEQNUM}_fieldmapping_count.value==i)
-    postFormSetAnchor("s${SEQNUM}_fieldmapping");
-  else
-    postFormSetAnchor("s${SEQNUM}_fieldmapping_"+i)
-  // Undo, so we won't get two deletes next time
-  eval("editjob.s${SEQNUM}_fieldmapping_op_"+i+".value=\"Continue\"");
-}
-
-//-->
-</script>
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_Boilerplate.html b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_Boilerplate.html
deleted file mode 100644
index 1faa2bc..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_Boilerplate.html
+++ /dev/null
@@ -1,70 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('TikaExtractor.BoilerplateTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.BoilerplateExtractorColon'))</nobr></td>
-    <td class="value">
-      <select name="s${SEQNUM}_boilerplateclassname">
-  #if($BOILERPLATECLASSNAME == '')
-        <option value="" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoExtractionSelected'))</option>
-  #else
-        <option value="">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoExtractionSelected'))</option>
-  #end
-  #if($BOILERPLATECLASSNAME == 'de.l3s.boilerpipe.extractors.ArticleExtractor')
-        <option value="de.l3s.boilerpipe.extractors.ArticleExtractor" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractArticles'))</option>
-  #else
-        <option value="de.l3s.boilerpipe.extractors.ArticleExtractor">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractArticles'))</option>
-  #end
-  #if($BOILERPLATECLASSNAME == 'de.l3s.boilerpipe.extractors.ArticleSentencesExtractor')
-        <option value="de.l3s.boilerpipe.extractors.ArticleSentencesExtractor" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractArticleSentences'))</option>
-  #else
-        <option value="de.l3s.boilerpipe.extractors.ArticleSentencesExtractor">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractArticleSentences'))</option>
-  #end
-  #if($BOILERPLATECLASSNAME == 'de.l3s.boilerpipe.extractors.DefaultExtractor')
-        <option value="de.l3s.boilerpipe.extractors.DefaultExtractor" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.BasicExtraction'))</option>
-  #else
-        <option value="de.l3s.boilerpipe.extractors.DefaultExtractor">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.BasicExtraction'))</option>
-  #end
-  #if($BOILERPLATECLASSNAME == 'de.l3s.boilerpipe.extractors.KeepEverythingExtractor')
-        <option value="de.l3s.boilerpipe.extractors.KeepEverythingExtractor" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractEverything'))</option>
-  #else
-        <option value="de.l3s.boilerpipe.extractors.KeepEverythingExtractor">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractEverything'))</option>
-  #end
-  #if($BOILERPLATECLASSNAME == 'de.l3s.boilerpipe.extractors.LargestContentExtractor')
-        <option value="de.l3s.boilerpipe.extractors.LargestContentExtractor" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractLargestTextComponent'))</option>
-  #else
-        <option value="de.l3s.boilerpipe.extractors.LargestContentExtractor">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractLargestTextComponent'))</option>
-  #end
-  #if($BOILERPLATECLASSNAME == 'de.l3s.boilerpipe.extractors.NumWordsRulesExtractor')
-        <option value="de.l3s.boilerpipe.extractors.NumWordsRulesExtractor" selected="true">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractNumWords'))</option>
-  #else
-        <option value="de.l3s.boilerpipe.extractors.NumWordsRulesExtractor">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.ExtractNumWords'))</option>
-  #end
-      </select>
-    </td>
-  </tr>
-</table>
-      
-#else
-
-<input type="hidden" name="s${SEQNUM}_boilerplateclassname" value="$Encoder.attributeEscape($BOILERPLATECLASSNAME)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_Exceptions.html b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_Exceptions.html
deleted file mode 100644
index db96a98..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_Exceptions.html
+++ /dev/null
@@ -1,40 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('TikaExtractor.ExceptionsTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.IgnoreTikaExceptions'))</nobr></td>
-    <td class="value">
-        <input type="hidden" name="s${SEQNUM}_ignoretikaexceptions_present" value="true"/>
-  #if($IGNORETIKAEXCEPTIONS == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_ignoretikaexceptions" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_ignoretikaexceptions" value="true"/>
-  #end
-    </td>
-  </tr>
-</table>
-      
-#else
-
-<input type="hidden" name="s${SEQNUM}_ignoretikaexceptions_present" value="true"/>
-<input type="hidden" name="s${SEQNUM}_ignoretikaexceptions" value="$Encoder.attributeEscape($IGNORETIKAEXCEPTIONS)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_FieldMapping.html b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_FieldMapping.html
deleted file mode 100644
index 8050aa7..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/editSpecification_FieldMapping.html
+++ /dev/null
@@ -1,127 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('TikaExtractor.FieldMappingTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FieldMappings'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.MetadataFieldName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FinalFieldName'))</nobr></td>
-        </tr>
-
-  #set($fieldcounter = 0)
-  #foreach($fieldmapping in $FIELDMAPPINGS)
-    #set($fieldcounterdisplay = $fieldcounter + 1)
-    #if(($fieldcounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <a name="s${SEQNUM}_fieldmapping_$fieldcounter">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.Delete'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.DeleteFieldMapping'))$fieldcounterdisplay" onclick='javascript:s${SEQNUM}_deleteFieldMapping("$fieldcounter");'/>
-              <input type="hidden" name="s${SEQNUM}_fieldmapping_op_$fieldcounter" value="Continue"/>
-              <input type="hidden" name="s${SEQNUM}_fieldmapping_source_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('SOURCE'))"/>
-              <input type="hidden" name="s${SEQNUM}_fieldmapping_target_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('TARGET'))"/>
-            </a>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('SOURCE'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('TARGETDISPLAY'))</nobr>
-          </td>
-        </tr>
-    #set($fieldcounter = $fieldcounter + 1)
-  #end
-  
-  #if($fieldcounter == 0)
-        <tr class="formrow"><td class="formmessage" colspan="3">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoFieldMappingSpecified'))</td></tr>
-  #end
-      
-        <tr class="formrow"><td class="formseparator" colspan="3"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <a name="fieldmapping">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.Add'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.AddFieldMapping'))" onclick="javascript:s${SEQNUM}_addFieldMapping();"/>
-            </a>
-            <input type="hidden" name="s${SEQNUM}_fieldmapping_count" value="$fieldcounter"/>
-            <input type="hidden" name="s${SEQNUM}_fieldmapping_op" value="Continue"/>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="15" name="s${SEQNUM}_fieldmapping_source" value=""/></nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="15" name="s${SEQNUM}_fieldmapping_target" value=""/></nobr>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.KeepAllMetadata'))</nobr></td>
-    <td class="value">
-  #if($KEEPALLMETADATA == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_keepallmetadata" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_keepallmetadata" value="true"/>
-  #end
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.LowerNames'))</nobr></td>
-    <td class="value">
-  #if($LOWERNAMES == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_lowernames" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_lowernames" value="true"/>
-  #end
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.WriteLimit'))</nobr></td>
-    <td class="value"><input name="s${SEQNUM}_writelimit" type="text"
-      value="$Encoder.attributeEscape($WRITELIMIT)" size="16" />
-    </td>
-  </tr>
-</table>
-      
-#else
-
-  #set($fieldcounter = 0)
-  #foreach($fieldmapping in $FIELDMAPPINGS)
-<input type="hidden" name="s${SEQNUM}_fieldmapping_source_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('SOURCE'))"/>
-<input type="hidden" name="s${SEQNUM}_fieldmapping_target_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('TARGET'))"/>
-    #set($fieldcounter = $fieldcounter + 1)
-  #end
-<input type="hidden" name="s${SEQNUM}_fieldmapping_count" value="$fieldcounter"/>
-<input type="hidden" name="s${SEQNUM}_keepallmetadata" value="$Encoder.bodyEscape($KEEPALLMETADATA)"/>
-<input type="hidden" name="s${SEQNUM}_lowernames" value="$Encoder.bodyEscape($LOWERNAMES)"/>
-<input type="hidden" name="s${SEQNUM}_writelimit" value="$Encoder.attributeEscape($WRITELIMIT)" />
-
-#end
\ No newline at end of file
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/viewConfiguration.html b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/viewConfiguration.html
deleted file mode 100644
index c57e4fb..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/viewConfiguration.html
+++ /dev/null
@@ -1,25 +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.
--->
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.TikaConfig'))</nobr></td>
-    <td class="value">$Encoder.bodyEscape($TIKACONFIG)</td>
-  </tr>
-
-</table>
diff --git a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/viewSpecification.html b/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/viewSpecification.html
deleted file mode 100644
index e91b367..0000000
--- a/connectors/tika/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tika/viewSpecification.html
+++ /dev/null
@@ -1,81 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FieldMappings'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.MetadataFieldName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FinalFieldName'))</nobr></td>
-        </tr>
-#set($fieldcounter = 0)
-#foreach($fieldmapping in $FIELDMAPPINGS)
-  #if(($fieldcounter % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('SOURCE'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('TARGETDISPLAY'))</nobr>
-          </td>
-        </tr>
-  #set($fieldcounter = $fieldcounter + 1)
-#end
-#if($fieldcounter == 0)
-        <tr class="formrow"><td class="formmessage" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoFieldMappingSpecified'))</td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.KeepAllMetadata'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($KEEPALLMETADATA)</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.LowerNames'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($LOWERNAMES)</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.WriteLimit'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($WRITELIMIT)</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.IgnoreTikaExceptions'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($IGNORETIKAEXCEPTIONS)</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.BoilerplateExtractorColon'))</nobr></td>
-    <td class="value">
-#if ($BOILERPLATECLASSNAME == '')
-      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoExtractionSelected'))</nobr>
-#else
-      <nobr>$Encoder.bodyEscape($BOILERPLATECLASSNAME)</nobr>
-#end
-    </td>
-  </tr>
-
-</table>
diff --git a/connectors/tika/connector/src/test/java/org/apache/manifoldcf/agents/transformation/tika/tests/TikaParserTest.java b/connectors/tika/connector/src/test/java/org/apache/manifoldcf/agents/transformation/tika/tests/TikaParserTest.java
deleted file mode 100644
index b41ddbf..0000000
--- a/connectors/tika/connector/src/test/java/org/apache/manifoldcf/agents/transformation/tika/tests/TikaParserTest.java
+++ /dev/null
@@ -1,105 +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 org.apache.manifoldcf.agents.transformation.tika.tests;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.manifoldcf.agents.transformation.tika.TikaParser;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.TikaMetadataKeys;
-import org.junit.Test;
-import org.junit.Ignore;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-
-import static org.junit.Assert.*;
-import static org.hamcrest.CoreMatchers.*;
-
-public class TikaParserTest {
-
-  private static List<String> docs = new ArrayList<>();
-  static {
-    docs.add("/test-documents/testEXCEL.xlsx");
-    docs.add("/test-documents/testHTML.html");
-    docs.add("/test-documents/testPDF.pdf");
-  }
-
-  @Test
-  public void testSimple() throws IOException, SAXException, TikaException, ManifoldCFException {
-    for (String doc : docs) {
-      String path = doc;
-      InputStream stream = getClass().getResourceAsStream(path);
-      Metadata metadata = new Metadata();
-      metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, new File(getClass().getResource(path).getFile()).getName());
-      TikaParser tikaParser = new TikaParser(null);
-      ContentHandler unlimitedHandler
-        = tikaParser.newWriteOutBodyContentHandler(new StringWriter(), -1);
-      tikaParser.parse(stream, metadata, unlimitedHandler);
- 
-      assertThat(unlimitedHandler.toString().length(), not(0));
-      assertThat(metadata.get("Content-Type"), notNullValue());
-      assertThat(metadata.get("resourceName"), notNullValue());
-    }
-  }
-
-  @Test
-  public void testExtractWithWriteLimit() throws IOException, SAXException, TikaException, ManifoldCFException {
-    for (String doc : docs) {
-      String path = doc;
-      InputStream stream = getClass().getResourceAsStream(path);
-      Metadata metadata = new Metadata();
-      metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, new File(getClass().getResource(path).getFile()).getName());
-      TikaParser tikaParser = new TikaParser(null);
-      ContentHandler limitedHandler
-        = tikaParser.newWriteOutBodyContentHandler(new StringWriter(), 100 * 1000);
-      tikaParser.parse(stream, metadata, limitedHandler);
-
-      assertThat(limitedHandler.toString().length(), not(0));
-      assertThat(metadata.get("Content-Type"), notNullValue());
-      assertThat(metadata.get("resourceName"), notNullValue());
-    }
-  }
-
-  @Test
-  @Ignore
-  public void testExtractWithTooShortWriteLimit() throws ManifoldCFException {
-    for (String doc : docs) {
-      String path = doc;
-      InputStream stream = getClass().getResourceAsStream(path);
-      Metadata metadata = new Metadata();
-      metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, new File(getClass().getResource(path).getFile()).getName());
-      TikaParser tikaParser = new TikaParser(null);
-      ContentHandler limitedHandler
-        = tikaParser.newWriteOutBodyContentHandler(new StringWriter(), 10);
-      try {
-        tikaParser.parse(stream, metadata, limitedHandler);
-        fail("Should not get here");
-      } catch (Exception e) {
-        assert e instanceof SAXException;
-        assertThat(e.toString().indexOf("org.apache.tika.sax.WriteOutContentHandler$WriteLimitReachedException"), not(-1));
-      }
-    }
-  }
-
-}
diff --git a/connectors/tika/connector/src/test/resources/test-documents/testEXCEL.xlsx b/connectors/tika/connector/src/test/resources/test-documents/testEXCEL.xlsx
deleted file mode 100755
index 3fe0a44..0000000
--- a/connectors/tika/connector/src/test/resources/test-documents/testEXCEL.xlsx
+++ /dev/null
Binary files differ
diff --git a/connectors/tika/connector/src/test/resources/test-documents/testHTML.html b/connectors/tika/connector/src/test/resources/test-documents/testHTML.html
deleted file mode 100644
index db26dc0..0000000
--- a/connectors/tika/connector/src/test/resources/test-documents/testHTML.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!--
- 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.
--->
-
-<html>
-
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Welcome to the Apache ManifoldCF&trade; project!</title>
-</head>
-
-<body>
-<div id="content">
-<h1>Welcome to the Apache ManifoldCF&trade; project!</h1>
-
-<p>Please click the appropriate tab above to see this site in the language of your choice.</p>
-
-</div>
-</body>
-</html>
diff --git a/connectors/tika/connector/src/test/resources/test-documents/testPDF.pdf b/connectors/tika/connector/src/test/resources/test-documents/testPDF.pdf
deleted file mode 100755
index 34899d5..0000000
--- a/connectors/tika/connector/src/test/resources/test-documents/testPDF.pdf
+++ /dev/null
Binary files differ
diff --git a/connectors/tika/pom.xml b/connectors/tika/pom.xml
deleted file mode 100644
index 78b8666..0000000
--- a/connectors/tika/pom.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-tika-connector</artifactId>
-  <name>ManifoldCF - Connectors - Tika Transformer</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tika</groupId>
-        <artifactId>tika-core</artifactId>
-        <version>${tika.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tika</groupId>
-        <artifactId>tika-parsers</artifactId>
-        <version>${tika.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>de.l3s.boilerpipe</groupId>
-        <artifactId>boilerpipe</artifactId>
-        <version>${boilerpipe.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/tikaservice/.gitignore b/connectors/tikaservice/.gitignore
deleted file mode 100644
index 75472cf..0000000
--- a/connectors/tikaservice/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.settings/
-/.project
diff --git a/connectors/tikaservice/build.xml b/connectors/tikaservice/build.xml
deleted file mode 100644
index b094cfa..0000000
--- a/connectors/tikaservice/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="tikaservice" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-transformation-connector">
-            <param name="connector-label" value="Tika external content extractor"/>
-            <param name="connector-class" value="org.apache.manifoldcf.agents.transformation.tikaservice.TikaExtractor"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/Messages.java b/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/Messages.java
deleted file mode 100644
index a113e74..0000000
--- a/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: Messages.java 1596720 2014-05-22 00:57:29Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.tikaservice;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.agents.transformation.tikaservice.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.agents.transformation.tikaservice";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/TikaConfig.java b/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/TikaConfig.java
deleted file mode 100644
index b34c35e..0000000
--- a/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/TikaConfig.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.tikaservice;
-
-/** Parameters for Tika transformation connector.
- */
-public class TikaConfig {
-
-  // Configuration parameters
-  public static final String PARAM_TIKAHOSTNAME = "tikaHostname";
-  public static final String PARAM_TIKAPORT = "tikaPort";
-  public static final String TIKAHOSTNAME_DEFAULT = "localhost";
-  public static final String TIKAPORT_DEFAULT = "9998";
-
-  // Specification nodes and values
-  public static final String NODE_FIELDMAP = "fieldmap";
-  public static final String NODE_KEEPMETADATA = "keepAllMetadata";
-  public static final String NODE_LOWERNAMES = "lowerNames";
-  public static final String NODE_WRITELIMIT = "writeLimit";
-  public static final int WRITELIMIT_DEFAULT = -1;
-  public static final String NODE_IGNORETIKAEXCEPTION = "ignoreException";
-  public static final String ATTRIBUTE_SOURCE = "source";
-  public static final String ATTRIBUTE_TARGET = "target";
-  public static final String ATTRIBUTE_VALUE = "value";
-  
-}
diff --git a/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/TikaExtractor.java b/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/TikaExtractor.java
deleted file mode 100644
index 6327fcb..0000000
--- a/connectors/tikaservice/connector/src/main/java/org/apache/manifoldcf/agents/transformation/tikaservice/TikaExtractor.java
+++ /dev/null
@@ -1,1308 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation.tikaservice;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.input.TeeInputStream;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.TikaMetadataKeys;
-
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.Logging;
-
-import java.io.*;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.nio.charset.StandardCharsets;
-
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-
-/**
- * This connector works as a transformation connector, but does nothing other
- * than logging.
- *
- */
-public class TikaExtractor extends org.apache.manifoldcf.agents.transformation.BaseTransformationConnector {
-  public static final String _rcsid = "@(#)$Id$";
-
-  private static final String EDIT_CONFIGURATION_JS = "editConfiguration.js";
-  private static final String EDIT_CONFIGURATION_SERVER_HTML = "editConfiguration_Server.html";
-  private static final String VIEW_CONFIGURATION_HTML = "viewConfiguration.html";
-  private static final String EDIT_SPECIFICATION_JS = "editSpecification.js";
-  private static final String EDIT_SPECIFICATION_FIELDMAPPING_HTML = "editSpecification_FieldMapping.html";
-  private static final String VIEW_SPECIFICATION_HTML = "viewSpecification.html";
-
-  protected static final String ACTIVITY_EXTRACT = "extract";
-
-  protected static final String[] activitiesList = new String[] { ACTIVITY_EXTRACT };
-  protected final static long sessionExpirationInterval = 300000L;
-  
-  /** We handle up to 64K in memory; after that we go to disk. */
-  protected static final long inMemoryMaximumFile = 65536;
-
-  // Raw parameters
-  
-  /** Tika host name */
-  private String tikaHostname = null;
-  
-  /** Tika port */
-  private String tikaPortString = null;
-
-  // Computed parameters
-
-  /** Session timeout */
-  private long sessionTimeout = -1L;
-  
-  /** Tika port */
-  private int tikaPort = -1;
-
-  /** Connection manager */
-  private HttpClientConnectionManager connectionManager = null;
-  
-  /** Httpclient instance */
-  private HttpClient httpClient = null;
-
-  /** HttpHost */
-  private HttpHost tikaHost = null;
-  
-  // Static data
-  
-  /** Metadata URI */
-  protected final static URI metaURI;
-  /** Content URI */
-  protected final static URI contentURI;
-  /** Check URI */
-  protected final static URI checkURI;
-  
-  static {
-    try {
-      metaURI = new URI("/meta");
-      contentURI = new URI("/tika");
-      checkURI = new URI("/detect/stream");
-    } catch (URISyntaxException e) {
-      throw new RuntimeException(e.getMessage());
-    }
-  }
-  
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the root directory.
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-    tikaHostname = configParameters.getParameter(TikaConfig.PARAM_TIKAHOSTNAME);
-    tikaPortString = configParameters.getParameter(TikaConfig.PARAM_TIKAPORT);
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    expireSession();
-    tikaHostname = null;
-    tikaPortString = null;
-
-    super.disconnect();
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    if (System.currentTimeMillis() >= sessionTimeout)
-    {
-      expireSession();
-    }
-    if (connectionManager != null)
-      connectionManager.closeIdleConnections(60000L,TimeUnit.MILLISECONDS);
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    return sessionTimeout != -1L;
-  }
-
-  /** Set up a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    if (sessionTimeout == -1L)
-    {
-      if (tikaHostname == null || tikaHostname.length() == 0) {
-        throw new ManifoldCFException("Missing host name");
-      }
-      if (tikaPortString == null) {
-        throw new ManifoldCFException("Missing port value");
-      }
-      try {
-        this.tikaPort = Integer.parseInt(tikaPortString);
-      } catch (NumberFormatException e) {
-        throw new ManifoldCFException("Bad port number: "+tikaPortString);
-      }
-      final int connectionTimeout = 60000;
-      final int socketTimeout = 900000;
-
-      final PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        //.register("https", myFactory)
-        .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-
-      this.connectionManager = poolingConnectionManager;
-      
-      final RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(false)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-
-      final HttpClientBuilder builder = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build());
-      builder.setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new LaxRedirectStrategy());
-      this.httpClient = builder.build();
-
-      this.tikaHost = new HttpHost(tikaHostname, tikaPort);
-
-    }
-    sessionTimeout = System.currentTimeMillis() + sessionExpirationInterval;
-  }
-
-  /** Expire the current session */
-  protected void expireSession()
-    throws ManifoldCFException
-  {
-    tikaPort = -1;
-    httpClient = null;
-    tikaHost = null;
-    if (connectionManager != null)
-      connectionManager.shutdown();
-    connectionManager = null;
-    sessionTimeout = -1L;
-  }
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    getSession();
-    final HttpPut httpPut = new HttpPut(metaURI);
-    httpPut.addHeader("Accept", "application/json");
-    final HttpEntity entity = new InputStreamEntity(new ByteArrayInputStream("this is a test".getBytes(StandardCharsets.UTF_8)));
-    httpPut.setEntity(entity);
-    HttpResponse response;
-    try {
-      response = this.httpClient.execute(tikaHost, httpPut);
-    } catch (IOException e) {
-      return "Connection error: "+e.getMessage();
-    }
-    final int responseCode = response.getStatusLine().getStatusCode();
-    if (response.getStatusLine().getStatusCode() != 200) {
-      return "Bad response: "+response.getStatusLine();
-    }
-    return super.check();
-  }
-  
-  /**
-   * Return a list of activities that this connector generates. The connector
-   * does NOT need to be connected before this method is called.
-   * 
-   * @return the set of activities.
-   */
-  @Override
-  public String[] getActivitiesList() {
-    return activitiesList;
-  }
-
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"TikaExtractor.TikaServerTabName"));
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIGURATION_JS,null);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TabName",tabName);
-    fillInServerTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIGURATION_SERVER_HTML,velocityContext);
-  }
-  
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    final String tikaHostname = variableContext.getParameter("tikaHostname");
-
-    if (tikaHostname != null)
-      parameters.setParameter(TikaConfig.PARAM_TIKAHOSTNAME,tikaHostname);
-
-    final String tikaPort = variableContext.getParameter("tikaPort");
-    if (tikaPort != null)
-      parameters.setParameter(TikaConfig.PARAM_TIKAPORT,tikaPort);
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    Map<String,Object> velocityContext = new HashMap<String,Object>();
-    fillInServerTab(velocityContext,out,parameters);
-    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIGURATION_HTML,velocityContext);
-  }
-
-  protected static void fillInServerTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String tikaHostname = parameters.getParameter(TikaConfig.PARAM_TIKAHOSTNAME);
-    if (tikaHostname == null)
-      tikaHostname = TikaConfig.TIKAHOSTNAME_DEFAULT;
-
-    String tikaPort = parameters.getParameter(TikaConfig.PARAM_TIKAPORT);
-    if (tikaPort == null)
-      tikaPort = TikaConfig.TIKAPORT_DEFAULT;
-
-    // Fill in context
-    velocityContext.put("TIKAHOSTNAME", tikaHostname);
-    velocityContext.put("TIKAPORT", tikaPort);
-  }
-
-  /**
-   * Get an output version string, given an output specification. The output
-   * version string is used to uniquely describe the pertinent details of the
-   * output specification and the configuration, to allow the Connector
-   * Framework to determine whether a document will need to be output again.
-   * Note that the contents of the document cannot be considered by this method,
-   * and that a different version string (defined in IRepositoryConnector) is
-   * used to describe the version of the actual document.
-   *
-   * This method presumes that the connector object has been configured, and it
-   * is thus able to communicate with the output data store should that be
-   * necessary.
-   * 
-   * @param os
-   *          is the current output specification for the job that is doing the
-   *          crawling.
-   * @return a string, of unlimited length, which uniquely describes output
-   *         configuration and specification in such a way that if two such
-   *         strings are equal, the document will not need to be sent again to
-   *         the output data store.
-   */
-  @Override
-  public VersionContext getPipelineDescription(Specification os) throws ManifoldCFException, ServiceInterruption {
-    SpecPacker sp = new SpecPacker(os);
-    return new VersionContext(sp.toPackedString(), params, os);
-  }
-
-  // We intercept checks pertaining to the document format and send modified
-  // checks further down
-
-  /**
-   * Detect if a mime type is acceptable or not. This method is used to
-   * determine whether it makes sense to fetch a document in the first place.
-   * 
-   * @param pipelineDescription
-   *          is the document's pipeline version string, for this connection.
-   * @param mimeType
-   *          is the mime type of the document.
-   * @param checkActivity
-   *          is an object including the activities that can be performed by
-   *          this method.
-   * @return true if the mime type can be accepted by this connector.
-   */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext pipelineDescription, String mimeType,
-      IOutputCheckActivity checkActivity) throws ManifoldCFException, ServiceInterruption {
-    // We should see what Tika will transform
-    // MHL
-    // Do a downstream check
-    return checkActivity.checkMimeTypeIndexable("text/plain;charset=utf-8");
-  }
-
-  /**
-   * Pre-determine whether a document (passed here as a File object) is
-   * acceptable or not. This method is used to determine whether a document
-   * needs to be actually transferred. This hook is provided mainly to support
-   * search engines that only handle a small set of accepted file types.
-   * 
-   * @param pipelineDescription
-   *          is the document's pipeline version string, for this connection.
-   * @param localFile
-   *          is the local file to check.
-   * @param checkActivity
-   *          is an object including the activities that can be done by this
-   *          method.
-   * @return true if the file is acceptable, false if not.
-   */
-  @Override
-  public boolean checkDocumentIndexable(VersionContext pipelineDescription, File localFile,
-      IOutputCheckActivity checkActivity) throws ManifoldCFException, ServiceInterruption {
-    // Document contents are not germane anymore, unless it looks like Tika
-    // won't accept them.
-    // Not sure how to check that...
-    return true;
-  }
-
-  /**
-   * Pre-determine whether a document's length is acceptable. This method is
-   * used to determine whether to fetch a document in the first place.
-   * 
-   * @param pipelineDescription
-   *          is the document's pipeline version string, for this connection.
-   * @param length
-   *          is the length of the document.
-   * @param checkActivity
-   *          is an object including the activities that can be done by this
-   *          method.
-   * @return true if the file is acceptable, false if not.
-   */
-  @Override
-  public boolean checkLengthIndexable(VersionContext pipelineDescription, long length,
-      IOutputCheckActivity checkActivity) throws ManifoldCFException, ServiceInterruption {
-    // Always true
-    return true;
-  }
-
-  /**
-   * Add (or replace) a document in the output data store using the connector.
-   * This method presumes that the connector object has been configured, and it
-   * is thus able to communicate with the output data store should that be
-   * necessary. The OutputSpecification is *not* provided to this method,
-   * because the goal is consistency, and if output is done it must be
-   * consistent with the output description, since that was what was partly used
-   * to determine if output should be taking place. So it may be necessary for
-   * this method to decode an output description string in order to determine
-   * what should be done.
-   * 
-   * @param documentURI
-   *          is the URI of the document. The URI is presumed to be the unique
-   *          identifier which the output data store will use to process and
-   *          serve the document. This URI is constructed by the repository
-   *          connector which fetches the document, and is thus universal across
-   *          all output connectors.
-   * @param outputDescription
-   *          is the description string that was constructed for this document
-   *          by the getOutputDescription() method.
-   * @param document
-   *          is the document data to be processed (handed to the output data
-   *          store).
-   * @param authorityNameString
-   *          is the name of the authority responsible for authorizing any
-   *          access tokens passed in with the repository document. May be null.
-   * @param activities
-   *          is the handle to an object that the implementer of a pipeline
-   *          connector may use to perform operations, such as logging
-   *          processing activity, or sending a modified document to the next
-   *          stage in the pipeline.
-   * @return the document status (accepted or permanently rejected).
-   * @throws IOException
-   *           only if there's a stream error reading the document data.
-   */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription,
-      RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-      throws ManifoldCFException, ServiceInterruption, IOException {
-    // First, make sure downstream pipeline will now accept
-    // text/plain;charset=utf-8
-    if (!activities.checkMimeTypeIndexable("text/plain;charset=utf-8")) {
-      activities.noDocument();
-      activities.recordActivity(null, ACTIVITY_EXTRACT, null, documentURI, activities.EXCLUDED_MIMETYPE,
-          "Downstream pipeline rejected mime type 'text/plain;charset=utf-8'");
-      return DOCUMENTSTATUS_REJECTED;
-    }
-
-    SpecPacker sp = new SpecPacker(pipelineDescription.getSpecification());
-
-    getSession();
-    
-    // Tika server variables
-    String mime = "";
-    InputStream tikaServerIs = null;
-    HttpResponse response = null;
-    IOException tikaServerDownException = null;
-
-    // Tika's API reads from an input stream and writes to an output Writer.
-    // Since a RepositoryDocument includes readers and inputstreams exclusively,
-    // AND all downstream
-    // processing needs to occur in a ManifoldCF thread, we have some
-    // constraints on the architecture we need to get this done:
-    // (1) The principle worker thread must call the downstream pipeline send()
-    // method.
-    // (2) The callee of the send() method must call a reader in the Repository
-    // Document.
-    // (3) The Reader, if its databuffer is empty, must pull more data from the
-    // original input stream and hand it to Tika, which populates the Reader's
-    // databuffer.
-    // So all this can be done in one thread, with some work, and the creation
-    // of a special InputStream or Reader implementation. Where it fails,
-    // though, is the
-    // requirement that tika-extracted metadata be included in the
-    // RepositoryDocument right from the beginning. Effectively this means that
-    // the entire document
-    // must be parsed before it is handed downstream -- so basically a temporary
-    // file (or in-memory buffer if small enough) must be created.
-    // Instead of the elegant flow above, we have the following:
-    // (1) Create a temporary file (or in-memory buffer if file is small enough)
-    // (2) Run Tika to completion, streaming content output to temporary file
-    // (3) Modify RepositoryDocument to read from temporary file, and include
-    // Tika-extracted metadata
-    // (4) Call downstream document processing
-
-    final DestinationStorage ds;
-    if (document.getBinaryLength() <= inMemoryMaximumFile) {
-      ds = new MemoryDestinationStorage((int) document.getBinaryLength());
-    } else {
-      ds = new FileDestinationStorage();
-    }
-    try {
-      DestinationStorage responseDs = null;
-      try {
-        Metadata metadata = new Metadata();
-        if (document.getFileName() != null) {
-          metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, document.getFileName());
-          metadata.add("stream_name", document.getFileName());
-        }
-        if (document.getMimeType() != null) {
-          mime = document.getMimeType();
-          metadata.add("Content-Type", mime);
-        }
-        metadata.add("stream_size", new Long(document.getBinaryLength()).toString());
-
-        // We only log the extraction
-        long startTime = System.currentTimeMillis();
-        String resultCode = "OK";
-        String description = null;
-        Long length = null;
-
-        try {
-          try {
-
-            // Make a copy of the original stream as it needs to be sent two
-            // times to Tika
-            // one for the metadata and one for the content
-            final OutputStream os = ds.getOutputStream();
-            try {
-              IOUtils.copyLarge(document.getBinaryStream(), os);
-            } finally {
-              os.close();
-            }
-
-            // Metadata
-            HttpPut httpPut = new HttpPut(metaURI);
-            if (!mime.isEmpty()) {
-              httpPut.addHeader("Content-Type", mime);
-            }
-            httpPut.addHeader("Accept", "application/json");
-            HttpEntity entity = new InputStreamEntity(ds.getInputStream());
-            httpPut.setEntity(entity);
-            try {
-              //System.out.println("About to PUT");
-              response = this.httpClient.execute(tikaHost, httpPut);
-              //System.out.println("PUT successful");
-            } catch (IOException e) {
-              // Retry 3 times, 10000 ms between retries, and abort if doesn't work
-              final long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("Tika down, retrying: "+e.getMessage(),e,currentTime + 10000L,
-                -1L,3,true);
-            }
-            int responseCode = response.getStatusLine().getStatusCode();
-            if (response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 204) {
-              tikaServerIs = response.getEntity().getContent();
-              try {
-                final BufferedReader br = new BufferedReader(new InputStreamReader(tikaServerIs));
-                final JSONParser parser = new JSONParser();
-                JSONObject metaJson;
-                final StringBuilder sb = new StringBuilder();
-                String output;
-                while ((output = br.readLine()) != null) {
-                  sb.append(output);
-                }
-                metaJson = (JSONObject) parser.parse(sb.toString());
-                for (Object key : metaJson.keySet()) {
-                  String metadataKey = key.toString();
-                  String metadataValue =  metaJson.get(key).toString();
-                  
-                  // Replace the content type by the one found by Tika
-                  if(metadataKey.equals("Content-Type")) {
-                    metadata.remove(metadataKey);
-                  }
-                  
-                  metadata.add(metadataKey, metadataValue);
-                }
-              } finally {
-                tikaServerIs.close();
-              }
-            } else {
-              activities.noDocument();
-              if (responseCode == 422) {
-                resultCode = "TIKASERVERREJECTS";
-                description = "Tika Server rejected document with the following reason: "
-                    + response.getStatusLine().getReasonPhrase();
-                handleTikaServerRejects(description);
-              } else {
-                resultCode = "TIKASERVERERROR";
-                description = "Tika Server failed to parse document with the following error: "
-                    + response.getStatusLine().getReasonPhrase();
-                handleTikaServerError(description);
-              }
-              return DOCUMENTSTATUS_REJECTED;
-            }
-
-            // Content
-            httpPut = new HttpPut(contentURI);
-            if (!mime.isEmpty()) {
-              httpPut.addHeader("Content-Type", mime);
-            }
-            httpPut.addHeader("Accept", "text/plain");
-            entity = new InputStreamEntity(ds.getInputStream());
-            httpPut.setEntity(entity);
-            try {
-              //System.out.println("About to do a content PUT");
-              response = this.httpClient.execute(tikaHost, httpPut);
-              //System.out.println("... content PUT succeeded");
-            } catch (IOException e) {
-              // Retry 3 times, 10000 ms between retries, and abort if doesn't work
-              final long currentTime = System.currentTimeMillis();
-              throw new ServiceInterruption("Tika down, retrying: "+e.getMessage(),e,currentTime + 10000L,
-                -1L,3,true);
-            }
-
-            responseCode = response.getStatusLine().getStatusCode();
-            if (response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 204) {
-              tikaServerIs = response.getEntity().getContent();
-              try {
-                responseDs = new FileDestinationStorage();
-                final OutputStream os2 = responseDs.getOutputStream();
-                try {
-                  IOUtils.copyLarge(tikaServerIs, os2, 0L, sp.writeLimit);
-                } finally {
-                  os2.close();
-                }
-                length = new Long(responseDs.getBinaryLength());
-              } finally {
-                tikaServerIs.close();
-              }
-            } else {
-              activities.noDocument();
-              if (responseCode == 422) {
-                resultCode = "TIKASERVERREJECTS";
-                description = "Tika Server rejected document with the following reason: "
-                    + response.getStatusLine().getReasonPhrase();
-                return handleTikaServerRejects(description);
-              } else {
-                resultCode = "TIKASERVERERROR";
-                description = "Tika Server failed to parse document with the following error: "
-                    + response.getStatusLine().getReasonPhrase();
-                return handleTikaServerError(description);
-              }
-            }
-
-          } catch (IOException | ParseException e) {
-            resultCode = "TIKASERVERRESPONSEISSUE";
-            description = e.getMessage();
-            int rval;
-            if (e instanceof IOException) {
-              rval = handleTikaServerException((IOException) e);
-            } else {
-              rval = handleTikaServerException((ParseException) e);
-            }
-            if (rval == DOCUMENTSTATUS_REJECTED) {
-              activities.noDocument();
-            }
-            return rval;
-          }
-
-          if (!activities.checkLengthIndexable(responseDs.getBinaryLength())) {
-            activities.noDocument();
-            resultCode = activities.EXCLUDED_LENGTH;
-            description = "Downstream pipeline rejected document with length " + ds.getBinaryLength();
-            return DOCUMENTSTATUS_REJECTED;
-          }
-
-        } finally {
-          // Log the extraction processing
-          activities.recordActivity(new Long(startTime), ACTIVITY_EXTRACT, length, documentURI, resultCode, description);
-        }
-
-        // Parsing complete!
-        // Create a copy of Repository Document
-        final RepositoryDocument docCopy = document.duplicate();
-
-        // Get new stream length
-        final long newBinaryLength = responseDs.getBinaryLength();
-        // Open new input stream
-        final InputStream is = responseDs.getInputStream();
-
-        try {
-          docCopy.setBinary(is, newBinaryLength);
-
-          // Set up all metadata from Tika. We may want to run this through a
-          // mapper eventually...
-          String[] metaNames = metadata.names();
-          for (String mName : metaNames) {
-            String value = metadata.get(mName);
-            if (sp.lowerNames()) {
-              StringBuilder sb = new StringBuilder();
-              for (int i = 0; i < mName.length(); i++) {
-                char ch = mName.charAt(i);
-                if (!Character.isLetterOrDigit(ch))
-                  ch = '_';
-                else
-                  ch = Character.toLowerCase(ch);
-                sb.append(ch);
-              }
-              mName = sb.toString();
-            }
-            String target = sp.getMapping(mName);
-            if (target != null) {
-              docCopy.addField(target, value);
-            } else {
-              if (sp.keepAllMetadata()) {
-                docCopy.addField(mName, value);
-              }
-            }
-          }
-
-          // Send new document downstream
-          return activities.sendDocument(documentURI, docCopy);
-        } finally {
-          is.close();
-        }
-      } finally {
-        if (responseDs != null) {
-          responseDs.close();
-        }
-      }
-    } finally {
-      ds.close();
-    }
-
-  }
-
-  /**
-   * Obtain the name of the form check javascript method to call.
-   * 
-   * @param connectionSequenceNumber
-   *          is the unique number of this connection within the job.
-   * @return the name of the form check javascript method.
-   */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber) {
-    return "s" + connectionSequenceNumber + "_checkSpecification";
-  }
-
-  /**
-   * Obtain the name of the form presave check javascript method to call.
-   * 
-   * @param connectionSequenceNumber
-   *          is the unique number of this connection within the job.
-   * @return the name of the form presave check javascript method.
-   */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber) {
-    return "s" + connectionSequenceNumber + "_checkSpecificationForSave";
-  }
-
-  /**
-   * Output the specification header section. This method is called in the head
-   * section of a job page which has selected a pipeline connection of the
-   * current type. Its purpose is to add the required tabs to the list, and to
-   * output any javascript methods that might be needed by the job editing HTML.
-   * 
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param locale
-   *          is the preferred local of the output.
-   * @param os
-   *          is the current pipeline specification for this connection.
-   * @param connectionSequenceNumber
-   *          is the unique number of this connection within the job.
-   * @param tabsArray
-   *          is an array of tab names. Add to this array any tab names that are
-   *          specific to the connector.
-   */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os, int connectionSequenceNumber,
-      List<String> tabsArray) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    tabsArray.add(Messages.getString(locale, "TikaExtractor.FieldMappingTabName"));
-
-    // Fill in the specification header map, using data from all tabs.
-    fillInFieldMappingSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPECIFICATION_JS, paramMap);
-  }
-
-  /**
-   * Output the specification body section. This method is called in the body
-   * section of a job page which has selected a pipeline connection of the
-   * current type. Its purpose is to present the required form elements for
-   * editing. The coder can presume that the HTML that is output from this
-   * configuration will be within appropriate <html>, <body>, and <form> tags.
-   * The name of the form is "editjob".
-   * 
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param locale
-   *          is the preferred local of the output.
-   * @param os
-   *          is the current pipeline specification for this job.
-   * @param connectionSequenceNumber
-   *          is the unique number of this connection within the job.
-   * @param actualSequenceNumber
-   *          is the connection within the job that has currently been selected.
-   * @param tabName
-   *          is the current tab name.
-   */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os, int connectionSequenceNumber,
-      int actualSequenceNumber, String tabName) throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-
-    // Set the tab name
-    paramMap.put("TABNAME", tabName);
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-    paramMap.put("SELECTEDNUM", Integer.toString(actualSequenceNumber));
-
-    // Fill in the field mapping tab data
-    fillInFieldMappingSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out, locale, EDIT_SPECIFICATION_FIELDMAPPING_HTML, paramMap);
-  }
-
-  /**
-   * Process a specification post. This method is called at the start of job's
-   * edit or view page, whenever there is a possibility that form data for a
-   * connection has been posted. Its purpose is to gather form information and
-   * modify the transformation specification accordingly. The name of the posted
-   * form is "editjob".
-   * 
-   * @param variableContext
-   *          contains the post data, including binary file-upload information.
-   * @param locale
-   *          is the preferred local of the output.
-   * @param os
-   *          is the current pipeline specification for this job.
-   * @param connectionSequenceNumber
-   *          is the unique number of this connection within the job.
-   * @return null if all is well, or a string error message if there is an error
-   *         that should prevent saving of the job (and cause a redirection to
-   *         an error page).
-   */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-      int connectionSequenceNumber) throws ManifoldCFException {
-    String seqPrefix = "s" + connectionSequenceNumber + "_";
-
-    String x;
-
-    x = variableContext.getParameter(seqPrefix + "fieldmapping_count");
-    if (x != null && x.length() > 0) {
-      // About to gather the fieldmapping nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < os.getChildCount()) {
-        SpecificationNode node = os.getChild(i);
-        if (node.getType().equals(TikaConfig.NODE_FIELDMAP) || node.getType().equals(TikaConfig.NODE_KEEPMETADATA)
-            || node.getType().equals(TikaConfig.NODE_LOWERNAMES) || node.getType().equals(TikaConfig.NODE_WRITELIMIT))
-          os.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count) {
-        String prefix = seqPrefix + "fieldmapping_";
-        String suffix = "_" + Integer.toString(i);
-        String op = variableContext.getParameter(prefix + "op" + suffix);
-        if (op == null || !op.equals("Delete")) {
-          // Gather the fieldmap etc.
-          String source = variableContext.getParameter(prefix + "source" + suffix);
-          String target = variableContext.getParameter(prefix + "target" + suffix);
-          if (target == null)
-            target = "";
-          SpecificationNode node = new SpecificationNode(TikaConfig.NODE_FIELDMAP);
-          node.setAttribute(TikaConfig.ATTRIBUTE_SOURCE, source);
-          node.setAttribute(TikaConfig.ATTRIBUTE_TARGET, target);
-          os.addChild(os.getChildCount(), node);
-        }
-        i++;
-      }
-
-      String addop = variableContext.getParameter(seqPrefix + "fieldmapping_op");
-      if (addop != null && addop.equals("Add")) {
-        String source = variableContext.getParameter(seqPrefix + "fieldmapping_source");
-        String target = variableContext.getParameter(seqPrefix + "fieldmapping_target");
-        if (target == null)
-          target = "";
-        SpecificationNode node = new SpecificationNode(TikaConfig.NODE_FIELDMAP);
-        node.setAttribute(TikaConfig.ATTRIBUTE_SOURCE, source);
-        node.setAttribute(TikaConfig.ATTRIBUTE_TARGET, target);
-        os.addChild(os.getChildCount(), node);
-      }
-
-      // Gather the keep all metadata parameter to be the last one
-      SpecificationNode node = new SpecificationNode(TikaConfig.NODE_KEEPMETADATA);
-      String keepAll = variableContext.getParameter(seqPrefix + "keepallmetadata");
-      if (keepAll != null) {
-        node.setAttribute(TikaConfig.ATTRIBUTE_VALUE, keepAll);
-      } else {
-        node.setAttribute(TikaConfig.ATTRIBUTE_VALUE, "false");
-      }
-      // Add the new keepallmetadata config parameter
-      os.addChild(os.getChildCount(), node);
-
-      SpecificationNode node2 = new SpecificationNode(TikaConfig.NODE_LOWERNAMES);
-      String lower = variableContext.getParameter(seqPrefix + "lowernames");
-      if (lower != null) {
-        node2.setAttribute(TikaConfig.ATTRIBUTE_VALUE, lower);
-      } else {
-        node2.setAttribute(TikaConfig.ATTRIBUTE_VALUE, "false");
-      }
-      os.addChild(os.getChildCount(), node2);
-
-      SpecificationNode node3 = new SpecificationNode(TikaConfig.NODE_WRITELIMIT);
-      String writeLimit = variableContext.getParameter(seqPrefix + "writelimit");
-      if (writeLimit != null) {
-        node3.setAttribute(TikaConfig.ATTRIBUTE_VALUE, writeLimit);
-      } else {
-        node3.setAttribute(TikaConfig.ATTRIBUTE_VALUE, "");
-      }
-      os.addChild(os.getChildCount(), node3);
-    }
-
-    return null;
-  }
-
-  /**
-   * View specification. This method is called in the body section of a job's
-   * view page. Its purpose is to present the pipeline specification information
-   * to the user. The coder can presume that the HTML that is output from this
-   * configuration will be within appropriate <html> and <body> tags.
-   * 
-   * @param out
-   *          is the output to which any HTML should be sent.
-   * @param locale
-   *          is the preferred local of the output.
-   * @param connectionSequenceNumber
-   *          is the unique number of this connection within the job.
-   * @param os
-   *          is the current pipeline specification for this job.
-   */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os, int connectionSequenceNumber)
-      throws ManifoldCFException, IOException {
-    Map<String, Object> paramMap = new HashMap<String, Object>();
-    paramMap.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    // Fill in the map with data from all tabs
-    fillInFieldMappingSpecificationMap(paramMap, os);
-
-    Messages.outputResourceWithVelocity(out, locale, VIEW_SPECIFICATION_HTML, paramMap);
-
-  }
-
-  protected static void fillInFieldMappingSpecificationMap(Map<String, Object> paramMap, Specification os) {
-    // Prep for field mappings
-    List<Map<String, String>> fieldMappings = new ArrayList<Map<String, String>>();
-    String keepAllMetadataValue = "true";
-    String lowernamesValue = "false";
-    String writeLimitValue = "";
-    for (int i = 0; i < os.getChildCount(); i++) {
-      SpecificationNode sn = os.getChild(i);
-      if (sn.getType().equals(TikaConfig.NODE_FIELDMAP)) {
-        String source = sn.getAttributeValue(TikaConfig.ATTRIBUTE_SOURCE);
-        String target = sn.getAttributeValue(TikaConfig.ATTRIBUTE_TARGET);
-        String targetDisplay;
-        if (target == null) {
-          target = "";
-          targetDisplay = "(remove)";
-        } else
-          targetDisplay = target;
-        Map<String, String> fieldMapping = new HashMap<String, String>();
-        fieldMapping.put("SOURCE", source);
-        fieldMapping.put("TARGET", target);
-        fieldMapping.put("TARGETDISPLAY", targetDisplay);
-        fieldMappings.add(fieldMapping);
-      } else if (sn.getType().equals(TikaConfig.NODE_KEEPMETADATA)) {
-        keepAllMetadataValue = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      } else if (sn.getType().equals(TikaConfig.NODE_LOWERNAMES)) {
-        lowernamesValue = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      } else if (sn.getType().equals(TikaConfig.NODE_WRITELIMIT)) {
-        writeLimitValue = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-      }
-    }
-    paramMap.put("FIELDMAPPINGS", fieldMappings);
-    paramMap.put("KEEPALLMETADATA", keepAllMetadataValue);
-    paramMap.put("LOWERNAMES", lowernamesValue);
-    paramMap.put("WRITELIMIT", writeLimitValue);
-  }
-
-  protected static int handleTikaServerRejects(String reason)
-      throws IOException, ManifoldCFException, ServiceInterruption {
-    // MHL - what does Tika throw if it gets an IOException reading the stream??
-    Logging.ingest.warn("Tika Server: Tika Server rejects: " + reason);
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  protected static int handleTikaServerError(String description)
-      throws IOException, ManifoldCFException, ServiceInterruption {
-    // MHL - what does Tika throw if it gets an IOException reading the stream??
-    Logging.ingest.warn("Tika Server: Tika Server error: " + description);
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  protected static int handleTikaServerException(IOException e)
-      throws IOException, ManifoldCFException, ServiceInterruption {
-    // MHL - what does Tika throw if it gets an IOException reading the stream??
-    Logging.ingest.warn("Tika: Tika exception extracting: " + e.getMessage(), e);
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  protected static int handleTikaServerException(ParseException e)
-      throws IOException, ManifoldCFException, ServiceInterruption {
-    // MHL - what does Tika throw if it gets an IOException reading the stream??
-    Logging.ingest.warn("Tika: Tika exception extracting: " + e.getMessage(), e);
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  protected static int handleIOException(IOException e) throws ManifoldCFException {
-    // IOException reading from our local storage...
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException(e.getMessage(), e);
-  }
-
-  protected static interface DestinationStorage {
-    /**
-     * Get the output stream to write to. Caller should explicitly close this
-     * stream when done writing.
-     */
-    public OutputStream getOutputStream() throws ManifoldCFException;
-
-    /**
-     * Get new binary length.
-     */
-    public long getBinaryLength() throws ManifoldCFException;
-
-    /**
-     * Get the input stream to read from. Caller should explicitly close this
-     * stream when done reading.
-     */
-    public InputStream getInputStream() throws ManifoldCFException;
-
-    /**
-     * Close the object and clean up everything. This should be called when the
-     * data is no longer needed.
-     */
-    public void close() throws ManifoldCFException;
-  }
-
-  protected static class FileDestinationStorage implements DestinationStorage {
-    protected final File outputFile;
-    protected final OutputStream outputStream;
-
-    public FileDestinationStorage() throws ManifoldCFException {
-      File outputFile;
-      OutputStream outputStream;
-      try {
-        outputFile = File.createTempFile("mcftika", "tmp");
-        outputStream = new FileOutputStream(outputFile);
-      } catch (IOException e) {
-        handleIOException(e);
-        outputFile = null;
-        outputStream = null;
-      }
-      this.outputFile = outputFile;
-      this.outputStream = outputStream;
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws ManifoldCFException {
-      return outputStream;
-    }
-
-    /**
-     * Get new binary length.
-     */
-    @Override
-    public long getBinaryLength() throws ManifoldCFException {
-      return outputFile.length();
-    }
-
-    /**
-     * Get the input stream to read from. Caller should explicitly close this
-     * stream when done reading.
-     */
-    @Override
-    public InputStream getInputStream() throws ManifoldCFException {
-      try {
-        return new FileInputStream(outputFile);
-      } catch (IOException e) {
-        handleIOException(e);
-        return null;
-      }
-    }
-
-    /**
-     * Close the object and clean up everything. This should be called when the
-     * data is no longer needed.
-     */
-    @Override
-    public void close() throws ManifoldCFException {
-      outputFile.delete();
-    }
-
-  }
-
-  protected static class MemoryDestinationStorage implements DestinationStorage {
-    protected final ByteArrayOutputStream outputStream;
-
-    public MemoryDestinationStorage(int sizeHint) {
-      outputStream = new ByteArrayOutputStream(sizeHint);
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws ManifoldCFException {
-      return outputStream;
-    }
-
-    /**
-     * Get new binary length.
-     */
-    @Override
-    public long getBinaryLength() throws ManifoldCFException {
-      return outputStream.size();
-    }
-
-    /**
-     * Get the input stream to read from. Caller should explicitly close this
-     * stream when done reading.
-     */
-    @Override
-    public InputStream getInputStream() throws ManifoldCFException {
-      return new ByteArrayInputStream(outputStream.toByteArray());
-    }
-
-    /**
-     * Close the object and clean up everything. This should be called when the
-     * data is no longer needed.
-     */
-    public void close() throws ManifoldCFException {
-    }
-
-  }
-
-  protected static class SpecPacker {
-
-    private final Map<String, String> sourceTargets = new HashMap<String, String>();
-    private final boolean keepAllMetadata;
-    private final boolean lowerNames;
-    private final int writeLimit;
-
-    public SpecPacker(Specification os) {
-      boolean keepAllMetadata = true;
-      boolean lowerNames = false;
-      int writeLimit = TikaConfig.WRITELIMIT_DEFAULT;
-      boolean ignoreTikaException = true;
-      for (int i = 0; i < os.getChildCount(); i++) {
-        SpecificationNode sn = os.getChild(i);
-
-        if (sn.getType().equals(TikaConfig.NODE_KEEPMETADATA)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          keepAllMetadata = Boolean.parseBoolean(value);
-        } else if (sn.getType().equals(TikaConfig.NODE_LOWERNAMES)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          lowerNames = Boolean.parseBoolean(value);
-        } else if (sn.getType().equals(TikaConfig.NODE_WRITELIMIT)) {
-          String value = sn.getAttributeValue(TikaConfig.ATTRIBUTE_VALUE);
-          if (value.length() == 0) {
-            writeLimit = TikaConfig.WRITELIMIT_DEFAULT;
-          } else {
-            writeLimit = Integer.parseInt(value);
-          }
-        } else if (sn.getType().equals(TikaConfig.NODE_FIELDMAP)) {
-          String source = sn.getAttributeValue(TikaConfig.ATTRIBUTE_SOURCE);
-          String target = sn.getAttributeValue(TikaConfig.ATTRIBUTE_TARGET);
-
-          if (target == null) {
-            target = "";
-          }
-          sourceTargets.put(source, target);
-        }
-      }
-      this.keepAllMetadata = keepAllMetadata;
-      this.lowerNames = lowerNames;
-      this.writeLimit = writeLimit;
-    }
-
-    public String toPackedString() {
-      StringBuilder sb = new StringBuilder();
-      int i;
-
-      // Mappings
-      final String[] sortArray = new String[sourceTargets.size()];
-      i = 0;
-      for (String source : sourceTargets.keySet()) {
-        sortArray[i++] = source;
-      }
-      java.util.Arrays.sort(sortArray);
-
-      List<String> packedMappings = new ArrayList<String>();
-      String[] fixedList = new String[2];
-      for (String source : sortArray) {
-        String target = sourceTargets.get(source);
-        StringBuilder localBuffer = new StringBuilder();
-        fixedList[0] = source;
-        fixedList[1] = target;
-        packFixedList(localBuffer, fixedList, ':');
-        packedMappings.add(localBuffer.toString());
-      }
-      packList(sb, packedMappings, '+');
-
-      // Keep all metadata
-      if (keepAllMetadata)
-        sb.append('+');
-      else
-        sb.append('-');
-      if (lowerNames)
-        sb.append('+');
-      else
-        sb.append('-');
-
-      if (writeLimit != TikaConfig.WRITELIMIT_DEFAULT) {
-        sb.append('+');
-        sb.append(writeLimit);
-      }
-
-      return sb.toString();
-    }
-
-    public String getMapping(String source) {
-      return sourceTargets.get(source);
-    }
-
-    public boolean keepAllMetadata() {
-      return keepAllMetadata;
-    }
-
-    public boolean lowerNames() {
-      return lowerNames;
-    }
-
-    public int writeLimit() {
-      return writeLimit;
-    }
-
-  }
-
-}
diff --git a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_en_US.properties b/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_en_US.properties
deleted file mode 100644
index d8abce8..0000000
--- a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_en_US.properties
+++ /dev/null
@@ -1,34 +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.
-
-TikaExtractor.TikaHostname=Tika hostname:
-TikaExtractor.TikaPort=Tika port:
-TikaExtractor.TikaServerTabName=Tika server
-TikaExtractor.FieldMappingTabName=Field mapping
-TikaExtractor.FieldMappings=Field mappings:
-TikaExtractor.MetadataFieldName=Metadata field name
-TikaExtractor.FinalFieldName=Final field name
-TikaExtractor.NoFieldMappingSpecified=No field mapping specified
-TikaExtractor.KeepAllMetadata=Keep all metadata:
-TikaExtractor.LowerNames=Lower names:
-TikaExtractor.WriteLimit=Write limit:
-TikaExtractor.Add=Add
-TikaExtractor.AddFieldMapping=Add field mapping
-TikaExtractor.Delete=Delete
-TikaExtractor.DeleteFieldMapping=Delete field mapping
-TikaExtractor.NoFieldNameSpecified=Please specify a field name
-TikaExtractor.PleaseSupplyAValidNumber=Please supply a valid number
-TikaExtractor.PleaseDontSpecifyAnyServerPathInformation=Please don't include server path information in host name
-TikaExtractor.HostNameCannotBeNull=Host name cannot be null
diff --git a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_es_ES.properties b/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_es_ES.properties
deleted file mode 100644
index 80034d7..0000000
--- a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_es_ES.properties
+++ /dev/null
@@ -1,34 +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.
-
-TikaExtractor.FieldMappingTabName=Trazar un mapa de campaña
-TikaExtractor.FieldMappings=asignaciones de campo:
-TikaExtractor.MetadataFieldName=Metadatos nombre del campo
-TikaExtractor.FinalFieldName=Nombre de campo final
-TikaExtractor.NoFieldMappingSpecified=Ninguna asignación campo especificado
-TikaExtractor.KeepAllMetadata=Mantenga todos los metadatos:
-TikaExtractor.LowerNames=nombres Menores:
-TikaExtractor.WriteLimit=límite Comentario:
-TikaExtractor.Add=Añadir
-TikaExtractor.AddFieldMapping=Añadir asignación de campos
-TikaExtractor.Delete=Borrar
-TikaExtractor.DeleteFieldMapping=Eliminar asignación de campos
-TikaExtractor.NoFieldNameSpecified=Por favor, especifique un nombre de campo
-TikaExtractor.TikaHostname=Tika hostname:
-TikaExtractor.TikaPort=Tika port:
-TikaExtractor.TikaServerTabName=Tika server
-TikaExtractor.PleaseSupplyAValidNumber=Please supply a valid number
-TikaExtractor.PleaseDontSpecifyAnyServerPathInformation=Please don't include server path information in host name
-TikaExtractor.HostNameCannotBeNull=Host name cannot be null
diff --git a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_ja_JP.properties b/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_ja_JP.properties
deleted file mode 100644
index 28828cd..0000000
--- a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_ja_JP.properties
+++ /dev/null
@@ -1,34 +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.
-
-TikaExtractor.TikaHostname=Tika hostname:
-TikaExtractor.TikaPort=Tika port:
-TikaExtractor.TikaServerTabName=Tika server
-TikaExtractor.FieldMappingTabName=フィールドマッピング
-TikaExtractor.FieldMappings=フィールドマッピング:
-TikaExtractor.MetadataFieldName=メタデータフィールド名
-TikaExtractor.FinalFieldName=最後のフィールド名
-TikaExtractor.NoFieldMappingSpecified=フィールドマッピングを指定してください
-TikaExtractor.KeepAllMetadata=全メタデータを保存:
-TikaExtractor.LowerNames=小文字名:
-TikaExtractor.WriteLimit=最大文字長:
-TikaExtractor.Add=追加
-TikaExtractor.AddFieldMapping=フィールドマッピングを追加
-TikaExtractor.Delete=削除
-TikaExtractor.DeleteFieldMapping=フィールドマッピングを削除
-TikaExtractor.NoFieldNameSpecified=フィールド名を指定してください
-TikaExtractor.PleaseSupplyAValidNumber=Please supply a valid number
-TikaExtractor.PleaseDontSpecifyAnyServerPathInformation=Please don't include server path information in host name
-TikaExtractor.HostNameCannotBeNull=Host name cannot be null
diff --git a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_zh_CN.properties b/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_zh_CN.properties
deleted file mode 100644
index 77dfa70..0000000
--- a/connectors/tikaservice/connector/src/main/native2ascii/org/apache/manifoldcf/agents/transformation/tikaservice/common_zh_CN.properties
+++ /dev/null
@@ -1,34 +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.
-
-TikaExtractor.TikaHostname=Tika hostname:
-TikaExtractor.TikaPort=Tika port:
-TikaExtractor.TikaServerTabName=Tika server
-TikaExtractor.FieldMappingTabName=字段映射
-TikaExtractor.FieldMappings=字段映射:
-TikaExtractor.MetadataFieldName=元数据字段名
-TikaExtractor.FinalFieldName=最终字段名
-TikaExtractor.NoFieldMappingSpecified=未指定字段映射
-TikaExtractor.KeepAllMetadata=保存所有元数据:
-TikaExtractor.LowerNames=小写:
-TikaExtractor.WriteLimit=最大字符长度:
-TikaExtractor.Add=添加
-TikaExtractor.AddFieldMapping=添加字段映射
-TikaExtractor.Delete=删除
-TikaExtractor.DeleteFieldMapping=删除字段映射
-TikaExtractor.NoFieldNameSpecified=未指定字段名
-TikaExtractor.PleaseSupplyAValidNumber=Please supply a valid number
-TikaExtractor.PleaseDontSpecifyAnyServerPathInformation=Please don't include server path information in host name
-TikaExtractor.HostNameCannotBeNull=Host name cannot be null
diff --git a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editConfiguration.js b/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editConfiguration.js
deleted file mode 100644
index 61fe351..0000000
--- a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editConfiguration.js
+++ /dev/null
@@ -1,45 +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.
--->
-
-<script type="text/javascript">
-<!--
-
-function checkConfig()
-{
-  if (editconnection.tikaPort.value != "" && !isInteger(editconnection.tikaPort.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('TikaExtractor.PleaseSupplyAValidNumber'))");
-    editconnection.tikaPort.focus();
-    return false;
-  }
-  if (editconnection.tikaHostname.value.indexOf("/") >= 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('TikaExtractor.PleaseDontSpecifyAnyServerPathInformation'))");
-    editconnection.tikaHostname.focus();
-    return false;
-  }
-  if (editconnection.tikaHostname.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('TikaExtractor.HostNameCannotBeNull'))");
-    editconnection.tikaHostname.focus();
-    return false;
-  }
-  return true;
-}
-
-//-->
-</script>
diff --git a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editConfiguration_Server.html b/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editConfiguration_Server.html
deleted file mode 100644
index fa928c3..0000000
--- a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editConfiguration_Server.html
+++ /dev/null
@@ -1,41 +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.
--->
-
-#if($TabName == $ResourceBundle.getString('TikaExtractor.TikaServerTabName'))
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.TikaHostname'))</nobr></td>
-    <td class="value"><input name="tikaHostname" type="text"
-      value="$Encoder.attributeEscape($TIKAHOSTNAME)" size="16" />
-    </td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.TikaPort'))</nobr></td>
-    <td class="value"><input name="tikaPort" type="text"
-      value="$Encoder.attributeEscape($TIKAPORT)" size="5" />
-    </td>
-  </tr>
-</table>
-
-#else
-
-<input type="hidden" name="tikaHostname" value="$Encoder.attributeEscape($TIKAHOSTNAME)"/>
-<input type="hidden" name="tikaPort" value="$Encoder.attributeEscape($TIKAPORT)"/>
-
-#end
\ No newline at end of file
diff --git a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editSpecification.js b/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editSpecification.js
deleted file mode 100644
index aa69293..0000000
--- a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editSpecification.js
+++ /dev/null
@@ -1,46 +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.
--->
-
-<script type="text/javascript">
-<!--
-function s${SEQNUM}_addFieldMapping()
-{
-  if (editjob.s${SEQNUM}_fieldmapping_source.value == "")
-  {
-    alert("$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoFieldNameSpecified'))");
-    editjob.s${SEQNUM}_fieldmapping_source.focus();
-    return;
-  }
-  editjob.s${SEQNUM}_fieldmapping_op.value="Add";
-  postFormSetAnchor("s${SEQNUM}_fieldmapping");
-}
-
-function s${SEQNUM}_deleteFieldMapping(i)
-{
-  // Set the operation
-  eval("editjob.s${SEQNUM}_fieldmapping_op_"+i+".value=\"Delete\"");
-  // Submit
-  if (editjob.s${SEQNUM}_fieldmapping_count.value==i)
-    postFormSetAnchor("s${SEQNUM}_fieldmapping");
-  else
-    postFormSetAnchor("s${SEQNUM}_fieldmapping_"+i)
-  // Undo, so we won't get two deletes next time
-  eval("editjob.s${SEQNUM}_fieldmapping_op_"+i+".value=\"Continue\"");
-}
-
-//-->
-</script>
diff --git a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editSpecification_FieldMapping.html b/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editSpecification_FieldMapping.html
deleted file mode 100644
index 8050aa7..0000000
--- a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/editSpecification_FieldMapping.html
+++ /dev/null
@@ -1,127 +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.
--->
-
-#if($TABNAME == $ResourceBundle.getString('TikaExtractor.FieldMappingTabName') && ${SEQNUM} == ${SELECTEDNUM})
-
-<table class="displaytable">
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FieldMappings'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.MetadataFieldName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FinalFieldName'))</nobr></td>
-        </tr>
-
-  #set($fieldcounter = 0)
-  #foreach($fieldmapping in $FIELDMAPPINGS)
-    #set($fieldcounterdisplay = $fieldcounter + 1)
-    #if(($fieldcounter % 2) == 0)
-        <tr class="evenformrow">
-    #else
-        <tr class="oddformrow">
-    #end
-          <td class="formcolumncell">
-            <a name="s${SEQNUM}_fieldmapping_$fieldcounter">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.Delete'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.DeleteFieldMapping'))$fieldcounterdisplay" onclick='javascript:s${SEQNUM}_deleteFieldMapping("$fieldcounter");'/>
-              <input type="hidden" name="s${SEQNUM}_fieldmapping_op_$fieldcounter" value="Continue"/>
-              <input type="hidden" name="s${SEQNUM}_fieldmapping_source_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('SOURCE'))"/>
-              <input type="hidden" name="s${SEQNUM}_fieldmapping_target_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('TARGET'))"/>
-            </a>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('SOURCE'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('TARGETDISPLAY'))</nobr>
-          </td>
-        </tr>
-    #set($fieldcounter = $fieldcounter + 1)
-  #end
-  
-  #if($fieldcounter == 0)
-        <tr class="formrow"><td class="formmessage" colspan="3">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoFieldMappingSpecified'))</td></tr>
-  #end
-      
-        <tr class="formrow"><td class="formseparator" colspan="3"><hr/></td></tr>
-        <tr class="formrow">
-          <td class="formcolumncell">
-            <a name="fieldmapping">
-              <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.Add'))" alt="$Encoder.attributeEscape($ResourceBundle.getString('TikaExtractor.AddFieldMapping'))" onclick="javascript:s${SEQNUM}_addFieldMapping();"/>
-            </a>
-            <input type="hidden" name="s${SEQNUM}_fieldmapping_count" value="$fieldcounter"/>
-            <input type="hidden" name="s${SEQNUM}_fieldmapping_op" value="Continue"/>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="15" name="s${SEQNUM}_fieldmapping_source" value=""/></nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr><input type="text" size="15" name="s${SEQNUM}_fieldmapping_target" value=""/></nobr>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.KeepAllMetadata'))</nobr></td>
-    <td class="value">
-  #if($KEEPALLMETADATA == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_keepallmetadata" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_keepallmetadata" value="true"/>
-  #end
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.LowerNames'))</nobr></td>
-    <td class="value">
-  #if($LOWERNAMES == 'true')
-       <input type="checkbox" checked="true" name="s${SEQNUM}_lowernames" value="true"/>
-  #else
-       <input type="checkbox" name="s${SEQNUM}_lowernames" value="true"/>
-  #end
-    </td>
-  </tr>
-
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.WriteLimit'))</nobr></td>
-    <td class="value"><input name="s${SEQNUM}_writelimit" type="text"
-      value="$Encoder.attributeEscape($WRITELIMIT)" size="16" />
-    </td>
-  </tr>
-</table>
-      
-#else
-
-  #set($fieldcounter = 0)
-  #foreach($fieldmapping in $FIELDMAPPINGS)
-<input type="hidden" name="s${SEQNUM}_fieldmapping_source_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('SOURCE'))"/>
-<input type="hidden" name="s${SEQNUM}_fieldmapping_target_$fieldcounter" value="$Encoder.attributeEscape($fieldmapping.get('TARGET'))"/>
-    #set($fieldcounter = $fieldcounter + 1)
-  #end
-<input type="hidden" name="s${SEQNUM}_fieldmapping_count" value="$fieldcounter"/>
-<input type="hidden" name="s${SEQNUM}_keepallmetadata" value="$Encoder.bodyEscape($KEEPALLMETADATA)"/>
-<input type="hidden" name="s${SEQNUM}_lowernames" value="$Encoder.bodyEscape($LOWERNAMES)"/>
-<input type="hidden" name="s${SEQNUM}_writelimit" value="$Encoder.attributeEscape($WRITELIMIT)" />
-
-#end
\ No newline at end of file
diff --git a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/viewConfiguration.html b/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/viewConfiguration.html
deleted file mode 100644
index 98a5024..0000000
--- a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/viewConfiguration.html
+++ /dev/null
@@ -1,27 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.TikaHostname'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($TIKAHOSTNAME)</nobr></td>
-  </tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.TikaPort'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($TIKAPORT)</nobr></td>
-  </tr>
-</table>
diff --git a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/viewSpecification.html b/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/viewSpecification.html
deleted file mode 100644
index 3790806..0000000
--- a/connectors/tikaservice/connector/src/main/resources/org/apache/manifoldcf/agents/transformation/tikaservice/viewSpecification.html
+++ /dev/null
@@ -1,65 +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.
--->
-
-<table class="displaytable">
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FieldMappings'))</nobr></td>
-    <td class="boxcell">
-      <table class="formtable">
-        <tr class="formheaderrow">
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.MetadataFieldName'))</nobr></td>
-          <td class="formcolumnheader"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.FinalFieldName'))</nobr></td>
-        </tr>
-#set($fieldcounter = 0)
-#foreach($fieldmapping in $FIELDMAPPINGS)
-  #if(($fieldcounter % 2) == 0)
-        <tr class="evenformrow">
-  #else
-        <tr class="oddformrow">
-  #end
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('SOURCE'))</nobr>
-          </td>
-          <td class="formcolumncell">
-            <nobr>$Encoder.bodyEscape($fieldmapping.get('TARGETDISPLAY'))</nobr>
-          </td>
-        </tr>
-  #set($fieldcounter = $fieldcounter + 1)
-#end
-#if($fieldcounter == 0)
-        <tr class="formrow"><td class="formmessage" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.NoFieldMappingSpecified'))</td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.KeepAllMetadata'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($KEEPALLMETADATA)</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.LowerNames'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($LOWERNAMES)</nobr></td>
-  </tr>
-  <tr><td class="separator" colspan="2"><hr/></td></tr>
-  <tr>
-    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('TikaExtractor.WriteLimit'))</nobr></td>
-    <td class="value"><nobr>$Encoder.bodyEscape($WRITELIMIT)</nobr></td>
-  </tr>
-
-</table>
diff --git a/connectors/tikaservice/pom.xml b/connectors/tikaservice/pom.xml
deleted file mode 100644
index 42ff66f..0000000
--- a/connectors/tikaservice/pom.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-tika-service-connector</artifactId>
-  <name>ManifoldCF - Connectors - Tika Service Transformer</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tika</groupId>
-        <artifactId>tika-core</artifactId>
-        <version>${tika.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tika</groupId>
-        <artifactId>tika-parsers</artifactId>
-        <version>${tika.version}</version>
-    </dependency>
-    <dependency>
-        <groupId>de.l3s.boilerpipe</groupId>
-        <artifactId>boilerpipe</artifactId>
-        <version>${boilerpipe.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/webcrawler/.gitignore b/connectors/webcrawler/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/webcrawler/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/webcrawler/build.xml b/connectors/webcrawler/build.xml
deleted file mode 100644
index fd6dcf3..0000000
--- a/connectors/webcrawler/build.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<project name="webcrawler" default="all">
-
-    <property environment="env"/>
-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
-        <isset property="env.MCFDISTPATH"/>
-    </condition>
-    <property name="abs-dist" location="../../dist"/>
-    <condition property="mcf-dist" value="${abs-dist}">
-        <not>
-            <isset property="env.MCFDISTPATH"/>
-        </not>
-    </condition>
-
-    <import file="${mcf-dist}/connector-build.xml"/>
-
-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
-        <antcall target="general-add-repository-connector">
-            <param name="connector-label" value="Web"/>
-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector"/>
-        </antcall>
-    </target>
-
-</project>
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/AbortChecker.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/AbortChecker.java
deleted file mode 100644
index 2a82980..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/AbortChecker.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-/** This class furnishes an abort signal whenever the job activity says it should.
-* It should never be invoked from a background thread, only from a ManifoldCF thread.
-*/
-public class AbortChecker implements IBreakCheck
-{
-  protected final IAbortActivity activities;
-  protected ServiceInterruption serviceInterruption = null;
-  protected ManifoldCFException mcfException = null;
-    
-  public AbortChecker(IAbortActivity activities)
-  {
-    this.activities = activities;
-  }
-    
-  @Override
-  public long abortCheck()
-    throws BreakException, InterruptedException
-  {
-    try
-    {
-      activities.checkJobStillActive();
-      return 1000L;
-    }
-    catch (ServiceInterruption e)
-    {
-      serviceInterruption = e;
-      throw new BreakException("Break requested: "+e.getMessage(),e);
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        throw new InterruptedException("Interrupted: "+e.getMessage());
-      mcfException = e;
-      throw new BreakException("Error during break check: "+e.getMessage(),e);
-    }
-  }
-    
-  public void rethrowExceptions()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (serviceInterruption != null)
-      throw serviceInterruption;
-    if (mcfException != null)
-      throw mcfException;
-  }
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/AuthenticationCredentials.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/AuthenticationCredentials.java
deleted file mode 100644
index 04f582a..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/AuthenticationCredentials.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id: AuthenticationCredentials.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-/** This interface describes immutable classes which represents authentication information for all kinds of authentication.
-*/
-public interface AuthenticationCredentials
-{
-  public static final String _rcsid = "@(#)$Id: AuthenticationCredentials.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Compare against another object */
-  public boolean equals(Object o);
-
-  /** Calculate a hash function */
-  public int hashCode();
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CookieManager.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CookieManager.java
deleted file mode 100644
index cc3e91b..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CookieManager.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/* $Id: CookieManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.ClientCookie;
-import org.apache.http.impl.cookie.BasicClientCookie2;
-
-/** This class manages the database table into which we write cookies.  The data resides in the database,
-* as well as in cache (up to a certain point).  The result is that there is a memory limited, database-backed repository
-* of cookies that we can draw on.
-* 
-* <br><br>
-* <b>cookiedata</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>sequencekey</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>ordinal</td><td>BIGINT</td><td></td></tr>
-* <tr><td>domainspecified</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>domain</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>name</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>value</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>pathspecified</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>path</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>versionspecified</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>version</td><td>BIGINT</td><td></td></tr>
-* <tr><td>comment</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>secure</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>expirationdate</td><td>BIGINT</td><td></td></tr>
-* <tr><td>discard</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>commenturl</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>portblank</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>portspecified</td><td>CHAR(1)</td><td></td></tr>
-* <tr><td>ports</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class CookieManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: CookieManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Robots cache class.  Only one needed.
-  protected static CookiesCacheClass cookiesCacheClass = new CookiesCacheClass();
-
-  // Database fields
-  protected final static String keyField = "sequencekey";
-  protected final static String ordinalField = "ordinal";
-  // The rest of these individual fields are here only because the &^*% httpclient Cookie class doesn't have a constructor that
-  // accepts the string form, so we're forced to keep all the cookie construction arguments individually.
-  protected final static String domainSpecifiedField = "domainspecified";
-  protected final static String domainField = "domain";
-  protected final static String nameField = "name";
-  protected final static String valueField = "value";
-  protected final static String pathSpecifiedField = "pathspecified";
-  protected final static String pathField = "path";
-  protected final static String versionSpecifiedField = "versionspecified";
-  protected final static String versionField = "version";
-  protected final static String commentField = "comment";
-  protected final static String secureField = "secure";
-  protected final static String expirationDateField = "expirationdate";
-  protected final static String discardField = "discard";
-  protected final static String commentURLField = "commenturl";
-  protected final static String portBlankField = "portblank";
-  protected final static String portSpecifiedField = "portspecified";
-  protected final static String portField = "ports";
-
-
-  // Cache manager.  This handle is set up during the constructor.
-  ICacheManager cacheManager;
-
-  /** Constructor.  Note that one cookiemanager handle is only useful within a specific thread context,
-  * so the calling connector object logic must recreate the handle whenever the thread context changes.
-  *@param tc is the thread context.
-  *@param database is the database handle.
-  */
-  public CookieManager(IThreadContext tc, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"cookiedata");
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the table.
-        HashMap map = new HashMap();
-        map.put(keyField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(ordinalField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        // The rest of the fields allow us to recreate Cookie objects from the database so we can hand them
-        // to httpclient.  (It would be better if we just kept the cookie data around, but that's not how httpclient works.)
-        map.put(domainSpecifiedField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(domainField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(nameField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(valueField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(pathSpecifiedField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(pathField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(versionSpecifiedField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(versionField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(commentField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(secureField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(expirationDateField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(discardField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(commentURLField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(portBlankField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(portSpecifiedField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(portField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-
-        // Create the appropriate indices
-        ArrayList list = new ArrayList();
-        list.add(keyField);
-        addTableIndex(false,list);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Read cookies currently in effect for a given session key.
-  *@param sessionKey is the session key.
-  *@return the login cookies object.
-  */
-  public LoginCookies readCookies(String sessionKey)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    CookiesDescription[] objectDescriptions = new CookiesDescription[1];
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getCookiesCacheKey(sessionKey));
-    objectDescriptions[0] = new CookiesDescription(sessionKey,new StringSet(ssb));
-
-    CookiesExecutor exec = new CookiesExecutor(this,objectDescriptions[0]);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-
-    // Expiration is in fact done by the web site; the cookies will be updated if necessary.
-    return exec.getResults();
-  }
-
-  /** Update cookes that are in effect for a given session key.
-  *@param sessionKey is the session key.
-  *@param cookies are the cookies to write into the database.
-  */
-  public void updateCookies(String sessionKey, LoginCookies cookies)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getCookiesCacheKey(sessionKey));
-    StringSet cacheKeys = new StringSet(ssb);
-    ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-    try
-    {
-      beginTransaction();
-      try
-      {
-        // Delete any old cookies, and create new ones
-        ArrayList list = new ArrayList();
-        list.add(sessionKey);
-        performDelete("WHERE "+keyField+"=?",list,null);
-
-        // Now, insert the new cookies
-        int i = 0;
-        while (i < cookies.getCookieCount())
-        {
-          Cookie c = cookies.getCookie(i);
-          HashMap map = new HashMap();
-          map.put(keyField,sessionKey);
-          map.put(ordinalField,new Long(i));
-          String domain = c.getDomain();
-          if (domain != null && domain.length() > 0)
-            map.put(domainField,domain);
-          map.put(domainSpecifiedField,booleanToString(domain != null && domain.length() > 0));
-          String name = c.getName();
-          if (name != null && name.length() > 0)
-            map.put(nameField,name);
-          String value = c.getValue();
-          if (value != null && value.length() > 0)
-            map.put(valueField,value);
-          String path = c.getPath();
-          if (path != null && path.length() > 0)
-            map.put(pathField,path);
-          map.put(pathSpecifiedField,booleanToString(path != null && path.length() > 0));
-          map.put(versionField,new Long(c.getVersion()));
-          // Make something up.  It may not be correct, but there's really no choice.
-          map.put(versionSpecifiedField,booleanToString(true));
-          String comment = c.getComment();
-          if (comment != null && comment.length() > 0)
-            map.put(commentField,comment);
-          map.put(secureField,booleanToString(c.isSecure()));
-          Date expirationDate = c.getExpiryDate();
-          if (expirationDate != null)
-            map.put(expirationDateField,new Long(expirationDate.getTime()));
-          //map.put(discardField,booleanToString(!c.isPersistent()));
-          map.put(discardField,booleanToString(false));
-          String commentURL = c.getCommentURL();
-          if (commentURL != null && commentURL.length() > 0)
-            map.put(commentURLField,commentURL);
-          int[] ports = c.getPorts();
-          if (ports != null && ports.length > 0)
-            map.put(portField,portsToString(ports));
-          map.put(portBlankField,booleanToString(ports == null || ports.length == 0));
-          map.put(portSpecifiedField,booleanToString(ports != null && ports.length > 0));
-          performInsert(map,null);
-          i++;
-        }
-
-        cacheManager.invalidateKeys(ch);
-      }
-      catch (ManifoldCFException e)
-      {
-        signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        signalRollback();
-        throw e;
-      }
-      finally
-      {
-        endTransaction();
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-
-  // Protected methods and classes
-
-  /** Construct a global key which represents an individual session.
-  *@param sessionKey is the session key.
-  *@return the cache key.
-  */
-  protected static String getCookiesCacheKey(String sessionKey)
-  {
-    return "COOKIES_"+sessionKey;
-  }
-
-  /** Read cookies from database, uncached.
-  *@param sessionKey is the session key.
-  *@return the login cookies object.
-  */
-  protected LoginCookies readCookiesUncached(String sessionKey)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(sessionKey);
-    IResultSet result = performQuery("SELECT * FROM "+getTableName()+" WHERE "+keyField+"=? ORDER BY "+ordinalField+" ASC",list,null,null);
-    DynamicCookieSet dcs = new DynamicCookieSet();
-    int i = 0;
-    while (i < result.getRowCount())
-    {
-      IResultRow row = result.getRow(i++);
-      String name = (String)row.getValue(nameField);
-      String value = (String)row.getValue(valueField);
-      BasicClientCookie2 c = new BasicClientCookie2(name,value);
-      String domain = (String)row.getValue(domainField);
-      if (domain != null && domain.length() > 0)
-        c.setDomain(domain);
-      //c.setDomainAttributeSpecified(stringToBoolean((String)row.getValue(domainSpecifiedField)));
-      String path = (String)row.getValue(pathField);
-      if (path != null && path.length() > 0)
-        c.setPath(path);
-      //c.setPathAttributeSpecified(stringToBoolean((String)row.getValue(pathSpecifiedField)));
-      Long version = (Long)row.getValue(versionField);
-      if (version != null)
-        c.setVersion((int)version.longValue());
-      //c.setVersionAttributeSpecified(stringToBoolean((String)row.getValue(versionSpecifiedField)));
-      String comment = (String)row.getValue(commentField);
-      if (comment != null)
-        c.setComment(comment);
-      c.setSecure(stringToBoolean((String)row.getValue(secureField)));
-      Long expirationDate = (Long)row.getValue(expirationDateField);
-      if (expirationDate != null)
-        c.setExpiryDate(new Date(expirationDate.longValue()));
-      c.setDiscard(stringToBoolean((String)row.getValue(discardField)));
-      String commentURL = (String)row.getValue(commentURLField);
-      if (commentURL != null && commentURL.length() > 0)
-        c.setCommentURL(commentURL);
-      String ports = (String)row.getValue(portField);
-      // Ports are comma-separated
-      if (ports != null && ports.length() > 0)
-        c.setPorts(stringToPorts(ports));
-      //c.setPortAttributeBlank(stringToBoolean((String)row.getValue(portBlankField)));
-      //c.setPortAttributeSpecified(stringToBoolean((String)row.getValue(portSpecifiedField)));
-
-      dcs.addCookie(c);
-    }
-    return dcs;
-  }
-
-  /** Convert a boolean string to a boolean.
-  */
-  protected static boolean stringToBoolean(String value)
-    throws ManifoldCFException
-  {
-    if (value.equals("T"))
-      return true;
-    else if (value.equals("F"))
-      return false;
-    else
-      throw new ManifoldCFException("Expected T or F but saw "+value);
-  }
-
-  /** Convert a boolean to a boolean string.
-  */
-  protected static String booleanToString(boolean value)
-  {
-    if (value)
-      return "T";
-    else
-      return "F";
-  }
-
-  /** Convert a string to a port array.
-  */
-  protected static int[] stringToPorts(String value)
-    throws ManifoldCFException
-  {
-    String[] ports = value.split(",");
-    int[] rval = new int[ports.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      try
-      {
-        rval[i] = Integer.parseInt(ports[i]);
-      }
-      catch (NumberFormatException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-      i++;
-    }
-    return rval;
-  }
-
-  /** Convert a port array to a string.
-  */
-  protected static String portsToString(int[] ports)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < ports.length)
-    {
-      if (i > 0)
-        sb.append(",");
-      sb.append(Integer.toString(ports[i]));
-      i++;
-    }
-    return sb.toString();
-  }
-
-  /** This is a set of cookies, built dynamically.
-  */
-  protected static class DynamicCookieSet implements LoginCookies
-  {
-    protected List<Cookie> cookies = new ArrayList<Cookie>();
-
-    public DynamicCookieSet()
-    {
-    }
-
-    public void addCookie(Cookie c)
-    {
-      cookies.add(c);
-    }
-
-    public int getCookieCount()
-    {
-      return cookies.size();
-    }
-
-    public Cookie getCookie(int index)
-    {
-      return cookies.get(index);
-    }
-  }
-
-  /** This is the object description for a session key object.
-  * This is the key that is used to look up cached data.
-  */
-  protected static class CookiesDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String sessionKey;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public CookiesDescription(String sessionKey, StringSet invKeys)
-    {
-      super("cookiescache");
-      this.sessionKey = sessionKey;
-      criticalSectionName = getClass().getName()+"-"+sessionKey;
-      cacheKeys = invKeys;
-    }
-
-    public String getSessionKey()
-    {
-      return sessionKey;
-    }
-
-    public int hashCode()
-    {
-      return sessionKey.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof CookiesDescription))
-        return false;
-      CookiesDescription d = (CookiesDescription)o;
-      return d.sessionKey.equals(sessionKey);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-    /** Get the object class for an object.  The object class is used to determine
-    * the group of objects treated in the same LRU manner.
-    * @return the newly created object's object class, or null if there is no
-    * such class, and LRU behavior is not desired.
-    */
-    public ICacheClass getObjectClass()
-    {
-      return cookiesCacheClass;
-    }
-  }
-
-  /** Cache class for robots.
-  * An instance of this class describes the cache class for cookie caching.  There's
-  * only ever a need for one, so that will be created statically.
-  */
-  protected static class CookiesCacheClass implements ICacheClass
-  {
-    /** Get the name of the object class.
-    * This determines the set of objects that are treated in the same
-    * LRU pool.
-    *@return the class name.
-    */
-    public String getClassName()
-    {
-      // We count all the cookies, so this is a constant string.
-      return "COOKIESCLASS";
-    }
-
-    /** Get the maximum LRU count of the object class.
-    *@return the maximum number of the objects of the particular class
-    * allowed.
-    */
-    public int getMaxLRUCount()
-    {
-      // Hardwired for the moment; 2000 cookies records will be cached,
-      // and no more.
-      return 2000;
-    }
-
-  }
-
-  /** This is the executor object for locating cookies session objects.
-  * This object furnishes the operations the cache manager needs to rebuild objects that it needs that are
-  * not in the cache at the moment.
-  */
-  protected static class CookiesExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected CookieManager thisManager;
-    protected LoginCookies returnValue;
-    protected CookiesDescription thisDescription;
-
-    /** Constructor.
-    *@param manager is the RobotsManager class instance.
-    *@param objectDescription is the desired object description.
-    */
-    public CookiesExecutor(CookieManager manager, CookiesDescription objectDescription)
-    {
-      super();
-      thisManager = manager;
-      thisDescription = objectDescription;
-      returnValue = null;
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instance.
-    */
-    public LoginCookies getResults()
-    {
-      return returnValue;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // I'm not expecting multiple values to be requested, so it's OK to walk through the objects
-      // and do a request at a time.
-      LoginCookies[] rval = new LoginCookies[objectDescriptions.length];
-      int i = 0;
-      while (i < rval.length)
-      {
-        CookiesDescription desc = (CookiesDescription)objectDescriptions[i];
-        rval[i] = thisManager.readCookiesUncached(desc.getSessionKey());
-        i++;
-      }
-
-      return rval;
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      CookiesDescription objectDesc = (CookiesDescription)objectDescription;
-      LoginCookies cookiesData = (LoginCookies)cachedObject;
-      if (objectDesc.equals(thisDescription))
-        returnValue = cookiesData;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-  }
-
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CookieSet.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CookieSet.java
deleted file mode 100644
index d9ed42c..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CookieSet.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id: CookieSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.util.List;
-
-import org.apache.http.cookie.Cookie;
-
-/** This class represents a bunch of cookies */
-public class CookieSet implements LoginCookies
-{
-  protected List<Cookie> cookieList;
-
-  public CookieSet(List<Cookie> cookieList)
-  {
-    this.cookieList = cookieList;
-  }
-
-  public int getCookieCount()
-  {
-    return cookieList.size();
-  }
-
-  public Cookie getCookie(int index)
-  {
-    return cookieList.get(index);
-  }
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CredentialsDescription.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CredentialsDescription.java
deleted file mode 100644
index e097262..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/CredentialsDescription.java
+++ /dev/null
@@ -1,739 +0,0 @@
-/* $Id: CredentialsDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.util.regex.*;
-
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-
-/** This class describes credential information pulled from a configuration.
-* The data contained is organized by regular expression performed on a url.  What we store
-* for each regular expression is a Pattern, for efficiency.
-*
-* This structure deals with credentials as applied to a matching set of urls.  It handles sequence-based
-* credentials as well as page-based credentials - that is, session-type authentication descriptions as well
-* as well as basic/ntlm authentication.  (The two are in fact not mutually exclusive!!)
-*
-* For page-based credentials, a method is provided that locates the proper credential to use based on the page's url.
-*
-* For sequence-based credentials, a different method is provided.  This reflects the fact that the underlying functionality
-* of sequence-based credentials differs enormously from that of page-based.
-*
-* Generally it is a good thing to limit the number of regexps that need to be evaluated against
-* any given url value as much as possible.  For that reason I've organized this structure
-* accordingly.
-*/
-public class CredentialsDescription
-{
-  public static final String _rcsid = "@(#)$Id: CredentialsDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the hash that contains everything.  It's keyed by the regexp string itself.
-  * Values are CredentialsItem objects. */
-  protected HashMap patternHash = new HashMap();
-
-  /** Constructor.  Build the description from the ConfigParams. */
-  public CredentialsDescription(ConfigParams configData)
-    throws ManifoldCFException
-  {
-    // Scan, looking for bin description nodes
-    int i = 0;
-    while (i < configData.getChildCount())
-    {
-      ConfigNode node = configData.getChild(i++);
-      if (node.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
-      {
-        // Get the url regexp
-        String urlDescription = node.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-        try
-        {
-          Pattern p;
-          try
-          {
-            p = Pattern.compile(urlDescription,Pattern.UNICODE_CASE);
-          }
-          catch (java.util.regex.PatternSyntaxException e)
-          {
-            throw new ManifoldCFException("Access credential regular expression '"+urlDescription+"' is illegal: "+e.getMessage(),e);
-          }
-          CredentialsItem ti = new CredentialsItem(p);
-
-          String type = node.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-
-          // These get used in two of the three types; no harm in fetching them up front.
-          String userName = node.getAttributeValue(WebcrawlerConfig.ATTR_USERNAME);
-          String password = node.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD);
-          if (password != null)
-            password = ManifoldCF.deobfuscate(password);
-
-          if (type.equals(WebcrawlerConfig.ATTRVALUE_BASIC))
-            ti.setCredential(new BasicCredential(userName,password));
-          else if (type.equals(WebcrawlerConfig.ATTRVALUE_NTLM))
-          {
-            String domain = node.getAttributeValue(WebcrawlerConfig.ATTR_DOMAIN);
-            ti.setCredential(new NTLMCredential(domain,userName,password));
-          }
-          else if (type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-          {
-            // This is a complex credential type that cannot be easily set up with just a constructor.
-            // Use the url regexp as the sequence key; this works as well as anything, although I haven't thought through all the implications if it gets changed.
-            SessionCredential sc = new SessionCredential(urlDescription);
-            // Loop through child nodes; they describe the pages that belong to the login sequence.
-            int j = 0;
-            while (j < node.getChildCount())
-            {
-              ConfigNode child = node.getChild(j++);
-              if (child.getType().equals(WebcrawlerConfig.NODE_AUTHPAGE))
-              {
-                String authPageRegexp = child.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-                String pageType = child.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-                String matchRegexp = child.getAttributeValue(WebcrawlerConfig.ATTR_MATCHREGEXP);
-		String overrideTargetURL = child.getAttributeValue(WebcrawlerConfig.ATTR_OVERRIDETARGETURL);
-		if (overrideTargetURL != null && overrideTargetURL.length() == 0)
-		  overrideTargetURL = null;
-                Pattern authPattern;
-                try
-                {
-                  authPattern = Pattern.compile(authPageRegexp,Pattern.UNICODE_CASE);
-                }
-                catch (java.util.regex.PatternSyntaxException e)
-                {
-                  throw new ManifoldCFException("Authentication page regular expression '"+authPageRegexp+"' is illegal: "+e.getMessage(),e);
-                }
-                Pattern matchPattern;
-                try
-                {
-                  matchPattern = Pattern.compile(matchRegexp,Pattern.UNICODE_CASE);
-                }
-                catch (java.util.regex.PatternSyntaxException e)
-                {
-                  throw new ManifoldCFException("Match regular expression '"+matchRegexp+"' is illegal: "+e.getMessage(),e);
-                }
-                if (pageType.equals(WebcrawlerConfig.ATTRVALUE_FORM))
-                {
-                  sc.addAuthPage(authPageRegexp,authPattern,overrideTargetURL,null,null,matchRegexp,matchPattern,null,null,null,null);
-                }
-                else if (pageType.equals(WebcrawlerConfig.ATTRVALUE_LINK))
-                {
-                  sc.addAuthPage(authPageRegexp,authPattern,overrideTargetURL,matchRegexp,matchPattern,null,null,null,null,null,null);
-                }
-                else if (pageType.equals(WebcrawlerConfig.ATTRVALUE_REDIRECTION))
-                {
-                  sc.addAuthPage(authPageRegexp,authPattern,overrideTargetURL,null,null,null,null,matchRegexp,matchPattern,null,null);
-                }
-                else if (pageType.equals(WebcrawlerConfig.ATTRVALUE_CONTENT))
-                {
-                  sc.addAuthPage(authPageRegexp,authPattern,overrideTargetURL,null,null,null,null,null,null,matchRegexp,matchPattern);
-                }
-                else
-                  throw new ManifoldCFException("Invalid page type: "+pageType);
-
-                // Finally, walk through any specified parameters
-                int k = 0;
-                while (k < child.getChildCount())
-                {
-                  ConfigNode paramNode = child.getChild(k++);
-                  if (paramNode.getType().equals(WebcrawlerConfig.NODE_AUTHPARAMETER))
-                  {
-                    String paramName = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_NAMEREGEXP);
-                    Pattern paramNamePattern;
-                    try
-                    {
-                      paramNamePattern = Pattern.compile(paramName,Pattern.UNICODE_CASE);
-                    }
-                    catch (java.util.regex.PatternSyntaxException e)
-                    {
-                      throw new ManifoldCFException("Parameter name regular expression '"+paramName+"' is illegal: "+e.getMessage(),e);
-                    }
-                    String passwordValue = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD);
-                    String paramValue = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-                    if (passwordValue != null)
-                      paramValue = ManifoldCF.deobfuscate(passwordValue);
-                    sc.addPageParameter(authPageRegexp,paramName,paramNamePattern,paramValue);
-                  }
-                }
-              }
-            }
-            ti.setCredential(sc);
-          }
-          else
-            throw new ManifoldCFException("Illegal credential type: "+type);
-          patternHash.put(urlDescription,ti);
-        }
-        catch (PatternSyntaxException e)
-        {
-          throw new ManifoldCFException("Bad pattern syntax in '"+urlDescription+"'",e);
-        }
-      }
-    }
-  }
-
-  /** Given a URL, find the right PageCredentials object to use.  If more than one match is found,
-  * use NEITHER object.
-  */
-  public PageCredentials getPageCredential(String url)
-  {
-    PageCredentials c = null;
-    Iterator iter = patternHash.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String urlDescription = (String)iter.next();
-      CredentialsItem ti = (CredentialsItem)patternHash.get(urlDescription);
-      Pattern p = ti.getPattern();
-      AuthenticationCredentials ac = ti.getCredential();
-      if (ac instanceof PageCredentials)
-      {
-        Matcher m = p.matcher(url);
-        if (m.find())
-        {
-          if (c != null)
-            return null;
-          c = (PageCredentials)ac;
-        }
-      }
-    }
-    return c;
-  }
-
-  /** Given a URL, find the right SequenceCredentials object to use.  If more than one match is found,
-  * use NEITHER object.
-  */
-  public SequenceCredentials getSequenceCredential(String url)
-  {
-    SequenceCredentials c = null;
-    Iterator iter = patternHash.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String urlDescription = (String)iter.next();
-      CredentialsItem ti = (CredentialsItem)patternHash.get(urlDescription);
-      Pattern p = ti.getPattern();
-      AuthenticationCredentials ac = ti.getCredential();
-      if (ac instanceof SequenceCredentials)
-      {
-        Matcher m = p.matcher(url);
-        if (m.find())
-        {
-          if (c != null)
-            return null;
-          c = (SequenceCredentials)ac;
-        }
-      }
-    }
-    return c;
-  }
-
-  /** Class representing an individual credential item.
-  */
-  protected static class CredentialsItem
-  {
-    /** The bin-matching pattern. */
-    protected Pattern pattern;
-    /** The credential */
-    protected AuthenticationCredentials authentication;
-
-    /** Constructor. */
-    public CredentialsItem(Pattern p)
-    {
-      pattern = p;
-    }
-
-    /** Get the pattern. */
-    public Pattern getPattern()
-    {
-      return pattern;
-    }
-
-    /** Set Credentials */
-    public void setCredential(AuthenticationCredentials authentication)
-    {
-      this.authentication = authentication;
-    }
-
-    /** Get credential type */
-    public AuthenticationCredentials getCredential()
-    {
-      return authentication;
-    }
-
-  }
-
-  /** Session credential parameter class */
-  protected static class SessionCredentialParameter
-  {
-    /** Name regexp */
-    protected String nameRegexp;
-    /** Compiled name pattern */
-    protected Pattern namePattern;
-    /** Value **/
-    protected String value;
-
-    public SessionCredentialParameter(String nameRegexp, Pattern namePattern, String value)
-    {
-      this.nameRegexp = nameRegexp;
-      this.namePattern = namePattern;
-      this.value = value;
-    }
-
-    public Pattern getNamePattern()
-    {
-      return namePattern;
-    }
-
-    public String getValue()
-    {
-      return value;
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof SessionCredentialParameter))
-        return false;
-      SessionCredentialParameter sc = (SessionCredentialParameter)o;
-      return nameRegexp.equals(sc.nameRegexp) && value.equals(sc.value);
-    }
-
-    public int hashCode()
-    {
-      return nameRegexp.hashCode() + value.hashCode();
-    }
-  }
-
-  /** Session credential helper class */
-  protected static class SessionCredentialItem implements LoginParameters
-  {
-    /** url regexp */
-    protected final String regexp;
-    /** Url match pattern */
-    protected final Pattern pattern;
-    /** Override target URL */
-    protected final String overrideTargetURL;
-    /** The preferred redirection regexp */
-    protected final String preferredRedirectionRegexp;
-    /** The preferred redirection pattern, or null if there's no preferred redirection */
-    protected final Pattern preferredRedirectionPattern;
-    /** The preferred link regexp */
-    protected final String preferredLinkRegexp;
-    /** The preferred link pattern, or null if there's no preferred link */
-    protected final Pattern preferredLinkPattern;
-    /** The form name regexp */
-    protected final String formNameRegexp;
-    /** The form name pattern, or null if no form is expected */
-    protected final Pattern formNamePattern;
-    /** The content regexp */
-    protected final String contentRegexp;
-    /** The content pattern, or null if no content is sought for */
-    protected final Pattern contentPattern;
-    
-    /** The list of the parameters we want to add for this pattern. */
-    protected final List parameters = new ArrayList();
-
-    /** Constructor */
-    public SessionCredentialItem(String regexp, Pattern p,
-      String overrideTargetURL,
-      String preferredLinkRegexp, Pattern preferredLinkPattern,
-      String formNameRegexp, Pattern formNamePattern,
-      String preferredRedirectionRegexp, Pattern preferredRedirectionPattern,
-      String contentRegexp, Pattern contentPattern)
-    {
-      this.regexp = regexp;
-      this.pattern = p;
-      this.overrideTargetURL = overrideTargetURL;
-      this.preferredLinkRegexp = preferredLinkRegexp;
-      this.preferredLinkPattern = preferredLinkPattern;
-      this.formNameRegexp = formNameRegexp;
-      this.formNamePattern = formNamePattern;
-      this.preferredRedirectionRegexp = preferredRedirectionRegexp;
-      this.preferredRedirectionPattern = preferredRedirectionPattern;
-      this.contentRegexp = contentRegexp;
-      this.contentPattern = contentPattern;
-    }
-
-    /** Add parameter */
-    public void addParameter(String nameRegexp, Pattern namePattern, String value)
-    {
-      parameters.add(new SessionCredentialParameter(nameRegexp,namePattern,value));
-    }
-
-    /** Get the pattern */
-    public Pattern getPattern()
-    {
-      return pattern;
-    }
-
-    /** Get the override target URL.
-    */
-    public String getOverrideTargetURL()
-    {
-      return overrideTargetURL;
-    }
-
-    /** Get the preferred redirection pattern.
-    */
-    public Pattern getPreferredRedirectionPattern()
-    {
-      return preferredRedirectionPattern;
-    }
-
-    /** Get the preferred link pattern.
-    */
-    public Pattern getPreferredLinkPattern()
-    {
-      return preferredLinkPattern;
-    }
-
-    /** Get the form name pattern.
-    */
-    public Pattern getFormNamePattern()
-    {
-      return formNamePattern;
-    }
-
-    /** Get the content pattern.
-    */
-    public Pattern getContentPattern()
-    {
-      return contentPattern;
-    }
-
-    /** Get the name of the i'th parameter.
-    */
-    public Pattern getParameterNamePattern(int index)
-    {
-      return getParameter(index).getNamePattern();
-    }
-
-    /** Get the desired value of the i'th parameter.
-    */
-    public String getParameterValue(int index)
-    {
-      return getParameter(index).getValue();
-    }
-
-    /** Get the parameter count */
-    public int getParameterCount()
-    {
-      return parameters.size();
-    }
-
-    /** Get the actual parameter */
-    public SessionCredentialParameter getParameter(int index)
-    {
-      return (SessionCredentialParameter)parameters.get(index);
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof SessionCredentialItem))
-        return false;
-      SessionCredentialItem sci = (SessionCredentialItem)o;
-      if (!regexp.equals(sci.regexp))
-        return false;
-
-      if (preferredRedirectionRegexp == null || sci.preferredRedirectionRegexp == null)
-      {
-        if (preferredRedirectionRegexp != sci.preferredRedirectionRegexp)
-          return false;
-      }
-      else if (!preferredRedirectionRegexp.equals(sci.preferredRedirectionRegexp))
-        return false;
-
-      if (preferredLinkRegexp == null || sci.preferredLinkRegexp == null)
-      {
-        if (preferredLinkRegexp != sci.preferredLinkRegexp)
-          return false;
-      }
-      else if (!preferredLinkRegexp.equals(sci.preferredLinkRegexp))
-        return false;
-
-      if (formNameRegexp == null || sci.formNameRegexp == null)
-      {
-        if (formNameRegexp != sci.formNameRegexp)
-          return false;
-      }
-      else if (!formNameRegexp.equals(sci.formNameRegexp))
-        return false;
-
-      if (contentRegexp == null || sci.contentRegexp == null)
-      {
-        if (contentRegexp != sci.contentRegexp)
-          return false;
-      }
-      else if (!contentRegexp.equals(sci.contentRegexp))
-        return false;
-
-      if (parameters.size() != sci.parameters.size())
-        return false;
-      int i = 0;
-      while (i < parameters.size())
-      {
-        if (!((SessionCredentialParameter)parameters.get(i)).equals((SessionCredentialParameter)sci.parameters.get(i)))
-          return false;
-        i++;
-      }
-
-      return true;
-    }
-
-    public int hashCode()
-    {
-      int rval = regexp.hashCode() + ((preferredRedirectionRegexp==null)?0:preferredRedirectionRegexp.hashCode()) +
-        ((preferredLinkRegexp==null)?0:preferredLinkRegexp.hashCode()) +
-        ((formNameRegexp==null)?0:formNameRegexp.hashCode()) +
-	((contentRegexp==null)?0:contentRegexp.hashCode());
-      int i = 0;
-      while (i < parameters.size())
-      {
-        rval += parameters.get(i).hashCode();
-        i++;
-      }
-      return rval;
-    }
-
-  }
-
-  /** LoginParameter iterator */
-  protected static class LoginParameterIterator implements Iterator
-  {
-    protected Map sessionPages;
-    protected Iterator sessionPageIterator;
-    protected String documentIdentifier;
-    protected LoginParameters currentOne = null;
-
-    /** Constructor */
-    public LoginParameterIterator(Map sessionPages, String documentIdentifier)
-    {
-      this.sessionPages = sessionPages;
-      this.documentIdentifier = documentIdentifier;
-      this.sessionPageIterator = sessionPages.keySet().iterator();
-    }
-
-    /** Find next one */
-    protected void findNextOne()
-    {
-      if (currentOne != null)
-        return;
-      while (sessionPageIterator.hasNext())
-      {
-        String key = (String)sessionPageIterator.next();
-        SessionCredentialItem sci = (SessionCredentialItem)sessionPages.get(key);
-        Matcher m = sci.getPattern().matcher(documentIdentifier);
-        if (m.find())
-        {
-          currentOne = sci;
-          return;
-        }
-      }
-    }
-
-    /** Check for next */
-    public boolean hasNext()
-    {
-      findNextOne();
-      return (currentOne != null);
-    }
-
-    /** Get the next one */
-    public Object next()
-    {
-      findNextOne();
-      Object rval = currentOne;
-      currentOne = null;
-      return rval;
-    }
-
-    public void remove()
-    {
-      throw new Error("Unimplemented function");
-    }
-  }
-
-  /** Session credentials */
-  protected static class SessionCredential implements SequenceCredentials
-  {
-    protected String sequenceKey;
-    protected Map sessionPages = new HashMap();
-
-    /** Constructor */
-    public SessionCredential(String sequenceKey)
-    {
-      this.sequenceKey = sequenceKey;
-    }
-
-    /** Add an auth page */
-    public void addAuthPage(String urlregexp, Pattern urlPattern,
-      String overrideTargetURL,
-      String preferredLinkRegexp, Pattern preferredLinkPattern,
-      String formNameRegexp, Pattern formNamePattern,
-      String preferredRedirectionRegexp, Pattern preferredRedirectionPattern,
-      String contentRegexp, Pattern contentPattern)
-      throws ManifoldCFException
-    {
-      sessionPages.put(urlregexp,new SessionCredentialItem(urlregexp,urlPattern,
-	overrideTargetURL,
-        preferredLinkRegexp,preferredLinkPattern,
-        formNameRegexp,formNamePattern,
-        preferredRedirectionRegexp,preferredRedirectionPattern,
-	contentRegexp,contentPattern));
-    }
-
-    /** Add a page parameter */
-    public void addPageParameter(String urlregexp, String paramNameRegexp, Pattern paramNamePattern, String paramValue)
-    {
-      SessionCredentialItem sci = (SessionCredentialItem)sessionPages.get(urlregexp);
-      sci.addParameter(paramNameRegexp,paramNamePattern,paramValue);
-    }
-
-    /** Fetch the unique key value for this particular credential.  (This is used to enforce the proper page ordering).
-    */
-    public String getSequenceKey()
-    {
-      return sequenceKey;
-    }
-
-    /** For a given login page, specific information may need to be submitted to the server to properly log in.  This information
-    * must be specified as part of the login sequence description information.
-    * If null is returned, then this page has no specific login information.
-    */
-    public Iterator findLoginParameters(String documentIdentifier)
-      throws ManifoldCFException
-    {
-      return new LoginParameterIterator(sessionPages,documentIdentifier);
-    }
-
-    /** Compare against another object */
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof SessionCredential))
-        return false;
-      SessionCredential b = (SessionCredential)o;
-      if (b.sessionPages.size() != sessionPages.size())
-        return false;
-      Iterator iter = sessionPages.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String key = (String)iter.next();
-        SessionCredentialItem sci = (SessionCredentialItem)sessionPages.get(key);
-        SessionCredentialItem bsci = (SessionCredentialItem)b.sessionPages.get(key);
-        if (bsci == null)
-          return false;
-        if (!sci.equals(bsci))
-          return false;
-      }
-      return true;
-    }
-
-    /** Calculate a hash function */
-    public int hashCode()
-    {
-      int rval = 0;
-      Iterator iter = sessionPages.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String key = (String)iter.next();
-        SessionCredentialItem sci = (SessionCredentialItem)sessionPages.get(key);
-        rval += sci.hashCode();
-      }
-      return rval;
-    }
-
-  }
-
-  /** Basic type credentials */
-  protected static class BasicCredential implements PageCredentials
-  {
-    protected String userName;
-    protected String password;
-    protected UsernamePasswordCredentials credentialsObject;
-
-    /** Constructor */
-    public BasicCredential(String userName, String password)
-    {
-      this.userName = userName;
-      this.password = password;
-      credentialsObject = new UsernamePasswordCredentials(userName,password);
-    }
-
-    /** Turn this instance into a Credentials object, given the specified target host name */
-    public Credentials makeCredentialsObject(String targetHostName)
-      throws ManifoldCFException
-    {
-      return credentialsObject;
-    }
-
-    /** Compare against another object */
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof BasicCredential))
-        return false;
-      BasicCredential b = (BasicCredential)o;
-      return b.userName.equals(userName) && b.password.equals(password);
-    }
-
-    /** Calculate a hash function */
-    public int hashCode()
-    {
-      return userName.hashCode() + password.hashCode();
-    }
-  }
-
-  /** NTLM-style credentials */
-  protected static class NTLMCredential implements PageCredentials
-  {
-    protected String domain;
-    protected String userName;
-    protected String password;
-    // No Credentials object here because it depends on the hostname
-
-    /** Constructor */
-    public NTLMCredential(String domain, String userName, String password)
-    {
-      this.domain = domain;
-      this.userName = userName;
-      this.password = password;
-    }
-
-    /** Turn this instance into a Credentials object, given the specified target host name */
-    public Credentials makeCredentialsObject(String targetHostName)
-      throws ManifoldCFException
-    {
-      return new NTCredentials(userName,password,targetHostName,domain);
-    }
-
-    /** Compare against another object */
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof NTLMCredential))
-        return false;
-      NTLMCredential b = (NTLMCredential)o;
-      return b.userName.equals(userName) && b.password.equals(password) &&
-        b.domain.equals(domain);
-    }
-
-    /** Calculate a hash function */
-    public int hashCode()
-    {
-      return userName.hashCode() + password.hashCode() + domain.hashCode();
-    }
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/DNSManager.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/DNSManager.java
deleted file mode 100644
index e4d007b..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/DNSManager.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/* $Id: DNSManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-
-/** This class manages the database table into which we DNS entries for hosts.  The data resides in the database,
-* as well as in cache (up to a certain point).  The result is that there is a memory limited, database-backed repository
-* of DNS entries that we can draw on.
-* Note that this code is also responsible for efficiently caching the mapping of IP address to a canonical host name.
-* 
-* <br><br>
-* <b>dnsdata</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>hostname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
-* <tr><td>canonicalhostname</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>ipaddress</td><td>VARCHAR(16)</td><td></td></tr>
-* <tr><td>expirationtime</td><td>BIGINT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class DNSManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: DNSManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Robots cache class.  Only one needed.
-  protected static DNSCacheClass dnsCacheClass = new DNSCacheClass();
-
-  // Database fields
-  protected final static String hostField = "hostname";
-  protected final static String fqdnField = "canonicalhostname";
-  protected final static String ipaddressField = "ipaddress";
-  protected final static String expirationField = "expirationtime";
-
-  // Cache manager.  This handle is set up during the constructor.
-  ICacheManager cacheManager;
-
-  /** Constructor.  Note that one robotsmanager handle is only useful within a specific thread context,
-  * so the calling connector object logic must recreate the handle whenever the thread context changes.
-  *@param tc is the thread context.
-  *@param database is the database handle.
-  */
-  public DNSManager(IThreadContext tc, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"dnsdata");
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Standard practice: outer loop, no transactions
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the table.
-        HashMap map = new HashMap();
-        map.put(hostField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-        map.put(fqdnField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(ipaddressField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        map.put(expirationField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code, if needed, goes here
-      }
-
-      // Handle indexes
-
-      // I thought at one point this index might be useful, but it doesn't seem necessary after all
-      // ArrayList list = new ArrayList();
-      // list.add(ipaddressField);
-      // addTableIndex(false,list);
-
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Given a host name, look up the ip address and fqdn.
-  *@return null if there is no available cached version of this info.
-  */
-  public DNSInfo lookup(String hostName, long currentTime)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    HostDescription[] objectDescriptions = new HostDescription[1];
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getDNSKey(hostName));
-    objectDescriptions[0] = new HostDescription(hostName,new StringSet(ssb));
-
-    HostExecutor exec = new HostExecutor(this,objectDescriptions[0]);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-
-    // DNSInfo object must be built if it isn't yet present.
-    DNSInfo rd = exec.getResults();
-    if (rd == null || rd.getExpirationTime() <= currentTime)
-      return null;
-    return rd;
-  }
-
-  /** Write DNS data, replacing any existing row.
-  *@param hostName is the host.
-  *@param fqdn is the canonical host name.
-  *@param ipaddress is the host ip address, in standard form.
-  *@param expirationTime is the time this data should expire.
-  */
-  public void writeDNSData(String hostName, String fqdn, String ipaddress, long expirationTime)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getDNSKey(hostName));
-    StringSet cacheKeys = new StringSet(ssb);
-    ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-    try
-    {
-      beginTransaction();
-      try
-      {
-        // See whether the instance exists
-        ArrayList params = new ArrayList();
-        params.add(hostName);
-        IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-          hostField+"=?",params,null,null);
-        HashMap values = new HashMap();
-        values.put(expirationField,new Long(expirationTime));
-        if (fqdn == null)
-          fqdn = "";
-        values.put(fqdnField,fqdn);
-        if (ipaddress == null)
-          ipaddress = "";
-        values.put(ipaddressField, ipaddress);
-        if (set.getRowCount() > 0)
-        {
-          // Update
-          params.clear();
-          params.add(hostName);
-          performUpdate(values," WHERE "+hostField+"=?",params,null);
-        }
-        else
-        {
-          // Insert
-          values.put(hostField,hostName);
-          // We only need the general key because this is new.
-          performInsert(values,null);
-        }
-        cacheManager.invalidateKeys(ch);
-      }
-      catch (ManifoldCFException e)
-      {
-        signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        signalRollback();
-        throw e;
-      }
-      finally
-      {
-        endTransaction();
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-  }
-
-  // Protected methods and classes
-
-  /** Construct a key which represents an individual host name.
-  *@param hostName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getDNSKey(String hostName)
-  {
-    return "DNS_"+hostName;
-  }
-
-  /** Read DNS data, if it exists.
-  *@return null if the data doesn't exist at all.  Return DNS data if it does.
-  */
-  protected DNSInfo readDNSInfo(String hostName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(hostName);
-    IResultSet set = performQuery("SELECT "+ipaddressField+","+fqdnField+","+expirationField+" FROM "+getTableName()+
-      " WHERE "+hostField+"=?",list,null,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    long expiration = ((Long)row.getValue(expirationField)).longValue();
-    String ipaddress = (String)row.getValue(ipaddressField);
-    if (ipaddress != null && ipaddress.length() == 0)
-      ipaddress = null;
-    String fqdn = (String)row.getValue(fqdnField);
-    if (fqdn != null && fqdn.length() == 0)
-      fqdn = null;
-    return new DNSInfo(ipaddress,fqdn,expiration,hostName);
-  }
-
-  /** This is a cached data item.
-  */
-  protected static class DNSInfo
-  {
-    protected long expiration;
-    protected String hostName;
-    protected String ipaddress;
-    protected String fqdn;
-
-    /** Constructor. */
-    public DNSInfo(String ipaddress, String fqdn, long expiration, String hostName)
-    {
-      this.ipaddress = ipaddress;
-      this.fqdn = fqdn;
-      this.expiration = expiration;
-      this.hostName = hostName;
-    }
-
-    /** Get the ipaddress */
-    public String getIPAddress()
-    {
-      return ipaddress;
-    }
-
-    /** Get the fqdn */
-    public String getFQDN()
-    {
-      return fqdn;
-    }
-
-    /** Get the expiration time. */
-    public long getExpirationTime()
-    {
-      return expiration;
-    }
-
-    /** Get the host name */
-    public String getHostName()
-    {
-      return hostName;
-    }
-
-
-  }
-
-  /** This is the object description for a robots host object.
-  * This is the key that is used to look up cached data.
-  */
-  protected static class HostDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String hostName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public HostDescription(String hostName, StringSet invKeys)
-    {
-      super("dnscache");
-      this.hostName = hostName;
-      criticalSectionName = getClass().getName()+"-"+hostName;
-      cacheKeys = invKeys;
-    }
-
-    public String getHostName()
-    {
-      return hostName;
-    }
-
-    public int hashCode()
-    {
-      return hostName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof HostDescription))
-        return false;
-      HostDescription d = (HostDescription)o;
-      return d.hostName.equals(hostName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-    /** Get the object class for an object.  The object class is used to determine
-    * the group of objects treated in the same LRU manner.
-    * @return the newly created object's object class, or null if there is no
-    * such class, and LRU behavior is not desired.
-    */
-    public ICacheClass getObjectClass()
-    {
-      return dnsCacheClass;
-    }
-  }
-
-  /** Cache class for robots.
-  * An instance of this class describes the cache class for robots data caching.  There's
-  * only ever a need for one, so that will be created statically.
-  */
-  protected static class DNSCacheClass implements ICacheClass
-  {
-    /** Get the name of the object class.
-    * This determines the set of objects that are treated in the same
-    * LRU pool.
-    *@return the class name.
-    */
-    public String getClassName()
-    {
-      // We count all the robot data, so this is a constant string.
-      return "DNSCLASS";
-    }
-
-    /** Get the maximum LRU count of the object class.
-    *@return the maximum number of the objects of the particular class
-    * allowed.
-    */
-    public int getMaxLRUCount()
-    {
-      // Hardwired for the moment; 2000 dns data records will be cached,
-      // and no more.
-      return 2000;
-    }
-
-  }
-
-  /** This is the executor object for locating robots host objects.
-  * This object furnishes the operations the cache manager needs to rebuild objects that it needs that are
-  * not in the cache at the moment.
-  */
-  protected static class HostExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected DNSManager thisManager;
-    protected DNSInfo returnValue;
-    protected HostDescription thisHost;
-
-    /** Constructor.
-    *@param manager is the RobotsManager class instance.
-    *@param objectDescription is the desired object description.
-    */
-    public HostExecutor(DNSManager manager, HostDescription objectDescription)
-    {
-      super();
-      thisManager = manager;
-      thisHost = objectDescription;
-      returnValue = null;
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instance.
-    */
-    public DNSInfo getResults()
-    {
-      return returnValue;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // I'm not expecting multiple values to be request, so it's OK to walk through the objects
-      // and do a request at a time.
-      DNSInfo[] rval = new DNSInfo[objectDescriptions.length];
-      int i = 0;
-      while (i < rval.length)
-      {
-        HostDescription desc = (HostDescription)objectDescriptions[i];
-        // I need to cache both the data and the expiration date, and pick up both when I
-        // do the query.  This is because I don't want to cache based on request time, since that
-        // would screw up everything!
-        rval[i] = thisManager.readDNSInfo(desc.getHostName());
-        i++;
-      }
-
-      return rval;
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      HostDescription objectDesc = (HostDescription)objectDescription;
-      DNSInfo data = (DNSInfo)cachedObject;
-      if (objectDesc.equals(thisHost))
-        returnValue = data;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/DataCache.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/DataCache.java
deleted file mode 100644
index 4bc0dfb..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/DataCache.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/* $Id: DataCache.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-
-/** This class is a cache of a specific URL's data.  It's fetched early and kept,
-* so that (1) an accurate data length can be found, and (2) we can compute a version
-* checksum.
-*/
-public class DataCache
-{
-  public static final String _rcsid = "@(#)$Id: DataCache.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Hashmap containing the cache of files.
-  // This is keyed by document identifier, and contains DocumentData objects.
-  protected Map<String,DocumentData> cacheData = new HashMap<String,DocumentData>();
-
-  /** Constructor.
-  */
-  public DataCache()
-  {
-  }
-
-
-  /** Add a data entry into the cache.
-  * This method is called whenever the data from a fetch is considered interesting or useful, and will
-  * be thus passed on from getDocumentVersions() to the processDocuments() phase.  At the moment that's
-  * usually a 200 or a 302 response.
-  *@param documentIdentifier is the document identifier (url).
-  *@param connection is the connection, upon which a fetch has been done that needs to be
-  * cached.
-  *@return a "checksum" value, to use as a version string.
-  */
-  public String addData(IProcessActivity activities, String documentIdentifier, IThrottledConnection connection)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Grab the response code, and the content-type header
-    int responseCode = connection.getResponseCode();
-    String contentType = connection.getResponseHeader("Content-Type");
-    String referralURI = connection.getResponseHeader("Location");
-
-    // Create a temporary file; that's what we will cache
-    try
-    {
-      // First, get the stream.
-      InputStream dataStream = connection.getResponseBodyStream();
-      if (dataStream == null)
-        return null;
-      try
-      {
-        File tempFile = File.createTempFile("_webcache_","tmp");
-        try
-        {
-          // Causes memory leaks if left around; there's no way to release
-          // the record specifying that the file should be deleted, even
-          // after it's removed.  So disable this and live with the occasional
-          // dangling file left as a result of shutdown or error. :-(
-          // tempFile.deleteOnExit();
-          ManifoldCF.addFile(tempFile);
-
-          // Transfer data to temporary file
-          long checkSum = 0L;
-          OutputStream os = new FileOutputStream(tempFile);
-          try
-          {
-            byte[] byteArray = new byte[65536];
-            while (true)
-            {
-              int amt;
-              try
-              {
-                amt = dataStream.read(byteArray,0,byteArray.length);
-              }
-              catch (java.net.SocketTimeoutException e)
-              {
-                Logging.connectors.warn("Socket timeout exception reading socket stream: "+e.getMessage(),e);
-                long currentTime = System.currentTimeMillis();
-                throw new ServiceInterruption("Socket timeout: "+e.getMessage(),e,currentTime + 300000L,
-                  currentTime + 12 * 60 * 60000L,-1,false);
-              }
-              catch (ConnectTimeoutException e)
-              {
-                Logging.connectors.warn("Socket connect timeout exception reading socket stream: "+e.getMessage(),e);
-                long currentTime = System.currentTimeMillis();
-                throw new ServiceInterruption("Socket timeout: "+e.getMessage(),e,currentTime + 300000L,
-                  currentTime + 12 * 60 * 60000L,-1,false);
-              }
-              catch (InterruptedIOException e)
-              {
-                //Logging.connectors.warn("IO interruption seen",e);
-                throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-              }
-              catch (IOException e)
-              {
-                Logging.connectors.warn("IO exception reading socket stream: "+e.getMessage(),e);
-                long currentTime = System.currentTimeMillis();
-                throw new ServiceInterruption("Read timeout: "+e.getMessage(),e,currentTime + 300000L,
-                  currentTime + 12 * 60 * 60000L,-1,false);
-              }
-              if (amt == -1)
-                break;
-              int i = 0;
-              while (i < amt)
-              {
-                byte x = byteArray[i++];
-                long bytevalue = (long)x;
-                checkSum = (checkSum << 5) ^ (checkSum >> 3) ^ (bytevalue << 2) ^ (bytevalue >> 3);
-              }
-
-              os.write(byteArray,0,amt);
-              // Check if job is alive before looping
-              activities.checkJobStillActive();
-            }
-          }
-          finally
-          {
-            os.close();
-          }
-
-          synchronized(this)
-          {
-            deleteData(documentIdentifier);
-            cacheData.put(documentIdentifier,new DocumentData(tempFile,responseCode,contentType,referralURI));
-            return new Long(checkSum).toString();
-          }
-
-        }
-        catch (IOException e)
-        {
-          ManifoldCF.deleteFile(tempFile);
-          throw e;
-        }
-        catch (ManifoldCFException e)
-        {
-          ManifoldCF.deleteFile(tempFile);
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          ManifoldCF.deleteFile(tempFile);
-          throw e;
-        }
-        catch (Error e)
-        {
-          ManifoldCF.deleteFile(tempFile);
-          throw e;
-        }
-      }
-      finally
-      {
-        try
-        {
-          dataStream.close();
-        }
-        catch (java.net.SocketTimeoutException e)
-        {
-          Logging.connectors.warn("WEB: Socket timeout exception closing data stream, ignoring: "+e.getMessage(),e);
-        }
-        catch (ConnectTimeoutException e)
-        {
-          Logging.connectors.warn("WEB: Socket connect timeout exception closing data stream, ignoring: "+e.getMessage(),e);
-        }
-        catch (InterruptedIOException e)
-        {
-          throw e;
-        }
-        catch (IOException e)
-        {
-          // We can get this if the socket was unexpectedly closed by the server; treat this
-          // as a Service Interruption.  Generally, this is ok - warn but don't do anything else.
-          Logging.connectors.warn("WEB: IO exception closing data stream, ignoring: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception creating temporary file: "+e.getMessage(),e);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket connect timeout exception creating temporary file: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      //Logging.connectors.warn("IO interruption seen",e);
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception creating temporary file: "+e.getMessage(),e);
-    }
-  }
-
-  /** Get the response code.
-  *@param documentIdentifier is the document identifier.
-  *@return the code.
-  */
-  public synchronized int getResponseCode(String documentIdentifier)
-  {
-    DocumentData dd = cacheData.get(documentIdentifier);
-    if (dd == null)
-      return IThrottledConnection.FETCH_NOT_TRIED;
-    return dd.getResponseCode();
-  }
-
-  /** Get the content type.
-  *@param documentIdentifier is the document identifier.
-  *@return the content type, or null if there is none.
-  */
-  public synchronized String getContentType(String documentIdentifier)
-  {
-    DocumentData dd = cacheData.get(documentIdentifier);
-    if (dd == null)
-      return null;
-    return dd.getContentType();
-  }
-
-  /** Get the referral URI.
-  *@param documentIdentifier is the document identifier.
-  *@return the referral URI, or null if none.
-  */
-  public synchronized String getReferralURI(String documentIdentifier)
-  {
-    DocumentData dd = cacheData.get(documentIdentifier);
-    if (dd == null)
-      return null;
-    return dd.getReferralURI();
-  }
-
-  /** Fetch binary data length.
-  *@param documentIdentifier is the document identifier.
-  *@return the length.
-  */
-  public synchronized long getDataLength(String documentIdentifier)
-  {
-    DocumentData dd = cacheData.get(documentIdentifier);
-    if (dd == null)
-      return 0L;
-    return dd.getData().length();
-  }
-
-  /** Fetch binary data entry from the cache.
-  *@param documentIdentifier is the document identifier (url).
-  *@return a binary data stream.
-  */
-  public synchronized InputStream getData(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    DocumentData dd = cacheData.get(documentIdentifier);
-    if (dd == null)
-      return null;
-    try
-    {
-      return new FileInputStream(dd.getData());
-    }
-    catch (FileNotFoundException e)
-    {
-      throw new ManifoldCFException("File not found exception opening data: "+e.getMessage(),e);
-    }
-  }
-
-  /** Delete specified item of data.
-  *@param documentIdentifier is the document identifier (url).
-  */
-  public synchronized void deleteData(String documentIdentifier)
-  {
-    DocumentData dd = cacheData.remove(documentIdentifier);
-    if (dd != null)
-    {
-      ManifoldCF.deleteFile(dd.getData());
-    }
-  }
-
-  // Protected classes
-
-  /** This class represents everything we need to know about a document that's getting passed from the
-  * getDocumentVersions() phase to the processDocuments() phase.
-  */
-  protected static class DocumentData
-  {
-    /** The cache file for the data */
-    protected File data;
-    /** The response code */
-    protected int responseCode;
-    /** The content-type header value */
-    protected String contentType;
-    /** The referral URI */
-    protected String referralURI;
-
-    // More will probably go here later, but I can't think of much else at the moment.
-
-    /** Constructor. */
-    public DocumentData(File data, int responseCode, String contentType, String referralURI)
-    {
-      this.data = data;
-      this.responseCode = responseCode;
-      this.contentType = contentType;
-      this.referralURI = referralURI;
-    }
-
-    /** Get the data */
-    public File getData()
-    {
-      return data;
-    }
-
-    /** Get the response code */
-    public int getResponseCode()
-    {
-      return responseCode;
-    }
-
-    /** Get the contentType */
-    public String getContentType()
-    {
-      return contentType;
-    }
-
-    /** Get the referral URI */
-    public String getReferralURI()
-    {
-      return referralURI;
-    }
-
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindContentHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindContentHandler.java
deleted file mode 100644
index be0a826..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindContentHandler.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-import static java.util.Arrays.asList;
-import static org.apache.manifoldcf.crawler.system.Logging.connectors;
-
-/** This class is the handler for HTML content grepping during state transitions */
-public class FindContentHandler extends FindHandler implements IHTMLHandler
-{
-  protected final List<Pattern> contentPatterns;
-  protected final StringBuilder contentBuffer = new StringBuilder();
-
-  protected final static int MAX_LENGTH = 65536;
-  protected final static int OVERLAP_AMOUNT = 16384;
-  
-  public FindContentHandler(String parentURI, Pattern contentPattern)
-  {
-    super(parentURI);
-    this.contentPatterns = asList(contentPattern);
-  }
-
-  public FindContentHandler(String parentURI, List<Pattern> contentPatterns)
-  {
-    super(parentURI);
-    this.contentPatterns = contentPatterns;
-  }
-
-  /** Apply overrides */
-  public void applyOverrides(LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (targetURI != null && lp != null)
-    {
-      if (lp.getOverrideTargetURL() != null)
-        super.noteDiscoveredLink(lp.getOverrideTargetURL());
-    }
-  }
-
-  /** Note a character of text.
-  * Structured this way to keep overhead low for handlers that don't use text.
-  */
-  @Override
-  public void noteTextCharacter(char textCharacter)
-    throws ManifoldCFException
-  {
-    if (targetURI != null)
-      return;
-    // Build characters up into lines, and apply the regexp against them
-    if (textCharacter == '\t' || textCharacter >= ' ')
-    {
-      contentBuffer.append(textCharacter);
-      // If too big, do the search and clear out the buffer, retaining some of it for overlap purposes
-      if (contentBuffer.length() >= MAX_LENGTH)
-      {
-        // Process what we have, and keep around what we need for
-        // continuity
-        String bufferContents = contentBuffer.toString();
-        contentBuffer.setLength(0);
-        for (Pattern contentPattern : contentPatterns) {
-          if (contentPattern.matcher(bufferContents).find()) {
-            targetURI = "";
-            break;
-          }
-        }
-
-        if(targetURI == null) {
-          contentBuffer.append(bufferContents.substring(bufferContents.length() - OVERLAP_AMOUNT));
-        }
-      }
-    }
-    else
-    {
-      processBuffer();
-    }
-  }
-
-  /** Note a meta tag */
-  @Override
-  public void noteMetaTag(Map metaAttributes)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note the start of a form */
-  @Override
-  public void noteFormStart(Map formAttributes)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note an input tag */
-  @Override
-  public void noteFormInput(Map inputAttributes)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note the end of a form */
-  @Override
-  public void noteFormEnd()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered href */
-  @Override
-  public void noteAHREF(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered href */
-  @Override
-  public void noteLINKHREF(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered IMG SRC */
-  @Override
-  public void noteIMGSRC(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered FRAME SRC */
-  @Override
-  public void noteFRAMESRC(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Finish up all processing.  Called ONLY if we haven't already aborted.
-  */
-  @Override
-  public void finishUp()
-    throws ManifoldCFException
-  {
-    if (targetURI == null)
-      processBuffer();
-  }
-
-  protected void processBuffer()
-  {
-    String bufferContents = contentBuffer.toString();
-    contentBuffer.setLength(0);
-    for(Pattern contentPattern: contentPatterns) {
-      if (contentPattern.matcher(bufferContents).find()) {
-        targetURI = "";
-        return;
-      }
-    }
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHTMLFormHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHTMLFormHandler.java
deleted file mode 100644
index 7925f3e..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHTMLFormHandler.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.regex.*;
-import java.util.*;
-
-/** This class is the handler for HTML form parsing during state transitions */
-public class FindHTMLFormHandler extends FindHandler implements IHTMLHandler
-{
-  protected final Pattern formNamePattern;
-  protected FormDataAccumulator discoveredFormData = null;
-  protected FormDataAccumulator currentFormData = null;
-
-  public FindHTMLFormHandler(String parentURI, Pattern formNamePattern)
-  {
-    super(parentURI);
-    this.formNamePattern = formNamePattern;
-  }
-
-  public void applyFormOverrides(LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (discoveredFormData != null && lp != null)
-    {
-      if (lp.getOverrideTargetURL() != null)
-      {
-        super.noteDiscoveredLink(lp.getOverrideTargetURL());
-        discoveredFormData.overrideActionURI(getTargetURI());
-      }
-      discoveredFormData.applyOverrides(lp);
-    }
-  }
-
-  public FormData getFormData()
-  {
-    return discoveredFormData;
-  }
-
-  /** Note a character of text.
-  * Structured this way to keep overhead low for handlers that don't use text.
-  */
-  @Override
-  public void noteTextCharacter(char textCharacter)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note a meta tag */
-  @Override
-  public void noteMetaTag(Map metaAttributes)
-    throws ManifoldCFException
-  {
-  }
-    
-  /** Note the start of a form */
-  @Override
-  public void noteFormStart(Map formAttributes)
-    throws ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("WEB: Saw form with"+
-        " name "+((formAttributes.get("name")==null)?"null":"'"+formAttributes.get("name")+"'") +
-        " id "+((formAttributes.get("id")==null)?"null":"'"+formAttributes.get("id")+"'") +
-        " action "+((formAttributes.get("action")==null)?"null":"'"+formAttributes.get("action")+"'")
-      );
-
-    // Is this a form element we can use?
-    boolean canUse;
-    if (formNamePattern != null)
-    {
-      // Find the identifier we will use for the form.  If name isn't there,
-      // we use id.  If id isn't there, we use action.  The only other thing we
-      // could reasonably do is identify the form by its form elements.
-      String formName = (String)formAttributes.get("name");
-      if (formName == null)
-        formName = (String)formAttributes.get("id");
-      if (formName == null)
-        formName = (String)formAttributes.get("action");
-      if (formName == null)
-        formName = "";
-
-      Matcher m = formNamePattern.matcher(formName);
-      canUse = m.find();
-    }
-    else
-      canUse = true;
-
-    if (canUse)
-    {
-      String actionURI = (String)formAttributes.get("action");
-      if (actionURI == null)
-        // Action URI is THIS uri!
-        actionURI = parentURI;
-      else if (actionURI.length() == 0)
-        actionURI = "";
-      noteDiscoveredLink(actionURI);
-      actionURI = getTargetURI();
-      if (actionURI != null)
-      {
-        String method = (String)formAttributes.get("method");
-        if (method == null || method.length() == 0)
-          method = "get";
-        else
-          method = method.toLowerCase(Locale.ROOT);
-
-        // Start a new form
-        currentFormData = new FormDataAccumulator(actionURI,method.equals("post")?FormData.SUBMITMETHOD_POST:FormData.SUBMITMETHOD_GET);
-
-      }
-    }
-  }
-
-  /** Note an input tag */
-  @Override
-  public void noteFormInput(Map inputAttributes)
-    throws ManifoldCFException
-  {
-    if (Logging.connectors.isDebugEnabled())
-    {
-      String type = (String)inputAttributes.get("type");
-      if (type == null)
-        type = "text";
-      String name = (String)inputAttributes.get("name");
-      if (name == null)
-        name = "(null)";
-      Logging.connectors.debug("WEB: Saw form element of type '"+type+"' name '"+name+"'");
-    }
-    if (currentFormData != null)
-      currentFormData.addElement(inputAttributes);
-  }
-
-  /** Note the end of a form */
-  @Override
-  public void noteFormEnd()
-    throws ManifoldCFException
-  {
-    if (currentFormData != null)
-    {
-      discoveredFormData = currentFormData;
-      currentFormData = null;
-    }
-  }
-
-  /** Note discovered href */
-  @Override
-  public void noteAHREF(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered href */
-  @Override
-  public void noteLINKHREF(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered IMG SRC */
-  @Override
-  public void noteIMGSRC(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered FRAME SRC */
-  @Override
-  public void noteFRAMESRC(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  @Override
-  public void finishUp()
-    throws ManifoldCFException
-  {
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHTMLHrefHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHTMLHrefHandler.java
deleted file mode 100644
index b0c47d7..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHTMLHrefHandler.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.regex.*;
-import java.util.*;
-
-/** This class is the handler for HTML parsing during state transitions */
-public class FindHTMLHrefHandler extends FindHandler implements IHTMLHandler
-{
-  protected final Pattern preferredLinkPattern;
-
-  public FindHTMLHrefHandler(String parentURI, Pattern preferredLinkPattern)
-  {
-    super(parentURI);
-    this.preferredLinkPattern = preferredLinkPattern;
-  }
-
-  /** Apply overrides */
-  public void applyOverrides(LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (targetURI != null && lp != null)
-    {
-      if (lp.getOverrideTargetURL() != null)
-        super.noteDiscoveredLink(lp.getOverrideTargetURL());
-    }
-  }
-
-  /** Note a character of text.
-  * Structured this way to keep overhead low for handlers that don't use text.
-  */
-  @Override
-  public void noteTextCharacter(char textCharacter)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note a meta tag */
-  @Override
-  public void noteMetaTag(Map metaAttributes)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note the start of a form */
-  @Override
-  public void noteFormStart(Map formAttributes)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note an input tag */
-  @Override
-  public void noteFormInput(Map inputAttributes)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note the end of a form */
-  @Override
-  public void noteFormEnd()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Override noteDiscoveredLink */
-  @Override
-  public void noteDiscoveredLink(String rawURL)
-    throws ManifoldCFException
-  {
-    if (targetURI == null)
-    {
-      Logging.connectors.debug("WEB: Tried to match raw url '"+rawURL+"'");
-      super.noteDiscoveredLink(rawURL);
-      if (targetURI != null)
-      {
-        Logging.connectors.debug("WEB: Tried to match cooked url '"+targetURI+"'");
-        // Is this a form element we can use?
-        boolean canUse;
-        if (preferredLinkPattern != null)
-        {
-          Matcher m = preferredLinkPattern.matcher(targetURI);
-          canUse = m.find();
-          Logging.connectors.debug("WEB: Preferred link lookup "+((canUse)?"matched":"didn't match")+" '"+targetURI+"'");
-        }
-        else
-        {
-          Logging.connectors.debug("WEB: Preferred link lookup for '"+targetURI+"' had no pattern to match");
-          canUse = true;
-        }
-        if (!canUse)
-          targetURI = null;
-      }
-    }
-  }
-
-  /** Note discovered href */
-  @Override
-  public void noteAHREF(String rawURL)
-    throws ManifoldCFException
-  {
-    noteDiscoveredLink(rawURL);
-  }
-
-  /** Note discovered href */
-  @Override
-  public void noteLINKHREF(String rawURL)
-    throws ManifoldCFException
-  {
-    noteDiscoveredLink(rawURL);
-  }
-
-  /** Note discovered IMG SRC */
-  @Override
-  public void noteIMGSRC(String rawURL)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Note discovered FRAME SRC */
-  @Override
-  public void noteFRAMESRC(String rawURL)
-    throws ManifoldCFException
-  {
-    noteDiscoveredLink(rawURL);
-  }
-
-  @Override
-  public void finishUp()
-    throws ManifoldCFException
-  {
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHandler.java
deleted file mode 100644
index dfca8e5..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindHandler.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This class is used to discover links in a session login context */
-public class FindHandler implements IDiscoveredLinkHandler
-{
-  protected String parentURI;
-  protected String targetURI = null;
-
-  public FindHandler(String parentURI)
-  {
-    this.parentURI = parentURI;
-  }
-
-  /** Inform the world of a discovered link.
-  *@param rawURL is the raw discovered url.  This may be relative, malformed, or otherwise unsuitable for use until final form is acheived.
-  */
-  @Override
-  public void noteDiscoveredLink(String rawURL)
-    throws ManifoldCFException
-  {
-    // Build a complete url, but don't filter or anything
-    try
-    {
-      java.net.URI url;
-      if (parentURI != null)
-      {
-        java.net.URI parentURL = new java.net.URI(parentURI);
-        url = parentURL.resolve(rawURL);
-      }
-      else
-        url = new java.net.URI(rawURL);
-
-      String protocol = url.getScheme();
-      String host = url.getHost();
-
-      // The new URL better darn well have a host and a protocol, and we only know how to deal with
-      // http and https.
-      if (protocol == null || host == null)
-      {
-        return;
-      }
-      if (!WebcrawlerConnector.understoodProtocols.contains(protocol))
-      {
-        return;
-      }
-
-      String id = url.toASCIIString();
-      if (id == null)
-        return;
-
-      // As a last basic legality check, go through looking for illegal characters.
-      int i = 0;
-      while (i < id.length())
-      {
-        char x = id.charAt(i++);
-        // Only 7-bit ascii is allowed in URLs - and that has limits too (no control characters)
-        if (x < ' ' || x > 127)
-        {
-          return;
-        }
-      }
-
-      // Set the target.
-      targetURI = id;
-    }
-    catch (java.net.URISyntaxException e)
-    {
-      return;
-    }
-    catch (java.lang.IllegalArgumentException e)
-    {
-      return;
-    }
-    catch (java.lang.NullPointerException e)
-    {
-      // This gets tossed by url.toAsciiString() for reasons I don't understand, but which have to do with a malformed URL.
-      return;
-    }
-  }
-
-  public String getTargetURI()
-  {
-    return targetURI;
-  }
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindPreferredRedirectionHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindPreferredRedirectionHandler.java
deleted file mode 100644
index b0de31a..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindPreferredRedirectionHandler.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import java.util.regex.*;
-
-/** This class is the handler for redirection handling during state transitions */
-public class FindPreferredRedirectionHandler extends FindHandler implements IRedirectionHandler
-{
-  protected Pattern redirectionURIPattern;
-
-  public FindPreferredRedirectionHandler(String parentURI, Pattern redirectionURIPattern)
-  {
-    super(parentURI);
-    this.redirectionURIPattern = redirectionURIPattern;
-  }
-
-  /** Apply overrides */
-  public void applyOverrides(LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (targetURI != null && lp != null)
-    {
-      if (lp.getOverrideTargetURL() != null)
-        super.noteDiscoveredLink(lp.getOverrideTargetURL());
-    }
-  }
-    
-  /** Override noteDiscoveredLink */
-  @Override
-  public void noteDiscoveredLink(String rawURL)
-    throws ManifoldCFException
-  {
-    if (targetURI == null)
-    {
-      Logging.connectors.debug("WEB: Tried to match raw url '"+rawURL+"'");
-      super.noteDiscoveredLink(rawURL);
-      if (targetURI != null)
-      {
-        Logging.connectors.debug("WEB: Tried to match cooked url '"+targetURI+"'");
-        // Is this a form element we can use?
-        boolean canUse;
-        if (redirectionURIPattern != null)
-        {
-          Matcher m = redirectionURIPattern.matcher(targetURI);
-          canUse = m.find();
-          Logging.connectors.debug("WEB: Redirection link lookup "+((canUse)?"matched":"didn't match")+" '"+targetURI+"'");
-        }
-        else
-        {
-          Logging.connectors.debug("WEB: Redirection link lookup for '"+targetURI+"' had no pattern to match");
-          canUse = true;
-        }
-        if (!canUse)
-          targetURI = null;
-      }
-    }
-  }
-}
-
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindRedirectionHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindRedirectionHandler.java
deleted file mode 100644
index ff20d47..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FindRedirectionHandler.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This class is the handler for redirection parsing during state transitions */
-public class FindRedirectionHandler extends FindHandler implements IRedirectionHandler
-{
-  public FindRedirectionHandler(String parentURI)
-  {
-    super(parentURI);
-  }
-
-}
-
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormData.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormData.java
deleted file mode 100644
index 16d54af..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormData.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id: FormData.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.util.*;
-
-/** This interface describes the form data gleaned from an HTML page.  The data will be combined with override information from a LoginParameters
-* object to construct the proper information for a form submission.
-*/
-public interface FormData
-{
-  public static final String _rcsid = "@(#)$Id: FormData.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Submit methods
-  public final static int SUBMITMETHOD_GET = 0;
-  public final static int SUBMITMETHOD_POST = 1;
-
-  /** Get the full action URI for this form. */
-  public String getActionURI();
-
-  /** Get the submit method for this form. */
-  public int getSubmitMethod();
-
-  /** Iterate over the active form data elements.  The returned iterator returns FormDataElement objects. */
-  public Iterator getElementIterator();
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormDataAccumulator.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormDataAccumulator.java
deleted file mode 100644
index 52df160..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormDataAccumulator.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** This class accumulates form data and allows overrides */
-public class FormDataAccumulator implements FormData
-{
-  // Note well: We don't handle multipart posts at this time!!
-
-  // Element categorization
-  protected final static int ELEMENTCATEGORY_FREEFORM = 0;
-  protected final static int ELEMENTCATEGORY_FIXEDEXCLUSIVE = 1;
-  protected final static int ELEMENTCATEGORY_FIXEDINCLUSIVE = 2;
-
-  /** The form's action URI */
-  protected String actionURI;
-  /** The form's submit method */
-  protected int submitMethod;
-
-  /** The set of elements */
-  protected ArrayList elementList = new ArrayList();
-
-  public FormDataAccumulator(String actionURI, int submitMethod)
-  {
-    this.actionURI = actionURI;
-    this.submitMethod = submitMethod;
-  }
-
-  public void addElement(Map attributes)
-  {
-    // Interpret the input tag, and make a list of the potential elements we'll want to submit
-    String type = (String)attributes.get("type");
-    if (type == null)
-      type = "text";
-    String name = (String)attributes.get("name");
-    if (name != null)
-    {
-      String lowerType = type.toLowerCase(Locale.ROOT);
-      if (lowerType.equals("submit"))
-      {
-        String value = (String)attributes.get("value");
-        if (value == null)
-          value = "Submit Form";
-        elementList.add(new FormItem(name,value,ELEMENTCATEGORY_FREEFORM,true));
-      }
-      else if (lowerType.equals("hidden") || lowerType.equals("text") || lowerType.equals("password"))
-      {
-        String value = (String)attributes.get("value");
-        if (value == null)
-          value = "";
-        elementList.add(new FormItem(name,value,ELEMENTCATEGORY_FREEFORM,true));
-      }
-      else if (lowerType.equals("select"))
-      {
-        String value = (String)attributes.get("value");
-        if (value == null)
-          value = "";
-        String selected = (String)attributes.get("selected");
-        boolean isSelected = false;
-        if (selected != null)
-          isSelected = true;
-        String multiple = (String)attributes.get("multiple");
-        boolean isMultiple = false;
-        if (multiple != null)
-          isMultiple = true;
-        elementList.add(new FormItem(name,value,isMultiple?ELEMENTCATEGORY_FIXEDINCLUSIVE:ELEMENTCATEGORY_FIXEDEXCLUSIVE,isSelected));
-      }
-      else if (lowerType.equals("radio"))
-      {
-        String value = (String)attributes.get("value");
-        if (value == null)
-          value = "";
-        String selected = (String)attributes.get("checked");
-        boolean isSelected = false;
-        if (selected != null)
-          isSelected = true;
-        elementList.add(new FormItem(name,value,ELEMENTCATEGORY_FIXEDEXCLUSIVE,isSelected));
-      }
-      else if (lowerType.equals("checkbox"))
-      {
-        String value = (String)attributes.get("value");
-        if (value == null)
-          value = "";
-        String selected = (String)attributes.get("checked");
-        boolean isSelected = false;
-        if (selected != null)
-          isSelected = true;
-        elementList.add(new FormItem(name,value,ELEMENTCATEGORY_FIXEDINCLUSIVE,isSelected));
-      }
-      else if (lowerType.equals("textarea"))
-      {
-        elementList.add(new FormItem(name,"",ELEMENTCATEGORY_FREEFORM,true));
-      }
-    }
-  }
-
-  public void overrideActionURI(String overrideURI)
-  {
-    this.actionURI = overrideURI;
-  }
-  
-  public void applyOverrides(LoginParameters lp)
-  {
-    // This map contains the control names we have ALREADY wiped clean.
-    Map overrideMap = new HashMap();
-
-    // Override the specified elements with the specified values
-    int i = 0;
-    while (i < lp.getParameterCount())
-    {
-      Pattern namePattern = lp.getParameterNamePattern(i);
-      String value = lp.getParameterValue(i);
-      i++;
-
-      // For each parameter specified, go through the element list and do the right thing.  This will require us to keep some state around about
-      // what exactly we've done to the element list so far, so that each parameter rule in turn applies properly.
-      //
-      // Each rule regular expression will be deemed to apply to all matching controls.  If the rule matches the control name, then the precise behavior
-      // will depend on the type of the control.
-      //
-      // Controls can be categorized in the following way:
-      // - free-form value
-      // - specified exclusive value (e.g. radio button)
-      // - specified inclusive value (e.g. checkbox)
-      //
-      // For free-form values, the value given will simply override the value of the element.
-      // For exclusive controls, all values in the family will be disabled, and the value matching the one specified will be enabled.
-      // For inclusive controls, all values in the family will be cleared ONCE, and then subsequently the value matching the one specified will be enabled.
-      //
-      int j = 0;
-      while (j < elementList.size())
-      {
-        FormItem fi = (FormItem)elementList.get(j++);
-        Matcher m = namePattern.matcher(fi.getElementName());
-        if (m.find())
-        {
-          // Hey, it seems to apply!
-          switch (fi.getType())
-          {
-          case ELEMENTCATEGORY_FREEFORM:
-            // Override immediately
-            fi.setValue(value);
-            break;
-          case ELEMENTCATEGORY_FIXEDEXCLUSIVE:
-            // If it doesn't match the value, disable.
-            fi.setEnabled(fi.getElementValue().equals(value));
-            break;
-          case ELEMENTCATEGORY_FIXEDINCLUSIVE:
-            // Make sure we clear the entire control ONCE (and only once).
-            if (overrideMap.get(fi.getElementName()) == null)
-            {
-              // Zip through the entire list
-              int k = 0;
-              while (k < elementList.size())
-              {
-                FormItem fi2 = (FormItem)elementList.get(k++);
-                if (fi2.getElementName().equals(fi.getElementName()))
-                  fi.setEnabled(false);
-              }
-              overrideMap.put(fi.getElementName(),fi.getElementName());
-            }
-            if (fi.getElementValue().equals(value))
-              fi.setEnabled(true);
-          default:
-            break;
-          }
-        }
-      }
-    }
-  }
-
-  /** Get the full action URI for this form. */
-  public String getActionURI()
-  {
-    return actionURI;
-  }
-
-  /** Get the submit method for this form. */
-  public int getSubmitMethod()
-  {
-    return submitMethod;
-  }
-
-  /** Iterate over the active form data elements.  The returned iterator returns FormDataElement objects. */
-  public Iterator getElementIterator()
-  {
-    return new FormItemIterator(elementList);
-  }
-
-  /** Iterator over FormItems */
-  protected static class FormItemIterator implements Iterator
-  {
-    protected ArrayList elementList;
-    protected int currentIndex = 0;
-
-    public FormItemIterator(ArrayList elementList)
-    {
-      this.elementList = elementList;
-    }
-
-    public boolean hasNext()
-    {
-      while (true)
-      {
-        if (currentIndex == elementList.size())
-          return false;
-        if (((FormItem)elementList.get(currentIndex)).getEnabled() == false)
-          currentIndex++;
-        else
-          break;
-      }
-      return true;
-    }
-
-    public Object next()
-    {
-      while (true)
-      {
-        if (currentIndex == elementList.size())
-          throw new NoSuchElementException("No such element");
-        if (((FormItem)elementList.get(currentIndex)).getEnabled() == false)
-          currentIndex++;
-        else
-          break;
-      }
-      return elementList.get(currentIndex++);
-    }
-
-    public void remove()
-    {
-      throw new UnsupportedOperationException("Unsupported operation");
-    }
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormDataElement.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormDataElement.java
deleted file mode 100644
index 018ff66..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormDataElement.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id: FormDataElement.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-/** This interface describes individual form data elements, for form submission.
-*/
-public interface FormDataElement
-{
-  public static final String _rcsid = "@(#)$Id: FormDataElement.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the element name */
-  public String getElementName();
-
-  /** Get the element value */
-  public String getElementValue();
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormItem.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormItem.java
deleted file mode 100644
index 588c866..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormItem.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-/** This class provides an individual data item */
-public class FormItem implements FormDataElement
-{
-  protected String name;
-  protected String value;
-  protected boolean isEnabled;
-  protected int type;
-
-  public FormItem(String name, String value, int type, boolean isEnabled)
-  {
-    this.name = name;
-    this.value = value;
-    this.isEnabled = isEnabled;
-    this.type = type;
-  }
-
-  public void setEnabled(boolean enabled)
-  {
-    isEnabled = enabled;
-  }
-
-  public boolean getEnabled()
-  {
-    return isEnabled;
-  }
-
-  public void setValue(String value)
-  {
-    this.value = value;
-  }
-
-  public int getType()
-  {
-    return type;
-  }
-
-  /** Get the element name */
-  public String getElementName()
-  {
-    return name;
-  }
-
-  /** Get the element value */
-  public String getElementValue()
-  {
-    return value;
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormParseState.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormParseState.java
deleted file mode 100644
index ea97234..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/FormParseState.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.fuzzyml.*;
-import java.util.*;
-
-/** This class interprets the tag stream generated by the BasicParseState class, and keeps track of the form tags. */
-public class FormParseState extends LinkParseState
-{
-  // States for form handling.
-  protected final static int FORMPARSESTATE_NORMAL = 0;
-  protected final static int FORMPARSESTATE_IN_FORM = 1;
-  protected final static int FORMPARSESTATE_IN_SELECT = 2;
-  protected final static int FORMPARSESTATE_IN_TEXTAREA = 3;
-  protected final static int FORMPARSESTATE_IN_OPTION = 4;
-  
-  protected int formParseState = FORMPARSESTATE_NORMAL;
-  protected String selectName = null;
-  protected String selectMultiple = null;
-  protected String optionValue = null;
-  protected String optionSelected = null;
-  protected StringBuilder optionValueText = null;
-  
-  public FormParseState(IHTMLHandler handler)
-  {
-    super(handler);
-  }
-
-  // Override methods having to do with notification of tag discovery
-
-  @Override
-  protected boolean noteNonscriptTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (super.noteNonscriptTag(tagName,attributes))
-      return true;
-    switch (formParseState)
-    {
-    case FORMPARSESTATE_NORMAL:
-      if (tagName.equals("form"))
-      {
-        formParseState = FORMPARSESTATE_IN_FORM;
-        handler.noteFormStart(attributes);
-      }
-      break;
-    case FORMPARSESTATE_IN_FORM:
-      if (tagName.equals("input"))
-      {
-        String type = (String)attributes.get("type");
-        // We're only interested in form elements that can actually transmit data
-        if (type == null || (!type.toLowerCase(Locale.ROOT).equals("button")
-            && !type.toLowerCase(Locale.ROOT).equals("reset")
-            && !type.toLowerCase(Locale.ROOT).equals("image")))
-          handler.noteFormInput(attributes);
-      }
-      else if (tagName.equals("select"))
-      {
-        selectName = (String)attributes.get("name");
-        selectMultiple = (String)attributes.get("multiple");
-        formParseState = FORMPARSESTATE_IN_SELECT;
-      }
-      else if (tagName.equals("textarea"))
-      {
-        formParseState = FORMPARSESTATE_IN_TEXTAREA;
-        Map textareaMap = new HashMap();
-        textareaMap.put("type","textarea");
-        // Default value is too tough to meaningfully compute because of the embedded tags etc.  Known limitation.
-        textareaMap.put("value","");
-        handler.noteFormInput(textareaMap);
-      }
-      else if (tagName.equals("button"))
-      {
-        String type = (String)attributes.get("type");
-        if (type == null || type.toLowerCase(Locale.ROOT).equals("submit"))
-        {
-          // Same as input type="submit"
-          handler.noteFormInput(attributes);
-        }
-      }
-      else if (tagName.equals("isindex"))
-      {
-        Map indexMap = new HashMap();
-        indexMap.put("type","text");
-      }
-      break;
-    case FORMPARSESTATE_IN_SELECT:
-      if (tagName.equals("option"))
-      {
-        optionValue = (String)attributes.get("value");
-        optionSelected = (String)attributes.get("selected");
-        formParseState = FORMPARSESTATE_IN_OPTION;
-        // In case there's no end tag, if we have everything we need, do it now.
-        if (optionValue != null)
-        {
-          Map optionMap = new HashMap();
-          optionMap.put("type","select");
-          optionMap.put("name",selectName);
-          optionMap.put("multiple",selectMultiple);
-          optionMap.put("value",optionValue);
-          optionMap.put("selected",optionSelected);
-          handler.noteFormInput(optionMap);
-        }
-        else
-          optionValueText = new StringBuilder();
-      }
-      break;
-    case FORMPARSESTATE_IN_OPTION:
-      break;
-    case FORMPARSESTATE_IN_TEXTAREA:
-      break;
-    default:
-      throw new ManifoldCFException("Unknown form parse state: "+Integer.toString(formParseState));
-    }
-    return false;
-  }
-
-  @Override
-  protected boolean noteNonscriptEndTag(String tagName)
-    throws ManifoldCFException
-  {
-    if (super.noteNonscriptEndTag(tagName))
-      return true;
-    switch (formParseState)
-    {
-    case FORMPARSESTATE_NORMAL:
-      break;
-    case FORMPARSESTATE_IN_FORM:
-      if (tagName.equals("form"))
-      {
-        handler.noteFormEnd();
-        formParseState = FORMPARSESTATE_NORMAL;
-      }
-      break;
-    case FORMPARSESTATE_IN_SELECT:
-      formParseState = FORMPARSESTATE_IN_FORM;
-      selectName = null;
-      selectMultiple = null;
-      break;
-    case FORMPARSESTATE_IN_OPTION:
-      if (tagName.equals("option"))
-      {
-        // If we haven't already emitted the option, emit it now.
-        if (optionValueText != null)
-        {
-          Map optionMap = new HashMap();
-          optionMap.put("type","select");
-          optionMap.put("name",selectName);
-          optionMap.put("multiple",selectMultiple);
-          optionMap.put("value",optionValueText.toString());
-          optionMap.put("selected",optionSelected);
-          handler.noteFormInput(optionMap);
-        }
-        formParseState = FORMPARSESTATE_IN_SELECT;
-        optionSelected = null;
-        optionValue = null;
-        optionValueText = null;
-      }
-      break;
-    case FORMPARSESTATE_IN_TEXTAREA:
-      if (tagName.equals("textarea"))
-        formParseState = FORMPARSESTATE_IN_FORM;
-      break;
-    default:
-      throw new ManifoldCFException("Unknown form parse state: "+Integer.toString(formParseState));
-    }
-    return false;
-  }
-
-  @Override
-  protected boolean noteNormalCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    if (super.noteNormalCharacter(thisChar))
-      return true;
-    if (formParseState == FORMPARSESTATE_IN_OPTION)
-    {
-      if (optionValueText != null)
-        optionValueText.append(thisChar);
-    }
-    else
-      handler.noteTextCharacter(thisChar);
-    return false;
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IDiscoveredLinkHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IDiscoveredLinkHandler.java
deleted file mode 100644
index 4bc6c75..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IDiscoveredLinkHandler.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the functionality needed by a link extractor to note a discovered link.
-*/
-public interface IDiscoveredLinkHandler
-{
-  /** Inform the world of a discovered link.
-  *@param rawURL is the raw discovered url.  This may be relative, malformed, or otherwise unsuitable for use until final form is acheived.
-  */
-  public void noteDiscoveredLink(String rawURL)
-    throws ManifoldCFException;
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IHTMLHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IHTMLHandler.java
deleted file mode 100644
index 273383d..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IHTMLHandler.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes the functionality needed by an HTML processor in order to handle an HTML document.
-*/
-public interface IHTMLHandler extends IDiscoveredLinkHandler, IMetaTagHandler
-{
-  /** Note the start of a form */
-  public void noteFormStart(Map formAttributes)
-    throws ManifoldCFException;
-
-  /** Note an input tag */
-  public void noteFormInput(Map inputAttributes)
-    throws ManifoldCFException;
-
-  /** Note the end of a form */
-  public void noteFormEnd()
-    throws ManifoldCFException;
-
-  /** Note discovered href */
-  public void noteAHREF(String rawURL)
-    throws ManifoldCFException;
-
-  /** Note discovered href */
-  public void noteLINKHREF(String rawURL)
-    throws ManifoldCFException;
-
-  /** Note discovered IMG SRC */
-  public void noteIMGSRC(String rawURL)
-    throws ManifoldCFException;
-
-  /** Note discovered FRAME SRC */
-  public void noteFRAMESRC(String rawURL)
-    throws ManifoldCFException;
-
-  /** Note a character of text.
-  * Structured this way to keep overhead low for handlers that don't use text.
-  */
-  public void noteTextCharacter(char textCharacter)
-    throws ManifoldCFException;
-
-  /** Done with the document.
-  */
-  public void finishUp()
-    throws ManifoldCFException;
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IMetaTagHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IMetaTagHandler.java
deleted file mode 100644
index 8e3aa29..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IMetaTagHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes the functionality needed by a parser to handle metadata tags.
-*/
-public interface IMetaTagHandler
-{
-  /** Inform the world of a discovered metadata tag.
-  *@param tagAttributes are the attributes that belong to the tag.
-  */
-  public void noteMetaTag(Map tagAttributes)
-    throws ManifoldCFException;
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IRedirectionHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IRedirectionHandler.java
deleted file mode 100644
index 7cadc84..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IRedirectionHandler.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-/** This interface describes the functionality needed by an redirection processor in order to handle a redirection.
-*/
-public interface IRedirectionHandler extends IDiscoveredLinkHandler
-{
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IThrottledConnection.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IThrottledConnection.java
deleted file mode 100644
index c24b11a..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IThrottledConnection.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/* $Id: IThrottledConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** This interface represents an established connection to a URL.
-*/
-public interface IThrottledConnection
-{
-  public static final String _rcsid = "@(#)$Id: IThrottledConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Issue codes.
-  public static final int FETCH_NOT_TRIED = -1;
-  public static final int FETCH_CIRCULAR_REDIRECT = -100;
-  public static final int FETCH_BAD_URI = -101;
-  public static final int FETCH_SEQUENCE_ERROR = -102;
-  public static final int FETCH_IO_ERROR = -103;
-  public static final int FETCH_INTERRUPTED = -104;
-  public static final int FETCH_UNKNOWN_ERROR = -999;
-
-  /** Set the abort checker.  This must be done before the connection is actually used.
-  */
-  public void setAbortChecker(AbortChecker abortCheck);
-
-  /** Check whether the connection has expired.
-  *@param currentTime is the current time to use to judge if a connection has expired.
-  *@return true if the connection has expired, and should be closed.
-  */
-  public boolean hasExpired(long currentTime);
-
-  /** Begin the fetch process.
-  * @param fetchType is a short descriptive string describing the kind of fetch being requested.  This
-  *        is used solely for logging purposes.
-  */
-  public void beginFetch(String fetchType)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Execute the fetch and get the return code.  This method uses the
-  * standard logging mechanism to keep track of the fetch attempt.  It also
-  * signals the following conditions: ServiceInterruption (if a dynamic
-  * error occurs), or ManifoldCFException if a fatal error occurs, or nothing if
-  * a standard protocol error occurs.
-  * Note that, for proxies etc, the idea is for this fetch request to handle whatever
-  * redirections are needed to support proxies.
-  * @param urlPath is the path part of the url, e.g. "/robots.txt"
-  * @param userAgent is the value of the userAgent header to use.
-  * @param from is the value of the from header to use.
-  * @param redirectOK should be set to true if you want redirects to be automatically followed.
-  * @param host is the value to use as the "Host" header, or null to use the default.
-  * @param formData describes additional form arguments and how to fetch the page.
-  * @param loginCookies describes the cookies that should be in effect for this page fetch.
-  */
-  public void executeFetch(String urlPath, String userAgent, String from,
-    boolean redirectOK, String host, FormData formData,
-    LoginCookies loginCookies)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get the http response code.
-  *@return the response code.  This is either an HTTP response code, or one of the codes above.
-  */
-  public int getResponseCode()
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get the last fetch cookies.
-  *@return the cookies now in effect from the last fetch.
-  */
-  public LoginCookies getLastFetchCookies()
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get response headers
-  *@return a map keyed by header name containing a list of values.
-  */
-  public Map<String,List<String>> getResponseHeaders()
-    throws ManifoldCFException, ServiceInterruption;
-    
-  /** Get a specified response header, if it exists.
-  *@param headerName is the name of the header.
-  *@return the header value, or null if it doesn't exist.
-  */
-  public String getResponseHeader(String headerName)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get the response input stream.  It is the responsibility of the caller
-  * to close this stream when done.
-  */
-  public InputStream getResponseBodyStream()
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get limited response as a string.
-  */
-  public String getLimitedResponseBody(int maxSize, String encoding)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Note that the connection fetch was interrupted by something.
-  */
-  public void noteInterrupted(Throwable e);
-
-  /** Done with the fetch.  Call this when the fetch has been completed.  A log entry will be generated
-  * describing what was done.
-  */
-  public void doneFetch(IProcessActivity activities)
-    throws ManifoldCFException;
-
-  /** Close the connection.  Call this to return the connection to
-  * its pool.
-  */
-  public void close();
-  
-  /** Destroy the connection.  Call this to close the connection.
-  */
-  public void destroy();
-  
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IXMLHandler.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IXMLHandler.java
deleted file mode 100644
index c1cc33a..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/IXMLHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
- 
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the functionality needed by an XML processor in order to handle an XML document.
-*/
-public interface IXMLHandler extends IDiscoveredLinkHandler
-{
-  /** Inform the world of a discovered ttl value.
-  *@param rawTtlValue is the raw discovered ttl value.
-  */
-  public void noteDiscoveredTtlValue(String rawTtlValue)
-    throws ManifoldCFException;
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LinkParseState.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LinkParseState.java
deleted file mode 100644
index 1b87561..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LinkParseState.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.fuzzyml.*;
-import java.util.*;
-
-/** This class recognizes and interprets all links */
-public class LinkParseState extends MetaParseState
-{
-
-  protected IHTMLHandler handler;
-
-  public LinkParseState(IHTMLHandler handler)
-  {
-    super(handler);
-    this.handler = handler;
-  }
-
-  @Override
-  protected boolean noteNonscriptTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (super.noteNonscriptTag(tagName,attributes))
-      return true;
-    if (tagName.equals("a"))
-    {
-      String hrefValue = (String)attributes.get("href");
-      if (hrefValue != null && hrefValue.length() > 0)
-        handler.noteAHREF(hrefValue);
-    }
-    else if (tagName.equals("link"))
-    {
-      String hrefValue = (String)attributes.get("href");
-      if (hrefValue != null && hrefValue.length() > 0)
-        handler.noteLINKHREF(hrefValue);
-    }
-    else if (tagName.equals("img"))
-    {
-      String srcValue = (String)attributes.get("src");
-      if (srcValue != null && srcValue.length() > 0)
-        handler.noteIMGSRC(srcValue);
-    }
-    else if (tagName.equals("frame"))
-    {
-      String srcValue = (String)attributes.get("src");
-      if (srcValue != null && srcValue.length() > 0)
-        handler.noteFRAMESRC(srcValue);
-    }
-    return false;
-  }
-
-  @Override
-  public void finishUp()
-    throws ManifoldCFException
-  {
-    handler.finishUp();
-    super.finishUp();
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LoginCookies.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LoginCookies.java
deleted file mode 100644
index f8efa76..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LoginCookies.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id: LoginCookies.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.http.cookie.Cookie;
-
-/** This interface describes cookies obtained during sequential authentication.
-*/
-public interface LoginCookies
-{
-  public static final String _rcsid = "@(#)$Id: LoginCookies.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the cookie count */
-  public int getCookieCount();
-
-  /** Get the cookie name */
-  public Cookie getCookie(int index);
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LoginParameters.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LoginParameters.java
deleted file mode 100644
index a2525ce..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/LoginParameters.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id: LoginParameters.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.util.regex.*;
-
-/** This interface describes login parameters to be used to submit a page during sequential authentication.
-*/
-public interface LoginParameters
-{
-  public static final String _rcsid = "@(#)$Id: LoginParameters.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the override target URL.
-  */
-  public String getOverrideTargetURL();
-
-  /** Get the preferred redirection pattern.
-  */
-  public Pattern getPreferredRedirectionPattern();
-
-  /** Get the preferred link pattern.
-  */
-  public Pattern getPreferredLinkPattern();
-
-  /** Get the form name pattern.
-  */
-  public Pattern getFormNamePattern();
-
-  /** Get the content pattern.
-  */
-  public Pattern getContentPattern();
-  
-  /** Get the number of parameters.
-  */
-  public int getParameterCount();
-
-  /** Get the name of the i'th parameter.
-  */
-  public Pattern getParameterNamePattern(int index);
-
-  /** Get the desired value of the i'th parameter.
-  */
-  public String getParameterValue(int index);
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/Messages.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/Messages.java
deleted file mode 100644
index 806f1d2..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.webcrawler.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.webcrawler";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/MetaParseState.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/MetaParseState.java
deleted file mode 100644
index 0dc779f..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/MetaParseState.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.fuzzyml.*;
-import java.util.*;
-
-/** This class recognizes and interprets all meta tags */
-public class MetaParseState extends ScriptParseState
-{
-  protected IMetaTagHandler handler;
-
-  public MetaParseState(IMetaTagHandler handler)
-  {
-    super();
-    this.handler = handler;
-  }
-
-  @Override
-  protected boolean noteNonscriptTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (super.noteNonscriptTag(tagName,attributes))
-      return true;
-    if (tagName.equals("meta"))
-    {
-      handler.noteMetaTag(attributes);
-    }
-    return false;
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/PageCredentials.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/PageCredentials.java
deleted file mode 100644
index 19cb3fd..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/PageCredentials.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/* $Id: PageCredentials.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import org.apache.http.auth.Credentials;
-
-/** This interface describes immutable classes which represents authentication information for page-based authentication.
-*/
-public interface PageCredentials extends AuthenticationCredentials
-{
-  public static final String _rcsid = "@(#)$Id: PageCredentials.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Turn this instance into a Credentials object, given the specified target host name */
-  public Credentials makeCredentialsObject(String targetHostName)
-    throws ManifoldCFException;
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/RobotsManager.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/RobotsManager.java
deleted file mode 100644
index fa777e6..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/RobotsManager.java
+++ /dev/null
@@ -1,931 +0,0 @@
-/* $Id: RobotsManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-
-/** This class manages the database table into which we write robots.txt files for hosts.  The data resides in the database,
-* as well as in cache (up to a certain point).  The result is that there is a memory limited, database-backed repository
-* of robots files that we can draw on.
-* 
-* <br><br>
-* <b>robotsdata</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>hostname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
-* <tr><td>robotsdata</td><td>BIGINT</td><td></td></tr>
-* <tr><td>expirationtime</td><td>BLOB</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class RobotsManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: RobotsManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Robots cache class.  Only one needed.
-  protected static RobotsCacheClass robotsCacheClass = new RobotsCacheClass();
-
-  // Database fields
-  protected final static String hostField = "hostname";
-  protected final static String robotsField = "robotsdata";
-  protected final static String expirationField = "expirationtime";
-
-  // Cache manager.  This handle is set up during the constructor.
-  ICacheManager cacheManager;
-
-  /** Constructor.  Note that one robotsmanager handle is only useful within a specific thread context,
-  * so the calling connector object logic must recreate the handle whenever the thread context changes.
-  *@param tc is the thread context.
-  *@param database is the database handle.
-  */
-  public RobotsManager(IThreadContext tc, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"robotsdata");
-    cacheManager = CacheManagerFactory.make(tc);
-  }
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Standard practice: outer loop on install methods, no transactions
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the table.
-        HashMap map = new HashMap();
-        map.put(hostField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-        map.put(expirationField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(robotsField,new ColumnDescription("BLOB",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code, if needed, goes here
-      }
-
-      // Handle indexes, if needed
-
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-
-  /** Read robots.txt data from the cache or from the database.
-  *@param hostName is the host for which the data is desired.
-  *@param currentTime is the time of the check.
-  *@return null if the record needs to be fetched, true if fetch is allowed.
-  */
-  public Boolean checkFetchAllowed(String userAgent, String hostName, long currentTime, String pathString,
-    IProcessActivity activities)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    HostDescription[] objectDescriptions = new HostDescription[1];
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getRobotsKey(hostName));
-    objectDescriptions[0] = new HostDescription(hostName,new StringSet(ssb));
-
-    HostExecutor exec = new HostExecutor(this,activities,objectDescriptions[0]);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-
-    // We do the expiration check here, rather than in the query, so that caching
-    // is possible.
-    RobotsData rd = exec.getResults();
-    if (rd == null || rd.getExpirationTime() <= currentTime)
-      return null;
-    return new Boolean(rd.isFetchAllowed(userAgent,pathString));
-  }
-
-  /** Write robots.txt, replacing any existing row.
-  *@param hostName is the host.
-  *@param expirationTime is the time this data should expire.
-  *@param data is the robots data stream.  May be null.
-  */
-  public void writeRobotsData(String hostName, long expirationTime, InputStream data)
-    throws ManifoldCFException, IOException
-  {
-    TempFileInput tfi = null;
-    try
-    {
-      if (data != null)
-      {
-        try
-        {
-          tfi = new TempFileInput(data);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            throw e;
-          throw new IOException("Fetch failed: "+e.getMessage());
-        }
-      }
-
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getRobotsKey(hostName));
-      StringSet cacheKeys = new StringSet(ssb);
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-
-        beginTransaction();
-        try
-        {
-          // See whether the instance exists
-          ArrayList params = new ArrayList();
-          params.add(hostName);
-          IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-            hostField+"=?",params,null,null);
-          HashMap values = new HashMap();
-          values.put(expirationField,new Long(expirationTime));
-          if (tfi != null)
-            values.put(robotsField,tfi);
-          if (set.getRowCount() > 0)
-          {
-            // Update
-            params.clear();
-            params.add(hostName);
-            performUpdate(values," WHERE "+hostField+"=?",params,null);
-          }
-          else
-          {
-            // Insert
-            values.put(hostField,hostName);
-            // We only need the general key because this is new.
-            performInsert(values,null);
-          }
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      if (tfi != null)
-        tfi.discard();
-    }
-  }
-
-  // Protected methods and classes
-
-  /** Construct a key which represents an individual host name.
-  *@param hostName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getRobotsKey(String hostName)
-  {
-    return "ROBOTS_"+hostName;
-  }
-
-  /** Read robots data, if it exists.
-  *@return null if the data doesn't exist at all.  Return robots data if it does.
-  */
-  protected RobotsData readRobotsData(String hostName, IProcessActivity activities)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ArrayList list = new ArrayList();
-      list.add(hostName);
-      IResultSet set = performQuery("SELECT "+robotsField+","+expirationField+" FROM "+getTableName()+
-        " WHERE "+hostField+"=?",list,null,null);
-      if (set.getRowCount() == 0)
-        return null;
-      if (set.getRowCount() > 1)
-        throw new ManifoldCFException("Unexpected number of robotsdata rows matching '"+hostName+"': "+Integer.toString(set.getRowCount()));
-      IResultRow row = set.getRow(0);
-      long expiration = ((Long)row.getValue(expirationField)).longValue();
-      BinaryInput bi = (BinaryInput)row.getValue(robotsField);
-      if (bi == null)
-        return new RobotsData(null,expiration,hostName,activities);
-      try
-      {
-        InputStream is = bi.getStream();
-        return new RobotsData(is,expiration,hostName,activities);
-      }
-      finally
-      {
-        bi.discard();
-      }
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error reading robots data for "+hostName+": "+e.getMessage(),e);
-    }
-  }
-
-  /** Convert a string from the robots file into a readable form that does NOT contain NUL characters (since postgresql does not accept those).
-  */
-  protected static String makeReadable(String inputString)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < inputString.length())
-    {
-      char y = inputString.charAt(i++);
-      if (y >= ' ')
-        sb.append(y);
-      else
-      {
-        sb.append('^');
-        sb.append((char)(y + '@'));
-      }
-    }
-    return sb.toString();
-  }
-
-  /** This is a cached data item.
-  */
-  protected static class RobotsData
-  {
-    protected long expiration;
-    protected ArrayList records = null;
-
-    /** Constructor. */
-    public RobotsData(InputStream is, long expiration, String hostName, IProcessActivity activities)
-      throws IOException, ManifoldCFException
-    {
-      this.expiration = expiration;
-      if (is == null)
-      {
-        records = null;
-        return;
-      }
-      Reader r = new InputStreamReader(is, StandardCharsets.UTF_8);
-      try
-      {
-        BufferedReader br = new BufferedReader(r);
-        try
-        {
-          parseRobotsTxt(br,hostName,activities);
-        }
-        finally
-        {
-          br.close();
-        }
-      }
-      finally
-      {
-        r.close();
-      }
-    }
-
-    /** Check if fetch is allowed */
-    public boolean isFetchAllowed(String userAgent, String pathString)
-    {
-      if (records == null)
-        return true;
-
-      boolean wasDisallowed = false;
-      boolean wasAllowed = false;
-
-      // First matching user-agent takes precedence, according to the following chunk of spec:
-      // "These name tokens are used in User-agent lines in /robots.txt to
-      // identify to which specific robots the record applies. The robot
-      // must obey the first record in /robots.txt that contains a User-
-      // Agent line whose value contains the name token of the robot as a
-      // substring. The name comparisons are case-insensitive. If no such
-      // record exists, it should obey the first record with a User-agent
-      // line with a "*" value, if present. If no record satisfied either
-      // condition, or no records are present at all, access is unlimited."
-
-      boolean sawAgent = false;
-
-      String userAgentUpper = userAgent.toUpperCase(Locale.ROOT);
-
-      int i = 0;
-      while (i < records.size())
-      {
-        Record r = (Record)records.get(i++);
-        if (r.isAgentMatch(userAgentUpper,false))
-        {
-          if (r.isDisallowed(pathString))
-            wasDisallowed = true;
-          if (r.isAllowed(pathString))
-            wasAllowed = true;
-
-          sawAgent = true;
-          break;
-        }
-      }
-      if (sawAgent == false)
-      {
-        i = 0;
-        while (i < records.size())
-        {
-          Record r = (Record)records.get(i++);
-          if (r.isAgentMatch("*",true))
-          {
-            if (r.isDisallowed(pathString))
-              wasDisallowed = true;
-            if (r.isAllowed(pathString))
-              wasAllowed = true;
-
-            sawAgent = true;
-            break;
-          }
-        }
-      }
-
-      if (sawAgent == false)
-        return true;
-
-      // Allowed always overrides disallowed
-      if (wasAllowed)
-        return true;
-      if (wasDisallowed)
-        return false;
-
-      // No match -> crawl allowed
-      return true;
-    }
-
-    /** Get expiration */
-    public long getExpirationTime()
-    {
-      return expiration;
-    }
-
-    /** Parse the robots.txt file using a reader.
-    * Is NOT expected to close the stream.
-    */
-    protected void parseRobotsTxt(BufferedReader r, String hostName, IProcessActivity activities)
-      throws IOException, ManifoldCFException
-    {
-      boolean parseCompleted = false;
-      boolean robotsWasHtml = false;
-      boolean foundErrors = false;
-      String description = null;
-
-      long startParseTime = System.currentTimeMillis();
-      try
-      {
-        records = new ArrayList();
-        Record record = null;
-        boolean seenAction = false;
-        while (true)
-        {
-          String x = r.readLine();
-          if (x == null)
-            break;
-          int numSignPos = x.indexOf("#");
-          if (numSignPos != -1)
-            x = x.substring(0,numSignPos);
-          String lowercaseLine = x.toLowerCase(Locale.ROOT).trim();
-          if (lowercaseLine.startsWith("user-agent:"))
-          {
-            if (seenAction)
-            {
-              records.add(record);
-              record = null;
-              seenAction = false;
-            }
-            if (record == null)
-              record = new Record();
-
-            String agentName = x.substring("User-agent:".length()).trim();
-            record.addAgent(agentName);
-          }
-          else if (lowercaseLine.startsWith("user-agent"))
-          {
-            if (seenAction)
-            {
-              records.add(record);
-              record = null;
-              seenAction = false;
-            }
-            if (record == null)
-              record = new Record();
-
-            String agentName = x.substring("User-agent".length()).trim();
-            record.addAgent(agentName);
-          }
-          else if (lowercaseLine.startsWith("disallow:"))
-          {
-            if (record == null)
-            {
-              description = "Disallow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String disallowPath = x.substring("Disallow:".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (disallowPath.length() > 0)
-                record.addDisallow(disallowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("disallow"))
-          {
-            if (record == null)
-            {
-              description = "Disallow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String disallowPath = x.substring("Disallow".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (disallowPath.length() > 0)
-                record.addDisallow(disallowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("allow:"))
-          {
-            if (record == null)
-            {
-              description = "Allow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String allowPath = x.substring("Allow:".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (allowPath.length() > 0)
-                record.addAllow(allowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("allow"))
-          {
-            if (record == null)
-            {
-              description = "Allow without User-agent";
-              Logging.connectors.warn("Web: Bad robots.txt file format from '"+hostName+"': "+description);
-              foundErrors = true;
-            }
-            else
-            {
-              String allowPath = x.substring("Allow".length()).trim();
-              // The spec says that a blank disallow means let everything through.
-              if (allowPath.length() > 0)
-                record.addAllow(allowPath);
-              seenAction = true;
-            }
-          }
-          else if (lowercaseLine.startsWith("crawl-delay:"))
-          {
-            // We don't complain about this, but right now we don't listen to it either.
-          }
-          else if (lowercaseLine.startsWith("crawl-delay"))
-          {
-            // We don't complain about this, but right now we don't listen to it either.
-          }
-          else
-          {
-            // If it's not just a blank line, complain
-            if (x.trim().length() > 0)
-            {
-              String problemLine = makeReadable(x);
-              description = "Unknown robots.txt line: '"+problemLine+"'";
-              Logging.connectors.warn("Web: Unknown robots.txt line from '"+hostName+"': '"+problemLine+"'");
-              if (x.indexOf("<html") != -1 || x.indexOf("<HTML") != -1)
-              {
-                // Looks like some kind of an html file, probably as a result of a redirection, so just abort as if we have a page error
-                robotsWasHtml = true;
-                parseCompleted = true;
-                break;
-              }
-              foundErrors = true;
-            }
-          }
-        }
-        if (record != null)
-          records.add(record);
-        parseCompleted = true;
-      }
-      finally
-      {
-        // Log the fact that we attempted to parse robots.txt, as well as what happened
-        // These are the following situations we will report:
-        // (1) INCOMPLETE - Parsing did not complete - if the stream was interrupted
-        // (2) HTML - Robots was html - if the robots data seemed to be html
-        // (3) ERRORS - Robots had errors - if the robots data was accepted but had errors in it
-        // (4) SUCCESS - Robots parsed successfully - if the robots data was parsed without problem
-        String status;
-        if (parseCompleted)
-        {
-          if (robotsWasHtml)
-          {
-            status = "HTML";
-            description = "Robots file contained HTML, skipped";
-          }
-          else
-          {
-            if (foundErrors)
-            {
-              status = "ERRORS";
-              // description should already be set
-            }
-            else
-            {
-              status = "SUCCESS";
-              description = null;
-            }
-          }
-        }
-        else
-        {
-          status = "INCOMPLETE";
-          description = "Parsing was interrupted";
-        }
-
-        activities.recordActivity(new Long(startParseTime),WebcrawlerConnector.ACTIVITY_ROBOTSPARSE,
-          null,hostName,status,description,null);
-
-      }
-    }
-
-  }
-
-  /** Check if path matches specification */
-  protected static boolean doesPathMatch(String path, String spec)
-  {
-    // For robots 1.0, this function would do just this:
-    // return path.startsWith(spec);
-    // However, we implement the "google bot" spec, which allows wildcard matches that are, in fact, regular-expression-like in some ways.
-    // The "specification" can be found here: http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=40367
-    return doesPathMatch(path,0,spec,0);
-  }
-
-  /** Recursive method for matching specification to path. */
-  protected static boolean doesPathMatch(String path, int pathIndex, String spec, int specIndex)
-  {
-    while (true)
-    {
-      if (specIndex == spec.length())
-        // Hit the end of the specification!  We're done.
-        return true;
-      char specChar = spec.charAt(specIndex++);
-      if (specChar == '*')
-      {
-        // Found a specification wildcard.
-        // Eat up all the '*' characters at this position - otherwise each additional one increments the exponent of how long this can take,
-        // making denial-of-service via robots parsing a possibility.
-        while (specIndex < spec.length())
-        {
-          if (spec.charAt(specIndex) != '*')
-            break;
-          specIndex++;
-        }
-        // It represents zero or more characters, so we must recursively try for a match against all remaining characters in the path string.
-        while (true)
-        {
-          boolean match = doesPathMatch(path,pathIndex,spec,specIndex);
-          if (match)
-            return true;
-          if (path.length() == pathIndex)
-            // Nothing further to try, and no match
-            return false;
-          pathIndex++;
-          // Try again
-        }
-      }
-      else if (specChar == '$' && specIndex == spec.length())
-      {
-        // Found a specification end-of-path character.
-        // (It can only be legitimately the last character of the specification.)
-        return pathIndex == path.length();
-      }
-      if (pathIndex == path.length())
-        // Hit the end of the path! (but not the end of the specification!)
-        return false;
-      if (path.charAt(pathIndex) != specChar)
-        return false;
-      // On to the next match
-      pathIndex++;
-    }
-  }
-
-  /** This is the object description for a robots host object.
-  * This is the key that is used to look up cached data.
-  */
-  protected static class HostDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String hostName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public HostDescription(String hostName, StringSet invKeys)
-    {
-      super("robotscache");
-      this.hostName = hostName;
-      criticalSectionName = getClass().getName()+"-"+hostName;
-      cacheKeys = invKeys;
-    }
-
-    public String getHostName()
-    {
-      return hostName;
-    }
-
-    public int hashCode()
-    {
-      return hostName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof HostDescription))
-        return false;
-      HostDescription d = (HostDescription)o;
-      return d.hostName.equals(hostName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-    /** Get the object class for an object.  The object class is used to determine
-    * the group of objects treated in the same LRU manner.
-    * @return the newly created object's object class, or null if there is no
-    * such class, and LRU behavior is not desired.
-    */
-    public ICacheClass getObjectClass()
-    {
-      return robotsCacheClass;
-    }
-  }
-
-  /** Cache class for robots.
-  * An instance of this class describes the cache class for robots data caching.  There's
-  * only ever a need for one, so that will be created statically.
-  */
-  protected static class RobotsCacheClass implements ICacheClass
-  {
-    /** Get the name of the object class.
-    * This determines the set of objects that are treated in the same
-    * LRU pool.
-    *@return the class name.
-    */
-    public String getClassName()
-    {
-      // We count all the robot data, so this is a constant string.
-      return "ROBOTSCLASS";
-    }
-
-    /** Get the maximum LRU count of the object class.
-    *@return the maximum number of the objects of the particular class
-    * allowed.
-    */
-    public int getMaxLRUCount()
-    {
-      // Hardwired for the moment; 2000 robots data records will be cached,
-      // and no more.
-      return 2000;
-    }
-
-  }
-
-  /** This is the executor object for locating robots host objects.
-  * This object furnishes the operations the cache manager needs to rebuild objects that it needs that are
-  * not in the cache at the moment.
-  */
-  protected static class HostExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected RobotsManager thisManager;
-    protected RobotsData returnValue;
-    protected HostDescription thisHost;
-    protected IProcessActivity activities;
-
-    /** Constructor.
-    *@param manager is the RobotsManager class instance.
-    *@param objectDescription is the desired object description.
-    */
-    public HostExecutor(RobotsManager manager, IProcessActivity activities, HostDescription objectDescription)
-    {
-      super();
-      thisManager = manager;
-      this.activities = activities;
-      thisHost = objectDescription;
-      returnValue = null;
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instance.
-    */
-    public RobotsData getResults()
-    {
-      return returnValue;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // I'm not expecting multiple values to be request, so it's OK to walk through the objects
-      // and do a request at a time.
-      RobotsData[] rval = new RobotsData[objectDescriptions.length];
-      int i = 0;
-      while (i < rval.length)
-      {
-        HostDescription desc = (HostDescription)objectDescriptions[i];
-        // I need to cache both the data and the expiration date, and pick up both when I
-        // do the query.  This is because I don't want to cache based on request time, since that
-        // would screw up everything!
-        rval[i] = thisManager.readRobotsData(desc.getHostName(),activities);
-        i++;
-      }
-
-      return rval;
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      HostDescription objectDesc = (HostDescription)objectDescription;
-      RobotsData robotsData = (RobotsData)cachedObject;
-      if (objectDesc.equals(thisHost))
-        returnValue = robotsData;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-  /** This class represents a record in a robots.txt file.  It contains one or
-  * more user-agents, and one or more disallows.
-  */
-  protected static class Record
-  {
-    protected ArrayList userAgents = new ArrayList();
-    protected ArrayList disallows = new ArrayList();
-    protected ArrayList allows = new ArrayList();
-
-    /** Constructor.
-    */
-    public Record()
-    {
-    }
-
-    /** Add a user-agent.
-    */
-    public void addAgent(String agentName)
-    {
-      userAgents.add(agentName);
-    }
-
-    /** Add a disallow.
-    */
-    public void addDisallow(String disallowPath)
-    {
-      disallows.add(disallowPath);
-    }
-
-    /** Add an allow.
-    */
-    public void addAllow(String allowPath)
-    {
-      allows.add(allowPath);
-    }
-
-    /** See if user-agent matches.
-    */
-    public boolean isAgentMatch(String agentNameUpper, boolean exactMatch)
-    {
-      int i = 0;
-      while (i < userAgents.size())
-      {
-        String agent = ((String)userAgents.get(i++)).toUpperCase(Locale.ROOT);
-        if (exactMatch && agent.trim().equals(agentNameUpper))
-          return true;
-        if (!exactMatch && agentNameUpper.indexOf(agent) != -1)
-          return true;
-      }
-      return false;
-    }
-
-    /** See if path is disallowed.  Only called if user-agent has already
-    * matched.  (This checks if there's an explicit match with one of the
-    * Disallows clauses.)
-    */
-    public boolean isDisallowed(String path)
-    {
-      int i = 0;
-      while (i < disallows.size())
-      {
-        String disallow = (String)disallows.get(i++);
-        if (doesPathMatch(path,disallow))
-          return true;
-      }
-      return false;
-    }
-
-    /** See if path is allowed.  Only called if user-agent has already
-    * matched.  (This checks if there's an explicit match with one of the
-    * Allows clauses).
-    */
-    public boolean isAllowed(String path)
-    {
-      int i = 0;
-      while (i < allows.size())
-      {
-        String allow = (String)allows.get(i++);
-        if (doesPathMatch(path,allow))
-          return true;
-      }
-      return false;
-    }
-
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ScriptParseState.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ScriptParseState.java
deleted file mode 100644
index a3f3ae9..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ScriptParseState.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.fuzzyml.*;
-import java.util.*;
-
-/** This class interprets the tag stream generated by the HTMLParseState class, and causes script sections to be skipped */
-public class ScriptParseState extends HTMLParseState
-{
-  // Script tag parsing states
-  protected static final int SCRIPTPARSESTATE_NORMAL = 0;
-  protected static final int SCRIPTPARSESTATE_INSCRIPT = 1;
-
-  protected int scriptParseState = SCRIPTPARSESTATE_NORMAL;
-
-  public ScriptParseState()
-  {
-    super();
-  }
-
-  // Override methods having to do with notification of tag discovery
-
-  @Override
-  protected boolean noteTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (super.noteTag(tagName,attributes))
-      return true;
-    switch (scriptParseState)
-    {
-    case SCRIPTPARSESTATE_NORMAL:
-      if (tagName.equals("script"))
-        scriptParseState = SCRIPTPARSESTATE_INSCRIPT;
-      else
-        if (noteNonscriptTag(tagName,attributes))
-          return true;
-      break;
-    case SCRIPTPARSESTATE_INSCRIPT:
-      // Skip all tags until we see the end script one.
-      break;
-    default:
-      throw new ManifoldCFException("Unknown script parse state: "+Integer.toString(scriptParseState));
-    }
-    return false;
-  }
-
-  @Override
-  protected boolean noteTagEnd(String tagName)
-    throws ManifoldCFException
-  {
-    if (super.noteTagEnd(tagName))
-      return true;
-    switch (scriptParseState)
-    {
-    case SCRIPTPARSESTATE_NORMAL:
-      if (noteNonscriptEndTag(tagName))
-        return true;
-      break;
-    case SCRIPTPARSESTATE_INSCRIPT:
-      // Skip all tags until we see the end script one.
-      if (tagName.equals("script"))
-        scriptParseState = SCRIPTPARSESTATE_NORMAL;
-      break;
-    default:
-      break;
-    }
-    return false;
-  }
-
-  protected boolean noteNonscriptTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-  protected boolean noteNonscriptEndTag(String tagName)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/SequenceCredentials.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/SequenceCredentials.java
deleted file mode 100644
index d80cc11..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/SequenceCredentials.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id: SequenceCredentials.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes immutable classes which represents authentication information for sequence-based authentication.
-*/
-public interface SequenceCredentials extends AuthenticationCredentials
-{
-  public static final String _rcsid = "@(#)$Id: SequenceCredentials.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Fetch the unique key value for this particular credential.  (This is used to enforce the proper page ordering).
-  */
-  public String getSequenceKey();
-
-  /** For a given login page, specific information may need to be submitted to the server to properly log in.  This information
-  * is returned as an iterated list of LoginParameter objects.  The caller must decide which rule (if any) apply, and handle
-  * the case where more than one matching rule is found.
-  */
-  public Iterator findLoginParameters(String documentIdentifier)
-    throws ManifoldCFException;
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ThrottleDescription.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ThrottleDescription.java
deleted file mode 100644
index 561a202..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ThrottleDescription.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/* $Id: ThrottleDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** This class describes complex throttling criteria pulled from a configuration.
-* The data contained is organized by regular expression performed on a bin.  What we store
-* for each regular expression is a Pattern, for efficiency.
-*
-* This structure deals with bandwidth limits, maximum connection limits, and maximum fetch rate
-* limits.  Average fetch rate limits are handled in the infrastructure.
-*
-* Generally it is a good thing to limit the number of regexps that need to be evaluated against
-* any given bin value as much as possible.  For that reason I've organized this structure
-* accordingly.
-*/
-public class ThrottleDescription implements IThrottleSpec
-{
-  public static final String _rcsid = "@(#)$Id: ThrottleDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the hash that contains everything.  It's keyed by the regexp string itself.
-  * Values are ThrottleItem's. */
-  protected Map<String,ThrottleItem> patternHash = new HashMap<String,ThrottleItem>();
-
-  /** Constructor.  Build the description from the ConfigParams. */
-  public ThrottleDescription(ConfigParams configData)
-    throws ManifoldCFException
-  {
-    // Scan, looking for bin description nodes
-    int i = 0;
-    while (i < configData.getChildCount())
-    {
-      ConfigNode node = configData.getChild(i++);
-      if (node.getType().equals(WebcrawlerConfig.NODE_BINDESC))
-      {
-        // Get the bin regexp
-        String binDescription = node.getAttributeValue(WebcrawlerConfig.ATTR_BINREGEXP);
-        // Get the case sensitivity flag
-        String caseSensitive = node.getAttributeValue(WebcrawlerConfig.ATTR_INSENSITIVE);
-        boolean isInsensitive = false;
-        if (caseSensitive != null && caseSensitive.equalsIgnoreCase("true"))
-          isInsensitive = true;
-        // Now, go through this node's children looking for values we know about.
-        Integer maxConnectionCount = null;
-        Double minMillisecondsPerByte = null;
-        Long minMillisecondsPerFetch = null;
-        int j = 0;
-        while (j < node.getChildCount())
-        {
-          ConfigNode childNode = node.getChild(j++);
-          if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXCONNECTIONS))
-          {
-            String value = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            if (value != null)
-            {
-              try
-              {
-                maxConnectionCount = new Integer(value);
-              }
-              catch (NumberFormatException e)
-              {
-                throw new ManifoldCFException("Bad number",e);
-              }
-            }
-          }
-          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXKBPERSECOND))
-          {
-            String value = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            if (value != null)
-            {
-              try
-              {
-                double kbPerSecond = new Double(value).doubleValue();
-                if (kbPerSecond > 0)
-                  minMillisecondsPerByte = new Double(1.0/(double)kbPerSecond);
-              }
-              catch (NumberFormatException e)
-              {
-                throw new ManifoldCFException("Bad number",e);
-              }
-            }
-          }
-          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE))
-          {
-            String value = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            if (value != null)
-            {
-              try
-              {
-                double fetchesPerMinute = new Double(value).doubleValue();
-                if (fetchesPerMinute > 0)
-                  minMillisecondsPerFetch = new Long((long)(((double)60000.0)/(double)fetchesPerMinute));
-              }
-              catch (NumberFormatException e)
-              {
-                throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-              }
-            }
-          }
-        }
-        try
-        {
-          int flags = Pattern.UNICODE_CASE;
-          if (isInsensitive)
-            flags |= Pattern.CASE_INSENSITIVE;
-          Pattern p;
-          try
-          {
-            p = Pattern.compile(binDescription,flags);
-          }
-          catch (java.util.regex.PatternSyntaxException e)
-          {
-            throw new ManifoldCFException("Bin regular expression '"+binDescription+"' is illegal: "+e.getMessage(),e);
-          }
-          ThrottleItem ti = new ThrottleItem(p);
-          ti.setMaxOpenConnections(maxConnectionCount);
-          ti.setMinimumMillisecondsPerByte(minMillisecondsPerByte);
-          ti.setMinimumMillisecondsPerFetch(minMillisecondsPerFetch);
-          patternHash.put(binDescription,ti);
-        }
-        catch (PatternSyntaxException e)
-        {
-          throw new ManifoldCFException("Bad pattern syntax in '"+binDescription+"'",e);
-        }
-      }
-    }
-  }
-
-  /** Given a bin name, find the max open connections to use for that bin.
-  *@return Integer.MAX_VALUE if no limit found.
-  */
-  @Override
-  public int getMaxOpenConnections(String binName)
-  {
-    // Go through the regexps and match; for each match, find the maximum possible.
-    int maxCount = -1;
-    for (ThrottleItem ti : patternHash.values())
-    {
-      Integer limit = ti.getMaxOpenConnections();
-      if (limit != null)
-      {
-        Pattern p = ti.getPattern();
-        Matcher m = p.matcher(binName);
-        if (m.find())
-        {
-          if (maxCount == -1 || limit.intValue() > maxCount)
-            maxCount = limit.intValue();
-        }
-      }
-    }
-    if (maxCount == -1)
-      maxCount = Integer.MAX_VALUE;
-    else if (maxCount == 0)
-      maxCount = 1;
-    return maxCount;
-  }
-
-  /** Look up minimum milliseconds per byte for a bin.
-  *@return 0.0 if no limit found.
-  */
-  @Override
-  public double getMinimumMillisecondsPerByte(String binName)
-  {
-    // Go through the regexps and match; for each match, find the maximum possible.
-    double minMilliseconds = 0.0;
-    boolean seenSomething = false;
-    for (ThrottleItem ti : patternHash.values())
-    {
-      Double limit = ti.getMinimumMillisecondsPerByte();
-      if (limit != null)
-      {
-        Pattern p = ti.getPattern();
-        Matcher m = p.matcher(binName);
-        if (m.find())
-        {
-          if (seenSomething == false || limit.doubleValue() < minMilliseconds)
-          {
-            seenSomething = true;
-            minMilliseconds = limit.doubleValue();
-          }
-        }
-      }
-    }
-    return minMilliseconds;
-  }
-
-  /** Look up minimum milliseconds for a fetch for a bin.
-  *@return 0 if no limit found.
-  */
-  @Override
-  public long getMinimumMillisecondsPerFetch(String binName)
-  {
-    // Go through the regexps and match; for each match, find the maximum possible.
-    long minMilliseconds = 0L;
-    boolean seenSomething = false;
-    for (ThrottleItem ti : patternHash.values())
-    {
-      Long limit = ti.getMinimumMillisecondsPerFetch();
-      if (limit != null)
-      {
-        Pattern p = ti.getPattern();
-        Matcher m = p.matcher(binName);
-        if (m.find())
-        {
-          if (seenSomething == false || limit.longValue() < minMilliseconds)
-          {
-            seenSomething = true;
-            minMilliseconds = limit.longValue();
-          }
-        }
-      }
-    }
-    return minMilliseconds;
-  }
-
-  /** Class representing an individual throttle item.
-  */
-  protected static class ThrottleItem
-  {
-    /** The bin-matching pattern. */
-    protected final Pattern pattern;
-    /** The minimum milliseconds between bytes, or null if no limit. */
-    protected Double minimumMillisecondsPerByte = null;
-    /** The minimum milliseconds per fetch, or null if no limit */
-    protected Long minimumMillisecondsPerFetch = null;
-    /** The maximum open connections, or null if no limit. */
-    protected Integer maxOpenConnections = null;
-
-    /** Constructor. */
-    public ThrottleItem(Pattern p)
-    {
-      pattern = p;
-    }
-
-    /** Get the pattern. */
-    public Pattern getPattern()
-    {
-      return pattern;
-    }
-
-    /** Set minimum milliseconds per byte. */
-    public void setMinimumMillisecondsPerByte(Double value)
-    {
-      minimumMillisecondsPerByte = value;
-    }
-
-    /** Get minimum milliseconds per byte. */
-    public Double getMinimumMillisecondsPerByte()
-    {
-      return minimumMillisecondsPerByte;
-    }
-
-    /** Set minimum milliseconds per fetch */
-    public void setMinimumMillisecondsPerFetch(Long value)
-    {
-      minimumMillisecondsPerFetch = value;
-    }
-
-    /** Get minimum milliseconds per fetch */
-    public Long getMinimumMillisecondsPerFetch()
-    {
-      return minimumMillisecondsPerFetch;
-    }
-
-    /** Set maximum open connections. */
-    public void setMaxOpenConnections(Integer value)
-    {
-      maxOpenConnections = value;
-    }
-
-    /** Get maximum open connections. */
-    public Integer getMaxOpenConnections()
-    {
-      return maxOpenConnections;
-    }
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ThrottledFetcher.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ThrottledFetcher.java
deleted file mode 100644
index 9e217e8..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ThrottledFetcher.java
+++ /dev/null
@@ -1,2118 +0,0 @@
-/* $Id: ThrottledFetcher.java 989847 2010-08-26 17:52:30Z kwright $ */
-
-/**`
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.common.DeflateInputStream;
-import org.apache.manifoldcf.connectorcommon.common.XThreadInputStream;
-import org.apache.manifoldcf.connectorcommon.common.InterruptibleSocketFactory;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-import java.util.zip.GZIPInputStream;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.NameValuePair;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpHost;
-import org.apache.http.Header;
-import org.apache.http.HeaderElement;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.impl.cookie.BasicClientCookie;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.ClientCookie;
-import org.apache.http.cookie.CookieSpecProvider;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.impl.cookie.DefaultCookieSpec;
-import org.apache.http.impl.cookie.LaxBrowserCompatSpec;
-import org.apache.http.impl.cookie.RFC6265CookieSpecProvider;
-import org.apache.http.impl.cookie.BasicPathHandler;
-import org.apache.http.impl.cookie.LaxMaxAgeHandler;
-import org.apache.http.impl.cookie.BasicDomainHandler;
-import org.apache.http.impl.cookie.BasicSecureHandler;
-import org.apache.http.impl.cookie.LaxExpiresHandler;
-import org.apache.http.cookie.CookieSpec;
-import org.apache.http.client.CookieStore;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.cookie.CookieIdentityComparator;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.config.Registry;
-import org.apache.http.client.config.CookieSpecs;
-
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-
-/** This class uses httpclient to fetch stuff from webservers.  However, it additionally controls the fetch
-* rate in two ways: first, controlling the overall bandwidth used per server, and second, limiting the number
-* of simultaneous open connections per server.
-* An instance of this class would very probably need to have a lifetime consistent with the long-term nature
-* of these values, and be static.
-*/
-public class ThrottledFetcher
-{
-  public static final String _rcsid = "@(#)$Id: ThrottledFetcher.java 989847 2010-08-26 17:52:30Z kwright $";
-
-  /** Web throttle group type */
-  protected static final String webThrottleGroupType = "_WEB_";
-  
-  /** Idle timeout */
-  protected static final long idleTimeout = 300000L;
-  
-  /** This flag determines whether we record everything to the disk, as a means of doing a web snapshot */
-  protected static final boolean recordEverything = false;
-
-  protected static final long TIME_2HRS = 7200000L;
-  protected static final long TIME_5MIN = 300000L;
-  protected static final long TIME_15MIN = 1500000L;
-  protected static final long TIME_6HRS = 6L * 60L * 60000L;
-  protected static final long TIME_1DAY = 24L * 60L * 60000L;
-
-  /** The read chunk length */
-  protected static final int READ_CHUNK_LENGTH = 4096;
-
-  /** Connection pools.
-  /* This is a static hash of the connection pools in existence.  Each connection pool represents a set of identical connections. */
-  protected final static Map<ConnectionPoolKey,ConnectionPool> connectionPools = new HashMap<ConnectionPoolKey,ConnectionPool>();
-  
-  /** Current host name */
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (java.net.UnknownHostException e)
-    {
-    }
-  }
-
-  private static final Registry<CookieSpecProvider> cookieSpecRegistry =
-    RegistryBuilder.<CookieSpecProvider>create()
-      .register(CookieSpecs.STANDARD, new LaxBrowserCompatSpecProvider())
-      .build();
-
-  /** Constructor.  Private since we never instantiate.
-  */
-  private ThrottledFetcher()
-  {
-  }
-
-
-  /** Obtain a connection to specified protocol, server, and port.  We use the protocol because the
-  * setup for some protocols is extensive (e.g. https) and hopefully would not need to be repeated if
-  * we distinguish connections based on that.
-  *@param protocol is the protocol, e.g. "http"
-  *@param server is the server IP address, e.g. "10.32.65.1"
-  *@param port is the port to connect to, e.g. 80.  Pass -1 if the default port for the protocol is desired.
-  *@param authentication is the page credentials object to use for the fetch.  If null, no credentials are available.
-  *@param trustStore is the current trust store in effect for the fetch.
-  *@param binNames is the set of bins, in order, that should be used for throttling this connection.
-  *       Note that the bin names for a given IP address and port MUST be the same for every connection!
-  *       This must be enforced by whatever it is that builds the bins - it must do so given an IP and port.
-  *@param throttleDescription is the description of all the throttling that should take place.
-  *@param connectionLimit isthe maximum number of connections permitted.
-  *@return an IThrottledConnection object that can be used to fetch from the port.
-  */
-  public static IThrottledConnection getConnection(IThreadContext threadContext, String throttleGroupName,
-    String protocol, String server, int port,
-    PageCredentials authentication,
-    IKeystoreManager trustStore,
-    IThrottleSpec throttleDescription, String[] binNames,
-    int connectionLimit,
-    String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-    int socketTimeoutMilliseconds, int connectionTimeoutMilliseconds,
-    IAbortActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Get a throttle groups handle
-    IThrottleGroups throttleGroups = ThrottleGroupsFactory.make(threadContext);
-    
-    // Create the appropruate throttle group, or update the throttle description for an existing one
-    throttleGroups.createOrUpdateThrottleGroup(webThrottleGroupType,throttleGroupName,throttleDescription);
-    
-    // Create the https scheme and trust store string for this connection
-    javax.net.ssl.SSLSocketFactory baseFactory;
-    String trustStoreString;
-    if (trustStore != null)
-    {
-      baseFactory = trustStore.getSecureSocketFactory();
-      trustStoreString = trustStore.getHashString();
-    }
-    else
-    {
-      baseFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();
-      trustStoreString = null;
-    }
-
-    // Construct a connection pool key
-    ConnectionPoolKey poolKey = new ConnectionPoolKey(protocol,server,port,authentication,
-      trustStoreString,proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-      socketTimeoutMilliseconds,connectionTimeoutMilliseconds);
-    
-    ConnectionPool p;
-    synchronized (connectionPools)
-    {
-      p = connectionPools.get(poolKey);
-      if (p == null)
-      {
-        // Construct a new IConnectionThrottler.
-        IConnectionThrottler connectionThrottler =
-          throttleGroups.obtainConnectionThrottler(webThrottleGroupType,throttleGroupName,binNames);
-        p = new ConnectionPool(connectionThrottler,protocol,server,port,authentication,baseFactory,
-          proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-          socketTimeoutMilliseconds,connectionTimeoutMilliseconds);
-        connectionPools.put(poolKey,p);
-      }
-    }
-    
-    return p.grab(activities);
-  }
-
-  /** Flush connections that have timed out from inactivity. */
-  public static void flushIdleConnections(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Go through outstanding connection pools and clean them up.
-    synchronized (connectionPools)
-    {
-      for (ConnectionPool pool : connectionPools.values())
-      {
-        pool.flushIdleConnections();
-      }
-    }
-  }
-
-  /** Throttled connections.  Each instance of a connection describes the bins to which it belongs,
-  * along with the actual open connection itself, and the last time the connection was used. */
-  protected static class ThrottledConnection implements IThrottledConnection
-  {
-    /** Connection pool */
-    protected final ConnectionPool myPool;
-    /** Fetch throttler */
-    protected final IFetchThrottler fetchThrottler;
-    /** Protocol */
-    protected final String protocol;
-    /** Server */
-    protected final String server;
-    /** Port */
-    protected final int port;
-    /** Authentication */
-    protected final PageCredentials authentication;
-
-    /** This is when the connection will expire.  Only valid if connection is in the pool. */
-    protected long expireTime = -1L;
-
-    /** The http connection manager.  The pool is of size 1.  */
-    protected HttpClientConnectionManager connManager = null;
-    /** The http client object. */
-    protected HttpClient httpClient = null;
-    /** The method object */
-    protected HttpRequestBase fetchMethod = null;
-    /** The error trace, if any */
-    protected Throwable throwable = null;
-    /** The current URL being fetched */
-    protected String myUrl = null;
-    /** The status code fetched, if any */
-    protected int statusCode = FETCH_NOT_TRIED;
-    /** The kind of fetch we are doing */
-    protected String fetchType = null;
-    /** The current bytes in the current fetch */
-    protected long fetchCounter = 0L;
-    /** The start of the current fetch */
-    protected long startFetchTime = -1L;
-    /** The cookies from the last fetch */
-    protected LoginCookies lastFetchCookies = null;
-    /** Proxy host */
-    protected final String proxyHost;
-    /** Proxy port */
-    protected final int proxyPort;
-    /** Proxy auth domain */
-    protected final String proxyAuthDomain;
-    /** Proxy auth user name */
-    protected final String proxyAuthUsername;
-    /** Proxy auth password */
-    protected final String proxyAuthPassword;
-    /** Https protocol */
-    protected final javax.net.ssl.SSLSocketFactory httpsSocketFactory;
-    /** Socket timeout milliseconds */
-    protected final int socketTimeoutMilliseconds;
-    /** Connection timeout milliseconds */
-    protected final int connectionTimeoutMilliseconds;
-
-    /** The thread that is actually doing the work */
-    protected ExecuteMethodThread methodThread = null;
-    /** Set if thread has been started */
-    protected boolean threadStarted = false;
-    
-    /** Abort checker */
-    protected AbortChecker abortCheck = null;
-    
-    /** Constructor.  Create a connection with a specific server and port, and
-    * register it as active against all bins. */
-    public ThrottledConnection(ConnectionPool myPool, IFetchThrottler fetchThrottler,
-      String protocol, String server, int port, PageCredentials authentication,
-      javax.net.ssl.SSLSocketFactory httpsSocketFactory,
-      String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-      int socketTimeoutMilliseconds, int connectionTimeoutMilliseconds)
-    {
-      this.myPool = myPool;
-      this.fetchThrottler = fetchThrottler;
-      this.proxyHost = proxyHost;
-      this.proxyPort = proxyPort;
-      this.proxyAuthDomain = proxyAuthDomain;
-      this.proxyAuthUsername = proxyAuthUsername;
-      this.proxyAuthPassword = proxyAuthPassword;
-      this.protocol = protocol;
-      this.server = server;
-      this.port = port;
-      this.authentication = authentication;
-      this.httpsSocketFactory = httpsSocketFactory;
-      this.socketTimeoutMilliseconds = socketTimeoutMilliseconds;
-      this.connectionTimeoutMilliseconds = connectionTimeoutMilliseconds;
-    }
-
-    /** Set the abort checker.  This must be done before the connection is actually used.
-    */
-    @Override
-    public void setAbortChecker(AbortChecker abortCheck)
-    {
-      this.abortCheck = abortCheck;
-    }
-    
-    /** Check whether the connection has expired.
-    *@param currentTime is the current time to use to judge if a connection has expired.
-    *@return true if the connection has expired, and should be closed.
-    */
-    @Override
-    public boolean hasExpired(long currentTime)
-    {
-      if (connManager != null)
-      {
-        connManager.closeIdleConnections(idleTimeout, TimeUnit.MILLISECONDS);
-        connManager.closeExpiredConnections();
-      }
-      return (currentTime > expireTime);
-    }
-
-    /** Log the fetch of a number of bytes, from within a stream. */
-    public void logFetchCount(int count)
-    {
-      fetchCounter += (long)count;
-    }
-
-    /** Destroy the connection forever */
-    @Override
-    public void destroy()
-    {
-      // Kill the actual connection object.
-      if (connManager != null)
-      {
-        connManager.shutdown();
-        connManager = null;
-      }
-
-    }
-
-
-    /** Begin the fetch process.
-    * @param fetchType is a short descriptive string describing the kind of fetch being requested.  This
-    *        is used solely for logging purposes.
-    */
-    @Override
-    public void beginFetch(String fetchType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      this.fetchType = fetchType;
-      this.fetchCounter = 0L;
-      try
-      {
-        if (fetchThrottler.obtainFetchDocumentPermission(abortCheck) == false)
-          throw new IllegalStateException("Unexpected return value from obtainFetchDocumentPermission()");
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      catch (BreakException e)
-      {
-        abortCheck.rethrowExceptions();
-      }
-    }
-
-    /** Execute the fetch and get the return code.  This method uses the
-    * standard logging mechanism to keep track of the fetch attempt.  It also
-    * signals the following conditions: ServiceInterruption (if a dynamic
-    * error occurs), or ManifoldCFException if a fatal error occurs, or nothing if
-    * a standard protocol error occurs.
-    * Note that, for proxies etc, the idea is for this fetch request to handle whatever
-    * redirections are needed to support proxies.
-    * @param urlPath is the path part of the url, e.g. "/robots.txt"
-    * @param userAgent is the value of the userAgent header to use.
-    * @param from is the value of the from header to use.
-    * @param redirectOK should be set to true if you want redirects to be automatically followed.
-    * @param host is the value to use as the "Host" header, or null to use the default.
-    * @param formData describes additional form arguments and how to fetch the page.
-    * @param loginCookies describes the cookies that should be in effect for this page fetch.
-    */
-    @Override
-    public void executeFetch(String urlPath, String userAgent, String from,
-      boolean redirectOK, String host, FormData formData,
-      LoginCookies loginCookies)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // Set up scheme
-      SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeoutMilliseconds),
-        NoopHostnameVerifier.INSTANCE);
-
-      int hostPort;
-      String displayedPort;
-      if (port != -1)
-      {
-        if (!(protocol.equals("http") && port == 80) &&
-          !(protocol.equals("https") && port == 443))
-        {
-          displayedPort = ":"+Integer.toString(port);
-          hostPort = port;
-        }
-        else
-        {
-          displayedPort = "";
-          hostPort = -1;
-        }
-      }
-      else
-      {
-        displayedPort = "";
-        hostPort = -1;
-      }
-
-      StringBuilder sb = new StringBuilder(protocol);
-      sb.append("://").append(server).append(displayedPort).append(urlPath);
-      String fetchUrl = sb.toString();
-
-      HttpHost fetchHost = new HttpHost(server,hostPort,protocol);
-      HttpHost hostHost;
-      
-      if (host != null)
-      {
-        sb.setLength(0);
-        sb.append(protocol).append("://").append(host).append(displayedPort).append(urlPath);
-        myUrl = sb.toString();
-        hostHost = new HttpHost(host,hostPort,protocol);
-      }
-      else
-      {
-        myUrl = fetchUrl;
-        hostHost = fetchHost;
-      }
-      
-      if (connManager == null)
-      {
-        PoolingHttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-          .register("http", PlainConnectionSocketFactory.getSocketFactory())
-          .register("https", myFactory)
-          .build());
-        poolingConnManager.setDefaultMaxPerRoute(1);
-        poolingConnManager.setValidateAfterInactivity(2000);
-        poolingConnManager.setDefaultSocketConfig(SocketConfig.custom()
-          .setTcpNoDelay(true)
-          .setSoTimeout(socketTimeoutMilliseconds)
-          .build());
-        connManager = poolingConnManager;
-      }
-      
-      long startTime = 0L;
-      if (Logging.connectors.isDebugEnabled())
-      {
-        startTime = System.currentTimeMillis();
-        Logging.connectors.debug("WEB: Waiting for an HttpClient object");
-      }
-
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      // Set up authentication to use
-      if (authentication != null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: For "+myUrl+", discovered matching authentication credentials");
-        credentialsProvider.setCredentials(AuthScope.ANY,
-          authentication.makeCredentialsObject(host));
-      }
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-        .setCircularRedirectsAllowed(true)
-        .setSocketTimeout(socketTimeoutMilliseconds)
-        .setExpectContinueEnabled(true)
-        .setConnectTimeout(connectionTimeoutMilliseconds)
-        .setConnectionRequestTimeout(socketTimeoutMilliseconds)
-        .setCookieSpec(CookieSpecs.STANDARD)
-        .setRedirectsEnabled(redirectOK);
-
-      // If there's a proxy, set that too.
-      if (proxyHost != null && proxyHost.length() > 0)
-      {
-        // Configure proxy authentication
-        if (proxyAuthUsername != null && proxyAuthUsername.length() > 0)
-        {
-          credentialsProvider.setCredentials(
-            new AuthScope(proxyHost, proxyPort),
-            new NTCredentials(proxyAuthUsername, (proxyAuthPassword==null)?"":proxyAuthPassword, currentHost, (proxyAuthDomain==null)?"":proxyAuthDomain));
-        }
-
-        HttpHost proxy = new HttpHost(proxyHost, proxyPort);
-
-        requestBuilder.setProxy(proxy);
-      }
-
-
-      httpClient = HttpClients.custom()
-        .setConnectionManager(connManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setDefaultCredentialsProvider(credentialsProvider)
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeoutMilliseconds))
-        .setRedirectStrategy(new LaxRedirectStrategy())
-        .build();
-
-        /*
-        BasicHttpParams params = new BasicHttpParams();
-        params.setParameter(ClientPNames.DEFAULT_HOST,fetchHost);
-        params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true);
-        params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,true);
-        params.setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS,true);
-        // MEDIUM_SECURITY compatibility level not supported in HttpComponents.  Try BROWSER_NETSCAPE?
-        HttpClientParams.setCookiePolicy(params,CookiePolicy.BROWSER_COMPATIBILITY);
-        params.setBooleanParameter(CookieSpecPNames.SINGLE_COOKIE_HEADER,new Boolean(true));
-
-        DefaultHttpClient localHttpClient = new DefaultHttpClient(connManager,params);
-        // No retries
-        localHttpClient.setHttpRequestRetryHandler(new HttpRequestRetryHandler()
-          {
-            public boolean retryRequest(
-              IOException exception,
-              int executionCount,
-              HttpContext context)
-            {
-              return false;
-            }
-         
-          });
-        localHttpClient.setRedirectStrategy(new LaxRedirectStrategy());
-        localHttpClient.getCookieSpecs().register(CookiePolicy.BROWSER_COMPATIBILITY, new CookieSpecFactory()
-          {
-
-            public CookieSpec newInstance(HttpParams params)
-            {
-              return new LaxBrowserCompatSpec();
-            }
-    
-          }
-        );
-
-
-          
-        httpClient = localHttpClient;
-        */
-
-
-      // Set the parameters we haven't keyed on (so these can change from request to request)
-
-      if (host != null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: For "+myUrl+", setting virtual host to "+host);
-      }
-
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("WEB: Got an HttpClient object after "+new Long(System.currentTimeMillis()-startTime).toString()+" ms.");
-
-      startFetchTime = System.currentTimeMillis();
-
-      int pageFetchMethod = FormData.SUBMITMETHOD_GET;
-      if (formData != null)
-        pageFetchMethod = formData.getSubmitMethod();
-      switch (pageFetchMethod)
-      {
-      case FormData.SUBMITMETHOD_GET:
-        // MUST be just the path, or apparently we wind up resetting the HostConfiguration
-        // Add additional parameters to url path
-        String fullUrlPath;
-        if (formData != null)
-        {
-          StringBuilder psb = new StringBuilder(urlPath);
-          Iterator iter = formData.getElementIterator();
-          char appendChar;
-          if (urlPath.indexOf("?") == -1)
-            appendChar = '?';
-          else
-            appendChar = '&';
-
-            while (iter.hasNext())
-            {
-              FormDataElement el = (FormDataElement)iter.next();
-              psb.append(appendChar);
-              appendChar = '&';
-              String param = el.getElementName();
-              String value = el.getElementValue();
-              psb.append(URLEncoder.encode(param));
-              if (value != null)
-              {
-                psb.append('=').append(URLEncoder.encode(value));
-              }
-            }
-
-
-          fullUrlPath = psb.toString();
-        }
-        else
-        {
-          fullUrlPath = urlPath;
-        }
-        // Hack; apparently httpclient treats // as a protocol specifier and so it rips off the first section of the path in that case.
-        while (fullUrlPath.startsWith("//"))
-          fullUrlPath = fullUrlPath.substring(1);
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Get method for '"+fullUrlPath+"'");
-        fetchMethod = new HttpGet(fullUrlPath);
-        break;
-      case FormData.SUBMITMETHOD_POST:
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Post method for '"+urlPath+"'");
-        // MUST be just the path, or apparently we wind up resetting the HostConfiguration
-        HttpPost postMethod = new HttpPost(urlPath);
-        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
-
-        // Add parameters to post variables
-        if (formData != null)
-        {
-          Iterator iter = formData.getElementIterator();
-          while (iter.hasNext())
-          {
-            FormDataElement e = (FormDataElement)iter.next();
-            String param = e.getElementName();
-            String value = e.getElementValue();
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("WEB: Post parameter name '"+param+"' value '"+value+"' for '"+urlPath+"'");
-            nvps.add(new BasicNameValuePair(param,value));
-          }
-        }
-        postMethod.setEntity(new UrlEncodedFormEntity(nvps, StandardCharsets.UTF_8));
-        fetchMethod = postMethod;
-        break;
-      default:
-        throw new ManifoldCFException("Illegal method type: "+Integer.toString(pageFetchMethod));
-      }
-
-      // Set all appropriate headers and parameters
-      fetchMethod.setHeader(new BasicHeader("User-Agent",userAgent));
-      fetchMethod.setHeader(new BasicHeader("From",from));
-      fetchMethod.setHeader(new BasicHeader("Accept","*/*"));
-      fetchMethod.setHeader(new BasicHeader("Accept-Encoding","gzip,deflate"));
-
-      // Use a custom cookie store
-      CookieStore cookieStore = new OurBasicCookieStore();
-      // If we have any cookies to set, set them.
-      if (loginCookies != null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Adding "+Integer.toString(loginCookies.getCookieCount())+" cookies for '"+urlPath+"'");
-        int h = 0;
-        while (h < loginCookies.getCookieCount())
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB:  Cookie '"+loginCookies.getCookie(h)+"' added");
-          cookieStore.addCookie(loginCookies.getCookie(h++));
-        }
-      }
-
-
-      // Copy out the current cookies, in case the fetch fails
-      lastFetchCookies = loginCookies;
-
-      // Create the thread
-      methodThread = new ExecuteMethodThread(this, fetchThrottler, httpClient, hostHost, fetchMethod, cookieStore);
-      try
-      {
-        methodThread.start();
-        threadStarted = true;
-        try
-        {
-          statusCode = methodThread.getResponseCode();
-          lastFetchCookies = methodThread.getCookies();
-          switch (statusCode)
-          {
-          case HttpStatus.SC_REQUEST_TIMEOUT:
-          case HttpStatus.SC_GATEWAY_TIMEOUT:
-          case HttpStatus.SC_SERVICE_UNAVAILABLE:
-            // Temporary service interruption
-            // May want to make the retry time a parameter someday
-            long currentTime = System.currentTimeMillis();
-            throw new ServiceInterruption("Http response temporary error on '"+myUrl+"': "+Integer.toString(statusCode),new ManifoldCFException("Service unavailable (code "+Integer.toString(statusCode)+")"),
-              currentTime + TIME_2HRS, currentTime + TIME_1DAY, -1, false);
-          case HttpStatus.SC_UNAUTHORIZED:
-          case HttpStatus.SC_USE_PROXY:
-          case HttpStatus.SC_OK:
-          case HttpStatus.SC_GONE:
-          case HttpStatus.SC_NOT_FOUND:
-          case HttpStatus.SC_BAD_GATEWAY:
-          case HttpStatus.SC_BAD_REQUEST:
-          case HttpStatus.SC_FORBIDDEN:
-          case HttpStatus.SC_INTERNAL_SERVER_ERROR:
-          default:
-            return;
-          }
-        }
-        catch (InterruptedException e)
-        {
-          methodThread.interrupt();
-          methodThread = null;
-          threadStarted = false;
-          throw e;
-        }
-
-      }
-      catch (InterruptedException e)
-      {
-        // Drop the current connection on the floor, so it cannot be reused.
-        fetchMethod = null;
-        throwable = new ManifoldCFException("Interrupted: "+e.getMessage(),e);
-        statusCode = FETCH_INTERRUPTED;
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for IO for '"+myUrl+"': "+e.getMessage(), e, currentTime + TIME_5MIN,
-          currentTime + TIME_2HRS,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for connection for '"+myUrl+"': "+e.getMessage(), e, currentTime + TIME_5MIN,
-          currentTime + TIME_2HRS,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        //Logging.connectors.warn("IO interruption seen",e);
-        throwable = new ManifoldCFException("Interrupted: "+e.getMessage(),e);
-        statusCode = FETCH_INTERRUPTED;
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      catch (RedirectException e)
-      {
-        throwable = e;
-        statusCode = FETCH_CIRCULAR_REDIRECT;
-        return;
-      }
-      catch (NoHttpResponseException e)
-      {
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for response for '"+myUrl+"': "+e.getMessage(), e, currentTime + TIME_15MIN,
-          currentTime + TIME_2HRS,-1,false);
-      }
-      catch (java.net.ConnectException e)
-      {
-        throwable = e;
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out waiting for a connection for '"+myUrl+"': "+e.getMessage(), e, currentTime + TIME_2HRS,
-          currentTime + TIME_6HRS,-1,false);
-      }
-      catch (javax.net.ssl.SSLException e)
-      {
-        // Probably this is an incorrectly configured trust store
-        throwable = new ManifoldCFException("SSL handshake error: "+e.getMessage()+"; check your connection's Certificate configuration",e);
-        statusCode = FETCH_IO_ERROR;
-        return;
-      }
-      catch (IOException e)
-      {
-        // Treat this as a bad url.  We don't know what happened, but it isn't something we are going to naively
-        // retry on.
-        throwable = e;
-        statusCode = FETCH_IO_ERROR;
-        return;
-      }
-      catch (Throwable e)
-      {
-        Logging.connectors.debug("WEB: Caught an unexpected exception: "+e.getMessage(),e);
-        throwable = e;
-        statusCode = FETCH_UNKNOWN_ERROR;
-        return;
-      }
-
-    }
-
-    /** Get the http response code.
-    *@return the response code.  This is either an HTTP response code, or one of the codes above.
-    */
-    @Override
-    public int getResponseCode()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return statusCode;
-    }
-
-    /** Get the last fetch cookies.
-    *@return the cookies now in effect from the last fetch.
-    */
-    @Override
-    public LoginCookies getLastFetchCookies()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (Logging.connectors.isDebugEnabled())
-      {
-        Logging.connectors.debug("WEB: Retrieving cookies...");
-        for (int i = 0; i < lastFetchCookies.getCookieCount(); i++)
-        {
-          Logging.connectors.debug("WEB:   Cookie '"+lastFetchCookies.getCookie(i)+"'");
-        }
-      }
-      return lastFetchCookies;
-    }
-
-    /** Get response headers
-    *@return a map keyed by header name containing a list of values.
-    */
-    @Override
-    public Map<String,List<String>> getResponseHeaders()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (fetchMethod == null)
-        throw new ManifoldCFException("Attempt to get headers when there is no method");
-      if (methodThread == null || threadStarted == false)
-        throw new ManifoldCFException("Attempt to get headers when no method thread");
-      try
-      {
-        return methodThread.getResponseHeaders();
-      }
-      catch (InterruptedException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (HttpException e)
-      {
-        handleHTTPException(e,"reading headers");
-      }
-      catch (IOException e)
-      {
-        handleIOException(e,"reading headers");
-      }
-      return null;
-    }
-
-    /** Get a specified response header, if it exists.
-    *@param headerName is the name of the header.
-    *@return the header value, or null if it doesn't exist.
-    */
-    @Override
-    public String getResponseHeader(String headerName)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (fetchMethod == null)
-        throw new ManifoldCFException("Attempt to get a header when there is no method");
-      if (methodThread == null || threadStarted == false)
-        throw new ManifoldCFException("Attempt to get a header when no method thread");
-      try
-      {
-        return methodThread.getFirstHeader(headerName);
-      }
-      catch (InterruptedException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (HttpException e)
-      {
-        handleHTTPException(e,"reading header");
-      }
-      catch (IOException e)
-      {
-        handleIOException(e,"reading header");
-      }
-      return null;
-    }
-
-    /** Get the response input stream.  It is the responsibility of the caller
-    * to close this stream when done.
-    */
-    @Override
-    public InputStream getResponseBodyStream()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (fetchMethod == null)
-        throw new ManifoldCFException("Attempt to get an input stream when there is no method");
-      if (methodThread == null || threadStarted == false)
-        throw new ManifoldCFException("Attempt to get an input stream when no method thread");
-      try
-      {
-        InputStream bodyStream = methodThread.getSafeInputStream();
-        if (methodThread.isGZipStream())
-          bodyStream = new GZIPInputStream(bodyStream);
-        else if (methodThread.isDeflateStream())
-          bodyStream = new DeflateInputStream(bodyStream);
-        return bodyStream;
-      }
-      catch (InterruptedException e)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        handleIOException(e, "reading response stream");
-      }
-      catch (HttpException e)
-      {
-        handleHTTPException(e, "reading response stream");
-      }
-      return null;
-    }
-
-    /** Get limited response as a string.
-    */
-    @Override
-    public String getLimitedResponseBody(int maxSize, String encoding)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      try
-      {
-        InputStream is = getResponseBodyStream();
-        try
-        {
-          Reader r = new InputStreamReader(is,encoding);
-          char[] buffer = new char[maxSize];
-          int amt = r.read(buffer);
-          if (amt == -1)
-            return "";
-          return new String(buffer,0,amt);
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      catch (IOException e)
-      {
-        handleIOException(e,"reading limited response");
-      }
-      return null;
-    }
-
-    /** Note that the connection fetch was interrupted by something.
-    */
-    @Override
-    public void noteInterrupted(Throwable e)
-    {
-      if (statusCode > 0)
-      {
-        throwable = new ManifoldCFException("Fetch interrupted: "+e.getMessage(),e);
-        statusCode = FETCH_INTERRUPTED;
-      }
-    }
-
-    /** Done with the fetch.  Call this when the fetch has been completed.  A log entry will be generated
-    * describing what was done.
-    */
-    @Override
-    public void doneFetch(IProcessActivity activities)
-      throws ManifoldCFException
-    {
-      if (fetchType != null)
-      {
-        // Abort the connection, if not already complete
-        if (methodThread != null && threadStarted)
-          methodThread.abort();
-
-        long endTime = System.currentTimeMillis();
-
-        activities.recordActivity(new Long(startFetchTime),WebcrawlerConnector.ACTIVITY_FETCH,
-          new Long(fetchCounter),myUrl,Integer.toString(statusCode),(throwable==null)?null:throwable.getMessage(),null);
-
-        Logging.connectors.info("WEB: FETCH "+fetchType+"|"+myUrl+"|"+new Long(startFetchTime).toString()+"+"+new Long(endTime-startFetchTime).toString()+"|"+
-          Integer.toString(statusCode)+"|"+new Long(fetchCounter).toString()+"|"+((throwable==null)?"":(throwable.getClass().getName()+"| "+throwable.getMessage())));
-        if (throwable != null)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB: Fetch exception for '"+myUrl+"'",throwable);
-        }
-
-        // Shut down (join) the connection thread, if any, and if it started
-        if (methodThread != null)
-        {
-          if (threadStarted)
-          {
-            try
-            {
-              methodThread.finishUp();
-            }
-            catch (InterruptedException e)
-            {
-              throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-            }
-            threadStarted = false;
-          }
-          methodThread = null;
-        }
-        
-        fetchMethod = null;
-        throwable = null;
-        startFetchTime = -1L;
-        myUrl = null;
-        statusCode = FETCH_NOT_TRIED;
-        lastFetchCookies = null;
-        fetchType = null;
-      }
-
-    }
-
-    /** Close the connection.  Call this to return the connection to its pool.
-    */
-    @Override
-    public void close()
-    {
-      expireTime = System.currentTimeMillis() + idleTimeout;
-      myPool.release(this);
-    }
-    
-    protected void handleHTTPException(HttpException e, String activity)
-      throws ServiceInterruption, ManifoldCFException
-    {
-      long currentTime = System.currentTimeMillis();
-      Logging.connectors.debug("Web: HTTP exception "+activity+" for '"+myUrl+"', retrying");
-      throw new ServiceInterruption("HTTP exception "+activity+": "+e.getMessage(),e,currentTime+TIME_5MIN,-1L,2,false);
-    }
-
-    protected void handleIOException(IOException e, String activity)
-      throws ServiceInterruption, ManifoldCFException
-    {
-      if (e instanceof java.net.SocketTimeoutException)
-      {
-        long currentTime = System.currentTimeMillis();
-        Logging.connectors.debug("Web: Socket timeout exception "+activity+" for '"+myUrl+"', retrying");
-        throw new ServiceInterruption("Socket timeout exception "+activity+": "+e.getMessage(),e,currentTime+TIME_5MIN,-1L,2,false);
-      }
-      if (e instanceof ConnectTimeoutException)
-      {
-        long currentTime = System.currentTimeMillis();
-        Logging.connectors.debug("Web: Connect timeout exception "+activity+" for '"+myUrl+"', retrying");
-        throw new ServiceInterruption("Connect timeout exception "+activity+": "+e.getMessage(),e,currentTime+TIME_5MIN,-1L,2,false);
-      }
-      if (e instanceof InterruptedIOException)
-      {
-        methodThread.interrupt();
-        throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-      }
-      if (e instanceof NoHttpResponseException)
-      {
-        // Give up after 2 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out "+activity+" for '"+myUrl+"'", e, currentTime + 15L * 60000L,
-          currentTime + 120L * 60000L,-1,false);
-      }
-      if (e instanceof java.net.ConnectException)
-      {
-        // Give up after 6 hours.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Timed out "+activity+" for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      if (e instanceof java.net.NoRouteToHostException)
-      {
-        // This exception means we know the IP address but can't get there.  That's either a firewall issue, or it's something transient
-        // with the network.  Some degree of retry is probably wise.
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("No route to host during "+activity+" for '"+myUrl+"'", e, currentTime + 1000000L,
-          currentTime + 720L * 60000L,-1,false);
-      }
-      long currentTime = System.currentTimeMillis();
-      Logging.connectors.debug("Web: IO exception ("+e.getClass().getName()+")"+activity+" for '"+myUrl+"', retrying",e);
-      throw new ServiceInterruption("IO exception ("+e.getClass().getName()+")"+activity+": "+e.getMessage(),e,currentTime+TIME_5MIN,-1L,2,false);
-    }
-
-  }
-
-
-  /** This class throttles an input stream based on the specified byte rate parameters.  The
-  * throttling takes place across all streams that are open to the server in question.
-  */
-  protected static class ThrottledInputstream extends InputStream
-  {
-    /** Stream throttler */
-    protected final IStreamThrottler streamThrottler;
-    /** The throttled connection we belong to */
-    protected final ThrottledConnection throttledConnection;
-    /** The stream we are wrapping. */
-    protected final InputStream inputStream;
-
-    /** Constructor.
-    */
-    public ThrottledInputstream(IStreamThrottler streamThrottler, ThrottledConnection connection, InputStream is)
-    {
-      this.streamThrottler = streamThrottler;
-      this.throttledConnection = connection;
-      this.inputStream = is;
-    }
-
-    /** Read a byte.
-    */
-    @Override
-    public int read()
-      throws IOException
-    {
-      byte[] byteArray = new byte[1];
-      int count = read(byteArray,0,1);
-      if (count == -1)
-        return count;
-      return ((int)byteArray[0]) & 0xff;
-    }
-
-    /** Read lots of bytes.
-    */
-    @Override
-    public int read(byte[] b)
-      throws IOException
-    {
-      return read(b,0,b.length);
-    }
-
-    /** Read lots of specific bytes.
-    */
-    @Override
-    public int read(byte[] b, int off, int len)
-      throws IOException
-    {
-      int totalCount = 0;
-      while (len > ThrottledFetcher.READ_CHUNK_LENGTH)
-      {
-        int amt = basicRead(b,off,ThrottledFetcher.READ_CHUNK_LENGTH,totalCount);
-        if (amt == -1)
-        {
-          if (totalCount == 0)
-            return amt;
-          return totalCount;
-        }
-        totalCount += amt;
-        off += amt;
-        len -= amt;
-      }
-      if (len > 0)
-      {
-        int amt = basicRead(b,off,len,totalCount);
-        if (amt == -1)
-        {
-          if (totalCount == 0)
-            return amt;
-          return totalCount;
-        }
-        return totalCount + amt;
-      }
-      return totalCount;
-    }
-
-    /** Basic read, which uses the server object to throttle activity.
-    */
-    protected int basicRead(byte[] b, int off, int len, int totalSoFar)
-      throws IOException
-    {
-      try
-      {
-        if (streamThrottler.obtainReadPermission(len) == false)
-          throw new IllegalStateException("Unexpected result calling obtainReadPermission()");
-        int amt = 0;
-        try
-        {
-          amt = inputStream.read(b,off,len);
-          return amt;
-        }
-        finally
-        {
-          if (amt == -1)
-            streamThrottler.releaseReadPermission(len,0);
-          else
-          {
-            streamThrottler.releaseReadPermission(len,amt);
-            throttledConnection.logFetchCount(amt);
-          }
-        }
-      }
-      catch (InterruptedException e)
-      {
-        InterruptedIOException e2 = new InterruptedIOException("Interrupted");
-        e2.bytesTransferred = totalSoFar;
-        throw e2;
-      }
-    }
-
-    /** Skip
-    */
-    @Override
-    public long skip(long n)
-      throws IOException
-    {
-      // Not sure whether we should bother doing anything with this; it's not used.
-      return inputStream.skip(n);
-    }
-
-    /** Get available.
-    */
-    @Override
-    public int available()
-      throws IOException
-    {
-      return inputStream.available();
-    }
-
-    /** Mark.
-    */
-    @Override
-    public void mark(int readLimit)
-    {
-      inputStream.mark(readLimit);
-    }
-
-    /** Reset.
-    */
-    @Override
-    public void reset()
-      throws IOException
-    {
-      inputStream.reset();
-    }
-
-    /** Check if mark is supported.
-    */
-    @Override
-    public boolean markSupported()
-    {
-      return inputStream.markSupported();
-    }
-
-    /** Close.
-    */
-    @Override
-    public void close()
-      throws IOException
-    {
-      try
-      {
-        inputStream.close();
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        Logging.connectors.debug("Socket timeout exception trying to close connection: "+e.getMessage(),e);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        Logging.connectors.debug("Socket connection timeout exception trying to close connection: "+e.getMessage(),e);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw e;
-      }
-      catch (java.net.SocketException e)
-      {
-        Logging.connectors.debug("Connection reset while I was closing it: "+e.getMessage(),e);
-      }
-      catch (IOException e)
-      {
-        Logging.connectors.debug("IO Exception trying to close connection: "+e.getMessage(),e);
-      }
-      finally
-      {
-        streamThrottler.closeStream();
-      }
-    }
-
-  }
-
-  /** Pool exception class */
-  protected static class PoolException extends Exception
-  {
-    public PoolException(String message)
-    {
-      super(message);
-    }
-  }
-
-  /** Wait exception class */
-  protected static class WaitException extends Exception
-  {
-    protected long amt;
-
-    public WaitException(long amt)
-    {
-      super("Wait needed");
-      this.amt = amt;
-    }
-
-    public long getWaitAmount()
-    {
-      return amt;
-    }
-  }
-
-  /** Class to create a cookie spec.
-  */
-  protected static class LaxBrowserCompatSpecProvider extends RFC6265CookieSpecProvider
-  {
-    @Override
-    public CookieSpec create(HttpContext context)
-    {
-      return new LaxBrowserCompatSpec();
-    }
-  }
-
-  /** This thread does the actual socket communication with the server.
-  * It's set up so that it can be abandoned at shutdown time.
-  *
-  * The way it works is as follows:
-  * - it starts the transaction
-  * - it receives the response, and saves that for the calling class to inspect
-  * - it transfers the data part to an input stream provided to the calling class
-  * - it shuts the connection down
-  *
-  * If there is an error, the sequence is aborted, and an exception is recorded
-  * for the calling class to examine.
-  *
-  * The calling class basically accepts the sequence above.  It starts the
-  * thread, and tries to get a response code.  If instead an exception is seen,
-  * the exception is thrown up the stack.
-  */
-  protected static class ExecuteMethodThread extends Thread
-  {
-    /** The connection */
-    protected final ThrottledConnection theConnection;
-    /** The fetch throttler */
-    protected final IFetchThrottler fetchThrottler;
-    /** Client and method, all preconfigured */
-    protected final HttpClient httpClient;
-    protected final HttpHost target;
-    protected final HttpRequestBase executeMethod;
-    protected final CookieStore cookieStore;
-    
-    protected HttpResponse response = null;
-    protected Throwable responseException = null;
-    protected LoginCookies cookies = null;
-    protected Throwable cookieException = null;
-    protected XThreadInputStream threadStream = null;
-    protected InputStream bodyStream = null;
-    protected boolean streamCreated = false;
-    protected Throwable streamException = null;
-    protected boolean abortThread = false;
-    protected boolean gzip = false;
-    protected boolean deflate = false;
-
-    protected Throwable shutdownException = null;
-
-    protected Throwable generalException = null;
-    
-    public ExecuteMethodThread(ThrottledConnection theConnection, IFetchThrottler fetchThrottler,
-      HttpClient httpClient, HttpHost target, HttpRequestBase executeMethod, CookieStore cookieStore)
-    {
-      super();
-      setDaemon(true);
-      this.theConnection = theConnection;
-      this.fetchThrottler = fetchThrottler;
-      this.httpClient = httpClient;
-      this.target = target;
-      this.executeMethod = executeMethod;
-      this.cookieStore = cookieStore;
-    }
-
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          // Call the execute method appropriately
-          synchronized (this)
-          {
-            if (!abortThread)
-            {
-              try
-              {
-                HttpContext context = new BasicHttpContext();
-                context.setAttribute(HttpClientContext.COOKIE_STORE,cookieStore);
-                response = httpClient.execute(target,executeMethod,context);
-              }
-              catch (java.net.SocketTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (ConnectTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (InterruptedIOException e)
-              {
-                throw e;
-              }
-              catch (Throwable e)
-              {
-                responseException = e;
-              }
-              this.notifyAll();
-            }
-          }
-          
-          // Fetch the cookies
-          if (responseException == null)
-          {
-            synchronized (this)
-            {
-              if (!abortThread)
-              {
-                try
-                {
-                  cookies = new CookieSet(cookieStore.getCookies());
-                }
-                catch (Throwable e)
-                {
-                  cookieException = e;
-                }
-                this.notifyAll();
-              }
-            }
-          }
-
-          // Start the transfer of the content
-          if (cookieException == null && responseException == null)
-          {
-            synchronized (this)
-            {
-              if (!abortThread)
-              {
-                try
-                {
-                  Header ceheader = response.getEntity().getContentEncoding();
-                  if (ceheader != null)
-                  {
-                    HeaderElement[] codecs = ceheader.getElements();
-                    for (int i = 0; i < codecs.length; i++)
-                    {
-                      if (codecs[i].getName().equalsIgnoreCase("gzip"))
-                      {
-                        // GZIP
-                        gzip = true;
-                        break;
-                      }
-                      else if (codecs[i].getName().equalsIgnoreCase("deflate"))
-                      {
-                        // Deflate
-                        deflate = true;
-                        break;
-                      }
-                    }
-                  }
-                  bodyStream = response.getEntity().getContent();
-                  if (bodyStream != null)
-                  {
-                    bodyStream = new ThrottledInputstream(fetchThrottler.createFetchStream(),theConnection,bodyStream);
-                    threadStream = new XThreadInputStream(bodyStream);
-                  }
-                  streamCreated = true;
-                }
-                catch (java.net.SocketTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (ConnectTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (InterruptedIOException e)
-                {
-                  throw e;
-                }
-                catch (Throwable e)
-                {
-                  streamException = e;
-                }
-                this.notifyAll();
-              }
-            }
-          }
-          
-          if (cookieException == null && responseException == null && streamException == null)
-          {
-            if (threadStream != null)
-            {
-              // Stuff the content until we are done
-              threadStream.stuffQueue();
-            }
-          }
-          
-        }
-        finally
-        {
-          if (bodyStream != null)
-          {
-            try
-            {
-              bodyStream.close();
-            }
-            catch (IOException e)
-            {
-            }
-            bodyStream = null;
-          }
-          synchronized (this)
-          {
-            try
-            {
-              executeMethod.abort();
-            }
-            catch (Throwable e)
-            {
-              shutdownException = e;
-            }
-            this.notifyAll();
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        // We catch exceptions here that should ONLY be InterruptedExceptions, as a result of the thread being aborted.
-        this.generalException = e;
-      }
-    }
-
-    public int getResponseCode()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until the response object is there
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-            return response.getStatusLine().getStatusCode();
-          wait();
-        }
-      }
-    }
-
-    public Map<String,List<String>> getResponseHeaders()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait for the response object to appear
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-          {
-            Header[] headers = response.getAllHeaders();
-            Map<String,List<String>> rval = new HashMap<String,List<String>>();
-            int i = 0;
-            while (i < headers.length)
-            {
-              Header h = headers[i++];
-              String name = h.getName();
-              String value = h.getValue();
-              List<String> values = rval.get(name);
-              if (values == null)
-              {
-                values = new ArrayList<String>();
-                rval.put(name,values);
-              }
-              values.add(value);
-            }
-            return rval;
-          }
-          wait();
-        }
-      }
-
-    }
-    
-    public String getFirstHeader(String headerName)
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait for the response object to appear
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-          {
-            Header h = response.getFirstHeader(headerName);
-            if (h == null)
-              return null;
-            return h.getValue();
-          }
-          wait();
-        }
-      }
-    }
-
-    public LoginCookies getCookies()
-      throws InterruptedException, IOException, HttpException
-    {
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting cookies");
-          checkException(cookieException);
-          if (cookies != null)
-            return cookies;
-          wait();
-        }
-      }
-    }
-
-    public boolean isGZipStream()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          if (cookieException != null)
-            throw new IllegalStateException("Check for cookies before getting stream");
-          checkException(streamException);
-          if (streamCreated)
-            return gzip;
-          wait();
-        }
-      }
-    }    
-
-    public boolean isDeflateStream()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          if (cookieException != null)
-            throw new IllegalStateException("Check for cookies before getting stream");
-          checkException(streamException);
-          if (streamCreated)
-            return deflate;
-          wait();
-        }
-      }
-    }    
-    
-    public InputStream getSafeInputStream()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          if (cookieException != null)
-            throw new IllegalStateException("Check for cookies before getting stream");
-          checkException(streamException);
-          if (streamCreated)
-            return threadStream;
-          wait();
-        }
-      }
-    }
-    
-    public void abort()
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      synchronized (this)
-      {
-        if (streamCreated)
-        {
-          if (threadStream != null)
-            threadStream.abort();
-        }
-        abortThread = true;
-      }
-    }
-    
-    public void finishUp()
-      throws InterruptedException
-    {
-      join();
-    }
-    
-    protected synchronized void checkException(Throwable exception)
-      throws IOException, HttpException
-    {
-      if (exception != null)
-      {
-        // Throw the current exception, but clear it, so no further throwing is possible on the same problem.
-        Throwable e = exception;
-        if (e instanceof IOException)
-          throw (IOException)e;
-        else if (e instanceof HttpException)
-          throw (HttpException)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof Error)
-          throw (Error)e;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
-      }
-    }
-
-  }
-
-  protected static class OurBasicCookieStore implements CookieStore, Serializable {
-
-    private static final long serialVersionUID = -7581093305228232025L;
-
-    private final TreeSet<Cookie> cookies;
-
-    public OurBasicCookieStore() {
-      super();
-      this.cookies = new TreeSet<Cookie>(new CookieIdentityComparator());
-    }
-
-    /**
-     * Adds an {@link Cookie HTTP cookie}, replacing any existing equivalent cookies.
-     * If the given cookie has already expired it will not be added, but existing
-     * values will still be removed.
-     *
-     * @param cookie the {@link Cookie cookie} to be added
-     *
-     * @see #addCookies(Cookie[])
-     *
-     */
-    public synchronized void addCookie(Cookie cookie) {
-      if (cookie != null) {
-        // first remove any old cookie that is equivalent
-        cookies.remove(cookie);
-        cookies.add(cookie);
-      }
-    }
-
-    /**
-     * Adds an array of {@link Cookie HTTP cookies}. Cookies are added individually and
-     * in the given array order. If any of the given cookies has already expired it will
-     * not be added, but existing values will still be removed.
-     *
-     * @param cookies the {@link Cookie cookies} to be added
-     *
-     * @see #addCookie(Cookie)
-     *
-     */
-    public synchronized void addCookies(Cookie[] cookies) {
-      if (cookies != null) {
-        for (Cookie cooky : cookies) {
-          this.addCookie(cooky);
-        }
-      }
-    }
-
-    /**
-     * Returns an immutable array of {@link Cookie cookies} that this HTTP
-     * state currently contains.
-     *
-     * @return an array of {@link Cookie cookies}.
-     */
-    public synchronized List<Cookie> getCookies() {
-      //create defensive copy so it won't be concurrently modified
-      return new ArrayList<Cookie>(cookies);
-    }
-
-    /**
-     * Removes all of {@link Cookie cookies} in this HTTP state
-     * that have expired by the specified {@link java.util.Date date}.
-     *
-     * @return true if any cookies were purged.
-     *
-     * @see Cookie#isExpired(Date)
-     */
-    public synchronized boolean clearExpired(final Date date) {
-      if (date == null) {
-        return false;
-      }
-      boolean removed = false;
-      for (Iterator<Cookie> it = cookies.iterator(); it.hasNext();) {
-        if (it.next().isExpired(date)) {
-          it.remove();
-            removed = true;
-        }
-      }
-      return removed;
-    }
-
-    /**
-     * Clears all cookies.
-     */
-    public synchronized void clear() {
-      cookies.clear();
-    }
-
-    @Override
-    public synchronized String toString() {
-      return cookies.toString();
-    }
-
-  }
-
-  /** Connection pool key */
-  protected static class ConnectionPoolKey
-  {
-    protected final String protocol;
-    protected final String server;
-    protected final int port;
-    protected final PageCredentials authentication;
-    protected final String trustStoreString;
-    protected final String proxyHost;
-    protected final int proxyPort;
-    protected final String proxyAuthDomain;
-    protected final String proxyAuthUsername;
-    protected final String proxyAuthPassword;
-    protected final int socketTimeoutMilliseconds;
-    protected final int connectionTimeoutMilliseconds;
-    
-    public ConnectionPoolKey(String protocol,
-      String server, int port, PageCredentials authentication,
-      String trustStoreString, String proxyHost, int proxyPort,
-      String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-      int socketTimeoutMilliseconds, int connectionTimeoutMilliseconds)
-    {
-      this.protocol = protocol;
-      this.server = server;
-      this.port = port;
-      this.authentication = authentication;
-      this.trustStoreString = trustStoreString;
-      this.proxyHost = proxyHost;
-      this.proxyPort = proxyPort;
-      this.proxyAuthDomain = proxyAuthDomain;
-      this.proxyAuthUsername = proxyAuthUsername;
-      this.proxyAuthPassword = proxyAuthPassword;
-      this.socketTimeoutMilliseconds = socketTimeoutMilliseconds;
-      this.connectionTimeoutMilliseconds = connectionTimeoutMilliseconds;
-    }
-    
-    public int hashCode()
-    {
-      return protocol.hashCode() +
-        server.hashCode() +
-        (port * 31) +
-        ((authentication==null)?0:authentication.hashCode()) +
-        ((trustStoreString==null)?0:trustStoreString.hashCode()) +
-        ((proxyHost==null)?0:proxyHost.hashCode()) +
-        (proxyPort * 29) +
-        ((proxyAuthDomain==null)?0:proxyAuthDomain.hashCode()) +
-        ((proxyAuthUsername==null)?0:proxyAuthUsername.hashCode()) +
-        ((proxyAuthPassword==null)?0:proxyAuthPassword.hashCode()) +
-        new Integer(socketTimeoutMilliseconds).hashCode() +
-        new Integer(connectionTimeoutMilliseconds).hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ConnectionPoolKey))
-        return false;
-      ConnectionPoolKey other = (ConnectionPoolKey)o;
-      if (!server.equals(other.server) ||
-        port != other.port)
-        return false;
-      if (authentication == null || other.authentication == null)
-      {
-        if (authentication != other.authentication)
-          return false;
-      }
-      else
-      {
-        if (!authentication.equals(other.authentication))
-          return false;
-      }
-      if (trustStoreString == null || other.trustStoreString == null)
-      {
-        if (trustStoreString != other.trustStoreString)
-          return false;
-      }
-      else
-      {
-        if (!trustStoreString.equals(other.trustStoreString))
-          return false;
-      }
-      if (proxyHost == null || other.proxyHost == null)
-      {
-        if (proxyHost != other.proxyHost)
-          return false;
-      }
-      else
-      {
-        if (!proxyHost.equals(other.proxyHost))
-          return false;
-      }
-      if (proxyPort != other.proxyPort)
-        return false;
-      if (proxyAuthDomain == null || other.proxyAuthDomain == null)
-      {
-        if (proxyAuthDomain != other.proxyAuthDomain)
-          return false;
-      }
-      else
-      {
-        if (!proxyAuthDomain.equals(other.proxyAuthDomain))
-          return false;
-      }
-      if (proxyAuthUsername == null || other.proxyAuthUsername == null)
-      {
-        if (proxyAuthUsername != other.proxyAuthUsername)
-          return false;
-      }
-      else
-      {
-        if (!proxyAuthUsername.equals(other.proxyAuthUsername))
-          return false;
-      }
-      if (proxyAuthPassword == null || other.proxyAuthPassword == null)
-      {
-        if (proxyAuthPassword != other.proxyAuthPassword)
-          return false;
-      }
-      else
-      {
-        if (!proxyAuthPassword.equals(other.proxyAuthPassword))
-          return false;
-      }
-      return socketTimeoutMilliseconds == other.socketTimeoutMilliseconds &&
-        connectionTimeoutMilliseconds == other.connectionTimeoutMilliseconds;
-    }
-  }
-  
-  /** Each connection pool has identical connections we can draw on.
-  */
-  protected static class ConnectionPool
-  {
-    /** Throttler */
-    protected final IConnectionThrottler connectionThrottler;
-    
-    // If we need to create a connection, these are what we use
-    
-    protected final String protocol;
-    protected final String server;
-    protected final int port;
-    protected final PageCredentials authentication;
-    protected final javax.net.ssl.SSLSocketFactory baseFactory;
-    protected final String proxyHost;
-    protected final int proxyPort;
-    protected final String proxyAuthDomain;
-    protected final String proxyAuthUsername;
-    protected final String proxyAuthPassword;
-    protected final int socketTimeoutMilliseconds;
-    protected final int connectionTimeoutMilliseconds;
-
-    /** The actual pool of connections */
-    protected final List<IThrottledConnection> connections = new ArrayList<IThrottledConnection>();
-    
-    public ConnectionPool(IConnectionThrottler connectionThrottler,
-      String protocol,
-      String server, int port, PageCredentials authentication,
-      javax.net.ssl.SSLSocketFactory baseFactory,
-      String proxyHost, int proxyPort,
-      String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword,
-      int socketTimeoutMilliseconds, int connectionTimeoutMilliseconds)
-    {
-      this.connectionThrottler = connectionThrottler;
-      
-      this.protocol = protocol;
-      this.server = server;
-      this.port = port;
-      this.authentication = authentication;
-      this.baseFactory = baseFactory;
-      this.proxyHost = proxyHost;
-      this.proxyPort = proxyPort;
-      this.proxyAuthDomain = proxyAuthDomain;
-      this.proxyAuthUsername = proxyAuthUsername;
-      this.proxyAuthPassword = proxyAuthPassword;
-      this.socketTimeoutMilliseconds = socketTimeoutMilliseconds;
-      this.connectionTimeoutMilliseconds = connectionTimeoutMilliseconds;
-    }
-    
-    public IThrottledConnection grab(IAbortActivity activities)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      AbortChecker abortCheck = new AbortChecker(activities);
-      try
-      {
-        // Wait for a connection
-        IThrottledConnection connection;
-        int result = connectionThrottler.waitConnectionAvailable(abortCheck);
-        if (result == IConnectionThrottler.CONNECTION_FROM_POOL)
-        {
-          // We are guaranteed to have a connection in the pool, unless there's a coding error.
-          synchronized (connections)
-          {
-            connection = connections.remove(connections.size()-1);
-          }
-        }
-        else if (result == IConnectionThrottler.CONNECTION_FROM_CREATION)
-        {
-          connection = new ThrottledConnection(this,connectionThrottler.getNewConnectionFetchThrottler(),
-            protocol,server,port,authentication,baseFactory,
-            proxyHost,proxyPort,
-            proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-            socketTimeoutMilliseconds,connectionTimeoutMilliseconds);
-        }
-        else
-          throw new IllegalStateException("Unexpected return value from waitConnectionAvailable(): "+result);
-        connection.setAbortChecker(abortCheck);
-        return connection;
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),ManifoldCFException.INTERRUPTED);
-      }
-      catch (BreakException e)
-      {
-        abortCheck.rethrowExceptions();
-        return null;
-      }
-    }
-    
-    public void release(IThrottledConnection connection)
-    {
-      if (connectionThrottler.noteReturnedConnection())
-      {
-        // Destroy this connection
-        connection.destroy();
-        connectionThrottler.noteConnectionDestroyed();
-      }
-      else
-      {
-        // Return to pool
-        connection.setAbortChecker(null);
-        synchronized (connections)
-        {
-          connections.add(connection);
-        }
-        connectionThrottler.noteConnectionReturnedToPool();
-      }
-    }
-    
-    public void flushIdleConnections()
-    {
-      long currentTime = System.currentTimeMillis();
-      // First, remove connections that are over the quota
-      while (connectionThrottler.checkDestroyPooledConnection())
-      {
-        // Destroy the oldest ones first
-        IThrottledConnection connection;
-        synchronized (connections)
-        {
-          connection = connections.remove(0);
-        }
-        connection.destroy();
-        connectionThrottler.noteConnectionDestroyed();
-      }
-      // Now, get rid of expired connections
-      while (true)
-      {
-        boolean expired;
-        synchronized (connections)
-        {
-          expired = connections.size() > 0 && connections.get(0).hasExpired(currentTime);
-        }
-        if (!expired)
-          break;
-        // We found an expired connection!  Now tell the throttler that, and see if it agrees.
-        if (connectionThrottler.checkExpireConnection())
-        {
-          // Remove a connection from the pool, and destroy it.
-          // It's not guaranteed to be an expired one, but that's a rare occurrence, we expect.
-          IThrottledConnection connection;
-          synchronized (connections)
-          {
-            connection = connections.remove(0);
-          }
-          connection.destroy();
-          connectionThrottler.noteConnectionDestroyed();
-        }
-        else
-          break;
-      }
-    }
-    
-  }
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/TrustsDescription.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/TrustsDescription.java
deleted file mode 100644
index cf38f5d..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/TrustsDescription.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/* $Id: TrustsDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-import java.util.regex.*;
-
-/** This class describes trust information pulled from a configuration.
-* The data contained is organized by regular expression performed on a url.  What we store
-* for each regular expression is a Pattern, for efficiency.
-*
-* This structure deals with trusts as applied to a matching set of urls.
-*
-* Generally it is a good thing to limit the number of regexps that need to be evaluated against
-* any given url value as much as possible.  For that reason I've organized this structure
-* accordingly.
-*/
-public class TrustsDescription
-{
-  public static final String _rcsid = "@(#)$Id: TrustsDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the hash that contains everything.  It's keyed by the regexp string itself.
-  * Values are TrustsItem objects. */
-  protected HashMap patternHash = new HashMap();
-
-  /** Constructor.  Build the description from the ConfigParams. */
-  public TrustsDescription(ConfigParams configData)
-    throws ManifoldCFException
-  {
-    // Scan, looking for bin description nodes
-    int i = 0;
-    while (i < configData.getChildCount())
-    {
-      ConfigNode node = configData.getChild(i++);
-      if (node.getType().equals(WebcrawlerConfig.NODE_TRUST))
-      {
-        // Get the url regexp
-        String urlDescription = node.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-        String trustEverything = node.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTEVERYTHING);
-        try
-        {
-          Pattern p;
-          try
-          {
-            p = Pattern.compile(urlDescription,Pattern.UNICODE_CASE);
-          }
-          catch (java.util.regex.PatternSyntaxException e)
-          {
-            throw new ManifoldCFException("Trust regular expression '"+urlDescription+"' is illegal: "+e.getMessage(),e);
-          }
-          if (trustEverything != null && trustEverything.equals("true"))
-          {
-            TrustsItem ti = new TrustsItem(p,null);
-            patternHash.put(urlDescription,ti);
-          }
-          else
-          {
-            String trustStore = node.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTSTORE);
-            TrustsItem ti = new TrustsItem(p,trustStore);
-            patternHash.put(urlDescription,ti);
-          }
-        }
-        catch (PatternSyntaxException e)
-        {
-          throw new ManifoldCFException("Bad pattern syntax in '"+urlDescription+"': "+e.getMessage(),e);
-        }
-      }
-    }
-  }
-
-  /** Given a URL, build the right trust certificate store, or return null if all certs should be accepted.
-  */
-  public IKeystoreManager getTrustStore(String url)
-    throws ManifoldCFException
-  {
-    IKeystoreManager rval = KeystoreManagerFactory.make("");
-
-    int certNumber = 0;
-    Iterator iter = patternHash.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String urlDescription = (String)iter.next();
-      TrustsItem ti = (TrustsItem)patternHash.get(urlDescription);
-      Pattern p = ti.getPattern();
-      Matcher m = p.matcher(url);
-      if (m.find())
-      {
-        IKeystoreManager trustStore = ti.getTrustStore();
-        if (trustStore == null)
-          return null;
-        String[] aliases = trustStore.getContents();
-        int j = 0;
-        while (j < aliases.length)
-        {
-          rval.addCertificate(Integer.toString(certNumber),trustStore.getCertificate(aliases[j++]));
-          certNumber++;
-        }
-      }
-    }
-    return rval;
-  }
-
-  /** Class representing an individual credential item.
-  */
-  protected static class TrustsItem
-  {
-    /** The bin-matching pattern. */
-    protected Pattern pattern;
-    /** The credential, or null if this is a "trust everything" item */
-    protected IKeystoreManager trustStore;
-
-    /** Constructor. */
-    public TrustsItem(Pattern p, String trustStoreString)
-      throws ManifoldCFException
-    {
-      pattern = p;
-      if (trustStoreString != null)
-        trustStore = KeystoreManagerFactory.make("",trustStoreString);
-      else
-        trustStore = null;
-    }
-
-    /** Get the pattern. */
-    public Pattern getPattern()
-    {
-      return pattern;
-    }
-
-    /** Get keystore */
-    public IKeystoreManager getTrustStore()
-    {
-      return trustStore;
-    }
-
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebURL.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebURL.java
deleted file mode 100644
index 9fc326b..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebURL.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/** Replacement class for java.net.URI, which is broken in many ways.
-*/
-public class WebURL
-{
-  protected URI theURL;
-  protected String rawQueryPart;
-  
-  public WebURL(String url)
-    throws URISyntaxException
-  {
-    theURL = new URI(url);
-    rawQueryPart = null;
-  }
-  
-  public WebURL(String scheme, String host, int port, String path, String queryPart)
-    throws URISyntaxException
-  {
-    theURL = new URI(scheme, null, host, port, path, null, null);
-    rawQueryPart = queryPart;
-  }
-  
-  public WebURL(URI theURL)
-  {
-    this(theURL,null);
-  }
-  
-  public WebURL(URI theURL, String rawQueryPart)
-  {
-    this.theURL = theURL;
-    this.rawQueryPart = rawQueryPart;
-  }
-  
-  public WebURL resolve(String raw)
-    throws URISyntaxException
-  {
-    URI rawURL = new URI(raw);
-    if (rawURL.isAbsolute())
-      return new WebURL(rawURL);
-    URI fixedURL = theURL;
-    if (theURL.getPath() == null || theURL.getPath().length() == 0)
-      fixedURL = new URI(theURL.getScheme(),null,theURL.getHost(),theURL.getPort(),"/",null,null);
-
-    if (raw.startsWith("?"))
-      return new WebURL(fixedURL.getScheme(),fixedURL.getHost(),fixedURL.getPort(),fixedURL.getPath(),rawURL.getRawQuery());
-    
-    return new WebURL(fixedURL.resolve(rawURL));
-  }
-  
-  public String getPath()
-  {
-    return theURL.getPath();
-  }
-  
-  public String getHost()
-  {
-    return theURL.getHost();
-  }
-  
-  public String getScheme()
-  {
-    return theURL.getScheme();
-  }
-  
-  public int getPort()
-  {
-    return theURL.getPort();
-  }
-  
-  public String getRawQuery()
-  {
-    if (rawQueryPart != null)
-      return rawQueryPart;
-    return theURL.getRawQuery();
-  }
-  
-  public String toASCIIString()
-  {
-    String rval = theURL.toASCIIString();
-    if (rval != null && rawQueryPart != null && rawQueryPart.length() > 0)
-      rval += "?" + rawQueryPart;
-    return rval;
-  }
-  
-  public String toString()
-  {
-    String rval = theURL.toString();
-    if (rval != null && rawQueryPart != null && rawQueryPart.length() > 0)
-      rval += "?" + rawQueryPart;
-    return rval;
-  }
-}
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConfig.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConfig.java
deleted file mode 100644
index b12b596..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConfig.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/* $Id: WebcrawlerConfig.java 995042 2010-09-08 13:10:06Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-
-/** Constants for the Webcrawler connector configuration.
-*/
-public class WebcrawlerConfig
-{
-  public static final String _rcsid = "@(#)$Id: WebcrawlerConfig.java 995042 2010-09-08 13:10:06Z kwright $";
-
-
-  // Constants describing the configuration structure.  This structure describes the "how" of
-  // fetching page data - e.g. bandwidth and fetch constraints, adherance to robots conventions,
-  // etc.
-  // For the throttling part of the connector, the scheduler handles average fetch-rate limits.
-  // The per-connection configuration describes the maximum number of connections per some user-defined criteria, as
-  // well as bandwidth maximums and fetch rate absolute maximums.
-  //
-  // In detail:
-  //
-  // 1) The robots conventions;
-  // 2) Bandwidth limits in KB/sec, based on regular expressions done on the bins;
-  // 3) Email address (so people can whine to somebody about our crawler);
-  // 4) Maximum number of connections per host, based on a regular expression done on the bins a document belongs to.
-  // 5) Authentication information (NTLM and basic auth only), based on regexp of a document's URL.
-  // 6) SSL trust store certificates, trusted on the basis of a regexp of a document's URL.
-
-  /** Robots usage (a parameter) */
-  public static final String PARAMETER_ROBOTSUSAGE = "Robots usage";
-  /** Meta robots tags usage (a parameter) */
-  public static final String PARAMETER_META_ROBOTS_TAGS_USAGE = "Meta robots tags usage";
-  /** Email (a parameter) */
-  public static final String PARAMETER_EMAIL = "Email address";
-  /** Proxy host name (parameter) */
-  public static final String PARAMETER_PROXYHOST = "Proxy host";
-  /** Proxy port (parameter) */
-  public static final String PARAMETER_PROXYPORT = "Proxy port";
-  /** Proxy auth domain (parameter) */
-  public static final String PARAMETER_PROXYAUTHDOMAIN = "Proxy authentication domain";
-  /** Proxy auth username (parameter) */
-  public static final String PARAMETER_PROXYAUTHUSERNAME = "Proxy authentication user name";
-  /** Proxy auth password (parameter) */
-  public static final String PARAMETER_PROXYAUTHPASSWORD = "Proxy authentication password";
-  /** The bin description node */
-  public static final String NODE_BINDESC = "bindesc";
-  /** The bin regular expression */
-  public static final String ATTR_BINREGEXP = "binregexp";
-  /** Whether the match is case insensitive */
-  public static final String ATTR_INSENSITIVE = "caseinsensitive";
-  /** The max connections node */
-  public static final String NODE_MAXCONNECTIONS = "maxconnections";
-  /** The bandwidth node */
-  public static final String NODE_MAXKBPERSECOND = "maxkbpersecond";
-  /** The max fetch rate node */
-  public static final String NODE_MAXFETCHESPERMINUTE = "maxfetchesperminute";
-  /** The value attribute (used for maxconnections and maxkbpersecond) */
-  public static final String ATTR_VALUE = "value";
-  /** Access control description node */
-  public static final String NODE_ACCESSCREDENTIAL = "accesscredential";
-  /** Regexp for access control node */
-  public static final String ATTR_URLREGEXP = "urlregexp";
-  /** Type of security  */
-  public static final String ATTR_TYPE = "type";
-  /** Type value for basic authentication */
-  public static final String ATTRVALUE_BASIC = "basic";
-  /** Type value for NTLM authentication */
-  public static final String ATTRVALUE_NTLM = "ntlm";
-  /** Type value for session-based authentication */
-  public static final String ATTRVALUE_SESSION = "session";
-  /** Domain/realm part of credentials (if any) */
-  public static final String ATTR_DOMAIN = "domain";
-  /** Username part of credentials */
-  public static final String ATTR_USERNAME = "username";
-  /** Password part of credentials */
-  public static final String ATTR_PASSWORD = "password";
-  /** Authentication page description node */
-  public static final String NODE_AUTHPAGE = "authpage";
-  /** Authentication page type: Form */
-  public static final String ATTRVALUE_FORM = "form";
-  /** Authentication page type: Link */
-  public static final String ATTRVALUE_LINK = "link";
-  /** Authentication page type: Redirection */
-  public static final String ATTRVALUE_REDIRECTION = "redirection";
-  /** Authentication page type: Access */
-  public static final String ATTRVALUE_CONTENT = "content";
-  /** Form name or link target regexp for authentication page */
-  public static final String ATTR_MATCHREGEXP = "match";
-  /** URL to fetch next in a sequence (an override) */
-  public static final String ATTR_OVERRIDETARGETURL = "overridetargeturl";
-  /** Authentication parameter node */
-  public static final String NODE_AUTHPARAMETER = "authparameter";
-  /** Authentication parameter name regexp */
-  public static final String ATTR_NAMEREGEXP = "name";
-  /** Trust store description node */
-  public static final String NODE_TRUST = "trust";
-  /** Trust store section of authentication record */
-  public static final String ATTR_TRUSTSTORE = "truststore";
-  /** "Trust everything" attribute - replacing truststore if set to 'true' */
-  public static final String ATTR_TRUSTEVERYTHING = "trusteverything";
-
-  // Constants used in the document specification part of the configuration structure.
-  // This describes the "what" of the job.
-
-  /** Map entry specification node.  Has two attributes: 'match' and 'map'. */
-  public static final String NODE_MAP = "map";
-  /** The seeds node.  The value of this node contains the seeds, as a large
-  * text area. */
-  public static final String NODE_SEEDS = "seeds";
-  /** Include regexps node.  The value of this node contains the regexps that
-  * must match the canonical URL in order for that URL to be included in the crawl.  These
-  * regexps are newline separated, and # starts a comment.  */
-  public static final String NODE_INCLUDES = "includes";
-  /** Exclude regexps node.  The value of this node contains the regexps that
-  * if any one matches, causes the URL to be excluded from the crawl.  These
-  * regexps are newline separated, and # starts a comment.  */
-  public static final String NODE_EXCLUDES = "excludes";
-  /** Include regexps node.  The value of this node contains the regexps that
-  * must match the canonical URL in order for that URL to be included for indexing.  These
-  * regexps are newline separated, and # starts a comment.  */
-  public static final String NODE_INCLUDESINDEX = "includesindex";
-  /** Exclude regexps node.  The value of this node contains the regexps that
-  * if any one matches, causes the URL to be excluded from indexing.  These
-  * regexps are newline separated, and # starts a comment.  */
-  public static final String NODE_EXCLUDESINDEX = "excludesindex";
-
-  /**
-   * Exclude any page containing specified regex in their body from index
-   */
-  public static final String NODE_EXCLUDESCONTENTINDEX = "excludescontentindex";
-
-  /** Limit to seeds.  When value attribute is true, only seed domains will be permitted. */
-  public static final String NODE_LIMITTOSEEDS = "limittoseeds";
-  /** Canonicalization rule.  Attributes are regexp, description, reorder, 
-  *javasessionremoval, aspsessionremoval, phpsessionremoval, bvsessionremoval */
-  public static final String NODE_URLSPEC = "urlspec";
-  /** Forced acl access token node.  Attribute is "token". */
-  public static final String NODE_ACCESS = "access";
-  /** Exclude header node.  The value of this node lists a single header (in lower case) that 
-  * should be excluded from the document metadata */
-  public static final String NODE_EXCLUDEHEADER = "excludeheader";
-  
-  /** regexp attribute */
-  public static final String ATTR_REGEXP = "regexp";
-  /** description attribute */
-  public static final String ATTR_DESCRIPTION = "description";
-  /** reorder attribute */
-  public static final String ATTR_REORDER = "reorder";
-  /** javasessionremoval attribute */
-  public static final String ATTR_JAVASESSIONREMOVAL = "javasessionremoval";
-  /** aspsessionremoval attribute */
-  public static final String ATTR_ASPSESSIONREMOVAL = "aspsessionremoval";
-  /** phpsessionremoval attribute */
-  public static final String ATTR_PHPSESSIONREMOVAL = "phpsessionremoval";
-  /** bvsessionremoval attribute */
-  public static final String ATTR_BVSESSIONREMOVAL = "bvsessionremoval";
-  /** name attribute */
-  public static final String ATTR_NAME = "name";
-  /** token attribute */
-  public static final String ATTR_TOKEN = "token";
-  /** Value yes */
-  public static final String ATTRVALUE_YES = "yes";
-  /** Value no */
-  public static final String ATTRVALUE_NO = "no";
-  /** Value false */
-  public static final String ATTRVALUE_FALSE = "false";
-  /** Value true */
-  public static final String ATTRVALUE_TRUE = "true";
-  /** Match attribute */
-  public static final String ATTR_MATCH = "match";
-  /** Map attribute */
-  public static final String ATTR_MAP = "map";
-
-}
-
-
diff --git a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java b/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java
deleted file mode 100644
index 4823866..0000000
--- a/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java
+++ /dev/null
@@ -1,5992 +0,0 @@
-/* $Id: WebcrawlerConnector.java 995042 2010-09-08 13:10:06Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.ui.util.Encoder;
-
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.fuzzyml.*;
-
-import org.apache.http.conn.ConnectTimeoutException;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.net.*;
-import java.util.regex.*;
-
-/** This is the Web Crawler implementation of the IRepositoryConnector interface.
-* This connector may be superceded by one that calls out to python, or by a entirely
-* python Connector Framework, depending on how the winds blow.
-*
-*/
-public class WebcrawlerConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: WebcrawlerConnector.java 995042 2010-09-08 13:10:06Z kwright $";
-
-  // First, a couple of very important points.
-  // The canonical document identifier is simply a legal URL.  It may have been processed in some way to
-  // map it to a "base" form, but that's all.
-  //
-  // A document's version is mostly calculated using a checksum technique.  It is conceivable that we
-  // will eventually want the version to be more cleverly calculated, perhaps by recognizing the document
-  // type and extracting more definitive information, so it will be constructed that way, but right now
-  // there's only going to be the basic checksum done.
-  //
-  // This very basic crawler will extract links only from text, html, or xml - where links can readily be
-  // found.  More robust extraction technology will be plugged in eventually, so the architecture will be
-  // designed for additional plugins.
-  //
-  // The documents that actually get ingested will have to pass the "fingerprint" test, which will be lifted
-  // wholesale from the jcifs connector.  This is to avoid overwhelming the ingestion system with crap.
-
-  // Next, a note about "bins".
-  // This crawler places each URL into a set of bins, based on the host that the URL goes to.
-  // For example, the URL "http://foo.metacarta.com/stuff.htm" would have the following bins
-  // associated with it: "foo.metacarta.com", ".metacarta.com", ".com", and "".  The idea for this
-  // is to make it straightforward to group together different URLs into sets, for throttling and
-  // secure access purposes.
-
-  // These are the signals used by some methods in this class to communicate results
-  protected static final int RESULTSTATUS_FALSE = 0;
-  protected static final int RESULTSTATUS_TRUE = 1;
-  protected static final int RESULTSTATUS_NOTYETDETERMINED = 2;
-
-  /** This represents a list of the mime types that this connector knows how to extract links from.
-  * Documents that are indexable are described by the output connector. */
-  protected static final String[] interestingMimeTypeArray = new String[]
-  {
-    "application/rtf",
-    "application/xls",
-    "text/html",
-    "text/rtf",
-    "application/x-excel",
-    "application/x-msexcel",
-    "application/x-mspowerpoint",
-    "application/x-msword-doc",
-    "application/x-msword",
-    "application/x-word",
-    "text/xml",
-    "no-type",
-    "text/plain",
-    "application/x-rtf",
-    "application/x-pdf",
-    "text/richtext",
-    "Text",
-    "Text/html"
-  };
-
-  protected static final Set<String> interestingMimeTypeMap;
-  static
-  {
-    interestingMimeTypeMap = new HashSet<String>();
-    int i = 0;
-    while (i < interestingMimeTypeArray.length)
-    {
-      String type = interestingMimeTypeArray[i++];
-      interestingMimeTypeMap.add(type);
-    }
-  }
-
-  protected static final Set<String> understoodProtocols;
-  static
-  {
-    understoodProtocols = new HashSet<String>();
-    understoodProtocols.add("http");
-    understoodProtocols.add("https");
-  }
-
-
-  // Usage flag values
-  protected static final int ROBOTS_NONE = 0;
-  protected static final int ROBOTS_DATA = 1;
-  protected static final int ROBOTS_ALL = 2;
-
-  protected static final int META_ROBOTS_NONE = 0;
-  protected static final int META_ROBOTS_ALL = 1;
-
-  // Relationship types
-  public final static String REL_LINK = "link";
-  public final static String REL_REDIRECT = "redirect";
-
-  // Activity types
-  public final static String ACTIVITY_FETCH = "fetch";
-  public final static String ACTIVITY_PROCESS = "process";
-  public final static String ACTIVITY_ROBOTSPARSE = "robots parse";
-  public final static String ACTIVITY_LOGON_START = "begin logon";
-  public final static String ACTIVITY_LOGON_END = "end logon";
-
-  // Fetch types
-  protected final static String FETCH_ROBOTS = "ROBOTS";
-  protected final static String FETCH_STANDARD = "URL";
-  protected final static String FETCH_LOGIN = "LOGIN";
-
-  // Reserved headers
-  protected final static Set<String> reservedHeaders;
-  static
-  {
-    reservedHeaders = new HashSet<String>();
-    reservedHeaders.add("age");
-    reservedHeaders.add("www-authenticate");
-    reservedHeaders.add("proxy-authenticate");
-    reservedHeaders.add("date");
-    reservedHeaders.add("set-cookie");
-    reservedHeaders.add("via");
-  }
-  
-  // Potentially excluded headers
-  protected final static List<String> potentiallyExcludedHeaders;
-  static
-  {
-    potentiallyExcludedHeaders = new ArrayList<String>();
-    potentiallyExcludedHeaders.add("last-modified");
-  }
-  
-  /** Robots usage flag */
-  protected int robotsUsage = ROBOTS_ALL;
-  /** Meta robots tag usage flag */
-  protected int metaRobotsTagsUsage = META_ROBOTS_ALL;
-  /** The user-agent for this connector instance */
-  protected String userAgent = null;
-  /** The email address for this connector instance */
-  protected String from = null;
-  /** Connection timeout, milliseconds. */
-  protected int connectionTimeoutMilliseconds = 60000;
-  /** Socket timeout, milliseconds */
-  protected int socketTimeoutMilliseconds = 300000;
-  /** Throttle group name */
-  protected String throttleGroupName = null;
-
-  // Canonicalization enabling/disabling.  Eventually this will probably need to be by regular expression.
-
-  /** The throttle description */
-  protected ThrottleDescription throttleDescription = null;
-  /** The credentials description */
-  protected CredentialsDescription credentialsDescription = null;
-  /** The trusts description */
-  protected TrustsDescription trustsDescription = null;
-
-  /** The robots manager currently used by this instance */
-  protected RobotsManager robotsManager = null;
-  /** The DNS manager currently used by this instance */
-  protected DNSManager dnsManager = null;
-  /** The cookie manager used by this instance */
-  protected CookieManager cookieManager = null;
-
-  /** This flag is set when the instance has been initialized */
-  protected boolean isInitialized = false;
-
-  /** This is where we keep data around between the getVersions() phase and the processDocuments() phase. */
-  protected static DataCache cache = new DataCache();
-
-  /** Proxy host */
-  protected String proxyHost = null;
-  
-  /** Proxy port */
-  protected int proxyPort = -1;
-  
-  /** Proxy auth domain */
-  protected String proxyAuthDomain = null;
-  
-  /** Proxy auth user name */
-  protected String proxyAuthUsername = null;
-  
-  /** Proxy auth password */
-  protected String proxyAuthPassword = null;
-  
-  /** Deny access token for default authority */
-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
-
-  /** Constructor.
-  */
-  public WebcrawlerConnector()
-  {
-  }
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    // We return all seeds every time.
-    return MODEL_ALL;
-  }
-
-  /** Install the connector.
-  * This method is called to initialize persistent storage for the connector, such as database tables etc.
-  * It is called when the connector is registered.
-  *@param threadContext is the current thread context.
-  */
-  @Override
-  public void install(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Install
-    IDBInterface mainDatabase = DBInterfaceFactory.make(threadContext,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-
-    RobotsManager rm = new RobotsManager(threadContext,mainDatabase);
-    DNSManager dns = new DNSManager(threadContext,mainDatabase);
-    CookieManager cm = new CookieManager(threadContext,mainDatabase);
-    mainDatabase.beginTransaction();
-    try
-    {
-      rm.install();
-      dns.install();
-      cm.install();
-    }
-    catch (ManifoldCFException e)
-    {
-      mainDatabase.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      mainDatabase.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      mainDatabase.endTransaction();
-    }
-  }
-
-
-  /** Uninstall the connector.
-  * This method is called to remove persistent storage for the connector, such as database tables etc.
-  * It is called when the connector is deregistered.
-  *@param threadContext is the current thread context.
-  */
-  @Override
-  public void deinstall(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Uninstall
-    IDBInterface mainDatabase = DBInterfaceFactory.make(threadContext,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-
-    RobotsManager rm = new RobotsManager(threadContext,mainDatabase);
-    DNSManager dns = new DNSManager(threadContext,mainDatabase);
-    CookieManager cm = new CookieManager(threadContext,mainDatabase);
-    mainDatabase.beginTransaction();
-    try
-    {
-      cm.deinstall();
-      rm.deinstall();
-      dns.deinstall();
-    }
-    catch (ManifoldCFException e)
-    {
-      mainDatabase.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      mainDatabase.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      mainDatabase.endTransaction();
-    }
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[]{ACTIVITY_FETCH, ACTIVITY_PROCESS, ACTIVITY_ROBOTSPARSE, ACTIVITY_LOGON_START, ACTIVITY_LOGON_END};
-  }
-
-
-  /** Return the list of relationship types that this connector recognizes.
-  *@return the list.
-  */
-  @Override
-  public String[] getRelationshipTypes()
-  {
-    return new String[]{REL_LINK,REL_REDIRECT};
-  }
-
-  /** Clear out any state information specific to a given thread.
-  * This method is called when this object is returned to the connection pool.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    super.clearThreadContext();
-    robotsManager = null;
-    dnsManager = null;
-    cookieManager = null;
-  }
-
-  /** Start a session */
-  protected void getSession()
-    throws ManifoldCFException
-  {
-    // Handle the stuff that requires a thread context
-    if (robotsManager == null || dnsManager == null || cookieManager == null)
-    {
-      IDBInterface databaseHandle = DBInterfaceFactory.make(currentContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      robotsManager = new RobotsManager(currentContext,databaseHandle);
-      dnsManager = new DNSManager(currentContext,databaseHandle);
-      cookieManager = new CookieManager(currentContext,databaseHandle);
-    }
-
-    // Handle everything else
-    if (!isInitialized)
-    {
-      // Either set this from the connection name, or just have one.  Right now, we have one.
-      String throttleGroupName = "";
-      
-      String emailAddress = params.getParameter(WebcrawlerConfig.PARAMETER_EMAIL);
-      if (emailAddress == null)
-        throw new ManifoldCFException("Missing email address");
-      userAgent = "Mozilla/5.0 (ApacheManifoldCFWebCrawler; "+emailAddress+")";
-      from = emailAddress;
-
-      String robotsTxt = params.getParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE);
-      robotsUsage = ROBOTS_ALL;
-      if (robotsTxt == null || robotsTxt.length() == 0 || robotsTxt.equals("all"))
-        robotsUsage = ROBOTS_ALL;
-      else if (robotsTxt.equals("none"))
-        robotsUsage = ROBOTS_NONE;
-      else if (robotsTxt.equals("data"))
-        robotsUsage = ROBOTS_DATA;
-
-      String metaRobots = params.getParameter(WebcrawlerConfig.PARAMETER_META_ROBOTS_TAGS_USAGE);
-      if (metaRobots == null || metaRobots.length() == 0 || metaRobots.equals("all"))
-        metaRobotsTagsUsage = META_ROBOTS_ALL;
-      else if (metaRobots.equals("none"))
-        metaRobotsTagsUsage = META_ROBOTS_NONE;
-      
-      throttleDescription = new ThrottleDescription(params);
-      credentialsDescription = new CredentialsDescription(params);
-      trustsDescription = new TrustsDescription(params);
-
-      proxyHost = params.getParameter(WebcrawlerConfig.PARAMETER_PROXYHOST);
-      String proxyPortString = params.getParameter(WebcrawlerConfig.PARAMETER_PROXYPORT);
-      proxyAuthDomain = params.getParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHDOMAIN);
-      proxyAuthUsername = params.getParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHUSERNAME);
-      proxyAuthPassword = params.getObfuscatedParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHPASSWORD);
-
-      proxyPort = -1;
-      if (proxyPortString != null && proxyPortString.length() > 0)
-      {
-        try
-        {
-          proxyPort = Integer.parseInt(proxyPortString);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-
-      isInitialized = true;
-    }
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    ThrottledFetcher.flushIdleConnections(currentContext);
-  }
-
-  /** Check status of connection.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    getSession();
-    return super.check();
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    throttleGroupName = null;
-    throttleDescription = null;
-    credentialsDescription = null;
-    trustsDescription = null;
-    userAgent = null;
-    from = null;
-    proxyHost = null;
-    proxyPort = -1;
-    proxyAuthDomain = null;
-    proxyAuthUsername = null;
-    proxyAuthPassword = null;
-
-    isInitialized = false;
-
-    super.disconnect();
-  }
-
-  /** Get the bin name string for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the bin name.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    try
-    {
-      java.net.URI uri = new java.net.URI(documentIdentifier);
-      return new String[]{uri.getHost()};
-    }
-    catch (URISyntaxException e)
-    {
-      return new String[]{""};
-    }
-
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersion is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-
-    DocumentURLFilter filter = new DocumentURLFilter(spec);
-
-    // This is the call that's used to seed everything.
-    // We just find the current seeds, and create the appropriate iterator.
-    String seeds = "";
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_SEEDS))
-        seeds = sn.getValue();
-    }
-
-    // Break up the seeds string and iterate over the results.
-    List<String> list = stringToArray(seeds);
-    // We must only return valid urls here!!!
-    int index = 0;
-    while (index < list.size())
-    {
-      String urlCandidate = (String)list.get(index++);
-      String documentIdentifier = makeDocumentIdentifier(null,urlCandidate,filter);
-      if (documentIdentifier == null)
-      {
-        // Bad seed.  Log it, and continue!
-        Logging.connectors.warn("WEB: Illegal seed URL '"+urlCandidate+"'");
-        continue;
-      }
-      activities.addSeedDocument(documentIdentifier,calculateDocumentEvents(activities,documentIdentifier));
-    }
-    return "";
-  }
-
-  // Session login states (so we can use the same fetch logic multiple times)
-
-  /** Normal fetch of content document.  (For all we know, we're logged in already). */
-  protected static final int SESSIONSTATE_NORMAL = 0;
-  /** We're in 'login mode' */
-  protected static final int SESSIONSTATE_LOGIN = 1;
-
-  // Result signals
-  protected static final int RESULT_NO_DOCUMENT = 0;
-  protected static final int RESULT_NO_VERSION = 1;
-  protected static final int RESULT_VERSION_NEEDED = 2;
-  protected static final int RESULT_RETRY_DOCUMENT = 3;
-
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-
-    // Forced acls
-    String[] acls = getAcls(spec);
-    // Sort it,
-    java.util.Arrays.sort(acls);
-
-    // Get the excluded headers
-    Set<String> excludedHeaders = findExcludedHeaders(spec);
-    
-    // Since document specifications can change, we need to look at each url and filter it as part of the
-    // process of getting version strings.  To do that, we need to compile the DocumentSpecification into
-    // an object that knows how to do this.
-    DocumentURLFilter filter = new DocumentURLFilter(spec);
-
-    String filterVersion = filter.getVersionString();
-    
-    // There are two ways to handle any document that's not available.  The first is to remove it.  The second is to keep it, but mark it with an empty version string.
-    // With the web crawler, the major concern with simply removing the document is that it might be referred to from multiple places - and in addition
-    // it will get requeued every time the parent document is processed.  This is not optimal because it represents churn.
-    // On the other hand, keeping the document in the queue causes the queue to bloat, which is also not optimal, and it makes the crawler basically
-    // incapable of deleting documents.
-    // Since the primary use of the crawler is expected to be repeated intranet crawls,  I've thus chosen to optimize the crawler for accuracy rather than performance
-    // - if the document is gone, I just remove it, and expect churn when recrawling activities occur.
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      // Verify that the url is legal
-      if (!filter.isDocumentAndHostLegal(documentIdentifier))
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Removing url '"+documentIdentifier+"' because it's not in the set of allowed ones");
-        // Use null because we should have already filtered when we queued.
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-      
-      try
-      {
-        // The first thing we need to know is whether this url is part of a session-protected area.  We'll use that information
-        // later to detect redirection to login.
-        SequenceCredentials sessionCredential = getSequenceCredential(documentIdentifier);
-
-        if (Logging.connectors.isDebugEnabled())
-        {
-          if (sessionCredential != null)
-            Logging.connectors.debug("Web: For document identifier '"+documentIdentifier+"' found session credential key '"+sessionCredential.getSequenceKey()+"'");
-        }
-          
-        // Set up the initial state and state variables.
-        // Fetch status
-        FetchStatus fetchStatus = new FetchStatus();
-
-        // Calculate an event name; we'll need this to control sequencing.
-        String globalSequenceEvent;
-        if (sessionCredential != null)
-        {
-          String sequenceKey = sessionCredential.getSequenceKey();
-          globalSequenceEvent = makeSessionLoginEventName(activities,sequenceKey);
-        }
-        else
-          globalSequenceEvent = null;
-
-        // This is the main 'state loop'.  The code is structured to use the finally clause from the following try to clean up any
-        // events that were created within the loop.  The loop itself has two parts: document fetch, and logic to figure out what state to transition
-        // to (e.g. how to process the fetched document).  A signal variable is used to signal the desired outcome.
-        // We need to be sure we clean up the sequence event in case there's an error, so put a try/finally around everything.
-        try
-        {
-
-          loginAndFetch(fetchStatus,activities,documentIdentifier,sessionCredential,globalSequenceEvent);
-        
-        
-          switch (fetchStatus.resultSignal)
-          {
-          case RESULT_NO_DOCUMENT:
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("WEB: Removing url '"+documentIdentifier+"'"+((fetchStatus.contextMessage!=null)?" because "+fetchStatus.contextMessage:""),fetchStatus.contextException);
-            activities.deleteDocument(documentIdentifier);
-            break;
-          case RESULT_NO_VERSION:
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("WEB: Ignoring url '"+documentIdentifier+"'"+((fetchStatus.contextMessage!=null)?" because "+fetchStatus.contextMessage:""),fetchStatus.contextException);
-            
-            // We get here when a document didn't fetch.
-            // No version 
-            activities.noDocument(documentIdentifier,"");
-            break;
-          case RESULT_VERSION_NEEDED:
-            // Calculate version from document data, which is presumed to be present.
-            StringBuilder sb = new StringBuilder();
-
-            // Acls
-            packList(sb,acls,'+');
-            if (acls.length > 0)
-            {
-              sb.append('+');
-              pack(sb,defaultAuthorityDenyToken,'+');
-            }
-            else
-              sb.append('-');
-
-            // Now, do the metadata. 
-            Map<String,Set<String>> metaHash = new HashMap<String,Set<String>>();
-            
-            String[] fixedListStrings = new String[2];
-            // They're all folded into the same part of the version string.
-            int headerCount = 0;
-            Iterator<String> headerIterator = fetchStatus.headerData.keySet().iterator();
-            while (headerIterator.hasNext())
-            {
-              String headerName = headerIterator.next();
-              String lowerHeaderName = headerName.toLowerCase(Locale.ROOT);
-              if (!reservedHeaders.contains(lowerHeaderName) && !excludedHeaders.contains(lowerHeaderName))
-                headerCount += fetchStatus.headerData.get(headerName).size();
-            }
-            String[] fullMetadata = new String[headerCount];
-            headerCount = 0;
-            headerIterator = fetchStatus.headerData.keySet().iterator();
-            while (headerIterator.hasNext())
-            {
-              String headerName = headerIterator.next();
-              String lowerHeaderName = headerName.toLowerCase(Locale.ROOT);
-              if (!reservedHeaders.contains(lowerHeaderName) && !excludedHeaders.contains(lowerHeaderName))
-              {
-                Set<String> valueSet = metaHash.get(headerName);
-                if (valueSet == null)
-                {
-                  valueSet = new HashSet<String>();
-                  metaHash.put(headerName,valueSet);
-                }
-                List<String> headerValues = fetchStatus.headerData.get(headerName);
-                for (String headerValue : headerValues)
-                {
-                  valueSet.add(headerValue);
-                  fixedListStrings[0] = "header-"+headerName;
-                  fixedListStrings[1] = headerValue;
-                  StringBuilder newsb = new StringBuilder();
-                  packFixedList(newsb,fixedListStrings,'=');
-                  fullMetadata[headerCount++] = newsb.toString();
-                }
-              }
-            }
-            java.util.Arrays.sort(fullMetadata);
-              
-            packList(sb,fullMetadata,'+');
-            // Done with the parseable part!  Add the checksum.
-            sb.append(fetchStatus.checkSum);
-            // Add the filter version
-            sb.append("+");
-            sb.append(filterVersion);
-              
-            String versionString = sb.toString();
-
-            // Now, extract links.
-            // We'll call the "link extractor" series, so we can plug more stuff in over time.
-            boolean indexDocument = extractLinks(documentIdentifier,activities,filter);
-
-            // If scanOnly is set, we never ingest.  But all else is the same.
-            if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-              continue;
-            
-            processDocument(activities,documentIdentifier,versionString,indexDocument,metaHash,acls,filter);
-            break;
-          case RESULT_RETRY_DOCUMENT:
-            // Document could not be processed right now.
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("WEB: Retrying url '"+documentIdentifier+"' later"+((fetchStatus.contextMessage!=null)?" because "+fetchStatus.contextMessage:""),fetchStatus.contextException);
-            activities.retryDocumentProcessing(documentIdentifier);
-            break;
-          default:
-            throw new IllegalStateException("Unexpected value for result signal: "+Integer.toString(fetchStatus.resultSignal));
-          }
-        }
-        finally
-        {
-          // Clean up event, if there is one.
-          if (fetchStatus.sessionState == SESSIONSTATE_LOGIN && globalSequenceEvent != null)
-          {
-            // Terminate the event
-            activities.completeEventSequence(globalSequenceEvent);
-          }
-        }
-      }
-      finally
-      {
-        cache.deleteData(documentIdentifier);
-      }
-    }
-  }
-
-  protected void loginAndFetch(FetchStatus fetchStatus, IProcessActivity activities, String documentIdentifier, SequenceCredentials sessionCredential, String globalSequenceEvent)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long currentTime = System.currentTimeMillis();
-    // Here's the maximum number of connections we are going to allow.
-    int connectionLimit = 200;
-
-    String currentURI = documentIdentifier;
-
-    // Login pages are special in that I *don't* require them to do a robots check.  The reason why is because it is conceivable that a
-    // site may inadvertantly exclude them via robots, and yet allow content pages to be scanned.  This would effectively exclude session login
-    // for that site if we adhered to the strict policy.  Since login pages have to be exclusively identified as being special, explicit
-    // permission is effectively granted by the user in any case.
-
-    // The result code to be activity logging, or null if no activity logging desired.
-    String activityResultCode = null;
-    // Form data
-    FormData formData = null;
-    
-    while (true)
-    {
-      URL url;
-      try
-      {
-        // Do the mapping from the current host name to the IP address
-        url = new URL(currentURI);
-      }
-      catch (MalformedURLException e)
-      {
-        // currentURI is malformed.
-        // If the document was the primary, we should remove it from the queue.  But if it's part of a login sequence, we'd better just retry later.
-        fetchStatus.contextMessage = "was not a valid URL: "+e.getMessage();
-        fetchStatus.contextException = e;
-        activityResultCode = "-12";
-        fetchStatus.resultSignal = RESULT_NO_DOCUMENT;
-        break;
-      }
-
-      String hostName = url.getHost();
-      StringBuilder ipAddressBuffer = new StringBuilder();
-      int ipAddressStatus = lookupIPAddress(currentURI,activities,hostName,currentTime,ipAddressBuffer);
-      if (ipAddressStatus == RESULTSTATUS_TRUE)
-      {
-        String ipAddress = ipAddressBuffer.toString();
-        String protocol = url.getProtocol();
-        int port = url.getPort();
-        if (port == -1)
-          port = url.getDefaultPort();
-
-        // Try to fetch the document.  We'll need its bin names first.
-        String[] binNames = getBinNames(currentURI);
-
-        // Get the credentials for this document (if any)
-        PageCredentials credential = getPageCredential(currentURI);
-        IKeystoreManager trustStore;
-        // Save effort - only bother to get a trust store if this is https
-        if (protocol.equalsIgnoreCase("https"))
-          // null return is possible here; indicates "trust everything"
-          trustStore = getTrustStore(currentURI);
-        else
-          trustStore = KeystoreManagerFactory.make("");
-        // Check robots, if enabled, and if we're fetching the primary document identifier.  See comment above.
-        int robotsStatus = RESULTSTATUS_TRUE;
-        if (!documentIdentifier.equals(currentURI) || robotsUsage < ROBOTS_DATA || (robotsStatus = checkFetchAllowed(documentIdentifier,protocol,ipAddress,port,credential,trustStore,hostName,binNames,currentTime,
-          url.getFile(),activities,connectionLimit,proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword)) == RESULTSTATUS_TRUE)
-        {
-          // Passed the robots check!
-
-          // Find whatever login parameters apply.  This will be null if currentURI is not a login page, and will contain
-          // interesting information if it is.
-          LoginCookies lc = null;
-          if (sessionCredential != null)
-          {
-            lc = cookieManager.readCookies(sessionCredential.getSequenceKey());
-          }
-
-          // Prepare to perform the fetch, and decide what to do with the document.
-          //
-          IThrottledConnection connection = ThrottledFetcher.getConnection(currentContext,
-            throttleGroupName,
-            protocol,ipAddress,port,
-            credential,trustStore,throttleDescription,binNames,connectionLimit,
-            proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-            socketTimeoutMilliseconds,connectionTimeoutMilliseconds,
-            activities);
-          try
-          {
-            connection.beginFetch((fetchStatus.sessionState == SESSIONSTATE_LOGIN)?FETCH_LOGIN:FETCH_STANDARD);
-            try
-            {
-              // Execute the fetch!
-              connection.executeFetch(url.getFile(),userAgent,from,
-                false,hostName,formData,lc);
-              int response = connection.getResponseCode();
-
-              if (response == 200 || response == 302 || response == 301)
-              {
-                // If this was part of the login sequence, update the cookies regardless of what else happens
-                if (fetchStatus.sessionState == SESSIONSTATE_LOGIN)
-                {
-                  // Update the cookies
-                  LoginCookies lastFetchCookies = connection.getLastFetchCookies();
-                  cookieManager.updateCookies(sessionCredential.getSequenceKey(),lastFetchCookies);
-                }
-
-                // Decide whether to exclude this document based on what we see here.
-                // Basically, we want to get rid of everything that we (a) don't know what
-                // to do with in the ingestion system, and (b) we can't get useful links from.
-
-                String contentType = extractContentType(connection.getResponseHeader("Content-Type"));
-
-                if (isContentInteresting(activities,currentURI,response,contentType))
-                {
-                  // Treat it as real, and cache it.
-                  fetchStatus.checkSum = cache.addData(activities,currentURI,connection);
-                  fetchStatus.headerData = connection.getResponseHeaders();
-                  fetchStatus.resultSignal = RESULT_VERSION_NEEDED;
-                  activityResultCode = null;
-                }
-                else
-                {
-                  fetchStatus.contextMessage = "it had the wrong content type ('"+contentType+"')";
-                  fetchStatus.resultSignal = RESULT_NO_DOCUMENT;
-                  activityResultCode = null;
-                }
-              }
-              else
-              {
-                // We got some kind of http error code.
-                // We don't want to remove it from the queue entirely, because that would cause us to lose track of the item, and therefore lose
-                // control of all scheduling around it.  Instead, we leave it on the queue and give it an empty version string; that will lead it to be
-                // reprocessed without fail on the next scheduled check.
-                // Decode response body to the extent we can
-                String contentType = extractContentType(connection.getResponseHeader("Content-Type"));
-                String encoding = extractEncoding(contentType);
-                if (encoding == null)
-                  encoding = StandardCharsets.UTF_8.name();
-                String decodedResponse = "undecodable";
-                try
-                {
-                  decodedResponse = "'"+connection.getLimitedResponseBody(1024,encoding)+"'";
-                }
-                catch (ManifoldCFException e)
-                {
-                  // Eat this exception unless it is an interrupt
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    throw e;
-                  connection.noteInterrupted(e);
-                }
-                catch (ServiceInterruption e)
-                {
-                  // Eat this exception too
-                  connection.noteInterrupted(e);
-                }
-                fetchStatus.contextMessage = "it failed to fetch (status="+Integer.toString(response)+", message="+decodedResponse+")";
-                fetchStatus.resultSignal = RESULT_NO_VERSION;
-                activityResultCode = null;
-              }
-            }
-            catch (ManifoldCFException e)
-            {
-              connection.noteInterrupted(e);
-              throw e;
-            }
-            catch (ServiceInterruption e)
-            {
-              connection.noteInterrupted(e);
-              throw e;
-            }
-            finally
-            {
-              connection.doneFetch(activities);
-            }
-          }
-          finally
-          {
-            connection.close();
-          }
-
-          // State transition logic.  If the result indicates a successful fetch so far, we need to decide where to go next.
-          // This happens AFTER we've released all the connections, because it's conceivable that processing here might be
-          // significant, and we don't want to tie things up unnecessarily.
-          String preferredLink = null;
-          String preferredRedirection = null;
-          formData = null;
-          String contentLink = null;
-          if (fetchStatus.resultSignal == RESULT_VERSION_NEEDED)
-          {
-            // If we get here, we know:
-            // (a) There's a cached version of the page on disk we can read as many times as necessary;
-            // (b) The saved cookies have not been updated yet, so we'll need to do that where appropriate.
-
-            // The way we determine if we're in the login sequence for a site is by TWO criteria:
-            // (1) The URI must match the specified regular expression, and
-            // (2) The data from that URI must contain the specified form or link information.
-            // We use the same criteria to look for the exit from a sequence.  So, in essence, we're *always* going to need to know whether we're
-            // officially in the sequence, or not, so we evaluate it always.
-            boolean isLoginPage = false;
-            if (sessionCredential != null)
-            {
-              Iterator iterMatches = sessionCredential.findLoginParameters(currentURI);
-              boolean seenAnything = false;
-              boolean seenFormError = false;
-              boolean seenLinkError = false;
-              boolean seenRedirectionError = false;
-              boolean seenContentError = false;
-              while (iterMatches.hasNext())
-              {
-                seenAnything = true;
-                LoginParameters lp = (LoginParameters)iterMatches.next();
-                // Note that more than one of the rules may match.
-                // In that case, a clear order of precedence applies between form-style rules and link-style: form has priority.
-                // If more than one of the same kind of rule is seen, then all bets are off, a warning is displayed, and nothing is
-                // matched.
-
-                // Parse the page; it had better match up!  Otherwise we get null back.
-                FormData newFormData = findHTMLForm(currentURI,lp);
-                if (newFormData != null)
-                {
-                  if (formData != null)
-                  {
-                    // Oops, more than one matching form rule.  Complain.
-                    seenFormError = true;
-                    formData = null;
-                  }
-                  else if (!seenFormError)
-                  {
-                    // A form overrides links, redirection, or content
-                    formData = newFormData;
-                    preferredLink = null;
-                    preferredRedirection = null;
-                  }
-                }
-                else
-                {
-                  // Look for the preferred link instead.
-                  String newPreferredLink = findHTMLLinkURI(currentURI,lp);
-                  if (newPreferredLink != null)
-                  {
-                    if (preferredLink != null)
-                    {
-                      // Oops
-                      seenLinkError = true;
-                      preferredLink = null;
-                    }
-                    else if (!seenLinkError && !seenFormError && formData == null)
-                    {
-                      // Link overrides redirection and content
-                      preferredLink = newPreferredLink;
-                      preferredRedirection = null;
-                    }
-                  }
-                  else
-                  {
-                    // Look for the preferred redirection.
-                    String newPreferredRedirection = findPreferredRedirectionURI(currentURI,lp);
-                    if (newPreferredRedirection != null)
-                    {
-                      if (preferredRedirection != null)
-                      {
-                        seenRedirectionError = true;
-                        preferredRedirection = null;
-                      }
-                      else if (!seenRedirectionError && !seenLinkError && !seenFormError && formData == null && preferredLink == null)
-                      {
-                        preferredRedirection = newPreferredRedirection;
-                      }
-                    }
-                    else
-                    {
-                      // Look for the content in the page.  The link returned may be an empty string, if matching content
-                      // is discovered but there is no override.  It will be null of the content is not found.
-                      String newContentLink = findSpecifiedContent(currentURI,lp);
-                      if (newContentLink != null)
-                      {
-                        if (contentLink != null)
-                        {
-                          seenContentError = true;
-                          contentLink = null;
-                        }
-                        else if (!seenContentError && !seenRedirectionError && !seenLinkError && !seenFormError && formData == null && preferredLink == null && preferredRedirection == null)
-                        {
-                          contentLink = newContentLink;
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-
-              // Now, evaluate all the data and pick the right rule
-              if (formData != null)
-              {
-                // We found the right form!  And, we filled it in.  So now we enter the "login sequence".
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: Document '"+currentURI+"' matches form, so determined to be login page for sequence '"+sessionCredential.getSequenceKey()+"'");
-                isLoginPage = true;
-              }
-              else if (preferredLink != null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: Document '"+currentURI+"' matches preferred link, so determined to be login page for sequence '"+sessionCredential.getSequenceKey()+"'");
-                isLoginPage = true;
-              }
-              else if (preferredRedirection != null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: Document '"+currentURI+"' matches preferred redirection, so determined to be login page for sequence '"+sessionCredential.getSequenceKey()+"'");
-                isLoginPage = true;
-              }
-              else if (contentLink != null)
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: Document '"+currentURI+"' matches content, so determined to be login page for sequence '"+sessionCredential.getSequenceKey()+"'");
-                isLoginPage = true;
-              }
-              else
-              {
-                if (seenAnything && Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: Document '"+currentURI+"' did not match expected form, link, redirection, or content for sequence '"+sessionCredential.getSequenceKey()+"'");
-              }
-            }
-
-            // Should we do a state transition into the "logging in" state?
-            if (fetchStatus.sessionState == SESSIONSTATE_NORMAL && isLoginPage)
-            {
-              // Entering the login sequence.  Make sure we actually can do this...
-              if (activities.beginEventSequence(globalSequenceEvent))
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: For document '"+documentIdentifier+"', beginning login sequence '"+sessionCredential.getSequenceKey()+"'");
-
-                activities.recordActivity(null,WebcrawlerConnector.ACTIVITY_LOGON_START,
-                  null,sessionCredential.getSequenceKey(),"OK",null,null);
-
-                // Transition to the right state, etc.
-                fetchStatus.sessionState = SESSIONSTATE_LOGIN;
-              }
-              else
-              {
-                if (Logging.connectors.isDebugEnabled())
-                  Logging.connectors.debug("WEB: For document '"+documentIdentifier+"', login sequence '"+sessionCredential.getSequenceKey()+"' was already in progress.");
-
-                // Didn't make it in.  Retry the main URI when the proper conditions are met.
-                // We don't want the cached data anymore.
-                cache.deleteData(currentURI);
-                fetchStatus.contextMessage = "login sequence already in progress";
-                fetchStatus.resultSignal = RESULT_RETRY_DOCUMENT;
-                activityResultCode = null;
-              }
-            }
-            else if (fetchStatus.sessionState == SESSIONSTATE_LOGIN && isLoginPage == false)
-            {
-              //== Exit login mode ==
-              activities.completeEventSequence(globalSequenceEvent);
-              activities.recordActivity(null,WebcrawlerConnector.ACTIVITY_LOGON_END,
-                null,sessionCredential.getSequenceKey(),"OK",null,null);
-              fetchStatus.sessionState = SESSIONSTATE_NORMAL;
-              // Make sure we go back and try the original document again, if we happened to have been directed somewhere else
-              if (!currentURI.equals(documentIdentifier))
-              {
-                cache.deleteData(currentURI);
-                currentURI = documentIdentifier;
-                continue;
-              }
-              // Otherwise, the last fetch stands on its own.  Fall through, and allow processing and link extraction
-            }
-              
-            // Now, based on the session state and the document contents, decide how to proceed
-            if (fetchStatus.resultSignal == RESULT_VERSION_NEEDED && fetchStatus.sessionState == SESSIONSTATE_LOGIN)
-            {
-              // We are dealing with a login page!
-
-              // We need to (a) figure out what the next URI should be, and (b) record form information that it might need.
-              // This is a bit dicey because there's really
-              // no good way to *guarantee* that we pick the right one, if there's more than one available.
-              // What we do is the following:
-              //
-              // (a) We look for matching forms.  If we found one, we submit it.
-              // (b) Look for redirections.
-              // (c) If there are links that vector within the login sequence, we pick one of those preferentially.
-              // (d) If there are no links that vector within the login sequence, we pick one of the other links.
-              //
-              // Note well that it's probably going to be pretty easy to get this code stuck in an infinite login sequence.
-              // While that won't be a problem performance-wise (because everything is appropriately throttled), it
-              // is obviously not ideal, and furthermore, it will not be possible to crawl a site for which this occurs.
-              //
-              // Longer time (and with higher complexity) we can solve this problem by allowing the user to *specify*
-              // which link they want us to pick for a page.  Hopefully this would not be necessary.
-
-              // Locate the next target URI.
-              String targetURI;
-              if (formData != null)
-                targetURI = formData.getActionURI();
-              else if (preferredLink != null)
-                targetURI = preferredLink;
-              else if (preferredRedirection != null)
-                targetURI = preferredRedirection;
-              else /* if (contentLink != null) */
-                targetURI = contentLink;
-
-              // Definitely we don't want the cached data anymore
-              cache.deleteData(currentURI);
-
-              // If the target URI is null, it means we could not find a suitable link.  If target URI is "",
-              // it means that we found a designated logon page but the description did not include a link we
-              // could chase.  Either way, treat this exactly the same
-              // way as if the link found exited login mode.
-              if (targetURI == null || targetURI.length() == 0)
-              {
-                //== Exiting login mode ==
-                activities.completeEventSequence(globalSequenceEvent);
-                activities.recordActivity(null,WebcrawlerConnector.ACTIVITY_LOGON_END,
-                  null,sessionCredential.getSequenceKey(),"NEXTLINKNOTFOUND","Could not find a usable link to the next page: "+fetchStatus.contextMessage,null);
-                fetchStatus.sessionState = SESSIONSTATE_NORMAL;
-                // Make sure we go back and try the original document again, no matter where we got directed to
-                currentURI = documentIdentifier;
-              }
-              else
-              {
-                currentURI = targetURI;
-              }
-              continue;
-            }
-            else if (fetchStatus.resultSignal != RESULT_VERSION_NEEDED && fetchStatus.sessionState == SESSIONSTATE_LOGIN)
-            {
-              // The next URL we fetched in the logon sequence turned out to be unsuitable.
-              // That means that the logon sequence is fundamentally wrong.  The session thus ends,
-              // and of course it will retry, but that's neither here nor there.
-              //== Exiting login mode ==
-              activities.completeEventSequence(globalSequenceEvent);
-              activities.recordActivity(null,WebcrawlerConnector.ACTIVITY_LOGON_END,
-                null,sessionCredential.getSequenceKey(),"LINKTARGETUNSUITABLE","Page was unsuitable for a login sequence because: "+fetchStatus.contextMessage,null);
-              fetchStatus.sessionState = SESSIONSTATE_NORMAL;
-              // Fall through, leaving everything else alone.
-            }
-          }
-
-        }
-        else if (robotsStatus == RESULTSTATUS_FALSE)
-        {
-          activityResultCode = "-11";
-          fetchStatus.contextMessage = "robots.txt says so";
-          fetchStatus.resultSignal = RESULT_NO_DOCUMENT;
-        }
-        else
-        {
-          // Robots prerequisite in progress
-          activityResultCode = null;
-          fetchStatus.resultSignal = RESULT_RETRY_DOCUMENT;
-          fetchStatus.contextMessage = "robots prerequisite already in progress";
-        }
-      }
-      else if (ipAddressStatus == RESULTSTATUS_FALSE)
-      {
-        activityResultCode = "-10";
-        fetchStatus.contextMessage = "ip address not found";
-        fetchStatus.resultSignal = RESULT_NO_DOCUMENT;
-      }
-      else
-      {
-        // DNS prerequisite in progress
-        activityResultCode = null;
-        fetchStatus.contextMessage = "dns prerequisite already in progress";
-        fetchStatus.resultSignal = RESULT_RETRY_DOCUMENT;
-      }
-      
-      // If we fail on a document that's not the primary, the result should be to retry the primary later.
-      if (!currentURI.equals(documentIdentifier))
-      {
-        activityResultCode = null;
-        if (fetchStatus.contextMessage != null)
-          fetchStatus.contextMessage = "for login sequence url '"+currentURI+"': "+fetchStatus.contextMessage;
-        if (fetchStatus.resultSignal != RESULT_VERSION_NEEDED)
-          fetchStatus.resultSignal = RESULT_RETRY_DOCUMENT;
-      }
-
-      break;
-    }
-
-    // Now, look at the result signal, and set up the version appropriately.
-    if (activityResultCode != null)
-      activities.recordActivity(null,ACTIVITY_FETCH,null,documentIdentifier,activityResultCode,fetchStatus.contextMessage,null);
-    
-  }
-
-  protected void processDocument(IProcessActivity activities, String documentIdentifier, String versionString,
-    boolean indexDocument, Map<String,Set<String>> metaHash, String[] acls, DocumentURLFilter filter)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Consider this document for ingestion.
-    String errorCode = null;
-    String errorDesc = null;
-    Long fileLengthLong = null;
-    long startTime = System.currentTimeMillis();
-    
-    try
-    {
-      // We can exclude it if it does not seem to be a kind of document that the ingestion system knows
-      // about.
-      
-      if (!indexDocument)
-      {
-        errorCode = "CONTENTNOTINDEXABLE";
-        errorDesc = "Content not indexable";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-      
-      int responseCode = cache.getResponseCode(documentIdentifier);
-      if (responseCode != 200)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not indexing because response code not indexable: "+responseCode);
-        errorCode = "RESPONSECODENOTINDEXABLE";
-        errorDesc = "HTTP response code not indexable ("+responseCode+")";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-
-      long dataLength = cache.getDataLength(documentIdentifier);
-      if (!activities.checkLengthIndexable(dataLength))
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not indexing because pipeline thinks length "+dataLength+" is not acceptable");
-        errorCode = activities.EXCLUDED_LENGTH;
-        errorDesc = "Rejected due to length ("+dataLength+")";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-
-      if (activities.checkURLIndexable(documentIdentifier) == false)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not indexing because output connector does not want URL");
-        errorCode = activities.EXCLUDED_URL;
-        errorDesc = "Rejected due to URL ('"+documentIdentifier+"')";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-
-      String ingestURL = filter.isDocumentIndexable(documentIdentifier);
-      if (ingestURL == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not indexing because document does not match web job constraints");
-        errorCode = "JOBRESTRICTION";
-        errorDesc = "Rejected because job excludes this URL ('"+documentIdentifier+"')";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-      
-      // Check if it's a recognized content type
-      String contentType = cache.getContentType(documentIdentifier);
-
-      // Some sites have multiple content types.  We just look at the LAST one in that case.
-      if (contentType != null)
-      {
-        String[] contentTypes = contentType.split(",");
-        if (contentTypes.length > 0)
-          contentType = contentTypes[contentTypes.length-1].trim();
-        else
-          contentType = null;
-      }
-
-      if (contentType != null)
-      {
-        int pos = contentType.indexOf(";");
-        if (pos != -1)
-          contentType = contentType.substring(0,pos);
-        contentType = contentType.trim();
-      }
-
-      if (!activities.checkMimeTypeIndexable(contentType))
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not indexing because output connector does not want mime type '"+contentType+"'");
-        errorCode = activities.EXCLUDED_MIMETYPE;
-        errorDesc = "Rejected because of mime type ("+contentType+")";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-
-      if(!filter.isDocumentContentIndexable(documentIdentifier)){
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not indexing because document content matched document content exclusion rule");
-        errorCode = activities.EXCLUDED_CONTENT;
-        errorDesc = "Rejected due to content exclusion rule";
-        activities.noDocument(documentIdentifier,versionString);
-        return;
-      }
-      // Ingest the document
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("WEB: Decided to ingest '"+documentIdentifier+"'");
-
-      RepositoryDocument rd = new RepositoryDocument();
-
-      // Set the file name
-      String fileName = "";
-      try {
-        fileName = documentIdentifiertoFileName(documentIdentifier);
-      } catch (URISyntaxException e1) {
-        fileName = "";
-      }
-      if (fileName.length() > 0){
-        rd.setFileName(fileName);
-      }
-          
-      // Set the content type
-      String mimeType = cache.getContentType(documentIdentifier);
-      if (mimeType != null)
-        rd.setMimeType(mimeType);
-          
-      // Turn into acls and add into description
-      String[] denyAcls;
-      if (acls == null)
-        denyAcls = null;
-      else
-      {
-        if (acls.length > 0)
-          denyAcls = new String[]{defaultAuthorityDenyToken};
-        else
-          denyAcls = new String[0];
-      }
-      
-      if (acls != null && denyAcls != null)
-        rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,acls,denyAcls);
-
-      // Grab metadata
-      for (String key : metaHash.keySet())
-      {
-        Set<String> metaList = metaHash.get(key);
-        String[] values = new String[metaList.size()];
-        int k = 0;
-        for (String value : metaList)
-        {
-          values[k++] = value;
-        }
-        rd.addField(key,values);
-      }
-
-      InputStream is = cache.getData(documentIdentifier);
-
-      if (is != null)
-      {
-        try
-        {
-          rd.setBinary(is,dataLength);
-          try
-          {
-            activities.ingestDocumentWithException(documentIdentifier,versionString,ingestURL,rd);
-            errorCode = "OK";
-            fileLengthLong = new Long(dataLength);
-          }
-          catch (IOException e)
-          {
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            handleIOException(e,"reading data");
-          }
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IOException e)
-          {
-            errorCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-            errorDesc = e.getMessage();
-            handleIOException(e,"closing stream");
-          }
-        }
-      }
-      else
-        Logging.connectors.error("WEB: Expected a cached document for '"+documentIdentifier+"', but none present!");
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        errorCode = null;
-      throw e;
-    }
-    finally
-    {
-      if (errorCode != null)
-        activities.recordActivity(new Long(startTime),ACTIVITY_PROCESS,
-          fileLengthLong,documentIdentifier,errorCode,errorDesc,null);
-    }
-
-
-  }
-  
-  protected static String extractContentType(String contentType)
-  {
-    // Some sites have multiple content types.  We just look at the LAST one in that case.
-    if (contentType != null)
-    {
-      String[] contentTypes = contentType.split(",");
-      if (contentTypes.length > 0)
-        contentType = contentTypes[contentTypes.length-1].trim();
-      else
-        contentType = null;
-    }
-    return contentType;
-  }
-
-  protected static String extractEncoding(String contentType)
-  {
-    if (contentType == null)
-      return null;
-    int semiIndex = contentType.indexOf(";");
-    if (semiIndex == -1)
-      return null;
-    String suffix = contentType.substring(semiIndex+1);
-    suffix = suffix.trim();
-    if (suffix.startsWith("charset="))
-      return suffix.substring("charset=".length());
-    return null;
-  }
-  
-  protected static String extractMimeType(String contentType)
-  {
-    if (contentType == null)
-      return null;
-    int semiIndex = contentType.indexOf(";");
-    if (semiIndex != -1)
-      contentType = contentType.substring(0,semiIndex);
-    contentType = contentType.trim();
-    return contentType;
-  }
-  
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (e instanceof java.net.SocketException)
-      throw new ManifoldCFException("Socket timeout error "+context+": "+e.getMessage(),e);
-    else if (e instanceof ConnectTimeoutException)
-      throw new ManifoldCFException("Socket connect timeout error "+context+": "+e.getMessage(),e);
-    else if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    else
-      throw new ManifoldCFException("IO error "+context+": "+e.getMessage(),e);
-  }
-  
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // The web in general does not batch well.  Multiple chunks have no advantage over one-at-a-time requests.
-    return 1;
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Email"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Robots"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Bandwidth"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.AccessCredentials"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Certificates"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Proxy"));
-
-    final Map<String,Object> velocityContext = new HashMap<String,Object>();
-    Messages.outputResourceWithVelocity(out, locale, "editConfiguration.js.vm", velocityContext);
-  }
-
-  private void fillInEmailTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    String email = parameters.getParameter(WebcrawlerConfig.PARAMETER_EMAIL);
-    if (email == null)
-      email = "";
-
-    velocityContext.put("EMAIL",email);
-  }
-
-  private void fillInRobotsTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    String robotsUsage = parameters.getParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE);
-    if (robotsUsage == null)
-      robotsUsage = "all";
-    String metaRobotsTagsUsage = parameters.getParameter(WebcrawlerConfig.PARAMETER_META_ROBOTS_TAGS_USAGE);
-    if (metaRobotsTagsUsage == null)
-      metaRobotsTagsUsage = "all";
-
-    velocityContext.put("ROBOTSUSAGE",robotsUsage);
-    velocityContext.put("METAROBOTSTAGSUSAGE",metaRobotsTagsUsage);
-  }
-
-  private void fillInBandwidthTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    int i = 0;
-    int binCounter = 0;
-    List<Map<String,String>> throttlesMapList = new ArrayList<>();
-    while (i < parameters.getChildCount())
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(WebcrawlerConfig.NODE_BINDESC))
-      {
-        Map<String,String> throttleMap = new HashMap<>();
-        // A bin description node!  Look for all its parameters.
-        String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_BINREGEXP);
-        String isCaseInsensitive = cn.getAttributeValue(WebcrawlerConfig.ATTR_INSENSITIVE);
-        String maxConnections = null;
-        String maxKBPerSecond = null;
-        String maxFetchesPerMinute = null;
-        int j = 0;
-        while (j < cn.getChildCount())
-        {
-          ConfigNode childNode = cn.getChild(j++);
-          if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXCONNECTIONS))
-            maxConnections = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXKBPERSECOND))
-            maxKBPerSecond = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE))
-            maxFetchesPerMinute = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-        }
-        if (maxConnections == null)
-          maxConnections = "";
-        if (maxKBPerSecond == null)
-          maxKBPerSecond = "";
-        if (maxFetchesPerMinute == null)
-          maxFetchesPerMinute = "";
-        if(regexp == null)
-          regexp = "";
-
-        if (isCaseInsensitive == null || isCaseInsensitive.length() == 0)
-          isCaseInsensitive = "false";
-
-        throttleMap.put("regexp",regexp);
-        throttleMap.put("isCaseInsensitive",isCaseInsensitive);
-        throttleMap.put("maxConnections",maxConnections);
-        throttleMap.put("maxKBPerSecond",maxKBPerSecond);
-        throttleMap.put("maxFetchesPerMinute",maxFetchesPerMinute);
-        throttlesMapList.add(throttleMap);
-        binCounter++;
-      }
-    }
-    if (parameters.getChildCount() == 0)
-    {
-      velocityContext.put("BRANDNEW",true);
-    }
-    velocityContext.put("THROTTLESMAPLIST",throttlesMapList);
-  }
-
-  private void fillInProxyTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
-  {
-    String proxyHost = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYHOST);
-    if (proxyHost == null)
-      proxyHost = "";
-    String proxyPort = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYPORT);
-    if (proxyPort == null)
-      proxyPort = "";
-    String proxyAuthDomain = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHDOMAIN);
-    if (proxyAuthDomain == null)
-      proxyAuthDomain = "";
-    String proxyAuthUsername = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHUSERNAME);
-    if (proxyAuthUsername == null)
-      proxyAuthUsername = "";
-    String proxyAuthPassword = parameters.getObfuscatedParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHPASSWORD);
-    if (proxyAuthPassword == null)
-      proxyAuthPassword = "";
-    else
-      proxyAuthPassword = out.mapPasswordToKey(proxyAuthPassword);
-
-    velocityContext.put("PROXYHOST",proxyHost);
-    velocityContext.put("PROXYPORT",proxyPort);
-    velocityContext.put("PROXYAUTHDOMAIN",proxyAuthDomain);
-    velocityContext.put("PROXYAUTHUSERNAME",proxyAuthUsername);
-    velocityContext.put("PROXYAUTHPASSWORD",proxyAuthPassword);
-  }
-
-  private void fillInCertificatesTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters) throws ManifoldCFException
-  {
-    int i = 0;
-    List<Map<String,String>> trustMapList = new ArrayList<>();
-    while (i < parameters.getChildCount())
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(WebcrawlerConfig.NODE_TRUST))
-      {
-        Map<String,String> trustMap = new HashMap<>();
-
-        // A bin description node!  Look for all its parameters.
-        String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-        String trustEverything = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTEVERYTHING);
-
-        if(trustEverything == null)
-        {
-          trustEverything = "false";
-        }
-
-        trustMap.put("trustEverything",trustEverything);
-        trustMap.put("regexp",regexp);
-
-        if(trustEverything == "false")
-        {
-          String trustStore = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTSTORE);
-          IKeystoreManager localTruststore = KeystoreManagerFactory.make("",trustStore);
-          String[] truststoreContents = localTruststore.getContents();
-
-          // Each trust store will have only at most one cert in it at this level.  These individual certs are assembled into the proper trust store
-          // for each individual url at fetch time.
-
-          if (truststoreContents.length == 1)
-          {
-            String alias = truststoreContents[0];
-            String description = localTruststore.getDescription(alias);
-            String shortenedDescription = description;
-            if (shortenedDescription.length() > 100)
-              shortenedDescription = shortenedDescription.substring(0,100) + "...";
-
-            trustMap.put("trustStore",trustStore);
-            trustMap.put("shortenedDescription",shortenedDescription);
-          }
-        }
-        trustMapList.add(trustMap);
-      }
-    }
-    velocityContext.put("TRUSTMAPLIST",trustMapList);
-  }
-
-  private void fillInAccessTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters) throws ManifoldCFException
-  {
-    int i = 0;
-    List<Map<String,String>> pageAccessMapList = new ArrayList<>();
-    while (i < parameters.getChildCount())
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
-      {
-        Map<String,String> pageAccessMap = new HashMap<>();
-
-        // A bin description node!  Look for all its parameters.
-        String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-        if (!type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-        {
-          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-          if(regexp == null)
-            regexp = "";
-          String domain = cn.getAttributeValue(WebcrawlerConfig.ATTR_DOMAIN);
-          if (domain == null)
-            domain = "";
-          String userName = cn.getAttributeValue(WebcrawlerConfig.ATTR_USERNAME);
-          String password = out.mapPasswordToKey(ManifoldCF.deobfuscate(cn.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD)));
-
-          pageAccessMap.put("regexp",regexp);
-          pageAccessMap.put("domain",domain);
-          pageAccessMap.put("userName",userName);
-          pageAccessMap.put("password",password);
-          pageAccessMap.put("type",type);
-
-          pageAccessMapList.add(pageAccessMap);
-        }
-      }
-    }
-    velocityContext.put("PAGEACCESSMAPLIST",pageAccessMapList);
-
-    i = 0;
-    List<Map<String,Object>> sessionAccessMapList = new ArrayList<>();
-    while (i < parameters.getChildCount())
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
-      {
-        // A bin description node!  Look for all its parameters.
-        String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-        if (type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-        {
-          Map<String,Object> sessionAccessMap = new HashMap<>();
-          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-          if(regexp == null)
-            regexp = "";
-          sessionAccessMap.put("regexp",regexp);
-
-          int q = 0;
-          List<Map<String,Object>> authPageMapList = new ArrayList<>();
-          while (q < cn.getChildCount())
-          {
-            ConfigNode authPageNode = cn.getChild(q++);
-            if (authPageNode.getType().equals(WebcrawlerConfig.NODE_AUTHPAGE))
-            {
-              Map<String,Object> authPageMap = new HashMap<>();
-
-              String pageRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-              String pageType = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-              String matchRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_MATCHREGEXP);
-              if (matchRegexp == null)
-                matchRegexp = "";
-              String overrideTargetURL = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_OVERRIDETARGETURL);
-              if (overrideTargetURL == null)
-                overrideTargetURL = "";
-
-              authPageMap.put("pageRegexp",pageRegexp);
-              authPageMap.put("pageType",pageType);
-              authPageMap.put("matchRegexp",matchRegexp);
-              authPageMap.put("overrideTargetURL",overrideTargetURL);
-
-              if (pageType.equals(WebcrawlerConfig.ATTRVALUE_FORM))
-              {
-                int z = 0;
-                List<Map<String,String>> authPageParamMapList = new ArrayList<>();
-                while (z < authPageNode.getChildCount())
-                {
-                  ConfigNode paramNode = authPageNode.getChild(z++);
-                  if (paramNode.getType().equals(WebcrawlerConfig.NODE_AUTHPARAMETER))
-                  {
-                    Map<String,String> authPageParamMap = new HashMap<>();
-
-                    String param = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_NAMEREGEXP);
-                    if (param == null)
-                      param = "";
-                    String value = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-                    if (value == null)
-                      value = "";
-                    String password = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD);
-                    if (password == null)
-                      password = "";
-                    else
-                      password = out.mapPasswordToKey(ManifoldCF.deobfuscate(password));
-
-                    authPageParamMap.put("param",param);
-                    authPageParamMap.put("value",value);
-                    authPageParamMap.put("password",password);
-
-                    authPageParamMapList.add(authPageParamMap);
-                  }
-                }
-                authPageMap.put("authPageParamMapList",authPageParamMapList);
-              }
-              authPageMapList.add(authPageMap);
-            }
-          }
-          sessionAccessMap.put("authPageMapList",authPageMapList);
-          sessionAccessMapList.add(sessionAccessMap);
-        }
-      }
-    }
-    velocityContext.put("SESSIONACCESSMAPLIST",sessionAccessMapList);
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-
-    final Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("TABNAME",tabName);
-
-    fillInEmailTab(velocityContext,out,parameters);
-    fillInRobotsTab(velocityContext,out,parameters);
-    fillInBandwidthTab(velocityContext,out,parameters);
-    fillInAccessTab(velocityContext,out,parameters);
-    fillInCertificatesTab(velocityContext,out,parameters);
-    fillInProxyTab(velocityContext,out,parameters);
-
-    // Email tab
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Email.html.vm",velocityContext);
-    // Robots tab
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Robots.html.vm",velocityContext);
-    //Bandwidth tab
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Bandwidth.html.vm",velocityContext);
-    // Access Credentials tab
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Access.html.vm",velocityContext);
-    //Certificates tab
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Certificates.html.vm",velocityContext);
-    // Proxy tab
-    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Proxy.html.vm",velocityContext);
-
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String email = variableContext.getParameter("email");
-    if (email != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_EMAIL,email);
-    String robotsUsage = variableContext.getParameter("robotsusage");
-    if (robotsUsage != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE,robotsUsage);
-    String obeyMetaRobotsTags = variableContext.getParameter("metarobotstagsusage");
-    if (obeyMetaRobotsTags != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_META_ROBOTS_TAGS_USAGE, obeyMetaRobotsTags);
-    String proxyHost = variableContext.getParameter("proxyhost");
-    if (proxyHost != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_PROXYHOST,proxyHost);
-    String proxyPort = variableContext.getParameter("proxyport");
-    if (proxyPort != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_PROXYPORT,proxyPort);
-    String proxyAuthDomain = variableContext.getParameter("proxyauthdomain");
-    if (proxyAuthDomain != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHDOMAIN,proxyAuthDomain);
-    String proxyAuthUsername = variableContext.getParameter("proxyauthusername");
-    if (proxyAuthUsername != null)
-      parameters.setParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHUSERNAME,proxyAuthUsername);
-    String proxyAuthPassword = variableContext.getParameter("proxyauthpassword");
-    if (proxyAuthPassword != null)
-      parameters.setObfuscatedParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHPASSWORD,variableContext.mapKeyToPassword(proxyAuthPassword));
-
-    String x = variableContext.getParameter("bandwidth_count");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the bandwidth nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode node = parameters.getChild(i);
-        if (node.getType().equals(WebcrawlerConfig.NODE_BINDESC))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String prefix = "bandwidth_"+Integer.toString(i);
-        String op = variableContext.getParameter("op_"+prefix);
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the regexp etc.
-          String regexp = variableContext.getParameter("regexp_"+prefix);
-          String isCaseInsensitive = variableContext.getParameter("insensitive_"+prefix);
-          String maxConnections = variableContext.getParameter("connections_"+prefix);
-          String rate = variableContext.getParameter("rate_"+prefix);
-          String fetches = variableContext.getParameter("fetches_"+prefix);
-          ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_BINDESC);
-          node.setAttribute(WebcrawlerConfig.ATTR_BINREGEXP,regexp);
-          if (isCaseInsensitive != null && isCaseInsensitive.length() > 0)
-            node.setAttribute(WebcrawlerConfig.ATTR_INSENSITIVE,isCaseInsensitive);
-          if (maxConnections != null && maxConnections.length() > 0)
-          {
-            ConfigNode child = new ConfigNode(WebcrawlerConfig.NODE_MAXCONNECTIONS);
-            child.setAttribute(WebcrawlerConfig.ATTR_VALUE,maxConnections);
-            node.addChild(node.getChildCount(),child);
-          }
-          if (rate != null && rate.length() > 0)
-          {
-            ConfigNode child = new ConfigNode(WebcrawlerConfig.NODE_MAXKBPERSECOND);
-            child.setAttribute(WebcrawlerConfig.ATTR_VALUE,rate);
-            node.addChild(node.getChildCount(),child);
-          }
-          if (fetches != null && fetches.length() > 0)
-          {
-            ConfigNode child = new ConfigNode(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE);
-            child.setAttribute(WebcrawlerConfig.ATTR_VALUE,fetches);
-            node.addChild(node.getChildCount(),child);
-          }
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        i++;
-      }
-      String addop = variableContext.getParameter("bandwidth_op");
-      if (addop != null && addop.equals("Add"))
-      {
-        String regexp = variableContext.getParameter("regexp_bandwidth");
-        String isCaseInsensitive = variableContext.getParameter("insensitive_bandwidth");
-        String maxConnections = variableContext.getParameter("connections_bandwidth");
-        String rate = variableContext.getParameter("rate_bandwidth");
-        String fetches = variableContext.getParameter("fetches_bandwidth");
-        ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_BINDESC);
-        node.setAttribute(WebcrawlerConfig.ATTR_BINREGEXP,regexp);
-        if (isCaseInsensitive != null && isCaseInsensitive.length() > 0)
-          node.setAttribute(WebcrawlerConfig.ATTR_INSENSITIVE,isCaseInsensitive);
-        if (maxConnections != null && maxConnections.length() > 0)
-        {
-          ConfigNode child = new ConfigNode(WebcrawlerConfig.NODE_MAXCONNECTIONS);
-          child.setAttribute(WebcrawlerConfig.ATTR_VALUE,maxConnections);
-          node.addChild(node.getChildCount(),child);
-        }
-        if (rate != null && rate.length() > 0)
-        {
-          ConfigNode child = new ConfigNode(WebcrawlerConfig.NODE_MAXKBPERSECOND);
-          child.setAttribute(WebcrawlerConfig.ATTR_VALUE,rate);
-          node.addChild(node.getChildCount(),child);
-        }
-        if (fetches != null && fetches.length() > 0)
-        {
-          ConfigNode child = new ConfigNode(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE);
-          child.setAttribute(WebcrawlerConfig.ATTR_VALUE,fetches);
-          node.addChild(node.getChildCount(),child);
-        }
-        parameters.addChild(parameters.getChildCount(),node);
-      }
-    }
-    
-    x = variableContext.getParameter("acredential_count");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the access credential nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode node = parameters.getChild(i);
-        if (node.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL)
-                                  && !node.getAttributeValue(WebcrawlerConfig.ATTR_TYPE).equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String prefix = "acredential_"+Integer.toString(i);
-        String op = variableContext.getParameter("op_"+prefix);
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the regexp etc.
-          String regexp = variableContext.getParameter("regexp_"+prefix);
-          String type = variableContext.getParameter("type_"+prefix);
-          String domain = variableContext.getParameter("domain_"+prefix);
-          if (domain == null)
-            domain = "";
-          String userName = variableContext.getParameter("username_"+prefix);
-          String password = variableContext.getParameter("password_"+prefix);
-          ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_ACCESSCREDENTIAL);
-          node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-          node.setAttribute(WebcrawlerConfig.ATTR_TYPE,type);
-          node.setAttribute(WebcrawlerConfig.ATTR_DOMAIN,domain);
-          node.setAttribute(WebcrawlerConfig.ATTR_USERNAME,userName);
-          node.setAttribute(WebcrawlerConfig.ATTR_PASSWORD,
-            ManifoldCF.obfuscate(variableContext.mapKeyToPassword(password)));
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        i++;
-      }
-      String addop = variableContext.getParameter("acredential_op");
-      if (addop != null && addop.equals("Add"))
-      {
-        String regexp = variableContext.getParameter("regexp_acredential");
-        String type = variableContext.getParameter("type_acredential");
-        String domain = variableContext.getParameter("domain_acredential");
-        String userName = variableContext.getParameter("username_acredential");
-        String password = variableContext.getParameter("password_acredential");
-        ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_ACCESSCREDENTIAL);
-        node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-        node.setAttribute(WebcrawlerConfig.ATTR_TYPE,type);
-        node.setAttribute(WebcrawlerConfig.ATTR_DOMAIN,domain);
-        node.setAttribute(WebcrawlerConfig.ATTR_USERNAME,userName);
-        node.setAttribute(WebcrawlerConfig.ATTR_PASSWORD,ManifoldCF.obfuscate(password));
-        parameters.addChild(parameters.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter("scredential_count");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the access credential nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode node = parameters.getChild(i);
-        if (node.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL)
-                                  && node.getAttributeValue(WebcrawlerConfig.ATTR_TYPE).equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String prefix = "scredential_"+Integer.toString(i);
-        String op = variableContext.getParameter(prefix+"_op");
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the regexp etc.
-          String regexp = variableContext.getParameter(prefix+"_regexp");
-          ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_ACCESSCREDENTIAL);
-          node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-          node.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_SESSION);
-          // How many login pages are there?
-          int loginPageCount = Integer.parseInt(variableContext.getParameter(prefix+"_loginpagecount"));
-          int q = 0;
-          while (q < loginPageCount)
-          {
-            String authpagePrefix = prefix + "_" + Integer.toString(q);
-            String authpageOp = variableContext.getParameter(authpagePrefix+"_op");
-            if (authpageOp == null || !authpageOp.equals("Delete"))
-            {
-              String pageRegexp = variableContext.getParameter(authpagePrefix+"_regexp");
-              String pageType = variableContext.getParameter(authpagePrefix+"_type");
-              String matchRegexp = variableContext.getParameter(authpagePrefix+"_matchregexp");
-              if (matchRegexp == null)
-                matchRegexp = "";
-              String overrideTargetURL = variableContext.getParameter(authpagePrefix+"_overridetargeturl");
-              ConfigNode authPageNode = new ConfigNode(WebcrawlerConfig.NODE_AUTHPAGE);
-              authPageNode.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,pageRegexp);
-              authPageNode.setAttribute(WebcrawlerConfig.ATTR_TYPE,pageType);
-              authPageNode.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,matchRegexp);
-              if (overrideTargetURL != null && overrideTargetURL.length() > 0)
-                authPageNode.setAttribute(WebcrawlerConfig.ATTR_OVERRIDETARGETURL,overrideTargetURL);
-              if (pageType.equals(WebcrawlerConfig.ATTRVALUE_FORM))
-              {
-                // How many parameters are there?
-                int paramCount = Integer.parseInt(variableContext.getParameter(authpagePrefix+"_loginparamcount"));
-                int z = 0;
-                while (z < paramCount)
-                {
-                  String paramPrefix = authpagePrefix+"_"+Integer.toString(z);
-                  String paramOp = variableContext.getParameter(paramPrefix+"_op");
-                  if (paramOp == null || !paramOp.equals("Delete"))
-                  {
-                    String name = variableContext.getParameter(paramPrefix+"_param");
-                    String value = variableContext.getParameter(paramPrefix+"_value");
-                    String password = variableContext.getParameter(paramPrefix+"_password");
-                    ConfigNode paramNode = new ConfigNode(WebcrawlerConfig.NODE_AUTHPARAMETER);
-                    paramNode.setAttribute(WebcrawlerConfig.ATTR_NAMEREGEXP,name);
-                    if (value != null && value.length() > 0)
-                      paramNode.setAttribute(WebcrawlerConfig.ATTR_VALUE,value);
-                    if (password != null && password.length() > 0)
-                      paramNode.setAttribute(WebcrawlerConfig.ATTR_PASSWORD,ManifoldCF.obfuscate(variableContext.mapKeyToPassword(password)));
-                    authPageNode.addChild(authPageNode.getChildCount(),paramNode);
-                  }
-                  z++;
-                }
-                                                  
-                // Look for add op
-                String paramAddOp = variableContext.getParameter(authpagePrefix+"_loginparamop");
-                if (paramAddOp != null && paramAddOp.equals("Add"))
-                {
-                  String name = variableContext.getParameter(authpagePrefix+"_loginparamname");
-                  String value = variableContext.getParameter(authpagePrefix+"_loginparamvalue");
-                  String password = variableContext.getParameter(authpagePrefix+"_loginparampassword");
-                  ConfigNode paramNode = new ConfigNode(WebcrawlerConfig.NODE_AUTHPARAMETER);
-                  paramNode.setAttribute(WebcrawlerConfig.ATTR_NAMEREGEXP,name);
-                  if (value != null && value.length() > 0)
-                    paramNode.setAttribute(WebcrawlerConfig.ATTR_VALUE,value);
-                  if (password != null && password.length() > 0)
-                    paramNode.setAttribute(WebcrawlerConfig.ATTR_PASSWORD,ManifoldCF.obfuscate(password));
-                  authPageNode.addChild(authPageNode.getChildCount(),paramNode);
-                }
-              }
-              
-              node.addChild(node.getChildCount(),authPageNode);
-            }
-            q++;
-          }
-          // Look for add op
-          String authpageAddop = variableContext.getParameter(prefix+"_loginpageop");
-          if (authpageAddop != null && authpageAddop.equals("Add"))
-          {
-            String pageRegexp = variableContext.getParameter(prefix+"_loginpageregexp");
-            String pageType = variableContext.getParameter(prefix+"_loginpagetype");
-            String matchRegexp = variableContext.getParameter(prefix+"_loginpagematchregexp");
-            if (matchRegexp == null)
-              matchRegexp = "";
-            String overrideTargetURL = variableContext.getParameter(prefix+"_loginpageoverridetargeturl");
-            ConfigNode authPageNode = new ConfigNode(WebcrawlerConfig.NODE_AUTHPAGE);
-            authPageNode.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,pageRegexp);
-            authPageNode.setAttribute(WebcrawlerConfig.ATTR_TYPE,pageType);
-            authPageNode.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,matchRegexp);
-            if (overrideTargetURL != null && overrideTargetURL.length() > 0)
-              authPageNode.setAttribute(WebcrawlerConfig.ATTR_OVERRIDETARGETURL,overrideTargetURL);
-            node.addChild(node.getChildCount(),authPageNode);
-          }
-
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        i++;
-      }
-      String addop = variableContext.getParameter("scredential_op");
-      if (addop != null && addop.equals("Add"))
-      {
-        String regexp = variableContext.getParameter("scredential_regexp");
-        ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_ACCESSCREDENTIAL);
-        node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-        node.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_SESSION);
-        parameters.addChild(parameters.getChildCount(),node);
-      }
-    }
-
-    x = variableContext.getParameter("trust_count");
-    if (x != null && x.length() > 0)
-    {
-      // About to gather the trust nodes, so get rid of the old ones.
-      int i = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode node = parameters.getChild(i);
-        if (node.getType().equals(WebcrawlerConfig.NODE_TRUST))
-          parameters.removeChild(i);
-        else
-          i++;
-      }
-      int count = Integer.parseInt(x);
-      i = 0;
-      while (i < count)
-      {
-        String prefix = "trust_"+Integer.toString(i);
-        String op = variableContext.getParameter("op_"+prefix);
-        if (op == null || !op.equals("Delete"))
-        {
-          // Gather the regexp etc.
-          String regexp = variableContext.getParameter("regexp_"+prefix);
-          String trustall = variableContext.getParameter("trustall_"+prefix);
-          String truststore = variableContext.getParameter("truststore_"+prefix);
-          ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_TRUST);
-          node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-          if (trustall != null && trustall.equals("true"))
-            node.setAttribute(WebcrawlerConfig.ATTR_TRUSTEVERYTHING,"true");
-          else
-            node.setAttribute(WebcrawlerConfig.ATTR_TRUSTSTORE,truststore);
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        i++;
-      }
-      String addop = variableContext.getParameter("trust_op");
-      if (addop != null && addop.equals("Add"))
-      {
-        String regexp = variableContext.getParameter("regexp_trust");
-        String trustall = variableContext.getParameter("all_trust");
-        if (trustall != null && trustall.equals("true"))
-        {
-          ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_TRUST);
-          node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-          node.setAttribute(WebcrawlerConfig.ATTR_TRUSTEVERYTHING,"true");
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-        else
-        {
-          byte[] certificateValue = variableContext.getBinaryBytes("certificate_trust");
-          IKeystoreManager mgr = KeystoreManagerFactory.make("");
-          java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
-          String certError = null;
-          try
-          {
-            mgr.importCertificate("Certificate",is);
-          }
-          catch (Throwable e)
-          {
-            certError = e.getMessage();
-          }
-          finally
-          {
-            try
-            {
-              is.close();
-            }
-            catch (IOException e)
-            {
-              // Ignore this
-            }
-          }
-
-          if (certError != null)
-          {
-            // Redirect to error page
-            return "Illegal certificate: "+certError;
-          }
-
-          ConfigNode node = new ConfigNode(WebcrawlerConfig.NODE_TRUST);
-          node.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,regexp);
-          node.setAttribute(WebcrawlerConfig.ATTR_TRUSTSTORE,mgr.getString());
-          parameters.addChild(parameters.getChildCount(),node);
-        }
-      }
-    }
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-
-    final Map<String,Object> velocityContext = new HashMap<String,Object>();
-
-    fillInEmailTab(velocityContext,out,parameters);
-    fillInRobotsTab(velocityContext,out,parameters);
-    fillInBandwidthTab(velocityContext,out,parameters);
-    fillInAccessTab(velocityContext,out,parameters);
-    fillInCertificatesTab(velocityContext,out,parameters);
-    fillInProxyTab(velocityContext,out,parameters);
-
-    Messages.outputResourceWithVelocity(out,locale,"viewConfiguration.html.vm",velocityContext);
-
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Seeds"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Canonicalization"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.URLMappings"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Inclusions"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Exclusions"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Security"));
-    tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Metadata"));
-
-    final Map<String,Object> velocityContext = new HashMap<String,Object>();
-    velocityContext.put("SEQNUM",connectionSequenceNumber);
-
-    Messages.outputResourceWithVelocity(out, locale, "editSpecification.js.vm", velocityContext);
-  }
-
-  private void fillInSeedsTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-
-    int i;
-    String seeds = "";
-
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_SEEDS))
-      {
-        seeds = sn.getValue();
-        if (seeds == null)
-          seeds = "";
-      }
-    }
-
-    velocityContext.put("SEEDS",seeds);
-
-  }
-
-  private void fillInCanonicalizationTab(Map<String,Object> velocityContext, IHTTPOutput out, Locale locale, Specification ds)
-  {
-
-    int q = 0;
-    List<Map<String,String>> canonicalizationMapList = new ArrayList<>();
-    while (q < ds.getChildCount())
-    {
-      SpecificationNode specNode = ds.getChild(q++);
-      if (specNode.getType().equals(WebcrawlerConfig.NODE_URLSPEC))
-      {
-        Map<String,String> canonicalizationMap = new HashMap<>();
-        // Ok, this node matters to us
-        String regexpString = specNode.getAttributeValue(WebcrawlerConfig.ATTR_REGEXP);
-        String description = specNode.getAttributeValue(WebcrawlerConfig.ATTR_DESCRIPTION);
-        if (description == null)
-          description = "";
-        String allowReorder = specNode.getAttributeValue(WebcrawlerConfig.ATTR_REORDER);
-        String allowReorderOutput;
-        if (allowReorder == null || allowReorder.length() == 0)
-        {
-          allowReorder = WebcrawlerConfig.ATTRVALUE_NO;
-          allowReorderOutput = Messages.getBodyString(locale, "WebcrawlerConnector.no");
-        }
-        else
-          allowReorderOutput = allowReorder;
-        String allowJavaSessionRemoval = specNode.getAttributeValue(WebcrawlerConfig.ATTR_JAVASESSIONREMOVAL);
-        String allowJavaSessionRemovalOutput;
-        if (allowJavaSessionRemoval == null || allowJavaSessionRemoval.length() == 0)
-        {
-          allowJavaSessionRemoval = WebcrawlerConfig.ATTRVALUE_NO;
-          allowJavaSessionRemovalOutput = Messages.getBodyString(locale, "WebcrawlerConnector.no");
-        }
-        else
-          allowJavaSessionRemovalOutput = allowJavaSessionRemoval;
-        String allowASPSessionRemoval = specNode.getAttributeValue(WebcrawlerConfig.ATTR_ASPSESSIONREMOVAL);
-        String allowASPSessionRemovalOutput;
-        if (allowASPSessionRemoval == null || allowASPSessionRemoval.length() == 0)
-        {
-          allowASPSessionRemoval = WebcrawlerConfig.ATTRVALUE_NO;
-          allowASPSessionRemovalOutput = Messages.getBodyString(locale, "WebcrawlerConnector.no");
-        }
-        else
-          allowASPSessionRemovalOutput = allowASPSessionRemoval;
-        String allowPHPSessionRemoval = specNode.getAttributeValue(WebcrawlerConfig.ATTR_PHPSESSIONREMOVAL);
-        String allowPHPSessionRemovalOutput;
-        if (allowPHPSessionRemoval == null || allowPHPSessionRemoval.length() == 0)
-        {
-          allowPHPSessionRemoval = WebcrawlerConfig.ATTRVALUE_NO;
-          allowPHPSessionRemovalOutput = Messages.getBodyString(locale, "WebcrawlerConnector.no");
-        }
-        else
-          allowPHPSessionRemovalOutput = allowPHPSessionRemoval;
-        String allowBVSessionRemoval = specNode.getAttributeValue(WebcrawlerConfig.ATTR_BVSESSIONREMOVAL);
-        String allowBVSessionRemovalOutput;
-        if (allowBVSessionRemoval == null || allowBVSessionRemoval.length() == 0)
-        {
-          allowBVSessionRemoval = WebcrawlerConfig.ATTRVALUE_NO;
-          allowBVSessionRemovalOutput = Messages.getBodyString(locale, "WebcrawlerConnector.no");
-        }
-        else
-          allowBVSessionRemovalOutput = allowBVSessionRemoval;
-
-        canonicalizationMap.put("regexpString",regexpString);
-        canonicalizationMap.put("description",description);
-        canonicalizationMap.put("allowReorder",allowReorder);
-        canonicalizationMap.put("allowReorderOutput",allowReorderOutput);
-        canonicalizationMap.put("allowJavaSessionRemoval",allowJavaSessionRemoval);
-        canonicalizationMap.put("allowJavaSessionRemovalOutput",allowJavaSessionRemovalOutput);
-        canonicalizationMap.put("allowASPSessionRemoval",allowASPSessionRemoval);
-        canonicalizationMap.put("allowASPSessionRemovalOutput",allowASPSessionRemovalOutput);
-        canonicalizationMap.put("allowPHPSessionRemoval",allowPHPSessionRemoval);
-        canonicalizationMap.put("allowPHPSessionRemovalOutput",allowPHPSessionRemovalOutput);
-        canonicalizationMap.put("allowBVSessionRemoval",allowBVSessionRemoval);
-        canonicalizationMap.put("allowBVSessionRemovalOutput",allowBVSessionRemovalOutput);
-
-        canonicalizationMapList.add(canonicalizationMap);
-      }
-    }
-
-    velocityContext.put("CANONICALIZATIONMAPLIST",canonicalizationMapList);
-
-  }
-
-  private void fillInMappingsTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-
-    int i;
-    // Find the various strings
-    List<String> regexpList = new ArrayList<String>();
-    List<String> matchStrings = new ArrayList<String>();
-
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_MAP))
-      {
-        String match = sn.getAttributeValue(WebcrawlerConfig.ATTR_MATCH);
-        String map = sn.getAttributeValue(WebcrawlerConfig.ATTR_MAP);
-        if (match != null)
-        {
-          regexpList.add(match);
-          if (map == null)
-            map = "";
-          matchStrings.add(map);
-        }
-      }
-    }
-
-    velocityContext.put("REGEXPLIST",regexpList);
-    velocityContext.put("MATCHSTRINGS",matchStrings);
-
-  }
-
-  private void fillInInclusionsTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-
-    int i;
-    String inclusions = ".*\n";
-    String inclusionsIndex = ".*\n";
-    boolean includeMatching = true;
-
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_INCLUDES))
-      {
-        inclusions = sn.getValue();
-        if (inclusions == null)
-          inclusions = "";
-      }
-      else if (sn.getType().equals(WebcrawlerConfig.NODE_INCLUDESINDEX))
-      {
-        inclusionsIndex = sn.getValue();
-        if (inclusionsIndex == null)
-          inclusionsIndex = "";
-      }
-      else if (sn.getType().equals(WebcrawlerConfig.NODE_LIMITTOSEEDS))
-      {
-        String value = sn.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-        if (value == null || value.equals("false"))
-          includeMatching = false;
-        else
-          includeMatching = true;
-      }
-    }
-
-    velocityContext.put("INCLUSIONS",inclusions);
-    velocityContext.put("INCLUSIONSINDEX",inclusionsIndex);
-    velocityContext.put("INCLUDEMATCHING",includeMatching);
-
-  }
-
-  private void fillInExclusionsTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-
-    int i;
-    String exclusions = "";
-    String exclusionsIndex = "";
-    String exclusionsContentIndex = "";
-
-    i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDES))
-      {
-        exclusions = sn.getValue();
-        if (exclusions == null)
-          exclusions = "";
-      }
-      else if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDESINDEX))
-      {
-        exclusionsIndex = sn.getValue();
-        if (exclusionsIndex == null)
-          exclusionsIndex = "";
-      }
-      else if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDESCONTENTINDEX))
-      {
-        exclusionsContentIndex = sn.getValue();
-        if (exclusionsContentIndex == null)
-          exclusionsContentIndex = "";
-      }
-    }
-
-    velocityContext.put("EXCLUSIONS",exclusions);
-    velocityContext.put("EXCLUSIONSINDEX",exclusionsIndex);
-    velocityContext.put("EXCLUSIONSCONTENTINDEX",exclusionsContentIndex);
-
-  }
-
-  private void fillInSecurityTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-
-    int i = 0;
-
-    // Go through forced ACL
-    Set<String> tokens = new HashSet<>();
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_ACCESS))
-      {
-        String token = sn.getAttributeValue(WebcrawlerConfig.ATTR_TOKEN);
-        tokens.add(token);
-      }
-    }
-
-    velocityContext.put("TOKENS",tokens);
-
-  }
-
-  private void fillInMetadataTab(Map<String,Object> velocityContext, IHTTPOutput out, Specification ds)
-  {
-
-    Set<String> excludedHeaders = new HashSet<>();
-
-    // Now, loop through description
-    int i = 0;
-    while (i < ds.getChildCount())
-    {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDEHEADER))
-      {
-        String value = sn.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-        excludedHeaders.add(value);
-      }
-    }
-
-    velocityContext.put("POTENTIALLYEXCLUDEDHEADERS",potentiallyExcludedHeaders);
-    velocityContext.put("EXCLUDEDHEADERS",excludedHeaders);
-
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-
-    final Map<String,Object> velocityContext = new HashMap<>();
-    velocityContext.put("TABNAME",tabName);
-    velocityContext.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-    velocityContext.put("SELECTEDNUM", Integer.toString(actualSequenceNumber));
-
-    fillInSeedsTab(velocityContext,out,ds);
-    fillInCanonicalizationTab(velocityContext,out,locale,ds);
-    fillInMappingsTab(velocityContext,out,ds);
-    fillInInclusionsTab(velocityContext,out,ds);
-    fillInExclusionsTab(velocityContext,out,ds);
-    fillInSecurityTab(velocityContext,out,ds);
-    fillInMetadataTab(velocityContext,out,ds);
-
-    // Seeds tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Seeds.html.vm",velocityContext);
-    // Canonicalization tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Canonicalization.html.vm",velocityContext);
-    // Mappings tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Mappings.html.vm",velocityContext);
-    // Inclusions tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Inclusions.html.vm",velocityContext);
-    // Exclusions tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Exclusions.html.vm",velocityContext);
-    // Security tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Security.html.vm",velocityContext);
-    // "Metadata" tab
-    Messages.outputResourceWithVelocity(out,locale,"editSpecification_Metadata.html.vm",velocityContext);
-
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    // Get the map
-    String value = variableContext.getParameter(seqPrefix+"rssmapcount");
-    if (value != null)
-    {
-      int mapsize = Integer.parseInt(value);
-
-      // Clear it first
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_MAP))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-
-      // Grab the map values
-      j = 0;
-      while (j < mapsize)
-      {
-        String prefix = seqPrefix+"rssregexp_"+Integer.toString(j)+"_";
-        String match = variableContext.getParameter(prefix+"match");
-        String map = variableContext.getParameter(prefix+"map");
-        if (map == null)
-          map = "";
-        // Add to the specification
-        SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_MAP);
-        node.setAttribute(WebcrawlerConfig.ATTR_MATCH,match);
-        node.setAttribute(WebcrawlerConfig.ATTR_MAP,map);
-        ds.addChild(ds.getChildCount(),node);
-
-        j++;
-      }
-    }
-    // Now, do whatever action we were told to do.
-    String rssop = variableContext.getParameter(seqPrefix+"rssop");
-    if (rssop != null && rssop.equals("Add"))
-    {
-      // Add a match to the end
-      String match = variableContext.getParameter(seqPrefix+"rssmatch");
-      String map = variableContext.getParameter(seqPrefix+"rssmap");
-      SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_MAP);
-      node.setAttribute(WebcrawlerConfig.ATTR_MATCH,match);
-      node.setAttribute(WebcrawlerConfig.ATTR_MAP,map);
-      ds.addChild(ds.getChildCount(),node);
-    }
-    else if (rssop != null && rssop.equals("Delete"))
-    {
-      int index = Integer.parseInt(variableContext.getParameter(seqPrefix+"rssindex"));
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_MAP))
-        {
-          if (index == 0)
-          {
-            ds.removeChild(j);
-            break;
-          }
-          index--;
-        }
-        j++;
-      }
-    }
-
-    // Get excluded headers
-    String excludedHeadersPresent = variableContext.getParameter(seqPrefix+"excludedheaders_present");
-    if (excludedHeadersPresent != null)
-    {
-      // Delete existing excludedheader record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDEHEADER))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      String[] excludedHeaders = variableContext.getParameterValues(seqPrefix+"excludedheaders");
-      if (excludedHeaders != null)
-      {
-        for (String excludedHeader : excludedHeaders)
-        {
-          SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_EXCLUDEHEADER);
-          cn.setAttribute(WebcrawlerConfig.ATTR_VALUE, excludedHeader);
-          ds.addChild(ds.getChildCount(),cn);
-        }
-      }
-    }
-    
-    // Get the seeds
-    String seeds = variableContext.getParameter(seqPrefix+"seeds");
-    if (seeds != null)
-    {
-      // Delete existing seeds record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_SEEDS))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_SEEDS);
-      cn.setValue(seeds);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Get the inclusions
-    String inclusions = variableContext.getParameter(seqPrefix+"inclusions");
-    if (inclusions != null)
-    {
-      // Delete existing inclusions record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_INCLUDES))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDES);
-      cn.setValue(inclusions);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Get the index inclusions
-    String inclusionsIndex = variableContext.getParameter(seqPrefix+"inclusionsindex");
-    if (inclusionsIndex != null)
-    {
-      // Delete existing index inclusions record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_INCLUDESINDEX))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDESINDEX);
-      cn.setValue(inclusionsIndex);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Handle the seeds-only switch
-    String matchingHostsPresent = variableContext.getParameter(seqPrefix+"matchinghosts_present");
-    if (matchingHostsPresent != null)
-    {
-      // Delete existing switch record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_LIMITTOSEEDS))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      String matchingHosts = variableContext.getParameter(seqPrefix+"matchinghosts");
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_LIMITTOSEEDS);
-      cn.setAttribute(WebcrawlerConfig.ATTR_VALUE,(matchingHosts==null||matchingHosts.equals("false"))?"false":"true");
-      ds.addChild(ds.getChildCount(),cn);
-    }
-    
-    // Get the exclusions
-    String exclusions = variableContext.getParameter(seqPrefix+"exclusions");
-    if (exclusions != null)
-    {
-      // Delete existing exclusions record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDES))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_EXCLUDES);
-      cn.setValue(exclusions);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Get the index exclusions
-    String exclusionsIndex = variableContext.getParameter(seqPrefix+"exclusionsindex");
-    if (exclusionsIndex != null)
-    {
-      // Delete existing exclusions record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDESINDEX))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_EXCLUDESINDEX);
-      cn.setValue(exclusionsIndex);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Get the content index exclusions
-    String exclusionsContentIndex = variableContext.getParameter(seqPrefix+"exclusionscontentindex");
-    if (exclusionsContentIndex != null)
-    {
-      // Delete existing content exclusions record first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDESCONTENTINDEX))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_EXCLUDESCONTENTINDEX);
-      cn.setValue(exclusionsContentIndex);
-      ds.addChild(ds.getChildCount(),cn);
-    }
-
-    // Read the url specs
-    String urlRegexpCount = variableContext.getParameter(seqPrefix+"urlregexpcount");
-    if (urlRegexpCount != null && urlRegexpCount.length() > 0)
-    {
-      int regexpCount = Integer.parseInt(urlRegexpCount);
-      int j = 0;
-      while (j < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(j);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_URLSPEC))
-          ds.removeChild(j);
-        else
-          j++;
-      }
-      
-      // Grab the operation and the index (if any)
-      String operation = variableContext.getParameter(seqPrefix+"urlregexpop");
-      if (operation == null)
-        operation = "Continue";
-      int opIndex = -1;
-      if (operation.equals("Delete"))
-        opIndex = Integer.parseInt(variableContext.getParameter(seqPrefix+"urlregexpnumber"));
-      
-      // Reconstruct urlspec nodes
-      j = 0;
-      while (j < regexpCount)
-      {
-        // For each index, first look for a delete operation
-        if (!operation.equals("Delete") || j != opIndex)
-        {
-          // Add the jth node
-          String regexp = variableContext.getParameter(seqPrefix+"urlregexp_"+Integer.toString(j));
-          String regexpDescription = variableContext.getParameter(seqPrefix+"urlregexpdesc_"+Integer.toString(j));
-          String reorder = variableContext.getParameter(seqPrefix+"urlregexpreorder_"+Integer.toString(j));
-          String javaSession = variableContext.getParameter(seqPrefix+"urlregexpjava_"+Integer.toString(j));
-          String aspSession = variableContext.getParameter(seqPrefix+"urlregexpasp_"+Integer.toString(j));
-          String phpSession = variableContext.getParameter(seqPrefix+"urlregexpphp_"+Integer.toString(j));
-          String bvSession = variableContext.getParameter(seqPrefix+"urlregexpbv_"+Integer.toString(j));
-          SpecificationNode newSn = new SpecificationNode(WebcrawlerConfig.NODE_URLSPEC);
-          newSn.setAttribute(WebcrawlerConfig.ATTR_REGEXP,regexp);
-          if (regexpDescription != null && regexpDescription.length() > 0)
-            newSn.setAttribute(WebcrawlerConfig.ATTR_DESCRIPTION,regexpDescription);
-          if (reorder != null && reorder.length() > 0)
-            newSn.setAttribute(WebcrawlerConfig.ATTR_REORDER,reorder);
-          if (javaSession != null && javaSession.length() > 0)
-            newSn.setAttribute(WebcrawlerConfig.ATTR_JAVASESSIONREMOVAL,javaSession);
-          if (aspSession != null && aspSession.length() > 0)
-            newSn.setAttribute(WebcrawlerConfig.ATTR_ASPSESSIONREMOVAL,aspSession);
-          if (phpSession != null && phpSession.length() > 0)
-            newSn.setAttribute(WebcrawlerConfig.ATTR_PHPSESSIONREMOVAL,phpSession);
-          if (bvSession != null && bvSession.length() > 0)
-            newSn.setAttribute(WebcrawlerConfig.ATTR_BVSESSIONREMOVAL,bvSession);
-          ds.addChild(ds.getChildCount(),newSn);
-        }
-        j++;
-      }
-      if (operation.equals("Add"))
-      {
-        String regexp = variableContext.getParameter(seqPrefix+"urlregexp");
-        String regexpDescription = variableContext.getParameter(seqPrefix+"urlregexpdesc");
-        String reorder = variableContext.getParameter(seqPrefix+"urlregexpreorder");
-        String javaSession = variableContext.getParameter(seqPrefix+"urlregexpjava");
-        String aspSession = variableContext.getParameter(seqPrefix+"urlregexpasp");
-        String phpSession = variableContext.getParameter(seqPrefix+"urlregexpphp");
-        String bvSession = variableContext.getParameter(seqPrefix+"urlregexpbv");
-
-        // Add a new node at the end
-        SpecificationNode newSn = new SpecificationNode(WebcrawlerConfig.NODE_URLSPEC);
-        newSn.setAttribute(WebcrawlerConfig.ATTR_REGEXP,regexp);
-        if (regexpDescription != null && regexpDescription.length() > 0)
-          newSn.setAttribute(WebcrawlerConfig.ATTR_DESCRIPTION,regexpDescription);
-        if (reorder != null && reorder.length() > 0)
-          newSn.setAttribute(WebcrawlerConfig.ATTR_REORDER,reorder);
-        if (javaSession != null && javaSession.length() > 0)
-          newSn.setAttribute(WebcrawlerConfig.ATTR_JAVASESSIONREMOVAL,javaSession);
-        if (aspSession != null && aspSession.length() > 0)
-          newSn.setAttribute(WebcrawlerConfig.ATTR_ASPSESSIONREMOVAL,aspSession);
-        if (phpSession != null && phpSession.length() > 0)
-          newSn.setAttribute(WebcrawlerConfig.ATTR_PHPSESSIONREMOVAL,phpSession);
-        if (bvSession != null && bvSession.length() > 0)
-          newSn.setAttribute(WebcrawlerConfig.ATTR_BVSESSIONREMOVAL,bvSession);
-        ds.addChild(ds.getChildCount(),newSn);
-      }
-    }
-
-    String xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null)
-    {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount())
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_ACCESS))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount)
-      {
-        String accessDescription = "_"+Integer.toString(i);
-        String accessOpName = seqPrefix+"accessop"+accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete"))
-        {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription);
-        SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_ACCESS);
-        node.setAttribute(WebcrawlerConfig.ATTR_TOKEN,accessSpec);
-        ds.addChild(ds.getChildCount(),node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add"))
-      {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_ACCESS);
-        node.setAttribute(WebcrawlerConfig.ATTR_TOKEN,accessspec);
-        ds.addChild(ds.getChildCount(),node);
-      }
-    }
-
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-
-    final Map<String,Object> velocityContext = new HashMap<>();
-    velocityContext.put("SEQNUM", Integer.toString(connectionSequenceNumber));
-
-    fillInSeedsTab(velocityContext,out,ds);
-    fillInCanonicalizationTab(velocityContext,out,locale,ds);
-    fillInMappingsTab(velocityContext,out,ds);
-    fillInInclusionsTab(velocityContext,out,ds);
-    fillInExclusionsTab(velocityContext,out,ds);
-    fillInSecurityTab(velocityContext,out,ds);
-    fillInMetadataTab(velocityContext,out,ds);
-
-    Messages.outputResourceWithVelocity(out,locale,"viewSpecification.html.vm",velocityContext);
-
-  }
-
-  // Protected methods and classes
-
-  /** Calculate the event name for session login.
-  */
-  protected String makeSessionLoginEventName(INamingActivity activities, String sequenceKey)
-  {
-    return activities.createGlobalString("webcrawler:session:"+sequenceKey);
-  }
-
-  /** Calculate the event name for DNS access.
-  */
-  protected String makeDNSEventName(INamingActivity activities, String hostNameKey)
-  {
-    // Use the connector unique id, and use a convention that guarantees uniqueness.
-    return activities.createGlobalString("webcrawler:dns:"+hostNameKey);
-  }
-
-  /** Look up an ipaddress given a non-canonical host name.
-  *@return appropriate status.
-  */
-  protected int lookupIPAddress(String documentIdentifier, IProcessActivity activities, String hostName, long currentTime, StringBuilder ipAddressBuffer)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String eventName = makeDNSEventName(activities,hostName);
-    DNSManager.DNSInfo info = dnsManager.lookup(hostName,currentTime);
-    if (info != null)
-    {
-      String ipAddress = info.getIPAddress();
-      if (ipAddress == null)
-        return RESULTSTATUS_FALSE;
-      ipAddressBuffer.append(ipAddress);
-      return RESULTSTATUS_TRUE;
-    }
-    if (activities.beginEventSequence(eventName))
-    {
-      //  We uniquely can do the lookup.
-      try
-      {
-        // Fetch it using InetAddress
-        InetAddress ip = null;
-        try
-        {
-          ip = InetAddress.getByName(hostName);
-        }
-        catch (UnknownHostException e)
-        {
-          // Host is unknown, so leave ipAddress as null.
-        }
-        String fqdn = null;
-        String ipAddress = null;
-        if (ip != null)
-        {
-          fqdn = ip.getCanonicalHostName();
-          ipAddress = ip.getHostAddress();
-        }
-        // Write this to the cache - expiration time 6 hours
-        dnsManager.writeDNSData(hostName,fqdn,ipAddress,currentTime + 1000*60*60*6);
-        if (ipAddress == null)
-          return RESULTSTATUS_FALSE;
-        ipAddressBuffer.append(ipAddress);
-        return RESULTSTATUS_TRUE;
-      }
-      finally
-      {
-        activities.completeEventSequence(eventName);
-      }
-    }
-    else
-    {
-      // Abort this fetch, since it's blocked.
-      return RESULTSTATUS_NOTYETDETERMINED;
-    }
-  }
-
-  /** Construct the robots key for a host.
-  * This is used to look up robots info in the database, and to form the corresponding event name.
-  */
-  protected static String makeRobotsKey(String protocol, String hostName, int port)
-  {
-    String rval = hostName + ":" + port;
-    // For backwards compatibility, only tack on the protocol if the protocol is not http
-    if (!protocol.equalsIgnoreCase("http"))
-      rval = protocol.toLowerCase(Locale.ROOT)+":"+rval;
-    return rval;
-  }
-
-  /** Construct a name for the global web-connector robots event.
-  */
-  protected String makeRobotsEventName(INamingActivity versionActivities, String robotsKey)
-  {
-    // Use the connector unique id, and use a convention that guarantees uniqueness.
-    return versionActivities.createGlobalString("webcrawler:robots:"+robotsKey);
-  }
-
-  /** Check robots to see if fetch is allowed.
-  *@return appropriate resultstatus code.
-  */
-  protected int checkFetchAllowed(String documentIdentifier, String protocol, String hostIPAddress, int port, PageCredentials credential,
-    IKeystoreManager trustStore, String hostName, String[] binNames, long currentTime, String pathString, IProcessActivity versionActivities, int connectionLimit,
-    String proxyHost, int proxyPort, String proxyAuthDomain, String proxyAuthUsername, String proxyAuthPassword)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // hostNameAndPort is the key for looking up the robots file in the database
-    String hostNameAndPort = makeRobotsKey(protocol,hostName,port);
-    String hostIPAddressAndPort = hostIPAddress + ":" + port;
-
-    Boolean info = robotsManager.checkFetchAllowed(userAgent,hostNameAndPort,currentTime,pathString,versionActivities);
-    if (info != null)
-    {
-      if (info.booleanValue())
-        return RESULTSTATUS_TRUE;
-      else
-        return RESULTSTATUS_FALSE;
-    }
-
-    // We need to fetch robots.txt.
-    // Since this is a prerequisite for many documents, prevent queuing and processing of those documents until the robots document is fetched.
-
-    // Assemble the name of the global web connector robots event.
-    String robotsEventName = makeRobotsEventName(versionActivities,hostNameAndPort);
-    // Begin the event processing
-    if (versionActivities.beginEventSequence(robotsEventName))
-    {
-      // We've successfully obtained a lock on reading robots for this server!  Now, guarantee that we'll free it, by instantiating a try/finally
-      try
-      {
-        IThrottledConnection connection = ThrottledFetcher.getConnection(currentContext,throttleGroupName,
-          protocol,hostIPAddress,port,credential,
-          trustStore,throttleDescription,binNames,connectionLimit,
-          proxyHost,proxyPort,proxyAuthDomain,proxyAuthUsername,proxyAuthPassword,
-          socketTimeoutMilliseconds,connectionTimeoutMilliseconds,
-          versionActivities);
-        try
-        {
-          connection.beginFetch(FETCH_ROBOTS);
-          try
-          {
-            connection.executeFetch("/robots.txt",userAgent,from,true,hostName,null,null);
-            long expirationTime = currentTime+1000*60*60*24;
-            int code = connection.getResponseCode();
-            if (code == 200)
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Web: Fetch of robots.txt from "+protocol+"://"+hostIPAddressAndPort+"(host='"+hostName+"') succeeded!");
-
-              InputStream is = connection.getResponseBodyStream();
-              try
-              {
-                // Write this to the cache - expiration time 24 hours
-                robotsManager.writeRobotsData(hostNameAndPort,expirationTime,is);
-              }
-              finally
-              {
-                is.close();
-              }
-            }
-            else
-            {
-              if (Logging.connectors.isDebugEnabled())
-                Logging.connectors.debug("Web: Fetch of robots.txt from "+protocol+"://"+hostIPAddressAndPort+"(host='"+hostName+"') failed with error "+Integer.toString(code));
-              // Write this to the cache - expiration time 24 hours
-              robotsManager.writeRobotsData(hostNameAndPort,expirationTime,null);
-            }
-          }
-          catch (ServiceInterruption e)
-          {
-            // A service interruption on a robots fetch should save the fact that no robots.txt is available, and leave it be for 6 hours that way.
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Web: Timeout fetching robots.txt from "+protocol+"://"+hostIPAddressAndPort+"(host='"+hostName+"'); assuming robots missing for now: "+e.getMessage(),e);
-            long expirationTime = currentTime + 1000*60*60*6;
-            try
-            {
-              robotsManager.writeRobotsData(hostNameAndPort,expirationTime,null);
-            }
-            catch (IOException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache");
-            }
-          }
-          catch (java.net.SocketTimeoutException e)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Web: Fetch of robots.txt from "+protocol+"://"+hostIPAddressAndPort+"(host='"+hostName+"') generated Socket Timeout Exception: "+e.getMessage(),e);
-            // This COULD be a transient error, so we are more aggressive about retrying a fetch of robots.txt in that case
-            long expirationTime = currentTime + 1000*60*60*6;
-            try
-            {
-              robotsManager.writeRobotsData(hostNameAndPort,expirationTime,null);
-            }
-            catch (java.net.SocketTimeoutException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-            catch (ConnectTimeoutException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-            catch (InterruptedIOException e2)
-            {
-              //Logging.connectors.warn("IO interruption seen",e2);
-              throw new ManifoldCFException("Interrupted: "+e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-          }
-          catch (ConnectTimeoutException e)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Web: Fetch of robots.txt from "+protocol+"://"+hostIPAddressAndPort+"(host='"+hostName+"') generated Socket Connect Timeout Exception: "+e.getMessage(),e);
-            // This COULD be a transient error, so we are more aggressive about retrying a fetch of robots.txt in that case
-            long expirationTime = currentTime + 1000*60*60*6;
-            try
-            {
-              robotsManager.writeRobotsData(hostNameAndPort,expirationTime,null);
-            }
-            catch (java.net.SocketTimeoutException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-            catch (ConnectTimeoutException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-            catch (InterruptedIOException e2)
-            {
-              //Logging.connectors.warn("IO interruption seen",e2);
-              throw new ManifoldCFException("Interrupted: "+e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-          }
-          catch (InterruptedIOException e)
-          {
-            //Logging.connectors.warn("IO interruption seen",e);
-            throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (IOException e)
-          {
-            if (Logging.connectors.isDebugEnabled())
-              Logging.connectors.debug("Web: Fetch of robots.txt from "+protocol+"://"+hostIPAddressAndPort+"(host='"+hostName+"') generated IO Exception: "+e.getMessage(),e);
-            // This COULD be a transient error, so we are more aggressive about retrying a fetch of robots.txt in that case
-            long expirationTime = currentTime + 1000*60*60*6;
-            try
-            {
-              robotsManager.writeRobotsData(hostNameAndPort,expirationTime,null);
-            }
-            catch (java.net.SocketTimeoutException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-            catch (ConnectTimeoutException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-            catch (InterruptedIOException e2)
-            {
-              //Logging.connectors.warn("IO interruption seen",e2);
-              throw new ManifoldCFException("Interrupted: "+e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
-            }
-            catch (IOException e2)
-            {
-              Logging.connectors.warn("Web: Couldn't clear robots cache: "+e2.getMessage(),e2);
-            }
-          }
-          finally
-          {
-            connection.doneFetch(versionActivities);
-          }
-        }
-        finally
-        {
-          connection.close();
-        }
-
-        // Right now we have no choice but to read it again.
-        info = robotsManager.checkFetchAllowed(userAgent,hostNameAndPort,currentTime,pathString,versionActivities);
-        if (info.booleanValue())
-          return RESULTSTATUS_TRUE;
-        else
-          return RESULTSTATUS_FALSE;
-      }
-      finally
-      {
-        versionActivities.completeEventSequence(robotsEventName);
-      }
-    }
-    else
-    {
-      // Some other thread is reading robots.txt right now, so abort processing of the current document.
-      return RESULTSTATUS_NOTYETDETERMINED;
-    }
-  }
-
-  /** Convert an absolute or relative URL to a document identifier.  This may involve several steps at some point,
-  * but right now it does NOT involve converting the host name to a canonical host name.
-  * (Doing so would destroy the ability of virtually hosted sites to do the right thing,
-  * since the original host name would be lost.)  Thus, we do the conversion to IP address
-  * right before we actually fetch the document.
-  *@param parentIdentifier the identifier of the document in which the raw url was found, or null if none.
-  *@param rawURL the starting, un-normalized, un-canonicalized URL.
-  *@param filter the filter object, used to remove unmatching URLs.
-  *@return the canonical URL (the document identifier), or null if the url was illegal.
-  */
-  protected String makeDocumentIdentifier(String parentIdentifier, String rawURL, DocumentURLFilter filter)
-    throws ManifoldCFException
-  {
-    try
-    {
-      WebURL url;
-      if (parentIdentifier != null)
-      {
-        WebURL parentURL = new WebURL(parentIdentifier);
-        url = parentURL.resolve(rawURL);
-      }
-      else
-        url = new WebURL(rawURL);
-
-      String protocol = url.getScheme();
-      String host = url.getHost();
-
-      // The new URL better darn well have a host and a protocol, and we only know how to deal with
-      // http and https.
-      if (protocol == null || host == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Can't use url '"+rawURL+"' because it has no protocol or host");
-        return null;
-      }
-      if (!understoodProtocols.contains(protocol))
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Can't use url '"+rawURL+"' because it has an unsupported protocol '"+protocol+"'");
-        return null;
-      }
-      if (!filter.isHostLegal(host))
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Can't use url '"+rawURL+"' because its host is not found in the seeds ('"+host+"')");
-        return null;
-      }
-      
-      // Canonicalization procedure.
-      // The query part of the URL may contain bad parameters (session id's, for instance), or may be ordered in such a
-      // way as to prevent an effectively identical URL from being matched.  The anchor part of the URL should also be stripped.
-      // This code performs both of these activities in a simple way; rewrites of various pieces may get more involved if we add
-      // the ability to perform mappings using criteria specified in the UI.  Right now we don't.
-      String id = doCanonicalization(filter,url);
-      if (id == null)
-        return null;
-
-      // As a last basic legality check, go through looking for illegal characters.
-      int i = 0;
-      while (i < id.length())
-      {
-        char x = id.charAt(i++);
-        // Only 7-bit ascii is allowed in URLs - and that has limits too (no control characters)
-        if (x < ' ' || x > 127)
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB: Can't use url '"+rawURL+"' because it has illegal characters in it");
-          return null;
-        }
-      }
-
-      // Check to be sure the canonicalized URL is in fact one of the ones we want to include
-      if (!filter.isDocumentLegal(id))
-        return null;
-
-      return id;
-    }
-    catch (java.net.URISyntaxException e)
-    {
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("WEB: Can't use url '"+rawURL+"' because it is badly formed: "+e.getMessage());
-      return null;
-    }
-    catch (java.lang.IllegalArgumentException e)
-    {
-      return null;
-    }
-    catch (java.lang.NullPointerException e)
-    {
-      // This gets tossed by url.toAsciiString() for reasons I don't understand, but which have to do with a malformed URL.
-      return null;
-    }
-  }
-
-  /** Code to canonicalize a URL.  If URL cannot be canonicalized (and is illegal) return null.
-  */
-  protected String doCanonicalization(DocumentURLFilter filter, WebURL url)
-    throws ManifoldCFException, java.net.URISyntaxException
-  {
-    // First, we have to figure out what the canonicalization policy is.
-    // To do that, we need to do a regexp match against the COMPLETE raw url.
-    // Put it back into the URL without the ref, and with the modified query and path parts.
-    String pathString = url.getPath();
-    String queryString = url.getRawQuery();
-
-    WebURL rawURI = new WebURL(url.getScheme(),url.getHost(),url.getPort(),pathString,queryString);
-    String completeRawURL = rawURI.toASCIIString();
-
-    CanonicalizationPolicy p;
-    if (completeRawURL != null)
-      p = filter.getCanonicalizationPolicies().findMatch(completeRawURL);
-    else
-      p = null;
-
-    // Note well: The java.net.URI class mistreats the query part of the URI, near as I can tell, in the following ways:
-    // (1) It decodes the whole thing without regards to the argument interpretation, so the escaped ampersands etc in the arguments are converted
-    //     to non-escaped ones (ugh).  This is why I changed the code below to parse the RAW query string and decode it myself.
-    // (2) On reassembly of the query string, the class does not properly escape ":", "/", or a bunch of other characters the class description *says*
-    //     it will escape.  This means it creates URI's that are illegal according to RFC 2396 - although it is true that RFC 2396 also contains
-    //     apparent errors.
-    //
-    // I've therefore opted to deal with this problem by doing much of the query string processing myself - including its final reassembly into the
-    // URI at the end of the processing.
-    //
-
-    // To make the url be canonical, we need to strip off everything after the #.  We also need to order the arguments in a canonical
-    // way, and remove session identifiers of the types we know about.
-    if (queryString != null)
-    {
-      // Rewrite the query string.  To do this, we first parse it (by looking for ampersands and equal signs), and then
-      // we ditch any keys that we really don't want (session identifiers particularly).  Finally, we go through the
-      // keys in sorted order and reassemble the query, making sure that any arguments that have the same name
-      // appear in the same order.
-
-      // I don't use the 'split' operation because I think it's a lot more oomph (and performance loss) than is needed
-      // for this simple parsing task.
-
-      // When reordering a url, the following is done:
-      // (1) The individual order of all arguments with the same name is preserved
-      // (2) The arguments themselves appear in sorted order, minus any arguments that should be removed because they
-      //      are interpreted to be session arguments.
-      //
-      // When a url is NOT reordered, the following is done:
-      // (1) Each argument is examined IN TURN.
-      // (2) If the argument is a session argument and should be excluded, it is simply skipped.
-
-      // Canonicalization note: Broadvision
-      //
-      // The format of Broadvision's urls is as follows:
-      // http://blah/path/path?arg|arg|arg|BVSession@@@@=xxxx&more stuff
-      // The session identifier is the BVSession@@@@.  In theory I could strip this away, but I've found that
-      // most Broadvision sites require session even for basic navigation!  So the lesser of two evils is to leave it
-      // in there and suffer the eventual url duplication.
-
-      if (p == null || p.canReorder())
-      {
-        // Reorder arguments
-        HashMap argumentMap = new HashMap();
-        int index = 0;
-        while (index < queryString.length())
-        {
-          int newIndex = queryString.indexOf("&",index);
-          if (newIndex == -1)
-            newIndex = queryString.length();
-          String argument = queryString.substring(index,newIndex);
-          int valueIndex = argument.indexOf("=");
-          String key;
-          if (valueIndex == -1)
-            key = argument;
-          else
-            key = argument.substring(0,valueIndex);
-
-          // If this is a disallowed argument, simply don't include it in the final map.
-          boolean includeArgument = true;
-          if ((p == null || p.canRemovePhpSession()) && key.equals("PHPSESSID"))
-            includeArgument = false;
-          // For web connector only, null policy means NO broadvision cookie removal!!
-          if (p != null && p.canRemoveBvSession() && key.indexOf("BVSession@@@@") != -1)
-            includeArgument = false;
-
-          if (includeArgument)
-          {
-            ArrayList list = (ArrayList)argumentMap.get(key);
-            if (list == null)
-            {
-              list = new ArrayList();
-              argumentMap.put(key,list);
-            }
-            list.add(argument);
-          }
-
-          if (newIndex < queryString.length())
-            index = newIndex + 1;
-          else
-            index = newIndex;
-        }
-
-        // Reassemble query string in sorted order
-        String[] sortArray = new String[argumentMap.size()];
-        int i = 0;
-        Iterator iter = argumentMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          sortArray[i++] = (String)iter.next();
-        }
-        java.util.Arrays.sort(sortArray);
-
-        StringBuilder newString = new StringBuilder();
-        boolean isFirst = true;
-        i = 0;
-        while (i < sortArray.length)
-        {
-          String key = sortArray[i++];
-          ArrayList list = (ArrayList)argumentMap.get(key);
-          int j = 0;
-          while (j < list.size())
-          {
-            if (isFirst == false)
-            {
-              newString.append("&");
-            }
-            else
-              isFirst = false;
-            newString.append((String)list.get(j++));
-          }
-        }
-        queryString = newString.toString();
-      }
-      else
-      {
-        // Do not reorder!
-        StringBuilder newString = new StringBuilder();
-        int index = 0;
-        boolean isFirst = true;
-        while (index < queryString.length())
-        {
-          int newIndex = queryString.indexOf("&",index);
-          if (newIndex == -1)
-            newIndex = queryString.length();
-          String argument = queryString.substring(index,newIndex);
-          int valueIndex = argument.indexOf("=");
-          String key;
-          if (valueIndex == -1)
-            key = argument;
-          else
-            key = argument.substring(0,valueIndex);
-
-          // If this is a disallowed argument, simply don't include it in the final query.
-          boolean includeArgument = true;
-          if ((p == null || p.canRemovePhpSession()) && key.equals("PHPSESSID"))
-            includeArgument = false;
-          // For web connector only, null policy means NO broadvision cookie removal!!
-          if (p != null && p.canRemoveBvSession() && key.indexOf("BVSession@@@@") != -1)
-            includeArgument = false;
-
-          if (includeArgument)
-          {
-            if (!isFirst)
-              newString.append("&");
-            else
-              isFirst = false;
-            newString.append(argument);
-          }
-
-          if (newIndex < queryString.length())
-            index = newIndex + 1;
-          else
-            index = newIndex;
-        }
-        queryString = newString.toString();
-      }
-    }
-
-    // Now, rewrite path to get rid of jsessionid etc.
-    if (pathString != null)
-    {
-      int index = pathString.indexOf(";jsessionid=");
-      if ((p == null || p.canRemoveJavaSession()) && index != -1)
-      {
-        // There's a ";jsessionid="
-        // Strip the java session id
-        pathString = pathString.substring(0,index);
-      }
-      if ((p == null || p.canRemoveAspSession()) && pathString.startsWith("/s("))
-      {
-        // It's asp.net
-        index = pathString.indexOf(")");
-        if (index != -1)
-          pathString = pathString.substring(index+1);
-      }
-
-    }
-
-    // Put it back into the URL without the ref, and with the modified query and path parts.
-    url = new WebURL(url.getScheme(),url.getHost(),url.getPort(),pathString,queryString);
-    String rval = url.toASCIIString();
-    return rval;
-  }
-
-  /** Code to check if data is interesting, based on response code and content type.
-  */
-  protected boolean isContentInteresting(IFingerprintActivity activities, String documentIdentifier, int response, String contentType)
-    throws ServiceInterruption, ManifoldCFException
-  {
-    // Additional filtering only done if it's a 200 response
-    if (response != 200)
-      return true;
-
-    // Look at the content type and decide if it's a kind we want.  This is defined
-    // as something we think we can either ingest, or extract links from.
-
-    // For now, we're only going to attempt to extract links from html.  This will change eventually.
-    // But the check here is just what the content type is.
-
-    if (contentType == null)
-      return false;
-
-    String strippedContentType = contentType;
-    int pos = strippedContentType.indexOf(";");
-    if (pos != -1)
-      strippedContentType = strippedContentType.substring(0,pos);
-    strippedContentType = strippedContentType.trim();
-
-    // There are presumably mime types we can extract links from that we can't index?
-    if (interestingMimeTypeMap.contains(strippedContentType))
-      return true;
-    
-    boolean rval = activities.checkMimeTypeIndexable(contentType);
-    if (rval == false && Logging.connectors.isDebugEnabled())
-      Logging.connectors.debug("Web: For document '"+documentIdentifier+"', not fetching because output connector does not want mimetype '"+contentType+"'");
-    return rval;
-  }
-  
-  /** Convert a document identifier to filename.
-   * @param documentIdentifier
-   * @return
-   * @throws URISyntaxException
-   */
-  protected String documentIdentifiertoFileName(String documentIdentifier) 
-    throws URISyntaxException
-  {
-    StringBuffer path = new StringBuffer();
-    URI uri = null;
-
-    uri = new URI(documentIdentifier);
-
-    if (uri.getRawPath() != null) {
-      if (uri.getRawPath().equals("")) {
-        path.append("");
-      } else if (uri.getRawPath().equals("/")) {
-        path.append("index.html");
-      } else if (uri.getRawPath().length() != 0) {
-        if (uri.getRawPath().endsWith("/")) {
-          path.append("index.html");
-        } else {
-          String[] names = uri.getRawPath().split("/"); 
-          path.append(names[names.length - 1]);
-        } 
-      }
-    }
-
-    if (path.length() > 0) {
-      if (uri.getRawQuery() != null) {
-        path.append("?");
-        path.append(uri.getRawQuery());
-      }
-    }
-
-    return path.toString();
-  }
-
-  /** Find a redirection URI, if it exists */
-  protected String findRedirectionURI(String currentURI)
-    throws ManifoldCFException
-  {
-    FindRedirectionHandler handler = new FindRedirectionHandler(currentURI);
-    handleRedirects(currentURI,handler);
-    return handler.getTargetURI();
-  }
-
-  /** Find matching HTML form data, if present.  Return null if not. */
-  protected FormData findHTMLForm(String currentURI, LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (lp == null || lp.getFormNamePattern() == null)
-      return null;
-
-    // Use the specified loginParameters to (a) find an appropriate form, if present, and (b) override what the form's default
-    // form parameters would be.  This means that the override parameters are associated with the page on which the *form*
-    // is found, not the page to which we are submitting the form.  This is unlike (say) Heritrix, which attaches the parameters
-    // to the page that's the target of the submission.
-    FindHTMLFormHandler handler = new FindHTMLFormHandler(currentURI,lp.getFormNamePattern());
-    handleHTML(currentURI,handler);
-    // Apply any overrides
-    handler.applyFormOverrides(lp);
-    return handler.getFormData();
-  }
-
-  /** Find a preferred redirection URI, if it exists */
-  protected String findPreferredRedirectionURI(String currentURI, LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (lp == null || lp.getPreferredRedirectionPattern() == null)
-      return null;
-
-    FindPreferredRedirectionHandler handler = new FindPreferredRedirectionHandler(currentURI,lp.getPreferredRedirectionPattern());
-    handleRedirects(currentURI,handler);
-    handler.applyOverrides(lp);
-    return handler.getTargetURI();
-  }
-
-  /** Find existence of specific content on the page (never finds a URL) */
-  protected String findSpecifiedContent(String currentURI, LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (lp == null || lp.getContentPattern() == null)
-      return null;
-    
-    FindContentHandler handler = new FindContentHandler(currentURI,lp.getContentPattern());
-    handleHTML(currentURI,handler);
-    handler.applyOverrides(lp);
-    return handler.getTargetURI();
-  }
-
-  /** Find HTML link URI, if present, making sure specified preference is matched. */
-  protected String findHTMLLinkURI(String currentURI, LoginParameters lp)
-    throws ManifoldCFException
-  {
-    if (lp == null || lp.getPreferredLinkPattern() == null)
-      return null;
-
-    FindHTMLHrefHandler handler = new FindHTMLHrefHandler(currentURI,lp.getPreferredLinkPattern());
-    handleHTML(currentURI,handler);
-    handler.applyOverrides(lp);
-    return handler.getTargetURI();
-  }
-
-  /** Code to extract links from an already-fetched document. */
-  protected boolean extractLinks(String documentIdentifier, IProcessActivity activities, DocumentURLFilter filter)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    ProcessActivityRedirectionHandler redirectHandler = new ProcessActivityRedirectionHandler(documentIdentifier,activities,filter);
-    handleRedirects(documentIdentifier,redirectHandler);
-    if (Logging.connectors.isDebugEnabled() && redirectHandler.shouldIndex() == false)
-      Logging.connectors.debug("Web: Not indexing document '"+documentIdentifier+"' because of redirection");
-    // For html, we don't want any actions, because we don't do form submission.
-    ProcessActivityHTMLHandler htmlHandler = new ProcessActivityHTMLHandler(documentIdentifier,activities,filter,metaRobotsTagsUsage);
-    handleHTML(documentIdentifier,htmlHandler);
-    if (Logging.connectors.isDebugEnabled() && htmlHandler.shouldIndex() == false)
-      Logging.connectors.debug("Web: Not indexing document '"+documentIdentifier+"' because of HTML robots or content tags prohibiting indexing");
-    ProcessActivityXMLHandler xmlHandler = new ProcessActivityXMLHandler(documentIdentifier,activities,filter);
-    handleXML(documentIdentifier,xmlHandler);
-    if (Logging.connectors.isDebugEnabled() && xmlHandler.shouldIndex() == false)
-      Logging.connectors.debug("Web: Not indexing document '"+documentIdentifier+"' because of XML robots or content tags prohibiting indexing");
-    // May add more later for other extraction tasks.
-    return htmlHandler.shouldIndex() && redirectHandler.shouldIndex() && xmlHandler.shouldIndex();
-  }
-
-  /** This class is the handler for links that get added into a IProcessActivity object.
-  */
-  protected class ProcessActivityLinkHandler implements IDiscoveredLinkHandler
-  {
-    protected String documentIdentifier;
-    protected IProcessActivity activities;
-    protected DocumentURLFilter filter;
-    protected String contextDescription;
-    protected String linkType;
-
-    /** Constructor. */
-    public ProcessActivityLinkHandler(String documentIdentifier, IProcessActivity activities, DocumentURLFilter filter, String contextDescription, String linkType)
-    {
-      this.documentIdentifier = documentIdentifier;
-      this.activities = activities;
-      this.filter = filter;
-      this.contextDescription = contextDescription;
-      this.linkType = linkType;
-    }
-
-    /** Inform the world of a discovered link.
-    *@param rawURL is the raw discovered url.  This may be relative, malformed, or otherwise unsuitable for use until final form is acheived.
-    */
-    @Override
-    public void noteDiscoveredLink(String rawURL)
-      throws ManifoldCFException
-    {
-      String newIdentifier = makeDocumentIdentifier(documentIdentifier,rawURL,filter);
-      if (newIdentifier != null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: In "+contextDescription+" document '"+documentIdentifier+"', found link to '"+newIdentifier+"'");
-        activities.addDocumentReference(newIdentifier,documentIdentifier,linkType,null,null,null,calculateDocumentEvents(activities,newIdentifier));
-      }
-      else
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: In "+contextDescription+" document '"+documentIdentifier+"', found an unincluded URL '"+rawURL+"'");
-      }
-    }
-
-  }
-
-  /** Class that describes redirection handling */
-  protected class ProcessActivityRedirectionHandler extends ProcessActivityLinkHandler implements IRedirectionHandler
-  {
-    /** Constructor. */
-    public ProcessActivityRedirectionHandler(String documentIdentifier, IProcessActivity activities, DocumentURLFilter filter)
-    {
-      super(documentIdentifier,activities,filter,"redirection",REL_REDIRECT);
-    }
-    
-    public boolean shouldIndex()
-    {
-      return true;
-    }
-
-  }
-
-  /** Class that describes HTML handling */
-  protected class ProcessActivityHTMLHandler extends ProcessActivityLinkHandler implements IHTMLHandler
-  {
-    boolean allowIndex = true;
-    boolean allowFollow = true;
-    boolean obeyMetaRobotsTags = true;
-    
-    /** Constructor. */
-    public ProcessActivityHTMLHandler(String documentIdentifier, IProcessActivity activities, DocumentURLFilter filter, int metaRobotTagsUsage)
-    {
-      super(documentIdentifier,activities,filter,"html",REL_LINK);
-      this.obeyMetaRobotsTags = metaRobotTagsUsage == META_ROBOTS_ALL;
-    }
-
-    /** Decide whether we should index. */
-    public boolean shouldIndex()
-    {
-      return allowIndex;
-    }
-    
-    /** Note a character of text.
-    * Structured this way to keep overhead low for handlers that don't use text.
-    */
-    @Override
-    public void noteTextCharacter(char textCharacter)
-      throws ManifoldCFException
-    {
-    }
-
-    /** Note a meta tag */
-    @Override
-    public void noteMetaTag(Map metaAttributes)
-      throws ManifoldCFException
-    {
-      String name = (String)metaAttributes.get("name");
-      if (obeyMetaRobotsTags && name != null && name.toLowerCase(Locale.ROOT).equals("robots"))
-      {
-        String contentValue = (String)metaAttributes.get("content");
-        if (contentValue != null)
-        {
-          contentValue = contentValue.toLowerCase(Locale.ROOT);
-          // Parse content value
-          try
-          {
-            String[] contentValues = contentValue.split(",");
-            int i = 0;
-            while (i < contentValues.length)
-            {
-              String cv = contentValues[i++].trim();
-              if (cv.equals("index"))
-                allowIndex = true;
-              else if (cv.equals("noindex"))
-                allowIndex = false;
-              else if (cv.equals("none"))
-              {
-                allowFollow = false;
-                allowIndex = false;
-              }
-              else if (cv.equals("follow"))
-                allowFollow = true;
-              else if (cv.equals("nofollow"))
-                allowFollow = false;
-            }
-          }
-          catch (PatternSyntaxException e)
-          {
-            throw new ManifoldCFException(e.getMessage(),e);
-          }
-        }
-      }
-    }
-
-    /** Note the start of a form */
-    @Override
-    public void noteFormStart(Map formAttributes)
-      throws ManifoldCFException
-    {
-    }
-
-    /** Note an input tag */
-    @Override
-    public void noteFormInput(Map inputAttributes)
-      throws ManifoldCFException
-    {
-    }
-
-    /** Note the end of a form */
-    @Override
-    public void noteFormEnd()
-      throws ManifoldCFException
-    {
-    }
-
-    /** Note discovered href */
-    @Override
-    public void noteAHREF(String rawURL)
-      throws ManifoldCFException
-    {
-      if (allowFollow)
-        noteDiscoveredLink(rawURL);
-    }
-
-    /** Note discovered href */
-    @Override
-    public void noteLINKHREF(String rawURL)
-      throws ManifoldCFException
-    {
-      if (allowFollow)
-        noteDiscoveredLink(rawURL);
-    }
-
-    /** Note discovered IMG SRC */
-    @Override
-    public void noteIMGSRC(String rawURL)
-      throws ManifoldCFException
-    {
-      if (allowFollow)
-        noteDiscoveredLink(rawURL);
-    }
-
-    /** Note discovered FRAME SRC */
-    @Override
-    public void noteFRAMESRC(String rawURL)
-      throws ManifoldCFException
-    {
-      if (allowFollow)
-        noteDiscoveredLink(rawURL);
-    }
-
-    @Override
-    public void finishUp()
-      throws ManifoldCFException
-    {
-    }
-
-  }
-
-  /** Class that describes XML handling */
-  protected class ProcessActivityXMLHandler extends ProcessActivityLinkHandler implements IXMLHandler
-  {
-    /** Constructor. */
-    public ProcessActivityXMLHandler(String documentIdentifier, IProcessActivity activities, DocumentURLFilter filter)
-    {
-      super(documentIdentifier,activities,filter,"xml",REL_LINK);
-    }
-
-    public boolean shouldIndex()
-    {
-      return true;
-    }
-    
-    /** Inform the world of a discovered ttl value.
-    *@param rawTtlValue is the raw discovered ttl value.  Null indicates we should set the default.
-    */
-    public void noteDiscoveredTtlValue(String rawTtlValue)
-      throws ManifoldCFException
-    {
-      long currentTime = System.currentTimeMillis();
-      Long rescanTime = null;
-      if (rawTtlValue != null)
-      {
-        try
-        {
-          int minutes = Integer.parseInt(rawTtlValue);
-          long nextTime = currentTime + minutes * 60000L;
-          rescanTime = new Long(nextTime);
-          // Set the upper bound time; we want to scan the feeds aggressively.
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB: In "+contextDescription+" document '"+documentIdentifier+"', found a ttl value of "+rawTtlValue+"; setting refetch time accordingly");
-        }
-        catch (NumberFormatException e)
-        {
-          Logging.connectors.warn("WEB: In "+contextDescription+" document '"+documentIdentifier+"' found illegal ttl value '"+rawTtlValue+"': "+e.getMessage(),e);
-        }
-      }
-
-      if (Logging.connectors.isDebugEnabled())
-        Logging.connectors.debug("WEB: In "+contextDescription+" document '"+documentIdentifier+"' setting rescan time to "+((rescanTime==null)?"null":rescanTime.toString()));
-
-      activities.setDocumentScheduleBounds(documentIdentifier,rescanTime,rescanTime,null,null);
-    }
-
-  }
-
-  /** Handle extracting the redirect link from a redirect response. */
-  protected void handleRedirects(String documentURI, IRedirectionHandler handler)
-    throws ManifoldCFException
-  {
-    int responseCode = cache.getResponseCode(documentURI);
-    if (responseCode == 302 || responseCode == 301)
-    {
-      // Figure out the redirect
-      String referralURI = cache.getReferralURI(documentURI);
-      if (referralURI == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: The document '"+documentURI+"' is a redirection, but there was no URI header!");
-        return;
-      }
-      int index = referralURI.indexOf(" ");
-      if (index != -1)
-        referralURI = referralURI.substring(0,index);
-      handler.noteDiscoveredLink(referralURI);
-    }
-  }
-
-  /** Handle document references from XML.  Right now we only understand RSS. */
-  protected void handleXML(String documentURI, IXMLHandler handler)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    try
-    {
-      int responseCode = cache.getResponseCode(documentURI);
-      if (responseCode != 200)
-        return;
-
-      // We ONLY look for XML if the content type *says* it is XML.
-      String contentType = extractContentType(cache.getContentType(documentURI));
-      String mimeType = extractMimeType(contentType);
-      boolean isXML =
-        mimeType.equals("text/xml") ||
-        mimeType.equals("application/rss+xml") ||
-        mimeType.equals("application/xml") ||
-        mimeType.equals("application/atom+xml") ||
-        mimeType.equals("application/xhtml+xml") ||
-        mimeType.equals("text/XML") ||
-        mimeType.equals("application/rdf+xml") ||
-        mimeType.equals("text/application") ||
-        mimeType.equals("XML");
-
-      if (!isXML)
-        return;
-
-      // OK, it's XML.  Now what?  Well, we get the encoding, and we verify that it is text, then we try to get links
-      // from it presuming it is an RSS feed.
-
-      String encoding = extractEncoding(contentType);
-
-      InputStream is = cache.getData(documentURI);
-      if (is == null)
-      {
-        Logging.connectors.error("WEB: Document '"+documentURI+"' should be in cache but isn't");
-        return;
-      }
-      try
-      {
-        // Parse the document.  This will cause various things to occur, within the instantiated XMLParsingContext class.
-        Parser p = new Parser();
-        XMLFuzzyHierarchicalParseState x = new XMLFuzzyHierarchicalParseState();
-        OuterContextClass c = new OuterContextClass(x,documentURI,handler);
-        x.setContext(c);
-        try
-        {
-          p.parseWithCharsetDetection(encoding,is,x);
-          c.checkIfValidFeed();
-        }
-        finally
-        {
-          x.cleanup();
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket connect timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      //Logging.connectors.warn("IO interruption seen",e);
-
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error: "+e.getMessage(),e);
-    }
-  }
-
-  /** This class handles the outermost XML context for the feed document. */
-  protected class OuterContextClass extends XMLParsingContext
-  {
-    /** Keep track of the number of valid feed signals we saw */
-    protected int outerTagCount = 0;
-    /** The document uri */
-    protected String documentURI;
-    /** The link handler */
-    protected IXMLHandler handler;
-
-    public OuterContextClass(XMLFuzzyHierarchicalParseState theStream, String documentURI, IXMLHandler handler)
-    {
-      super(theStream);
-      this.documentURI = documentURI;
-      this.handler = handler;
-    }
-
-    /** Check if feed was valid */
-    public void checkIfValidFeed()
-    {
-      if (outerTagCount == 0)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: XML document '"+documentURI+"' does not have rss, feed, or rdf:RDF tag - not valid feed");
-      }
-    }
-
-    /** Handle the tag beginning to set the correct second-level parsing context */
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      if (localName.equals("rss"))
-      {
-        // RSS feed detected
-        outerTagCount++;
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Parsed bottom-level XML for RSS document '"+documentURI+"'");
-        return new RSSContextClass(theStream,namespace,localName,qName,atts,documentURI,handler);
-      }
-      else if (localName.toLowerCase(Locale.ROOT).equals("rdf"))
-      {
-        // RDF/Atom feed detected
-        outerTagCount++;
-        return new RDFContextClass(theStream,namespace,localName,qName,atts,documentURI,handler);
-      }
-      else if (localName.equals("feed"))
-      {
-        // Basic feed detected
-        outerTagCount++;
-        return new FeedContextClass(theStream,namespace,localName,qName,atts,documentURI,handler);
-      }
-      else if (localName.equals("urlset") || localName.equals("sitemapindex"))
-      {
-        // Sitemap detected
-        outerTagCount++;
-        return new UrlsetContextClass(theStream,namespace,localName,qName,atts,documentURI,handler);
-      }
-
-      // The default action is to establish a new default context.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    /** Handle the tag ending */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext context = theStream.getContext();
-      String tagName = context.getLocalname();
-      if (tagName.toLowerCase(Locale.ROOT).equals("rdf"))
-      {
-        ((RDFContextClass)context).process();
-      }
-      else if (tagName.equals("feed"))
-      {
-        ((FeedContextClass)context).process();
-      }
-      else if (tagName.equals("urlset") || tagName.equals("sitemapindex"))
-      {
-        ((UrlsetContextClass)context).process();
-      }
-      else
-        super.endTag();
-    }
-
-  }
-
-  protected class RSSContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentURI;
-    /** Link notification interface */
-    protected IXMLHandler handler;
-
-    public RSSContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentURI, IXMLHandler handler)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentURI = documentURI;
-      this.handler = handler;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // Handle each channel
-      if (localName.equals("channel"))
-      {
-        // Channel detected
-        return new RSSChannelContextClass(theStream,namespace,localName,qName,atts,documentURI,handler);
-      }
-
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      // If it's our channel tag, process global channel information
-      XMLParsingContext context = theStream.getContext();
-      String tagName = context.getLocalname();
-      if (tagName.equals("channel"))
-      {
-        ((RSSChannelContextClass)context).process();
-      }
-      else
-        super.endTag();
-    }
-  }
-
-  protected class RSSChannelContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentURI;
-    /** Link handler */
-    protected IXMLHandler handler;
-
-    /** TTL value is set on a per-channel basis */
-    protected String ttlValue = null;
-
-    public RSSChannelContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentURI, IXMLHandler handler)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentURI = documentURI;
-      this.handler = handler;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("ttl"))
-      {
-        // TTL value seen.  Prepare to record it, as a string.
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("item"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new RSSItemContextClass(theStream,namespace,localName,qName,atts);
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("ttl"))
-        // If the current context must be the TTL one, record its data value.
-        ttlValue = ((XMLStringParsingContext)theContext).getValue();
-      else if (theTag.equals("item"))
-      {
-        // It's an item.
-        RSSItemContextClass itemContext = (RSSItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) File name (if any), containing dechromed content
-        // (2) Link name(s)
-        // (3) Pubdate
-        // (4) Title
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(handler);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected void process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      handler.noteDiscoveredTtlValue(ttlValue);
-    }
-  }
-
-  protected class RSSItemContextClass extends XMLParsingContext
-  {
-    protected String guidField = null;
-    protected String linkField = null;
-
-    public RSSItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts)
-    {
-      super(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("link"))
-      {
-        // "link" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("guid"))
-      {
-        // "guid" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("link"))
-      {
-        linkField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else if (theTag.equals("guid"))
-      {
-        guidField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        super.endTag();
-      }
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(IXMLHandler handler)
-      throws ManifoldCFException
-    {
-      if (linkField == null || linkField.length() == 0)
-        linkField = guidField;
-
-      if (linkField != null && linkField.length() > 0)
-      {
-        String[] links = linkField.split(", ");
-        int l = 0;
-        while (l < links.length)
-        {
-          String rawURL = links[l++].trim();
-          // Process the link
-          handler.noteDiscoveredLink(rawURL);
-        }
-      }
-    }
-  }
-
-  protected class RDFContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentURI;
-    /** XML handler */
-    protected IXMLHandler handler;
-
-    /** ttl value */
-    protected String ttlValue = null;
-
-    public RDFContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentURI, IXMLHandler handler)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentURI = documentURI;
-      this.handler = handler;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("ttl"))
-      {
-        // TTL value seen.  Prepare to record it, as a string.
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("item"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new RDFItemContextClass(theStream,namespace,localName,qName,atts);
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("ttl"))
-        // If the current context must be the TTL one, record its data value.
-        ttlValue = ((XMLStringParsingContext)theContext).getValue();
-      else if (theTag.equals("item"))
-      {
-        // It's an item.
-        RDFItemContextClass itemContext = (RDFItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) Link name(s)
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(handler);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected void process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      handler.noteDiscoveredTtlValue(ttlValue);
-    }
-  }
-
-  protected class RDFItemContextClass extends XMLParsingContext
-  {
-    protected String linkField = null;
-
-    public RDFItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts)
-    {
-      super(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("link"))
-      {
-        // "link" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("link"))
-      {
-        linkField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        super.endTag();
-      }
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(IXMLHandler handler)
-      throws ManifoldCFException
-    {
-      if (linkField != null && linkField.length() > 0)
-      {
-        String[] links = linkField.split(", ");
-        int l = 0;
-        while (l < links.length)
-        {
-          String rawURL = links[l++].trim();
-          // Process the link
-          handler.noteDiscoveredLink(rawURL);
-        }
-      }
-    }
-  }
-
-  protected class FeedContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentURI;
-    /** XML handler */
-    protected IXMLHandler handler;
-
-    /** ttl value */
-    protected String ttlValue = null;
-
-    public FeedContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentURI, IXMLHandler handler)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentURI = documentURI;
-      this.handler = handler;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("ttl"))
-      {
-        // TTL value seen.  Prepare to record it, as a string.
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else if (localName.equals("entry"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new FeedItemContextClass(theStream,namespace,localName,qName,atts);
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("ttl"))
-        // If the current context must be the TTL one, record its data value.
-        ttlValue = ((XMLStringParsingContext)theContext).getValue();
-      else if (theTag.equals("entry"))
-      {
-        // It's an item.
-        FeedItemContextClass itemContext = (FeedItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) Link name(s)
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(handler);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected void process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      handler.noteDiscoveredTtlValue(ttlValue);
-    }
-  }
-
-  protected class FeedItemContextClass extends XMLParsingContext
-  {
-    protected List<String> linkField = new ArrayList<String>();
-
-    public FeedItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts)
-    {
-      super(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "ttl" and "item", nothing else.
-      if (localName.equals("link"))
-      {
-        // "link" tag
-        String ref = atts.get("href");
-        if (ref != null && ref.length() > 0)
-          linkField.add(ref);
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(IXMLHandler handler)
-      throws ManifoldCFException
-    {
-      if (linkField.size() > 0)
-      {
-        for (String linkValue : linkField)
-        {
-          String[] links = linkValue.split(", ");
-          int l = 0;
-          while (l < links.length)
-          {
-            String rawURL = links[l++].trim();
-            // Process the link
-            handler.noteDiscoveredLink(rawURL);
-          }
-        }
-      }
-    }
-  }
-
-  protected class UrlsetContextClass extends XMLParsingContext
-  {
-    /** The document identifier */
-    protected String documentURI;
-    /** XML handler */
-    protected IXMLHandler handler;
-
-    /** ttl value */
-    protected String ttlValue = null;
-
-    public UrlsetContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts, String documentURI, IXMLHandler handler)
-    {
-      super(theStream,namespace,localName,qName,atts);
-      this.documentURI = documentURI;
-      this.handler = handler;
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "url", nothing else.
-      if (localName.equals("url") || localName.equals("sitemap"))
-      {
-        // Item seen.  We don't need any of the attributes etc., but we need to start a new context.
-        return new UrlsetItemContextClass(theStream,namespace,localName,qName,atts);
-      }
-      // Skip everything else.
-      return super.beginTag(namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("url") || theTag.equals("sitemap"))
-      {
-        // It's an item.
-        UrlsetItemContextClass itemContext = (UrlsetItemContextClass)theContext;
-        // Presumably, since we are done parsing, we've recorded all the information we need in the context, object including:
-        // (1) File name (if any), containing dechromed content
-        // (2) Link name(s)
-        // (3) Pubdate
-        // (4) Title
-        // The job now is to pull this info out and call the activities interface appropriately.
-
-        // NOTE: After this endTag() method is called, tagCleanup() will be called for the item context.  This should clean up
-        // all dangling files etc. that need to be removed.
-        // If an exception or error is thrown during the parse, this endTag() method will NOT be called, but the tagCleanup()
-        // method will be called regardless.
-        itemContext.process(handler);
-      }
-      else
-        super.endTag();
-    }
-
-    /** Process this data */
-    protected void process()
-      throws ManifoldCFException
-    {
-      // Deal with the ttlvalue, if it was found
-      // Use the ttl value as a signal for when we ought to look at this feed again.  If not present, use the default.
-      handler.noteDiscoveredTtlValue(ttlValue);
-    }
-  }
-
-  protected class UrlsetItemContextClass extends XMLParsingContext
-  {
-    protected String linkField = null;
-
-    public UrlsetItemContextClass(XMLFuzzyHierarchicalParseState theStream, String namespace, String localName, String qName, Map<String,String> atts)
-    {
-      super(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      // The tags we care about are "loc", nothing else.
-      if (localName.equals("loc"))
-      {
-        // "loc" tag
-        return new XMLStringParsingContext(theStream,namespace,localName,qName,atts);
-      }
-      else
-      {
-        // Skip everything else.
-        return super.beginTag(namespace,localName,qName,atts);
-      }
-    }
-
-    /** Convert the individual sub-fields of the item context into their final forms */
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      XMLParsingContext theContext = theStream.getContext();
-      String theTag = theContext.getLocalname();
-      if (theTag.equals("loc"))
-      {
-        linkField = ((XMLStringParsingContext)theContext).getValue();
-      }
-      else
-      {
-        super.endTag();
-      }
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-    }
-
-    /** Process the data accumulated for this item */
-    public void process(IXMLHandler handler)
-      throws ManifoldCFException
-    {
-      if (linkField != null && linkField.length() > 0)
-      {
-        String[] links = linkField.split(", ");
-        int l = 0;
-        while (l < links.length)
-        {
-          String rawURL = links[l++].trim();
-          // Process the link
-          handler.noteDiscoveredLink(rawURL);
-        }
-      }
-    }
-  }
-
-  /** Handle document references from HTML */
-  protected void handleHTML(String documentURI, IHTMLHandler handler)
-    throws ManifoldCFException
-  {
-    int responseCode = cache.getResponseCode(documentURI);
-    if (responseCode != 200)
-      return;
-    try
-    {
-      // We'll check first to see if this is textual - and then we'll try to find html links in it.
-      if (!isDocumentText(documentURI))
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Document '"+documentURI+"' is not text; can't extract links");
-        return;
-      }
-      // Grab the content-type so we know how to decode.
-      String contentType = extractContentType(cache.getContentType(documentURI));
-      String encoding = extractEncoding(contentType);
-      if (encoding == null)
-        encoding = StandardCharsets.UTF_8.name();
-      
-      // Search for A HREF tags in the document stream.  This is brain-dead link location
-      InputStream is = cache.getData(documentURI);
-      if (is == null)
-      {
-        Logging.connectors.error("WEB: Document '"+documentURI+"' should be in cache but isn't");
-        return;
-      }
-
-      try
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Document '"+documentURI+"' is text, with encoding '"+encoding+"'; link extraction starting");
-
-        // Instantiate the parser, and call the right method
-        Parser p = new Parser();
-        p.parseWithoutCharsetDetection(encoding,is,new FormParseState(handler));
-      }
-      catch (UnsupportedEncodingException e)
-      {
-        // The encoding specified was crap, so don't handle this document.
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Document '"+documentURI+"' had an unrecognized encoding '"+encoding+"'");
-        return;
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket connect timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      //Logging.connectors.warn("IO interruption seen",e);
-
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error: "+e.getMessage(),e);
-    }
-  }
-
-  /** Is the document text, as far as we can tell? */
-  protected boolean isDocumentText(String documentURI)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Look at the first 4K
-      byte[] byteBuffer = new byte[4096];
-      int amt;
-
-      // Open file for reading.
-      InputStream is = cache.getData(documentURI);
-      if (is == null)
-        return false;
-      try
-      {
-        amt = 0;
-        while (amt < byteBuffer.length)
-        {
-          int incr = is.read(byteBuffer,amt,byteBuffer.length-amt);
-          if (incr == -1)
-            break;
-          amt += incr;
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-
-      if (amt == 0)
-        return false;
-
-      return isText(byteBuffer,amt);
-    }
-    catch (SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception accessing cached document: "+e.getMessage(),e);
-    }
-    catch (ConnectTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception accessing cached document: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception accessing cached document: "+e.getMessage(),e);
-    }
-  }
-
-  /** Test to see if a document is text or not.  The first n bytes are passed
-  * in, and this code returns "true" if it thinks they represent text.  The code
-  * has been lifted algorithmically from products/Sharecrawler/Fingerprinter.pas,
-  * which was based on "perldoc -f -T".
-  */
-  protected static boolean isText(byte[] beginChunk, int chunkLength)
-  {
-    if (chunkLength == 0)
-      return true;
-    int i = 0;
-    int count = 0;
-    while (i < chunkLength)
-    {
-      byte x = beginChunk[i++];
-      if (x == 0)
-        return false;
-      if (isStrange(x))
-        count++;
-    }
-    return ((double)count)/((double)chunkLength) < 0.30;
-  }
-
-  /** Check if character is not typical ASCII or utf-8. */
-  protected static boolean isStrange(byte x)
-  {
-    return (x >= 0 && x < 32) && (!isWhiteSpace(x));
-  }
-
-  /** Check if a byte is a whitespace character. */
-  protected static boolean isWhiteSpace(byte x)
-  {
-    return (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20);
-  }
-
-  /** Read a string as a sequence of individual expressions, urls, etc.
-  */
-  protected static List<String> stringToArray(String input)
-  {
-    List<String> list = new ArrayList<String>();
-    try
-    {
-      java.io.Reader str = new java.io.StringReader(input);
-      try
-      {
-        java.io.BufferedReader is = new java.io.BufferedReader(str);
-        try
-        {
-          while (true)
-          {
-            String nextString = is.readLine();
-            if (nextString == null)
-              break;
-            nextString = nextString.trim();
-            if (nextString.length() == 0)
-              continue;
-            if (nextString.startsWith("#"))
-              continue;
-            list.add(nextString);
-          }
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        str.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      // Eat the exception and exit.
-    }
-    return list;
-  }
-
-  /** Compile all regexp entries in the passed in list, and add them to the output
-  * list.
-  */
-  protected static void compileList(List<Pattern> output, List<String> input)
-    throws ManifoldCFException
-  {
-    int i = 0;
-    while (i < input.size())
-    {
-      String inputString = input.get(i++);
-      try
-      {
-        output.add(Pattern.compile(inputString));
-      }
-      catch (PatternSyntaxException e)
-      {
-        throw new ManifoldCFException("Mapping regular expression '"+inputString+"' is illegal: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  /** Get the page credentials for a given document identifier (URL) */
-  protected PageCredentials getPageCredential(String documentIdentifier)
-  {
-    return credentialsDescription.getPageCredential(documentIdentifier);
-  }
-
-  /** Get the sequence credentials for a given document identifier (URL) */
-  protected SequenceCredentials getSequenceCredential(String documentIdentifier)
-  {
-    return credentialsDescription.getSequenceCredential(documentIdentifier);
-  }
-
-  /** Get the trust store for a given document identifier (URL) */
-  protected IKeystoreManager getTrustStore(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    return trustsDescription.getTrustStore(documentIdentifier);
-  }
-
-  /** Grab forced acl out of document specification.
-  *@param spec is the document specification.
-  *@return the acls.
-  */
-  protected static String[] getAcls(Specification spec)
-  {
-    Set<String> map = new HashSet<String>();
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode sn = spec.getChild(i++);
-      if (sn.getType().equals(WebcrawlerConfig.NODE_ACCESS))
-      {
-        String token = sn.getAttributeValue(WebcrawlerConfig.ATTR_TOKEN);
-        map.add(token);
-      }
-    }
-
-    String[] rval = new String[map.size()];
-    Iterator<String> iter = map.iterator();
-    i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = iter.next();
-    }
-    return rval;
-  }
-
-  /** Read a document specification to get a set of excluded headers */
-  protected static Set<String> findExcludedHeaders(Specification spec)
-    throws ManifoldCFException
-  {
-    Set<String> rval = new HashSet<String>();
-    int i = 0;
-    while (i < spec.getChildCount())
-    {
-      SpecificationNode n = spec.getChild(i++);
-      if (n.getType().equals(WebcrawlerConfig.NODE_EXCLUDEHEADER))
-      {
-        String value = n.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-        rval.add(value);
-      }
-    }
-    return rval;
-  }
-  
-  /** Calculate events that should be associated with a document. */
-  protected String[] calculateDocumentEvents(INamingActivity activities, String documentIdentifier)
-  {
-    // All we have for events for right now are the robots and dns events.  Each document has one of each.
-    try
-    {
-      // Get all the appropriate parts from the document identifier
-      URL url = new URL(documentIdentifier);
-      String hostName = url.getHost();
-      String protocol = url.getProtocol();
-      int port = url.getPort();
-      if (port == -1)
-        port = url.getDefaultPort();
-      // Form the robots key
-      String robotsKey = makeRobotsKey(protocol,hostName,port);
-      // Build the corresponding event name
-      String robotsEventName = makeRobotsEventName(activities,robotsKey);
-      String dnsEventName = makeDNSEventName(activities,hostName);
-      // See if we're in a session-protected area
-      SequenceCredentials sequenceCredential = getSequenceCredential(documentIdentifier);
-      if (sequenceCredential != null)
-      {
-        String sessionKey = sequenceCredential.getSequenceKey();
-        String sessionEventName = makeSessionLoginEventName(activities,sessionKey);
-        return new String[]{robotsEventName,hostName,sessionEventName};
-      }
-      return new String[]{robotsEventName,hostName};
-    }
-    catch (MalformedURLException e)
-    {
-      Logging.connectors.warn("WEB: Could not form event names for identifier '"+documentIdentifier+"' because it was malformed: "+e.getMessage(),e);
-      return null;
-    }
-  }
-
-  /** Name/value class */
-  protected static class NameValue
-  {
-    protected final String name;
-    protected final String value;
-
-    public NameValue(String name, String value)
-    {
-      this.name = name;
-      this.value = value;
-    }
-
-    public String getName()
-    {
-      return name;
-    }
-
-    public String getValue()
-    {
-      return value;
-    }
-  }
-
-  /** Evaluator token.
-  */
-  protected static class EvaluatorToken
-  {
-    public final static int TYPE_GROUP = 0;
-    public final static int TYPE_TEXT = 1;
-    public final static int TYPE_COMMA = 2;
-
-    public final static int GROUPSTYLE_NONE = 0;
-    public final static int GROUPSTYLE_LOWER = 1;
-    public final static int GROUPSTYLE_UPPER = 2;
-    public final static int GROUPSTYLE_MIXED = 3;
-
-    protected int type;
-    protected int groupNumber = -1;
-    protected int groupStyle = GROUPSTYLE_NONE;
-    protected String textValue = null;
-
-    public EvaluatorToken()
-    {
-      type = TYPE_COMMA;
-    }
-
-    public EvaluatorToken(int groupNumber, int groupStyle)
-    {
-      type = TYPE_GROUP;
-      this.groupNumber = groupNumber;
-      this.groupStyle = groupStyle;
-    }
-
-    public EvaluatorToken(String text)
-    {
-      type = TYPE_TEXT;
-      this.textValue = text;
-    }
-
-    public int getType()
-    {
-      return type;
-    }
-
-    public int getGroupNumber()
-    {
-      return groupNumber;
-    }
-
-    public int getGroupStyle()
-    {
-      return groupStyle;
-    }
-
-    public String getTextValue()
-    {
-      return textValue;
-    }
-
-  }
-
-
-  /** Token stream.
-  */
-  protected static class EvaluatorTokenStream
-  {
-    protected String text;
-    protected int pos;
-    protected EvaluatorToken token = null;
-
-    /** Constructor.
-    */
-    public EvaluatorTokenStream(String text)
-    {
-      this.text = text;
-      this.pos = 0;
-    }
-
-    /** Get current token.
-    */
-    public EvaluatorToken peek()
-      throws ManifoldCFException
-    {
-      if (token == null)
-      {
-        token = nextToken();
-      }
-      return token;
-    }
-
-    /** Go on to next token.
-    */
-    public void advance()
-    {
-      token = null;
-    }
-
-    protected EvaluatorToken nextToken()
-      throws ManifoldCFException
-    {
-      char x;
-      // Fetch the next token
-      while (true)
-      {
-        if (pos == text.length())
-          return null;
-        x = text.charAt(pos);
-        if (x > ' ')
-          break;
-        pos++;
-      }
-
-      StringBuilder sb;
-
-      if (x == '"')
-      {
-        // Parse text
-        pos++;
-        sb = new StringBuilder();
-        while (true)
-        {
-          if (pos == text.length())
-            break;
-          x = text.charAt(pos);
-          pos++;
-          if (x == '"')
-          {
-            break;
-          }
-          if (x == '\\')
-          {
-            if (pos == text.length())
-              break;
-            x = text.charAt(pos++);
-          }
-          sb.append(x);
-        }
-
-        return new EvaluatorToken(sb.toString());
-      }
-
-      if (x == ',')
-      {
-        pos++;
-        return new EvaluatorToken();
-      }
-
-      // Eat number at beginning
-      sb = new StringBuilder();
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x >= '0' && x <= '9')
-        {
-          sb.append(x);
-          pos++;
-          continue;
-        }
-        break;
-      }
-      String numberValue = sb.toString();
-      int groupNumber = 0;
-      if (numberValue.length() > 0)
-        groupNumber = new Integer(numberValue).intValue();
-      // Save the next char position
-      int modifierPos = pos;
-      // Go to the end of the word
-      while (true)
-      {
-        if (pos == text.length())
-          break;
-        x = text.charAt(pos);
-        if (x == ',' || x >= '0' && x <= '9' || x <= ' ' && x >= 0)
-          break;
-        pos++;
-      }
-
-      int style = EvaluatorToken.GROUPSTYLE_NONE;
-      if (modifierPos != pos)
-      {
-        String modifier = text.substring(modifierPos,pos);
-        if (modifier.startsWith("u"))
-          style = EvaluatorToken.GROUPSTYLE_UPPER;
-        else if (modifier.startsWith("l"))
-          style = EvaluatorToken.GROUPSTYLE_LOWER;
-        else if (modifier.startsWith("m"))
-          style = EvaluatorToken.GROUPSTYLE_MIXED;
-        else
-          throw new ManifoldCFException("Unknown style: "+modifier);
-      }
-      return new EvaluatorToken(groupNumber,style);
-    }
-  }
-
-  /** Class representing a URL regular expression match, for the purposes of determining canonicalization policy */
-  protected static class CanonicalizationPolicy
-  {
-    protected final Pattern matchPattern;
-    protected final boolean reorder;
-    protected final boolean removeJavaSession;
-    protected final boolean removeAspSession;
-    protected final boolean removePhpSession;
-    protected final boolean removeBVSession;
-
-    public CanonicalizationPolicy(Pattern matchPattern, boolean reorder, boolean removeJavaSession, boolean removeAspSession,
-      boolean removePhpSession, boolean removeBVSession)
-    {
-      this.matchPattern = matchPattern;
-      this.reorder = reorder;
-      this.removeJavaSession = removeJavaSession;
-      this.removeAspSession = removeAspSession;
-      this.removePhpSession = removePhpSession;
-      this.removeBVSession = removeBVSession;
-    }
-
-    public boolean checkMatch(String url)
-    {
-      Matcher matcher = matchPattern.matcher(url);
-      return matcher.find();
-    }
-
-    public boolean canReorder()
-    {
-      return reorder;
-    }
-
-    public boolean canRemoveJavaSession()
-    {
-      return removeJavaSession;
-    }
-
-    public boolean canRemoveAspSession()
-    {
-      return removeAspSession;
-    }
-
-    public boolean canRemovePhpSession()
-    {
-      return removePhpSession;
-    }
-
-    public boolean canRemoveBvSession()
-    {
-      return removeBVSession;
-    }
-
-  }
-
-  /** Class representing a list of canonicalization rules */
-  protected static class CanonicalizationPolicies
-  {
-    protected final List<CanonicalizationPolicy> rules = new ArrayList<CanonicalizationPolicy>();
-
-    public CanonicalizationPolicies()
-    {
-    }
-
-    public void addRule(CanonicalizationPolicy rule)
-    {
-      rules.add(rule);
-    }
-
-    public CanonicalizationPolicy findMatch(String url)
-    {
-      int i = 0;
-      while (i < rules.size())
-      {
-        CanonicalizationPolicy rule = rules.get(i++);
-        if (rule.checkMatch(url))
-          return rule;
-      }
-      return null;
-    }
-  }
-
-  /** Class representing a mapping rule */
-  protected static class MappingRule
-  {
-    protected final Pattern matchPattern;
-    protected final String evalExpression;
-
-    public MappingRule(Pattern matchPattern, String evalExpression)
-    {
-      this.matchPattern = matchPattern;
-      this.evalExpression = evalExpression;
-    }
-
-    public boolean checkMatch(String url)
-    {
-      Matcher matcher = matchPattern.matcher(url);
-      return matcher.matches();
-    }
-
-    public String map(String url)
-      throws ManifoldCFException
-    {
-      // Create a matcher, and attempt to do a match
-      Matcher matcher = matchPattern.matcher(url);
-      if (!matcher.matches())
-      {
-        return null;
-      }
-
-      // A match!  Now, interpret the output expression
-      if (evalExpression == null || evalExpression.length() == 0)
-        return url;
-
-      StringBuilder sb = new StringBuilder();
-      EvaluatorTokenStream et = new EvaluatorTokenStream(evalExpression);
-
-      while (true)
-      {
-        EvaluatorToken t = et.peek();
-        if (t == null)
-          break;
-        switch (t.getType())
-        {
-        case EvaluatorToken.TYPE_COMMA:
-          et.advance();
-          break;
-        case EvaluatorToken.TYPE_GROUP:
-          et.advance();
-          String groupValue = matcher.group(t.getGroupNumber());
-          switch (t.getGroupStyle())
-          {
-          case EvaluatorToken.GROUPSTYLE_NONE:
-            sb.append(groupValue);
-            break;
-          case EvaluatorToken.GROUPSTYLE_LOWER:
-            sb.append(groupValue.toLowerCase(Locale.ROOT));
-            break;
-          case EvaluatorToken.GROUPSTYLE_UPPER:
-            sb.append(groupValue.toUpperCase(Locale.ROOT));
-            break;
-          case EvaluatorToken.GROUPSTYLE_MIXED:
-            if (groupValue.length() > 0)
-            {
-              sb.append(groupValue.substring(0,1).toUpperCase(Locale.ROOT));
-              sb.append(groupValue.substring(1).toLowerCase(Locale.ROOT));
-            }
-            break;
-          default:
-            throw new ManifoldCFException("Illegal group style");
-          }
-          break;
-        case EvaluatorToken.TYPE_TEXT:
-          et.advance();
-          sb.append(t.getTextValue());
-          break;
-        default:
-          throw new ManifoldCFException("Illegal token type");
-        }
-      }
-      return sb.toString();
-    }
-
-  }
-
-  /** Class that represents all mappings */
-  protected static class MappingRules
-  {
-    protected final List<MappingRule> mappings = new ArrayList<MappingRule>();
-
-    public MappingRules()
-    {
-    }
-
-    public void add(MappingRule rule)
-    {
-      mappings.add(rule);
-    }
-
-    public boolean isMatch(String url)
-    {
-      if (mappings.size() == 0)
-        return true;
-      for (MappingRule p : mappings)
-      {
-        if (p.checkMatch(url))
-          return true;
-      }
-      return false;
-    }
-
-    public String map(String url)
-      throws ManifoldCFException
-    {
-      if (mappings.size() == 0)
-        return url;
-      for (MappingRule p : mappings)
-      {
-        String rval = p.map(url);
-        if (rval != null)
-          return rval;
-      }
-      return null;
-    }
-  }
-
-  /** This class describes the url filtering information (for crawling and indexing) obtained from a digested DocumentSpecification.
-  */
-  protected class DocumentURLFilter
-  {
-    /** The version string */
-    protected String versionString;
-    /** Mapping rules */
-    protected final MappingRules mappings = new MappingRules();
-    /** The arraylist of include patterns */
-    protected final List<Pattern> includePatterns = new ArrayList<Pattern>();
-    /** The arraylist of exclude patterns */
-    protected final List<Pattern> excludePatterns = new ArrayList<Pattern>();
-    /** The arraylist of index include patterns */
-    protected final List<Pattern> includeIndexPatterns = new ArrayList<Pattern>();
-    /** The arraylist of index exclude patterns */
-    protected final List<Pattern> excludeIndexPatterns = new ArrayList<Pattern>();
-    /** The hash map of seed hosts, to limit urls by, if non-null */
-    protected Set<String> seedHosts = null;
-
-    /**List of content exclusion pattern*/
-    protected final List<Pattern> excludeContentIndexPatterns = new ArrayList<Pattern>();
-
-    /** Canonicalization policies */
-    protected final CanonicalizationPolicies canonicalizationPolicies = new CanonicalizationPolicies();
-
-    /** Process a document specification to produce a filter.
-    * Note that we EXPECT the regexp's in the document specification to be properly formed.
-    * This should be checked at save time to prevent errors.  Any syntax errors found here
-    * will thus cause the include or exclude regexp to be skipped.
-    */
-    public DocumentURLFilter(Specification spec)
-      throws ManifoldCFException
-    {
-      String includes = ".*";
-      String excludes = "";
-      String includesIndex = ".*";
-      String excludesIndex = "";
-      String excludesContentIndex = "";
-      String seeds = "";
-      List<String> packList = new ArrayList<String>();
-      String[] packStuff = new String[2];
-      boolean limitToSeeds = false;
-      int i = 0;
-      while (i < spec.getChildCount())
-      {
-        SpecificationNode sn = spec.getChild(i++);
-        if (sn.getType().equals(WebcrawlerConfig.NODE_MAP))
-        {
-          String match = sn.getAttributeValue(WebcrawlerConfig.ATTR_MATCH);
-          String map = sn.getAttributeValue(WebcrawlerConfig.ATTR_MAP);
-          if (match != null && match.length() > 0)
-          {
-            packStuff[0] = match;
-            packStuff[1] = map;
-            StringBuilder sb = new StringBuilder();
-            packList(sb,packStuff,'=');
-            packList.add(sb.toString());
-            Pattern p;
-            try
-            {
-              p = Pattern.compile(match);
-            }
-            catch (java.util.regex.PatternSyntaxException e)
-            {
-              throw new ManifoldCFException("Regular expression '"+match+"' is illegal: "+e.getMessage(),e);
-            }
-            if (map == null)
-              map = "";
-            mappings.add(new MappingRule(p,map));
-          }
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_SEEDS))
-        {
-          // Save the seeds aside; we'll parse them only if we need to.
-          seeds = sn.getValue();
-          if (seeds == null)
-            seeds = "";
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_INCLUDES))
-        {
-          includes = sn.getValue();
-          if (includes == null)
-            includes = "";
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDES))
-        {
-          excludes = sn.getValue();
-          if (excludes == null)
-            excludes = "";
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_INCLUDESINDEX))
-        {
-          includesIndex = sn.getValue();
-          if (includesIndex == null)
-            includesIndex = "";
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDESINDEX))
-        {
-          excludesIndex = sn.getValue();
-          if (excludesIndex == null)
-            excludesIndex = "";
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_LIMITTOSEEDS))
-        {
-          String value = sn.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          if (value == null || value.equals(WebcrawlerConfig.ATTRVALUE_FALSE))
-            limitToSeeds = false;
-          else
-            limitToSeeds = true;
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_URLSPEC))
-        {
-          String urlRegexp = sn.getAttributeValue(WebcrawlerConfig.ATTR_REGEXP);
-          if (urlRegexp == null)
-            urlRegexp = "";
-          String reorder = sn.getAttributeValue(WebcrawlerConfig.ATTR_REORDER);
-          boolean reorderValue;
-          if (reorder == null)
-            reorderValue = false;
-          else
-          {
-            reorderValue = reorder.equals(WebcrawlerConfig.ATTRVALUE_YES);
-          }
-
-          String javaSession = sn.getAttributeValue(WebcrawlerConfig.ATTR_JAVASESSIONREMOVAL);
-          boolean javaSessionValue;
-          if (javaSession == null)
-            javaSessionValue = false;
-          else
-          {
-            javaSessionValue = javaSession.equals(WebcrawlerConfig.ATTRVALUE_YES);
-          }
-
-          String aspSession = sn.getAttributeValue(WebcrawlerConfig.ATTR_ASPSESSIONREMOVAL);
-          boolean aspSessionValue;
-          if (aspSession == null)
-            aspSessionValue = false;
-          else
-          {
-            aspSessionValue = aspSession.equals(WebcrawlerConfig.ATTRVALUE_YES);
-          }
-
-          String phpSession = sn.getAttributeValue(WebcrawlerConfig.ATTR_PHPSESSIONREMOVAL);
-          boolean phpSessionValue;
-          if (phpSession == null)
-            phpSessionValue = false;
-          else
-          {
-            phpSessionValue = phpSession.equals(WebcrawlerConfig.ATTRVALUE_YES);
-          }
-
-          String bvSession = sn.getAttributeValue(WebcrawlerConfig.ATTR_BVSESSIONREMOVAL);
-          boolean bvSessionValue;
-          if (bvSession == null)
-            bvSessionValue = false;
-          else
-          {
-            bvSessionValue = bvSession.equals(WebcrawlerConfig.ATTRVALUE_YES);
-          }
-          try
-          {
-            canonicalizationPolicies.addRule(new CanonicalizationPolicy(Pattern.compile(urlRegexp),reorderValue,javaSessionValue,aspSessionValue,
-              phpSessionValue, bvSessionValue));
-          }
-          catch (java.util.regex.PatternSyntaxException e)
-          {
-            throw new ManifoldCFException("Canonicalization regular expression '"+urlRegexp+"' is illegal: "+e.getMessage(),e);
-          }
-        }
-        else if (sn.getType().equals(WebcrawlerConfig.NODE_EXCLUDESCONTENTINDEX))
-        {
-          excludesContentIndex = sn.getValue();
-          if (excludesContentIndex == null)
-            excludesContentIndex = "";
-        }
-      }
-
-      // Note: format change since MCF 1.7 release
-      StringBuilder versionBuffer = new StringBuilder();
-      pack(versionBuffer,includesIndex,'+');
-      pack(versionBuffer,excludesIndex,'+');
-      pack(versionBuffer,excludesContentIndex,'+');
-      packList(versionBuffer,packList,'+');
-      versionString = versionBuffer.toString();
-      
-      List<String> list;
-      list = stringToArray(includes);
-      compileList(includePatterns,list);
-      list = stringToArray(excludes);
-      compileList(excludePatterns,list);
-      list = stringToArray(includesIndex);
-      compileList(includeIndexPatterns,list);
-      list = stringToArray(excludesIndex);
-      compileList(excludeIndexPatterns,list);
-      list = stringToArray(excludesContentIndex);
-      compileList(excludeContentIndexPatterns,list);
-
-      if (limitToSeeds)
-      {
-        seedHosts = new HashSet<String>();
-        // Parse all URLs, and put their hosts into the hash table.
-        // Break up the seeds string and iterate over the results.
-        list = stringToArray(seeds);
-        // We must only return valid urls here!!!
-        int index = 0;
-        while (index < list.size())
-        {
-          String urlCandidate = list.get(index++);
-          try
-          {
-            java.net.URI url = new java.net.URI(urlCandidate);
-
-            String host = url.getHost();
-
-            if (host != null)
-              seedHosts.add(host);
-          }
-          catch (java.net.URISyntaxException e)
-          {
-            // Skip the entry
-          }
-          catch (java.lang.IllegalArgumentException e)
-          {
-            // Skip the entry
-          }
-
-        }
-      }
-    }
-
-    /** Get whatever contribution to the version string should come from this data.
-    */
-    public String getVersionString()
-    {
-      // In practice, this is NOT what controls the set that is spidered, but rather the set that is indexed
-      return versionString;
-    }
-    
-    /** Check if both a document and host are legal.
-    */
-    public boolean isDocumentAndHostLegal(String url)
-    {
-      if (!isDocumentLegal(url))
-        return false;
-      if (seedHosts == null)
-        return true;
-      try
-      {
-        java.net.URI uri = new java.net.URI(url);
-        String host = uri.getHost();
-        if (host == null)
-          return false;
-        return isHostLegal(host);
-      }
-      catch (java.net.URISyntaxException e)
-      {
-        return false;
-      }
-      catch (java.lang.IllegalArgumentException e)
-      {
-        return false;
-      }
-
-    }
-    
-    /** Check if a host is legal.
-    */
-    public boolean isHostLegal(String host)
-    {
-      if (seedHosts == null)
-        return true;
-      return seedHosts.contains(host);
-    }
-    
-    /** Check if the document identifier is legal.
-    */
-    public boolean isDocumentLegal(String url)
-    {
-      // First, verify that the url matches one of the patterns in the include list.
-      int i = 0;
-      while (i < includePatterns.size())
-      {
-        Pattern p = includePatterns.get(i);
-        Matcher m = p.matcher(url);
-        if (m.find())
-          break;
-        i++;
-      }
-      if (i == includePatterns.size())
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Url '"+url+"' is illegal because no include patterns match it");
-        return false;
-      }
-
-      // Now make sure it's not in the exclude list.
-      i = 0;
-      while (i < excludePatterns.size())
-      {
-        Pattern p = excludePatterns.get(i);
-        Matcher m = p.matcher(url);
-        if (m.find())
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB: Url '"+url+"' is illegal because exclude pattern '"+p.toString()+"' matched it");
-          return false;
-        }
-        i++;
-      }
-
-      return true;
-    }
-
-    /** Check if the document identifier is indexable, and return the indexing URL if found.
-    * @return null if the url doesn't match or should not be ingested, or the new string if it does.
-    */
-    public String isDocumentIndexable(String url)
-      throws ManifoldCFException
-    {
-      // First, verify that the url matches one of the patterns in the include list.
-      int i = 0;
-      while (i < includeIndexPatterns.size())
-      {
-        Pattern p = includeIndexPatterns.get(i);
-        Matcher m = p.matcher(url);
-        if (m.find())
-          break;
-        i++;
-      }
-      if (i == includeIndexPatterns.size())
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Url '"+url+"' is not indexable because no include patterns match it");
-        return null;
-      }
-
-      // Now make sure it's not in the exclude list.
-      i = 0;
-      while (i < excludeIndexPatterns.size())
-      {
-        Pattern p = excludeIndexPatterns.get(i);
-        Matcher m = p.matcher(url);
-        if (m.find())
-        {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB: Url '"+url+"' is not indexable because exclude pattern '"+p.toString()+"' matched it");
-          return null;
-        }
-        i++;
-      }
-
-      String rval = mappings.map(url);
-      if (rval == null)
-      {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: Url '"+url+"' is not indexable because it did not match a mapping rule");
-      }
-
-      return rval;
-    }
-
-    /** Get canonicalization policies */
-    public CanonicalizationPolicies getCanonicalizationPolicies()
-    {
-      return canonicalizationPolicies;
-    }
-
-    public boolean isDocumentContentIndexable(String documentIdentifier) throws ManifoldCFException {
-        String content = findSpecifiedContent(documentIdentifier, excludeContentIndexPatterns);
-        if (content != null) {
-          if (Logging.connectors.isDebugEnabled())
-            Logging.connectors.debug("WEB: Url '" + documentIdentifier + "' is not indexable because content exclusion pattern was matched");
-
-          return false;
-      }
-      return true;
-    }
-
-    protected String findSpecifiedContent(String currentURI, List<Pattern> patterns) throws ManifoldCFException
-    {
-      if (excludeContentIndexPatterns.isEmpty()) {
-        if (Logging.connectors.isDebugEnabled())
-          Logging.connectors.debug("WEB: no content exclusion rule supplied... returning");
-        return null;
-      }
-
-      FindContentHandler handler = new FindContentHandler(currentURI, patterns);
-      handleHTML(currentURI, handler);
-      return handler.getTargetURI();
-    }
-
-  }
-
-  protected static class FetchStatus
-  {
-    public int sessionState = SESSIONSTATE_NORMAL;
-    public int resultSignal = RESULT_NO_DOCUMENT;
-    // The result context message, which will be used for logging and activity logging if enabled.
-    public String contextMessage = null;
-    // The result context exception, which will be used for logging if needed.
-    public Throwable contextException = null;
-    // The checksum, which will be needed if resultSignal is RESULT_VERSION_NEEDED.
-    public String checkSum = null;
-    // The headers, which will be needed if resultSignal is RESULT_VERSION_NEEDED.
-    public Map<String,List<String>> headerData = null;
-
-  }
-  
-}
-
-
diff --git a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_en_US.properties b/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_en_US.properties
deleted file mode 100644
index b64c189..0000000
--- a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_en_US.properties
+++ /dev/null
@@ -1,158 +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.
-
-WebcrawlerConnector.Email=Email
-WebcrawlerConnector.Robots=Robots
-WebcrawlerConnector.Bandwidth=Bandwidth
-WebcrawlerConnector.AccessCredentials=Access Credentials
-WebcrawlerConnector.Certificates=Certificates
-WebcrawlerConnector.Proxy=Proxy
-WebcrawlerConnector.ProxyHostColon=Proxy host:
-WebcrawlerConnector.ProxyPortColon=Proxy port:
-WebcrawlerConnector.ProxyAuthenticationDomainColon=Proxy authentication domain:
-WebcrawlerConnector.ProxyAuthenticationUserNameColon=Proxy authentication user name:
-WebcrawlerConnector.ProxyAuthenticationPasswordColon=Proxy authentication password:
-WebcrawlerConnector.EmailAddressToContact=Email address to contact:
-WebcrawlerConnector.RobotsTxtUsage=Robots.txt usage:
-WebcrawlerConnector.DontLookAtRobotsTxt=Don't look at robots.txt
-WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly=Obey robots.txt for data fetches only
-WebcrawlerConnector.ObeyRobotsTxtForAllFetches=Obey robots.txt for all fetches
-WebcrawlerConnector.MetaRobotsTagsUsage=Meta robots tags usage:
-WebcrawlerConnector.DontLookAtMetaRobotsTags=Don't look at meta robots tags
-WebcrawlerConnector.ObeyMetaRobotsTags=Obey meta robots tags
-WebcrawlerConnector.Throttles=Throttles:
-WebcrawlerConnector.BinRegularExpression=Bin regular expression
-WebcrawlerConnector.CaseInsensitive=Case insensitive?
-WebcrawlerConnector.MaxConnections=Max connections
-WebcrawlerConnector.MaxKbytesSec=Max Kbytes/sec
-WebcrawlerConnector.MaxFetchesMin=Max fetches/min
-WebcrawlerConnector.Delete=Delete
-WebcrawlerConnector.DeleteBinRegularExpression=Delete bin regular expression #
-WebcrawlerConnector.Add=Add
-WebcrawlerConnector.AddBinRegularExpression=Add bin regular expression
-WebcrawlerConnector.PageAccessCredentials=Page access credentials:
-WebcrawlerConnector.URLRegularExpression=URL regular expression
-WebcrawlerConnector.AddPageAuthenticationUrlRegularExpression=Add page authentication url regular expression
-WebcrawlerConnector.CredentialType=Credential type
-WebcrawlerConnector.CredentialDomain=Credential domain
-WebcrawlerConnector.UserName=User name
-WebcrawlerConnector.NoPageAccessCredentials=No page access credentials
-WebcrawlerConnector.SessionBasedAccessCredentials=Session-based access credentials:
-WebcrawlerConnector.LoginPages=Login pages
-WebcrawlerConnector.LoginURLRegularExpression=Login URL regular expression
-WebcrawlerConnector.PageType=Page type
-WebcrawlerConnector.FormNamelinkTargetRegularExpression=Identification regular expression
-WebcrawlerConnector.OverrideFormParameters=Override form parameters
-WebcrawlerConnector.OverrideTargetURL=Override target URL
-WebcrawlerConnector.NoLoginPagesSpecified=No login pages specified
-WebcrawlerConnector.NoSessionBasedAccessCredentials=No session-based access credentials
-WebcrawlerConnector.TrustCertificates=Trust certificates:
-WebcrawlerConnector.Certificate=Certificate
-WebcrawlerConnector.TrustEverything=Trust everything
-WebcrawlerConnector.NoTrustCertificates=No trust certificates
-WebcrawlerConnector.Description=Description
-WebcrawlerConnector.Reorder=Reorder?
-WebcrawlerConnector.RemoveJSPSessions=Remove JSP sessions?
-WebcrawlerConnector.RemoveASPSessions=Remove ASP sessions?
-WebcrawlerConnector.RemovePHPSessions=Remove PHP sessions?
-WebcrawlerConnector.RemoveBVSessions=Remove BV sessions?
-WebcrawlerConnector.DeleteUrlRegexp2=Delete url regexp
-WebcrawlerConnector.NoCanonicalizationSpecified=No canonicalization specified - all URLs will be reordered and have all sessions removed
-WebcrawlerConnector.AddUrlRegexp=Add url regexp
-WebcrawlerConnector.IncludeInCrawl=Include in crawl:
-WebcrawlerConnector.IncludeInIndex=Include in index:
-WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds=Include only hosts matching seeds?
-WebcrawlerConnector.ExcludeFromCrawl=Exclude from crawl:
-WebcrawlerConnector.ExcludeFromIndex=Exclude from index:
-WebcrawlerConnector.ExcludeContentFromIndex=Exclude content from index:
-WebcrawlerConnector.DeleteToken=Delete token #
-WebcrawlerConnector.NoAccessTokensPresent=No access tokens present
-WebcrawlerConnector.AddAccessToken=Add access token
-WebcrawlerConnector.DeleteMetadata=Delete metadata #
-WebcrawlerConnector.NoMetadataPresent=No metadata present
-WebcrawlerConnector.AddMetadata=Add metadata
-WebcrawlerConnector.Seeds=Seeds:
-WebcrawlerConnector.URLCanonicalization=URL canonicalization:
-WebcrawlerConnector.URLRegexp=URL regexp
-WebcrawlerConnector.AccessTokens=Access tokens:
-WebcrawlerConnector.NoAccessTokensSpecified=No access tokens specified
-WebcrawlerConnector.Metadata=Metadata:
-WebcrawlerConnector.NoMetadataSpecified=No metadata specified
-WebcrawlerConnector.BasicAuthentication=Basic authentication
-WebcrawlerConnector.NTLMAuthentication=NTLM authentication
-WebcrawlerConnector.UploadCertificate=Upload certificate:
-WebcrawlerConnector.DeletePageAuthenticationUrlRegularExpression=Delete page authentication url regular expression #
-WebcrawlerConnector.DeleteSessionAuthenticationUrlRegularExpression=Delete session authentication url regular expression #
-WebcrawlerConnector.NoTrustCertificatesSpecified=No trust certificates specified
-WebcrawlerConnector.AddUrlRegularExpressionForTruststore=Add url regular expression for truststore
-WebcrawlerConnector.NoSessionBasedAccessCredentialsSpecified=No session-based access credentials specified
-WebcrawlerConnector.NoPageAccessCredentialsSpecified=No page access credentials specified
-WebcrawlerConnector.NoFormParametersSpecified=No override form parameters specified
-WebcrawlerConnector.AuthenticationType=Authentication type
-WebcrawlerConnector.Domain=Domain
-WebcrawlerConnector.Password=Password
-WebcrawlerConnector.EmailAaddressRequired=Email address required, to be included in all request headers
-WebcrawlerConnector.MaximumConnectionsMustBeAnInteger=Maximum connections must be an integer
-WebcrawlerConnector.NeedAValidEmailAddress=Need a valid email address
-WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger=Maximum Kbytes per second must be an integer
-WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger=Maximum fetches per minute must be an integer
-WebcrawlerConnector.CredentialMustHaveNonNullUserName=Credential must have non-null user name
-WebcrawlerConnector.MatchExpressionMustBeAValidRegularExpression=Match expression must be a valid regular expression
-WebcrawlerConnector.ParameterMustHaveNonEmptyName=Parameter must have non-empty name
-WebcrawlerConnector.ParameterCanEitherBeHidden=Parameter can either be hidden or not, but can't be both
-WebcrawlerConnector.AValidRegularExpressionIsRequired=A valid regular expression is required
-WebcrawlerConnector.CredentialMustIncludeANonNullUserName=Credential must include a non-null user name
-WebcrawlerConnector.ParameterNameMustBeARegularExpression=Parameter name must be a regular expression
-WebcrawlerConnector.SpecifyATrustCertificateFileToUploadFirst=Specify a trust certificate file to upload first, or check 'Trust everything'
-WebcrawlerConnector.NoBandwidthOrConnectionThrottlingSpecified=No bandwidth or connection throttling specified
-WebcrawlerConnector.DeleteLoginPage=Delete login page #
-WebcrawlerConnector.ParameterRegularExpression=Parameter regular expression
-WebcrawlerConnector.Value=Value
-WebcrawlerConnector.DeleteParameter=Delete parameter #
-WebcrawlerConnector.ForLoginPage= for login page #
-WebcrawlerConnector.ForCredential= for credential #
-WebcrawlerConnector.AddParameterToLoginPage=Add parameter to login page #
-WebcrawlerConnector.AddLoginPageToCredential=Add login page to credential #
-WebcrawlerConnector.FormName=Form name/id/action
-WebcrawlerConnector.LinkTarget=Link target
-WebcrawlerConnector.RedirectionTo=Redirection to
-WebcrawlerConnector.PageContent=Page content
-WebcrawlerConnector.AddSessionAuthenticationUrlRegularExpression=Add session authentication url regular expression
-WebcrawlerConnector.DeleteTrustUrlRegularExpression=Delete trust url regular expression #
-WebcrawlerConnector.EmailAddress=Email address:
-WebcrawlerConnector.RobotsUsage=Robots usage:
-WebcrawlerConnector.BandwidthThrottling=Bandwidth throttling:
-WebcrawlerConnector.NoBandwidthThrottling=No bandwidth throttling
-WebcrawlerConnector.SeedsColon=Seeds:
-WebcrawlerConnector.Canonicalization=Canonicalization
-WebcrawlerConnector.Inclusions=Inclusions
-WebcrawlerConnector.Exclusions=Exclusions
-WebcrawlerConnector.Security=Security
-WebcrawlerConnector.FoundAnIllegalRegularExpressionIn=Found an illegal regular expression in
-WebcrawlerConnector.ErrorWas=Error was: 
-WebcrawlerConnector.TypeInAnAccessToken=Type in an access token
-WebcrawlerConnector.TypeInMetadataName=Type in metadata name
-WebcrawlerConnector.TypeInMetadataValue=Type in metadata value
-WebcrawlerConnector.InvalidUrlsInSeedsList=Invalid URLs in seeds list:
-WebcrawlerConnector.yes=yes
-WebcrawlerConnector.no=no
-WebcrawlerConnector.ExcludedHeadersColon=Excluded headers:
-WebcrawlerConnector.URLMappings=URL Mappings
-WebcrawlerConnector.RemoveRegexp=Remove regular expression #
-WebcrawlerConnector.AddRegexp=Add regular expression
-WebcrawlerConnector.Remove=Remove
-WebcrawlerConnector.NoMappingsSpecifiedWillAcceptAllUrls=No mappings specified; will accept all URLs
-WebcrawlerConnector.URLMappingsColon=URL mappings:
-WebcrawlerConnector.MatchMustHaveARegexpValue=Match must have a regexp value
diff --git a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_es_ES.properties b/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_es_ES.properties
deleted file mode 100644
index 82fb299..0000000
--- a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_es_ES.properties
+++ /dev/null
@@ -1,158 +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.
-
-WebcrawlerConnector.Email=Email
-WebcrawlerConnector.Robots=Robots
-WebcrawlerConnector.Bandwidth=Ancho de banda
-WebcrawlerConnector.AccessCredentials=Credenciales de acceso
-WebcrawlerConnector.Certificates=Certificados
-WebcrawlerConnector.Proxy=Proxy
-WebcrawlerConnector.ProxyHostColon=host Proxy:
-WebcrawlerConnector.ProxyPortColon=Puerto de proxy:
-WebcrawlerConnector.ProxyAuthenticationDomainColon=Dominio de autenticación proxy:
-WebcrawlerConnector.ProxyAuthenticationUserNameColon=Nombre de usuario de autenticación proxy:
-WebcrawlerConnector.ProxyAuthenticationPasswordColon=Contraseña de autenticación proxy:
-WebcrawlerConnector.EmailAddressToContact=Dirección de correo electrónico para ponerse en contacto:
-WebcrawlerConnector.RobotsTxtUsage=uso robots.txtV:
-WebcrawlerConnector.DontLookAtRobotsTxt=No mire robots.txt
-WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly=Obedecer robots.txt para datos obtiene solamente
-WebcrawlerConnector.ObeyRobotsTxtForAllFetches=Obedecer robots.txt para todas las recuperaciones
-WebcrawlerConnector.MetaRobotsTagsUsage=Meta robots tags usage:
-WebcrawlerConnector.DontLookAtMetaRobotsTags=Don't look at meta robots tags
-WebcrawlerConnector.ObeyMetaRobotsTags=Obey meta robots tags
-WebcrawlerConnector.Throttles=aceleradores:
-WebcrawlerConnector.BinRegularExpression=Expresión regular Bin
-WebcrawlerConnector.CaseInsensitive=mayúsculas y minúsculas?
-WebcrawlerConnector.MaxConnections=conexiones Max
-WebcrawlerConnector.MaxKbytesSec=Max Kbytes / seg
-WebcrawlerConnector.MaxFetchesMin=Max obtiene / min
-WebcrawlerConnector.Delete=Delete
-WebcrawlerConnector.DeleteBinRegularExpression=Eliminar expresión regular bin #
-WebcrawlerConnector.Add=Añadir
-WebcrawlerConnector.AddBinRegularExpression=Añadir expresión regular bin
-WebcrawlerConnector.PageAccessCredentials=Credenciales de acceso a la página:
-WebcrawlerConnector.URLRegularExpression=Expresión regular de URL
-WebcrawlerConnector.AddPageAuthenticationUrlRegularExpression=Añadir página de autenticación url expresión regular
-WebcrawlerConnector.CredentialType=tipo de Credencial
-WebcrawlerConnector.CredentialDomain=dominio de credenciales
-WebcrawlerConnector.UserName=Nombre de usuario
-WebcrawlerConnector.NoPageAccessCredentials=Sin credenciales de acceso a la página
-WebcrawlerConnector.SessionBasedAccessCredentials=Sesión-credenciales de acceso basados:
-WebcrawlerConnector.LoginPages=páginas Iniciar sesión
-WebcrawlerConnector.LoginURLRegularExpression=Expresión regular Ingresar URL
-WebcrawlerConnector.PageType=tipo de Página
-WebcrawlerConnector.FormNamelinkTargetRegularExpression=Expresión regular identificación
-WebcrawlerConnector.OverrideFormParameters=Parámetros de forma de anulación
-WebcrawlerConnector.OverrideTargetURL=URL de destino de anulación
-WebcrawlerConnector.NoLoginPagesSpecified=Ninguna página de inicio de sesión especificado
-WebcrawlerConnector.NoSessionBasedAccessCredentials=Ninguna sesión-credenciales de acceso basados
-WebcrawlerConnector.TrustCertificates=certificados fiduciarios:
-WebcrawlerConnector.Certificate=Certificado
-WebcrawlerConnector.TrustEverything=La confianza de todo
-WebcrawlerConnector.NoTrustCertificates=No hay certificados de confianza
-WebcrawlerConnector.Description=Descripción
-WebcrawlerConnector.Reorder=reordenar?
-WebcrawlerConnector.RemoveJSPSessions=Retire sesiones JSP?
-WebcrawlerConnector.RemoveASPSessions=Retire sesiones ASP?
-WebcrawlerConnector.RemovePHPSessions=Retire las sesiones de PHP?
-WebcrawlerConnector.RemoveBVSessions=Retire sesiones BV?
-WebcrawlerConnector.DeleteUrlRegexp2=Eliminar regexp url
-WebcrawlerConnector.NoCanonicalizationSpecified=No canonicalización especificada - todas las direcciones URL se reordenan y se han eliminado todas las sesiones
-WebcrawlerConnector.AddUrlRegexp=Añadir regexp url
-WebcrawlerConnector.IncludeInCrawl=Incluir en rastreo:
-WebcrawlerConnector.IncludeInIndex=Incluir en el índice:
-WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds=Incluya sólo los hosts que emparejan semillas?
-WebcrawlerConnector.ExcludeFromCrawl=Excluir de rastreo:
-WebcrawlerConnector.ExcludeFromIndex=Excluir del índice:
-WebcrawlerConnector.ExcludeContentFromIndex=Excluir contenido del índice:
-WebcrawlerConnector.DeleteToken=eliminar símbolo #
-WebcrawlerConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-WebcrawlerConnector.AddAccessToken=Añadir token de acceso
-WebcrawlerConnector.DeleteMetadata=eliminar metadatos #
-WebcrawlerConnector.NoMetadataPresent=Sin metadatos presente
-WebcrawlerConnector.AddMetadata=Añadir metadatos
-WebcrawlerConnector.Seeds=Semillas:
-WebcrawlerConnector.URLCanonicalization=canonicalización URL:
-WebcrawlerConnector.URLRegexp=URL regexp
-WebcrawlerConnector.AccessTokens=tokens de acceso:
-WebcrawlerConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-WebcrawlerConnector.Metadata=metadatos:
-WebcrawlerConnector.NoMetadataSpecified=Sin metadatos especificada
-WebcrawlerConnector.BasicAuthentication=autenticación básica
-WebcrawlerConnector.NTLMAuthentication=Autenticación NTLM
-WebcrawlerConnector.UploadCertificate=Cargue certificado:
-WebcrawlerConnector.DeletePageAuthenticationUrlRegularExpression=Eliminar página de autenticación url expresión regular #
-WebcrawlerConnector.DeleteSessionAuthenticationUrlRegularExpression=Eliminar sesión de autenticación url expresión regular #
-WebcrawlerConnector.NoTrustCertificatesSpecified=No hay certificados de confianza especificados
-WebcrawlerConnector.AddUrlRegularExpressionForTruststore=Añadir expresión regular url para almacén de confianza
-WebcrawlerConnector.NoSessionBasedAccessCredentialsSpecified=Ninguna sesión-credenciales de acceso basados especifican
-WebcrawlerConnector.NoPageAccessCredentialsSpecified=Sin credenciales de acceso a la página especifican
-WebcrawlerConnector.NoFormParametersSpecified=No override form parameters specified
-WebcrawlerConnector.AuthenticationType=Tipo de autenticación
-WebcrawlerConnector.Domain=Dominio
-WebcrawlerConnector.Password=Contraseña
-WebcrawlerConnector.EmailAaddressRequired=Dirección de correo electrónico requerida, que se incluirá en todos los encabezados de solicitud
-WebcrawlerConnector.MaximumConnectionsMustBeAnInteger=Conexiones máximas deben ser un número entero
-WebcrawlerConnector.NeedAValidEmailAddress=Necesitas una dirección de correo electrónico válida
-WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger=Kbytes máximos por segundo debe ser un número entero
-WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger=Recuperaciones máximas por minuto debe ser un número entero
-WebcrawlerConnector.CredentialMustHaveNonNullUserName=Credencial debe tener el nombre de usuario no nulo
-WebcrawlerConnector.MatchExpressionMustBeAValidRegularExpression=Expresión Partido debe ser una expresión regular válida
-WebcrawlerConnector.ParameterMustHaveNonEmptyName=Parámetro debe tener no-nombre vacío
-WebcrawlerConnector.ParameterCanEitherBeHidden=Parámetro tampoco se puede ocultar o no, pero no pueden ser a la vez
-WebcrawlerConnector.AValidRegularExpressionIsRequired=Se requiere una expresión regular válida
-WebcrawlerConnector.CredentialMustIncludeANonNullUserName=Credencial debe incluir un no-Nombre de usuario nula
-WebcrawlerConnector.ParameterNameMustBeARegularExpression=Nombre del parámetro debe ser una expresión regular
-WebcrawlerConnector.SpecifyATrustCertificateFileToUploadFirst=Especifique un archivo de certificado de confianza para subir primero, o compruebe 'La confianza de todo'
-WebcrawlerConnector.NoBandwidthOrConnectionThrottlingSpecified=No ancho de banda o la conexión de estrangulamiento especificado
-WebcrawlerConnector.DeleteLoginPage=Eliminar la página de inicio de sesión #
-WebcrawlerConnector.ParameterRegularExpression=Expresión regular Parámetro
-WebcrawlerConnector.Value=Valor
-WebcrawlerConnector.DeleteParameter=eliminar parámetro #
-WebcrawlerConnector.ForLoginPage= para la página de inicio de sesión #
-WebcrawlerConnector.ForCredential= para credenciales #
-WebcrawlerConnector.AddParameterToLoginPage=Añadir parámetro a la página iniciar sesión #
-WebcrawlerConnector.AddLoginPageToCredential=Añadir página de acceso a la credencial #
-WebcrawlerConnector.FormName=Nombre del formulario/id/acción
-WebcrawlerConnector.LinkTarget=objetivo Enlace
-WebcrawlerConnector.RedirectionTo=La redirección de
-WebcrawlerConnector.PageContent=contenido de la página
-WebcrawlerConnector.AddSessionAuthenticationUrlRegularExpression=Agregar sesión de autenticación url expresión regular
-WebcrawlerConnector.DeleteTrustUrlRegularExpression=Eliminar la confianza url expresión regular #
-WebcrawlerConnector.EmailAddress=Dirección de correo electrónico:
-WebcrawlerConnector.RobotsUsage=uso de Robots:
-WebcrawlerConnector.BandwidthThrottling=del ancho de banda:
-WebcrawlerConnector.NoBandwidthThrottling=No del ancho de banda
-WebcrawlerConnector.SeedsColon=Semillas:
-WebcrawlerConnector.Canonicalization=canonicalización
-WebcrawlerConnector.Inclusions=inclusiones
-WebcrawlerConnector.Exclusions=Exclusiones
-WebcrawlerConnector.Security=Seguridad
-WebcrawlerConnector.FoundAnIllegalRegularExpressionIn=Encontró un expresión regular ilegal en
-WebcrawlerConnector.ErrorWas=Error era: 
-WebcrawlerConnector.TypeInAnAccessToken=Escriba un token de acceso
-WebcrawlerConnector.TypeInMetadataName=Escriba el nombre de metadatos
-WebcrawlerConnector.TypeInMetadataValue=Tipo de valor metadatos
-WebcrawlerConnector.InvalidUrlsInSeedsList=URL no válidos en la lista de semillas:
-WebcrawlerConnector.yes=si
-WebcrawlerConnector.no=no
-WebcrawlerConnector.ExcludedHeadersColon=cabeceras excluidos:
-WebcrawlerConnector.URLMappings=URL Asignaciones
-WebcrawlerConnector.RemoveRegexp=Retire expresión regular #
-WebcrawlerConnector.AddRegexp=Añadir expresión regular
-WebcrawlerConnector.Remove=Eliminar
-WebcrawlerConnector.NoMappingsSpecifiedWillAcceptAllUrls=Ningún trazar un mapa de especificado; aceptará todas las URL
-WebcrawlerConnector.URLMappingsColon=URL trazar un mapa:
-WebcrawlerConnector.MatchMustHaveARegexpValue=Partido debe tener un valor de expresiones regulares
diff --git a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_ja_JP.properties b/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_ja_JP.properties
deleted file mode 100644
index c86ba2c..0000000
--- a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_ja_JP.properties
+++ /dev/null
@@ -1,158 +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.
-
-WebcrawlerConnector.Email=メール
-WebcrawlerConnector.Robots=ロボット
-WebcrawlerConnector.Bandwidth=バンド幅
-WebcrawlerConnector.AccessCredentials=アクセス証明
-WebcrawlerConnector.Certificates=証明証
-WebcrawlerConnector.Proxy=プロキシ
-WebcrawlerConnector.ProxyHostColon=プロキシホスト:
-WebcrawlerConnector.ProxyPortColon=プロキシポート:
-WebcrawlerConnector.ProxyAuthenticationDomainColon=プロキシ認証ドメイン:
-WebcrawlerConnector.ProxyAuthenticationUserNameColon=プロキシ認証ユーザ名:
-WebcrawlerConnector.ProxyAuthenticationPasswordColon=プロキシ認証パスワード:
-WebcrawlerConnector.EmailAddressToContact=連絡先メールアドレス:
-WebcrawlerConnector.RobotsTxtUsage=Robots.txt:
-WebcrawlerConnector.DontLookAtRobotsTxt=robots.txtを利用しない
-WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly=データ取得の場合のみにrobots.txtに従う
-WebcrawlerConnector.ObeyRobotsTxtForAllFetches=すべてrobots.txtに従う
-WebcrawlerConnector.MetaRobotsTagsUsage=Meta robots tags usage:
-WebcrawlerConnector.DontLookAtMetaRobotsTags=Don't look at meta robots tags
-WebcrawlerConnector.ObeyMetaRobotsTags=Obey meta robots tags
-WebcrawlerConnector.Throttles=スロットル:
-WebcrawlerConnector.BinRegularExpression=Bin正規表現
-WebcrawlerConnector.CaseInsensitive=大/小文字を区別しない
-WebcrawlerConnector.MaxConnections=最大コネクション数
-WebcrawlerConnector.MaxKbytesSec=最大Kbytes/秒
-WebcrawlerConnector.MaxFetchesMin=最大フェッチ/分
-WebcrawlerConnector.Delete=削除
-WebcrawlerConnector.DeleteBinRegularExpression=bin正規表現を削除 #
-WebcrawlerConnector.Add=追加
-WebcrawlerConnector.AddBinRegularExpression=bin正規表現を追加
-WebcrawlerConnector.PageAccessCredentials=ページをアクセスするサーティフィケート:
-WebcrawlerConnector.URLRegularExpression=URL正規表現
-WebcrawlerConnector.AddPageAuthenticationUrlRegularExpression=ページ認証URL正規表現を追加
-WebcrawlerConnector.CredentialType=サーティフィケートタイプ
-WebcrawlerConnector.CredentialDomain=サーティフィケートドメイン
-WebcrawlerConnector.UserName=ユーザ名
-WebcrawlerConnector.NoPageAccessCredentials=ページアクセスサーティフィケートがありません
-WebcrawlerConnector.SessionBasedAccessCredentials=セッションベースアクセスサーティフィケート:
-WebcrawlerConnector.LoginPages=ログインページ
-WebcrawlerConnector.LoginURLRegularExpression=ログインURL正規表現
-WebcrawlerConnector.PageType=ページタイプ
-WebcrawlerConnector.FormNamelinkTargetRegularExpression=フォーム名/リンクターゲット正規表現
-WebcrawlerConnector.OverrideFormParameters=フォーム引数をオーバーライド
-WebcrawlerConnector.OverrideTargetURL=Override target URL
-WebcrawlerConnector.NoLoginPagesSpecified=ログインページが指定されていません
-WebcrawlerConnector.NoSessionBasedAccessCredentials=セッションベースアクセスサーティフィケートがありません
-WebcrawlerConnector.TrustCertificates=トラストサーティフィケート:
-WebcrawlerConnector.Certificate=サーティフィケート
-WebcrawlerConnector.TrustEverything=すべて信用する
-WebcrawlerConnector.NoTrustCertificates=トラストサーティフィケートがありません
-WebcrawlerConnector.Description=説明
-WebcrawlerConnector.Reorder=ソート
-WebcrawlerConnector.RemoveJSPSessions=JSPセッションを削除
-WebcrawlerConnector.RemoveASPSessions=ASPセッションを削除
-WebcrawlerConnector.RemovePHPSessions=PHPセッションを削除
-WebcrawlerConnector.RemoveBVSessions=VBセッションを削除
-WebcrawlerConnector.DeleteUrlRegexp2=URL正規表現を削除
-WebcrawlerConnector.NoCanonicalizationSpecified=正規化が指定されていません - すべてのURLはソートされ、セッションは除外されます
-WebcrawlerConnector.AddUrlRegexp=URL正規表現に追加
-WebcrawlerConnector.IncludeInCrawl=クロールに含める:
-WebcrawlerConnector.IncludeInIndex=索引に含める:
-WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds=シードと一致するホストのみ対象にする
-WebcrawlerConnector.ExcludeFromCrawl=クロールから除外:
-WebcrawlerConnector.ExcludeFromIndex=索引が除外:
-WebcrawlerConnector.DeleteToken=トークンを削除 #
-WebcrawlerConnector.ExcludeContentFromIndex=Exclude content from index:
-WebcrawlerConnector.NoAccessTokensPresent=アクセストークンがありません
-WebcrawlerConnector.AddAccessToken=アクセストークンを追加
-WebcrawlerConnector.DeleteMetadata=メタデータを削除 #
-WebcrawlerConnector.NoMetadataPresent=メタデータがありません
-WebcrawlerConnector.AddMetadata=メタデータを追加
-WebcrawlerConnector.SeedsColon=シード:
-WebcrawlerConnector.URLCanonicalization=URL正規化:
-WebcrawlerConnector.URLRegexp=URL正規表現
-WebcrawlerConnector.AccessTokens=アクセストークン:
-WebcrawlerConnector.NoAccessTokensSpecified=アクセストークンが指定されていません
-WebcrawlerConnector.Metadata=メタデータ:
-WebcrawlerConnector.NoMetadataSpecified=メタデータが指定されていません
-WebcrawlerConnector.BasicAuthentication=Basic認証
-WebcrawlerConnector.NTLMAuthentication=NTLM認証
-WebcrawlerConnector.UploadCertificate=サーティフィケートをアップロード:
-WebcrawlerConnector.DeletePageAuthenticationUrlRegularExpression=ページ認証URL正規表現を削除 #
-WebcrawlerConnector.DeleteSessionAuthenticationUrlRegularExpression=セッション認証URL正規表現を削除 #
-WebcrawlerConnector.NoTrustCertificatesSpecified=トラストサーティフィケートが指定されていません
-WebcrawlerConnector.AddUrlRegularExpressionForTruststore=トラストストアのURL正規表現を追加
-WebcrawlerConnector.NoSessionBasedAccessCredentialsSpecified=セッションバースアクセス認証の指定がありません
-WebcrawlerConnector.NoPageAccessCredentialsSpecified=ページアクセス認証の指定がありません
-WebcrawlerConnector.NoFormParametersSpecified=No override form parameters specified
-WebcrawlerConnector.AuthenticationType=認証タイプ
-WebcrawlerConnector.Domain=ドメイン
-WebcrawlerConnector.Password=パスワード
-WebcrawlerConnector.EmailAaddressRequired=メールアドレスを入力してください。すべてのリクエストヘッダに含まれます
-WebcrawlerConnector.MaximumConnectionsMustBeAnInteger=最大接続数には整数を入力してください
-WebcrawlerConnector.NeedAValidEmailAddress=正しいメールアドレスを入力してください
-WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger=最大KB/秒には整数を入力してください
-WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger=最大収集/分には整数を入力してください
-WebcrawlerConnector.CredentialMustHaveNonNullUserName=証明書のユーザ名はnullではなりません
-WebcrawlerConnector.MatchExpressionMustBeAValidRegularExpression=パターンには正規表現式を入力してください
-WebcrawlerConnector.ParameterMustHaveNonEmptyName=引数の名前を入力してください
-WebcrawlerConnector.ParameterCanEitherBeHidden=引数はhidden又は表示を選択してください。両方は選択できません
-WebcrawlerConnector.AValidRegularExpressionIsRequired=正しい正規表現を入力してください
-WebcrawlerConnector.CredentialMustIncludeANonNullUserName=証明書にはnull以外のユーザ名が必要です
-WebcrawlerConnector.ParameterNameMustBeARegularExpression=引数名は正規表現で指定してください
-WebcrawlerConnector.SpecifyATrustCertificateFileToUploadFirst=アップロードする信用した証明書を指定するか「すべてを信用」をチェックしてください'
-WebcrawlerConnector.NoBandwidthOrConnectionThrottlingSpecified=バンド幅及びコネクションスロットリングが指定されていません
-WebcrawlerConnector.DeleteLoginPage=ログインページを削除: #
-WebcrawlerConnector.ParameterRegularExpression=引数正規表現
-WebcrawlerConnector.Value=値
-WebcrawlerConnector.DeleteParameter=引数を削除: #
-WebcrawlerConnector.ForLoginPage= ログインページ #
-WebcrawlerConnector.ForCredential= 認証 #
-WebcrawlerConnector.AddParameterToLoginPage=ログインページに引数を追加 #
-WebcrawlerConnector.AddLoginPageToCredential=認証にログインページを追加: #
-WebcrawlerConnector.FormName=フォーム名
-WebcrawlerConnector.LinkTarget=リンクターゲット
-WebcrawlerConnector.RedirectionTo=リダイレクション
-WebcrawlerConnector.PageContent=Page content
-WebcrawlerConnector.AddSessionAuthenticationUrlRegularExpression=セッション認証URI正規表現
-WebcrawlerConnector.DeleteTrustUrlRegularExpression=信用URI正規表現式を削除: #
-WebcrawlerConnector.EmailAddress=メールアドレス:
-WebcrawlerConnector.RobotsUsage=Robots利用:
-WebcrawlerConnector.BandwidthThrottling=バンド幅スロットリング:
-WebcrawlerConnector.NoBandwidthThrottling=バンド幅スロットリングなし
-WebcrawlerConnector.Seeds=シード
-WebcrawlerConnector.Canonicalization=正規化
-WebcrawlerConnector.Inclusions=含む
-WebcrawlerConnector.Exclusions=除外
-WebcrawlerConnector.Security=セキュリティ
-WebcrawlerConnector.FoundAnIllegalRegularExpressionIn=不正な正規表現式
-WebcrawlerConnector.ErrorWas=エラー: 
-WebcrawlerConnector.TypeInAnAccessToken=アクセストークンの入力
-WebcrawlerConnector.TypeInMetadataName=メタデータ名の入力
-WebcrawlerConnector.TypeInMetadataValue=メタデータ値の入力
-WebcrawlerConnector.InvalidUrlsInSeedsList=シードリスト内の無効なURL:
-WebcrawlerConnector.yes=はい
-WebcrawlerConnector.no=いいえ
-WebcrawlerConnector.ExcludedHeadersColon=除外ヘッダ:
-WebcrawlerConnector.URLMappings=URLマッピング
-WebcrawlerConnector.RemoveRegexp=正規表現を削除 #
-WebcrawlerConnector.AddRegexp=正規表現を追加
-WebcrawlerConnector.Remove=削除
-WebcrawlerConnector.NoMappingsSpecifiedWillAcceptAllUrls=マップが指定されていません。すべてのURLを収集します
-WebcrawlerConnector.URLMappingsColon=URLマッピング:
-WebcrawlerConnector.MatchMustHaveARegexpValue=パターンは正規表現を入力してください
diff --git a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_zh_CN.properties b/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_zh_CN.properties
deleted file mode 100644
index 55c4930..0000000
--- a/connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/webcrawler/common_zh_CN.properties
+++ /dev/null
@@ -1,158 +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.
-
-WebcrawlerConnector.Email=邮件
-WebcrawlerConnector.Robots=机器人
-WebcrawlerConnector.Bandwidth=带宽
-WebcrawlerConnector.AccessCredentials=访问凭证
-WebcrawlerConnector.Certificates=证书
-WebcrawlerConnector.Proxy=代理
-WebcrawlerConnector.ProxyHostColon=代理主机: 
-WebcrawlerConnector.ProxyPortColon=代理端口: 
-WebcrawlerConnector.ProxyAuthenticationDomainColon=代理认证域: 
-WebcrawlerConnector.ProxyAuthenticationUserNameColon=代理认证用户名: 
-WebcrawlerConnector.ProxyAuthenticationPasswordColon=代理认证密码: 
-WebcrawlerConnector.EmailAddressToContact=邮箱联系地址: 
-WebcrawlerConnector.RobotsTxtUsage=使用Robots.txt: 
-WebcrawlerConnector.DontLookAtRobotsTxt=不使用robots.txt
-WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly=只在提取数据时服从robots.txt
-WebcrawlerConnector.ObeyRobotsTxtForAllFetches=每次提取均服从robots.txt
-WebcrawlerConnector.MetaRobotsTagsUsage=Meta robots tags usage:
-WebcrawlerConnector.DontLookAtMetaRobotsTags=Don't look at meta robots tags
-WebcrawlerConnector.ObeyMetaRobotsTags=Obey meta robots tags
-WebcrawlerConnector.Throttles=限流器: 
-WebcrawlerConnector.BinRegularExpression=Bin正则表达式
-WebcrawlerConnector.CaseInsensitive=不区分大小写
-WebcrawlerConnector.MaxConnections=最大连接数
-WebcrawlerConnector.MaxKbytesSec=最大Kbytes/秒
-WebcrawlerConnector.MaxFetchesMin=最大提取数/分
-WebcrawlerConnector.Delete=删除
-WebcrawlerConnector.DeleteBinRegularExpression=删除bin正则表达式 #
-WebcrawlerConnector.Add=添加
-WebcrawlerConnector.AddBinRegularExpression=添加bin正则表达式
-WebcrawlerConnector.PageAccessCredentials=页面访问凭证: 
-WebcrawlerConnector.URLRegularExpression=URL正则表达式
-WebcrawlerConnector.AddPageAuthenticationUrlRegularExpression=添加页面认证URL正则表达式
-WebcrawlerConnector.CredentialType=凭证类型
-WebcrawlerConnector.CredentialDomain=凭证域
-WebcrawlerConnector.UserName=用户名
-WebcrawlerConnector.NoPageAccessCredentials=无页面访问凭证
-WebcrawlerConnector.SessionBasedAccessCredentials=基于会话的访问凭证: 
-WebcrawlerConnector.LoginPages=登录页面
-WebcrawlerConnector.LoginURLRegularExpression=登录URL正则表达式
-WebcrawlerConnector.PageType=页面类型
-WebcrawlerConnector.FormNamelinkTargetRegularExpression=表单名/链接目标正则表达式
-WebcrawlerConnector.OverrideFormParameters=覆盖表单参数
-WebcrawlerConnector.OverrideTargetURL=覆盖目标URL
-WebcrawlerConnector.NoLoginPagesSpecified=登录页面未指定
-WebcrawlerConnector.NoSessionBasedAccessCredentials=无基于会话的访问凭证
-WebcrawlerConnector.TrustCertificates=信任证书: 
-WebcrawlerConnector.Certificate=证书
-WebcrawlerConnector.TrustEverything=信任所有
-WebcrawlerConnector.NoTrustCertificates=无信任证书
-WebcrawlerConnector.Description=説明
-WebcrawlerConnector.Reorder=重排
-WebcrawlerConnector.RemoveJSPSessions=删除JSP会话
-WebcrawlerConnector.RemoveASPSessions=删除ASP会话
-WebcrawlerConnector.RemovePHPSessions=删除PHP会话
-WebcrawlerConnector.RemoveBVSessions=删除VB会话
-WebcrawlerConnector.DeleteUrlRegexp2=删除URL正则表达式
-WebcrawlerConnector.NoCanonicalizationSpecified=规范化未指定 - 所有URL将被重排,会话被排除
-WebcrawlerConnector.AddUrlRegexp=添加URL正则表达式
-WebcrawlerConnector.IncludeInCrawl=包含于爬虫内: 
-WebcrawlerConnector.IncludeInIndex=包含于索引内: 
-WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds=只包含和种子匹配的主机
-WebcrawlerConnector.ExcludeFromCrawl=排除于爬虫外: 
-WebcrawlerConnector.ExcludeFromIndex=排除于索引外: 
-WebcrawlerConnector.DeleteToken=删除令牌 #
-WebcrawlerConnector.ExcludeContentFromIndex=Exclude content from index:
-WebcrawlerConnector.NoAccessTokensPresent=访问令牌不存在
-WebcrawlerConnector.AddAccessToken=添加访问令牌
-WebcrawlerConnector.DeleteMetadata=删除元数据 #
-WebcrawlerConnector.NoMetadataPresent=元数据不存在
-WebcrawlerConnector.AddMetadata=添加元数据
-WebcrawlerConnector.SeedsColon=种子: 
-WebcrawlerConnector.URLCanonicalization=URL规范化: 
-WebcrawlerConnector.URLRegexp=URL正则表达式
-WebcrawlerConnector.AccessTokens=访问令牌: 
-WebcrawlerConnector.NoAccessTokensSpecified=访问令牌未指定
-WebcrawlerConnector.Metadata=元数据: 
-WebcrawlerConnector.NoMetadataSpecified=元数据未指定
-WebcrawlerConnector.BasicAuthentication=Basic认证
-WebcrawlerConnector.NTLMAuthentication=NTLM认证
-WebcrawlerConnector.UploadCertificate=上传证书: 
-WebcrawlerConnector.DeletePageAuthenticationUrlRegularExpression=删除页面认证URL正则表达式 #
-WebcrawlerConnector.DeleteSessionAuthenticationUrlRegularExpression=删除会话认证URL正则表达式 #
-WebcrawlerConnector.NoTrustCertificatesSpecified=信任证书未指定
-WebcrawlerConnector.AddUrlRegularExpressionForTruststore=添加URL正则表达式到信任存储区
-WebcrawlerConnector.NoSessionBasedAccessCredentialsSpecified=基于会话的访问凭证未指定
-WebcrawlerConnector.NoPageAccessCredentialsSpecified=页面访问凭证未指定
-WebcrawlerConnector.NoFormParametersSpecified=No override form parameters specified
-WebcrawlerConnector.AuthenticationType=认证类型
-WebcrawlerConnector.Domain=域
-WebcrawlerConnector.Password=密码
-WebcrawlerConnector.EmailAaddressRequired=请输入邮箱地址。它将包含在所有请求头中
-WebcrawlerConnector.MaximumConnectionsMustBeAnInteger=最大连接数需输入整数
-WebcrawlerConnector.NeedAValidEmailAddress=需输入有效的邮箱地址
-WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger=最大KB/秒需输入整数
-WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger=最大収集/分需输入整数
-WebcrawlerConnector.CredentialMustHaveNonNullUserName=凭证用户名不能为空
-WebcrawlerConnector.MatchExpressionMustBeAValidRegularExpression=匹配表达式需输入有效的正则表达式
-WebcrawlerConnector.ParameterMustHaveNonEmptyName=参数名不能为空
-WebcrawlerConnector.ParameterCanEitherBeHidden=参数可选择隐藏或显示。但不能同时选择
-WebcrawlerConnector.AValidRegularExpressionIsRequired=请输入有效正则表达式
-WebcrawlerConnector.CredentialMustIncludeANonNullUserName=凭证用户名不能为空
-WebcrawlerConnector.ParameterNameMustBeARegularExpression=参数名需输入正则表达式
-WebcrawlerConnector.SpecifyATrustCertificateFileToUploadFirst=请指定要上传的信任证书文件或选择“信任所有”
-WebcrawlerConnector.NoBandwidthOrConnectionThrottlingSpecified=带宽及连接限流未指定
-WebcrawlerConnector.DeleteLoginPage=删除登录页面:  #
-WebcrawlerConnector.ParameterRegularExpression=参数正则表达式
-WebcrawlerConnector.Value=值
-WebcrawlerConnector.DeleteParameter=删除参数:  #
-WebcrawlerConnector.ForLoginPage= 登录页面 #
-WebcrawlerConnector.ForCredential= 凭证 #
-WebcrawlerConnector.AddParameterToLoginPage=添加参数到登录页面 #
-WebcrawlerConnector.AddLoginPageToCredential=添加登录页面到凭证:  #
-WebcrawlerConnector.FormName=表单名
-WebcrawlerConnector.LinkTarget=链接目标
-WebcrawlerConnector.RedirectionTo=重定向到
-WebcrawlerConnector.PageContent=页面内容
-WebcrawlerConnector.AddSessionAuthenticationUrlRegularExpression=添加会话认证URI正则表达式
-WebcrawlerConnector.DeleteTrustUrlRegularExpression=删除信任URI正则表达式:  #
-WebcrawlerConnector.EmailAddress=邮箱地址: 
-WebcrawlerConnector.RobotsUsage=使用机器人: 
-WebcrawlerConnector.BandwidthThrottling=带宽限流: 
-WebcrawlerConnector.NoBandwidthThrottling=无带宽限流
-WebcrawlerConnector.Seeds=种子
-WebcrawlerConnector.Canonicalization=规范化
-WebcrawlerConnector.Inclusions=包含
-WebcrawlerConnector.Exclusions=排除
-WebcrawlerConnector.Security=安全
-WebcrawlerConnector.FoundAnIllegalRegularExpressionIn=非法正则表达式
-WebcrawlerConnector.ErrorWas=错误:  
-WebcrawlerConnector.TypeInAnAccessToken=输入访问令牌
-WebcrawlerConnector.TypeInMetadataName=输入元数据名
-WebcrawlerConnector.TypeInMetadataValue=输入元数据值
-WebcrawlerConnector.InvalidUrlsInSeedsList=种子列表包含无效URL: 
-WebcrawlerConnector.yes=是
-WebcrawlerConnector.no=否
-WebcrawlerConnector.ExcludedHeadersColon=被排除的头: 
-WebcrawlerConnector.URLMappings=URL映射
-WebcrawlerConnector.RemoveRegexp=删除正则表达式 #
-WebcrawlerConnector.AddRegexp=添加正则表达式
-WebcrawlerConnector.Remove=删除
-WebcrawlerConnector.NoMappingsSpecifiedWillAcceptAllUrls=映射未指定。搜集所有URL
-WebcrawlerConnector.URLMappingsColon=URL映射:
-WebcrawlerConnector.MatchMustHaveARegexpValue=匹配必须为正则表达式
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration.js.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration.js.vm
deleted file mode 100644
index eb47755..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration.js.vm
+++ /dev/null
@@ -1,326 +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.
-*#
-
-<script type="text/javascript">
-/* editConfiguration.js.vm (Web Connector) */
-function checkConfig()
-{
-  if (editconnection.email.value != "" && editconnection.email.value.indexOf("@") == -1)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.NeedAValidEmailAddress'))");
-    editconnection.email.focus();
-    return false;
-  }
-
-  // If the Bandwidth tab is up, check to be sure we have valid numbers and regexps everywhere.
-  var i = 0;
-  var count = editconnection.bandwidth_count.value;
-  while (i < count)
-  {
-    var connections = eval("editconnection.connections_bandwidth_"+i+".value");
-    if (connections != "" && !isInteger(connections))
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MaximumConnectionsMustBeAnInteger'))");
-      eval("editconnection.connections_bandwidth_"+i+".focus()");
-      return false;
-    }
-    var rate = eval("editconnection.rate_bandwidth_"+i+".value");
-    if (rate != "" && !isInteger(rate))
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger'))");
-      eval("editconnection.rate_bandwidth_"+i+".focus()");
-      return false;
-    }
-    var fetches = eval("editconnection.fetches_bandwidth_"+i+".value");
-    if (fetches != "" && !isInteger(fetches))
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger'))");
-      eval("editconnection.fetches_bandwidth_"+i+".focus()");
-      return false;
-    }
-
-    i = i + 1;
-  }
-    
-  // Make sure access credentials are all legal
-  i = 0;
-  count = editconnection.acredential_count.value;
-  while (i < count)
-  {
-    var username = eval("editconnection.username_acredential_"+i+".value");
-    if (username == "")
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.CredentialMustHaveNonNullUserName'))");
-      eval("editconnection.username_acredential_"+i+".focus()");
-      return false;
-    }
-    i = i + 1;
-  }
-
-  // Make sure session credentials are all legal
-  i = 0;
-  count = editconnection.scredential_count.value;
-  while (i < count)
-  {
-    var loginpagecount = eval("editconnection.scredential_"+i+"_loginpagecount.value");
-    var j = 0;
-    while (j < loginpagecount)
-    {
-      var matchregexp = eval("editconnection.scredential_"+i+"_"+j+"_matchregexp.value");
-      if (!isRegularExpression(matchregexp))
-      {
-        alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MatchExpressionMustBeAValidRegularExpression'))");
-        eval("editconnection.scredential_"+i+"_"+j+"_matchregexp.focus()");
-        return false;
-      }
-      if (eval("editconnection.scredential_"+i+"_"+j+"_type.value") == "form")
-      {
-        var paramcount = eval("editconnection.scredential_"+i+"_"+j+"_loginparamcount.value");
-        var k = 0;
-        while (k < paramcount)
-        {
-          var paramname = eval("editconnection.scredential_"+i+"_"+j+"_"+k+"_param.value");
-          if (paramname == "")
-          {
-            alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.ParameterMustHaveNonEmptyName'))");
-            eval("editconnection.scredential_"+i+"_"+j+"_"+k+"_param.focus()");
-            return false;
-          }
-          var paramvalue = eval("editconnection.scredential_"+i+"_"+j+"_"+k+"_value.value");
-          var parampassword = eval("editconnection.scredential_"+i+"_"+j+"_"+k+"_password.value");
-          if (paramvalue != "" && parampassword != "")
-          {
-            alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.ParameterCanEitherBeHidden'))");
-            eval("editconnection.scredential_"+i+"_"+j+"_"+k+"_value.focus()");
-            return false;
-          }
-          k = k + 1;
-        }
-      }
-      j = j + 1;
-    }
-    i = i + 1;
-  }
-  return true;
-}
-
-function checkConfigForSave()
-{
-  if (editconnection.email.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.EmailAaddressRequired'))");
-    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.Email'))");
-    editconnection.email.focus();
-    return false;
-  }
-  return true;
-}
-
-function deleteRegexp(i)
-{
-  // Set the operation
-  eval("editconnection.op_bandwidth_"+i+".value=\"Delete\"");
-  // Submit
-  if (editconnection.bandwidth_count.value==i)
-    postFormSetAnchor("bandwidth");
-  else
-    postFormSetAnchor("bandwidth_"+i)
-  // Undo, so we won't get two deletes next time
-  eval("editconnection.op_bandwidth_"+i+".value=\"Continue\"");
-}
-
-function addRegexp()
-{
-  if (editconnection.connections_bandwidth.value != "" && !isInteger(editconnection.connections_bandwidth.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MaximumConnectionsMustBeAnInteger'))");
-    editconnection.connections_bandwidth.focus();
-    return;
-  }
-  if (editconnection.rate_bandwidth.value != "" && !isInteger(editconnection.rate_bandwidth.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger'))");
-    editconnection.rate_bandwidth.focus();
-    return;
-  }
-  if (editconnection.fetches_bandwidth.value != "" && !isInteger(editconnection.fetches_bandwidth.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger'))");
-    editconnection.fetches_bandwidth.focus();
-    return;
-  }
-  if (!isRegularExpression(editconnection.regexp_bandwidth.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.AValidRegularExpressionIsRequired'))");
-    editconnection.regexp_bandwidth.focus();
-    return;
-  }
-  editconnection.bandwidth_op.value="Add";
-  postFormSetAnchor("bandwidth");
-}
-
-function deleteARegexp(i)
-{
-  // Set the operation
-  eval("editconnection.op_acredential_"+i+".value=\"Delete\"");
-  // Submit
-  if (editconnection.acredential_count.value==i)
-    postFormSetAnchor("acredential");
-  else
-    postFormSetAnchor("acredential_"+i)
-  // Undo, so we won't get two deletes next time
-  eval("editconnection.op_acredential_"+i+".value=\"Continue\"");
-}
-
-function addARegexp()
-{
-  if (editconnection.username_acredential.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.CredentialMustIncludeANonNullUserName'))");
-    editconnection.username_acredential.focus();
-    return;
-  }
-  if (!isRegularExpression(editconnection.regexp_acredential.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.AValidRegularExpressionIsRequired'))");
-    editconnection.regexp_acredential.focus();
-    return;
-  }
-  editconnection.acredential_op.value="Add";
-  postFormSetAnchor("acredential");
-}
-
-function deleteSRegexp(i)
-{
-  // Set the operation
-  eval("editconnection.scredential_"+i+"_op.value=\"Delete\"");
-  // Submit
-  if (editconnection.scredential_count.value==i)
-    postFormSetAnchor("scredential");
-  else
-    postFormSetAnchor("scredential_"+i)
-  // Undo, so we won't get two deletes next time
-  eval("editconnection.scredential_"+i+"_op.value=\"Continue\"");
-}
-
-function addSRegexp()
-{
-  if (!isRegularExpression(editconnection.scredential_regexp.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.AValidRegularExpressionIsRequired'))");
-    editconnection.scredential_regexp.focus();
-    return;
-  }
-  editconnection.scredential_op.value="Add";
-  postFormSetAnchor("scredential");
-}
-
-function deleteLoginPage(credential,loginpage)
-{
-  // Set the operation
-  eval("editconnection.scredential_"+credential+"_"+loginpage+"_op.value=\"Delete\"");
-  // Submit
-  if (eval("editconnection.scredential_"+credential+"_loginpagecount.value")==credential)
-    postFormSetAnchor("scredential_loginpage");
-  else
-    postFormSetAnchor("scredential_"+credential+"_"+loginpage)
-  // Undo, so we won't get two deletes next time
-  eval("editconnection.scredential_"+credential+"_"+loginpage+"_op.value=\"Continue\"");
-
-}
-  
-function addLoginPage(credential)
-{
-  if (!isRegularExpression(eval("editconnection.scredential_"+credential+"_loginpageregexp.value")))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.AValidRegularExpressionIsRequired'))");
-    eval("editconnection.scredential_"+credential+"_loginpageregexp.focus()");
-    return;
-  }
-  if (!isRegularExpression(eval("editconnection.scredential_"+credential+"_loginpagematchregexp.value")))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.AValidRegularExpressionIsRequired'))");
-    eval("editconnection.scredential_"+credential+"_loginpagematchregexp.focus()");
-    return;
-  }
-  eval("editconnection.scredential_"+credential+"_loginpageop.value=\"Add\"");
-  postFormSetAnchor("scredential_"+credential);
-}
-  
-function deleteLoginPageParameter(credential,loginpage,parameter)
-{
-  // Set the operation
-  eval("editconnection.scredential_"+credential+"_"+loginpage+"_"+parameter+"_op.value=\"Delete\"");
-  // Submit
-  if (eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparamcount.value")==credential)
-    postFormSetAnchor("scredential_"+credential+"_loginparam");
-  else
-    postFormSetAnchor("scredential_"+credential+"_"+loginpage+"_"+parameter)
-  // Undo, so we won't get two deletes next time
-  eval("editconnection.scredential_"+credential+"_"+loginpage+"_"+parameter+"_op.value=\"Continue\"");
-}
-  
-function addLoginPageParameter(credential,loginpage)
-{
-  if (!isRegularExpression(eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparamname.value")))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.ParameterNameMustBeARegularExpression'))");
-    eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparamname.focus()");
-    return;
-  }
-  if (eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparamvalue.value") != "" && eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparampassword.value") != "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.ParameterCanEitherBeHidden'))");
-    eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparamvalue.focus()");
-    return;
-  }
-  eval("editconnection.scredential_"+credential+"_"+loginpage+"_loginparamop.value=\"Add\"");
-  postFormSetAnchor("scredential_"+credential+"_"+loginpage);
-}
-  
-function deleteTRegexp(i)
-{
-  // Set the operation
-  eval("editconnection.op_trust_"+i+".value=\"Delete\"");
-  // Submit
-  if (editconnection.trust_count.value==i)
-    postFormSetAnchor("trust");
-  else
-    postFormSetAnchor("trust_"+i);
-  // Undo, so we won't get two deletes next time
-  eval("editconnection.op_trust_"+i+".value=\"Continue\"");
-}
-
-function addTRegexp()
-{
-  if (editconnection.certificate_trust.value == "" && editconnection.all_trust.checked == false)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.SpecifyATrustCertificateFileToUploadFirst'))");
-    editconnection.certificate_trust.focus();
-    return;
-  }
-  if (!isRegularExpression(editconnection.regexp_trust.value))
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.AValidRegularExpressionIsRequired'))");
-    editconnection.regexp_trust.focus();
-    return;
-  }
-  editconnection.trust_op.value="Add";
-  postFormSetAnchor("trust");
-}
-</script>
-
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Access.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Access.html.vm
deleted file mode 100644
index 5acbed5..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Access.html.vm
+++ /dev/null
@@ -1,395 +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.
-*#
-
-#set( $COUNTER = 0)
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.AccessCredentials'))
-<script type="text/javascript">
-  $(function(){
-      $('#accordion-session-access .btn-danger').hover(function(){
-        $(this).closest('.panel').removeClass('panel-default').addClass('panel-danger');
-      },function(){
-        $(this).closest('.panel').removeClass('panel-danger').addClass('panel-default');
-      });
-
-      $('.collapse').on('shown.bs.collapse', function () {
-        var collapseId = $(this).attr("id");
-        if(window.sessionStorage){
-          sessionStorage.setItem("webcrawler_session_collapse",collapseId)
-        }
-      })
-
-      //if post-back, open the same collapse
-      if(window.sessionStorage){
-        if(sessionStorage.getItem("webcrawler_session_collapse")){
-          var collapseId = sessionStorage.getItem("webcrawler_session_collapse");
-          if(collapseId) {
-              //Remove the previous selected Pane.
-            $("#accordion-session-access .in").removeClass("in");
-
-            $('#' + collapseId).collapse("show");
-          }
-        }
-      }
-  });
-</script>
-<style type="text/css">
-  .list-group.webcrawler-access-credentials .form-group
-  {
-    display: block !important;
-  }
-</style>
-<h5><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.PageAccessCredentials'))</strong></h5>
-<ul class="list-group webcrawler-access-credentials">
-      <li class="list-group-item list-group-item-header">
-        <div class="row form-inline">
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression'))</strong></div>
-          <div class="col-md-2"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.AuthenticationType'))</strong></div>
-          <div class="col-md-2"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Domain'))</strong></div>
-          <div class="col-md-2"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.UserName'))</strong></div>
-          <div class="col-md-2"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Password'))</strong></div>
-        </div>
-      </li>
-  #foreach($pageAccessMap in $PAGEACCESSMAPLIST)
-    #set( $PREFIX = "acredential_" + $COUNTER )
-      <li class="list-group-item">
-            <div class="row form-inline">
-              <div class="col-md-1">
-                <button class="btn btn-danger btn-sm" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeletePageAuthenticationUrlRegularExpression'))$foreach.count" onclick='javascript:deleteARegexp($COUNTER);'><i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i></button>
-                <input type="hidden" name="op_$PREFIX" value="Continue"/>
-                <input type="hidden" name="regexp_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["regexp"])"/>
-              </div>
-              <div class="col-md-3">
-                <div class="form-group">
-                  <p class="form-control-static">$Encoder.bodyEscape($pageAccessMap["regexp"])</p>
-                </div>
-              </div>
-              <div class="col-md-2">
-                <div class="form-group">
-                  <div class="checkbox">
-                    <label><input type="radio" name="type_$PREFIX" value="basic" #if($pageAccessMap["type"] == 'basic') checked #{else} "" #end />$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.BasicAuthentication'))</label>
-                    <label><input type="radio" name="type_$PREFIX" value="ntlm" #if($pageAccessMap["type"] == 'ntlm') checked #{else} "" #end />$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.NTLMAuthentication'))</label>
-                  </div>
-                </div>
-              </div>
-              <div class="col-md-2">
-                <div class="form-group">
-                  <input class="form-control" type="text" size="16" name="domain_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["domain"])"/>
-                </div>
-              </div>
-              <div class="col-md-2">
-                <div class="form-group">
-                  <input class="form-control" type="text" size="16" name="username_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["userName"])"/>
-                </div>
-              </div>
-              <div class="col-md-2">
-                <div class="form-group">
-                  <input class="form-control" type="password" size="16" name="password_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["password"])"/>
-                </div>
-              </div>
-            </div>
-          </li>
-    #set( $COUNTER = $COUNTER + 1)
-  #end
-  #if($COUNTER == "0")
-      <li class="list-group-item list-group-item-warning">
-        $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoPageAccessCredentialsSpecified'))
-      </li>
-  #end
-      <li class="list-group-item">
-        <div class="row form-inline">
-          <div class="col-md-1">
-            <button class="btn btn-success btn-sm" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddPageAuthenticationUrlRegularExpression'))" onclick="javascript:addARegexp();"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></button>
-            <input type="hidden" name="acredential_count" value="$COUNTER"/>
-            <input type="hidden" name="acredential_op" value="Continue"/>
-          </div>
-          <div class="col-md-3">
-            <div class="form-group">
-              <input class="form-control" type="text" size="30" name="regexp_acredential" value=""/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <div class="checkbox">
-                <label><input type="radio" name="type_acredential" value="basic" checked="" />&nbsp;$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.BasicAuthentication'))</label>
-                <label><input type="radio" name="type_acredential" value="ntlm" />&nbsp;$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.NTLMAuthentication'))</label>
-              </div>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <div class="form-group">
-                <input class="form-control" type="text" size="16" name="domain_acredential" value=""/>
-              </div>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" size="16" name="username_acredential" value=""/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="password" size="16" name="password_acredential" value=""/>
-            </div>
-          </div>
-        </div>
-      </li>
-    </ul>
-<h5><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.SessionBasedAccessCredentials'))</strong></h5>
-<div class="panel-group" id="accordion-session-access" role="tablist" aria-multiselectable="true">
-  #set( $COUNTER = 0)
-  #foreach($sessionAccessMap in $SESSIONACCESSMAPLIST)
-    #set( $PREFIX = "scredential_" + $COUNTER )
-  <div class="panel panel-default">
-    <div class="panel-heading clearfix" role="tab" id="heading_$PREFIX">
-      <h4 class="panel-title pull-left">
-        <a role="button" data-toggle="collapse" data-parent="#accordion-session-access" href="#collapse_$PREFIX" aria-expanded="true" aria-controls="collapse_$PREFIX">
-          $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression')):&nbsp;$Encoder.bodyEscape($sessionAccessMap["regexp"])
-        </a>
-      </h4>
-      <div class="pull-right">
-        <button class="btn btn-danger btn-xs" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteSessionAuthenticationUrlRegularExpression'))$foreach.count" onclick='javascript:deleteSRegexp($COUNTER);'><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Delete'))</button>
-        <input type="hidden" name="${PREFIX}_op" value="Continue"/>
-        <input type="hidden" name="${PREFIX}_regexp" value="$Encoder.attributeEscape($sessionAccessMap["regexp"])"/>
-      </div>
-    </div>
-    <div id="collapse_$PREFIX" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading_$PREFIX">
-      <div class="panel-body">
-        <h5><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.LoginPages'))</strong></h5>
-    #set( $AUTHPAGECOUNTER = 0 )
-    #set( $AUTHPAGEMAPLIST = $sessionAccessMap["authPageMapList"])
-    #foreach($authPageMap in $AUTHPAGEMAPLIST)
-      #set( $AUTHPAGEPREFIX = $PREFIX + "_" + $AUTHPAGECOUNTER)
-        <div class="panel panel-default">
-          <div class="panel-body">
-            <div class="form-group">
-              <button class="btn btn-danger btn-xs pull-right" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteLoginPage'))$foreach.count for url regular expression #$AUTHPAGECOUNTER" onclick='javascript:deleteLoginPage($COUNTER,$AUTHPAGECOUNTER);'><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Delete'))</button>
-              <input type="hidden" name="${AUTHPAGEPREFIX}_op" value="Continue"/>
-              <input type="hidden" name="${AUTHPAGEPREFIX}_regexp" value="$Encoder.attributeEscape($authPageMap["pageRegexp"])"/>
-              <input type="hidden" name="${AUTHPAGEPREFIX}_type" value="$Encoder.attributeEscape($authPageMap["pageType"])"/>
-            </div>
-            <div class="form-group">
-              <div class="row">
-                <div class="col-md-6">
-                  <label class="control-label">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.LoginURLRegularExpression'))</label>
-                  <p class="form-control-static">$Encoder.bodyEscape($authPageMap["pageRegexp"])</p>
-                </div>
-                <div class="col-md-6">
-                  <label class="control-label">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.PageType'))</label>
-                  <p class="form-control-static">$authPageMap["pageType"]</p>
-                </div>
-              </div>
-            </div>
-            <div class="form-group">
-              <div class="row">
-                <div class="col-md-6">
-                  <label class="control-label" for="${AUTHPAGEPREFIX}_matchregexp">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.FormNamelinkTargetRegularExpression'))</label>
-                  <input class="form-control" type="text" size="30" name="${AUTHPAGEPREFIX}_matchregexp" id="${AUTHPAGEPREFIX}_matchregexp" value="$Encoder.attributeEscape($authPageMap["matchRegexp"])"/>
-                </div>
-                <div class="col-md-6">
-                  <label class="control-label" for="${AUTHPAGEPREFIX}_overridetargeturl">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.OverrideTargetURL'))</label>
-                  <input class="form-control" type="text" size="30" name="${AUTHPAGEPREFIX}_overridetargeturl" id="${AUTHPAGEPREFIX}_overridetargeturl" value="$Encoder.attributeEscape($authPageMap["overrideTargetURL"])"/>
-                </div>
-              </div>
-            </div>
-          </div>
-      #if($authPageMap["pageType"] == "form")
-          <h5 style="padding-left:15px;"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.OverrideFormParameters'))</strong></h5>
-          <ul class="list-group webcrawler-access-credentials">
-            <li class="list-group-item">
-              <div class="row">
-                <div class="col-md-2"></div>
-                <div class="col-md-4"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ParameterRegularExpression'))</strong></div>
-                <div class="col-md-3"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Value'))</strong></div>
-                <div class="col-md-3"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Password'))</strong></div>
-              </div>
-            </li>
-        #set( $AUTHPARAMCOUNTER = 0)
-        #set( $AUTHPAGEPARAMMAPLIST = $authPageMap["authPageParamMapList"] )
-        #foreach($authPageParamMap in $AUTHPAGEPARAMMAPLIST)
-          #set( $AUTHPARAMPREFIX = $AUTHPAGEPREFIX + "_" + $AUTHPARAMCOUNTER)
-            <li class="list-group-item">
-              <div class="row form-inline">
-                <div class="col-md-2">
-                  <button class="btn btn-danger btn-xs" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteParameter'))$foreach.count$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.ForLoginPage'))$AUTHPAGECOUNTER$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.ForCredential'))$COUNTER" onclick='javascript:deleteLoginPageParameter($COUNTER,$AUTHPAGECOUNTER,$AUTHPARAMCOUNTER);'><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Delete'))</button>
-                  <input type="hidden" name="${AUTHPARAMPREFIX}_op" value="Continue"/>
-                </div>
-                <div class="col-md-4">
-                  <div class="form-group">
-                    <input class="form-control" type="text" size="30" name="${AUTHPARAMPREFIX}_param" value="$Encoder.attributeEscape($authPageParamMap["param"])"/>
-                  </div>
-                </div>
-                <div class="col-md-3">
-                  <div class="form-group">
-                    <input class="form-control" type="text" size="15" name="${AUTHPARAMPREFIX}_value" value="$Encoder.attributeEscape($authPageParamMap["value"])"/>
-                  </div>
-                </div>
-                <div class="col-md-3">
-                  <div class="form-group">
-                    <input class="form-control" type="password" size="15" name="${AUTHPARAMPREFIX}_password" value="$Encoder.attributeEscape($authPageParamMap["password"])"/>
-                  </div>
-                </div>
-              </div>
-            </li>
-          #set( $AUTHPARAMCOUNTER = $AUTHPARAMCOUNTER + 1)
-        #end
-        #if($AUTHPAGEPARAMMAPLIST.size() == 0)
-            <li class="list-group-item list-group-item-warning">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoFormParametersSpecified'))</li>
-        #end
-            <li class="list-group-item">
-              <div class="row">
-                <div class="col-md-2">
-                  <button class="btn btn-success btn-xs" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddParameterToLoginPage'))$AUTHPAGECOUNTER$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.ForCredential'))$COUNTER" onclick='javascript:addLoginPageParameter($COUNTER,$AUTHPAGECOUNTER);'><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-                  <input type="hidden" name="${AUTHPAGEPREFIX}_loginparamcount" value="$AUTHPARAMCOUNTER"/>
-                  <input type="hidden" name="${AUTHPAGEPREFIX}_loginparamop" value="Continue"/>
-                </div>
-                <div class="col-md-4">
-                  <div class="form-group">
-                    <input class="form-control" type="text" size="30" name="${AUTHPAGEPREFIX}_loginparamname" value=""/>
-                  </div>
-                </div>
-                <div class="col-md-3">
-                  <div class="form-group">
-                    <input class="form-control" type="text" size="15" name="${AUTHPAGEPREFIX}_loginparamvalue" value=""/>
-                  </div>
-                </div>
-                <div class="col-md-3">
-                  <div class="form-group">
-                    <input class="form-control" type="password" size="15" name="${AUTHPAGEPREFIX}_loginparampassword" value=""/>
-                  </div>
-                </div>
-              </div>
-            </li>
-          </ul>
-      #end
-        </div>
-      #set( $AUTHPAGECOUNTER = $AUTHPAGECOUNTER + 1 )
-    #end
-        <div class="panel panel-default">
-        <div class="panel-body">
-          <div class="row">
-            <div class="col-md-12">
-              <div class="form-group">
-                <div class="row">
-                  <div class="col-md-4">
-                    <label class="control-label" for="${PREFIX}_loginpageregexp">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.LoginURLRegularExpression'))</label>
-                    <input class="form-control" type="text" size="30" name="${PREFIX}_loginpageregexp" id="${PREFIX}_loginpageregexp" value=""/>
-                  </div>
-                  <div class="col-md-8">
-                    <label class="control-label">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.PageType'))</label>
-                    <div class="checkbox">
-                      <label class="checkbox-inline"><input type="radio" name="${PREFIX}_loginpagetype" value="form" checked=""/>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.FormName'))</label>
-                      <label class="checkbox-inline"><input type="radio" name="${PREFIX}_loginpagetype" value="link"/>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.LinkTarget'))</label>
-                      <label class="checkbox-inline"><input type="radio" name="${PREFIX}_loginpagetype" value="redirection"/>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RedirectionTo'))</label>
-                      <label class="checkbox-inline"><input type="radio" name="${PREFIX}_loginpagetype" value="content"/>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.PageContent'))</label>
-                    </div>
-                  </div>
-                </div>
-              </div>
-              <div class="form-group">
-                <div class="row">
-                  <div class="col-md-6">
-                    <label for="${PREFIX}_loginpagematchregexp">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.FormNamelinkTargetRegularExpression'))</label>
-                    <input class="form-control" type="text" size="30" name="${PREFIX}_loginpagematchregexp" id="${PREFIX}_loginpagematchregexp" value=""/>
-                  </div>
-                  <div class="col-md-6">
-                    <label for="${PREFIX}_loginpageoverridetargeturl">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.OverrideTargetURL'))</label>
-                    <input class="form-control" type="text" size="30" name="${PREFIX}_loginpageoverridetargeturl" id="${PREFIX}_loginpageoverridetargeturl" value=""/>
-                  </div>
-                </div>
-              </div>
-            </div>
-          </div>
-          <div class="row">
-            <div class="col-md-12">
-              <button class="btn btn-success pull-right" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddLoginPageToCredential'))$foreach.count" onclick='javascript:addLoginPage($COUNTER);'><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-              <input type="hidden" name="${PREFIX}_loginpagecount" value="$AUTHPAGECOUNTER"/>
-              <input type="hidden" name="${PREFIX}_loginpageop" value="Continue"/>
-            </div>
-          </div>
-        </div>
-      </div>
-      </div>
-    </div>
-  </div>
-    #set( $COUNTER = $COUNTER + 1)
-  #end
-</div>
-
-  #if($COUNTER == 0)
-<div class="callout callout-warning">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoSessionBasedAccessCredentialsSpecified'))</div>
-  #end
-<hr/>
-<div class="row">
-  <div class="col-md-6">
-    <div class="form-group">
-      <label for="scredential_regexp">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression'))</label>
-      <input class="form-control" type="text" size="30" name="scredential_regexp" id="scredential_regexp" value=""/>
-    </div>
-    <div class="form-group">
-      <button class="btn btn-success pull-right" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddSessionAuthenticationUrlRegularExpression'))" onclick="javascript:addSRegexp();"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-      <input type="hidden" name="scredential_count" value="$COUNTER"/>
-      <input type="hidden" name="scredential_op" value="Continue"/>
-    </div>
-  </div>
-</div>
-
-#else
-  #foreach($pageAccessMap in $PAGEACCESSMAPLIST)
-    #set( $PREFIX = "acredential_" + $COUNTER )
-<input type="hidden" name="regexp_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["regexp"])" />
-<input type="hidden" name="type_$PREFIX" value="$pageAccessMap["type"]" />
-<input type="hidden" name="domain_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["domain"])" />
-<input type="hidden" name="username_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["userName"])" />
-<input type="hidden" name="password_$PREFIX" value="$Encoder.attributeEscape($pageAccessMap["password"])" />
-    #set( $COUNTER = $COUNTER + 1)
-  #end
-<input type="hidden" name="acredential_count" value="$COUNTER"/>
-
-  #set( $COUNTER = 0)
-  #foreach($sessionAccessMap in $SESSIONACCESSMAPLIST)
-    #set( $PREFIX = "scredential_" + $COUNTER )
-<input type="hidden" name="${PREFIX}_regexp" value="$Encoder.attributeEscape($sessionAccessMap["regexp"])"/>
-    #set( $AUTHPAGECOUNTER = 0 )
-    #set( $AUTHPAGEMAPLIST = $sessionAccessMap["authPageMapList"])
-    #foreach($authPageMap in $AUTHPAGEMAPLIST)
-      #set( $AUTHPAGEPREFIX = $PREFIX + "_" + $AUTHPAGECOUNTER)
-<input type="hidden" name="${AUTHPAGEPREFIX}_regexp" value="$Encoder.attributeEscape($authPageMap["pageRegexp"])" />
-<input type="hidden" name="${AUTHPAGEPREFIX}_type" value="$Encoder.attributeEscape($authPageMap["pageType"])" />
-<input type="hidden" name="${AUTHPAGEPREFIX}_matchregexp" value="$Encoder.attributeEscape($authPageMap["matchRegexp"])" />
-<input type="hidden" name="${AUTHPAGEPREFIX}_overridetargeturl" value="$Encoder.attributeEscape($authPageMap["overrideTargetURL"])" />
-      #if($authPageMap["pageType"] == "form")
-        #set( $AUTHPARAMCOUNTER = 0)
-        #set( $AUTHPAGEPARAMMAPLIST = $authPageMap["authPageParamMapList"] )
-        #foreach($authPageParamMap in $AUTHPAGEPARAMMAPLIST)
-          #set( $AUTHPARAMPREFIX = $AUTHPAGEPREFIX + "_" + $AUTHPARAMCOUNTER)
-<input type="hidden" name="${AUTHPARAMPREFIX}_op" value="Continue"/>
-<input type="hidden" name="${AUTHPARAMPREFIX}_param" value="$Encoder.attributeEscape($authPageParamMap["param"])" />
-<input type="hidden" name="${AUTHPARAMPREFIX}_value" value="$Encoder.attributeEscape($authPageParamMap["value"])" />
-<input type="hidden" name="${AUTHPARAMPREFIX}_password" value="$Encoder.attributeEscape($authPageParamMap["password"])" />
-          #set( $AUTHPARAMCOUNTER = $AUTHPARAMCOUNTER + 1)
-        #end
-<input type="hidden" name="${AUTHPAGEPREFIX}_loginparamcount" value="$AUTHPARAMCOUNTER"/>
-      #end
-      #set( $AUTHPAGECOUNTER = $AUTHPAGECOUNTER + 1 )
-    #end
-<input type="hidden" name="${PREFIX}_loginpagecount" value="$AUTHPAGECOUNTER" />
-    #set( $COUNTER = $COUNTER + 1)
-  #end
-<input type="hidden" name="scredential_count" value="$COUNTER" />
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Bandwidth.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Bandwidth.html.vm
deleted file mode 100644
index 5cb5ff2..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Bandwidth.html.vm
+++ /dev/null
@@ -1,183 +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.
-*#
-
-#set( $BINCOUNTER = 0)
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Bandwidth'))
-<style type="text/css">
-  #webcrawler-bandwidth-throttles .form-group
-  {
-    display: block !important;
-  }
-</style>
-<div class="row">
-  <div class="col-md-12">
-    <h5>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Throttles'))</h5>
-    <ul id="webcrawler-bandwidth-throttles" class="list-group">
-  #foreach($throttleMap in $THROTTLESMAPLIST)
-    #set( $THROTTLEPREFIX = "bandwidth_" + $BINCOUNTER )
-      <li class="list-group-item">
-        <div class="row form-inline">
-          <div class="col-md-1">
-            <div class="form-group">
-              <button class="btn btn-sm btn-danger" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteBinRegularExpression'))$foreach.count" onclick='javascript:deleteRegexp($BINCOUNTER);'><i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i></button>
-              <input type="hidden" name="op_$THROTTLEPREFIX" value="Continue"/>
-              <input type="hidden" name="regexp_$THROTTLEPREFIX" value="$throttleMap.get("regexp")"/>
-            </div>
-          </div>
-          <div class="col-md-3">
-            <div class="form-group">
-              <p content="form-control-static">$Encoder.bodyEscape($throttleMap.get("regexp"))</p>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <div class="checkbox">
-                <label><input type="checkbox" name="insensitive_$THROTTLEPREFIX" value="true" #if($throttleMap.get("isCaseInsensitive") == 'true') checked #{else} "" #end /> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.CaseInsensitive'))</label>
-              </div>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="connections_$THROTTLEPREFIX" value="$throttleMap.get("maxConnections")" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.MaxConnections'))"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="rate_$THROTTLEPREFIX" value="$throttleMap.get("maxKBPerSecond")" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.MaxKbytesSec'))"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="fetches_$THROTTLEPREFIX" value="$throttleMap.get("maxFetchesPerMinute")" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.MaxFetchesMin'))"/>
-            </div>
-          </div>
-        </div>
-      </li>
-        #set( $BINCOUNTER = $BINCOUNTER + 1)
-  #end
-      ## If it looks like this is a brand-new configuration, add in a default throttle.
-      ## This only works because other nodes must get created on the first post, and cannot then be deleted.
-  #if($BRANDNEW)
-    #set( $THROTTLEPREFIX = "bandwidth_" + $BINCOUNTER )
-      <li class="list-group-item">
-        <div class="row form-inline">
-          <div class="col-md-1">
-            <div class="form-group">
-              <button class="btn btn-sm btn-danger" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteBinRegularExpression'))($foreach.count + 1)" onclick='javascript:deleteRegexp($BINCOUNTER);'><i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i></button>
-              <input type="hidden" name="op_$THROTTLEPREFIX" value="Continue"/>
-              <input type="hidden" name="regexp_$THROTTLEPREFIX" value=""/>
-            </div>
-          </div>
-          <div class="col-md-3">
-            <div class="form-group">
-              <p class="form-control-static"></p>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <div class="checkbox">
-                <label><input type="checkbox" name="insensitive_$THROTTLEPREFIX" value="false"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.CaseInsensitive'))</label>
-              </div>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="connections_$THROTTLEPREFIX" value="2"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="rate_$THROTTLEPREFIX" value="64"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="fetches_$THROTTLEPREFIX" value="12"/>
-            </div>
-          </div>
-        </div>
-      </li>
-    #set( $BINCOUNTER = $BINCOUNTER + 1)
-  #end
-  #if($BINCOUNTER == "0")
-      <li class="list-group-item list-group-item-warning">
-        $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoBandwidthOrConnectionThrottlingSpecified'))
-      </li>
-  #end
-      <li class="list-group-item">
-        <div class="row form-inline">
-          <div class="col-md-1">
-            <div class="form-group">
-              <button class="btn btn-success btn-sm" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddBinRegularExpression'))" onclick="javascript:addRegexp();"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></button>
-              <input type="hidden" name="bandwidth_count" value="$BINCOUNTER"/>
-              <input type="hidden" name="bandwidth_op" value="Continue"/>
-            </div>
-          </div>
-          <div class="col-md-3">
-            <div class="form-group">
-              <input class="form-control" type="text" name="regexp_bandwidth" value="" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.BinRegularExpression'))"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <div class="checkbox">
-                <label><input type="checkbox" name="insensitive_bandwidth" value="true"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.CaseInsensitive'))</label>
-              </div>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="connections_bandwidth" value="" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.MaxConnections'))"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="rate_bandwidth" value="" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.MaxKbytesSec'))"/>
-            </div>
-          </div>
-          <div class="col-md-2">
-            <div class="form-group">
-              <input class="form-control" type="text" name="fetches_bandwidth" value="" placeholder="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.MaxFetchesMin'))"/>
-            </div>
-          </div>
-        </div>
-      </li>
-    </ul>
-  </div>
-</div>
-#else
-  #foreach($throttleMap in $THROTTLESMAPLIST)
-    #set( $THROTTLEPREFIX = "bandwidth_" + $BINCOUNTER )
-<input type="hidden" name="regexp_$THROTTLEPREFIX" value="$Encoder.attributeEscape($throttleMap.get("regexp"))"/>
-<input type="hidden" name="insensitive_$THROTTLEPREFIX" value="$Encoder.attributeEscape($throttleMap.get("isCaseInsensitive"))"/>
-<input type="hidden" name="connections_$THROTTLEPREFIX" value="$Encoder.attributeEscape($throttleMap.get("maxConnections"))"/>
-<input type="hidden" name="rate_$THROTTLEPREFIX" value="$Encoder.attributeEscape($throttleMap.get("maxKBPerSecond"))"/>
-<input type="hidden" name="fetches_$THROTTLEPREFIX" value="$Encoder.attributeEscape($throttleMap.get("maxFetchesPerMinute"))"/>
-    #set( $BINCOUNTER = $BINCOUNTER + 1)
-  #end
-  #if($BRANDNEW)
-    #set( $THROTTLEPREFIX = "bandwidth_" + $BINCOUNTER )
-<input type="hidden" name="regexp_$THROTTLEPREFIX" value=""/>
-<input type="hidden" name="insensitive_$THROTTLEPREFIX" value="false"/>
-<input type="hidden" name="connections_$THROTTLEPREFIX" value="2"/>
-<input type="hidden" name="rate_$THROTTLEPREFIX" value="64"/>
-<input type="hidden" name="fetches_$THROTTLEPREFIX" value="12"/>
-    #set( $BINCOUNTER = $BINCOUNTER + 1)
-  #end
-<input type="hidden" name="bandwidth_count" value="$BINCOUNTER"/>
-#end
-
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Certificates.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Certificates.html.vm
deleted file mode 100644
index 25bc5db..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Certificates.html.vm
+++ /dev/null
@@ -1,97 +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.
-*#
-
-#set( $COUNTER = 0)
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Certificates'))
-<div class="row">
-  <div class="col-md-12 col-lg-8">
-    <h5>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.TrustCertificates'))</h5>
-    <ul class="list-group">
-      <li class="list-group-item" style="padding: 5px 15px;">
-        <div class="row">
-          <div class="col-md-5"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression'))</strong></div>
-          <div class="col-md-5"><strong>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Certificate'))</strong></div>
-          <div class="col-md-2"></div>
-        </div>
-      </li>
-  #foreach($trustMap in $TRUSTMAPLIST)
-    #set( $PREFIX = "trust_" + $COUNTER )
-      <li class="list-group-item">
-        <div class="row">
-          <div class="col-md-5">$Encoder.bodyEscape($trustMap["regexp"])</div>
-          <div class="col-md-5">
-    #if($trustMap["trustEverything"] == "true")
-            <i>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.TrustEverything"))</i>
-    #else
-            $Encoder.bodyEscape($trustMap["shortenedDescription"])
-  #end
-          </div>
-          <div class="col-md-2">
-            <button class="btn btn-danger btn-xs pull-right" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteTrustUrlRegularExpression'))$foreach.count" onclick="javascript:deleteTRegexp($COUNTER);"><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Delete'))</button>
-            <input type="hidden" name="op_$PREFIX" value="Continue"/>
-            <input type="hidden" name="regexp_$PREFIX" value="$Encoder.attributeEscape($trustMap["regexp"])"/>
-            <input type="hidden" name="trustall_$PREFIX" value="$Encoder.attributeEscape($trustMap["trustEverything"])"/>
-            <input type="hidden" name="truststore_$PREFIX" value="#if($trustMap["trustEverything"] == "true") "" #{else} $Encoder.attributeEscape($trustMap["trustStore"]) #end"/>
-          </div>
-        </div>
-      </li>
-    #set( $COUNTER = $COUNTER + 1)
-  #end
-    </ul>
-  </div>
-</div>
-  #if($COUNTER == "0")
-<div class="row">
-  <div class="col-xs-12">
-    <div class="callout callout-warning">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoTrustCertificatesSpecified'))</div>
-  </div>
-</div>
-  #end
-<hr/>
-<div class="row">
-  <div class="col-md-6 col-lg-4">
-    <div class="form-group">
-      <label for="regexp_trust">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression'))</label>
-      <input class="form-control" type="text" size="30" name="regexp_trust" id="regexp_trust" value=""/>
-    </div>
-    <div class="form-group">
-      <label for="certificate_trust">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.UploadCertificate'))</label>
-      <input name="certificate_trust" id="certificate_trust" type="file"/>
-    </div>
-    <div class="form-group">
-      <div class="checkbox">
-        <label><input type="checkbox" name="all_trust" value="true"/>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.TrustEverything'))</label>
-      </div>
-    </div>
-    <div class="form-group">
-      <button class="btn btn-success" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddUrlRegularExpressionForTruststore'))" onclick="javascript:addTRegexp();"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-      <input type="hidden" name="trust_count" value="$COUNTER"/>
-      <input type="hidden" name="trust_op" value="Continue"/>
-    </div>
-  </div>
-</div>
-#else
-  #foreach($trustMap in $TRUSTMAPLIST)
-    #set( $PREFIX = "trust_" + $COUNTER )
-<input type="hidden" name="regexp_$PREFIX" value="$Encoder.attributeEscape($trustMap.get("regexp"))"/>
-<input type="hidden" name="truststore_$PREFIX" value="#if($trustMap.get("trustEverything") == "false") $Encoder.attributeEscape($trustMap.get("trustStore")) #end"/>
-<input type="hidden" name="trustall_$PREFIX" value="$Encoder.attributeEscape($trustMap.get("trustEverything"))"/>
-    #set( $COUNTER = $COUNTER + 1)
-  #end
-<input type="hidden" name="trust_count" value="$COUNTER"/>
-#end
-
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Email.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Email.html.vm
deleted file mode 100644
index 45536b0..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Email.html.vm
+++ /dev/null
@@ -1,29 +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.
-*#
-
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Email'))
-<div class="row">
-  <div class="col-md-6 col-lg-4">
-    <div class="form-group">
-      <label for="email">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.EmailAddressToContact'))</label>
-      <input class="form-control" type="email" size="32" name="email" id="email" value="$Encoder.attributeEscape($EMAIL)"/>
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="email" value="$Encoder.attributeEscape($EMAIL)"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Proxy.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Proxy.html.vm
deleted file mode 100644
index 2c03a96..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Proxy.html.vm
+++ /dev/null
@@ -1,61 +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.
-*#
-
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Proxy'))
-<div class="row">
-  <div class="col-lg-4 col-md-5">
-    <div class="form-group">
-      <label for="proxyhost">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ProxyHostColon'))</label>
-      <input class="form-control" type="text" size="40" name="proxyhost" id="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)"/>
-    </div>
-  </div>
-  <div class="col-lg-2 col-md-3">
-    <div class="form-group">
-      <label for="proxyport">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ProxyPortColon'))</label>
-      <input class="form-control" type="text" size="5" name="proxyport" id="proxyport" value="$Encoder.attributeEscape($PROXYPORT)"/>
-    </div>
-  </div>
-</div>
-<div class="row">
-  <div class="col-lg-6 col-md-8">
-    <div class="form-group">
-      <label for="proxyauthdomain">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ProxyAuthenticationDomainColon'))</label>
-      <input class="form-control" type="text" size="32" name="proxyauthdomain" id="proxyauthdomain" value="$Encoder.attributeEscape($PROXYAUTHDOMAIN)"/>
-    </div>
-  </div>
-</div>
-<div class="row">
-  <div class="col-lg-3 col-md-4">
-    <div class="form-group">
-      <label for="proxyauthusername">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ProxyAuthenticationUserNameColon'))</label>
-      <input class="form-control" type="text" size="32" name="proxyauthusername" id="proxyauthusername" value="$Encoder.attributeEscape($PROXYAUTHUSERNAME)"/>
-    </div>
-  </div>
-  <div class="col-lg-3 col-md-4">
-    <div class="form-group">
-      <label for="proxyauthpassword">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ProxyAuthenticationPasswordColon'))</label>
-      <input class="form-control" type="password" size="16" name="proxyauthpassword" id="proxyauthpassword" value="$Encoder.attributeEscape($PROXYAUTHPASSWORD)"/>
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="proxyhost" value="$Encoder.attributeEscape($PROXYHOST)"/>
-<input type="hidden" name="proxyport" value="$Encoder.attributeEscape($PROXYPORT)"/>
-<input type="hidden" name="proxyauthusername" value="$Encoder.attributeEscape($PROXYAUTHUSERNAME)"/>
-<input type="hidden" name="proxyauthdomain" value="$Encoder.attributeEscape($PROXYAUTHDOMAIN)"/>
-<input type="hidden" name="proxyauthpassword" value="$Encoder.attributeEscape($PROXYAUTHPASSWORD)"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Robots.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Robots.html.vm
deleted file mode 100644
index 512f220..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editConfiguration_Robots.html.vm
+++ /dev/null
@@ -1,41 +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.
-*#
-
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Robots'))
-<div class="row">
-  <div class="col-md-6 col-lg-4">
-    <div class="form-group">
-      <label for="robotsusage">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RobotsTxtUsage'))</label>
-      <select class="form-control" name="robotsusage" id="robotsusage">
-        <option value="none" #if($ROBOTSUSAGE == 'none') selected="selected" #end >$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.DontLookAtRobotsTxt'))</option>
-        <option value="data" #if($ROBOTSUSAGE == 'data') selected="selected" #end >$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly'))</option>
-        <option value="all"  #if($ROBOTSUSAGE == 'all')  selected="selected" #end >$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ObeyRobotsTxtForAllFetches'))</option>
-      </select>
-    </div>
-    <div class="form-group">
-      <label for="metarobotstagsusage">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.MetaRobotsTagsUsage'))</label>
-      <select class="form-control" name="metarobotstagsusage" id="metarobotstagsusage">
-        <option value="none" #if($METAROBOTSTAGSUSAGE == 'none') selected="selected" #end>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.DontLookAtMetaRobotsTags'))</option>
-        <option value="all"  #if($METAROBOTSTAGSUSAGE == 'all')  selected="selected" #end>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ObeyMetaRobotsTags'))</option>
-      </select>
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="robotsusage" value="$Encoder.attributeEscape($ROBOTSUSAGE)"/>
-<input type="hidden" name="metarobotstagsusage" value="$Encoder.attributeEscape($METAROBOTSTAGSUSAGE)"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification.js.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification.js.vm
deleted file mode 100644
index 5aa99a1..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification.js.vm
+++ /dev/null
@@ -1,140 +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.
-*#
-
-#set( $SEQPREFIX = "s" + $SEQNUM + "_" )
-<script type="text/javascript">
-/* editSpecification.js.vm (Web Connector) */
-function ${SEQPREFIX}SpecOp(n, opValue, anchorvalue)
-{
-  eval("editjob."+n+".value = \""+opValue+"\"");
-  postFormSetAnchor(anchorvalue);
-}
-
-function ${SEQPREFIX}AddRegexp(anchorvalue)
-{
-  if (editjob.${SEQPREFIX}rssmatch.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.MatchMustHaveARegexpValue'))");
-    editjob.${SEQPREFIX}rssmatch.focus();
-    return;
-  }
-
-  ${SEQPREFIX}SpecOp("${SEQPREFIX}rssop","Add",anchorvalue);
-}
-
-function ${SEQPREFIX}RemoveRegexp(index, anchorvalue)
-{
-  editjob.${SEQPREFIX}rssindex.value = index;
-  ${SEQPREFIX}SpecOp("${SEQPREFIX}rssop","Delete",anchorvalue);
-}
-
-function ${SEQPREFIX}URLRegexpDelete(index, anchorvalue)
-{
-  editjob.${SEQPREFIX}urlregexpnumber.value = index;
-  ${SEQPREFIX}SpecOp("${SEQPREFIX}urlregexpop","Delete",anchorvalue);
-}
-
-function ${SEQPREFIX}URLRegexpAdd(anchorvalue)
-{
-  ${SEQPREFIX}SpecOp("${SEQPREFIX}urlregexpop","Add",anchorvalue);
-}
-
-function ${SEQPREFIX}checkSpecification()
-{
-  if (${SEQPREFIX}check_expressions("inclusions",editjob.${SEQPREFIX}inclusions.value) == false)
-  {
-    editjob.${SEQPREFIX}inclusions.focus();
-    return false;
-  }
-  if (${SEQPREFIX}check_expressions("exclusions",editjob.${SEQPREFIX}exclusions.value) == false)
-  {
-    editjob.${SEQPREFIX}exclusions.focus();
-    return false;
-  }
-  if (${SEQPREFIX}check_seedsList() == false)
-  {
-    editjob.${SEQPREFIX}seeds.focus();
-    return false;
-  }
-  return true;
-}
-
-function ${SEQPREFIX}check_expressions(thecontext,theexpressionlist)
-{
-  var rval = true;
-  var theArray = theexpressionlist.split("\n");
-  var i = 0;
-  while (i < theArray.length)
-  {
-    // For legality check, we must cut out anything useful that is java-only
-    var theexp = theArray[i];
-    var trimmed = theexp.replace(/^\s+/,"");
-    i = i + 1;
-    if (trimmed.length == 0 || (trimmed.length >= 1 && trimmed.substring(0,1) == "#"))
-      continue;
-    try
-    {
-      var foo = "teststring";
-      foo.search(theexp.replace(/\(\?i\)/,""));
-    }
-    catch (e)
-    {
-      alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.FoundAnIllegalRegularExpressionIn'))"+thecontext+": '"+theexp+"'$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.ErrorWas'))"+e);
-      rval = false;
-    }
-  }
-  return rval;
-}
-
-function ${SEQPREFIX}check_seedsList()
-{
-  var regexp = /http(s)?:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@\/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/;
-  var lines = editjob.${SEQPREFIX}seeds.value.split("\n");
-  var trimmedUrlList = "";
-  var invalidUrlList = "";
-  var i = 0;
-  while (i < lines.length)
-  {
-    var line = lines[i].replace(/^\s*/, "").replace(/\s*$/, "");
-    if (line.length > 0)
-    {
-      if (!regexp.test(line))
-        invalidUrlList = invalidUrlList + line + "\n";
-      trimmedUrlList = trimmedUrlList + line + "\n";
-    }
-    i = i + 1;
-  }
-  editjob.${SEQPREFIX}seeds.value = trimmedUrlList;
-  if (invalidUrlList.length > 0)
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.InvalidUrlsInSeedsList'))\n" + invalidUrlList);
-    return false;
-  }
-  return true;
-}
-
-function ${SEQPREFIX}SpecAddToken(anchorvalue)
-{
-  if (editjob.${SEQPREFIX}spectoken.value == "")
-  {
-    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('WebcrawlerConnector.TypeInAnAccessToken'))");
-    editjob.${SEQPREFIX}spectoken.focus();
-    return;
-  }
-  ${SEQPREFIX}SpecOp("${SEQPREFIX}accessop","Add",anchorvalue);
-}
-</script>
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Canonicalization.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Canonicalization.html.vm
deleted file mode 100644
index 5cb672e..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Canonicalization.html.vm
+++ /dev/null
@@ -1,121 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Canonicalization') && ${SEQNUM} == ${SELECTEDNUM})
-  #set( $COUNTER = $CANONICALIZATIONMAPLIST.size() )
-  #if($COUNTER == 0)
-<div class="alert alert-warning">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoCanonicalizationSpecified'))</div>
-  #else
-<div class="row">
-  <input type="hidden" name="${SEQPREFIX}urlregexpop" value="Continue"/>
-  <input type="hidden" name="${SEQPREFIX}urlregexpnumber" value=""/>
-  <table class="table">
-    <tr>
-      <th></th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression'))</th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Description'))</th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Reorder'))</th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveJSPSessions'))</th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveASPSessions'))</th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemovePHPSessions'))</th>
-      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveBVSessions'))</th>
-    </tr>
-    #foreach($canonicalizationMap in $CANONICALIZATIONMAPLIST)
-    <tr>
-      <td>
-        <button class="btn btn-danger btn-xs" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteUrlRegexp'))$Encoder.attributeEscape($canonicalizationMap["regexpString"])" onclick='javascript:${SEQPREFIX}URLRegexpDelete($foreach.index,"${SEQPREFIX}urlregexp_${foreach.index}");'><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Delete'))</button>
-      </td>
-      <td>
-        <input type="hidden" name="${SEQPREFIX}urlregexp_$foreach.index" value="$Encoder.attributeEscape($canonicalizationMap["regexpString"])"/>
-        <input type="hidden" name="${SEQPREFIX}urlregexpdesc_$foreach.index" value="$Encoder.attributeEscape($canonicalizationMap["description"])"/>
-        <input type="hidden" name="${SEQPREFIX}urlregexpreorder_$foreach.index" value="$canonicalizationMap["allowReorder"]"/>
-        <input type="hidden" name="${SEQPREFIX}urlregexpjava_$foreach.index" value="$canonicalizationMap["allowJavaSessionRemoval"]"/>
-        <input type="hidden" name="${SEQPREFIX}urlregexpasp_$foreach.index" value="$canonicalizationMap["allowASPSessionRemoval"]"/>
-        <input type="hidden" name="${SEQPREFIX}urlregexpphp_$foreach.index" value="$canonicalizationMap["allowPHPSessionRemoval"]"/>
-        <input type="hidden" name="${SEQPREFIX}urlregexpbv_$foreach.index" value="$canonicalizationMap["allowBVSessionRemoval"]"/>
-        $Encoder.bodyEscape($canonicalizationMap["regexpString"])
-      </td>
-      <td>$Encoder.bodyEscape($canonicalizationMap["description"])</td>
-      <td>$canonicalizationMap["allowReorderOutput"]</td>
-      <td>$canonicalizationMap["allowJavaSessionRemovalOutput"]</td>
-      <td>$canonicalizationMap["allowASPSessionRemovalOutput"]</td>
-      <td>$canonicalizationMap["allowPHPSessionRemovalOutput"]</td>
-      <td>$canonicalizationMap["allowBVSessionRemovalOutput"]</td>
-    </tr>
-    #end
-  </table>
-</div>
-  #end
-  #set( $NEXTCOUNTER = $COUNTER + 1 )
-<hr/>
-<div class="row">
-  <div class="col-md-4">
-    <input type="hidden" name="${SEQPREFIX}urlregexpcount" value="$COUNTER"/>
-    <div class="form-group">
-      <label for="${SEQPREFIX}urlregexp">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression'))</label>
-      <input class="form-control" type="text" name="${SEQPREFIX}urlregexp" id="${SEQPREFIX}urlregexp" value=""/>
-    </div>
-    <div class="form-group">
-      <label for="${SEQPREFIX}urlregexpdesc">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Description'))</label>
-      <input class="form-control" type="text" name="${SEQPREFIX}urlregexpdesc" id="${SEQPREFIX}urlregexpdesc" value=""/>
-    </div>
-    <div class="form-group">
-      <div class="checkbox">
-        <label>
-          <input type="checkbox" name="${SEQPREFIX}urlregexpreorder" value="yes"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Reorder'))
-        </label>
-      </div>
-      <div class="checkbox">
-        <label>
-          <input type="checkbox" name="${SEQPREFIX}urlregexpjava" value="yes" checked="true"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveJSPSessions'))
-        </label>
-      </div>
-      <div class="checkbox">
-        <label>
-          <input type="checkbox" name="${SEQPREFIX}urlregexpasp" value="yes" checked="true"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveASPSessions'))
-        </label>
-      </div>
-      <div class="checkbox">
-        <label>
-          <input type="checkbox" name="${SEQPREFIX}urlregexpphp" value="yes" checked="true"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemovePHPSessions'))
-        </label>
-      </div>
-      <div class="checkbox">
-        <label>
-          <input type="checkbox" name="${SEQPREFIX}urlregexpbv" value="yes" checked="true"/> $Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveBVSessions'))
-        </label>
-      </div>
-    </div>
-    <div class="form-group pull-right">
-      <button class="btn btn-primary" type="button" title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddUrlRegexp'))" onclick='javascript:${SEQPREFIX}URLRegexpAdd("${SEQPREFIX}urlregexp_${NEXTCOUNTER}");'><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-    </div>
-  </div>
-</div>
-#else
-  #foreach($canonicalizationMap in $CANONICALIZATIONMAPLIST)
-<input type="hidden" name="${SEQPREFIX}urlregexp_$foreach.index" value="$Encoder.attributeEscape($canonicalizationMap["regexpString"])"/>
-<input type="hidden" name="${SEQPREFIX}urlregexpdesc_$foreach.index" value="$Encoder.attributeEscape($canonicalizationMap["description"])"/>
-<input type="hidden" name="${SEQPREFIX}urlregexpreorder_$foreach.index" value="$canonicalizationMap["allowReorder"]"/>
-<input type="hidden" name="${SEQPREFIX}urlregexpjava_$foreach.index" value="$canonicalizationMap["allowJavaSessionRemoval"]"/>
-<input type="hidden" name="${SEQPREFIX}urlregexpasp_$foreach.index" value="$canonicalizationMap["allowASPSessionRemoval"]"/>
-<input type="hidden" name="${SEQPREFIX}urlregexpphp_$foreach.index" value="$canonicalizationMap["allowPHPSessionRemoval"]"/>
-<input type="hidden" name="${SEQPREFIX}urlregexpbv_$foreach.index" value="$canonicalizationMap["allowBVSessionRemoval"]"/>
-  #end
-  #set( $COUNTER = $CANONICALIZATIONMAPLIST.size())
-<input type="hidden" name="${SEQPREFIX}urlregexpcount" value="$COUNTER"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Exclusions.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Exclusions.html.vm
deleted file mode 100644
index 58c5f28..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Exclusions.html.vm
+++ /dev/null
@@ -1,40 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Exclusions') && ${SEQNUM} == ${SELECTEDNUM})
-<div class="row">
-  <div class="col-md-6">
-    <div class="form-group">
-      <label for="${SEQPREFIX}exclusions">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ExcludeFromCrawl'))</label>
-      <textarea class="form-control" rows="15" name="${SEQPREFIX}exclusions" id="${SEQPREFIX}exclusions">$Encoder.bodyEscape($EXCLUSIONS)</textarea>
-    </div>
-    <div class="form-group">
-      <label for="${SEQPREFIX}exclusionsindex">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ExcludeFromIndex'))</label>
-      <textarea class="form-control" rows="10" name="${SEQPREFIX}exclusionsindex" id="${SEQPREFIX}exclusionsindex">$Encoder.bodyEscape($EXCLUSIONSINDEX)</textarea>
-    </div>
-    <div class="form-group">
-      <label for="">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ExcludeContentFromIndex'))</label>
-      <textarea class="form-control" rows="10" name="${SEQPREFIX}exclusionscontentindex" id="${SEQPREFIX}exclusionscontentindex">$Encoder.bodyEscape($EXCLUSIONSCONTENTINDEX)</textarea>
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="${SEQPREFIX}exclusions" value="$Encoder.attributeEscape($EXCLUSIONS)"/>
-<input type="hidden" name="${SEQPREFIX}exclusionsindex" value="$Encoder.attributeEscape($EXCLUSIONSINDEX)"/>
-<input type="hidden" name="${SEQPREFIX}exclusionscontentindex" value="$Encoder.attributeEscape($EXCLUSIONSCONTENTINDEX)"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Inclusions.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Inclusions.html.vm
deleted file mode 100644
index bd65b38..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Inclusions.html.vm
+++ /dev/null
@@ -1,43 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Inclusions') && ${SEQNUM} == ${SELECTEDNUM})
-<div class="row">
-  <div class="col-md-6">
-    <div class="form-group">
-      <label for="${SEQPREFIX}inclusions">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.IncludeInCrawl'))</label>
-      <textarea class="form-control" rows="15" name="${SEQPREFIX}inclusions" id="${SEQPREFIX}inclusions">$Encoder.bodyEscape($INCLUSIONS)</textarea>
-    </div>
-    <div class="form-group">
-      <label for="${SEQPREFIX}inclusionsindex">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.IncludeInIndex'))</label>
-      <textarea class="form-control" rows="10" name="${SEQPREFIX}inclusionsindex" id="${SEQPREFIX}inclusionsindex">$Encoder.bodyEscape($INCLUSIONSINDEX)</textarea>
-    </div>
-    <div class="form-group">
-      <div class="checkbox">
-        <label><input type="checkbox" name="${SEQPREFIX}matchinghosts" value="true" #if($INCLUDEMATCHING) checked="yes" #end />$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds'))</label>
-        <input type="hidden" name="${SEQPREFIX}matchinghosts_present" value="true"/>
-      </div>
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="${SEQPREFIX}inclusions" value="$Encoder.attributeEscape($INCLUSIONS)"/>
-<input type="hidden" name="${SEQPREFIX}inclusionsindex" value="$Encoder.attributeEscape($INCLUSIONSINDEX)"/>
-<input type="hidden" name="${SEQPREFIX}matchinghosts" value="#if($INCLUDEMATCHING)true#{else}false#end" />
-<input type="hidden" name="${SEQPREFIX}matchinghosts_present" value="true"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Mappings.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Mappings.html.vm
deleted file mode 100644
index 1f7a01e..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Mappings.html.vm
+++ /dev/null
@@ -1,96 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.URLMappings') && ${SEQNUM} == ${SELECTEDNUM})
-<style type="text/css">
-  .mapping{
-    width:100%;
-  }
-  .mapping > div{
-    display: inline-block;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-  .mapping-regexp{
-    width:35%;
-  }
-  .mapping-arrow{
-    width:10%;
-  }
-  .mapping-match{
-    width: 35%;
-  }
-</style>
-
-<input type="hidden" name="${SEQPREFIX}rssop" value=""/>
-<input type="hidden" name="${SEQPREFIX}rssindex" value=""/>
-<input type="hidden" name="${SEQPREFIX}rssmapcount" value="$REGEXPLIST.size()"/>
-<div class="row">
-  <div class="col-md-8">
-    <ul class="list-group">
-  #foreach($REGEXP in $REGEXPLIST)
-    #set( $PREFIX = $SEQPREFIX + "rssregexp_" + $foreach.index +"_" )
-      <li class="list-group-item">
-        <input type="hidden" name="${PREFIX}match" value="$Encoder.attributeEscape($REGEXP)"/>
-        <div class="mapping">
-          <div class="text-right mapping-regexp">$Encoder.bodyEscape($REGEXP)</div>
-          <div class="text-center mapping-arrow"><i class="fa fa-long-arrow-right" aria-hidden="true"></i></div>
-          <div class="text-left mapping-match">
-    #set( $MATCH = $MATCHSTRINGS.get($foreach.index))
-            <input type="hidden" name="${PREFIX}map" value="$Encoder.attributeEscape($MATCH)"/>
-    #if($MATCH.length() == 0)
-            &lt;as is&gt;
-    #else
-            $Encoder.bodyEscape($MATCH)
-    #end
-          </div>
-          <div class="pull-right">
-            <button class="btn btn-xs btn-danger" type="button" onclick='javascript:${SEQPREFIX}RemoveRegexp($foreach.index,"${SEQPREFIX}regexp_$foreach.index")' title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.RemoveRegexp'))$foreach.index"><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Remove'))</button>
-          </div>
-        </div>
-      </li>
-  #end
-    </ul>
-  </div>
-</div>
-<hr/>
-  #set( $COUNTER = $REGEXPLIST.size() )
-  #set( $NEXTCOUNTER = $COUNTER + 1 )
-<div class="row">
-  <div class="col-lg-8 form-inline">
-    <div class="form-group">
-      <input class="form-control" type="text" name="${SEQPREFIX}rssmatch" value=""/>
-    </div>
-    <i class="fa fa-long-arrow-right fa-fw fa-lg" aria-hidden="true"></i>
-    <div class="form-group">
-      <input class="form-control" type="text" name="${SEQPREFIX}rssmap" value=""/>
-    </div>
-    <button class="btn btn-primary" type="button" onclick='javascript:${SEQPREFIX}AddRegexp("${SEQPREFIX}regexp_${NEXTCOUNTER}")' title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddRegexp'))"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-  </div>
-</div>
-#else
-  #set( $COUNTER = $REGEXPLIST.size() )
-  <input type="hidden" name="${SEQPREFIX}rssmapcount" value="$COUNTER"/>
-  #foreach($REGEXP in $REGEXPLIST)
-    #set( $PREFIX = $SEQPREFIX + "rssregexp_" + $foreach.index +"_" )
-  <input type="hidden" name="${PREFIX}match" value="$Encoder.attributeEscape($REGEXP)"/>
-    #set( $MATCH = $MATCHSTRINGS.get($foreach.index))
-  <input type="hidden" name="${PREFIX}map" value="$Encoder.attributeEscape($MATCH)"/>
-  #end
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Metadata.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Metadata.html.vm
deleted file mode 100644
index 87392f3..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Metadata.html.vm
+++ /dev/null
@@ -1,38 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Metadata') && ${SEQNUM} == ${SELECTEDNUM})
-<div class="row">
-  <div class="col-md-6">
-    <h5>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ExcludedHeadersColon'))</h5>
-    <input type="hidden" name="${SEQPREFIX}excludedheaders_present" value="true"/>
-    <div class="list-group">
-  #foreach($potentiallyExcludedHeader in $POTENTIALLYEXCLUDEDHEADERS)
-      <label class="list-group-item">
-        <input type="checkbox" name="${SEQPREFIX}excludedheaders" value="$Encoder.attributeEscape($potentiallyExcludedHeader)" #if($EXCLUDEDHEADERS.contains($potentiallyExcludedHeader)) checked="true" #end />&nbsp;&nbsp;$Encoder.bodyEscape($potentiallyExcludedHeader)
-      </label>
-  #end
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="${SEQPREFIX}excludedheaders_present" value="true"/>
-  #foreach($excludedHeader in $EXCLUDEDHEADERS)
-<input type="hidden" name="${SEQPREFIX}excludedheaders" value="$Encoder.attributeEscape($excludedHeader)" />
-  #end
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Security.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Security.html.vm
deleted file mode 100644
index 3ec1b97..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Security.html.vm
+++ /dev/null
@@ -1,68 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Security') && ${SEQNUM} == ${SELECTEDNUM})
-<div class="row">
-  <div class="col-md-8">
-    <ul class="list-group">
-  #foreach($TOKEN in $TOKENS)
-    #set( $ACCESSDESC = "_" + $foreach.index )
-    #set( $ACCESSOPNAME = $SEQPREFIX + "accessop" + $ACCESSDESC )
-      <li class="list-group-item">
-        <input type="hidden" name="$ACCESSOPNAME" value=""/>
-        <input type="hidden" name="${SEQPREFIX}spectoken${ACCESSDESC}" value="$Encoder.attributeEscape($TOKEN)" />
-        $Encoder.bodyEscape($TOKEN)
-        <span class="pull-right">
-          <button class="btn btn-xs btn-danger" type="button" onClick='Javascript:${SEQPREFIX}SpecOp("$ACCESSOPNAME","Delete","${SEQPREFIX}token_${foreach.index}")' alt="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.DeleteToken'))$foreach.index"><i class="fa fa-minus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Delete'))</button>
-        </span>
-      </li>
-  #end
-    </ul>
-  </div>
-</div>
-
-  #set( $COUNTER = $TOKENS.size() )
-  #if($COUNTER == 0)
-<div class="row">
-  <div class="col-xs-12">
-    <div class="alert alert-warning">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoAccessTokensPresent'))</div>
-  </div>
-</div>
-  #end
-
-<hr/>
-<div class="row">
-  <div class="col-md-8 form-inline">
-    <div class="form-group">
-      <input type="hidden" name="${SEQPREFIX}tokencount" value="$COUNTER"/>
-      <input type="hidden" name="${SEQPREFIX}accessop" value=""/>
-      <label for="${SEQPREFIX}spectoken" class="sr-only">Token:</label>
-      <input class="form-control" type="text" name="${SEQPREFIX}spectoken" id="${SEQPREFIX}spectoken" value="" placeholder="Token" />
-    </div>
-    <button class="btn btn-primary" type="button" onClick='Javascript:${SEQPREFIX}SpecAddToken("${SEQPREFIX}token_${COUNTER}")' title="$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.AddAccessToken'))"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i>$Encoder.attributeEscape($ResourceBundle.getString('WebcrawlerConnector.Add'))</button>
-  </div>
-</div>
-#else
-  #foreach($TOKEN in $TOKENS)
-    #set( $ACCESSDESC = "_" + $foreach.index )
-    #set( $ACCESSOPNAME = $SEQPREFIX + "accessop" + $ACCESSDESC )
-<input type="hidden" name="${SEQPREFIX}spectoken${ACCESSDESC}" value="$Encoder.attributeEscape($TOKEN)" />
-  #end
-  #set( $COUNTER = $TOKENS.size() )
-<input type="hidden" name="${SEQPREFIX}tokencount" value="$COUNTER" />
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Seeds.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Seeds.html.vm
deleted file mode 100644
index 5a98f85..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/editSpecification_Seeds.html.vm
+++ /dev/null
@@ -1,29 +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.
-*#
-
-#set( $SEQPREFIX = 's' + $SEQNUM + '_' )
-#if($TABNAME == $ResourceBundle.getString('WebcrawlerConnector.Seeds') && ${SEQNUM} == ${SELECTEDNUM})
-<div class="row">
-  <div class="col-md-6">
-    <div class="form-group">
-      <textarea class="form-control" rows="20" name="${SEQPREFIX}seeds">$Encoder.bodyEscape($SEEDS)</textarea>
-    </div>
-  </div>
-</div>
-#else
-<input type="hidden" name="${SEQPREFIX}seeds" value="$Encoder.attributeEscape($SEEDS)"/>
-#end
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/viewConfiguration.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/viewConfiguration.html.vm
deleted file mode 100644
index af45abc..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/viewConfiguration.html.vm
+++ /dev/null
@@ -1,243 +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.
-*#
-
-<table class="table">
-  <tr>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.EmailAddress')</th>
-    <td colspan="3">$Encoder.bodyEscape($EMAIL)</td>
-  </tr>
-  <tr>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.RobotsUsage')</th>
-    <td colspan="1">
-#if($ROBOTSUSAGE == 'none')
-      $ResourceBundle.getString('WebcrawlerConnector.DontLookAtRobotsTxt')
-#elseif($ROBOTUSAGE == 'data')
-      $ResourceBundle.getString('WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly')
-#elseif($ROBOTUSAGE == 'all')
-      $ResourceBundle.getString('WebcrawlerConnector.ObeyRobotsTxtForAllFetches')
-#end
-    </td>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.MetaRobotsTagsUsage')</th>
-    <td colspan="1">
-#if($METAROBOTSTAGSUSAGE == 'none')
-      $ResourceBundle.getString('WebcrawlerConnector.DontLookAtMetaRobotsTags')
-#elseif($METAROBOTSTAGSUSAGE == 'all')
-      $ResourceBundle.getString('WebcrawlerConnector.ObeyMetaRobotsTags')
-#end
-    </td>
-  </tr>
-  <tr>
-    <th>$ResourceBundle.getString('WebcrawlerConnector.ProxyHostColon')</th>
-    <td>$Encoder.bodyEscape($PROXYHOST)</td>
-    <th>$ResourceBundle.getString('WebcrawlerConnector.ProxyPortColon')</th>
-    <td>$Encoder.bodyEscape($PROXYPORT)</td>
-  </tr>
-  <tr>
-    <th>$ResourceBundle.getString('WebcrawlerConnector.ProxyAuthenticationDomainColon')</th>
-    <td>$Encoder.bodyEscape($PROXYAUTHDOMAIN)</td>
-    <th>$ResourceBundle.getString('WebcrawlerConnector.ProxyAuthenticationUserNameColon')</th>
-    <td>$Encoder.bodyEscape($PROXYAUTHUSERNAME)</td>
-  </tr>
-  <tr>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.BandwidthThrottling')</th>
-    <td colspan="3">
-      <table class="table">
-        <tr class="active">
-          <th>$ResourceBundle.getString('WebcrawlerConnector.BinRegularExpression')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.CaseInsensitive')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.MaxConnections')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.MaxKbytesSec')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.MaxFetchesMin')</th>
-        </tr>
-#set( $BINCOUNTER = 0)
-#foreach($throttleMap in $THROTTLESMAPLIST)
-        <tr>
-          <td>
-            $Encoder.bodyEscape($throttleMap.get("regexp"))
-          </td>
-          <td>$throttleMap["isCaseInsensitive"]</td>
-          <td>
-  #if($throttleMap["maxConnections"] == "")
-            Not limited
-  #else
-            $throttleMap["maxConnections"]
-  #end
-          </td>
-          <td>
-  #if($throttleMap["maxKBPerSecond"] == "")
-            Not limited
-  #else
-            $throttleMap["maxKBPerSecond"]
-  #end
-          </td>
-          <td>
-  #if($throttleMap["maxFetchesPerMinute"] == "")
-            Not limited
-  #else
-            $throttleMap["maxFetchesPerMinute"]
-  #end
-          </td>
-        </tr>
-  #set( $BINCOUNTER = $BINCOUNTER + 1)
-#end
-
-#if($BINCOUNTER == 0)
-          <tr class="formrow"><td class="formmessage" colspan="5"><div class="callout callout-info">$ResourceBundle.getString('WebcrawlerConnector.NoBandwidthThrottling')</div></td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-
-  <tr>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.PageAccessCredentials')</th>
-    <td colspan="3">
-      <table class="table">
-        <tr class="active">
-          <th>$ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.CredentialType')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.CredentialDomain')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.UserName')</th>
-        </tr>
-#set( $COUNTER = 0)
-#foreach($pageAccessMap in $PAGEACCESSMAPLIST)
-        <tr>
-          <td>
-            $Encoder.bodyEscape($pageAccessMap["regexp"])
-          </td>
-          <td>
-          $pageAccessMap["type"]
-          </td>
-          <td>$Encoder.bodyEscape($pageAccessMap["domain"])</td>
-          <td>$Encoder.attributeEscape($pageAccessMap["userName"])</td>
-        </tr>
-  #set( $COUNTER = $COUNTER + 1)
-#end
-
-#if($COUNTER == 0)
-          <tr class="formrow"><td class="formmessage" colspan="4"><div class="callout callout-info">$ResourceBundle.getString('WebcrawlerConnector.NoPageAccessCredentials')</div></td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-
-  <tr>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.SessionBasedAccessCredentials')</th>
-    <td colspan="3">
-      <table class="table">
-        <tr class="active">
-          <th>$ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.LoginPages')</th>
-        </tr>
-#set( $COUNTER = 0)
-#foreach($sessionAccessMap in $SESSIONACCESSMAPLIST)
-        <tr>
-          <td>$Encoder.bodyEscape($sessionAccessMap["regexp"])</td>
-          <td>
-            <table class="table">
-              <tr class="active">
-                <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.LoginURLRegularExpression'))</th>
-                <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.PageType'))</th>
-                <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.FormNamelinkTargetRegularExpression'))</th>
-                <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.OverrideTargetURL'))</th>
-                <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.OverrideFormParameters'))</th>
-              </tr>
-  #set( $AUTHPAGECOUNTER = 0 )
-  #set( $AUTHPAGEMAPLIST = $sessionAccessMap["authPageMapList"])
-  #foreach($authPageMap in $AUTHPAGEMAPLIST)
-              <tr>
-                <td>$Encoder.bodyEscape($authPageMap["pageRegexp"])</td>
-                <td>$authPageMap["pageType"]</td>
-                <td>$Encoder.bodyEscape($authPageMap["matchRegexp"])</td>
-                <td>$Encoder.bodyEscape($authPageMap["overrideTargetURL"])</td>
-    #if($authPageMap["pageType"] == "form")
-                <td>
-                  <table class="table">
-                    <tr class="active">
-                      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.ParameterRegularExpression'))</th>
-                      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Value'))</th>
-                      <th>$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.Password'))</th>
-                    </tr>
-      #set( $AUTHPARAMCOUNTER = 0)
-      #set( $AUTHPAGEPARAMMAPLIST = $authPageMap["authPageParamMapList"] )
-      #foreach($authPageParamMap in $AUTHPAGEPARAMMAPLIST)
-                    <tr>
-                      <td>$Encoder.bodyEscape($authPageParamMap["param"])</td>
-                      <td>$Encoder.bodyEscape($authPageParamMap["value"])</td>
-                      <td>
-        #if($authPageParamMap["password"] != "")
-                        *****
-        #end
-                      </td>
-                    </tr>
-        #set( $AUTHPARAMCOUNTER = $AUTHPARAMCOUNTER + 1)
-      #end
-
-      #if($AUTHPAGEPARAMMAPLIST.size() == 0)
-                    <tr><td colspan="3"><div class="callout callout-info">$Encoder.bodyEscape($ResourceBundle.getString('WebcrawlerConnector.NoFormParametersSpecified'))</div></td></tr>
-      #end
-                  </table>
-                </td>
-    #else
-                <td></td>
-    #end
-              </tr>
-    #set( $AUTHPAGECOUNTER = $AUTHPAGECOUNTER + 1 )
-  #end
-
-  #if($AUTHPAGECOUNTER == 0)
-                <tr><td colspan="5"><div class="callout callout-info">$ResourceBundle.getString('WebcrawlerConnector.NoLoginPagesSpecified')</div></td></tr>
-  #end
-            </table>
-          </td>
-        </tr>
-  #set( $COUNTER = $COUNTER + 1)
-#end
-
-#if($COUNTER == 0)
-          <tr><td colspan="2"><div class="callout callout-info">$ResourceBundle.getString('WebcrawlerConnector.NoSessionBasedAccessCredentials')</div></td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-
-  <tr>
-    <th colspan="1">$ResourceBundle.getString('WebcrawlerConnector.TrustCertificates')</th>
-    <td colspan="3">
-      <table class="table">
-        <tr class="active">
-          <th>$ResourceBundle.getString('WebcrawlerConnector.URLRegularExpression')</th>
-          <th>$ResourceBundle.getString('WebcrawlerConnector.Certificate')</th>
-        </tr>
-#set( $COUNTER = 0)
-#foreach($trustMap in $TRUSTMAPLIST)
-        <tr>
-          <td>$Encoder.bodyEscape($trustMap["regexp"])</td>
-  #if($trustMap["trustEverything"] == "true")
-          <td><i>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.TrustEverything"))</i></td>
-  #else
-          <td>$Encoder.bodyEscape($trustMap["shortenedDescription"])</td>
-  #end
-  #set( $COUNTER = $COUNTER + 1)
-#end
-
-#if($COUNTER == 0)
-          <tr><td colspan="2"><div class="callout callout-info">$ResourceBundle.getString('WebcrawlerConnector.NoTrustCertificates')</div></td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-</table>
diff --git a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/viewSpecification.html.vm b/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/viewSpecification.html.vm
deleted file mode 100644
index e1c6b92..0000000
--- a/connectors/webcrawler/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/webcrawler/viewSpecification.html.vm
+++ /dev/null
@@ -1,119 +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.
-*#
-
-<table class="table">
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.SeedsColon"))</th>
-    <td><pre>$Encoder.attributeEscape($SEEDS)</pre></td>
-  </tr>
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.URLCanonicalization"))</th>
-    <td>
-      <table class="table">
-        <tr class="active">
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.URLRegexp"))</th>
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.Description"))</th>
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.Reorder"))</th>
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.RemoveJSPSessions"))</th>
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.RemoveASPSessions"))</th>
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.RemovePHPSessions"))</th>
-          <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.RemoveBVSessions"))</th>
-        </tr>
-#foreach($canonicalizationMap in $CANONICALIZATIONMAPLIST)
-        <tr>
-          <td>$Encoder.bodyEscape($canonicalizationMap["regexpString"])</td>
-          <td>$Encoder.bodyEscape($canonicalizationMap["description"])</td>
-          <td>$canonicalizationMap["allowReorderOutput"]</td>
-          <td>$canonicalizationMap["allowJavaSessionRemovalOutput"]</td>
-          <td>$canonicalizationMap["allowASPSessionRemovalOutput"]</td>
-          <td>$canonicalizationMap["allowPHPSessionRemovalOutput"]</td>
-          <td>$canonicalizationMap["allowBVSessionRemovalOutput"]</td>
-        </tr>
-#end
-
-#if($CANONICALIZATIONMAPLIST.size() == 0)
-          <tr><td colspan="7"><div class="callout callout-info">$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.NoCanonicalizationSpecified"))</div></td></tr>
-#end
-      </table>
-    </td>
-  </tr>
-#if($REGEXPLIST.size() == 0)
-    <tr><td colspan="2"><div class="callout callout-info">$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.NoMappingsSpecifiedWillAcceptAllUrls"))</div></td></tr>
-#else
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.URLMappingsColon"))</th>
-    <td>
-  #foreach($REGEXP in $REGEXPLIST)
-      <p><span>$Encoder.bodyEscape($REGEXP)</span>&nbsp;&nbsp;<i class="fa fa-long-arrow-right" aria-hidden="true"></i>
-      <span>
-    #set( $MATCH = $MATCHSTRINGS.get($foreach.index))
-    #if($MATCH.length() == 0)
-        &lt;as is&gt;
-    #else
-        $Encoder.bodyEscape($MATCH)
-    #end
-      </span></p>
-  #end
-    </td>
-  </tr>
-#end
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds"))</th>
-    <td>#if($INCLUDEMATCHING)$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.yes"))#{else}$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.no"))#{end}</td>
-  </tr>
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.IncludeInCrawl"))</th>
-    <td><pre>$Encoder.bodyEscape($INCLUSIONS)</pre></td>
-  </tr>
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.IncludeInIndex"))</th>
-    <td><pre>$Encoder.bodyEscape($INCLUSIONSINDEX)</pre></td>
-  </tr>
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.ExcludeFromCrawl"))</th>
-    <td><pre>$Encoder.bodyEscape($EXCLUSIONS)</pre></td>
-  </tr>
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.ExcludeFromIndex"))</th>
-    <td><pre>$Encoder.bodyEscape($EXCLUSIONSINDEX)</pre></td>
-  </tr>
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.ExcludeContentFromIndex"))</th>
-    <td><pre>$Encoder.bodyEscape($EXCLUSIONSCONTENTINDEX)</pre></td>
-  </tr>
-
-#if($TOKENS.size() == 0)
-    <tr><td colspan="2"><div class="callout callout-info">$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.NoAccessTokensSpecified"))</div></td></tr>
-#else
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.AccessTokens"))</th>
-    <td>
-  #foreach($TOKEN in $TOKENS)
-      <p>$Encoder.bodyEscape($TOKEN)</p>
-  #end
-    </td>
-  </tr>
-#end
-  <tr>
-    <th>$Encoder.bodyEscape($ResourceBundle.getString("WebcrawlerConnector.ExcludedHeadersColon"))</th>
-    <td>
-#foreach($excludedHeader in $EXCLUDEDHEADERS)
-      <p>$Encoder.bodyEscape($excludedHeader)</p>
-#end
-    </td>
-  </tr>
-</table>
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ProcessActivityHTMLHandlerTest.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ProcessActivityHTMLHandlerTest.java
deleted file mode 100644
index 0e0ad7b..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ProcessActivityHTMLHandlerTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: NavigationHSQLDBUI.java 1788170 2017-03-23 01:06:27Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector.DocumentURLFilter;
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector.ProcessActivityHTMLHandler;
-import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ProcessActivityHTMLHandlerTest {
-
-  private WebcrawlerConnector webcrawler = new WebcrawlerConnector();
-
-  private Map<String, String> metaRobotsNoindexNofollow = new HashMap<>();
-
-  @Before
-  public void setup() {
-    metaRobotsNoindexNofollow.put("name", "robots");
-    metaRobotsNoindexNofollow.put("content", "noindex,nofollow");
-  }
-
-  @Test
-  public void testNoteMetaTag_robotsInstructionsAreObeyed() throws ManifoldCFException {
-    IProcessActivity mockActivity = mock(IProcessActivity.class);
-    DocumentURLFilter filter = mock(DocumentURLFilter.class);
-    ProcessActivityHTMLHandler sut = webcrawler.new ProcessActivityHTMLHandler("id", mockActivity, filter, WebcrawlerConnector.META_ROBOTS_ALL);
-    sut.noteMetaTag(metaRobotsNoindexNofollow);
-    assertFalse(sut.allowIndex);
-    assertFalse(sut.allowFollow);
-  }
-
-  @Test
-  public void testNoteMetaTag_robotsInstructionsCanBeIgnored() throws ManifoldCFException {
-    IProcessActivity mockActivity = mock(IProcessActivity.class);
-    DocumentURLFilter filter = mock(DocumentURLFilter.class);
-    ProcessActivityHTMLHandler sut = webcrawler.new ProcessActivityHTMLHandler("id", mockActivity, filter, WebcrawlerConnector.META_ROBOTS_NONE);
-    sut.noteMetaTag(metaRobotsNoindexNofollow);
-    assertTrue(sut.allowIndex);
-    assertTrue(sut.allowFollow);
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/RobotsTest.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/RobotsTest.java
deleted file mode 100644
index 9209799..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/RobotsTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.crawler.connectors.webcrawler.RobotsManager;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class RobotsTest
-{
-
-  @Test
-  public void doesPathMatch()
-    throws Exception
-  {
-    // This test assesses the functionality of doesPathMatch()
-    assertTrue(RobotsManager.doesPathMatch("/folder/doc1.pdf","/folder/doc1.pdf"));
-    assertTrue(RobotsManager.doesPathMatch("/folder/doc1.pdf","/folder/*"));
-    assertTrue(RobotsManager.doesPathMatch("/folder/doc1.pdf","/"));
-    assertTrue(RobotsManager.doesPathMatch("/folder/doc1.pdf","/folder/"));
-    assertFalse(RobotsManager.doesPathMatch("/folder/doc1.pdf","folder/doc1.pdf"));
-  }
-  
-  @Test
-  public void testRecord()
-    throws Exception
-  {
-    // Assess whether the Record class is doing the right thing
-    RobotsManager.Record record = new RobotsManager.Record();
-    record.addAgent("*");
-    record.addDisallow("/");
-    record.addAllow("folder/doc1.pdf");
-    record.addAllow("folder/doc2.pdf");
-    record.addAllow("folder/doc3.pdf");
-    assertTrue(record.isAgentMatch("*",true));
-    assertTrue(record.isDisallowed("/folder/doc1.pdf"));
-    assertFalse(record.isAllowed("/folder/doc1.pdf"));
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/URLTest.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/URLTest.java
deleted file mode 100644
index f9aec1d..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/URLTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler;
-
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebURL;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class URLTest
-{
-
-  @Test
-  public void absolutePath()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com");
-    WebURL resolved = parent.resolve("http://bar.com");
-    assertEquals(resolved.toASCIIString(),"http://bar.com");
-  }
-
-  @Test
-  public void relativePath()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com/abc/def.html");
-    WebURL resolved = parent.resolve("/def/ghi.html");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/def/ghi.html");
-  }
-
-  @Test
-  public void noSlashDocument()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com");
-    WebURL resolved = parent.resolve("hello.pdf");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/hello.pdf");
-  }
-
-  @Test
-  public void relativeQuery()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com/abc/def/ghi.asmx?q=foo");
-    WebURL resolved = parent.resolve("?q=bar");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/abc/def/ghi.asmx?q=bar");
-  }
-
-  @Test
-  public void queryEscaping()
-    throws Exception
-  {
-    WebURL parent = new WebURL("http://foo.com/abc/def/ghi.asmx?q=foo%3Dbar");
-    WebURL resolved = parent.resolve("?q=bar%3Dfoo");
-    assertEquals(resolved.toASCIIString(),"http://foo.com/abc/def/ghi.asmx?q=bar%3Dfoo");
-  }
-
-
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITHSQLDB.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITHSQLDB.java
deleted file mode 100644
index 124418e..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Web Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITMySQL.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITMySQL.java
deleted file mode 100644
index 23495d4..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITMySQL.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITMySQL extends org.apache.manifoldcf.crawler.tests.BaseITMySQL
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Web Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITPostgresql.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITPostgresql.java
deleted file mode 100644
index 356036d..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseITPostgresql.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITPostgresql extends org.apache.manifoldcf.crawler.tests.BaseITPostgresql
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Web Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseUIHSQLDB.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseUIHSQLDB.java
deleted file mode 100644
index 8488c64..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Web Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlMySQLLT.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlMySQLLT.java
deleted file mode 100644
index 05b3884..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlMySQLLT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlMySQLLT extends BaseITMySQL
-{
-
-  protected BigCrawlTester tester;
-  protected MockWebService webService = null;
-  
-  public BigCrawlMySQLLT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWebService()
-    throws Exception
-  {
-    webService = new MockWebService(10);
-    webService.start();
-  }
-  
-  @After
-  public void shutdownWebService()
-    throws Exception
-  {
-    if (webService != null)
-      webService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlPostgresqlIT.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlPostgresqlIT.java
deleted file mode 100644
index 024e359..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlPostgresqlIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class BigCrawlPostgresqlIT extends BaseITPostgresql
-{
-
-  protected BigCrawlTester tester;
-  protected MockWebService webService = null;
-  
-  public BigCrawlPostgresqlIT()
-  {
-    tester = new BigCrawlTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWebService()
-    throws Exception
-  {
-    webService = new MockWebService(10);
-    webService.start();
-  }
-  
-  @After
-  public void shutdownWebService()
-    throws Exception
-  {
-    if (webService != null)
-      webService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlTester.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlTester.java
deleted file mode 100644
index b2a6609..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/BigCrawlTester.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector;
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConfig;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a 100000-document crawl */
-public class BigCrawlTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public BigCrawlTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("Web Connection");
-    conn.setDescription("Web Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector");
-    conn.setMaxConnections(100);
-    ConfigParams cp = conn.getConfigParams();
-    
-    cp.setParameter(WebcrawlerConfig.PARAMETER_EMAIL,"someone@somewhere.com");
-    cp.setParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE,"none");
-    
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("Web Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-    // Start with hopfilter = 1, then we will increase it.
-    job.addHopCountFilter("link",new Long(1));
-    //job.addHopCountFilter("redirect",new Long(2));
-
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    
-    // For 100000 documents, set up 10 seeds
-    SpecificationNode sn = new SpecificationNode(WebcrawlerConfig.NODE_SEEDS);
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < 10 ; i++)
-    {
-      sb.append("http://localhost:8191/web/gen.php?site="+i+"&level=0&item=0\n");
-    }
-    sn.setValue(sb.toString());
-    ds.addChild(ds.getChildCount(),sn);
-    
-    sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDES);
-    sn.setValue(".*\n");
-    ds.addChild(ds.getChildCount(),sn);
-    
-    sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDESINDEX);
-    sn.setValue(".*\n");
-    ds.addChild(ds.getChildCount(),sn);
-
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it completes.
-    long startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),220000000L);
-    System.err.println("Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    // Four levels deep from 10 site seeds: Each site seed has 1 + 10 + 100 + 1000 = 1111 documents, so 10 has 11110.
-    // First run: 1/10 of the final
-    if (status.getDocumentsProcessed() != 110)
-    {
-      System.err.println("Sleeping for database inspection");
-      while (true)
-      {
-        if (1 < 0)
-          break;
-        Thread.sleep(10000L);
-      }
-      throw new ManifoldCFException("Wrong number of documents processed - expected 110, saw "+new Long(status.getDocumentsProcessed()).toString());
-    }
-    
-    // Increase the hopcount filter value
-    job.addHopCountFilter("link",new Long(2));
-    jobManager.save(job);
-    
-    // Run again
-    startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),220000000L);
-    System.err.println("Second crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    status = jobManager.getStatus(job.getID());
-    // Four levels deep from 10 site seeds: Each site seed has 1 + 10 + 100 + 1000 = 1111 documents, so 10 has 11110.
-    if (status.getDocumentsProcessed() != 1110)
-    {
-      System.err.println("Sleeping for database inspection");
-      while (true)
-      {
-        if (1 < 0)
-          break;
-        Thread.sleep(10000L);
-      }
-      throw new ManifoldCFException("Wrong number of documents processed - expected 1110, saw "+new Long(status.getDocumentsProcessed()).toString());
-    }
-
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),18000000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/DocumentContentExclusionHSQLDBIT.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/DocumentContentExclusionHSQLDBIT.java
deleted file mode 100644
index 86cd31e..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/DocumentContentExclusionHSQLDBIT.java
+++ /dev/null
@@ -1,251 +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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.agents.interfaces.IOutputConnection;
-import org.apache.manifoldcf.agents.interfaces.IOutputConnectionManager;
-import org.apache.manifoldcf.agents.interfaces.OutputConnectionManagerFactory;
-import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.IResultRow;
-import org.apache.manifoldcf.core.interfaces.IResultSet;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.Specification;
-import org.apache.manifoldcf.core.interfaces.SpecificationNode;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConfig;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsNull.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class DocumentContentExclusionHSQLDBIT extends BaseITHSQLDB {
-
-    private static final int MAX_DOC_COUNT = 3;
-
-    public static final String CONTENTFILTER_SERVLET_PATH = "/contentexclusiontest";
-    private static final int PORT = 8191;
-    public static final long MAX_WAIT_TIME = 60 * 1000L;
-    public static final String WEB_CONNECTION = "Web Connection";
-    static String baseUrl = "http://127.0.0.1:" + PORT + CONTENTFILTER_SERVLET_PATH + "?page=";
-
-    private Server server = null;
-    private IJobManager jobManager;
-    private IOutputConnectionManager outputConnectionManager;
-
-
-    private IRepositoryConnectionManager repoConnectionManager;
-
-
-    @Before
-    public void beforeDocumentContentFilterTest() throws Exception {
-        server = new Server(new QueuedThreadPool(20));
-        ServerConnector connector = new ServerConnector(server);
-        connector.setPort(PORT);
-        connector.setIdleTimeout(60000);// important for Http KeepAlive
-        server.addConnector(connector);
-        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-        context.addServlet(ContentFilterTestServlet.class, CONTENTFILTER_SERVLET_PATH);
-        server.setHandler(context);
-        server.start();
-
-        IThreadContext tc = ThreadContextFactory.make();
-        repoConnectionManager = RepositoryConnectionManagerFactory.make(tc);
-        outputConnectionManager = OutputConnectionManagerFactory.make(tc);
-        jobManager = JobManagerFactory.make(tc);
-        createRepoConnector();
-        createOutputConnector();
-    }
-
-
-    @Test
-    public void testDocumentContentExclusion() throws Exception {
-        //No content exclusion rule
-        IJobDescription job = setupContentFilterJob();
-        runContentFilterJob(job);
-        checkContentFilterHistory(false);
-        cleanupContentFilterJobs(job);
-
-        //With exclusion rule
-        job = setupContentFilterJob();
-        //add content exclusion rule
-        addContentExclusionRule(job);
-        runContentFilterJob(job);
-        checkContentFilterHistory(true);
-        cleanupContentFilterJobs(job);
-    }
-
-    private void checkContentFilterHistory(boolean hasContentExcluded) throws Exception {
-        FilterCriteria filter = new FilterCriteria(new String[]{"process"}, 0l, Long.MAX_VALUE, new RegExpCriteria(".*\\" + CONTENTFILTER_SERVLET_PATH + ".*", true), null);
-        SortOrder sortOrderValue = new SortOrder();
-        sortOrderValue.addCriteria("entityid", SortOrder.SORT_ASCENDING);
-        IResultSet result = repoConnectionManager.genHistorySimple(WEB_CONNECTION, filter, sortOrderValue, 0, 20);
-        assertThat(result.getRowCount(), is(MAX_DOC_COUNT));
-
-        for (int i = 0; i < MAX_DOC_COUNT; i++) {
-            IResultRow row = result.getRow(i);
-            assertThat((String) row.getValue("identifier"), is(baseUrl + i));
-            if (hasContentExcluded && i == 1) {
-                //if excluding, only page 1 will be excluded
-                assertThat((String) row.getValue("resultcode"), is("EXCLUDEDCONTENT"));
-                assertThat((String) row.getValue("resultdesc"), is("Rejected due to content exclusion rule"));
-            } else {
-                assertThat((String) row.getValue("resultcode"), is("OK"));
-                assertThat(row.getValue("resultdesc"), is(nullValue()));
-            }
-        }
-    }
-
-    @After
-    public void tearDownDocumentContentFilterTest() throws Exception {
-        if (server != null) {
-            server.stop();
-        }
-    }
-
-
-    private IJobDescription setupContentFilterJob() throws Exception {
-
-        // Create a job.
-        IJobDescription job = jobManager.createJob();
-        job.setDescription("Test Job");
-        job.setConnectionName(WEB_CONNECTION);
-        job.addPipelineStage(-1, true, "Null Connection", "");
-        job.setType(job.TYPE_SPECIFIED);
-        job.setStartMethod(job.START_DISABLE);
-        job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-
-        Specification jobSpec = job.getSpecification();
-
-        // 3 seeds only
-        SpecificationNode sn = new SpecificationNode(WebcrawlerConfig.NODE_SEEDS);
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < MAX_DOC_COUNT; i++) {
-            sb.append(baseUrl + i + "\n");
-        }
-        sn.setValue(sb.toString());
-        jobSpec.addChild(jobSpec.getChildCount(), sn);
-
-        sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDES);
-        sn.setValue(".*\n");
-        jobSpec.addChild(jobSpec.getChildCount(), sn);
-
-        sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDESINDEX);
-        sn.setValue(".*\n");
-        jobSpec.addChild(jobSpec.getChildCount(), sn);
-        // Save the job.
-        jobManager.save(job);
-
-        return job;
-
-    }
-
-    private void addContentExclusionRule(IJobDescription job) throws ManifoldCFException {
-        Specification jobSpec = job.getSpecification();
-        SpecificationNode sn;
-        sn = new SpecificationNode(WebcrawlerConfig.NODE_EXCLUDESCONTENTINDEX);
-        sn.setValue(".*expired.*\n");
-        jobSpec.addChild(jobSpec.getChildCount(), sn);
-        jobManager.save(job);
-    }
-
-    private IOutputConnection createOutputConnector() throws ManifoldCFException {
-        // Create a basic null output connection, and save it.
-        IOutputConnection outputConn = outputConnectionManager.create();
-        outputConn.setName("Null Connection");
-        outputConn.setDescription("Null Connection");
-        outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-        outputConn.setMaxConnections(10);
-        // Now, save
-        outputConnectionManager.save(outputConn);
-
-        return outputConn;
-    }
-
-    private IRepositoryConnection createRepoConnector() throws ManifoldCFException {
-        //TODO: This is a copy/paste: Could we have common method for creating test jobs???
-        IRepositoryConnection repoConnection = repoConnectionManager.create();
-        repoConnection.setName("Web Connection");
-        repoConnection.setDescription("Web Connection");
-        repoConnection.setClassName("org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector");
-        repoConnection.setMaxConnections(50);
-        ConfigParams cp = repoConnection.getConfigParams();
-
-        cp.setParameter(WebcrawlerConfig.PARAMETER_EMAIL, "someone@somewhere.com");
-        cp.setParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE, "none");
-
-        repoConnectionManager.save(repoConnection);
-
-        return repoConnection;
-    }
-
-    private void cleanupContentFilterJobs(IJobDescription job) throws ManifoldCFException, InterruptedException {
-        repoConnectionManager.cleanUpHistoryData(WEB_CONNECTION);
-        jobManager.deleteJob(job.getID());
-        mcfInstance.waitJobDeletedNative(jobManager, job.getID(), MAX_WAIT_TIME);
-    }
-
-    private void runContentFilterJob(IJobDescription job) throws ManifoldCFException, InterruptedException {
-        jobManager.manualStart(job.getID());
-
-        try {
-            mcfInstance.waitJobInactiveNative(jobManager, job.getID(), MAX_WAIT_TIME);
-        } catch (ManifoldCFException e) {
-            System.err.println("Halting for inspection");
-            Thread.sleep(1000L);
-            throw e;
-        }
-        // Check to be sure we actually processed the right number of documents.
-        JobStatus status = jobManager.getStatus(job.getID());
-        System.err.println("doc processed: " + status.getDocumentsProcessed() + " Job status: " + status.getStatus());
-    }
-
-
-    public static class ContentFilterTestServlet extends HttpServlet {
-        @Override
-        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
-                IOException {
-            response.setContentType("text/html; charset=utf-8");
-            //response.setHeader("Keep-Alive", "timeout=5, max=100");
-            response.setStatus(HttpServletResponse.SC_OK);
-            String page = request.getParameter("page");
-            page = (page == null) ? "unkown" : page;
-            response.getWriter().println("<html><head><title></title></head><body><h1>You are now on page " + page + " </h1>");
-            if ("1".equals(page)) {
-                //Only page 1 will contain the keyword "expired"
-                response.getWriter().println("<h1>Page 1 has expired. bye bye</h1>");
-            }
-            response.getWriter().println("</body>");
-            response.getWriter().flush();
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/MockSessionWebService.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/MockSessionWebService.java
deleted file mode 100644
index 3b6d799..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/MockSessionWebService.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import java.io.*;
-import java.util.*;
-
-/** Mock web service that requires session authentication */
-public class MockSessionWebService
-{
-  Server server;
-  SessionWebServlet servlet;
-    
-  public MockSessionWebService(int numContentDocs, String userName, String password)
-  {
-    server = new Server(new QueuedThreadPool(100));
-    ServerConnector connector = new ServerConnector(server);
-    connector.setPort(8191);
-    server.addConnector(connector);
-    servlet = new SessionWebServlet(numContentDocs,userName,password);
-    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    context.setInitParameter("org.eclipse.jetty.servlet.SessionIdPathParameterName","none");
-    context.setContextPath("/web");
-    server.setHandler(context);
-    context.addServlet(new ServletHolder(servlet), "/*");
-  }
-    
-  public void start() throws Exception
-  {
-    server.start();
-  }
-    
-  public void stop() throws Exception
-  {
-    server.stop();
-  }
-
-  
-  public static class SessionWebServlet extends HttpServlet
-  {
-    protected final int contentPageCount;
-    protected final String loginUser;
-    protected final String loginPassword;
-    
-    public SessionWebServlet(int contentPageCount, String loginUser, String loginPassword)
-    {
-      this.contentPageCount = contentPageCount;
-      this.loginUser = loginUser;
-      this.loginPassword = loginPassword;
-    }
-    
-    @Override
-    public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException
-    {
-      try {
-        // This mock web service resolves the following urls:
-        // /index.html (an index of all N content pages)
-        // /protectedcontent.html?id=N  (N content pages)
-        // /loginpage.html (the login page, rendered either as a form,
-        //    or as a redirection back to the content page, or as a redirection to the index page)
-        
-        // Get path part of request URL
-        String pathPart = req.getPathInfo();
-        if (pathPart == null)
-        {
-          // 404
-          generateMissingPageResponse(res);
-        }
-        else
-        {
-          if (pathPart.equals("/loginpage.html"))
-          {
-            // Login page logic
-            String id = req.getParameter("id");
-            Integer idNumber;
-            if (id == null)
-              idNumber = null;
-            else
-              idNumber = new Integer(id);
-            
-            HttpSession session = req.getSession();
-            Object loginInfo = session.getAttribute("logininfo");
-            if (loginInfo != null && (loginInfo instanceof Boolean) && (((Boolean)loginInfo).booleanValue()))
-            {
-              // Already logged in: redirect back to content or index
-              generateLoginRedirectPage(res,idNumber);
-            }
-            else
-            {
-              String userName = req.getParameter("user");
-              String password = req.getParameter("password");
-            
-              if (userName == null || password == null || !loginUser.equals(userName) || !loginPassword.equals(password))
-              {
-                generateLoginFormPage(res,idNumber);
-              }
-              else
-              {
-                // Login succeeded, so set the session properly
-                session.setAttribute("logininfo",new Boolean(true));
-                generateLoginRedirectPage(res,idNumber);
-              }
-            }
-          }
-          else if (pathPart.equals("/protectedcontent.html"))
-          {
-            // Content page logic
-            String id = req.getParameter("id");
-            if (id == null)
-            {
-              generateBadArgumentResponse(res);
-            }
-            else
-            {
-              Integer idNumber = new Integer(id);
-              if (idNumber.intValue() >= contentPageCount)
-              {
-                generateMissingPageResponse(res);
-              }
-              else
-              {
-                HttpSession session = req.getSession();
-                Object loginInfo = session.getAttribute("logininfo");
-                if (loginInfo != null && (loginInfo instanceof Boolean) && (((Boolean)loginInfo).booleanValue()))
-                {
-                  // Return content
-                  generateContentDisplayPage(res,idNumber.intValue());
-                }
-                else
-                {
-                  // Redirect to login page
-                  generateContentRedirectPage(res,idNumber.intValue());
-                }
-              }
-            }
-          }
-          else if (pathPart.equals("/index.html"))
-          {
-            // Index logic
-            HttpSession session = req.getSession();
-            Object loginInfo = session.getAttribute("logininfo");
-            if (loginInfo != null && (loginInfo instanceof Boolean) && (((Boolean)loginInfo).booleanValue()))
-            {
-              // Return content
-              generateIndexDisplayPage(res,contentPageCount);
-            }
-            else
-            {
-              generateIndexRedirectPage(res);
-            }
-          }
-          else
-          {
-            generateMissingPageResponse(res);
-          }
-        }
-      }
-      catch (IOException e)
-      {
-        e.printStackTrace();
-        throw e;
-      }
-    }
-
-    protected static void generateMissingPageResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.sendError(HttpServletResponse.SC_NOT_FOUND);
-    }
-    
-    protected static void generateBadArgumentResponse(HttpServletResponse res)
-      throws IOException
-    {
-      res.sendError(HttpServletResponse.SC_BAD_REQUEST);
-    }
-    
-    protected static void generateLoginRedirectPage(HttpServletResponse res, Integer returnID)
-      throws IOException
-    {
-      String redirectTarget;
-      if (returnID == null)
-        redirectTarget = "/web/index.html";
-      else
-        redirectTarget = "/web/protectedcontent.html?id="+returnID;
-      res.sendRedirect(redirectTarget);
-    }
-    
-    protected static void generateLoginFormPage(HttpServletResponse res, Integer returnID)
-      throws IOException
-    {
-      String actionURI = "/web/loginpage.html";
-      if (returnID != null)
-        actionURI += "?id="+returnID;
-      res.setStatus(HttpServletResponse.SC_OK);
-      res.setContentType("text/html; charset=utf-8");
-
-      res.getWriter().printf(Locale.ROOT, "<html>\n");
-      res.getWriter().printf(Locale.ROOT, "  <body>\n");
-      res.getWriter().printf(Locale.ROOT, "    <form name=\"login\" action=\""+actionURI+"\">\n");
-      res.getWriter().printf(Locale.ROOT, "      User name: <input type=\"text\" name=\"user\" value=\"\" size=\"20\"/>\n");
-      res.getWriter().printf(Locale.ROOT, "      Password: <input type=\"password\" name=\"password\" value=\"\" size=\"20\"/>\n");
-      res.getWriter().printf(Locale.ROOT, "      <input type=\"submit\"/>\n");
-      res.getWriter().printf(Locale.ROOT, "    </form>\n");
-      res.getWriter().printf(Locale.ROOT, "  </body>\n");
-      res.getWriter().printf(Locale.ROOT, "</html>\n");
-      
-      res.getWriter().flush();
-
-    }
-    
-    protected static void generateContentRedirectPage(HttpServletResponse res, int itemNumber)
-      throws IOException
-    {
-      String redirectTarget = "/web/loginpage.html?id="+itemNumber;
-      res.sendRedirect(redirectTarget);
-    }
-
-    protected static void generateContentDisplayPage(HttpServletResponse res, int itemNumber)
-      throws IOException
-    {
-      res.setStatus(HttpServletResponse.SC_OK);
-      res.setContentType("text/html; charset=utf-8");
-
-      res.getWriter().printf(Locale.ROOT, "<html>\n");
-      res.getWriter().printf(Locale.ROOT, "  <body>This is the document content for item "+itemNumber+"</body>");
-      res.getWriter().printf(Locale.ROOT, "</html>\n");
-      
-      res.getWriter().flush();
-    }
-    
-    protected static void generateIndexRedirectPage(HttpServletResponse res)
-      throws IOException
-    {
-      String redirectTarget = "/web/loginpage.html";
-      res.sendRedirect(redirectTarget);
-    }
-    
-    protected static void generateIndexDisplayPage(HttpServletResponse res, int countItems)
-      throws IOException
-    {
-      res.setStatus(HttpServletResponse.SC_OK);
-      res.setContentType("text/html; charset=utf-8");
-
-      res.getWriter().printf(Locale.ROOT, "<html>\n");
-      res.getWriter().printf(Locale.ROOT, "  <body>\n");
-
-      for (int i = 0; i < countItems; i++)
-      {
-        generateContentLink(res,i);
-      }
-      
-      res.getWriter().printf(Locale.ROOT, "  </body>\n");
-      res.getWriter().printf(Locale.ROOT, "</html>\n");
-      res.getWriter().flush();
-
-    }
-    
-    protected static void generateContentLink(HttpServletResponse res, int itemNumber)
-      throws IOException
-    {
-      res.getWriter().printf(Locale.ROOT, "    <a href=\"/web/protectedcontent.html?id="+itemNumber+"\">Item "+itemNumber+"</a>\n");
-    }
-
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/MockWebService.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/MockWebService.java
deleted file mode 100644
index 569c84c..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/MockWebService.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.*;
-import java.util.*;
-
-/** Mock wiki service */
-public class MockWebService
-{
-  Server server;
-  WebServlet servlet;
-  
-  public MockWebService(int docsPerLevel)
-  {
-    this(docsPerLevel, 10, false);
-  }
-  
-  public MockWebService(int docsPerLevel, int maxLevels, boolean generateBadPages)
-  {
-    server = new Server(new QueuedThreadPool(100));
-    ServerConnector connector = new ServerConnector(server);
-    connector.setPort(8191);
-    server.addConnector(connector);
-    servlet = new WebServlet(docsPerLevel, maxLevels, generateBadPages);
-    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    context.setContextPath("/web");
-    server.setHandler(context);
-    context.addServlet(new ServletHolder(servlet), "/gen.php");
-  }
-    
-  public void start() throws Exception
-  {
-    server.start();
-  }
-    
-  public void stop() throws Exception
-  {
-    server.stop();
-  }
-
-  
-  public static class WebServlet extends HttpServlet
-  {
-    final int docsPerLevel;
-    final int maxLevels;
-    final boolean generateBadPages;
-    
-    public WebServlet(int docsPerLevel, int maxLevels, boolean generateBadPages)
-    {
-      this.docsPerLevel = docsPerLevel;
-      this.maxLevels = maxLevels;
-      this.generateBadPages = generateBadPages;
-    }
-    
-    @Override
-    public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException
-    {
-      try {
-        String resourceName = null;
-        
-        String site = req.getParameter("site");     // Site ID
-        if (site == null)
-          throw new IOException("Site ID parameter must be set");
-
-        String level = req.getParameter("level");   // Level #
-        if (site == null)
-          throw new IOException("Level number parameter must be set");
-
-        String item = req.getParameter("item");    // Item #
-        if (item == null)
-          throw new IOException("Item number parameter must be set");
-
-        int theLevel;
-        try
-        {
-          theLevel = Integer.parseInt(level);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new IOException("Level number must be a number: "+level);
-        }
-        if (theLevel >= maxLevels)
-          throw new IOException("Level number too big.");
-
-        int theItem;
-        try
-        {
-          theItem = Integer.parseInt(item);
-        }
-        catch (NumberFormatException e)
-        {
-          throw new IOException("Item number must be a number: "+item);
-        }
-
-        // Formulate the response.
-        // First, calculate the number of docs on the current level
-        int maxDocsThisLevel = 1;
-        for (int i = 0 ; i < theLevel ; i++)
-        {
-          maxDocsThisLevel *= docsPerLevel;
-        }
-        if (theItem >= maxDocsThisLevel)
-          // Not legal
-          throw new IOException("Doc number too big: "+theItem+" ; level "+theLevel+" ; docsPerLevel "+docsPerLevel);
-
-        // Generate the page
-        if (generateBadPages && (theItem % 2) == 1)
-        {
-          // Generate a bad page.  This is a page with a non-200 return code, and with some content
-          // > 1024 characters
-          res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-          res.getWriter().printf(Locale.ROOT, "This is the error message for a 401 page.");
-          for (int i = 0; i < 1000; i++)
-          {
-            res.getWriter().printf(Locale.ROOT, " Error message # "+i);
-          }
-        }
-        else
-        {
-          res.setStatus(HttpServletResponse.SC_OK);
-          res.setContentType("text/html; charset=utf-8");
-          res.getWriter().printf(Locale.ROOT, "<html>\n");
-          res.getWriter().printf(Locale.ROOT, "  <body>\n");
-
-          res.getWriter().printf(Locale.ROOT, "This is doc number "+theItem+" and level number "+theLevel+" in site "+site+"\n");
-
-          // Generate links to all parents
-          int parentLevel = theLevel;
-          int parentItem = theItem;
-          while (parentLevel > 0)
-          {
-            parentLevel--;
-            parentItem /= docsPerLevel;
-            generateLink(res,site,parentLevel,parentItem);
-          }
-          
-          if (theLevel < maxLevels-1)
-          {
-            // Generate links to direct children
-            for (int i = 0; i < docsPerLevel; i++)
-            {
-              int docNumber = i + theItem * docsPerLevel;
-              generateLink(res,site,theLevel+1,docNumber);
-            }
-          }
-          
-          // Generate some limited cross-links to other items at this level
-          for (int i = theItem; i < maxDocsThisLevel && i < theItem + docsPerLevel; i++)
-          {
-            generateLink(res,site,theLevel,i);
-          }
-          
-          res.getWriter().printf(Locale.ROOT, "  </body>\n");
-          res.getWriter().printf(Locale.ROOT, "</html>\n");
-        }
-        res.getWriter().flush();
-      }
-      catch (IOException e)
-      {
-        e.printStackTrace();
-        throw e;
-      }
-    }
-    
-    protected void generateLink(HttpServletResponse res, String site, int level, int item)
-      throws IOException
-    {
-      res.getWriter().printf(Locale.ROOT, "    <a href=\"http://localhost:8191/web/gen.php?site="+site+"&level="+level+"&item="+item+"\"/>\n");
-    }
-
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationHSQLDBUI.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index c1073b5..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the rest of the tabs - Email first
-    testerInstance.clickTab("Email");
-    testerInstance.setValue("email", "foo@bar.com");
-    // Robots
-    testerInstance.clickTab("Robots");
-    testerInstance.selectValue("robotsusage", "none");
-    testerInstance.selectValue("metarobotstagsusage", "none");
-    // Bandwidth
-    testerInstance.clickTab("Bandwidth");
-    // Access Credentials
-    testerInstance.clickTab("Access Credentials");
-    // Certificates
-    testerInstance.clickTab("Certificates");
-    testerInstance.clickCheckbox("all_trust");
-    testerInstance.clickButton("Add");
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-
-    testerInstance.clickButton("Continue");
-
-    // HopFilters tab
-    testerInstance.clickTab("Hop Filters");
-    // Seeds tab
-    testerInstance.clickTab("Seeds");
-    testerInstance.setValue("s0_seeds", "http://www.cnn.com");
-    // Canonicalization tab
-    testerInstance.clickTab("Canonicalization");
-    testerInstance.clickButton("Add");
-    // Security tab
-    testerInstance.clickTab("Security");
-    // URL Mapping tab
-    testerInstance.clickTab("URL Mappings");
-    testerInstance.setValue("s0_rssmatch", "foo");
-    testerInstance.setValue("s0_rssmap", "bar");
-    testerInstance.clickButton("Add");
-    testerInstance.clickButton("Remove");
-    // Metadata tab
-    testerInstance.clickTab("Metadata");
-    // Inclusions tab
-    testerInstance.clickTab("Inclusions");
-    testerInstance.clickCheckbox("s0_matchinghosts");
-    // Exclusions tab
-    testerInstance.clickTab("Exclusions");
-
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/SessionLoginHSQLDBIT.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/SessionLoginHSQLDBIT.java
deleted file mode 100644
index befdf67..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/SessionLoginHSQLDBIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Web connector session login test */
-public class SessionLoginHSQLDBIT extends BaseITHSQLDB
-{
-
-  protected SessionTester tester;
-  protected MockSessionWebService webService = null;
-  
-  public SessionLoginHSQLDBIT()
-  {
-    tester = new SessionTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWebService()
-    throws Exception
-  {
-    webService = new MockSessionWebService(100,"foo","bar");
-    webService.start();
-  }
-  
-  @After
-  public void shutdownWebService()
-    throws Exception
-  {
-    if (webService != null)
-      webService.stop();
-  }
-
-  @Test
-  public void sessionCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/SessionTester.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/SessionTester.java
deleted file mode 100644
index 0e1640a..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/SessionTester.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector;
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConfig;
-
-/** Run a session-based crawl */
-public class SessionTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public SessionTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the web connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("Web Connection");
-    conn.setDescription("Web Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector");
-    conn.setMaxConnections(100);
-    ConfigParams cp = conn.getConfigParams();
-    
-    cp.setParameter(WebcrawlerConfig.PARAMETER_EMAIL,"someone@somewhere.com");
-    cp.setParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE,"none");
-    
-    // Set session auth settings
-    ConfigurationNode accessCredential = new ConfigurationNode(WebcrawlerConfig.NODE_ACCESSCREDENTIAL);
-    accessCredential.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_SESSION);
-    accessCredential.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,"/web/");
-    
-    // Add auth pages to accessCredential node
-    
-    // Redirection to login page
-    ConfigurationNode redirectToLogin = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPAGE);
-    redirectToLogin.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,"/protectedcontent\\.html\\?");
-    redirectToLogin.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_REDIRECTION);
-    redirectToLogin.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,"/loginpage\\.html\\?");
-    accessCredential.addChild(accessCredential.getChildCount(),redirectToLogin);
-    
-    // Redirection to login page from index
-    ConfigurationNode redirectFromIndex = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPAGE);
-    redirectFromIndex.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,"/index\\.html$");
-    redirectFromIndex.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_REDIRECTION);
-    redirectFromIndex.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,"/loginpage\\.html$");
-    accessCredential.addChild(accessCredential.getChildCount(),redirectFromIndex);
-
-    // Login page
-    ConfigurationNode loginPage = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPAGE);
-    loginPage.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,"/loginpage\\.html(\\?|$)");
-    loginPage.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_FORM);
-    loginPage.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,"");
-    // Set credentials
-    ConfigurationNode userParameter = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPARAMETER);
-    userParameter.setAttribute(WebcrawlerConfig.ATTR_NAMEREGEXP,"user");
-    userParameter.setAttribute(WebcrawlerConfig.ATTR_VALUE,"foo");
-    loginPage.addChild(loginPage.getChildCount(),userParameter);
-    ConfigurationNode passwordParameter = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPARAMETER);
-    passwordParameter.setAttribute(WebcrawlerConfig.ATTR_NAMEREGEXP,"password");
-    passwordParameter.setAttribute(WebcrawlerConfig.ATTR_VALUE,"bar");
-    loginPage.addChild(loginPage.getChildCount(),passwordParameter);
-    accessCredential.addChild(accessCredential.getChildCount(),loginPage);
-
-    // Redirection from login page to content
-    ConfigurationNode redirectFromLogin = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPAGE);
-    redirectFromLogin.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,"/loginpage\\.html\\?");
-    redirectFromLogin.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_REDIRECTION);
-    redirectFromLogin.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,"/protectedcontent\\.html\\?");
-    accessCredential.addChild(accessCredential.getChildCount(),redirectFromLogin);
-
-    // Redirection from login page to index
-    ConfigurationNode redirectToIndexFromLogin = new ConfigurationNode(WebcrawlerConfig.NODE_AUTHPAGE);
-    redirectToIndexFromLogin.setAttribute(WebcrawlerConfig.ATTR_URLREGEXP,"/loginpage\\.html$");
-    redirectToIndexFromLogin.setAttribute(WebcrawlerConfig.ATTR_TYPE,WebcrawlerConfig.ATTRVALUE_REDIRECTION);
-    redirectToIndexFromLogin.setAttribute(WebcrawlerConfig.ATTR_MATCHREGEXP,"/index\\.html$");
-    accessCredential.addChild(accessCredential.getChildCount(),redirectToIndexFromLogin);
-
-    cp.addChild(cp.getChildCount(),accessCredential);
-    
-    // Now, save
-    mgr.save(conn);
-
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("Web Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    
-    // Set up the seed
-    SpecificationNode sn = new SpecificationNode(WebcrawlerConfig.NODE_SEEDS);
-    sn.setValue("http://localhost:8191/web/index.html\n");
-    ds.addChild(ds.getChildCount(),sn);
-    
-    sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDES);
-    sn.setValue(".*\n");
-    ds.addChild(ds.getChildCount(),sn);
-    
-    sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDESINDEX);
-    sn.setValue(".*\n");
-    ds.addChild(ds.getChildCount(),sn);
-
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it completes.
-    long startTime = System.currentTimeMillis();
-    jobManager.manualStart(job.getID());
-    instance.waitJobInactiveNative(jobManager,job.getID(),600000L);
-    System.err.println("Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-    // Check to be sure we actually processed the right number of documents.
-    JobStatus status = jobManager.getStatus(job.getID());
-    if (status.getDocumentsProcessed() != 101)
-    {
-      throw new ManifoldCFException("Wrong number of documents processed - expected 101, saw "+new Long(status.getDocumentsProcessed()).toString());
-    }
-    
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),600000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingHSQLDBLT.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingHSQLDBLT.java
deleted file mode 100644
index 0f04392..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingHSQLDBLT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class ThrottlingHSQLDBLT extends BaseITHSQLDB
-{
-
-  protected ThrottlingTester tester;
-  protected MockWebService webService = null;
-  
-  public ThrottlingHSQLDBLT()
-  {
-    tester = new ThrottlingTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWebService()
-    throws Exception
-  {
-    webService = new MockWebService(10,2,true);
-    webService.start();
-  }
-  
-  @After
-  public void shutdownWebService()
-    throws Exception
-  {
-    if (webService != null)
-      webService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingPostgresqlLT.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingPostgresqlLT.java
deleted file mode 100644
index 12cd6a0..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingPostgresqlLT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class ThrottlingPostgresqlLT extends BaseITPostgresql
-{
-
-  protected ThrottlingTester tester;
-  protected MockWebService webService = null;
-  
-  public ThrottlingPostgresqlLT()
-  {
-    tester = new ThrottlingTester(mcfInstance);
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWebService()
-    throws Exception
-  {
-    webService = new MockWebService(10,2,true);
-    webService.start();
-  }
-  
-  @After
-  public void shutdownWebService()
-    throws Exception
-  {
-    if (webService != null)
-      webService.stop();
-  }
-
-  @Test
-  public void bigCrawl()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-}
diff --git a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingTester.java b/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingTester.java
deleted file mode 100644
index e00039a..0000000
--- a/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/ThrottlingTester.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.webcrawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector;
-import org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConfig;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a repeated 100-document crawl with throttling */
-public class ThrottlingTester
-{
-  protected org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance;
-  
-  public ThrottlingTester(org.apache.manifoldcf.crawler.tests.ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    // Hey, we were able to install the connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("Web Connection");
-    conn.setDescription("Web Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector");
-    conn.setMaxConnections(100);
-    ConfigParams cp = conn.getConfigParams();
-    
-    cp.setParameter(WebcrawlerConfig.PARAMETER_EMAIL,"someone@somewhere.com");
-    cp.setParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE,"none");
-    
-    // Throttling
-    ConfigurationNode cn = new ConfigurationNode(WebcrawlerConfig.NODE_BINDESC);
-    cn.setAttribute(WebcrawlerConfig.ATTR_BINREGEXP,"");
-    
-    ConfigurationNode con = new ConfigurationNode(WebcrawlerConfig.NODE_MAXCONNECTIONS);
-    con.setAttribute(WebcrawlerConfig.ATTR_VALUE,"10");
-    cn.addChild(cn.getChildCount(),con);
-    
-    ConfigurationNode maxKB = new ConfigurationNode(WebcrawlerConfig.NODE_MAXKBPERSECOND);
-    maxKB.setAttribute(WebcrawlerConfig.ATTR_VALUE,"128");
-    cn.addChild(cn.getChildCount(),maxKB);
-    
-    ConfigurationNode maxFetches = new ConfigurationNode(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE);
-    maxFetches.setAttribute(WebcrawlerConfig.ATTR_VALUE,"120");
-    cn.addChild(cn.getChildCount(),maxFetches);
-    
-    cp.addChild(cp.getChildCount(),cn);
-    
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("Web Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_NEVERDELETE);
-
-    // Now, set up the document specification.
-    Specification ds = job.getSpecification();
-    
-    // Set up 100 seeds
-    SpecificationNode sn = new SpecificationNode(WebcrawlerConfig.NODE_SEEDS);
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < 50 ; i++)
-    {
-      sb.append("http://localhost:8191/web/gen.php?site="+i+"&level=0&item=0\n");
-    }
-    sn.setValue(sb.toString());
-    ds.addChild(ds.getChildCount(),sn);
-    
-    sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDES);
-    sn.setValue(".*\n");
-    ds.addChild(ds.getChildCount(),sn);
-    
-    sn = new SpecificationNode(WebcrawlerConfig.NODE_INCLUDESINDEX);
-    sn.setValue(".*\n");
-    ds.addChild(ds.getChildCount(),sn);
-
-    // Save the job.
-    jobManager.save(job);
-
-    for (int i = 0; i < 100; i++)
-    {
-      System.err.println("Iteration # "+i);
-      // Now, start the job, and wait until it completes.
-      long startTime = System.currentTimeMillis();
-      jobManager.manualStart(job.getID());
-      try
-      {
-        instance.waitJobInactiveNative(jobManager,job.getID(),900000L);
-      }
-      catch (ManifoldCFException e)
-      {
-        System.err.println("Halting for inspection");
-        Thread.sleep(9000000L);
-        throw e;
-      }
-      System.err.println(" Crawl required "+new Long(System.currentTimeMillis()-startTime).toString()+" milliseconds");
-
-      // Check to be sure we actually processed the right number of documents.
-      JobStatus status = jobManager.getStatus(job.getID());
-      System.err.println(" "+new Long(status.getDocumentsProcessed())+" documents processed");
-    }
-    
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),900000L);
-      
-    // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-  }
-  
-}
diff --git a/connectors/webcrawler/pom.xml b/connectors/webcrawler/pom.xml
deleted file mode 100644
index c4de54e..0000000
--- a/connectors/webcrawler/pom.xml
+++ /dev/null
@@ -1,386 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-web-connector</artifactId>
-  <name>ManifoldCF - Connectors - Web</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html.vm</include>
-          <include>**/*.js.vm</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-	
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-    </dependency>
-
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>${mockito.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/connectors/wiki/.gitignore b/connectors/wiki/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/connectors/wiki/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/connectors/wiki/build.xml b/connectors/wiki/build.xml
deleted file mode 100644
index f10a52a..0000000
--- a/connectors/wiki/build.xml
+++ /dev/null
@@ -1,40 +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.

--->

-

-<project name="wiki" default="all">

-

-    <property environment="env"/>

-    <condition property="mcf-dist" value="${env.MCFDISTPATH}">

-        <isset property="env.MCFDISTPATH"/>

-    </condition>

-    <property name="abs-dist" location="../../dist"/>

-    <condition property="mcf-dist" value="${abs-dist}">

-        <not>

-            <isset property="env.MCFDISTPATH"/>

-        </not>

-    </condition>

-

-    <import file="${mcf-dist}/connector-build.xml"/>

-

-    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">

-        <antcall target="general-add-repository-connector">

-            <param name="connector-label" value="Wiki"/>

-            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector"/>

-        </antcall>

-    </target>

-

-</project>

diff --git a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/BaseProcessingContext.java b/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/BaseProcessingContext.java
deleted file mode 100644
index fabb2f6..0000000
--- a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/BaseProcessingContext.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import org.xml.sax.Attributes;
-
-import org.apache.manifoldcf.agents.common.XMLStream;
-import org.apache.manifoldcf.agents.common.XMLContext;
-
-/** Abstract class representing an api/query context.  Create one of these
-* and pass it into the general parse for the desired response parsing behavior.
-*/
-public abstract class BaseProcessingContext extends XMLContext
-{
-  public BaseProcessingContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-  {
-    super(theStream,namespaceURI,localName,qName,atts);
-  }
-
-  public BaseProcessingContext(XMLStream theStream)
-  {
-    super(theStream);
-  }
-
-  @Override
-  protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return super.beginTag(namespaceURI,localName,qName,atts);
-  }
-  
-  @Override
-  protected void endTag()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    super.endTag();
-  }
-    
-  /** Process this data */
-  protected void process()
-    throws ManifoldCFException
-  {
-  }
-}
diff --git a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/Messages.java b/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/Messages.java
deleted file mode 100644
index 58edaa5..0000000
--- a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/Messages.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki;
-
-import java.util.Locale;
-import java.util.Map;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-
-public class Messages extends org.apache.manifoldcf.ui.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.crawler.connectors.wiki.common";
-  public static final String DEFAULT_PATH_NAME="org.apache.manifoldcf.crawler.connectors.wiki";
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  // Resource output
-  
-  public static void outputResource(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResource(output,Messages.class,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-  
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      substitutionParameters,mapToUpperCase);
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Locale locale, String resourceKey,
-    Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    outputResourceWithVelocity(output,Messages.class,DEFAULT_BUNDLE_NAME,DEFAULT_PATH_NAME,locale,resourceKey,
-      contextObjects);
-  }
-  
-}
-
diff --git a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/SingleLevelContext.java b/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/SingleLevelContext.java
deleted file mode 100644
index ca43ccb..0000000
--- a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/SingleLevelContext.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import org.xml.sax.Attributes;
-
-import org.apache.manifoldcf.agents.common.XMLStream;
-import org.apache.manifoldcf.agents.common.XMLContext;
-
-/** Abstract class representing an api/query context.  Create one of these
-* and pass it into the general parse for the desired response parsing behavior.
-*/
-public abstract class SingleLevelContext extends BaseProcessingContext
-{
-  protected String nodeName;
-  
-  public SingleLevelContext(XMLStream theStream, String nodeName)
-  {
-    super(theStream);
-    this.nodeName = nodeName;
-  }
-
-  public SingleLevelContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts, String nodeName)
-  {
-    super(theStream,namespaceURI,localName,qName,atts);
-    this.nodeName = nodeName;
-  }
-
-  @Override
-  protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (qName.equals(nodeName))
-      return createChild(namespaceURI,localName,qName,atts);
-    return super.beginTag(namespaceURI,localName,qName,atts);
-  }
-  
-  protected abstract BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts);
-  
-  @Override
-  protected void endTag()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    XMLContext theContext = theStream.getContext();
-    String theTag = theContext.getQname();
-
-    if (theTag.equals(nodeName))
-    {
-      BaseProcessingContext child = (BaseProcessingContext)theContext;
-      finishChild(child);
-    }
-    else
-      super.endTag();
-  }
-  
-  protected abstract void finishChild(BaseProcessingContext child)
-    throws ManifoldCFException;
-  
-}
diff --git a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/SingleLevelErrorContext.java b/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/SingleLevelErrorContext.java
deleted file mode 100644
index 3ee9f51..0000000
--- a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/SingleLevelErrorContext.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import org.xml.sax.Attributes;
-
-import org.apache.manifoldcf.agents.common.XMLStream;
-import org.apache.manifoldcf.agents.common.XMLContext;
-
-/** Abstract class representing an api/query context.  Create one of these
-* and pass it into the general parse for the desired response parsing behavior.
-*/
-public abstract class SingleLevelErrorContext extends BaseProcessingContext
-{
-  protected static final String ERROR_NODE = "error";
-  protected static final String ERROR_TYPE_LOGIN_NEEDED = "readapidenied";
-  
-  protected String nodeName;
-  protected String errorType = null;
-  
-  public SingleLevelErrorContext(XMLStream theStream, String nodeName)
-  {
-    super(theStream);
-    this.nodeName = nodeName;
-  }
-
-  public SingleLevelErrorContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts, String nodeName)
-  {
-    super(theStream,namespaceURI,localName,qName,atts);
-    this.nodeName = nodeName;
-  }
-
-  public boolean isLoginRequired()
-  {
-    return errorType != null && errorType.equals(ERROR_TYPE_LOGIN_NEEDED);
-  }
-  
-  @Override
-  protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (qName.equals(nodeName))
-      return createChild(namespaceURI,localName,qName,atts);
-    else if (qName.equals(ERROR_NODE))
-    {
-      // Parse error
-      errorType = atts.getValue("code");
-    }
-    return super.beginTag(namespaceURI,localName,qName,atts);
-  }
-  
-  protected abstract BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts);
-  
-  @Override
-  protected void endTag()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    XMLContext theContext = theStream.getContext();
-    String theTag = theContext.getQname();
-
-    if (theTag.equals(nodeName))
-    {
-      BaseProcessingContext child = (BaseProcessingContext)theContext;
-      finishChild(child);
-    }
-    else
-      super.endTag();
-  }
-  
-  protected abstract void finishChild(BaseProcessingContext child)
-    throws ManifoldCFException;
-  
-}
diff --git a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConfig.java b/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConfig.java
deleted file mode 100644
index 8993c3d..0000000
--- a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConfig.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki;
-
-
-/** Parameters and output data for Wiki repository connector.
-*/
-public class WikiConfig
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Configuration parameters
-
-  /** Protocol */
-  public static final String PARAM_PROTOCOL = "Server protocol";
-  /** Server name */
-  public static final String PARAM_SERVER = "Server name";
-  /** Port */
-  public static final String PARAM_PORT = "Server port";
-  /** Path */
-  public static final String PARAM_PATH = "Server path";
-  
-  /** Email */
-  public static final String PARAM_EMAIL = "Email";
-  
-  // Login info
-  public static final String PARAM_LOGIN = "serverlogin";
-  public static final String PARAM_PASSWORD = "serverpass";
-  public static final String PARAM_DOMAIN = "serverdomain";
-
-  // Access credentials
-  public static final String PARAM_ACCESSREALM = "accessrealm";
-  public static final String PARAM_ACCESSUSER = "accessuser";
-  public static final String PARAM_ACCESSPASSWORD = "accesspassword";
-  
-  // Proxy info
-  public static final String PARAM_PROXYHOST = "Proxy host";
-  public static final String PARAM_PROXYPORT = "Proxy port";
-  public static final String PARAM_PROXYDOMAIN = "Proxy domain";
-  public static final String PARAM_PROXYUSERNAME = "Proxy username";
-  public static final String PARAM_PROXYPASSWORD = "Proxy password";
-
-  // Document specification
-
-  /** Namespace and title prefix */
-  public static final String NODE_NAMESPACE_TITLE_PREFIX = "namespaceandprefix";
-  /** Namespace attribute */
-  public static final String ATTR_NAMESPACE = "namespace";
-  /** Title prefix attribute */
-  public static final String ATTR_TITLEPREFIX = "titleprefix";
-}
diff --git a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java b/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java
deleted file mode 100644
index 9e81485..0000000
--- a/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java
+++ /dev/null
@@ -1,4762 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.common.*;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-
-import org.xml.sax.Attributes;
-
-import org.apache.manifoldcf.agents.common.XMLStream;
-import org.apache.manifoldcf.agents.common.XMLContext;
-import org.apache.manifoldcf.agents.common.XMLStringContext;
-import org.apache.manifoldcf.agents.common.XMLFileContext;
-
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpEntity;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.entity.ContentType;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-import org.apache.http.ParseException;
-
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-
-
-import java.util.concurrent.TimeUnit;
-
-
-/** This is the repository connector for a wiki.
-*/
-public class WikiConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /**
-   * Deny access token for default authority
-   */
-  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
-
-  // Activities that we know about
-  
-  /** Fetch activity */
-  protected final static String ACTIVITY_FETCH = "fetch document";
-
-  /** Activities list */
-  protected static final String[] activitiesList = new String[]{ACTIVITY_FETCH};
-
-  /** Has setup been called? */
-  protected boolean hasBeenSetup = false;
-  
-  /** Server name */
-  protected String server = null;
-  
-  /** Base URL */
-  protected String baseURL = null;
-  
-  /** The user-agent for this connector instance */
-  protected String userAgent = null;
-
-  // Server login parameters
-  protected String serverLogin = null;
-  protected String serverPass = null;
-  protected String serverDomain = null;
-  
-  // Basic auth parameters
-  protected String accessRealm = null;
-  protected String accessUser = null;
-  protected String accessPassword = null;
-  
-  // Proxy parameters
-  protected String proxyHost = null;
-  protected String proxyPort = null;
-  protected String proxyDomain = null;
-  protected String proxyUsername = null;
-  protected String proxyPassword = null;
-  
-  /** Connection management */
-  protected HttpClientConnectionManager connectionManager = null;
-
-  protected HttpClient httpClient = null;
-  
-  // Current host name
-  private static String currentHost = null;
-  static
-  {
-    // Find the current host name
-    try
-    {
-      java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
-
-      // Get hostname
-      currentHost = addr.getHostName();
-    }
-    catch (java.net.UnknownHostException e)
-    {
-    }
-  }
-
-  /** Constructor.
-  */
-  public WikiConnector()
-  {
-  }
-
-  /** List the activities we might report on.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return activitiesList;
-  }
-
-  /** For any given document, list the bins that it is a member of.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    // Return the host name
-    return new String[]{server};
-  }
-
-  /** Connect.
-  *@param configParameters is the set of configuration parameters, which
-  * in this case describe the target appliance, basic auth configuration, etc.
-  */
-  @Override
-  public void connect(ConfigParams configParameters)
-  {
-    super.connect(configParameters);
-
-    server = params.getParameter(WikiConfig.PARAM_SERVER);
-    serverLogin = params.getParameter(WikiConfig.PARAM_LOGIN);
-    serverPass = params.getObfuscatedParameter(WikiConfig.PARAM_PASSWORD);
-    serverDomain = params.getParameter(WikiConfig.PARAM_DOMAIN);
-    accessRealm = params.getParameter(WikiConfig.PARAM_ACCESSREALM);
-    accessUser = params.getParameter(WikiConfig.PARAM_ACCESSUSER);
-    accessPassword = params.getObfuscatedParameter(WikiConfig.PARAM_ACCESSPASSWORD);
-
-    proxyHost = params.getParameter(WikiConfig.PARAM_PROXYHOST);
-    proxyPort = params.getParameter(WikiConfig.PARAM_PROXYPORT);
-    proxyDomain = params.getParameter(WikiConfig.PARAM_PROXYDOMAIN);
-    proxyUsername = params.getParameter(WikiConfig.PARAM_PROXYUSERNAME);
-    proxyPassword = params.getObfuscatedParameter(WikiConfig.PARAM_PROXYPASSWORD);
-  }
-
-  protected void getSession()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (hasBeenSetup == false)
-    {
-      String emailAddress = params.getParameter(WikiConfig.PARAM_EMAIL);
-      if (emailAddress != null)
-        userAgent = "Mozilla/5.0 (ApacheManifoldCFWikiReader; "+((emailAddress==null)?"":emailAddress)+")";
-      else
-        userAgent = null;
-
-      String protocol = params.getParameter(WikiConfig.PARAM_PROTOCOL);
-      if (protocol == null || protocol.length() == 0)
-        protocol = "http";
-      String portString = params.getParameter(WikiConfig.PARAM_PORT);
-      if (portString == null || portString.length() == 0)
-        portString = null;
-      String path = params.getParameter(WikiConfig.PARAM_PATH);
-      if (path == null)
-        path = "/w";
-      
-      baseURL = protocol + "://" + server + ((portString!=null)?":" + portString:"") + path + "/api.php?format=xml&";
-
-      int socketTimeout = 900000;
-      int connectionTimeout = 300000;
-
-      javax.net.ssl.SSLSocketFactory httpsSocketFactory = KeystoreManagerFactory.getTrustingSecureSocketFactory();
-      SSLConnectionSocketFactory myFactory = new SSLConnectionSocketFactory(new InterruptibleSocketFactory(httpsSocketFactory,connectionTimeout),
-        NoopHostnameVerifier.INSTANCE);
-
-      // Set up connection manager
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.getSocketFactory())
-        .register("https", myFactory)
-        .build());
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(2000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      connectionManager = poolingConnectionManager;
-
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-      if (accessUser != null && accessUser.length() > 0 && accessPassword != null)
-      {
-        Credentials credentials = new UsernamePasswordCredentials(accessUser, accessPassword);
-        if (accessRealm != null && accessRealm.length() > 0)
-          credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, accessRealm), credentials);
-        else
-          credentialsProvider.setCredentials(AuthScope.ANY, credentials);
-      }
-
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(true)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-          
-      // If there's a proxy, set that too.
-      if (proxyHost != null && proxyHost.length() > 0)
-      {
-
-        int proxyPortInt;
-        if (proxyPort != null && proxyPort.length() > 0)
-        {
-          try
-          {
-            proxyPortInt = Integer.parseInt(proxyPort);
-          }
-          catch (NumberFormatException e)
-          {
-            throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-          }
-        }
-        else
-          proxyPortInt = 8080;
-
-        // Configure proxy authentication
-        if (proxyUsername != null && proxyUsername.length() > 0)
-        {
-          if (proxyPassword == null)
-            proxyPassword = "";
-          if (proxyDomain == null)
-            proxyDomain = "";
-
-          credentialsProvider.setCredentials(
-            new AuthScope(proxyHost, proxyPortInt),
-            new NTCredentials(proxyUsername, proxyPassword, currentHost, proxyDomain));
-        }
-
-        HttpHost proxy = new HttpHost(proxyHost, proxyPortInt);
-        requestBuilder.setProxy(proxy);
-      }
-
-      httpClient = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setDefaultCredentialsProvider(credentialsProvider)
-        .setSSLSocketFactory(myFactory)
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .build();
-
-      /*
-      BasicHttpParams params = new BasicHttpParams();
-      params.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,true);
-      params.setIntParameter(CoreProtocolPNames.WAIT_FOR_CONTINUE,socketTimeout);
-      params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true);
-      params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,true);
-      params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,socketTimeout);
-      params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,connectionTimeout);
-      params.setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS,true);
-      DefaultHttpClient localHttpClient = new DefaultHttpClient(connectionManager,params);
-      // No retries
-      localHttpClient.setHttpRequestRetryHandler(new HttpRequestRetryHandler()
-        {
-          public boolean retryRequest(
-            IOException exception,
-            int executionCount,
-            HttpContext context)
-          {
-            return false;
-          }
-       
-        });
-      */
-      
-      loginToAPI();
-      
-      hasBeenSetup = true;
-    }
-  }
-
-  /** Log in via the Wiki API.
-  * Call this method whenever login is apparently needed.
-  *@return true if the login was successful, false otherwise.
-  */
-  protected boolean loginToAPI()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (serverLogin == null || serverLogin.length() == 0)
-      return false;
-
-    // Grab the httpclient, and use the same one throughout.
-    HttpClient client = httpClient;
-    
-    // First step in login process: get the token
-    Map<String, String> loginParams = new HashMap<String, String>();
-
-    String token = null;
-    
-    String loginURL = baseURL + "action=login";
-    loginParams.put("action", "login");
-    loginParams.put("lgname", serverLogin);
-    loginParams.put("lgpassword", serverPass);
-    if (serverDomain != null && !"".equals(serverDomain)) {
-      loginParams.put("lgdomain", serverDomain);
-    }
-
-    APILoginResult result = new APILoginResult();
-        
-    try {
-      HttpRequestBase method = getInitializedPostMethod(loginURL,loginParams);
-      ExecuteAPILoginThread t = new ExecuteAPILoginThread(client, method, result);
-      try {
-        t.start();
-        token = t.finishUp();
-      } catch (ManifoldCFException e) {
-        t.interrupt();
-        throw e;
-      } catch (ServiceInterruption e) {
-        t.interrupt();
-        throw e;
-      } catch (IOException e) {
-        t.interrupt();
-        throw e;
-      } catch (HttpException e) {
-	t.interrupt();
-	throw e;
-      } catch (InterruptedException e) {
-        t.interrupt();
-        // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-        throw e;
-      }
-      
-      if (result.result)
-        return true;
-      
-      // Grab the token from the first call
-      if (token == null)
-      {
-        // We don't need a token, we just couldn't log in
-        Logging.connectors.debug("WIKI API login error: '" + result.reason + "'");
-        throw new ManifoldCFException("WIKI API login error: " + result.reason, null, ManifoldCFException.REPOSITORY_CONNECTION_ERROR);
-      }
-      
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (ManifoldCFException e) {
-      throw e;
-    } catch (java.net.SocketTimeoutException e) {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Login timed out reading from the Wiki server: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12L * 60000L, -1, false);
-    } catch (java.net.SocketException e) {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Login received a socket error reading from Wiki server: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12L * 60000L, -1, false);
-    } catch (ConnectTimeoutException e) {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Login connection timed out reading from Wiki server: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12L * 60000L, -1, false);
-    } catch (InterruptedIOException e) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      throw new ManifoldCFException("Login had an IO failure: " + e.getMessage(), e);
-    } catch (HttpException e) {
-      throw new ManifoldCFException("Login had an Http exception: "+e.getMessage(), e);
-    }
-
-    // First request is finished.  Fire off the second one.
-    
-    loginParams.put("lgtoken", token);
-    
-    try {
-      HttpRequestBase method = getInitializedPostMethod(loginURL,loginParams);
-      ExecuteTokenAPILoginThread t = new ExecuteTokenAPILoginThread(httpClient, method, result);
-      try {
-        t.start();
-        t.finishUp();
-      } catch (ManifoldCFException e) {
-        t.interrupt();
-        throw e;
-      } catch (ServiceInterruption e) {
-        t.interrupt();
-        throw e;
-      } catch (IOException e) {
-        t.interrupt();
-        throw e;
-      } catch (HttpException e) {
-	t.interrupt();
-	throw e;
-      } catch (InterruptedException e) {
-        t.interrupt();
-        // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-        throw e;
-      }
-
-      // Fall through
-    } catch (InterruptedException e) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (ManifoldCFException e) {
-      throw e;
-    } catch (java.net.SocketTimeoutException e) {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Login timed out reading from the Wiki server: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12L * 60000L, -1, false);
-    } catch (java.net.SocketException e) {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Login received a socket error reading from Wiki server: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12L * 60000L, -1, false);
-    } catch (ConnectTimeoutException e) {
-      long currentTime = System.currentTimeMillis();
-      throw new ServiceInterruption("Login connection timed out reading from Wiki server: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12L * 60000L, -1, false);
-    } catch (InterruptedIOException e) {
-      throw new ManifoldCFException("Interrupted: " + e.getMessage(), e, ManifoldCFException.INTERRUPTED);
-    } catch (IOException e) {
-      throw new ManifoldCFException("Login had an IO failure: " + e.getMessage(), e);
-    } catch (HttpException e) {
-      throw new ManifoldCFException("Login had an Http exception: "+e.getMessage(), e);
-    }
-    
-    // Check result
-    if (!result.result)
-    {
-      Logging.connectors.debug("WIKI API login error: '" + result.reason + "'");
-      throw new ManifoldCFException("WIKI API login error: " + result.reason, null, ManifoldCFException.REPOSITORY_CONNECTION_ERROR);
-    }
-    return true;
-  }
-
-  /**
-   * Thread to execute a "login" operation. This thread both executes
-   * the operation and parses the result.
-   */
-  protected class ExecuteAPILoginThread extends Thread {
-
-    protected HttpClient client;
-    protected HttpRequestBase executeMethod;
-    protected APILoginResult result;
-    protected Throwable exception = null;
-    protected String token = null;
-
-    public ExecuteAPILoginThread(HttpClient client, HttpRequestBase executeMethod, APILoginResult result) {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.result = result;
-    }
-
-    public void run() {
-      try {
-        // Call the execute method appropriately
-	HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200) {
-          throw new ManifoldCFException("Unexpected HTTP response code " + rval.getStatusLine().getStatusCode() + ": " + readResponseAsString(rval));
-        }
-
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try {
-          // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-          //<api>
-          //  <login
-          //    result="NeedToken"
-          //    token="b5780b6e2f27e20b450921d9461010b4"
-          //    cookieprefix="enwiki"
-          //    sessionid="17ab96bd8ffbe8ca58a78657a918558e"
-          //  />
-          //</api>
-          XMLStream x = new XMLStream(false);
-          WikiLoginAPIContext c = new WikiLoginAPIContext(x,result);
-          x.setContext(c);
-          try {
-            try {
-              x.parse(is);
-              token = c.getToken();
-            }
-	    catch (InterruptedIOException e)
-	    {
-	      throw e;
-	    }
-            catch (IOException e)
-            {
-              long time = System.currentTimeMillis();
-              throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-            }
-          } finally {
-            x.cleanup();
-          }
-        } finally {
-          try {
-            is.close();
-          } catch (IllegalStateException e) {
-            // Ignore this error
-          }
-        }
-      } catch (Throwable e) {
-        this.exception = e;
-      } finally {
-	executeMethod.abort();
-      }
-    }
-
-    public String finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException {
-      join();
-      handleException(exception);
-      return token;
-    }
-    
-  }
-
-  /**
-   * Class representing the "api" context of a "login" response
-   */
-  protected class WikiLoginAPIContext extends SingleLevelContext {
-
-    protected APILoginResult result;
-    protected String token = null;
-    
-    public WikiLoginAPIContext(XMLStream theStream, APILoginResult result) {
-      super(theStream, "api");
-      this.result = result;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts) {
-      return new WikiLoginAPIResultAPIContext(theStream, namespaceURI, localName, qName, atts, result);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException {
-      token = ((WikiLoginAPIResultAPIContext)child).getToken();
-    }
-    
-    public String getToken()
-    {
-      return token;
-    }
-  }
-
-  /**
-   * Class representing the "api/result" context of a "login"
-   * response
-   */
-  protected class WikiLoginAPIResultAPIContext extends BaseProcessingContext {
-
-    protected APILoginResult result;
-    protected String token = null;
-    
-    public WikiLoginAPIResultAPIContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts, APILoginResult result) {
-      super(theStream, namespaceURI, localName, qName, atts);
-      this.result = result;
-    }
-
-    @Override
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption {
-      if (qName.equals("login")) {
-        String loginResult = atts.getValue("result");
-        if ("NeedToken".equals(loginResult)) {
-          token = atts.getValue("token");
-        } else if ("Success".equals(loginResult)) {
-          result.result = true;
-        } else {
-          result.reason = loginResult;
-        }
-      }
-      return super.beginTag(namespaceURI, localName, qName, atts);
-    }
-  
-    public String getToken()
-    {
-      return token;
-    }
-  }
-
-  protected static class APILoginResult {
-
-    public boolean result = false;
-    public String reason = "";
-  }
-
-  /**
-   * Thread to finish a "login" operation. This thread both executes
-   * the operation and parses the result.
-   */
-  protected class ExecuteTokenAPILoginThread extends Thread {
-
-    protected HttpClient client;
-    protected HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected APILoginResult result;
-
-    public ExecuteTokenAPILoginThread(HttpClient client, HttpRequestBase executeMethod, APILoginResult result) {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.result = result;
-    }
-
-    public void run() {
-      try {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200) {
-          throw new ManifoldCFException("Unexpected HTTP response code " + rval.getStatusLine().getStatusCode() + ": " + readResponseAsString(rval));
-        }
-
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try {
-          // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-          //<api>
-          //  <login
-          //    result="NeedToken"
-          //    token="b5780b6e2f27e20b450921d9461010b4"
-          //    cookieprefix="enwiki"
-          //    sessionid="17ab96bd8ffbe8ca58a78657a918558e"
-          //  />
-          //</api>
-          XMLStream x = new XMLStream(false);
-          WikiTokenLoginAPIContext c = new WikiTokenLoginAPIContext(x,result);
-          x.setContext(c);
-          try {
-            try {
-              x.parse(is);
-            }
-            catch (IOException e)
-            {
-              long time = System.currentTimeMillis();
-              throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-            }
-          } finally {
-            x.cleanup();
-          }
-        } finally {
-          try {
-            is.close();
-          } catch (IllegalStateException e) {
-            // Ignore this error
-          }
-        }
-      } catch (Throwable e) {
-        this.exception = e;
-      } finally {
-	executeMethod.abort();
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException {
-      join();
-      handleException(exception);
-    }
-  }
-
-  /**
-   * Class representing the "api" context of a "login" response
-   */
-  protected class WikiTokenLoginAPIContext extends SingleLevelContext {
-
-    protected APILoginResult result;
-    
-    public WikiTokenLoginAPIContext(XMLStream theStream, APILoginResult result) {
-      super(theStream, "api");
-      this.result = result;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts) {
-      return new WikiTokenLoginAPIResultAPIContext(theStream, namespaceURI, localName, qName, atts, result);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException {
-    }
-    
-  }
-
-  /**
-   * Class representing the "api/result" context of a "login"
-   * response
-   */
-  protected class WikiTokenLoginAPIResultAPIContext extends BaseProcessingContext {
-
-    protected APILoginResult result;
-    
-    public WikiTokenLoginAPIResultAPIContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts, APILoginResult result) {
-      super(theStream, namespaceURI, localName, qName, atts);
-      this.result = result;
-    }
-
-    @Override
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption {
-      if (qName.equals("login")) {
-        String loginResult = atts.getValue("result");
-        if ("Success".equals(loginResult)) {
-          result.result = true;
-        } else {
-          result.reason = loginResult;
-        }
-      }
-      return super.beginTag(namespaceURI, localName, qName, atts);
-    }
-  }
-
-  /** Check status of connection.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Destroy saved session setup and repeat it
-      hasBeenSetup = false;
-      performCheck();
-      return super.check();
-    }
-    catch (ServiceInterruption e)
-    {
-      return "Transient error: "+e.getMessage();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        throw e;
-      return "Error: "+e.getMessage();
-    }
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    if (connectionManager != null)
-      connectionManager.closeIdleConnections(60000L,TimeUnit.MILLISECONDS);
-  }
-
-  /** Close the connection.  Call this before discarding the connection.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    hasBeenSetup = false;
-    server = null;
-    serverLogin = null;
-    serverPass = null;
-    serverDomain = null;
-    accessUser = null;
-    accessPassword = null;
-    accessRealm = null;
-    proxyHost = null;
-    proxyPort = null;
-    proxyDomain = null;
-    proxyUsername = null;
-    proxyPassword = null;
-    baseURL = null;
-    userAgent = null;
-
-    if (httpClient != null) {
-      httpClient = null;
-    }
-
-    if (connectionManager != null)
-    {
-      connectionManager.shutdown();
-      connectionManager = null;
-    }
-
-    super.disconnect();
-  }
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    return 20;
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    long startTime;
-    if (lastSeedVersion == null)
-      startTime = 0L;
-    else
-    {
-      // Unpack seed time from seed version string
-      startTime = new Long(lastSeedVersion).longValue();
-    }
-
-    // Scan specification nodes and extract prefixes and namespaces
-    boolean seenAny = false;
-    for (int i = 0 ; i < spec.getChildCount() ; i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX))
-      {
-        String namespace = sn.getAttributeValue(WikiConfig.ATTR_NAMESPACE);
-        String titleprefix = sn.getAttributeValue(WikiConfig.ATTR_TITLEPREFIX);
-        listAllPages(activities,namespace,titleprefix,startTime,seedTime);
-        seenAny = true;
-      }
-    }
-    if (!seenAny)
-      listAllPages(activities,null,null,startTime,seedTime);
-    
-    return new Long(seedTime).toString();
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Forced acls
-    String[] acls = getAcls(spec);
-
-    Map<String,String> versions = new HashMap<String,String>();
-    getTimestamps(documentIdentifiers,versions,activities);
-    
-    List<String> fetchDocuments = new ArrayList<String>();
-    for (String documentIdentifier : documentIdentifiers)
-    {
-      String versionString = versions.get(documentIdentifier);
-      if (versionString == null)
-      {
-        activities.deleteDocument(documentIdentifier);
-        continue;
-      }
-      
-      if (!activities.checkDocumentNeedsReindexing(documentIdentifier,versionString))
-        continue;
-      
-      fetchDocuments.add(documentIdentifier);
-    }
-    
-    if (fetchDocuments.size() == 0)
-      return;
-    
-    String[] fetchDocumentsArray = fetchDocuments.toArray(new String[0]);
-    Map<String,String> urls = new HashMap<String,String>();
-    getDocURLs(documentIdentifiers,urls);
-    for (String documentIdentifier : fetchDocumentsArray)
-    {
-      String url = urls.get(documentIdentifier);
-      String versionString = versions.get(documentIdentifier);
-      if (url != null)
-        getDocInfo(documentIdentifier, versionString, url, activities, acls);
-      else
-        activities.noDocument(documentIdentifier,versionString);
-    }
-
-  }
-  
-  /**
-   * Grab forced acl out of document specification.
-   *
-   * @param spec is the document specification.
-   * @return the acls.
-   */
-  protected static String[] getAcls(Specification spec) {
-    Set<String> aclMap = new HashSet<String>();
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals("access")) {
-        String token = sn.getAttributeValue("token");
-        aclMap.add(token);
-      }
-    }
-
-    String[] rval = new String[aclMap.size()];
-    int j = 0;
-    for (String acl : aclMap)
-    {
-      rval[j++] = acl;
-    }
-    return rval;
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"WikiConnector.Server"));
-    tabsArray.add(Messages.getString(locale,"WikiConnector.Email"));
-    tabsArray.add(Messages.getString(locale,"WikiConnector.Proxy"));
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.email.value != \"\" && editconnection.email.value.indexOf(\"@\") == -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.NeedAValidEmailAddress")+"\");\n"+
-"    editconnection.email.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverport.value != \"\" && !isInteger(editconnection.serverport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.WikiServerPortMustBeAValidInteger")+"\");\n"+
-"    editconnection.serverport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverpath.value != \"\" && editconnection.serverpath.value.indexOf(\"/\") != 0)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.PathMustStartWithACharacter")+"\");\n"+
-"    editconnection.serverpath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.proxyport.value != \"\" && !isInteger(editconnection.proxyport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.ProxyPortMustBeAValidInteger")+"\");\n"+
-"    editconnection.proxyport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.email.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.Email")+"\");\n"+
-"    editconnection.email.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.servername.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.PleaseSupplyAValidWikiServerName")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.Server")+"\");\n"+
-"    editconnection.servername.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverport.value != \"\" && !isInteger(editconnection.serverport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.WikiServerPortMustBeAValidInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.Server")+"\");\n"+
-"    editconnection.serverport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.serverpath.value != \"\" && editconnection.serverpath.value.indexOf(\"/\") != 0)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.PathMustStartWithACharacter")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.Server")+"\");\n"+
-"    editconnection.serverpath.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  if (editconnection.proxyport.value != \"\" && !isInteger(editconnection.proxyport.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.ProxyPortMustBeAValidInteger")+"\");\n"+
-"    SelectTab(\""+Messages.getBodyJavascriptString(locale,"WikiConnector.Proxy")+"\");\n"+
-"    editconnection.proxyport.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String email = parameters.getParameter(WikiConfig.PARAM_EMAIL);
-    if (email == null)
-      email = "";
-
-    String protocol = parameters.getParameter(WikiConfig.PARAM_PROTOCOL);
-    if (protocol == null)
-      protocol = "http";
-		
-    String server = parameters.getParameter(WikiConfig.PARAM_SERVER);
-    if (server == null)
-      server = "";
-
-    String port = parameters.getParameter(WikiConfig.PARAM_PORT);
-    if (port == null)
-      port = "";
-
-    String path = parameters.getParameter(WikiConfig.PARAM_PATH);
-    if (path == null)
-      path = "/w";
-
-    // Server login parameters
-
-    String login = parameters.getParameter(WikiConfig.PARAM_LOGIN);
-    if (login == null) {
-      login = "";
-    }
-    String pass = parameters.getObfuscatedParameter(WikiConfig.PARAM_PASSWORD);
-    if (pass == null) {
-      pass = "";
-    } else {
-      pass = out.mapPasswordToKey(pass);
-    }
-    String domain = parameters.getParameter(WikiConfig.PARAM_DOMAIN);
-    if (domain == null) {
-      domain = "";
-    }
-
-    // Basic auth parameters
-    
-    String accessRealm = parameters.getParameter(WikiConfig.PARAM_ACCESSREALM);
-    if (accessRealm == null)
-      accessRealm = "";
-    
-    String accessUser = parameters.getParameter(WikiConfig.PARAM_ACCESSUSER);
-    if (accessUser == null)
-      accessUser = "";
-    
-    String accessPassword = parameters.getObfuscatedParameter(WikiConfig.PARAM_ACCESSPASSWORD);
-    if (accessPassword == null)
-      accessPassword = "";
-    else
-      accessPassword = out.mapPasswordToKey(accessPassword);
-
-    // Proxy parameters
-    
-    String proxyHost = parameters.getParameter(WikiConfig.PARAM_PROXYHOST);
-    if (proxyHost == null)
-      proxyHost = "";
-    
-    String proxyPort = parameters.getParameter(WikiConfig.PARAM_PROXYPORT);
-    if (proxyPort == null)
-      proxyPort = "";
-    
-    String proxyDomain = parameters.getParameter(WikiConfig.PARAM_PROXYDOMAIN);
-    if (proxyDomain == null)
-      proxyDomain = "";
-    
-    String proxyUsername = parameters.getParameter(WikiConfig.PARAM_PROXYUSERNAME);
-    if (proxyUsername == null)
-      proxyUsername = "";
-    
-    String proxyPassword = parameters.getObfuscatedParameter(WikiConfig.PARAM_PROXYPASSWORD);
-    if (proxyPassword == null)
-      proxyPassword = "";
-    else
-      proxyPassword = out.mapPasswordToKey(proxyPassword);
-
-    // Proxy tab
-    if (tabName.equals(Messages.getString(locale,"WikiConnector.Proxy")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.ProxyHostColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"proxyhost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.ProxyPortColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"proxyport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyPort)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.ProxyDomainColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"proxydomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyDomain)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.ProxyUsernameColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"16\" name=\"proxyusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyUsername)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.ProxyPasswordColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"password\" size=\"16\" name=\"proxypassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyPassword)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"proxyhost\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyPort)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxydomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyDomain)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyUsername)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxypassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(proxyPassword)+"\"/>\n"
-      );
-    }
-    
-    // Email tab
-    if (tabName.equals(Messages.getString(locale,"WikiConnector.Email")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.EmailAddressToContactColon") + "</nobr></td><td class=\"value\"><input type=\"text\" size=\"32\" name=\"email\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(email)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"email\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(email)+"\"/>\n"
-      );
-    }
-
-    if (tabName.equals(Messages.getString(locale,"WikiConnector.Server")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.Protocol") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"serverprotocol\">\n"+
-"        <option value=\"http\""+(protocol.equals("http")?" selected=\"true\"":"")+">http</option>\n"+
-"        <option value=\"https\""+(protocol.equals("https")?" selected=\"true\"":"")+">https</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.ServerName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"servername\" type=\"text\" size=\"32\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(server)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.Port") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"serverport\" type=\"text\" size=\"5\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(port)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.PathName") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"serverpath\" type=\"text\" size=\"16\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(path)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.ServerLogin") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"serverlogin\" type=\"text\" size=\"16\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(login) + "\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.ServerPassword") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"serverpass\" type=\"password\" size=\"16\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pass) + "\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.ServerDomain") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"serverdomain\" type=\"text\" size=\"16\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(domain) + "\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.AccessUser") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"accessuser\" type=\"text\" size=\"16\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(accessUser) + "\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.AccessPassword") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"accesspassword\" type=\"password\" size=\"16\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(accessPassword) + "\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.AccessRealm") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input name=\"accessrealm\" type=\"text\" size=\"16\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(accessRealm) + "\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Server tab hiddens
-      out.print(
-"<input type=\"hidden\" name=\"serverprotocol\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(protocol)+"\"/>\n"+
-"<input type=\"hidden\" name=\"servername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(server)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverport\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(port)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverpath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(path)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverlogin\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(login) + "\"/>\n"+
-"<input type=\"hidden\" name=\"serverpass\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pass) + "\"/>\n"+
-"<input type=\"hidden\" name=\"serverdomain\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(domain) + "\"/>\n"+
-"<input type=\"hidden\" name=\"accessuser\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(accessUser) + "\"/>\n"+
-"<input type=\"hidden\" name=\"accesspassword\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(accessPassword) + "\"/>\n"+
-"<input type=\"hidden\" name=\"accessrealm\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(accessRealm) + "\"/>\n"
-      );
-    }
-
-  }
-  
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    String email = variableContext.getParameter("email");
-    if (email != null)
-      parameters.setParameter(WikiConfig.PARAM_EMAIL,email);
-
-    String protocol = variableContext.getParameter("serverprotocol");
-    if (protocol != null)
-      parameters.setParameter(WikiConfig.PARAM_PROTOCOL,protocol);
-		
-    String server = variableContext.getParameter("servername");
-    if (server != null)
-      parameters.setParameter(WikiConfig.PARAM_SERVER,server);
-
-    String port = variableContext.getParameter("serverport");
-    if (port != null)
-      parameters.setParameter(WikiConfig.PARAM_PORT,port);
-
-    String path = variableContext.getParameter("serverpath");
-    if (path != null)
-      parameters.setParameter(WikiConfig.PARAM_PATH,path);
-
-    String login = variableContext.getParameter("serverlogin");
-    if (login != null) {
-      parameters.setParameter(WikiConfig.PARAM_LOGIN, login);
-    }
-
-    String pass = variableContext.getParameter("serverpass");
-    if (pass != null) {
-      parameters.setObfuscatedParameter(WikiConfig.PARAM_PASSWORD, variableContext.mapKeyToPassword(pass));
-    }
-
-    String domain = variableContext.getParameter("serverdomain");
-    if (domain != null) {
-      parameters.setParameter(WikiConfig.PARAM_DOMAIN, domain);
-    }
-
-    String accessUser = variableContext.getParameter("accessuser");
-    if (accessUser != null) {
-      parameters.setParameter(WikiConfig.PARAM_ACCESSUSER, accessUser);
-    }
-
-    String accessPassword = variableContext.getParameter("accesspassword");
-    if (accessPassword != null) {
-      parameters.setObfuscatedParameter(WikiConfig.PARAM_ACCESSPASSWORD, variableContext.mapKeyToPassword(accessPassword));
-    }
-
-    String accessRealm = variableContext.getParameter("accessrealm");
-    if (accessRealm != null) {
-      parameters.setParameter(WikiConfig.PARAM_ACCESSREALM, accessRealm);
-    }
-
-    String proxyHost = variableContext.getParameter("proxyhost");
-    if (proxyHost != null) {
-      parameters.setParameter(WikiConfig.PARAM_PROXYHOST, proxyHost);
-    }
-    
-    String proxyPort = variableContext.getParameter("proxyport");
-    if (proxyPort != null) {
-      parameters.setParameter(WikiConfig.PARAM_PROXYPORT, proxyPort);
-    }
-
-    String proxyDomain = variableContext.getParameter("proxydomain");
-    if (proxyDomain != null) {
-      parameters.setParameter(WikiConfig.PARAM_PROXYDOMAIN, proxyDomain);
-    }
-    
-    String proxyUsername = variableContext.getParameter("proxyusername");
-    if (proxyUsername != null) {
-      parameters.setParameter(WikiConfig.PARAM_PROXYUSERNAME, proxyUsername);
-    }
-
-    String proxyPassword = variableContext.getParameter("proxypassword");
-    if (proxyPassword != null) {
-      parameters.setObfuscatedParameter(WikiConfig.PARAM_PROXYPASSWORD, variableContext.mapKeyToPassword(proxyPassword));
-    }
-
-    return null;
-  }
-  
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>"+Messages.getBodyString(locale,"WikiConnector.Parameters")+"</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">\n"
-    );
-    Iterator iter = parameters.listParameters();
-    while (iter.hasNext())
-    {
-      String param = (String)iter.next();
-      String value = parameters.getParameter(param);
-      if (param.length() >= "password".length() && param.substring(param.length()-"password".length()).equalsIgnoreCase("password"))
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
-        );
-      }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
-      {
-        IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=&lt;"+Integer.toString(kmanager.getContents().length)+Messages.getBodyString(locale,"WikiConnector.certificates")+"&gt;</nobr><br/>\n"
-        );
-      }
-      else
-      {
-        out.print(
-"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"="+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(value)+"</nobr><br/>\n"
-        );
-      }
-    }
-    
-    out.print(
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-    );
-
-  }
-  
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    tabsArray.add(Messages.getString(locale,"WikiConnector.NamespaceAndTitles"));
-    tabsArray.add(Messages.getString(locale, "WikiConnector.Security"));
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function "+seqPrefix+"NsDelete(k)\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"nsop_\"+k, \"Delete\", \""+seqPrefix+"ns_\"+k);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"NsAdd(k)\n"+
-"{\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"nsop\", \"Add\", \""+seqPrefix+"ns_\"+k);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+
-"{\n"+
-"  if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale, "WikiConnector.TypeInAnAccessToken") + "\");\n"+
-"    editjob."+seqPrefix+"spectoken.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+
-"}\n"+
-"\n"+
-"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+
-"{\n"+
-"  eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+
-"  postFormSetAnchor(anchorvalue);\n"+
-"}\n"+
-"\n"+
-"//-->\n"+
-"</script>\n"
-    );
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    if (tabName.equals(Messages.getString(locale,"WikiConnector.NamespaceAndTitles")) && connectionSequenceNumber == actualSequenceNumber)
-    {
-      boolean seenAny = false;
-      // Output table column headers
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.NamespaceAndTitles2") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.Namespace") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.TitlePrefix") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-
-      int k = 0;
-      for (int i = 0 ; i < ds.getChildCount() ; i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX))
-        {
-          String namespace = sn.getAttributeValue(WikiConfig.ATTR_NAMESPACE);
-          String titlePrefix = sn.getAttributeValue(WikiConfig.ATTR_TITLEPREFIX);
-          
-          String nsOpName = seqPrefix+"nsop_"+k;
-          String nsNsName = seqPrefix+"nsnsname_"+k;
-          String nsTitlePrefix = seqPrefix+"nstitleprefix_"+k;
-          out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <a name=\""+seqPrefix+"ns_"+Integer.toString(k)+"\"/>\n"+
-"              <input type=\"hidden\" name=\""+nsOpName+"\" value=\"\"/>\n"+
-"              <input type=\"hidden\" name=\""+nsNsName+"\" value=\""+((namespace==null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(namespace))+"\"/>\n"+
-"              <input type=\"hidden\" name=\""+nsTitlePrefix+"\" value=\""+((titlePrefix==null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(titlePrefix))+"\"/>\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WikiConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"NsDelete("+Integer.toString(k)+")' alt=\""+Messages.getAttributeString(locale,"WikiConnector.DeleteNamespaceTitle")+Integer.toString(k)+"\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+((namespace==null)?"(default)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(namespace))+"\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+((titlePrefix==null)?"(all titles)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(titlePrefix))+"\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-          );
-          k++;
-        }
-      }
-
-      if (k == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td colspan=\"3\" class=\"formmessage\">" + Messages.getBodyString(locale,"WikiConnector.NoSpecification") + "</td></tr>\n"
-        );
-      }
-
-      // Add area
-      out.print(
-"        <tr class=\"formrow\"><td colspan=\"4\" class=\"formseparator\"><hr/></td></tr>\n"
-      );
-
-      // Obtain the list of namespaces
-      Map<String,String> namespaces = new HashMap<String,String>();
-      try
-      {
-        getNamespaces(namespaces);
-        // Extract and sort the names we're going to present
-        String[] nameSpaceNames = new String[namespaces.size()];
-        Iterator<String> keyIter = namespaces.keySet().iterator();
-        int j = 0;
-        while (keyIter.hasNext())
-        {
-          nameSpaceNames[j++] = keyIter.next();
-        }
-        java.util.Arrays.sort(nameSpaceNames);
-      
-        out.print(
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <a name=\""+seqPrefix+"ns_"+Integer.toString(k)+"\"/>\n"+
-"              <input type=\"hidden\" name=\""+seqPrefix+"nsop\" value=\"\"/>\n"+
-"              <input type=\"hidden\" name=\""+seqPrefix+"nscount\" value=\""+Integer.toString(k)+"\"/>\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WikiConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"NsAdd("+Integer.toString(k)+")' alt=\"" + Messages.getAttributeString(locale,"WikiConnector.AddNamespacePrefix") + "\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <select name=\""+seqPrefix+"nsnsname\">\n"+
-"                <option value=\"\" selected=\"true\">-- " + Messages.getBodyString(locale,"WikiConnector.UseDefault") + " --</option>\n"
-        );
-        for (int l = 0 ; l < nameSpaceNames.length ; l++)
-        {
-          String prettyName = nameSpaceNames[l];
-          String canonicalName = namespaces.get(prettyName);
-          out.print(
-"                <option value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(canonicalName)+"\">"+
-  org.apache.manifoldcf.ui.util.Encoder.bodyEscape(prettyName)+"</option>\n"
-          );
-        }
-        out.print(
-"              </select>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              <input type=\"text\" name=\""+seqPrefix+"nstitleprefix\" size=\"16\" value=\"\"/>\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-        );
-      }
-      catch (ServiceInterruption e)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td colspan=\"3\" class=\"formmessage\">" + Messages.getBodyString(locale,"WikiConnector.TransientError") + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"</td></tr>\n"
-        );
-      }
-
-      out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-
-    }
-    else
-    {
-      // Generate hiddens
-      int k = 0;
-      for (int i = 0 ; i < ds.getChildCount() ; i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX))
-        {
-          String namespace = sn.getAttributeValue(WikiConfig.ATTR_NAMESPACE);
-          String titlePrefix = sn.getAttributeValue(WikiConfig.ATTR_TITLEPREFIX);
-          
-          String nsNsName = seqPrefix+"nsnsname_"+k;
-          String nsTitlePrefix = seqPrefix+"nstitleprefix_"+k;
-
-          out.print(
-"<input type=\"hidden\" name=\""+nsNsName+"\" value=\""+((namespace == null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(namespace))+"\"/>\n"+
-"<input type=\"hidden\" name=\""+nsTitlePrefix+"\" value=\""+((titlePrefix == null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(titlePrefix))+"\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"nscount\" value=\""+new Integer(k)+"\"/>\n"
-      );
-    }
-    
-    if (tabName.equals(Messages.getString(locale, "WikiConnector.Security")) && connectionSequenceNumber == actualSequenceNumber) 
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
-      );
-      // Go through forced ACL
-      int i = 0;
-      int k = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access")) {
-          String accessDescription = "_" + Integer.toString(k);
-          String accessOpName = seqPrefix + "accessop" + accessDescription;
-          String token = sn.getAttributeValue("token");
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\"" + accessOpName + "\" value=\"\"/>\n"+
-"      <input type=\"hidden\" name=\"" + seqPrefix + "spectoken" + accessDescription + "\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token) + "\"/>\n"+
-"      <a name=\"" + seqPrefix + "token_" + Integer.toString(k) + "\">\n"+
-"        <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "WikiConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\"" + accessOpName + "\",\"Delete\",\""+seqPrefix+"token_" + Integer.toString(k) + "\")' alt=\"" + Messages.getAttributeString(locale, "WikiConnector.Delete") + Integer.toString(k) + "\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token) + "\n"+
-"    </td>\n"+
-"  </tr>\n"
-          );
-          k++;
-        }
-      }
-      if (k == 0) {
-        out.print(
-"  <tr>\n"+
-"    <td class=\"message\" colspan=\"2\">" + Messages.getBodyString(locale, "WikiConnector.NoAccessTokensPresent") + "</td>\n"+
-"  </tr>\n"
-        );
-      }
-      out.print(
-"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\">\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n"+
-"      <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+
-"      <a name=\"" + seqPrefix + "token_" + Integer.toString(k) + "\">\n"+
-"        <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "WikiConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_" + Integer.toString(k + 1) + "\")' alt=\"" + Messages.getAttributeString(locale, "WikiConnector.Add") + "\"/>\n"+
-"      </a>&nbsp;\n"+
-"    </td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Finally, go through forced ACL
-      int i = 0;
-      int k = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i++);
-        if (sn.getType().equals("access")) {
-          String accessDescription = "_" + Integer.toString(k);
-          String token = sn.getAttributeValue("token");
-          out.print(
-"<input type=\"hidden\" name=\"" + seqPrefix + "spectoken" + accessDescription + "\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token) + "\"/>\n"
-          );
-          k++;
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n"
-      );
-    }
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    String seqPrefix = "s"+connectionSequenceNumber+"_";
-
-    String countString = variableContext.getParameter(seqPrefix+"nscount");
-    if (countString != null)
-    {
-      for (int i = 0 ; i < ds.getChildCount() ; i++)
-      {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX))
-          ds.removeChild(i);
-        else
-          i++;
-      }
-      
-      int nsCount = Integer.parseInt(countString);
-      for (int i = 0 ; i < nsCount ; i++)
-      {
-        String nsOpName = seqPrefix+"nsop_"+i;
-        String nsNsName = seqPrefix+"nsnsname_"+i;
-        String nsTitlePrefix = seqPrefix+"nstitleprefix_"+i;
-        
-        String nsOp = variableContext.getParameter(nsOpName);
-        if (nsOp == null || !nsOp.equals("Delete"))
-        {
-          String namespaceName = variableContext.getParameter(nsNsName);
-          if (namespaceName != null && namespaceName.length() == 0)
-            namespaceName = null;
-          String titlePrefix = variableContext.getParameter(nsTitlePrefix);
-          if (titlePrefix != null && titlePrefix.length() == 0)
-            titlePrefix = null;
-          SpecificationNode sn = new SpecificationNode(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX);
-          if (namespaceName != null)
-            sn.setAttribute(WikiConfig.ATTR_NAMESPACE,namespaceName);
-          if (titlePrefix != null)
-            sn.setAttribute(WikiConfig.ATTR_TITLEPREFIX,titlePrefix);
-          ds.addChild(ds.getChildCount(),sn);
-        }
-      }
-      
-      String newOp = variableContext.getParameter(seqPrefix+"nsop");
-      if (newOp != null && newOp.equals("Add"))
-      {
-        String namespaceName = variableContext.getParameter(seqPrefix+"nsnsname");
-        if (namespaceName != null && namespaceName.length() == 0)
-          namespaceName = null;
-        String titlePrefix = variableContext.getParameter(seqPrefix+"nstitleprefix");
-        if (titlePrefix != null && titlePrefix.length() == 0)
-          titlePrefix = null;
-        SpecificationNode sn = new SpecificationNode(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX);
-        if (namespaceName != null)
-          sn.setAttribute(WikiConfig.ATTR_NAMESPACE,namespaceName);
-        if (titlePrefix != null)
-          sn.setAttribute(WikiConfig.ATTR_TITLEPREFIX,titlePrefix);
-        ds.addChild(ds.getChildCount(),sn);
-      }
-    }
-
-    String xc = variableContext.getParameter(seqPrefix+"tokencount");
-    if (xc != null) {
-      // Delete all tokens first
-      int i = 0;
-      while (i < ds.getChildCount()) {
-        SpecificationNode sn = ds.getChild(i);
-        if (sn.getType().equals("access")) {
-          ds.removeChild(i);
-        } else {
-          i++;
-        }
-      }
-
-      int accessCount = Integer.parseInt(xc);
-      i = 0;
-      while (i < accessCount) {
-        String accessDescription = "_" + Integer.toString(i);
-        String accessOpName = seqPrefix +"accessop" + accessDescription;
-        xc = variableContext.getParameter(accessOpName);
-        if (xc != null && xc.equals("Delete")) {
-          // Next row
-          i++;
-          continue;
-        }
-        // Get the stuff we need
-        String accessSpec = variableContext.getParameter(seqPrefix + "spectoken" + accessDescription);
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token", accessSpec);
-        ds.addChild(ds.getChildCount(), node);
-        i++;
-      }
-
-      String op = variableContext.getParameter(seqPrefix+"accessop");
-      if (op != null && op.equals("Add")) {
-        String accessspec = variableContext.getParameter(seqPrefix+"spectoken");
-        SpecificationNode node = new SpecificationNode("access");
-        node.setAttribute("token", accessspec);
-        ds.addChild(ds.getChildCount(), node);
-      }
-    }
-    
-    return null;
-  }
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"
-    );
-    out.print(
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.NamespaceAndTitles2") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.Namespace") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WikiConnector.TitlePrefix") + "</nobr></td>\n"+
-"        </tr>\n"
-    );
-
-    int k = 0;
-    for (int i = 0 ; i < ds.getChildCount() ; i++)
-    {
-      SpecificationNode sn = ds.getChild(i);
-      if (sn.getType().equals(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX))
-      {
-        String namespace = sn.getAttributeValue(WikiConfig.ATTR_NAMESPACE);
-        String titlePrefix = sn.getAttributeValue(WikiConfig.ATTR_TITLEPREFIX);
-        out.print(
-"        <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+((namespace==null)?"(default)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(namespace))+"\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>\n"+
-"              "+((titlePrefix==null)?"(all documents)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(titlePrefix))+"\n"+
-"            </nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-        );
-        k++;
-      }
-    }
-    
-    if (k == 0)
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"2\">" + Messages.getBodyString(locale,"WikiConnector.AllDefaultNamespaceDocumentsIncluded") + "</td></tr>\n"
-      );
-    
-    out.print(
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"
-    );
-
-    // Go through looking for access tokens
-    boolean seenAny = false;
-    int i = 0;
-    while (i < ds.getChildCount()) {
-      SpecificationNode sn = ds.getChild(i++);
-      if (sn.getType().equals("access")) {
-        if (seenAny == false) {
-          out.print(
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.AccessTokens") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"
-          );
-          seenAny = true;
-        }
-        String token = sn.getAttributeValue("token");
-        out.print(
-"      " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(token) + "<br/>\n"
-        );
-      }
-    }
-
-    if (seenAny) {
-      out.print(
-"    </td>\n"+
-"  </tr>\n"
-      );
-    } else {
-      out.print(
-"  <tr><td class=\"message\" colspan=\"2\"><nobr>" + Messages.getBodyString(locale, "WikiConnector.NoAccessTokensSpecified") + "</nobr></td></tr>\n"
-      );
-    }
-
-    out.print(
-"</table>\n"
-    );
-  }
-
-  // Protected static classes and methods
-
-  /** Create and initialize an HttpRequestBase */
-  protected HttpRequestBase getInitializedGetMethod(String URL)
-    throws IOException
-  {
-    HttpGet method = new HttpGet(URL);
-    if (userAgent != null)
-      method.setHeader(new BasicHeader("User-Agent",userAgent));
-    method.setHeader(new BasicHeader("Accept","*/*"));
-    return method;
-  }
-
-  /** Create an initialize a post method */
-  protected HttpRequestBase getInitializedPostMethod(String URL, Map<String,String> params)
-    throws IOException
-  {
-    HttpPost method = new HttpPost(URL);
-    if (userAgent != null)
-      method.setHeader(new BasicHeader("User-Agent",userAgent));
-
-    List<NameValuePair> pairs = new ArrayList<NameValuePair>();
-    
-    for (String key : params.keySet()) {
-      pairs.add(new BasicNameValuePair(key, params.get(key)));
-    }
-    
-    method.setEntity(new UrlEncodedFormEntity(pairs, StandardCharsets.UTF_8));
-    
-    return method;
-  }
-  
-  // -- Methods and classes to perform a "check" operation. --
-
-  /** Do the check operation.  This throws an exception if anything is wrong.
-  */
-  protected void performCheck()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    boolean loginAttempted = false;
-    while (true)
-    {
-      HttpClient client = httpClient;
-      try
-      {
-	HttpRequestBase executeMethod = getInitializedGetMethod(getCheckURL());
-        ExecuteCheckThread t = new ExecuteCheckThread(client,executeMethod);
-        try
-        {
-          t.start();
-          if (!t.finishUp() || loginAttempted)
-            return;
-        }
-        catch (ManifoldCFException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (IOException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-	catch (HttpException e)
-	{
-	  t.interrupt();
-	  throw e;
-	}
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-          throw e;
-        }
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ManifoldCFException e)
-      {
-        throw e;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Fetch test timed out reading from the Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (java.net.SocketException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Fetch test received a socket error reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Fetch test connection timed out reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Fetch test had an IO failure: "+e.getMessage(),e);
-      }
-      catch (HttpException e)
-      {
-	throw new ManifoldCFException("Fetch test had Http exception: "+e.getMessage(),e);
-      }
-      
-      if (!loginToAPI())
-        break;
-      loginAttempted = true;
-      // Back around...
-    }
-  }
-
-  /** Get a URL for a check operation.
-  */
-  protected String getCheckURL()
-    throws ManifoldCFException
-  {
-    return baseURL + "action=query&list=allpages&aplimit=1";
-  }
-  
-  /** Thread to execute a "check" operation.  This thread both executes the operation and parses the result. */
-  protected static class ExecuteCheckThread extends Thread
-  {
-    protected final HttpClient client;
-    protected final HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected boolean loginNeeded = false;
-
-    public ExecuteCheckThread(HttpClient client, HttpRequestBase executeMethod)
-    {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200)
-          throw new ManifoldCFException("Unexpected HTTP response code: "+rval.getStatusLine().getStatusCode()+": "+readResponseAsString(rval));
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try
-        {
-          loginNeeded = parseCheckResponse(is);
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IllegalStateException e)
-          {
-            // Ignore this error
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-      finally
-      {
-	executeMethod.abort();
-      }
-    }
-
-    public boolean finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-    {
-      join();
-      handleException(exception);
-      return loginNeeded;
-    }
-
-  }
-
-  /** Parse check response, e.g.:
-  * <api xmlns="http://www.mediawiki.org/xml/api/">
-  *   <query>
-  *     <allpages>
-  *       <p pageid="19839654" ns="0" title="Kre&#039;fey" />
-  *     </allpages>
-  *   </query>
-  *   <query-continue>
-  *     <allpages apfrom="Krea" />
-  *   </query-continue>
-  * </api>
-  */
-  protected static boolean parseCheckResponse(InputStream is)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-    XMLStream x = new XMLStream(false);
-    WikiCheckAPIContext c = new WikiCheckAPIContext(x);
-    x.setContext(c);
-    try
-    {
-      try
-      {
-        x.parse(is);
-        if (c.isLoginRequired())
-          return true;
-        if (!c.hasResponse())
-          throw new ManifoldCFException("Valid API response not detected");
-        return false;
-      }
-      catch (IOException e)
-      {
-        long time = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-      }
-    }
-    finally
-    {
-      x.cleanup();
-    }
-  }
-
-  /** Class representing the "api" context of a "check" response */
-  protected static class WikiCheckAPIContext extends SingleLevelContext
-  {
-    boolean responseSeen = false;
-    boolean needLogin = false;
-    
-    public WikiCheckAPIContext(XMLStream theStream)
-    {
-      super(theStream,"api");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiCheckQueryContext(theStream,namespaceURI,localName,qName,atts);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      responseSeen |= ((WikiCheckQueryContext)child).hasResponse();
-      needLogin |= ((WikiCheckQueryContext)child).isLoginRequired();
-    }
-    
-    public boolean hasResponse()
-    {
-      return responseSeen;
-    }
-
-    public boolean isLoginRequired()
-    {
-      return needLogin;
-    }
-    
-  }
-
-  /** Class representing the "api/query" context of a "check" response */
-  protected static class WikiCheckQueryContext extends SingleLevelErrorContext
-  {
-    protected boolean responseSeen = false;
-    
-    public WikiCheckQueryContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"query");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiCheckAllPagesContext(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      responseSeen |= ((WikiCheckAllPagesContext)child).hasResponse();
-    }
-
-    public boolean hasResponse()
-    {
-      return responseSeen;
-    }
-    
-  }
-
-  /** Class recognizing the "api/query/allpages" context of a "check" response */
-  protected static class WikiCheckAllPagesContext extends SingleLevelContext
-  {
-    protected boolean responseSeen = false;
-    
-    public WikiCheckAllPagesContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"allpages");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiCheckPContext(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      responseSeen |= true;
-    }
-
-    public boolean hasResponse()
-    {
-      return responseSeen;
-    }
-    
-  }
-  
-  /** Class representing the "api/query/allpages/p" context of a "check" response */
-  protected static class WikiCheckPContext extends BaseProcessingContext
-  {
-    public WikiCheckPContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-    }
-  }
-
-  // -- Methods and classes to perform a "list pages" operation. --
-
-  /** Perform a series of listPages() operations, so that we fully obtain the documents we're looking for even though
-  * we're limited to 500 of them per request.
-  */
-  protected void listAllPages(ISeedingActivity activities, String namespace, String prefix, long startTime, long endTime)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    String lastTitle = null;
-    while (true)
-    {
-      activities.checkJobStillActive();
-      
-      // Start with the last title seen in the previous round. 
-      String newLastTitle = executeListPagesViaThread(lastTitle,namespace,prefix,activities);
-      if (newLastTitle == null)
-        break;
-      lastTitle = newLastTitle;
-    }
-  }
-  
-  /** Execute a listPages() operation via a thread.  Returns the last page title. */
-  protected String executeListPagesViaThread(String startPageTitle, String namespace, String prefix, ISeedingActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    boolean loginAttempted = false;
-    while (true)
-    {
-      try
-      {
-	HttpRequestBase executeMethod = getInitializedGetMethod(getListPagesURL(startPageTitle,namespace,prefix));
-        XThreadStringBuffer pageBuffer = new XThreadStringBuffer();
-        ExecuteListPagesThread t = new ExecuteListPagesThread(httpClient,executeMethod,pageBuffer,startPageTitle);
-        try
-        {
-          t.start();
-
-          // Pick up the pages, and add them to the activities, before we join with the child thread.
-          while (true)
-          {
-            // The only kind of exceptions this can throw are going to shut the process down.
-            String pageID = pageBuffer.fetch();
-            if (pageID ==  null)
-              break;
-            // Add the pageID to the queue
-            activities.addSeedDocument(pageID);
-          }
-          
-          if (!t.finishUp() || loginAttempted)
-            return t.getLastPageTitle();
-        }
-        catch (ManifoldCFException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (IOException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-	catch (HttpException e)
-	{
-	  t.interrupt();
-	  throw e;
-	}
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-          throw e;
-        }
-        finally
-        {
-          // Make SURE buffer is dead, otherwise child thread may well hang waiting on it
-          pageBuffer.abandon();
-        }
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        throw e;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("ListPages timed out reading from the Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (java.net.SocketException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("ListPages received a socket error reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("ListPages connection timed out reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("ListPages had an IO failure: "+e.getMessage(),e);
-      }
-      catch (HttpException e)
-      {
-	throw new ManifoldCFException("ListPages had an HTTP exception: "+e.getMessage(),e);
-      }
-      
-      if (!loginToAPI())
-        break;
-      loginAttempted = true;
-      // Back around...
-
-    }
-    return null;
-  }
-
-  /** Create a URL to obtain the next 500 pages.
-  */
-  protected String getListPagesURL(String startingTitle, String namespace, String prefix)
-    throws ManifoldCFException
-  {
-      return baseURL + "action=query&list=allpages" +
-        ((prefix != null)?"&apprefix="+URLEncoder.encode(prefix):"") +
-        ((namespace != null)?"&apnamespace="+URLEncoder.encode(namespace):"") +
-        ((startingTitle!=null)?"&apfrom="+URLEncoder.encode(startingTitle):"") +
-        "&aplimit=500";
-  }
-
-  protected static class ReturnString
-  {
-    public String returnValue = null;
-  }
-  
-  /** Thread to execute a list pages operation */
-  protected static class ExecuteListPagesThread extends Thread
-  {
-    protected HttpClient client;
-    protected HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected XThreadStringBuffer pageBuffer;
-    protected String lastPageTitle = null;
-    protected String startPageTitle;
-    protected boolean loginNeeded = false;
-
-    public ExecuteListPagesThread(HttpClient client, HttpRequestBase executeMethod, XThreadStringBuffer pageBuffer, String startPageTitle)
-    {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.pageBuffer = pageBuffer;
-      this.startPageTitle = startPageTitle;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200)
-          throw new ManifoldCFException("Unexpected HTTP response code: "+rval.getStatusLine().getStatusCode()+": "+readResponseAsString(rval));
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try
-        {
-          ReturnString returnString = new ReturnString();
-          loginNeeded = parseListPagesResponse(is,pageBuffer,startPageTitle,returnString);
-          lastPageTitle = returnString.returnValue;
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IllegalStateException e)
-          {
-            // Ignore this error
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-      finally
-      {
-        pageBuffer.signalDone();
-	executeMethod.abort();
-      }
-    }
-
-    public boolean finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-    {
-      join();
-      handleException(exception);
-      return loginNeeded;
-    }
-    
-    public String getLastPageTitle()
-    {
-      return lastPageTitle;
-    }
-    
-  }
-
-  /** Parse list output, e.g.:
-  * <api xmlns="http://www.mediawiki.org/xml/api/">
-  *   <query>
-  *     <allpages>
-  *       <p pageid="19839654" ns="0" title="Kre&#039;fey" />
-  *       <p pageid="30955295" ns="0" title="Kre-O" />
-  *       <p pageid="14773725" ns="0" title="Kre8tiveworkz" />
-  *       <p pageid="19219017" ns="0" title="Kre M&#039;Baye" />
-  *       <p pageid="19319577" ns="0" title="Kre Mbaye" />
-  *     </allpages>
-  *   </query>
-  *   <query-continue>
-  *     <allpages apfrom="Krea" />
-  *   </query-continue>
-  * </api>
-  */
-  protected static boolean parseListPagesResponse(InputStream is, XThreadStringBuffer buffer, String startPageTitle, ReturnString lastTitle)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-    XMLStream x = new XMLStream(false);
-    WikiListPagesAPIContext c = new WikiListPagesAPIContext(x,buffer,startPageTitle);
-    x.setContext(c);
-    try
-    {
-      try
-      {
-        x.parse(is);
-        String lastTitleString = c.getLastTitle();
-        lastTitle.returnValue = lastTitleString;
-        return c.isLoginRequired();
-      }
-      catch (IOException e)
-      {
-        long time = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-      }
-    }
-    finally
-    {
-      x.cleanup();
-    }
-  }
-
-  /** Class representing the "api" context of a "list all pages" response */
-  protected static class WikiListPagesAPIContext extends SingleLevelContext
-  {
-    protected String lastTitle = null;
-    protected XThreadStringBuffer buffer;
-    protected String startPageTitle;
-    protected boolean loginNeeded = false;
-    
-    public WikiListPagesAPIContext(XMLStream theStream, XThreadStringBuffer buffer, String startPageTitle)
-    {
-      super(theStream,"api");
-      this.buffer = buffer;
-      this.startPageTitle = startPageTitle;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiListPagesQueryContext(theStream,namespaceURI,localName,qName,atts,buffer,startPageTitle);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      lastTitle = ((WikiListPagesQueryContext)child).getLastTitle();
-      loginNeeded |= ((WikiListPagesQueryContext)child).isLoginRequired();
-    }
-    
-    public String getLastTitle()
-    {
-      return lastTitle;
-    }
-
-    public boolean isLoginRequired()
-    {
-      return loginNeeded;
-    }
-
-  }
-
-  /** Class representing the "api/query" context of a "list all pages" response */
-  protected static class WikiListPagesQueryContext extends SingleLevelErrorContext
-  {
-    protected String lastTitle = null;
-    protected XThreadStringBuffer buffer;
-    protected String startPageTitle;
-    
-    public WikiListPagesQueryContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      XThreadStringBuffer buffer, String startPageTitle)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"query");
-      this.buffer = buffer;
-      this.startPageTitle = startPageTitle;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiListPagesAllPagesContext(theStream,namespaceURI,localName,qName,atts,buffer,startPageTitle);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      lastTitle = ((WikiListPagesAllPagesContext)child).getLastTitle();
-    }
-    
-    public String getLastTitle()
-    {
-      return lastTitle;
-    }
-    
-  }
-
-  /** Class recognizing the "api/query/allpages" context of a "list all pages" response */
-  protected static class WikiListPagesAllPagesContext extends SingleLevelContext
-  {
-    protected String lastTitle = null;
-    protected XThreadStringBuffer buffer;
-    protected String startPageTitle;
-    
-    public WikiListPagesAllPagesContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      XThreadStringBuffer buffer, String startPageTitle)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"allpages");
-      this.buffer = buffer;
-      this.startPageTitle = startPageTitle;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      // When we recognize allpages, we need to look for <p> records.
-      return new WikiListPagesPContext(theStream,namespaceURI,localName,qName,atts,buffer,startPageTitle);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      // Update the last title from all the <p> records we saw.
-      lastTitle = ((WikiListPagesPContext)child).getLastTitle();
-    }
-    
-    public String getLastTitle()
-    {
-      return lastTitle;
-    }
-    
-  }
-  
-  /** Class representing the "api/query/allpages/p" context of a "list all pages" response */
-  protected static class WikiListPagesPContext extends BaseProcessingContext
-  {
-    protected String lastTitle = null;
-    protected XThreadStringBuffer buffer;
-    protected String startPageTitle;
-    
-    public WikiListPagesPContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      XThreadStringBuffer buffer, String startPageTitle)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-      this.buffer = buffer;
-      this.startPageTitle = startPageTitle;
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("p"))
-      {
-        String currentTitle = atts.getValue("title");
-        // Skip the record that matches the start page title (just pretend it isn't there)
-        if (startPageTitle == null || !currentTitle.equals(startPageTitle))
-        {
-          lastTitle = currentTitle;
-          String pageID = atts.getValue("pageid");
-          // Add the discovered page id to the page buffer
-          try
-          {
-            buffer.add(pageID);
-          }
-          catch (InterruptedException e)
-          {
-            throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-          }
-        }
-      }
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-    
-    public String getLastTitle()
-    {
-      return lastTitle;
-    }
-  }
-
-  // -- Methods and classes to perform a "get doc urls" operation. --
-  
-  protected void getDocURLs(String[] documentIdentifiers, Map<String,String> urls)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    boolean loginAttempted = false;
-    while (true)
-    {
-      try
-      {
-	HttpRequestBase executeMethod = getInitializedGetMethod(getGetDocURLsURL(documentIdentifiers));
-        ExecuteGetDocURLsThread t = new ExecuteGetDocURLsThread(httpClient,executeMethod,urls);
-        try
-        {
-          t.start();
-          if (!t.finishUp() || loginAttempted)
-            return;
-        }
-        catch (ManifoldCFException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (IOException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-	catch (HttpException e)
-	{
-	  t.interrupt();
-	  throw e;
-	}
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-          throw e;
-        }
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ManifoldCFException e)
-      {
-        throw e;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("URL fetch timed out reading from the Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (java.net.SocketException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("URL fetch received a socket error reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("URL fetch connection timed out reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("URL fetch had an IO failure: "+e.getMessage(),e);
-      }
-      catch (HttpException e)
-      {
-	throw new ManifoldCFException("URL fetch had an HTTP exception: "+e.getMessage(),e);
-      }
-      
-      if (!loginToAPI())
-        break;
-      loginAttempted = true;
-    }
-  }
-  
-  /** Create a URL to obtain multiple page's urls, given the page IDs.
-  */
-  protected String getGetDocURLsURL(String[] documentIdentifiers)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < documentIdentifiers.length ; i++)
-    {
-      if (i > 0)
-        sb.append("|");
-      sb.append(documentIdentifiers[i]);
-    }
-      return baseURL + "action=query&prop=info&pageids="+URLEncoder.encode(sb.toString())+"&inprop=url";
-  }
-
-  /** Thread to execute a "get timestamp" operation.  This thread both executes the operation and parses the result. */
-  protected static class ExecuteGetDocURLsThread extends Thread
-  {
-    protected HttpClient client;
-    protected HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected Map<String,String> urls;
-    protected boolean loginNeeded = false;
-
-    public ExecuteGetDocURLsThread(HttpClient client, HttpRequestBase executeMethod, Map<String,String> urls)
-    {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.urls = urls;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200)
-          throw new ManifoldCFException("Unexpected HTTP response code: "+rval.getStatusLine().getStatusCode()+": "+readResponseAsString(rval));
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try
-        {
-          loginNeeded = parseGetDocURLsResponse(is,urls);
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IllegalStateException e)
-          {
-            // Ignore this error
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-      finally
-      {
-	executeMethod.abort();
-      }
-    }
-
-    public boolean finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-    {
-      join();
-      handleException(exception);
-      return loginNeeded;
-    }
-    
-  }
-
-  /** This method parses a response like the following:
-  * <api>
-  *   <query>
-  *     <pages>
-  *       <page pageid="27697087" ns="0" title="API" fullurl="..."/>
-  *     </pages>
-  *   </query>
-  * </api>
-  */
-  protected static boolean parseGetDocURLsResponse(InputStream is, Map<String,String> urls)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-    XMLStream x = new XMLStream(false);
-    WikiGetDocURLsAPIContext c = new WikiGetDocURLsAPIContext(x,urls);
-    x.setContext(c);
-    try
-    {
-      try
-      {
-        x.parse(is);
-        return c.isLoginRequired();
-      }
-      catch (IOException e)
-      {
-        long time = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-      }
-    }
-    finally
-    {
-      x.cleanup();
-    }
-  }
-
-  /** Class representing the "api" context of a "get timestamp" response */
-  protected static class WikiGetDocURLsAPIContext extends SingleLevelContext
-  {
-    protected Map<String,String> urls;
-    protected boolean loginNeeded = false;
-    
-    public WikiGetDocURLsAPIContext(XMLStream theStream, Map<String,String> urls)
-    {
-      super(theStream,"api");
-      this.urls = urls;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocURLsQueryContext(theStream,namespaceURI,localName,qName,atts,urls);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      loginNeeded |= ((WikiGetDocURLsQueryContext)child).isLoginRequired();
-    }
-
-    public boolean isLoginRequired()
-    {
-      return loginNeeded;
-    }
-
-  }
-
-  /** Class representing the "api/query" context of a "get timestamp" response */
-  protected static class WikiGetDocURLsQueryContext extends SingleLevelErrorContext
-  {
-    protected Map<String,String> urls;
-    
-    public WikiGetDocURLsQueryContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> urls)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"query");
-      this.urls = urls;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocURLsPagesContext(theStream,namespaceURI,localName,qName,atts,urls);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-    }
-    
-  }
-
-  /** Class looking for the "api/query/pages" context of a "get timestamp" response */
-  protected static class WikiGetDocURLsPagesContext extends SingleLevelContext
-  {
-    protected Map<String,String> urls;
-    
-    public WikiGetDocURLsPagesContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> urls)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"pages");
-      this.urls = urls;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocURLsPageContext(theStream,namespaceURI,localName,qName,atts,urls);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-    }
-  }
-
-  /** Class looking for the "api/query/pages/page" context of a "get timestamp" response */
-  protected static class WikiGetDocURLsPageContext extends BaseProcessingContext
-  {
-    protected Map<String,String> urls;
-    
-    public WikiGetDocURLsPageContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> urls)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-      this.urls = urls;
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("page"))
-      {
-        String pageID = atts.getValue("pageid");
-        String fullURL = atts.getValue("fullurl");
-        if (pageID != null && fullURL != null)
-          urls.put(pageID,fullURL);
-      }
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-    
-  }
-
-  // -- Methods and classes to perform a "get Timestamp" operation. --
-
-  /** Obtain document versions for a set of documents.
-  */
-  protected void getTimestamps(String[] documentIdentifiers, Map<String,String> versions, IProcessActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    boolean loginAttempted = false;
-    while (true)
-    {
-      try
-      {
-	HttpRequestBase executeMethod = getInitializedGetMethod(getGetTimestampURL(documentIdentifiers));
-        ExecuteGetTimestampThread t = new ExecuteGetTimestampThread(httpClient,executeMethod,versions);
-        try
-        {
-          t.start();
-          if (!t.finishUp() || loginAttempted)
-            return;
-        }
-        catch (ManifoldCFException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (IOException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-	catch (HttpException e)
-	{
-	  t.interrupt();
-	  throw e;
-	}
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-          throw e;
-        }
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ManifoldCFException e)
-      {
-        throw e;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Version fetch timed out reading from the Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (java.net.SocketException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Version fetch received a socket error reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Version fetch connection timed out reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Version fetch had an IO failure: "+e.getMessage(),e);
-      }
-      catch (HttpException e)
-      {
-	throw new ManifoldCFException("Version fetch had an HTTP exception: "+e.getMessage(),e);
-      }
-      
-      if (!loginToAPI())
-        break;
-      loginAttempted = true;
-    }
-  }
-
-  /** Create a URL to obtain multiple page's timestamps, given the page IDs.
-  */
-  protected String getGetTimestampURL(String[] documentIdentifiers)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < documentIdentifiers.length ; i++)
-    {
-      if (i > 0)
-        sb.append("|");
-      sb.append(documentIdentifiers[i]);
-    }
-      return baseURL + "action=query&prop=revisions&pageids="+URLEncoder.encode(sb.toString())+"&rvprop=timestamp";
-  }
-
-  /** Thread to execute a "get timestamp" operation.  This thread both executes the operation and parses the result. */
-  protected static class ExecuteGetTimestampThread extends Thread
-  {
-    protected final HttpClient client;
-    protected final HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected final Map<String,String> versions;
-    protected boolean loginNeeded = false;
-
-    public ExecuteGetTimestampThread(HttpClient client, HttpRequestBase executeMethod, Map<String,String> versions)
-    {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.versions = versions;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200)
-          throw new ManifoldCFException("Unexpected HTTP response code: "+rval.getStatusLine().getStatusCode()+": "+readResponseAsString(rval));
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try
-        {
-          loginNeeded = parseGetTimestampResponse(is,versions);
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IllegalStateException e)
-          {
-            // Ignore this error
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-      finally
-      {
-	executeMethod.abort();
-      }
-    }
-
-    public boolean finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-    {
-      join();
-      handleException(exception);
-      return loginNeeded;
-    }
-  }
-
-  /** This method parses a response like the following:
-  * <api>
-  *   <query>
-  *     <pages>
-  *       <page pageid="27697087" ns="0" title="API">
-  *         <revisions>
-  *           <rev user="Graham87" timestamp="2010-06-13T08:41:17Z" />
-  *         </revisions>
-  *       </page>
-  *     </pages>
-  *   </query>
-  * </api>
-  */
-  protected static boolean parseGetTimestampResponse(InputStream is, Map<String,String> versions)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-    XMLStream x = new XMLStream(false);
-    WikiGetTimestampAPIContext c = new WikiGetTimestampAPIContext(x,versions);
-    x.setContext(c);
-    try
-    {
-      try
-      {
-        x.parse(is);
-        return c.isLoginRequired();
-      }
-      catch (IOException e)
-      {
-        long time = System.currentTimeMillis();
-        throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-      }
-    }
-    finally
-    {
-      x.cleanup();
-    }
-  }
-
-  /** Class representing the "api" context of a "get timestamp" response */
-  protected static class WikiGetTimestampAPIContext extends SingleLevelContext
-  {
-    protected Map<String,String> versions;
-    protected boolean loginNeeded = false;
-    
-    public WikiGetTimestampAPIContext(XMLStream theStream, Map<String,String> versions)
-    {
-      super(theStream,"api");
-      this.versions = versions;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetTimestampQueryContext(theStream,namespaceURI,localName,qName,atts,versions);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      loginNeeded |= ((WikiGetTimestampQueryContext)child).isLoginRequired();
-    }
-
-    public boolean isLoginRequired()
-    {
-      return loginNeeded;
-    }
-  }
-
-  /** Class representing the "api/query" context of a "get timestamp" response */
-  protected static class WikiGetTimestampQueryContext extends SingleLevelErrorContext
-  {
-    protected Map<String,String> versions;
-    
-    public WikiGetTimestampQueryContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> versions)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"query");
-      this.versions = versions;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetTimestampPagesContext(theStream,namespaceURI,localName,qName,atts,versions);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-    }
-    
-  }
-
-  /** Class looking for the "api/query/pages" context of a "get timestamp" response */
-  protected static class WikiGetTimestampPagesContext extends SingleLevelContext
-  {
-    protected Map<String,String> versions;
-    
-    public WikiGetTimestampPagesContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> versions)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"pages");
-      this.versions = versions;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetTimestampPageContext(theStream,namespaceURI,localName,qName,atts,versions);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-    }
-  }
-
-  /** Class looking for the "api/query/pages/page" context of a "get timestamp" response */
-  protected static class WikiGetTimestampPageContext extends BaseProcessingContext
-  {
-    protected String pageID = null;
-    protected Map<String,String> versions;
-    
-    public WikiGetTimestampPageContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> versions)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-      this.versions = versions;
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("page"))
-      {
-        pageID = atts.getValue("pageid");
-        return new WikiGetTimestampRevisionsContext(theStream,namespaceURI,localName,qName,atts);
-      }
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-    
-    protected void endTag()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      XMLContext theContext = theStream.getContext();
-      String theTag = theContext.getQname();
-
-      if (theTag.equals("page"))
-      {
-        String lastRevEdit = ((WikiGetTimestampRevisionsContext)theContext).getTimestamp();
-        versions.put(pageID,lastRevEdit);
-      }
-      else
-        super.endTag();
-    }
-    
-  }
-
-  /** Class looking for the "api/query/pages/page/revisions" context of a "get timestamp" response */
-  protected static class WikiGetTimestampRevisionsContext extends SingleLevelContext
-  {
-    protected String timestamp = null;
-    
-    public WikiGetTimestampRevisionsContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"revisions");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetTimestampRevContext(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      WikiGetTimestampRevContext rc = (WikiGetTimestampRevContext)child;
-      if (timestamp == null)
-        timestamp = rc.getTimestamp();
-    }
-    
-    public String getTimestamp()
-    {
-      return timestamp;
-    }
-  }
-
-  /** Class looking for the "api/query/pages/page/revisions/rev" context of a "get timestamp" response */
-  protected static class WikiGetTimestampRevContext extends BaseProcessingContext
-  {
-    protected String timestamp = null;
-    
-    public WikiGetTimestampRevContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("rev"))
-        timestamp = atts.getValue("timestamp");
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-    
-    public String getTimestamp()
-    {
-      return timestamp;
-    }
-  }
-  
-  // -- Methods and classes to perform a "get namespaces" operation. --
-  
-  /** Obtain the set of namespaces, as a map keyed by the canonical namespace name
-  * where the value is the descriptive name.
-  */
-  protected void getNamespaces(Map<String,String> namespaces)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    boolean loginAttempted = false;
-    while (true)
-    {
-      try
-      {
-	HttpRequestBase executeMethod = getInitializedGetMethod(getGetNamespacesURL());
-        ExecuteGetNamespacesThread t = new ExecuteGetNamespacesThread(httpClient,executeMethod,namespaces);
-        try
-        {
-          t.start();
-          if (!t.finishUp() || loginAttempted)
-            return;
-        }
-        catch (ManifoldCFException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          t.interrupt();
-          throw e;
-        }
-        catch (IOException e)
-        {
-          t.interrupt();
-          throw e;
-        }
-	catch (HttpException e)
-	{
-	  t.interrupt();
-	  throw e;
-	}
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-          throw e;
-        }
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ManifoldCFException e)
-      {
-        throw e;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Get namespaces timed out reading from the Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (java.net.SocketException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Get namespaces received a socket error reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Get namespaces connection timed out reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Get namespaces had an IO failure: "+e.getMessage(),e);
-      }
-      catch (HttpException e)
-      {
-	throw new ManifoldCFException("Get namespaces had an HTTP exception: "+e.getMessage(),e);
-      }
-      
-      if (!loginToAPI())
-        break;
-      loginAttempted = true;
-    }
-  }
-  
-  /** Thread to execute a "get namespaces" operation.  This thread both executes the operation and parses the result. */
-  protected static class ExecuteGetNamespacesThread extends Thread
-  {
-    protected HttpClient client;
-    protected HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected Map<String,String> namespaces;
-    protected boolean loginNeeded = false;
-
-    public ExecuteGetNamespacesThread(HttpClient client, HttpRequestBase executeMethod, Map<String,String> namespaces)
-    {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.namespaces = namespaces;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200)
-        {
-          throw new ManifoldCFException("Unexpected HTTP response code "+rval.getStatusLine().getStatusCode()+": "+readResponseAsString(rval));
-        }
-
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try
-        {
-          // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-          //<api>
-          //  <query>
-          //    <namespaces>
-          //      <ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">Media</ns>
-          //      <ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">Special</ns>
-          //      <ns id="0" case="first-letter" subpages="" content="" xml:space="preserve" />
-          //      <ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">Talk</ns>
-          //      <ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">User</ns>
-          //      <ns id="90" case="first-letter" canonical="Thread" xml:space="preserve">Thread</ns>
-          //      <ns id="91" case="first-letter" canonical="Thread talk" xml:space="preserve">Thread talk</ns>
-          //    </namespaces>
-          //  </query>
-          //</api>
-          XMLStream x = new XMLStream(false);
-          WikiGetNamespacesAPIContext c = new WikiGetNamespacesAPIContext(x,namespaces);
-          x.setContext(c);
-          try
-          {
-            try
-            {
-              x.parse(is);
-              loginNeeded = c.isLoginRequired();
-            }
-            catch (IOException e)
-            {
-              long time = System.currentTimeMillis();
-              throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-            }
-          }
-          finally
-          {
-            x.cleanup();
-          }
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IllegalStateException e)
-          {
-            // Ignore this error
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-      finally
-      {
-	executeMethod.abort();
-      }
-    }
-
-    public boolean finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-    {
-      join();
-      handleException(exception);
-      return loginNeeded;
-    }
-  }
-
-  /** Create a URL to obtain the namespaces.
-  */
-  protected String getGetNamespacesURL()
-    throws ManifoldCFException
-  {
-    return baseURL + "action=query&meta=siteinfo&siprop=namespaces";
-  }
-
-  /** Class representing the "api" context of a "get namespaces" response */
-  protected static class WikiGetNamespacesAPIContext extends SingleLevelContext
-  {
-    protected Map<String,String> namespaces;
-    protected boolean loginNeeded = false;
-    
-    public WikiGetNamespacesAPIContext(XMLStream theStream, Map<String,String> namespaces)
-    {
-      super(theStream,"api");
-      this.namespaces = namespaces;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetNamespacesQueryContext(theStream,namespaceURI,localName,qName,atts,namespaces);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      loginNeeded |= ((WikiGetNamespacesQueryContext)child).isLoginRequired();
-    }
-
-    public boolean isLoginRequired()
-    {
-      return loginNeeded;
-    }
-
-  }
-
-  /** Class representing the "api/query" context of a "get namespaces" response */
-  protected static class WikiGetNamespacesQueryContext extends SingleLevelErrorContext
-  {
-    protected Map<String,String> namespaces;
-    
-    public WikiGetNamespacesQueryContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> namespaces)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"query");
-      this.namespaces = namespaces;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetNamespacesNamespacesContext(theStream,namespaceURI,localName,qName,atts,namespaces);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-    }
-    
-  }
-
-  /** Class representing the "api/query/namespaces" context of a "get namespaces" response */
-  protected static class WikiGetNamespacesNamespacesContext extends SingleLevelContext
-  {
-    protected Map<String,String> namespaces;
-    
-    public WikiGetNamespacesNamespacesContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> namespaces)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"namespaces");
-      this.namespaces = namespaces;
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetNamespacesNsContext(theStream,namespaceURI,localName,qName,atts,namespaces);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-    }
-    
-  }
-
-  /** Class representing the "api/query/pages/page" context of a "get doc info" response */
-  protected static class WikiGetNamespacesNsContext extends BaseProcessingContext
-  {
-    protected Map<String,String> namespaces;
-    protected String canonical = null;
-	protected String nsid = null;
-    
-    public WikiGetNamespacesNsContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts,
-      Map<String,String> namespaces)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-      this.namespaces = namespaces;
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("ns"))
-      {
-        nsid = atts.getValue("id");
-        canonical = atts.getValue("canonical");
-        if (canonical != null && nsid != null)
-          return new XMLStringContext(theStream,namespaceURI,localName,qName,atts);
-      }
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-    
-    protected void endTag()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      XMLContext theContext = theStream.getContext();
-      String theTag = theContext.getQname();
-      if (theTag.equals("ns"))
-      {
-        if (canonical != null && nsid != null)
-        {
-          // Pull down the data
-          XMLStringContext sc = (XMLStringContext)theContext;
-          namespaces.put(sc.getValue(),nsid);
-        }
-        else
-          super.endTag();
-      }
-      else
-        super.endTag();
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-    }
-   
-  }
-  
-  // -- Methods and classes to perform a "get Docinfo" operation. --
-
-  /** Get document info and index the document.
-  */
-  protected void getDocInfo(String documentIdentifier, String documentVersion, String fullURL, IProcessActivity activities, String[] allowACL)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    getSession();
-    boolean loginAttempted = false;
-    while (true)
-    {
-      String statusCode = "UNKNOWN";
-      String errorMessage = null;
-      long startTime = System.currentTimeMillis();
-      long dataSize = 0L;
-      
-      try
-      {
-	HttpRequestBase executeMethod = getInitializedGetMethod(getGetDocInfoURL(documentIdentifier));
-        ExecuteGetDocInfoThread t = new ExecuteGetDocInfoThread(httpClient,executeMethod,documentIdentifier);
-        try
-        {
-          t.start();
-          boolean needsLogin = t.finishUp();
-          // Fetch all the data we need from the thread, and do the indexing.
-          File contentFile = t.getContentFile();
-          if (contentFile != null)
-          {
-            statusCode = "OK";
-            try
-            {
-              String author = t.getAuthor();
-              String comment = t.getComment();
-              String title = t.getTitle();
-              String lastModified = t.getLastModified();
-              Date modifiedDate = (lastModified==null)?null:DateParser.parseISO8601Date(lastModified);
-              String contentType = "text/plain";
-              dataSize = contentFile.length();
-
-              if (!activities.checkURLIndexable(fullURL))
-              {
-                activities.noDocument(documentIdentifier,documentVersion);
-                statusCode = activities.EXCLUDED_URL;
-                errorMessage = "Downstream pipeline excluded document URL ('"+fullURL+"')";
-                return;
-              }
-              
-              if (!activities.checkLengthIndexable(dataSize))
-              {
-                activities.noDocument(documentIdentifier,documentVersion);
-                statusCode = activities.EXCLUDED_LENGTH;
-                errorMessage = "Downstream pipeline excluded document length ("+dataSize+")";
-                return;
-              }
-              
-              if (!activities.checkMimeTypeIndexable(contentType))
-              {
-                activities.noDocument(documentIdentifier,documentVersion);
-                statusCode = activities.EXCLUDED_MIMETYPE;
-                errorMessage = "Downstream pipeline excluded document mime type ('"+contentType+"')";
-                return;
-              }
-              
-              if (!activities.checkDateIndexable(modifiedDate))
-              {
-                activities.noDocument(documentIdentifier,documentVersion);
-                statusCode = activities.EXCLUDED_DATE;
-                errorMessage = "Downstream pipeline excluded document date ("+modifiedDate+")";
-                return;
-              }
-              
-              RepositoryDocument rd = new RepositoryDocument();
-              
-              // For wiki, type is always text/plain
-              rd.setMimeType(contentType);
-              
-              InputStream is = new FileInputStream(contentFile);
-              try
-              {
-                rd.setBinary(is,dataSize);
-                if (comment != null)
-                  rd.addField("comment",comment);
-                if (author != null)
-                  rd.addField("author",author);
-                if (title != null)
-                  rd.addField("title",title);
-                if (lastModified != null)
-                {
-                  rd.addField("last-modified",lastModified);
-                  rd.setModifiedDate(modifiedDate);
-                }
-
-                if (allowACL != null && allowACL.length > 0) {
-                  String[] denyACL = new String[]{
-                    defaultAuthorityDenyToken
-                  };
-                  rd.setSecurity(RepositoryDocument.SECURITY_TYPE_DOCUMENT,allowACL,denyACL);
-                }
-
-                activities.ingestDocumentWithException(documentIdentifier,documentVersion,fullURL,rd);
-              }
-              finally
-              {
-                is.close();
-              }
-            }
-            finally
-            {
-              contentFile.delete();
-            }
-          }
-          else
-          {
-            statusCode = t.getStatusCode();
-            errorMessage = t.getErrorMessage();
-          }
-          
-          if (loginAttempted || !needsLogin)
-            return;
-        }
-        catch (ManifoldCFException e)
-        {
-          t.interrupt();
-          statusCode = t.getStatusCode();
-          errorMessage = t.getErrorMessage();
-          throw e;
-        }
-        catch (ServiceInterruption e)
-        {
-          t.interrupt();
-          statusCode = t.getStatusCode();
-          errorMessage = t.getErrorMessage();
-          throw e;
-        }
-        catch (IOException e)
-        {
-          t.interrupt();
-          statusCode = t.getStatusCode();
-          errorMessage = t.getErrorMessage();
-          throw e;
-        }
-	catch (HttpException e)
-	{
-	  t.interrupt();
-          statusCode = t.getStatusCode();
-          errorMessage = t.getErrorMessage();
-	  throw e;
-	}
-        catch (InterruptedException e)
-        {
-          t.interrupt();
-          // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-          throw e;
-        }
-        finally
-        {
-          t.cleanup();
-        }
-      }
-      catch (InterruptedException e)
-      {
-        // Drop the connection on the floor
-        statusCode = null;
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        {
-          statusCode = null;
-        }
-        throw e;
-      }
-      catch (java.net.SocketTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Get doc info timed out reading from the Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (java.net.SocketException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Get doc info received a socket error reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (ConnectTimeoutException e)
-      {
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Get doc info connection timed out reading from Wiki server: "+e.getMessage(),e,currentTime+300000L,currentTime+12L * 60000L,-1,false);
-      }
-      catch (InterruptedIOException e)
-      {
-        statusCode = null;
-        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Get doc info had an IO failure: "+e.getMessage(),e);
-      }
-      catch (HttpException e)
-      {
-	throw new ManifoldCFException("Get doc info had an HTTP exception: "+e.getMessage(),e);
-      }
-      finally
-      {
-        if (statusCode != null)
-          activities.recordActivity(new Long(startTime),ACTIVITY_FETCH,new Long(dataSize),documentIdentifier,statusCode,errorMessage,null);
-      }
-      
-      if (!loginToAPI())
-        break;
-      loginAttempted = true;
-    }
-  }
-  
-  /** Thread to execute a "get doc info" operation.  This thread both executes the operation and parses the result. */
-  protected static class ExecuteGetDocInfoThread extends Thread
-  {
-    protected HttpClient client;
-    protected HttpRequestBase executeMethod;
-    protected Throwable exception = null;
-    protected String documentIdentifier;
-    protected File contentFile = null;
-    protected String author = null;
-    protected String title = null;
-    protected String comment = null;
-    protected String lastModified = null;
-    
-    protected String statusCode = null;
-    protected String errorMessage = null;
-    protected boolean loginNeeded = false;
-
-    public ExecuteGetDocInfoThread(HttpClient client, HttpRequestBase executeMethod, String documentIdentifier)
-    {
-      super();
-      setDaemon(true);
-      this.client = client;
-      this.executeMethod = executeMethod;
-      this.documentIdentifier = documentIdentifier;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the execute method appropriately
-        HttpResponse rval = client.execute(executeMethod);
-        if (rval.getStatusLine().getStatusCode() != 200)
-        {
-          throw new ManifoldCFException("Unexpected HTTP response code "+rval.getStatusLine().getStatusCode()+": "+readResponseAsString(rval));
-        }
-        // Read response and make sure it's valid
-        InputStream is = rval.getEntity().getContent();
-        try
-        {
-          // Parse the document.  This will cause various things to occur, within the instantiated XMLContext class.
-          // <api>
-          //  <query>
-          //    <pages>
-          //      <page pageid="27697087" ns="0" title="API" touched="2011-09-27T07:00:55Z" lastrevid="367741756" counter="" length="70" redirect="" fullurl="http://en.wikipedia.org/wiki/API" editurl="http://en.wikipedia.org/w/index.php?title=API&amp;action=edit">
-          //        <revisions>
-          //          <rev user="Graham87" timestamp="2010-06-13T08:41:17Z" comment="Protected API: restore protection ([edit=sysop] (indefinite) [move=sysop] (indefinite))" xml:space="preserve">#REDIRECT [[Application programming interface]]{{R from abbreviation}}</rev>
-          //        </revisions>
-          //      </page>
-          //    </pages>
-          //  </query>
-          //</api>
-
-          XMLStream x = new XMLStream(false);
-          WikiGetDocInfoAPIContext c = new WikiGetDocInfoAPIContext(x);
-          x.setContext(c);
-          try
-          {
-            try
-            {
-              x.parse(is);
-              contentFile = c.getContentFile();
-              title = c.getTitle();
-              author = c.getAuthor();
-              comment = c.getComment();
-              lastModified = c.getLastModified();
-              statusCode = "OK";
-              loginNeeded = c.isLoginRequired();
-            }
-	    catch (InterruptedIOException e)
-	    {
-	      throw e;
-	    }
-            catch (IOException e)
-            {
-              long time = System.currentTimeMillis();
-              throw new ServiceInterruption(e.getMessage(),e,time + 300000L,time + 12L * 60000L,-1,false);
-            }
-          }
-          finally
-          {
-            x.cleanup();
-          }
-        }
-        finally
-        {
-          try
-          {
-            is.close();
-          }
-          catch (IllegalStateException e)
-          {
-            // Ignore this error
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        statusCode = e.getClass().getSimpleName().toUpperCase(Locale.ROOT);
-        errorMessage = e.getMessage();
-        this.exception = e;
-      }
-      finally
-      {
-	executeMethod.abort();
-      }
-    }
-
-    public boolean finishUp()
-      throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-    {
-      join();
-      handleException(exception);
-      return loginNeeded;
-    }
-    
-    public String getStatusCode()
-    {
-      return statusCode;
-    }
-    
-    public String getErrorMessage()
-    {
-      return errorMessage;
-    }
-    
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-    
-    public String getTitle()
-    {
-      return title;
-    }
-
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-    
-    public void cleanup()
-    {
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-    
-  }
-
-  /** Create a URL to obtain a page's metadata and content, given the page ID.
-  * QUESTION: Can we do multiple document identifiers at a time??
-  */
-  protected String getGetDocInfoURL(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    return baseURL + "action=query&prop=revisions&pageids="+documentIdentifier+"&rvprop=user%7ccomment%7ccontent%7ctimestamp";
-  }
-
-  /** Class representing the "api" context of a "get doc info" response */
-  protected static class WikiGetDocInfoAPIContext extends SingleLevelContext
-  {
-    /** Title */
-    protected String title = null;
-    /** Content file */
-    protected File contentFile = null;
-    /** Author */
-    protected String author = null;
-    /** Comment */
-    protected String comment = null;
-    /** Last modified */
-    protected String lastModified = null;
-    protected boolean loginNeeded = false;
-    
-    public WikiGetDocInfoAPIContext(XMLStream theStream)
-    {
-      super(theStream,"api");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocInfoQueryContext(theStream,namespaceURI,localName,qName,atts);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      WikiGetDocInfoQueryContext pc = (WikiGetDocInfoQueryContext)child;
-      tagCleanup();
-      title = pc.getTitle();
-      contentFile = pc.getContentFile();
-      author = pc.getAuthor();
-      comment = pc.getComment();
-      lastModified = pc.getLastModified();
-      loginNeeded |= pc.isLoginRequired();
-    }
-    
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-
-    public String getTitle()
-    {
-      return title;
-    }
-    
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-
-    public boolean isLoginRequired()
-    {
-      return loginNeeded;
-    }
-
-  }
-
-  /** Class representing the "api/query" context of a "get doc info" response */
-  protected static class WikiGetDocInfoQueryContext extends SingleLevelErrorContext
-  {
-    /** Title */
-    protected String title = null;
-    /** Content file */
-    protected File contentFile = null;
-    /** Author */
-    protected String author = null;
-    /** Comment */
-    protected String comment = null;
-    /** Last modified */
-    protected String lastModified = null;
-    
-    public WikiGetDocInfoQueryContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"query");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocInfoPagesContext(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      WikiGetDocInfoPagesContext pc = (WikiGetDocInfoPagesContext)child;
-      tagCleanup();
-      title = pc.getTitle();
-      contentFile = pc.getContentFile();
-      author = pc.getAuthor();
-      comment = pc.getComment();
-      lastModified = pc.getLastModified();
-    }
-    
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-
-    public String getTitle()
-    {
-      return title;
-    }
-    
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-    
-  }
-
-  /** Class representing the "api/query/pages" context of a "get doc info" response */
-  protected static class WikiGetDocInfoPagesContext extends SingleLevelContext
-  {
-    /** Title */
-    protected String title = null;
-    /** Content file */
-    protected File contentFile = null;
-    /** Author */
-    protected String author = null;
-    /** Comment */
-    protected String comment = null;
-    /** Last modified */
-    protected String lastModified = null;
-    
-    public WikiGetDocInfoPagesContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"pages");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocInfoPageContext(theStream,namespaceURI,localName,qName,atts);
-    }
-    
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      WikiGetDocInfoPageContext pc = (WikiGetDocInfoPageContext)child;
-      tagCleanup();
-      title = pc.getTitle();
-      contentFile = pc.getContentFile();
-      author = pc.getAuthor();
-      lastModified = pc.getLastModified();
-      comment = pc.getComment();
-    }
-    
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-
-    public String getTitle()
-    {
-      return title;
-    }
-    
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-
-  }
-
-  /** Class representing the "api/query/pages/page" context of a "get doc info" response */
-  protected static class WikiGetDocInfoPageContext extends BaseProcessingContext
-  {
-    /** Title */
-    protected String title = null;
-    /** Content file */
-    protected File contentFile = null;
-    /** Author */
-    protected String author = null;
-    /** Comment */
-    protected String comment = null;
-    /** Last modified */
-    protected String lastModified = null;
-    
-    public WikiGetDocInfoPageContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("page"))
-      {
-        title = atts.getValue("title");
-        return new WikiGetDocInfoRevisionsContext(theStream,namespaceURI,localName,qName,atts);
-      }
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-    
-    protected void endTag()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      XMLContext theContext = theStream.getContext();
-      String theTag = theContext.getQname();
-      if (theTag.equals("page"))
-      {
-        // Pull down the data
-        WikiGetDocInfoRevisionsContext rc = (WikiGetDocInfoRevisionsContext)theContext;
-        tagCleanup();
-        contentFile = rc.getContentFile();
-        author = rc.getAuthor();
-        comment = rc.getComment();
-        lastModified = rc.getLastModified();
-      }
-      super.endTag();
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-
-    public String getTitle()
-    {
-      return title;
-    }
-    
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-    
-  }
-
-  /** Class representing the "api/query/pages/page/revisions" context of a "get doc info" response */
-  protected static class WikiGetDocInfoRevisionsContext extends SingleLevelContext
-  {
-    protected File contentFile = null;
-    protected String author = null;
-    protected String comment = null;
-    protected String lastModified = null;
-    
-    public WikiGetDocInfoRevisionsContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts,"revisions");
-    }
-
-    @Override
-    protected BaseProcessingContext createChild(String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      return new WikiGetDocInfoRevContext(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    @Override
-    protected void finishChild(BaseProcessingContext child)
-      throws ManifoldCFException
-    {
-      WikiGetDocInfoRevContext rc = (WikiGetDocInfoRevContext)child;
-      tagCleanup();
-      contentFile = rc.getContentFile();
-      author = rc.getAuthor();
-      comment = rc.getComment();
-      lastModified = rc.getLastModified();
-    }
-    
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-    
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-  }
-
-  /** Class looking for the "api/query/pages/page/revisions/rev" context of a "get doc info" response */
-  protected static class WikiGetDocInfoRevContext extends BaseProcessingContext
-  {
-    protected String author = null;
-    protected String comment = null;
-    protected File contentFile = null;
-    protected String lastModified = null;
-    
-    public WikiGetDocInfoRevContext(XMLStream theStream, String namespaceURI, String localName, String qName, Attributes atts)
-    {
-      super(theStream,namespaceURI,localName,qName,atts);
-    }
-
-    protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (qName.equals("rev"))
-      {
-        author = atts.getValue("user");
-        comment = atts.getValue("comment");
-        lastModified = atts.getValue("timestamp");
-        try
-        {
-          File tempFile = File.createTempFile("_wikidata_","tmp");
-          return new XMLFileContext(theStream,namespaceURI,localName,qName,atts,tempFile);
-        }
-        catch (java.net.SocketTimeoutException e)
-        {
-          throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-        }
-        catch (InterruptedIOException e)
-        {
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-        catch (IOException e)
-        {
-          throw new ManifoldCFException("IO exception creating temp file: "+e.getMessage(),e);
-        }
-      }
-      return super.beginTag(namespaceURI,localName,qName,atts);
-    }
-
-    protected void endTag()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      XMLContext theContext = theStream.getContext();
-      String theTag = theContext.getQname();
-      if (theTag.equals("rev"))
-      {
-        // Pull down the data
-        XMLFileContext rc = (XMLFileContext)theContext;
-        tagCleanup();
-        contentFile = rc.getCompletedFile();
-      }
-      else
-        super.endTag();
-    }
-
-    protected void tagCleanup()
-      throws ManifoldCFException
-    {
-      // Delete the contents file if it is there.
-      if (contentFile != null)
-      {
-        contentFile.delete();
-        contentFile = null;
-      }
-    }
-    
-    public String getAuthor()
-    {
-      return author;
-    }
-
-    public String getLastModified()
-    {
-      return lastModified;
-    }
-    
-    public String getComment()
-    {
-      return comment;
-    }
-    
-    public File getContentFile()
-    {
-      File rval = contentFile;
-      contentFile = null;
-      return rval;
-    }
-    
-  }
-  
-  protected static String readResponseAsString(HttpResponse httpResponse)
-    throws IOException
-  {
-    HttpEntity entity = httpResponse.getEntity();
-    if (entity != null)
-    {
-      InputStream is = entity.getContent();
-      try
-      {
-        Charset charSet;
-        try
-        {
-          ContentType ct = ContentType.get(entity);
-          if (ct == null)
-            charSet = StandardCharsets.UTF_8;
-          else
-            charSet = ct.getCharset();
-        }
-        catch (ParseException e)
-        {
-          charSet = StandardCharsets.UTF_8;
-        }
-        char[] buffer = new char[65536];
-        Reader r = new InputStreamReader(is,charSet);
-        Writer w = new StringWriter();
-        try
-        {
-          while (true)
-          {
-            int amt = r.read(buffer);
-            if (amt == -1)
-              break;
-            w.write(buffer,0,amt);
-          }
-        }
-        finally
-        {
-          w.flush();
-        }
-        return w.toString();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    return "";
-  }
-  
-  protected static void handleException(Throwable thr)
-    throws InterruptedException, ManifoldCFException, ServiceInterruption, IOException, HttpException
-  {
-    if (thr != null) {
-      if (thr instanceof ManifoldCFException) {
-	if (((ManifoldCFException) thr).getErrorCode() == ManifoldCFException.INTERRUPTED) {
-	  throw new InterruptedException(thr.getMessage());
-	}
-	throw (ManifoldCFException) thr;
-      } else if (thr instanceof ServiceInterruption) {
-	throw (ServiceInterruption) thr;
-      } else if (thr instanceof IOException) {
-	throw (IOException) thr;
-      } else if (thr instanceof HttpException) {
-	throw (HttpException) thr;
-      } else if (thr instanceof RuntimeException) {
-	throw (RuntimeException) thr;
-      } else if (thr instanceof Error) {
-	throw (Error) thr;
-      } else {
-        throw new RuntimeException("Unexpected exception class: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-    }
-  }
-
-}
diff --git a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_en_US.properties b/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_en_US.properties
deleted file mode 100644
index f4ef681..0000000
--- a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_en_US.properties
+++ /dev/null
@@ -1,62 +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.
-
-WikiConnector.Server=Server
-WikiConnector.Email=Email
-WikiConnector.Proxy=Proxy
-
-WikiConnector.Protocol=Protocol:
-WikiConnector.ServerName=Server name:
-WikiConnector.Port=Port:
-WikiConnector.PathName=Path name:
-WikiConnector.ServerLogin=API login:
-WikiConnector.ServerPassword=API password:
-WikiConnector.ServerDomain=API domain:
-WikiConnector.NamespaceAndTitles=Namespace and Titles
-WikiConnector.NamespaceAndTitles2=Namespaces and titles:
-WikiConnector.Namespace=Namespace
-WikiConnector.TitlePrefix=Title prefix
-WikiConnector.Security=Security
-WikiConnector.TypeInAnAccessToken=Type in an access token
-WikiConnector.NoAccessTokensPresent=No access tokens present
-WikiConnector.AccessTokens=Access tokens:
-WikiConnector.NoAccessTokensSpecified=No access tokens specified
-WikiConnector.Delete=Delete
-WikiConnector.NoSpecification=No specification; all default namespace documents currently included
-WikiConnector.Add=Add
-WikiConnector.AddNamespacePrefix=Add namespace/prefix
-WikiConnector.UseDefault=Use default
-WikiConnector.TransientError=Transient error: 
-WikiConnector.AllDefaultNamespaceDocumentsIncluded=All default namespace documents included
-WikiConnector.WikiServerPortMustBeAValidInteger=Wiki server port must be a valid integer
-WikiConnector.PathMustStartWithACharacter=Path must start with a '/' character
-WikiConnector.PleaseSupplyAValidWikiServerName=Please supply a valid Wiki server name
-WikiConnector.NeedAValidEmailAddress=Need a valid email address
-WikiConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=Email address required to be included in all request headers
-WikiConnector.EmailAddressToContactColon=Email address to contact:
-WikiConnector.Parameters=Parameters:
-WikiConnector.certificates= certificate(s)
-WikiConnector.DeleteNamespaceTitle=Delete namespace/title #
-WikiConnector.AccessUser=Basic auth user name:
-WikiConnector.AccessPassword=Basic auth password:
-WikiConnector.AccessRealm=Basic auth realm:
-
-WikiConnector.ProxyHostColon=Proxy host:
-WikiConnector.ProxyPortColon=Proxy port:
-WikiConnector.ProxyDomainColon=Proxy domain:
-WikiConnector.ProxyUsernameColon=Proxy user name:
-WikiConnector.ProxyPasswordColon=Proxy password:
-
-WikiConnector.ProxyPortMustBeAValidInteger=Proxy port must be a valid integer
diff --git a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_es_ES.properties b/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_es_ES.properties
deleted file mode 100644
index df1f54e..0000000
--- a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_es_ES.properties
+++ /dev/null
@@ -1,62 +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.
-
-WikiConnector.Server=Servidor
-WikiConnector.Email=Email
-WikiConnector.Proxy=Proxy
-
-WikiConnector.Protocol=Protocolo:
-WikiConnector.ServerName=Nombre del servidor:
-WikiConnector.Port=Puerto:
-WikiConnector.PathName=nombre de ruta:
-WikiConnector.ServerLogin=API de inicio de sesión:
-WikiConnector.ServerPassword=contraseña API:
-WikiConnector.ServerDomain=dominio API:
-WikiConnector.NamespaceAndTitles=Espacio de nombres y títulos
-WikiConnector.NamespaceAndTitles2=Los espacios de nombres y títulos:
-WikiConnector.Namespace=Espacio de nombres
-WikiConnector.TitlePrefix=prefijo Título
-WikiConnector.Security=Seguridad
-WikiConnector.TypeInAnAccessToken=Escriba un token de acceso
-WikiConnector.NoAccessTokensPresent=No hay tokens de acceso actuales
-WikiConnector.AccessTokens=tokens de acceso:
-WikiConnector.NoAccessTokensSpecified=No hay tokens de acceso especificados
-WikiConnector.Delete=Borrar
-WikiConnector.NoSpecification=No especificado; todos los documentos de espacio de nombres por defecto actualmente incluidos
-WikiConnector.Add=Añadir
-WikiConnector.AddNamespacePrefix=Añadir espacio de nombres/Añadir espacio de nombres
-WikiConnector.UseDefault=Uso por defecto
-WikiConnector.TransientError=error transitorio: 
-WikiConnector.AllDefaultNamespaceDocumentsIncluded=Todos los documentos de espacio de nombres por defecto incluido
-WikiConnector.WikiServerPortMustBeAValidInteger=Puerto del servidor Wiki debe ser un entero válido
-WikiConnector.PathMustStartWithACharacter=Camino debe comenzar con una '/' character
-WikiConnector.PleaseSupplyAValidWikiServerName=Por favor, facilite un nombre de servidor Wiki válida
-WikiConnector.NeedAValidEmailAddress=Necesitas una dirección de correo electrónico válida
-WikiConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=Dirección de correo electrónico requiere que se incluirá en todos los encabezados de solicitud
-WikiConnector.EmailAddressToContactColon=Dirección de correo electrónico para ponerse en contacto:
-WikiConnector.Parameters=Parámetros:
-WikiConnector.certificates= certificados
-WikiConnector.DeleteNamespaceTitle=eliminar espacio de nombres/título #
-WikiConnector.AccessUser=Nombre de usuario de autenticación básica:
-WikiConnector.AccessPassword=Contraseña de autenticación básica:
-WikiConnector.AccessRealm=Reino de autenticación básica:
-
-WikiConnector.ProxyHostColon=host Proxy:
-WikiConnector.ProxyPortColon=Puerto de proxy:
-WikiConnector.ProxyDomainColon=dominio Proxy:
-WikiConnector.ProxyUsernameColon=Nombre de usuario de proxy:
-WikiConnector.ProxyPasswordColon=contraseña del proxy:
-
-WikiConnector.ProxyPortMustBeAValidInteger=Puerto proxy debe ser un entero válido
diff --git a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_ja_JP.properties b/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_ja_JP.properties
deleted file mode 100644
index 733897f..0000000
--- a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_ja_JP.properties
+++ /dev/null
@@ -1,62 +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.
-
-WikiConnector.Server=サーバ
-WikiConnector.Email=メール
-WikiConnector.Proxy=Proxy
-
-WikiConnector.Protocol=プロトコル:
-WikiConnector.ServerName=サーバ名:
-WikiConnector.Port=ポート:
-WikiConnector.PathName=パス名:
-WikiConnector.ServerLogin=API login:
-WikiConnector.ServerPassword=API password:
-WikiConnector.ServerDomain=API domain:
-WikiConnector.NamespaceAndTitles=名前空間と題名
-WikiConnector.NamespaceAndTitles2=名前空間と題名:
-WikiConnector.Namespace=名前空間
-WikiConnector.TitlePrefix=題名接先頭辞
-WikiConnector.Security=Security
-WikiConnector.TypeInAnAccessToken=Type in an access token
-WikiConnector.NoAccessTokensPresent=No access tokens present
-WikiConnector.AccessTokens=Access tokens:
-WikiConnector.NoAccessTokensSpecified=No access tokens specified
-WikiConnector.Delete=削除
-WikiConnector.NoSpecification=指定なし。すべてのデフォルト名前空間ドキュメントを含む
-WikiConnector.Add=追加
-WikiConnector.AddNamespacePrefix=名前空間/接先頭辞の追加
-WikiConnector.UseDefault=デフォルトを使う
-WikiConnector.TransientError=一時的エラー: 
-WikiConnector.AllDefaultNamespaceDocumentsIncluded=すべてのデフォルト名前空間を含む
-WikiConnector.WikiServerPortMustBeAValidInteger=Wikiサーバポートには整数を入力してください
-WikiConnector.PathMustStartWithACharacter=パス名の先頭は「/」にしてください
-WikiConnector.PleaseSupplyAValidWikiServerName=正しいWikiサーバ名を入力してください
-WikiConnector.NeedAValidEmailAddress=妥当なメールアドレスが必要です
-WikiConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=すべてのリクエストヘッダに含めるメールアドレスが必要です
-WikiConnector.EmailAddressToContactColon=連絡先メールアドレス:
-WikiConnector.Parameters=引数:
-WikiConnector.certificates= 証明証
-WikiConnector.DeleteNamespaceTitle=名前空間/題名を削除: #
-WikiConnector.AccessUser=Basic auth user name:
-WikiConnector.AccessPassword=Basic auth password:
-WikiConnector.AccessRealm=Basic auth realm:
-
-WikiConnector.ProxyHostColon=Proxy host:
-WikiConnector.ProxyPortColon=Proxy port:
-WikiConnector.ProxyDomainColon=Proxy domain:
-WikiConnector.ProxyUsernameColon=Proxy user name:
-WikiConnector.ProxyPasswordColon=Proxy password:
-
-WikiConnector.ProxyPortMustBeAValidInteger=Proxy port must be a valid integer
diff --git a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_zh_CN.properties b/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_zh_CN.properties
deleted file mode 100644
index 283ef03..0000000
--- a/connectors/wiki/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/wiki/common_zh_CN.properties
+++ /dev/null
@@ -1,62 +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.
-
-WikiConnector.Server=服务器
-WikiConnector.Email=电子邮件
-WikiConnector.Proxy=代理
-
-WikiConnector.Protocol=协议: 
-WikiConnector.ServerName=服务器名: 
-WikiConnector.Port=端口: 
-WikiConnector.PathName=路径名: 
-WikiConnector.ServerLogin=API登录:
-WikiConnector.ServerPassword=API密码:
-WikiConnector.ServerDomain=API域:
-WikiConnector.NamespaceAndTitles=命名空间和标题
-WikiConnector.NamespaceAndTitles2=命名空间和标题: 
-WikiConnector.Namespace=命名空间
-WikiConnector.TitlePrefix=标题前缀
-WikiConnector.Security=安全
-WikiConnector.TypeInAnAccessToken=请输入访问令牌
-WikiConnector.NoAccessTokensPresent=访问令牌不存在
-WikiConnector.AccessTokens=访问令牌:
-WikiConnector.NoAccessTokensSpecified=访问令牌未指定
-WikiConnector.Delete=删除
-WikiConnector.NoSpecification=未指定。包含所有缺省命名空间的文档
-WikiConnector.Add=添加
-WikiConnector.AddNamespacePrefix=添加命名空间/前缀
-WikiConnector.UseDefault=使用缺省值
-WikiConnector.TransientError=暂时性错误:  
-WikiConnector.AllDefaultNamespaceDocumentsIncluded=包含所有缺省命名空间
-WikiConnector.WikiServerPortMustBeAValidInteger=Wiki服务器端口必须为有效的整数
-WikiConnector.PathMustStartWithACharacter=路径的第一个字符必须为‘/’
-WikiConnector.PleaseSupplyAValidWikiServerName=请输入有效的Wiki服务器名
-WikiConnector.NeedAValidEmailAddress=需要有效的邮箱地址
-WikiConnector.EmailAddressRequiredToBeIncludedInAllRequestHeaders=请输入邮箱地址,它将包含在所有请求头中
-WikiConnector.EmailAddressToContactColon=邮箱联系地址:
-WikiConnector.Parameters=参数: 
-WikiConnector.certificates= 证书
-WikiConnector.DeleteNamespaceTitle=删除命名空间/标题:  #
-WikiConnector.AccessUser=基本认证用户:
-WikiConnector.AccessPassword=基本认证密码:
-WikiConnector.AccessRealm=基本认证区域:
-
-WikiConnector.ProxyHostColon=代理主机:
-WikiConnector.ProxyPortColon=代理端口:
-WikiConnector.ProxyDomainColon=代理域:
-WikiConnector.ProxyUsernameColon=代理用户:
-WikiConnector.ProxyPasswordColon=代理密码:
-
-WikiConnector.ProxyPortMustBeAValidInteger=代理端口必须为有效的整数
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseHSQLDB.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseHSQLDB.java
deleted file mode 100644
index 86c7abe..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseHSQLDB
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Wiki Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector"};
-  }
-
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseITHSQLDB.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseITHSQLDB.java
deleted file mode 100644
index 071901f..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseITHSQLDB
-{
-  protected MockWikiService wikiService = null;
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Wiki Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWikiService()
-    throws Exception
-  {
-    wikiService = new MockWikiService(getClass());
-    wikiService.start();
-  }
-  
-  @After
-  public void shutdownWikiService()
-    throws Exception
-  {
-    if (wikiService != null)
-      wikiService.stop();
-  }
-  
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseMySQL.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseMySQL.java
deleted file mode 100644
index 4b07930..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseMySQL.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.crawler.tests.ConnectorBaseMySQL
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Wiki Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector"};
-  }
-
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BasePostgresql.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BasePostgresql.java
deleted file mode 100644
index 9b2f9d3..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BasePostgresql.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.crawler.tests.ConnectorBasePostgresql
-{
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Wiki Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector"};
-  }
-
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseUIHSQLDB.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseUIHSQLDB.java
deleted file mode 100644
index d01451b..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/BaseUIHSQLDB.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseUIHSQLDB extends org.apache.manifoldcf.crawler.tests.ConnectorBaseUIHSQLDB
-{
-  protected MockWikiService wikiService = null;
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"Wiki Connector"};
-  }
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector"};
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[]{"Null Output"};
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  // Setup and teardown the mock wiki service
-  
-  @Before
-  public void createWikiService()
-    throws Exception
-  {
-    wikiService = new MockWikiService(BaseUIHSQLDB.class);
-    wikiService.start();
-  }
-  
-  @After
-  public void shutdownWikiService()
-    throws Exception
-  {
-    if (wikiService != null)
-      wikiService.stop();
-  }
-  
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/MockWikiService.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/MockWikiService.java
deleted file mode 100644
index b35a9ec..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/MockWikiService.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.*;
-import java.util.*;
-
-/** Mock wiki service */
-public class MockWikiService
-{
-  Server server;
-  WikiAPIServlet servlet;
-    
-  public MockWikiService(Class theResourceClass)
-  {
-    server = new Server(new QueuedThreadPool(35));
-    ServerConnector connector = new ServerConnector(server);
-    connector.setPort(8089);
-    server.addConnector(connector);
-    servlet = new WikiAPIServlet(theResourceClass);
-    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    context.setContextPath("/w");
-    server.setHandler(context);
-    context.addServlet(new ServletHolder(servlet), "/api.php");
-  }
-    
-  public void start() throws Exception
-  {
-    server.start();
-  }
-    
-  public void stop() throws Exception
-  {
-    server.stop();
-  }
-
-  public void setResources(Map<String,String> checkResources,
-    Map<String,String> listResources,
-    Map<String,String> timestampQueryResources,
-    Map<String,String> urlQueryResources,
-    Map<String,String> docInfoQueryResources,
-    String namespaceResource)
-  {
-    servlet.setResources(checkResources,listResources,timestampQueryResources,urlQueryResources,docInfoQueryResources,namespaceResource);
-  }
-  
-  protected static String sortStuff(String input)
-  {
-    String[] ids = input.split("\\|");
-    java.util.Arrays.sort(ids);
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < ids.length ; i++)
-    {
-      if (i > 0)
-        sb.append("|");
-      sb.append(ids[i]);
-    }
-    return sb.toString();
-  }
-  
-  public static class WikiAPIServlet extends HttpServlet
-  {
-    protected Class theResourceClass;
-    
-    protected Map<String,String> checkResources = null;
-    protected Map<String,String> listResources = null;
-    protected Map<String,String> timestampQueryResources = null;
-    protected Map<String,String> urlQueryResources = null;
-    protected Map<String,String> docInfoQueryResources = null;
-    protected String namespaceResource = null;
-    
-    public WikiAPIServlet(Class theResourceClass)
-    {
-      this.theResourceClass = theResourceClass;
-    }
-    
-    public void setResources(Map<String,String> checkResources,
-      Map<String,String> listResources,
-      Map<String,String> timestampQueryResources,
-      Map<String,String> urlQueryResources,
-      Map<String,String> docInfoQueryResources,
-      String namespaceResource)
-    {
-      this.checkResources = checkResources;
-      this.listResources = listResources;
-      this.timestampQueryResources = timestampQueryResources;
-      this.urlQueryResources = urlQueryResources;
-      this.docInfoQueryResources = docInfoQueryResources;
-      this.namespaceResource = namespaceResource;
-    }
-    
-    @Override
-    public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException
-    {
-      String resourceName = null;
-      
-      String format = req.getParameter("format");
-      if (!format.equals("xml"))
-        throw new IOException("Format parameter incorrect: "+format);
-      String action = req.getParameter("action");
-      if (action == null || !action.equals("query"))
-        throw new IOException("Action parameter incorrect: "+action);
-      String list = req.getParameter("list");
-      String prop = req.getParameter("prop");
-      String siprop = req.getParameter("siprop");
-      if (prop != null)
-      {
-	if (siprop != null || list != null)
-	  throw new IOException("Cannot have both prop and list or siprop");
-        String pageIds = req.getParameter("pageids");
-        if (prop.equals("revisions"))
-        {
-          String rvprop = req.getParameter("rvprop");
-          if (rvprop != null && rvprop.equals("timestamp"))
-          {
-            // Version query
-            if (pageIds == null)
-              throw new IOException("missing pageids parameter, required for version query");
-            // Sort the pageIds
-            pageIds = sortStuff(pageIds);
-            resourceName = timestampQueryResources.get(pageIds);
-            if (resourceName == null)
-              throw new IOException("Could not find a matching resource for the timestamp parameters; pageids = '"+pageIds+"'");
-          }
-          else if (rvprop != null && rvprop.equals("user|comment|content|timestamp"))
-          {
-            // Doc info query
-            if (pageIds == null)
-              throw new IOException("missing pageids parameter, required for docinfo query");
-            if (pageIds.indexOf("|") != -1)
-              throw new IOException("cannot do more than one docinfo request at once");
-            resourceName = docInfoQueryResources.get(pageIds);
-            if (resourceName == null)
-              throw new IOException("Could not find a matching resource for the user|comment|content|timestamp parameters; pageids = '"+pageIds+"'");
-          }
-          else
-            throw new IOException("rvprop parameter missing or incorrect: "+rvprop);
-        }
-        else if (prop.equals("info"))
-        {
-          String inprop = req.getParameter("inprop");
-          if (inprop == null || !inprop.equals("url"))
-            throw new IOException("inprop parameter missing or incorrect: "+inprop);
-          // url query
-          if (pageIds == null)
-            throw new IOException("missing pageids parameter, required for url query");
-          // Sort the pageIds
-          pageIds = sortStuff(pageIds);
-          resourceName = urlQueryResources.get(pageIds);
-          if (resourceName == null)
-            throw new IOException("Could not find a matching resource for the info url parameters; pageids = '"+pageIds+"'");
-        }
-        else
-          throw new IOException("Invalid value for prop parameter: "+prop);
-      }
-      else if (list != null)
-      {
-	if (prop != null || siprop != null)
-	  throw new IOException("Cannot have both list and prop or siprop");
-        if (!list.equals("allpages"))
-          throw new IOException("List parameter incorrect: "+list);
-        String apfrom = req.getParameter("apfrom");
-        if (apfrom == null)
-          apfrom = "";
-        String aplimit = req.getParameter("aplimit");
-        // Only two legal values for aplimit here: 1 and 500.
-        if (aplimit.equals("1"))
-          resourceName = checkResources.get(apfrom);
-        else if (aplimit.equals("500"))
-          resourceName = listResources.get(apfrom);
-        else
-          throw new IOException("aplimit parameter incorrect: "+aplimit);
-        if (resourceName == null)
-          throw new IOException("Could not find a matching resource for the list parameters; apfrom = '"+apfrom+"'");
-
-      }
-      else if (siprop != null)
-      {
-	if (prop != null || list != null)
-	  throw new IOException("Cannot have both siprop and list or prop");
-	String meta = req.getParameter("meta");
-	if (meta == null || !meta.equals("siteinfo"))
-	  throw new IOException("meta parameter missing or incorrect");
-	resourceName = namespaceResource;
-      }
-
-      // Select the resource
-      if (resourceName == null)
-        throw new IOException("Could not find a matching resource for the parameters");
-      
-      res.setStatus(HttpServletResponse.SC_OK);
-      
-      OutputStream os = res.getOutputStream();
-      try
-      {
-        InputStream is = theResourceClass.getResourceAsStream(resourceName);
-        if (is == null)
-          throw new IOException("Can't locate resource '"+resourceName+"' in class '"+theResourceClass.getName()+"'");
-        try
-        {
-          byte[] bytes = new byte[65536];
-          while (true)
-          {
-            int amt = is.read(bytes,0,bytes.length);
-            if (amt == -1)
-              break;
-            os.write(bytes,0,amt);
-          }
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        os.close();
-      }
-    }
-  }
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/NavigationHSQLDBUI.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/NavigationHSQLDBUI.java
deleted file mode 100644
index de7c79e..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/NavigationHSQLDBUI.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Basic UI navigation tests */
-public class NavigationHSQLDBUI extends BaseUIHSQLDB
-{
-
-  protected static Map<String,String> initialCheckResources;
-  protected static Map<String,String> initialListResources;
-  protected static Map<String,String> initialTimestampQueryResources;
-  protected static Map<String,String> initialURLQueryResources;
-  protected static Map<String,String> initialDocInfoQueryResources;
-  protected static final String namespaceResource = "get_namespaces.xml";
-
-  static
-  {
-    initialCheckResources = new HashMap<String,String>();
-    initialCheckResources.put("","list_one.xml");
-    
-    initialListResources = new HashMap<String,String>();
-    
-    initialTimestampQueryResources = new HashMap<String,String>();
-    
-    initialURLQueryResources = new HashMap<String,String>();
-    
-    initialDocInfoQueryResources = new HashMap<String,String>();
-  }
-
-  @Test
-  public void createConnectionsAndJob()
-    throws Exception
-  {
-    // Initialize the mock service
-    wikiService.setResources(initialCheckResources,
-      initialListResources,
-      initialTimestampQueryResources,
-      initialURLQueryResources,
-      initialDocInfoQueryResources,
-      namespaceResource);
-    
-    testerInstance.start(SeleniumTester.BrowserType.CHROME, "en-US", "http://localhost:8346/mcf-crawler-ui/index.jsp");
-
-    //Login
-    testerInstance.waitForElementWithName("loginform");
-    testerInstance.setValue("userID","admin");
-    testerInstance.setValue("password","admin");
-    testerInstance.clickButton("Login");
-    testerInstance.verifyHeader("Welcome to Apache ManifoldCF™");
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButton("Add a new output connection");
-
-    // Fill in a name
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyOutputConnection");
-
-    //Goto to Type tab
-    testerInstance.clickTab("Type");
-
-    // Select a type
-    testerInstance.waitForElementWithName("classname");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    testerInstance.clickButton("Continue");
-
-    // Now save the connection.
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-
-    // Define a repository connection via the UI
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButton("Add new connection");
-
-    testerInstance.waitForElementWithName("connname");
-    testerInstance.setValue("connname","MyRepositoryConnection");
-
-    // Select a type
-    testerInstance.clickTab("Type");
-    testerInstance.selectValue("classname","org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector");
-    testerInstance.clickButton("Continue");
-
-    // Visit the Throttling tab
-    testerInstance.clickTab("Throttling");
-
-    // Visit the rest of the tabs - Email first
-    testerInstance.clickTab("Email");
-    testerInstance.setValue("email", "foo@bar.com");
-    
-    // Visit the Server tab
-    testerInstance.clickTab("Server");
-    testerInstance.setValue("servername", "localhost");
-    testerInstance.setValue("serverport", "8089");
-
-    // Save
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    // Look for "connection working"
-    final String pageSource = testerInstance.getRenderedSource();
-    if (pageSource.indexOf("Connection working") == -1)
-    {
-      throw new Exception("Connection working message not there");
-    }
-    //window = testerInstance.findWindow(null);
-    //window.checkMatch(testerInstance.createStringDescription("Connection working"));
-
-    // Create a job
-    testerInstance.navigateTo("List jobs");
-    //Add a job
-    testerInstance.clickButton("Add a new job");
-    testerInstance.waitForElementWithName("description");
-    //Fill in a name
-    testerInstance.setValue("description","MyJob");
-    testerInstance.clickTab("Connection");
-
-    // Select the connections
-    testerInstance.selectValue("output_connectionname","MyOutputConnection");
-    testerInstance.selectValue("output_precedent","-1");
-    testerInstance.clickButton("Add output",true);
-    testerInstance.waitForElementWithName("connectionname");
-    testerInstance.selectValue("connectionname","MyRepositoryConnection");
-    
-    testerInstance.clickButton("Continue");
-
-    // Visit all the tabs.  Scheduling tab first
-    testerInstance.clickTab("Scheduling");
-    testerInstance.selectValue("dayofweek","0");
-    testerInstance.selectValue("hourofday","1");
-    testerInstance.selectValue("minutesofhour","30");
-    testerInstance.selectValue("monthofyear","11");
-    testerInstance.selectValue("dayofmonth","none");
-    testerInstance.setValue("duration","120");
-    testerInstance.clickButton("Add Scheduled Time",true);
-    testerInstance.waitForElementWithName("editjob");
-
-    // The Namespace and Titles tab
-    testerInstance.clickTab("Namespace and Titles");
-    testerInstance.clickButton("Add", true);
-
-    // Go back to the Name tab
-    testerInstance.clickTab("Name");
-    
-    // Save the job
-    testerInstance.clickButton("Save");
-    testerInstance.verifyThereIsNoError();
-    
-    testerInstance.waitForPresenceById("job");
-    String jobID = testerInstance.getAttributeValueById("job","jobid");
-
-    //Navigate to List Jobs
-    testerInstance.navigateTo("List jobs");
-    testerInstance.waitForElementWithName("listjobs");
-
-    //Delete the job
-    testerInstance.clickButtonByTitle("Delete job " + jobID);
-    testerInstance.acceptAlert();
-    testerInstance.verifyThereIsNoError();
-
-    //Wait for the job to go away
-    testerInstance.waitForJobDeleteEN(jobID, 120);
-
-    // Delete the repository connection
-    testerInstance.navigateTo("List repository connections");
-    testerInstance.clickButtonByTitle("Delete MyRepositoryConnection");
-    testerInstance.acceptAlert();
-
-    // Delete the output connection
-    testerInstance.navigateTo("List output connections");
-    testerInstance.clickButtonByTitle("Delete MyOutputConnection");
-    testerInstance.acceptAlert();
-
-  }
-  
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityHSQLDBIT.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityHSQLDBIT.java
deleted file mode 100644
index c22cee3..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityHSQLDBIT.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.connectors.wiki.WikiConfig;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBIT extends BaseITHSQLDB
-{
-  protected static Map<String,String> initialCheckResources;
-  protected static Map<String,String> initialListResources;
-  protected static Map<String,String> initialTimestampQueryResources;
-  protected static Map<String,String> initialURLQueryResources;
-  protected static Map<String,String> initialDocInfoQueryResources;
-  protected static final String namespaceResource = "get_namespaces.xml";
-  static
-  {
-    initialCheckResources = new HashMap<String,String>();
-    initialCheckResources.put("","list_one.xml");
-    
-    initialListResources = new HashMap<String,String>();
-    initialListResources.put("","list_full.xml");
-    initialListResources.put("Kre Mbaye","list_full_last.xml");
-    
-    initialTimestampQueryResources = new HashMap<String,String>();
-    addCombinations(initialTimestampQueryResources,new String[]{"14773725","19219017","19319577","19839654","30955295"},"get_timestamps.xml");
-    // Use some individual overrides too
-    // MHL
-    
-    initialURLQueryResources = new HashMap<String,String>();
-    addCombinations(initialURLQueryResources,new String[]{"14773725","19219017","19319577","19839654","30955295"},"get_urls.xml");
-    // Use some individual overrides too
-    // MHL
-    
-    initialDocInfoQueryResources = new HashMap<String,String>();
-    initialDocInfoQueryResources.put("14773725","14773725.xml");
-    initialDocInfoQueryResources.put("19219017","19219017.xml");
-    initialDocInfoQueryResources.put("19319577","19319577.xml");
-    initialDocInfoQueryResources.put("19839654","19839654.xml");
-    initialDocInfoQueryResources.put("30955295","30955295.xml");
-    
-  }
-
-  protected static void addCombinations(Map<String,String> target, String[] values, String resource)
-  {
-    boolean[] vector = new boolean[values.length];
-    for (int i = 0 ; i < vector.length ; i++)
-    {
-      vector[i] = false;
-    }
-    
-    // Iterate through all the combinations.  Only take the ones that can exist.
-    while (true)
-    {
-      int result = 0;
-      for (int i = 0 ; i < vector.length ; i++)
-      {
-        result += vector[i]?1:0;
-      }
-      if (result != 0 && result <= 20)
-      {
-        // found one
-        StringBuilder sb = new StringBuilder();
-        boolean isFirst = true;
-        for (int i = 0 ; i < vector.length ; i++)
-        {
-          if (vector[i])
-          {
-            if (!isFirst)
-              sb.append("|");
-            else
-              isFirst = false;
-            sb.append(values[i]);
-          }
-        }
-        target.put(sb.toString(),resource);
-      }
-      // Now we increment.
-      int incLevel = 0;
-      while (incLevel < vector.length)
-      {
-        if (!vector[incLevel])
-        {
-          vector[incLevel] = true;
-          break;
-        }
-        // Had a carry
-        incLevel++;
-        for (int i = 0 ; i < incLevel ; i++)
-        {
-          vector[i] = false;
-        }
-      }
-      if (incLevel == vector.length)
-        break;
-    }
-        
-  }
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    try
-    {
-      // Hey, we were able to install the file system connector etc.
-      // Now, create a local test job and run it.
-      IThreadContext tc = ThreadContextFactory.make();
-      
-      // Create a basic file system connection, and save it.
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection conn = mgr.create();
-      conn.setName("Wiki Connection");
-      conn.setDescription("Wiki Connection");
-      conn.setClassName("org.apache.manifoldcf.crawler.connectors.wiki.WikiConnector");
-      conn.setMaxConnections(10);
-      ConfigParams cp = conn.getConfigParams();
-      cp.setParameter(WikiConfig.PARAM_PROTOCOL,"http");
-      cp.setParameter(WikiConfig.PARAM_SERVER,"localhost");
-      cp.setParameter(WikiConfig.PARAM_PORT,"8089");
-      cp.setParameter(WikiConfig.PARAM_PATH,"/w");
-      
-      // Now, save
-      mgr.save(conn);
-      
-      // Create a basic null output connection, and save it.
-      IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-      IOutputConnection outputConn = outputMgr.create();
-      outputConn.setName("Null Connection");
-      outputConn.setDescription("Null Connection");
-      outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-      outputConn.setMaxConnections(100);
-      // Now, save
-      outputMgr.save(outputConn);
-
-      // Create a job.
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription job = jobManager.createJob();
-      job.setDescription("Test Job");
-      job.setConnectionName("Wiki Connection");
-      job.addPipelineStage(-1,true,"Null Connection","");
-      job.setType(job.TYPE_SPECIFIED);
-      job.setStartMethod(job.START_DISABLE);
-      job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-      
-      // Now, set up the document specification.
-      // Right now we don't need any...
-      Specification ds = job.getSpecification();
-      
-      // Save the job.
-      jobManager.save(job);
-
-      // Initialize the mock service
-      wikiService.setResources(initialCheckResources,
-        initialListResources,
-        initialTimestampQueryResources,
-        initialURLQueryResources,
-        initialDocInfoQueryResources,
-	namespaceResource);
-        
-      // Now, start the job, and wait until it completes.
-      jobManager.manualStart(job.getID());
-      waitJobInactiveNative(jobManager,job.getID(),120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      JobStatus status = jobManager.getStatus(job.getID());
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      if (status.getDocumentsProcessed() != 5)
-        throw new ManifoldCFException("Wrong number of documents processed - expected 5, saw "+new Long(status.getDocumentsProcessed()).toString());
-      
-      /*
-      // Add a file and recrawl
-      createFile(new File("testdata/testdir/test4.txt"),"Added file");
-
-      // Now, start the job, and wait until it completes.
-      jobManager.manualStart(job.getID());
-      waitJobInactive(jobManager,job.getID(),120000L);
-
-      status = jobManager.getStatus(job.getID());
-      // The test data area has 4 documents and one directory, and we have to count the root directory too.
-      if (status.getDocumentsProcessed() != 6)
-        throw new ManifoldCFException("Wrong number of documents processed after add - expected 6, saw "+new Long(status.getDocumentsProcessed()).toString());
-
-      // Change a file, and recrawl
-      changeFile(new File("testdata/test1.txt"),"Modified contents");
-      
-      // Now, start the job, and wait until it completes.
-      jobManager.manualStart(job.getID());
-      waitJobInactive(jobManager,job.getID(),120000L);
-
-      status = jobManager.getStatus(job.getID());
-      // The test data area has 4 documents and one directory, and we have to count the root directory too.
-      if (status.getDocumentsProcessed() != 6)
-        throw new ManifoldCFException("Wrong number of documents processed after change - expected 6, saw "+new Long(status.getDocumentsProcessed()).toString());
-      // We also need to make sure the new document was indexed.  Have to think about how to do this though.
-      // MHL
-      
-      // Delete a file, and recrawl
-      removeFile(new File("testdata/test2.txt"));
-      
-      // Now, start the job, and wait until it completes.
-      jobManager.manualStart(job.getID());
-      waitJobInactive(jobManager,job.getID(),120000L);
-
-      // Check to be sure we actually processed the right number of documents.
-      status = jobManager.getStatus(job.getID());
-      // The test data area has 3 documents and one directory, and we have to count the root directory too.
-      if (status.getDocumentsProcessed() != 5)
-        throw new ManifoldCFException("Wrong number of documents processed after delete - expected 5, saw "+new Long(status.getDocumentsProcessed()).toString());
-      */
-      
-      // Now, delete the job.
-      jobManager.deleteJob(job.getID());
-      waitJobDeletedNative(jobManager,job.getID(),120000L);
-      
-      // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityHSQLDBTest.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityHSQLDBTest.java
deleted file mode 100644
index 2982ca9..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityMySQLTest.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityMySQLTest.java
deleted file mode 100644
index 29c2a9f..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityMySQLTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityPostgresqlTest.java b/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityPostgresqlTest.java
deleted file mode 100644
index 767a2e3..0000000
--- a/connectors/wiki/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/wiki/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors.wiki.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/14773725.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/14773725.xml
deleted file mode 100644
index af66d38..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/14773725.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<api><query><pages><page pageid="14773725" ns="0" title="Kre8tiveworkz"><revisions><rev user="71.196.107.90" anon="" comment="/* Company Identity */" xml:space="preserve">{{orphan|date=July 2009}}
-
-[[Image:kre8tiveworkz logo.jpg|300px|right|]]
-'''Kre8tiveworkz''', a privately owned [[United States|American]] company based in [[Pembroke Pines, Florida]], is the original manufacturer and designer of Reality Rhyming&lt;!--hide broken link &lt;ref name=autogenerated1&gt;[http://www.fox4morningblend.com/tabid/3530/story/18679/Default.aspx Fox 4 Morning Blend - Turn Your Day Around Weekdays at 10AM &gt; Past Shows &gt; Segment Detail]&lt;/ref&gt; --&gt; personalized poetry gifts worldwide.  Reality Rhyming is a poetic writing style that uses a person's name and background information about a person's life and their experiences to create a story of [[rhyme]] for a particular occasion that's based on the premise "If Your Life Was A Poem, What Would It Say?".
-
-== Background ==
-
-Founded in 2004 by 34 year old [[Barbara Goleman Senior High]] [[Special Education]] [[Teacher]] and [[American poet]] Todd Edwards&lt;!-- broken link &lt;ref name=autogenerated3&gt;http://www.miamiherald.com/news/broward/story/352651.html&lt;/ref&gt; --&gt;, who started the company by selling poetry in the form of people's lives by word of mouth.  He was born in [[Hollywood, Florida]] in 1970 to his parents Michell and Joan Rubinstein.  Edwards' birth name is Todd Edward Rubinstein and is also an avid tennis player, being formally ranked #1 in Florida, 9th in United States (2006 - singles, Men's 30's) and #1 in Florida, 8th in United States (2008 - doubles - Men's 30's).
-
-[[Image:Marth Stewart finished frame this one.JPG|thumb|Sample Kre8tiveworkz Reality Rhyming personalized poetry masterpiece designed for [[Martha Stewart]]]].
-===Company Identity===
-In 2006, the Kre8tiveworkz personalized gift company redesigned its identity, along with branding the poetic writing style of Reality Rhyming. The slogans (2006) "Expressions for a Lifetime", (2007) "If Your Life Was A Poem, What Would It Say?", (2008) "If Your Pet's Life Was A Poem, What Would It Say?" and "If Your Wedding Was A Poem, What Would It Say?" created a mass public appeal by being promoted in ad campaigns, a practice the company continues to the present day.  The company has showcased its collections in art shows, at special events, on televised newscasts,&lt;ref name=autogenerated2&gt;[http://www.nbc6.net/station/13915322/detail.html On Friday's Show - About NBC 6 News Story - WTVJ | Miami&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;&lt;ref name=autogenerated4&gt;[http://www1.wsvn.com/features/articles/stylefiles/MI70669/ WSVN-TV - Style Files - Extreme Gifts&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;, including [[Entertainment Tonight]],&lt;ref&gt;http://www.etonline.com/news/2008/12/69167/index.html&lt;/ref&gt; the [[Today (NBC program)|Today Show]]&lt;ref&gt;http://today.msnbc.msn.com/id/26184891/vp/30641675#30641675&lt;/ref&gt;, ABC's [[Extreme Makeover: Home Edition]]&lt;ref&gt;http://abc.go.com/primetime/xtremehome/index?pn=afo#t=131956&lt;/ref&gt; and other media outlets.&lt;ref&gt;[http://specialevents.com/eventtools/rhyme_time/ Rhyme Time | Kre8tiveworkz introduces Reality Rhyming&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;   
-
-Some celebrities and organizations that Kre8tiveworkz has designed poetry for have been [[Elton John]]&lt;ref&gt;[http://www.eltonjohnworld.com/coranto/news/2007/November/EltontobeFetedForHelpWithC.html Elton to be Feted For Help With Children's Charity&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;, [[Ellen DeGeneres]], [[Maria Sharapova]]&lt;ref&gt;[http://enews.penton.com/enews/specialevents/eventline/2007_november_07_november/display Eventline: EVENTLINE: HOTELS EXPECT STRONG EVENT BUSINESS IN '08&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;, [[Oprah Winfrey]]&lt;ref&gt;http://www.prleap.com/pr/104532/&lt;/ref&gt;, [[Justin Timberlake]], [[Martha Stewart]], NFL Commissioner [[Roger Goodell]], [[Kathie Lee Gifford]], [[Donny Deutsch]], [[Regis Philbin]], [[Kelly Ripa]], [[Paris Hilton]], [[Hoda Kotb]], [[Will I Am]], [[James Blake]], Kevin Harrington, [[Daymond John]], [[Jeana Keough]] of the Housewives of OC, [[Keegan-Michael Key]] of MADtv, [[Kimbo Slice]] MMA Fighter, Lisa Stanley of [[KRTH]] 101, [[NBC]]&lt;ref name=autogenerated2 /&gt; and [[Fox Broadcasting Company|Fox]]&lt;ref name=autogenerated4 /&gt; Television Networks, [[Carling Bassett]], [[Nadia Petrova]], the [[Academy Awards]], Sandals Resorts, Hard Rock Hotels, [[Miami-Dade County Public Schools]], the [[Miami Heat]], Lorraine Thomas and television news personalities such as Lynn Martinez, Louis Aguirre and [[Belkys Nerey]] of [[WSVN]],&lt;ref&gt;[http://www.pr.com/press-release/64240 Kre8tiveworkz to be Featured on Top Rated South Florida News Program - PR.com&lt;!-- Bot generated title --&gt;]&lt;/ref&gt; Cyndi Edwards and Dave Nemeth of the nationally syndicated show "Daytime", Bob Mayer, Trina Robinson and Kelly Craig of "South Florida Today" and Gayle Guyardo, Jennifer Hill and Alicia Roberts of WFLA.  
-
-In 2006, Kre8tiveworkz founded the "Kre8tiveworkz Humanitarian Award" which is an inspirational award given to individuals who have demonstrated outstanding service to their community and have contributed to making the world a better place.  Winners include:  2006 [[Oprah Winfrey]], 2007 Karen Embden of [[Miami-Dade County Public Schools]], 2008 Bob Mayer, Trina Robinson and Kelly Craig of [[WTVJ]] and 2009 [[Janet Reno]].
-
-===Charitable Organizations===
-
-Kre8tiveworkz has been linked to charitable organizations such as [[Fran Drescher]]'s Cancer Schmancer, the [[American Heart Association]], the [[Andy Roddick]] Foundation&lt;ref&gt;[http://www.andyroddick.com/3699/pr-insidecom-singersongwriter-to-receive-honor-from-andy-roddick-foundation/ AndyRoddick.com » Blog Archive » PR-Inside.com: SINGER/SONGWRITER TO RECEIVE HONOR FROM ANDY RODDICK FOUNDATION&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;, the [[Make-A-Wish Foundation]]&lt;ref&gt;[http://sfla.wish.org/spev-ichmawball07B-auction.htm Make-A-Wish Foundation of Southern Florida InterContinental Make-A-Wish Ball Featuring Sharon Stone Natalie Cole Governor Charlie Crist&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;, Shriners Children's Hospital, Adopt-A-Classroom, Metro Zoo, Women of Tomorrow, ICAN, the Ann Storke Foundation, Dress for Success and the Sydney &amp; Alexandria Cohen Foundation.
-
-==Management ==
-The current President and CEO is Todd Edwards and the current Director is his father, Michell Rubinstein.
-
-== External links ==
-
-*Official Site [http://www.RealityRhyming.com]
-
-== References ==
-{{reflist}}
-
-[[Category:Companies based in Florida]]</rev></revisions></page></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19219017.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19219017.xml
deleted file mode 100644
index 8606422..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19219017.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<api><query><pages><page pageid="19219017" ns="0" title="Kre M'Baye"><revisions><rev user="Noformation" comment="Reverted edit(s) by [[Special:Contributions/173.35.84.11|173.35.84.11]] identified as test/vandalism using [[WP:STiki|STiki]]" xml:space="preserve">{{Orphan|date=November 2008}}
-'''Kre M’Baye''', also known as Amadou (or Armedy) Kre M’Baye, is a Senegalese artist and art instructor. He was born Andy Keve in [[Dakar, Senegal]] on April 25, 1949. He was nicknamed “Kere” or “Kre” even as a primary school child because he used to draw constantly on the classroom blackboard with chalk. Since 1969 he has been an associate of celebrated [[Africa]]n artists such as Ibou Diouf, Mamadou Niang, Seidou Barry, Mor Faye (father of Ousmane Faye) and Art College professor Pierre Lods. 
-
-In 1974 he played the head of a gang in the well-received movie ''Baks (Yamba)''&lt;ref&gt;[http://translate.google.com/translate?hl=en&amp;sl=fr&amp;u=http://www.africine.org/%3Fmenu%3Dfilm%26no%3D6942&amp;sa=X&amp;oi=translate&amp;resnum=9&amp;ct=result&amp;prev=/search%3Fq%3Dbaks%2BYamba%26hl%3Den%26client%3Dfirefox-a%26rls%3Dorg.mozilla:en-US:official%26hs%3DtEJ Africine Website]&lt;/ref&gt; produced by Momar Thiam, but abandoned his acting career in favor of his career as an artist. His first exhibition in 1976 at the Dynamique Museum of Dakar was highly acclaimed, his painting “The Messenger” receiving particular praise by President [[Léopold Sédar Senghor]]. 
-
-Some of his best-known works are his portraits of women inspired by the face of his mother Fari Fate (Mame Fari),&lt;ref&gt;[http://sfgate.com/cgi-bin/article.cgi?file=/c/a/2005/11/11/EBG2AFIHKH1.DTL San Francisco Chronicle ''Emeryville: Gallery Gives Rare Spotlight to West African Art'' by Rick DelVecchio, San Francisco Chronicle Nov. 11th, 2005]&lt;/ref&gt; “a woman [[griot]] of great renown; a fascinating storyteller of Senegalese history”. Very stylish, full of exuberance and cheerfulness, Fari Fate with her jewelries, her meticulous dresses, her elaborate hairstyles, inspired to the artist a painting style full of fineness. M'Baye has another style that tends to abstract paintings dominated by blue and orange colors.
-
-M'Baye is a disciple of Pierre Lods and was self-trained in the workshop of Peter Plastics Research Lods.&lt;ref&gt;[http://findarticles.com/p/articles/mi_m0438/is_3_35/ai_98171011/pg_19 ''The Ecole de Dakar: Pan-Africanism in Paint and Textile by Elizabeth Harney (Autumn 2002) African Arts]&lt;/ref&gt; In 1994 Gaston Madeira formed "Netty Guy" (The Three Baobabs), bringing together Kré M'Baye, Moussa N'Diaye Baydie M'Baye and Zulu, three painters representative of the School of Arts in Dakar, who in 1998 opened a gallery on the Senegalese island of N'gor and founded Workshops N'gor.&lt;ref&gt;[http://translate.google.com/translate?hl=en&amp;sl=fr&amp;u=http://www.takusaan.com/pages/neoCrea/art-ngor-present.html&amp;sa=X&amp;oi=translate&amp;resnum=2&amp;ct=result&amp;prev=/search%3Fq%3Dkre%2Bmbaye%26start%3D30%26hl%3Den%26client%3Dfirefox-a%26rls%3Dorg.mozilla:en-US:official%26sa%3DN%26pwst%3D1 Takusaan Website]&lt;/ref&gt; He was a participant in Tenq, the first workshop on the Triangle model (led by El Hadji Sy and sponsored by CBAO, [[Maersk]], SAEC and the [[British Council]], Dakar) held in West Africa, which took place at the Lycée Cheikh Oumar Fontiyou in Saint Louis, Senegal; the first event of Africa95, a year-long festival celebrating African arts in the [[United Kingdom|UK]] and Africa, featuring 25 artists from 10 African countries and Britain.&lt;ref&gt;[http://www.trianglearts.org/detail.php?id=33&amp;more=yes Triangle Arts Trust Website]&lt;/ref&gt; 
-
-His brother Seni M’Baye is also a noted Senegalese artist.
-
-==Exhibitions==
-* 1976	First exhibit to the 4th Senegalese painters and visual arts show at the Dynamique Museum of Dakar. 
-* 1983	New Expressions at [[Lorient]] in France
-* 1985	French Cultural Center in Dakar
-* 1985  IFA Gallery in [[Bonn, Germany]]
-* 1987	Senegalese painters &amp; visual artists exhibit – received Prize of the Head of State
-* 1987  Stadfische Gallery in Wendlinger in [[Germany]]
-* 1988	American Cultural Center of Dakar at the National Gallery – Kre’s ''Totem du Silence'' was the only painting selected to be put to auction
-* 1990	Le’Arche de la Defense in [[Paris, France]]
-* 1995	[[Cape Verde]]’ Islands – several traveling exhibitions
-* 1996	Contemporary Art Exhibition of Dammarie-les-Lys in France – won the City Prize
-* 1996	Selected to the Dak’Art 1996 Biennale&lt;ref&gt;Program of the event - Dak'Art: Biennial africain de l'art contemporain, Editions Cimaise, Paris, 1996&lt;/ref&gt;
-* 1998  Mil Arte, 98 Mill Lane (West Hampstead) [[London, England]] April - May
-* 1999	Kenkeleba Gallery in [[New York City]], U.S.A.
-* Since 1999, Permanent exposition at the Antenna Gallery, Félix Faure street in Dakar
-* 2002  Arts Plastiques Exposition: Dakar - Dakart at Aude Minart in Paris, France April 30 - May 5&lt;ref&gt;[http://www.africultures.com/index.asp?menu=affiche_evenement&amp;no_evenement=374 Africultures Website]&lt;/ref&gt;
-* 2005  April 1–14 National Gallery of Art - Sponsored by the American Cultural Center, [[National Museum of African Art]] in Washington. Three exhibitions of artists: Souleye Keita, Jacob Yacouba, and Amadou Kré M'Baye
-* 2005  [[St. Mark's Church]], New York City, U.S.A. Participated in Plexus International's presentation ''Erosions and Renaissance, Act IV'' 12/10/05
-* 2006  Senegalese Contemporary Art Exhibit: The Jokko Bar-Expo - 5 Rue Elzévir [[Paris, France]] (June - July)
-* 2007  Fine Arts Exhibition at Marcel Rozier's gallery in [[Bois-le-Roi, Seine-et-Marne|Bois-le-Roi]] from May 12–20 
-* 2008  Black Visibility: Contemporary African Art Exhibit March 19 - April 5 at the Conservatoire des Arts, 1, parvis sources 78180 [[Montigny-le-Bretonneux]], [[Saint-Quentin-en-Yvelines]]
-
-==Awards==
-
-* 1987	Prize of the Head of State of Senegal
-* 1996	City Prize of [[Dammarie-les-Lys]], France
-* 1999	Awarded L’Ordre National du Lion by [[Abdou Diouf]], President of the Republic of Senegal
-
-==References==
-{{reflist}}
-
-* ''An Anthology of African Art: The Twentieth Century'' by N’Gone’ Fall &amp; Jean Loup Pivin (June 2, 2002) D.A.P./Editions Revue Noire ISBN 1891024388, ISBN 978-1891024382
-* ''The Courier: Africa-Caribbean-Pacific-European Union'' (1991) Published by Commission of the European Communities (Original from the University of Virginia)
-* ''The Ecole de Dakar: Pan-Africanism in Paint and Textile'' by Elizabeth Harney (Autumn 2002) African Arts 
-* ''El Arte Africano Contemporaneo Existe'' by Jean-Arsène Yao [http://latinamericalandya.blogspot.com/2008/06/el-arte-africano-contemporneo-existe.html Latinamericalandya Website]
-* ''Emeryville: Gallery Gives Rare Spotlight to West African Art'' by Rick DelVecchio, San Francisco Chronicle November 11, 2005 [http://sfgate.com/cgi-bin/article.cgi?file=/c/a/2005/11/11/EBG2AFIHKH1.DTL San Francisco Chronicle]
-* ''In Senghor's Shadow: Art, Politics, and the Avant-Garde in Senegal, 1960-1995'' by Elizabeth Harney (2004) Duke University Press, 2004 ISBN 0822333953, ISBN 9780822333951
-* ''La Presse'' (Tunisia) October 30, 1974
-* ''St. James Guide to Black Artists'' by Thomas Riggs (1997) St. James Press (Original from the University of Michigan) ISBN 1558622209, ISBN 9781558622203
-* ''Thinking About Exhibitions'' by Reesa Greenberg, Bruce W. Ferguson &amp; Sandy Naime (May 13, 1996) Routledge ISBN 0415115906, ISBN 978-0415115902
-* ''Trajectoires: Art Contemporain du Senegal'' by Joanna Grabski (Spring, 2008) African Arts
-
-==External links==
-* [http://www.krembaye.com/biographie2.htm Krembaye.com]
-
-{{Persondata &lt;!-- Metadata: see [[Wikipedia:Persondata]]. --&gt;
-| NAME              = Mbaye, Kre
-| ALTERNATIVE NAMES =
-| SHORT DESCRIPTION =
-| DATE OF BIRTH     = 1949
-| PLACE OF BIRTH    =
-| DATE OF DEATH     =
-| PLACE OF DEATH    =
-}}
-{{DEFAULTSORT:Mbaye, Kre}}
-[[Category:Senegalese artists]]
-[[Category:1949 births]]
-[[Category:Living people]]
-[[Category:Senegalese people]]
-[[Category:Senegalese film actors]]</rev></revisions></page></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19319577.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19319577.xml
deleted file mode 100644
index 3d900d2..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19319577.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<api><query><pages><page pageid="19319577" ns="0" title="Kre Mbaye"><revisions><rev user="Rosencomet" comment="[[WP:AES|←]] Redirected page to [[Kre M'Baye]]" xml:space="preserve">#REDIRECT [[Kre M'Baye]]</rev></revisions></page></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19839654.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19839654.xml
deleted file mode 100644
index 112d701..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/19839654.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<api><query><pages><page pageid="19839654" ns="0" title="Kre'fey"><revisions><rev user="Mr.Z-man" comment="[[Wikipedia:Articles for deletion/Kre'fey]] closed as redirect to [[The New Jedi Order]]" xml:space="preserve">#REDIRECT [[The New Jedi Order]]</rev></revisions></page></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/30955295.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/30955295.xml
deleted file mode 100644
index a57d3d8..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/30955295.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<api><query><pages><page pageid="30955295" ns="0" title="Kre-O"><revisions><rev user="99.229.33.31" anon="" comment="/* $30 price */" xml:space="preserve">{{multiple issues|cleanup=February 2011|refimprove=April 2011}}
-{{Infobox Toy
-|name=Kre-O
-|image=
-|type=[[Construction set]]
-|inventor=
-|country=[[United States]]
-|company=[[Hasbro]]
-|from=2011
-|to=present
-|website=http://www.hasbro.com/kre-o/en_US/
-}}
-''Not to be consfused with [[KREO]].''&lt;br&gt;
-
-'''KRE-O''' is a line of construction toys (similar to [[Lego]] and [[Megabloks]]) manufactured by [[Hasbro]]. Kre-O has been announced to release in stores in Fall 2011&lt;ref&gt;[http://www.usatoday.com/money/companies/2011-02-12-hasbro-transformers_N.htm USATODAY.com: Hasbro pushes into Lego's land with new blocks]&lt;/ref&gt;&lt;ref&gt;[http://geek-news.mtv.com/2011/04/27/mtv-geek-exclusive-images-transformers-kre-o-optimus-prime-bumblee-and-ratchet/?xrs=share_fb MTV Geek EXCLUSIVE Images: Transformers , Bumblee, and Ratchet]&lt;/ref&gt;, although Hasbro started shipping out the first ''Transformers'' sets in early June 2011.&lt;ref&gt;[http://tformers.com/transformers-kre-o-transformers-optimus-prime/15920/news.html Kre-O Transformers Optimus Prime Now Shipping - Time Lapse Video of Building Prime]&lt;/ref&gt; The creators of the toy franchise got the named "Kre-O", from the Latin word "[[creo]]", which means "I create".&lt;ref&gt;[http://www.tfw2005.com/transformers-news/conventions-15/tfcc-magazine-issue-38-tidbits-171803/ TFCC Magazine Issue #38 Tidbits]&lt;/ref&gt; 
-
-==Kre-O Toylines==
-===Kre-O Transformers===
-Kre-O ''Transformers'' is the first line of all the Kre-O sets ever released. They were first shown at the New York Toy Fair 2011.&lt;ref&gt;[http://tformers.com/transformers-toy-fair-2011-transformers-building-block-toys-coming-in-2011/15131/news.html Toy Fair 2011 - Transformers Building Block Toys Coming In 2011]&lt;/ref&gt;
-====$7 "Basic" price====
-* '''[[Bumblebee (Transformers)|Bumblebee]]''' - 75 bricks, can be built as a robot or a car. No Kreons included.
-* '''[[Optimus Prime (Transformers)|Optimus Prime]]''' - 90 bricks, can be built as a robot or a semi-truck cab. No Kreons included.
-
-====$10 price====
-* '''[[Jazz (Transformers)|Jazz]]''' - 90 bricks, can be assemples as a robot or a sports car. Comes with 2 Kreons, '''Jazz''', and a '''driver'''.
-* '''[[Mirage (Transformers)|Mirage]]''' - 100 bricks, can be built as a robot or a race car. Comes with 3 Kreons, '''Mirage''', and 2 '''drivers'''.
-
-====$15 price====
-* '''[[Prowl (Transformers)|Prowl]]''' - 150 bricks, can be built as a robot or a police car. Comes with 3 Kreons, '''Prowl''', and 2 '''drivers'''. 
-
-====$20 price====
-* '''[[Ratchet (Transformers)|Ratchet]]''' - 200 pieces, can turn into a robot or an ambulance. Comes with 2 Kreons, '''Ratchet''' and a '''driver'''.
-* '''[[Sideswipe (Transformers)|Sideswipe]]''' - 220 bricks, can be build as a robot or a car. Comes with 2 Kreons, '''Sideswipe''' and a '''driver'''.&lt;ref&gt;[http://www.hasbro.com/kre-o/en_US/shop/details.cfm?R=50E47E34-5056-900B-10D0-19C5848E6ACC:en_US Hasbro.com - Kre-O Sideswipe]&lt;/ref&gt;
-
-====$25 price====
-* '''[[Bumblebee (Transformers)|Bumblebee]]''' - 336 bricks, can be built as a robot or a car. Comes with 3 Kreons, '''Bumblebee''', '''Red Alert''' and '''Driver'''.
-
-====$30 price====
-* '''[[Megatron (Transformers)|Megatron]]''' - 310 pieces, can be built as a robot or truck. Comes with  4 Kreons, '''Megatron''', '''[[Shockwave (Transformers)|Shockwave]]''', and 2 '''drivers'''.
-* '''[[Starscream]]''' - 316 bricks, can be built as a robot or a jet fighter. Comes with 3 Kreons, '''Starscream''',&lt;ref&gt;[http://www.tfw2005.com/transformers-news/transformers-movie-toys--products-30/more-transformers-kre-o-figures-and-kreons-revealed-171751/ More Transformers Kre-O Figures And Kreons Revealed]&lt;/ref&gt; and 2 '''pilots'''.
-
-====$40 price====
-* '''[[Sentinel Prime]]''' - 375 pieces, can be built as a robot or a fire truck. Comes with 5 Kreons, '''Sentinel Prime''', '''[[Soundwave (Transformers)|Soundwave]]''', '''[[Thundercracker]]''', and 2 '''drivers'''.
-
-====$60 price====
-* '''[[Optimus Prime (Transformers)|Optimus Prime]]''' - 500+ bricks, can be built as a robot or a semi-truck cab with trailer. Comes with 5 Kreons, '''Optimus Prime,''' '''[[Skywarp]]''', '''[[Bluestreak]]''', and 2 '''[[motorcycle]] drivers'''.&lt;ref&gt;[http://www.tfw2005.com/transformers-news/conventions-15/tfcc-magazine-issue-38-tidbits-171803/ TFCC Magazine Issue #38 Tidbits]&lt;/ref&gt;
-
-==Kreon==
-Kreon figures are mini [[super-deformed]] figures. They will be released with Kre-O construction sets. The Kre-O Transformers line will feature Kreon figures. Kreon figures are similar to [[Lego minifigure|Lego minifigures]] (e.g. [[Lego Batman]], [[Lego Star Wars]], [[Lego Atlantis]], [[Lego City]]). In the Kreon Transformers line there was 29 Kreon figures released (17 of them Transformers including an exclusive version of '''Optimus Prime''' that comes with the Matrix and 12 of them Humans.)
-
-==References==
-{{reflist}}
-[[Category:Construction toys]]
-[[Category:2011 introductions]]
-
-==External links==
-* [http://www.hasbro.com/kre-o/en_US/ Official Website]
-
-{{Hasbro}}</rev></revisions></page></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_namespaces.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_namespaces.xml
deleted file mode 100644
index c974e18..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_namespaces.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.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.
--->
-
-<api>
-  <query>
-    <namespaces>
-      <ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">Media</ns>
-      <ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">Special</ns>
-      <ns id="0" case="first-letter" subpages="" content="" xml:space="preserve" />
-      <ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">Talk</ns>
-      <ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">User</ns>
-      <ns id="90" case="first-letter" canonical="Thread" xml:space="preserve">Thread</ns>
-      <ns id="91" case="first-letter" canonical="Thread talk" xml:space="preserve">Thread talk</ns>
-    </namespaces>
-  </query>
-</api>
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_timestamps.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_timestamps.xml
deleted file mode 100644
index 5b8b17c..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_timestamps.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.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.
--->
-
-<api><query><pages><page pageid="14773725" ns="0" title="Kre8tiveworkz"><revisions><rev timestamp="2010-07-31T18:52:44Z" /></revisions></page><page pageid="19219017" ns="0" title="Kre M&#039;Baye"><revisions><rev timestamp="2011-05-29T22:07:53Z" /></revisions></page><page pageid="19319577" ns="0" title="Kre Mbaye"><revisions><rev timestamp="2008-09-14T20:37:19Z" /></revisions></page><page pageid="19839654" ns="0" title="Kre&#039;fey"><revisions><rev timestamp="2008-10-19T02:35:00Z" /></revisions></page><page pageid="30955295" ns="0" title="Kre-O"><revisions><rev timestamp="2011-09-06T12:20:20Z" /></revisions></page></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_urls.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_urls.xml
deleted file mode 100644
index 042cfdc..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/get_urls.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<api><query><pages><page pageid="14773725" ns="0" title="Kre8tiveworkz" touched="2011-10-03T03:51:34Z" lastrevid="376463852" counter="" length="6357" fullurl="http://en.wikipedia.org/wiki/Kre8tiveworkz" editurl="http://en.wikipedia.org/w/index.php?title=Kre8tiveworkz&amp;action=edit"/><page pageid="19219017" ns="0" title="Kre M'Baye" touched="2011-10-03T03:30:56Z" lastrevid="431554656" counter="" length="7749" fullurl="http://en.wikipedia.org/wiki/Kre_M%27Baye" editurl="http://en.wikipedia.org/w/index.php?title=Kre_M%27Baye&amp;action=edit"/><page pageid="19319577" ns="0" title="Kre Mbaye" touched="2011-05-29T22:07:53Z" lastrevid="238432075" counter="" length="24" redirect="" new="" fullurl="http://en.wikipedia.org/wiki/Kre_Mbaye" editurl="http://en.wikipedia.org/w/index.php?title=Kre_Mbaye&amp;action=edit"/><page pageid="19839654" ns="0" title="Kre'fey" touched="2011-09-29T00:50:43Z" lastrevid="246209449" counter="" length="32" redirect="" new="" fullurl="http://en.wikipedia.org/wiki/Kre%27fey" editurl="http://en.wikipedia.org/w/index.php?title=Kre%27fey&amp;action=edit"/><page pageid="30955295" ns="0" title="Kre-O" touched="2011-10-12T07:13:26Z" lastrevid="448739088" counter="" length="4995" fullurl="http://en.wikipedia.org/wiki/Kre-O" editurl="http://en.wikipedia.org/w/index.php?title=Kre-O&amp;action=edit"/></pages></query></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_full.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_full.xml
deleted file mode 100644
index fdea7a5..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_full.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.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.
--->
-
-<api><query><allpages><p pageid="19839654" ns="0" title="Kre&#039;fey" /><p pageid="30955295" ns="0" title="Kre-O" /><p pageid="14773725" ns="0" title="Kre8tiveworkz" /><p pageid="19219017" ns="0" title="Kre M&#039;Baye" /><p pageid="19319577" ns="0" title="Kre Mbaye" /></allpages></query><query-continue><allpages apfrom="Krea" /></query-continue></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_full_last.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_full_last.xml
deleted file mode 100644
index 5a8173a..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_full_last.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.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.
--->
-
-<api><query><allpages><p pageid="19319577" ns="0" title="Kre Mbaye" /></allpages></query><query-continue><allpages apfrom="Kre Mbaye" /></query-continue></api>
\ No newline at end of file
diff --git a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_one.xml b/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_one.xml
deleted file mode 100644
index 3b67045..0000000
--- a/connectors/wiki/connector/src/test/resources/org/apache/manifoldcf/crawler/connectors/wiki/tests/list_one.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.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.
--->
-
-<api><query><allpages><p pageid="19839654" ns="0" title="Kre&#039;fey" /></allpages></query><query-continue><allpages apfrom="Krea" /></query-continue></api>
\ No newline at end of file
diff --git a/connectors/wiki/pom.xml b/connectors/wiki/pom.xml
deleted file mode 100644
index 0373dd6..0000000
--- a/connectors/wiki/pom.xml
+++ /dev/null
@@ -1,380 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-connectors</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-  </properties>
-
-  <artifactId>mcf-wiki-connector</artifactId>
-  <name>ManifoldCF - Connectors - Wiki</name>
-
-  <build>
-    <defaultGoal>integration-test</defaultGoal>
-    <sourceDirectory>${basedir}/connector/src/main/java</sourceDirectory>
-    <testSourceDirectory>${basedir}/connector/src/test/java</testSourceDirectory>
-    <resources>
-      <resource>
-        <directory>${basedir}/connector/src/main/native2ascii</directory>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/connector/src/main/resources</directory>
-        <includes>
-          <include>**/*.html</include>
-          <include>**/*.js</include>
-        </includes>
-      </resource>
-    </resources> 
-    <testResources>
-      <testResource>
-        <directory>${basedir}/connector/src/test/resources</directory>
-      </testResource>
-    </testResources>
-    
-    <plugins>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-
-      <!-- Test plugin configuration -->
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-api-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-authority-service.war</destFileName>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                  <destFileName>mcf-crawler-ui.war</destFileName>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.18.1</version>
-        <configuration>
-          <skipTests>${skipITs}</skipTests>
-          <systemPropertyVariables>
-            <crawlerWarPath>../dependency/mcf-crawler-ui.war</crawlerWarPath>
-            <authorityserviceWarPath>../dependency/mcf-authority-service.war</authorityserviceWarPath>
-            <apiWarPath>../dependency/mcf-api-service.war</apiWarPath>
-          </systemPropertyVariables>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration-test</id>
-            <goals>
-              <goal>integration-test</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>verify</id>
-            <goals>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-	
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-connector-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-    </dependency>
-    
-    <!-- Testing dependencies -->
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/dist-license/DEPENDENCIES.txt b/dist-license/DEPENDENCIES.txt
deleted file mode 100644
index 2d7a20e..0000000
--- a/dist-license/DEPENDENCIES.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-ManifoldCF requires
-------------------
-* JRE 1.8 or above
-* Many other libraries, available from the ManifoldCF XXX-lib distribution
-
-For running ManifoldCF:
-----------------------
-* Read the "how-to-build-and-deploy.html" documentation page
-
-
diff --git a/dist-license/LICENSE.txt b/dist-license/LICENSE.txt
deleted file mode 100644
index f0116aa..0000000
--- a/dist-license/LICENSE.txt
+++ /dev/null
@@ -1,2565 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-
-Includes software from other Apache Software Foundation projects,
-including, but not limited to:
-  - Apache Tika
-  - Apache Poi
-  - Apache Pdfbox
-  - Apache Tomcat
-  - Apache Commons
-  - Apache Geronimo
-  - Apache Log4j
-  - Apache Axis
-  - Apache Xerces2
-  - Apache Chemistry
-  - Apache OpenNLP
-  - Apache Velocity
-  - Apache Avalon
-  - Apache FOP
-  - Apache XMLGraphics-commons
-  - Apache Mime4J
-  - Apache XMLBeans
-  - Apache SIS
-  - Apache OpenNLP
-  - Apache Kafka
-  - Apache CXF
-
-This product includes a number of slf4j jars.
-License: MIT/X11 license
-
-This product includes a postgresql.jar: http://jdbc.postgresql.org
-License: BSD License (http://jdbc.postgresql.org/license.html)
-
-This product includes a JUnit jar: http://junit.sourceforge.net/
-License: Common Public License - v 1.0 (http://junit.sourceforge.net/cpl-v10.html)
-
-This product includes an eclipse-ecj.jar.
-License: Eclipse Public License - v 1.0 (http://www.eclipse.org/legal/epl-v10.html)
-
-This product includes an hsqldb.jar: http://hsqldb.org/
-License: HSQL Development Group License (http://hsqldb.org/web/hsqlLicense.html)
-
-This product includes JSP API jars.
-License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)
-
-This product includes a stax-api.jar.
-License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a wstx-asl.jar.
-License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a stax-ex.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a org.osgi.core.jar.
-License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a resolver.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jaxb-impl.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a saaj-impl.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a streambuffer.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a jaxws-rt.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes an activation.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a jsr250-api.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a jsr181-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a jaxb-api.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a saaj-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a jaxws-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a mimepull.jar.
-License: COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0  (http://www.opensource.org/licenses/cddl1.php)    License: GPLv2 with classpath exception  (http://www.gnu.org/software/classpath/license.html)
-
-This product includes a h2-support.jar.
-License: MIT/X11 license
-
-This product includes a mail.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a wss4j.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes an opensaml.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a h2.jar.
-License: Dual; MPL 1.1 (http://www.mozilla.org/MPL/), and Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
-Jar included under terms of EPL 1.0.
-
-This product includes a xmlsec.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a wsdl4j.jar.
-License: CPL 1.0 (http://www.opensource.org/licenses/cpl1.0)
-
-This product includes a jstl-api-1.2.jar.
-License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)
-
-This product includes a jstl-impl-1.2.jar.
-License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)
-
-This product includes a dropbox-client.jar.
-License: MIT license (http://opensource.org/licenses/MIT).
-
-This product includes a json-simple.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a json.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sentiment-analysis-parser.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jackson-core.jar.
-License: Dual license; we choose to distribute under Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-api-client.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-oauth-client.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-api-services-drive-v2.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-api-services-drive-v2.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-http-client.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-http-client-jackson2.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a guava.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a tagsoup.jar.
-License: Apache 2 (http://home.ccil.org/~cowan/XML/tagsoup/)
-
-This product includes a javax.servlet-api.jar.
-License: Dual CDDL 1.0 and GPLv2 with classpath exception (https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-Redistributed under the terms of CDDL 1.0.
-
-This product includes a jhighlight.jar.
-License: Dual CDDL 1.0 and LGPLv2.1 (http://www.opensource.org/licenses/cddl1.php and http://www.opensource.org/licenses/lgpl-license.php)
-Redistributed under the terms of CDDL 1.0.
-
-This product includes a jmatio.jar.
-License: BSD License (https://github.com/sinjax/JMatIO/blob/master/license.txt)
-
-This product includes a java-libpst.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a vorbis-java-core.jar and vorbis-java-tika.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a metadata-extractor.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a bcprov-jdk15.jar and a bcmail-jdk15.jar.
-License: BouncyCastle license (http://www.bouncycastle.org/licence.html) [MIT derivative]
-
-This product includes a juniversalchardet.jar.
-License: Mozilla Public License 1.1 (MPL 1.1) (http://www.mozilla.org/MPL/MPL-1.1.html)
-
-This product includes a boilerpipe.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a dom4j.jar.
-License: BSD license (http://dom4j.sourceforge.net/dom4j-1.6.1/license.html)
-
-This product includes an asm.jar, asm-analysis.jar, asm-commons.jar, asm-debug-all.jar,
-asm-tree.jar, and asm-util.jar.
-License: BSD license.
-
-This product includes an xmpcore.jar.
-License: BSD license (http://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html)
-
-This product includes a jdom2.jar.
-License: Apache 2, without attribution requirement. (https://raw.githubusercontent.com/hunterhacker/jdom/master/LICENSE.txt)
-
-This product includes a rome.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes an isoparser.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes an xz.jar.
-License: Public domain
-
-This product includes an xmlschema-core.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a javax.annotation-api.jar.
-License: CDDL + GPLv2 with classpath exception (https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-Redistributed under terms of CDDL 1.0 license.
-
-This product includes a javax.ws.rs-api.jar.
-License: CDDL 1.1 + GPLv2 with classpath exception (http://glassfish.java.net/public/CDDL+GPL_1_1.html)
-Redistributed under terms of CDDL 1.1 license.
-
-This product includes a number of aws-java-sdk-* jars.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a joda-time.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jackcess.jar and a jackcess-encrypt.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a javaee-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a geoapi.jar.
-License: Open Geospatial license (https://raw.githubusercontent.com/opengeospatial/geoapi/master/LICENSE.txt)
-
-This product includes a junrar.jar.
-License: Junrar license (https://raw.github.com/junrar/junrar/master/license.txt)
-
-This product includes a netcdf4.jar, httpservices.jar, grib.jar, cdm.jar, and udunits.jar.
-License: UCAR license (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
-
-This product includes a jcommander.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jcip-annotations.jar.
-License: Apache 2 (https://github.com/stephenc/jcip-annotations/blob/master/LICENSE.txt)
-
-This product includes a ehcache-core.jar.
-License: Apache 2 (src/assemble/EHCACHE-CORE-LICENSE.txt)
-
-This product includes a bzip2.jar.
-License: MIT license (http://opensource.org/licenses/mit-license.php)
-
-This product includes a jdom2.jar.
-License: Apache 2 without acknowledgment clause (https://raw.github.com/hunterhacker/jdom/master/LICENSE.txt)
-
-This product includes a quartz.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a c3p0.jar.
-License: Dual license consisting of LGPL v2.1 and EPL v1.0 ((http://www.gnu.org/licenses/lgpl-2.1.html and http://www.eclipse.org/org/documents/epl-v10.php)
-Jar included under terms of EPL v1.0 license.
-
-This product includes a lz4-java.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a snappy-java.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes fontbox jar: http://pdfbox.apache.org/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes fontbox jempbox jar: http://www.apache.org/pdfbox-parent/jempbox/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes fontbox pdfbox jar: http://www.apache.org/pdfbox-parent/pdfbox/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a pdfbox-debugger.jar: http://www.apache.org/pdfbox-parent/pdfbox-debugger/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a pdfbox-tools.jar: http://www.apache.org/pdfbox-parent/pdfbox-debugger
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-metadata.jar: http://sis.apache.org/core/sis-metadata
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-referencing.jar: http://sis.apache.org/core/sis-referencing
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-utility.jar: http://sis.apache.org/core/sis-utility
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-netcdf.jar: http://sis.apache.org/storage/sis-netcdf
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-storage.jar: http://sis.apache.org/storage/sis-storage
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jetty-server.jar, jetty-servlet.jar, jetty-io.jar, jetty-jndi.jar, jetty-webapp.jar,
-jetty-plus.jar, jetty-util.jar, jetty-http.jar, jetty-security.jar, jetty-continuation.jar, jetty-xml.jar,
-jetty-jsp-jdt.jar, and jetty-schemas.jar.
-License: Dual Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt) and EPL (http://www.eclipse.org/legal/epl-v10.html)
-Distributed under terms of Apache 2 license.
-
-This product may include pdf files that embed IPA-licensed fonts.
-License: IPA Font License Agreement v1.0 (http://ossipedia.ipa.go.jp/ipafont/index.html#LicenseEng)
-
-This product includes a curvesapi.jar: https://github.com/virtuald/curvesapi
-License: BSD License (http://opensource.org/licenses/BSD-3-Clause)
-
-This product includes a number of selenium jars, e.g.:
-selenium-api.jar, selenium-chrome-driver.jar, selenium-edge-driver.jar, selenium-firefox-driver.jar, selenium-ie-driver.jar,
-selenium-java.jar, selenium-opera-driver.jar, selenium-remote-driver.jar, selenium-safari-driver.jar, selenium-support.jar
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a nuxeo-java-client.jar: https://doc.nuxeo.com/nxdoc/licenses/
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a retrofit.jar.
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a okhttp.jar.
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a okio.jar.
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-==========================================================================
-The following license applies to postgresql.jar, which is available from
-http://jdbc.postgresql.org
---------------------------------------------------------------------------
-Copyright (c) 1997-2010, PostgreSQL Global Development Group
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-3. Neither the name of the PostgreSQL Global Development Group nor the names
-   of its contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================
-The following license applies to JUnit, and
-wsdl4j.jar:
---------------------------------------------------------------------------
-Common Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
-LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
-CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-      a) in the case of the initial Contributor, the initial code and documentation distributed
-          under this Agreement, and
-      b) in the case of each subsequent Contributor:
-
-      i) changes to the Program, and
-
-      ii) additions to the Program;
-
-      where such changes and/or additions to the Program originate from and are distributed
-      by that particular Contributor. A Contribution 'originates' from a Contributor if it was
-      added to the Program by such Contributor itself or anyone acting on such Contributor's
-      behalf. Contributions do not include additions to the Program which: (i) are separate
-      modules of software distributed in conjunction with the Program under their own license
-      agreement, and (ii) are not derivative works of the Program. 
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily
-infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-      a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-          non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare
-          derivative works of, publicly display, publicly perform, distribute and sublicense the
-          Contribution of such Contributor, if any, and such derivative works, in source code
-          and object code form.
-
-      b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-          non-exclusive, worldwide, royalty-free patent license under Licensed Patents to
-          make, use, sell, offer to sell, import and otherwise transfer the Contribution of such
-          Contributor, if any, in source code and object code form. This patent license shall
-          apply to the combination of the Contribution and the Program if, at the time the
-          Contribution is added by the Contributor, such addition of the Contribution causes
-          such combination to be covered by the Licensed Patents. The patent license shall
-          not apply to any other combinations which include the Contribution. No hardware
-          per se is licensed hereunder. 
-
-      c) Recipient understands that although each Contributor grants the licenses to its
-          Contributions set forth herein, no assurances are provided by any Contributor that
-          the Program does not infringe the patent or other intellectual property rights of any
-          other entity. Each Contributor disclaims any liability to Recipient for claims brought
-          by any other entity based on infringement of intellectual property rights or otherwise.
-          As a condition to exercising the rights and licenses granted hereunder, each Recipient
-          hereby assumes sole responsibility to secure any other intellectual property rights
-          needed, if any. For example, if a third party patent license is required to allow
-          Recipient to distribute the Program, it is Recipient's responsibility to acquire that
-          license before distributing the Program.
-
-      d) Each Contributor represents that to its knowledge it has sufficient copyright rights
-          in its Contribution, if any, to grant the copyright license set forth in this Agreement. 
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own
-license agreement, provided that:
-
-      a) it complies with the terms and conditions of this Agreement; and
-
-      b) its license agreement:
-
-      i) effectively disclaims on behalf of all Contributors all warranties and conditions,
-         express and implied, including warranties or conditions of title and non-infringement,
-         and implied warranties or conditions of merchantability and fitness for a particular purpose; 
-
-      ii) effectively excludes on behalf of all Contributors all liability for damages, including
-         direct, indirect, special, incidental and consequential damages, such as lost profits; 
-
-      iii) states that any provisions which differ from this Agreement are offered by that
-          Contributor alone and not by any other party; and
-
-      iv) states that source code for the Program is available from such Contributor, and
-          informs licensees how to obtain it in a reasonable manner on or through a medium
-          customarily used for software exchange. 
-
-When the Program is made available in source code form:
-
-      a) it must be made available under this Agreement; and 
-
-      b) a copy of this Agreement must be included with each copy of the Program. 
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner
-that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end
-users, business partners and the like. While this license is intended to facilitate the
-commercial use of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential liability for other
-Contributors. Therefore, if a Contributor includes the Program in a commercial product
-offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
-every other Contributor ("Indemnified Contributor") against any losses, damages and costs
-(collectively "Losses") arising from claims, lawsuits and other legal actions brought by a
-third party against the Indemnified Contributor to the extent caused by the acts or omissions
-of such Commercial Contributor in connection with its distribution of the Program in a
-commercial product offering. The obligations in this section do not apply to any claims
-or Losses relating to any actual or alleged intellectual property infringement. In order to
-qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in
-writing of such claim, and b) allow the Commercial Contributor to control, and cooperate
-with the Commercial Contributor in, the defense and any related settlement negotiations.
-The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering,
-Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor
-then makes performance claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the other
-Contributors related to those performance claims and warranties, and if a court requires
-any other Contributor to pay any damages as a result, the Commercial Contributor must
-pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
-EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
-CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
-A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
-appropriateness of using and distributing the Program and assumes all risks associated
-with its exercise of rights under this Agreement, including but not limited to the
-risks and costs of program errors, compliance with applicable laws, damage to or
-loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT
-LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE
-PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law,
-it shall not affect the validity or enforceability of the remainder of the terms of this
-Agreement, and without further action by the parties hereto, such provision shall
-be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against a Contributor with respect to a
-patent applicable to software (including a cross-claim or counterclaim in a lawsuit),
-then any patent licenses granted by that Contributor to such Recipient under this
-Agreement shall terminate as of the date such litigation is filed. In addition, if
-Recipient institutes patent litigation against any entity (including a cross-claim
-or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations
-of the Program with other software or hardware) infringes such Recipient's patent(s),
-then such Recipient's rights granted under Section 2(b) shall terminate as of the
-date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with
-any of the material terms or conditions of this Agreement and does not cure such
-failure in a reasonable period of time after becoming aware of such noncompliance.
-If all Recipient's rights under this Agreement terminate, Recipient agrees to cease
-use and distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by Recipient
-relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order
-to avoid inconsistency the Agreement is copyrighted and may only be modified in
-the following manner. The Agreement Steward reserves the right to publish new
-versions (including revisions) of this Agreement from time to time. No one other
-than the Agreement Steward has the right to modify this Agreement. IBM is the
-initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement
-Steward to a suitable separate entity. Each new version of the Agreement will be
-given a distinguishing version number. The Program (including Contributions) may
-always be distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is published, Contributor
-may elect to distribute the Program (including its Contributions) under the new
-version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
-receives no rights or licenses to the intellectual property of any Contributor under
-this Agreement, whether expressly, by implication, estoppel or otherwise. All rights
-in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to this 
-Agreement will bring a legal action under this Agreement more than one year after
-the cause of action arose. Each party waives its rights to a jury trial in any
-resulting litigation.
-
-
-==========================================================================
-The following license applies to:
-eclipse-ecj.jar
-h2.jar
-c3p0.jar
---------------------------------------------------------------------------
-
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this
-    Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that
-particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program 
-by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not 
-include additions to the Program which: (i) are separate modules of software distributed in 
-conjunction with the Program under their own license agreement, and (ii) are not derivative works
-of the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed
-by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of,
-publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if
-any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell,
-offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination of the Contribution
-and the Program if, at the time the Contribution is added by the Contributor, such addition of the
-Contribution causes such combination to be covered by the Licensed Patents. The patent license
-shall not apply to any other combinations which include the Contribution. No hardware per se is
-licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set
-forth herein, no assurances are provided by any Contributor that the Program does not infringe the
-patent or other intellectual property rights of any other entity. Each Contributor disclaims any
-liability to Recipient for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and licenses granted
-hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual
-property rights needed, if any. For example, if a third party patent license is required to allow
-Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its
-Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license
-agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and 
-implied, including warranties or conditions of title and non-infringement, and implied warranties or
-conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct,
-indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor
-alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs
-licensees how to obtain it in a reasonable manner on or through a medium customarily used for
-software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that 
-reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users,
-business partners and the like. While this license is intended to facilitate the commercial use of the
-Program, the Contributor who includes the Program in a commercial product offering should do so in
-a manner which does not create potential liability for other Contributors. Therefore, if a Contributor
-includes the Program in a commercial product offering, such Contributor ("Commercial Contributor")
-hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against
-any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal
-actions brought by a third party against the Indemnified Contributor to the extent caused by the
-acts or omissions of such Commercial Contributor in connection with its distribution of the Program
-in a commercial product offering. The obligations in this section do not apply to any claims or 
-Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an 
-Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such 
-claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial 
-Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor 
-may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X.
-That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes 
-performance claims, or offers warranties related to Product X, those performance claims and 
-warranties are such Commercial Contributor's responsibility alone. Under this section, the 
-Commercial Contributor would have to defend claims against the other Contributors related to 
-those performance claims and warranties, and if a court requires any other Contributor to pay any 
-damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS 
-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED 
-INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, 
-NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient 
-is solely responsible for determining the appropriateness of using and distributing the Program and 
-assumes all risks associated with its exercise of rights under this Agreement , including but not 
-limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss 
-of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY 
-CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
-USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, 
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not 
-affect the validity or enforceability of the remainder of the terms of this Agreement, and without 
-further action by the parties hereto, such provision shall be reformed to the minimum extent 
-necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in
-a lawsuit) alleging that the Program itself (excluding combinations of the Program with other 
-software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted 
-under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the 
-material terms or conditions of this Agreement and does not cure such failure in a reasonable 
-period of time after becoming aware of such noncompliance. If all Recipient's rights under this 
-Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as 
-reasonably practicable. However, Recipient's obligations under this Agreement and any licenses 
-granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid 
-inconsistency the Agreement is copyrighted and may only be modified in the following manner. The 
-Agreement Steward reserves the right to publish new versions (including revisions) of this 
-Agreement from time to time. No one other than the Agreement Steward has the right to modify 
-this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation 
-may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. 
-Each new version of the Agreement will be given a distinguishing version number. The Program 
-(including Contributions) may always be distributed subject to the version of the Agreement under 
-which it was received. In addition, after a new version of the Agreement is published, Contributor 
-may elect to distribute the Program (including its Contributions) under the new version. Except as 
-expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the 
-intellectual property of any Contributor under this Agreement, whether expressly, by implication, 
-estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are 
-reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property 
-laws of the United States of America. No party to this Agreement will bring a legal action under 
-this Agreement more than one year after the cause of action arose. Each party waives its rights to 
-a jury trial in any resulting litigation.
-
-==========================================================================
-The following license applies to hsqldb.jar
---------------------------------------------------------------------------
-For work developed by the HSQL Development Group:
-
-Copyright (c) 2001-2010, The HSQL Development Group
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the HSQL Development Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-For work originally developed by the Hypersonic SQL Group:
-
-Copyright (c) 1995-2000 by the Hypersonic SQL Group.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the Hypersonic SQL Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-This software consists of voluntary contributions made by many individuals on behalf of the
-Hypersonic SQL Group.
-
-==========================================================================
-The following license applies to stax-ex.jar, from 'Java.net' (http://dev.java.net),
-mimepull.jar, from 'mimepull' (https://mimepull.dev.java.net),
-activation.jar, from 'JavaBeans(TM) Activation Framework Specification' (http://www.oracle.com/technetwork/java/jaf11-139815.html),
-jsr250.jar, from 'JSR-250 Common Annotations for the Java(TM) Platform' (http://jcp.org/aboutJava/communityprocess/final/jsr250/index.html),
-jaxb-api.jar, from 'Java Architecture for XML Binding' (https://jaxb.dev.java.net/),
-mail.jar, from http://glassfish.java.net/javaee5/mail/:
---------------------------------------------------------------------------
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-1. Definitions.
-
-1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications.
-
-1.2. Contributor Version means the combination of the Original Software, prior Modifications used by 
-a Contributor (if any), and the Modifications made by that particular Contributor.
-
-1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination 
-of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-1.4. Executable means the Covered Software in any form other than Source Code.
-
-1.5. Initial Developer means the individual or entity that first makes Original Software available under this License.
-
-1.6. Larger Work means a work which combines Covered Software or portions thereof with code not 
-governed by the terms of this License.
-
-1.7. License means this document.
-
-1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the 
-initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-1.9. Modifications means the Source Code and Executable form of any of the following: A. Any file that 
-results from an addition to, deletion from or modification of the contents of a file containing Original 
-Software or previous Modifications; B. Any new file that contains any part of the Original Software or 
-previous Modification; or C. Any new file that is contributed or otherwise made available under the 
-terms of this License.
-
-1.10. Original Software means the Source Code and Executable form of computer software code that is 
-originally released under this License.
-
-1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without 
-limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-1.12. Source Code means (a) the common form of computer software code in which modifications are 
-made and (b) associated documentation included in or with such code.
-
-1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with 
-all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled 
-by, or is under common control with You. For purposes of this definition, control means (a) the 
-power, direct or indirect, to cause the direction or management of such entity, whether by contract 
-or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or 
-beneficial ownership of such entity.
-
-2. License Grants.
-
- 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject 
- to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, 
- royalty-free, non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, 
-to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions 
-thereof), with or without Modifications, and/or as part of a Larger Work; and
-
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have 
-made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or 
-portions thereof);
-
- (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first 
- distributes or otherwise makes the Original Software available to a third party under the terms of this License;
-
- (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete 
- from the Original Software, or (2) for infringements caused by: (i) the modification of the Original 
- Software, or (ii) the combination of the Original Software with other software or devices.
-
-2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third 
-party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, 
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to 
-use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by 
-such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as 
-Covered Software and/or as part of a Larger Work; and
-
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that 
-Contributor either alone and/or in combination with its Contributor Version (or portions of such 
-combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 
-(1) Modifications made by that Contributor (or portions thereof); and (2) the combination of 
-Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-
-(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor 
-first distributes or otherwise makes the Modifications available to a third party.
-
-(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that 
-Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third 
-party modifications of Contributor Version, or (ii) the combination of Modifications made by that 
-Contributor with other software (except as part of the Contributor Version) or other devices; 
-or (3) under Patent Claims infringed by Covered Software in the absence of Modifications 
-made by that Contributor.
-
-3. Distribution Obligations.
-
-3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make 
-available in Executable form must also be made available in Source Code form and that Source 
-Code form must be distributed only under the terms of this License. You must include a copy 
-of this License with every copy of the Source Code form of the Covered Software You distribute 
-or otherwise make available. You must inform recipients of any such Covered Software in 
-Executable form as to how they can obtain such Covered Software in Source Code form in 
-a reasonable manner on or through a medium customarily used for software exchange.
-
-3.2. Modifications. The Modifications that You create or to which You contribute are governed 
-by the terms of this License. You represent that You believe Your Modifications are Your 
-original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-3.3. Required Notices. You must include a notice in each of Your Modifications that identifies 
-You as the Contributor of the Modification. You may not remove or alter any copyright, patent 
-or trademark notices contained within the Covered Software, or any notices of licensing or 
-any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered 
-Software in Source Code form that alters or restricts the applicable version of this License 
-or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, 
-support, indemnity or liability obligations to one or more recipients of Covered Software. 
-However, you may do so only on Your own behalf, and not on behalf of the Initial Developer 
-or any Contributor. You must make it absolutely clear that any such warranty, support, 
-indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify 
-the Initial Developer and every Contributor for any liability incurred by the Initial Developer or 
-such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-
-3.5. Distribution of Executable Versions. You may distribute the Executable form of the 
-Covered Software under the terms of this License or under the terms of a license of Your 
-choice, which may contain terms different from this License, provided that You are in compliance 
-with the terms of this License and that the license for the Executable form does not 
-attempt to limit or alter the recipients rights in the Source Code form from the rights set 
-forth in this License. If You distribute the Covered Software in Executable form under a 
-different license, You must make it absolutely clear that any terms which differ from this 
-License are offered by You alone, not by the Initial Developer or Contributor. You hereby 
-agree to indemnify the Initial Developer and every Contributor for any liability incurred by 
-the Initial Developer or such Contributor as a result of any such terms You offer.
-
-3.6. Larger Works. You may create a Larger Work by combining Covered Software with other 
-code not governed by the terms of this License and distribute the Larger Work as a single 
-product. In such a case, You must make sure the requirements of this License are fulfilled 
-for the Covered Software.
-
-4. Versions of the License.
-
-4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised 
-and/or new versions of this License from time to time. Each version will be given a 
-distinguishing version number. Except as provided in Section 4.3, no one other than the 
-license steward has the right to modify this License.
-
-4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make 
-the Covered Software available under the terms of the version of the License under which 
-You originally received the Covered Software. If the Initial Developer includes a notice in 
-the Original Software prohibiting it from being distributed or otherwise made available under 
-any subsequent version of the License, You must distribute and make the Covered Software 
-available under the terms of the version of the License under which You originally received 
-the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make 
-the Covered Software available under the terms of any subsequent version of the License 
-published by the license steward.
-
-4.3. Modified Versions. When You are an Initial Developer and You want to create a new 
-license for Your Original Software, You may create and use a modified version of this 
-License if You: (a) rename the license and remove any references to the name of the 
-license steward (except to note that the license differs from this License); and (b) 
-otherwise make it clear that the license contains terms which differ from this License.
-
-5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE 
-ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
-INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS 
-FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. 
-THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS 
-WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU 
-(NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY 
-NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY 
-CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE 
-IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail 
-to comply with terms herein and fail to cure such breach within 30 days of becoming 
-aware of the breach. Provisions which, by their nature, must remain in effect beyond 
-the termination of this License shall survive.
-
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) 
-against Initial Developer or a Contributor (the Initial Developer or Contributor against 
-whom You assert such claim is referred to as Participant) alleging that the Participant 
-Software (meaning the Contributor Version where the Participant is a Contributor or 
-the Original Software where the Participant is the Initial Developer) directly or indirectly 
-infringes any patent, then any and all rights granted directly or indirectly to You by 
-such Participant, the Initial Developer (if the Initial Developer is not the Participant) 
-and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days 
-notice from Participant terminate prospectively and automatically at the expiration of 
-such 60 day notice period, unless if within such 60 day period You withdraw Your claim 
-with respect to the Participant Software against such Participant either unilaterally or 
-pursuant to a written agreement with Participant.
-
-6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses 
-that have been validly granted by You or any distributor hereunder prior to termination 
-(excluding licenses granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, 
-WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, 
-THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED 
-SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON 
-FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY 
-CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS 
-OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY 
-AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL 
-HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION 
-OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY 
-RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS 
-SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION 
-OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION 
-MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item, as that 
-term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer 
-software (as that term is defined at 48 C.F.R.  252.227-7014(a)(1)) and commercial 
-computer software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). 
-Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), 
-all U.S. Government End Users acquire Covered Software with only those rights set 
-forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any 
-other FAR, DFAR, or other clause or provision that addresses Government rights in 
-computer software under this License.
-
-9. MISCELLANEOUS. This License represents the complete agreement concerning 
-subject matter hereof. If any provision of this License is held to be unenforceable, 
-such provision shall be reformed only to the extent necessary to make it enforceable. 
-This License shall be governed by the law of the jurisdiction specified in a notice 
-contained within the Original Software (except to the extent applicable law, if any, 
-provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any 
-litigation relating to this License shall be subject to the jurisdiction of the courts 
-located in the jurisdiction and venue specified in a notice contained within the 
-Original Software, with the losing party responsible for costs, including, without 
-limitation, court costs and reasonable attorneys fees and expenses. The application 
-of the United Nations Convention on Contracts for the International Sale of Goods 
-is expressly excluded. Any law or regulation which provides that the language of a 
-contract shall be construed against the drafter shall not apply to this License. You 
-agree that You alone are responsible for compliance with the United States export 
-administration regulations (and the export control laws and regulation of any other 
-countries) when You use, distribute or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, 
-each party is responsible for claims and damages arising, directly or indirectly, out 
-of its utilization of rights under this License and You agree to work with Initial 
-Developer and Contributors to distribute such responsibility on an equitable basis. 
-Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION 
-LICENSE (CDDL) The code released under the CDDL shall be governed by the laws 
-of the State of California (excluding conflict-of-law provisions). Any litigation 
-relating to this License shall be subject to the jurisdiction of the Federal Courts 
-of the Northern District of California and the state courts of the State of California, 
-with venue lying in Santa Clara County, California. 
-
-==========================================================================
-The following license applies to:
-javaee-api.jar, from https://glassfish.java.net/nonav/public/CDDL+GPL.html,
-jaxb-impl.jar, from 'Sun JAXB Reference Implementation Runtime' (https://jaxb.dev.java.net/),
-saaj-impl.jar, from 'Sun SAAJ Standard Implementation' (https://saaj.dev.java.net/),
-streambuffer.jar, from 'XML Stream Buffer Project' (https://xmlstreambuffer.dev.java.net/),
-jaxws-rt.jar, from 'JAX-WS (JSR-224) Reference Implementation' (https://jax-ws.dev.java.net//),
-jsr181-api.jar, from 'Web Services Metadata for Java' (http://jcp.org/en/jsr/summary?id=181),
-saaj-api.jar, from 'SAAJ API' (https://saaj.dev.java.net/),
-jaxws-api.jar, from 'JAX-WS (JSR-224) API' (https://jax-ws.dev.java.net/)
-javax.servlet-api.jar
-javax.annotation-api.jar
---------------------------------------------------------------------------
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-    1. Definitions.
-
-        1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
-
-        1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-
-        1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-        1.4. “Executable” means the Covered Software in any form other than Source Code.
-
-        1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
-
-        1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-
-        1.7. “License” means this document.
-
-        1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-        1.9. “Modifications” means the Source Code and Executable form of any of the following:
-
-            A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-
-            B. Any new file that contains any part of the Original Software or previous Modification; or
-
-            C. Any new file that is contributed or otherwise made available under the terms of this License.
-
-        1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
-
-        1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-        1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-
-        1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
-
-    2. License Grants.
-
-        2.1. The Initial Developer Grant.
-
-        Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-            (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-
-            (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-
-            (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-
-            (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-
-        2.2. Contributor Grant.
-
-        Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-            (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-
-            (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-
-            (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-
-            (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-
-    3. Distribution Obligations.
-
-        3.1. Availability of Source Code.
-
-        Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
-
-        3.2. Modifications.
-
-        The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-        3.3. Required Notices.
-
-        You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-        3.4. Application of Additional Terms.
-
-        You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-
-        3.5. Distribution of Executable Versions.
-
-        You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-
-        3.6. Larger Works.
-
-        You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-
-    4. Versions of the License.
-
-        4.1. New Versions.
-
-        Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-
-        4.2. Effect of New Versions.
-
-        You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
-
-        4.3. Modified Versions.
-
-        When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-
-    5. DISCLAIMER OF WARRANTY.
-
-    COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-    6. TERMINATION.
-
-        6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-        6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
-
-        6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-
-    7. LIMITATION OF LIABILITY.
-
-    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-    8. U.S. GOVERNMENT END USERS.
-
-    The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
-
-    9. MISCELLANEOUS.
-
-    This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
-
-    10. RESPONSIBILITY FOR CLAIMS.
-
-    As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-    NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-    The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-    0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
-
-    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-    1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-    2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-        a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-
-        b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-
-        c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
-
-    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-    3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-        a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-        b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-        c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-
-    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-    4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-    5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
-
-    6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-    7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
-
-    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-    8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-    9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-    10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-    NO WARRANTY
-
-    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-    END OF TERMS AND CONDITIONS
-
-    How to Apply These Terms to Your New Programs
-
-    If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-    To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-        One line to give the program's name and a brief idea of what it does.
-
-        Copyright (C)
-
-        This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-
-        This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-        You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-    Also add information on how to contact you by electronic and paper mail.
-
-    If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-        Gnomovision version 69, Copyright (C) year name of author
-        Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-
-    The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-    You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-        Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-        signature of Ty Coon, 1 April 1989
-        Ty Coon, President of Vice
-
-    This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-    "CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-    Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
-    "Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
-
-    Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
-
-    As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
-
-==========================================================================
-The following license applies to:
-javax.ws.rs-api.jar
---------------------------------------------------------------------------
-
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1
-
-1. Definitions.
-
-1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
-1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-1.4. “Executable” means the Covered Software in any form other than Source Code.
-1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
-1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-1.7. “License” means this document.
-1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-1.9. “Modifications” means the Source Code and Executable form of any of the following:
-A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-B. Any new file that contains any part of the Original Software or previous Modification; or
-C. Any new file that is contributed or otherwise made available under the terms of this License.
-1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
-1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
-2. License Grants.
-
-2.1. The Initial Developer Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-2.2. Contributor Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-3. Distribution Obligations.
-
-3.1. Availability of Source Code.
-Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
-3.2. Modifications.
-The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-3.3. Required Notices.
-You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-3.4. Application of Additional Terms.
-You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-3.5. Distribution of Executable Versions.
-You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-3.6. Larger Works.
-You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-4. Versions of the License.
-
-4.1. New Versions.
-Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-4.2. Effect of New Versions.
-You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
-4.3. Modified Versions.
-When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-5. DISCLAIMER OF WARRANTY.
-
-COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
-6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
-6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-7. LIMITATION OF LIABILITY.
-
-UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
-The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
-
-9. MISCELLANEOUS.
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
-These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-One line to give the program's name and a brief idea of what it does.
-Copyright (C) <year> <name of author>
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-signature of Ty Coon, 1 April 1989
-Ty Coon, President of Vice
-This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-Certain source files distributed by Oracle are subject to the following clarification and special exception to the GPL Version 2, but only where Oracle has expressly included in the particular source file's header the words "Oracle designates this particular file as subject to the "Classpath" exception as provided by Oracle in the License file that accompanied this code." 
-
-Linking this library statically or dynamically with other modules is making a combined work based on this library.  Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination. 
-
-As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.  An independent module is a module which is not derived from or based on this library.  If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.  If you do not wish to do so, delete this exception statement from your version.
-
-==========================================================================
-The following license applies to:
-h2-support.jar
---------------------------------------------------------------------------
-
-Copyright (c) 2011 Carlo Sciolla
-
-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, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-==========================================================================
-The following license applies to:
-asm.jar
-asm-analysis.jar
-asm-commons.jar
-asm-debug-all.jar
-asm-parent.jar
-asm-tree.jar
-asm-util.jar
---------------------------------------------------------------------------
-
-Copyright (c) 2000-2011 INRIA, France Telecom
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the copyright holders nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================
-The following license applies to:
-juniversalchardet.jar
---------------------------------------------------------------------------
-
-Mozilla Public License Version 1.1
-1. Definitions.
-
-1.0.1. "Commercial Use"
-    means distribution or otherwise making the Covered Code available to a third party. 
-1.1. "Contributor"
-    means each entity that creates or contributes to the creation of Modifications. 
-1.2. "Contributor Version"
-    means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 
-1.3. "Covered Code"
-    means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 
-1.4. "Electronic Distribution Mechanism"
-    means a mechanism generally accepted in the software development community for the electronic transfer of data. 
-1.5. "Executable"
-    means Covered Code in any form other than Source Code. 
-1.6. "Initial Developer"
-    means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 
-1.7. "Larger Work"
-    means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 
-1.8. "License"
-    means this document. 
-1.8.1. "Licensable"
-    means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 
-1.9. "Modifications"
-
-    means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:
-
-        Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.
-        Any new file that contains any part of the Original Code or previous Modifications. 
-
-1.10. "Original Code"
-    means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 
-1.10.1. "Patent Claims"
-    means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 
-1.11. "Source Code"
-    means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 
-1.12. "You" (or "Your")
-    means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 
-
-2. Source Code License.
-2.1. The Initial Developer Grant.
-
-The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
-
-    under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and
-    under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof).
-    the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License.
-    Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 
-
-2.2. Contributor Grant.
-
-Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license
-
-    under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and
-    under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-    the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code.
-    Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 
-
-3. Distribution Obligations.
-3.1. Application of License.
-
-The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.
-3.2. Availability of Source Code.
-
-Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
-3.3. Description of Modifications.
-
-You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.
-3.4. Intellectual Property Matters
-(a) Third Party Claims
-
-If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.
-(b) Contributor APIs
-
-If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the legal file.
-(c) Representations.
-
-Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.
-3.5. Required Notices.
-
-You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-3.6. Distribution of Executable Versions.
-
-You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-3.7. Larger Works.
-
-You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.
-4. Inability to Comply Due to Statute or Regulation.
-
-If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the legal file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
-5. Application of this License.
-
-This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.
-6. Versions of the License.
-6.1. New Versions
-
-Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.
-6.2. Effect of New Versions
-
-Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License.
-6.3. Derivative Works
-
-If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)
-7. Disclaimer of warranty
-
-Covered code is provided under this license on an "as is" basis, without warranty of any kind, either expressed or implied, including, without limitation, warranties that the covered code is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the covered code is with you. Should any covered code prove defective in any respect, you (not the initial developer or any other contributor) assume the cost of any necessary servicing, repair or correction. This disclaimer of warranty constitutes an essential part of this license. No use of any covered code is authorized hereunder except under this disclaimer.
-8. Termination
-
-8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that:
-
-    such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above.
-    any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 
-
-8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
-
-8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.
-9. Limitation of liability
-
-Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall you, the initial developer, any other contributor, or any distributor of covered code, or any supplier of any of such parties, be liable to any person for any indirect, special, incidental, or consequential damages of any character including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to you.
-10. U.S. government end users
-
-The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
-11. Miscellaneous
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
-12. Responsibility for claims
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-13. Multiple-licensed code
-
-Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A.
-Exhibit A - Mozilla Public License.
-
-"The contents of this file are subject to the Mozilla Public License
-Version 1.1 (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.mozilla.org/MPL/
-
-Software distributed under the License is distributed on an "AS IS"
-basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-License for the specific language governing rights and limitations
-under the License.
-
-The Original Code is ______________________________________.
-
-The Initial Developer of the Original Code is ________________________.
-Portions created by ______________________ are Copyright (C) ______
-_______________________. All Rights Reserved.
-
-Contributor(s): ______________________________________.
-
-Alternatively, the contents of this file may be used under the terms
-of the _____ license (the  "[___] License"), in which case the
-provisions of [______] License are applicable instead of those
-above. If you wish to allow use of your version of this file only
-under the terms of the [____] License and not to allow others to use
-your version of this file under the MPL, indicate your decision by
-deleting the provisions above and replace them with the notice and
-other provisions required by the [___] License. If you do not delete
-the provisions above, a recipient may use your version of this file
-under either the MPL or the [___] License."
-
-NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. 
-
-==========================================================================
-The following license applies to:
-dom4j.jar
---------------------------------------------------------------------------
- Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met:
-
-    Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document.
-    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-    The name "DOM4J" must not be used to endorse or promote products derived from this Software without prior written permission of MetaStuff, Ltd. For written permission, please contact dom4j-info@metastuff.com.
-    Products derived from this Software may not be called "DOM4J" nor may "DOM4J" appear in their names without prior written permission of MetaStuff, Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
-    Due credit should be given to the DOM4J Project - http://dom4j.sourceforge.net
-
-THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. 
-
-==========================================================================
-The following dual license applies to:
-jhighlight.jar
---------------------------------------------------------------------------
-
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-1. Definitions. 1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. 1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. 1.4. "Executable" means the Covered Software in any form other than Source Code. 1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License. 1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. 1.7. "License" means this document. 1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; B. Any new file that contains any part of the Original Software or previous Modification; or C. Any new file that is contributed or otherwise made available under the terms of this License. 1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License. 1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. 1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. 3.2. Modifications. The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. 3.3. Required Notices. You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. 3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.5. Distribution of Executable Versions. You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.6. Larger Works. You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. 4. Versions of the License. 4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. 4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. 4.3. Modified Versions. When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. 5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 6. TERMINATION. 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. 7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 8. U.S. GOVERNMENT END USERS. The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. ¤ 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. 9. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. 10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-GNU Lesser General Public License
-
-Version 2.1, February 1999
-
-    Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-    [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
-
-This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
-
-When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
-
-To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
-
-For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
-
-We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
-
-To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
-
-Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
-
-Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
-
-When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
-
-We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
-
-For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
-
-In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
-
-Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
-
-The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
-
-A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
-
-The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
-
-"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
-
-1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
-
-    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
-
-    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 
-
-3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
-
-Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
-
-This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
-
-4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
-
-If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
-
-5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
-
-However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
-
-When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
-
-If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
-
-Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
-
-6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
-
-You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
-
-    a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
-
-For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
-
-7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
-
-    b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
-
-8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
-
-10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
-
-11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
-
-14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-END OF TERMS AND CONDITIONS
-How to Apply These Terms to Your New Libraries
-If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
-
-To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and an idea of what it does.> Copyright (C) <year> <name of author>
-
-    This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
-
-    Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-    signature of Ty Coon, 1 April 1990
-    Ty Coon, President of Vice
-
-That's all there is to it! 
-
-==========================================================================
-The following license applies to:
-jmatio.jar
---------------------------------------------------------------------------
-
-Copyright (c) 2006, Wojciech Gradkowski
-All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-* Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in
-the documentation and/or other materials provided with the
-distribution.
-* Neither the name of the JMatIO nor the names of its
-contributors may be used to endorse or promote products derived
-from this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================
-The following license applies to:
-bcprov-jdk15on.jar
-bcmail-jdk15on.jar
-bcpkix-jdk15on:jar
-bcprov-jdk15on:jar
---------------------------------------------------------------------------
-
-Copyright (c) 2000 - 2015 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
-
-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, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
-
-==========================================================================
-The following license applies to:
-netcdf4.jar
-grib.jar
-cdm.jar
-udunits.jar
-httpservices.jar
---------------------------------------------------------------------------
-Copyright 1993-2015 University Corporation for Atmospheric Research/Unidata
-
-Portions of this software were developed by the Unidata Program at the University Corporation for Atmospheric Research.
-
-Access and use of this software shall impose the following obligations and understandings on the user. The user is granted the right, without any fee or cost, to use, copy, modify, alter, enhance and distribute this software, and any derivative works thereof, and its supporting documentation for any purpose whatsoever, provided that this entire notice appears in all copies of the software, derivative works and supporting documentation. Further, UCAR requests that the user credit UCAR/Unidata in any publications that result from the use of this software or in any product that includes this software, although this is not an obligation. The names UCAR and/or Unidata, however, may not be used in any advertising or publicity to endorse or promote any products or commercial entity unless specific written permission is obtained from UCAR/Unidata. The user also understands that UCAR/Unidata is not obligated to provide the user with any support, consulting, training or assistance of any kind with regard to the use, operation and performance of this software nor to provide the user with any updates, revisions, new versions or "bug fixes."
-
-THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR 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 ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
-
-==========================================================================
-The following license applies to:
-junrar.jar
---------------------------------------------------------------------------
- ******    *****   ******   UnRAR - free utility for RAR archives
- **   **  **   **  **   **  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ******   *******  ******    License for use and distribution of
- **   **  **   **  **   **   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- **   **  **   **  **   **         FREE portable version
-                                   ~~~~~~~~~~~~~~~~~~~~~
-
-      The source code of UnRAR utility is freeware. This means:
-
-   1. All copyrights to RAR and the utility UnRAR are exclusively
-      owned by the author - Alexander Roshal.
-
-   2. The UnRAR sources may be used in any software to handle RAR
-      archives without limitations free of charge, but cannot be used
-      to re-create the RAR compression algorithm, which is proprietary.
-      Distribution of modified UnRAR sources in separate form or as a
-      part of other software is permitted, provided that it is clearly
-      stated in the documentation and source comments that the code may
-      not be used to develop a RAR (WinRAR) compatible archiver.
-
-   3. The UnRAR utility may be freely distributed. It is allowed
-      to distribute UnRAR inside of other software packages.
-
-   4. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS".
-      NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.  YOU USE AT 
-      YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, 
-      DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
-      OR MISUSING THIS SOFTWARE.
-
-   5. Installing and using the UnRAR utility signifies acceptance of
-      these terms and conditions of the license.
-
-   6. If you don't agree with terms of the license you must remove
-      UnRAR files from your storage devices and cease to use the
-      utility.
-
-      Thank you for your interest in RAR and UnRAR.
-
-
-                                            Alexander L. Roshal
-
-==========================================================================
-The following license applies to:
-geoapi.jar
---------------------------------------------------------------------------
-
-GeoAPI - Java interfaces for OGC/ISO standards
-http://www.geoapi.org
-
-Copyright (C) 2003-2015 Open Geospatial Consortium, Inc.
-All Rights Reserved. http://www.opengeospatial.org/ogc/legal
-
-This OGC work (including software, documents, or other related items) is being
-provided by the copyright holders under the following license. By obtaining,
-using and/or copying this work, you (the licensee) agree that you have read,
-understood, and will comply with the following terms and conditions:
-
-Permission to use, copy, and modify this software and its documentation, with
-or without modification, for any purpose and without fee or royalty is hereby
-granted, provided that you include the following on ALL copies of the software
-and documentation or portions thereof, including modifications, that you make:
-
-   1. The full text of this NOTICE in a location viewable to users of the
-      redistributed or derivative work.
-   2. Notice of any changes or modifications to the OGC files, including the
-      date changes were made. (We recommend you provide URIs to the location
-      from which the code is derived.)
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
-NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
-THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
-PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
-
-The name and trademarks of copyright holders may NOT be used in advertising or
-publicity pertaining to the software without specific, written prior permission.
-Title to copyright in this software and any associated documentation will at all
-times remain with copyright holders.
-
-==========================================================================
-The ManifoldCF UI uses components distributed by the "bootstrap" project.
-The following license applies to bootstrap (http://getbootstrap.com/):
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2011-2016 Twitter, Inc.
-
-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, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-==========================================================================
-The ManifoldCF UI uses components distributed by the "bootstrap-select" project.
-The following license applies to bootstrap-select (http://silviomoreto.github.io/bootstrap-select/):
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2013-2015 bootstrap-select
-
-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, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-==========================================================================
-The ManifoldCF UI uses components distributed by the "jQuery" project.
-The following license applies to jQuery (https://github.com/jquery/jquery/blob/1.12.4/LICENSE.txt):
---------------------------------------------------------------------------
-
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
-
-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, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
-
-==========================================================================
-The ManifoldCF UI uses components distributed by the "jQuery-slimScroll" project.
-A dual license (MIT and GPL) applies to jQuery-slimScroll (https://github.com/rochal/jQuery-slimScroll);
-we distribute under the terms of the MIT license:
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2011 Piotr Rochala (http://rocha.la)
-
-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, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-==========================================================================
-The ManifoldCF UI uses font binaries distributed by the "Font Awesome" project.
-The following license applies Font Awesome font binaries (https://fontawesome.io/license/):
---------------------------------------------------------------------------
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded, 
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
-
-==========================================================================
-The ManifoldCF UI uses CSS files distributed by the "Font Awesome" project.
-The following license applies Font Awesome CSS files (https://fontawesome.io/license/):
---------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-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, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/dist-license/NOTICE.txt b/dist-license/NOTICE.txt
deleted file mode 100644
index f3540ff..0000000
--- a/dist-license/NOTICE.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Apache ManifoldCF
-Copyright 2010-2017 The Apache Software Foundation
-
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
-
-This product includes software developed by
-Software Freedom Conservancy
-Selenium committers
diff --git a/dist-license/README.txt b/dist-license/README.txt
deleted file mode 100644
index 770f488..0000000
--- a/dist-license/README.txt
+++ /dev/null
@@ -1,221 +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.
-
-Welcome to the Apache ManifoldCF project!
------------------------------------------
-
-Apache ManifoldCF is a multi-repository crawler framework, with multiple connectors.
-
-For a complete description of the ManifoldCF project, team composition, source
-code repositories, and other details, please see the ManifoldCF web site at
-http://manifoldcf.apache.org
-
-
-Getting Started
----------------
-
-Since you downloaded the binary version of the package, you can just run it.
-
-1. Download and install the Java SE 7 JDK (Java Development Kit), or greater,
-   from http://java.sun.com.  You will need the JDK installed, and the
-   %JAVA_HOME%/bin directory included on your command path.  To test this,
-   issue a "java -version" command from your shell and verify that the Java
-   version is 1.7 or greater.
-   
-2. In your shell, change to the single-process example directory, "example".
-
-3. In your shell, type "java -jar start.jar" to start ManifoldCF.
-
-
-Using Proprietary or GPL-Licensed Connectors in the Binary Distribution
--------------------------------------------------------------------
-
-
-If you downloaded a binary distribution and want to use a connector which requires
-any jars that cannot be redistributed by Apache, you will need to supply the missing
-jars and enable your connector before starting ManifoldCF.  Connectors are
-described in the file "connectors.xml", and required jars should be
-placed in "connector-lib", EXCEPT in the case of jars required by the FileNet and
-Documentum connectors.  See the documentation at
-"doc/en_US/how-to-build-and-deploy.html" for more details.
-
-
-Some Files Included In Apache ManifoldCF Binary Distributions
------------------------------------------------------------
-
-doc/index.html
-  The Apache ManifoldCF documentation root, which includes the Javadoc.
-
-doc/en_US/how-to-build-and-deploy.html
-  The English Apache ManifoldCF documentation page describing building and deployment.
-
-example
-  A single-process example.
-
-multiprocess-example
-  A multi-process example.
-
-
-Licensing
----------
-
-ManifoldCF is licensed under the
-Apache License 2.0. See the files called LICENSE.txt and NOTICE.txt
-for more information.
-
-Cryptographic Software Notice
------------------------------
-
-This distribution may include software that has been designed for use
-with cryptographic software. The country in which you currently reside
-may have restrictions on the import, possession, use, and/or re-export
-to another country, of encryption software. BEFORE using any encryption
-software, please check your country's laws, regulations and policies
-concerning the import, possession, or use, and re-export of encryption
-software, to see if this is permitted. See <http://www.wassenaar.org/>
-for more information.
-
-The U.S. Government Department of Commerce, Bureau of Industry and
-Security (BIS), has classified this software as Export Commodity
-Control Number (ECCN) 5D002.C.1, which includes information security
-software using or performing cryptographic functions with asymmetric
-algorithms. The form and manner of this Apache Software Foundation
-distribution makes it eligible for export under the License Exception
-ENC Technology Software Unrestricted (TSU) exception (see the BIS
-Export Administration Regulations, Section 740.13) for both object
-code and source code.
-
-The following provides more details on the included software that
-may be subject to export controls on cryptographic software:
-
-  ManifoldCF interfaces with the
-  Java Secure Socket Extension (JSSE) API to provide
-
-    - HTTPS support
-
-  ManifoldCF interfaces with the
-  Java Cryptography Extension (JCE) API to provide
-
-    - NTLM authentication
-
-  ManifoldCF does not include any
-  implementation of JSSE or JCE.
-
-Contact
--------
-
-  o For general information visit the main project site at
-    http://manifoldcf.apache.org
-
-
-=========================================================================
-==     Jetty Notice                                                    ==
-=========================================================================
-==============================================================
- Jetty Web Container 
- Copyright 1995-2006 Mort Bay Consulting Pty Ltd
-==============================================================
-
-This product includes some software developed at The Apache Software 
-Foundation (http://www.apache.org/).
-
-The javax.servlet package used by Jetty is copyright 
-Sun Microsystems, Inc and Apache Software Foundation. It is 
-distributed under the Common Development and Distribution License.
-You can obtain a copy of the license at 
-https://glassfish.dev.java.net/public/CDDLv1.0.html.
-
-The UnixCrypt.java code ~Implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-
-The default JSP implementation is provided by the Glassfish JSP engine
-from project Glassfish http://glassfish.dev.java.net.  Copyright 2005
-Sun Microsystems, Inc. and portions Copyright Apache Software Foundation.
-
-Some portions of the code are Copyright:
-  2006 Tim Vernum 
-  1999 Jason Gilbert.
-
-The jboss integration module contains some LGPL code.
-
-=========================================================================
-==     HSQLDB Notice                                                   ==
-=========================================================================
-
-For content, code, and products originally developed by Thomas Mueller and the Hypersonic SQL Group:
-
-Copyright (c) 1995-2000 by the Hypersonic SQL Group.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the Hypersonic SQL Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-This software consists of voluntary contributions made by many individuals on behalf of the
-Hypersonic SQL Group.
-
-For work added by the HSQL Development Group (a.k.a. hsqldb_lic.txt):
-
-Copyright (c) 2001-2005, The HSQL Development Group
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the HSQL Development Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/doap_ManifoldCF.rdf b/doap_ManifoldCF.rdf
new file mode 100644
index 0000000..ad121fe
--- /dev/null
+++ b/doap_ManifoldCF.rdf
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl"?>
+<rdf:RDF xml:lang="en"
+         xmlns="http://usefulinc.com/ns/doap#" 
+         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
+         xmlns:asfext="http://projects.apache.org/ns/asfext#"
+         xmlns:foaf="http://xmlns.com/foaf/0.1/">
+<!--
+    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.
+-->
+  <Project rdf:about="http://manifoldcf.apache.org">
+    <created>2012-05-17</created>
+    <license rdf:resource="http://usefulinc.com/doap/licenses/asl20" />
+    <name>Apache ManifoldCF</name>
+    <homepage rdf:resource="http://manifoldcf.apache.org" />
+    <asfext:pmc rdf:resource="http://manifoldcf.apache.org" />
+    <shortdesc>Open-source software for transferring content between repositories or search indexes</shortdesc>
+    <description>ManifoldCF is an effort to provide an open source framework for connecting source content repositories like Microsoft Sharepoint and EMC Documentum, to target repositories or indexes, such as Apache Solr , OpenSearchServer or ElasticSearch. ManifoldCF also defines a security model for target repositories that permits them to enforce source-repository security policies.</description>
+    <bug-database rdf:resource="https://issues.apache.org/jira/browse/CONNECTORS" />
+    <mailing-list rdf:resource="http://manifoldcf.apache.org/en_US/mail.html" />
+    <download-page rdf:resource="http://manifoldcf.apache.org/en_US/download.html" />
+    <programming-language>Java</programming-language>
+    <category rdf:resource="http://projects.apache.org/category/content" />
+    <release>
+      <Version>
+        <name>apache-manifoldcf</name>
+        <created>2012-05-21</created>
+        <revision>0.5.1</revision>
+      </Version>
+    </release>
+    <repository>
+      <SVNRepository>
+        <location rdf:resource="https://svn.apache.org/repos/asf/manifoldcf"/>
+        <browse rdf:resource="http://svn.apache.org/repos/asf/manifoldcf"/>
+      </SVNRepository>
+    </repository>
+    <maintainer>
+      <foaf:Person>
+        <foaf:name>Karl Wright</foaf:name>
+          <foaf:mbox rdf:resource="mailto:kwright@apache.org"/>
+      </foaf:Person>
+    </maintainer>
+  </Project>
+</rdf:RDF>
diff --git a/site/forrest.properties b/forrest.properties
similarity index 100%
rename from site/forrest.properties
rename to forrest.properties
diff --git a/forrest.properties.xml b/forrest.properties.xml
new file mode 100644
index 0000000..66f6365
--- /dev/null
+++ b/forrest.properties.xml
@@ -0,0 +1,40 @@
+<?xml version='1.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.
+-->
+
+<properties>
+  <property name="projectInfo.project.fullname" value="Apache ManifoldCF"/>
+  <property name="projectInfo.project.url" value="http://manifoldcf.apache.org/"/>
+
+  <!-- Default values -->
+  <property name="output.pdf.fontFamily.serif" value="DejaVuSerif"/>
+  <property name="output.pdf.fontFamily.sansSerif" value="DejaVuSans"/>
+  <property name="output.pdf.fontFamily.monospace" value="DejaVuSansMono"/>
+  <!-- Overrides for ja_JP -->
+  <property name="output.pdf.fontFamily.serif.ja_JP" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.sansSerif.ja_JP" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.monospace.ja_JP" value="IPAPGothic"/>
+
+  <!-- property name="output.pdf.fontFamily.arial" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.TimesNewRoman" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.Courier" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.arialMT" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.arial-BoldMT" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.arial-ItalicMT" value="IPAPGothic"/>
+  <property name="output.pdf.fontFamily.TimesNewRomanPSMT" value="IPAPGothic"/ -->
+</properties>
\ No newline at end of file
diff --git a/framework/.gitignore b/framework/.gitignore
deleted file mode 100644
index 4b91129..0000000
--- a/framework/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-/.settings/
-/.project
-/dist/
-/build/
-/target/
-*/target/
diff --git a/framework/agents/.gitignore b/framework/agents/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/agents/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/agents/pom.xml b/framework/agents/pom.xml
deleted file mode 100644
index 4315365..0000000
--- a/framework/agents/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-    <relativePath>../pom.xml</relativePath>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-agents</artifactId>
-  <name>ManifoldCF - Framework - Agents</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*HSQLDBext*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/AgentRun.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/AgentRun.java
deleted file mode 100644
index 4c22945..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/AgentRun.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id: AgentRun.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Main agents process class
- */
-public class AgentRun extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: AgentRun.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public static final String agentServiceType = "AGENT";
-  
-  public AgentRun()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    // Note well:
-    // As part of CONNECTORS-781, multiple agents processes are now permitted, provided
-    // that a truly global lock manager implementation is used.  This implementation thus does the
-    // following:
-    // (1) Register the agent, and begin its execution
-    // (2) Periodically check for any new registered IAgent implementations
-    // (3) Await a shutdown signal
-    // (4) If exit signal seen, exit active block
-    // (5) Trap JVM exit to be sure we exit active block no matter what
-    //   (This latter option requires the ability to exit active blocks from different ILockManager instances)
-    //
-    // Note well that the agents shutdown signal is NEVER modified by this code; it will be set/cleared by
-    // AgentStop only, and AgentStop will wait until all services become inactive before exiting.
-    String processID = ManifoldCF.getProcessID();
-    ILockManager lockManager = LockManagerFactory.make(tc);
-    lockManager.registerServiceBeginServiceActivity(agentServiceType, processID, null);
-    try
-    {
-      // Register a shutdown hook to make sure we signal that the main agents process is going inactive.
-      ManifoldCF.addShutdownHook(new AgentRunShutdownRunner(processID));
-      
-      Logging.root.info("Running...");
-      // Register hook first so stopAgents() not required
-      AgentsDaemon ad = new AgentsDaemon(processID);
-      ad.registerAgentsShutdownHook(tc);
-      ad.runAgents(tc);
-      Logging.root.info("Shutting down...");
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.root.error("Exception: "+e.getMessage(),e);
-      e.printStackTrace(System.err);
-    }
-    finally
-    {
-      // Exit service
-      // This is a courtesy; some lock managers (i.e. ZooKeeper) manage to do this anyway
-      lockManager.endServiceActivity(agentServiceType, processID);
-    }
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: AgentRun");
-      System.exit(1);
-    }
-
-    try
-    {
-      System.err.println("Running...");
-      AgentRun agentRun = new AgentRun();
-      agentRun.execute();
-      System.err.println("Shutting down...");
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.root.error("Exception: "+e.getMessage(),e);
-      e.printStackTrace(System.err);
-      System.exit(1);
-    }
-  }
-  
-  protected static class AgentRunShutdownRunner implements IShutdownHook
-  {
-    protected final String processID;
-    
-    public AgentRunShutdownRunner(String processID)
-    {
-      this.processID = processID;
-    }
-    
-    @Override
-    public void doCleanup(IThreadContext tc)
-      throws ManifoldCFException
-    {
-      ILockManager lockManager = LockManagerFactory.make(tc);
-      // We can blast the active flag off here; we may have already exited though and an exception will
-      // therefore be thrown.
-      if (lockManager.checkServiceActive(agentServiceType, processID))
-      {
-        lockManager.endServiceActivity(agentServiceType, processID);
-      }
-    }
-    
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/AgentStop.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/AgentStop.java
deleted file mode 100644
index f2e4b88..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/AgentStop.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id: AgentStop.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Stops the running agents process
- */
-public class AgentStop extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: AgentStop.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public AgentStop()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    // As part of the work for CONNECTORS-781, this method is now synchronous.
-    // We assert the shutdown signal, and then wait until all active services have shut down.
-    ILockManager lockManager = LockManagerFactory.make(tc);
-    AgentsDaemon.assertAgentsShutdownSignal(tc);
-    try
-    {
-      Logging.root.info("Shutdown signal sent");
-      while (true)
-      {
-        // Check to see if services are down yet
-        int count = lockManager.countActiveServices(AgentRun.agentServiceType);
-        if (count == 0)
-          break;
-        try
-        {
-          ManifoldCF.sleep(1000L);
-        }
-        catch (InterruptedException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-      }
-      Logging.root.info("All agents shut down");
-    }
-    finally
-    {
-      // Clear shutdown signal
-      AgentsDaemon.clearAgentsShutdownSignal(tc);
-    }
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: AgentStop");
-      System.exit(1);
-    }
-
-    try
-    {
-      AgentStop agentStop = new AgentStop();
-      agentStop.execute();
-      System.err.println("Shutdown signal sent");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/BaseAgentsInitializationCommand.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/BaseAgentsInitializationCommand.java
deleted file mode 100644
index 3d91956..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/BaseAgentsInitializationCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-
-/**
- * Parent class for most Initialization commands that are related to Agents
- */
-public abstract class BaseAgentsInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    doExecute(tc);
-  }
-
-  protected abstract void doExecute(IThreadContext tc) throws ManifoldCFException;
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DefineOutputConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/DefineOutputConnection.java
deleted file mode 100644
index d68c484..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DefineOutputConnection.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id: DefineOutputConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import java.util.*;
-
-/** This class is used to define an output connection.
-*/
-public class DefineOutputConnection
-{
-        public static final String _rcsid = "@(#)$Id: DefineOutputConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-        private DefineOutputConnection()
-        {
-        }
-
-
-        public static void main(String[] args)
-        {
-                if (args.length < 4)
-                {
-                        System.err.println("Usage: DefineOutputConnection <connection_name> <description> <connector_class> <pool_max> <param1>=<value1> ...");
-                        System.exit(1);
-                }
-
-                String connectionName = args[0];
-                String description = args[1];
-                String connectorClass = args[2];
-                String poolMax = args[3];
-
-
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        IOutputConnectionManager mgr = OutputConnectionManagerFactory.make(tc);
-                        IOutputConnection conn = mgr.create();
-                        conn.setName(connectionName);
-                        conn.setDescription(description);
-                        conn.setClassName(connectorClass);
-                        conn.setMaxConnections(new Integer(poolMax).intValue());
-                        ConfigParams x = conn.getConfigParams();
-                        int i = 4;
-                        while (i < args.length)
-                        {
-                                String arg = args[i++];
-                                // Parse
-                                int pos = arg.indexOf("=");
-                                if (pos == -1)
-                                        throw new ManifoldCFException("Argument missing =");
-                                String name = arg.substring(0,pos);
-                                String value = arg.substring(pos+1);
-                                if (name.endsWith("assword"))
-                                        x.setObfuscatedParameter(name,value);
-                                else
-                                        x.setParameter(name,value);
-                        }
-
-                        // Now, save
-                        mgr.save(conn);
-
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-
-
-
-                
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DefineTransformationConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/DefineTransformationConnection.java
deleted file mode 100644
index 80e1e3e..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DefineTransformationConnection.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import java.util.*;
-
-/** This class is used to define a transformation connection.
-*/
-public class DefineTransformationConnection
-{
-        public static final String _rcsid = "@(#)$Id$";
-
-        private DefineTransformationConnection()
-        {
-        }
-
-
-        public static void main(String[] args)
-        {
-                if (args.length < 4)
-                {
-                        System.err.println("Usage: DefineTransformationConnection <connection_name> <description> <connector_class> <pool_max> <param1>=<value1> ...");
-                        System.exit(1);
-                }
-
-                String connectionName = args[0];
-                String description = args[1];
-                String connectorClass = args[2];
-                String poolMax = args[3];
-
-
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        ITransformationConnectionManager mgr = TransformationConnectionManagerFactory.make(tc);
-                        ITransformationConnection conn = mgr.create();
-                        conn.setName(connectionName);
-                        conn.setDescription(description);
-                        conn.setClassName(connectorClass);
-                        conn.setMaxConnections(new Integer(poolMax).intValue());
-                        ConfigParams x = conn.getConfigParams();
-                        int i = 4;
-                        while (i < args.length)
-                        {
-                                String arg = args[i++];
-                                // Parse
-                                int pos = arg.indexOf("=");
-                                if (pos == -1)
-                                        throw new ManifoldCFException("Argument missing =");
-                                String name = arg.substring(0,pos);
-                                String value = arg.substring(pos+1);
-                                if (name.endsWith("assword"))
-                                        x.setObfuscatedParameter(name,value);
-                                else
-                                        x.setParameter(name,value);
-                        }
-
-                        // Now, save
-                        mgr.save(conn);
-
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-
-
-
-                
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DeleteOutputConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/DeleteOutputConnection.java
deleted file mode 100644
index e70c6ff..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DeleteOutputConnection.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: DeleteOutputConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import java.util.*;
-
-/** This class is a command that is used to delete an output connection.
-*/
-public class DeleteOutputConnection
-{
-        public static final String _rcsid = "@(#)$Id: DeleteOutputConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-        private DeleteOutputConnection()
-        {
-        }
-
-
-        public static void main(String[] args)
-        {
-                if (args.length != 1)
-                {
-                        System.err.println("Usage: DeleteOutputConnection <connection_name>");
-                        System.exit(1);
-                }
-
-                String connectionName = args[0];
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        IOutputConnectionManager mgr = OutputConnectionManagerFactory.make(tc);
-                        mgr.delete(connectionName);
-
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-
-
-
-                
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DeleteTransformationConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/DeleteTransformationConnection.java
deleted file mode 100644
index 4ff0efd..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/DeleteTransformationConnection.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import java.util.*;
-
-/** This class is a command that is used to delete a transformation connection.
-*/
-public class DeleteTransformationConnection
-{
-        public static final String _rcsid = "@(#)$Id$";
-
-        private DeleteTransformationConnection()
-        {
-        }
-
-
-        public static void main(String[] args)
-        {
-                if (args.length != 1)
-                {
-                        System.err.println("Usage: DeleteTransformationConnection <connection_name>");
-                        System.exit(1);
-                }
-
-                String connectionName = args[0];
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        ITransformationConnectionManager mgr = TransformationConnectionManagerFactory.make(tc);
-                        mgr.delete(connectionName);
-
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-
-
-
-                
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/Install.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/Install.java
deleted file mode 100644
index 980f0fb..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/Install.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id: Install.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-public class Install extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: Install.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private Install()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ManifoldCF.installTables(tc);
-    Logging.root.info("Agent tables installed");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: Install");
-      System.exit(1);
-    }
-
-    try
-    {
-      Install install = new Install();
-      install.execute();
-      System.err.println("Agent tables installed");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/Register.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/Register.java
deleted file mode 100644
index 0a4a01d..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/Register.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: Register.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Use to register an agent by providing its class
- */
-public class Register extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: Register.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-
-  public Register(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    mgr.registerAgent(className);
-    Logging.root.info("Successfully registered agent '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: Register <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    try
-    {
-      Register register = new Register(className);
-      register.execute();
-      System.err.println("Successfully registered agent '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/RegisterOutput.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/RegisterOutput.java
deleted file mode 100644
index 28c60e3..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/RegisterOutput.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id: RegisterOutput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Register an output connector class
- */
-public class RegisterOutput extends TransactionalAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: RegisterOutput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-  private final String description;
-
-  public RegisterOutput(String className, String description)
-  {
-
-    this.className = className;
-    this.description = description;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-    // First, register connector
-    mgr.registerConnector(description,className);
-    // Then, signal to all jobs that might depend on this connector that they can switch state
-    // Find the connection names that come with this class
-    String[] connectionNames = connManager.findConnectionsForConnector(className);
-    // For all connection names, notify all agents of the registration
-    AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
-    Logging.root.info("Successfully registered output connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: RegisterOutput <classname> <description>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    String description = args[1];
-
-    try
-    {
-      RegisterOutput registerOutput = new RegisterOutput(className, description);
-      registerOutput.execute();
-      System.err.println("Successfully registered output connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/RegisterTransformation.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/RegisterTransformation.java
deleted file mode 100644
index 5b058cd..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/RegisterTransformation.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Register a transformation connector class
- */
-public class RegisterTransformation extends TransactionalAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final String className;
-  private final String description;
-
-  public RegisterTransformation(String className, String description)
-  {
-
-    this.className = className;
-    this.description = description;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ITransformationConnectorManager mgr = TransformationConnectorManagerFactory.make(tc);
-    ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-    // First, register connector
-    mgr.registerConnector(description,className);
-    // Then, signal to all jobs that might depend on this connector that they can switch state
-    // Find the connection names that come with this class
-    String[] connectionNames = connManager.findConnectionsForConnector(className);
-    // For all connection names, notify all agents of the registration
-    AgentManagerFactory.noteTransformationConnectorRegistration(tc,connectionNames);
-    Logging.root.info("Successfully registered transformation connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: RegisterTransformation <classname> <description>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    String description = args[1];
-
-    try
-    {
-      RegisterTransformation registerTransformation = new RegisterTransformation(className, description);
-      registerTransformation.execute();
-      System.err.println("Successfully registered transformation connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeAll.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeAll.java
deleted file mode 100644
index 8264e3a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeAll.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/* $Id: SynchronizeAll.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register all registered agent classes that can't be found
- */
-public class SynchronizeAll extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: SynchronizeAll.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public SynchronizeAll()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    String[] classnames = mgr.getAllAgents();
-    int i = 0;
-    while (i < classnames.length)
-    {
-      String classname = classnames[i++];
-      try
-      {
-        AgentFactory.make(classname);
-      }
-      catch (ManifoldCFException e)
-      {
-        // Couldn't instantiate the agent: Remove from database table
-        mgr.removeAgent(classname);
-      }
-    }
-    Logging.root.info("Successfully synchronized all agents");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: SynchronizeAll");
-      System.exit(1);
-    }
-
-    try
-    {
-      SynchronizeAll synchronizeAll = new SynchronizeAll();
-      synchronizeAll.execute();
-      System.err.println("Successfully synchronized all agents");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeOutputs.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeOutputs.java
deleted file mode 100644
index c313e68..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeOutputs.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/* $Id: SynchronizeOutputs.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register all registered output connector classes that can't be found
- */
-public class SynchronizeOutputs extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: SynchronizeOutputs.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public SynchronizeOutputs()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String className = (String)row.getValue("classname");
-      try
-      {
-        OutputConnectorFactory.getConnectorNoCheck(className);
-      }
-      catch (ManifoldCFException e)
-      {
-        // Deregistration should be done in a transaction
-        database.beginTransaction();
-        try
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(className);
-          // For all connection names, notify all agents of the deregistration
-          AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.removeConnector(className);
-        }
-        catch (ManifoldCFException e2)
-        {
-          database.signalRollback();
-          throw e2;
-        }
-        catch (Error e2)
-        {
-          database.signalRollback();
-          throw e2;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-    }
-    Logging.root.info("Successfully synchronized all outputs");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: SynchronizeOutputs");
-      System.exit(1);
-    }
-
-    try
-    {
-      SynchronizeOutputs synchronizeOutputs = new SynchronizeOutputs();
-      synchronizeOutputs.execute();
-      System.err.println("Successfully synchronized all outputs");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeTransformations.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeTransformations.java
deleted file mode 100644
index 6a08340..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/SynchronizeTransformations.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register all registered transformation connector classes that can't be found
- */
-public class SynchronizeTransformations extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  public SynchronizeTransformations()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    ITransformationConnectorManager mgr = TransformationConnectorManagerFactory.make(tc);
-    ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String className = (String)row.getValue("classname");
-      try
-      {
-        TransformationConnectorFactory.getConnectorNoCheck(className);
-      }
-      catch (ManifoldCFException e)
-      {
-        // Deregistration should be done in a transaction
-        database.beginTransaction();
-        try
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(className);
-          // For all connection names, notify all agents of the deregistration
-          AgentManagerFactory.noteTransformationConnectorDeregistration(tc,connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.removeConnector(className);
-        }
-        catch (ManifoldCFException e2)
-        {
-          database.signalRollback();
-          throw e2;
-        }
-        catch (Error e2)
-        {
-          database.signalRollback();
-          throw e2;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-    }
-    Logging.root.info("Successfully synchronized all transformations");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: SynchronizeTransformations");
-      System.exit(1);
-    }
-
-    try
-    {
-      SynchronizeTransformations synchronizeTransformations = new SynchronizeTransformations();
-      synchronizeTransformations.execute();
-      System.err.println("Successfully synchronized all transformations");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/TransactionalAgentsInitializationCommand.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/TransactionalAgentsInitializationCommand.java
deleted file mode 100644
index b09c541..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/TransactionalAgentsInitializationCommand.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.*;
-
-/**
- * @author Jettro Coenradie
- */
-public abstract class TransactionalAgentsInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      org.apache.manifoldcf.agents.system.ManifoldCF.getMasterDatabaseName(),
-      org.apache.manifoldcf.agents.system.ManifoldCF.getMasterDatabaseUsername(),
-      org.apache.manifoldcf.agents.system.ManifoldCF.getMasterDatabasePassword());
-
-    try
-    {
-      database.beginTransaction();
-      doExecute(tc);
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-
-  }
-
-  protected abstract void doExecute(IThreadContext tc) throws ManifoldCFException;
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegister.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegister.java
deleted file mode 100644
index d084dcf..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegister.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id: UnRegister.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Use to unregister an agent by providing its class
- */
-public class UnRegister extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegister.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-
-  public UnRegister(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    mgr.unregisterAgent(className);
-    Logging.root.info("Successfully unregistered agent '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegister <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-
-    try
-    {
-      UnRegister unRegister = new UnRegister(className);
-      unRegister.execute();
-      System.err.println("Successfully unregistered agent '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAll.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAll.java
deleted file mode 100644
index e130306..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAll.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id: UnRegisterAll.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register all current agent classes
- */
-public class UnRegisterAll extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegisterAll.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public UnRegisterAll()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    String[] classnames = mgr.getAllAgents();
-    int i = 0;
-    while (i < classnames.length)
-    {
-      mgr.unregisterAgent(classnames[i++]);
-    }
-    Logging.root.info("Successfully unregistered all agents");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: UnRegisterAll");
-      System.exit(1);
-    }
-
-    try
-    {
-      UnRegisterAll unRegisterAll = new UnRegisterAll();
-      unRegisterAll.execute();
-      System.err.println("Successfully unregistered all agents");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAllOutputs.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAllOutputs.java
deleted file mode 100644
index 8db0437..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAllOutputs.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id: UnRegisterAllOutputs.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register all current output connector classes
- */
-public class UnRegisterAllOutputs extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegisterAllOutputs.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public UnRegisterAllOutputs()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String className = (String)row.getValue("classname");
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(className);
-        // For all connection names, notify all agents of the deregistration
-        AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-        // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-        mgr.unregisterConnector(className);
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    Logging.root.info("Successfully unregistered all output connectors");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: UnRegisterAllOutputs");
-      System.exit(1);
-    }
-
-    try
-    {
-      UnRegisterAllOutputs unRegisterAllOutputs = new UnRegisterAllOutputs();
-      unRegisterAllOutputs.execute();
-      System.err.println("Successfully unregistered all output connectors");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAllTransformations.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAllTransformations.java
deleted file mode 100644
index 464bf40..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterAllTransformations.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register all current transformation connector classes
- */
-public class UnRegisterAllTransformations extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  public UnRegisterAllTransformations()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    ITransformationConnectorManager mgr = TransformationConnectorManagerFactory.make(tc);
-    ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String className = (String)row.getValue("classname");
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(className);
-        // For all connection names, notify all agents of the deregistration
-        AgentManagerFactory.noteTransformationConnectorDeregistration(tc,connectionNames);
-        // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-        mgr.unregisterConnector(className);
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    Logging.root.info("Successfully unregistered all transformation connectors");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: UnRegisterAllTransformations");
-      System.exit(1);
-    }
-
-    try
-    {
-      UnRegisterAllTransformations unRegisterAllTransformations = new UnRegisterAllTransformations();
-      unRegisterAllTransformations.execute();
-      System.err.println("Successfully unregistered all transformation connectors");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterOutput.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterOutput.java
deleted file mode 100644
index 373c576..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterOutput.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id: UnRegisterOutput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register an output connector class
- */
-public class UnRegisterOutput extends TransactionalAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegisterOutput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-
-  public UnRegisterOutput(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-    // Find the connection names that come with this class
-    String[] connectionNames = connManager.findConnectionsForConnector(className);
-    // For all connection names, notify all agents of the deregistration
-    AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-    // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-    mgr.unregisterConnector(className);
-    Logging.root.info("Successfully unregistered output connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegisterOutput <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-
-    try
-    {
-      UnRegisterOutput unRegisterOutput = new UnRegisterOutput(className);
-      unRegisterOutput.execute();
-      System.err.println("Successfully unregistered output connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterTransformation.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterTransformation.java
deleted file mode 100644
index 94ecbe5..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/UnRegisterTransformation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Un-register a transformation connector class
- */
-public class UnRegisterTransformation extends TransactionalAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final String className;
-
-  public UnRegisterTransformation(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ITransformationConnectorManager mgr = TransformationConnectorManagerFactory.make(tc);
-    ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-    // Find the connection names that come with this class
-    String[] connectionNames = connManager.findConnectionsForConnector(className);
-    // For all connection names, notify all agents of the deregistration
-    AgentManagerFactory.noteTransformationConnectorDeregistration(tc,connectionNames);
-    // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-    mgr.unregisterConnector(className);
-    Logging.root.info("Successfully unregistered transformation connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegisterTransformation <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-
-    try
-    {
-      UnRegisterTransformation unRegisterTransformation = new UnRegisterTransformation(className);
-      unRegisterTransformation.execute();
-      System.err.println("Successfully unregistered transformation connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/Uninstall.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/Uninstall.java
deleted file mode 100644
index 99fb68a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/Uninstall.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id: Uninstall.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/**
- * Use to uninstall the agent. Results in cleaning up the persistent storage.
- */
-public class Uninstall extends BaseAgentsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: Uninstall.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public Uninstall()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ManifoldCF.deinstallTables(tc);
-    Logging.root.info("Agent tables uninstalled");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: Uninstall");
-      System.exit(1);
-    }
-
-    try
-    {
-      Uninstall uninstall = new Uninstall();
-      uninstall.execute();
-      System.err.println("Agent tables uninstalled");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/agentmanager/AgentManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/agentmanager/AgentManager.java
deleted file mode 100644
index 8c97b78..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/agentmanager/AgentManager.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/* $Id: AgentManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.agentmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-/** This is the implementation of IAgentManager.
- * 
- * <br><br>
- * <b>agents</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class AgentManager extends org.apache.manifoldcf.core.database.BaseTable implements IAgentManager
-{
-  public static final String _rcsid = "@(#)$Id: AgentManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Fields
-  protected final static String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database instance.
-  */
-  public AgentManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"agents");
-    this.threadContext = threadContext;
-  }
-
-  /** Install or upgrade.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // We always use an outer loop, in case the upgrade will need it.
-    while (true)
-    {
-      // Check if table is already present
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Any required upgrade code goes here.
-      }
-
-      // Any index creation goes here.
-
-      break;
-    }
-  }
-
-  /** Uninstall.  Also uninstalls all remaining agents.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    // Since we are uninstalling agents, better do this inside a transaction
-    beginTransaction();
-    try
-    {
-      // Uninstall everything remaining
-      IResultSet set = performQuery("SELECT * FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        IAgent agent = AgentFactory.make(className);
-        agent.deinstall(threadContext);
-      }
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-  }
-
-  /** Register an agent.
-  *@param className is the class.
-  */
-  public void registerAgent(String className)
-    throws ManifoldCFException
-  {
-    // Do in a transaction, so the installation is atomic
-    beginTransaction();
-    try
-    {
-      // See if already registered, if so just upgrade
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=?",params,null,null);
-      if (set.getRowCount() == 0)
-      {
-        // Try to add to the table first
-        HashMap map = new HashMap();
-        map.put(classNameField,className);
-        performInsert(map,null);
-      }
-      // In any case, call the install/upgrade method
-      IAgent agent = AgentFactory.make(className);
-      agent.install(threadContext);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-
-  /** Unregister an agent.
-  *@param className is the class to unregister.
-  */
-  public void unregisterAgent(String className)
-    throws ManifoldCFException
-  {
-    // Do in a transaction, so the installation is atomic
-    beginTransaction();
-    try
-    {
-      // First, deregister agent
-      IAgent agent = AgentFactory.make(className);
-      agent.deinstall(threadContext);
-
-      // Remove from table
-      removeAgent(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove an agent.
-  * Use this when the agent cannot be invoked.  The agent becomes unavailable,
-  * but its schema is not cleaned up.
-  *@param className is the class to remove.
-  */
-  public void removeAgent(String className)
-    throws ManifoldCFException
-  {
-    // Remove from table
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,null);
-  }
-
-  /** Get a list of all registered agent class names.
-  *@return the classnames in an array.
-  */
-  public String[] getAllAgents()
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SELECT * FROM "+getTableName(),null,null,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = row.getValue(classNameField).toString();
-      i++;
-    }
-    return rval;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLContext.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLContext.java
deleted file mode 100644
index d91c4ef..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLContext.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/* $Id: XMLContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.common;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.SAXException;
-
-import java.io.InputStream;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** An instance of this class represents a parsing context within a node.  Parsing functionality is implemented
-* by extending this class to do the right thing for the context in which it is deployed.  The base functionality
-* "does nothing"; extended functionality is needed to interpret nodes and act upon them.
-*/
-public class XMLContext
-{
-  /** The stream we belong to */
-  protected XMLStream theStream;
-  /** The previous context */
-  protected XMLContext previousContext;
-  /** The attributes belonging to the node associated with this context */
-  protected Attributes theseAttributes = null;
-  /** The namespace URI associated with the context */
-  protected String namespaceURI = null;
-  /** The localname associated with the context */
-  protected String localname = null;
-  /** The qname associated with the context */
-  protected String qname = null;
-
-  /** Root constructor.  Used for outer document level. */
-  public XMLContext(XMLStream theStream)
-  {
-    this(theStream,null,null,null,null);
-  }
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLContext(XMLStream theStream, String namespaceURI, String localname, String qname, Attributes theseAttributes)
-  {
-    this.theStream = theStream;
-    this.previousContext = theStream.getContext();
-    this.namespaceURI = namespaceURI;
-    this.localname = localname;
-    this.qname = qname;
-    this.theseAttributes = theseAttributes;
-  }
-
-  /** Get an attribute's value, if any */
-  public String getAttribute(String attributeName)
-  {
-    if (theseAttributes != null)
-      return theseAttributes.getValue(attributeName);
-    else
-      return null;
-  }
-
-  /** Get the namespace URI of this node */
-  public String getNamespaceURI()
-  {
-    return namespaceURI;
-  }
-
-  /** Get the localname of this node */
-  public String getLocalname()
-  {
-    return localname;
-  }
-
-  /** Get the qname of this node */
-  public String getQname()
-  {
-    return qname;
-  }
-
-  /** Handle the start of the document */
-  public final void startDocument()
-    throws SAXException
-  {
-  }
-
-  /** Handle the end of the document */
-  public final void endDocument()
-    throws SAXException
-  {
-  }
-
-  /** Handle the start of a tag */
-  public final void startElement(String namespaceURI, String localName, String qName, Attributes atts)
-    throws SAXException
-  {
-    // For every child tag, we must create a new context.  We call a stub method to do that here; the stub method is meant
-    // to be overridden to provide the proper non-default context, where desired.
-    try
-    {
-      XMLContext newContext = beginTag(namespaceURI, localName, qName, atts);
-      if (newContext == null)
-        newContext = new XMLContext(theStream,namespaceURI,localName,qName,atts);
-      // We need to establish the new context in the stack of the owning XMLStream object
-      theStream.setContext(newContext);
-    }
-    catch (ServiceInterruption e)
-    {
-      throw new SAXException(e);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new SAXException(e);
-    }
-  }
-
-  /** Handle the end of a tag */
-  public final void endElement(String namespaceURI, String localName, String qName)
-    throws SAXException
-  {
-    // When a child tag ends, pop back to the previous context.  That will allow the current one to go away.  But first, call
-    // a stub method that can be overridden to perform activities.
-    try
-    {
-      // Signal the end of the tag.  This goes last, because we have to do things in the reverse order from the
-      // way the context got pushed to make sense.
-      if (previousContext != null)
-        previousContext.endTag();
-      // Before we leave the child context, clean up the child tag itself, but not the whole chain
-      theStream.getContext().tagCleanup();
-      // Go back to the parent context
-      theStream.setContext(previousContext);
-    }
-    catch (ServiceInterruption e)
-    {
-      throw new SAXException(e);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new SAXException(e);
-    }
-  }
-
-  /** Handle content of a tag */
-  public final void characters(char[] ch, int start, int length)
-    throws SAXException
-  {
-    try
-    {
-      // Call the overridden method with the right context object
-      tagContents(ch,start,length);
-    }
-    catch (ServiceInterruption e)
-    {
-      throw new SAXException(e);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new SAXException(e);
-    }
-  }
-
-  /** Cleanup this context object, and then recurse up the chain.
-  * This method is called without fail at the end of any parse, whether it errored out or not, so that proper cleanup always happens for any tags left on the stack.
-  */
-  public final void cleanup()
-    throws ManifoldCFException
-  {
-    tagCleanup();
-    theStream.setContext(previousContext);
-  }
-
-  /** This method is meant to be extended by classes that extend this class.  The form of this method is meant to enable creation of a
-  * context object derived from XMLContext that understands how to actually handle tags and content within the current context. */
-  protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // The default action is to establish a new default context.
-    return null;
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  protected void endTag()
-    throws ManifoldCFException, ServiceInterruption
-  {
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  protected void tagContents(char[] ch, int start, int length)
-    throws ManifoldCFException, ServiceInterruption
-  {
-  }
-
-  /** Override this method to be called during cleanup */
-  protected void tagCleanup()
-    throws ManifoldCFException
-  {
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLFileContext.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLFileContext.java
deleted file mode 100644
index e5ff560..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLFileContext.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id: XMLFileContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.common;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.SAXException;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** An instance of this class represents a parsing context within a node.  Data is written to the supplied file in utf-8 format.
-*/
-public class XMLFileContext extends XMLOutputStreamContext
-{
-  /** The output file */
-  protected File outputFile;
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLFileContext(XMLStream theStream, String namespaceURI, String localname, String qname, Attributes theseAttributes, File f)
-    throws FileNotFoundException
-  {
-    // Construct an appropriate writer
-    super(theStream,namespaceURI,localname,qname,theseAttributes,new FileOutputStream(f));
-    // Save the file
-    outputFile = f;
-  }
-
-  /** Get file object, flushing it, closing it, and clearing it.  (This prevents the file from being deleted during cleanup of this context.) */
-  public File getCompletedFile()
-    throws ManifoldCFException
-  {
-    flush();
-    close();
-    File rval = outputFile;
-    outputFile = null;
-    return rval;
-  }
-
-  /** Cleanup whatever is left over */
-  public void tagCleanup()
-    throws ManifoldCFException
-  {
-    if (outputFile != null)
-    {
-      close();
-      outputFile.delete();
-      outputFile = null;
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLOutputStreamContext.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLOutputStreamContext.java
deleted file mode 100644
index 5cf573c..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLOutputStreamContext.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/* $Id: XMLOutputStreamContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.common;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.SAXException;
-
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** An instance of this class represents a parsing context within a node.  Data is written to the supplied output stream in utf-8 format.
-*/
-public class XMLOutputStreamContext extends XMLWriterContext
-{
-  /** The writer */
-  protected OutputStream outputStream;
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLOutputStreamContext(XMLStream theStream, String namespaceURI, String localname, String qname, Attributes theseAttributes, OutputStream os)
-  {
-    // Construct an appropriate writer
-    super(theStream,namespaceURI,localname,qname,theseAttributes,new OutputStreamWriter(os, StandardCharsets.UTF_8));
-    // Save the stream
-    outputStream = os;
-  }
-
-  /** Flush the data to the underlying output stream */
-  public void flush()
-    throws ManifoldCFException
-  {
-    try
-    {
-      if (outputStream != null)
-      {
-        // Do the base class first - this flushes the Writer
-        super.flush();
-        outputStream.flush();
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Close the underlying stream. */
-  public void close()
-    throws ManifoldCFException
-  {
-    // Now, close.
-    try
-    {
-      if (outputStream != null)
-      {
-        outputStream.close();
-        outputStream = null;
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLStream.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLStream.java
deleted file mode 100644
index 1000cf8..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLStream.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/* $Id: XMLStream.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.common;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.InputStream;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This object allows easier control of an XML parsing stream than does standard SAX.
-*/
-public class XMLStream
-{
-  /** The xml reader object */
-  protected XMLReader xr = null;
-  /** The current context */
-  protected XMLContext currentContext = null;
-  /** The parse exception we saw, if any */
-  protected SAXParseException parseException = null;
-
-  /** Constructor.  This does NOT actually execute the parse yet, because we need the object before that makes any sense.
-  */
-  public XMLStream(boolean laxChecking)
-    throws ManifoldCFException
-  {
-    try
-    {
-      xr = XMLReaderFactory.createXMLReader();
-      xr.setContentHandler(new MyContentHandler());
-      xr.setErrorHandler(new MyErrorHandler());
-      xr.setEntityResolver(new MyEntityResolver());
-      if (laxChecking)
-      {
-        // For many kinds of real-world parsing, we want to continue if at all possible.  Hopefully
-        // this will include unicode errors of various kinds, etc.
-
-        // This is xerces specific, so we'd better be invoking the xerces parser or we're screwed
-        xr.setFeature("http://apache.org/xml/features/continue-after-fatal-error",true);
-        xr.setFeature("http://apache.org/xml/features/ignore-badly-encoded-chars",true);
-      }
-    }
-    catch (SAXException e)
-    {
-      Exception e2 = e.getException();
-      if (e2 != null && e2 instanceof ManifoldCFException)
-        throw (ManifoldCFException)e2;
-      throw new ManifoldCFException("Error setting up parser: "+e.getMessage(),e);
-    }
-  }
-
-  /** Default constructor */
-  public XMLStream()
-    throws ManifoldCFException
-  {
-    this(true);
-  }
-
-  public void parse(InputStream xmlInputStream)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    try
-    {
-      InputSource is = new InputSource(xmlInputStream);
-      xr.parse(is);
-      if (parseException != null)
-        throw new ManifoldCFException("XML parse error: "+parseException.getMessage(),parseException);
-    }
-    catch (SAXException e)
-    {
-      Exception e2 = e.getException();
-      if (e2 != null && e2 instanceof ManifoldCFException)
-        throw (ManifoldCFException)e2;
-      if (e2 != null && e2 instanceof ServiceInterruption)
-        throw (ServiceInterruption)e2;
-      throw new ManifoldCFException("Error setting up parser: "+e.getMessage(),e);
-    }
-    catch (RuntimeException e)
-    {
-      // Xerces is unfortunately not constructed in such a way that it doesn't occasionally completely barf on a malformed file.
-      // So, we catch runtime exceptions and treat them as parse errors.
-      throw new ManifoldCFException("XML parse error: "+e.getMessage(),e);
-    }
-  }
-
-  /** Call this method to clean up completely after a parse attempt, whether successful or failure. */
-  public void cleanup()
-    throws ManifoldCFException
-  {
-    // This sets currentContext == null as a side effect, unless an error occurs during cleanup!!
-    currentContext.cleanup();
-  }
-
-  public void setContext(XMLContext context)
-  {
-    currentContext = context;
-  }
-
-  public XMLContext getContext()
-  {
-    return currentContext;
-  }
-
-  protected class MyContentHandler extends DefaultHandler
-  {
-    public void characters(char[] ch, int start, int length)
-      throws SAXException
-    {
-      super.characters(ch,start,length);
-      // Look up the current context, and invoke its methods
-      if (currentContext != null)
-        currentContext.characters(ch,start,length);
-    }
-
-    public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
-      throws SAXException
-    {
-      super.startElement(namespaceURI,localName,qName,atts);
-      if (currentContext != null)
-        currentContext.startElement(namespaceURI,localName,qName,atts);
-    }
-
-    public void endElement(String namespaceURI, String localName, String qName)
-      throws SAXException
-    {
-      super.endElement(namespaceURI,localName,qName);
-      if (currentContext != null)
-        currentContext.endElement(namespaceURI,localName,qName);
-    }
-
-    public void startDocument()
-      throws SAXException
-    {
-      super.startDocument();
-      if (currentContext != null)
-        currentContext.startDocument();
-    }
-
-    public void endDocument()
-      throws SAXException
-    {
-      super.endDocument();
-      if (currentContext != null)
-        currentContext.endDocument();
-    }
-
-
-  }
-
-  protected class MyErrorHandler extends DefaultHandler
-  {
-    public void fatalError(SAXParseException exception)
-    {
-      parseException = exception;
-    }
-  }
-
-  protected static class MyEntityResolver implements org.xml.sax.EntityResolver
-  {
-    public org.xml.sax.InputSource resolveEntity(java.lang.String publicId, java.lang.String systemId)
-      throws SAXException, java.io.IOException
-    {
-      // ALL references resolve to blank documents
-      return new org.xml.sax.InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes(StandardCharsets.UTF_8)));
-    }
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLStringContext.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLStringContext.java
deleted file mode 100644
index 28e8163..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLStringContext.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id: XMLStringContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.common;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.SAXException;
-
-import java.io.InputStream;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** An instance of this class represents a parsing context within a node, where the data value is to be recorded as an in-memory string.  The data string is
-* available as a local StringBuilder object, which will be accessible to any class that extends this one.
-*/
-public class XMLStringContext extends XMLContext
-{
-  /** The string buffer */
-  protected StringBuilder value = new StringBuilder();
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLStringContext(XMLStream theStream, String namespaceURI, String localname, String qname, Attributes theseAttributes)
-  {
-    super(theStream,namespaceURI,localname,qname,theseAttributes);
-  }
-
-  /** Get the string value */
-  public String getValue()
-  {
-    return value.toString();
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  protected void tagContents(char[] ch, int start, int length)
-    throws ManifoldCFException
-  {
-    // Append the characters to the buffer
-    value.append(ch,start,length);
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLWriterContext.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLWriterContext.java
deleted file mode 100644
index 706e15b..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/common/XMLWriterContext.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/* $Id: XMLWriterContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.common;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLReaderFactory;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.SAXException;
-
-import java.io.Writer;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** An instance of this class represents a parsing context within a node.  Data is written to the supplied writer.
-*/
-public class XMLWriterContext extends XMLContext
-{
-  /** The writer */
-  protected Writer theWriter;
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLWriterContext(XMLStream theStream, String namespaceURI, String localname, String qname, Attributes theseAttributes, Writer writer)
-  {
-    super(theStream,namespaceURI,localname,qname,theseAttributes);
-    theWriter = writer;
-  }
-
-  /** Flush the data to the underlying output stream */
-  public void flush()
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Flush the data to the underlying output stream
-      theWriter.flush();
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  protected void tagContents(char[] ch, int start, int length)
-    throws ManifoldCFException
-  {
-    try
-    {
-      escapeCharData(ch,start,length,theWriter);
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Start a child tag.
-  * The XMLWriterContext accepts all subtags in their text form.
-  */
-  protected XMLContext beginTag(String namespaceURI, String localName, String qName, Attributes atts)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // First, write out the tag text.  We strip off the namespace.
-    try
-    {
-      theWriter.write("<"+localName);
-      int length = atts.getLength();
-      int i = 0;
-      while (i < length)
-      {
-        theWriter.write(" ");
-        theWriter.write(atts.getLocalName(i));
-        theWriter.write("=\"");
-        theWriter.write(escapeAttribute(atts.getValue(i)));
-        theWriter.write("\"");
-        i++;
-      }
-      theWriter.write(">");
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-    // Now, start a new context which is also a writer context.
-    super.beginTag(namespaceURI,localName,qName,atts);
-    return new XMLWriterContext(theStream,namespaceURI,localName,qName,atts,theWriter);
-  }
-
-  /** End a child tag.
-  * The XMLWriterContext accepts all subtags in their text form.
-  */
-  protected void endTag()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // First, write out the tag text.  We strip off the namespace.
-    try
-    {
-      XMLContext context = theStream.getContext();
-      String tagName = context.getLocalname();
-
-      theWriter.write("</"+tagName+">");
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-    super.endTag();
-  }
-
-  /** Convert a string to a value that's safe to include inside an attribute value */
-  protected static String escapeAttribute(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\'' || x == '"' || x == '<' || x == '>' || x == '&'|| (x < ' ' && x >= 0))
-      {
-        rval.append("&#").append(Integer.toString((int)x)).append(";");
-      }
-      else
-        rval.append(x);
-    }
-    return rval.toString();
-  }
-  
-  /** Escapes sequence of characters to output writer */
-  protected static void escapeCharData(char [] chars, int start, int length, Writer out) throws IOException
-  {
-    for (int i=start; i<start+length; i++) {
-      char x = chars[i];
-      if (x == '<' || x == '>' || x == '&'|| (x < ' ' && x >= 0))
-      {
-        StringBuilder rval = new StringBuilder();
-        rval.append("&#").append(Integer.toString((int)x)).append(";");
-        out.write(rval.toString());
-        continue;
-      }
-      out.write(x);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java
deleted file mode 100644
index d3bf7bc..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java
+++ /dev/null
@@ -1,3588 +0,0 @@
-/* $Id: IncrementalIngester.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.incrementalingest;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.Logging;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-
-/** Incremental ingestion API implementation.
-* This class is responsible for keeping track of what has been sent where, and also the corresponding version of
-* each document so indexed.  The space over which this takes place is defined by the individual output connection - that is, the output connection
-* seems to "remember" what documents were handed to it.
-*
-* A secondary purpose of this module is to provide a mapping between the key by which a document is described internally (by an
-* identifier hash, plus the name of an identifier space), and the way the document is identified in the output space (by the name of an
-* output connection, plus a URI which is considered local to that output connection space).
-*
-* <br><br>
-* <b>ingeststatus</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>id</td><td>BIGINT</td><td>Primary Key</td></tr>
-* <tr><td>connectionname</td><td>VARCHAR(32)</td><td>Reference:outputconnections.connectionname</td></tr>
-* <tr><td>dockey</td><td>VARCHAR(73)</td><td></td></tr>
-* <tr><td>componenthash</td><td>VARCHAR(40)</td><td></td></tr>
-* <tr><td>docuri</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>urihash</td><td>VARCHAR(40)</td><td></td></tr>
-* <tr><td>lastversion</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>lastoutputversion</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>lasttransformationversion</td><td>LONGTEXT</td><td></td></tr>
-* <tr><td>changecount</td><td>BIGINT</td><td></td></tr>
-* <tr><td>firstingest</td><td>BIGINT</td><td></td></tr>
-* <tr><td>lastingest</td><td>BIGINT</td><td></td></tr>
-* <tr><td>authorityname</td><td>VARCHAR(32)</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class IncrementalIngester extends org.apache.manifoldcf.core.database.BaseTable implements IIncrementalIngester
-{
-  public static final String _rcsid = "@(#)$Id: IncrementalIngester.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Fields
-  protected final static String idField = "id";
-  protected final static String outputConnNameField = "connectionname";
-  protected final static String docKeyField = "dockey";
-  protected final static String componentHashField = "componenthash";
-  protected final static String docURIField = "docuri";
-  protected final static String uriHashField = "urihash";
-  protected final static String lastVersionField = "lastversion";
-  protected final static String lastOutputVersionField = "lastoutputversion";
-  protected final static String lastTransformationVersionField = "lasttransformationversion";
-  protected final static String changeCountField = "changecount";
-  protected final static String firstIngestField = "firstingest";
-  protected final static String lastIngestField = "lastingest";
-  protected final static String authorityNameField = "authorityname";
-
-  // Thread context.
-  protected final IThreadContext threadContext;
-  // Lock manager.
-  protected final ILockManager lockManager;
-  // Output connection manager
-  protected final IOutputConnectionManager connectionManager;
-  // Output connector pool manager
-  protected final IOutputConnectorPool outputConnectorPool;
-  // Transformation connector pool manager
-  protected final ITransformationConnectorPool transformationConnectorPool;
-  
-  /** Constructor.
-  */
-  public IncrementalIngester(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"ingeststatus");
-    this.threadContext = threadContext;
-    lockManager = LockManagerFactory.make(threadContext);
-    connectionManager = OutputConnectionManagerFactory.make(threadContext);
-    outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-    transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-  }
-
-  /** Install the incremental ingestion manager.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    String outputConnectionTableName = connectionManager.getTableName();
-    String outputConnectionNameField = connectionManager.getConnectionNameColumn();
-
-    // We always include an outer loop, because some upgrade conditions require retries.
-    while (true)
-    {
-      // Postgresql has a limitation on the number of characters that can be indexed in a column.  So we use hashes instead.
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(idField,new ColumnDescription("BIGINT",true,false,null,null,false));
-        map.put(outputConnNameField,new ColumnDescription("VARCHAR(32)",false,false,outputConnectionTableName,outputConnectionNameField,false));
-        map.put(docKeyField,new ColumnDescription("VARCHAR(73)",false,false,null,null,false));
-        map.put(componentHashField,new ColumnDescription("VARCHAR(40)",false,true,null,null,false));
-        // The document URI field, if null, indicates that the document was not actually ingested!
-        // This happens when a connector wishes to keep track of a version string, but not actually ingest the doc.
-        map.put(docURIField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(uriHashField,new ColumnDescription("VARCHAR(40)",false,true,null,null,false));
-        map.put(lastVersionField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(lastOutputVersionField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(lastTransformationVersionField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(changeCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(firstIngestField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(lastIngestField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(authorityNameField,new ColumnDescription("VARCHAR(32)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrades from 2.0 onward go here
-      }
-
-      // Now, do indexes
-      IndexDescription keyIndex = new IndexDescription(true,new String[]{docKeyField,outputConnNameField,componentHashField});
-      IndexDescription uriHashIndex = new IndexDescription(false,new String[]{uriHashField,outputConnNameField});
-      IndexDescription outputConnIndex = new IndexDescription(false,new String[]{outputConnNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (keyIndex != null && id.equals(keyIndex))
-          keyIndex = null;
-        else if (uriHashIndex != null && id.equals(uriHashIndex))
-          uriHashIndex = null;
-        else if (outputConnIndex != null && id.equals(outputConnIndex))
-          outputConnIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (uriHashIndex != null)
-        performAddIndex(null,uriHashIndex);
-
-      if (keyIndex != null)
-        performAddIndex(null,keyIndex);
-
-      if (outputConnIndex != null)
-        performAddIndex(null,outputConnIndex);
-      
-      // All done; break out of loop
-      break;
-    }
-
-  }
-
-  /** Uninstall the incremental ingestion manager.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Flush all knowledge of what was ingested before.
-  */
-  @Override
-  public void clearAll()
-    throws ManifoldCFException
-  {
-    performDelete("",null,null);
-  }
-
-  /** From a pipeline specification, get the name of the output connection that will be indexed last
-  * in the pipeline.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@return the last indexed output connection name.
-  */
-  @Override
-  public String getLastIndexedOutputConnectionName(IPipelineSpecificationBasic pipelineSpecificationBasic)
-  {
-    // It's always the last in the sequence.
-    int count = pipelineSpecificationBasic.getOutputCount();
-    if (count == 0)
-      return null;
-    return pipelineSpecificationBasic.getStageConnectionName(pipelineSpecificationBasic.getOutputStage(count-1));
-  }
-
-  /** From a pipeline specification, get the name of the output connection that will be indexed first
-  * in the pipeline.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@return the first indexed output connection name.
-  */
-  @Override
-  public String getFirstIndexedOutputConnectionName(IPipelineSpecificationBasic pipelineSpecificationBasic)
-  {
-    if (pipelineSpecificationBasic.getOutputCount() == 0)
-      return null;
-    return pipelineSpecificationBasic.getStageConnectionName(pipelineSpecificationBasic.getOutputStage(0));
-  }
-
-  /** Check if a date is indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param date is the date to check.
-  *@param activity are the activities available to this method.
-  *@return true if the mimeType is indexable.
-  */
-  @Override
-  public boolean checkDateIndexable(
-    IPipelineSpecification pipelineSpecification,
-    Date date,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    PipelineObject pipeline = pipelineGrab(pipelineSpecification);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("One or more connectors are not installed",0L);
-    try
-    {
-      return pipeline.checkDateIndexable(date,activity);
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Check if a mime type is indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param mimeType is the mime type to check.
-  *@param activity are the activities available to this method.
-  *@return true if the mimeType is indexable.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(
-    IPipelineSpecification pipelineSpecification,
-    String mimeType,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    PipelineObject pipeline = pipelineGrab(pipelineSpecification);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("One or more connectors are not installed",0L);
-    try
-    {
-      return pipeline.checkMimeTypeIndexable(mimeType,activity);
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Check if a file is indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param localFile is the local file to check.
-  *@param activity are the activities available to this method.
-  *@return true if the local file is indexable.
-  */
-  @Override
-  public boolean checkDocumentIndexable(
-    IPipelineSpecification pipelineSpecification,
-    File localFile,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    PipelineObject pipeline = pipelineGrab(pipelineSpecification);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("One or more connectors are not installed",0L);
-    try
-    {
-      return pipeline.checkDocumentIndexable(localFile,activity);
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that are too long to be indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param length is the length of the document.
-  *@param activity are the activities available to this method.
-  *@return true if the file is indexable.
-  */
-  @Override
-  public boolean checkLengthIndexable(
-    IPipelineSpecification pipelineSpecification,
-    long length,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    PipelineObject pipeline = pipelineGrab(pipelineSpecification);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("One or more connectors are not installed",0L);
-    try
-    {
-      return pipeline.checkLengthIndexable(length,activity);
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Pre-determine whether a document's URL is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that not indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param url is the url of the document.
-  *@param activity are the activities available to this method.
-  *@return true if the file is indexable.
-  */
-  @Override
-  public boolean checkURLIndexable(
-    IPipelineSpecification pipelineSpecification,
-    String url,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    PipelineObject pipeline = pipelineGrab(pipelineSpecification);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("One or more connectors are not installed",0L);
-    try
-    {
-      return pipeline.checkURLIndexable(url,activity);
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Grab the entire pipeline.
-  *@param transformationConnections - the transformation connections, in order
-  *@param outputConnection - the output connection
-  *@param transformationDescriptionStrings - the array of description strings for transformations
-  *@param outputDescriptionString - the output description string
-  *@return the pipeline description, or null if any part of the pipeline cannot be grabbed.
-  */
-  protected PipelineObjectWithVersions pipelineGrabWithVersions(IPipelineSpecificationWithVersions pipelineConnections)
-    throws ManifoldCFException
-  {
-    // Pick up all needed transformation connectors
-    ITransformationConnector[] transformationConnectors = transformationConnectorPool.grabMultiple(pipelineConnections.getTransformationConnectionNames(),pipelineConnections.getTransformationConnections());
-    for (ITransformationConnector c : transformationConnectors)
-    {
-      if (c == null)
-      {
-        transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-        return null;
-      }
-    }
-    
-    // Pick up all needed output connectors.  If this fails we have to release the transformation connectors.
-    try
-    {
-      IOutputConnector[] outputConnectors = outputConnectorPool.grabMultiple(pipelineConnections.getOutputConnectionNames(),pipelineConnections.getOutputConnections());
-      for (IOutputConnector c : outputConnectors)
-      {
-        if (c == null)
-        {
-          outputConnectorPool.releaseMultiple(pipelineConnections.getOutputConnections(),outputConnectors);
-          transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-          return null;
-        }
-      }
-      return new PipelineObjectWithVersions(pipelineConnections,transformationConnectors,outputConnectors);
-    }
-    catch (Throwable e)
-    {
-      transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-      if (e instanceof ManifoldCFException)
-        throw (ManifoldCFException)e;
-      else if (e instanceof RuntimeException)
-        throw (RuntimeException)e;
-      else if (e instanceof Error)
-        throw (Error)e;
-      else
-        throw new RuntimeException("Unexpected exception type: "+e.getClass().getName()+": "+e.getMessage(),e);
-    }
-  }
-
-  /** Grab the entire pipeline.
-  *@param transformationConnections - the transformation connections, in order
-  *@param outputConnection - the output connection
-  *@param transformationDescriptionStrings - the array of description strings for transformations
-  *@param outputDescriptionString - the output description string
-  *@return the pipeline description, or null if any part of the pipeline cannot be grabbed.
-  */
-  protected PipelineObject pipelineGrab(IPipelineSpecification pipelineConnections)
-    throws ManifoldCFException
-  {
-    // Pick up all needed transformation connectors
-    ITransformationConnector[] transformationConnectors = transformationConnectorPool.grabMultiple(pipelineConnections.getTransformationConnectionNames(),pipelineConnections.getTransformationConnections());
-    for (ITransformationConnector c : transformationConnectors)
-    {
-      if (c == null)
-      {
-        transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-        return null;
-      }
-    }
-    
-    // Pick up all needed output connectors.  If this fails we have to release the transformation connectors.
-    try
-    {
-      IOutputConnector[] outputConnectors = outputConnectorPool.grabMultiple(pipelineConnections.getOutputConnectionNames(),pipelineConnections.getOutputConnections());
-      for (IOutputConnector c : outputConnectors)
-      {
-        if (c == null)
-        {
-          outputConnectorPool.releaseMultiple(pipelineConnections.getOutputConnections(),outputConnectors);
-          transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-          return null;
-        }
-      }
-      return new PipelineObject(pipelineConnections,transformationConnectors,outputConnectors);
-    }
-    catch (Throwable e)
-    {
-      transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-      if (e instanceof ManifoldCFException)
-        throw (ManifoldCFException)e;
-      else if (e instanceof RuntimeException)
-        throw (RuntimeException)e;
-      else if (e instanceof Error)
-        throw (Error)e;
-      else
-        throw new RuntimeException("Unexpected exception type: "+e.getClass().getName()+": "+e.getMessage(),e);
-    }
-  }
-
-  /** Get an output version string for a document.
-  *@param outputConnection is the output connection associated with this action.
-  *@param spec is the output specification.
-  *@return the description string.
-  */
-  @Override
-  public VersionContext getOutputDescription(IOutputConnection outputConnection, Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    IOutputConnector connector = outputConnectorPool.grab(outputConnection);
-    if (connector == null)
-      // The connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("Output connector not installed",0L);
-    try
-    {
-      return connector.getPipelineDescription(spec);
-    }
-    finally
-    {
-      outputConnectorPool.release(outputConnection,connector);
-    }
-
-  }
-
-  /** Get transformation version string for a document.
-  *@param transformationConnection is the transformation connection associated with this action.
-  *@param spec is the transformation specification.
-  *@return the description string.
-  */
-  @Override
-  public VersionContext getTransformationDescription(ITransformationConnection transformationConnection, Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    ITransformationConnector connector = transformationConnectorPool.grab(transformationConnection);
-    if (connector == null)
-      // The connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("Transformation connector not installed",0L);
-    try
-    {
-      return connector.getPipelineDescription(spec);
-    }
-    finally
-    {
-      transformationConnectorPool.release(transformationConnection,connector);
-    }
-  }
-
-  /** Determine whether we need to fetch or refetch a document.
-  * Pass in information including the pipeline specification with existing version info, plus new document and parameter version strings.
-  * If no outputs need to be updated, then this method will return false.  If any outputs need updating, then true is returned.
-  *@param pipelineSpecificationWithVersions is the pipeline specification including new version info for all transformation and output
-  *  connections.
-  *@param newDocumentVersion is the newly-determined document version.
-  *@param newAuthorityNameString is the newly-determined authority name.
-  *@return true if the document needs to be refetched.
-  */
-  @Override
-  public boolean checkFetchDocument(
-    IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-    String newDocumentVersion,
-    String newAuthorityNameString)
-  {
-    if (newAuthorityNameString == null)
-      newAuthorityNameString = "";
-    // Cycle through the outputs
-    for (int i = 0; i < pipelineSpecificationWithVersions.getOutputCount(); i++)
-    {
-      int stage = pipelineSpecificationWithVersions.getOutputStage(i);
-      String oldDocumentVersion = pipelineSpecificationWithVersions.getOutputDocumentVersionString(i);
-      String oldOutputVersion = pipelineSpecificationWithVersions.getOutputVersionString(i);
-      String oldAuthorityName = pipelineSpecificationWithVersions.getAuthorityNameString(i);
-      // If it looks like we never indexed this output before, we need to do it now.
-      if (oldDocumentVersion == null)
-        return true;
-      // Look first at the version strings that aren't pipeline dependent
-      if (!oldDocumentVersion.equals(newDocumentVersion) ||
-        !oldAuthorityName.equals(newAuthorityNameString) ||
-        !oldOutputVersion.equals(pipelineSpecificationWithVersions.getStageDescriptionString(stage).getVersionString()))
-        return true;
-      
-      // Everything matches so far.  Next step is to compute a transformation path an corresponding version string.
-      String newTransformationVersion = computePackedTransformationVersion(pipelineSpecificationWithVersions,stage);
-      if (!pipelineSpecificationWithVersions.getOutputTransformationVersionString(i).equals(newTransformationVersion))
-        return true;
-    }
-    // Everything matches, so no reindexing is needed.
-    return false;
-  }
-
-  /** Compute a transformation version given a pipeline specification and starting output stage.
-  *@param pipelineSpecification is the pipeline specification.
-  *@param stage is the stage number of the output stage.
-  *@return the transformation version string, which will be a composite of all the transformations applied.
-  */
-  protected static String computePackedTransformationVersion(IPipelineSpecification pipelineSpecification, int stage)
-  {
-    // First, count the stages we need to represent
-    int stageCount = 0;
-    int currentStage = stage;
-    while (true)
-    {
-      int newStage = pipelineSpecification.getStageParent(currentStage);
-      if (newStage == -1)
-        break;
-      stageCount++;
-      currentStage = newStage;
-    }
-    // Doesn't matter how we pack it; I've chosen to do it in reverse for convenience
-    String[] stageNames = new String[stageCount];
-    String[] stageDescriptions = new String[stageCount];
-    stageCount = 0;
-    currentStage = stage;
-    while (true)
-    {
-      int newStage = pipelineSpecification.getStageParent(currentStage);
-      if (newStage == -1)
-        break;
-      stageNames[stageCount] = pipelineSpecification.getStageConnectionName(newStage);
-      stageDescriptions[stageCount] = pipelineSpecification.getStageDescriptionString(newStage).getVersionString();
-      stageCount++;
-      currentStage = newStage;
-    }
-    // Finally, do the packing.
-    StringBuilder sb = new StringBuilder();
-    packList(sb,stageNames,'+');
-    packList(sb,stageDescriptions,'!');
-    return sb.toString();
-  }
-  
-  protected static void packList(StringBuilder output, String[] values, char delimiter)
-  {
-    pack(output,Integer.toString(values.length),delimiter);
-    int i = 0;
-    while (i < values.length)
-    {
-      pack(output,values[i++],delimiter);
-    }
-  }
-
-  protected static void pack(StringBuilder sb, String value, char delim)
-  {
-    for (int i = 0; i < value.length(); i++)
-    {
-      char x = value.charAt(i);
-      if (x == delim || x == '\\')
-      {
-        sb.append('\\');
-      }
-      sb.append(x);
-    }
-    sb.append(delim);
-  }
-
-  /** Record a document version, but don't ingest it.
-  * The purpose of this method is to update document version information without reindexing the document.
-  *@param pipelineSpecificationBasic is the basic pipeline specification needed.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param documentVersion is the document version.
-  *@param recordTime is the time at which the recording took place, in milliseconds since epoch.
-  */
-  @Override
-  public void documentRecord(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash, String componentHash,
-    String documentVersion, long recordTime)
-    throws ManifoldCFException
-  {
-    // This method is called when a connector decides that the last indexed version of the document is in fact just fine,
-    // but the document version information should be updated.
-    // The code pathway is therefore similar to that of document indexing, EXCEPT that no indexing will ever
-    // take place.  This has some interesting side effects.  For example:
-    // (1) In the case of a document collision with another job using the same repository connection, the last document
-    //    indexed cannot be changed.  Updating the version string for the document would therefore be misleading.  This
-    //    case should be detected and prevented from occurring, by refusing to perform the update.
-    //    On the other hand, only one thread at a time can be processing the document at a given time, and therefore
-    //    since the connector detected "no change", we are safe to presume we can just update the version info.
-    // (2) In the case of a URL conflict with another job, since nothing changes and no new URL is recorded, no cleanup
-    //    of conflicting records sharing the same URL should be needed.
-    
-    String docKey = makeKey(identifierClass,identifierHash);
-
-    String[] outputConnectionNames = extractOutputConnectionNames(pipelineSpecificationBasic);
-
-    if (Logging.ingest.isDebugEnabled())
-    {
-      Logging.ingest.debug("Recording document '"+docKey+"' component hash "+((componentHash==null)?"(None)":("'"+componentHash+"'"))+" for output connections '"+outputConnectionNames+"'");
-    }
-
-    for (int k = 0; k < outputConnectionNames.length; k++)
-    {
-      String outputConnectionName = outputConnectionNames[k];
-
-      // If we get here, it means we are noting that the document was examined, but that no change was required.  This is signaled
-      // to noteDocumentIngest by having the null documentURI.
-      noteDocumentIngest(outputConnectionName,docKey,componentHash,documentVersion,null,null,null,recordTime,null,null);
-    }
-  }
-
-  /** Remove a document from specified indexes, just as if an empty document
-  * was indexed, and record the necessary version information.
-  * This method is conceptually similar to documentIngest(), but does not actually take
-  * a document or allow it to be transformed.  If there is a document already
-  * indexed, it is removed from the index.
-  *@param pipelineSpecificationWithVersions is the pipeline specification with already-fetched output versioning information.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param documentVersion is the document version.
-  *@param authorityName is the name of the authority associated with the document, if any.
-  *@param recordTime is the time at which the recording took place, in milliseconds since epoch.
-  *@param activities is an object providing a set of methods that the implementer can use to perform the operation.
-  */
-  @Override
-  public void documentNoData(
-    IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-    String identifierClass, String identifierHash, String componentHash,
-    String documentVersion,
-    String authorityName,
-    long recordTime,
-    IOutputActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String docKey = makeKey(identifierClass,identifierHash);
-
-    if (Logging.ingest.isDebugEnabled())
-    {
-      Logging.ingest.debug("Logging empty document '"+docKey+"' component hash "+((componentHash==null)?"(None)":("'"+componentHash+"'"))+" into output connections '"+extractOutputConnectionNames(pipelineSpecificationWithVersions)+"'");
-    }
-
-    // Set up a pipeline
-    PipelineObjectWithVersions pipeline = pipelineGrabWithVersions(pipelineSpecificationWithVersions);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("Pipeline connector not installed",0L);
-    try
-    {
-      pipeline.noDocument(docKey,componentHash,documentVersion,authorityName,activities,recordTime);
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Ingest a document.
-  * This ingests the document, and notes it.  If this is a repeat ingestion of the document, this
-  * method also REMOVES ALL OLD METADATA.  When complete, the index will contain only the metadata
-  * described by the RepositoryDocument object passed to this method.
-  * ServiceInterruption is thrown if the document ingestion must be rescheduled.
-  *@param pipelineSpecificationWithVersions is the pipeline specification with already-fetched output versioning information.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param documentVersion is the document version.
-  *@param authorityName is the name of the authority associated with the document, if any.
-  *@param data is the document data.  The data is closed after ingestion is complete.
-  *@param ingestTime is the time at which the ingestion took place, in milliseconds since epoch.
-  *@param documentURI is the URI of the document, which will be used as the key of the document in the index.
-  *@param activities is an object providing a set of methods that the implementer can use to perform the operation.
-  *@return true if the ingest was ok, false if the ingest is illegal (and should not be repeated).
-  *@throws IOException only if data stream throws an IOException.
-  */
-  @Override
-  public boolean documentIngest(
-    IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-    String identifierClass, String identifierHash, String componentHash,
-    String documentVersion,
-    String authorityName,
-    RepositoryDocument data,
-    long ingestTime, String documentURI,
-    IOutputActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    String docKey = makeKey(identifierClass,identifierHash);
-
-    if (Logging.ingest.isDebugEnabled())
-    {
-      Logging.ingest.debug("Ingesting document '"+docKey+"' component hash "+((componentHash==null)?"(None)":("'"+componentHash+"'"))+" into output connections '"+extractOutputConnectionNames(pipelineSpecificationWithVersions)+"'");
-    }
-
-    // Set indexing date
-    data.setIndexingDate(new Date());
-    
-    // Set up a pipeline
-    PipelineObjectWithVersions pipeline = pipelineGrabWithVersions(pipelineSpecificationWithVersions);
-    if (pipeline == null)
-      // A connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("Pipeline connector not installed",0L);
-    try
-    {
-      return pipeline.addOrReplaceDocumentWithException(docKey,componentHash,documentURI,data,documentVersion,authorityName,activities,ingestTime) == IPipelineConnector.DOCUMENTSTATUS_ACCEPTED;
-    }
-    finally
-    {
-      pipeline.release();
-    }
-  }
-
-  /** Remove a document component from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  @Override
-  public void documentRemove(
-    IPipelineConnections pipelineConnections,
-    String identifierClass, String identifierHash, String componentHash,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    documentRemoveMultiple(pipelineConnections,
-      new String[]{identifierClass},
-      new String[]{identifierHash},
-      componentHash,
-      activities);
-  }
-
-  protected static String[] extractOutputConnectionNames(IPipelineSpecificationBasic pipelineSpecificationBasic)
-  {
-    String[] rval = new String[pipelineSpecificationBasic.getOutputCount()];
-    for (int i = 0; i < rval.length; i++)
-    {
-      rval[i] = pipelineSpecificationBasic.getStageConnectionName(pipelineSpecificationBasic.getOutputStage(i));
-    }
-    return rval;
-  }
-  
-  /** Note the fact that we checked a document (and found that it did not need to be ingested, because the
-  * versions agreed).
-  *@param pipelineSpecificationBasic is a pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes are the set of document identifier hashes.
-  *@param checkTime is the time at which the check took place, in milliseconds since epoch.
-  */
-  @Override
-  public void documentCheckMultiple(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String[] identifierClasses, String[] identifierHashes,
-    long checkTime)
-    throws ManifoldCFException
-  {
-    // Extract output connection names from pipeline spec
-    String[] outputConnectionNames = extractOutputConnectionNames(pipelineSpecificationBasic);
-    beginTransaction();
-    try
-    {
-      int maxClauses;
-      
-      Set<String> docIDValues = new HashSet<String>();
-      for (int j = 0; j < identifierHashes.length; j++)
-      {
-        String docDBString = makeKey(identifierClasses[j],identifierHashes[j]);
-        docIDValues.add(docDBString);
-      }
-
-      // Now, perform n queries, each of them no larger the maxInClause in length.
-      // Create a list of row id's from this.
-      Set<Long> rowIDSet = new HashSet<Long>();
-      Iterator<String> iter = docIDValues.iterator();
-      int j = 0;
-      List<String> list = new ArrayList<String>();
-      maxClauses = maxClausesRowIdsForDocIds(outputConnectionNames);
-      while (iter.hasNext())
-      {
-        if (j == maxClauses)
-        {
-          findRowIdsForDocIds(outputConnectionNames,rowIDSet,list);
-          list.clear();
-          j = 0;
-        }
-        list.add(iter.next());
-        j++;
-      }
-
-      if (j > 0)
-        findRowIdsForDocIds(outputConnectionNames,rowIDSet,list);
-
-      // Now, break row id's into chunks too; submit one chunk at a time
-      j = 0;
-      List<Long> list2 = new ArrayList<Long>();
-      Iterator<Long> iter2 = rowIDSet.iterator();
-      maxClauses = maxClausesUpdateRowIds();
-      while (iter2.hasNext())
-      {
-        if (j == maxClauses)
-        {
-          updateRowIds(list2,checkTime);
-          list2.clear();
-          j = 0;
-        }
-        list2.add(iter2.next());
-        j++;
-      }
-
-      if (j > 0)
-        updateRowIds(list2,checkTime);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Note the fact that we checked a document (and found that it did not need to be ingested, because the
-  * versions agreed).
-  *@param pipelineSpecificationBasic is a basic pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param checkTime is the time at which the check took place, in milliseconds since epoch.
-  */
-  @Override
-  public void documentCheck(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash,
-    long checkTime)
-    throws ManifoldCFException
-  {
-    documentCheckMultiple(pipelineSpecificationBasic,new String[]{identifierClass},new String[]{identifierHash},checkTime);
-  }
-
-  /** Calculate the number of clauses.
-  */
-  protected int maxClausesUpdateRowIds()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-  
-  /** Update a chunk of row ids.
-  */
-  protected void updateRowIds(List<Long> list, long checkTime)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(idField,list)});
-      
-    HashMap map = new HashMap();
-    map.put(lastIngestField,new Long(checkTime));
-    performUpdate(map,"WHERE "+query,newList,null);
-  }
-
-
-  /** Delete multiple documents from the search engine index.
-  *@param pipelineConnections are the pipeline specifications associated with the documents.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is tha array of document identifier hashes if the documents.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  @Override
-  public void documentDeleteMultiple(
-    IPipelineConnections[] pipelineConnections,
-    String[] identifierClasses, String[] identifierHashes,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Segregate request by pipeline spec instance address.  Not perfect but works in the
-    // environment it is used it.
-    Map<IPipelineConnections,List<Integer>> keyMap = new HashMap<IPipelineConnections,List<Integer>>();
-    for (int i = 0; i < pipelineConnections.length; i++)
-    {
-      IPipelineConnections spec = pipelineConnections[i];
-      List<Integer> list = keyMap.get(spec);
-      if (list == null)
-      {
-        list = new ArrayList<Integer>();
-        keyMap.put(spec,list);
-      }
-      list.add(new Integer(i));
-    }
-
-    // Create the return array.
-    Iterator<IPipelineConnections> iter = keyMap.keySet().iterator();
-    while (iter.hasNext())
-    {
-      IPipelineConnections spec = iter.next();
-      List<Integer> list = keyMap.get(spec);
-      String[] localIdentifierClasses = new String[list.size()];
-      String[] localIdentifierHashes = new String[list.size()];
-      for (int i = 0; i < localIdentifierClasses.length; i++)
-      {
-        int index = list.get(i).intValue();
-        localIdentifierClasses[i] = identifierClasses[index];
-        localIdentifierHashes[i] = identifierHashes[index];
-      }
-      documentDeleteMultiple(spec,localIdentifierClasses,localIdentifierHashes,activities);
-    }
-  }
-
-  protected static String createURILockName(String outputConnectionName, String uriHash)
-  {
-    // The lock name needs to be constrained to some acceptably small number in order to avoid
-    // a lot of zookeeper locks.  See CONNECTORS-1123.
-    int hashCode = outputConnectionName.hashCode() + uriHash.hashCode();
-    hashCode &= 0xffff;
-    return "URILOCK-"+hashCode;
-  }
-  
-  /** Delete multiple documents from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is tha array of document identifier hashes if the documents.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  @Override
-  public void documentDeleteMultiple(
-    IPipelineConnections pipelineConnections,
-    String[] identifierClasses, String[] identifierHashes,
-    IOutputRemoveActivity originalActivities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String[] outputConnectionNames = pipelineConnections.getOutputConnectionNames();
-    IOutputConnection[] outputConnections = pipelineConnections.getOutputConnections();
-    
-    // No transactions here, so we can cycle through the connection names one at a time
-    for (int z = 0; z < outputConnectionNames.length; z++)
-    {
-      String outputConnectionName = outputConnectionNames[z];
-      IOutputConnection connection = outputConnections[z];
-
-      IOutputRemoveActivity activities = new OutputRemoveActivitiesWrapper(originalActivities,outputConnectionName);
-
-      if (Logging.ingest.isDebugEnabled())
-      {
-        for (int i = 0; i < identifierHashes.length; i++)
-        {
-          Logging.ingest.debug("Request to delete document '"+makeKey(identifierClasses[i],identifierHashes[i])+"' from output connection '"+outputConnectionName+"'");
-        }
-      }
-
-      // No transactions.  Time for the operation may exceed transaction timeout.
-
-      // Obtain the current URIs of all of these.
-      List<DeleteInfo> uris = getDocumentURIMultiple(outputConnectionName,identifierClasses,identifierHashes);
-
-      // Grab critical section locks so that we can't attempt to ingest at the same time we are deleting.
-      // (This guarantees that when this operation is complete the database reflects reality.)
-      int validURIcount = 0;
-      for (DeleteInfo uri : uris)
-      {
-        if (uri.getURI() != null)
-          validURIcount++;
-      }
-      String[] lockArray = new String[validURIcount];
-      String[] validURIArray = new String[validURIcount];
-      String[] validURIHashArray = new String[validURIcount];
-      validURIcount = 0;
-      for (DeleteInfo uri : uris)
-      {
-        if (uri.getURI() != null)
-        {
-          validURIArray[validURIcount] = uri.getURI();
-          validURIHashArray[validURIcount] = uri.getURIHash();
-          lockArray[validURIcount] = createURILockName(outputConnectionName,validURIHashArray[validURIcount]);
-          validURIcount++;
-        }
-      }
-
-      lockManager.enterLocks(null,null,lockArray);
-      try
-      {
-        // Fetch the document URIs for the listed documents
-        for (DeleteInfo uri : uris)
-        {
-          if (uri.getURI() != null)
-          {
-            removeDocument(connection,uri.getURI(),uri.getOutputVersion(),activities);
-          }
-        }
-
-        // Now, get rid of all rows that match the given uris.
-        // Do the queries together, then the deletes
-        beginTransaction();
-        try
-        {
-          // The basic process is this:
-          // 1) Come up with a set of urihash values
-          // 2) Find the matching, corresponding id values
-          // 3) Delete the rows corresponding to the id values, in sequence
-
-          // Process (1 & 2) has to be broken down into chunks that contain the maximum
-          // number of doc hash values each.  We need to avoid repeating doc hash values,
-          // so the first step is to come up with ALL the doc hash values before looping
-          // over them.
-
-          int maxClauses;
-          
-          // Find all the documents that match this set of URIs
-          Set<String> docURIHashValues = new HashSet<String>();
-          Set<String> docURIValues = new HashSet<String>();
-          for (String docDBString : validURIArray)
-          {
-            docURIValues.add(docDBString);
-          }
-          for (String docDBString : validURIHashArray)
-          {
-            docURIHashValues.add(docDBString);
-          }
-
-          // Now, perform n queries, each of them no larger the maxInClause in length.
-          // Create a list of row id's from this.
-          Set<Long> rowIDSet = new HashSet<Long>();
-          Iterator<String> iter = docURIHashValues.iterator();
-          int j = 0;
-          List<String> hashList = new ArrayList<String>();
-          maxClauses = maxClausesRowIdsForURIs(outputConnectionName);
-          while (iter.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              findRowIdsForURIs(outputConnectionName,rowIDSet,docURIValues,hashList);
-              hashList.clear();
-              j = 0;
-            }
-            hashList.add(iter.next());
-            j++;
-          }
-
-          if (j > 0)
-            findRowIdsForURIs(outputConnectionName,rowIDSet,docURIValues,hashList);
-
-          // Next, go through the list of row IDs, and delete them in chunks
-          j = 0;
-          List<Long> list = new ArrayList<Long>();
-          Iterator<Long> iter2 = rowIDSet.iterator();
-          maxClauses = maxClausesDeleteRowIds();
-          while (iter2.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              deleteRowIds(list);
-              list.clear();
-              j = 0;
-            }
-            list.add(iter2.next());
-            j++;
-          }
-
-          if (j > 0)
-            deleteRowIds(list);
-
-          // Now, find the set of documents that remain that match the document identifiers.
-          Set<String> docIdValues = new HashSet<String>();
-          for (int i = 0; i < identifierHashes.length; i++)
-          {
-            String docDBString = makeKey(identifierClasses[i],identifierHashes[i]);
-            docIdValues.add(docDBString);
-          }
-
-          // Now, perform n queries, each of them no larger the maxInClause in length.
-          // Create a list of row id's from this.
-          rowIDSet.clear();
-          iter = docIdValues.iterator();
-          j = 0;
-          List<String> list2 = new ArrayList<String>();
-          maxClauses = maxClausesRowIdsForDocIds(outputConnectionName);
-          while (iter.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              findRowIdsForDocIds(outputConnectionName,rowIDSet,list2);
-              list2.clear();
-              j = 0;
-            }
-            list2.add(iter.next());
-            j++;
-          }
-
-          if (j > 0)
-            findRowIdsForDocIds(outputConnectionName,rowIDSet,list2);
-
-          // Next, go through the list of row IDs, and delete them in chunks
-          j = 0;
-          list.clear();
-          iter2 = rowIDSet.iterator();
-          maxClauses = maxClausesDeleteRowIds();
-          while (iter2.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              deleteRowIds(list);
-              list.clear();
-              j = 0;
-            }
-            list.add(iter2.next());
-            j++;
-          }
-
-          if (j > 0)
-            deleteRowIds(list);
-
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveLocks(null,null,lockArray);
-      }
-    }
-  }
-
-  /** Remove multiple document components from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hash should be interpreted.
-  *@param identifierHashes are the hashes of the ids of the documents.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  @Override
-  public void documentRemoveMultiple(
-    IPipelineConnections pipelineConnections,
-    String[] identifierClasses, String[] identifierHashes, String componentHash,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String[] outputConnectionNames = pipelineConnections.getOutputConnectionNames();
-    IOutputConnection[] outputConnections = pipelineConnections.getOutputConnections();
-    
-    // No transactions here, so we can cycle through the connection names one at a time
-    for (int z = 0; z < outputConnectionNames.length; z++)
-    {
-      String outputConnectionName = outputConnectionNames[z];
-      IOutputConnection connection = outputConnections[z];
-
-      activities = new OutputRemoveActivitiesWrapper(activities,outputConnectionName);
-
-      if (Logging.ingest.isDebugEnabled())
-      {
-        for (int i = 0; i < identifierHashes.length; i++)
-        {
-          Logging.ingest.debug("Request to remove document '"+makeKey(identifierClasses[i],identifierHashes[i])+"' component hash "+((componentHash==null)?"(None)":("'"+componentHash+"'"))+" from output connection '"+outputConnectionName+"'");
-        }
-      }
-
-      // No transactions.  Time for the operation may exceed transaction timeout.
-
-      // Obtain the current URIs of all of these.
-      List<DeleteInfo> uris = getDocumentURIMultiple(outputConnectionName,identifierClasses,identifierHashes,componentHash);
-
-      // Grab critical section locks so that we can't attempt to ingest at the same time we are deleting.
-      // (This guarantees that when this operation is complete the database reflects reality.)
-      int validURIcount = 0;
-      for (DeleteInfo uri : uris)
-      {
-        if (uri.getURI() != null)
-          validURIcount++;
-      }
-      String[] lockArray = new String[validURIcount];
-      String[] validURIArray = new String[validURIcount];
-      String[] validURIHashArray = new String[validURIcount];
-      validURIcount = 0;
-      for (DeleteInfo uri : uris)
-      {
-        if (uri.getURI() != null)
-        {
-          validURIArray[validURIcount] = uri.getURI();
-          validURIHashArray[validURIcount] = uri.getURIHash();
-          lockArray[validURIcount] = createURILockName(outputConnectionName,validURIHashArray[validURIcount]);
-          validURIcount++;
-        }
-      }
-
-      lockManager.enterLocks(null,null,lockArray);
-      try
-      {
-        // Fetch the document URIs for the listed documents
-        for (DeleteInfo uri : uris)
-        {
-          if (uri.getURI() != null)
-            removeDocument(connection,uri.getURI(),uri.getOutputVersion(),activities);
-        }
-
-        // Now, get rid of all rows that match the given uris.
-        // Do the queries together, then the deletes
-        beginTransaction();
-        try
-        {
-          // The basic process is this:
-          // 1) Come up with a set of urihash values
-          // 2) Find the matching, corresponding id values
-          // 3) Delete the rows corresponding to the id values, in sequence
-
-          // Process (1 & 2) has to be broken down into chunks that contain the maximum
-          // number of doc hash values each.  We need to avoid repeating doc hash values,
-          // so the first step is to come up with ALL the doc hash values before looping
-          // over them.
-
-          int maxClauses;
-          
-          // Find all the documents that match this set of URIs
-          Set<String> docURIHashValues = new HashSet<String>();
-          Set<String> docURIValues = new HashSet<String>();
-          for (String docDBString : validURIArray)
-          {
-            docURIValues.add(docDBString);
-          }
-          for (String docDBString : validURIHashArray)
-          {
-            docURIHashValues.add(docDBString);
-          }
-
-          // Now, perform n queries, each of them no larger the maxInClause in length.
-          // Create a list of row id's from this.
-          Set<Long> rowIDSet = new HashSet<Long>();
-          Iterator<String> iter = docURIHashValues.iterator();
-          int j = 0;
-          List<String> hashList = new ArrayList<String>();
-          maxClauses = maxClausesRowIdsForURIs(outputConnectionName);
-          while (iter.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              findRowIdsForURIs(outputConnectionName,rowIDSet,docURIValues,hashList);
-              hashList.clear();
-              j = 0;
-            }
-            hashList.add(iter.next());
-            j++;
-          }
-
-          if (j > 0)
-            findRowIdsForURIs(outputConnectionName,rowIDSet,docURIValues,hashList);
-
-          // Next, go through the list of row IDs, and delete them in chunks
-          j = 0;
-          List<Long> list = new ArrayList<Long>();
-          Iterator<Long> iter2 = rowIDSet.iterator();
-          maxClauses = maxClausesDeleteRowIds();
-          while (iter2.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              deleteRowIds(list);
-              list.clear();
-              j = 0;
-            }
-            list.add(iter2.next());
-            j++;
-          }
-
-          if (j > 0)
-            deleteRowIds(list);
-
-          // Now, find the set of documents that remain that match the document identifiers.
-          Set<String> docIdValues = new HashSet<String>();
-          for (int i = 0; i < identifierHashes.length; i++)
-          {
-            String docDBString = makeKey(identifierClasses[i],identifierHashes[i]);
-            docIdValues.add(docDBString);
-          }
-
-          // Now, perform n queries, each of them no larger the maxInClause in length.
-          // Create a list of row id's from this.
-          rowIDSet.clear();
-          iter = docIdValues.iterator();
-          j = 0;
-          List<String> list2 = new ArrayList<String>();
-          maxClauses = maxClausesRowIdsForDocIds(outputConnectionName,componentHash);
-          while (iter.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              findRowIdsForDocIds(outputConnectionName,rowIDSet,list2,componentHash);
-              list2.clear();
-              j = 0;
-            }
-            list2.add(iter.next());
-            j++;
-          }
-
-          if (j > 0)
-            findRowIdsForDocIds(outputConnectionName,rowIDSet,list2,componentHash);
-
-          // Next, go through the list of row IDs, and delete them in chunks
-          j = 0;
-          list.clear();
-          iter2 = rowIDSet.iterator();
-          maxClauses = maxClausesDeleteRowIds();
-          while (iter2.hasNext())
-          {
-            if (j == maxClauses)
-            {
-              deleteRowIds(list);
-              list.clear();
-              j = 0;
-            }
-            list.add(iter2.next());
-            j++;
-          }
-
-          if (j > 0)
-            deleteRowIds(list);
-
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveLocks(null,null,lockArray);
-      }
-    }
-  }
-
-  /** Calculate the clauses.
-  */
-  protected int maxClausesRowIdsForURIs(String outputConnectionName)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-  }
-  
-  /** Given values and parameters corresponding to a set of hash values, add corresponding
-  * table row id's to the output map.
-  */
-  protected void findRowIdsForURIs(String outputConnectionName, Set<Long> rowIDSet, Set<String> uris, List<String> hashParamValues)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(uriHashField,hashParamValues),
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-      
-    IResultSet set = performQuery("SELECT "+idField+","+docURIField+" FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-    
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      String docURI = (String)row.getValue(docURIField);
-      if (docURI != null && docURI.length() > 0)
-      {
-        if (uris.contains(docURI))
-        {
-          Long rowID = (Long)row.getValue(idField);
-          rowIDSet.add(rowID);
-        }
-      }
-    }
-  }
-
-  /** Calculate the maximum number of doc ids we should use.
-  */
-  protected int maxClausesRowIdsForDocIds(String outputConnectionName)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-  }
-
-    /** Calculate the maximum number of doc ids we should use.
-  */
-  protected int maxClausesRowIdsForDocIds(String outputConnectionName, String componentHash)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnectionName),
-      (componentHash == null || componentHash.length() == 0)?new NullCheckClause(componentHashField,true):new UnitaryClause(componentHashField,componentHash)});
-  }
-
-  /** Calculate the maximum number of doc ids we should use.
-  */
-  protected int maxClausesRowIdsForDocIds(String[] outputConnectionNames)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new MultiClause(outputConnNameField,outputConnectionNames)});
-  }
-  
-  /** Given values and parameters corresponding to a set of hash values, add corresponding
-  * table row id's to the output map.
-  */
-  protected void findRowIdsForDocIds(String outputConnectionName, Set<Long> rowIDSet, List<String> paramValues)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(docKeyField,paramValues),
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-      
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-    
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long rowID = (Long)row.getValue(idField);
-      rowIDSet.add(rowID);
-    }
-  }
-
-  /** Given values and parameters corresponding to a set of hash values, add corresponding
-  * table row id's to the output map.
-  */
-  protected void findRowIdsForDocIds(String outputConnectionName, Set<Long> rowIDSet, List<String> paramValues, String componentHash)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(docKeyField,paramValues),
-      new UnitaryClause(outputConnNameField,outputConnectionName),
-      (componentHash==null || componentHash.length() == 0)?new NullCheckClause(componentHashField,true):new UnitaryClause(componentHashField,componentHash)});
-      
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-    
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long rowID = (Long)row.getValue(idField);
-      rowIDSet.add(rowID);
-    }
-  }
-
-  /** Given values and parameters corresponding to a set of hash values, add corresponding
-  * table row id's to the output map.
-  */
-  protected void findRowIdsForDocIds(String[] outputConnectionNames, Set<Long> rowIDSet, List<String> paramValues)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(docKeyField,paramValues),
-      new MultiClause(outputConnNameField,outputConnectionNames)});
-      
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-    
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long rowID = (Long)row.getValue(idField);
-      rowIDSet.add(rowID);
-    }
-  }
-
-  /** Calculate the maximum number of clauses.
-  */
-  protected int maxClausesDeleteRowIds()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Delete a chunk of row ids.
-  */
-  protected void deleteRowIds(List<Long> list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(idField,list)});
-    performDelete("WHERE "+query,newList,null);
-  }
-
-  /** Delete a document from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  @Override
-  public void documentDelete(
-    IPipelineConnections pipelineConnections,
-    String identifierClass, String identifierHash,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    documentDeleteMultiple(pipelineConnections,new String[]{identifierClass},new String[]{identifierHash},activities);
-  }
-
-  /** Find out what URIs a SET of document URIs are currently ingested.
-  *@param identifierHashes is the array of document id's to check.
-  *@return the array of current document uri's.  Null returned for identifiers
-  * that don't exist in the index.
-  */
-  protected List<DeleteInfo> getDocumentURIMultiple(String outputConnectionName, String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException
-  {
-    List<DeleteInfo> rval = new ArrayList<DeleteInfo>();
-    beginTransaction();
-    try
-    {
-      List<String> list = new ArrayList<String>();
-      int maxCount = maxClauseDocumentURIChunk(outputConnectionName);
-      int j = 0;
-      for (int i = 0; i < identifierHashes.length; i++)
-      {
-        if (j == maxCount)
-        {
-          getDocumentURIChunk(rval,outputConnectionName,list);
-          j = 0;
-          list.clear();
-        }
-        list.add(makeKey(identifierClasses[i],identifierHashes[i]));
-        j++;
-      }
-      if (j > 0)
-        getDocumentURIChunk(rval,outputConnectionName,list);
-      return rval;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Find out what URIs a SET of document URIs are currently ingested.
-  *@param outputConnectionName is the output connection name.
-  *@param identifierClasses is the array of identifier classes.
-  *@param identifierHashes is the array of document id's to check.
-  *@param componentHash is the component hash to check.
-  *@return the array of current document uri's.  Null returned for identifiers
-  * that don't exist in the index.
-  */
-  protected List<DeleteInfo> getDocumentURIMultiple(String outputConnectionName, String[] identifierClasses, String[] identifierHashes, String componentHash)
-    throws ManifoldCFException
-  {
-    List<DeleteInfo> rval = new ArrayList<DeleteInfo>();
-    beginTransaction();
-    try
-    {
-      List<String> list = new ArrayList<String>();
-      int maxCount = maxClauseDocumentURIChunk(outputConnectionName,componentHash);
-      int j = 0;
-      for (int i = 0; i < identifierHashes.length; i++)
-      {
-        if (j == maxCount)
-        {
-          getDocumentURIChunk(rval,outputConnectionName,list,componentHash);
-          j = 0;
-          list.clear();
-        }
-        list.add(makeKey(identifierClasses[i],identifierHashes[i]));
-        j++;
-      }
-      if (j > 0)
-        getDocumentURIChunk(rval,outputConnectionName,list,componentHash);
-      return rval;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Look up ingestion data for a set of documents.
-  *@param rval is a map of output key to document data, in no particular order, which will be loaded with all matching results.
-  *@param pipelineSpecificationBasics are the pipeline specifications corresponding to the identifier classes and hashes.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is the array of document identifier hashes to look up.
-  */
-  @Override
-  public void getPipelineDocumentIngestDataMultiple(
-    IngestStatuses rval,
-    IPipelineSpecificationBasic[] pipelineSpecificationBasics,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException
-  {
-    // Organize by pipeline spec.
-    Map<IPipelineSpecificationBasic,List<Integer>> keyMap = new HashMap<IPipelineSpecificationBasic,List<Integer>>();
-    for (int i = 0; i < pipelineSpecificationBasics.length; i++)
-    {
-      IPipelineSpecificationBasic spec = pipelineSpecificationBasics[i];
-      List<Integer> list = keyMap.get(spec);
-      if (list == null)
-      {
-        list = new ArrayList<Integer>();
-        keyMap.put(spec,list);
-      }
-      list.add(new Integer(i));
-    }
-
-    // Create the return array.
-    Iterator<IPipelineSpecificationBasic> iter = keyMap.keySet().iterator();
-    while (iter.hasNext())
-    {
-      IPipelineSpecificationBasic spec = iter.next();
-      List<Integer> list = keyMap.get(spec);
-      String[] localIdentifierClasses = new String[list.size()];
-      String[] localIdentifierHashes = new String[list.size()];
-      for (int i = 0; i < localIdentifierClasses.length; i++)
-      {
-        int index = list.get(i).intValue();
-        localIdentifierClasses[i] = identifierClasses[index];
-        localIdentifierHashes[i] = identifierHashes[index];
-      }
-      getPipelineDocumentIngestDataMultiple(rval,spec,localIdentifierClasses,localIdentifierHashes);
-    }
-  }
-
-  /** Look up ingestion data for a SET of documents.
-  *@param rval is a map of output key to document data, in no particular order, which will be loaded with all matching results.
-  *@param pipelineSpecificationBasic is the pipeline specification for all documents.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is the array of document identifier hashes to look up.
-  */
-  @Override
-  public void getPipelineDocumentIngestDataMultiple(
-    IngestStatuses rval,
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException
-  {
-    String[] outputConnectionNames = extractOutputConnectionNames(pipelineSpecificationBasic);
-
-    // Build a map, so we can convert an identifier into an array index.
-    Map<String,Integer> indexMap = new HashMap<String,Integer>();
-    for (int i = 0; i < identifierHashes.length; i++)
-    {
-      indexMap.put(makeKey(identifierClasses[i],identifierHashes[i]),new Integer(i));
-    }
-
-    beginTransaction();
-    try
-    {
-      List<String> list = new ArrayList<String>();
-      int maxCount = maxClausePipelineDocumentIngestDataChunk(outputConnectionNames);
-      int j = 0;
-      Iterator<String> iter = indexMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        if (j == maxCount)
-        {
-          getPipelineDocumentIngestDataChunk(rval,indexMap,outputConnectionNames,list,identifierClasses,identifierHashes);
-          j = 0;
-          list.clear();
-        }
-        list.add(iter.next());
-        j++;
-      }
-      if (j > 0)
-        getPipelineDocumentIngestDataChunk(rval,indexMap,outputConnectionNames,list,identifierClasses,identifierHashes);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-  }
-
-  /** Get a chunk of document ingest data records.
-  *@param rval is the document ingest status array where the data should be put.
-  *@param map is the map from id to index.
-  *@param clause is the in clause for the query.
-  *@param list is the parameter list for the query.
-  */
-  protected void getPipelineDocumentIngestDataChunk(IngestStatuses rval, Map<String,Integer> map, String[] outputConnectionNames, List<String> list,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(docKeyField,list),
-      new MultiClause(outputConnNameField,outputConnectionNames)});
-      
-    // Get the primary records associated with this hash value
-    IResultSet set = performQuery("SELECT "+idField+","+outputConnNameField+","+docKeyField+","+componentHashField+","+lastVersionField+","+lastOutputVersionField+","+authorityNameField+","+lastTransformationVersionField+
-      " FROM "+getTableName()+" WHERE "+query,newList,null,null);
-
-    // Now, go through the original request once more, this time building the result
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      String docHash = row.getValue(docKeyField).toString();
-      Integer position = map.get(docHash);
-      if (position != null)
-      {
-        Long id = (Long)row.getValue(idField);
-        String outputConnectionName = (String)row.getValue(outputConnNameField);
-        String componentHash = (String)row.getValue(componentHashField);
-        String lastVersion = (String)row.getValue(lastVersionField);
-        if (lastVersion == null)
-          lastVersion = "";
-        String lastTransformationVersion = (String)row.getValue(lastTransformationVersionField);
-        if (lastTransformationVersion == null)
-          lastTransformationVersion = "";
-        String lastOutputVersion = (String)row.getValue(lastOutputVersionField);
-        if (lastOutputVersion == null)
-          lastOutputVersion = "";
-        String authorityName = (String)row.getValue(authorityNameField);
-        if (authorityName == null)
-          authorityName = "";
-        int indexValue = position.intValue();
-        rval.addStatus(identifierClasses[indexValue],identifierHashes[indexValue],outputConnectionName,
-          componentHash,new DocumentIngestStatus(lastVersion,lastTransformationVersion,lastOutputVersion,authorityName));
-      }
-    }
-  }
-  
-  /** Look up ingestion data for a document.
-  *@param rval is a map of output key to document data, in no particular order, which will be loaded with all matching results.
-  *@param pipelineSpecificationBasic is the pipeline specification for the document.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  */
-  @Override
-  public void getPipelineDocumentIngestData(
-    IngestStatuses rval,
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash)
-    throws ManifoldCFException
-  {
-    getPipelineDocumentIngestDataMultiple(rval,pipelineSpecificationBasic,
-      new String[]{identifierClass},new String[]{identifierHash});
-  }
-
-  /** Calculate the average time interval between changes for a document.
-  * This is based on the data gathered for the document.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is the hashes of the ids of the documents.
-  *@return the number of milliseconds between changes, or 0 if this cannot be calculated.
-  */
-  @Override
-  public long[] getDocumentUpdateIntervalMultiple(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException
-  {
-    // Get the output connection names
-    String[] outputConnectionNames = extractOutputConnectionNames(pipelineSpecificationBasic);
-
-    // Do these all at once!!
-    // First, create a return array
-    long[] rval = new long[identifierHashes.length];
-    // Also create a map from identifier to return index.
-    Map<String,Integer> returnMap = new HashMap<String,Integer>();
-    // Finally, need the set of hash codes
-    Set<String> idCodes = new HashSet<String>();
-    for (int j = 0; j < identifierHashes.length; j++)
-    {
-      String key = makeKey(identifierClasses[j],identifierHashes[j]);
-      rval[j] = Long.MAX_VALUE;
-      returnMap.put(key,new Integer(j));
-      idCodes.add(key);
-    }
-
-    // Get the chunk size
-    int maxClause = maxClauseGetIntervals(outputConnectionNames);
-
-    // Loop through the hash codes
-    Iterator<String> iter = idCodes.iterator();
-    List<String> list = new ArrayList<String>();
-    int j = 0;
-    while (iter.hasNext())
-    {
-      if (j == maxClause)
-      {
-        getIntervals(rval,outputConnectionNames,list,returnMap);
-        list.clear();
-        j = 0;
-      }
-
-      list.add(iter.next());
-      j++;
-    }
-
-    if (j > 0)
-      getIntervals(rval,outputConnectionNames,list,returnMap);
-
-    for (int i = 0; i < rval.length; i++)
-    {
-      if (rval[i] == Long.MAX_VALUE)
-        rval[i] = 0;
-    }
-    
-    return rval;
-
-  }
-
-  /** Calculate the average time interval between changes for a document.
-  * This is based on the data gathered for the document.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  *@return the number of milliseconds between changes, or 0 if this cannot be calculated.
-  */
-  @Override
-  public long getDocumentUpdateInterval(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash)
-    throws ManifoldCFException
-  {
-    return getDocumentUpdateIntervalMultiple(
-      pipelineSpecificationBasic,
-      new String[]{identifierClass},new String[]{identifierHash})[0];
-  }
-
-  /** Calculate the number of clauses.
-  */
-  protected int maxClauseGetIntervals(String[] outputConnectionNames)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new MultiClause(outputConnNameField,outputConnectionNames)});
-  }
-  
-  /** Query for and calculate the interval for a bunch of hashcodes.
-  *@param rval is the array to stuff calculated return values into.
-  *@param list is the list of parameters.
-  *@param queryPart is the part of the query pertaining to the list of hashcodes
-  *@param returnMap is a mapping from document id to rval index.
-  */
-  protected void getIntervals(long[] rval, String[] outputConnectionNames, List<String> list, Map<String,Integer> returnMap)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(docKeyField,list),
-      new MultiClause(outputConnNameField,outputConnectionNames)});
-      
-    IResultSet set = performQuery("SELECT "+docKeyField+","+changeCountField+","+firstIngestField+","+lastIngestField+
-      " FROM "+getTableName()+" WHERE "+query,newList,null,null);
-
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      String docHash = (String)row.getValue(docKeyField);
-      Integer index = (Integer)returnMap.get(docHash);
-      if (index != null)
-      {
-        // Calculate the return value
-        long changeCount = ((Long)row.getValue(changeCountField)).longValue();
-        long firstIngest = ((Long)row.getValue(firstIngestField)).longValue();
-        long lastIngest = ((Long)row.getValue(lastIngestField)).longValue();
-        int indexValue = index.intValue();
-        long newValue = (long)(((double)(lastIngest-firstIngest))/(double)changeCount);
-        if (newValue < rval[indexValue])
-          rval[indexValue] = newValue;
-      }
-    }
-  }
-
-  /** Reset all documents belonging to a specific output connection, because we've got information that
-  * that system has been reconfigured.  This will force all such documents to be reindexed the next time
-  * they are checked.
-  *@param outputConnection is the output connection associated with this action.
-  */
-  @Override
-  public void resetOutputConnection(IOutputConnection outputConnection)
-    throws ManifoldCFException
-  {
-    if (outputConnection == null)
-      return;
-
-    // We're not going to blow away the records, but we are going to set their versions to mean, "reindex required"
-    HashMap map = new HashMap();
-    map.put(lastVersionField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnection.getName())});
-      
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Remove all knowledge of an output index from the system.  This is appropriate
-  * when the output index no longer exists and you wish to delete the associated job.
-  *@param outputConnection is the output connection associated with this action.
-  */
-  @Override
-  public void removeOutputConnection(IOutputConnection outputConnection)
-    throws ManifoldCFException
-  {
-    if (outputConnection == null)
-      return;
-
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnection.getName())});
-      
-    performDelete("WHERE "+query,list,null);
-      
-    // Notify the output connection of the removal of all the records for the connection
-    IOutputConnector connector = outputConnectorPool.grab(outputConnection);
-    if (connector == null)
-      return;
-    try
-    {
-      connector.noteAllRecordsRemoved();
-    }
-    finally
-    {
-      outputConnectorPool.release(outputConnection,connector);
-    }
-
-  }
-  
-  /** Note the ingestion of a document, or the "update" of a document.
-  *@param outputConnectionName is the name of the output connection.
-  *@param docKey is the key string describing the document.
-  *@param componentHash is the component identifier hash for this document.
-  *@param documentVersion is a string describing the new version of the document.
-  *@param transformationVersion is a string describing all current transformations for the document.
-  *@param outputVersion is the version string calculated for the output connection.
-  *@param authorityNameString is the name of the relevant authority connection.
-  *@param ingestTime is the time at which the ingestion took place, in milliseconds since epoch.
-  *@param documentURI is the uri the document can be accessed at, or null (which signals that we are to record the version, but no
-  * ingestion took place).
-  *@param documentURIHash is the hash of the document uri.
-  */
-  protected void noteDocumentIngest(String outputConnectionName,
-    String docKey, String componentHash, String documentVersion, String transformationVersion,
-    String outputVersion,
-    String authorityNameString,
-    long ingestTime, String documentURI, String documentURIHash)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    while (true)
-    {
-      // The table can have at most one row per URI, for non-null URIs.  It can also have at most one row per document identifier.
-      // However, for null URI's, multiple rows are allowed.  Null URIs have a special meaning, which is that
-      // the document was not actually ingested.
-
-      // To make sure the constraints are enforced, we cannot simply look for the row and insert one if not found.  This is because
-      // postgresql does not cause a lock to be created on rows that don't yet exist, so multiple transactions of the kind described
-      // can lead to multiple rows with the same key.  Instead, we *could* lock the whole table down, but that would interfere with
-      // parallelism.  The lowest-impact approach is to make sure an index constraint is in place, and first attempt to do an INSERT.
-      // That attempt will fail if a record already exists.  Then, an update can be attempted.
-      //
-      // In the situation where the INSERT fails, the current transaction is aborted and a new transaction must be performed.
-      // This means that it is impossible to structure things so that the UPDATE is guaranteed to succeed.  So, on the event of an
-      // INSERT failure, the UPDATE is tried, but if that fails too, then the INSERT is tried again.  This should also handle the
-      // case where a DELETE in another transaction removes the database row before it can be UPDATEd.
-      //
-      // If the UPDATE does not appear to modify any rows, this is also a signal that the INSERT must be retried.
-      //
-
-      // Try the update first.  Typically this succeeds except in the case where a doc is indexed for the first time.
-      map.clear();
-      if (componentHash != null)
-        map.put(componentHashField,componentHash);
-      map.put(lastVersionField,documentVersion);
-      map.put(lastTransformationVersionField,transformationVersion);
-      map.put(lastOutputVersionField,outputVersion);
-      map.put(lastIngestField,new Long(ingestTime));
-      if (documentURI != null)
-      {
-        map.put(docURIField,documentURI);
-        map.put(uriHashField,documentURIHash);
-      }
-      if (authorityNameString != null)
-        map.put(authorityNameField,authorityNameString);
-      else
-        map.put(authorityNameField,"");
-      
-      // Transaction abort due to deadlock should be retried here.
-      while (true)
-      {
-        long sleepAmt = 0L;
-
-        beginTransaction();
-        try
-        {
-          // Look for existing row.
-          ArrayList list = new ArrayList();
-          String query = buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(docKeyField,docKey),
-            new UnitaryClause(outputConnNameField,outputConnectionName),
-            ((componentHash==null)?new NullCheckClause(componentHashField,true):new UnitaryClause(componentHashField,componentHash))});
-          IResultSet set = performQuery("SELECT "+idField+","+changeCountField+" FROM "+getTableName()+" WHERE "+
-            query+" FOR UPDATE",list,null,null);
-          IResultRow row = null;
-          if (set.getRowCount() > 0)
-            row = set.getRow(0);
-
-          if (row != null)
-          {
-            // Update the record
-            list.clear();
-            query = buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(idField,row.getValue(idField))});
-            long changeCount = ((Long)row.getValue(changeCountField)).longValue();
-            changeCount++;
-            map.put(changeCountField,new Long(changeCount));
-            performUpdate(map,"WHERE "+query,list,null);
-            // Update successful!
-            performCommit();
-            return;
-          }
-
-          // Update failed to find a matching record, so try the insert
-          break;
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction noting ingestion: "+e.getMessage());
-            sleepAmt = getSleepAmt();
-            continue;
-          }
-
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-          sleepFor(sleepAmt);
-        }
-      }
-
-      // Set up for insert
-      map.clear();
-      if (componentHash != null)
-        map.put(componentHashField,componentHash);
-      map.put(lastVersionField,documentVersion);
-      map.put(lastTransformationVersionField,transformationVersion);
-      map.put(lastOutputVersionField,outputVersion);
-      map.put(lastIngestField,new Long(ingestTime));
-      if (documentURI != null)
-      {
-        map.put(docURIField,documentURI);
-        map.put(uriHashField,documentURIHash);
-      }
-      if (authorityNameString != null)
-        map.put(authorityNameField,authorityNameString);
-      else
-        map.put(authorityNameField,"");
-
-      Long id = new Long(IDFactory.make(threadContext));
-      map.put(idField,id);
-      map.put(outputConnNameField,outputConnectionName);
-      map.put(docKeyField,docKey);
-      map.put(changeCountField,new Long(1));
-      map.put(firstIngestField,map.get(lastIngestField));
-      beginTransaction();
-      try
-      {
-        performInsert(map,null);
-        noteModifications(1,0,0);
-        performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        signalRollback();
-        // If this is simply a constraint violation, we just want to fall through and try the update!
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        // Otherwise, exit transaction and fall through to 'update' attempt
-      }
-      catch (Error e)
-      {
-        signalRollback();
-        throw e;
-      }
-      finally
-      {
-        endTransaction();
-      }
-
-      // Insert must have failed.  Attempt an update.
-    }
-  }
-
-  /** Calculate how many clauses at a time
-  */
-  protected int maxClauseDocumentURIChunk(String outputConnectionName)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-  }
-  
-  /** Get a chunk of document uris.
-  *@param rval is the string array where the uris should be put.
-  *@param map is the map from id to index.
-  *@param clause is the in clause for the query.
-  *@param list are the doc keys for the query.
-  */
-  protected void getDocumentURIChunk(List<DeleteInfo> rval, String outputConnectionName,
-    List<String> list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(docKeyField,list),
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-      
-    IResultSet set = performQuery("SELECT "+docKeyField+","+docURIField+","+uriHashField+","+lastOutputVersionField+" FROM "+getTableName()+" WHERE "+
-      query,newList,null,null);
-
-    // Go through list and put into buckets.
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      //String docHash = row.getValue(docKeyField).toString();
-      String lastURI = (String)row.getValue(docURIField);
-      if (lastURI != null && lastURI.length() == 0)
-        lastURI = null;
-      String lastURIHash = (String)row.getValue(uriHashField);
-      if (lastURIHash != null && lastURIHash.length() == 0)
-        lastURIHash = null;
-      String lastOutputVersion = (String)row.getValue(lastOutputVersionField);
-      rval.add(new DeleteInfo(lastURI,lastURIHash,lastOutputVersion));
-    }
-  }
-
-  /** Calculate how many clauses at a time
-  */
-  protected int maxClauseDocumentURIChunk(String outputConnectionName, String componentHash)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnectionName),
-      ((componentHash==null)?new NullCheckClause(componentHashField,true):new UnitaryClause(componentHashField,componentHash))});
-  }
-
-  /** Get a chunk of document uris.
-  *@param rval is the string array where the uris should be put.
-  *@param map is the map from id to index.
-  *@param clause is the in clause for the query.
-  *@param list are the doc keys for the query.
-  *@param componentHash is the component hash, if any, for the query.
-  */
-  protected void getDocumentURIChunk(List<DeleteInfo> rval, String outputConnectionName,
-    List<String> list, String componentHash)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(docKeyField,list),
-      new UnitaryClause(outputConnNameField,outputConnectionName),
-      ((componentHash==null)?new NullCheckClause(componentHashField,true):new UnitaryClause(componentHashField,componentHash))});
-      
-    IResultSet set = performQuery("SELECT "+docKeyField+","+docURIField+","+uriHashField+","+lastOutputVersionField+" FROM "+getTableName()+" WHERE "+
-      query,newList,null,null);
-
-    // Go through list and put into buckets.
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      //String docHash = row.getValue(docKeyField).toString();
-      String lastURI = (String)row.getValue(docURIField);
-      if (lastURI != null && lastURI.length() == 0)
-        lastURI = null;
-      String lastURIHash = (String)row.getValue(uriHashField);
-      if (lastURIHash != null && lastURIHash.length() == 0)
-        lastURIHash = null;
-      String lastOutputVersion = (String)row.getValue(lastOutputVersionField);
-      rval.add(new DeleteInfo(lastURI,lastURIHash,lastOutputVersion));
-    }
-  }
-
-  /** Count the clauses
-  */
-  protected int maxClauseDocumentIngestDataChunk(String outputConnectionName)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(outputConnNameField,outputConnectionName)});
-  }
-
-  /** Count the clauses
-  */
-  protected int maxClausePipelineDocumentIngestDataChunk(String[] outputConnectionNames)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new MultiClause(outputConnNameField,outputConnectionNames)});
-  }
-  
-
-  // Protected methods
-
-  /** Remove document, using the specified output connection, via the standard pool.
-  */
-  protected void removeDocument(IOutputConnection connection, String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    IOutputConnector connector = outputConnectorPool.grab(connection);
-    if (connector == null)
-      // The connector is not installed; treat this as a service interruption.
-      throw new ServiceInterruption("Output connector not installed",0L);
-    try
-    {
-      connector.removeDocument(documentURI,outputDescription,activities);
-    }
-    finally
-    {
-      outputConnectorPool.release(connection,connector);
-    }
-  }
-
-  /** Make a key from a document class and a hash */
-  protected static String makeKey(String documentClass, String documentHash)
-  {
-    return documentClass + ":" + documentHash;
-  }
-
-  /** This class contains the information necessary to delete a document */
-  protected static class DeleteInfo
-  {
-    protected String uriValue;
-    protected String uriHashValue;
-    protected String outputVersion;
-
-    public DeleteInfo(String uriValue, String uriHashValue, String outputVersion)
-    {
-      this.uriValue = uriValue;
-      this.uriHashValue = uriHashValue;
-      this.outputVersion = outputVersion;
-    }
-
-    public String getURI()
-    {
-      return uriValue;
-    }
-
-    public String getURIHash()
-    {
-      return uriHashValue;
-    }
-
-    public String getOutputVersion()
-    {
-      return outputVersion;
-    }
-  }
-  
-  /** Wrapper class for add activity.  This handles conversion of output connector activity logging to 
-  * qualified activity names */
-  protected static class OutputRecordingActivity implements IOutputHistoryActivity
-  {
-    protected final IOutputHistoryActivity activityProvider;
-    protected final String outputConnectionName;
-    
-    public OutputRecordingActivity(IOutputHistoryActivity activityProvider, String outputConnectionName)
-    {
-      this.activityProvider = activityProvider;
-      this.outputConnectionName = outputConnectionName;
-    }
-    
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    @Override
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      activityProvider.recordActivity(startTime,ManifoldCF.qualifyOutputActivityName(activityType,outputConnectionName),
-        dataSize,entityURI,resultCode,resultDescription);
-    }
-
-  }
-  
-  /** Wrapper class for add activity.  This handles conversion of transformation connector activity logging to 
-  * qualified activity names */
-  protected static class TransformationRecordingActivity implements IOutputHistoryActivity
-  {
-    protected final IOutputHistoryActivity activityProvider;
-    protected final String transformationConnectionName;
-    
-    public TransformationRecordingActivity(IOutputHistoryActivity activityProvider, String transformationConnectionName)
-    {
-      this.activityProvider = activityProvider;
-      this.transformationConnectionName = transformationConnectionName;
-    }
-    
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    @Override
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      activityProvider.recordActivity(startTime,ManifoldCF.qualifyTransformationActivityName(activityType,transformationConnectionName),
-        dataSize,entityURI,resultCode,resultDescription);
-    }
-
-  }
-
-  protected static class OutputRemoveActivitiesWrapper extends OutputRecordingActivity implements IOutputRemoveActivity
-  {
-    protected final IOutputRemoveActivity removeActivities;
-    
-    public OutputRemoveActivitiesWrapper(IOutputRemoveActivity removeActivities, String outputConnectionName)
-    {
-      super(removeActivities,outputConnectionName);
-      this.removeActivities = removeActivities;
-    }
-
-  }
-  
-  protected static class OutputAddActivitiesWrapper extends OutputRecordingActivity implements IOutputAddActivity
-  {
-    protected final IOutputAddActivity addActivities;
-    
-    public OutputAddActivitiesWrapper(IOutputAddActivity addActivities, String outputConnectionName)
-    {
-      super(addActivities,outputConnectionName);
-      this.addActivities = addActivities;
-    }
-    
-    /** Qualify an access token appropriately, to match access tokens as returned by mod_aa.  This method
-    * includes the authority name with the access token, if any, so that each authority may establish its own token space.
-    *@param authorityNameString is the name of the authority to use to qualify the access token.
-    *@param accessToken is the raw, repository access token.
-    *@return the properly qualified access token.
-    */
-    @Override
-    public String qualifyAccessToken(String authorityNameString, String accessToken)
-      throws ManifoldCFException
-    {
-      return addActivities.qualifyAccessToken(authorityNameString,accessToken);
-    }
-
-    /** Send a document via the pipeline to the next output connection.
-    *@param documentURI is the document's URI.
-    *@param document is the document data to be processed (handed to the output data store).
-    *@return the document status (accepted or permanently rejected); return codes are listed in IPipelineConnector.
-    *@throws IOException only if there's an IO error reading the data from the document.
-    */
-    @Override
-    public int sendDocument(String documentURI, RepositoryDocument document)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      return addActivities.sendDocument(documentURI,document);
-    }
-
-    /** Send NO document via the pipeline to the next output connection.  This is equivalent
-    * to sending an empty document placeholder.
-    */
-    @Override
-    public void noDocument()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      addActivities.noDocument();
-    }
-
-    /** Detect if a date is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-    * in the first place.
-    *@param date is the mime type of the document.
-    *@return true if the date can be accepted by the downstream connection.
-    */
-    @Override
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return addActivities.checkDateIndexable(date);
-    }
-
-    /** Detect if a mime type is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-    * in the first place.
-    *@param mimeType is the mime type of the document.
-    *@return true if the mime type can be accepted by the downstream connection.
-    */
-    @Override
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return addActivities.checkMimeTypeIndexable(mimeType);
-    }
-
-    /** Pre-determine whether a document (passed here as a File object) is acceptable downstream.  This method is
-    * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-    * search engines that only handle a small set of accepted file types.
-    *@param localFile is the local file to check.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return addActivities.checkDocumentIndexable(localFile);
-    }
-
-    /** Pre-determine whether a document's length is acceptable downstream.  This method is used
-    * to determine whether to fetch a document in the first place.
-    *@param length is the length of the document.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return addActivities.checkLengthIndexable(length);
-    }
-
-    /** Pre-determine whether a document's URL is acceptable downstream.  This method is used
-    * to help filter out documents that cannot be indexed in advance.
-    *@param url is the URL of the document.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkURLIndexable(String url)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return addActivities.checkURLIndexable(url);
-    }
-
-  }
-  
-  protected static class OutputActivitiesWrapper extends OutputAddActivitiesWrapper implements IOutputActivity
-  {
-    protected final IOutputActivity activities;
-    
-    public OutputActivitiesWrapper(IOutputActivity activities, String outputConnectionName)
-    {
-      super(activities,outputConnectionName);
-      this.activities = activities;
-    }
-  }
-  
-  protected class PipelineObject
-  {
-    public final IPipelineSpecification pipelineConnections;
-    public final IOutputConnector[] outputConnectors;
-    public final ITransformationConnector[] transformationConnectors;
-    
-    public PipelineObject(
-      IPipelineSpecification pipelineConnections,
-      ITransformationConnector[] transformationConnectors,
-      IOutputConnector[] outputConnectors)
-    {
-      this.pipelineConnections = pipelineConnections;
-      this.transformationConnectors = transformationConnectors;
-      this.outputConnectors = outputConnectors;
-    }
-
-    public boolean checkDateIndexable(Date date, IOutputCheckActivity finalActivity)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      PipelineCheckFanout entryPoint = buildCheckPipeline(finalActivity);
-      return entryPoint.checkDateIndexable(date);
-    }
-
-    public boolean checkMimeTypeIndexable(String mimeType, IOutputCheckActivity finalActivity)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      PipelineCheckFanout entryPoint = buildCheckPipeline(finalActivity);
-      return entryPoint.checkMimeTypeIndexable(mimeType);
-    }
-
-    public boolean checkDocumentIndexable(File localFile, IOutputCheckActivity finalActivity)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      PipelineCheckFanout entryPoint = buildCheckPipeline(finalActivity);
-      return entryPoint.checkDocumentIndexable(localFile);
-    }
-
-    public boolean checkLengthIndexable(long length, IOutputCheckActivity finalActivity)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      PipelineCheckFanout entryPoint = buildCheckPipeline(finalActivity);
-      return entryPoint.checkLengthIndexable(length);
-    }
-    
-    public boolean checkURLIndexable(String uri, IOutputCheckActivity finalActivity)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      PipelineCheckFanout entryPoint = buildCheckPipeline(finalActivity);
-      return entryPoint.checkURLIndexable(uri);
-    }
-
-    public void release()
-      throws ManifoldCFException
-    {
-      outputConnectorPool.releaseMultiple(pipelineConnections.getOutputConnections(),outputConnectors);
-      transformationConnectorPool.releaseMultiple(pipelineConnections.getTransformationConnections(),transformationConnectors);
-    }
-    
-    protected PipelineCheckFanout buildCheckPipeline(IOutputCheckActivity finalActivity)
-    {
-      // Algorithm for building a pipeline:
-      // (1) We start with the set of final output connection stages, and build an entry point for each one.  That's our "current set".
-      // (2) We cycle through the "current set".  For each member, we attempt to go upstream a level.
-      // (3) Before we can build the pipeline activity class for the next upstream stage, we need to have present ALL of the children that share that
-      //   parent.  If we don't have that yet, we throw the stage back into the list.
-      // (4) We continue until there is one stage left that has no parent, and that's what we return.
-      
-      // Create the current set
-      Map<Integer,PipelineCheckEntryPoint> currentSet = new HashMap<Integer,PipelineCheckEntryPoint>();
-      // First, locate all the output stages, and enter them into the set
-      int count = pipelineConnections.getOutputCount();
-      for (int i = 0; i < count; i++)
-      {
-        int outputStage = pipelineConnections.getOutputStage(i);
-        PipelineCheckEntryPoint outputStageEntryPoint = new PipelineCheckEntryPoint(
-          outputConnectors[pipelineConnections.getOutputConnectionIndex(outputStage).intValue()],
-          pipelineConnections.getStageDescriptionString(outputStage),finalActivity);
-        currentSet.put(new Integer(outputStage), outputStageEntryPoint);
-      }
-      // Cycle through the "current set"
-      while (true)
-      {
-        int parent = -1;
-        int[] siblings = null;
-        for (Integer outputStage : currentSet.keySet())
-        {
-          parent = pipelineConnections.getStageParent(outputStage.intValue());
-          // Look up the children
-          siblings = pipelineConnections.getStageChildren(parent);
-          // Are all the siblings in the current set yet?  If not, we can't proceed with this entry.
-          boolean skipToNext = false;
-          for (int sibling : siblings)
-          {
-            if (currentSet.get(new Integer(sibling)) == null)
-            {
-              skipToNext = true;
-              break;
-            }
-          }
-          if (skipToNext)
-          {
-            siblings = null;
-            continue;
-          }
-          // All siblings are present!
-          break;
-        }
-        
-        // Siblings will be set if there's a stage we can do.  If not, we're done, but this should already have been detected.
-        if (siblings == null)
-          throw new IllegalStateException("Not at root but can't progress");
-        
-        PipelineCheckEntryPoint[] siblingEntryPoints = new PipelineCheckEntryPoint[siblings.length];
-        for (int j = 0; j < siblings.length; j++)
-        {
-          siblingEntryPoints[j] = currentSet.remove(new Integer(siblings[j]));
-        }
-        // Wrap the entry points in a fan-out class, which has pipe connector-like methods that fire across all the connectors.
-        PipelineCheckFanout pcf = new PipelineCheckFanout(siblingEntryPoints);
-        if (parent == -1)
-          return pcf;
-        PipelineCheckEntryPoint newEntry = new PipelineCheckEntryPoint(
-          transformationConnectors[pipelineConnections.getTransformationConnectionIndex(parent).intValue()],
-          pipelineConnections.getStageDescriptionString(parent),pcf);
-        currentSet.put(new Integer(parent), newEntry);
-      }
-    }
-  }
-  
-  protected class PipelineObjectWithVersions extends PipelineObject
-  {
-    protected final IPipelineSpecificationWithVersions pipelineSpecificationWithVersions;
-    
-    public PipelineObjectWithVersions(
-      IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-      ITransformationConnector[] transformationConnectors,
-      IOutputConnector[] outputConnectors)
-    {
-      super(pipelineSpecificationWithVersions,transformationConnectors,outputConnectors);
-      this.pipelineSpecificationWithVersions = pipelineSpecificationWithVersions;
-    }
-
-    public int addOrReplaceDocumentWithException(String docKey, String componentHash, String documentURI, RepositoryDocument document, String newDocumentVersion, String authorityNameString, IOutputActivity finalActivity, long ingestTime)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      PipelineAddFanout entryPoint = buildAddPipeline(finalActivity,newDocumentVersion,authorityNameString,ingestTime,docKey,componentHash);
-      return entryPoint.sendDocument(documentURI,document);
-    }
-
-    public void noDocument(String docKey, String componentHash, String newDocumentVersion, String authorityNameString, IOutputActivity finalActivity, long ingestTime)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      PipelineAddFanout entryPoint = buildAddPipeline(finalActivity,newDocumentVersion,authorityNameString,ingestTime,docKey,componentHash);
-      entryPoint.noDocument();
-    }
-
-    protected PipelineAddFanout buildAddPipeline(IOutputActivity finalActivity,
-      String newDocumentVersion, String newAuthorityNameString,
-      long ingestTime, String docKey, String componentHash)
-    {
-      // Algorithm for building a pipeline:
-      // (1) We start with the set of final output connection stages, and build an entry point for each one.  That's our "current set".
-      // (2) We cycle through the "current set".  For each member, we attempt to go upstream a level.
-      // (3) Before we can build the pipeline activity class for the next upstream stage, we need to have present ALL of the children that share that
-      //   parent.  If we don't have that yet, we throw the stage back into the list.
-      // (4) We continue until there is one stage left that has no parent, and that's what we return.
-      
-      // Create the current set
-      Map<Integer,PipelineAddEntryPoint> currentSet = new HashMap<Integer,PipelineAddEntryPoint>();
-      // First, locate all the output stages, and enter them into the set
-      IPipelineSpecificationWithVersions fullSpec = pipelineSpecificationWithVersions;
-      
-      int outputCount = fullSpec.getOutputCount();
-      for (int i = 0; i < outputCount; i++)
-      {
-        int outputStage = fullSpec.getOutputStage(i);
-        
-        // Compute whether we need to reindex this record to this output or not, based on spec.
-        String oldDocumentVersion = fullSpec.getOutputDocumentVersionString(i);
-        String oldOutputVersion = fullSpec.getOutputVersionString(i);
-        String oldTransformationVersion = fullSpec.getOutputTransformationVersionString(i);
-        String oldAuthorityName = fullSpec.getAuthorityNameString(i);
-
-        // Compute the transformation version string.  Must always be computed if we're going to reindex, since we save it.
-        String newTransformationVersion = computePackedTransformationVersion(fullSpec,outputStage);
-        
-        boolean needToReindex = (oldDocumentVersion == null);
-        if (needToReindex == false)
-        {
-          // We need a way to signal that a document has no valid version string.
-          // That way is when the new document version string is empty.
-          needToReindex = (newDocumentVersion.length() == 0 ||
-            !oldDocumentVersion.equals(newDocumentVersion) ||
-            !oldOutputVersion.equals(fullSpec.getStageDescriptionString(outputStage).getVersionString()) ||
-            !oldAuthorityName.equals((newAuthorityNameString==null)?"":newAuthorityNameString));
-        }
-        if (needToReindex == false)
-        {
-          needToReindex = (!oldTransformationVersion.equals(newTransformationVersion));
-        }
-
-        int connectionIndex = fullSpec.getOutputConnectionIndex(outputStage).intValue();
-        PipelineAddEntryPoint outputStageEntryPoint = new OutputAddEntryPoint(
-          outputConnectors[connectionIndex],
-          fullSpec.getStageDescriptionString(outputStage),
-          new OutputActivitiesWrapper(finalActivity,fullSpec.getStageConnectionName(outputStage)),
-          needToReindex,
-          fullSpec.getStageConnectionName(outputStage),
-          newTransformationVersion,
-          ingestTime,
-          newDocumentVersion,
-          docKey,
-          componentHash,
-          newAuthorityNameString);
-        currentSet.put(new Integer(outputStage), outputStageEntryPoint);
-      }
-      // Cycle through the "current set"
-      while (true)
-      {
-        int parent = -1;
-        int[] siblings = null;
-        for (Integer outputStage : currentSet.keySet())
-        {
-          parent = fullSpec.getStageParent(outputStage.intValue());
-          // Look up the children
-          siblings = fullSpec.getStageChildren(parent);
-          // Are all the siblings in the current set yet?  If not, we can't proceed with this entry.
-          boolean skipToNext = false;
-          for (int sibling : siblings)
-          {
-            if (currentSet.get(new Integer(sibling)) == null)
-            {
-              skipToNext = true;
-              break;
-            }
-          }
-          if (skipToNext)
-          {
-            siblings = null;
-            continue;
-          }
-          // All siblings are present!
-          break;
-        }
-        
-        // Siblings will be set if there's a stage we can do.  If not, we're done, but this should already have been detected.
-        if (siblings == null)
-          throw new IllegalStateException("Not at root but can't progress");
-        
-        PipelineAddEntryPoint[] siblingEntryPoints = new PipelineAddEntryPoint[siblings.length];
-        for (int j = 0; j < siblings.length; j++)
-        {
-          siblingEntryPoints[j] = currentSet.remove(new Integer(siblings[j]));
-        }
-        // Wrap the entry points in a fan-out class, which has pipe connector-like methods that fire across all the connectors.
-        PipelineAddFanout pcf = new PipelineAddFanout(siblingEntryPoints,
-          (parent==-1)?null:new TransformationRecordingActivity(finalActivity,
-            fullSpec.getStageConnectionName(parent)),
-          finalActivity);
-        if (parent == -1)
-          return pcf;
-        PipelineAddEntryPoint newEntry = new PipelineAddEntryPoint(
-          transformationConnectors[fullSpec.getTransformationConnectionIndex(parent).intValue()],
-          fullSpec.getStageDescriptionString(parent),newAuthorityNameString,pcf,pcf.checkNeedToReindex());
-        currentSet.put(new Integer(parent), newEntry);
-      }
-
-    }
-
-  }
-
-  /** This class describes the entry stage of multiple siblings in a check pipeline.
-  */
-  public static class PipelineCheckFanout implements IOutputCheckActivity
-  {
-    protected final PipelineCheckEntryPoint[] entryPoints;
-    
-    public PipelineCheckFanout(PipelineCheckEntryPoint[] entryPoints)
-    {
-      this.entryPoints = entryPoints;
-    }
-    
-    @Override
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineCheckEntryPoint p : entryPoints)
-      {
-        if (p.checkDateIndexable(date))
-          return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineCheckEntryPoint p : entryPoints)
-      {
-        if (p.checkMimeTypeIndexable(mimeType))
-          return true;
-      }
-      return false;
-    }
-    
-    @Override
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineCheckEntryPoint p : entryPoints)
-      {
-        if (p.checkDocumentIndexable(localFile))
-          return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineCheckEntryPoint p : entryPoints)
-      {
-        if (p.checkLengthIndexable(length))
-          return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean checkURLIndexable(String uri)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineCheckEntryPoint p : entryPoints)
-      {
-        if (p.checkURLIndexable(uri))
-          return true;
-      }
-      return false;
-    }
-  }
-  
-  /** This class describes the entry stage of a check pipeline.
-  */
-  public static class PipelineCheckEntryPoint
-  {
-    protected final IPipelineConnector pipelineConnector;
-    protected final VersionContext pipelineDescriptionString;
-    protected final IOutputCheckActivity checkActivity;
-    
-    public PipelineCheckEntryPoint(
-      IPipelineConnector pipelineConnector,
-      VersionContext pipelineDescriptionString,
-      IOutputCheckActivity checkActivity)
-    {
-      this.pipelineConnector= pipelineConnector;
-      this.pipelineDescriptionString = pipelineDescriptionString;
-      this.checkActivity = checkActivity;
-    }
-    
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkDateIndexable(pipelineDescriptionString,date,checkActivity);
-    }
-
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkMimeTypeIndexable(pipelineDescriptionString,mimeType,checkActivity);
-    }
-    
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkDocumentIndexable(pipelineDescriptionString,localFile,checkActivity);
-    }
-    
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkLengthIndexable(pipelineDescriptionString,length,checkActivity);
-    }
-
-    public boolean checkURLIndexable(String uri)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkURLIndexable(pipelineDescriptionString,uri,checkActivity);
-    }
-    
-  }
-  
-  /** This class describes the entry stage of multiple siblings in an add pipeline.
-  */
-  public static class PipelineAddFanout implements IOutputAddActivity
-  {
-    protected final PipelineAddEntryPoint[] entryPoints;
-    protected final IOutputHistoryActivity finalHistoryActivity;
-    protected final IOutputQualifyActivity finalQualifyActivity;
-
-    public PipelineAddFanout(PipelineAddEntryPoint[] entryPoints, IOutputHistoryActivity finalHistoryActivity,
-      IOutputQualifyActivity finalQualifyActivity)
-    {
-      this.entryPoints = entryPoints;
-      this.finalHistoryActivity = finalHistoryActivity;
-      this.finalQualifyActivity = finalQualifyActivity;
-    }
-    
-    public boolean checkNeedToReindex()
-    {
-      // Look at the entry points, and make sure they're not all disabled.
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.isActive())
-          return true;
-      }
-      return false;
-    }
-    
-    @Override
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.checkDateIndexable(date))
-          return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.checkMimeTypeIndexable(mimeType))
-          return true;
-      }
-      return false;
-    }
-    
-    @Override
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.checkDocumentIndexable(localFile))
-          return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.checkLengthIndexable(length))
-          return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean checkURLIndexable(String uri)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // OR all results
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.checkURLIndexable(uri))
-          return true;
-      }
-      return false;
-    }
-    
-    /** Send a document via the pipeline to the next output connection.
-    *@param documentURI is the document's URI.
-    *@param document is the document data to be processed (handed to the output data store).
-    *@return the document status (accepted or permanently rejected); return codes are listed in IPipelineConnector.
-    *@throws IOException only if there's an IO error reading the data from the document.
-    */
-    @Override
-    public int sendDocument(String documentURI, RepositoryDocument document)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      // First, count the number of active entry points.
-      int activeCount = 0;
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.isActive())
-          activeCount++;
-      }
-      if (activeCount <= 1)
-      {
-        // No need to copy anything.
-        int rval = IPipelineConnector.DOCUMENTSTATUS_REJECTED;
-        for (PipelineAddEntryPoint p : entryPoints)
-        {
-          if (!p.isActive())
-            continue;
-          if (p.addOrReplaceDocumentWithException(documentURI,document) == IPipelineConnector.DOCUMENTSTATUS_ACCEPTED)
-            rval = IPipelineConnector.DOCUMENTSTATUS_ACCEPTED;
-        }
-        return rval;
-      }
-      else
-      {
-        // Create a RepositoryDocumentFactory, which we'll need to clean up at the end.
-        RepositoryDocumentFactory factory = new RepositoryDocumentFactory(document);
-        try
-        {
-          // If any of them accept the document, we return "accept".
-          int rval = IPipelineConnector.DOCUMENTSTATUS_REJECTED;
-          for (PipelineAddEntryPoint p : entryPoints)
-          {
-            if (!p.isActive())
-              continue;
-            if (p.addOrReplaceDocumentWithException(documentURI,factory.createDocument()) == IPipelineConnector.DOCUMENTSTATUS_ACCEPTED)
-              rval = IPipelineConnector.DOCUMENTSTATUS_ACCEPTED;
-          }
-          return rval;
-        }
-        finally
-        {
-          factory.close();
-        }
-      }
-    }
-
-    /** Send NO document via the pipeline to the next output connection.  This is equivalent
-    * to sending an empty document placeholder.
-    */
-    @Override
-    public void noDocument()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      for (PipelineAddEntryPoint p : entryPoints)
-      {
-        if (p.isActive())
-        {
-          // Invoke the addEntryPoint method for handling "noDocument"
-          p.noDocument();
-        }
-      }
-    }
-
-    /** Qualify an access token appropriately, to match access tokens as returned by mod_aa.  This method
-    * includes the authority name with the access token, if any, so that each authority may establish its own token space.
-    *@param authorityNameString is the name of the authority to use to qualify the access token.
-    *@param accessToken is the raw, repository access token.
-    *@return the properly qualified access token.
-    */
-    @Override
-    public String qualifyAccessToken(String authorityNameString, String accessToken)
-      throws ManifoldCFException
-    {
-      // This functionality does not need to be staged; we just want to vector through to the final stage directly.
-      return finalQualifyActivity.qualifyAccessToken(authorityNameString,accessToken);
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    @Override
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      // Each stage of the pipeline uses a specific activity for recording history, but it's not fundamentally
-      // pipelined
-      finalHistoryActivity.recordActivity(startTime,activityType,dataSize,entityURI,resultCode,resultDescription);
-    }
-  }
-
-  /** This class describes the entry stage of an add pipeline.
-  */
-  public static class PipelineAddEntryPoint
-  {
-    protected final IPipelineConnector pipelineConnector;
-    protected final VersionContext pipelineDescriptionString;
-    protected final String authorityNameString;
-    protected final IOutputAddActivity addActivity;
-    protected final boolean isActive;
-    
-    public PipelineAddEntryPoint(IPipelineConnector pipelineConnector,
-      VersionContext pipelineDescriptionString,
-      String authorityNameString,
-      IOutputAddActivity addActivity,
-      boolean isActive)
-    {
-      this.pipelineConnector = pipelineConnector;
-      this.pipelineDescriptionString = pipelineDescriptionString;
-      this.authorityNameString = authorityNameString;
-      this.addActivity = addActivity;
-      this.isActive = isActive;
-    }
-    
-    public boolean isActive()
-    {
-      return isActive;
-    }
-
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkDateIndexable(pipelineDescriptionString,date,addActivity);
-    }
-    
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkMimeTypeIndexable(pipelineDescriptionString,mimeType,addActivity);
-    }
-    
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkDocumentIndexable(pipelineDescriptionString,localFile,addActivity);
-    }
-    
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkLengthIndexable(pipelineDescriptionString,length,addActivity);
-    }
-
-    public boolean checkURLIndexable(String uri)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return pipelineConnector.checkURLIndexable(pipelineDescriptionString,uri,addActivity);
-    }
-
-    public int addOrReplaceDocumentWithException(String documentURI, RepositoryDocument document)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      // If the transformation connector doesn't do what it should, compensate!
-      MonitoredAddActivityWrapper wrapper = new MonitoredAddActivityWrapper(addActivity);
-      int rval = pipelineConnector.addOrReplaceDocumentWithException(
-        documentURI,pipelineDescriptionString,
-        document,authorityNameString,wrapper);
-      // The wrapper detects activity by the connector, so if we don't see either sendDocument() or
-      // noDocument(), we issue noDocument() ourselves.  If the connector was an output connector,
-      // this will wind up being a no-op, but otherwise it will guarantee that recording takes place.
-      if (!wrapper.wasDocumentActedUpon())
-        addActivity.noDocument();
-      return rval;
-    }
-    
-    public void noDocument()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // Call the addActivity method for handling no document
-      addActivity.noDocument();
-    }
-  }
-  
-  public class OutputAddEntryPoint extends PipelineAddEntryPoint
-  {
-    protected final IOutputConnector outputConnector;
-    protected final String outputConnectionName;
-    protected final String transformationVersion;
-    protected final long ingestTime;
-    protected final String documentVersion;
-    protected final String docKey;
-    protected final String componentHash;
-    protected final IOutputActivity activity;
-    
-    public OutputAddEntryPoint(IOutputConnector outputConnector,
-      VersionContext outputDescriptionString,
-      IOutputActivity activity,
-      boolean isActive,
-      String outputConnectionName,
-      String transformationVersion,
-      long ingestTime,
-      String documentVersion,
-      String docKey,
-      String componentHash,
-      String authorityNameString)
-    {
-      super(outputConnector,outputDescriptionString,authorityNameString,activity,isActive);
-      this.outputConnector = outputConnector;
-      this.outputConnectionName = outputConnectionName;
-      this.transformationVersion = transformationVersion;
-      this.ingestTime = ingestTime;
-      this.documentVersion = documentVersion;
-      this.docKey = docKey;
-      this.componentHash = componentHash;
-      this.activity = activity;
-    }
-    
-    @Override
-    public void noDocument()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      try
-      {
-        addOrReplaceDocumentWithException(null,null);
-      }
-      catch (IOException e)
-      {
-        throw new RuntimeException("Unexpected IOException: "+e.getMessage(),e);
-      }
-    }
-    
-    @Override
-    public int addOrReplaceDocumentWithException(String documentURI, RepositoryDocument document)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      // No transactions; not safe because post may take too much time
-
-      // First, calculate a document uri hash value
-      String documentURIHash = null;
-      if (documentURI != null)
-        documentURIHash = ManifoldCF.hash(documentURI);
-
-      String oldURI = null;
-      String oldURIHash = null;
-      String oldOutputVersion = null;
-
-      // Repeat if needed
-      while (true)
-      {
-        long sleepAmt = 0L;
-        try
-        {
-          // See what uri was used before for this doc, if any
-          ArrayList list = new ArrayList();
-          String query = buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(docKeyField,docKey),
-            new UnitaryClause(outputConnNameField,outputConnectionName),
-            (componentHash == null || componentHash.length() == 0)?new NullCheckClause(componentHashField,true):new UnitaryClause(componentHashField,componentHash)});
-            
-          IResultSet set = performQuery("SELECT "+docURIField+","+uriHashField+","+lastOutputVersionField+" FROM "+getTableName()+
-            " WHERE "+query,list,null,null);
-
-          if (set.getRowCount() > 0)
-          {
-            IResultRow row = set.getRow(0);
-            oldURI = (String)row.getValue(docURIField);
-            oldURIHash = (String)row.getValue(uriHashField);
-            oldOutputVersion = (String)row.getValue(lastOutputVersionField);
-          }
-          
-          break;
-        }
-        catch (ManifoldCFException e)
-        {
-          // Look for deadlock and retry if so
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted select looking for status: "+e.getMessage());
-            sleepAmt = getSleepAmt();
-            continue;
-          }
-          throw e;
-        }
-        finally
-        {
-          sleepFor(sleepAmt);
-        }
-      }
-
-      // If uri hashes collide, then we must be sure to eliminate only the *correct* records from the table, or we will leave
-      // dangling documents around.  So, all uri searches and comparisons MUST compare the actual uri as well.
-
-      // But, since we need to insure that any given URI is only worked on by one thread at a time, use critical sections
-      // to block the rare case that multiple threads try to work on the same URI.
-      
-      String[] lockArray = computeLockArray(documentURIHash,oldURIHash,outputConnectionName);
-      lockManager.enterLocks(null,null,lockArray);
-      try
-      {
-
-        ArrayList list = new ArrayList();
-        
-        if (oldURI != null && (documentURI == null || !oldURI.equals(documentURI)))
-        {
-          // Delete all records from the database that match the old URI, except for THIS record.
-          list.clear();
-          String query = buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(uriHashField,"=",oldURIHash),
-            new UnitaryClause(outputConnNameField,outputConnectionName)});
-          list.add(docKey);
-          performDelete("WHERE "+query+" AND "+docKeyField+"!=?",list,null);
-          outputConnector.removeDocument(oldURI,oldOutputVersion,activity);
-        }
-
-        if (documentURI != null)
-        {
-          // Get rid of all records that match the NEW uri, except for this record.
-          list.clear();
-          String query = buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(uriHashField,"=",documentURIHash),
-            new UnitaryClause(outputConnNameField,outputConnectionName)});
-          list.add(docKey);
-          performDelete("WHERE "+query+" AND "+ docKeyField+"!=?",list,null);
-
-          // Now, we know we are ready for the ingest.
-        
-          // Here are the cases:
-          // 1) There was a service interruption before the upload started.
-          // (In that case, we don't need to log anything, just reschedule).
-          // 2) There was a service interruption after the document was transmitted.
-          // (In that case, we should presume that the document was ingested, but
-          //  reschedule another import anyway.)
-          // 3) Everything went OK
-          // (need to log the ingestion.)
-          // 4) Everything went OK, but we were told we have an illegal document.
-          // (We note the ingestion because if we don't we will be forced to repeat ourselves.
-          //  In theory, document doesn't need to be deleted, but there is no way to signal
-          //  that at the moment.)
-
-          // Note an ingestion before we actually try it.
-          // This is a marker that says "something is there"; it has an empty version, which indicates
-          // that we don't know anything about it.  That means it will be reingested when the
-          // next version comes along, and will be deleted if called for also.
-          noteDocumentIngest(outputConnectionName,docKey,componentHash,null,null,null,null,ingestTime,documentURI,documentURIHash);
-          int result = super.addOrReplaceDocumentWithException(documentURI, document);
-          noteDocumentIngest(outputConnectionName,docKey,componentHash,documentVersion,transformationVersion,pipelineDescriptionString.getVersionString(),authorityNameString,ingestTime,documentURI,documentURIHash);
-          return result;
-        }
-
-        // If we get here, it means we are noting that the document was examined, but that no change was required.  This is signaled
-        // to noteDocumentIngest by having the null documentURI.
-        noteDocumentIngest(outputConnectionName,docKey,componentHash,documentVersion,transformationVersion,pipelineDescriptionString.getVersionString(),authorityNameString,ingestTime,null,null);
-        return IPipelineConnector.DOCUMENTSTATUS_ACCEPTED;
-      }
-      finally
-      {
-        lockManager.leaveLocks(null,null,lockArray);
-      }
-    }
-  }
-
-  protected static String[] computeLockArray(String documentURIHash, String oldURIHash, String outputConnectionName)
-  {
-    int uriCount = 0;
-    if (documentURIHash != null)
-      uriCount++;
-    if (oldURIHash != null && (documentURIHash == null || !documentURIHash.equals(oldURIHash)))
-      uriCount++;
-    String[] lockArray = new String[uriCount];
-    uriCount = 0;
-    if (documentURIHash != null)
-      lockArray[uriCount++] = createURILockName(outputConnectionName,documentURIHash);
-    if (oldURIHash != null && (documentURIHash == null || !documentURIHash.equals(oldURIHash)))
-      lockArray[uriCount++] = createURILockName(outputConnectionName,oldURIHash);
-    return lockArray;
-  }
-  
-  /** This class passes everything through, and monitors what happens so that the
-  * framework can compensate for any transformation connector coding errors.
-  */
-  protected static class MonitoredAddActivityWrapper implements IOutputAddActivity
-  {
-    protected final IOutputAddActivity activities;
-    
-    protected boolean documentProcessed = false;
-    
-    public MonitoredAddActivityWrapper(IOutputAddActivity activities)
-    {
-      this.activities = activities;
-    }
-    
-    public boolean wasDocumentActedUpon()
-    {
-      return documentProcessed;
-    }
-
-    /** Send a document via the pipeline to the next output connection.
-    *@param documentURI is the document's URI.
-    *@param document is the document data to be processed (handed to the output data store).
-    *@return the document status (accepted or permanently rejected); return codes are listed in IPipelineConnector.
-    *@throws IOException only if there's an IO error reading the data from the document.
-    */
-    @Override
-    public int sendDocument(String documentURI, RepositoryDocument document)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      if (documentProcessed)
-        throw new IllegalStateException("Document cannot have multiple dispositions");
-      int rval = activities.sendDocument(documentURI,document);
-      documentProcessed = true;
-      return rval;
-    }
-
-    /** Send NO document via the pipeline to the next output connection.  This is equivalent
-    * to sending an empty document placeholder.
-    */
-    @Override
-    public void noDocument()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (documentProcessed)
-        throw new IllegalStateException("Document cannot have multiple dispositions");
-      activities.noDocument();
-      documentProcessed = true;
-    }
-
-    /** Qualify an access token appropriately, to match access tokens as returned by mod_aa.  This method
-    * includes the authority name with the access token, if any, so that each authority may establish its own token space.
-    *@param authorityNameString is the name of the authority to use to qualify the access token.
-    *@param accessToken is the raw, repository access token.
-    *@return the properly qualified access token.
-    */
-    @Override
-    public String qualifyAccessToken(String authorityNameString, String accessToken)
-      throws ManifoldCFException
-    {
-      return activities.qualifyAccessToken(authorityNameString,accessToken);
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    @Override
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      activities.recordActivity(startTime,activityType,dataSize,entityURI,resultCode,resultDescription);
-    }
-
-    /** Detect if a date is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-    * in the first place.
-    *@param date is the date of the document.
-    *@return true if the document described by the date can be accepted by the downstream connection.
-    */
-    @Override
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return activities.checkDateIndexable(date);
-    }
-
-    /** Detect if a mime type is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-    * in the first place.
-    *@param mimeType is the mime type of the document.
-    *@return true if the mime type can be accepted by the downstream connection.
-    */
-    @Override
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return activities.checkMimeTypeIndexable(mimeType);
-    }
-
-    /** Pre-determine whether a document (passed here as a File object) is acceptable downstream.  This method is
-    * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-    * search engines that only handle a small set of accepted file types.
-    *@param localFile is the local file to check.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return activities.checkDocumentIndexable(localFile);
-    }
-
-    /** Pre-determine whether a document's length is acceptable downstream.  This method is used
-    * to determine whether to fetch a document in the first place.
-    *@param length is the length of the document.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return activities.checkLengthIndexable(length);
-    }
-
-    /** Pre-determine whether a document's URL is acceptable downstream.  This method is used
-    * to help filter out documents that cannot be indexed in advance.
-    *@param url is the URL of the document.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkURLIndexable(String url)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return activities.checkURLIndexable(url);
-    }
-
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/RepositoryDocumentFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/RepositoryDocumentFactory.java
deleted file mode 100644
index adc39fe..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/RepositoryDocumentFactory.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.incrementalingest;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.Logging;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-
-/** This class accepts a RepositoryDocument in its constructor, and then
-* allows multiple copies to me made, as part of a split in the pipeline.
-* It must be closed in order to release all temporary resources.
-*/
-public class RepositoryDocumentFactory
-{
-  
-  // The objects we need to track are:
-  // (1) The binary stream
-  // (2) All metadata values that are Readers
-  // Everything else can be pulled out of the original RepositoryDocument
-  
-  protected final RepositoryDocument original;
-
-  // The binary stream file and stream (if any)
-  protected BinaryInput binaryTracker;
-  
-  // Readers (organized by metadata)
-  protected final Map<String,CharacterInput[]> metadataReaders = new HashMap<String,CharacterInput[]>();
-  
-  /** Constructor.
-  * Pass a RepositoryDocument.  This constructor reads all streams and stores them in
-  * a temporary local location. 
-  * If there is an error reading the streams, an IOException will be thrown.  Otherwise,
-  * a ManifoldCFException will be thrown instead.
-  *@param document is the repository document to read.
-  */
-  public RepositoryDocumentFactory(RepositoryDocument document)
-    throws ManifoldCFException, IOException
-  {
-    this.original = document;
-    try
-    {
-      this.binaryTracker = new TempFileInput(document.getBinaryStream());
-      // Copy all reader streams
-      Iterator<String> iter = document.getFields();
-      while (iter.hasNext())
-      {
-        String fieldName = iter.next();
-        Object[] objects = document.getField(fieldName);
-        if (objects instanceof Reader[])
-        {
-          CharacterInput[] newValues = new CharacterInput[objects.length];
-          metadataReaders.put(fieldName,newValues);
-          // Populate newValues
-          for (int i = 0; i < newValues.length; i++)
-          {
-            newValues[i] = new TempFileCharacterInput((Reader)objects[i]);
-          }
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Clean up everything we've done so far.
-      if (this.binaryTracker != null)
-        this.binaryTracker.discard();
-      for (String key : metadataReaders.keySet())
-      {
-        CharacterInput[] rt = metadataReaders.get(key);
-        for (CharacterInput r : rt)
-        {
-          if (r != null)
-            r.discard();
-        }
-      }
-      if (e instanceof IOException)
-        throw (IOException)e;
-      else if (e instanceof RuntimeException)
-        throw (RuntimeException)e;
-      else if (e instanceof Error)
-        throw (Error)e;
-      else
-        throw new RuntimeException("Unknown exception type: "+e.getClass().getName()+": "+e.getMessage(),e);
-    }
-  }
-  
-  /** Create a new RepositoryDocument object from the saved local resources.
-  * As a side effect, this method also releases any resources held on behalf of the previously
-  * created RepositoryDocument.
-  *@return a repository document object.
-  */
-  public RepositoryDocument createDocument()
-    throws ManifoldCFException
-  {
-    RepositoryDocument rd = new RepositoryDocument();
-    
-    // Copy scalar values
-    rd.setCreatedDate(original.getCreatedDate());
-    rd.setModifiedDate(original.getModifiedDate());
-    rd.setIndexingDate(original.getIndexingDate());
-    rd.setMimeType(original.getMimeType());
-    rd.setFileName(original.getFileName());
-    
-    Iterator<String> securityTypes = original.securityTypesIterator();
-    while (securityTypes.hasNext())
-    {
-      String securityType = securityTypes.next();
-      rd.setSecurityACL(securityType,original.getSecurityACL(securityType));
-      rd.setSecurityDenyACL(securityType,original.getSecurityDenyACL(securityType));
-    }
-    
-    // Copy binary
-    binaryTracker.doneWithStream();
-    rd.setBinary(binaryTracker.getStream(),original.getBinaryLength());
-    // Copy metadata fields (including minting new Readers where needed)
-    Iterator<String> iter = original.getFields();
-    while (iter.hasNext())
-    {
-      String fieldName = iter.next();
-      Object[] objects = original.getField(fieldName);
-      if (objects instanceof Reader[])
-      {
-        CharacterInput[] rts = metadataReaders.get(fieldName);
-        Reader[] newReaders = new Reader[rts.length];
-        for (int i = 0; i < rts.length; i++)
-        {
-          rts[i].doneWithStream();
-          newReaders[i] = rts[i].getStream();
-        }
-        rd.addField(fieldName,newReaders);
-      }
-      else if (objects instanceof Date[])
-      {
-        rd.addField(fieldName,(Date[])objects);
-      }
-      else if (objects instanceof String[])
-      {
-        rd.addField(fieldName,(String[])objects);
-      }
-      else
-        throw new RuntimeException("Unknown kind of metadata: "+objects.getClass().getName());
-    }
-
-    return rd;
-  }
-  
-  /** Close this object and release its resources.
-  */
-  public void close()
-    throws ManifoldCFException
-  {
-    binaryTracker.discard();
-    for (String key : metadataReaders.keySet())
-    {
-      CharacterInput[] rt = metadataReaders.get(key);
-      for (CharacterInput r : rt)
-      {
-        r.discard();
-      }
-    }
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/AgentFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/AgentFactory.java
deleted file mode 100644
index b34454b..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/AgentFactory.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id: AgentFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.lang.reflect.*;
-
-/** This is the agent class factory.
-*/
-public class AgentFactory
-{
-  public static final String _rcsid = "@(#)$Id: AgentFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private AgentFactory()
-  {
-  }
-
-  /** Make an agent, given a class name.
-  *@param tc is the thread context.
-  *@param className is the agent class name.
-  *@return the agent.
-  */
-  public static IAgent make(String className)
-    throws ManifoldCFException
-  {
-    try
-    {
-      Class theClass = Class.forName(className);
-      Class[] argumentClasses = new Class[0];
-      // Look for a constructor
-      Constructor c = theClass.getConstructor(argumentClasses);
-      Object[] arguments = new Object[0];
-      Object o = c.newInstance(arguments);
-      if (!(o instanceof IAgent))
-        throw new ManifoldCFException("Class '"+className+"' does not implement IAgent.");
-      return (IAgent)o;
-    }
-    catch (InvocationTargetException e)
-    {
-      Throwable z = e.getTargetException();
-      if (z instanceof Error)
-        throw (Error)z;
-      else
-        throw (ManifoldCFException)z;
-    }
-    catch (ClassNotFoundException e)
-    {
-      throw new ManifoldCFException("No class implementing IAgent called '"+
-        className+"'.",
-        e);
-    }
-    catch (NoSuchMethodException e)
-    {
-      throw new ManifoldCFException("No appropriate constructor for IAgent implementation '"+
-        className+"'.  Need xxx().",
-        e);
-    }
-    catch (SecurityException e)
-    {
-      throw new ManifoldCFException("Protected constructor for IAgent implementation '"+className+"'",
-        e);
-    }
-    catch (IllegalAccessException e)
-    {
-      throw new ManifoldCFException("Unavailable constructor for IAgent implementation '"+className+"'",
-        e);
-    }
-    catch (IllegalArgumentException e)
-    {
-      throw new ManifoldCFException("Shouldn't happen!!!",e);
-    }
-    catch (InstantiationException e)
-    {
-      throw new ManifoldCFException("InstantiationException for IAgent implementation '"+className+"'",
-        e);
-    }
-    catch (ExceptionInInitializerError e)
-    {
-      throw new ManifoldCFException("ExceptionInInitializerError for IAgent implementation '"+className+"'",
-        e);
-    }
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/AgentManagerFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/AgentManagerFactory.java
deleted file mode 100644
index b550ed2..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/AgentManagerFactory.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/* $Id: AgentManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/** Agent manager factory class.
-*/
-public class AgentManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: AgentManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final static String agentManager = "_AgentManager_";
-
-  private AgentManagerFactory()
-  {
-  }
-
-  /** Make an agent manager instance.
-  *@param threadContext is the thread context.
-  *@return the manager.
-  */
-  public static IAgentManager make(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Object o = threadContext.get(agentManager);
-    if (o == null || !(o instanceof IAgentManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.agents.agentmanager.AgentManager(threadContext,database);
-      threadContext.save(agentManager,o);
-    }
-    return (IAgentManager)o;
-  }
-
-  /** Request permission from all registered agents to delete an output connection.
-  *@param threadContext is the thread context.
-  *@param connName is the name of the output connection.
-  *@return true if the connection is in use, false otherwise.
-  */
-  public static boolean isOutputConnectionInUse(IThreadContext threadContext, String connName)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      if (theAgents[i++].isOutputConnectionInUse(threadContext, connName))
-        return true;
-    }
-    return false;
-  }
-
-  /**  Note to all registered agents the deregistration of an output connector used by the specified connections.
-  * This method will be called when the connector is deregistered.
-  *@param threadContext is the thread context.
-  *@param connectionNames is the set of connection names.
-  */
-  public static void noteOutputConnectorDeregistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      theAgents[i++].noteOutputConnectorDeregistration(threadContext, connectionNames);
-    }
-  }
-
-  /** Note to all registered agents the registration of an output connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param threadContext is the thread context.
-  *@param connectionNames is the set of connection names.
-  */
-  public static void noteOutputConnectorRegistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      theAgents[i++].noteOutputConnectorRegistration(threadContext, connectionNames);
-    }
-  }
-
-  /** Note to all registered agents the change of configuration of an output connection.
-  * This method will be called when the connection's xml is modified.
-  *@param threadContext is the thread context.
-  *@param connectionName is the connection name.
-  */
-  public static void noteOutputConnectionChange(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      theAgents[i++].noteOutputConnectionChange(threadContext, connectionName);
-    }
-  }
-
-    /** Request permission from all registered agents to delete a transformation connection.
-  *@param threadContext is the thread context.
-  *@param connName is the name of the output connection.
-  *@return true if the connection is in use, false otherwise.
-  */
-  public static boolean isTransformationConnectionInUse(IThreadContext threadContext, String connName)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      if (theAgents[i++].isTransformationConnectionInUse(threadContext, connName))
-        return true;
-    }
-    return false;
-  }
-
-  /**  Note to all registered agents the deregistration of a transformation connector used by the specified connections.
-  * This method will be called when the connector is deregistered.
-  *@param threadContext is the thread context.
-  *@param connectionNames is the set of connection names.
-  */
-  public static void noteTransformationConnectorDeregistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      theAgents[i++].noteTransformationConnectorDeregistration(threadContext, connectionNames);
-    }
-  }
-
-  /** Note to all registered agents the registration of a transformation connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param threadContext is the thread context.
-  *@param connectionNames is the set of connection names.
-  */
-  public static void noteTransformationConnectorRegistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      theAgents[i++].noteTransformationConnectorRegistration(threadContext, connectionNames);
-    }
-  }
-
-  /** Note to all registered agents the change of configuration of a transformation connection.
-  * This method will be called when the connection's xml is modified.
-  *@param threadContext is the thread context.
-  *@param connectionName is the connection name.
-  */
-  public static void noteTransformationConnectionChange(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    // Instantiate the list of IAgent objects
-    IAgent[] theAgents = instantiateAllAgents(threadContext);
-    int i = 0;
-    while (i < theAgents.length)
-    {
-      theAgents[i++].noteTransformationConnectionChange(threadContext, connectionName);
-    }
-  }
-
-  /** Instantiate the complete set of IAgent objects.
-  *@param threadContext is the thread context.
-  *@return the array of such objects.
-  */
-  public static IAgent[] instantiateAllAgents(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    IAgentManager manager = make(threadContext);
-    String[] allAgents = manager.getAllAgents();
-    IAgent[] rval = new IAgent[allAgents.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      rval[i] = AgentFactory.make(allAgents[i]);
-      i++;
-    }
-    return rval;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/CacheKeyFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/CacheKeyFactory.java
deleted file mode 100644
index 958ffad..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/CacheKeyFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-/** This class just represents a central place where cache keys are assembled.
-* All methods are static.
-*/
-public class CacheKeyFactory extends org.apache.manifoldcf.core.interfaces.CacheKeyFactory
-{
-  public static final String _rcsid = "@(#)$Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected CacheKeyFactory()
-  {
-  }
-
-  /** Construct a key which represents the general list of output connectors.
-  *@return the cache key.
-  */
-  public static String makeOutputConnectionsKey()
-  {
-    return "OUTPUTCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual output connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  public static String makeOutputConnectionKey(String connectionName)
-  {
-    return "OUTPUTCONNECTION_"+connectionName;
-  }
-
-  /** Construct a key which represents the general list of transformation connectors.
-  *@return the cache key.
-  */
-  public static String makeTransformationConnectionsKey()
-  {
-    return "TRANSCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual transformation connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  public static String makeTransformationConnectionKey(String connectionName)
-  {
-    return "TRANSCONNECTION_"+connectionName;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/DocumentIngestStatus.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/DocumentIngestStatus.java
deleted file mode 100644
index 6f665a9..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/DocumentIngestStatus.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id: DocumentIngestStatus.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This object contains the complete status for a document, specifically:
-* - version string
-* - output version string
-* - authority name
-* - parameter version string
-*/
-public class DocumentIngestStatus
-{
-  public static final String _rcsid = "@(#)$Id: DocumentIngestStatus.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final String documentVersionString;
-  protected final String transformationVersionString;
-  protected final String outputVersionString;
-  protected final String documentAuthorityNameString;
-
-  /** Constructor */
-  public DocumentIngestStatus(
-    String documentVersionString,
-    String transformationVersionString, String outputVersionString,
-    String documentAuthorityNameString)
-  {
-    // Looked-up information
-    this.documentVersionString = documentVersionString;
-    this.transformationVersionString = transformationVersionString;
-    this.outputVersionString = outputVersionString;
-    this.documentAuthorityNameString = documentAuthorityNameString;
-  }
-
-  /** Get the document version */
-  public String getDocumentVersion()
-  {
-    return documentVersionString;
-  }
-
-  /** Get the transformation version strings */
-  public String getTransformationVersion()
-  {
-    return transformationVersionString;
-  }
-  
-  /** Get the output version */
-  public String getOutputVersion()
-  {
-    return outputVersionString;
-  }
-
-  /** Get the document authority name string */
-  public String getDocumentAuthorityNameString()
-  {
-    return documentAuthorityNameString;
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/DocumentIngestStatusSet.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/DocumentIngestStatusSet.java
deleted file mode 100644
index bf50771..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/DocumentIngestStatusSet.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This object contains statuses for the primary document and all component documents.
-*/
-public class DocumentIngestStatusSet
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected DocumentIngestStatus primary = null;
-  protected final Map<String,DocumentIngestStatus> components = new HashMap<String,DocumentIngestStatus>();
-  
-  /** Constructor */
-  public DocumentIngestStatusSet()
-  {
-  }
-  
-  /** Add document status.
-  *@param componentHash is the component identifier hash, or null.
-  *@param status is the document ingest status.
-  */
-  public void addDocumentStatus(String componentHash, DocumentIngestStatus status)
-  {
-    if (componentHash == null)
-      primary = status;
-    else
-      components.put(componentHash,status);
-  }
-  
-  /** Get primary status.
-  *@return the primary status.
-  */
-  public DocumentIngestStatus getPrimary()
-  {
-    return primary;
-  }
-  
-  /** Get component status.
-  *@param componentHash is the component identifier hash, or null.
-  *@return the component status.
-  */
-  public DocumentIngestStatus getComponent(String componentHash)
-  {
-    if (componentHash == null)
-      return primary;
-    return components.get(componentHash);
-  }
-  
-  /** Iterate over components.
-  *@return an iterator over component hashes.
-  */
-  public Iterator<String> componentIterator()
-  {
-    return components.keySet().iterator();
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IAgent.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IAgent.java
deleted file mode 100644
index b1d0a60..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IAgent.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/* $Id: IAgent.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the external functionality of an agent class.  Agents are all poked at
-* start-up time; they run independently until the JVM is shut down.
-* All agent classes are expected to support the following constructor:
-*
-* xxx() throws ManifoldCFException
-*
-* Agent classes are furthermore expected to be cross-thread, but not necessarily thread-safe
-* in that a given IAgent instance is meant to be used by only one thread at a time.  It is
-* furthermore safe to keep stateful data in the IAgent instance object pertaining to the
-* running state of the system.  That is, an instance of IAgent used to start the agent will be
-* the same one stopAgent() is called with.
-*/
-public interface IAgent
-{
-  public static final String _rcsid = "@(#)$Id: IAgent.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Initialize agent environment.
-  * This is called before any of the other operations are called, and is meant to insure that
-  * the environment is properly initialized.
-  */
-  public void initialize(IThreadContext threadContext)
-    throws ManifoldCFException;
-  
-  /** Tear down agent environment.
-  * This is called after all the other operations are completed, and is meant to allow
-  * environment resources to be freed.
-  */
-  public void cleanUp(IThreadContext threadContext)
-    throws ManifoldCFException;
-  
-  /** Install agent.  This usually installs the agent's database tables etc.
-  */
-  public void install(IThreadContext threadContext)
-    throws ManifoldCFException;
-
-  /** Uninstall agent.  This must clean up everything the agent is responsible for.
-  */
-  public void deinstall(IThreadContext threadContext)
-    throws ManifoldCFException;
-
-  /** Called ONLY when no other active services of this kind are running.  Meant to be
-  * used after the cluster has been down for an indeterminate period of time.
-  */
-  public void clusterInit(IThreadContext threadContext)
-    throws ManifoldCFException;
-    
-  /** Cleanup after ALL agents processes.
-  * Call this method to clean up dangling persistent state when a cluster is just starting
-  * to come up.  This method CANNOT be called when there are any active agents
-  * processes at all.
-  *@param processID is the current process ID.
-  */
-  public void cleanUpAllAgentData(IThreadContext threadContext, String currentProcessID)
-    throws ManifoldCFException;
-  
-  /** Cleanup after agents process.
-  * Call this method to clean up dangling persistent state after agent has been stopped.
-  * This method CANNOT be called when the agent is active, but it can
-  * be called at any time and by any process in order to guarantee that a terminated
-  * agent does not block other agents from completing their tasks.
-  *@param currentProcessID is the current process ID.
-  *@param cleanupProcessID is the process ID of the agent to clean up after.
-  */
-  public void cleanUpAgentData(IThreadContext threadContext, String currentProcessID, String cleanupProcessID)
-    throws ManifoldCFException;
-
-  /** Start the agent.  This method should spin up the agent threads, and
-  * then return.
-  *@param processID is the process ID to start up an agent for.
-  */
-  public void startAgent(IThreadContext threadContext, String processID)
-    throws ManifoldCFException;
-
-  /** Stop the agent.  This should shut down the agent threads.
-  */
-  public void stopAgent(IThreadContext threadContext)
-    throws ManifoldCFException;
-
-  /** Request permission from agent to delete an output connection.
-  *@param connName is the name of the output connection.
-  *@return true if the connection is in use, false otherwise.
-  */
-  public boolean isOutputConnectionInUse(IThreadContext threadContext, String connName)
-    throws ManifoldCFException;
-
-  /** Note the deregistration of a set of output connections.
-  *@param connectionNames are the names of the connections being deregistered.
-  */
-  public void noteOutputConnectorDeregistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note the registration of a set of output connections.
-  *@param connectionNames are the names of the connections being registered.
-  */
-  public void noteOutputConnectorRegistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note a change in configuration for an output connection.
-  *@param connectionName is the name of the connection being changed.
-  */
-  public void noteOutputConnectionChange(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException;
-
-  /** Request permission from agent to delete a transformation connection.
-  *@param connName is the name of the transformation connection.
-  *@return true if the connection is in use, false otherwise.
-  */
-  public boolean isTransformationConnectionInUse(IThreadContext threadContext, String connName)
-    throws ManifoldCFException;
-
-  /** Note the deregistration of a set of transformation connections.
-  *@param connectionNames are the names of the connections being deregistered.
-  */
-  public void noteTransformationConnectorDeregistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note the registration of a set of transformation connections.
-  *@param connectionNames are the names of the connections being registered.
-  */
-  public void noteTransformationConnectorRegistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note a change in configuration for a transformation connection.
-  *@param connectionName is the name of the connection being changed.
-  */
-  public void noteTransformationConnectionChange(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IAgentManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IAgentManager.java
deleted file mode 100644
index 2fb1662..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IAgentManager.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: IAgentManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the management of the agent registry.
-*/
-public interface IAgentManager
-{
-  public static final String _rcsid = "@(#)$Id: IAgentManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  Also uninstalls all remaining agents.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register an agent.
-  *@param className is the class.
-  */
-  public void registerAgent(String className)
-    throws ManifoldCFException;
-
-  /** Unregister an agent.
-  *@param className is the class to unregister.
-  */
-  public void unregisterAgent(String className)
-    throws ManifoldCFException;
-
-  /** Remove an agent.
-  * Use this when the agent cannot be invoked.  The agent becomes unavailable,
-  * but its schema is not cleaned up.
-  *@param className is the class to remove.
-  */
-  public void removeAgent(String className)
-    throws ManifoldCFException;
-
-  /** Get a list of all registered agent class names.
-  *@return the classnames in an array.
-  */
-  public String[] getAllAgents()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java
deleted file mode 100644
index 0191ad7..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/* $Id: IIncrementalIngester.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** This interface describes the incremental ingestion API.
-* SOME NOTES:
-* The expected client flow for this API is to:
-*
-* 1) Use the API to fetch a document's version.
-* 2) Base a decision whether to ingest based on that version.
-* 3) If the decision to ingest occurs, then the ingest method in the API is
-*    called.
-*
-* The module described by this interface is responsible for keeping track of what has been sent where, and also the corresponding version of
-* each document so indexed.  The space over which this takes place is defined by the individual output connection - that is, the output connection
-* seems to "remember" what documents were handed to it.
-*
-* A secondary purpose of this module is to provide a mapping between the key by which a document is described internally (by an
-* identifier hash, plus the name of an identifier space), and the way the document is identified in the output space (by the name of an
-* output connection, plus a URI which is considered local to that output connection space).
-*
-*/
-public interface IIncrementalIngester
-{
-  public static final String _rcsid = "@(#)$Id: IIncrementalIngester.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Install the incremental ingestion manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the incremental ingestion manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Flush all knowledge of what was ingested before.
-  */
-  public void clearAll()
-    throws ManifoldCFException;
-
-
-  /** From a pipeline specification, get the name of the output connection that will be indexed last
-  * in the pipeline.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@return the last indexed output connection name.
-  */
-  public String getLastIndexedOutputConnectionName(IPipelineSpecificationBasic pipelineSpecificationBasic);
-
-  /** From a pipeline specification, get the name of the output connection that will be indexed first
-  * in the pipeline.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@return the first indexed output connection name.
-  */
-  public String getFirstIndexedOutputConnectionName(IPipelineSpecificationBasic pipelineSpecificationBasic);
-
-  /** Get an output version string for a document.
-  *@param outputConnection is the output connection associated with this action.
-  *@param spec is the output specification.
-  *@return the description string.
-  */
-  public VersionContext getOutputDescription(IOutputConnection outputConnection, Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get transformation version string for a document.
-  *@param transformationConnection is the transformation connection associated with this action.
-  *@param spec is the transformation specification.
-  *@return the description string.
-  */
-  public VersionContext getTransformationDescription(ITransformationConnection transformationConnection, Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Check if a document date is indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param date is the date to check
-  *@param activity are the activities available to this method.
-  *@return true if the document with that date is indexable.
-  */
-  public boolean checkDateIndexable(
-    IPipelineSpecification pipelineSpecification,
-    Date date,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Check if a mime type is indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param mimeType is the mime type to check.
-  *@param activity are the activities available to this method.
-  *@return true if the mimeType is indexable.
-  */
-  public boolean checkMimeTypeIndexable(
-    IPipelineSpecification pipelineSpecification,
-    String mimeType,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Check if a file is indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param localFile is the local file to check.
-  *@param activity are the activities available to this method.
-  *@return true if the local file is indexable.
-  */
-  public boolean checkDocumentIndexable(
-    IPipelineSpecification pipelineSpecification,
-    File localFile,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that are too long to be indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param length is the length of the document.
-  *@param activity are the activities available to this method.
-  *@return true if the file is indexable.
-  */
-  public boolean checkLengthIndexable(
-    IPipelineSpecification pipelineSpecification,
-    long length,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's URL is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that not indexable.
-  *@param pipelineSpecification is the IPipelineSpecification object for this pipeline.
-  *@param url is the url of the document.
-  *@param activity are the activities available to this method.
-  *@return true if the file is indexable.
-  */
-  public boolean checkURLIndexable(
-    IPipelineSpecification pipelineSpecification,
-    String url,
-    IOutputCheckActivity activity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Determine whether we need to fetch or refetch a document.
-  * Pass in information including the pipeline specification with existing version info, plus new document and parameter version strings.
-  * If no outputs need to be updated, then this method will return false.  If any outputs need updating, then true is returned.
-  *@param pipelineSpecificationWithVersions is the pipeline specification including new version info for all transformation and output
-  *  connections.
-  *@param newDocumentVersion is the newly-determined document version.
-  *@param newAuthorityNameString is the newly-determined authority name.
-  *@return true if the document needs to be refetched.
-  */
-  public boolean checkFetchDocument(
-    IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-    String newDocumentVersion,
-    String newAuthorityNameString);
-
-  /** Record a document version, but don't ingest it.
-  * The purpose of this method is to update document version information without reindexing the document.
-  *@param pipelineSpecificationBasic is the basic pipeline specification needed.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param documentVersion is the document version.
-  *@param recordTime is the time at which the recording took place, in milliseconds since epoch.
-  */
-  public void documentRecord(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash, String componentHash,
-    String documentVersion, long recordTime)
-    throws ManifoldCFException;
-
-  /** Remove a document from specified indexes, just as if an empty document
-  * was indexed, and record the necessary version information.
-  * This method is conceptually similar to documentIngest(), but does not actually take
-  * a document or allow it to be transformed.  If there is a document already
-  * indexed, it is removed from the index.
-  *@param pipelineSpecificationWithVersions is the pipeline specification with already-fetched output versioning information.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param documentVersion is the document version.
-  *@param authorityName is the name of the authority associated with the document, if any.
-  *@param recordTime is the time at which the recording took place, in milliseconds since epoch.
-  *@param activities is an object providing a set of methods that the implementer can use to perform the operation.
-  */
-  public void documentNoData(
-    IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-    String identifierClass, String identifierHash, String componentHash,
-    String documentVersion,
-    String authorityName,
-    long recordTime,
-    IOutputActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Ingest a document.
-  * This ingests the document, and notes it.  If this is a repeat ingestion of the document, this
-  * method also REMOVES ALL OLD METADATA.  When complete, the index will contain only the metadata
-  * described by the RepositoryDocument object passed to this method.
-  * ServiceInterruption is thrown if the document ingestion must be rescheduled.
-  *@param pipelineSpecificationWithVersions is the pipeline specification with already-fetched output versioning information.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param documentVersion is the document version.
-  *@param authorityName is the name of the authority associated with the document, if any.
-  *@param data is the document data.  The data is closed after ingestion is complete.
-  *@param ingestTime is the time at which the ingestion took place, in milliseconds since epoch.
-  *@param documentURI is the URI of the document, which will be used as the key of the document in the index.
-  *@param activities is an object providing a set of methods that the implementer can use to perform the operation.
-  *@return true if the ingest was ok, false if the ingest is illegal (and should not be repeated).
-  *@throws IOException only if data stream throws an IOException.
-  */
-  public boolean documentIngest(
-    IPipelineSpecificationWithVersions pipelineSpecificationWithVersions,
-    String identifierClass, String identifierHash, String componentHash,
-    String documentVersion,
-    String authorityName,
-    RepositoryDocument data,
-    long ingestTime, String documentURI,
-    IOutputActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException;
-
-  /** Remove a document component from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  public void documentRemove(
-    IPipelineConnections pipelineConnections,
-    String identifierClass, String identifierHash, String componentHash,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Remove multiple document components from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hash should be interpreted.
-  *@param identifierHashes are the hashes of the ids of the documents.
-  *@param componentHash is the hashed component identifier, if any.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  public void documentRemoveMultiple(
-    IPipelineConnections pipelineConnections,
-    String[] identifierClasses, String[] identifierHashes, String componentHash,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Note the fact that we checked a document (and found that it did not need to be ingested, because the
-  * versions agreed).
-  *@param pipelineSpecificationBasic is a pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes are the set of document identifier hashes.
-  *@param checkTime is the time at which the check took place, in milliseconds since epoch.
-  */
-  public void documentCheckMultiple(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String[] identifierClasses, String[] identifierHashes,
-    long checkTime)
-    throws ManifoldCFException;
-
-  /** Note the fact that we checked a document (and found that it did not need to be ingested, because the
-  * versions agreed).
-  *@param pipelineSpecificationBasic is a basic pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hashed document identifier.
-  *@param checkTime is the time at which the check took place, in milliseconds since epoch.
-  */
-  public void documentCheck(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash,
-    long checkTime)
-    throws ManifoldCFException;
-
-  /** Delete multiple documents, and their components, from the search engine index.
-  *@param pipelineConnections are the pipeline specifications associated with the documents.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is tha array of document identifier hashes if the documents.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  public void documentDeleteMultiple(
-    IPipelineConnections[] pipelineConnections,
-    String[] identifierClasses, String[] identifierHashes,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Delete multiple documents, and their components, from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is tha array of document identifier hashes if the documents.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  public void documentDeleteMultiple(
-    IPipelineConnections pipelineConnections,
-    String[] identifierClasses, String[] identifierHashes,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Delete a document, and all its components, from the search engine index.
-  *@param pipelineConnections is the pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  *@param activities is the object to use to log the details of the ingestion attempt.  May be null.
-  */
-  public void documentDelete(
-    IPipelineConnections pipelineConnections,
-    String identifierClass, String identifierHash,
-    IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Look up ingestion data for a set of documents.
-  *@param rval is a map of output key to document data, in no particular order, which will be loaded with all matching results.
-  *@param pipelineSpecificationBasics are the pipeline specifications corresponding to the identifier classes and hashes.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is the array of document identifier hashes to look up.
-  */
-  public void getPipelineDocumentIngestDataMultiple(
-    IngestStatuses rval,
-    IPipelineSpecificationBasic[] pipelineSpecificationBasics,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException;
-
-  /** Look up ingestion data for a SET of documents.
-  *@param rval is a map of output key to document data, in no particular order, which will be loaded with all matching results.
-  *@param pipelineSpecificationBasic is the pipeline specification for all documents.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is the array of document identifier hashes to look up.
-  */
-  public void getPipelineDocumentIngestDataMultiple(
-    IngestStatuses rval,
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException;
-
-  /** Look up ingestion data for a document.
-  *@param rval is a map of output key to document data, in no particular order, which will be loaded with all matching results.
-  *@param pipelineSpecificationBasic is the pipeline specification for the document.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  */
-  public void getPipelineDocumentIngestData(
-    IngestStatuses rval,
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash)
-    throws ManifoldCFException;
-
-  /** Calculate the average time interval between changes for a document.
-  * This is based on the data gathered for the document.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@param identifierClasses are the names of the spaces in which the identifier hashes should be interpreted.
-  *@param identifierHashes is the hashes of the ids of the documents.
-  *@return the number of milliseconds between changes, or 0 if this cannot be calculated.
-  */
-  public long[] getDocumentUpdateIntervalMultiple(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String[] identifierClasses, String[] identifierHashes)
-    throws ManifoldCFException;
-
-  /** Calculate the average time interval between changes for a document.
-  * This is based on the data gathered for the document.
-  *@param pipelineSpecificationBasic is the basic pipeline specification.
-  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
-  *@param identifierHash is the hash of the id of the document.
-  *@return the number of milliseconds between changes, or 0 if this cannot be calculated.
-  */
-  public long getDocumentUpdateInterval(
-    IPipelineSpecificationBasic pipelineSpecificationBasic,
-    String identifierClass, String identifierHash)
-    throws ManifoldCFException;
-
-  /** Reset all documents belonging to a specific output connection, because we've got information that
-  * that system has been reconfigured.  This will force all such documents to be reindexed the next time
-  * they are checked.
-  *@param outputConnection is the output connection associated with this action.
-  */
-  public void resetOutputConnection(IOutputConnection outputConnection)
-    throws ManifoldCFException;
-    
-  /** Remove all knowledge of an output index from the system.  This is appropriate
-  * when the output index no longer exists and you wish to delete the associated job.
-  *@param outputConnection is the output connection associated with this action.
-  */
-  public void removeOutputConnection(IOutputConnection outputConnection)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIngestLogger.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIngestLogger.java
deleted file mode 100644
index d3c723b..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIngestLogger.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $Id: IIngestLogger.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes logging support that will be called by the ingestion engine to record its
-* activities interacting with the ingestion API.
-*/
-public interface IIngestLogger
-{
-
-  /** Record time-stamped information about an ingestion attempt.
-  *@param documentIdentifier is the internal document identifier being described.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       ingestion attempt has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param dataSize is the number of bytes of data ingested, or null if not applicable.
-  *@param entityIdentifier is a (possibly long) string which identifies the object involved in the ingestion attempt.
-  *@param resultCode contains a terse description of the result of the ingestion.  The description is limited in
-  *       size to 255 characters.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  */
-  public void recordIngestionAttempt(String documentIdentifier, Long startTime, Long dataSize,
-    String entityIdentifier, String resultCode, String resultDescription)
-    throws ManifoldCFException;
-
-  /** Record time-stamped information about a deletion attempt.
-  *@param documentIdentifier is the internal document identifier being described.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       deletion attempt has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param entityIdentifier is a (possibly long) string which identifies the object involved in the deletion attempt.
-  *@param resultCode contains a terse description of the result of the ingestion.  The description is limited in
-  *       size to 255 characters.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  */
-  public void recordDeletionAttempt(String documentIdentifier, Long startTime,
-    String entityIdentifier, String resultCode, String resultDescription)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputActivity.java
deleted file mode 100644
index 6e4ec5a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputActivity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id: IOutputActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that an output connector can do
-when adding or replacing documents, or deleting documents.
-*/
-public interface IOutputActivity extends IOutputAddActivity, IOutputRemoveActivity
-{
-  public static final String _rcsid = "@(#)$Id: IOutputActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java
deleted file mode 100644
index 7626c15..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id: IOutputAddActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import java.io.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that an output connector can do
-when adding or replacing documents.
-*/
-public interface IOutputAddActivity extends IOutputQualifyActivity,IOutputHistoryActivity,IOutputCheckActivity
-{
-  public static final String _rcsid = "@(#)$Id: IOutputAddActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Send a document via the pipeline to the next output connection.
-  *@param documentURI is the document's URI.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@return the document status (accepted or permanently rejected); return codes are listed in IPipelineConnector.
-  *@throws IOException only if there's an IO error reading the data from the document.
-  */
-  public int sendDocument(String documentURI, RepositoryDocument document)
-    throws ManifoldCFException, ServiceInterruption, IOException;
-
-  /** Send NO document via the pipeline to the next output connection.  This is equivalent
-  * to sending an empty document placeholder.
-  */
-  public void noDocument()
-    throws ManifoldCFException, ServiceInterruption;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputCheckActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputCheckActivity.java
deleted file mode 100644
index beab023..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputCheckActivity.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface abstracts from the activities that a transformation connector can do
-when checking a document.
-*/
-public interface IOutputCheckActivity
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Detect if a document date is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param date is the date of the document.
-  *@return true if the document with that date can be accepted by the downstream connection.
-  */
-  public boolean checkDateIndexable(Date date)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Detect if a mime type is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type can be accepted by the downstream connection.
-  */
-  public boolean checkMimeTypeIndexable(String mimeType)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document (passed here as a File object) is acceptable downstream.  This method is
-  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-  * search engines that only handle a small set of accepted file types.
-  *@param localFile is the local file to check.
-  *@return true if the file is acceptable by the downstream connection.
-  */
-  public boolean checkDocumentIndexable(File localFile)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's length is acceptable downstream.  This method is used
-  * to determine whether to fetch a document in the first place.
-  *@param length is the length of the document.
-  *@return true if the file is acceptable by the downstream connection.
-  */
-  public boolean checkLengthIndexable(long length)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's URL is acceptable downstream.  This method is used
-  * to help filter out documents that cannot be indexed in advance.
-  *@param url is the URL of the document.
-  *@return true if the file is acceptable by the downstream connection.
-  */
-  public boolean checkURLIndexable(String url)
-    throws ManifoldCFException, ServiceInterruption;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnection.java
deleted file mode 100644
index baeea46..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnection.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/* $Id: IOutputConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** An instance of this interface represents a paper object that describes an output connection.
-* This is the paper object meant for editing and manipulation.
-*/
-public interface IOutputConnection
-{
-  public static final String _rcsid = "@(#)$Id: IOutputConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-  
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className);
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName();
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams();
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount);
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections();
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectionManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectionManager.java
deleted file mode 100644
index cb8cb69..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectionManager.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* $Id: IOutputConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Manager classes of this kind use the database to contain a human description of an output connection.
-*/
-public interface IOutputConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id: IOutputConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Obtain a list of the output connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public IOutputConnection[] getAllConnections()
-    throws ManifoldCFException;
-
-  /** Load an output connection by name.
-  *@param name is the name of the output connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public IOutputConnection load(String name)
-    throws ManifoldCFException;
-
-  /** Load a set of output connections.
-  *@param names are the names of the output connections.
-  *@return the descriptors of the output connections, with null
-  * values for those not found.
-  */
-  public IOutputConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new output connection object.
-  *@return the new object.
-  */
-  public IOutputConnection create()
-    throws ManifoldCFException;
-
-  /** Save an output connection object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  public boolean save(IOutputConnection object)
-    throws ManifoldCFException;
-
-  /** Delete an output connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  /** Get a list of output connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the repository connections that use that connector.
-  */
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException;
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Return the primary table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Return the name column.
-  *@return the name column.
-  */
-  public String getConnectionNameColumn();
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java
deleted file mode 100644
index 3127fde..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* $Id: IOutputConnector.java 998081 2010-09-17 11:33:15Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes an instance of a connection between an engine that needs to output documents,
-* and an output connector.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates connector objects
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connector instances are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.  The complete list is:
-*
-*
-* The purpose of the output connector is to allow documents to be sent to their final destination (as far as
-* Connector Framework is concerned).
-*
-*/
-public interface IOutputConnector extends IPipelineConnector
-{
-  public static final String _rcsid = "@(#)$Id: IOutputConnector.java 998081 2010-09-17 11:33:15Z kwright $";
-
-  /** Return a list of activities that this connector generates.
-  * The connector does NOT need to be connected before this method is called.
-  *@return the set of activities.
-  */
-  public String[] getActivitiesList();
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException;
-    
-  /** Remove a document using the connector.
-  * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify the connector of a completed job.
-  * This is meant to allow the connector to flush any internal data structures it has been keeping around, or to tell the output repository that this
-  * is a good time to synchronize things.  It is called whenever a job is either completed or aborted.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  public void noteJobComplete(IOutputNotifyActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify the connector that all records associated with this connection have been removed.
-  * This method allows the connector to remove any internal data storage that is associated with records sent to the index on
-  * behalf of a connection. It should not attempt to communicate with the output index.
-  */
-  public void noteAllRecordsRemoved()
-    throws ManifoldCFException;
-
-  // UI support methods are inherited from IConnector and IPipelineConnector.
- 
-}
-
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectorManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectorManager.java
deleted file mode 100644
index 1b294c3..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectorManager.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id: IOutputConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a manager for the registry of output connectors.
-* Use this to register or remove a connector from the list of available choices.
-*/
-public interface IOutputConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id: IOutputConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException;
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the connector class to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException;
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException;
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException;
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException;
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectorPool.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectorPool.java
deleted file mode 100644
index f68dc1b..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnectorPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An object implementing this interface functions as a pool of output connectors.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public interface IOutputConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get multiple output connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param outputConnections are the connections to use the build the connector instances.
-  */
-  public IOutputConnector[] grabMultiple(String[] orderingKeys, IOutputConnection[] outputConnections)
-    throws ManifoldCFException;
-
-  /** Get an output connector.
-  * The connector is specified by an output connection object.
-  *@param outputConnection is the output connection to base the connector instance on.
-  */
-  public IOutputConnector grab(IOutputConnection outputConnection)
-    throws ManifoldCFException;
-
-  /** Release multiple output connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  public void releaseMultiple(IOutputConnection[] connections, IOutputConnector[] connectors)
-    throws ManifoldCFException;
-
-  /** Release an output connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  public void release(IOutputConnection connection, IOutputConnector connector)
-    throws ManifoldCFException;
-
-  /** Idle notification for inactive output connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors()
-    throws ManifoldCFException;
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors()
-    throws ManifoldCFException;
-
-  /** Clean up all open output connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  public void closeAllConnectors()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputHistoryActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputHistoryActivity.java
deleted file mode 100644
index f1effbc..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputHistoryActivity.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: IOutputHistoryActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that an output connector can do.
-*/
-public interface IOutputHistoryActivity
-{
-  public static final String _rcsid = "@(#)$Id: IOutputHistoryActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // General result codes.  Use these rather than inventing your own, where reasonable
-  public static final String EXCEPTION = "GENERALEXCEPTION";
-  public static final String CREATED_DIRECTORY = "CREATEDIRECTORY";
-  public static final String IOEXCEPTION = "IOEXCEPTION";
-  public static final String EXCLUDED_URL = "EXCLUDEDURL";
-  public static final String EXCLUDED_LENGTH = "EXCLUDEDLENGTH";
-  public static final String EXCLUDED_MIMETYPE = "EXCLUDEDMIMETYPE";
-  public static final String EXCLUDED_DATE = "EXCLUDEDDATE";
-  public static final String EXCLUDED_CONTENT = "EXCLUDEDCONTENT";
-
-  /**
-   * Use this result code when security info is not recognized. 
-   */
-  public static final String UNKNOWN_SECURITY = "UNKNOWNSECURITY";
-  /**
-   * Use this result code when you get HTTP error from the service that you are connected.
-   */
-  public static final String HTTP_ERROR = "HTTPERROR";
-  /** Record time-stamped information about the activity of the output connector.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       activity has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-  *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-  *       "fetch document" activity.  Cannot be null.
-  *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-  *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-  *       The interpretation of this field will differ from connector to connector.  May be null.
-  *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-  *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  */
-  public void recordActivity(Long startTime, String activityType, Long dataSize,
-    String entityURI, String resultCode, String resultDescription)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputNotifyActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputNotifyActivity.java
deleted file mode 100644
index 6bf583b..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputNotifyActivity.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id: IOutputNotifyActivity.java 998081 2010-09-17 11:33:15Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that an output connector can do
-when processing notification of a completed job.
-*/
-public interface IOutputNotifyActivity extends IOutputHistoryActivity
-{
-  public static final String _rcsid = "@(#)$Id: IOutputNotifyActivity.java 998081 2010-09-17 11:33:15Z kwright $";
-
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputQualifyActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputQualifyActivity.java
deleted file mode 100644
index 8af62e9..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputQualifyActivity.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that an output connector can do
-when qualifying authority names.
-*/
-public interface IOutputQualifyActivity
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Qualify an access token appropriately, to match access tokens as returned by mod_aa.  This method
-  * includes the authority name with the access token, if any, so that each authority may establish its own token space.
-  *@param authorityNameString is the name of the authority to use to qualify the access token.
-  *@param accessToken is the raw, repository access token.
-  *@return the properly qualified access token.
-  */
-  public String qualifyAccessToken(String authorityNameString, String accessToken)
-    throws ManifoldCFException;
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputRemoveActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputRemoveActivity.java
deleted file mode 100644
index ea34527..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputRemoveActivity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id: IOutputRemoveActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that an output connector can do
-when removing documents.
-*/
-public interface IOutputRemoveActivity extends IOutputHistoryActivity
-{
-  public static final String _rcsid = "@(#)$Id: IOutputRemoveActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineConnections.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineConnections.java
deleted file mode 100644
index 9c20b64..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineConnections.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-/** This interface caches IOutputConnection and ITransformationConnection objects
-* required by an IPipelineSpecification.
-*/
-public interface IPipelineConnections extends IPipelineSpecificationBasic
-{
-  /** Get the transformation connection names mentioned by the IPipelineSpecification
-  * object. */
-  public String[] getTransformationConnectionNames();
-  
-  /** Get the transformation connection instances mentioned by the IPipelineSpecification
-  * object. */
-  public ITransformationConnection[] getTransformationConnections();
-  
-  /** Get the output connection names mentioned by the IPipelineSpecification
-  * object. */
-  public String[] getOutputConnectionNames();
-  
-  /** Get the output connection instances mentioned by the IPipelineSpecification
-  * object. */
-  public IOutputConnection[] getOutputConnections();
-  
-  /** Get the index of the transformation connection corresponding to a
-  * specific pipeline stage. */
-  public Integer getTransformationConnectionIndex(int stage);
-  
-  /** Get the index of the output connection corresponding to a
-  * specific pipeline stage. */
-  public Integer getOutputConnectionIndex(int stage);
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineConnector.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineConnector.java
deleted file mode 100644
index 777681e..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineConnector.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes an instance of a connector which can live in a chained processing pipeline.
-* Both transformation connectors and output connectors are expected to extend this interface.
-*
-* Pipeline connectors have two basic functions:
-* (1) Processing documents, and optionally passing them to the next pipeline stage;
-* (2) Determining if a document is acceptable, optionally by querying the next pipeline stage.
-*
-*/
-public interface IPipelineConnector extends IConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Document statuses
-
-  /** Document accepted */
-  public final static int DOCUMENTSTATUS_ACCEPTED = 0;
-  /** Document permanently rejected */
-  public final static int DOCUMENTSTATUS_REJECTED = 1;
-
-  /** Get a pipeline version object, given a pipeline specification object.  The version string is used to
-  * uniquely describe the pertinent details of the specification and the configuration, to allow the Connector 
-  * Framework to determine whether a document will need to be processed again.
-  * Note that the contents of any document cannot be considered by this method; only configuration and specification information
-  * can be considered.
-  *
-  * This method presumes that the underlying connector object has been configured.
-  *@param spec is the current pipeline specification object for this connection for the job that is doing the crawling.
-  *@return a version object, including a string of unlimited length, which uniquely describes configuration and specification in such a way that
-  * if two such strings are equal, nothing that affects how or whether the document is indexed will be different.
-  */
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Detect if a document date is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param date is the date of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the document with that date can be accepted by this connector.
-  */
-  public boolean checkDateIndexable(VersionContext pipelineDescription, Date date, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Detect if a mime type is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param mimeType is the mime type of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the mime type can be accepted by this connector.
-  */
-  public boolean checkMimeTypeIndexable(VersionContext pipelineDescription, String mimeType, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document (passed here as a File object) is acceptable or not.  This method is
-  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-  * search engines that only handle a small set of accepted file types.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param localFile is the local file to check.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  public boolean checkDocumentIndexable(VersionContext pipelineDescription, File localFile, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's length is acceptable.  This method is used
-  * to determine whether to fetch a document in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param length is the length of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  public boolean checkLengthIndexable(VersionContext pipelineDescription, long length, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's URL is acceptable.  This method is used
-  * to help filter out documents that cannot be indexed in advance.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param url is the URL of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  public boolean checkURLIndexable(VersionContext pipelineDescription, String url, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException;
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch (inherited from IConnector) is involved in setting up connection configuration information.
-  // The second bunch
-  // is involved in presenting and editing pipeline specification information for a connection within a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber);
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber);
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a pipeline connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this connection.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException;
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a pipeline connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException;
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the transformation specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current pipeline specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException;
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the pipeline specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current pipeline specification for this job.
-  */
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException;
-  
-}
-
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecification.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecification.java
deleted file mode 100644
index ffc0b51..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecification.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a multi-output pipeline, where each stage has an already-computed
-* description string.
-*/
-public interface IPipelineSpecification extends IPipelineConnections
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get the description string for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the description string that stage.
-  */
-  public VersionContext getStageDescriptionString(int stage);
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecificationBasic.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecificationBasic.java
deleted file mode 100644
index 47841a8..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecificationBasic.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a multi-output pipeline.  Each stage of the pipeline is
-* given a rank number, and dependencies between stages refer to that rank number.
-*/
-public interface IPipelineSpecificationBasic
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get a count of all stages.
-  *@return the total count of all stages.
-  */
-  public int getStageCount();
-  
-  /** Find children of a given pipeline stage.  Pass -1 to find the children of the root stage.
-  *@param stage is the stage index to get the children of.
-  *@return the pipeline stages that represent those children.
-  */
-  public int[] getStageChildren(int stage);
-  
-  /** Find parent of a given pipeline stage.  Returns -1 if there's no parent (it's the root).
-  *@param stage is the stage index to get the parent of.
-  *@return the pipeline stage that is the parent, or -1.
-  */
-  public int getStageParent(int stage);
-
-  /** Get the connection name for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the connection name for that stage.
-  */
-  public String getStageConnectionName(int stage);
-
-  /** Check if a stage is an output stage.
-  *@param stage is the stage to check.
-  *@return true if the stage represents an output connection.
-  */
-  public boolean checkStageOutputConnection(int stage);
-  
-  // This part of the interface describes the output connections within.  They
-  // are intrinsically ordered independently of stages.  It is presumed that
-  // no single output connection appears more than once.
-  
-  /** Return the number of output connections.
-  *@return the total number of output connections in this specification.
-  */
-  public int getOutputCount();
-  
-  /** Given an output index, return the stage number for that output.
-  *@param index is the output connection index.
-  *@return the stage number.
-  */
-  public int getOutputStage(int index);
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecificationWithVersions.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecificationWithVersions.java
deleted file mode 100644
index 18eab4f..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IPipelineSpecificationWithVersions.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a multi-output pipeline, with existing document version information from
-* each output.. 
-*/
-public interface IPipelineSpecificationWithVersions extends IPipelineSpecification
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** For a given output index, return a document version string.
-  *@param index is the output index.
-  *@return the document version string.
-  */
-  public String getOutputDocumentVersionString(int index);
-  
-  /** For a given output index, return a transformation version string.
-  *@param index is the output index.
-  *@return the transformation version string.
-  */
-  public String getOutputTransformationVersionString(int index);
-
-  /** For a given output index, return an output version string.
-  *@param index is the output index.
-  *@return the output version string.
-  */
-  public String getOutputVersionString(int index);
-  
-  /** For a given output index, return an authority name string.
-  *@param index is the output index.
-  *@return the authority name string.
-  */
-  public String getAuthorityNameString(int index);
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationCheckActivity.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationCheckActivity.java
deleted file mode 100644
index 978fbaa..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationCheckActivity.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-
-/** This interface abstracts from the activities that a transformation connector can do
-when checking a document.
-*/
-public interface ITransformationCheckActivity
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Detect if a mime type is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type can be accepted by the downstream connection.
-  */
-  public boolean checkMimeTypeIndexable(String mimeType)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document (passed here as a File object) is acceptable downstream.  This method is
-  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-  * search engines that only handle a small set of accepted file types.
-  *@param localFile is the local file to check.
-  *@return true if the file is acceptable by the downstream connection.
-  */
-  public boolean checkDocumentIndexable(File localFile)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's length is acceptable downstream.  This method is used
-  * to determine whether to fetch a document in the first place.
-  *@param length is the length of the document.
-  *@return true if the file is acceptable by the downstream connection.
-  */
-  public boolean checkLengthIndexable(long length)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's URL is acceptable downstream.  This method is used
-  * to help filter out documents that cannot be indexed in advance.
-  *@param url is the URL of the document.
-  *@return true if the file is acceptable by the downstream connection.
-  */
-  public boolean checkURLIndexable(String url)
-    throws ManifoldCFException, ServiceInterruption;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnection.java
deleted file mode 100644
index 638ad64..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnection.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** An instance of this interface represents a paper object that describes a transformation connection.
-* This is the paper object meant for editing and manipulation.
-*/
-public interface ITransformationConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-  
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className);
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName();
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams();
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount);
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections();
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectionManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectionManager.java
deleted file mode 100644
index 75fbb32..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectionManager.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Manager classes of this kind use the database to contain a human description of a transformation connection.
-*/
-public interface ITransformationConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Obtain a list of the transformation connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public ITransformationConnection[] getAllConnections()
-    throws ManifoldCFException;
-
-  /** Load an transformation connection by name.
-  *@param name is the name of the transformation connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public ITransformationConnection load(String name)
-    throws ManifoldCFException;
-
-  /** Load a set of transformation connections.
-  *@param names are the names of the transformation connections.
-  *@return the descriptors of the transformation connections, with null
-  * values for those not found.
-  */
-  public ITransformationConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new transformation connection object.
-  *@return the new object.
-  */
-  public ITransformationConnection create()
-    throws ManifoldCFException;
-
-  /** Save a transformation connection object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  public boolean save(ITransformationConnection object)
-    throws ManifoldCFException;
-
-  /** Delete a transformation connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  /** Get a list of transformation connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the transformation connections that use that connector.
-  */
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException;
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Return the primary table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Return the name column.
-  *@return the name column.
-  */
-  public String getConnectionNameColumn();
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnector.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnector.java
deleted file mode 100644
index c0dcd83..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnector.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes an instance of a connection to a translation engine.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates connector objects
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connector instances are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities. 
-*
-*
-* The purpose of the transformation connector is to allow documents to be transformed prior to them
-* being sent to an output connection.
-*
-*/
-public interface ITransformationConnector extends IPipelineConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Return a list of activities that this connector generates.
-  * The connector does NOT need to be connected before this method is called.
-  *@return the set of activities.
-  */
-  public String[] getActivitiesList();
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException;
-    
-  // UI support methods are inherited from IConnector and IPipelineConnector.
-  //
-  
-}
-
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectorManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectorManager.java
deleted file mode 100644
index 601b709..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectorManager.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a manager for the registry of transformation connectors.
-* Use this to register or remove a connector from the list of available choices.
-*/
-public interface ITransformationConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException;
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the connector class to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException;
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException;
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException;
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException;
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectorPool.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectorPool.java
deleted file mode 100644
index c556bfc..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ITransformationConnectorPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An object implementing this interface functions as a pool of transformation connectors.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public interface ITransformationConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get multiple transformation connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param transformationConnections are the connections to use the build the connector instances.
-  */
-  public ITransformationConnector[] grabMultiple(String[] orderingKeys, ITransformationConnection[] transformationConnections)
-    throws ManifoldCFException;
-
-  /** Get a transformation connector.
-  * The connector is specified by a transformation connection object.
-  *@param transformationConnection is the output connection to base the connector instance on.
-  */
-  public ITransformationConnector grab(ITransformationConnection transformationConnection)
-    throws ManifoldCFException;
-
-  /** Release multiple transformation connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  public void releaseMultiple(ITransformationConnection[] connections, ITransformationConnector[] connectors)
-    throws ManifoldCFException;
-
-  /** Release a transformation connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  public void release(ITransformationConnection connection, ITransformationConnector connector)
-    throws ManifoldCFException;
-
-  /** Idle notification for inactive transformation connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors()
-    throws ManifoldCFException;
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors()
-    throws ManifoldCFException;
-
-  /** Clean up all open transformation connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  public void closeAllConnectors()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IncrementalIngesterFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IncrementalIngesterFactory.java
deleted file mode 100644
index 8684b98..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IncrementalIngesterFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id: IncrementalIngesterFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/** Factory for getting incremental ingest manager handles.
-*/
-public class IncrementalIngesterFactory
-{
-  public static final String _rcsid = "@(#)$Id: IncrementalIngesterFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final static String ingestManager = "_IncrIngester_";
-
-  private IncrementalIngesterFactory()
-  {
-  }
-
-
-  /** Get an appropriate incremental ingest manager handle.
-  */
-  public static IIncrementalIngester make(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Object o = threadContext.get(ingestManager);
-    if (o == null || !(o instanceof IIncrementalIngester))
-    {
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.agents.incrementalingest.IncrementalIngester(threadContext,database);
-      threadContext.save(ingestManager,o);
-    }
-    return (IIncrementalIngester)o;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IngestStatuses.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IngestStatuses.java
deleted file mode 100644
index ccc91dd..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IngestStatuses.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This object is part of the IIncrementalIngester API.
-* It is an accumulator and organizer of DocumentIngestStatus records
-*/
-public class IngestStatuses
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final Map<OutputKey,DocumentIngestStatusSet> statuses = new HashMap<OutputKey,DocumentIngestStatusSet>();
-  
-  public IngestStatuses()
-  {
-  }
-  
-  /** Add a status record.
-  *@param documentClass is the document class.
-  *@param documentIDHash is the document id's hash value.
-  *@param outputConnectionName is the output connection name.
-  *@param componentIDHash is the component ID hash value.
-  *@param status is the status.
-  */
-  public void addStatus(String documentClass, String documentIDHash, String outputConnectionName,
-    String componentIDHash, DocumentIngestStatus status)
-  {
-    OutputKey ok = new OutputKey(documentClass,documentIDHash,outputConnectionName);
-    DocumentIngestStatusSet set = statuses.get(ok);
-    if (set == null)
-    {
-      set = new DocumentIngestStatusSet();
-      statuses.put(ok,set);
-    }
-    set.addDocumentStatus(componentIDHash,status);
-  }
-  
-  /** Retrieve a status record.
-  *@param documentClass is the document class.
-  *@param documentIDHash is the document id's hash value.
-  *@param outputConnectionName is the output connection name.
-  *@return the status record, if exists.
-  */
-  public DocumentIngestStatusSet getStatus(String documentClass, String documentIDHash, String outputConnectionName)
-  {
-    return statuses.get(new OutputKey(documentClass,documentIDHash,outputConnectionName));
-  }
-
-  protected static class OutputKey
-  {
-    protected final String documentClass;
-    protected final String documentIDHash;
-    protected final String outputConnectionName;
-    
-    /** Constructor */
-    public OutputKey(String documentClass, String documentIDHash, String outputConnectionName)
-    {
-      // Identifying information
-      this.documentClass = documentClass;
-      this.documentIDHash = documentIDHash;
-      this.outputConnectionName = outputConnectionName;
-    }
-
-    /** Get the document class */
-    public String getDocumentClass()
-    {
-      return documentClass;
-    }
-    
-    /** Get the document ID hash */
-    public String getDocumentIDHash()
-    {
-      return documentIDHash;
-    }
-    
-    /** Get the output connection name */
-    public String getOutputConnectionName()
-    {
-      return outputConnectionName;
-    }
-    
-    public int hashCode()
-    {
-      return documentClass.hashCode() + documentIDHash.hashCode() + outputConnectionName.hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof OutputKey))
-        return false;
-      OutputKey dis = (OutputKey)o;
-      return dis.documentClass.equals(documentClass) &&
-        dis.documentIDHash.equals(documentIDHash) &&
-        dis.outputConnectionName.equals(outputConnectionName);
-    }
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java
deleted file mode 100644
index 908d5b7..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id: OutputConnectionManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.util.*;
-
-/** Repository connection manager factory.
-*/
-public class OutputConnectionManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnectionManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_OutputConnectionMgr_";
-
-  private OutputConnectionManagerFactory()
-  {
-  }
-
-  /** Make an output connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IOutputConnectionManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IOutputConnectionManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.agents.outputconnection.OutputConnectionManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (IOutputConnectionManager)o;
-  }
-
-  /** Compile a list of all pertinent activities, across all existing output connections.
-  *@param tc is the thread context.
-  *@return the sorted list of output connection activities.
-  */
-  public static String[] getAllOutputActivities(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    IOutputConnectionManager manager = make(tc);
-    IOutputConnection[] connections = manager.getAllConnections();
-    Set<String> map = new HashSet();
-    for (IOutputConnection connection : connections)
-    {
-      String connectionName = connection.getName();
-      String[] activities = OutputConnectorFactory.getActivitiesList(tc,connection.getClassName());
-      if (activities != null)
-      {
-        for (String activityName : activities)
-        {
-          String activity = ManifoldCF.qualifyOutputActivityName(activityName,connectionName);
-          map.add(activity);
-        }
-      }
-    }
-    String[] rval = new String[map.size()];
-    int i = 0;
-    Iterator<String> iter = map.iterator();
-    while (iter.hasNext())
-    {
-      rval[i++] = iter.next();
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorFactory.java
deleted file mode 100644
index a20386d..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorFactory.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/* $Id: OutputConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This is the factory class for IOutputConnector objects.
-*/
-public class OutputConnectorFactory extends ConnectorFactory<IOutputConnector>
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Static factory
-  protected final static OutputConnectorFactory thisFactory = new OutputConnectorFactory();
-
-  protected OutputConnectorFactory()
-  {
-  }
-
-  @Override
-  protected boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException
-  {
-    IOutputConnectorManager connMgr = OutputConnectorManagerFactory.make(tc);
-    return connMgr.isInstalled(className);
-  }
-  
-  /** Get the activities supported by this connector.
-  *@param className is the class name.
-  *@return the list of activities.
-  */
-  public String[] getThisActivitiesList(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    IOutputConnector connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return null;
-    String[] values = connector.getActivitiesList();
-    java.util.Arrays.sort(values);
-    return values;
-  }
-
-  /** Install connector.
-  *@param className is the class name.
-  */
-  public static void install(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.installThis(threadContext,className);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  public static void deinstall(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.deinstallThis(threadContext,className);
-  }
-
-  /** Get the activities supported by this connector.
-  *@param className is the class name.
-  *@return the list of activities.
-  */
-  public static String[] getActivitiesList(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisActivitiesList(threadContext,className);
-  }
-
-  /** Output the configuration header section.
-  */
-  public static void outputConfigurationHeader(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationHeader(threadContext,className,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  public static void outputConfigurationBody(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationBody(threadContext,className,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  public static String processConfigurationPost(IThreadContext threadContext, String className,
-    IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    return thisFactory.processThisConfigurationPost(threadContext,className,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  public static void viewConfiguration(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.viewThisConfiguration(threadContext,className,out,locale,configParams);
-  }
-
-  /** Get an output connector instance, without checking for installed connector.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  public static IOutputConnector getConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorNoCheck(className);
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorManagerFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorManagerFactory.java
deleted file mode 100644
index ffae004..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id: OutputConnectorManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/** Factory for output connector manager.
-*/
-public class OutputConnectorManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnectorManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected static final String connMgr = "_OutputConnectorManager_";
-
-  private OutputConnectorManagerFactory()
-  {
-  }
-
-  /** Construct an output connector manager.
-  *@param tc is the thread context.
-  *@return the output connector manager handle.
-  */
-  public static IOutputConnectorManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof IOutputConnectorManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.agents.outputconnmgr.OutputConnectorManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (IOutputConnectorManager)o;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorPoolFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorPoolFactory.java
deleted file mode 100644
index 7c26f2d..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectorPoolFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.util.*;
-
-/** Output connector pool manager factory.
-*/
-public class OutputConnectorPoolFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_OutputConnectorPoolMgr_";
-
-  private OutputConnectorPoolFactory()
-  {
-  }
-
-  /** Make an output connector pool handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IOutputConnectorPool make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IOutputConnectorPool))
-    {
-      o = new org.apache.manifoldcf.agents.outputconnectorpool.OutputConnectorPool(tc);
-      tc.save(objectName,o);
-    }
-    return (IOutputConnectorPool)o;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java
deleted file mode 100644
index 110566e..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java
+++ /dev/null
@@ -1,633 +0,0 @@
-/* $Id: RepositoryDocument.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.common.DateParser;
-import java.util.*;
-import java.io.*;
-
-/** This class contains the complete information for a document, as read
-* from a repository.  The generator of this document is one of the
-* repository connectors; the user of the class is the incremental ingester.
-*
-* Data contained within is described in part by a binary stream (which is expected to be processed),
-* and partly by already-extracted textual data.  These
-* streams MUST BE CLOSED BY THE CALLER when the repository document instance has been ingested.
-* The streams also WILL NOT ever be reset; they are read to the end once only.
-*/
-public class RepositoryDocument
-{
-  public static final String _rcsid = "@(#)$Id: RepositoryDocument.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Security types
-  public final static String SECURITY_TYPE_DOCUMENT = "document";
-  public final static String SECURITY_TYPE_SHARE = "share";
-  public final static String SECURITY_TYPE_PARENT = "parent";
-  // Enumerated security type; add an integer to the end (deprecated)
-  public final static String SECURITY_TYPE_DIRECTORY_LEVEL = "directory_";
-  
-  // Member variables.
-  protected InputStream binaryFieldData = null;
-  protected long binaryLength = 0;
-  protected final Set<String> fieldSet = new HashSet<String>(); // MUST be independent of fields map because we iterate over this and may change fields
-  protected final Map<String,Object> fields = new HashMap<String,Object>();
-  protected final Map<String,String[]> stringFields = new HashMap<String,String[]>();
-  protected final Map<String,Reader[]> readerFields = new HashMap<String,Reader[]>();
-  protected final Map<String,Date[]> dateFields = new HashMap<String,Date[]>();
-  protected final Map<String,Security> securityLevels = new HashMap<String,Security>();
-  protected String fileName = "docname";
-  protected String contentMimeType = "application/octet-stream";
-  protected Date createdDate = null;
-  protected Date modifiedDate = null;
-  protected Date indexingDate = null;
-  protected Long originalSize = null;
-  
-  /** Constructor.
-  */
-  public RepositoryDocument()
-  {
-  }
-
-  /** Create an exact duplicate of this Repository Document.  This is how you are expected to write
-  * transformation connectors: you create a duplicate, and override the fields you want to change.
-  * For streams etc, only the overridden fields need to be explicitly managed by the transformation
-  * connector, since the original fields will be handled by the connector's caller.
-  *@return the exact duplicate.
-  */
-  public RepositoryDocument duplicate()
-  {
-    RepositoryDocument rval = new RepositoryDocument();
-    rval.binaryFieldData = binaryFieldData;
-    rval.binaryLength = binaryLength;
-    rval.fileName = fileName;
-    rval.contentMimeType = contentMimeType;
-    rval.createdDate = createdDate;
-    rval.modifiedDate = modifiedDate;
-    rval.indexingDate = indexingDate;
-    rval.originalSize = originalSize;
-    for (String key : fieldSet)
-    {
-      rval.fieldSet.add(key);
-    }
-    for (String key : fields.keySet())
-    {
-      rval.fields.put(key,fields.get(key));
-    }
-    for (String key : stringFields.keySet())
-    {
-      rval.stringFields.put(key,stringFields.get(key));
-    }
-    for (String key : readerFields.keySet())
-    {
-      rval.readerFields.put(key,readerFields.get(key));
-    }
-    for (String key : dateFields.keySet())
-    {
-      rval.dateFields.put(key,dateFields.get(key));
-    }
-    for (String key : securityLevels.keySet())
-    {
-      rval.securityLevels.put(key,securityLevels.get(key));
-    }
-    return rval;
-  }
-  
-  /** Clear all fields.
-  */
-  public void clearFields()
-  {
-    fieldSet.clear();
-    fields.clear();
-    stringFields.clear();
-    dateFields.clear();
-    readerFields.clear();
-  }
-  
-  /** Set the document's original (repository) size.  Use null to indicate that the size is
-  * unknown.
-  *@param size is the size.
-  */
-  public void setOriginalSize(Long size)
-  {
-    originalSize = size;
-  }
-  
-  /** Get the document's original size.
-  *@return the original repository document size, or null if unknown.
-  */
-  public Long getOriginalSize()
-  {
-    return originalSize;
-  }
-  
-  /** Set the document's created date.  Use null to indicate that the date is unknown.
-  *@param date is the date.
-  */
-  public void setCreatedDate(Date date)
-  {
-    createdDate = date;
-  }
-  
-  /** Get the document's created date.  Returns null of the date is unknown.
-  *@return the date.
-  */
-  public Date getCreatedDate()
-  {
-    return createdDate;
-  }
-  
-  /** Set the document's last-modified date.  Use null to indicate that the date is unknown.
-  *@param date is the date.
-  */
-  public void setModifiedDate(Date date)
-  {
-    modifiedDate = date;
-  }
-  
-  /** Get the document's modified date.  Returns null of the date is unknown.
-  *@return the date.
-  */
-  public Date getModifiedDate()
-  {
-    return modifiedDate;
-  }
-
-  /** Set the document's indexing date.  Use null to indicate that the date is unknown.
-  *@param date is the date.
-  */
-  public void setIndexingDate(Date date)
-  {
-    indexingDate = date;
-  }
-  
-  /** Get the document's indexing date.  Returns null of the date is unknown.
-  *@return the date.
-  */
-  public Date getIndexingDate()
-  {
-    return indexingDate;
-  }
-  
-  /** Set the document's mime type.
-  *@param mimeType is the mime type.
-  */
-  public void setMimeType(String mimeType)
-  {
-    contentMimeType = mimeType;
-  }
-  
-  /** Get the document's mime type.
-  *@return the mime type.
-  */
-  public String getMimeType()
-  {
-    return contentMimeType;
-  }
-  
-  /** Locate or create a specified security level.
-  *@param securityType is the security type.
-  */
-  protected Security getSecurityLevel(String securityType)
-  {
-    Security s = securityLevels.get(securityType);
-    if (s == null)
-    {
-      s = new Security();
-      securityLevels.put(securityType, s);
-    }
-    return s;
-  }
-  
-  /** Enumerate the active security types for this document.
-  *@return an iterator over the security types.
-  */
-  public Iterator<String> securityTypesIterator()
-  {
-    return securityLevels.keySet().iterator();
-  }
-  
-  /** Set security values for a given security type.
-  *@param securityType is the security type.
-  *@param acl is the acl.
-  *@param denyAcl is the deny acl.
-  */
-  public void setSecurity(String securityType, String[] acl, String[] denyAcl)
-  {
-    if (acl != null && denyAcl != null)
-    {
-      Security s = getSecurityLevel(securityType);
-      s.setACL(acl);
-      s.setDenyACL(denyAcl);
-    }
-  }
-  
-  /** Set security acl for a given security type.
-  *@param securityType is the security type.
-  *@param acl is the acl;
-  */
-  public void setSecurityACL(String securityType, String[] acl)
-  {
-    if (acl != null)
-    {
-      Security s = getSecurityLevel(securityType);
-      s.setACL(acl);
-    }
-  }
-  
-  /** Set security deny acl for a given security type.
-  *@param securityType is the security type.
-  *@param denyAcl is the deny acl.
-  */
-  public void setSecurityDenyACL(String securityType, String[] denyAcl)
-  {
-    if (denyAcl != null)
-    {
-      Security s = getSecurityLevel(securityType);
-      s.setDenyACL(denyAcl);
-    }
-  }
-
-  /** Get security acl for a given security type.
-  *@param securityType is the security type.
-  *@return the acl, which may be null.
-  */
-  public String[] getSecurityACL(String securityType)
-  {
-    Security s = securityLevels.get(securityType);
-    if (s != null)
-      return s.getACL();
-    return null;
-  }
-
-  /** Get security deny acl for a given security type.
-  *@param securityType is the security type.
-  *@return the acl, which may be null.
-  */
-  public String[] getSecurityDenyACL(String securityType)
-  {
-    Security s = securityLevels.get(securityType);
-    if (s != null)
-      return s.getDenyACL();
-    return null;
-  }
-  
-  /** Set the binary field.
-  * Data is described by a binary stream (which is expected to be processed),
-  * This stream MUST BE CLOSED BY THE CALLER when the repository document instance has been ingested.
-  * The stream also WILL NOT ever be reset; it is read to the end once only.
-  *@param binaryFieldData is the input stream containing binary data.
-  *@param binaryLength is the length of the stream, in bytes.  This is a REQUIRED parameter.
-  */
-  public void setBinary(InputStream binaryFieldData, long binaryLength)
-  {
-    this.binaryFieldData = binaryFieldData;
-    this.binaryLength = binaryLength;
-  }
-
-  /** Get the binary fields (if any).
-  *@return the binary stream.
-  */
-  public InputStream getBinaryStream()
-  {
-    return binaryFieldData;
-  }
-  
-  /** Set the file name.
-   *@param fileName is the file name.
-   */
-   public void setFileName(String fileName)
-   {
-     this.fileName = fileName;
-   }
-
-   /** Get the file Name.
-   *@return the string of file name.
-   */
-   public String getFileName()
-   {
-     return fileName;
-   }
-
-  /** Get the binary length.
-  *@return the length in bytes.
-  */
-  public long getBinaryLength()
-  {
-    return binaryLength;
-  }
-
-  /** Remove a field.
-  *@param fieldName is the field name.
-  */
-  public void removeField(String fieldName)
-  {
-    fieldSet.remove(fieldName);
-    fields.remove(fieldName);
-    stringFields.remove(fieldName);
-    readerFields.remove(fieldName);
-    dateFields.remove(fieldName);
-  }
-  
-  /** Add/remove a multivalue date field.
-  *@param fieldName is the field name.
-  *@param fieldData is the multi-valued data (an array of Dates).  Null means
-  * to remove the entry.
-  */
-  public void addField(String fieldName, Date[] fieldData)
-    throws ManifoldCFException
-  {
-    if (fieldData == null)
-    {
-      fieldSet.remove(fieldName);
-      fields.remove(fieldName);
-      stringFields.remove(fieldName);
-      readerFields.remove(fieldName);
-      dateFields.remove(fieldName);
-    }
-    else
-    {
-      fieldSet.add(fieldName);
-      fields.put(fieldName,fieldData);
-      stringFields.remove(fieldName);
-      readerFields.remove(fieldName);
-      dateFields.put(fieldName,fieldData);
-    }
-  }
-  
-  /** Add/remove a date field.
-  *@param fieldName is the field name.
-  *@param fieldData is the single-valued data (a Date).  Null means "no value".
-  */
-  public void addField(String fieldName, Date fieldData)
-    throws ManifoldCFException
-  {
-    if (fieldData == null)
-      addField(fieldName, (Date[])null);
-    else
-      addField(fieldName,new Date[]{fieldData});
-  }
-
-  /** Add/remove a multivalue character field.
-  * Data is described here by an array of Readers (which are expected to be processed),
-  * These Readers MUST BE CLOSED BY THE CALLER when the repository document instance has been ingested.
-  * The Readers also WILL NOT ever be reset; they are read to the end once only.
-  *@param fieldName is the field name.
-  *@param fieldData is the multi-valued data (as an array of Readers).  Null means
-  * to remove the entry from the document.
-  */
-  public void addField(String fieldName, Reader[] fieldData)
-    throws ManifoldCFException
-  {
-    if (fieldData == null)
-    {
-      fieldSet.remove(fieldName);
-      fields.remove(fieldName);
-      stringFields.remove(fieldName);
-      readerFields.remove(fieldName);
-      dateFields.remove(fieldName);
-    }
-    else
-    {
-      fieldSet.add(fieldName);
-      fields.put(fieldName,fieldData);
-      stringFields.remove(fieldName);
-      readerFields.put(fieldName,fieldData);
-      dateFields.remove(fieldName);
-    }
-  }
-
-  /** Add/remove a character field.
-  * Data is described here by a Reader (which is expected to be processed),
-  * This Reader MUST BE CLOSED BY THE CALLER when the repository document instance has been ingested.
-  * The Reader also WILL NOT ever be reset; it is read to the end once only.
-  *@param fieldName is the field name.
-  *@param fieldData is the single-valued data (as a Reader).  Null means "no value".
-  */
-  public void addField(String fieldName, Reader fieldData)
-    throws ManifoldCFException
-  {
-    if (fieldData == null)
-      addField(fieldName, (Reader[])null);
-    else
-      addField(fieldName,new Reader[]{fieldData});
-  }
-
-  /** Add/Remove a multivalue character field.
-  *@param fieldName is the field name.
-  *@param fieldData is the multi-valued data (as a an array of Strings).  Null means
-  * to remove the entry from the document.
-  */
-  public void addField(String fieldName, String[] fieldData)
-    throws ManifoldCFException
-  {
-    if (fieldData == null)
-    {
-      fieldSet.remove(fieldName);
-      fields.remove(fieldName);
-      stringFields.remove(fieldName);
-      readerFields.remove(fieldName);
-      dateFields.remove(fieldName);
-    }
-    else
-    {
-      fieldSet.add(fieldName);
-      fields.put(fieldName,fieldData);
-      readerFields.remove(fieldName);
-      stringFields.put(fieldName,fieldData);
-      dateFields.remove(fieldName);
-    }
-  }
-
-  /** Add a character field.
-  *@param fieldName is the field name.
-  *@param fieldData is the single-valued data (as a String).  Null means "no value".
-  */
-  public void addField(String fieldName, String fieldData)
-    throws ManifoldCFException
-  {
-    if (fieldData == null)
-      addField(fieldName,(String[])null);
-    else
-      addField(fieldName,new String[]{fieldData});
-  }
-
-  /** Get a field.
-  *@param fieldName is the field name.
-  *@return the field data (either a Reader array or a String array).
-  */
-  public Object[] getField(String fieldName)
-  {
-    return (Object[])fields.get(fieldName);
-  }
-
-  /** Get a field as an array of strings.  If the data was originally in the form
-  * of Readers, a one-time conversion is made to the String form, so that the same
-  * field can be fetched multiple times.  If the data was originally in the form
-  * of Dates, then the dates are converted to standard ISO8601 format.
-  *@param fieldName is the field name.
-  *@return the field data.
-  */
-  public String[] getFieldAsStrings(String fieldName)
-    throws IOException
-  {
-    String[] stringFieldData = stringFields.get(fieldName);
-    if (stringFieldData != null)
-      return stringFieldData;
-    Date[] dateFieldData = dateFields.get(fieldName);
-    if (dateFieldData != null)
-    {
-      String[] newValues = new String[dateFieldData.length];
-      for (int i = 0; i < dateFieldData.length; i++)
-      {
-        newValues[i] = DateParser.formatISO8601Date(dateFieldData[i]);
-      }
-      return newValues;
-    }
-    Reader[] oldValues = readerFields.get(fieldName);
-    if (oldValues != null)
-    {
-      String[] newValues = new String[oldValues.length];
-      char[] buffer = new char[65536];
-      for (int i = 0; i < newValues.length; i++)
-      {
-        Reader oldValue = oldValues[i];
-        StringBuilder newValue = new StringBuilder();
-        while (true)
-        {
-          int amt = oldValue.read(buffer);
-          if (amt == -1)
-            break;
-          newValue.append(buffer,0,amt);
-        }
-        newValues[i] = newValue.toString();
-      }
-      stringFields.put(fieldName,newValues);
-      // Reader is no longer useful, since we've read it to the end.
-      // Remove it from the record accordingly.
-      // NOTE WELL: This could cause side effects if the same
-      // field is accessed simultaneously two different ways!
-      readerFields.remove(fieldName);
-      fields.put(fieldName,newValues);
-      return newValues;
-    }
-    else
-      return null;
-  }
-
-  /** Get a field as an array of Readers.  If the field was originally
-  * strings, a one-time creation of a Readers array is made.
-  *@param fieldName is the field name.
-  *@return the field data.
-  */
-  public Reader[] getFieldAsReaders(String fieldName)
-  {
-    Reader[] readerFieldData = readerFields.get(fieldName);
-    if (readerFieldData != null)
-      return readerFieldData;
-    Date[] dateFieldData = dateFields.get(fieldName);
-    if (dateFieldData != null)
-    {
-      Reader[] newValues = new Reader[dateFieldData.length];
-      for (int i = 0; i < newValues.length; i++)
-      {
-        newValues[i] = new StringReader(DateParser.formatISO8601Date(dateFieldData[i]));
-      }
-      readerFields.put(fieldName,newValues);
-      return newValues;
-    }
-    String[] oldValues = stringFields.get(fieldName);
-    if (oldValues != null)
-    {
-      Reader[] newValues = new Reader[oldValues.length];
-      for (int i = 0; i < newValues.length; i++)
-      {
-        newValues[i] = new StringReader(oldValues[i]);
-      }
-      readerFields.put(fieldName,newValues);
-      return newValues;
-    }
-    else
-      return null;
-  }
-
-  /** Get field as an array of Date objects.
-  * If the field was originally not a Date field, null is returned.
-  *@param fieldName is the field name.
-  *@return the field data.
-  */
-  public Date[] getFieldAsDates(String fieldName)
-  {
-    return dateFields.get(fieldName);
-  }
-  
-  /** Get the number of fields.
-  */
-  public int fieldCount()
-  {
-    return fieldSet.size();
-  }
-
-  /** Iterate through the field name Strings.
-  */
-  public Iterator<String> getFields()
-  {
-    return fieldSet.iterator();
-  }
-
-  /** This class describes allow and deny tokens for a specific security class. */
-  protected static class Security
-  {
-    /** Allow tokens */
-    protected String[] tokens = null;
-    /** Deny tokens */
-    protected String[] denyTokens = null;
-
-    /** Constructor. */
-    public Security()
-    {
-    }
-
-    /** Set allow tokens. */
-    public void setACL(String[] tokens)
-    {
-      this.tokens = tokens;
-    }
-
-    /** Get allow tokens */
-    public String[] getACL()
-    {
-      return tokens;
-    }
-
-    /** Set deny tokens */
-    public void setDenyACL(String[] tokens)
-    {
-      denyTokens = tokens;
-    }
-
-    /** Get deny tokens */
-    public String[] getDenyACL()
-    {
-      return denyTokens;
-    }
-  }
-
-}
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ServiceInterruption.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ServiceInterruption.java
deleted file mode 100644
index 47c43ac..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/ServiceInterruption.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $Id: ServiceInterruption.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This is an exception that means that service was interrupted.  The exception contains
-* a description of when the service may be restored.
-*/
-public class ServiceInterruption extends java.lang.Exception
-{
-  public static final String _rcsid = "@(#)$Id: ServiceInterruption.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the time (in milliseconds since epoch) when to retry the request. */
-  protected long retryTime;
-  /** This is the time (in milliseconds since epoch) to FAIL if no successful read has yet occurred. */
-  protected long failTime;
-  /** This is the number of retries to permit before FAIL. -1 means infinite. */
-  protected int failRetryCount;
-  /** Should we abort the process if failure condition has been reached? */
-  protected boolean abortOnFail;
-  /** True if job inactive abort. */
-  protected boolean jobInactiveAbort;
-  
-  /** Constructor.
-  *@param message is the exact error condition.
-  *@param retryTime is the time to retry.
-  */
-  public ServiceInterruption(String message, long retryTime)
-  {
-    this(message, retryTime, false);
-  }
-  
-  /** Constructor.
-  *@param message is the exact error condition.
-  *@param retryTime is the time to retry.
-  *@param jobInactiveAbort is true if this exception being thrown because the job is aborting
-  */
-  public ServiceInterruption(String message, long retryTime, boolean jobInactiveAbort)
-  {
-    super(message);
-    this.retryTime = retryTime;
-    this.failTime = -1L;
-    this.failRetryCount = -1;
-    this.abortOnFail = true;
-    this.jobInactiveAbort = jobInactiveAbort;
-  }
-
-  /** Constructor.
-  *@param message is the exact error condition.
-  *@param failureCause is an exception that should be reported if it is decided to abort the process.
-  *@param retryTime is the time to retry.
-  *@param failTime is the time to fail.
-  *@param failRetryCount is the number of times to retry before declaring failure.
-  *@param abortOnFail signals what to do if failure.  Setting this to "true" will cause whatever process incurred the
-  * service interruption to stop immediately, if failure condition has been reached.
-  */
-  public ServiceInterruption(String message, Throwable failureCause, long retryTime, long failTime, int failRetryCount,
-    boolean abortOnFail)
-  {
-    super(message,failureCause);
-    this.retryTime = retryTime;
-    this.failTime = failTime;
-    this.failRetryCount = failRetryCount;
-    this.abortOnFail = abortOnFail;
-  }
-
-  /** Get the retry time.
-  *@return the retry time.
-  */
-  public long getRetryTime()
-  {
-    return retryTime;
-  }
-
-  /** Get the fail time.
-  *@return the fail time.  Returns -1L if there is no fail time.
-  */
-  public long getFailTime()
-  {
-    return failTime;
-  }
-
-  /** Get the number of error iterations needed before failure should be declared.
-  *@return the count, -1 if infinite.
-  */
-  public int getFailRetryCount()
-  {
-    return failRetryCount;
-  }
-
-  /** On failure, should we abort?
-  *@return true if abort is requested when failure is declared.
-  */
-  public boolean isAbortOnFail()
-  {
-    return abortOnFail;
-  }
-
-  /** Check if this service interruption is due to a job aborting.
-  *@return true if yes
-  */
-  public boolean jobInactiveAbort()
-  {
-    return jobInactiveAbort;
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectionManagerFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectionManagerFactory.java
deleted file mode 100644
index 23a349a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectionManagerFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.util.*;
-
-/** Transformation connection manager factory.
-*/
-public class TransformationConnectionManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_TransformationConnectionMgr_";
-
-  private TransformationConnectionManagerFactory()
-  {
-  }
-
-  /** Make a transformation connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static ITransformationConnectionManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof ITransformationConnectionManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.agents.transformationconnection.TransformationConnectionManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (ITransformationConnectionManager)o;
-  }
-
-  /** Compile a list of all pertinent activities, across all existing transformation connections.
-  *@param tc is the thread context.
-  *@return the sorted list of transformation connection activities.
-  */
-  public static String[] getAllTransformationActivities(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    ITransformationConnectionManager manager = make(tc);
-    ITransformationConnection[] connections = manager.getAllConnections();
-    Set<String> map = new HashSet<String>();
-    for (ITransformationConnection connection : connections)
-    {
-      String connectionName = connection.getName();
-      String[] activities = TransformationConnectorFactory.getActivitiesList(tc,connection.getClassName());
-      if (activities != null)
-      {
-        for (String baseActivity : activities)
-        {
-          String activity = ManifoldCF.qualifyTransformationActivityName(baseActivity, connectionName);
-          map.add(activity);
-        }
-      }
-    }
-    String[] rval = new String[map.size()];
-    int i = 0;
-    Iterator<String> iter = map.iterator();
-    while (iter.hasNext())
-    {
-      rval[i++] = iter.next();
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorFactory.java
deleted file mode 100644
index 2ade575..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorFactory.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This is the factory class for ITransformationConnector objects.
-*/
-public class TransformationConnectorFactory extends ConnectorFactory<ITransformationConnector>
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Static factory
-  protected final static TransformationConnectorFactory thisFactory = new TransformationConnectorFactory();
-
-  protected TransformationConnectorFactory()
-  {
-  }
-
-  @Override
-  protected boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException
-  {
-    ITransformationConnectorManager connMgr = TransformationConnectorManagerFactory.make(tc);
-    return connMgr.isInstalled(className);
-  }
-  
-  /** Get the activities supported by this connector.
-  *@param className is the class name.
-  *@return the list of activities.
-  */
-  public String[] getThisActivitiesList(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    ITransformationConnector connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return null;
-    String[] values = connector.getActivitiesList();
-    java.util.Arrays.sort(values);
-    return values;
-  }
-
-  /** Install connector.
-  *@param className is the class name.
-  */
-  public static void install(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.installThis(threadContext,className);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  public static void deinstall(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.deinstallThis(threadContext,className);
-  }
-
-  /** Get the activities supported by this connector.
-  *@param className is the class name.
-  *@return the list of activities.
-  */
-  public static String[] getActivitiesList(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisActivitiesList(threadContext,className);
-  }
-
-  /** Output the configuration header section.
-  */
-  public static void outputConfigurationHeader(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationHeader(threadContext,className,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  public static void outputConfigurationBody(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationBody(threadContext,className,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  public static String processConfigurationPost(IThreadContext threadContext, String className,
-    IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    return thisFactory.processThisConfigurationPost(threadContext,className,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  public static void viewConfiguration(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.viewThisConfiguration(threadContext,className,out,locale,configParams);
-  }
-
-  /** Get an output connector instance, without checking for installed connector.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  public static ITransformationConnector getConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorNoCheck(className);
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorManagerFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorManagerFactory.java
deleted file mode 100644
index 7173c07..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.*;
-
-/** Factory for transformation connector manager.
-*/
-public class TransformationConnectorManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected static final String connMgr = "_TransformationConnectorManager_";
-
-  private TransformationConnectorManagerFactory()
-  {
-  }
-
-  /** Construct an output connector manager.
-  *@param tc is the thread context.
-  *@return the output connector manager handle.
-  */
-  public static ITransformationConnectorManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof ITransformationConnectorManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.agents.transformationconnmgr.TransformationConnectorManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (ITransformationConnectorManager)o;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorPoolFactory.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorPoolFactory.java
deleted file mode 100644
index 06ad01a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/TransformationConnectorPoolFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.util.*;
-
-/** Transformation connector pool manager factory.
-*/
-public class TransformationConnectorPoolFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_TransformationConnectorPoolMgr_";
-
-  private TransformationConnectorPoolFactory()
-  {
-  }
-
-  /** Make a transformation connector pool handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static ITransformationConnectorPool make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof ITransformationConnectorPool))
-    {
-      o = new org.apache.manifoldcf.agents.transformationconnectorpool.TransformationConnectorPool(tc);
-      tc.save(objectName,o);
-    }
-    return (ITransformationConnectorPool)o;
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java
deleted file mode 100644
index 29e94d9..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/* $Id: BaseOutputConnector.java 998081 2010-09-17 11:33:15Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.output;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This base class describes an instance of a connection between an output pipeline and the Connector Framework.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connectors are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.
-*
-*/
-public abstract class BaseOutputConnector extends org.apache.manifoldcf.core.connector.BaseConnector implements IOutputConnector
-{
-  public static final String _rcsid = "@(#)$Id: BaseOutputConnector.java 998081 2010-09-17 11:33:15Z kwright $";
-
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[0];
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-  /** Notify the connector of a completed job.
-  * This is meant to allow the connector to flush any internal data structures it has been keeping around, or to tell the output repository that this
-  * is a good time to synchronize things.  It is called whenever a job is either completed or aborted.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void noteJobComplete(IOutputNotifyActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // The base implementation does nothing here.
-  }
-
-  /** Detect if a document date is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param date is the date of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the document with that date can be accepted by this connector.
-  */
-  @Override
-  public boolean checkDateIndexable(VersionContext pipelineDescription, Date date, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return true;
-  }
-
-  /** Detect if a mime type is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param mimeType is the mime type of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the mime type can be accepted by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext pipelineDescription, String mimeType, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return true;
-  }
-
-  /** Pre-determine whether a document (passed here as a File object) is acceptable or not.  This method is
-  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-  * search engines that only handle a small set of accepted file types.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param localFile is the local file to check.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkDocumentIndexable(VersionContext pipelineDescription, File localFile, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return true;
-  }
-
-  /** Pre-determine whether a document's length is acceptable.  This method is used
-  * to determine whether to fetch a document in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param length is the length of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkLengthIndexable(VersionContext pipelineDescription, long length, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return true;
-  }
-
-  /** Pre-determine whether a document's URL is acceptable.  This method is used
-  * to help filter out documents that cannot be indexed in advance.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param url is the URL of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkURLIndexable(VersionContext pipelineDescription, String url, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return true;
-  }
-
-  /** Get a pipeline version string, given a pipeline specification object.  The version string is used to
-  * uniquely describe the pertinent details of the specification and the configuration, to allow the Connector 
-  * Framework to determine whether a document will need to be processed again.
-  * Note that the contents of any document cannot be considered by this method; only configuration and specification information
-  * can be considered.
-  *
-  * This method presumes that the underlying connector object has been configured.
-  *@param spec is the current pipeline specification object for this connection for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes configuration and specification in such a way that
-  * if two such strings are equal, nothing that affects how or whether the document is indexed will be different.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return new VersionContext("",params,spec);
-  }
-  
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param pipelineDescription includes the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  /** Remove a document using the connector.
-  * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the last description string that was constructed for this document by the getOutputDescription() method above.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  */
-  @Override
-  public void removeDocument(String documentURI, String outputDescription, IOutputRemoveActivity activities)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Does nothing in the base class
-  }
-  
-  /** Notify the connector that all records associated with this connection have been removed.
-  * This method allows the connector to remove any internal data storage that is associated with records sent to the index on
-  * behalf of a connection. It should not attempt to communicate with the output index.
-  */
-  @Override
-  public void noteAllRecordsRemoved()
-    throws ManifoldCFException
-  {
-    // Does nothing in the base class
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing output specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected an output connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected an output connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-  }
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the output specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the output specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current output specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-  }
-  
-}
-
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnection.java
deleted file mode 100644
index 619b36a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* $Id: OutputConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.outputconnection;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-/** An instance of this class represents a persistently-stored output connection description.
-* This is the paper object meant for editing and manipulation.
-*/
-public class OutputConnection implements IOutputConnection
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-  protected String className = null;
-  protected ConfigParams configParams = new ConfigParams();
-  protected int maxCount = 100;
-
-  /** Constructor.
-  */
-  public OutputConnection()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public OutputConnection duplicate()
-  {
-    OutputConnection rval = new OutputConnection();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    rval.className = className;
-    rval.maxCount = maxCount;
-    rval.configParams = configParams.duplicate();
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-  
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className)
-  {
-    this.className = className;
-  }
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName()
-  {
-    return className;
-  }
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams()
-  {
-    return configParams;
-  }
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount)
-  {
-    this.maxCount = maxCount;
-  }
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections()
-  {
-    return maxCount;
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java
deleted file mode 100644
index ebc0505..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java
+++ /dev/null
@@ -1,801 +0,0 @@
-/* $Id: OutputConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.outputconnection;
-
-import java.util.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-
-/** This class is the manager of the outputconnection description.  Inside, a database table is managed,
-* with appropriate caching.
-* Note well: The database handle is instantiated here using the DBInterfaceFactory.  This is acceptable because the
-* actual database that this table is located in is fixed.
-* 
-* <br><br>
-* <b>outputconnections</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>connectionname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
-* <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>classname</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>maxcount</td><td>BIGINT</td><td></td></tr>
-* <tr><td>configxml</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class OutputConnectionManager extends org.apache.manifoldcf.core.database.BaseTable implements IOutputConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Special field suffix
-  private final static String passwordSuffix = "password";
-
-  // Database fields
-  protected final static String nameField = "connectionname";
-  protected final static String descriptionField = "description";
-  protected final static String classNameField = "classname";
-  protected final static String maxCountField = "maxcount";
-  protected final static String configField = "configxml";
-
-  // Cache manager
-  protected final ICacheManager cacheManager;
-  // Thread context
-  protected final IThreadContext threadContext;
-  // Lock manager
-  protected final ILockManager lockManager;
-  
-  protected final static String outputsLock = "OUTPUTS_LOCK";
-  
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public OutputConnectionManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"outputconnections");
-
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always have an outer loop, in case retries required
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the "objects" table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(maxCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(configField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code, if needed, goes here.
-      }
-
-      // Index management
-      IndexDescription classIndex = new IndexDescription(false,new String[]{classNameField});
-      
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (classIndex != null && id.equals(classIndex))
-          classIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (classIndex != null)
-        performAddIndex(null,classIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,1);
-    // Get the authority list
-    IOutputConnection[] list = getAllConnections();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual repository connection info
-    int i = 0;
-    while (i < list.length)
-    {
-      IOutputConnection conn = list[i++];
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-      ManifoldCF.writeString(os,conn.getClassName());
-      ManifoldCF.writeString(os,conn.getConfigParams().toXML());
-      ManifoldCF.writeDword(os,conn.getMaxConnections());
-    }
-  }
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version != 1)
-      throw new java.io.IOException("Unknown output connection configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    int i = 0;
-    while (i < count)
-    {
-      IOutputConnection conn = create();
-      conn.setName(ManifoldCF.readString(is));
-      conn.setDescription(ManifoldCF.readString(is));
-      conn.setClassName(ManifoldCF.readString(is));
-      conn.getConfigParams().fromXML(ManifoldCF.readString(is));
-      conn.setMaxConnections(ManifoldCF.readDword(is));
-      // Attempt to save this connection
-      save(conn);
-      i++;
-    }
-  }
-
-  /** Obtain a list of the output connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public IOutputConnection[] getAllConnections()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(outputsLock);
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getOutputConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(outputsLock);
-    }
-  }
-
-  /** Load an output connection by name.
-  *@param name is the name of the output connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public IOutputConnection load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  protected final static int FETCH_MAX = 200;
-
-  /** Load multiple output connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  public IOutputConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    IOutputConnection[] rval = new IOutputConnection[names.length];
-    if (names.length == 0)
-      return rval;
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (names.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,names,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,names,inputIndex,names.length-inputIndex);
-    return rval;
-  }
-  
-  protected int loadMultipleInternal(IOutputConnection[] rval, int outputIndex, String[] fetchNames, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    OutputConnectionDescription[] objectDescriptions = new OutputConnectionDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      ssb.clear();
-      String name = fetchNames[inputIndex + i];
-      ssb.add(getOutputConnectionKey(name));
-      objectDescriptions[i] = new OutputConnectionDescription(name,new StringSet(ssb));
-    }
-
-    OutputConnectionExecutor exec = new OutputConnectionExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    IOutputConnection[] results = exec.getResults();
-    for (IOutputConnection result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Create a new output connection object.
-  *@return the new object.
-  */
-  public IOutputConnection create()
-    throws ManifoldCFException
-  {
-    OutputConnection rval = new OutputConnection();
-    return rval;
-  }
-
-  /** Save an output connection object.
-  *@param object is the object to save.
-  *@return true if the object is being created, false otherwise.
-  */
-  public boolean save(IOutputConnection object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getOutputConnectionsKey());
-    ssb.add(getOutputConnectionKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      // Catch deadlock condition
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(outputsLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              // Notify of a change to the configuration
-              ManifoldCF.noteConfigurationChange();
-              boolean isNew = object.getIsNew();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,object.getDescription());
-              values.put(classNameField,object.getClassName());
-              values.put(maxCountField,new Long((long)object.getMaxConnections()));
-              String configXML = object.getConfigParams().toXML();
-              values.put(configField,configXML);
-              boolean notificationNeeded = false;
-              boolean isCreated;
-              
-              if (set.getRowCount() > 0)
-              {
-                // If the object is supposedly new, it is bad that we found one that already exists.
-                if (isNew)
-                  throw new ManifoldCFException("Output connection '"+object.getName()+"' already exists");
-                isCreated = false;
-                IResultRow row = set.getRow(0);
-                String oldXML = (String)row.getValue(configField);
-                if (oldXML == null || !oldXML.equals(configXML))
-                  notificationNeeded = true;
-
-                // Update
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(nameField,object.getName())});
-                performUpdate(values," WHERE "+query,params,null);
-              }
-              else
-              {
-                // If the object is not supposed to be new, it is bad that we did not find one.
-                if (!isNew)
-                  throw new ManifoldCFException("Output connection '"+object.getName()+"' no longer exists");
-                isCreated = true;
-                // Insert
-                values.put(nameField,object.getName());
-                // We only need the general key because this is new.
-                performInsert(values,null);
-              }
-              
-              // If notification required, do it.
-              if (notificationNeeded)
-                AgentManagerFactory.noteOutputConnectionChange(threadContext,object.getName());
-
-              cacheManager.invalidateKeys(ch);
-              return isCreated;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(outputsLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete an output connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getOutputConnectionsKey());
-    ssb.add(getOutputConnectionKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-    lockManager.enterNonExWriteLock(outputsLock);
-    try
-    {
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-        beginTransaction();
-        try
-        {
-          // Check if anything refers to this connection name
-          if (AgentManagerFactory.isOutputConnectionInUse(threadContext,name))
-            throw new ManifoldCFException("Can't delete output connection '"+name+"': existing entities refer to it");
-          ManifoldCF.noteConfigurationChange();
-          ArrayList params = new ArrayList();
-          String query = buildConjunctionClause(params,new ClauseDescription[]{
-            new UnitaryClause(nameField,name)});
-          performDelete("WHERE "+query,params,null);
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(outputsLock);
-    }
-  }
-
-  /** Get a list of output connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the repository connections that use that connector.
-  */
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getOutputConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(classNameField,className)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(nameField);
-      i++;
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getOutputConnectionKey(name));
-      StringSet localCacheKeys = new StringSet(ssb);
-      ArrayList params = new ArrayList();
-      String query = buildConjunctionClause(params,new ClauseDescription[]{
-        new UnitaryClause(nameField,name)});
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName()+" WHERE "+query,params,
-        localCacheKeys,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("No such connection: '"+name+"'");
-      IResultRow row = set.getRow(0);
-      String className = (String)row.getValue(classNameField);
-      IOutputConnectorManager cm = OutputConnectorManagerFactory.make(threadContext);
-      return cm.isInstalled(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  // Schema related
-  /** Return the name column.
-  *@return the name column.
-  */
-  public String getConnectionNameColumn()
-  {
-    return nameField;
-  }
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // output connections.
-
-  /** Construct a key which represents the general list of output connectors.
-  *@return the cache key.
-  */
-  protected static String getOutputConnectionsKey()
-  {
-    return CacheKeyFactory.makeOutputConnectionsKey();
-  }
-
-  /** Construct a key which represents an individual output connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getOutputConnectionKey(String connectionName)
-  {
-    return CacheKeyFactory.makeOutputConnectionKey(connectionName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple output connections at a single time.
-  *@param connectionNames are a list of connection names.
-  *@return the corresponding output connection objects.
-  */
-  protected OutputConnection[] getOutputConnectionsMultiple(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    OutputConnection[] rval = new OutputConnection[connectionNames.length];
-    HashMap returnIndex = new HashMap();
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(connectionNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetOutputConnectionsChunk();
-      while (i < connectionNames.length)
-      {
-        if (j == maxIn)
-        {
-          getOutputConnectionsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(connectionNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getOutputConnectionsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Calculate max number of clauses to send to getOutputConnectionsChunk.
-  */
-  protected int maxClauseGetOutputConnectionsChunk()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Read a chunk of output connections.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getOutputConnectionsChunk(OutputConnection[] rval, Map returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = ((Integer)returnIndex.get(name)).intValue();
-      OutputConnection rc = new OutputConnection();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rc.setClassName((String)row.getValue(classNameField));
-      rc.setMaxConnections((int)((Long)row.getValue(maxCountField)).longValue());
-      String xml = (String)row.getValue(configField);
-      if (xml != null && xml.length() > 0)
-        rc.getConfigParams().fromXML(xml);
-      rval[index] = rc;
-    }
-
-  }
-
-  // The cached instance will be an OutputConnection.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for an output connection object.
-  */
-  protected static class OutputConnectionDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String connectionName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public OutputConnectionDescription(String connectionName, StringSet invKeys)
-    {
-      super("outputconnectioncache");
-      this.connectionName = connectionName;
-      criticalSectionName = getClass().getName()+"-"+connectionName;
-      cacheKeys = invKeys;
-    }
-
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-
-    public int hashCode()
-    {
-      return connectionName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof OutputConnectionDescription))
-        return false;
-      OutputConnectionDescription d = (OutputConnectionDescription)o;
-      return d.connectionName.equals(connectionName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating output connection objects.
-  */
-  protected static class OutputConnectionExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected OutputConnectionManager thisManager;
-    protected OutputConnection[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the OutputConnectionManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public OutputConnectionExecutor(OutputConnectionManager manager, OutputConnectionDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new OutputConnection[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getConnectionName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public OutputConnection[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      String[] connectionNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < connectionNames.length)
-      {
-        OutputConnectionDescription desc = (OutputConnectionDescription)objectDescriptions[i];
-        connectionNames[i] = desc.getConnectionName();
-        i++;
-      }
-
-      return thisManager.getOutputConnectionsMultiple(connectionNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      OutputConnectionDescription objectDesc = (OutputConnectionDescription)objectDescription;
-      OutputConnection ci = (OutputConnection)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getConnectionName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnectorpool/OutputConnectorPool.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnectorpool/OutputConnectorPool.java
deleted file mode 100644
index 7d3e039..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnectorpool/OutputConnectorPool.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.outputconnectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An implementation of IOutputConnectorPool.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public class OutputConnectorPool implements IOutputConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Local connector pool */
-  protected final static LocalPool localPool = new LocalPool();
-
-  /** Thread context */
-  protected final IThreadContext threadContext;
-  
-  /** Constructor */
-  public OutputConnectorPool(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get multiple output connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param outputConnections are the connections to use the build the connector instances.
-  */
-  @Override
-  public IOutputConnector[] grabMultiple(String[] orderingKeys, IOutputConnection[] outputConnections)
-    throws ManifoldCFException
-  {
-    // For now, use the OutputConnectorFactory method.  This will require us to extract info
-    // from each output connection, however.
-    String[] connectionNames = new String[outputConnections.length];
-    String[] classNames = new String[outputConnections.length];
-    ConfigParams[] configInfos = new ConfigParams[outputConnections.length];
-    int[] maxPoolSizes = new int[outputConnections.length];
-    
-    for (int i = 0; i < outputConnections.length; i++)
-    {
-      connectionNames[i] = outputConnections[i].getName();
-      classNames[i] = outputConnections[i].getClassName();
-      configInfos[i] = outputConnections[i].getConfigParams();
-      maxPoolSizes[i] = outputConnections[i].getMaxConnections();
-    }
-    return localPool.grabMultiple(threadContext,
-      orderingKeys, connectionNames, classNames, configInfos, maxPoolSizes);
-  }
-
-  /** Get an output connector.
-  * The connector is specified by an output connection object.
-  *@param outputConnection is the output connection to base the connector instance on.
-  */
-  @Override
-  public IOutputConnector grab(IOutputConnection outputConnection)
-    throws ManifoldCFException
-  {
-    return localPool.grab(threadContext, outputConnection.getName(), outputConnection.getClassName(),
-      outputConnection.getConfigParams(), outputConnection.getMaxConnections());
-  }
-
-  /** Release multiple output connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  @Override
-  public void releaseMultiple(IOutputConnection[] connections, IOutputConnector[] connectors)
-    throws ManifoldCFException
-  {
-    String[] connectionNames = new String[connections.length];
-    for (int i = 0; i < connections.length; i++)
-    {
-      connectionNames[i] = connections[i].getName();
-    }
-    localPool.releaseMultiple(threadContext, connectionNames, connectors);
-  }
-
-  /** Release an output connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  @Override
-  public void release(IOutputConnection connection, IOutputConnector connector)
-    throws ManifoldCFException
-  {
-    localPool.release(threadContext,connection.getName(),connector);
-  }
-
-  /** Idle notification for inactive output connector handles.
-  * This method polls all inactive handles.
-  */
-  @Override
-  public void pollAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.pollAllConnectors(threadContext);
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  @Override
-  public void flushUnusedConnectors()
-    throws ManifoldCFException
-  {
-    localPool.flushUnusedConnectors(threadContext);
-  }
-
-  /** Clean up all open output connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  @Override
-  public void closeAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.closeAllConnectors(threadContext);
-  }
-
-  /** Actual static output connector pool */
-  protected static class LocalPool extends org.apache.manifoldcf.core.connectorpool.ConnectorPool<IOutputConnector>
-  {
-    public LocalPool()
-    {
-      super("_OUTPUTCONNECTORPOOL_");
-    }
-    
-    @Override
-    protected boolean isInstalled(IThreadContext tc, String className)
-      throws ManifoldCFException
-    {
-      IOutputConnectorManager connectorManager = OutputConnectorManagerFactory.make(tc);
-      return connectorManager.isInstalled(className);
-    }
-
-    @Override
-    protected boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-      throws ManifoldCFException
-    {
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(tc);
-      return connectionManager.load(connectionName) != null;
-    }
-
-    public IOutputConnector[] grabMultiple(IThreadContext tc, String[] orderingKeys, String[] connectionNames, String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-      throws ManifoldCFException
-    {
-      return grabMultiple(tc,IOutputConnector.class,orderingKeys,connectionNames,classNames,configInfos,maxPoolSizes);
-    }
-
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnmgr/OutputConnectorManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnmgr/OutputConnectorManager.java
deleted file mode 100644
index fcc5fd4..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnmgr/OutputConnectorManager.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/* $Id: OutputConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.outputconnmgr;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.CacheKeyFactory;
-import java.util.*;
-
-/** Implementation of IOutputConnectorManager.
- * 
- * <br><br>
- * <b>outputconnectors</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class OutputConnectorManager extends org.apache.manifoldcf.core.database.BaseTable implements IOutputConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public OutputConnectorManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"outputconnectors");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always have an outer loop, in case upgrade needs it.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Schema upgrade goes here.
-      }
-
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    // First, go through all registered connectors.  This is all inside a transaction.
-    beginTransaction();
-    try
-    {
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        // Call the deinstall method
-        OutputConnectorFactory.deinstall(threadContext,className);
-      }
-      performDrop(invKeys);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      //performLock();
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(classNameField,className);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+classNameField+"=?",params,invKeys);
-      }
-
-      // Either way, we must do the install/upgrade itself.
-      OutputConnectorFactory.install(threadContext,className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the class name of the connector to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // Uninstall first
-      OutputConnectorFactory.deinstall(threadContext,className);
-
-      removeConnector(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+classNameField+" AS classname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    return row.getValue(descriptionField).toString();
-  }
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException
-  {
-    // Use the global table key; that's good enough because we don't expect stuff to change out from under very often.
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT * FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java
deleted file mode 100644
index 981202e..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-public class AgentsDaemon
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Agent shutdown signal name */
-  public static final String agentShutdownSignal = "_AGENTRUN_";
-  /** Agent service name prefix (followed by agent class name) */
-  public static final String agentServicePrefix = "AGENT_";
-
-  /** The agents thread, which starts and stops agents daemons to keep them consistent with the database, and
-  * also takes on process cleanup where necessary. */
-  protected AgentsThread agentsThread = null;
-
-  /** The idle cleanup thread. */
-  protected IdleCleanupThread idleCleanupThread = null;
-  
-  /** Process ID for this agents daemon. */
-  protected final String processID;
-  
-  /** This is the place we keep track of the agents we've started. */
-  protected final Map<String,IAgent> runningHash = new HashMap<String,IAgent>();
-  
-  // There are a number of different ways of running the agents framework.
-  // (1) Repeatedly call checkAgents(), and when all done make sure to call stopAgents().
-  // (2) Call registerAgentsShutdownHook(), then repeatedly run checkAgents(),  Agent shutdown happens on JVM exit.
-  // (3) Call runAgents(), which will wait for someone else to call assertAgentsShutdownSignal().  Before exit, stopAgents() must be called.
-  // (4) Call registerAgentsShutdownHook(), then call runAgents(), which will wait for someone else to call assertAgentsShutdownSignal().  Shutdown happens on JVM exit.
-  
-  /** Create an agents daemon object.
-  *@param processID is the process ID of this agents daemon.  Process ID's must be unique
-  * for all agents daemons.
-  */
-  public AgentsDaemon(String processID)
-  {
-    this.processID = processID;
-  }
-  
-  /** Assert shutdown signal for the current agents daemon.
-  */
-  public static void assertAgentsShutdownSignal(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.setGlobalFlag(agentShutdownSignal);
-  }
-  
-  /** Clear shutdown signal for the current agents daemon.
-  */
-  public static void clearAgentsShutdownSignal(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.clearGlobalFlag(agentShutdownSignal);
-  }
-
-
-  /** Register agents shutdown hook.
-  * Call this ONCE before calling startAgents or checkAgents the first time, if you want automatic cleanup of agents on JVM stop.
-  */
-  public void registerAgentsShutdownHook(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Create the shutdown hook for agents.  All activity will be keyed off of runningHash, so it is safe to do this under all conditions.
-    org.apache.manifoldcf.core.system.ManifoldCF.addShutdownHook(new AgentsShutdownHook());
-  }
-  
-  /** Run agents process.
-  * This method will not return until a shutdown signal is sent.
-  */
-  public void runAgents(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-
-    // Don't come up at all if shutdown signal in force
-    if (lockManager.checkGlobalFlag(agentShutdownSignal))
-      return;
-
-    // Create and start agents thread.
-    startAgents(threadContext);
-    
-    while (true)
-    {
-      // Any shutdown signal yet?
-      if (lockManager.checkGlobalFlag(agentShutdownSignal))
-        break;
-          
-      try
-      {
-        ManifoldCF.sleep(5000L);
-      }
-      catch (InterruptedException e)
-      {
-        break;
-      }
-    }
-    
-  }
-
-  /** Start agents thread for this agents daemon object.
-  */
-  public void startAgents(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Create idle cleanup thread.
-    idleCleanupThread = new IdleCleanupThread(processID);
-    agentsThread = new AgentsThread();
-    // Create and start agents thread.
-    idleCleanupThread.start();
-    agentsThread.start();
-  }
-  
-  /** Stop all started agents running under this agents daemon.
-  */
-  public void stopAgents(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Shut down agents background thread.
-    while (agentsThread != null || idleCleanupThread != null)
-    {
-      if (agentsThread != null)
-        agentsThread.interrupt();
-      if (idleCleanupThread != null)
-        idleCleanupThread.interrupt();
-      
-      if (agentsThread != null && !agentsThread.isAlive())
-        agentsThread = null;
-      if (idleCleanupThread != null && !idleCleanupThread.isAlive())
-        idleCleanupThread = null;
-    }
-    
-    // Shut down running agents services directly.
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    synchronized (runningHash)
-    {
-      // This is supposedly safe; iterator remove is used
-      Iterator<String> iter = runningHash.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String className = iter.next();
-        IAgent agent = runningHash.get(className);
-        // Stop it
-        agent.stopAgent(threadContext);
-        lockManager.endServiceActivity(getAgentsClassServiceType(className), processID);
-        iter.remove();
-        agent.cleanUp(threadContext);
-      }
-    }
-    // Done.
-    OutputConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
-    TransformationConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
-  }
-
-  protected static String getAgentsClassServiceType(String agentClassName)
-  {
-    return agentServicePrefix + agentClassName;
-  }
-  
-  /** Agents thread.  This runs in background until interrupted, at which point
-  * it shuts down.  Its responsibilities include cleaning up after dead processes,
-  * as well as starting newly-registered agent processes, and terminating ones that disappear.
-  */
-  protected class AgentsThread extends Thread
-  {
-    public AgentsThread()
-    {
-      super();
-      setName("Agents thread");
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        IThreadContext threadContext = ThreadContextFactory.make();
-        while (true)
-        {
-          try
-          {
-            if (Thread.currentThread().isInterrupted())
-              throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-            checkAgents(threadContext);
-            ManifoldCF.sleep(5000L);
-          }
-          catch (InterruptedException e)
-          {
-            break;
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              break;
-            if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-            {
-              System.err.println("Misconfigured ManifoldCF agents - shutting down");
-              Logging.agents.fatal("AgentThread configuration exception tossed: "+e.getMessage(),e);
-              System.exit(-200);
-            }
-            Logging.agents.error("Exception tossed: "+e.getMessage(),e);
-          }
-          catch (OutOfMemoryError e)
-          {
-            System.err.println("Agents process ran out of memory - shutting down");
-            e.printStackTrace(System.err);
-            System.exit(-200);
-          }
-          catch (Throwable e)
-          {
-            Logging.agents.fatal("Error tossed: "+e.getMessage(),e);
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        // Severe error on initialization
-        System.err.println("Agents process could not start - shutting down");
-        Logging.agents.fatal("AgentThread initialization error tossed: "+e.getMessage(),e);
-        System.exit(-300);
-      }
-    }
-  }
-
-  /** Start all not-running agents.
-  *@param threadContext is the thread context.
-  */
-  protected void checkAgents(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    // Get agent manager
-    IAgentManager manager = AgentManagerFactory.make(threadContext);
-    synchronized (runningHash)
-    {
-      String[] classes = manager.getAllAgents();
-      Set<String> currentAgentClasses = new HashSet<String>();
-
-      int i = 0;
-      while (i < classes.length)
-      {
-        String className = classes[i++];
-        if (runningHash.get(className) == null)
-        {
-          // Start this agent
-          IAgent agent = AgentFactory.make(className);
-          String serviceType = getAgentsClassServiceType(className);
-          agent.initialize(threadContext);
-          try
-          {
-            // Throw a lock, so that cleanup processes and startup processes don't collide.
-            lockManager.registerServiceBeginServiceActivity(serviceType, processID, new CleanupAgent(threadContext, agent, processID));
-            // There is a potential race condition where the agent has been started but hasn't yet appeared in runningHash.
-            // But having runningHash be the synchronizer for this activity will prevent any problems.
-            agent.startAgent(threadContext, processID);
-            // Successful!
-            runningHash.put(className,agent);
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() != ManifoldCFException.INTERRUPTED)
-            {
-              agent.cleanUp(threadContext);
-              lockManager.endServiceActivity(serviceType, processID);
-            }
-            throw e;
-          }
-        }
-        currentAgentClasses.add(className);
-      }
-
-      // Go through running hash and look for agents processes that have left
-      Iterator<String> runningAgentsIterator = runningHash.keySet().iterator();
-      while (runningAgentsIterator.hasNext())
-      {
-        String runningAgentClass = runningAgentsIterator.next();
-        if (!currentAgentClasses.contains(runningAgentClass))
-        {
-          // Shut down this one agent.
-          IAgent agent = runningHash.get(runningAgentClass);
-          // Stop it
-          agent.stopAgent(threadContext);
-          lockManager.endServiceActivity(getAgentsClassServiceType(runningAgentClass), processID);
-          runningAgentsIterator.remove();
-          agent.cleanUp(threadContext);
-        }
-      }
-    }
-
-    synchronized (runningHash)
-    {
-      // For every class we're supposed to be running, find registered but no-longer-active instances and clean
-      // up after them.
-      for (String agentsClass : runningHash.keySet())
-      {
-        IAgent agent = runningHash.get(agentsClass);
-        IServiceCleanup cleanup = new CleanupAgent(threadContext, agent, processID);
-        String agentsClassServiceType = getAgentsClassServiceType(agentsClass);
-        while (!lockManager.cleanupInactiveService(agentsClassServiceType, cleanup))
-        {
-          // Loop until no more inactive services
-        }
-      }
-    }
-    
-  }
-
-  /** Agent cleanup class.  This provides functionality to clean up after agents processes
-  * that have gone away, or initialize an entire cluster.
-  */
-  protected static class CleanupAgent implements IServiceCleanup
-  {
-    protected final IAgent agent;
-    protected final IThreadContext threadContext;
-    protected final String processID;
-
-    public CleanupAgent(IThreadContext threadContext, IAgent agent, String processID)
-    {
-      this.agent = agent;
-      this.threadContext = threadContext;
-      this.processID = processID;
-    }
-    
-    /** Clean up after the specified service.  This method will block any startup of the specified
-    * service for as long as it runs.
-    *@param serviceName is the name of the service.
-    */
-    @Override
-    public void cleanUpService(String serviceName)
-      throws ManifoldCFException
-    {
-      agent.cleanUpAgentData(threadContext, processID, serviceName);
-    }
-
-    /** Clean up after ALL services of the type on the cluster.
-    */
-    @Override
-    public void cleanUpAllServices()
-      throws ManifoldCFException
-    {
-      agent.cleanUpAllAgentData(threadContext, processID);
-    }
-    
-    /** Perform cluster initialization - that is, whatever is needed presuming that the
-    * cluster has been down for an indeterminate period of time, but is otherwise in a clean
-    * state.
-    */
-    @Override
-    public void clusterInit()
-      throws ManifoldCFException
-    {
-      agent.clusterInit(threadContext);
-    }
-
-  }
-  
-  /** Agents shutdown hook class */
-  protected class AgentsShutdownHook implements IShutdownHook
-  {
-
-    public AgentsShutdownHook()
-    {
-    }
-    
-    @Override
-    public void doCleanup(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      // Shutting down in this way must prevent startup from taking place.
-      stopAgents(threadContext);
-    }
-    
-  }
-  
-}
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java
deleted file mode 100644
index f74c01a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-/** This thread periodically calls the cleanup method in all connected output connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class IdleCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public IdleCleanupThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("Agents idle cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.agents.debug("Start up agents idle cleanup thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      // Get the output connector pool handle
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-      // Get the transformation connector pool handle
-      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-      
-      /* For HSQLDB debugging...
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-      */
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          /*
-          System.out.println("+++++++++");
-          IResultSet results = database.performQuery("SELECT * FROM information_schema.system_sessions",null,null,null);
-          for (int i = 0; i < results.getRowCount(); i++)
-          {
-            IResultRow row = results.getRow(i);
-            Iterator<String> iter = row.getColumns();
-            while (iter.hasNext())
-            {
-              String columnName = iter.next();
-              System.out.println(columnName+": "+row.getValue(columnName).toString());
-            }
-            System.out.println("--------");
-          }
-          System.out.println("++++++++++");
-          */
-          
-          // Do the cleanup
-          outputConnectorPool.pollAllConnectors();
-          transformationConnectorPool.pollAllConnectors();
-          // Poll all basic services
-          ManifoldCF.pollAll(threadContext);
-          
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.agents.error("Idle cleanup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.agents.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.agents.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.agents.fatal("IdleCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/Logging.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/Logging.java
deleted file mode 100644
index b1f4a88..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/Logging.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-import org.apache.log4j.Logger;
-
-/** This class furnishes the logging environment for the crawler application.
-*/
-public class Logging extends org.apache.manifoldcf.core.system.Logging
-{
-  public static final String _rcsid = "@(#)$Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Public logger objects
-  public static Logger agents = null;
-  public static Logger ingest = null;
-  public static Logger api = null;
-
-  /** Initialize logger setup.
-  */
-  public static synchronized void initializeLoggers()
-  {
-    org.apache.manifoldcf.core.system.Logging.initializeLoggers();
-
-    if (agents != null)
-      return;
-
-    // package loggers
-    agents = newLogger("org.apache.manifoldcf.agents");
-    ingest = newLogger("org.apache.manifoldcf.ingest");
-    api = newLogger("org.apache.manifoldcf.api");
-
-  }
-
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java
deleted file mode 100644
index aec150f..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/* $Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-public class ManifoldCF extends org.apache.manifoldcf.core.system.ManifoldCF
-{
-  public static final String _rcsid = "@(#)$Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public static final String agentShutdownSignal = "_AGENTRUN_";
-
-  // Agents initialized flag
-  protected static boolean agentsInitialized = false;
-  
-  /** Initialize environment.
-  */
-  public static void initializeEnvironment(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      // Do core initialization
-      org.apache.manifoldcf.core.system.ManifoldCF.initializeEnvironment(threadContext);
-      // Local initialization
-      org.apache.manifoldcf.agents.system.ManifoldCF.localInitialize(threadContext);
-    }
-  }
-
-  /** Clean up environment.
-  */
-  public static void cleanUpEnvironment(IThreadContext threadContext)
-  {
-    synchronized (initializeFlagLock)
-    {
-      org.apache.manifoldcf.agents.system.ManifoldCF.localCleanup(threadContext);
-      org.apache.manifoldcf.core.system.ManifoldCF.cleanUpEnvironment(threadContext);
-    }
-  }
-  
-  public static void localInitialize(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      if (agentsInitialized)
-        return;
-
-      // Initialize the local loggers
-      Logging.initializeLoggers();
-      Logging.setLogLevels(threadContext);
-      agentsInitialized = true;
-    }
-  }
-
-  public static void localCleanup(IThreadContext threadContext)
-  {
-    // Close all pools
-    try
-    {
-      OutputConnectorPoolFactory.make(threadContext).closeAllConnectors();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (Logging.agents != null)
-        Logging.agents.warn("Exception shutting down output connector pool: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Reset the environment.
-  */
-  public static void resetEnvironment(IThreadContext threadContext)
-  {
-    synchronized (initializeFlagLock)
-    {
-      org.apache.manifoldcf.core.system.ManifoldCF.resetEnvironment(threadContext);
-    }
-  }
-
-  /** Install the agent tables.  This is also responsible for upgrading the existing
-  * tables!!!
-  *@param threadcontext is the thread context.
-  */
-  public static void installTables(IThreadContext threadcontext)
-    throws ManifoldCFException
-  {
-    IAgentManager mgr = AgentManagerFactory.make(threadcontext);
-    IIncrementalIngester igstmgr = IncrementalIngesterFactory.make(threadcontext);
-    IOutputConnectorManager outputConnMgr = OutputConnectorManagerFactory.make(threadcontext);
-    IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadcontext);
-    ITransformationConnectorManager transConnMgr = TransformationConnectorManagerFactory.make(threadcontext);
-    ITransformationConnectionManager transConnectionManager = TransformationConnectionManagerFactory.make(threadcontext);
-    mgr.install();
-    outputConnMgr.install();
-    outputConnectionManager.install();
-    transConnMgr.install();
-    transConnectionManager.install();
-    igstmgr.install();
-  }
-
-  /** Uninstall all the crawler system tables.
-  *@param threadcontext is the thread context.
-  */
-  public static void deinstallTables(IThreadContext threadcontext)
-    throws ManifoldCFException
-  {
-    IAgentManager mgr = AgentManagerFactory.make(threadcontext);
-    IIncrementalIngester igstmgr = IncrementalIngesterFactory.make(threadcontext);
-    IOutputConnectorManager outputConnMgr = OutputConnectorManagerFactory.make(threadcontext);
-    IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadcontext);
-    ITransformationConnectorManager transConnMgr = TransformationConnectorManagerFactory.make(threadcontext);
-    ITransformationConnectionManager transConnectionManager = TransformationConnectionManagerFactory.make(threadcontext);
-    igstmgr.deinstall();
-    transConnectionManager.deinstall();
-    transConnMgr.deinstall();
-    outputConnectionManager.deinstall();
-    outputConnMgr.deinstall();
-    mgr.deinstall();
-  }
-
-  /** Signal output connection needs redoing.
-  * This is called when something external changed on an output connection, and
-  * therefore all associated documents must be reindexed.
-  *@param threadContext is the thread context.
-  *@param connectionName is the connection name.
-  */
-  public static void signalOutputConnectionRedo(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    // Blow away the incremental ingestion table first
-    IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-    IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
-    ingester.resetOutputConnection(outputConnectionManager.load(connectionName));
-    // Now, signal to all agents that the output connection configuration has changed.  Do this second, so that there cannot be documents
-    // resulting from this signal that find themselves "unchanged".
-    AgentManagerFactory.noteOutputConnectionChange(threadContext,connectionName);
-  }
-
-  /** Signal output connection has been deleted.
-  * This is called when the target of an output connection has been removed,
-  * therefore all associated documents were also already removed.
-  *@param threadContext is the thread context.
-  *@param connectionName is the connection name.
-  */
-  public static void signalOutputConnectionRemoved(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    // Blow away the incremental ingestion table first
-    IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-    IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
-    ingester.removeOutputConnection(outputConnectionManager.load(connectionName));
-    // Now, signal to all agents that the output connection configuration has changed.  Do this second, so that there cannot be documents
-    // resulting from this signal that find themselves "unchanged".
-    AgentManagerFactory.noteOutputConnectionChange(threadContext,connectionName);
-  }
-  
-  /** Qualify output activity name.
-  *@param outputActivityName is the name of the output activity.
-  *@param outputConnectionName is the corresponding name of the output connection.
-  *@return the qualified (global) activity name.
-  */
-  public static String qualifyOutputActivityName(String outputActivityName, String outputConnectionName)
-  {
-    return outputActivityName+" ("+outputConnectionName+")";
-  }
-
-  /** Qualify transformation activity name.
-  *@param transformationActivityName is the name of the output activity.
-  *@param transformationConnectionName is the corresponding name of the transformation connection.
-  *@return the qualified (global) activity name.
-  */
-  public static String qualifyTransformationActivityName(String transformationActivityName, String transformationConnectionName)
-  {
-    return transformationActivityName+" ["+transformationConnectionName+"]";
-  }
-
-  // Helper methods for API support.  These are made public so connectors can use them to implement the executeCommand method.
-  
-  // These are the universal node types.
-  
-  protected static final String API_ERRORNODE = "error";
-  protected static final String API_SERVICEINTERRUPTIONNODE = "service_interruption";
-  
-  /** Find a configuration node given a name */
-  public static ConfigurationNode findConfigurationNode(Configuration input, String argumentName)
-  {
-    // Look for argument among the children
-    int i = 0;
-    while (i < input.getChildCount())
-    {
-      ConfigurationNode cn = input.findChild(i++);
-      if (cn.getType().equals(argumentName))
-        return cn;
-    }
-    return null;
-
-  }
-  
-  /** Find a configuration value given a name */
-  public static String getRootArgument(Configuration input, String argumentName)
-  {
-    ConfigurationNode node = findConfigurationNode(input,argumentName);
-    if (node == null)
-      return null;
-    return node.getValue();
-  }
-
-  /** Create an error node with a general error message. */
-  public static void createErrorNode(Configuration output, String errorMessage)
-    throws ManifoldCFException
-  {
-    ConfigurationNode error = new ConfigurationNode(API_ERRORNODE);
-    error.setValue(errorMessage);
-    output.addChild(output.getChildCount(),error);
-  }
-
-
-  /** Handle an exception, by converting it to an error node. */
-  public static void createErrorNode(Configuration output, ManifoldCFException e)
-    throws ManifoldCFException
-  {
-    if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-      throw e;
-    Logging.api.error(e.getMessage(),e);
-    createErrorNode(output,e.getMessage());
-  }
-
-  /** Handle a service interruption, by converting it to a serviceinterruption node. */
-  public static void createServiceInterruptionNode(Configuration output, ServiceInterruption e)
-  {
-    Logging.api.warn(e.getMessage(),e);
-    ConfigurationNode error = new ConfigurationNode(API_SERVICEINTERRUPTIONNODE);
-    error.setValue(e.getMessage());
-    output.addChild(output.getChildCount(),error);
-  }
-
-
-}
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformation/BaseTransformationConnector.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformation/BaseTransformationConnector.java
deleted file mode 100644
index 66ada55..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformation/BaseTransformationConnector.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformation;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This base class describes an instance of a connection between the Connector Framework and
-* a document transformation engine.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connectors are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.
-*
-*/
-public abstract class BaseTransformationConnector extends org.apache.manifoldcf.core.connector.BaseConnector implements ITransformationConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[0];
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-  /** Detect if a document date is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param date is the date of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the document with that date can be accepted by this connector.
-  */
-  @Override
-  public boolean checkDateIndexable(VersionContext pipelineDescription, Date date, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return checkActivity.checkDateIndexable(date);
-  }
-
-  /** Detect if a mime type is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
-  * in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param mimeType is the mime type of the document.
-  *@param checkActivity is an object including the activities that can be performed by this method.
-  *@return true if the mime type can be accepted by this connector.
-  */
-  @Override
-  public boolean checkMimeTypeIndexable(VersionContext pipelineDescription, String mimeType, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return checkActivity.checkMimeTypeIndexable(mimeType);
-  }
-
-  /** Pre-determine whether a document (passed here as a File object) is acceptable or not.  This method is
-  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-  * search engines that only handle a small set of accepted file types.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param localFile is the local file to check.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkDocumentIndexable(VersionContext pipelineDescription, File localFile, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return checkActivity.checkDocumentIndexable(localFile);
-  }
-
-  /** Pre-determine whether a document's length is acceptable.  This method is used
-  * to determine whether to fetch a document in the first place.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param length is the length of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkLengthIndexable(VersionContext pipelineDescription, long length, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return checkActivity.checkLengthIndexable(length);
-  }
-
-  /** Pre-determine whether a document's URL is acceptable.  This method is used
-  * to help filter out documents that cannot be indexed in advance.
-  *@param pipelineDescription is the document's pipeline version string, for this connection.
-  *@param url is the URL of the document.
-  *@param checkActivity is an object including the activities that can be done by this method.
-  *@return true if the file is acceptable, false if not.
-  */
-  @Override
-  public boolean checkURLIndexable(VersionContext pipelineDescription, String url, IOutputCheckActivity checkActivity)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return checkActivity.checkURLIndexable(url);
-  }
-
-  /** Get a pipeline version string, given a pipeline specification object.  The version string is used to
-  * uniquely describe the pertinent details of the specification and the configuration, to allow the Connector 
-  * Framework to determine whether a document will need to be processed again.
-  * Note that the contents of any document cannot be considered by this method; only configuration and specification information
-  * can be considered.
-  *
-  * This method presumes that the underlying connector object has been configured.
-  *@param spec is the current pipeline specification object for this connection for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes configuration and specification in such a way that
-  * if two such strings are equal, nothing that affects how or whether the document is indexed will be different.
-  */
-  @Override
-  public VersionContext getPipelineDescription(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return new VersionContext("",params,spec);
-  }
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of a pipeline connector may use to perform operations, such as logging processing activity,
-  * or sending a modified document to the next stage in the pipeline.
-  *@return the document status (accepted or permanently rejected).
-  *@throws IOException only if there's a stream error reading the document data.
-  */
-  @Override
-  public int addOrReplaceDocumentWithException(String documentURI, VersionContext pipelineDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption, IOException
-  {
-    return DOCUMENTSTATUS_REJECTED;
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing output specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected an output connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected an output connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the output specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the output specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param os is the current output specification for this job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification os,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-}
-
-
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnection/TransformationConnection.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnection/TransformationConnection.java
deleted file mode 100644
index 095699a..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnection/TransformationConnection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformationconnection;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-/** An instance of this class represents a persistently-stored transformation connection description.
-* This is the paper object meant for editing and manipulation.
-*/
-public class TransformationConnection implements ITransformationConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-  protected String className = null;
-  protected ConfigParams configParams = new ConfigParams();
-  protected int maxCount = 100;
-
-  /** Constructor.
-  */
-  public TransformationConnection()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public TransformationConnection duplicate()
-  {
-    TransformationConnection rval = new TransformationConnection();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    rval.className = className;
-    rval.maxCount = maxCount;
-    rval.configParams = configParams.duplicate();
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-  
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className)
-  {
-    this.className = className;
-  }
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName()
-  {
-    return className;
-  }
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams()
-  {
-    return configParams;
-  }
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount)
-  {
-    this.maxCount = maxCount;
-  }
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections()
-  {
-    return maxCount;
-  }
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnection/TransformationConnectionManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnection/TransformationConnectionManager.java
deleted file mode 100644
index 0f947fb..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnection/TransformationConnectionManager.java
+++ /dev/null
@@ -1,801 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformationconnection;
-
-import java.util.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-
-/** This class is the manager of the transformation connection description.  Inside, a database table is managed,
-* with appropriate caching.
-* Note well: The database handle is instantiated here using the DBInterfaceFactory.  This is acceptable because the
-* actual database that this table is located in is fixed.
-* 
-* <br><br>
-* <b>transformationconnections</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>connectionname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
-* <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>classname</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>maxcount</td><td>BIGINT</td><td></td></tr>
-* <tr><td>configxml</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class TransformationConnectionManager extends org.apache.manifoldcf.core.database.BaseTable implements ITransformationConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Special field suffix
-  private final static String passwordSuffix = "password";
-
-  // Database fields
-  protected final static String nameField = "connectionname";
-  protected final static String descriptionField = "description";
-  protected final static String classNameField = "classname";
-  protected final static String maxCountField = "maxcount";
-  protected final static String configField = "configxml";
-
-  // Cache manager
-  protected final ICacheManager cacheManager;
-  // Thread context
-  protected final IThreadContext threadContext;
-  // Lock manager
-  protected final ILockManager lockManager;
-  
-  protected final static String transformationsLock = "TRANSFORMATIONS_LOCK";
-  
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public TransformationConnectionManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"transformationconnections");
-
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always have an outer loop, in case retries required
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(maxCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(configField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code, if needed, goes here.
-      }
-
-      // Index management
-      IndexDescription classIndex = new IndexDescription(false,new String[]{classNameField});
-      
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (classIndex != null && id.equals(classIndex))
-          classIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (classIndex != null)
-        performAddIndex(null,classIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,1);
-    // Get the authority list
-    ITransformationConnection[] list = getAllConnections();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual repository connection info
-    int i = 0;
-    while (i < list.length)
-    {
-      ITransformationConnection conn = list[i++];
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-      ManifoldCF.writeString(os,conn.getClassName());
-      ManifoldCF.writeString(os,conn.getConfigParams().toXML());
-      ManifoldCF.writeDword(os,conn.getMaxConnections());
-    }
-  }
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version != 1)
-      throw new java.io.IOException("Unknown transformation connection configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    int i = 0;
-    while (i < count)
-    {
-      ITransformationConnection conn = create();
-      conn.setName(ManifoldCF.readString(is));
-      conn.setDescription(ManifoldCF.readString(is));
-      conn.setClassName(ManifoldCF.readString(is));
-      conn.getConfigParams().fromXML(ManifoldCF.readString(is));
-      conn.setMaxConnections(ManifoldCF.readDword(is));
-      // Attempt to save this connection
-      save(conn);
-      i++;
-    }
-  }
-
-  /** Obtain a list of the transformation connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public ITransformationConnection[] getAllConnections()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(transformationsLock);
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getTransformationConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(transformationsLock);
-    }
-  }
-
-  /** Load a transformation connection by name.
-  *@param name is the name of the transformation connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public ITransformationConnection load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  protected final static int FETCH_MAX = 200;
-
-  /** Load multiple transformation connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  public ITransformationConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    ITransformationConnection[] rval = new ITransformationConnection[names.length];
-    if (names.length == 0)
-      return rval;
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (names.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,names,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,names,inputIndex,names.length-inputIndex);
-    return rval;
-  }
-  
-  protected int loadMultipleInternal(ITransformationConnection[] rval, int outputIndex, String[] fetchNames, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    TransformationConnectionDescription[] objectDescriptions = new TransformationConnectionDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      ssb.clear();
-      String name = fetchNames[inputIndex + i];
-      ssb.add(getTransformationConnectionKey(name));
-      objectDescriptions[i] = new TransformationConnectionDescription(name,new StringSet(ssb));
-    }
-
-    TransformationConnectionExecutor exec = new TransformationConnectionExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    ITransformationConnection[] results = exec.getResults();
-    for (ITransformationConnection result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Create a new transformation connection object.
-  *@return the new object.
-  */
-  public ITransformationConnection create()
-    throws ManifoldCFException
-  {
-    TransformationConnection rval = new TransformationConnection();
-    return rval;
-  }
-
-  /** Save a transformation connection object.
-  *@param object is the object to save.
-  *@return true if the object is being created, false otherwise.
-  */
-  public boolean save(ITransformationConnection object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getTransformationConnectionsKey());
-    ssb.add(getTransformationConnectionKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      // Catch deadlock condition
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(transformationsLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              // Notify of a change to the configuration
-              ManifoldCF.noteConfigurationChange();
-              boolean isNew = object.getIsNew();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,object.getDescription());
-              values.put(classNameField,object.getClassName());
-              values.put(maxCountField,new Long((long)object.getMaxConnections()));
-              String configXML = object.getConfigParams().toXML();
-              values.put(configField,configXML);
-              boolean notificationNeeded = false;
-              boolean isCreated;
-              
-              if (set.getRowCount() > 0)
-              {
-                // If the object is supposedly new, it is bad that we found one that already exists.
-                if (isNew)
-                  throw new ManifoldCFException("Transformation connection '"+object.getName()+"' already exists");
-                isCreated = false;
-                IResultRow row = set.getRow(0);
-                String oldXML = (String)row.getValue(configField);
-                if (oldXML == null || !oldXML.equals(configXML))
-                  notificationNeeded = true;
-
-                // Update
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(nameField,object.getName())});
-                performUpdate(values," WHERE "+query,params,null);
-              }
-              else
-              {
-                // If the object is not supposed to be new, it is bad that we did not find one.
-                if (!isNew)
-                  throw new ManifoldCFException("Transformation connection '"+object.getName()+"' no longer exists");
-                isCreated = true;
-                // Insert
-                values.put(nameField,object.getName());
-                // We only need the general key because this is new.
-                performInsert(values,null);
-              }
-              
-              // If notification required, do it.
-              if (notificationNeeded)
-                AgentManagerFactory.noteTransformationConnectionChange(threadContext,object.getName());
-
-              cacheManager.invalidateKeys(ch);
-              return isCreated;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(transformationsLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete an output connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getTransformationConnectionsKey());
-    ssb.add(getTransformationConnectionKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-    lockManager.enterNonExWriteLock(transformationsLock);
-    try
-    {
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-        beginTransaction();
-        try
-        {
-          // Check if anything refers to this connection name
-          if (AgentManagerFactory.isTransformationConnectionInUse(threadContext,name))
-            throw new ManifoldCFException("Can't delete transformation connection '"+name+"': existing entities refer to it");
-          ManifoldCF.noteConfigurationChange();
-          ArrayList params = new ArrayList();
-          String query = buildConjunctionClause(params,new ClauseDescription[]{
-            new UnitaryClause(nameField,name)});
-          performDelete("WHERE "+query,params,null);
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(transformationsLock);
-    }
-  }
-
-  /** Get a list of output connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the repository connections that use that connector.
-  */
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getTransformationConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(classNameField,className)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(nameField);
-      i++;
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getTransformationConnectionKey(name));
-      StringSet localCacheKeys = new StringSet(ssb);
-      ArrayList params = new ArrayList();
-      String query = buildConjunctionClause(params,new ClauseDescription[]{
-        new UnitaryClause(nameField,name)});
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName()+" WHERE "+query,params,
-        localCacheKeys,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("No such connection: '"+name+"'");
-      IResultRow row = set.getRow(0);
-      String className = (String)row.getValue(classNameField);
-      ITransformationConnectorManager cm = TransformationConnectorManagerFactory.make(threadContext);
-      return cm.isInstalled(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  // Schema related
-  /** Return the name column.
-  *@return the name column.
-  */
-  public String getConnectionNameColumn()
-  {
-    return nameField;
-  }
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // output connections.
-
-  /** Construct a key which represents the general list of transformation connectors.
-  *@return the cache key.
-  */
-  protected static String getTransformationConnectionsKey()
-  {
-    return CacheKeyFactory.makeTransformationConnectionsKey();
-  }
-
-  /** Construct a key which represents an individual transformation connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getTransformationConnectionKey(String connectionName)
-  {
-    return CacheKeyFactory.makeTransformationConnectionKey(connectionName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple output connections at a single time.
-  *@param connectionNames are a list of connection names.
-  *@return the corresponding output connection objects.
-  */
-  protected TransformationConnection[] getTransformationConnectionsMultiple(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    TransformationConnection[] rval = new TransformationConnection[connectionNames.length];
-    Map<String,Integer> returnIndex = new HashMap<String,Integer>();
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(connectionNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetTransformationConnectionsChunk();
-      while (i < connectionNames.length)
-      {
-        if (j == maxIn)
-        {
-          getTransformationConnectionsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(connectionNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getTransformationConnectionsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Calculate max number of clauses to send to getTransformationConnectionsChunk.
-  */
-  protected int maxClauseGetTransformationConnectionsChunk()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Read a chunk of transformation connections.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getTransformationConnectionsChunk(TransformationConnection[] rval, Map<String,Integer> returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = returnIndex.get(name).intValue();
-      TransformationConnection rc = new TransformationConnection();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rc.setClassName((String)row.getValue(classNameField));
-      rc.setMaxConnections((int)((Long)row.getValue(maxCountField)).longValue());
-      String xml = (String)row.getValue(configField);
-      if (xml != null && xml.length() > 0)
-        rc.getConfigParams().fromXML(xml);
-      rval[index] = rc;
-    }
-
-  }
-
-  // The cached instance will be a TransformationConnection.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for a transformation connection object.
-  */
-  protected static class TransformationConnectionDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String connectionName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public TransformationConnectionDescription(String connectionName, StringSet invKeys)
-    {
-      super("transformationconnectioncache");
-      this.connectionName = connectionName;
-      criticalSectionName = getClass().getName()+"-"+connectionName;
-      cacheKeys = invKeys;
-    }
-
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-
-    public int hashCode()
-    {
-      return connectionName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof TransformationConnectionDescription))
-        return false;
-      TransformationConnectionDescription d = (TransformationConnectionDescription)o;
-      return d.connectionName.equals(connectionName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating transformation connection objects.
-  */
-  protected static class TransformationConnectionExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected TransformationConnectionManager thisManager;
-    protected TransformationConnection[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the TransformationConnectionManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public TransformationConnectionExecutor(TransformationConnectionManager manager, TransformationConnectionDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new TransformationConnection[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getConnectionName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public TransformationConnection[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      String[] connectionNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < connectionNames.length)
-      {
-        TransformationConnectionDescription desc = (TransformationConnectionDescription)objectDescriptions[i];
-        connectionNames[i] = desc.getConnectionName();
-        i++;
-      }
-
-      return thisManager.getTransformationConnectionsMultiple(connectionNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      TransformationConnectionDescription objectDesc = (TransformationConnectionDescription)objectDescription;
-      TransformationConnection ci = (TransformationConnection)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getConnectionName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnectorpool/TransformationConnectorPool.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnectorpool/TransformationConnectorPool.java
deleted file mode 100644
index a211b96..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnectorpool/TransformationConnectorPool.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformationconnectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An implementation of ITransformationConnectorPool.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public class TransformationConnectorPool implements ITransformationConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Local connector pool */
-  protected final static LocalPool localPool = new LocalPool();
-
-  /** Thread context */
-  protected final IThreadContext threadContext;
-  
-  /** Constructor */
-  public TransformationConnectorPool(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get multiple transformation connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param transformationConnections are the connections to use the build the connector instances.
-  */
-  @Override
-  public ITransformationConnector[] grabMultiple(String[] orderingKeys, ITransformationConnection[] transformationConnections)
-    throws ManifoldCFException
-  {
-    // For now, use the TransformationConnectorFactory method.  This will require us to extract info
-    // from each output connection, however.
-    String[] connectionNames = new String[transformationConnections.length];
-    String[] classNames = new String[transformationConnections.length];
-    ConfigParams[] configInfos = new ConfigParams[transformationConnections.length];
-    int[] maxPoolSizes = new int[transformationConnections.length];
-    
-    for (int i = 0; i < transformationConnections.length; i++)
-    {
-      connectionNames[i] = transformationConnections[i].getName();
-      classNames[i] = transformationConnections[i].getClassName();
-      configInfos[i] = transformationConnections[i].getConfigParams();
-      maxPoolSizes[i] = transformationConnections[i].getMaxConnections();
-    }
-    return localPool.grabMultiple(threadContext,
-      orderingKeys, connectionNames, classNames, configInfos, maxPoolSizes);
-  }
-
-  /** Get a transformation connector.
-  * The connector is specified by a transformation connection object.
-  *@param transformationConnection is the transformation connection to base the connector instance on.
-  */
-  @Override
-  public ITransformationConnector grab(ITransformationConnection transformationConnection)
-    throws ManifoldCFException
-  {
-    return localPool.grab(threadContext, transformationConnection.getName(), transformationConnection.getClassName(),
-      transformationConnection.getConfigParams(), transformationConnection.getMaxConnections());
-  }
-
-  /** Release multiple transformation connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  @Override
-  public void releaseMultiple(ITransformationConnection[] connections, ITransformationConnector[] connectors)
-    throws ManifoldCFException
-  {
-    String[] connectionNames = new String[connections.length];
-    for (int i = 0; i < connections.length; i++)
-    {
-      connectionNames[i] = connections[i].getName();
-    }
-    localPool.releaseMultiple(threadContext, connectionNames, connectors);
-  }
-
-  /** Release a transformation connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  @Override
-  public void release(ITransformationConnection connection, ITransformationConnector connector)
-    throws ManifoldCFException
-  {
-    localPool.release(threadContext,connection.getName(),connector);
-  }
-
-  /** Idle notification for inactive transformation connector handles.
-  * This method polls all inactive handles.
-  */
-  @Override
-  public void pollAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.pollAllConnectors(threadContext);
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  @Override
-  public void flushUnusedConnectors()
-    throws ManifoldCFException
-  {
-    localPool.flushUnusedConnectors(threadContext);
-  }
-
-  /** Clean up all open output connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  @Override
-  public void closeAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.closeAllConnectors(threadContext);
-  }
-
-  /** Actual static output connector pool */
-  protected static class LocalPool extends org.apache.manifoldcf.core.connectorpool.ConnectorPool<ITransformationConnector>
-  {
-    public LocalPool()
-    {
-      super("_TRANSFORMATIONCONNECTORPOOL_");
-    }
-    
-    @Override
-    protected boolean isInstalled(IThreadContext tc, String className)
-      throws ManifoldCFException
-    {
-      ITransformationConnectorManager connectorManager = TransformationConnectorManagerFactory.make(tc);
-      return connectorManager.isInstalled(className);
-    }
-
-    @Override
-    protected boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-      throws ManifoldCFException
-    {
-      ITransformationConnectionManager connectionManager = TransformationConnectionManagerFactory.make(tc);
-      return connectionManager.load(connectionName) != null;
-    }
-
-    public ITransformationConnector[] grabMultiple(IThreadContext tc, String[] orderingKeys, String[] connectionNames, String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-      throws ManifoldCFException
-    {
-      return grabMultiple(tc,ITransformationConnector.class,orderingKeys,connectionNames,classNames,configInfos,maxPoolSizes);
-    }
-
-  }
-  
-}
diff --git a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnmgr/TransformationConnectorManager.java b/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnmgr/TransformationConnectorManager.java
deleted file mode 100644
index 867e8fa..0000000
--- a/framework/agents/src/main/java/org/apache/manifoldcf/agents/transformationconnmgr/TransformationConnectorManager.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.transformationconnmgr;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.CacheKeyFactory;
-import java.util.*;
-
-/** Implementation of ITransformationConnectorManager.
- * 
- * <br><br>
- * <b>transformationconnectors</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class TransformationConnectorManager extends org.apache.manifoldcf.core.database.BaseTable implements ITransformationConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public TransformationConnectorManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"transformationconnectors");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always have an outer loop, in case upgrade needs it.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Schema upgrade goes here.
-      }
-
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    // First, go through all registered connectors.  This is all inside a transaction.
-    beginTransaction();
-    try
-    {
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        // Call the deinstall method
-        TransformationConnectorFactory.deinstall(threadContext,className);
-      }
-      performDrop(invKeys);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      //performLock();
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(classNameField,className);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+classNameField+"=?",params,invKeys);
-      }
-
-      // Either way, we must do the install/upgrade itself.
-      TransformationConnectorFactory.install(threadContext,className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the class name of the connector to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // Uninstall first
-      TransformationConnectorFactory.deinstall(threadContext,className);
-
-      removeConnector(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+classNameField+" AS classname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    return row.getValue(descriptionField).toString();
-  }
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException
-  {
-    // Use the global table key; that's good enough because we don't expect stuff to change out from under very often.
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT * FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseHSQLDB.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseHSQLDB.java
deleted file mode 100644
index beee355..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.core.tests.BaseHSQLDB
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.installTables(tc);
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      ManifoldCF.deinstallTables(tc);
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    org.apache.manifoldcf.agents.system.ManifoldCF.localInitialize(ThreadContextFactory.make());
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    org.apache.manifoldcf.agents.system.ManifoldCF.localCleanup(ThreadContextFactory.make());
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseHSQLDBext.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseHSQLDBext.java
deleted file mode 100644
index a2d25b0..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseHSQLDBext.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDBext extends org.apache.manifoldcf.core.tests.BaseHSQLDBext
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    // Install the agents tables
-    initialize();
-    //ManifoldCF.initializeEnvironment();
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.installTables(tc);
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      ManifoldCF.deinstallTables(tc);
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-  
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    org.apache.manifoldcf.agents.system.ManifoldCF.localInitialize(ThreadContextFactory.make());
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    org.apache.manifoldcf.agents.system.ManifoldCF.localCleanup(ThreadContextFactory.make());
-    super.cleanupSystem();
-  }
-  
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseMySQL.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseMySQL.java
deleted file mode 100644
index cfb2afc..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BaseMySQL.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.core.tests.BaseMySQL
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.installTables(tc);
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      ManifoldCF.deinstallTables(tc);
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-  
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    org.apache.manifoldcf.agents.system.ManifoldCF.localInitialize(ThreadContextFactory.make());
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    org.apache.manifoldcf.agents.system.ManifoldCF.localCleanup(ThreadContextFactory.make());
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BasePostgresql.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BasePostgresql.java
deleted file mode 100644
index 019e6fc..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/BasePostgresql.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.core.tests.BasePostgresql
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.installTables(tc);
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      ManifoldCF.deinstallTables(tc);
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-  
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    org.apache.manifoldcf.agents.system.ManifoldCF.localInitialize(ThreadContextFactory.make());
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    org.apache.manifoldcf.agents.system.ManifoldCF.localCleanup(ThreadContextFactory.make());
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityHSQLDBTest.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityHSQLDBTest.java
deleted file mode 100644
index cadf2d6..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityHSQLDBextTest.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityHSQLDBextTest.java
deleted file mode 100644
index 35350fa..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityHSQLDBextTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBextTest extends BaseHSQLDBext
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityMySQLTest.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityMySQLTest.java
deleted file mode 100644
index c91a11f..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityMySQLTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityPostgresqlTest.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityPostgresqlTest.java
deleted file mode 100644
index 16ca003..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/TestingOutputConnector.java b/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/TestingOutputConnector.java
deleted file mode 100644
index dffaf82..0000000
--- a/framework/agents/src/test/java/org/apache/manifoldcf/agents/tests/TestingOutputConnector.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.agents.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** Output connector class to be used by tests.  This connector never expects to see any documents at all,
-* which is fine because it rejects them all. */
-public class TestingOutputConnector extends org.apache.manifoldcf.agents.output.BaseOutputConnector
-{
-
-  public TestingOutputConnector()
-  {
-    super();
-  }
-  
-
-}
diff --git a/framework/api-service/.gitignore b/framework/api-service/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/api-service/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/api-service/pom.xml b/framework/api-service/pom.xml
deleted file mode 100644
index 2628236..0000000
--- a/framework/api-service/pom.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-api-service</artifactId>
-  <name>ManifoldCF - Framework - API Service</name>
-  <packaging>war</packaging>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-servlet</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- web dependencies -->
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <!-- runtime dependencies -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- database dependencies -->
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mariadb.jdbc</groupId>
-      <artifactId>mariadb-java-client</artifactId>
-      <version>${mariadb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- jdbc connector databases -->
-    <dependency>
-      <groupId>net.sourceforge.jtds</groupId>
-      <artifactId>jtds</artifactId>
-      <version>${jtds.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java b/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java
deleted file mode 100644
index 6efaccc..0000000
--- a/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.apiservice;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically calls the cleanup method in all connected repository connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class IdleCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Constructor.
-  */
-  public IdleCleanupThread()
-    throws ManifoldCFException
-  {
-    super();
-    setName("Idle cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.root.debug("Start up idle cleanup thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
-      IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Do the cleanup
-          repositoryConnectorPool.pollAllConnectors();
-          notificationConnectorPool.pollAllConnectors();
-          outputConnectorPool.pollAllConnectors();
-          transformationConnectorPool.pollAllConnectors();
-          authorityConnectorPool.pollAllConnectors();
-          mappingConnectorPool.pollAllConnectors();
-          // Poll all basic services
-          ManifoldCF.pollAll(threadContext);
-          
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.root.error("Idle cleanup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.root.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("API service ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.root.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("API service could not start - shutting down");
-      Logging.root.fatal("IdleCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/ServletListener.java b/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/ServletListener.java
deleted file mode 100644
index cfe250e..0000000
--- a/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/ServletListener.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.apiservice;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import javax.servlet.*;
-
-/** This class furnishes a servlet shutdown hook for ManifoldCF.  It should be referenced in the
-* web.xml file for the application in order to do the right thing, however.
-*/
-public class ServletListener implements ServletContextListener
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected IdleCleanupThread idleCleanupThread = null;
-  
-  public void contextInitialized(ServletContextEvent sce)
-  {
-    try
-    {
-      IThreadContext threadContext = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(threadContext);
-      idleCleanupThread = new IdleCleanupThread();
-      idleCleanupThread.start();
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new RuntimeException("Could not initialize servlet; "+e.getMessage(),e);
-    }
-  }
-  
-  public void contextDestroyed(ServletContextEvent sce)
-  {
-    try
-    {
-      while (true)
-      {
-        if (idleCleanupThread == null)
-          break;
-        idleCleanupThread.interrupt();
-        if (!idleCleanupThread.isAlive())
-          idleCleanupThread = null;
-      }
-    }
-    finally
-    {
-      ManifoldCF.cleanUpEnvironment(ThreadContextFactory.make());
-    }
-  }
-
-}
diff --git a/framework/api-service/src/main/webapp/WEB-INF/web.xml b/framework/api-service/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index b5fcd0c..0000000
--- a/framework/api-service/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- 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.
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
-  <display-name>ManifoldCF General API Webapp</display-name>
-
-  <description>ManifoldCF General API Webapp</description>
-
-  <servlet>
-    <servlet-name>APIServlet</servlet-name>
-    <servlet-class>org.apache.manifoldcf.apiservlet.APIServlet</servlet-class>
-  </servlet>
-
-  <servlet-mapping>
-    <servlet-name>APIServlet</servlet-name>
-    <url-pattern>/*</url-pattern>
-  </servlet-mapping>
-
-  <session-config>
-    <session-timeout>30</session-timeout>
-  </session-config>
-
-  <listener>
-    <listener-class>org.apache.manifoldcf.apiservice.ServletListener</listener-class>
-  </listener>
-
-</web-app>
diff --git a/framework/api-servlet/.gitignore b/framework/api-servlet/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/api-servlet/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/api-servlet/pom.xml b/framework/api-servlet/pom.xml
deleted file mode 100644
index 1138c51..0000000
--- a/framework/api-servlet/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-api-servlet</artifactId>
-  <name>ManifoldCF - Framework - API Servlet</name>
-  <packaging>jar</packaging>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- web dependencies -->
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/framework/api-servlet/src/main/java/org/apache/manifoldcf/apiservlet/APIServlet.java b/framework/api-servlet/src/main/java/org/apache/manifoldcf/apiservlet/APIServlet.java
deleted file mode 100644
index 51d5f42..0000000
--- a/framework/api-servlet/src/main/java/org/apache/manifoldcf/apiservlet/APIServlet.java
+++ /dev/null
@@ -1,746 +0,0 @@
-/* $Id: APIServlet.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.apiservlet;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.core.util.URLDecoder;
-
-import org.apache.manifoldcf.ui.beans.APIProfile;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-/** This servlet class provides API services for ManifoldCF.
-*/
-public class APIServlet extends HttpServlet
-{
-  public static final String _rcsid = "@(#)$Id: APIServlet.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  /** The init method.
-  */
-  public void init(ServletConfig config)
-    throws ServletException
-  {
-    super.init(config);
-  }
-
-  /** The destroy method.
-  */
-  public void destroy()
-  {
-    super.destroy();
-  }
-
-  protected APIProfile getAPISession(IThreadContext tc, HttpServletRequest request)
-  {
-    Object x = request.getSession().getAttribute("apiprofile");
-    if (x == null || !(x instanceof APIProfile))
-    {
-      // Basic login
-      APIProfile ap = new APIProfile();
-      request.getSession().setAttribute("apiprofile",ap);
-      ap.login(tc,"","");
-      return ap;
-    }
-    return (APIProfile)x;
-  }
-  
-  /** The get method.
-  */
-  protected void doGet(HttpServletRequest request, HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    try
-    {
-      // Mint a thread context
-      IThreadContext tc = ThreadContextFactory.make();
-      
-      // Get the path info string.  This will furnish the command.
-      String pathInfo = request.getPathInfo();
-      // Get query string.  This is used by some GET operations.
-      String queryString = request.getQueryString();
-      
-      if (pathInfo == null)
-      {
-        response.sendError(response.SC_BAD_REQUEST,"No path info found");
-        return;
-      }
-
-      // Verify session
-      APIProfile ap = getAPISession(tc,request);
-      // Perform the get
-      executeRead(tc,response,pathInfo,queryString,ap);
-    }
-    catch (ManifoldCFException e)
-    {
-      // We should only see this error if there's an API problem, not if there's an actual problem with the method being called.
-      Logging.api.debug("API error doing GET: "+e.getMessage(),e);
-      response.sendError(response.SC_BAD_REQUEST,e.getMessage());
-    }
-  }
-
-  /** The PUT method.
-  */
-  protected void doPut(HttpServletRequest request, HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    try
-    {
-      // Mint a thread context
-      IThreadContext tc = ThreadContextFactory.make();
-      
-      // Get the path info string.  This will furnish the command.
-      String pathInfo = request.getPathInfo();
-      
-      if (pathInfo == null)
-      {
-        response.sendError(response.SC_BAD_REQUEST,"No path info found");
-        return;
-      }
-
-      // Verify session
-      APIProfile ap = getAPISession(tc,request);
-      // Get the content being 'put'
-      InputStream content = request.getInputStream();
-      try
-      {
-	// Do the put.
-	executeWrite(tc,response,pathInfo,content,ap);
-      }
-      finally
-      {
-	content.close();
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      // We should only see this error if there's an API problem, not if there's an actual problem with the method being called.
-      Logging.api.debug("API error doing PUT: "+e.getMessage(),e);
-      response.sendError(response.SC_BAD_REQUEST,e.getMessage());
-    }
-  }
-
- 
-  /** The POST method.
-  */
-  protected void doPost(HttpServletRequest request, HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    try
-    {
-      // Mint a thread context
-      IThreadContext tc = ThreadContextFactory.make();
-      
-      // Get the path info string.  This will furnish the command.
-      String pathInfo = request.getPathInfo();
-      
-      if (pathInfo == null)
-      {
-        response.sendError(response.SC_BAD_REQUEST,"No path info found");
-        return;
-      }
-
-      // Verify session
-      APIProfile ap = getAPISession(tc,request);
-      // Get the content being posted
-      InputStream content = request.getInputStream();
-      try
-      {
-	// Do the put.
-	executePost(tc,response,pathInfo,content,ap);
-      }
-      finally
-      {
-	content.close();
-      }
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      // We should only see this error if there's an API problem, not if there's an actual problem with the method being called.
-      Logging.api.debug("API error doing POST: "+e.getMessage(),e);
-      response.sendError(response.SC_BAD_REQUEST,e.getMessage());
-    }
-  }
-
-  /** The DELETE method.
-  */
-  protected void doDelete(HttpServletRequest request, HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    try
-    {
-      // Mint a thread context
-      IThreadContext tc = ThreadContextFactory.make();
-      
-      // Get the path info string.  This will furnish the command.
-      String pathInfo = request.getPathInfo();
-      
-      if (pathInfo == null)
-      {
-        response.sendError(response.SC_BAD_REQUEST,"No path info found");
-        return;
-      }
-
-      // Verify session
-      APIProfile ap = getAPISession(tc,request);
-      // Perform the deletion
-      executeDelete(tc,response,pathInfo,ap);
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      // We should only see this error if there's an API problem, not if there's an actual problem with the method being called.
-      Logging.api.debug("API error doing DELETE: "+e.getMessage(),e);
-      response.sendError(response.SC_BAD_REQUEST,e.getMessage());
-    }
-  }
-
-  // Protected methods
-
-  protected static void sendUnauthorizedResponse(HttpServletResponse response)
-    throws IOException
-  {
-    response.setStatus(response.SC_UNAUTHORIZED);
-    sendNullJSON(response);
-  }
-  
-  protected static void sendNullJSON(HttpServletResponse response)
-    throws IOException
-  {
-    String loutputText = "{}";
-    byte[] lresponseValue = loutputText.getBytes(StandardCharsets.UTF_8);
-
-    // Set response mime type
-    response.setContentType("text/plain; charset=utf-8");
-    response.setIntHeader("Content-Length", (int)lresponseValue.length);
-    ServletOutputStream out = response.getOutputStream();
-    try
-    {
-      out.write(lresponseValue,0,lresponseValue.length);
-      out.flush();
-    }
-    finally
-    {
-      out.close();
-    }
-  }
-  
-  /** Perform a general "read" operation.
-  */
-  protected static void executeRead(IThreadContext tc, HttpServletResponse response, String pathInfo, String queryString, APIProfile ap)
-    throws ManifoldCFException, IOException
-  {
-    if (!ap.getLoggedOn())
-    {
-      // Login failed
-      sendUnauthorizedResponse(response);
-      return;
-    }
-
-    // Strip off leading "/"
-    if (pathInfo.startsWith("/"))
-      pathInfo = pathInfo.substring(1);
-      
-    int index = pathInfo.indexOf("/");
-    String protocol;
-    String command;
-    if (index == -1)
-    {
-      protocol = pathInfo;
-      command = "";
-    }
-    else
-    {
-      protocol = pathInfo.substring(0,index);
-      command = pathInfo.substring(index+1);
-    }
-
-    // If query string exists, parse it
-    Map<String,List<String>> queryParameters = parseQueryString(queryString);
-    
-    // Execute the request.
-    // Since there are no input arguments, we can do this before we look at the protocol.
-    
-    // There the only response distinction we have here is between exception and no exception.
-    Configuration output = new Configuration();
-    int readResult = ManifoldCF.executeReadCommand(tc,output,command,queryParameters,ap);
-
-    // Output
-    
-    String outputText = null;
-
-    if (protocol.equals("json"))
-    {
-      // Format the response
-      try
-      {
-	outputText = output.toJSON();
-      }
-      catch (ManifoldCFException e)
-      {
-	// Log it
-	Logging.api.error("Error forming JSON response: "+e.getMessage(),e);
-	// Internal server error
-	response.sendError(response.SC_INTERNAL_SERVER_ERROR);
-	return;
-      }
-    }
-    else
-    {
-      response.sendError(response.SC_BAD_REQUEST,"Unknown API protocol: "+protocol);
-      return;
-    }
-
-    if (readResult == ManifoldCF.READRESULT_NOTFOUND)
-      response.setStatus(response.SC_NOT_FOUND);
-    else if (readResult == ManifoldCF.READRESULT_NOTALLOWED)
-      response.setStatus(response.SC_UNAUTHORIZED);
-
-    byte[] responseValue = outputText.getBytes(StandardCharsets.UTF_8);
-
-    // Set response mime type
-    response.setContentType("text/plain; charset=utf-8");
-    response.setIntHeader("Content-Length", (int)responseValue.length);
-    ServletOutputStream out = response.getOutputStream();
-    try
-    {
-      out.write(responseValue,0,responseValue.length);
-      out.flush();
-    }
-    finally
-    {
-      out.close();
-    }
-
-  }
-  
-  /** Perform a general "write" operation.
-  */
-  protected static void executeWrite(IThreadContext tc, HttpServletResponse response, String pathInfo, InputStream data, APIProfile ap)
-    throws ManifoldCFException, IOException
-  {
-    if (!ap.getLoggedOn())
-    {
-      // Login failed
-      sendUnauthorizedResponse(response);
-      return;
-    }
-
-    // Strip off leading "/"
-    if (pathInfo.startsWith("/"))
-      pathInfo = pathInfo.substring(1);
-      
-    int index = pathInfo.indexOf("/");
-    String protocol;
-    String command;
-    if (index == -1)
-    {
-      protocol = pathInfo;
-      command = "";
-    }
-    else
-    {
-      protocol = pathInfo.substring(0,index);
-      command = pathInfo.substring(index+1);
-    }
-
-    // We presume the data is utf-8
-    StringBuilder sb = new StringBuilder();
-    char[] buffer = new char[65536];
-    Reader r = new InputStreamReader(data,StandardCharsets.UTF_8);
-    while (true)
-    {
-      int amt = r.read(buffer);
-      if (amt == -1)
-	break;
-      sb.append(buffer,0,amt);
-    }
-    String argument = sb.toString();
-    
-    // Parse the input
-    Configuration input;
-    
-    if (protocol.equals("json"))
-    {
-      if (argument.length() != 0)
-      {
-	input = new Configuration();
-	input.fromJSON(argument);
-      }
-      else
-	input = null;
-    }
-    else
-    {
-      response.sendError(response.SC_BAD_REQUEST,"Unknown API protocol: "+protocol);
-      return;
-    }
-    
-    // Execute the request.
-    
-    // We need the following distinctions:
-    // Exception vs. no exception
-    // OK vs CREATE (both with json response packets)
-    Configuration output = new Configuration();
-    int writeResult = ManifoldCF.executeWriteCommand(tc,output,command,input,ap);
-    
-    // Output
-    
-    
-    String outputText = null;
-
-    if (protocol.equals("json"))
-    {
-      // Format the response
-      try
-      {
-	outputText = output.toJSON();
-      }
-      catch (ManifoldCFException e)
-      {
-	// Log it
-	Logging.api.error("Error forming JSON response: "+e.getMessage(),e);
-	// Internal server error
-	response.sendError(response.SC_INTERNAL_SERVER_ERROR);
-	return;
-      }
-    }
-    else
-    {
-      response.sendError(response.SC_BAD_REQUEST,"Unknown API protocol: "+protocol);
-      return;
-    }
-
-    // This should return either 200 or SC_CREATED
-    if (writeResult == ManifoldCF.WRITERESULT_CREATED)
-      response.setStatus(response.SC_CREATED);
-    else if (writeResult == ManifoldCF.WRITERESULT_NOTFOUND)
-      response.setStatus(response.SC_NOT_FOUND);
-    else if (writeResult == ManifoldCF.WRITERESULT_NOTALLOWED)
-      response.setStatus(response.SC_UNAUTHORIZED);
-    
-    byte[] responseValue = outputText.getBytes(StandardCharsets.UTF_8);
-
-    // Set response mime type
-    response.setContentType("text/plain; charset=utf-8");
-    response.setIntHeader("Content-Length", (int)responseValue.length);
-    ServletOutputStream out = response.getOutputStream();
-    try
-    {
-      out.write(responseValue,0,responseValue.length);
-      out.flush();
-    }
-    finally
-    {
-      out.close();
-    }
-
-  }
-
-  /** Perform a general "post" operation.
-  */
-  protected static void executePost(IThreadContext tc, HttpServletResponse response, String pathInfo, InputStream data, APIProfile ap)
-    throws ManifoldCFException, IOException
-  {
-    // Strip off leading "/"
-    if (pathInfo.startsWith("/"))
-      pathInfo = pathInfo.substring(1);
-      
-    int index = pathInfo.indexOf("/");
-    String protocol;
-    String command;
-    if (index == -1)
-    {
-      protocol = pathInfo;
-      command = "";
-    }
-    else
-    {
-      protocol = pathInfo.substring(0,index);
-      command = pathInfo.substring(index+1);
-    }
-
-    // Security check.  If the protocol is JSON and the command is LOGIN, we do the login now.  But to
-    // prevent denial of service attacks, we don't accept more than a limited amount of login JSON.
-    if (protocol.equals("json") && command.equals("LOGIN")) {
-      // Do the login!
-      // Parse the json login packet
-      char[] lbuffer = new char[65536];
-      StringBuilder lsb = new StringBuilder();
-      Reader lr = new InputStreamReader(data,StandardCharsets.UTF_8);
-      while (true)
-      {
-        int amt = lr.read(lbuffer);
-        if (amt == -1)
-          break;
-        if (lsb.length() + amt > 65536)
-          break;
-        lsb.append(lbuffer,0,amt);
-      }
-      
-      Configuration loginInput = new Configuration();
-      loginInput.fromJSON(lsb.toString());
-
-      String userID = "";
-      String password = "";
-      for (int i = 0; i < loginInput.getChildCount(); i++)
-      {
-        ConfigurationNode cn = loginInput.findChild(i);
-        if (cn.getType().equals("userID"))
-          userID = cn.getValue();
-        else if (cn.getType().equals("password"))
-          password = cn.getValue();
-      }
-      ap.login(tc,userID,password);
-      if (!ap.getLoggedOn())
-      {
-        sendUnauthorizedResponse(response);
-        return;
-      }
-      else
-      {
-        sendNullJSON(response);
-        return;
-      }
-    }
-
-    if (!ap.getLoggedOn())
-    {
-      // Login failed
-      sendUnauthorizedResponse(response);
-      return;
-    }
-
-    // We presume the data is utf-8
-    StringBuilder sb = new StringBuilder();
-    char[] buffer = new char[65536];
-    Reader r = new InputStreamReader(data,StandardCharsets.UTF_8);
-    while (true)
-    {
-      int amt = r.read(buffer);
-      if (amt == -1)
-	break;
-      sb.append(buffer,0,amt);
-    }
-    String argument = sb.toString();
-    
-    // Parse the input
-    Configuration input;
-    
-    if (protocol.equals("json"))
-    {
-      if (argument.length() != 0)
-      {
-	input = new Configuration();
-	input.fromJSON(argument);
-      }
-      else
-	input = null;
-    }
-    else
-    {
-      response.sendError(response.SC_BAD_REQUEST,"Unknown API protocol: "+protocol);
-      return;
-    }
-    
-    // Execute the request.
-
-    
-    Configuration output = new Configuration();
-    int writeResult = ManifoldCF.executePostCommand(tc,output,command,input,ap);
-    
-    // Output
-    
-    
-    String outputText = null;
-
-    if (protocol.equals("json"))
-    {
-      // Format the response
-      try
-      {
-	outputText = output.toJSON();
-      }
-      catch (ManifoldCFException e)
-      {
-	// Log it
-	Logging.api.error("Error forming JSON response: "+e.getMessage(),e);
-	// Internal server error
-	response.sendError(response.SC_INTERNAL_SERVER_ERROR);
-	return;
-      }
-    }
-    else
-    {
-      response.sendError(response.SC_BAD_REQUEST,"Unknown API protocol: "+protocol);
-      return;
-    }
-
-    // This should return either 200 or SC_CREATED
-    if (writeResult == ManifoldCF.POSTRESULT_CREATED)
-      response.setStatus(response.SC_CREATED);
-    else if (writeResult == ManifoldCF.POSTRESULT_NOTFOUND)
-      response.setStatus(response.SC_NOT_FOUND);
-    else if (writeResult == ManifoldCF.POSTRESULT_NOTALLOWED)
-      response.setStatus(response.SC_UNAUTHORIZED);
-
-    byte[] responseValue = outputText.getBytes(StandardCharsets.UTF_8);
-
-    // Set response mime type
-    response.setContentType("text/plain; charset=utf-8");
-    response.setIntHeader("Content-Length", (int)responseValue.length);
-    ServletOutputStream out = response.getOutputStream();
-    try
-    {
-      out.write(responseValue,0,responseValue.length);
-      out.flush();
-    }
-    finally
-    {
-      out.close();
-    }
-
-  }
-  
-  /** Perform a general "delete" operation.
-  */
-  protected static void executeDelete(IThreadContext tc, HttpServletResponse response, String pathInfo, APIProfile ap)
-    throws ManifoldCFException, IOException
-  {
-    if (!ap.getLoggedOn())
-    {
-      // Login failed
-      sendUnauthorizedResponse(response);
-      return;
-    }
-
-    // Strip off leading "/"
-    if (pathInfo.startsWith("/"))
-      pathInfo = pathInfo.substring(1);
-      
-    int index = pathInfo.indexOf("/");
-    String protocol;
-    String command;
-    if (index == -1)
-    {
-      protocol = pathInfo;
-      command = "";
-    }
-    else
-    {
-      protocol = pathInfo.substring(0,index);
-      command = pathInfo.substring(index+1);
-    }
-
-    // Execute the request.
-    // Since there are no input arguments, we can do this before we look at the protocol.
-    
-    // There the only response distinction we have here is between exception and no exception.
-    Configuration output = new Configuration();
-    int result = ManifoldCF.executeDeleteCommand(tc,output,command,ap);
-    
-    // Output
-    String outputText = null;
-
-    if (protocol.equals("json"))
-    {
-      // Format the response
-      try
-      {
-	outputText = output.toJSON();
-      }
-      catch (ManifoldCFException e)
-      {
-	// Log it
-	Logging.api.error("Error forming JSON response: "+e.getMessage(),e);
-	// Internal server error
-	response.sendError(response.SC_INTERNAL_SERVER_ERROR);
-	return;
-      }
-    }
-    else
-    {
-      response.sendError(response.SC_BAD_REQUEST,"Unknown API protocol: "+protocol);
-      return;
-    }
-    
-    if (result == ManifoldCF.DELETERESULT_NOTFOUND)
-      response.setStatus(response.SC_NOT_FOUND);
-    else if (result == ManifoldCF.DELETERESULT_NOTALLOWED)
-      response.setStatus(response.SC_UNAUTHORIZED);
-
-    
-    byte[] responseValue = outputText.getBytes(StandardCharsets.UTF_8);
-
-    // Set response mime type
-    response.setContentType("text/plain; charset=utf-8");
-    response.setIntHeader("Content-Length", (int)responseValue.length);
-    ServletOutputStream out = response.getOutputStream();
-    try
-    {
-      out.write(responseValue,0,responseValue.length);
-      out.flush();
-    }
-    finally
-    {
-      out.close();
-    }
-
-    // return code 200 assumed!
-  }
-  
-  protected static Map<String,List<String>> parseQueryString(String queryString)
-  {
-    if (queryString == null)
-      return null;
-    Map<String,List<String>> rval = new HashMap<String,List<String>>();
-    String[] terms = queryString.split("&");
-    for (String term : terms)
-    {
-      int index = term.indexOf("=");
-      if (index == -1)
-        addValue(rval,URLDecoder.decode(term),"");
-      else
-        addValue(rval,URLDecoder.decode(term.substring(0,index)),URLDecoder.decode(term.substring(index+1)));
-    }
-    return rval;
-  }
-  
-  protected static void addValue(Map<String,List<String>> rval, String name, String value)
-  {
-    List<String> valueList = rval.get(name);
-    if (valueList == null)
-    {
-      valueList = new ArrayList<String>(1);
-      rval.put(name,valueList);
-    }
-    valueList.add(value);
-  }
-  
-}
diff --git a/framework/authority-service/.gitignore b/framework/authority-service/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/authority-service/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/authority-service/pom.xml b/framework/authority-service/pom.xml
deleted file mode 100644
index c751465..0000000
--- a/framework/authority-service/pom.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-authority-service</artifactId>
-  <name>ManifoldCF - Framework - Authority Service</name>
-  <packaging>war</packaging>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-servlet</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- web dependencies -->
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <!-- runtime dependencies -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- database dependencies -->
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mariadb.jdbc</groupId>
-      <artifactId>mariadb-java-client</artifactId>
-      <version>${mariadb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- jdbc connector databases -->
-    <dependency>
-      <groupId>net.sourceforge.jtds</groupId>
-      <artifactId>jtds</artifactId>
-      <version>${jtds.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-  </dependencies>
-
-</project>
diff --git a/framework/authority-service/src/main/java/org/apache/manifoldcf/authorityservice/ServletListener.java b/framework/authority-service/src/main/java/org/apache/manifoldcf/authorityservice/ServletListener.java
deleted file mode 100644
index 1f3ffb2..0000000
--- a/framework/authority-service/src/main/java/org/apache/manifoldcf/authorityservice/ServletListener.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorityservice;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import javax.servlet.*;
-
-/** This class furnishes a servlet shutdown hook for ManifoldCF.  It should be referenced in the
-* web.xml file for the application in order to do the right thing, however.
-*/
-public class ServletListener implements ServletContextListener
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  public void contextInitialized(ServletContextEvent sce)
-  {
-    try
-    {
-      ManifoldCF.initializeEnvironment(ThreadContextFactory.make());
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new RuntimeException("Could not initialize servlet; "+e.getMessage(),e);
-    }
-  }
-  
-  public void contextDestroyed(ServletContextEvent sce)
-  {
-    ManifoldCF.cleanUpEnvironment(ThreadContextFactory.make());
-  }
-
-}
diff --git a/framework/authority-service/src/main/webapp/WEB-INF/web.xml b/framework/authority-service/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 4d6a98b..0000000
--- a/framework/authority-service/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- 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.
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
-  <display-name>ManifoldCF Authorities API Webapp</display-name>
-
-  <description>ManifoldCF Authorities API Webapp</description>
-
-  <servlet>
-    <servlet-name>UserACLServlet</servlet-name>
-    <servlet-class>org.apache.manifoldcf.authorityservlet.UserACLServlet</servlet-class>
-  </servlet>
-
-  <servlet-mapping>
-    <servlet-name>UserACLServlet</servlet-name>
-    <url-pattern>/UserACLs</url-pattern>
-  </servlet-mapping>
-
-  <session-config>
-    <session-timeout>5</session-timeout>
-  </session-config>
-
-  <listener>
-    <listener-class>org.apache.manifoldcf.authorityservice.ServletListener</listener-class>
-  </listener>
-
-</web-app>
diff --git a/framework/authority-service/src/main/webapp/WEB-INF/web.xml.external b/framework/authority-service/src/main/webapp/WEB-INF/web.xml.external
deleted file mode 100644
index 9d43b9b..0000000
--- a/framework/authority-service/src/main/webapp/WEB-INF/web.xml.external
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!DOCTYPE web-app
-	PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
-	"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-
-<!-- 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.
--->
-
-<web-app>
-  <display-name>ManifoldCF Authorities API Webapp</display-name>
-
-  <description>ManifoldCF Authorities API Webapp</description>
-
-  <servlet>
-	<servlet-name>UserACLServlet</servlet-name>
-    	<servlet-class>org.apache.manifoldcf.authorityservlet.UserACLServlet</servlet-class>
-  </servlet>
-
-  <servlet-mapping>
-        <servlet-name>UserACLServlet</servlet-name>
-        <url-pattern>/UserACLs</url-pattern>
-  </servlet-mapping>
-
-  <session-config>
-	<session-timeout>5</session-timeout>
-  </session-config>
-
-  <security-constraint>
-    <web-resource-collection>
-      <web-resource-name>
-        ManifoldCF Authority Service
-      </web-resource-name>
-      <url-pattern>*</url-pattern>
-    </web-resource-collection>
-    <auth-constraint>
-      <role-name>authorityuser</role-name>
-    </auth-constraint>
-  </security-constraint>
-
-  <!-- Define the Login Configuration for this Application -->
-  <login-config>
-    <auth-method>BASIC</auth-method>
-    <realm-name>ManifoldCF Authority Service Servlet</realm-name>
-  </login-config>
-
-  <security-role>
-    <description>
-            This role describes people who are allowed to use the
-            ManifoldCF Authority Service.
-    </description>
-    <role-name>authorityuser</role-name>
-  </security-role>
-
-</web-app>
diff --git a/framework/authority-servlet/.gitignore b/framework/authority-servlet/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/authority-servlet/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/authority-servlet/pom.xml b/framework/authority-servlet/pom.xml
deleted file mode 100644
index 9022920..0000000
--- a/framework/authority-servlet/pom.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-authority-servlet</artifactId>
-  <name>ManifoldCF - Framework - Authority Servlet</name>
-  <packaging>jar</packaging>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- web dependencies -->
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/framework/authority-servlet/src/main/java/org/apache/manifoldcf/authorityservlet/UserACLServlet.java b/framework/authority-servlet/src/main/java/org/apache/manifoldcf/authorityservlet/UserACLServlet.java
deleted file mode 100644
index b5c3189..0000000
--- a/framework/authority-servlet/src/main/java/org/apache/manifoldcf/authorityservlet/UserACLServlet.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/* $Id: UserACLServlet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorityservlet;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.authorities.system.Logging;
-import org.apache.manifoldcf.authorities.system.RequestQueue;
-import org.apache.manifoldcf.authorities.system.AuthRequest;
-import org.apache.manifoldcf.authorities.system.MappingRequest;
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-/** This servlet class is meant to receive a user name and return a list of access tokens.
-* The user name is expected to be sent as an argument on the url (the "username" argument), and the
-* response will simply be a list of access tokens separated by newlines.
-* This is guaranteed safe because the index system cannot work with access tokens that aren't 7-bit ascii that
-* have any control characters in them.
-*
-* Errors will simply report back with an empty acl.
-*
-* The content type will always be text/plain.
-*/
-public class UserACLServlet extends HttpServlet
-{
-  public static final String _rcsid = "@(#)$Id: UserACLServlet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final static String AUTHORIZED_VALUE = "AUTHORIZED:";
-  protected final static String UNREACHABLE_VALUE = "UNREACHABLEAUTHORITY:";
-  protected final static String UNAUTHORIZED_VALUE = "UNAUTHORIZED:";
-  protected final static String USERNOTFOUND_VALUE = "USERNOTFOUND:";
-
-  protected final static String ID_PREFIX = "ID:";
-  protected final static String TOKEN_PREFIX = "TOKEN:";
-
-  /** The init method.
-  */
-  public void init(ServletConfig config)
-    throws ServletException
-  {
-    super.init(config);
-    try
-    {
-      // Set up the environment
-      //ManifoldCF.initializeEnvironment();
-      IThreadContext itc = ThreadContextFactory.make();
-      ManifoldCF.startSystem(itc);
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.misc.error("Error starting authority service: "+e.getMessage(),e);
-      throw new ServletException("Error starting authority service: "+e.getMessage(),e);
-    }
-
-  }
-
-  /** The destroy method.
-  */
-  public void destroy()
-  {
-    try
-    {
-      // Set up the environment
-      //ManifoldCF.initializeEnvironment();
-      IThreadContext itc = ThreadContextFactory.make();
-      ManifoldCF.stopSystem(itc);
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.misc.error("Error shutting down authority service: "+e.getMessage(),e);
-    }
-    super.destroy();
-  }
-
-  /** The get method.
-  */
-  protected void doGet(HttpServletRequest request, HttpServletResponse response)
-    throws ServletException, IOException
-  {
-    try
-    {
-      // Set up the environment
-      //ManifoldCF.initializeEnvironment();
-
-      Logging.authorityService.debug("Received request");
-
-      Map<String,String> domainMap = new HashMap<String,String>();
-
-      // Legacy mode: single user name with optional domain
-      String userID = request.getParameter("username");
-      if (userID != null)
-      {
-        String domain = request.getParameter("domain");
-        if (domain == null)
-          domain = "";
-        domainMap.put(domain,userID);
-      }
-      
-      // Now, go through enumerated username/domain pairs
-      int q = 0;
-      while (true)
-      {
-        String enumUserName = request.getParameter("username_"+q);
-        if (enumUserName == null)
-          break;
-        String enumDomain = request.getParameter("domain_"+q);
-        if (enumDomain == null)
-          enumDomain = "";
-        domainMap.put(enumDomain,enumUserName);
-        q++;
-      }
-      
-      if (domainMap.size() == 0)
-      {
-        response.sendError(response.SC_BAD_REQUEST);
-        return;
-      }
-      
-      boolean idneeded = false;
-      boolean aclneeded = true;
-
-      String idneededValue = request.getParameter("idneeded");
-      if (idneededValue != null)
-      {
-        if (idneededValue.equals("true"))
-          idneeded = true;
-        else if (idneededValue.equals("false"))
-          idneeded = false;
-      }
-      String aclneededValue = request.getParameter("aclneeded");
-      if (aclneededValue != null)
-      {
-        if (aclneededValue.equals("true"))
-          aclneeded = true;
-        else if (aclneededValue.equals("false"))
-          aclneeded = false;
-      }
-
-      if (Logging.authorityService.isDebugEnabled())
-      {
-        StringBuilder sb2 = new StringBuilder("[");
-        boolean first = true;
-        for (String domain : domainMap.keySet())
-        {
-          if (first)
-            first = false;
-          else
-            sb2.append(",");
-          sb2.append("'").append(domain).append("':'").append(domainMap.get(domain)).append("'");
-        }
-        sb2.append("]");
-        Logging.authorityService.debug("Received authority request for domain:user set "+sb2.toString());
-      }
-
-      RequestQueue<MappingRequest> mappingQueue = ManifoldCF.getMappingRequestQueue();
-      if (mappingQueue == null)
-      {
-        // System wasn't started; return unauthorized
-        throw new ManifoldCFException("System improperly initialized");
-      }
-
-      RequestQueue<AuthRequest> queue = ManifoldCF.getRequestQueue();
-      if (queue == null)
-      {
-        // System wasn't started; return unauthorized
-        throw new ManifoldCFException("System improperly initialized");
-      }
-
-      
-      IThreadContext itc = ThreadContextFactory.make();
-      
-      IMappingConnectionManager mappingConnManager = MappingConnectionManagerFactory.make(itc);
-      IAuthorityConnectionManager authConnManager = AuthorityConnectionManagerFactory.make(itc);
-
-      // Get all mapping connections; we may not need them all but we do need to be able to look them all up
-      IMappingConnection[] mappingConnections = mappingConnManager.getAllConnections();
-      
-      // One thread per connection, which is responsible for starting the mapping process when it is ready.
-      List<MappingOrderThread> mappingThreads = new ArrayList<MappingOrderThread>();
-      // One thread per authority, which is responsible for starting the auth request when it is ready.
-      List<AuthOrderThread> authThreads = new ArrayList<AuthOrderThread>();
-
-      Map<MapperDescription,MappingRequest> mappingRequests = new HashMap<MapperDescription,MappingRequest>();
-      Map<String,AuthRequest> authRequests = new HashMap<String,AuthRequest>();
-
-      Map<String,IMappingConnection> mappingConnMap = new HashMap<String,IMappingConnection>();
-      
-      // Fill in mappingConnMap, since we need to be able to find connections given connection names
-      for (IMappingConnection c : mappingConnections)
-      {
-        mappingConnMap.put(c.getName(),c);
-      }
-
-      // Set of connections we need to fire off
-      Set<MapperDescription> activeConnections = new HashSet<MapperDescription>();
-
-      // We do the minimal set of mapping requests and authorities.  Since it is the authority tokens we are
-      // looking for, we start there, and build authority requests first, then mapping requests that support them,
-      // etc.
-      // Create auth requests
-      for (String authDomain : domainMap.keySet())
-      {
-        IAuthorityConnection[] connections = authConnManager.getDomainConnections(authDomain);
-        for (int i = 0; i < connections.length; i++)
-        {
-          IAuthorityConnection thisConnection = connections[i];
-          String identifyingString = thisConnection.getDescription();
-          if (identifyingString == null || identifyingString.length() == 0)
-            identifyingString = thisConnection.getName();
-          
-          // Create a request
-          AuthRequest ar = new AuthRequest(thisConnection,identifyingString);
-          authRequests.put(thisConnection.getName(), ar);
-          
-          // We create an auth thread if there are prerequisites to meet.
-          // Otherwise, we just fire off the request
-          String domainUserID = domainMap.get(authDomain);
-          if (thisConnection.getPrerequisiteMapping() == null)
-          {
-            ar.setUserID(domainUserID);
-            queue.addRequest(ar);
-          }
-          else
-          {
-            MapperDescription md = new MapperDescription(thisConnection.getPrerequisiteMapping(),authDomain);
-            AuthOrderThread thread = new AuthOrderThread(identifyingString,
-              ar, md,
-              queue, mappingRequests);
-            authThreads.add(thread);
-            // The same mapper can be used for multiple domains, although this is likely to be uncommon.  Nevertheless,
-            // mapper invocations need to be segregated to prevent trouble
-            activeConnections.add(md);
-          }
-        }
-      }
-
-      // Create mapping requests
-      while (!activeConnections.isEmpty())
-      {
-        Iterator<MapperDescription> connectionIter = activeConnections.iterator();
-        MapperDescription mapperDesc = connectionIter.next();
-        String connectionName = mapperDesc.mapperName;
-        String authDomain = mapperDesc.authDomain;
-        IMappingConnection thisConnection = mappingConnMap.get(connectionName);
-        String identifyingString = thisConnection.getDescription();
-        if (identifyingString == null || identifyingString.length() == 0)
-          identifyingString = connectionName;
-
-        // Create a request
-        MappingRequest mr = new MappingRequest(thisConnection,identifyingString);
-        mappingRequests.put(mapperDesc, mr);
-
-        // Either start up a thread, or just fire it off immediately.
-        if (thisConnection.getPrerequisiteMapping() == null)
-        {
-          mr.setUserID(domainMap.get(authDomain));
-          mappingQueue.addRequest(mr);
-        }
-        else
-        {
-          //System.out.println("Mapper: prerequisite found: '"+thisConnection.getPrerequisiteMapping()+"'");
-          MapperDescription p = new MapperDescription(thisConnection.getPrerequisiteMapping(),authDomain);
-          MappingOrderThread thread = new MappingOrderThread(identifyingString,
-            mr, p, mappingQueue, mappingRequests);
-          mappingThreads.add(thread);
-          if (mappingRequests.get(p) == null)
-            activeConnections.add(p);
-        }
-        activeConnections.remove(mapperDesc);
-      }
-      
-      // Start threads.  We have to wait until all the requests have been
-      // at least created before we do this.
-      for (MappingOrderThread thread : mappingThreads)
-      {
-        thread.start();
-      }
-      for (AuthOrderThread thread : authThreads)
-      {
-        thread.start();
-      }
-      
-      // Wait for the threads to finish up.  This will guarantee that all entities have run to completion.
-      for (MappingOrderThread thread : mappingThreads)
-      {
-        thread.finishUp();
-      }
-      for (AuthOrderThread thread : authThreads)
-      {
-        thread.finishUp();
-      }
-      
-      // This is probably unnecessary, but we do it anyway just to adhere to the contract
-      for (MappingRequest mr : mappingRequests.values())
-      {
-        mr.waitForComplete();
-      }
-      
-      // Handle all exceptions thrown during mapping.  In general this just means logging them, because
-      // the downstream authorities will presumably not find what they are looking for and error out that way.
-      for (MappingRequest mr : mappingRequests.values())
-      {
-        Throwable exception = mr.getAnswerException();
-        if (exception != null)
-        {
-          Logging.authorityService.warn("Mapping exception logged from "+mr.getIdentifyingString()+": "+exception.getMessage()+"; mapper aborted", exception);
-        }
-      }
-      
-      // Now, work through the returning answers.
-
-      // Ask all the interrogated authorities for their ACLs, and merge the final list together.
-      StringBuilder sb = new StringBuilder();
-      // Set response mime type
-      response.setContentType("text/plain; charset=ISO8859-1");
-      ServletOutputStream out = response.getOutputStream();
-      try
-      {
-        for (String connectionName : authRequests.keySet())
-        {
-          AuthRequest ar = authRequests.get(connectionName);
-
-          if (Logging.authorityService.isDebugEnabled())
-            Logging.authorityService.debug("Waiting for answer from authority connection "+ar.getIdentifyingString()+" for user '"+ar.getUserID()+"'");
-
-          ar.waitForComplete();
-
-          if (Logging.authorityService.isDebugEnabled())
-            Logging.authorityService.debug("Received answer from authority connection "+ar.getIdentifyingString()+" for user '"+ar.getUserID()+"'");
-
-          Throwable exception = ar.getAnswerException();
-          AuthorizationResponse reply = ar.getAnswerResponse();
-          if (exception != null)
-          {
-            // Exceptions are always bad now
-            // The ManifoldCFException here must disable access to the UI without causing a generic badness thing to happen, so use 403.
-            if (exception instanceof ManifoldCFException)
-              response.sendError(response.SC_FORBIDDEN,"From "+ar.getIdentifyingString()+": "+exception.getMessage());
-            else
-              response.sendError(response.SC_INTERNAL_SERVER_ERROR,"From "+ar.getIdentifyingString()+": "+exception.getMessage());
-            return;
-          }
-
-          String authGroup = ar.getAuthorityConnection().getAuthGroup();
-          
-          // A null reply means the same as USERNOTFOUND; it occurs because a user mapping failed somewhere.
-          if (reply == null)
-          {
-            if (Logging.authorityService.isDebugEnabled())
-              Logging.authorityService.debug("User '"+ar.getUserID()+"' mapping failed for authority '"+ar.getIdentifyingString()+"'");
-            sb.append(USERNOTFOUND_VALUE).append(URLEncoder.encode(ar.getIdentifyingString())).append("\n");
-          }
-          else if (reply.getResponseStatus() == AuthorizationResponse.RESPONSE_UNREACHABLE)
-          {
-            Logging.authorityService.warn("Authority '"+ar.getIdentifyingString()+"' is unreachable for user '"+ar.getUserID()+"'");
-            sb.append(UNREACHABLE_VALUE).append(URLEncoder.encode(ar.getIdentifyingString())).append("\n");
-          }
-          else if (reply.getResponseStatus() == AuthorizationResponse.RESPONSE_USERUNAUTHORIZED)
-          {
-            if (Logging.authorityService.isDebugEnabled())
-              Logging.authorityService.debug("Authority '"+ar.getIdentifyingString()+"' does not authorize user '"+ar.getUserID()+"'");
-            sb.append(UNAUTHORIZED_VALUE).append(URLEncoder.encode(ar.getIdentifyingString())).append("\n");
-          }
-          else if (reply.getResponseStatus() == AuthorizationResponse.RESPONSE_USERNOTFOUND)
-          {
-            if (Logging.authorityService.isDebugEnabled())
-              Logging.authorityService.debug("User '"+ar.getUserID()+"' unknown to authority '"+ar.getIdentifyingString()+"'");
-            sb.append(USERNOTFOUND_VALUE).append(URLEncoder.encode(ar.getIdentifyingString())).append("\n");
-          }
-          else
-            sb.append(AUTHORIZED_VALUE).append(URLEncoder.encode(ar.getIdentifyingString())).append("\n");
-
-          String[] acl = reply.getAccessTokens();
-          if (acl != null)
-          {
-            if (aclneeded)
-            {
-              int j = 0;
-              while (j < acl.length)
-              {
-                if (Logging.authorityService.isDebugEnabled())
-                  Logging.authorityService.debug("  User '"+ar.getUserID()+"' has Acl = '"+acl[j]+"' from authority '"+ar.getIdentifyingString()+"'");
-                sb.append(TOKEN_PREFIX).append(URLEncoder.encode(authGroup)).append(":").append(URLEncoder.encode(acl[j++])).append("\n");
-              }
-            }
-          }
-        }
-
-        // Maintained for backwards compatibility only; no practical use that I can determine here
-        if (idneeded && userID != null)
-          sb.append(ID_PREFIX).append(URLEncoder.encode(userID)).append("\n");
-
-        byte[] responseValue = sb.toString().getBytes(StandardCharsets.ISO_8859_1);
-
-
-        response.setIntHeader("Content-Length", (int)responseValue.length);
-        out.write(responseValue,0,responseValue.length);
-        out.flush();
-      }
-      finally
-      {
-        out.close();
-      }
-
-      if (Logging.authorityService.isDebugEnabled())
-      {
-        StringBuilder sb2 = new StringBuilder("[");
-        boolean first = true;
-        for (String domain : domainMap.keySet())
-        {
-          if (first)
-            first = false;
-          else
-            sb2.append(",");
-          sb2.append("'").append(domain).append("':'").append(domainMap.get(domain)).append("'");
-        }
-        sb2.append("]");
-        Logging.authorityService.debug("Done with request for domain:user set "+sb2.toString());
-      }
-    }
-    catch (InterruptedException e)
-    {
-      // Shut down and don't bother to respond
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.authorityService.error("User ACL servlet error: "+e.getMessage(),e);
-      response.sendError(response.SC_INTERNAL_SERVER_ERROR,e.getMessage());
-    }
-  }
-
-  /** This class represents a tuple of (mapper_name, auth_domain).
-  */
-  protected static class MapperDescription
-  {
-    public final String mapperName;
-    public final String authDomain;
-    
-    public MapperDescription(String mapperName, String authDomain)
-    {
-      this.mapperName = mapperName;
-      this.authDomain = authDomain;
-    }
-    
-    public int hashCode()
-    {
-      return mapperName.hashCode() + authDomain.hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof MapperDescription))
-        return false;
-      MapperDescription other = (MapperDescription)o;
-      return this.mapperName.equals(other.mapperName) &&
-        this.authDomain.equals(other.authDomain);
-    }
-  }
-  
-  /** This thread is responsible for making sure that the constraints for a given mapping connection
-  * are met, and then when they are, firing off a MappingRequest.  One of these threads is spun up
-  * for every IMappingConnection being handled.
-  * NOTE WELL: The number of threads this might require is worrisome.  It is essentially
-  * <number_of_app_server_threads> * <number_of_mappers>.  I will try later to see if I can find
-  * a way of limiting this to sane numbers.
-  */
-  protected static class MappingOrderThread extends Thread
-  {
-    protected final MappingRequest request;
-    protected final MapperDescription prerequisite;
-    protected final Map<MapperDescription,MappingRequest> requests;
-    protected final RequestQueue<MappingRequest> mappingRequestQueue;
-
-    protected Throwable exception = null;
-    
-    public MappingOrderThread(
-      String identifyingString,
-      MappingRequest request,
-      MapperDescription prerequisite,
-      RequestQueue<MappingRequest> mappingRequestQueue,
-      Map<MapperDescription, MappingRequest> requests)
-    {
-      super();
-      this.request = request;
-      this.prerequisite = prerequisite;
-      this.mappingRequestQueue = mappingRequestQueue;
-      this.requests = requests;
-      setName("Constraint matcher for mapper '"+identifyingString+"'");
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        MappingRequest mappingRequest = requests.get(prerequisite);
-        mappingRequest.waitForComplete();
-        // Constraints are met.  Fire off the request.
-        request.setUserID(mappingRequest.getAnswerResponse());
-        mappingRequestQueue.addRequest(request);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof Error)
-          throw (Error)exception;
-        else if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-      }
-    }
-    
-  }
-
-  /** This thread is responsible for making sure that the constraints for a given authority connection
-  * are met, and then when they are, firing off an AuthRequest.  One of these threads is spun up
-  * for every IAuthorityConnection being handled.
-  * NOTE WELL: The number of threads this might require is worrisome.  It is essentially
-  * <number_of_app_server_threads> * <number_of_authorities>.  I will try later to see if I can find
-  * a way of limiting this to sane numbers.
-  */
-  protected static class AuthOrderThread extends Thread
-  {
-    protected final AuthRequest request;
-    protected final MapperDescription prerequisite;
-    protected final Map<MapperDescription,MappingRequest> mappingRequests;
-    protected final RequestQueue<AuthRequest> authRequestQueue;
-    
-    protected Throwable exception = null;
-    
-    public AuthOrderThread(
-      String identifyingString,
-      AuthRequest request,
-      MapperDescription prerequisite,
-      RequestQueue<AuthRequest> authRequestQueue,
-      Map<MapperDescription, MappingRequest> mappingRequests)
-    {
-      super();
-      this.request = request;
-      this.prerequisite = prerequisite;
-      this.authRequestQueue = authRequestQueue;
-      this.mappingRequests = mappingRequests;
-      setName("Constraint matcher for authority '"+identifyingString+"'");
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      try
-      {
-        MappingRequest mappingRequest = mappingRequests.get(prerequisite);
-        mappingRequest.waitForComplete();
-        // Constraints are met.  Fire off the request.  User may be null if mapper failed!!
-        request.setUserID(mappingRequest.getAnswerResponse());
-        authRequestQueue.addRequest(request);
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-
-    public void finishUp()
-      throws InterruptedException
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof Error)
-          throw (Error)exception;
-        else if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-      }
-    }
-    
-  }
-  
-}
diff --git a/framework/build.xml b/framework/build.xml
deleted file mode 100644
index fbdbf72..0000000
--- a/framework/build.xml
+++ /dev/null
@@ -1,2158 +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.
--->
-
-<project default="all">
-
-    <import file="../common-build.xml"/>
-    
-    <target name="clean">
-      <delete dir="build"/>
-      <delete dir="dist"/>
-      <delete dir="test-output"/>
-      <delete dir="test-postgresql-output"/>
-      <delete dir="test-mysql-output"/>
-      <delete dir="test-HSQLDB-output"/>
-      <delete dir="test-HSQLDBext-output"/>
-    </target>
-
-    <path id="less-classpath">
-        <fileset dir="../lib">
-            <include name="less4j*.jar"/>
-            <include name="antlr-runtime*.jar"/>
-            <include name="commons-beanutils*.jar"/>
-            <include name="protobuf-java*.jar"/>
-            <include name="commons-io*.jar"/>
-            <include name="commons-logging*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="framework-classpath">
-        <fileset dir="../lib">
-            <include name="zookeeper*.jar"/>
-            <include name="json-simple*.jar"/>
-            <include name="commons-codec*.jar"/>
-            <include name="commons-collections-*.jar"/>
-            <include name="commons-collections4-*.jar"/>
-            <include name="commons-el*.jar"/>
-            <include name="commons-fileupload*.jar"/>
-            <include name="httpcore*.jar"/>
-            <include name="httpclient*.jar"/>
-            <include name="commons-io*.jar"/>
-            <include name="commons-lang*.jar"/>
-            <include name="commons-logging*.jar"/>
-            <include name="ecj*.jar"/>
-            <include name="jasper*.jar"/>
-            <include name="jetty*.jar"/>
-            <include name="slf4j*.jar"/>
-            <include name="jsp-2.1*.jar"/>
-            <include name="jsp-api*.jar"/>
-            <include name="log4j-api-*.jar"/>
-            <include name="log4j-core-*.jar"/>
-            <include name="log4j-1.2-api-*.jar"/>
-            <include name="serializer*.jar"/>
-            <include name="javax.servlet-api*.jar"/>
-            <include name="juli*.jar"/>
-            <include name="xalan*.jar"/>
-            <include name="xercesImpl*.jar"/>
-            <include name="xml-apis*.jar"/>
-            <include name="velocity*.jar"/>
-            <include name="mail*.jar"/>
-            <include name="commons-exec*.jar"/>
-            <include name="gson*.jar"/>
-            <include name="guava*.jar"/>
-            <include name="jna*.jar"/>
-        </fileset>
-        <fileset dir="../lib">
-            <include name="postgresql*.jar"/>
-            <include name="hsqldb*.jar"/>
-        </fileset>
-        <fileset dir="../lib">
-            <include name="junit*.jar"/>
-            <include name="selenium*.jar"/>
-            <include name="cglib-nodep*.jar"/>
-            <include name="hamcrest-core*.jar"/>
-            <include name="mockito-core*.jar"/>
-            <include name="wiremock*.jar"/>
-            <include name="objenesis*.jar"/>
-        </fileset>
-        <fileset dir="../lib-proprietary">
-            <include name="mysql*.jar"/>
-            <include name="ojdbc*.jar"/>
-            <include name="jtds*.jar"/>
-            <include name="mariadb-java-client*.jar"/>
-        </fileset>
-
-    </path>
-    
-    <path id="connector-common-classpath">
-        <fileset dir="../lib">
-            <include name="tika-core*.jar"/>
-            <include name="jackson-core*.jar"/>
-            <include name="jackson-databind*.jar"/>
-            <include name="jackson-annotations*.jar"/>
-            <include name="tika-parsers*.jar"/>
-            <include name="json-1*.jar"/>
-            <include name="geoapi*.jar"/>
-            <include name="jsr-275*.jar"/>
-            <include name="sis-metadata*.jar"/>
-            <include name="sis-utility*.jar"/>
-            <include name="sis-netcdf*.jar"/>
-            <include name="sis-storage*.jar"/>
-            <include name="opennlp-tools*.jar"/>
-            <include name="jackcess*.jar"/>
-            <include name="junrar*.jar"/>
-            <include name="commons-vfs2*.jar"/>
-            <include name="maven-scm*.jar"/>
-            <include name="plexus-utils*.jar"/>
-            <include name="regexp*.jar"/>
-            <include name="commons-csv*.jar"/>
-            <include name="netcdf4*.jar"/>
-            <include name="httpservices*.jar"/>
-            <include name="grib*.jar"/>
-            <include name="cdm*.jar"/>
-            <include name="udunits*.jar"/>
-            <include name="jcommander*.jar"/>
-            <include name="jcip-annotations*.jar"/>
-            <include name="ehcache-core*.jar"/>
-            <include name="bzip2*.jar"/>
-            <include name="jdom2*.jar"/>
-            <include name="quartz*.jar"/>
-            <include name="c3p0*.jar"/>
-            <include name="sentiment-analysis-parser*.jar"/>
-            <include name="tagsoup*.jar"/>
-            <include name="vorbis-java*.jar"/>
-            <include name="apache-mime4j-core*.jar"/>
-            <include name="apache-mime4j-dom*.jar"/>
-            <include name="commons-compress*.jar"/>
-            <include name="pdfbox*.jar"/>
-            <include name="fontbox*.jar"/>
-            <include name="jempbox*.jar"/>
-            <include name="bcmail-jdk15on*.jar"/>
-            <include name="bcprov-jdk15on*.jar"/>
-            <include name="bcpkix-jdk15on*.jar"/>
-            <include name="geronimo-stax-api_1.0_spec*.jar"/>
-            <include name="asm*.jar"/>
-            <include name="isoparser*.jar"/>
-            <include name="aspectjrt*.jar"/>
-            <include name="metadata-extractor*.jar"/>
-            <include name="xmpcore*.jar"/>
-            <include name="xml-apis*.jar"/>
-            <include name="boilerpipe*.jar"/>
-            <include name="rome*.jar"/>
-            <include name="jdom*.jar"/>
-            <include name="xercesImpl*.jar"/>
-            <include name="vorbis-java-core*.jar"/>
-            <include name="juniversalchardet*.jar"/>
-            <include name="jhighlight*.jar"/>
-            <include name="jmatio*.jar"/>
-            <include name="java-libpst*.jar"/>
-            <include name="xz*.jar"/>
-            <include name="cxf-*.jar"/>
-            <include name="neethi*.jar"/>
-            <include name="xmlschema-core*.jar"/>
-            <include name="javax.annotation-api*.jar"/>
-            <include name="javax.ws.rs-api*.jar"/>
-        </fileset>
-        <fileset dir="../lib">
-            <include name="castor*.jar"/>
-            <include name="geronimo-javamail_1.4_spec*.jar"/>
-            <include name="commons-discovery*.jar"/>
-            <include name="axis*.jar"/>
-            <include name="wss4j*.jar"/>
-            <include name="saaj*.jar"/>
-            <include name="wsdl4j*.jar"/>
-            <include name="xmlsec*.jar"/>
-            <include name="opensaml*.jar"/>
-            <include name="activation*.jar"/>
-        </fileset>
-    </path>
-
-    <target name="file-resources">
-        <mkdir dir="dist/file-resources"/>
-        <copy todir="dist/file-resources">
-            <fileset dir="example-file-resources">
-                <include name="README.txt"/>
-            </fileset>
-        </copy>
-    </target>
-    
-    <target name="doc">
-        <mkdir dir="dist/doc"/>
-        <javadoc destdir="dist/doc" maxmemory="256M" source="1.8" useexternalfile="true" use="true" locale="en_US">
-            <link href="http://docs.oracle.com/javase/8/docs/api/"/>
-            <link href="http://manifoldcf.apache.org/release/trunk/api/framework/"/>
-            <classpath>
-                <path refid="framework-classpath"/>
-                <path refid="connector-common-classpath"/>
-            </classpath>
-            <fileset dir="core/src/main/java" includes="**/*.java"/>
-            <fileset dir="agents/src/main/java" includes="**/*.java"/>
-            <fileset dir="pull-agent/src/main/java" includes="**/*.java"/>
-            <fileset dir="ui-core/src/main/java" includes="**/*.java"/>
-            <fileset dir="connector-common/src/main/java" includes="**/*.java"/>
-            <fileset dir="script-engine/src/main/java" includes="**/*.java"/>
-            <fileset dir="jetty-runner/src/main/java" includes="**/*.java"/>
-        </javadoc>
-    </target>
-
-    <target name="compile-less-compiler">
-        <mkdir dir="build/less-compiler/classes"/>
-        <javac srcdir="less-compiler/src/main/java" destdir="build/less-compiler/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="less-classpath"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-core">
-        <mkdir dir="build/core/classes"/>
-        <javac srcdir="core/src/main/java" destdir="build/core/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-ui-core" depends="compile-core">
-        <mkdir dir="build/ui-core/classes"/>
-        <javac srcdir="ui-core/src/main/java" destdir="build/ui-core/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-            </classpath>
-        </javac>
-        <native2ascii encoding="UTF-8" src="ui-core/src/main/native2ascii" dest="build/ui-core/classes" includes="**/*.properties" />
-    </target>
-
-    <target name="compile-agents" depends="compile-core">
-        <mkdir dir="build/agents/classes"/>
-        <javac srcdir="agents/src/main/java" destdir="build/agents/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-           </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-connector-common" depends="compile-core,compile-agents,compile-ui-core">
-        <mkdir dir="build/connector-common/classes"/>
-        <copy todir="build/connector-common/classes">
-            <fileset dir="connector-common/src/main/resources"/>
-        </copy>
-        <javac srcdir="connector-common/src/main/java" destdir="build/connector-common/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <path refid="connector-common-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-           </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-pull-agent" depends="compile-core,compile-agents">
-        <mkdir dir="build/pull-agent/classes"/>
-        <javac srcdir="pull-agent/src/main/java" destdir="build/pull-agent/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/agents/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-jetty-runner" depends="compile-core,compile-agents">
-        <mkdir dir="build/jetty-runner/classes"/>
-        <javac srcdir="jetty-runner/src/main/java" destdir="build/jetty-runner/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-script-engine" depends="compile-core">
-        <mkdir dir="build/script-engine/classes"/>
-        <javac srcdir="script-engine/src/main/java" destdir="build/script-engine/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-authority-servlet" depends="compile-core,compile-agents,compile-pull-agent">
-        <mkdir dir="build/authority-servlet/classes"/>
-        <javac srcdir="authority-servlet/src/main/java" destdir="build/authority-servlet/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-authority-service" depends="compile-core,compile-agents,compile-pull-agent,compile-authority-servlet">
-        <mkdir dir="build/authority-service/classes"/>
-        <javac srcdir="authority-service/src/main/java" destdir="build/authority-service/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/authority-servlet/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-api-servlet" depends="compile-core,compile-ui-core,compile-agents,compile-pull-agent">
-        <mkdir dir="build/api-servlet/classes"/>
-        <javac srcdir="api-servlet/src/main/java" destdir="build/api-servlet/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-api-service" depends="compile-core,compile-ui-core,compile-agents,compile-pull-agent,compile-api-servlet">
-        <mkdir dir="build/api-service/classes"/>
-        <javac srcdir="api-service/src/main/java" destdir="build/api-service/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/api-servlet/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-combined-service" depends="compile-core,compile-ui-core,compile-agents,compile-pull-agent,compile-api-servlet,compile-authority-servlet">
-        <mkdir dir="build/combined-service/classes"/>
-        <javac srcdir="combined-service/src/main/java" destdir="build/combined-service/classes" deprecation="true" target="1.8" source="1.8" encoding="utf-8" debug="true" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/api-servlet/classes"/>
-                <pathelement location="build/authority-servlet/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="less-compiler-invocation" depends="compile-less-compiler">
-        <mkdir dir="build/crawler-ui/css"/>
-        <java classname="org.apache.manifoldcf.less.MCFLessCompiler" fork="true" failonerror="true" maxmemory="128m">
-            <arg value="crawler-ui/src/main/less/style.less"/>
-            <arg value="build/crawler-ui/css/style.css"/>
-            <!-- Compress less output -->
-            <arg value="true"/>
-            <classpath>
-                <path refid="less-classpath"/>
-                <pathelement location="build/less-compiler/classes"/>
-            </classpath>
-        </java>
-    </target>
-
-    <target name="compile-crawler-ui" depends="less-compiler-invocation,compile-core,compile-ui-core,compile-agents,compile-pull-agent">
-        <mkdir dir="build/crawler-ui/classes"/>
-        <javac srcdir="crawler-ui/src/main/java" destdir="build/crawler-ui/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-            </classpath>
-        </javac>
-
-        <!-- Define the jsp compilation task using tomcat libraries -->
-        <taskdef classname="org.apache.jasper.JspC" name="jasper2" > 
-            <classpath id="jspc.classpath"> 
-                <pathelement location="${java.home}/../lib/tools.jar"/>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-            </classpath> 
-        </taskdef > 
-        <!-- Compile jsp's to java -->
-        <mkdir dir="build/crawler-ui/java"/>
-        <jasper2 validateXml="false" uriroot="crawler-ui/src/main/webapp" webXmlFragment="build/crawler-ui/web-generated.xml" outputDir="build/crawler-ui/java" /> 
-        <!-- Compile java classes -->
-        <mkdir dir="build/crawler-ui/classes"/>
-        <javac srcdir="build/crawler-ui/java" destdir="build/crawler-ui/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath id="classpath">
-                <pathelement location="${java.home}/../lib/tools.jar"/>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <fileset dir="../lib">
-                    <include name="jstl*.jar"/>
-                </fileset>
-            </classpath>
-
-        </javac>
-    </target>
-
-    <target name="jar-core" depends="compile-core">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-core.jar">
-          <fileset dir="build/core/classes"/>
-        </jar>
-    </target>
-
-    <target name="jar-ui-core" depends="compile-ui-core">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-ui-core.jar">
-          <fileset dir="build/ui-core/classes"/>
-        </jar>
-    </target>
-
-    <target name="jar-agents" depends="compile-agents">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-agents.jar" basedir="build/agents/classes"/>
-    </target>
-
-    <target name="jar-connector-common" depends="compile-connector-common">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-connector-common.jar" basedir="build/connector-common/classes"/>
-    </target>
-    
-    <target name="jar-pull-agent" depends="compile-pull-agent">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-pull-agent.jar" basedir="build/pull-agent/classes"/>
-    </target>
-
-    <target name="jar-jetty-runner" depends="compile-jetty-runner">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-jetty-runner.jar" basedir="build/jetty-runner/classes"/>
-    </target>
-
-    <target name="jar-script-engine" depends="compile-script-engine">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-script-engine.jar" basedir="build/script-engine/classes"/>
-    </target>
-
-    <target name="jar-authority-servlet" depends="compile-authority-servlet">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-authority-servlet.jar" basedir="build/authority-servlet/classes"/>
-    </target>
-
-    <target name="jar-api-servlet" depends="compile-api-servlet">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-api-servlet.jar" basedir="build/api-servlet/classes"/>
-    </target>
-
-    <target name="webapp-authority-service" depends="jar-core,jar-agents,jar-pull-agent,jar-authority-servlet,compile-authority-service">
-        <mkdir dir="build/webapp/authority-service/WEB-INF/lib"/>
-        <copy todir="build/webapp/authority-service/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/authority-service/WEB-INF/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-authority-servlet.jar"/>
-            </fileset>
-        </copy>
-        <jar destfile="build/webapp/authority-service/WEB-INF/lib/mcf-authority-service.jar" basedir="build/authority-service/classes"/>
-    </target>
-
-    <target name="webapp-authority-service-proprietary" depends="jar-core,jar-agents,jar-pull-agent,jar-authority-servlet,compile-authority-service">
-        <mkdir dir="build/webapp/authority-service-proprietary/WEB-INF/lib"/>
-        <copy todir="build/webapp/authority-service-proprietary/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="../lib-proprietary">
-                <include name="mysql*.jar"/>
-                <include name="ojdbc*.jar"/>
-                <include name="jtds*.jar"/>
-                <include name="mariadb-java-client*.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/authority-service-proprietary/WEB-INF/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-authority-servlet.jar"/>
-            </fileset>
-        </copy>
-        <jar destfile="build/webapp/authority-service-proprietary/WEB-INF/lib/mcf-authority-service.jar" basedir="build/authority-service/classes"/>
-    </target>
-
-    <target name="webapp-api-service" depends="jar-core,jar-ui-core,jar-agents,jar-pull-agent,jar-api-servlet,compile-api-service">
-        <mkdir dir="build/webapp/api-service/WEB-INF/lib"/>
-        <copy todir="build/webapp/api-service/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/api-service/WEB-INF/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-ui-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-api-servlet.jar"/>
-            </fileset>
-        </copy>
-        <jar destfile="build/webapp/api-service/WEB-INF/lib/mcf-api-service.jar" basedir="build/api-service/classes"/>
-    </target>
-
-    <target name="webapp-api-service-proprietary" depends="jar-core,jar-ui-core,jar-agents,jar-pull-agent,jar-api-servlet,compile-api-service">
-        <mkdir dir="build/webapp/api-service-proprietary/WEB-INF/lib"/>
-        <copy todir="build/webapp/api-service-proprietary/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="../lib-proprietary">
-                <include name="mysql*.jar"/>
-                <include name="ojdbc*.jar"/>
-                <include name="jtds*.jar"/>
-                <include name="mariadb-java-client*.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/api-service-proprietary/WEB-INF/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-ui-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-api-servlet.jar"/>
-            </fileset>
-        </copy>
-        <jar destfile="build/webapp/api-service-proprietary/WEB-INF/lib/mcf-api-service.jar" basedir="build/api-service/classes"/>
-    </target>
-
-    <target name="webapp-crawler-ui" depends="compile-crawler-ui,jar-core,jar-ui-core,jar-agents,jar-pull-agent">
-        <mkdir dir="build/webapp/crawler-ui/WEB-INF/lib"/>
-        <copy todir="build/webapp/crawler-ui/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="jstl*.jar"/>
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="velocity*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-ui-core.jar"/>
-            </fileset>
-        </copy>
-        <mkdir dir="build/webapp/crawler-ui/WEB-INF/jsp"/>
-        <copy todir="build/webapp/crawler-ui/WEB-INF/jsp">
-            <fileset dir="crawler-ui/src/main/webapp/WEB-INF/jsp">
-                <include name="*.tld"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/crawler-ui">
-            <fileset dir="crawler-ui/src/main/webapp" includes="**/*.jsp,**/*.css,**/*.map,**/*.png,**/*.html,**/*.js,**/*.eot,**/*.svg,**/*.ttf,**/*.woff,**/*.woff2"/>
-        </copy>
-        <mkdir dir="build/webapp/crawler-ui/css"/>
-        <copy todir="build/webapp/crawler-ui/css">
-            <fileset dir="build/crawler-ui/css" includes="**/*.css,**/*.map"/>
-        </copy>
-        <jar destfile="build/webapp/crawler-ui/WEB-INF/lib/mcf-crawler-ui.jar" basedir="build/crawler-ui/classes"/>
-    </target>
-  
-      <target name="webapp-crawler-ui-proprietary" depends="compile-crawler-ui,jar-core,jar-ui-core,jar-agents,jar-pull-agent">
-        <mkdir dir="build/webapp/crawler-ui-proprietary/WEB-INF/lib"/>
-        <copy todir="build/webapp/crawler-ui-proprietary/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="jstl*.jar"/>
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="velocity*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="../lib-proprietary">
-                <include name="mysql*.jar"/>
-                <include name="ojdbc*.jar"/>
-                <include name="jtds*.jar"/>
-                <include name="mariadb-java-client*.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/crawler-ui-proprietary/WEB-INF/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-ui-core.jar"/>
-            </fileset>
-        </copy>
-        <mkdir dir="build/webapp/crawler-ui-proprietary/WEB-INF/jsp"/>
-        <copy todir="build/webapp/crawler-ui-proprietary/WEB-INF/jsp">
-            <fileset dir="crawler-ui/src/main/webapp/WEB-INF/jsp">
-                <include name="*.tld"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/crawler-ui-proprietary">
-            <fileset dir="crawler-ui/src/main/webapp" includes="**/*.jsp,**/*.css,**/*.map,**/*.png,**/*.html,**/*.js,**/*.eot,**/*.svg,**/*.ttf,**/*.woff,**/*.woff2"/>
-        </copy>
-        <mkdir dir="build/webapp/crawler-ui-proprietary/css"/>
-        <copy todir="build/webapp/crawler-ui-proprietary/css">
-            <fileset dir="build/crawler-ui/css" includes="**/*.css,**/*.map"/>
-        </copy>
-        <jar destfile="build/webapp/crawler-ui-proprietary/WEB-INF/lib/mcf-crawler-ui.jar" basedir="build/crawler-ui/classes"/>
-    </target>
-
-    <target name="webapp-combined-service" depends="compile-combined-service,jar-core,jar-ui-core,jar-agents,jar-pull-agent,jar-api-servlet,jar-authority-servlet">
-        <mkdir dir="build/webapp/combined-service/WEB-INF/lib"/>
-        <copy todir="build/webapp/combined-service/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="jstl*.jar"/>
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="velocity*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-ui-core.jar"/>
-                <include name="mcf-api-servlet.jar"/>
-                <include name="mcf-authority-servlet.jar"/>
-            </fileset>
-        </copy>
-        <mkdir dir="build/webapp/combined-service/WEB-INF/jsp"/>
-        <copy todir="build/webapp/combined-service/WEB-INF/jsp">
-            <fileset dir="crawler-ui/src/main/webapp/WEB-INF/jsp">
-                <include name="*.tld"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/combined-service">
-            <fileset dir="crawler-ui/src/main/webapp" includes="**/*.jsp,**/*.css,**/*.png,**/*.html,**/*.js,**/*.eot,**/*.svg,**/*.ttf,**/*.woff,**/*.woff2"/>
-        </copy>
-        <jar destfile="build/webapp/combined-service/WEB-INF/lib/mcf-combined-service.jar" basedir="build/combined-service/classes"/>
-    </target>
-  
-      <target name="webapp-combined-service-proprietary" depends="compile-combined-service,jar-core,jar-ui-core,jar-agents,jar-pull-agent,jar-api-servlet,jar-authority-servlet">
-        <mkdir dir="build/webapp/combined-service-proprietary/WEB-INF/lib"/>
-        <copy todir="build/webapp/combined-service-proprietary/WEB-INF/lib">
-            <fileset dir="../lib">
-                <include name="jstl*.jar"/>
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="velocity*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="../lib-proprietary">
-                <include name="mysql*.jar"/>
-                <include name="ojdbc*.jar"/>
-                <include name="jtds*.jar"/>
-                <include name="mariadb-java-client*.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/combined-service-proprietary/WEB-INF/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-ui-core.jar"/>
-                <include name="mcf-api-servlet.jar"/>
-                <include name="mcf-authority-servlet.jar"/>
-            </fileset>
-        </copy>
-        <mkdir dir="build/webapp/combined-service-proprietary/WEB-INF/jsp"/>
-        <copy todir="build/webapp/combined-service-proprietary/WEB-INF/jsp">
-            <fileset dir="crawler-ui/src/main/webapp/WEB-INF/jsp">
-                <include name="*.tld"/>
-            </fileset>
-        </copy>
-        <copy todir="build/webapp/combined-service-proprietary">
-            <fileset dir="crawler-ui/src/main/webapp" includes="**/*.jsp,**/*.css,**/*.png,**/*.html,**/*.js,**/*.eot,**/*.svg,**/*.ttf,**/*.woff,**/*.woff2"/>
-        </copy>
-        <jar destfile="build/webapp/combined-service-proprietary/WEB-INF/lib/mcf-combined-service.jar" basedir="build/combined-service/classes"/>
-    </target>
-
-    <target name="war-authority-service" depends="webapp-authority-service">
-        <mkdir dir="build/war"/>
-        <war destfile="build/war/mcf-authority-service.war" webxml="authority-service/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/authority-service"/>
-    </target>
-
-    <target name="war-authority-service-proprietary" depends="webapp-authority-service-proprietary">
-        <mkdir dir="build/war-proprietary"/>
-        <war destfile="build/war-proprietary/mcf-authority-service.war" webxml="authority-service/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/authority-service-proprietary"/>
-    </target>
-
-    <target name="war-api-service" depends="webapp-api-service">
-        <mkdir dir="build/war"/>
-        <war destfile="build/war/mcf-api-service.war" webxml="api-service/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/api-service"/>
-    </target>
-
-    <target name="war-api-service-proprietary" depends="webapp-api-service-proprietary">
-        <mkdir dir="build/war-proprietary"/>
-        <war destfile="build/war-proprietary/mcf-api-service.war" webxml="api-service/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/api-service-proprietary"/>
-    </target>
-
-    <target name="war-crawler-ui" depends="webapp-crawler-ui">
-        <mkdir dir="build/war"/>
-        <war destfile="build/war/mcf-crawler-ui.war" webxml="crawler-ui/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/crawler-ui"/>
-    </target>
-
-    <target name="war-crawler-ui-proprietary" depends="webapp-crawler-ui-proprietary">
-        <mkdir dir="build/war-proprietary"/>
-        <war destfile="build/war-proprietary/mcf-crawler-ui.war" webxml="crawler-ui/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/crawler-ui-proprietary"/>
-    </target>
-
-    <target name="war-combined-service" depends="webapp-combined-service">
-        <mkdir dir="build/war"/>
-        <war destfile="build/war/mcf-combined-service.war" webxml="combined-service/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/combined-service"/>
-    </target>
-
-    <target name="war-combined-service-proprietary" depends="webapp-combined-service-proprietary">
-        <mkdir dir="build/war-proprietary"/>
-        <war destfile="build/war-proprietary/mcf-combined-service.war" webxml="combined-service/src/main/webapp/WEB-INF/web.xml" basedir="build/webapp/combined-service-proprietary"/>
-    </target>
-
-    <target name="wars" depends="war-authority-service,war-api-service,war-crawler-ui,war-combined-service">
-        <mkdir dir="dist/web/war"/>
-        <copy todir="dist/web/war">
-            <fileset dir="build/war"/>
-        </copy>
-    </target>
-
-    <target name="wars-proprietary" depends="war-authority-service-proprietary,war-api-service-proprietary,war-crawler-ui-proprietary,war-combined-service-proprietary">
-        <mkdir dir="dist/web-proprietary/war"/>
-        <copy todir="dist/web-proprietary/war">
-            <fileset dir="build/war-proprietary"/>
-        </copy>
-    </target>
-
-    <target name="buildfiles">
-        <mkdir dir="dist"/>
-        <copy todir="dist">
-            <fileset dir="buildfiles"/>
-        </copy>
-    </target>
-    
-
-    <target name="lib" depends="jar-core,jar-ui-core,jar-agents,jar-pull-agent,jar-jetty-runner,jar-script-engine">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="../lib">
-                <include name="zookeeper*.jar"/>
-                <include name="json-simple*.jar"/>
-                <include name="commons-codec*.jar"/>
-                <include name="commons-collections*.jar"/>
-                <include name="commons-collections4*.jar"/>
-                <include name="commons-el*.jar"/>
-                <include name="commons-fileupload*.jar"/>
-                <include name="httpcore*.jar"/>
-                <include name="httpclient*.jar"/>
-                <include name="commons-io*.jar"/>
-                <include name="commons-lang*.jar"/>
-                <include name="commons-logging*.jar"/>
-                <include name="log4j-1.2.*.jar"/>
-                <include name="log4j-api-*.jar"/>
-                <include name="log4j-core-*.jar"/>
-                <include name="log4j-1.2-api-*.jar"/>
-                <include name="serializer*.jar"/>
-                <include name="javax.servlet-api*.jar"/>
-                <include name="xalan*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="velocity*.jar"/>
-                <include name="slf4j*.jar"/>
-                <include name="mail*.jar"/>
-                <include name="commons-exec*.jar"/>
-                <include name="gson*.jar"/>
-                <include name="guava*.jar"/>
-                <include name="jna*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="jetty*.jar"/>
-                <include name="javax.servlet-api*.jar"/>
-                <include name="ecj*.jar"/>
-                <include name="jasper*.jar"/>
-                <include name="juli*.jar"/>
-                <include name="jsp-api*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="postgresql*.jar"/>
-                <include name="hsqldb*.jar"/>
-            </fileset>
-            <fileset dir="build/jar">
-                <include name="mcf-core.jar"/>
-                <include name="mcf-ui-core.jar"/>
-                <include name="mcf-agents.jar"/>
-                <include name="mcf-pull-agent.jar"/>
-                <include name="mcf-jetty-runner.jar"/>
-                <include name="mcf-script-engine.jar"/>
-            </fileset>
-        </copy>
-    </target>
-    
-    <target name="lib-proprietary">
-        <mkdir dir="dist/lib-proprietary"/>
-        <copy todir="dist/lib-proprietary">
-            <fileset dir="../lib-proprietary">
-                <include name="mysql*.jar"/>
-                <include name="ojdbc*.jar"/>
-                <include name="jtds*.jar"/>
-                <include name="mariadb-java-client*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="general-set-classpath">
-        <replace file="${processes-dir}/options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-engine-classpath">
-        <replace file="${processes-dir}/options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-obfuscate-classpath">
-        <replace file="${processes-dir}/options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-jetty-classpath">
-        <replace file="${processes-dir}/jetty-options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/jetty-options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-hsqldb-classpath">
-        <replace file="${processes-dir}/hsqldb-options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/hsqldb-options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-zookeeper-classpath">
-        <replace file="${processes-dir}/zk-options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/zk-options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-combined-classpath">
-        <replace file="${processes-dir}/combined-options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/combined-options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="general-set-start-classpath">
-        <replace file="${processes-dir}/start-options.env.win" token=".;" value=".;${win-classpath};"/>
-        <replace file="${processes-dir}/start-options.env.unix" token=".:" value=".:${unix-classpath}:"/>
-    </target>
-
-    <target name="preclean-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/options.env.win"/>
-        <delete file="${processes-dir}/options.env.unix"/>
-    </target>
-
-    <target name="preclean-obfuscate-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/options.env.win"/>
-        <delete file="${processes-dir}/options.env.unix"/>
-    </target>
-
-    <target name="preclean-engine-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/options.env.win"/>
-        <delete file="${processes-dir}/options.env.unix"/>
-    </target>
-
-    <target name="preclean-jetty-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/jetty-options.env.win"/>
-        <delete file="${processes-dir}/jetty-options.env.unix"/>
-    </target>
-
-    <target name="preclean-hsqldb-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/hsqldb-options.env.win"/>
-        <delete file="${processes-dir}/hsqldb-options.env.unix"/>
-    </target>
-
-    <target name="preclean-zookeeper-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/zk-options.env.win"/>
-        <delete file="${processes-dir}/zk-options.env.unix"/>
-    </target>
-
-    <target name="preclean-combined-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/combined-options.env.win"/>
-        <delete file="${processes-dir}/combined-options.env.unix"/>
-    </target>
-
-    <target name="preclean-start-processes">
-        <mkdir dir="${processes-dir}"/>
-        <delete file="${processes-dir}/start-options.env.win"/>
-        <delete file="${processes-dir}/start-options.env.unix"/>
-    </target>
-
-    <target name="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts-common"/>
-        </copy>
-    </target>
-    
-    <target name="scripts" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts"/>
-        </copy>
-    </target>
-
-    <target name="scripts-jetty" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts-jetty"/>
-        </copy>
-    </target>
-
-    <target name="scripts-hsqldb" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts-hsqldb"/>
-        </copy>
-    </target>
-
-    <target name="scripts-zookeeper" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts-zookeeper"/>
-        </copy>
-    </target>
-
-    <target name="scripts-combined" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts-combined"/>
-        </copy>
-    </target>
-
-    <target name="scripts-start" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="scripts-start"/>
-        </copy>
-    </target>
-
-    <target name="scripts-engine" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="engine-scripts"/>
-        </copy>
-    </target>
-
-    <target name="scripts-obfuscate" depends="scripts-common">
-        <mkdir dir="${processes-dir}"/>
-        <copy todir="${processes-dir}">
-            <fileset dir="obfuscate-scripts"/>
-        </copy>
-    </target>
-
-    <!-- Paths, as used to construct script classpaths -->
-    
-    <path id="jetty-lib">
-        <fileset dir="../lib">
-            <include name="jetty*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="database-lib">
-        <fileset dir="../lib">
-            <include name="hsqldb*.jar"/>
-            <include name="postgresql*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="hsqldb-lib">
-        <fileset dir="../lib">
-            <include name="hsqldb*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="zookeeper-lib">
-        <fileset dir="../lib">
-            <include name="zookeeper*.jar"/>
-            <include name="slf4j-api*.jar"/>
-            <include name="slf4j-simple*.jar"/>
-            <include name="log4j-1.2.*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="process-lib">
-          <fileset dir="../lib">
-            <include name="commons-lang*.jar"/>
-            <include name="commons-codec*.jar"/>
-            <include name="commons-collections*.jar"/>
-            <include name="commons-collections4*.jar"/>
-            <include name="commons-el*.jar"/>
-            <include name="commons-fileupload*.jar"/>
-            <include name="commons-io*.jar"/>
-            <include name="commons-logging*.jar"/>
-            <include name="commons-discovery*.jar"/>
-            <include name="jasper*.jar"/>
-            <include name="jsp-api-2.1-glassfish*.jar"/>
-            <include name="json-simple*.jar"/>
-            <include name="log4j-api-*.jar"/>
-            <include name="log4j-core-*.jar"/>
-            <include name="log4j-1.2-api-*.jar"/>
-            <include name="serializer*.jar"/>
-            <include name="javax.servlet-api*.jar"/>
-            <include name="juli*.jar"/>
-            <include name="xalan*.jar"/>
-            <include name="xercesImpl*.jar"/>
-            <include name="xml-apis*.jar"/>
-            <include name="ecj*.jar"/>
-            <include name="velocity*.jar"/>
-            <include name="slf4j-api*.jar"/>
-            <include name="slf4j-simple*.jar"/>
-            <include name="httpcore*.jar"/>
-            <include name="httpclient*.jar"/>
-            <include name="mail*.jar"/>
-            <include name="commons-exec*.jar"/>
-            <include name="gson*.jar"/>
-            <include name="guava*.jar"/>
-            <include name="jna*.jar"/>
-            <include name="zookeeper*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="process-lib-proprietary">
-        <fileset dir="../lib-proprietary">
-            <include name="mysql-connector-java*.jar"/>
-            <include name="ojdbc*.jar"/>
-            <include name="jtds*.jar"/>
-            <include name="mariadb-java-client*.jar"/>
-        </fileset>
-    </path>
-    
-    <path id="engine-lib">
-        <fileset dir="../lib">
-            <include name="commons-lang*.jar"/>
-            <include name="commons-codec*.jar"/>
-            <include name="commons-collections*.jar"/>
-            <include name="commons-io*.jar"/>
-            <include name="commons-logging*.jar"/>
-            <include name="json-simple*.jar"/>
-            <include name="httpcore*.jar"/>
-            <include name="httpclient*.jar"/>
-        </fileset>
-    </path>
-
-    <path id="obfuscate-lib">
-        <fileset dir="../lib">
-            <include name="commons-logging*.jar"/>
-        </fileset>
-    </path>
-
-    <!-- Classpaths -->
-    
-    <target name="jetty-lib-classpath" depends="lib">
-        <property name="jetty-lib-classpath" location="../lib"/>
-        <pathconvert property="jetty-lib-classpath-win" refid="jetty-lib" dirsep="\" pathsep=";">
-            <map from="${jetty-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="jetty-lib-classpath-unix" refid="jetty-lib" dirsep="/" pathsep=":">
-            <map from="${jetty-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="hsqldb-lib-classpath" depends="lib">
-        <property name="hsqldb-lib-classpath" location="../lib"/>
-        <pathconvert property="hsqldb-lib-classpath-win" refid="hsqldb-lib" dirsep="\" pathsep=";">
-            <map from="${hsqldb-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="hsqldb-lib-classpath-unix" refid="hsqldb-lib" dirsep="/" pathsep=":">
-            <map from="${hsqldb-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="zookeeper-lib-classpath" depends="lib">
-        <property name="zookeeper-lib-classpath" location="../lib"/>
-        <pathconvert property="zookeeper-lib-classpath-win" refid="zookeeper-lib" dirsep="\" pathsep=";">
-            <map from="${zookeeper-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="zookeeper-lib-classpath-unix" refid="zookeeper-lib" dirsep="/" pathsep=":">
-            <map from="${zookeeper-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="database-lib-classpath" depends="lib">
-        <property name="database-lib-classpath" location="../lib"/>
-        <pathconvert property="database-lib-classpath-win" refid="database-lib" dirsep="\" pathsep=";">
-            <map from="${database-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="database-lib-classpath-unix" refid="database-lib" dirsep="/" pathsep=":">
-            <map from="${database-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="process-lib-classpath" depends="lib">
-        <property name="process-lib-classpath" location="../lib"/>
-        <pathconvert property="process-lib-classpath-win" refid="process-lib" dirsep="\" pathsep=";">
-            <map from="${process-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="process-lib-classpath-unix" refid="process-lib" dirsep="/" pathsep=":">
-            <map from="${process-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="process-lib-proprietary-classpath" depends="lib-proprietary">
-        <property name="process-lib-proprietary-classpath" location="../lib-proprietary"/>
-        <pathconvert property="process-lib-proprietary-classpath-win" refid="process-lib-proprietary" dirsep="\" pathsep=";">
-            <map from="${process-lib-proprietary-classpath}" to="..\lib-proprietary"/>
-        </pathconvert>
-        <pathconvert property="process-lib-proprietary-classpath-unix" refid="process-lib-proprietary" dirsep="/" pathsep=":">
-            <map from="${process-lib-proprietary-classpath}" to="../lib-proprietary"/>
-        </pathconvert>
-    </target>
-
-    <target name="engine-lib-classpath" depends="lib">
-        <property name="engine-lib-classpath" location="../lib"/>
-        <pathconvert property="engine-lib-classpath-win" refid="engine-lib" dirsep="\" pathsep=";">
-            <map from="${engine-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="engine-lib-classpath-unix" refid="engine-lib" dirsep="/" pathsep=":">
-            <map from="${engine-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="obfuscate-lib-classpath" depends="lib">
-        <property name="obfuscate-lib-classpath" location="../lib"/>
-        <pathconvert property="obfuscate-lib-classpath-win" refid="obfuscate-lib" dirsep="\" pathsep=";">
-            <map from="${obfuscate-lib-classpath}" to="..\lib"/>
-        </pathconvert>
-        <pathconvert property="obfuscate-lib-classpath-unix" refid="obfuscate-lib" dirsep="/" pathsep=":">
-            <map from="${obfuscate-lib-classpath}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="jetty-lib-manifest" depends="lib">
-        <property name="jetty-lib-manifest" location="../lib"/>
-        <pathconvert property="jetty-manifest-cp" refid="jetty-lib" dirsep="/" pathsep=" ">
-            <map from="${jetty-lib-manifest}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="database-lib-manifest" depends="lib">
-        <property name="database-lib-manifest" location="../lib"/>
-        <pathconvert property="database-manifest-cp" refid="database-lib" dirsep="/" pathsep=" ">
-            <map from="${database-lib-manifest}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="process-lib-manifest" depends="lib">
-        <property name="process-lib-manifest" location="../lib"/>
-        <pathconvert property="process-manifest-cp" refid="process-lib" dirsep="/" pathsep=" ">
-            <map from="${process-lib-manifest}" to="../lib"/>
-        </pathconvert>
-    </target>
-
-    <target name="process-lib-proprietary-manifest" depends="lib-proprietary">
-        <property name="process-manifest-proprietary" location="../lib-proprietary" />
-        <pathconvert property="process-manifest-cp-proprietary" refid="process-lib-proprietary" dirsep="/" pathsep=" ">
-            <map from="${process-manifest-proprietary}" to="../lib-proprietary"/>
-        </pathconvert>
-    </target>
-
-
-    <!-- Apply classpaths to various scripts -->
-    
-    <target name="setup-obfuscate-processes" depends="preclean-obfuscate-processes,scripts-obfuscate,obfuscate-lib-classpath">
-        <antcall target="general-set-obfuscate-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;${obfuscate-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:${obfuscate-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-engine-processes" depends="preclean-engine-processes,scripts-engine,engine-lib-classpath">
-        <antcall target="general-set-engine-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-script-engine.jar;${engine-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-script-engine.jar:${engine-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-    
-    <target name="setup-jetty-processes" depends="preclean-jetty-processes,scripts-jetty,process-lib-classpath,jetty-lib-classpath">
-        <antcall target="general-set-jetty-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-agents.jar;..\lib\mcf-pull-agent.jar;..\lib\mcf-ui-core.jar;..\lib\mcf-jetty-runner.jar;${jetty-lib-classpath-win};${process-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-agents.jar:../lib/mcf-pull-agent.jar:../lib/mcf-ui-core.jar:../lib/mcf-jetty-runner.jar:${jetty-lib-classpath-unix}:${process-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-hsqldb-processes" depends="preclean-hsqldb-processes,scripts-hsqldb,hsqldb-lib-classpath">
-        <antcall target="general-set-hsqldb-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="${hsqldb-lib-classpath-win}"/>
-            <param name="unix-classpath" value="${hsqldb-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-zookeeper-processes" depends="preclean-zookeeper-processes,scripts-zookeeper,zookeeper-lib-classpath">
-        <antcall target="general-set-zookeeper-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="${zookeeper-lib-classpath-win}"/>
-            <param name="unix-classpath" value="${zookeeper-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-combined-processes" depends="preclean-combined-processes,scripts-combined,process-lib-classpath,jetty-lib-classpath">
-        <antcall target="general-set-combined-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-agents.jar;..\lib\mcf-pull-agent.jar;..\lib\mcf-ui-core.jar;..\lib\mcf-jetty-runner.jar;${jetty-lib-classpath-win};${process-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-agents.jar:../lib/mcf-pull-agent.jar:../lib/mcf-ui-core.jar:../lib/mcf-jetty-runner.jar:${jetty-lib-classpath-unix}:${process-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-start-processes" depends="preclean-start-processes,scripts-start,process-lib-classpath,database-lib-classpath,jetty-lib-classpath">
-        <antcall target="general-set-start-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-agents.jar;..\lib\mcf-pull-agent.jar;..\lib\mcf-ui-core.jar;..\lib\mcf-jetty-runner.jar;${jetty-lib-classpath-win};${database-lib-classpath-win};${process-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-agents.jar:../lib/mcf-pull-agent.jar:../lib/mcf-ui-core.jar:../lib/mcf-jetty-runner.jar:${jetty-lib-classpath-unix}:${database-lib-classpath-unix}:${process-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-processes" depends="preclean-processes,scripts,process-lib-classpath,database-lib-classpath">
-        <antcall target="general-set-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-agents.jar;..\lib\mcf-pull-agent.jar;${database-lib-classpath-win};${process-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-agents.jar:../lib/mcf-pull-agent.jar:${database-lib-classpath-unix}:${process-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-jetty-processes-proprietary" depends="setup-jetty-processes">
-    </target>
-
-    <target name="setup-hsqldb-processes-proprietary" depends="setup-hsqldb-processes">
-    </target>
-
-    <target name="setup-zookeeper-processes-proprietary" depends="setup-zookeeper-processes">
-    </target>
-
-    <target name="setup-combined-processes-proprietary" depends="setup-combined-processes">
-    </target>
-
-    <target name="setup-start-processes-proprietary" depends="preclean-start-processes,scripts-start,process-lib-classpath,process-lib-proprietary-classpath,database-lib-classpath,jetty-lib-classpath">
-        <antcall target="general-set-start-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-agents.jar;..\lib\mcf-pull-agent.jar;..\lib\mcf-ui-core.jar;..\lib\mcf-jetty-runner.jar;${jetty-lib-classpath-win};${database-lib-classpath-win};${process-lib-proprietary-classpath-win};${process-lib-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-agents.jar:../lib/mcf-pull-agent.jar:../lib/mcf-ui-core.jar:../lib/mcf-jetty-runner.jar:${jetty-lib-classpath-unix}:${database-lib-classpath-unix}:${process-lib-proprietary-classpath-unix}:${process-lib-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <target name="setup-processes-proprietary" depends="preclean-processes,scripts,process-lib-classpath,database-lib-classpath,process-lib-proprietary-classpath">
-        <antcall target="general-set-classpath">
-            <param name="processes-dir" value="${processes-dir}"/>
-            <param name="win-classpath" value="..\lib\mcf-core.jar;..\lib\mcf-agents.jar;..\lib\mcf-pull-agent.jar;${database-lib-classpath-win};${process-lib-classpath-win};${process-lib-proprietary-classpath-win}"/>
-            <param name="unix-classpath" value="../lib/mcf-core.jar:../lib/mcf-agents.jar:../lib/mcf-pull-agent.jar:${database-lib-classpath-unix}:${process-lib-classpath-unix}:${process-lib-proprietary-classpath-unix}"/>
-        </antcall>
-    </target>
-
-    <!-- Set up connector-common-lib -->
-    
-    <target name="connector-common-lib" depends="jar-connector-common">
-        <mkdir dir="dist/connector-common-lib"/>
-        <copy todir="dist/connector-common-lib">
-            <fileset dir="build/jar">
-                <include name="mcf-connector-common.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="tika-core*.jar"/>
-                <include name="jackson-core*.jar"/>
-                <include name="jackson-databind*.jar"/>
-                <include name="jackson-annotations*.jar"/>
-                <include name="tika-parsers*.jar"/>
-                <include name="json-1*.jar"/>
-                <include name="poi*.jar"/>
-                <include name="dom4j*.jar"/>
-                <include name="xmlbeans*.jar"/>
-                <include name="curvesapi*.jar"/>
-                <include name="geoapi*.jar"/>
-                <include name="jsr-275*.jar"/>
-                <include name="sis-metadata*.jar"/>
-                <include name="sis-utility*.jar"/>
-                <include name="sis-netcdf*.jar"/>
-                <include name="sis-storage*.jar"/>
-                <include name="opennlp-tools*.jar"/>
-                <include name="jackcess*.jar"/>
-                <include name="junrar*.jar"/>
-                <include name="commons-vfs2*.jar"/>
-                <include name="maven-scm*.jar"/>
-                <include name="plexus-utils*.jar"/>
-                <include name="regexp*.jar"/>
-                <include name="commons-csv*.jar"/>
-                <include name="netcdf4*.jar"/>
-                <include name="httpservices*.jar"/>
-                <include name="grib*.jar"/>
-                <include name="jj2000*.jar"/>
-                <include name="cdm*.jar"/>
-                <include name="udunits*.jar"/>
-                <include name="jcommander*.jar"/>
-                <include name="jcip-annotations*.jar"/>
-                <include name="ehcache-core*.jar"/>
-                <include name="bzip2*.jar"/>
-                <include name="jdom2*.jar"/>
-                <include name="quartz*.jar"/>
-                <include name="c3p0*.jar"/>
-                <include name="sentiment-analysis-parser*.jar"/>
-                <include name="tagsoup*.jar"/>
-                <include name="vorbis-java*.jar"/>
-                <include name="netcdf*.jar"/>
-                <include name="unidataCommon*.jar"/>
-                <include name="commons-httpclient*.jar"/>
-                <include name="apache-mime4j-core*.jar"/>
-                <include name="apache-mime4j-dom*.jar"/>
-                <include name="commons-compress*.jar"/>
-                <include name="pdfbox*.jar"/>
-                <include name="fontbox*.jar"/>
-                <include name="jempbox*.jar"/>
-                <include name="kafka*.jar"/>
-                <include name="zookeeper*.jar"/>
-                <include name="bcmail-jdk15*.jar"/>
-                <include name="bcprov-jdk15*.jar"/>
-                <include name="bcpkix-jdk15*.jar"/>
-                <include name="geronimo-stax-api_1.0_spec*.jar"/>
-                <include name="asm*.jar"/>
-                <include name="isoparser*.jar"/>
-                <include name="aspectjrt*.jar"/>
-                <include name="metadata-extractor*.jar"/>
-                <include name="xmpcore*.jar"/>
-                <include name="xml-apis*.jar"/>
-                <include name="boilerpipe*.jar"/>
-                <include name="rome*.jar"/>
-                <include name="jdom*.jar"/>
-                <include name="xercesImpl*.jar"/>
-                <include name="vorbis-java-core*.jar"/>
-                <include name="juniversalchardet*.jar"/>
-                <include name="jhighlight*.jar"/>
-                <include name="jmatio*.jar"/>
-                <include name="java-libpst*.jar"/>
-                <include name="xz*.jar"/>
-                <include name="cxf-*.jar"/>
-                <include name="neethi*.jar"/>
-                <include name="xmlschema-core*.jar"/>
-                <include name="javax.annotation-api*.jar"/>
-                <include name="javax.ws.rs-api*.jar"/>
-            </fileset>
-            <fileset dir="../lib">
-                <include name="castor*.jar"/>
-                <include name="geronimo-javamail_1.4_spec*.jar"/>
-                <include name="commons-discovery*.jar"/>
-                <include name="axis*.jar"/>
-                <include name="wss4j*.jar"/>
-                <include name="saaj*.jar"/>
-                <include name="wsdl4j*.jar"/>
-                <include name="xmlsec*.jar"/>
-                <include name="opensaml*.jar"/>
-                <include name="activation*.jar"/>
-            </fileset>
-        </copy>
-    </target>
-    
-    <!-- Set up example directories -->
-    
-    <target name="example-common" depends="wars,wars-proprietary,connector-common-lib">
-        <copy file="example-common/connectors.xml" tofile="dist/connectors.xml"/>
-        <copy file="example-common/connectors.xml" tofile="dist/connectors-proprietary.xml"/>
-        <mkdir dir="dist/connector-lib"/>
-        <mkdir dir="dist/connector-lib-proprietary"/>
-        <copy file="example-common/README.txt" todir="dist/connector-lib-proprietary"/>
-    </target>
-    
-    <target name="multi-processes-file" depends="lib">
-        <antcall target="setup-processes">
-            <param name="processes-dir" value="dist/multiprocess-file-example"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-file-example/syncharea"/>
-    </target>
-
-    <target name="multi-processes-file-proprietary" depends="lib,lib-proprietary">
-        <antcall target="setup-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-file-example-proprietary"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-file-example-proprietary/syncharea"/>
-    </target>
-
-    <target name="multi-processes-zk" depends="lib">
-        <antcall target="setup-processes">
-            <param name="processes-dir" value="dist/multiprocess-zk-example"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-zk-example/zookeeper"/>
-    </target>
-
-    <target name="multi-processes-zk-proprietary" depends="lib,lib-proprietary">
-        <antcall target="setup-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-zk-example-proprietary"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-zk-example-proprietary/zookeeper"/>
-    </target>
-
-    <target name="multi-process-file-example" depends="lib,multi-processes-file">
-        <antcall target="setup-jetty-processes">
-            <param name="processes-dir" value="dist/multiprocess-file-example"/>
-        </antcall>
-        <antcall target="setup-hsqldb-processes">
-            <param name="processes-dir" value="dist/multiprocess-file-example"/>
-        </antcall>
-
-        <mkdir dir="dist/multiprocess-file-example"/>
-        <copy todir="dist/multiprocess-file-example">
-            <fileset dir="example-multiprocess-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-multiprocess-file-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-            </fileset>
-            <fileset dir="example-multiprocess-file">
-                <include name="properties.xml"/>
-            </fileset>
-        </copy>
-        <replace file="dist/multiprocess-file-example/properties.xml" token="unknown version" value="${release-version}"/>
-        
-        <mkdir dir="dist/multiprocess-file-example/logs"/>
-        <chmod dir="dist/multiprocess-file-example" perm="a+x" includes="**/*.sh"/>
-    </target>
-  
-      <target name="multi-process-file-example-proprietary" depends="lib,lib-proprietary,multi-processes-file-proprietary">
-        <antcall target="setup-jetty-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-file-example-proprietary"/>
-        </antcall>
-        <antcall target="setup-hsqldb-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-file-example-proprietary"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-file-example-proprietary"/>
-        <copy todir="dist/multiprocess-file-example-proprietary">
-            <fileset dir="example-multiprocess-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-multiprocess-file-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-            </fileset>
-            <fileset dir="example-multiprocess-file-proprietary">
-                <include name="properties.xml"/>
-            </fileset>
-        </copy>
-        <replace file="dist/multiprocess-file-example-proprietary/properties.xml" token="unknown version" value="${release-version}"/>
-        <mkdir dir="dist/multiprocess-file-example-proprietary/logs"/>
-        <chmod dir="dist/multiprocess-file-example-proprietary" perm="a+x" includes="**/*.sh"/>
-    </target>
-
-    <target name="multi-process-zk-example" depends="lib,multi-processes-zk">
-        <antcall target="setup-jetty-processes">
-            <param name="processes-dir" value="dist/multiprocess-zk-example"/>
-        </antcall>
-        <antcall target="setup-hsqldb-processes">
-            <param name="processes-dir" value="dist/multiprocess-zk-example"/>
-        </antcall>
-        <antcall target="setup-zookeeper-processes">
-            <param name="processes-dir" value="dist/multiprocess-zk-example"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-zk-example"/>
-        <copy todir="dist/multiprocess-zk-example">
-            <fileset dir="example-multiprocess-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-multiprocess-zk-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.cfg"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-multiprocess-zk">
-                <include name="properties.xml"/>
-            </fileset>
-        </copy>
-        <replace file="dist/multiprocess-zk-example/properties-global.xml" token="unknown version" value="${release-version}"/>
-        <mkdir dir="dist/multiprocess-zk-example/logs"/>
-        <chmod dir="dist/multiprocess-zk-example" perm="a+x" includes="**/*.sh"/>
-    </target>
-  
-      <target name="multi-process-zk-example-proprietary" depends="lib,lib-proprietary,multi-processes-zk-proprietary">
-        <antcall target="setup-jetty-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-zk-example-proprietary"/>
-        </antcall>
-        <antcall target="setup-hsqldb-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-zk-example-proprietary"/>
-        </antcall>
-        <antcall target="setup-zookeeper-processes-proprietary">
-            <param name="processes-dir" value="dist/multiprocess-zk-example-proprietary"/>
-        </antcall>
-        <mkdir dir="dist/multiprocess-zk-example-proprietary"/>
-        <copy todir="dist/multiprocess-zk-example-proprietary">
-            <fileset dir="example-multiprocess-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-multiprocess-zk-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.cfg"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-multiprocess-zk-proprietary">
-                <include name="properties.xml"/>
-            </fileset>
-        </copy>
-        <replace file="dist/multiprocess-zk-example-proprietary/properties-global.xml" token="unknown version" value="${release-version}"/>
-        <mkdir dir="dist/multiprocess-zk-example-proprietary/logs"/>
-        <chmod dir="dist/multiprocess-zk-example-proprietary" perm="a+x" includes="**/*.sh"/>
-    </target>
-
-    <target name="obfuscation-utility" depends="lib">
-        <antcall target="setup-obfuscate-processes">
-            <param name="processes-dir" value="dist/obfuscation-utility"/>
-        </antcall>
-        <chmod dir="dist/obfuscation-utility" perm="a+x" includes="**/*.sh"/>
-    </target>
-    
-    <target name="script-engine" depends="lib">
-        <antcall target="setup-engine-processes">
-            <param name="processes-dir" value="dist/script-engine"/>
-        </antcall>
-        <copy todir="dist/script-engine">
-            <fileset dir="script-example"/>
-        </copy>
-        <chmod dir="dist/script-engine" perm="a+x" includes="**/*.sh"/>
-    </target>
-    
-    <target name="single-process-start-jar" depends="process-lib-manifest,jetty-lib-manifest,database-lib-manifest">
-        <mkdir dir="build/example"/>
-        <manifest file="build/example/manifest">
-            <attribute name="Main-Class" value="org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner"/>
-            <attribute name="Class-Path" value="../lib/mcf-core.jar ../lib/mcf-agents.jar ../lib/mcf-pull-agent.jar ../lib/mcf-ui-core.jar ../lib/mcf-jetty-runner.jar ${database-manifest-cp} ${process-manifest-cp} ${jetty-manifest-cp}"/>
-        </manifest>
-        <jar destfile="dist/example/start.jar" manifest="build/example/manifest"/>
-    </target>
-    
-    <target name="single-process-example" depends="single-process-start-jar">
-        <antcall target="setup-combined-processes">
-            <param name="processes-dir" value="dist/example"/>
-        </antcall>
-        <antcall target="setup-start-processes">
-            <param name="processes-dir" value="dist/example"/>
-        </antcall>
-        <mkdir dir="dist/example/logs"/>
-        <copy todir="dist/example">
-            <fileset dir="example-singleprocess-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-singleprocess">
-                <include name="properties.xml"/>
-            </fileset>
-        </copy>
-        <replace file="dist/example/properties.xml" token="unknown version" value="${release-version}"/>
-
-        <chmod dir="dist/example" perm="a+x" includes="**/*.sh"/>
-
-    </target>
-
-    <target name="single-process-start-jar-proprietary" depends="process-lib-manifest,jetty-lib-manifest,process-lib-proprietary-manifest,database-lib-manifest">
-        <mkdir dir="build/example-proprietary"/>
-        <manifest file="build/example-proprietary/manifest">
-            <attribute name="Main-Class" value="org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner"/>
-            <attribute name="Class-Path" value="../lib/mcf-core.jar ../lib/mcf-agents.jar ../lib/mcf-pull-agent.jar ../lib/mcf-ui-core.jar ../lib/mcf-jetty-runner.jar ${database-manifest-cp} ${process-manifest-cp} ${jetty-manifest-cp} ${process-manifest-cp-proprietary}"/>
-        </manifest>
-        <jar destfile="dist/example-proprietary/start.jar" manifest="build/example-proprietary/manifest"/>
-    </target>
-    
-    <target name="single-process-example-proprietary" depends="single-process-start-jar-proprietary">
-        <antcall target="setup-combined-processes-proprietary">
-            <param name="processes-dir" value="dist/example-proprietary"/>
-        </antcall>
-        <antcall target="setup-start-processes-proprietary">
-            <param name="processes-dir" value="dist/example-proprietary"/>
-        </antcall>
-        <mkdir dir="dist/example-proprietary/logs"/>
-        <copy todir="dist/example-proprietary">
-            <fileset dir="example-singleprocess-common">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-                <include name="*.xml"/>
-            </fileset>
-            <fileset dir="example-singleprocess-proprietary">
-                <include name="properties.xml"/>
-            </fileset>
-        </copy>
-        <replace file="dist/example-proprietary/properties.xml" token="unknown version" value="${release-version}"/>
-
-        <chmod dir="dist/example-proprietary" perm="a+x" includes="**/*.sh"/>
-    </target>
-
-    <target name="compile-core-tests" depends="compile-core">
-        <mkdir dir="build/core-tests/classes"/>
-        <javac srcdir="core/src/test/java" destdir="build/core-tests/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-connector-common-tests" depends="compile-connector-common">
-        <mkdir dir="build/connector-common-tests/classes"/>
-        <javac srcdir="connector-common/src/test/java" destdir="build/connector-common-tests/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-agents-tests" depends="compile-core-tests,compile-agents">
-        <mkdir dir="build/agents-tests/classes"/>
-        <javac srcdir="agents/src/test/java" destdir="build/agents-tests/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/agents/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-pull-agent-tests" depends="compile-agents-tests,compile-pull-agent">
-        <mkdir dir="build/pull-agent-tests/classes"/>
-        <javac srcdir="pull-agent/src/test/java" destdir="build/pull-agent-tests/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/agents-tests/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-script-engine-tests" depends="compile-core,compile-script-engine">
-        <mkdir dir="build/script-engine-tests/classes"/>
-        <javac srcdir="script-engine/src/test/java" destdir="build/script-engine-tests/classes" deprecation="true" target="1.8" source="1.8" debug="true" encoding="utf-8" debuglevel="lines,vars,source">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/script-engine/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-tests" depends="compile-core-tests,compile-agents-tests,compile-pull-agent-tests,compile-script-engine-tests"/>
-    
-    <target name="jar-core-tests" depends="compile-core-tests">
-        <mkdir dir="build/test-jar"/>
-        <jar destfile="build/test-jar/mcf-core-tests.jar">
-          <fileset dir="build/core-tests/classes"/>
-          <fileset dir="core/src/test/resources"/>
-        </jar>
-    </target>
-
-    <target name="jar-agents-tests" depends="compile-agents-tests">
-        <mkdir dir="build/test-jar"/>
-        <jar destfile="build/test-jar/mcf-agents-tests.jar" basedir="build/agents-tests/classes"/>
-    </target>
-
-    <target name="jar-pull-agent-tests" depends="compile-pull-agent-tests">
-        <mkdir dir="build/test-jar"/>
-        <jar destfile="build/test-jar/mcf-pull-agent-tests.jar" basedir="build/pull-agent-tests/classes"/>
-    </target>
-
-    <target name="jar-script-engine-tests" depends="compile-script-engine-tests">
-        <mkdir dir="build/test-jar"/>
-        <jar destfile="build/test-jar/mcf-script-engine-tests.jar" basedir="build/script-engine-tests/classes"/>
-    </target>
-
-    <target name="jar-tests" depends="jar-core-tests,jar-agents-tests,jar-pull-agent-tests,jar-script-engine-tests"/>
-
-    <target name="test-lib" depends="jar-tests">
-        <mkdir dir="dist/test-lib"/>
-        <copy todir="dist/test-lib">
-            <fileset dir="../lib">
-                <include name="junit*.jar"/>
-                <include name="selenium*.jar"/>
-                <include name="cglib-nodep*.jar"/>
-                <include name="hamcrest-core*.jar"/>
-                <include name="mockito-core*.jar"/>
-                <include name="wiremock*.jar"/>
-                <include name="objenesis*.jar"/>
-                <include name="juli*.jar"/>
-            </fileset>
-            <fileset dir="build/test-jar">
-                <include name="mcf-core-tests.jar"/>
-                <include name="mcf-agents-tests.jar"/>
-                <include name="mcf-pull-agent-tests.jar"/>
-                <include name="mcf-script-engine-tests.jar"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="build-tests" depends="jar-tests"/>
-
-    <target name="run-core-tests" depends="compile-core,compile-core-tests">
-        <mkdir dir="test-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.core.common.DateTest" todir="test-output"/>
-            <test name="org.apache.manifoldcf.core.lockmanager.TestZooKeeperLocks" todir="test-output"/>
-            <test name="org.apache.manifoldcf.core.interfaces.ConfigurationTest" todir="test-output"/>
-
-        </junit>
-    </target>
-
-    <target name="run-connector-common-tests" depends="compile-connector-common,compile-connector-common-tests,compile-core,compile-core-tests">
-        <mkdir dir="test-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-                <pathelement location="build/connector-common-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.connectorcommon.fuzzyml.TestFuzzyML" todir="test-output"/>
-            <test name="org.apache.manifoldcf.connectorcommon.jsongen.TestJsonGen" todir="test-output"/>
-            <test name="org.apache.manifoldcf.connectorcommon.throttler.TestThrottler" todir="test-output"/>
-
-        </junit>
-    </target>
-
-    <target name="run-pull-agent-tests" depends="compile-pull-agent,compile-connector-common,compile-pull-agent-tests">
-        <mkdir dir="test-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/ui-core/classes"/>                
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/agents-tests/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/pull-agent-tests/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.crawler.tests.ConnectionChangeHSQLDBTest" todir="test-output"/>
-            <test name="org.apache.manifoldcf.crawler.tests.SchedulerHSQLDBTest" todir="test-output"/>
-            <test name="org.apache.manifoldcf.crawler.tests.InterruptionHSQLDBTest" todir="test-output"/>
-
-        </junit>
-    </target>
-
-    <target name="run-script-engine-tests" depends="compile-core,compile-script-engine,compile-script-engine-tests">
-        <mkdir dir="test-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/script-engine/classes"/>
-                <pathelement location="build/script-engine-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.scriptengine.tests.ExpressionTest" todir="test-output"/>
-            <test name="org.apache.manifoldcf.scriptengine.tests.CommandTest" todir="test-output"/>
-            
-        </junit>
-    </target>
-
-    <target name="run-UI-tests" depends="jar-core-tests">
-        <mkdir dir="test-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <fileset dir="build/test-jar">
-                    <include name="mcf-core-tests.jar"/>
-                </fileset>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.core.tests.HTMLTester" todir="test-output"/>
-            
-        </junit>
-    </target>
-
-    <target name="run-tests" depends="compile-tests,run-core-tests,run-connector-common-tests,run-pull-agent-tests,run-script-engine-tests"/>
-
-    <target name="run-tests-postgresql" depends="compile-tests">
-        <mkdir dir="test-postgresql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-postgresql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-                <pathelement location="build/authority-servlet/classes"/>
-                <pathelement location="build/api-servlet/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/agents-tests/classes"/>
-                <pathelement location="build/pull-agent-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.agents.tests.SanityPostgresqlTest" todir="test-postgresql-output"/>
-            <test name="org.apache.manifoldcf.crawler.tests.SanityPostgresqlTest" todir="test-postgresql-output"/>
-            <!-- MHL -->
-        </junit>
-    </target>
-
-    <target name="run-tests-mysql" depends="compile-tests">
-        <mkdir dir="test-mysql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-mysql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-                <pathelement location="build/authority-servlet/classes"/>
-                <pathelement location="build/api-servlet/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/agents-tests/classes"/>
-                <pathelement location="build/pull-agent-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.agents.tests.SanityMySQLTest" todir="test-mysql-output"/>
-            <test name="org.apache.manifoldcf.crawler.tests.SanityMySQLTest" todir="test-mysql-output"/>
-            <!-- MHL -->
-        </junit>
-    </target>
-
-    <target name="run-tests-HSQLDB" depends="compile-tests">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-                <pathelement location="build/authority-servlet/classes"/>
-                <pathelement location="build/api-servlet/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/agents-tests/classes"/>
-                <pathelement location="build/pull-agent-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.agents.tests.SanityHSQLDBTest" todir="test-HSQLDB-output"/>
-            <test name="org.apache.manifoldcf.crawler.tests.SanityHSQLDBTest" todir="test-HSQLDB-output"/>
-
-            <!-- MHL -->
-        </junit>
-    </target>
-
-    <target name="run-tests-HSQLDBext" depends="compile-tests">
-        <mkdir dir="test-HSQLDBext-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDBext-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="framework-classpath"/>
-                <pathelement location="build/core/classes"/>
-                <pathelement location="build/ui-core/classes"/>
-                <pathelement location="build/agents/classes"/>
-                <pathelement location="build/pull-agent/classes"/>
-                <pathelement location="build/connector-common/classes"/>
-                <pathelement location="build/authority-servlet/classes"/>
-                <pathelement location="build/api-servlet/classes"/>
-                <pathelement location="build/core-tests/classes"/>
-                <pathelement location="build/agents-tests/classes"/>
-                <pathelement location="build/pull-agent-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-
-            <test name="org.apache.manifoldcf.agents.tests.SanityHSQLDBextTest" todir="test-HSQLDBext-output"/>
-            <test name="org.apache.manifoldcf.crawler.tests.SanityHSQLDBextTest" todir="test-HSQLDBext-output"/>
-            <!-- MHL -->
-        </junit>
-    </target>
-
-    <target name="run-script-interpreter" depends="script-engine">
-        <java classname="org.apache.manifoldcf.scriptengine.ScriptParser" fork="true" dir="dist/script-engine" maxmemory="128M">
-          <classpath>
-            <fileset dir="dist/script-engine/jar">
-              <include name="*.jar"/>
-            </fileset>
-          </classpath>
-        </java>
-    </target>
-
-    <target name="build" depends="multi-process-zk-example,multi-process-zk-example-proprietary,multi-process-file-example,multi-process-file-example-proprietary,single-process-example,single-process-example-proprietary,example-common,script-engine,obfuscation-utility,file-resources,buildfiles,test-lib"/>
-    
-    <target name="all" depends="build,doc,build-tests,run-tests,run-tests-HSQLDB,run-tests-HSQLDBext"/>
-    
-</project>
diff --git a/framework/buildfiles/connector-build.xml b/framework/buildfiles/connector-build.xml
deleted file mode 100644
index 63ac931..0000000
--- a/framework/buildfiles/connector-build.xml
+++ /dev/null
@@ -1,1353 +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.
--->
-
-<project name="mcf-connector-build">
-
-    <property environment="env"/>
-
-    <target name="setup-maven-url">
-        <property name="maven-base-url" value="https://repo1.maven.org/maven2"/>
-    </target>
-    
-    <target name="download-via-maven" depends="setup-maven-url">
-        <get src="${maven-base-url}/${project-path}/${artifact-name}/${artifact-version}/${artifact-name}-${artifact-version}.${artifact-type}" dest="${target}/${artifact-name}-${artifact-version}.${artifact-type}"/>
-    </target>
-
-    <target name="checkout-source-via-svn">
-        <mkdir dir="${root-dir}"/>
-        <exec dir="${root-dir}" executable="svn" failifexecutionfails="true" failonerror="true">
-              <arg value="checkout" />
-              <arg value="${svn-url}" />
-              <arg value="${dir-name}" />
-        </exec>
-    </target>
-
-    <target name="calculate-svn-patch-available">
-        <mkdir dir="build/svn-check"/>
-        <exec dir="build/svn-check" output="build/svn-check/svn.output" executable="svn" failifexecutionfails="true" failonerror="true">
-              <arg value="--version" />
-        </exec>
-        <loadfile property="svn-output" srcFile="build/svn-check/svn.output"/>
-        <condition property="svn-version-ok">
-            <or>
-                <contains string="${svn-output}" substring="1.7."/>
-                <contains string="${svn-output}" substring="1.8."/>
-                <contains string="${svn-output}" substring="1.9."/>
-                <contains string="${svn-output}" substring="1.10."/>
-                <contains string="${svn-output}" substring="1.11."/>
-            </or>
-        </condition>
-    </target>
-
-    <target name="calculate-patch-available" depends="calculate-svn-patch-available" unless="svn-version-ok">
-        <condition property="patch-ok">
-            <os family="unix"/>
-        </condition>
-    </target>
-    
-    <target name="check-svn-patch-available" depends="calculate-svn-patch-available" unless="svn-version-ok">
-        <echo message="You need svn version 1.7 or higher - attempting patch instead."/>
-    </target>
-    
-    <target name="check-patch-available" depends="calculate-patch-available" unless="patch-ok">
-    </target>
-    
-    <target name="patch-source-via-svn" depends="check-svn-patch-available" if="svn-version-ok">
-        <mkdir dir="${root-dir}"/>
-        <exec dir="${root-dir}" executable="svn" failifexecutionfails="true" failonerror="true">
-              <arg value="patch" />
-              <arg value="${diff-file}" />
-              <arg value="${dir-name}" />
-        </exec>
-    </target>
-    
-    <target name="patch-source-via-patch" depends="check-patch-available" if="patch-ok">
-        <mkdir dir="${root-dir}"/>
-        <exec dir="${root-dir}/${dir-name}" executable="patch" input="../${diff-file}" failifexecutionfails="true" failonerror="true">
-              <arg value="-p0" />
-        </exec>
-    </target>
-    
-    <target name="patch-source" depends="patch-source-via-svn,patch-source-via-patch"/>
-    
-    <target name="build-via-ant">
-        <exec osfamily="windows" dir="${root-dir}" executable="cmd" failifexecutionfails="true" failonerror="true">
-            <arg value="/c"/>
-            <arg value="ant.bat"/>
-            <arg value="${target}" />
-        </exec>
-        <exec osfamily="unix" dir="${root-dir}" executable="ant" failifexecutionfails="true" failonerror="true">
-            <arg value="${target}" />
-        </exec>
-    </target>
-    
-    <target name="clean">
-        <delete dir="build"/>
-        <delete dir="dist"/>
-        <delete dir="test-postgresql-output"/>
-        <delete dir="test-mysql-output"/>
-        <delete dir="test-HSQLDB-output"/>
-        <delete dir="test-HSQLDBext-output"/>
-    </target>
-
-    <path id="mcf-connector-build.connector-classpath">
-        <fileset dir="${mcf-dist}/connector-common-lib">
-            <include name="mcf-connector-common.jar"/>
-        </fileset>
-        <fileset dir="${mcf-dist}/lib">
-            <include name="mcf-core.jar"/>
-            <include name="mcf-ui-core.jar"/>
-            <include name="mcf-agents.jar"/>
-            <include name="mcf-pull-agent.jar"/>
-        </fileset>
-        <fileset dir="${mcf-dist}/lib">
-            <include name="zookeeper*.jar"/>
-            <include name="mail*.jar"/>
-            <include name="commons-exec*.jar"/>
-            <include name="guava*.jar"/>
-            <include name="gson*.jar"/>
-            <include name="jna*.jar"/>
-            <include name="json-simple*.jar"/>
-            <include name="commons-codec*.jar"/>
-            <include name="commons-collections*.jar"/>
-            <include name="commons-collections4*.jar"/>
-            <include name="commons-el*.jar"/>
-            <include name="commons-fileupload*.jar"/>
-            <include name="httpcore*.jar"/>
-            <include name="httpclient*.jar"/>
-            <include name="commons-io*.jar"/>
-            <include name="commons-lang*.jar"/>
-            <include name="commons-logging*.jar"/>
-            <include name="eclipse*.jar"/>
-            <include name="jasper*.jar"/>
-            <include name="jetty*.jar"/>
-            <include name="slf4j*.jar"/>
-            <include name="jsp-2.1*.jar"/>
-            <include name="jsp-api*.jar"/>
-            <include name="junit*.jar"/>
-            <include name="selenium*.jar"/>
-            <include name="cglib-nodep*.jar"/>
-            <include name="hamcrest-core*.jar"/>
-            <include name="log4j*.jar"/>
-            <include name="serializer*.jar"/>
-            <include name="javax.servlet-api*.jar"/>
-            <include name="tomcat-juli*.jar"/>
-            <include name="xalan*.jar"/>
-            <include name="xercesImpl*.jar"/>
-            <include name="xml-apis*.jar"/>
-            <include name="velocity*.jar"/>
-        </fileset>
-        <fileset dir="${mcf-dist}/connector-common-lib">
-            <include name="tika-core*.jar"/>
-            <include name="jackson-core*.jar"/>
-            <include name="jackson-databind*.jar"/>
-            <include name="jackson-annotations*.jar"/>
-            <include name="tika-parsers*.jar"/>
-            <include name="poi*.jar"/>
-            <include name="dom4j*.jar"/>
-            <include name="xmlbeans*.jar"/>
-            <include name="curvesapi*.jar"/>
-            <include name="geoapi*.jar"/>
-            <include name="sis-metadata*.jar"/>
-            <include name="sis-utility*.jar"/>
-            <include name="sis-netcdf*.jar"/>
-            <include name="sis-storage*.jar"/>
-            <include name="opennlp-tools*.jar"/>
-            <include name="jackcess*.jar"/>
-            <include name="junrar*.jar"/>
-            <include name="commons-vfs2*.jar"/>
-            <include name="commons-csv*.jar"/>
-            <include name="commons-exec*.jar"/>
-            <include name="netcdf4*.jar"/>
-            <include name="httpservices*.jar"/>
-            <include name="grib*.jar"/>
-            <include name="cdm*.jar"/>
-            <include name="udunits*.jar"/>
-            <include name="jcommander*.jar"/>
-            <include name="jcip-annotations*.jar"/>
-            <include name="ehcache-core*.jar"/>
-            <include name="bzip2*.jar"/>
-            <include name="jdom2*.jar"/>
-            <include name="quartz*.jar"/>
-            <include name="c3p0*.jar"/>
-            <include name="tagsoup*.jar"/>
-            <include name="vorbis-java*.jar"/>
-            <include name="apache-mime4j-core*.jar"/>
-            <include name="apache-mime4j-dom*.jar"/>
-            <include name="commons-compress*.jar"/>
-            <include name="pdfbox*.jar"/>
-            <include name="fontbox*.jar"/>
-            <include name="jempbox*.jar"/>
-            <include name="bcmail-jdk15on*.jar"/>
-            <include name="bcprov-jdk15on*.jar"/>
-            <include name="bcpkix-jdk15on*.jar"/>
-            <include name="geronimo-stax-api_1.0_spec*.jar"/>
-            <include name="asm*.jar"/>
-            <include name="isoparser*.jar"/>
-            <include name="aspectjrt*.jar"/>
-            <include name="metadata-extractor*.jar"/>
-            <include name="xmpcore*.jar"/>
-            <include name="xml-apis*.jar"/>
-            <include name="boilerpipe*.jar"/>
-            <include name="rome*.jar"/>
-            <include name="jdom*.jar"/>
-            <include name="xercesImpl*.jar"/>
-            <include name="vorbis-java-core*.jar"/>
-            <include name="juniversalchardet*.jar"/>
-            <include name="jhighlight*.jar"/>
-            <include name="jmatio*.jar"/>
-            <include name="java-libpst*.jar"/>
-            <include name="xz*.jar"/>
-            <include name="cxf-core*.jar"/>
-            <include name="cxf-rt-frontend-jaxrs*.jar"/>
-            <include name="cxf-rt-transports-http*.jar"/>
-            <include name="cxf-rt-rs-client*.jar"/>
-            <include name="xmlschema-core*.jar"/>
-            <include name="javax.annotation-api*.jar"/>
-            <include name="javax.ws.rs-api*.jar"/>
-        </fileset>
-        <fileset dir="${mcf-dist}/connector-common-lib">
-            <include name="axis*.jar"/>
-            <include name="saaj*.jar"/>
-            <include name="wsdl4j*.jar"/>
-            <include name="wss4j*.jar"/>
-            <include name="xmlsec*.jar"/>
-            <include name="opensaml*.jar"/>
-            <include name="commons-discovery*.jar"/>
-            <include name="activation*.jar"/>
-            <include name="castor*.jar"/>
-            <include name="geronimo-javamail_1.4_spec*.jar"/>
-        </fileset>
-        <pathelement location="build/stubclasses"/>
-        <pathelement location="build/wsdlclasses"/>
-        <pathelement location="build/xsdclasses"/>
-        <pathelement location="build/interface/classes"/>
-        <pathelement location="build/rmistub/classes"/>
-    </path>
-    
-    <path id="connector-classpath">
-        <path refid="mcf-connector-build.connector-classpath"/>
-    </path>
-
-    <path id="mcf-connector-build.connector-test-classpath">
-        <path refid="connector-classpath"/>
-        <pathelement location="build/connector/classes"/>
-        <fileset dir="${mcf-dist}/test-lib"/>
-        <fileset dir="${mcf-dist}/lib">
-            <include name="postgresql*.jar"/>
-            <include name="hsqldb*.jar"/>
-        </fileset>
-        <fileset dir="${mcf-dist}/lib-proprietary">
-            <include name="mysql*.jar"/>
-        </fileset>
-    </path>
-
-    <path id="connector-test-classpath">
-        <path refid="mcf-connector-build.connector-test-classpath"/>
-    </path>
-
-    <path id="mcf-connector-build.implementation-classpath">
-        <pathelement location="build/interface/classes"/>
-        <pathelement location="build/stubclasses"/>
-    </path>
-
-    <path id="implementation-classpath">
-        <path refid="mcf-connector-build.implementation-classpath"/>
-    </path>
-
-    <path id="mcf-connector-build.interface-classpath">
-    </path>
-
-    <path id="interface-classpath">
-        <path refid="mcf-connector-build.interface-classpath"/>
-    </path>
-
-    <!-- Standard connector proprietary/non-proprietary setup described below.
-    (1) If there's a lib-proprietary directory, we presume that the connector requires one or
-        more proprietary libraries to build and run.  We expect to find a README.txt file in
-        the directory, which describes what is needed at build time, and that if the required
-        libraries are not present, the connector's build.xml file will override "calculate-condition"
-        and "precompile-check" appropriately.  If there's a "proprietary-library-instructions.txt" file,
-	it will be copied to the connector-lib directory with the name {connector}-README.txt.
-        If the required libraries are not present, the same file will also be copied to {connector}-PLACEHOLDER.txt.
-    (2) If there's a build-stub directory, we presume that the connector requires one or
-        more proprietary libraries to run, but can be built without proprietary libraries through
-        the use of stubs.  In this case the connector MAY also have a
-        "proprietary-library-instructions.txt" file, if proprietary libraries are required at
-        runtime.  This file will be copied to the
-        connector-lib directory with the name {connector}-README.txt and to {connector}-PLACEHOLDER.txt,
-        as a placeholder for the required proprietary libraries.
-
-    A connector can have both a build-stub and a lib-proprietary directory.  In this case,
-    the connector will build against stubs but will deliver proprietary libraries to
-    connector-lib-proprietary for use at runtime, and the {connector}-README.txt
-    file will only be delivered to the connector-lib directory.
-    -->
-    
-    <target name="calculate-condition">
-        <available file="build.xml" property="build-present"/>
-    </target>
-
-    <target name="calculate-testcode-condition">
-        <available file="connector/src/test/java" property="tests-present"/>
-    </target>
-
-    <target name="calculate-run-condition">
-        <property name="libs-present" value="true"/>
-    </target>
-
-    <target name="precompile-warn" depends="calculate-condition" unless="build-present"/>
-
-    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present"/>
-
-    <target name="prerun-warn" depends="calculate-run-condition" unless="libs-present"/>
-
-
-    <target name="precompile-check" depends="precompile-warn">
-        <condition property="canBuild">
-            <isset property="build-present"/>
-        </condition>
-    </target>
-    
-    <target name="pretest-check" depends="precompile-warn,pretest-warn">
-        <condition property="canTest">
-            <and>
-                <isset property="build-present"/>
-                <isset property="tests-present"/>
-            </and>
-        </condition>
-    </target>
-
-    <target name="prerun-check" depends="precompile-warn,prerun-warn">
-        <condition property="canRun">
-            <and>
-                <isset property="build-present"/>
-                <isset property="libs-present"/>
-            </and>
-        </condition>
-    </target>
-
-    <target name="has-stubs-check" depends="precompile-check" if="canBuild">
-        <available file="build-stub/src/main/java" property="hasStubs"/>
-    </target>
-
-    <target name="has-proprietary-materials-check">
-    </target>
-    
-    <target name="build-stubs-check" depends="has-stubs-check,has-proprietary-materials-check" if="hasStubs">
-        <condition property="buildStubs">
-            <not>
-                <isset property="proprietaryMaterialsAvailable"/>
-            </not>
-        </condition>
-    </target>
-
-    <target name="include-README-lib-proprietary-check" depends="precompile-check" if="canBuild">
-        <available file="proprietary-library-instructions.txt" property="includeREADMELibProprietary"/>
-    </target>
-    
-    <target name="include-proprietary-instructions-lib-proprietary-check" depends="prerun-check" unless="canRun">
-        <available file="proprietary-library-instructions.txt" property="includeProprietaryInstructionsLibProprietary"/>
-    </target>
-
-    <target name="compile-stubs" depends="build-stubs-check" if="buildStubs">
-        <mkdir dir="build/stubclasses"/>
-        <javac srcdir="build-stub/src/main/java" destdir="build/stubclasses" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="has-tests-check" depends="pretest-check">
-        <condition property="hasTests">
-            <isset property="canTest"/>
-        </condition>
-    </target>
-
-    <target name="has-test-resources-check" depends="has-tests-check" if="hasTests">
-        <available file="connector/src/test/resources" property="hasTestResources"/>
-    </target>
-
-    <target name="has-native2ascii-check" depends="precompile-check" if="canBuild">
-        <available file="connector/src/main/native2ascii" property="hasNative2Ascii"/>
-    </target>
-
-    <target name="has-resources-check" depends="precompile-check" if="canBuild">
-        <available file="connector/src/main/resources" property="hasResources"/>
-    </target>
-
-    <target name="has-RMI-check" depends="precompile-check" if="canBuild">
-        <available file="implementation" property="hasImplementation"/>
-        <available file="interface" property="hasInterface"/>
-        <available file="server" property="hasServer"/>
-        <available file="registry" property="hasRegistry"/>
-        <condition property="hasRMI">
-            <and>
-                <isset property="hasImplementation"/>
-                <isset property="hasInterface"/>
-                <isset property="hasServer"/>
-                <isset property="hasRegistry"/>
-            </and>
-        </condition>
-    </target>
-    
-    <target name="classcreate-wsdl">
-        <mkdir dir="build/wsdljava"/>
-        <java classname="org.apache.axis.wsdl.WSDL2Java" fork="true">
-            <classpath>
-                <fileset dir="${mcf-dist}/connector-common-lib">
-                    <include name="axis*.jar"/>
-                    <include name="saaj*.jar"/>
-                    <include name="wsdl*.jar"/>
-                    <include name="mail*.jar"/>
-                    <include name="activation*.jar"/>
-                    <include name="commons-discovery*.jar"/>
-                </fileset>
-                <fileset dir="${mcf-dist}/lib">
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <jvmarg value="-Dfile.encoding=UTF-8"/>
-            <arg value="--timeout"/>
-            <arg value="0"/>
-            <arg value="--noImports"/>
-            <arg value="-o"/>
-            <arg value="build/wsdljava"/>
-            <arg value="${wsdlname}"/>
-        </java>
-    </target>
-
-    <target name="classcreate-xsd">
-        <mkdir dir="build/xsdjava"/>
-        <java classname="org.exolab.castor.builder.SourceGeneratorMain" fork="true">
-            <classpath>
-                <fileset dir="${mcf-dist}/connector-common-lib">
-                    <include name="castor*.jar"/>
-                    <include name="geronimo-activation_1.1_spec*.jar"/>
-                    <include name="geronimo-javamail_1.4_spec*.jar"/>
-                    <include name="xerces*.jar"/>
-                </fileset>
-                <fileset dir="${mcf-dist}/lib">
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <jvmarg value="-Dfile.encoding=UTF-8"/>
-            <arg value="-i"/>
-            <arg value="${xsdname}"/>
-            <arg value="=f"/>
-            <arg value="-dest"/>
-            <arg value="build/xsdjava"/>
-            <arg value="-package"/>
-            <arg value="org.apache.manifoldcf.crawler.connectors.${packagename}"/>
-        </java>
-    </target>
-
-    <target name="classcreate-wsdls"/>
-
-    <target name="has-wsdls-check" depends="classcreate-wsdls,precompile-check" if="canBuild">
-        <available file="build/wsdljava" property="hasWSDLs"/>
-    </target>
-
-    <target name="compile-wsdls" depends="has-wsdls-check" if="hasWSDLs">
-        <mkdir dir="build/wsdlclasses"/>
-        <javac srcdir="build/wsdljava" destdir="build/wsdlclasses" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <fileset dir="${mcf-dist}/connector-common-lib">
-                    <include name="axis*.jar"/>
-                    <include name="saaj*.jar"/>
-                    <include name="wsdl*.jar"/>
-                    <include name="activation*.jar"/>
-                    <include name="commons-discovery*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="classcreate-xsds"/>
-    
-    <target name="has-xsds-check" depends="classcreate-xsds,precompile-check" if="canBuild">
-        <available file="build/xsdjava" property="hasXSDs"/>
-    </target>
-
-    <target name="compile-xsds" depends="has-xsds-check" if="hasXSDs">
-        <mkdir dir="build/xsdclasses"/>
-        <javac srcdir="build/xsdjava" destdir="build/xsdclasses" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <fileset dir="${mcf-dist}/connector-common-lib">
-                    <include name="castor*.jar"/>
-                </fileset>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="setup-rmic" depends="has-RMI-check" if="hasRMI">
-        <mkdir dir="build/rmijava"/>
-        <copy todir="build/rmijava">
-            <fileset dir="implementation/src/main/java"/>
-        </copy>
-    </target>
-
-    <target name="rmic-build">
-        <rmic base="build/rmijava" classname="${classname}">
-            <classpath>
-                <path refid="implementation-classpath"/>
-                <pathelement location="build/implementation/classes"/>
-            </classpath>
-        </rmic>
-    </target>
-
-    <target name="rmic-build-all" depends="compile-implementation,compile-interface,setup-rmic,has-RMI-check" if="hasRMI"/>
-
-    <target name="doc-rmi" depends="compile-wsdls,compile-xsds,has-RMI-check" if="hasRMI">
-        <mkdir dir="dist/doc"/>
-        <javadoc destdir="dist/doc" source="1.8" use="true" locale="en_US">
-            <link href="http://docs.oracle.com/javase/8/docs/api/"/>
-            <link href="http://manifoldcf.apache.org/release/trunk/api/framework/"/>
-            <classpath>
-                <path refid="connector-classpath"/>
-            </classpath>
-            <fileset dir="interface/src/main/java" includes="**/*.java"/>
-            <fileset dir="connector/src/main/java" includes="**/*.java"/>
-        </javadoc>
-    </target>
-
-    <target name="doc" depends="compile-stubs,doc-rmi,compile-wsdls,compile-xsds,has-RMI-check,precompile-check" if="canBuild" unless="hasRMI">
-        <mkdir dir="dist/doc"/>
-        <javadoc destdir="dist/doc" source="1.8" use="true" locale="en_US">
-            <link href="http://docs.oracle.com/javase/8/docs/api/"/>
-            <link href="http://manifoldcf.apache.org/release/trunk/api/framework/"/>
-            <classpath>
-                <path refid="connector-classpath"/>
-            </classpath>
-            <fileset dir="connector/src/main/java" includes="**/*.java"/>
-        </javadoc>
-    </target>
-
-    <target name="compile-connector-resources" depends="has-resources-check" if="hasResources">
-        <mkdir dir="build/connector/classes"/>
-        <copy todir="build/connector/classes">
-            <fileset dir="connector/src/main/resources"/>
-        </copy>
-    </target>
-
-    <target name="compile-connector-native2ascii" depends="has-native2ascii-check" if="hasNative2Ascii">
-        <mkdir dir="build/connector/classes"/>
-        <native2ascii encoding="UTF-8" src="connector/src/main/native2ascii" dest="build/connector/classes" includes="**/*.properties" />
-    </target>
-    
-    <target name="compile-rmic" depends="rmic-build-all,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/rmiskel/classes"/>
-        <copy todir="build/rmiskel/classes">
-            <fileset dir="build/rmijava">
-                <include name="**/*_Skel.class"/>
-            </fileset>
-        </copy>
-        <mkdir dir="build/rmistub/classes"/>
-        <copy todir="build/rmistub/classes">
-            <fileset dir="build/rmijava">
-                <include name="**/*_Stub.class"/>
-            </fileset>
-        </copy>
-    </target>
-    
-    <target name="compile-server" depends="compile-interface,compile-implementation,compile-rmic,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/server/classes"/>
-        <javac srcdir="server/src/main/java" destdir="build/server/classes" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <pathelement location="build/interface/classes"/>
-                <pathelement location="build/implementation/classes"/>
-                <pathelement location="build/rmistub/classes"/>
-                <pathelement location="build/rmiskel/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-registry" depends="compile-interface,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/registry/classes"/>
-        <javac srcdir="registry/src/main/java" destdir="build/registry/classes" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <pathelement location="build/interface/classes"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-connector" depends="compile-stubs,compile-connector-native2ascii,compile-connector-resources,compile-wsdls,compile-xsds,compile-interface,compile-rmic,precompile-check" if="canBuild">
-        <mkdir dir="build/connector/classes"/>
-        <javac srcdir="connector/src/main/java" destdir="build/connector/classes" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <path refid="connector-classpath"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-implementation" depends="compile-stubs,compile-interface,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/implementation/classes"/>
-        <javac srcdir="implementation/src/main/java" destdir="build/implementation/classes" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <path refid="implementation-classpath"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-interface" depends="has-RMI-check" if="hasRMI">
-        <mkdir dir="build/interface/classes"/>
-        <javac srcdir="interface/src/main/java" destdir="build/interface/classes" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <path refid="interface-classpath"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="compile-test-resources" depends="has-test-resources-check" if="hasTestResources">
-        <mkdir dir="build/connector-tests/classes"/>
-        <copy todir="build/connector-tests/classes">
-            <fileset dir="connector/src/test/resources"/>
-        </copy>
-    </target>
-
-    <target name="compile-tests" depends="compile-connector,compile-test-resources,has-tests-check" if="hasTests">
-        <mkdir dir="build/connector-tests/classes"/>
-        <javac srcdir="connector/src/test/java" destdir="build/connector-tests/classes" deprecation="true" target="1.8" source="1.8" debug="true" debuglevel="lines,vars,source" encoding="UTF-8">
-            <classpath>
-                <path refid="connector-test-classpath"/>
-            </classpath>
-        </javac>
-    </target>
-
-    <target name="jar-connector" depends="compile-connector,precompile-check" if="canBuild">
-        <mkdir dir="build/xsdclasses"/>
-        <mkdir dir="build/wsdlclasses"/>
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector.jar">
-        	<fileset dir="build/connector/classes"/>
-          <fileset dir="build/xsdclasses"/>
-          <fileset dir="build/wsdlclasses"/>
-        </jar>
-    </target>
-
-    <target name="jar-interface" depends="compile-interface,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector-interface.jar" basedir="build/interface/classes"/>
-    </target>
-
-    <target name="jar-implementation" depends="compile-implementation,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector-implementation.jar" basedir="build/implementation/classes"/>
-    </target>
-
-    <target name="jar-rmiskel" depends="compile-rmic,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector-rmiskel.jar" basedir="build/rmiskel/classes"/>
-    </target>
-
-    <target name="jar-rmistub" depends="compile-rmic,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector-rmistub.jar" basedir="build/rmistub/classes"/>
-    </target>
-
-    <target name="jar-server" depends="compile-server,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector-server.jar" basedir="build/server/classes"/>
-    </target>
-
-    <target name="jar-registry" depends="compile-registry,has-RMI-check" if="hasRMI">
-        <mkdir dir="build/jar"/>
-        <jar destfile="build/jar/mcf-${ant.project.name}-connector-registry.jar" basedir="build/registry/classes"/>
-    </target>
-
-    <target name="lib-rmi" depends="jar-interface,jar-rmistub,has-RMI-check" if="hasRMI">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib" file="build/jar/mcf-${ant.project.name}-connector-rmistub.jar"/>
-        <copy todir="dist/lib" file="build/jar/mcf-${ant.project.name}-connector-interface.jar"/>
-    </target>
-    
-    <target name="lib-wsdls" depends="has-wsdls-check" if="hasWSDLs">
-        <!-- mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="${mcf-dist}/lib">
-                <include name="axis*.jar"/>
-                <include name="saaj*.jar"/>
-                <include name="wsdl*.jar"/>
-                <include name="activation*.jar"/>
-                <include name="commons-discovery*.jar"/>
-            </fileset>
-        </copy -->
-    </target>
-
-    <target name="lib-xsds" depends="has-xsds-check" if="hasXSDs">
-        <!-- mkdir dir="dist/lib"/>
-        <copy todir="dist/lib">
-            <fileset dir="${mcf-dist}/lib">
-                <include name="castor*.jar"/>
-                <include name="geronimo-activation_1.1_spec*.jar"/>
-                <include name="geronimo-javamail_1.4_spec*.jar"/>
-            </fileset>
-        </copy -->
-    </target>
-
-    <target name="lib" depends="lib-rmi,lib-wsdls,lib-xsds,jar-connector,precompile-check" if="canBuild">
-        <mkdir dir="dist/lib"/>
-        <copy todir="dist/lib" file="build/jar/mcf-${ant.project.name}-connector.jar"/>
-    </target>
-
-    <target name="lib-proprietary-README" depends="include-README-lib-proprietary-check" if="includeREADMELibProprietary">
-        <mkdir dir="dist/lib-proprietary-only"/>
-        <copy tofile="dist/lib-proprietary-only/${ant.project.name}-README.txt" file="proprietary-library-instructions.txt"/>
-    </target>
-    
-    <target name="lib-proprietary-instructions" depends="include-proprietary-instructions-lib-proprietary-check" if="includeProprietaryInstructionsLibProprietary">
-        <mkdir dir="dist/lib-proprietary-only"/>
-        <copy tofile="dist/lib-proprietary-only/${ant.project.name}-PLACEHOLDER.txt" file="proprietary-library-instructions.txt"/>
-    </target>
-    
-    <target name="server-process" depends="jar-interface,jar-implementation,jar-rmiskel,jar-server,has-RMI-check" if="hasRMI">
-        <mkdir dir="dist/server-process/lib"/>
-        <copy todir="dist/server-process/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-${ant.project.name}-connector-server.jar"/>
-                <include name="mcf-${ant.project.name}-connector-interface.jar"/>
-                <include name="mcf-${ant.project.name}-connector-rmiskel.jar"/>
-                <include name="mcf-${ant.project.name}-connector-implementation.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="dist/server-process">
-            <fileset dir="server-scripts">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="registry-process" depends="jar-registry,has-RMI-check" if="hasRMI">
-        <mkdir dir="dist/registry-process/lib"/>
-        <copy todir="dist/registry-process/lib">
-            <fileset dir="build/jar">
-                <include name="mcf-${ant.project.name}-connector-registry.jar"/>
-                <include name="mcf-${ant.project.name}-connector-interface.jar"/>
-            </fileset>
-        </copy>
-        <copy todir="dist/registry-process">
-            <fileset dir="registry-scripts">
-                <include name="*.sh"/>
-                <include name="*.bat"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <!-- Override this target to provide integration materials to the connector dist area -->
-    <target name="integration" depends="precompile-check" if="canBuild"/>
-
-    <!-- Delivery targets.  These targets conditionally deliver code and connectors.xml lines
-        into the main distribution area.
-    -->
-    
-    <target name="general-connector-integration-check" depends="integration" if="canBuild">
-        <available file="dist/integration" type="dir" property="has-integration"/>
-    </target>
-
-    <target name="general-server-process-check" depends="server-process" if="canBuild">
-        <available file="dist/server-process" type="dir" property="has-server-process"/>
-    </target>
-
-    <target name="general-registry-process-check" depends="registry-process" if="canBuild">
-        <available file="dist/registry-process" type="dir" property="has-registry-process"/>
-    </target>
-
-    <target name="general-connector-delivery-integration" depends="general-connector-integration-check" if="has-integration">
-        <mkdir dir="${mcf-dist}/plugins/${ant.project.name}"/>
-        <copy todir="${mcf-dist}/plugins/${ant.project.name}">
-            <fileset dir="dist/integration"/>
-        </copy>
-    </target>
-
-    <target name="general-delivery-server-process" depends="general-server-process-check" if="has-server-process">
-        <mkdir dir="${mcf-dist}/processes/${ant.project.name}-server"/>
-        <copy todir="${mcf-dist}/processes/${ant.project.name}-server">
-            <fileset dir="dist/server-process"/>
-        </copy>
-    </target>
-
-    <target name="general-delivery-registry-process" depends="general-registry-process-check" if="has-registry-process">
-        <mkdir dir="${mcf-dist}/processes/${ant.project.name}-registry"/>
-        <copy todir="${mcf-dist}/processes/${ant.project.name}-registry">
-            <fileset dir="dist/registry-process"/>
-        </copy>
-    </target>
-    
-    <target name="general-connector-delivery-processes" depends="general-delivery-server-process,general-delivery-registry-process"/>
-
-    <target name="general-connector-proprietary-only-check" depends="lib-proprietary-instructions,lib-proprietary-README">
-        <available file="dist/lib-proprietary-only" type="dir" property="has-proprietary-only"/>
-    </target>
-
-    <target name="general-connector-proprietary-only-delivery" depends="general-connector-proprietary-only-check" if="has-proprietary-only">
-        <mkdir dir="${mcf-dist}/connector-lib-proprietary"/>
-        <copy todir="${mcf-dist}/connector-lib-proprietary">
-            <fileset dir="dist/lib-proprietary-only"/>
-        </copy>
-    </target>
-
-    <target name="general-connector-delivery-check" depends="lib">
-        <available file="dist/lib" type="dir" property="has-lib"/>
-    </target>
-    
-    <target name="general-connector-delivery" depends="general-connector-delivery-check,general-connector-proprietary-only-delivery,general-connector-delivery-integration,general-connector-delivery-processes" if="has-lib">
-        <mkdir dir="${mcf-dist}/connector-lib"/>
-        <copy todir="${mcf-dist}/connector-lib">
-            <fileset dir="dist/lib"/>
-        </copy>
-    </target>
-
-    <target name="general-connector-doc-check" depends="doc">
-        <available file="dist/doc" type="dir" property="has-doc"/>
-    </target>
-
-    <target name="general-connector-doc-delivery" depends="general-connector-doc-check" if="has-doc">
-        <mkdir dir="${mcf-dist}/doc/api/${ant.project.name}"/>
-        <copy todir="${mcf-dist}/doc/api/${ant.project.name}">
-            <fileset dir="dist/doc"/>
-        </copy>
-    </target>
-
-    <target name="general-connector-proprietary-runnable-check" depends="lib-proprietary-instructions,has-RMI-check">
-        <available file="dist/lib-proprietary-only/${ant.project.name}-PLACEHOLDER.txt" property="has-placeholder"/>
-        <condition property="is-proprietary-runnable">
-            <or>
-                <not>
-                    <isset property="has-placeholder"/>
-                </not>
-                <isset property="hasRMI"/>
-            </or>
-        </condition>
-    </target>
-
-    <target name="general-connector-runnable-check" depends="general-connector-proprietary-runnable-check,has-RMI-check">
-        <available file="lib-proprietary" type="dir" property="has-lib-proprietary"/>
-        <condition property="is-runnable">
-            <or>
-                <not>
-                    <isset property="has-lib-proprietary"/>
-                </not>
-                <isset property="hasRMI"/>
-            </or>
-        </condition>
-    </target>
-    
-    <target name="general-add-mapping-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your mapping connectors here --&gt;" value="&lt;!-- Add your mapping connectors here --&gt;&#0010;  &lt;!--mappingconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-mapping-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your mapping connectors here --&gt;" value="&lt;!-- Add your mapping connectors here --&gt;&#0010;  &lt;mappingconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-mapping-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your mapping connectors here --&gt;" value="&lt;!-- Add your mapping connectors here --&gt;&#0010;  &lt;!--mappingconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-mapping-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your mapping connectors here --&gt;" value="&lt;!-- Add your mapping connectors here --&gt;&#0010;  &lt;mappingconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-mapping-connector" depends="general-add-mapping-connector-commented,general-add-mapping-connector-non-commented,general-add-mapping-connector-proprietary-commented,general-add-mapping-connector-proprietary-non-commented">
-    </target>
-
-    <target name="general-add-authority-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your authority connectors here --&gt;" value="&lt;!-- Add your authority connectors here --&gt;&#0010;  &lt;!--authorityconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-authority-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your authority connectors here --&gt;" value="&lt;!-- Add your authority connectors here --&gt;&#0010;  &lt;authorityconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-authority-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your authority connectors here --&gt;" value="&lt;!-- Add your authority connectors here --&gt;&#0010;  &lt;!--authorityconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-authority-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your authority connectors here --&gt;" value="&lt;!-- Add your authority connectors here --&gt;&#0010;  &lt;authorityconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-authority-connector" depends="general-add-authority-connector-commented,general-add-authority-connector-non-commented,general-add-authority-connector-proprietary-commented,general-add-authority-connector-proprietary-non-commented">
-    </target>
-
-    <target name="general-add-output-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your output connectors here --&gt;" value="&lt;!-- Add your output connectors here --&gt;&#0010;  &lt;!--outputconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-output-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your output connectors here --&gt;" value="&lt;!-- Add your output connectors here --&gt;&#0010;  &lt;outputconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-output-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your output connectors here --&gt;" value="&lt;!-- Add your output connectors here --&gt;&#0010;  &lt;!--outputconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-output-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your output connectors here --&gt;" value="&lt;!-- Add your output connectors here --&gt;&#0010;  &lt;outputconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-output-connector" depends="general-add-output-connector-commented,general-add-output-connector-non-commented,general-add-output-connector-proprietary-commented,general-add-output-connector-proprietary-non-commented">
-    </target>
-
-    <target name="general-add-transformation-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;!--transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-transformation-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-transformation-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;!--transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-transformation-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-transformation-connector" depends="general-add-transformation-connector-commented,general-add-transformation-connector-non-commented,general-add-transformation-connector-proprietary-commented,general-add-transformation-connector-proprietary-non-commented">
-    </target>
-
-    <target name="general-add-notification-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your notification connectors here --&gt;" value="&lt;!-- Add your notification connectors here --&gt;&#0010;  &lt;!--notificationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-notification-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your notification connectors here --&gt;" value="&lt;!-- Add your notification connectors here --&gt;&#0010;  &lt;notificationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-notification-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your notification connectors here --&gt;" value="&lt;!-- Add your notification connectors here --&gt;&#0010;  &lt;!--notificationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-notification-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your notification connectors here --&gt;" value="&lt;!-- Add your notification connectors here --&gt;&#0010;  &lt;notificationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-notification-connector" depends="general-add-notification-connector-commented,general-add-notification-connector-non-commented,general-add-notification-connector-proprietary-commented,general-add-notification-connector-proprietary-non-commented">
-    </target>
-
-    <target name="general-add-repository-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your repository connectors here --&gt;" value="&lt;!-- Add your repository connectors here --&gt;&#0010;  &lt;!--repositoryconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-repository-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
-        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your repository connectors here --&gt;" value="&lt;!-- Add your repository connectors here --&gt;&#0010;  &lt;repositoryconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-repository-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your repository connectors here --&gt;" value="&lt;!-- Add your repository connectors here --&gt;&#0010;  &lt;!--repositoryconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
-    </target>
-
-    <target name="general-add-repository-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
-        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your repository connectors here --&gt;" value="&lt;!-- Add your repository connectors here --&gt;&#0010;  &lt;repositoryconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
-    </target>
-
-    <target name="general-add-repository-connector" depends="general-add-repository-connector-commented,general-add-repository-connector-non-commented,general-add-repository-connector-proprietary-commented,general-add-repository-connector-proprietary-non-commented">
-    </target>
-    
-    <!-- Main targets -->
-
-    <target name="download-dependencies"/>
-
-    <target name="download-cleanup"/>
-    
-    <target name="deliver-connector" depends="general-connector-delivery"/>
-    
-    <target name="deliver-connector-doc" depends="general-connector-doc-delivery"/>
-
-    <target name="build" depends="lib,lib-proprietary-instructions,lib-proprietary-README,server-process,registry-process,integration"/>
-    
-    <target name="build-tests" depends="build,compile-tests"/>
-
-    <target name="run-IT-postgresql" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-postgresql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-postgresql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-postgresql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*PostgresqlIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-IT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-IT-HSQLDBext" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDBext-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDBext-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDBext-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBextIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-IT-mysql" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-mysql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-mysql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web-proprietary/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web-proprietary/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web-proprietary/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web-proprietary/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-mysql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*MySQLIT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-LT-postgresql" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-postgresql-output"/>
-        <junit fork="true" maxmemory="384m" dir="test-postgresql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-postgresql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*PostgresqlLT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-LT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="1024m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBLT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-LT-HSQLDBext" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDBext-output"/>
-        <junit fork="true" maxmemory="384m" dir="test-HSQLDBext-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDBext-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBextLT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-LT-mysql" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-mysql-output"/>
-        <junit fork="true" maxmemory="384m" dir="test-mysql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web-proprietary/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web-proprietary/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web-proprietary/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web-proprietary/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-mysql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*MySQLLT.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-UI-postgresql" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-postgresql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-postgresql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-Dwebdriver.chrome.driver=${env.SL_CHROME_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.safari.driver=${env.SL_SAFARI_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.gecko.driver=${env.SL_FIREFOX_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.ie.driver=${env.SL_IE_DRIVER}"/>
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-postgresql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*PostgresqlUI.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="run-UI-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-Dwebdriver.chrome.driver=${env.SL_CHROME_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.safari.driver=${env.SL_SAFARI_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.gecko.driver=${env.SL_FIREFOX_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.ie.driver=${env.SL_IE_DRIVER}"/>
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBUI.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-UI-HSQLDBext" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-HSQLDBext-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDBext-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-Dwebdriver.chrome.driver=${env.SL_CHROME_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.safari.driver=${env.SL_SAFARI_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.gecko.driver=${env.SL_FIREFOX_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.ie.driver=${env.SL_IE_DRIVER}"/>
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-HSQLDBext-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBextUI.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-    
-    <target name="run-UI-mysql" depends="compile-tests,pretest-check" if="canTest">
-        <mkdir dir="test-mysql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-mysql-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <jvmarg value="-Dwebdriver.chrome.driver=${env.SL_CHROME_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.safari.driver=${env.SL_SAFARI_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.gecko.driver=${env.SL_FIREFOX_DRIVER}"/>
-            <jvmarg value="-Dwebdriver.ie.driver=${env.SL_IE_DRIVER}"/>
-            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web-proprietary/war/mcf-crawler-ui.war"/>
-            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web-proprietary/war/mcf-authority-service.war"/>
-            <jvmarg value="-DapiWarPath=${mcf-dist}/web-proprietary/war/mcf-api-service.war"/>
-            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web-proprietary/war/mcf-combined-service.war"/>
-            <classpath>
-                <fileset dir="${env.JAVA_HOME}/lib">
-                    <include name="tools.jar"/>
-                </fileset>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-mysql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*MySQLUI.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="run-tests" depends="compile-tests,has-tests-check" if="hasTests">
-        <mkdir dir="test-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <formatter type="brief" usefile="false"/>
-            <batchtest todir="test-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*Test.class"/>
-                    <exclude name="**/*PostgresqlTest.class"/>
-                    <exclude name="**/*MySQLTest.class"/>
-                    <exclude name="**/*HSQLDBTest.class"/>
-                    <exclude name="**/*HSQLDBextTest.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="run-tests-postgresql" depends="compile-tests,has-tests-check" if="hasTests">
-        <mkdir dir="test-postgresql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-postgresql-output" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <batchtest todir="test-postgresql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*PostgresqlTest.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="run-tests-mysql" depends="compile-tests,has-tests-check" if="hasTests">
-        <mkdir dir="test-mysql-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-mysql-output" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <batchtest todir="test-mysql-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*MySQLTest.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="run-tests-HSQLDB" depends="compile-tests,has-tests-check" if="hasTests">
-        <mkdir dir="test-HSQLDB-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDB-output" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <batchtest todir="test-HSQLDB-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBTest.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="run-tests-HSQLDBext" depends="compile-tests,has-tests-check" if="hasTests">
-        <mkdir dir="test-HSQLDBext-output"/>
-        <junit fork="true" maxmemory="128m" dir="test-HSQLDBext-output" showoutput="true" haltonfailure="true">
-            <classpath>
-                <path refid="connector-test-classpath"/>
-                <pathelement location="build/connector-tests/classes"/>
-            </classpath>
-            <batchtest todir="test-HSQLDBext-output">
-                <fileset dir="build/connector-tests/classes">
-                    <include name="**/*HSQLDBextTest.class"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="all" depends="build,doc,build-tests,run-tests,run-tests-HSQLDB"/>
-
-</project>
diff --git a/framework/combined-service/.gitignore b/framework/combined-service/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/combined-service/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/combined-service/pom.xml b/framework/combined-service/pom.xml
deleted file mode 100644
index c2cc696..0000000
--- a/framework/combined-service/pom.xml
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

- 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.

--->

-

-<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/xsd/maven-4.0.0.xsd">

-  <parent>

-    <groupId>org.apache.manifoldcf</groupId>

-    <artifactId>mcf-framework</artifactId>

-    <version>2.10-SNAPSHOT</version>

-  </parent>

-  <modelVersion>4.0.0</modelVersion>

-

-  <artifactId>mcf-combined-service</artifactId>

-  <name>ManifoldCF - Framework - Combined Service</name>

-  <packaging>war</packaging>

-

-  <dependencies>

-    <!-- Internal dependencies -->

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-api-servlet</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-authority-servlet</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-core</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-agents</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-pull-agent</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-ui-core</artifactId>

-      <version>${project.version}</version>

-    </dependency>

-

-    <dependency>

-      <groupId>${project.groupId}</groupId>

-      <artifactId>mcf-crawler-ui</artifactId>

-      <version>${project.version}</version>

-	  <type>war</type>

-    </dependency>

-

-    <!-- web dependencies -->

-    <dependency>

-      <groupId>javax.servlet</groupId>

-      <artifactId>javax.servlet-api</artifactId>

-      <version>${servlet-api.version}</version>

-      <scope>provided</scope>

-    </dependency>

-

-    <!-- runtime dependencies -->

-    <dependency>

-      <groupId>jstl</groupId>

-      <artifactId>jstl</artifactId>

-      <version>${jstl.version}</version>

-      <scope>runtime</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.slf4j</groupId>

-      <artifactId>slf4j-simple</artifactId>

-      <version>${slf4j.version}</version>

-      <scope>runtime</scope>

-    </dependency>

-

-    <!-- database dependencies -->

-    <dependency>

-      <groupId>org.hsqldb</groupId>

-      <artifactId>hsqldb</artifactId>

-      <version>${hsqldb.version}</version>

-      <scope>runtime</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.postgresql</groupId>

-      <artifactId>postgresql</artifactId>

-      <version>${postgresql.version}</version>

-      <scope>runtime</scope>

-    </dependency>

-    <dependency>

-      <groupId>mysql</groupId>

-      <artifactId>mysql-connector-java</artifactId>

-      <version>${mysql.version}</version>

-      <scope>runtime</scope>

-    </dependency>

-

-    <!-- JDBC connector dependencies -->

-    <dependency>

-      <groupId>net.sourceforge.jtds</groupId>

-      <artifactId>jtds</artifactId>

-      <version>${jtds.version}</version>

-      <scope>runtime</scope>

-    </dependency>

-

-  </dependencies>

-

-  <build>

-    <plugins>

-      <plugin>

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

-        <artifactId>maven-war-plugin</artifactId>

-        <version>2.3</version>

-        <configuration>

-          <overlays>

-            <overlay>

-              <groupId>org.apache.manifoldcf</groupId>

-              <artifactId>mcf-crawler-ui</artifactId>

-              <type>war</type>

-              <includes>

-                <include>*.jsp</include>

-                <include>*.css</include>

-                <include>*.png</include>

-              </includes>

-              <targetPath>/</targetPath>

-            </overlay>

-            <overlay>

-              <groupId>org.apache.manifoldcf</groupId>

-              <artifactId>mcf-crawler-ui</artifactId>

-              <type>war</type>

-              <includes>

-                <include>WEB-INF/jsp/*</include>

-              </includes>

-              <targetPath>/</targetPath>

-            </overlay>

-          </overlays>

-        </configuration>

-      </plugin>

-    </plugins>

-  </build>

-</project>

diff --git a/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java b/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java
deleted file mode 100644
index 4a52af3..0000000
--- a/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.combinedservice;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically calls the cleanup method in all connected repository connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class IdleCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Constructor.
-  */
-  public IdleCleanupThread()
-    throws ManifoldCFException
-  {
-    super();
-    setName("Idle cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.root.debug("Start up idle cleanup thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
-      IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Do the cleanup
-          repositoryConnectorPool.pollAllConnectors();
-          notificationConnectorPool.pollAllConnectors();
-          outputConnectorPool.pollAllConnectors();
-          transformationConnectorPool.pollAllConnectors();
-          authorityConnectorPool.pollAllConnectors();
-          mappingConnectorPool.pollAllConnectors();
-          // Poll all basic services
-          ManifoldCF.pollAll(threadContext);
-
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.root.error("Idle cleanup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.root.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("Combined service ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.root.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("Combined service could not start - shutting down");
-      Logging.root.fatal("IdleCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/ServletListener.java b/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/ServletListener.java
deleted file mode 100644
index b091414..0000000
--- a/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/ServletListener.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.combinedservice;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.agents.system.AgentsDaemon;
-import javax.servlet.*;
-
-/** This class furnishes a servlet shutdown hook for ManifoldCF.  It should be referenced in the
-* web.xml file for the application in order to do the right thing, however.
-*/
-public class ServletListener implements ServletContextListener
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected static AgentsThread agentsThread = null;
-  protected IdleCleanupThread idleCleanupThread = null;
-
-  public void contextInitialized(ServletContextEvent sce)
-  {
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-
-      ManifoldCF.createSystemDatabase(tc);
-      ManifoldCF.installTables(tc);
-      ManifoldCF.registerThisAgent(tc);
-      ManifoldCF.reregisterAllConnectors(tc);
-
-      // This is for the UI and API components
-      idleCleanupThread = new IdleCleanupThread();
-      idleCleanupThread.start();
-
-      // This is for the agents process
-      agentsThread = new AgentsThread(ManifoldCF.getProcessID());
-      agentsThread.start();
-
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new RuntimeException("Could not initialize servlet; "+e.getMessage(),e);
-    }
-  }
-  
-  public void contextDestroyed(ServletContextEvent sce)
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    try
-    {
-      if (agentsThread != null)
-      {
-        AgentsDaemon.assertAgentsShutdownSignal(tc);
-        agentsThread.finishUp();
-        agentsThread = null;
-        AgentsDaemon.clearAgentsShutdownSignal(tc);
-      }
-      
-      while (true)
-      {
-        if (idleCleanupThread == null)
-          break;
-        idleCleanupThread.interrupt();
-        if (!idleCleanupThread.isAlive())
-          idleCleanupThread = null;
-      }
-    }
-    catch (InterruptedException e)
-    {
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() != ManifoldCFException.INTERRUPTED)
-        throw new RuntimeException("Cannot shutdown servlet cleanly; "+e.getMessage(),e);
-    }
-    ManifoldCF.cleanUpEnvironment(tc);
-  }
-
-  protected static class AgentsThread extends Thread
-  {
-    
-    protected final String processID;
-    
-    protected Throwable exception = null;
-
-    public AgentsThread(String processID)
-    {
-      setName("Agents");
-      this.processID = processID;
-    }
-    
-    public void run()
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      try
-      {
-        AgentsDaemon.clearAgentsShutdownSignal(tc);
-        AgentsDaemon ad = new AgentsDaemon(processID);
-        try
-        {
-          ad.runAgents(tc);
-        }
-        finally
-        {
-          ad.stopAgents(tc);
-        }
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-        if (exception instanceof Error)
-          throw (Error)exception;
-        if (exception instanceof ManifoldCFException)
-          throw (ManifoldCFException)exception;
-        throw new RuntimeException("Unknown exception type thrown: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-      }
-    }
-  }
-  
-}
diff --git a/framework/combined-service/src/main/webapp/WEB-INF/web.xml b/framework/combined-service/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 2337f4a..0000000
--- a/framework/combined-service/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>

-

-<!-- 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.

--->

-

-<web-app xmlns="http://java.sun.com/xml/ns/javaee"

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

-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

-  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

-  <display-name>ManifoldCF Combined WebApp</display-name>

-

-  <description>ManifoldCF Combined WebApp</description>

-

-  <servlet>

-    <servlet-name>APIServlet</servlet-name>

-    <servlet-class>org.apache.manifoldcf.apiservlet.APIServlet</servlet-class>

-  </servlet>

-

-  <servlet>

-    <servlet-name>UserACLServlet</servlet-name>

-    <servlet-class>org.apache.manifoldcf.authorityservlet.UserACLServlet</servlet-class>

-  </servlet>

-

-  <servlet-mapping>

-    <servlet-name>APIServlet</servlet-name>

-    <url-pattern>/api/*</url-pattern>

-  </servlet-mapping>

-

-  <servlet-mapping>

-    <servlet-name>UserACLServlet</servlet-name>

-    <url-pattern>/UserACLs</url-pattern>

-  </servlet-mapping>

-

-  <session-config>

-    <session-timeout>30</session-timeout>
-  </session-config>
-
-  <listener>
-    <listener-class>org.apache.manifoldcf.combinedservice.ServletListener</listener-class>
-  </listener>
-

-</web-app>

diff --git a/framework/connector-common/.gitignore b/framework/connector-common/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/connector-common/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/connector-common/pom.xml b/framework/connector-common/pom.xml
deleted file mode 100644
index afc8feb..0000000
--- a/framework/connector-common/pom.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-connector-common</artifactId>
-  <name>ManifoldCF - Connector-Common</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tika</groupId>
-      <artifactId>tika-core</artifactId>
-      <version>${tika.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>activation</artifactId>
-      <version>${activation.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.axis</groupId>
-      <artifactId>axis</artifactId>
-      <version>${axis.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.ws.security</groupId>
-      <artifactId>wss4j</artifactId>
-      <version>1.5.12</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.axis</groupId>
-      <artifactId>axis-jaxrpc</artifactId>
-      <version>${axis.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.castor</groupId>
-      <artifactId>castor</artifactId>
-      <version>${castor.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>adaptx</groupId>
-          <artifactId>adaptx</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.transaction</groupId>
-          <artifactId>jta</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>ant</groupId>
-          <artifactId>ant</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>xerces</groupId>
-          <artifactId>xerces</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>ldapsdk</groupId>
-          <artifactId>ldapsdk</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.cenqua.clover</groupId>
-          <artifactId>clover</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>cglib</groupId>
-          <artifactId>cglib-full</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>oro</groupId>
-          <artifactId>oro</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>jakarta-regexp</groupId>
-          <artifactId>jakarta-regexp</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>wsdl4j</groupId>
-      <artifactId>wsdl4j</artifactId>
-      <version>${wsdl4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-    
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/framework/connector-common/src/main/java/org/apache/http/impl/cookie/LaxBrowserCompatSpec.java b/framework/connector-common/src/main/java/org/apache/http/impl/cookie/LaxBrowserCompatSpec.java
deleted file mode 100644
index 4fad9d8..0000000
--- a/framework/connector-common/src/main/java/org/apache/http/impl/cookie/LaxBrowserCompatSpec.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* $Id$ */
-
-/**`
-* 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 org.apache.http.impl.cookie;
-
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.ClientCookie;
-import org.apache.http.cookie.CookieSpecProvider;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.MalformedCookieException;
-
-/** Class to override browser compatibility to make it not check cookie paths.  See CONNECTORS-97.
-* The class must be in the package described because it requires a protected constructor from the
-* class it extends.
-*/
-public class LaxBrowserCompatSpec extends RFC6265LaxSpec
-{
-
-  public LaxBrowserCompatSpec()
-  {
-    super(new BasicPathHandler()
-    {
-      @Override
-      public void validate(Cookie cookie, CookieOrigin origin) throws MalformedCookieException
-      {
-        // No validation
-      }
-    },
-    new BasicDomainHandler(),
-    new LaxMaxAgeHandler(),
-    new BasicSecureHandler(),
-    new LaxExpiresHandler());
-  }
-    
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/CommonsHTTPSender.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/CommonsHTTPSender.java
deleted file mode 100644
index 4fa419c..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/CommonsHTTPSender.java
+++ /dev/null
@@ -1,938 +0,0 @@
-/*
-* Copyright 2001-2004 The Apache Software Foundation.
-*
-* Licensed 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.
-*
-* $Id$
-*/
-package org.apache.manifoldcf.connectorcommon.common;
-
-import org.apache.manifoldcf.connectorcommon.common.XThreadInputStream;
-
-import org.apache.axis.AxisFault;
-import org.apache.axis.Constants;
-import org.apache.axis.Message;
-import org.apache.axis.MessageContext;
-import org.apache.axis.components.logger.LogFactory;
-import org.apache.axis.components.net.CommonsHTTPClientProperties;
-import org.apache.axis.components.net.CommonsHTTPClientPropertiesFactory;
-import org.apache.axis.components.net.TransportClientProperties;
-import org.apache.axis.components.net.TransportClientPropertiesFactory;
-import org.apache.axis.transport.http.HTTPConstants;
-import org.apache.axis.handlers.BasicHandler;
-import org.apache.axis.soap.SOAP12Constants;
-import org.apache.axis.soap.SOAPConstants;
-import org.apache.axis.utils.JavaUtils;
-import org.apache.axis.utils.Messages;
-import org.apache.axis.utils.NetworkUtils;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.Header;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.entity.ContentType;
-
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.HttpException;
-import org.apache.http.ParseException;
-
-import org.apache.commons.logging.Log;
-
-import javax.xml.soap.MimeHeader;
-import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.SOAPException;
-import java.io.ByteArrayOutputStream;
-import java.io.FilterInputStream;
-import java.io.InterruptedIOException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.InputStreamReader;
-import java.io.Writer;
-import java.io.StringWriter;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.List;
-import java.nio.charset.Charset;
-
-/* Class to use httpcomponents to communicate with a SOAP server.
-* I've replaced the original rather complicated class with a much simpler one that
-* relies on having an HttpClient object passed into the invoke() method.  Since
-* the object is already set up, not much needs to be done in here.
-*/
-
-public class CommonsHTTPSender extends BasicHandler {
-
-  public static final String HTTPCLIENT_PROPERTY = "ManifoldCF_HttpClient";
-
-  /** Field log           */
-  protected static Log log =
-    LogFactory.getLog(CommonsHTTPSender.class.getName());
-
-  /** Properties */
-  protected CommonsHTTPClientProperties clientProperties;
-
-  public CommonsHTTPSender() {
-    this.clientProperties = CommonsHTTPClientPropertiesFactory.create();
-  }
-
-  /**
-  * invoke creates a socket connection, sends the request SOAP message and then
-  * reads the response SOAP message back from the SOAP server
-  *
-  * @param msgContext the messsage context
-  *
-  * @throws AxisFault
-  */
-  public void invoke(MessageContext msgContext) throws AxisFault {
-    if (log.isDebugEnabled())
-    {
-      log.debug(Messages.getMessage("enter00",
-        "CommonsHTTPSender::invoke"));
-    }
-    
-    // Catch all exceptions and turn them into AxisFaults
-    try
-    {
-      // Get the URL
-      URL targetURL =
-        new URL(msgContext.getStrProp(MessageContext.TRANS_URL));
-
-      // Get the HttpClient
-      HttpClient httpClient = (HttpClient)msgContext.getProperty(HTTPCLIENT_PROPERTY);
-
-      boolean posting = true;
-      // If we're SOAP 1.2, allow the web method to be set from the
-      // MessageContext.
-      if (msgContext.getSOAPConstants() == SOAPConstants.SOAP12_CONSTANTS) {
-        String webMethod = msgContext.getStrProp(SOAP12Constants.PROP_WEBMETHOD);
-        if (webMethod != null) {
-          posting = webMethod.equals(HTTPConstants.HEADER_POST);
-        }
-      }
-
-      boolean http10 = false;
-      String httpVersion = msgContext.getStrProp(MessageContext.HTTP_TRANSPORT_VERSION);
-      if (httpVersion != null) {
-        if (httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_V10)) {
-          http10 = true;
-        }
-        // assume 1.1
-      }
-
-      HttpRequestBase method;
-        
-      if (posting) {
-        HttpPost postMethod = new HttpPost(targetURL.toString());
-          
-        // set false as default, addContetInfo can overwrite
-        //HttpProtocolParams.setUseExpectContinue(postMethod.getParams(),false);
-
-        Message reqMessage = msgContext.getRequestMessage();
-          
-        boolean httpChunkStream = addContextInfo(postMethod, msgContext);
-
-        HttpEntity requestEntity = null;
-        requestEntity = new MessageRequestEntity(reqMessage, httpChunkStream,
-          http10 || !httpChunkStream);
-        postMethod.setEntity(requestEntity);
-        method = postMethod;
-      } else {
-        method = new HttpGet(targetURL.toString());
-      }
-        
-      //if (http10)
-      //  HttpProtocolParams.setVersion(method.getParams(),new ProtocolVersion("HTTP",1,0));
-
-      BackgroundHTTPThread methodThread = new BackgroundHTTPThread(httpClient,method);
-      methodThread.start();
-      try
-      {
-        int returnCode = methodThread.getResponseCode();
-          
-        String contentType =
-          getHeader(methodThread, HTTPConstants.HEADER_CONTENT_TYPE);
-        String contentLocation =
-          getHeader(methodThread, HTTPConstants.HEADER_CONTENT_LOCATION);
-        String contentLength =
-          getHeader(methodThread, HTTPConstants.HEADER_CONTENT_LENGTH);
-        
-        if ((returnCode > 199) && (returnCode < 300)) {
-
-          // SOAP return is OK - so fall through
-        } else if (msgContext.getSOAPConstants() ==
-          SOAPConstants.SOAP12_CONSTANTS) {
-          // For now, if we're SOAP 1.2, fall through, since the range of
-          // valid result codes is much greater
-        } else if ((contentType != null) && !contentType.equals("text/html")
-          && ((returnCode > 499) && (returnCode < 600))) {
-
-          // SOAP Fault should be in here - so fall through
-        } else {
-          String statusMessage = methodThread.getResponseStatus();
-          AxisFault fault = new AxisFault("HTTP",
-            "(" + returnCode + ")"
-          + statusMessage, null,
-            null);
-
-          fault.setFaultDetailString(
-            Messages.getMessage("return01",
-            "" + returnCode,
-            getResponseBodyAsString(methodThread)));
-          fault.addFaultDetail(Constants.QNAME_FAULTDETAIL_HTTPERRORCODE,
-            Integer.toString(returnCode));
-          throw fault;
-        }
-
-        String contentEncoding =
-         methodThread.getFirstHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
-        if (contentEncoding != null) {
-          AxisFault fault = new AxisFault("HTTP",
-            "unsupported content-encoding of '"
-          + contentEncoding
-          + "' found", null, null);
-          throw fault;
-        }
-
-        Map<String,List<String>> responseHeaders = methodThread.getResponseHeaders();
-
-        InputStream dataStream = methodThread.getSafeInputStream();
-
-        Message outMsg = new Message(new BackgroundInputStream(methodThread,dataStream),
-          false, contentType, contentLocation);
-          
-        // Transfer HTTP headers of HTTP message to MIME headers of SOAP message
-        MimeHeaders responseMimeHeaders = outMsg.getMimeHeaders();
-        for (String name : responseHeaders.keySet())
-        {
-          List<String> values = responseHeaders.get(name);
-          for (String value : values) {
-            responseMimeHeaders.addHeader(name,value);
-          }
-        }
-        outMsg.setMessageType(Message.RESPONSE);
-          
-        // Put the message in the message context.
-        msgContext.setResponseMessage(outMsg);
-        
-        // Pass off the method thread to the stream for closure
-        methodThread = null;
-      }
-      finally
-      {
-        if (methodThread != null)
-        {
-          methodThread.abort();
-          methodThread.finishUp();
-        }
-      }
-
-    } catch (AxisFault af) {
-      log.debug(af);
-      throw af;
-    } catch (Exception e) {
-      log.debug(e);
-      throw AxisFault.makeFault(e);
-    }
-
-    if (log.isDebugEnabled()) {
-      log.debug(Messages.getMessage("exit00",
-        "CommonsHTTPSender::invoke"));
-    }
-  }
-
-  /**
-  * Extracts info from message context.
-  *
-  * @param method Post or get method
-  * @param msgContext the message context
-  */
-  private static boolean addContextInfo(HttpPost method,
-    MessageContext msgContext)
-    throws AxisFault {
-
-    boolean httpChunkStream = false;
-
-    // Get SOAPAction, default to ""
-    String action = msgContext.useSOAPAction()
-      ? msgContext.getSOAPActionURI()
-      : "";
-
-    if (action == null) {
-      action = "";
-    }
-
-    Message msg = msgContext.getRequestMessage();
-
-    if (msg != null){
-
-      // First, transfer MIME headers of SOAPMessage to HTTP headers.
-      // Some of these might be overridden later.
-      MimeHeaders mimeHeaders = msg.getMimeHeaders();
-      if (mimeHeaders != null) {
-        for (Iterator i = mimeHeaders.getAllHeaders(); i.hasNext(); ) {
-          MimeHeader mimeHeader = (MimeHeader) i.next();
-          method.addHeader(mimeHeader.getName(),
-            mimeHeader.getValue());
-        }
-      }
-
-      method.setHeader(new BasicHeader(HTTPConstants.HEADER_CONTENT_TYPE,
-        msg.getContentType(msgContext.getSOAPConstants())));
-    }
-    
-    method.setHeader(new BasicHeader("Accept","*/*"));
-
-    method.setHeader(new BasicHeader(HTTPConstants.HEADER_SOAP_ACTION,
-      "\"" + action + "\""));
-    method.setHeader(new BasicHeader(HTTPConstants.HEADER_USER_AGENT, Messages.getMessage("axisUserAgent")));
-
-
-    // process user defined headers for information.
-    Hashtable userHeaderTable =
-      (Hashtable) msgContext.getProperty(HTTPConstants.REQUEST_HEADERS);
-
-    if (userHeaderTable != null) {
-      for (Iterator e = userHeaderTable.entrySet().iterator();
-        e.hasNext();) {
-        Map.Entry me = (Map.Entry) e.next();
-        Object keyObj = me.getKey();
-
-        if (null == keyObj) {
-          continue;
-        }
-        String key = keyObj.toString().trim();
-        String value = me.getValue().toString().trim();
-
-        //if (key.equalsIgnoreCase(HTTPConstants.HEADER_EXPECT) &&
-        //  value.equalsIgnoreCase(HTTPConstants.HEADER_EXPECT_100_Continue)) {
-        //  HttpProtocolParams.setUseExpectContinue(method.getParams(),true);
-        //} else 
-        if (key.equalsIgnoreCase(HTTPConstants.HEADER_TRANSFER_ENCODING_CHUNKED)) {
-          String val = me.getValue().toString();
-          if (null != val)  {
-            httpChunkStream = JavaUtils.isTrue(val);
-          }
-        } else {
-          method.addHeader(key, value);
-        }
-      }
-    }
-    
-    return httpChunkStream;
-  }
-
-  private static String getHeader(BackgroundHTTPThread methodThread, String headerName)
-    throws IOException, InterruptedException, HttpException {
-    String header = methodThread.getFirstHeader(headerName);
-    return (header == null) ? null : header.trim();
-  }
-
-  private static String getResponseBodyAsString(BackgroundHTTPThread methodThread)
-    throws IOException, InterruptedException, HttpException {
-    InputStream is = methodThread.getSafeInputStream();
-    if (is != null)
-    {
-      try
-      {
-        Charset charSet = methodThread.getCharSet();
-        if (charSet == null)
-          charSet = StandardCharsets.UTF_8;
-        char[] buffer = new char[65536];
-        Reader r = new InputStreamReader(is,charSet);
-        Writer w = new StringWriter();
-        try
-        {
-          while (true)
-          {
-            int amt = r.read(buffer);
-            if (amt == -1)
-              break;
-            w.write(buffer,0,amt);
-          }
-        }
-        finally
-        {
-          w.flush();
-        }
-        return w.toString();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    return "";
-  }
-  
-  private static class MessageRequestEntity implements HttpEntity {
-
-    private final Message message;
-    private final boolean httpChunkStream; //Use HTTP chunking or not.
-    private final boolean contentLengthNeeded;
-
-    public MessageRequestEntity(Message message, boolean httpChunkStream, boolean contentLengthNeeded) {
-      this.message = message;
-      this.httpChunkStream = httpChunkStream;
-      this.contentLengthNeeded = contentLengthNeeded;
-    }
-
-    @Override
-    public boolean isChunked() {
-      return httpChunkStream;
-    }
-    
-    @Override
-    @Deprecated
-    public void consumeContent()
-      throws IOException {
-      EntityUtils.consume(this);
-    }
-    
-    @Override
-    public boolean isRepeatable() {
-      return true;
-    }
-
-    @Override
-    public boolean isStreaming() {
-      return false;
-    }
-    
-    @Override
-    public InputStream getContent()
-      throws IOException, IllegalStateException {
-      // MHL
-      return null;
-    }
-    
-    @Override
-    public void writeTo(OutputStream out)
-      throws IOException {
-      try {
-        this.message.writeTo(out);
-      } catch (SOAPException e) {
-        throw new IOException(e.getMessage());
-      }
-    }
-
-    @Override
-    public long getContentLength() {
-      if (contentLengthNeeded) {
-        try {
-          return message.getContentLength();
-        } catch (Exception e) {
-        }
-      }
-      // Unknown (chunked) length
-      return -1L;
-    }
-
-    @Override
-    public Header getContentType() {
-      return null; // a separate header is added
-    }
-
-    @Override
-    public Header getContentEncoding() {
-      return null;
-    }
-  }
-
-  /** This input stream wraps a background http transaction thread, so that
-  * the thread is ended when the stream is closed.
-  */
-  private static class BackgroundInputStream extends InputStream {
-    
-    private BackgroundHTTPThread methodThread = null;
-    private InputStream xThreadInputStream = null;
-    
-    /** Construct an http transaction stream.  The stream is driven by a background
-    * thread, whose existence is tied to this class.  The sequence of activity that
-    * this class expects is as follows:
-    * (1) Construct the httpclient and request object and initialize them
-    * (2) Construct a background method thread, and start it
-    * (3) If the response calls for it, call this constructor, and put the resulting stream
-    *    into the message response
-    * (4) Otherwise, terminate the background method thread in the standard manner,
-    *    being sure NOT
-    */
-    public BackgroundInputStream(BackgroundHTTPThread methodThread, InputStream xThreadInputStream)
-    {
-      this.methodThread = methodThread;
-      this.xThreadInputStream = xThreadInputStream;
-    }
-    
-    @Override
-    public int available()
-      throws IOException
-    {
-      if (xThreadInputStream != null)
-        return xThreadInputStream.available();
-      return super.available();
-    }
-    
-    @Override
-    public void close()
-      throws IOException
-    {
-      try
-      {
-        if (xThreadInputStream != null)
-        {
-          xThreadInputStream.close();
-          xThreadInputStream = null;
-        }
-      }
-      finally
-      {
-        if (methodThread != null)
-        {
-          methodThread.abort();
-          try
-          {
-            methodThread.finishUp();
-          }
-          catch (InterruptedException e)
-          {
-            throw new InterruptedIOException(e.getMessage());
-          }
-          methodThread = null;
-        }
-      }
-    }
-    
-    @Override
-    public void mark(int readlimit)
-    {
-      if (xThreadInputStream != null)
-        xThreadInputStream.mark(readlimit);
-      else
-        super.mark(readlimit);
-    }
-    
-    @Override
-    public void reset()
-      throws IOException
-    {
-      if (xThreadInputStream != null)
-        xThreadInputStream.reset();
-      else
-        super.reset();
-    }
-    
-    @Override
-    public boolean markSupported()
-    {
-      if (xThreadInputStream != null)
-        return xThreadInputStream.markSupported();
-      return super.markSupported();
-    }
-    
-    @Override
-    public long skip(long n)
-      throws IOException
-    {
-      if (xThreadInputStream != null)
-        return xThreadInputStream.skip(n);
-      return super.skip(n);
-    }
-    
-    @Override
-    public int read(byte[] b, int off, int len)
-      throws IOException
-    {
-      if (xThreadInputStream != null)
-        return xThreadInputStream.read(b,off,len);
-      return super.read(b,off,len);
-    }
-
-    @Override
-    public int read(byte[] b)
-      throws IOException
-    {
-      if (xThreadInputStream != null)
-        return xThreadInputStream.read(b);
-      return super.read(b);
-    }
-    
-    @Override
-    public int read()
-      throws IOException
-    {
-      if (xThreadInputStream != null)
-        return xThreadInputStream.read();
-      return -1;
-    }
-    
-  }
-
-  /** This thread does the actual socket communication with the server.
-  * It's set up so that it can be abandoned at shutdown time.
-  *
-  * The way it works is as follows:
-  * - it starts the transaction
-  * - it receives the response, and saves that for the calling class to inspect
-  * - it transfers the data part to an input stream provided to the calling class
-  * - it shuts the connection down
-  *
-  * If there is an error, the sequence is aborted, and an exception is recorded
-  * for the calling class to examine.
-  *
-  * The calling class basically accepts the sequence above.  It starts the
-  * thread, and tries to get a response code.  If instead an exception is seen,
-  * the exception is thrown up the stack.
-  */
-  protected static class BackgroundHTTPThread extends Thread
-  {
-    /** Client and method, all preconfigured */
-    protected final HttpClient httpClient;
-    protected final HttpRequestBase executeMethod;
-    
-    protected HttpResponse response = null;
-    protected Throwable responseException = null;
-    protected XThreadInputStream threadStream = null;
-    protected InputStream bodyStream = null;
-    protected Charset charSet = null;
-    protected boolean streamCreated = false;
-    protected Throwable streamException = null;
-    protected boolean abortThread = false;
-
-    protected Throwable shutdownException = null;
-
-    protected Throwable generalException = null;
-    
-    public BackgroundHTTPThread(HttpClient httpClient, HttpRequestBase executeMethod)
-    {
-      super();
-      setDaemon(true);
-      this.httpClient = httpClient;
-      this.executeMethod = executeMethod;
-    }
-
-    public void run()
-    {
-      try
-      {
-        try
-        {
-          // Call the execute method appropriately
-          synchronized (this)
-          {
-            if (!abortThread)
-            {
-              try
-              {
-                response = httpClient.execute(executeMethod);
-              }
-              catch (java.net.SocketTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (ConnectTimeoutException e)
-              {
-                responseException = e;
-              }
-              catch (InterruptedIOException e)
-              {
-                throw e;
-              }
-              catch (Throwable e)
-              {
-                responseException = e;
-              }
-              this.notifyAll();
-            }
-          }
-          
-          // Start the transfer of the content
-          if (responseException == null)
-          {
-            synchronized (this)
-            {
-              if (!abortThread)
-              {
-                try
-                {
-                  HttpEntity entity = response.getEntity();
-                  bodyStream = entity.getContent();
-                  if (bodyStream != null)
-                  {
-                    threadStream = new XThreadInputStream(bodyStream);
-                    try
-                    {
-                      ContentType ct = ContentType.get(entity);
-                      if (ct == null)
-                        charSet = null;
-                      else
-                        charSet = ct.getCharset();
-                    }
-                    catch (ParseException e)
-                    {
-                      charSet = null;
-                    }
-                  }
-                  streamCreated = true;
-                }
-                catch (java.net.SocketTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (ConnectTimeoutException e)
-                {
-                  streamException = e;
-                }
-                catch (InterruptedIOException e)
-                {
-                  throw e;
-                }
-                catch (Throwable e)
-                {
-                  streamException = e;
-                }
-                this.notifyAll();
-              }
-            }
-          }
-          
-          if (responseException == null && streamException == null)
-          {
-            if (threadStream != null)
-            {
-              // Stuff the content until we are done
-              threadStream.stuffQueue();
-            }
-          }
-          
-        }
-        finally
-        {
-          if (bodyStream != null)
-          {
-            try
-            {
-              bodyStream.close();
-            }
-            catch (IOException e)
-            {
-            }
-            bodyStream = null;
-          }
-          synchronized (this)
-          {
-            try
-            {
-              executeMethod.abort();
-            }
-            catch (Throwable e)
-            {
-              shutdownException = e;
-            }
-            this.notifyAll();
-          }
-        }
-      }
-      catch (Throwable e)
-      {
-        // We catch exceptions here that should ONLY be InterruptedExceptions, as a result of the thread being aborted.
-        this.generalException = e;
-      }
-    }
-
-    public int getResponseCode()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until the response object is there
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-            return response.getStatusLine().getStatusCode();
-          wait();
-        }
-      }
-    }
-
-    public String getResponseStatus()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until the response object is there
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-            return response.getStatusLine().toString();
-          wait();
-        }
-      }
-    }
-
-    public Map<String,List<String>> getResponseHeaders()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait for the response object to appear
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-          {
-            Header[] headers = response.getAllHeaders();
-            Map<String,List<String>> rval = new HashMap<String,List<String>>();
-            int i = 0;
-            while (i < headers.length)
-            {
-              Header h = headers[i++];
-              String name = h.getName();
-              String value = h.getValue();
-              List<String> values = rval.get(name);
-              if (values == null)
-              {
-                values = new ArrayList<String>();
-                rval.put(name,values);
-              }
-              values.add(value);
-            }
-            return rval;
-          }
-          wait();
-        }
-      }
-
-    }
-    
-    public String getFirstHeader(String headerName)
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait for the response object to appear
-      while (true)
-      {
-        synchronized (this)
-        {
-          checkException(responseException);
-          if (response != null)
-          {
-            Header h = response.getFirstHeader(headerName);
-            if (h == null)
-              return null;
-            return h.getValue();
-          }
-          wait();
-        }
-      }
-    }
-
-    public InputStream getSafeInputStream()
-      throws InterruptedException, IOException, HttpException
-    {
-      // Must wait until stream is created, or until we note an exception was thrown.
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting stream");
-          checkException(streamException);
-          if (streamCreated)
-            return threadStream;
-          wait();
-        }
-      }
-    }
-    
-    public Charset getCharSet()
-      throws InterruptedException, IOException, HttpException
-    {
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (responseException != null)
-            throw new IllegalStateException("Check for response before getting charset");
-          checkException(streamException);
-          if (streamCreated)
-            return charSet;
-          wait();
-        }
-      }
-    }
-    
-    public void abort()
-    {
-      // This will be called during the finally
-      // block in the case where all is well (and
-      // the stream completed) and in the case where
-      // there were exceptions.
-      synchronized (this)
-      {
-        if (streamCreated)
-        {
-          if (threadStream != null)
-            threadStream.abort();
-        }
-        abortThread = true;
-      }
-    }
-    
-    public void finishUp()
-      throws InterruptedException
-    {
-      join();
-    }
-    
-    protected synchronized void checkException(Throwable exception)
-      throws IOException, HttpException
-    {
-      if (exception != null)
-      {
-        Throwable e = exception;
-        if (e instanceof IOException)
-          throw (IOException)e;
-        else if (e instanceof HttpException)
-          throw (HttpException)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof Error)
-          throw (Error)e;
-        else
-          throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
-      }
-    }
-
-  }
-
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/DeflateInputStream.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/DeflateInputStream.java
deleted file mode 100644
index 8a1a6bf..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/DeflateInputStream.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.common;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.zip.DataFormatException;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-
-/** Deflate input stream.  This class takes logic from HttpComponents HttpClient 4.2.x that
-* really should have been exposed as an independent input stream wrapper, and does it the right
-* way.  I will also open an HttpClient ticket so that this code can be pushed upstream eventually.
-*/
-public class DeflateInputStream extends InputStream
-{
-  private InputStream sourceStream;
-
-  public DeflateInputStream(final InputStream wrapped)
-    throws IOException
-  {
-    /*
-      * A zlib stream will have a header.
-      *
-      * CMF | FLG [| DICTID ] | ...compressed data | ADLER32 |
-      *
-      * * CMF is one byte.
-      *
-      * * FLG is one byte.
-      *
-      * * DICTID is four bytes, and only present if FLG.FDICT is set.
-      *
-      * Sniff the content. Does it look like a zlib stream, with a CMF, etc? c.f. RFC1950,
-      * section 2.2. http://tools.ietf.org/html/rfc1950#page-4
-      *
-      * We need to see if it looks like a proper zlib stream, or whether it is just a deflate
-      * stream. RFC2616 calls zlib streams deflate. Confusing, isn't it? That's why some servers
-      * implement deflate Content-Encoding using deflate streams, rather than zlib streams.
-      *
-      * We could start looking at the bytes, but to be honest, someone else has already read
-      * the RFCs and implemented that for us. So we'll just use the JDK libraries and exception
-      * handling to do this. If that proves slow, then we could potentially change this to check
-      * the first byte - does it look like a CMF? What about the second byte - does it look like
-      * a FLG, etc.
-      */
-
-    /* We read a small buffer to sniff the content. */
-    final byte[] peeked = new byte[6];
-
-    final PushbackInputStream pushback = new PushbackInputStream(wrapped, peeked.length);
-
-    final int headerLength = pushback.read(peeked);
-
-    if (headerLength == -1) {
-      throw new IOException("Unable to read the response");
-    }
-
-    /* We try to read the first uncompressed byte. */
-    final byte[] dummy = new byte[1];
-
-    final Inflater inf = new Inflater();
-
-    try {
-      int n;
-      while ((n = inf.inflate(dummy)) == 0) {
-        if (inf.finished()) {
-
-          /* Not expecting this, so fail loudly. */
-          throw new IOException("Unable to read the response");
-        }
-
-        if (inf.needsDictionary()) {
-
-          /* Need dictionary - then it must be zlib stream with DICTID part? */
-          break;
-        }
-
-        if (inf.needsInput()) {
-          inf.setInput(peeked);
-        }
-      }
-
-      if (n == -1) {
-        throw new IOException("Unable to read the response");
-      }
-
-      /*
-        * We read something without a problem, so it's a valid zlib stream. Just need to reset
-        * and return an unused InputStream now.
-        */
-      pushback.unread(peeked, 0, headerLength);
-      sourceStream = new DeflateStream(pushback, new Inflater());
-    } catch (final DataFormatException e) {
-
-      /* Presume that it's an RFC1951 deflate stream rather than RFC1950 zlib stream and try
-        * again. */
-      pushback.unread(peeked, 0, headerLength);
-      sourceStream = new DeflateStream(pushback, new Inflater(true));
-    } finally {
-      inf.end();
-    }
-
-  }
-
-  /** Read a byte.
-  */
-  @Override
-  public int read()
-    throws IOException
-  {
-    return sourceStream.read();
-  }
-    
-  /** Read lots of bytes.
-  */
-  @Override
-  public int read(byte[] b)
-    throws IOException
-  {
-    return sourceStream.read(b);
-  }
-
-  /** Read lots of specific bytes.
-  */
-  @Override
-  public int read(byte[] b, int off, int len)
-    throws IOException
-  {
-    return sourceStream.read(b,off,len);
-  }
-  
-  /** Skip
-  */
-  @Override
-  public long skip(long n)
-    throws IOException
-  {
-    return sourceStream.skip(n);
-  }
-
-  /** Get available.
-  */
-  @Override
-  public int available()
-    throws IOException
-  {
-    return sourceStream.available();
-  }
-
-  /** Mark.
-  */
-  @Override
-  public void mark(int readLimit)
-  {
-    sourceStream.mark(readLimit);
-  }
-
-  /** Reset.
-  */
-  @Override
-  public void reset()
-    throws IOException
-  {
-    sourceStream.reset();
-  }
-
-  /** Check if mark is supported.
-  */
-  @Override
-  public boolean markSupported()
-  {
-    return sourceStream.markSupported();
-  }
-
-  /** Close.
-  */
-  @Override
-  public void close()
-    throws IOException
-  {
-    sourceStream.close();
-  }
-
-  static class DeflateStream extends InflaterInputStream {
-
-    private boolean closed = false;
-
-    public DeflateStream(final InputStream in, final Inflater inflater) {
-      super(in, inflater);
-    }
-
-    @Override
-    public void close() throws IOException {
-      if (closed) {
-        return;
-      }
-      closed = true;
-      inf.end();
-      super.close();
-    }
-
-  }
-
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/InterruptibleSocketFactory.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/InterruptibleSocketFactory.java
deleted file mode 100644
index 174a919..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/InterruptibleSocketFactory.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.common;
-
-import java.io.*;
-import java.net.*;
-
-import org.apache.http.conn.ConnectTimeoutException;
-
-/** SSL Socket factory which wraps another socket factory but allows timeout on socket
-* creation.
-*/
-public class InterruptibleSocketFactory extends javax.net.ssl.SSLSocketFactory
-{
-  protected final javax.net.ssl.SSLSocketFactory wrappedFactory;
-  protected final long connectTimeoutMilliseconds;
-    
-  public InterruptibleSocketFactory(javax.net.ssl.SSLSocketFactory wrappedFactory, long connectTimeoutMilliseconds)
-  {
-    this.wrappedFactory = wrappedFactory;
-    this.connectTimeoutMilliseconds = connectTimeoutMilliseconds;
-  }
-
-  @Override
-  public Socket createSocket()
-    throws IOException
-  {
-    // Socket isn't open
-    return wrappedFactory.createSocket();
-  }
-    
-  @Override
-  public Socket createSocket(String host, int port)
-    throws IOException, UnknownHostException
-  {
-    return fireOffThread(InetAddress.getByName(host),port,null,-1);
-  }
-
-  @Override
-  public Socket createSocket(InetAddress host, int port)
-    throws IOException
-  {
-    return fireOffThread(host,port,null,-1);
-  }
-    
-  @Override
-  public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
-    throws IOException, UnknownHostException
-  {
-    return fireOffThread(InetAddress.getByName(host),port,localHost,localPort);
-  }
-    
-  @Override
-  public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
-    throws IOException
-  {
-    return fireOffThread(address,port,localAddress,localPort);
-  }
-    
-  @Override
-  public Socket createSocket(Socket s, String host, int port, boolean autoClose)
-    throws IOException
-  {
-    // Socket's already open
-    return wrappedFactory.createSocket(s,host,port,autoClose);
-  }
-    
-  @Override
-  public String[] getDefaultCipherSuites()
-  {
-    return wrappedFactory.getDefaultCipherSuites();
-  }
-    
-  @Override
-  public String[] getSupportedCipherSuites()
-  {
-    return wrappedFactory.getSupportedCipherSuites();
-  }
-    
-  protected Socket fireOffThread(InetAddress address, int port, InetAddress localHost, int localPort)
-    throws IOException
-  {
-    SocketCreateThread thread = new SocketCreateThread(wrappedFactory,address,port,localHost,localPort);
-    thread.start();
-    try
-    {
-      // Wait for thread to complete for only a certain amount of time!
-      thread.join(connectTimeoutMilliseconds);
-      // If join() times out, then the thread is going to still be alive.
-      if (thread.isAlive())
-      {
-        // Kill the thread - not that this will necessarily work, but we need to try
-        thread.interrupt();
-        throw new ConnectTimeoutException("Secure connection timed out");
-      }
-      // The thread terminated.  Throw an error if there is one, otherwise return the result.
-      Throwable t = thread.getException();
-      if (t != null)
-      {
-        if (t instanceof java.net.SocketTimeoutException)
-          throw (java.net.SocketTimeoutException)t;
-        else if (t instanceof ConnectTimeoutException)
-          throw (ConnectTimeoutException)t;
-        else if (t instanceof InterruptedIOException)
-          throw (InterruptedIOException)t;
-        else if (t instanceof IOException)
-          throw (IOException)t;
-        else if (t instanceof Error)
-          throw (Error)t;
-        else if (t instanceof RuntimeException)
-          throw (RuntimeException)t;
-        throw new Error("Received an unexpected exception: "+t.getMessage(),t);
-      }
-      return thread.getResult();
-    }
-    catch (InterruptedException e)
-    {
-      throw new InterruptedIOException("Interrupted: "+e.getMessage());
-    }
-
-  }
-
-  /** Create a secure socket in a thread, so that we can "give up" after a while if the socket fails to connect.
-  */
-  protected static class SocketCreateThread extends Thread
-  {
-    // Socket factory
-    protected javax.net.ssl.SSLSocketFactory socketFactory;
-    protected InetAddress host;
-    protected int port;
-    protected InetAddress clientHost;
-    protected int clientPort;
-
-    // The return socket
-    protected Socket rval = null;
-    // The return error
-    protected Throwable throwable = null;
-
-    /** Create the thread */
-    public SocketCreateThread(javax.net.ssl.SSLSocketFactory socketFactory,
-      InetAddress host,
-      int port,
-      InetAddress clientHost,
-      int clientPort)
-    {
-      this.socketFactory = socketFactory;
-      this.host = host;
-      this.port = port;
-      this.clientHost = clientHost;
-      this.clientPort = clientPort;
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      try
-      {
-        if (clientHost == null)
-          rval = socketFactory.createSocket(host,port);
-        else
-          rval = socketFactory.createSocket(host,port,clientHost,clientPort);
-      }
-      catch (Throwable e)
-      {
-        throwable = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return throwable;
-    }
-
-    public Socket getResult()
-    {
-      return rval;
-    }
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadInputStream.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadInputStream.java
deleted file mode 100644
index 1291a61..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadInputStream.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.common;
-
-import java.io.*;
-
-/** Cross-thread input stream.  Use this class when you have a helper thread
-* reading from a socket, and you need the ability to read safely from a ManifoldCF
-* worker thread.
-*/
-public class XThreadInputStream extends InputStream
-{
-  private final byte[] buffer = new byte[65536];
-  private int startPoint = 0;
-  private int byteCount = 0;
-  private boolean streamEnd = false;
-  private IOException failureException = null;
-  private boolean abort = false;
-
-  private final InputStream sourceStream;
-	
-  /** Constructor, from a given input stream. */
-  public XThreadInputStream(InputStream sourceStream)
-  {
-    this.sourceStream = sourceStream;
-  }
-  
-  /** Constructor, from another source. */
-  public XThreadInputStream()
-  {
-    this.sourceStream = null;
-  }
-  
-  /** Call this method to abort the stuffQueue() method.
-  */
-  public void abort()
-  {
-    synchronized (this)
-    {
-      abort = true;
-      notifyAll();
-    }
-  }
-  
-  /** This method is called from the helper thread side, to stuff bytes onto
-  * the queue when there is no input stream.
-  * It exits only when interrupted or done.
-  */
-  public void stuffQueue(byte[] byteBuffer, int offset, int amount)
-    throws InterruptedException
-  {
-    while (amount > 0)
-    {
-      int maxToRead;
-      int readStartPoint;
-      synchronized (this)
-      {
-        if (abort || streamEnd)
-          return;
-        // Calculate amount to read
-        maxToRead = buffer.length - byteCount;
-        if (maxToRead == 0)
-        {
-          wait();
-          continue;
-        }
-        readStartPoint = (startPoint + byteCount) & (buffer.length-1);
-      }
-      if (readStartPoint + maxToRead >= buffer.length)
-        maxToRead = buffer.length - readStartPoint;
-      // Now, copy to buffer
-      int amt;
-      if (amount > maxToRead)
-        amt = maxToRead;
-      else
-        amt = amount;
-      System.arraycopy(byteBuffer,offset,buffer,readStartPoint,amt);
-      offset += amt;
-      amount -= amt;
-      synchronized (this)
-      {
-        byteCount += amt;
-        notifyAll();
-      }
-    }
-  }
-  
-  /** Call this method when there is no more data to write.
-  */
-  public void doneStuffingQueue()
-  {
-    synchronized (this)
-    {
-      streamEnd = true;
-      notifyAll();
-    }
-  }
-  
-  /** This method is called from the helper thread side, to keep the queue
-  * stuffed from the input stream.
-  * It exits when the stream is empty, or when interrupted.
-  */
-  public void stuffQueue()
-    throws IOException, InterruptedException
-  {
-    while (true)
-    {
-      int maxToRead;
-      int readStartPoint;
-      synchronized (this)
-      {
-        if (streamEnd || abort)
-          return;
-        // Calculate amount to read
-        maxToRead = buffer.length - byteCount;
-        if (maxToRead == 0)
-        {
-          wait();
-          continue;
-        }
-        readStartPoint = (startPoint + byteCount) & (buffer.length-1);
-      }
-      
-      // See how to break up the reads into pieces.  We only do one piece right now.
-      if (readStartPoint + maxToRead >= buffer.length)
-        maxToRead = buffer.length - readStartPoint;
-      
-      int amt = -1;
-      IOException exception = null;
-      try
-      {
-        amt = sourceStream.read(buffer, readStartPoint, maxToRead);
-      }
-      catch (IOException e)
-      {
-        exception = e;
-      }
-      
-      synchronized (this)
-      {
-        if (exception != null)
-          failureException = exception;
-        else if (amt == -1)
-          streamEnd = true;
-        else
-          byteCount += amt;
-        notifyAll();
-      }
-    }
-  }
-  
-  /** Read a byte.
-  */
-  @Override
-  public int read()
-    throws IOException
-  {
-    byte[] b = new byte[1];
-    int amt = read(b,0,1);
-    if (amt == -1)
-      return amt;
-    return ((int)b[0]) & 0xffff;
-  }
-    
-  /** Read lots of bytes.
-  */
-  @Override
-  public int read(byte[] b)
-    throws IOException
-  {
-    return read(b,0,b.length);
-  }
-
-  /** Read lots of specific bytes.
-  */
-  @Override
-  public int read(byte[] b, int off, int len)
-    throws IOException
-  {
-    try
-    {
-      int totalAmt = 0;
-      while (true)
-      {
-        if (len == 0)
-          return totalAmt;
-        int copyLen;
-        synchronized (this)
-        {
-          copyLen = byteCount;
-          if (copyLen > len)
-            copyLen = len;
-          int remLen = buffer.length - startPoint;
-          if (copyLen > remLen)
-            copyLen = remLen;
-          if (copyLen == 0)
-          {
-            if (streamEnd)
-            {
-              if (totalAmt != 0)
-                return totalAmt;
-              return -1;
-            }
-            if (failureException != null)
-              throw failureException;
-            wait();
-            continue;
-          }
-        }
-        System.arraycopy(buffer, startPoint, b, off, copyLen);
-        totalAmt += copyLen;
-        off += copyLen;
-        len -= copyLen;
-        synchronized (this)
-        {
-          startPoint += copyLen;
-          startPoint &= (buffer.length - 1);
-          byteCount -= copyLen;
-          notifyAll();
-        }
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new InterruptedIOException(e.getMessage());
-    }
-  }
-  
-  /** Skip
-  */
-  @Override
-  public long skip(long n)
-    throws IOException
-  {
-    // Do nothing
-    return 0L;
-  }
-
-  /** Get available.
-  */
-  @Override
-  public int available()
-    throws IOException
-  {
-    // Not supported
-    return 0;
-  }
-
-  /** Mark.
-  */
-  @Override
-  public void mark(int readLimit)
-  {
-    // Do nothing
-  }
-
-  /** Reset.
-  */
-  @Override
-  public void reset()
-    throws IOException
-  {
-    // Do nothing
-  }
-
-  /** Check if mark is supported.
-  */
-  @Override
-  public boolean markSupported()
-  {
-    // Not supported
-    return false;
-  }
-
-  /** Close.
-  */
-  @Override
-  public void close()
-    throws IOException
-  {
-    // Do nothing; stream close is handled by the caller on the stuffer side
-  }
-
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadOutputStream.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadOutputStream.java
deleted file mode 100644
index 0d41c8e..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadOutputStream.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.common;
-
-import java.io.*;
-
-/** Output stream, which writes to XThreadInputStream.
-* Use this when an API method needs to write to an output stream, but
-* you want an input stream in the other thread receiving the data.
-*/
-public class XThreadOutputStream extends OutputStream {
-
-  protected final XThreadInputStream inputStream;
-    
-  byte[] byteBuffer = new byte[1];
-
-  public XThreadOutputStream(XThreadInputStream inputStream) {
-    this.inputStream = inputStream;
-  }
-  
-  @Override
-  public void write(byte[] buffer)
-    throws IOException {
-    try {
-      inputStream.stuffQueue(buffer,0,buffer.length);
-    } catch (InterruptedException e) {
-      throw new InterruptedIOException(e.getMessage());
-    }
-  }
-
-  @Override
-  public void write(int c)
-    throws IOException {
-    byteBuffer[0] = (byte)c;
-    try {
-      inputStream.stuffQueue(byteBuffer,0,1);
-    } catch (InterruptedException e) {
-      throw new InterruptedIOException(e.getMessage());
-    }
-  }
-
-  @Override
-  public void write(byte[] buffer, int pos, int amt)
-    throws IOException {
-    try {
-      inputStream.stuffQueue(buffer,pos,amt);
-    } catch (InterruptedException e) {
-      throw new InterruptedIOException(e.getMessage());
-    }
-  }
-    
-  @Override
-  public void close()
-    throws IOException {
-    inputStream.doneStuffingQueue();
-    super.close();
-  }
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadStringBuffer.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadStringBuffer.java
deleted file mode 100644
index 3efec03..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/XThreadStringBuffer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.common;
-
-import java.util.*;
-
-/** Thread-safe class that functions as a limited-size buffer of strings */
-public class XThreadStringBuffer
-{
-  protected static int MAX_SIZE = 1024;
-  
-  protected List<String> buffer = new ArrayList<String>(MAX_SIZE);
-  
-  protected boolean complete = false;
-  protected boolean abandoned = false;
-  
-  /** Constructor */
-  public XThreadStringBuffer()
-  {
-  }
-  
-  /** Add a string to the buffer, and block if the buffer is full */
-  public synchronized void add(String string)
-    throws InterruptedException
-  {
-    while (buffer.size() == MAX_SIZE && !abandoned)
-      wait();
-    if (abandoned)
-      return;
-    buffer.add(string);
-    // Notify threads that are waiting on there being stuff in the queue
-    notifyAll();
-  }
-  
-  /** Signal that the buffer should be abandoned.
-  * Called by the receiving thread! */
-  public synchronized void abandon()
-  {
-    abandoned = true;
-    // Notify waiting threads
-    notifyAll();
-  }
-  
-  /** Signal that the operation is complete, and that no more strings
-  * will be added.  Called by the sending thread!
-  */
-  public synchronized void signalDone()
-  {
-    complete = true;
-    // Notify threads that are waiting for stuff to appear, because it won't
-    notifyAll();
-  }
-  
-  /** Pull an id off the buffer, and wait if there's more to come.
-  * Called by the receiving thread!
-  * Returns null if the operation is complete.
-  */
-  public synchronized String fetch()
-    throws InterruptedException
-  {
-    while (buffer.size() == 0 && !complete)
-      wait();
-    if (buffer.size() == 0)
-      return null;
-    boolean isBufferFull = (buffer.size() == MAX_SIZE);
-    String rval = buffer.remove(buffer.size()-1);
-    // Notify those threads waiting on buffer being not completely full to wake
-    if (isBufferFull)
-      notifyAll();
-    return rval;
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/extmimemap/ExtensionMimeMap.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/extmimemap/ExtensionMimeMap.java
deleted file mode 100644
index 937eb13..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/extmimemap/ExtensionMimeMap.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.extmimemap;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.tika.Tika;
-
-/** Map file extension to a mime type.
-*/
-public class ExtensionMimeMap
-{
-  /** Map extension to mime type */
-  public static String mapToMimeType(String extension)
-  {
-    return new Tika().detect("x."+extension);
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/AttrNameValue.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/AttrNameValue.java
deleted file mode 100644
index 8df05b0..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/AttrNameValue.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class represents a name/value pair from an
-* XML/HTML attribute.
-*/
-public class AttrNameValue
-{
-  protected final String name;
-  protected final String value;
-  
-  public AttrNameValue(String name, String value)
-  {
-    this.name = name;
-    this.value = value;
-  }
-  
-  public String getName()
-  {
-    return name;
-  }
-  
-  public String getValue()
-  {
-    return value;
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/BOMEncodingDetector.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/BOMEncodingDetector.java
deleted file mode 100644
index 7f1bd13..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/BOMEncodingDetector.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-
-/** This class represents the parse state of the BOM (byte order mark) parser.
-* The byte order mark parser looks for a byte order mark at the start of a byte sequence,
-* and based on whether it finds it or not, and what it finds, selects a preliminary character encoding.
-* Once a preliminary character encoding is determined, an EncodingAccepter is notified,
-* and further bytes are sent to a provided ByteReceiver.
-*/
-public class BOMEncodingDetector extends SingleByteReceiver implements EncodingDetector
-{
-  protected String encoding = null;
-  protected final ByteReceiver overflowByteReceiver;
-  
-  protected ByteBuffer replayBuffer = new ByteBuffer();
-  
-  protected final static int BOM_NOTHINGYET = 0;
-  protected final static int BOM_SEEN_EF = 1;
-  protected final static int BOM_SEEN_FF = 2;
-  protected final static int BOM_SEEN_FE = 3;
-  protected final static int BOM_SEEN_ZERO = 4;
-  protected final static int BOM_SEEN_EFBB = 5;
-  protected final static int BOM_SEEN_FFFE = 6;
-  protected final static int BOM_SEEN_0000 = 7;
-  protected final static int BOM_SEEN_FFFE00 = 8;
-  protected final static int BOM_SEEN_0000FE = 9;
-  
-  protected int currentState = BOM_NOTHINGYET;
-  
-  /** Constructor.
-  *@param overflowByteReceiver Pass in the receiver of all overflow bytes.
-  * If no receiver is passed in, the detector will stop as soon as the
-  * BOM is either seen, or not seen.
-  */
-  public BOMEncodingDetector(ByteReceiver overflowByteReceiver)
-  {
-    super(8);
-    this.overflowByteReceiver = overflowByteReceiver;
-  }
-  
-  /** Set initial encoding.
-  */
-  @Override
-  public void setEncoding(String encoding)
-  {
-    this.encoding = encoding;
-  }
-
-  /** Retrieve final encoding determination.
-  */
-  @Override
-  public String getEncoding()
-  {
-    return encoding;
-  }
-  
-  /** Receive a byte.
-  */
-  @Override
-  public boolean dealWithByte(byte b)
-    throws ManifoldCFException
-  {
-    replayBuffer.appendByte(b);
-    int theByte = 0xff & (int)b;
-    switch (currentState)
-    {
-
-    case BOM_NOTHINGYET:
-      if (theByte == 0xef)
-        currentState = BOM_SEEN_EF;
-      else if (theByte == 0xff)
-        currentState = BOM_SEEN_FF;
-      else if (theByte == 0xfe)
-        currentState = BOM_SEEN_FE;
-      else if (theByte == 0x00)
-        currentState = BOM_SEEN_ZERO;
-      else
-        return replay();
-      break;
-
-    case BOM_SEEN_EF:
-      if (theByte == 0xbb)
-        currentState = BOM_SEEN_EFBB;
-      else
-        return replay();
-      break;
-
-    case BOM_SEEN_FF:
-      if (theByte == 0xfe)
-      {
-        // Either UTF-16LE or UTF-32LE
-        mark();
-        currentState = BOM_SEEN_FFFE;
-      }
-      else
-        return replay();
-      break;
-
-    case BOM_SEEN_FE:
-      if (theByte == 0xff)
-      {
-        // UTF-16BE detected
-        mark();
-        return establishEncoding("UTF-16BE");
-      }
-      else
-        return replay();
-      
-    case BOM_SEEN_ZERO:
-      if (theByte == 0x00)
-        currentState = BOM_SEEN_0000;
-      else
-        return replay();
-      break;
-      
-    case BOM_SEEN_EFBB:
-      if (theByte == 0xbf)
-      {
-        // Encoding detected as utf-8
-        mark();
-        return establishEncoding(StandardCharsets.UTF_8.name());
-      }
-      else
-        return replay();
-
-    case BOM_SEEN_FFFE:
-      if (theByte == 0x00)
-      {
-        currentState = BOM_SEEN_FFFE00;
-      }
-      else
-      {
-        // Encoding detected as UTF-16LE.  Do NOT re-mark, we need this
-        // character for later.
-        return establishEncoding(StandardCharsets.UTF_16LE.name());
-      }
-      break;
-
-    case BOM_SEEN_0000:
-      if (theByte == 0xfe)
-        currentState = BOM_SEEN_0000FE;
-      else
-        return replay();
-      break;
-
-    case BOM_SEEN_FFFE00:
-      if (theByte == 0x00)
-      {
-        mark();
-        return establishEncoding("UTF-32LE");
-      }
-      else
-      {
-        // Leave mark alone.
-        return establishEncoding(StandardCharsets.UTF_16LE.name());
-      }
-
-    case BOM_SEEN_0000FE:
-      if (theByte == 0xff)
-      {
-        mark();
-        return establishEncoding("UTF-32BE");
-      }
-      else
-        return replay();
-      
-    default:
-      throw new ManifoldCFException("Unknown state: "+currentState);
-    }
-    
-    return false;
-  }
-
-  /** Establish the provided encoding, and send the rest to the child, if any.
-  */
-  protected boolean establishEncoding(String encoding)
-    throws ManifoldCFException
-  {
-    setEncoding(encoding);
-    return true;
-  }
-  
-  /** Set a "mark".
-  */
-  protected void mark()
-  {
-    replayBuffer.clear();
-  }
-  
-  /** Establish NO encoding, and replay from the current saved point to the child, if any.
-  */
-  protected boolean replay()
-    throws ManifoldCFException
-  {
-    return true;
-  }
-  
-  /** Send stream from current point onward with the current encoding.
-  */
-  protected boolean playFromCurrentPoint()
-    throws ManifoldCFException
-  {
-    mark();
-    return true;
-  }
-  
-  /** Deal with the remainder of the input.
-  * This is called only when dealWithByte() returns true.
-  *@param buffer is the buffer of characters that should come first.
-  *@param offset is the offset within the buffer of the first character.
-  *@param len is the number of characters in the buffer.
-  *@param inputStream is the stream that should come after the characters in the buffer.
-  *@return true to abort, false if the end of the stream has been reached.
-  */
-  @Override
-  protected boolean dealWithRemainder(byte[] buffer, int offset, int len, InputStream inputStream)
-    throws IOException, ManifoldCFException
-  {
-    if (overflowByteReceiver == null)
-      return super.dealWithRemainder(buffer,offset,len,inputStream);
-    // Create a wrapped input stream with all the missing bytes
-    while (len > 0)
-    {
-      replayBuffer.appendByte(buffer[offset++]);
-      len--;
-    }
-    return overflowByteReceiver.dealWithBytes(new PrefixedInputStream(replayBuffer,inputStream));
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ByteBuffer.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ByteBuffer.java
deleted file mode 100644
index dde0267..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ByteBuffer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class represents a variable-length buffer for bytes.
-*/
-public class ByteBuffer
-{
-  protected static final int arraySize = 65536;
-  protected static final int arrayShift = 16;
-  
-  protected final List<byte[]> arrayOfArrays = new ArrayList<byte[]>();
-  protected int totalBytes = 0;
-  protected int currentIndex = -1;
-  protected byte[] currentBuffer = null;
-  
-  /** Constructor */
-  public ByteBuffer()
-  {
-  }
-  
-  /** Clear the buffer.
-  */
-  public void clear()
-  {
-    arrayOfArrays.clear();
-    totalBytes = 0;
-    currentIndex = -1;
-    currentBuffer = null;
-  }
-  
-  /** Get the current buffer length.
-  */
-  public int size()
-  {
-    return totalBytes;
-  }
-  
-  /** Add a byte to the buffer at the end.
-  */
-  public void appendByte(byte b)
-  {
-    if (currentIndex == arraySize || currentIndex == -1)
-    {
-      currentBuffer = new byte[arraySize];
-      arrayOfArrays.add(currentBuffer);
-      currentIndex = 0;
-    }
-    currentBuffer[currentIndex++] = b;
-    totalBytes++;
-  }
-  
-  /** Read a byte from the buffer from the specified place.
-  */
-  public byte readByte(int position)
-  {
-    int arrayNumber = position >> 16;
-    int offset = position & (arraySize-1);
-    return arrayOfArrays.get(arrayNumber)[offset];
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ByteReceiver.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ByteReceiver.java
deleted file mode 100644
index 72ab3be..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ByteReceiver.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This class represents a receiver for bytes.
-* Extenders of this class will accept an input stream,
-* and will read from it as requested a chunk at a time.
-*/
-public abstract class ByteReceiver
-{
-  /** Constructor */
-  public ByteReceiver()
-  {
-  }
-  
-  /** Read a byte stream and process bytes.
-  *@return true if abort signalled, false if end of stream reached.
-  */
-  public abstract boolean dealWithBytes(InputStream is)
-    throws IOException, ManifoldCFException;
-  
-  /** Finish up all processing.  Called ONLY if we haven't already aborted.
-  */
-  public void finishUp()
-    throws ManifoldCFException
-  {
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/CharacterBuffer.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/CharacterBuffer.java
deleted file mode 100644
index 7215775..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/CharacterBuffer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class represents a variable-length buffer for characters.
-*/
-public class CharacterBuffer
-{
-  protected static final int arraySize = 65536;
-  protected static final int arrayShift = 16;
-  
-  protected final List<char[]> arrayOfArrays = new ArrayList<char[]>();
-  protected int totalChars = 0;
-  protected int currentIndex = -1;
-  protected char[] currentBuffer = null;
-  
-  /** Constructor */
-  public CharacterBuffer()
-  {
-  }
-  
-  /** Clear the buffer.
-  */
-  public void clear()
-  {
-    arrayOfArrays.clear();
-    totalChars = 0;
-    currentIndex = -1;
-    currentBuffer = null;
-  }
-  
-  /** Get the current buffer length.
-  */
-  public int size()
-  {
-    return totalChars;
-  }
-  
-  /** Add a char to the buffer at the end.
-  */
-  public void appendChar(char b)
-  {
-    if (currentIndex == arraySize || currentIndex == -1)
-    {
-      currentBuffer = new char[arraySize];
-      arrayOfArrays.add(currentBuffer);
-      currentIndex = 0;
-    }
-    currentBuffer[currentIndex++] = b;
-    totalChars++;
-  }
-  
-  /** Read a byte from the buffer from the specified place.
-  */
-  public char readChar(int position)
-  {
-    int arrayNumber = position >> 16;
-    int offset = position & (arraySize-1);
-    return arrayOfArrays.get(arrayNumber)[offset];
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/CharacterReceiver.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/CharacterReceiver.java
deleted file mode 100644
index c4d8231..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/CharacterReceiver.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This interface represents a receiver for characters.
-*/
-public abstract class CharacterReceiver
-{
-  /** Constructor.
-  */
-  public CharacterReceiver()
-  {
-  }
-  
-  /** Receive a stream of characters.
-  *@return true if abort signalled, false if end of stream.
-  */
-  public abstract boolean dealWithCharacters(Reader reader)
-    throws IOException, ManifoldCFException;
-  
-  /** Finish up all processing.  Called ONLY if we haven't already aborted.
-  */
-  public void finishUp()
-    throws ManifoldCFException
-  {
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/DecodingByteReceiver.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/DecodingByteReceiver.java
deleted file mode 100644
index fb798b0..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/DecodingByteReceiver.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This class represents a ByteReceiver that passes
-* decoded characters on to a supplied CharacterReceiver.
-*/
-public class DecodingByteReceiver extends ByteReceiver
-{
-  protected final CharacterReceiver charReceiver;
-  protected final String charSet;
-  
-  public DecodingByteReceiver(int chunkSize, String charSet, CharacterReceiver charReceiver)
-  {
-    super();
-    this.charSet = charSet;
-    this.charReceiver = charReceiver;
-  }
-  
-  /** Read a byte stream and process bytes.
-  *@return true if abort signalled, false if end of stream reached.
-  */
-  @Override
-  public final boolean dealWithBytes(InputStream is)
-    throws IOException, ManifoldCFException
-  {
-    // Create a reader based on the encoding and the input stream
-    Reader reader = new InputStreamReader(is,charSet);
-    return charReceiver.dealWithCharacters(reader);
-  }
-  
-  /** Finish up all processing.
-  */
-  @Override
-  public void finishUp()
-    throws ManifoldCFException
-  {
-    super.finishUp();
-    charReceiver.finishUp();
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/EncodingDetector.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/EncodingDetector.java
deleted file mode 100644
index f39e512..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/EncodingDetector.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface represents an encoding detector.
-* Implementers of this interface receive a starting encoding before
-* any other activity takes place, and then allow an updated encoding
-* to be retrieved once the activity is complete.
-*/
-public interface EncodingDetector
-{
-
-  /** Accept a starting encoding value.
-  */
-  public void setEncoding(String encoding);
-  
-  /** Read out the detected encoding, when finished.
-  */
-  public String getEncoding();
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/HTMLParseState.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/HTMLParseState.java
deleted file mode 100644
index 0514eb5..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/HTMLParseState.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-
-import java.util.*;
-import java.io.*;
-
-/** This class takes the output of the basic tag parser and converts it for
-* typical HTML usage.  It takes the attribute lists, for instance, and converts
-* them to lowercased maps.  It also bashes all tag names etc to lower case as
-* well.
-*/
-public class HTMLParseState extends TagParseState
-{
-  
-  /** Constructor.
-  */
-  public HTMLParseState()
-  {
-  }
-  
-  /** This method gets called for every tag.  Override this method to intercept tag begins.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    Map<String,String> attrMap = new HashMap<String,String>(attributes.size());
-    for (AttrNameValue nv : attributes)
-    {
-      attrMap.put(nv.getName().toLowerCase(Locale.ROOT), nv.getValue());
-    }
-    return noteTag(tagName.toLowerCase(Locale.ROOT), attrMap);
-  }
-
-  /** Map version of the noteTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw tag '"+tagName+"'");
-    return false;
-  }
-
-  /** This method gets called for every end tag.  Override this method to intercept tag ends.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEndTag(String tagName)
-    throws ManifoldCFException
-  {
-    return noteTagEnd(tagName.toLowerCase(Locale.ROOT));
-  }
-
-  /** Note end tag.
-  */
-  protected boolean noteTagEnd(String tagName)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw end tag '"+tagName+"'");
-    return false;
-  }
-  
-  /** This method is called for every <? ... ?> construct, or 'qtag'.
-  * This is not useful for HTML.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteQTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    return super.noteQTag(tagName, attributes);
-  }
-
-  /** This method is called for every <! <token> ... > construct, or 'btag'.
-  * Override it to intercept these.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteBTag(String tagName)
-    throws ManifoldCFException
-  {
-    return super.noteBTag(tagName);
-  }
-
-  /** This method is called for the end of every btag, or any time
-  * there's a naked '>' in the document.  Override it if you want to intercept these.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEndBTag()
-    throws ManifoldCFException
-  {
-    return super.noteEndBTag();
-  }
-
-  /** Called for the start of every cdata-like tag, e.g. <![ <token> [ ... ]]>
-  *@param token may be empty!!!
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEscaped(String token)
-    throws ManifoldCFException
-  {
-    return super.noteEscaped(token);
-  }
-
-  /** Called for the end of every cdata-like tag.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEndEscaped()
-    throws ManifoldCFException
-  {
-    return super.noteEndEscaped();
-  }
-
-  /** This method gets called for every token inside a btag.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteBTagToken(String token)
-    throws ManifoldCFException
-  {
-    return super.noteBTagToken(token);
-  }
-
-  /** This method gets called for every character that is found within an
-  * escape block, e.g. CDATA.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEscapedCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    return super.noteEscapedCharacter(thisChar);
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/Parser.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/Parser.java
deleted file mode 100644
index 474c0ba..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/Parser.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** This is the main parser class.
-* This class has an entry point for both parsing XML and HTML.  The way the
-* parser works is to accept both an input stream (which the caller is responsible
-* for closing) as well as a CharacterReceiver that will do the actual parsing.
-* This class is responsible mainly for setup and character set detection, 
-*/
-public class Parser
-{
-  
-  /** Constructor.
-  * Someday there will be a constructor which accepts character detection
-  * configuration information, but for now there is none.
-  */
-  public Parser()
-  {
-  }
-  
-  /** Parse an input stream with character set detection.
-  * This method uses BOM (byte order mark) and the xml encoding tag to determine the character encoding to use.
-  * The caller may pass in a starting character encoding, which functions as the default if no better determination
-  * is made.
-  *@param startingCharset is the starting character set.  Pass null if this is unknown.
-  *@param inputStream is the input stream.  It is the caller's responsibility to close the stream when the parse is done.
-  *@param characterReceiver is the character receiver that will actually do the parsing.
-  */
-  public void parseWithCharsetDetection(String startingCharset, InputStream inputStream, CharacterReceiver characterReceiver)
-    throws IOException, ManifoldCFException
-  {
-    // Wrap the input stream, before we do anything else
-    ReplayableInputStream replayableInputStream = new ReplayableInputStream(inputStream);
-    
-    // First go-around: use the BOM detector with nothing downstream, since we don't know the character set yet.
-    BOMEncodingDetector bomEncodingDetector = new BOMEncodingDetector(null);
-    bomEncodingDetector.setEncoding(startingCharset);
-    if (bomEncodingDetector.dealWithBytes(replayableInputStream) == false)
-      bomEncodingDetector.finishUp();
-    
-    // Update our notion of what the character set is
-    startingCharset = bomEncodingDetector.getEncoding();
-    if (startingCharset == null)
-      startingCharset = StandardCharsets.UTF_8.name();
-    // Reset the stream
-    replayableInputStream.restart(false);
-    // Set up a detection chain that includes the XML detector.
-    // BOMEncodingDetector (for BOM detection) -> XMLEncodingDetector (for xml encoding tag access)
-    XMLEncodingDetector xmlEncodingDetector = new XMLEncodingDetector();
-    xmlEncodingDetector.setEncoding(startingCharset);
-    bomEncodingDetector = new BOMEncodingDetector(new DecodingByteReceiver(1024,startingCharset,xmlEncodingDetector));
-    // Rerun the detection; this should finalize the value.
-    if (bomEncodingDetector.dealWithBytes(replayableInputStream) == false)
-      bomEncodingDetector.finishUp();
-
-    // Get the final charset determination
-    startingCharset = xmlEncodingDetector.getEncoding();
-    // Reset for the final time
-    replayableInputStream.restart(true);
-    // Set up the whole chain and parse
-    bomEncodingDetector = new BOMEncodingDetector(new DecodingByteReceiver(65536,startingCharset,characterReceiver));
-    if (bomEncodingDetector.dealWithBytes(replayableInputStream) == false)
-      bomEncodingDetector.finishUp();
-  }
-  
-  /** Parse an input stream without character set detection.
-  *@param startingCharset is the starting character set.  If null is passed, the code will presume utf-8.
-  *@param inputStream is the input stream.  It is the caller's responsibility to close the stream when the parse is done.
-  *@param characterReceiver is the character receiver that will actually do the parsing.
-  */
-  public void parseWithoutCharsetDetection(String startingCharset, InputStream inputStream, CharacterReceiver characterReceiver)
-    throws IOException, ManifoldCFException
-  {
-    if (startingCharset == null)
-      startingCharset = StandardCharsets.UTF_8.name();
-    ByteReceiver byteReceiver = new DecodingByteReceiver(65536, startingCharset, characterReceiver);
-    // Process to completion
-    if (byteReceiver.dealWithBytes(inputStream) == false)
-      byteReceiver.finishUp();
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/PrefixedInputStream.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/PrefixedInputStream.java
deleted file mode 100644
index a8d85bc..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/PrefixedInputStream.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This class represents an input stream that begins with bytes
-* passed to it through the constructor, and then continues with the bytes
-* from a wrapped input stream.  It's basically used when
-* we've read past where we want to be in an input stream and need to back up.
-*/
-public class PrefixedInputStream extends InputStream
-{
-  protected final ByteBuffer bytes;
-  protected final InputStream remainderStream;
-  
-  protected int bytePosition = 0;
-  protected int byteMax;
-  
-  /** Constructor */
-  public PrefixedInputStream(ByteBuffer bytes, InputStream remainderStream)
-  {
-    this.bytes = bytes;
-    this.remainderStream = remainderStream;
-    byteMax = bytes.size();
-  }
-
-  @Override
-  public int read()
-    throws IOException
-  {
-    if (bytePosition < byteMax)
-      return 0xff & (int)bytes.readByte(bytePosition++);
-    return remainderStream.read();
-  }
-  
-  @Override
-  public int read(byte[] b, int off, int len)
-    throws IOException
-  {
-    // Use the superclass method that goes through read, if we're within the
-    // buffer.
-    if (bytePosition < byteMax)
-      return super.read(b,off,len);
-    // Outside of the local buffer, vector right through to the remainder stream.
-    return remainderStream.read(b,off,len);
-  }
-  
-  @Override
-  public long skip(long n)
-    throws IOException
-  {
-    if (bytePosition < byteMax)
-      return super.skip(n);
-    return remainderStream.skip(n);
-  }
-  
-  @Override
-  public void close()
-    throws IOException
-  {
-    // Since the wrapped input stream will be closed by someone else,
-    // we NEVER close it through the wrapper.
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/PrefixedReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/PrefixedReader.java
deleted file mode 100644
index 2008675..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/PrefixedReader.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.nio.*;
-
-/** This class represents a Reader that begins with characters
-* passed to it through the constructor, and then continues with the characters
-* from a wrapped Reader.  It's basically used when
-* we've read past where we want to be in a Reader and need to back up.
-*/
-public class PrefixedReader extends Reader
-{
-  protected final CharacterBuffer chars;
-  protected final Reader remainderStream;
-  
-  protected int charPosition = 0;
-  protected int charMax;
-  
-  /** Constructor */
-  public PrefixedReader(CharacterBuffer chars, Reader remainderStream)
-  {
-    this.chars = chars;
-    this.remainderStream = remainderStream;
-    charMax = chars.size();
-  }
-
-  @Override
-  public int read(CharBuffer target)
-    throws IOException
-  {
-    if (charPosition < charMax)
-      return super.read(target);
-    return remainderStream.read(target);
-  }
-  
-  @Override
-  public int read()
-    throws IOException
-  {
-    if (charPosition < charMax)
-      return super.read();
-    return remainderStream.read();
-  }
-  
-  @Override
-  public int read(char[] cbuf)
-    throws IOException
-  {
-    if (charPosition < charMax)
-      return super.read(cbuf);
-    return remainderStream.read(cbuf);
-  }
-  
-  @Override
-  public int read(char[] cbuf, int off, int len)
-    throws IOException
-  {
-    int amt = 0;
-    while (charPosition < charMax)
-    {
-      cbuf[off++] = chars.readChar(charPosition++);
-      len--;
-      amt++;
-    }
-    if (len > 0)
-    {
-      int rem = remainderStream.read(cbuf,off,len);
-      if (rem == -1)
-      {
-        if (amt > 0)
-          return amt;
-        return rem;
-      }
-      amt += rem;
-    }
-    return amt;
-  }
-  
-  @Override
-  public long skip(long n)
-    throws IOException
-  {
-    if (charPosition < charMax)
-      return super.skip(n);
-    return remainderStream.skip(n);
-  }
-  
-  @Override
-  public void close()
-    throws IOException
-  {
-    // Since the wrapped reader will be closed by someone else,
-    // we NEVER close it through the wrapper.
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ReplayableInputStream.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ReplayableInputStream.java
deleted file mode 100644
index bb0aa99..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/ReplayableInputStream.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This class represents an input stream wraps another, and that can be reset and
-* played over.  It accomplishes this by buffering all bytes that go past, and
-* then plays back from that buffer after the reset.
-* The caller, at some point, is expected to signal that no further restarts will
-* occur, which ends all attempts at buffering.
-*/
-public class ReplayableInputStream extends InputStream
-{
-  protected final ByteBuffer bytes = new ByteBuffer();
-  protected final InputStream wrappedStream;
-  
-  protected int bytePosition = 0;
-  protected boolean doBuffering = true;
-	
-  /** Constructor */
-  public ReplayableInputStream(InputStream wrappedStream)
-  {
-    this.wrappedStream = wrappedStream;
-  }
-
-  public void restart(boolean lastRestart)
-  {
-    if (doBuffering == false)
-      throw new IllegalStateException("Can't restart a stream after it has been restarted the last time");
-    doBuffering = !lastRestart;
-    bytePosition = 0;
-  }
-  
-  @Override
-  public int read()
-    throws IOException
-  {
-    if (bytePosition < bytes.size())
-      return 0xff & (int)bytes.readByte(bytePosition++);
-    int theByte = wrappedStream.read();
-    if (theByte == -1)
-      return theByte;
-    if (doBuffering)
-    {
-      bytes.appendByte((byte)theByte);
-      bytePosition++;
-    }
-    return theByte;
-  }
-  
-  @Override
-  public int read(byte[] b, int off, int len)
-    throws IOException
-  {
-    // Use the superclass method that goes through read, if we're within the
-    // buffer, or we're supposed to be buffering.
-    if (bytePosition < bytes.size() || doBuffering)
-      return super.read(b,off,len);
-    // Outside of the local buffer, vector right through to the remainder stream.
-    return wrappedStream.read(b,off,len);
-  }
-  
-  @Override
-  public long skip(long n)
-    throws IOException
-  {
-    if (bytePosition < bytes.size())
-    {
-      // I hope this reads n bytes, one at a time; that's what the javadoc seems
-      // to indicate.
-      return super.skip(n);
-    }
-    return wrappedStream.skip(n);
-  }
-  
-  @Override
-  public void close()
-    throws IOException
-  {
-    // Since the wrapped input stream will be closed by someone else,
-    // we NEVER close it through the wrapper.
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/SingleByteReceiver.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/SingleByteReceiver.java
deleted file mode 100644
index ff727b0..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/SingleByteReceiver.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This class represents a receiver for a series of single bytes.
-*/
-public abstract class SingleByteReceiver extends ByteReceiver
-{
-  protected final byte[] byteBuffer;
-  
-  /** Constructor */
-  public SingleByteReceiver(int chunkSize)
-  {
-    byteBuffer = new byte[chunkSize];
-  }
-  
-  /** Read a byte stream and process bytes.
-  *@return true if abort signalled, false if end of stream reached.
-  */
-  @Override
-  public final boolean dealWithBytes(InputStream inputStream)
-    throws IOException, ManifoldCFException
-  {
-    while (true)
-    {
-      int amt = inputStream.read(byteBuffer);
-      if (amt == -1)
-        return false;
-      for (int i = 0; i < amt; i++)
-      {
-        if (dealWithByte(byteBuffer[i]))
-        {
-          return dealWithRemainder(byteBuffer,i+1,amt-(i+1),inputStream);
-        }
-      }
-    }
-  }
-  
-  /** Receive a byte.
-  *@return true to stop further processing.
-  */
-  public abstract boolean dealWithByte(byte b)
-    throws IOException, ManifoldCFException;
-
-  /** Deal with the remainder of the input.
-  * This is called only when dealWithByte() returns true.
-  *@param buffer is the buffer of characters that should come first.
-  *@param offset is the offset within the buffer of the first character.
-  *@param len is the number of characters in the buffer.
-  *@param inputStream is the stream that should come after the characters in the buffer.
-  *@return true to abort, false if the end of the stream has been reached.
-  */
-  protected boolean dealWithRemainder(byte[] buffer, int offset, int len, InputStream inputStream)
-    throws IOException, ManifoldCFException
-  {
-    return true;
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/SingleCharacterReceiver.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/SingleCharacterReceiver.java
deleted file mode 100644
index 5ab6b29..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/SingleCharacterReceiver.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This interface represents a receiver for a sequence of individual characters.
-*/
-public abstract class SingleCharacterReceiver extends CharacterReceiver
-{
-  protected final char[] charBuffer;
-  
-  /** Constructor.
-  */
-  public SingleCharacterReceiver(int chunkSize)
-  {
-    charBuffer = new char[chunkSize];
-  }
-  
-  /** Receive a stream of characters.
-  *@return true if abort signalled, false if end of stream.
-  */
-  @Override
-  public final boolean dealWithCharacters(Reader reader)
-    throws IOException, ManifoldCFException
-  {
-    while (true)
-    {
-      int amt = reader.read(charBuffer);
-      if (amt == -1)
-        return false;
-      for (int i = 0; i < amt; i++)
-      {
-        if (dealWithCharacter(charBuffer[i]))
-        {
-          return dealWithRemainder(charBuffer, i+1, amt-(i+1), reader);
-        }
-      }
-    }
-  }
-  
-  /** Receive a byte.
-  * @return true if done.
-  */
-  public abstract boolean dealWithCharacter(char c)
-    throws IOException, ManifoldCFException;
-  
-  /** Deal with the remainder of the input.
-  * This is called only when dealWithCharacter() returns true.
-  *@param buffer is the buffer of characters that should come first.
-  *@param offset is the offset within the buffer of the first character.
-  *@param len is the number of characters in the buffer.
-  *@param inputStream is the stream that should come after the characters in the buffer.
-  *@return true to abort, false if the end of the stream has been reached.
-  */
-  protected boolean dealWithRemainder(char[] buffer, int offset, int len, Reader reader)
-    throws IOException, ManifoldCFException
-  {
-    return true;
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/TagParseState.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/TagParseState.java
deleted file mode 100644
index 2cc357d..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/TagParseState.java
+++ /dev/null
@@ -1,1170 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import java.util.*;
-
-/** This class represents a basic xml/html tag parser.
-* It is capable of recognizing the following xml and html constructs:
-*
-* '<' <token> <attrs> '>' ... '</' <token> '>'
-* '<' <token> <attrs> '/>'
-* '<?' <token> <attrs>  '?>'
-* '<![' [<token>] '[' ... ']]>'
-* '<!' <token> ... '>'
-* '<!--' ... '-->'
-*
-* Each of these, save the comment, has supporting protected methods that will be
-* called by the parsing engine.  Overriding these methods will allow an extending
-* class to perform higher-level data extraction and parsing.
-*
-* Of these, the messiest is the <! ... > construct, since there can be multiple nested
-* btags, cdata-like escapes, and qtags inside.  Ideally the parser should produce a
-* sequence of preparsed tokens from these tags.  Since they can be nested, keeping
-* track of the depth is also essential, so we do that with a btag depth counter.
-* Thus, in this case, it is not the state that matters, but the btag depth, to determine
-* if the parser is operating inside a btag.
-*/
-public class TagParseState extends SingleCharacterReceiver
-{
-  protected static final int TAGPARSESTATE_NORMAL = 0;
-  protected static final int TAGPARSESTATE_SAWLEFTANGLE = 1;
-  protected static final int TAGPARSESTATE_SAWEXCLAMATION = 2;
-  protected static final int TAGPARSESTATE_SAWDASH = 3;
-  protected static final int TAGPARSESTATE_IN_COMMENT = 4;
-  protected static final int TAGPARSESTATE_SAWCOMMENTDASH = 5;
-  protected static final int TAGPARSESTATE_SAWSECONDCOMMENTDASH = 6;
-  protected static final int TAGPARSESTATE_IN_TAG_NAME = 7;
-  protected static final int TAGPARSESTATE_IN_ATTR_NAME = 8;
-  protected static final int TAGPARSESTATE_IN_ATTR_VALUE = 9;
-  protected static final int TAGPARSESTATE_IN_TAG_SAW_SLASH = 10;
-  protected static final int TAGPARSESTATE_IN_END_TAG_NAME = 11;
-  protected static final int TAGPARSESTATE_IN_ATTR_LOOKING_FOR_VALUE = 12;
-  protected static final int TAGPARSESTATE_IN_SINGLE_QUOTES_ATTR_VALUE = 13;
-  protected static final int TAGPARSESTATE_IN_DOUBLE_QUOTES_ATTR_VALUE = 14;
-  protected static final int TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE = 15;
-  protected static final int TAGPARSESTATE_IN_QTAG_NAME = 16;
-  protected static final int TAGPARSESTATE_IN_QTAG_ATTR_NAME = 17;
-  protected static final int TAGPARSESTATE_IN_QTAG_SAW_QUESTION = 18;
-  protected static final int TAGPARSESTATE_IN_QTAG_ATTR_VALUE = 19;
-  protected static final int TAGPARSESTATE_IN_QTAG_ATTR_LOOKING_FOR_VALUE = 20;
-  protected static final int TAGPARSESTATE_IN_QTAG_SINGLE_QUOTES_ATTR_VALUE = 21;
-  protected static final int TAGPARSESTATE_IN_QTAG_DOUBLE_QUOTES_ATTR_VALUE = 22;
-  protected static final int TAGPARSESTATE_IN_QTAG_UNQUOTED_ATTR_VALUE = 23;
-  protected static final int TAGPARSESTATE_IN_BRACKET_TOKEN = 24;
-  protected static final int TAGPARSESTATE_NEED_FINAL_BRACKET = 25;
-  protected static final int TAGPARSESTATE_IN_BANG_TOKEN = 26;
-  protected static final int TAGPARSESTATE_IN_CDATA_BODY = 27;
-  protected static final int TAGPARSESTATE_SAWRIGHTBRACKET = 28;
-  protected static final int TAGPARSESTATE_SAWSECONDRIGHTBRACKET = 29;
-  protected static final int TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE_SAW_SLASH = 30;
-  
-  protected int currentState = TAGPARSESTATE_NORMAL;
-
-  /** The btag depth, which indicates btag behavior when > 0. */
-  protected int bTagDepth = 0;
-  
-  /** This is the only buffer we actually accumulate stuff in.
-  */
-  protected StringBuilder accumBuffer = new StringBuilder();
-  
-  // The following are pointers to the accum buffer above, when allocated.
-  
-  protected StringBuilder currentTagNameBuffer = null;
-  protected StringBuilder currentAttrNameBuffer = null;
-  protected StringBuilder currentValueBuffer = null;
-
-  protected String currentTagName = null;
-  protected String currentAttrName = null;
-  protected List<AttrNameValue> currentAttrList = null;
-
-  // Body decoding state
-
-  /** Whether we've seen an ampersand */
-  protected boolean inAmpersand = false;
-  /** Buffer of characters seen after ampersand. */
-  protected StringBuilder ampBuffer = new StringBuilder();
-
-  protected static final Map<String,String> mapLookup = new HashMap<String,String>();
-  static
-  {
-    mapLookup.put("amp","&");
-    mapLookup.put("lt","<");
-    mapLookup.put("gt",">");
-    mapLookup.put("quot","\"");
-    mapLookup.put("apos","'");
-  }
-
-  public TagParseState()
-  {
-    super(65536);
-  }
-
-  /** Deal with a character.  No exceptions are allowed, since those would represent
-  * syntax errors, and we don't want those to cause difficulty. */
-  @Override
-  public boolean dealWithCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    // At this level we want basic lexical analysis - that is, we deal with identifying tags and comments, that's it.
-    // We don't even attempt to map to lower case, that's how naive this is.
-    switch (currentState)
-    {
-    case TAGPARSESTATE_NORMAL:
-      if (thisChar == '<')
-      {
-        if (inAmpersand)
-        {
-          outputAmpBuffer();
-          inAmpersand = false;
-        }
-        currentState = TAGPARSESTATE_SAWLEFTANGLE;
-      }
-      else if (bTagDepth > 0 && thisChar == '>')
-      {
-        // Output current token, if any
-        if (currentTagNameBuffer != null && currentTagNameBuffer.length() > 0)
-        {
-          currentTagName = currentTagNameBuffer.toString();
-          if (noteBTagToken(currentTagName))
-            return true;
-          currentTagName = null;
-          currentTagNameBuffer = null;
-        }
-        if (noteEndBTag())
-          return true;
-        bTagDepth--;
-      }
-      else if (bTagDepth == 0)
-      {
-        if (inAmpersand)
-        {
-          if (thisChar == ';')
-          {
-            // We append the semi so that the output function can make good decisions
-            ampBuffer.append(thisChar);
-            if (outputAmpBuffer())
-              return true;
-            inAmpersand = false;
-          }
-          else if (isWhitespace(thisChar))
-          {
-            // Interpret ampersand buffer.
-            if (outputAmpBuffer())
-              return true;
-            inAmpersand = false;
-            if (noteNormalCharacter(thisChar))
-              return true;
-          }
-          else
-            ampBuffer.append(thisChar);
-        }
-        else if (thisChar == '&')
-        {
-          inAmpersand = true;
-          ampBuffer.setLength(0);
-        }
-        else
-        {
-          if (noteNormalCharacter(thisChar))
-            return true;
-        }
-      }
-      else
-      {
-        // In btag; accumulate tokens
-        if (isPunctuation(thisChar))
-        {
-          if (currentTagNameBuffer != null && currentTagNameBuffer.length() > 0)
-          {
-            currentTagName = currentTagNameBuffer.toString();
-            if (noteBTagToken(currentTagName))
-              return true;
-            currentTagNameBuffer = null;
-            currentTagName = null;
-          }
-          if (noteBTagToken(new StringBuilder().append(thisChar).toString()))
-            return true;
-        }
-        else if (isWhitespace(thisChar))
-        {
-          if (currentTagNameBuffer != null && currentTagNameBuffer.length() > 0)
-          {
-            currentTagName = currentTagNameBuffer.toString();
-            if (noteBTagToken(currentTagName))
-              return true;
-            currentTagNameBuffer = null;
-            currentTagName = null;
-          }
-        }
-        else
-        {
-          if (currentTagNameBuffer == null)
-            currentTagNameBuffer = newBuffer();
-          currentTagNameBuffer.append(thisChar);
-        }
-      }
-      break;
-  
-    case TAGPARSESTATE_IN_CDATA_BODY:
-      if (thisChar == ']')
-        currentState = TAGPARSESTATE_SAWRIGHTBRACKET;
-      else
-      {
-        if (noteEscapedCharacter(thisChar))
-          return true;
-      }
-      break;
-
-    case TAGPARSESTATE_SAWRIGHTBRACKET:
-      if (thisChar == ']')
-        currentState = TAGPARSESTATE_SAWSECONDRIGHTBRACKET;
-      else
-      {
-        currentState = TAGPARSESTATE_IN_CDATA_BODY;
-        if (noteEscapedCharacter(']'))
-          return true;
-        if (noteEscapedCharacter(thisChar))
-          return true;
-      }
-      break;
-
-    case TAGPARSESTATE_SAWSECONDRIGHTBRACKET:
-      if (thisChar == '>')
-        currentState = TAGPARSESTATE_NORMAL;
-      else if (thisChar == ']')
-      {
-        // currentstate unchanged; emit the first bracket
-        if (noteEscapedCharacter(']'))
-          return true;
-      }
-      else
-      {
-        currentState = TAGPARSESTATE_IN_CDATA_BODY;
-        if (noteEscapedCharacter(']'))
-          return true;
-        if (noteEscapedCharacter(']'))
-          return true;
-        if (noteEscapedCharacter(thisChar))
-          return true;
-      }
-      break;
-      
-    case TAGPARSESTATE_SAWLEFTANGLE:
-      if (thisChar == '!')
-        currentState = TAGPARSESTATE_SAWEXCLAMATION;
-      else if (thisChar == '?')
-      {
-        currentState = TAGPARSESTATE_IN_QTAG_NAME;
-        currentTagNameBuffer = newBuffer();
-      }
-      else if (bTagDepth == 0 && thisChar == '/')
-      {
-        currentState = TAGPARSESTATE_IN_END_TAG_NAME;
-        currentTagNameBuffer = newBuffer();
-      }
-      else if (bTagDepth == 0)
-      {
-        if (isWhitespace(thisChar))
-        {
-          // Not a tag.
-          currentState = TAGPARSESTATE_NORMAL;
-          if (noteNormalCharacter('<'))
-            return true;
-          if (noteNormalCharacter(thisChar))
-            return true;
-        }
-        else
-        {
-          currentState = TAGPARSESTATE_IN_TAG_NAME;
-          currentTagNameBuffer = newBuffer();
-          currentTagNameBuffer.append(thisChar);
-        }
-      }
-      else
-      {
-        // in btag, saw left angle, nothing recognizable after - must be a token
-        if (noteBTagToken("<"))
-          return true;
-        if (!isWhitespace(thisChar))
-        {
-          // Add char to current token buffer.
-          currentTagNameBuffer = newBuffer();
-          currentTagNameBuffer.append(thisChar);
-        }
-        currentState = TAGPARSESTATE_NORMAL;
-      }
-      break;
-
-    case TAGPARSESTATE_SAWEXCLAMATION:
-      if (thisChar == '-')
-        currentState = TAGPARSESTATE_SAWDASH;
-      else if (thisChar == '[')
-      {
-        currentState = TAGPARSESTATE_IN_BRACKET_TOKEN;
-        currentTagNameBuffer = newBuffer();
-      }
-      else
-      {
-        bTagDepth++;
-        currentState = TAGPARSESTATE_IN_BANG_TOKEN;
-        currentTagNameBuffer = newBuffer();
-        if (!isWhitespace(thisChar))
-          currentTagNameBuffer.append(thisChar);
-      }
-      break;
-
-    case TAGPARSESTATE_SAWDASH:
-      if (thisChar == '-')
-        currentState = TAGPARSESTATE_IN_COMMENT;
-      else
-        currentState = TAGPARSESTATE_NORMAL;
-      break;
-
-    case TAGPARSESTATE_IN_COMMENT:
-      // We're in a comment.  All we should look for is the end of the comment.
-      if (thisChar == '-')
-        currentState = TAGPARSESTATE_SAWCOMMENTDASH;
-      break;
-
-    case TAGPARSESTATE_SAWCOMMENTDASH:
-      if (thisChar == '-')
-        currentState = TAGPARSESTATE_SAWSECONDCOMMENTDASH;
-      else
-        currentState = TAGPARSESTATE_IN_COMMENT;
-      break;
-
-    case TAGPARSESTATE_SAWSECONDCOMMENTDASH:
-      if (thisChar == '>')
-        currentState = TAGPARSESTATE_NORMAL;
-      else if (thisChar != '-')
-        currentState = TAGPARSESTATE_IN_COMMENT;
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_NAME:
-      if (isWhitespace(thisChar))
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          // Done with the tag name!
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentAttrList = new ArrayList<AttrNameValue>();
-          currentState = TAGPARSESTATE_IN_QTAG_ATTR_NAME;
-          currentAttrNameBuffer = newBuffer();
-        }
-      }
-      else if (thisChar == '?')
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentAttrList = new ArrayList<AttrNameValue>();
-          currentState = TAGPARSESTATE_IN_QTAG_SAW_QUESTION;
-          if (noteQTag(currentTagName,currentAttrList))
-            return true;
-        }
-        else
-        {
-          currentState = TAGPARSESTATE_NORMAL;
-          currentTagNameBuffer = null;
-        }
-      }
-      else if (thisChar == '>')
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentAttrList = new ArrayList<AttrNameValue>();
-        }
-        if (currentTagName != null)
-        {
-          if (noteQTag(currentTagName,currentAttrList))
-            return true;
-        }
-        currentState = TAGPARSESTATE_NORMAL;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-        currentTagNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_BRACKET_TOKEN:
-      if (isWhitespace(thisChar))
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          // Done with the bracket token!
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentState = TAGPARSESTATE_NEED_FINAL_BRACKET;
-        }
-      }
-      else if (thisChar == '[')
-      {
-        currentTagName = currentTagNameBuffer.toString();
-        currentTagNameBuffer = null;
-        currentState = TAGPARSESTATE_IN_CDATA_BODY;
-        if (noteEscaped(currentTagName))
-          return true;
-        currentTagName = null;
-      }
-      else
-        currentTagNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_NEED_FINAL_BRACKET:
-      if (thisChar == '[')
-      {
-        if (noteEscaped(currentTagName))
-          return true;
-        currentTagName = null;
-        currentState = TAGPARSESTATE_IN_CDATA_BODY;
-      }
-      break;
-
-    case TAGPARSESTATE_IN_BANG_TOKEN:
-      if (isWhitespace(thisChar))
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          // Done with bang token
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          if (noteBTag(currentTagName))
-            return true;
-          currentTagName = null;
-          currentState = TAGPARSESTATE_NORMAL;
-        }
-      }
-      else if (thisChar == '>')
-      {
-        // Also done, but signal end too.
-        currentTagName = currentTagNameBuffer.toString();
-        currentTagNameBuffer = null;
-        if (noteBTag(currentTagName))
-          return true;
-        currentTagName = null;
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteEndBTag())
-          return true;
-        bTagDepth--;
-      }
-      else
-        currentTagNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_TAG_NAME:
-      if (isWhitespace(thisChar))
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          // Done with the tag name!
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentAttrList = new ArrayList<AttrNameValue>();
-          currentState = TAGPARSESTATE_IN_ATTR_NAME;
-          currentAttrNameBuffer = newBuffer();
-        }
-      }
-      else if (thisChar == '/')
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentAttrList = new ArrayList<AttrNameValue>();
-          currentState = TAGPARSESTATE_IN_TAG_SAW_SLASH;
-          if (noteTag(currentTagName,currentAttrList))
-            return true;
-        }
-        else
-        {
-          currentState = TAGPARSESTATE_NORMAL;
-          currentTagNameBuffer = null;
-        }
-      }
-      else if (thisChar == '>')
-      {
-        if (currentTagNameBuffer.length() > 0)
-        {
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-          currentAttrList = new ArrayList<AttrNameValue>();
-        }
-        if (currentTagName != null)
-        {
-          if (noteTag(currentTagName,currentAttrList))
-            return true;
-        }
-        currentState = TAGPARSESTATE_NORMAL;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-        currentTagNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_ATTR_NAME:
-      if (isWhitespace(thisChar))
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          // Done with attr name!
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-          currentState = TAGPARSESTATE_IN_QTAG_ATTR_LOOKING_FOR_VALUE;
-        }
-      }
-      else if (thisChar == '=')
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-          currentState = TAGPARSESTATE_IN_QTAG_ATTR_VALUE;
-          currentValueBuffer = newBuffer();
-        }
-      }
-      else if (thisChar == '?')
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-        }
-        if (currentAttrName != null)
-        {
-          currentAttrList.add(new AttrNameValue(currentAttrName,""));
-          currentAttrName = null;
-        }
-        if (noteQTag(currentTagName,currentAttrList))
-          return true;
-        currentState = TAGPARSESTATE_IN_QTAG_SAW_QUESTION;
-      }
-      else if (thisChar == '>')
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-        }
-        if (currentAttrName != null)
-        {
-          currentAttrList.add(new AttrNameValue(currentAttrName,""));
-          currentAttrName = null;
-        }
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteQTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-        currentAttrNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_ATTR_NAME:
-      if (isWhitespace(thisChar))
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          // Done with attr name!
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-          currentState = TAGPARSESTATE_IN_ATTR_LOOKING_FOR_VALUE;
-        }
-      }
-      else if (thisChar == '=')
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-          currentState = TAGPARSESTATE_IN_ATTR_VALUE;
-          currentValueBuffer = newBuffer();
-        }
-      }
-      else if (thisChar == '/')
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-        }
-        if (currentAttrName != null)
-        {
-          currentAttrList.add(new AttrNameValue(currentAttrName,""));
-          currentAttrName = null;
-        }
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentState = TAGPARSESTATE_IN_TAG_SAW_SLASH;
-      }
-      else if (thisChar == '>')
-      {
-        if (currentAttrNameBuffer.length() > 0)
-        {
-          currentAttrName = currentAttrNameBuffer.toString();
-          currentAttrNameBuffer = null;
-        }
-        if (currentAttrName != null)
-        {
-          currentAttrList.add(new AttrNameValue(currentAttrName,""));
-          currentAttrName = null;
-        }
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-        currentAttrNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_ATTR_LOOKING_FOR_VALUE:
-      if (thisChar == '=')
-      {
-        currentState = TAGPARSESTATE_IN_QTAG_ATTR_VALUE;
-        currentValueBuffer = newBuffer();
-      }
-      else if (thisChar == '>')
-      {
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteQTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else if (thisChar == '?')
-      {
-        currentState = TAGPARSESTATE_IN_QTAG_SAW_QUESTION;
-        currentAttrList.add(new AttrNameValue(currentAttrName,""));
-        currentAttrName = null;
-        if (noteQTag(currentTagName,currentAttrList))
-          return true;
-      }
-      else if (!isWhitespace(thisChar))
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,""));
-        currentState = TAGPARSESTATE_IN_QTAG_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-        currentAttrNameBuffer.append(thisChar);
-        currentAttrName = null;
-      }
-      break;
-
-    case TAGPARSESTATE_IN_ATTR_LOOKING_FOR_VALUE:
-      if (thisChar == '=')
-      {
-        currentState = TAGPARSESTATE_IN_ATTR_VALUE;
-        currentValueBuffer = newBuffer();
-      }
-      else if (thisChar == '>')
-      {
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else if (thisChar == '/')
-      {
-        currentState = TAGPARSESTATE_IN_TAG_SAW_SLASH;
-        currentAttrList.add(new AttrNameValue(currentAttrName,""));
-        currentAttrName = null;
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-      }
-      else if (!isWhitespace(thisChar))
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,""));
-        currentState = TAGPARSESTATE_IN_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-        currentAttrNameBuffer.append(thisChar);
-        currentAttrName = null;
-      }
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_ATTR_VALUE:
-      if (thisChar == '\'')
-        currentState = TAGPARSESTATE_IN_QTAG_SINGLE_QUOTES_ATTR_VALUE;
-      else if (thisChar == '"')
-        currentState = TAGPARSESTATE_IN_QTAG_DOUBLE_QUOTES_ATTR_VALUE;
-      else if (!isWhitespace(thisChar))
-      {
-        currentState = TAGPARSESTATE_IN_QTAG_UNQUOTED_ATTR_VALUE;
-        currentValueBuffer.append(thisChar);
-      }
-      break;
-      
-    case TAGPARSESTATE_IN_ATTR_VALUE:
-      if (thisChar == '\'')
-        currentState = TAGPARSESTATE_IN_SINGLE_QUOTES_ATTR_VALUE;
-      else if (thisChar == '"')
-        currentState = TAGPARSESTATE_IN_DOUBLE_QUOTES_ATTR_VALUE;
-      else if (thisChar == '/')
-        currentState = TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE_SAW_SLASH;
-      else if (!isWhitespace(thisChar))
-      {
-        currentState = TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE;
-        currentValueBuffer.append(thisChar);
-      }
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_SAW_QUESTION:
-      if (thisChar == '>')
-      {
-        // No end-tag notification for this one
-        currentState = TAGPARSESTATE_NORMAL;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      break;
-
-    case TAGPARSESTATE_IN_TAG_SAW_SLASH:
-      if (thisChar == '>')
-      {
-        if (noteEndTag(currentTagName))
-          return true;
-        currentState = TAGPARSESTATE_NORMAL;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      break;
-
-    case TAGPARSESTATE_IN_END_TAG_NAME:
-      if (isWhitespace(thisChar))
-      {
-        if (currentTagNameBuffer != null && currentTagNameBuffer.length() > 0)
-        {
-          // Done with the tag name!
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-        }
-      }
-      else if (thisChar == '>')
-      {
-        if (currentTagNameBuffer != null && currentTagNameBuffer.length() > 0)
-        {
-          currentTagName = currentTagNameBuffer.toString();
-          currentTagNameBuffer = null;
-        }
-        if (currentTagName != null)
-        {
-          if (noteEndTag(currentTagName))
-            return true;
-        }
-        currentTagName = null;
-        currentState = TAGPARSESTATE_NORMAL;
-      }
-      else if (currentTagNameBuffer != null)
-        currentTagNameBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_SINGLE_QUOTES_ATTR_VALUE:
-      if (thisChar == '\'' || thisChar == '\n' || thisChar == '\r')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_QTAG_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else
-        currentValueBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_SINGLE_QUOTES_ATTR_VALUE:
-      if (thisChar == '\'' || thisChar == '\n' || thisChar == '\r')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else
-        currentValueBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_DOUBLE_QUOTES_ATTR_VALUE:
-      if (thisChar == '"' || thisChar == '\n' || thisChar == '\r')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_QTAG_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else
-        currentValueBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_DOUBLE_QUOTES_ATTR_VALUE:
-      if (thisChar == '"' || thisChar == '\n' || thisChar == '\r')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else
-        currentValueBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_QTAG_UNQUOTED_ATTR_VALUE:
-      if (isWhitespace(thisChar))
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_QTAG_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else if (thisChar == '?')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentState = TAGPARSESTATE_IN_QTAG_SAW_QUESTION;
-      }
-      else if (thisChar == '>')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-        currentValueBuffer.append(thisChar);
-      break;
-
-    case TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE_SAW_SLASH:
-      if (isWhitespace(thisChar))
-      {
-        currentValueBuffer.append('/');
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else if (thisChar == '/')
-      {
-        currentValueBuffer.append('/');
-      }
-      else if (thisChar == '>')
-      {
-        currentValueBuffer.append('/');
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-      {
-        currentValueBuffer.append('/');
-        currentValueBuffer.append(thisChar);
-        currentState = TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE;
-      }
-      break;
-
-    case TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE:
-      if (isWhitespace(thisChar))
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_IN_ATTR_NAME;
-        currentAttrNameBuffer = newBuffer();
-      }
-      else if (thisChar == '/')
-      {
-        currentState = TAGPARSESTATE_IN_UNQUOTED_ATTR_VALUE_SAW_SLASH;
-      }
-      else if (thisChar == '>')
-      {
-        currentAttrList.add(new AttrNameValue(currentAttrName,attributeDecode(currentValueBuffer.toString())));
-        currentAttrName = null;
-        currentValueBuffer = null;
-        currentState = TAGPARSESTATE_NORMAL;
-        if (noteTag(currentTagName,currentAttrList))
-          return true;
-        currentTagName = null;
-        currentAttrList = null;
-      }
-      else
-        currentValueBuffer.append(thisChar);
-      break;
-
-    default:
-      throw new ManifoldCFException("Invalid state: "+Integer.toString(currentState));
-    }
-    return false;
-  }
-
-  /** Allocate the buffer.
-  */
-  protected StringBuilder newBuffer()
-  {
-    accumBuffer.setLength(0);
-    return accumBuffer;
-  }
-  
-  /** Interpret ampersand buffer.
-  */
-  protected boolean outputAmpBuffer()
-    throws ManifoldCFException
-  {
-    if (ampBuffer.length() == 0 || (ampBuffer.length() == 1 && ampBuffer.charAt(0) == ';'))
-    {
-      // Length is zero; probably a mistake, so just output the whole thing
-      if (noteNormalCharacter('&'))
-        return true;
-      if (dumpValues(ampBuffer.toString()))
-        return true;
-      return false;
-    }
-    else
-    {
-      // Is it a known entity?
-      String entity = ampBuffer.toString();
-      if (entity.endsWith(";"))
-        entity = entity.substring(0,entity.length()-1);
-      String replacement = mapChunk(entity);
-      if (replacement != null)
-      {
-        if (dumpValues(replacement))
-          return true;
-      }
-      return false;
-    }
-  }
-  
-  protected boolean dumpValues(String value)
-    throws ManifoldCFException
-  {
-    for (int i = 0; i < value.length(); i++)
-    {
-      if (noteNormalCharacter(value.charAt(i)))
-        return true;
-    }
-    return false;
-  }
-  
-  /** This method gets called for every tag.  Override this method to intercept tag begins.
-  *@return true to halt further processing.
-  */
-  protected boolean noteTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw tag '"+tagName+"'");
-    return false;
-  }
-
-  /** This method gets called for every end tag.  Override this method to intercept tag ends.
-  *@return true to halt further processing.
-  */
-  protected boolean noteEndTag(String tagName)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw end tag '"+tagName+"'");
-    return false;
-  }
-
-  /** This method is called for every <? ... ?> construct, or 'qtag'.
-  * Override it to intercept such constructs.
-  *@return true to halt further processing.
-  */
-  protected boolean noteQTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw QTag '"+tagName+"'");
-    return false;
-  }
-  
-  /** This method is called for every <! <token> ... > construct, or 'btag'.
-  * Override it to intercept these.
-  *@return true to halt further processing.
-  */
-  protected boolean noteBTag(String tagName)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw BTag '"+tagName+"'");
-    return false;
-  }
-  
-  /** This method is called for the end of every btag, or any time
-  * there's a naked '>' in the document.  Override it if you want to intercept these.
-  *@return true to halt further processing.
-  */
-  protected boolean noteEndBTag()
-    throws ManifoldCFException
-  {
-    Logging.misc.debug(" Saw end BTag");
-    return false;
-  }
-  
-  /** Called for the start of every cdata-like tag, e.g. <![ <token> [ ... ]]>
-  *@param token may be empty!!!
-  *@return true to halt further processing.
-  */
-  protected boolean noteEscaped(String token)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw escaped block '"+token+"'");
-    return false;
-  }
-  
-  /** Called for the end of every cdata-like tag.
-  *@return true to halt further processing.
-  */
-  protected boolean noteEndEscaped()
-    throws ManifoldCFException
-  {
-    Logging.misc.debug(" Saw end of escaped block");
-    return false;
-  }
-  
-  /** This method gets called for every token inside a btag.
-  *@return true to halt further processing.
-  */
-  protected boolean noteBTagToken(String token)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-  
-  /** This method gets called for every character that is not part of a tag etc.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  protected boolean noteNormalCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-  /** This method gets called for every character that is found within an
-  * escape block, e.g. CDATA.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  protected boolean noteEscapedCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-  
-  /** Decode an html attribute */
-  protected static String attributeDecode(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '&')
-      {
-        int index = input.indexOf(";",i);
-        if (index != -1)
-        {
-          String chunk = input.substring(i,index);
-          String replacement = mapChunk(chunk);
-          if (replacement != null)
-          {
-            output.append(replacement);
-            i = index + 1;
-            continue;
-          }
-        }
-      }
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  /** Map an entity reference back to a character */
-  protected static String mapChunk(String input)
-  {
-    if (input.startsWith("#"))
-    {
-      // Treat as a decimal value
-      try
-      {
-        input = input.substring(1);
-        int value;
-        if (input.startsWith("x"))
-        {
-          // Hex
-          value = Integer.decode("0"+input);
-        }
-        else
-        {
-          // Decimal
-          value = Integer.parseInt(input);
-        }
-        StringBuilder sb = new StringBuilder();
-        sb.append((char)value);
-        return sb.toString();
-      }
-      catch (NumberFormatException e)
-      {
-        return null;
-      }
-    }
-    else
-      return mapLookup.get(input);
-  }
-
-  /** Is a character markup language whitespace? */
-  protected static boolean isWhitespace(char x)
-  {
-    return x <= ' ';
-  }
-
-  /** Is a character markup language punctuation? */
-  protected static boolean isPunctuation(char x)
-  {
-    return x == '%' || x == '|' || x == '&' || x == '!' || x == '^' || x == ',' || x == ';' || x == '[' || x == ']' ||
-      x == '(' || x == ')' || x == ':' || x == '/' || x == '\\' || x == '+' || x == '=';
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLEncodingDetector.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLEncodingDetector.java
deleted file mode 100644
index bc02fee..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLEncodingDetector.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.io.*;
-
-/** This is the XML encoding detector.
-* It is basically looking for the preamble's <?xml ... ?> tag, which it parses
-* looking for the "encoding" attribute.  It stops either when it is beyond
-* any possibility of finding the preamble, or it finds the tag, whichever comes first.
-*/
-public class XMLEncodingDetector extends XMLParseState implements EncodingDetector
-{
-  
-  protected String encoding = null;
-  
-  /** Constructor.
-  */
-  public XMLEncodingDetector()
-  {
-  }
-  
-  /** Set initial encoding.
-  */
-  @Override
-  public void setEncoding(String encoding)
-  {
-    this.encoding = encoding;
-  }
-
-  /** Retrieve final encoding determination.
-  */
-  @Override
-  public String getEncoding()
-  {
-    return encoding;
-  }
-
-  /** Map version of the noteTag method.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    // Terminate immediately.
-    return true;
-  }
-  
-  /** This method gets called for every end tag.  Override this method to intercept tag ends.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEndTag(String tagName)
-    throws ManifoldCFException
-  {
-    return true;
-  }
-
-  /** Map version of noteQTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteQTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (tagName.equals("xml"))
-    {
-      // Look for "encoding" attribute
-      String value = attributes.get("encoding");
-      if (value != null)
-        encoding = value;
-    }
-    // Either way, stop now.
-    return true;
-  }
-
-  /** This method is called for every <! <token> ... > construct, or 'btag'.
-  * Override it to intercept these.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteBTag(String tagName)
-    throws ManifoldCFException
-  {
-    return true;
-  }
-
-  /** This method is called for the end of every btag, or any time
-  * there's a naked '>' in the document.  Override it if you want to intercept these.
-  *@return true to halt further processing.
-  */
-  protected boolean noteEndBTag()
-    throws ManifoldCFException
-  {
-    return true;
-  }
-  
-  /** Called for the start of every cdata-like tag, e.g. <![ <token> [ ... ]]>
-  *@param token may be empty!!!
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEscaped(String token)
-    throws ManifoldCFException
-  {
-    return true;
-  }
-
-  /** Called for the end of every cdata-like tag.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEndEscaped()
-    throws ManifoldCFException
-  {
-    return true;
-  }
-
-  /** This method gets called for every token inside a btag.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteBTagToken(String token)
-    throws ManifoldCFException
-  {
-    return true;
-  }
-  
-  /** This method gets called for every character that is not part of a tag etc.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteNormalCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    return true;
-  }
-
-  /** This method gets called for every character that is found within an
-  * escape block, e.g. CDATA.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEscapedCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    return true;
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFileParsingContext.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFileParsingContext.java
deleted file mode 100644
index 0e8d5c6..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFileParsingContext.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** An instance of this class represents a parsing context within a node.  Data is written to the supplied file in utf-8 format.
-*/
-public class XMLFileParsingContext extends XMLOutputStreamParsingContext
-{
-  /** The output file */
-  protected File outputFile;
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLFileParsingContext(XMLFuzzyHierarchicalParseState theStream, String namespace, String localname, String qname, Map<String,String> theseAttributes, File f)
-    throws ManifoldCFException, FileNotFoundException
-  {
-    // Construct an appropriate writer
-    super(theStream,namespace,localname,qname,theseAttributes,new FileOutputStream(f));
-    // Save the file
-    outputFile = f;
-  }
-
-  /** Get file object, flushing it, closing it, and clearing it.  (This prevents the file from being deleted during cleanup of this context.) */
-  public File getCompletedFile()
-    throws ManifoldCFException
-  {
-    flush();
-    close();
-    File rval = outputFile;
-    outputFile = null;
-    return rval;
-  }
-
-  /** Cleanup whatever is left over */
-  public void tagCleanup()
-    throws ManifoldCFException
-  {
-    if (outputFile != null)
-    {
-      close();
-      outputFile.delete();
-      outputFile = null;
-    }
-  }
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFuzzyHierarchicalParseState.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFuzzyHierarchicalParseState.java
deleted file mode 100644
index f118772..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFuzzyHierarchicalParseState.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** Class to keep track of XML hierarchy in the face of possibly corrupt
-* XML and with case-insensitive tags, etc.
-* Basically, this class accepts what is supposedly XML but allows for various
-* kinds of handwritten corruption.  Specific kinds of errors allowed include:
-*
-* - Bad character encoding
-* - Tag case match problems; all attributes are (optionally) bashed to lower case,
-*    and tag names are checked to match when all lower case, if case-sensitive didn't
-*    work
-* - End tag matching problems, where someone lost an end tag somehow
-* - Other parsing recoveries to be added as they arise
-*
-* The functionality of this class is also somewhat lessened vs. standard
-* SAX-type parsers.  No namespace interpretation is done, for instance; tag qnames
-* are split into namespace name and local name, and that's all folks.  But if you need
-* more power, you can write a class extension that will do that readily.
-*/
-public class XMLFuzzyHierarchicalParseState extends XMLFuzzyParseState
-{
-  /** The current context */
-  protected XMLParsingContext currentContext = null;
-  /** The current value buffer */
-  protected StringBuilder characterBuffer = new StringBuilder();
-  /** Whether we're capturing escaped characters */
-  protected boolean captureEscaped = false;
-  
-  /** This is the maximum size of a chunk of characters getting sent to the characters() method.
-  */
-  protected final static int MAX_CHUNK_SIZE = 4096;
-  
-  /** Constructor with default properties.
-  */
-  public XMLFuzzyHierarchicalParseState()
-  {
-    this(true,true,true,true,true,true);
-  }
-  
-  /** Constructor.
-  */
-  public XMLFuzzyHierarchicalParseState(boolean lowerCaseAttributes, boolean lowerCaseTags,
-    boolean lowerCaseQAttributes, boolean lowerCaseQTags,
-    boolean lowerCaseBTags, boolean lowerCaseEscapeTags)
-  {
-    super(lowerCaseAttributes,lowerCaseTags,lowerCaseQAttributes,lowerCaseQTags,lowerCaseBTags,lowerCaseEscapeTags);
-  }
-  
-  public void setContext(XMLParsingContext context)
-  {
-    currentContext = context;
-  }
-
-  public XMLParsingContext getContext()
-  {
-    return currentContext;
-  }
-
-  /** Call this method to clean up completely after a parse attempt, whether successful or failure. */
-  public void cleanup()
-    throws ManifoldCFException
-  {
-    // This sets currentContext == null as a side effect, unless an error occurs during cleanup!!
-    if (currentContext != null)
-    {
-      currentContext.cleanup();
-      currentContext = null;
-    }
-  }
-
-  /** Map version of the noteTag method.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteTagEx(String tagName, String nameSpace, String localName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    flushCharacterBuffer();
-    if (currentContext != null)
-      currentContext.startElement(nameSpace,localName,tagName,attributes);
-    return false;
-  }
-
-  /** Note end tag.
-  */
-  @Override
-  protected boolean noteEndTagEx(String tagName, String nameSpace, String localName)
-    throws ManifoldCFException
-  {
-    flushCharacterBuffer();
-    if (currentContext != null)
-      currentContext.endElement(nameSpace,localName,tagName);
-    return false;
-  }
-
-  /** This method gets called for every character that is not part of a tag etc.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteNormalCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    appendToCharacterBuffer(thisChar);
-    return false;
-  }
-  
-  protected void appendToCharacterBuffer(char thisChar)
-    throws ManifoldCFException
-  {
-    characterBuffer.append(thisChar);
-    if (characterBuffer.length() >= MAX_CHUNK_SIZE)
-      flushCharacterBuffer();
-  }
-
-  protected void flushCharacterBuffer()
-    throws ManifoldCFException
-  {
-    if (characterBuffer.length() > 0)
-    {
-      if (currentContext != null)
-        currentContext.characters(characterBuffer.toString());
-      characterBuffer.setLength(0);
-    }
-  }
-  
-  /** New version of the noteEscapedTag method.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEscapedEx(String token)
-    throws ManifoldCFException
-  {
-    if (token.toLowerCase(Locale.ROOT).equals("cdata"))
-      captureEscaped = true;
-    return false;
-  }
-  
-  /** This method gets called for every character that is found within an
-  * escape block, e.g. CDATA.
-  * Override this method to intercept such characters.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEscapedCharacter(char thisChar)
-    throws ManifoldCFException
-  {
-    if (captureEscaped)
-      appendToCharacterBuffer(thisChar);
-    return false;
-  }
-
-  /** Called for the end of every cdata-like tag.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected boolean noteEndEscaped()
-    throws ManifoldCFException
-  {
-    captureEscaped = false;
-    return false;
-  }
-  
-  /** Called at the end of everything.
-  */
-  @Override
-  public void finishUp()
-    throws ManifoldCFException
-  {
-    flushCharacterBuffer();
-    super.finishUp();
-  }
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFuzzyParseState.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFuzzyParseState.java
deleted file mode 100644
index 682762b..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLFuzzyParseState.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-
-import java.util.*;
-import java.io.*;
-
-/** Class to keep track of XML hierarchy in the face of possibly corrupt
-* XML and with case-insensitive tags, etc.
-* Basically, this class accepts what is supposedly XML but allows for various
-* kinds of handwritten corruption.  Specific kinds of errors allowed include:
-*
-* - Bad character encoding
-* - Tag case match problems; all attributes are (optionally) bashed to lower case
-* - Other parsing recoveries to be added as they arise
-*
-* The functionality of this class is also somewhat lessened vs. standard
-* SAX-type parsers.  No namespace interpretation is done, for instance; tag qnames
-* are split into namespace name and local name, and that's all folks.  But if you need
-* more power, you can write a class extension that will do that readily.
-*/
-public class XMLFuzzyParseState extends TagParseState
-{
-  protected final boolean lowerCaseAttributes;
-  protected final boolean lowerCaseTags;
-  protected final boolean lowerCaseQAttributes;
-  protected final boolean lowerCaseQTags;
-  protected final boolean lowerCaseBTags;
-  protected final boolean lowerCaseEscapeTags;
-
-  /** Constructor.
-  */
-  public XMLFuzzyParseState(boolean lowerCaseAttributes, boolean lowerCaseTags,
-    boolean lowerCaseQAttributes, boolean lowerCaseQTags,
-    boolean lowerCaseBTags, boolean lowerCaseEscapeTags)
-  {
-    this.lowerCaseAttributes = lowerCaseAttributes;
-    this.lowerCaseTags = lowerCaseTags;
-    this.lowerCaseQAttributes = lowerCaseQAttributes;
-    this.lowerCaseQTags = lowerCaseQTags;
-    this.lowerCaseBTags = lowerCaseBTags;
-    this.lowerCaseEscapeTags = lowerCaseEscapeTags;
-  }
-  
-  /** This method gets called for every tag.  Override this method to intercept tag begins.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    Map<String,String> attrMap = new HashMap<String,String>(attributes.size());
-    for (AttrNameValue nv : attributes)
-    {
-      String name = nv.getName();
-      if (lowerCaseAttributes)
-        name = nv.getName().toLowerCase(Locale.ROOT);
-      attrMap.put(name, nv.getValue());
-    }
-    if (lowerCaseTags)
-      tagName = tagName.toLowerCase(Locale.ROOT);
-    int index = tagName.indexOf(":");
-    String nameSpace;
-    String localName;
-    if (index == -1)
-    {
-      localName = tagName;
-      nameSpace = null;
-    }
-    else
-    {
-      localName = tagName.substring(index+1);
-      nameSpace = tagName.substring(0,index);
-    }
-    return noteTagEx(tagName, nameSpace, localName, attrMap);
-  }
-
-  /** Map version of the noteTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteTagEx(String tagName, String nameSpace, String localName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw tag '"+tagName+"'");
-    return false;
-  }
-
-  /** This method gets called for every end tag.  Override this method to intercept tag ends.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEndTag(String tagName)
-    throws ManifoldCFException
-  {
-    if (lowerCaseTags)
-      tagName = tagName.toLowerCase(Locale.ROOT);
-    int index = tagName.indexOf(":");
-    String nameSpace;
-    String localName;
-    if (index == -1)
-    {
-      localName = tagName;
-      nameSpace = null;
-    }
-    else
-    {
-      localName = tagName.substring(index+1);
-      nameSpace = tagName.substring(0,index);
-    }
-
-    return noteEndTagEx(tagName, nameSpace, localName);
-  }
-
-  /** Note end tag.
-  */
-  protected boolean noteEndTagEx(String tagName, String nameSpace, String localName)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw end tag '"+tagName+"'");
-    return false;
-  }
-  
-  /** This method is called for every <? ... ?> construct, or 'qtag'.
-  * This is not useful for HTML.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteQTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    Map<String,String> attrMap = new HashMap<String,String>(attributes.size());
-    for (AttrNameValue nv : attributes)
-    {
-      String name = nv.getName();
-      if (lowerCaseQAttributes)
-        name = nv.getName().toLowerCase(Locale.ROOT);
-      attrMap.put(name, nv.getValue());
-    }
-    if (lowerCaseQTags)
-      tagName = tagName.toLowerCase(Locale.ROOT);
-    return noteQTagEx(tagName, attrMap);
-  }
-
-  /** Map version of the noteQTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteQTagEx(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw QTag '"+tagName+"'");
-    return false;
-  }
-
-  /** This method is called for every <! <token> ... > construct, or 'btag'.
-  * Override it to intercept these.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteBTag(String tagName)
-    throws ManifoldCFException
-  {
-    if (lowerCaseBTags)
-      tagName = tagName.toLowerCase(Locale.ROOT);
-    return noteBTagEx(tagName);
-  }
-
-  /** New version of the noteBTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteBTagEx(String tagName)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw BTag '"+tagName+"'");
-    return false;
-  }
-
-  /** Called for the start of every cdata-like tag, e.g. <![ <token> [ ... ]]>
-  *@param token may be empty!!!
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteEscaped(String token)
-    throws ManifoldCFException
-  {
-    if (lowerCaseEscapeTags && token != null)
-      token = token.toLowerCase(Locale.ROOT);
-    return noteEscapedEx(token);
-  }
-
-  /** New version of the noteEscapedTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteEscapedEx(String token)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw Escaped '"+token+"'");
-    return false;
-  }
-
-  /** This method gets called for every token inside a btag.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteBTagToken(String token)
-    throws ManifoldCFException
-  {
-    if (lowerCaseBTags)
-      token = token.toLowerCase(Locale.ROOT);
-    return noteBTagTokenEx(token);
-  }
-
-  /** New version of the noteBTagToken method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteBTagTokenEx(String token)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw BTag token '"+token+"'");
-    return false;
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLOutputStreamParsingContext.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLOutputStreamParsingContext.java
deleted file mode 100644
index e02cb75..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLOutputStreamParsingContext.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-/** An instance of this class represents a parsing context within a node.  Data is written to the supplied output stream in utf-8 format.
-*/
-public class XMLOutputStreamParsingContext extends XMLWriterParsingContext
-{
-  /** The writer */
-  protected OutputStream outputStream;
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLOutputStreamParsingContext(XMLFuzzyHierarchicalParseState theStream, String namespace, String localname, String qname, Map<String,String> theseAttributes, OutputStream os)
-    throws ManifoldCFException
-  {
-    // Construct an appropriate writer
-    super(theStream,namespace,localname,qname,theseAttributes,new OutputStreamWriter(os, StandardCharsets.UTF_8));
-    // Save the stream
-    outputStream = os;
-  }
-
-  /** Flush the data to the underlying output stream */
-  public void flush()
-    throws ManifoldCFException
-  {
-    try
-    {
-      if (outputStream != null)
-      {
-        // Do the base class first - this flushes the Writer
-        super.flush();
-        outputStream.flush();
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Close the underlying stream. */
-  public void close()
-    throws ManifoldCFException
-  {
-    // Now, close.
-    try
-    {
-      if (outputStream != null)
-      {
-        outputStream.close();
-        outputStream = null;
-      }
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLParseState.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLParseState.java
deleted file mode 100644
index 85f20dc..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLParseState.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-
-import java.util.*;
-import java.io.*;
-
-/** This class takes the output of the basic tag parser and converts it for
-* typical XML usage.  It takes the attribute lists, for instance, and converts
-* them to case-sensitive maps.
-*/
-public class XMLParseState extends TagParseState
-{
-  
-  /** Constructor.
-  */
-  public XMLParseState()
-  {
-  }
-  
-  /** This method gets called for every tag.  Override this method to intercept tag begins.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    Map<String,String> attrMap = new HashMap<String,String>(attributes.size());
-    for (AttrNameValue nv : attributes)
-    {
-      attrMap.put(nv.getName(), nv.getValue());
-    }
-    return noteTag(tagName, attrMap);
-  }
-
-  /** Map version of the noteTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw tag '"+tagName+"'");
-    return false;
-  }
-
-  /** This method is called for every <? ... ?> construct, or 'qtag'.
-  * Override it to intercept such constructs.
-  *@return true to halt further processing.
-  */
-  @Override
-  protected final boolean noteQTag(String tagName, List<AttrNameValue> attributes)
-    throws ManifoldCFException
-  {
-    Map<String,String> attrMap = new HashMap<String,String>(attributes.size());
-    for (AttrNameValue nv : attributes)
-    {
-      attrMap.put(nv.getName(), nv.getValue());
-    }
-    return noteQTag(tagName, attrMap);
-  }
-  
-  /** Map version of noteQTag method.
-  *@return true to halt further processing.
-  */
-  protected boolean noteQTag(String tagName, Map<String,String> attributes)
-    throws ManifoldCFException
-  {
-    if (Logging.misc.isDebugEnabled())
-      Logging.misc.debug(" Saw QTag '"+tagName+"'");
-    return false;
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLParsingContext.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLParsingContext.java
deleted file mode 100644
index fbc8ed2..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLParsingContext.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** An instance of this class represents a parsing context within a node.  Parsing functionality is implemented
-* by extending this class to do the right thing for the context in which it is deployed.  The base functionality
-* "does nothing"; extended functionality is needed to interpret nodes and act upon them.
-*/
-public class XMLParsingContext
-{
-  /** The stream we belong to */
-  protected final XMLFuzzyHierarchicalParseState theStream;
-  /** The previous context */
-  protected final XMLParsingContext previousContext;
-  /** The attributes belonging to the node associated with this context */
-  protected final Map<String,String> theseAttributes;
-  /** The namespace associated with the context */
-  protected final String namespace;
-  /** The localname associated with the context */
-  protected final String localname;
-  /** The qname associated with the context */
-  protected final String qname;
-
-  /** Root constructor.  Used for outer document level. */
-  public XMLParsingContext(XMLFuzzyHierarchicalParseState theStream)
-  {
-    this(theStream,null,null,null,null);
-  }
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLParsingContext(XMLFuzzyHierarchicalParseState theStream, String namespace, String localname, String qname, Map<String,String> theseAttributes)
-  {
-    this.theStream = theStream;
-    this.previousContext = theStream.getContext();
-    this.namespace = namespace;
-    this.localname = localname;
-    this.qname = qname;
-    this.theseAttributes = theseAttributes;
-  }
-
-  /** Get an attribute's value, if any */
-  public String getAttribute(String attributeName)
-  {
-    if (theseAttributes != null)
-      return theseAttributes.get(attributeName);
-    else
-      return null;
-  }
-
-  /** Get the namespace name of this node */
-  public String getNamespace()
-  {
-    return namespace;
-  }
-
-  /** Get the localname of this node */
-  public String getLocalname()
-  {
-    return localname;
-  }
-
-  /** Get the qname of this node */
-  public String getQname()
-  {
-    return qname;
-  }
-
-  /** Handle the start of a tag */
-  public final void startElement(String namespace, String localName, String qName, Map<String,String> atts)
-    throws ManifoldCFException
-  {
-    // For every child tag, we must create a new context.  We call a stub method to do that here; the stub method is meant
-    // to be overridden to provide the proper non-default context, where desired.
-    XMLParsingContext newContext = beginTag(namespace, localName, qName, atts);
-    if (newContext == null)
-      newContext = new XMLParsingContext(theStream,namespace,localName,qName,atts);
-    // We need to establish the new context in the stack of the owning XMLStream object
-    theStream.setContext(newContext);
-  }
-
-  /** Handle the end of a tag */
-  public final void endElement(String namespace, String localName, String qName)
-    throws ManifoldCFException
-  {
-    // When a child tag ends, pop back to the previous context.  That will allow the current one to go away.  But first, call
-    // a stub method that can be overridden to perform activities.
-    // Signal the end of the tag.  This goes last, because we have to do things in the reverse order from the
-    // way the context got pushed to make sense.
-    if (previousContext != null)
-      previousContext.endTag();
-    // Before we leave the child context, clean up the child tag itself, but not the whole chain
-    theStream.getContext().tagCleanup();
-    // Go back to the parent context
-    theStream.setContext(previousContext);
-  }
-
-  /** Handle content of a tag */
-  public final void characters(String contents)
-    throws ManifoldCFException
-  {
-    // Call the overridden method with the right context object
-    tagContents(contents);
-  }
-
-  /** Cleanup this context object, and then recurse up the chain.
-  * This method is called without fail at the end of any parse, whether it errored out or not, so that proper cleanup always happens for any tags left on the stack.
-  */
-  public final void cleanup()
-    throws ManifoldCFException
-  {
-    tagCleanup();
-    theStream.setContext(previousContext);
-  }
-
-  /** This method is meant to be extended by classes that extend this class.  The form of this method is meant to enable creation of a
-  * context object derived from XMLContext that understands how to actually handle tags and content within the current context. */
-  protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-    throws ManifoldCFException
-  {
-    // The default action is to establish a new default context.
-    return null;
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  protected void endTag()
-    throws ManifoldCFException
-  {
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  protected void tagContents(String contents)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Override this method to be called during cleanup */
-  protected void tagCleanup()
-    throws ManifoldCFException
-  {
-  }
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLStringParsingContext.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLStringParsingContext.java
deleted file mode 100644
index 6cf4985..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLStringParsingContext.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** An instance of this class represents a parsing context within a node, where the data value is to be recorded as an in-memory string.  The data string is
-* available as a local StringBuilder object, which will be accessible to any class that extends this one.
-*/
-public class XMLStringParsingContext extends XMLParsingContext
-{
-  /** The string buffer */
-  protected StringBuilder value = new StringBuilder();
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLStringParsingContext(XMLFuzzyHierarchicalParseState theStream, String namespace, String localname, String qname, Map<String,String> theseAttributes)
-  {
-    super(theStream,namespace,localname,qname,theseAttributes);
-  }
-
-  /** Get the string value */
-  public String getValue()
-  {
-    return value.toString();
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  @Override
-  protected void tagContents(String value)
-    throws ManifoldCFException
-  {
-    // Append the characters to the buffer
-    this.value.append(value);
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLWriterParsingContext.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLWriterParsingContext.java
deleted file mode 100644
index f66f2f2..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/fuzzyml/XMLWriterParsingContext.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** An instance of this class represents a parsing context within a node.  Data is written to the supplied writer.
-*/
-public class XMLWriterParsingContext extends XMLParsingContext
-{
-  /** The writer */
-  protected Writer theWriter;
-
-  /** Full constructor.  Used for individual tags. */
-  public XMLWriterParsingContext(XMLFuzzyHierarchicalParseState theStream, String namespace, String localname, String qname, Map<String,String> theseAttributes, Writer writer)
-    throws ManifoldCFException
-  {
-    super(theStream,namespace,localname,qname,theseAttributes);
-    theWriter = writer;
-  }
-
-  /** Flush the data to the underlying output stream */
-  public void flush()
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Flush the data to the underlying output stream
-      theWriter.flush();
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** This method is meant to be extended by classes that extend this class */
-  @Override
-  protected void tagContents(String body)
-    throws ManifoldCFException
-  {
-    try
-    {
-      escapeCharData(body,theWriter);
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Start a child tag.
-  * The XMLWriterContext accepts all subtags in their text form.
-  */
-  @Override
-  protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-    throws ManifoldCFException
-  {
-    // First, write out the tag text.  We strip off the namespace.
-    try
-    {
-      theWriter.write("<"+localName);
-      for (String attName : atts.keySet())
-      {
-        String attValue = atts.get(attName);
-        theWriter.write(" ");
-        theWriter.write(attName);
-        theWriter.write("=\"");
-        theWriter.write(escapeAttribute(attValue));
-        theWriter.write("\"");
-      }
-      theWriter.write(">");
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-    // Now, start a new context which is also a writer context.
-    super.beginTag(namespace,localName,qName,atts);
-    return new XMLWriterParsingContext(theStream,namespace,localName,qName,atts,theWriter);
-  }
-
-  /** End a child tag.
-  * The XMLWriterContext accepts all subtags in their text form.
-  */
-  @Override
-  protected void endTag()
-    throws ManifoldCFException
-  {
-    // First, write out the tag text.  We strip off the namespace.
-    try
-    {
-      XMLParsingContext context = theStream.getContext();
-      String tagName = context.getLocalname();
-
-      theWriter.write("</"+tagName+">");
-    }
-    catch (java.net.SocketTimeoutException e)
-    {
-      throw new ManifoldCFException("Socket timeout exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-    super.endTag();
-  }
-
-  /** Convert a string to a value that's safe to include inside an attribute value */
-  protected static String escapeAttribute(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\'' || x == '"' || x == '<' || x == '>' || x == '&'|| (x < ' ' && x >= 0))
-      {
-        rval.append("&#").append(Integer.toString((int)x)).append(";");
-      }
-      else
-        rval.append(x);
-    }
-    return rval.toString();
-  }
-  
-  /** Escapes sequence of characters to output writer */
-  protected static void escapeCharData(String body, Writer out) throws IOException
-  {
-    for (int i=0; i<body.length(); i++) {
-      char x = body.charAt(i);
-      if (x == '<' || x == '>' || x == '&'|| (x < ' ' && x >= 0))
-      {
-        StringBuilder rval = new StringBuilder();
-        rval.append("&#").append(Integer.toString((int)x)).append(";");
-        out.write(rval.toString());
-        continue;
-      }
-      out.write(x);
-    }
-  }
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/BreakException.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/BreakException.java
deleted file mode 100644
index a83e73c..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/BreakException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-/** Exception signalling that a IBreakCheck abort check caused an abort.
-*/
-public class BreakException extends Exception
-{
-  public BreakException()
-  {
-    super();
-  }
-  
-  public BreakException(String msg)
-  {
-    super(msg);
-  }
-  
-  public BreakException(String msg, Throwable e)
-  {
-    super(msg,e);
-  }
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IBreakCheck.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IBreakCheck.java
deleted file mode 100644
index 25da1e5..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IBreakCheck.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-/** Allow for abort checks during long waits.
-*/
-public interface IBreakCheck
-{
-  /** Obtain the maximum time (in milliseconds) that a wait should occur
-  * before checking for an abort.  Also check for the abort and throw a BreakException
-  * if the abort should take place.
-  */
-  public long abortCheck()
-    throws BreakException, InterruptedException;
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IConnectionThrottler.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IConnectionThrottler.java
deleted file mode 100644
index 677e213..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IConnectionThrottler.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-import java.util.*;
-
-/** An IConnectionThrottler object is not thread-local.  It gates connection
-* creation and pool management.
-* The underlying model is a pool of connections.  A connection gets pulled off the pool and
-* used to perform a fetch.  If there are insufficient connections in the pool, and there is
-* sufficient capacity to create a new connection, a connection will be created instead.
-* When the fetch is done, the connection is returned, and then there is a decision whether
-* or not to put the connection back into the pool, or to destroy it.  Finally, the pool is
-* periodically evaluated, and connections may be destroyed if either they have expired,
-* or the allocated connections are still over capacity.
-*
-* This object does not in itself contain a connection pool - but it is intended to assist
-* in the management of that pool.  Specifically, it tracks connections that are in the
-* pool, and connections that are handed out for use, and performs ALL the waiting needed
-* due to the pool being empty and/or the number of active connections being at or over
-* the quota.
-*/
-public interface IConnectionThrottler
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // For grabbing a connection for use
-  
-  /** Get the connection from the pool */
-  public final static int CONNECTION_FROM_POOL = 0;
-  /** Create a connection */
-  public final static int CONNECTION_FROM_CREATION = 1;
-  /** Pool shutting down */
-  public final static int CONNECTION_FROM_NOWHERE = -1;
-  
-  /** Get permission to grab a connection for use.  If this object believes there is a connection
-  * available in the pool, it will update its pool size variable and return   If not, this method
-  * evaluates whether a new connection should be created.  If neither condition is true, it
-  * waits until a connection is available.
-  *@return whether to take the connection from the pool, or create one, or whether the
-  * throttler is being shut down.
-  */
-  public int waitConnectionAvailable()
-    throws InterruptedException;
-
-  /** Get permission to grab a connection for use.  If this object believes there is a connection
-  * available in the pool, it will update its pool size variable and return   If not, this method
-  * evaluates whether a new connection should be created.  If neither condition is true, it
-  * waits until a connection is available.
-  *@return whether to take the connection from the pool, or create one, or whether the
-  * throttler is being shut down.
-  */
-  public int waitConnectionAvailable(IBreakCheck breakCheck)
-    throws InterruptedException, BreakException;
-
-  /** For a new connection, obtain the fetch throttler to use for the connection.
-  * If the result from waitConnectionAvailable() is CONNECTION_FROM_CREATION,
-  * the calling code is expected to create a connection using the result of this method.
-  *@return the fetch throttler for a new connection.
-  */
-  public IFetchThrottler getNewConnectionFetchThrottler();
-  
-  /** This method indicates whether a formerly in-use connection should be placed back
-  * in the pool or destroyed.
-  *@return true if the connection should not be put into the pool but should instead
-  *  simply be destroyed.  If true is returned, the caller MUST call noteConnectionDestroyed()
-  *  after the connection is destroyed in order for the bookkeeping to work.  If false
-  *  is returned, the caller MUST call noteConnectionReturnedToPool() after the connection
-  *  is returned to the pool.
-  */
-  public boolean noteReturnedConnection();
-  
-  /** This method calculates whether a connection should be taken from the pool and destroyed
-  /* in order to meet quota requirements.  If this method returns
-  /* true, you MUST remove a connection from the pool, and you MUST call
-  /* noteConnectionDestroyed() afterwards.
-  *@return true if a pooled connection should be destroyed.  If true is returned, the
-  * caller MUST call noteConnectionDestroyed() (below) in order for the bookkeeping to work.
-  */
-  public boolean checkDestroyPooledConnection();
-  
-  /** Connection expiration is tricky, because even though a connection may be identified as
-  * being expired, at the very same moment it could be handed out in another thread.  So there
-  * is a natural race condition present.
-  * The way the connection throttler deals with that is to allow the caller to reserve a connection
-  * for expiration.  This must be called BEFORE the actual identified connection is removed from the
-  * connection pool.  If the value returned by this method is "true", then a connection MUST be removed
-  * from the pool and destroyed, whether or not the identified connection is actually still available for
-  * destruction or not.
-  *@return true if a connection from the pool can be expired.  If true is returned, noteConnectionDestruction()
-  *  MUST be called once the connection has actually been destroyed.
-  */
-  public boolean checkExpireConnection();
-  
-  /** Note that a connection has been returned to the pool.  Call this method after a connection has been
-  * placed back into the pool and is available for use.
-  */
-  public void noteConnectionReturnedToPool();
-  
-  /** Note that a connection has been destroyed.  Call this method ONLY after noteReturnedConnection()
-  * or checkDestroyPooledConnection() returns true, AND the connection has been already
-  * destroyed.
-  */
-  public void noteConnectionDestroyed();
-  
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IFetchThrottler.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IFetchThrottler.java
deleted file mode 100644
index a9b2063..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IFetchThrottler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-/** An IFetchThrottler object is meant to be used as part of a fetch cycle.  It is not
-* thread-local, and does not require access to a thread context.  It thus also does not
-* throw ManifoldCFExceptions.  It is thus suitable for use in background threads, etc.
-* These objects are typically created by IConnectionThrottler objects - they are not meant
-* to be created directly.
-*/
-public interface IFetchThrottler
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get permission to fetch a document.  This grants permission to start
-  * fetching a single document, within the connection that has already been
-  * granted permission that created this object.
-  *@return false if the throttler is being shut down.
-  */
-  public boolean obtainFetchDocumentPermission()
-    throws InterruptedException;
-
-  /** Get permission to fetch a document.  This grants permission to start
-  * fetching a single document, within the connection that has already been
-  * granted permission that created this object.
-  *@return false if the throttler is being shut down.
-  */
-  public boolean obtainFetchDocumentPermission(IBreakCheck breakCheck)
-    throws InterruptedException, BreakException;
-  
-  /** Open a fetch stream.  When done (or aborting), call
-  * IStreamThrottler.closeStream() to note the completion of the document
-  * fetch activity.
-  *@return the stream throttler to use to throttle the actual data access.
-  */
-  public IStreamThrottler createFetchStream();
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IKeystoreManager.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IKeystoreManager.java
deleted file mode 100644
index 5fcd527..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IKeystoreManager.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/* $Id: IKeystoreManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** This interface describes a class that manages keys and certificates in a secure manner.
-* It's built on top of the JDK 1.4+ JSSE integration, and provides all the necessary logic
-* to work well within the ManifoldCF java environment.
-*/
-public interface IKeystoreManager extends ISSLSocketFactoryProducer
-{
-  public static final String _rcsid = "@(#)$Id: IKeystoreManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get a unique hashstring for this keystore.  The hashcode depends only on the certificates
-  * in the store.
-  *@return the hash string for this keystore.
-  */
-  public String getHashString()
-    throws ManifoldCFException;
-
-  /** Grab a list of the aliases in the key store.
-  *@return the list, as a string array.
-  */
-  public String[] getContents()
-    throws ManifoldCFException;
-
-  /** For an alias, get some descriptive information from the object in the keystore.
-  *@param alias is the alias name.
-  *@return a description of what's in the alias.
-  */
-  public String getDescription(String alias)
-    throws ManifoldCFException;
-
-  /** Import a certificate or key into the list.  The data must be added as binary.
-  *@param alias is the name of the certificate.
-  *@param certData is the binary data for the certificate.
-  */
-  public void importCertificate(String alias, InputStream certData)
-    throws ManifoldCFException;
-
-  /** Remove a certificate.
-  *@param alias is the name of the certificate to remove.
-  */
-  public void remove(String alias)
-    throws ManifoldCFException;
-
-  /** Convert to a base64 string.
-  *@return the base64-encoded string.  This differs every time it is called, and thus
-  * CANNOT be used for hashing.
-  */
-  public String getString()
-    throws ManifoldCFException;
-
-  /** Read a certificate from the keystore.
-  */
-  public java.security.cert.Certificate getCertificate(String alias)
-    throws ManifoldCFException;
-
-  /** Add a certificate to the keystore.
-  */
-  public void addCertificate(String alias, java.security.cert.Certificate certificate)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IStreamThrottler.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IStreamThrottler.java
deleted file mode 100644
index 4800411..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IStreamThrottler.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-/** An IConnectionThrottler object is meant to be embedded in an InputStream.  It is not
-* thread-local, and does not require access to a thread context.  It thus also does not
-* throw ManifoldCFExceptions.  It is thus suitable for use in background threads, etc.
-* These objects are typically created by IFetchThrottler objects - they are not meant
-* to be created directly.
-*/
-public interface IStreamThrottler
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Obtain permission to read a block of bytes.  This method may wait until it is OK to proceed.
-  * The throttle group, bin names, etc are already known
-  * to this specific interface object, so it is unnecessary to include them here.
-  *@param byteCount is the number of bytes to get permissions to read.
-  *@return true if the wait took place as planned, or false if the system is being shut down.
-  */
-  public boolean obtainReadPermission(int byteCount)
-    throws InterruptedException;
-
-  /** Obtain permission to read a block of bytes.  This method may wait until it is OK to proceed.
-  * The throttle group, bin names, etc are already known
-  * to this specific interface object, so it is unnecessary to include them here.
-  *@param byteCount is the number of bytes to get permissions to read.
-  *@return true if the wait took place as planned, or false if the system is being shut down.
-  */
-  public boolean obtainReadPermission(int byteCount, IBreakCheck breakCheck)
-    throws InterruptedException, BreakException;
-  
-  /** Note the completion of the read of a block of bytes.  Call this after
-  * obtainReadPermission() was successfully called, and bytes were successfully read.
-  *@param origByteCount is the originally requested number of bytes to get permissions to read.
-  *@param actualByteCount is the number of bytes actually read.
-  */
-  public void releaseReadPermission(int origByteCount, int actualByteCount);
-  
-  /** Note the stream being closed.
-  */
-  public void closeStream();
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IThrottleGroups.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IThrottleGroups.java
deleted file mode 100644
index 1bc56b1..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IThrottleGroups.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-
-/** An IThrottleGroups object is thread-local and creates a virtual pool
-* of connections to resources whose access needs to be throttled in number, 
-* rate of use, and byte rate.
-*/
-public interface IThrottleGroups
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get all existing throttle groups for a throttle group type.
-  * The throttle group type typically describes a connector class, while the throttle group represents
-  * a namespace of bin names specific to that connector class.
-  *@param throttleGroupType is the throttle group type.
-  *@return the set of throttle groups for that group type.
-  */
-  public Set<String> getThrottleGroups(String throttleGroupType)
-    throws ManifoldCFException;
-  
-  /** Remove a throttle group.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  */
-  public void removeThrottleGroup(String throttleGroupType, String throttleGroup)
-    throws ManifoldCFException;
-  
-  /** Create or update a throttle group.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param throttleSpec is the desired throttle specification object.
-  */
-  public void createOrUpdateThrottleGroup(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
-    throws ManifoldCFException;
-
-  /** Construct connection throttler for connections with specific bin names.  This object is meant to be embedded with a connection
-  * pool of similar objects, and used to gate the creation of new connections in that pool.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames are the connection type bin names.
-  *@return the connection throttling object, or null if the pool is being shut down.
-  */
-  public IConnectionThrottler obtainConnectionThrottler(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException;
-  
-  /** Poll periodically, to update cluster-wide statistics and allocation.
-  *@param throttleGroupType is the throttle group type to update.
-  */
-  public void poll(String throttleGroupType)
-    throws ManifoldCFException;
-
-  /** Poll periodically, to update ALL cluster-wide statistics and allocation.
-  */
-  public void poll()
-    throws ManifoldCFException;
-
-  /** Free all unused resources.
-  */
-  public void freeUnusedResources()
-    throws ManifoldCFException;
-  
-  /** Shut down throttler permanently.
-  */
-  public void destroy()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IThrottleSpec.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IThrottleSpec.java
deleted file mode 100644
index 36374f1..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/IThrottleSpec.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-
-/** An IThrottleSpec object describes what throttling criteria to apply
-* per bin.
-*/
-public interface IThrottleSpec
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Given a bin name, find the max open connections to use for that bin.
-  *@return Integer.MAX_VALUE if no limit found.
-  */
-  public int getMaxOpenConnections(String binName);
-
-  /** Look up minimum milliseconds per byte for a bin.
-  *@return 0.0 if no limit found.
-  */
-  public double getMinimumMillisecondsPerByte(String binName);
-
-  /** Look up minimum milliseconds for a fetch for a bin.
-  *@return 0 if no limit found.
-  */
-  public long getMinimumMillisecondsPerFetch(String binName);
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/KeystoreManagerFactory.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/KeystoreManagerFactory.java
deleted file mode 100644
index 03daae3..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/KeystoreManagerFactory.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/* $Id: KeystoreManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-import org.apache.manifoldcf.connectorcommon.keystore.KeystoreManager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.security.*;
-import java.security.cert.*;
-
-/** This class is the factory class for keystore managers.
-*/
-public class KeystoreManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: KeystoreManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Mint a keystore manager.
-  */
-  public static IKeystoreManager make(String passcode)
-    throws ManifoldCFException
-  {
-    return new KeystoreManager(passcode);
-  }
-
-  /** Mint a keystore manager from a base-64 encoded string.
-  */
-  public static IKeystoreManager make(String passcode, String base64String)
-    throws ManifoldCFException
-  {
-    return new KeystoreManager(passcode,base64String);
-  }
-
-  protected static javax.net.ssl.X509TrustManager[] openTrustManagerArray = new OpenTrustManager[]{new OpenTrustManager()};
-
-  /** Build a secure socket factory that pays no attention to certificates in trust store, and just trusts everything.
-  */
-  public static javax.net.ssl.SSLSocketFactory getTrustingSecureSocketFactory()
-    throws ManifoldCFException
-  {
-    try
-    {
-      java.security.SecureRandom secureRandom = java.security.SecureRandom.getInstance("SHA1PRNG");
-
-      // Create an SSL context
-      javax.net.ssl.SSLContext sslContext = javax.net.ssl.SSLContext.getInstance("SSL");
-      sslContext.init(null,openTrustManagerArray,secureRandom);
-
-      return sslContext.getSocketFactory();
-    }
-    catch (java.security.NoSuchAlgorithmException e)
-    {
-      throw new ManifoldCFException("No such algorithm: "+e.getMessage(),e);
-    }
-    catch (java.security.KeyManagementException e)
-    {
-      throw new ManifoldCFException("Key management exception: "+e.getMessage(),e);
-    }
-  }
-
-  protected static class OpenTrustManager implements javax.net.ssl.X509TrustManager
-  {
-    public void checkClientTrusted(X509Certificate[] chain,
-      String authType)
-      throws CertificateException
-    {
-    }
-
-    public void checkServerTrusted(X509Certificate[] chain,
-      String authType)
-      throws CertificateException
-    {
-    }
-
-    public X509Certificate[] getAcceptedIssuers()
-    {
-      return new X509Certificate[0];
-    }
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/ThrottleGroupsFactory.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/ThrottleGroupsFactory.java
deleted file mode 100644
index c53b86b..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/interfaces/ThrottleGroupsFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** Thread-local IThrottleGroups factory.
-*/
-public class ThrottleGroupsFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_ThrottleGroups_";
-
-  private ThrottleGroupsFactory()
-  {
-  }
-
-  /** Make a connection throttle handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IThrottleGroups make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IThrottleGroups))
-    {
-      o = new org.apache.manifoldcf.connectorcommon.throttler.ThrottleGroups(tc);
-      tc.save(objectName,o);
-    }
-    return (IThrottleGroups)o;
-  }
-
-  /** Class that polls throttler */
-  protected static class ThrottlerPoll implements IPollingHook
-  {
-    public ThrottlerPoll()
-    {
-    }
-    
-    @Override
-    public void doPoll(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      IThrottleGroups connectionThrottler = ThrottleGroupsFactory.make(threadContext);
-      connectionThrottler.poll();
-    }
-  }
-  
-  /** Register the throttle groups ManifoldCF service.
-  */
-  public static void register()
-  {
-    ManifoldCF.addShutdownHook(new ThrottlerShutdown());
-    ManifoldCF.addPollingHook(new ThrottlerPoll());
-  }
-
-  /** Class that cleans up throttler on exit */
-  protected static class ThrottlerShutdown implements IShutdownHook
-  {
-    public ThrottlerShutdown()
-    {
-    }
-    
-    @Override
-    public void doCleanup(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      IThrottleGroups connectionThrottler = ThrottleGroupsFactory.make(threadContext);
-      connectionThrottler.destroy();
-    }
-    
-    /** Finalizer, which is designed to catch class unloading that tomcat 5.5 does.
-    */
-    protected void finalize()
-      throws Throwable
-    {
-      try
-      {
-        doCleanup(ThreadContextFactory.make());
-      }
-      finally
-      {
-        super.finalize();
-      }
-    }
-
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONArrayReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONArrayReader.java
deleted file mode 100644
index f578060..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONArrayReader.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-import java.util.*;
-
-/** This class describes a JSON array reader. */
-public class JSONArrayReader extends JSONReader
-{
-  protected final static int STATE_PREBRACKET = 0;
-  protected final static int STATE_ELEMENT = 1;
-  protected final static int STATE_PREEND = 2;
-  protected final static int STATE_DONE = 3;
-  
-  protected int state = STATE_PREBRACKET;
-  protected final List<JSONReader> elements = new ArrayList<JSONReader>();
-  protected int elementIndex;
-  
-  public JSONArrayReader()
-  {
-  }
-  
-  public JSONArrayReader(JSONReader[] elements)
-  {
-    for (JSONReader element : elements)
-    {
-      addArrayElement(element);
-    }
-  }
-  
-  public JSONArrayReader addArrayElement(JSONReader element)
-  {
-    elements.add(element);
-    return this;
-  }
-
-  @Override
-  public int read()
-    throws IOException
-  {
-    int newState;
-    switch (state)
-    {
-    case STATE_PREBRACKET:
-      if (elements.size() == 0)
-        state = STATE_PREEND;
-      else
-      {
-        state = STATE_ELEMENT;
-        elementIndex = 0;
-      }
-      return '[';
-    case STATE_PREEND:
-      state = STATE_DONE;
-      return ']';
-    case STATE_DONE:
-      return -1;
-    case STATE_ELEMENT:
-      int x = elements.get(elementIndex).read();
-      if (x == -1)
-      {
-        elementIndex++;
-        if (elementIndex == elements.size())
-        {
-          state = STATE_DONE;
-          return ']';
-        }
-        else
-          return ',';
-      }
-      else
-        return x;
-    default:
-      throw new IllegalStateException("Unknown state: "+state);
-    }
-  }
-
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONDoubleReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONDoubleReader.java
deleted file mode 100644
index 69a2538..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONDoubleReader.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-
-/** This class describes a JSON double reader. */
-public class JSONDoubleReader extends JSONValueReader
-{
-  public JSONDoubleReader(double value)
-  {
-    super(new StringReader(new Double(value).toString()));
-  }
-  
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONIntegerReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONIntegerReader.java
deleted file mode 100644
index b774e6d..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONIntegerReader.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-
-/** This class describes a JSON integer reader. */
-public class JSONIntegerReader extends JSONValueReader
-{
-  public JSONIntegerReader(int value)
-  {
-    super(new StringReader(Integer.toString(value)));
-  }
-  
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONNameValueReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONNameValueReader.java
deleted file mode 100644
index 2ae8c0e..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONNameValueReader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-
-/** This class describes a JSON name/value object reader. */
-public class JSONNameValueReader extends JSONReader
-{
-  protected final static int STATE_NAME = 0;
-  protected final static int STATE_VALUE = 1;
-  protected final static int STATE_DONE = 2;
-  
-  protected final JSONReader name;
-  protected final JSONReader value;
-  
-  protected int state = STATE_NAME;
-  
-  public JSONNameValueReader(JSONStringReader name, JSONReader value)
-  {
-    this.name = name;
-    this.value = value;
-  }
-
-  @Override
-  public int read()
-    throws IOException
-  {
-    int x;
-    switch (state)
-    {
-    case STATE_NAME:
-      x = name.read();
-      if (x == -1)
-      {
-        state = STATE_VALUE;
-        return ':';
-      }
-      return x;
-    case STATE_VALUE:
-      x = value.read();
-      if (x == -1)
-      {
-        state = STATE_DONE;
-        return -1;
-      }
-      return x;
-    case STATE_DONE:
-      return -1;
-    default:
-      throw new IllegalStateException("Unknown state: "+state);
-    }
-  }
-
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONObjectReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONObjectReader.java
deleted file mode 100644
index 007f0f5..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONObjectReader.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-import java.util.*;
-
-/** This class describes a JSON object reader. */
-public class JSONObjectReader extends JSONReader
-{
-  protected final static int STATE_PREBRACE = 0;
-  protected final static int STATE_PAIRBEGIN = 1;
-  protected final static int STATE_PREEND = 2;
-  protected final static int STATE_DONE = 3;
-  
-  protected int state = STATE_PREBRACE;
-  protected final List<JSONReader> pairs = new ArrayList<JSONReader>();
-  protected int readerIndex;
-
-  public JSONObjectReader()
-  {
-  }
-  
-  public JSONObjectReader addNameValuePair(JSONNameValueReader pair)
-  {
-    pairs.add(pair);
-    return this;
-  }
-  
-  @Override
-  public int read()
-    throws IOException
-  {
-    switch (state)
-    {
-    case STATE_PREBRACE:
-      if (pairs.size() == 0)
-        state = STATE_PREEND;
-      else
-      {
-        state = STATE_PAIRBEGIN;
-        readerIndex = 0;
-      }
-      return '{';
-    case STATE_PREEND:
-      state = STATE_DONE;
-      return '}';
-    case STATE_DONE:
-      return -1;
-    case STATE_PAIRBEGIN:
-      int x = pairs.get(readerIndex).read();
-      if (x == -1)
-      {
-        readerIndex++;
-        if (readerIndex == pairs.size())
-        {
-          state = STATE_DONE;
-          return '}';
-        }
-        else
-          return ',';
-      }
-      else
-        return x;
-    default:
-      throw new IllegalStateException("Unknown state: "+state);
-    }
-  }
-
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONReader.java
deleted file mode 100644
index 8139049..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONReader.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-
-/** This base class describes a JSON reader. */
-public abstract class JSONReader extends Reader
-{
-
-  @Override
-  public int read(char[] cbuf, int off, int len)
-    throws IOException
-  {
-    int amt = 0;
-    while (true)
-    {
-      if (len == 0)
-        return amt;
-      int theChar = read();
-      if (theChar == -1)
-      {
-        if (amt == 0)
-          return -1;
-        return amt;
-      }
-      cbuf[off++] = (char)theChar;
-      len--;
-      amt++;
-    }
-  }
-  
-  @Override
-  public abstract int read()
-    throws IOException;
-  
-  @Override
-  public void close()
-    throws IOException
-  {
-  }
-  
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONStringReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONStringReader.java
deleted file mode 100644
index 1bb2da7..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONStringReader.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-
-/** This class describes a JSON string reader. */
-public class JSONStringReader extends JSONReader
-{
-  // Strings need to be escaped, therefore we have our own.
-  /*
-   All Unicode characters may be placed within the
-   quotation marks except for the characters that must be escaped:
-   quotation mark, reverse solidus, and the control characters (U+0000
-   through U+001F).
-
-   Any character may be escaped.  If the character is in the Basic
-   Multilingual Plane (U+0000 through U+FFFF), then it may be
-   represented as a six-character sequence: a reverse solidus, followed
-   by the lowercase letter u, followed by four hexadecimal digits that
-   encode the character's code point.  The hexadecimal letters A though
-   F can be upper or lowercase.  So, for example, a string containing
-   only a single reverse solidus character may be represented as
-   "\u005C".
-
-   Alternatively, there are two-character sequence escape
-   representations of some popular characters.  So, for example, a
-   string containing only a single reverse solidus character may be
-   represented more compactly as "\\".
-  */
-  
-  protected final static int STATE_PREQUOTE = 0;
-  protected final static int STATE_U = 1;
-  protected final static int STATE_1ST = 2;
-  protected final static int STATE_2ND = 3;
-  protected final static int STATE_3RD = 4;
-  protected final static int STATE_4TH = 5;
-  protected final static int STATE_NEXTCHAR = 6;
-  protected final static int STATE_DONE = 7;
-
-  protected final Reader inputReader;
-  
-  protected int state = STATE_PREQUOTE;
-  protected String escapedChar;
-
-  public JSONStringReader(String value)
-  {
-    inputReader = new StringReader(value);
-  }
-  
-  public JSONStringReader(Reader value)
-  {
-    inputReader = value;
-  }
-
-  @Override
-  public int read()
-    throws IOException
-  {
-    int x;
-    switch (state)
-    {
-    case STATE_PREQUOTE:
-      state = STATE_NEXTCHAR;
-      return '"';
-    case STATE_NEXTCHAR:
-      x = inputReader.read();
-      if (x == -1)
-      {
-        state = STATE_DONE;
-        return '"';
-      }
-      else
-      {
-        if (x < ' ' || x == '"' || x == '\\')
-        {
-          escapedChar = "000" + Integer.toHexString(x);
-          escapedChar = escapedChar.substring(escapedChar.length()-4);
-          state = STATE_U;
-          return '\\';
-        }
-        return x;
-      }
-    case STATE_U:
-      state = STATE_1ST;
-      return 'u';
-    case STATE_1ST:
-      state = STATE_2ND;
-      return escapedChar.charAt(0);
-    case STATE_2ND:
-      state = STATE_3RD;
-      return escapedChar.charAt(1);
-    case STATE_3RD:
-      state = STATE_4TH;
-      return escapedChar.charAt(2);
-    case STATE_4TH:
-      state = STATE_NEXTCHAR;
-      return escapedChar.charAt(3);
-    case STATE_DONE:
-      return -1;
-    default:
-      throw new IllegalStateException("Unknown state: "+state);
-    }
-  }
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONValueReader.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONValueReader.java
deleted file mode 100644
index 7337dd4..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/jsongen/JSONValueReader.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-
-/** This class describes a JSON value reader, which can be any terminal value (e.g. string, integer, float). */
-public class JSONValueReader extends JSONReader
-{
-  /** Wrapped reader */
-  protected final Reader value;
-  
-  public JSONValueReader(Reader value)
-  {
-    this.value = value;
-  }
-
-  @Override
-  public int read()
-    throws IOException
-  {
-    return value.read();
-  }
-}
-
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/keystore/KeystoreManager.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/keystore/KeystoreManager.java
deleted file mode 100644
index 8e2f4a3..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/keystore/KeystoreManager.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/* $Id: KeystoreManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.keystore;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.core.common.*;
-import org.apache.manifoldcf.core.system.Logging;
-import java.security.*;
-import java.security.cert.*;
-import java.security.cert.Certificate;
-import java.util.*;
-import java.io.*;
-
-/** This interface describes a class that manages keys and certificates in a secure manner.
-* It's built on top of the JDK 1.4+ JSSE integration, and provides all the necessary logic
-* to work well within the ManifoldCF java environment.
-*/
-public class KeystoreManager implements IKeystoreManager
-{
-  public static final String _rcsid = "@(#)$Id: KeystoreManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // The keystore passcode
-  protected final String passcode;
-  // The keystore itself
-  protected final KeyStore keystore;
-
-  /** Create the keystore object.
-  */
-  public KeystoreManager(String passcode)
-    throws ManifoldCFException
-  {
-    this.passcode = passcode;
-    try
-    {
-      keystore = KeyStore.getInstance("JKS");
-      keystore.load(null,passcode.toCharArray());
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted IO: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error creating keystore: "+e.getMessage(),e);
-    }
-    catch (NoSuchAlgorithmException e)
-    {
-      throw new ManifoldCFException("Unknown algorithm exception creating keystore: "+e.getMessage(),e);
-    }
-    catch (CertificateException e)
-    {
-      throw new ManifoldCFException("Unknown certificate exception creating keystore: "+e.getMessage(),e);
-    }
-  }
-
-  /** Create the keystore object from an existing base 64 string.
-  */
-  public KeystoreManager(String passcode, String base64String)
-    throws ManifoldCFException
-  {
-    this.passcode = passcode;
-    try
-    {
-      keystore = KeyStore.getInstance("JKS");
-      byte[] decodedBytes = new org.apache.manifoldcf.core.common.Base64().decodeString(base64String);
-
-      try(InputStream base64Input = new ByteArrayInputStream(decodedBytes))
-      {
-        keystore.load(base64Input,passcode.toCharArray());
-      }
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore exception: "+e.getMessage(),e);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted IO: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error creating keystore: "+e.getMessage(),e);
-    }
-    catch (NoSuchAlgorithmException e)
-    {
-      throw new ManifoldCFException("Unknown algorithm exception creating keystore: "+e.getMessage(),e);
-    }
-    catch (CertificateException e)
-    {
-      throw new ManifoldCFException("Unknown certificate exception creating keystore: "+e.getMessage(),e);
-    }
-  }
-
-  /** Get a unique hashstring for this keystore.  The hashcode depends only on the certificates
-  * in the store.
-  *@return the hash string for this keystore.
-  */
-  @Override
-  public String getHashString()
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder();
-    // Get the certs in the store
-    String[] aliases = getContents();
-    for (String alias : aliases)
-    {
-      String description = getDescription(alias);
-      sb.append(":").append(alias).append(":").append(description);
-    }
-    return sb.toString();
-  }
-
-  /** Grab a list of the aliases in the key store.
-  *@return the list, as a string array.
-  */
-  @Override
-  public String[] getContents()
-    throws ManifoldCFException
-  {
-    try
-    {
-      String[] rval = new String[keystore.size()];
-      Enumeration enumeration = keystore.aliases();
-      int i = 0;
-      while (enumeration.hasMoreElements())
-      {
-        String alias = (String)enumeration.nextElement();
-        rval[i++] = alias;
-      }
-      return rval;
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore not initialized: "+e.getMessage(),e);
-    }
-
-  }
-
-
-  /** For an alias, get some descriptive information from the object in the keystore.
-  *@param alias is the alias name.
-  *@return a description of what's in the alias.
-  */
-  @Override
-  public String getDescription(String alias)
-    throws ManifoldCFException
-  {
-    try
-    {
-      Certificate c = keystore.getCertificate(alias);
-      if (c == null)
-        return null;
-      return c.toString();
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore not initialized: "+e.getMessage(),e);
-    }
-  }
-
-  /** Import a certificate or key into the list.  The data must be added as binary.
-  *@param alias is the name of the certificate.
-  *@param certData is the binary data for the certificate.
-  */
-  @Override
-  public void importCertificate(String alias, InputStream certData)
-    throws ManifoldCFException
-  {
-    try
-    {
-      CertificateFactory cf = CertificateFactory.getInstance("X.509");
-      Certificate c = cf.generateCertificate(certData);
-      keystore.setCertificateEntry(alias,c);
-      if (Logging.keystore.isDebugEnabled())
-      {
-        if (keystore.isCertificateEntry(alias))
-          Logging.keystore.debug("The certificate just imported is a Trust Certificate");
-        else
-          Logging.keystore.debug("The certificate just imported is NOT a Trust Certificate");
-      }
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore exception: "+e.getMessage(),e);
-    }
-    catch (CertificateException e)
-    {
-      throw new ManifoldCFException("Certificate error: "+e.getMessage(),e);
-    }
-  }
-
-  /** Read a certificate from the keystore.
-  */
-  @Override
-  public java.security.cert.Certificate getCertificate(String alias)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return keystore.getCertificate(alias);
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Add a certificate to the keystore.
-  */
-  @Override
-  public void addCertificate(String alias, java.security.cert.Certificate certificate)
-    throws ManifoldCFException
-  {
-    try
-    {
-      keystore.setCertificateEntry(alias,certificate);
-      if (Logging.keystore.isDebugEnabled())
-      {
-        if (keystore.isCertificateEntry(alias))
-          Logging.keystore.debug("The certificate just added is a Trust Certificate");
-        else
-          Logging.keystore.debug("The certificate just added is NOT a Trust Certificate");
-      }
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Remove a certificate.
-  *@param alias is the name of the certificate to remove.
-  */
-  @Override
-  public void remove(String alias)
-    throws ManifoldCFException
-  {
-    try
-    {
-      keystore.deleteEntry(alias);
-    }
-    catch (KeyStoreException e)
-    {
-      throw new ManifoldCFException("Error deleting keystore entry",e);
-    }
-  }
-
-  /** Convert to a base64 string.
-  *@return the base64-encoded string.  NOTE WELL: as of JDK 1.6, you will not get the same exact string twice from this method --
-  *  so it cannot be used for a hash!!
-  */
-  @Override
-  public String getString()
-    throws ManifoldCFException
-  {
-    try
-    {
-      ByteArrayOutputStream output = new ByteArrayOutputStream();
-      try
-      {
-        keystore.store(output,passcode.toCharArray());
-        return new org.apache.manifoldcf.core.common.Base64().encodeByteArray(output.toByteArray());
-      }
-      catch (KeyStoreException e)
-      {
-        throw new ManifoldCFException("Error accessing keystore: "+e.getMessage(),e);
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new ManifoldCFException("Interrupted IO: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("IO error saving keystore: "+e.getMessage(),e);
-      }
-      catch (NoSuchAlgorithmException e)
-      {
-        throw new ManifoldCFException("Unknown algorithm exception saving keystore: "+e.getMessage(),e);
-      }
-      catch (CertificateException e)
-      {
-        throw new ManifoldCFException("Certificate exception saving keystore: "+e.getMessage(),e);
-      }
-      finally
-      {
-        output.close();
-      }
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted IO: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception storing keystore: "+e.getMessage(),e);
-    }
-  }
-
-  /** Build a secure socket factory based on this keystore.
-  */
-  @Override
-  public javax.net.ssl.SSLSocketFactory getSecureSocketFactory()
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Construct a key manager and a trust manager
-      javax.net.ssl.KeyManagerFactory keyManagerFactory = null;
-      // javax.net.ssl.KeyManagerFactory keyManagerFactory = javax.net.ssl.KeyManagerFactory.getInstance(javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm());
-      // keyManagerFactory.init(keystore,passcode);
-
-      javax.net.ssl.TrustManagerFactory trustManagerFactory = javax.net.ssl.TrustManagerFactory.getInstance(javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm());
-      Logging.keystore.debug("Contents of current trust keystore is:");
-      if (Logging.keystore.isDebugEnabled())
-      {
-        String[] contents = getContents();
-        int i = 0;
-        while (i < contents.length)
-        {
-          Logging.keystore.debug("Description "+Integer.toString(i)+": "+getDescription(contents[i]));
-          i++;
-        }
-      }
-      Logging.keystore.debug("Reading trust keystore...");
-      trustManagerFactory.init(keystore);
-      if (Logging.keystore.isDebugEnabled())
-      {
-        Logging.keystore.debug("...done");
-        javax.net.ssl.TrustManager array[] = trustManagerFactory.getTrustManagers();
-        Logging.keystore.debug("Found "+Integer.toString(array.length)+" trust managers");
-        int i = 0;
-        while (i < array.length)
-        {
-          javax.net.ssl.TrustManager tm = array[i];
-          if (tm instanceof javax.net.ssl.X509TrustManager)
-          {
-            Logging.keystore.debug("Trust manager "+Integer.toString(i)+" is an x509 trust manager; it's class is "+tm.getClass().getName());
-            javax.net.ssl.X509TrustManager tm2 = (javax.net.ssl.X509TrustManager)tm;
-            java.security.cert.X509Certificate calist[] = tm2.getAcceptedIssuers();
-            Logging.keystore.debug("There are "+Integer.toString(calist.length)+" accepted issuers");
-            int j = 0;
-            while (j < calist.length)
-            {
-              String value = calist[j].getSubjectDN().toString();
-              Logging.keystore.debug("Authority "+Integer.toString(j)+" is "+value);
-              j++;
-            }
-          }
-          i++;
-        }
-        Logging.keystore.debug("No more trust contents");
-      }
-
-      java.security.SecureRandom secureRandom = java.security.SecureRandom.getInstance("SHA1PRNG");
-
-      // Create an SSL context
-      javax.net.ssl.SSLContext sslContext = javax.net.ssl.SSLContext.getInstance("SSL");
-      sslContext.init(((keyManagerFactory==null)?null:keyManagerFactory.getKeyManagers()),((trustManagerFactory==null)?null:trustManagerFactory.getTrustManagers()),
-        secureRandom);
-
-      return sslContext.getSocketFactory();
-    }
-    catch (java.security.NoSuchAlgorithmException e)
-    {
-      throw new ManifoldCFException("No such algorithm: "+e.getMessage(),e);
-    }
-    catch (java.security.KeyStoreException e)
-    {
-      throw new ManifoldCFException("Keystore exception: "+e.getMessage(),e);
-    }
-    catch (java.security.KeyManagementException e)
-    {
-      throw new ManifoldCFException("Key management exception: "+e.getMessage(),e);
-    }
-  }
-
-
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/keystore/TrustingSSLSocketFactoryProducer.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/keystore/TrustingSSLSocketFactoryProducer.java
deleted file mode 100644
index e85a7ad..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/keystore/TrustingSSLSocketFactoryProducer.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.keystore;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import javax.net.ssl.SSLSocketFactory;
-import java.security.*;
-import java.io.*;
-import java.net.Socket;
-import java.net.InetAddress;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.X509TrustManager;
-import javax.net.ssl.TrustManager;
-import java.security.cert.X509Certificate;
-import java.security.NoSuchAlgorithmException;
-import java.security.KeyManagementException;
-import java.security.KeyStoreException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-
-/** This SSLSocketFactoryProducer does no certificate checking whatsoever.
-*/
-public class TrustingSSLSocketFactoryProducer implements ISSLSocketFactoryProducer
-{
-  public TrustingSSLSocketFactoryProducer()
-  {
-  }
-  
-  /** Build a secure socket factory based on this producer.
-  */
-  @Override
-  public javax.net.ssl.SSLSocketFactory getSecureSocketFactory()
-    throws ManifoldCFException
-  {
-    try
-    {
-      final TrustManager tm = new X509TrustManager() {
-        @Override
-        public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException
-        {
-        }
-
-        @Override
-        public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException
-        {
-        }
-
-        @Override
-        public X509Certificate[] getAcceptedIssuers()
-        {
-          return null;
-        }
-      };
-
-      final SSLContext sslContext = SSLContext.getInstance("TLS");
-      sslContext.init(null, new TrustManager[] { tm }, null);
-      return sslContext.getSocketFactory();
-    }
-    catch (NoSuchAlgorithmException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-    catch (KeyManagementException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/system/ManifoldCF.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/system/ManifoldCF.java
deleted file mode 100644
index 5eb0614..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/system/ManifoldCF.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.system;
-
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-
-public class ManifoldCF
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  public static void registerConnectorServices()
-  {
-    ThrottleGroupsFactory.register();
-  }
-  
-}
\ No newline at end of file
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ConnectionBin.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ConnectionBin.java
deleted file mode 100644
index c867525..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ConnectionBin.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.throttler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.concurrent.atomic.*;
-import java.util.*;
-
-/** Connection tracking for a bin.
-*
-* This class keeps track of information needed to figure out throttling for connections,
-* on a bin-by-bin basis.  It is *not*, however, a connection pool.  Actually establishing
-* connections, and pooling established connections, is functionality that must reside in the
-* caller.
-*
-* The 'connections' each connection bin tracks are connections outstanding that share this bin name.
-* Not all such connections are identical; some may in fact have entirely different sets of
-* bins associated with them, but they all have the specific bin in common.  Since each bin has its
-* own unique limit, this effectively means that in order to get a connection, you need to find an
-* available slot in ALL of its constituent connection bins.  If the connections are pooled, it makes
-* the most sense to divide the pool up by characteristics such that identical connections are all
-* handled together - and it is reasonable to presume that an identical connection has identical
-* connection bins.
-*
-* NOTE WELL: This is entirely local in operation
-*/
-public class ConnectionBin
-{
-  /** True if this bin is alive still */
-  protected boolean isAlive = true;
-  /** This is the bin name which this connection pool belongs to */
-  protected final String binName;
-  /** Service type name */
-  protected final String serviceTypeName;
-  /** The (anonymous) service name */
-  protected final String serviceName;
-  /** The target calculation lock name */
-  protected final String targetCalcLockName;
-  
-  /** This is the maximum number of active connections allowed for this bin */
-  protected int maxActiveConnections = 0;
-  
-  /** This is the local maximum number of active connections allowed for this bin */
-  protected int localMax = 0;
-  /** This is the number of connections in this bin that have been reserved - that is, they
-  * are promised to various callers, but those callers have not yet committed to obtaining them. */
-  protected int reservedConnections = 0;
-  /** This is the number of connections in this bin that are connected; immaterial whether they are
-  * in use or in a pool somewhere. */
-  protected int inUseConnections = 0;
-  /** This is the number of active referring connection pools.  We increment this number
-  * whenever a poolCount goes from zero to 1, and we decrement it whenever a poolCount
-  * goes from one to zero. */
-  protected int referencingPools = 0;
-  
-  /** The service type prefix for connection bins */
-  protected final static String serviceTypePrefix = "_CONNECTIONBIN_";
-
-  /** The target calculation lock prefix */
-  protected final static String targetCalcLockPrefix = "_CONNECTIONBINTARGET_";
-  
-  /** Random number */
-  protected final static Random randomNumberGenerator = new Random();
-
-  /** Constructor. */
-  public ConnectionBin(IThreadContext threadContext, String throttlingGroupName, String binName)
-    throws ManifoldCFException
-  {
-    this.binName = binName;
-    this.serviceTypeName = buildServiceTypeName(throttlingGroupName, binName);
-    this.targetCalcLockName = buildTargetCalcLockName(throttlingGroupName, binName);
-    // Now, register and activate service anonymously, and record the service name we get.
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    this.serviceName = lockManager.registerServiceBeginServiceActivity(serviceTypeName, null, null);
-  }
-
-  protected static String buildServiceTypeName(String throttlingGroupName, String binName)
-  {
-    return serviceTypePrefix + throttlingGroupName + "_" + binName;
-  }
-
-  protected static String buildTargetCalcLockName(String throttlingGroupName, String binName)
-  {
-    return targetCalcLockPrefix + throttlingGroupName + "_" + binName;
-  }
-  
-  /** Get the bin name. */
-  public String getBinName()
-  {
-    return binName;
-  }
-
-  /** Update the maximum number of active connections.
-  */
-  public synchronized void updateMaxActiveConnections(int maxActiveConnections)
-  {
-    // Update the number; the poller will wake up any waiting threads.
-    this.maxActiveConnections = maxActiveConnections;
-  }
-
-  /** Wait for a connection to become available, in the context of an existing connection pool.
-  *@param poolCount is the number of connections in the pool times the number of bins per connection.
-  * This parameter is only ever changed in this class!!
-  *@return a recommendation as to how to proceed, using the IConnectionThrottler values.  If the
-  * recommendation is to create a connection, a slot will be reserved for that purpose.  A
-  * subsequent call to noteConnectionCreation() will be needed to confirm the reservation, or clearReservation() to
-  * release the reservation.
-  */
-  public synchronized int waitConnectionAvailable(AtomicInteger poolCount, IBreakCheck breakCheck)
-    throws InterruptedException, BreakException
-  {
-    // Reserved connections keep a slot available which can't be used by anyone else.
-    // Connection bins are always sorted so that deadlocks can't occur.
-    // Once all slots are reserved, the caller will go ahead and create the necessary connection
-    // and convert the reservation to a new connection.
-    
-    while (true)
-    {
-      if (!isAlive)
-        return IConnectionThrottler.CONNECTION_FROM_NOWHERE;
-      int currentPoolCount = poolCount.get();
-      if (currentPoolCount > 0)
-      {
-        // Recommendation is to pull the connection from the pool.
-        poolCount.set(currentPoolCount - 1);
-        if (currentPoolCount == 1)
-          referencingPools--;
-        return IConnectionThrottler.CONNECTION_FROM_POOL;
-      }
-      if (inUseConnections + reservedConnections < localMax)
-      {
-        reservedConnections++;
-        return IConnectionThrottler.CONNECTION_FROM_CREATION;
-      }
-      // Wait for a connection to free up.  Note that it is up to the caller to free stuff up.
-      if (breakCheck == null)
-      {
-        wait();
-      }
-      else
-      {
-        long amt = breakCheck.abortCheck();
-        wait(amt);
-      }
-      // Back around
-    }
-  }
-  
-  /** Undo what we had decided to do before.
-  *@param recommendation is the decision returned by waitForConnection() above.
-  */
-  public synchronized void undoReservation(int recommendation, AtomicInteger poolCount)
-  {
-    if (recommendation == IConnectionThrottler.CONNECTION_FROM_CREATION)
-    {
-      if (reservedConnections == 0)
-        throw new IllegalStateException("Can't clear a reservation we don't have");
-      reservedConnections--;
-      notifyAll();
-    }
-    else if (recommendation == IConnectionThrottler.CONNECTION_FROM_POOL)
-    {
-      int currentCount = poolCount.get();
-      poolCount.set(currentCount + 1);
-      if (currentCount == 0)
-        referencingPools++;
-      notifyAll();
-    }
-  }
-  
-  /** Note the creation of an active connection that belongs to this bin.  The connection MUST
-  * have been reserved prior to the connection being created.
-  */
-  public synchronized void noteConnectionCreation()
-  {
-    if (reservedConnections == 0)
-      throw new IllegalStateException("Creating a connection when no connection slot reserved!");
-    reservedConnections--;
-    inUseConnections++;
-    // No notification needed because the total number of reserved+active connections did not change.
-  }
-
-  /** Figure out whether we are currently over target or not for this bin.
-  */
-  public synchronized boolean shouldReturnedConnectionBeDestroyed()
-  {
-    // We don't count reserved connections here because those are not yet committed
-    return inUseConnections > localMax;
-  }
-  
-  public static final int CONNECTION_DESTROY = 0;
-  public static final int CONNECTION_POOLEMPTY = 1;
-  public static final int CONNECTION_WITHINBOUNDS = 2;
-  
-  /** Figure out whether we are currently over target or not for this bin, and whether a
-  * connection should be pulled from the pool and destroyed.
-  * Note that this is tricky in conjunction with other bins, because those other bins
-  * may conclude that we can't destroy a connection.  If so, we just return the stolen
-  * connection back to the pool.
-  *@return CONNECTION_DESTROY, CONNECTION_POOLEMPTY, or CONNECTION_WITHINBOUNDS.
-  */
-  public synchronized int shouldPooledConnectionBeDestroyed(AtomicInteger poolCount)
-  {
-    int currentPoolCount = poolCount.get();
-    if (currentPoolCount > 0)
-    {
-      int individualPoolAllocation = localMax / referencingPools;
-      // Consider it removed from the pool for the purposes of consideration.  If we change our minds, we'll
-      // return it, and no harm done.
-      poolCount.set(currentPoolCount-1);
-      if (currentPoolCount == 1)
-        referencingPools--;
-      // We don't count reserved connections here because those are not yet committed.
-      if (inUseConnections > individualPoolAllocation)
-      {
-        return CONNECTION_DESTROY;
-      }
-      return CONNECTION_WITHINBOUNDS;
-    }
-    return CONNECTION_POOLEMPTY;
-  }
-
-  /** Check only if there's a pooled connection, and make moves to take it from the pool.
-  */
-  public synchronized boolean hasPooledConnection(AtomicInteger poolCount)
-  {
-    int currentPoolCount = poolCount.get();
-    if (currentPoolCount > 0)
-    {
-      poolCount.set(currentPoolCount-1);
-      if (currentPoolCount == 1)
-        referencingPools--;
-      return true;
-    }
-    return false;
-  }
-  
-  /** Undo the decision to destroy a pooled connection.
-  */
-  public synchronized void undoPooledConnectionDecision(AtomicInteger poolCount)
-  {
-    int currentPoolCount = poolCount.get();
-    poolCount.set(currentPoolCount + 1);
-    if (currentPoolCount == 0)
-      referencingPools++;
-    notifyAll();
-  }
-  
-  /** Note a connection returned to the pool.
-  */
-  public synchronized void noteConnectionReturnedToPool(AtomicInteger poolCount)
-  {
-    int currentPoolCount = poolCount.get();
-    poolCount.set(currentPoolCount + 1);
-    if (currentPoolCount == 0)
-      referencingPools++;
-    // Wake up threads possibly waiting on a pool return.
-    notifyAll();
-  }
-  
-  /** Note the destruction of an active connection that belongs to this bin.
-  */
-  public synchronized void noteConnectionDestroyed()
-  {
-    inUseConnections--;
-    notifyAll();
-  }
-
-  /** Poll this bin */
-  public synchronized void poll(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // The meat of the cross-cluster apportionment algorithm goes here!
-    // Two global numbers each service posts: "in-use" and "target".  At no time does a service *ever* post either a "target"
-    // that, together with all other active service targets, is in excess of the max.  Also, at no time a service post
-    // a target that, when added to the other "in-use" values, exceeds the max.  If the "in-use" values everywhere else
-    // already equal or exceed the max, then the target will be zero.
-    // The target quota is calculated as follows:
-    // (1) Target is summed, excluding ours.  This is GlobalTarget.
-    // (2) In-use is summed, excluding ours.  This is GlobalInUse.
-    // (3) Our MaximumTarget is computed, which is Maximum - GlobalTarget or Maximum - GlobalInUse, whichever is
-    //     smaller, but never less than zero.
-    // (4) Our FairTarget is computed.  The FairTarget divides the Maximum by the number of services, and adds
-    //     1 randomly based on the remainder.
-    // (5) We compute OptimalTarget as follows: We start with current local target.  If current local target
-    //    exceeds current local in-use count, we adjust OptimalTarget downward by one.  Otherwise we increase it
-    //    by one.
-    // (6) Finally, we compute Target by taking the minimum of MaximumTarget, FairTarget, and OptimalTarget.
-
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.enterWriteLock(targetCalcLockName);
-    try
-    {
-      // Compute MaximumTarget
-      SumClass sumClass = new SumClass(serviceName);
-      lockManager.scanServiceData(serviceTypeName, sumClass);
-      //System.out.println("numServices = "+sumClass.getNumServices()+"; globalTarget = "+sumClass.getGlobalTarget()+"; globalInUse = "+sumClass.getGlobalInUse());
-        
-      int numServices = sumClass.getNumServices();
-      if (numServices == 0)
-        return;
-      int globalTarget = sumClass.getGlobalTarget();
-      int globalInUse = sumClass.getGlobalInUse();
-      int maximumTarget = maxActiveConnections - globalTarget;
-      if (maximumTarget > maxActiveConnections - globalInUse)
-        maximumTarget = maxActiveConnections - globalInUse;
-      if (maximumTarget < 0)
-        maximumTarget = 0;
-        
-      // Compute FairTarget
-      int fairTarget = maxActiveConnections / numServices;
-      int remainder = maxActiveConnections % numServices;
-      // Randomly choose whether we get an addition to the FairTarget
-      if (randomNumberGenerator.nextInt(numServices) < remainder)
-        fairTarget++;
-        
-      // Compute OptimalTarget
-      int localInUse = inUseConnections;
-      int optimalTarget = localMax;
-      if (localMax > localInUse)
-        optimalTarget--;
-      else
-      {
-        // We want a fast ramp up, so make this proportional to maxActiveConnections
-        int increment = maxActiveConnections >> 2;
-        if (increment == 0)
-          increment = 1;
-        optimalTarget += increment;
-      }
-        
-      //System.out.println("maxTarget = "+maximumTarget+"; fairTarget = "+fairTarget+"; optimalTarget = "+optimalTarget);
-
-      // Now compute actual target
-      int target = maximumTarget;
-      if (target > fairTarget)
-        target = fairTarget;
-      if (target > optimalTarget)
-        target = optimalTarget;
-        
-      // Write these values to the service data variables.
-      // NOTE that there is a race condition here; the target value depends on all the calculations above being accurate, and not changing out from under us.
-      // So, that's why we have a write lock around the pool calculations.
-        
-      lockManager.updateServiceData(serviceTypeName, serviceName, pack(target, localInUse));
-        
-      // Now, update our localMax, if it needs it.
-      if (target == localMax)
-        return;
-      localMax = target;
-      notifyAll();
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(targetCalcLockName);
-    }
-  }
-
-  /** Shut down the bin, and release everything that is waiting on it.
-  */
-  public synchronized void shutDown(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    isAlive = false;
-    notifyAll();
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.endServiceActivity(serviceTypeName, serviceName);
-  }
-  
-  // Protected classes and methods
-  
-  protected static class SumClass implements IServiceDataAcceptor
-  {
-    protected final String serviceName;
-    protected int numServices = 0;
-    protected int globalTargetTally = 0;
-    protected int globalInUseTally = 0;
-    
-    public SumClass(String serviceName)
-    {
-      this.serviceName = serviceName;
-    }
-    
-    @Override
-    public boolean acceptServiceData(String serviceName, byte[] serviceData)
-      throws ManifoldCFException
-    {
-      numServices++;
-
-      if (!serviceName.equals(this.serviceName))
-      {
-        globalTargetTally += unpackTarget(serviceData);
-        globalInUseTally += unpackInUse(serviceData);
-      }
-      return false;
-    }
-
-    public int getNumServices()
-    {
-      return numServices;
-    }
-    
-    public int getGlobalTarget()
-    {
-      return globalTargetTally;
-    }
-    
-    public int getGlobalInUse()
-    {
-      return globalInUseTally;
-    }
-    
-  }
-  
-  protected static int unpackTarget(byte[] data)
-  {
-    if (data == null || data.length != 8)
-      return 0;
-    return (((int)data[0]) & 0xff) +
-      ((((int)data[1]) << 8) & 0xff00) +
-      ((((int)data[2]) << 16) & 0xff0000) +
-      ((((int)data[3]) << 24) & 0xff000000);
-  }
-
-  protected static int unpackInUse(byte[] data)
-  {
-    if (data == null || data.length != 8)
-      return 0;
-    return (((int)data[4]) & 0xff) +
-      ((((int)data[5]) << 8) & 0xff00) +
-      ((((int)data[6]) << 16) & 0xff0000) +
-      ((((int)data[7]) << 24) & 0xff000000);
-  }
-
-  protected static byte[] pack(int target, int inUse)
-  {
-    byte[] rval = new byte[8];
-    rval[0] = (byte)(target & 0xff);
-    rval[1] = (byte)((target >> 8) & 0xff);
-    rval[2] = (byte)((target >> 16) & 0xff);
-    rval[3] = (byte)((target >> 24) & 0xff);
-    rval[4] = (byte)(inUse & 0xff);
-    rval[5] = (byte)((inUse >> 8) & 0xff);
-    rval[6] = (byte)((inUse >> 16) & 0xff);
-    rval[7] = (byte)((inUse >> 24) & 0xff);
-    return rval;
-  }
-
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/FetchBin.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/FetchBin.java
deleted file mode 100644
index 4f30b0b..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/FetchBin.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.throttler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** Connection tracking for a bin.
-*
-* This class keeps track of information needed to figure out fetch rate throttling for connections,
-* on a bin-by-bin basis. 
-*
-* NOTE WELL: This is entirely local in operation
-*/
-public class FetchBin
-{
-  /** This is set to true until the bin is shut down. */
-  protected boolean isAlive = true;
-  /** This is the bin name which this connection pool belongs to */
-  protected final String binName;
-  /** Service type name */
-  protected final String serviceTypeName;
-  /** The (anonymous) service name */
-  protected final String serviceName;
-  /** The target calculation lock name */
-  protected final String targetCalcLockName;
-
-  /** This is the minimum time between fetches for this bin, in ms. */
-  protected long minTimeBetweenFetches = Long.MAX_VALUE;
-
-  /** The local minimum time between fetches */
-  protected long localMinimum = Long.MAX_VALUE;
-
-  /** This is the last time a fetch was done on this bin */
-  protected long lastFetchTime = 0L;
-  /** Is the next fetch reserved? */
-  protected boolean reserveNextFetch = false;
-
-  /** The service type prefix for fetch bins */
-  protected final static String serviceTypePrefix = "_FETCHBIN_";
-
-  /** The target calculation lock prefix */
-  protected final static String targetCalcLockPrefix = "_FETCHBINTARGET_";
-
-  /** Constructor. */
-  public FetchBin(IThreadContext threadContext, String throttlingGroupName, String binName)
-    throws ManifoldCFException
-  {
-    this.binName = binName;
-    this.serviceTypeName = buildServiceTypeName(throttlingGroupName, binName);
-    this.targetCalcLockName = buildTargetCalcLockName(throttlingGroupName, binName);
-    // Now, register and activate service anonymously, and record the service name we get.
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    this.serviceName = lockManager.registerServiceBeginServiceActivity(serviceTypeName, null, null);
-  }
-
-  protected static String buildServiceTypeName(String throttlingGroupName, String binName)
-  {
-    return serviceTypePrefix + throttlingGroupName + "_" + binName;
-  }
-
-  protected static String buildTargetCalcLockName(String throttlingGroupName, String binName)
-  {
-    return targetCalcLockPrefix + throttlingGroupName + "_" + binName;
-  }
-
-  /** Get the bin name. */
-  public String getBinName()
-  {
-    return binName;
-  }
-
-  /** Update the maximum number of active connections.
-  */
-  public synchronized void updateMinTimeBetweenFetches(long minTimeBetweenFetches)
-  {
-    // Update the number and wake up any waiting threads; they will take care of everything.
-    this.minTimeBetweenFetches = minTimeBetweenFetches;
-  }
-
-  /** Reserve a request to fetch a document from this bin.  The actual fetch is not yet committed
-  * with this call, but if it succeeds for all bins associated with the document, then the caller
-  * has permission to do the fetch, and can update the last fetch time.
-  *@return false if the fetch bin is being shut down.
-  */
-  public synchronized boolean reserveFetchRequest(IBreakCheck breakCheck)
-    throws InterruptedException, BreakException
-  {
-    // First wait for the ability to even get the next fetch from this bin
-    while (true)
-    {
-      if (!isAlive)
-        return false;
-      if (!reserveNextFetch)
-      {
-        reserveNextFetch = true;
-        return true;
-      }
-      if (breakCheck == null)
-      {
-        wait();
-      }
-      else
-      {
-        long amt = breakCheck.abortCheck();
-        wait(amt);
-      }
-    }
-  }
-  
-  /** Clear reserved request.
-  */
-  public synchronized void clearReservation()
-  {
-    if (!reserveNextFetch)
-      throw new IllegalStateException("Can't clear a fetch reservation we don't have");
-    reserveNextFetch = false;
-    notifyAll();
-  }
-  
-  /** Wait the necessary time to do the fetch.  Presumes we've reserved the next fetch
-  * rights already, via reserveFetchRequest().
-  *@return false if the wait did not complete because the bin was shut down.
-  */
-  public synchronized boolean waitNextFetch(IBreakCheck breakCheck)
-    throws InterruptedException, BreakException
-  {
-    // MHL
-    if (!reserveNextFetch)
-      throw new IllegalStateException("No fetch request reserved!");
-    
-    while (true)
-    {
-      if (!isAlive)
-        // Leave it to the caller to undo reservations
-        return false;
-      if (localMinimum == Long.MAX_VALUE)
-      {
-        // wait forever - but eventually someone will set a smaller interval and wake us up.
-        if (breakCheck == null)
-        {
-          wait();
-        }
-        else
-        {
-          long amt = breakCheck.abortCheck();
-          wait(amt);
-        }
-        // Back around
-      }
-      else
-      {
-        long currentTime = System.currentTimeMillis();
-        // Compute how long we have to wait, based on the current time and the time of the last fetch.
-        long waitAmt = lastFetchTime + localMinimum - currentTime;
-        if (waitAmt <= 0L)
-        {
-          // Note actual time we start the fetch.
-          if (currentTime > lastFetchTime)
-            lastFetchTime = currentTime;
-          reserveNextFetch = false;
-          notifyAll();
-          return true;
-        }
-        if (breakCheck == null)
-        {
-          wait(waitAmt);
-        }
-        else
-        {
-          long amt = breakCheck.abortCheck();
-          if (waitAmt < amt)
-            amt = waitAmt;
-          wait(amt);
-        }
-        // Back around
-      }
-    }
-  }
-
-  /** Poll this bin */
-  public synchronized void poll(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.enterWriteLock(targetCalcLockName);
-    try
-    {
-      // This is where the cross-cluster logic happens.
-      // Each service records the following information:
-      // -- the target rate, in fetches per millisecond
-      // -- the earliest possible time for the service's next fetch, in ms from start of epoch
-      // Target rates are apportioned in fetches-per-ms space, as follows:
-      // (1) Target rate is summed cross-cluster, excluding our local service.  This is GlobalTarget.
-      // (2) MaximumTarget is computed, which is Maximum-GlobalTarget.
-      // (3) FairTarget is computed, which is Maximum/numServices + rand(Maximum%numServices).
-      // (4) Finally, we compute Target rate by taking the minimum of MaximumTarget, FairTarget.
-      // The earliest time for the next fetch is computed as follows:
-      // (1) Find the LATEST most recent fetch time across the services, including an updated time for
-      //   the local service.
-      // (2) Compute the next possible fetch time, using the Target rate and that fetch time.
-      // (3) The new targeted fetch time will be set to that value.
-
-      SumClass sumClass = new SumClass(serviceName);
-      lockManager.scanServiceData(serviceTypeName, sumClass);
-
-      int numServices = sumClass.getNumServices();
-      if (numServices == 0)
-        return;
-      double globalTarget = sumClass.getGlobalTarget();
-      long earliestTargetTime = sumClass.getEarliestTime();
-      long currentTime = System.currentTimeMillis();
-      
-      if (lastFetchTime == 0L)
-        earliestTargetTime = currentTime;
-      else if (earliestTargetTime > lastFetchTime)
-        earliestTargetTime = lastFetchTime;
-      
-      // Now, compute the target rate
-      double globalMaxFetchesPerMillisecond;
-      double maximumTarget;
-      double fairTarget;
-      if (minTimeBetweenFetches == 0.0)
-      {
-        //System.out.println(binName+":Global minimum milliseconds per byte = 0.0");
-        globalMaxFetchesPerMillisecond = Double.MAX_VALUE;
-        maximumTarget = globalMaxFetchesPerMillisecond;
-        fairTarget = globalMaxFetchesPerMillisecond;
-      }
-      else
-      {
-        globalMaxFetchesPerMillisecond = 1.0 / minTimeBetweenFetches;
-        //System.out.println(binName+":Global max bytes per millisecond = "+globalMaxBytesPerMillisecond);
-        maximumTarget = globalMaxFetchesPerMillisecond - globalTarget;
-        if (maximumTarget < 0.0)
-          maximumTarget = 0.0;
-
-        // Compute FairTarget
-        fairTarget = globalMaxFetchesPerMillisecond / numServices;
-      }
-
-      // Now compute actual target
-      double inverseTarget = maximumTarget;
-      if (inverseTarget > fairTarget)
-        inverseTarget = fairTarget;
-
-      long target;
-      if (inverseTarget == 0.0)
-        target = Long.MAX_VALUE;
-      else
-        target = (long)(1.0/inverseTarget +0.5);
-      
-      long nextFetchTime = earliestTargetTime + target;
-      
-      lockManager.updateServiceData(serviceTypeName, serviceName, pack(inverseTarget, nextFetchTime));
-
-      // Update local parameters: the rate, and the next time.
-      // But in order to update the next time, we have to update the last time.
-      if (target == localMinimum && earliestTargetTime == lastFetchTime)
-        return;
-      //System.out.println(binName+":Setting localMinimum="+target+"; last fetch time="+earliestTargetTime);
-      localMinimum = target;
-      lastFetchTime = earliestTargetTime;
-      notifyAll();
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(targetCalcLockName);
-    }
-
-  }
-
-  /** Shut the bin down, and wake up all threads waiting on it.
-  */
-  public synchronized void shutDown(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    isAlive = false;
-    notifyAll();
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.endServiceActivity(serviceTypeName, serviceName);
-  }
-  
-  // Protected classes and methods
-  
-  protected static class SumClass implements IServiceDataAcceptor
-  {
-    protected final String serviceName;
-    protected int numServices = 0;
-    protected double globalTargetTally = 0;
-    protected long earliestTime = Long.MAX_VALUE;
-    
-    public SumClass(String serviceName)
-    {
-      this.serviceName = serviceName;
-    }
-    
-    @Override
-    public boolean acceptServiceData(String serviceName, byte[] serviceData)
-      throws ManifoldCFException
-    {
-      numServices++;
-
-      if (!serviceName.equals(this.serviceName))
-      {
-        globalTargetTally += unpackTarget(serviceData);
-        long checkTime = unpackEarliestTime(serviceData);
-        if (checkTime < earliestTime)
-          earliestTime = checkTime;
-      }
-      return false;
-    }
-
-    public int getNumServices()
-    {
-      return numServices;
-    }
-    
-    public double getGlobalTarget()
-    {
-      return globalTargetTally;
-    }
-    
-    public long getEarliestTime()
-    {
-      return earliestTime;
-    }
-  }
-
-  protected static double unpackTarget(byte[] data)
-  {
-    if (data == null || data.length != 8)
-      return 0.0;
-    return Double.longBitsToDouble((((long)data[0]) & 0xffL) +
-      ((((long)data[1]) << 8) & 0xff00L) +
-      ((((long)data[2]) << 16) & 0xff0000L) +
-      ((((long)data[3]) << 24) & 0xff000000L) +
-      ((((long)data[4]) << 32) & 0xff00000000L) +
-      ((((long)data[5]) << 40) & 0xff0000000000L) +
-      ((((long)data[6]) << 48) & 0xff000000000000L) +
-      ((((long)data[7]) << 56) & 0xff00000000000000L));
-  }
-
-  protected static long unpackEarliestTime(byte[] data)
-  {
-    if (data == null || data.length != 16)
-      return Long.MAX_VALUE;
-    return (((long)data[8]) & 0xffL) +
-      ((((long)data[9]) << 8) & 0xff00L) +
-      ((((long)data[10]) << 16) & 0xff0000L) +
-      ((((long)data[11]) << 24) & 0xff000000L) +
-      ((((long)data[12]) << 32) & 0xff00000000L) +
-      ((((long)data[13]) << 40) & 0xff0000000000L) +
-      ((((long)data[14]) << 48) & 0xff000000000000L) +
-      ((((long)data[15]) << 56) & 0xff00000000000000L);
-  }
-
-  protected static byte[] pack(double targetDouble, long earliestTime)
-  {
-    long target = Double.doubleToLongBits(targetDouble);
-    byte[] rval = new byte[16];
-    rval[0] = (byte)(target & 0xffL);
-    rval[1] = (byte)((target >> 8) & 0xffL);
-    rval[2] = (byte)((target >> 16) & 0xffL);
-    rval[3] = (byte)((target >> 24) & 0xffL);
-    rval[4] = (byte)((target >> 32) & 0xffL);
-    rval[5] = (byte)((target >> 40) & 0xffL);
-    rval[6] = (byte)((target >> 48) & 0xffL);
-    rval[7] = (byte)((target >> 56) & 0xffL);
-    rval[8] = (byte)(earliestTime & 0xffL);
-    rval[9] = (byte)((earliestTime >> 8) & 0xffL);
-    rval[10] = (byte)((earliestTime >> 16) & 0xffL);
-    rval[11] = (byte)((earliestTime >> 24) & 0xffL);
-    rval[12] = (byte)((earliestTime >> 32) & 0xffL);
-    rval[13] = (byte)((earliestTime >> 40) & 0xffL);
-    rval[14] = (byte)((earliestTime >> 48) & 0xffL);
-    rval[15] = (byte)((earliestTime >> 56) & 0xffL);
-    return rval;
-  }
-
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ThrottleBin.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ThrottleBin.java
deleted file mode 100644
index 6115f24..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ThrottleBin.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.throttler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-
-/** Throttles for a bin.
-* An instance of this class keeps track of the information needed to bandwidth throttle access
-* to a url belonging to a specific bin.
-*
-* In order to calculate
-* the effective "burst" fetches per second and bytes per second, we need to have some idea what the window is.
-* For example, a long hiatus from fetching could cause overuse of the server when fetching resumes, if the
-* window length is too long.
-*
-* One solution to this problem would be to keep a list of the individual fetches as records.  Then, we could
-* "expire" a fetch by discarding the old record.  However, this is quite memory consumptive for all but the
-* smallest intervals.
-*
-* Another, better, solution is to hook into the start and end of individual fetches.  These will, presumably, occur
-* at the fastest possible rate without long pauses spent doing something else.  The only complication is that
-* fetches may well overlap, so we need to "reference count" the fetches to know when to reset the counters.
-* For "fetches per second", we can simply make sure we "schedule" the next fetch at an appropriate time, rather
-* than keep records around.  The overall rate may therefore be somewhat less than the specified rate, but that's perfectly
-* acceptable.
-*
-* Some notes on the algorithms used to limit server bandwidth impact
-* ==================================================================
-*
-* In a single connection case, the algorithm we'd want to use works like this.  On the first chunk of a series,
-* the total length of time and the number of bytes are recorded.  Then, prior to each subsequent chunk, a calculation
-* is done which attempts to hit the bandwidth target by the end of the chunk read, using the rate of the first chunk
-* access as a way of estimating how long it will take to fetch those next n bytes.
-*
-* For a multi-connection case, which this is, it's harder to either come up with a good maximum bandwidth estimate,
-* and harder still to "hit the target", because simultaneous fetches will intrude.  The strategy is therefore:
-*
-* 1) The first chunk of any series should proceed without interference from other connections to the same server.
-*    The goal here is to get a decent quality estimate without any possibility of overwhelming the server.
-*
-* 2) The bandwidth of the first chunk is treated as the "maximum bandwidth per connection".  That is, if other
-*    connections are going on, we can presume that each connection will use at most the bandwidth that the first fetch
-*    took.  Thus, by generating end-time estimates based on this number, we are actually being conservative and
-*    using less server bandwidth.
-*
-* 3) For chunks that have started but not finished, we keep track of their size and estimated elapsed time in order to schedule when
-*    new chunks from other connections can start.
-*
-* NOTE WELL: This is entirely local in operation
-*/
-public class ThrottleBin
-{
-  /** This signals whether the bin is alive or not. */
-  protected boolean isAlive = true;
-  /** This is the bin name which this throttle belongs to. */
-  protected final String binName;
-  /** Service type name */
-  protected final String serviceTypeName;
-  /** The (anonymous) service name */
-  protected final String serviceName;
-  /** The target calculation lock name */
-  protected final String targetCalcLockName;
-
-  /** The minimum milliseconds per byte */
-  protected double minimumMillisecondsPerByte = Double.MAX_VALUE;
-
-  /** The local minimum milliseconds per byte */
-  protected double localMinimum = Double.MAX_VALUE;
-  
-  /** This is the reference count for this bin (which records active references) */
-  protected volatile int refCount = 0;
-  /** The inverse rate estimate of the first fetch, in ms/byte */
-  protected double rateEstimate = 0.0;
-  /** Flag indicating whether a rate estimate is needed */
-  protected volatile boolean estimateValid = false;
-  /** Flag indicating whether rate estimation is in progress yet */
-  protected volatile boolean estimateInProgress = false;
-  /** The start time of this series */
-  protected long seriesStartTime = -1L;
-  /** Total actual bytes read in this series; this includes fetches in progress */
-  protected long totalBytesRead = -1L;
-
-  /** The service type prefix for throttle bins */
-  protected final static String serviceTypePrefix = "_THROTTLEBIN_";
-  
-  /** The target calculation lock prefix */
-  protected final static String targetCalcLockPrefix = "_THROTTLEBINTARGET_";
-
-  /** Constructor. */
-  public ThrottleBin(IThreadContext threadContext, String throttlingGroupName, String binName)
-    throws ManifoldCFException
-  {
-    this.binName = binName;
-    this.serviceTypeName = buildServiceTypeName(throttlingGroupName, binName);
-    this.targetCalcLockName = buildTargetCalcLockName(throttlingGroupName, binName);
-    // Now, register and activate service anonymously, and record the service name we get.
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    this.serviceName = lockManager.registerServiceBeginServiceActivity(serviceTypeName, null, null);
-  }
-
-  protected static String buildServiceTypeName(String throttlingGroupName, String binName)
-  {
-    return serviceTypePrefix + throttlingGroupName + "_" + binName;
-  }
-  
-  protected static String buildTargetCalcLockName(String throttlingGroupName, String binName)
-  {
-    return targetCalcLockPrefix + throttlingGroupName + "_" + binName;
-  }
-
-  /** Get the bin name. */
-  public String getBinName()
-  {
-    return binName;
-  }
-
-  /** Update minimumMillisecondsPerBytePerServer */
-  public synchronized void updateMinimumMillisecondsPerByte(double min)
-  {
-    this.minimumMillisecondsPerByte = min;
-  }
-  
-  /** Note the start of a fetch operation for a bin.  Call this method just before the actual stream access begins.
-  * May wait until schedule allows.
-  */
-  public void beginFetch()
-  {
-    synchronized (this)
-    {
-      if (refCount == 0)
-      {
-        // Now, reset bandwidth throttling counters
-        estimateValid = false;
-        rateEstimate = 0.0;
-        totalBytesRead = 0L;
-        estimateInProgress = false;
-        seriesStartTime = -1L;
-      }
-      refCount++;
-    }
-
-  }
-
-  /** Abort the fetch.
-  */
-  public void abortFetch()
-  {
-    synchronized (this)
-    {
-      refCount--;
-    }
-  }
-    
-  /** Note the start of an individual byte read of a specified size.  Call this method just before the
-  * read request takes place.  Performs the necessary delay prior to reading specified number of bytes from the server.
-  *@return false if the wait was interrupted due to the bin being shut down.
-  */
-  public boolean beginRead(int byteCount, IBreakCheck breakCheck)
-    throws InterruptedException, BreakException
-  {
-    synchronized (this)
-    {
-      while (true)
-      {
-        if (!isAlive)
-          return false;
-        if (estimateInProgress)
-        {
-          if (breakCheck == null)
-          {
-            wait();
-          }
-          else
-          {
-            long amt = breakCheck.abortCheck();
-            wait(amt);
-          }
-          continue;
-        }
-
-        // Update the current time
-        long currentTime = System.currentTimeMillis();
-        
-        if (estimateValid == false)
-        {
-          seriesStartTime = currentTime;
-          estimateInProgress = true;
-          // Add these bytes to the estimated total
-          totalBytesRead += (long)byteCount;
-          // Exit early; this thread isn't going to do any waiting
-          return true;
-        }
-
-        // If we haven't set a proper throttle yet, wait until we do.
-        if (localMinimum == Double.MAX_VALUE)
-        {
-          if (breakCheck == null)
-          {
-            wait();
-          }
-          else
-          {
-            long amt = breakCheck.abortCheck();
-            wait(amt);
-          }
-          continue;
-        }
-        
-        // Estimate the time this read will take, and wait accordingly
-        long estimatedTime = (long)(rateEstimate * (double)byteCount);
-
-        // Figure out how long the total byte count should take, to meet the constraint
-        long desiredEndTime = seriesStartTime + (long)(((double)(totalBytesRead + (long)byteCount)) * localMinimum);
-
-
-        // The wait time is the difference between our desired end time, minus the estimated time to read the data, and the
-        // current time.  But it can't be negative.
-        long waitTime = (desiredEndTime - estimatedTime) - currentTime;
-
-        // If no wait is needed, go ahead and update what needs to be updated and exit.  Otherwise, do the wait.
-        if (waitTime <= 0L)
-        {
-          // Add these bytes to the estimated total
-          totalBytesRead += (long)byteCount;
-          return true;
-        }
-        
-        if (breakCheck == null)
-        {
-          this.wait(waitTime);
-        }
-        else
-        {
-          long amt = breakCheck.abortCheck();
-          if (waitTime < amt)
-            amt = waitTime;
-          wait(amt);
-        }
-        // Back around again...
-      }
-    }
-  }
-
-  /** Abort a read in progress.
-  */
-  public void abortRead()
-  {
-    synchronized (this)
-    {
-      if (estimateInProgress)
-      {
-        estimateInProgress = false;
-        notifyAll();
-      }
-    }
-  }
-    
-  /** Note the end of an individual read from the server.  Call this just after an individual read completes.
-  * Pass the actual number of bytes read to the method.
-  */
-  public void endRead(int originalCount, int actualCount)
-  {
-    synchronized (this)
-    {
-      totalBytesRead = totalBytesRead + (long)actualCount - (long)originalCount;
-      if (estimateInProgress)
-      {
-        if (actualCount == 0)
-          // Didn't actually get any bytes, so use 0.0
-          rateEstimate = 0.0;
-        else
-          rateEstimate = ((double)(System.currentTimeMillis() - seriesStartTime))/(double)actualCount;
-        estimateValid = true;
-        estimateInProgress = false;
-        notifyAll();
-      }
-    }
-  }
-
-  /** Note the end of a fetch operation.  Call this method just after the fetch completes.
-  */
-  public boolean endFetch()
-  {
-    synchronized (this)
-    {
-      refCount--;
-      return (refCount == 0);
-    }
-
-  }
-
-  /** Poll this bin */
-  public synchronized void poll(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    
-    // Enter write lock
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.enterWriteLock(targetCalcLockName);
-    try
-    {
-      // The cross-cluster apportionment of byte fetching goes here.
-      // For byte-rate throttling, the apportioning algorithm is simple.  First, it's done
-      // in bytes per millisecond, which is the inverse of what we actually use for the
-      // rest of this class.  Each service posts its current value for the maximum bytes
-      // per millisecond, and a target value for the same.
-      // The target value is computed as follows:
-      // (1) Target is summed cross-cluster, excluding our local service.  This is GlobalTarget.
-      // (2) MaximumTarget is computed, which is Maximum-GlobalTarget.
-      // (3) FairTarget is computed, which is Maximum/numServices + rand(Maximum%numServices).
-      // (4) Finally, we compute Target by taking the minimum of MaximumTarget, FairTarget.
-
-      // Compute MaximumTarget
-      SumClass sumClass = new SumClass(serviceName);
-      lockManager.scanServiceData(serviceTypeName, sumClass);
-        
-      int numServices = sumClass.getNumServices();
-      if (numServices == 0)
-        return;
-      double globalTarget = sumClass.getGlobalTarget();
-      double globalMaxBytesPerMillisecond;
-      double maximumTarget;
-      double fairTarget;
-      if (minimumMillisecondsPerByte == 0.0)
-      {
-        //System.out.println(binName+":Global minimum milliseconds per byte = 0.0");
-        globalMaxBytesPerMillisecond = Double.MAX_VALUE;
-        maximumTarget = globalMaxBytesPerMillisecond;
-        fairTarget = globalMaxBytesPerMillisecond;
-      }
-      else
-      {
-        globalMaxBytesPerMillisecond = 1.0 / minimumMillisecondsPerByte;
-        //System.out.println(binName+":Global max bytes per millisecond = "+globalMaxBytesPerMillisecond);
-        maximumTarget = globalMaxBytesPerMillisecond - globalTarget;
-        if (maximumTarget < 0.0)
-          maximumTarget = 0.0;
-
-        // Compute FairTarget
-        fairTarget = globalMaxBytesPerMillisecond / numServices;
-      }
-
-      // Now compute actual target
-      double inverseTarget = maximumTarget;
-      if (inverseTarget > fairTarget)
-        inverseTarget = fairTarget;
-
-      //System.out.println(binName+":Inverse target = "+inverseTarget+"; maximumTarget = "+maximumTarget+"; fairTarget = "+fairTarget);
-      
-      // Write these values to the service data variables.
-      // NOTE that there is a race condition here; the target value depends on all the calculations above being accurate, and not changing out from under us.
-      // So, that's why we have a write lock around the pool calculations.
-        
-      lockManager.updateServiceData(serviceTypeName, serviceName, pack(inverseTarget));
-
-      // Update our local minimum.
-      double target;
-      if (inverseTarget == 0.0)
-        target = Double.MAX_VALUE;
-      else
-        target = 1.0 / inverseTarget;
-      
-      // Reset local minimum, if it has changed.
-      if (target == localMinimum)
-        return;
-      //System.out.println(binName+":Updating local minimum to "+target);
-      localMinimum = target;
-      notifyAll();
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(targetCalcLockName);
-    }
-
-  }
-
-  /** Shut down this bin.
-  */
-  public synchronized void shutDown(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    isAlive = false;
-    notifyAll();
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    lockManager.endServiceActivity(serviceTypeName, serviceName);
-  }
-  
-  // Protected classes and methods
-  
-  protected static class SumClass implements IServiceDataAcceptor
-  {
-    protected final String serviceName;
-    protected int numServices = 0;
-    protected double globalTargetTally = 0;
-    
-    public SumClass(String serviceName)
-    {
-      this.serviceName = serviceName;
-    }
-    
-    @Override
-    public boolean acceptServiceData(String serviceName, byte[] serviceData)
-      throws ManifoldCFException
-    {
-      numServices++;
-
-      if (!serviceName.equals(this.serviceName))
-      {
-        globalTargetTally += unpackTarget(serviceData);
-      }
-      return false;
-    }
-
-    public int getNumServices()
-    {
-      return numServices;
-    }
-    
-    public double getGlobalTarget()
-    {
-      return globalTargetTally;
-    }
-    
-  }
-  
-  protected static double unpackTarget(byte[] data)
-  {
-    if (data == null || data.length != 8)
-      return 0.0;
-    return Double.longBitsToDouble((((long)data[0]) & 0xffL) +
-      ((((long)data[1]) << 8) & 0xff00L) +
-      ((((long)data[2]) << 16) & 0xff0000L) +
-      ((((long)data[3]) << 24) & 0xff000000L) +
-      ((((long)data[4]) << 32) & 0xff00000000L) +
-      ((((long)data[5]) << 40) & 0xff0000000000L) +
-      ((((long)data[6]) << 48) & 0xff000000000000L) +
-      ((((long)data[7]) << 56) & 0xff00000000000000L));
-  }
-
-  protected static byte[] pack(double targetDouble)
-  {
-    long target = Double.doubleToLongBits(targetDouble);
-    byte[] rval = new byte[8];
-    rval[0] = (byte)(target & 0xffL);
-    rval[1] = (byte)((target >> 8) & 0xffL);
-    rval[2] = (byte)((target >> 16) & 0xffL);
-    rval[3] = (byte)((target >> 24) & 0xffL);
-    rval[4] = (byte)((target >> 32) & 0xffL);
-    rval[5] = (byte)((target >> 40) & 0xffL);
-    rval[6] = (byte)((target >> 48) & 0xffL);
-    rval[7] = (byte)((target >> 56) & 0xffL);
-    return rval;
-  }
-
-
-}
-
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ThrottleGroups.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ThrottleGroups.java
deleted file mode 100644
index 9209b1d..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/ThrottleGroups.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.throttler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import java.util.*;
-
-/** An implementation of IThrottleGroups, which establishes a JVM-wide
-* pool of throttlers that can be used as a resource by any connector that needs
-* it.
-*/
-public class ThrottleGroups implements IThrottleGroups
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** The thread context */
-  protected final IThreadContext threadContext;
-    
-  /** The actual static pool */
-  protected final static Throttler throttler = new Throttler();
-  
-  /** Constructor */
-  public ThrottleGroups(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get all existing throttle groups for a throttle group type.
-  * The throttle group type typically describes a connector class, while the throttle group represents
-  * a namespace of bin names specific to that connector class.
-  *@param throttleGroupType is the throttle group type.
-  *@return the set of throttle groups for that group type.
-  */
-  @Override
-  public Set<String> getThrottleGroups(String throttleGroupType)
-    throws ManifoldCFException
-  {
-    return throttler.getThrottleGroups(threadContext, throttleGroupType);
-  }
-  
-  /** Remove a throttle group.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  */
-  @Override
-  public void removeThrottleGroup(String throttleGroupType, String throttleGroup)
-    throws ManifoldCFException
-  {
-    throttler.removeThrottleGroup(threadContext, throttleGroupType, throttleGroup);
-  }
-  
-  /** Set or update throttle specification for a throttle group.  This creates the
-  * throttle group if it does not yet exist.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param throttleSpec is the desired throttle specification object.
-  */
-  @Override
-  public void createOrUpdateThrottleGroup(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
-    throws ManifoldCFException
-  {
-    throttler.createOrUpdateThrottleGroup(threadContext, throttleGroupType, throttleGroup, throttleSpec);
-  }
-
-  /** Construct connection throttler for connections with specific bin names.  This object is meant to be embedded with a connection
-  * pool of similar objects, and used to gate the creation of new connections in that pool.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames are the connection type bin names.
-  *@return the connection throttling object, or null if the pool is being shut down.
-  */
-  @Override
-  public IConnectionThrottler obtainConnectionThrottler(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException
-  {
-    java.util.Arrays.sort(binNames);
-    return throttler.obtainConnectionThrottler(threadContext, throttleGroupType, throttleGroup, binNames);
-  }
-
-  /** Poll periodically, to update cluster-wide statistics and allocation.
-  *@param throttleGroupType is the throttle group type to update.
-  */
-  @Override
-  public void poll(String throttleGroupType)
-    throws ManifoldCFException
-  {
-    throttler.poll(threadContext, throttleGroupType);
-  }
-  
-  /** Poll periodically, to update ALL cluster-wide statistics and allocation.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    throttler.poll(threadContext);
-  }
-
-  /** Free unused resources.
-  */
-  @Override
-  public void freeUnusedResources()
-    throws ManifoldCFException
-  {
-    throttler.freeUnusedResources(threadContext);
-  }
-  
-  /** Shut down throttler permanently.
-  */
-  @Override
-  public void destroy()
-    throws ManifoldCFException
-  {
-    throttler.destroy(threadContext);
-  }
-
-}
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/Throttler.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/Throttler.java
deleted file mode 100644
index 2ff4943..0000000
--- a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/throttler/Throttler.java
+++ /dev/null
@@ -1,1275 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.throttler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import java.util.*;
-import java.util.concurrent.atomic.*;
-
-/** A Throttler object creates a virtual pool of connections to resources
-* whose access needs to be throttled in number, rate of use, and byte rate.
-* This code is modeled on the code for distributed connection pools, and is intended
-* to work in a similar manner.  Basically, a periodic assessment is done about what the
-* local throttling parameters should be (on a per-pool basis), and the local throttling
-* activities then adjust what they are doing based on the new parameters.  A service
-* model is used to keep track of which pools have what clients working with them.
-* This implementation has the advantage that:
-* (1) Only local throttling ever takes place on a method-by-method basis, which makes
-*   it possible to use throttling even in streams and background threads;
-* (2) Throttling resources are apportioned fairly, on average, between all the various
-*   cluster members, so it is unlikely that any persistent starvation conditions can
-*   arise.
-*/
-public class Throttler
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Throttle group hash table.  Keyed by throttle group type, value is throttling groups */
-  protected final Map<String,ThrottlingGroups> throttleGroupsHash = new HashMap<String,ThrottlingGroups>();
-
-  /** Create a throttler instance.  Usually there will be one of these per connector
-  * type that needs throttling.
-  */
-  public Throttler()
-  {
-  }
-  
-  // There are a lot of synchronizers to coordinate here.  They are indeed hierarchical.  It is not possible to simply
-  // throw a synchronizer at every level, and require that we hold all of them, because when we wait somewhere in the
-  // inner level, we will continue to hold locks and block access to all the outer levels.
-  //
-  // Instead, I've opted for a model whereby individual resources are protected.  This is tricky to coordinate, though,
-  // because (for instance) after a resource has been removed from the hash table, it had better be cleaned up
-  // thoroughly before the outer lock is removed, or two versions of the resource might wind up coming into existence.
-  // The general rule is therefore:
-  // (1) Creation or deletion of resources involves locking the parent where the resource is being added or removed
-  // (2) Anything that waits CANNOT also add or remove.
-  
-  /** Get all existing throttle groups for a throttle group type.
-  * The throttle group type typically describes a connector class, while the throttle group represents
-  * a namespace of bin names specific to that connector class.
-  *@param throttleGroupType is the throttle group type.
-  *@return the set of throttle groups for that group type.
-  */
-  public Set<String> getThrottleGroups(IThreadContext threadContext, String throttleGroupType)
-    throws ManifoldCFException
-  {
-    synchronized (throttleGroupsHash)
-    {
-      return throttleGroupsHash.keySet();
-    }
-  }
-  
-  /** Remove a throttle group.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  */
-  public void removeThrottleGroup(IThreadContext threadContext, String throttleGroupType, String throttleGroup)
-    throws ManifoldCFException
-  {
-    // Removal.  Lock the whole hierarchy.
-    synchronized (throttleGroupsHash)
-    {
-      ThrottlingGroups tg = throttleGroupsHash.get(throttleGroupType);
-      if (tg != null)
-      {
-        tg.removeThrottleGroup(threadContext, throttleGroup);
-      }
-    }
-  }
-  
-  /** Set or update throttle specification for a throttle group.  This creates the
-  * throttle group if it does not yet exist.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param throttleSpec is the desired throttle specification object.
-  */
-  public void createOrUpdateThrottleGroup(IThreadContext threadContext, String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
-    throws ManifoldCFException
-  {
-    // Potential addition.  Lock the whole hierarchy.
-    synchronized (throttleGroupsHash)
-    {
-      ThrottlingGroups tg = throttleGroupsHash.get(throttleGroupType);
-      if (tg == null)
-      {
-        tg = new ThrottlingGroups(throttleGroupType);
-        throttleGroupsHash.put(throttleGroupType, tg);
-      }
-      tg.createOrUpdateThrottleGroup(threadContext, throttleGroup, throttleSpec);
-    }
-  }
-
-  /** Construct connection throttler for connections with specific bin names.  This object is meant to be embedded with a connection
-  * pool of similar objects, and used to gate the creation of new connections in that pool.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames are the connection type bin names.
-  *@return the connection throttling object, or null if the pool is being shut down.
-  */
-  public IConnectionThrottler obtainConnectionThrottler(IThreadContext threadContext, String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException
-  {
-    // No waiting, so lock the entire tree.
-    synchronized (throttleGroupsHash)
-    {
-      ThrottlingGroups tg = throttleGroupsHash.get(throttleGroupType);
-      if (tg != null)
-        return tg.obtainConnectionThrottler(threadContext, throttleGroup, binNames);
-      return null;
-    }
-  }
-  
-  /** Poll periodically.
-  */
-  public void poll(IThreadContext threadContext, String throttleGroupType)
-    throws ManifoldCFException
-  {
-    // No waiting, so lock the entire tree.
-    synchronized (throttleGroupsHash)
-    {
-      ThrottlingGroups tg = throttleGroupsHash.get(throttleGroupType);
-      if (tg != null)
-        tg.poll(threadContext);
-    }
-      
-  }
-
-  /** Poll ALL bins periodically.
-  */
-  public void poll(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // No waiting, so lock the entire tree.
-    synchronized (throttleGroupsHash)
-    {
-      for (ThrottlingGroups tg : throttleGroupsHash.values())
-      {
-        tg.poll(threadContext);
-      }
-    }
-      
-  }
-  
-  /** Free unused resources.
-  */
-  public void freeUnusedResources(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // This potentially affects the entire hierarchy.
-    // Go through the whole pool and clean it out
-    synchronized (throttleGroupsHash)
-    {
-      Iterator<ThrottlingGroups> iter = throttleGroupsHash.values().iterator();
-      while (iter.hasNext())
-      {
-        ThrottlingGroups p = iter.next();
-        p.freeUnusedResources(threadContext);
-      }
-    }
-  }
-  
-  /** Shut down all throttlers and deregister them.
-  */
-  public void destroy(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // This affects the entire hierarchy, so lock the whole thing.
-    // Go through the whole pool and clean it out
-    synchronized (throttleGroupsHash)
-    {
-      Iterator<ThrottlingGroups> iter = throttleGroupsHash.values().iterator();
-      while (iter.hasNext())
-      {
-        ThrottlingGroups p = iter.next();
-        p.destroy(threadContext);
-        iter.remove();
-      }
-    }
-  }
-
-  // Protected methods and classes
-  
-  protected static String buildThrottlingGroupName(String throttlingGroupType, String throttlingGroupName)
-  {
-    return throttlingGroupType + "_" + throttlingGroupName;
-  }
-
-  /** This class represents a throttling group pool */
-  protected class ThrottlingGroups
-  {
-    /** The throttling group type for this throttling group pool */
-    protected final String throttlingGroupTypeName;
-    /** The pool of individual throttle group services for this pool, keyed by throttle group name */
-    protected final Map<String,ThrottlingGroup> groups = new HashMap<String,ThrottlingGroup>();
-    
-    public ThrottlingGroups(String throttlingGroupTypeName)
-    {
-      this.throttlingGroupTypeName = throttlingGroupTypeName;
-    }
-    
-    /** Update throttle specification */
-    public void createOrUpdateThrottleGroup(IThreadContext threadContext, String throttleGroup, IThrottleSpec throttleSpec)
-      throws ManifoldCFException
-    {
-      synchronized (groups)
-      {
-        ThrottlingGroup g = groups.get(throttleGroup);
-        if (g == null)
-        {
-          g = new ThrottlingGroup(threadContext, throttlingGroupTypeName, throttleGroup, throttleSpec);
-          groups.put(throttleGroup, g);
-        }
-        else
-        {
-          g.updateThrottleSpecification(throttleSpec);
-        }
-      }
-    }
-    
-    /** Obtain connection throttler.
-    *@return the throttler, or null of the hierarchy has changed.
-    */
-    public IConnectionThrottler obtainConnectionThrottler(IThreadContext threadContext, String throttleGroup, String[] binNames)
-      throws ManifoldCFException
-    {
-      synchronized (groups)
-      {
-        ThrottlingGroup g = groups.get(throttleGroup);
-        if (g == null)
-          return null;
-        return g.obtainConnectionThrottler(threadContext, binNames);
-      }
-    }
-    
-    /** Remove specified throttle group */
-    public void removeThrottleGroup(IThreadContext threadContext, String throttleGroup)
-      throws ManifoldCFException
-    {
-      // Must synch the whole thing, because otherwise there would be a risk of someone recreating the
-      // group right after we removed it from the map, and before we destroyed it.
-      synchronized (groups)
-      {
-        ThrottlingGroup g = groups.remove(throttleGroup);
-        if (g != null)
-        {
-          g.destroy(threadContext);
-        }
-      }
-    }
-    
-    /** Poll this set of throttle groups.
-    */
-    public void poll(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      synchronized (groups)
-      {
-        Iterator<String> iter = groups.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String throttleGroup = iter.next();
-          ThrottlingGroup p = groups.get(throttleGroup);
-          p.poll(threadContext);
-        }
-      }
-    }
-
-    /** Free unused resources */
-    public void freeUnusedResources(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      synchronized (groups)
-      {
-        Iterator<ThrottlingGroup> iter = groups.values().iterator();
-        while (iter.hasNext())
-        {
-          ThrottlingGroup g = iter.next();
-          g.freeUnusedResources(threadContext);
-        }
-      }
-    }
-    
-    /** Destroy and shutdown all */
-    public void destroy(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      synchronized (groups)
-      {
-        Iterator<ThrottlingGroup> iter = groups.values().iterator();
-        while (iter.hasNext())
-        {
-          ThrottlingGroup p = iter.next();
-          p.destroy(threadContext);
-          iter.remove();
-        }
-      }
-    }
-  }
-  
-  /** This class represents a throttling group, of a specific throttling group type.  It basically
-  * describes an entire self-consistent throttling environment.
-  */
-  protected class ThrottlingGroup
-  {
-    /** The throttling group name */
-    protected final String throttlingGroupName;
-    /** The current throttle spec */
-    protected IThrottleSpec throttleSpec;
-    
-    /** The connection bins */
-    protected final Map<String,ConnectionBin> connectionBins = new HashMap<String,ConnectionBin>();
-    /** The fetch bins */
-    protected final Map<String,FetchBin> fetchBins = new HashMap<String,FetchBin>();
-    /** The throttle bins */
-    protected final Map<String,ThrottleBin> throttleBins = new HashMap<String,ThrottleBin>();
-
-    // For synchronization, we use several in this class.
-    // Modification to the connectionBins, fetchBins, or throttleBins hashes uses the appropriate local synchronizer.
-    // Changes to other local variables use the main synchronizer.
-    
-    /** Constructor
-    */
-    public ThrottlingGroup(IThreadContext threadContext, String throttlingGroupType, String throttleGroup, IThrottleSpec throttleSpec)
-      throws ManifoldCFException
-    {
-      this.throttlingGroupName = buildThrottlingGroupName(throttlingGroupType, throttleGroup);
-      this.throttleSpec = throttleSpec;
-      // Once all that is done, perform the initial setting of all the bin cutoffs
-      poll(threadContext);
-    }
-
-    /** Create a bunch of bins, corresponding to the bin names specified.
-    * Note that this also registers them as services etc.
-    *@param binNames describes the set of bins to create.
-    */
-    public synchronized IConnectionThrottler obtainConnectionThrottler(IThreadContext threadContext, String[] binNames)
-      throws ManifoldCFException
-    {
-      synchronized (connectionBins)
-      {
-        for (String binName : binNames)
-        {
-          ConnectionBin bin = connectionBins.get(binName);
-          if (bin == null)
-          {
-            bin = new ConnectionBin(threadContext, throttlingGroupName, binName);
-            connectionBins.put(binName, bin);
-          }
-        }
-      }
-      
-      synchronized (fetchBins)
-      {
-        for (String binName : binNames)
-        {
-          FetchBin bin = fetchBins.get(binName);
-          if (bin == null)
-          {
-            bin = new FetchBin(threadContext, throttlingGroupName, binName);
-            fetchBins.put(binName, bin);
-          }
-        }
-      }
-      
-      synchronized (throttleBins)
-      {
-        for (String binName : binNames)
-        {
-          ThrottleBin bin = throttleBins.get(binName);
-          if (bin == null)
-          {
-            bin = new ThrottleBin(threadContext, throttlingGroupName, binName);
-            throttleBins.put(binName, bin);
-          }
-        }
-      }
-      
-      return new ConnectionThrottler(this, binNames);
-    }
-    
-    /** Update the throttle spec.
-    *@param throttleSpec is the new throttle spec for this throttle group.
-    */
-    public synchronized void updateThrottleSpecification(IThrottleSpec throttleSpec)
-      throws ManifoldCFException
-    {
-      this.throttleSpec = throttleSpec;
-    }
-    
-    
-    // IConnectionThrottler support methods
-    
-    /** Wait for a connection to become available.
-    *@param poolCount is a description of how many connections
-    * are available in the current pool, across all bins.
-    *@return the IConnectionThrottler codes for results.
-    */
-    public int waitConnectionAvailable(String[] binNames, AtomicInteger[] poolCounts, IBreakCheck breakCheck)
-      throws InterruptedException, BreakException
-    {
-      // Each bin can signal something different.  Bins that signal
-      // CONNECTION_FROM_NOWHERE are shutting down, but there's also
-      // apparently the conflicting possibilities of distinct answers of
-      // CONNECTION_FROM_POOL and CONNECTION_FROM_CREATION.
-      // However: the pool count we track is in fact N * the actual pool count,
-      // where N is the number of bins in each connection.  This means that a conflict 
-      // is ALWAYS due to two entities simultaneously calling waitConnectionAvailable(),
-      // and deadlocking each other.  The solution is therefore to back off and retry.
-
-      // This is the retry loop
-      while (true)
-      {
-        int currentRecommendation = IConnectionThrottler.CONNECTION_FROM_NOWHERE;
-        
-        boolean retry = false;
-
-        // First, make sure all the bins exist, and reserve a slot in each
-        int i = 0;
-        while (i < binNames.length)
-        {
-          String binName = binNames[i];
-          ConnectionBin bin;
-          synchronized (connectionBins)
-          {
-            bin = connectionBins.get(binName);
-          }
-          if (bin != null)
-          {
-            // Reserve a slot
-            int result;
-            try
-            {
-              result = bin.waitConnectionAvailable(poolCounts[i],breakCheck);
-            }
-            catch (Throwable e)
-            {
-              while (i > 0)
-              {
-                i--;
-                binName = binNames[i];
-                synchronized (connectionBins)
-                {
-                  bin = connectionBins.get(binName);
-                }
-                if (bin != null)
-                  bin.undoReservation(currentRecommendation, poolCounts[i]);
-              }
-              if (e instanceof BreakException)
-                throw (BreakException)e;
-              if (e instanceof InterruptedException)
-                throw (InterruptedException)e;
-              if (e instanceof Error)
-                throw (Error)e;
-              if (e instanceof RuntimeException)
-                throw (RuntimeException)e;
-              throw new RuntimeException("Unexpected exception of type '"+e.getClass().getName()+"': "+e.getMessage(),e);
-            }
-            if (result == IConnectionThrottler.CONNECTION_FROM_NOWHERE)
-            {
-              // Release previous reservations, and either return, or retry
-              while (i > 0)
-              {
-                i--;
-                binName = binNames[i];
-                synchronized (connectionBins)
-                {
-                  bin = connectionBins.get(binName);
-                }
-                if (bin != null)
-                  bin.undoReservation(currentRecommendation, poolCounts[i]);
-              }
-              return result;
-            }
-
-            if (currentRecommendation != IConnectionThrottler.CONNECTION_FROM_NOWHERE && currentRecommendation != result)
-            {
-              // Release all previous reservations, including this one, and either return, or retry
-              bin.undoReservation(result, poolCounts[i]);
-              while (i > 0)
-              {
-                i--;
-                binName = binNames[i];
-                synchronized (connectionBins)
-                {
-                  bin = connectionBins.get(binName);
-                }
-                if (bin != null)
-                  bin.undoReservation(currentRecommendation, poolCounts[i]);
-              }
-
-              // Break out of the outer loop so we can retry
-              retry = true;
-              break;
-            }
-
-            if (currentRecommendation == IConnectionThrottler.CONNECTION_FROM_NOWHERE)
-              currentRecommendation = result;
-          }
-          i++;
-        }
-        
-        if (retry)
-          continue;
-        
-        // Complete the reservation process (if that is what we decided)
-        if (currentRecommendation == IConnectionThrottler.CONNECTION_FROM_CREATION)
-        {
-          // All reservations have been made!  Convert them.
-          for (String binName : binNames)
-          {
-            ConnectionBin bin;
-            synchronized (connectionBins)
-            {
-              bin = connectionBins.get(binName);
-            }
-            if (bin != null)
-              bin.noteConnectionCreation();
-          }
-        }
-
-        return currentRecommendation;
-      }
-      
-    }
-    
-    public IFetchThrottler getNewConnectionFetchThrottler(String[] binNames)
-    {
-      return new FetchThrottler(this, binNames);
-    }
-    
-    public boolean noteReturnedConnection(String[] binNames)
-    {
-      // If ANY of the bins think the connection should be destroyed, then that will be
-      // the recommendation.
-      synchronized (connectionBins)
-      {
-        boolean destroyConnection = false;
-
-        for (String binName : binNames)
-        {
-          ConnectionBin bin = connectionBins.get(binName);
-          if (bin != null)
-          {
-            destroyConnection |= bin.shouldReturnedConnectionBeDestroyed();
-          }
-        }
-        
-        return destroyConnection;
-      }
-    }
-    
-    public boolean checkDestroyPooledConnection(String[] binNames, AtomicInteger[] poolCounts)
-    {
-      // Only if all believe we can destroy a pool connection, will we do it.
-      // This is because some pools may be empty, etc.
-      synchronized (connectionBins)
-      {
-        boolean destroyConnection = false;
-
-        int i = 0;
-        while (i < binNames.length)
-        {
-          String binName = binNames[i];
-          ConnectionBin bin = connectionBins.get(binName);
-          if (bin != null)
-          {
-            int result = bin.shouldPooledConnectionBeDestroyed(poolCounts[i]);
-            if (result == ConnectionBin.CONNECTION_POOLEMPTY)
-            {
-              // Give up now, and undo all the other bins
-              while (i > 0)
-              {
-                i--;
-                binName = binNames[i];
-                bin = connectionBins.get(binName);
-                bin.undoPooledConnectionDecision(poolCounts[i]);
-              }
-              return false;
-            }
-            else if (result == ConnectionBin.CONNECTION_DESTROY)
-            {
-              destroyConnection = true;
-            }
-          }
-          i++;
-        }
-        
-        if (destroyConnection)
-          return true;
-        
-        // Undo pool reservation, since everything is apparently within bounds.
-        for (int j = 0; j < binNames.length; j++)
-        {
-          ConnectionBin bin = connectionBins.get(binNames[j]);
-          if (bin != null)
-            bin.undoPooledConnectionDecision(poolCounts[j]);
-        }
-        
-        return false;
-      }
-
-    }
-    
-    /** Connection expiration is tricky, because even though a connection may be identified as
-    * being expired, at the very same moment it could be handed out in another thread.  So there
-    * is a natural race condition present.
-    * The way the connection throttler deals with that is to allow the caller to reserve a connection
-    * for expiration.  This must be called BEFORE the actual identified connection is removed from the
-    * connection pool.  If the value returned by this method is "true", then a connection MUST be removed
-    * from the pool and destroyed, whether or not the identified connection is actually still available for
-    * destruction or not.
-    *@return true if a connection from the pool can be expired.  If true is returned, noteConnectionDestruction()
-    *  MUST be called once the connection has actually been destroyed.
-    */
-    public boolean checkExpireConnection(String[] binNames, AtomicInteger[] poolCounts)
-    {
-      synchronized (connectionBins)
-      {
-        int i = 0;
-        while (i < binNames.length)
-        {
-          String binName = binNames[i];
-          ConnectionBin bin = connectionBins.get(binName);
-          if (bin != null)
-          {
-            if (!bin.hasPooledConnection(poolCounts[i]))
-            {
-              // Give up now, and undo all the other bins
-              while (i > 0)
-              {
-                i--;
-                binName = binNames[i];
-                bin = connectionBins.get(binName);
-                bin.undoPooledConnectionDecision(poolCounts[i]);
-              }
-              return false;
-            }
-          }
-          i++;
-        }
-        return true;
-      }
-    }
-
-    public void noteConnectionReturnedToPool(String[] binNames, AtomicInteger[] poolCounts)
-    {
-      synchronized (connectionBins)
-      {
-        for (int j = 0; j < binNames.length; j++)
-        {
-          ConnectionBin bin = connectionBins.get(binNames[j]);
-          if (bin != null)
-            bin.noteConnectionReturnedToPool(poolCounts[j]);
-        }
-      }
-    }
-
-    public void noteConnectionDestroyed(String[] binNames)
-    {
-      synchronized (connectionBins)
-      {
-        for (String binName : binNames)
-        {
-          ConnectionBin bin = connectionBins.get(binName);
-          if (bin != null)
-            bin.noteConnectionDestroyed();
-        }
-      }
-    }
-    
-    // IFetchThrottler support methods
-    
-    /** Get permission to fetch a document.  This grants permission to start
-    * fetching a single document, within the connection that has already been
-    * granted permission that created this object.
-    *@param binNames are the names of the bins.
-    *@return false if being shut down
-    */
-    public boolean obtainFetchDocumentPermission(String[] binNames, IBreakCheck breakCheck)
-      throws InterruptedException, BreakException
-    {
-      // First, make sure all the bins exist, and reserve a slot in each
-      int i = 0;
-      while (i < binNames.length)
-      {
-        String binName = binNames[i];
-        FetchBin bin;
-        synchronized (fetchBins)
-        {
-          bin = fetchBins.get(binName);
-        }
-        // Reserve a slot
-        try
-        {
-          if (bin == null || !bin.reserveFetchRequest(breakCheck))
-          {
-            // Release previous reservations, and return null
-            while (i > 0)
-            {
-              i--;
-              binName = binNames[i];
-              synchronized (fetchBins)
-              {
-                bin = fetchBins.get(binName);
-              }
-              if (bin != null)
-                bin.clearReservation();
-            }
-            return false;
-          }
-        }
-        catch (BreakException e)
-        {
-          // Release previous reservations, and rethrow
-          while (i > 0)
-          {
-            i--;
-            binName = binNames[i];
-            synchronized (fetchBins)
-            {
-              bin = fetchBins.get(binName);
-            }
-            if (bin != null)
-              bin.clearReservation();
-          }
-          throw e;
-        }
-        i++;
-      }
-      
-      // All reservations have been made!  Convert them.
-      // (These are guaranteed to succeed - but they may wait)
-      i = 0;
-      while (i < binNames.length)
-      {
-        String binName = binNames[i];
-        FetchBin bin;
-        synchronized (fetchBins)
-        {
-          bin = fetchBins.get(binName);
-        }
-        if (bin != null)
-        {
-          try
-          {
-            if (!bin.waitNextFetch(breakCheck))
-            {
-              // Undo the reservations we haven't processed yet
-              while (i < binNames.length)
-              {
-                binName = binNames[i];
-                synchronized (fetchBins)
-                {
-                  bin = fetchBins.get(binName);
-                }
-                if (bin != null)
-                  bin.clearReservation();
-                i++;
-              }
-              return false;
-            }
-          }
-          catch (BreakException e)
-          {
-            // Undo the reservations we haven't processed yet
-            while (i < binNames.length)
-            {
-              binName = binNames[i];
-              synchronized (fetchBins)
-              {
-                bin = fetchBins.get(binName);
-              }
-              if (bin != null)
-                bin.clearReservation();
-              i++;
-            }
-            throw e;
-          }
-        }
-        i++;
-      }
-      return true;
-    }
-    
-    public IStreamThrottler createFetchStream(String[] binNames)
-    {
-      // Do a "begin fetch" for all throttle bins
-      synchronized (throttleBins)
-      {
-        for (String binName : binNames)
-        {
-          ThrottleBin bin = throttleBins.get(binName);
-          if (bin != null)
-            bin.beginFetch();
-        }
-      }
-      
-      return new StreamThrottler(this, binNames);
-    }
-    
-    // IStreamThrottler support methods
-    
-    /** Obtain permission to read a block of bytes.  This method may wait until it is OK to proceed.
-    * The throttle group, bin names, etc are already known
-    * to this specific interface object, so it is unnecessary to include them here.
-    *@param byteCount is the number of bytes to get permissions to read.
-    *@return true if the wait took place as planned, or false if the system is being shut down.
-    */
-    public boolean obtainReadPermission(String[] binNames, int byteCount, IBreakCheck breakCheck)
-      throws InterruptedException, BreakException
-    {
-      int i = 0;
-      while (i < binNames.length)
-      {
-        String binName = binNames[i];
-        ThrottleBin bin;
-        synchronized (throttleBins)
-        {
-          bin = throttleBins.get(binName);
-        }
-        try
-        {
-          if (bin == null || !bin.beginRead(byteCount, breakCheck))
-          {
-            // End bins we've already done, and exit
-            while (i > 0)
-            {
-              i--;
-              binName = binNames[i];
-              synchronized (throttleBins)
-              {
-                bin = throttleBins.get(binName);
-              }
-              if (bin != null)
-                bin.endRead(byteCount,0);
-            }
-            return false;
-          }
-        }
-        catch (BreakException e)
-        {
-          // End bins we've already done, and exit
-          while (i > 0)
-          {
-            i--;
-            binName = binNames[i];
-            synchronized (throttleBins)
-            {
-              bin = throttleBins.get(binName);
-            }
-            if (bin != null)
-              bin.endRead(byteCount,0);
-          }
-          throw e;
-        }
-        i++;
-      }
-      return true;
-    }
-      
-    /** Note the completion of the read of a block of bytes.  Call this after
-    * obtainReadPermission() was successfully called, and bytes were successfully read.
-    *@param origByteCount is the originally requested number of bytes to get permissions to read.
-    *@param actualByteCount is the number of bytes actually read.
-    */
-    public void releaseReadPermission(String[] binNames, int origByteCount, int actualByteCount)
-    {
-      synchronized (throttleBins)
-      {
-        for (String binName : binNames)
-        {
-          ThrottleBin bin = throttleBins.get(binName);
-          if (bin != null)
-            bin.endRead(origByteCount, actualByteCount);
-        }
-      }
-    }
-
-    /** Note the stream being closed.
-    */
-    public void closeStream(String[] binNames)
-    {
-      synchronized (throttleBins)
-      {
-        for (String binName : binNames)
-        {
-          ThrottleBin bin = throttleBins.get(binName);
-          if (bin != null)
-            bin.endFetch();
-        }
-      }
-    }
-
-    // Bookkeeping methods
-    
-    /** Call this periodically.
-    */
-    public synchronized void poll(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      // Go through all existing bins and update each one.
-      synchronized (connectionBins)
-      {
-        for (ConnectionBin bin : connectionBins.values())
-        {
-          bin.updateMaxActiveConnections(throttleSpec.getMaxOpenConnections(bin.getBinName()));
-          bin.poll(threadContext);
-        }
-      }
-  
-      synchronized (fetchBins)
-      {
-        for (FetchBin bin : fetchBins.values())
-        {
-          bin.updateMinTimeBetweenFetches(throttleSpec.getMinimumMillisecondsPerFetch(bin.getBinName()));
-          bin.poll(threadContext);
-        }
-      }
-      
-      synchronized (throttleBins)
-      {
-        for (ThrottleBin bin : throttleBins.values())
-        {
-          bin.updateMinimumMillisecondsPerByte(throttleSpec.getMinimumMillisecondsPerByte(bin.getBinName()));
-          bin.poll(threadContext);
-        }
-      }
-      
-    }
-    
-    /** Free unused resources.
-    */
-    public synchronized void freeUnusedResources(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      // Does nothing; there are not really resources to free
-    }
-    
-    /** Destroy this pool.
-    */
-    public synchronized void destroy(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      synchronized (connectionBins)
-      {
-        Iterator<ConnectionBin> binIter = connectionBins.values().iterator();
-        while (binIter.hasNext())
-        {
-          ConnectionBin bin = binIter.next();
-          bin.shutDown(threadContext);
-          binIter.remove();
-        }
-      }
-      
-      synchronized (fetchBins)
-      {
-        Iterator<FetchBin> binIter = fetchBins.values().iterator();
-        while (binIter.hasNext())
-        {
-          FetchBin bin = binIter.next();
-          bin.shutDown(threadContext);
-          binIter.remove();
-        }
-      }
-      
-      synchronized (throttleBins)
-      {
-        Iterator<ThrottleBin> binIter = throttleBins.values().iterator();
-        while (binIter.hasNext())
-        {
-          ThrottleBin bin = binIter.next();
-          bin.shutDown(threadContext);
-          binIter.remove();
-        }
-      }
-
-    }
-  }
-  
-  /** Connection throttler implementation class.
-  * This class instance stores some parameters and links back to ThrottlingGroup.  But each class instance
-  * models a connection pool with the specified bins.  But the description of each pool consists of more than just
-  * the bin names that describe the throttling - it also may include connection parameters which we have
-  * no insight into at this level.
-  *
-  * Thus, in order to do pool tracking properly, we cannot simply rely on the individual connection bin instances
-  * to do all the work, since they cannot distinguish between different pools properly.  So that leaves us with
-  * two choices.  (1) We can somehow push the separate pool instance parameters down to the connection bin
-  * level, or (2) the connection bins cannot actually do any waiting or blocking.
-  *
-  * The benefit of having blocking take place in connection bins is that they are in fact designed to be precisely
-  * the thing you would want to synchronize on.   If we presume that the waits happen in those classes,
-  * then we need the ability to send in our local pool count to them, and we need to be able to "wake up"
-  * those underlying classes when the local pool count changes.
-  */
-  protected static class ConnectionThrottler implements IConnectionThrottler
-  {
-    protected final ThrottlingGroup parent;
-    protected final String[] binNames;
-    protected final AtomicInteger[] poolCounts;
-    
-    // Keep track of local pool parameters.
-
-    public ConnectionThrottler(ThrottlingGroup parent, String[] binNames)
-    {
-      this.parent = parent;
-      this.binNames = binNames;
-      this.poolCounts = new AtomicInteger[binNames.length];
-      for (int i = 0; i < poolCounts.length; i++)
-        poolCounts[i] = new AtomicInteger(0);
-    }
-    
-    /** Get permission to grab a connection for use.  If this object believes there is a connection
-    * available in the pool, it will update its pool size variable and return   If not, this method
-    * evaluates whether a new connection should be created.  If neither condition is true, it
-    * waits until a connection is available.
-    *@return whether to take the connection from the pool, or create one, or whether the
-    * throttler is being shut down.
-    */
-    @Override
-    public int waitConnectionAvailable()
-      throws InterruptedException
-    {
-      try
-      {
-        return waitConnectionAvailable(null);
-      }
-      catch (BreakException e)
-      {
-        throw new RuntimeException("Unexpected break exception: "+e.getMessage(),e);
-      }
-    }
-
-    /** Get permission to grab a connection for use.  If this object believes there is a connection
-    * available in the pool, it will update its pool size variable and return   If not, this method
-    * evaluates whether a new connection should be created.  If neither condition is true, it
-    * waits until a connection is available.
-    *@return whether to take the connection from the pool, or create one, or whether the
-    * throttler is being shut down.
-    */
-    @Override
-    public int waitConnectionAvailable(IBreakCheck breakCheck)
-      throws InterruptedException, BreakException
-    {
-      return parent.waitConnectionAvailable(binNames, poolCounts, breakCheck);
-    }
-    
-    /** For a new connection, obtain the fetch throttler to use for the connection.
-    * If the result from waitConnectionAvailable() is CONNECTION_FROM_CREATION,
-    * the calling code is expected to create a connection using the result of this method.
-    *@return the fetch throttler for a new connection.
-    */
-    @Override
-    public IFetchThrottler getNewConnectionFetchThrottler()
-    {
-      return parent.getNewConnectionFetchThrottler(binNames);
-    }
-    
-    /** For returning a connection from use, there is only one method.  This method signals
-    /* whether a formerly in-use connection should be placed back in the pool or destroyed.
-    *@return true if the connection should NOT be put into the pool but should instead
-    *  simply be destroyed.  If true is returned, the caller MUST call noteConnectionDestroyed()
-    *  (below) in order for the bookkeeping to work.
-    */
-    @Override
-    public boolean noteReturnedConnection()
-    {
-      return parent.noteReturnedConnection(binNames);
-    }
-    
-    /** This method calculates whether a connection should be taken from the pool and destroyed
-    /* in order to meet quota requirements.  If this method returns
-    /* true, you MUST remove a connection from the pool, and you MUST call
-    /* noteConnectionDestroyed() afterwards.
-    *@return true if a pooled connection should be destroyed.  If true is returned, the
-    * caller MUST call noteConnectionDestroyed() (below) in order for the bookkeeping to work.
-    */
-    @Override
-    public boolean checkDestroyPooledConnection()
-    {
-      return parent.checkDestroyPooledConnection(binNames, poolCounts);
-    }
-    
-    /** Connection expiration is tricky, because even though a connection may be identified as
-    * being expired, at the very same moment it could be handed out in another thread.  So there
-    * is a natural race condition present.
-    * The way the connection throttler deals with that is to allow the caller to reserve a connection
-    * for expiration.  This must be called BEFORE the actual identified connection is removed from the
-    * connection pool.  If the value returned by this method is "true", then a connection MUST be removed
-    * from the pool and destroyed, whether or not the identified connection is actually still available for
-    * destruction or not.
-    *@return true if a connection from the pool can be expired.  If true is returned, noteConnectionDestruction()
-    *  MUST be called once the connection has actually been destroyed.
-    */
-    @Override
-    public boolean checkExpireConnection()
-    {
-      return parent.checkExpireConnection(binNames, poolCounts);
-    }
-    
-    /** Note that a connection has been returned to the pool.  Call this method after a connection has been
-    * placed back into the pool and is available for use.
-    */
-    @Override
-    public void noteConnectionReturnedToPool()
-    {
-      parent.noteConnectionReturnedToPool(binNames, poolCounts);
-    }
-
-    /** Note that a connection has been destroyed.  Call this method ONLY after noteReturnedConnection()
-    * or checkDestroyPooledConnection() returns true, AND the connection has been already
-    * destroyed.
-    */
-    @Override
-    public void noteConnectionDestroyed()
-    {
-      parent.noteConnectionDestroyed(binNames);
-    }
-  }
-  
-  /** Fetch throttler implementation class.
-  * This basically stores some parameters and links back to ThrottlingGroup.
-  */
-  protected static class FetchThrottler implements IFetchThrottler
-  {
-    protected final ThrottlingGroup parent;
-    protected final String[] binNames;
-    
-    public FetchThrottler(ThrottlingGroup parent, String[] binNames)
-    {
-      this.parent = parent;
-      this.binNames = binNames;
-    }
-    
-    /** Get permission to fetch a document.  This grants permission to start
-    * fetching a single document, within the connection that has already been
-    * granted permission that created this object.
-    *@return false if the throttler is being shut down.
-    */
-    @Override
-    public boolean obtainFetchDocumentPermission()
-      throws InterruptedException
-    {
-      try
-      {
-        return obtainFetchDocumentPermission(null);
-      }
-      catch (BreakException e)
-      {
-        throw new RuntimeException("Unexpected break exception: "+e.getMessage(),e);
-      }
-    }
-
-    /** Get permission to fetch a document.  This grants permission to start
-    * fetching a single document, within the connection that has already been
-    * granted permission that created this object.
-    *@return false if the throttler is being shut down.
-    */
-    @Override
-    public boolean obtainFetchDocumentPermission(IBreakCheck breakCheck)
-      throws InterruptedException, BreakException
-    {
-      return parent.obtainFetchDocumentPermission(binNames,breakCheck);
-    }
-    
-    /** Open a fetch stream.  When done (or aborting), call
-    * IStreamThrottler.closeStream() to note the completion of the document
-    * fetch activity.
-    *@return the stream throttler to use to throttle the actual data access.
-    */
-    @Override
-    public IStreamThrottler createFetchStream()
-    {
-      return parent.createFetchStream(binNames);
-    }
-
-  }
-  
-  /** Stream throttler implementation class.
-  * This basically stores some parameters and links back to ThrottlingGroup.
-  */
-  protected static class StreamThrottler implements IStreamThrottler
-  {
-    protected final ThrottlingGroup parent;
-    protected final String[] binNames;
-    
-    public StreamThrottler(ThrottlingGroup parent, String[] binNames)
-    {
-      this.parent = parent;
-      this.binNames = binNames;
-    }
-
-    /** Obtain permission to read a block of bytes.  This method may wait until it is OK to proceed.
-    * The throttle group, bin names, etc are already known
-    * to this specific interface object, so it is unnecessary to include them here.
-    *@param byteCount is the number of bytes to get permissions to read.
-    *@return true if the wait took place as planned, or false if the system is being shut down.
-    */
-    @Override
-    public boolean obtainReadPermission(int byteCount)
-      throws InterruptedException
-    {
-      try
-      {
-        return obtainReadPermission(byteCount, null);
-      }
-      catch (BreakException e)
-      {
-        throw new RuntimeException("Unexpected break exception: "+e.getMessage(),e);
-      }
-    }
-      
-    /** Obtain permission to read a block of bytes.  This method may wait until it is OK to proceed.
-    * The throttle group, bin names, etc are already known
-    * to this specific interface object, so it is unnecessary to include them here.
-    *@param byteCount is the number of bytes to get permissions to read.
-    *@param breakCheck is the break check object.
-    *@return true if the wait took place as planned, or false if the system is being shut down.
-    */
-    @Override
-    public boolean obtainReadPermission(int byteCount, IBreakCheck breakCheck)
-      throws InterruptedException, BreakException
-    {
-      return parent.obtainReadPermission(binNames, byteCount, breakCheck);
-    }
-
-    /** Note the completion of the read of a block of bytes.  Call this after
-    * obtainReadPermission() was successfully called, and bytes were successfully read.
-    *@param origByteCount is the originally requested number of bytes to get permissions to read.
-    *@param actualByteCount is the number of bytes actually read.
-    */
-    @Override
-    public void releaseReadPermission(int origByteCount, int actualByteCount)
-    {
-      parent.releaseReadPermission(binNames, origByteCount, actualByteCount);
-    }
-
-    /** Note the stream being closed.
-    */
-    @Override
-    public void closeStream()
-    {
-      parent.closeStream(binNames);
-    }
-
-  }
-  
-}
diff --git a/framework/connector-common/src/main/resources/org/apache/manifoldcf/connectorcommon/common/client-config.wsdd b/framework/connector-common/src/main/resources/org/apache/manifoldcf/connectorcommon/common/client-config.wsdd
deleted file mode 100644
index 23c34f2..0000000
--- a/framework/connector-common/src/main/resources/org/apache/manifoldcf/connectorcommon/common/client-config.wsdd
+++ /dev/null
@@ -1,29 +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.
--->
-
-<deployment name="defaultClientConfig" 
- xmlns="http://xml.apache.org/axis/wsdd/" 
- xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 
-  <globalConfiguration> 
-    <parameter name="disablePrettyXML" value="true"/> 
-  </globalConfiguration> 
-  <transport name="http" pivot="java:org.apache.manifoldcf.connectorcommon.common.CommonsHTTPSender"> 
-    <parameter name="SO_TIMEOUT" locked="false">60000</parameter>
-  </transport>
-  <!-- transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/ --> 
-  <transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender"/> 
-  <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender"/> 
-</deployment>
\ No newline at end of file
diff --git a/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/fuzzyml/TestFuzzyML.java b/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/fuzzyml/TestFuzzyML.java
deleted file mode 100644
index aa3c046..0000000
--- a/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/fuzzyml/TestFuzzyML.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.fuzzyml;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import org.junit.*;
-
-/** Test fuzzyml parser */
-public class TestFuzzyML
-{
-  
-  protected final static String fuzzyTestString = 
-"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+
-"<rss version=\"2.0\"\n"+
-"	xmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n"+
-"	xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n"+
-"	xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"+
-"	xmlns:atom=\"http://www.w3.org/2005/Atom\"\n"+
-"	xmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\"\n"+
-"	xmlns:slash=\"http://purl.org/rss/1.0/modules/slash/\"\n"+
-"	>\n"+
-"		<item>\n"+
-"		<title>fme File Exchange Plattform – Austausch mit Externen leichtgemacht</title>\n"+
-"		<link>http://blog.fme.de/allgemein/2013-07/fme-file-exchange-plattform-austausch-mit-externen-leichtgemacht</link>\n"+
-"		<comments>http://blog.fme.de/allgemein/2013-07/fme-file-exchange-plattform-austausch-mit-externen-leichtgemacht#comments</comments>\n"+
-"		<pubDate>Thu, 18 Jul 2013 07:39:03 +0000</pubDate>\n"+
-"		<dc:creator>Jan Pfitzner</dc:creator>\n"+
-"				<category><![CDATA[Allgemein]]></category>\n"+
-"		<category><![CDATA[ECM mit Alfresco]]></category>\n"+
-"		<category><![CDATA[Alfresco]]></category>\n"+
-"		<category><![CDATA[Content Repository]]></category>\n"+
-"		<category><![CDATA[File Exchange Plattform]]></category>\n"+
-"		<category><![CDATA[File Sharing]]></category>\n"+
-"		<category><![CDATA[Webtechnologien]]></category>\n"+
-"\n"+
-"		<guid isPermaLink=\"false\">http://blog.fme.de/?p=1806</guid>\n"+
-"		<description><![CDATA[Der Austausch von Dokumenten mit Partnern, Agenturen oder auch Kunden ist aus Sicht der Unternehmens-IT immer noch ein oft problematisches Feld. Der Austausch von großen Dateimengen per Mail &#8220;bläht&#8221; die Postfächer unnötig auf und führt zu ineffizienten Prozessen (&#8220;welche Version ist noch aktuell?&#8221;). Die von den Endanwendern in Eigenverantwortung oft gewählte Cloud-Alternative – die Nutzung [...]]]></description>\n"+
-"			<content:encoded><![CDATA[<p><strong>Der Austausch von Dokumenten mit Partnern, Agenturen oder auch Kunden ist aus Sicht der Unternehmens-IT immer noch ein oft problematisches Feld. Der Austausch von großen Dateimengen per Mail &#8220;bläht&#8221; die Postfächer unnötig auf und führt zu ineffizienten Prozessen (&#8220;welche Version ist noch aktuell?&#8221;). Die von den Endanwendern in Eigenverantwortung oft gewählte Cloud-Alternative – die Nutzung von Cloud-basierten File-Sharing-Diensten wie Dropbox, Google Drive &amp; Co – ist und bleibt nicht erst seit #Prism ein &#8220;Schreckgespenst&#8221; für viele CIOs. Die fme file Exchange Plattform bietet eine compliance- und integrationsfähige Alternative.</strong></p>\n"+
-"<p>Die typischen Anforderungen an eine Dateiaustauschplattform lassen sich in der folgenden Form zusammenfassen:</p>\n"+
-"<p><strong>Als Mitarbeiter des Unternehmens möchte ich…</strong></p>\n"+
-"<ul>\n"+
-"<li>mich mit meinem Standard-Unternehmens-Account anmelden können, am besten per SSO,</li>\n"+
-"<li>Sammlungen von Dateien mit externen Benutzern austauschen,</li>\n"+
-"<li>angeben können, welche Benutzer lesend oder schreibend auf die Dateien zugreifen können,</li>\n"+
-"<li>Dokumente vom lokalen PC oder dem internen Dokumenten-Management-System hochladen/auswählen können,</li>\n"+
-"<li>weitere Dateien zu einer Dateisammlung hinzufügen und vorhandene aktualisieren oder löschen können und</li>\n"+
-"<li>die Benutzer automatisch benachrichtigen, wenn neue oder geänderte Dateien vorhanden sind.</li>\n"+
-"</ul>\n"+
-"<p><span id=\"more-1806\"></span></p>\n"+
-"<p><strong>Als externer Benutzer möchte ich…</strong></p>\n"+
-"<ul>\n"+
-"<li>mich einfach im System registrieren können,</li>\n"+
-"<li>vom System benachrichtigt werden, wenn ein anderer Benutzer neue Dateien für mich bereitgestellt hat und</li>\n"+
-"<li>auf die für mich freigegeben Dateisammlungen einfach zugreifen können.</li>\n"+
-"</ul>\n"+
-"<p><strong>Als IT-Verantwortlicher möchte ich …</strong></p>\n"+
-"<ul>\n"+
-"<li>dass das System in der eigenen DMZ betrieben werden kann,</li>\n"+
-"<li>dass jede Registrierung von einem Mitarbeiter meines Unternehmens – der Kontaktperson des Externen – freigeschaltet werden muss,</li>\n"+
-"<li>eine Übersicht über alle registrierten Benutzer und deren Dateisammlungen haben und dort jederzeit einzelne Dateien oder ganze Sammlungen löschen können,</li>\n"+
-"<li>dass freigebende Dateisammlungen nach einer konfigurierbaren Zeitspanne gelöscht werden und</li>\n"+
-"<li>verhindern, dass registrierte externe Benutzer das System missbrauchen, indem sie Dateien ohne Beteiligung eines Mitarbeiters austauschen.</li>\n"+
-"</ul>\n"+
-"<p>Anhand dieser primären Anforderungen eines unserer Kunden haben wir auf Basis von Alfresco und einiger modernen Webtechnologien wie Bootstrap &amp; AngularJS  die fme File Exchange Plattform entwickelt:</p>\n"+
-"<p style=\"text-align: center;\"><a href=\"http://blog.fme.de/wp-content/uploads/2013/07/File-Exchange-Plattform.png\" rel=\"lightbox[1806]\"><img class=\"aligncenter  wp-image-1819\" title=\"File Exchange Plattform\" src=\"http://blog.fme.de/wp-content/uploads/2013/07/File-Exchange-Plattform.png\" alt=\"\" width=\"405\" height=\"240\" /></a></p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p>Alfresco dient in dieser Lösung vor allem als Content Repository inkl. der benötigten Basis -Funktionen wie Berechtigungen, Versionierung, Mailbenachrichtigungen, Dokumentenvorschau sowie Gruppen- &amp; Benutzerverwaltung. Außerdem wird der Registrierungsmechanismus für die externen Benutzer über die in Alfresco integrierte Workflow-Engine Activiti umgesetzt.</p>\n"+
-"<p>Die Benutzungsoberfläche der Applikation ist in Form einer Single Page Webapplikation auf Basis der beiden Frameworks AngularJS (<a href=\"http://angularjs.org/\">http://angularjs.org/</a>) &amp; Bootstrap (<a href=\"http://twitter.github.io/bootstrap/\">http://twitter.github.io/bootstrap/</a>) implementiert.</p>\n"+
-"<p>Die Kommunikation zwischen diesem JavaScript-Frontend und dem Alfresco-Backend ist mittels sog. Alfresco WebScripts umgesetzt. Das Alfresco WebScript-Framework ist eines der größten Vorteile von Alfresco und ermöglicht die Implementierung einer eigenen auf Anwendungsfall angepassten REST API.</p>\n"+
-"<p>Aus der Sicht des Anwenders teilt sich die Applikation in die folgenden, beiden Komponenten:</p>\n"+
-"<p><strong>New File Collection</strong></p>\n"+
-"<p>Hier haben die Mitarbeiter des Unternehmens die Möglichkeit, eine neue Dateisammlung zum Austausch zu erstellen. Zur Erstellung einer neuen Dateisammlung sind lediglich die folgenden Informationen notwendig:</p>\n"+
-"<ol>\n"+
-"<li>Name der Dateisammlung.</li>\n"+
-"<li>Berechtigte Benutzer – lesend oder schreibend</li>\n"+
-"<li>Die Dateien, die hochgeladen werden sollen</li>\n"+
-"</ol>\n"+
-"<p>Um diesen Erstellungsprozess so intuitiv &amp; komfortabel wie möglich zu halten, wurde zur Benutzerauswahl ein Eingabefeld inkl. einer Autovervollständigung anhand der vorhandenen Benutzerkonten eingesetzt.</p>\n"+
-"<p>Zum einfachen Hinzufügen von Dateien vom PC des Benutzers wird neben der üblichen Dateiauswahl auch ein direktes Drag&amp;Drop unterstützt.</p>\n"+
-"<p>Während des Hochladevorgangs der Dateien ist der Benutzer durch den Einsatz von Fortschrittsbalken jederzeit über den aktuellen Fortschritt des Uploads informiert.</p>\n"+
-"<p>Mit Abschluss des Hochladevorgangs werden die berechtigten Benutzer vom System per Mail über die neue Dateisammlung informiert.</p>\n"+
-"<p style=\"text-align: center;\"><a href=\"http://blog.fme.de/wp-content/uploads/2013/07/New-File-Collection1.png\" rel=\"lightbox[1806]\"><img class=\"aligncenter  wp-image-1827\" title=\"New File Collection\" src=\"http://blog.fme.de/wp-content/uploads/2013/07/New-File-Collection1.png\" alt=\"\" width=\"456\" height=\"377\" /></a></p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p><strong>My File Collections</strong></p>\n"+
-"<p>Im Bereich „My File Collection” hat der angemeldete Benutzer einen direkten und einfachen Zugriff auf die Dateisammlungen, für die er berechtigt ist. Je nach vergebener Berechtigung kann der Benutzer die  enthaltenen Dateien herunterladen, aktualisieren &amp; löschen oder aber auch neue Dokumente hochladen und  Ordner erstellen.</p>\n"+
-"<p>Zudem  kann der Ersteller einer Dateisammlung oder ein Administrator die Sammlung für weitere Benutzer freigeben bzw. Freigaben zurücknehmen und die automatische Ablauffrist einer Dateisammlung aktivieren bzw. deaktivieren.</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p style=\"text-align: center;\"><a href=\"http://blog.fme.de/wp-content/uploads/2013/07/My-File-Collections.png\" rel=\"lightbox[1806]\"><img class=\"aligncenter  wp-image-1828\" title=\"My File Collections\" src=\"http://blog.fme.de/wp-content/uploads/2013/07/My-File-Collections.png\" alt=\"\" width=\"492\" height=\"377\" /></a></p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p><strong>Fazit</strong></p>\n"+
-"<p>Die Kombination von Alfresco, AngularJS &amp; Bootstrap hat sich während der Lösungsentwicklung als wunderbar harmonierende und sehr produktive Kombination zur Entwicklung von eigenen dokumentenorientieren Webapplikationen erwiesen.</p>\n"+
-"<p>Die Nutzung dieser erprobten Werkzeuge bringt zudem die Unterstützung von Webbrowsers mobiler Geräte nahezu zum Nulltarif mit. So ist die Bedienung der Anwendung mit einem iPad oder iPhone problemlos möglich und bspw.  das einfache Bereitstellen der Fotografien vom Flipchart aus dem gerade beendeten Workshop  schnell &amp; einfach erledigt.</p>\n"+
-"<p>Die Lösung zeigt einmal mehr, dass es neben der Konfiguration &amp; Anpassung eines Standard-Clients immer auch eine zweite zu betrachtende Variante gibt:</p>\n"+
-"<p>Die Implementierung eines eigenen Clients anhand von best-of-breed Technologien, wie in diesem Beispiel zur vollsten Kundenzufriedenheit gezeigt.</p>\n"+
-"<p>&nbsp;</p>\n"+
-"]]></content:encoded>\n"+
-"			<wfw:commentRss>http://blog.fme.de/allgemein/2013-07/fme-file-exchange-plattform-austausch-mit-externen-leichtgemacht/feed</wfw:commentRss>\n"+
-"		<slash:comments>0</slash:comments>\n"+
-"		</item>\n"+
-"		<item>\n"+
-"		<title>migration-center vs. EMC&#8217;s EMA &#8211; the main differences</title>\n"+
-"		<link>http://blog.fme.de/allgemein/2013-07/migration-center-vs-emcs-ema-the-main-differences</link>\n"+
-"		<comments>http://blog.fme.de/allgemein/2013-07/migration-center-vs-emcs-ema-the-main-differences#comments</comments>\n"+
-"		<pubDate>Thu, 04 Jul 2013 09:30:09 +0000</pubDate>\n"+
-"		<dc:creator>fpiaszyk</dc:creator>\n"+
-"				<category><![CDATA[Allgemein]]></category>\n"+
-"		<category><![CDATA[ECM Consulting]]></category>\n"+
-"		<category><![CDATA[EMC Documentum]]></category>\n"+
-"		<category><![CDATA[Software Technology]]></category>\n"+
-"		<category><![CDATA[D2]]></category>\n"+
-"		<category><![CDATA[delta Migration]]></category>\n"+
-"		<category><![CDATA[Documentum. xCP]]></category>\n"+
-"		<category><![CDATA[Migration]]></category>\n"+
-"		<category><![CDATA[migration-center]]></category>\n"+
-"		<category><![CDATA[no downtime]]></category>\n"+
-"\n"+
-"		<guid isPermaLink=\"false\">http://blog.fme.de/?p=1793</guid>\n"+
-"		<description><![CDATA[EMA is NOT an out-of-the-box product, it&#8217;s a tool set (framework) that ONLY the Documentum Professional Services Team uses. This tool is exclusively available through EMC IIG Services. Once the engagement is over, EMA leaves with the team and cannot be used for additional migrations. Partners and customers are not able to use EMA without [...]]]></description>\n"+
-"			<content:encoded><![CDATA[<p><a href=\"http://blog.fme.de/wp-content/uploads/2013/07/product_06.jpg\" rel=\"lightbox[1793]\"><img class=\"alignright size-thumbnail wp-image-1802\" title=\"product_06\" src=\"http://blog.fme.de/wp-content/uploads/2013/07/product_06-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" /></a></p>\n"+
-"<p>EMA is NOT an out-of-the-box product, it&#8217;s a tool set (framework) that ONLY the Documentum Professional Services Team uses. This tool is exclusively available through EMC IIG Services. Once the engagement is over, EMA leaves with the team and cannot be used for additional migrations. Partners and customers are not able to use EMA without IIG Consulting in a project because EMA bypasses the API (DFC).</p>\n"+
-"<p>The main use case for EMA is the high speed cloning from Oracle based on-premise Documentum installations to MS SQL Server based off-premise (EMC onDemand) installations. For this approach a simple dump&amp;load is not feasible and a tool for cloning is needed. In addition EMC addressed some other use cases at EMC World 2013 like version upgrades (DCM to D2 life sciences and Webtop to D2 or xCP) and third-party migrations.</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p><strong>Speed vs. Business Requirements and methodology</strong></p>\n"+
-"<p>Cloning or a 1:1 migration of all objects located in a repository without reorganization and clean-up has no additional business value, the result is just a new platform and/or version (garbage in, garbage out). With EMA, changes on business requirements can not be applied easily during the migration (e.g. new metadata, new object types, business logic etc.). The results of the actual migration can not be discussed with the business department before the content is imported in the target system. If needed, duplicates can not be dictated and managed. And furthermore it is not possible to apply changes during the project with just a few clicks of the mouse as you could with migration-center.</p>\n"+
-"<p><span id=\"more-1793\"></span></p>\n"+
-"<p>migration-center is designed for administrators to support them in all phases of a migration project and not just during the import. Over the last eight years migration-center has been developed together with our partners and customers into a product which integrates a full project methodology and all essential capabilities for the different steps during a project. Today migration-center is not only a product but rather a migration platform which covers numerous migration scenarios.</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p><strong>Summary</strong></p>\n"+
-"<p>Unlike EMC&#8217;s EMA migration-center is an out-of-the box product and comes with a user-friendly user interface, full maintenance and support as well as regular updates. The product has been EMC certified since 2005 and is a proven migration platform for any type of platform independent content migration. migration-center has proven its quality in more than 130 projects around the world, especially within regulated environments. The product may be either leased or purchased by customers, partners or other preferred system integrators. migration-center is scalable because of the open architecture which is designed for large migrations without interrupting daily business operations. It reaches the maximum performance of the source and target systems without any restrictions. A large variety of algorithms and commands are available to meet all migration requirements without additional programming or scripting effort.</p>\n"+
-"<p>migration-center&#8217;s abilities will make a positive difference in your business if you are challenged with migrating enterprise content. Convince yourself and let us demonstrate your data working within migration-center in just a couple of days before you lease or buy the whole product.</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p><strong>Benefits of using migration-center instead of EMA</strong></p>\n"+
-"<p>•  No service engagement with EMC IIG Services required</p>\n"+
-"<p>•  migration-center is a proven product since 2005 and was used in more than 130 projects around the world</p>\n"+
-"<p>•  It is a full function, out-of-the-box software, fully documented, easy to deploy, with an excellent graphical user interface</p>\n"+
-"<p>•  Product and migration project support available</p>\n"+
-"<p>•  NO DOWNTIME &#8211; It works without interrupting any of your normal business operations because of the delta migration capability</p>\n"+
-"<p>•  The software is designed to efficiently move and classify large volumes of documents into the chosen target repository (up to 1 million documents per day with just a single process)</p>\n"+
-"<p>•  A large variety of algorithms and commands are available to create a very specific mapping and transformation logic, covering every migration requirement possible and all this without additional programming or scripting effort</p>\n"+
-"<p>•  migration-center is able to apply the business logic of highly customized applications (e.g. D2, TBOs, server methods etc.)</p>\n"+
-"<p>•  Complete rule simulation and error handling are provided, allowing in depth testing of transformation rules before committing content to the actual repository import</p>\n"+
-"<p>•  The migration-center grants more than 55 out-of-the-box connections from various source to various target systems</p>\n"+
-"<p>•  migration-center supports Documentum versions from 4i to D7</p>\n"+
-"<p>•  migration-center reflects proven migration methodology in its step-by-step processes</p>\n"+
-"<p>•  migration-center has been validated and approved by many companies in regulated environments, e.g. international pharmaceutical players</p>\n"+
-"<p>•  The migration-center pricing model is simple and very flexible</p>\n"+
-"<p>•  Through its enormous flexibility the migration-center may be deployed for a variety of migration scenarios</p>\n"+
-"<p>•  With our international partners we offer customer product training as well as complete implementation by highly competent professionals</p>\n"+
-"<p>•  migration-center is much more them a simple ETL tool</p>\n"+
-"<p>•  migration-center offers a variety of proven pre-confugure services</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p>&nbsp;</p>\n"+
-"<p>&nbsp;</p>\n"+
-"]]></content:encoded>\n"+
-"			<wfw:commentRss>http://blog.fme.de/allgemein/2013-07/migration-center-vs-emcs-ema-the-main-differences/feed</wfw:commentRss>\n"+
-"		<slash:comments>0</slash:comments>\n"+
-"		</item>\n"
-;
-
-  @Test
-  public void testTags()
-    throws IOException, ManifoldCFException
-  {
-    org.apache.manifoldcf.core.system.Logging.misc = org.apache.log4j.Logger.getLogger("test");
-    InputStream is = new ByteArrayInputStream("<href a=/hello/out/there/>".getBytes(StandardCharsets.UTF_8));
-    Parser p = new Parser();
-    TestParseState x = new TestParseState();
-    p.parseWithCharsetDetection(null,is,x);
-    Assert.assertTrue(x.lastTagName != null);
-    Assert.assertTrue(x.lastTagName.equals("href"));
-    Assert.assertTrue(x.lastTagAttributes.size() == 1);
-    Assert.assertTrue(x.lastTagAttributes.get(0).getName().equals("a"));
-    Assert.assertTrue(x.lastTagAttributes.get(0).getValue().equals("/hello/out/there/"));
-  }
-  
-  protected static class TestParseState extends TagParseState
-  {
-    public String lastTagName = null;
-    public List<AttrNameValue> lastTagAttributes = null;
-    
-    public TestParseState()
-    {
-      super();
-    }
-    
-    @Override
-    protected boolean noteTag(String tagName, List<AttrNameValue> attributes)
-      throws ManifoldCFException
-    {
-      lastTagName = tagName;
-      lastTagAttributes = attributes;
-      return super.noteTag(tagName, attributes);
-    }
-
-  }
-
-  @Test
-  public void testFailure()
-    throws IOException, ManifoldCFException
-  {
-    org.apache.manifoldcf.core.system.Logging.misc = org.apache.log4j.Logger.getLogger("test");
-    InputStream is = new ByteArrayInputStream(fuzzyTestString.getBytes(StandardCharsets.UTF_8));
-    Parser p = new Parser();
-    // Parse the document.  This will cause various things to occur, within the instantiated XMLParsingContext class.
-    XMLFuzzyHierarchicalParseState x = new XMLFuzzyHierarchicalParseState();
-    x.setContext(new TestParsingContext(x));
-    try
-    {
-      // Believe it or not, there are no parsing errors we can get back now.
-      p.parseWithCharsetDetection(null,is,x);
-    }
-    finally
-    {
-      x.cleanup();
-    }
-  }
-
-  protected static class TestParsingContext extends XMLParsingContext
-  {
-    protected String thisTag = null;
-    
-    public TestParsingContext(XMLFuzzyHierarchicalParseState theStream)
-    {
-      super(theStream);
-    }
-    
-    public TestParsingContext(XMLFuzzyHierarchicalParseState theStream, String namespace, String localname, String qname, Map<String,String> theseAttributes)
-    {
-      super(theStream,namespace,localname,qname,theseAttributes);
-    }
-    
-    @Override
-    protected XMLParsingContext beginTag(String namespace, String localName, String qName, Map<String,String> atts)
-      throws ManifoldCFException
-    {
-      thisTag = qName;
-      return new TestParsingContext(theStream,namespace,localName,qName,atts);
-    }
-
-    @Override
-    protected void endTag()
-      throws ManifoldCFException
-    {
-      super.endTag();
-    }
-
-  }
-  
-}
diff --git a/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/jsongen/TestJsonGen.java b/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/jsongen/TestJsonGen.java
deleted file mode 100644
index 7f85374..0000000
--- a/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/jsongen/TestJsonGen.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.jsongen;
-
-import java.io.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class TestJsonGen
-{
-  
-  @Test
-  public void testArrayFormation()
-    throws IOException
-  {
-    JSONArrayReader jr = new JSONArrayReader();
-    jr.addArrayElement(new JSONStringReader("hello"))
-      .addArrayElement(new JSONStringReader("world"));
-    compare("[\"hello\",\"world\"]",jr);
-    compare("[]",new JSONArrayReader());
-  }
-
-  @Test
-  public void testObjectFormation()
-    throws IOException
-  {
-    JSONObjectReader jr = new JSONObjectReader();
-    jr.addNameValuePair(new JSONNameValueReader(new JSONStringReader("hi"),new JSONIntegerReader(1)))
-      .addNameValuePair(new JSONNameValueReader(new JSONStringReader("there"),new JSONDoubleReader(1.0)));
-    compare("{\"hi\":1,\"there\":1.0}",jr);
-    compare("{}",new JSONObjectReader());
-  }
-  
-  @Test
-  public void testStringEscaping()
-    throws IOException
-  {
-    compare("\"t1\\u000da\"",new JSONStringReader("t1\ra"));
-    compare("\"t2\\u0009\\u0022\\u005c\"",new JSONStringReader("t2\t\"\\"));
-  }
-  
-  protected void compare(String value, Reader reader)
-    throws IOException
-  {
-    StringBuilder sb = new StringBuilder();
-    while (true)
-    {
-      int character = reader.read();
-      if (character == -1)
-        break;
-      sb.append((char)character);
-    }
-    assertEquals(value,sb.toString());
-  }
-
-}
diff --git a/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/throttler/TestThrottler.java b/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/throttler/TestThrottler.java
deleted file mode 100644
index 4c20e41..0000000
--- a/framework/connector-common/src/test/java/org/apache/manifoldcf/connectorcommon/throttler/TestThrottler.java
+++ /dev/null
@@ -1,517 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.connectorcommon.throttler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.connectorcommon.interfaces.*;
-import java.io.*;
-import java.util.*;
-import java.util.concurrent.atomic.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class TestThrottler extends org.apache.manifoldcf.core.tests.BaseHSQLDB
-{
-  @Test
-  public void multiThreadConnectionPoolTest()
-    throws Exception
-  {
-    // First, create the throttle group.
-    IThreadContext threadContext = ThreadContextFactory.make();
-    IThrottleGroups tg = ThrottleGroupsFactory.make(threadContext);
-    tg.createOrUpdateThrottleGroup("test","test",new ThrottleSpec());
-    
-    // We create a pretend connection pool
-    IConnectionThrottler connectionThrottler = tg.obtainConnectionThrottler("test","test",new String[]{"A","B","C"});
-    System.out.println("Connection throttler obtained");
-    
-    // How best to test this?
-    // Well, what I'm going to do is to have multiple threads active.  Each one will do perfectly sensible things
-    // while generating a log that includes timestamps for everything that happens.  At the end, the log will be
-    // analyzed for violations of throttling policy.
-    
-    PollingThread pt = new PollingThread();
-    pt.start();
-
-    EventLog eventLog = new EventLog();
-    
-    int numThreads = 10;
-    
-    TesterThread[] threads = new TesterThread[numThreads];
-    for (int i = 0; i < numThreads; i++)
-    {
-      threads[i] = new TesterThread(connectionThrottler, eventLog);
-      threads[i].start();
-    }
-    
-    // Now, join all the threads at the end
-    for (int i = 0; i < numThreads; i++)
-    {
-      threads[i].finishUp();
-    }
-    
-    pt.interrupt();
-    pt.finishUp();
-
-    // Shut down the throttle group
-    tg.removeThrottleGroup("test","test");
-
-    // Finally, do the log analysis
-    eventLog.analyze();
-    
-    System.out.println("Done test");
-  }
-  
-  protected static class PollingThread extends Thread
-  {
-    protected Throwable exception = null;
-    
-    public PollingThread()
-    {
-    }
-    
-    public void run()
-    {
-      try
-      {
-        IThreadContext threadContext = ThreadContextFactory.make();
-        IThrottleGroups throttleGroups = ThrottleGroupsFactory.make(threadContext);
-        
-        while (true)
-        {
-          throttleGroups.poll("test");
-          Thread.sleep(1000L);
-        }
-      }
-      catch (InterruptedException e)
-      {
-      }
-      catch (Exception e)
-      {
-        exception = e;
-      }
-
-    }
-    
-    public void finishUp()
-      throws Exception
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-        else if (exception instanceof Error)
-          throw (Error)exception;
-        else if (exception instanceof Exception)
-          throw (Exception)exception;
-        else
-          throw new RuntimeException("Unknown exception: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-      }
-    }
-
-  }
-  
-  protected static class TesterThread extends Thread
-  {
-    protected final EventLog eventLog;
-    protected final IConnectionThrottler connectionThrottler;
-    protected Throwable exception = null;
-    
-    public TesterThread(IConnectionThrottler connectionThrottler, EventLog eventLog)
-    {
-      this.connectionThrottler = connectionThrottler;
-      this.eventLog = eventLog;
-    }
-    
-    public void run()
-    {
-      try
-      {
-        int numberConnectionCycles = 3;
-        int numberFetchesPerCycle = 3;
-        
-        for (int k = 0; k < numberConnectionCycles; k++)
-        {
-          // First grab a connection.
-          int rval = connectionThrottler.waitConnectionAvailable();
-          if (rval == IConnectionThrottler.CONNECTION_FROM_NOWHERE)
-            throw new Exception("Unexpected return value from waitConnectionAvailable()");
-          IFetchThrottler fetchThrottler;
-          if (rval == IConnectionThrottler.CONNECTION_FROM_CREATION)
-          {
-            // Pretend to create the connection
-            eventLog.addLogEntry(new ConnectionCreatedEvent());
-          }
-          else
-          {
-            // Pretend to get it from the pool
-            eventLog.addLogEntry(new ConnectionFromPoolEvent());
-          }
-          fetchThrottler = connectionThrottler.getNewConnectionFetchThrottler();
-
-          for (int l = 0; l < numberFetchesPerCycle; l++)
-          {
-            // Perform a fake fetch
-            if (fetchThrottler.obtainFetchDocumentPermission() == false)
-              throw new Exception("Unexpected return value for obtainFetchDocumentPermission()");
-            eventLog.addLogEntry(new FetchStartEvent());
-            IStreamThrottler streamThrottler = fetchThrottler.createFetchStream();
-            try
-            {
-              // Do one read
-              if (streamThrottler.obtainReadPermission(1000) == false)
-                throw new Exception("False from obtainReadPermission!");
-              eventLog.addLogEntry(new ReadStartEvent(1000));
-              streamThrottler.releaseReadPermission(1000, 1000);
-              eventLog.addLogEntry(new ReadDoneEvent(1000));
-              // Do another read
-              if (streamThrottler.obtainReadPermission(1000) == false)
-                throw new Exception("False from obtainReadPermission!");
-              eventLog.addLogEntry(new ReadStartEvent(1000));
-              streamThrottler.releaseReadPermission(1000, 1000);
-              eventLog.addLogEntry(new ReadDoneEvent(1000));
-              // Do a third read
-              if (streamThrottler.obtainReadPermission(1000) == false)
-                throw new Exception("False from obtainReadPermission!");
-              eventLog.addLogEntry(new ReadStartEvent(1000));
-              streamThrottler.releaseReadPermission(1000, 100);
-              eventLog.addLogEntry(new ReadDoneEvent(100));
-            }
-            finally
-            {
-              // Close the stream
-              streamThrottler.closeStream();
-            }
-            eventLog.addLogEntry(new FetchDoneEvent());
-          }
-          
-          // Pretend to release the connection
-          boolean destroyIt = connectionThrottler.noteReturnedConnection();
-          if (destroyIt)
-          {
-            eventLog.addLogEntry(new ConnectionDestroyedEvent());
-            connectionThrottler.noteConnectionDestroyed();
-          }
-          else
-          {
-            eventLog.addLogEntry(new ConnectionReturnedToPoolEvent());
-            connectionThrottler.noteConnectionReturnedToPool();
-          }
-        }
-      }
-      catch (Exception e)
-      {
-        e.printStackTrace();
-        exception = e;
-      }
-    }
-    
-    public void finishUp()
-      throws Exception
-    {
-      join();
-      if (exception != null)
-      {
-        if (exception instanceof RuntimeException)
-          throw (RuntimeException)exception;
-        else if (exception instanceof Error)
-          throw (Error)exception;
-        else if (exception instanceof Exception)
-          throw (Exception)exception;
-        else
-          throw new RuntimeException("Unknown exception: "+exception.getClass().getName()+": "+exception.getMessage(),exception);
-      }
-    }
-    
-  }
-  
-  protected static class ThrottleSpec implements IThrottleSpec
-  {
-    public ThrottleSpec()
-    {
-    }
-    
-    /** Given a bin name, find the max open connections to use for that bin.
-    *@return -1 if no limit found.
-    */
-    @Override
-    public int getMaxOpenConnections(String binName)
-    {
-      if (binName.equals("A"))
-        return 3;
-      if (binName.equals("B"))
-        return 4;
-      return Integer.MAX_VALUE;
-    }
-
-    /** Look up minimum milliseconds per byte for a bin.
-    *@return 0.0 if no limit found.
-    */
-    @Override
-    public double getMinimumMillisecondsPerByte(String binName)
-    {
-      if (binName.equals("B"))
-        return 0.5;
-      if (binName.equals("C"))
-        return 0.75;
-      return 0.0;
-    }
-
-    /** Look up minimum milliseconds for a fetch for a bin.
-    *@return 0 if no limit found.
-    */
-    @Override
-    public long getMinimumMillisecondsPerFetch(String binName)
-    {
-      if (binName.equals("A"))
-        return 5;
-      if (binName.equals("C"))
-        return 20;
-      return 0;
-    }
-
-  }
-  
-  protected static class EventLog
-  {
-    protected final List<LogEntry> logList = new ArrayList<LogEntry>();
-    
-    public EventLog()
-    {
-    }
-    
-    public synchronized void addLogEntry(LogEntry x)
-    {
-      System.out.println(x.toString());
-      logList.add(x);
-    }
-    
-    public synchronized void analyze()
-      throws Exception
-    {
-      State s = new State();
-      for (LogEntry l : logList)
-      {
-        l.apply(s);
-      }
-      // Success!
-    }
-    
-  }
-  
-  protected static abstract class LogEntry
-  {
-    protected final long timestamp;
-    
-    public LogEntry(long timestamp)
-    {
-      this.timestamp = timestamp;
-    }
-    
-    public abstract void apply(State state)
-      throws Exception;
-    
-    public String toString()
-    {
-      return "Time: "+timestamp;
-    }
-    
-  }
-  
-  protected static class ConnectionCreatedEvent extends LogEntry
-  {
-    public ConnectionCreatedEvent()
-    {
-      super(System.currentTimeMillis());
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-      if (state.outstandingConnections + 1 > 3)
-        throw new Exception("Too many outstanding connections at once!");
-      state.outstandingConnections++;
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Connection created";
-    }
-
-  }
-
-  protected static class ConnectionDestroyedEvent extends LogEntry
-  {
-    public ConnectionDestroyedEvent()
-    {
-      super(System.currentTimeMillis());
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-      state.outstandingConnections--;
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Connection destroyed";
-    }
-
-  }
-
-  protected static class ConnectionFromPoolEvent extends LogEntry
-  {
-    public ConnectionFromPoolEvent()
-    {
-      super(System.currentTimeMillis());
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Connection from pool";
-    }
-
-  }
-
-  protected static class ConnectionReturnedToPoolEvent extends LogEntry
-  {
-    public ConnectionReturnedToPoolEvent()
-    {
-      super(System.currentTimeMillis());
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Connection back to pool";
-    }
-
-  }
-
-  protected static class FetchStartEvent extends LogEntry
-  {
-    public FetchStartEvent()
-    {
-      super(System.currentTimeMillis());
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-      if (timestamp < state.lastFetch + 20L - 1L)
-        throw new Exception("Fetch too fast: took place in "+ (timestamp - state.lastFetch) + " milliseconds");
-      state.lastFetch = timestamp;
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Fetch start";
-    }
-  }
-  
-  protected static class FetchDoneEvent extends LogEntry
-  {
-    public FetchDoneEvent()
-    {
-      super(System.currentTimeMillis());
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Fetch done";
-    }
-  }
-  
-  protected static class ReadStartEvent extends LogEntry
-  {
-    final int proposed;
-    
-    public ReadStartEvent(int proposed)
-    {
-      super(System.currentTimeMillis());
-      this.proposed = proposed;
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-      if (state.firstByteReadTime == -1L)
-        state.firstByteReadTime = timestamp;
-      else
-      {
-        // Calculate running minimum amount of time it should have taken for the bytes given
-        long minTime = (long)(((double)state.byteTotal) * 0.75 + 0.5);
-        if (timestamp - state.firstByteReadTime < minTime)
-          throw new Exception("Took too short a time to read "+state.byteTotal+" bytes: "+(timestamp - state.firstByteReadTime));
-      }
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Read start("+proposed+")";
-    }
-  }
-
-  protected static class ReadDoneEvent extends LogEntry
-  {
-    final int actual;
-    
-    public ReadDoneEvent(int actual)
-    {
-      super(System.currentTimeMillis());
-      this.actual = actual;
-    }
-    
-    public void apply(State state)
-      throws Exception
-    {
-      state.byteTotal += actual;
-    }
-    
-    public String toString()
-    {
-      return super.toString() + "; Read done("+actual+")";
-    }
-  }
-
-  protected static class State
-  {
-    public int outstandingConnections = 0;
-    public long lastFetch = 0L;
-    public long firstByteReadTime = -1L;
-    public long byteTotal = 0L;
-  }
-  
-}
diff --git a/framework/core/.gitignore b/framework/core/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/core/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/core/pom.xml b/framework/core/pom.xml
deleted file mode 100644
index 7f33b37..0000000
--- a/framework/core/pom.xml
+++ /dev/null
@@ -1,232 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-core</artifactId>
-  <name>ManifoldCF - Framework - Core</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>com.googlecode.json-simple</groupId>
-      <artifactId>json-simple</artifactId>
-      <version>${json-simple.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-core</artifactId>
-      <version>${log4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <version>${log4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-1.2-api</artifactId>
-      <version>${log4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.velocity</groupId>
-      <artifactId>velocity</artifactId>
-      <version>${velocity.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>oro</groupId>
-          <artifactId>oro</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-      <version>${zookeeper.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>junit</groupId>
-          <artifactId>junit</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-log4j12</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>jline</groupId>
-          <artifactId>jline</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jboss.netty</groupId>
-          <artifactId>netty</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <!-- these dependencies are part of the contract for MCF core; we depend on them in order to guarantee presence and consistent version only -->
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-exec</artifactId>
-      <version>${commons-exec.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-      <version>${gson.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>${guava.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>net.java.dev.jna</groupId>
-      <artifactId>jna-platform</artifactId>
-      <version>${jna.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>mail</artifactId>
-      <version>${mail.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-discovery</groupId>
-      <artifactId>commons-discovery</artifactId>
-      <version>${commons-discovery.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-el</groupId>
-      <artifactId>commons-el</artifactId>
-      <version>${commons-el.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>serializer</artifactId>
-      <version>${xalan.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xml-apis</groupId>
-      <artifactId>xml-apis</artifactId>
-      <version>${xml-apis.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.seleniumhq.selenium</groupId>
-      <artifactId>selenium-java</artifactId>
-      <version>${selenium.version}</version>
-      <scope>test</scope>
-    </dependency> 
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-</project>
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/DBCreate.java b/framework/core/src/main/java/org/apache/manifoldcf/core/DBCreate.java
deleted file mode 100644
index ba2dc18..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/DBCreate.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id: DBCreate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
- * 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 org.apache.manifoldcf.core;
-
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-
-/**
- * Create the database using the name as specified through the {@see ManifoldCF}. The username and password for the
- * configured database need to be specified during construction.
- */
-public class DBCreate extends DBInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: DBCreate.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /**
-   * The userName and password for the database to be created
-   *
-   * @param userName String containing the mandatory database username
-   * @param password String containing the mandatory database password
-   */
-  public DBCreate(String userName, String password)
-  {
-    super(userName, password);
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ManifoldCF.createSystemDatabase(tc, getUserName(), getPassword());
-    Logging.root.info("ManifoldCF database created");
-  }
-
-  /**
-   * Useful when running this class standalone. Provide two arguments, the first is the username, the second
-   * the password. The password is optional, an empty string is used as the default password.
-   *
-   * @param args String[] containing the arguments
-   */
-  public static void main(String[] args)
-  {
-    if (args.length != 1 && args.length != 2)
-    {
-      System.err.println("Usage: DBCreate <dbuser> [<dbpassword>]");
-      System.exit(1);
-    }
-
-    String userName = args[0];
-    String password = "";
-    if (args.length == 2)
-    {
-      password = args[1];
-    }
-
-    DBCreate dbCreate = new DBCreate(userName, password);
-
-    try
-    {
-      dbCreate.execute();
-      System.err.println("ManifoldCF database created");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/DBDrop.java b/framework/core/src/main/java/org/apache/manifoldcf/core/DBDrop.java
deleted file mode 100644
index 9145207..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/DBDrop.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/* $Id: DBDrop.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
- * 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 org.apache.manifoldcf.core;
-
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-
-/**
- * Drop the database using the name as specified through the {@see ManifoldCF}. The username and password for the
- * configured database need to be specified during construction.
- */
-public class DBDrop extends DBInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: DBDrop.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /**
-   * The userName and password for the database to be dropped
-   *
-   * @param userName String containing the mandatory database username
-   * @param password String containing the mandatory database password
-   */
-  public DBDrop(String userName, String password)
-  {
-    super(userName, password);
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ManifoldCF.dropSystemDatabase(tc, getUserName(), getPassword());
-    Logging.root.info("ManifoldCF database dropped");
-  }
-
-  /**
-   * Useful when running this class standalone. Provide two arguments, the first is the username, the second
-   * the password. The password is optional, an empty string is used as the default password.
-   *
-   * @param args String[] containing the arguments
-   */
-  public static void main(String[] args)
-  {
-    if (args.length != 1 && args.length != 2)
-    {
-      System.err.println("Usage: DBDrop <dbuser> [<dbpassword>]");
-      System.exit(1);
-    }
-
-    String userName = args[0];
-    String password = "";
-    if (args.length == 2)
-    {
-      password = args[1];
-    }
-
-    DBDrop dbDrop = new DBDrop(userName, password);
-
-    try
-    {
-      dbDrop.execute();
-      System.err.println("ManifoldCF database dropped");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/DBInitializationCommand.java b/framework/core/src/main/java/org/apache/manifoldcf/core/DBInitializationCommand.java
deleted file mode 100644
index e60da39..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/DBInitializationCommand.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core;
-
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/**
- * Parent class for all database initialization related commands. This class provides methods to
- * obtain username and password for the database. 
- *
- * @author Jettro Coenradie
- */
-public abstract class DBInitializationCommand implements InitializationCommand
-{
-  private final String userName;
-  private final String password;
-
-  /**
-   * The userName and password for the database on which the command needs to be performed
-   *
-   * @param userName String containing the mandatory database username
-   * @param password String containing the mandatory database password
-   */
-  public DBInitializationCommand(String userName, String password)
-  {
-    this.userName = userName;
-    this.password = password;
-  }
-
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    doExecute(tc);
-  }
-
-  protected abstract void doExecute(IThreadContext tc) throws ManifoldCFException;
-
-  protected String getPassword()
-  {
-    return password;
-  }
-
-  protected String getUserName()
-  {
-    return userName;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/InitializationCommand.java b/framework/core/src/main/java/org/apache/manifoldcf/core/InitializationCommand.java
deleted file mode 100644
index 3410437..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/InitializationCommand.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-
-/**
- * Interface for commands that initialize state of the connector framework. Among implementations available are:
- * - Database creation
- * - Registrations of agent
- * - Registrations of connectors
- *
- * @author Jettro Coenradie
- */
-public interface InitializationCommand
-{
-  /**
-   * Execute the command.
-   *
-   * @throws ManifoldCFException Thrown if the execution fails
-   */
-  void execute() throws ManifoldCFException;
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/LockClean.java b/framework/core/src/main/java/org/apache/manifoldcf/core/LockClean.java
deleted file mode 100644
index be16ace..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/LockClean.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/* $Id: LockClean.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core;
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.*;
-
-/**
- * ManifoldCF makes use of a synchronization directory to store data about the current state of the synchronization between
- * the repository connection and the output connection. This class is used to clear this directory.
- */
-public class LockClean implements InitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: LockClean.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public LockClean()
-  {
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  public void execute() throws ManifoldCFException
-  {
-    ManifoldCF.initializeEnvironment(ThreadContextFactory.make());
-    File synchDir = org.apache.manifoldcf.core.lockmanager.FileLockManager.getSynchDirectoryProperty();
-    if (synchDir != null)
-    {
-      // Recursively clean up the contents of the synch directory. But don't remove the directory itself
-      if (synchDir.isDirectory())
-      {
-        removeContentsOfDirectory(synchDir);
-      }
-    }
-    Logging.root.info("Synchronization storage cleaned up");
-  }
-
-  /**
-   * Removes the contents of the directory but not the directory itself.
-   *
-   * @param directory File representing the directory to remove
-   */
-  private void removeContentsOfDirectory(File directory)
-  {
-    File[] files = directory.listFiles();
-    int i = 0;
-    while (i < files.length)
-    {
-      if (files[i].isDirectory())
-      {
-        removeDirectory(files[i]);
-      }
-      else
-      {
-        files[i].delete();
-      }
-      i++;
-    }
-  }
-
-  /**
-   * Removes the contents of the directory as well as the directory itself.
-   *
-   * @param directory File representing the directory to completely remove
-   */
-  private void removeDirectory(File directory)
-  {
-    removeContentsOfDirectory(directory);
-    // Remove the directory itself
-    directory.delete();
-  }
-
-  /**
-   * Useful when running this class standalone. You should not provide any arguments
-   *
-   * @param args String[] containing the arguments
-   */
-  public static void main(String[] args)
-  {
-    if (args.length != 0)
-    {
-      System.err.println("Usage: LockClean");
-      System.exit(1);
-    }
-
-    LockClean lockClean = new LockClean();
-
-    try
-    {
-      lockClean.execute();
-      System.err.println("Synchronization storage cleaned up");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(2);
-    }
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/Obfuscate.java b/framework/core/src/main/java/org/apache/manifoldcf/core/Obfuscate.java
deleted file mode 100644
index ff1870b..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/Obfuscate.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.*;
-
-public class Obfuscate
-{
-  public static final String _rcsid = "@(#)$Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private Obfuscate()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: Obfuscate <string>");
-      System.exit(1);
-    }
-
-    String string = args[0];
-    try
-    {
-      String ob = ManifoldCF.obfuscate(string);
-      UTF8Stdout.println(ob);
-      //System.err.println("("+ManifoldCF.deobfuscate(ob)+")");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/auth/DefaultAuthenticator.java b/framework/core/src/main/java/org/apache/manifoldcf/core/auth/DefaultAuthenticator.java
deleted file mode 100644
index 6e9c2d0..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/auth/DefaultAuthenticator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.auth;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Default authenticator for MCF system.
-*/
-public class DefaultAuthenticator implements IAuth
-{
-
-  /** UI login user name */
-  public static final String loginUserNameProperty = "org.apache.manifoldcf.login.name";
-  /** UI login password */
-  public static final String loginPasswordProperty = "org.apache.manifoldcf.login.password";
-
-  /** API login user name */
-  public static final String apiLoginUserNameProperty = "org.apache.manifoldcf.apilogin.name";
-  /** API login password */
-  public static final String apiLoginPasswordProperty = "org.apache.manifoldcf.apilogin.password";
-
-  protected final String loginUserName;
-  protected final String loginPassword;
-  protected final String apiLoginUserName;
-  protected final String apiLoginPassword;
-  
-  /** Constructor */
-  public DefaultAuthenticator(final IThreadContext threadContext)
-    throws ManifoldCFException {
-    loginUserName = LockManagerFactory.getStringProperty(threadContext,loginUserNameProperty,"admin");
-    loginPassword = LockManagerFactory.getPossiblyObfuscatedStringProperty(threadContext,loginPasswordProperty,"admin");
-
-    apiLoginUserName = LockManagerFactory.getStringProperty(threadContext,apiLoginUserNameProperty,"");
-    apiLoginPassword = LockManagerFactory.getPossiblyObfuscatedStringProperty(threadContext,apiLoginPasswordProperty,"");
-  }
-    
-  /** Verify UI login */
-  @Override
-  public boolean verifyUILogin(final String userId, final String password)
-    throws ManifoldCFException {
-    if (userId != null && password != null)
-    {
-      return userId.equals(loginUserName) &&  password.equals(loginPassword);
-    }
-    return false;
-  }
-
-  /** Verify API login */
-  @Override
-  public boolean verifyAPILogin(final String userId, final String password)
-    throws ManifoldCFException {
-    if (userId != null && password != null)
-    {
-      return userId.equals(apiLoginUserName) &&  password.equals(apiLoginPassword);
-    }
-    return false;
-  }
-	
-  /** Check user capability */
-  public boolean checkCapability(final String userId, final int capability)
-    throws ManifoldCFException {
-    // MHL when we add capability support throught MCF
-    return true;
-  }
-  
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/auth/LdapAuthenticator.java b/framework/core/src/main/java/org/apache/manifoldcf/core/auth/LdapAuthenticator.java
deleted file mode 100644
index b64612a..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/auth/LdapAuthenticator.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.core.auth;
-
-import java.util.Hashtable;
-
-import javax.naming.Context;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
-import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.manifoldcf.core.interfaces.IAuth;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.LockManagerFactory;
-
-public class LdapAuthenticator implements IAuth {
-
-  private static final String CONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
-  
-  private static final String PROVIDER_URL_PROPERTY = "org.apache.manifoldcf.login.ldap.providerurl";
-  private static final String SECURITY_AUTHENTICATION_TYPE = "org.apache.manifoldcf.login.ldap.securityauthenticationtype";
-  private static final String SECURITY_PRINCIPLE = "org.apache.manifoldcf.login.ldap.securityprincipal";
-  private static final String CONTEXT_SEARCH_QUERY = "org.apache.manifoldcf.login.ldap.contextsearchquery";
-  private static final String SEARCH_ATTRIBUTE = "org.apache.manifoldcf.login.ldap.searchattribute";
-
-  protected final String securityPrincipal;
-  protected final String securityAuthenticationType;
-  protected final String providerURLProperty;
-  protected final String contextSearchQuery;
-  protected final String searchAttribute;
-  
-  /** Constructor */
-  public LdapAuthenticator(final IThreadContext threadContext)
-    throws ManifoldCFException {
-    securityPrincipal = LockManagerFactory.getStringProperty(threadContext,SECURITY_PRINCIPLE,"");
-    securityAuthenticationType = LockManagerFactory.getStringProperty(threadContext,SECURITY_AUTHENTICATION_TYPE,"simple");
-    providerURLProperty = LockManagerFactory.getStringProperty(threadContext,PROVIDER_URL_PROPERTY,"");
-    contextSearchQuery = LockManagerFactory.getStringProperty(threadContext,CONTEXT_SEARCH_QUERY,"");
-    searchAttribute = LockManagerFactory.getStringProperty(threadContext,SEARCH_ATTRIBUTE,"uid");
-  }
-  
-  /**
-   * @param userID
-   * @param password
-   * @return
-   */
-  private Hashtable<String, String> buildEnvironment(String userID,
-      String password) {
-
-    Hashtable<String, String> environment = new Hashtable<String, String>();
-
-    environment.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY);
-
-    environment.put(Context.PROVIDER_URL,
-        providerURLProperty);
-
-    environment.put(Context.SECURITY_AUTHENTICATION,
-        securityAuthenticationType);
-    environment.put(
-        Context.SECURITY_PRINCIPAL,
-        substituteUser(securityPrincipal, userID));
-    environment.put(Context.SECURITY_CREDENTIALS, password);
-
-    return environment;
-  }
-
-  /**
-   * @param source
-   * @param substitution
-   * @return
-   */
-  private static String substituteUser(String source, String substitution) {
-    return source.replace("$(userID)", substitution);
-  }
-
-  /**
-   * @param userId
-   * @param password
-   * @return
-   */
-  @Override
-  public boolean verifyUILogin(final String userId, final String password)
-    throws ManifoldCFException {
-    return verifyLogin(userId, password);
-  }
-  
-  @Override
-  public boolean verifyAPILogin(final String userId, final String password)
-    throws ManifoldCFException {
-    return verifyLogin(userId, password);
-  }
-
-  protected boolean verifyLogin(final String userId, final String password)
-    throws ManifoldCFException {
-
-    boolean authenticated = false;
-
-    if (StringUtils.isNotEmpty(userId) && StringUtils.isNotEmpty(password)) {
-
-      try {
-
-        Logging.misc
-            .info("Authentication attempt for user = " + userId);
-
-        // Create initial context
-        DirContext ctx = new InitialDirContext(buildEnvironment(userId,
-            password));
-
-        NamingEnumeration results = null;
-        try {
-
-          SearchControls controls = new SearchControls();
-          controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-
-          results = ctx
-              .search("",
-                  substituteUser(contextSearchQuery,
-                      userId), controls);
-          // is the user in the group?
-          while (results.hasMore()) {
-            SearchResult searchResult = (SearchResult) results
-                .next();
-
-            if (userId.equals(searchResult.getAttributes()
-                .get(searchAttribute)
-                .get())) {
-
-              Logging.misc.info("Successfully authenticated : "
-                  + userId);
-
-              authenticated = true;
-              break;
-            }
-          }
-
-        } catch (Exception e) {
-          Logging.misc.error("User not authenticated = " + userId
-              + " exception = " + e.getMessage(), e);
-          throw new ManifoldCFException("User not authenticated: "+e.getMessage(),e);
-        } finally {
-
-          if (results != null) {
-            try {
-              results.close();
-            } catch (Exception e) {
-              // do nothing
-            }
-          }
-          if (ctx != null) {
-            try {
-              ctx.close();
-            } catch (Exception e) {
-              // do nothing
-            }
-          }
-        }
-
-      } catch (NamingException e) {
-        Logging.misc.error("Exception authenticating user = " + userId
-            + " exception = " + e.getMessage(), e);
-        throw new ManifoldCFException("Exception authenticating user: "+e.getMessage(),e);
-      }
-    }
-    return authenticated;
-  }
-  
-  /** Check user capability */
-  public boolean checkCapability(final String userId, final int capability)
-    throws ManifoldCFException {
-    // No current ability to distinguish roles
-    return true;
-  }
-
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/BaseDescription.java b/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/BaseDescription.java
deleted file mode 100644
index c07adb6..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/BaseDescription.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $Id: BaseDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.cachemanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This is the base class for cache object descriptions.
-* The base class sets up LRU behavior based on parameters
-* in a configuration file, and also bases expiration on the
-* same class picture.
-*/
-public abstract class BaseDescription implements ICacheDescription
-{
-  public static final String _rcsid = "@(#)$Id: BaseDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected ICacheClass cacheClass = null;
-
-  protected final static Integer max_value = new Integer(Integer.MAX_VALUE);
-
-  public BaseDescription(String objectClassName)
-  {
-    if (objectClassName != null)
-      cacheClass = new LocalCacheClass(objectClassName);
-  }
-
-  public BaseDescription(String objectClassName, int maxLRUCount)
-  {
-    if (objectClassName != null)
-      cacheClass = new LocalCacheClass(objectClassName,maxLRUCount);
-  }
-
-  /** Get the object class for an object.  The object class is used to determine
-  * the group of objects treated in the same LRU manner.
-  * @return the newly created object's object class, or null if there is no
-  * such class, and LRU behavior is not desired.
-  */
-  public ICacheClass getObjectClass()
-  {
-    return cacheClass;
-  }
-
-  /** Obtain an expiration time for an object, in milliseconds since epoch.
-  * The cache manager will call this method for all objects that are being operated on,
-  * so that their expiration timestamps get properly updated to a new time.
-  * @return a time in milliseconds for the object to expire, or -1 if there is no expiration
-  * desired.
-  */
-  public long getObjectExpirationTime(long currentTime)
-  {
-    return -1;
-  }
-
-  /** This is a cache class implementation that gets expiration and LRU info
-  * from .ini variables.
-  */
-  protected class LocalCacheClass implements ICacheClass
-  {
-    protected String objectClassName;
-    protected Integer maxLRUCount = null;
-
-    public LocalCacheClass(String objectClassName)
-    {
-      this(objectClassName,-1);
-    }
-    
-    public LocalCacheClass(String objectClassName, int maxLRUCount)
-    {
-      this.objectClassName = objectClassName;
-      if (maxLRUCount != -1)
-        this.maxLRUCount = new Integer(maxLRUCount);
-    }
-
-    /** Get the name of the object class.
-    * This determines the set of objects that are treated in the same
-    * LRU pool.
-    *@return the class name.
-    */
-    public String getClassName()
-    {
-      return objectClassName;
-    }
-
-    /** Get the maximum LRU count of the object class.
-    *@return the maximum number of the objects of the particular class
-    * allowed.
-    */
-    public int getMaxLRUCount()
-    {
-      if (maxLRUCount == null)
-      {
-        try
-        {
-          String x = null; // JSKW.getProperty("cache."+objectClassName+".lrusize");
-          if (x == null)
-            maxLRUCount = max_value;
-          else
-            maxLRUCount = new Integer(x);
-        }
-        catch (Exception e)
-        {
-          maxLRUCount = max_value;
-        }
-      }
-      return maxLRUCount.intValue();
-    }
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/CacheManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/CacheManager.java
deleted file mode 100644
index e72e3d5..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/CacheManager.java
+++ /dev/null
@@ -1,1245 +0,0 @@
-/* $Id: CacheManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.cachemanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.io.*;
-
-/** This class implements the cache manager interface, and provides generic cache management
-* services.  See the interface for a description of how the services work.  However, since this
-* service requires the lock manager, and there is one lock manager per thread, there will
-* be one of these service instances per thread as well.
-*/
-public class CacheManager implements ICacheManager
-{
-  public static final String _rcsid = "@(#)$Id: CacheManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final static String cacheLockPrefix = "_Cache_";
-
-  protected ILockManager lockManager;
-  protected static GeneralCache cache = new GeneralCache();
-
-  // This is the hash mapping transaction id's to CacheTransactionHandle objects.
-  // It is thread specific because transactions are thread local.
-  protected HashMap transactionHash = new HashMap();
-
-  public CacheManager(IThreadContext context)
-    throws ManifoldCFException
-  {
-    lockManager = LockManagerFactory.make(context);
-  }
-
-  /** Locate or create a set of objects in the cached object pool, and/or destroy and invalidate
-  * the same or other objects.
-  *
-  * For each "locate" object
-  * described below, one of two things will happen: the execObject's exists() method
-  * will be called (if the object exists in the cache already), or the execObject's create*()
-  * family of methods will be called.  When all objects have been declared to the execObject,
-  * finally the execute() method will be called.  In both cases, all objects are considered
-  * to be locked, and cannot be invalidated until the lock is cleared (after the end of the called method).
-  *
-  * For the invalidation descriptions, the execObject's destroy() method will be called instead.
-  * The object will be invalidated from the cache at the end of the findObjectsAndExecute() operation.
-  *
-  * It is perfectly legal to include the same object in both the locate set and the invalidate set!
-  *
-  * If an error occurs during object creation, the execute() method will NOT be called.  If the
-  * execute() method has an error, the objects that were created will still be recorded in the cache.
-  *
-  * @param locateObjectDescriptions is a set of description objects that uniquely describe the objects needed.
-  * @param invalidateKeys is the set of keys to invalidate at the end of the execution.
-  * @param execObject is the cache execution object whose create() or execute() methods will
-  * be called.
-  * @param transactionID is the current transaction identifier, or null.  Objects created within this call
-  * will be associated with this transaction; they will be purged from the cache should the transaction
-  * be rolled back.
-  */
-  public void findObjectsAndExecute(ICacheDescription[] locateObjectDescriptions, StringSet invalidateKeys,
-    ICacheExecutor execObject, String transactionID)
-    throws ManifoldCFException
-  {
-    // There is some clever engineering involved here.  The lock manager is used to control synchronization
-    // around usage and invalidation of objects.  However, there is ANOTHER lock condition that needs to be
-    // managed as well in this code.  Specifically, in a single JVM, only one thread should be allowed to
-    // create an object at a time.
-    //
-    // This is not a true "lock", because it doesn't cross JVM boundaries.  However, it is not brute-force
-    // like a synchronizer either (a synchronizer would single-thread all object creation and usage).
-    // Instead, we need to create a specific object for every object being located.  Then, a synchronizer
-    // on that object can insure that only one thread per JVM is allowed to create a given object at a time,
-    // and the others see an "existing" object instead.
-    //
-    // The basic logic is that the sync object is looked up from a global pool in a synchronized way, and if
-    // found indicates that a creation is in progress on the corresponding object.  The thread must then wait
-    // until the synchronizer object is released before continuing.  Since true locks have already been thrown,
-    // it is guaranteed that the object cannot be destroyed, and the released threads can refind the object
-    // and use it as "existing".  Basically, it's a runt version of the lock manager.
-
-    ICacheHandle handle = enterCache(locateObjectDescriptions,invalidateKeys,transactionID);
-    try
-    {
-      // Ok, we locked everything we need.
-      // Now we need to create what is not yet there.
-      // First, call create() or exists() on the "locate" objects (and also update the
-      // LRU times)
-      if (locateObjectDescriptions != null)
-      {
-        // We are going to go through the locate object list twice; once to see
-        // what we need to create, and a second time after we do the creation.
-
-        // Accumulate non-cached objects here.
-        HashMap allObjects = new HashMap();
-        int i;
-
-        ICacheCreateHandle createHandle = enterCreateSection(handle);
-        try
-        {
-          // Now, go through the objects again, and see which ones we need
-          // to create.  The ones with null cache sets will always need creation.
-          ArrayList createList = new ArrayList();
-          i = 0;
-          while (i < locateObjectDescriptions.length)
-          {
-            ICacheDescription objectDescription = locateObjectDescriptions[i++];
-            StringSet set = objectDescription.getObjectKeys();
-            if (set == null)
-              createList.add(objectDescription);
-            else
-            {
-              Object o = lookupObject(createHandle,objectDescription);
-              if (o == null)
-                createList.add(objectDescription);
-              else
-                allObjects.put(objectDescription,o);
-            }
-          }
-          // Perform the create operation
-          ICacheDescription[] createDescriptions = new ICacheDescription[createList.size()];
-          i = 0;
-          while (i < createList.size())
-          {
-            createDescriptions[i] = (ICacheDescription)createList.get(i);
-            i++;
-          }
-          Object[] createdObjects = execObject.create(createDescriptions);
-          if (createdObjects == null)
-            return;
-          // Loop through the returned objects, and enter them into the cache
-          i = 0;
-          while (i < createdObjects.length)
-          {
-            saveObject(createHandle,createDescriptions[i],createdObjects[i]);
-            allObjects.put(createDescriptions[i],createdObjects[i]);
-            i++;
-          }
-        }
-        finally
-        {
-          leaveCreateSection(createHandle);
-        }
-
-        i = 0;
-        while (i < locateObjectDescriptions.length)
-        {
-          ICacheDescription objectDescription = locateObjectDescriptions[i++];
-          Object o = allObjects.get(objectDescription);
-          // It already exists - send it to the executor
-          execObject.exists(objectDescription,o);
-        }
-      }
-
-      // Now, call the execute method
-      if (execObject != null)
-        execObject.execute();
-
-      invalidateKeys(handle);
-    }
-    finally
-    {
-      leaveCache(handle);
-    }
-  }
-
-  /** Second way of doing cache management.
-  * Basically, this approach breaks the findObjectsAndExecute() method down into bite-sized chunks.
-  * The goal is additional flexibility, and an executor object does not need to be defined.
-  * Pretty much everything else is identical.  The objects returned by the manager methods
-  * provide context control and enforce the proper ordering and nesting.
-  * This method enters the cacher and builds a cache handle.  Once a cache handle is
-  * returned, the calling code MUST, under all circumstances, leave the cache using the
-  * same handle.
-  * @param locateObjectDescriptions is a set of description objects that uniquely describe the objects needed.
-  * May be null if no objects are desired.
-  * @param invalidateKeys are the keys to invalidate after successful execution.  May be null.
-  * @param transactionID is the current transaction identifier, or null.  Objects created within this block
-  * will be associated with this transaction; they will be purged from the cache should the transaction
-  * be rolled back.
-  * @return a cache handle.
-  */
-  public ICacheHandle enterCache(ICacheDescription[] locateObjectDescriptions, StringSet invalidateKeys,
-    String transactionID)
-    throws ManifoldCFException
-  {
-    if (Logging.cache.isDebugEnabled())
-    {
-      StringBuilder sb = new StringBuilder();
-      if (locateObjectDescriptions != null)
-      {
-        sb.append("{");
-        int i = 0;
-        while (i < locateObjectDescriptions.length)
-        {
-          if (i > 0)
-            sb.append(",");
-          sb.append(locateObjectDescriptions[i].getCriticalSectionName());
-          i++;
-        }
-        sb.append("}");
-      }
-      else
-        sb.append("NULL");
-
-      StringBuilder inv = new StringBuilder();
-      if (invalidateKeys != null)
-      {
-        inv.append("{");
-        boolean isFirst = true;
-        Iterator iter = invalidateKeys.getKeys();
-        while (iter.hasNext())
-        {
-          if (isFirst)
-            isFirst = false;
-          else
-            inv.append(",");
-          inv.append((String)iter.next());
-        }
-        inv.append("}");
-      }
-      else
-        inv.append("NULL");
-
-      Logging.cache.debug("Entering cacher; objects = "+sb.toString()+" invalidate keys = "+inv.toString());
-    }
-
-    // First, throw read locks for the locate objects and write locks for invalidate objects.
-    // To do the read locks, we need to go through the locate objects and get their cache keys.
-    // This must be done prior to the object even being created.
-    StringSetBuffer readLockTable = new StringSetBuffer();
-    if (locateObjectDescriptions != null)
-    {
-      int i = 0;
-      while (i < locateObjectDescriptions.length)
-      {
-        ICacheDescription objectDescription = locateObjectDescriptions[i++];
-        // Get the keys
-        StringSet keys = objectDescription.getObjectKeys();
-        if (keys != null)
-        {
-          readLockTable.add(keys);
-        }
-      }
-    }
-    // Convert readLockTable to a StringSet
-    StringSet readKeys = new StringSet(readLockTable);
-
-    // The locks we will actually throw depend on whether or not we are in a transaction.  The
-    // transaction filters the locks that are needed; locks are preserved within the transaction.
-    // The cache handle itself also does not need the same data - in a transaction, readLocks and writeLocks
-    // passed to the handle will be null (because we don't want them to be freed until the transaction exits).
-    CacheHandle ch;
-    if (transactionID == null)
-    {
-      String[] writeLocks = null;
-      if (invalidateKeys != null)
-        writeLocks = invalidateKeys.getArray(cacheLockPrefix);
-      String[] readLocks = readKeys.getArray(cacheLockPrefix);
-      ch = new CacheHandle(readLocks,writeLocks,locateObjectDescriptions,invalidateKeys,transactionID);
-      Logging.lock.debug("Starting cache outside transaction");
-      lockManager.enterLocks(readLocks,null,writeLocks);
-      Logging.lock.debug(" Done starting cache");
-    }
-    else
-    {
-      CacheTransactionHandle handle = (CacheTransactionHandle)transactionHash.get(transactionID);
-      if (handle == null)
-      {
-        ManifoldCFException ex = new ManifoldCFException("Illegal transaction ID: '"+transactionID+"'",ManifoldCFException.GENERAL_ERROR);
-        Logging.cache.error(Thread.currentThread().toString()+": enterCache: "+transactionID+": "+this.toString()+": Transaction hash = "+transactionHash.toString(),ex);
-        throw ex;
-      }
-
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug("Starting cache in transaction "+transactionID);
-
-      ch = new CacheHandle(null,null,locateObjectDescriptions,invalidateKeys,transactionID);
-      StringSet newReadLocks = handle.getRemainingReadLocks(readKeys,invalidateKeys);
-      StringSet newWriteLocks = handle.getRemainingWriteLocks(readKeys,invalidateKeys);
-      lockManager.enterLocks(newReadLocks.getArray(cacheLockPrefix),null,newWriteLocks.getArray(cacheLockPrefix));
-      handle.addLocks(newReadLocks,newWriteLocks);
-      // Logging.lock.debug(" Done starting cache");
-    }
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Successfully entered cacher; handle = "+ch.toString());
-    }
-
-    return ch;
-  }
-
-  /** Enter a creation critical section.  This insures that only one thread is
-  * creating the specified objects at a time.  This MUST be paired with
-  * a leaveCreateSection() method call, whatever happens.
-  *@param handle is the cache handle.
-  */
-  public ICacheCreateHandle enterCreateSection(ICacheHandle handle)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Entering cache create section; cache handle = "+handle.toString());
-    }
-
-    // Since we are inside the locks, any existing object cannot be invalidated;
-    // however, it is possible that more than one thread can attempt to perform
-    // object creation for the same object.  The only way to prevent this is to
-    // throw a multiple critical section writelock on all the objects.  This will
-    // stop multiple creation.
-    ICacheDescription[] locateObjectDescriptions = handle.getObjectDescriptions();
-    if (locateObjectDescriptions == null)
-      throw new ManifoldCFException("Can't enter create section without objects to create",
-      ManifoldCFException.GENERAL_ERROR);
-    int i = 0;
-    ArrayList writeCriticalSectionArray = new ArrayList();
-    while (i < locateObjectDescriptions.length)
-    {
-      ICacheDescription objectDescription = locateObjectDescriptions[i++];
-      StringSet set = objectDescription.getObjectKeys();
-
-      // If this object is uncached, we do NOT try to synchronize creation, since it is
-      // a waste of time to do that.  Multiple objects will need to be created anyhow.
-      if (set != null)
-        writeCriticalSectionArray.add(objectDescription.getCriticalSectionName());
-    }
-    // Make it into an array.
-    String[] writeCriticalSections = new String[writeCriticalSectionArray.size()];
-    i = 0;
-    while (i < writeCriticalSectionArray.size())
-    {
-      writeCriticalSections[i] = (String)writeCriticalSectionArray.get(i);
-      i++;
-    }
-
-    CacheCreateHandle ch = new CacheCreateHandle(writeCriticalSections,handle.getTransactionID());
-    // Enter critical section (but only based on the objects we intend to cache).
-    lockManager.enterCriticalSections(null,null,writeCriticalSections);
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Successfully entered cache create section for handle = "+
-        handle.toString()+"; section handle = "+ch.toString());
-    }
-
-    return ch;
-  }
-
-  /** Lookup an object.  Returns null if object not found.  If it is found,
-  * object's LRU and expiration info are updated.  The objectDescription passed
-  * MUST be one of the ones specified in the enclosing enterCache() method.
-  *@param handle is the handle to use for the create.
-  *@param objectDescription is the description of the object to look up.
-  *@return the object, or null if not found.
-  */
-  public Object lookupObject(ICacheCreateHandle handle, ICacheDescription objectDescription)
-    throws ManifoldCFException
-  {
-    if (handle == null)
-      throw new ManifoldCFException("Can't do lookup outside of create section",
-      ManifoldCFException.GENERAL_ERROR);
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Looking up object in section handle = "+handle.toString()+
-        "; object name = '"+objectDescription.getCriticalSectionName()+"'");
-    }
-
-    StringSet set = objectDescription.getObjectKeys();
-    // If no cache keys, it can't be cached, so don't check!
-    if (set == null)
-      return null;
-
-    // If this is in a transaction, we must look at the local cached copy first.
-    // In fact, we walk back through the chain of parent transactions until we find it,
-    // or until the cache keys are invalid against the transaction's invalidation keys.
-    String transactionID = handle.getTransactionID();
-    if (transactionID != null)
-    {
-      CacheTransactionHandle transactionHandle = (CacheTransactionHandle)transactionHash.get(transactionID);
-      if (transactionHandle == null)
-      {
-        ManifoldCFException ex = new ManifoldCFException("Illegal transaction id",ManifoldCFException.GENERAL_ERROR);
-        Logging.cache.error(Thread.currentThread().toString()+": lookupObject: "+transactionID+": "+this.toString()+": Transaction hash = "+transactionHash.toString(),ex);
-        throw ex;
-      }
-      while (transactionHandle != null)
-      {
-        // Look for the object
-        Object q = transactionHandle.lookupObject(objectDescription);
-        if (q != null)
-        {
-          if (Logging.cache.isDebugEnabled())
-          {
-            Logging.cache.debug(" Object '"+objectDescription.getCriticalSectionName()+"' found in transaction cache");
-          }
-          return q;
-        }
-        // See if we can look at the parent
-        if (transactionHandle.checkCacheKeys(set))
-          return null;
-        transactionHandle = transactionHandle.getParentTransaction();
-      }
-      // If nothing stops us, look in the global cache too
-    }
-
-    Object o = cache.lookup(objectDescription);
-    if (o == null)
-      return null;
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug(" Object '"+objectDescription.getCriticalSectionName()+"' exists locally; checking if local copy is valid");
-    }
-
-    // See if the object's attached expiration is before the current time.
-    long expireTime = cache.getObjectExpirationTime(objectDescription);
-    if (expireTime != -1L && expireTime <= handle.getLookupTime())
-    {
-      // Blow away the entry in cache, since it has expired
-      cache.deleteObject(objectDescription);
-      return null;
-    }
-    
-    // Before we conclude that the object is found, if we are on a multi-JVM environment we MUST check
-    // the object's timestamp!!!  We check it against the invalidation key file timestamps for the object.
-    long createTime = cache.getObjectCreationTime(objectDescription);
-    StringSet keys = cache.getObjectInvalidationKeys(objectDescription);
-
-    Iterator iter = keys.getKeys();
-    while (iter.hasNext())
-    {
-      String key = (String)iter.next();
-      if (hasExpired(key,createTime))
-      {
-        // Blow away the entry in cache, since it has expired
-        cache.deleteObject(objectDescription);
-        return null;
-      }
-    }
-
-    // System.out.println("Found object: "+objectDescription.getCriticalSectionName());
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug(" Object '"+objectDescription.getCriticalSectionName()+"' is valid; resetting local expiration");
-    }
-
-    // Update the expiration time for this object.
-    resetObjectExpiration(objectDescription,handle.getLookupTime());
-
-    return o;
-  }
-
-  /** Check if object has expired (by looking at file system).
-  *@param key is the invalidation key.
-  *@param createTime is the creation time.
-  *@return true if expired, false otherwise.
-  */
-  protected boolean hasExpired(String key, long createTime)
-    throws ManifoldCFException
-  {
-    long createdDate = readSharedData(key);
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug(" Checking whether our cached copy of object with key = "+key+" has been invalidated.  It has create time "+new Long(createTime).toString()+", and the last change is "+new Long(createdDate).toString());
-    }
-    if (createdDate == 0L)
-      return false;
-    return createdDate >= createTime;
-  }
-
-  /** Set object's expiration and LRU.
-  *@param objectDescription is the description object.
-  *@param currentTime is the current time in milliseconds since epoch.
-  */
-  protected void resetObjectExpiration(ICacheDescription objectDescription, long currentTime)
-  {
-
-    // Update the expiration time for this object.
-    long expireInterval = objectDescription.getObjectExpirationTime(currentTime);
-    cache.setObjectExpiration(objectDescription,expireInterval);
-
-    // Update LRU and max counts.  This also flushes the cache to meet the criteria.
-    ICacheClass objectClass = objectDescription.getObjectClass();
-    if (objectClass != null)
-      cache.setObjectClass(objectDescription,objectClass.getClassName(),objectClass.getMaxLRUCount());
-    else
-      cache.setObjectClass(objectDescription,null,Integer.MAX_VALUE);
-
-  }
-
-  /** Save a newly created object.  The object MUST be one of those identified in the
-  * enterCache() method.
-  *@param handle is the create handle.
-  *@param objectDescription is the object description.
-  *@param object is the object.
-  */
-  public void saveObject(ICacheCreateHandle handle, ICacheDescription objectDescription,
-    Object object)
-    throws ManifoldCFException
-  {
-    if (handle == null)
-      throw new ManifoldCFException("Can't do save outside of create section",
-      ManifoldCFException.GENERAL_ERROR);
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      StringSet ks = objectDescription.getObjectKeys();
-      StringBuilder sb = new StringBuilder();
-      if (ks != null)
-      {
-        sb.append("{");
-        Iterator iter = ks.getKeys();
-        boolean isFirst = true;
-        while (iter.hasNext())
-        {
-          if (isFirst)
-            isFirst = false;
-          else
-            sb.append(",");
-          sb.append((String)iter.next());
-        }
-        sb.append("}");
-      }
-      else
-        sb.append("NULL");
-
-      Logging.cache.debug("Saving new object in section handle = "+handle.toString()+
-        "; object description = '"+objectDescription.getCriticalSectionName()+
-        "; cache keys = "+sb.toString());
-    }
-
-
-    StringSet keys = objectDescription.getObjectKeys();
-    if (keys != null)
-    {
-      String transactionID = handle.getTransactionID();
-      if (transactionID == null)
-      {
-        cache.setObject(objectDescription,object,keys,handle.getLookupTime());
-        // Update the expiration time for this object.
-        resetObjectExpiration(objectDescription,handle.getLookupTime());
-      }
-      else
-      {
-        // Put it into the transaction object
-        // Expiration and LRU don't count here; they get applied when the object goes into
-        // the global cache.
-        CacheTransactionHandle transactionHandle = (CacheTransactionHandle)transactionHash.get(transactionID);
-        if (transactionHandle == null)
-        {
-          ManifoldCFException ex = new ManifoldCFException("Bad transaction handle",ManifoldCFException.GENERAL_ERROR);
-          Logging.cache.error(Thread.currentThread().toString()+": saveObject: "+transactionID+": "+this.toString()+": Transaction hash = "+transactionHash.toString(),ex);
-          throw ex;
-        }
-        transactionHandle.saveObject(objectDescription,object,keys);
-      }
-    }
-  }
-
-  /** Leave the create section.
-  *@param handle is the handle created by the corresponding enterCreateSection() method.
-  */
-  public void leaveCreateSection(ICacheCreateHandle handle)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Leaving cache create section; section handle = "+handle.toString());
-    }
-
-    lockManager.leaveCriticalSections(null,null,handle.getCriticalSectionNames());
-  }
-
-  /** Invalidate keys.  The keys invalidated are what got passed to the enterCache() method.
-  *@param handle is the cache handle.  Does nothing if a null set of keys was passed in.
-  */
-  public void invalidateKeys(ICacheHandle handle)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Invalidating keys; handle = "+handle.toString());
-    }
-
-
-    StringSet invalidateKeys = handle.getInvalidationKeys();
-    // Get the transaction handle in effect
-    String transactionID = handle.getTransactionID();
-    if (transactionID == null)
-    {
-      performInvalidation(invalidateKeys);
-    }
-    else
-    {
-      CacheTransactionHandle transactionHandle = (CacheTransactionHandle)transactionHash.get(transactionID);
-      if (transactionHandle == null)
-      {
-        ManifoldCFException ex = new ManifoldCFException("Bad transaction ID!",ManifoldCFException.GENERAL_ERROR);
-        Logging.cache.error(Thread.currentThread().toString()+": invalidateKeys: "+transactionID+": "+this.toString()+": Transaction hash = "+transactionHash.toString(),ex);
-        throw ex;
-      }
-      // Do the invalidation right in the transaction handle.
-      transactionHandle.invalidateKeys(invalidateKeys);
-    }
-  }
-
-  /** Perform an invalidation.  Assume all appropriate locks are in place.
-  *@param keys is the set of keys to invalidate.
-  */
-  protected void performInvalidation(StringSet keys)
-    throws ManifoldCFException
-  {
-
-    // Finally, perform the invalidation.
-
-    if (keys != null)
-    {
-      long invalidationTime = System.currentTimeMillis();
-      // Loop through all keys
-      Iterator iter = keys.getKeys();
-      while (iter.hasNext())
-      {
-        String keyName = (String)iter.next();
-        if (Logging.cache.isDebugEnabled())
-          Logging.cache.debug(" Invalidating key = "+keyName+" as of time = "+new Long(invalidationTime).toString());
-        writeSharedData(keyName,invalidationTime);
-      }
-
-      cache.invalidateKeys(keys);
-    }
-  }
-
-  /** Leave the cache.  Must be paired with enterCache, above.
-  *@param handle is the handle of the cache we are leaving.
-  */
-  public void leaveCache(ICacheHandle handle)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Leaving cacher; handle = "+handle.toString());
-    }
-
-    lockManager.leaveLocks(handle.getReadLockStrings(),null,handle.getWriteLockStrings());
-  }
-
-  // The following methods are used to communicate transaction information to the cache.
-
-  /** Begin a cache transaction.
-  * This keeps track of the relationship between objects cached within transactions.
-  *@param startingTransactionID is the id of the transaction that is starting.
-  *@param enclosingTransactionID is the id of the transaction that is in effect, or null.
-  */
-  public void startTransaction(String startingTransactionID, String enclosingTransactionID)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug(Thread.currentThread().toString()+": Starting transaction: "+startingTransactionID+": "+this.toString()+": "+transactionHash.toString());
-    }
-
-    CacheTransactionHandle parent;
-    if (enclosingTransactionID == null)
-      parent = null;
-    else
-    {
-      parent = (CacheTransactionHandle)transactionHash.get(enclosingTransactionID);
-      if (parent == null)
-      {
-        ManifoldCFException ex = new ManifoldCFException("Illegal parent transaction ID: "+enclosingTransactionID,
-          ManifoldCFException.GENERAL_ERROR);
-        Logging.cache.error(Thread.currentThread().toString()+": startTransaction: "+this.toString()+": Transaction hash = "+transactionHash.toString(),ex);
-        throw ex;
-      }
-    }
-
-    transactionHash.put(startingTransactionID,new CacheTransactionHandle(parent));
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug("Successfully created transaction: "+startingTransactionID+": "+this.toString()+": "+transactionHash.toString());
-    }
-
-  }
-
-  /** Commit a cache transaction.
-  * This method MUST be called when a transaction successfully ends, or open locks will not be closed!!!
-  * All cache activity that has taken place inside the transaction will be resolved, and the cache locks
-  * held open will be released.
-  */
-  public void commitTransaction(String transactionID)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug(Thread.currentThread().toString()+": Committing transaction: "+transactionID+": "+this.toString()+": "+transactionHash.toString());
-    }
-
-    CacheTransactionHandle handle = (CacheTransactionHandle)transactionHash.get(transactionID);
-    if (handle == null)
-      throw new ManifoldCFException("Cache manager: commit transaction without start!",ManifoldCFException.GENERAL_ERROR);
-
-    // First, move all the locally cached entries into the global cache.
-    // This is safe to do because we know that the transaction belongs to a single thread.
-    CacheTransactionHandle parentTransaction = handle.getParentTransaction();
-    Iterator iter = handle.getCurrentObjects();
-    StringSet invalidationKeys = handle.getInvalidationKeys();
-    if (parentTransaction == null)
-    {
-      // It will be folded into the main cache!
-      // First, trigger invalidation.
-      performInvalidation(invalidationKeys);
-      long currentTime = System.currentTimeMillis();
-      // Now, copy the objects into the main cache
-      while (iter.hasNext())
-      {
-        ICacheDescription desc = (ICacheDescription)iter.next();
-        Object o = handle.lookupObject(desc);
-        // System.out.println("Moving object to main cache: "+desc.getCriticalSectionName());
-        cache.setObject(desc,o,desc.getObjectKeys(),currentTime);
-        // Now, set expiration and LRU
-        // Update the expiration time for this object.
-        resetObjectExpiration(desc,currentTime);
-      }
-      // End all of the locks.
-      // We always end the write locks before the read locks.
-
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug("Ending transaction write locks for transaction "+transactionID);
-
-      lockManager.leaveLocks(null,null,handle.getWriteLocks().getArray(cacheLockPrefix));
-
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug("Ending transaction read locks for transaction "+transactionID);
-
-      lockManager.leaveLocks(handle.getReadLocks().getArray(cacheLockPrefix),null,null);
-
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug("Done ending "+transactionID);
-
-    }
-    else
-    {
-      // Copy the invalidation etc. into the wrapping transaction.
-      // Invalidate the parent cache entries
-      parentTransaction.invalidateKeys(invalidationKeys);
-      // Copy the objects from child to parent
-      while (iter.hasNext())
-      {
-        ICacheDescription desc = (ICacheDescription)iter.next();
-        Object o = handle.lookupObject(desc);
-        parentTransaction.saveObject(desc,o,desc.getObjectKeys());
-      }
-      // Transfer all locks to parent from child
-      parentTransaction.addLocks(handle.getReadLocks(),handle.getWriteLocks());
-    }
-
-    // Finally, remove the transaction from the hash.
-    transactionHash.remove(transactionID);
-  }
-
-  /** Roll back a cache transaction.
-  * This method releases all objects cached against the ending transaction ID, and releases all locks
-  * held for the transaction.
-  */
-  public void rollbackTransaction(String transactionID)
-    throws ManifoldCFException
-  {
-
-    if (Logging.cache.isDebugEnabled())
-    {
-      Logging.cache.debug(Thread.currentThread().toString()+": Rolling back transaction: "+transactionID+": "+this.toString()+": "+transactionHash.toString());
-    }
-
-    CacheTransactionHandle handle = (CacheTransactionHandle)transactionHash.get(transactionID);
-    if (handle == null)
-      throw new ManifoldCFException("Cache manager: rollback transaction without start!",ManifoldCFException.GENERAL_ERROR);
-
-    // End all of the locks
-    // We always end the write locks before the read locks.
-
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Ending rollback write locks for transaction "+transactionID);
-
-    lockManager.leaveLocks(null,null,handle.getWriteLocks().getArray(cacheLockPrefix));
-
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Ending rollback read locks for transaction "+transactionID);
-
-    lockManager.leaveLocks(handle.getReadLocks().getArray(cacheLockPrefix),null,null);
-
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Done rolling back "+transactionID);
-
-
-    // Now, get rid of the transaction entry, because we just want to chuck what we filed there.
-    transactionHash.remove(transactionID);
-  }
-
-  /** Timed invalidation.  Call this periodically to get rid of all objects that have expired.
-  *@param currentTimestamp is the current time in milliseconds since epoch.
-  */
-  public void expireObjects(long currentTimestamp)
-    throws ManifoldCFException
-  {
-    // This is a local JVM operation; we will not need to do any locks.  We just
-    // need to blow expired objects from the cache.
-    cache.expireRecords(currentTimestamp);
-  }
-
-
-  // Protected methods and classes
-
-  /** Read an invalidation file contents.
-  *@param key is the cache key name.
-  *@return the invalidation time, or 0 if none.
-  */
-  protected long readSharedData(String key)
-    throws ManifoldCFException
-  {
-    // Read cache resource
-    byte[] cacheResourceData = lockManager.readData("cache-"+key);
-    if (cacheResourceData == null)
-      return 0L;
-
-    String expiration = new String(cacheResourceData, StandardCharsets.UTF_8);
-    return new Long(expiration).longValue();
-
-
-  }
-
-  /** Write the invalidation file contents.
-  *@param key is the cache key name.
-  *@param value is the invalidation timestamp.
-  */
-  protected void writeSharedData(String key, long value)
-    throws ManifoldCFException
-  {
-    if (value == 0L)
-      lockManager.writeData(key,null);
-    else
-    {
-      lockManager.writeData("cache-"+key,Long.toString(value).getBytes(StandardCharsets.UTF_8));
-    }
-  }
-
-
-  /** This is the local implementation of ICacheHandle.
-  */
-  protected class CacheHandle implements ICacheHandle
-  {
-    // Member variables
-    protected String[] readLocks;
-    protected String[] writeLocks;
-    protected ICacheDescription[] objectDescriptions;
-    protected StringSet invalidationKeys;
-    protected String transactionID;
-
-    public CacheHandle(String[] readLocks, String[] writeLocks, ICacheDescription[] descriptions,
-      StringSet invalidationKeys, String transactionID)
-    {
-      this.readLocks = readLocks;
-      this.writeLocks = writeLocks;
-      this.objectDescriptions = descriptions;
-      this.invalidationKeys = invalidationKeys;
-      this.transactionID = transactionID;
-    }
-
-    /** Get the read lock strings.
-    *@return read lock string array.
-    */
-    public String[] getReadLockStrings()
-    {
-      return readLocks;
-    }
-
-    /** Get the write lock strings.
-    *@return write lock string array.
-    */
-    public String[] getWriteLockStrings()
-    {
-      return writeLocks;
-    }
-
-    /** Get the set of object descriptions.
-    *@return the object descriptions.
-    */
-    public ICacheDescription[] getObjectDescriptions()
-    {
-      return objectDescriptions;
-    }
-
-    /** Get the invalidation keys.
-    *@return the invalidation key set.
-    */
-    public StringSet getInvalidationKeys()
-    {
-      return invalidationKeys;
-    }
-
-    /** Get the transaction ID.
-    *@return the transaction ID.
-    */
-    public String getTransactionID()
-    {
-      return transactionID;
-    }
-  }
-
-  /** This is the local implementation of ICacheCreateHandle
-  */
-  protected class CacheCreateHandle implements ICacheCreateHandle
-  {
-    // Member variables
-    protected String[] criticalSectionNames;
-    protected long theTime;
-    protected String transactionID;
-
-    public CacheCreateHandle(String[] criticalSectionNames, String transactionID)
-    {
-      this.criticalSectionNames = criticalSectionNames;
-      theTime = System.currentTimeMillis();
-      this.transactionID = transactionID;
-    }
-
-    /** Get the critical section names.
-    *@return the critical section names.
-    */
-    public String[] getCriticalSectionNames()
-    {
-      return criticalSectionNames;
-    }
-
-    /** Get create start time.
-    *@return the time in milliseconds since epoch.
-    */
-    public long getLookupTime()
-    {
-      return theTime;
-    }
-
-    /** Get the transaction ID.
-    *@return the transaction ID.
-    */
-    public String getTransactionID()
-    {
-      return transactionID;
-    }
-
-  }
-
-  /** This is the class the cache manager uses to keep track of transaction
-  * relationships and data.  Since a transaction is local to a thread, this
-  * class is local to a specific thread as well; it is thus referenced by a thread-local
-  * hash table.
-  */
-  protected class CacheTransactionHandle
-  {
-    // Member variables
-    protected CacheTransactionHandle parentTransaction;
-
-    // The cache in here must also be flushable via cache keys; the
-    // objects are therefore in a cache key section as well as in a "lookup" section.
-
-    /** This is the object hash (key is the description object, value is the stored object).
-    */
-    protected HashMap objectHash = new HashMap();
-
-    /** This is the cache key map (key is the cache key, value is a hashmap containing the
-    * object descriptions to be invalidated).
-    */
-    protected HashMap cacheKeyMap = new HashMap();
-
-    /** This is the set of cache key read locks that are currently held by this transaction.
-    */
-    protected HashMap cacheKeyReadLocks = new HashMap();
-
-    /** This is the set of cache key write locks that are currently held by this transaction.
-    */
-    protected HashMap cacheKeyWriteLocks = new HashMap();
-
-    /** This is the current set of keys to invalidate if the transaction should be committed.
-    */
-    protected StringSetBuffer invalidationKeys = new StringSetBuffer();
-
-    /** Constructor.
-    *@param parentTransaction is the parent transaction identifier, or null if none.
-    */
-    public CacheTransactionHandle(CacheTransactionHandle parentTransaction)
-    {
-      this.parentTransaction = parentTransaction;
-    }
-
-    /** Get parent transaction.
-    *@return the parent transaction.
-    */
-    public CacheTransactionHandle getParentTransaction()
-    {
-      return parentTransaction;
-    }
-
-    /** Get the set of write locks to close on exit from this transaction.
-    *@return the write lock names as an array.
-    */
-    public StringSet getWriteLocks()
-    {
-      return new StringSet(cacheKeyWriteLocks);
-    }
-
-    /** Get the set of read locks to close on exit from this transaction.
-    *@return the read lock names as an array.
-    */
-    public StringSet getReadLocks()
-    {
-      return new StringSet(cacheKeyReadLocks);
-    }
-
-    /** Get the current invalidation keys.
-    *@return the keys as a stringset
-    */
-    public StringSet getInvalidationKeys()
-    {
-      return new StringSet(invalidationKeys);
-    }
-
-    /** Look for an object in cache.
-    *@param descriptionObject is the cache description object.
-    *@return the object, if found, or null if not found.
-    */
-    public Object lookupObject(ICacheDescription descriptionObject)
-    {
-      return objectHash.get(descriptionObject);
-    }
-
-    /** Save an object in cache.
-    *@param descriptionObject is the description.
-    *@param object is the object to save.
-    *@param cacheKeys are the cache keys.
-    */
-    public void saveObject(ICacheDescription descriptionObject, Object object,
-      StringSet cacheKeys)
-    {
-      // Put into main hash
-      objectHash.put(descriptionObject,object);
-      // Put into the cache key hashes
-      Iterator iter = cacheKeys.getKeys();
-      while (iter.hasNext())
-      {
-        String key = (String)iter.next();
-        HashMap thisHash = (HashMap)cacheKeyMap.get(key);
-        if (thisHash == null)
-        {
-          thisHash = new HashMap();
-          cacheKeyMap.put(key,thisHash);
-        }
-        thisHash.put(descriptionObject,descriptionObject);
-      }
-    }
-
-    /** Invalidate objects.
-    *@param keys is the set of keys to invalidate.
-    */
-    public void invalidateKeys(StringSet keys)
-    {
-      if (keys == null)
-        return;
-
-      // Merge these keys into the invalidation set
-      invalidationKeys.add(keys);
-      // Now, bump stuff from the cache
-      Iterator iter = keys.getKeys();
-      while (iter.hasNext())
-      {
-        String keyName = (String)iter.next();
-        HashMap x = (HashMap)cacheKeyMap.get(keyName);
-        if (x != null)
-        {
-          // Need to flush the stated items
-          Iterator iter2 = x.keySet().iterator();
-          while (iter2.hasNext())
-          {
-            ICacheDescription desc = (ICacheDescription)iter2.next();
-            objectHash.remove(desc);
-          }
-          cacheKeyMap.remove(keyName);
-        }
-      }
-    }
-
-    /** See if cache keys intersect with invalidation keys.
-    *@param cacheKeys is the set of cache keys that describe an object.
-    *@return true if these keys have been invalidated in this transaction
-    */
-    public boolean checkCacheKeys(StringSet cacheKeys)
-    {
-      return invalidationKeys.contains(cacheKeys);
-    }
-
-    /** Come up with the set of read locks we still need to throw.
-    *@param cacheKeys is the set of cache keys we need to have read locks for.
-    *@param keys is the set of invalidation keys we need to have write locks for.
-    *@return the array of read locks we still need to throw.
-    */
-    public StringSet getRemainingReadLocks(StringSet cacheKeys, StringSet keys)
-    {
-      StringSetBuffer accumulator = new StringSetBuffer();
-      if (cacheKeys != null)
-      {
-        Iterator iter = cacheKeys.getKeys();
-        while (iter.hasNext())
-        {
-          String cacheKey = (String)iter.next();
-          // If this already has a lock, of any kind, continue
-          if (keys != null && keys.contains(cacheKey))
-            continue;
-          // Look back through the whole parent chain to see whether we need to throw
-          // this lock.
-          CacheTransactionHandle ptr = this;
-          boolean found = false;
-          while (ptr != null)
-          {
-            if (ptr.cacheKeyReadLocks.get(cacheKey) != null ||
-              ptr.cacheKeyWriteLocks.get(cacheKey) != null)
-            {
-              found = true;
-              break;
-            }
-            ptr = ptr.parentTransaction;
-          }
-          if (found)
-            continue;
-          accumulator.add(cacheKey);
-        }
-      }
-      return new StringSet(accumulator);
-    }
-
-    /** Come up with the set of write locks we still need to throw.
-    *@param cacheKeys is the set of cache keys we need to have read locks for.
-    *@param keys is the set of invalidation keys we need to have write locks for.
-    *@return the array of write locks we still need to throw.
-    */
-    public StringSet getRemainingWriteLocks(StringSet cacheKeys, StringSet keys)
-      throws ManifoldCFException
-    {
-      // If any of these keys are read locks but not yet write locks, we throw an exception!
-      // (There is currently no ability to promote a read lock to a write lock.)
-      StringSetBuffer accumulator = new StringSetBuffer();
-      if (keys != null)
-      {
-        Iterator iter = keys.getKeys();
-        while (iter.hasNext())
-        {
-          String invKey = (String)iter.next();
-          // Look back through the whole parent chain to see whether we need to throw
-          // this lock.
-          CacheTransactionHandle ptr = this;
-          boolean found = false;
-          while (ptr != null)
-          {
-            // Write check first!  Then, read check.
-            if (ptr.cacheKeyWriteLocks.get(invKey) != null)
-            {
-              found = true;
-              break;
-            }
-            // Upgrade lock attempts are now permitted.
-            if (ptr.cacheKeyReadLocks.get(invKey) != null)
-              break;
-            ptr = ptr.parentTransaction;
-          }
-          if (found)
-            continue;
-          accumulator.add(invKey);
-        }
-      }
-      return new StringSet(accumulator);
-    }
-
-    /** Add to the set of locks that are open.
-    *@param thrownReadLocks is the set of read locks.
-    *@param thrownWriteLocks is the set of write locks.
-    */
-    public void addLocks(StringSet thrownReadLocks, StringSet thrownWriteLocks)
-    {
-      // Some of the write locks will be upgrades.  In this case, the same lock
-      // might appear BOTH as read and as write.  I hope the lock manager does the
-      // right thing in this case!
-      // In any case, at worst we will have one write lock and one read lock for the
-      // same lock name, and never a write lock then a read lock, so we should be able to disambiguate if
-      // needed.
-
-      Iterator iter = thrownReadLocks.getKeys();
-      while (iter.hasNext())
-      {
-        String x = (String)iter.next();
-        cacheKeyReadLocks.put(x,x);
-      }
-      iter = thrownWriteLocks.getKeys();
-      while (iter.hasNext())
-      {
-        String x = (String)iter.next();
-        cacheKeyWriteLocks.put(x,x);
-      }
-    }
-
-    /** Get all existing object descriptions.
-    *@return an iterator of ICacheDescription objects.
-    */
-    public Iterator getCurrentObjects()
-    {
-      return objectHash.keySet().iterator();
-    }
-
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/ExecutorBase.java b/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/ExecutorBase.java
deleted file mode 100644
index c30cf5b..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/ExecutorBase.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id: ExecutorBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.cachemanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-public abstract class ExecutorBase implements ICacheExecutor
-{
-  public static final String _rcsid = "@(#)$Id: ExecutorBase.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public ExecutorBase()
-  {
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/GeneralCache.java b/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/GeneralCache.java
deleted file mode 100644
index b51f220..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/cachemanager/GeneralCache.java
+++ /dev/null
@@ -1,891 +0,0 @@
-/* $Id: GeneralCache.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.cachemanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** General cache class.  This class will be statically instantiated.  It contains all the structures
-* needed to maintain a cache of objects, with both LRU flushing behavior, and timed expiration of
-* objects.
-* This cache is entirely local to a JVM and does NOT have any locking and synchronization semantics
-* cross-JVM.  That is handled at a higher level.
-*/
-public class GeneralCache
-{
-  public static final String _rcsid = "@(#)$Id: GeneralCache.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // This table is for looking stuff up by object description
-  protected ObjectRecordTable hashtable = new ObjectRecordTable();
-  // This table is for looking stuff up by cache key - hash table of hash tables
-  protected InvalidationTable invalidationTable = new InvalidationTable();
-  // This table keeps the running count of each object class
-  protected ObjectClassTable objectClassTable = new ObjectClassTable();
-  // This structure is the general expiration tree
-  public ExpirationTree expirationTree = new ExpirationTree();
-
-  public GeneralCache()
-  {
-  }
-
-  /** Locate an object in the cache, and return it if found.
-  *@param objectDescription is the object's unique identifier.
-  *@return the object if found, or null if not present in the cache.
-  */
-  public synchronized Object lookup(Object objectDescription)
-  {
-    ObjectRecord o = hashtable.lookup(objectDescription);
-    if (o == null)
-      return null;
-    return o.getObject();
-  }
-
-  /** Get the creation time of an object in the cache.
-  *@param objectDescription is the object's unique identifier.
-  *@return the creation time, or -1 if object not found.
-  */
-  public synchronized long getObjectCreationTime(Object objectDescription)
-  {
-    ObjectRecord o = hashtable.lookup(objectDescription);
-    if (o == null)
-      return -1L;
-    return o.getCreationTime();
-  }
-
-  /** Get the invalidation keys for an object in the cache.
-  *@param objectDescription is the object's unique identifier.
-  *@return the keys, or null if not found.
-  */
-  public synchronized StringSet getObjectInvalidationKeys(Object objectDescription)
-  {
-    ObjectRecord o = hashtable.lookup(objectDescription);
-    if (o == null)
-      return null;
-    return o.getKeys();
-  }
-
-  /** Get the expiration time for an object in the cache.
-  *@param objectDescription is the object's unique identifier.
-  *@return the expiration time (-1L means none).
-  */
-  public synchronized long getObjectExpirationTime(Object objectDescription)
-  {
-    ObjectRecord o = hashtable.lookup(objectDescription);
-    if (o == null)
-      return -1L;
-    return o.getObjectExpiration();
-  }
-
-  /** Delete a record from the cache.
-  *@param objectDescription is the unique description.
-  */
-  public synchronized void deleteObject(Object objectDescription)
-  {
-    ObjectRecord o = hashtable.lookup(objectDescription);
-    if (o != null)
-      deleteEntry(o);
-  }
-
-  /** Add a newly created object to the cache.  Use ONLY for newly created objects!
-  *@param objectDescription is the newly created object's unique description.
-  *@param object is the newly created object itself.
-  *@param keys are the invalidation keys for the newly created object.
-  *@param timestamp is the creation timestamp for this object (used for cross-JVM invalidation)
-  */
-  public synchronized void setObject(Object objectDescription, Object object, StringSet keys, long timestamp)
-  {
-    ObjectRecord record = new ObjectRecord(objectDescription,object,keys,timestamp);
-    hashtable.add(record);
-    // Make an entry in the invalidation hash
-    invalidationTable.addKeys(keys,record);
-    // Object has no expiration or class yet, so don't add it to the expiration tree, or to the object
-    // class trees
-  }
-
-  /** Set an object's expiration time.
-  *@param objectDescription is the object's unique description.
-  *@param expirationTime is the object's new expiration time, in milliseconds since epoch.
-  */
-  public synchronized void setObjectExpiration(Object objectDescription, long expirationTime)
-  {
-    // Find existing object
-    ObjectRecord existing = hashtable.lookup(objectDescription);
-    if (existing == null)
-      return;
-    if (existing.getObjectExpiration() != -1)
-    {
-      // Pull the object from the expiration tree
-      expirationTree.removeEntry(existing);
-    }
-    // Set the new expiration
-    existing.setObjectExpiration(expirationTime);
-    if (expirationTime != -1)
-    {
-      //Put the object back into the expiration tree
-      expirationTree.addEntry(existing);
-    }
-  }
-
-  /** Set an object's class and maximum count.  This will clean up extra objects
-  * in a Least Recently Used fashion until the count is met.
-  *@param objectDescription is the object's unique description.
-  *@param objectClass is the object's "class", or grouping for the purposes of LRU.
-  *@param maxCount is the maximum number of objects of the class to permit to
-  * remain in the cache.
-  */
-  public synchronized void setObjectClass(Object objectDescription, String objectClass,
-    int maxCount)
-  {
-    // Lookup the existing object class
-    ObjectRecord existing = hashtable.lookup(objectDescription);
-    if (existing == null)
-      return;
-    if (existing.getObjectClass() != null)
-    {
-      // Pull the object from the object class expiration tree
-      objectClassTable.removeEntry(existing);
-    }
-    // Set the new object class & LRU value
-    existing.setObjectClass(objectClass);
-    if (objectClass != null)
-    {
-      // Put the object into the object class expiration tree
-      objectClassTable.addEntry(existing);
-
-      if (maxCount >= 0)
-      {
-        // Now, clean up objects to meet the count
-        while (objectClassTable.getCurrentMemberCount(objectClass) > maxCount)
-        {
-          ObjectRecord oldestRecord = objectClassTable.getOldestEntry(objectClass);
-          // Delete this entry from all places it lives
-          deleteEntry(oldestRecord);
-        }
-
-      }
-    }
-
-  }
-
-  /** Invalidate a set of keys.  This causes all objects that have any of the specified
-  * keys as invalidation keys to be removed from the cache.
-  *@param keys is the StringSet describing the keys to invalidate.
-  */
-  public synchronized void invalidateKeys(StringSet keys)
-  {
-    Iterator enum2 = keys.getKeys();
-    while (enum2.hasNext())
-    {
-      String invalidateKey = (String)enum2.next();
-      Iterator enum1 = invalidationTable.getObjectRecordsForKey(invalidateKey);
-      while (enum1.hasNext())
-      {
-        ObjectRecord record = (ObjectRecord)enum1.next();
-        hashtable.remove(record);
-        // Remove from object class table
-        if (record.getObjectClass() != null)
-        {
-          objectClassTable.removeEntry(record);
-        }
-        // Remove from expiration table
-        if (record.getExpirationTime() >= 0)
-        {
-          expirationTree.removeEntry(record);
-        }
-
-      }
-      // We do this last, because we are enumerating over something in here!
-      invalidationTable.removeKey(invalidateKey);
-    }
-  }
-
-  /** Expire all records that have older expiration times than that passed in.
-  * @param expireTime is the time to compare against, in milliseconds since epoch.
-  */
-  public void expireRecords(long expireTime)
-  {
-    while (true)
-    {
-      // Do the synchronizer inside the loop.  Cleanup is slower,
-      // but the cache does not get locked for long periods.
-      synchronized (this)
-      {
-        // Get the oldest record, if any
-        ObjectRecord x = expirationTree.getOldestEntry();
-        if (x == null)
-          break;
-        if (x.getExpirationTime() > expireTime)
-          break;
-        // Remove the entry
-        deleteEntry(x);
-      }
-    }
-  }
-
-  /** Delete a record from the cache. NOTE WELL: This method cannot be used
-  * if the data associated with the record is currently being processed with
-  * an enumeration (for example), since it modifies the structures that the
-  * enumeration is based on!
-  *@param record is the object record.
-  */
-  protected void deleteEntry(ObjectRecord record)
-  {
-    // Delete from the main cache
-    hashtable.remove(record);
-    // Delete from key hash
-    invalidationTable.removeObjectRecord(record);
-    // Remove from object class table
-    if (record.getObjectClass() != null)
-    {
-      objectClassTable.removeEntry(record);
-    }
-    // Remove from expiration table
-    if (record.getExpirationTime() >= 0)
-    {
-      expirationTree.removeEntry(record);
-    }
-
-  }
-
-  /** This class represents a cached object.  It has enough hooks to allow it
-  * to live in all the various data structures the general cache maintains.
-  */
-  protected class ObjectRecord
-  {
-    protected Object objectDescription;
-    protected Object theObject;
-    protected StringSet invalidationKeys;
-    protected long creationTime;
-    protected long expirationTime = -1;
-    protected String objectClass = null;
-    protected ObjectRecord prevLRU = null;
-    protected ObjectRecord nextLRU = null;
-    protected ObjectRecord sameExpirationPrev = null;
-    protected ObjectRecord sameExpirationNext = null;
-
-    public ObjectRecord(Object objectDescription, Object theObject, StringSet invalidationKeys, long creationTime)
-    {
-      this.creationTime = creationTime;
-      this.objectDescription = objectDescription;
-      this.theObject = theObject;
-      this.invalidationKeys = invalidationKeys;
-    }
-
-    public long getCreationTime()
-    {
-      return creationTime;
-    }
-
-    public void setSameExpirationPrev(ObjectRecord x)
-    {
-      sameExpirationPrev = x;
-    }
-
-    public ObjectRecord getSameExpirationPrev()
-    {
-      return sameExpirationPrev;
-    }
-
-    public void setSameExpirationNext(ObjectRecord x)
-    {
-      sameExpirationNext = x;
-    }
-
-    public ObjectRecord getSameExpirationNext()
-    {
-      return sameExpirationNext;
-    }
-
-    public void setObjectExpiration(long expTime)
-    {
-      expirationTime = expTime;
-    }
-
-    public long getObjectExpiration()
-    {
-      return expirationTime;
-    }
-
-    public Object getObjectDescription()
-    {
-      return objectDescription;
-    }
-
-    public void setObjectClass(String className)
-    {
-      objectClass = className;
-    }
-
-    public String getObjectClass()
-    {
-      return objectClass;
-    }
-
-    public ObjectRecord getPrevLRU()
-    {
-      return prevLRU;
-    }
-
-    public ObjectRecord getNextLRU()
-    {
-      return nextLRU;
-    }
-
-    public void setPrevLRU(ObjectRecord prev)
-    {
-      prevLRU = prev;
-    }
-
-    public void setNextLRU(ObjectRecord next)
-    {
-      nextLRU = next;
-    }
-
-    public Object getObject()
-    {
-      return theObject;
-    }
-
-    public StringSet getKeys()
-    {
-      return invalidationKeys;
-    }
-
-    public long getExpirationTime()
-    {
-      return expirationTime;
-    }
-
-    public int hashCode()
-    {
-      return objectDescription.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ObjectRecord))
-        return false;
-      ObjectRecord record = (ObjectRecord)o;
-      return objectDescription.equals(record.objectDescription);
-    }
-  }
-
-  /** This class describes a table of object records, looked up
-  * by the unique object description.
-  */
-  protected class ObjectRecordTable
-  {
-    protected HashMap hashtable = new HashMap();
-
-    public ObjectRecordTable()
-    {
-    }
-
-    public void add(ObjectRecord record)
-    {
-      hashtable.put(record.getObjectDescription(),record);
-    }
-
-    public void remove(Object objectDescription)
-    {
-      hashtable.remove(objectDescription);
-    }
-
-    public void remove(ObjectRecord record)
-    {
-      hashtable.remove(record.getObjectDescription());
-    }
-
-    public ObjectRecord lookup(Object objectDescription)
-    {
-      return (ObjectRecord)hashtable.get(objectDescription);
-    }
-  }
-
-  /** This class describes a table of invalidation keys, each of which points
-  * to a set of object records.
-  */
-  protected class InvalidationTable
-  {
-    protected HashMap hashtable = new HashMap();
-
-    public InvalidationTable()
-    {
-    }
-
-    public void addKeys(StringSet keyset, ObjectRecord objectRecord)
-    {
-      Iterator enum1 = keyset.getKeys();
-      while (enum1.hasNext())
-      {
-        String key = (String)enum1.next();
-        HashMap ht = (HashMap)hashtable.get(key);
-        if (ht == null)
-        {
-          ht = new HashMap();
-          hashtable.put(key,ht);
-        }
-        ht.put(objectRecord,objectRecord);
-      }
-    }
-
-    public Iterator getObjectRecordsForKey(String key)
-    {
-      HashMap ht = (HashMap)hashtable.get(key);
-      if (ht == null)
-      {
-        ht = new HashMap();
-        hashtable.put(key,ht);
-      }
-      return ht.keySet().iterator();
-    }
-
-    public void removeKey(String key)
-    {
-      hashtable.remove(key);
-    }
-
-    public void removeObjectRecord(ObjectRecord record)
-    {
-      // Get the keys
-      StringSet keys = record.getKeys();
-      Iterator enum1 = keys.getKeys();
-      while (enum1.hasNext())
-      {
-        String key = (String)enum1.next();
-        removeObjectRecordFromKey(key,record);
-      }
-    }
-
-    public void removeObjectRecordFromKey(String key, ObjectRecord objectRecord)
-    {
-      HashMap ht = (HashMap)hashtable.get(key);
-      if (ht == null)
-        return;
-      ht.remove(objectRecord);
-    }
-
-  }
-
-  /** This class describes a set of object classes, each with its own LRU behavior.
-  */
-  protected class ObjectClassTable
-  {
-    protected HashMap hashtable = new HashMap();
-
-    public ObjectClassTable()
-    {
-    }
-
-    /** Call ONLY if there is no existing record in the object class table for this record
-    */
-    public void addEntry(ObjectRecord record)
-    {
-      ObjectClassRecord x = (ObjectClassRecord)hashtable.get(record.getObjectClass());
-      if (x == null)
-      {
-        x = new ObjectClassRecord();
-        hashtable.put(record.getObjectClass(),x);
-      }
-      x.addEntry(record);
-    }
-
-    /** Call ONLY if there is known to be an existing record in the object class table
-    */
-    public void removeEntry(ObjectRecord record)
-    {
-      ObjectClassRecord x = (ObjectClassRecord)hashtable.get(record.getObjectClass());
-      if (x == null)
-        return;
-      x.removeEntry(record);
-    }
-
-    public int getCurrentMemberCount(String objectClassName)
-    {
-      ObjectClassRecord x = (ObjectClassRecord)hashtable.get(objectClassName);
-      if (x == null)
-        return 0;
-      return x.getCurrentMemberCount();
-    }
-
-    public ObjectRecord getOldestEntry(String objectClassName)
-    {
-      ObjectClassRecord x = (ObjectClassRecord)hashtable.get(objectClassName);
-      if (x == null)
-        return null;
-      return x.getOldestEntry();
-    }
-  }
-
-  /** This is a helper class for the ObjectClassTable.  It maintains the data
-  * for an individual object class.
-  */
-  protected class ObjectClassRecord
-  {
-    protected int currentMemberCount = 0;
-    protected ObjectRecord firstLRU = null;
-    protected ObjectRecord lastLRU = null;
-
-    public ObjectClassRecord()
-    {
-    }
-
-    public int getCurrentMemberCount()
-    {
-      return currentMemberCount;
-    }
-
-    /** Call this ONLY if it is known that the entry exists in
-    * the object class record!!!
-    */
-    public void removeEntry(ObjectRecord x)
-    {
-      currentMemberCount--;
-      // Patch up everything
-      ObjectRecord prev = x.getPrevLRU();
-      ObjectRecord next = x.getNextLRU();
-      if (prev == null)
-        firstLRU = next;
-      else
-        prev.setNextLRU(next);
-      if (next == null)
-        lastLRU = prev;
-      else
-        next.setPrevLRU(prev);
-      x.setPrevLRU(null);
-      x.setNextLRU(null);
-    }
-
-    /** Add a record to the end of the LRU list.
-    * Call this ONLY if it is known that the entry does NOT
-    * exist in the object class record!!!
-    */
-    public void addEntry(ObjectRecord x)
-    {
-      currentMemberCount++;
-      x.setNextLRU(null);
-      x.setPrevLRU(lastLRU);
-      if (lastLRU == null)
-        firstLRU = x;
-      else
-        lastLRU.setNextLRU(x);
-      lastLRU = x;
-    }
-
-    /** Find the first (oldest) entry, or null
-    * if there is none.
-    */
-    public ObjectRecord getOldestEntry()
-    {
-      return firstLRU;
-    }
-
-  }
-
-  /** This class represents a timed expiration tree.  Expiration
-  * is used to order the nodes.
-  */
-  protected class ExpirationTree
-  {
-    protected ExpirationTreeNode root = null;
-
-    public ExpirationTree()
-    {
-    }
-
-    /** This method MUST have the entry in the tree before
-    * being called!
-    */
-    public void removeEntry(ObjectRecord x)
-    {
-      // We may delete entries from a node, but we could very well delete the node
-      // as well.  Therefore, this method assumes that this might happen.
-      //
-      ExpirationTreeNode parent = null;
-      boolean parentLesser = false;
-
-      long expTime = x.getExpirationTime();
-
-      ExpirationTreeNode current = root;
-      while (current != null)
-      {
-        long nodeExpTime = current.getExpirationTime();
-        if (expTime == nodeExpTime)
-        {
-          // Found the right node!
-          // Delete the embedded record
-          if (current.removeObjectRecord(x))
-          {
-            // The node itself also needs to be removed!
-
-            ExpirationTreeNode lesserSide = current.getLesser();
-            ExpirationTreeNode greaterSide = current.getGreater();
-
-            if (lesserSide == null && greaterSide == null)
-            {
-              // Just remove the node; no children
-              setPointer(parent,parentLesser,null);
-            }
-            else if (lesserSide == null && greaterSide != null)
-            {
-              // Simple rearrangement
-              setPointer(parent,parentLesser,greaterSide);
-            }
-            else if (lesserSide != null && greaterSide == null)
-            {
-              // Reverse simple rearrangement
-              setPointer(parent,parentLesser,lesserSide);
-            }
-            else
-            {
-              // Full complexity
-              // Here, we may have a choice: Move up the lesser child, or
-              // move up the greater child.
-
-              // In theory, this should depend on the depth difference of the two
-              // sides, but since we don't keep this info, we'll just be arbitrary
-              setPointer(parent,parentLesser,greaterSide);
-              // Add the lesser side into the new node in this position
-              addTreeToBranch(greaterSide,true,lesserSide);
-            }
-
-          }
-          return;
-        }
-        if (expTime < nodeExpTime)
-        {
-          // go the lesser route
-          parent = current;
-          parentLesser = true;
-          current = current.getLesser();
-        }
-        else
-        {
-          // go the greater route
-          parent = current;
-          parentLesser = false;
-          current = current.getGreater();
-        }
-      }
-      // Should never get here, because it means we did not find the record.
-
-    }
-
-    /** This method files a subtree (represented by toAdd) beneath a branch, which is represented by
-    * the parent parameters.  If parent is null, then the overall root of the tree is the start point.
-    * If the parent is NOT null, then parentLesser describes whether the lesser branch is the one being modified.
-    * The logic determines the shallowest legal placement of the toAdd node(s), and inserts them there.
-    */
-    protected void addTreeToBranch(ExpirationTreeNode parent, boolean parentLesser, ExpirationTreeNode toAdd)
-    {
-      if (toAdd == null)
-        return;
-
-      long expTime = toAdd.getExpirationTime();
-
-      // Find the first node to consider
-      ExpirationTreeNode current;
-      if (parent == null)
-        current = root;
-      else
-      {
-        if (parentLesser)
-          current = parent.getLesser();
-        else
-          current = parent.getGreater();
-      }
-
-      // Now, loop until we hit the end
-      while (current != null)
-      {
-        long nodeExpTime = current.getExpirationTime();
-        if (expTime < nodeExpTime)
-        {
-          // Take the lesser route
-          parent = current;
-          parentLesser = true;
-          current = current.getLesser();
-        }
-        else
-        {
-          // Take the greater route
-          parent = current;
-          parentLesser = false;
-          current = current.getGreater();
-        }
-      }
-
-      // Insert the subtree here
-      setPointer(parent,parentLesser,toAdd);
-    }
-
-    /** This method MUST NOT have the entry in the tree already
-    * before being called!
-    */
-    public void addEntry(ObjectRecord x)
-    {
-      // Get the record expiration time, for convenience
-      long expTime = x.getExpirationTime();
-
-      // These two variables keep track of the last link we examined, so we can know where to put
-      // the new node, if required.
-      ExpirationTreeNode previousNode = null;
-      boolean lesser = false;
-
-      // This is our current variable
-      ExpirationTreeNode current = root;
-      while (current != null)
-      {
-        long nodeExpTime = current.getExpirationTime();
-        if (nodeExpTime == expTime)
-        {
-          // Add to the current node
-          current.addObjectRecord(x);
-          return;
-        }
-        if (nodeExpTime > expTime)
-        {
-          // Go down the lesser branch
-          previousNode = current;
-          lesser = true;
-          current = current.getLesser();
-        }
-        else
-        {
-          // Go down the greater branch
-          previousNode = current;
-          lesser = false;
-          current = current.getGreater();
-        }
-      }
-
-      // New node needs to be created.
-      ExpirationTreeNode newNode = new ExpirationTreeNode(x);
-      setPointer(previousNode,lesser,newNode);
-    }
-
-    protected void setPointer(ExpirationTreeNode parent, boolean isLesser, ExpirationTreeNode toAdd)
-    {
-      if (parent == null)
-        root = toAdd;
-      else
-      {
-        if (isLesser)
-          parent.setLesser(toAdd);
-        else
-          parent.setGreater(toAdd);
-      }
-    }
-
-
-    public ObjectRecord getOldestEntry()
-    {
-      // Look for the least node, and grab a record from it
-      ExpirationTreeNode current = root;
-      ExpirationTreeNode last = null;
-      while (current != null)
-      {
-        last = current;
-        current = current.getLesser();
-      }
-      if (last == null)
-        return null;
-
-      return last.getOldest();
-    }
-  }
-
-  /** This class represents a node in the expiration tree.
-  * The node has a pool of size at least one containing object records
-  * with the same expiration date.
-  */
-  protected class ExpirationTreeNode
-  {
-    protected ExpirationTreeNode lesser = null;
-    protected ExpirationTreeNode greater = null;
-
-    protected ObjectRecord firstSame = null;
-    protected ObjectRecord lastSame = null;
-
-    public ExpirationTreeNode(ObjectRecord record)
-    {
-      firstSame = record;
-      lastSame = record;
-    }
-
-    public long getExpirationTime()
-    {
-      return firstSame.getExpirationTime();
-    }
-
-    public ExpirationTreeNode getLesser()
-    {
-      return lesser;
-    }
-
-    public void setLesser(ExpirationTreeNode lesser)
-    {
-      this.lesser = lesser;
-    }
-
-    public ExpirationTreeNode getGreater()
-    {
-      return greater;
-    }
-
-    public void setGreater(ExpirationTreeNode greater)
-    {
-      this.greater = greater;
-    }
-
-    public void addObjectRecord(ObjectRecord x)
-    {
-      x.setSameExpirationNext(firstSame);
-      firstSame.setSameExpirationPrev(x);
-      firstSame = x;
-    }
-
-    /** Returns true if this removal was the last one (in which case the tree node is now
-    * invalid, and should be removed from the tree)
-    */
-    public boolean removeObjectRecord(ObjectRecord x)
-    {
-      // Patch up everything
-      ObjectRecord prev = x.getSameExpirationPrev();
-      ObjectRecord next = x.getSameExpirationNext();
-      if (prev == null)
-        firstSame = next;
-      else
-        prev.setSameExpirationNext(next);
-      if (next == null)
-        lastSame = prev;
-      else
-        next.setSameExpirationPrev(prev);
-      x.setSameExpirationPrev(null);
-      x.setSameExpirationNext(null);
-      return (firstSame == null);
-    }
-
-    public ObjectRecord getOldest()
-    {
-      return lastSame;
-    }
-
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/common/Base64.java b/framework/core/src/main/java/org/apache/manifoldcf/core/common/Base64.java
deleted file mode 100644
index bee8d6e..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/common/Base64.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/* $Id: Base64.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.common;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-
-/** Class to manage straight and stream conversions to and from base64 encoding.
-*/
-public class Base64
-{
-  public static final String _rcsid = "@(#)$Id: Base64.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private static final char[] base64CharacterArray =
-  {
-    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
-      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
-      'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
-      'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
-      'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
-      'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
-      '8', '9', '+', '/'
-  };
-
-  private static final byte[] mapArray;
-  static
-  {
-    mapArray = new byte[128];
-
-    // Initialize the array to 127's
-    int i = 0;
-    while (i < mapArray.length)
-    {
-      mapArray[i++] = Byte.MAX_VALUE;
-    }
-
-    // Now, build the reverse map
-    i = 0;
-    while (i < base64CharacterArray.length)
-    {
-      mapArray[base64CharacterArray[i]] = (byte)i;
-      i++;
-    }
-  }
-
-  private static final char base64PadCharacter = '=';
-
-  /** This is a character buffer which is needed during the decoding process. */
-  protected char[] characterBuffer = new char[4];
-  /** This is a byte buffer which is needed during the encoding process. */
-  protected byte[] byteBuffer = new byte[3];
-
-  /** Construct the encoder/decoder.
-  */
-  public Base64()
-  {
-  }
-
-  /** Decode the next base64 character.  Reads a single encoded word from the input stream,
-  * and writes the decoded word to the output.
-  *@param inputBuffer is the character input stream.
-  *@param outputBuffer is the binary output stream.
-  *@return false if end-of-stream encountered, true otherwise
-  */
-  public boolean decodeNextWord(Reader inputBuffer, OutputStream outputBuffer)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // First, fill character buffer accordingly
-      int bufferIndex = 0;
-      while (bufferIndex < characterBuffer.length)
-      {
-        int character = inputBuffer.read();
-        if (character == -1)
-        {
-          if (bufferIndex != 0)
-            throw new ManifoldCFException("Unexpected end of base64 input");
-          return false;
-        }
-        char ch = (char)character;
-        if (ch == base64PadCharacter || ch < mapArray.length && mapArray[ch] != Byte.MAX_VALUE)
-          characterBuffer[bufferIndex++] = ch;
-
-        // else
-        //      throw new ManifoldCFException("Illegal Base64 character: '"+ch+"'");
-      }
-
-      // We have the data; do the conversion.
-
-      int outlen = 3;
-      if (characterBuffer[3] == base64PadCharacter)  outlen = 2;
-      if (characterBuffer[2] == base64PadCharacter)  outlen = 1;
-        int b0 = mapArray[characterBuffer[0]];
-      int b1 = mapArray[characterBuffer[1]];
-      int b2 = mapArray[characterBuffer[2]];
-      int b3 = mapArray[characterBuffer[3]];
-      switch (outlen)
-      {
-      case 1:
-        outputBuffer.write((byte)(b0 << 2 & 0xfc | b1 >> 4 & 0x3));
-        break;
-      case 2:
-        outputBuffer.write((byte)(b0 << 2 & 0xfc | b1 >> 4 & 0x3));
-        outputBuffer.write((byte)(b1 << 4 & 0xf0 | b2 >> 2 & 0xf));
-        break;
-      case 3:
-        outputBuffer.write((byte)(b0 << 2 & 0xfc | b1 >> 4 & 0x3));
-        outputBuffer.write((byte)(b1 << 4 & 0xf0 | b2 >> 2 & 0xf));
-        outputBuffer.write((byte)(b2 << 6 & 0xc0 | b3 & 0x3f));
-        break;
-      default:
-        throw new RuntimeException("Should never occur");
-      }
-      return true;
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error converting from base 64",e);
-    }
-  }
-
-  /** Decode an entire stream.
-  *@param inputBuffer is the character input stream.
-  *@param outputBuffer is the binary output stream.
-  */
-  public void decodeStream(Reader inputBuffer, OutputStream outputBuffer)
-    throws ManifoldCFException
-  {
-    // Just loop until done.
-    // It may be efficient to replace this with a "bulk" method, but probably not much.
-    while (decodeNextWord(inputBuffer,outputBuffer))
-    {
-    }
-  }
-
-  /** Decode a string into a byte array.
-  *@param inputString is the string.
-  *@return a corresponding byte array.
-  */
-  public byte[] decodeString(String inputString)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Calculate the maximum size of the output array, and allocate it.  We'll copy it to the final
-      // place at the end.
-      ByteArrayOutputStream outputStream = new ByteArrayOutputStream((inputString.length()>>2)*3+3);
-      try
-      {
-        // Create an input stream from the string
-        Reader reader = new StringReader(inputString);
-        try
-        {
-          decodeStream(reader,outputStream);
-          outputStream.flush();
-          return outputStream.toByteArray();
-        }
-        finally
-        {
-          reader.close();
-        }
-      }
-      finally
-      {
-        outputStream.close();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("Error streaming through base64 decoder",e);
-    }
-  }
-
-  /** Encode a single word.
-  *@param inputStream is the input binary data.
-  *@param outputWriter is the character output stream.
-  *@return false if end-of-stream encountered, true otherwise.
-  */
-  public boolean encodeNextWord(InputStream inputStream, Writer outputWriter)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Try to read up to 3 bytes from the input stream
-      int actualLength = inputStream.read(byteBuffer);
-      if (actualLength == -1)
-        return false;
-      int i;
-      switch (actualLength)
-      {
-      case 0:
-        throw new ManifoldCFException("Read 0 bytes!");
-      case 1:
-        i = byteBuffer[0]&0xff;
-        outputWriter.write(base64CharacterArray[i>>2]);
-        outputWriter.write(base64CharacterArray[(i<<4)&0x3f]);
-        outputWriter.write(base64PadCharacter);
-        outputWriter.write(base64PadCharacter);
-        break;
-
-      case 2:
-        i = ((byteBuffer[0]&0xff)<<8)+(byteBuffer[1]&0xff);
-        outputWriter.write(base64CharacterArray[i>>10]);
-        outputWriter.write(base64CharacterArray[(i>>4)&0x3f]);
-        outputWriter.write(base64CharacterArray[(i<<2)&0x3f]);
-        outputWriter.write(base64PadCharacter);
-        break;
-
-      case 3:
-        i = ((byteBuffer[0]&0xff)<<16)
-        +((byteBuffer[1]&0xff)<<8)
-        +(byteBuffer[2]&0xff);
-        outputWriter.write(base64CharacterArray[i>>18]);
-        outputWriter.write(base64CharacterArray[(i>>12)&0x3f]);
-        outputWriter.write(base64CharacterArray[(i>>6)&0x3f]);
-        outputWriter.write(base64CharacterArray[i&0x3f]);
-        break;
-
-      default:
-        throw new RuntimeException("Should never get here");
-      }
-      return true;
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO error encoding in base64",e);
-    }
-  }
-
-  /** Encode a full stream, to the end.
-  *@param inputStream is the input stream.
-  *@param outputWriter is the output writer.
-  */
-  public void encodeStream(InputStream inputStream, Writer outputWriter)
-    throws ManifoldCFException
-  {
-    while (encodeNextWord(inputStream,outputWriter))
-    {
-    }
-  }
-
-  /** Encode a byte array to a string.
-  *@param inputByteArray is the byte array.
-  *@return the encoded string.
-  */
-  public String encodeByteArray(byte[] inputByteArray)
-    throws ManifoldCFException
-  {
-    try
-    {
-      Writer writer = new StringWriter((inputByteArray.length * 4) / 3 + 4);
-      try
-      {
-        InputStream is = new ByteArrayInputStream(inputByteArray);
-        try
-        {
-          encodeStream(is,writer);
-          writer.flush();
-          return writer.toString();
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        writer.close();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("Error streaming through base64 encoder",e);
-    }
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/common/DateParser.java b/framework/core/src/main/java/org/apache/manifoldcf/core/common/DateParser.java
deleted file mode 100644
index f6c3a2e..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/common/DateParser.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.common;
-
-import java.util.*;
-
-/** Class to parse and format common dates.
-*/
-public class DateParser
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Parse ISO 8601 dates, and their common variants.
-  */
-  public static Date parseISO8601Date(String isoDateValue)
-  {
-    if (isoDateValue == null)
-      return null;
-    
-    boolean isMicrosoft = (isoDateValue.indexOf("T") == -1);
-    
-    String formatString;
-    if (isMicrosoft)
-    {
-      formatString = "yyyy-MM-dd' 'HH:mm:ss";
-    }
-    else
-    {
-      // There are a number of variations on the basic format.
-      // We'll look for key characters to help is determine which is which.
-      StringBuilder isoFormatString = new StringBuilder("yy");
-      if (isoDateValue.length() > 2 && isoDateValue.charAt(2) != '-')
-        isoFormatString.append("yy");
-      isoFormatString.append("-MM-dd'T'HH:mm:ss");
-      if (isoDateValue.indexOf(".") != -1)
-        isoFormatString.append(".SSS");
-      if (isoDateValue.endsWith("Z"))
-      {
-        isoDateValue = isoDateValue.substring(0,isoDateValue.length()-1) + "-0000";
-        isoFormatString.append("Z");
-      }
-      else
-      {
-        // We need to be able to parse either "-08:00" or "-0800".  The 'Z' specifier only handles
-        // -0800, unfortunately - see CONNECTORS-700.  So we have to do some hackery to remove the colon.
-        int colonIndex = isoDateValue.lastIndexOf(":");
-        int dashIndex = isoDateValue.lastIndexOf("-");
-        int plusIndex = isoDateValue.lastIndexOf("+");
-        if (colonIndex != -1 &&
-          ((dashIndex != -1 && colonIndex == dashIndex+3 && isNumeral(isoDateValue,dashIndex-1)) || (plusIndex != -1 && colonIndex == plusIndex+3 && isNumeral(isoDateValue,plusIndex-1))))
-          isoDateValue = isoDateValue.substring(0,colonIndex) + isoDateValue.substring(colonIndex+1);
-        isoFormatString.append("Z");      // RFC 822 time, including general time zones
-      }
-      formatString = isoFormatString.toString();
-    }
-    java.text.DateFormat iso8601Format = new java.text.SimpleDateFormat(formatString, Locale.ROOT);
-    try
-    {
-      return iso8601Format.parse(isoDateValue);
-    }
-    catch (java.text.ParseException e)
-    {
-      return null;
-    }
-  }
-  
-  protected static boolean isNumeral(String value, int index)
-  {
-    return index >= 0 && value.charAt(index) >= '0' && value.charAt(index) <= '9';
-  }
-  
-  /** Format ISO8601 date.
-  */
-  public static String formatISO8601Date(Date dateValue)
-  {
-    java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
-    df.setTimeZone(TimeZone.getTimeZone("GMT"));
-    return df.format(dateValue);
-  }
-  
-  /** Timezone mapping from RFC822 timezones to ones understood by Java */
-  
-  // Month map
-  protected static HashMap monthMap = new HashMap();
-  static
-  {
-    monthMap.put("jan",new Integer(1));
-    monthMap.put("feb",new Integer(2));
-    monthMap.put("mar",new Integer(3));
-    monthMap.put("apr",new Integer(4));
-    monthMap.put("may",new Integer(5));
-    monthMap.put("jun",new Integer(6));
-    monthMap.put("jul",new Integer(7));
-    monthMap.put("aug",new Integer(8));
-    monthMap.put("sep",new Integer(9));
-    monthMap.put("oct",new Integer(10));
-    monthMap.put("nov",new Integer(11));
-    monthMap.put("dec",new Integer(12));
-  }
-
-  protected static final HashMap milTzMap;
-  static
-  {
-    milTzMap = new HashMap();
-    milTzMap.put("Z","GMT");
-    milTzMap.put("UT","GMT");
-    milTzMap.put("A","GMT-01:00");
-    milTzMap.put("M","GMT-12:00");
-    milTzMap.put("N","GMT+01:00");
-    milTzMap.put("Y","GMT+12:00");
-  }
-
-  /** Parse RFC822 date */
-  public static Date parseRFC822Date(String dateValue)
-  {
-    if (dateValue == null)
-      return null;
-    dateValue = dateValue.trim();
-    // See http://www.faqs.org/rfcs/rfc822.html for legal formats
-    // Format: [day of week,] day mo year hh24:mm:ss tz
-    int commaIndex = dateValue.indexOf(",");
-    String usable;
-    if (commaIndex == -1)
-      usable = dateValue;
-    else
-      usable = dateValue.substring(commaIndex+1).trim();
-    int index;
-
-    index = usable.indexOf(" ");
-    if (index == -1)
-      return null;
-    String day = usable.substring(0,index);
-    usable = usable.substring(index+1).trim();
-
-    index = usable.indexOf(" ");
-    if (index == -1)
-      return null;
-    String month = usable.substring(0,index).toLowerCase(Locale.ROOT);
-    usable = usable.substring(index+1).trim();
-
-    String year;
-    String hour = null;
-    String minute = null;
-    String second = null;
-    String timezone = null;
-
-    index = usable.indexOf(" ");
-    if (index != -1)
-    {
-      year = usable.substring(0,index);
-      usable = usable.substring(index+1).trim();
-
-      index = usable.indexOf(":");
-      if (index == -1)
-        return null;
-      hour = usable.substring(0,index);
-      usable = usable.substring(index+1).trim();
-
-      index = usable.indexOf(":");
-      if (index != -1)
-      {
-        minute = usable.substring(0,index);
-        usable = usable.substring(index+1).trim();
-
-        index = usable.indexOf(" ");
-        if (index == -1)
-          second = usable;
-        else
-        {
-          second = usable.substring(0,index);
-          timezone = usable.substring(index+1).trim();
-        }
-      }
-      else
-      {
-        index = usable.indexOf(" ");
-        if (index == -1)
-          minute = usable;
-        else
-        {
-          minute = usable.substring(0,index);
-          timezone = usable.substring(index+1).trim();
-        }
-      }
-    }
-    else
-      year = usable;
-
-    // Now construct a calendar object from this
-    TimeZone tz;
-    if (timezone != null && timezone.length() > 0)
-    {
-      if (timezone.startsWith("+") || timezone.startsWith("-"))
-      {
-        if (timezone.indexOf(":") == -1 && timezone.length() > 3)
-          timezone = timezone.substring(0,timezone.length()-2) + ":" + timezone.substring(timezone.length()-2);
-        timezone = "GMT"+timezone;
-      }
-      else
-      {
-        // Map special timezones to java timezones
-        if (milTzMap.get(timezone) != null)
-          timezone = (String)milTzMap.get(timezone);
-      }
-
-    }
-    else
-      timezone = "GMT";
-
-
-    tz = TimeZone.getTimeZone(timezone);
-
-    Calendar c = new GregorianCalendar(tz, Locale.ROOT);
-    try
-    {
-      int value = Integer.parseInt(year);
-      if (value < 1900)
-        value += 1900;
-      c.set(Calendar.YEAR,value);
-
-      Integer x = (Integer)monthMap.get(month);
-      if (x == null)
-        return null;
-      c.set(Calendar.MONTH,x.intValue()-1);
-
-      value = Integer.parseInt(day);
-      c.set(Calendar.DAY_OF_MONTH,value);
-
-      if (hour != null)
-        value = Integer.parseInt(hour);
-      else
-        value = 0;
-      c.set(Calendar.HOUR_OF_DAY,value);
-
-      if (minute != null)
-        value = Integer.parseInt(minute);
-      else
-        value = 0;
-      c.set(Calendar.MINUTE,value);
-
-      if (second != null)
-        value = Integer.parseInt(second);
-      else
-        value = 0;
-      c.set(Calendar.SECOND,value);
-
-      c.set(Calendar.MILLISECOND,0);
-      return new Date(c.getTimeInMillis());
-    }
-    catch (NumberFormatException e)
-    {
-      return null;
-    }
-
-  }
-
-  /** Parse a China Daily News date */
-  public static Date parseChinaDate(String dateValue)
-  {
-    if (dateValue == null)
-      return null;
-    dateValue = dateValue.trim();
-    // Format: 2007/12/30 11:01
-    int index;
-    index = dateValue.indexOf("/");
-    if (index == -1)
-      return null;
-    String year = dateValue.substring(0,index);
-    dateValue = dateValue.substring(index+1);
-    index = dateValue.indexOf("/");
-    if (index == -1)
-      return null;
-    String month = dateValue.substring(0,index);
-    dateValue = dateValue.substring(index+1);
-    index = dateValue.indexOf(" ");
-    String day;
-    String hour = null;
-    String minute = null;
-    String second = null;
-    if (index == -1)
-      day = dateValue;
-    else
-    {
-      day = dateValue.substring(0,index);
-      dateValue = dateValue.substring(index+1);
-      index = dateValue.indexOf(":");
-      if (index == -1)
-        return null;
-      hour = dateValue.substring(0,index);
-      dateValue = dateValue.substring(index+1);
-      index = dateValue.indexOf(":");
-      if (index != -1)
-      {
-        minute = dateValue.substring(0,index);
-        dateValue = dateValue.substring(index+1);
-        second = dateValue;
-      }
-      else
-        minute = dateValue;
-    }
-    TimeZone tz = TimeZone.getTimeZone("GMT");
-    Calendar c = new GregorianCalendar(tz, Locale.ROOT);
-    try
-    {
-      int value = Integer.parseInt(year);
-      if (value < 1900)
-        value += 1900;
-      c.set(Calendar.YEAR,value);
-
-      value = Integer.parseInt(month);
-      c.set(Calendar.MONTH,value-1);
-
-      value = Integer.parseInt(day);
-      c.set(Calendar.DAY_OF_MONTH,value);
-
-      if (hour != null)
-        value = Integer.parseInt(hour);
-      else
-        value = 0;
-      c.set(Calendar.HOUR_OF_DAY,value);
-
-      if (minute != null)
-        value = Integer.parseInt(minute);
-      else
-        value = 0;
-      c.set(Calendar.MINUTE,value);
-
-      if (second != null)
-        value = Integer.parseInt(second);
-      else
-        value = 0;
-      c.set(Calendar.SECOND,value);
-
-      c.set(Calendar.MILLISECOND,0);
-      return new Date(c.getTimeInMillis());
-    }
-    catch (NumberFormatException e)
-    {
-      return null;
-    }
-
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/common/LDAPSSLSocketFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/common/LDAPSSLSocketFactory.java
deleted file mode 100644
index 19ed3c8..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/common/LDAPSSLSocketFactory.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.common;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import javax.net.ssl.SSLSocketFactory;
-import java.security.*;
-import java.io.*;
-import java.net.Socket;
-import java.net.InetAddress;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.SSLContext;
-
-/** This SSLSocketFactory is meant to be instantiated by Java's LDAP code.  It has
-* to be instantiated by name, using the default constructor, so its functionality is quite
-* limited.  It really has little choice other than to trust the certificates from the server.
-*/
-public class LDAPSSLSocketFactory extends SSLSocketFactory
-{
-  /** This is the implicit way to pass in a socket factory producer */
-  protected static final ThreadLocal<ISSLSocketFactoryProducer> sslSocketFactoryProducer = new ThreadLocal<ISSLSocketFactoryProducer>();
-  
-  protected final SSLSocketFactory wrappedSocketFactory;
-  
-  /** Set the socket factory producer to use */
-  public static void setSocketFactoryProducer(final ISSLSocketFactoryProducer p)
-  {
-    sslSocketFactoryProducer.set(p);
-  }
-  
-  public LDAPSSLSocketFactory()
-    throws ManifoldCFException
-  {
-    // This must be preinitialized to contain the correct socket factory producer
-    this.wrappedSocketFactory = sslSocketFactoryProducer.get().getSecureSocketFactory();
-  }
-  
-  @Override
-  public Socket createSocket(final Socket s, final String host, final int port, final boolean autoClose)
-    throws IOException
-  {
-    return wrappedSocketFactory.createSocket(s, host, port, autoClose);
-  }
-
-  @Override
-  public Socket createSocket(final InetAddress source, final int port, final InetAddress target, final int targetPort)
-    throws IOException
-  {
-    return wrappedSocketFactory.createSocket(source, port, target, targetPort);
-  }
-
-  @Override
-  public Socket createSocket(final String source, final int port, final InetAddress target, final int targetPort)
-    throws IOException
-  {
-    return wrappedSocketFactory.createSocket(source, port, target, targetPort);
-  }
-
-  @Override
-  public Socket createSocket(final InetAddress source, final int port)
-    throws IOException
-  {
-    return wrappedSocketFactory.createSocket(source, port);
-  }
-
-  @Override
-  public Socket createSocket(final String source, final int port)
-    throws IOException
-  {
-    return wrappedSocketFactory.createSocket(source, port);
-  }
-  
-  @Override
-  public String[] getDefaultCipherSuites()
-  {
-    return wrappedSocketFactory.getDefaultCipherSuites();
-  }
-  
-  @Override
-  public String[] getSupportedCipherSuites()
-  {
-    return wrappedSocketFactory.getSupportedCipherSuites();
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/common/XMLDoc.java b/framework/core/src/main/java/org/apache/manifoldcf/core/common/XMLDoc.java
deleted file mode 100644
index f6449f7..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/common/XMLDoc.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/* $Id: XMLDoc.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.common;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-import javax.xml.transform.*;
-import javax.xml.transform.dom.*;
-import javax.xml.transform.stream.*;
-import javax.xml.parsers.*;
-import org.xml.sax.*;
-import org.w3c.dom.*;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.system.Logging;
-
-public class XMLDoc
-{
-  public static final String _rcsid = "@(#)$Id: XMLDoc.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private static final String _wildchar = "*";
-  private static final String _slash = "/";
-  private static int _blocksiz = 1024;
-  private Document _doc = null;                   // parsed xml doc tree
-
-  /** Return the document root; may be null
-  * @return document object
-  */
-  protected Object getDocument()                  {return _doc;}
-  protected void setDocument(Object d)    {_doc = (Document)d;}
-
-  /* Path is form of root/node/node...      and data
-  * is returned from bottom most node specified.
-  *
-  * Worker function to process some simple wildcards in
-  * a specified xpath-like string
-
-  * THIS IS THE ONLY WAY TO GET THE XML NODES FROM THE DOC
-  * IE SPECIFING A PATH
-
-  * NOTE wildcards are supported BUT the evaluation of wildcards
-  * is not recursive.  IE if the path presented is THIS/[wildchar]/THAT
-  * only ONE list of element is returned for the first child of THIS.
-  * All children of THIS that have subchildren THAT are NOT returned!
-  *
-  * @param xnode like path
-  * @param start node
-  */
-  public ArrayList processPath(String path, Object o)
-  {
-    ArrayList l = new ArrayList();
-    processPath(l, path, o);
-    return l;
-  }
-
-  public void processPath(ArrayList returnList, String path,
-    Object currentRoot)
-  {
-
-    Object element = currentRoot;
-    StringBuilder bf = new StringBuilder();
-    boolean bWild = false;
-    ArrayList working = new ArrayList();
-
-    if (path.endsWith(_slash))
-    {
-      path += _wildchar;
-    }
-
-    StringTokenizer tokenizer = new StringTokenizer(path, _slash, false);
-
-    int depth=0, pathDepth = tokenizer.countTokens();
-    String attribute=null, value=null;
-
-    while(tokenizer.hasMoreTokens())
-    {
-      depth++;
-
-      // Tokenizer returns true always at least
-      // once, so watch out for dead string
-      String s = tokenizer.nextToken().trim();
-      if (s != null && s.length() > 0)
-      {
-        String elementName;
-        attribute = value =null;
-
-        s = s.trim();
-
-        // Check for "pathelement qualifier" in
-        // each term, for example a path could be
-        // "root/user name=Fred"  meaning find the
-        // the user element where attribute name==Fred.
-        // This extension is fixed and immutable and is
-        // not well error checked
-        if (s.indexOf('=') > -1)
-        {
-          // Any "wildcards" are recorded.
-          bWild = true;
-
-          // Well known form
-          int i = s.indexOf(' ');
-          elementName = s.substring(0, i);
-          s = s.substring(i).trim();
-
-          i = s.indexOf('=');
-          attribute = s.substring(0, i);
-          value = s.substring(i+1);
-
-          bf.append('/').append(elementName).append(attribute);
-          bf.append('=').append(value);
-        }
-        else
-        {
-          elementName = s;
-          if (elementName.equals(_wildchar))
-          {
-            elementName = null; // find anything
-          }
-          else
-          {
-            bf.append("/").append(s);
-          }
-        }
-
-        // Finding specific instance??
-        ArrayList l = getElements(element, elementName);
-        element = null; // forget path to this point
-
-        // If depth==pathDepth, just save the final arraylist
-        if (depth==pathDepth)
-        {
-          working.addAll(l);
-        }
-        else
-        {
-          int i = searchArrayForAttribute(l, 0, attribute, value);
-          if (i != -1)
-          {
-            element = l.get(i);
-          }
-        }
-
-        if (element==null)
-        {
-          break;  //!
-        }
-      }
-    }
-
-
-    // UGH - so, what we do here is take the list
-    // and prune out stuff that doesn't match
-    if (bWild)
-    {
-      for (int i = 0; i < working.size(); i++)
-      {
-        int j = searchArrayForAttribute(working, i, attribute, value);
-        if (j > -1)
-        {
-          // Add a simple XML element (node)
-          // to the list
-          returnList.add(working.get(j));
-        }
-        else
-        {
-          // no more matching nodes
-          break;
-        }
-      }
-    }
-    else
-    {
-      // It's everything, but it is in simple
-      // XML element (node) form.
-      returnList.addAll(working);
-    }
-  }
-
-  /** Having collected an arraylist from a given
-  * depth in the tree, scan the node for the current
-  * attribute specified (part of wildcard matching
-  * of xpath-like element specification)
-  *
-  * @param l list of elements found
-  * @param i starting index
-  * @param attribute String to find
-  * @param value String attribute value to match
-  */
-  protected int searchArrayForAttribute(ArrayList l, int i, String attribute, String value)
-  {
-    int index = -1;
-
-    for (; i < l.size(); i++)
-    {
-      Object element = l.get(i);
-
-      if (attribute == null || attribute.length() == 0)
-      {
-        index = i;
-        break;  // nothing special, first one
-      }
-      else if (value.equals(getValue(element, attribute)))
-      {
-        index = i;
-        break;
-      }
-    }
-
-    return index;
-  }
-
-  /** Serialize the document object to a safe string
-  * @return xml raw text
-  */
-  public String getXML()
-    throws ManifoldCFException
-  {
-    return new String(toByteArray(), StandardCharsets.UTF_8);
-
-  }
-
-  /** Get XML with no entity preamble */
-  public String getXMLNoEntityPreamble()
-    throws ManifoldCFException
-  {
-    String initial = getXML();
-    int index = initial.indexOf(">");
-    return initial.substring(index+1);
-  }
-  
-  /** Convert the response for transmit
-  * @return xml in byte array
-  */
-  public byte[] toByteArray()
-    throws ManifoldCFException
-  {
-    ByteArrayOutputStream os = new ByteArrayOutputStream(_blocksiz);
-    dumpOutput(os);
-    return os.toByteArray();
-  }
-
-
-  /** Creates the empty doc
-  */
-  public XMLDoc()
-    throws ManifoldCFException
-  {
-    try
-    {
-      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-      DocumentBuilder builder = factory.newDocumentBuilder();
-      builder.setEntityResolver(new MyEntityResolver());
-      _doc = builder.newDocument();
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Error setting up parser: "+e.getMessage(),e);
-    }
-  }
-
-  /** Construct a new document tree from a string form of
-  * an xml document
-  * @param data xml to parse
-  */
-  public XMLDoc(String data)
-    throws ManifoldCFException
-  {
-      ByteArrayInputStream bis = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
-      _doc = init(bis);
-
-
-  }
-
-  /** Construct a new document tree from a StringBuilder form of
-  * an xml document
-  * @param data xml to parse
-  */
-  public XMLDoc(StringBuilder data)
-    throws ManifoldCFException
-  {
-      ByteArrayInputStream bis =
-        new ByteArrayInputStream(data.toString().getBytes(StandardCharsets.UTF_8));
-      _doc = init(bis);
-
-  }
-
-  /** Build a document object tree from an input
-  * stream
-  * @param is InputStream of xml to parse
-  */
-  public XMLDoc(InputStream is)
-    throws ManifoldCFException
-  {
-    _doc = init(is);
-  }
-
-  /** Construct a document from all the children of an existing element object from another document.
-  */
-  public XMLDoc(XMLDoc oldDoc, Object parent)
-    throws ManifoldCFException
-  {
-    try
-    {
-      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-      factory.setValidating(false);
-      DocumentBuilder builder = factory.newDocumentBuilder();
-      builder.setEntityResolver(new MyEntityResolver());
-      _doc = builder.newDocument();
-
-      // Now, loop through the document or element's children and transfer them
-      NodeList nodes;
-      if (parent == null)
-        nodes = oldDoc._doc.getChildNodes();
-      else
-        nodes = ((Node)parent).getChildNodes();
-      int sz = nodes.getLength();
-      for (int index = 0; index < sz; index++)
-      {
-        Node node = nodes.item(index);
-        if (node.getNodeType() == Node.ELEMENT_NODE)
-          _doc.appendChild(duplicateNode(node));
-      }
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Error setting up parser: "+e.getMessage(),e);
-    }
-  }
-
-  private Document init(InputStream is)
-    throws ManifoldCFException
-  {
-    Document doc = null;
-    try {
-      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-      factory.setValidating(false);
-      DocumentBuilder builder;
-
-      builder = factory.newDocumentBuilder();
-      builder.setEntityResolver(new MyEntityResolver());
-
-      doc = builder.parse(is);
-    }
-    catch (Exception e)
-    {
-      if (Logging.misc.isDebugEnabled())
-      {
-        // We want to output some context.  But there are two problems.
-        // First, we don't know the encoding.  Second, we don't have infinite memory.
-        
-        StringWriter sw = new StringWriter();
-        try
-        {
-          // This won't work for all streams, but we catch the exception
-          is.reset();
-          byte[] buf = new byte[65536]; 
-          int len = is.read(buf);
-          if (len != -1)
-          {
-            // Append the bytes we have, and stop.  Presume the encoding is utf-8;
-            // if we're wrong it will come out as garbage, but that can't be helped.
-            sw.append(new String(buf, 0, len, StandardCharsets.UTF_8));
-            if (len == buf.length)
-              sw.append("...");
-          }
-        }
-        catch(Exception e1)
-        {
-          // ignore
-        }
-        Logging.misc.debug(sw.toString(), e);
-      }
-      throw new ManifoldCFException("XML parsing error: "+e.getMessage(),e);
-    }
-
-    return doc;
-  }
-
-  /** Return the value of a named attribute
-  * @param elo Object to ask
-  * @param a String attribute to find
-  * @return String value
-  */
-  public final String getValue(Object elo, String a)
-  {
-    Element el = (Element)elo;
-    return (String)(el.getAttribute(a));
-  }
-
-  /** Return element name.
-  * May return null if node not
-  * of type Element
-  * @param el Object to ask
-  * @return String value
-  */
-  public final String getNodeName(Object el)
-  {
-    String name = null;
-    Node node = (Node)el;
-
-    if (node.getNodeType() == Node.ELEMENT_NODE)
-    {
-      name = node.getNodeName();
-    }
-    return name;
-  }
-
-  /** Get TEXT element value as single string.
-  * @param obj Element to grab data
-  * @return TXT collapsed for this element
-  * ie [tag]Julie[/tag] returns "Julie"
-  */
-  public final String getData(Object obj)
-  {
-    Node enode = (Node)obj;
-    StringBuilder data = new StringBuilder();
-    NodeList cdata = enode.getChildNodes();
-
-    // expect just 1
-    int sz = cdata.getLength();
-    for (int j = 0; j < sz; j++)
-    {
-      Node node = cdata.item(j);
-      if (node.getNodeType() == Node.TEXT_NODE)
-      {
-        Text sec = (Text)node;
-        sec.normalize();
-        data.append(sec.getData().trim());
-      }
-      else if (node.getNodeType() == Node.CDATA_SECTION_NODE)
-      {
-        CDATASection sec = (CDATASection)node;
-        data.append(sec.getData().trim());
-      }
-
-    }
-
-    return data.toString();
-  }
-
-  /** Return root node
-  * @return untyped object for later use
-  */
-  public Object getRoot()
-  {
-    return getRoot(_doc);
-  }
-  /** Return root node
-  * @param obj Object document, might not be 'this'
-  * @return untyped object for later use
-  */
-  public Object getRoot(Object obj)
-  {
-    NodeList nodes = ((Document)obj).getChildNodes();
-    return nodes.item(0);
-  }
-
-  /** Return all nodes belonging to this node;
-  * Suppling null means the document is root.
-  * @param n Object to ask
-  * @return ArrayList of objects
-  */
-  private final ArrayList getElements(Object n)
-  {
-    return getElements(n, null);
-  }
-
-  /** Extract the attribute names from the given
-  * node.  If 'n' is not a node, no attributes
-  * will be returned but the array will not be null
-  * @param n Object to ask
-  * @return ArrayList of attribute names
-  */
-  public final ArrayList getAttributes(Object n)
-  {
-    ArrayList atts = new ArrayList();
-
-    NamedNodeMap map = ((Node)n).getAttributes();
-    for (int i = 0; i < map.getLength(); i++)
-    {
-      Attr att = (Attr)map.item(i);
-      atts.add(att.getName());
-    }
-    return atts;
-  }
-
-  /** Return the first object to match tagname
-  * @param parent Object
-  * @param tagname String nodename
-  * @return null or found element (Object)
-  */
-  public Object getElement(Object parent, String tagname)
-  {
-    ArrayList l = getElements(parent, tagname);
-    if (l.size() < 1)
-    {
-      return null;
-    }
-    return l.get(0);
-  }
-
-  /**
-  * Get the elements of this element by name
-  * @param parent Object element
-  * @param tagname String matching elements (tag name), comma seperated ok
-  * @return ArrayListist of nodes
-  */
-  private final ArrayList getElements(Object parent, String tagname)
-  {
-    ArrayList list = new ArrayList();
-    NodeList nodes = (parent==null ? _doc.getChildNodes()
-    : ((Node)parent).getChildNodes());
-    int sz = nodes.getLength();
-
-    ArrayList tags = new ArrayList();
-    int tagsz = 0;
-
-    // Supplied tagname(s)?
-    if (tagname!=null)
-    {
-      StringTokenizer st = new StringTokenizer(tagname, ",");
-      while (st.hasMoreTokens())
-      {
-        tags.add(st.nextToken());
-      }
-    }
-
-    // Process found elements
-    tagsz = tags.size();
-    for (int index = 0; index < sz; index++)
-    {
-      Node node = nodes.item(index);
-      if (node.getNodeType() == Node.ELEMENT_NODE)
-      {
-        String theTag = node.getNodeName();
-
-        // Add all
-        if (tagsz == 0)
-        {
-          list.add(node);
-        }
-
-        // Add matches only
-        else
-        {
-          for (int j = 0; j < tagsz; j++)
-          {
-            if (theTag.equalsIgnoreCase((String)tags.get(j)))
-            {
-              list.add(node);
-              break;  // done, one match only possible
-            }
-          }
-        }
-      }
-    }
-
-    return list;
-  }
-
-  /*************************************************************************
-  *************************************************************************
-  *************************************************************************
-  */
-
-  /** Create an element
-  * @param who Object parent Node
-  * @param ename String element name
-  * @return Object element
-  */
-  public Object createElement(Object who, String ename)
-  {
-    Element element = _doc.createElement(ename);
-
-    if (who==null)
-    {
-      _doc.appendChild(element);
-    }
-    else
-    {
-      ((Element)who).appendChild(element);
-    }
-
-    return element;
-  }
-
-  /** Add the children of another document's node as the children of this node.
-  */
-  public void addDocumentElement(Object where, XMLDoc oldDoc, Object parent)
-  {
-    // Now, loop through the document or element's children and transfer them
-    NodeList nodes;
-    if (parent == null)
-      nodes = oldDoc._doc.getChildNodes();
-    else
-      nodes = ((Node)parent).getChildNodes();
-    int sz = nodes.getLength();
-    for (int index = 0; index < sz; index++)
-    {
-      Node node = nodes.item(index);
-      if (where == null)
-        _doc.appendChild(duplicateNode(node));
-      else
-        ((Element)where).appendChild(duplicateNode(node));
-    }
-  }
-
-  /** Set an attribute on an element
-  * @param e Object element to modify
-  * @param sName String attribute name
-  * @param sValue String attribute value
-  */
-  public void setAttribute(Object e, String sName, String sValue)
-  {
-    ((Element)e).setAttribute(sName, sValue);
-  }
-
-
-  /** Create a free-form data value (vs attribute value=)
-  * @param who Object
-  * @param data String text to add as cdata/text
-  */
-  public Object createText(Object who, String data)
-  {
-    Text element = _doc.createTextNode(data);
-
-    if (who==null)
-    {
-      _doc.appendChild(element);
-    }
-    else
-    {
-      ((Element)who).appendChild(element);
-    }
-
-    return element;
-  }
-
-  /** Make a (deep) copy of a node.
-  *@param node is the node object
-  *@return the local copy.
-  */
-  protected Node duplicateNode(Node node)
-  {
-    Node rval;
-
-    // First, figure out what type it is
-    int type = node.getNodeType();
-    switch (type)
-    {
-    case Node.ELEMENT_NODE:
-      rval = _doc.createElement(node.getNodeName());
-      // Copy attributes
-      NamedNodeMap nmap = node.getAttributes();
-      int i = 0;
-      while (i < nmap.getLength())
-      {
-        Attr attribute = (Attr)nmap.item(i++);
-        ((Element)rval).setAttribute(attribute.getName(),attribute.getValue());
-      }
-      // Copy children
-      NodeList children = node.getChildNodes();
-      i = 0;
-      while (i < children.getLength())
-      {
-        rval.appendChild(duplicateNode(children.item(i++)));
-      }
-      break;
-
-    case Node.TEXT_NODE:
-      // Get the data
-      rval = _doc.createTextNode(((Text)node).getData());
-      break;
-
-    case Node.CDATA_SECTION_NODE:
-      // Create a CDATA section
-      rval = _doc.createCDATASection(((CDATASection)node).getNodeValue());
-      break;
-
-    case Node.COMMENT_NODE:
-      rval = _doc.createComment(((Comment)node).getNodeValue());
-      break;
-
-    default:
-      //System.out.println("Unknown node: "+Integer.toString(type));
-      return null;
-    }
-    return rval;
-  }
-
-  // Transform the output for serialization
-  private void dumpOutput(OutputStream os)
-    throws ManifoldCFException
-  {
-    try
-    {
-      StreamResult res = new StreamResult(os);
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      Transformer transformer = tFactory.newTransformer();
-
-      DOMSource source = new DOMSource(_doc);
-      transformer.transform(source, res);
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Error dumping output: "+e.getMessage(),e);
-    }
-  }
-
-  protected static class MyEntityResolver implements org.xml.sax.EntityResolver
-  {
-    public org.xml.sax.InputSource resolveEntity(java.lang.String publicId, java.lang.String systemId)
-      throws SAXException, java.io.IOException
-    {
-      // ALL references resolve to blank documents
-      return new org.xml.sax.InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes(StandardCharsets.UTF_8)));
-    }
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/connector/BaseConnector.java b/framework/core/src/main/java/org/apache/manifoldcf/core/connector/BaseConnector.java
deleted file mode 100644
index e49b56e..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/connector/BaseConnector.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/* $Id: BaseConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.connector;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** This base class underlies all connector implementations.
-*/
-public abstract class BaseConnector implements IConnector
-{
-  public static final String _rcsid = "@(#)$Id: BaseConnector.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Config params
-  protected ConfigParams params = null;
-
-  // Current thread context
-  protected IThreadContext currentContext = null;
-
-  /** Install the connector.
-  * This method is called to initialize persistent storage for the connector, such as database tables etc.
-  * It is called when the connector is registered.
-  *@param threadContext is the current thread context.
-  */
-  @Override
-  public void install(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Base install does nothing
-  }
-
-  /** Uninstall the connector.
-  * This method is called to remove persistent storage for the connector, such as database tables etc.
-  * It is called when the connector is deregistered.
-  *@param threadContext is the current thread context.
-  */
-  @Override
-  public void deinstall(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Base uninstall does nothing
-  }
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  @Override
-  public void connect(ConfigParams configParams)
-  {
-    params = configParams;
-  }
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  @Override
-  public String check()
-    throws ManifoldCFException
-  {
-    // Base version returns "OK" status.
-    return "Connection working";
-  }
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  @Override
-  public void poll()
-    throws ManifoldCFException
-  {
-    // Base version does nothing
-  }
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  @Override
-  public boolean isConnected()
-  {
-    // Consider it connected.
-    return true;
-  }
-
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  @Override
-  public void disconnect()
-    throws ManifoldCFException
-  {
-    params = null;
-  }
-
-  /** Clear out any state information specific to a given thread.
-  * This method is called when this object is returned to the connection pool.
-  */
-  @Override
-  public void clearThreadContext()
-  {
-    currentContext = null;
-  }
-
-  /** Attach to a new thread.
-  *@param threadContext is the new thread context.
-  */
-  @Override
-  public void setThreadContext(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    currentContext = threadContext;
-  }
-
-  /** Get configuration information.
-  *@return the configuration information for this class.
-  */
-  @Override
-  public ConfigParams getConfiguration()
-  {
-    return params;
-  }
-
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    outputConfigurationHeader(threadContext,out,parameters,tabsArray);
-  }
-
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    // Call the old method signature, for backwards compatibility
-    ArrayList<Object> localTabsArray = new ArrayList<Object>();
-    outputConfigurationHeader(threadContext,out,parameters,localTabsArray);
-    for (Object o : localTabsArray)
-    {
-      tabsArray.add((String)o);
-    }
-  }
-  
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, ConfigParams parameters, ArrayList<Object> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-  }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    outputConfigurationBody(threadContext,out,parameters,tabName);
-  }
-
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  @Override
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    return processConfigurationPost(threadContext,variableContext,parameters);
-  }
-
-  /** Process a configuration post.
-  * This method is called at the start of the connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, ConfigParams parameters)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  @Override
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-    viewConfiguration(threadContext,out,parameters);
-  }
-
-  /** View configuration.
-  * This method is called in the body section of the connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, ConfigParams parameters)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  // Useful pack/unpack methods.  These are typically used for version strings, which
-  // appear in some kinds of connectors (but not others).
-  
-  /** Stuffer for packing a single string with an end delimiter */
-  protected static void pack(StringBuilder output, String value, char delimiter)
-  {
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == delimiter)
-        output.append('\\');
-      output.append(x);
-    }
-    output.append(delimiter);
-  }
-
-  /** Unstuffer for the above. */
-  protected static int unpack(StringBuilder sb, String value, int startPosition, char delimiter)
-  {
-    while (startPosition < value.length())
-    {
-      char x = value.charAt(startPosition++);
-      if (x == '\\')
-      {
-        if (startPosition < value.length())
-          x = value.charAt(startPosition++);
-      }
-      else if (x == delimiter)
-        break;
-      sb.append(x);
-    }
-    return startPosition;
-  }
-
-  /** Stuffer for packing lists of fixed length */
-  protected static void packFixedList(StringBuilder output, String[] values, char delimiter)
-  {
-    int i = 0;
-    while (i < values.length)
-    {
-      pack(output,values[i++],delimiter);
-    }
-  }
-
-  /** Unstuffer for unpacking lists of fixed length */
-  protected static int unpackFixedList(String[] output, String value, int startPosition, char delimiter)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < output.length)
-    {
-      sb.setLength(0);
-      startPosition = unpack(sb,value,startPosition,delimiter);
-      output[i++] = sb.toString();
-    }
-    return startPosition;
-  }
-
-  /** Stuffer for packing lists of variable length */
-  protected static void packList(StringBuilder output, List<String> values, char delimiter)
-  {
-    pack(output,Integer.toString(values.size()),delimiter);
-    int i = 0;
-    while (i < values.size())
-    {
-      pack(output,values.get(i++).toString(),delimiter);
-    }
-  }
-
-  /** Another stuffer for packing lists of variable length */
-  protected static void packList(StringBuilder output, String[] values, char delimiter)
-  {
-    pack(output,Integer.toString(values.length),delimiter);
-    int i = 0;
-    while (i < values.length)
-    {
-      pack(output,values[i++],delimiter);
-    }
-  }
-
-  /** Unstuffer for unpacking lists of variable length.
-  *@param output is the array to write the unpacked result into.
-  *@param value is the value to unpack.
-  *@param startPosition is the place to start the unpack.
-  *@param delimiter is the character to use between values.
-  *@return the next position beyond the end of the list.
-  */
-  protected static int unpackList(List<String> output, String value, int startPosition, char delimiter)
-  {
-    StringBuilder sb = new StringBuilder();
-    startPosition = unpack(sb,value,startPosition,delimiter);
-    try
-    {
-      int count = Integer.parseInt(sb.toString());
-      int i = 0;
-      while (i < count)
-      {
-        sb.setLength(0);
-        startPosition = unpack(sb,value,startPosition,delimiter);
-        output.add(sb.toString());
-        i++;
-      }
-    }
-    catch (NumberFormatException e)
-    {
-    }
-    return startPosition;
-  }
-
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/connectorpool/ConnectorPool.java b/framework/core/src/main/java/org/apache/manifoldcf/core/connectorpool/ConnectorPool.java
deleted file mode 100644
index b6f396f..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/connectorpool/ConnectorPool.java
+++ /dev/null
@@ -1,820 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.connectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This is the base factory class for all ConnectorPool objects.
-*/
-public abstract class ConnectorPool<T extends IConnector>
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // How global connector allocation works:
-  // (1) There is a lock-manager "service" associated with this connector pool.  This allows us to clean
-  // up after local pools that have died without being released.  There's one anonymous service instance per local pool,
-  // and thus one service instance per JVM.
-  // (2) Each local pool knows how many connector instances of each type (keyed by connection name) there
-  // are.
-  // (3) Each local pool/connector instance type has a local authorization count.  This is the amount it's
-  // allowed to actually keep.  If the pool has more connectors of a type than the local authorization count permits,
-  // then every connector release operation will destroy the released connector until the local authorization count
-  // is met.
-  // (4) Each local pool/connector instance type needs a global variable describing how many CURRENT instances
-  // the local pool has allocated.  This is a transient value which should automatically go to zero if the service becomes inactive.
-  // The lock manager has primitives now that allow data to be set this way.  We will use the connection name as the
-  // "data type" name - only in the local pool will we pay any attention to config info and class name, and flush those handles
-  // that get returned that have the wrong info attached.
-
-  /** Target calc lock prefix */
-  protected final static String targetCalcLockPrefix = "_POOLTARGET_";
-  
-  /** Service type prefix */
-  protected final String serviceTypePrefix;
-
-  /** Pool hash table. Keyed by connection name; value is Pool */
-  protected final Map<String,Pool> poolHash = new HashMap<String,Pool>();
-
-  /** Random number */
-  protected final static Random randomNumberGenerator = new Random();
-  
-  protected ConnectorPool(String serviceTypePrefix)
-  {
-    this.serviceTypePrefix = serviceTypePrefix;
-  }
-
-  // Protected methods
-  
-  /** Override this method to hook into a connector manager.
-  */
-  protected abstract boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException;
-  
-  /** Override this method to check if a connection name is still valid.
-  */
-  protected abstract boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-    throws ManifoldCFException;
-  
-  /** Get a connector instance.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  protected T createConnectorInstance(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    if (!isInstalled(threadContext,className))
-      return null;
-
-    try
-    {
-      Class theClass = ManifoldCF.findClass(className);
-      Class[] argumentClasses = new Class[0];
-      // Look for a constructor
-      Constructor c = theClass.getConstructor(argumentClasses);
-      Object[] arguments = new Object[0];
-      Object o = c.newInstance(arguments);
-      try
-      {
-        return (T)o;
-      }
-      catch (ClassCastException e)
-      {
-        throw new ManifoldCFException("Class '"+className+"' does not implement IConnector.");
-      }
-    }
-    catch (InvocationTargetException e)
-    {
-      Throwable z = e.getTargetException();
-      if (z instanceof Error)
-        throw (Error)z;
-      else if (z instanceof RuntimeException)
-        throw (RuntimeException)z;
-      else if (z instanceof ManifoldCFException)
-        throw (ManifoldCFException)z;
-      else
-        throw new RuntimeException("Unknown exception type: "+z.getClass().getName()+": "+z.getMessage(),z);
-    }
-    catch (ClassNotFoundException e)
-    {
-      // Equivalent to the connector not being installed
-      return null;
-      //throw new ManifoldCFException("No connector class '"+className+"' was found.",e);
-    }
-    catch (NoSuchMethodException e)
-    {
-      throw new ManifoldCFException("No appropriate constructor for IConnector implementation '"+
-        className+"'.  Need xxx(ConfigParams).",
-        e);
-    }
-    catch (SecurityException e)
-    {
-      throw new ManifoldCFException("Protected constructor for IConnector implementation '"+className+"'",
-        e);
-    }
-    catch (IllegalAccessException e)
-    {
-      throw new ManifoldCFException("Unavailable constructor for IConnector implementation '"+className+"'",
-        e);
-    }
-    catch (IllegalArgumentException e)
-    {
-      throw new ManifoldCFException("Shouldn't happen!!!",e);
-    }
-    catch (InstantiationException e)
-    {
-      throw new ManifoldCFException("InstantiationException for IConnector implementation '"+className+"'",
-        e);
-    }
-    catch (ExceptionInInitializerError e)
-    {
-      throw new ManifoldCFException("ExceptionInInitializerError for IConnector implementation '"+className+"'",
-        e);
-    }
-
-  }
-
-  /** Get multiple connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  */
-  public T[] grabMultiple(IThreadContext threadContext, Class<T> clazz,
-    String[] orderingKeys, String[] connectionNames,
-    String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-    throws ManifoldCFException
-  {
-    T[] rval = (T[])Array.newInstance(clazz,classNames.length);
-    Map<String,Integer> orderMap = new HashMap<String,Integer>();
-    for (int i = 0; i < orderingKeys.length; i++)
-    {
-      if (orderMap.get(orderingKeys[i]) != null)
-        throw new ManifoldCFException("Found duplicate order key");
-      orderMap.put(orderingKeys[i],new Integer(i));
-    }
-    java.util.Arrays.sort(orderingKeys);
-    for (int i = 0; i < orderingKeys.length; i++)
-    {
-      String orderingKey = orderingKeys[i];
-      int index = orderMap.get(orderingKey).intValue();
-      String connectionName = connectionNames[index];
-      String className = classNames[index];
-      ConfigParams cp = configInfos[index];
-      int maxPoolSize = maxPoolSizes[index];
-      try
-      {
-        T connector = grab(threadContext,connectionName,className,cp,maxPoolSize);
-        rval[index] = connector;
-      }
-      catch (Throwable e)
-      {
-        while (i > 0)
-        {
-          i--;
-          orderingKey = orderingKeys[i];
-          index = orderMap.get(orderingKey).intValue();
-          try
-          {
-            release(threadContext,connectionName,rval[index]);
-          }
-          catch (ManifoldCFException e2)
-          {
-          }
-        }
-        if (e instanceof ManifoldCFException)
-          throw (ManifoldCFException)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof Error)
-          throw (Error)e;
-        else
-          throw new RuntimeException("Unexpected exception type: "+e.getClass().getName()+": "+e.getMessage(),e);
-      }
-    }
-    return rval;
-  }
-
-  /** Get a connector.
-  * The connector is specified by its connection name, class, and parameters.  If the
-  * class and parameters corresponding to a connection name change, then this code
-  * will destroy any old connector instance that does not correspond, and create a new
-  * one using the new class and parameters.
-  *@param threadContext is the current thread context.
-  *@param connectionName is the name of the connection.  This functions as a pool key.
-  *@param className is the name of the class to get a connector for.
-  *@param configInfo are the name/value pairs constituting configuration info
-  * for this class.
-  */
-  public T grab(IThreadContext threadContext, String connectionName,
-    String className, ConfigParams configInfo, int maxPoolSize)
-    throws ManifoldCFException
-  {
-    // We want to get handles off the pool and use them.  But the
-    // handles we fetch have to have the right config information.
-
-    // Loop until we successfully get a connector.  This is necessary because the
-    // pool may vanish because it has been closed.
-    while (true)
-    {
-      Pool p;
-      synchronized (poolHash)
-      {
-        p = poolHash.get(connectionName);
-        if (p == null)
-        {
-          p = new Pool(threadContext, maxPoolSize, connectionName);
-          poolHash.put(connectionName,p);
-          // Do an initial poll right away, so we don't have to wait 5 seconds to 
-          // get a connector instance unless they're already all in use.
-          p.pollAll(threadContext);
-        }
-        else
-        {
-          p.updateMaximumPoolSize(threadContext, maxPoolSize);
-        }
-      }
-
-      T rval = p.getConnector(threadContext,className,configInfo);
-      if (rval != null)
-        return rval;
-    }
-
-  }
-
-  /** Release multiple output connectors.
-  */
-  public void releaseMultiple(IThreadContext threadContext, String[] connectionNames, T[] connectors)
-    throws ManifoldCFException
-  {
-    ManifoldCFException currentException = null;
-    for (int i = 0; i < connectors.length; i++)
-    {
-      String connectionName = connectionNames[i];
-      T c = connectors[i];
-      try
-      {
-        release(threadContext,connectionName,c);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (currentException == null)
-          currentException = e;
-      }
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-  /** Release an output connector.
-  *@param connectionName is the connection name.
-  *@param connector is the connector to release.
-  */
-  public void release(IThreadContext threadContext, String connectionName, T connector)
-    throws ManifoldCFException
-  {
-    // If the connector is null, skip the release, because we never really got the connector in the first place.
-    if (connector == null)
-      return;
-
-    // Figure out which pool this goes on, and put it there
-    Pool p;
-    synchronized (poolHash)
-    {
-      p = poolHash.get(connectionName);
-    }
-
-    if (p != null)
-      p.releaseConnector(threadContext, connector);
-    else
-    {
-      // Destroy the connector instance, since the pool is gone and that means we're shutting down
-      connector.setThreadContext(threadContext);
-      try
-      {
-        connector.disconnect();
-      }
-      finally
-      {
-        connector.clearThreadContext();
-      }
-    }
-  }
-
-  /** Idle notification for inactive output connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // System.out.println("Pool stats:");
-
-    // Go through the whole pool and notify everyone
-    synchronized (poolHash)
-    {
-      Iterator<String> iter = poolHash.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String connectionName = iter.next();
-        Pool p = poolHash.get(connectionName);
-        if (isConnectionNameValid(threadContext,connectionName))
-          p.pollAll(threadContext);
-        else
-        {
-          p.releaseAll(threadContext);
-          iter.remove();
-        }
-      }
-    }
-
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Go through the whole pool and clean it out
-    synchronized (poolHash)
-    {
-      Iterator<Pool> iter = poolHash.values().iterator();
-      while (iter.hasNext())
-      {
-        Pool p = iter.next();
-        p.flushUnused(threadContext);
-      }
-    }
-  }
-
-  /** Clean up all open output connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  *@param threadContext is the local thread context.
-  */
-  public void closeAllConnectors(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Go through the whole pool and clean it out
-    synchronized (poolHash)
-    {
-      Iterator<Pool> iter = poolHash.values().iterator();
-      while (iter.hasNext())
-      {
-        Pool p = iter.next();
-        p.releaseAll(threadContext);
-        iter.remove();
-      }
-    }
-  }
-
-  // Protected methods and classes
-  
-  protected String buildServiceTypeName(String connectionName)
-  {
-    return serviceTypePrefix + connectionName;
-  }
-  
-  protected String buildTargetCalcLockName(String connectionName)
-  {
-    return targetCalcLockPrefix + serviceTypePrefix + connectionName;
-  }
-  
-  /** This class represents a value in the pool hash, which corresponds to a given key.
-  */
-  protected class Pool
-  {
-    /** Whether this pool is alive */
-    protected boolean isAlive = true;
-    /** The global maximum for this pool */
-    protected int globalMax;
-    /** Service type name */
-    protected final String serviceTypeName;
-    /** The (anonymous) service name */
-    protected final String serviceName;
-    /** The target calculation lock name */
-    protected final String targetCalcLockName;
-    /** Place where we keep unused connector instances */
-    protected final List<T> stack = new ArrayList<T>();
-    /** The number of local instances we can currently pass out to requesting threads.  Initially zero until pool is apportioned */
-    protected int numFree = 0;
-    /** The number of instances we are allowed to hand out locally, at this time */
-    protected int localMax = 0;
-    /** The number of instances that are actually connected and in use, as of the last poll */
-    protected int localInUse = 0;
-    
-    /** Constructor
-    */
-    public Pool(IThreadContext threadContext, int maxCount, String connectionName)
-      throws ManifoldCFException
-    {
-      this.globalMax = maxCount;
-      this.targetCalcLockName = buildTargetCalcLockName(connectionName);
-      this.serviceTypeName = buildServiceTypeName(connectionName);
-      // Now, register and activate service anonymously, and record the service name we get.
-      ILockManager lockManager = LockManagerFactory.make(threadContext);
-      this.serviceName = lockManager.registerServiceBeginServiceActivity(serviceTypeName, null, null);
-    }
-
-    /** Update the maximum pool size.
-    *@param maxPoolSize is the new global maximum pool size.
-    */
-    public synchronized void updateMaximumPoolSize(IThreadContext threadContext, int maxPoolSize)
-      throws ManifoldCFException
-    {
-      // This updates the maximum global size that the pool uses.
-      globalMax = maxPoolSize;
-      // We do nothing else at this time; we rely on polling to reapportion the pool.
-    }
-
-    
-    /** Grab a connector.
-    * If none exists, construct it using the information in the pool key.
-    *@return the connector, or null if no connector could be connected.
-    */
-    public synchronized T getConnector(IThreadContext threadContext, String className, ConfigParams configParams)
-      throws ManifoldCFException
-    {
-      // numFree represents the number of available connector instances that have not been given out at this moment.
-      // So it's the max minus the pool count minus the number in use.
-      while (isAlive && numFree <= 0)
-      {
-        try
-        {
-          wait();
-        }
-        catch (InterruptedException e)
-        {
-          throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-      }
-      if (!isAlive)
-        return null;
-      
-      // We decrement numFree when we hand out a connector instance; we increment numFree when we
-      // throw away a connector instance from the pool.
-      while (true)
-      {
-        if (stack.size() == 0)
-        {
-          T newrc = createConnectorInstance(threadContext,className);
-          if (newrc == null)
-            return null;
-          newrc.connect(configParams);
-          stack.add(newrc);
-        }
-        
-        // Since thread context set can fail, do that before we remove it from the pool.
-        T rc = stack.remove(stack.size()-1);
-        // Set the thread context.  This can throw an exception!!  We need to be sure our bookkeeping
-        // is resilient against that possibility.  Losing a connector instance that was just sitting
-        // in the pool does NOT affect numFree, so no change needed here; we just can't disconnect the
-        // connector instance if this fails.
-        rc.setThreadContext(threadContext);
-        // Verify that the connector is in fact compatible
-        if (!(rc.getClass().getName().equals(className) && rc.getConfiguration().equals(configParams)))
-        {
-          // Looks like parameters have changed, so discard old instance.
-          try
-          {
-            rc.disconnect();
-          }
-          finally
-          {
-            rc.clearThreadContext();
-          }
-          continue;
-        }
-        // About to return a connector instance; decrement numFree accordingly.
-        numFree--;
-        return rc;
-      }
-    }
-
-    /** Release a connector to the pool.
-    *@param connector is the connector.
-    */
-    public synchronized void releaseConnector(IThreadContext threadContext, T connector)
-      throws ManifoldCFException
-    {
-      if (connector == null)
-        return;
-
-      // Make sure connector knows it's released
-      connector.clearThreadContext();
-      // Return it to the pool, and note that it is no longer in use.
-      stack.add(connector);
-      numFree++;
-      // Determine if we need to free some connectors.  If the number
-      // of allocated connectors exceeds the target, we unload some
-      // off the stack.
-      // The question is whether the stack has too many connector instances
-      // on it.  Obviously, if it stack.size() > max, it does - but remember
-      // that the number of outstanding connectors is max - numFree.
-      // So, we have an excess if stack.size() > max - (max-numFree).
-      // Simplifying: excess is when stack.size() > numFree.
-      while (stack.size() > 0 && stack.size() > numFree)
-      {
-        // Try to find a connector instance that is not actually connected.
-        // These are likely to be at the front of the queue, since those are the
-        // oldest.
-        int j;
-        for (j = 0; j < stack.size(); j++)
-        {
-          if (!stack.get(j).isConnected())
-            break;
-        }
-        T rc;
-        if (j == stack.size())
-          rc = stack.remove(stack.size()-1);
-        else
-          rc = stack.remove(j);
-        rc.setThreadContext(threadContext);
-        try
-        {
-          rc.disconnect();
-        }
-        finally
-        {
-          rc.clearThreadContext();
-        }
-      }
-
-      notifyAll();
-    }
-
-    /** Notify all free connectors.
-    */
-    public synchronized void pollAll(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      // The meat of the cross-cluster apportionment algorithm goes here!
-      // Two global numbers each service posts: "in-use" and "target".  At no time does a service *ever* post either a "target"
-      // that, together with all other active service targets, is in excess of the max.  Also, at no time a service post
-      // a target that, when added to the other "in-use" values, exceeds the max.  If the "in-use" values everywhere else
-      // already equal or exceed the max, then the target will be zero.
-      // The target quota is calculated as follows:
-      // (1) Target is summed, excluding ours.  This is GlobalTarget.
-      // (2) In-use is summed, excluding ours.  This is GlobalInUse.
-      // (3) Our MaximumTarget is computed, which is Maximum - GlobalTarget or Maximum - GlobalInUse, whichever is
-      //     smaller, but never less than zero.
-      // (4) Our FairTarget is computed.  The FairTarget divides the Maximum by the number of services, and adds
-      //     1 randomly based on the remainder.
-      // (5) We compute OptimalTarget as follows: We start with current local target.  If current local target
-      //    exceeds current local in-use count, we adjust OptimalTarget downward by one.  Otherwise we increase it
-      //    by one.
-      // (6) Finally, we compute Target by taking the minimum of MaximumTarget, FairTarget, and OptimalTarget.
-
-      ILockManager lockManager = LockManagerFactory.make(threadContext);
-      lockManager.enterWriteLock(targetCalcLockName);
-      try
-      {
-        // Compute MaximumTarget
-        SumClass sumClass = new SumClass(serviceName);
-        lockManager.scanServiceData(serviceTypeName, sumClass);
-        //System.out.println("numServices = "+sumClass.getNumServices()+"; globalTarget = "+sumClass.getGlobalTarget()+"; globalInUse = "+sumClass.getGlobalInUse());
-        
-        int numServices = sumClass.getNumServices();
-        if (numServices == 0)
-          return;
-        int globalTarget = sumClass.getGlobalTarget();
-        int globalInUse = sumClass.getGlobalInUse();
-        int maximumTarget = globalMax - globalTarget;
-        if (maximumTarget > globalMax - globalInUse)
-          maximumTarget = globalMax - globalInUse;
-        if (maximumTarget < 0)
-          maximumTarget = 0;
-        
-        // Compute FairTarget
-        int fairTarget = globalMax / numServices;
-        int remainder = globalMax % numServices;
-        // Randomly choose whether we get an addition to the FairTarget
-        if (randomNumberGenerator.nextInt(numServices) < remainder)
-          fairTarget++;
-        
-        // Compute OptimalTarget (and poll connectors while we are at it)
-        int localInUse = localMax - numFree;      // These are the connectors that have been handed out
-        for (T rc : stack)
-        {
-          // Notify
-          rc.setThreadContext(threadContext);
-          try
-          {
-            rc.poll();
-            if (rc.isConnected())
-              localInUse++;       // Count every pooled connector that is still connected
-          }
-          finally
-          {
-            rc.clearThreadContext();
-          }
-        }
-        int optimalTarget = localMax;
-        if (localMax > localInUse)
-          optimalTarget--;
-        else
-        {
-          // We want a fast ramp up, so make this proportional to globalMax
-          int increment = globalMax >> 2;
-          if (increment == 0)
-            increment = 1;
-          optimalTarget += increment;
-        }
-        
-        //System.out.println(serviceTypeName+":maxTarget = "+maximumTarget+"; fairTarget = "+fairTarget+"; optimalTarget = "+optimalTarget);
-
-        // Now compute actual target
-        int target = maximumTarget;
-        if (target > fairTarget)
-          target = fairTarget;
-        if (target > optimalTarget)
-          target = optimalTarget;
-        
-        //System.out.println(serviceTypeName+":Picking target="+target+"; localInUse="+localInUse);
-        // Write these values to the service data variables.
-        // NOTE that there is a race condition here; the target value depends on all the calculations above being accurate, and not changing out from under us.
-        // So, that's why we have a write lock around the pool calculations.
-        
-        lockManager.updateServiceData(serviceTypeName, serviceName, pack(target, localInUse));
-        
-        // Now, update our localMax
-        if (target == localMax)
-          return;
-        //System.out.println(serviceTypeName+":Updating target: "+target);
-        // Compute the number of instances in use locally
-        localInUse = localMax - numFree;
-        localMax = target;
-        // numFree may turn out to be negative here!!  That's okay; we'll just free released connectors
-        // until we enter positive territory again.
-        numFree = localMax - localInUse;
-        notifyAll();
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(targetCalcLockName);
-      }
-      
-      // Finally, free pooled instances in excess of target
-      while (stack.size() > 0 && stack.size() > numFree)
-      {
-        // Try to find a connector instance that is not actually connected.
-        // These are likely to be at the front of the queue, since those are the
-        // oldest.
-        int j;
-        for (j = 0; j < stack.size(); j++)
-        {
-          if (!stack.get(j).isConnected())
-            break;
-        }
-        T rc;
-        if (j == stack.size())
-          rc = stack.remove(stack.size()-1);
-        else
-          rc = stack.remove(j);
-        rc.setThreadContext(threadContext);
-        try
-        {
-          rc.disconnect();
-        }
-        finally
-        {
-          rc.clearThreadContext();
-        }
-      }
-
-    }
-
-    /** Flush unused connectors.
-    */
-    public synchronized void flushUnused(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      while (stack.size() > 0)
-      {
-        // Disconnect
-        T rc = stack.remove(stack.size()-1);
-        rc.setThreadContext(threadContext);
-        try
-        {
-          rc.disconnect();
-        }
-        finally
-        {
-          rc.clearThreadContext();
-        }
-      }
-    }
-
-    /** Release all free connectors.
-    */
-    public synchronized void releaseAll(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      flushUnused(threadContext);
-      
-      // End service activity
-      if (isAlive)
-      {
-        isAlive = false;
-        notifyAll();
-        ILockManager lockManager = LockManagerFactory.make(threadContext);
-        lockManager.endServiceActivity(serviceTypeName, serviceName);
-      }
-    }
-
-  }
-
-  protected static class SumClass implements IServiceDataAcceptor
-  {
-    protected final String serviceName;
-    protected int numServices = 0;
-    protected int globalTargetTally = 0;
-    protected int globalInUseTally = 0;
-    
-    public SumClass(String serviceName)
-    {
-      this.serviceName = serviceName;
-    }
-    
-    @Override
-    public boolean acceptServiceData(String serviceName, byte[] serviceData)
-      throws ManifoldCFException
-    {
-      numServices++;
-
-      if (!serviceName.equals(this.serviceName))
-      {
-        globalTargetTally += unpackTarget(serviceData);
-        globalInUseTally += unpackInUse(serviceData);
-      }
-      return false;
-    }
-
-    public int getNumServices()
-    {
-      return numServices;
-    }
-    
-    public int getGlobalTarget()
-    {
-      return globalTargetTally;
-    }
-    
-    public int getGlobalInUse()
-    {
-      return globalInUseTally;
-    }
-    
-  }
-  
-  protected static int unpackTarget(byte[] data)
-  {
-    if (data == null || data.length != 8)
-      return 0;
-    return (((int)data[0]) & 0xff) +
-      ((((int)data[1]) << 8) & 0xff00) +
-      ((((int)data[2]) << 16) & 0xff0000) +
-      ((((int)data[3]) << 24) & 0xff000000);
-  }
-
-  protected static int unpackInUse(byte[] data)
-  {
-    if (data == null || data.length != 8)
-      return 0;
-    return (((int)data[4]) & 0xff) +
-      ((((int)data[5]) << 8) & 0xff00) +
-      ((((int)data[6]) << 16) & 0xff0000) +
-      ((((int)data[7]) << 24) & 0xff000000);
-  }
-
-  protected static byte[] pack(int target, int inUse)
-  {
-    byte[] rval = new byte[8];
-    rval[0] = (byte)(target & 0xff);
-    rval[1] = (byte)((target >> 8) & 0xff);
-    rval[2] = (byte)((target >> 16) & 0xff);
-    rval[3] = (byte)((target >> 24) & 0xff);
-    rval[4] = (byte)(inUse & 0xff);
-    rval[5] = (byte)((inUse >> 8) & 0xff);
-    rval[6] = (byte)((inUse >> 16) & 0xff);
-    rval[7] = (byte)((inUse >> 24) & 0xff);
-    return rval;
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/BaseObject.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/BaseObject.java
deleted file mode 100644
index 3fbcb22..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/BaseObject.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/* $Id: BaseObject.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This is the base paper object, which can represents all the fields of a database row -
-* plus anything else that is added.  This works together with BaseTable, if an
-* instance representation is required.
-*/
-public class BaseObject
-{
-  public static final String _rcsid = "@(#)$Id: BaseObject.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected HashMap fields = new HashMap();
-
-  /** Construct an empty one.
-  */
-  public BaseObject()
-  {
-  }
-
-  /** Clear the current object.
-  */
-  public void clear()
-  {
-    fields.clear();
-  }
-
-  /** Get the list of fields that currently have
-  * values.
-  *@return an iterator of the current non-null fields.
-  */
-  public Iterator listFields()
-  {
-    return fields.keySet().iterator();
-  }
-
-  /** Get a field by name.
-  *@param fieldName is the name of the field.
-  *@return the field value, or null if it is not set.
-  */
-  public Object getValue(String fieldName)
-  {
-    return fields.get(fieldName);
-  }
-
-  /** Set a field by name.
-  *@param fieldName is the name of the field.
-  *@param fieldValue is the value, or null if the field should be removed.
-  */
-  public void setValue(String fieldName, Object fieldValue)
-  {
-    if (fieldValue == null)
-      fields.remove(fieldName);
-    else
-      fields.put(fieldName,fieldValue);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/BaseTable.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/BaseTable.java
deleted file mode 100644
index 4ca40c3..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/BaseTable.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/* $Id: BaseTable.java 999670 2010-09-21 22:18:19Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class is a base class that provides a common foundation for table managers
-* for various different tables in the system.
-*/
-public class BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: BaseTable.java 999670 2010-09-21 22:18:19Z kwright $";
-
-  protected IDBInterface dbInterface;
-  protected String tableName;
-
-  public BaseTable(IDBInterface dbInterface, String tableName)
-  {
-    this.dbInterface = dbInterface;
-    this.tableName = tableName;
-  }
-
-  protected IDBInterface getDBInterface()
-  {
-    return dbInterface;
-  }
-
-  public String getTableName()
-  {
-    return tableName;
-  }
-
-  public String getDatabaseCacheKey()
-  {
-    return dbInterface.getDatabaseCacheKey();
-  }
-
-  public String getTransactionID()
-  {
-    return dbInterface.getTransactionID();
-  }
-
-  /** Perform an insert operation.
-  *@param invalidateKeys are the cache keys that should be
-  * invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  */
-  protected void performInsert(Map parameterMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performInsert(tableName,parameterMap,invalidateKeys);
-  }
-
-  /** Perform an update operation.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  protected void performUpdate(Map parameterMap, String whereClause, List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performUpdate(tableName,parameterMap,whereClause,whereParameters,invalidateKeys);
-  }
-
-  /** Perform a delete operation.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  protected void performDelete(String whereClause, List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performDelete(tableName,whereClause,whereParameters,invalidateKeys);
-  }
-
-  /** Perform a table creation operation.
-  *@param columnMap is the map describing the columns and types.  NOTE that these are abstract
-  * types, which will be mapped to the proper types for the actual database inside this
-  * layer.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  protected void performCreate(Map columnMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performCreate(tableName,columnMap,invalidateKeys);
-  }
-
-  /** Perform a table alter operation.
-  *@param columnMap is the map describing the columns and types to add.  These
-  * are in the same form as for performCreate.
-  *@param columnModifyMap is the map describing the columns to modify.  These
-  * are in the same form as for performCreate.
-  *@param columnDeleteList is the list of column names to delete.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performAlter(Map columnMap, Map columnModifyMap, List<String> columnDeleteList,
-    StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performAlter(tableName,columnMap,columnModifyMap,columnDeleteList,invalidateKeys);
-  }
-
-  /** Add an index to a table.
-  *@param unique is a boolean that if true describes a unique index.
-  *@param columnList is the list of columns that need to be included
-  * in the index, in order.
-  */
-  protected void addTableIndex(boolean unique, List<String> columnList)
-    throws ManifoldCFException
-  {
-    dbInterface.addTableIndex(tableName,unique,columnList);
-  }
-
-  /** Add an index to a table.
-  *@param indexName is the optional name of the table index.  If null, a name will be chosen automatically.
-  *@param description is the index description.
-  */
-  protected void performAddIndex(String indexName, IndexDescription description)
-    throws ManifoldCFException
-  {
-    dbInterface.performAddIndex(indexName,tableName,description);
-  }
-
-  /** Remove an index.
-  *@param indexName is the name of the index to remove.
-  */
-  public void performRemoveIndex(String indexName)
-    throws ManifoldCFException
-  {
-    dbInterface.performRemoveIndex(indexName,tableName);
-  }
-
-  /** Analyze this table.
-  */
-  protected void analyzeTable()
-    throws ManifoldCFException
-  {
-    dbInterface.analyzeTable(tableName);
-  }
-
-  /** Reindex this table.
-  */
-  protected void reindexTable()
-    throws ManifoldCFException
-  {
-    dbInterface.reindexTable(tableName);
-  }
-
-  /** Perform a table drop operation.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  protected void performDrop(StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performDrop(tableName,invalidateKeys);
-  }
-
-  /** Get the current table schema.
-  *@param invalidateKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@return a map of column names & ColumnDescription's, or null.
-  */
-  protected Map getTableSchema(StringSet invalidateKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    return dbInterface.getTableSchema(tableName,invalidateKeys,queryClass);
-  }
-
-  /** Get a table's indexes.
-  *@param invalidateKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of index names and IndexDescription objects, describing the indexes.
-  */
-  protected Map getTableIndexes(StringSet invalidateKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    return dbInterface.getTableIndexes(tableName,invalidateKeys,queryClass);
-  }
-
-  /** Perform a general database modification query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param invalidateKeys are the cache keys to invalidate.
-  */
-  protected void performModification(String query, List params, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    dbInterface.performModification(query,params,invalidateKeys);
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@return a resultset.
-  */
-  protected IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    return dbInterface.performQuery(query,params,cacheKeys,queryClass);
-  }
-
-  /** Perform a general "data fetch" query, with the ability to provide a limit.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param resultLimit is the maximum number of results desired.
-  *@return a resultset.
-  */
-  protected IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass, int resultLimit)
-    throws ManifoldCFException
-  {
-    return dbInterface.performQuery(query,params,cacheKeys,queryClass,resultLimit,null);
-  }
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  */
-  protected void beginTransaction()
-    throws ManifoldCFException
-  {
-    dbInterface.beginTransaction();
-  }
-
-  /** Perform the transaction commit.
-  * Calling this method does not relieve the coder of the responsibility of calling endTransaction(),
-  * as listed below.  The purpose of a separate commit operation is to allow handling of situations where the
-  * commit generates a TRANSACTION_ABORT signal.
-  */
-  public void performCommit()
-    throws ManifoldCFException
-  {
-    dbInterface.performCommit();
-  }
-
-  /** Signal that a rollback should occur on the next endTransaction().
-  */
-  protected void signalRollback()
-  {
-    dbInterface.signalRollback();
-  }
-
-  /** End a database transaction, either performing a commit or a rollback (depending on whether
-  * signalRollback() was called within the transaction).
-  */
-  protected void endTransaction()
-    throws ManifoldCFException
-  {
-    dbInterface.endTransaction();
-  }
-
-  /** Get a random amount to sleep for (to resolve a deadlock) */
-  protected long getSleepAmt()
-  {
-    return dbInterface.getSleepAmt();
-  }
-  
-  /** Sleep for a specified amount, to resolve a deadlock */
-  protected void sleepFor(long amt)
-    throws ManifoldCFException
-  {
-    dbInterface.sleepFor(amt);
-  }
-  
-  /** Note a number of inserts, modifications, or deletions to a specific table.  This is so we can decide when to do appropriate maintenance.
-  *@param tableName is the name of the table being modified.
-  *@param insertCount is the number of inserts.
-  *@param modifyCount is the number of updates.
-  *@param deleteCount is the number of deletions.
-  */
-  public void noteModifications(int insertCount, int modifyCount, int deleteCount)
-    throws ManifoldCFException
-  {
-    dbInterface.noteModifications(tableName,insertCount,modifyCount,deleteCount);
-  }
-
-  /** Construct a key that is database specific, and applies to queries
-  * made against a specific table name.
-  */
-  public String makeTableKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,tableName,dbInterface.getDatabaseName());
-  }
-
-  /** Construct a cast to a double value.
-  * On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact
-  * specified).
-  *@param value is the value to be cast.
-  *@return the query chunk needed.
-  */
-  public String constructDoubleCastClause(String value)
-  {
-    return dbInterface.constructDoubleCastClause(value);
-  }
-
-  /** Construct a count clause.
-  * On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so
-  * CAST(COUNT(col) AS BIGINT) will be emitted instead.
-  *@param column is the column string to be counted.
-  *@return the query chunk needed.
-  */
-  public String constructCountClause(String column)
-  {
-    return dbInterface.constructCountClause(column);
-  }
-
-  /** Construct a regular-expression match clause.
-  * This method builds both the text part of a regular-expression match.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true of the regular expression match is to be case insensitive.
-  *@return the query chunk needed, not padded with spaces on either side.
-  */
-  public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    return dbInterface.constructRegexpClause(column,regularExpression,caseInsensitive);
-  }
-
-  /** Construct a regular-expression substring clause.
-  * This method builds an expression that extracts a specified string section from a field, based on
-  * a regular expression.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true if the regular expression match is to be case insensitive.
-  *@return the expression chunk needed, not padded with spaces on either side.
-  */
-  public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    return dbInterface.constructSubstringClause(column,regularExpression,caseInsensitive);
-  }
-
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  public String constructOffsetLimitClause(int offset, int limit)
-  {
-    return dbInterface.constructOffsetLimitClause(offset,limit);
-  }
-
-  /** Construct a 'distinct on (x)' filter.
-  * This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature.
-  * Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final
-  * result.
-  *@param outputParameters is a blank list into which to put parameters.  Null may be used if the baseParameters parameter is null.
-  *@param baseQuery is the base query, which is another SELECT statement, without parens,
-  * e.g. "SELECT ..."
-  *@param baseParameters are the parameters corresponding to the baseQuery.
-  *@param distinctFields are the fields to consider to be distinct.  These should all be keys in otherFields below.
-  *@param orderFields are the otherfield keys that determine the ordering.
-  *@param orderFieldsAscending are true for orderFields that are ordered as ASC, false for DESC.  
-  *@param otherFields are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"
-  *@return a revised query that performs the necessary DISTINCT ON operation.  The list outputParameters will also be appropriately filled in.
-  */
-  public String constructDistinctOnClause(List outputParameters, String baseQuery, List baseParameters,
-    String[] distinctFields, String[] orderFields, boolean[] orderFieldsAscending, Map<String,String> otherFields)
-  {
-    return dbInterface.constructDistinctOnClause(outputParameters,baseQuery,baseParameters,distinctFields,
-      orderFields,orderFieldsAscending,otherFields);
-  }
-
-  /* Calculate the number of values a particular clause can have, given the values for all the other clauses.
-  * For example, if in the expression x AND y AND z, x has 2 values and z has 1, find out how many values x can legally have
-  * when using the buildConjunctionClause() method below.
-  */
-  public int findConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions)
-  {
-    return dbInterface.findConjunctionClauseMax(otherClauseDescriptions);
-  }
-  
-  /* Construct a conjunction clause, e.g. x AND y AND z, where there is expected to be an index (x,y,z,...), and where x, y, or z
-  * can have multiple distinct values, The proper implementation of this method differs from database to database, because some databases
-  * only permit index operations when there are OR's between clauses, such as x1 AND y1 AND z1 OR x2 AND y2 AND z2 ..., where others
-  * only recognize index operations when there are lists specified for each, such as x IN (x1,x2) AND y IN (y1,y2) AND z IN (z1,z2).
-  */
-  public String buildConjunctionClause(List outputParameters, ClauseDescription[] clauseDescriptions)
-  {
-    return dbInterface.buildConjunctionClause(outputParameters,clauseDescriptions);
-  }
-
-  /** Obtain the maximum number of individual items that should be
-  * present in an IN clause.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of IN clause members.
-  */
-  protected int getMaxInClause()
-  {
-    return dbInterface.getMaxInClause();
-  }
-
-  /** Obtain the maximum number of individual clauses that should be
-  * present in a sequence of OR clauses.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of OR clause members.
-  */
-  protected int getMaxOrClause()
-  {
-    return dbInterface.getMaxOrClause();
-  }
-
-  /** Calculate history cutoff for windowed report queries.
-  * @return the cutoff history row count.
-  */
-  public int getWindowedReportMaxRows()
-  {
-    return dbInterface.getWindowedReportMaxRows();
-  }
-
-  /** Set up a base object from a database row.
-  *@param object is the object to read into.
-  *@param resultRow is the row to use to initialize the object.
-  */
-  public static void readRow(BaseObject object, IResultRow resultRow)
-  {
-    Iterator iter = resultRow.getColumns();
-    while (iter.hasNext())
-    {
-      String columnName = (String)iter.next();
-      Object columnValue = resultRow.getValue(columnName);
-      object.setValue(columnName,columnValue);
-    }
-  }
-
-  /** Read the specified fields from the specified object, and
-  * build a Map, which can be used to write the data to the database.
-  *@param fieldSet is the set of fields.
-  *@param object is the BaseObject to get the data from.
-  *@return the map.
-  */
-  public static Map prepareRowForSave(BaseObject object, StringSet fieldSet)
-  {
-    HashMap rval = new HashMap();
-    Iterator keys = fieldSet.getKeys();
-    while (keys.hasNext())
-    {
-      String keyName = (String)keys.next();
-      Object x = object.getValue(keyName);
-      if (x != null)
-        rval.put(keyName,x);
-    }
-    return rval;
-  }
-
-  // More may follow, as table services expand
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/ConnectionFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/ConnectionFactory.java
deleted file mode 100644
index b2cb242..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/ConnectionFactory.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/* $Id: ConnectionFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.jdbcpool.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.util.*;
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-
-/** This class creates a connection, and may at our discretion manage
-* a connection pool someday.
-*/
-public class ConnectionFactory
-{
-  public static final String _rcsid = "@(#)$Id: ConnectionFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-
-  private static HashMap checkedOutConnections = new HashMap();
-
-  private static PoolManager poolManager = new PoolManager();
-
-  private ConnectionFactory()
-  {
-  }
-
-  public static WrappedConnection getConnection(String jdbcUrl, String jdbcDriver, String database, String userName, String password,
-    int maxDBConnections, boolean debug)
-    throws ManifoldCFException
-  {
-    // Make sure database driver is registered
-    try
-    {
-      Class.forName(jdbcDriver);
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Unable to load database driver: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-    
-    ConnectionPoolManager cpm = poolManager.createPoolManager(debug);
-    
-    try
-    {
-      // Hope for a connection now
-      WrappedConnection rval;
-      ConnectionPool cp = cpm.getPool(database);
-      if (cp == null)
-      {
-        cpm.addAlias(database, jdbcDriver, jdbcUrl,
-          userName, password,
-          maxDBConnections, 300000L);
-        cp = cpm.getPool(database);
-      }
-      return getConnectionWithRetries(cp);
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (SQLException e)
-    {
-      throw new ManifoldCFException("Error getting connection: "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-    }
-    catch (ClassNotFoundException e)
-    {
-      throw new ManifoldCFException("Fatal error getting connection: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-    catch (InstantiationException e)
-    {
-      throw new ManifoldCFException("Fatal error getting connection: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-    catch (IllegalAccessException e)
-    {
-      throw new ManifoldCFException("Fatal error getting connection: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-  }
-
-  public static void releaseConnection(WrappedConnection c)
-    throws ManifoldCFException
-  {
-    c.release();
-  }
-
-  public static void flush()
-  {
-    if (poolManager != null)
-      poolManager.flush();
-  }
-  
-  public static void releaseAll()
-  {
-    if (poolManager != null)
-      poolManager.releaseAll();
-  }
-
-  protected static WrappedConnection getConnectionWithRetries(ConnectionPool cp)
-    throws SQLException, InterruptedException
-  {
-    // If we have a problem, we will wait a grand total of 30 seconds
-    int retryCount = 3;
-    while (true)
-    {
-      try
-      {
-        return cp.getConnection();
-      }
-      catch (SQLException e)
-      {
-        if (retryCount == 0)
-          throw e;
-        // Eat the exception and try again
-        retryCount--;
-      }
-      // Ten seconds is a long time
-      ManifoldCF.sleep(10000L);
-    }
-
-  }
-
-  protected static void checkConnections(long currentTime)
-  {
-    synchronized (checkedOutConnections)
-    {
-      Iterator iter = checkedOutConnections.keySet().iterator();
-      while (iter.hasNext())
-      {
-        Object key = iter.next();
-        ConnectionTracker ct = (ConnectionTracker)checkedOutConnections.get(key);
-        if (ct.hasExpired(currentTime))
-          ct.printDetails();
-      }
-    }
-  }
-
-  /** This class abstracts from a connection pool, such that a static reference
-  * to an instance of this class will describe the entire body of connections.
-  * The finalizer for this class attempts to free all connections that are outstanding,
-  * so that class unloading, as it is practiced under tomcat 5.5, will not leave dangling
-  * connections around.
-  */
-  protected static class PoolManager
-  {
-    private Integer poolExistenceLock = new Integer(0);
-    private ConnectionPoolManager _pool = null;
-    
-    private PoolManager()
-    {
-    }
-
-    public ConnectionPoolManager createPoolManager(boolean debug)
-      throws ManifoldCFException
-    {
-      synchronized (poolExistenceLock)
-      {
-        if (_pool != null)
-          return _pool;
-        _pool = new ConnectionPoolManager(100, debug);
-        return _pool;
-      }
-    }
-
-    public void releaseAll()
-    {
-      ConnectionPoolManager thisPool;
-      synchronized (poolExistenceLock)
-      {
-        if (_pool == null)
-          return;
-        thisPool = _pool;
-        _pool = null;
-      }
-
-      // Cleanup strategy: Some connections are still in use because they are being
-      // used by non-worker threads that have been interrupted but haven't yet died.
-      // Cleaning these up is a challenge.  For now I won't address this.
-      
-      thisPool.shutdown();
-    }
-    
-    public void flush()
-    {
-      synchronized (poolExistenceLock)
-      {
-        if (_pool != null)
-        {
-          _pool.flush();
-        }
-      }
-    }
-    
-      /*
-      // Cleanup strategy is to close everything that can easily be closed, but leave around connections that are so busy that they will not close within a certain amount of
-      // time.  To do that, we spin up a thread for each connection, which attempts to close that connection, and then wait until either 15 seconds passes, or all the threads
-      // are finished.
-      //
-      // Under conditions of high load, or (more likely) when long-running exclusive operations like REINDEX are running, the 15 seconds may well be insufficient to acheive
-      // thread shutdown.  In that case a message "LOG:  unexpected EOF on client connection" will appear for each dangling connection in the postgresql log.
-      // This is not ideal, but is a compromise designed to permit speedy and relatively clean shutdown even under
-      // difficult conditions.
-
-      
-      Enumeration enumeration = _pool.getPools();
-      ArrayList connectionShutdownThreads = new ArrayList();
-      while (enumeration.hasMoreElements())
-      {
-        ConnectionPool pool = (ConnectionPool)enumeration.nextElement();
-        try
-        {
-          // The removeAllConnections() method did not work, probably because the cleanup was
-          // delayed by their design.  So instead, we have to do everything the hard way.
-          // If the calling logic is poorly behaved, there is a chance that an open connection will be
-          // left hanging around after this call happens.  If so, postgresql log gets written
-          // with: LOG:  unexpected EOF on client connection
-
-          // System.err.println("There are currently "+Integer.toString(pool.size())+" connections in this pool");
-          int count = pool.size();
-          int i = 0;
-          while (i < count)
-          {
-            com.bitmechanic.sql.PooledConnection p = (com.bitmechanic.sql.PooledConnection)pool.getConnection();
-            ConnectionCloseThread t = new ConnectionCloseThread(p);
-            t.start();
-            connectionShutdownThreads.add(t);
-            i++;
-          }
-          // System.err.println("Done closing connections.");
-        }
-        catch (Exception e)
-        {
-        }
-      }
-
-      int k = 0;
-      while (k < 15)
-      {
-        int j = 0;
-        while (j < connectionShutdownThreads.size())
-        {
-          ConnectionCloseThread t = (ConnectionCloseThread)connectionShutdownThreads.get(j);
-          if (t.isAlive())
-            break;
-          j++;
-        }
-        if (j < connectionShutdownThreads.size())
-        {
-          try
-          {
-            ManifoldCF.sleep(1000L);
-            k++;
-            continue;
-          }
-          catch (InterruptedException e)
-          {
-            break;
-          }
-        }
-        break;
-      }
-
-      // Some threads may still be running - but that can't be helped.
-    }
-    */
-
-    // Protected methods and classes
-
-    /** Finalizer method should attempt to close open connections.
-    * This should get called when tomcat 5.5 unloads a web application.
-    * A shutdown thread will also be registered, which will attempt to do the same, but
-    * will be blocked from proceeding under Tomcat 5.5.  Between the two, however,
-    * there's hope that the right things will take place.
-    */
-    /*
-    protected void finalize()
-      throws Throwable
-    {
-      try
-      {
-        // Release all the connections we can within 15 seconds
-        releaseAll();
-      }
-      finally
-      {
-        super.finalize();
-      }
-    }
-    */
-  }
-
-  /*
-  protected static class ConnectionCloseThread extends Thread
-  {
-    protected com.bitmechanic.sql.PooledConnection connection;
-    protected Throwable exception = null;
-
-    public ConnectionCloseThread(com.bitmechanic.sql.PooledConnection connection)
-    {
-      super();
-      setDaemon(true);
-      this.connection = connection;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // Call the shutdown method
-        connection.run();
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public Throwable getException()
-    {
-      return exception;
-    }
-
-  }
-  */
-  
-  protected static class ConnectionTracker
-  {
-    protected Connection theConnection;
-    protected long checkoutTime;
-    protected Exception theTrace;
-
-    public ConnectionTracker(Connection theConnection)
-    {
-      this.theConnection = theConnection;
-      this.checkoutTime = System.currentTimeMillis();
-      this.theTrace = new Exception("Stack trace");
-    }
-
-    public boolean hasExpired(long currentTime)
-    {
-      return (checkoutTime + 300000L < currentTime);
-    }
-
-    public void printDetails()
-    {
-      Logging.db.error("Connection handle may have been abandoned: "+theConnection.toString(),theTrace);
-    }
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java
deleted file mode 100644
index 47375ae..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java
+++ /dev/null
@@ -1,1497 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.util.*;
-import java.io.*;
-import java.sql.*;
-
-/** This is the HSQLDB implementation of the IDBInterface class.
-*/
-public class DBInterfaceHSQLDB extends Database implements IDBInterface
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private static final String _localUrl = "jdbc:hsqldb:file:";
-  private static final String _remoteUrl = "jdbc:hsqldb:";
-  private static final String _driver = "org.hsqldb.jdbcDriver";
-
-  private static Map<String,String> legalProtocolValues;
-  static
-  {
-    legalProtocolValues = new HashMap<String,String>();
-    legalProtocolValues.put("hsql","hsql");
-    legalProtocolValues.put("http","http");
-    legalProtocolValues.put("https","https");
-  }
-  
-  public final static String databasePathProperty = "org.apache.manifoldcf.hsqldbdatabasepath";
-  public final static String databaseProtocolProperty = "org.apache.manifoldcf.hsqldbdatabaseprotocol";
-  public final static String databaseServerProperty = "org.apache.manifoldcf.hsqldbdatabaseserver";
-  public final static String databasePortProperty = "org.apache.manifoldcf.hsqldbdatabaseport";
-  public final static String databaseInstanceProperty = "org.apache.manifoldcf.hsqldbdatabaseinstance";
-  
-  protected String cacheKey;
-  protected int serializableDepth = 0;
-  protected boolean isRemote;
-  protected String schemaNameForQueries;
-  
-  public DBInterfaceHSQLDB(IThreadContext tc, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    super(tc,getJDBCString(tc,databaseName),_driver,getDatabaseString(tc,databaseName),userName,password);
-    cacheKey = CacheKeyFactory.makeDatabaseKey(this.databaseName);
-    this.isRemote = LockManagerFactory.getProperty(tc,databaseProtocolProperty) != null;
-    this.userName = userName;
-    this.password = password;
-    if (this.isRemote)
-      schemaNameForQueries = databaseName;
-    else
-      schemaNameForQueries = "PUBLIC";
-  }
-
-  protected static String getJDBCString(IThreadContext tc, String databaseName)
-    throws ManifoldCFException
-  {
-    // For local, we use the database name as the name of the database files.
-    // For remote, we connect to an instance specified by a different property, and use the database name as the schema name.
-    String protocol = LockManagerFactory.getProperty(tc,databaseProtocolProperty);
-    if (protocol == null)
-      return _localUrl+getFullDatabasePath(databaseName);
-    
-    // Remote instance.  Build the URL.
-    if (legalProtocolValues.get(protocol) == null)
-      throw new ManifoldCFException("The value of the '"+databaseProtocolProperty+"' property was illegal; try hsql, http, or https");
-    String server = LockManagerFactory.getProperty(tc,databaseServerProperty);
-    if (server == null)
-      throw new ManifoldCFException("HSQLDB remote mode requires '"+databaseServerProperty+"' property, containing a server name or IP address");
-    String port = LockManagerFactory.getProperty(tc,databasePortProperty);
-    if (port != null && port.length() > 0)
-      server += ":"+port;
-    String instanceName = LockManagerFactory.getProperty(tc,databaseInstanceProperty);
-    if (instanceName != null && instanceName.length() > 0)
-      server += "/" + instanceName;
-    return _remoteUrl + protocol + "://" + server;
-  }
-  
-  protected static String getDatabaseString(IThreadContext tc, String databaseName)
-    throws ManifoldCFException
-  {
-    String protocol = LockManagerFactory.getProperty(tc,databaseProtocolProperty);
-    if (protocol == null)
-      return getFullDatabasePath(databaseName);
-    return databaseName;
-  }
-  
-  protected static String getFullDatabasePath(String databaseName)
-    throws ManifoldCFException
-  {
-    File path = ManifoldCF.getFileProperty(databasePathProperty);
-    if (path == null)
-      throw new ManifoldCFException("HSQLDB database requires '"+databasePathProperty+"' property, containing a relative path");
-    String pathString = path.toString().replace("\\\\","/");
-    if (!pathString.endsWith("/"))
-      pathString = pathString + "/";
-    return pathString + databaseName;
-  }
-
-  /** Initialize the connection (for HSQLDB).
-  * HSQLDB has a great deal of session state, and no way to pool individual connections based on it.
-  * So, every time we pull a connection off the pool we have to execute a number of statements on it
-  * before it can work reliably for us.  This is the abstraction that permits that to happen.
-  *@param connection is the JDBC connection.
-  */
-  protected void initializeConnection(Connection connection)
-    throws ManifoldCFException
-  {
-    super.initializeConnection(connection);
-    // Set the schema
-    executeViaThread(connection,"SET SCHEMA "+schemaNameForQueries.toUpperCase(Locale.ROOT),null,false,-1,null,null);
-  }
-
-  /** Initialize.  This method is called once per JVM instance, in order to set up
-  * database communication.
-  */
-  public void openDatabase()
-    throws ManifoldCFException
-  {
-  }
-  
-  /** Uninitialize.  This method is called during JVM shutdown, in order to close
-  * all database communication.
-  */
-  public void closeDatabase()
-    throws ManifoldCFException
-  {
-    //System.out.println("Close database called");
-    if (!isRemote)
-    {
-      try
-      {
-        // Force a load of the appropriate JDBC driver
-        Class.forName(_driver).newInstance();
-      }
-      catch (Exception e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e);
-      }
-
-      // For the shutdown itself, eat the exception
-      try
-      {
-        Connection c = DriverManager.getConnection(_localUrl+databaseName,userName,password);
-        Statement s = c.createStatement();
-        s.execute("SHUTDOWN");
-        c.close();
-      }
-      catch (Exception e)
-      {
-        // Never any exception!
-        e.printStackTrace();
-      }
-    }
-  }
-
-  /** Get the database general cache key.
-  *@return the general cache key for the database.
-  */
-  public String getDatabaseCacheKey()
-  {
-    return cacheKey;
-  }
-
-  /** Perform an insert operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be
-  * invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  */
-  public void performInsert(String tableName, Map<String,Object> parameterMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    List paramArray = new ArrayList();
-
-    StringBuilder bf = new StringBuilder();
-    bf.append("INSERT INTO ");
-    bf.append(tableName);
-    bf.append(" (") ;
-
-    StringBuilder values = new StringBuilder(" VALUES (");
-
-    // loop for cols
-    Iterator<Map.Entry<String,Object>> it = parameterMap.entrySet().iterator();
-    boolean first = true;
-    while (it.hasNext())
-    {
-      Map.Entry<String,Object> e = it.next();
-      String key = e.getKey();
-
-      Object o = e.getValue();
-      if (o != null)
-      {
-        paramArray.add(o);
-
-        if (!first)
-        {
-          bf.append(',');
-          values.append(',');
-        }
-        bf.append(key);
-        values.append('?');
-
-        first = false;
-      }
-    }
-
-    bf.append(')');
-    values.append(')');
-    bf.append(values);
-
-    // Do the modification
-    performModification(bf.toString(),paramArray,invalidateKeys);
-  }
-
-
-  /** Perform an update operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  public void performUpdate(String tableName, Map<String,Object> parameterMap, String whereClause,
-    List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    List paramArray = new ArrayList();
-
-    StringBuilder bf = new StringBuilder();
-    bf.append("UPDATE ");
-    bf.append(tableName);
-    bf.append(" SET ") ;
-
-    // loop for parameters
-    Iterator<Map.Entry<String,Object>> it = parameterMap.entrySet().iterator();
-    boolean first = true;
-    while (it.hasNext())
-    {
-      Map.Entry<String,Object> e = it.next();
-      String key = e.getKey();
-
-      Object o = e.getValue();
-
-      if (!first)
-      {
-        bf.append(',');
-      }
-      bf.append(key);
-      bf.append('=');
-      if (o == null)
-      {
-        bf.append("NULL");
-      }
-      else
-      {
-        bf.append('?');
-        paramArray.add(o);
-      }
-
-      first = false;
-    }
-
-    if (whereClause != null)
-    {
-      bf.append(' ');
-      bf.append(whereClause);
-      if (whereParameters != null)
-      {
-        for (int i = 0; i < whereParameters.size(); i++)
-        {
-          Object value = whereParameters.get(i);
-          paramArray.add(value);
-        }
-      }
-    }
-
-    // Do the modification
-    performModification(bf.toString(),paramArray,invalidateKeys);
-
-  }
-
-
-  /** Perform a delete operation.
-  *@param tableName is the name of the table to delete from.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  public void performDelete(String tableName, String whereClause, List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    StringBuilder bf = new StringBuilder();
-    bf.append("DELETE FROM ");
-    bf.append(tableName);
-    if (whereClause != null)
-    {
-      bf.append(' ');
-      bf.append(whereClause);
-    }
-    else
-      whereParameters = null;
-
-    // Do the modification
-    performModification(bf.toString(),whereParameters,invalidateKeys);
-
-  }
-
-  /** Perform a table creation operation.
-  *@param tableName is the name of the table to create.
-  *@param columnMap is the map describing the columns and types.  NOTE that these are abstract
-  * types, which will be mapped to the proper types for the actual database inside this
-  * layer.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performCreate(String tableName, Map<String,ColumnDescription> columnMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    StringBuilder queryBuffer = new StringBuilder("CREATE CACHED TABLE ");
-    queryBuffer.append(tableName);
-    queryBuffer.append('(');
-    Iterator<String> iter = columnMap.keySet().iterator();
-    boolean first = true;
-    while (iter.hasNext())
-    {
-      String columnName = iter.next();
-      ColumnDescription cd = columnMap.get(columnName);
-      if (!first)
-        queryBuffer.append(',');
-      else
-        first = false;
-      appendDescription(queryBuffer,columnName,cd,false);
-    }
-    queryBuffer.append(')');
-
-    performModification(queryBuffer.toString(),null,invalidateKeys);
-
-  }
-
-  protected static void appendDescription(StringBuilder queryBuffer, String columnName, ColumnDescription cd, boolean forceNull)
-  {
-    queryBuffer.append(columnName);
-    queryBuffer.append(' ');
-    queryBuffer.append(mapType(cd.getTypeString()));
-    if (forceNull || cd.getIsNull())
-      queryBuffer.append(" NULL");
-    else
-      queryBuffer.append(" NOT NULL");
-    if (cd.getIsPrimaryKey())
-      queryBuffer.append(" PRIMARY KEY");
-    if (cd.getReferenceTable() != null)
-    {
-      queryBuffer.append(" REFERENCES ");
-      queryBuffer.append(cd.getReferenceTable());
-      queryBuffer.append('(');
-      queryBuffer.append(cd.getReferenceColumn());
-      queryBuffer.append(") ON DELETE");
-      if (cd.getReferenceCascade())
-        queryBuffer.append(" CASCADE");
-      else
-        queryBuffer.append(" RESTRICT");
-    }
-  }
-
-  /** Perform a table alter operation.
-  *@param tableName is the name of the table to alter.
-  *@param columnMap is the map describing the columns and types to add.  These
-  * are in the same form as for performCreate.
-  *@param columnModifyMap is the map describing the columns to be changed.  The key is the
-  * existing column name, and the value is the new type of the column.  Data will be copied from
-  * the old column to the new.
-  *@param columnDeleteList is the list of column names to delete.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performAlter(String tableName, Map<String,ColumnDescription> columnMap,
-    Map<String,ColumnDescription> columnModifyMap, List<String> columnDeleteList,
-    StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    beginTransaction(TRANSACTION_ENCLOSING);
-    try
-    {
-      if (columnDeleteList != null)
-      {
-        int i = 0;
-        while (i < columnDeleteList.size())
-        {
-          String columnName = columnDeleteList.get(i++);
-          performModification("ALTER TABLE "+tableName+" DROP "+columnName,null,invalidateKeys);
-        }
-      }
-
-      // Do the modifies.  This involves renaming each column to a temp column, then creating a new one, then copying
-      if (columnModifyMap != null)
-      {
-        Iterator<String> iter = columnModifyMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          StringBuilder sb;
-          String columnName = iter.next();
-          ColumnDescription cd = columnModifyMap.get(columnName);
-          sb = new StringBuilder();
-          appendDescription(sb,columnName,cd,false);
-          // Rename current column.  This too involves a copy.
-          performModification("ALTER TABLE "+tableName+" ALTER COLUMN "+sb.toString(),null,invalidateKeys);
-        }
-      }
-
-      // Now, do the adds
-      if (columnMap != null)
-      {
-        Iterator<String> iter = columnMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String columnName = iter.next();
-          ColumnDescription cd = columnMap.get(columnName);
-          StringBuilder sb = new StringBuilder();
-          appendDescription(sb,columnName,cd,false);
-          performModification("ALTER TABLE "+tableName+" ADD "+sb.toString(),null,invalidateKeys);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-  }
-
-
-  /** Map a standard type into a postgresql type.
-  *@param inputType is the input type.
-  *@return the output type.
-  */
-  protected static String mapType(String inputType)
-  {
-    if (inputType.equalsIgnoreCase("longtext"))
-      return "longvarchar";
-    return inputType;
-  }
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param unique is a boolean that if true describes a unique index.
-  *@param columnList is the list of columns that need to be included
-  * in the index, in order.
-  */
-  public void addTableIndex(String tableName, boolean unique, List<String> columnList)
-    throws ManifoldCFException
-  {
-    String[] columns = new String[columnList.size()];
-    int i = 0;
-    while (i < columns.length)
-    {
-      columns[i] = columnList.get(i);
-      i++;
-    }
-    performAddIndex(null,tableName,new IndexDescription(unique,columns));
-  }
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param indexName is the optional name of the table index.  If null, a name will be chosen automatically.
-  *@param description is the index description.
-  */
-  public void performAddIndex(String indexName, String tableName, IndexDescription description)
-    throws ManifoldCFException
-  {
-    String[] columnNames = description.getColumnNames();
-    if (columnNames.length == 0)
-      return;
-
-    if (indexName == null)
-      // Build an index name
-      indexName = "I"+IDFactory.make(context);
-    StringBuilder queryBuffer = new StringBuilder("CREATE ");
-    if (description.getIsUnique())
-      queryBuffer.append("UNIQUE ");
-    queryBuffer.append("INDEX ");
-    queryBuffer.append(indexName);
-    queryBuffer.append(" ON ");
-    queryBuffer.append(tableName);
-    queryBuffer.append(" (");
-    int i = 0;
-    while (i < columnNames.length)
-    {
-      String colName = columnNames[i];
-      if (i > 0)
-        queryBuffer.append(',');
-      queryBuffer.append(colName);
-      i++;
-    }
-    queryBuffer.append(')');
-
-    performModification(queryBuffer.toString(),null,null);
-  }
-
-  /** Remove an index.
-  *@param indexName is the name of the index to remove.
-  *@param tableName is the table the index belongs to.
-  */
-  public void performRemoveIndex(String indexName, String tableName)
-    throws ManifoldCFException
-  {
-    performModification("DROP INDEX "+indexName,null,null);
-  }
-
-  /** Analyze a table.
-  *@param tableName is the name of the table to analyze/calculate statistics for.
-  */
-  public void analyzeTable(String tableName)
-    throws ManifoldCFException
-  {
-    // Nothing to do.
-  }
-
-  /** Reindex a table.
-  *@param tableName is the name of the table to rebuild indexes for.
-  */
-  public void reindexTable(String tableName)
-    throws ManifoldCFException
-  {
-    // Nothing to do.
-  }
-
-  /** Perform a table drop operation.
-  *@param tableName is the name of the table to drop.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performDrop(String tableName, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    performModification("DROP TABLE "+tableName,null,invalidateKeys);
-  }
-
-  /** Create user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void createUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    if (isRemote)
-    {
-      // Create a connection using the admin credentials
-      Database masterDatabase = new DBInterfaceHSQLDB(context,"PUBLIC",adminUserName,adminPassword);
-      ArrayList params = new ArrayList();
-      // First, look for user
-      params.add(userName);
-      IResultSet userResult = masterDatabase.executeQuery("SELECT * FROM INFORMATION_SCHEMA.SYSTEM_USERS WHERE USER_NAME=?",params,
-        null,null,null,true,-1,null,null);
-      if (userResult.getRowCount() == 0)
-      {
-        // Create the user
-	masterDatabase.executeQuery("CREATE USER "+quoteString(userName)+" PASSWORD "+quoteString(password),null,
-          null,invalidateKeys,null,false,0,null,null);
-      }
-      
-      // Now, look for schema
-      params.clear();
-      params.add(databaseName.toUpperCase(Locale.ROOT));
-      IResultSet schemaResult = masterDatabase.executeQuery("SELECT * FROM INFORMATION_SCHEMA.SYSTEM_SCHEMAS WHERE TABLE_SCHEM=?",params,
-        null,null,null,true,-1,null,null);
-      if (schemaResult.getRowCount() == 0)
-      {
-        // Create the schema
-	masterDatabase.executeQuery("CREATE SCHEMA "+databaseName.toUpperCase(Locale.ROOT)+" AUTHORIZATION "+quoteString(userName),null,
-          null,invalidateKeys,null,false,0,null,null);
-      }
-    }
-    else
-    {
-      try
-      {
-        // Force a load of the appropriate JDBC driver
-        Class.forName(_driver).newInstance();
-        DriverManager.getConnection(_localUrl+databaseName,userName,password).close();
-      }
-      catch (Exception e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      performModification("SET DATABASE TRANSACTION CONTROL MVCC",null,null);
-      performModification("SET FILES SCALE 512",null,null);
-    }
-  }
-
-  private static String quoteString(String password)
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("\"");
-    int i = 0;
-    while (i < password.length())
-    {
-      char x = password.charAt(i);
-      if (x == '\"')
-        sb.append("\"");
-      sb.append(x);
-      i++;
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-
-  /** Drop user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void dropUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    if (isRemote)
-    {
-      // Drop the schema, then the user
-      Database masterDatabase = new DBInterfaceHSQLDB(context,"PUBLIC",adminUserName,adminPassword);
-      try
-      {
-        // Drop schema
-        masterDatabase.executeQuery("DROP SCHEMA "+databaseName,null,null,invalidateKeys,null,false,0,null,null);
-        // Drop user
-        masterDatabase.executeQuery("DROP USER "+quoteString(userName),null,null,invalidateKeys,null,false,0,null,null);
-      }
-      catch (ManifoldCFException e)
-      {
-        throw reinterpretException(e);
-      }
-    }
-    else
-    {
-      File f = new File(databaseName + ".properties");
-      if (f.exists())
-      {
-        // Try to guarantee that all connections are discarded before we shut the database down.  Otherwise we get pool warnings from bitstream.
-        ConnectionFactory.releaseAll();
-        // Make sure database is shut down.
-        closeDatabase();
-        // Now, it's OK to delete
-        singleDelete(f);
-        singleDelete(new File(databaseName + ".data"));
-        singleDelete(new File(databaseName + ".lck"));
-        singleDelete(new File(databaseName + ".log"));
-        singleDelete(new File(databaseName + ".script"));
-        recursiveDelete(new File(databaseName + ".tmp"));
-      }
-    }
-  }
-  
-  protected static void recursiveDelete(File f)
-  {
-    if (f.exists())
-    {
-      File[] files = f.listFiles();
-      if (files != null)
-      {
-        int i = 0;
-        while (i < files.length)
-        {
-          File newf = files[i++];
-          if (newf.isDirectory())
-            recursiveDelete(newf);
-          else
-            singleDelete(newf);
-        }
-      }
-      if (!f.delete())
-        System.out.println("Failed to delete directory "+f.toString());
-    }
-  }
-
-  protected static void singleDelete(File f)
-  {
-    if (f.exists() && !f.delete())
-      System.out.println("Failed to delete file "+f.toString());
-  }
-  
-  /** Reinterpret an exception tossed by the database layer.  We need to disambiguate the various kinds of exception that
-  * should be thrown.
-  *@param theException is the exception to reinterpret
-  *@return the reinterpreted exception to throw.
-  */
-  protected ManifoldCFException reinterpretException(ManifoldCFException theException)
-  {
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Reinterpreting exception '"+theException.getMessage()+"'.  The exception type is "+Integer.toString(theException.getErrorCode()));
-    if (theException.getErrorCode() != ManifoldCFException.DATABASE_CONNECTION_ERROR)
-      return theException;
-    Throwable e = theException.getCause();
-    if (!(e instanceof java.sql.SQLException))
-      return theException;
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Exception "+theException.getMessage()+" is possibly a transaction abort signal");
-    java.sql.SQLException sqlException = (java.sql.SQLException)e;
-    String message = sqlException.getMessage();
-    String sqlState = sqlException.getSQLState();
-    // Could not serialize
-    if (sqlState != null && sqlState.equals("40001"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    // Deadlock detected
-    if (sqlState != null && sqlState.equals("40P01"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    // Note well: We also have to treat 'duplicate key' as a transaction abort, since this is what you get when two threads attempt to
-    // insert the same row.  (Everything only works, then, as long as there is a unique constraint corresponding to every bad insert that
-    // one could make.)
-    if (sqlState != null && sqlState.equals("23505"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Exception "+theException.getMessage()+" is NOT a transaction abort signal");
-    return theException;
-  }
-
-  /** Perform a general database modification query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param invalidateKeys are the cache keys to invalidate.
-  */
-  public void performModification(String query, List params, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeQuery(query,params,null,invalidateKeys,null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Get a table's schema.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of column names and ColumnDescription objects, describing the schema, or null if the
-  * table doesn't exist.
-  */
-  public Map<String,ColumnDescription> getTableSchema(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    StringBuilder query = new StringBuilder();
-    List list = new ArrayList();
-    list.add(schemaNameForQueries.toUpperCase(Locale.ROOT));
-    list.add(tableName.toUpperCase(Locale.ROOT));
-    query.append("SELECT column_name, is_nullable, data_type, character_maximum_length ")
-      .append("FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema=? AND table_name=?");
-    IResultSet set = performQuery(query.toString(),list,cacheKeys,queryClass);
-    if (set.getRowCount() == 0)
-      return null;
-
-    query = new StringBuilder();
-    query.append("SELECT column_name ")
-      .append("FROM INFORMATION_SCHEMA.SYSTEM_PRIMARYKEYS WHERE table_schem=? AND table_name=?");
-    IResultSet primarySet = performQuery(query.toString(),list,cacheKeys,queryClass);
-    String primaryKey = null;
-    if (primarySet.getRowCount() != 0)
-      primaryKey = ((String)primarySet.getRow(0).getValue("column_name")).toLowerCase(Locale.ROOT);
-    if (primaryKey == null)
-      primaryKey = "";
-    
-    // Digest the result
-    Map<String,ColumnDescription> rval = new HashMap<String,ColumnDescription>();
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String fieldName = ((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
-      String type = (String)row.getValue("data_type");
-      Long width = (Long)row.getValue("character_maximum_length");
-      String isNullable = (String)row.getValue("is_nullable");
-      boolean isPrimaryKey = primaryKey.equals(fieldName);
-      boolean isNull = isNullable.equals("YES");
-      String dataType;
-      if (type.equals("CHARACTER VARYING"))
-        dataType = "VARCHAR("+width.toString()+")";
-      else if (type.equals("CLOB"))
-        dataType = "LONGVARCHAR";
-      else
-        dataType = type;
-      rval.put(fieldName,new ColumnDescription(type,isPrimaryKey,isNull,null,null,false));
-    }
-
-    return rval;
-  }
-
-  /** Get a table's indexes.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of index names and IndexDescription objects, describing the indexes.
-  */
-  public Map<String,IndexDescription> getTableIndexes(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    Map<String,IndexDescription> rval = new HashMap<String,IndexDescription>();
-
-    String query = "SELECT index_name,column_name,non_unique,ordinal_position FROM INFORMATION_SCHEMA.SYSTEM_INDEXINFO "+
-      "WHERE table_schem=? AND TABLE_NAME=? ORDER BY index_name,ordinal_position ASC";
-    List list = new ArrayList();
-    list.add(schemaNameForQueries.toUpperCase(Locale.ROOT));
-    list.add(tableName.toUpperCase(Locale.ROOT));
-    IResultSet result = performQuery(query,list,cacheKeys,queryClass);
-    String lastIndexName = null;
-    List<String> indexColumns = null;
-    boolean isUnique = false;
-    int i = 0;
-    while (i < result.getRowCount())
-    {
-      IResultRow row = result.getRow(i++);
-      String indexName = ((String)row.getValue("index_name")).toLowerCase(Locale.ROOT);
-      String columnName = ((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
-      String nonUnique = row.getValue("non_unique").toString();
-      
-      if (lastIndexName != null && !lastIndexName.equals(indexName))
-      {
-        addIndex(rval,lastIndexName,isUnique,indexColumns);
-        lastIndexName = null;
-        indexColumns = null;
-        isUnique = false;
-      }
-      
-      if (lastIndexName == null)
-      {
-        lastIndexName = indexName;
-        indexColumns = new ArrayList<String>();
-        isUnique = false;
-      }
-      indexColumns.add(columnName);
-      isUnique = nonUnique.equals("false");
-    }
-    
-    if (lastIndexName != null)
-      addIndex(rval,lastIndexName,isUnique,indexColumns);
-    
-    return rval;
-  }
-
-  protected void addIndex(Map rval, String indexName, boolean isUnique, List<String> indexColumns)
-  {
-    if (indexName.indexOf("sys_idx") != -1)
-      return;
-    String[] columnNames = new String[indexColumns.size()];
-    int i = 0;
-    while (i < columnNames.length)
-    {
-      columnNames[i] = indexColumns.get(i);
-      i++;
-    }
-    rval.put(indexName,new IndexDescription(isUnique,columnNames));
-  }
-  
-  /** Get a database's tables.
-  *@param cacheKeys are the cache keys for the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return the set of tables.
-  */
-  public StringSet getAllTables(StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(schemaNameForQueries.toUpperCase(Locale.ROOT));
-    IResultSet set = performQuery("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=?",list,cacheKeys,queryClass);
-    StringSetBuffer ssb = new StringSetBuffer();
-    String columnName = "table_name";
-
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String value = row.getValue(columnName).toString();
-      ssb.add(value);
-    }
-    return new StringSet(ssb);
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@return a resultset.
-  */
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param resultSpec is a result specification, or null for the standard treatment.
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Construct ORDER-BY clause meant for reading from an index.
-  * Supply the field names belonging to the index, in order.
-  * Also supply a corresponding boolean array, where TRUE means "ASC", and FALSE
-  * means "DESC".
-  *@param fieldNames are the names of the fields in the index that is to be used.
-  *@param direction is a boolean describing the sorting order of the first term.
-  *@return a query chunk, including "ORDER BY" text, which is appropriate for
-  * at least ordering by the FIRST column supplied.
-  */
-  public String constructIndexOrderByClause(String[] fieldNames, boolean direction)
-  {
-    if (fieldNames.length == 0)
-      return "";
-    StringBuilder sb = new StringBuilder("ORDER BY ");
-    for (int i = 0; i < fieldNames.length; i++)
-    {
-      if (i > 0)
-        sb.append(", ");
-      sb.append(fieldNames[i]);
-      if (direction)
-        sb.append(" ASC");
-      else
-        sb.append(" DESC");
-    }
-    return sb.toString();
-  }
-  
-  /** Construct a cast to a double value.
-  * On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact
-  * specified).
-  *@param value is the value to be cast.
-  *@return the query chunk needed.
-  */
-  public String constructDoubleCastClause(String value)
-  {
-    return "CAST("+value+" AS DOUBLE PRECISION)";
-  }
-
-  /** Construct a count clause.
-  * On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so
-  * CAST(COUNT(col) AS BIGINT) will be emitted instead.
-  *@param column is the column string to be counted.
-  *@return the query chunk needed.
-  */
-  public String constructCountClause(String column)
-  {
-    return "CAST(COUNT("+column+") AS bigint)";
-  }
-
-  /** Construct a regular-expression match clause.
-  * This method builds both the text part of a regular-expression match.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true of the regular expression match is to be case insensitive.
-  *@return the query chunk needed, not padded with spaces on either side.
-  */
-  public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    return "REGEXP_MATCHES(CAST("+column+" AS VARCHAR(4096)),"+regularExpression+")";
-  }
-
-  /** Construct a regular-expression substring clause.
-  * This method builds an expression that extracts a specified string section from a field, based on
-  * a regular expression.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true if the regular expression match is to be case insensitive.
-  *@return the expression chunk needed, not padded with spaces on either side.
-  */
-  public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    return "REGEXP_SUBSTRING(CAST("+column+" AS VARCHAR(4096)),"+regularExpression+")";
-  }
-
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@param afterOrderBy is true if this offset/limit comes after an ORDER BY.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  public String constructOffsetLimitClause(int offset, int limit, boolean afterOrderBy)
-  {
-    StringBuilder sb = new StringBuilder();
-    if (offset != 0)
-      sb.append("OFFSET ").append(Integer.toString(offset));
-    if (limit != -1)
-    {
-      if (offset != 0)
-        sb.append(" ");
-      sb.append("LIMIT ").append(Integer.toString(limit));
-      if (afterOrderBy)
-        // Hint to HSQLDB to use the order-by index
-        sb.append(" USING INDEX");
-    }
-    return sb.toString();
-  }
-
-  /** Construct a 'distinct on (x)' filter.
-  * This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature.
-  * Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final
-  * result.
-  *@param outputParameters is a blank list into which to put parameters.  Null may be used if the baseParameters parameter is null.
-  *@param baseQuery is the base query, which is another SELECT statement, without parens,
-  * e.g. "SELECT ..."
-  *@param baseParameters are the parameters corresponding to the baseQuery.
-  *@param distinctFields are the fields to consider to be distinct.  These should all be keys in otherFields below.
-  *@param orderFields are the otherfield keys that determine the ordering.
-  *@param orderFieldsAscending are true for orderFields that are ordered as ASC, false for DESC.  
-  *@param otherFields are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"
-  *@return a revised query that performs the necessary DISTINCT ON operation.  The list outputParameters will also be appropriately filled in.
-  */
-  public String constructDistinctOnClause(List outputParameters, String baseQuery, List baseParameters,
-    String[] distinctFields, String[] orderFields, boolean[] orderFieldsAscending, Map<String,String> otherFields)
-  {
-    // For HSQLDB, we want to generate the following:
-    // WITH ct01 ( ... otherfields ... ) AS ( ... baseQuery ... )
-    //   SELECT * FROM (SELECT DISTINCT ... distinctFields ... FROM ct01) AS ct02,
-    //   LATERAL ( SELECT ... otherfields ... FROM ct01 WHERE ... distinctFields = ct02.distinctField ... ORDER BY ... order by ... LIMIT 1) AS ct03
-    //
-    
-    // Copy arguments
-    if (baseParameters != null)
-      outputParameters.addAll(baseParameters);
-
-    StringBuilder sb = new StringBuilder("WITH txxx1 (");
-    boolean needComma = false;
-    Iterator<String> iter = otherFields.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String fieldName = iter.next();
-      if (needComma)
-        sb.append(",");
-      sb.append(fieldName);
-      needComma = true;
-    }
-    sb.append(") AS (SELECT ");
-    needComma = false;
-    iter = otherFields.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String fieldName = iter.next();
-      String columnValue = otherFields.get(fieldName);
-      if (needComma)
-        sb.append(",");
-      needComma = true;
-      sb.append("txxx2.").append(columnValue).append(" AS ").append(fieldName);
-    }
-    sb.append(" FROM (").append(baseQuery).append(") txxx2)");
-    sb.append(" SELECT * FROM (SELECT DISTINCT ");
-    Map<String,String> distinctMap = new HashMap<String,String>();
-    int i = 0;
-    while (i < distinctFields.length)
-    {
-      String distinctField = distinctFields[i];
-      if (i > 0)
-        sb.append(",");
-      sb.append(distinctField);
-      distinctMap.put(distinctField,distinctField);
-      i++;
-    }
-    sb.append(" FROM txxx1) AS txxx3, LATERAL (SELECT ");
-    iter = otherFields.keySet().iterator();
-    needComma = false;
-    while (iter.hasNext())
-    {
-      String fieldName = iter.next();
-      if (distinctMap.get(fieldName) == null)
-      {
-        if (needComma)
-          sb.append(",");
-        needComma = true;
-        sb.append(fieldName);
-      }
-    }
-    sb.append(" FROM txxx1 WHERE ");
-    i = 0;
-    while (i < distinctFields.length)
-    {
-      String distinctField = distinctFields[i];
-      if (i > 0)
-        sb.append(" AND ");
-      sb.append(distinctField).append("=txxx3.").append(distinctField);
-      i++;
-    }
-    if (distinctFields.length > 0 || orderFields.length > 0)
-    {
-      sb.append(" ORDER BY ");
-      int k = 0;
-      i = 0;
-      while (i < distinctFields.length)
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append(distinctFields[i]).append(" ASC");
-        k++;
-        i++;
-      }
-      i = 0;
-      while (i < orderFields.length)
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append(orderFields[i]).append(" ");
-        if (orderFieldsAscending[i])
-          sb.append("ASC");
-        else
-          sb.append("DESC");
-        i++;
-        k++;
-      }
-    }
-    sb.append(" LIMIT 1) AS txxx4");
-    return sb.toString();
-  }
-
-  /* Calculate the number of values a particular clause can have, given the values for all the other clauses.
-  * For example, if in the expression x AND y AND z, x has 2 values and z has 1, find out how many values x can legally have
-  * when using the buildConjunctionClause() method below.
-  */
-  @Override
-  public int findConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions)
-  {
-    // Special handling when there's only 1
-    if (otherClauseDescriptions.length == 0)
-      return super.findConjunctionClauseMax(otherClauseDescriptions);
-
-    // Since it's an OR clause we have to generate, figure out how many clauses are generated by the others,
-    // and work back from there.
-    int number = 1;
-    for (int i = 0 ; i < otherClauseDescriptions.length ; i++)
-    {
-      ClauseDescription otherClause = otherClauseDescriptions[i];
-      List values = otherClause.getValues();
-      if (values != null)
-        number *= values.size();
-    }
-    int rval = getMaxOrClause() / number;
-    if (rval == 0)
-      rval = 1;
-    return rval;
-  }
-  
-  /* Construct a conjunction clause, e.g. x AND y AND z, where there is expected to be an index (x,y,z,...), and where x, y, or z
-  * can have multiple distinct values, The proper implementation of this method differs from database to database, because some databases
-  * only permit index operations when there are OR's between clauses, such as x1 AND y1 AND z1 OR x2 AND y2 AND z2 ..., where others
-  * only recognize index operations when there are lists specified for each, such as x IN (x1,x2) AND y IN (y1,y2) AND z IN (z1,z2).
-  */
-  @Override
-  public String buildConjunctionClause(List outputParameters, ClauseDescription[] clauseDescriptions)
-  {
-    // Special handling when there's only 1
-    if (clauseDescriptions.length == 1)
-      return super.buildConjunctionClause(outputParameters,clauseDescriptions);
-    
-    StringBuilder sb = new StringBuilder("(");
-    int[] counters = new int[clauseDescriptions.length];
-    for (int i = 0 ; i < counters.length ; i++)
-    {
-      counters[i] = 0;
-    }
-    
-    boolean isFirst = true;
-    while (true)
-    {
-      // Add this clause in
-      if (isFirst)
-        isFirst = false;
-      else
-        sb.append(" OR ");
-      for (int i = 0 ; i < counters.length ; i++)
-      {
-        ClauseDescription cd = clauseDescriptions[i];
-        if (i > 0)
-          sb.append(" AND ");
-        List values = cd.getValues();
-        String joinColumn = cd.getJoinColumnName();
-        sb.append(cd.getColumnName()).append(cd.getOperation());
-        if (values != null)
-        {
-          sb.append("?");
-          outputParameters.add(values.get(counters[i]));
-        }
-        else if (joinColumn != null)
-          sb.append(joinColumn);
-      }
-    
-      // Now, increment the counters
-      int j = 0;
-      while (true)
-      {
-        if (j == counters.length)
-        {
-          sb.append(")");
-          return sb.toString();
-        }
-        counters[j]++;
-        ClauseDescription cd = clauseDescriptions[j];
-        List values = cd.getValues();
-        int size = 1;
-        if (values != null)
-          size = values.size();
-        if (counters[j] < size)
-          break;
-        j++;
-        for (int k = 0 ; k < j ; k++)
-        {
-          counters[k] = 0;
-        }
-        // Loop around to carry a one to the j'th counter
-      }
-    }
-  }
-
-  /** Obtain the maximum number of individual items that should be
-  * present in an IN clause.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of IN clause members.
-  */
-  public int getMaxInClause()
-  {
-    return 100;
-  }
-
-  /** Obtain the maximum number of individual clauses that should be
-  * present in a sequence of OR clauses.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of OR clause members.
-  */
-  public int getMaxOrClause()
-  {
-    return 25;
-  }
-
-  /** For windowed report queries, e.g. maxActivity or maxBandwidth, obtain the maximum number of rows
-  * that can reasonably be expected to complete in an acceptable time.
-  *@return the maximum number of rows.
-  */
-  public int getWindowedReportMaxRows()
-  {
-    return 1000;
-  }
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  */
-  public void beginTransaction()
-    throws ManifoldCFException
-  {
-    beginTransaction(TRANSACTION_ENCLOSING);
-  }
-
-  protected int depthCount = 0;
-  protected boolean inTransaction = false;
-  protected int desiredTransactionType = Connection.TRANSACTION_READ_COMMITTED;
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  *@param transactionType is the kind of transaction desired.
-  */
-  public void beginTransaction(int transactionType)
-    throws ManifoldCFException
-  {
-    if (getCurrentTransactionType() == TRANSACTION_SERIALIZED)
-    {
-      serializableDepth++;
-      return;
-    }
-
-    if (transactionType == TRANSACTION_ENCLOSING)
-    {
-      transactionType = getCurrentTransactionType();
-    }
-
-    switch (transactionType)
-    {
-    case TRANSACTION_READCOMMITTED:
-      desiredTransactionType = Connection.TRANSACTION_READ_COMMITTED;
-      super.beginTransaction(TRANSACTION_READCOMMITTED);
-      break;
-    case TRANSACTION_SERIALIZED:
-      desiredTransactionType = Connection.TRANSACTION_SERIALIZABLE;
-      super.beginTransaction(TRANSACTION_SERIALIZED);
-      break;
-    default:
-      throw new ManifoldCFException("Bad transaction type: "+Integer.toString(transactionType));
-    }
-  }
-
-  /** Signal that a rollback should occur on the next endTransaction().
-  */
-  public void signalRollback()
-  {
-    if (serializableDepth == 0)
-      super.signalRollback();
-  }
-
-  /** End a database transaction, either performing a commit or a rollback (depending on whether
-  * signalRollback() was called within the transaction).
-  */
-  public void endTransaction()
-    throws ManifoldCFException
-  {
-    if (serializableDepth > 0)
-    {
-      serializableDepth--;
-      return;
-    }
-
-    super.endTransaction();
-  }
-
-
-  /** Abstract method to start a transaction */
-  protected void startATransaction()
-    throws ManifoldCFException
-  {
-    if (!inTransaction)
-    {
-      try
-      {
-        connection.getConnection().setAutoCommit(false);
-        connection.getConnection().setTransactionIsolation(desiredTransactionType);
-      }
-      catch (java.sql.SQLException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-      }
-      inTransaction = true;
-    }
-    depthCount++;
-  }
-
-  /** Abstract method to commit a transaction */
-  protected void commitCurrentTransaction()
-    throws ManifoldCFException
-  {
-    if (inTransaction)
-    {
-      if (depthCount == 1)
-      {
-        try
-        {
-          if (connection != null)
-          {
-            connection.getConnection().commit();
-            connection.getConnection().setAutoCommit(true);
-          }
-        }
-        catch (java.sql.SQLException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-        }
-        inTransaction = false;
-      }
-      depthCount--;
-    }
-    else
-      throw new ManifoldCFException("Transaction nesting error!");
-  }
-  
-  /** Abstract method to roll back a transaction */
-  protected void rollbackCurrentTransaction()
-    throws ManifoldCFException
-  {
-    if (inTransaction)
-    {
-      if (depthCount == 1)
-      {
-        try
-        {
-          if (connection != null)
-          {
-            connection.getConnection().rollback();
-            connection.getConnection().setAutoCommit(true);
-          }
-        }
-        catch (java.sql.SQLException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-        }
-        inTransaction = false;
-      }
-      depthCount--;
-    }
-    else
-      throw new ManifoldCFException("Transaction nesting error!");
-  }
-
-  /** Abstract method for explaining a query */
-  protected void explainQuery(String query, List params)
-    throws ManifoldCFException
-  {
-    IResultSet x = executeUncachedQuery("EXPLAIN PLAN FOR "+query,null,true,
-      -1,null,null);
-    int k = 0;
-    while (k < x.getRowCount())
-    {
-      IResultRow row = x.getRow(k++);
-      Iterator<String> iter = row.getColumns();
-      String colName = (String)iter.next();
-      Logging.db.warn(" Plan: "+row.getValue(colName).toString());
-    }
-    Logging.db.warn("");
-  }
-
-  /** Abstract method for mapping a column name from resultset */
-  @Override
-  protected String mapLabelName(String rawLabelName)
-  {
-    return rawLabelName.toLowerCase(Locale.ROOT);
-  }
-
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMariaDB.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMariaDB.java
deleted file mode 100644
index 18c3228..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMariaDB.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-public class DBInterfaceMariaDB extends DBInterfaceMySQL
-{
-  private static final String _driver = "org.mariadb.jdbc.Driver";
-
-  public DBInterfaceMariaDB(IThreadContext tc, String databaseName, String userName, String password) 
-    throws ManifoldCFException
-  {
-    super(tc,_driver,databaseName,userName,password);
-  }
-
-  @Override
-  protected String getJdbcDriverClass()
-  {
-    return _driver;
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java
deleted file mode 100644
index 8dadea6..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java
+++ /dev/null
@@ -1,1424 +0,0 @@
-/* $Id: DBInterfaceMySQL.java 999670 2010-09-21 22:18:19Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import java.util.*;
-import java.sql.Connection;
-
-public class DBInterfaceMySQL extends Database implements IDBInterface
-{
-  public static final String _rcsid = "@(#)$Id: DBInterfaceMySQL.java 999670 2010-09-21 22:18:19Z kwright $";
-
-  /** MySQL server property */
-  public static final String mysqlServerProperty = "org.apache.manifoldcf.mysql.server";
-  /** Source system name or IP */
-  public static final String mysqlClientProperty = "org.apache.manifoldcf.mysql.client";
-  /** MySQL ssl property */
-  public static final String mysqlSslProperty = "org.apache.manifoldcf.mysql.ssl";
-
-  private static final String _driver = "com.mysql.jdbc.Driver";
-
-  /** A lock manager handle. */
-  protected ILockManager lockManager;
-
-  // Once we enter the serializable realm, STOP any additional transactions from doing anything at all.
-  protected int serializableDepth = 0;
-
-  // This is where we keep track of tables that we need to analyze on transaction exit
-  protected List<String> tablesToAnalyze = new ArrayList<String>();
-
-  // This is where we keep temporary table statistics, which accumulate until they reach a threshold, and then are added into shared memory.
-  
-  /** Accumulated analyze statistics.  This map is keyed by the table name, and contains TableStatistics values. */
-  protected static Map<String,TableStatistics> currentAnalyzeStatistics = new HashMap<String,TableStatistics>();
-  /** Table analyze thresholds, as read from configuration information.  Keyed by table name, contains Integer values. */
-  protected static Map<String,Integer> analyzeThresholds = new HashMap<String,Integer>();
-  
-  /** The number of inserts, deletes, etc. before we update the shared area. */
-  protected static final int commitThreshold = 100;
-
-  // Lock and shared datum name prefixes (to be combined with table names)
-  protected static final String statslockAnalyzePrefix = "statslock-analyze-";
-  protected static final String statsAnalyzePrefix = "stats-analyze-";
-
-  protected String cacheKey;
-
-  public DBInterfaceMySQL(IThreadContext tc, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    this(tc,_driver,databaseName,userName,password);
-  }
-
-  protected DBInterfaceMySQL(IThreadContext tc, String jdbcDriverClass, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    super(tc,getJdbcUrl(tc,databaseName),jdbcDriverClass,databaseName,userName,password);
-    cacheKey = CacheKeyFactory.makeDatabaseKey(this.databaseName);
-    lockManager = LockManagerFactory.make(tc);
-  }
-
-  private static String getJdbcUrl(IThreadContext tc, String theDatabaseName)
-    throws ManifoldCFException
-  {
-    String server =  LockManagerFactory.getProperty(tc,mysqlServerProperty);
-    final String ssl = LockManagerFactory.getProperty(tc,mysqlSslProperty);
-
-    if (server == null || server.length() == 0)
-      server = "localhost";
-    
-    String jdbcUrl = "jdbc:mysql://"+server+"/"+theDatabaseName+"?useUnicode=true&characterEncoding=utf8"; 
-    
-    if (Boolean.parseBoolean(ssl)) {
-      jdbcUrl += "&useSSL=true&requireSSL=true";
-    }
-    
-    return jdbcUrl;
-  }
-
-  protected String getJdbcDriverClass()
-  {
-    return _driver;
-  }
-
-  /** This method must clean up after a execute query thread has been forcibly interrupted.
-  * It has been separated because some JDBC drivers don't handle forcible interrupts
-  * appropriately.
-  */
-  @Override
-  protected void interruptCleanup(Connection connection)
-  {
-    // Do nothing in the case of MySQL.
-  }
-
-  /** Reinterpret an exception tossed by the database layer.  We need to disambiguate the various kinds of exception that
-  * should be thrown.
-  *@param theException is the exception to reinterpret
-  *@return the reinterpreted exception to throw.
-  */
-  protected ManifoldCFException reinterpretException(ManifoldCFException theException)
-  {
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Reinterpreting exception '"+theException.getMessage()+"'.  The exception type is "+Integer.toString(theException.getErrorCode()));
-    if (theException.getErrorCode() != ManifoldCFException.DATABASE_CONNECTION_ERROR)
-      return theException;
-    Throwable e = theException.getCause();
-    if (!(e instanceof java.sql.SQLException))
-      return theException;
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Exception "+theException.getMessage()+" is possibly a transaction abort signal");
-    java.sql.SQLException sqlException = (java.sql.SQLException)e;
-    String message = sqlException.getMessage();
-    String sqlState = sqlException.getSQLState();
-    // Constraint violation
-    if (sqlState != null && sqlState.equals("23000"))
-    {
-      //new Exception(message).printStackTrace();
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    }
-    // Could not serialize
-    if (sqlState != null && sqlState.equals("40001"))
-    {
-      //new Exception(message).printStackTrace();
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    }
-    // Deadlock detected
-    if (sqlState != null && sqlState.equals("40P01"))
-    {
-      //new Exception(message).printStackTrace();
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    }
-    // Transaction timeout
-    if (sqlState != null && sqlState.equals("HY000"))
-    {
-      //new Exception(message).printStackTrace();
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    }
-    // Lock timeout
-    if (sqlState != null && sqlState.equals("41000"))
-    {
-      //new Exception(message).printStackTrace();
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    }
-    // Note well: We also have to treat 'duplicate key' as a transaction abort, since this is what you get when two threads attempt to
-    // insert the same row.  (Everything only works, then, as long as there is a unique constraint corresponding to every bad insert that
-    // one could make.)
-    if (sqlState != null && sqlState.equals("23505"))
-    {
-      //new Exception(message).printStackTrace();
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    }
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Exception "+theException.getMessage()+" is NOT a transaction abort signal");
-    return theException;
-  }
-
-  /** Abstract method for mapping a column lookup name from resultset */
-  @Override
-  protected String mapLookupName(String rawColumnName, String rawLabelName)
-  {
-    return rawLabelName;
-  }
-
-  /** Initialize.  This method is called once per JVM instance, in order to set up
-  * database communication.
-  */
-  @Override
-  public void openDatabase()
-    throws ManifoldCFException
-  {
-    // Nothing to do.
-  }
-  
-  /** Uninitialize.  This method is called during JVM shutdown, in order to close
-  * all database communication.
-  */
-  @Override
-  public void closeDatabase()
-    throws ManifoldCFException
-  {
-    // Nothing to do.
-  }
-
-  /** Get the database general cache key.
-  *@return the general cache key for the database.
-  */
-  @Override
-  public String getDatabaseCacheKey()
-  {
-    return cacheKey;
-  }
-
-  /** Perform an insert operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be
-  * invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  */
-  @Override
-  public void performInsert(String tableName, Map<String,Object> parameterMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    List paramArray = new ArrayList();
-
-    StringBuilder bf = new StringBuilder();
-    bf.append("INSERT INTO ");
-    bf.append(tableName);
-    bf.append(" (") ;
-
-    StringBuilder values = new StringBuilder(" VALUES (");
-
-    // loop for cols
-    Iterator<Map.Entry<String,Object>> it = parameterMap.entrySet().iterator();
-    boolean first = true;
-    while (it.hasNext())
-    {
-      Map.Entry<String,Object> e = it.next();
-      String key = e.getKey();
-
-      Object o = e.getValue();
-      if (o != null)
-      {
-        paramArray.add(o);
-
-        if (!first)
-        {
-          bf.append(',');
-          values.append(',');
-        }
-        bf.append(key);
-        values.append('?');
-
-        first = false;
-      }
-    }
-
-    bf.append(')');
-    values.append(')');
-    bf.append(values);
-
-    // Do the modification
-    performModification(bf.toString(),paramArray,invalidateKeys);
-  }
-
-
-  /** Perform an update operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  @Override
-  public void performUpdate(String tableName, Map<String,Object> parameterMap, String whereClause,
-    List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    List paramArray = new ArrayList();
-
-    StringBuilder bf = new StringBuilder();
-    bf.append("UPDATE ");
-    bf.append(tableName);
-    bf.append(" SET ") ;
-
-    // loop for parameters
-    Iterator<Map.Entry<String,Object>> it = parameterMap.entrySet().iterator();
-    boolean first = true;
-    while (it.hasNext())
-    {
-      Map.Entry<String,Object> e = it.next();
-      String key = e.getKey();
-
-      Object o = e.getValue();
-
-      if (!first)
-      {
-        bf.append(',');
-      }
-      bf.append(key);
-      bf.append('=');
-      if (o == null)
-      {
-        bf.append("NULL");
-      }
-      else
-      {
-        bf.append('?');
-        paramArray.add(o);
-      }
-
-      first = false;
-    }
-
-    if (whereClause != null)
-    {
-      bf.append(' ');
-      bf.append(whereClause);
-      if (whereParameters != null)
-      {
-        for (int i = 0; i < whereParameters.size(); i++)
-        {
-          Object value = whereParameters.get(i);
-          paramArray.add(value);
-        }
-      }
-    }
-
-    // Do the modification
-    performModification(bf.toString(),paramArray,invalidateKeys);
-
-  }
-
-
-  /** Perform a delete operation.
-  *@param tableName is the name of the table to delete from.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  @Override
-  public void performDelete(String tableName, String whereClause, List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    StringBuilder bf = new StringBuilder();
-    bf.append("DELETE FROM ");
-    bf.append(tableName);
-    if (whereClause != null)
-    {
-      bf.append(' ');
-      bf.append(whereClause);
-    }
-    else
-      whereParameters = null;
-
-    // Do the modification
-    performModification(bf.toString(),whereParameters,invalidateKeys);
-
-  }
-
-  /** Perform a table creation operation.
-  *@param tableName is the name of the table to create.
-  *@param columnMap is the map describing the columns and types.  NOTE that these are abstract
-  * types, which will be mapped to the proper types for the actual database inside this
-  * layer.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void performCreate(String tableName, Map<String,ColumnDescription> columnMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    StringBuilder queryBuffer = new StringBuilder("CREATE TABLE ");
-    queryBuffer.append(tableName);
-    queryBuffer.append('(');
-    Iterator<String> iter = columnMap.keySet().iterator();
-    boolean first = true;
-    while (iter.hasNext())
-    {
-      String columnName = iter.next();
-      ColumnDescription cd = columnMap.get(columnName);
-      if (!first)
-        queryBuffer.append(',');
-      else
-        first = false;
-      appendDescription(queryBuffer,columnName,cd,false,true);
-    }
-    queryBuffer.append(')');
-    performModification(queryBuffer.toString(),null,invalidateKeys);
-  }
-
-  protected static void appendDescription(StringBuilder queryBuffer, String columnName, ColumnDescription cd, boolean forceNull, boolean includeRestrict)
-  {
-    queryBuffer.append(columnName);
-    queryBuffer.append(' ');
-    queryBuffer.append(mapType(cd.getTypeString()));
-    if (forceNull || cd.getIsNull())
-      queryBuffer.append(" NULL");
-    else
-      queryBuffer.append(" NOT NULL");
-    if (cd.getIsPrimaryKey())
-      queryBuffer.append(" PRIMARY KEY");
-    if (cd.getReferenceTable() != null && includeRestrict)
-    {
-      queryBuffer.append(" REFERENCES ");
-      queryBuffer.append(cd.getReferenceTable());
-      queryBuffer.append('(');
-      queryBuffer.append(cd.getReferenceColumn());
-      queryBuffer.append(") ON DELETE");
-      if (cd.getReferenceCascade())
-        queryBuffer.append(" CASCADE");
-      else
-        queryBuffer.append(" RESTRICT");
-    }
-  }
-
-  /** Map a standard type into a derby type.
-  *@param inputType is the input type.
-  *@return the output type.
-  */
-  protected static String mapType(String inputType)
-  {
-    if (inputType.equalsIgnoreCase("float"))
-      return "DOUBLE";
-    if (inputType.equalsIgnoreCase("blob"))
-      return "LONGBLOB";
-    return inputType;
-  }
-
-  /** Perform a table alter operation.
-  *@param tableName is the name of the table to alter.
-  *@param columnMap is the map describing the columns and types to add.  These
-  * are in the same form as for performCreate.
-  *@param columnModifyMap is the map describing the columns to be changed.  The key is the
-  * existing column name, and the value is the new type of the column.  Data will be copied from
-  * the old column to the new.
-  *@param columnDeleteList is the list of column names to delete.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void performAlter(String tableName, Map<String,ColumnDescription> columnMap,
-    Map<String,ColumnDescription> columnModifyMap, List<String> columnDeleteList,
-    StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    beginTransaction(TRANSACTION_ENCLOSING);
-    try
-    {
-      if (columnDeleteList != null)
-      {
-        int i = 0;
-        while (i < columnDeleteList.size())
-        {
-          String columnName = columnDeleteList.get(i++);
-          performModification("ALTER TABLE "+tableName+" DROP "+columnName,null,invalidateKeys);
-        }
-      }
-
-      // Do the modifies.  This involves renaming each column to a temp column, then creating a new one, then copying
-      if (columnModifyMap != null)
-      {
-        Iterator<String> iter = columnModifyMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String columnName = iter.next();
-          ColumnDescription cd = columnModifyMap.get(columnName);
-          StringBuilder sb = new StringBuilder();
-          appendDescription(sb,columnName,cd,false,false);
-          performModification("ALTER TABLE "+tableName+" CHANGE "+columnName+" "+sb.toString(),null,invalidateKeys);
-        }
-      }
-
-      // Now, do the adds
-      if (columnMap != null)
-      {
-        Iterator<String> iter = columnMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String columnName = iter.next();
-          ColumnDescription cd = columnMap.get(columnName);
-          StringBuilder sb = new StringBuilder();
-          appendDescription(sb,columnName,cd,false,true);
-          performModification("ALTER TABLE "+tableName+" ADD "+sb.toString(),null,invalidateKeys);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param unique is a boolean that if true describes a unique index.
-  *@param columnList is the list of columns that need to be included
-  * in the index, in order.
-  */
-  @Override
-  public void addTableIndex(String tableName, boolean unique, List<String> columnList)
-    throws ManifoldCFException
-  {
-    String[] columns = new String[columnList.size()];
-    int i = 0;
-    while (i < columns.length)
-    {
-      columns[i] = columnList.get(i);
-      i++;
-    }
-    performAddIndex(null,tableName,new IndexDescription(unique,columns));
-  }
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param indexName is the optional name of the table index.  If null, a name will be chosen automatically.
-  *@param description is the index description.
-  */
-  @Override
-  public void performAddIndex(String indexName, String tableName, IndexDescription description)
-    throws ManifoldCFException
-  {
-    String[] columnNames = description.getColumnNames();
-    if (columnNames.length == 0)
-      return;
-
-    if (indexName == null)
-      // Build an index name
-      indexName = "I"+IDFactory.make(context);
-    StringBuilder queryBuffer = new StringBuilder("CREATE ");
-    if (description.getIsUnique())
-      queryBuffer.append("UNIQUE ");
-    queryBuffer.append("INDEX ");
-    queryBuffer.append(indexName);
-    queryBuffer.append(" ON ");
-    queryBuffer.append(tableName);
-    queryBuffer.append(" (");
-    int i = 0;
-    while (i < columnNames.length)
-    {
-      String colName = columnNames[i];
-      if (i > 0)
-        queryBuffer.append(',');
-      queryBuffer.append(colName);
-      i++;
-    }
-    queryBuffer.append(')');
-
-    performModification(queryBuffer.toString(),null,null);
-  }
-
-  /** Remove an index.
-  *@param indexName is the name of the index to remove.
-  *@param tableName is the table the index belongs to.
-  */
-  @Override
-  public void performRemoveIndex(String indexName, String tableName)
-    throws ManifoldCFException
-  {
-    performModification("DROP INDEX "+indexName+" ON "+tableName,null,null);
-  }
-
-  /** Read a datum, presuming zero if the datum does not exist.
-  */
-  protected int readDatum(String datumName)
-    throws ManifoldCFException
-  {
-    byte[] bytes = lockManager.readData(datumName);
-    if (bytes == null)
-      return 0;
-    return (((int)bytes[0]) & 0xff) + ((((int)bytes[1]) & 0xff) << 8) + ((((int)bytes[2]) & 0xff) << 16) + ((((int)bytes[3]) & 0xff) << 24);
-  }
-
-  /** Write a datum, presuming zero if the datum does not exist.
-  */
-  protected void writeDatum(String datumName, int value)
-    throws ManifoldCFException
-  {
-    byte[] bytes = new byte[4];
-    bytes[0] = (byte)(value & 0xff);
-    bytes[1] = (byte)((value >> 8) & 0xff);
-    bytes[2] = (byte)((value >> 16) & 0xff);
-    bytes[3] = (byte)((value >> 24) & 0xff);
-    
-    lockManager.writeData(datumName,bytes);
-  }
-
-  /** Analyze a table.
-  *@param tableName is the name of the table to analyze/calculate statistics for.
-  */
-  @Override
-  public void analyzeTable(String tableName)
-    throws ManifoldCFException
-  {
-    String tableStatisticsLock = statslockAnalyzePrefix+tableName;
-    lockManager.enterWriteCriticalSection(tableStatisticsLock);
-    try
-    {
-      TableStatistics ts = currentAnalyzeStatistics.get(tableName);
-      // Lock this table's statistics files
-      lockManager.enterWriteLock(tableStatisticsLock);
-      try
-      {
-        String eventDatum = statsAnalyzePrefix+tableName;
-        // Time to reindex this table!
-        analyzeTableInternal(tableName);
-        // Now, clear out the data
-        writeDatum(eventDatum,0);
-        if (ts != null)
-          ts.reset();
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(tableStatisticsLock);
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(tableStatisticsLock);
-    }
-  }
-
-  /** Reindex a table.
-  *@param tableName is the name of the table to rebuild indexes for.
-  */
-  @Override
-  public void reindexTable(String tableName)
-    throws ManifoldCFException
-  {
-    // Does nothing
-  }
-
-  protected void analyzeTableInternal(String tableName)
-    throws ManifoldCFException
-  {
-    if (getTransactionID() == null)
-      performModification("ANALYZE TABLE "+tableName,null,null);
-    else
-      tablesToAnalyze.add(tableName);
-  }
-
-  /** Perform a table drop operation.
-  *@param tableName is the name of the table to drop.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void performDrop(String tableName, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    performModification("DROP TABLE "+tableName,null,invalidateKeys);
-  }
-
-  /** Create user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void createUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    // Get the client property
-    String client =  lockManager.getSharedConfiguration().getProperty(mysqlClientProperty);
-    if (client == null || client.length() == 0)
-      client = "localhost";
-
-    // Connect to super database
-
-    Database masterDatabase = new DBInterfaceMySQL(context,getJdbcDriverClass(),"mysql",adminUserName,adminPassword);
-    try
-    {
-      List list = new ArrayList();
-      try
-      {
-        list.add("utf8");
-        list.add("utf8_bin");
-        masterDatabase.executeQuery("CREATE DATABASE "+databaseName+" CHARACTER SET ? COLLATE ?",list,
-          null,invalidateKeys,null,false,0,null,null);
-      } catch (ManifoldCFException e){
-        if (e.getErrorCode() != 4)
-          throw new ManifoldCFException(e.getMessage());
-      }
-      if (userName != null)
-      {
-        try {
-          list.clear();
-          list.add(userName);
-          list.add(client);
-          list.add(password);
-          masterDatabase.executeQuery("GRANT ALL ON "+databaseName+".* TO ?@? IDENTIFIED BY ?",list,
-            null,invalidateKeys,null,false,0,null,null);
-        } catch (ManifoldCFException e){
-          if (e.getErrorCode() != 4)
-            throw new ManifoldCFException(e.getMessage());
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-
-  }
-
-  /** Drop user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void dropUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    // Connect to super database
-    Database masterDatabase = new DBInterfaceMySQL(context,getJdbcDriverClass(),"mysql",adminUserName,adminPassword);
-    try
-    {
-      masterDatabase.executeQuery("DROP DATABASE "+databaseName,null,null,invalidateKeys,null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general database modification query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param invalidateKeys are the cache keys to invalidate.
-  */
-  @Override
-  public void performModification(String query, List params, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeQuery(query,params,null,invalidateKeys,null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Get a table's schema.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of column names and ColumnDescription objects, describing the schema.
-  */
-  @Override
-  public Map<String,ColumnDescription> getTableSchema(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    StringBuilder query = new StringBuilder();
-    List list = new ArrayList();
-    list.add(databaseName.toLowerCase(Locale.ROOT));
-    list.add(tableName.toLowerCase(Locale.ROOT));
-    query.append("SELECT column_name, is_nullable, data_type, character_maximum_length ")
-      .append("FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=?");
-    IResultSet set = performQuery(query.toString(),list,cacheKeys,queryClass);
-    if (set.getRowCount() == 0)
-      return null;
-
-    query = new StringBuilder();
-    query.append("SELECT t1.column_name ")
-      .append("FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE t1, INFORMATION_SCHEMA.TABLE_CONSTRAINTS t2 ")
-      .append("WHERE t1.CONSTRAINT_NAME=t2.CONSTRAINT_NAME AND t1.TABLE_NAME=t2.TABLE_NAME AND ")
-      .append("t1.TABLE_SCHEMA=t2.TABLE_SCHEMA AND ")
-      .append("t1.TABLE_SCHEMA=? AND t1.TABLE_NAME=? AND t2.CONSTRAINT_TYPE='PRIMARY KEY'");
-    IResultSet primarySet = performQuery(query.toString(),list,cacheKeys,queryClass);
-    String primaryKey = null;
-    if (primarySet.getRowCount() != 0)
-      primaryKey = ((String)primarySet.getRow(0).getValue("column_name")).toLowerCase(Locale.ROOT);
-    if (primaryKey == null)
-      primaryKey = "";
-    
-    // Digest the result
-    Map<String,ColumnDescription> rval = new HashMap<String,ColumnDescription>();
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String fieldName = ((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
-      String type = (String)row.getValue("data_type");
-      Long width = (Long)row.getValue("character_maximum_length");
-      String isNullable = (String)row.getValue("is_nullable");
-      boolean isPrimaryKey = primaryKey.equals(fieldName);
-      boolean isNull = isNullable.equals("YES");
-      String dataType;
-      if (type.equals("VARCHAR"))
-        dataType = "VARCHAR("+width.toString()+")";
-      else if (type.equals("CHAR"))
-        dataType = "CHAR("+width.toString()+")";
-      else if (type.equals("LONGBLOB"))
-        dataType = "BLOB";
-      else if (type.equals("DOUBLE PRECISION"))
-        dataType = "FLOAT";
-      else
-        dataType = type;
-      rval.put(fieldName,new ColumnDescription(type,isPrimaryKey,isNull,null,null,false));
-    }
-
-    return rval;
-  }
-
-  /** Get a table's indexes.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of index names and IndexDescription objects, describing the indexes.
-  */
-  @Override
-  public Map<String,IndexDescription> getTableIndexes(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    Map<String,IndexDescription> rval = new HashMap<String,IndexDescription>();
-
-    String query = "SELECT index_name,column_name,non_unique,seq_in_index FROM INFORMATION_SCHEMA.STATISTICS "+
-      "WHERE TABLE_SCHEMA=? AND TABLE_NAME=? ORDER BY index_name,seq_in_index ASC";
-    List list = new ArrayList();
-    list.add(databaseName.toLowerCase(Locale.ROOT));
-    list.add(tableName.toLowerCase(Locale.ROOT));
-    IResultSet result = performQuery(query,list,cacheKeys,queryClass);
-    String lastIndexName = null;
-    List<String> indexColumns = null;
-    boolean isUnique = false;
-    int i = 0;
-    while (i < result.getRowCount())
-    {
-      IResultRow row = result.getRow(i++);
-      String indexName = ((String)row.getValue("index_name")).toLowerCase(Locale.ROOT);
-      String columnName = ((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
-      String nonUnique = row.getValue("non_unique").toString();
-      
-      if (lastIndexName != null && !lastIndexName.equals(indexName))
-      {
-        addIndex(rval,lastIndexName,isUnique,indexColumns);
-        lastIndexName = null;
-        indexColumns = null;
-        isUnique = false;
-      }
-      
-      if (lastIndexName == null)
-      {
-        lastIndexName = indexName;
-        indexColumns = new ArrayList<String>();
-        isUnique = false;
-      }
-      indexColumns.add(columnName);
-      isUnique = nonUnique.equals("0");
-    }
-    
-    if (lastIndexName != null)
-      addIndex(rval,lastIndexName,isUnique,indexColumns);
-    
-    return rval;
-  }
-
-  protected void addIndex(Map rval, String indexName, boolean isUnique, List<String> indexColumns)
-  {
-    if (indexName.equals("primary"))
-      return;
-    String[] columnNames = new String[indexColumns.size()];
-    int i = 0;
-    while (i < columnNames.length)
-    {
-      columnNames[i] = indexColumns.get(i);
-      i++;
-    }
-    rval.put(indexName,new IndexDescription(isUnique,columnNames));
-  }
-
-  /** Get a database's tables.
-  *@param cacheKeys are the cache keys for the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return the set of tables.
-  */
-  @Override
-  public StringSet getAllTables(StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SHOW TABLES",null,cacheKeys,queryClass);
-    StringSetBuffer ssb = new StringSetBuffer();
-    String columnName = "Tables_in_"+databaseName.toLowerCase(Locale.ROOT);
-    // System.out.println(columnName);
-
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      // Iterator iter2 = row.getColumns();
-      // if (iter2.hasNext())
-      //      System.out.println("column = '"+(String)iter2.next()+"'");
-      String value = row.getValue(columnName).toString();
-      ssb.add(value);
-    }
-    return new StringSet(ssb);
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@return a resultset.
-  */
-  @Override
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  @Override
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param resultSpec is a result specification, or null for the standard treatment.
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  @Override
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Construct index hint clause.
-  * On most databases this returns an empty string, but on MySQL this returns
-  * a USE INDEX hint.  It requires the name of an index.
-  *@param tableName is the table the index is from.
-  *@param description is the description of an index, which is expected to exist.
-  *@return the query chunk that should go between the table names and the WHERE
-  * clause.
-  */
-  @Override
-  public String constructIndexHintClause(String tableName, IndexDescription description)
-    throws ManifoldCFException
-  {
-    // Figure out what index it is
-    Map indexes = getTableIndexes(tableName,null,null);
-    Iterator iter = indexes.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String indexName = (String)iter.next();
-      IndexDescription id = (IndexDescription)indexes.get(indexName);
-      if (id.equals(description))
-      {
-        return "FORCE INDEX ("+indexName+")";
-      }
-    }
-    throw new ManifoldCFException("Expected index description "+description+" not found");
-  }
-
-  /** Construct a cast to a double value.
-  * On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact
-  * specified).
-  *@param value is the value to be cast.
-  *@return the query chunk needed.
-  */
-  @Override
-  public String constructDoubleCastClause(String value)
-  {
-    return value;
-  }
-
-  /** Construct a count clause.
-  * On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so
-  * CAST(COUNT(col) AS BIGINT) will be emitted instead.
-  *@param column is the column string to be counted.
-  *@return the query chunk needed.
-  */
-  @Override
-  public String constructCountClause(String column)
-  {
-    return "COUNT("+column+")";
-  }
-
-  /** Construct a regular-expression match clause.
-  * This method builds both the text part of a regular-expression match.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true of the regular expression match is to be case insensitive.
-  *@return the query chunk needed, not padded with spaces on either side.
-  */
-  @Override
-  public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    // MHL - do what MySQL requires, whatever that is...
-    return column + " LIKE " + regularExpression;
-  }
-
-  /** Construct a regular-expression substring clause.
-  * This method builds an expression that extracts a specified string section from a field, based on
-  * a regular expression.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true if the regular expression match is to be case insensitive.
-  *@return the expression chunk needed, not padded with spaces on either side.
-  */
-  @Override
-  public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    // MHL for mysql
-    return regularExpression;
-  }
-
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@param afterOrderBy is true if this offset/limit comes after an ORDER BY.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  @Override
-  public String constructOffsetLimitClause(int offset, int limit, boolean afterOrderBy)
-  {
-    StringBuilder sb = new StringBuilder();
-    if (limit != -1)
-    {
-      sb.append("LIMIT ").append(Integer.toString(limit));
-    }
-    if (offset != 0)
-    {
-      if (limit != -1)
-        sb.append(" ");
-      sb.append("OFFSET ").append(Integer.toString(offset));
-    }
-    return sb.toString();
-  }
-
-  /** Construct a 'distinct on (x)' filter.
-  * This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature.
-  * Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final
-  * result.
-  *@param outputParameters is a blank list into which to put parameters.  Null may be used if the baseParameters parameter is null.
-  *@param baseQuery is the base query, which is another SELECT statement, without parens,
-  * e.g. "SELECT ..."
-  *@param baseParameters are the parameters corresponding to the baseQuery.
-  *@param distinctFields are the fields to consider to be distinct.  These should all be keys in otherFields below.
-  *@param orderFields are the otherfield keys that determine the ordering.
-  *@param orderFieldsAscending are true for orderFields that are ordered as ASC, false for DESC.  
-  *@param otherFields are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"
-  *@return a revised query that performs the necessary DISTINCT ON operation.  The list outputParameters will also be appropriately filled in.
-  */
-  @Override
-  public String constructDistinctOnClause(List outputParameters, String baseQuery, List baseParameters,
-    String[] distinctFields, String[] orderFields, boolean[] orderFieldsAscending, Map<String,String> otherFields)
-  {
-    // I don't know whether MySql supports this functionality or not.
-    // MHL
-    // Copy arguments
-    if (baseParameters != null)
-      outputParameters.addAll(baseParameters);
-
-    StringBuilder sb = new StringBuilder("SELECT ");
-    boolean needComma = false;
-    Iterator<String> iter = otherFields.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String fieldName = iter.next();
-      String columnValue = otherFields.get(fieldName);
-      if (needComma)
-        sb.append(",");
-      needComma = true;
-      sb.append("txxx1.").append(columnValue).append(" AS ").append(fieldName);
-    }
-    sb.append(" FROM (").append(baseQuery).append(") txxx1");
-    if (distinctFields.length > 0 || orderFields.length > 0)
-    {
-      sb.append(" ORDER BY ");
-      int k = 0;
-      int i = 0;
-      while (i < distinctFields.length)
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append(distinctFields[i]).append(" ASC");
-        k++;
-        i++;
-      }
-      i = 0;
-      while (i < orderFields.length)
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append(orderFields[i]).append(" ");
-        if (orderFieldsAscending[i])
-          sb.append("ASC");
-        else
-          sb.append("DESC");
-        i++;
-        k++;
-      }
-    }
-    return sb.toString();
-  }
-
-  /** Obtain the maximum number of individual items that should be
-  * present in an IN clause.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of IN clause members.
-  */
-  @Override
-  public int getMaxInClause()
-  {
-    return 100;
-  }
-
-  /** Obtain the maximum number of individual clauses that should be
-  * present in a sequence of OR clauses.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of OR clause members.
-  */
-  @Override
-  public int getMaxOrClause()
-  {
-    return 25;
-  }
-
-  /** For windowed report queries, e.g. maxActivity or maxBandwidth, obtain the maximum number of rows
-  * that can reasonably be expected to complete in an acceptable time.
-  *@return the maximum number of rows.
-  */
-  @Override
-  public int getWindowedReportMaxRows()
-  {
-    return 5000;
-  }
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  */
-  @Override
-  public void beginTransaction()
-    throws ManifoldCFException
-  {
-    beginTransaction(TRANSACTION_ENCLOSING);
-  }
-
-  protected int getActualTransactionType()
-  {
-    if (th == null)
-      return -1;
-    return th.getTransactionType();
-  }
-  
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  *@param transactionType is the kind of transaction desired.
-  */
-  @Override
-  public void beginTransaction(int transactionType)
-    throws ManifoldCFException
-  {
-    if (getCurrentTransactionType() == TRANSACTION_SERIALIZED)
-    {
-      serializableDepth++;
-      return;
-    }
-
-    if (transactionType == TRANSACTION_ENCLOSING)
-    {
-      transactionType = getCurrentTransactionType();
-    }
-
-    switch (transactionType)
-    {
-    case TRANSACTION_REPEATABLEREAD:
-      if (transactionType != getActualTransactionType())
-        // Must precede actual transaction start
-        performModification("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ",null,null);
-      super.beginTransaction(transactionType);
-      break;
-    case TRANSACTION_READCOMMITTED:
-      if (transactionType != getActualTransactionType())
-        // Must precede actual transaction start
-        performModification("SET TRANSACTION ISOLATION LEVEL READ COMMITTED",null,null);
-      super.beginTransaction(transactionType);
-      break;
-    case TRANSACTION_SERIALIZED:
-      if (transactionType != getActualTransactionType())
-        // Must precede actual transaction start
-        performModification("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE",null,null);
-      super.beginTransaction(TRANSACTION_SERIALIZED);
-      break;
-    default:
-      throw new ManifoldCFException("Bad transaction type: "+Integer.toString(transactionType));
-    }
-  }
-
-  /** Abstract method to start a transaction */
-  protected void startATransaction()
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeViaThread(connection.getConnection(),"START TRANSACTION",null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Abstract method to commit a transaction */
-  protected void commitCurrentTransaction()
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeViaThread(connection.getConnection(),"COMMIT",null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Signal that a rollback should occur on the next endTransaction().
-  */
-  @Override
-  public void signalRollback()
-  {
-    if (serializableDepth == 0)
-      super.signalRollback();
-  }
-
-  /** End a database transaction, either performing a commit or a rollback (depending on whether
-  * signalRollback() was called within the transaction).
-  */
-  @Override
-  public void endTransaction()
-    throws ManifoldCFException
-  {
-    if (serializableDepth > 0)
-    {
-      serializableDepth--;
-      return;
-    }
-    super.endTransaction();
-    if (getTransactionID() == null)
-    {
-      for (int i = 0; i < tablesToAnalyze.size(); i++)
-      {
-        analyzeTableInternal(tablesToAnalyze.get(i));
-      }
-      tablesToAnalyze.clear();
-    }
-  }
-
-  /** Abstract method to roll back a transaction */
-  protected void rollbackCurrentTransaction()
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeViaThread(connection.getConnection(),"ROLLBACK",null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-
-  }
-
-  /** Note a number of inserts, modifications, or deletions to a specific table.  This is so we can decide when to do appropriate maintenance.
-  *@param tableName is the name of the table being modified.
-  *@param insertCount is the number of inserts.
-  *@param modifyCount is the number of updates.
-  *@param deleteCount is the number of deletions.
-  */
-  @Override
-  protected void noteModificationsNoTransactions(String tableName, int insertCount, int modifyCount, int deleteCount)
-    throws ManifoldCFException
-  {
-    String tableStatisticsLock;
-    int eventCount;
-    
-    // Analysis.
-    // Here we count tuple addition.
-    eventCount = modifyCount + insertCount;
-    tableStatisticsLock = statslockAnalyzePrefix+tableName;
-    lockManager.enterWriteCriticalSection(tableStatisticsLock);
-    try
-    {
-      Integer threshold = analyzeThresholds.get(tableName);
-      int analyzeThreshold;
-      if (threshold == null)
-      {
-        // Look for this parameter; if we don't find it, use a default value.
-        analyzeThreshold = lockManager.getSharedConfiguration().getIntProperty("org.apache.manifoldcf.db.mysql.analyze."+tableName,10000);
-        analyzeThresholds.put(tableName,new Integer(analyzeThreshold));
-      }
-      else
-        analyzeThreshold = threshold.intValue();
-      
-      TableStatistics ts = currentAnalyzeStatistics.get(tableName);
-      if (ts == null)
-      {
-        ts = new TableStatistics();
-        currentAnalyzeStatistics.put(tableName,ts);
-      }
-      ts.add(eventCount);
-      // Check if we have passed threshold yet for this table, for committing the data to the shared area
-      if (ts.getEventCount() >= commitThreshold)
-      {
-        // Lock this table's statistics files
-        lockManager.enterWriteLock(tableStatisticsLock);
-        try
-        {
-          String eventDatum = statsAnalyzePrefix+tableName;
-          int oldEventCount = readDatum(eventDatum);
-          oldEventCount += ts.getEventCount();
-          if (oldEventCount >= analyzeThreshold)
-          {
-            // Time to reindex this table!
-            analyzeTableInternal(tableName);
-            // Now, clear out the data
-            writeDatum(eventDatum,0);
-          }
-          else
-            writeDatum(eventDatum,oldEventCount);
-          ts.reset();
-        }
-        finally
-        {
-          lockManager.leaveWriteLock(tableStatisticsLock);
-        }
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(tableStatisticsLock);
-    }
-
-  }
-
-  /** Table accumulation records.
-  */
-  protected static class TableStatistics
-  {
-    protected int eventCount = 0;
-    
-    public TableStatistics()
-    {
-    }
-    
-    public void reset()
-    {
-      eventCount = 0;
-    }
-    
-    public void add(int eventCount)
-    {
-      this.eventCount += eventCount;
-    }
-    
-    public int getEventCount()
-    {
-      return eventCount;
-    }
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfacePostgreSQL.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfacePostgreSQL.java
deleted file mode 100644
index 7612c9a..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfacePostgreSQL.java
+++ /dev/null
@@ -1,1630 +0,0 @@
-/* $Id: DBInterfacePostgreSQL.java 999670 2010-09-21 22:18:19Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.util.*;
-
-public class DBInterfacePostgreSQL extends Database implements IDBInterface
-{
-  public static final String _rcsid = "@(#)$Id: DBInterfacePostgreSQL.java 999670 2010-09-21 22:18:19Z kwright $";
-
-  /** PostgreSQL host name property */
-  public static final String postgresqlHostnameProperty = "org.apache.manifoldcf.postgresql.hostname";
-  /** PostgreSQL port property */
-  public static final String postgresqlPortProperty = "org.apache.manifoldcf.postgresql.port";
-  /** PostgreSQL ssl property */
-  public static final String postgresqlSslProperty = "org.apache.manifoldcf.postgresql.ssl";
-
-  private static final String _defaultUrl = "jdbc:postgresql://localhost/";
-  private static final String _driver = "org.postgresql.Driver";
-
-  /** A lock manager handle. */
-  protected final ILockManager lockManager;
-  
-  // Database cache key
-  protected final String cacheKey;
-	
-  // Postgresql serializable transactions are broken in that transactions that occur within them do not in fact work properly.
-  // So, once we enter the serializable realm, STOP any additional transactions from doing anything at all.
-  protected int serializableDepth = 0;
-
-  // This is where we keep track of tables that we need to analyze on transaction exit
-  protected List<String> tablesToAnalyze = new ArrayList<String>();
-
-  // Keep track of tables to reindex on transaction exit
-  protected List<String> tablesToReindex = new ArrayList<String>();
-
-  // This is where we keep temporary table statistics, which accumulate until they reach a threshold, and then are added into shared memory.
-  
-  /** Accumulated reindex statistics.  This map is keyed by the table name, and contains TableStatistics values. */
-  protected static Map<String,TableStatistics> currentReindexStatistics = new HashMap<String,TableStatistics>();
-  /** Table reindex thresholds, as read from configuration information.  Keyed by table name, contains Integer values. */
-  protected static Map<String,Integer> reindexThresholds = new HashMap<String,Integer>();
-  
-  /** Accumulated analyze statistics.  This map is keyed by the table name, and contains TableStatistics values. */
-  protected static Map<String,TableStatistics> currentAnalyzeStatistics = new HashMap<String,TableStatistics>();
-  /** Table analyze thresholds, as read from configuration information.  Keyed by table name, contains Integer values. */
-  protected static Map<String,Integer> analyzeThresholds = new HashMap<String,Integer>();
-  
-  /** The number of inserts, deletes, etc. before we update the shared area. */
-  protected static final int commitThreshold = 100;
-
-  // Lock and shared datum name prefixes (to be combined with table names)
-  protected static final String statslockReindexPrefix = "statslock-reindex-";
-  protected static final String statsReindexPrefix = "stats-reindex-";
-  protected static final String statslockAnalyzePrefix = "statslock-analyze-";
-  protected static final String statsAnalyzePrefix = "stats-analyze-";
-  
-
-  public DBInterfacePostgreSQL(IThreadContext tc, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    super(tc,getJdbcUrl(tc,databaseName),_driver,databaseName,userName,password);
-    cacheKey = CacheKeyFactory.makeDatabaseKey(this.databaseName);
-    lockManager = LockManagerFactory.make(tc);
-  }
-  
-  private static String getJdbcUrl(final IThreadContext tc, final String databaseName)
-    throws ManifoldCFException
-  {
-    String jdbcUrl = _defaultUrl + databaseName;
-    final String hostname = LockManagerFactory.getProperty(tc,postgresqlHostnameProperty);
-    final String ssl = LockManagerFactory.getProperty(tc,postgresqlSslProperty);
-    final String port = LockManagerFactory.getProperty(tc,postgresqlPortProperty);
-    if (hostname != null && hostname.length() > 0)
-    {
-      jdbcUrl = "jdbc:postgresql://" + hostname;
-      if (port != null && port.length() > 0)
-      {
-        jdbcUrl += ":" + port;
-      }
-      jdbcUrl += "/" + databaseName;
-      if (ssl != null && ssl.equals("true"))
-      {
-        jdbcUrl += "?ssl=true";
-      }
-    }
-    return jdbcUrl;
-  }
-
-  /** Initialize.  This method is called once per JVM instance, in order to set up
-  * database communication.
-  */
-  @Override
-  public void openDatabase()
-    throws ManifoldCFException
-  {
-    // Nothing to do
-  }
-  
-  /** Uninitialize.  This method is called during JVM shutdown, in order to close
-  * all database communication.
-  */
-  @Override
-  public void closeDatabase()
-    throws ManifoldCFException
-  {
-    // Nothing to do
-  }
-
-  /** Get the database general cache key.
-  *@return the general cache key for the database.
-  */
-  @Override
-  public String getDatabaseCacheKey()
-  {
-    return cacheKey;
-  }
-
-  /** Perform an insert operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be
-  * invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  */
-  @Override
-  public void performInsert(String tableName, Map<String,Object> parameterMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    List paramArray = new ArrayList();
-
-    StringBuilder bf = new StringBuilder();
-    bf.append("INSERT INTO ");
-    bf.append(tableName);
-    bf.append(" (") ;
-
-    StringBuilder values = new StringBuilder(" VALUES (");
-
-    // loop for cols
-    Iterator<Map.Entry<String,Object>> it = parameterMap.entrySet().iterator();
-    boolean first = true;
-    while (it.hasNext())
-    {
-      Map.Entry<String,Object> e = it.next();
-      String key = e.getKey();
-
-      Object o = e.getValue();
-      if (o != null)
-      {
-        paramArray.add(o);
-
-        if (!first)
-        {
-          bf.append(',');
-          values.append(',');
-        }
-        bf.append(key);
-        values.append('?');
-
-        first = false;
-      }
-    }
-
-    bf.append(')');
-    values.append(')');
-    bf.append(values);
-
-    // Do the modification
-    performModification(bf.toString(),paramArray,invalidateKeys);
-  }
-
-
-  /** Perform an update operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  @Override
-  public void performUpdate(String tableName, Map<String,Object> parameterMap, String whereClause,
-    List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    List paramArray = new ArrayList();
-
-    StringBuilder bf = new StringBuilder();
-    bf.append("UPDATE ");
-    bf.append(tableName);
-    bf.append(" SET ") ;
-
-    // loop for parameters
-    Iterator<Map.Entry<String,Object>> it = parameterMap.entrySet().iterator();
-    boolean first = true;
-    while (it.hasNext())
-    {
-      Map.Entry<String,Object> e = it.next();
-      String key = e.getKey();
-
-      Object o = e.getValue();
-
-      if (!first)
-      {
-        bf.append(',');
-      }
-      bf.append(key);
-      bf.append('=');
-      if (o == null)
-      {
-        bf.append("NULL");
-      }
-      else
-      {
-        bf.append('?');
-        paramArray.add(o);
-      }
-
-      first = false;
-    }
-
-    if (whereClause != null)
-    {
-      bf.append(' ');
-      bf.append(whereClause);
-      if (whereParameters != null)
-      {
-        for (int i = 0; i < whereParameters.size(); i++)
-        {
-          Object value = whereParameters.get(i);
-          paramArray.add(value);
-        }
-      }
-    }
-
-    // Do the modification
-    performModification(bf.toString(),paramArray,invalidateKeys);
-
-  }
-
-
-  /** Perform a delete operation.
-  *@param tableName is the name of the table to delete from.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  @Override
-  public void performDelete(String tableName, String whereClause, List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    StringBuilder bf = new StringBuilder();
-    bf.append("DELETE FROM ");
-    bf.append(tableName);
-    if (whereClause != null)
-    {
-      bf.append(' ');
-      bf.append(whereClause);
-    }
-    else
-      whereParameters = null;
-
-    // Do the modification
-    performModification(bf.toString(),whereParameters,invalidateKeys);
-
-  }
-
-  /** Perform a table creation operation.
-  *@param tableName is the name of the table to create.
-  *@param columnMap is the map describing the columns and types.  NOTE that these are abstract
-  * types, which will be mapped to the proper types for the actual database inside this
-  * layer.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void performCreate(String tableName, Map<String,ColumnDescription> columnMap, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    StringBuilder queryBuffer = new StringBuilder("CREATE TABLE ");
-    queryBuffer.append(tableName);
-    queryBuffer.append('(');
-    Iterator<String> iter = columnMap.keySet().iterator();
-    boolean first = true;
-    while (iter.hasNext())
-    {
-      String columnName = iter.next();
-      ColumnDescription cd = columnMap.get(columnName);
-      if (!first)
-        queryBuffer.append(',');
-      else
-        first = false;
-      appendDescription(queryBuffer,columnName,cd,false);
-    }
-    queryBuffer.append(')');
-
-    performModification(queryBuffer.toString(),null,invalidateKeys);
-
-  }
-
-  protected static void appendDescription(StringBuilder queryBuffer, String columnName, ColumnDescription cd, boolean forceNull)
-  {
-    queryBuffer.append(columnName);
-    queryBuffer.append(' ');
-    queryBuffer.append(mapType(cd.getTypeString()));
-    if (forceNull || cd.getIsNull())
-      queryBuffer.append(" NULL");
-    else
-      queryBuffer.append(" NOT NULL");
-    if (cd.getIsPrimaryKey())
-      queryBuffer.append(" PRIMARY KEY");
-    if (cd.getReferenceTable() != null)
-    {
-      queryBuffer.append(" REFERENCES ");
-      queryBuffer.append(cd.getReferenceTable());
-      queryBuffer.append('(');
-      queryBuffer.append(cd.getReferenceColumn());
-      queryBuffer.append(") ON DELETE");
-      if (cd.getReferenceCascade())
-        queryBuffer.append(" CASCADE");
-      else
-        queryBuffer.append(" RESTRICT");
-    }
-  }
-
-  /** Perform a table alter operation.
-  *@param tableName is the name of the table to alter.
-  *@param columnMap is the map describing the columns and types to add.  These
-  * are in the same form as for performCreate.
-  *@param columnModifyMap is the map describing the columns to be changed.  The key is the
-  * existing column name, and the value is the new type of the column.  Data will be copied from
-  * the old column to the new.
-  *@param columnDeleteList is the list of column names to delete.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void performAlter(String tableName, Map<String,ColumnDescription> columnMap,
-    Map<String,ColumnDescription> columnModifyMap, List<String> columnDeleteList,
-    StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    beginTransaction(TRANSACTION_ENCLOSING);
-    try
-    {
-      if (columnDeleteList != null)
-      {
-        int i = 0;
-        while (i < columnDeleteList.size())
-        {
-          String columnName = columnDeleteList.get(i++);
-          performModification("ALTER TABLE ONLY "+tableName+" DROP "+columnName,null,invalidateKeys);
-        }
-      }
-
-      // Do the modifies.  This involves renaming each column to a temp column, then creating a new one, then copying
-      if (columnModifyMap != null)
-      {
-        Iterator<String> iter = columnModifyMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String columnName = iter.next();
-          ColumnDescription cd = columnModifyMap.get(columnName);
-          String renameColumn = "__temp__";
-          // Rename current column
-          performModification("ALTER TABLE ONLY "+tableName+" RENAME "+columnName+" TO "+renameColumn,null,invalidateKeys);
-          // Create new column
-          StringBuilder sb = new StringBuilder();
-          appendDescription(sb,columnName,cd,true);
-          performModification("ALTER TABLE ONLY "+tableName+" ADD "+sb.toString(),null,invalidateKeys);
-          // Copy old data to new
-          performModification("UPDATE "+tableName+" SET "+columnName+"="+renameColumn,null,invalidateKeys);
-          // Make the column null, if it needs it
-          if (cd.getIsNull() == false)
-            performModification("ALTER TABLE ONLY "+tableName+" ALTER "+columnName+" SET NOT NULL",null,invalidateKeys);
-          // Drop old column
-          performModification("ALTER TABLE ONLY "+tableName+" DROP "+renameColumn,null,invalidateKeys);
-        }
-      }
-
-      // Now, do the adds
-      if (columnMap != null)
-      {
-        Iterator<String> iter = columnMap.keySet().iterator();
-        while (iter.hasNext())
-        {
-          String columnName = iter.next();
-          ColumnDescription cd = columnMap.get(columnName);
-          StringBuilder sb = new StringBuilder();
-          appendDescription(sb,columnName,cd,false);
-          performModification("ALTER TABLE ONLY "+tableName+" ADD "+sb.toString(),null,invalidateKeys);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-  }
-
-
-  /** Map a standard type into a postgresql type.
-  *@param inputType is the input type.
-  *@return the output type.
-  */
-  protected static String mapType(String inputType)
-  {
-    if (inputType.equalsIgnoreCase("longtext"))
-      return "text";
-    if (inputType.equalsIgnoreCase("blob"))
-      return "bytea";
-    return inputType;
-  }
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param unique is a boolean that if true describes a unique index.
-  *@param columnList is the list of columns that need to be included
-  * in the index, in order.
-  */
-  @Override
-  public void addTableIndex(String tableName, boolean unique, List<String> columnList)
-    throws ManifoldCFException
-  {
-    String[] columns = new String[columnList.size()];
-    int i = 0;
-    while (i < columns.length)
-    {
-      columns[i] = columnList.get(i);
-      i++;
-    }
-    performAddIndex(null,tableName,new IndexDescription(unique,columns));
-  }
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param indexName is the optional name of the table index.  If null, a name will be chosen automatically.
-  *@param description is the index description.
-  */
-  @Override
-  public void performAddIndex(String indexName, String tableName, IndexDescription description)
-    throws ManifoldCFException
-  {
-    String[] columnNames = description.getColumnNames();
-    if (columnNames.length == 0)
-      return;
-
-    if (indexName == null)
-      // Build an index name
-      indexName = "I"+IDFactory.make(context);
-    StringBuilder queryBuffer = new StringBuilder("CREATE ");
-    if (description.getIsUnique())
-      queryBuffer.append("UNIQUE ");
-    queryBuffer.append("INDEX ");
-    queryBuffer.append(indexName);
-    queryBuffer.append(" ON ");
-    queryBuffer.append(tableName);
-    queryBuffer.append(" (");
-    int i = 0;
-    while (i < columnNames.length)
-    {
-      String colName = columnNames[i];
-      if (i > 0)
-        queryBuffer.append(',');
-      queryBuffer.append(colName);
-      i++;
-    }
-    queryBuffer.append(')');
-
-    performModification(queryBuffer.toString(),null,null);
-  }
-
-  /** Remove an index.
-  *@param indexName is the name of the index to remove.
-  *@param tableName is the table the index belongs to.
-  */
-  @Override
-  public void performRemoveIndex(String indexName, String tableName)
-    throws ManifoldCFException
-  {
-    performModification("DROP INDEX "+indexName,null,null);
-  }
-
-
-  /** Perform a table drop operation.
-  *@param tableName is the name of the table to drop.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void performDrop(String tableName, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    performModification("DROP TABLE "+tableName,null,invalidateKeys);
-  }
-
-  /** Create user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void createUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    // Create a connection to the master database, using the credentials supplied
-    Database masterDatabase = new DBInterfacePostgreSQL(context,"template1",adminUserName,adminPassword);
-    try
-    {
-      // Create user
-      List params = new ArrayList();
-      params.add(userName);
-      IResultSet set = masterDatabase.executeQuery("SELECT * FROM pg_user WHERE usename=?",params,
-        null,null,null,true,-1,null,null);
-      if (set.getRowCount() == 0)
-      {
-        // We have to quote the password.  Due to a postgresql bug, parameters don't work for this field.
-        StringBuilder sb = new StringBuilder();
-        sb.append("'");
-        int i = 0;
-        while (i < password.length())
-        {
-          char x = password.charAt(i);
-          if (x == '\'')
-            sb.append("'");
-          sb.append(x);
-          i++;
-        }
-        sb.append("'");
-        String quotedPassword = sb.toString();
-	masterDatabase.executeQuery("CREATE USER "+userName+" PASSWORD "+quotedPassword,null,
-          null,invalidateKeys,null,false,0,null,null);
-      }
-      
-      // Create database
-      params.clear();
-      params.add(databaseName);
-      set = masterDatabase.executeQuery("SELECT * FROM pg_database WHERE datname=?",params,
-        null,null,null,true,-1,null,null);
-      if (set.getRowCount() == 0)
-      {
-        // Special for Postgresql
-        masterDatabase.prepareForDatabaseCreate();
-	masterDatabase.executeQuery("CREATE DATABASE "+databaseName+" OWNER "+
-	  userName+" ENCODING 'utf8'",null,null,invalidateKeys,null,false,0,null,null);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Drop user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  @Override
-  public void dropUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    // Create a connection to the master database, using the credentials supplied
-    Database masterDatabase = new DBInterfacePostgreSQL(context,"template1",adminUserName,adminPassword);
-    try
-    {
-      // Drop database
-      masterDatabase.executeQuery("DROP DATABASE "+databaseName,null,null,invalidateKeys,null,false,0,null,null);
-      // Drop user
-      masterDatabase.executeQuery("DROP USER "+userName,null,null,invalidateKeys,null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Reinterpret an exception tossed by the database layer.  We need to disambiguate the various kinds of exception that
-  * should be thrown.
-  *@param theException is the exception to reinterpret
-  *@return the reinterpreted exception to throw.
-  */
-  protected ManifoldCFException reinterpretException(ManifoldCFException theException)
-  {
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Reinterpreting exception '"+theException.getMessage()+"'.  The exception type is "+Integer.toString(theException.getErrorCode()));
-    if (theException.getErrorCode() != ManifoldCFException.DATABASE_CONNECTION_ERROR)
-      return theException;
-    Throwable e = theException.getCause();
-    if (!(e instanceof java.sql.SQLException))
-    {
-      //e.printStackTrace();
-      return theException;
-    }
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Exception "+theException.getMessage()+" is possibly a transaction abort signal");
-    java.sql.SQLException sqlException = (java.sql.SQLException)e;
-    String message = sqlException.getMessage();
-    String sqlState = sqlException.getSQLState();
-    // If connection is closed, presume we are shutting down
-    if (sqlState != null && sqlState.equals("08003"))
-      return new ManifoldCFException(message,e,ManifoldCFException.INTERRUPTED);
-    // Could not serialize
-    if (sqlState != null && sqlState.equals("40001"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    // Deadlock detected
-    if (sqlState != null && sqlState.equals("40P01"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    // Note well: We also have to treat 'duplicate key' as a transaction abort, since this is what you get when two threads attempt to
-    // insert the same row.  (Everything only works, then, as long as there is a unique constraint corresponding to every bad insert that
-    // one could make.)
-    if (sqlState != null && sqlState.equals("23505"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-    // New Postgresql behavior (9.3): sometimes we don't get an exception thrown, but the transaction is dead nonetheless.
-    if (sqlState != null && sqlState.equals("25P02"))
-      return new ManifoldCFException(message,e,ManifoldCFException.DATABASE_TRANSACTION_ABORT);
-      
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Exception "+theException.getMessage()+" is NOT a transaction abort signal");
-    //e.printStackTrace();
-    //System.err.println("sqlstate = "+sqlState);
-    return theException;
-  }
-
-  /** Perform a general database modification query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param invalidateKeys are the cache keys to invalidate.
-  */
-  @Override
-  public void performModification(String query, List params, StringSet invalidateKeys)
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeQuery(query,params,null,invalidateKeys,null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Get a table's schema.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of column names and ColumnDescription objects, describing the schema, or null if the
-  * table doesn't exist.
-  */
-  @Override
-  public Map<String,ColumnDescription> getTableSchema(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    StringBuilder query = new StringBuilder();
-    List list = new ArrayList();
-    query.append("SELECT pg_attribute.attname AS \"Field\",");
-    query.append("CASE pg_type.typname WHEN 'int2' THEN 'smallint' WHEN 'int4' THEN 'int'");
-    query.append(" WHEN 'int8' THEN 'bigint' WHEN 'varchar' THEN 'varchar(' || pg_attribute.atttypmod-4 || ')'");
-    query.append(" WHEN 'text' THEN 'longtext'");
-    query.append(" WHEN 'bpchar' THEN 'char(' || pg_attribute.atttypmod-4 || ')'");
-    query.append(" ELSE pg_type.typname END AS \"Type\",");
-    query.append("CASE WHEN pg_attribute.attnotnull THEN '' ELSE 'YES' END AS \"Null\",");
-    query.append("CASE pg_type.typname WHEN 'varchar' THEN substring(pg_attrdef.adsrc from '^(.*).*$') ELSE pg_attrdef.adsrc END AS Default ");
-    query.append("FROM pg_class INNER JOIN pg_attribute ON (pg_class.oid=pg_attribute.attrelid) INNER JOIN pg_type ON (pg_attribute.atttypid=pg_type.oid) ");
-    query.append("LEFT JOIN pg_attrdef ON (pg_class.oid=pg_attrdef.adrelid AND pg_attribute.attnum=pg_attrdef.adnum) ");
-    query.append("WHERE pg_class.relname=? AND pg_attribute.attnum>=1 AND NOT pg_attribute.attisdropped ");
-    query.append("ORDER BY pg_attribute.attnum");
-    list.add(tableName);
-
-    IResultSet set = performQuery(query.toString(),list,cacheKeys,queryClass);
-    if (set.getRowCount() == 0)
-      return null;
-    // Digest the result
-    Map<String,ColumnDescription> rval = new HashMap<String,ColumnDescription>();
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String fieldName = row.getValue("Field").toString();
-      String type = row.getValue("Type").toString();
-      boolean isNull = row.getValue("Null").toString().equals("YES");
-      boolean isPrimaryKey = false; // row.getValue("Key").toString().equals("PRI");
-      rval.put(fieldName,new ColumnDescription(type,isPrimaryKey,isNull,null,null,false));
-    }
-
-    return rval;
-  }
-
-  /** Get a table's indexes.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of index names and IndexDescription objects, describing the indexes.
-  */
-  @Override
-  public Map<String,IndexDescription> getTableIndexes(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    Map<String,IndexDescription> rval = new HashMap<String,IndexDescription>();
-
-    String query = "SELECT pg_catalog.pg_get_indexdef(i.indexrelid, 0, true) AS indexdef "+
-      "FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i "+
-      "WHERE c.relname = ? AND c.oid = i.indrelid AND i.indexrelid = c2.oid";
-    List list = new ArrayList();
-    list.add(tableName);
-    
-    IResultSet result = performQuery(query,list,cacheKeys,queryClass);
-    int i = 0;
-    while (i < result.getRowCount())
-    {
-      IResultRow row = result.getRow(i++);
-      String indexdef = (String)row.getValue("indexdef");
-
-      // Parse the command!
-      boolean isUnique;
-      int parsePosition = 0;
-      int beforeMatch = indexdef.indexOf("CREATE UNIQUE INDEX ",parsePosition);
-      if (beforeMatch == -1)
-      {
-        beforeMatch = indexdef.indexOf("CREATE INDEX ",parsePosition);
-        if (beforeMatch == -1)
-          throw new ManifoldCFException("Cannot parse index description: '"+indexdef+"'");
-        isUnique = false;
-        parsePosition += "CREATE INDEX ".length();
-      }
-      else
-      {
-        isUnique = true;
-        parsePosition += "CREATE UNIQUE INDEX ".length();
-      }
-
-      int afterMatch = indexdef.indexOf(" ON",parsePosition);
-      if (afterMatch == -1)
-        throw new ManifoldCFException("Cannot parse index description: '"+indexdef+"'");
-      String indexName = indexdef.substring(parsePosition,afterMatch);
-      parsePosition = afterMatch + " ON".length();
-      int parenPosition = indexdef.indexOf("(",parsePosition);
-      if (parenPosition == -1)
-        throw new ManifoldCFException("Cannot parse index description: '"+indexdef+"'");
-      parsePosition = parenPosition + 1;
-      List<String> columns = new ArrayList<String>();
-      while (true)
-      {
-        int nextIndex = indexdef.indexOf(",",parsePosition);
-        int nextParenIndex = indexdef.indexOf(")",parsePosition);
-        if (nextIndex == -1)
-          nextIndex = nextParenIndex;
-        if (nextIndex == -1)
-          throw new ManifoldCFException("Cannot parse index description: '"+indexdef+"'");
-        if (nextParenIndex != -1 && nextParenIndex < nextIndex)
-          nextIndex = nextParenIndex;
-
-        String columnName = indexdef.substring(parsePosition,nextIndex).trim();
-        columns.add(columnName);
-
-        if (nextIndex == nextParenIndex)
-          break;
-        parsePosition = nextIndex + 1;
-      }
-
-      String[] columnNames = new String[columns.size()];
-      int j = 0;
-      while (j < columnNames.length)
-      {
-        columnNames[j] = columns.get(j);
-        j++;
-      }
-      rval.put(indexName,new IndexDescription(isUnique,columnNames));
-    }
-
-    return rval;
-  }
-
-  /** Get a database's tables.
-  *@param cacheKeys are the cache keys for the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return the set of tables.
-  */
-  @Override
-  public StringSet getAllTables(StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SELECT relname FROM pg_class",null,cacheKeys,queryClass);
-    StringSetBuffer ssb = new StringSetBuffer();
-    String columnName = "relname";
-
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String value = row.getValue(columnName).toString();
-      ssb.add(value);
-    }
-    return new StringSet(ssb);
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@return a resultset.
-  */
-  @Override
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  @Override
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param resultSpec is a result specification, or null for the standard treatment.
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  @Override
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Construct a cast to a double value.
-  * On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact
-  * specified).
-  *@param value is the value to be cast.
-  *@return the query chunk needed.
-  */
-  @Override
-  public String constructDoubleCastClause(String value)
-  {
-    return "CAST("+value+" AS DOUBLE PRECISION)";
-  }
-
-  /** Construct a count clause.
-  * On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so
-  * CAST(COUNT(col) AS BIGINT) will be emitted instead.
-  *@param column is the column string to be counted.
-  *@return the query chunk needed.
-  */
-  @Override
-  public String constructCountClause(String column)
-  {
-    return "COUNT("+column+")";
-  }
-
-  /** Construct a regular-expression match clause.
-  * This method builds both the text part of a regular-expression match.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true of the regular expression match is to be case insensitive.
-  *@return the query chunk needed, not padded with spaces on either side.
-  */
-  @Override
-  public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    return column + "~" + (caseInsensitive?"*":"") + regularExpression;
-  }
-
-  /** Construct a regular-expression substring clause.
-  * This method builds an expression that extracts a specified string section from a field, based on
-  * a regular expression.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true if the regular expression match is to be case insensitive.
-  *@return the expression chunk needed, not padded with spaces on either side.
-  */
-  @Override
-  public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive)
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("SUBSTRING(");
-    if (caseInsensitive)
-      sb.append("LOWER(").append(column).append(")");
-    else
-      sb.append(column);
-    sb.append(" FROM ");
-    if (caseInsensitive)
-      sb.append("LOWER(").append(regularExpression).append(")");
-    else
-      sb.append(regularExpression);
-    sb.append(")");
-    return sb.toString();
-  }
-
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@param afterOrderBy is true if this offset/limit comes after an ORDER BY.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  @Override
-  public String constructOffsetLimitClause(int offset, int limit, boolean afterOrderBy)
-  {
-    StringBuilder sb = new StringBuilder();
-    if (offset != 0)
-      sb.append("OFFSET ").append(Integer.toString(offset));
-    if (limit != -1)
-    {
-      if (offset != 0)
-        sb.append(" ");
-      sb.append("LIMIT ").append(Integer.toString(limit));
-    }
-    return sb.toString();
-  }
-
-  /** Construct a 'distinct on (x)' filter.
-  * This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature.
-  * Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final
-  * result.
-  *@param outputParameters is a blank list into which to put parameters.  Null may be used if the baseParameters parameter is null.
-  *@param baseQuery is the base query, which is another SELECT statement, without parens,
-  * e.g. "SELECT ..."
-  *@param baseParameters are the parameters corresponding to the baseQuery.
-  *@param distinctFields are the fields to consider to be distinct.  These should all be keys in otherFields below.
-  *@param orderFields are the otherfield keys that determine the ordering.
-  *@param orderFieldsAscending are true for orderFields that are ordered as ASC, false for DESC.  
-  *@param otherFields are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"
-  *@return a revised query that performs the necessary DISTINCT ON operation.  The list outputParameters will also be appropriately filled in.
-  */
-  @Override
-  public String constructDistinctOnClause(List outputParameters, String baseQuery, List baseParameters,
-    String[] distinctFields, String[] orderFields, boolean[] orderFieldsAscending, Map<String,String> otherFields)
-  {
-    // Copy arguments
-    if (baseParameters != null)
-      outputParameters.addAll(baseParameters);
-
-    StringBuilder sb = new StringBuilder("SELECT DISTINCT ON(");
-    int i = 0;
-    while (i < distinctFields.length)
-    {
-      if (i > 0)
-        sb.append(",");
-      sb.append(distinctFields[i++]);
-    }
-    sb.append(") ");
-    Iterator<String> iter = otherFields.keySet().iterator();
-    boolean needComma = false;
-    while (iter.hasNext())
-    {
-      String fieldName = iter.next();
-      String columnValue = otherFields.get(fieldName);
-      if (needComma)
-        sb.append(",");
-      needComma = true;
-      sb.append("txxx1.").append(columnValue).append(" AS ").append(fieldName);
-    }
-    sb.append(" FROM (").append(baseQuery).append(") txxx1");
-    if (distinctFields.length > 0 || orderFields.length > 0)
-    {
-      sb.append(" ORDER BY ");
-      int k = 0;
-      i = 0;
-      while (i < distinctFields.length)
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append(distinctFields[i]).append(" ASC");
-        k++;
-        i++;
-      }
-      i = 0;
-      while (i < orderFields.length)
-      {
-        if (k > 0)
-          sb.append(",");
-        sb.append(orderFields[i]).append(" ");
-        if (orderFieldsAscending[i])
-          sb.append("ASC");
-        else
-          sb.append("DESC");
-        i++;
-        k++;
-      }
-    }
-    return sb.toString();
-  }
-
-  /** Obtain the maximum number of individual items that should be
-  * present in an IN clause.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of IN clause members.
-  */
-  @Override
-  public int getMaxInClause()
-  {
-    return 100;
-  }
-
-  /** Obtain the maximum number of individual clauses that should be
-  * present in a sequence of OR clauses.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of OR clause members.
-  */
-  @Override
-  public int getMaxOrClause()
-  {
-    return 25;
-  }
-
-  /* Calculate the number of values a particular clause can have, given the values for all the other clauses.
-  * For example, if in the expression x AND y AND z, x has 2 values and z has 1, find out how many values x can legally have
-  * when using the buildConjunctionClause() method below.
-  */
-  @Override
-  public int findConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions)
-  {
-    // This implementation uses "OR"
-    return getMaxOrClause();
-  }
-
-  /* Construct a conjunction clause, e.g. x AND y AND z, where there is expected to be an index (x,y,z,...), and where x, y, or z
-  * can have multiple distinct values, The proper implementation of this method differs from database to database, because some databases
-  * only permit index operations when there are OR's between clauses, such as x1 AND y1 AND z1 OR x2 AND y2 AND z2 ..., where others
-  * only recognize index operations when there are lists specified for each, such as x IN (x1,x2) AND y IN (y1,y2) AND z IN (z1,z2).
-  */
-  @Override
-  public String buildConjunctionClause(List outputParameters, ClauseDescription[] clauseDescriptions)
-  {
-    // This implementation uses "OR" instead of "IN ()" for multiple values, since this generates better plans in Postgresql 9.x.
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < clauseDescriptions.length ; i++)
-    {
-      ClauseDescription cd = clauseDescriptions[i];
-      if (i > 0)
-        sb.append(" AND ");
-      String columnName = cd.getColumnName();
-      List values = cd.getValues();
-      String operation = cd.getOperation();
-      String joinColumn = cd.getJoinColumnName();
-      if (values != null)
-      {
-        if (values.size() > 1)
-        {
-          sb.append(" (");
-          for (int j = 0 ; j < values.size() ; j++)
-          {
-            if (j > 0)
-              sb.append(" OR ");
-            sb.append(columnName).append(operation).append("?");
-            outputParameters.add(values.get(j));
-          }
-          sb.append(")");
-        }
-        else
-        {
-          sb.append(columnName).append(operation).append("?");
-          outputParameters.add(values.get(0));
-        }
-      }
-      else if (joinColumn != null)
-      {
-        sb.append(columnName).append(operation).append(joinColumn);
-      }
-      else
-        sb.append(columnName).append(operation);
-    }
-    return sb.toString();
-  }
-
-  /** For windowed report queries, e.g. maxActivity or maxBandwidth, obtain the maximum number of rows
-  * that can reasonably be expected to complete in an acceptable time.
-  *@return the maximum number of rows.
-  */
-  @Override
-  public int getWindowedReportMaxRows()
-  {
-    return 5000;
-  }
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  */
-  @Override
-  public void beginTransaction()
-    throws ManifoldCFException
-  {
-    beginTransaction(TRANSACTION_ENCLOSING);
-  }
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  *@param transactionType is the kind of transaction desired.
-  */
-  @Override
-  public void beginTransaction(int transactionType)
-    throws ManifoldCFException
-  {
-    if (getCurrentTransactionType() == TRANSACTION_SERIALIZED)
-    {
-      serializableDepth++;
-      return;
-    }
-
-    if (transactionType == TRANSACTION_ENCLOSING)
-    {
-      transactionType = getCurrentTransactionType();
-    }
-
-    switch (transactionType)
-    {
-    case TRANSACTION_READCOMMITTED:
-      super.beginTransaction(TRANSACTION_READCOMMITTED);
-      break;
-    case TRANSACTION_SERIALIZED:
-      super.beginTransaction(TRANSACTION_SERIALIZED);
-      try
-      {
-        performModification("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE",null,null);
-      }
-      catch (Error e)
-      {
-        super.signalRollback();
-        super.endTransaction();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        super.signalRollback();
-        super.endTransaction();
-        throw e;
-      }
-      break;
-    default:
-      throw new ManifoldCFException("Bad transaction type: "+Integer.toString(transactionType));
-    }
-  }
-
-  /** Signal that a rollback should occur on the next endTransaction().
-  */
-  @Override
-  public void signalRollback()
-  {
-    if (serializableDepth == 0)
-      super.signalRollback();
-  }
-
-  /** End a database transaction, either performing a commit or a rollback (depending on whether
-  * signalRollback() was called within the transaction).
-  */
-  @Override
-  public void endTransaction()
-    throws ManifoldCFException
-  {
-    if (serializableDepth > 0)
-    {
-      serializableDepth--;
-      return;
-    }
-
-    super.endTransaction();
-    if (getTransactionID() == null)
-    {
-      int i = 0;
-      while (i < tablesToAnalyze.size())
-      {
-        analyzeTableInternal(tablesToAnalyze.get(i++));
-      }
-      tablesToAnalyze.clear();
-      i = 0;
-      while (i < tablesToReindex.size())
-      {
-        reindexTableInternal(tablesToReindex.get(i++));
-      }
-      tablesToReindex.clear();
-    }
-  }
-
-  /** Abstract method to start a transaction */
-  @Override
-  protected void startATransaction()
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeViaThread((connection==null)?null:connection.getConnection(),"START TRANSACTION",null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-
-  /** Abstract method to commit a transaction */
-  @Override
-  protected void commitCurrentTransaction()
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeViaThread((connection==null)?null:connection.getConnection(),"COMMIT",null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-
-  }
-  
-  /** Abstract method to roll back a transaction */
-  @Override
-  protected void rollbackCurrentTransaction()
-    throws ManifoldCFException
-  {
-    try
-    {
-      executeViaThread((connection==null)?null:connection.getConnection(),"ROLLBACK",null,false,0,null,null);
-    }
-    catch (ManifoldCFException e)
-    {
-      throw reinterpretException(e);
-    }
-  }
-  
-  /** Abstract method for explaining a query */
-  @Override
-  protected void explainQuery(String query, List params)
-    throws ManifoldCFException
-  {
-    // We really can't retry at this level; it's not clear what the transaction nesting is etc.
-    // So if the EXPLAIN fails due to deadlock, we just give up.
-    IResultSet x;
-    String queryType = "EXPLAIN ";
-    if ("SELECT".equalsIgnoreCase(query.substring(0,6)))
-      queryType += "ANALYZE ";
-    x = executeUncachedQuery(queryType+query,params,true,
-      -1,null,null);
-    for (int k = 0; k < x.getRowCount(); k++)
-    {
-      IResultRow row = x.getRow(k);
-      Iterator<String> iter = row.getColumns();
-      String colName = (String)iter.next();
-      Logging.db.warn(" Plan: "+row.getValue(colName).toString());
-    }
-    Logging.db.warn("");
-
-    if (query.indexOf("jobqueue") != -1)
-    {
-      // Dump jobqueue stats
-      x = executeUncachedQuery("select n_distinct, most_common_vals, most_common_freqs from pg_stats where tablename='jobqueue' and attname='status'",null,true,-1,null,null);
-      for (int k = 0; k < x.getRowCount(); k++)
-      {
-        IResultRow row = x.getRow(k);
-        Logging.db.warn(" Stats: n_distinct="+row.getValue("n_distinct").toString()+" most_common_vals="+row.getValue("most_common_vals").toString()+" most_common_freqs="+row.getValue("most_common_freqs").toString());
-      }
-      Logging.db.warn("");
-    }
-  }
-
-  
-  /** Read a datum, presuming zero if the datum does not exist.
-  */
-  protected int readDatum(String datumName)
-    throws ManifoldCFException
-  {
-    byte[] bytes = lockManager.readData(datumName);
-    if (bytes == null)
-      return 0;
-    return (((int)bytes[0]) & 0xff) + ((((int)bytes[1]) & 0xff) << 8) + ((((int)bytes[2]) & 0xff) << 16) + ((((int)bytes[3]) & 0xff) << 24);
-  }
-
-  /** Write a datum, presuming zero if the datum does not exist.
-  */
-  protected void writeDatum(String datumName, int value)
-    throws ManifoldCFException
-  {
-    byte[] bytes = new byte[4];
-    bytes[0] = (byte)(value & 0xff);
-    bytes[1] = (byte)((value >> 8) & 0xff);
-    bytes[2] = (byte)((value >> 16) & 0xff);
-    bytes[3] = (byte)((value >> 24) & 0xff);
-    
-    lockManager.writeData(datumName,bytes);
-  }
-
-  /** Analyze a table.
-  *@param tableName is the name of the table to analyze/calculate statistics for.
-  */
-  public void analyzeTable(String tableName)
-    throws ManifoldCFException
-  {
-    String tableStatisticsLock = statslockAnalyzePrefix+tableName;
-    lockManager.enterWriteCriticalSection(tableStatisticsLock);
-    try
-    {
-      TableStatistics ts = currentAnalyzeStatistics.get(tableName);
-      // Lock this table's statistics files
-      lockManager.enterWriteLock(tableStatisticsLock);
-      try
-      {
-        String eventDatum = statsAnalyzePrefix+tableName;
-        // Time to reindex this table!
-        analyzeTableInternal(tableName);
-        // Now, clear out the data
-        writeDatum(eventDatum,0);
-        if (ts != null)
-          ts.reset();
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(tableStatisticsLock);
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(tableStatisticsLock);
-    }
-  }
-
-  /** Reindex a table.
-  *@param tableName is the name of the table to rebuild indexes for.
-  */
-  public void reindexTable(String tableName)
-    throws ManifoldCFException
-  {
-    String tableStatisticsLock;
-    
-    // Reindexing.
-    tableStatisticsLock = statslockReindexPrefix+tableName;
-    lockManager.enterWriteCriticalSection(tableStatisticsLock);
-    try
-    {
-      TableStatistics ts = currentReindexStatistics.get(tableName);
-      // Lock this table's statistics files
-      lockManager.enterWriteLock(tableStatisticsLock);
-      try
-      {
-        String eventDatum = statsReindexPrefix+tableName;
-        // Time to reindex this table!
-        reindexTableInternal(tableName);
-        // Now, clear out the data
-        writeDatum(eventDatum,0);
-        if (ts != null)
-          ts.reset();
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(tableStatisticsLock);
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(tableStatisticsLock);
-    }
-  }
-
-  protected void analyzeTableInternal(String tableName)
-    throws ManifoldCFException
-  {
-    if (getTransactionID() == null)
-      performModification("ANALYZE "+tableName,null,null);
-    else
-      tablesToAnalyze.add(tableName);
-  }
-
-  protected void reindexTableInternal(String tableName)
-    throws ManifoldCFException
-  {
-    if (getTransactionID() == null)
-    {
-      long sleepAmt = 0L;
-      while (true)
-      {
-        try
-        {
-          performModification("REINDEX TABLE "+tableName,null,null);
-          break;
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            sleepAmt = getSleepAmt();
-            continue;
-          }
-          throw e;
-        }
-        finally
-        {
-          sleepFor(sleepAmt);
-        }
-      }
-    }
-    else
-      tablesToReindex.add(tableName);
-  }
-
-  /** Note a number of inserts, modifications, or deletions to a specific table.  This is so we can decide when to do appropriate maintenance.
-  *@param tableName is the name of the table being modified.
-  *@param insertCount is the number of inserts.
-  *@param modifyCount is the number of updates.
-  *@param deleteCount is the number of deletions.
-  */
-  @Override
-  protected void noteModificationsNoTransactions(String tableName, int insertCount, int modifyCount, int deleteCount)
-    throws ManifoldCFException
-  {
-    String tableStatisticsLock;
-    int eventCount;
-    
-    // Reindexing.
-    // Here we count tuple deletion.  So we want to know the deletecount + modifycount.
-    eventCount = modifyCount + deleteCount;
-    tableStatisticsLock = statslockReindexPrefix+tableName;
-    lockManager.enterWriteCriticalSection(tableStatisticsLock);
-    try
-    {
-      Integer threshold = reindexThresholds.get(tableName);
-      int reindexThreshold;
-      if (threshold == null)
-      {
-        // Look for this parameter; if we don't find it, use a default value.
-        reindexThreshold = lockManager.getSharedConfiguration().getIntProperty("org.apache.manifoldcf.db.postgres.reindex."+tableName,250000);
-        reindexThresholds.put(tableName,new Integer(reindexThreshold));
-      }
-      else
-        reindexThreshold = threshold.intValue();
-      
-      TableStatistics ts = currentReindexStatistics.get(tableName);
-      if (ts == null)
-      {
-        ts = new TableStatistics();
-        currentReindexStatistics.put(tableName,ts);
-      }
-      ts.add(eventCount);
-      // Check if we have passed threshold yet for this table, for committing the data to the shared area
-      if (ts.getEventCount() >= commitThreshold)
-      {
-        // Lock this table's statistics files
-        lockManager.enterWriteLock(tableStatisticsLock);
-        try
-        {
-          String eventDatum = statsReindexPrefix+tableName;
-          int oldEventCount = readDatum(eventDatum);
-          oldEventCount += ts.getEventCount();
-          if (oldEventCount >= reindexThreshold)
-          {
-            // Time to reindex this table!
-            reindexTableInternal(tableName);
-            // Now, clear out the data
-            writeDatum(eventDatum,0);
-          }
-          else
-            writeDatum(eventDatum,oldEventCount);
-          ts.reset();
-        }
-        finally
-        {
-          lockManager.leaveWriteLock(tableStatisticsLock);
-        }
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(tableStatisticsLock);
-    }
-    
-    // Analysis.
-    // Here we count tuple addition.
-    eventCount = modifyCount + insertCount;
-    tableStatisticsLock = statslockAnalyzePrefix+tableName;
-    lockManager.enterWriteCriticalSection(tableStatisticsLock);
-    try
-    {
-      Integer threshold = analyzeThresholds.get(tableName);
-      int analyzeThreshold;
-      if (threshold == null)
-      {
-        // Look for this parameter; if we don't find it, use a default value.
-        analyzeThreshold = lockManager.getSharedConfiguration().getIntProperty("org.apache.manifoldcf.db.postgres.analyze."+tableName,2000);
-        analyzeThresholds.put(tableName,new Integer(analyzeThreshold));
-      }
-      else
-        analyzeThreshold = threshold.intValue();
-      
-      TableStatistics ts = currentAnalyzeStatistics.get(tableName);
-      if (ts == null)
-      {
-        ts = new TableStatistics();
-        currentAnalyzeStatistics.put(tableName,ts);
-      }
-      ts.add(eventCount);
-      // Check if we have passed threshold yet for this table, for committing the data to the shared area
-      if (ts.getEventCount() >= commitThreshold)
-      {
-        // Lock this table's statistics files
-        lockManager.enterWriteLock(tableStatisticsLock);
-        try
-        {
-          String eventDatum = statsAnalyzePrefix+tableName;
-          int oldEventCount = readDatum(eventDatum);
-          oldEventCount += ts.getEventCount();
-          if (oldEventCount >= analyzeThreshold)
-          {
-            // Time to reindex this table!
-            analyzeTableInternal(tableName);
-            // Now, clear out the data
-            writeDatum(eventDatum,0);
-          }
-          else
-            writeDatum(eventDatum,oldEventCount);
-          ts.reset();
-        }
-        finally
-        {
-          lockManager.leaveWriteLock(tableStatisticsLock);
-        }
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(tableStatisticsLock);
-    }
-
-  }
-  
-
-  /** Table accumulation records.
-  */
-  protected static class TableStatistics
-  {
-    protected int eventCount = 0;
-    
-    public TableStatistics()
-    {
-    }
-    
-    public void reset()
-    {
-      eventCount = 0;
-    }
-    
-    public void add(int eventCount)
-    {
-      this.eventCount += eventCount;
-    }
-    
-    public int getEventCount()
-    {
-      return eventCount;
-    }
-  }
-  
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java
deleted file mode 100644
index d73e631..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java
+++ /dev/null
@@ -1,1519 +0,0 @@
-/* $Id: Database.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.jdbcpool.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.util.*;
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-
-/** This class implements jskw.interfaces.IDatabase, and provides basic cached database services.
-* The actual cache keys are determined by layers above this.
-* It is expected that there is ONE of these objects per thread per database!  If there are more, then
-* the transaction management will get screwed up (i.e. nobody will know what happened to the connection
-* handles...)
-*/
-public abstract class Database
-{
-  public static final String _rcsid = "@(#)$Id: Database.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final ICacheManager cacheManager;
-  protected final IThreadContext context;
-  protected final String jdbcUrl;
-  protected final String jdbcDriverClass;
-  protected final String databaseName;
-  protected String userName;
-  protected String password;
-  protected TransactionHandle th = null;
-  protected WrappedConnection connection = null;
-  protected boolean doRollback = false;
-  protected boolean commitDone = false;
-  protected int delayedTransactionDepth = 0;
-  protected Map<String,Modifications> modificationsSet = new HashMap<String,Modifications>();
-
-  protected final long maxQueryTime;
-  protected final boolean debug;
-  protected final int maxDBConnections;
-  
-  protected static Random random = new Random();
-
-  protected final static String _TRANSACTION_ = "_TRANSACTION_";
-
-  public Database(IThreadContext context, String jdbcUrl, String jdbcDriverClass, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    this.context = context;
-    this.jdbcUrl = jdbcUrl;
-    this.jdbcDriverClass = jdbcDriverClass;
-    this.databaseName = databaseName;
-    this.userName = userName;
-    this.password = password;
-    
-    this.maxQueryTime = ((long)LockManagerFactory.getIntProperty(context, ManifoldCF.databaseQueryMaxTimeProperty,60)) * 1000L;
-    this.debug = LockManagerFactory.getBooleanProperty(context, ManifoldCF.databaseConnectionTrackingProperty, false);
-    this.maxDBConnections = LockManagerFactory.getIntProperty(context, ManifoldCF.databaseHandleMaxcountProperty, 50);
-
-    this.cacheManager = CacheManagerFactory.make(context);
-  }
-
-  /** Get the database name.  This is often used as a cache key qualifier.
-  *@return the database name.
-  */
-  public String getDatabaseName()
-  {
-    return databaseName;
-  }
-
-  /** Get the current transaction id.
-  *@return the current transaction identifier, or null if no transaction.
-  */
-  public String getTransactionID()
-  {
-    if (th == null)
-      return null;
-    return th.getTransactionID();
-  }
-
-  /** Abstract method to start a transaction */
-  protected void startATransaction()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Abstract method to commit a transaction */
-  protected void commitCurrentTransaction()
-    throws ManifoldCFException
-  {
-  }
-  
-  /** Abstract method to roll back a transaction */
-  protected void rollbackCurrentTransaction()
-    throws ManifoldCFException
-  {
-  }
-  
-  /** Abstract method for explaining a query */
-  protected void explainQuery(String query, List params)
-    throws ManifoldCFException
-  {
-  }
-
-  /** Abstract method for mapping a column lookup name from resultset */
-  protected String mapLookupName(String rawColumnName, String rawLabelName)
-  {
-    return rawColumnName;
-  }
-  
-  /** Abstract method for mapping a label name from resultset */
-  protected String mapLabelName(String rawLabelName)
-  {
-    return rawLabelName;
-  }
-  
-  /** Prepare database for database creation step.
-  * In order to do this, all connections to the back end must be closed.  Since we have a pool, and a local
-  * connection, these all need to be cleaned up.
-  */
-  public void prepareForDatabaseCreate()
-    throws ManifoldCFException
-  {
-    if (connection != null) {
-      throw new ManifoldCFException("Can't do a database create within a transaction");
-    }
-    ConnectionFactory.flush();
-  }
-  
-  /** Execute arbitrary database query, and optionally cache the result.  Cached results are
-  * returned for this operation if they are valid and appropriate.  Note that any cached results
-  * returned were only guaranteed to be pertinent at the time the cached result was obtained; the
-  * actual data may become invalid due to other threads writing to the database.
-  * This is NOT true, however, if a transaction is started.  If a transaction was started for this
-  * database within this thread context, then the query
-  * will be executed within the transaction, and since the transaction is owned by the current
-  * thread, no others will be able to disrupt its processing.
-  * @param query is the actual query string.
-  * @param params if not null, are prepared statement parameters.
-  * @param cacheKeys is the set of cache keys that the query result will be cached against.  If the
-  * value for this parameter is null, then the query will not be cached.
-  * @param invalidateKeys is the set of cache keys that the query will invalidate when the query occurs.
-  * If this is null, then no keys will be invalidated. Note that if this is in a transaction, the
-  * cache invalidation will only occur for queries that are part of the transaction, at least until
-  * the transaction is committed.
-  * @param queryClass describes the class of the query, for the purposes of LRU and expiration time.
-  * The queryClass groups queries together, so that they are managed with a common set of timeouts
-  * and maximum sizes.  If null, then no expiration or LRU behavior will take place.
-  * @param needResult is true if the result is needed.
-  * @param maxReturn is the maximum number of rows to return.  Use -1 for infinite.
-  * @param spec is the result specification object, or null for standard.
-  * @param returnLimits is a description of how to limit return results (in addition to the maxReturn value).
-  *  Pass null if no limits are desired.
-  * @return the resultset
-  */
-  public IResultSet executeQuery(String query, List params, StringSet cacheKeys, StringSet invalidateKeys,
-    String queryClass, boolean needResult, int maxReturn, ResultSpecification spec, ILimitChecker returnLimits)
-    throws ManifoldCFException
-  {
-    if (commitDone)
-      throw new ManifoldCFException("Commit already done");
-    
-    // System.out.println("Query: "+query);
-    if (Logging.db.isDebugEnabled())
-    {
-      Logging.db.debug("Requested query: [" + query + "]");
-    }
-
-
-    // Make sure we can't cache a query that invalidates stuff
-    if (!needResult)
-      cacheKeys = null;
-
-    // We do NOT automatically qualify the cache and invalidation keys with the database name.
-    // This is a job that the caller will need to do, where required.
-
-    // Create object description
-    QueryDescription[] queryDescriptions = new QueryDescription[1];
-    QueryCacheExecutor executor;
-
-    // Note: The caching effects of transactions are now handled by the cache manager.
-    // All we do is tell it what we are doing.  This is encapsulated by the transaction ID passed
-    // to the cache methods.
-
-    queryDescriptions[0] = new QueryDescription(databaseName,query,params,queryClass,cacheKeys,maxReturn,spec,returnLimits);
-    executor = new QueryCacheExecutor(this,needResult);
-    cacheManager.findObjectsAndExecute(queryDescriptions,invalidateKeys,executor,getTransactionID());
-
-    return executor.getResult();
-  }
-
-  /** Get the current transaction type.  Returns "READCOMMITTED"
-  * outside of a transaction.
-  */
-  public int getCurrentTransactionType()
-  {
-    if (th == null)
-      return IDBInterface.TRANSACTION_READCOMMITTED;
-    return th.getTransactionType();
-  }
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  *@param transactionType describes the type of the transaction.
-  */
-  public void beginTransaction(int transactionType)
-    throws ManifoldCFException
-  {
-    if (Logging.db.isDebugEnabled())
-      Logging.db.debug("Beginning transaction of type "+Integer.toString(transactionType));
-    // Currently the cache management does absolutely nothing different for transactions of different types.
-    // In practice this is not currently a problem, although a more rigorous treatment would involve taking greater
-    // care to mirror the different types.
-    // The "begin transaction" command itself is fired off in this module.  Anything additional will be fired off after that
-    // at the database implementation layer, which will incidentally cause any delayed transactions to actually be starte.d
-    String enclosingID = (th==null)?null:th.getTransactionID();
-    delayedTransactionDepth++;
-    th = new TransactionHandle(context,th,transactionType);
-    cacheManager.startTransaction(th.getTransactionID(),enclosingID);
-    doRollback = false;
-    commitDone = false;
-  }
-
-  /** Synchronize internal transactions.
-  */
-  protected void synchronizeTransactions()
-    throws ManifoldCFException
-  {
-    while (delayedTransactionDepth > 0)
-    {
-      // Try starting the transaction
-      // If failure, make CERTAIN that the little number does not get decremented!
-      internalTransactionBegin();
-      delayedTransactionDepth--;
-    }
-  }
-
-  /** Perform actual transaction begin.
-  */
-  protected void internalTransactionBegin()
-    throws ManifoldCFException
-  {
-    // Get a semipermanent connection
-    if (connection == null)
-    {
-      connection = ConnectionFactory.getConnection(jdbcUrl,jdbcDriverClass,databaseName,userName,password,
-        maxDBConnections,debug);
-      try
-      {
-        // Initialize the connection (for HSQLDB)
-        initializeConnection(connection.getConnection());
-        // Start a transaction
-        startATransaction();
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        {
-          connection = null;
-          throw e;
-        }
-        ConnectionFactory.releaseConnection(connection);
-        connection = null;
-        throw e;
-      }
-      catch (Error e)
-      {
-        ConnectionFactory.releaseConnection(connection);
-        connection = null;
-        throw e;
-      }
-    }
-    else
-    {
-      try
-      {
-        startATransaction();
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-        {
-          // Don't do anything else other than drop the connection on the floor
-          connection = null;
-        }
-        throw e;
-      }
-    }
-  }
-
-  /** Perform the transaction commit.
-  * Calling this method does not relieve the coder of the responsibility of calling endTransaction(),
-  * as listed below.  The purpose of a separate commit operation is to allow handling of situations where the
-  * commit generates a TRANSACTION_ABORT signal.
-  */
-  public void performCommit()
-    throws ManifoldCFException
-  {
-    if (doRollback)
-      return;
-    if (delayedTransactionDepth == 0)
-    {
-      Logging.db.debug("Committing transaction!");
-      commitCurrentTransaction();
-      commitDone = true;
-    }
-  }
-
-  /** Signal that a rollback should occur on the next endTransaction().
-  */
-  public void signalRollback()
-  {
-    doRollback = true;
-  }
-
-  /** End a database transaction, either performing a commit or a rollback (depending on whether
-  * signalRollback() was called within the transaction).
-  */
-  public void endTransaction()
-    throws ManifoldCFException
-  {
-    Logging.db.debug("Ending transaction");
-    if (th == null)
-      throw new ManifoldCFException("End transaction without begin!",ManifoldCFException.GENERAL_ERROR);
-
-    TransactionHandle parentTransaction = th.getParent();
-    // If the database throws up on the commit or the rollback, above us there
-    // will be no attempt to retry the transaction commit or rollback, so do NOT leave things
-    // in an inconsistent state!  As far as we are concerned, the transaction is over, end of
-    // story.
-    try
-    {
-      if (delayedTransactionDepth > 0)
-        delayedTransactionDepth--;
-      else
-      {
-        try
-        {
-          if (doRollback)
-          {
-            // Do a rollback in the database, and blow away cached queries (cached against the
-            // database transaction key).
-            if (!commitDone)
-            {
-              Logging.db.debug("Rolling transaction back!");
-              rollbackCurrentTransaction();
-            }
-            else
-            {
-              doRollback = false;
-              throw new ManifoldCFException("Cannot roll back an already committed transaction");
-            }
-          }
-          else
-          {
-            // Do a commit into the database, and blow away cached queries (cached against the
-            // database transaction key).
-            if (!commitDone)
-            {
-              Logging.db.debug("Committing transaction!");
-              commitCurrentTransaction();
-            }
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          {
-            // Drop the connection on the floor, so it cannot be reused.
-            connection = null;
-          }
-          throw e;
-        }
-        finally
-        {
-          if (parentTransaction == null && connection != null)
-          {
-            ConnectionFactory.releaseConnection(connection);
-            connection = null;
-          }
-        }
-      }
-    }
-    finally
-    {
-      if (doRollback)
-      {
-        cacheManager.rollbackTransaction(th.getTransactionID());
-      }
-      else
-      {
-	cacheManager.commitTransaction(th.getTransactionID());
-      }
-      
-      // Clear the signaling variables.  This keeps them local to the transaction.
-      commitDone = false;
-      doRollback = false;
-
-      th = parentTransaction;
-      if (th == null)
-      {
-        if (doRollback)
-          modificationsSet.clear();
-        else
-          playbackModifications();
-      }
-    }
-
-  }
-
-  /** Playback modifications */
-  private void playbackModifications()
-    throws ManifoldCFException
-  {
-    Iterator<String> modIterator = modificationsSet.keySet().iterator();
-    while (modIterator.hasNext())
-    {
-      String tableName = modIterator.next();
-      Modifications c = modificationsSet.get(tableName);
-      noteModificationsNoTransactions(tableName,c.getInsertCount(),c.getModifyCount(),c.getDeleteCount());
-    }
-    modificationsSet.clear();
-  }
-
-  /** Note a number of inserts, modifications, or deletions to a specific table.  This is so we can decide when to do appropriate maintenance.
-  *@param tableName is the name of the table being modified.
-  *@param insertCount is the number of inserts.
-  *@param modifyCount is the number of updates.
-  *@param deleteCount is the number of deletions.
-  */
-  public void noteModifications(String tableName, int insertCount, int modifyCount, int deleteCount)
-    throws ManifoldCFException
-  {
-    if (th != null)
-    {
-      // In a transaction; record for later
-      Modifications c = modificationsSet.get(tableName);
-      if (c == null)
-      {
-        c = new Modifications();
-        modificationsSet.put(tableName,c);
-      }
-      c.update(insertCount,modifyCount,deleteCount);
-    }
-    else
-      noteModificationsNoTransactions(tableName,insertCount,modifyCount,deleteCount);
-  }
-
-  /** Protected method for receiving information about inserts, modifications, or deletions OUTSIDE of all transactions.
-  */
-  protected void noteModificationsNoTransactions(String tableName, int insertCount, int modifyCount, int deleteCount)
-    throws ManifoldCFException
-  {
-  }
-  
-      
-  /** Sleep a random amount of time after a transaction abort.
-  */
-  public long getSleepAmt()
-  {
-    // Amount should be between .5 and 1 minute, approx, to give things time to unwind
-    return (long)(random.nextDouble() * 60000.0 + 500.0);
-  }
-
-  /** Sleep, as part of recovery from deadlock.
-  */
-  public void sleepFor(long amt)
-    throws ManifoldCFException
-  {
-    if (amt == 0L)
-      return;
-
-    try
-    {
-      ManifoldCF.sleep(amt);
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Construct index hint clause.
-  * On most databases this returns an empty string, but on MySQL this returns
-  * a USE INDEX hint.  It requires the name of an index.
-  *@param tableName is the table the index is from.
-  *@param description is the description of an index, which is expected to exist.
-  *@return the query chunk that should go between the table names and the WHERE
-  * clause.
-  */
-  public String constructIndexHintClause(String tableName, IndexDescription description)
-    throws ManifoldCFException
-  {
-    return "";
-  }
-
-  /** Construct ORDER-BY clause meant for reading from an index.
-  * Supply the field names belonging to the index, in order.
-  * Also supply a corresponding boolean array, where TRUE means "ASC", and FALSE
-  * means "DESC".
-  *@param fieldNames are the names of the fields in the index that is to be used.
-  *@param direction is a boolean describing the sorting order of the first term.
-  *@return a query chunk, including "ORDER BY" text, which is appropriate for
-  * at least ordering by the FIRST column supplied.
-  */
-  public String constructIndexOrderByClause(String[] fieldNames, boolean direction)
-  {
-    if (fieldNames.length == 0)
-      return "";
-    StringBuilder sb = new StringBuilder("ORDER BY ");
-    sb.append(fieldNames[0]);
-    if (direction)
-      sb.append(" ASC");
-    else
-      sb.append(" DESC");
-    return sb.toString();
-  }
-  
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  public String constructOffsetLimitClause(int offset, int limit)
-  {
-    return constructOffsetLimitClause(offset,limit,false);
-  }
-
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@param afterOrderBy is true if this offset/limit comes after an ORDER BY.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  public abstract String constructOffsetLimitClause(int offset, int limit, boolean afterOrderBy);
-
-  /* Calculate the number of values a particular clause can have, given the values for all the other clauses.
-  * For example, if in the expression x AND y AND z, x has 2 values and z has 1, find out how many values x can legally have
-  * when using the buildConjunctionClause() method below.
-  */
-  public int findConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions)
-  {
-    // Base implementation uses "IN" for multiple values, since this seems to be widely accepted.
-    return getMaxInClause();
-  }
-  
-  /** Obtain the maximum number of individual items that should be
-  * present in an IN clause.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of IN clause members.
-  */
-  public abstract int getMaxInClause();
-
-  /* Construct a conjunction clause, e.g. x AND y AND z, where there is expected to be an index (x,y,z,...), and where x, y, or z
-  * can have multiple distinct values, The proper implementation of this method differs from database to database, because some databases
-  * only permit index operations when there are OR's between clauses, such as x1 AND y1 AND z1 OR x2 AND y2 AND z2 ..., where others
-  * only recognize index operations when there are lists specified for each, such as x IN (x1,x2) AND y IN (y1,y2) AND z IN (z1,z2).
-  */
-  public String buildConjunctionClause(List outputParameters, ClauseDescription[] clauseDescriptions)
-  {
-    // Base implementation uses "IN" for multiple values, since this seems to be widely accepted.
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0 ; i < clauseDescriptions.length ; i++)
-    {
-      ClauseDescription cd = clauseDescriptions[i];
-      if (i > 0)
-        sb.append(" AND ");
-      sb.append(cd.getColumnName());
-      String operation = cd.getOperation();
-      List values = cd.getValues();
-      String joinColumn = cd.getJoinColumnName();
-      if (values != null)
-      {
-        if (values.size() > 1)
-        {
-          sb.append(" IN (");
-          for (int j = 0 ; j < values.size() ; j++)
-          {
-            if (j > 0)
-              sb.append(",");
-            sb.append("?");
-            outputParameters.add(values.get(j));
-          }
-          sb.append(")");
-        }
-        else
-        {
-          sb.append(operation).append("?");
-          outputParameters.add(values.get(0));
-        }
-      }
-      else if (joinColumn != null)
-      {
-        sb.append(operation).append(joinColumn);
-      }
-      else
-        sb.append(operation);
-    }
-    return sb.toString();
-  }
-
-  /** Class to keep track of modifications while we're in a transaction.
-  */
-  protected static class Modifications
-  {
-    protected int insertCount = 0;
-    protected int modifyCount = 0;
-    protected int deleteCount = 0;
-    
-    public Modifications()
-    {
-    }
-    
-    public void update(int insertCount, int modifyCount, int deleteCount)
-    {
-      this.insertCount += insertCount;
-      this.modifyCount += modifyCount;
-      this.deleteCount += deleteCount;
-    }
-    
-    public int getInsertCount()
-    {
-      return insertCount;
-    }
-    
-    public int getModifyCount()
-    {
-      return modifyCount;
-    }
-    
-    public int getDeleteCount()
-    {
-      return deleteCount;
-    }
-  }
-  
-  /** Thread used to execute queries.  An instance of this thread is spun up every time a query is executed.  This is necessary because JDBC does not
-  * guarantee interruptability, and the Postgresql JDBC driver unfortunately eats all thread interrupts.  So, we fire up a thread to do each interaction with
-  * the database server, thus insuring that the owning thread remains interruptable and will therefore not block shutdown.
-  */
-  protected class ExecuteQueryThread extends Thread
-  {
-    protected Connection connection;
-    protected String query;
-    protected List params;
-    protected boolean bResults;
-    protected int maxResults;
-    protected ResultSpecification spec;
-    protected ILimitChecker returnLimit;
-    protected Throwable exception = null;
-    protected IResultSet rval = null;
-
-    public ExecuteQueryThread(Connection connection, String query, List params, boolean bResults, int maxResults,
-      ResultSpecification spec, ILimitChecker returnLimit)
-    {
-      super();
-      setDaemon(true);
-      this.connection = connection;
-      this.query = query;
-      this.params = params;
-      this.bResults = bResults;
-      this.maxResults = maxResults;
-      this.spec = spec;
-      this.returnLimit = returnLimit;
-    }
-
-    public void run()
-    {
-      try
-      {
-        // execute using the passed connection handle
-        rval = execute(connection,query,params,bResults,maxResults,spec,returnLimit);
-      }
-      catch (Throwable e)
-      {
-        this.exception = e;
-      }
-    }
-
-    public IResultSet finishUp()
-      throws ManifoldCFException, InterruptedException
-    {
-      join();
-      Throwable thr = exception;
-      if (thr != null)
-      {
-        if (thr instanceof ManifoldCFException)
-        {
-          // Nest the exceptions so there is a hope we actually see the context, while preserving the kind of error it is
-          ManifoldCFException me = (ManifoldCFException)thr;
-          throw new ManifoldCFException("Database exception: "+me.getMessage(),me.getCause(),me.getErrorCode());
-        }
-        else if (thr instanceof Error)
-          throw (Error)thr;
-        else if (thr instanceof RuntimeException)
-          throw (RuntimeException)thr;
-        else
-          throw new RuntimeException("Unknown exception: "+thr.getClass().getName()+": "+thr.getMessage(),thr);
-      }
-      return rval;
-    }
-  }
-
-  /** Do query execution via a subthread, so the primary thread can be interrupted */
-  protected IResultSet executeViaThread(Connection connection, String query, List params, boolean bResults, int maxResults,
-    ResultSpecification spec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    if (connection == null)
-      // This probably means that the thread was interrupted and the connection was abandoned.  Just return null.
-      return null;
-
-    ExecuteQueryThread t = new ExecuteQueryThread(connection,query,params,bResults,maxResults,spec,returnLimit);
-    try
-    {
-      t.start();
-      return t.finishUp();
-    }
-    catch (InterruptedException e)
-    {
-      // Try to kill the background thread - but we can't wait for it...
-      t.interrupt();
-      interruptCleanup(connection);
-      // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-
-  }
-
-  /** This method must clean up after a execute query thread has been forcibly interrupted.
-  * It has been separated because some JDBC drivers don't handle forcible interrupts
-  * appropriately.
-  */
-  protected void interruptCleanup(Connection connection)
-  {
-    // VERY IMPORTANT: Try to close the connection, so nothing is left dangling.  The connection will be abandoned anyhow.
-    try
-    {
-      if (!connection.getAutoCommit())
-        connection.rollback();
-      connection.close();
-    }
-    catch (Exception e2)
-    {
-    }
-  }
-
-  /** This method does NOT appear in any interface; it is here to
-  * service the cache object.
-  */
-  protected IResultSet executeUncachedQuery(String query, List params, boolean bResults, int maxResults,
-    ResultSpecification spec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-
-    if (connection != null)
-    {
-      try
-      {
-        return executeViaThread(connection.getConnection(),query,params,bResults,maxResults,spec,returnLimit);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          // drop the connection object on the floor, so it cannot possibly be reused
-          connection = null;
-        throw e;
-      }
-    }
-    else
-    {
-      // Grab a connection
-      WrappedConnection tempConnection = ConnectionFactory.getConnection(jdbcUrl,jdbcDriverClass,databaseName,userName,password,
-        maxDBConnections,debug);
-      try
-      {
-        // Initialize the connection (for HSQLDB)
-        initializeConnection(tempConnection.getConnection());
-        return executeViaThread(tempConnection.getConnection(),query,params,bResults,maxResults,spec,returnLimit);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          // drop the connection object on the floor, so it cannot possibly be reused
-          tempConnection = null;
-        throw e;
-      }
-      finally
-      {
-        if (tempConnection != null)
-          ConnectionFactory.releaseConnection(tempConnection);
-      }
-    }
-  }
-
-
-  // These are protected helper methods
-
-  /** Initialize the connection (for HSQLDB).
-  * HSQLDB has a great deal of session state, and no way to pool individual connections based on it.
-  * So, every time we pull a connection off the pool we have to execute a number of statements on it
-  * before it can work reliably for us.  This is the abstraction that permits that to happen.
-  *@param connection is the JDBC connection.
-  */
-  protected void initializeConnection(Connection connection)
-    throws ManifoldCFException
-  {
-    // Default implementation does nothing; override to make special stuff happen.
-  }
-  
-  /** Run a query.  No caching is involved at all at this level.
-  * @param query String the query string
-  * @param bResults boolean whether to load the resultset or not
-  * @param maxResults is the maximum number of results to load: -1 if all
-  * @param params List if params !=null, use preparedStatement
-  */
-  protected IResultSet execute(Connection connection, String query, List params, boolean bResults, int maxResults,
-    ResultSpecification spec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    IResultSet rval = null;
-    try
-    {
-      try
-      {
-        ResultSet rs;
-        long queryStartTime = 0L;
-
-        if (Logging.db.isDebugEnabled())
-        {
-          queryStartTime = System.currentTimeMillis();
-          Logging.db.debug("Actual query: [" + query + "]");
-          if (params != null)
-          {
-            int i = 0;
-            while (i <  params.size())
-            {
-              Logging.db.debug("  Parameter " + i + ": '" + params.get(i).toString() + "'");
-              i++;
-            }
-          }
-        }
-
-        if (params==null)
-        {
-          //stmt = _connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
-          //                                                                      ResultSet.CONCUR_READ_ONLY);
-          // lightest statement type
-          Statement stmt = connection.createStatement();
-          try
-          {
-            stmt.execute(query);
-            rs = stmt.getResultSet();
-            try
-            {
-              // Suck data from resultset
-              rval = getData(rs,bResults,maxResults,spec,returnLimit);
-            }
-            finally
-            {
-              if (rs != null)
-                rs.close();
-            }
-          }
-          finally
-          {
-            stmt.close();
-          }
-        }
-        else
-        {
-          PreparedStatement ps = connection.prepareStatement(query);
-          try
-          {
-            loadPS(ps, params);
-            if (bResults)
-            {
-              rs = ps.executeQuery();
-              try
-              {
-                // Suck data from resultset
-                rval = getData(rs,true,maxResults,spec,returnLimit);
-              }
-              finally
-              {
-                if (rs != null)
-                  rs.close();
-              }
-            }
-            else
-            {
-              ps.executeUpdate();
-              rval = getData(null,false,0,spec,null);
-            }
-          }
-          finally
-          {
-            ps.close();
-          }
-        }
-        if (Logging.db.isDebugEnabled())
-          Logging.db.debug("Done actual query ("+new Long(System.currentTimeMillis()-queryStartTime).toString()+"ms): ["+query+"]");
-      }
-      catch (java.sql.SQLException e)
-      {
-        // There are a lot of different sorts of error that can be embedded here.  Unfortunately, it's database dependent how
-        // to interpret the error.  So toss a generic error, and let the caller figure out if it needs to treat it differently.
-        throw new ManifoldCFException("SQLException doing query"+((e.getSQLState() != null)?" ("+e.getSQLState()+")":"")+": "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-      }
-    }
-    finally
-    {
-      // Cleanup of input parameters ALWAYS occurs, because whether we succeed or fail, we are done with any input streams.
-      if (params != null)
-        cleanupParameters(params);
-    }
-    return rval;
-  }
-
-  // Read data from a resultset
-  protected IResultSet getData(ResultSet rs, boolean bResults, int maxResults, ResultSpecification spec, ILimitChecker returnLimit)
-    throws ManifoldCFException
-  {
-    RSet results = new RSet();  // might be empty but not an error
-    try
-    {
-      try
-      {
-        if (rs != null)
-        {
-          int colcount = 0;
-          String[] resultCols = null;
-          String[] resultLabels = null;
-
-          // Optionally we're going to suck the data
-          // out of the db and return it in a
-          // readonly structure
-          ResultSetMetaData rsmd = rs.getMetaData();
-          if (rsmd != null)
-          {
-            colcount = rsmd.getColumnCount();
-
-            //LogBean.db.debug(colcount + " columns returned.");
-
-            resultCols = new String[colcount];
-            resultLabels = new String[colcount];
-            for (int i = 0; i < colcount; i++)
-            {
-              String labelName = rsmd.getColumnLabel(i+1);
-              resultCols[i] = mapLookupName(rsmd.getColumnName(i+1),labelName);
-              resultLabels[i] = mapLabelName(labelName);
-            }
-          }
-
-          if (bResults)
-          {
-            if (colcount == 0)
-            {
-              // This is an error situation; if a result with no columns is
-              // necessary, bResults must be false!!!
-              throw new ManifoldCFException("Empty query, no columns returned",ManifoldCFException.GENERAL_ERROR);
-            }
-
-            while (rs.next() && (maxResults == -1 || maxResults > 0) && (returnLimit == null || returnLimit.checkContinue()))
-            {
-              Object value;
-              RRow m = new RRow();
-
-              // We have 'colcount' cols to look thru
-              for (int i = 0; i < colcount; i++)
-              {
-                String key = resultCols[i];
-                // System.out.println("Key = "+key);
-                int colnum = findColumn(rs,key);
-                value = null;
-                if (colnum > -1)
-                {
-                  value = getObject(rs,rsmd,colnum,(spec == null)?ResultSpecification.FORM_DEFAULT:spec.getForm(key.toLowerCase(Locale.ROOT)));
-                }
-                //System.out.println(" Key = '"+resultLabels[i]+"', value = "+((value==null)?"NULL":value.toString()));
-                m.put(resultLabels[i], value);
-              }
-
-              // See if we should include this row
-              boolean include = true;
-              if (returnLimit != null)
-              {
-                include = returnLimit.checkInclude(m);
-              }
-
-              if (include)
-              {
-                if (maxResults != -1)
-                  maxResults--;
-                results.addRow(m);
-              }
-              else
-              {
-                // As a courtesy, clean up any BinaryInput objects in the row we are skipping
-                Iterator iter = m.getColumns();
-                while (iter.hasNext())
-                {
-                  String columnName = (String)iter.next();
-                  Object colValue = m.getValue(columnName);
-                  if (colValue instanceof PersistentDatabaseObject)
-                    ((PersistentDatabaseObject)colValue).discard();
-                }
-              }
-            }
-          }
-        }
-      }
-      catch (java.sql.SQLException e)
-      {
-        throw new ManifoldCFException("SQLException getting resultset"+((e.getSQLState() != null)?" ("+e.getSQLState()+")":"")+": "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-      }
-    }
-    catch (Throwable e)
-    {
-      // Clean up resultset before continuing
-      int i = 0;
-      while (i < results.getRowCount())
-      {
-        IResultRow row = results.getRow(i++);
-        int j = 0;
-        Iterator iter = row.getColumns();
-        while (iter.hasNext())
-        {
-          String colName = (String)iter.next();
-          Object o = row.getValue(colName);
-          if (o instanceof PersistentDatabaseObject)
-            ((PersistentDatabaseObject)o).discard();
-        }
-      }
-      if (e instanceof ManifoldCFException)
-        throw (ManifoldCFException)e;
-      if (e instanceof RuntimeException)
-        throw (RuntimeException)e;
-      if (e instanceof Error)
-        throw (Error)e;
-      throw new Error("Unexpected exception caught: "+e.getMessage(),e);
-    }
-    return results;
-  }
-
-  // pass params to preparedStatement
-  protected static void loadPS(PreparedStatement ps, List data)
-    throws java.sql.SQLException, ManifoldCFException
-  {
-    if (data!=null)
-    {
-      for (int i = 0; i < data.size(); i++)
-      {
-        // If the input type is a string, then set it as such.
-        // Otherwise, if it's an input stream, we make a blob out of it.
-        Object x = data.get(i);
-        if (x instanceof String)
-        {
-          String value = (String)x;
-          // letting database do lame conversion!
-          ps.setString(i+1, value);
-        }
-        if (x instanceof BinaryInput)
-        {
-          BinaryInput value = (BinaryInput)x;
-          long length = value.getLength();
-          // System.out.println("Blob length on write = "+Long.toString(value.getLength()));
-          ps.setBinaryStream(i+1,value.getStream(),(length == -1L)?Integer.MAX_VALUE:(int)length);
-        }
-        if (x instanceof CharacterInput)
-        {
-          CharacterInput value = (CharacterInput)x;
-          long length = value.getCharacterLength();
-          ps.setCharacterStream(i+1,value.getStream(),(length == -1L)?Integer.MAX_VALUE:(int)length);
-        }
-        if (x instanceof java.util.Date)
-        {
-          ps.setDate(i+1,new java.sql.Date(((java.util.Date)x).getTime()));
-        }
-        if (x instanceof Long)
-        {
-          ps.setLong(i+1,((Long)x).longValue());
-        }
-        if (x instanceof TimeMarker)
-        {
-          ps.setTimestamp(i+1,new java.sql.Timestamp(((TimeMarker)x).longValue()));
-        }
-        if (x instanceof Double)
-        {
-          ps.setDouble(i+1,((Double)x).doubleValue());
-        }
-        if (x instanceof Integer)
-        {
-          ps.setInt(i+1,((Integer)x).intValue());
-        }
-        if (x instanceof Float)
-        {
-          ps.setFloat(i+1,((Float)x).floatValue());
-        }
-      }
-    }
-  }
-
-  /** Clean up parameters after query has been triggered.
-  */
-  protected static void cleanupParameters(List data)
-    throws ManifoldCFException
-  {
-    if (data != null)
-    {
-      for (Object x : data)
-      {
-        if (x instanceof PersistentDatabaseObject)
-        {
-          ((PersistentDatabaseObject)x).doneWithStream();
-        }
-      }
-    }
-  }
-
-  protected int findColumn(ResultSet rs, String name)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return rs.findColumn(name);
-    }
-    catch (SQLException e)
-    {
-      return -1;
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Error finding " + name + " in resultset: "+e.getMessage(),e,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected Blob getBLOB(ResultSet rs, int col)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return rs.getBlob(col);
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("SQLException in getBlob"+((e.getSQLState() != null)?" ("+e.getSQLState()+")":"")+": "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-    }
-    catch (Exception sqle)
-    {
-      throw new ManifoldCFException("Error in getBlob",sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected boolean isBLOB(ResultSetMetaData rsmd, int col)
-    throws ManifoldCFException
-  {
-    try
-    {
-      int type = rsmd.getColumnType(col);
-      return (type == java.sql.Types.BLOB);
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("SQLException doing isBlob("+col+")"+((e.getSQLState() != null)?" ("+e.getSQLState()+")":"")+": "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-    }
-    catch (Exception sqle)
-    {
-      throw new ManifoldCFException("Error in isBlob("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected boolean isBinary(ResultSetMetaData rsmd, int col)
-    throws ManifoldCFException
-  {
-    try
-    {
-      int type = rsmd.getColumnType(col);
-      return (type == java.sql.Types.VARBINARY ||
-        type == java.sql.Types.BINARY || type == java.sql.Types.LONGVARBINARY);
-    }
-    catch (java.sql.SQLException e)
-    {
-      throw new ManifoldCFException("SQLException doing isBinary("+col+")"+((e.getSQLState() != null)?" ("+e.getSQLState()+")":"")+": "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-    }
-    catch (Exception sqle)
-    {
-      throw new ManifoldCFException("Error in isBinary("+col+"): "+sqle.getMessage(),sqle,ManifoldCFException.DATABASE_ERROR);
-    }
-  }
-
-  protected Object getObject(ResultSet rs, ResultSetMetaData rsmd, int col, int desiredForm)
-    throws ManifoldCFException
-  {
-    Object result = null;
-
-    try
-    {
-      try
-      {
-        //System.out.println("  Column "+rsmd.getColumnLabel(col)+" is of type "+rsmd.getColumnType(col));
-        if (isBLOB(rsmd,col))
-        {
-          // System.out.println("It's a blob!");
-          Blob blob = getBLOB(rs,col);
-          if (blob != null)
-          {
-            // Create a tempfileinput object!
-            // Cleanup should happen by the user of the resultset.
-            // System.out.println(" Blob length = "+Long.toString(blob.length()));
-            result = new TempFileInput(blob.getBinaryStream(),blob.length());
-          }
-        }
-        else if (isBinary(rsmd,col))
-        {
-          java.io.InputStream is = rs.getBinaryStream(col);
-          if (is != null)
-          {
-            // Create a tempfileinput object!
-            // Cleanup should happen by the user of the resultset.
-            result = new TempFileInput(is);
-          }
-        }
-        else
-        {
-          Timestamp timestamp;
-          java.sql.Date date;
-          Clob clob;
-          String resultString;
-          
-          int colType = rsmd.getColumnType(col);
-          switch (colType)
-          {
-          case java.sql.Types.CHAR :
-          case java.sql.Types.VARCHAR :
-            switch (desiredForm)
-            {
-            case ResultSpecification.FORM_DEFAULT:
-            case ResultSpecification.FORM_STRING:
-              if ((resultString = rs.getString(col)) != null)
-              {
-                // We used to truncate result based on columnDisplaySize, but that (a) didn't seem to be
-                // helping on modern JDBC drivers, and (b) was completely busted on MySQL, so we no longer do it.
-                /*
-                if (rsmd.getColumnDisplaySize(col) < resultString.length())
-                {
-                  result = resultString.substring(0,rsmd.getColumnDisplaySize(col));
-                }
-                else
-                  result = resultString;
-                */
-                result = resultString;
-              }
-              break;
-            case ResultSpecification.FORM_STREAM:
-              result = new TempFileCharacterInput(rs.getCharacterStream(col));
-              break;
-            default:
-              throw new ManifoldCFException("Illegal form requested for column "+Integer.toString(col)+": "+Integer.toString(desiredForm));
-            }
-            break;
-          case java.sql.Types.CLOB :
-            switch (desiredForm)
-            {
-            case ResultSpecification.FORM_DEFAULT:
-            case ResultSpecification.FORM_STRING:
-              if ((clob = rs.getClob(col)) != null)
-              {
-                result = clob.getSubString(1, (int) clob.length());
-              }
-              break;
-            case ResultSpecification.FORM_STREAM:
-              result = new TempFileCharacterInput(rs.getCharacterStream(col));
-              break;
-            default:
-              throw new ManifoldCFException("Illegal form requested for column "+Integer.toString(col)+": "+Integer.toString(desiredForm));
-            }
-            break;
-          case java.sql.Types.BIGINT :
-            long l = rs.getLong(col);
-            if (!rs.wasNull())
-              result = new Long(l);
-            break;
-
-          case java.sql.Types.INTEGER :
-            int i = rs.getInt(col);
-            if (!rs.wasNull())
-              result = new Integer(i);
-            break;
-
-          case java.sql.Types.SMALLINT:
-            short s = rs.getShort(col);
-            if (!rs.wasNull())
-              result = new Short(s);
-            break;
-
-          case java.sql.Types.REAL :
-          case java.sql.Types.FLOAT :
-            float f = rs.getFloat(col);
-            if (!rs.wasNull())
-              result = new Float(f);
-            break;
-
-          case java.sql.Types.DOUBLE :
-            double d = rs.getDouble(col);
-            if (!rs.wasNull())
-              result = new Double(d);
-            break;
-
-          case java.sql.Types.DATE :
-            if ((date = rs.getDate(col)) != null)
-            {
-              result = new java.util.Date(date.getTime());
-            }
-            break;
-
-          case java.sql.Types.TIMESTAMP :
-            if ((timestamp = rs.getTimestamp(col)) != null)
-            {
-              result = new TimeMarker(timestamp.getTime());
-            }
-            break;
-
-          case java.sql.Types.BOOLEAN :
-            boolean b = rs.getBoolean(col);
-            if (!rs.wasNull())
-              result = new Boolean(b);
-            break;
-
-          case java.sql.Types.BLOB:
-            throw new ManifoldCFException("BLOB is not a string, column = " + col,ManifoldCFException.GENERAL_ERROR);
-
-          default :
-            switch (desiredForm)
-            {
-            case ResultSpecification.FORM_DEFAULT:
-            case ResultSpecification.FORM_STRING:
-              result = rs.getString(col);
-              break;
-            case ResultSpecification.FORM_STREAM:
-              result = new TempFileCharacterInput(rs.getCharacterStream(col));
-              break;
-            default:
-              throw new ManifoldCFException("Illegal form requested for column "+Integer.toString(col)+": "+Integer.toString(desiredForm));
-            }
-            break;
-          }
-          if (rs.wasNull())
-          {
-            if (result instanceof CharacterInput)
-              ((CharacterInput)result).discard();
-            result = null;
-          }
-        }
-      }
-      catch (java.sql.SQLException e)
-      {
-        throw new ManifoldCFException("SQLException doing getObject()"+((e.getSQLState() != null)?" ("+e.getSQLState()+")":"")+": "+e.getMessage(),e,ManifoldCFException.DATABASE_CONNECTION_ERROR);
-      }
-    }
-    catch (Throwable e)
-    {
-      if (result instanceof PersistentDatabaseObject)
-        ((PersistentDatabaseObject)result).discard();
-      if (e instanceof ManifoldCFException)
-        throw (ManifoldCFException)e;
-      if (e instanceof RuntimeException)
-        throw (RuntimeException)e;
-      if (e instanceof Error)
-        throw (Error)e;
-      throw new Error("Unexpected exception caught: "+e.getMessage(),e);
-    }
-    return result;
-  }
-
-
-  /** This object is meant to execute within a cache manager call.  It contains all knowledge needed to
-  * perform any query, including a parameterized one.  It may (or may not) be also passed a transaction
-  * handle, depending on whether or not a transaction is currently underway.
-  * Nevertheless, all database access, save transaction setup and teardown, takes place inside this class.
-  * Even uncached queries will be done here; the cache manager will simply not keep the result around
-  * afterwards.
-  */
-  public static class QueryCacheExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // We store only those things that will not come in from the object description.
-    protected Database database;
-    protected boolean needResult;
-    protected IResultSet resultset = null;
-
-    public QueryCacheExecutor(Database database, boolean needResult)
-    {
-      super();
-      this.database = database;
-      this.needResult = needResult;
-    }
-
-    /** Fetch the result.  No errors are possible at this time; they would have already
-    * occurred...
-    */
-    public IResultSet getResult()
-    {
-      return resultset;
-    }
-
-    /** Create a new object to operate on and cache.  This method is called only
-    * if the specified object is NOT available in the cache.  The specified object
-    * should be created and returned; if it is not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions are the unique identifiers of the objects.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Perform the requested query, within the appropriate transaction object.
-      // Call the database object to do this
-      Object[] rval = new Object[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        database.synchronizeTransactions();
-        QueryDescription description = (QueryDescription)objectDescriptions[i];
-        ILimitChecker limit = description.getReturnLimit();
-        ResultSpecification spec = description.getResultSpecification();
-        // I've prevented us from ever caching things that have limit objects
-        // at a higher level...
-        // if (limit != null)
-        //      limit = limit.duplicate();
-        // ResultSpecification objects are considered "read only" once passed to the cache, so duplication is unneeded.
-        // if (spec != null)
-        //      spec = spec.duplicate();
-        long startTime = System.currentTimeMillis();
-        rval[i] = database.executeUncachedQuery(description.getQuery(),description.getParameters(),needResult,
-          description.getMaxReturn(),spec,limit);
-
-        long endTime = System.currentTimeMillis();
-        if (endTime-startTime > database.maxQueryTime && description.getQuery().length() >= 6 &&
-          ("SELECT".equalsIgnoreCase(description.getQuery().substring(0,6)) || "UPDATE".equalsIgnoreCase(description.getQuery().substring(0,6))))
-        {
-          Logging.db.warn("Found a long-running query ("+new Long(endTime-startTime).toString()+" ms): ["+description.getQuery()+"]");
-          if (description.getParameters() != null)
-          {
-            int j = 0;
-            while (j <  description.getParameters().size())
-            {
-              Logging.db.warn("  Parameter " + j + ": '" + description.getParameters().get(j).toString() + "'");
-              j++;
-            }
-          }
-          try
-          {
-            database.explainQuery(description.getQuery(),description.getParameters());
-          }
-          catch (ManifoldCFException e)
-          {
-            // We need to know if explain generated a TRANSACTION_ABORT.  If so we have to rethrow it.
-            if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT || e.getErrorCode() == e.INTERRUPTED)
-              throw e;
-            // Eat the exception
-            Logging.db.warn("Explain failed with error "+e.getMessage(),e);
-          }
-
-        }
-        i++;
-      }
-      return rval;
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // System.out.println("Object created or found: "+objectDescription.getCriticalSectionName());
-      // Save the resultset for return
-      resultset = (IResultSet)cachedObject;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing at all; the query would already have been done
-    }
-
-
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/MergedResultSet.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/MergedResultSet.java
deleted file mode 100644
index 6866b31..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/MergedResultSet.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* $Id: MergedResultSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class merges several resultsets together to make what appears to be
-* a single one.  This is very useful when queries are broken up due to restrictions
-* in the length of an IN clause, but the results may need to be merged at the end.
-*/
-public class MergedResultSet implements IResultSet
-{
-  public static final String _rcsid = "@(#)$Id: MergedResultSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // This is the array list of resultsets
-  protected ArrayList resultSets = new ArrayList();
-  protected int totalRowCount = 0;
-
-  public MergedResultSet()
-  {
-  }
-
-  public void addResultSet(IResultSet set)
-  {
-    resultSets.add(set);
-    totalRowCount += set.getRowCount();
-  }
-
-  /** Get a specific row in the resultset.
-  *@param rowNumber is the number of the row.
-  *@return the immutable row description, or null if there is no such row.
-  */
-  public IResultRow getRow(int rowNumber)
-  {
-    // linear walk!  Inefficient - fix later.
-    int j = 0;
-    while (j < resultSets.size())
-    {
-      IResultSet set = (IResultSet)resultSets.get(j++);
-      if (set.getRowCount() > rowNumber)
-      {
-        // row is in here
-        return set.getRow(rowNumber);
-      }
-      rowNumber -= set.getRowCount();
-    }
-    return null;
-  }
-
-  /** Get the number of rows in this resultset.
-  *@return the number of rows the resultset contains.
-  */
-  public int getRowCount()
-  {
-    return totalRowCount;
-  }
-
-  /** Get an array of all the rows.
-  * This method is NOT preferred because it requires a new
-  * array object to be constructed.
-  *@return the array.
-  */
-  public IResultRow[] getRows()
-  {
-    IResultRow[] rval = new IResultRow[totalRowCount];
-    int i = 0;
-    int j = 0;
-    while (j < resultSets.size())
-    {
-      IResultSet set = (IResultSet)resultSets.get(j++);
-      int k = 0;
-      while (k < set.getRowCount())
-      {
-        rval[i++] = set.getRow(k++);
-      }
-    }
-    return rval;
-  }
-}
-
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/QueryDescription.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/QueryDescription.java
deleted file mode 100644
index b41976d..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/QueryDescription.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/* $Id: QueryDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This object is immutable, and is used as a description for a cached query.
-*/
-public class QueryDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-{
-  public static final String _rcsid = "@(#)$Id: QueryDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Store an id for the transaction, not the actual transaction handle.
-  // We don't want to hold onto the actual open database handle!
-  protected String databaseName;
-  protected String query;
-  protected List parameters;
-  protected String criticalSectionName = null;
-  protected String cacheClassName;
-  protected StringSet keys;
-  protected int maxReturn;
-  protected ResultSpecification spec;
-  protected ILimitChecker returnLimit;
-
-  public QueryDescription(String databaseName, String query, List parameters,
-    String cacheClassName, StringSet cacheKeys, int maxReturn, ResultSpecification spec,
-    ILimitChecker returnLimit)
-  {
-    super(cacheClassName);
-    this.databaseName = databaseName;
-    this.query = query;
-    this.parameters = null;
-    if (parameters != null)
-    {
-      this.parameters = listClone(parameters);
-    }
-    keys = cacheKeys;
-    this.maxReturn = maxReturn;
-    this.spec = spec;
-    if (returnLimit != null)
-    {
-      if (returnLimit.doesCompareWork())
-        this.returnLimit = returnLimit.duplicate();
-      else
-      {
-        this.returnLimit = returnLimit;
-        // Also turn off caching
-        keys = null;
-      }
-    }
-    else
-      this.returnLimit = null;
-  }
-
-  public String getQuery()
-  {
-    return query;
-  }
-
-  public List getParameters()
-  {
-    if (parameters == null)
-      return null;
-    return listClone(parameters);
-  }
-
-  public int getMaxReturn()
-  {
-    return maxReturn;
-  }
-
-  public ResultSpecification getResultSpecification()
-  {
-    return spec;
-  }
-
-  public ILimitChecker getReturnLimit()
-  {
-    return returnLimit;
-  }
-
-  public int hashCode()
-  {
-    int rval = databaseName.hashCode() + query.hashCode();
-    if (parameters != null)
-      rval += parameters.hashCode();
-    if (cacheClassName != null)
-      rval += cacheClassName.hashCode();
-    rval += maxReturn;
-    if (spec != null)
-      rval += spec.hashCode();
-    if (returnLimit != null && returnLimit.doesCompareWork())
-      rval += returnLimit.hashCode();
-    return rval;
-  }
-
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof QueryDescription))
-      return false;
-    QueryDescription other = (QueryDescription)o;
-    // System.out.println("Matching query descriptions: "+this.getCriticalSectionName()+" against: "+other.getCriticalSectionName());
-    if (parameters == null || other.parameters == null)
-    {
-      if (parameters != null || other.parameters != null)
-        return false;
-    }
-    else
-    {
-      if (!parameters.equals(other.parameters))
-        return false;
-    }
-    if (cacheClassName == null || other.cacheClassName == null)
-    {
-      if (cacheClassName != null || other.cacheClassName != null)
-        return false;
-    }
-    else
-    {
-      if (!cacheClassName.equals(other.cacheClassName))
-        return false;
-    }
-    if (spec == null || other.spec == null)
-    {
-      if (spec != null || other.spec != null)
-        return false;
-    }
-    else
-    {
-      if (!spec.equals(other.spec))
-        return false;
-    }
-    if (returnLimit == null || other.returnLimit == null)
-    {
-      if (returnLimit != null || other.returnLimit != null)
-        return false;
-    }
-    else
-    {
-      if (returnLimit.doesCompareWork() == false || other.returnLimit.doesCompareWork() == false)
-        return false;
-      if (!returnLimit.equals(other.returnLimit))
-        return false;
-    }
-    if (databaseName == null || other.databaseName == null)
-    {
-      if (databaseName != null || other.databaseName != null)
-        return false;
-    }
-    else
-    {
-      if (!databaseName.equals(other.databaseName))
-        return false;
-    }
-    return query.equals(other.query) && maxReturn == other.maxReturn;
-  }
-
-  /** Get the cache keys for an object (which may or may not exist yet in
-  * the cache).  This method is called in order for cache manager to throw the correct locks.
-  * @return the object's cache keys, or null if the object should not
-  * be cached.
-  */
-  public StringSet getObjectKeys()
-  {
-    return keys;
-  }
-
-  public String getCriticalSectionName()
-  {
-    if (criticalSectionName == null)
-    {
-      StringBuilder sb = new StringBuilder();
-      if (databaseName != null)
-        sb.append(databaseName);
-      sb.append("-").append(getClass().getName()).append("-");
-      if (cacheClassName != null)
-        sb.append(cacheClassName).append("-");
-      sb.append(query).append("-");
-      sb.append(Integer.toString(maxReturn)).append("-");
-      if (parameters != null)
-      {
-        int i = 0;
-        while (i < parameters.size())
-        {
-          sb.append(parameters.get(i++)).append("-");
-        }
-      }
-      // For the return specification, we can be specific.
-      if (spec != null)
-        sb.append(":").append(spec.toString());
-
-      // For return limit, we really can't be very specific.  The critical section will therefore interact all
-      // limited queries with out distinction about the kind of limit.
-      if (returnLimit != null && returnLimit.doesCompareWork())
-        sb.append(":limited");
-
-      criticalSectionName = sb.toString();
-    }
-    return criticalSectionName;
-  }
-
-  protected static List listClone(List list)
-  {
-    List rval = new ArrayList(list.size());
-    for (Object o : list)
-    {
-      rval.add(o);
-    }
-    return rval;
-  }
-  
-}
-
-
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/RRow.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/RRow.java
deleted file mode 100644
index d56bf85..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/RRow.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: RRow.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class represents a result row.
-*/
-public class RRow implements IResultRow
-{
-  public static final String _rcsid = "@(#)$Id: RRow.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected Map<String,Object> rowData = new HashMap<String,Object>();
-
-  public RRow()
-  {
-  }
-
-  public void put(String name, Object value)
-  {
-    rowData.put(name,value);
-  }
-
-  /** Obtain the number of columns in the row.
-  *@return the number of columns that row contains.
-  */
-  public int getColumnCount()
-  {
-    return rowData.size();
-  }
-
-  /** Obtain the set of columns for a row.
-  @return an iterator that will list all the (String) column names stored in that row.
-  */
-  public Iterator<String> getColumns()
-  {
-    return rowData.keySet().iterator();
-  }
-
-  /** Get the row value for a column.
-  *@param columnName is the name of the column.
-  *@return the value, or null if not present.
-  */
-  public Object getValue(String columnName)
-  {
-    return rowData.get(columnName);
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/RSet.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/RSet.java
deleted file mode 100644
index 731f0e2..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/RSet.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id: RSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-public class RSet implements IResultSet
-{
-  public static final String _rcsid = "@(#)$Id: RSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Instance of a result
-  protected List<IResultRow> rows = new ArrayList<IResultRow>();
-
-  public RSet()
-  {
-  }
-
-  /** Add a row of data to the resultset.
-  */
-  public void addRow(IResultRow m)
-  {
-    rows.add(m);
-  }
-
-  /** Get a specific row in the resultset.
-  *@param rowNumber is the number of the row.
-  *@return the immutable row description, or null if there is no such row.
-  */
-  public IResultRow getRow(int rowNumber)
-  {
-    return rows.get(rowNumber);
-  }
-
-  /** Get the number of rows in this resultset.
-  *@return the number of rows the resultset contains.
-  */
-  public int getRowCount()
-  {
-    return rows.size();
-  }
-
-  /** Get an array of all the rows.
-  * This method is NOT preferred because it requires a new
-  * array object to be constructed.
-  *@return the array.
-  */
-  public IResultRow[] getRows()
-  {
-    IResultRow[] rval = new IResultRow[rows.size()];
-    int i = 0;
-    while (i < rows.size())
-    {
-      rval[i] = rows.get(i);
-      i++;
-    }
-    return rval;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/database/TransactionHandle.java b/framework/core/src/main/java/org/apache/manifoldcf/core/database/TransactionHandle.java
deleted file mode 100644
index b2f82f6..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/database/TransactionHandle.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id: TransactionHandle.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.database;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-
-/** This class represents all the data that describes a transaction, including:
-* (2) the previous transaction handle,
-* (3) the unique transaction id,
-* (4) the cache keys that have been invalidated within this transaction.
-*/
-public class TransactionHandle
-{
-  public static final String _rcsid = "@(#)$Id: TransactionHandle.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected TransactionHandle previousTransaction;
-  protected String transactionID;
-  protected int transactionType;
-
-  public TransactionHandle(IThreadContext tc, TransactionHandle previousTransaction, int transactionType)
-    throws ManifoldCFException
-  {
-    // Grab a unique ID
-    transactionID = IDFactory.make(tc);
-    this.previousTransaction = previousTransaction;
-    this.transactionType = transactionType;
-  }
-
-  public String getTransactionID()
-  {
-    return transactionID;
-  }
-
-  public TransactionHandle getParent()
-  {
-    return previousTransaction;
-  }
-
-  public int getTransactionType()
-  {
-    return transactionType;
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/i18n/MCFVelocityResourceLoader.java b/framework/core/src/main/java/org/apache/manifoldcf/core/i18n/MCFVelocityResourceLoader.java
deleted file mode 100644
index 2fb38ed..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/i18n/MCFVelocityResourceLoader.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.i18n;
-
-import java.io.*;
-
-/** Our own Velocity resource loader, which uses our class resolution to find Velocity template resources.
-*/
-public class MCFVelocityResourceLoader extends org.apache.velocity.runtime.resource.loader.ResourceLoader
-{
-  protected Class classInstance;
-  
-  /** Constructor.
-  */
-  public MCFVelocityResourceLoader(Class classInstance)
-  {
-    this.classInstance = classInstance;
-  }
-
-  public long getLastModified(org.apache.velocity.runtime.resource.Resource resource)
-  {
-    return 0L;
-  }
-  
-  public InputStream getResourceStream(String source)
-    throws org.apache.velocity.exception.ResourceNotFoundException
-  {
-    InputStream rval = classInstance.getResourceAsStream(source);
-    if (rval == null)
-      throw new org.apache.velocity.exception.ResourceNotFoundException("Resource '"+source+"' not found.");
-    return rval;
-  }
-
-  public void init(org.apache.commons.collections.ExtendedProperties configuration)
-  {
-    // Does nothing
-  }
-
-  public boolean isSourceModified(org.apache.velocity.runtime.resource.Resource resource)
-  {
-    // This obviously supports caching, which we don't need and may mess us up if the caching is cross-instance
-    return true;
-  }
-
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/i18n/Messages.java b/framework/core/src/main/java/org/apache/manifoldcf/core/i18n/Messages.java
deleted file mode 100644
index 4e7b304..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/i18n/Messages.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/* $Id: Messages.java 1001023 2011-12-12 18:41:28Z hozawa $ */
-
-/**
-* 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 org.apache.manifoldcf.core.i18n;
-
-import java.text.MessageFormat;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Vector;
-
-import java.io.InputStream;
-
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.runtime.RuntimeConstants;
-
-public class Messages
-{
-  // Keep track of messages and bundles we've already complained about.
-  
-  protected static Set<BundleKey> bundleSet = new HashSet<BundleKey>();
-  protected static Set<MessageKey> messageSet = new HashSet<MessageKey>();
-  protected static Set<ResourceKey> resourceSet = new HashSet<ResourceKey>();
-  
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-  
-  /** Create and initialize a velocity engine instance, given a class.
-  */
-  public static VelocityEngine createVelocityEngine(Class classInstance)
-    throws ManifoldCFException
-  {
-    VelocityEngine engine = new VelocityEngine();
-    // Now configure it
-    org.apache.commons.collections.ExtendedProperties configuration = new org.apache.commons.collections.ExtendedProperties();
-    // This is the property that describes the id's of the resource loaders.
-    configuration.setProperty(VelocityEngine.RESOURCE_LOADER,"mcf");
-    // This is the property which describes the resource loader itself
-    configuration.setProperty("mcf."+VelocityEngine.RESOURCE_LOADER+".instance",new MCFVelocityResourceLoader(classInstance));
-    engine.setExtendedProperties(configuration);
-    engine.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-      "org.apache.velocity.runtime.log.Log4JLogChute" );
-    engine.setProperty("runtime.log.logsystem.log4j.logger",
-      "velocity");
-    return engine;
-  }
-  
-  
-  /** Read a resource as an input stream, given a class, path, locale, and resource key.
-  */
-  public static InputStream getResourceAsStream(Class classInstance, String pathName,
-    Locale originalLocale, String resourceKey)
-    throws ManifoldCFException
-  {
-    Locale locale = originalLocale;
-    InputStream is = classInstance.getResourceAsStream(localizeResourceName(pathName,resourceKey,locale));
-    if (is == null)
-    {
-      complainMissingResource("No resource in path '"+pathName+"' named '"+resourceKey+"' found for locale '"+locale.toString()+"'",
-        new Exception("Resource not found"),pathName,locale,resourceKey);
-      locale = new Locale(locale.getLanguage());
-      is = classInstance.getResourceAsStream(localizeResourceName(pathName,resourceKey,locale));
-      if (is == null)
-      {
-        complainMissingResource("No resource in path '"+pathName+"' named '"+resourceKey+"' found for locale '"+locale.toString()+"'",
-          new Exception("Resource not found"),pathName,locale,resourceKey);
-        locale = Locale.US;
-        is = classInstance.getResourceAsStream(localizeResourceName(pathName,resourceKey,locale));
-        if (is == null)
-        {
-          complainMissingResource("No resource in path '"+pathName+"' named '"+resourceKey+"' found for locale '"+locale.toString()+"'",
-            new Exception("Resource not found"),pathName,locale,resourceKey);
-          locale = new Locale(locale.getLanguage());
-          is = classInstance.getResourceAsStream(localizeResourceName(pathName,resourceKey,locale));
-          if (is == null)
-          {
-            complainMissingResource("No resource in path '"+pathName+"' named '"+resourceKey+"' found for locale '"+locale.toString()+"'",
-              new Exception("Resource not found"),pathName,locale,resourceKey);
-            is = classInstance.getResourceAsStream(localizeResourceName(pathName,resourceKey,null));
-            if (is == null)
-              throw new ManifoldCFException("No matching language resource in path '"+pathName+"' named '"+resourceKey+"' found for locale '"+originalLocale.toString()+"'");
-          }
-        }
-      }
-    }
-    return is;
-  }
-  
-  private static String localizeResourceName(String pathName, String resourceName, Locale locale)
-  {
-    // Path names temporarily disabled, since they don't work.
-    // MHL
-    if (locale == null)
-      return /*pathName + "." + */resourceName;
-    int dotIndex = resourceName.lastIndexOf(".");
-    if (dotIndex == -1)
-      return /*pathName + "." + */resourceName + "_" + locale.toString();
-    return /*pathName + "." + */resourceName.substring(0,dotIndex) + "_" + locale.toString() + resourceName.substring(dotIndex);
-  }
-  
-  /** Obtain a resource bundle given a class, bundle name, and locale.
-  *@return null if the resource bundle could not be found.
-  */
-  public static ResourceBundle getResourceBundle(Class clazz, String bundleName, Locale locale)
-  {
-    ResourceBundle resources;
-    ClassLoader classLoader = clazz.getClassLoader();
-    try
-    {
-      resources = ResourceBundle.getBundle(bundleName, locale, classLoader);
-    }
-    catch (MissingResourceException e)
-    {
-      complainMissingBundle("Missing resource bundle '" + bundleName + "' for locale '"+locale.toString()+"': "+e.getMessage()+"; trying "+locale.getLanguage(),
-        e,bundleName,locale);
-      // Try plain language next
-      locale = new Locale(locale.getLanguage());
-      try
-      {
-        resources = ResourceBundle.getBundle(bundleName, locale, classLoader);
-      }
-      catch (MissingResourceException e2)
-      {
-        // Use English if we don't have a bundle for the current locale
-        complainMissingBundle("Missing resource bundle '" + bundleName + "' for locale '"+locale.toString()+"': "+e2.getMessage()+"; trying en_US",
-          e2,bundleName,locale);
-        locale = Locale.US;
-        try
-        {
-          resources = ResourceBundle.getBundle(bundleName, locale, classLoader);
-        }
-        catch (MissingResourceException e3)
-        {
-          complainMissingBundle("No backup en_US bundle found! "+e3.getMessage(),e3,bundleName,locale);
-          locale = new Locale(locale.getLanguage());
-          try
-          {
-            resources = ResourceBundle.getBundle(bundleName, locale, classLoader);
-          }
-          catch (MissingResourceException e4)
-          {
-            complainMissingBundle("No backup en bundle found! "+e4.getMessage(),e4,bundleName,locale);
-            return null;
-          }
-        }
-      }
-    }
-    return resources;
-  }
-  
-  /** Obtain a message given a resource bundle and message key.
-  *@return null if the message could not be found.
-  */
-  public static String getMessage(Class clazz, String bundleName, Locale locale, String messageKey)
-  {
-    ResourceBundle resources = getResourceBundle(clazz,bundleName,locale);
-    if (resources == null)
-      return null;
-    
-    return getMessage(resources,bundleName,locale,messageKey);
-  }
-  
-  /** Obtain a message given a resource bundle and message key.
-  *@return null if the message could not be found.
-  */
-  public static String getMessage(ResourceBundle resources, String bundleName, Locale locale, String messageKey)
-  {
-    String message;
-    try
-    {
-      return resources.getString(messageKey);
-    }
-    catch (MissingResourceException e)
-    {
-      complainMissingMessage("Missing resource '" + messageKey + "' in bundle '" + bundleName + "' for locale '"+locale.toString()+"'",
-        e,bundleName,locale,messageKey);
-      return null;
-    }
-  }
-  
-  /** Obtain a string given a resource bundle and message key.
-  */
-  public static String getString(ResourceBundle resourceBundle, String bundleName,
-    Locale locale, String messageKey)
-  {
-    return getString(resourceBundle, bundleName, locale, messageKey, null);
-  }
-  
-  /** Obtain a string given a class, bundle, locale, message key, and arguments.
-  */
-  public static String getString(Class clazz, String bundleName, Locale locale,
-    String messageKey, Object[] args)
-  {
-    String message = getMessage(clazz,bundleName,locale,messageKey);
-    if (message == null)
-      return messageKey;
-
-    // Format the message
-    String formatMessage;
-    if (args != null)
-    {
-      MessageFormat fm = new MessageFormat(message, Locale.ROOT);
-      fm.setLocale(locale);
-      formatMessage = fm.format(args);
-    }
-    else
-    {
-      formatMessage = message;
-    }
-    return formatMessage;
-  }
-
-  /** Obtain a string given a resource bundle, message key, and arguments.
-  */
-  public static String getString(ResourceBundle resourceBundle, String bundleName,
-    Locale locale, String messageKey, Object[] args)
-  {
-    String message = getMessage(resourceBundle,bundleName,locale,messageKey);
-    if (message == null)
-      return messageKey;
-
-    // Format the message
-    String formatMessage;
-    if (args != null)
-    {
-      if (locale == null) {
-        locale = Locale.ROOT;
-      }
-      MessageFormat fm = new MessageFormat(message, locale);
-      formatMessage = fm.format(args);
-    }
-    else
-    {
-      formatMessage = message;
-    }
-    return formatMessage;
-
-  }
-  
-  protected static void complainMissingBundle(String errorMessage, Throwable exception, String bundleName, Locale locale)
-  {
-    String localeName = locale.toString();
-    BundleKey bk = new BundleKey(bundleName,localeName);
-    synchronized (bundleSet)
-    {
-      if (bundleSet.contains(bk))
-        return;
-      bundleSet.add(bk);
-    }
-    logError(errorMessage,exception);
-  }
-  
-  protected static void complainMissingMessage(String errorMessage, Throwable exception, String bundleName, Locale locale, String messageKey)
-  {
-    String localeName = locale.toString();
-    MessageKey bk = new MessageKey(bundleName,localeName,messageKey);
-    synchronized (messageSet)
-    {
-      if (messageSet.contains(bk))
-        return;
-      messageSet.add(bk);
-    }
-    logError(errorMessage,exception);
-  }
-
-  protected static void complainMissingResource(String errorMessage, Throwable exception, String pathName, Locale locale, String resourceKey)
-  {
-    String localeName = locale.toString();
-    ResourceKey bk = new ResourceKey(pathName,localeName,resourceKey);
-    synchronized (resourceSet)
-    {
-      if (resourceSet.contains(bk))
-        return;
-      resourceSet.add(bk);
-    }
-    logError(errorMessage,exception);
-  }
-
-  protected static void logError(String errorMessage, Throwable exception)
-  {
-    if (Logging.misc == null)
-    {
-      System.err.println(errorMessage);
-      exception.printStackTrace(System.err);
-    }
-    else
-      Logging.misc.error(errorMessage,exception);
-  }
-
-  /** Class to help keep track of the missing resource bundles we've already complained about,
-  * so we don't fill up the standard out log with repetitive stuff. */
-  protected static class BundleKey
-  {
-    protected String bundleName;
-    protected String localeName;
-    
-    public BundleKey(String bundleName, String localeName)
-    {
-      this.bundleName = bundleName;
-      this.localeName = localeName;
-    }
-    
-    public int hashCode()
-    {
-      return bundleName.hashCode() + localeName.hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof BundleKey))
-        return false;
-      BundleKey b = (BundleKey)o;
-      return b.bundleName.equals(bundleName) && b.localeName.equals(localeName);
-    }
-  }
-
-  /** Class to help keep track of the missing messages we've already complained about,
-  * so we don't fill up the standard out log with repetitive stuff. */
-  protected static class MessageKey
-  {
-    protected String bundleName;
-    protected String localeName;
-    protected String messageKey;
-    
-    public MessageKey(String bundleName, String localeName, String messageKey)
-    {
-      this.bundleName = bundleName;
-      this.localeName = localeName;
-      this.messageKey = messageKey;
-    }
-    
-    public int hashCode()
-    {
-      return bundleName.hashCode() + localeName.hashCode() + messageKey.hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof MessageKey))
-        return false;
-      MessageKey b = (MessageKey)o;
-      return b.bundleName.equals(bundleName) && b.localeName.equals(localeName) && b.messageKey.equals(messageKey);
-    }
-  }
-
-  /** Class to help keep track of the missing resources we've already complained about,
-  * so we don't fill up the standard out log with repetitive stuff. */
-  protected static class ResourceKey
-  {
-    protected String pathName;
-    protected String localeName;
-    protected String resourceKey;
-    
-    public ResourceKey(String pathName, String localeName, String resourceKey)
-    {
-      this.pathName = pathName;
-      this.localeName = localeName;
-      this.resourceKey = resourceKey;
-    }
-    
-    public int hashCode()
-    {
-      return pathName.hashCode() + localeName.hashCode() + resourceKey.hashCode();
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ResourceKey))
-        return false;
-      ResourceKey b = (ResourceKey)o;
-      return b.pathName.equals(pathName) && b.localeName.equals(localeName) && b.resourceKey.equals(resourceKey);
-    }
-  }
-
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/AuthFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/AuthFactory.java
deleted file mode 100644
index e7bc5f7..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/AuthFactory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.lang.reflect.*;
-
-/** This is the factory class for an IAuth.
-*/
-public class AuthFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final static String authName = "_Auth_";
-
-  private AuthFactory()
-  {
-  }
-
-  public static IAuth make(IThreadContext context)
-    throws ManifoldCFException
-  {
-    Object x = context.get(authName);
-    if (x == null || !(x instanceof IAuth))
-    {
-      String implementationClass = LockManagerFactory.getStringProperty(context, ManifoldCF.authImplementation,
-        "org.apache.manifoldcf.core.auth.DefaultAuthenticator");
-      try
-      {
-        Class c = Class.forName(implementationClass);
-        Constructor constructor = c.getConstructor(new Class[]{IThreadContext.class});
-        x = constructor.newInstance(new Object[]{context});
-        if (!(x instanceof IAuth))
-          throw new ManifoldCFException("Auth implementation class "+implementationClass+" does not implement IAuth",ManifoldCFException.SETUP_ERROR);
-        context.save(authName,x);
-      }
-      catch (ClassNotFoundException e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" could not be found: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (ExceptionInInitializerError e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (LinkageError e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" could not be linked: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (InstantiationException e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (InvocationTargetException e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (NoSuchMethodException e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" had no constructor taking (IThreadContext): "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (IllegalAccessException e)
-      {
-        throw new ManifoldCFException("Auth implementation class "+implementationClass+" had no public constructor taking (IThreadContext): "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-    }
-    return (IAuth)x;
-
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/BinaryInput.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/BinaryInput.java
deleted file mode 100644
index 09c9188..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/BinaryInput.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/* $Id: BinaryInput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-
-/** This class represents a lightweight length-determined stream.  It is used
-* as a parameter in parameterized queries that use blobs.
-* There are no implied semantics in this class around managing the stream itself.
-* These semantics must be handled by a derived class.
-*/
-public abstract class BinaryInput extends PersistentDatabaseObject
-{
-  public static final String _rcsid = "@(#)$Id: BinaryInput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected InputStream stream;
-  protected long length;
-
-  /** Construct from nothing.
-  */
-  public BinaryInput()
-  {
-    stream = null;
-    length = -1L;
-  }
-
-  /** Obtain the stream to pass to JDBC */
-  public InputStream getStream()
-    throws ManifoldCFException
-  {
-    if (stream == null)
-      openStream();
-    return stream;
-  }
-
-  /** Obtain the length to pass to JDBC */
-  public long getLength()
-    throws ManifoldCFException
-  {
-    if (length == -1L)
-      calculateLength();
-    return length;
-  }
-
-  /** Close the stream we passed to JDBC */
-  @Override
-  public void doneWithStream()
-    throws ManifoldCFException
-  {
-    if (stream != null)
-      closeStream();
-  }
-
-  /** Transfer to a new object; this causes the current object to become "already discarded" */
-  public abstract BinaryInput transfer();
-
-  /** Discard the object */
-  @Override
-  public void discard()
-    throws ManifoldCFException
-  {
-    doneWithStream();
-  }
-
-  // Protected methods
-
-  protected abstract void openStream()
-    throws ManifoldCFException;
-
-  protected abstract void calculateLength()
-    throws ManifoldCFException;
-
-  /** Close the stream */
-  protected void closeStream()
-    throws ManifoldCFException
-  {
-    try
-    {
-      stream.close();
-      stream = null;
-    }
-    catch (IOException e)
-    {
-      handleIOException(e,"closing stream");
-    }
-  }
-
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException
-  {
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException("IO exception while "+context+": "+e.getMessage(),e);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CacheKeyFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CacheKeyFactory.java
deleted file mode 100644
index 0582206..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CacheKeyFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/* $Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This class just represents a central place where cache keys are assembled.
-* All methods are static.
-*/
-public class CacheKeyFactory
-{
-  public static final String _rcsid = "@(#)$Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private static final String DATABASE = "DB-";
-  private static final String DASH = "-";
-  private static final String TABLE = "TBL-";
-
-
-  protected CacheKeyFactory()
-  {
-  }
-
-  /** Construct a key that is database specific.
-  * Typically, this
-  * method is not called directly; it gets invoked by other key construction
-  * methods.
-  * Overall, it will be called last in a compositional sequence that looks
-  * conceptually like this:
-  * makeDatabaseKey(makeTableKey(makeThingsTableTypeKey(typeX),"Things"),databaseName);
-  *@param keyName is the input keyname
-  *@param databaseName is the database name
-  *@return the qualified key name
-  */
-  public static String makeDatabaseKey(String keyName, String databaseName)
-  {
-    String rval;
-    if (keyName == null)
-      rval = DATABASE+databaseName;
-    else
-      rval = DATABASE+databaseName+DASH+keyName;
-    return rval;
-  }
-
-  /** Construct a key that is database specific, and applies to queries
-  * made against a specific table name.
-  */
-  public static String makeTableKey(String keyName, String tableName, String databaseName)
-  {
-    String rval;
-    if (keyName == null)
-      rval = TABLE+tableName;
-    else
-      rval = TABLE+tableName+DASH+keyName;
-    return makeDatabaseKey(rval,databaseName);
-  }
-
-
-  /** Construct a general database cache key.
-  *@param databaseName is the database name.
-  *@return the cache key.
-  */
-  public static String makeDatabaseKey(String databaseName)
-  {
-    return makeDatabaseKey("GENERAL",databaseName);
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CacheManagerFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CacheManagerFactory.java
deleted file mode 100644
index b252ff5..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CacheManagerFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $Id: CacheManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** Factory class for instantiating the cache manager.
-*/
-public class CacheManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: CacheManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final static String cacheManager = "_CacheManager_";
-
-  private CacheManagerFactory()
-  {
-  }
-
-  /** Return a cache manager instance that any client can use to obtain cache management services.
-  * This service will use the lock manager, so it needs to have a thread context.
-  * @return the proper cache manager instance.
-  */
-  public static ICacheManager make(IThreadContext context)
-    throws ManifoldCFException
-  {
-    Object o = context.get(cacheManager);
-    if (o == null || !(o instanceof ICacheManager))
-    {
-      o = new org.apache.manifoldcf.core.cachemanager.CacheManager(context);
-      context.save(cacheManager,o);
-    }
-    return (ICacheManager)o;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CharacterInput.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CharacterInput.java
deleted file mode 100644
index 778a32a..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/CharacterInput.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/* $Id: CharacterInput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-
-/** This class represents a lightweight length-determined character stream.  It is used
-* as a parameter in parameterized queries that use strings.
-* There are no implied semantics in this class around managing the stream itself.
-* These semantics must be handled by a derived class.
-*/
-public abstract class CharacterInput extends PersistentDatabaseObject
-{
-  public static final String _rcsid = "@(#)$Id: CharacterInput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected Reader stream = null;
-  protected long charLength = -1L;
-  protected String hashValue = null;
-
-  /** Construct from nothing.
-  */
-  public CharacterInput()
-  {
-    stream = null;
-    charLength = -1L;
-  }
-
-  public Reader getStream()
-    throws ManifoldCFException
-  {
-    if (stream == null)
-      openStream();
-    return stream;
-  }
-
-  @Override
-  public void doneWithStream()
-    throws ManifoldCFException
-  {
-    if (stream != null)
-      closeStream();
-  }
-
-  public long getCharacterLength()
-    throws ManifoldCFException
-  {
-    if (charLength == -1L)
-      calculateLength();
-    return charLength;
-  }
-
-  public String getHashValue()
-    throws ManifoldCFException
-  {
-    if (hashValue == null)
-      calculateHashValue();
-    return hashValue;
-  }
-
-  /** Open a Utf8 stream directly */
-  public abstract InputStream getUtf8Stream()
-    throws ManifoldCFException;
-
-  /** Get binary UTF8 stream length directly */
-  public abstract long getUtf8StreamLength()
-    throws ManifoldCFException;
-
-  /** Transfer to a new object; this causes the current object to become "already discarded" */
-  public abstract CharacterInput transfer();
-
-  /** Discard this object permanently */
-  @Override
-  public void discard()
-    throws ManifoldCFException
-  {
-    doneWithStream();
-  }
-
-  // Protected methods
-
-  /** Open a reader, for use by a caller, until closeStream is called */
-  protected abstract void openStream()
-    throws ManifoldCFException;
-
-  /** Close any open reader */
-  protected void closeStream()
-    throws ManifoldCFException
-  {
-    try
-    {
-      stream.close();
-      stream = null;
-    }
-    catch (IOException e)
-    {
-      handleIOException(e, "closing stream");
-    }
-  }
-
-  /** Calculate the datum's length in characters */
-  protected abstract void calculateLength()
-    throws ManifoldCFException;
-
-  /** Calculate the datum's hash value */
-  protected abstract void calculateHashValue()
-    throws ManifoldCFException;
-
-  protected static void handleIOException(IOException e, String context)
-    throws ManifoldCFException
-  {
-    if (e instanceof InterruptedIOException)
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    throw new ManifoldCFException("IO exception while "+context+": "+e.getMessage(),e);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ClauseDescription.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ClauseDescription.java
deleted file mode 100644
index 3d5ddd7..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ClauseDescription.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-public interface ClauseDescription
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get the column name */
-  public String getColumnName();
-  
-  /** Get the operation string */
-  public String getOperation();
-  
-  /** Get the individual values */
-  public List getValues();
-  
-  /** Get the join column name */
-  public String getJoinColumnName();
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ColumnDescription.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ColumnDescription.java
deleted file mode 100644
index 1af6a69..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ColumnDescription.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $Id: ColumnDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** Describe a database column.
-*/
-public class ColumnDescription
-{
-  public static final String _rcsid = "@(#)$Id: ColumnDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected String typeString;
-  protected boolean isPrimaryKey;
-  protected boolean isNull;
-  protected String referenceTable;
-  protected String referenceColumn;
-  protected boolean referenceCascade;
-
-  /** Create a column type description.
-  * Use the output of this method in the columnMap with performCreate().
-  *@param typeString is a type specification
-  *@param isPrimaryKey describes whether the column is a primary key
-  *@param isNull describes whether the column is nullable
-  *@param referenceTable describes the reference table, if any.
-  *@param referenceCascade is true if deletes should be cascaded.
-  *returns a column description object.
-  */
-  public ColumnDescription(String typeString, boolean isPrimaryKey,
-    boolean isNull, String referenceTable, String referenceColumn,
-    boolean referenceCascade)
-  {
-    this.typeString = typeString;
-    this.isPrimaryKey = isPrimaryKey;
-    this.isNull = isNull;
-    this.referenceTable = referenceTable;
-    this.referenceColumn = referenceColumn;
-    this.referenceCascade = referenceCascade;
-  }
-
-  public String getTypeString()
-  {
-    return typeString;
-  }
-
-  public boolean getIsPrimaryKey()
-  {
-    return isPrimaryKey;
-  }
-
-  public boolean getIsNull()
-  {
-    return isNull;
-  }
-
-  public String getReferenceTable()
-  {
-    return referenceTable;
-  }
-
-  public String getReferenceColumn()
-  {
-    return referenceColumn;
-  }
-
-  public boolean getReferenceCascade()
-  {
-    return referenceCascade;
-  }
-
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigNode.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigNode.java
deleted file mode 100644
index bab95d4..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigNode.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id: ConfigNode.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.util.*;
-
-/** This class represents a node in a repository configuration structure.  Its existence apart from ConfigurationNode is
-* largely a relic.
-*/
-public class ConfigNode extends ConfigurationNode
-{
-  public static final String _rcsid = "@(#)$Id: ConfigNode.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Constructor.
-  */
-  public ConfigNode(String type)
-  {
-    super(type);
-  }
-
-  /** Copy constructor.
-  */
-  public ConfigNode(ConfigurationNode source)
-  {
-    super(source);
-  }
-  
-  /** Create a new node of this same type and class.
-  */
-  protected ConfigurationNode createNewNode()
-  {
-    return new ConfigNode(type);
-  }
-
-  /** Make a new node that is a copy of the specified node.
-  */
-  protected ConfigurationNode createNewNode(ConfigurationNode source)
-  {
-    return new ConfigNode(source);
-  }
-  
-  /** Duplicate.
-  *@return the duplicate.
-  */
-  public ConfigNode duplicate(boolean readOnly)
-  {
-    return (ConfigNode)createDuplicate(readOnly);
-  }
-
-  /** Get child n.
-  *@param index is the child number.
-  *@return the child node.
-  */
-  public ConfigNode getChild(int index)
-  {
-    return (ConfigNode)findChild(index);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigParams.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigParams.java
deleted file mode 100644
index 44c1e89..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigParams.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/* $Id: ConfigParams.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** This class represents a set of configuration parameters, with structure, which is a generalized hierarchy of nodes that
-* can be interpreted by a repository or authority connector in an appropriate way.
-*/
-public class ConfigParams extends Configuration
-{
-  public static final String _rcsid = "@(#)$Id: ConfigParams.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The parameter type node */
-  protected final static String PARAMETER_TYPE = "_PARAMETER_";
-  protected final static String ATTR_NAME = "name";
-
-  // The parameter map (which stores name/value pairs also listed in the children)
-  protected Map<String,String> params = new HashMap<String,String>();
-
-  /** Constructor.
-  */
-  public ConfigParams()
-  {
-    super("configuration");
-  }
-
-  /** Constructor.
-  *@param map is the initialized (mutable) map describing the name/value configuration parameters.
-  * This method of setting up a ConfigParams object will go away when the parameters are all in XML.
-  */
-  public ConfigParams(Map<String,String> map)
-  {
-    super("configuration");
-    Iterator<String> iter = map.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String key = iter.next();
-      String value = map.get(key);
-      ConfigNode cn = new ConfigNode(PARAMETER_TYPE);
-      cn.setAttribute(ATTR_NAME,key);
-      cn.setValue(value);
-      addChild(getChildCount(),cn);
-    }
-  }
-
-  /** Construct from XML.
-  *@param xml is the input XML.
-  */
-  public ConfigParams(String xml)
-    throws ManifoldCFException
-  {
-    super("configuration");
-    fromXML(xml);
-  }
-
-  /** Construct from XML.
-  *@param xmlstream is the input XML stream.  Does NOT close the stream.
-  */
-  public ConfigParams(InputStream xmlstream)
-    throws ManifoldCFException
-  {
-    super("configuration");
-    fromXML(xmlstream);
-  }
-
-  /** Create a new object of the appropriate class.
-  */
-  protected Configuration createNew()
-  {
-    return new ConfigParams();
-  }
-
-  /** Create a new child node of the appropriate type and class.
-  */
-  protected ConfigurationNode createNewNode(String type)
-  {
-    return new ConfigNode(type);
-  }
-  
-  /** Note the removal of all outer nodes.
-  */
-  protected void clearOuterNodes()
-  {
-    params.clear();
-  }
-  
-  /** Note the addition of a new outer node.
-  *@param node is the node that was just read.
-  */
-  protected void addOuterNode(ConfigurationNode node)
-  {
-    if (node.getType().equals(PARAMETER_TYPE))
-    {
-      String name = node.getAttributeValue(ATTR_NAME);
-      String value = node.getValue();
-      if (name != null && value != null)
-        params.put(name,value);
-    }
-  }
-  
-  /** Note the removal of an outer node.
-  *@param node is the node that was just removed.
-  */
-  protected void removeOuterNode(ConfigurationNode node)
-  {
-    if (node.getType().equals(PARAMETER_TYPE))
-    {
-      String name = node.getAttributeValue(ATTR_NAME);
-      if (name != null)
-        params.remove(name);
-    }
-  }
-
-  /** Get a parameter value.
-  *@param key is the name of the parameter.
-  *@return the value.
-  */
-  public String getParameter(String key)
-  {
-    return params.get(key);
-  }
-
-  /** Get an obfuscated parameter value.
-  *@param key is the name of the parameter.
-  *@return the unobfuscated value.
-  */
-  public String getObfuscatedParameter(String key)
-  {
-    String rval = getParameter(key);
-    if (rval == null)
-      return rval;
-    try
-    {
-      return ManifoldCF.deobfuscate(rval);
-    }
-    catch (ManifoldCFException e)
-    {
-      // Ignore this exception, and return an empty string.
-      return "";
-    }
-  }
-
-  /** Set a parameter value.
-  *@param key is the name of the parameter.
-  *@param value is the new value, or null if we should
-  * delete the value.
-  */
-  public void setParameter(String key, String value)
-  {
-    // See if we've got it
-    if (params.get(key) != null)
-    {
-      // Linear scan.  This is ugly, but this method is deprecated and it will go away shortly.
-      int i = 0;
-      while (i < children.size())
-      {
-        ConfigNode node = (ConfigNode)children.get(i);
-        if (node.getType().equals(PARAMETER_TYPE))
-        {
-          String name = node.getAttributeValue(ATTR_NAME);
-          if (name.equals(key))
-          {
-            removeChild(i);
-            break;
-          }
-        }
-        i++;
-      }
-    }
-    if (value != null)
-    {
-      ConfigNode cn = new ConfigNode(PARAMETER_TYPE);
-      cn.setAttribute(ATTR_NAME,key);
-      cn.setValue(value);
-      addChild(getChildCount(),cn);
-    }
-  }
-
-  /** Set an obfuscated parameter.
-  *@param key is the name of the parameter.
-  *@param value is the unobfuscated new value, or null if delete request.
-  */
-  public void setObfuscatedParameter(String key, String value)
-  {
-    if (value != null)
-    {
-      try
-      {
-        value = ManifoldCF.obfuscate(value);
-      }
-      catch (ManifoldCFException e)
-      {
-        // Ignore this exception, and set "" to be the value
-        value = "";
-      }
-    }
-    setParameter(key,value);
-  }
-
-  /** List parameters.
-  */
-  public Iterator listParameters()
-  {
-    return params.keySet().iterator();
-  }
-
-  /** Duplicate.
-  *@return an exact duplicate
-  */
-  public ConfigParams duplicate()
-  {
-    return (ConfigParams)createDuplicate(false);
-  }
-
-  /** Get child node.
-  *@param index is the node number.
-  *@return the node.
-  */
-  public ConfigNode getChild(int index)
-  {
-    return (ConfigNode)findChild(index);
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java
deleted file mode 100644
index 29a12c4..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Configuration.java
+++ /dev/null
@@ -1,951 +0,0 @@
-/* $Id: Configuration.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.common.XMLDoc;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-
-/** This class represents XML configuration information, in its most basic incarnation.
-*/
-public class Configuration implements IHierarchyParent
-{
-  public static final String _rcsid = "@(#)$Id: Configuration.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // JSON special key values
-  
-  protected static final String JSON_ATTRIBUTE = "_attribute_";
-  protected static final String JSON_VALUE = "_value_";
-  protected static final String JSON_CHILDREN = "_children_";
-  protected static final String JSON_TYPE = "_type_";
-  
-  // The root node type
-  protected String rootNodeLabel;
-  // The children
-  protected List<ConfigurationNode> children = new ArrayList<ConfigurationNode>();
-  // Read-only flag
-  protected boolean readOnly = false;
-
-  /** Constructor.
-  */
-  public Configuration()
-  {
-    rootNodeLabel = "data";
-  }
-
-  /** Constructor.
-  *@param rootNodeLabel is the root node label to use.
-  */
-  public Configuration(String rootNodeLabel)
-  {
-    this.rootNodeLabel = rootNodeLabel;
-  }
-
-  /** Create a new object of the appropriate class.
-  *@return the newly-created configuration object.
-  */
-  protected Configuration createNew()
-  {
-    return new Configuration();
-  }
-  
-  /** Create a new child node of the appropriate type and class.
-  *@return the newly-created node.
-  */
-  protected ConfigurationNode createNewNode(String type)
-  {
-    return new ConfigurationNode(type);
-  }
-  
-  /** Note the removal of all outer nodes.
-  */
-  protected void clearOuterNodes()
-  {
-  }
-  
-  /** Note the addition of a new outer node.
-  *@param node is the node that was just read.
-  */
-  protected void addOuterNode(ConfigurationNode node)
-  {
-  }
-  
-  /** Note the removal of an outer node.
-  *@param node is the node that was just removed.
-  */
-  protected void removeOuterNode(ConfigurationNode node)
-  {
-  }
-  
-  /** Create a duplicate.
-  */
-  protected Configuration createDuplicate(boolean readOnly)
-  {
-    if (readOnly && this.readOnly)
-      return this;
-    // Create a new object.
-    Configuration rval = createNew();
-    rval.readOnly = readOnly;
-    // Copy the children.
-    if (children != null)
-    {
-      int i = 0;
-      while (i < children.size())
-      {
-        ConfigurationNode child = children.get(i++);
-        // Duplicate the child
-        ConfigurationNode newChild = child.createDuplicate(readOnly);
-        rval.addChild(rval.getChildCount(),newChild);
-      }
-    }
-    return rval;
-  }
-  
-  /** Make the configuration read-only */
-  public void makeReadOnly()
-  {
-    if (readOnly)
-      return;
-    if (children != null)
-    {
-      int i = 0;
-      while (i < children.size())
-      {
-        ConfigurationNode child = children.get(i++);
-        child.makeReadOnly();
-      }
-    }
-    readOnly = true;
-  }
-
-  /** Get as XML
-  *@return the xml corresponding to these Configuration.
-  */
-  public String toXML()
-    throws ManifoldCFException
-  {
-    XMLDoc doc = new XMLDoc();
-    // name of root node in definition
-    Object top = doc.createElement(null,rootNodeLabel);
-    // Now, go through all children
-    int i = 0;
-    while (i < children.size())
-    {
-      ConfigurationNode node = children.get(i++);
-      writeNode(doc,top,node);
-    }
-
-    return doc.getXML();
-  }
-
-  /** Get as JSON.
-  *@return the json corresponding to this Configuration.
-  */
-  public String toJSON()
-    throws ManifoldCFException
-  {
-    JSONWriter writer = new JSONWriter();
-    writer.startObject();
-    // We do NOT use the root node label, unlike XML.
-      
-    // Now, do children.  To get the arrays right, we need to glue together all children with the
-    // same type, which requires us to do an appropriate pass to gather that stuff together.
-    // Since we also need to maintain order, it is essential that we detect the out-of-order condition
-    // properly, and use an alternate representation if we should find it.
-    Map<String,List<ConfigurationNode>> childMap = new HashMap<String,List<ConfigurationNode>>();
-    List<String> childList = new ArrayList<String>();
-    String lastChildType = null;
-    boolean needAlternate = false;
-    int i = 0;
-    while (i < getChildCount())
-    {
-      ConfigurationNode child = findChild(i++);
-      String key = child.getType();
-      List<ConfigurationNode> list = childMap.get(key);
-      if (list == null)
-      {
-        list = new ArrayList<ConfigurationNode>();
-        childMap.put(key,list);
-        childList.add(key);
-      }
-      else
-      {
-        if (!lastChildType.equals(key))
-        {
-          needAlternate = true;
-          break;
-        }
-      }
-      list.add(child);
-      lastChildType = key;
-    }
-        
-    if (needAlternate)
-    {
-      // Can't use the array representation.  We'll need to start do a _children_ object, and enumerate
-      // each child.  So, the JSON will look like:
-      // <key>:{_attribute_<attr>:xxx,_children_:[{_type_:<child_key>, ...},{_type_:<child_key_2>, ...}, ...]}
-      writer.key(JSON_CHILDREN);
-      writer.startArray();
-      i = 0;
-      while (i < getChildCount())
-      {
-        ConfigurationNode child = findChild(i++);
-        writeNode(writer,child,false,true);
-      }
-      writer.endArray();
-    }
-    else
-    {
-      // We can collapse child nodes to arrays and still maintain order.
-      // The JSON will look like this:
-      // <key>:{_attribute_<attr>:xxx,<child_key>:[stuff],<child_key_2>:[more_stuff] ...}
-      int q = 0;
-      while (q < childList.size())
-      {
-        String key = childList.get(q++);
-        List<ConfigurationNode> list = childMap.get(key);
-        if (list.size() > 1)
-        {
-          // Write it as an array
-          writer.key(key);
-          writer.startArray();
-          i = 0;
-          while (i < list.size())
-          {
-            ConfigurationNode child = list.get(i++);
-            writeNode(writer,child,false,false);
-          }
-          writer.endArray();
-        }
-        else
-        {
-          // Write it as a singleton
-          writeNode(writer,list.get(0),true,false);
-        }
-      }
-    }
-    writer.endObject();
-
-    // Convert to a string.
-    return writer.toString();
-  }
-  
-  /** Write a specification node.
-  *@param doc is the document.
-  *@param parent is the parent.
-  *@param node is the node.
-  */
-  protected static void writeNode(XMLDoc doc, Object parent, ConfigurationNode node)
-    throws ManifoldCFException
-  {
-    // Get the type
-    String type = node.getType();
-    String value = node.getValue();
-    Object o = doc.createElement(parent,type);
-    Iterator iter = node.getAttributes();
-    while (iter.hasNext())
-    {
-      String attribute = (String)iter.next();
-      String attrValue = node.getAttributeValue(attribute);
-      // Add to the element
-      doc.setAttribute(o,attribute,attrValue);
-    }
-
-    if (value != null)
-      doc.createText(o,value);
-    // Now, do children
-    int i = 0;
-    while (i < node.getChildCount())
-    {
-      ConfigurationNode child = node.findChild(i++);
-      writeNode(doc,o,child);
-    }
-  }
-
-  
-  /** Write a JSON specification node.
-  *@param writer is the JSON writer.
-  *@param node is the node.
-  *@param writeKey is true if the key needs to be written, false otherwise.
-  */
-  protected static void writeNode(JSONWriter writer, ConfigurationNode node, boolean writeKey, boolean writeSpecialKey)
-    throws ManifoldCFException
-  {
-    // Node types correspond directly to keys.  Attributes correspond to "_attribute_<attribute_name>".
-    // Get the type
-    if (writeKey)
-    {
-      String type = node.getType();
-      writer.key(type);
-    }
-    else if (writeSpecialKey)
-    {
-      writer.startObject();
-      writer.key(JSON_TYPE);
-      writer.value(node.getType());
-    }
-      
-    // Problem: Two ways of handling a naked 'value'.  First way is to NOT presume a nested object is needed.  Second way is to require a nested
-    // object.  On reconstruction, the right thing will happen, and a naked value will become a node with a value, while an object will become
-    // a node that has an optional "_value_" key inside it.
-    String value = node.getValue();
-    if (value != null && node.getAttributeCount() == 0 && node.getChildCount() == 0)
-    {
-      writer.value(value);
-    }
-    else
-    {
-      if (!writeSpecialKey)
-        writer.startObject();
-        
-      if (value != null)
-      {
-        writer.key(JSON_VALUE);
-        writer.value(value);
-      }
-        
-      Iterator<String> iter = node.getAttributes();
-      while (iter.hasNext())
-      {
-        String attribute = iter.next();
-        String attrValue = node.getAttributeValue(attribute);
-        writer.key(JSON_ATTRIBUTE+attribute);
-        writer.value(attrValue);
-      }
-
-      // Now, do children.  To get the arrays right, we need to glue together all children with the
-      // same type, which requires us to do an appropriate pass to gather that stuff together.
-      // Since we also need to maintain order, it is essential that we detect the out-of-order condition
-      // properly, and use an alternate representation if we should find it.
-      Map<String,List<ConfigurationNode>> childMap = new HashMap<String,List<ConfigurationNode>>();
-      List<String> childList = new ArrayList<String>();
-      String lastChildType = null;
-      boolean needAlternate = false;
-      int i = 0;
-      while (i < node.getChildCount())
-      {
-        ConfigurationNode child = node.findChild(i++);
-        String key = child.getType();
-        List<ConfigurationNode> list = childMap.get(key);
-        if (list == null)
-        {
-          list = new ArrayList<ConfigurationNode>();
-          childMap.put(key,list);
-          childList.add(key);
-        }
-        else
-        {
-          if (!lastChildType.equals(key))
-          {
-            needAlternate = true;
-            break;
-          }
-        }
-        list.add(child);
-        lastChildType = key;
-      }
-        
-      if (needAlternate)
-      {
-        // Can't use the array representation.  We'll need to start do a _children_ object, and enumerate
-        // each child.  So, the JSON will look like:
-        // <key>:{_attribute_<attr>:xxx,_children_:[{_type_:<child_key>, ...},{_type_:<child_key_2>, ...}, ...]}
-        writer.key(JSON_CHILDREN);
-        writer.startArray();
-        i = 0;
-        while (i < node.getChildCount())
-        {
-          ConfigurationNode child = node.findChild(i++);
-          writeNode(writer,child,false,true);
-        }
-        writer.endArray();
-      }
-      else
-      {
-        // We can collapse child nodes to arrays and still maintain order.
-        // The JSON will look like this:
-        // <key>:{_attribute_<attr>:xxx,<child_key>:[stuff],<child_key_2>:[more_stuff] ...}
-        int q = 0;
-        while (q < childList.size())
-        {
-          String key = childList.get(q++);
-          List<ConfigurationNode> list = childMap.get(key);
-          if (list.size() > 1)
-          {
-            // Write the key
-            writer.key(key);
-            // Write it as an array
-            writer.startArray();
-            i = 0;
-            while (i < list.size())
-            {
-              ConfigurationNode child = list.get(i++);
-              writeNode(writer,child,false,false);
-            }
-            writer.endArray();
-          }
-          else
-          {
-            // Write it as a singleton
-            writeNode(writer,list.get(0),true,false);
-          }
-        }
-      }
-      if (!writeSpecialKey)
-        writer.endObject();
-    }
-    if (writeSpecialKey)
-      writer.endObject();
-  }
-  
-  /** Read from XML.
-  *@param xml is the input XML.
-  */
-  public void fromXML(String xml)
-    throws ManifoldCFException
-  {
-    XMLDoc doc = new XMLDoc(xml);
-    initializeFromDoc(doc);
-  }
-  
-  /** Read from JSON.
-  *@param json is the input JSON.
-  */
-  public void fromJSON(String json)
-    throws ManifoldCFException
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-
-    clearChildren();
-    final JSONReader object = new JSONReader(json);
-    object.startObject();
-    // Convert the object into our configuration
-    final Iterator<String> iter = object.getKeys();
-    while (iter.hasNext())
-    {
-      final String key = iter.next();
-      object.valueForKey(key);
-      if (object.isArray())
-      {
-        // Iterate through.
-        object.startArray();
-        while (object.nextElement()) {
-          processObject(key,object);
-        }
-        object.endArray();
-      }
-      else
-        processObject(key,object);
-    }
-    object.endObject();
-  }
-  
-  /** Process a JSON object */
-  protected void processObject(String key, JSONReader x)
-    throws ManifoldCFException
-  {
-    if (x.isObject())
-    {
-      // Nested single object
-      ConfigurationNode cn = readNode(key,x);
-      addChild(getChildCount(),cn);
-    }
-    else if (x.isNull())
-    {
-      // Null object.  Don't enter the key.
-    }
-    else if (key.equals(JSON_CHILDREN))
-    {
-      // Children, as a list of separately enumerated child nodes.
-      if (!(x.isArray()))
-        throw new ManifoldCFException("Expected array contents for '"+JSON_CHILDREN+"' node");
-      x.startArray();
-      while (x.nextElement()) {
-        ConfigurationNode nestedCn = readNode((String)null,x);
-        addChild(getChildCount(),nestedCn);
-      }
-      x.endArray();
-    }
-    else
-    {
-      // It's a string or a number or some scalar value
-      final String value = x.readValue();
-      ConfigurationNode cn = createNewNode(key);
-      cn.setValue(value);
-      addChild(getChildCount(),cn);
-    }
-  }
-  
-  /** Read a node from a json object */
-  protected ConfigurationNode readNode(String key, JSONReader object)
-    throws ManifoldCFException
-  {
-    object.startObject();
-    // Override key if type field is found.
-    if (object.valueForKey(JSON_TYPE))
-    {
-      if (!object.isValue()) {
-        throw new ManifoldCFException("JSON_TYPE key does not have a string value");
-      }
-      key = object.readValue();
-    }
-    if (key == null)
-      throw new ManifoldCFException("No type found for node");
-    final ConfigurationNode rval = createNewNode(key);
-    final Iterator<String> iter = object.getKeys();
-    while (iter.hasNext())
-    {
-      final String nestedKey = iter.next();
-      if (!nestedKey.equals(JSON_TYPE))
-      {
-        object.valueForKey(nestedKey);
-        if (object.isArray())
-        {
-          // Iterate through.
-          object.startArray();
-          while (object.nextElement()) {
-            processObject(rval,nestedKey,object);
-          }
-          object.endArray();
-        }
-        else
-          processObject(rval,nestedKey,object);
-      }
-    }
-    object.endObject();
-    return rval;
-  }
-  
-  /** Process a JSON object */
-  protected void processObject(ConfigurationNode cn, String key, JSONReader x)
-    throws ManifoldCFException
-  {
-    if (x.isObject())
-    {
-      // Nested single object
-      ConfigurationNode nestedCn = readNode(key,x);
-      cn.addChild(cn.getChildCount(),nestedCn);
-    }
-    else if (x.isNull())
-    {
-      // Null object.  Don't enter the key.
-    }
-    else
-    {
-      // It's a string or a number or some scalar value
-      String value = x.readValue();
-      // Is it an attribute, or a value?
-      if (key.startsWith(JSON_ATTRIBUTE))
-      {
-        // Attribute.  Set the attribute in the current node.
-        cn.setAttribute(key.substring(JSON_ATTRIBUTE.length()),value);
-      }
-      else if (key.equals(JSON_VALUE))
-      {
-        // Value.  Set the value in the current node.
-        cn.setValue(value);
-      }
-      else if (key.equals(JSON_CHILDREN))
-      {
-        // Children, as a list of separately enumerated child nodes.
-        if (!(x.isArray()))
-          throw new ManifoldCFException("Expected array contents for '"+JSON_CHILDREN+"' node");
-        
-        x.startArray();
-        while (x.nextElement()) {
-          ConfigurationNode nestedCn = readNode((String)null,x);
-          cn.addChild(cn.getChildCount(),nestedCn);
-        }
-        x.endArray();
-      }
-      else
-      {
-        // Something we don't recognize, which can only be a simplified key/value pair.
-        // Create a child node representing the key/value pair.
-        ConfigurationNode nestedCn = createNewNode(key);
-        nestedCn.setValue(value);
-        cn.addChild(cn.getChildCount(),nestedCn);
-      }
-    }
-  }
-
-  /** Read from an XML binary stream.
-  *@param xmlstream is the input XML stream.  Does NOT close the stream.
-  */
-  public void fromXML(InputStream xmlstream)
-    throws ManifoldCFException
-  {
-    XMLDoc doc = new XMLDoc(xmlstream);
-    initializeFromDoc(doc);
-  }
-
-  protected void initializeFromDoc(XMLDoc doc)
-    throws ManifoldCFException
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    clearChildren();
-    ArrayList list = new ArrayList();
-    doc.processPath(list, "*", null);
-
-    if (list.size() != 1)
-    {
-      throw new ManifoldCFException("Bad xml - missing outer '"+rootNodeLabel+"' node - there are "+Integer.toString(list.size())+" nodes");
-    }
-    Object parent = list.get(0);
-    if (!doc.getNodeName(parent).equals(rootNodeLabel))
-      throw new ManifoldCFException("Bad xml - outer node is not '"+rootNodeLabel+"'");
-
-    list.clear();
-    doc.processPath(list, "*", parent);
-
-    // Outer level processing.
-    int i = 0;
-    while (i < list.size())
-    {
-      Object o = list.get(i++);
-      ConfigurationNode node = readNode(doc,o);
-      addChild(getChildCount(),node);
-    }
-  }
-
-  /** Read a configuration node from XML.
-  *@param doc is the document.
-  *@param object is the object.
-  *@return the specification node.
-  */
-  protected ConfigurationNode readNode(XMLDoc doc, Object object)
-    throws ManifoldCFException
-  {
-    String type = doc.getNodeName(object);
-    ConfigurationNode rval = createNewNode(type);
-    String value = doc.getData(object);
-    rval.setValue(value);
-    // Do attributes
-    ArrayList list = doc.getAttributes(object);
-    int i = 0;
-    while (i < list.size())
-    {
-      String attribute = (String)list.get(i++);
-      String attrValue = doc.getValue(object,attribute);
-      rval.setAttribute(attribute,attrValue);
-    }
-    // Now, do children
-    list.clear();
-    doc.processPath(list,"*",object);
-    i = 0;
-    while (i < list.size())
-    {
-      Object o = list.get(i);
-      ConfigurationNode node = readNode(doc,o);
-      rval.addChild(i++,node);
-    }
-    return rval;
-  }
-
-  /** Get child count.
-  *@return the count.
-  */
-  public int getChildCount()
-  {
-    return children.size();
-  }
-
-  /** Get child n.
-  *@param index is the child number.
-  *@return the child node.
-  */
-  public ConfigurationNode findChild(int index)
-  {
-    return children.get(index);
-  }
-
-  /** Remove child n.
-  *@param index is the child to remove.
-  */
-  public void removeChild(int index)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    ConfigurationNode node = children.remove(index);
-    removeOuterNode(node);
-  }
-
-  /** Add child at specified position.
-  *@param index is the position to add the child.
-  *@param child is the child to add.
-  */
-  public void addChild(int index, ConfigurationNode child)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    children.add(index,child);
-    addOuterNode(child);
-  }
-
-  /** Clear children.
-  */
-  public void clearChildren()
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    children.clear();
-    clearOuterNodes();
-  }
-
-  /** Calculate a hash code */
-  public int hashCode()
-  {
-    int rval = 0;
-    int i = 0;
-    while (i < children.size())
-    {
-      rval += children.get(i++).hashCode();
-    }
-    return rval;
-  }
-
-  /** Do a comparison */
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof Configuration))
-      return false;
-    Configuration p = (Configuration)o;
-    if (children.size() != p.children.size())
-      return false;
-    int i = 0;
-    while (i < children.size())
-    {
-      if (!children.get(i).equals(p.children.get(i)))
-        return false;
-      i++;
-    }
-    return true;
-  }
-
-  /** Construct a human-readable string */
-  public String toString()
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("[");
-    if (children != null)
-    {
-      int i = 0;
-      while (i < children.size())
-      {
-        if (i > 0)
-          sb.append(", ");
-        ConfigurationNode cn = children.get(i++);
-        sb.append(cn.toString());
-      }
-    }
-    sb.append("]");
-    return sb.toString();
-  }
-  
-  protected static class JSONWriter {
-    
-    private final List<JSONObject> objectStack = new ArrayList<>();
-    private final List<String> keyStack = new ArrayList<>();
-    private final List<JSONArray> arrayStack = new ArrayList<>();
-    private JSONObject currentObject = null;
-    private JSONArray currentArray = null;
-    private String currentKey = null;
-    
-    private JSONObject finalObject = null;
-    private JSONArray finalArray = null;
-    
-    public JSONWriter() {
-    }
-    
-    public void startObject() {
-      pushState();
-      currentObject = new JSONObject();
-      currentKey = null;
-      currentArray = null;
-    }
-
-    public void key(final String key) {
-      currentKey = key;
-    }
-    
-    public void value(final String value) {
-      if (currentKey != null) {
-        currentObject.put(currentKey, value);
-      } else if (currentArray != null) {
-        currentArray.add(value);
-      } else {
-        throw new RuntimeException("Naked value found with no context!");
-      }
-    }
-    
-    public void endObject() {
-      final JSONObject object = currentObject;
-      // Pop everything
-      popState();
-      // Either an array is active, or an object is active, or nothing is active
-      if (currentObject != null) {
-        currentObject.put(currentKey, object);
-      } else if (currentArray != null) {
-        currentArray.add(object);
-      } else {
-        finalObject = object;
-      }
-    }
-    
-    public void startArray() {
-      pushState();
-      currentObject = null;
-      currentKey = null;
-      currentArray = new JSONArray();
-    }
-    
-    public void endArray() {
-      final JSONArray array = currentArray;
-      // Pop everything
-      popState();
-      // Either an array is active, or an object is active, or nothing is active
-      if (currentObject != null) {
-        currentObject.put(currentKey, array);
-      } else if (currentArray != null) {
-        currentArray.add(array);
-      } else {
-        finalArray = array;
-      }
-    }
-    
-    public String toString() {
-      if (finalObject != null) {
-        return finalObject.toJSONString();
-      } else if (finalArray != null) {
-        return finalArray.toJSONString();
-      } else {
-        return "";
-      }
-    }
-    
-    protected void pushState() {
-      objectStack.add(currentObject);
-      keyStack.add(currentKey);
-      arrayStack.add(currentArray);
-    }
-    
-    protected void popState() {
-      currentObject = objectStack.remove(objectStack.size()-1);
-      currentKey = keyStack.remove(keyStack.size()-1);
-      currentArray = arrayStack.remove(arrayStack.size()-1);
-    }
-
-  }
-  
-  protected static class JSONReader {
-    
-    private final List<JSONObject> objectStack = new ArrayList<>();
-    private final List<Iterator> arrayStack = new ArrayList<>();
-    private JSONObject currentObject = null;
-    private Iterator currentArrayIterator = null;
-    
-    private Object next = null;
-
-    public JSONReader(final String json) throws ManifoldCFException {
-      final JSONParser parser = new JSONParser();
-      try {
-        next = parser.parse(new StringReader(json));
-      } catch (Exception e) {
-        throw new ManifoldCFException("Bad json: "+e.getMessage(),e);
-      }
-    }
-    
-    public boolean isObject() {
-      return next != null && (next instanceof JSONObject);
-    }
-    
-    public void startObject() {
-      pushState();
-      currentObject = (JSONObject)next;
-      currentArrayIterator = null;
-    }
-
-    public Iterator<String> getKeys() {
-      return currentObject.keySet().iterator();
-    }
-    
-    public boolean valueForKey(final String key) {
-      next = currentObject.get(key);
-      return next != null;
-    }
-    
-    public void endObject() {
-      popState();
-    }
-    
-    public boolean isArray() {
-      return next != null && (next instanceof JSONArray);
-    }
-    
-    public void startArray() {
-      pushState();
-      currentObject = null;
-      currentArrayIterator = ((JSONArray)next).iterator();
-    }
-    
-    public boolean nextElement() {
-      if (currentArrayIterator.hasNext()) {
-        next = currentArrayIterator.next();
-        return true;
-      }
-      return false;
-    }
-    
-    public void endArray() {
-      popState();
-    }
-
-    public boolean isNull() {
-      return next == null;
-    }
-    
-    public boolean isValue() {
-      return next != null && !(next instanceof JSONObject || next instanceof JSONArray);
-    }
-    
-    public String readValue() {
-      return next.toString();
-    }
-    
-    protected void pushState() {
-      objectStack.add(currentObject);
-      arrayStack.add(currentArrayIterator);
-    }
-    
-    protected void popState() {
-      currentObject = objectStack.remove(objectStack.size()-1);
-      currentArrayIterator = arrayStack.remove(arrayStack.size()-1);
-    }
-    
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java
deleted file mode 100644
index 304d099..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConfigurationNode.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/* $Id: ConfigurationNode.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.util.*;
-
-/** This class represents a node in a configuration structure.
-*/
-public class ConfigurationNode implements IHierarchyParent
-{
-  public static final String _rcsid = "@(#)$Id: ConfigurationNode.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Member variables
-  protected List<ConfigurationNode> children = null;
-  protected Map<String,String> attributes = null;
-  protected String type = null;
-  protected String value = null;
-
-  // Readonly flag
-  protected boolean readOnly = false;
-
-  /** Constructor.
-  */
-  public ConfigurationNode(String type)
-  {
-    this.type = type;
-  }
-
-  /** Duplication constructor.
-  */
-  public ConfigurationNode(ConfigurationNode source)
-  {
-    this.type = source.type;
-    this.value = source.value;
-    this.readOnly = source.readOnly;
-    if (source.attributes != null)
-    {
-      Iterator<String> iter = source.attributes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String attribute = iter.next();
-        String attrValue = source.attributes.get(attribute);
-        if (this.attributes == null)
-          this.attributes = new HashMap<String,String>();
-        this.attributes.put(attribute,attrValue);
-      }
-    }
-    int i = 0;
-    while (i < source.getChildCount())
-    {
-      ConfigurationNode child = source.findChild(i++);
-      this.addChild(this.getChildCount(),createNewNode(child));
-    }
-  }
-  
-  /** Make a new blank node identical in type and class to the current node.
-  *@return the new node.
-  */
-  protected ConfigurationNode createNewNode()
-  {
-    return new ConfigurationNode(type);
-  }
-  
-  /** Make a new node that is a copy of the specified node.
-  */
-  protected ConfigurationNode createNewNode(ConfigurationNode source)
-  {
-    return new ConfigurationNode(source);
-  }
-  
-  /** Make this node (and its children) read-only
-  */
-  public void makeReadOnly()
-  {
-    if (readOnly)
-      return;
-    if (children != null)
-    {
-      int i = 0;
-      while (i < children.size())
-      {
-        ConfigurationNode child = (ConfigurationNode)children.get(i++);
-        child.makeReadOnly();
-      }
-    }
-    readOnly = true;
-  }
-
-  /** Create a duplicate of the current node.
-  *@return the duplicate
-  */
-  protected ConfigurationNode createDuplicate(boolean readOnly)
-  {
-    if (readOnly && this.readOnly)
-      return this;
-    ConfigurationNode rval = createNewNode();
-    rval.value = value;
-    if (attributes != null)
-      rval.attributes = cloneAttributes(attributes);
-    if (children != null)
-    {
-      rval.children = new ArrayList<ConfigurationNode>();
-      int i = 0;
-      while (i < children.size())
-      {
-        ConfigurationNode node = children.get(i++);
-        rval.children.add(node.createDuplicate(readOnly));
-      }
-    }
-    rval.readOnly = readOnly;
-    return rval;
-  }
-
-  /** Get type.
-  *@return the node type.
-  */
-  public String getType()
-  {
-    return type;
-  }
-
-  /** Set value.
-  *@param value is the value to set.
-  */
-  public void setValue(String value)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.value = value;
-  }
-
-  /** Get value.
-  *@return the value.
-  */
-  public String getValue()
-  {
-    return value;
-  }
-
-  /** Get child count.
-  *@return the count.
-  */
-  public int getChildCount()
-  {
-    if (children == null)
-      return 0;
-    return children.size();
-  }
-
-  /** Get child n.
-  *@param index is the child number.
-  *@return the child node.
-  */
-  public ConfigurationNode findChild(int index)
-  {
-    return children.get(index);
-  }
-
-  /** Remove child n.
-  *@param index is the child to remove.
-  */
-  public void removeChild(int index)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    if (children != null)
-    {
-      children.remove(index);
-      if (children.size() == 0)
-        children = null;
-    }
-  }
-
-  /** Add child at specified position.
-  *@param index is the position to add the child.
-  *@param child is the child to add.
-  */
-  public void addChild(int index, ConfigurationNode child)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-
-    if (children == null)
-      children = new ArrayList<ConfigurationNode>();
-    children.add(index,child);
-  }
-
-  /** Clear children.
-  */
-  public void clearChildren()
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    children.clear();
-  }
-
-  /** Set an attribute.
-  *@param attribute is the name of the attribute.
-  *@param value is the value of the attribute (null to remove it).
-  */
-  public void setAttribute(String attribute, String value)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    if (value == null)
-    {
-      if (attributes != null)
-      {
-        attributes.remove(attribute);
-        if (attributes.size() == 0)
-          attributes = null;
-      }
-    }
-    else
-    {
-      if (attributes == null)
-        attributes = new HashMap();
-      attributes.put(attribute,value);
-    }
-  }
-
-  /** Get the attribute count.
-  *@return the attribute count.
-  */
-  public int getAttributeCount()
-  {
-    if (attributes == null)
-      return 0;
-    else
-      return attributes.size();
-  }
-  
-  /** Iterate over attributes.
-  *@return the attribute iterator.
-  */
-  public Iterator<String> getAttributes()
-  {
-    if (attributes == null)
-      return new HashMap<String,String>().keySet().iterator();
-    return attributes.keySet().iterator();
-  }
-
-  /** Get an attribute value.
-  *@param attribute is the name of the attribute.
-  *@return the value.
-  */
-  public String getAttributeValue(String attribute)
-  {
-    if (attributes == null)
-      return null;
-    return attributes.get(attribute);
-  }
-
-  /** Calculate a hashcode */
-  public int hashCode()
-  {
-    int rval = type.hashCode();
-    if (value != null)
-      rval += value.hashCode();
-    if (attributes != null)
-    {
-      Iterator<String> iter = attributes.keySet().iterator();
-      // Make sure this is not sensitive to order!
-      while (iter.hasNext())
-      {
-        String key = iter.next();
-        String attrValue = attributes.get(key);
-        rval += key.hashCode() + attrValue.hashCode();
-      }
-    }
-    if (children != null)
-    {
-      // Do children
-      int i = 0;
-      while (i < children.size())
-      {
-        rval += children.get(i++).hashCode();
-      }
-    }
-    return rval;
-  }
-
-  /** Check if equals */
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof ConfigurationNode))
-      return false;
-    ConfigurationNode n = (ConfigurationNode)o;
-    if (((attributes==null)?0:attributes.size()) != ((n.attributes==null)?0:n.attributes.size()))
-      return false;
-    if (((children==null)?0:children.size()) != ((n.children==null)?0:n.children.size()))
-      return false;
-    if (!type.equals(n.type))
-      return false;
-    if (value == null || n.value == null)
-    {
-      if (value != n.value)
-        return false;
-    }
-    else
-    {
-      if (!value.equals(n.value))
-        return false;
-    }
-    if (attributes != null && n.attributes != null)
-    {
-      Iterator<String> iter = attributes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String key = iter.next();
-        String attrValue = attributes.get(key);
-        String nAttrValue = n.attributes.get(key);
-        if (nAttrValue == null || !attrValue.equals(nAttrValue))
-          return false;
-      }
-    }
-    if (children != null && n.children != null)
-    {
-      int i = 0;
-      while (i < children.size())
-      {
-        ConfigurationNode child = children.get(i);
-        ConfigurationNode nChild = n.children.get(i);
-        if (!child.equals(nChild))
-          return false;
-        i++;
-      }
-    }
-    return true;
-  }
-  
-  /** Construct a human-readable string */
-  public String toString()
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("(");
-    sb.append(type);
-    if (value != null)
-      sb.append(":").append(value);
-    if (attributes != null)
-    {
-      Iterator<String> iter = attributes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        sb.append(" ");
-        String key = iter.next();
-        String attrValue = attributes.get(key);
-        sb.append(key).append("='").append(attrValue).append("'");
-      }
-    }
-    sb.append(" [");
-    if (children != null)
-    {
-      int i = 0;
-      while (i < children.size())
-      {
-        if (i > 0)
-          sb.append(", ");
-        ConfigurationNode cn = children.get(i++);
-        sb.append(cn.toString());
-      }
-    }
-    sb.append("])");
-    return sb.toString();
-  }
-
-  protected static Map<String,String> cloneAttributes(Map<String,String> attributes)
-  {
-    Map<String,String> rval = new HashMap<String,String>();
-    Iterator<Map.Entry<String,String>> iter = attributes.entrySet().iterator();
-    while (iter.hasNext())
-    {
-      Map.Entry<String,String> entry = iter.next();
-      rval.put(entry.getKey(),entry.getValue());
-    }
-    return rval;
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectorFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectorFactory.java
deleted file mode 100644
index 5207193..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectorFactory.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/* $Id: OutputConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This is the base factory class for all IConnector objects.
-*/
-public abstract class ConnectorFactory<T extends IConnector>
-{
-  public static final String _rcsid = "@(#)$Id: OutputConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected ConnectorFactory()
-  {
-  }
-
-  /** Override this method to hook into a connector manager.
-  */
-  protected abstract boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException;
-  
-  /** Install connector.
-  *@param className is the class name.
-  */
-  protected void installThis(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    T connector = getThisConnectorNoCheck(className);
-    connector.install(threadContext);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  protected void deinstallThis(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    T connector = getThisConnectorNoCheck(className);
-    connector.deinstall(threadContext);
-  }
-
-  /** Output the configuration header section.
-  */
-  protected void outputThisConfigurationHeader(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    T connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return;
-    connector.outputConfigurationHeader(threadContext,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  protected void outputThisConfigurationBody(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    T connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return;
-    connector.outputConfigurationBody(threadContext,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  protected String processThisConfigurationPost(IThreadContext threadContext, String className,
-    IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    T connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return null;
-    return connector.processConfigurationPost(threadContext,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  protected void viewThisConfiguration(IThreadContext threadContext, String className,
-    IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    T connector = getThisConnector(threadContext, className);
-    // We want to be able to view connections even if they have unregistered connectors.
-    if (connector == null)
-      return;
-    connector.viewConfiguration(threadContext,out,locale,configParams);
-  }
-
-  /** Get a connector instance, without checking for installed connector.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  protected T getThisConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    T rval = getThisConnectorRaw(className);
-    if (rval == null)
-      throw new ManifoldCFException("No connector class '"+className+"' was found.");
-    return rval;
-  }
-
-  /** Get a connector instance.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  protected T getThisConnector(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    if (!isInstalled(threadContext,className))
-      return null;
-
-    return getThisConnectorRaw(className);
-  }
-  
-  /** Instantiate a connector, but return null if the class is not found.
-  */
-  protected T getThisConnectorRaw(String className)
-    throws ManifoldCFException
-  {
-    try
-    {
-      Class theClass = ManifoldCF.findClass(className);
-      Class[] argumentClasses = new Class[0];
-      // Look for a constructor
-      Constructor c = theClass.getConstructor(argumentClasses);
-      Object[] arguments = new Object[0];
-      Object o = c.newInstance(arguments);
-      try
-      {
-        return (T)o;
-      }
-      catch (ClassCastException e)
-      {
-        throw new ManifoldCFException("Class '"+className+"' does not implement IConnector.");
-      }
-    }
-    catch (InvocationTargetException e)
-    {
-      Throwable z = e.getTargetException();
-      if (z instanceof Error)
-        throw (Error)z;
-      else if (z instanceof RuntimeException)
-        throw (RuntimeException)z;
-      else if (z instanceof ManifoldCFException)
-        throw (ManifoldCFException)z;
-      else
-        throw new RuntimeException("Unknown exception type: "+z.getClass().getName()+": "+z.getMessage(),z);
-    }
-    catch (ClassNotFoundException e)
-    {
-      return null;
-    }
-    catch (NoSuchMethodException e)
-    {
-      throw new ManifoldCFException("No appropriate constructor for IConnector implementation '"+
-        className+"'.  Need xxx().",
-        e);
-    }
-    catch (SecurityException e)
-    {
-      throw new ManifoldCFException("Protected constructor for IConnector implementation '"+className+"'",
-        e);
-    }
-    catch (IllegalAccessException e)
-    {
-      throw new ManifoldCFException("Unavailable constructor for IConnector implementation '"+className+"'",
-        e);
-    }
-    catch (IllegalArgumentException e)
-    {
-      throw new ManifoldCFException("Shouldn't happen!!!",e);
-    }
-    catch (InstantiationException e)
-    {
-      throw new ManifoldCFException("InstantiationException for IConnector implementation '"+className+"'",
-        e);
-    }
-    catch (ExceptionInInitializerError e)
-    {
-      throw new ManifoldCFException("ExceptionInInitializerError for IConnector implementation '"+className+"'",
-        e);
-    }
-
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/DBInterfaceFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/DBInterfaceFactory.java
deleted file mode 100644
index 13ccce4..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/DBInterfaceFactory.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $Id: DBInterfaceFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.lang.reflect.*;
-
-/** This is the factory class for an IDBInterface.
-*/
-public class DBInterfaceFactory
-{
-  public static final String _rcsid = "@(#)$Id: DBInterfaceFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final static String dbinterfaceInstancePrefix = "_DBInterface:";
-
-  private DBInterfaceFactory()
-  {
-  }
-
-  public static IDBInterface make(IThreadContext context, String databaseName, String userName, String password)
-    throws ManifoldCFException
-  {
-    String dbName = dbinterfaceInstancePrefix + databaseName;
-    Object x = context.get(dbName);
-    if (x == null || !(x instanceof IDBInterface))
-    {
-      String implementationClass = LockManagerFactory.getStringProperty(context, ManifoldCF.databaseImplementation,
-        "org.apache.manifoldcf.core.database.DBInterfacePostgreSQL");
-      try
-      {
-        Class c = Class.forName(implementationClass);
-        Constructor constructor = c.getConstructor(new Class[]{IThreadContext.class,String.class,String.class,String.class});
-        x = constructor.newInstance(new Object[]{context,databaseName,userName,password});
-        if (!(x instanceof IDBInterface))
-          throw new ManifoldCFException("Database implementation class "+implementationClass+" does not implement IDBInterface",ManifoldCFException.SETUP_ERROR);
-        context.save(dbName,x);
-      }
-      catch (ClassNotFoundException e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" could not be found: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (ExceptionInInitializerError e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (LinkageError e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" could not be linked: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (InstantiationException e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (InvocationTargetException e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (NoSuchMethodException e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" had no constructor taking (IThreadContext, String, String, String): "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (IllegalAccessException e)
-      {
-        throw new ManifoldCFException("Database implementation class "+implementationClass+" had no public constructor taking (IThreadContext, String, String, String): "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-    }
-    return (IDBInterface)x;
-
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IAuth.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IAuth.java
deleted file mode 100644
index 88cfaea..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IAuth.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** An instance of this interface describes how to authorize various components
-* of the ManifoldCF system.
-*/
-public interface IAuth
-{
-  
-  // User capabilities
-  
-  /** View connections */
-  public final static int CAPABILITY_VIEW_CONNECTIONS = 1;
-  /** View jobs */
-  public final static int CAPABILITY_VIEW_JOBS = 2;
-  /** View reports */
-  public final static int CAPABILITY_VIEW_REPORTS = 3;
-  /** Edit connections */
-  public final static int CAPABILITY_EDIT_CONNECTIONS = 4;
-  /** Edit jobs */
-  public final static int CAPABILITY_EDIT_JOBS = 5;
-  /** Run jobs */
-  public final static int CAPABILITY_RUN_JOBS = 6;
-  
-  /** Verify UI login */
-  public boolean verifyUILogin(final String userId, final String password)
-    throws ManifoldCFException;
-
-  /** Verify API login */
-  public boolean verifyAPILogin(final String userId, final String password)
-    throws ManifoldCFException;
-	
-  /** Check user capability */
-  public boolean checkCapability(final String userId, final int capability)
-    throws ManifoldCFException;
-  
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IAuthorizer.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IAuthorizer.java
deleted file mode 100644
index 47c105a..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IAuthorizer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** An instance of this interface authorizes a user to perform various capabilities within MCF,
-* within the local thread scope.
-*/
-public interface IAuthorizer
-{
-  
-  // User capabilities
-  /** View connections */
-  public final static int CAPABILITY_VIEW_CONNECTIONS = IAuth.CAPABILITY_VIEW_CONNECTIONS;
-  /** View jobs */
-  public final static int CAPABILITY_VIEW_JOBS = IAuth.CAPABILITY_VIEW_JOBS;
-  /** View reports */
-  public final static int CAPABILITY_VIEW_REPORTS = IAuth.CAPABILITY_VIEW_REPORTS;
-  /** Edit connections */
-  public final static int CAPABILITY_EDIT_CONNECTIONS = IAuth.CAPABILITY_EDIT_CONNECTIONS;
-  /** Edit jobs */
-  public final static int CAPABILITY_EDIT_JOBS = IAuth.CAPABILITY_EDIT_JOBS;
-  /** Run jobs */
-  public final static int CAPABILITY_RUN_JOBS = IAuth.CAPABILITY_RUN_JOBS;
-  
-  /** Check user capability */
-  public boolean checkAllowed(final IThreadContext threadContext, final int capability)
-    throws ManifoldCFException;
-  
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheClass.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheClass.java
deleted file mode 100644
index 1e7ceb7..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheClass.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id: ICacheClass.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface represents an object class.  It provides methods that permit
-* the cache manager to learn about the LRU properties of a cached object.
-*/
-public interface ICacheClass
-{
-  public static final String _rcsid = "@(#)$Id: ICacheClass.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the name of the object class.
-  * This determines the set of objects that are treated in the same
-  * LRU pool.
-  *@return the class name.
-  */
-  public String getClassName();
-
-  /** Get the maximum LRU count of the object class.
-  *@return the maximum number of the objects of the particular class
-  * allowed.
-  */
-  public int getMaxLRUCount();
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheCreateHandle.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheCreateHandle.java
deleted file mode 100644
index 705bfeb..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheCreateHandle.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: ICacheCreateHandle.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This is a handle created by the cache manager, which describes the current status of a cache
-* lookup/create session.
-*/
-public interface ICacheCreateHandle
-{
-  public static final String _rcsid = "@(#)$Id: ICacheCreateHandle.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the critical section names.
-  *@return the critical section names.
-  */
-  public String[] getCriticalSectionNames();
-
-  /** Get create start time.
-  *@return the time in milliseconds since epoch.
-  */
-  public long getLookupTime();
-
-  /** Get the transaction ID.
-  *@return the transaction ID.
-  */
-  public String getTransactionID();
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheDescription.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheDescription.java
deleted file mode 100644
index eb7e7e7..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheDescription.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: ICacheDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface represents objects that describe cacheable objects.
-* Implementors of this interface should ideally be immutable, if they
-* are used to describe objects that are placed in cache.
-* Note well: The getCriticalSectionName() method described by this interface is
-* meant to return the name of a critical section.  This should
-* be distinguishable from other critical sections in the system;
-* it should therefore have the classname as a component.
-*/
-public interface ICacheDescription
-{
-  public static final String _rcsid = "@(#)$Id: ICacheDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the cache keys for an object (which may or may not exist yet in
-  * the cache).  This method is called in order for cache manager to throw the correct locks.
-  * @return the object's cache keys, or null if the object should not
-  * be cached.
-  */
-  public StringSet getObjectKeys();
-
-  /** Get the critical section name for this description object.
-  * This is used to synchronize creation of the described object,
-  * and thus is used only for objects that will be cached.  This
-  * method does not need to return decent results for objects that
-  * are never cached.
-  *@return the critical section name.
-  */
-  public String getCriticalSectionName();
-
-  /** Get the object class for an object.  The object class is used to determine
-  * the group of objects treated in the same LRU manner.
-  * @return the newly created object's object class, or null if there is no
-  * such class, and LRU behavior is not desired.
-  */
-  public ICacheClass getObjectClass();
-
-  /** Obtain an expiration time for an object, in milliseconds since epoch.
-  * The cache manager will call this method whenever the object is being looked up,
-  * so that its expiration timestamps can be properly updated to a new time.
-  * @param currentTime is the time of the lookup, in milliseconds since epoch.
-  * @return a time in milliseconds since epoch for the object to expire, or -1 if there is no expiration
-  * desired.
-  */
-  public long getObjectExpirationTime(long currentTime);
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheExecutor.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheExecutor.java
deleted file mode 100644
index 1e0c005..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheExecutor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id: ICacheExecutor.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes an object designed to be instantiated solely for the purpose of
-* running inside the global cache manager's execution method.  The cache manager will
-* perform all synchronization, and for objects being accessed will call either the create*()
-* family of methods below, or
-* the exists() method, if the object was found in the cache.  For all existing objects being
-* invalidated,
-* the destroy() method will be called.
-* It IS legal to specify the same object for both read and invalidate!  In this case, both
-* the create() or exists() sequence AND the destroy() method will be called.
-* Finally, after this has been
-* done for all of the requested objects, the execute() method will be called.
-*
-* Users of the cache manager will need to create objects implementing this interface when they want to
-* operate on a set of cached objects.
-* NOTE: Objects that are created by a cache executor must obey the following rule: A given objectDescription
-* must always have the same invalidation keys, regardless of which cache executor object creates them,
-* and regardless of WHEN the object is instantiated.  This is required in order to ensure that the locks
-* thrown by the cache manager are correct.
-*/
-public interface ICacheExecutor
-{
-  public static final String _rcsid = "@(#)$Id: ICacheExecutor.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Create a set of new objects to operate on and cache.  This method is called only
-  * if the specified object(s) are NOT available in the cache.  The specified objects
-  * should be created and returned; if they are not created, it means that the
-  * execution cannot proceed, and the execute() method will not be called.
-  * @param objectDescriptions is the set of unique identifier of the object.
-  * @return the newly created objects to cache, or null, if any object cannot be created.
-  *  The order of the returned objects must correspond to the order of the object descriptinos.
-  */
-  public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException;
-
-
-  /** Notify the implementing class of the existence of a cached version of the
-  * object.  The object is passed to this method so that the execute() method below
-  * will have it available to operate on.  This method is also called for all objects
-  * that are freshly created as well.
-  * @param objectDescription is the unique identifier of the object.
-  * @param cachedObject is the cached object.
-  */
-  public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException;
-
-
-  /** Perform the desired operation.  This method is called after either createGetObject()
-  * or exists() is called for every requested object.
-  */
-  public void execute() throws ManifoldCFException;
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheHandle.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheHandle.java
deleted file mode 100644
index 55af076..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheHandle.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id: ICacheHandle.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This is a handle created by the cache manager, which describes the current status of a cache
-* operation.
-*/
-public interface ICacheHandle
-{
-  public static final String _rcsid = "@(#)$Id: ICacheHandle.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get the read lock strings.
-  *@return read lock string array.
-  */
-  public String[] getReadLockStrings();
-
-  /** Get the write lock strings.
-  *@return write lock string array.
-  */
-  public String[] getWriteLockStrings();
-
-  /** Get the set of object descriptions.
-  *@return the object descriptions.
-  */
-  public ICacheDescription[] getObjectDescriptions();
-
-  /** Get the invalidation keys.
-  *@return the invalidation key set.
-  */
-  public StringSet getInvalidationKeys();
-
-  /** Get the transaction ID.
-  *@return the transaction ID.
-  */
-  public String getTransactionID();
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheManager.java
deleted file mode 100644
index 314d095..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ICacheManager.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/* $Id: ICacheManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes the functionality in the cache manager.  It is not meant to have multiple implementations, but
-* merely to provide general abstract cross-cluster cache management services.
-*/
-public interface ICacheManager
-{
-  public static final String _rcsid = "@(#)$Id: ICacheManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Locate or create a set of objects in the cached object pool, and/or destroy and invalidate
-  * the same or other objects.
-  *
-  * For each "locate" object
-  * described below, one of two things will happen: the execObject's exists() method
-  * will be called (if the object exists in the cache already), or the execObject's create*()
-  * family of methods will be called.  When all objects have been declared to the execObject,
-  * finally the execute() method will be called.  In both cases, all objects are considered
-  * to be locked, and cannot be invalidated until the lock is cleared (after the end of the called method).
-  *
-  * For the invalidation descriptions, the execObject's destroy() method will be called instead.
-  * The object will be invalidated from the cache at the end of the findObjectsAndExecute() operation.
-  *
-  * It is perfectly legal to include an object that will be invalidated in the locate set!
-  *
-  * If an error occurs during object creation, the execute() method will NOT be called.  If the
-  * execute() method has an error, the objects that were created will still be recorded in the cache.
-  *
-  * @param locateObjectDescriptions is a set of description objects that uniquely describe the objects needed.
-  * May be null if no objects are desired.
-  * @param invalidateKeys are the keys to invalidate after successful execution.  May be null.
-  * @param execObject is the cache execution object whose create() or execute() methods will
-  * be called.  May be null if no in-section logic is desired, and no objects are specified.
-  * @param transactionID is the current transaction identifier, or null.  Objects created within this call
-  * will be associated with this transaction; they will be purged from the cache should the transaction
-  * be rolled back.
-  */
-  public void findObjectsAndExecute(ICacheDescription[] locateObjectDescriptions, StringSet invalidateKeys,
-    ICacheExecutor execObject, String transactionID)
-    throws ManifoldCFException;
-
-  /** Second way of doing cache management.
-  * Basically, this approach breaks the findObjectsAndExecute() method down into bite-sized chunks.
-  * The goal is additional flexibility, and an executor object does not need to be defined.
-  * Pretty much everything else is identical.  The objects returned by the manager methods
-  * provide context control and enforce the proper ordering and nesting.
-  * This method enters the cacher and builds a cache handle.  Once a cache handle is
-  * returned, the calling code MUST, under all circumstances, leave the cache using the
-  * same handle.
-  * @param locateObjectDescriptions is a set of description objects that uniquely describe the objects needed.
-  * May be null if no objects are desired.
-  * @param invalidateKeys are the keys to invalidate after successful execution.  May be null.
-  * @param transactionID is the current transaction identifier, or null.  Objects created within this block
-  * will be associated with this transaction; they will be purged from the cache should the transaction
-  * be rolled back.
-  * @return a cache handle.
-  */
-  public ICacheHandle enterCache(ICacheDescription[] locateObjectDescriptions, StringSet invalidateKeys,
-    String transactionID)
-    throws ManifoldCFException;
-
-  /** Enter a creation critical section.  This insures that only one thread is
-  * creating the specified objects at a time.  This MUST be paired with
-  * a leaveCreateSection() method call, whatever happens.
-  *@param handle is the cache handle.
-  */
-  public ICacheCreateHandle enterCreateSection(ICacheHandle handle)
-    throws ManifoldCFException;
-
-  /** Lookup an object.  Returns null if object not found.  If it is found,
-  * object's LRU and expiration info are updated.  The objectDescription passed
-  * MUST be one of the ones specified in the enclosing enterCache() method.
-  *@param handle is the handle to use for the create.
-  *@param objectDescription is the description of the object to look up.
-  */
-  public Object lookupObject(ICacheCreateHandle handle, ICacheDescription objectDescription)
-    throws ManifoldCFException;
-
-  /** Save a newly created object.  The object MUST be one of those identified in the
-  * enterCache() method.
-  *@param handle is the create handle.
-  *@param objectDescription is the object description.
-  *@param object is the object.
-  */
-  public void saveObject(ICacheCreateHandle handle, ICacheDescription objectDescription,
-    Object object)
-    throws ManifoldCFException;
-
-  /** Leave the create section.
-  *@param handle is the handle created by the corresponding enterCreateSection() method.
-  */
-  public void leaveCreateSection(ICacheCreateHandle handle)
-    throws ManifoldCFException;
-
-  /** Invalidate keys.  The keys invalidated are what got passed to the enterCache() method.
-  *@param handle is the cache handle.  Does nothing if a null set of keys was passed in.
-  */
-  public void invalidateKeys(ICacheHandle handle)
-    throws ManifoldCFException;
-
-  /** Leave the cache.  Must be paired with enterCache, above.
-  *@param handle is the handle of the cache we are leaving.
-  */
-  public void leaveCache(ICacheHandle handle)
-    throws ManifoldCFException;
-
-  // The following methods are used to communicate transaction information to the cache.
-
-  /** Begin a cache transaction.
-  * This keeps track of the relationship between objects cached within transactions.
-  *@param startingTransactionID is the id of the transaction that is starting.
-  *@param enclosingTransactionID is the id of the transaction that is in effect, or null.
-  */
-  public void startTransaction(String startingTransactionID, String enclosingTransactionID)
-    throws ManifoldCFException;
-
-  /** Commit a cache transaction.
-  * This method MUST be called when a transaction successfully ends, or open locks will not be closed!!!
-  * All cache activity that has taken place inside the transaction will be resolved, and the cache locks
-  * held open will be released.
-  *@param transactionID is the id of the transaction that is ending.
-  */
-  public void commitTransaction(String transactionID)
-    throws ManifoldCFException;
-
-  /** Roll back a cache transaction.
-  * This method releases all objects cached against the ending transaction ID, and releases all locks
-  * held for the transaction.
-  *@param transactionID is the id of the transaction that is ending.
-  */
-  public void rollbackTransaction(String transactionID)
-    throws ManifoldCFException;
-
-  // This is a maintenance method; call it when convenient.
-
-  /** Timed invalidation.  Call this periodically to get rid of all objects that have expired.
-  *@param currentTimestamp is the current time in milliseconds since epoch.
-  */
-  public void expireObjects(long currentTimestamp)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnector.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnector.java
deleted file mode 100644
index d82c8e9..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnector.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/* $Id: IConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface represents the base methods every configurable connector needs.
-* Connector instances are pooled, so that session setup does not need to be done repeatedly.  The
-* pool is segregated by specific sets of configuration parameters.
-*/
-public interface IConnector
-{
-
-  /** Install the connector.
-  * This method is called to initialize persistent storage for the connector, such as database tables etc.
-  * It is called when the connector is registered.
-  *@param threadContext is the current thread context.
-  */
-  public void install(IThreadContext threadContext)
-    throws ManifoldCFException;
-
-  /** Uninstall the connector.
-  * This method is called to remove persistent storage for the connector, such as database tables etc.
-  * It is called when the connector is deregistered.
-  *@param threadContext is the current thread context.
-  */
-  public void deinstall(IThreadContext threadContext)
-    throws ManifoldCFException;
-
-  /** Connect.  The configuration parameters are included.
-  *@param configParams are the configuration parameters for this connection.
-  */
-  public void connect(ConfigParams configParams);
-
-  // All methods below this line will ONLY be called if a connect() call succeeded
-  // on this instance!
-
-  /** Test the connection.  Returns a string describing the connection integrity.
-  *@return the connection's status as a displayable string.
-  */
-  public String check()
-    throws ManifoldCFException;
-
-  /** This method is periodically called for all connectors that are connected but not
-  * in active use.
-  */
-  public void poll()
-    throws ManifoldCFException;
-
-  /** This method is called to assess whether to count this connector instance should
-  * actually be counted as being connected.
-  *@return true if the connector instance is actually connected.
-  */
-  public boolean isConnected();
-  
-  /** Close the connection.  Call this before discarding the repository connector.
-  */
-  public void disconnect()
-    throws ManifoldCFException;
-
-  /** Get configuration information.
-  *@return the configuration information for this class.
-  */
-  public ConfigParams getConfiguration();
-
-  /** Clear out any state information specific to a given thread.
-  * This method is called when this object is returned to the connection pool.
-  */
-  public void clearThreadContext();
-
-  /** Attach to a new thread.
-  *@param threadContext is the new thread context.
-  */
-  public void setThreadContext(IThreadContext threadContext)
-    throws ManifoldCFException;
-
-
-  // UI support methods.
-  //
-  // These support methods are involved in setting up connection configuration information. The configuration methods cannot assume that the
-  // current connector is connected.  That is why they receive a thread context argument.
-
-  /** Output the configuration header section.
-  * This method is called in the head section of the connector's configuration page.  Its purpose is to add the required tabs to the list, and to output any
-  * javascript methods that might be needed by the configuration editing HTML.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, List<String> tabsArray)
-    throws ManifoldCFException, IOException;
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the authority connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException;
-  
-  /** Process a configuration post.
-  * This method is called at the start of the authority connector's configuration page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the configuration parameters accordingly.
-  * The name of the posted form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param variableContext is the set of variables available from the post, including binary file post information.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the connection (and cause a redirection to an error page).
-  */
-  public String processConfigurationPost(IThreadContext threadContext, IPostParameters variableContext, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException;
-  
-  /** View configuration.
-  * This method is called in the body section of the authority connector's view configuration page.  Its purpose is to present the connection information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale that the output should use.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  */
-  public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
-    throws ManifoldCFException, IOException;
-
-}
\ No newline at end of file
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java
deleted file mode 100644
index c62b872..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java
+++ /dev/null
@@ -1,445 +0,0 @@
-/* $Id: IDBInterface.java 999670 2010-09-21 22:18:19Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** The purpose of this interface is to provide abstracted database table modification primitives,
-* as well as general access primitives.  It is expected that the generalized database layer will
-* provide the underlying services.  This layer should provide services roughly equivalent to
-* the former DBInterface bean, but be callable in a pure Java fashion.
-* It is furthermore intended that all abstraction database requests go through this layer.  It
-* will therefore, over time, provide grander and grander levels of database query abstraction.
-*
-* Also note that the database parameters will be passed to the factory for this class, not
-* to the individual methods.
-*
-*/
-public interface IDBInterface
-{
-  public static final String _rcsid = "@(#)$Id: IDBInterface.java 999670 2010-09-21 22:18:19Z kwright $";
-
-  public static int TRANSACTION_ENCLOSING = 0;
-  public static int TRANSACTION_READCOMMITTED = 1;
-  public static int TRANSACTION_SERIALIZED = 2;
-  public static int TRANSACTION_REPEATABLEREAD = 3;
-
-  /** Initialize.  This method is called once per JVM instance, in order to set up
-  * database communication.
-  */
-  public void openDatabase()
-    throws ManifoldCFException;
-  
-  /** Uninitialize.  This method is called during JVM shutdown, in order to close
-  * all database communication.
-  */
-  public void closeDatabase()
-    throws ManifoldCFException;
-  
-  /** Get the database name.
-  *@return the database name.
-  */
-  public String getDatabaseName();
-
-  /** Get the current transaction id.
-  *@return the current transaction identifier, or null if no transaction.
-  */
-  public String getTransactionID();
-
-  /** Get the database general cache key.
-  *@return the general cache key for the database.
-  */
-  public String getDatabaseCacheKey();
-
-  /** Perform an insert operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be
-  * invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  */
-  public void performInsert(String tableName, Map<String,Object> parameterMap, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Perform an update operation.
-  *@param tableName is the name of the table.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param parameterMap is the map of column name/values to write.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  public void performUpdate(String tableName, Map<String,Object> parameterMap, String whereClause,
-    List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Perform a delete operation.
-  *@param tableName is the name of the table to delete from.
-  *@param invalidateKeys are the cache keys that should be invalidated.
-  *@param whereClause is the where clause describing the match (including the WHERE), or null if none.
-  *@param whereParameters are the parameters that come with the where clause, if any.
-  */
-  public void performDelete(String tableName, String whereClause, List whereParameters, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Perform a table creation operation.
-  *@param tableName is the name of the table to create.
-  *@param columnMap is the map describing the columns and types.  NOTE that these are abstract
-  * types, which will be mapped to the proper types for the actual database inside this
-  * layer.  The types are ColumnDefinition objects.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performCreate(String tableName, Map<String,ColumnDescription> columnMap, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Perform a table alter operation.
-  *@param tableName is the name of the table to alter.
-  *@param columnMap is the map describing the columns and types to add.  These
-  * are in the same form as for performCreate.
-  *@param columnModifyMap is the map describing the columns to be changed.  The key is the
-  * existing column name, and the value is the new type of the column.  Data will be copied from
-  * the old column to the new.
-  *@param columnDeleteList is the list of column names to delete.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performAlter(String tableName, Map<String,ColumnDescription> columnMap,
-    Map<String,ColumnDescription> columnModifyMap, List<String> columnDeleteList,
-    StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param unique is a boolean that if true describes a unique index.
-  *@param columnList is the list of columns that need to be included
-  * in the index, in order.
-  */
-  public void addTableIndex(String tableName, boolean unique, List<String> columnList)
-    throws ManifoldCFException;
-
-  /** Add an index to a table.
-  *@param tableName is the name of the table to add the index for.
-  *@param indexName is the optional name of the table index.  If null, a name will be chosen automatically.
-  *@param description is the index description.
-  */
-  public void performAddIndex(String indexName, String tableName, IndexDescription description)
-    throws ManifoldCFException;
-
-  /** Remove an index.
-  *@param indexName is the name of the index to remove.
-  *@param tableName is the table the index belongs to.
-  */
-  public void performRemoveIndex(String indexName, String tableName)
-    throws ManifoldCFException;
-
-  /** Analyze a table.
-  *@param tableName is the name of the table to analyze/calculate statistics for.
-  */
-  public void analyzeTable(String tableName)
-    throws ManifoldCFException;
-
-  /** Reindex a table.
-  *@param tableName is the name of the table to rebuild indexes for.
-  */
-  public void reindexTable(String tableName)
-    throws ManifoldCFException;
-
-  /** Perform a table drop operation.
-  *@param tableName is the name of the table to drop.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void performDrop(String tableName, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Create user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void createUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Drop user and database.
-  *@param adminUserName is the admin user name.
-  *@param adminPassword is the admin password.
-  *@param invalidateKeys are the cache keys that should be invalidated, if any.
-  */
-  public void dropUserAndDatabase(String adminUserName, String adminPassword, StringSet invalidateKeys)
-    throws ManifoldCFException;
-    
-  /** Get a table's schema.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of column names and ColumnDescription objects, describing the schema.
-  */
-  public Map<String,ColumnDescription> getTableSchema(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException;
-
-  /** Get a table's indexes.
-  *@param tableName is the name of the table.
-  *@param cacheKeys are the keys against which to cache the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return a map of index names and IndexDescription objects, describing the indexes.
-  */
-  public Map<String,IndexDescription> getTableIndexes(String tableName, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException;
-
-  /** Get a database's tables.
-  *@param cacheKeys are the cache keys for the query, or null.
-  *@param queryClass is the name of the query class, or null.
-  *@return the set of tables.
-  */
-  public StringSet getAllTables(StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException;
-
-  /** Perform a general database modification query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param invalidateKeys are the cache keys to invalidate.
-  */
-  public void performModification(String query, List params, StringSet invalidateKeys)
-    throws ManifoldCFException;
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@return a resultset.
-  */
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass)
-    throws ManifoldCFException;
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ILimitChecker returnLimit)
-    throws ManifoldCFException;
-
-  /** Perform a general "data fetch" query.
-  *@param query is the query string.
-  *@param params are the parameterized values, if needed.
-  *@param cacheKeys are the cache keys, if needed (null if no cache desired).
-  *@param queryClass is the LRU class name against which this query would be cached,
-  * or null if no LRU behavior desired.
-  *@param maxResults is the maximum number of results returned (-1 for all).
-  *@param resultSpec is a result specification, or null for the standard treatment.
-  *@param returnLimit is a description of how to limit the return result, or null if no limit.
-  *@return a resultset.
-  */
-  public IResultSet performQuery(String query, List params, StringSet cacheKeys, String queryClass,
-    int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit)
-    throws ManifoldCFException;
-
-  /** Construct index hint clause.
-  * On most databases this returns an empty string, but on MySQL this returns
-  * a USE INDEX hint.  It requires the name of an index.
-  *@param tableName is the table the index is from.
-  *@param description is the description of an index, which is expected to exist.
-  *@return the query chunk that should go between the table names and the WHERE
-  * clause.
-  */
-  public String constructIndexHintClause(String tableName, IndexDescription description)
-    throws ManifoldCFException;
-  
-  /** Construct ORDER-BY clause meant for reading from an index.
-  * Supply the field names belonging to the index, in order.
-  * Also supply a corresponding boolean array, where TRUE means "ASC", and FALSE
-  * means "DESC".
-  *@param fieldNames are the names of the fields in the index that is to be used.
-  *@param direction is a boolean describing the sorting order of the first term.
-  *@return a query chunk, including "ORDER BY" text, which is appropriate for
-  * at least ordering by the FIRST column supplied.
-  */
-  public String constructIndexOrderByClause(String[] fieldNames, boolean direction);
-  
-  /** Construct a cast to a double value.
-  * On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact
-  * specified).
-  *@param value is the value to be cast.
-  *@return the query chunk needed.
-  */
-  public String constructDoubleCastClause(String value);
-  
-  /** Construct a count clause.
-  * On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so
-  * CAST(COUNT(col) AS BIGINT) will be emitted instead.
-  *@param column is the column string to be counted.
-  *@return the query chunk needed.
-  */
-  public String constructCountClause(String column);
-  
-  /** Construct a regular-expression match clause.
-  * This method builds a regular-expression match expression.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true if the regular expression match is to be case insensitive.
-  *@return the query chunk needed, not padded with spaces on either side.
-  */
-  public String constructRegexpClause(String column, String regularExpression, boolean caseInsensitive);
-  
-  /** Construct a regular-expression substring clause.
-  * This method builds an expression that extracts a specified string section from a field, based on
-  * a regular expression.
-  *@param column is the column specifier string.
-  *@param regularExpression is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.
-  *@param caseInsensitive is true if the regular expression match is to be case insensitive.
-  *@return the expression chunk needed, not padded with spaces on either side.
-  */
-  public String constructSubstringClause(String column, String regularExpression, boolean caseInsensitive);
-  
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@param afterOrderBy is true if this offset/limit comes after an ORDER BY.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  public String constructOffsetLimitClause(int offset, int limit, boolean afterOrderBy);
-  
-  /** Construct an offset/limit clause.
-  * This method constructs an offset/limit clause in the proper manner for the database in question.
-  *@param offset is the starting offset number.
-  *@param limit is the limit of result rows to return.
-  *@return the proper clause, with no padding spaces on either side.
-  */
-  public String constructOffsetLimitClause(int offset, int limit);
-
-  /** Construct a 'distinct on (x)' filter.
-  * This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature.
-  * Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final
-  * result.
-  *@param outputParameters is a blank list into which to put parameters.  Null may be used if the baseParameters parameter is null.
-  *@param baseQuery is the base query, which is another SELECT statement, without parens,
-  * e.g. "SELECT ..."
-  *@param baseParameters are the parameters corresponding to the baseQuery.
-  *@param distinctFields are the fields to consider to be distinct.  These should all be keys in otherFields below.
-  *@param orderFields are the otherfield keys that determine the ordering.
-  *@param orderFieldsAscending are true for orderFields that are ordered as ASC, false for DESC.  
-  *@param otherFields are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"
-  *@return a revised query that performs the necessary DISTINCT ON operation.  The list outputParameters will also be appropriately filled in.
-  */
-  public String constructDistinctOnClause(List outputParameters, String baseQuery, List baseParameters,
-    String[] distinctFields, String[] orderFields, boolean[] orderFieldsAscending, Map<String,String> otherFields);
-  
-  /* Calculate the number of values a particular clause can have, given the values for all the other clauses.
-  * For example, if in the expression x AND y AND z, x has 2 values and z has 1, find out how many values x can legally have
-  * when using the buildConjunctionClause() method below.
-  */
-  public int findConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions);
-  
-  /* Construct a conjunction clause, e.g. x AND y AND z, where there is expected to be an index (x,y,z,...), and where x, y, or z
-  * can have multiple distinct values, The proper implementation of this method differs from database to database, because some databases
-  * only permit index operations when there are OR's between clauses, such as x1 AND y1 AND z1 OR x2 AND y2 AND z2 ..., where others
-  * only recognize index operations when there are lists specified for each, such as x IN (x1,x2) AND y IN (y1,y2) AND z IN (z1,z2).
-  */
-  public String buildConjunctionClause(List outputParameters, ClauseDescription[] clauseDescriptions);
-  
-  /** Obtain the maximum number of individual items that should be
-  * present in an IN clause.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of IN clause members.
-  */
-  public int getMaxInClause();
-
-  /** Obtain the maximum number of individual clauses that should be
-  * present in a sequence of OR clauses.  Exceeding this amount will potentially cause the query performance
-  * to drop.
-  *@return the maximum number of OR clause members.
-  */
-  public int getMaxOrClause();
-
-  /** For windowed report queries, e.g. maxActivity or maxBandwidth, obtain the maximum number of rows
-  * that can reasonably be expected to complete in an acceptable time.
-  *@return the maximum number of rows.
-  */
-  public int getWindowedReportMaxRows();
-  
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  * (The kind of transaction started by this method is the current default transaction type, which is "read committed"
-  * if not otherwise determined).
-  */
-  public void beginTransaction()
-    throws ManifoldCFException;
-
-  /** Begin a database transaction.  This method call MUST be paired with an endTransaction() call,
-  * or database handles will be lost.  If the transaction should be rolled back, then signalRollback() should
-  * be called before the transaction is ended.
-  * It is strongly recommended that the code that uses transactions be structured so that a try block
-  * starts immediately after this method call.  The body of the try block will contain all direct or indirect
-  * calls to executeQuery().  After this should be a catch for every exception type, including Error, which should call the
-  * signalRollback() method, and rethrow the exception.  Then, after that a finally{} block which calls endTransaction().
-  *@param transactionType is the kind of transaction desired.
-  */
-  public void beginTransaction(int transactionType)
-    throws ManifoldCFException;
-
-  /** Perform the transaction commit.
-  * Calling this method does not relieve the coder of the responsibility of calling endTransaction(),
-  * as listed below.  The purpose of a separate commit operation is to allow handling of situations where the
-  * commit generates a TRANSACTION_ABORT signal.
-  */
-  public void performCommit()
-    throws ManifoldCFException;
-
-  /** Signal that a rollback should occur on the next endTransaction().
-  */
-  public void signalRollback();
-
-  /** End a database transaction, either performing a commit or a rollback or nothing (depending on whether
-  * signalRollback() was called within the transaction or performCommit() or none of the above).
-  */
-  public void endTransaction()
-    throws ManifoldCFException;
-
-  /** Note a number of inserts, modifications, or deletions to a specific table.  This is so we can decide when to do appropriate maintenance.
-  *@param tableName is the name of the table being modified.
-  *@param insertCount is the number of inserts.
-  *@param modifyCount is the number of updates.
-  *@param deleteCount is the number of deletions.
-  */
-  public void noteModifications(String tableName, int insertCount, int modifyCount, int deleteCount)
-    throws ManifoldCFException;
-
-  /** Get a random time, in milliseconds, for backoff from deadlock.
-  *@return the random time.
-  */
-  public long getSleepAmt();
-  
-  /** Sleep for a specified time, as part of backoff from deadlock.
-  *@param time is the amount to sleep.
-  */
-  public void sleepFor(long time)
-    throws ManifoldCFException;
-    
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDFactory.java
deleted file mode 100644
index 8b983e5..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDFactory.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/* $Id: IDFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-/** The purpose of this class is to create global unique identifiers.  For performance, every JVM has a local pool of identifiers as well
-* as there being a global system of identifier creation, which is also resilient against entire system restarts.
-*/
-public class IDFactory
-{
-  public static final String _rcsid = "@(#)$Id: IDFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private static ArrayList idPool = new ArrayList();
-
-  // The id algorithm depends on the clock.  We don't want to fetch too many; we'll
-  // run the risk of a restart in the non-synchronized case beating the clock.
-  private final static int poolSize = 100;
-
-  /** This is the critical section name */
-  private final static String criticalSectionName = "_IDFACTORY_";
-  /** This is the global lock name */
-  private final static String globalLockName = "_IDFACTORY_";
-  /** This is the name of the global ID data object */
-  private final static String globalIDDataName = "_IDFACTORY_";
-
-  private IDFactory()
-  {
-  }
-
-  public static String make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    ILockManager lockManager = LockManagerFactory.make(tc);
-    // Enter critical section before we look at the pool
-    lockManager.enterWriteCriticalSection(criticalSectionName);
-    try
-    {
-      // check the pool
-      if (idPool.size() == 0)
-      {
-        // Pool was empty.  We need to grab more id's from the global resource.
-        lockManager.enterWriteLock(globalLockName);
-        try
-        {
-          // Read shared data
-          byte[] idData = lockManager.readData(globalIDDataName);
-          long _id;
-          if (idData == null)
-            _id = 0L;
-          else
-            _id = new Long(new String(idData, StandardCharsets.UTF_8)).longValue();
-          
-          int i = 0;
-          while (i < poolSize)
-          {
-            long newid = System.currentTimeMillis();
-            if (newid <= _id)
-            {
-              newid = _id + 1;
-            }
-            _id = newid;
-            idPool.add(Long.toString(newid));
-            i++;
-          }
-
-          lockManager.writeData(globalIDDataName,Long.toString(_id).getBytes(StandardCharsets.UTF_8));
-        }
-        finally
-        {
-          lockManager.leaveWriteLock(globalLockName);
-        }
-      }
-      return (String)idPool.remove(idPool.size()-1);
-    }
-    finally
-    {
-      lockManager.leaveWriteCriticalSection(criticalSectionName);
-    }
-    
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHTTPOutput.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHTTPOutput.java
deleted file mode 100644
index 3577ea4..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHTTPOutput.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $Id: IHTTPOutput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-
-/** This interface abstracts from the output character stream used to construct
-* HTML output for a web interface.  More broadly, it provides the services that all
-* connectors will need in order to provide UI components.
-*/
-public interface IHTTPOutput extends IHTTPOutputActivity, IPasswordMapperActivity
-{
-  public static final String _rcsid = "@(#)$Id: IHTTPOutput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHTTPOutputActivity.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHTTPOutputActivity.java
deleted file mode 100644
index a6e1e2f..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHTTPOutputActivity.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-
-/** This interface abstracts from the output character stream used to construct
-* HTML output for a web interface.
-*/
-public interface IHTTPOutputActivity
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Flush the stream */
-  public void flush()
-    throws IOException;
-  
-  /** Write a newline */
-  public void newLine()
-    throws IOException;
-  
-  /** Write a boolean */
-  public void print(boolean b)
-    throws IOException;
-  
-  /** Write a char */
-  public void print(char c)
-    throws IOException;
-  
-  /** Write an array of chars */
-  public void print(char[] c)
-    throws IOException;
-  
-  /** Write a double */
-  public void print(double d)
-    throws IOException;
-  
-  /** Write a float */
-  public void print(float f)
-    throws IOException;
-  
-  /** Write an int */
-  public void print(int i)
-    throws IOException;
-  
-  /** Write a long */
-  public void print(long l)
-    throws IOException;
-  
-  /** Write an object */
-  public void print(Object o)
-    throws IOException;
-  
-  /** Write a string */
-  public void print(String s)
-    throws IOException;
-  
-  /** Write a boolean */
-  public void println(boolean b)
-    throws IOException;
-  
-  /** Write a char */
-  public void println(char c)
-    throws IOException;
-  
-  /** Write an array of chars */
-  public void println(char[] c)
-    throws IOException;
-  
-  /** Write a double */
-  public void println(double d)
-    throws IOException;
-  
-  /** Write a float */
-  public void println(float f)
-    throws IOException;
-  
-  /** Write an int */
-  public void println(int i)
-    throws IOException;
-  
-  /** Write a long */
-  public void println(long l)
-    throws IOException;
-  
-  /** Write an object */
-  public void println(Object o)
-    throws IOException;
-  
-  /** Write a string */
-  public void println(String s)
-    throws IOException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHierarchyParent.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHierarchyParent.java
deleted file mode 100644
index 358cf70..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IHierarchyParent.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes the methods for support configuration parent/child
-* relationships.
-*/
-public interface IHierarchyParent
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Clear children.
-  */
-  public void clearChildren();
-
-   /** Get child count.
-  *@return the count.
-  */
-  public int getChildCount();
-
-  /** Get child n.
-  *@param index is the child number.
-  *@return the child node.
-  */
-  public ConfigurationNode findChild(int index);
-
-  /** Remove child n.
-  *@param index is the child to remove.
-  */
-  public void removeChild(int index);
-
-  /** Add child at specified position.
-  *@param index is the position to add the child.
-  *@param child is the child to add.
-  */
-  public void addChild(int index, ConfigurationNode child);
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ILimitChecker.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ILimitChecker.java
deleted file mode 100644
index deb35b6..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ILimitChecker.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $Id: ILimitChecker.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes a canonical limit checker for a query.  It will be used to limit the
-* size of returned resultset by filtering entries at the time they are read from the jdbc driver.
-*
-* Since the logic of the implementing class is probably complex, it is not reasonable to expect
-* classes that implement this interface to be uniquely describable to the point that hashCode()
-* and equals() will work.  However, support is provided via this interface in the chance that
-* such methods can be written.  (The definition of "sameness" is that two instances of this interface
-* would always return the same answers given the same inputs.)
-*/
-public interface ILimitChecker
-{
-  public static final String _rcsid = "@(#)$Id: ILimitChecker.java 988245 2010-08-23 18:39:35Z kwright $";
-
-
-  /** See if this class can be legitimately compared against another of
-  * the same type.
-  *@return true if comparisons will ever return "true".
-  */
-  public boolean doesCompareWork();
-
-  /** Create a duplicate of this class instance.  All current state should be preserved.
-  *@return the duplicate.
-  */
-  public ILimitChecker duplicate();
-
-  /** Find the hashcode for this class.  This will only ever be used if
-  * doesCompareWork() returns true.
-  *@return the hashcode.
-  */
-  public int hashCode();
-
-  /** Compare two objects and see if equal.  This will only ever be used
-  * if doesCompareWork() returns true.
-  *@param object is the object to compare against.
-  *@return true if equal.
-  */
-  public boolean equals(Object object);
-
-  /** See if a result row should be included in the final result set.
-  *@param row is the result row to check.
-  *@return true if it should be included, false otherwise.
-  */
-  public boolean checkInclude(IResultRow row)
-    throws ManifoldCFException;
-
-  /** See if we should examine another row.
-  *@return true if we need to keep going, or false if we are done.
-  */
-  public boolean checkContinue()
-    throws ManifoldCFException;
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ILockManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ILockManager.java
deleted file mode 100644
index 24206f0..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ILockManager.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/* $Id: ILockManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-
-/** The lock manager manages locks and shared data across all threads and JVMs and cluster members.  It also
-* manages transient shared data, which is not necessarily atomic and should be protected by locks.
-*/
-public interface ILockManager
-{
-  public static final String _rcsid = "@(#)$Id: ILockManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Node synchronization
-  
-  // The node synchronization model involves keeping track of active agents entities, so that other entities
-  // can perform any necessary cleanup if one of the agents processes goes away unexpectedly.  There is a
-  // registration primitive (which can fail if the same guid is used as is already registered and active), a
-  // shutdown primitive (which makes a process id go inactive), and various inspection primitives.
-  
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    IServiceCleanup cleanup)
-    throws ManifoldCFException;
-  
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param initialData is the initial service data for this service.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    byte[] initialData, IServiceCleanup cleanup)
-    throws ManifoldCFException;
-
-  /** Set service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@param serviceData is the data to update to (may be null).
-  * This updates the service's transient data (or deletes it).  If the service is not active, an exception is thrown.
-  */
-  public void updateServiceData(String serviceType, String serviceName, byte[] serviceData)
-    throws ManifoldCFException;
-
-  /** Retrieve service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@return the service's transient data.
-  */
-  public byte[] retrieveServiceData(String serviceType, String serviceName)
-    throws ManifoldCFException;
-  
-  /** Scan service data for a service type.  Only active service data will be considered.
-  *@param serviceType is the type of service.
-  *@param dataAcceptor is the object that will be notified of each item of data for each service name found.
-  */
-  public void scanServiceData(String serviceType, IServiceDataAcceptor dataAcceptor)
-    throws ManifoldCFException;
-
-  /** Count all active services of a given type.
-  *@param serviceType is the service type.
-  *@return the count.
-  */
-  public int countActiveServices(String serviceType)
-    throws ManifoldCFException;
-  
-  /** Clean up any inactive services found.
-  * Calling this method will invoke cleanup of one inactive service at a time.
-  * If there are no inactive services around, then false will be returned.
-  * Note that this method will block whatever service it finds from starting up
-  * for the time the cleanup is proceeding.  At the end of the cleanup, if
-  * successful, the service will be atomically unregistered.
-  *@param serviceType is the service type.
-  *@param cleanup is the object to call to clean up an inactive service.
-  *@return true if there were no cleanup operations necessary.
-  */
-  public boolean cleanupInactiveService(String serviceType, IServiceCleanup cleanup)
-    throws ManifoldCFException;
-
-  /** End service activity.
-  * This operation exits the "active" zone for the service.  This must take place using the same ILockManager
-  * object that was used to registerServiceBeginServiceActivity() - which implies that it is the same thread.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to exit.
-  */
-  public void endServiceActivity(String serviceType, String serviceName)
-    throws ManifoldCFException;
-    
-  /** Check whether a service is active or not.
-  * This operation returns true if the specified service is considered active at the moment.  Once a service
-  * is not active anymore, it can only return to activity by calling beginServiceActivity() once more.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to check on.
-  *@return true if the service is considered active.
-  */
-  public boolean checkServiceActive(String serviceType, String serviceName)
-    throws ManifoldCFException;
-
-  // Configuration
-  
-  /** Get the current shared configuration.  This configuration is available in common among all nodes,
-  * and thus must not be accessed through here for the purpose of finding configuration data that is specific to any one
-  * specific node.
-  *@param configurationData is the globally-shared configuration information.
-  */
-  public ManifoldCFConfiguration getSharedConfiguration()
-    throws ManifoldCFException;
-
-  // Flags
-  
-  /** Raise a flag.  Use this method to assert a condition, or send a global signal.  The flag will be reset when the
-  * entire system is restarted.
-  *@param flagName is the name of the flag to set.
-  */
-  public void setGlobalFlag(String flagName)
-    throws ManifoldCFException;
-
-  /** Clear a flag.  Use this method to clear a condition, or retract a global signal.
-  *@param flagName is the name of the flag to clear.
-  */
-  public void clearGlobalFlag(String flagName)
-    throws ManifoldCFException;
-  
-  /** Check the condition of a specified flag.
-  *@param flagName is the name of the flag to check.
-  *@return true if the flag is set, false otherwise.
-  */
-  public boolean checkGlobalFlag(String flagName)
-    throws ManifoldCFException;
-
-  // Shared data
-  
-  /** Read data from a shared data resource.  Use this method to read any existing data, or get a null back if there is no such resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@return a byte array containing the data, or null.
-  */
-  public byte[] readData(String resourceName)
-    throws ManifoldCFException;
-  
-  /** Write data to a shared data resource.  Use this method to write a body of data into a shared resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@param data is the byte array containing the data.  Pass null if you want to delete the resource completely.
-  */
-  public void writeData(String resourceName, byte[] data)
-    throws ManifoldCFException;
-
-  // Locks
-  
-  /** Wait for a time before retrying a lock.  Use this method to wait
-  * after a LockException has been thrown.  )If this is not done, the application
-  * will wind up busy waiting.)
-  *@param time is the amount of time to wait, in milliseconds.  Zero is a legal
-  * value, and will wait no time, but will give up the current timeslice to another
-  * thread.
-  */
-  public void timedWait(int time)
-    throws ManifoldCFException;
-
-  /** Enter a write locked code area (i.e., block out both readers and other writers).
-  * Write locks permit only ONE thread to be in the named section, across JVM's
-  * as well.  In order to guarantee this, the current thread may wait until all other
-  * threads have left the section.
-  *@param lockKey is the name of the lock.
-  */
-  public void enterWriteLock(String lockKey)
-    throws ManifoldCFException;
-
-  /** Enter a write locked code area (i.e., block out both readers and other writers),
-  * but do not wait if the lock cannot be obtained.
-  * Write locks permit only ONE thread to be in the named section, across JVM's
-  * as well.  In order to guarantee this, an exception (LockException) will be
-  * thrown if the lock condition cannot be met immediately.
-  *@param lockKey is the name of the lock.
-  */
-  public void enterWriteLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException;
-
-  /** Leave a write locked code area.  Use this method to exit a write-locked section. The lockKey
-  * parameter must correspond to the key used for the enter method.
-  * @param lockKey is the name of the lock.
-  */
-  public void leaveWriteLock(String lockKey)
-    throws ManifoldCFException;
-
-  /** Enter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers").
-  * This kind of lock is designed to be used in conjunction with read locks.  It is used typically in
-  * a situation where the read lock represents a query and the non-exclusive write lock represents a modification
-  * to an individual item that might affect the query, but where multiple modifications do not individually
-  * interfere with one another (use of another, standard, write lock per item can guarantee this).
-  * This method works across JVMs, and may wait if the required lock cannot be immediately obtained.
-  *@param lockKey is the name of the lock.
-  */
-  public void enterNonExWriteLock(String lockKey)
-    throws ManifoldCFException;
-
-  /** Enter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers").
-  * This kind of lock is designed to be used in conjunction with read locks.  It is used typically in
-  * a situation where the read lock represents a query and the non-exclusive write lock represents a modification
-  * to an individual item that might affect the query, but where multiple modifications do not individually
-  * interfere with one another (use of another, standard, write lock per item can guarantee this).
-  * This method works across JVMs, and will throw LockException if the lock condition cannot be immediately met.
-  *@param lockKey is the name of the lock.
-  */
-  public void enterNonExWriteLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException;
-
-  /** Leave a non-exclusive write locked code area.  Use this method to exit a non-ex-write-locked section.
-  * The lockKey
-  * parameter must correspond to the key used for the enter method.
-  *@param lockKey is the name of the lock.
-  */
-  public void leaveNonExWriteLock(String lockKey)
-    throws ManifoldCFException;
-
-  /** Enter a read-only locked area (i.e., block ONLY if there's a writer).  This kind of lock
-  * permits multiple threads inside the same code area, but only if there is no "writer" in the
-  * same section at the same time.
-  * This method works across JVMs, and may wait if the required lock cannot be immediately obtained.
-  *@param lockKey is the name of the lock.
-  */
-  public void enterReadLock(String lockKey)
-    throws ManifoldCFException;
-
-  /** Enter a read-only locked area (i.e., block ONLY if there's a writer).  This kind of lock
-  * permits multiple threads inside the same code area, but only if there is no "writer" in the
-  * same section at the same time.
-  * This method works across JVMs, and will throw LockException if the required lock cannot be immediately met.
-  *@param lockKey is the name of the lock.
-  */
-  public void enterReadLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException;
-
-  /** Leave a read-locked code area.  Use this method to exit a read-locked section.  The lockKey
-  * parameter must correspond to the key used for the enter method.
-  *@param lockKey is the name of the lock.
-  */
-  public void leaveReadLock(String lockKey)
-    throws ManifoldCFException;
-
-  /** Enter multiple locks simultaneously.  Use this method if a series or set of locks needs to be
-  * thrown for an operation to take place.  This operation will avoid deadlock if all the locks are
-  * thrown at the start of the area using this method.
-  * This method works cross-JVM, and will wait if the required locks are not available.
-  *@param readLocks is an array of read lock names, or null if there are no read locks desired.
-  *@param nonExWriteLocks is an array of non-ex write lock names, or null if none desired.
-  *@param writeLocks is an array of write lock names, or null if there are none desired.
-  */
-  public void enterLocks(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException;
-
-  /** Enter multiple locks simultaneously.  Use this method if a series or set of locks needs to be
-  * thrown for an operation to take place.  This operation will avoid deadlock if all the locks are
-  * thrown at the start of the area using this method.
-  * This method works cross-JVM, and will throw LockException if the required locks are not available.
-  *@param readLocks is an array of read lock names, or null if there are no read locks desired.
-  *@param nonExWriteLocks is an array of non-ex write lock names, or null if none desired.
-  *@param writeLocks is an array of write lock names, or null if there are none desired.
-  */
-  public void enterLocksNoWait(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException, LockException;
-
-  /** Leave multiple locks. Use this method to leave a section started with enterLocks() or
-  * enterLocksNoWait().  The parameters must correspond to those passed to the enter method.
-  *@param readLocks is an array of read lock names, or null if there are no read locks desired.
-  *@param nonExWriteLocks is an array of non-ex write lock names, or null if none desired.
-  *@param writeLocks is an array of write lock names, or null if there are none desired.
-  */
-  public void leaveLocks(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException;
-
-  /** Clear all outstanding locks in the system.
-  * This is a very dangerous method to use (obviously)...
-  */
-  public void clearLocks()
-    throws ManifoldCFException;
-
-  // Critical sections
-  
-  /** Enter a named, read critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  public void enterReadCriticalSection(String sectionKey)
-    throws ManifoldCFException;
-
-  /** Leave a named, read critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  public void leaveReadCriticalSection(String sectionKey)
-    throws ManifoldCFException;
-
-  /** Enter a named, non-exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  public void enterNonExWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException;
-
-  /** Leave a named, non-exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  public void leaveNonExWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException;
-
-
-  /** Enter a named, exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  public void enterWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException;
-
-  /** Leave a named, exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  public void leaveWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException;
-
-  /** Enter multiple critical sections simultaneously.
-  *@param readSectionKeys is an array of read section descriptors, or null if there are no read sections desired.
-  *@param nonExSectionKeys is an array of non-ex write section descriptors, or null if none desired.
-  *@param writeSectionKeys is an array of write section descriptors, or null if there are none desired.
-  */
-  public void enterCriticalSections(String[] readSectionKeys, String[] nonExSectionKeys, String[] writeSectionKeys)
-    throws ManifoldCFException;
-
-  /** Leave multiple critical sections simultaneously.
-  *@param readSectionKeys is an array of read section descriptors, or null if there are no read sections desired.
-  *@param nonExSectionKeys is an array of non-ex write section descriptors, or null if none desired.
-  *@param writeSectionKeys is an array of write section descriptors, or null if there are none desired.
-  */
-  public void leaveCriticalSections(String[] readSectionKeys, String[] nonExSectionKeys, String[] writeSectionKeys)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IParameterActivity.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IParameterActivity.java
deleted file mode 100644
index 737b618..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IParameterActivity.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** This interface represents parameters that get posted during UI interaction.
-*/
-public interface IParameterActivity
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Read an array of parameter values.
-  *@param name is the parameter name.
-  *@return the array of values, or null if it doesn't exist.
-  */
-  public String[] getParameterValues(String name);
-  
-  /** Get single parameter value.
-  *@param name is the parameter name.
-  *@return the value, or null if it doesn't exist.
-  */
-  public String getParameter(String name);
-  
-  /** Get a file parameter, as a binary input stream.
-  *@param name is the parameter name.
-  *@return the value, or null if it doesn't exist.
-  */
-  public BinaryInput getBinaryStream(String name)
-    throws ManifoldCFException;
-  
-  /** Get file parameter, as a byte array.
-  *@param name is the parameter name.
-  *@return the binary parameter as an array of bytes.
-  */
-  public byte[] getBinaryBytes(String name);
-  
-  /** Set a parameter value.
-  *@param name is the parameter name.
-  *@param value is the desired value.
-  */
-  public void setParameter(String name, String value);
-  
-  /** Set an array of parameter values.
-  *@param name is the parameter name.
-  *@param values is the array of desired values.
-  */
-  public void setParameterValues(String name, String[] values);
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPasswordMapperActivity.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPasswordMapperActivity.java
deleted file mode 100644
index 685ebec..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPasswordMapperActivity.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-
-/** This interface abstracts from password mapping activity, available for
-* all connector-provided UI components.
-* Passwords should not appear in any data sent from the crawler UI to the browser.  The
-* following methods are provided to assist the connector UI components in this task.
-* A connector coder should use these services as follows:
-* - When the password would ordinarily be put into a form element as the current password,
-*    instead use mapPasswordToKey() to create a key and put that in instead.
-* - When the "password" is posted, and the post is processed, use mapKeyToPassword() to
-*    restore the correct password.
-*/
-public interface IPasswordMapperActivity
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Map a password to a unique key.
-  * This method works within a specific given browser session to replace an existing password with
-  * a key which can be used to look up the password at a later time.
-  *@param password is the password.
-  *@return the key.
-  */
-  public String mapPasswordToKey(String password);
-  
-  /** Convert a key, created by mapPasswordToKey, back to the original password, within
-  * the lifetime of the browser session.  If the provided key is not an actual key, instead
-  * the key value is assumed to be a new password value.
-  *@param key is the key.
-  *@return the password.
-  */
-  public String mapKeyToPassword(String key);
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPollingHook.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPollingHook.java
deleted file mode 100644
index f23649f..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPollingHook.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes functionality needed for a periodic polling operation */
-public interface IPollingHook
-{
-  /** Do the requisite cleanup.
-  */
-  public void doPoll(IThreadContext threadContext)
-    throws ManifoldCFException;
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPostParameters.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPostParameters.java
deleted file mode 100644
index 0093191..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IPostParameters.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id: IPostParameters.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** This interface represents resources that are made available to connector methods
-* during UI post operations.
-*/
-public interface IPostParameters extends IParameterActivity, IPasswordMapperActivity
-{
-  public static final String _rcsid = "@(#)$Id: IPostParameters.java 988245 2010-08-23 18:39:35Z kwright $";
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IResultRow.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IResultRow.java
deleted file mode 100644
index 42d4072..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IResultRow.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: IResultRow.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** This interface allows immutable access to a resultset row.
-*/
-public interface IResultRow
-{
-  public static final String _rcsid = "@(#)$Id: IResultRow.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Obtain the number of columns in the row.
-  *@return the number of columns that row contains.
-  */
-  public int getColumnCount();
-
-  /** Obtain the set of columns for a row.
-  @return an iterator that will list all the (String) column names stored in that row.
-  */
-  public Iterator<String> getColumns();
-
-  /** Get the row value for a column.
-  *@param columnName is the name of the column.
-  *@return the value, or null if not present.
-  */
-  public Object getValue(String columnName);
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IResultSet.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IResultSet.java
deleted file mode 100644
index 5f5a0e8..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IResultSet.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* $Id: IResultSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** This interface represents a resultset.  Resultsets are immutable through this interface,
-* and are accessed by row.
-*/
-public interface IResultSet
-{
-  public static final String _rcsid = "@(#)$Id: IResultSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Get a specific row in the resultset.
-  *@param rowNumber is the number of the row.
-  *@return the immutable row description, or null if there is no such row.
-  */
-  public IResultRow getRow(int rowNumber);
-
-  /** Get the number of rows in this resultset.
-  *@return the number of rows the resultset contains.
-  */
-  public int getRowCount();
-
-  /** Get an array of all the rows.
-  * This method is NOT preferred because it requires a new
-  * array object to be constructed.
-  *@return the array.
-  */
-  public IResultRow[] getRows();
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ISSLSocketFactoryProducer.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ISSLSocketFactoryProducer.java
deleted file mode 100644
index 6d9fd1d..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ISSLSocketFactoryProducer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes a class that produces a SSLSocketFactory.
-*/
-public interface ISSLSocketFactoryProducer
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Build a secure socket factory based on this producer.
-  */
-  public javax.net.ssl.SSLSocketFactory getSecureSocketFactory()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IServiceCleanup.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IServiceCleanup.java
deleted file mode 100644
index a06c085..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IServiceCleanup.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-
-/** The IServiceCleanup interface describes functionality needed to clean up after
-* a service that has ended, as determined by an ILockManager instance.  It is always
-* throttled in a manner where only one thread in
-* the entire cluster will be cleaning up after any specific service.
-*/
-public interface IServiceCleanup
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Clean up after the specified service.  This method will block any startup of the specified
-  * service for as long as it runs.
-  *@param serviceName is the name of the service.
-  */
-  public void cleanUpService(String serviceName)
-    throws ManifoldCFException;
-
-  /** Clean up after ALL services of the type on the cluster.
-  */
-  public void cleanUpAllServices()
-    throws ManifoldCFException;
-  
-  /** Perform cluster initialization - that is, whatever is needed presuming that the
-  * cluster has been down for an indeterminate period of time, but is otherwise in a clean
-  * state.
-  */
-  public void clusterInit()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IServiceDataAcceptor.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IServiceDataAcceptor.java
deleted file mode 100644
index 16e077b..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IServiceDataAcceptor.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-
-/** The IServiceDataAcceptor interface describes functionality needed to
-* tally service data values across all active services of a type.
-*/
-public interface IServiceDataAcceptor
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Accept service data.
-  *@param serviceName is the name of the service that owns the data.
-  *@param serviceData is the actual data that is owned.
-  *@return true to abort the scan.
-  */
-  public boolean acceptServiceData(String serviceName, byte[] serviceData)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IShutdownHook.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IShutdownHook.java
deleted file mode 100644
index 4a58505..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IShutdownHook.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $Id: IShutdownHook.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes functionality needed for a shutdown hook */
-public interface IShutdownHook
-{
-  /** Do the requisite cleanup.
-  */
-  public void doCleanup(IThreadContext threadContext)
-    throws ManifoldCFException;
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThreadContext.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThreadContext.java
deleted file mode 100644
index 4ff3a63..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThreadContext.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* $Id: IThreadContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This interface describes the functionality in a thread context.
-* Thread contexts exist as a place to park objects that should exist
-* at most once per thread.  While there is no guarantee that this would
-* be enforced, the semantics don't generally fail with multiple instances,
-* but they do become inefficient.
-* But, in any case, an IThreadContext object should NEVER be shared among threads!!!
-*/
-public interface IThreadContext
-{
-  public static final String _rcsid = "@(#)$Id: IThreadContext.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Set a named object into the context.
-  * @param key is the name of the object (usually a string)
-  * @param object is the object to save, or null if the object is to be
-  * destroyed instead.
-  */
-  public void save(Object key, Object object);
-
-  /** Retrieve a named object from the context.
-  * Use an equivalent key to retrieve what was previously saved.
-  * If no such object exists, null will be returned.
-  * @param key is the object's key (usually a string)
-  * @return the object, or null.
-  */
-  public Object get(Object key);
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IndexDescription.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IndexDescription.java
deleted file mode 100644
index dd2955d..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IndexDescription.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $Id: IndexDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** Describe a database index.
-*/
-public class IndexDescription
-{
-  public static final String _rcsid = "@(#)$Id: IndexDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected boolean isUnique;
-  protected String[] columnNames;
-
-  /** Create an index description.
-  * Use this object in addTableIndex()
-  *@param isUnique is true if the index is unique.
-  *@param columnNames are the column names desired for this index.
-  */
-  public IndexDescription(boolean isUnique, String[] columnNames)
-  {
-    this.isUnique = isUnique;
-    this.columnNames = columnNames;
-  }
-
-  public boolean getIsUnique()
-  {
-    return isUnique;
-  }
-
-  public String[] getColumnNames()
-  {
-    return columnNames;
-  }
-
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof IndexDescription))
-      return false;
-    IndexDescription id = (IndexDescription)o;
-    if (id.isUnique != isUnique || id.columnNames.length != columnNames.length)
-      return false;
-
-    int i = 0;
-    while (i < columnNames.length)
-    {
-      if (!columnNames[i].equals(id.columnNames[i]))
-        return false;
-      i++;
-    }
-    return true;
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/JoinClause.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/JoinClause.java
deleted file mode 100644
index fe40bf1..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/JoinClause.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-public class JoinClause implements ClauseDescription
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final String columnName;
-  protected final String joinColumnName;
-  protected final String operation;
-  
-  /** Construct */
-  public JoinClause(String columnName, String joinColumnName)
-  {
-    this(columnName,joinColumnName,"=");
-  }
-  
-  public JoinClause(String columnName, String joinColumnName, String operation)
-  {
-    this.columnName = columnName;
-    this.joinColumnName = joinColumnName;
-    this.operation = operation;
-  }
-  
-  /** Get the column name */
-  public String getColumnName()
-  {
-    return columnName;
-  }
-  
-  /** Get the operation string */
-  public String getOperation()
-  {
-    return operation;
-  }
-  
-  /** Get the individual values */
-  public List getValues()
-  {
-    return null;
-  }
-  
-  /** Get the join column name */
-  public String getJoinColumnName()
-  {
-    return joinColumnName;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/LockException.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/LockException.java
deleted file mode 100644
index c735359..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/LockException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id: LockException.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-public class LockException extends java.lang.Exception
-{
-  public static final String _rcsid = "@(#)$Id: LockException.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /**
-  * Constructs an exception with the reason.
-  *
-  * @param reason the description of the exception
-  */
-  public LockException(String reason)
-  {
-    super(reason);
-  }
-
-};
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/LockManagerFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/LockManagerFactory.java
deleted file mode 100644
index 186ecff..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/LockManagerFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $Id: LockManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-public class LockManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: LockManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final static String lockManager = "_LockManager_";
-
-  private LockManagerFactory()
-  {
-  }
-
-  /** Instantiate a lock manager.
-  * This should be thread specific (so that locks can nest properly in the same
-  * thread).
-  */
-  public static ILockManager make(IThreadContext context)
-    throws ManifoldCFException
-  {
-    Object x = context.get(lockManager);
-    if (x == null || !(x instanceof ILockManager))
-    {
-      String implementationClass = ManifoldCF.getStringProperty(ManifoldCF.lockManagerImplementation,
-        "org.apache.manifoldcf.core.lockmanager.LockManager");
-      try
-      {
-        Class c = Class.forName(implementationClass);
-        x = c.newInstance();
-        if (!(x instanceof ILockManager))
-          throw new ManifoldCFException("Lock manager class "+implementationClass+" does not implement ILockManager",ManifoldCFException.SETUP_ERROR);
-        context.save(lockManager,x);
-      }
-      catch (ClassNotFoundException e)
-      {
-        throw new ManifoldCFException("Lock manager class "+implementationClass+" could not be found: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (ExceptionInInitializerError e)
-      {
-        throw new ManifoldCFException("Lock manager class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (LinkageError e)
-      {
-        throw new ManifoldCFException("Lock manager class "+implementationClass+" could not be linked: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (InstantiationException e)
-      {
-        throw new ManifoldCFException("Lock manager class "+implementationClass+" could not be instantiated: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-      catch (IllegalAccessException e)
-      {
-        throw new ManifoldCFException("Lock manager class "+implementationClass+" had no public default initializer: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-      }
-    }
-    return (ILockManager)x;
-  }
-
-  public static String getProperty(IThreadContext tc, String s)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getProperty(s);
-  }
-  
-  public static String getStringProperty(IThreadContext tc, String s, String defaultValue)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getStringProperty(s, defaultValue);
-  }
-  
-  public static String getPossiblyObfuscatedStringProperty(IThreadContext tc, String s, String defaultValue)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getPossiblyObfuscatedStringProperty(s, defaultValue);
-  }
-  
-  public static int getIntProperty(IThreadContext tc, String s, int defaultValue)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getIntProperty(s, defaultValue);
-  }
-
-  public static long getLongProperty(IThreadContext tc, String s, long defaultValue)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getLongProperty(s, defaultValue);
-  }
-  
-  public static double getDoubleProperty(IThreadContext tc, String s, double defaultValue)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getDoubleProperty(s, defaultValue);
-  }
-  
-  public static boolean getBooleanProperty(IThreadContext tc, String s, boolean defaultValue)
-    throws ManifoldCFException
-  {
-    return make(tc).getSharedConfiguration().getBooleanProperty(s, defaultValue);
-  }
-  
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ManifoldCFConfiguration.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ManifoldCFConfiguration.java
deleted file mode 100644
index c37cfd3..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ManifoldCFConfiguration.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/* $Id: ManifoldCFConfiguration.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-import java.io.*;
-
-/** This class represents the configuration data read from the main ManifoldCF configuration
-* XML file.
-*/
-public class ManifoldCFConfiguration extends Configuration
-{
-  public static final String _rcsid = "@(#)$Id: ManifoldCFConfiguration.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Configuration XML node names and attribute names
-  public static final String NODE_PROPERTY = "property";
-  public static final String ATTRIBUTE_NAME = "name";
-  public static final String ATTRIBUTE_VALUE = "value";
-
-  protected final Map<String,String> localProperties = new HashMap<String,String>();
-
-  /** Constructor.
-  */
-  public ManifoldCFConfiguration()
-  {
-    super("configuration");
-  }
-
-  /** Construct from XML.
-  *@param xmlStream is the input XML stream.
-  */
-  public ManifoldCFConfiguration(InputStream xmlStream)
-    throws ManifoldCFException
-  {
-    super("configuration");
-    fromXML(xmlStream);
-    parseProperties();
-  }
-
-  public String getProperty(String s)
-  {
-    return localProperties.get(s);
-  }
-  
-  /** Read a (string) property, either from the system properties, or from the local configuration file.
-  *@param s is the property name.
-  *@param defaultValue is the default value for the property.
-  *@return the property value, as a string.
-  */
-  public String getStringProperty(String s, String defaultValue)
-  {
-    String rval = getProperty(s);
-    if (rval == null)
-      rval = defaultValue;
-    return rval;
-  }
-
-  /** Read a possibly obfuscated string property, either from the system properties, or from the local configuration file.
-  *@param s is the property name.
-  *@param defaultValue is the default value for the property.
-  *@return the property value, as a string.
-  */
-  public String getPossiblyObfuscatedStringProperty(String s, String defaultValue)
-    throws ManifoldCFException
-  {
-    String obfuscatedPropertyName = s + ".obfuscated";
-    String rval = getProperty(obfuscatedPropertyName);
-    if (rval != null)
-      return org.apache.manifoldcf.core.system.ManifoldCF.deobfuscate(rval);
-    rval = getProperty(s);
-    if (rval == null)
-      rval = defaultValue;
-    return rval;
-  }
-
-  /** Read a boolean property
-  */
-  public boolean getBooleanProperty(String s, boolean defaultValue)
-    throws ManifoldCFException
-  {
-    String value = getProperty(s);
-    if (value == null)
-      return defaultValue;
-    if (value.equals("true") || value.equals("yes"))
-      return true;
-    if (value.equals("false") || value.equals("no"))
-      return false;
-    throw new ManifoldCFException("Illegal property value for boolean property '"+s+"': '"+value+"'");
-  }
-  
-  /** Read an integer property, either from the system properties, or from the local configuration file.
-  */
-  public int getIntProperty(String s, int defaultValue)
-    throws ManifoldCFException
-  {
-    String value = getProperty(s);
-    if (value == null)
-      return defaultValue;
-    try
-    {
-      return Integer.parseInt(value);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Illegal property value for integer property '"+s+"': '"+value+"': "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-  }
-
-  /** Read a long property, either from the system properties, or from the local configuration file.
-  */
-  public long getLongProperty(String s, long defaultValue)
-    throws ManifoldCFException
-  {
-    String value = getProperty(s);
-    if (value == null)
-      return defaultValue;
-    try
-    {
-      return Long.parseLong(value);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Illegal property value for long property '"+s+"': '"+value+"': "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-  }
-
-  /** Read a float property, either from the system properties, or from the local configuration file.
-  */
-  public double getDoubleProperty(String s, double defaultValue)
-    throws ManifoldCFException
-  {
-    String value = getProperty(s);
-    if (value == null)
-      return defaultValue;
-    try
-    {
-      return Double.parseDouble(value);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Illegal property value for double property '"+s+"': '"+value+"': "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-    }
-  }
-
-  protected void parseProperties()
-    throws ManifoldCFException
-  {
-    // For convenience, post-process all "property" nodes so that we have a semblance of the earlier name/value pairs available, by default.
-    // e.g. <property name= value=/>
-    localProperties.clear();
-    for (int i = 0; i < getChildCount(); i++)
-    {
-      ConfigurationNode cn = findChild(i);
-      if (cn.getType().equals(NODE_PROPERTY))
-      {
-        String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-        String value = cn.getAttributeValue(ATTRIBUTE_VALUE);
-        if (name == null)
-          throw new ManifoldCFException("Node type '"+NODE_PROPERTY+"' requires a '"+ATTRIBUTE_NAME+"' attribute");
-        localProperties.put(name,value);
-      }
-    }
-  }
-  
-  /** Read from an input stream.
-  */
-  @Override
-  public void fromXML(InputStream is)
-    throws ManifoldCFException
-  {
-    super.fromXML(is);
-    parseProperties();
-  }
-  
-  /** Create a new object of the appropriate class.
-  */
-  @Override
-  protected Configuration createNew()
-  {
-    return new ManifoldCFConfiguration();
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ManifoldCFException.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ManifoldCFException.java
deleted file mode 100644
index f6246bd..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ManifoldCFException.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id: ManifoldCFException.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-public class ManifoldCFException extends Exception
-{
-  public static final String _rcsid = "@(#)$Id: ManifoldCFException.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public final static int GENERAL_ERROR = 0;
-  public final static int DATABASE_ERROR = 1;
-  public final static int INTERRUPTED = 2;
-  public final static int SETUP_ERROR = 3;
-  public final static int DATABASE_CONNECTION_ERROR = 4;
-  public final static int REPOSITORY_CONNECTION_ERROR = 5;
-  public final static int DATABASE_TRANSACTION_ABORT = 6;
-  // MHL
-
-  protected int errcode;
-
-  public ManifoldCFException(String errString)
-  {
-    super(errString);
-    this.errcode = GENERAL_ERROR;
-  }
-
-  public ManifoldCFException(String errString, int errcode)
-  {
-    super(errString);
-    this.errcode = errcode;
-  }
-
-  public ManifoldCFException(String errString, Throwable cause, int errcode)
-  {
-    super(errString,cause);
-    this.errcode = errcode;
-  }
-
-  public ManifoldCFException(String errString, Throwable cause)
-  {
-    super(errString,cause);
-    this.errcode = GENERAL_ERROR;
-  }
-
-  public ManifoldCFException(Throwable cause, int errcode)
-  {
-    super(cause);
-    this.errcode = errcode;
-  }
-
-  public ManifoldCFException(Throwable cause)
-  {
-    super(cause);
-    this.errcode = GENERAL_ERROR;
-  }
-
-  public int getErrorCode()
-  {
-    return errcode;
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/MultiClause.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/MultiClause.java
deleted file mode 100644
index cea8f4f..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/MultiClause.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-public class MultiClause implements ClauseDescription
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected String columnName;
-  protected List values;
-  
-  /** Construct */
-  public MultiClause(String columnName, List values)
-  {
-    this.columnName = columnName;
-    this.values = values;
-  }
-  
-  public MultiClause(String columnName, Object[] values)
-  {
-    this.columnName = columnName;
-    this.values = new ArrayList();
-    for (int i = 0 ; i < values.length ; i++)
-    {
-      this.values.add(values[i]);
-    }
-  }
-  
-  /** Get the column name */
-  public String getColumnName()
-  {
-    return columnName;
-  }
-  
-  /** Get the operation string */
-  public String getOperation()
-  {
-    return "=";
-  }
-  
-  /** Get the individual values */
-  public List getValues()
-  {
-    return values;
-  }
-  
-  /** Get the join column name */
-  public String getJoinColumnName()
-  {
-    return null;
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/NullCharacterInput.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/NullCharacterInput.java
deleted file mode 100644
index 93625bd..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/NullCharacterInput.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** This class represents a null character stream, which has no characters.
-*/
-public class NullCharacterInput extends CharacterInput
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Construct from nothing.
-  */
-  public NullCharacterInput()
-  {
-    super();
-  }
-
-  @Override
-  public Reader getStream()
-    throws ManifoldCFException
-  {
-    return new StringReader("");
-  }
-
-  @Override
-  public void doneWithStream()
-    throws ManifoldCFException
-  {
-  }
-
-  @Override
-  public long getCharacterLength()
-    throws ManifoldCFException
-  {
-    return 0L;
-  }
-
-  @Override
-  public String getHashValue()
-    throws ManifoldCFException
-  {
-    return ManifoldCF.getHashValue(ManifoldCF.startHash());
-  }
-
-  /** Open a Utf8 stream directly */
-  @Override
-  public InputStream getUtf8Stream()
-    throws ManifoldCFException
-  {
-    return new ByteArrayInputStream(new byte[]{});
-  }
-
-  /** Get binary UTF8 stream length directly */
-  @Override
-  public long getUtf8StreamLength()
-    throws ManifoldCFException
-  {
-    return 0L;
-  }
-
-  /** Transfer to a new object; this causes the current object to become "already discarded" */
-  @Override
-  public CharacterInput transfer()
-  {
-    return new NullCharacterInput();
-  }
-
-  /** Discard this object permanently */
-  @Override
-  public void discard()
-    throws ManifoldCFException
-  {
-  }
-
-  // Protected methods
-
-  /** Open a reader, for use by a caller, until closeStream is called */
-  @Override
-  protected void openStream()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Close any open reader */
-  @Override
-  protected void closeStream()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Calculate the datum's length in characters */
-  @Override
-  protected void calculateLength()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Calculate the datum's hash value */
-  @Override
-  protected void calculateHashValue()
-    throws ManifoldCFException
-  {
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/NullCheckClause.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/NullCheckClause.java
deleted file mode 100644
index 4ae4afa..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/NullCheckClause.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-public class NullCheckClause implements ClauseDescription
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected String columnName;
-  protected boolean isNull;
-  
-  /** Construct */
-  public NullCheckClause(String columnName, boolean isNull)
-  {
-    this.columnName = columnName;
-    this.isNull = isNull;
-  }
-  
-  /** Get the column name */
-  public String getColumnName()
-  {
-    return columnName;
-  }
-  
-  /** Get the operation string */
-  public String getOperation()
-  {
-    return isNull?" IS NULL":" IS NOT NULL";
-  }
-  
-  /** Get the individual values */
-  public List getValues()
-  {
-    return null;
-  }
-  
-  /** Get the join column name */
-  public String getJoinColumnName()
-  {
-    return null;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/PersistentDatabaseObject.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/PersistentDatabaseObject.java
deleted file mode 100644
index ac66386..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/PersistentDatabaseObject.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** Objects derived from this class can function as database parameters or as results.  In
-* both cases, they must be managed specially because they are potentially backed by disk files,
-* and the data within is treated as a stream (of something) rather than a scalar piece of data.
-*/
-public abstract class PersistentDatabaseObject
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Construct from nothing.
-  */
-  public PersistentDatabaseObject()
-  {
-  }
-
-  /** Close any open streams, but do NOT remove the backing object.
-  * Thus the stream can be reopened in the future. */
-  public abstract void doneWithStream()
-    throws ManifoldCFException;
-  
-  /** Discard this object permanently */
-  public abstract void discard()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ResultSpecification.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ResultSpecification.java
deleted file mode 100644
index 63de3bc..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ResultSpecification.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/* $Id: ResultSpecification.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** An instance of this class is used to specify the result form of a column, if
-* more than one form is possible.  If no form is specified, then a default form
-* will be used.
-*/
-public class ResultSpecification
-{
-  public static final int FORM_DEFAULT = 0;
-  public static final int FORM_STRING = 1;
-  public static final int FORM_STREAM = 2;
-
-  /** This map has a column name as a key, and a ColumnSpecification object as a value */
-  protected HashMap columnSpecifications = new HashMap();
-
-  /** Constructor */
-  public ResultSpecification()
-  {
-  }
-
-  /** Calculate a hash value **/
-  public int hashCode()
-  {
-    String[] keys = new String[columnSpecifications.size()];
-    Iterator iter = columnSpecifications.keySet().iterator();
-    int i = 0;
-    while (iter.hasNext())
-    {
-      keys[i++] = (String)iter.next();
-    }
-    java.util.Arrays.sort(keys);
-    int rval = 0;
-    i = 0;
-    while (i < keys.length)
-    {
-      String key = keys[i++];
-      rval += key.hashCode();
-      ColumnSpecification cs = (ColumnSpecification)columnSpecifications.get(key);
-      rval += cs.hashCode();
-    }
-    return rval;
-  }
-
-  /** Check equals */
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof ResultSpecification))
-      return false;
-    ResultSpecification other = (ResultSpecification)o;
-    if (other.columnSpecifications.size() != columnSpecifications.size())
-      return false;
-    Iterator iter = columnSpecifications.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String key = (String)iter.next();
-      ColumnSpecification thisSpec = (ColumnSpecification)columnSpecifications.get(key);
-      ColumnSpecification otherSpec = (ColumnSpecification)other.columnSpecifications.get(key);
-      if (otherSpec == null)
-        return false;
-      if (!thisSpec.equals(otherSpec))
-        return false;
-    }
-    return true;
-  }
-
-  /** Convert to a unique string */
-  public String toString()
-  {
-    StringBuilder sb = new StringBuilder();
-    String[] keys = new String[columnSpecifications.size()];
-    Iterator iter = columnSpecifications.keySet().iterator();
-    int i = 0;
-    while (iter.hasNext())
-    {
-      keys[i++] = (String)iter.next();
-    }
-    java.util.Arrays.sort(keys);
-    sb.append(Integer.toString(keys.length));
-    i = 0;
-    while (i < keys.length)
-    {
-      String key = keys[i++];
-      sb.append("-").append(key);
-      ColumnSpecification cs = (ColumnSpecification)columnSpecifications.get(key);
-      sb.append("-").append(cs.toString());
-    }
-    return sb.toString();
-  }
-
-  /** Specify that a column is to be read as a file stream, if possible */
-  public void setForm(String columnName, int formValue)
-  {
-    ColumnSpecification cs = (ColumnSpecification)columnSpecifications.get(columnName);
-    if (cs == null)
-    {
-      if (formValue == FORM_DEFAULT)
-        return;
-      cs = new ColumnSpecification();
-      columnSpecifications.put(columnName,cs);
-    }
-    else
-    {
-      if (formValue == FORM_DEFAULT)
-      {
-        columnSpecifications.remove(columnName);
-        return;
-      }
-    }
-    cs.setForm(formValue);
-  }
-
-  /** Get the specified form of a column */
-  public int getForm(String columnName)
-  {
-    ColumnSpecification cs = (ColumnSpecification)columnSpecifications.get(columnName);
-    if (cs == null)
-      return FORM_DEFAULT;
-    return cs.getForm();
-  }
-
-  protected static class ColumnSpecification
-  {
-    protected int formValue;
-
-    public ColumnSpecification()
-    {
-      formValue = FORM_DEFAULT;
-    }
-
-    public void setForm(int formValue)
-    {
-      this.formValue = formValue;
-    }
-
-    public int getForm()
-    {
-      return formValue;
-    }
-
-    public String toString()
-    {
-      return Integer.toString(formValue);
-    }
-
-    public int hashCode()
-    {
-      return formValue;
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ColumnSpecification))
-        return false;
-      ColumnSpecification other = (ColumnSpecification)o;
-      return other.formValue == formValue;
-    }
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Specification.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Specification.java
deleted file mode 100644
index 2b5e8fa..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/Specification.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id: Specification.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-import java.io.*;
-
-/** This class represents a specification, which is a generalized hierarchy of nodes that
-* can be interpreted by an appropriate connector in an appropriate way.
-*/
-public class Specification extends Configuration
-{
-  public static final String _rcsid = "@(#)$Id: Specification.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Constructor.
-  */
-  public Specification()
-  {
-    super("specification");
-  }
-
-  /** Construct from XML.
-  *@param xml is the input XML.
-  */
-  public Specification(String xml)
-    throws ManifoldCFException
-  {
-    super("specification");
-    fromXML(xml);
-  }
-
-  /** Create a new object of the appropriate class.
-  */
-  protected Configuration createNew()
-  {
-    return new Specification();
-  }
-  
-  /** Create a new child node of the appropriate type and class.
-  */
-  protected ConfigurationNode createNewNode(String type)
-  {
-    return new SpecificationNode(type);
-  }
-
-  /** Get child n.
-  *@param index is the child number.
-  *@return the child node.
-  */
-  public SpecificationNode getChild(int index)
-  {
-    return (SpecificationNode)findChild(index);
-  }
-
-  /** Duplicate.
-  *@return an exact duplicate
-  */
-  public Specification duplicate(boolean readOnly)
-  {
-    if (readOnly && this.readOnly)
-      return this;
-    Specification rval = new Specification();
-    int i = 0;
-    while (i < children.size())
-    {
-      SpecificationNode node = (SpecificationNode)children.get(i++);
-      rval.children.add(node.duplicate(readOnly));
-    }
-    rval.readOnly = readOnly;
-    return rval;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/SpecificationNode.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/SpecificationNode.java
deleted file mode 100644
index 8279dfc..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/SpecificationNode.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* $Id: SpecificationNode.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.util.*;
-
-/** This class represents a node in a specification structure.  Its existence apart from
-* ConfigurationNode is largely a relic.
-*/
-public class SpecificationNode extends ConfigurationNode
-{
-  public static final String _rcsid = "@(#)$Id: SpecificationNode.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Constructor.
-  */
-  public SpecificationNode(String type)
-  {
-    super(type);
-  }
-
-  /** Copy constructor.
-  */
-  public SpecificationNode(ConfigurationNode source)
-  {
-    super(source);
-  }
-  
-  /** Create a new node of this same type and class.
-  */
-  protected ConfigurationNode createNewNode()
-  {
-    return new SpecificationNode(type);
-  }
-
-  /** Make a new node that is a copy of the specified node.
-  */
-  protected ConfigurationNode createNewNode(ConfigurationNode source)
-  {
-    return new SpecificationNode(source);
-  }
-  
-  /** Duplicate.
-  *@return the duplicate.
-  */
-  public SpecificationNode duplicate(boolean readOnly)
-  {
-    return (SpecificationNode)createDuplicate(readOnly);
-  }
-
-  /** Get child n.
-  *@param index is the child number.
-  *@return the child node.
-  */
-  public SpecificationNode getChild(int index)
-  {
-    return (SpecificationNode)findChild(index);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/StringSet.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/StringSet.java
deleted file mode 100644
index ebb2c18..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/StringSet.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/* $Id: StringSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-/** Immutable helper class, representing an unordered set of strings
-*/
-public class StringSet
-{
-  public static final String _rcsid = "@(#)$Id: StringSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected HashMap hashtable = new HashMap();
-  protected String descriptiveString = null;
-
-  /** Create the empty stringset
-  */
-  public StringSet()
-  {
-  }
-
-  /** Create the stringset from a stringsetbuffer
-  */
-  public StringSet(StringSetBuffer buffer)
-  {
-    Iterator x = buffer.getKeys();
-    while (x.hasNext())
-    {
-      String key = (String)x.next();
-      hashtable.put(key,key);
-    }
-  }
-
-  /** Create a stringset from a single string.
-  */
-  public StringSet(String x)
-  {
-    hashtable.put(x,x);
-  }
-
-  /** Create the stringset from a string array
-  */
-  public StringSet(String[] array)
-  {
-    int i = 0;
-    while (i < array.length)
-    {
-      String x = array[i++];
-      hashtable.put(x,x);
-    }
-  }
-
-  /** Create the stringset from a vector of strings
-  */
-  public StringSet(Vector stringVector)
-  {
-    int i = 0;
-    while (i < stringVector.size())
-    {
-      String x = (String)stringVector.elementAt(i++);
-      hashtable.put(x,x);
-    }
-  }
-
-  /** Create the stringset from a Map of strings
-  */
-  public StringSet(Map table)
-  {
-    Iterator x = table.values().iterator();
-    while (x.hasNext())
-    {
-      String key = (String)x.next();
-      hashtable.put(key,key);
-    }
-  }
-
-  /** Check if a key is in the set
-  */
-  public boolean contains(String key)
-  {
-    return hashtable.get(key) != null;
-  }
-
-  public boolean contains(StringSet x)
-  {
-    Iterator iter = x.getKeys();
-    while (iter.hasNext())
-    {
-      String key = (String)iter.next();
-      if (contains(key))
-        return true;
-    }
-    return false;
-  }
-
-
-  /** Enumerate through the keys
-  */
-  public Iterator getKeys()
-  {
-    return hashtable.keySet().iterator();
-  }
-
-  /** Get number of keys
-  */
-  public int size()
-  {
-    return hashtable.size();
-  }
-
-  /** Get array of strings
-  */
-  public String[] getArray(String prefix)
-  {
-    String[] rval = new String[hashtable.size()];
-    int i = 0;
-    Iterator iter = hashtable.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String x = (String)iter.next();
-      if (prefix != null)
-        x = prefix + x;
-      rval[i++] = x;
-    }
-    return rval;
-  }
-
-  /** Get a new stringset based on an old one plus a prefix.
-  */
-  public StringSet(StringSet oldOne, String prefix)
-  {
-    Iterator iter = oldOne.hashtable.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String x = (String)iter.next();
-      if (prefix != null)
-        x = prefix + x;
-      hashtable.put(x,x);
-    }
-
-  }
-
-  /** Calculate the hashcode
-  */
-  public int hashCode()
-  {
-    return hashtable.hashCode();
-  }
-
-  /** Perform equals operation
-  */
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof StringSet))
-      return false;
-    StringSet set = (StringSet)o;
-    return hashtable.equals(set.hashtable);
-  }
-
-  /** Convert to a descriptive string.
-  *@return the descriptive string.
-  */
-  public String getDescriptiveString()
-  {
-    if (descriptiveString == null)
-    {
-      // Get as array first
-      String[] array = getArray(null);
-      java.util.Arrays.sort(array);
-      StringBuilder sb = new StringBuilder();
-      int i = 0;
-      while (i < array.length)
-      {
-        if (i > 0)
-          sb.append(":");
-        sb.append(array[i++]);
-      }
-      descriptiveString = sb.toString();
-    }
-    return descriptiveString;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/StringSetBuffer.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/StringSetBuffer.java
deleted file mode 100644
index 5d455bc..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/StringSetBuffer.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/* $Id: StringSetBuffer.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-public class StringSetBuffer
-{
-  public static final String _rcsid = "@(#)$Id: StringSetBuffer.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected HashMap hashtable = new HashMap();
-
-  public StringSetBuffer()
-  {
-  }
-
-  public void clear()
-  {
-    hashtable.clear();
-  }
-
-  public boolean contains(String x)
-  {
-    return (hashtable.get(x) != null);
-  }
-
-  public boolean contains(StringSet x)
-  {
-    Iterator iter = x.getKeys();
-    while (iter.hasNext())
-    {
-      String key = (String)iter.next();
-      if (contains(key))
-        return true;
-    }
-    return false;
-  }
-
-  public void add(String s)
-  {
-    add(s,null);
-  }
-
-  public void add(String s, String prefix)
-  {
-    if (prefix != null)
-      s = prefix + s;
-    hashtable.put(s,s);
-  }
-
-  public void add(StringSet ss)
-  {
-    add(ss,null);
-  }
-
-  public void add(StringSet ss, String prefix)
-  {
-    Iterator iterator = ss.getKeys();
-    while (iterator.hasNext())
-    {
-      String key = (String)iterator.next();
-      add(key,prefix);
-    }
-  }
-
-  public void add(String[] stringArray)
-  {
-    add(stringArray,null);
-  }
-
-  public void add(String[] stringArray, String prefix)
-  {
-    int i = 0;
-    while (i < stringArray.length)
-    {
-      add(stringArray[i++],prefix);
-    }
-  }
-
-  public void add(Map table)
-  {
-    add(table,null);
-  }
-
-  public void add(Map table, String prefix)
-  {
-    Iterator x = table.values().iterator();
-    while (x.hasNext())
-    {
-      String key = (String)x.next();
-      add(key,prefix);
-    }
-  }
-
-  public void remove(String value)
-  {
-    hashtable.remove(value);
-  }
-
-  public int size()
-  {
-    return hashtable.size();
-  }
-
-  public Iterator getKeys()
-  {
-    return hashtable.keySet().iterator();
-  }
-
-  /** Get array of strings
-  */
-  public String[] getArray(String prefix)
-  {
-    String[] rval = new String[hashtable.size()];
-    int i = 0;
-    Iterator iter = hashtable.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String x = (String)iter.next();
-      if (prefix != null)
-        x = prefix + x;
-      rval[i++] = x;
-    }
-    return rval;
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TempFileCharacterInput.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TempFileCharacterInput.java
deleted file mode 100644
index 8614e06..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TempFileCharacterInput.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/* $Id: TempFileCharacterInput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** This class represents a temporary file character input
-* stream.  Call the "done" method to clean up the
-* file when done.
-* NOTE: The implied flow of this method is to be handed
-* a file that has already been created by some means.  The
-* file must be a dedicated temporary file, which can be
-* destroyed when the data has been used.  However, this class can also
-* buffer data in memory if the data is not too large (that is, less than a
-* supplied cutoff value).
-*/
-public class TempFileCharacterInput extends CharacterInput
-{
-  public static final String _rcsid = "@(#)$Id: TempFileCharacterInput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected File file;
-  protected byte[] inMemoryBuffer;
-
-  protected final static int CHUNK_SIZE = 65536;
-  protected final static int DEFAULT_MAX_MEM_SIZE = 8192;
-  
-  /** Construct from a non-length-delimited reader.
-  *@param is is a reader to transfer from, to the end of the data.  This will, as a side effect, also calculate the character length
-  *          and hash value for the data.
-  */
-  public TempFileCharacterInput(Reader is)
-    throws ManifoldCFException, IOException
-  {
-    this(is,-1L);
-  }
-
-  /** Construct from a length-delimited reader.
-  *@param is is a reader to transfer from, to the end of the data.  This will, as a side effect, also calculate the character length
-  *          and hash value for the data.
-  *@param length is the length limit to transfer, or -1 if no limit
-  */
-  public TempFileCharacterInput(Reader is, long length)
-    throws ManifoldCFException, IOException
-  {
-    this(is,length,DEFAULT_MAX_MEM_SIZE);
-  }
-
-  /** Construct from a length-delimited reader.
-  *@param is is a reader to transfer from, to the end of the data.  This will, as a side effect, also calculate the character length
-  *          and hash value for the data.
-  *@param length is the length limit to transfer, or -1 if no limit
-  *@param maxInMemoryLength is the maximum size to keep in memory, before using a backing File object.  The amount possibly
-  *        saved in memory will be guaranteed less than this size.
-  */
-  public TempFileCharacterInput(Reader is, long length, int maxInMemoryLength)
-    throws ManifoldCFException, IOException
-  {
-    super();
-    
-
-    // Before we do anything else, we read the first chunk.  This will allow
-    // us to determine if we're going to buffer the data in memory or not.  However,
-    // it may need to be read in chunks, since there's no guarantee it will come in
-    // in the size requested.
-    int chunkSize = CHUNK_SIZE;
-
-    char[] buffer = new char[chunkSize];
-    int chunkTotal = 0;
-    boolean eofSeen = false;
-    while (true)
-    {
-      int chunkAmount;
-      if (length == -1L || length > chunkSize)
-        chunkAmount = chunkSize-chunkTotal;
-      else
-      {
-        chunkAmount = (int)(length-chunkTotal);
-        eofSeen = true;
-      }
-      if (chunkAmount == 0)
-        break;
-      int readsize = is.read(buffer,chunkTotal,chunkAmount);
-      if (readsize == -1)
-      {
-        eofSeen = true;
-        break;
-      }
-      chunkTotal += readsize;
-    }
-    
-    // Set up hash digest, and calculate the initial hash.
-    java.security.MessageDigest md = ManifoldCF.startHash();
-    String chunkString = new String(buffer,0,chunkTotal);
-    ManifoldCF.addToHash(md,chunkString);
-
-    // In order to compute the byte length, we need to convert to a byte array, which is
-    // also our final form for in-memory storage.  But we don't want to  do the work
-    // unless there's a chance it will be needed.
-    byte[] byteBuffer;
-    if (eofSeen)
-      byteBuffer = chunkString.getBytes(StandardCharsets.UTF_8);
-    else
-      byteBuffer = null;
-
-    if (eofSeen && byteBuffer.length <= maxInMemoryLength)
-    {
-      // Buffer locally; don't create a temp file
-      file = null;
-      inMemoryBuffer = byteBuffer;
-      charLength = chunkTotal;
-      hashValue = ManifoldCF.getHashValue(md);
-    }
-    else
-    {
-      inMemoryBuffer = null;
-      // Create a temporary file!
-      long totalMoved = 0;
-      
-      // Create a temporary file to put the stuff in
-      File outfile;
-      try
-      {
-        outfile = File.createTempFile("_MC_","");
-      }
-      catch (IOException e)
-      {
-        handleIOException(e,"creating backing file");
-        outfile = null;
-      }
-      try
-      {
-        // Register the file for autodeletion, using our infrastructure.
-        ManifoldCF.addFile(outfile);
-        // deleteOnExit() causes memory leakage!
-        // outfile.deleteOnExit();
-
-        FileOutputStream outStream;
-        OutputStreamWriter outWriter;
-        try
-        {
-          outStream = new FileOutputStream(outfile);
-          // Create a Writer corresponding to the file output stream, and encode using utf-8
-          outWriter = new OutputStreamWriter(outStream,StandardCharsets.UTF_8);
-        }
-        catch (IOException e)
-        {
-          handleIOException(e,"opening backing file");
-          outStream = null;
-          outWriter = null;
-        }
-        try
-        {
-          //  Transfor what we've already read.
-          try
-          {
-            outWriter.write(buffer,0,chunkTotal);
-          }
-          catch (IOException e)
-          {
-            handleIOException(e,"writing backing file");
-          }
-          totalMoved += chunkTotal;
-          // Now, transfer the remainder
-          while (true)
-          {
-            int moveAmount;
-            if (length == -1L || length-totalMoved > chunkSize)
-              moveAmount = chunkSize;
-            else
-              moveAmount = (int)(length-totalMoved);
-            if (moveAmount == 0)
-              break;
-            // Read character data in 64K chunks
-            int readsize = is.read(buffer,0,moveAmount);
-            if (readsize == -1)
-              break;
-            try
-            {
-              outWriter.write(buffer,0,readsize);
-            }
-            catch (IOException e)
-            {
-              handleIOException(e,"writing backing file");
-            }
-            ManifoldCF.addToHash(md,new String(buffer,0,readsize));
-            totalMoved += readsize;
-          }
-
-        }
-        finally
-        {
-          try
-          {
-            outWriter.close();
-          }
-          catch (IOException e)
-          {
-            handleIOException(e,"closing backing file");
-          }
-        }
-
-        // Now, create the input stream.
-        // Save the file name
-        file = outfile;
-        charLength = totalMoved;
-        hashValue = ManifoldCF.getHashValue(md);
-
-      }
-      catch (Throwable e)
-      {
-        // Delete the temp file we created on any error condition
-        // outfile.delete();
-        ManifoldCF.deleteFile(outfile);
-        if (e instanceof Error)
-          throw (Error)e;
-        if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        if (e instanceof ManifoldCFException)
-          throw (ManifoldCFException)e;
-        if (e instanceof IOException)
-          throw (IOException)e;
-        throw new RuntimeException("Unexpected throwable of type "+e.getClass().getName()+": "+e.getMessage(),e);
-      }
-    }
-    
-  }
-
-  /** Construct from an existing temporary fle.
-  *@param tempFile is the existing temporary file, encoded in utf-8.
-  */
-  public TempFileCharacterInput(File tempFile)
-  {
-    super();
-    inMemoryBuffer = null;
-    file = tempFile;
-    ManifoldCF.addFile(file);
-    // deleteOnExit() causes memory leakage; better to leak files on hard shutdown than memory.
-    // file.deleteOnExit();
-  }
-
-  protected TempFileCharacterInput()
-  {
-    super();
-  }
-
-  /** Open a Utf8 stream directly from the backing file */
-  @Override
-  public InputStream getUtf8Stream()
-    throws ManifoldCFException
-  {
-    if (file != null)
-    {
-      try
-      {
-        return new FileInputStream(file);
-      }
-      catch (FileNotFoundException e)
-      {
-        throw new ManifoldCFException("No such file: "+e.getMessage(),e,ManifoldCFException.GENERAL_ERROR);
-      }
-    }
-    else if (inMemoryBuffer != null)
-    {
-      return new ByteArrayInputStream(inMemoryBuffer);
-    }
-    return null;
-  }
-
-  /** Get binary UTF8 stream length directly */
-  @Override
-  public long getUtf8StreamLength()
-    throws ManifoldCFException
-  {
-    if (file != null)
-      return file.length();
-    else if (inMemoryBuffer != null)
-      return inMemoryBuffer.length;
-    return 0L;
-  }
-
-  @Override
-  protected void openStream()
-    throws ManifoldCFException
-  {
-    if (file != null)
-    {
-      try
-      {
-        // Open the file and create a stream.
-        InputStream binaryStream = new FileInputStream(file);
-        stream = new InputStreamReader(binaryStream, StandardCharsets.UTF_8);
-      }
-      catch (FileNotFoundException e)
-      {
-        throw new ManifoldCFException("Can't create stream: "+e.getMessage(),e,ManifoldCFException.GENERAL_ERROR);
-      }
-    }
-    else if (inMemoryBuffer != null)
-    {
-      stream = new InputStreamReader(new ByteArrayInputStream(inMemoryBuffer),StandardCharsets.UTF_8);
-    }
-  }
-
-  /** Transfer to a new object; this causes the current object to become "already discarded" */
-  @Override
-  public CharacterInput transfer()
-  {
-    // Create a new TempFileCharacterInput object, and fill it with our current stuff
-    TempFileCharacterInput rval = new TempFileCharacterInput();
-    rval.file = file;
-    rval.inMemoryBuffer = inMemoryBuffer;
-    rval.stream = stream;
-    rval.charLength = charLength;
-    rval.hashValue = hashValue;
-    file = null;
-    inMemoryBuffer = null;
-    stream = null;
-    charLength = -1L;
-    hashValue = null;
-    return rval;
-  }
-
-  @Override
-  public void discard()
-    throws ManifoldCFException
-  {
-    super.discard();
-    // Delete the underlying file
-    if (file != null)
-    {
-      ManifoldCF.deleteFile(file);
-      file = null;
-    }
-  }
-
-  /** Calculate the datum's length in characters */
-  @Override
-  protected void calculateLength()
-    throws ManifoldCFException
-  {
-    scanFile();
-  }
-
-  /** Calculate the datum's hash value */
-  @Override
-  protected void calculateHashValue()
-    throws ManifoldCFException
-  {
-    scanFile();
-  }
-
-  private void scanFile()
-    throws ManifoldCFException
-  {
-    // Scan the file in order to figure out the hash value and the character length
-    try
-    {
-      // Open the file and create a stream.
-      InputStream binaryStream;
-      if (file != null)
-        binaryStream = new FileInputStream(file);
-      else if (inMemoryBuffer != null)
-        binaryStream = new ByteArrayInputStream(inMemoryBuffer);
-      else
-        binaryStream = null;
-      Reader reader = new InputStreamReader(binaryStream,StandardCharsets.UTF_8);
-      try
-      {
-        // Set up hash digest and character length counter before we start anything.
-        java.security.MessageDigest md = ManifoldCF.startHash();
-        char[] buffer = new char[CHUNK_SIZE];
-        long totalMoved = 0;
-        while (true)
-        {
-          int moveAmount = CHUNK_SIZE;
-          // Read character data in 64K chunks
-          int readsize = reader.read(buffer,0,moveAmount);
-          if (readsize == -1)
-            break;
-          ManifoldCF.addToHash(md,new String(buffer,0,readsize));
-          totalMoved += readsize;
-        }
-
-        charLength = totalMoved;
-        hashValue = ManifoldCF.getHashValue(md);
-      }
-      finally
-      {
-        reader.close();
-      }
-    }
-    catch (IOException e)
-    {
-      handleIOException(e,"scanning file");
-    }
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TempFileInput.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TempFileInput.java
deleted file mode 100644
index 47b1cee..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TempFileInput.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/* $Id: TempFileInput.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** This class represents a temporary file data input
-* stream.  Call the "done" method to clean up the
-* file when done.
-* NOTE: The implied flow of this method is to be handled
-* a file that has already been created by some means.  The
-* file must be a dedicated temporary file, which can be
-* destroyed when the data has been used.
-*/
-public class TempFileInput extends BinaryInput
-{
-  public static final String _rcsid = "@(#)$Id: TempFileInput.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected File file;
-  protected byte[] inMemoryBuffer;
-
-  protected final static int CHUNK_SIZE = 65536;
-  protected final static int DEFAULT_MAX_MEM_SIZE = 8192;
-
-  /** Construct from an input stream.
-  * This will also create a temporary, backing file.
-  *@param is is the input stream to use to construct the temporary file.
-  */
-  public TempFileInput(InputStream is)
-    throws ManifoldCFException, IOException
-  {
-    this(is,-1L);
-  }
-
-  /** Construct from a length-delimited input stream.
-  *@param is is the input stream.
-  *@param length is the maximum number of bytes to transfer, or -1 if no limit.
-  */
-  public TempFileInput(InputStream is, long length)
-    throws ManifoldCFException, IOException
-  {
-    this(is,length,DEFAULT_MAX_MEM_SIZE);
-  }
-  
-  /** Construct from a length-delimited input stream.
-  *@param is is the input stream.
-  *@param length is the maximum number of bytes to transfer, or -1 if no limit.
-  *@param maxMemSize is the maximum bytes we keep in memory in lieu of using a file.
-  */
-  public TempFileInput(InputStream is, long length, int maxMemSize)
-    throws ManifoldCFException, IOException
-  {
-    super();
-    
-    // Before we do anything else, we read the first chunk.  This will allow
-    // us to determine if we're going to buffer the data in memory or not.  However,
-    // it may need to be read in chunks, since there's no guarantee it will come in
-    // in the size requested.
-    int chunkSize = CHUNK_SIZE;
-
-    byte[] buffer = new byte[chunkSize];
-    int chunkTotal = 0;
-    boolean eofSeen = false;
-    while (true)
-    {
-      int chunkAmount;
-      if (length == -1L || length > chunkSize)
-        chunkAmount = chunkSize-chunkTotal;
-      else
-      {
-        chunkAmount = (int)(length-chunkTotal);
-        eofSeen = true;
-      }
-      if (chunkAmount == 0)
-        break;
-      int readsize = is.read(buffer,chunkTotal,chunkAmount);
-      if (readsize == -1)
-      {
-        eofSeen = true;
-        break;
-      }
-      chunkTotal += readsize;
-    }
-
-    if (eofSeen && chunkTotal < maxMemSize)
-    {
-      // In memory!!
-      file = null;
-      inMemoryBuffer = new byte[chunkTotal];
-      for (int i = 0; i < inMemoryBuffer.length; i++)
-      {
-        inMemoryBuffer[i] = buffer[i];
-      }
-      this.length = chunkTotal;
-    }
-    else
-    {
-      inMemoryBuffer = null;
-      // Create a temporary file to put the stuff in
-      File outfile;
-      try
-      {
-        outfile = File.createTempFile("_MC_","");
-      }
-      catch (IOException e)
-      {
-        handleIOException(e,"creating backing file");
-        outfile = null;
-      }
-      try
-      {
-        // Register the file for autodeletion, using our infrastructure.
-        ManifoldCF.addFile(outfile);
-        // deleteOnExit() causes memory leakage!
-        // outfile.deleteOnExit();
-        FileOutputStream outStream;
-        try
-        {
-          outStream = new FileOutputStream(outfile);
-        }
-        catch (IOException e)
-        {
-          handleIOException(e,"opening backing file");
-          outStream = null;
-        }
-        try
-        {
-          long totalMoved = 0;
-            
-          //  Transfor what we've already read.
-          try
-          {
-            outStream.write(buffer,0,chunkTotal);
-          }
-          catch (IOException e)
-          {
-            handleIOException(e,"writing backing file");
-          }
-          totalMoved += chunkTotal;
-
-          while (true)
-          {
-            int moveAmount;
-            if (length == -1L || length-totalMoved > chunkSize)
-              moveAmount = chunkSize;
-            else
-              moveAmount = (int)(length-totalMoved);
-            if (moveAmount == 0)
-              break;
-            // Read binary data in 64K chunks
-            int readsize = is.read(buffer,0,moveAmount);
-            if (readsize == -1)
-              break;
-            try
-            {
-              outStream.write(buffer,0,readsize);
-            }
-            catch (IOException e)
-            {
-              handleIOException(e,"writing backing file");
-            }
-            totalMoved += readsize;
-          }
-          // System.out.println(" Moved "+Long.toString(totalMoved));
-        }
-        finally
-        {
-          try
-          {
-            outStream.close();
-          }
-          catch (IOException e)
-          {
-            handleIOException(e,"closing backing file");
-          }
-        }
-
-        // Now, create the input stream.
-        // Save the file name
-        file = outfile;
-        this.length = file.length();
-
-      }
-      catch (Throwable e)
-      {
-        // Delete the temp file we created on any error condition
-        // outfile.delete();
-        ManifoldCF.deleteFile(outfile);
-        if (e instanceof Error)
-          throw (Error)e;
-        if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        if (e instanceof ManifoldCFException)
-          throw (ManifoldCFException)e;
-        if (e instanceof IOException)
-          throw (IOException)e;
-        throw new RuntimeException("Unexpected throwable of type "+e.getClass().getName()+": "+e.getMessage(),e);
-      }
-    }
-  }
-
-  /** Construct from an existing temporary fle.
-  *@param tempFile is the existing temporary file.
-  */
-  public TempFileInput(File tempFile)
-  {
-    super();
-    inMemoryBuffer = null;
-    file = tempFile;
-    ManifoldCF.addFile(file);
-    // deleteOnExit() causes memory leakage; better to leak files on hard shutdown than memory.
-    // file.deleteOnExit();
-  }
-
-  protected TempFileInput()
-  {
-    super();
-  }
-
-  /** Transfer to a new object; this causes the current object to become "already discarded" */
-  public BinaryInput transfer()
-  {
-    TempFileInput rval = new TempFileInput();
-    rval.file = file;
-    rval.inMemoryBuffer = inMemoryBuffer;
-    rval.stream = stream;
-    rval.length = length;
-    file = null;
-    inMemoryBuffer = null;
-    stream = null;
-    length = -1L;
-    return rval;
-  }
-
-  public void discard()
-    throws ManifoldCFException
-  {
-    super.discard();
-    if (file != null)
-    {
-      ManifoldCF.deleteFile(file);
-      file = null;
-    }
-  }
-
-  protected void openStream()
-    throws ManifoldCFException
-  {
-    if (file != null)
-    {
-      try
-      {
-        // Open the file and create a stream.
-        stream = new FileInputStream(file);
-      }
-      catch (FileNotFoundException e)
-      {
-        throw new ManifoldCFException("Can't create stream: "+e.getMessage(),e,ManifoldCFException.GENERAL_ERROR);
-      }
-    }
-    else if (inMemoryBuffer != null)
-    {
-      stream = new ByteArrayInputStream(inMemoryBuffer);
-    }
-  }
-
-  protected void calculateLength()
-    throws ManifoldCFException
-  {
-    if (file != null)
-      this.length = file.length();
-    else if (inMemoryBuffer != null)
-      this.length = inMemoryBuffer.length;
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThreadContextFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThreadContextFactory.java
deleted file mode 100644
index 53ebd62..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThreadContextFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id: ThreadContextFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** Use this factory to create a thread context.  Only one per thread is recommended, although
-* more will cause inefficiencies rather than failure.
-*/
-public class ThreadContextFactory
-{
-  public static final String _rcsid = "@(#)$Id: ThreadContextFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private ThreadContextFactory()
-  {
-  }
-
-  /** Make a thread context.
-  */
-  public static IThreadContext make()
-  {
-    return new org.apache.manifoldcf.core.threadcontext.ThreadContext();
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TimeMarker.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TimeMarker.java
deleted file mode 100644
index c6a017f..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/TimeMarker.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* $Id: TimeMarker.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** This is a class which uniquely identifiers a time marker, for the database layer.
-*/
-public class TimeMarker
-{
-  public static final String _rcsid = "@(#)$Id: TimeMarker.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  long timeValue;
-
-  /** Constructor.
-  *@param timeValue is the time value.
-  */
-  public TimeMarker(long timeValue)
-  {
-    this.timeValue = timeValue;
-  }
-
-  public long longValue()
-  {
-    return timeValue;
-  }
-  
-  public String toString()
-  {
-    return new Long(timeValue).toString();
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UTF8Stderr.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UTF8Stderr.java
deleted file mode 100644
index 3f6eaaf..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UTF8Stderr.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/* $Id: UTF8Stderr.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.PrintWriter;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-
-/** This factory returns a database interface appropriate for
-* a specified client connection.  The client or company name is
-* passed into the factory, as well as a thread context.
-*/
-public final class UTF8Stderr
-{
-  public static final String _rcsid = "@(#)$Id: UTF8Stderr.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private static PrintWriter err;
-
-  // this is called before invoking any methods
-  static
-  {
-     err = new PrintWriter(new OutputStreamWriter(System.err, StandardCharsets.UTF_8), true);
-  }
-
-  private UTF8Stderr()
-  {
-  }
-
-  // Close (not required)
-  public static void close()
-  {
-    err.close();
-  }
-
-  // println methods
-  public static void println()
-  {
-    err.println();
-  }
-
-  public static void println(Object x)
-  {
-    err.println(x);
-  }
-
-  public static void println(boolean x)
-  {
-    err.println(x);
-  }
-
-  public static void println(char x)
-  {
-    err.println(x);
-  }
-
-  public static void println(double x)
-  {
-    err.println(x);
-  }
-
-  public static void println(float x)
-  {
-    err.println(x);
-  }
-
-  public static void println(int x)
-  {
-    err.println(x);
-  }
-
-  public static void println(long x)
-  {
-    err.println(x);
-  }
-
-  // print methods
-  public static void print()
-  {
-    err.flush();
-  }
-
-  public static void print(Object x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void print(boolean x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void print(char x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void print(double x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void print(float x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void print(int x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void print(long x)
-  {
-    err.print(x);
-    err.flush();
-  }
-
-  public static void printStackTrace(Throwable e)
-  {
-    e.printStackTrace(err);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UTF8Stdout.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UTF8Stdout.java
deleted file mode 100644
index fefcfef..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UTF8Stdout.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/* $Id: UTF8Stdout.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.PrintWriter;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-
-/** This factory returns a database interface appropriate for
-* a specified client connection.  The client or company name is
-* passed into the factory, as well as a thread context.
-*/
-public final class UTF8Stdout
-{
-  public static final String _rcsid = "@(#)$Id: UTF8Stdout.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private static PrintWriter out;
-
-  // this is called before invoking any methods
-  static
-  {
-    out = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true);
-  }
-
-  private UTF8Stdout()
-  {
-  }
-
-  // Close (not required)
-  public static void close()
-  {
-    out.close();
-  }
-
-  // println methods
-  public static void println()
-  {
-    out.println();
-  }
-
-  public static void println(Object x)
-  {
-    out.println(x);
-  }
-
-  public static void println(boolean x)
-  {
-    out.println(x);
-  }
-
-  public static void println(char x)
-  {
-    out.println(x);
-  }
-
-  public static void println(double x)
-  {
-    out.println(x);
-  }
-
-  public static void println(float x)
-  {
-    out.println(x);
-  }
-
-  public static void println(int x)
-  {
-    out.println(x);
-  }
-
-  public static void println(long x)
-  {
-    out.println(x);
-  }
-
-  // print methods
-  public static void print()
-  {
-    out.flush();
-  }
-
-  public static void print(Object x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void print(boolean x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void print(char x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void print(double x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void print(float x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void print(int x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void print(long x)
-  {
-    out.print(x);
-    out.flush();
-  }
-
-  public static void printStackTrace(Throwable e)
-  {
-    e.printStackTrace(out);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UnitaryClause.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UnitaryClause.java
deleted file mode 100644
index 17a51bf..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/UnitaryClause.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.util.*;
-
-public class UnitaryClause implements ClauseDescription
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected String columnName;
-  protected String operationName;
-  protected List values;
-  
-  /** Construct */
-  public UnitaryClause(String columnName, String operationName, Object value)
-  {
-    this.columnName = columnName;
-    this.operationName = operationName;
-    this.values = new ArrayList();
-    this.values.add(value);
-  }
-  
-  public UnitaryClause(String columnName, Object value)
-  {
-    this(columnName,"=",value);
-  }
-  
-  /** Get the column name */
-  public String getColumnName()
-  {
-    return columnName;
-  }
-  
-  /** Get the operation string */
-  public String getOperation()
-  {
-    return operationName;
-  }
-  
-  /** Get the individual values */
-  public List getValues()
-  {
-    return values;
-  }
-  
-  /** Get the join column name */
-  public String getJoinColumnName()
-  {
-    return null;
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/VersionContext.java b/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/VersionContext.java
deleted file mode 100644
index 391c1ee..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/VersionContext.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-/** An instance of this class represents a version string, in combination with the configuration parameters
-* and specification that produced it.  Some clients will use the version string (e.g. the database), while others
-* may find it more convenient to use the parameters or the specification.  However:
-* (1) It is ALWAYS wrong to use data from configuration or specification that is NOT represented in some
-*     way in the version string, either by exact representation, or by some proxy value;
-* (2) Configuration and Specification are guaranteed to be the identical ones which were used during creation
-*     of the version string;
-* (3) Configuration and Specification are provided as CONVENIENCES; they are not to be considered primary
-*    data for these objects.
-*/
-public class VersionContext
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Member variables
-  protected final String versionString;
-  protected final ConfigParams params;
-  protected final Specification specification;
-
-  /** Constructor.
-  */
-  public VersionContext(String versionString, ConfigParams params, Specification specification)
-  {
-    this.versionString = versionString;
-    this.params = params;
-    this.specification = specification;
-  }
-
-  /** Retrieve the version String */
-  public String getVersionString()
-  {
-    return versionString;
-  }
-  
-  /** Retrieve the configuration parameters */
-  public ConfigParams getParams()
-  {
-    return params;
-  }
-  
-  /** Retrieve the specification */
-  public Specification getSpecification()
-  {
-    return specification;
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/ConnectionPool.java b/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/ConnectionPool.java
deleted file mode 100644
index 408eadc..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/ConnectionPool.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.jdbcpool;
-
-import java.sql.*;
-import javax.naming.*;
-import javax.sql.*;
-import java.util.*;
-import org.apache.manifoldcf.core.system.Logging;
-
-/** The class that defines a connection pool.
-*/
-public class ConnectionPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final String dbURL;
-  protected final String userName;
-  protected final String password;
-  protected volatile int freePointer;
-  protected volatile int activeConnections;
-  protected volatile boolean closed;
-  protected final Connection[] freeConnections;
-  protected final long[] connectionCleanupTimeouts;
-  protected final long expiration;
-  
-  protected final boolean debug;
-  
-  protected final Set<WrappedConnection> outstandingConnections = new HashSet<WrappedConnection>();
-  
-  /** Constructor */
-  public ConnectionPool(String dbURL, String userName, String password, int maxConnections, long expiration, boolean debug)
-  {
-    this.dbURL = dbURL;
-    this.userName = userName;
-    this.password = password;
-    this.freeConnections = new Connection[maxConnections];
-    this.connectionCleanupTimeouts = new long[maxConnections];
-    this.freePointer = 0;
-    this.activeConnections = 0;
-    this.closed = false;
-    this.expiration = expiration;
-    this.debug = debug;
-  }
-  
-  /** Obtain a connection from the pool.
-  * This will wait until a connection is free, if the pool is already completely tapped.
-  * The connection is returned by the "close" operation, executed on the connection.
-  * (This requires us to wrap the actual connection object).
-  */
-  public WrappedConnection getConnection()
-    throws SQLException, InterruptedException
-  {
-    Exception instantiationException;
-    if (debug)
-      instantiationException = new Exception("Possibly leaked db connection");
-    else
-      instantiationException = null;
-    Connection rval = null;
-    boolean returnedValue = true;
-    try
-    {
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (freePointer > 0)
-          {
-            if (closed)
-              throw new InterruptedException("Pool already closed");
-            rval = freeConnections[--freePointer];
-            freeConnections[freePointer] = null;
-            boolean isValid = true;
-            try
-            {
-              isValid = rval.isValid(1);
-            }
-            catch (SQLException e)
-            {
-              // Ignore this; we just can't check if handle is valid I guess.
-              // (Postgresql doesn't implement this method so it fails always)
-            }
-            catch (java.lang.AbstractMethodError e)
-            {
-              // Ignore this; we just can't check if handle is valid I guess.
-              // (SQLServer doesn't implement this method so it fails always)
-            }
-            if (!isValid) {
-              // If the connection is invalid, drop it on the floor, and get a new one.
-              // Note: Order of operations is terribly important here!!
-              final Connection closeValue = rval;
-              rval = null;
-              activeConnections--;
-              try
-              {
-                closeValue.close();
-              }
-              catch (SQLException e)
-              {
-                // Ignore SQL errors on close, and drop the connection on the floor
-              }
-              continue;
-            }
-            break;
-          }
-          if (activeConnections == freeConnections.length)
-          {
-            // If properly configured, we really shouldn't be getting here.
-            if (debug)
-            {
-              synchronized (outstandingConnections)
-              {
-                Logging.db.warn("Out of db connections, list of outstanding ones follows.");
-                for (WrappedConnection c : outstandingConnections)
-                {
-                  Logging.db.warn("Found a possibly leaked db connection",c.getInstantiationException());
-                }
-              }
-            }
-            // Wait until kicked; we hope something will free up...
-            this.wait();
-            continue;
-          }
-          // Increment active connection counter, because we're about to mint a new connection, and break out of our loop
-          // Note: order is terribly important here!
-          activeConnections++;
-          if (userName != null)
-            rval = DriverManager.getConnection(dbURL, userName, password);
-          else
-            rval = DriverManager.getConnection(dbURL);
-          break;
-        }
-      }
-
-      WrappedConnection wc = new WrappedConnection(this,rval,instantiationException);
-      if (debug)
-      {
-        synchronized (outstandingConnections)
-        {
-          outstandingConnections.add(wc);
-        }
-      }
-      return wc;
-    }
-    catch (Error e)
-    {
-      returnedValue = false;
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      returnedValue = false;
-      throw e;
-    }
-    catch (SQLException e)
-    {
-      returnedValue = false;
-      throw e;
-    }
-    finally
-    {
-      if (!returnedValue)
-      {
-        // We didn't finish.  Restore the pool to the correct form.
-        // Note: We should always be able to just return any current connection to the pool.  This is
-        // safe because we reserved a slot when we decided to create the connection (if that's what
-        // we did), or we just used a connection that was already allocated.  Either way, we can put
-        // it into the pool.
-        if (rval != null)
-        {
-          // We have a handle, so just free it and leave activeConnections alone
-          release(rval);
-        }
-        else
-        {
-          // We didn't manage to create the handle, so decrement active connections.
-          synchronized (this)
-          {
-            activeConnections--;
-          }
-        }
-      }
-    }
-  }
-  
-  /** Flush the pool.
-  */
-  public synchronized void flushPool()
-  {
-    for (int i = 0 ; i < freePointer ; i++)
-    {
-      try
-      {
-        freeConnections[i].close();
-      }
-      catch (SQLException e)
-      {
-        Logging.db.warn("Error closing pooled connection: "+e.getMessage(),e);
-      }
-      freeConnections[i] = null;
-      activeConnections--;
-    }
-    freePointer = 0;
-    notifyAll();
-  }
-  
-  /** Close down the pool.
-  */
-  public synchronized void closePool()
-  {
-    for (int i = 0 ; i < freePointer ; i++)
-    {
-      try
-      {
-        freeConnections[i].close();
-      }
-      catch (SQLException e)
-      {
-        Logging.db.warn("Error closing pooled connection: "+e.getMessage(),e);
-      }
-      freeConnections[i] = null;
-    }
-    freePointer = 0;
-    closed = true;
-    notifyAll();
-  }
-  
-  /** Clean up expired connections.
-  */
-  public synchronized void cleanupExpiredConnections(long currentTime)
-  {
-    int i = 0;
-    while (i < freePointer)
-    {
-      if (connectionCleanupTimeouts[i] <= currentTime)
-      {
-        Connection c = freeConnections[i];
-        freeConnections[i] = null;
-        freePointer--;
-        activeConnections--;
-        if (freePointer == i)
-        {
-          freeConnections[i] = null;
-        }
-        else
-        {
-          freeConnections[i] = freeConnections[freePointer];
-          connectionCleanupTimeouts[i] = connectionCleanupTimeouts[freePointer];
-          freeConnections[freePointer] = null;
-        }
-        try
-        {
-         c.close();
-        }
-        catch (SQLException e)
-        {
-          Logging.db.warn("Error closing pooled connection: "+e.getMessage(),e);
-        }
-      }
-      else
-        i++;
-    }
-  }
-  
-  public void releaseConnection(WrappedConnection connection)
-  {
-
-    if (debug)
-    {
-      synchronized (outstandingConnections)
-      {
-        if (!outstandingConnections.contains(connection))
-          Logging.db.warn("Released a connection that wasn't tracked!!");
-        outstandingConnections.remove(connection);
-      }
-    }
-
-    release(connection.getConnection());
-  }
-  
-  protected void release(Connection c)
-  {
-    synchronized (this)
-    {
-      freeConnections[freePointer] = c;
-      connectionCleanupTimeouts[freePointer] = System.currentTimeMillis() + expiration;
-      freePointer++;
-      notifyAll();
-    }
-    
-  }
-  
-}
-
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/ConnectionPoolManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/ConnectionPoolManager.java
deleted file mode 100644
index 859f887..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/ConnectionPoolManager.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.jdbcpool;
-
-import javax.naming.*;
-import javax.sql.*;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.LockManagerFactory;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** An instance of this class manages a number of (independent) connection pools.
-*/
-public class ConnectionPoolManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final Map<String,ConnectionPool> poolMap;
-  protected final ConnectionCloserThread connectionCloserThread;
-  protected volatile AtomicBoolean shuttingDown = new AtomicBoolean(false);
-  protected final boolean debug;
-  
-  public ConnectionPoolManager(int count, boolean debug)
-    throws ManifoldCFException
-  {
-    this.debug = debug;
-    poolMap = new HashMap<String,ConnectionPool>(count);
-    connectionCloserThread = new ConnectionCloserThread();
-    connectionCloserThread.start();
-  }
-  
-  /** Look for a pool with a given key.
-  */
-  public synchronized ConnectionPool getPool(String poolKey)
-  {
-    return poolMap.get(poolKey);
-  }
-  
-  /** Set up a pool with a given key.
-  */
-  public synchronized ConnectionPool addAlias(String poolKey, String driverClassName, String dbURL,
-    String userName, String password, int maxSize, long expiration)
-    throws ClassNotFoundException, InstantiationException, IllegalAccessException
-  {
-    Class.forName(driverClassName).newInstance();
-    ConnectionPool cp = new ConnectionPool(dbURL,userName,password,maxSize,expiration,debug);
-    poolMap.put(poolKey,cp);
-    return cp;
-  }
-  
-  public void flush()
-  {
-    synchronized (this)
-    {
-      Iterator<String> iter = poolMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String poolKey = iter.next();
-        ConnectionPool cp = poolMap.get(poolKey);
-        cp.flushPool();
-      }
-    }
-  }
-  
-  public void shutdown()
-  {
-    //System.out.println("JDBC POOL SHUTDOWN CALLED");
-    shuttingDown.set(true);
-    while (connectionCloserThread.isAlive())
-    {
-      try
-      {
-        Thread.sleep(1000L);
-      }
-      catch (InterruptedException e)
-      {
-        // Ignore this until the thread is down
-        connectionCloserThread.interrupt();
-      }
-    }
-    synchronized (this)
-    {
-      Iterator<String> iter = poolMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String poolKey = iter.next();
-        ConnectionPool cp = poolMap.get(poolKey);
-        cp.closePool();
-      }
-    }
-  }
-  
-  protected void cleanupExpiredConnections(long cleanupTime)
-  {
-    ConnectionPool[] connectionPools;
-    synchronized (this)
-    {
-      connectionPools = new ConnectionPool[poolMap.size()];
-      int i = 0;
-      Iterator<String> iter = poolMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String poolKey = iter.next();
-        connectionPools[i++] = poolMap.get(poolKey);
-      }
-    }
-    for (int i = 0 ; i < connectionPools.length ; i++)
-    {
-      connectionPools[i].cleanupExpiredConnections(cleanupTime);
-    }
-  }
-  
-  protected class ConnectionCloserThread extends Thread
-  {
-    
-    public ConnectionCloserThread()
-    {
-      super();
-      setName("Connection pool reaper");
-      setDaemon(true);
-    }
-    
-    public void run()
-    {
-      while (true)
-      {
-        if (shuttingDown.get())
-          break;
-        cleanupExpiredConnections(System.currentTimeMillis());
-        if (shuttingDown.get())
-          break;
-        try
-        {
-          Thread.sleep(5000L);
-        }
-        catch (InterruptedException e)
-        {
-          break;
-        }
-      }
-      
-    }
-    
-  }
-  
-  
-}
-
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/WrappedConnection.java b/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/WrappedConnection.java
deleted file mode 100644
index ac7f01b..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/jdbcpool/WrappedConnection.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.jdbcpool;
-
-import java.sql.*;
-import org.apache.manifoldcf.core.system.Logging;
-
-/** The class that represents a connection from a pool.
-*/
-public class WrappedConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected Connection connection;
-  protected ConnectionPool owner;
-  /** Exception, to keep track of where the connection was allocated */
-  protected Exception instantiationException;
-  
-  /** Constructor */
-  public WrappedConnection(ConnectionPool owner, Connection connection)
-  {
-    this(owner,connection,null);
-  }
-  
-  /** Constructor */
-  public WrappedConnection(ConnectionPool owner, Connection connection, Exception instantiationException)
-  {
-    this.owner = owner;
-    this.connection = connection;
-    this.instantiationException = instantiationException;
-  }
-  
-  /** Get the JDBC connection object.
-  */
-  public Connection getConnection()
-  {
-    return connection;
-  }
-  
-  /** Release the object into its pool.
-  */
-  public void release()
-  {
-    owner.releaseConnection(this);
-    this.connection = null;
-  }
-  
-  /** Get instantiation exception.
-  */
-  public Exception getInstantiationException()
-  {
-    return instantiationException;
-  }
-  
-}
-
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/BaseLockManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/BaseLockManager.java
deleted file mode 100644
index 33a1f0c..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/BaseLockManager.java
+++ /dev/null
@@ -1,1937 +0,0 @@
-/* $Id: LockManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-
-/** A lock manager manages locks and shared information across all threads and JVMs
-* and cluster members.  There should be no more than ONE instance of this class per thread!!!
-* The factory should enforce this.
-* This is the base lock manager class.  Its implementation works solely within one JVM,
-* which makes it ideal for single-process work.  Classes that handle multiple JVMs and thus
-* need cross-JVM synchronization are thus expected to extend this class and override pertinent
-* methods.
-*/
-public class BaseLockManager implements ILockManager
-{
-  public static final String _rcsid = "@(#)$Id: LockManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // These are the lock/section types, in order of escalation
-  protected final static int TYPE_READ = 1;
-  protected final static int TYPE_WRITENONEX = 2;
-  protected final static int TYPE_WRITE = 3;
-
-  // This is the local thread ID
-  protected final Long threadID;
-  
-  // These are for locks which putatitively cross JVM boundaries.
-  // In this implementation, they ar strictly local, and are distinct from sections
-  // just because of the namespace issues.
-  protected final LocalLockPool localLocks = new LocalLockPool();
-  protected final static LockPool myLocks = new LockPool(new LockObjectFactory());
-
-  // These are for critical sections (which do not cross JVM boundaries)
-  protected final LocalLockPool localSections = new LocalLockPool();
-  protected final static LockPool mySections = new LockPool(new LockObjectFactory());
-
-  /** Global flag information.  This is used only when all of ManifoldCF is run within one process. */
-  protected final static Map<String,Boolean> globalFlags = new HashMap<String,Boolean>();
-
-  /** Global resource data.  Used only when ManifoldCF is run entirely out of one process. */
-  protected final static Map<String,byte[]> globalData = new HashMap<String,byte[]>();
-  
-  public BaseLockManager()
-    throws ManifoldCFException
-  {
-    threadID = new Long(Thread.currentThread().getId());
-  }
-
-  // Node synchronization
-  
-  // The node synchronization model involves keeping track of active agents entities, so that other entities
-  // can perform any necessary cleanup if one of the agents processes goes away unexpectedly.  There is a
-  // registration primitive (which can fail if the same guid is used as is already registered and active), a
-  // shutdown primitive (which makes a process id go inactive), and various inspection primitives.
-  
-  // This implementation of the node infrastructure uses other primitives implemented by the lock
-  // manager for the implementation.  Specifically, instead of synchronizers, we use a write lock
-  // to prevent conflicts, and we use flags to determine whether a service is active or not.  The
-  // tricky thing, though, is the global registry - which must be able to list its contents.  To acheive
-  // that, we use data with a counter scheme; if the data is not found, it's presumed we are at the
-  // end of the list.
-  //
-  // By building on other primitives in this way, the same implementation will suffice for many derived
-  // lockmanager implementations - although ZooKeeper will want a native form.
-
-  /** The service-type global write lock to control sync, followed by the service type */
-  protected final static String serviceTypeLockPrefix = "_SERVICELOCK_";
-  /** A data name prefix, followed by the service type, and then followed by "_" and the instance number */
-  protected final static String serviceListPrefix = "_SERVICELIST_";
-  /** A flag prefix, followed by the service type, and then followed by "_" and the service name */
-  protected final static String servicePrefix = "_SERVICE_";
-  /** A flag prefix, followed by the service type, and then followed by "_" and the service name */
-  protected final static String activePrefix = "_ACTIVE_";
-  /** A data name prefix, followed by the service type, and then followed by "_" and the service name and "_" and the datatype */
-  protected final static String serviceDataPrefix = "_SERVICEDATA_";
-  /** Anonymous service name prefix, to be followed by an integer */
-  protected final static String anonymousServiceNamePrefix = "_ANON_";
-  /** Anonymous global variable name prefix, to be followed by the service type */
-  protected final static String anonymousServiceTypeCounter = "_SERVICECOUNTER_";
-  
-  
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  @Override
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    return registerServiceBeginServiceActivity(serviceType, serviceName, null, cleanup);
-  }
-
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param initialData is the initial service data for this service.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  @Override
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    byte[] initialData, IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterWriteLock(serviceTypeLockName);
-    try
-    {
-      if (serviceName == null)
-        serviceName = constructUniqueServiceName(serviceType);
-      
-      // First, do an active check
-      String serviceActiveFlag = makeActiveServiceFlagName(serviceType, serviceName);
-      if (checkGlobalFlag(serviceActiveFlag))
-        throw new ManifoldCFException("Service '"+serviceName+"' of type '"+serviceType+"' is already active");
-      
-      // First, see where we stand.
-      // We need to find out whether (a) our service is already registered; (b) how many registered services there are;
-      // (c) whether there are other active services.  But no changes will be made at this time.
-      boolean foundService = false;
-      boolean foundActiveService = false;
-      String resourceName;
-      int i = 0;
-      while (true)
-      {
-        resourceName = buildServiceListEntry(serviceType, i);
-        String x = readServiceName(resourceName);
-        if (x == null)
-          break;
-        if (x.equals(serviceName))
-          foundService = true;
-        else if (checkGlobalFlag(makeActiveServiceFlagName(serviceType, x)))
-          foundActiveService = true;
-        i++;
-      }
-
-      // Call the appropriate cleanup.  This will depend on what's actually registered, and what's active.
-      // If there were no services registered at all when we started, then no cleanup is needed, just cluster init.
-      // If this fails, we must revert to having our service not be registered and not be active.
-      boolean unregisterAll = false;
-      if (cleanup != null)
-      {
-        if (i == 0)
-        {
-          // If we could count on locks never being cleaned up, clusterInit()
-          // would be sufficient here.  But then there's no way to recover from
-          // a lock clean.
-          cleanup.cleanUpAllServices();
-          cleanup.clusterInit();
-        }
-        else if (foundService && foundActiveService)
-          cleanup.cleanUpService(serviceName);
-        else if (!foundActiveService)
-        {
-          cleanup.cleanUpAllServices();
-          cleanup.clusterInit();
-          unregisterAll = true;
-        }
-      }
-      
-      if (unregisterAll)
-      {
-        // Unregister all (since we did a global cleanup)
-        int k = i;
-        while (k > 0)
-        {
-          k--;
-          resourceName = buildServiceListEntry(serviceType, k);
-          String x = readServiceName(resourceName);
-          clearGlobalFlag(makeRegisteredServiceFlagName(serviceType, x));
-          writeServiceName(resourceName, null);
-        }
-        foundService = false;
-      }
-
-      // Now, register (if needed)
-      if (!foundService)
-      {
-        writeServiceName(resourceName, serviceName);
-        try
-        {
-          setGlobalFlag(makeRegisteredServiceFlagName(serviceType, serviceName));
-        }
-        catch (Throwable e)
-        {
-          writeServiceName(resourceName, null);
-          if (e instanceof Error)
-            throw (Error)e;
-          if (e instanceof RuntimeException)
-            throw (RuntimeException)e;
-          if (e instanceof ManifoldCFException)
-            throw (ManifoldCFException)e;
-          else
-            throw new RuntimeException("Unknown exception of type: "+e.getClass().getName()+": "+e.getMessage(),e);
-        }
-      }
-
-      // Last, set the appropriate active flag
-      setGlobalFlag(serviceActiveFlag);
-      writeServiceData(serviceType, serviceName, initialData);
-
-      return serviceName;
-    }
-    finally
-    {
-      leaveWriteLock(serviceTypeLockName);
-    }
-  }
-  
-  /** Set service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@param serviceData is the data to update to (may be null).
-  * This updates the service's transient data (or deletes it).  If the service is not active, an exception is thrown.
-  */
-  @Override
-  public void updateServiceData(String serviceType, String serviceName, byte[] serviceData)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterWriteLock(serviceTypeLockName);
-    try
-    {
-      String serviceActiveFlag = makeActiveServiceFlagName(serviceType, serviceName);
-      if (!checkGlobalFlag(serviceActiveFlag))
-        throw new ManifoldCFException("Service '"+serviceName+"' of type '"+serviceType+"' is not active");
-      writeServiceData(serviceType, serviceName, serviceData);
-    }
-    finally
-    {
-      leaveWriteLock(serviceTypeLockName);
-    }
-  }
-
-  /** Retrieve service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@return the service's transient data.
-  */
-  @Override
-  public byte[] retrieveServiceData(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterReadLock(serviceTypeLockName);
-    try
-    {
-      String serviceActiveFlag = makeActiveServiceFlagName(serviceType, serviceName);
-      if (!checkGlobalFlag(serviceActiveFlag))
-        return null;
-      byte[] rval = readServiceData(serviceType, serviceName);
-      if (rval == null)
-        rval = new byte[0];
-      return rval;
-    }
-    finally
-    {
-      leaveReadLock(serviceTypeLockName);
-    }
-  }
-
-  /** Scan service data for a service type.  Only active service data will be considered.
-  *@param serviceType is the type of service.
-  *@param dataType is the type of data.
-  *@param dataAcceptor is the object that will be notified of each item of data for each service name found.
-  */
-  @Override
-  public void scanServiceData(String serviceType, IServiceDataAcceptor dataAcceptor)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterReadLock(serviceTypeLockName);
-    try
-    {
-      int i = 0;
-      while (true)
-      {
-        String resourceName = buildServiceListEntry(serviceType, i);
-        String x = readServiceName(resourceName);
-        if (x == null)
-          break;
-        if (checkGlobalFlag(makeActiveServiceFlagName(serviceType, x)))
-        {
-          byte[] serviceData = readServiceData(serviceType, x);
-          if (dataAcceptor.acceptServiceData(x, serviceData))
-            break;
-        }
-        i++;
-      }
-    }
-    finally
-    {
-      leaveReadLock(serviceTypeLockName);
-    }
-  }
-
-  /** Count all active services of a given type.
-  *@param serviceType is the service type.
-  *@return the count.
-  */
-  @Override
-  public int countActiveServices(String serviceType)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterReadLock(serviceTypeLockName);
-    try
-    {
-      int count = 0;
-      int i = 0;
-      while (true)
-      {
-        String resourceName = buildServiceListEntry(serviceType, i);
-        String x = readServiceName(resourceName);
-        if (x == null)
-          break;
-        if (checkGlobalFlag(makeActiveServiceFlagName(serviceType, x)))
-          count++;
-        i++;
-      }
-      return count;
-    }
-    finally
-    {
-      leaveReadLock(serviceTypeLockName);
-    }
-  }
-
-  /** Clean up any inactive services found.
-  * Calling this method will invoke cleanup of one inactive service at a time.
-  * If there are no inactive services around, then false will be returned.
-  * Note that this method will block whatever service it finds from starting up
-  * for the time the cleanup is proceeding.  At the end of the cleanup, if
-  * successful, the service will be atomically unregistered.
-  *@param serviceType is the service type.
-  *@param cleanup is the object to call to clean up an inactive service.
-  *@return true if there were no cleanup operations necessary.
-  */
-  @Override
-  public boolean cleanupInactiveService(String serviceType, IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterWriteLock(serviceTypeLockName);
-    try
-    {
-      // We find ONE service that is registered but inactive, and clean up after that one.
-      // Presumably the caller will lather, rinse, and repeat.
-      String serviceName;
-      String resourceName;
-      int i = 0;
-      while (true)
-      {
-        resourceName = buildServiceListEntry(serviceType, i);
-        serviceName = readServiceName(resourceName);
-        if (serviceName == null)
-          return true;
-        if (!checkGlobalFlag(makeActiveServiceFlagName(serviceType, serviceName)))
-          break;
-        i++;
-      }
-      
-      // Found one, in serviceName, at position i
-      // Ideally, we should signal at this point that we're cleaning up after it, and then leave
-      // the exclusive lock, so that other activity can take place.  MHL
-      cleanup.cleanUpService(serviceName);
-      
-      // Clean up the registration
-      String serviceRegisteredFlag = makeRegisteredServiceFlagName(serviceType, serviceName);
-      
-      // Find the end of the list
-      int k = i + 1;
-      String lastResourceName = null;
-      String lastServiceName = null;
-      while (true)
-      {
-        String rName = buildServiceListEntry(serviceType, k);
-        String x = readServiceName(rName);
-        if (x == null)
-          break;
-        lastResourceName = rName;
-        lastServiceName = x;
-        k++;
-      }
-
-      // Rearrange the registration
-      clearGlobalFlag(serviceRegisteredFlag);
-      if (lastServiceName != null)
-        writeServiceName(resourceName, lastServiceName);
-      writeServiceName(lastResourceName, null);
-      return false;
-    }
-    finally
-    {
-      leaveWriteLock(serviceTypeLockName);
-    }
-  }
-
-  /** End service activity.
-  * This operation exits the "active" zone for the service.  This must take place using the same ILockManager
-  * object that was used to registerServiceBeginServiceActivity() - which implies that it is the same thread.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to exit.
-  */
-  @Override
-  public void endServiceActivity(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterWriteLock(serviceTypeLockName);
-    try
-    {
-      String serviceActiveFlag = makeActiveServiceFlagName(serviceType, serviceName);
-      if (!checkGlobalFlag(serviceActiveFlag))
-        throw new ManifoldCFException("Service '"+serviceName+"' of type '"+serviceType+" is not active");
-      deleteServiceData(serviceType, serviceName);
-      clearGlobalFlag(serviceActiveFlag);
-    }
-    finally
-    {
-      leaveWriteLock(serviceTypeLockName);
-    }
-  }
-    
-  /** Check whether a service is active or not.
-  * This operation returns true if the specified service is considered active at the moment.  Once a service
-  * is not active anymore, it can only return to activity by calling beginServiceActivity() once more.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to check on.
-  *@return true if the service is considered active.
-  */
-  @Override
-  public boolean checkServiceActive(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    String serviceTypeLockName = buildServiceTypeLockName(serviceType);
-    enterReadLock(serviceTypeLockName);
-    try
-    {
-      return checkGlobalFlag(makeActiveServiceFlagName(serviceType, serviceName));
-    }
-    finally
-    {
-      leaveReadLock(serviceTypeLockName);
-    }
-  }
-
-  /** Construct a unique service name given the service type.
-  */
-  protected String constructUniqueServiceName(String serviceType)
-    throws ManifoldCFException
-  {
-    String serviceCounterName = makeServiceCounterName(serviceType);
-    int serviceUID = readServiceCounter(serviceCounterName);
-    writeServiceCounter(serviceCounterName,serviceUID+1);
-    return anonymousServiceNamePrefix + serviceUID;
-  }
-  
-  /** Make the service counter name for a service type.
-  */
-  protected static String makeServiceCounterName(String serviceType)
-  {
-    return anonymousServiceTypeCounter + serviceType;
-  }
-  
-  /** Read service counter.
-  */
-  protected int readServiceCounter(String serviceCounterName)
-    throws ManifoldCFException
-  {
-    byte[] serviceCounterData = readData(serviceCounterName);
-    if (serviceCounterData == null || serviceCounterData.length != 4)
-      return 0;
-    return (((int)serviceCounterData[0]) & 0xff) +
-      ((((int)serviceCounterData[1]) << 8) & 0xff00) +
-      ((((int)serviceCounterData[2]) << 16) & 0xff0000) +
-      ((((int)serviceCounterData[3]) << 24) & 0xff000000);
-  }
-  
-  /** Write service counter.
-  */
-  protected void writeServiceCounter(String serviceCounterName, int counter)
-    throws ManifoldCFException
-  {
-    byte[] serviceCounterData = new byte[4];
-    serviceCounterData[0] = (byte)(counter & 0xff);
-    serviceCounterData[1] = (byte)((counter >> 8) & 0xff);
-    serviceCounterData[2] = (byte)((counter >> 16) & 0xff);
-    serviceCounterData[3] = (byte)((counter >> 24) & 0xff);
-    writeData(serviceCounterName,serviceCounterData);
-  }
-  
-  protected void writeServiceData(String serviceType, String serviceName, byte[] serviceData)
-    throws ManifoldCFException
-  {
-    writeData(makeServiceDataName(serviceType, serviceName), serviceData);
-  }
-  
-  protected byte[] readServiceData(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    return readData(makeServiceDataName(serviceType, serviceName));
-  }
-  
-  protected void deleteServiceData(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    writeServiceData(serviceType, serviceName, null);
-  }
-  
-  protected static String makeServiceDataName(String serviceType, String serviceName)
-  {
-    return serviceDataPrefix + serviceType + "_" + serviceName;
-  }
-  
-  protected static String makeActiveServiceFlagName(String serviceType, String serviceName)
-  {
-    return activePrefix + serviceType + "_" + serviceName;
-  }
-  
-  protected static String makeRegisteredServiceFlagName(String serviceType, String serviceName)
-  {
-    return servicePrefix + serviceType + "_" + serviceName;
-  }
-
-  protected String readServiceName(String resourceName)
-    throws ManifoldCFException
-  {
-    byte[] bytes = readData(resourceName);
-    if (bytes == null)
-      return null;
-
-    return new String(bytes, StandardCharsets.UTF_8);
-
-  }
-  
-  protected void writeServiceName(String resourceName, String serviceName)
-    throws ManifoldCFException
-  {
-    writeData(resourceName, (serviceName==null)?null:serviceName.getBytes(StandardCharsets.UTF_8));
-  }
-  
-  protected static String buildServiceListEntry(String serviceType, int i)
-  {
-    return serviceListPrefix + serviceType + "_" + i;
-  }
-
-  protected static String buildServiceTypeLockName(String serviceType)
-  {
-    return serviceTypeLockPrefix + serviceType;
-  }
-  
-  /** Get the current shared configuration.  This configuration is available in common among all nodes,
-  * and thus must not be accessed through here for the purpose of finding configuration data that is specific to any one
-  * specific node.
-  *@param configurationData is the globally-shared configuration information.
-  */
-  @Override
-  public ManifoldCFConfiguration getSharedConfiguration()
-    throws ManifoldCFException
-  {
-    // Local implementation vectors through to system property file, which is shared in this case
-    return ManifoldCF.getConfiguration();
-  }
-
-  /** Raise a flag.  Use this method to assert a condition, or send a global signal.  The flag will be reset when the
-  * entire system is restarted.
-  *@param flagName is the name of the flag to set.
-  */
-  @Override
-  public void setGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    // Keep local flag information in memory
-    synchronized (globalFlags)
-    {
-      globalFlags.put(flagName,new Boolean(true));
-    }
-  }
-
-  /** Clear a flag.  Use this method to clear a condition, or retract a global signal.
-  *@param flagName is the name of the flag to clear.
-  */
-  @Override
-  public void clearGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    // Keep flag information in memory
-    synchronized (globalFlags)
-    {
-      globalFlags.remove(flagName);
-    }
-  }
-  
-  /** Check the condition of a specified flag.
-  *@param flagName is the name of the flag to check.
-  *@return true if the flag is set, false otherwise.
-  */
-  @Override
-  public boolean checkGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    // Keep flag information in memory
-    synchronized (globalFlags)
-    {
-      return globalFlags.get(flagName) != null;
-    }
-  }
-
-  /** Read data from a shared data resource.  Use this method to read any existing data, or get a null back if there is no such resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@return a byte array containing the data, or null.
-  */
-  @Override
-  public byte[] readData(String resourceName)
-    throws ManifoldCFException
-  {
-    // Keep resource data local
-    synchronized (globalData)
-    {
-      return globalData.get(resourceName);
-    }
-  }
-  
-  /** Write data to a shared data resource.  Use this method to write a body of data into a shared resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@param data is the byte array containing the data.  Pass null if you want to delete the resource completely.
-  */
-  @Override
-  public void writeData(String resourceName, byte[] data)
-    throws ManifoldCFException
-  {
-    // Keep resource data local
-    synchronized (globalData)
-    {
-      if (data == null)
-        globalData.remove(resourceName);
-      else
-        globalData.put(resourceName,data);
-    }
-  }
-
-  /** Wait for a time before retrying a lock.
-  */
-  @Override
-  public final void timedWait(int time)
-    throws ManifoldCFException
-  {
-
-    if (Logging.lock.isDebugEnabled())
-    {
-      Logging.lock.debug("Waiting for time "+Integer.toString(time));
-    }
-
-    try
-    {
-      ManifoldCF.sleep(time);
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Override this method to change the nature of global locks.
-  */
-  protected LockPool getGlobalLockPool()
-  {
-    return myLocks;
-  }
-  
-  /** Enter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers").
-  * This kind of lock is designed to be used in conjunction with read locks.  It is used typically in
-  * a situation where the read lock represents a query and the non-exclusive write lock represents a modification
-  * to an individual item that might affect the query, but where multiple modifications do not individually
-  * interfere with one another (use of another, standard, write lock per item can guarantee this).
-  */
-  @Override
-  public final void enterNonExWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    enterNonExWrite(threadID, lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  @Override
-  public final void enterNonExWriteLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException
-  {
-    enterNonExWriteNoWait(threadID, lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  /** Leave a non-exclusive write lock.
-  */
-  @Override
-  public final void leaveNonExWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    leaveNonExWrite(lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  /** Enter a write locked area (i.e., block out both readers and other writers)
-  * NOTE: Can't enter until all readers have left.
-  */
-  @Override
-  public final void enterWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    enterWrite(threadID, lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  @Override
-  public final void enterWriteLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException
-  {
-    enterWriteNoWait(threadID, lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  @Override
-  public final void leaveWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    leaveWrite(lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  /** Enter a read-only locked area (i.e., block ONLY if there's a writer)
-  */
-  @Override
-  public final void enterReadLock(String lockKey)
-    throws ManifoldCFException
-  {
-    enterRead(threadID, lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  @Override
-  public final void enterReadLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException
-  {
-    enterReadNoWait(threadID, lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  @Override
-  public final void leaveReadLock(String lockKey)
-    throws ManifoldCFException
-  {
-    leaveRead(lockKey, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  /** Enter multiple locks
-  */
-  @Override
-  public final void enterLocks(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException
-  {
-    enter(threadID, readLocks, nonExWriteLocks, writeLocks, "lock", localLocks, getGlobalLockPool());
-  }
-
-  @Override
-  public final void enterLocksNoWait(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException, LockException
-  {
-    enterNoWait(threadID, readLocks, nonExWriteLocks, writeLocks, "lock", localLocks, getGlobalLockPool());
-  }
-
-  /** Leave multiple locks
-  */
-  @Override
-  public final void leaveLocks(String[] readLocks, String[] writeNonExLocks, String[] writeLocks)
-    throws ManifoldCFException
-  {
-    leave(readLocks, writeNonExLocks, writeLocks, "lock", localLocks, getGlobalLockPool());
-  }
-  
-  @Override
-  public final void clearLocks()
-    throws ManifoldCFException
-  {
-    clear("lock", localLocks, getGlobalLockPool());
-  }
-  
-  /** Enter a named, read critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public final void enterReadCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    enterRead(threadID, sectionKey, "critical section", localSections, mySections);
-  }
-
-  /** Leave a named, read critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public final void leaveReadCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    leaveRead(sectionKey, "critical section", localSections, mySections);
-  }
-
-  /** Enter a named, non-exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public final void enterNonExWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    enterNonExWrite(threadID, sectionKey, "critical section", localSections, mySections);
-  }
-
-  /** Leave a named, non-exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public final void leaveNonExWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    leaveNonExWrite(sectionKey, "critical section", localSections, mySections);
-  }
-  
-  /** Enter a named, exclusive critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names should be distinct from all lock names.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public final void enterWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    enterWrite(threadID, sectionKey, "critical section", localSections, mySections);
-  }
-  
-  /** Leave a named, exclusive critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names should be distinct from all lock names.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public final void leaveWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    leaveWrite(sectionKey, "critical section", localSections, mySections);
-  }
-
-  /** Enter multiple critical sections simultaneously.
-  *@param readSectionKeys is an array of read section descriptors, or null if there are no read sections desired.
-  *@param nonExSectionKeys is an array of non-ex write section descriptors, or null if none desired.
-  *@param writeSectionKeys is an array of write section descriptors, or null if there are none desired.
-  */
-  @Override
-  public final void enterCriticalSections(String[] readSectionKeys, String[] nonExSectionKeys, String[] writeSectionKeys)
-    throws ManifoldCFException
-  {
-    enter(threadID, readSectionKeys, nonExSectionKeys, writeSectionKeys, "critical section", localSections, mySections);
-  }
-
-  /** Leave multiple critical sections simultaneously.
-  *@param readSectionKeys is an array of read section descriptors, or null if there are no read sections desired.
-  *@param nonExSectionKeys is an array of non-ex write section descriptors, or null if none desired.
-  *@param writeSectionKeys is an array of write section descriptors, or null if there are none desired.
-  */
-  @Override
-  public final void leaveCriticalSections(String[] readSectionKeys, String[] nonExSectionKeys, String[] writeSectionKeys)
-    throws ManifoldCFException
-  {
-    leave(readSectionKeys, nonExSectionKeys, writeSectionKeys, "critical section", localSections, mySections);
-  }
-
-
-  // Protected methods
-
-  protected static void enterNonExWrite(Long threadID, String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Entering non-ex write "+description+" '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-    // See if we already own a write lock for the object
-    // If we do, there is no reason to change the status of the global lock we own.
-    if (ll.hasNonExWriteLock() || ll.hasWriteLock())
-    {
-      ll.incrementNonExWriteLocks();
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained "+description+"!");
-      return;
-    }
-
-    // Check for illegalities
-    if (ll.hasReadLock())
-    {
-      throw new ManifoldCFException("Illegal "+description+" sequence: NonExWrite "+description+" can't be within read "+description,ManifoldCFException.GENERAL_ERROR);
-    }
-
-    // We don't own a local non-ex write lock.  Get one.  The global lock will need
-    // to know if we already have a a read lock.
-    while (true)
-    {
-      LockGate lo = crossLocks.getObject(lockKey);
-      try
-      {
-        lo.enterNonExWriteLock(threadID);
-        break;
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ExpiredObjectException e)
-      {
-        // Try again to get a valid object
-      }
-    }
-    ll.incrementNonExWriteLocks();
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug(" Successfully obtained "+description+"!");
-  }
-
-  protected static void enterNonExWriteNoWait(Long threadID, String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException, LockException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Entering non-ex write "+description+" no wait '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-
-    // See if we already own a write lock for the object
-    // If we do, there is no reason to change the status of the global lock we own.
-    if (ll.hasNonExWriteLock() || ll.hasWriteLock())
-    {
-      ll.incrementNonExWriteLocks();
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained "+description+"!");
-      return;
-    }
-
-    // Check for illegalities
-    if (ll.hasReadLock())
-    {
-      throw new ManifoldCFException("Illegal "+description+" sequence: NonExWrite "+description+" can't be within read "+description,ManifoldCFException.GENERAL_ERROR);
-    }
-
-    // We don't own a local non-ex write lock.  Get one.  The global lock will need
-    // to know if we already have a a read lock.
-    while (true)
-    {
-      LockGate lo = crossLocks.getObject(lockKey);
-      try
-      {
-        synchronized (lo)
-        {
-          lo.enterNonExWriteLockNoWait(threadID);
-          break;
-        }
-      }
-      catch (LocalLockException e)
-      {
-
-        if (Logging.lock.isDebugEnabled())
-          Logging.lock.debug(" Could not non-ex write "+description+" '"+lockKey+"', lock exception");
-
-        // Throw LockException instead
-        throw new LockException(e.getMessage());
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ExpiredObjectException e)
-      {
-        // Try again to get a valid object
-      }
-    }
-    ll.incrementNonExWriteLocks();
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug(" Successfully obtained "+description+"!");
-  }
-
-  protected static void leaveNonExWrite(String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Leaving non-ex write "+description+" '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-    ll.decrementNonExWriteLocks();
-    // See if we no longer have a write lock for the object.
-    // If we retain the stronger exclusive lock, we still do not need to
-    // change the status of the global lock.
-    if (!(ll.hasNonExWriteLock() || ll.hasWriteLock()))
-    {
-      while (true)
-      {
-        LockGate lo = crossLocks.getObject(lockKey);
-        try
-        {
-          lo.leaveNonExWriteLock();
-          break;
-        }
-        catch (InterruptedException e)
-        {
-          // try one more time
-          try
-          {
-            lo.leaveNonExWriteLock();
-            throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (InterruptedException e2)
-          {
-            ll.incrementNonExWriteLocks();
-            throw new ManifoldCFException("Interrupted",e2,ManifoldCFException.INTERRUPTED);
-          }
-          catch (ExpiredObjectException e2)
-          {
-            ll.incrementNonExWriteLocks();
-            throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-          }
-        }
-        catch (ExpiredObjectException e)
-        {
-          // Try again to get a valid object
-        }
-      }
-
-      localLocks.releaseLocalLock(lockKey);
-    }
-  }
-
-  protected static void enterWrite(Long threadID, String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Entering write "+description+" '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-
-    // See if we already own the write lock for the object
-    if (ll.hasWriteLock())
-    {
-      ll.incrementWriteLocks();
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained "+description+"!");
-      return;
-    }
-
-    // Check for illegalities
-    if (ll.hasReadLock() || ll.hasNonExWriteLock())
-    {
-      throw new ManifoldCFException("Illegal "+description+" sequence: Write "+description+" can't be within read "+description+" or non-ex write "+description,ManifoldCFException.GENERAL_ERROR);
-    }
-
-    // We don't own a local write lock.  Get one.  The global lock will need
-    // to know if we already have a non-exclusive lock or a read lock, which we don't because
-    // it's illegal.
-    while (true)
-    {
-      LockGate lo = crossLocks.getObject(lockKey);
-      try
-      {
-        lo.enterWriteLock(threadID);
-        break;
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ExpiredObjectException e)
-      {
-        // Try again
-      }
-    }
-    ll.incrementWriteLocks();
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug(" Successfully obtained "+description+"!");
-  }
-
-  protected static void enterWriteNoWait(Long threadID, String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException, LockException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Entering write "+description+" no wait '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-
-    // See if we already own the write lock for the object
-    if (ll.hasWriteLock())
-    {
-      ll.incrementWriteLocks();
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained "+description+"!");
-      return;
-    }
-
-    // Check for illegalities
-    if (ll.hasReadLock() || ll.hasNonExWriteLock())
-    {
-      throw new ManifoldCFException("Illegal "+description+" sequence: Write "+description+" can't be within read "+description+" or non-ex write "+description,ManifoldCFException.GENERAL_ERROR);
-    }
-
-    // We don't own a local write lock.  Get one.  The global lock will need
-    // to know if we already have a non-exclusive lock or a read lock, which we don't because
-    // it's illegal.
-    while (true)
-    {
-      LockGate lo = crossLocks.getObject(lockKey);
-      try
-      {
-        synchronized (lo)
-        {
-          lo.enterWriteLockNoWait(threadID);
-          break;
-        }
-      }
-      catch (LocalLockException e)
-      {
-
-        if (Logging.lock.isDebugEnabled())
-        {
-          Logging.lock.debug(" Could not write "+description+" '"+lockKey+"', lock exception");
-        }
-
-        throw new LockException(e.getMessage());
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ExpiredObjectException e)
-      {
-        // Try again
-      }
-    }
-
-    ll.incrementWriteLocks();
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug(" Successfully obtained "+description+"!");
-  }
-
-  protected static void leaveWrite(String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Leaving write "+description+" '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-    ll.decrementWriteLocks();
-    if (!ll.hasWriteLock())
-    {
-      while (true)
-      {
-        LockGate lo = crossLocks.getObject(lockKey);
-        try
-        {
-          lo.leaveWriteLock();
-          break;
-        }
-        catch (InterruptedException e)
-        {
-          // try one more time
-          try
-          {
-            lo.leaveWriteLock();
-            throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (InterruptedException e2)
-          {
-            ll.incrementWriteLocks();
-            throw new ManifoldCFException("Interrupted",e2,ManifoldCFException.INTERRUPTED);
-          }
-          catch (ExpiredObjectException e2)
-          {
-            ll.incrementWriteLocks();
-            throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-          }
-        }
-        catch (ExpiredObjectException e)
-        {
-          // Try again
-        }
-      }
-
-      localLocks.releaseLocalLock(lockKey);
-    }
-  }
-
-  protected static void enterRead(Long threadID, String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Entering read "+description+" '"+lockKey+"'");
-
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-    // See if we already own the read lock for the object.
-    // Write locks or non-ex writelocks count as well (they're stronger).
-    if (ll.hasReadLock() || ll.hasNonExWriteLock() || ll.hasWriteLock())
-    {
-      ll.incrementReadLocks();
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained "+description+"!");
-      return;
-    }
-
-    // We don't own a local read lock.  Get one.
-    while (true)
-    {
-      LockGate lo = crossLocks.getObject(lockKey);
-      try
-      {
-        lo.enterReadLock(threadID);
-        break;
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ExpiredObjectException e)
-      {
-        // Try again
-      }
-    }
-    ll.incrementReadLocks();
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug(" Successfully obtained "+description+"!");
-  }
-
-  protected static void enterReadNoWait(Long threadID, String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException, LockException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Entering read "+description+" no wait '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-    // See if we already own the read lock for the object.
-    // Write locks or non-ex writelocks count as well (they're stronger).
-    if (ll.hasReadLock() || ll.hasNonExWriteLock() || ll.hasWriteLock())
-    {
-      ll.incrementReadLocks();
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained "+description+"!");
-      return;
-    }
-
-    // We don't own a local read lock.  Get one.
-    while (true)
-    {
-      LockGate lo = crossLocks.getObject(lockKey);
-      try
-      {
-        synchronized (lo)
-        {
-          lo.enterReadLockNoWait(threadID);
-          break;
-        }
-      }
-      catch (LocalLockException e)
-      {
-
-        if (Logging.lock.isDebugEnabled())
-          Logging.lock.debug(" Could not read "+description+" '"+lockKey+"', lock exception");
-
-        throw new LockException(e.getMessage());
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-      }
-      catch (ExpiredObjectException e)
-      {
-        // Try again
-      }
-    }
-
-    ll.incrementReadLocks();
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug(" Successfully obtained "+description+"!");
-  }
-
-  protected static void leaveRead(String lockKey, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Leaving read "+description+" '"+lockKey+"'");
-
-    LocalLock ll = localLocks.getLocalLock(lockKey);
-
-    ll.decrementReadLocks();
-    if (!(ll.hasReadLock() || ll.hasNonExWriteLock() || ll.hasWriteLock()))
-    {
-      while (true)
-      {
-        LockGate lo = crossLocks.getObject(lockKey);
-        try
-        {
-          lo.leaveReadLock();
-          break;
-        }
-        catch (InterruptedException e)
-        {
-          // Try one more time
-          try
-          {
-            lo.leaveReadLock();
-            throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-          }
-          catch (InterruptedException e2)
-          {
-            ll.incrementReadLocks();
-            throw new ManifoldCFException("Interrupted",e2,ManifoldCFException.INTERRUPTED);
-          }
-          catch (ExpiredObjectException e2)
-          {
-            ll.incrementReadLocks();
-            throw new ManifoldCFException("Interrupted",e,ManifoldCFException.INTERRUPTED);
-          }
-        }
-        catch (ExpiredObjectException e)
-        {
-          // Try again
-        }
-      }
-      localLocks.releaseLocalLock(lockKey);
-    }
-  }
-
-  protected static void clear(String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-      Logging.lock.debug("Clearing all "+description+"s");
-
-    for (String keyValue : localLocks.keySet())
-    {
-      LocalLock ll = localLocks.getLocalLock(keyValue);
-      while (ll.hasWriteLock())
-        leaveWrite(keyValue, description, localLocks, crossLocks);
-      while (ll.hasNonExWriteLock())
-        leaveNonExWrite(keyValue, description, localLocks, crossLocks);
-      while (ll.hasReadLock())
-        leaveRead(keyValue, description, localLocks, crossLocks);
-    }
-  }
-
-  protected static void enter(Long threadID, String[] readLocks, String[] nonExWriteLocks, String[] writeLocks, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    if (Logging.lock.isDebugEnabled())
-    {
-      Logging.lock.debug("Entering multiple "+description+"s:");
-      int i;
-      if (readLocks != null)
-      {
-        i = 0;
-        while (i < readLocks.length)
-        {
-          Logging.lock.debug(" Read "+description+" '"+readLocks[i++]+"'");
-        }
-      }
-      if (nonExWriteLocks != null)
-      {
-        i = 0;
-        while (i < nonExWriteLocks.length)
-        {
-          Logging.lock.debug(" Non-ex write "+description+" '"+nonExWriteLocks[i++]+"'");
-        }
-      }
-      if (writeLocks != null)
-      {
-        i = 0;
-        while (i < writeLocks.length)
-        {
-          Logging.lock.debug(" Write "+description+" '"+writeLocks[i++]+"'");
-        }
-      }
-    }
-
-
-    // Sort the locks.  This improves the chances of making it through the locking process without
-    // contention!
-    LockDescription lds[] = getSortedUniqueLocks(readLocks,nonExWriteLocks,writeLocks);
-    int locksProcessed = 0;
-    try
-    {
-      while (locksProcessed < lds.length)
-      {
-        LockDescription ld = lds[locksProcessed];
-        int lockType = ld.getType();
-        String lockKey = ld.getKey();
-        LocalLock ll;
-        switch (lockType)
-        {
-        case TYPE_WRITE:
-          ll = localLocks.getLocalLock(lockKey);
-          // Check for illegalities
-          if ((ll.hasReadLock() || ll.hasNonExWriteLock()) && !ll.hasWriteLock())
-          {
-            throw new ManifoldCFException("Illegal "+description+" sequence: Write "+description+" can't be within read "+description+" or non-ex write "+description,ManifoldCFException.GENERAL_ERROR);
-          }
-
-          // See if we already own the write lock for the object
-          if (!ll.hasWriteLock())
-          {
-            // We don't own a local write lock.  Get one.
-            while (true)
-            {
-              LockGate lo = crossLocks.getObject(lockKey);
-              try
-              {
-                lo.enterWriteLock(threadID);
-                break;
-              }
-              catch (ExpiredObjectException e)
-              {
-                // Try again
-              }
-            }
-          }
-          ll.incrementWriteLocks();
-          break;
-        case TYPE_WRITENONEX:
-          ll = localLocks.getLocalLock(lockKey);
-          // Check for illegalities
-          if (ll.hasReadLock() && !(ll.hasNonExWriteLock() || ll.hasWriteLock()))
-          {
-            throw new ManifoldCFException("Illegal "+description+" sequence: NonExWrite "+description+" can't be within read "+description,ManifoldCFException.GENERAL_ERROR);
-          }
-
-          // See if we already own the write lock for the object
-          if (!(ll.hasNonExWriteLock() || ll.hasWriteLock()))
-          {
-            // We don't own a local write lock.  Get one.
-            while (true)
-            {
-              LockGate lo = crossLocks.getObject(lockKey);
-              try
-              {
-                lo.enterNonExWriteLock(threadID);
-                break;
-              }
-              catch (ExpiredObjectException e)
-              {
-                // Try again
-              }
-            }
-          }
-          ll.incrementNonExWriteLocks();
-          break;
-        case TYPE_READ:
-          ll = localLocks.getLocalLock(lockKey);
-          if (!(ll.hasReadLock() || ll.hasNonExWriteLock() || ll.hasWriteLock()))
-          {
-            // We don't own a local read lock.  Get one.
-            while (true)
-            {
-              LockGate lo = crossLocks.getObject(lockKey);
-              try
-              {
-                lo.enterReadLock(threadID);
-                break;
-              }
-              catch (ExpiredObjectException e)
-              {
-                // Try again
-              }
-            }
-          }
-          ll.incrementReadLocks();
-          break;
-        }
-        locksProcessed++;
-      }
-      // Got all; we are done!
-      Logging.lock.debug(" Successfully obtained multiple "+description+"s!");
-      return;
-    }
-    catch (Throwable ex)
-    {
-      // No matter what, undo the locks we've taken
-      ManifoldCFException ae = null;
-      int errno = 0;
-
-      while (--locksProcessed >= 0)
-      {
-        LockDescription ld = lds[locksProcessed];
-        int lockType = ld.getType();
-        String lockKey = ld.getKey();
-        try
-        {
-          switch (lockType)
-          {
-          case TYPE_READ:
-            leaveRead(lockKey,description,localLocks,crossLocks);
-            break;
-          case TYPE_WRITENONEX:
-            leaveNonExWrite(lockKey,description,localLocks,crossLocks);
-            break;
-          case TYPE_WRITE:
-            leaveWrite(lockKey,description,localLocks,crossLocks);
-            break;
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          ae = e;
-        }
-      }
-
-      if (ae != null)
-      {
-        throw ae;
-      }
-      if (ex instanceof ManifoldCFException)
-      {
-        throw (ManifoldCFException)ex;
-      }
-      if (ex instanceof InterruptedException)
-      {
-        // It's InterruptedException
-        throw new ManifoldCFException("Interrupted",ex,ManifoldCFException.INTERRUPTED);
-      }
-      if (!(ex instanceof Error))
-      {
-        throw new Error("Unexpected exception",ex);
-      }
-      throw (Error)ex;
-    }
-  }
-
-  protected static void enterNoWait(Long threadID, String[] readLocks, String[] nonExWriteLocks, String[] writeLocks, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException, LockException
-  {
-    if (Logging.lock.isDebugEnabled())
-    {
-      Logging.lock.debug("Entering multiple "+description+"s no wait:");
-      int i;
-      if (readLocks != null)
-      {
-        i = 0;
-        while (i < readLocks.length)
-        {
-          Logging.lock.debug(" Read "+description+" '"+readLocks[i++]+"'");
-        }
-      }
-      if (nonExWriteLocks != null)
-      {
-        i = 0;
-        while (i < nonExWriteLocks.length)
-        {
-          Logging.lock.debug(" Non-ex write "+description+" '"+nonExWriteLocks[i++]+"'");
-        }
-      }
-      if (writeLocks != null)
-      {
-        i = 0;
-        while (i < writeLocks.length)
-        {
-          Logging.lock.debug(" Write "+description+" '"+writeLocks[i++]+"'");
-        }
-      }
-    }
-
-
-    // Sort the locks.  This improves the chances of making it through the locking process without
-    // contention!
-    LockDescription lds[] = getSortedUniqueLocks(readLocks,nonExWriteLocks,writeLocks);
-    int locksProcessed = 0;
-    try
-    {
-      while (locksProcessed < lds.length)
-      {
-        LockDescription ld = lds[locksProcessed];
-        int lockType = ld.getType();
-        String lockKey = ld.getKey();
-        LocalLock ll;
-        switch (lockType)
-        {
-        case TYPE_WRITE:
-          ll = localLocks.getLocalLock(lockKey);
-          // Check for illegalities
-          if ((ll.hasReadLock() || ll.hasNonExWriteLock()) && !ll.hasWriteLock())
-          {
-            throw new ManifoldCFException("Illegal "+description+" sequence: Write "+description+" can't be within read "+description+" or non-ex write "+description,ManifoldCFException.GENERAL_ERROR);
-          }
-
-          // See if we already own the write lock for the object
-          if (!ll.hasWriteLock())
-          {
-            // We don't own a local write lock.  Get one.
-            while (true)
-            {
-              LockGate lo = crossLocks.getObject(lockKey);
-              synchronized (lo)
-              {
-                try
-                {
-                  lo.enterWriteLockNoWait(threadID);
-                  break;
-                }
-                catch (ExpiredObjectException e)
-                {
-                  // Try again
-                }
-              }
-            }
-          }
-          ll.incrementWriteLocks();
-          break;
-        case TYPE_WRITENONEX:
-          ll = localLocks.getLocalLock(lockKey);
-          // Check for illegalities
-          if (ll.hasReadLock() && !(ll.hasNonExWriteLock() || ll.hasWriteLock()))
-          {
-            throw new ManifoldCFException("Illegal "+description+" sequence: NonExWrite "+description+" can't be within read "+description,ManifoldCFException.GENERAL_ERROR);
-          }
-
-          // See if we already own the write lock for the object
-          if (!(ll.hasNonExWriteLock() || ll.hasWriteLock()))
-          {
-            // We don't own a local write lock.  Get one.
-            while (true)
-            {
-              LockGate lo = crossLocks.getObject(lockKey);
-              synchronized (lo)
-              {
-                try
-                {
-                  lo.enterNonExWriteLockNoWait(threadID);
-                  break;
-                }
-                catch (ExpiredObjectException e)
-                {
-                  // Try again
-                }
-              }
-            }
-          }
-          ll.incrementNonExWriteLocks();
-          break;
-        case TYPE_READ:
-          ll = localLocks.getLocalLock(lockKey);
-          if (!(ll.hasReadLock() || ll.hasNonExWriteLock() || ll.hasWriteLock()))
-          {
-            // We don't own a local read lock.  Get one.
-            while (true)
-            {
-              LockGate lo = crossLocks.getObject(lockKey);
-              synchronized (lo)
-              {
-                try
-                {
-                  lo.enterReadLockNoWait(threadID);
-                  break;
-                }
-                catch (ExpiredObjectException e)
-                {
-                  // Try again
-                }
-              }
-            }
-          }
-          ll.incrementReadLocks();
-          break;
-        }
-        locksProcessed++;
-      }
-      // Got all; we are done!
-      if (Logging.lock.isDebugEnabled())
-        Logging.lock.debug(" Successfully obtained multiple "+description+"s!");
-      return;
-    }
-    catch (Throwable ex)
-    {
-      // No matter what, undo the locks we've taken
-      ManifoldCFException ae = null;
-      int errno = 0;
-
-      while (--locksProcessed >= 0)
-      {
-        LockDescription ld = lds[locksProcessed];
-        int lockType = ld.getType();
-        String lockKey = ld.getKey();
-        try
-        {
-          switch (lockType)
-          {
-          case TYPE_READ:
-            leaveRead(lockKey,description,localLocks,crossLocks);
-            break;
-          case TYPE_WRITENONEX:
-            leaveNonExWrite(lockKey,description,localLocks,crossLocks);
-            break;
-          case TYPE_WRITE:
-            leaveWrite(lockKey,description,localLocks,crossLocks);
-            break;
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          ae = e;
-        }
-      }
-
-      if (ae != null)
-      {
-        throw ae;
-      }
-      if (ex instanceof ManifoldCFException)
-      {
-        throw (ManifoldCFException)ex;
-      }
-      if (ex instanceof LockException || ex instanceof LocalLockException)
-      {
-        Logging.lock.debug(" Couldn't get "+description+"; throwing LockException");
-        // It's either LockException or LocalLockException
-        throw new LockException(ex.getMessage());
-      }
-      if (ex instanceof InterruptedException)
-      {
-        throw new ManifoldCFException("Interrupted",ex,ManifoldCFException.INTERRUPTED);
-      }
-      if (!(ex instanceof Error))
-      {
-        throw new Error("Unexpected exception",ex);
-      }
-      throw (Error)ex;
-
-    }
-
-  }
-
-  protected static void leave(String[] readLocks, String[] writeNonExLocks, String[] writeLocks, String description, LocalLockPool localLocks, LockPool crossLocks)
-    throws ManifoldCFException
-  {
-    LockDescription[] lds = getSortedUniqueLocks(readLocks,writeNonExLocks,writeLocks);
-    // Free them all... one at a time is fine
-    ManifoldCFException ae = null;
-    int i = lds.length;
-    while (--i >= 0)
-    {
-      LockDescription ld = lds[i];
-      String lockKey = ld.getKey();
-      int lockType = ld.getType();
-      try
-      {
-        switch (lockType)
-        {
-        case TYPE_READ:
-          leaveRead(lockKey,description,localLocks,crossLocks);
-          break;
-        case TYPE_WRITENONEX:
-          leaveNonExWrite(lockKey,description,localLocks,crossLocks);
-          break;
-        case TYPE_WRITE:
-          leaveWrite(lockKey,description,localLocks,crossLocks);
-          break;
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        ae = e;
-      }
-    }
-
-    if (ae != null)
-    {
-      throw ae;
-    }
-  }
-
-  /** Process inbound locks into a sorted vector of most-restrictive unique locks
-  */
-  protected static LockDescription[] getSortedUniqueLocks(String[] readLocks, String[] writeNonExLocks,
-    String[] writeLocks)
-  {
-    // First build a unique hash of lock descriptions
-    Map<String,LockDescription> ht = new HashMap<String,LockDescription>();
-    int i;
-    if (readLocks != null)
-    {
-      i = 0;
-      while (i < readLocks.length)
-      {
-        String key = readLocks[i++];
-        LockDescription ld = ht.get(key);
-        if (ld == null)
-        {
-          ld = new LockDescription(TYPE_READ,key);
-          ht.put(key,ld);
-        }
-        else
-          ld.set(TYPE_READ);
-      }
-    }
-    if (writeNonExLocks != null)
-    {
-      i = 0;
-      while (i < writeNonExLocks.length)
-      {
-        String key = writeNonExLocks[i++];
-        LockDescription ld = ht.get(key);
-        if (ld == null)
-        {
-          ld = new LockDescription(TYPE_WRITENONEX,key);
-          ht.put(key,ld);
-        }
-        else
-          ld.set(TYPE_WRITENONEX);
-      }
-    }
-    if (writeLocks != null)
-    {
-      i = 0;
-      while (i < writeLocks.length)
-      {
-        String key = writeLocks[i++];
-        LockDescription ld = ht.get(key);
-        if (ld == null)
-        {
-          ld = new LockDescription(TYPE_WRITE,key);
-          ht.put(key,ld);
-        }
-        else
-          ld.set(TYPE_WRITE);
-      }
-    }
-
-    // Now, sort by key name
-    LockDescription[] rval = new LockDescription[ht.size()];
-    String[] sortarray = new String[ht.size()];
-    i = 0;
-    for (String key : ht.keySet())
-    {
-      sortarray[i++] = key;
-    }
-    java.util.Arrays.sort(sortarray);
-    i = 0;
-    for (String key : sortarray)
-    {
-      rval[i++] = ht.get(key);
-    }
-    return rval;
-  }
-
-  protected static class LockDescription
-  {
-    protected int lockType;
-    protected String lockKey;
-
-    public LockDescription(int lockType, String lockKey)
-    {
-      this.lockType = lockType;
-      this.lockKey = lockKey;
-    }
-
-    public void set(int lockType)
-    {
-      if (lockType > this.lockType)
-        this.lockType = lockType;
-    }
-
-    public int getType()
-    {
-      return lockType;
-    }
-
-    public String getKey()
-    {
-      return lockKey;
-    }
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ExpiredObjectException.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ExpiredObjectException.java
deleted file mode 100644
index c500310..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ExpiredObjectException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id: ExpiredObjectException.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-public class ExpiredObjectException extends java.lang.Exception
-{
-  public static final String _rcsid = "@(#)$Id: ExpiredObjectException.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /**
-  * Constructs an exception with the reason.
-  *
-  * @param reason the description of the exception
-  */
-  public ExpiredObjectException(String reason)
-  {
-    super(reason);
-  }
-
-};
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockManager.java
deleted file mode 100644
index f165218..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockManager.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-
-/** This is the file-based lock manager.
-*/
-public class FileLockManager extends BaseLockManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Synchronization directory property - local to this implementation of ILockManager */
-  public static final String synchDirectoryProperty = "org.apache.manifoldcf.synchdirectory";
-
-  // These are for file-based locks (which cross JVM boundaries)
-  protected final static Integer lockPoolInitialization = new Integer(0);
-  protected static LockPool myFileLocks = null;
-
-  // This is the directory used for cross-JVM synchronization, or null if off
-  protected File synchDirectory = null;
-
-  public FileLockManager(File synchDirectory)
-    throws ManifoldCFException
-  {
-    this.synchDirectory = synchDirectory;
-    if (synchDirectory == null)
-      throw new ManifoldCFException("Synch directory cannot be null");
-    if (!synchDirectory.isDirectory())
-      throw new ManifoldCFException("Synch directory must point to an existing, writeable directory!",ManifoldCFException.SETUP_ERROR);
-    synchronized(lockPoolInitialization)
-    {
-      if (myFileLocks == null)
-      {
-        myFileLocks = new LockPool(new FileLockObjectFactory(synchDirectory));
-      }
-    }
-  }
-  
-  public FileLockManager()
-    throws ManifoldCFException
-  {
-    this(getSynchDirectoryProperty());
-  }
-
-  /** Get the synch directory property. */
-  public static File getSynchDirectoryProperty()
-    throws ManifoldCFException
-  {
-    return ManifoldCF.getFileProperty(synchDirectoryProperty);
-  }
-  
-  /** Calculate the name of a flag resource.
-  *@param flagName is the name of the flag.
-  *@return the name for the flag resource.
-  */
-  protected static String getFlagResourceName(String flagName)
-  {
-    return "flag-"+flagName;
-  }
-    
-  /** Raise a flag.  Use this method to assert a condition, or send a global signal.  The flag will be reset when the
-  * entire system is restarted.
-  *@param flagName is the name of the flag to set.
-  */
-  @Override
-  public void setGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    String resourceName = getFlagResourceName(flagName);
-    String path = makeFilePath(resourceName);
-    (new File(path)).mkdirs();
-    File f = new File(path,ManifoldCF.safeFileName(resourceName));
-    try
-    {
-      f.createNewFile();
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Clear a flag.  Use this method to clear a condition, or retract a global signal.
-  *@param flagName is the name of the flag to clear.
-  */
-  @Override
-  public void clearGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    String resourceName = getFlagResourceName(flagName);
-    File f = new File(makeFilePath(resourceName),ManifoldCF.safeFileName(resourceName));
-    f.delete();
-  }
-  
-  /** Check the condition of a specified flag.
-  *@param flagName is the name of the flag to check.
-  *@return true if the flag is set, false otherwise.
-  */
-  @Override
-  public boolean checkGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    String resourceName = getFlagResourceName(flagName);
-    File f = new File(makeFilePath(resourceName),ManifoldCF.safeFileName(resourceName));
-    return f.exists();
-  }
-
-  /** Read data from a shared data resource.  Use this method to read any existing data, or get a null back if there is no such resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@return a byte array containing the data, or null.
-  */
-  @Override
-  public byte[] readData(String resourceName)
-    throws ManifoldCFException
-  {
-    File f = new File(makeFilePath(resourceName),ManifoldCF.safeFileName(resourceName));
-    try
-    {
-      InputStream is = new FileInputStream(f);
-      try
-      {
-        ByteArrayBuffer bab = new ByteArrayBuffer();
-        while (true)
-        {
-          int x = is.read();
-          if (x == -1)
-            break;
-          bab.add((byte)x);
-        }
-        return bab.toArray();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (FileNotFoundException e)
-    {
-      return null;
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Write data to a shared data resource.  Use this method to write a body of data into a shared resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@param data is the byte array containing the data.  Pass null if you want to delete the resource completely.
-  */
-  @Override
-  public void writeData(String resourceName, byte[] data)
-    throws ManifoldCFException
-  {
-    try
-    {
-      String path = makeFilePath(resourceName);
-      // Make sure the directory exists
-      (new File(path)).mkdirs();
-      File f = new File(path,ManifoldCF.safeFileName(resourceName));
-      if (data == null)
-      {
-        f.delete();
-        return;
-      }
-      FileOutputStream os = new FileOutputStream(f);
-      try
-      {
-        os.write(data,0,data.length);
-      }
-      finally
-      {
-        os.close();
-      }
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
-    }
-  }
-
-  /** Override this method to change the nature of global locks.
-  */
-  @Override
-  protected LockPool getGlobalLockPool()
-  {
-    return myFileLocks;
-  }
-
-  /** Create a file path given a key name.
-  *@param key is the key name.
-  *@return the file path.
-  */
-  protected String makeFilePath(String key)
-  {
-    int hashcode = key.hashCode();
-    int outerDirNumber = (hashcode & (1023));
-    int innerDirNumber = ((hashcode >> 10) & (1023));
-    String fullDir = synchDirectory.toString();
-    if (fullDir.length() == 0 || !fullDir.endsWith("/"))
-      fullDir = fullDir + "/";
-    fullDir = fullDir + Integer.toString(outerDirNumber)+"/"+Integer.toString(innerDirNumber);
-    return fullDir;
-  }
-
-  protected static final int BASE_SIZE = 128;
-  
-  protected static class ByteArrayBuffer
-  {
-    protected byte[] buffer;
-    protected int length;
-    
-    public ByteArrayBuffer()
-    {
-      buffer = new byte[BASE_SIZE];
-      length = 0;
-    }
-    
-    public void add(byte b)
-    {
-      if (length == buffer.length)
-      {
-        byte[] oldbuffer = buffer;
-        buffer = new byte[length * 2];
-        System.arraycopy(oldbuffer,0,buffer,0,length);
-      }
-      buffer[length++] = b;
-    }
-    
-    public byte[] toArray()
-    {
-      byte[] rval = new byte[length];
-      System.arraycopy(buffer,0,rval,0,length);
-      return rval;
-    }
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockObject.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockObject.java
deleted file mode 100644
index 9a02c33..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockObject.java
+++ /dev/null
@@ -1,482 +0,0 @@
-/* $Id: LockObject.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** One instance of this object exists for each lock on each JVM!
-* This is the file-system version of the lock.
-*/
-public class FileLockObject extends LockObject
-{
-  public static final String _rcsid = "@(#)$Id: LockObject.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final static int STATUS_WRITELOCKED = -1;
-
-  private File lockDirectoryName = null;
-  private File lockFileName = null;
-  private boolean isSync;                 // True if we need to be synchronizing across JVM's
-
-  private final static String DOTLOCK = ".lock";
-  private final static String DOTFILE = ".file";
-  private final static String SLASH = "/";
-
-
-  public FileLockObject(LockPool lockPool, Object lockKey, File synchDir)
-  {
-    super(lockPool,lockKey);
-    this.isSync = (synchDir != null);
-    if (isSync)
-    {
-      // Hash the filename
-      int hashcode = lockKey.hashCode();
-      int outerDirNumber = (hashcode & (1023));
-      int innerDirNumber = ((hashcode >> 10) & (1023));
-      String fullDir = synchDir.toString();
-      if (fullDir.length() == 0 || !fullDir.endsWith(SLASH))
-        fullDir = fullDir + SLASH;
-      fullDir = fullDir + Integer.toString(outerDirNumber)+SLASH+Integer.toString(innerDirNumber);
-      (new File(fullDir)).mkdirs();
-      String filename = createFileName(lockKey);
-
-      lockDirectoryName = new File(fullDir,filename+DOTLOCK);
-      lockFileName = new File(fullDir,filename+DOTFILE);
-    }
-  }
-
-  private static String createFileName(Object lockKey)
-  {
-    return "lock-"+ManifoldCF.safeFileName(lockKey.toString());
-  }
-
-  @Override
-  protected void obtainGlobalWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (isSync)
-    {
-      grabFileLock();
-      try
-      {
-        int status = readFile();
-        if (status != 0)
-        {
-          throw new LockException(LOCKEDANOTHERJVM);
-        }
-        writeFile(STATUS_WRITELOCKED);
-      }
-      finally
-      {
-        releaseFileLock();
-      }
-    }
-  }
-
-  @Override
-  protected void clearGlobalWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (isSync)
-    {
-      grabFileLock();
-      try
-      {
-        writeFile(0);
-      }
-      finally
-      {
-        releaseFileLock();
-      }
-    }
-  }
-
-  @Override
-  protected void obtainGlobalNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    // Attempt to obtain a global write lock
-    if (isSync)
-    {
-      grabFileLock();
-      try
-      {
-        int status = readFile();
-        if (status == STATUS_WRITELOCKED || status > 0)
-        {
-          throw new LockException(LOCKEDANOTHERJVM);
-        }
-        if (status == 0)
-          status = STATUS_WRITELOCKED;
-        status--;
-        writeFile(status);
-      }
-      finally
-      {
-        releaseFileLock();
-      }
-    }
-  }
-
-  @Override
-  protected void clearGlobalNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (isSync)
-    {
-      grabFileLock();
-      try
-      {
-        int status = readFile();
-        if (status >= STATUS_WRITELOCKED)
-          throw new RuntimeException("JVM error: File lock is not in expected state for object "+this.toString());
-        status++;
-        if (status == STATUS_WRITELOCKED)
-          status = 0;
-        writeFile(status);
-      }
-      finally
-      {
-        releaseFileLock();
-      }
-    }
-  }
-
-  @Override
-  protected void obtainGlobalReadLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    // Attempt to obtain a global read lock
-    if (isSync)
-    {
-      grabFileLock();
-      try
-      {
-        int status = readFile();
-        if (status <= STATUS_WRITELOCKED)
-        {
-          throw new LockException(LOCKEDANOTHERJVM);
-        }
-        status++;
-        writeFile(status);
-      }
-      finally
-      {
-        releaseFileLock();
-      }
-    }
-  }
-
-  @Override
-  protected void clearGlobalReadLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (isSync)
-    {
-      grabFileLock();
-      try
-      {
-        int status = readFile();
-        // System.out.println(" Read status = "+Integer.toString(status));
-        if (status == 0)
-          throw new RuntimeException("JVM error: File lock is not in expected state for object "+this.toString());
-        status--;
-        writeFile(status);
-        // System.out.println(" Wrote status = "+Integer.toString(status));
-      }
-      finally
-      {
-        releaseFileLock();
-      }
-    }
-  }
-
-  private final static String FILELOCKED = "File locked";
-
-  private synchronized void grabFileLock()
-    throws LockException, InterruptedException
-  {
-    while (true)
-    {
-      // Try to create the lock file
-      try
-      {
-        if (lockDirectoryName.createNewFile() == false)
-          throw new LockException(FILELOCKED);
-        break;
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new InterruptedException("Interrupted IO: "+e.getMessage());
-      }
-      catch (IOException e)
-      {
-        // Log this if possible
-        try
-        {
-          Logging.lock.warn("Attempt to set file lock '"+lockDirectoryName.toString()+"' failed: "+e.getMessage(),e);
-        }
-        catch (Throwable e2)
-        {
-          e.printStackTrace();
-        }
-        // Winnt sometimes throws an exception when you can't do the lock
-        ManifoldCF.sleep(100);
-        continue;
-      }
-    }
-  }
-
-  private synchronized void releaseFileLock()
-    throws InterruptedException
-  {
-    Throwable ie = null;
-    while (true)
-    {
-      try
-      {
-        if (lockDirectoryName.delete())
-          break;
-        try
-        {
-          Logging.lock.fatal("Failure deleting file lock '"+lockDirectoryName.toString()+"'");
-        }
-        catch (Throwable e2)
-        {
-          System.out.println("Failure deleting file lock '"+lockDirectoryName.toString()+"'");
-        }
-        // Fail hard
-        System.exit(-100);
-      }
-      catch (Error e)
-      {
-        // An error - must try again to delete
-        // Attempting to log this to the log may not work due to disk being full, but try anyway.
-        String message = "Error deleting file lock '"+lockDirectoryName.toString()+"': "+e.getMessage();
-        try
-        {
-          Logging.lock.error(message,e);
-        }
-        catch (Throwable e2)
-        {
-          // Ok, we failed, send it to standard out
-          System.out.println(message);
-          e.printStackTrace();
-        }
-        ie = e;
-        ManifoldCF.sleep(100);
-        continue;
-      }
-      catch (RuntimeException e)
-      {
-        // A runtime exception - try again to delete
-        // Attempting to log this to the log may not work due to disk being full, but try anyway.
-        String message = "Error deleting file lock '"+lockDirectoryName.toString()+"': "+e.getMessage();
-        try
-        {
-          Logging.lock.error(message,e);
-        }
-        catch (Throwable e2)
-        {
-          // Ok, we failed, send it to standard out
-          System.out.println(message);
-          e.printStackTrace();
-        }
-        ie = e;
-        ManifoldCF.sleep(100);
-        continue;
-      }
-    }
-
-    // Succeeded finally - but we need to rethrow any exceptions we got
-    if (ie != null)
-    {
-      if (ie instanceof InterruptedException)
-        throw (InterruptedException)ie;
-      if (ie instanceof Error)
-        throw (Error)ie;
-      if (ie instanceof RuntimeException)
-        throw (RuntimeException)ie;
-    }
-
-  }
-
-  private synchronized int readFile()
-    throws InterruptedException
-  {
-    try
-    {
-      InputStreamReader isr = new InputStreamReader(new FileInputStream(lockFileName), StandardCharsets.UTF_8);
-      try
-      {
-        BufferedReader x = new BufferedReader(isr);
-        try
-        {
-          StringBuilder sb = new StringBuilder();
-          while (true)
-          {
-            int rval = x.read();
-            if (rval == -1)
-              break;
-            sb.append((char)rval);
-          }
-          try
-          {
-            return Integer.parseInt(sb.toString());
-          }
-          catch (NumberFormatException e)
-          {
-            // We should never be in a situation where we can't parse a number we have supposedly written.
-            // But, print a stack trace and throw IOException, so we recover.
-            throw new IOException("Lock number read was not valid: "+e.getMessage());
-          }
-        }
-        finally
-        {
-          x.close();
-        }
-      }
-      catch (InterruptedIOException e)
-      {
-        throw new InterruptedException("Interrupted IO: "+e.getMessage());
-      }
-      catch (IOException e)
-      {
-        String message = "Could not read from lock file: '"+lockFileName.toString()+"'";
-        try
-        {
-          Logging.lock.error(message,e);
-        }
-        catch (Throwable e2)
-        {
-          System.out.println(message);
-          e.printStackTrace();
-        }
-        // Don't fail hard or there is no way to recover
-        throw e;
-      }
-      finally
-      {
-        isr.close();
-      }
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new InterruptedException("Interrupted IO: "+e.getMessage());
-    }
-    catch (IOException e)
-    {
-      return 0;
-    }
-
-  }
-
-  private synchronized void writeFile(int value)
-    throws InterruptedException
-  {
-    try
-    {
-      if (value == 0)
-      {
-        if (lockFileName.delete() == false)
-          throw new IOException("Could not delete file '"+lockFileName.toString()+"'");
-      }
-      else
-      {
-        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(lockFileName), StandardCharsets.UTF_8);
-        try
-        {
-          BufferedWriter x = new BufferedWriter(osw);
-          try
-          {
-            x.write(Integer.toString(value));
-          }
-          finally
-          {
-            x.close();
-          }
-        }
-        finally
-        {
-          osw.close();
-        }
-      }
-    }
-    catch (Error e)
-    {
-      // Couldn't write for some reason!  Write to BOTH stdout and the log, since we
-      // can't be sure we will succeed at the latter.
-      String message = "Couldn't write to lock file; hard error occurred.  Shutting down process; locks may be left dangling.  You must cleanup before restarting.";
-      try
-      {
-        Logging.lock.error(message,e);
-      }
-      catch (Throwable e2)
-      {
-        System.out.println(message);
-        e.printStackTrace();
-      }
-      System.exit(-100);
-    }
-    catch (RuntimeException e)
-    {
-      // Couldn't write for some reason!  Write to BOTH stdout and the log, since we
-      // can't be sure we will succeed at the latter.
-      String message = "Couldn't write to lock file; JVM error.  Shutting down process; locks may be left dangling.  You must cleanup before restarting.";
-      try
-      {
-        Logging.lock.error(message,e);
-      }
-      catch (Throwable e2)
-      {
-        System.out.println(message);
-        e.printStackTrace();
-      }
-      System.exit(-100);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new InterruptedException("Interrupted IO: "+e.getMessage());
-    }
-    catch (IOException e)
-    {
-      // Couldn't write for some reason!  Write to BOTH stdout and the log, since we
-      // can't be sure we will succeed at the latter.
-      String message = "Couldn't write to lock file; disk may be full.  Shutting down process; locks may be left dangling.  You must cleanup before restarting.";
-      try
-      {
-        Logging.lock.error(message,e);
-      }
-      catch (Throwable e2)
-      {
-        System.out.println(message);
-        e.printStackTrace();
-      }
-      System.exit(-100);
-      // Hard failure is called for
-      // throw new Error("Lock management system failure",e);
-    }
-  }
-
-
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockObjectFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockObjectFactory.java
deleted file mode 100644
index 879f07e..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/FileLockObjectFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-
-/** Base factory for file lock objects.
-*/
-public class FileLockObjectFactory extends LockObjectFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final File synchDir;
-  
-  public FileLockObjectFactory(File synchDir)
-  {
-    this.synchDir = synchDir;
-  }
-  
-  @Override
-  public LockObject newLockObject(LockPool lockPool, Object lockKey)
-  {
-    return new FileLockObject(lockPool, lockKey, synchDir);
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLock.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLock.java
deleted file mode 100644
index fe4ba65..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLock.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import java.util.*;
-import java.io.*;
-
-/** This class describes a local lock, which can have various nested levels
-* of depth.
-*/
-public class LocalLock
-{
-  private int readCount = 0;
-  private int writeCount = 0;
-  private int nonExWriteCount = 0;
-
-  public LocalLock()
-  {
-  }
-
-  public boolean hasWriteLock()
-  {
-    return (writeCount > 0);
-  }
-
-  public boolean hasReadLock()
-  {
-    return (readCount > 0);
-  }
-
-  public boolean hasNonExWriteLock()
-  {
-    return (nonExWriteCount > 0);
-  }
-
-  public void incrementReadLocks()
-  {
-    readCount++;
-  }
-
-  public void incrementNonExWriteLocks()
-  {
-    nonExWriteCount++;
-  }
-  
-  public void incrementWriteLocks()
-  {
-    writeCount++;
-  }
-
-  public void decrementReadLocks()
-  {
-    readCount--;
-  }
-  
-  public void decrementNonExWriteLocks()
-  {
-    nonExWriteCount--;
-  }
-
-  public void decrementWriteLocks()
-  {
-    writeCount--;
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLockException.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLockException.java
deleted file mode 100644
index 3b59841..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLockException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id: LocalLockException.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-public class LocalLockException extends java.lang.Exception
-{
-  public static final String _rcsid = "@(#)$Id: LocalLockException.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /**
-  * Constructs an exception with the reason.
-  *
-  * @param reason the description of the exception
-  */
-  public LocalLockException(String reason)
-  {
-    super(reason);
-  }
-
-};
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLockPool.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLockPool.java
deleted file mode 100644
index 3e8263d..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LocalLockPool.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import java.util.*;
-import java.io.*;
-
-/** Pool of local locks, designed to gate access within a single thread.
-* Since it is within a single thread, synchronization is not necessary.
-*/
-public class LocalLockPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final Map<String,LocalLock> localLocks = new HashMap<String,LocalLock>();
-  
-  public LocalLockPool()
-  {
-  }
-  
-  public LocalLock getLocalLock(String lockKey)
-  {
-    LocalLock ll = localLocks.get(lockKey);
-    if (ll == null)
-    {
-      ll = new LocalLock();
-      localLocks.put(lockKey,ll);
-    }
-    return ll;
-  }
-
-  public void releaseLocalLock(String lockKey)
-  {
-    localLocks.remove(lockKey);
-  }
-
-  public Set<String> keySet()
-  {
-    return localLocks.keySet();
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockGate.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockGate.java
deleted file mode 100644
index 8263f4b..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockGate.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import java.util.*;
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This class creates a first-come, first-serve local queue for locks.
-* The usage model is as follows:
-* (1) There is one lock gate per key for all threads.
-* (2) The LockGate replaces LockObjects in the pool, but each LockGate refers to
-*   a LockObject.  They are separate objects though because they require separate locking.
-* (3) When a lock is desired, the appropriate LockGate method is called to obtain
-*   the lock.  This method places the thread ID onto the queue, and waits until
-*   the thread ID reaches the head of the queue before executing the lock request.
-* (4) Only when the lock request is successful, or is aborted, is the thread ID
-*   removed from the queue.  Write requests therefore serve to block read requests
-*   until the write request is serviced.
-* Preferred structure:
-* <wait_for_permission>
-* try {
-* ... obtain the lock ...
-* } finally {
-*   <release_permission>
-* }
-* Seeing lockups.  These lockups are characterized by a thread waiting on a lock object
-* while another thread waits on permission to do something else with the lock object.
-* It is by no means clear at this point how this situation causes a hang-up; the 
-* lock object is waiting to be awakened, but there is no obvious entity holding the lock elsewhere.
-* But one thread (A) seems always to be in a multi-lock situation, waiting to obtain a lock, e.g.:
-	at java.lang.Object.wait(Native Method)
-	at java.lang.Object.wait(Object.java:503)
-	at org.apache.manifoldcf.core.lockmanager.LockObject.enterWriteLock(LockObject.java:80)
-	- locked <0x00000000fe205720> (a org.apache.manifoldcf.core.lockmanager.LockObject)
-	at org.apache.manifoldcf.core.lockmanager.LockGate.enterWriteLock(LockGate.java:132)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enter(BaseLockManager.java:1483)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enterCriticalSections(BaseLockManager.java:920)
-	at org.apache.manifoldcf.core.lockmanager.LockManager.enterCriticalSections(LockManager.java:455)
-* Here's the second thread (B), which is waitingForPermission:
-	at java.lang.Object.wait(Native Method)
-	- waiting on <0x00000000f8b71c78> (a org.apache.manifoldcf.core.lockmanager.LockGate)
-	at java.lang.Object.wait(Object.java:503)
-	at org.apache.manifoldcf.core.lockmanager.LockGate.waitForPermission(LockGate.java:91)
-	- locked <0x00000000f8b71c78> (a org.apache.manifoldcf.core.lockmanager.LockGate)
-	at org.apache.manifoldcf.core.lockmanager.LockGate.enterWriteLock(LockGate.java:129)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enterWrite(BaseLockManager.java:1130)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enterWriteCriticalSection(BaseLockManager.java:896)
-	at org.apache.manifoldcf.core.lockmanager.LockManager.enterWriteCriticalSection(LockManager.java:431)
-	at org.apache.manifoldcf.core.interfaces.IDFactory.make(IDFactory.java:55)
-* The problem is that (A) has already obtained permission, but cannot obtain the lock.  (B) is somehow blocking
-* (A) from obtaining the lock even though it has not yet taken its own lock!  Or, maybe it has, and we don't see it in
-* the stack trace.
-* Another example: (C)
-	at java.lang.Object.wait(Native Method)
-	- waiting on <0x00000000ffbdc038> (a org.apache.manifoldcf.core.lockmanager.LockGate)
-	at java.lang.Object.wait(Object.java:503)
-	at org.apache.manifoldcf.core.lockmanager.LockGate.waitForPermission(LockGate.java:91)
-	- locked <0x00000000ffbdc038> (a org.apache.manifoldcf.core.lockmanager.LockGate)
-	at org.apache.manifoldcf.core.lockmanager.LockGate.enterReadLock(LockGate.java:211)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enter(BaseLockManager.java:1532)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enterLocks(BaseLockManager.java:813)
-	at org.apache.manifoldcf.core.lockmanager.LockManager.enterLocks(LockManager.java:355)
-* and (D):
-	at java.lang.Object.wait(Native Method)
-	- waiting on <0x00000000ffbdd2f8> (a org.apache.manifoldcf.core.lockmanager.LockObject)
-	at java.lang.Object.wait(Object.java:503)
-	at org.apache.manifoldcf.core.lockmanager.LockObject.enterWriteLock(LockObject.java:83)
-	- locked <0x00000000ffbdd2f8> (a org.apache.manifoldcf.core.lockmanager.LockObject)
-	at org.apache.manifoldcf.core.lockmanager.LockGate.enterWriteLock(LockGate.java:132)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enter(BaseLockManager.java:1483)
-	at org.apache.manifoldcf.core.lockmanager.BaseLockManager.enterLocks(BaseLockManager.java:813)
-	at org.apache.manifoldcf.core.lockmanager.LockManager.enterLocks(LockManager.java:355)
-* Problem here: The LockGate 0x00000000ffbdc038 has no other instance anywhere, which should not be able to happen.
-* Debugging must entail dumping ALL outstanding locks periodically -- and who holds each.
-*/
-public class LockGate
-{
-  protected final List<Long> threadRequests = new ArrayList<Long>();
-  protected final LockObject lockObject;
-  protected final Object lockKey;
-  protected LockPool lockPool;
-
-  public LockGate(Object lockKey, LockObject lockObject, LockPool lockPool)
-  {
-    this.lockKey = lockKey;
-    this.lockObject = lockObject;
-    this.lockPool = lockPool;
-  }
-  
-  public void makeInvalid()
-  {
-    synchronized (this)
-    {
-      this.lockPool = null;
-      lockObject.makeInvalid();
-    }
-  }
-
-  protected void waitForPermission(Long threadID)
-    throws InterruptedException, ExpiredObjectException
-  {
-    synchronized (this)
-    {
-      threadRequests.add(threadID);
-    }
-    try
-    {
-      // Now, wait until we are #1
-      while (true)
-      {
-        synchronized (this)
-        {
-          if (lockPool == null)
-            throw new ExpiredObjectException("Invalid");
-
-          if (threadRequests.get(0).equals(threadID))
-            return;
-          
-          wait();
-        }
-      }
-    }
-    catch (InterruptedException e)
-    {
-      freePermission(threadID);
-      throw e;
-    }
-    catch (ExpiredObjectException e)
-    {
-      freePermission(threadID);
-      throw e;
-    }
-    catch (Error e)
-    {
-      freePermission(threadID);
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      freePermission(threadID);
-      throw e;
-    }
-  }
-  
-  protected void freePermission(Long threadID)
-  {
-    synchronized (this)
-    {
-      threadRequests.remove(threadID);
-      notifyAll();
-    }
-  }
-  
-  public void enterWriteLock(Long threadID)
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    waitForPermission(threadID);
-    try
-    {
-      lockObject.enterWriteLock();
-    }
-    finally
-    {
-      freePermission(threadID);
-    }
-  }
-  
-  public void enterWriteLockNoWait(Long threadID)
-    throws ManifoldCFException, LockException, LocalLockException, InterruptedException, ExpiredObjectException
-  {
-    waitForPermission(threadID);
-    try
-    {
-      lockObject.enterWriteLockNoWait();
-    }
-    finally
-    {
-      freePermission(threadID);
-    }
-  }
-  
-  public void leaveWriteLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    synchronized (this)
-    {
-      // Leave, and if we succeed, flush from pool.
-      if (lockObject.leaveWriteLock())
-      {
-        if (threadRequests.size() == 0 && lockPool != null)
-          lockPool.releaseObject(lockKey, this);
-      }
-    }
-  }
-  
-  public void enterNonExWriteLock(Long threadID)
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    waitForPermission(threadID);
-    try
-    {
-      lockObject.enterNonExWriteLock();
-    }
-    finally
-    {
-      freePermission(threadID);
-    }
-  }
-  
-  public void enterNonExWriteLockNoWait(Long threadID)
-    throws ManifoldCFException, LockException, LocalLockException, InterruptedException, ExpiredObjectException
-  {
-    waitForPermission(threadID);
-    try
-    {
-      lockObject.enterNonExWriteLockNoWait();
-    }
-    finally
-    {
-      freePermission(threadID);
-    }
-  }
-  
-  public void leaveNonExWriteLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    synchronized (this)
-    {
-      // Leave, and if we succeed, flush from pool.
-      if (lockObject.leaveNonExWriteLock())
-      {
-        if (threadRequests.size() == 0 && lockPool != null)
-          lockPool.releaseObject(lockKey, this);
-      }
-    }
-  }
-
-  public void enterReadLock(Long threadID)
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    waitForPermission(threadID);
-    try
-    {
-      lockObject.enterReadLock();
-    }
-    finally
-    {
-      freePermission(threadID);
-    }
-  }
-  
-  public void enterReadLockNoWait(Long threadID)
-    throws ManifoldCFException, LockException, LocalLockException, InterruptedException, ExpiredObjectException
-  {
-    waitForPermission(threadID);
-    try
-    {
-      lockObject.enterReadLockNoWait();
-    }
-    finally
-    {
-      freePermission(threadID);
-    }
-  }
-  
-  public void leaveReadLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    // Leave, and if we succeed (and the thread queue is empty), flush from pool.
-    synchronized (this)
-    {
-      if (lockObject.leaveReadLock())
-      {
-        if (threadRequests.size() == 0 && lockPool != null)
-          lockPool.releaseObject(lockKey, this);
-      }
-    }
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockManager.java
deleted file mode 100644
index 0ec7b7c..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockManager.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/* $Id: LockManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-
-/** The lock manager manages locks across all threads and JVMs and cluster members.  There should be no more than ONE
-* instance of this class per thread!!!  The factory should enforce this.
-*/
-public class LockManager implements ILockManager
-{
-  public static final String _rcsid = "@(#)$Id: LockManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Backing lock manager */
-  protected final ILockManager lockManager;
-
-  public LockManager()
-    throws ManifoldCFException
-  {
-    File synchDirectory = FileLockManager.getSynchDirectoryProperty();
-    if (synchDirectory != null)
-      lockManager = new FileLockManager(synchDirectory);
-    else
-      lockManager = new BaseLockManager();
-  }
-
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  @Override
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    return lockManager.registerServiceBeginServiceActivity(serviceType, serviceName, cleanup);
-  }
-  
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param initialData is the initial service data for this service.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  @Override
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    byte[] initialData, IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    return lockManager.registerServiceBeginServiceActivity(serviceType, serviceName, initialData, cleanup);
-  }
-
-  /** Set service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@param serviceData is the data to update to (may be null).
-  * This updates the service's transient data (or deletes it).  If the service is not active, an exception is thrown.
-  */
-  @Override
-  public void updateServiceData(String serviceType, String serviceName, byte[] serviceData)
-    throws ManifoldCFException
-  {
-    lockManager.updateServiceData(serviceType, serviceName, serviceData);
-  }
-
-  /** Retrieve service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@return the service's transient data.
-  */
-  @Override
-  public byte[] retrieveServiceData(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    return lockManager.retrieveServiceData(serviceType, serviceName);
-  }
-
-  /** Scan service data for a service type.  Only active service data will be considered.
-  *@param serviceType is the type of service.
-  *@param dataAcceptor is the object that will be notified of each item of data for each service name found.
-  */
-  @Override
-  public void scanServiceData(String serviceType, IServiceDataAcceptor dataAcceptor)
-    throws ManifoldCFException
-  {
-    lockManager.scanServiceData(serviceType, dataAcceptor);
-  }
-
-  /** Clean up any inactive services found.
-  * Calling this method will invoke cleanup of one inactive service at a time.
-  * If there are no inactive services around, then false will be returned.
-  * Note that this method will block whatever service it finds from starting up
-  * for the time the cleanup is proceeding.  At the end of the cleanup, if
-  * successful, the service will be atomically unregistered.
-  *@param serviceType is the service type.
-  *@param cleanup is the object to call to clean up an inactive service.
-  *@return true if there were no cleanup operations necessary.
-  */
-  @Override
-  public boolean cleanupInactiveService(String serviceType, IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    return lockManager.cleanupInactiveService(serviceType, cleanup);
-  }
-  
-  /** Count all active services of a given type.
-  *@param serviceType is the service type.
-  *@return the count.
-  */
-  @Override
-  public int countActiveServices(String serviceType)
-    throws ManifoldCFException
-  {
-    return lockManager.countActiveServices(serviceType);
-  }
-
-  /** End service activity.
-  * This operation exits the "active" zone for the service.  This must take place using the same ILockManager
-  * object that was used to registerServiceBeginServiceActivity() - which implies that it is the same thread.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to exit.
-  */
-  @Override
-  public void endServiceActivity(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    lockManager.endServiceActivity(serviceType, serviceName);
-  }
-    
-  /** Check whether a service is active or not.
-  * This operation returns true if the specified service is considered active at the moment.  Once a service
-  * is not active anymore, it can only return to activity by calling beginServiceActivity() once more.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to check on.
-  *@return true if the service is considered active.
-  */
-  @Override
-  public boolean checkServiceActive(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    return lockManager.checkServiceActive(serviceType, serviceName);
-  }
-
-  /** Get the current shared configuration.  This configuration is available in common among all nodes,
-  * and thus must not be accessed through here for the purpose of finding configuration data that is specific to any one
-  * specific node.
-  *@param configurationData is the globally-shared configuration information.
-  */
-  @Override
-  public ManifoldCFConfiguration getSharedConfiguration()
-    throws ManifoldCFException
-  {
-    return lockManager.getSharedConfiguration();
-  }
-
-  /** Raise a flag.  Use this method to assert a condition, or send a global signal.  The flag will be reset when the
-  * entire system is restarted.
-  *@param flagName is the name of the flag to set.
-  */
-  @Override
-  public void setGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    lockManager.setGlobalFlag(flagName);
-  }
-
-  /** Clear a flag.  Use this method to clear a condition, or retract a global signal.
-  *@param flagName is the name of the flag to clear.
-  */
-  @Override
-  public void clearGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    lockManager.clearGlobalFlag(flagName);
-  }
-  
-  /** Check the condition of a specified flag.
-  *@param flagName is the name of the flag to check.
-  *@return true if the flag is set, false otherwise.
-  */
-  @Override
-  public boolean checkGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    return lockManager.checkGlobalFlag(flagName);
-  }
-
-  /** Read data from a shared data resource.  Use this method to read any existing data, or get a null back if there is no such resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@return a byte array containing the data, or null.
-  */
-  @Override
-  public byte[] readData(String resourceName)
-    throws ManifoldCFException
-  {
-    return lockManager.readData(resourceName);
-  }
-  
-  /** Write data to a shared data resource.  Use this method to write a body of data into a shared resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@param data is the byte array containing the data.  Pass null if you want to delete the resource completely.
-  */
-  @Override
-  public void writeData(String resourceName, byte[] data)
-    throws ManifoldCFException
-  {
-    lockManager.writeData(resourceName,data);
-  }
-
-  /** Wait for a time before retrying a lock.
-  */
-  @Override
-  public void timedWait(int time)
-    throws ManifoldCFException
-  {
-    lockManager.timedWait(time);
-  }
-
-  /** Enter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers").
-  * This kind of lock is designed to be used in conjunction with read locks.  It is used typically in
-  * a situation where the read lock represents a query and the non-exclusive write lock represents a modification
-  * to an individual item that might affect the query, but where multiple modifications do not individually
-  * interfere with one another (use of another, standard, write lock per item can guarantee this).
-  */
-  @Override
-  public void enterNonExWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    lockManager.enterNonExWriteLock(lockKey);
-  }
-
-  @Override
-  public void enterNonExWriteLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException
-  {
-    lockManager.enterNonExWriteLockNoWait(lockKey);
-  }
-
-  /** Leave a non-exclusive write lock.
-  */
-  @Override
-  public void leaveNonExWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    lockManager.leaveNonExWriteLock(lockKey);
-  }
-
-  /** Enter a write locked area (i.e., block out both readers and other writers)
-  * NOTE: Can't enter until all readers have left.
-  */
-  @Override
-  public void enterWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    lockManager.enterWriteLock(lockKey);
-  }
-
-  @Override
-  public void enterWriteLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException
-  {
-    lockManager.enterWriteLockNoWait(lockKey);
-  }
-
-  @Override
-  public void leaveWriteLock(String lockKey)
-    throws ManifoldCFException
-  {
-    lockManager.leaveWriteLock(lockKey);
-  }
-
-  /** Enter a read-only locked area (i.e., block ONLY if there's a writer)
-  */
-  @Override
-  public void enterReadLock(String lockKey)
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(lockKey);
-  }
-
-  @Override
-  public void enterReadLockNoWait(String lockKey)
-    throws ManifoldCFException, LockException
-  {
-    lockManager.enterReadLockNoWait(lockKey);
-  }
-
-  @Override
-  public void leaveReadLock(String lockKey)
-    throws ManifoldCFException
-  {
-    lockManager.leaveReadLock(lockKey);
-  }
-
-  @Override
-  public void clearLocks()
-    throws ManifoldCFException
-  {
-    lockManager.clearLocks();
-  }
-
-  /** Enter multiple locks
-  */
-  @Override
-  public void enterLocks(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException
-  {
-    lockManager.enterLocks(readLocks, nonExWriteLocks, writeLocks);
-  }
-
-  @Override
-  public void enterLocksNoWait(String[] readLocks, String[] nonExWriteLocks, String[] writeLocks)
-    throws ManifoldCFException, LockException
-  {
-    lockManager.enterLocksNoWait(readLocks, nonExWriteLocks, writeLocks);
-  }
-
-  /** Leave multiple locks
-  */
-  @Override
-  public void leaveLocks(String[] readLocks, String[] writeNonExLocks, String[] writeLocks)
-    throws ManifoldCFException
-  {
-    lockManager.leaveLocks(readLocks, writeNonExLocks, writeLocks);
-  }
-
-  /** Enter a named, read critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public void enterReadCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    lockManager.enterReadCriticalSection(sectionKey);
-  }
-
-  /** Leave a named, read critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public void leaveReadCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    lockManager.leaveReadCriticalSection(sectionKey);
-  }
-
-  /** Enter a named, non-exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public void enterNonExWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    lockManager.enterNonExWriteCriticalSection(sectionKey);
-  }
-
-  /** Leave a named, non-exclusive write critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names do not collide with lock names; they have a distinct namespace.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public void leaveNonExWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    lockManager.leaveNonExWriteCriticalSection(sectionKey);
-  }
-
-  /** Enter a named, exclusive critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names should be distinct from all lock names.
-  *@param sectionKey is the name of the section to enter.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public void enterWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    lockManager.enterWriteCriticalSection(sectionKey);
-  }
-
-  /** Leave a named, exclusive critical section (NOT a lock).  Critical sections never cross JVM boundaries.
-  * Critical section names should be distinct from all lock names.
-  *@param sectionKey is the name of the section to leave.  Only one thread can be in any given named
-  * section at a time.
-  */
-  @Override
-  public void leaveWriteCriticalSection(String sectionKey)
-    throws ManifoldCFException
-  {
-    lockManager.leaveWriteCriticalSection(sectionKey);
-  }
-
-  /** Enter multiple critical sections simultaneously.
-  *@param readSectionKeys is an array of read section descriptors, or null if there are no read sections desired.
-  *@param nonExSectionKeys is an array of non-ex write section descriptors, or null if none desired.
-  *@param writeSectionKeys is an array of write section descriptors, or null if there are none desired.
-  */
-  @Override
-  public void enterCriticalSections(String[] readSectionKeys, String[] nonExSectionKeys, String[] writeSectionKeys)
-    throws ManifoldCFException
-  {
-    lockManager.enterCriticalSections(readSectionKeys, nonExSectionKeys, writeSectionKeys);
-  }
-
-  /** Leave multiple critical sections simultaneously.
-  *@param readSectionKeys is an array of read section descriptors, or null if there are no read sections desired.
-  *@param nonExSectionKeys is an array of non-ex write section descriptors, or null if none desired.
-  *@param writeSectionKeys is an array of write section descriptors, or null if there are none desired.
-  */
-  @Override
-  public void leaveCriticalSections(String[] readSectionKeys, String[] nonExSectionKeys, String[] writeSectionKeys)
-    throws ManifoldCFException
-  {
-    lockManager.leaveCriticalSections(readSectionKeys, nonExSectionKeys, writeSectionKeys);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockObject.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockObject.java
deleted file mode 100644
index c744c94..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockObject.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/* $Id: LockObject.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-
-/** Base class.  One instance of this object exists for each lock on each JVM!
-*/
-public class LockObject
-{
-  public static final String _rcsid = "@(#)$Id: LockObject.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final Object lockKey;
-
-  private LockPool lockPool;
-  private volatile boolean obtainedWrite = false;  // Set to true if this object already owns the permission to exclusively write
-  private volatile int obtainedRead = 0;           // Set to a count if this object already owns the permission to read
-  private volatile int obtainedNonExWrite = 0;     // Set to a count if this object already owns the permission to non-exclusively write
-
-  protected static final String LOCKEDANOTHERTHREAD = "Locked by another thread in this JVM";
-  protected static final String LOCKEDANOTHERJVM = "Locked by another JVM";
-
-
-  public LockObject(LockPool lockPool, Object lockKey)
-  {
-    this.lockPool = lockPool;
-    this.lockKey = lockKey;
-  }
-
-  public synchronized void makeInvalid()
-  {
-    this.lockPool = null;
-  }
-
-  /** This method WILL NOT BE CALLED UNLESS we are actually committing a write lock for the
-  * first time for a given thread.
-  */
-  public synchronized void enterWriteLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    while (true)
-    {
-      if (lockPool == null)
-        throw new ExpiredObjectException("Invalid");
-
-      try
-      {
-        // Does another thread in this JVM have the writelock?
-        if (obtainedWrite)
-          throw new LocalLockException(LOCKEDANOTHERTHREAD);
-        // Got the write token!
-        if (obtainedRead > 0 || obtainedNonExWrite > 0)
-          throw new LocalLockException(LOCKEDANOTHERTHREAD);
-        // Attempt to obtain a global write lock
-        obtainGlobalWriteLock();
-        obtainedWrite = true;
-        return;
-      }
-      catch (LocalLockException le)
-      {
-        wait();
-      }
-    }
-  }
-
-  /** Note well: Upgrading a read lock to a non-ex write lock is tricky.  The code inside the
-  * lock should execute only when there are NO threads that are executing in a read-locked area that
-  * aren't waiting to enter the non-ex write lock area!  This is therefore essentially an illegal codepath,
-  * because it will lead inevitably to deadlock, as is going from a read-locked area into a write-locked area,
-  * or from a non-ex write area into an
-  * exclusive write area.
-  */
-  public synchronized void enterWriteLockNoWait()
-    throws ManifoldCFException, LockException, LocalLockException, InterruptedException, ExpiredObjectException
-  {
-    if (lockPool == null)
-      throw new ExpiredObjectException("Invalid");
-
-    // Does another thread in this JVM have the writelock?
-    if (obtainedWrite)
-      throw new LocalLockException(LOCKEDANOTHERTHREAD);
-    // Got the write token!
-    if (obtainedRead > 0 || obtainedNonExWrite > 0)
-      throw new LocalLockException(LOCKEDANOTHERTHREAD);
-    // Attempt to obtain a global write lock
-    obtainGlobalWriteLockNoWait();
-    obtainedWrite = true;
-  }
-
-  protected void obtainGlobalWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-  }
-  
-  protected void obtainGlobalWriteLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        obtainGlobalWriteLockNoWait();
-        return;
-      }
-      catch (LockException e)
-      {
-        // Cross JVM lock; sleep!
-        ManifoldCF.sleep(10L);
-      }
-    }
-  }
-
-  public synchronized boolean leaveWriteLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    if (lockPool == null)
-      throw new ExpiredObjectException("Invalid");
-
-    if (obtainedWrite == false)
-      throw new RuntimeException("JVM failure: Don't hold lock for object "+this.toString());
-    
-    clearGlobalWriteLock();
-
-    obtainedWrite = false;
-    notifyAll();
-    return true;
-  }
-
-  protected void clearGlobalWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-  }
-  
-  protected void clearGlobalWriteLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        clearGlobalWriteLockNoWait();
-        return;
-      }
-      catch (LockException e)
-      {
-        ManifoldCF.sleep(10L);
-      }
-    }
-  }
-
-  public synchronized void enterNonExWriteLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    // System.out.println("Entering write lock for resource "+lockFileName);
-    while (true)
-    {
-      if (lockPool == null)
-        throw new ExpiredObjectException("Invalid");
-
-      try
-      {          
-        // Does another thread in this JVM have the lock?
-        if (obtainedWrite || obtainedRead > 0)
-          throw new LocalLockException(LOCKEDANOTHERTHREAD);
-        // We've got the local non-ex write token
-        if (obtainedNonExWrite > 0)
-        {
-          obtainedNonExWrite++;
-          return;
-        }
-        obtainGlobalNonExWriteLock();
-        obtainedNonExWrite++;
-        return;
-      }
-      catch (LocalLockException le)
-      {
-        wait();
-      }
-    }
-  }
-
-  /** Note well: Upgrading a read lock to a non-ex write lock is tricky.  The code inside the
-  * lock should execute only when there are NO threads that are executing in a read-locked area that
-  * aren't waiting to enter the non-ex write lock area!  This is therefore essentially an illegal codepath,
-  * because it will lead inevitably to deadlock, as is going from a read-locked area into a write-locked area,
-  * or from a non-ex write area into an
-  * exclusive write area.
-  */
-  public synchronized void enterNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, LocalLockException, InterruptedException, ExpiredObjectException
-  {
-    if (lockPool == null)
-      throw new ExpiredObjectException("Invalid");
-
-    // Does another thread in this JVM have the lock?
-    if (obtainedWrite || obtainedRead > 0)
-      throw new LocalLockException(LOCKEDANOTHERTHREAD);
-    // We've got the local non-ex write token
-    if (obtainedNonExWrite > 0)
-    {
-      obtainedNonExWrite++;
-      return;
-    }
-    obtainGlobalNonExWriteLockNoWait();
-    obtainedNonExWrite++;
-  }
-
-  protected void obtainGlobalNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-  }
-  
-  protected void obtainGlobalNonExWriteLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        obtainGlobalNonExWriteLockNoWait();
-        return;
-      }
-      catch (LockException e)
-      {
-        // Cross JVM lock; sleep!
-        ManifoldCF.sleep(10L);
-      }
-    }
-  }
-
-  public synchronized boolean leaveNonExWriteLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    if (lockPool == null)
-      throw new ExpiredObjectException("Invalid");
-
-    if (obtainedNonExWrite == 0)
-      throw new RuntimeException("JVM error: Don't hold lock for object "+this.toString());
-    if (obtainedNonExWrite > 1)
-    {
-      obtainedNonExWrite--;
-      return false;
-    }
-
-    clearGlobalNonExWriteLock();
-
-    obtainedNonExWrite--;
-    notifyAll();
-    return true;
-  }
-
-  protected void clearGlobalNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-  }
-  
-  protected void clearGlobalNonExWriteLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        clearGlobalNonExWriteLockNoWait();
-        return;
-      }
-      catch (LockException e)
-      {
-        ManifoldCF.sleep(10L);
-      }
-    }
-  }
-
-  public synchronized void enterReadLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    while (true)
-    {
-      if (lockPool == null)
-        throw new ExpiredObjectException("Invalid");
-      try
-      {
-        if (obtainedWrite || obtainedNonExWrite > 0)
-          throw new LocalLockException(LOCKEDANOTHERTHREAD);
-        if (obtainedRead > 0)
-        {
-          obtainedRead++;
-          return;
-        }
-        // Got the read token locally!
-        obtainGlobalReadLock();
-        obtainedRead = 1;
-        return;
-      }
-      catch (LocalLockException le)
-      {
-        wait();
-      }
-    }
-  }
-
-  public synchronized void enterReadLockNoWait()
-    throws ManifoldCFException, LockException, LocalLockException, InterruptedException, ExpiredObjectException
-  {
-    if (lockPool == null)
-      throw new ExpiredObjectException("Invalid");
-
-    if (obtainedWrite || obtainedNonExWrite > 0)
-      throw new LocalLockException(LOCKEDANOTHERTHREAD);
-    if (obtainedRead > 0)
-    {
-      obtainedRead++;
-      return;
-    }
-    // Got the read token locally!
-    obtainGlobalReadLockNoWait();
-    obtainedRead = 1;
-  }
-
-  protected void obtainGlobalReadLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-  }
-  
-  protected void obtainGlobalReadLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        obtainGlobalReadLockNoWait();
-        return;
-      }
-      catch (LockException e)
-      {
-        // Cross JVM lock; sleep!
-        ManifoldCF.sleep(10L);
-      }
-    }
-  }
-  
-  public synchronized boolean leaveReadLock()
-    throws ManifoldCFException, InterruptedException, ExpiredObjectException
-  {
-    if (lockPool == null)
-      throw new ExpiredObjectException("Invalid");
-
-    if (obtainedRead == 0)
-      throw new RuntimeException("JVM error: Don't hold lock for object "+this.toString());
-    if (obtainedRead > 1)
-    {
-      obtainedRead--;
-      return false;
-    }
-    
-    clearGlobalReadLock();
-
-    obtainedRead--;
-    notifyAll();
-    return true;
-  }
-
-  protected void clearGlobalReadLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-  }
-  
-  protected void clearGlobalReadLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        clearGlobalReadLockNoWait();
-        return;
-      }
-      catch (LockException e)
-      {
-        ManifoldCF.sleep(10L);
-      }
-    }
-  }
-  
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockObjectFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockObjectFactory.java
deleted file mode 100644
index 9df5686..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockObjectFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-
-/** Base factory for lock objects.  This will be extended to
-* support different kinds of lock objects.
-*/
-public class LockObjectFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  public LockObjectFactory()
-  {
-  }
-  
-  public LockObject newLockObject(LockPool lockPool, Object lockKey)
-  {
-    return new LockObject(lockPool, lockKey);
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockPool.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockPool.java
deleted file mode 100644
index d92dc8c..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/LockPool.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id: LockPool.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import java.util.*;
-import java.io.*;
-
-/** Lock pool class. This is a pool of LockGate objects.
-*/
-public class LockPool
-{
-  public static final String _rcsid = "@(#)$Id: LockPool.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final Map<Object,LockGate> myLocks = new HashMap<Object,LockGate>();
-
-  protected final LockObjectFactory factory;
-  
-  public LockPool(LockObjectFactory factory)
-  {
-    this.factory = factory;
-  }
-  
-  public synchronized LockGate getObject(Object lockKey)
-  {
-    LockGate lg = myLocks.get(lockKey);
-    if (lg == null)
-    {
-      LockObject lo = factory.newLockObject(this,lockKey);
-      lg = new LockGate(lockKey,lo,this);
-      myLocks.put(lockKey,lg);
-    }
-    return lg;
-  }
-
-  public synchronized void releaseObject(Object lockKey, LockGate lockGate)
-  {
-    lockGate.makeInvalid();
-    myLocks.remove(lockKey);
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperConnection.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperConnection.java
deleted file mode 100644
index 18ee467..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperConnection.java
+++ /dev/null
@@ -1,1183 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import org.apache.zookeeper.*;
-import org.apache.zookeeper.data.ACL;
-import org.apache.zookeeper.data.Stat;
-
-import java.util.*;
-import java.io.*;
-
-/** An instance of this class is the Zookeeper analog to a database connection.
-* Basically, it bundles up the Zookeeper functionality we need in a nice package,
-* which we can share between users as needed.  These connections will be pooled,
-* and will be closed when the process they live in is shut down.
-*/
-public class ZooKeeperConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private static final String READ_PREFIX = "read-";
-  private static final String NONEXWRITE_PREFIX = "nonexwrite-";
-  private static final String WRITE_PREFIX = "write-";
-
-  private static final String CHILD_PREFIX = "child-";
-  
-  protected final String connectString;
-  protected final int sessionTimeout;
-  
-  // Our zookeeper client
-  protected ZooKeeper zookeeper = null;
-  protected ZooKeeperWatcher zookeeperWatcher = null;
-
-  // Transient state
-  protected String lockNode = null;
-  protected String nodePath = null;
-  protected byte[] nodeData = null;
-
-  /** Constructor. */
-  public ZooKeeperConnection(String connectString, int sessionTimeout)
-    throws ManifoldCFException, InterruptedException
-  {
-    this.connectString = connectString;
-    this.sessionTimeout = sessionTimeout;
-    zookeeperWatcher = new ZooKeeperWatcher();
-    createSession();
-  }
-  
-  protected void createSession()
-    throws ManifoldCFException, InterruptedException
-  {
-    try
-    {
-      zookeeper = new ZooKeeper(connectString, sessionTimeout, zookeeperWatcher);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new InterruptedException(e.getMessage());
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("Zookeeper initialization error: "+e.getMessage(),e);
-    }
-  }
-
-  /** Create a transient node.
-  */
-  public void createNode(String nodePath, byte[] nodeData)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (this.nodePath != null)
-      throw new IllegalStateException("Ephemeral node '"+this.nodePath+"' already open; can't open '"+nodePath+"'.");
-
-    while (true)
-    {
-      try
-      {
-        if (this.nodePath == null)
-        {
-          zookeeper.create(nodePath, nodeData, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
-          // Keep a record of the ephemeral node
-          this.nodePath = nodePath;
-          this.nodeData = nodeData;
-        }
-        break;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,false);
-      }
-    }
-  }
-  
-  /** Check whether a node exists.
-  *@param nodePath is the path of the node.
-  *@return the data, if the node if exists, otherwise null.
-  */
-  public boolean checkNodeExists(String nodePath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        return (zookeeper.exists(nodePath,false) != null);
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-
-  /** Get node data.
-  *@param nodePath is the path of the node.
-  *@return the data, if the node if exists, otherwise null.
-  */
-  public byte[] getNodeData(String nodePath)
-    throws ManifoldCFException, InterruptedException
-  {
-    return readData(nodePath);
-  }
-  
-  /** Set node data.
-  */
-  public void setNodeData(byte[] data)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (nodePath == null)
-      throw new IllegalStateException("Can't set data for a node path we did not create: '"+nodePath+"'");
-    writeData(nodePath, data);
-    this.nodeData = data;
-  }
-  
-  /** Delete a node.
-  */
-  public void deleteNode()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (nodePath == null)
-      throw new IllegalStateException("Can't delete ephemeral node that isn't registered: '"+nodePath+"'");
-    while (true)
-    {
-      try
-      {
-        if (nodePath != null)
-        {
-          zookeeper.delete(nodePath,-1);
-          nodePath = null;
-          nodeData = null;
-        }
-        return;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,false);
-      }
-    }
-  }
-  
-  /** Delete all a node's children.
-  */
-  public void deleteNodeChildren(String nodePath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        List<String> children = zookeeper.getChildren(nodePath,false);
-        for (String child : children)
-        {
-          zookeeper.delete(nodePath + "/" + child,-1);
-        }
-        break;
-      }
-      catch (KeeperException.NoNodeException e)
-      {
-        break;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Get the relative paths of all node's children.  If the node does not exist,
-  * return an empty list.
-  */
-  public List<String> getChildren(String nodePath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        //System.out.println("Children of '"+nodePath+"':");
-        List<String> children = zookeeper.getChildren(nodePath,false);
-        List<String> rval = new ArrayList<String>();
-        for (String child : children)
-        {
-          //System.out.println(" '"+child+"'");
-          if (child.startsWith(CHILD_PREFIX))
-            rval.add(child.substring(CHILD_PREFIX.length()));
-        }
-        return rval;
-      }
-      catch (KeeperException.NoNodeException e)
-      {
-        return new ArrayList<String>();
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Create a persistent child of a node.
-  */
-  public void createChild(String nodePath, String childName)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        //System.out.println("Creating child '"+childName+"' of nodepath '"+nodePath+"'");
-        createPersistentPath(nodePath + "/" + CHILD_PREFIX + childName, null);
-        break;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-
-  protected void createPersistentPath(String path, byte[] data)
-    throws KeeperException, InterruptedException
-  {
-    // Loop until we've created the entire path, but initially try the whole thing for performance
-    while (true)
-    {
-      try
-      {
-        zookeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-        // Break on success
-        break;
-      }
-      catch (KeeperException.NoNodeException e)
-      {
-        // Strip off last part of path, and try recursively
-        int lastIndex = path.lastIndexOf("/");
-        // No last path: rethrow because we don't have a clue what is going on
-        if (lastIndex == -1 || lastIndex == 0)
-          throw e;
-        createPersistentPath(path.substring(0,lastIndex),null);
-        // Retry
-      }
-      catch (KeeperException.NodeExistsException e)
-      {
-        // Path is there: someone else beat us to it
-        // But we do have to set the data.
-        // NOTE: This code relies on the fact that only leaf persistent nodes have data.
-        if (data != null)
-        {
-          try
-          {
-            zookeeper.setData(path, data, -1);
-          }
-          catch (KeeperException.NoNodeException e2)
-          {
-            // Repeat, since we've lost our node
-            continue;
-          }
-        }
-        break;
-      }
-    }
-  }
-  
-  /** Delete the child of a node.
-  */
-  public void deleteChild(String nodePath, String childName)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        //System.out.println("Deleting child '"+childName+"' of nodePath '"+nodePath+"'");
-        zookeeper.delete(nodePath + "/" + CHILD_PREFIX + childName, -1);
-        //System.out.println("...done");
-        break;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Obtain a write lock, with no wait.
-  *@param lockPath is the lock node path.
-  *@return true if the lock was obtained, false otherwise.
-  */
-  public boolean obtainWriteLockNoWait(String lockPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Already have a lock in place: '"+lockNode+"'; can't also write lock '"+lockPath+"'");
-
-    while (true)
-    {
-      try
-      {
-        // Assert that we want a write lock
-        if (lockNode == null)
-          lockNode = createSequentialChild(lockPath,WRITE_PREFIX);
-        String lockSequenceNumber = lockNode.substring(lockPath.length() + 1 + WRITE_PREFIX.length());
-        // See if we got it
-        List<String> children = zookeeper.getChildren(lockPath,false);
-        for (String x : children)
-        {
-          String otherLock;
-          if (x.startsWith(WRITE_PREFIX))
-            otherLock = x.substring(WRITE_PREFIX.length());
-          else if (x.startsWith(NONEXWRITE_PREFIX))
-            otherLock = x.substring(NONEXWRITE_PREFIX.length());
-          else if (x.startsWith(READ_PREFIX))
-            otherLock = x.substring(READ_PREFIX.length());
-          else
-            continue;
-          if (otherLock.compareTo(lockSequenceNumber) < 0)
-          {
-            // We didn't get the lock.  Clean up and exit
-            releaseLock();
-            return false;
-          }
-        }
-        // We got it!
-        return true;
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Obtain a write lock, with wait.
-  *@param lockPath is the lock node path.
-  */
-  public void obtainWriteLock(String lockPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Already have a lock in place: '"+lockNode+"'; can't also write lock '"+lockPath+"'");
-
-    while (true)
-    {
-      try
-      {
-        // Assert that we want a write lock
-        if (lockNode == null)
-          lockNode = createSequentialChild(lockPath,WRITE_PREFIX);
-        long lockSequenceNumber = new Long(lockNode.substring(lockPath.length() + 1 + WRITE_PREFIX.length())).longValue();
-        //System.out.println("Trying to get write lock for '"+lockSequenceNumber+"'");
-        while (true)
-        {
-          //System.out.println("Assessing whether we got lock for '"+lockNode+"'...");
-          // See if we got it
-          List<String> children = zookeeper.getChildren(lockPath,false);
-          String previousLock = null;
-          boolean gotLock = true;
-          long highestPreviousLockIndex = -1L;
-          for (String x : children)
-          {
-            String otherLock;
-            if (x.startsWith(WRITE_PREFIX))
-              otherLock = x.substring(WRITE_PREFIX.length());
-            else if (x.startsWith(NONEXWRITE_PREFIX))
-              otherLock = x.substring(NONEXWRITE_PREFIX.length());
-            else if (x.startsWith(READ_PREFIX))
-              otherLock = x.substring(READ_PREFIX.length());
-            else
-              continue;
-            long otherLockSequenceNumber = new Long(otherLock).longValue();
-            //System.out.println("Saw other child sequence number "+otherLockSequenceNumber);
-            if (otherLockSequenceNumber < lockSequenceNumber)
-            {
-              // We didn't get the lock.  But keep going because we're looking for the node right before the
-              // one we just asserted.
-              gotLock = false;
-              if (otherLockSequenceNumber > highestPreviousLockIndex)
-              {
-                previousLock = x;
-                highestPreviousLockIndex = otherLockSequenceNumber;
-              }
-            }
-          }
-
-          if (gotLock)
-          {
-            // We got it!
-            //System.out.println("Got write lock for '"+lockSequenceNumber+"'");
-            return;
-          }
-
-          // There SHOULD be a previous node immediately prior to the one we asserted.  If we didn't find one, go back around;
-          // the previous lock was probably created and destroyed before we managed to get the children.
-          if (previousLock != null)
-          {
-            //System.out.println(" Waiting on '"+previousLock+"' for write lock '"+lockSequenceNumber+"'");
-            // Create an exists() watch on the previous node, and wait until we are awakened by that watch firing.
-            ExistsWatcher w = new ExistsWatcher();
-            Stat s = zookeeper.exists(lockPath+"/"+previousLock, w);
-            if (s != null)
-              w.waitForEvent();
-          }
-          //else
-          //  System.out.println(" Retrying for write lock '"+lockSequenceNumber+"'");
-        }
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-
-  /** Obtain a non-ex-write lock, with no wait.
-  *@param lockPath is the lock node path.
-  *@return true if the lock was obtained, false otherwise.
-  */
-  public boolean obtainNonExWriteLockNoWait(String lockPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Already have a lock in place: '"+lockNode+"'; can't also non-ex write lock '"+lockPath+"'");
-
-    while (true)
-    {
-      try
-      {
-        // Assert that we want a read lock
-        if (lockNode == null)
-          lockNode = createSequentialChild(lockPath,NONEXWRITE_PREFIX);
-        String lockSequenceNumber = lockNode.substring(lockPath.length() + 1 + NONEXWRITE_PREFIX.length());
-        // See if we got it
-        List<String> children = null;
-        while (true)
-        {
-          try
-          {
-            children = zookeeper.getChildren(lockPath,false);
-            break;
-          }
-          catch (KeeperException.NoNodeException e)
-          {
-            // New session; back around again.
-            break;
-          }
-          catch (KeeperException e)
-          {
-            handleKeeperException(e,true);
-          }
-        }
-        if (children == null)
-        {
-          // Reassert ephemeral node b/c we had a session restart
-          continue;
-        }
-        for (String x : children)
-        {
-          String otherLock;
-          if (x.startsWith(WRITE_PREFIX))
-            otherLock = x.substring(WRITE_PREFIX.length());
-          else if (x.startsWith(READ_PREFIX))
-            otherLock = x.substring(READ_PREFIX.length());
-          else
-            continue;
-          if (otherLock.compareTo(lockSequenceNumber) < 0)
-          {
-            // We didn't get the lock.  Clean up and exit
-            releaseLock();
-            return false;
-          }
-        }
-        // We got it!
-        return true;
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-
-  /** Obtain a non-ex-write lock, with wait.
-  *@param lockPath is the lock node path.
-  */
-  public void obtainNonExWriteLock(String lockPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Already have a lock in place: '"+lockNode+"'; can't also non-ex write lock '"+lockPath+"'");
-
-    while (true)
-    {
-      try
-      {
-        // Assert that we want a read lock
-        if (lockNode == null)
-          lockNode = createSequentialChild(lockPath,NONEXWRITE_PREFIX);
-        long lockSequenceNumber = new Long(lockNode.substring(lockPath.length() + 1 + NONEXWRITE_PREFIX.length())).longValue();
-        while (true)
-        {
-          // See if we got it
-          List<String> children = null;
-          while (true)
-          {
-            try
-            {
-              children = zookeeper.getChildren(lockPath,false);
-              break;
-            }
-            catch (KeeperException.NoNodeException e)
-            {
-              break;
-            }
-            catch (KeeperException e)
-            {
-              handleKeeperException(e,true);
-            }
-          }
-
-          if (children == null)
-            break;
-
-          String previousLock = null;
-          boolean gotLock = true;
-          long highestPreviousLockIndex = -1L;
-          for (String x : children)
-          {
-            String otherLock;
-            if (x.startsWith(WRITE_PREFIX))
-              otherLock = x.substring(WRITE_PREFIX.length());
-            else if (x.startsWith(READ_PREFIX))
-              otherLock = x.substring(READ_PREFIX.length());
-            else
-              continue;
-            long otherLockSequenceNumber = new Long(otherLock).longValue();
-            //System.out.println("Saw other child sequence number "+otherLockSequenceNumber);
-            if (otherLockSequenceNumber < lockSequenceNumber)
-            {
-              // We didn't get the lock.  But keep going because we're looking for the node right before the
-              // one we just asserted.
-              gotLock = false;
-              if (otherLockSequenceNumber > highestPreviousLockIndex)
-              {
-                previousLock = x;
-                highestPreviousLockIndex = otherLockSequenceNumber;
-              }
-            }
-          }
-            
-          if (gotLock)
-          {
-            // We got it!
-            return;
-          }
-
-          // There SHOULD be a previous node immediately prior to the one we asserted.  If we didn't find one, go back around;
-          // the previous lock was probably created and destroyed before we managed to get the children.
-          if (previousLock != null)
-          {
-            // Create an exists() watch on the previous node, and wait until we are awakened by that watch firing.
-            ExistsWatcher w = new ExistsWatcher();
-            Stat s = zookeeper.exists(lockPath+"/"+previousLock, w);
-            if (s != null)
-              w.waitForEvent();
-          }
-        }
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-
-  /** Obtain a read lock, with no wait.
-  *@param lockPath is the lock node path.
-  *@return true if the lock was obtained, false otherwise.
-  */
-  public boolean obtainReadLockNoWait(String lockPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Already have a lock in place: '"+lockNode+"'; can't also read lock '"+lockPath+"'");
-
-    while (true)
-    {
-      try
-      {
-        // Assert that we want a read lock
-        if (lockNode == null)
-          lockNode = createSequentialChild(lockPath,READ_PREFIX);
-        String lockSequenceNumber = lockNode.substring(lockPath.length() + 1 + READ_PREFIX.length());
-        // See if we got it
-        List<String> children = null;
-        while (true)
-        {
-          try
-          {
-            children = zookeeper.getChildren(lockPath,false);
-            break;
-          }
-          catch (KeeperException.NoNodeException e)
-          {
-            break;
-          }
-          catch (KeeperException e)
-          {
-            handleKeeperException(e,true);
-          }
-        }
-        if (children == null)
-          continue;
-        for (String x : children)
-        {
-          String otherLock;
-          if (x.startsWith(WRITE_PREFIX))
-            otherLock = x.substring(WRITE_PREFIX.length());
-          else if (x.startsWith(NONEXWRITE_PREFIX))
-            otherLock = x.substring(NONEXWRITE_PREFIX.length());
-          else
-            continue;
-          if (otherLock.compareTo(lockSequenceNumber) < 0)
-          {
-            // We didn't get the lock.  Clean up and exit
-            releaseLock();
-            return false;
-          }
-        }
-        // We got it!
-        return true;
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Obtain a read lock, with wait.
-  *@param lockPath is the lock node path.
-  */
-  public void obtainReadLock(String lockPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Already have a lock in place: '"+lockNode+"'; can't also read lock '"+lockPath+"'");
-
-    while (true)
-    {
-      try
-      {
-        // Assert that we want a read lock
-        if (lockNode == null)
-          lockNode = createSequentialChild(lockPath,READ_PREFIX);
-        long lockSequenceNumber = new Long(lockNode.substring(lockPath.length() + 1 + READ_PREFIX.length())).longValue();
-        //System.out.println("Trying to get read lock for '"+lockSequenceNumber+"'");
-        while (true)
-        {
-          // See if we got it
-          List<String> children = null;
-          while (true)
-          {
-            try
-            {
-              children = zookeeper.getChildren(lockPath,false);
-              break;
-            }
-            catch (KeeperException.NoNodeException e)
-            {
-              break;
-            }
-            catch (KeeperException e)
-            {
-              handleKeeperException(e,true);
-            }
-          }
-
-          // Handle new session
-          if (children == null)
-            break;
-            
-          String previousLock = null;
-          boolean gotLock = true;
-          long highestPreviousLockIndex = -1L;
-          for (String x : children)
-          {
-            String otherLock;
-            if (x.startsWith(WRITE_PREFIX))
-              otherLock = x.substring(WRITE_PREFIX.length());
-            else if (x.startsWith(NONEXWRITE_PREFIX))
-              otherLock = x.substring(NONEXWRITE_PREFIX.length());
-            else
-              continue;
-            long otherLockSequenceNumber = new Long(otherLock).longValue();
-            //System.out.println("Saw other child sequence number "+otherLockSequenceNumber);
-            if (otherLockSequenceNumber < lockSequenceNumber)
-            {
-              // We didn't get the lock.  But keep going because we're looking for the node right before the
-              // one we just asserted.
-              gotLock = false;
-              if (otherLockSequenceNumber > highestPreviousLockIndex)
-              {
-                previousLock = x;
-                highestPreviousLockIndex = otherLockSequenceNumber;
-              }
-            }
-          }
-            
-          if (gotLock)
-          {
-            // We got it!
-            //System.out.println("Got read lock for '"+lockSequenceNumber+"'");
-            return;
-          }
-
-          // There SHOULD be a previous node immediately prior to the one we asserted.  If we didn't find one, go back around;
-          // the previous lock was probably created and destroyed before we managed to get the children.
-          if (previousLock != null)
-          {
-            //System.out.println(" Waiting on '"+previousLock+"' for read lock '"+lockSequenceNumber+"'");
-            // Create an exists() watch on the previous node, and wait until we are awakened by that watch firing.
-            ExistsWatcher w = new ExistsWatcher();
-            Stat s = zookeeper.exists(lockPath+"/"+previousLock, w);
-            if (s != null)
-              w.waitForEvent();
-          }
-          //else
-          //  System.out.println(" Retrying for read lock '"+lockSequenceNumber+"'");
-
-        }
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Release the (saved) lock.
-  */
-  public void releaseLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (lockNode == null)
-      throw new IllegalStateException("Can't release lock we don't hold");
-    //System.out.println("Releasing lock '"+lockNode+"'");
-    
-    while (true)
-    {
-      if (lockNode == null)
-        break;
-      try
-      {
-        zookeeper.delete(lockNode,-1);
-        lockNode = null;
-        break;
-      }
-      catch (InterruptedException e)
-      {
-        lockNode = null;
-        throw e;
-      }
-      catch (KeeperException e)
-      {
-        handleEphemeralNodeKeeperException(e,true);
-      }
-    }
-  }
-
-  public byte[] readData(String resourcePath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        return zookeeper.getData(resourcePath,false,null);
-      }
-      catch (KeeperException.NoNodeException e)
-      {
-        return null;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-  
-  public void writeData(String resourcePath, byte[] data)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        if (data == null)
-        {
-          try
-          {
-            zookeeper.delete(resourcePath, -1);
-          }
-          catch (KeeperException.NoNodeException e)
-          {
-          }
-          break;
-        }
-        else
-        {
-          try
-          {
-            zookeeper.setData(resourcePath, data, -1);
-          }
-          catch (KeeperException.NoNodeException e)
-          {
-            createPersistentPath(resourcePath, data);
-          }
-          break;
-        }
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-
-  public void setGlobalFlag(String flagPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        createPersistentPath(flagPath, null);
-        break;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-
-  public void clearGlobalFlag(String flagPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        try
-        {
-          zookeeper.delete(flagPath,-1);
-        }
-        catch (KeeperException.NoNodeException e)
-        {
-        }
-        break;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-  
-  public boolean checkGlobalFlag(String flagPath)
-    throws ManifoldCFException, InterruptedException
-  {
-    while (true)
-    {
-      try
-      {
-        Stat s = zookeeper.exists(flagPath,false);
-        return s != null;
-      }
-      catch (KeeperException e)
-      {
-        handleKeeperException(e,true);
-      }
-    }
-  }
-  
-  /** Close this connection. */
-  public void close()
-    throws InterruptedException
-  {
-    if (lockNode != null)
-      throw new IllegalStateException("Should not be closing handles that have open locks!  Locknode: '"+lockNode+"'");
-    zookeeper.close();
-    zookeeper = null;
-    zookeeperWatcher = null;
-  }
-  
-  /** Handle keeper exceptions that may involve ephemeral node creation.
-  */
-  protected void handleEphemeralNodeKeeperException(KeeperException e, boolean recreate)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (e instanceof KeeperException.ConnectionLossException || e instanceof KeeperException.SessionExpiredException)
-    {
-      while (true)
-      {
-        try
-        {
-          // Close the handle, open a new one
-          lockNode = null;
-          if (!recreate)
-          {
-            nodePath = null;
-            nodeData = null;
-          }
-          zookeeper.close();
-          createSession();
-          // Lock is lost, but we can (and should) recreate the ephemeral nodes
-          if (nodePath != null)
-          {
-            zookeeper.create(nodePath, nodeData, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
-          }
-          break;
-        }
-        catch (KeeperException e2)
-        {
-          if (!(e2 instanceof KeeperException.ConnectionLossException) && !(e2 instanceof KeeperException.SessionExpiredException))
-            throw new ManifoldCFException(e2.getMessage(),e2);
-        }
-      }
-    }
-    else
-    {
-      // If nothing we know how to deal with, throw.
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  /** Handle keeper exceptions that don't involve ephemeral node creation.
-  */
-  protected void handleKeeperException(KeeperException e, boolean recreate)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (e instanceof KeeperException.ConnectionLossException)
-    {
-      // Retry if connection loss
-      ManifoldCF.sleep(100L);
-    }
-    else if (e instanceof KeeperException.SessionExpiredException)
-    {
-      while (true)
-      {
-        try
-        {
-          // Close the handle, open a new one
-          lockNode = null;
-          if (!recreate)
-          {
-            nodePath = null;
-            nodeData = null;
-          }
-          zookeeper.close();
-          createSession();
-          // Lock is lost, but we can (and should) recreate the ephemeral nodes
-          if (nodePath != null)
-          {
-            zookeeper.create(nodePath, nodeData, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
-          }
-          break;
-        }
-        catch (KeeperException e2)
-        {
-          if (!(e2 instanceof KeeperException.ConnectionLossException) && !(e2 instanceof KeeperException.SessionExpiredException))
-            throw new ManifoldCFException(e2.getMessage(),e2);
-        }
-      }
-    }
-    else
-    {
-      // If nothing we know how to deal with, throw.
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  public static String zooKeeperSafeName(String input)
-  {
-    // Escape "/" characters
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < input.length(); i++)
-    {
-      char x = input.charAt(i);
-      if (x == '/')
-        sb.append('\\').append('0');
-      else if (x == '\u007f')
-        sb.append('\\').append('1');
-      else if (x == '\\')
-        sb.append('\\').append('\\');
-      else if (x >= '\u0000' && x < '\u0020')
-        sb.append('\\').append(x + '\u0040');
-      else if (x >= '\u0080' && x < '\u00a0')
-        sb.append('\\').append(x + '\u0060' - '\u0080');
-      else
-        sb.append(x);
-    }
-    return sb.toString();
-  }
-
-  public static String zooKeeperDecodeSafeName(String input)
-  {
-    // Escape "/" characters
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i);
-      if (x == '\\')
-      {
-        i++;
-        if (i == input.length())
-          throw new RuntimeException("Supposedly safe zookeeper name is not properly encoded!!");
-        x = input.charAt(i);
-        if (x == '0')
-          sb.append('/');
-        else if (x == '1')
-          sb.append('\u007f');
-        else if (x == '\\')
-          sb.append('\\');
-        else if (x >= '\u0040' && x < '\u0060')
-          sb.append(x - '\u0040');
-        else if (x >= '\u0060' && x < '\u0080')
-          sb.append(x - '\u0060' + '\u0080');
-        else
-          throw new RuntimeException("Supposedly safe zookeeper name is not properly encoded!!");
-      }
-      else
-        sb.append(x);
-      i++;
-    }
-    return sb.toString();
-  }
-
-  // Protected methods
-  
-  /** Create a node and a sequential child node.  Neither node has any data.
-  */
-  protected String createSequentialChild(String mainNode, String childPrefix)
-    throws KeeperException, InterruptedException
-  {
-    // Because zookeeper is so slow, AND reports all exceptions to the log, we do the minimum.
-    while (true)
-    {
-      try
-      {
-        return zookeeper.create(mainNode + "/" + childPrefix, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
-      }
-      catch (KeeperException.NoNodeException e)
-      {
-        try
-        {
-          zookeeper.create(mainNode, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-        }
-        catch (KeeperException.NodeExistsException e2)
-        {
-        }
-      }
-    }
-  }
-
-  /** Watcher class for zookeeper, so we get notified about zookeeper events. */
-  protected static class ZooKeeperWatcher implements Watcher
-  {
-    public ZooKeeperWatcher()
-    {
-    }
-    
-    @Override
-    public void process(WatchedEvent event)
-    {
-    }
-
-  }
-
-  /** Watcher class for exists state changes, so we get notified about deletions of lock request nodes. */
-  protected static class ExistsWatcher implements Watcher
-  {
-    protected boolean eventTriggered = false;
-
-    public ExistsWatcher()
-    {
-    }
-    
-    @Override
-    public void process(WatchedEvent event)
-    {
-      synchronized (this)
-      {
-        eventTriggered = true;
-        notifyAll();
-      }
-    }
-
-    public void waitForEvent()
-      throws InterruptedException
-    {
-      synchronized (this)
-      {
-        if (eventTriggered)
-          return;
-        wait();
-      }
-    }
-    
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperConnectionPool.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperConnectionPool.java
deleted file mode 100644
index 84ecd38..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperConnectionPool.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.io.*;
-
-/** Pool of ZooKeeper connections.
-* ZooKeeper connections are not trivial to set up and each one carries a cost.  Plus,
-* if we want to shut them all down on exit we need them all in one place.
-*/
-public class ZooKeeperConnectionPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final String connectString;
-  protected final int sessionTimeout;
-  
-  protected final List<ZooKeeperConnection> openConnectionList = new ArrayList<ZooKeeperConnection>();
-  
-  public ZooKeeperConnectionPool(String connectString, int sessionTimeout)
-  {
-    this.connectString = connectString;
-    this.sessionTimeout = sessionTimeout;
-  }
-  
-  public synchronized ZooKeeperConnection grab()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (openConnectionList.size() == 0)
-      openConnectionList.add(new ZooKeeperConnection(connectString, sessionTimeout));
-    return openConnectionList.remove(openConnectionList.size()-1);
-  }
-
-  public synchronized void release(ZooKeeperConnection connection)
-  {
-    openConnectionList.add(connection);
-  }
-  
-  public synchronized void closeAll()
-    throws InterruptedException
-  {
-    for (ZooKeeperConnection c : openConnectionList)
-    {
-      c.close();
-    }
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperEphemeralNodeObject.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperEphemeralNodeObject.java
deleted file mode 100644
index 1ac351b..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperEphemeralNodeObject.java
+++ /dev/null
@@ -1,93 +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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-/** This class keeps track of a zookeeper ephemeral node that is owned by the
-* current process. 
-*/
-public class ZooKeeperEphemeralNodeObject
-{
-  private final ZooKeeperConnectionPool pool;
-  private final String nodePath;
-  
-  private ZooKeeperConnection currentConnection = null;
-
-  public ZooKeeperEphemeralNodeObject(String nodePath, ZooKeeperConnectionPool pool)
-  {
-    this.nodePath = nodePath;
-    this.pool = pool;
-  }
-  
-  /** Create the specified node.
-  */
-  public synchronized void createNode(byte[] nodeData)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a created node for '"+nodePath+"'");
-    currentConnection = pool.grab();
-    try
-    {
-      currentConnection.createNode(nodePath,nodeData);
-    }
-    catch (Throwable t)
-    {
-      pool.release(currentConnection);
-      currentConnection = null;
-      if (t instanceof ManifoldCFException)
-        throw (ManifoldCFException)t;
-      if (t instanceof InterruptedException)
-        throw (InterruptedException)t;
-      if (t instanceof Error)
-        throw (Error)t;
-      if (t instanceof RuntimeException)
-        throw (RuntimeException)t;
-      throw new RuntimeException("Unexpected exception type: "+t.getClass().getName()+": "+t.getMessage(),t);
-    }
-  }
-  
-  /** Set the node's data.
-  */
-  public synchronized void setNodeData(byte[] nodeData)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (currentConnection == null)
-      throw new IllegalStateException("Node not yet created for node path '"+nodePath+"'");
-    
-    currentConnection.setNodeData(nodeData);
-  }
-  
-  /** Delete the node.
-  */
-  public synchronized void deleteNode()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (currentConnection == null)
-      throw new IllegalStateException("Can't delete node '"+nodePath+"' that we don't own");
-      // It's allowed to delete the same node multiple times
-      //return;
-    
-    currentConnection.deleteNode();
-    pool.release(currentConnection);
-    currentConnection = null;
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperEphemeralNodePool.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperEphemeralNodePool.java
deleted file mode 100644
index b737cf4..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperEphemeralNodePool.java
+++ /dev/null
@@ -1,88 +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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.util.*;
-
-/** This class represents a pool of ZooKeeperEphemeralNodeObject objects.
-* The key for this pool is the node path.
-*/
-public class ZooKeeperEphemeralNodePool
-{
-  protected final ZooKeeperConnectionPool pool;
-  protected final Map<String,ZooKeeperEphemeralNodeObject> nodes = new HashMap<String,ZooKeeperEphemeralNodeObject>();
-  
-  public ZooKeeperEphemeralNodePool(ZooKeeperConnectionPool pool)
-  {
-    this.pool = pool;
-  }
-  
-  public void createNode(String nodePath, byte[] nodeData)
-    throws ManifoldCFException, InterruptedException
-  {
-    getObject(nodePath).createNode(nodeData);
-  }
-  
-  public void setNodeData(String nodePath, byte[] nodeData)
-    throws ManifoldCFException, InterruptedException
-  {
-    getObject(nodePath).setNodeData(nodeData);
-  }
-
-  public void deleteNode(String nodePath)
-    throws ManifoldCFException, InterruptedException
-  {
-    synchronized (this)
-    {
-      ZooKeeperEphemeralNodeObject rval = nodes.get(nodePath);
-      if (rval != null)
-      {
-        rval.deleteNode();
-        nodes.remove(nodePath);
-      }
-    }
-  }
-  
-  public void deleteAll()
-    throws ManifoldCFException, InterruptedException
-  {
-    synchronized (this)
-    {
-      while (nodes.size() > 0)
-      {
-        Iterator<String> nodePathIter = nodes.keySet().iterator();
-        String nodePath = nodePathIter.next();
-        deleteNode(nodePath);
-      }
-    }
-  }
-
-  protected synchronized ZooKeeperEphemeralNodeObject getObject(String nodePath)
-  {
-    ZooKeeperEphemeralNodeObject rval = nodes.get(nodePath);
-    if (rval != null)
-      return rval;
-    rval = new ZooKeeperEphemeralNodeObject(nodePath,pool);
-    nodes.put(nodePath,rval);
-    return rval;
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockManager.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockManager.java
deleted file mode 100644
index 0f26879..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockManager.java
+++ /dev/null
@@ -1,976 +0,0 @@
-/* $Id: LockManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import org.apache.zookeeper.*;
-
-import java.util.*;
-import java.io.*;
-
-/** The lock manager manages locks across all threads and JVMs and cluster members, using Zookeeper.
-* There should be no more than ONE instance of this class per thread!!!  The factory should enforce this.
-*/
-public class ZooKeeperLockManager extends BaseLockManager implements ILockManager
-{
-  public static final String _rcsid = "@(#)$Id: LockManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final static String zookeeperConnectStringParameter = "org.apache.manifoldcf.zookeeper.connectstring";
-  protected final static String zookeeperSessionTimeoutParameter = "org.apache.manifoldcf.zookeeper.sessiontimeout";
-
-  private final static String CONFIGURATION_PATH = "/org.apache.manifoldcf/configuration";
-  private final static String RESOURCE_PATH_PREFIX = "/org.apache.manifoldcf/resources-";
-  private final static String FLAG_PATH_PREFIX = "/org.apache.manifoldcf/flags-";
-  private final static String SERVICETYPE_LOCK_PATH_PREFIX = "/org.apache.manifoldcf/servicelock-";
-  private final static String SERVICETYPE_ACTIVE_PATH_PREFIX = "/org.apache.manifoldcf/serviceactive-";
-  private final static String SERVICETYPE_REGISTER_PATH_PREFIX = "/org.apache.manifoldcf/service-";
-  /** Anonymous global variable name prefix, to be followed by the service type */
-  private final static String SERVICETYPE_ANONYMOUS_COUNTER_PREFIX = "/org.apache.manifoldcf/serviceanon-";
-  
-  /** Anonymous service name prefix, to be followed by an integer */
-  protected final static String anonymousServiceNamePrefix = "_ANON_";
-
-  // ZooKeeper connection pool
-  protected static Integer connectionPoolLock = new Integer(0);
-  protected static ZooKeeperConnectionPool pool = null;
-  protected static Integer zookeeperPoolLocker = new Integer(0);
-  protected static LockPool myZooKeeperLocks = null;
-  protected static Integer ephemeralPoolLocker = new Integer(0);
-  protected static ZooKeeperEphemeralNodePool myEphemeralNodes = null;
-
-  // Cached local values
-  protected ManifoldCFConfiguration cachedConfiguration = null;
-  
-  /** Constructor */
-  public ZooKeeperLockManager()
-    throws ManifoldCFException
-  {
-    synchronized (connectionPoolLock)
-    {
-      if (pool == null)
-      {
-        // Initialize the ZooKeeper connection pool
-        String connectString = ManifoldCF.getStringProperty(zookeeperConnectStringParameter,null);
-        if (connectString == null)
-          throw new ManifoldCFException("Zookeeper lock manager requires a valid "+zookeeperConnectStringParameter+" property");
-        int sessionTimeout = ManifoldCF.getIntProperty(zookeeperSessionTimeoutParameter,300000);
-        ManifoldCF.addShutdownHook(new ZooKeeperShutdown());
-        pool = new ZooKeeperConnectionPool(connectString, sessionTimeout);
-      }
-    }
-    synchronized (zookeeperPoolLocker)
-    {
-      if (myZooKeeperLocks == null)
-      {
-        myZooKeeperLocks = new LockPool(new ZooKeeperLockObjectFactory(pool));
-      }
-    }
-    synchronized (ephemeralPoolLocker)
-    {
-      if (myEphemeralNodes == null)
-      {
-        myEphemeralNodes = new ZooKeeperEphemeralNodePool(pool);
-      }
-    }
-  }
-  
-  // The node synchronization model involves keeping track of active agents entities, so that other entities
-  // can perform any necessary cleanup if one of the agents processes goes away unexpectedly.  There is a
-  // registration primitive (which can fail if the same guid is used as is already registered and active), a
-  // shutdown primitive (which makes a process id go inactive), and various inspection primitives.
-  
-  // For the zookeeper implementation, we'll need the following:
-  // - a service-type-specific global write lock transient node
-  // - a service-type-specific permanent root node that has registered services as children
-  // - a service-type-specific transient root node that has active services as children
-  //
-  // This is not necessarily the best implementation that meets the constraints, but it is straightforward
-  // and will serve until we come up with a better one.
-  
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  @Override
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    return registerServiceBeginServiceActivity(serviceType, serviceName, null, cleanup);
-  }
-    
-  /** Register a service and begin service activity.
-  * This atomic operation creates a permanent registration entry for a service.
-  * If the permanent registration entry already exists, this method will not create it or
-  * treat it as an error.  This operation also enters the "active" zone for the service.  The "active" zone will remain in force until it is
-  * canceled, or until the process is interrupted.  Ideally, the corresponding endServiceActivity method will be
-  * called when the service shuts down.  Some ILockManager implementations require that this take place for
-  * proper management.
-  * If the transient registration already exists, it is treated as an error and an exception will be thrown.
-  * If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the
-  * current service, or all services on the cluster.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to register.  If null is passed, a transient unique service name will be
-  *    created, and will be returned to the caller.
-  *@param initialData is the initial service data for this service.
-  *@param cleanup is called to clean up either the current service, or all services of this type, if no other active service exists.
-  *    May be null.  Local service cleanup is never called if the serviceName argument is null.
-  *@return the actual service name.
-  */
-  public String registerServiceBeginServiceActivity(String serviceType, String serviceName,
-    byte[] initialData, IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryWriteLock(connection, serviceType);
-        try
-        {
-          if (serviceName == null)
-            serviceName = constructUniqueServiceName(connection, serviceType);
-
-          String encodedServiceName = ZooKeeperConnection.zooKeeperSafeName(serviceName);
-          
-          String activePath = buildServiceTypeActivePath(serviceType, encodedServiceName);
-          if (connection.checkNodeExists(activePath))
-            throw new ManifoldCFException("Service '"+serviceName+"' of type '"+serviceType+"' is already active");
-          // First, see where we stand.
-          // We need to find out whether (a) our service is already registered; (b) how many registered services there are;
-          // (c) whether there are other active services.  But no changes will be made at this time.
-          String registrationNodePath = buildServiceTypeRegistrationPath(serviceType);
-          List<String> children = connection.getChildren(registrationNodePath);
-          boolean foundService = false;
-          boolean foundActiveService = false;
-          for (String encodedRegisteredServiceName : children)
-          {
-            if (encodedRegisteredServiceName.equals(encodedServiceName))
-              foundService = true;
-            if (connection.checkNodeExists(buildServiceTypeActivePath(serviceType, encodedRegisteredServiceName)))
-              foundActiveService = true;
-          }
-          
-          // Call the appropriate cleanup.  This will depend on what's actually registered, and what's active.
-          // If there were no services registered at all when we started, then no cleanup is needed, just cluster init.
-          // If this fails, we must revert to having our service not be registered and not be active.
-          boolean unregisterAll = false;
-          if (cleanup != null)
-          {
-            if (children.size() == 0)
-            {
-              // If we could count on locks never being cleaned up, clusterInit()
-              // would be sufficient here.  But then there's no way to recover from
-              // a lock clean.
-              cleanup.cleanUpAllServices();
-              cleanup.clusterInit();
-            }
-            else if (foundService && foundActiveService)
-              cleanup.cleanUpService(serviceName);
-            else if (!foundActiveService)
-            {
-              cleanup.cleanUpAllServices();
-              cleanup.clusterInit();
-              unregisterAll = true;
-            }
-          }
-
-          if (unregisterAll)
-          {
-            // Unregister all (since we did a global cleanup)
-            for (String encodedRegisteredServiceName : children)
-            {
-              if (!encodedRegisteredServiceName.equals(encodedServiceName))
-                connection.deleteChild(registrationNodePath, encodedRegisteredServiceName);
-            }
-          }
-
-          // Now, register (if needed)
-          if (!foundService)
-          {
-            connection.createChild(registrationNodePath, encodedServiceName);
-          }
-          
-          // Last, set the appropriate active flag
-          myEphemeralNodes.createNode(activePath, initialData);
-          return serviceName;
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-  
-  /** Set service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@param serviceData is the data to update to (may be null).
-  * This updates the service's transient data (or deletes it).  If the service is not active, an exception is thrown.
-  */
-  @Override
-  public void updateServiceData(String serviceType, String serviceName, byte[] serviceData)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryWriteLock(connection, serviceType);
-        try
-        {
-          String activePath = buildServiceTypeActivePath(serviceType, ZooKeeperConnection.zooKeeperSafeName(serviceName));
-          myEphemeralNodes.setNodeData(activePath, (serviceData==null)?new byte[0]:serviceData);
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Retrieve service data for a service.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service.
-  *@return the service's transient data.
-  */
-  @Override
-  public byte[] retrieveServiceData(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryReadLock(connection, serviceType);
-        try
-        {
-          String activePath = buildServiceTypeActivePath(serviceType, ZooKeeperConnection.zooKeeperSafeName(serviceName));
-          return connection.getNodeData(activePath);
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Scan service data for a service type.  Only active service data will be considered.
-  *@param serviceType is the type of service.
-  *@param dataAcceptor is the object that will be notified of each item of data for each service name found.
-  */
-  @Override
-  public void scanServiceData(String serviceType, IServiceDataAcceptor dataAcceptor)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryReadLock(connection, serviceType);
-        try
-        {
-          String registrationNodePath = buildServiceTypeRegistrationPath(serviceType);
-          List<String> children = connection.getChildren(registrationNodePath);
-          for (String encodedRegisteredServiceName : children)
-          {
-            String activeNodePath = buildServiceTypeActivePath(serviceType, encodedRegisteredServiceName);
-            if (connection.checkNodeExists(activeNodePath))
-            {
-              byte[] serviceData = connection.getNodeData(activeNodePath);
-              if (dataAcceptor.acceptServiceData(ZooKeeperConnection.zooKeeperDecodeSafeName(encodedRegisteredServiceName), serviceData))
-                break;
-            }
-          }
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-
-  }
-
-  /** Count all active services of a given type.
-  *@param serviceType is the service type.
-  *@return the count.
-  */
-  @Override
-  public int countActiveServices(String serviceType)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryReadLock(connection, serviceType);
-        try
-        {
-          String registrationNodePath = buildServiceTypeRegistrationPath(serviceType);
-          List<String> children = connection.getChildren(registrationNodePath);
-          int activeServiceCount = 0;
-          for (String encodedRegisteredServiceName : children)
-          {
-            if (connection.checkNodeExists(buildServiceTypeActivePath(serviceType, encodedRegisteredServiceName)))
-              activeServiceCount++;
-          }
-          return activeServiceCount;
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-  
-  /** Clean up any inactive services found.
-  * Calling this method will invoke cleanup of one inactive service at a time.
-  * If there are no inactive services around, then false will be returned.
-  * Note that this method will block whatever service it finds from starting up
-  * for the time the cleanup is proceeding.  At the end of the cleanup, if
-  * successful, the service will be atomically unregistered.
-  *@param serviceType is the service type.
-  *@param cleanup is the object to call to clean up an inactive service.
-  *@return true if there were no cleanup operations necessary.
-  */
-  @Override
-  public boolean cleanupInactiveService(String serviceType, IServiceCleanup cleanup)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryWriteLock(connection, serviceType);
-        try
-        {
-          // We find ONE service that is registered but inactive, and clean up after that one.
-          // Presumably the caller will lather, rinse, and repeat.
-          String registrationNodePath = buildServiceTypeRegistrationPath(serviceType);
-          List<String> children = connection.getChildren(registrationNodePath);
-          String encodedServiceName = null;
-          for (String encodedRegisteredServiceName : children)
-          {
-            if (!connection.checkNodeExists(buildServiceTypeActivePath(serviceType, encodedRegisteredServiceName)))
-            {
-              encodedServiceName = encodedRegisteredServiceName;
-              break;
-            }
-          }
-          if (encodedServiceName == null)
-            return true;
-          
-          // Found one, in serviceName, at position i
-          // Ideally, we should signal at this point that we're cleaning up after it, and then leave
-          // the exclusive lock, so that other activity can take place.  MHL
-          cleanup.cleanUpService(ZooKeeperConnection.zooKeeperDecodeSafeName(encodedServiceName));
-
-          // Unregister the service.
-          connection.deleteChild(registrationNodePath, encodedServiceName);
-          return false;
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** End service activity.
-  * This operation exits the "active" zone for the service.  This must take place using the same ILockManager
-  * object that was used to registerServiceBeginServiceActivity() - which implies that it is the same thread.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to exit.
-  */
-  @Override
-  public void endServiceActivity(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryWriteLock(connection, serviceType);
-        try
-        {
-          myEphemeralNodes.deleteNode(buildServiceTypeActivePath(serviceType, ZooKeeperConnection.zooKeeperSafeName(serviceName)));
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-    
-  /** Check whether a service is active or not.
-  * This operation returns true if the specified service is considered active at the moment.  Once a service
-  * is not active anymore, it can only return to activity by calling beginServiceActivity() once more.
-  *@param serviceType is the type of service.
-  *@param serviceName is the name of the service to check on.
-  *@return true if the service is considered active.
-  */
-  @Override
-  public boolean checkServiceActive(String serviceType, String serviceName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        enterServiceRegistryReadLock(connection, serviceType);
-        try
-        {
-          return connection.checkNodeExists(buildServiceTypeActivePath(serviceType, ZooKeeperConnection.zooKeeperSafeName(serviceName)));
-        }
-        finally
-        {
-          leaveServiceRegistryLock(connection);
-        }
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Enter service registry read lock */
-  protected void enterServiceRegistryReadLock(ZooKeeperConnection connection, String serviceType)
-    throws ManifoldCFException, InterruptedException
-  {
-    String serviceTypeLock = buildServiceTypeLockPath(serviceType);
-    while (true)
-    {
-      if (connection.obtainReadLockNoWait(serviceTypeLock))
-        return;
-      ManifoldCF.sleep(100L);
-    }
-  }
-  
-  /** Enter service registry write lock */
-  protected void enterServiceRegistryWriteLock(ZooKeeperConnection connection, String serviceType)
-    throws ManifoldCFException, InterruptedException
-  {
-    String serviceTypeLock = buildServiceTypeLockPath(serviceType);
-    while (true)
-    {
-      if (connection.obtainWriteLockNoWait(serviceTypeLock))
-        return;
-      ManifoldCF.sleep(100L);
-    }
-  }
-  
-  /** Leave service registry lock */
-  protected void leaveServiceRegistryLock(ZooKeeperConnection connection)
-    throws ManifoldCFException, InterruptedException
-  {
-    connection.releaseLock();
-  }
-  
-  /** Construct a unique service name given the service type.
-  */
-  protected String constructUniqueServiceName(ZooKeeperConnection connection, String serviceType)
-    throws ManifoldCFException, InterruptedException
-  {
-    String serviceCounterName = makeServiceCounterName(serviceType);
-    int serviceUID = readServiceCounter(connection, serviceCounterName);
-    writeServiceCounter(connection, serviceCounterName,serviceUID+1);
-    return anonymousServiceNamePrefix + serviceUID;
-  }
-  
-  /** Make the service counter name for a service type.
-  */
-  protected static String makeServiceCounterName(String serviceType)
-  {
-    return SERVICETYPE_ANONYMOUS_COUNTER_PREFIX + ZooKeeperConnection.zooKeeperSafeName(serviceType);
-  }
-  
-  /** Read service counter.
-  */
-  protected int readServiceCounter(ZooKeeperConnection connection, String serviceCounterName)
-    throws ManifoldCFException, InterruptedException
-  {
-    int rval;
-    byte[] serviceCounterData = connection.readData(serviceCounterName);
-    if (serviceCounterData == null || serviceCounterData.length != 4)
-    {
-      rval = 0;
-      //System.out.println(" Null or bad data length for service counter '"+serviceCounterName+"'");
-    }
-    else
-    {
-      rval = (((int)serviceCounterData[0]) & 0xff) +
-        ((((int)serviceCounterData[1]) << 8) & 0xff00) +
-        ((((int)serviceCounterData[2]) << 16) & 0xff0000) +
-        ((((int)serviceCounterData[3]) << 24) & 0xff000000);
-      //System.out.println(" Read actual data from service counter '"+serviceCounterName+"': "+java.util.Arrays.toString(serviceCounterData));
-    }
-    //System.out.println("Read service counter '"+serviceCounterName+"'; value = "+rval);
-    return rval;
-  }
-  
-  /** Write service counter.
-  */
-  protected void writeServiceCounter(ZooKeeperConnection connection, String serviceCounterName, int counter)
-    throws ManifoldCFException, InterruptedException
-  {
-    byte[] serviceCounterData = new byte[4];
-    serviceCounterData[0] = (byte)(counter & 0xff);
-    serviceCounterData[1] = (byte)((counter >> 8) & 0xff);
-    serviceCounterData[2] = (byte)((counter >> 16) & 0xff);
-    serviceCounterData[3] = (byte)((counter >> 24) & 0xff);
-    connection.writeData(serviceCounterName,serviceCounterData);
-    //System.out.println("Wrote service counter '"+serviceCounterName+"'; value = "+counter+": "+java.util.Arrays.toString(serviceCounterData));
-  }
-
-  /** Build a zk path for the lock for a specific service type.
-  */
-  protected static String buildServiceTypeLockPath(String serviceType)
-  {
-    return SERVICETYPE_LOCK_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(serviceType);
-  }
-  
-  /** Build a zk path for the active node for a specific service of a specific type.
-  */
-  protected static String buildServiceTypeActivePath(String serviceType, String encodedServiceName)
-  {
-    return SERVICETYPE_ACTIVE_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(serviceType) + "-" + encodedServiceName;
-  }
-  
-  /** Build a zk path for the registration node for a specific service type.
-  */
-  protected static String buildServiceTypeRegistrationPath(String serviceType)
-  {
-    return SERVICETYPE_REGISTER_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(serviceType);
-  }
-  
-  // Shared configuration
-
-  /** Get the current shared configuration.  This configuration is available in common among all nodes,
-  * and thus must not be accessed through here for the purpose of finding configuration data that is specific to any one
-  * specific node.
-  *@param configurationData is the globally-shared configuration information.
-  */
-  @Override
-  public ManifoldCFConfiguration getSharedConfiguration()
-    throws ManifoldCFException
-  {
-    if (cachedConfiguration == null)
-    {
-      try
-      {
-        ZooKeeperConnection connection = pool.grab();
-        try
-        {
-          // Read as a byte array, then parse
-          byte[] configurationData = connection.readData(CONFIGURATION_PATH);
-          if (configurationData != null)
-            cachedConfiguration = new ManifoldCFConfiguration(new ByteArrayInputStream(configurationData));
-          else
-            cachedConfiguration = new ManifoldCFConfiguration();
-        }
-        finally
-        {
-          pool.release(connection);
-        }
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-    return cachedConfiguration;
-  }
-
-  /** Write shared configuration.  Caller closes the input stream.
-  */
-  public void setSharedConfiguration(InputStream configurationInputStream)
-    throws ManifoldCFException
-  {
-    try
-    {
-      // Read to a byte array
-      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-
-      byte[] data = new byte[65536];
-
-      while (true)
-      {
-        int nRead = configurationInputStream.read(data, 0, data.length);
-        if (nRead == -1)
-          break;
-        buffer.write(data, 0, nRead);
-      }
-      buffer.flush();
-
-      byte[] toWrite = buffer.toByteArray();
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        connection.writeData(CONFIGURATION_PATH, toWrite);
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-  
-  /** Raise a flag.  Use this method to assert a condition, or send a global signal.  The flag will be reset when the
-  * entire system is restarted.
-  *@param flagName is the name of the flag to set.
-  */
-  @Override
-  public void setGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        connection.setGlobalFlag(FLAG_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(flagName));
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Clear a flag.  Use this method to clear a condition, or retract a global signal.
-  *@param flagName is the name of the flag to clear.
-  */
-  @Override
-  public void clearGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        connection.clearGlobalFlag(FLAG_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(flagName));
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-  
-  /** Check the condition of a specified flag.
-  *@param flagName is the name of the flag to check.
-  *@return true if the flag is set, false otherwise.
-  */
-  @Override
-  public boolean checkGlobalFlag(String flagName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        return connection.checkGlobalFlag(FLAG_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(flagName));
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  /** Read data from a shared data resource.  Use this method to read any existing data, or get a null back if there is no such resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@return a byte array containing the data, or null.
-  */
-  @Override
-  public byte[] readData(String resourceName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        return connection.readData(RESOURCE_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(resourceName));
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-  
-  /** Write data to a shared data resource.  Use this method to write a body of data into a shared resource.
-  * Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.
-  *@param resourceName is the global name of the resource.
-  *@param data is the byte array containing the data.  Pass null if you want to delete the resource completely.
-  */
-  @Override
-  public void writeData(String resourceName, byte[] data)
-    throws ManifoldCFException
-  {
-    try
-    {
-      ZooKeeperConnection connection = pool.grab();
-      try
-      {
-        connection.writeData(RESOURCE_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(resourceName), data);
-      }
-      finally
-      {
-        pool.release(connection);
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-  }
-
-  // Main method - for loading Zookeeper data
-  
-  public static void main(String[] argv)
-  {
-    if (argv.length != 1)
-    {
-      System.err.println("Usage: ZooKeeperLockManager <shared_configuration_file>");
-      System.exit(1);
-    }
-    
-    File file = new File(argv[0]);
-    
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-
-      try
-      {
-        FileInputStream fis = new FileInputStream(file);
-        try
-        {
-          new ZooKeeperLockManager().setSharedConfiguration(fis);
-        }
-        finally
-        {
-          fis.close();
-        }
-      }
-      finally
-      {
-        ManifoldCF.cleanUpEnvironment(tc);
-      }
-    }
-    catch (Throwable e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(-1);
-    }
-  }
-  
-  // Protected methods and classes
-  
-  /** Override this method to change the nature of global locks.
-  */
-  @Override
-  protected LockPool getGlobalLockPool()
-  {
-    return myZooKeeperLocks;
-  }
-
-  /** Shutdown the connection pool.
-  */
-  protected static void shutdownPool()
-    throws ManifoldCFException
-  {
-    synchronized (ephemeralPoolLocker)
-    {
-      if (myEphemeralNodes != null)
-      {
-        try
-        {
-          myEphemeralNodes.deleteAll();
-          myEphemeralNodes = null;
-        }
-        catch (InterruptedException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-      }
-    }
-    
-    synchronized (connectionPoolLock)
-    {
-      if (pool != null)
-      {
-        try
-        {
-          pool.closeAll();
-          pool = null;
-        }
-        catch (InterruptedException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-        }
-      }
-    }
-  }
-  
-  protected static class ZooKeeperShutdown implements IShutdownHook
-  {
-    public ZooKeeperShutdown()
-    {
-    }
-    
-    /** Do the requisite cleanup.
-    */
-    @Override
-    public void doCleanup(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      shutdownPool();
-    }
-
-  }
-  
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockObject.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockObject.java
deleted file mode 100644
index e7e3c92..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockObject.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-
-/** One instance of this object exists for each lock on each JVM!
-* This is the ZooKeeper version of the lock.
-*/
-public class ZooKeeperLockObject extends LockObject
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final static String LOCK_PATH_PREFIX = "/org.apache.manifoldcf.locks-";
-
-  private final ZooKeeperConnectionPool pool;
-  private final String lockPath;
-  
-  private ZooKeeperConnection currentConnection = null;
-
-  public ZooKeeperLockObject(LockPool lockPool, Object lockKey, ZooKeeperConnectionPool pool)
-  {
-    super(lockPool,lockKey);
-    this.pool = pool;
-    this.lockPath = LOCK_PATH_PREFIX + ZooKeeperConnection.zooKeeperSafeName(lockKey.toString());
-  }
-
-  @Override
-  protected void obtainGlobalWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a connection before write locking: "+lockPath);
-    boolean succeeded = false;
-    currentConnection = pool.grab();
-    try
-    {
-      succeeded = currentConnection.obtainWriteLockNoWait(lockPath);
-      if (!succeeded)
-        throw new LockException(LOCKEDANOTHERJVM);
-    }
-    finally
-    {
-      if (!succeeded)
-      {
-        pool.release(currentConnection);
-        currentConnection = null;
-      }
-    }
-  }
-
-  @Override
-  protected void obtainGlobalWriteLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a connection before write locking: "+lockPath);
-    boolean succeeded = false;
-    currentConnection = pool.grab();
-    try
-    {
-      currentConnection.obtainWriteLock(lockPath);
-      succeeded = true;
-    }
-    finally
-    {
-      if (!succeeded)
-      {
-        pool.release(currentConnection);
-        currentConnection = null;
-      }
-    }
-  }
-
-  @Override
-  protected void clearGlobalWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (currentConnection == null)
-      throw new IllegalStateException("Cannot clear write lock we don't have: "+lockPath);
-    clearLock();
-  }
-  
-  @Override
-  protected void obtainGlobalNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a connection before non-ex-write locking: "+lockPath);
-    boolean succeeded = false;
-    currentConnection = pool.grab();
-    try
-    {
-      succeeded = currentConnection.obtainNonExWriteLockNoWait(lockPath);
-      if (!succeeded)
-        throw new LockException(LOCKEDANOTHERJVM);
-    }
-    finally
-    {
-      if (!succeeded)
-      {
-        pool.release(currentConnection);
-        currentConnection = null;
-      }
-    }
-  }
-
-  @Override
-  protected void obtainGlobalNonExWriteLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a connection before non-ex-write locking: "+lockPath);
-    boolean succeeded = false;
-    currentConnection = pool.grab();
-    try
-    {
-      currentConnection.obtainNonExWriteLock(lockPath);
-      succeeded = true;
-    }
-    finally
-    {
-      if (!succeeded)
-      {
-        pool.release(currentConnection);
-        currentConnection = null;
-      }
-    }
-  }
-
-  @Override
-  protected void clearGlobalNonExWriteLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (currentConnection == null)
-      throw new IllegalStateException("Cannot clear non-ex-write lock we don't have: "+lockPath);
-    clearLock();
-  }
-
-  @Override
-  protected void obtainGlobalReadLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a connection before read locking: "+lockPath);
-    boolean succeeded = false;
-    currentConnection = pool.grab();
-    try
-    {
-      succeeded = currentConnection.obtainReadLockNoWait(lockPath);
-      if (!succeeded)
-        throw new LockException(LOCKEDANOTHERJVM);
-    }
-    finally
-    {
-      if (!succeeded)
-      {
-        pool.release(currentConnection);
-        currentConnection = null;
-      }
-    }
-  }
-
-  @Override
-  protected void obtainGlobalReadLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    if (currentConnection != null)
-      throw new IllegalStateException("Already have a connection before read locking: "+lockPath);
-    boolean succeeded = false;
-    currentConnection = pool.grab();
-    try
-    {
-      currentConnection.obtainReadLock(lockPath);
-      succeeded = true;
-    }
-    finally
-    {
-      if (!succeeded)
-      {
-        pool.release(currentConnection);
-        currentConnection = null;
-      }
-    }
-  }
-
-  @Override
-  protected void clearGlobalReadLockNoWait()
-    throws ManifoldCFException, LockException, InterruptedException
-  {
-    if (currentConnection == null)
-      throw new IllegalStateException("Cannot clear read lock we don't have: "+lockPath);
-    clearLock();
-  }
-
-  protected void clearLock()
-    throws ManifoldCFException, InterruptedException
-  {
-    currentConnection.releaseLock();
-    pool.release(currentConnection);
-    currentConnection = null;
-  }
-
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockObjectFactory.java b/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockObjectFactory.java
deleted file mode 100644
index bddf1f3..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperLockObjectFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import org.apache.manifoldcf.core.system.Logging;
-import java.io.*;
-
-/** Base factory for zookeeper lock objects.
-*/
-public class ZooKeeperLockObjectFactory extends LockObjectFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final ZooKeeperConnectionPool pool;
-  
-  public ZooKeeperLockObjectFactory(ZooKeeperConnectionPool pool)
-  {
-    this.pool = pool;
-  }
-  
-  @Override
-  public LockObject newLockObject(LockPool lockPool, Object lockKey)
-  {
-    return new ZooKeeperLockObject(lockPool, lockKey, pool);
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/system/Logging.java b/framework/core/src/main/java/org/apache/manifoldcf/core/system/Logging.java
deleted file mode 100644
index 1233f57..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/system/Logging.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/* $Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.io.*;
-
-import org.apache.log4j.*;
-import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationFactory;
-
-/** This class furnishes the logging environment for ManifoldCF.
-*/
-public class Logging
-{
-  public static final String _rcsid = "@(#)$Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Public logger objects.  Initialized by initializeLoggers() method.
-  public static Logger root = null;
-  public static Logger misc = null;
-  public static Logger db = null;
-  public static Logger lock = null;
-  public static Logger cache = null;
-  public static Logger keystore = null;
-  public static Logger perf = null;
-  public static Logger diagnostics = null;
-
-  private static HashMap loggerTable = null;
-  private static HashMap logLevelMap = null;
-
-  /** Initialize logger setup.
-  */
-  public static synchronized void initializeLoggingSystem(final File logConfigFile)
-  {
-    if (logLevelMap != null)
-      return;
-
-
-    // configuration: log map hash
-    logLevelMap = new HashMap();
-    logLevelMap.put("OFF", Level.OFF);
-    logLevelMap.put("FATAL", Level.FATAL);
-    logLevelMap.put("WARN", Level.WARN);
-    logLevelMap.put("ERROR", Level.ERROR);
-    logLevelMap.put("INFO", Level.INFO);
-    logLevelMap.put("DEBUG", Level.DEBUG);
-    logLevelMap.put("ALL", Level.ALL);
-
-    loggerTable = new HashMap();
-
-    System.setProperty("log4j.configurationFile", logConfigFile.toString());
-    //System.err.println("ManifoldCF logger setup complete");
-  }
-
-  /** Set up loggers used by core package.
-  */
-  public static synchronized void initializeLoggers()
-  {
-    // package loggers
-    if (misc != null)
-      return;
-
-    root = newLogger("org.apache.manifoldcf.root");
-    misc = newLogger("org.apache.manifoldcf.misc");
-    db = newLogger("org.apache.manifoldcf.db");
-    lock = newLogger("org.apache.manifoldcf.lock");
-    cache = newLogger("org.apache.manifoldcf.cache");
-    keystore = newLogger("org.apache.manifoldcf.keystore");
-    perf = newLogger("org.apache.manifoldcf.perf");
-    diagnostics = newLogger("org.apache.manifoldcf.diagnostics");
-  }
-
-  /** Reset all loggers
-  */
-  public static void setLogLevels(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // System.out.println("Setting log levels @ " + new Date().toString());
-    Iterator it = loggerTable.entrySet().iterator();
-    while (it.hasNext())
-    {
-      Map.Entry e = (Map.Entry)it.next();
-      Logger logger = (Logger)e.getValue();
-
-      // logger name;
-      String loggername = (String)e.getKey();
-
-      // logger level
-      String level = LockManagerFactory.getProperty(threadContext, loggername);
-
-      Level loglevel = null;
-      if (level != null && level.length() > 0)
-      {
-        loglevel = (Level)logLevelMap.get(level);
-      }
-
-      if (loglevel==null)
-      {
-        loglevel = Level.WARN;
-      }
-
-      try
-      {
-        logger.setLevel(loglevel);
-      }
-      catch (Exception ex)
-      {
-        System.err.println("Unable to set log level " + level +
-          " on logger " + loggername);
-        ex.printStackTrace();
-      }
-    }
-  }
-
-  /** Get a logger given a logger name.
-  *@param loggerName is the logger name.
-  *@return the logger.
-  */
-  public static final Logger getLogger(String loggerName)
-  {
-    return (Logger)loggerTable.get(loggerName);
-  }
-
-  /** Register a new logger.
-  *@param s is the logger name.
-  *@return the new logger.
-  */
-  public static final Logger newLogger(String s)
-  {
-    Logger l = Logger.getLogger(s);
-    loggerTable.put(s, l);
-    return l;
-  }
-
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java b/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java
deleted file mode 100644
index c8c68fd..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java
+++ /dev/null
@@ -1,1742 +0,0 @@
-/* $Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.lang.reflect.*;
-import java.io.*;
-import java.util.*;
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.InvalidParameterException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import javax.crypto.Cipher;
-import javax.crypto.CipherInputStream;
-import javax.crypto.CipherOutputStream;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.PBEKeySpec;
-import javax.crypto.spec.SecretKeySpec;
-
-public class ManifoldCF
-{
-  public static final String _rcsid = "@(#)$Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Configuration XML node names and attribute names
-  public static final String NODE_LIBDIR = "libdir";
-  public static final String ATTRIBUTE_PATH = "path";
-  
-  // This is the unique process identifier, which has to be unique and repeatable within a cluster
-  
-  /** Process ID (no more than 16 characters) */
-  protected static String processID = null;
-  
-  // "Working directory"
-  
-  /** This is the working directory file object. */
-  protected static File workingDirectory = null;
-  
-  // Class loader
-  
-  /** The object that manages ManifoldCF plugin class loading.  This is initialized when the initialize method is called. */
-  protected static ManifoldCFResourceLoader resourceLoader = null;
-
-  // Shutdown hooks
-  /** Temporary file collector */
-  protected static FileTrack tracker = null;
-  /** Database handle cleanup */
-  protected static DatabaseShutdown dbShutdown = null;
-  
-  /** Array of cleanup hooks (for managing shutdown) */
-  protected final static List<IShutdownHook> cleanupHooks = new ArrayList<IShutdownHook>(); 
-  
-  /** Array of polling hooks (for managing polling) */
-  protected final static List<IPollingHook> pollingHooks = new ArrayList<IPollingHook>();
-  
-  /** Shutdown thread */
-  protected static Thread shutdownThread;
-  /** Static initializer for setting up shutdown thread */
-  static
-  {
-    shutdownThread = new ShutdownThread();
-    try
-    {
-      Runtime.getRuntime().addShutdownHook(shutdownThread);
-    }
-    catch (Exception e)
-    {
-      // Guess we can't do it - dump a trace and continue
-      e.printStackTrace();
-    }
-    catch (Error e)
-    {
-      e.printStackTrace();
-    }
-  }
-  
-  // Flag indicating whether system initialized or not, and synchronizer to protect that flag.
-  protected static int initializeLevel = 0;
-  protected static boolean alreadyClosed = false;
-  protected static boolean alreadyShutdown = false;
-  protected static Integer initializeFlagLock = new Integer(0);
-
-  // Local member variables
-  protected static String mcfVersion = null;
-  protected static String masterDatabaseName = null;
-  protected static String masterDatabaseUsername = null;
-  protected static String masterDatabasePassword = null;
-  protected static ManifoldCFConfiguration localConfiguration = null;
-  protected static long propertyFilelastMod = -1L;
-  protected static String propertyFilePath = null;
-
-  protected static final String applicationName = "lcf";
-
-  // System property names
-  public static final String lcfConfigFileProperty = "org.apache.manifoldcf.configfile";
-
-  // System property/config file property names
-  
-  // Version property
-  /** The current ManifoldCF version string */
-  public static final String versionProperty = "org.apache.manifoldcf.versionstring";
-  
-  // Process ID property
-  /** Process ID - cannot exceed 16 characters */
-  public static final String processIDProperty = "org.apache.manifoldcf.processid";
-  
-  // Database access properties
-  /** Database name property */
-  public static final String masterDatabaseNameProperty = "org.apache.manifoldcf.database.name";
-  /** Database user name property */
-  public static final String masterDatabaseUsernameProperty = "org.apache.manifoldcf.database.username";
-  /** Database password property */
-  public static final String masterDatabasePasswordProperty = "org.apache.manifoldcf.database.password";
-
-  // Database connection pooling properties
-  /** Maximum open database handles property */
-  public static final String databaseHandleMaxcountProperty = "org.apache.manifoldcf.database.maxhandles";
-  /** Database handle timeout property */
-  public static final String databaseHandleTimeoutProperty = "org.apache.manifoldcf.database.handletimeout";
-  /** Connection tracking debug property */
-  public static final String databaseConnectionTrackingProperty = "org.apache.manifoldcf.database.connectiontracking";
-
-  // Database performance monitoring properties
-  /** Elapsed time a query can take before a warning is output to the log, in seconds */
-  public static final String databaseQueryMaxTimeProperty = "org.apache.manifoldcf.database.maxquerytime";
-  
-  // Log configuration properties
-  /** Location of log configuration file */
-  public static final String logConfigFileProperty = "org.apache.manifoldcf.logconfigfile";
-  
-  // File resources property
-  /** Location of file resources */
-  public static final String fileResourcesProperty = "org.apache.manifoldcf.fileresources";
-  
-  // Implementation class properties
-  /** Lock manager implementation class */
-  public static final String lockManagerImplementation = "org.apache.manifoldcf.lockmanagerclass";
-  /** Database implementation class */
-  public static final String databaseImplementation = "org.apache.manifoldcf.databaseimplementationclass";
-  /** Auth implementation class */
-  public static final String authImplementation = "org.apache.manifoldcf.authimplementationclass";
-  
-  // The following are system integration properties
-  /** Script to invoke when configuration changes, if any */
-  public static final String configSignalCommandProperty = "org.apache.manifoldcf.configuration.change.command";
-  /** File to look for to block access to UI during database maintenance */
-  public static final String maintenanceFileSignalProperty = "org.apache.manifoldcf.database.maintenanceflag";
-
-  /** Encryption salt property */
-  public static final String saltProperty = "org.apache.manifoldcf.salt";
-
-  /** Reset environment, minting a thread context for convenience and backwards
-  * compatibility.
-  */
-  @Deprecated
-  public static void resetEnvironment()
-  {
-    resetEnvironment(ThreadContextFactory.make());
-  }
-  
-  /** Reset environment.
-  */
-  public static void resetEnvironment(IThreadContext threadContext)
-  {
-    synchronized (initializeFlagLock)
-    {
-      if (initializeLevel > 0)
-      {
-        // Clean up the system doing the same thing the shutdown thread would have if the process was killed
-        cleanUpEnvironment(threadContext);
-        processID = null;
-        mcfVersion = null;
-        masterDatabaseName = null;
-        masterDatabaseUsername = null;
-        masterDatabasePassword = null;
-        localConfiguration = null;
-        propertyFilelastMod = -1L;
-        propertyFilePath = null;
-        alreadyClosed = false;
-        alreadyShutdown = false;
-        initializeLevel = 0;
-      }
-    }
-  }
-  
-  /** Initialize environment, minting a thread context for backwards compatibility.
-  */
-  @Deprecated
-  public static void initializeEnvironment()
-    throws ManifoldCFException
-  {
-    initializeEnvironment(ThreadContextFactory.make());
-  }
-  
-  /** Initialize environment.
-  */
-  public static void initializeEnvironment(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      if (initializeLevel == 0)
-      {
-        try
-        {
-          
-          // Get system properties
-          java.util.Properties props = System.getProperties();
-          // First, look for a define that might indicate where to look
-        
-          propertyFilePath = (String)props.get(lcfConfigFileProperty);
-          if (propertyFilePath == null)
-          {
-            System.err.println("Couldn't find "+lcfConfigFileProperty+" property; using default");
-            String configPath = (String)props.get("user.home") + "/"+applicationName;
-            configPath = configPath.replace('\\', '/');
-            propertyFilePath = new File(configPath,"properties.xml").toString();
-          }
-
-          // Initialize working directory.  We cannot use the actual system cwd, because different ManifoldCF processes will have different ones.
-          // So, instead, we use the location of the property file itself, and call that the "working directory".
-          workingDirectory = new File(propertyFilePath).getAbsoluteFile().getParentFile();
-
-          // Initialize resource loader.
-          resourceLoader = new ManifoldCFResourceLoader(Thread.currentThread().getContextClassLoader());
-          
-          // Read configuration!
-          localConfiguration = new OverrideableManifoldCFConfiguration();
-          checkProperties();
-
-          // Process ID is always local
-          processID = getStringProperty(processIDProperty,"");
-          if (processID.length() > 16)
-            throw new ManifoldCFException("Process ID cannot exceed 16 characters!");
-
-          // Log file is always local
-          File logConfigFile = getFileProperty(logConfigFileProperty);
-          if (logConfigFile == null)
-          {
-            System.err.println("Couldn't find "+logConfigFileProperty+" property; using default");
-            String configPath = (String)props.get("user.home") + "/"+applicationName;
-            configPath = configPath.replace('\\', '/');
-            logConfigFile = new File(configPath,"logging.xml");
-          }
-
-          // Make sure that the registered entry points for polling and cleanup are cleared, just in case.
-          // This prevents classloader-style registration, which is actually not a good one for MCF architecture.
-          synchronized (cleanupHooks)
-          {
-            cleanupHooks.clear();
-          }
-          synchronized (pollingHooks)
-          {
-            pollingHooks.clear();
-          }
-          
-          Logging.initializeLoggingSystem(logConfigFile);
-
-          // Set up local loggers
-          Logging.initializeLoggers();
-          Logging.setLogLevels(threadContext);
-
-          mcfVersion = LockManagerFactory.getStringProperty(threadContext,versionProperty,"unknown version");
-          masterDatabaseName = LockManagerFactory.getStringProperty(threadContext,masterDatabaseNameProperty,"dbname");
-          masterDatabaseUsername = LockManagerFactory.getStringProperty(threadContext,masterDatabaseUsernameProperty,"manifoldcf");
-          masterDatabasePassword = LockManagerFactory.getPossiblyObfuscatedStringProperty(threadContext,masterDatabasePasswordProperty,"local_pg_passwd");
-
-          // Register the connector services
-          registerConnectorServices();
-
-          // Put the cache manager in the polling loop
-          addPollingHook(new CachePoll());
-
-          // Register the file tracker for cleanup on shutdown
-          tracker = new FileTrack();
-          addShutdownHook(tracker);
-          // Register the database cleanup hook
-          addShutdownHook(new DatabaseShutdown());
-
-          // Open the database.  Done once per JVM.
-          DBInterfaceFactory.make(threadContext,masterDatabaseName,masterDatabaseUsername,masterDatabasePassword).openDatabase();
-        }
-        catch (ManifoldCFException e)
-        {
-          throw new ManifoldCFException("Initialization failed: "+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
-        }
-      }
-      initializeLevel++;
-    }
-
-  }
-
-  /** Register connector services provided in connectors and connector-commons
-  */
-  protected static void registerConnectorServices()
-    throws ManifoldCFException
-  {
-    try
-    {
-      Class connectorServicesManifoldCF = findClass("org.apache.manifoldcf.connectorcommon.system.ManifoldCF");
-      Method m = connectorServicesManifoldCF.getMethod("registerConnectorServices",new Class[0]);
-      m.invoke(new Object[0]);
-    }
-    catch (ClassNotFoundException e)
-    {
-      Logging.root.warn("Could not find connectorcommon main class: "+e.getMessage(),e);
-    }
-    catch (NoSuchMethodException e)
-    {
-      Logging.root.warn("ManifoldCF.registerConnectorServices not found: "+e.getMessage(),e);
-    }
-    catch (IllegalAccessException e)
-    {
-      Logging.root.warn("Connectorcommon main class had illegal access: "+e.getMessage(),e);
-    }
-    catch (InvocationTargetException e)
-    {
-      Throwable z = e.getTargetException();
-      if (z instanceof Error)
-        throw (Error)z;
-      else if (z instanceof RuntimeException)
-        throw (RuntimeException)z;
-      else
-        throw new RuntimeException("Unknown exception type: "+z.getClass().getName()+": "+z.getMessage(),z);
-    }
-  }
-  
-  /** For local properties (not shared!!), this class allows them to be overridden directly from the command line.
-  */
-  protected static class OverrideableManifoldCFConfiguration extends ManifoldCFConfiguration
-  {
-    public OverrideableManifoldCFConfiguration()
-    {
-      super();
-    }
-    
-    @Override
-    public String getProperty(String s)
-    {
-      String rval = System.getProperty(s);
-      if (rval == null)
-        rval = super.getProperty(s);
-      return rval;
-    }
-    
-  }
-
-  /** Get process ID */
-  public static final String getProcessID()
-  {
-    return processID;
-  }
-  
-  /** Get current properties.  Makes no attempt to reread or interpret them.
-  */
-  public static final ManifoldCFConfiguration getConfiguration()
-  {
-    return localConfiguration;
-  }
-  
-  /** Reloads properties as needed.
-  */
-  public static final void checkProperties()
-    throws ManifoldCFException
-  {
-    File f = new File(propertyFilePath);    // for re-read
-    try
-    {
-      if (propertyFilelastMod != f.lastModified())
-      {
-        InputStream is = new FileInputStream(f);
-        try
-        {
-          localConfiguration.fromXML(is);
-	  System.err.println("Configuration file successfully read");
-          propertyFilelastMod = f.lastModified();
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      else
-      {
-	System.err.println("Configuration file not read because it didn't change");
-        return;
-      }
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Could not read configuration file '"+f.toString()+"'",e);
-    }
-    
-    // For convenience, post-process all "lib" nodes.
-    ArrayList libDirs = new ArrayList();
-    int i = 0;
-    while (i < localConfiguration.getChildCount())
-    {
-      ConfigurationNode cn = localConfiguration.findChild(i++);
-      if (cn.getType().equals(NODE_LIBDIR))
-      {
-        String path = cn.getAttributeValue(ATTRIBUTE_PATH);
-        if (path == null)
-          throw new ManifoldCFException("Node type '"+NODE_LIBDIR+"' requires a '"+ATTRIBUTE_PATH+" attribute");
-        // What exactly should I do with this classpath information?  The classloader can be dynamically updated, but if I do that will everything work?
-        // I'm going to presume the answer is "yes" for now...
-        libDirs.add(resolvePath(path));
-      }
-    }
-    // Apply libdirs to the resource loader.
-    resourceLoader.setClassPath(libDirs);
-  }
-
-  /** Resolve a file path, possibly relative to ManifoldCF's concept of its "working directory".
-  *@param path is the path, to be calculated relative to the ManifoldCF "working directory".
-  *@return the resolved file.
-  */
-  public static File resolvePath(String path)
-  {
-    File r = new File(path);
-    return r.isAbsolute() ? r : new File(workingDirectory, path);
-  }
-
-  /** Read a (string) property, either from the system properties, or from the local configuration file.
-  *@param s is the property name.
-  *@return the property value, as a string.
-  */
-  public static String getProperty(String s)
-  {
-    return localConfiguration.getProperty(s);
-  }
-
-  /** Read a File property, either from the system properties, or from the local configuration file.
-  * Relative file references are resolved according to the "working directory" for ManifoldCF.
-  */
-  public static File getFileProperty(String s)
-  {
-    String value = getProperty(s);
-    if (value == null)
-      return null;
-    return resolvePath(value);
-  }
-
-  /** Read a (string) property, either from the system properties, or from the local configuration file.
-  *@param s is the property name.
-  *@param defaultValue is the default value for the property.
-  *@return the property value, as a string.
-  */
-  public static String getStringProperty(String s, String defaultValue)
-  {
-    return localConfiguration.getStringProperty(s, defaultValue);
-  }
-
-  /** Read a boolean property
-  */
-  public static boolean getBooleanProperty(String s, boolean defaultValue)
-    throws ManifoldCFException
-  {
-    return localConfiguration.getBooleanProperty(s, defaultValue);
-  }
-  
-  /** Read an integer property, either from the system properties, or from the local configuration file.
-  */
-  public static int getIntProperty(String s, int defaultValue)
-    throws ManifoldCFException
-  {
-    return localConfiguration.getIntProperty(s, defaultValue);
-  }
-
-  /** Read a long property, either from the system properties, or from the local configuration file.
-  */
-  public static long getLongProperty(String s, long defaultValue)
-    throws ManifoldCFException
-  {
-    return localConfiguration.getLongProperty(s, defaultValue);
-  }
-
-  /** Read a float property, either from the system properties, or from the local configuration file.
-  */
-  public static double getDoubleProperty(String s, double defaultValue)
-    throws ManifoldCFException
-  {
-    return localConfiguration.getDoubleProperty(s, defaultValue);
-  }
-  
-  /** Attempt to make sure a path is a folder
-  * @param path
-  */
-  public static void ensureFolder(String path)
-    throws ManifoldCFException
-  {
-    try
-    {
-      File f = new File(path);
-      if (!f.isDirectory())
-      {
-        f.mkdirs();
-      }
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Can't make folder",e,ManifoldCFException.GENERAL_ERROR);
-    }
-  }
-
-  /** Delete a folder path.
-  *@param path is the folder path.
-  */
-  public static void deleteFolder(String path)
-  {
-    File directoryPath = new File(path);
-    recursiveDelete(directoryPath);
-  }
-
-  /** Recursive delete: for cleaning up company folder.
-  *@param directoryPath is the File describing the directory or file to be removed.
-  */
-  public static void recursiveDelete(File directoryPath)
-  {
-    if (!directoryPath.exists())
-      return;
-    if (directoryPath.isDirectory())
-    {
-      File[] children = directoryPath.listFiles();
-      if (children != null)
-      {
-        int i = 0;
-        while (i < children.length)
-        {
-          File x = children[i++];
-          recursiveDelete(x);
-        }
-      }
-    }
-    directoryPath.delete();
-  }
-
-  /** Discover if a path is a folder
-  * @param path spec, 'unix' form mostly
-  */
-  public static boolean isFolder(String path)
-  {
-    File f = new File(path);
-    return f.isDirectory();
-  }
-
-  /** Convert a string into a safe, unique filename.
-  *@param value is the string.
-  *@return the file name.
-  */
-  public static String safeFileName(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '/' || x == '"' || x == '\\' || x == '|' || (x >= 0 && x < ' ') ||
-        x == '+' || x == ',' || x == ':' || x == ';' || x == '<' || x == '>' ||
-        x == '=' || x == '[' || x == ']' || x == '&')
-      {
-        // Stuff the character
-        rval.append("&").append(Integer.toString((int)x)).append("!");
-      }
-      else
-        rval.append(x);
-    }
-    return rval.toString();
-  }
-
-  /** Get the mcf version.
-  *@return the version string
-  */
-  public static String getMcfVersion()
-  {
-    return mcfVersion;
-  }
-  
-  /** Get the master database name.
-  *@return the master database name
-  */
-  public static String getMasterDatabaseName()
-  {
-    return masterDatabaseName;
-  }
-
-  /** Get the master database username.
-  *@return the master database username.
-  */
-  public static String getMasterDatabaseUsername()
-  {
-    return masterDatabaseUsername;
-  }
-
-  /** Get the master database password.
-  *@return the master database password.
-  */
-  public static String getMasterDatabasePassword()
-  {
-    return masterDatabasePassword;
-  }
-
-  /** Find a child database name given a company database instance and the child
-  * database identifier.
-  *@param companyDatabase is the company database.
-  *@param childDBIdentifier is the identifier.
-  *@return the child database name.
-  */
-  public static String getChildDatabaseName(IDBInterface companyDatabase, String childDBIdentifier)
-  {
-    return companyDatabase.getDatabaseName()+"_"+childDBIdentifier;
-  }
-
-  /** Perform standard hashing of a string
-  *  @param input is the string to hash.
-  *  @return the encrypted string.
-  *   */
-  public static String hash(String input)
-    throws ManifoldCFException
-  {
-    MessageDigest hash = startHash();
-    addToHash(hash,input);
-    return getHashValue(hash);
-  }
-
-  /** Start creating a hash
-  */
-  public static MessageDigest startHash()
-    throws ManifoldCFException
-  {
-    try
-    {
-      return MessageDigest.getInstance("SHA");
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Couldn't encrypt: "+e.getMessage(),e,ManifoldCFException.GENERAL_ERROR);
-    }
-  }
-
-  /** Add to hash
-  */
-  public static void addToHash(MessageDigest digest, String input)
-    throws ManifoldCFException
-  {
-    try
-    {
-      byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
-      digest.update(inputBytes);
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Couldn't encrypt: "+e.getMessage(),e,ManifoldCFException.GENERAL_ERROR);
-    }
-  }
-
-  /** Calculate final hash value
-  */
-  public static String getHashValue(MessageDigest digest)
-    throws ManifoldCFException
-  {
-    try
-    {
-      byte[] encryptedBytes = digest.digest();
-      StringBuilder rval = new StringBuilder();
-      int i = 0;
-      while (i < encryptedBytes.length)
-      {
-        byte x = encryptedBytes[i++];
-        rval.append(writeNibble((((int)x) >> 4) & 15));
-        rval.append(writeNibble(((int)x) & 15));
-      }
-      return rval.toString();
-    }
-    catch (Exception e)
-    {
-      throw new ManifoldCFException("Couldn't encrypt: "+e.getMessage(),e,ManifoldCFException.GENERAL_ERROR);
-    }
-  }
-
-  protected static final int IV_LENGTH = 16;
-
-  protected static String getSaltValue(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    final String saltValue = LockManagerFactory.getProperty(threadContext, saltProperty);
-
-    if (saltValue == null || saltValue.length() == 0)
-      throw new ManifoldCFException("Missing required SALT value");
-
-    return saltValue;
-  }
-  
-  protected static Cipher getCipher(IThreadContext threadContext, final int mode, final String passCode, final byte[] iv)
-    throws ManifoldCFException
-  {
-    return getCipher(getSaltValue(threadContext), mode, passCode, iv);
-  }
-  
-  protected static Cipher getCipher(String saltValue, final int mode, final String passCode, final byte[] iv)
-    throws ManifoldCFException
-  {
-    try
-    {
-      SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
-      KeySpec keySpec = new PBEKeySpec(passCode.toCharArray(), saltValue.getBytes(StandardCharsets.UTF_8), 1024, 128);
-      SecretKey secretKey = factory.generateSecret(keySpec);
-
-      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
-      SecretKeySpec key = new SecretKeySpec(secretKey.getEncoded(), "AES");
-      IvParameterSpec parameterSpec = new IvParameterSpec(iv);
-      cipher.init(mode, key, parameterSpec);
-      return cipher;
-    }
-    catch (GeneralSecurityException gse)
-    {
-      throw new ManifoldCFException("Could not build a cipher: " + gse.getMessage(),gse);
-    }
-  }
-  
-  protected static byte[] getSecureRandom()
-  {
-    SecureRandom random = new SecureRandom();
-    byte[] iv = new byte[IV_LENGTH];
-    random.nextBytes(iv);
-    return iv;
-  }
-  
-  private static String OBFUSCATION_PASSCODE = "NowIsTheTime";
-  private static String OBFUSCATION_SALT = "Salty";
-  
-  /** Encode a string in a reversible obfuscation.
-  *@param input is the input string.
-  *@return the output string.
-  */
-  public static String obfuscate(String input)
-    throws ManifoldCFException
-  {
-    return encrypt(OBFUSCATION_SALT, OBFUSCATION_PASSCODE, input);
-  }
-  
-  /** Decode a string encoded using the obfuscation
-  * technique.
-  *@param input is the input string.
-  *@return the decoded string.
-  */
-  public static String deobfuscate(String input)
-    throws ManifoldCFException
-  {
-    return decrypt(OBFUSCATION_SALT, OBFUSCATION_PASSCODE, input);
-  }
-  
-  /** Encrypt a string in a reversible encryption.
-  *@param saltValue is the salt value.
-  *@param passCode is the pass code.
-  *@param input is the input string.
-  *@return the output string.
-  */
-  public static String encrypt(String saltValue, String passCode, String input)
-    throws ManifoldCFException
-  {
-    if (input == null)
-      return null;
-    if (input.length() == 0)
-      return input;
-
-    try
-    {
-      ByteArrayOutputStream os = new ByteArrayOutputStream();
-      
-      // Write IV as a prefix:
-      byte[] iv = getSecureRandom();
-      os.write(iv);
-      os.flush();
-            
-      Cipher cipher = getCipher(saltValue, Cipher.ENCRYPT_MODE, passCode, iv);
-      CipherOutputStream cos = new CipherOutputStream(os, cipher);
-      Writer w = new OutputStreamWriter(cos,java.nio.charset.StandardCharsets.UTF_8);
-      w.write(input);
-      w.flush();
-      // These two shouldn't be necessary, but they are.
-      cos.flush();
-      cos.close();
-      byte[] bytes = os.toByteArray();
-      return new org.apache.manifoldcf.core.common.Base64().encodeByteArray(bytes);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-        
-  /** Decrypt a string.
-  *@param saltValue is the salt value.
-  *@param passCode is the pass code.
-  *@param input is the input string.
-  *@return the decoded string.
-  */
-  public static String decrypt(String saltValue, String passCode, String input)
-    throws ManifoldCFException
-  {
-    if (input == null)
-      return null;
-    if (input.length() == 0)
-      return input;
-
-    try
-    {
-      ByteArrayInputStream is = new ByteArrayInputStream(new org.apache.manifoldcf.core.common.Base64().decodeString(input));
-      
-      byte[] iv = new byte[IV_LENGTH];
-      int pointer = 0;
-      while (pointer < iv.length)
-      {
-        int amt = is.read(iv,pointer,iv.length-pointer);
-        if (amt == -1)
-          throw new ManifoldCFException("String can't be decrypted: too short");
-        pointer += amt;
-      }
-
-      Cipher cipher = getCipher(saltValue, Cipher.DECRYPT_MODE, passCode, iv);
-      CipherInputStream cis = new CipherInputStream(is, cipher);
-      InputStreamReader reader = new InputStreamReader(cis,java.nio.charset.StandardCharsets.UTF_8);
-      StringBuilder sb = new StringBuilder();
-      char[] buffer = new char[65536];
-      while (true)
-      {
-        int amt = reader.read(buffer,0,buffer.length);
-        if (amt == -1)
-          break;
-        sb.append(buffer,0,amt);
-      }
-      return sb.toString();
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /** Encode a string in a reversible obfuscation.
-  *@param input is the input string.
-  *@return the output string.
-  */
-  /*
-  public static String obfuscate(String input)
-    throws ManifoldCFException
-  {
-      if (input == null)
-        return null;
-      if (input.length() == 0)
-        return input;
-      // First, convert to binary
-      byte[] array = input.getBytes(StandardCharsets.UTF_8);
-      // Shift and xor
-      // We shift by some number not a multiple of 4.
-      // The resulting hexadecimal is then not a simple shift.
-      int i = 0;
-      int carryover = (((int)array[array.length-1]) & 0x1f);
-      while (i < array.length)
-      {
-        int x = (int)array[i];
-        int newCarryover = x & 0x1f;
-        x = ((x >> 5) & 0x7) + (carryover << 3);
-        carryover = newCarryover;
-        array[i++] = (byte)(x ^ 0x59);
-      }
-      // Now, convert to hex
-      StringBuilder rval = new StringBuilder();
-      i = 0;
-      while (i < array.length)
-      {
-        int x = (int)array[i++];
-        rval.append(writeNibble((x >> 4) & 0x0f));
-        rval.append(writeNibble(x & 0x0f));
-      }
-      return rval.toString();
-  }
-*/
-  /** Write a hex nibble.
-  *@param value is the value to write.
-  *@return the character.
-  */
-
-  protected static char writeNibble(int value)
-  {
-    if (value >= 10)
-      return (char)(value-10+'A');
-    else
-      return (char)(value+'0');
-  }
-
-
-  /** Decode a string encoded using the obfuscation
-  * technique.
-  *@param input is the input string.
-  *@return the decoded string.
-  */
-  /*
-  public static String deobfuscate(String input)
-    throws ManifoldCFException
-  {
-      if (input == null)
-        return null;
-      if (input.length() == 0)
-        return input;
-
-      if ((input.length() >> 1) * 2 != input.length())
-        throw new ManifoldCFException("Decoding error",ManifoldCFException.GENERAL_ERROR);
-
-      byte[] bytes = new byte[input.length() >> 1];
-      int i = 0;
-      int j = 0;
-      while (i < input.length())
-      {
-        int x0 = readNibble(input.charAt(i++));
-        int x1 = readNibble(input.charAt(i++));
-        int x = (x0 << 4) + x1;
-        bytes[j++] = (byte)x;
-      }
-
-      // Process the array in reverse order
-      int carryover = ((((int)bytes[0]) ^ 0x59) >> 3) & 0x1f;
-      i = bytes.length;
-      while (i > 0)
-      {
-        i--;
-        int x = ((int)bytes[i]) ^ 0x59;
-        int newCarryover = (x >> 3) & 0x1f;
-        x = (x << 5) + carryover;
-        bytes[i] = (byte)x;
-        carryover = newCarryover;
-      }
-
-      // Convert from utf-8 to a string
-      return new String(bytes,StandardCharsets.UTF_8);
-  }
-  */
-  
-  /** Read a hex nibble.
-  *@param value is the character.
-  *@return the value.
-  */
-  protected static int readNibble(char value)
-    throws ManifoldCFException
-  {
-    if (value >= 'A' && value <= 'F')
-      return (int)(value - 'A' + 10);
-    else if (value >= '0' && value <= '9')
-      return (int)(value - '0');
-    else
-      throw new ManifoldCFException("Bad hexadecimal value",ManifoldCFException.GENERAL_ERROR);
-  }
-
-
-  /** Install system database.
-  *@param threadcontext is the thread context.
-  *@param masterUsername is the master database user name.
-  *@param masterPassword is the master database password.
-  */
-  public static void createSystemDatabase(IThreadContext threadcontext, String masterUsername, String masterPassword)
-    throws ManifoldCFException
-  {
-    String databaseName = getMasterDatabaseName();
-    String databaseUsername = getMasterDatabaseUsername();
-    String databasePassword = getMasterDatabasePassword();
-
-    IDBInterface master = DBInterfaceFactory.make(threadcontext,databaseName,databaseUsername,databasePassword);
-    master.createUserAndDatabase(masterUsername,masterPassword,null);
-  }
-
-  /** Drop system database.
-  *@param threadcontext is the thread context.
-  *@param masterUsername is the master database user name.
-  *@param masterPassword is the master database password.
-  */
-  public static void dropSystemDatabase(IThreadContext threadcontext, String masterUsername, String masterPassword)
-    throws ManifoldCFException
-  {
-    String databaseName = getMasterDatabaseName();
-    String databaseUsername = getMasterDatabaseUsername();
-    String databasePassword = getMasterDatabasePassword();
-
-    IDBInterface master = DBInterfaceFactory.make(threadcontext,databaseName,databaseUsername,databasePassword);
-    master.dropUserAndDatabase(masterUsername,masterPassword,null);
-  }
-
-  /** Create temporary directory.
-  */
-  public static File createTempDir(String prefix, String suffix)
-    throws ManifoldCFException
-  {
-    String tempDirLocation = System.getProperty("java.io.tmpdir");
-    if (tempDirLocation == null)
-      throw new ManifoldCFException("Can't find temporary directory!");
-    File tempDir = new File(tempDirLocation);
-    // Start with current timestamp, and generate a hash, then look for collision
-    long currentFileID = System.currentTimeMillis();
-    long currentFileHash = (currentFileID << 5) ^ (currentFileID >> 3);
-    int raceConditionRepeat = 0;
-    while (raceConditionRepeat < 1000)
-    {
-      File tempCertDir = new File(tempDir,prefix+currentFileHash+suffix);
-      if (tempCertDir.mkdir())
-      {
-        return tempCertDir;
-      }
-      if (tempCertDir.exists())
-      {
-        currentFileHash++;
-        continue;
-      }
-      // Doesn't exist but couldn't create either.  COULD be a race condition; we'll only know if we retry
-      // lots and nothing changes.
-      raceConditionRepeat++;
-      Thread.yield();
-    }
-    throw new ManifoldCFException("Temporary directory appears to be unwritable");
-  }
-
-  /** Add a file to the tracking system. */
-  public static void addFile(File f)
-  {
-    tracker.addFile(f);
-  }
-
-  /** Use the tracking system to delete a file.  You MUST use this to
-  * delete any file that was added to the tracking system with addFile(). */
-  public static void deleteFile(File f)
-  {
-    tracker.deleteFile(f);
-  }
-
-  /** Check if maintenance is underway.
-  */
-  public static boolean checkMaintenanceUnderway()
-  {
-    // File check is always local; this whole bit of logic needs to be rethought though.
-    String fileToCheck = getProperty(maintenanceFileSignalProperty);
-    if (fileToCheck != null && fileToCheck.length() > 0)
-    {
-      File f = new File(fileToCheck);
-      return f.exists();
-    }
-    return false;
-  }
-
-  /** Note configuration change.
-  */
-  public static void noteConfigurationChange()
-    throws ManifoldCFException
-  {
-    // Always a local file.  This needs to be rethought how it should operate in a clustered world.
-    String configChangeSignalCommand = getProperty(configSignalCommandProperty);
-    if (configChangeSignalCommand == null || configChangeSignalCommand.length() == 0)
-      return;
-
-    // Do stuff to the file to note change.  This involves
-    // shelling out to the os and involving whatever is desired.
-
-    // We should try to convert the command into arguments.
-    ArrayList list = new ArrayList();
-    int currentIndex = 0;
-    while (currentIndex < configChangeSignalCommand.length())
-    {
-      // Suck up the leading whitespace
-      while (currentIndex < configChangeSignalCommand.length())
-      {
-        char x = configChangeSignalCommand.charAt(currentIndex);
-        if (x < 0 || x > ' ')
-          break;
-        currentIndex++;
-      }
-      StringBuilder argBuffer = new StringBuilder();
-      boolean isQuoted = false;
-      while (currentIndex < configChangeSignalCommand.length())
-      {
-        char x = configChangeSignalCommand.charAt(currentIndex);
-        if (isQuoted)
-        {
-          if (x == '"')
-          {
-            currentIndex++;
-            isQuoted = false;
-          }
-          else if (x == '\\')
-          {
-            currentIndex++;
-            if (currentIndex < configChangeSignalCommand.length())
-            {
-              x = configChangeSignalCommand.charAt(currentIndex);
-              argBuffer.append(x);
-            }
-            else
-              break;
-          }
-          else
-          {
-            currentIndex++;
-            argBuffer.append(x);
-          }
-        }
-        else
-        {
-          if (x == '"')
-          {
-            currentIndex++;
-            isQuoted = true;
-          }
-          else if (x == '\\')
-          {
-            currentIndex++;
-            if (currentIndex < configChangeSignalCommand.length())
-            {
-              x = configChangeSignalCommand.charAt(currentIndex);
-              argBuffer.append(x);
-            }
-            else
-              break;
-          }
-          else if (x >= 0 && x <= ' ')
-            break;
-          else
-          {
-            currentIndex++;
-            argBuffer.append(x);
-          }
-        }
-      }
-      list.add(argBuffer.toString());
-    }
-
-    // Set up for command invocation
-    String[] commandArray = new String[list.size()];
-    int i = 0;
-    while (i < commandArray.length)
-    {
-      commandArray[i] = (String)list.get(i);
-      i++;
-    }
-
-    if (commandArray.length == 0)
-      return;
-
-    String[] env = new String[0];
-    File dir = new File("/");
-
-    try
-    {
-      // Do the exec.
-      Process p = Runtime.getRuntime().exec(commandArray,env,dir);
-      try
-      {
-        // To make this truly "safe", we really ought to spin up a thread to handle both the standard error and the standard output streams - otherwise
-        // we run the risk of getting blocked here.  In practice, there's enough buffering in the OS to handle what we need right now.
-        int rval = p.waitFor();
-        if (rval != 0)
-        {
-          InputStream is = p.getErrorStream();
-          try
-          {
-            Reader r = new InputStreamReader(is, StandardCharsets.UTF_8);
-            try
-            {
-              BufferedReader br = new BufferedReader(r);
-              try
-              {
-                StringBuilder sb = new StringBuilder();
-                while (true)
-                {
-                  String value = br.readLine();
-                  if (value == null)
-                    break;
-                  sb.append(value).append("; ");
-                }
-                throw new ManifoldCFException("Shelled process '"+configChangeSignalCommand+"' failed with error "+Integer.toString(rval)+": "+sb.toString());
-              }
-              finally
-              {
-                br.close();
-              }
-            }
-            finally
-            {
-              r.close();
-            }
-          }
-          finally
-          {
-            is.close();
-          }
-        }
-      }
-      finally
-      {
-        p.destroy();
-      }
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException("Process wait interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (InterruptedIOException e)
-    {
-      throw new ManifoldCFException("IO with subprocess interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("IO exception signalling change: "+e.getMessage(),e);
-    }
-  }
-
-  /** Use this method to sleep instead of Thread.sleep().  Thread.sleep() doesn't seem to work well when the system
-  * time is reset.
-  */
-  public static void sleep(long milliseconds)
-    throws InterruptedException
-  {
-    // Unfortunately we need to create an object for every time that we sleep
-    Integer x = new Integer(0);
-    synchronized (x)
-    {
-      x.wait(milliseconds);
-    }
-  }
-
-  /** Write a bunch of bytes to the output stream */
-  public static void writeBytes(OutputStream os, byte[] byteArray)
-    throws IOException
-  {
-    os.write(byteArray, 0, byteArray.length);
-  }
-
-  /** Write a byte to an output stream */
-  public static void writeByte(OutputStream os, int byteValue)
-    throws IOException
-  {
-    writeBytes(os,new byte[]{(byte)byteValue});
-  }
-
-  /** Write a word to an output stream */
-  public static void writeWord(OutputStream os, int wordValue)
-    throws IOException
-  {
-    byte[] buffer = new byte[2];
-    buffer[0] = (byte)(wordValue & 0xff);
-    buffer[1] = (byte)((wordValue >>> 8) & 0xff);
-    writeBytes(os,buffer);
-  }
-
-  /** Write a dword to an output stream */
-  public static void writeDword(OutputStream os, int dwordValue)
-    throws IOException
-  {
-    if (dwordValue < 0)
-      throw new IllegalArgumentException("Attempt to use an unsigned operator to write a signed value");
-    writeSdword(os,dwordValue);
-  }
-
-  /** Write a signed dword to an output stream */
-  public static void writeSdword(OutputStream os, int dwordValue)
-    throws IOException
-  {
-    byte[] buffer = new byte[4];
-    buffer[0] = (byte)(dwordValue & 0xff);
-    buffer[1] = (byte)((dwordValue >>> 8) & 0xff);
-    buffer[2] = (byte)((dwordValue >>> 16) & 0xff);
-    buffer[3] = (byte)((dwordValue >>> 24) & 0xff);
-    writeBytes(os, buffer);
-  }
-
-  /** Write a Long to an output stream */
-  public static void writeLong(OutputStream os, Long longValue)
-    throws IOException
-  {
-    if (longValue == null)
-      writeByte(os,1);
-    else
-    {
-      writeByte(os,0);
-      long value = longValue.longValue();
-      byte[] buffer = new byte[8];
-      buffer[0] = (byte)(value & 0xff);
-      buffer[1] = (byte)(Long.rotateRight(value,8) & 0xff);
-      buffer[2] = (byte)(Long.rotateRight(value,16) & 0xff);
-      buffer[3] = (byte)(Long.rotateRight(value,24) & 0xff);
-      buffer[4] = (byte)(Long.rotateRight(value,32) & 0xff);
-      buffer[5] = (byte)(Long.rotateRight(value,40) & 0xff);
-      buffer[6] = (byte)(Long.rotateRight(value,48) & 0xff);
-      buffer[7] = (byte)(Long.rotateRight(value,56) & 0xff);
-      writeBytes(os,buffer);
-    }
-  }
-
-  /** Write a String to an output stream */
-  public static void writeString(OutputStream os, String stringValue)
-    throws IOException
-  {
-    byte[] characters;
-    if (stringValue == null)
-      characters = null;
-    else
-      characters = stringValue.getBytes(StandardCharsets.UTF_8);
-    writeByteArray(os, characters);
-  }
-
-  /** Write a byte array to an output stream */
-  public static void writeByteArray(OutputStream os, byte[] byteArray)
-    throws IOException
-  {
-    if (byteArray == null)
-      writeSdword(os,-1);
-    else
-    {
-      writeSdword(os,byteArray.length);
-      writeBytes(os,byteArray);
-    }
-  }
-
-  /** Write a float value to an output stream */
-  public static void writefloat(OutputStream os, float floatValue)
-    throws IOException
-  {
-    writeSdword(os, Float.floatToIntBits(floatValue));
-  }
-
-  /** Read  bytes from the input stream into specified array. */
-  public static void readBytes(InputStream is, byte[] byteArray)
-    throws IOException
-  {
-    int amtSoFar = 0;
-    while (amtSoFar < byteArray.length)
-    {
-      int amt = is.read(byteArray,amtSoFar,byteArray.length-amtSoFar);
-      if (amt == -1)
-        throw new IOException("Unexpected EOF");
-      amtSoFar += amt;
-    }
-  }
-
-  /** Read a byte from an input stream */
-  public static int readByte(InputStream is)
-    throws IOException
-  {
-    byte[] inputArray = new byte[1];
-    readBytes(is,inputArray);
-    return ((int)inputArray[0]) & 0xff;
-  }
-
-  /** Read a word from an input stream */
-  public static int readWord(InputStream is)
-    throws IOException
-  {
-    byte[] inputArray = new byte[2];
-    readBytes(is,inputArray);
-    return (((int)inputArray[0]) & 0xff) +
-      ((((int)inputArray[1]) & 0xff) << 8);
-  }
-
-  /** Read a dword from an input stream */
-  public static int readDword(InputStream is)
-    throws IOException
-  {
-    byte[] inputArray = new byte[4];
-    readBytes(is,inputArray);
-    return (((int)inputArray[0]) & 0xff) +
-      ((((int)inputArray[1]) & 0xff) << 8) +
-      ((((int)inputArray[2]) & 0xff) << 16) +
-      ((((int)inputArray[3]) & 0xff) << 24);
-  }
-
-  /** Read a signed dword from an input stream */
-  public static int readSdword(InputStream is)
-    throws IOException
-  {
-    byte[] inputArray = new byte[4];
-    readBytes(is,inputArray);
-    return (((int)inputArray[0]) & 0xff) +
-      ((((int)inputArray[1]) & 0xff) << 8) +
-      ((((int)inputArray[2]) & 0xff) << 16) +
-      (((int)inputArray[3]) << 24);
-  }
-
-  /** Read a Long from an input stream */
-  public static Long readLong(InputStream is)
-    throws IOException
-  {
-    int value = readByte(is);
-    if (value == 1)
-      return null;
-    byte[] inputArray = new byte[8];
-    readBytes(is,inputArray);
-    return new Long((long)(((int)inputArray[0]) & 0xff) +
-      Long.rotateLeft(((int)inputArray[1]) & 0xff, 8) +
-      Long.rotateLeft(((int)inputArray[2]) & 0xff, 16) +
-      Long.rotateLeft(((int)inputArray[3]) & 0xff, 24) +
-      Long.rotateLeft(((int)inputArray[4]) & 0xff, 32) +
-      Long.rotateLeft(((int)inputArray[5]) & 0xff, 40) +
-      Long.rotateLeft(((int)inputArray[6]) & 0xff, 48) +
-      Long.rotateLeft(((int)inputArray[7]) & 0xff, 56));
-
-  }
-
-  /** Read a String from an input stream */
-  public static String readString(InputStream is)
-    throws IOException
-  {
-    byte[] bytes = readByteArray(is);
-    if (bytes == null)
-      return null;
-    return new String(bytes,StandardCharsets.UTF_8);
-  }
-
-  /** Read a byte array from an input stream */
-  public static byte[] readByteArray(InputStream is)
-    throws IOException
-  {
-    int length = readSdword(is);
-    if (length == -1)
-      return null;
-    byte[] byteArray = new byte[length];
-    readBytes(is,byteArray);
-    return byteArray;
-  }
-
-  /** Read a float value from an input stream */
-  public static float readfloat(InputStream os)
-    throws IOException
-  {
-    return Float.intBitsToFloat(readSdword(os));
-  }
-
-  /** Add a cleanup hook to the list.  These hooks will be evaluated in the
-  * reverse order than the order in which they were added.
-  *@param hook is the shutdown hook that needs to be added to the sequence.
-  */
-  public static void addShutdownHook(IShutdownHook hook)
-  {
-    synchronized (cleanupHooks)
-    {
-      cleanupHooks.add(hook);
-    }
-  }
-
-  /** Add a polling hook to the list.  These hooks will be evaluated in the
-  * order they were added.
-  *@param hook is the polling hook that needs to be added to the sequence.
-  */
-  public static void addPollingHook(IPollingHook hook)
-  {
-    synchronized (pollingHooks)
-    {
-      pollingHooks.add(hook);
-    }
-  }
-  
-  /** Poll all the registered polling services.
-  */
-  public static void pollAll(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    synchronized (pollingHooks)
-    {
-      for (IPollingHook hook : pollingHooks)
-      {
-        hook.doPoll(threadContext);
-      }
-    }
-  }
-  
-  /** Create a new resource loader based on the default one.  This is used by
-  * connectors wishing to make their own resource loaders for isolation purposes.
-  */
-  public static ManifoldCFResourceLoader createResourceLoader()
-    throws ManifoldCFException
-  {
-    return new ManifoldCFResourceLoader(resourceLoader.getClassLoader());
-  }
-  
-  /** Locate a class in the configuration-determined class path.  This method
-  * is designed for loading plugin classes, and their downstream dependents.
-  */
-  public static Class findClass(String cname)
-    throws ClassNotFoundException,ManifoldCFException
-  {
-    return resourceLoader.findClass(cname);
-  }
-  
-  /** Perform system shutdown, minting thread context for backwards compatibility */
-  @Deprecated
-  public static void cleanUpEnvironment()
-  {
-    cleanUpEnvironment(ThreadContextFactory.make());
-  }
-  
-  /** Perform system shutdown, using the registered shutdown hooks. */
-  public static void cleanUpEnvironment(IThreadContext threadContext)
-  {
-    synchronized (initializeFlagLock)
-    {
-      initializeLevel--;
-      // It needs to call all registered shutdown hooks, in reverse order.
-      // A failure of any one hook should cause the cleanup to continue, after a logging attempt is made.
-      if (initializeLevel == 0 && !alreadyShutdown)
-      {
-        synchronized (cleanupHooks)
-        {
-          int i = cleanupHooks.size();
-          while (i > 0)
-          {
-            i--;
-            IShutdownHook hook = cleanupHooks.get(i);
-            try
-            {
-              hook.doCleanup(threadContext);
-            }
-            catch (ManifoldCFException e)
-            {
-              Logging.root.warn("Error during system shutdown: "+e.getMessage(),e);
-            }
-          }
-          cleanupHooks.clear();
-        }
-        synchronized (pollingHooks)
-        {
-          pollingHooks.clear();
-        }
-        alreadyShutdown = true;
-      }
-    }
-  }
-
-  /** Class that tracks files that need to be cleaned up on exit */
-  protected static class FileTrack implements IShutdownHook
-  {
-    /** Set of File objects */
-    protected Set<File> filesToDelete = new HashSet<File>();
-
-    /** Constructor */
-    public FileTrack()
-    {
-    }
-
-    /** Add a file to track */
-    public void addFile(File f)
-    {
-      synchronized (this)
-      {
-        filesToDelete.add(f);
-      }
-    }
-
-    /** Delete a file */
-    public void deleteFile(File f)
-    {
-      // Because we never reuse file names, it is OK to delete twice.
-      // So the delete() can be outside the synchronizer.
-      recursiveDelete(f);
-      synchronized (this)
-      {
-        filesToDelete.remove(f);
-      }
-    }
-
-    /** Delete all remaining files */
-    @Override
-    public void doCleanup(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      synchronized (this)
-      {
-	Iterator<File> iter = filesToDelete.iterator();
-	while (iter.hasNext())
-	{
-	  File f = iter.next();
-	  f.delete();
-	}
-	filesToDelete.clear();
-      }
-    }
-
-    /** Finalizer, which is designed to catch class unloading that tomcat 5.5 does.
-    */
-    protected void finalize()
-      throws Throwable
-    {
-      try
-      {
-        doCleanup(ThreadContextFactory.make());
-      }
-      finally
-      {
-        super.finalize();
-      }
-    }
-
-  }
-
-  
-  /** Class that cleans up expired cache objects on polling.
-  */
-  protected static class CachePoll implements IPollingHook
-  {
-    public CachePoll()
-    {
-    }
-    
-    @Override
-    public void doPoll(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      ICacheManager cacheManager = CacheManagerFactory.make(threadContext);
-      cacheManager.expireObjects(System.currentTimeMillis());
-    }
-  }
-  
-  /** Class that cleans up database handles on exit */
-  protected static class DatabaseShutdown implements IShutdownHook
-  {
-    public DatabaseShutdown()
-    {
-    }
-    
-    @Override
-    public void doCleanup(IThreadContext threadContext)
-      throws ManifoldCFException
-    {
-      // Clean up the database handles
-      Thread t = new DatabaseConnectionReleaseThread();
-      t.start();
-      try
-      {
-        // Wait 15 seconds for database cleanup to finish.  If we haven't managed to close database connections by then, we give up and just exit.
-        t.join(15000L);
-      }
-      catch (InterruptedException e)
-      {
-      }
-      closeDatabase();
-    }
-    
-    protected void closeDatabase()
-      throws ManifoldCFException
-    {
-      synchronized (initializeFlagLock)
-      {
-        if (initializeLevel == 0 && !alreadyClosed)
-        {
-          IThreadContext threadcontext = ThreadContextFactory.make();
-          
-          String databaseName = getMasterDatabaseName();
-          String databaseUsername = getMasterDatabaseUsername();
-          String databasePassword = getMasterDatabasePassword();
-
-          DBInterfaceFactory.make(threadcontext,databaseName,databaseUsername,databasePassword).closeDatabase();
-          alreadyClosed = true;
-        }
-      }
-    }
-    
-    /** Finalizer, which is designed to catch class unloading that tomcat 5.5 does.
-    */
-    protected void finalize()
-      throws Throwable
-    {
-      try
-      {
-        // The database handle cleanup is handled inside the finalizers for the pools that hold onto connections.
-        closeDatabase();
-      }
-      finally
-      {
-        super.finalize();
-      }
-    }
-
-  }
-  
-  /** Finisher thread, to be registered with the runtime */
-  protected static class ShutdownThread extends Thread
-  {
-    /** Constructor.
-    */
-    public ShutdownThread()
-    {
-      super();
-      setName("Shutdown thread");
-    }
-
-    public void run()
-    {
-      // This thread is run at shutdown time.
-      cleanUpEnvironment(ThreadContextFactory.make());
-    }
-  }
-
-  /** The thread that actually releases database connections
-  */
-  protected static class DatabaseConnectionReleaseThread extends Thread
-  {
-    /** Constructor. */
-    public DatabaseConnectionReleaseThread()
-    {
-      super();
-      setName("Database connection release thread");
-      // May be abandoned if it takes too long
-      setDaemon(true);
-    }
-
-    public void run()
-    {
-      // Clean up the database handles
-      org.apache.manifoldcf.core.database.ConnectionFactory.releaseAll();
-    }
-  }
-}
-
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCFResourceLoader.java b/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCFResourceLoader.java
deleted file mode 100644
index 018a5da..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCFResourceLoader.java
+++ /dev/null
@@ -1,192 +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 org.apache.manifoldcf.core.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.net.MalformedURLException;
-import java.util.*;
-import java.io.*;
-
-/** An instance of this class is capable of minting URLClassLoader objects on
-* demand, for the purpose of loading plugins.
-*/
-public class ManifoldCFResourceLoader
-{
-  public static final String _rcsid = "@(#)$Id: ManifoldCFResourceLoader.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The parent class loader */
-  protected ClassLoader parent;
-  /** The class loader we're caching */
-  protected ClassLoader classLoader = null;
-  /** The current 'classpath' - a list of File objects */
-  protected ArrayList currentClasspath = new ArrayList();
-  
-  /** Construct a resource manager.
-  *@param parent is the parent class loader.
-  */
-  public ManifoldCFResourceLoader(ClassLoader parent)
-    throws ManifoldCFException
-  {
-    this.parent = parent;
-  }
-
-  /** Set the classpath to a given list of libdirs.
-  *@param libdirList is an arraylist of File objects, each representing a directory.
-  */
-  public synchronized void setClassPath(ArrayList libdirList)
-    throws ManifoldCFException
-  {
-    if (currentClasspath.size() > 0)
-    {
-      currentClasspath.clear();
-      classLoader = null;
-    }
-    int i = 0;
-    while (i < libdirList.size())
-    {
-      File dir = (File)libdirList.get(i++);
-      addToClassPath(dir,null);
-    }
-  }
-  
-  /** Clear the class-search path.
-  */
-  public synchronized void clearClassPath()
-  {
-    if (currentClasspath.size() == 0)
-      return;
-    currentClasspath.clear();
-    classLoader = null;
-  }
-  
-  /** Add to the class-search path.
-  *@param file is the jar or class root.
-  */
-  public synchronized void addToClassPath(final File file)
-    throws ManifoldCFException
-  {
-    if (file.canRead())
-    {
-      addDirsToClassPath(new File[]{file.getParentFile()},
-        new FileFilter[]{new FileFilter() {
-          public boolean accept(final File pathname)
-          {
-            return pathname.equals(file);
-          }
-        } } );
-    }
-    else
-      throw new ManifoldCFException("Path '"+file.toString()+"' does not exist or is not readable");
-  }
-  
-  /** Add to the class-search path.
-  *@param dir is the directory to add.
-  *@param filter is the file filter to use on that directory.
-  */
-  public synchronized void addToClassPath(File dir, FileFilter filter)
-    throws ManifoldCFException
-  {
-    addDirsToClassPath(new File[]{dir}, new FileFilter[]{filter});
-  }
-
-  /** Get the class loader representing this resource loader.
-  */
-  public synchronized ClassLoader getClassLoader()
-    throws ManifoldCFException
-  {
-    if (classLoader == null)
-    {
-      // Mint a class loader on demand
-      if (currentClasspath.size() == 0)
-        classLoader = parent;
-      else
-      {
-        URL[] elements = new URL[currentClasspath.size()];
-        
-        for (int j = 0; j < currentClasspath.size(); j++)
-        {
-          try
-          {
-            URL element = ((File)currentClasspath.get(j)).toURI().normalize().toURL();
-            elements[j] = element;
-          }
-          catch (MalformedURLException e)
-          {
-            // Should never happen, but...
-            throw new ManifoldCFException(e.getMessage(),e);
-          }
-        }
-        classLoader = URLClassLoader.newInstance(elements, parent);
-      }
-    }
-    return classLoader;
-  }
-  
-  /** Get the specified class using the proper classloader.
-  *@param cname is the fully-qualified class name.
-  */
-  public Class findClass(String cname)
-    throws ClassNotFoundException,ManifoldCFException
-  {
-    // If we ever get this far, we have a classloader at least...
-    return Class.forName(cname,true,getClassLoader());
-  }
-
-  /** Add fully-resolved directories (with filters) to the current class path.
-  *@param baseList is the list of library directories.
-  *@param filterList is the corresponding list of filters.
-  */
-  protected void addDirsToClassPath(File[] baseList, FileFilter[] filterList)
-    throws ManifoldCFException
-  {
-    int i = 0;
-    while (i < baseList.length)
-    {
-      File base = baseList[i];
-      FileFilter filter;
-      if (filterList != null)
-        filter = filterList[i];
-      else
-        filter = null;
-      
-      if (base.canRead() && base.isDirectory())
-      {
-        File[] files = base.listFiles(filter);
-        
-        if (files != null && files.length > 0)
-        {
-          int j = 0;
-          while (j < files.length)
-          {
-            File file = files[j++];
-            currentClasspath.add(file);
-            // Invalidate the current classloader
-            classLoader = null;
-          }
-        }
-      }
-      else
-        throw new ManifoldCFException("Supposed directory '"+base.toString()+"' is either not a directory, or is unreadable.");
-      i++;
-    }
-  }
-  
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/threadcontext/ThreadContext.java b/framework/core/src/main/java/org/apache/manifoldcf/core/threadcontext/ThreadContext.java
deleted file mode 100644
index da59295..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/threadcontext/ThreadContext.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $Id: ThreadContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.threadcontext;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** Thread context implementation
-*/
-public class ThreadContext implements IThreadContext
-{
-  public static final String _rcsid = "@(#)$Id: ThreadContext.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected Hashtable hashtable = new Hashtable();
-
-  public ThreadContext()
-  {
-  }
-
-  /** Set a named object into the context.
-  * @param key is the name of the object (usually a string)
-  * @param object is the object to save, or null if the object is to be
-  * destroyed instead.
-  */
-  public void save(Object key, Object object)
-  {
-    if (object == null)
-      hashtable.remove(key);
-    else
-      hashtable.put(key,object);
-  }
-
-  /** Retrieve a named object from the context.
-  * Use an equivalent key to retrieve what was previously saved.
-  * If no such object exists, null will be returned.
-  * @param key is the object's key (usually a string)
-  * @return the object, or null.
-  */
-  public Object get(Object key)
-  {
-    return hashtable.get(key);
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/util/Converter.java b/framework/core/src/main/java/org/apache/manifoldcf/core/util/Converter.java
deleted file mode 100644
index dc59f1e..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/util/Converter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.util;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Various useful converter methods for working with JDBC output
-*/
-public class Converter
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Convert a JDBC output value to a double.
-  */
-  public static double asDouble(Object o)
-    throws ManifoldCFException
-  {
-    if (o instanceof Double)
-      return ((Double)o).doubleValue();
-    if (o instanceof String)
-      return new Double((String)o).doubleValue();
-    if (o instanceof Float)
-      return (double)((Float)o).floatValue();
-    if (o instanceof Long)
-      return (double)((Long)o).longValue();
-    throw new ManifoldCFException("Can't convert to double");
-  }
-
-  /** Convert a JDBC output value to a long.
-  */
-  public static long asLong(Object o)
-    throws ManifoldCFException
-  {
-    if (o instanceof Long)
-      return ((Long)o).longValue();
-    if (o instanceof Double)
-      return (long)((Double)o).doubleValue();
-    if (o instanceof String)
-      return new Long((String)o).longValue();
-    if (o instanceof Float)
-      return (long)((Float)o).floatValue();
-    throw new ManifoldCFException("Can't convert to long");
-  }
-
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/util/URLDecoder.java b/framework/core/src/main/java/org/apache/manifoldcf/core/util/URLDecoder.java
deleted file mode 100644
index aafc2f6..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/util/URLDecoder.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.manifoldcf.core.util;
-
-/*
- * 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.
- */
-
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
-
-/**
- * Wrapper of {@link java.net.URLDecoder}
- * Intends to replace java.net.URLDecoder.decode(String s, "UTF-8")
- * avoiding {@link UnsupportedEncodingException} handling.
- * {@link StandardCharsets} are guaranteed to be available
- * on every implementation of the Java platform.
- *
- * @since 1.7
- */
-public class URLDecoder {
-
-  public static String decode(String s) {
-
-    String str = null;
-
-    try {
-      str = java.net.URLDecoder.decode(s, StandardCharsets.UTF_8.name());
-    } catch (UnsupportedEncodingException e) {
-      // Can't happen. java.nio.charset.StandardCharsets are guaranteed
-      // to be available on every implementation of the Java platform.
-      throw new RuntimeException("UTF-8 not supported " + e.getMessage(), e);
-    }
-
-    return str;
-  }
-}
diff --git a/framework/core/src/main/java/org/apache/manifoldcf/core/util/URLEncoder.java b/framework/core/src/main/java/org/apache/manifoldcf/core/util/URLEncoder.java
deleted file mode 100644
index 34b34c8..0000000
--- a/framework/core/src/main/java/org/apache/manifoldcf/core/util/URLEncoder.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.manifoldcf.core.util;
-
-/*
- * 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.
- */
-
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
-
-/**
- * Wrapper of {@link java.net.URLEncoder}
- * Intends to replace java.net.URLEncoder.encode(String s, "UTF-8")
- * avoiding {@link UnsupportedEncodingException} handling.
- * {@link StandardCharsets} are guaranteed to be available
- * on every implementation of the Java platform.
- *
- * @since 1.7
- */
-public class URLEncoder {
-
-  public static String encode(String s) {
-
-    String str = null;
-
-    try {
-      str = java.net.URLEncoder.encode(s, StandardCharsets.UTF_8.name());
-    } catch (UnsupportedEncodingException e) {
-      // Can't happen. java.nio.charset.StandardCharsets are guaranteed
-      // to be available on every implementation of the Java platform.
-      throw new RuntimeException("UTF-8 not supported " + e.getMessage(), e);
-    }
-
-    return str;
-  }
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/common/DateTest.java b/framework/core/src/test/java/org/apache/manifoldcf/core/common/DateTest.java
deleted file mode 100644
index 9f59fac..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/common/DateTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.common;
-
-import java.util.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class DateTest
-{
-
-  @Test
-  public void iso8601()
-    throws Exception
-  {
-    Date d = DateParser.parseISO8601Date("96-11-15T01:32:33.344GMT");
-    assertNotNull(d);
-    Date d2 = DateParser.parseISO8601Date("1996-11-15T01:32:33.344Z");
-    assertNotNull(d2);
-    assertEquals(d,d2);
-    d = DateParser.parseISO8601Date("2012-11-15T01:32:33Z");
-    assertNotNull(d);
-    d = DateParser.parseISO8601Date("2012-11-15T01:32:33+0100");
-    assertNotNull(d);
-    d = DateParser.parseISO8601Date("2012-11-15T01:32:33-03:00");
-    assertNotNull(d);
-    d = DateParser.parseISO8601Date("2012-11-15T01:32:33GMT-03:00");
-    assertNotNull(d);
-    d = DateParser.parseISO8601Date("2012-11-15T01:32:33.001-04:00");
-    assertNotNull(d);
-    // Microsoft variation
-    d = DateParser.parseISO8601Date("2014-06-03 11:21:37");
-    assertNotNull(d);
-  }
-
-
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/interfaces/ConfigurationTest.java b/framework/core/src/test/java/org/apache/manifoldcf/core/interfaces/ConfigurationTest.java
deleted file mode 100644
index e842288..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/interfaces/ConfigurationTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.interfaces;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import org.junit.*;
-
-/** This tester exercises the configuration hierarchy, and assures that the conversion
-* to/from XML and JSON works properly.
-*/
-public class ConfigurationTest {
-  
-  private final static String testData = "{\"job\":{\"id\":\"1505233221607\",\"description\":\"unit test: job\",\"repository_connection\":\"unit test: Repository connection\",\"document_specification\":{\"security\":{\"_value_\":\"\",\"_attribute_value\":\"off\"},\"parentfoldersecurity\":{\"_value_\":\"\",\"_attribute_value\":\"off\"},\"startpoint\":[{\"_value_\":\"\",\"_attribute_path\":\"attribute path one\",\"include\":[{\"_value_\":\"\",\"_attribute_filespec\":\"*\",\"_attribute_type\":\"directory\"},{\"_value_\":\"\",\"_attribute_filespec\":\"*.msg\",\"_attribute_type\":\"file\"}]},{\"_value_\":\"\",\"_attribute_path\":\"attribute path two\",\"include\":[{\"_value_\":\"\",\"_attribute_filespec\":\"*\",\"_attribute_type\":\"directory\"},{\"_value_\":\"\",\"_attribute_filespec\":\"*.msg\",\"_attribute_type\":\"file\"}]}],\"sharesecurity\":{\"_value_\":\"\",\"_attribute_value\":\"off\"}},\"pipelinestage\":[{\"stage_id\":\"0\",\"stage_isoutput\":\"true\",\"stage_connectionname\":\"unit test: Output connection\",\"stage_specification\":{}},{\"stage_id\":\"1\",\"stage_prerequisite\":\"0\",\"stage_isoutput\":\"true\",\"stage_connectionname\":\"unit test: Output connection\",\"stage_specification\":{}}],\"start_mode\":\"manual\",\"run_mode\":\"scan once\",\"hopcount_mode\":\"accurate\",\"priority\":\"5\",\"recrawl_interval\":\"infinite\",\"expiration_interval\":\"infinite\",\"reseed_interval\":\"infinite\",\"schedule\":{\"requestminimum\":\"false\",\"dayofmonth\":{\"value\":[\"1\",\"15\"]}}}}";
-
-  @Test
-  public void testNakedValue()
-    throws ManifoldCFException {
-      
-    // Deserialize first
-    final Configuration object2 = new Configuration();
-    object2.fromJSON(testData);
-
-    // Now, reserialize
-    final String jsonResult = object2.toJSON();
-    
-    // Can't compare in this way; ordering of the input is not consistent.
-    //Assert.assertEquals(jsonResult, testData);
-    Assert.assertEquals(jsonResult.length(), testData.length());
-  }
-  
-  @Test
-  public void testBackAndForth()
-    throws ManifoldCFException {
-    // Create a Configuration structure
-    ConfigurationNode connectionObject;
-    ConfigurationNode child;
-    Configuration requestObject;
-    Configuration result;
-
-    connectionObject = new ConfigurationNode("repositoryconnection");
-    
-    child = new ConfigurationNode("name");
-    child.setValue("File Connection");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-    child = new ConfigurationNode("class_name");
-    child.setValue("org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-      
-    child = new ConfigurationNode("description");
-    child.setValue("File Connection");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-
-    child = new ConfigurationNode("max_connections");
-    child.setValue("100");
-    connectionObject.addChild(connectionObject.getChildCount(),child);
-
-    requestObject = new Configuration();
-    requestObject.addChild(0,connectionObject);
-    
-    final String jsonResult = requestObject.toJSON();
-    
-    Assert.assertEquals("{\"repositoryconnection\":{\"name\":\"File Connection\",\"class_name\":\"org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector\",\"description\":\"File Connection\",\"max_connections\":\"100\"}}".length(), jsonResult.length());
-    
-    Configuration object2 = new Configuration();
-    object2.fromJSON(jsonResult);
-    
-    final String newResult = object2.toJSON();
-    Assert.assertEquals(jsonResult.length(), newResult.length());
-    //Assert.assertTrue(requestObject.equals(object2));
-  }
-  
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/TestZooKeeperLocks.java b/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/TestZooKeeperLocks.java
deleted file mode 100644
index 1dc264e..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/TestZooKeeperLocks.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-import java.util.concurrent.atomic.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class TestZooKeeperLocks extends ZooKeeperBase
-{
-  protected File synchDir = null;
-  
-  protected final static int readerThreadCount = 10;
-  protected final static int writerThreadCount = 5;
-
-  @Test
-  public void multiThreadZooKeeperLockTest()
-    throws Exception
-  {
-    // First, set off the threads
-    ZooKeeperConnectionPool pool = new ZooKeeperConnectionPool("localhost:8348",2000);
-    LockObjectFactory factory = new ZooKeeperLockObjectFactory(pool);
-
-    runTest(factory);
-  }
-  
-  @Before
-  public void createSynchDir()
-    throws Exception
-  {
-    synchDir = new File("synchdir");
-    synchDir.mkdir();
-  }
-
-  @After
-  public void removeSynchDir()
-    throws Exception
-  {
-    if (synchDir != null)
-      deleteRecursively(synchDir);
-    synchDir = null;
-  }
-  
-  @Test
-  public void multiThreadFileLockTest()
-    throws Exception
-  {
-    runTest(new FileLockObjectFactory(synchDir));
-  }
-  
-  protected static void runTest(LockObjectFactory factory)
-    throws Exception
-  {
-    String lockKey = "testkey";
-    AtomicInteger ai = new AtomicInteger(0);
-    
-    ReaderThread[] readerThreads = new ReaderThread[readerThreadCount];
-    for (int i = 0 ; i < readerThreadCount ; i++)
-    {
-      readerThreads[i] = new ReaderThread(factory, lockKey, ai);
-      readerThreads[i].start();
-    }
-
-    WriterThread[] writerThreads = new WriterThread[writerThreadCount];
-    for (int i = 0 ; i < writerThreadCount ; i++)
-    {
-      writerThreads[i] = new WriterThread(factory, lockKey, ai);
-      writerThreads[i].start();
-    }
-    
-    for (int i = 0 ; i < readerThreadCount ; i++)
-    {
-      Throwable e = readerThreads[i].finishUp();
-      if (e != null)
-      {
-        if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        if (e instanceof Error)
-          throw (Error)e;
-        if (e instanceof Exception)
-          throw (Exception)e;
-      }
-    }
-    
-    for (int i = 0 ; i < writerThreadCount ; i++)
-    {
-      Throwable e = writerThreads[i].finishUp();
-      if (e != null)
-      {
-        if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        if (e instanceof Error)
-          throw (Error)e;
-        if (e instanceof Exception)
-          throw (Exception)e;
-      }
-    }
-    
-  }
-  
-  protected static void enterReadLock(Long threadID, LockGate lo)
-    throws Exception
-  {
-    try
-    {
-      lo.enterReadLock(threadID);
-    }
-    catch (ExpiredObjectException e)
-    {
-      throw new ManifoldCFException("Unexpected exception: "+e.getMessage(),e);
-    }
-  }
-  
-  protected static void leaveReadLock(LockGate lo)
-    throws Exception
-  {
-    try
-    {
-      lo.leaveReadLock();
-    }
-    catch (ExpiredObjectException e)
-    {
-      throw new ManifoldCFException("Unexpected exception: "+e.getMessage(),e);
-    }
-  }
-
-  protected static void enterWriteLock(Long threadID, LockGate lo)
-    throws Exception
-  {
-    try
-    {
-      lo.enterWriteLock(threadID);
-    }
-    catch (ExpiredObjectException e)
-    {
-      throw new ManifoldCFException("Unexpected exception: "+e.getMessage(),e);
-    }
-  }
-  
-  protected static void leaveWriteLock(LockGate lo)
-    throws Exception
-  {
-    try
-    {
-      lo.leaveWriteLock();
-    }
-    catch (ExpiredObjectException e)
-    {
-      throw new ManifoldCFException("Unexpected exception: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Reader thread */
-  protected static class ReaderThread extends Thread
-  {
-    protected final LockObjectFactory factory;
-    protected final Object lockKey;
-    protected final AtomicInteger ai;
-    protected final Long threadID;
-
-    protected Throwable exception = null;
-    
-    public ReaderThread(LockObjectFactory factory, Object lockKey, AtomicInteger ai)
-    {
-      setName("reader");
-      this.factory = factory;
-      this.lockKey = lockKey;
-      this.ai = ai;
-      this.threadID = Thread.currentThread().getId();
-    }
-    
-    public void run()
-    {
-      try
-      {
-        // Create a new lock pool since that is the best way to insure real
-        // zookeeper action.
-        LockPool lp = new LockPool(factory);
-        LockGate lo;
-        // First test: count all reader threads inside read lock.
-        // This guarantees that read locks are non-exclusive.
-        // Enter read lock
-        System.out.println("Entering read lock");
-        lo = lp.getObject(lockKey);
-        enterReadLock(threadID,lo);
-        try
-        {
-          System.out.println(" Read lock entered!");
-          // Count this thread
-          ai.incrementAndGet();
-          // Wait until all readers have been counted.  This test will hang if the readers function
-          // exclusively
-          while (ai.get() < readerThreadCount)
-          {
-            Thread.sleep(10L);
-          }
-        }
-        finally
-        {
-          System.out.println("Leaving read lock");
-          leaveReadLock(lo);
-          System.out.println(" Left read lock!");
-        }
-        // Now, all the writers will get involved; we just need to make sure we never see an inconsistent value
-        while (ai.get() < readerThreadCount + 2*writerThreadCount)
-        {
-          System.out.println("Waiting for all write threads to succeed...");
-          lo = lp.getObject(lockKey);
-          enterReadLock(threadID,lo);
-          try
-          {
-            // The writer thread will increment the counter twice for every thread, both times within the lock.
-            // We never want to see the intermediate values.
-            if ((ai.get() - readerThreadCount) % 2 == 1)
-              throw new Exception("Was able to read when write lock in place");
-          }
-          finally
-          {
-            leaveReadLock(lo);
-          }
-          Thread.sleep(100L);
-        }
-        System.out.println("Done with reader thread");
-      }
-      catch (InterruptedException e)
-      {
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public Throwable finishUp()
-      throws InterruptedException
-    {
-      join();
-      return exception;
-    }
-    
-  }
-
-  /** Writer thread */
-  protected static class WriterThread extends Thread
-  {
-    protected final LockObjectFactory factory;
-    protected final Object lockKey;
-    protected final AtomicInteger ai;
-    protected final Long threadID;
-    
-    protected Throwable exception = null;
-    
-    public WriterThread(LockObjectFactory factory, Object lockKey, AtomicInteger ai)
-    {
-      setName("writer");
-      this.factory = factory;
-      this.lockKey = lockKey;
-      this.ai = ai;
-      this.threadID = Thread.currentThread().getId();
-    }
-    
-    public void run()
-    {
-      try
-      {
-        // Create a new lock pool since that is the best way to insure real
-        // zookeeper action.
-        // LockPool is a dummy
-        LockPool lp = new LockPool(factory);
-        LockGate lo;
-        // The reader threads require ALL of the readers to get into the protected area.  If
-        // we try to write before that happens, ordering requirements produce a deadlock.  So wait.
-        while (ai.get() < readerThreadCount)
-        {
-          Thread.sleep(100L);
-        }
-        
-        /*
-        // Take write locks but free them immediately if read is what's active
-        while (true)
-        {
-          lo = lp.getObject(lockKey);
-          enterWriteLock(threadID,lo);
-          try
-          {
-            System.out.println("Made it into read-time write lock");
-            // Check if we made it in during read cycle... that would be bad.
-            if (ai.get() > 0 && ai.get() < readerThreadCount)
-              throw new Exception("Was able to write even when readers were active");
-            if (ai.get() >= readerThreadCount)
-              break;
-          }
-          finally
-          {
-            System.out.println("Leaving read-time write lock");
-            leaveWriteLock(lo);
-            System.out.println("Left read-time write lock");
-          }
-          Thread.sleep(1000L);
-        }
-        */
-        
-        // Get write lock, increment twice, and leave write lock.  Meanwhile, reader threads will be trying to gain access.
-        lo = lp.getObject(lockKey);
-        enterWriteLock(threadID,lo);
-        try
-        {
-          if ((ai.get() - readerThreadCount) % 2 == 1)
-            throw new Exception("More than one writer thread active at the same time!");
-          ai.incrementAndGet();
-          // Keep the lock for a while so other threads have to wait
-          Thread.sleep(50L);
-          // Increment again
-          ai.incrementAndGet();
-          System.out.println("Updated write count");
-        }
-        finally
-        {
-          leaveWriteLock(lo);
-        }
-        // Completed successfully!
-      }
-      catch (InterruptedException e)
-      {
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public Throwable finishUp()
-      throws InterruptedException
-    {
-      join();
-      return exception;
-    }
-    
-  }
-  
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperBase.java b/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperBase.java
deleted file mode 100644
index 436df9d..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperBase.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class ZooKeeperBase
-{
-  protected File tempDir;
-  protected ZooKeeperInstance instance;
-  
-  @Before
-  public void startZooKeeper()
-    throws Exception
-  {
-    tempDir = new File("zookeeper");
-    tempDir.mkdir();
-    instance = new ZooKeeperInstance(8348,tempDir);
-    instance.start();
-  }
-  
-  @After
-  public void stopZookeeper()
-    throws Exception
-  {
-    instance.stop();
-    deleteRecursively(tempDir);
-  }
-  
-  protected static void deleteRecursively(File tempDir)
-    throws Exception
-  {
-    if (tempDir.isDirectory())
-    {
-      File[] files = tempDir.listFiles();
-      for (File f : files)
-      {
-        deleteRecursively(f);
-      }
-    }
-    tempDir.delete();
-  }
-  
-
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperInstance.java b/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperInstance.java
deleted file mode 100644
index 75f99d6..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/lockmanager/ZooKeeperInstance.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.lockmanager;
-
-import java.util.*;
-import java.io.*;
-import org.apache.zookeeper.server.*;
-import org.apache.zookeeper.server.quorum.*;
-
-public class ZooKeeperInstance
-{
-  protected final int zkPort;
-  protected final File tempDir;
-  
-  protected ZooKeeperThread zookeeperThread = null;
-  
-  public ZooKeeperInstance(int zkPort, File tempDir)
-  {
-    this.zkPort = zkPort;
-    this.tempDir = tempDir;
-  }
-
-  public void start()
-    throws Exception
-  {
-    Properties startupProperties = new Properties();
-    startupProperties.setProperty("tickTime","2000");
-    startupProperties.setProperty("dataDir",tempDir.toString());
-    startupProperties.setProperty("clientPort",Integer.toString(zkPort));
-
-    final QuorumPeerConfig quorumConfiguration = new QuorumPeerConfig();
-    quorumConfiguration.parseProperties(startupProperties);
-
-    final ServerConfig configuration = new ServerConfig();
-    configuration.readFrom(quorumConfiguration);
-
-    zookeeperThread = new ZooKeeperThread(configuration);
-    zookeeperThread.start();
-    // We have no way of knowing whether zookeeper is alive or not, but the
-    // client is supposed to know about that.  But it doesn't, so wait for 5 seconds
-    Thread.sleep(5000L);
-  }
-  
-  public void stop()
-    throws Exception
-  {
-    while (true)
-    {
-      if (zookeeperThread == null)
-        break;
-      else if (!zookeeperThread.isAlive())
-      {
-        Throwable e = zookeeperThread.finishUp();
-        if (e != null)
-        {
-          if (e instanceof RuntimeException)
-            throw (RuntimeException)e;
-          else if (e instanceof Exception)
-            throw (Exception)e;
-          else if (e instanceof Error)
-            throw (Error)e;
-        }
-        zookeeperThread = null;
-      }
-      else
-      {
-        // This isn't the best way to kill zookeeper but it's the only way
-        // we've got.
-        zookeeperThread.interrupt();
-        Thread.sleep(1000L);
-      }
-    }
-  }
-  
-  protected static class ZooKeeperThread extends Thread
-  {
-    protected final ServerConfig config;
-    
-    protected Throwable exception = null;
-    
-    public ZooKeeperThread(ServerConfig config)
-    {
-      this.config = config;
-    }
-    
-    public void run()
-    {
-      try
-      {
-        ZooKeeperServerMain server = new ZooKeeperServerMain();
-        server.runFromConfig(config);
-      }
-      catch (IOException e)
-      {
-        // Ignore IOExceptions, since that seems to be normal when shutting
-        // down zookeeper via thread.interrupt()
-      }
-      catch (Throwable e)
-      {
-        exception = e;
-      }
-    }
-    
-    public Throwable finishUp()
-      throws InterruptedException
-    {
-      join();
-      return exception;
-    }
-  }
-  
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/Base.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/Base.java
deleted file mode 100644
index c50f020..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/Base.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is the base class of all ManifoldCF testing classes, at least the ones
-* that manage configuration files and database setup. */
-public class Base
-{
-  protected File currentPath = null;
-  protected File configFile = null;
-  protected File loggingFile = null;
-  protected File logOutputFile = null;
-  protected File connectorFile = null;
-
-  protected void initialize()
-    throws Exception
-  {
-    if (currentPath == null)
-    {
-      currentPath = new File(".").getCanonicalFile();
-
-      // First, write a properties file and a logging file, in the current directory.
-      configFile = new File("properties.xml").getCanonicalFile();
-      loggingFile = new File("logging.xml").getCanonicalFile();
-      logOutputFile = new File("manifoldcf.log").getCanonicalFile();
-      connectorFile = new File("connectors.xml").getCanonicalFile();
-
-      // Set a system property that will point us to the proper place to find the properties file
-      System.setProperty("org.apache.manifoldcf.configfile",configFile.getCanonicalFile().getAbsolutePath());
-    }
-  }
-  
-  protected boolean isInitialized()
-  {
-    return configFile.exists();
-  }
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean error: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  /** Method to write the logging.ini contents.
-  * Override this method if you want different contents, or you want to your own stuff.
-  */
-  protected void writeLoggingIni(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-"<Configuration status=\"warn\" name=\"ManifoldCF\" packages=\"\">\n"+
-"  <Appenders>\n"+
-"    <File name=\"MyFile\" fileName=\""+logOutputFile.getAbsolutePath().replaceAll("\\\\","/")+"\">\n"+
-"      <PatternLayout>\n"+
-"        <Pattern>%5p %d{ISO8601} (%t) - %m%n</Pattern>\n"+
-"      </PatternLayout>\n"+
-"    </File>\n"+
-"  </Appenders>\n"+
-"  <Loggers>\n"+
-"    <Root level=\"error\">\n"+
-"      <AppenderRef ref=\"MyFile\"/>\n"+
-"    </Root>\n"+
-"  </Loggers>\n"+
-"</Configuration>\n"
-    );
-  }
-  
-  /** Method to write the properties.xml contents.
-  * Override this method if you want dto replace everything
-  * with your own stuff.
-  */
-  protected void writePropertiesXML(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
-      "<configuration>\n"
-    );
-    writeProperties(output);
-    output.append(
-      "</configuration>\n"
-    );
-  }
-  
-  /** Method to add properties to properties.xml contents.
-  * Override this method to add properties clauses to the property file.
-  */
-  protected void writeProperties(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.logconfigfile\" value=\""+loggingFile.getAbsolutePath().replaceAll("\\\\","/")+"\"/>\n"+
-      "  <property name=\"org.apache.manifoldcf.connectorsconfigurationfile\" value=\""+connectorFile.getAbsolutePath().replaceAll("\\\\","/")+"\"/>\n"+
-      "  <property name=\"org.apache.manifoldcf.diagnostics\" value=\"DEBUG\"/>\n"
-    );
-  }
-  
-  /** Method to write the connectors.xml contents.
-  * Override to replace everything.
-  */
-  protected void writeConnectorsXML(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
-      "<connectors>\n"
-    );
-    writeConnectors(output);
-    output.append(
-      "</connectors>\n"
-    );
-  }
-  
-  /** Method to add connectors to connectors.xml contents.
-  * Override this method to add connector clauses to the connectors file.
-  */
-  protected void writeConnectors(StringBuilder output)
-    throws Exception
-  {
-  }
-  
-  /** Method to get database superuser name.
-  */
-  protected String getDatabaseSuperuserName()
-    throws Exception
-  {
-    return "";
-  }
-  
-  /** Method to get database superuser password.
-  */
-  protected String getDatabaseSuperuserPassword()
-    throws Exception
-  {
-    return "";
-  }
-
-  protected void initializeSystem()
-    throws Exception
-  {
-    initialize();
-    
-    StringBuilder loggingIniContents = new StringBuilder();
-    writeLoggingIni(loggingIniContents);
-    writeFile(loggingFile,loggingIniContents.toString());
-
-    StringBuilder propertiesXMLContents = new StringBuilder();
-    writePropertiesXML(propertiesXMLContents);
-    writeFile(configFile,propertiesXMLContents.toString());
-
-    StringBuilder connectorsXMLContents = new StringBuilder();
-    writeConnectorsXML(connectorsXMLContents);
-    writeFile(connectorFile,connectorsXMLContents.toString());
-
-    ManifoldCF.initializeEnvironment(ThreadContextFactory.make());
-  }
-  
-  protected void localSetUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    // Create the database
-    ManifoldCF.createSystemDatabase(tc,getDatabaseSuperuserName(),getDatabaseSuperuserPassword());
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void cleanupSystem()
-    throws Exception
-  {
-    initialize();
-    if (isInitialized())
-    {
-      // Get rid of the property and logging files.
-      logOutputFile.delete();
-      configFile.delete();
-      loggingFile.delete();
-      connectorFile.delete();
-      
-      IThreadContext threadContext = ThreadContextFactory.make();
-      ManifoldCF.cleanUpEnvironment(threadContext);
-      // Just in case we're not synchronized...
-      ManifoldCF.resetEnvironment(threadContext);
-    }
-  }
-  
-  protected void localReset()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    // Remove the database
-    ManifoldCF.dropSystemDatabase(tc,getDatabaseSuperuserName(),getDatabaseSuperuserPassword());
-  }
-  
-  protected void localCleanUp()
-    throws Exception
-  {
-    localReset();
-  }
-
-  protected static void writeFile(File f, String fileContents)
-    throws IOException
-  {
-    OutputStream os = new FileOutputStream(f);
-    try
-    {
-      Writer w = new OutputStreamWriter(os, StandardCharsets.UTF_8);
-      try
-      {
-        w.write(fileContents);
-      }
-      finally
-      {
-        w.close();
-      }
-    }
-    finally
-    {
-      os.close();
-    }
-  }
-  
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseDatabase.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseDatabase.java
deleted file mode 100644
index e16738e..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseDatabase.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for selecting the database via an abstract method which can be overridden. */
-public abstract class BaseDatabase extends Base
-{
-
-  /** Method to add properties to properties.xml contents.
-  * Override this method to add properties clauses to the property file.
-  */
-  @Override
-  protected void writeProperties(StringBuilder output)
-    throws Exception
-  {
-    super.writeProperties(output);
-    writeDatabaseProperties(output);
-    writeDatabaseMaxQueryTimeProperty(output);
-    writeDatabaseMaxHandlesProperty(output);
-    writeCrawlerThreadsProperty(output);
-    writeExpireThreadsProperty(output);
-    writeCleanupThreadsProperty(output);
-    writeDeleteThreadsProperty(output);
-    writeConnectorDebugProperty(output);
-  }
-  
-  /** Method to add database-specific (as opposed to test-specific) parameters to
-  * property file.
-  */
-  protected void writeDatabaseProperties(StringBuilder output)
-    throws Exception
-  {
-    writeDatabaseImplementationProperty(output);
-    writeDatabaseControlProperties(output);
-  }
-  
-  /** Method to write the database implementation property */
-  protected void writeDatabaseImplementationProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.databaseimplementationclass\" value=\""+getDatabaseImplementationClass()+"\"/>\n"
-    );
-  }
-  
-  /** Method to get database implementation class */
-  protected abstract String getDatabaseImplementationClass()
-    throws Exception;
-
-  /** Method to write the database control properties. */
-  protected abstract void writeDatabaseControlProperties(StringBuilder output)
-    throws Exception;
-  
-  /** Method to write the max query time. */
-  protected void writeDatabaseMaxQueryTimeProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.database.maxquerytime\" value=\""+getDatabaseMaxQueryTimeProperty()+"\"/>\n"
-    );
-  }
-  
-  /** Method to get max query time property. */
-  protected int getDatabaseMaxQueryTimeProperty()
-    throws Exception
-  {
-    return 30;
-  }
-  
-  /** Method to write the max handles. */
-  protected void writeDatabaseMaxHandlesProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.database.maxhandles\" value=\"80\"/>\n"
-    );
-  }
-  
-  /** Method to write crawler threads property. */
-  protected void writeCrawlerThreadsProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.crawler.threads\" value=\"30\"/>\n"
-    );
-  }
-  
-  /** Method to write expire threads property. */
-  protected void writeExpireThreadsProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.crawler.expirethreads\" value=\"10\"/>\n"
-    );
-  }
-
-  /** Method to write cleanup threads property. */
-  protected void writeCleanupThreadsProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.crawler.cleanupthreads\" value=\"10\"/>\n"
-    );
-  }
-
-  /** Method to write delete threads property. */
-  protected void writeDeleteThreadsProperty(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.crawler.deletethreads\" value=\"10\"/>\n"
-    );
-  }
-
-  /** Method to write connector debug property. */
-  protected void writeConnectorDebugProperty(StringBuilder output)
-    throws Exception
-  {
-    // By default, leave debug off
-  }
-
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseHSQLDB.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseHSQLDB.java
deleted file mode 100644
index ca1d9ba..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the core Derby database. */
-public class BaseHSQLDB extends BaseDatabase
-{
-  
-  /** Method to get database implementation class */
-  @Override
-  protected String getDatabaseImplementationClass()
-    throws Exception
-  {
-    return "org.apache.manifoldcf.core.database.DBInterfaceHSQLDB";
-  }
-
-  /** Method to set database properties */
-  @Override
-  protected void writeDatabaseControlProperties(StringBuilder output)
-    throws Exception
-  {
-    String currentPathString = currentPath.getAbsolutePath();
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.hsqldbdatabasepath\" value=\""+currentPathString.replaceAll("\\\\","/")+"\"/>\n"
-    );
-  }
-
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseHSQLDBext.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseHSQLDBext.java
deleted file mode 100644
index 09df3d8..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseHSQLDBext.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-import java.lang.reflect.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the core HSQLDB remote database. */
-public class BaseHSQLDBext extends BaseHSQLDB
-{
-  protected DatabaseThread databaseThread = null;
-  
-  /** Method to set database properties */
-  @Override
-  protected void writeDatabaseControlProperties(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.hsqldbdatabaseprotocol\" value=\"hsql\"/>\n" +
-      "  <property name=\"org.apache.manifoldcf.hsqldbdatabaseserver\" value=\"localhost\"/>\n" +
-      "  <property name=\"org.apache.manifoldcf.hsqldbdatabaseinstance\" value=\"xdb\"/>\n"
-    );
-  }
-
-  /** Method to get database superuser name.
-  */
-  @Override
-  protected String getDatabaseSuperuserName()
-    throws Exception
-  {
-    return "sa";
-  }
-  
-  /** Method to get database superuser password.
-  */
-  @Override
-  protected String getDatabaseSuperuserPassword()
-    throws Exception
-  {
-    return "";
-  }
-
-  @Before
-  public void startHSQLDBInstance()
-    throws Exception
-  {
-    startDatabase();
-  }
-  
-  @After
-  public void stopHSQLDBInstance()
-    throws Exception
-  {
-    stopDatabase();
-  }
-  
-  protected void startDatabase()
-    throws Exception
-  {
-    databaseThread = new DatabaseThread();
-    databaseThread.start();
-  }
-  
-  protected void stopDatabase()
-    throws Exception
-  {
-    while (true)
-    {
-      if (!databaseThread.isAlive())
-        break;
-      databaseThread.interrupt();
-      Thread.yield();
-    }
-    databaseThread.join();
-  }
-  
-  protected static class DatabaseThread extends Thread
-  {
-    public DatabaseThread()
-    {
-      setName("Database runner thread");
-    }
-    
-    public void run()
-    {
-      // We need to do the equivalent of:
-      // java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb
-      try
-      {
-        Class x = Class.forName("org.hsqldb.Server");
-        String[] args = new String[]{"-database.0","file:extdb;hsqldb.tx=mvcc;hsqldb.cache_file_scale=512","-dbname.0","xdb"};
-        Method m = x.getMethod("main",String[].class);
-        m.invoke(null,(Object)args);
-      }
-      catch (Exception e)
-      {
-        e.printStackTrace();
-      }
-    }
-    
-  }
-  
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseMySQL.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseMySQL.java
deleted file mode 100644
index 5238931..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BaseMySQL.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the core MySQL database. */
-public class BaseMySQL extends BaseDatabase
-{
-  protected final static String SUPER_USER_NAME = "root";
-  protected final static String SUPER_USER_PASSWORD = "mysql";
-  
-  /** Method to get database implementation class */
-  @Override
-  protected String getDatabaseImplementationClass()
-    throws Exception
-  {
-    return "org.apache.manifoldcf.core.database.DBInterfaceMySQL";
-  }
-
-  /** Method to set database properties */
-  @Override
-  protected void writeDatabaseControlProperties(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.database.name\" value=\"testdb\"/>\n" +
-      "  <property name=\"org.apache.manifoldcf.database.username\" value=\"testuser\"/>\n"
-    );
-  }
-
-  /** Method to get max query time property. */
-  @Override
-  protected int getDatabaseMaxQueryTimeProperty()
-    throws Exception
-  {
-    return 15;
-  }
-
-  /** Method to get database superuser name.
-  */
-  @Override
-  protected String getDatabaseSuperuserName()
-    throws Exception
-  {
-    return SUPER_USER_NAME;
-  }
-  
-  /** Method to get database superuser password.
-  */
-  @Override
-  protected String getDatabaseSuperuserPassword()
-    throws Exception
-  {
-    return SUPER_USER_PASSWORD;
-  }
-
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BasePostgresql.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BasePostgresql.java
deleted file mode 100644
index dd3e0ef..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/BasePostgresql.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the core Postgresql database. */
-public class BasePostgresql extends BaseDatabase
-{
-  protected final static String SUPER_USER_NAME = "postgres";
-  protected final static String SUPER_USER_PASSWORD = "postgres";
-
-  /** Method to get database implementation class */
-  @Override
-  protected String getDatabaseImplementationClass()
-    throws Exception
-  {
-    return "org.apache.manifoldcf.core.database.DBInterfacePostgreSQL";
-  }
-
-  /** Method to set database properties */
-  @Override
-  protected void writeDatabaseControlProperties(StringBuilder output)
-    throws Exception
-  {
-    output.append(
-      "  <property name=\"org.apache.manifoldcf.database.name\" value=\"testdb\"/>\n" +
-      "  <property name=\"org.apache.manifoldcf.database.username\" value=\"testuser\"/>\n"
-    );
-  }
-
-  /** Method to get max query time property. */
-  @Override
-  protected int getDatabaseMaxQueryTimeProperty()
-    throws Exception
-  {
-    return 15;
-  }
-
-  /** Method to get database superuser name.
-  */
-  @Override
-  protected String getDatabaseSuperuserName()
-    throws Exception
-  {
-    return SUPER_USER_NAME;
-  }
-  
-  /** Method to get database superuser password.
-  */
-  @Override
-  protected String getDatabaseSuperuserPassword()
-    throws Exception
-  {
-    return SUPER_USER_PASSWORD;
-  }
-
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/HTMLTester.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/HTMLTester.java
deleted file mode 100644
index 53f12d5..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/HTMLTester.java
+++ /dev/null
@@ -1,752 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.core.tests;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import org.junit.*;
-
-/** This tester sets up a virtual browser and allows a sequence of testing to take place.  It's set
-* up to allow this to be done in Java, even though the tester itself may well be running in Python.
-* The eventual goal is to replace the Python browser emulator with a Java one, but we can't get there
-* all in one goal.
-*
-* The paradigm used is one of a "virtual browser", which basically handles multiple windows and can
-* emulate user activities, such as clicking a link or a button, filling in a field, etc.  Identification
-* of each of these elements may have a language dependence, so I would anticipate that there would
-* need to be a new set of tests for each localization we have.  Presumably it should be possible
-* to come up with a structure at a level above this one in order to meet the goal of having the
-* same test in a different language, so I'm not going to worry about that here.
-*
-* The tester works by basically accumulating a set of "instructions", and then firing them off at the
-* end.  This set of instructions is then executed in an appropriate environment, and test feedback is
-* returned.
-*/
-public class HTMLTester
-{
-  protected File currentTestFile = null;
-  protected OutputStream currentOutputStream = null;
-  protected BufferedWriter currentWriter = null;
-  protected int variableCounter;
-  protected int currentIndentLevel;
-  protected String virtualBrowserVarName;
-  
-  /** Constructor.  Create a test sequence object.
-  */
-  public HTMLTester()
-  {
-  }
-  
-  /** Set up for all tests.  Basically this grabs the necessary stuff out of resources
-  * and writes it to the current directory.
-  */
-  @Before
-  public void setup()
-    throws Exception
-  {
-    copyResource("VirtualBrowser.py");
-    copyResource("Javascript.py");
-    // Delete any test files hanging around from before
-    new File("test.py").delete();
-  }
-  
-  protected void copyResource(String resName)
-    throws Exception
-  {
-    OutputStream os = new FileOutputStream(new File(resName));
-    try
-    {
-      InputStream is = getClass().getResourceAsStream(resName);
-      try
-      {
-        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));
-        BufferedReader br = new BufferedReader(new InputStreamReader(is,StandardCharsets.UTF_8));
-        while (true)
-        {
-          String line = br.readLine();
-          if (line == null)
-            break;
-          bw.write(line);
-          bw.newLine();
-        }
-        bw.flush();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    finally
-    {
-      os.close();
-    }
-  }
-  
-  /** Clean up the files we created.
-  */
-  @After
-  public void teardown()
-    throws Exception
-  {
-    closeAll();
-    new File("Javascript.py").delete();
-    new File("VirtualBrowser.py").delete();
-  }
-  
-  /** Test to test the tester.
-  */
-  @Test
-  public void TesterTest()
-    throws Exception
-  {
-    newTest(Locale.US);
-    executeTest();
-  }
-  
-  /** Close the current output.
-  */
-  protected void closeAll()
-    throws Exception
-  {
-    if (currentWriter != null)
-    {
-      currentWriter.flush();
-      currentWriter = null;
-    }
-    if (currentOutputStream != null)
-    {
-      currentOutputStream.close();
-      currentOutputStream = null;
-    }
-  }
-  
-  /** Begin a new test.  Call this when we're ready to start building a new UI test.
-  */
-  public void newTest(Locale desiredLocale)
-    throws Exception
-  {
-    currentTestFile = new File("test.py");
-    currentOutputStream = new FileOutputStream(currentTestFile);
-    currentWriter = new BufferedWriter(new OutputStreamWriter(currentOutputStream,"ASCII"));
-    variableCounter = 0;
-    currentIndentLevel = 0;
-    virtualBrowserVarName = getNextVariableName();
-    
-    emitLine("import time");
-    emitLine("import sys");
-    emitLine("sys.path.append(\".\")");
-    emitLine("import VirtualBrowser");
-    emitLine("if __name__ == '__main__':");
-    currentIndentLevel++;
-    emitLine("print 'Starting test'");
-    emitLine(virtualBrowserVarName + " = VirtualBrowser.VirtualBrowser("+quotePythonString(desiredLocale.toString().replace("_","-"))+")");
-  }
-  
-  /** Execute the test.  The virtual browser will be called and will perform the sequence of
-  * activity described by the test.  If at any point an error occurs, an appropriate exception
-  * will be thrown, with sufficient description to (hopefully) permit the problem to be tracked down.
-  */
-  public void executeTest()
-    throws Exception
-  {
-    emitLine("print 'Test complete'");
-    closeAll();
-    // Now, execute the python command.
-    Process p = Runtime.getRuntime().exec(new String[]{"python","test.py"});
-    // Read from streams
-    StreamConnector mStdOut = new StreamConnector( p.getErrorStream(), "Stderr: ", System.err );  
-    StreamConnector mErrOut = new StreamConnector( p.getInputStream(), "Stdout: ", System.out );  
-    mStdOut.start();  
-    mErrOut.start(); 
-    int exitCode = p.waitFor();
-    mStdOut.abort();
-    mErrOut.abort();
-    mStdOut.join();
-    mErrOut.join();
-    if (exitCode != 0)
-      throw new Exception("UI test failed; error code: "+exitCode);
-    // After successful execution, remove the test file.
-    if (currentTestFile != null)
-    {
-      currentTestFile.delete();
-      currentTestFile = null;
-    }
-  }
-  
-  /** Create a string description for use later in the test.
-  *@param value is the intended value of the string description.
-  *@return the string description.
-  */
-  public StringDescription createStringDescription(String value)
-    throws Exception
-  {
-    String variableName = getNextVariableName();
-    if (value != null)
-      emitLine(variableName + " = " + quotePythonString(value));
-    else
-      emitLine(variableName + " = None");
-    return new StringDescription(variableName);
-  }
-
-  /** Create a string description for use later in the test.
-  *@param values are the intended values of the string description, concatenated together.
-  *@return the string description.
-  */
-  public StringDescription createStringDescription(StringDescription[] values)
-    throws Exception
-  {
-    String variableName = getNextVariableName();
-    if (values.length == 0)
-      emitLine(variableName + " = " + quotePythonString(""));
-    else
-    {
-      StringBuilder sb = new StringBuilder(variableName);
-      sb.append(" = ");
-      for (int i = 0; i < values.length ; i++)
-      {
-        if (i > 0)
-          sb.append(" + ");
-        sb.append(values[i].getVarName());
-      }
-      emitLine(sb.toString());
-    }
-    return new StringDescription(variableName);
-  }
-
-  /** Print a value.
-  */
-  public void printValue(StringDescription value)
-    throws Exception
-  {
-    emitLine("print >> sys.stderr, "+value.getVarName());
-  }
-  
-  /** Begin a loop.
-  */
-  public Loop beginLoop(int maxSeconds)
-    throws Exception
-  {
-    String variableName = getNextVariableName();
-    emitLine(variableName+" = time.time() + "+maxSeconds);
-    emitLine("while True:");
-    currentIndentLevel++;
-    return new Loop(variableName);
-  }
-  
-    
-  /** Open virtual browser window, and send it to a specified URL.
-  *@param url is the desired URL.
-  *@return the window handle.  Use this whenever a window argument is required later.
-  */
-  public Window openMainWindow(String url)
-    throws Exception
-  {
-    emitLine(virtualBrowserVarName + ".load_main_window(" + quotePythonString(url) + ")");
-    return findWindow(null);
-  }
-  
-  /** Find a window of a specific name, or null for the main window.
-  *@param windowName is the name of the window, or null.
-  *@return the window handle.
-  */
-  public Window findWindow(StringDescription windowName)
-    throws Exception
-  {
-    String windowVar = getNextVariableName();
-    if (windowName != null)
-      emitLine(windowVar + " = " + virtualBrowserVarName + ".find_window("+windowName.getVarName()+")");
-    else
-      emitLine(windowVar + " = " + virtualBrowserVarName + ".find_window("+quotePythonString("")+")");
-    return new Window(windowVar);
-  }
-
-  /** Calculate the next variable name */
-  protected String getNextVariableName()
-  {
-    String rval = "var"+variableCounter;
-    variableCounter++;
-    return rval;
-  }
-  
-  /** Quote a python string */
-  protected String quotePythonString(String value)
-  {
-    StringBuilder sb = new StringBuilder("\"");
-    for (int i = 0 ; i < value.length() ; i++)
-    {
-      char c = value.charAt(i);
-      if (c == '"')
-        sb.append("\\").append(c);
-      else
-        sb.append(c);
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-  
-  /** Emit a python line.
-  */
-  protected void emitLine(String line)
-    throws IOException
-  {
-    // Append to file with current indent.
-    StringBuilder fullLine = new StringBuilder();
-    for (int i = 0 ; i < currentIndentLevel ; i++)
-    {
-      fullLine.append("    ");
-    }
-    fullLine.append(line);
-    currentWriter.write(fullLine.toString());
-    currentWriter.newLine();
-  }
-  
-  /** Window handle */
-  public class Window
-  {
-    protected String windowVar;
-    
-    /** Create a window instance.
-    */
-    public Window(String windowVar)
-    {
-      this.windowVar = windowVar;
-    }
-    
-    /** Check if a pattern is present or not.
-    *@return a StringDescription that in fact describes a boolean condition; true if present.
-    */
-    public StringDescription isPresent(StringDescription regularExpression)
-      throws Exception
-    {
-      String varName = getNextVariableName();
-      emitLine(varName + " = "+windowVar+".is_present("+regularExpression.getVarName()+")");
-      return new StringDescription(varName);
-    }
-
-    /** Check if a pattern is present or not.
-    *@return a StringDescription that in fact describes a boolean condition; true if not present.
-    */
-    public StringDescription isNotPresent(StringDescription regularExpression)
-      throws Exception
-    {
-      String varName = getNextVariableName();
-      emitLine(varName + " = not "+windowVar+".is_present("+regularExpression.getVarName()+")");
-      return new StringDescription(varName);
-    }
-    
-    /** Look for a specific match in the current page data, and return the value of the specified group.
-    *@return a description of the string found.  This can be used later in other commands to assess
-    *  correctness of the page, or allow form data to be filled in.
-    */
-    public StringDescription findMatch(StringDescription regularExpression, int group)
-      throws Exception
-    {
-      String varName = getNextVariableName();
-      emitLine(varName + " = "+windowVar+".find_match("+regularExpression.getVarName()+",group="+group+")");
-      return new StringDescription(varName);
-    }
-
-    /** Same as findMatch, but strips out newlines before it looks.
-    */
-    public StringDescription findMatchNoNewlines(StringDescription regularExpression, int group)
-      throws Exception
-    {
-      String varName = getNextVariableName();
-      emitLine(varName + " = "+windowVar+".find_match_no_newlines("+regularExpression.getVarName()+",group="+group+")");
-      return new StringDescription(varName);
-    }
-
-    /** If the match is not found, the test will error out.
-    */
-    public void checkMatch(StringDescription regularExpression)
-      throws Exception
-    {
-      emitLine(windowVar+".find_match("+regularExpression.getVarName()+")");
-    }
-    
-    /** If the match is found, the test will error out.
-    */
-    public void checkNoMatch(StringDescription regularExpression)
-      throws Exception
-    {
-      emitLine(windowVar+".check_no_match("+regularExpression.getVarName()+")");
-    }
-    
-    /** Find a link.
-    */
-    public Link findLink(StringDescription altText)
-      throws Exception
-    {
-      String linkVarName = getNextVariableName();
-      emitLine(linkVarName + " = " + windowVar + ".find_link("+altText.getVarName()+")");
-      return new Link(linkVarName);
-    }
-    
-    /** Find a form.
-    */
-    public Form findForm(StringDescription formName)
-      throws Exception
-    {
-      String formVarName = getNextVariableName();
-      emitLine(formVarName + " = " + windowVar + ".find_form("+formName.getVarName()+")");
-      return new Form(formVarName);
-    }
-
-    /** Find a button.
-    */
-    public Button findButton(StringDescription altText)
-      throws Exception
-    {
-      String buttonVarName = getNextVariableName();
-      emitLine(buttonVarName + " = " + windowVar + ".find_button("+altText.getVarName()+")");
-      return new Button(buttonVarName);
-    }
-    
-    /** Close this window.
-    */
-    public void closeWindow()
-      throws Exception
-    {
-      emitLine(windowVar+".close_window()");
-    }
-  }
-  
-  /** Loop object.
-  */
-  public class Loop
-  {
-    protected String loopVarName;
-    
-    public Loop(String loopVarName)
-    {
-      this.loopVarName = loopVarName;
-    }
-    
-    /** Break on condition being true.
-    */
-    public void breakWhenTrue(StringDescription condition)
-      throws Exception
-    {
-      emitLine("if "+condition.getVarName()+":");
-      currentIndentLevel++;
-      emitLine("break");
-      currentIndentLevel--;
-    }
-    
-    /** End the loop.
-    */
-    public void endLoop()
-      throws Exception
-    {
-      emitLine("time.sleep(1)");
-      emitLine("if time.time() >= "+loopVarName+":");
-      currentIndentLevel++;
-      emitLine("raise Exception('Loop timed out')");
-      currentIndentLevel--;
-      currentIndentLevel--;
-    }
-  }
-  
-  /** Object representative of a virtual browser link.
-  */
-  public class Link
-  {
-    protected String linkVarName;
-    
-    public Link(String linkVarName)
-    {
-      this.linkVarName = linkVarName;
-    }
-    
-    /** Click the link */
-    public void click()
-      throws Exception
-    {
-      emitLine(linkVarName + ".click()");
-    }
-  }
-  
-  /** Object representative of a virtual browser form.
-  */
-  public class Form
-  {
-    protected String formVarName;
-    
-    public Form(String formVarName)
-    {
-      this.formVarName = formVarName;
-    }
-    
-    /** Find a file browser element, by data variable name.
-    */
-    public FileBrowser findFileBrowser(StringDescription dataName)
-      throws Exception
-    {
-      String fileBrowserVarName = getNextVariableName();
-      emitLine(fileBrowserVarName + " = " + formVarName + ".find_filebrowser("+dataName.getVarName()+")");
-      return new FileBrowser(fileBrowserVarName);
-    }
-    
-    /** Find a checkbox element, by data variable name and value.
-    */
-    public Checkbox findCheckbox(StringDescription dataName, StringDescription value)
-      throws Exception
-    {
-      String checkboxVarName = getNextVariableName();
-      emitLine(checkboxVarName + " = " + formVarName + ".find_checkbox("+dataName.getVarName()+","+value.getVarName()+")");
-      return new Checkbox(checkboxVarName);
-    }
-    
-    /** Find a radio button by variable name and value.
-    */
-    public Radiobutton findRadiobutton(StringDescription dataName, StringDescription value)
-      throws Exception
-    {
-      String radiobuttonVarName = getNextVariableName();
-      emitLine(radiobuttonVarName + " = " + formVarName + ".find_radiobutton("+dataName.getVarName()+","+value.getVarName()+")");
-      return new Radiobutton(radiobuttonVarName);
-    }
-    
-    /** Find a select box by data variable name.
-    */
-    public Selectbox findSelectbox(StringDescription dataName)
-      throws Exception
-    {
-      String selectboxVarName = getNextVariableName();
-      emitLine(selectboxVarName + " = " + formVarName + ".find_selectbox("+dataName.getVarName()+")");
-      return new Selectbox(selectboxVarName);
-    }
-    
-    /** Find a textarea/password field by data variable name.
-    */
-    public Textarea findTextarea(StringDescription dataName)
-      throws Exception
-    {
-      String textareaVarName = getNextVariableName();
-      emitLine(textareaVarName + " = " + formVarName + ".find_textarea("+dataName.getVarName()+")");
-      return new Textarea(textareaVarName);
-    }
-  }
-  
-  /** Object representative of a file browser.
-  */
-  public class FileBrowser
-  {
-    protected String fileBrowserVarName;
-    
-    public FileBrowser(String fileBrowserVarName)
-    {
-      this.fileBrowserVarName = fileBrowserVarName;
-    }
-    
-    public void setFile(StringDescription fileName, StringDescription contentType)
-      throws Exception
-    {
-      emitLine(fileBrowserVarName + ".set_file("+fileName.getVarName()+","+contentType.getVarName()+")");
-    }
-  }
-  
-  /** Object representative of a checkbox.
-  */
-  public class Checkbox
-  {
-    protected String checkBoxVarName;
-    
-    public Checkbox(String checkBoxVarName)
-    {
-      this.checkBoxVarName = checkBoxVarName;
-    }
-    
-    /** Select this checkbox */
-    public void select()
-      throws Exception
-    {
-      emitLine(checkBoxVarName + ".select()");
-    }
-    
-    /** Deselect this checkbox */
-    public void deselect()
-      throws Exception
-    {
-      emitLine(checkBoxVarName + ".deselect()");
-    }
-  }
-  
-  /** Object representative of a radio button.
-  */
-  public class Radiobutton
-  {
-    protected String radioButtonVarName;
-    
-    public Radiobutton(String radioButtonVarName)
-    {
-      this.radioButtonVarName = radioButtonVarName;
-    }
-    
-    /** Select this radio button */
-    public void select()
-      throws Exception
-    {
-      emitLine(radioButtonVarName + ".select()");
-    }
-  }
-  
-  /** Object representative of  a select box.
-  */
-  public class Selectbox
-  {
-    protected String selectBoxVarName;
-    
-    public Selectbox(String selectBoxVarName)
-    {
-      this.selectBoxVarName = selectBoxVarName;
-    }
-
-    /** Select a value (without CTRL button).
-    * This works like a browser in that selecting in this way turns
-    * off all other current selections. */
-    public void selectValue(StringDescription selectedValue)
-      throws Exception
-    {
-      emitLine(selectBoxVarName + ".select_value(" + selectedValue.getVarName() + ")");
-    }
-
-    /** Select a value using a regular expression (without CTRL button) */
-    public void selectValueRegexp(StringDescription selectedValueRegexp)
-      throws Exception
-    {
-      emitLine(selectBoxVarName + ".select_value_regexp(" + selectedValueRegexp.getVarName() + ")");
-    }
-
-    /** CTRL-select a value.
-    * For multiselect boxes, this adds a new selection to those already
-    * chosen.  For non-multi boxes, it works just like select_value. */
-    public void multiSelectValue(StringDescription selectedValue)
-      throws Exception
-    {
-      emitLine(selectBoxVarName + ".multi_select_value(" + selectedValue.getVarName() + ")");
-    }
-    
-    
-  }
-  
-  /** Object representative of a text area.
-  */
-  public class Textarea
-  {
-    protected String textAreaVarName;
-    
-    public Textarea(String textAreaVarName)
-    {
-      this.textAreaVarName = textAreaVarName;
-    }
-    
-    /** Set the value.
-    */
-    public void setValue(StringDescription textValue)
-      throws Exception
-    {
-      emitLine(textAreaVarName + ".set_value(" + textValue.getVarName() + ")");
-    }
-  }
-  
-  /** Object representative of a virtual browser button.
-  */
-  public class Button
-  {
-    protected String buttonVarName;
-    
-    public Button(String buttonVarName)
-    {
-      this.buttonVarName = buttonVarName;
-    }
-    
-    public void click()
-      throws Exception
-    {
-      emitLine(buttonVarName + ".click()");
-    }
-  }
-  
-  /** String description.  An instance of this class represents a string that will be located as the
-  * browser emulator functions.  It can be used at various places as the test description is built.
-  */
-  public class StringDescription
-  {
-    protected String variableName;
-    
-    public StringDescription(String variableName)
-    {
-      this.variableName = variableName;
-    }
-    
-    public String getVarName()
-    {
-      return variableName;
-    }
-  }
-  
-  /** Connector thread that allows for exec */
-  protected static class StreamConnector extends Thread
-  {
-    protected InputStream inputStream;
-    protected OutputStream outputStream;
-    protected String prefix;
-    protected boolean abortSignal;
-    
-    public StreamConnector(InputStream inputStream, String prefix, OutputStream outputStream)
-    {
-      this.inputStream = inputStream;
-      this.prefix = prefix;
-      this.outputStream = outputStream;
-      abortSignal = false;
-    }
-    
-    public void abort()
-    {
-      abortSignal = true;
-    }
-    
-    public void run()
-    {
-      try
-      {
-        byte[] buffer = new byte[63356];
-        while (true)
-        {
-          int amt = inputStream.read(buffer);
-          if (amt == -1)
-          {
-            if (abortSignal)
-              break;
-            Thread.yield();
-            continue;
-          }
-          outputStream.write(buffer,0,amt);
-        }
-      }
-      catch (IOException e)
-      {
-        e.printStackTrace(System.err);
-      }
-    }
-  }
-  
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/SeleniumTester.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/SeleniumTester.java
deleted file mode 100644
index 05a3aee..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/SeleniumTester.java
+++ /dev/null
@@ -1,775 +0,0 @@
-/* $Id$ */
-
-/**
- * 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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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 org.apache.manifoldcf.core.tests;
-
-import org.hamcrest.CoreMatchers;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.openqa.selenium.Alert;
-import org.openqa.selenium.By;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.SearchContext;
-import org.openqa.selenium.TimeoutException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.firefox.FirefoxDriver;
-import org.openqa.selenium.ie.InternetExplorerDriver;
-import org.openqa.selenium.support.ui.ExpectedCondition;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.Select;
-import org.openqa.selenium.support.ui.WebDriverWait;
-
-import java.util.List;
-
-public class SeleniumTester
-{
-
-  protected WebDriver driver = null;
-  protected WebDriverWait wait = null;
-  private final long defaultTimeOutInSeconds = 15;
-
-  public enum BrowserType
-  {
-    CHROME,
-    FIREFOX,
-    IE
-  }
-
-  /**
-   * Constructor. Create a test sequence object.
-   */
-  public SeleniumTester()
-  {
-  }
-
-  /**
-   * Set up for all tests. Basically this grabs the necessary stuff out of resources and writes it
-   * to the current directory.
-   */
-  @Before
-  public void setup() throws Exception
-  {
-    driver = null;
-    wait = null;
-  }
-
-  public void start(final BrowserType browserType, final String language, final String startURL)
-  {
-    //Download Chrome Driver for Linux from here (https://chromedriver.storage.googleapis.com/index.html?path=2.28/)
-    switch (browserType)
-    {
-      case CHROME:
-        if (System.getProperty("webdriver.chrome.driver") == null ||
-          System.getProperty("webdriver.chrome.driver").length() == 0)
-          throw new IllegalStateException("Please configure your SL_CHROME_DRIVER environment variable to point to the Selenium Google Chrome Driver");
-
-        //Create a new instance of Chrome driver
-        ChromeOptions options = new ChromeOptions();
-        options.addArguments("--start-maximized", "--lang=" + language);
-        driver = new ChromeDriver(options);
-        break;
-      case FIREFOX:
-        if(System.getProperty("webdriver.gecko.driver") == null
-          || System.getProperty("webdriver.gecko.driver").length() == 0)
-          throw new IllegalStateException(
-            "Please configure your SL_FIREFOX_DRIVER environment variable to point to the Mozilla Firefox Driver");
-
-        //Create a new instance of Firefox driver
-        driver = new FirefoxDriver();
-        break;
-      case IE:
-        if(System.getProperty("webdriver.ie.driver") == null
-                || System.getProperty("webdriver.ie.driver").length() == 0)
-          throw new IllegalStateException(
-                  "Please configure your SL_IE_DRIVER environment variable to point to the Internet Explorer Driver");
-
-        //For more info, on how to configure IE driver, plese read https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
-        driver = new InternetExplorerDriver();
-        break;
-      default:
-        throw new IllegalArgumentException("Unknown browser type");
-    }
-
-    wait = new WebDriverWait(driver, defaultTimeOutInSeconds);
-    driver.get(startURL);
-  }
-
-  public WebDriver getDriver()
-  {
-    return driver;
-  }
-
-  public WebDriverWait getWait()
-  {
-    return wait;
-  }
-
-  public WebElement findElementById(String id)
-  {
-    return driver.findElement(By.id(id));
-  }
-
-  /**
-   * Verify that we land in a correct page based on display title
-   * @param expected
-   */
-  public void verifyHeader(String expected)
-  {
-    WebElement element =
-      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("heading")));
-
-    Assert.assertThat(element.getText(), CoreMatchers.is(CoreMatchers.equalTo(expected)));
-  }
-
-  /**
-   * Verify that we land in a correct page based on display title substring
-   * @param expected
-   */
-  public void verifyHeaderContains(String expected)
-  {
-    WebElement element =
-      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("heading")));
-
-    Assert.assertThat(element.getText(), CoreMatchers.containsString(expected));
-  }
-
-  /**
-   * Verify that we don't land in an error page
-   */
-  public void verifyThereIsNoError()
-  {
-    WebElement element =
-      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("heading")));
-
-    Assert.assertNotEquals("Error!", element.getText());
-  }
-
-  /**
-   * Navigate to a page based on sidebar link alt text
-   * @param lintAlt
-   */
-  public void navigateTo(String lintAlt)
-  {
-    //Identify the link
-    WebElement ele =
-      driver.findElement(
-        By.cssSelector(".sidebar-menu .treeview-menu a[alt=\"" + lintAlt + "\"]"));
-
-    //Expand the menu group, so that the element gets visible
-    String js = "return $(arguments[0]).closest('.treeview').get(0)";
-    WebElement parent = (WebElement)((JavascriptExecutor)driver).executeScript(js, ele);
-    if (!hasClass(parent, "active"))
-    {
-      js = "$(arguments[0]).closest('.treeview').find('a:first-child').click();";
-      ((JavascriptExecutor)driver).executeScript(js, ele);
-      //waitUntilAnimationIsDone(".sidebar-menu .treeview .treeview-menu");
-      //Wait for a second for the animation to complete.
-      try
-      {
-        Thread.sleep(1000);
-      }
-      catch (InterruptedException e)
-      {
-        e.printStackTrace();
-      }
-    }
-
-    //Wait until the menu is link is visible
-    wait.until(ExpectedConditions.elementToBeClickable(ele)).click();
-
-    //waitForAjax();
-    waitForAjaxAndDocumentReady();
-  }
-
-  /**
-   * Check if a element is present in DOM
-   * @param selector
-   * @return true, if the element exists else false
-   */
-  private boolean exists(By selector)
-  {
-    return driver.findElements(selector).size() != 0;
-  }
-
-  /**
-   * Find an element by waiting we find it based on its visibility
-   * @param selector
-   * @return
-   */
-  public WebElement waitFindElement(By selector)
-  {
-    return wait.until(ExpectedConditions.visibilityOfElementLocated(selector));
-  }
-
-  /**
-   * Find an element by waiting until it becomes clickable
-   * @param selector
-   * @return
-   */
-  public WebElement waitElementClickable(By selector)
-  {
-    return wait.until(ExpectedConditions.elementToBeClickable(selector));
-  }
-
-  /**
-   * Find an element by waiting until we find it's presence in dom
-   * @param selector
-   * @return
-   */
-  public WebElement waitUntilPresenceOfElementLocated(By selector)
-  {
-    return wait.until(ExpectedConditions.presenceOfElementLocated(selector));
-  }
-
-  /**
-   * Find an element by it's name
-   * @param name
-   */
-  public void waitForElementWithName(String name)
-  {
-    waitFor(By.name(name));
-  }
-
-  public void waitForPresenceById(String id)
-  {
-    waitForPresence(By.id(id));
-  }
-
-  public void waitForPresence(By selector)
-  {
-    wait.until(ExpectedConditions.presenceOfElementLocated(selector));
-  }
-
-  public void waitFor(By selector)
-  {
-    wait.until(ExpectedConditions.visibilityOfElementLocated(selector));
-  }
-
-  /**
-   * Click a tab by it's name
-   * @param tabName the name of the tab
-   */
-  public void clickTab(String tabName)
-  {
-    WebElement element =
-      waitElementClickable(By.cssSelector("a[data-toggle=\"tab\"][alt=\"" + tabName + " tab\"]"));
-    element.click();
-    waitForAjaxAndDocumentReady();
-  }
-
-  /**
-   * Click a button based on title, button created using anchor tag and has title attribute set.
-   * @param title
-   */
-  public void clickButtonByTitle(String title)
-  {
-    WebElement element =
-      waitElementClickable(
-        By.xpath(
-          "//a[contains(@class,'btn') and contains(@data-original-title,'" + title + "')]"));
-    element.click();
-
-    if (!isAlertPresent())
-    {
-      waitForAjaxAndDocumentReady();
-    }
-  }
-
-  public void clickButton(String text) throws Exception
-  {
-    clickButton(text, defaultTimeOutInSeconds);
-  }
-
-  /**
-   * Clicks a button based on visible text, this type of button is created using anchor tag with
-   * .btn class
-   * @param text
-   */
-  public void clickButton(String text, long timeOutInSeconds) throws Exception
-  {
-    /*WebElement element =
-        waitElementClickable(
-            By.xpath("//a[contains(@class,'btn') and normalize-space()='" + text + "']"));
-    element.click();*/
-
-    boolean found = false;
-    List<WebElement> elements = driver.findElements(By.xpath("//a[contains(concat(' ',@class,' '), ' btn ')] | //button[contains(concat(' ',@class,' '), ' btn ')]"));
-
-    for (int i = 0; i < elements.size(); i++)
-    {
-      WebElement element = elements.get(i);
-      System.out.println(getRenderedSource(element));
-      wait.until(ExpectedConditions.elementToBeClickable(element));
-      String actualText = element.getText();
-
-      if (actualText != null && actualText.length() > 0)
-      {
-        actualText = actualText.trim();
-      }
-
-      if (actualText.equals(text))
-      {
-        element.click();
-        found = true;
-        break;
-      }
-    }
-
-    if (!found)
-    {
-      throw new Exception("Button not found with text - " + text);
-    }
-
-    if (!isAlertPresent())
-    {
-      waitForAjaxAndDocumentReady(timeOutInSeconds);
-    }
-  }
-
-  /**
-   * Click a button created using <input type="button"/>
-   * @param buttonText
-   * @param islegacy
-   */
-  public void clickButton(String buttonText, boolean islegacy) throws Exception
-  {
-    if (!islegacy)
-    {
-      clickButton(buttonText);
-    }
-    else
-    {
-      waitFindElement(By.cssSelector("[type=\"button\"][value=\"" + buttonText + "\"]")).click();
-    }
-  }
-
-  /**
-   * Click on a radio button with a specific value
-   * @param name
-   * @param value
-   */
-  public void clickRadioButton(String name, String value)
-  {
-    waitElementClickable(By.xpath("//input[@type='radio'][@name='" + name + "'][@value='" + value + "']")).click();
-  }
-
-  /**
-   * Click a checkbox with the specified name
-   * @param name
-   */
-  public void clickCheckbox(String name)
-  {
-    waitElementClickable(By.xpath("//input[@type='checkbox'][@name='" + name + "']")).click();
-  }
-
-  /**
-   * Check if a alert box appeared in the browser.s
-   * @return
-   */
-  public boolean isAlertPresent()
-  {
-    boolean foundAlert = false;
-    WebDriverWait wait = new WebDriverWait(driver, 0 /*timeout in seconds*/);
-    try
-    {
-      wait.until(ExpectedConditions.alertIsPresent());
-      foundAlert = true;
-    }
-    catch (TimeoutException eTO)
-    {
-      foundAlert = false;
-    }
-    return foundAlert;
-  }
-
-  /**
-   * Accepts the alert box
-   */
-  public void acceptAlert()
-  {
-    wait.until(ExpectedConditions.alertIsPresent());
-    Alert alert = driver.switchTo().alert();
-    alert.accept();
-  }
-
-  /**
-   * Set value of an element with name
-   * @param name
-   * @param value
-   */
-  public void setValue(String name, String value)
-  {
-    setValue(driver, name, value);
-  }
-
-  /**
-   * Set value of an element with name by searching in another element
-   * @param context
-   * @param name
-   * @param value
-   */
-  public void setValue(SearchContext context, String name, String value)
-  {
-    setValue(context, By.name(name), value);
-  }
-
-  public void setValue(SearchContext context, By selector, String value)
-  {
-    WebElement element = context.findElement(selector);
-    //Make sure, there is no default text in the input.
-    element.clear();
-    element.sendKeys(value);
-  }
-
-  /**
-   * Select value of a custom select box using javascript.
-   * @param name
-   * @param value
-   */
-  public void selectValue(String name, String value)
-  {
-    WebElement element = waitUntilPresenceOfElementLocated(By.name(name));
-    System.out.println(element.toString());
-    if (hasClass(element, "selectpicker"))
-    {
-      String js = "$(arguments[0]).selectpicker('val','" + value + "')";
-      ((JavascriptExecutor)driver).executeScript(js, element);
-    }
-    else
-    {
-      Select select = new Select(element);
-      select.selectByValue(value);
-    }
-  }
-
-  /**
-   * Executes javascript in browser
-   * @param element
-   * @param method
-   * @param params
-   */
-  public void executeJquery(WebElement element, String method, String params)
-  {
-    String js = "$(arguments[0])." + method + "(" + params + ")";
-    System.out.println("JavaScript to be executed: " + js);
-    ((JavascriptExecutor)driver).executeScript(js, element);
-  }
-
-  /**
-   * Check if an element has a class
-   * @param element
-   * @param className
-   * @return
-   */
-  private boolean hasClass(WebElement element, String className)
-  {
-    if (element.getAttribute("class") != null)
-      return element.getAttribute("class").contains(className);
-    return false;
-  }
-
-  /**
-   * Get the attribute value of an element
-   * @param id
-   * @param attribute
-   * @return
-   */
-  public String getAttributeValueById(String id, String attribute)
-  {
-    WebElement element = driver.findElement(By.id(id));
-    return element.getAttribute(attribute);
-  }
-
-  // Macro operations for job management
-
-  /**
-   * Perform an action (Start, Start minimal, Pause, Restart, Restart minimal, Abort) on a specified
-   * job (English version).
-   * @param jobID
-   * @param action
-   */
-  public void performJobActionEN(String jobID, String action)
-  {
-    //Navigate to Status and Job management
-    navigateTo("Manage jobs");
-    waitForElementWithName("liststatuses");
-
-    waitElementClickable(
-      By.xpath(
-        "//tr[@job-id="
-          + jobID
-          + "]//a[contains(@class,'btn') and text()='"
-          + action
-          + "']"))
-      .click();
-  }
-
-  /**
-   * Wait until the status of an job become as mentioned (English version)
-   * @param jobID         is the jobID
-   * @param jobStatus     is the desired job status (e.g. 'Done')
-   * @param timeoutAmount is the maximum time until the status is expected
-   * @throws Exception
-   */
-  public void waitForJobStatusEN(final String jobID, final String jobStatus, final int timeoutAmount) throws Exception
-  {
-    waitForJobStatus(jobID, jobStatus, timeoutAmount, "Manage jobs", "liststatuses", "Refresh");
-  }
-
-  /**
-   * Wait until the status of an job become as mentioned (generic version)
-   * @param jobID               is the jobID
-   * @param jobStatus           is the desired job status (e.g. 'Done')
-   * @param timeoutAmount       is the maximum time until the status is expected
-   * @param manageJobsPage      is the 'manage jobs' page
-   * @param listStatusesElement is the 'list statuses' element
-   * @param refreshButton       is the 'Refresh" button
-   * @throws Exception
-   */
-  public void waitForJobStatus(final String jobID, final String jobStatus, int timeoutAmount, final String manageJobsPage, final String listStatusesElement, final String refreshButton)
-    throws Exception
-  {
-    //Navigate to Status and Job management
-    navigateTo(manageJobsPage);
-    waitForElementWithName(listStatusesElement);
-
-    while (true)
-    {
-      if (!exists(By.xpath("//tr[@job-id='" + jobID + "']")))
-      {
-        throw new Exception("Job " + jobID + " not found");
-      }
-      if (exists(By.xpath("//tr[@job-id='" + jobID + "' and @job-status-name='" + jobStatus + "']")))
-      {
-        break;
-      }
-      if (timeoutAmount == 0)
-      {
-        throw new Exception("Timed out waiting for job " + jobID + " to acheive status '" + jobStatus + "'");
-      }
-      clickButton(refreshButton);
-      waitForElementWithName(listStatusesElement);
-      //Let us wait for a second.
-      Thread.sleep(1000L);
-      timeoutAmount--;
-    }
-  }
-
-  /**
-   * Obtain a given job's status (English version).
-   * @param jobID is the job ID.
-   * @return the job status, if found,
-   */
-  public String getJobStatusEN(final String jobID) throws Exception
-  {
-    return getJobStatus(jobID, "Manage jobs", "liststatuses");
-  }
-
-  /**
-   * Obtain a given job's status (generic version).
-   * @param jobID               is the job ID.
-   * @param manageJobsPage      is the 'manage jobs' page
-   * @param listStatusesElement is the 'list statuses' element
-   * @return the job status, if found,
-   */
-  public String getJobStatus(final String jobID, final String manageJobsPage, final String listStatusesElement)
-    throws Exception
-  {
-    //Navigate to Status and Job management
-    navigateTo(manageJobsPage);
-    waitForElementWithName(listStatusesElement);
-
-    final WebElement element = driver.findElement(By.xpath("//tr[@job-id=" + jobID + "]"));
-    if (element == null)
-    {
-      throw new Exception("Can't find job " + jobID);
-    }
-    return element.getAttribute("job-status-name");
-  }
-
-  /**
-   * Wait for a specified job to go away after being deleted (English version).
-   * @param jobID
-   * @param timeoutAmount
-   * @throws Exception
-   */
-  public void waitForJobDeleteEN(final String jobID, int timeoutAmount) throws Exception
-  {
-    waitForJobDelete(jobID, timeoutAmount, "Manage jobs", "liststatuses", "Refresh");
-  }
-
-  /**
-   * Wait for a specified job to go away after being deleted (generic version).
-   * @param jobID
-   * @param timeoutAmount
-   * @param manageJobsPage      is the 'manage jobs' page
-   * @param listStatusesElement is the 'list statuses' element
-   * @param refreshButton       is the 'Refresh" button
-   * @throws Exception
-   */
-  public void waitForJobDelete(final String jobID, int timeoutAmount, final String manageJobsPage, final String listStatusesElement, final String refreshButton)
-    throws Exception
-  {
-    navigateTo(manageJobsPage);
-    waitForElementWithName(listStatusesElement);
-    while (exists(By.xpath("//tr[@job-id=\"" + jobID + "\"]")))
-    {
-      if (timeoutAmount == 0)
-      {
-        throw new Exception("Timed out waiting for job " + jobID + " to go away");
-      }
-      clickButton(refreshButton);
-      waitForElementWithName(listStatusesElement);
-      //Let us wait for a second.
-      Thread.sleep(1000L);
-      timeoutAmount--;
-    }
-  }
-
-  public boolean waitForAjaxAndDocumentReady()
-  {
-    return waitForAjaxAndDocumentReady(defaultTimeOutInSeconds);
-  }
-
-  public boolean waitForAjaxAndDocumentReady(long timeOutInSeconds)
-  {
-    WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
-
-    // wait for jQuery to load
-    ExpectedCondition<Boolean> jQueryLoad =
-      new ExpectedCondition<Boolean>()
-      {
-        @Override
-        public Boolean apply(WebDriver driver)
-        {
-          try
-          {
-            return ((Long)
-              ((JavascriptExecutor)getDriver()).executeScript("return jQuery.active")
-              == 0);
-          }
-          catch (Exception e)
-          {
-            // no jQuery present
-            return true;
-          }
-        }
-      };
-
-    // wait for Javascript to load
-    ExpectedCondition<Boolean> jsLoad =
-      new ExpectedCondition<Boolean>()
-      {
-        @Override
-        public Boolean apply(WebDriver driver)
-        {
-          return ((JavascriptExecutor)getDriver())
-            .executeScript("return document.readyState")
-            .toString()
-            .equals("complete");
-        }
-      };
-
-    return wait.until(jQueryLoad) && wait.until(jsLoad);
-  }
-
-  public void waitUntilAnimationIsDone(final String selector)
-  {
-    waitUntilAnimationIsDone(selector, defaultTimeOutInSeconds);
-  }
-
-  public void waitUntilAnimationIsDone(final String selector, final long timeOutInSeconds)
-  {
-    WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
-    ExpectedCondition<Boolean> expectation =
-      new ExpectedCondition<Boolean>()
-      {
-        @Override
-        public Boolean apply(WebDriver driver)
-        {
-          String temp =
-            ((JavascriptExecutor)driver)
-              .executeScript("return jQuery('" + selector + "').is(':animated')")
-              .toString();
-          return temp.equalsIgnoreCase("false");
-        }
-      };
-
-    try
-    {
-      wait.until(expectation);
-    }
-    catch (TimeoutException e)
-    {
-      throw new AssertionError("Element animation is not finished in time. selector: " + selector);
-    }
-  }
-
-  /**
-   * Get the source of the html document
-   * @return
-   */
-  public String getRenderedSource()
-  {
-    return getRenderedSource(By.tagName("html"));
-  }
-
-  /**
-   * Get the source of an element by find it in DOM
-   * @param selector
-   * @return
-   */
-  public String getRenderedSource(By selector)
-  {
-    return getRenderedSource(driver.findElement(selector));
-  }
-
-  /**
-   * Get the source of an element
-   * @param element
-   * @return
-   */
-  public String getRenderedSource(WebElement element)
-  {
-    return (String)
-      ((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML", element);
-  }
-
-  private long tick()
-  {
-    long TICKS_AT_EPOCH = 621355968000000000L;
-    return System.currentTimeMillis() * 10000 + TICKS_AT_EPOCH;
-  }
-
-  /**
-   * Clean up the files we created.
-   */
-  @After
-  public void teardown() throws Exception
-  {
-    if (driver != null)
-    {
-      driver.close();
-      driver.quit();
-      driver = null;
-      wait = null;
-    }
-  }
-}
diff --git a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/UILockSpinner.java b/framework/core/src/test/java/org/apache/manifoldcf/core/tests/UILockSpinner.java
deleted file mode 100644
index ceba70e..0000000
--- a/framework/core/src/test/java/org/apache/manifoldcf/core/tests/UILockSpinner.java
+++ /dev/null
@@ -1,64 +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 org.apache.manifoldcf.core.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-public class UILockSpinner
-{
-
-  protected final static String lockName = "TESTLOCK";
-
-  public static void main(String[] argv)
-    throws Exception
-  {
-    IThreadContext threadContext = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(threadContext);
-
-    // Create a thread context object.
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-
-    System.out.println("Starting test");
-
-    int i = 0;
-    while (i < 100000)
-    {
-      if ((i % 100) == 0)
-        System.out.println("UI iteration "+Integer.toString(i));
-
-      // This thread is a writer.
-      lockManager.enterWriteLock(lockName);
-      try
-      {
-        Thread.sleep(10);
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(lockName);
-      }
-
-      Thread.sleep(1000);
-      i++;
-    }
-
-    System.out.println("Done test - no hang");
-
-  }
-
-}
diff --git a/framework/core/src/test/resources/org/apache/manifoldcf/core/tests/Javascript.py b/framework/core/src/test/resources/org/apache/manifoldcf/core/tests/Javascript.py
deleted file mode 100644
index 6bf6014..0000000
--- a/framework/core/src/test/resources/org/apache/manifoldcf/core/tests/Javascript.py
+++ /dev/null
@@ -1,1935 +0,0 @@
-#!/usr/bin/python
-# $Id$
-
-# 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
-# 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.
-
-import re
-
-def build_method_name( name, argset ):
-    """ Method names consist of the actual name plus the number of arguments """
-    return "%s:%d" % (name,len(argset))
-
-# Basic class which represents a javascript object.
-# Each such class instance has a virtual set of properties, each
-# of which is an object in its own right.
-class JSObject:
-
-    def __init__( self ):
-        pass
-
-    def is_type( self, type ):
-        return isinstance( self, type )
-
-    def call( self, argset, context ):
-        # If this is a method, evaluate it; otherwise it's
-        # an error
-        raise Exception("Attempt to evaluate a non-method object: %s" % unicode(self))
-
-    def construct( self, argset, context ):
-        # If this is a class, construct it, otherwise it's
-        # an error
-        raise Exception("Attempt to construct a non-class object: %s" % unicode(self))
-
-    def get_type( self, member_name ):
-        return JSString( "undefined" )
-
-    def get_value( self, member_name ):
-        raise Exception("Object %s has no such property '%s'" % (unicode(self), member_name) )
-
-    def set_value( self, member_name, value ):
-        raise Exception("Object %s has no such property '%s'" % (unicode(self), member_name) )
-
-    def type_value( self ):
-        raise Exception("Object %s has no type value" % unicode(self) )
-
-    def str_value( self ):
-        raise Exception("Object %s has no string value" % unicode(self) )
-
-    def num_value( self ):
-        raise Exception("Object %s has no numeric value" % unicode(self) )
-
-    def bool_value( self ):
-        raise Exception("Object %s has no boolean value" % unicode(self) )
-
-    def set_reference( self, newobject ):
-        # For objects that are references, this is how they are set.  All other kinds of objects
-        # do not support this operation.
-        raise Exception("Object %s is not a reference and cannot be set" % unicode(self))
-        
-    def dereference( self ):
-        # For objects that are references, this operation dereferences them.  All others
-        # return self.
-        return self
-
-    def dereference_type( self ):
-        # For objects that are references, this operation dereferences them.  All others
-        # return self.
-        return self.type_value( )
-
-# Array object.
-class JSArray( JSObject ):
-
-    def __init__ ( self, array_size ):
-        """ This javascript array object has a given size and doesn't grow or shrink """
-        JSObject.__init__( self )
-        self.array_size = array_size
-        self.array = { }
-
-    def get_type( self, member_name ):
-        if member_name == "length":
-            return "number"
-        index = int(member_name)
-        assert index >=0 and index < self.array_size
-        if index >= len(self.array):
-            return JSObject.get_type( member_name )
-        return self.array[ index ].type_value( )
-
-    def get_value( self, member_name ):
-        if member_name == "length":
-            return JSNumber( self.array_size )
-        index = int(member_name)
-        assert index >=0 and index < self.array_size
-        if index >= len(self.array):
-            return JSNull()
-        return self.array[ index ]
-
-    def set_value( self, member_name, value):
-        assert isinstance( value, JSObject )
-        if member_name == "length":
-            raise Exception("Can't set the size of an array after the fact")
-        index = int(member_name)
-        assert index >=0 and index < self.array_size
-        self.array[ index ] = value
-
-    def __str__( self ):
-        return "Array of %d items" % self.array_size
-
-    def __unicode__( self ):
-        return "Array of %d items" % self.array_size
-
-# Context javascript object.  This is an object that corresponds
-# to a scope of a method etc.
-class JSScope( JSObject ):
-
-    def __init__ ( self, enclosing_scope ):
-        """ This class has the object dictionary """
-        JSObject.__init__( self )
-        self.members = { }
-        self.enclosing_scope = enclosing_scope
-
-    def get_value( self, member_name ):
-        """ Look for object, and if it's there, return it.  Otherwise, look in enclosing scope. """
-        try:
-            return self.members[ member_name ]
-        except:
-            pass
-        if self.enclosing_scope == None:
-            return JSObject.get_value( self, member_name )
-        return self.enclosing_scope.get_value( self, member_name )
-
-    def define_value( self, member_name, value=None ):
-        """ Only return an error if this already exists """
-        try:
-            test = self.members[ member_name ]
-        except:
-            self.members[ member_name ] = value
-            return
-        raise Exception("Duplicate definition for '%s'" % member_name)
-
-    def set_value( self, member_name, value ):
-        """ Set the object property, which we find in the same order as for lookup """
-        try:
-            # Make sure it's already been defined
-            test = self.members[ member_name ]
-        except:
-            if self.enclosing_scope == None:
-                return JSObject.set_value( self, member_name, value )
-            else:
-                return self.enclosing_scope.set_value( self, member_name, value )
-
-        self.members[ member_name ] = value
-
-    def find_symbol( self, symbol_name ):
-        """ Get the first parent object for which this symbol exists """
-        if symbol_name in self.members:
-            test = self.members[ symbol_name ]
-            return JSObjMemberReference( self, symbol_name )
-        if self.enclosing_scope == None:
-            raise Exception("No such variable or method: %s" % symbol_name )
-        return self.enclosing_scope.find_symbol( symbol_name )
-
-
-# Method-type object
-class JSMethod( JSObject ):
-
-    def __init__( self, name, arguments, body ):
-        JSObject.__init__( self )
-        self.name = name
-        self.arguments = arguments
-        self.body = body
-
-    def call( self, argset, enclosing_scope ):
-        # Throw up if argument count doesn't agree
-        if len(self.arguments) != len(argset):
-            raise Exception("Arguments do not match for method '%s'" % self.name)
-        # Set up a new context
-        context = JSScope( enclosing_scope )
-        # Initialize arguments
-        i = 0
-        while i < len(self.arguments):
-            argument_name = self.arguments[i]
-            argument_value = argset[i]
-            context.define_value( argument_name )
-            context.set_value( argument_name, argument_value )
-            i += 1
-        # Execute method tokens
-        ts = JSTokenStream( self.body )
-        response = ts.evaluate_statement( context, "method %s" % self.name )
-        if isinstance( response, JSReturnSignal ):
-            return response.get_value( )
-        else:
-            return JSNull( )
-
-# Class method-type object
-class JSClassMethod( JSMethod ):
-
-    def __init__( self, name, class_instance, arguments, body ):
-        JSMethod.__init__( self, name, ["this"] + arguments, body )
-        self.class_instance = class_instance
-
-    def call( self, argset, enclosing_scope ):
-        # Tack on class instance to arg set
-        return JSMethod.call( self, [ self.class_instance ] + argset, enclosing_scope )
-
-# Class-type object
-class JSClass( JSObject ):
-
-    def __init__( self, name, members ):
-        JSObject.__init__( self )
-        self.name = name
-        self.members = members
-
-    def construct( self, argset, enclosing_scope ):
-        # Build an instance of the class.  This involves locating a matching constructor in the list of methods,
-        # and creating a class instance object from it
-        rval = JSClassInstance( self )
-
-        # Initialize member variables
-        for (name,value) in self.members:
-            rval.set_value(name,value)
-
-        full_args = [ rval ] + argset
-        method_member = rval.get_value(build_method_name(self.name,full_args))
-        if method_member == None:
-            raise Exception("Constructor with %d arguments not found for %s" % (len(argset), self.name))
-        # Call the constructor method
-        method_member.call( full_args, enclosing_scope )
-        # return the object we just constructed
-        return rval
-
-# Class instance object
-class JSClassInstance( JSObject ):
-
-    def __init__( self, class_definition ):
-        JSObject.__init__( self )
-        self.class_definition = class_definition
-        self.member_variables = { }
-
-    def get_value( self, member_name ):
-        return self.member_variables[member_name]
-
-    def set_value( self, member_name, value ):
-        self.member_variables[member_name] = value
-
-
-# Boolean type object
-class JSBoolean( JSObject ):
-
-    def __init__( self, value ):
-        JSObject.__init__( self )
-        self.value = value
-
-    def bool_value( self ):
-        return self.value
-
-    def __str__( self ):
-        if self.value:
-            return "Boolean 'true' value"
-        else:
-            return "Boolean 'false' value"
-
-    def __unicode__( self ):
-        if self.value:
-            return "Boolean 'true' value"
-        else:
-            return "Boolean 'false' value"
-
-# Number-type object
-class JSNumber( JSObject ):
-
-    def __init__( self, value ):
-        JSObject.__init__( self )
-        self.value = value
-
-    def type_value( self ):
-        return unicode( "number" )
-
-    def num_value( self ):
-        return self.value
-
-    def str_value( self ):
-        return unicode( self.value )
-
-    def __str__( self ):
-        return "Numeric value ("+unicode(self.value)+")"
-
-    def __unicode__( self ):
-        return "Numeric value ("+unicode(self.value)+")"
-
-# Regexp test method
-class JSRegexpTestMethod( JSObject ):
-
-    def __init__( self, regexp ):
-        JSObject.__init__( self )
-        self.regexp = regexp
-
-    def call( self, argset, context ):
-        # Need one argument
-        if len(argset) != 1:
-            raise Exception("Expecting one string argument to test() method")
-        testvalue = argset[0].str_value()
-
-        # Do the test.
-        # Now, this is a bit dodgy, because I'm using python regular expressions to
-        # model javascript regular expressions.  If this gets more than dirt simple, we'll
-        # have to interpret the javascript expression and convert it to the py one, but
-        # for now we can get away with just using the python stuff for now.
-        flags = 0
-        if self.regexp.is_regexp_global( ):
-            flags += re.MULTILINE
-        if self.regexp.is_regexp_insensitive( ):
-            flags += re.IGNORECASE
-        
-        regexp = re.compile( self.regexp.get_regexp( ), flags )
-
-        mo = regexp.match( testvalue )
-        rval = (mo != None)
-
-        return JSBoolean( rval )
-
-# Regexp-type object
-class JSRegexp( JSObject ):
-
-    def __init__( self, value, is_global, is_insensitive ):
-        JSObject.__init__( self )
-        self.value = value
-        self.is_global = is_global
-        self.is_insensitive = is_insensitive
-
-    def type_value( self ):
-        return unicode( "regexp" )
-
-    def get_value( self, member_name ):
-        # A regexp has a method property for the test method (which is the only one
-        # we currently support)
-        if member_name == "test":
-            return JSRegexpTestMethod( self )
-        else:
-            return JSObject.get_value( member_name )
-
-    def get_regexp( self ):
-        return self.value
-
-    def is_regexp_global( self ):
-        return self.is_global
-
-    def is_regexp_insensitive( self ):
-        return self.is_insensitive
-
-# Search method
-class JSSearch( JSObject ):
-
-    def __init__( self, string_object ):
-        JSObject.__init__( self )
-        self.string_object = string_object
-
-    def call( self, argset, enclosing_scope ):
-        if len(argset) != 1:
-            raise Exception("Search requires one string or regexp argument, found %d" % len(argset))
-        if argset[0].is_type( JSString ):
-            # Do a string search
-            value = self.string_object.str_value().find(argset[0].str_value())
-            return JSNumber(value)
-
-        elif argset[0].is_type( JSRegexp ):
-            # Do a regexp search
-            regexp_value = argset[0]
-            flags = 0
-            if regexp_value.is_regexp_global( ):
-                flags += re.MULTILINE
-            if regexp_value.is_regexp_insensitive( ):
-                flags += re.IGNORECASE
-
-            # If there's an illegal regular expression, we SHOULD throw a Javascript exception, but we don't have exception processing yet...
-            # MHL
-            regexp = re.compile( regexp_value.get_regexp( ), flags )
-
-            mo = regexp.match( self.string_object.str_value() )
-            if mo == None:
-                return JSNumber(-1)
-            return JSNumber(mo.start())
-
-        else:
-            raise Exception("Search requires a regexp or string argument")
-
-
-# Replace method
-class JSReplace( JSObject ):
-
-    def __init__( self, string_object ):
-        JSObject.__init__( self )
-        self.string_object = string_object
-
-    def call( self, argset, enclosing_scope ):
-        if len(argset) != 2:
-            raise Exception("Replace requires two arguments: a regexp and a string; found %d" % len(argset))
-        if argset[0].is_type( JSRegexp ) == False:
-            raise Exception("Replace requires a regexp argument")
-        if argset[1].is_type( JSString ) == False:
-            raise Exception("Replace requires a string argument")
-
-        regexp_value = argset[0]
-        replace_value = argset[1]
-
-        # Scan the current string.  Find every match and replace it with the replace value.
-        flags = 0
-        if regexp_value.is_regexp_global( ):
-            flags += re.MULTILINE
-        if regexp_value.is_regexp_insensitive( ):
-            flags += re.IGNORECASE
-
-        # If there's an illegal regular expression, we SHOULD throw a Javascript exception, but we don't have exception processing yet...
-        # MHL
-        regexp = re.compile( regexp_value.get_regexp( ), flags )
-
-        # Here's the output value
-        rval = regexp.sub( replace_value.str_value(), self.string_object.str_value() )
-        return JSString(rval)
-
-# Index-of method
-class JSIndexOf( JSObject ):
-
-    def __init__( self, string_object ):
-        JSObject.__init__( self )
-        self.string_object = string_object
-
-    def call( self, argset, enclosing_scope ):
-        # Throw up if argument count doesn't agree
-        if len(argset) != 1:
-            raise Exception("IndexOf requires one string argument, found %d" % len(argset))
-        if argset[0].is_type( JSString ) == False:
-            raise Exception("IndexOf requires a string argument")
-        value = self.string_object.str_value().find(argset[0].str_value())
-        return JSNumber(value)
-
-# charAt method
-class JSCharAt( JSObject ):
-
-    def __init__( self, string_object ):
-        JSObject.__init__( self )
-        self.string_object = string_object
-
-    def call( self, argset, enclosing_scope ):
-        # Throw up if argument count doesn't agree
-        if len(argset) != 1:
-            raise Exception("CharAt requires one numeric argument, found %d" % len(argset))
-        if argset[0].is_type( JSNumber ) == False:
-            raise Exception("CharAt requires a numeric argument")
-        value = self.string_object.str_value()[int(argset[0].num_value())]
-        return JSString(value)
-
-# split method
-class JSSplit( JSObject ):
-    def __init__( self, string_object ):
-        JSObject.__init__( self )
-        self.string_object = string_object
-
-    def call( self, argset, enclosing_scope ):
-        # Throw up if argument count doesn't agree
-        if len(argset) != 1:
-            raise Exception("Split requires one string argument, found %d" % len(argset))
-        if argset[0].is_type( JSString ) == False:
-            raise Exception("Split requires a string argument")
-        value = self.string_object.str_value().split(argset[0].str_value())
-        # Make an array of strings
-        rval = JSArray( len(value) )
-        index = 0
-        for index in range(0,len(value)):
-            rval.set_value(str(index),JSString(value[index]))
-        return rval
-
-class JSSubstring( JSObject ):
-    def __init__( self, string_object ):
-        JSObject.__init__( self )
-        self.string_object = string_object
-
-    def call( self, argset, enclosing_scope ):
-        string_value = self.string_object.str_value()
-        # Throw up if argument count doesn't agree
-        if len(argset) < 1 or len(argset) > 2:
-            raise Exception("Substring requires one or two numeric arguments, found %d" % len(argset))
-        if argset[0].is_type( JSNumber ) == False:
-            raise Exception("Substring requires a numeric argument")
-        start_value = argset[0].num_value()
-        if len(argset) > 1:
-            if argset[1].is_type( JSNumber ) == False:
-                raise Exception("Substring requires a second numeric argument")
-            end_value = argset[1].num_value()
-        else:
-            end_value = len(string_value)
-        return JSString(string_value[start_value:end_value])
-
-# String-type object
-class JSString( JSObject ):
-
-    def __init__( self, value ):
-        JSObject.__init__( self )
-        assert isinstance( value, str ) or isinstance( value, unicode )
-        self.value = value
-
-    def get_value( self, member_name ):
-        if member_name == "indexOf":
-            return JSIndexOf( self )
-        if member_name == "charAt":
-            return JSCharAt( self )
-        if member_name == "length":
-            return JSNumber( len(self.value) )
-        if member_name == "search":
-            return JSSearch( self )
-        if member_name == "replace":
-            return JSReplace( self )
-        if member_name == "split":
-            return JSSplit( self )
-        if member_name == "substring":
-            return JSSubstring( self )
-        return JSObject.get_value( self, member_name )
-
-    def type_value( self ):
-        return unicode( "string" )
-
-    def str_value( self ):
-        return unicode( self.value )
-
-    def num_value( self ):
-        try:
-            return float(self.value)
-        except:
-            return JSObject.num_value( self )
-
-    def __str__( self ):
-        return "String value ("+unicode(self.value)+")"
-
-    def __unicode__( self ):
-        return "String value ("+unicode(self.value)+")"
-
-# Null
-class JSNull( JSObject ):
-
-    def __init__( self ):
-        JSObject.__init__( self )
-
-    def __str__( self ):
-        return "Null value"
-
-    def __unicode__( self ):
-        return "Null value"
-
-    def bool_value( self ):
-        return False
-
-# Javascript member reference
-class JSReference( JSObject ):
-    def __init__( self ):
-        JSObject.__init__( self )
-
-    def is_type( self, type ):
-        return self.dereference().is_type(type)
-
-    def call( self, argset, context ):
-        return self.dereference().call(argset,context)
-
-    def get_type( self, member_name ):
-        return self.dereference().get_type(member_name)
-
-    def get_value( self, member_name ):
-        return self.dereference().get_value(member_name)
-
-    def set_value( self, member_name, value ):
-        self.dereference().set_value(member_name,value)
-
-    def type_value( self ):
-        return self.dereference_type()
-
-    def str_value( self ):
-        return self.dereference().str_value()
-
-    def num_value( self ):
-        return self.dereference().num_value()
-
-    def bool_value( self ):
-        return self.dereference().bool_value()
-
-    def construct( self, argset, context ):
-        return self.dereference().construct(argset,context)
-
-# object/member style reference
-class JSObjMemberReference( JSReference ):
-    def __init__( self, obj, member ):
-        JSReference.__init__( self )
-        assert isinstance( member, str ) or isinstance( member, unicode )
-        assert isinstance( obj, JSObject )
-        self.object = obj
-        self.member = member
-
-    def dereference( self ):
-        return self.object.get_value( self.member )
-
-    def dereference_type( self ):
-        return self.object.get_type( self.member )
-
-    def set_reference( self, newobject ):
-        self.object.set_value( self.member, newobject )
-
-
-# Javascript statement return signal
-class JSSignal:
-    def __init__( self ):
-        pass
-
-class JSBreakSignal( JSSignal ):
-    def __init__( self ):
-        JSSignal.__init__( self )
-
-class JSContinueSignal( JSSignal ):
-    def __init__( self ):
-        JSSignal.__init__( self )
-
-class JSReturnSignal( JSSignal ):
-    def __init__( self, value ):
-        JSSignal.__init__( self )
-        self.value = value
-
-    def get_value( self ):
-        return self.value
-
-# Javascript token.
-class JSToken:
-    def __init__( self, punc_value=None, string_value=None, int_value=None, float_value=None, symbol_value=None, regexp_value=None, regexp_global=False, regexp_insensitive=False ):
-        self.punc_value = punc_value
-        self.string_value = string_value
-        self.int_value = int_value
-        self.float_value = float_value
-        self.symbol_value = symbol_value
-        self.regexp_value = regexp_value
-        self.regexp_global = regexp_global
-        self.regexp_insensitive = regexp_insensitive
-
-    def __str__( self ):
-        if self.punc_value != None:
-            return "Punctuation: "+str(self.punc_value)
-        elif self.string_value != None:
-            return "String: '"+str(self.string_value)+"'"
-        elif self.int_value != None:
-            return "Int: "+str(self.int_value)
-        elif self.float_value != None:
-            return "Float: "+str(self.float_value)
-        elif self.regexp_value != None:
-            rexp = "Regexp: "+str(self.regexp_value)+"("
-            if self.regexp_global:
-                rexp += "g"
-            if self.regexp_insensitive:
-                rexp += "i"
-            return rexp + ")"
-        else:
-            return "Symbol: "+str(self.symbol_value)
-
-    def __unicode__( self ):
-        if self.punc_value != None:
-            return "Punctuation: "+unicode(self.punc_value)
-        elif self.string_value != None:
-            return "String: '"+unicode(self.string_value)+"'"
-        elif self.int_value != None:
-            return "Int: "+unicode(self.int_value)
-        elif self.float_value != None:
-            return "Float: "+unicode(self.float_value)
-        elif self.regexp_value != None:
-            rexp = "Regexp: "+unicode(self.regexp_value)+"("
-            if self.regexp_global:
-                rexp += "g"
-            if self.regexp_insensitive:
-                rexp += "i"
-            return rexp + ")"
-        else:
-            return "Symbol: "+unicode(self.symbol_value)
-
-    def get_punc( self ):
-        return self.punc_value
-
-    def get_string( self ):
-        return self.string_value
-
-    def get_int( self ):
-        return self.int_value
-
-    def get_float( self ):
-        return self.float_value
-
-    def get_symbol( self ):
-        return self.symbol_value
-
-    def get_regexp( self ):
-        return self.regexp_value
-
-    def get_regexp_global( self ):
-        return self.regexp_global
-
-    def get_regexp_insensitive( self ):
-        return self.regexp_insensitive
-
-# Javascript token stream
-class JSTokenStream:
-    def __init__( self, body ):
-        self.body = body
-        self.start_index = 0
-        self.current_position = 0
-        self.current_token = None
-
-    def advance( self ):
-        self.current_token = None
-        self.current_position = self.start_index
-
-    def peek( self, slash_is_legal=False ):
-        if self.current_token == None:
-            self.current_position = self.start_index
-            self.current_token = self.build_next( slash_is_legal )
-        return self.current_token
-
-    def get_position( self ):
-        return self.current_position
-
-    def get_chunk( self, start_position ):
-        return self.body[ start_position : self.current_position ]
-
-    def set_position( self, position ):
-        self.start_index = position
-        self.current_position = position
-        self.current_token = None
-
-    # Evaluate a set of statements (e.g. definitions)
-    def evaluate_statement_list( self, context, place="global defs" ):
-        while True:
-            token = self.peek( )
-            if token == None:
-                break
-            self.evaluate_statement( context, place )
-
-    # Evaluate statement
-    # Returns a return status object (of type PSSignal), which signals
-    # what to do: break loop, continue loop, return (with value or not), or next statement
-    def evaluate_statement( self, context, place ):
-        # statement -> "{" statement1 ... statementn "}"
-        # statement -> expr ";"
-        # statement -> "var" symbol ["=" expr] ";"
-        # statement -> "function" string "(" [string ["," string ...]] ")" statement
-        # statement -> "if" "(" expr ")" "then" statement ["else" statement]
-        # statement -> "while" "(" expr ")" statement
-        # statement -> "break" ";"
-        # statement -> "continue" ";"
-        # statement -> "return" expr ";"
-        # statement -> "try" statement catchlist
-
-        token = self.peek( )
-        if token == None:
-            raise Exception("Unexpected end of code when looking for a statement, in %s" % place)
-        if token.get_punc( ) == "{":
-            # compound statement; evaluate them all in sequence, but also in a new scope
-            newscope = JSScope( context )
-            self.advance( )
-            execute_enabled = True
-            while True:
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Unexpected end of statement block in %s" % place)
-                if token.get_punc( ) == "}":
-                    break
-                if execute_enabled:
-                    result = self.evaluate_statement( newscope, place )
-                    if isinstance(result, JSContinueSignal) or isinstance(result, JSReturnSignal) or isinstance(result, JSBreakSignal):
-                        execute_enabled = False
-                else:
-                    self.skip_statement( )
-            self.advance( )
-            if execute_enabled == False:
-                return result
-            return None
-
-        elif token.get_symbol( ) == "var":
-            self.advance( )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of var statement")
-            if token.get_symbol( ) == None:
-                raise Exception("Var statement: Expecting a symbol, saw %s in %s" % (unicode(token), place))
-            self.advance( )
-            varname = token.get_symbol( )
-            # Look for '='
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "=":
-                # It has a value.
-                self.advance( )
-                value = self.evaluate_expr( context, place )
-                if value == None:
-                    raise Exception("Expected expression after =, in %s" % place)
-            else:
-                value = None
-            # Define symbol
-            context.define_value( varname, value )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Didn't find expected ';' at end of var statement defining '%s', saw EOF, in %s" % (varname, place))
-            if token.get_punc( ) == ";":
-                self.advance( )
-                return None
-            else:
-                unknown_tokens = [ unicode(token) ]
-                while True:
-                    self.advance( )
-                    token = self.peek( )
-                    if token == None or token.get_punc( ) == ";":
-                        raise Exception("Didn't find expected ';' at end of var statement defining '%s', saw '%s', in %s" % (varname, unicode(unknown_tokens),place))
-                    unknown_tokens += [ unicode(token) ]
-
-        elif token.get_symbol( ) == "if":
-            self.advance( )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of conditional in %s" % place)
-            if token.get_punc( ) != "(":
-                raise Exception("Expecting '(' in if")
-            self.advance( )
-            # Evaluate the expression
-            condition_result = self.evaluate_expr( context, place )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of conditional in %s" % place)
-            if token.get_punc( ) != ")":
-                raise Exception("Expecting ')' in if")
-            self.advance( )
-
-            if condition_result.bool_value( ):
-                rval = self.evaluate_statement( context, place )
-                token = self.peek( )
-                if token != None and token.get_symbol( ) == "else":
-                    self.advance( )
-                    self.skip_statement( )
-            else:
-                rval = None
-                self.skip_statement( )
-                token = self.peek( )
-                if token != None and token.get_symbol( ) == "else":
-                    self.advance( )
-                    rval = self.evaluate_statement( context, place )
-            return rval
-
-        elif token.get_symbol( ) == "while":
-            self.advance( )
-            # For while's, we need to remember the start of the expression, as well as the
-            # start of the "statement"
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of while in %s" % place)
-            if token.get_punc( ) != "(":
-                raise Exception("Expecting '(' in while, saw %s, in %s" % (unicode(token), place))
-            self.advance( )
-            expression_begin = self.get_position( )
-            while True:
-                continue_value = self.evaluate_expr( context, place )
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Unexpected end of while in %s" % place)
-                if token.get_punc( ) != ")":
-                    raise Exception("Expecting ')' in while, saw %s, in %s" % (unicode(token), place))
-                self.advance( )
-                if continue_value.bool_value( ):
-                    result = self.evaluate_statement( context, place )
-                    if isinstance(result, JSReturnSignal):
-                        return result
-                    if isinstance(result, JSBreakSignal):
-                        # already at end of statement
-                        return None
-                    # Continue just goes around again
-                else:
-                    self.skip_statement( )
-                    return None
-                self.set_position( expression_begin )
-                # Repeat!
-
-        elif token.get_symbol( ) == "break":
-            self.advance( )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of break in %s" % place)
-            if token.get_punc( ) != ";":
-                raise Exception("Expecting ';' in break, saw %s, in %s" % (unicode(token), place))
-            self.advance( )
-            return JSBreakSignal( )
-
-        elif token.get_symbol( ) == "continue":
-            self.advance( )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of continue in %s" % place)
-            if token.get_punc( ) != ";":
-                raise Exception("Expecting ';' in continue, saw %s, in %s" % (unicode(token), place))
-            self.advance( )
-            return JSContinueSignal( )
-
-        elif token.get_symbol( ) == "return":
-            self.advance( )
-            rval = self.evaluate_expr( context, place )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of return in %s" % place)
-            if token.get_punc( ) != ";":
-                raise Exception("Expecting ';' in return, saw %s, in %s" % (unicode(token), place))
-            self.advance( )
-            return JSReturnSignal( rval )
-
-        elif token.get_symbol( ) == "try":
-            self.advance( )
-            # Parse and execute the statement.  Note that this code does NOT yet actually do anything that could throw or catch exceptions!
-            # It just pretends the exception is never thrown, at the moment.
-            result = self.evaluate_statement( context, place )
-            saw_something = False
-            # Now, look for the catch clause
-            token = self.peek( )
-            if token != None and token.get_symbol() == "catch":
-                self.advance( )
-                saw_something = True
-                # Process the catch, and advance.
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Missing ( after catch, found EOF, in %s" % place)
-                if token.get_punc( ) != "(":
-                    raise Exception("Missing (, found %s, in %s" % (unicode(token),place) )
-                self.advance( )
-                # Grab the name of a symbol
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Missing symbol after catch(, found EOF, in %s" % place)
-                if token.get_symbol() == None:
-                    raise Exception("Missing symbol after catch(, found %s, in %s" % (unicode(token),place) )
-                catch_symbol = token.get_symbol( )
-                self.advance()
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Missing ) after catch, found EOF, in %s" % place)
-                if token.get_punc() != ")":
-                    raise Exception("Missing ) after catch, found %s, in %s" % (unicode(token),place))
-                self.advance()
-                # Skip the statement, since we never do any exception catching at this time.
-                self.skip_statement( )
-                token = self.peek( )
-            if token != None and token.get_symbol() == "finally":
-                self.advance( )
-                saw_something = True
-                result2 = self.evaluate_statement( context, place )
-                if result2 != None:
-                    result = result2
-
-            if saw_something == False:
-                if token == None:
-                    raise Exception("Missing catch or finally, in %s; instead saw EOF" % place)
-                raise Exception("Missing catch or finally, in %s; instead saw %s" % (place,unicode(token)))
-
-            return result
-
-        elif token.get_symbol( ) == "function":
-            self.advance( )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Missing function name, found EOF, in %s" % place)
-            function_name = token.get_symbol( )
-            if function_name == None:
-                raise Exception("Missing function name, found %s, in %s" % (unicode(token), place))
-            self.advance( )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Missing '(', found EOF, in %s" % place)
-            if token.get_punc( ) != "(":
-                raise Exception("Missing '(', found %s, in %s" % (unicode(token), place))
-            self.advance( )
-            argnames = [ ]
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of function definition, found EOF, in %s" % place)
-            if token.get_punc( ) != ")":
-                while True:
-                    token = self.peek( )
-                    if token == None:
-                        raise Exception("Unexpected end of function definition, found EOF, in %s" % place)
-                    arg = token.get_symbol( )
-                    if arg == None:
-                        raise Exception("Expecting an argument name, found %s, in %s" % (unicode(token),place))
-                    argnames.append( arg )
-                    self.advance( )
-                    token = self.peek( )
-                    if token == None:
-                        raise Exception("Unexpected end of function definition, found EOF, in %s" % place)
-                    if token.get_punc( ) == ")":
-                        break
-                    if token.get_punc( ) == ",":
-                        self.advance( )
-                    else:
-                        raise Exception("Expected ',', found %s, in %s" % (unicode(token), place))
-            self.advance( )
-
-            # Record start of body
-            begin_position = self.get_position( )
-            self.skip_statement( )
-            func_body = self.get_chunk( begin_position )
-            function_object = JSMethod( function_name, argnames, func_body )
-            context.define_value( function_name )
-            context.set_value( function_name, function_object )
-            return None
-
-        else:
-            # Process expression
-            if self.evaluate_expr( context, place ) == None:
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Expected a statement, saw EOF, in %s" % place)
-                else:
-                    raise Exception("Expected a statement, saw %s, in %s" % (unicode(token),place) )
-            token = self.peek( )
-            if token == None:
-                raise Exception("Unexpected end of expression, found EOL, in %s" % place)
-            if token.get_punc( ) != ";":
-                raise Exception("Expecting ';' after expression, found %s, in %s" % (unicode(token), place))
-            self.advance( )
-            return None
-
-
-    def skip_statement( self ):
-        # Skip statement to end; used in recording method definition
-        # This understands statement syntax but does not attempt to parse expressions.
-        token = self.peek( )
-        if token == None:
-            raise Exception("Unexpected end of statement")
-        if token.get_punc( ) == "{":
-            self.advance( )
-            while True:
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Unexpected end of statement block")
-                if token.get_punc( ) == "}":
-                    break
-                self.skip_statement( )
-            self.advance( )
-        elif token.get_symbol( ) == "while":
-            self.advance( )
-            self.skip_conditional( )
-            self.skip_statement( )
-        elif token.get_symbol( ) == "if":
-            self.advance( )
-            self.skip_conditional( )
-            self.skip_statement( )
-            token = self.peek( )
-            if token != None and token.get_symbol( ) == "else":
-                self.advance( )
-                self.skip_statement( )
-        elif token.get_symbol( ) == "for":
-            self.advance( )
-            self.skip_conditional( )
-            self.skip_statement( )
-        elif token.get_symbol( ) == "try":
-            self.advance( )
-            self.skip_statement( )
-            # Now, look for the catch clause
-            token = self.peek( )
-            if token != None and token.get_symbol() == "catch":
-                self.advance( )
-                self.skip_conditional( )
-                self.skip_statement( )
-                token = self.peek( )
-            if token != None and token.get_symbol() == "finally":
-                self.advance( )
-                self.skip_statement( )
-        else:
-            # Process up to terminating semicolon token
-            unknown_tokens = [ ]
-            while True:
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Unexpected end of statement; unknown tokens: '%s'; need semicolon" % str(unknown_tokens))
-                unknown_tokens += [ str(token) ]
-                self.advance( )
-                if token.get_punc( ) == ";":
-                    break
-
-    def skip_conditional( self ):
-        # Walk through nested parens
-        token = self.peek( )
-        if token == None or token.get_punc( ) != "(":
-            raise Exception("Missing '(' in while/conditional")
-        self.advance( )
-        count = 1
-        while True:
-            token = self.peek( )
-            self.advance( )
-            if token == None:
-                raise Exception("Unexpected end of while statement conditional")
-
-            if token.get_punc( ) == "(":
-                count += 1
-            elif token.get_punc( ) == ")":
-                count -= 1
-                if count == 0:
-                    break
-
-    # Evaluate expression.  This is approximately correct, good enough for all
-    # our current needs.  If we develop heavy javascript evaluation requirements this
-    # expression evaluation should be refined to be more rigorously correct.
-    # Returns a return object, or none for "not me"
-    def evaluate_expr( self, context, place, parse_only=False ):
-        # expr = expr [...]
-        # expr += expr [...]
-        # expr -= expr [...]
-        # expr *= expr [...]
-        # expr /= expr [...]
-        rval = self.evaluate_expr0( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "=":
-                # = operator
-                self.advance( )
-                nextvalue = self.evaluate_expr0( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '=' in %s" % place)
-                if parse_only==False:
-                    rval = self.assign(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "+=":
-                # += operator
-                self.advance( )
-                nextvalue = self.evaluate_expr0( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '+=' in %s" % place)
-                if parse_only==False:
-                    rval = self.assign_plus(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "-=":
-                # += operator
-                self.advance( )
-                nextvalue = self.evaluate_expr0( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '-=' in %s" % place)
-                if parse_only==False:
-                    rval = self.assign_minus(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "*=":
-                # += operator
-                self.advance( )
-                nextvalue = self.evaluate_expr0( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '*=' in %s" % place)
-                if parse_only==False:
-                    rval = self.assign_plus(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "/=":
-                # += operator
-                self.advance( )
-                nextvalue = self.evaluate_expr0( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '/=' in %s" % place)
-                if parse_only==False:
-                    rval = self.assign_minus(rval, nextvalue)
-            else:
-                return rval
-
-        return self.evaluate_expr0( context, place, parse_only )
-        
-    def assign( self, value1, value2 ):
-        value1.set_reference( value2.dereference( ) )
-        return value1
-
-    def assign_plus( self, value1, value2 ):
-        rval = self.plus( value1, value2 )
-        value1.set_reference( rval.dereference( ) )
-        return value1
-    
-    def assign_minus( self, value1, value2 ):
-        rval = self.minus( value1, value2 )
-        value1.set_reference( rval.dereference( ) )
-        return value1
-
-    def assign_times( self, value1, value2 ):
-        rval = self.times( value1, value2 )
-        value1.set_reference( rval.dereference( ) )
-        return value1
-    
-    def assign_divide( self, value1, value2 ):
-        rval = self.divide( value1, value2 )
-        value1.set_reference( rval.dereference( ) )
-        return value1
-        
-    def evaluate_expr0( self, context, place, parse_only=False ):
-        # expr0 -> expr1 ["||" expr1 [...]]
-        rval = self.evaluate_expr1( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "||":
-                # || operator
-                self.advance( )
-                if parse_only==False and rval.bool_value( ):
-                    parse_only = True
-                nextvalue = self.evaluate_expr1( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '||' in %s" % place)
-                if parse_only==False:
-                    rval = self.logical_or(rval, nextvalue)
-            else:
-                return rval
-
-    def logical_or( self, value1, value2 ):
-        return JSBoolean( value1.bool_value( ) or value2.bool_value( ) )
-
-    def evaluate_expr1( self, context, place, parse_only=False ):
-        # expr1 -> expr2 ["&&" expr2 [...]]
-        rval = self.evaluate_expr2( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "&&":
-                # && operator
-                self.advance( )
-                if parse_only==False and rval.bool_value( )==False:
-                    parse_only = True
-                nextvalue = self.evaluate_expr2( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '&&' in %s" % place)
-                if parse_only==False:
-                    rval = self.logical_and(rval, nextvalue)
-            else:
-                return rval
-
-    def logical_and( self, value1, value2 ):
-        return JSBoolean( value1.bool_value( ) and value2.bool_value( ) )
-
-    def evaluate_expr2( self, context, place, parse_only=False ):
-        # expr2 -> expr3 ["|" expr3 [...]]
-        rval = self.evaluate_expr3( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "|":
-                # | operator
-                self.advance( )
-                nextvalue = self.evaluate_expr3( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '|' in %s" % place)
-                if parse_only==False:
-                    rval = self.numerical_or(rval, nextvalue)
-            else:
-                return rval
-
-    def numerical_or( self, value1, value2 ):
-        return JSNumber( int(value1.num_value( ) ) | int(value2.num_value( ) ) )
-
-    def evaluate_expr3( self, context, place, parse_only=False ):
-        # expr3 -> expr4 ["^" expr4 [...]]
-        rval = self.evaluate_expr4( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "^":
-                # | operator
-                self.advance( )
-                nextvalue = self.evaluate_expr4( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '^' in %s" % place)
-                if parse_only==False:
-                    rval = self.numerical_xor(rval, nextvalue)
-            else:
-                return rval
-
-    def numerical_xor( self, value1, value2 ):
-        return JSNumber( int(value1.num_value( ) ) ^ int(value2.num_value( ) ) )
-
-    def evaluate_expr4( self, context, place, parse_only=False ):
-        # expr4 -> expr5 ["&" expr5 [...]]
-        rval = self.evaluate_expr5( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "&":
-                # & operator
-                self.advance( )
-                nextvalue = self.evaluate_expr5( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '&' in %s" % place)
-                if parse_only==False:
-                    rval = self.numerical_and(rval, nextvalue)
-            else:
-                return rval
-
-    def numerical_and( self, value1, value2 ):
-        return JSNumber( int(value1.num_value( ) ) & int(value2.num_value( ) ) )
-
-    def evaluate_expr5( self, context, place, parse_only=False ):
-        # expr5 -> expr6 ["==" expr6 [...]]
-        # expr5 -> expr6 ["!=" expr6 [...]]
-        rval = self.evaluate_expr6( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "==":
-                # == operator
-                self.advance( )
-                nextvalue = self.evaluate_expr6( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '==' in %s" % place)
-                if parse_only==False:
-                    rval = self.equals(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "!=":
-                # != operator
-                self.advance( )
-                nextvalue = self.evaluate_expr6( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '!=' in %s" % place)
-                if parse_only==False:
-                    rval = self.not_equals(rval, nextvalue)
-            else:
-                return rval
-
-    def equals( self, value1, value2 ):
-        # If these are both strings, compare as strings
-        if value1.is_type(JSString) and value2.is_type(JSString):
-            return JSBoolean( value1.str_value( ) == value2.str_value( ) )
-        elif value1.is_type(JSBoolean) and value2.is_type(JSBoolean):
-            return JSBoolean( value1.bool_value( ) == value2.bool_value( ) )
-        return JSBoolean( value1.num_value( ) == value2.num_value( ) )
-
-    def not_equals( self, value1, value2 ):
-        # If these are both strings, compare as strings
-        if value1.is_type(JSString) and value2.is_type(JSString):
-            return JSBoolean( value1.str_value( ) != value2.str_value( ) )
-        elif value1.is_type(JSBoolean) and value2.is_type(JSBoolean):
-            return JSBoolean( value1.bool_value( ) != value2.bool_value( ) )
-        return JSBoolean( value1.num_value( ) != value2.num_value( ) )
-
-    def evaluate_expr6( self, context, place, parse_only=False ):
-        # expr6 -> expr7 [">" expr7 [...]]
-        # expr6 -> expr7 ["<" expr7 [...]]
-        # expr6 -> expr7 [">=" expr7 [...]]
-        # expr6 -> expr7 ["<=" expr7 [...]]
-        rval = self.evaluate_expr7( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "<=":
-                # <= operator
-                self.advance( )
-                nextvalue = self.evaluate_expr7( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '<=' in %s" % place)
-                if parse_only==False:
-                    rval = self.less_than_or_equals(rval, nextvalue)
-            elif token != None and token.get_punc( ) == ">=":
-                # >= operator
-                self.advance( )
-                nextvalue = self.evaluate_expr7( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '>=' in %s" % place)
-                if parse_only==False:
-                    rval = self.greater_than_or_equals(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "<":
-                # < operator
-                self.advance( )
-                nextvalue = self.evaluate_expr7( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '<' in %s" % place)
-                if parse_only==False:
-                    rval = self.less_than(rval, nextvalue)
-            elif token != None and token.get_punc( ) == ">":
-                # > operator
-                self.advance( )
-                nextvalue = self.evaluate_expr7( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '>' in %s" % place)
-                if parse_only==False:
-                    rval = self.greater_than(rval, nextvalue)
-
-            else:
-                return rval
-
-    def less_than_or_equals( self, value1, value2 ):
-        return JSBoolean( value1.num_value( ) <= value2.num_value( ) )
-
-    def greater_than_or_equals( self, value1, value2 ):
-        return JSBoolean( value1.num_value( ) >= value2.num_value( ) )
-
-    def less_than( self, value1, value2 ):
-        return JSBoolean( value1.num_value( ) < value2.num_value( ) )
-
-    def greater_than( self, value1, value2 ):
-        return JSBoolean( value1.num_value( ) > value2.num_value( ) )
-
-    def evaluate_expr7( self, context, place, parse_only=False ):
-        # >>, << TBD
-        return self.evaluate_expr8( context, place, parse_only )
-
-    def evaluate_expr7( self, context, place, parse_only=False ):
-        # expr7 -> expr8 ["+" expr8 [...]]
-        # expr7 -> expr8 ["-" expr8 [...]]
-        rval = self.evaluate_expr8( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "+":
-                # + operator
-                self.advance( )
-                nextvalue = self.evaluate_expr8( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '+' in %s" % place)
-                if parse_only==False:
-                    rval = self.plus(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "-":
-                # - operator
-                self.advance( )
-                nextvalue = self.evaluate_expr8( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '-' in %s" % place)
-                if parse_only==False:
-                    rval = self.minus(rval, nextvalue)
-            else:
-                return rval
-
-    def plus( self, value1, value2 ):
-        if value1.is_type(JSString) or value2.is_type(JSString):
-            return JSString( value1.str_value( ) + value2.str_value( ) )
-        return JSNumber( value1.num_value( ) + value2.num_value( ) )
-
-    def minus( self, value1, value2 ):
-        return JSNumber( value1.num_value( ) - value2.num_value( ) )
-
-    def evaluate_expr8( self, context, place, parse_only=False ):
-        # expr8 -> expr9 ["*" expr9 [...]]
-        # expr8 -> expr9 ["/" expr9 [...]]
-        # expr8 -> expr9 ["%" expr9 [...]]
-        rval = self.evaluate_expr9( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( slash_is_legal=True )
-            if token != None and token.get_punc( ) == "*":
-                # * operator
-                self.advance( )
-                nextvalue = self.evaluate_expr9( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '*' in %s" % place)
-                if parse_only==False:
-                    rval = self.times(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "/":
-                # / operator
-                self.advance( )
-                nextvalue = self.evaluate_expr9( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '/' in %s" % place)
-                if parse_only==False:
-                    rval = self.divide(rval, nextvalue)
-            elif token != None and token.get_punc( ) == "%":
-                # % operator
-                self.advance( )
-                nextvalue = self.evaluate_expr9( context, place, parse_only )
-                if nextvalue == None:
-                    raise Exception("Missing expression after '%' in %s" % place)
-                if parse_only==False:
-                    rval = self.modulo(rval, nextvalue)
-            else:
-                return rval
-
-    def times( self, value1, value2 ):
-        return JSNumber( value1.num_value( ) * value2.num_value( ) )
-
-    def divide( self, value1, value2 ):
-        return JSNumber( value1.num_value( ) / value2.num_value( ) )
-
-    def modulo( self, value1, value2 ):
-        return JSNumber( value1.num_value( ) % value2.num_value( ) )
-
-    def evaluate_expr9( self, context, place, parse_only=False ):
-        # expr9 -> "!" expr9
-        # expr9 -> "-" expr9
-        # expr9 -> "++" expr9
-        # expr9 -> "--" expr9
-        # expr9 -> expr10 ["++" ...]
-        # expr9 -> expr10 ["--" ...]
-        token = self.peek( )
-        if token != None and token.get_punc( ) == "!":
-            self.advance( )
-            nextvalue = self.evaluate_expr9( context, place, parse_only )
-            if nextvalue == None:
-                raise Exception("Missing expression after '!' in place %s" % place    )
-            if parse_only:
-                return JSNull()
-            return self.logical_not( nextvalue )
-        elif token != None and token.get_punc( ) == "-":
-            self.advance( )
-            nextvalue = self.evaluate_expr9( context, place, parse_only )
-            if nextvalue == None:
-                raise Exception("Missing expression after '-' in %s" % place)
-            if parse_only:
-                return JSNull()
-            return self.negate ( nextvalue )
-        elif token != None and token.get_punc( ) == "--":
-            self.advance( )
-            nextvalue = self.evaluate_expr9( context, place, parse_only )
-            if nextvalue == None:
-                raise Exception("Missing expression after '--' in %s" % place)
-            if parse_only:
-                return JSNull()
-            return self.pre_minusminus ( nextvalue )
-        elif token != None and token.get_punc( ) == "+":
-            self.advance( )
-            nextvalue = self.evaluate_expr9( context, place, parse_only )
-            if nextvalue == None:
-                raise Exception("Missing expression after '+' in %s" % place)
-            if parse_only:
-                return JSNull()
-            return self.positive ( nextvalue )
-        elif token != None and token.get_punc( ) == "++":
-            self.advance( )
-            nextvalue = self.evaluate_expr9( context, place, parse_only )
-            if nextvalue == None:
-                raise Exception("Missing expression after '++' in %s" % place)
-            if parse_only:
-                return JSNull()
-            return self.pre_plusplus ( nextvalue )
-        elif token != None and token.get_symbol( ) == "typeof":
-            # typeof operator
-            self.advance( )
-            nextvalue = self.evaluate_expr9( context, place, parse_only )
-            if nextvalue == None:
-                raise Exception("Missing expression after 'typeof' in %s" % place)
-            if parse_only:
-                return JSNull()
-            return self.typeof( nextvalue ) 
-        elif token != None and token.get_symbol( ) == "new":
-            self.advance( )
-            token = self.peek( )
-            if token == None or token.get_symbol( ) == None:
-                raise Exception("new expression missing class name in %s" % place)
-            object_name = token.get_symbol( )
-            self.advance( )
-            token = self.peek( )
-            if token == None or token.get_punc( ) != "(":
-                raise Exception("constructor argument clause missing")
-            self.advance( )
-            arguments = [ ]
-            token = self.peek( )
-            if token == None:
-                raise Exception("Missing expression in constructor argument list, saw EOF in %s" % place)
-            if token.get_punc( ) == ")":
-                self.advance( )
-            else:
-                while True:
-                    nextvalue = self.evaluate_expr( context, place, parse_only )
-                    if nextvalue == None:
-                        raise Exception("Missing expression in constructor actual arguments in %s" % place)
-                    arguments.append( nextvalue )
-                    token = self.peek( )
-                    if token == None:
-                        raise Exception("Missing ',' in constructor actual argument list, saw EOF")
-                    if token.get_punc( ) == ")":
-                        self.advance( )
-                        break
-                    if token.get_punc( ) != ",":
-                        raise Exception("Missing ',' in constructor actual argument list, saw %s instead, in %s" % (unicode(token),place))
-                    self.advance( )
-            # Invoke method
-            if parse_only:
-                return JSObject()
-            value = context.find_symbol( object_name )
-            if value == None:
-                raise Exception("Could not locate symbol %s in %s for construction" % (token.get_symbol(),place))
-
-            return value.construct( arguments, context )
-
-        rval = self.evaluate_expr10( context, place, parse_only )
-        if rval == None:
-            return rval
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == "++":
-                # ++ operator
-                self.advance( )
-                if parse_only==False:
-                    rval = self.post_plusplus( rval )
-            elif token != None and token.get_punc( ) == "--":
-                # -- operator
-                self.advance( )
-                if parse_only==False:
-                    rval = self.post_minusminus( rval )
-            else:
-                return rval
-        
-    def logical_not( self, value1 ):
-        return JSBoolean( not value1.bool_value( ) )
-
-    def negate( self, value1 ):
-        return JSNumber( -value1.num_value( ) )
-
-    def positive( self, value1 ):
-        return JSNumber( +value1.num_value( ) )
-
-    def typeof( self, value1 ):
-        return JSString( value1.type_value( ) )
-
-    def post_minusminus( self, value1 ):
-        rval = value1.dereference( )
-        value1.set_reference( self.minus( value1, JSNumber( 1 ) ).dereference( ) )
-        return rval
-      
-    def post_plusplus( self, value1 ):
-        rval = value1.dereference( )
-        value1.set_reference( self.plus( value1, JSNumber( 1 ) ).dereference( ) )
-        return rval
-
-    def pre_minusminus( self, value1 ):
-        value1.set_reference( self.minus( value1, JSNumber( 1 ) ).dereference( ) )
-        return value1
-      
-    def pre_plusplus( self, value1 ):
-        value1.set_reference( self.plus( value1, JSNumber( 1 ) ).dereference( ) )
-        return value1
-
-    def evaluate_expr10( self, context, place, parse_only=False ):
-        # expr10 -> expr11
-        # expr10 -> expr11 "(" [expr ["," ...]] ")"
-        # expr10 -> expr11 "[" [expr "]"
-        # expr10 -> expr11 "." member_name
-        
-        # Look for a terminal token
-        reference_object = self.evaluate_expr11( context, place, parse_only )
-        if reference_object == None:
-            return None
-
-        # Terminal token object found!
-        # Parse trailing operations, if any
-        while True:
-            token = self.peek( )
-            if token != None and token.get_punc( ) == ".":
-                self.advance( )
-                token = self.peek( )
-                if token == None or token.get_symbol( ) == None:
-                    raise Exception("Expecting member name in %s" % place)
-                self.advance( )
-                if parse_only==False:
-                    reference_object = JSObjMemberReference( reference_object, token.get_symbol( ) )
-            elif token != None and token.get_punc( ) == "[":
-                self.advance( )
-                value = self.evaluate_expr( context, place, parse_only )
-                if value == None:
-                    raise Exception("Expecting index value in %s" % place)
-                token = self.peek( )
-                if token == None or token.get_punc( ) != "]":
-                    raise Exception("Expecting ']' in %s" % place)
-                self.advance( )
-                if parse_only==False:
-                    reference_object = JSObjMemberReference( reference_object, str(int(value.num_value( ))) )
-            elif token != None and token.get_punc( ) == "(":
-                # Method invocation
-                self.advance( )
-                arguments = [ ]
-                token = self.peek( )
-                if token == None:
-                    raise Exception("Missing expression in argument list, saw EOF in %s" % place)
-                if token.get_punc( ) == ")":
-                    self.advance( )
-                else:
-                    while True:
-                        nextvalue = self.evaluate_expr( context, place, parse_only )
-                        if nextvalue == None:
-                            raise Exception("Missing expression in actual arguments in %s" % place)
-                        arguments.append( nextvalue )
-                        token = self.peek( )
-                        if token == None:
-                            raise Exception("Missing ',' in actual argument list, saw EOF")
-                        if token.get_punc( ) == ")":
-                            self.advance( )
-                            break
-                        if token.get_punc( ) != ",":
-                            raise Exception("Missing ',' in actual argument list, saw %s instead, in %s" % (unicode(token),place))
-                        self.advance( )
-                # Invoke method
-                if parse_only:
-                    reference_object = JSNull()
-                else:
-                    reference_object = reference_object.call( arguments, context )
-
-            else:
-                break
-
-        return reference_object
-
-
-    def evaluate_expr11( self, context, place, parse_only=False ):
-        # Parse a terminal value, and return the corresponding object.  A "None" return
-        # means "not me".
-
-        token = self.peek( )
-
-        if token != None and token.get_symbol( ) == "true":
-            self.advance( )
-            return JSBoolean( True )
-        if token != None and token.get_symbol( ) == "false":
-            self.advance( )
-            return JSBoolean( False )
-        if token != None and token.get_symbol( ) == "null":
-            self.advance( )
-            return JSNull( )
-        if token != None and token.get_string( ) != None:
-            self.advance( )
-            return JSString( token.get_string( ) )
-        if token != None and token.get_int( ) != None:
-            self.advance( )
-            return JSNumber( token.get_int( ) )
-        if token != None and token.get_float( ) != None:
-            self.advance( )
-            return JSNumber( token.get_float( ) )
-        if token != None and token.get_regexp( ) != None:
-            self.advance( )
-            return JSRegexp( token.get_regexp( ), token.get_regexp_global( ), token.get_regexp_insensitive( ) )
-
-        if token != None and token.get_symbol( ) != None:
-            self.advance( )
-            if parse_only == False:
-                value = context.find_symbol( token.get_symbol( ) )
-                if value == None:
-                    raise Exception("Could not locate symbol %s in %s" % (token.get_symbol(),place))
-                return value
-            else:
-                return JSObject( )
-
-        if token != None and token.get_punc( ) == "(":
-            self.advance( )
-            rval = self.evaluate_expr( context, place, parse_only )
-            token = self.peek( )
-            if token == None or token.get_punc( ) != ")":
-                raise Exception("Missing right parenthesis in %s" % place)
-            self.advance( )
-            return rval
-
-        return None
-
-    # Build a token, starting at the current pointer, and return it.
-    # Return None if end.  Advance the current pointer appropriately.
-    def build_next( self, slash_is_legal ):
-        # self.body is the text we parse.
-        # self.start_index is the current position.
-
-        # First, eat white space and comments
-        while self.start_index < len(self.body):
-            this_char = self.body[self.start_index]
-            if this_char == "/":
-                if self.start_index + 1 < len(self.body):
-                    next_char = self.body[self.start_index + 1]
-
-                    if next_char == "*":
-                    # Scan until we find the end
-                        self.start_index += 2
-                        pos = self.body.find("*/",self.start_index)
-                        if pos == -1:
-                            self.start_index = len(self.body)
-                            break
-                        else:
-                            self.start_index = pos + 2
-                            continue
-
-                    elif next_char == "/":
-                        # Scan until we find the newline
-                        self.start_index += 2
-                        pos = self.body.find("\n",self.start_index)
-                        if pos == -1:
-                            self.start_index = len(self.body)
-                            break
-                        else:
-                            self.start_index = pos
-                            continue
-
-            if this_char > " ":
-                break
-            self.start_index += 1
-
-        # Check for end
-        if self.start_index == len(self.body):
-            return None
-
-        # See what kind of token it is.  Choices are: punctuation, string,
-        # symbol, or number
-        this_char = self.body[self.start_index]
-        self.start_index += 1
-
-        # For ' or ", treat as a string.  We have to concatenate across lines, too
-        if this_char == "'" or this_char == '"':
-            # Accumulate a string
-            the_string = ""
-            while self.start_index < len(self.body):
-                new_char = self.body[self.start_index]
-                if new_char == "\\":
-                    self.start_index += 1
-                    if self.start_index < len(self.body):
-                        the_char = self.body[ self.start_index ]
-                        # Deal with special characters
-                        if the_char == "n":
-                            the_char = "\n"
-                        elif the_char == "r":
-                            the_char = "\r"
-                        elif the_char == "t":
-                            the_char = "\t"
-                        the_string += the_char
-                        self.start_index += 1
-                elif new_char == this_char:
-                    # Maybe the end of the string, but we should zip past the whitespace
-                    # to see if there's more string.
-                    self.start_index += 1
-                    while self.start_index < len(self.body):
-                        skip_char = self.body[self.start_index]
-                        if skip_char > " ":
-                            break
-                        self.start_index += 1
-                    if self.start_index == len(self.body):
-                        break
-                    this_char = self.body[self.start_index]
-                    if this_char != "'" and this_char != '"':
-                        break
-                    self.start_index += 1
-                else:
-                    the_string += self.body[ self.start_index ]
-                    self.start_index += 1
-            return JSToken( string_value=the_string )
-
-        # For digits, treat as numbers.
-        elif this_char >= "0" and this_char <= "9":
-            # concatenate numbers and decimal points; no ieee notation for now
-            the_number = this_char
-            is_float = False
-            while self.start_index < len(self.body):
-                new_char = self.body[self.start_index]
-                if (new_char < "0" or new_char > "9") and new_char != ".":
-                    break
-                self.start_index += 1
-                if new_char == ".":
-                    is_float = True
-                the_number += new_char
-            if is_float:
-                return JSToken( float_value=float(the_number) )
-            else:
-                return JSToken( int_value=int(the_number) )
-
-        # For characters, eat as IDs
-        elif (this_char >= "a" and this_char <= "z") or (this_char >= "A" and this_char <= "Z") or this_char == "_":
-            # concatenate characters and digits
-            the_symbol = this_char
-            while self.start_index < len(self.body):
-                new_char = self.body[self.start_index]
-                if (new_char < "a" or new_char > "z") and (new_char < "A" or new_char > "Z") and (new_char < "0" or new_char > "9") and new_char != "_":
-                    break
-                self.start_index += 1
-                the_symbol += new_char
-            return JSToken( symbol_value=the_symbol )
-
-        # Regexps.
-        # This is tricky, because "/" is a legal operator.  We therefore need to process
-        # the subsequent string to see if it looks promising.  If that's not good enough,
-        # then we'll need to know if we are in a context where a simple "/" is a legal possibility.
-        elif this_char == "/" and slash_is_legal == False:
-            # Look for the trailing /, and make sure we destuff as we look
-            the_regexp = ""
-            while self.start_index < len(self.body):
-                new_char = self.body[self.start_index]
-                self.start_index += 1
-                if new_char == "\\" and self.start_index < len(self.body):
-                    the_regexp += new_char + self.body[ self.start_index ]
-                    self.start_index += 1
-                elif new_char == "/":
-                    break
-                else:
-                    the_regexp += new_char
-
-            is_global = False
-            is_insensitive = False
-            if self.start_index < len(self.body):
-                new_char = self.body[self.start_index]
-                if new_char == "g":
-                    is_global = True
-                    self.start_index += 1
-                elif new_char == "i":
-                    is_insensitive = True
-                    self.start_index += 1
-            if self.start_index < len(self.body):
-                new_char = self.body[self.start_index]
-                if new_char == "g":
-                    is_global = True
-                    self.start_index += 1
-                elif new_char == "i":
-                    is_insensitive = True
-                    self.start_index += 1
-            return JSToken( regexp_value=the_regexp, regexp_global=is_global, regexp_insensitive=is_insensitive )
-
-        # Punctuation
-        # See if this is a punctuation mark that can have a second character
-        the_punc = this_char
-        if self.start_index < len(self.body):
-            new_char = self.body[self.start_index]
-            if this_char == "!" and new_char == "=" or this_char == "=" and new_char == "=" \
-                or this_char == ">" and new_char == "=" or this_char == "<" and new_char == "=" \
-                or this_char == "&" and new_char == "&" or this_char == "|" and new_char == "|" \
-                or this_char == "+" and new_char == "=" or this_char == "-" and new_char == "=" \
-                or this_char == "+" and new_char == "+" or this_char == "-" and new_char == "-" \
-                or this_char == "*" and new_char == "=" or this_char == "/" and new_char == "=" \
-                or this_char == "<" and new_char == "<" or this_char == ">" and new_char == ">":
-                self.start_index += 1
-                the_punc += new_char
-        return JSToken( punc_value=the_punc )
diff --git a/framework/core/src/test/resources/org/apache/manifoldcf/core/tests/VirtualBrowser.py b/framework/core/src/test/resources/org/apache/manifoldcf/core/tests/VirtualBrowser.py
deleted file mode 100755
index f91558e..0000000
--- a/framework/core/src/test/resources/org/apache/manifoldcf/core/tests/VirtualBrowser.py
+++ /dev/null
@@ -1,2045 +0,0 @@
-#!/usr/bin/python
-# $Id$
-
-# 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.
-
-import Javascript
-import urllib
-import urllib2
-import httplib
-import cookielib
-import HTMLParser
-import base64
-import re
-import os
-import sys
-
-# Class that describes answers to pop-up dialog boxes that may occur as a result of clicking a link
-# or button.  If the answer is not found, this is considered a test error, and an exception is thrown!
-class VirtualDialogAnswers:
-
-    def __init__( self ):
-        # a dictionary of dialogs, by title, containing the desired answer to click for each
-        self.dialogs = { }
-
-    def add_dialog_answer( self, dialog_name, answer_button ):
-        self.dialogs[ dialog_name ] = answer_button
-
-    def get_dialog_answer( self, dialog_name ):
-        try:
-            return self.dialogs[ dialog_name ]
-        except:
-            raise Exception("No answer found for dialog '%s'" % dialog_name)
-
-
-# Base class of all form elements
-class VirtualFormElement:
-
-    def __init__( self, form_instance ):
-        self.form_instance = form_instance
-
-    def get_form( self ):
-        return self.form_instance
-
-# Base class of form data elements.  Each of these has an element name, and
-# can contribute data to form submission.
-class VirtualFormDataElement( VirtualFormElement ):
-
-    def __init__(self, form_instance, element_name ):
-        VirtualFormElement.__init__( self, form_instance )
-        self.element_name = element_name
-
-    # Get the key which uniquely identifies this element in a form.
-    def get_key( self ):
-        return self.element_name
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        pass
-
-    # Optionally add file tuples to a sequence to be posted
-    def add_files( self, accumulator ):
-        pass
-
-    # Get the element name
-    def get_name( self ):
-        return self.element_name
-
-    # Set a property (via javascript)
-    # Property value is a JSObject
-    def set_property( self, property_name, property_value ):
-        raise Exception("Form element '%s' has no such property '%s'" % (self.element_name, property_name))
-
-    # Get a property (via javascript).
-    # This returns a JSObject
-    def get_property( self, property_name ):
-        raise Exception("Form element '%s' has no such property '%s'" % (self.element_name, property_name))
-
-    # Get the type of a property (via javascript)
-    def get_property_type( self, property_name ):
-        return "undefined"
-
-# Button base class
-class VirtualButton( VirtualFormElement ):
-
-    def __init__( self, form_instance, alt, buttontext ):
-        VirtualFormElement.__init__( self, form_instance )
-        self.buttontext = buttontext
-        self.alt = alt
-
-    # Public API
-
-    def click( self ):
-        # Only derived classes actually do anything
-        pass
-
-    # Private API
-
-    def get_key( self ):
-        return self.alt
-
-
-# Basic button
-class VirtualBasicbutton( VirtualButton ):
-
-    def __init__( self, form_instance, alt, buttontext, onclick ):
-        VirtualButton.__init__( self, form_instance, alt, buttontext )
-        self.onclick = onclick
-
-
-    def click( self ):
-        # Execute the on-click, if any
-        self.get_form( ).execute_javascript_expression( self.onclick )
-
-
-# Since submit buttons are both buttons and form data elements, there's
-# a wrapper class needed so that I can put submit buttons in the button
-# pool.  This avoids the tester needing to know about what kind of button
-# it is; it can be clicked just like any other button.
-class VirtualSubmitbuttonWrapper( VirtualButton ):
-
-    def __init__( self, button_reference ):
-        assert isinstance( button_reference, VirtualSubmitbutton )
-        VirtualButton.__init__( self, button_reference.get_form( ),
-                                button_reference.get_alt( ), "Submit" )
-        self.button_reference = button_reference
-
-    def click( self ):
-        # Pass the click off to the actual button
-        self.button_reference.click( )
-
-
-# Submit button.  This is the data element version of the submit button.
-# It's also wrapped by
-class VirtualSubmitbutton( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name, value, alt, onclick ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        self.alt = alt
-        self.value = value
-        self.clicked = False
-        self.onclick = onclick
-
-    def get_alt( self ):
-        return self.alt
-
-    def click( self ):
-        self.clicked = True
-        # Fire off javascript, or if not there, just submit form
-        result = self.get_form( ).execute_javascript_expression( self.onclick )
-        if result != None:
-            if result.bool_value( ):
-                self.get_form( ).submit( )
-        else:
-            self.get_form( ).submit( )
-        self.clicked = False
-        pass
-
-    # Get the key which uniquely identifies this element in a form.
-    def get_key( self ):
-        return VirtualFormDataElement.get_key( self ) + "=" + self.value
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        if self.clicked:
-            accumulator.append( ( self.get_name(), self.value ) )
-
-# Hidden
-class VirtualHiddenField( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name, value ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        assert isinstance( value, unicode ) or isinstance( value, str )
-        self.value = { value:value }
-
-    def get_specified_value( self ):
-        return_value = ""
-        for value in self.value.keys():
-            if return_value == "":
-                return_value = value
-            else:
-                return_value = ";" + value
-        return return_value
-
-    def add_value( self, new_value ):
-        self.value[ new_value ] = new_value
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        for value in self.value.keys():
-            accumulator.append( ( self.get_name(), value ) )
-
-    # Set a property (via javascript)
-    def set_property( self, property_name, property_value ):
-        if property_name == "value":
-            assert isinstance( property_value, Javascript.JSObject )
-            new_value = property_value.str_value( )
-            self.value = { new_value:new_value }
-        else:
-            VirtualFormDataElement.set_property( self, property_name, property_value )
-
-    # Get a property (via javascript)
-    def get_property( self, property_name ):
-        if property_name == "type":
-            return Javascript.JSString("hidden")
-        if property_name == "value":
-            return Javascript.JSString( self.get_specified_value() )
-        else:
-            return VirtualFormDataElement.get_property( self, property_name )
-
-    def get_property_type( self, property_name ):
-        if property_name == "type":
-            return "string"
-        if property_name == "value":
-            return "string"
-        else:
-            return VirtualFormDataElement.get_property_type( self, property_name )
-
-# File
-class VirtualFileBrowser( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        self.filename = ""
-        self.content_type = None
-
-    # Public part of interface
-
-    # Set the upload file
-    def setfile( self, filename, content_type ):
-        assert isinstance( filename, str ) or isinstance( filename, unicode )
-        assert isinstance( content_type, str ) or isinstance( content_type, unicode )
-        self.filename = filename
-        self.content_type = content_type
-
-    # Private part of interface
-
-    # Optionally add a set of file tuples to a sequence to be posted
-    def add_files( self, accumulator ):
-        # Attempt to do the file upload, unless blank
-        if self.filename != None and len(self.filename) > 0:
-            accumulator.append( ( self.get_name(), self.filename, read_file(self.filename), self.content_type ) )
-
-    # Get a property (via javascript)
-    def get_property( self, property_name ):
-        if property_name == "value":
-            return Javascript.JSString( self.filename )
-        else:
-            return VirtualFormDataElement.get_property( self, property_name )
-
-    # Get a property type (via javascript)
-    def get_property_type( self, property_name ):
-        if property_name == "value":
-            return "string"
-        else:
-            return VirtualFormDataElement.get_property_type( self, property_name )
-
-# Read a specified file entirely into a "string"
-def read_file( filename ):
-    f = open( filename, "rb" )
-    try:
-        return f.read()
-    finally:
-        f.close()
-
-
-# Checkbox
-class VirtualCheckbox( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name, value, selected ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        assert isinstance( value, unicode ) or isinstance( value, str )
-        self.value = value
-        self.selected = selected
-        self.bodytext = None
-
-    # Public part of interface
-
-    # Select this checkbox
-    def select( self ):
-        if self.selected == False:
-            self.selected = True
-
-    # Deselect this checkbox
-    def deselect( self ):
-        if self.selected:
-            self.selected = False
-
-    # Private part of interface
-
-    # Get the key which uniquely identifies this element in a form.
-    def get_key( self ):
-        return VirtualFormDataElement.get_key( self ) + "=" + self.value
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        if self.selected:
-            accumulator.append( ( self.get_name(), self.value ) )
-
-    def set_bodytext( self, bodytext ):
-        assert isinstance( bodytext, unicode ) or isinstance( bodytext, str )
-        self.bodytext = bodytext
-
-    def get_property( self, property_name ):
-        if property_name == "checked":
-            return Javascript.JSBoolean(self.selected)
-        return VirtualFormDataElement.get_property( self, property_name )
-
-    def get_property_type( self, property_name ):
-        if property_name == "checked":
-            return "boolean"
-        return VirtualFormDataElement.get_property_type( self, property_name )
-
-# Radio
-class VirtualRadiobutton( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name, value, selected ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        assert isinstance( value, str ) or isinstance( value, unicode )
-        self.value = value
-        self.selected = selected
-        self.bodytext = None
-
-    # Public part of interface
-
-    # Select this radio button
-    def select( self ):
-        if self.selected == False:
-            self.get_form( ).clear_radio_buttons( self.get_name( ) )
-            self.selected = True
-
-    # Private part of interface
-
-    def set_bodytext( self, bodytext ):
-        self.bodytext = bodytext
-
-    # Deselect this radio button.  This happens as a side-effect
-    # of selecting another one that has the same name.
-    def deselect( self ):
-        if self.selected == True:
-            self.selected = False
-
-    # Get the key which uniquely identifies this element in a form.
-    def get_key( self ):
-        return VirtualFormDataElement.get_key( self ) + "=" + self.value
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        if self.selected:
-            accumulator.append( ( self.get_name(), self.value ) )
-
-# Select box element
-class SelectboxElement:
-    def __init__( self, value, body_text, is_selected ):
-        self.value = value
-        self.body_text = body_text
-        self.is_selected = is_selected
-
-    def get_value( self ):
-        return self.value
-
-    def get_body_text( self ):
-        return self.body_text
-
-    def check_selected( self ):
-        return self.is_selected
-
-    def set_selected( self, is_selected ):
-        self.is_selected = is_selected
-
-# Javascript object representing an option that's tied back to a VirtualSelectBox element
-class JSOptionValue (Javascript.JSObject ):
-
-    def __init__( self, parent ):
-        Javascript.JSObject.__init__( self )
-        self.parent = parent
-
-    def get_value( self, member_name ):
-        if member_name == "text":
-            return Javascript.JSString(self.parent.get_body_text())
-        elif member_name == "value":
-            return Javascript.JSString(self.parent.get_value())
-        elif member_name == "selected":
-            printval = "no"
-            if self.parent.is_selected:
-                printval = "yes"
-            #print "Checking whether option %s is selected: %s" % (self.parent.value,printval)
-            return Javascript.JSBoolean(self.parent.check_selected())
-        return Javascript.JSObject.get_value( self, member_name )
-
-    def set_value( self, member_name, value ):
-        if member_name == "text":
-            self.parent.set_body_text(value.str_value())
-        elif member_name == "value":
-            self.parent.set_value(value.str_value())
-        elif member_name == "selected":
-            self.parent.set_selected(value.bool_value())
-        else:
-            Javascript.JSObject.set_value( self, member_name, value )
-
-# Javascript object representing a list of options - tied back to a VirtualSelectBox
-class JSOptionList( Javascript.JSObject ):
-
-    def __init__( self, parent_select_box ):
-        Javascript.JSObject.__init__( self )
-        self.parent_select_box = parent_select_box
-
-    def get_value( self, member_name ):
-        # This object should behave like an array, so interpret the member name to be
-        # an index value
-        index = int(member_name)
-        assert index >= 0
-        return self.parent_select_box.get_option_object( index )
-
-    def set_value( self, member_name, value ):
-        # This object should behave like an array, so interpret the member name to be
-        # an index value
-        index = int(member_name)
-        assert index >= 0
-        self.parent_select_box.set_option_object( index, value )
-
-# Single/multi select
-class VirtualSelectbox( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name, multi ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        self.multi = multi
-        self.option_value_list = [ ]
-
-    # Public api
-
-    # Select a value (without CTRL button).
-    # This works like a browser in that selecting in this way turns
-    # off all other current selections.
-    def select_value( self, selected_value ):
-        seen_value = False
-        for option in self.option_value_list:
-            if option.get_value() == selected_value:
-                if seen_value:
-                    raise Exception("The selectbox value '%s' appears more than once in '%s'" % (selected_value,self.get_name()))
-                seen_value = True
-                option.set_selected( True )
-            else:
-                option.set_selected( False )
-        if seen_value == False:
-            raise Exception("The selectbox value '%s' doesn't exist in '%s'" % (selected_value,self.get_name()))
-
-    # Select a value using a regular expression (without CTRL button)
-    def select_value_regexp( self, selected_value_regexp ):
-        regexp = re.compile( selected_value_regexp, 0 )
-        seen_value = False
-        for option in self.option_value_list:
-            option_value = option.get_value()
-            mo = regexp.search( option_value )
-            if mo != None:
-                if seen_value:
-                    raise Exception("Selectbox '%s' has more than one value matching '%s'" % (self.get_name(),selected_value_regexp))
-                seen_value = True
-                option.set_selected( True )
-            else:
-                option.set_selected( False )
-        if seen_value == False:
-            raise Exception("Selectbox '%s' does not have a value matching '%s'" % (self.get_name(),selected_value_regexp))
-
-    # CTRL-select a value.
-    # For multiselect boxes, this adds a new selection to those already
-    # chosen.  For non-multi boxes, it works just like select_value.
-    def multi_select_value( self, selected_value ):
-        if self.multi == False:
-            self.select_value( selected_value )
-        else:
-            seen_value = False
-            for option in self.option_value_list:
-                if option.get_value() == selected_value:
-                    if seen_value:
-                        raise Exception("Selectbox '%s' has more than one value matching '%s'" % (self.get_name(),selected_value))
-                    seen_value = True
-                    # Toggle
-                    option.set_selected( option.check_selected() == False )
-            if seen_value == False:
-                raise Exception("Selectbox '%s' does not have a value matching '%s'" % (self.get_name(),selected_value))
-
-    # Private api
-
-    # Add a legal selection to the selection list
-    def add_selection( self, value, bodytext, isselected ):
-        self.option_value_list.append(SelectboxElement( value, bodytext, isselected ))
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        for option in self.option_value_list:
-            if option.check_selected( ):
-                accumulator.append( ( self.get_name(), option.get_value() ) )
-
-    # Get a property (via javascript)
-    def get_property( self, property_name ):
-        if property_name == "type":
-            if self.multi:
-                return Javascript.JSString("select-multiple")
-            else:
-                return Javascript.JSString("select")
-        elif property_name == "value":
-            value = ""
-            for option in self.option_value_list:
-                if option.check_selected( ):
-                    if len(value) > 0:
-                        value += ";"
-                    value += option.get_value()
-            return Javascript.JSString( value )
-        elif property_name == "options":
-            # Return a JSArray describing the options objects underlying this selectbox
-            return JSOptionList( self )
-        elif property_name == "length":
-            # Return as JSNumber describing the length of the array
-            return Javascript.JSNumber(len(self.option_value_list))
-        elif property_name == "selectedIndex":
-            # Return the first selected index as a JSNumber
-            for index in range(len(self.option_value_list)):
-                if self.option_value_list[index].check_selected( ):
-                    return Javascript.JSNumber(index)
-            return Javascript.JSNumber(-1)
-        else:
-            return VirtualFormDataElement.get_property( self, property_name )
-
-    # Get a property type (via javascript)
-    def get_property_type( self, property_name ):
-        if property_name == "type":
-            return "string"
-        elif property_name == "value":
-            return "string"
-        elif property_name == "options":
-            # Return a JSArray describing the options objects underlying this selectbox
-            return "array"
-        elif property_name == "length":
-            # Return as JSNumber describing the length of the array
-            return "number"
-        elif property_name == "selectedIndex":
-            return "number"
-        else:
-            return VirtualFormDataElement.get_property_type( self, property_name )
-
-    # Get an option object
-    def get_option_object( self, index ):
-        assert index < len(self.option_value_list)
-        return JSOptionValue( self.option_value_list[index] )
-
-    # Set an option object
-    def set_option_object( self, index, object ):
-        assert isinstance(object,Javascript.JSObject)
-        if isinstance(object,Javascript.JSNull):
-                # It's a delete; remove the specified entry wherever it is found
-                #print "Deleting index %d from %s" % (index,self.get_name())
-            if index >= len(self.option_value_list):
-                return
-            del self.option_value_list[index]
-        else:
-            # Grab the text and value attributes
-            text = object.get_value( "text" ).str_value()
-            value = object.get_value( "value" ).str_value()
-            #print "Setting index %d for %s to text %s value %s" % (index,self.get_name(),text,value)
-            # Set this at the current index
-            if index >= len(self.option_value_list):
-                self.add_selection( value, text, False )
-            # Create a new selectbox element
-            element = SelectboxElement( value, text, False )
-            self.option_value_list[index] = element
-
-# Text/password field
-class VirtualTextarea( VirtualFormDataElement ):
-
-    def __init__( self, form_instance, name ):
-        VirtualFormDataElement.__init__( self, form_instance, name )
-        self.textvalue = ""
-
-    # Public api
-
-    # Set text value
-    def set_value( self, text_value ):
-        assert isinstance( text_value, unicode ) or isinstance( text_value, str )
-        self.textvalue = text_value
-
-    # Private API
-
-    # Optionally add a set of name/value tuples to a sequence to be posted
-    def add_variables( self, accumulator ):
-        accumulator.append( ( self.get_name( ), self.textvalue ) )
-
-    # Set a property (via javascript)
-    def set_property( self, property_name, property_value ):
-        if property_name == "value":
-            assert isinstance( property_value, Javascript.JSObject )
-            self.textvalue = property_value.str_value( )
-        else:
-            VirtualFormDataElement.set_property( self, property_name, property_value )
-
-    # Get a property (via javascript)
-    def get_property( self, property_name ):
-        if property_name == "value":
-            return Javascript.JSString( self.textvalue )
-        elif property_name == "focus":
-            return JSFocusMethod( self )
-        else:
-            return VirtualFormDataElement.get_property( self, property_name )
-
-    # Get a property type (via javascript)
-    def get_property_type( self, property_name ):
-        if property_name == "value":
-            return "string"
-        else:
-            return VirtualFormDataElement.get_property_type( self, property_name )
-
-# Class that describes a virtual form.  Each form has an identifier (the form name), plus form elements
-# that live in the form.
-class VirtualForm:
-
-    def __init__( self, window_instance, name, action_url, method ):
-        # These elements all have scrapable data, and are organized by
-        # key (which comes from the element).
-        self.data_elements = { }
-        self.javascript_data_elements = { }
-        self.window_instance = window_instance
-        self.form_name = name
-        self.action_url = action_url
-        self.method = method
-
-    # Public API
-
-    # Get the form name
-    def get_name( self ):
-        return self.form_name
-
-    # Find a file browser
-    # Matches data variable name.
-    def find_filebrowser( self, data_name ):
-        try:
-            value = self.data_elements[ data_name ]
-            assert isinstance( value, VirtualFileBrowser )
-            return value
-        except:
-            raise Exception("Can't find filebrowser %s on form %s for url %s" % (data_name,self.form_name,self.window_instance.get_current_url( )))
-
-
-    # Find a checkbox
-    # Matches checkbox data variable name, and value.
-    # Returns a VirtualCheckbox object, or None if not found.
-    def find_checkbox( self, data_name, value ):
-        key = data_name + "=" + value
-        try:
-            value = self.data_elements[ key ]
-            assert isinstance( value, VirtualCheckbox )
-            return value
-        except:
-            raise Exception("Can't find checkbox %s:%s on form %s for url %s" % (data_name,value,self.form_name,self.window_instance.get_current_url( )))
-
-    # Find a radio button
-    # Matches radio button data variable name, and value.
-    # Returns a VirtualRadiobutton object, or None if not found.
-    def find_radiobutton( self, data_name, value ):
-        key = data_name + "=" + value
-        try:
-            value = self.data_elements[ key ]
-            assert isinstance( value, VirtualRadiobutton )
-            return value
-        except:
-            raise Exception("Can't find radiobutton %s:%s on form %s for url %s" % (data_name,value,self.form_name,self.window_instance.get_current_url()))
-
-    # Find a selection box
-    # Matches based on the data variable name alone.
-    # Returns a VirtualSelectbox object, or None if not found.
-    def find_selectbox( self, data_name ):
-        try:
-            value = self.data_elements[ data_name ]
-            assert isinstance( value, VirtualSelectbox )
-            return value
-        except:
-            raise Exception("Can't find selectbox %s on form %s for url %s" % (data_name,self.form_name,self.window_instance.get_current_url()))
-
-    # Find a textarea/password field
-    # Matches based on the data variable name alone.
-    # Returns a VirtualTextarea object, or None if not found.
-    def find_textarea( self, data_name ):
-        try:
-            value = self.data_elements[ data_name ]
-            assert isinstance( value, VirtualTextarea )
-            return value
-        except:
-            raise Exception("Can't find textarea %s on form %s for url %s" % (data_name,self.form_name,self.window_instance.get_current_url()))
-
-    # Get the action URL
-    def get_action_url( self ):
-        return self.action_url
-
-    # Set the action URL
-    def set_action_url( self, newurl ):
-        self.action_url = newurl
-
-    # Private API
-
-    # Find an element based on its data name.
-    # This will return the FIRST matching checkbox or radio button, which seems to be the
-    # browser convention.
-    def find_element_by_dataname( self, data_name ):
-        return self.javascript_data_elements[ data_name ]
-
-    # Execute javascript expression in the form context.
-    # Returns a JSObject representing the result.
-    def execute_javascript_expression( self, javascript ):
-        return self.window_instance.execute_javascript_expression( javascript )
-
-    # Add an element to this form.
-    def add_element( self, element ):
-        assert isinstance( element, VirtualFormDataElement )
-        self.data_elements[ element.get_key( ) ] = element
-        if not self.javascript_data_elements.has_key( element.get_name( ) ):
-            self.javascript_data_elements[ element.get_name( ) ] = element
-
-    # This method is called just before a radio button is selected.
-    # It must deselect all radio buttons that share this element name.
-    def clear_radio_buttons( self, element_name ):
-        # Go through all the elements
-        for element_key, element_value in self.data_elements.iteritems( ):
-            if element_name == element_value.get_name( ):
-                assert isinstance( element_value, VirtualRadiobutton )
-                element_value.deselect( )
-
-    # This method does the nuts and bolts of submitting a form - basically,
-    # gathering data from all the form elements and stringing it together into
-    # a list of form variables and their values, then sending it on to the window
-    # (and hence to the browser instance) for posting.
-    def submit( self ):
-        # Go through all elements and scrape up current values, and send those
-        # to the action url
-
-        # First, go through the elements and gather up a variable and file set
-        variables = [ ]
-        files = [ ]
-        for element_key, element_value in self.data_elements.iteritems( ):
-            element_value.add_variables( variables )
-            element_value.add_files( files )
-
-        # Pass these off to the window
-        self.window_instance.execute_action( self.method, variables, files, self.action_url )
-
-# Class that describes a link in a virtual browser window.
-class VirtualLink:
-
-    def __init__( self, window_instance, alt, url, onclick ):
-        self.window_instance = window_instance
-        self.alt = alt
-        self.linktext = None
-        self.onclick = onclick
-        self.url = url
-
-    # Public part of interface
-
-    # Click this virtual link
-    def click( self ):
-        result = self.window_instance.execute_javascript_expression( self.onclick )
-        if result != None:
-            if result.bool_value( ):
-                # Take link
-                self.window_instance.execute_link( self.url )
-        else:
-            self.window_instance.execute_link( self.url )
-
-    # Private part of interface
-
-    def get_alt( self ):
-        return self.alt
-
-    def set_bodytext( self, bodytext ):
-        self.linktext = bodytext
-
-# Dummy request (so we can use cookiejar)
-class DummyRequest:
-    """
-    Dummy request (for interfacing with cookiejar).
-    """
-
-    def __init__( self, protocol, host, url ):
-        self.protocol = protocol
-        self.host = host
-        self.url = url
-        self.headers = {}
-
-    def has_header( self, name ):
-        return name in self.headers
-
-    def add_header( self, key, val ):
-        self.headers[key.capitalize()] = val
-
-    def add_unredirected_header(self, key, val):
-        self.headers[key.capitalize()] = val
-
-    def is_unverifiable( self ):
-        return True
-
-    def get_type( self ):
-        return self.protocol
-
-    def get_full_url( self ):
-        return self.url
-
-    def get_header( self, header_name, default=None ):
-        return self.headers.get( header_name, default )
-
-    def get_host( self ):
-        return self.host
-
-    get_origin_req_host = get_host
-
-    def get_headers( self ):
-        return self.headers
-
-# Class that describes a virtual browser window.  Each virtual window has some set of forms and links,
-# as well as a set of dialog boxes (which can be popped up due to various actions, and dismissed
-# by virtual user activity)
-class VirtualWindow:
-
-    def __init__( self, browser_instance, window_name, data, parent, current_url ):
-        print >>sys.stderr, "Loading window '%s' with data from url %s" % (window_name, current_url)
-        self.links = { }
-        self.buttons = { }
-        self.forms = { }
-        self.window_name = window_name
-        self.data = data
-        #print >>sys.stderr, data
-        self.parent = parent
-        self.browser_instance = browser_instance
-        self.is_open = True
-        self.jscontext = Javascript.JSScope( enclosing_scope=None )
-        self.dialog_answers = None
-        self.current_url = current_url
-
-        # Now, assert javascript objects into the current scope to permit
-        # Javascript to work.
-
-        # Need methods for:
-        # confirm( )
-        # alert( )
-        # eval( )
-        # parseInt( )
-
-        self.jscontext.define_value( "confirm", JSConfirmMethod( self ) )
-        self.jscontext.define_value( "alert", JSAlertMethod( self ))
-        self.jscontext.define_value( "eval", JSEvalMethod( self ))
-        self.jscontext.define_value( "parseInt", JSParseIntMethod( self ))
-
-        # Need built-in objects for:
-        # document (with form properties and form element properties beneath that).
-        # Also, need the shortcut entered, which is a property that's just the form name.
-        # First, create the document object.
-        self.jsdocobject = JSDocObject( )
-        self.jscontext.define_value( "document", self.jsdocobject )
-
-        # Window object
-        self.jswindowobject = JSWindowObject( self )
-        self.jscontext.define_value( "window", self.jswindowobject )
-
-        # Finally, need built-in "Option" class
-        jsoptionclassdef = JSOptionClassDef( )
-        self.jscontext.define_value( "Option", jsoptionclassdef )
-
-        # Parse the data
-        parser = VirtualActionParser( self )
-        parser.feed( data )
-        parser.close( )
-
-        """ for form_name, form_object in self.forms.iteritems( ):
-            # Build a javascript object representing the form
-            jsobject = JSFormObject( form_object )
-            # Add this object to the doc object
-            self.jsdocobject.add_form( form_name, jsobject )
-            # Add this object to the main context
-            self.jscontext.define_value( form_name, jsobject )
-        """
-
-    # Public part of interface
-
-    # Look for pattern
-    def is_present( self, regular_expression ):
-        reobject = re.compile( regular_expression )
-        mo = reobject.search( self.data )
-        return mo != None
-
-    # Look for a specific match in the page data, and return the value of the specified group
-    def find_match( self, regular_expression, group=0 ):
-        reobject = re.compile( regular_expression )
-        mo = reobject.search( self.data )
-        if mo == None:
-            raise Exception("Pattern %s not found in page %s (%s)" % (regular_expression,self.current_url,self.data))
-        return mo.group(group)
-
-    # Look for a specific match in the page data, and return the value of the specified group
-    def find_match_no_newlines( self, regular_expression, group=0 ):
-        reobject = re.compile( regular_expression )
-        mo = reobject.search( " ".join(self.data.split( )) )
-        if mo == None:
-            raise Exception("Pattern %s not found in page %s (%s)" % (regular_expression,self.current_url,self.data))
-        return mo.group(group)
-
-    # Make sure there is NOT a match of the specified kind.
-    def check_no_match( self, regular_expression ):
-        reobject = re.compile( regular_expression )
-        mo = reobject.search( self.data )
-        if mo != None:
-            raise Exception("Pattern %s was erroneously found in page %s (%s)" % (regular_expression,self.current_url,self.data))
-
-    # Set the current dialog answers, in case there are virtual dialog popups
-    def set_dialog_answers( self, dialog_answers ):
-        assert dialog_answers == None or isinstance( dialog_answers, VirtualDialogAnswers )
-        self.dialog_answers = dialog_answers
-
-    # For all of the operations that refer to form elements, the elements are
-    # referenced by form name and something which identifies the element within
-    # the form, which is element specific.  For example, a checkbox is identified
-    # by the text and html between the <input> and </input> tags.  This is presumed to be
-    # unique for the form.  Since an exact match is often difficult to generate, the
-    # matches are passed in as regular expressions whenever arbitrary HTML needs to be
-    # matched.
-    #
-    # For links, the link text and alt text are used for identification.  Regexps are
-    # allowed for the link text matching.
-
-    # Find a link
-    # Needs to match the alt text, which must be unique on the page.
-    # Returns a VirtualLink object, or None if not found.
-    def find_link( self, alt ):
-        try:
-            return self.links[ alt ]
-        except:
-            raise Exception("Can't find link %s on page %s" % (alt,self.current_url))
-
-    # Find a form
-    # Needs to match the form name.  Returns a VirtualForm object, or None.
-    def find_form( self, form_name ):
-        try:
-            return self.forms[ form_name ]
-        except:
-            raise Exception("Can't find form %s on page %s" % (form_name,self.current_url))
-
-    # Find a button
-    # Matches based on the button's alt text, which
-    # must be unique.  Returns a VirtualButton object, or None if not
-    # found.  The button may be of many different types (e.g. submit
-    # buttons, plain buttons, etc).
-    def find_button( self, alt ):
-        try:
-            return self.buttons[ alt ]
-        except:
-            raise Exception("Can't find button %s on page %s" % (alt,self.current_url))
-
-    # Close this window.  This is meant to correspond directly to closing the window
-    # in the browser.
-    def close_window( self ):
-        # This may fire off scripts someday, but today it just marks the window as dead
-        self.is_open = False
-        self.browser_instance.delete_window( self.window_name )
-
-    # Get the current url for this window
-    def get_current_url( self ):
-        return self.current_url
-
-    # Get the data for this window
-    def get_data( self ):
-        return self.data
-
-    # Private part of interface
-
-    # Initialize; execute whatever startup scripts and side-effect loading is needed
-    def initialize( self ):
-        # Probably I ought to implement frameset handling at least, but right now even
-        # that is not needed
-        is_open = True
-
-    # Get the parent window
-    def get_parent_window( self ):
-        return self.parent
-
-    # Get dialog answers in place
-    def get_dialog_answers( self ):
-        return self.dialog_answers
-
-    # Check if a symbol exists in the current javascript context
-    def check_exists( self, symbol_name ):
-        try:
-            self.jscontext.get_value( symbol_name )
-            return True
-        except:
-            return False
-
-    # Execute javascript expression in the window context.
-    # Returns a JSObject representing the result.
-    def execute_javascript_expression( self, javascript ):
-        # All objects, methods, etc. have already been asserted into the javascript context,
-        # which gives javascript the access it needs to document objects and built-in methods.
-        # So we just need to execute against it.
-
-        if javascript != None and javascript.lower( ).startswith("javascript:"):
-            tokenstream = Javascript.JSTokenStream( javascript[ len("javascript:") : len(javascript) ] )
-            return tokenstream.evaluate_expr( self.jscontext, "HTML" )
-        return None
-
-    # Do a post or a get into the current window
-    def execute_action( self, method, parameters, files, url ):
-        if self.is_open == False:
-            raise Exception("Cannot execute action %s on already closed window %s" % ( url, self.window_name ) )
-        # Send the url off to the browser instance to load
-        return self.browser_instance.execute_action( self.window_name, method, parameters, files, self.resolve( url ) )
-
-    # Do a get with a preformed url.
-    def execute_link( self, url ):
-        if self.is_open == False:
-            raise Exception("Cannot execute link %s on already closed window %s" % (url,self.window_name) )
-        return self.browser_instance.execute_link( self.window_name, self.resolve( url ) )
-
-    # Add a link
-    def add_link( self, linkobject ):
-        assert isinstance( linkobject, VirtualLink )
-        self.links[ linkobject.get_alt( ) ] = linkobject
-
-    # Add a form
-    def add_form( self, formobject ):
-        assert isinstance( formobject, VirtualForm )
-        form_name = formobject.get_name( )
-        self.forms[ form_name ] = formobject
-        jsobject = JSFormObject( formobject )
-        # Add this object to the doc object
-        self.jsdocobject.add_form( form_name, jsobject )
-        # Add this object to the main context
-        self.jscontext.define_value( form_name, jsobject )
-
-    # Add a button
-    def add_button( self, buttonobject ):
-        assert isinstance( buttonobject, VirtualButton )
-        self.buttons[ buttonobject.get_key( ) ] = buttonobject
-
-    # Accept javascript definitions etc.
-    def accept_javascript( self, javascript_text ):
-        javascript_text = javascript_text.lstrip( ).rstrip( )
-        if javascript_text.startswith("<!--"):
-            javascript_text = javascript_text[4:len(javascript_text)]
-        if javascript_text.endswith("//-->"):
-            javascript_text = javascript_text[0:len(javascript_text)-5]
-        jstokens = Javascript.JSTokenStream( javascript_text )
-        jstokens.evaluate_statement_list( self.jscontext )
-
-    # Get the answer to a dialog question.
-    def get_answer( self, question, default_answer ):
-        # Look in the dialog_answers structure for some guidance
-        # MHL
-        return default_answer
-
-    # Resolve a (potentially relative) url into an absolute url with full qualification
-    def resolve( self, url ):
-        protocol = self.current_url.index("://") + 3
-        if url.find("://") != -1:
-            return url
-        elif url.startswith("/"):
-            # Relative to domain
-            domain = self.current_url.index("/",protocol)
-            return self.current_url[0:domain] + url
-        else:
-            endguy = self.current_url.rindex("/")+1
-            return self.current_url[0:endguy] + url
-
-# Class that describes a virtual browser instance, with various windows and their associated
-# alerts/popups
-class VirtualBrowser:
-
-    def __init__( self, username=None, password=None, win_host=None, language="en-US" ):
-        self.window_set = { }
-        self.username = username
-        self.password = password
-        self.win_host = win_host
-        self.language = language
-        self.cookiejar = cookielib.CookieJar()
-        if win_host == None and username != None:
-            # Set up basic auth
-            pass
-            #self.urllibopener = urllib2.build_opener( urllib2.HTTPHandler ( ) )
-        elif win_host != None and username != None:
-            # Proxy-based auth
-            # MHL
-            raise Exception("Feature not yet implemented")
-        else:
-            # Use standard opener
-            pass
-            #self.urllibopener = urllib2.build_opener( urllib2.HTTPHandler ( ) )
-
-    # Public part of the Virtual Browser interface
-
-    # Send the main window to a specific URL
-    def load_main_window( self, url, initial_dialog_answers=None ):
-        self.build_window( "", self.fetch_data_with_get( url ), None, url, initial_dialog_answers )
-
-    # Find a specific window by name.  Use name=None
-    # for main window.  Returns a VirtualBrowserWindow
-    # object, or None if the window doesn't exist.
-    def find_window( self, window_name="" ):
-        try:
-            return self.window_set[ window_name ]
-        except:
-            raise Exception("Can't find existing window %s" % window_name)
-
-    # Private part of the Virtual Browser interface
-
-    # Delete a window
-    def delete_window( self, window_name ):
-        del self.window_set[ window_name ]
-
-    # Reload an existing window
-    def reload_window( self, window_name, window_data, full_url ):
-        old_window = self.find_window( window_name )
-        old_window.close_window( )
-        self.build_window( window_name, window_data, old_window.get_parent_window( ), full_url, old_window.get_dialog_answers( ) )
-
-    # Create a window, with a specific parent and data, and register it.
-    # If the window already exists, it will be replaced.
-    def build_window( self, window_name, window_data, parent_window, current_url, initial_dialog_answers=None ):
-        # Parse the data to create a window, with the specified parent virtual window
-        new_window = VirtualWindow( self, window_name, window_data, parent_window, current_url )
-        # Put the new window into the window set.  This may well replace an existing window.
-        self.window_set[ window_name ] = new_window
-        # Now execute start up stuff from that window (when frames are implemented, this is where they would go)
-        new_window.set_dialog_answers( initial_dialog_answers )
-        new_window.initialize( )
-
-    # Read a url using all the connection parameters, cookies, authentication info etc. available.
-    # Creates a new window object accordingly.
-    def execute_action( self, window_name, method, parameters, files, url ):
-        window_data = None
-        if method == "GET":
-            if len(files) > 0:
-                raise Exception("File controls found in GET submit, for url '%s'" % url)
-            # Need to assemble parameters and tack them onto url
-            parameter_string = urllib.urlencode( parameters )
-            fullurl = url + "?" + parameter_string
-            # Invoke!
-            window_data = self.fetch_data_with_get( fullurl )
-        elif method == "POST":
-            if len(files) > 0:
-                raise Exception("File controls found in POST submit, for url '%s'" % url)
-            # Assemble parameters into form post
-            window_data = self.fetch_data_with_post( parameters, url )
-        elif method == "MULTIPART":
-            # Assemble parameters into multipart form post
-            window_data = self.fetch_data_with_multipart_post( parameters, files, url )
-        else:
-            raise Exception("Unknown action method: %s" % method)
-
-        # Create a new window object with the result, and save it
-        self.reload_window( window_name, window_data, url )
-
-    # Read a preformed url into a window using get.
-    def execute_link( self, window_name, url ):
-        window_data = self.fetch_data_with_get( url )
-        self.reload_window( window_name, window_data, url )
-
-    """
-    def fetch_and_decode( self, req ):
-        f = self.urllibopener.open( req )
-        fetch_info = f.info()
-        encoding = "iso-8859-1"
-        if fetch_info != None and fetch_info.has_key("Content-type"):
-            content_type = fetch_info["Content-type"]
-            charset_index = content_type.find("charset=")
-            if charset_index != -1:
-                encoding = content_type[charset_index+8:len(content_type)]
-        return f.read( ).decode(encoding)
-    """
-
-    # Read a url with get.  Returns the data as a string.
-    def fetch_data_with_get( self, url ):
-        print >> sys.stderr, "Getting url '%s'..." % url
-        return self.talk_to_server(url)
-        """
-        req = urllib2.Request( url )
-        if self.language != None:
-            req.add_header("Accept-Language", self.language)
-        if self.username != None:
-            base64string = base64.encodestring('%s:%s' % (self.username, self.password))[:-1]
-            req.add_header("Authorization", "Basic %s" % base64string)
-        # Add cookies appropriate to domain
-        # MHL - not yet implemented
-        # req.add_header('Referer', 'http://www.python.org/')
-        return self.fetch_and_decode( req )
-        """
-
-    # Read a url with post.  Pass the parameters as an array of ( name, value ) tuples.
-    def fetch_data_with_post( self, parameters, url ):
-        paramstring = urllib.urlencode( parameters, doseq=True )
-        print >> sys.stderr, "Posting url '%s' with parameters '%s'..." % (url, paramstring)
-        return self.talk_to_server( url, method="POST", body=paramstring, content_type="application/x-www-form-urlencoded" )
-        """
-        req = urllib2.Request( url, paramstring )
-        if self.language != None:
-            req.add_header("Accept-Language", self.language)
-        if self.username != None:
-            base64string = base64.encodestring('%s:%s' % (self.username, self.password))[:-1]
-            req.add_header("Authorization", "Basic %s" % base64string)
-        # Add cookies by domain
-        # MHL
-        return self.fetch_and_decode( req )
-        """
-
-    # Private method to post using multipart forms
-    def fetch_data_with_multipart_post( self, parameters, files, url ):
-
-        paramstring = urllib.urlencode( parameters, doseq=True )
-        filecount = 0
-        if files != None:
-            filecount = len(files)
-        print >> sys.stderr, "Multipart posting url '%s' with parameters '%s' and %d files..." % (url, paramstring, filecount)
-
-        """
-        Post fields and files to an http host as multipart/form-data.
-        fields is a sequence of (name, value) elements for regular form fields.
-        files is a sequence of (name, filename, value, content_type) elements for data to be uploaded as files
-        Return the server's response page.
-        """
-        content_type, body = encode_multipart_formdata(parameters, files)
-        return self.talk_to_server(url, method="POST", content_type=content_type, body=body)
-
-    def talk_to_server(self, url, method="GET", content_type=None, body=None):
-        
-        # Redirection loop
-        while True:
-
-            # Turn URL into protocol, host, and selector
-            urlpieces = url.split("://")
-            protocol = urlpieces[0]
-            uri = urlpieces[1]
-            # Split uri at the first /
-            uripieces = uri.split("/")
-            host = uripieces[0]
-            selector = uri[len(host):len(uri)]
-
-            if protocol == "http":
-                h = httplib.HTTPConnection(host)
-            elif protocol == "https":
-                h = httplib.HTTPSConnection(host)
-            else:
-                raise Exception("Unknown protocol: %s" % protocol)
-
-            h.connect()
-            try:
-                # Set the request type and url
-                h.putrequest(method, selector)
-
-                # Set the content type and length
-                if content_type != None:
-                    h.putheader("content-type", content_type)
-                if body != None:
-                    h.putheader("content-length", str(len(body)))
-
-                # Add cookies by domain.  To do this with httplib and cookielib,
-                # we create a dummy urllib2 request.
-                urllib2_request = DummyRequest( protocol, host, url )
-
-                # add cookies to fake request
-                self.cookiejar.add_cookie_header( urllib2_request )
-                
-                # apply cookie headers to actual request
-                for header in urllib2_request.get_headers().keys():
-                    header_value = urllib2_request.get_headers()[header]
-                    h.putheader( header, header_value )
-
-                if self.language != None:
-                    h.putheader("Accept-Language", self.language)
-
-                # Add basic auth credentials, if needed.
-                if self.username != None:
-                    base64string = base64.encodestring("%s:%s" % (self.username, self.password))[:-1]
-                    h.putheader("Authorization", "Basic %s" % base64string)
-
-                h.endheaders()
-
-                # Send the body
-                if body != None:
-                    h.send(body)
-                response = h.getresponse()
-                status = response.status
-                headers = response.getheaders()
-                encoding = "iso-8859-1"
-                content_type = response.getheader("Content-type","text/html; charset=iso-8859-1")
-                charset_index = content_type.find("charset=")
-                if charset_index != -1:
-                    encoding = content_type[charset_index+8:len(content_type)]
-
-                value = response.read().decode(encoding)
-
-                # HACK: pretend we're urllib2 response for cookielib
-                response.info = lambda : response.msg
-
-                # read and store cookies from response
-                self.cookiejar.extract_cookies(response, urllib2_request)
-
-                # If redirection, go around again
-                if status == 301 or status == 302:
-                    # Redirection!  New url to process.
-                    location_header = response.msg.getheader("location")
-                    if location_header != None:
-                        print >>sys.stderr, "Redirecting from url '%s' to url '%s'..." % ( url, location_header )
-                        url = location_header
-                        continue
-                    else:
-                        raise Exception("Missing redirection location header")
-
-                # If NOT a redirection, handle it.
-                if status != 200:
-                    raise Exception("Received an error response %d from url: '%s'" % (status,url) )
-
-                return value
-            finally:
-                h.close()
-
-# Static method for multipart encoding
-def encode_multipart_formdata(fields, files):
-    """
-    fields is a sequence of (name, value) elements for regular form fields.
-    files is a sequence of (name, filename, value, content_type) elements for data to be uploaded as files
-    Return (content_type, body)
-    """
-    import array
-    body = array.array('B')
-    BOUNDARY = "----------ThIs_Is_tHe_bouNdaRY_$"
-    CRLF = "\r\n"
-    if fields != None:
-        for (key, value) in fields:
-            body.fromstring("--" + BOUNDARY + CRLF)
-            body.fromstring(('Content-Disposition: form-data; name="%s"' % key) + CRLF)
-            body.fromstring("Content-Type: text/plain; charset=utf-8" + CRLF)
-            body.fromstring(CRLF)
-            body.fromstring(value.encode("utf-8"))
-            body.fromstring(CRLF)
-
-    if files != None:
-        for (key, filename, value, content_type) in files:
-            body.fromstring("--" + BOUNDARY + CRLF)
-            body.fromstring(('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) + CRLF)
-            body.fromstring(("Content-Type: %s" % content_type) + CRLF)
-            body.fromstring(CRLF)
-            body.fromstring(value)
-            body.fromstring(CRLF)
-
-    body.fromstring("--" + BOUNDARY + "--" + CRLF)
-    body.fromstring(CRLF)
-
-    return "multipart/form-data; boundary=%s" % BOUNDARY, body
-
-# Everything below here is not considered public at all
-
-# JS object that handles "confirm" method
-class JSConfirmMethod( Javascript.JSObject ):
-
-    def __init__( self, window_instance ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( window_instance, VirtualWindow )
-        self.window_instance = window_instance
-
-    def call( self, argset, context ):
-        # Check to be sure we have one string argument
-        if len(argset) != 1:
-            raise Exception("confirm method requires one string argument")
-        # Evaluate to string
-        message = argset[0].str_value( )
-        print >>sys.stderr, "CONFIRM: "+message
-        # Now, decide whether we return true or false.
-        return Javascript.JSBoolean( self.window_instance.get_answer( message, True ) )
-
-# JS object that handles "alert" method
-class JSAlertMethod( Javascript.JSObject ):
-
-    def __init__( self, window_instance ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( window_instance, VirtualWindow )
-        self.window_instance = window_instance
-
-    def call( self, argset, context ):
-        # Check to be sure we have one string argument
-        if len(argset) != 1:
-            raise Exception("alert method requires one string argument")
-        # Evaluate just to be sure there's no error
-        message = argset[0].str_value( )
-        print >>sys.stderr, "ALERT: "+message
-        # Always click "OK"
-        return Javascript.JSBoolean( True )
-
-# JS object that handles "eval" method
-class JSEvalMethod( Javascript.JSObject ):
-
-    def __init__( self, window_instance ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( window_instance, VirtualWindow )
-        self.window_instance = window_instance
-
-    def call( self, argset, context ):
-        # Check to be sure we have one string argument
-        if len(argset) != 1:
-            raise Exception("eval method requires one string argument")
-        # Evaluate to string
-        message = argset[0].str_value( )
-        # Parse this as javascript
-        tokenstream = Javascript.JSTokenStream( message )
-        return tokenstream.evaluate_expr( context, "Eval" )
-
-# JS object that handles "parseInt" method
-class JSParseIntMethod( Javascript.JSObject ):
-
-    def __init__( self, window_instance ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( window_instance, VirtualWindow )
-        self.window_instance = window_instance
-
-    def call( self, argset, context ):
-        # Check to be sure we have one string argument
-        if len(argset) != 1:
-            raise Exception("parseInt method requires one string argument")
-        # Evaluate to int
-        intvalue = argset[0].int_value( )
-        return Javascript.JSNumber( intvalue )
-
-# JS object that handles "submit" method
-class JSSubmitMethod( Javascript.JSObject ):
-
-    def __init__ ( self, form_instance ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( form_instance, VirtualForm )
-        self.form_instance = form_instance
-
-    def call( self, argset, context ):
-        # Check to be sure we have no arguments
-        if len(argset) != 0:
-            raise Exception("submit method has no arguments")
-        self.form_instance.submit( )
-        return Javascript.JSBoolean( True )
-
-# Class representing focus method
-class JSFocusMethod( Javascript.JSObject ):
-    def __init__ ( self, owner ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( owner, VirtualFormDataElement )
-        self.owner = owner
-
-    def call( self, argset, context ):
-        print >>sys.stderr, "FOCUS: On field '%s'" % self.owner.get_name( )
-        return Javascript.JSBoolean( True )
-
-# JS object representing a window in Javascript
-class JSWindowObject( Javascript.JSObject ):
-
-    def __init__( self, window_object ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( window_object, VirtualWindow )
-        self.window_object = window_object
-
-    def get_value( self, member_name ):
-        # Check to see if there is a js object saved with the
-        # specified name.
-        return Javascript.JSBoolean( self.window_object.check_exists( member_name ) )
-
-    def set_value( self, member_name, value ):
-        raise Exception("Cannot set properties of window object")
-
-
-# JS object representing a document in Javascript
-class JSDocObject( Javascript.JSObject ):
-
-    def __init__( self ):
-        Javascript.JSObject.__init__( self )
-        self.forms = { }
-
-    def add_form( self, form_name, jsobject ):
-        self.forms[ form_name ] = jsobject
-
-    def get_value( self, member_name ):
-        try:
-            return self.forms[ member_name ]
-        except:
-            return Javascript.JSObject.get_value( self, member_name )
-
-    def set_value( self, member_name, value ):
-        if member_name != "onkeypress":
-            raise Exception("Cannot set properties of document object")
-
-# Class representing a form in Javascript
-class JSFormObject( Javascript.JSObject ):
-
-    def __init__( self, virtual_form_object ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( virtual_form_object, VirtualForm )
-        self.virtual_form_object = virtual_form_object
-
-    def get_value( self, member_name ):
-        # Properties and methods available for all forms include the elements of the
-        # forms (as objects), as well as methods.
-        # The only method available right now is submit()
-        if member_name == "submit":
-            return JSSubmitMethod( self.virtual_form_object )
-        elif member_name == "action":
-            return Javascript.JSString( self.virtual_form_object.get_action_url() )
-
-        # Find the element on the form of this name
-        try:
-            form_element = self.virtual_form_object.find_element_by_dataname( member_name )
-        except:
-            Javascript.JSObject.get_value( self, member_name )
-        return JSElementObject( form_element )
-
-    def set_value( self, member_name, value ):
-        if member_name == "action":
-            self.virtual_form_object.set_action_url( value.str_value() )
-            return
-
-        # Can't set anything here
-        raise Exception("Cannot set properties of form object")
-
-# Class representing an element in Javascript
-class JSElementObject( Javascript.JSObject ):
-
-    def __init__( self, element_object ):
-        Javascript.JSObject.__init__( self )
-        assert isinstance( element_object, VirtualFormDataElement )
-        self.element_object = element_object
-
-    def get_type( self, member_name ):
-        # We need to return the proper types of the javascript object
-        # properties
-        value = self.element_object.get_property_type( member_name )
-        return value
-        
-    def get_value( self, member_name ):
-        # The object itself knows what its javascript properties are, so call the right
-        # method inside.  All properties are currently strings.
-        value = self.element_object.get_property( member_name )
-        if isinstance( value, Javascript.JSObject ) == False:
-            raise Exception("Property returned from element %s member %s is not a JSObject, it is: %s" % (self.element_object.get_name(), member_name, str(value)))
-        return value
-
-    def set_value( self, member_name, value ):
-        # The object itself knows what its javascript properties are.  Pass them
-        # as strings, though.
-        self.element_object.set_property( member_name, value )
-
-    def type_value( self ):
-        return "formelement"
-
-    def bool_value( self ):
-        # Return true because the object clearly exists
-        return True
-
-class JSOptionClassInstance (Javascript.JSObject ):
-
-    def __init__( self, text, value, selected=False ):
-        Javascript.JSObject.__init__( self )
-        self.text = text
-        self.value = value
-        self.selected = Javascript.JSBoolean(selected)
-
-    def get_value( self, member_name ):
-        if member_name == "text":
-            return self.text
-        elif member_name == "value":
-            return self.value
-        elif member_name == "selected":
-            return self.selected
-        return Javascript.JSObject.get_value( self, member_name )
-
-    def set_value( self, member_name, value ):
-        if member_name == "text":
-            self.text = value
-        elif member_name == "value":
-            self.value = value
-        elif member_name == "selected":
-            self.selected = value.bool_value()
-        else:
-            Javascript.JSObject.set_value( self, member_name, value )
-
-class JSOptionClassDef( Javascript.JSObject ):
-
-    def __init__( self ):
-        Javascript.JSObject.__init__( self )
-
-    def construct( self, argset, context ):
-        # We only accept the 2-argument form: (text, value)
-        if len(argset) != 2:
-            raise Exception("Expected two arguments to Option constructor, saw %d" % len(argset))
-        # Save the two objects
-        return JSOptionClassInstance(argset[0],argset[1])
-
-# This class handles our variety of HTML parsing.
-# We are really interested only in A HREFs, FORM, INPUT, and SCRIPT tags at this time.
-class VirtualActionParser( HTMLParser.HTMLParser ):
-
-    def __init__( self, window_instance ):
-        HTMLParser.HTMLParser.__init__( self )
-        self.window_instance = window_instance
-        # We do not allow nested forms right now
-        self.current_form_instance = None
-        self.current_selectbox = None
-        self.current_radio = None
-        self.current_checkbox = None
-        self.current_textarea = None
-        self.current_link = None
-        self.current_option_value = None
-        self.current_option_value_selected = None
-        self.current_data = None
-        self.current_comment = None
-        self.current_select_active = False
-        self.current_input_active = False
-        self.current_option_active = False
-        self.current_anchor_active = False
-        self.current_form_active = False
-        self.current_script_active = False
-        self.current_textarea_active = False
-        self.tagstack = [ ]
-
-    def handle_starttag( self, tag, attributes ):
-        self.tagstack.append( tag )
-        if tag == "a":
-            self.start_a( attributes )
-        elif tag == "input":
-            self.start_input( attributes )
-        elif tag == "option":
-            self.start_option( attributes )
-        elif tag == "form":
-            self.start_form( attributes )
-        elif tag == "select":
-            self.start_select( attributes )
-        elif tag == "script":
-            self.start_script( attributes )
-        elif tag == "textarea":
-            self.start_textarea( attributes )
-
-    def handle_endtag( self, tag ):
-        lastguy = self.tagstack[ len(self.tagstack) - 1 ]
-        if lastguy != tag:
-            raise Exception("Unmatched tag: %s. Found instead: %s" % (lastguy, tag) )
-        del self.tagstack[ len(self.tagstack) - 1 ]
-        if tag == "a":
-            self.end_a( )
-        elif tag == "input":
-            self.end_input( )
-        elif tag == "option":
-            self.end_option( )
-        elif tag == "form":
-            self.end_form( )
-        elif tag == "select":
-            self.end_select( )
-        elif tag == "script":
-            self.end_script( )
-        elif tag == "textarea":
-            self.end_textarea( )
-
-    def start_a( self, attributes ):
-        # We only care about HREF=
-        if self.current_link != None:
-            raise Exception("Anchor within anchor: not allowed")
-        self.current_anchor_active = True
-        dict = make_dictionary( attributes )
-        try:
-            href = dict[ "href" ]
-            # IE6, 7, and Firefox 3 all do a URL Decode at this point...
-            href = urllib.unquote(href)
-            alt = dict[ "alt" ]
-            onclick = None
-            try:
-                onclick = dict[ "onclick" ]
-            except:
-                if href.lower().startswith("javascript:"):
-                    onclick = href
-                    href = None
-            self.current_data = ""
-            self.current_link = VirtualLink( self.window_instance, alt, href, onclick )
-        except:
-            pass
-
-    def end_a( self ):
-        if self.current_anchor_active == False:
-            raise Exception("Unmatched anchor tag; end without start")
-        self.current_anchor_active == False
-        if self.current_link != None:
-            # Use the saved data as link body
-            self.current_link.set_bodytext( self.current_data )
-            # Save the link
-            self.window_instance.add_link( self.current_link )
-            self.current_link = None
-        self.current_data = None
-
-    def start_form( self, attributes ):
-        if self.current_form_instance != None:
-            raise Exception("Nested forms not allowed")
-        dict = make_dictionary( attributes )
-        self.current_form_active = True
-        try:
-            action = dict[ "action" ]
-            name = dict[ "name" ]
-            try:
-                method = dict[ "method" ]
-                method = method.upper( )
-            except:
-                method = "GET"
-            try:
-                type_of_form = dict[ "enctype" ]
-                if type_of_form == "multipart/form-data":
-                    multipart = True
-                else:
-                    multipart = False
-            except:
-                multipart = False
-            if method == "POST" and multipart == True:
-                method = "MULTIPART"
-            print >>sys.stderr, "Form of type %s detected" % method
-            self.current_form_instance = VirtualForm( self.window_instance, name, action, method )
-            self.window_instance.add_form( self.current_form_instance )
-        except:
-            pass
-
-    def end_form( self ):
-        if self.current_form_active == False:
-            raise Exception("Error, form end without form start")
-        self.current_form_active = False
-        if self.current_form_instance != None:
-            self.current_form_instance = None
-
-    def start_select( self, attributes ):
-        if self.current_select_active:
-            raise Exception("Error, can't nest selects")
-        if self.current_form_instance == None:
-            raise Exception("Select not legal outside form")
-        self.current_select_active = True
-        dict = make_dictionary( attributes )
-        try:
-            name = dict[ "name" ]
-        except:
-            raise Exception("Illegal select tag [no name attribute]")
-        try:
-            multiple = dict[ "multiple" ]
-        except:
-            multiple = "false"
-        self.current_selectbox = VirtualSelectbox( self.current_form_instance, name, multiple.lower() == "true" )
-
-    def end_select( self ):
-        if self.current_select_active == False:
-            raise Exception("Error, no starting select tag")
-        self.current_select_active = False
-        if self.current_selectbox != None:
-            self.current_form_instance.add_element( self.current_selectbox )
-            self.current_selectbox = None
-
-
-    def start_textarea( self, attributes ):
-        if self.current_textarea_active:
-            raise Exception("Error, can't nest textareas")
-        if self.current_form_instance == None:
-            raise Exception("Textarea not legal outside form")
-        self.current_textarea_active = True
-        dict = make_dictionary( attributes )
-        try:
-            name = dict[ "name" ]
-        except:
-            raise Exception("Error, textarea has no name attribute")
-        self.current_textarea = VirtualTextarea( self.current_form_instance, name )
-        self.current_data = ""
-
-    def end_textarea( self ):
-        if self.current_textarea_active == False:
-            raise Exception("Error, no starting textarea tag")
-        self.current_textarea_active = False
-        if self.current_textarea != None:
-            self.current_textarea.set_value( self.current_data )
-            self.current_form_instance.add_element( self.current_textarea )
-            self.current_textarea = None
-        self.current_data = None
-
-    def start_input( self, attributes ):
-        if self.current_input_active:
-            raise Exception("Error, can't nest inputs")
-        self.current_input_active = True
-        if self.current_form_instance != None:
-            dict = make_dictionary( attributes )
-            try:
-                type = dict[ "type" ].lower()
-            except:
-                raise Exception("Illegal input tag [no type attribute]")
-
-            if type == "button":
-                try:
-                    value = dict[ "value" ]
-                except:
-                    raise Exception("Input type button must have a value")
-                try:
-                    onclick = dict[ "onclick" ]
-                except:
-                    raise Exception("Input type button must have an onclick script")
-                try:
-                    alt = dict[ "alt" ]
-                    self.window_instance.add_button( VirtualBasicbutton( self.current_form_instance, alt, value, onclick ) )
-                except:
-                    pass
-
-            elif type == "password":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type password must have name attribute")
-                try:
-                    value = dict[ "value" ]
-                except:
-                    raise Exception("Input type password must have value attribute")
-                inst = VirtualTextarea( self.current_form_instance, name )
-                inst.set_value( value )
-                self.current_form_instance.add_element( inst )
-
-            elif type == "text":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type text must have name attribute")
-                try:
-                    value = dict[ "value" ]
-                except:
-                    raise Exception("Input type text must have value attribute")
-                inst = VirtualTextarea( self.current_form_instance, name )
-                inst.set_value( value )
-                self.current_form_instance.add_element( inst )
-
-            elif type == "hidden":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type hidden must have name attribute")
-                try:
-                    value = dict[ "value" ]
-                except:
-                    raise Exception("Input type hidden must have value attribute")
-                # Hiddens are special; they act like they can contain multiple values for a given name.
-                try:
-                    existing_hidden = self.current_form_instance.find_element_by_dataname(name)
-                    existing_hidden.add_value(value)
-                except:
-                    self.current_form_instance.add_element( VirtualHiddenField( self.current_form_instance, name, value ) )
-
-            elif type == "submit":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type submit must have name attribute")
-                try:
-                    value = dict[ "value" ]
-                except:
-                    value = "Submit"
-                try:
-                    onclick = dict[ "onclick" ]
-                except:
-                    onclick = None
-                try:
-                    alt = dict[ "alt" ]
-                    formobject = VirtualSubmitbutton( self.current_form_instance, name, value, alt, onclick )
-                    self.current_form_instance.add_element( formobject )
-                    self.window_instance.add_button( VirtualSubmitbuttonWrapper( formobject ) )
-                except:
-                    pass
-
-            elif type == "radio":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type radio must have name attribute")
-                try:
-                    value = dict[ "value" ]
-                except:
-                    raise Exception("Input type radio must have value attribute")
-                try:
-                    selected = dict[ "checked" ]
-                except:
-                    selected = "false"
-
-                self.current_radio = VirtualRadiobutton( self.current_form_instance, name, value, selected == "true" or selected == "" or selected == "yes" )
-                self.current_data = ""
-
-            elif type == "checkbox":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type checkbox must have name attribute")
-                try:
-                    value = dict[ "value" ]
-                except:
-                    raise Exception("Input type checkbox must have value attribute")
-                try:
-                    selected = dict[ "checked" ]
-                except:
-                    selected = "false"
-
-                self.current_checkbox = VirtualCheckbox( self.current_form_instance, name, value, selected == "true" )
-                self.current_data = ""
-
-            elif type == "file":
-                try:
-                    name = dict[ "name" ]
-                except:
-                    raise Exception("Input type file must have name attribute")
-                self.current_form_instance.add_element( VirtualFileBrowser( self.current_form_instance, name ) )
-
-            else:
-                raise Exception("Unsupported input tag type: %s" % type)
-
-    def end_input( self ):
-        if self.current_input_active == False:
-            raise Exception("Error, no starting input tag")
-        self.current_input_active = False
-        if self.current_form_instance:
-            # Action depends on what's set
-            if self.current_checkbox != None:
-                self.current_checkbox.set_bodytext( self.current_data )
-                self.current_form_instance.add_element( self.current_checkbox )
-                self.current_checkbox = None
-            elif self.current_radio != None:
-                self.current_radio.set_bodytext( self.current_data )
-                self.current_form_instance.add_element( self.current_radio )
-                self.current_radio = None
-
-            self.current_data = None
-
-    def start_option( self, attributes ):
-        if self.current_option_active:
-            raise Exception("Error, can't nest options")
-        if self.current_form_instance == None:
-            raise Exception("Option not legal outside form")
-        if self.current_select_active == False:
-            raise Exception("Option not legal outside select")
-        self.current_option_active = True
-        dict = make_dictionary( attributes )
-        try:
-            self.current_option_value = dict[ "value" ]
-        except:
-            raise Exception("All options must have explicit values")
-        try:
-            self.current_option_value_selected = dict[ "selected" ]
-        except:
-            self.current_option_value_selected = None
-
-        self.current_data = ""
-
-    def end_option( self ):
-        if self.current_option_active == False:
-            raise Exception("Error, no starting option tag")
-        self.current_option_active = False
-        if self.current_option_value != None:
-            self.current_selectbox.add_selection( self.current_option_value, self.current_data, self.current_option_value_selected != None )
-            self.current_option_value = None
-            self.current_option_value_selected = None
-        self.current_data = None
-
-    def start_script( self, attributes ):
-        if self.current_script_active:
-            raise Exception("Nested scripts not legal")
-        self.current_script_active = True
-        dict = make_dictionary( attributes )
-        try:
-            type = dict[ "type" ]
-            if type == "text/javascript":
-                self.current_data = ""
-                self.current_comment = ""
-        except:
-            pass
-
-    def end_script( self ):
-        if self.current_script_active == False:
-            raise Exception("Error, script end without script start")
-        self.current_script_active = False
-        if self.current_comment != None:
-            javascript_text = self.current_data
-            self.current_data = None
-            # Feed the javascript to the JS engine via the window
-            self.window_instance.accept_javascript( javascript_text )
-        elif self.current_data != None:
-            javascript_text = self.current_comment
-            self.current_comment = None
-            self.window_instance.accept_javascript( javascript_text )
-
-
-    def handle_data( self, data ):
-        if self.current_data != None:
-            self.current_data = self.current_data + data
-
-    # This is no longer needed; we don't grab stuff from comments, just from <!-- blocks
-    # def handle_comment( self, data ):
-    #   if self.current_comment != None:
-    #       self.current_comment = self.current_comment + data
-
-# Convert a parameter tuple list into a dictionary.
-# The urllib2.urlencode( ) method probably does this, but that isn't certain, so I'll
-# not remove this code until I am sure.
-def make_dictionary( parameters ):
-    post_parameters = { }
-    # If a particular parameter appears more than once, make it be semicolon - separated
-    for parameter, value in parameters:
-        value = decode_attribute(value)
-        try:
-            current_value = post_parameters[ parameter ]
-            post_parameters[ parameter ] = current_value + ";" + value
-        except:
-            post_parameters[ parameter ] = value
-    return post_parameters
-
-# Decode HTML-encoded attribute value
-def decode_attribute( value ):
-    output_value = ""
-    index = 0
-    while True:
-        new_index = value.find("&",index)
-        if new_index == -1:
-            return output_value + value[index:len(value)]
-        output_value = output_value + value[index:new_index]
-        end_value = value.find(";",new_index)
-        if end_value == -1:
-            index = new_index + 1
-            output_value = output_value + "&"
-            continue
-        char_description = value[new_index+1:end_value]
-        index = end_value + 1
-        if char_description.lower() == "amp":
-            output_value = output_value + "&"
-        elif char_description.startswith("#"):
-            value_to_convert = char_description[1:len(char_description)]
-            output_value = output_value + chr(int(value_to_convert))
-
-if __name__ == "__main__":
-    vb = VirtualBrowser( )
-    vb.load_main_window( "http://mcweb.metacarta.com" )
diff --git a/framework/crawler-ui/.gitignore b/framework/crawler-ui/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/framework/crawler-ui/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/framework/crawler-ui/20_crawler b/framework/crawler-ui/20_crawler
deleted file mode 100755
index 0fe39db..0000000
--- a/framework/crawler-ui/20_crawler
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh -e
-#
-# 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.#
-# IF YOU ARE READING THIS, YOU ARE VIOLATING YOUR LICENSE AGREEMENT.
-#
-# $Id$
-
-# Register the pull agent
-su -p -s /bin/sh tomcat55 -c "/usr/lib/metacarta/agents-registeragent com.metacarta.crawler.system.CrawlerAgent"
-
-# I initially wanted to unregister all connectors and authorities prior to
-# reregistration; however, the unregistration process actually requires the
-# connector (in order to call the uninstall method), so that would not
-# work in any case.  I will add a synchronization method instead, to be called
-# at the end of the agents registration process.
-
diff --git a/framework/crawler-ui/30_analyze-reindex b/framework/crawler-ui/30_analyze-reindex
deleted file mode 100644
index e780b3f..0000000
--- a/framework/crawler-ui/30_analyze-reindex
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh -e
-#
-# 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.#
-# IF YOU ARE READING THIS, YOU ARE VIOLATING YOUR LICENSE AGREEMENT.
-#
-# $Id$
-
-# Weekly postgresql maintenance for crawler
-
-# Now, do the postgresql work
-export PGPASSWORD="local_pg_passwd"
-psql -U metacarta -c "REINDEX DATABASE metacarta;" metacarta
-
-
diff --git a/framework/crawler-ui/99_crawler b/framework/crawler-ui/99_crawler
deleted file mode 100755
index dcf870b..0000000
--- a/framework/crawler-ui/99_crawler
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -e
-#
-# 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.#
-# IF YOU ARE READING THIS, YOU ARE VIOLATING YOUR LICENSE AGREEMENT.
-#
-# $Id$
-
-# Synchronize all the connectors and authorities
-su -p -s /bin/sh tomcat55 -c "/usr/lib/metacarta/crawler-synchronizeconnectors"
-su -p -s /bin/sh tomcat55 -c "/usr/lib/metacarta/crawler-synchronizeauthorities"
-
-# Signal that the upgrade is complete
-touch /var/run/metacarta/agents-upgrade-complete
diff --git a/framework/crawler-ui/pom.xml b/framework/crawler-ui/pom.xml
deleted file mode 100644
index 0a4836a..0000000
--- a/framework/crawler-ui/pom.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-crawler-ui</artifactId>
-  <name>ManifoldCF - Framework - Crawler UI</name>
-  <packaging>war</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.6.0</version>
-
-        <configuration>
-          <mainClass>org.apache.manifoldcf.less.MCFLessCompiler</mainClass>
-          <arguments>
-            <argument>${project.basedir}/src/main/less/style.less</argument>
-            <argument>${project.build.directory}/${project.build.finalName}/css/style.css</argument>
-            <argument>true</argument>
-          </arguments>
-        </configuration>
-        <executions>
-            <execution>
-              <id>compile-less</id>
-              <phase>prepare-package</phase>
-              <goals>
-                  <goal>java</goal>
-              </goals>
-            </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-less-compiler</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-ui-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- web dependencies -->
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <!-- runtime dependencies -->
-    <dependency>
-      <groupId>jstl</groupId>
-      <artifactId>jstl</artifactId>
-      <version>${jstl.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>serializer</artifactId>
-      <version>${xalan.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xml-apis</groupId>
-      <artifactId>xml-apis</artifactId>
-      <version>${xml-apis.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- database dependencies -->
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mariadb.jdbc</groupId>
-      <artifactId>mariadb-java-client</artifactId>
-      <version>${mariadb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- JDBC connector dependencies -->
-    <dependency>
-      <groupId>net.sourceforge.jtds</groupId>
-      <artifactId>jtds</artifactId>
-      <version>${jtds.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-  </dependencies>
-
-</project>
diff --git a/framework/crawler-ui/reset-crawler b/framework/crawler-ui/reset-crawler
deleted file mode 100755
index 7a39a40..0000000
--- a/framework/crawler-ui/reset-crawler
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/sh -e
-#
-# 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.#
-# IF YOU ARE READING THIS, YOU ARE VIOLATING YOUR LICENSE AGREEMENT.
-#
-# $Id$
-
-# Check superuser status
-if [ `id -u` != "0" ]; then
-    echo "$0: This script must be run as root"
-    exit 1
-fi
-
-if ( /usr/bin/dotlockfile -l -r 0 /var/run/metacarta/reset-crawler-in-progress.lock ) ; then
-	trap "/usr/bin/dotlockfile -u /var/run/metacarta/reset-crawler-in-progress.lock" EXIT
-	# This will also block postgres-maintenance from running
-	# Don't allow script to act if daemon checker in progress
-	if [ "/usr/bin/dotlockfile -c /var/run/metacarta/check_agentsrunning_in_progress.lock" ] ; then
-		# Don't allow script to actually act if authority check in progress
-		if [ "/usr/bin/dotlockfile -c /var/run/metacarta/check_authorities_in_progress.lock" ] ; then
-			# Don't allow script to actually act if postgres maintenance underway
-			if [ "/usr/bin/dotlockfile -c /var/run/metacarta/postgres-maintenance-in-progress.lock" ] ; then
-				# Shut down crawler
-				/etc/init.d/metacarta-agents stop || true
-				# Shut down tomcat5.5
-				/etc/init.d/tomcat5.5 stop || true
-				# Clean the locks
-				su -p -s /bin/sh tomcat55 -c "/usr/lib/metacarta/core-lockclean"
-				# Restart tomcat
-				/etc/init.d/tomcat5.5 start
-				# Restart crawler
-				/etc/init.d/metacarta-agents start
-				echo "$0: Crawler reset successfully completed."
-			else
-				echo "$0: Postgresql maintenance in progress; please try later"
-			fi
-		else
-			echo "$0: Authority check in progress; please try later"
-		fi
-	else
-		echo "$0: Agents running check in progress; please try later"
-	fi
-else
-        echo "$0: reset-crawler already in progress - skipping"
-fi
-
diff --git a/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java b/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java
deleted file mode 100644
index 8d66e28..0000000
--- a/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawlerui;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.Logging;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically calls the cleanup method in all connected repository connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class IdleCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Constructor.
-  */
-  public IdleCleanupThread()
-    throws ManifoldCFException
-  {
-    super();
-    setName("Idle cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.root.debug("Start up idle cleanup thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
-      IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Do the cleanup
-          repositoryConnectorPool.pollAllConnectors();
-          notificationConnectorPool.pollAllConnectors();
-          outputConnectorPool.pollAllConnectors();
-          transformationConnectorPool.pollAllConnectors();
-          authorityConnectorPool.pollAllConnectors();
-          mappingConnectorPool.pollAllConnectors();
-          
-          // Poll all basic services
-          ManifoldCF.pollAll(threadContext);
-          
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.root.error("Idle cleanup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.root.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("Crawler UI ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.root.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("Crawler UI could not start - shutting down");
-      Logging.root.fatal("IdleCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/ServletListener.java b/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/ServletListener.java
deleted file mode 100644
index 92a2e86..0000000
--- a/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/ServletListener.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawlerui;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import javax.servlet.*;
-
-/** This class furnishes a servlet shutdown hook for ManifoldCF.  It should be referenced in the
-* web.xml file for the application in order to do the right thing, however.
-*/
-public class ServletListener implements ServletContextListener
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected IdleCleanupThread idleCleanupThread = null;
-
-  public void contextInitialized(ServletContextEvent sce)
-  {
-    try
-    {
-      IThreadContext threadContext = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(threadContext);
-      idleCleanupThread = new IdleCleanupThread();
-      idleCleanupThread.start();
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new RuntimeException("Could not initialize servlet; "+e.getMessage(),e);
-    }
-  }
-  
-  public void contextDestroyed(ServletContextEvent sce)
-  {
-    try
-    {
-      while (true)
-      {
-        if (idleCleanupThread == null)
-          break;
-        idleCleanupThread.interrupt();
-        if (!idleCleanupThread.isAlive())
-          idleCleanupThread = null;
-      }
-    }
-    finally
-    {
-      ManifoldCF.cleanUpEnvironment(ThreadContextFactory.make());
-    }
-  }
-
-}
diff --git a/framework/crawler-ui/src/main/less/alerts.less b/framework/crawler-ui/src/main/less/alerts.less
deleted file mode 100644
index 052ef0d..0000000
--- a/framework/crawler-ui/src/main/less/alerts.less
+++ /dev/null
@@ -1,61 +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.
- */
-
-/*
- * Component: alert
- * ----------------
- */
-
-.alert {
-  .border-radius(3px);
-  h4 {
-    font-weight: 600;
-  }
-  .icon {   
-    margin-right: 10px;    
-  }
-  .close {
-    color: #000;
-    .opacity(.2);
-    &:hover {
-      .opacity(.5);
-    }
-  }
-  a {
-    color: #fff;
-    text-decoration: underline;
-  }
-}
-
-//Alert Variants
-.alert-success {
-  &:extend(.bg-green);
-  border-color: darken(@green, 5%);
-}
-.alert-danger,
-.alert-error {
-  &:extend(.bg-red);
-  border-color: darken(@red, 5%);
-}
-.alert-warning {
-  &:extend(.bg-yellow);
-  border-color: darken(@yellow, 5%);
-}
-.alert-info {
-  &:extend(.bg-aqua);
-  border-color: darken(@aqua, 5%);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/.csscomb.json b/framework/crawler-ui/src/main/less/bootstrap-less/.csscomb.json
deleted file mode 100644
index 40695a4..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/.csscomb.json
+++ /dev/null
@@ -1,304 +0,0 @@
-{
-  "always-semicolon": true,
-  "block-indent": 2,
-  "color-case": "lower",
-  "color-shorthand": true,
-  "element-case": "lower",
-  "eof-newline": true,
-  "leading-zero": false,
-  "remove-empty-rulesets": true,
-  "space-after-colon": 1,
-  "space-after-combinator": 1,
-  "space-before-selector-delimiter": 0,
-  "space-between-declarations": "\n",
-  "space-after-opening-brace": "\n",
-  "space-before-closing-brace": "\n",
-  "space-before-colon": 0,
-  "space-before-combinator": 1,
-  "space-before-opening-brace": 1,
-  "strip-spaces": true,
-  "unitless-zero": true,
-  "vendor-prefix-align": true,
-  "sort-order": [
-    [
-      "position",
-      "top",
-      "right",
-      "bottom",
-      "left",
-      "z-index",
-      "display",
-      "float",
-      "width",
-      "min-width",
-      "max-width",
-      "height",
-      "min-height",
-      "max-height",
-      "-webkit-box-sizing",
-      "-moz-box-sizing",
-      "box-sizing",
-      "-webkit-appearance",
-      "padding",
-      "padding-top",
-      "padding-right",
-      "padding-bottom",
-      "padding-left",
-      "margin",
-      "margin-top",
-      "margin-right",
-      "margin-bottom",
-      "margin-left",
-      "overflow",
-      "overflow-x",
-      "overflow-y",
-      "-webkit-overflow-scrolling",
-      "-ms-overflow-x",
-      "-ms-overflow-y",
-      "-ms-overflow-style",
-      "clip",
-      "clear",
-      "font",
-      "font-family",
-      "font-size",
-      "font-style",
-      "font-weight",
-      "font-variant",
-      "font-size-adjust",
-      "font-stretch",
-      "font-effect",
-      "font-emphasize",
-      "font-emphasize-position",
-      "font-emphasize-style",
-      "font-smooth",
-      "-webkit-hyphens",
-      "-moz-hyphens",
-      "hyphens",
-      "line-height",
-      "color",
-      "text-align",
-      "-webkit-text-align-last",
-      "-moz-text-align-last",
-      "-ms-text-align-last",
-      "text-align-last",
-      "text-emphasis",
-      "text-emphasis-color",
-      "text-emphasis-style",
-      "text-emphasis-position",
-      "text-decoration",
-      "text-indent",
-      "text-justify",
-      "text-outline",
-      "-ms-text-overflow",
-      "text-overflow",
-      "text-overflow-ellipsis",
-      "text-overflow-mode",
-      "text-shadow",
-      "text-transform",
-      "text-wrap",
-      "-webkit-text-size-adjust",
-      "-ms-text-size-adjust",
-      "letter-spacing",
-      "-ms-word-break",
-      "word-break",
-      "word-spacing",
-      "-ms-word-wrap",
-      "word-wrap",
-      "-moz-tab-size",
-      "-o-tab-size",
-      "tab-size",
-      "white-space",
-      "vertical-align",
-      "list-style",
-      "list-style-position",
-      "list-style-type",
-      "list-style-image",
-      "pointer-events",
-      "-ms-touch-action",
-      "touch-action",
-      "cursor",
-      "visibility",
-      "zoom",
-      "flex-direction",
-      "flex-order",
-      "flex-pack",
-      "flex-align",
-      "table-layout",
-      "empty-cells",
-      "caption-side",
-      "border-spacing",
-      "border-collapse",
-      "content",
-      "quotes",
-      "counter-reset",
-      "counter-increment",
-      "resize",
-      "-webkit-user-select",
-      "-moz-user-select",
-      "-ms-user-select",
-      "-o-user-select",
-      "user-select",
-      "nav-index",
-      "nav-up",
-      "nav-right",
-      "nav-down",
-      "nav-left",
-      "background",
-      "background-color",
-      "background-image",
-      "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient",
-      "filter:progid:DXImageTransform.Microsoft.gradient",
-      "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
-      "filter",
-      "background-repeat",
-      "background-attachment",
-      "background-position",
-      "background-position-x",
-      "background-position-y",
-      "-webkit-background-clip",
-      "-moz-background-clip",
-      "background-clip",
-      "background-origin",
-      "-webkit-background-size",
-      "-moz-background-size",
-      "-o-background-size",
-      "background-size",
-      "border",
-      "border-color",
-      "border-style",
-      "border-width",
-      "border-top",
-      "border-top-color",
-      "border-top-style",
-      "border-top-width",
-      "border-right",
-      "border-right-color",
-      "border-right-style",
-      "border-right-width",
-      "border-bottom",
-      "border-bottom-color",
-      "border-bottom-style",
-      "border-bottom-width",
-      "border-left",
-      "border-left-color",
-      "border-left-style",
-      "border-left-width",
-      "border-radius",
-      "border-top-left-radius",
-      "border-top-right-radius",
-      "border-bottom-right-radius",
-      "border-bottom-left-radius",
-      "-webkit-border-image",
-      "-moz-border-image",
-      "-o-border-image",
-      "border-image",
-      "-webkit-border-image-source",
-      "-moz-border-image-source",
-      "-o-border-image-source",
-      "border-image-source",
-      "-webkit-border-image-slice",
-      "-moz-border-image-slice",
-      "-o-border-image-slice",
-      "border-image-slice",
-      "-webkit-border-image-width",
-      "-moz-border-image-width",
-      "-o-border-image-width",
-      "border-image-width",
-      "-webkit-border-image-outset",
-      "-moz-border-image-outset",
-      "-o-border-image-outset",
-      "border-image-outset",
-      "-webkit-border-image-repeat",
-      "-moz-border-image-repeat",
-      "-o-border-image-repeat",
-      "border-image-repeat",
-      "outline",
-      "outline-width",
-      "outline-style",
-      "outline-color",
-      "outline-offset",
-      "-webkit-box-shadow",
-      "-moz-box-shadow",
-      "box-shadow",
-      "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
-      "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha",
-      "opacity",
-      "-ms-interpolation-mode",
-      "-webkit-transition",
-      "-moz-transition",
-      "-ms-transition",
-      "-o-transition",
-      "transition",
-      "-webkit-transition-delay",
-      "-moz-transition-delay",
-      "-ms-transition-delay",
-      "-o-transition-delay",
-      "transition-delay",
-      "-webkit-transition-timing-function",
-      "-moz-transition-timing-function",
-      "-ms-transition-timing-function",
-      "-o-transition-timing-function",
-      "transition-timing-function",
-      "-webkit-transition-duration",
-      "-moz-transition-duration",
-      "-ms-transition-duration",
-      "-o-transition-duration",
-      "transition-duration",
-      "-webkit-transition-property",
-      "-moz-transition-property",
-      "-ms-transition-property",
-      "-o-transition-property",
-      "transition-property",
-      "-webkit-transform",
-      "-moz-transform",
-      "-ms-transform",
-      "-o-transform",
-      "transform",
-      "-webkit-transform-origin",
-      "-moz-transform-origin",
-      "-ms-transform-origin",
-      "-o-transform-origin",
-      "transform-origin",
-      "-webkit-animation",
-      "-moz-animation",
-      "-ms-animation",
-      "-o-animation",
-      "animation",
-      "-webkit-animation-name",
-      "-moz-animation-name",
-      "-ms-animation-name",
-      "-o-animation-name",
-      "animation-name",
-      "-webkit-animation-duration",
-      "-moz-animation-duration",
-      "-ms-animation-duration",
-      "-o-animation-duration",
-      "animation-duration",
-      "-webkit-animation-play-state",
-      "-moz-animation-play-state",
-      "-ms-animation-play-state",
-      "-o-animation-play-state",
-      "animation-play-state",
-      "-webkit-animation-timing-function",
-      "-moz-animation-timing-function",
-      "-ms-animation-timing-function",
-      "-o-animation-timing-function",
-      "animation-timing-function",
-      "-webkit-animation-delay",
-      "-moz-animation-delay",
-      "-ms-animation-delay",
-      "-o-animation-delay",
-      "animation-delay",
-      "-webkit-animation-iteration-count",
-      "-moz-animation-iteration-count",
-      "-ms-animation-iteration-count",
-      "-o-animation-iteration-count",
-      "animation-iteration-count",
-      "-webkit-animation-direction",
-      "-moz-animation-direction",
-      "-ms-animation-direction",
-      "-o-animation-direction",
-      "animation-direction"
-    ]
-  ]
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/.csslintrc b/framework/crawler-ui/src/main/less/bootstrap-less/.csslintrc
deleted file mode 100644
index 005b862..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/.csslintrc
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "adjoining-classes": false,
-  "box-sizing": false,
-  "box-model": false,
-  "compatible-vendor-prefixes": false,
-  "floats": false,
-  "font-sizes": false,
-  "gradients": false,
-  "important": false,
-  "known-properties": false,
-  "outline-none": false,
-  "qualified-headings": false,
-  "regex-selectors": false,
-  "shorthand": false,
-  "text-indent": false,
-  "unique-headings": false,
-  "universal-selector": false,
-  "unqualified-attributes": false
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/alerts.less b/framework/crawler-ui/src/main/less/bootstrap-less/alerts.less
deleted file mode 100644
index affed36..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/alerts.less
+++ /dev/null
@@ -1,96 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Alerts
-// --------------------------------------------------
-
-
-// Base styles
-// -------------------------
-
-.alert {
-  padding: @alert-padding;
-  margin-bottom: @line-height-computed;
-  border: 1px solid transparent;
-  border-radius: @alert-border-radius;
-
-  // Headings for larger alerts
-  h4 {
-    margin-top: 0;
-    // Specified for the h4 to prevent conflicts of changing @headings-color
-    color: inherit;
-  }
-
-  // Provide class for links that match alerts
-  .alert-link {
-    font-weight: @alert-link-font-weight;
-  }
-
-  // Improve alignment and spacing of inner content
-  > p,
-  > ul {
-    margin-bottom: 0;
-  }
-
-  > p + p {
-    margin-top: 5px;
-  }
-}
-
-// Dismissible alerts
-//
-// Expand the right padding and account for the close button's positioning.
-
-.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
-.alert-dismissible {
-  padding-right: (@alert-padding + 20);
-
-  // Adjust close link position
-  .close {
-    position: relative;
-    top: -2px;
-    right: -21px;
-    color: inherit;
-  }
-}
-
-// Alternate styles
-//
-// Generate contextual modifier classes for colorizing the alert.
-
-.alert-success {
-  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
-}
-
-.alert-info {
-  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
-}
-
-.alert-warning {
-  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
-}
-
-.alert-danger {
-  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/badges.less b/framework/crawler-ui/src/main/less/bootstrap-less/badges.less
deleted file mode 100644
index 9a64e10..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/badges.less
+++ /dev/null
@@ -1,89 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Badges
-// --------------------------------------------------
-
-
-// Base class
-.badge {
-  display: inline-block;
-  min-width: 10px;
-  padding: 3px 7px;
-  font-size: @font-size-small;
-  font-weight: @badge-font-weight;
-  color: @badge-color;
-  line-height: @badge-line-height;
-  vertical-align: middle;
-  white-space: nowrap;
-  text-align: center;
-  background-color: @badge-bg;
-  border-radius: @badge-border-radius;
-
-  // Empty badges collapse automatically (not available in IE8)
-  &:empty {
-    display: none;
-  }
-
-  // Quick fix for badges in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
-
-  .btn-xs &,
-  .btn-group-xs > .btn & {
-    top: 0;
-    padding: 1px 5px;
-  }
-
-  // Hover state, but only for links
-  a& {
-    &:hover,
-    &:focus {
-      color: @badge-link-hover-color;
-      text-decoration: none;
-      cursor: pointer;
-    }
-  }
-
-  // Account for badges in navs
-  .list-group-item.active > &,
-  .nav-pills > .active > a > & {
-    color: @badge-active-color;
-    background-color: @badge-active-bg;
-  }
-
-  .list-group-item > & {
-    float: right;
-  }
-
-  .list-group-item > & + & {
-    margin-right: 5px;
-  }
-
-  .nav-pills > li > a > & {
-    margin-left: 3px;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/bootstrap.less b/framework/crawler-ui/src/main/less/bootstrap-less/bootstrap.less
deleted file mode 100644
index b301caa..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/bootstrap.less
+++ /dev/null
@@ -1,73 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Core variables and mixins
-@import "variables.less";
-@import "mixins.less";
-
-// Reset and dependencies
-@import "normalize.less";
-@import "print.less";
-@import "glyphicons.less";
-
-// Core CSS
-@import "scaffolding.less";
-@import "type.less";
-@import "code.less";
-@import "grid.less";
-@import "tables.less";
-@import "forms.less";
-@import "buttons.less";
-
-// Components
-@import "component-animations.less";
-@import "dropdowns.less";
-@import "button-groups.less";
-@import "input-groups.less";
-@import "navs.less";
-@import "navbar.less";
-@import "breadcrumbs.less";
-@import "pagination.less";
-@import "pager.less";
-@import "labels.less";
-@import "badges.less";
-@import "jumbotron.less";
-@import "thumbnails.less";
-@import "alerts.less";
-@import "progress-bars.less";
-@import "media.less";
-@import "list-group.less";
-@import "panels.less";
-@import "responsive-embed.less";
-@import "wells.less";
-@import "close.less";
-
-// Components w/ JavaScript
-@import "modals.less";
-@import "tooltip.less";
-@import "popovers.less";
-@import "carousel.less";
-
-// Utility classes
-@import "utilities.less";
-@import "responsive-utilities.less";
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/breadcrumbs.less b/framework/crawler-ui/src/main/less/bootstrap-less/breadcrumbs.less
deleted file mode 100644
index 86c99ac..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/breadcrumbs.less
+++ /dev/null
@@ -1,49 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Breadcrumbs
-// --------------------------------------------------
-
-
-.breadcrumb {
-  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;
-  margin-bottom: @line-height-computed;
-  list-style: none;
-  background-color: @breadcrumb-bg;
-  border-radius: @border-radius-base;
-
-  > li {
-    display: inline-block;
-
-    + li:before {
-      content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
-      padding: 0 5px;
-      color: @breadcrumb-color;
-    }
-  }
-
-  > .active {
-    color: @breadcrumb-active-color;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/button-groups.less b/framework/crawler-ui/src/main/less/bootstrap-less/button-groups.less
deleted file mode 100644
index f186ac8..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/button-groups.less
+++ /dev/null
@@ -1,267 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Button groups
-// --------------------------------------------------
-
-// Make the div behave like a button
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle; // match .btn alignment given font-size hack above
-  > .btn {
-    position: relative;
-    float: left;
-    // Bring the "active" button to the front
-    &:hover,
-    &:focus,
-    &:active,
-    &.active {
-      z-index: 2;
-    }
-  }
-}
-
-// Prevent double borders when buttons are next to each other
-.btn-group {
-  .btn + .btn,
-  .btn + .btn-group,
-  .btn-group + .btn,
-  .btn-group + .btn-group {
-    margin-left: -1px;
-  }
-}
-
-// Optional: Group multiple button groups together for a toolbar
-.btn-toolbar {
-  margin-left: -5px; // Offset the first child's margin
-  &:extend(.clearfix all);
-
-  .btn,
-  .btn-group,
-  .input-group {
-    float: left;
-  }
-  > .btn,
-  > .btn-group,
-  > .input-group {
-    margin-left: 5px;
-  }
-}
-
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-
-// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  &:not(:last-child):not(.dropdown-toggle) {
-    .border-right-radius(0);
-  }
-}
-// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  .border-left-radius(0);
-}
-
-// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
-.btn-group > .btn-group {
-  float: left;
-}
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group > .btn-group:first-child:not(:last-child) {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    .border-right-radius(0);
-  }
-}
-.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  .border-left-radius(0);
-}
-
-// On active and open, don't show outline
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-
-// Sizing
-//
-// Remix the default button sizing classes into new ones for easier manipulation.
-
-.btn-group-xs > .btn { &:extend(.btn-xs); }
-.btn-group-sm > .btn { &:extend(.btn-sm); }
-.btn-group-lg > .btn { &:extend(.btn-lg); }
-
-
-// Split button dropdowns
-// ----------------------
-
-// Give the line between buttons some depth
-.btn-group > .btn + .dropdown-toggle {
-  padding-left: 8px;
-  padding-right: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
-  padding-left: 12px;
-  padding-right: 12px;
-}
-
-// The clickable button for toggling the menu
-// Remove the gradient and set the same inset shadow as the :active state
-.btn-group.open .dropdown-toggle {
-  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-
-  // Show no shadow for `.btn-link` since it has no other button styles.
-  &.btn-link {
-    .box-shadow(none);
-  }
-}
-
-
-// Reposition the caret
-.btn .caret {
-  margin-left: 0;
-}
-// Carets in other button sizes
-.btn-lg .caret {
-  border-width: @caret-width-large @caret-width-large 0;
-  border-bottom-width: 0;
-}
-// Upside down carets for .dropup
-.dropup .btn-lg .caret {
-  border-width: 0 @caret-width-large @caret-width-large;
-}
-
-
-// Vertical button groups
-// ----------------------
-
-.btn-group-vertical {
-  > .btn,
-  > .btn-group,
-  > .btn-group > .btn {
-    display: block;
-    float: none;
-    width: 100%;
-    max-width: 100%;
-  }
-
-  // Clear floats so dropdown menus can be properly placed
-  > .btn-group {
-    &:extend(.clearfix all);
-    > .btn {
-      float: none;
-    }
-  }
-
-  > .btn + .btn,
-  > .btn + .btn-group,
-  > .btn-group + .btn,
-  > .btn-group + .btn-group {
-    margin-top: -1px;
-    margin-left: 0;
-  }
-}
-
-.btn-group-vertical > .btn {
-  &:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-  &:first-child:not(:last-child) {
-    .border-top-radius(@btn-border-radius-base);
-    .border-bottom-radius(0);
-  }
-  &:last-child:not(:first-child) {
-    .border-top-radius(0);
-    .border-bottom-radius(@btn-border-radius-base);
-  }
-}
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn-group:first-child:not(:last-child) {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    .border-bottom-radius(0);
-  }
-}
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  .border-top-radius(0);
-}
-
-
-// Justified button groups
-// ----------------------
-
-.btn-group-justified {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-  border-collapse: separate;
-  > .btn,
-  > .btn-group {
-    float: none;
-    display: table-cell;
-    width: 1%;
-  }
-  > .btn-group .btn {
-    width: 100%;
-  }
-
-  > .btn-group .dropdown-menu {
-    left: auto;
-  }
-}
-
-
-// Checkbox and radio options
-//
-// In order to support the browser's form validation feedback, powered by the
-// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
-// `display: none;` or `visibility: hidden;` as that also hides the popover.
-// Simply visually hiding the inputs via `opacity` would leave them clickable in
-// certain cases which is prevented by using `clip` and `pointer-events`.
-// This way, we ensure a DOM element is visible to position the popover from.
-//
-// See https://github.com/twbs/bootstrap/pull/12794 and
-// https://github.com/twbs/bootstrap/pull/14559 for more information.
-
-[data-toggle="buttons"] {
-  > .btn,
-  > .btn-group > .btn {
-    input[type="radio"],
-    input[type="checkbox"] {
-      position: absolute;
-      clip: rect(0,0,0,0);
-      pointer-events: none;
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/buttons.less b/framework/crawler-ui/src/main/less/bootstrap-less/buttons.less
deleted file mode 100644
index b9d3be9..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/buttons.less
+++ /dev/null
@@ -1,189 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Buttons
-// --------------------------------------------------
-
-
-// Base styles
-// --------------------------------------------------
-
-.btn {
-  display: inline-block;
-  margin-bottom: 0; // For input.btn
-  font-weight: @btn-font-weight;
-  text-align: center;
-  vertical-align: middle;
-  touch-action: manipulation;
-  cursor: pointer;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid transparent;
-  white-space: nowrap;
-  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);
-  .user-select(none);
-
-  &,
-  &:active,
-  &.active {
-    &:focus,
-    &.focus {
-      .tab-focus();
-    }
-  }
-
-  &:hover,
-  &:focus,
-  &.focus {
-    color: @btn-default-color;
-    text-decoration: none;
-  }
-
-  &:active,
-  &.active {
-    outline: 0;
-    background-image: none;
-    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-  }
-
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    cursor: @cursor-disabled;
-    .opacity(.65);
-    .box-shadow(none);
-  }
-
-  a& {
-    &.disabled,
-    fieldset[disabled] & {
-      pointer-events: none; // Future-proof disabling of clicks on `<a>` elements
-    }
-  }
-}
-
-
-// Alternate buttons
-// --------------------------------------------------
-
-.btn-default {
-  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
-}
-.btn-primary {
-  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
-}
-// Success appears as green
-.btn-success {
-  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);
-}
-// Info appears as blue-green
-.btn-info {
-  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);
-}
-// Warning appears as orange
-.btn-warning {
-  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);
-}
-// Danger and error appear as red
-.btn-danger {
-  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
-}
-
-
-// Link buttons
-// -------------------------
-
-// Make a button look and behave like a link
-.btn-link {
-  color: @link-color;
-  font-weight: normal;
-  border-radius: 0;
-
-  &,
-  &:active,
-  &.active,
-  &[disabled],
-  fieldset[disabled] & {
-    background-color: transparent;
-    .box-shadow(none);
-  }
-  &,
-  &:hover,
-  &:focus,
-  &:active {
-    border-color: transparent;
-  }
-  &:hover,
-  &:focus {
-    color: @link-hover-color;
-    text-decoration: @link-hover-decoration;
-    background-color: transparent;
-  }
-  &[disabled],
-  fieldset[disabled] & {
-    &:hover,
-    &:focus {
-      color: @btn-link-disabled-color;
-      text-decoration: none;
-    }
-  }
-}
-
-
-// Button Sizes
-// --------------------------------------------------
-
-.btn-lg {
-  // line-height: ensure even-numbered height of button next to large input
-  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);
-}
-.btn-sm {
-  // line-height: ensure proper height of button next to small input
-  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);
-}
-.btn-xs {
-  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);
-}
-
-
-// Block button
-// --------------------------------------------------
-
-.btn-block {
-  display: block;
-  width: 100%;
-}
-
-// Vertically space out multiple block buttons
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-// Specificity overrides
-input[type="submit"],
-input[type="reset"],
-input[type="button"] {
-  &.btn-block {
-    width: 100%;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/carousel.less b/framework/crawler-ui/src/main/less/bootstrap-less/carousel.less
deleted file mode 100644
index 086f68f..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/carousel.less
+++ /dev/null
@@ -1,293 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Carousel
-// --------------------------------------------------
-
-
-// Wrapper for the slide container and indicators
-.carousel {
-  position: relative;
-}
-
-.carousel-inner {
-  position: relative;
-  overflow: hidden;
-  width: 100%;
-
-  > .item {
-    display: none;
-    position: relative;
-    .transition(.6s ease-in-out left);
-
-    // Account for jankitude on images
-    > img,
-    > a > img {
-      &:extend(.img-responsive);
-      line-height: 1;
-    }
-
-    // WebKit CSS3 transforms for supported devices
-    @media all and (transform-3d), (-webkit-transform-3d) {
-      .transition-transform(~'0.6s ease-in-out');
-      .backface-visibility(~'hidden');
-      .perspective(1000px);
-
-      &.next,
-      &.active.right {
-        .translate3d(100%, 0, 0);
-        left: 0;
-      }
-      &.prev,
-      &.active.left {
-        .translate3d(-100%, 0, 0);
-        left: 0;
-      }
-      &.next.left,
-      &.prev.right,
-      &.active {
-        .translate3d(0, 0, 0);
-        left: 0;
-      }
-    }
-  }
-
-  > .active,
-  > .next,
-  > .prev {
-    display: block;
-  }
-
-  > .active {
-    left: 0;
-  }
-
-  > .next,
-  > .prev {
-    position: absolute;
-    top: 0;
-    width: 100%;
-  }
-
-  > .next {
-    left: 100%;
-  }
-  > .prev {
-    left: -100%;
-  }
-  > .next.left,
-  > .prev.right {
-    left: 0;
-  }
-
-  > .active.left {
-    left: -100%;
-  }
-  > .active.right {
-    left: 100%;
-  }
-
-}
-
-// Left/right controls for nav
-// ---------------------------
-
-.carousel-control {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  width: @carousel-control-width;
-  .opacity(@carousel-control-opacity);
-  font-size: @carousel-control-font-size;
-  color: @carousel-control-color;
-  text-align: center;
-  text-shadow: @carousel-text-shadow;
-  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
-  // We can't have this transition here because WebKit cancels the carousel
-  // animation if you trip this while in the middle of another animation.
-
-  // Set gradients for backgrounds
-  &.left {
-    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));
-  }
-  &.right {
-    left: auto;
-    right: 0;
-    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));
-  }
-
-  // Hover/focus state
-  &:hover,
-  &:focus {
-    outline: 0;
-    color: @carousel-control-color;
-    text-decoration: none;
-    .opacity(.9);
-  }
-
-  // Toggles
-  .icon-prev,
-  .icon-next,
-  .glyphicon-chevron-left,
-  .glyphicon-chevron-right {
-    position: absolute;
-    top: 50%;
-    margin-top: -10px;
-    z-index: 5;
-    display: inline-block;
-  }
-  .icon-prev,
-  .glyphicon-chevron-left {
-    left: 50%;
-    margin-left: -10px;
-  }
-  .icon-next,
-  .glyphicon-chevron-right {
-    right: 50%;
-    margin-right: -10px;
-  }
-  .icon-prev,
-  .icon-next {
-    width:  20px;
-    height: 20px;
-    line-height: 1;
-    font-family: serif;
-  }
-
-
-  .icon-prev {
-    &:before {
-      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
-    }
-  }
-  .icon-next {
-    &:before {
-      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
-    }
-  }
-}
-
-// Optional indicator pips
-//
-// Add an unordered list with the following class and add a list item for each
-// slide your carousel holds.
-
-.carousel-indicators {
-  position: absolute;
-  bottom: 10px;
-  left: 50%;
-  z-index: 15;
-  width: 60%;
-  margin-left: -30%;
-  padding-left: 0;
-  list-style: none;
-  text-align: center;
-
-  li {
-    display: inline-block;
-    width:  10px;
-    height: 10px;
-    margin: 1px;
-    text-indent: -999px;
-    border: 1px solid @carousel-indicator-border-color;
-    border-radius: 10px;
-    cursor: pointer;
-
-    // IE8-9 hack for event handling
-    //
-    // Internet Explorer 8-9 does not support clicks on elements without a set
-    // `background-color`. We cannot use `filter` since that's not viewed as a
-    // background color by the browser. Thus, a hack is needed.
-    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
-    //
-    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
-    // set alpha transparency for the best results possible.
-    background-color: #000 \9; // IE8
-    background-color: rgba(0,0,0,0); // IE9
-  }
-  .active {
-    margin: 0;
-    width:  12px;
-    height: 12px;
-    background-color: @carousel-indicator-active-bg;
-  }
-}
-
-// Optional captions
-// -----------------------------
-// Hidden by default for smaller viewports
-.carousel-caption {
-  position: absolute;
-  left: 15%;
-  right: 15%;
-  bottom: 20px;
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: @carousel-caption-color;
-  text-align: center;
-  text-shadow: @carousel-text-shadow;
-  & .btn {
-    text-shadow: none; // No shadow for button elements in carousel-caption
-  }
-}
-
-
-// Scale up controls for tablets and up
-@media screen and (min-width: @screen-sm-min) {
-
-  // Scale up the controls a smidge
-  .carousel-control {
-    .glyphicon-chevron-left,
-    .glyphicon-chevron-right,
-    .icon-prev,
-    .icon-next {
-      width: (@carousel-control-font-size * 1.5);
-      height: (@carousel-control-font-size * 1.5);
-      margin-top: (@carousel-control-font-size / -2);
-      font-size: (@carousel-control-font-size * 1.5);
-    }
-    .glyphicon-chevron-left,
-    .icon-prev {
-      margin-left: (@carousel-control-font-size / -2);
-    }
-    .glyphicon-chevron-right,
-    .icon-next {
-      margin-right: (@carousel-control-font-size / -2);
-    }
-  }
-
-  // Show and left align the captions
-  .carousel-caption {
-    left: 20%;
-    right: 20%;
-    padding-bottom: 30px;
-  }
-
-  // Move up the indicators
-  .carousel-indicators {
-    bottom: 20px;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/close.less b/framework/crawler-ui/src/main/less/bootstrap-less/close.less
deleted file mode 100644
index 6de9b16..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/close.less
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Close icons
-// --------------------------------------------------
-
-
-.close {
-  float: right;
-  font-size: (@font-size-base * 1.5);
-  font-weight: @close-font-weight;
-  line-height: 1;
-  color: @close-color;
-  text-shadow: @close-text-shadow;
-  .opacity(.2);
-
-  &:hover,
-  &:focus {
-    color: @close-color;
-    text-decoration: none;
-    cursor: pointer;
-    .opacity(.5);
-  }
-
-  // Additional properties for button version
-  // iOS requires the button element instead of an anchor tag.
-  // If you want the anchor version, it requires `href="#"`.
-  // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
-  button& {
-    padding: 0;
-    cursor: pointer;
-    background: transparent;
-    border: 0;
-    -webkit-appearance: none;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/code.less b/framework/crawler-ui/src/main/less/bootstrap-less/code.less
deleted file mode 100644
index 8d74cdb..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/code.less
+++ /dev/null
@@ -1,92 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Code (inline and block)
-// --------------------------------------------------
-
-
-// Inline and block code styles
-code,
-kbd,
-pre,
-samp {
-  font-family: @font-family-monospace;
-}
-
-// Inline code
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: @code-color;
-  background-color: @code-bg;
-  border-radius: @border-radius-base;
-}
-
-// User input typically entered via keyboard
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: @kbd-color;
-  background-color: @kbd-bg;
-  border-radius: @border-radius-small;
-  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
-
-  kbd {
-    padding: 0;
-    font-size: 100%;
-    font-weight: bold;
-    box-shadow: none;
-  }
-}
-
-// Blocks of code
-pre {
-  display: block;
-  padding: ((@line-height-computed - 1) / 2);
-  margin: 0 0 (@line-height-computed / 2);
-  font-size: (@font-size-base - 1); // 14px to 13px
-  line-height: @line-height-base;
-  word-break: break-all;
-  word-wrap: break-word;
-  color: @pre-color;
-  background-color: @pre-bg;
-  border: 1px solid @pre-border-color;
-  border-radius: @border-radius-base;
-
-  // Account for some code outputs that place code tags in pre tags
-  code {
-    padding: 0;
-    font-size: inherit;
-    color: inherit;
-    white-space: pre-wrap;
-    background-color: transparent;
-    border-radius: 0;
-  }
-}
-
-// Enable scrollable blocks of code
-.pre-scrollable {
-  max-height: @pre-scrollable-max-height;
-  overflow-y: scroll;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/component-animations.less b/framework/crawler-ui/src/main/less/bootstrap-less/component-animations.less
deleted file mode 100644
index 5aa7b14..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/component-animations.less
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Component animations
-// --------------------------------------------------
-
-// Heads up!
-//
-// We don't use the `.opacity()` mixin here since it causes a bug with text
-// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
-
-.fade {
-  opacity: 0;
-  .transition(opacity .15s linear);
-  &.in {
-    opacity: 1;
-  }
-}
-
-.collapse {
-  display: none;
-
-  &.in      { display: block; }
-  tr&.in    { display: table-row; }
-  tbody&.in { display: table-row-group; }
-}
-
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  .transition-property(~"height, visibility");
-  .transition-duration(.35s);
-  .transition-timing-function(ease);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/dropdowns.less b/framework/crawler-ui/src/main/less/bootstrap-less/dropdowns.less
deleted file mode 100644
index 0b5ba3e..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/dropdowns.less
+++ /dev/null
@@ -1,239 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Dropdown menus
-// --------------------------------------------------
-
-
-// Dropdown arrow/caret
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 2px;
-  vertical-align: middle;
-  border-top:   @caret-width-base dashed;
-  border-top:   @caret-width-base solid ~"\9"; // IE8
-  border-right: @caret-width-base solid transparent;
-  border-left:  @caret-width-base solid transparent;
-}
-
-// The dropdown wrapper (div)
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-// Prevent the focus on the dropdown toggle when closing dropdowns
-.dropdown-toggle:focus {
-  outline: 0;
-}
-
-// The dropdown menu (ul)
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: @zindex-dropdown;
-  display: none; // none by default, but block on "open" of the menu
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0; // override default ul
-  list-style: none;
-  font-size: @font-size-base;
-  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
-  background-color: @dropdown-bg;
-  border: 1px solid @dropdown-fallback-border; // IE8 fallback
-  border: 1px solid @dropdown-border;
-  border-radius: @border-radius-base;
-  .box-shadow(0 6px 12px rgba(0,0,0,.175));
-  background-clip: padding-box;
-
-  // Aligns the dropdown menu to right
-  //
-  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
-  &.pull-right {
-    right: 0;
-    left: auto;
-  }
-
-  // Dividers (basically an hr) within the dropdown
-  .divider {
-    .nav-divider(@dropdown-divider-bg);
-  }
-
-  // Links within the dropdown menu
-  > li > a {
-    display: block;
-    padding: 3px 20px;
-    clear: both;
-    font-weight: normal;
-    line-height: @line-height-base;
-    color: @dropdown-link-color;
-    white-space: nowrap; // prevent links from randomly breaking onto new lines
-  }
-}
-
-// Hover/Focus state
-.dropdown-menu > li > a {
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    color: @dropdown-link-hover-color;
-    background-color: @dropdown-link-hover-bg;
-  }
-}
-
-// Active state
-.dropdown-menu > .active > a {
-  &,
-  &:hover,
-  &:focus {
-    color: @dropdown-link-active-color;
-    text-decoration: none;
-    outline: 0;
-    background-color: @dropdown-link-active-bg;
-  }
-}
-
-// Disabled state
-//
-// Gray out text and ensure the hover/focus state remains gray
-
-.dropdown-menu > .disabled > a {
-  &,
-  &:hover,
-  &:focus {
-    color: @dropdown-link-disabled-color;
-  }
-
-  // Nuke hover/focus effects
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    background-color: transparent;
-    background-image: none; // Remove CSS gradient
-    .reset-filter();
-    cursor: @cursor-disabled;
-  }
-}
-
-// Open state for the dropdown
-.open {
-  // Show the menu
-  > .dropdown-menu {
-    display: block;
-  }
-
-  // Remove the outline when :focus is triggered
-  > a {
-    outline: 0;
-  }
-}
-
-// Menu positioning
-//
-// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
-// menu with the parent.
-.dropdown-menu-right {
-  left: auto; // Reset the default from `.dropdown-menu`
-  right: 0;
-}
-// With v3, we enabled auto-flipping if you have a dropdown within a right
-// aligned nav component. To enable the undoing of that, we provide an override
-// to restore the default dropdown menu alignment.
-//
-// This is only for left-aligning a dropdown menu within a `.navbar-right` or
-// `.pull-right` nav component.
-.dropdown-menu-left {
-  left: 0;
-  right: auto;
-}
-
-// Dropdown section headers
-.dropdown-header {
-  display: block;
-  padding: 3px 20px;
-  font-size: @font-size-small;
-  line-height: @line-height-base;
-  color: @dropdown-header-color;
-  white-space: nowrap; // as with > li > a
-}
-
-// Backdrop to catch body clicks on mobile, etc.
-.dropdown-backdrop {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  top: 0;
-  z-index: (@zindex-dropdown - 10);
-}
-
-// Right aligned dropdowns
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-// Allow for dropdowns to go bottom up (aka, dropup-menu)
-//
-// Just add .dropup after the standard .dropdown class and you're set, bro.
-// TODO: abstract this so that the navbar fixed styles are not placed here?
-
-.dropup,
-.navbar-fixed-bottom .dropdown {
-  // Reverse the caret
-  .caret {
-    border-top: 0;
-    border-bottom: @caret-width-base dashed;
-    border-bottom: @caret-width-base solid ~"\9"; // IE8
-    content: "";
-  }
-  // Different positioning for bottom up menu
-  .dropdown-menu {
-    top: auto;
-    bottom: 100%;
-    margin-bottom: 2px;
-  }
-}
-
-
-// Component alignment
-//
-// Reiterate per navbar.less and the modified component alignment there.
-
-@media (min-width: @grid-float-breakpoint) {
-  .navbar-right {
-    .dropdown-menu {
-      .dropdown-menu-right();
-    }
-    // Necessary for overrides of the default right aligned menu.
-    // Will remove come v4 in all likelihood.
-    .dropdown-menu-left {
-      .dropdown-menu-left();
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/forms.less b/framework/crawler-ui/src/main/less/bootstrap-less/forms.less
deleted file mode 100644
index a86a016..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/forms.less
+++ /dev/null
@@ -1,636 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Forms
-// --------------------------------------------------
-
-
-// Normalize non-controls
-//
-// Restyle and baseline non-control form elements.
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
-  // so we reset that to ensure it behaves more like a standard block element.
-  // See https://github.com/twbs/bootstrap/issues/12359.
-  min-width: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: @line-height-computed;
-  font-size: (@font-size-base * 1.5);
-  line-height: inherit;
-  color: @legend-color;
-  border: 0;
-  border-bottom: 1px solid @legend-border-color;
-}
-
-label {
-  display: inline-block;
-  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
-  margin-bottom: 5px;
-  font-weight: bold;
-}
-
-
-// Normalize form controls
-//
-// While most of our form styles require extra classes, some basic normalization
-// is required to ensure optimum display with or without those classes to better
-// address browser inconsistencies.
-
-// Override content-box in Normalize (* isn't specific enough)
-input[type="search"] {
-  .box-sizing(border-box);
-}
-
-// Position radios and checkboxes better
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9; // IE8-9
-  line-height: normal;
-}
-
-input[type="file"] {
-  display: block;
-}
-
-// Make range inputs behave like textual form controls
-input[type="range"] {
-  display: block;
-  width: 100%;
-}
-
-// Make multiple select elements height not fixed
-select[multiple],
-select[size] {
-  height: auto;
-}
-
-// Focus for file, radio, and checkbox
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  .tab-focus();
-}
-
-// Adjust output element
-output {
-  display: block;
-  padding-top: (@padding-base-vertical + 1);
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @input-color;
-}
-
-
-// Common form controls
-//
-// Shared size and type resets for form controls. Apply `.form-control` to any
-// of the following form controls:
-//
-// select
-// textarea
-// input[type="text"]
-// input[type="password"]
-// input[type="datetime"]
-// input[type="datetime-local"]
-// input[type="date"]
-// input[type="month"]
-// input[type="time"]
-// input[type="week"]
-// input[type="number"]
-// input[type="email"]
-// input[type="url"]
-// input[type="search"]
-// input[type="tel"]
-// input[type="color"]
-
-.form-control {
-  display: block;
-  width: 100%;
-  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
-  padding: @padding-base-vertical @padding-base-horizontal;
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @input-color;
-  background-color: @input-bg;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid @input-border;
-  border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
-  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
-  .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
-
-  // Customize the `:focus` state to imitate native WebKit styles.
-  .form-control-focus();
-
-  // Placeholder
-  .placeholder();
-
-  // Unstyle the caret on `<select>`s in IE10+.
-  &::-ms-expand {
-    border: 0;
-    background-color: transparent;
-  }
-
-  // Disabled and read-only inputs
-  //
-  // HTML5 says that controls under a fieldset > legend:first-child won't be
-  // disabled if the fieldset is disabled. Due to implementation difficulty, we
-  // don't honor that edge case; we style them as disabled anyway.
-  &[disabled],
-  &[readonly],
-  fieldset[disabled] & {
-    background-color: @input-bg-disabled;
-    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
-  }
-
-  &[disabled],
-  fieldset[disabled] & {
-    cursor: @cursor-disabled;
-  }
-
-  // Reset height for `textarea`s
-  textarea& {
-    height: auto;
-  }
-}
-
-
-// Search inputs in iOS
-//
-// This overrides the extra rounded corners on search inputs in iOS so that our
-// `.form-control` class can properly style them. Note that this cannot simply
-// be added to `.form-control` as it's not specific enough. For details, see
-// https://github.com/twbs/bootstrap/issues/11586.
-
-input[type="search"] {
-  -webkit-appearance: none;
-}
-
-
-// Special styles for iOS temporal inputs
-//
-// In Mobile Safari, setting `display: block` on temporal inputs causes the
-// text within the input to become vertically misaligned. As a workaround, we
-// set a pixel line-height that matches the given height of the input, but only
-// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
-//
-// Note that as of 9.3, iOS doesn't support `week`.
-
-@media screen and (-webkit-min-device-pixel-ratio: 0) {
-  input[type="date"],
-  input[type="time"],
-  input[type="datetime-local"],
-  input[type="month"] {
-    &.form-control {
-      line-height: @input-height-base;
-    }
-
-    &.input-sm,
-    .input-group-sm & {
-      line-height: @input-height-small;
-    }
-
-    &.input-lg,
-    .input-group-lg & {
-      line-height: @input-height-large;
-    }
-  }
-}
-
-
-// Form groups
-//
-// Designed to help with the organization and spacing of vertical forms. For
-// horizontal forms, use the predefined grid classes.
-
-.form-group {
-  margin-bottom: @form-group-margin-bottom;
-}
-
-
-// Checkboxes and radios
-//
-// Indent the labels to position radios/checkboxes as hanging controls.
-
-.radio,
-.checkbox {
-  position: relative;
-  display: block;
-  margin-top: 10px;
-  margin-bottom: 10px;
-
-  label {
-    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text
-    padding-left: 20px;
-    margin-bottom: 0;
-    font-weight: normal;
-    cursor: pointer;
-  }
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  position: absolute;
-  margin-left: -20px;
-  margin-top: 4px \9;
-}
-
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
-}
-
-// Radios and checkboxes on same line
-.radio-inline,
-.checkbox-inline {
-  position: relative;
-  display: inline-block;
-  padding-left: 20px;
-  margin-bottom: 0;
-  vertical-align: middle;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
-  margin-top: 0;
-  margin-left: 10px; // space out consecutive inline controls
-}
-
-// Apply same disabled cursor tweak as for inputs
-// Some special care is needed because <label>s don't inherit their parent's `cursor`.
-//
-// Note: Neither radios nor checkboxes can be readonly.
-input[type="radio"],
-input[type="checkbox"] {
-  &[disabled],
-  &.disabled,
-  fieldset[disabled] & {
-    cursor: @cursor-disabled;
-  }
-}
-// These classes are used directly on <label>s
-.radio-inline,
-.checkbox-inline {
-  &.disabled,
-  fieldset[disabled] & {
-    cursor: @cursor-disabled;
-  }
-}
-// These classes are used on elements with <label> descendants
-.radio,
-.checkbox {
-  &.disabled,
-  fieldset[disabled] & {
-    label {
-      cursor: @cursor-disabled;
-    }
-  }
-}
-
-
-// Static form control text
-//
-// Apply class to a `p` element to make any string of text align with labels in
-// a horizontal form layout.
-
-.form-control-static {
-  // Size it appropriately next to real form controls
-  padding-top: (@padding-base-vertical + 1);
-  padding-bottom: (@padding-base-vertical + 1);
-  // Remove default margin from `p`
-  margin-bottom: 0;
-  min-height: (@line-height-computed + @font-size-base);
-
-  &.input-lg,
-  &.input-sm {
-    padding-left: 0;
-    padding-right: 0;
-  }
-}
-
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-//
-// The `.form-group-* form-control` variations are sadly duplicated to avoid the
-// issue documented in https://github.com/twbs/bootstrap/issues/15074.
-
-.input-sm {
-  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);
-}
-.form-group-sm {
-  .form-control {
-    height: @input-height-small;
-    padding: @padding-small-vertical @padding-small-horizontal;
-    font-size: @font-size-small;
-    line-height: @line-height-small;
-    border-radius: @input-border-radius-small;
-  }
-  select.form-control {
-    height: @input-height-small;
-    line-height: @input-height-small;
-  }
-  textarea.form-control,
-  select[multiple].form-control {
-    height: auto;
-  }
-  .form-control-static {
-    height: @input-height-small;
-    min-height: (@line-height-computed + @font-size-small);
-    padding: (@padding-small-vertical + 1) @padding-small-horizontal;
-    font-size: @font-size-small;
-    line-height: @line-height-small;
-  }
-}
-
-.input-lg {
-  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);
-}
-.form-group-lg {
-  .form-control {
-    height: @input-height-large;
-    padding: @padding-large-vertical @padding-large-horizontal;
-    font-size: @font-size-large;
-    line-height: @line-height-large;
-    border-radius: @input-border-radius-large;
-  }
-  select.form-control {
-    height: @input-height-large;
-    line-height: @input-height-large;
-  }
-  textarea.form-control,
-  select[multiple].form-control {
-    height: auto;
-  }
-  .form-control-static {
-    height: @input-height-large;
-    min-height: (@line-height-computed + @font-size-large);
-    padding: (@padding-large-vertical + 1) @padding-large-horizontal;
-    font-size: @font-size-large;
-    line-height: @line-height-large;
-  }
-}
-
-
-// Form control feedback states
-//
-// Apply contextual and semantic states to individual form controls.
-
-.has-feedback {
-  // Enable absolute positioning
-  position: relative;
-
-  // Ensure icons don't overlap text
-  .form-control {
-    padding-right: (@input-height-base * 1.25);
-  }
-}
-// Feedback icon (requires .glyphicon classes)
-.form-control-feedback {
-  position: absolute;
-  top: 0;
-  right: 0;
-  z-index: 2; // Ensure icon is above input groups
-  display: block;
-  width: @input-height-base;
-  height: @input-height-base;
-  line-height: @input-height-base;
-  text-align: center;
-  pointer-events: none;
-}
-.input-lg + .form-control-feedback,
-.input-group-lg + .form-control-feedback,
-.form-group-lg .form-control + .form-control-feedback {
-  width: @input-height-large;
-  height: @input-height-large;
-  line-height: @input-height-large;
-}
-.input-sm + .form-control-feedback,
-.input-group-sm + .form-control-feedback,
-.form-group-sm .form-control + .form-control-feedback {
-  width: @input-height-small;
-  height: @input-height-small;
-  line-height: @input-height-small;
-}
-
-// Feedback states
-.has-success {
-  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);
-}
-.has-warning {
-  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);
-}
-.has-error {
-  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);
-}
-
-// Reposition feedback icon if input has visible label above
-.has-feedback label {
-
-  & ~ .form-control-feedback {
-    top: (@line-height-computed + 5); // Height of the `label` and its margin
-  }
-  &.sr-only ~ .form-control-feedback {
-    top: 0;
-  }
-}
-
-
-// Help text
-//
-// Apply to any element you wish to create light text for placement immediately
-// below a form control. Use for general help, formatting, or instructional text.
-
-.help-block {
-  display: block; // account for any element using help-block
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: lighten(@text-color, 25%); // lighten the text some for contrast
-}
-
-
-// Inline forms
-//
-// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
-// forms begin stacked on extra small (mobile) devices and then go inline when
-// viewports reach <768px.
-//
-// Requires wrapping inputs and labels with `.form-group` for proper display of
-// default HTML form controls and our custom form controls (e.g., input groups).
-//
-// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
-
-.form-inline {
-
-  // Kick in the inline
-  @media (min-width: @screen-sm-min) {
-    // Inline-block all the things for "inline"
-    .form-group {
-      display: inline-block;
-      margin-bottom: 0;
-      vertical-align: middle;
-    }
-
-    // In navbar-form, allow folks to *not* use `.form-group`
-    .form-control {
-      display: inline-block;
-      width: auto; // Prevent labels from stacking above inputs in `.form-group`
-      vertical-align: middle;
-    }
-
-    // Make static controls behave like regular ones
-    .form-control-static {
-      display: inline-block;
-    }
-
-    .input-group {
-      display: inline-table;
-      vertical-align: middle;
-
-      .input-group-addon,
-      .input-group-btn,
-      .form-control {
-        width: auto;
-      }
-    }
-
-    // Input groups need that 100% width though
-    .input-group > .form-control {
-      width: 100%;
-    }
-
-    .control-label {
-      margin-bottom: 0;
-      vertical-align: middle;
-    }
-
-    // Remove default margin on radios/checkboxes that were used for stacking, and
-    // then undo the floating of radios and checkboxes to match.
-    .radio,
-    .checkbox {
-      display: inline-block;
-      margin-top: 0;
-      margin-bottom: 0;
-      vertical-align: middle;
-
-      label {
-        padding-left: 0;
-      }
-    }
-    .radio input[type="radio"],
-    .checkbox input[type="checkbox"] {
-      position: relative;
-      margin-left: 0;
-    }
-
-    // Re-override the feedback icon.
-    .has-feedback .form-control-feedback {
-      top: 0;
-    }
-  }
-}
-
-
-// Horizontal forms
-//
-// Horizontal forms are built on grid classes and allow you to create forms with
-// labels on the left and inputs on the right.
-
-.form-horizontal {
-
-  // Consistent vertical alignment of radios and checkboxes
-  //
-  // Labels also get some reset styles, but that is scoped to a media query below.
-  .radio,
-  .checkbox,
-  .radio-inline,
-  .checkbox-inline {
-    margin-top: 0;
-    margin-bottom: 0;
-    padding-top: (@padding-base-vertical + 1); // Default padding plus a border
-  }
-  // Account for padding we're adding to ensure the alignment and of help text
-  // and other content below items
-  .radio,
-  .checkbox {
-    min-height: (@line-height-computed + (@padding-base-vertical + 1));
-  }
-
-  // Make form groups behave like rows
-  .form-group {
-    .make-row();
-  }
-
-  // Reset spacing and right align labels, but scope to media queries so that
-  // labels on narrow viewports stack the same as a default form example.
-  @media (min-width: @screen-sm-min) {
-    .control-label {
-      text-align: right;
-      margin-bottom: 0;
-      padding-top: (@padding-base-vertical + 1); // Default padding plus a border
-    }
-  }
-
-  // Validation states
-  //
-  // Reposition the icon because it's now within a grid column and columns have
-  // `position: relative;` on them. Also accounts for the grid gutter padding.
-  .has-feedback .form-control-feedback {
-    right: floor((@grid-gutter-width / 2));
-  }
-
-  // Form group sizes
-  //
-  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the
-  // inputs and labels within a `.form-group`.
-  .form-group-lg {
-    @media (min-width: @screen-sm-min) {
-      .control-label {
-        padding-top: (@padding-large-vertical + 1);
-        font-size: @font-size-large;
-      }
-    }
-  }
-  .form-group-sm {
-    @media (min-width: @screen-sm-min) {
-      .control-label {
-        padding-top: (@padding-small-vertical + 1);
-        font-size: @font-size-small;
-      }
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/glyphicons.less b/framework/crawler-ui/src/main/less/bootstrap-less/glyphicons.less
deleted file mode 100644
index 1000cd7..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/glyphicons.less
+++ /dev/null
@@ -1,328 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Glyphicons for Bootstrap
-//
-// Since icons are fonts, they can be placed anywhere text is placed and are
-// thus automatically sized to match the surrounding child. To use, create an
-// inline element with the appropriate classes, like so:
-//
-// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
-
-// Import the fonts
-@font-face {
-  font-family: 'Glyphicons Halflings';
-  src: url('@{icon-font-path}@{icon-font-name}.eot');
-  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),
-       url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),
-       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),
-       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),
-       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');
-}
-
-// Catchall baseclass
-.glyphicon {
-  position: relative;
-  top: 1px;
-  display: inline-block;
-  font-family: 'Glyphicons Halflings';
-  font-style: normal;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-// Individual icons
-.glyphicon-asterisk               { &:before { content: "\002a"; } }
-.glyphicon-plus                   { &:before { content: "\002b"; } }
-.glyphicon-euro,
-.glyphicon-eur                    { &:before { content: "\20ac"; } }
-.glyphicon-minus                  { &:before { content: "\2212"; } }
-.glyphicon-cloud                  { &:before { content: "\2601"; } }
-.glyphicon-envelope               { &:before { content: "\2709"; } }
-.glyphicon-pencil                 { &:before { content: "\270f"; } }
-.glyphicon-glass                  { &:before { content: "\e001"; } }
-.glyphicon-music                  { &:before { content: "\e002"; } }
-.glyphicon-search                 { &:before { content: "\e003"; } }
-.glyphicon-heart                  { &:before { content: "\e005"; } }
-.glyphicon-star                   { &:before { content: "\e006"; } }
-.glyphicon-star-empty             { &:before { content: "\e007"; } }
-.glyphicon-user                   { &:before { content: "\e008"; } }
-.glyphicon-film                   { &:before { content: "\e009"; } }
-.glyphicon-th-large               { &:before { content: "\e010"; } }
-.glyphicon-th                     { &:before { content: "\e011"; } }
-.glyphicon-th-list                { &:before { content: "\e012"; } }
-.glyphicon-ok                     { &:before { content: "\e013"; } }
-.glyphicon-remove                 { &:before { content: "\e014"; } }
-.glyphicon-zoom-in                { &:before { content: "\e015"; } }
-.glyphicon-zoom-out               { &:before { content: "\e016"; } }
-.glyphicon-off                    { &:before { content: "\e017"; } }
-.glyphicon-signal                 { &:before { content: "\e018"; } }
-.glyphicon-cog                    { &:before { content: "\e019"; } }
-.glyphicon-trash                  { &:before { content: "\e020"; } }
-.glyphicon-home                   { &:before { content: "\e021"; } }
-.glyphicon-file                   { &:before { content: "\e022"; } }
-.glyphicon-time                   { &:before { content: "\e023"; } }
-.glyphicon-road                   { &:before { content: "\e024"; } }
-.glyphicon-download-alt           { &:before { content: "\e025"; } }
-.glyphicon-download               { &:before { content: "\e026"; } }
-.glyphicon-upload                 { &:before { content: "\e027"; } }
-.glyphicon-inbox                  { &:before { content: "\e028"; } }
-.glyphicon-play-circle            { &:before { content: "\e029"; } }
-.glyphicon-repeat                 { &:before { content: "\e030"; } }
-.glyphicon-refresh                { &:before { content: "\e031"; } }
-.glyphicon-list-alt               { &:before { content: "\e032"; } }
-.glyphicon-lock                   { &:before { content: "\e033"; } }
-.glyphicon-flag                   { &:before { content: "\e034"; } }
-.glyphicon-headphones             { &:before { content: "\e035"; } }
-.glyphicon-volume-off             { &:before { content: "\e036"; } }
-.glyphicon-volume-down            { &:before { content: "\e037"; } }
-.glyphicon-volume-up              { &:before { content: "\e038"; } }
-.glyphicon-qrcode                 { &:before { content: "\e039"; } }
-.glyphicon-barcode                { &:before { content: "\e040"; } }
-.glyphicon-tag                    { &:before { content: "\e041"; } }
-.glyphicon-tags                   { &:before { content: "\e042"; } }
-.glyphicon-book                   { &:before { content: "\e043"; } }
-.glyphicon-bookmark               { &:before { content: "\e044"; } }
-.glyphicon-print                  { &:before { content: "\e045"; } }
-.glyphicon-camera                 { &:before { content: "\e046"; } }
-.glyphicon-font                   { &:before { content: "\e047"; } }
-.glyphicon-bold                   { &:before { content: "\e048"; } }
-.glyphicon-italic                 { &:before { content: "\e049"; } }
-.glyphicon-text-height            { &:before { content: "\e050"; } }
-.glyphicon-text-width             { &:before { content: "\e051"; } }
-.glyphicon-align-left             { &:before { content: "\e052"; } }
-.glyphicon-align-center           { &:before { content: "\e053"; } }
-.glyphicon-align-right            { &:before { content: "\e054"; } }
-.glyphicon-align-justify          { &:before { content: "\e055"; } }
-.glyphicon-list                   { &:before { content: "\e056"; } }
-.glyphicon-indent-left            { &:before { content: "\e057"; } }
-.glyphicon-indent-right           { &:before { content: "\e058"; } }
-.glyphicon-facetime-video         { &:before { content: "\e059"; } }
-.glyphicon-picture                { &:before { content: "\e060"; } }
-.glyphicon-map-marker             { &:before { content: "\e062"; } }
-.glyphicon-adjust                 { &:before { content: "\e063"; } }
-.glyphicon-tint                   { &:before { content: "\e064"; } }
-.glyphicon-edit                   { &:before { content: "\e065"; } }
-.glyphicon-share                  { &:before { content: "\e066"; } }
-.glyphicon-check                  { &:before { content: "\e067"; } }
-.glyphicon-move                   { &:before { content: "\e068"; } }
-.glyphicon-step-backward          { &:before { content: "\e069"; } }
-.glyphicon-fast-backward          { &:before { content: "\e070"; } }
-.glyphicon-backward               { &:before { content: "\e071"; } }
-.glyphicon-play                   { &:before { content: "\e072"; } }
-.glyphicon-pause                  { &:before { content: "\e073"; } }
-.glyphicon-stop                   { &:before { content: "\e074"; } }
-.glyphicon-forward                { &:before { content: "\e075"; } }
-.glyphicon-fast-forward           { &:before { content: "\e076"; } }
-.glyphicon-step-forward           { &:before { content: "\e077"; } }
-.glyphicon-eject                  { &:before { content: "\e078"; } }
-.glyphicon-chevron-left           { &:before { content: "\e079"; } }
-.glyphicon-chevron-right          { &:before { content: "\e080"; } }
-.glyphicon-plus-sign              { &:before { content: "\e081"; } }
-.glyphicon-minus-sign             { &:before { content: "\e082"; } }
-.glyphicon-remove-sign            { &:before { content: "\e083"; } }
-.glyphicon-ok-sign                { &:before { content: "\e084"; } }
-.glyphicon-question-sign          { &:before { content: "\e085"; } }
-.glyphicon-info-sign              { &:before { content: "\e086"; } }
-.glyphicon-screenshot             { &:before { content: "\e087"; } }
-.glyphicon-remove-circle          { &:before { content: "\e088"; } }
-.glyphicon-ok-circle              { &:before { content: "\e089"; } }
-.glyphicon-ban-circle             { &:before { content: "\e090"; } }
-.glyphicon-arrow-left             { &:before { content: "\e091"; } }
-.glyphicon-arrow-right            { &:before { content: "\e092"; } }
-.glyphicon-arrow-up               { &:before { content: "\e093"; } }
-.glyphicon-arrow-down             { &:before { content: "\e094"; } }
-.glyphicon-share-alt              { &:before { content: "\e095"; } }
-.glyphicon-resize-full            { &:before { content: "\e096"; } }
-.glyphicon-resize-small           { &:before { content: "\e097"; } }
-.glyphicon-exclamation-sign       { &:before { content: "\e101"; } }
-.glyphicon-gift                   { &:before { content: "\e102"; } }
-.glyphicon-leaf                   { &:before { content: "\e103"; } }
-.glyphicon-fire                   { &:before { content: "\e104"; } }
-.glyphicon-eye-open               { &:before { content: "\e105"; } }
-.glyphicon-eye-close              { &:before { content: "\e106"; } }
-.glyphicon-warning-sign           { &:before { content: "\e107"; } }
-.glyphicon-plane                  { &:before { content: "\e108"; } }
-.glyphicon-calendar               { &:before { content: "\e109"; } }
-.glyphicon-random                 { &:before { content: "\e110"; } }
-.glyphicon-comment                { &:before { content: "\e111"; } }
-.glyphicon-magnet                 { &:before { content: "\e112"; } }
-.glyphicon-chevron-up             { &:before { content: "\e113"; } }
-.glyphicon-chevron-down           { &:before { content: "\e114"; } }
-.glyphicon-retweet                { &:before { content: "\e115"; } }
-.glyphicon-shopping-cart          { &:before { content: "\e116"; } }
-.glyphicon-folder-close           { &:before { content: "\e117"; } }
-.glyphicon-folder-open            { &:before { content: "\e118"; } }
-.glyphicon-resize-vertical        { &:before { content: "\e119"; } }
-.glyphicon-resize-horizontal      { &:before { content: "\e120"; } }
-.glyphicon-hdd                    { &:before { content: "\e121"; } }
-.glyphicon-bullhorn               { &:before { content: "\e122"; } }
-.glyphicon-bell                   { &:before { content: "\e123"; } }
-.glyphicon-certificate            { &:before { content: "\e124"; } }
-.glyphicon-thumbs-up              { &:before { content: "\e125"; } }
-.glyphicon-thumbs-down            { &:before { content: "\e126"; } }
-.glyphicon-hand-right             { &:before { content: "\e127"; } }
-.glyphicon-hand-left              { &:before { content: "\e128"; } }
-.glyphicon-hand-up                { &:before { content: "\e129"; } }
-.glyphicon-hand-down              { &:before { content: "\e130"; } }
-.glyphicon-circle-arrow-right     { &:before { content: "\e131"; } }
-.glyphicon-circle-arrow-left      { &:before { content: "\e132"; } }
-.glyphicon-circle-arrow-up        { &:before { content: "\e133"; } }
-.glyphicon-circle-arrow-down      { &:before { content: "\e134"; } }
-.glyphicon-globe                  { &:before { content: "\e135"; } }
-.glyphicon-wrench                 { &:before { content: "\e136"; } }
-.glyphicon-tasks                  { &:before { content: "\e137"; } }
-.glyphicon-filter                 { &:before { content: "\e138"; } }
-.glyphicon-briefcase              { &:before { content: "\e139"; } }
-.glyphicon-fullscreen             { &:before { content: "\e140"; } }
-.glyphicon-dashboard              { &:before { content: "\e141"; } }
-.glyphicon-paperclip              { &:before { content: "\e142"; } }
-.glyphicon-heart-empty            { &:before { content: "\e143"; } }
-.glyphicon-link                   { &:before { content: "\e144"; } }
-.glyphicon-phone                  { &:before { content: "\e145"; } }
-.glyphicon-pushpin                { &:before { content: "\e146"; } }
-.glyphicon-usd                    { &:before { content: "\e148"; } }
-.glyphicon-gbp                    { &:before { content: "\e149"; } }
-.glyphicon-sort                   { &:before { content: "\e150"; } }
-.glyphicon-sort-by-alphabet       { &:before { content: "\e151"; } }
-.glyphicon-sort-by-alphabet-alt   { &:before { content: "\e152"; } }
-.glyphicon-sort-by-order          { &:before { content: "\e153"; } }
-.glyphicon-sort-by-order-alt      { &:before { content: "\e154"; } }
-.glyphicon-sort-by-attributes     { &:before { content: "\e155"; } }
-.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
-.glyphicon-unchecked              { &:before { content: "\e157"; } }
-.glyphicon-expand                 { &:before { content: "\e158"; } }
-.glyphicon-collapse-down          { &:before { content: "\e159"; } }
-.glyphicon-collapse-up            { &:before { content: "\e160"; } }
-.glyphicon-log-in                 { &:before { content: "\e161"; } }
-.glyphicon-flash                  { &:before { content: "\e162"; } }
-.glyphicon-log-out                { &:before { content: "\e163"; } }
-.glyphicon-new-window             { &:before { content: "\e164"; } }
-.glyphicon-record                 { &:before { content: "\e165"; } }
-.glyphicon-save                   { &:before { content: "\e166"; } }
-.glyphicon-open                   { &:before { content: "\e167"; } }
-.glyphicon-saved                  { &:before { content: "\e168"; } }
-.glyphicon-import                 { &:before { content: "\e169"; } }
-.glyphicon-export                 { &:before { content: "\e170"; } }
-.glyphicon-send                   { &:before { content: "\e171"; } }
-.glyphicon-floppy-disk            { &:before { content: "\e172"; } }
-.glyphicon-floppy-saved           { &:before { content: "\e173"; } }
-.glyphicon-floppy-remove          { &:before { content: "\e174"; } }
-.glyphicon-floppy-save            { &:before { content: "\e175"; } }
-.glyphicon-floppy-open            { &:before { content: "\e176"; } }
-.glyphicon-credit-card            { &:before { content: "\e177"; } }
-.glyphicon-transfer               { &:before { content: "\e178"; } }
-.glyphicon-cutlery                { &:before { content: "\e179"; } }
-.glyphicon-header                 { &:before { content: "\e180"; } }
-.glyphicon-compressed             { &:before { content: "\e181"; } }
-.glyphicon-earphone               { &:before { content: "\e182"; } }
-.glyphicon-phone-alt              { &:before { content: "\e183"; } }
-.glyphicon-tower                  { &:before { content: "\e184"; } }
-.glyphicon-stats                  { &:before { content: "\e185"; } }
-.glyphicon-sd-video               { &:before { content: "\e186"; } }
-.glyphicon-hd-video               { &:before { content: "\e187"; } }
-.glyphicon-subtitles              { &:before { content: "\e188"; } }
-.glyphicon-sound-stereo           { &:before { content: "\e189"; } }
-.glyphicon-sound-dolby            { &:before { content: "\e190"; } }
-.glyphicon-sound-5-1              { &:before { content: "\e191"; } }
-.glyphicon-sound-6-1              { &:before { content: "\e192"; } }
-.glyphicon-sound-7-1              { &:before { content: "\e193"; } }
-.glyphicon-copyright-mark         { &:before { content: "\e194"; } }
-.glyphicon-registration-mark      { &:before { content: "\e195"; } }
-.glyphicon-cloud-download         { &:before { content: "\e197"; } }
-.glyphicon-cloud-upload           { &:before { content: "\e198"; } }
-.glyphicon-tree-conifer           { &:before { content: "\e199"; } }
-.glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
-.glyphicon-cd                     { &:before { content: "\e201"; } }
-.glyphicon-save-file              { &:before { content: "\e202"; } }
-.glyphicon-open-file              { &:before { content: "\e203"; } }
-.glyphicon-level-up               { &:before { content: "\e204"; } }
-.glyphicon-copy                   { &:before { content: "\e205"; } }
-.glyphicon-paste                  { &:before { content: "\e206"; } }
-// The following 2 Glyphicons are omitted for the time being because
-// they currently use Unicode codepoints that are outside the
-// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
-// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
-// Notably, the bug affects some older versions of the Android Browser.
-// More info: https://github.com/twbs/bootstrap/issues/10106
-// .glyphicon-door                   { &:before { content: "\1f6aa"; } }
-// .glyphicon-key                    { &:before { content: "\1f511"; } }
-.glyphicon-alert                  { &:before { content: "\e209"; } }
-.glyphicon-equalizer              { &:before { content: "\e210"; } }
-.glyphicon-king                   { &:before { content: "\e211"; } }
-.glyphicon-queen                  { &:before { content: "\e212"; } }
-.glyphicon-pawn                   { &:before { content: "\e213"; } }
-.glyphicon-bishop                 { &:before { content: "\e214"; } }
-.glyphicon-knight                 { &:before { content: "\e215"; } }
-.glyphicon-baby-formula           { &:before { content: "\e216"; } }
-.glyphicon-tent                   { &:before { content: "\26fa"; } }
-.glyphicon-blackboard             { &:before { content: "\e218"; } }
-.glyphicon-bed                    { &:before { content: "\e219"; } }
-.glyphicon-apple                  { &:before { content: "\f8ff"; } }
-.glyphicon-erase                  { &:before { content: "\e221"; } }
-.glyphicon-hourglass              { &:before { content: "\231b"; } }
-.glyphicon-lamp                   { &:before { content: "\e223"; } }
-.glyphicon-duplicate              { &:before { content: "\e224"; } }
-.glyphicon-piggy-bank             { &:before { content: "\e225"; } }
-.glyphicon-scissors               { &:before { content: "\e226"; } }
-.glyphicon-bitcoin                { &:before { content: "\e227"; } }
-.glyphicon-btc                    { &:before { content: "\e227"; } }
-.glyphicon-xbt                    { &:before { content: "\e227"; } }
-.glyphicon-yen                    { &:before { content: "\00a5"; } }
-.glyphicon-jpy                    { &:before { content: "\00a5"; } }
-.glyphicon-ruble                  { &:before { content: "\20bd"; } }
-.glyphicon-rub                    { &:before { content: "\20bd"; } }
-.glyphicon-scale                  { &:before { content: "\e230"; } }
-.glyphicon-ice-lolly              { &:before { content: "\e231"; } }
-.glyphicon-ice-lolly-tasted       { &:before { content: "\e232"; } }
-.glyphicon-education              { &:before { content: "\e233"; } }
-.glyphicon-option-horizontal      { &:before { content: "\e234"; } }
-.glyphicon-option-vertical        { &:before { content: "\e235"; } }
-.glyphicon-menu-hamburger         { &:before { content: "\e236"; } }
-.glyphicon-modal-window           { &:before { content: "\e237"; } }
-.glyphicon-oil                    { &:before { content: "\e238"; } }
-.glyphicon-grain                  { &:before { content: "\e239"; } }
-.glyphicon-sunglasses             { &:before { content: "\e240"; } }
-.glyphicon-text-size              { &:before { content: "\e241"; } }
-.glyphicon-text-color             { &:before { content: "\e242"; } }
-.glyphicon-text-background        { &:before { content: "\e243"; } }
-.glyphicon-object-align-top       { &:before { content: "\e244"; } }
-.glyphicon-object-align-bottom    { &:before { content: "\e245"; } }
-.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
-.glyphicon-object-align-left      { &:before { content: "\e247"; } }
-.glyphicon-object-align-vertical  { &:before { content: "\e248"; } }
-.glyphicon-object-align-right     { &:before { content: "\e249"; } }
-.glyphicon-triangle-right         { &:before { content: "\e250"; } }
-.glyphicon-triangle-left          { &:before { content: "\e251"; } }
-.glyphicon-triangle-bottom        { &:before { content: "\e252"; } }
-.glyphicon-triangle-top           { &:before { content: "\e253"; } }
-.glyphicon-console                { &:before { content: "\e254"; } }
-.glyphicon-superscript            { &:before { content: "\e255"; } }
-.glyphicon-subscript              { &:before { content: "\e256"; } }
-.glyphicon-menu-left              { &:before { content: "\e257"; } }
-.glyphicon-menu-right             { &:before { content: "\e258"; } }
-.glyphicon-menu-down              { &:before { content: "\e259"; } }
-.glyphicon-menu-up                { &:before { content: "\e260"; } }
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/grid.less b/framework/crawler-ui/src/main/less/bootstrap-less/grid.less
deleted file mode 100644
index 77a55ab..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/grid.less
+++ /dev/null
@@ -1,107 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Grid system
-// --------------------------------------------------
-
-
-// Container widths
-//
-// Set the container width, and override it for fixed navbars in media queries.
-
-.container {
-  .container-fixed();
-
-  @media (min-width: @screen-sm-min) {
-    width: @container-sm;
-  }
-  @media (min-width: @screen-md-min) {
-    width: @container-md;
-  }
-  @media (min-width: @screen-lg-min) {
-    width: @container-lg;
-  }
-}
-
-
-// Fluid container
-//
-// Utilizes the mixin meant for fixed width containers, but without any defined
-// width for fluid, full width layouts.
-
-.container-fluid {
-  .container-fixed();
-}
-
-
-// Row
-//
-// Rows contain and clear the floats of your columns.
-
-.row {
-  .make-row();
-}
-
-
-// Columns
-//
-// Common styles for small and large grid columns
-
-.make-grid-columns();
-
-
-// Extra small grid
-//
-// Columns, offsets, pushes, and pulls for extra small devices like
-// smartphones.
-
-.make-grid(xs);
-
-
-// Small grid
-//
-// Columns, offsets, pushes, and pulls for the small device range, from phones
-// to tablets.
-
-@media (min-width: @screen-sm-min) {
-  .make-grid(sm);
-}
-
-
-// Medium grid
-//
-// Columns, offsets, pushes, and pulls for the desktop device range.
-
-@media (min-width: @screen-md-min) {
-  .make-grid(md);
-}
-
-
-// Large grid
-//
-// Columns, offsets, pushes, and pulls for the large desktop device range.
-
-@media (min-width: @screen-lg-min) {
-  .make-grid(lg);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/input-groups.less b/framework/crawler-ui/src/main/less/bootstrap-less/input-groups.less
deleted file mode 100644
index 0231f16..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/input-groups.less
+++ /dev/null
@@ -1,194 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Input groups
-// --------------------------------------------------
-
-// Base styles
-// -------------------------
-.input-group {
-  position: relative; // For dropdowns
-  display: table;
-  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
-
-  // Undo padding and float of grid classes
-  &[class*="col-"] {
-    float: none;
-    padding-left: 0;
-    padding-right: 0;
-  }
-
-  .form-control {
-    // Ensure that the input is always above the *appended* addon button for
-    // proper border colors.
-    position: relative;
-    z-index: 2;
-
-    // IE9 fubars the placeholder attribute in text inputs and the arrows on
-    // select elements in input groups. To fix it, we float the input. Details:
-    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
-    float: left;
-
-    width: 100%;
-    margin-bottom: 0;
-
-    &:focus {
-      z-index: 3;
-    }
-  }
-}
-
-// Sizing options
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
-  .input-lg();
-}
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
-  .input-sm();
-}
-
-
-// Display as table-cell
-// -------------------------
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: table-cell;
-
-  &:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-}
-// Addon and addon wrapper for buttons
-.input-group-addon,
-.input-group-btn {
-  width: 1%;
-  white-space: nowrap;
-  vertical-align: middle; // Match the inputs
-}
-
-// Text input groups
-// -------------------------
-.input-group-addon {
-  padding: @padding-base-vertical @padding-base-horizontal;
-  font-size: @font-size-base;
-  font-weight: normal;
-  line-height: 1;
-  color: @input-color;
-  text-align: center;
-  background-color: @input-group-addon-bg;
-  border: 1px solid @input-group-addon-border-color;
-  border-radius: @input-border-radius;
-
-  // Sizing
-  &.input-sm {
-    padding: @padding-small-vertical @padding-small-horizontal;
-    font-size: @font-size-small;
-    border-radius: @input-border-radius-small;
-  }
-  &.input-lg {
-    padding: @padding-large-vertical @padding-large-horizontal;
-    font-size: @font-size-large;
-    border-radius: @input-border-radius-large;
-  }
-
-  // Nuke default margins from checkboxes and radios to vertically center within.
-  input[type="radio"],
-  input[type="checkbox"] {
-    margin-top: 0;
-  }
-}
-
-// Reset rounded corners
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
-  .border-right-radius(0);
-}
-.input-group-addon:first-child {
-  border-right: 0;
-}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
-  .border-left-radius(0);
-}
-.input-group-addon:last-child {
-  border-left: 0;
-}
-
-// Button input groups
-// -------------------------
-.input-group-btn {
-  position: relative;
-  // Jankily prevent input button groups from wrapping with `white-space` and
-  // `font-size` in combination with `inline-block` on buttons.
-  font-size: 0;
-  white-space: nowrap;
-
-  // Negative margin for spacing, position for bringing hovered/focused/actived
-  // element above the siblings.
-  > .btn {
-    position: relative;
-    + .btn {
-      margin-left: -1px;
-    }
-    // Bring the "active" button to the front
-    &:hover,
-    &:focus,
-    &:active {
-      z-index: 2;
-    }
-  }
-
-  // Negative margin to only have a 1px border between the two
-  &:first-child {
-    > .btn,
-    > .btn-group {
-      margin-right: -1px;
-    }
-  }
-  &:last-child {
-    > .btn,
-    > .btn-group {
-      z-index: 2;
-      margin-left: -1px;
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/jumbotron.less b/framework/crawler-ui/src/main/less/bootstrap-less/jumbotron.less
deleted file mode 100644
index 6f3b6c8..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/jumbotron.less
+++ /dev/null
@@ -1,77 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Jumbotron
-// --------------------------------------------------
-
-
-.jumbotron {
-  padding-top:    @jumbotron-padding;
-  padding-bottom: @jumbotron-padding;
-  margin-bottom: @jumbotron-padding;
-  color: @jumbotron-color;
-  background-color: @jumbotron-bg;
-
-  h1,
-  .h1 {
-    color: @jumbotron-heading-color;
-  }
-
-  p {
-    margin-bottom: (@jumbotron-padding / 2);
-    font-size: @jumbotron-font-size;
-    font-weight: 200;
-  }
-
-  > hr {
-    border-top-color: darken(@jumbotron-bg, 10%);
-  }
-
-  .container &,
-  .container-fluid & {
-    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container
-    padding-left:  (@grid-gutter-width / 2);
-    padding-right: (@grid-gutter-width / 2);
-  }
-
-  .container {
-    max-width: 100%;
-  }
-
-  @media screen and (min-width: @screen-sm-min) {
-    padding-top:    (@jumbotron-padding * 1.6);
-    padding-bottom: (@jumbotron-padding * 1.6);
-
-    .container &,
-    .container-fluid & {
-      padding-left:  (@jumbotron-padding * 2);
-      padding-right: (@jumbotron-padding * 2);
-    }
-
-    h1,
-    .h1 {
-      font-size: @jumbotron-heading-font-size;
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/labels.less b/framework/crawler-ui/src/main/less/bootstrap-less/labels.less
deleted file mode 100644
index b4bf4ac..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/labels.less
+++ /dev/null
@@ -1,87 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Labels
-// --------------------------------------------------
-
-.label {
-  display: inline;
-  padding: .2em .6em .3em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: @label-color;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: .25em;
-
-  // Add hover effects, but only for links
-  a& {
-    &:hover,
-    &:focus {
-      color: @label-link-hover-color;
-      text-decoration: none;
-      cursor: pointer;
-    }
-  }
-
-  // Empty labels collapse automatically (not available in IE8)
-  &:empty {
-    display: none;
-  }
-
-  // Quick fix for labels in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
-}
-
-// Colors
-// Contextual variations (linked labels get darker on :hover)
-
-.label-default {
-  .label-variant(@label-default-bg);
-}
-
-.label-primary {
-  .label-variant(@label-primary-bg);
-}
-
-.label-success {
-  .label-variant(@label-success-bg);
-}
-
-.label-info {
-  .label-variant(@label-info-bg);
-}
-
-.label-warning {
-  .label-variant(@label-warning-bg);
-}
-
-.label-danger {
-  .label-variant(@label-danger-bg);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/list-group.less b/framework/crawler-ui/src/main/less/bootstrap-less/list-group.less
deleted file mode 100644
index 4b51e37..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/list-group.less
+++ /dev/null
@@ -1,153 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// List groups
-// --------------------------------------------------
-
-
-// Base class
-//
-// Easily usable on <ul>, <ol>, or <div>.
-
-.list-group {
-  // No need to set list-style: none; since .list-group-item is block level
-  margin-bottom: 20px;
-  padding-left: 0; // reset padding because ul and ol
-}
-
-
-// Individual list items
-//
-// Use on `li`s or `div`s within the `.list-group` parent.
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  // Place the border on the list items and negative margin up for better styling
-  margin-bottom: -1px;
-  background-color: @list-group-bg;
-  border: 1px solid @list-group-border;
-
-  // Round the first and last items
-  &:first-child {
-    .border-top-radius(@list-group-border-radius);
-  }
-  &:last-child {
-    margin-bottom: 0;
-    .border-bottom-radius(@list-group-border-radius);
-  }
-}
-
-
-// Interactive list items
-//
-// Use anchor or button elements instead of `li`s or `div`s to create interactive items.
-// Includes an extra `.active` modifier class for showing selected items.
-
-a.list-group-item,
-button.list-group-item {
-  color: @list-group-link-color;
-
-  .list-group-item-heading {
-    color: @list-group-link-heading-color;
-  }
-
-  // Hover state
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    color: @list-group-link-hover-color;
-    background-color: @list-group-hover-bg;
-  }
-}
-
-button.list-group-item {
-  width: 100%;
-  text-align: left;
-}
-
-.list-group-item {
-  // Disabled state
-  &.disabled,
-  &.disabled:hover,
-  &.disabled:focus {
-    background-color: @list-group-disabled-bg;
-    color: @list-group-disabled-color;
-    cursor: @cursor-disabled;
-
-    // Force color to inherit for custom content
-    .list-group-item-heading {
-      color: inherit;
-    }
-    .list-group-item-text {
-      color: @list-group-disabled-text-color;
-    }
-  }
-
-  // Active class on item itself, not parent
-  &.active,
-  &.active:hover,
-  &.active:focus {
-    z-index: 2; // Place active items above their siblings for proper border styling
-    color: @list-group-active-color;
-    background-color: @list-group-active-bg;
-    border-color: @list-group-active-border;
-
-    // Force color to inherit for custom content
-    .list-group-item-heading,
-    .list-group-item-heading > small,
-    .list-group-item-heading > .small {
-      color: inherit;
-    }
-    .list-group-item-text {
-      color: @list-group-active-text-color;
-    }
-  }
-}
-
-
-// Contextual variants
-//
-// Add modifier classes to change text and background color on individual items.
-// Organizationally, this must come after the `:hover` states.
-
-.list-group-item-variant(success; @state-success-bg; @state-success-text);
-.list-group-item-variant(info; @state-info-bg; @state-info-text);
-.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);
-.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);
-
-
-// Custom content options
-//
-// Extra classes for creating well-formatted content within `.list-group-item`s.
-
-.list-group-item-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-.list-group-item-text {
-  margin-bottom: 0;
-  line-height: 1.3;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/media.less b/framework/crawler-ui/src/main/less/bootstrap-less/media.less
deleted file mode 100644
index 1639217..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/media.less
+++ /dev/null
@@ -1,89 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-.media {
-  // Proper spacing between instances of .media
-  margin-top: 15px;
-
-  &:first-child {
-    margin-top: 0;
-  }
-}
-
-.media,
-.media-body {
-  zoom: 1;
-  overflow: hidden;
-}
-
-.media-body {
-  width: 10000px;
-}
-
-.media-object {
-  display: block;
-
-  // Fix collapse in webkit from max-width: 100% and display: table-cell.
-  &.img-thumbnail {
-    max-width: none;
-  }
-}
-
-.media-right,
-.media > .pull-right {
-  padding-left: 10px;
-}
-
-.media-left,
-.media > .pull-left {
-  padding-right: 10px;
-}
-
-.media-left,
-.media-right,
-.media-body {
-  display: table-cell;
-  vertical-align: top;
-}
-
-.media-middle {
-  vertical-align: middle;
-}
-
-.media-bottom {
-  vertical-align: bottom;
-}
-
-// Reset margins on headings for tighter default spacing
-.media-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-
-// Media list variation
-//
-// Undo default ul/ol styles
-.media-list {
-  padding-left: 0;
-  list-style: none;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins.less
deleted file mode 100644
index d26394b..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins.less
+++ /dev/null
@@ -1,63 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Mixins
-// --------------------------------------------------
-
-// Utilities
-@import "mixins/hide-text.less";
-@import "mixins/opacity.less";
-@import "mixins/image.less";
-@import "mixins/labels.less";
-@import "mixins/reset-filter.less";
-@import "mixins/resize.less";
-@import "mixins/responsive-visibility.less";
-@import "mixins/size.less";
-@import "mixins/tab-focus.less";
-@import "mixins/reset-text.less";
-@import "mixins/text-emphasis.less";
-@import "mixins/text-overflow.less";
-@import "mixins/vendor-prefixes.less";
-
-// Components
-@import "mixins/alerts.less";
-@import "mixins/buttons.less";
-@import "mixins/panels.less";
-@import "mixins/pagination.less";
-@import "mixins/list-group.less";
-@import "mixins/nav-divider.less";
-@import "mixins/forms.less";
-@import "mixins/progress-bar.less";
-@import "mixins/table-row.less";
-
-// Skins
-@import "mixins/background-variant.less";
-@import "mixins/border-radius.less";
-@import "mixins/gradients.less";
-
-// Layout
-@import "mixins/clearfix.less";
-@import "mixins/center-block.less";
-@import "mixins/nav-vertical-align.less";
-@import "mixins/grid-framework.less";
-@import "mixins/grid.less";
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/alerts.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/alerts.less
deleted file mode 100644
index 3afbe95..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/alerts.less
+++ /dev/null
@@ -1,37 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Alerts
-
-.alert-variant(@background; @border; @text-color) {
-  background-color: @background;
-  border-color: @border;
-  color: @text-color;
-
-  hr {
-    border-top-color: darken(@border, 5%);
-  }
-  .alert-link {
-    color: darken(@text-color, 10%);
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/background-variant.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/background-variant.less
deleted file mode 100644
index 67c2ebb..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/background-variant.less
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Contextual backgrounds
-
-.bg-variant(@color) {
-  background-color: @color;
-  a&:hover,
-  a&:focus {
-    background-color: darken(@color, 10%);
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/border-radius.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/border-radius.less
deleted file mode 100644
index 2a8f220..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/border-radius.less
+++ /dev/null
@@ -1,41 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Single side border-radius
-
-.border-top-radius(@radius) {
-  border-top-right-radius: @radius;
-   border-top-left-radius: @radius;
-}
-.border-right-radius(@radius) {
-  border-bottom-right-radius: @radius;
-     border-top-right-radius: @radius;
-}
-.border-bottom-radius(@radius) {
-  border-bottom-right-radius: @radius;
-   border-bottom-left-radius: @radius;
-}
-.border-left-radius(@radius) {
-  border-bottom-left-radius: @radius;
-     border-top-left-radius: @radius;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/buttons.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/buttons.less
deleted file mode 100644
index 4b9bb11..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/buttons.less
+++ /dev/null
@@ -1,88 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Button variants
-//
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-
-.button-variant(@color; @background; @border) {
-  color: @color;
-  background-color: @background;
-  border-color: @border;
-
-  &:focus,
-  &.focus {
-    color: @color;
-    background-color: darken(@background, 10%);
-        border-color: darken(@border, 25%);
-  }
-  &:hover {
-    color: @color;
-    background-color: darken(@background, 10%);
-        border-color: darken(@border, 12%);
-  }
-  &:active,
-  &.active,
-  .open > .dropdown-toggle& {
-    color: @color;
-    background-color: darken(@background, 10%);
-        border-color: darken(@border, 12%);
-
-    &:hover,
-    &:focus,
-    &.focus {
-      color: @color;
-      background-color: darken(@background, 17%);
-          border-color: darken(@border, 25%);
-    }
-  }
-  &:active,
-  &.active,
-  .open > .dropdown-toggle& {
-    background-image: none;
-  }
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    &:hover,
-    &:focus,
-    &.focus {
-      background-color: @background;
-          border-color: @border;
-    }
-  }
-
-  .badge {
-    color: @background;
-    background-color: @color;
-  }
-}
-
-// Button sizes
-.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  padding: @padding-vertical @padding-horizontal;
-  font-size: @font-size;
-  line-height: @line-height;
-  border-radius: @border-radius;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/center-block.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/center-block.less
deleted file mode 100644
index 2ee684c..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/center-block.less
+++ /dev/null
@@ -1,30 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Center-align a block level element
-
-.center-block() {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/clearfix.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/clearfix.less
deleted file mode 100644
index 8391f81..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/clearfix.less
+++ /dev/null
@@ -1,45 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Clearfix
-//
-// For modern browsers
-// 1. The space content is one way to avoid an Opera bug when the
-//    contenteditable attribute is included anywhere else in the document.
-//    Otherwise it causes space to appear at the top and bottom of elements
-//    that are clearfixed.
-// 2. The use of `table` rather than `block` is only necessary if using
-//    `:before` to contain the top-margins of child elements.
-//
-// Source: http://nicolasgallagher.com/micro-clearfix-hack/
-
-.clearfix() {
-  &:before,
-  &:after {
-    content: " "; // 1
-    display: table; // 2
-  }
-  &:after {
-    clear: both;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/forms.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/forms.less
deleted file mode 100644
index a5fb343..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/forms.less
+++ /dev/null
@@ -1,108 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Form validation states
-//
-// Used in forms.less to generate the form validation CSS for warnings, errors,
-// and successes.
-
-.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
-  // Color the label and help text
-  .help-block,
-  .control-label,
-  .radio,
-  .checkbox,
-  .radio-inline,
-  .checkbox-inline,
-  &.radio label,
-  &.checkbox label,
-  &.radio-inline label,
-  &.checkbox-inline label  {
-    color: @text-color;
-  }
-  // Set the border and box shadow on specific inputs to match
-  .form-control {
-    border-color: @border-color;
-    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
-    &:focus {
-      border-color: darken(@border-color, 10%);
-      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
-      .box-shadow(@shadow);
-    }
-  }
-  // Set validation states also for addons
-  .input-group-addon {
-    color: @text-color;
-    border-color: @border-color;
-    background-color: @background-color;
-  }
-  // Optional feedback icon
-  .form-control-feedback {
-    color: @text-color;
-  }
-}
-
-
-// Form control focus state
-//
-// Generate a customized focus state and for any input with the specified color,
-// which defaults to the `@input-border-focus` variable.
-//
-// We highly encourage you to not customize the default value, but instead use
-// this to tweak colors on an as-needed basis. This aesthetic change is based on
-// WebKit's default styles, but applicable to a wider range of browsers. Its
-// usability and accessibility should be taken into account with any change.
-//
-// Example usage: change the default blue border and shadow to white for better
-// contrast against a dark gray background.
-.form-control-focus(@color: @input-border-focus) {
-  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
-  &:focus {
-    border-color: @color;
-    outline: 0;
-    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
-  }
-}
-
-// Form control sizing
-//
-// Relative text size, padding, and border-radii changes for form controls. For
-// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
-// element gets special love because it's special, and that's a fact!
-.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  height: @input-height;
-  padding: @padding-vertical @padding-horizontal;
-  font-size: @font-size;
-  line-height: @line-height;
-  border-radius: @border-radius;
-
-  select& {
-    height: @input-height;
-    line-height: @input-height;
-  }
-
-  textarea&,
-  select[multiple]& {
-    height: auto;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/gradients.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/gradients.less
deleted file mode 100644
index 7025ddc..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/gradients.less
+++ /dev/null
@@ -1,82 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Gradients
-
-#gradient {
-
-  // Horizontal gradient, from left to right
-  //
-  // Creates two color stops, start and end, by specifying a color and position for each color stop.
-  // Color stops are not available in IE9 and below.
-  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
-    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
-    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12
-    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-    background-repeat: repeat-x;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
-  }
-
-  // Vertical gradient, from top to bottom
-  //
-  // Creates two color stops, start and end, by specifying a color and position for each color stop.
-  // Color stops are not available in IE9 and below.
-  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
-    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+
-    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12
-    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-    background-repeat: repeat-x;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
-  }
-
-  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
-    background-repeat: repeat-x;
-    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
-    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12
-    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-  }
-  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
-    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
-    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
-    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
-    background-repeat: no-repeat;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
-  }
-  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
-    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-repeat: no-repeat;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
-  }
-  .radial(@inner-color: #555; @outer-color: #333) {
-    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
-    background-image: radial-gradient(circle, @inner-color, @outer-color);
-    background-repeat: no-repeat;
-  }
-  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
-    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/grid-framework.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/grid-framework.less
deleted file mode 100644
index eed7ae8..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/grid-framework.less
+++ /dev/null
@@ -1,114 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `@grid-columns`.
-
-.make-grid-columns() {
-  // Common styles for all sizes of grid columns, widths 1-12
-  .col(@index) { // initial
-    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
-    .col((@index + 1), @item);
-  }
-  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
-    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
-    .col((@index + 1), ~"@{list}, @{item}");
-  }
-  .col(@index, @list) when (@index > @grid-columns) { // terminal
-    @{list} {
-      position: relative;
-      // Prevent columns from collapsing when empty
-      min-height: 1px;
-      // Inner gutter via padding
-      padding-left:  ceil((@grid-gutter-width / 2));
-      padding-right: floor((@grid-gutter-width / 2));
-    }
-  }
-  .col(1); // kickstart it
-}
-
-.float-grid-columns(@class) {
-  .col(@index) { // initial
-    @item: ~".col-@{class}-@{index}";
-    .col((@index + 1), @item);
-  }
-  .col(@index, @list) when (@index =< @grid-columns) { // general
-    @item: ~".col-@{class}-@{index}";
-    .col((@index + 1), ~"@{list}, @{item}");
-  }
-  .col(@index, @list) when (@index > @grid-columns) { // terminal
-    @{list} {
-      float: left;
-    }
-  }
-  .col(1); // kickstart it
-}
-
-.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
-  .col-@{class}-@{index} {
-    width: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {
-  .col-@{class}-push-@{index} {
-    left: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {
-  .col-@{class}-push-0 {
-    left: auto;
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {
-  .col-@{class}-pull-@{index} {
-    right: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {
-  .col-@{class}-pull-0 {
-    right: auto;
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = offset) {
-  .col-@{class}-offset-@{index} {
-    margin-left: percentage((@index / @grid-columns));
-  }
-}
-
-// Basic looping in LESS
-.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
-  .calc-grid-column(@index, @class, @type);
-  // next iteration
-  .loop-grid-columns((@index - 1), @class, @type);
-}
-
-// Create grid for specific class
-.make-grid(@class) {
-  .float-grid-columns(@class);
-  .loop-grid-columns(@grid-columns, @class, width);
-  .loop-grid-columns(@grid-columns, @class, pull);
-  .loop-grid-columns(@grid-columns, @class, push);
-  .loop-grid-columns(@grid-columns, @class, offset);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/grid.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/grid.less
deleted file mode 100644
index 70f4dc3..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/grid.less
+++ /dev/null
@@ -1,145 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Grid system
-//
-// Generate semantic grid columns with these mixins.
-
-// Centered container element
-.container-fixed(@gutter: @grid-gutter-width) {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left:  floor((@gutter / 2));
-  padding-right: ceil((@gutter / 2));
-  &:extend(.clearfix all);
-}
-
-// Creates a wrapper for a series of columns
-.make-row(@gutter: @grid-gutter-width) {
-  margin-left:  ceil((@gutter / -2));
-  margin-right: floor((@gutter / -2));
-  &:extend(.clearfix all);
-}
-
-// Generate the extra small columns
-.make-xs-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  float: left;
-  width: percentage((@columns / @grid-columns));
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-}
-.make-xs-column-offset(@columns) {
-  margin-left: percentage((@columns / @grid-columns));
-}
-.make-xs-column-push(@columns) {
-  left: percentage((@columns / @grid-columns));
-}
-.make-xs-column-pull(@columns) {
-  right: percentage((@columns / @grid-columns));
-}
-
-// Generate the small columns
-.make-sm-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-sm-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-offset(@columns) {
-  @media (min-width: @screen-sm-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-push(@columns) {
-  @media (min-width: @screen-sm-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-pull(@columns) {
-  @media (min-width: @screen-sm-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-// Generate the medium columns
-.make-md-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-md-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-offset(@columns) {
-  @media (min-width: @screen-md-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-push(@columns) {
-  @media (min-width: @screen-md-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-pull(@columns) {
-  @media (min-width: @screen-md-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-// Generate the large columns
-.make-lg-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-lg-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-offset(@columns) {
-  @media (min-width: @screen-lg-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-push(@columns) {
-  @media (min-width: @screen-lg-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-pull(@columns) {
-  @media (min-width: @screen-lg-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/hide-text.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/hide-text.less
deleted file mode 100644
index 35ae83c..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/hide-text.less
+++ /dev/null
@@ -1,44 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// CSS image replacement
-//
-// Heads up! v3 launched with only `.hide-text()`, but per our pattern for
-// mixins being reused as classes with the same name, this doesn't hold up. As
-// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
-//
-// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
-
-// Deprecated as of v3.0.1 (has been removed in v4)
-.hide-text() {
-  font: ~"0/0" a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-// New mixin to use as of v3.0.1
-.text-hide() {
-  .hide-text();
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/image.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/image.less
deleted file mode 100644
index df68730..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/image.less
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Image Mixins
-// - Responsive image
-// - Retina image
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-.img-responsive(@display: block) {
-  display: @display;
-  max-width: 100%; // Part 1: Set a maximum relative to the parent
-  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
-}
-
-
-// Retina image
-//
-// Short retina mixin for setting background-image and -size. Note that the
-// spelling of `min--moz-device-pixel-ratio` is intentional.
-.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
-  background-image: url("@{file-1x}");
-
-  @media
-  only screen and (-webkit-min-device-pixel-ratio: 2),
-  only screen and (   min--moz-device-pixel-ratio: 2),
-  only screen and (     -o-min-device-pixel-ratio: 2/1),
-  only screen and (        min-device-pixel-ratio: 2),
-  only screen and (                min-resolution: 192dpi),
-  only screen and (                min-resolution: 2dppx) {
-    background-image: url("@{file-2x}");
-    background-size: @width-1x @height-1x;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/labels.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/labels.less
deleted file mode 100644
index f84f581..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/labels.less
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Labels
-
-.label-variant(@color) {
-  background-color: @color;
-
-  &[href] {
-    &:hover,
-    &:focus {
-      background-color: darken(@color, 10%);
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/list-group.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/list-group.less
deleted file mode 100644
index be127a2..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/list-group.less
+++ /dev/null
@@ -1,53 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// List Groups
-
-.list-group-item-variant(@state; @background; @color) {
-  .list-group-item-@{state} {
-    color: @color;
-    background-color: @background;
-
-    a&,
-    button& {
-      color: @color;
-
-      .list-group-item-heading {
-        color: inherit;
-      }
-
-      &:hover,
-      &:focus {
-        color: @color;
-        background-color: darken(@background, 5%);
-      }
-      &.active,
-      &.active:hover,
-      &.active:focus {
-        color: #fff;
-        background-color: @color;
-        border-color: @color;
-      }
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/nav-divider.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/nav-divider.less
deleted file mode 100644
index 0c068e3..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/nav-divider.less
+++ /dev/null
@@ -1,33 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Horizontal dividers
-//
-// Dividers (basically an hr) within dropdowns and nav lists
-
-.nav-divider(@color: #e5e5e5) {
-  height: 1px;
-  margin: ((@line-height-computed / 2) - 1) 0;
-  overflow: hidden;
-  background-color: @color;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/nav-vertical-align.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/nav-vertical-align.less
deleted file mode 100644
index 3d6f79f..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/nav-vertical-align.less
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Navbar vertical align
-//
-// Vertically center elements in the navbar.
-// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
-
-.navbar-vertical-align(@element-height) {
-  margin-top: ((@navbar-height - @element-height) / 2);
-  margin-bottom: ((@navbar-height - @element-height) / 2);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/opacity.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/opacity.less
deleted file mode 100644
index c2ff5a6..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/opacity.less
+++ /dev/null
@@ -1,31 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Opacity
-
-.opacity(@opacity) {
-  opacity: @opacity;
-  // IE8 filter
-  @opacity-ie: (@opacity * 100);
-  filter: ~"alpha(opacity=@{opacity-ie})";
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/pagination.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/pagination.less
deleted file mode 100644
index 8ec23cb..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/pagination.less
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Pagination
-
-.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  > li {
-    > a,
-    > span {
-      padding: @padding-vertical @padding-horizontal;
-      font-size: @font-size;
-      line-height: @line-height;
-    }
-    &:first-child {
-      > a,
-      > span {
-        .border-left-radius(@border-radius);
-      }
-    }
-    &:last-child {
-      > a,
-      > span {
-        .border-right-radius(@border-radius);
-      }
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/panels.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/panels.less
deleted file mode 100644
index cf453de..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/panels.less
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Panels
-
-.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
-  border-color: @border;
-
-  & > .panel-heading {
-    color: @heading-text-color;
-    background-color: @heading-bg-color;
-    border-color: @heading-border;
-
-    + .panel-collapse > .panel-body {
-      border-top-color: @border;
-    }
-    .badge {
-      color: @heading-bg-color;
-      background-color: @heading-text-color;
-    }
-  }
-  & > .panel-footer {
-    + .panel-collapse > .panel-body {
-      border-bottom-color: @border;
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/progress-bar.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/progress-bar.less
deleted file mode 100644
index ec25c47..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/progress-bar.less
+++ /dev/null
@@ -1,33 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Progress bars
-
-.progress-bar-variant(@color) {
-  background-color: @color;
-
-  // Deprecated parent class requirement as of v3.2.0
-  .progress-striped & {
-    #gradient > .striped();
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/reset-filter.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/reset-filter.less
deleted file mode 100644
index 22b4bd8..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/reset-filter.less
+++ /dev/null
@@ -1,31 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Reset filters for IE
-//
-// When you need to remove a gradient background, do not forget to use this to reset
-// the IE filter for IE9 and below.
-
-.reset-filter() {
-  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/reset-text.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/reset-text.less
deleted file mode 100644
index 22e2b74..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/reset-text.less
+++ /dev/null
@@ -1,41 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-.reset-text() {
-  font-family: @font-family-base;
-  // We deliberately do NOT reset font-size.
-  font-style: normal;
-  font-weight: normal;
-  letter-spacing: normal;
-  line-break: auto;
-  line-height: @line-height-base;
-  text-align: left; // Fallback for where `start` is not supported
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  white-space: normal;
-  word-break: normal;
-  word-spacing: normal;
-  word-wrap: normal;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/resize.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/resize.less
deleted file mode 100644
index cca90d2..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/resize.less
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Resize anything
-
-.resizable(@direction) {
-  resize: @direction; // Options: horizontal, vertical, both
-  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/responsive-visibility.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/responsive-visibility.less
deleted file mode 100644
index 4b4a789..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/responsive-visibility.less
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Responsive utilities
-
-//
-// More easily include all the states for responsive-utilities.less.
-.responsive-visibility() {
-  display: block !important;
-  table&  { display: table !important; }
-  tr&     { display: table-row !important; }
-  th&,
-  td&     { display: table-cell !important; }
-}
-
-.responsive-invisibility() {
-  display: none !important;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/size.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/size.less
deleted file mode 100644
index 6d47c16..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/size.less
+++ /dev/null
@@ -1,33 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Sizing shortcuts
-
-.size(@width; @height) {
-  width: @width;
-  height: @height;
-}
-
-.square(@size) {
-  .size(@size; @size);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/tab-focus.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/tab-focus.less
deleted file mode 100644
index 8d75030..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/tab-focus.less
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// WebKit-style focus
-
-.tab-focus() {
-  // WebKit-specific. Other browsers will keep their default outline style.
-  // (Initially tried to also force default via `outline: initial`,
-  // but that seems to erroneously remove the outline in Firefox altogether.)
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/table-row.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/table-row.less
deleted file mode 100644
index 4921d03..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/table-row.less
+++ /dev/null
@@ -1,51 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Tables
-
-.table-row-variant(@state; @background) {
-  // Exact selectors below required to override `.table-striped` and prevent
-  // inheritance to nested tables.
-  .table > thead > tr,
-  .table > tbody > tr,
-  .table > tfoot > tr {
-    > td.@{state},
-    > th.@{state},
-    &.@{state} > td,
-    &.@{state} > th {
-      background-color: @background;
-    }
-  }
-
-  // Hover states for `.table-hover`
-  // Note: this is not available for cells or rows within `thead` or `tfoot`.
-  .table-hover > tbody > tr {
-    > td.@{state}:hover,
-    > th.@{state}:hover,
-    &.@{state}:hover > td,
-    &:hover > .@{state},
-    &.@{state}:hover > th {
-      background-color: darken(@background, 5%);
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/text-emphasis.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/text-emphasis.less
deleted file mode 100644
index f9ede59..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/text-emphasis.less
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Typography
-
-.text-emphasis-variant(@color) {
-  color: @color;
-  a&:hover,
-  a&:focus {
-    color: darken(@color, 10%);
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/text-overflow.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/text-overflow.less
deleted file mode 100644
index d6f9716..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/text-overflow.less
+++ /dev/null
@@ -1,31 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Text overflow
-// Requires inline-block or block for proper styling
-
-.text-overflow() {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/vendor-prefixes.less b/framework/crawler-ui/src/main/less/bootstrap-less/mixins/vendor-prefixes.less
deleted file mode 100644
index 177a764..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/mixins/vendor-prefixes.less
+++ /dev/null
@@ -1,250 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Vendor Prefixes
-//
-// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
-// Autoprefixer in our Gruntfile. They have been removed in v4.
-
-// - Animations
-// - Backface visibility
-// - Box shadow
-// - Box sizing
-// - Content columns
-// - Hyphens
-// - Placeholder text
-// - Transformations
-// - Transitions
-// - User Select
-
-
-// Animations
-.animation(@animation) {
-  -webkit-animation: @animation;
-       -o-animation: @animation;
-          animation: @animation;
-}
-.animation-name(@name) {
-  -webkit-animation-name: @name;
-          animation-name: @name;
-}
-.animation-duration(@duration) {
-  -webkit-animation-duration: @duration;
-          animation-duration: @duration;
-}
-.animation-timing-function(@timing-function) {
-  -webkit-animation-timing-function: @timing-function;
-          animation-timing-function: @timing-function;
-}
-.animation-delay(@delay) {
-  -webkit-animation-delay: @delay;
-          animation-delay: @delay;
-}
-.animation-iteration-count(@iteration-count) {
-  -webkit-animation-iteration-count: @iteration-count;
-          animation-iteration-count: @iteration-count;
-}
-.animation-direction(@direction) {
-  -webkit-animation-direction: @direction;
-          animation-direction: @direction;
-}
-.animation-fill-mode(@fill-mode) {
-  -webkit-animation-fill-mode: @fill-mode;
-          animation-fill-mode: @fill-mode;
-}
-
-// Backface visibility
-// Prevent browsers from flickering when using CSS 3D transforms.
-// Default value is `visible`, but can be changed to `hidden`
-
-.backface-visibility(@visibility) {
-  -webkit-backface-visibility: @visibility;
-     -moz-backface-visibility: @visibility;
-          backface-visibility: @visibility;
-}
-
-// Drop shadows
-//
-// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
-// supported browsers that have box shadow capabilities now support it.
-
-.box-shadow(@shadow) {
-  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
-          box-shadow: @shadow;
-}
-
-// Box sizing
-.box-sizing(@boxmodel) {
-  -webkit-box-sizing: @boxmodel;
-     -moz-box-sizing: @boxmodel;
-          box-sizing: @boxmodel;
-}
-
-// CSS3 Content Columns
-.content-columns(@column-count; @column-gap: @grid-gutter-width) {
-  -webkit-column-count: @column-count;
-     -moz-column-count: @column-count;
-          column-count: @column-count;
-  -webkit-column-gap: @column-gap;
-     -moz-column-gap: @column-gap;
-          column-gap: @column-gap;
-}
-
-// Optional hyphenation
-.hyphens(@mode: auto) {
-  word-wrap: break-word;
-  -webkit-hyphens: @mode;
-     -moz-hyphens: @mode;
-      -ms-hyphens: @mode; // IE10+
-       -o-hyphens: @mode;
-          hyphens: @mode;
-}
-
-// Placeholder text
-.placeholder(@color: @input-color-placeholder) {
-  // Firefox
-  &::-moz-placeholder {
-    color: @color;
-    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
-  }
-  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+
-  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome
-}
-
-// Transformations
-.scale(@ratio) {
-  -webkit-transform: scale(@ratio);
-      -ms-transform: scale(@ratio); // IE9 only
-       -o-transform: scale(@ratio);
-          transform: scale(@ratio);
-}
-.scale(@ratioX; @ratioY) {
-  -webkit-transform: scale(@ratioX, @ratioY);
-      -ms-transform: scale(@ratioX, @ratioY); // IE9 only
-       -o-transform: scale(@ratioX, @ratioY);
-          transform: scale(@ratioX, @ratioY);
-}
-.scaleX(@ratio) {
-  -webkit-transform: scaleX(@ratio);
-      -ms-transform: scaleX(@ratio); // IE9 only
-       -o-transform: scaleX(@ratio);
-          transform: scaleX(@ratio);
-}
-.scaleY(@ratio) {
-  -webkit-transform: scaleY(@ratio);
-      -ms-transform: scaleY(@ratio); // IE9 only
-       -o-transform: scaleY(@ratio);
-          transform: scaleY(@ratio);
-}
-.skew(@x; @y) {
-  -webkit-transform: skewX(@x) skewY(@y);
-      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
-       -o-transform: skewX(@x) skewY(@y);
-          transform: skewX(@x) skewY(@y);
-}
-.translate(@x; @y) {
-  -webkit-transform: translate(@x, @y);
-      -ms-transform: translate(@x, @y); // IE9 only
-       -o-transform: translate(@x, @y);
-          transform: translate(@x, @y);
-}
-.translate3d(@x; @y; @z) {
-  -webkit-transform: translate3d(@x, @y, @z);
-          transform: translate3d(@x, @y, @z);
-}
-.rotate(@degrees) {
-  -webkit-transform: rotate(@degrees);
-      -ms-transform: rotate(@degrees); // IE9 only
-       -o-transform: rotate(@degrees);
-          transform: rotate(@degrees);
-}
-.rotateX(@degrees) {
-  -webkit-transform: rotateX(@degrees);
-      -ms-transform: rotateX(@degrees); // IE9 only
-       -o-transform: rotateX(@degrees);
-          transform: rotateX(@degrees);
-}
-.rotateY(@degrees) {
-  -webkit-transform: rotateY(@degrees);
-      -ms-transform: rotateY(@degrees); // IE9 only
-       -o-transform: rotateY(@degrees);
-          transform: rotateY(@degrees);
-}
-.perspective(@perspective) {
-  -webkit-perspective: @perspective;
-     -moz-perspective: @perspective;
-          perspective: @perspective;
-}
-.perspective-origin(@perspective) {
-  -webkit-perspective-origin: @perspective;
-     -moz-perspective-origin: @perspective;
-          perspective-origin: @perspective;
-}
-.transform-origin(@origin) {
-  -webkit-transform-origin: @origin;
-     -moz-transform-origin: @origin;
-      -ms-transform-origin: @origin; // IE9 only
-          transform-origin: @origin;
-}
-
-
-// Transitions
-
-.transition(@transition) {
-  -webkit-transition: @transition;
-       -o-transition: @transition;
-          transition: @transition;
-}
-.transition-property(@transition-property) {
-  -webkit-transition-property: @transition-property;
-          transition-property: @transition-property;
-}
-.transition-delay(@transition-delay) {
-  -webkit-transition-delay: @transition-delay;
-          transition-delay: @transition-delay;
-}
-.transition-duration(@transition-duration) {
-  -webkit-transition-duration: @transition-duration;
-          transition-duration: @transition-duration;
-}
-.transition-timing-function(@timing-function) {
-  -webkit-transition-timing-function: @timing-function;
-          transition-timing-function: @timing-function;
-}
-.transition-transform(@transition) {
-  -webkit-transition: -webkit-transform @transition;
-     -moz-transition: -moz-transform @transition;
-       -o-transition: -o-transform @transition;
-          transition: transform @transition;
-}
-
-
-// User select
-// For selecting text on the page
-
-.user-select(@select) {
-  -webkit-user-select: @select;
-     -moz-user-select: @select;
-      -ms-user-select: @select; // IE10+
-          user-select: @select;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/modals.less b/framework/crawler-ui/src/main/less/bootstrap-less/modals.less
deleted file mode 100644
index ae6bb73..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/modals.less
+++ /dev/null
@@ -1,173 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Modals
-// --------------------------------------------------
-
-// .modal-open      - body class for killing the scroll
-// .modal           - container to scroll within
-// .modal-dialog    - positioning shell for the actual modal
-// .modal-content   - actual modal w/ bg and corners and shit
-
-// Kill the scroll on the body
-.modal-open {
-  overflow: hidden;
-}
-
-// Container that the modal scrolls within
-.modal {
-  display: none;
-  overflow: hidden;
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: @zindex-modal;
-  -webkit-overflow-scrolling: touch;
-
-  // Prevent Chrome on Windows from adding a focus outline. For details, see
-  // https://github.com/twbs/bootstrap/pull/10951.
-  outline: 0;
-
-  // When fading in the modal, animate it to slide down
-  &.fade .modal-dialog {
-    .translate(0, -25%);
-    .transition-transform(~"0.3s ease-out");
-  }
-  &.in .modal-dialog { .translate(0, 0) }
-}
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-// Shell div to position the modal with bottom padding
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-}
-
-// Actual modal
-.modal-content {
-  position: relative;
-  background-color: @modal-content-bg;
-  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
-  border: 1px solid @modal-content-border-color;
-  border-radius: @border-radius-large;
-  .box-shadow(0 3px 9px rgba(0,0,0,.5));
-  background-clip: padding-box;
-  // Remove focus outline from opened modal
-  outline: 0;
-}
-
-// Modal background
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: @zindex-modal-background;
-  background-color: @modal-backdrop-bg;
-  // Fade for backdrop
-  &.fade { .opacity(0); }
-  &.in { .opacity(@modal-backdrop-opacity); }
-}
-
-// Modal header
-// Top section of the modal w/ title and dismiss
-.modal-header {
-  padding: @modal-title-padding;
-  border-bottom: 1px solid @modal-header-border-color;
-  &:extend(.clearfix all);
-}
-// Close icon
-.modal-header .close {
-  margin-top: -2px;
-}
-
-// Title text within header
-.modal-title {
-  margin: 0;
-  line-height: @modal-title-line-height;
-}
-
-// Modal body
-// Where all modal content resides (sibling of .modal-header and .modal-footer)
-.modal-body {
-  position: relative;
-  padding: @modal-inner-padding;
-}
-
-// Footer (for actions)
-.modal-footer {
-  padding: @modal-inner-padding;
-  text-align: right; // right align buttons
-  border-top: 1px solid @modal-footer-border-color;
-  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons
-
-  // Properly space out buttons
-  .btn + .btn {
-    margin-left: 5px;
-    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
-  }
-  // but override that for button groups
-  .btn-group .btn + .btn {
-    margin-left: -1px;
-  }
-  // and override it for block buttons as well
-  .btn-block + .btn-block {
-    margin-left: 0;
-  }
-}
-
-// Measure scrollbar width for padding body during modal show/hide
-.modal-scrollbar-measure {
-  position: absolute;
-  top: -9999px;
-  width: 50px;
-  height: 50px;
-  overflow: scroll;
-}
-
-// Scale up the modal
-@media (min-width: @screen-sm-min) {
-  // Automatically set modal's width for larger viewports
-  .modal-dialog {
-    width: @modal-md;
-    margin: 30px auto;
-  }
-  .modal-content {
-    .box-shadow(0 5px 15px rgba(0,0,0,.5));
-  }
-
-  // Modal sizes
-  .modal-sm { width: @modal-sm; }
-}
-
-@media (min-width: @screen-md-min) {
-  .modal-lg { width: @modal-lg; }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/navbar.less b/framework/crawler-ui/src/main/less/bootstrap-less/navbar.less
deleted file mode 100644
index d69fc1c..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/navbar.less
+++ /dev/null
@@ -1,683 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Navbars
-// --------------------------------------------------
-
-
-// Wrapper and base class
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
-  position: relative;
-  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
-  margin-bottom: @navbar-margin-bottom;
-  border: 1px solid transparent;
-
-  // Prevent floats from breaking the navbar
-  &:extend(.clearfix all);
-
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: @navbar-border-radius;
-  }
-}
-
-
-// Navbar heading
-//
-// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
-// styling of responsive aspects.
-
-.navbar-header {
-  &:extend(.clearfix all);
-
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-  }
-}
-
-
-// Navbar collapse (body)
-//
-// Group your navbar content into this for easy collapsing and expanding across
-// various device sizes. By default, this content is collapsed when <768px, but
-// will expand past that for a horizontal display.
-//
-// To start (on mobile devices) the navbar links, forms, and buttons are stacked
-// vertically and include a `max-height` to overflow in case you have too much
-// content for the user's viewport.
-
-.navbar-collapse {
-  overflow-x: visible;
-  padding-right: @navbar-padding-horizontal;
-  padding-left:  @navbar-padding-horizontal;
-  border-top: 1px solid transparent;
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
-  &:extend(.clearfix all);
-  -webkit-overflow-scrolling: touch;
-
-  &.in {
-    overflow-y: auto;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    width: auto;
-    border-top: 0;
-    box-shadow: none;
-
-    &.collapse {
-      display: block !important;
-      height: auto !important;
-      padding-bottom: 0; // Override default setting
-      overflow: visible !important;
-    }
-
-    &.in {
-      overflow-y: visible;
-    }
-
-    // Undo the collapse side padding for navbars with containers to ensure
-    // alignment of right-aligned contents.
-    .navbar-fixed-top &,
-    .navbar-static-top &,
-    .navbar-fixed-bottom & {
-      padding-left: 0;
-      padding-right: 0;
-    }
-  }
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  .navbar-collapse {
-    max-height: @navbar-collapse-max-height;
-
-    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {
-      max-height: 200px;
-    }
-  }
-}
-
-
-// Both navbar header and collapse
-//
-// When a container is present, change the behavior of the header and collapse.
-
-.container,
-.container-fluid {
-  > .navbar-header,
-  > .navbar-collapse {
-    margin-right: -@navbar-padding-horizontal;
-    margin-left:  -@navbar-padding-horizontal;
-
-    @media (min-width: @grid-float-breakpoint) {
-      margin-right: 0;
-      margin-left:  0;
-    }
-  }
-}
-
-
-//
-// Navbar alignment options
-//
-// Display the navbar across the entirety of the page or fixed it to the top or
-// bottom of the page.
-
-// Static top (unfixed, but 100% wide) navbar
-.navbar-static-top {
-  z-index: @zindex-navbar;
-  border-width: 0 0 1px;
-
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: 0;
-  }
-}
-
-// Fix the top/bottom navbars when screen real estate supports it
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: @zindex-navbar-fixed;
-
-  // Undo the rounded corners
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0; // override .navbar defaults
-  border-width: 1px 0 0;
-}
-
-
-// Brand/project name
-
-.navbar-brand {
-  float: left;
-  padding: @navbar-padding-vertical @navbar-padding-horizontal;
-  font-size: @font-size-large;
-  line-height: @line-height-computed;
-  height: @navbar-height;
-
-  &:hover,
-  &:focus {
-    text-decoration: none;
-  }
-
-  > img {
-    display: block;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    .navbar > .container &,
-    .navbar > .container-fluid & {
-      margin-left: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Navbar toggle
-//
-// Custom button for toggling the `.navbar-collapse`, powered by the collapse
-// JavaScript plugin.
-
-.navbar-toggle {
-  position: relative;
-  float: right;
-  margin-right: @navbar-padding-horizontal;
-  padding: 9px 10px;
-  .navbar-vertical-align(34px);
-  background-color: transparent;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid transparent;
-  border-radius: @border-radius-base;
-
-  // We remove the `outline` here, but later compensate by attaching `:hover`
-  // styles to `:focus`.
-  &:focus {
-    outline: 0;
-  }
-
-  // Bars
-  .icon-bar {
-    display: block;
-    width: 22px;
-    height: 2px;
-    border-radius: 1px;
-  }
-  .icon-bar + .icon-bar {
-    margin-top: 4px;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    display: none;
-  }
-}
-
-
-// Navbar nav links
-//
-// Builds on top of the `.nav` components with its own modifier class to make
-// the nav the full height of the horizontal nav (above 768px).
-
-.navbar-nav {
-  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
-
-  > li > a {
-    padding-top:    10px;
-    padding-bottom: 10px;
-    line-height: @line-height-computed;
-  }
-
-  @media (max-width: @grid-float-breakpoint-max) {
-    // Dropdowns get custom display when collapsed
-    .open .dropdown-menu {
-      position: static;
-      float: none;
-      width: auto;
-      margin-top: 0;
-      background-color: transparent;
-      border: 0;
-      box-shadow: none;
-      > li > a,
-      .dropdown-header {
-        padding: 5px 15px 5px 25px;
-      }
-      > li > a {
-        line-height: @line-height-computed;
-        &:hover,
-        &:focus {
-          background-image: none;
-        }
-      }
-    }
-  }
-
-  // Uncollapse the nav
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-    margin: 0;
-
-    > li {
-      float: left;
-      > a {
-        padding-top:    @navbar-padding-vertical;
-        padding-bottom: @navbar-padding-vertical;
-      }
-    }
-  }
-}
-
-
-// Navbar form
-//
-// Extension of the `.form-inline` with some extra flavor for optimum display in
-// our navbars.
-
-.navbar-form {
-  margin-left: -@navbar-padding-horizontal;
-  margin-right: -@navbar-padding-horizontal;
-  padding: 10px @navbar-padding-horizontal;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-  .box-shadow(@shadow);
-
-  // Mixin behavior for optimum display
-  .form-inline();
-
-  .form-group {
-    @media (max-width: @grid-float-breakpoint-max) {
-      margin-bottom: 5px;
-
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-  }
-
-  // Vertically center in expanded, horizontal navbar
-  .navbar-vertical-align(@input-height-base);
-
-  // Undo 100% width for pull classes
-  @media (min-width: @grid-float-breakpoint) {
-    width: auto;
-    border: 0;
-    margin-left: 0;
-    margin-right: 0;
-    padding-top: 0;
-    padding-bottom: 0;
-    .box-shadow(none);
-  }
-}
-
-
-// Dropdown menus
-
-// Menu position and menu carets
-.navbar-nav > li > .dropdown-menu {
-  margin-top: 0;
-  .border-top-radius(0);
-}
-// Menu position and menu caret support for dropups via extra dropup class
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
-  margin-bottom: 0;
-  .border-top-radius(@navbar-border-radius);
-  .border-bottom-radius(0);
-}
-
-
-// Buttons in navbars
-//
-// Vertically center a button within a navbar (when *not* in a form).
-
-.navbar-btn {
-  .navbar-vertical-align(@input-height-base);
-
-  &.btn-sm {
-    .navbar-vertical-align(@input-height-small);
-  }
-  &.btn-xs {
-    .navbar-vertical-align(22);
-  }
-}
-
-
-// Text in navbars
-//
-// Add a class to make any element properly align itself vertically within the navbars.
-
-.navbar-text {
-  .navbar-vertical-align(@line-height-computed);
-
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-    margin-left: @navbar-padding-horizontal;
-    margin-right: @navbar-padding-horizontal;
-  }
-}
-
-
-// Component alignment
-//
-// Repurpose the pull utilities as their own navbar utilities to avoid specificity
-// issues with parents and chaining. Only do this when the navbar is uncollapsed
-// though so that navbar contents properly stack and align in mobile.
-//
-// Declared after the navbar components to ensure more specificity on the margins.
-
-@media (min-width: @grid-float-breakpoint) {
-  .navbar-left  { .pull-left(); }
-  .navbar-right {
-    .pull-right();
-    margin-right: -@navbar-padding-horizontal;
-
-    ~ .navbar-right {
-      margin-right: 0;
-    }
-  }
-}
-
-
-// Alternate navbars
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
-  background-color: @navbar-default-bg;
-  border-color: @navbar-default-border;
-
-  .navbar-brand {
-    color: @navbar-default-brand-color;
-    &:hover,
-    &:focus {
-      color: @navbar-default-brand-hover-color;
-      background-color: @navbar-default-brand-hover-bg;
-    }
-  }
-
-  .navbar-text {
-    color: @navbar-default-color;
-  }
-
-  .navbar-nav {
-    > li > a {
-      color: @navbar-default-link-color;
-
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-hover-color;
-        background-color: @navbar-default-link-hover-bg;
-      }
-    }
-    > .active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-active-color;
-        background-color: @navbar-default-link-active-bg;
-      }
-    }
-    > .disabled > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-disabled-color;
-        background-color: @navbar-default-link-disabled-bg;
-      }
-    }
-  }
-
-  .navbar-toggle {
-    border-color: @navbar-default-toggle-border-color;
-    &:hover,
-    &:focus {
-      background-color: @navbar-default-toggle-hover-bg;
-    }
-    .icon-bar {
-      background-color: @navbar-default-toggle-icon-bar-bg;
-    }
-  }
-
-  .navbar-collapse,
-  .navbar-form {
-    border-color: @navbar-default-border;
-  }
-
-  // Dropdown menu items
-  .navbar-nav {
-    // Remove background color from open dropdown
-    > .open > a {
-      &,
-      &:hover,
-      &:focus {
-        background-color: @navbar-default-link-active-bg;
-        color: @navbar-default-link-active-color;
-      }
-    }
-
-    @media (max-width: @grid-float-breakpoint-max) {
-      // Dropdowns get custom display when collapsed
-      .open .dropdown-menu {
-        > li > a {
-          color: @navbar-default-link-color;
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-hover-color;
-            background-color: @navbar-default-link-hover-bg;
-          }
-        }
-        > .active > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-active-color;
-            background-color: @navbar-default-link-active-bg;
-          }
-        }
-        > .disabled > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-disabled-color;
-            background-color: @navbar-default-link-disabled-bg;
-          }
-        }
-      }
-    }
-  }
-
-
-  // Links in navbars
-  //
-  // Add a class to ensure links outside the navbar nav are colored correctly.
-
-  .navbar-link {
-    color: @navbar-default-link-color;
-    &:hover {
-      color: @navbar-default-link-hover-color;
-    }
-  }
-
-  .btn-link {
-    color: @navbar-default-link-color;
-    &:hover,
-    &:focus {
-      color: @navbar-default-link-hover-color;
-    }
-    &[disabled],
-    fieldset[disabled] & {
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-disabled-color;
-      }
-    }
-  }
-}
-
-// Inverse navbar
-
-.navbar-inverse {
-  background-color: @navbar-inverse-bg;
-  border-color: @navbar-inverse-border;
-
-  .navbar-brand {
-    color: @navbar-inverse-brand-color;
-    &:hover,
-    &:focus {
-      color: @navbar-inverse-brand-hover-color;
-      background-color: @navbar-inverse-brand-hover-bg;
-    }
-  }
-
-  .navbar-text {
-    color: @navbar-inverse-color;
-  }
-
-  .navbar-nav {
-    > li > a {
-      color: @navbar-inverse-link-color;
-
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-hover-color;
-        background-color: @navbar-inverse-link-hover-bg;
-      }
-    }
-    > .active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-active-color;
-        background-color: @navbar-inverse-link-active-bg;
-      }
-    }
-    > .disabled > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-disabled-color;
-        background-color: @navbar-inverse-link-disabled-bg;
-      }
-    }
-  }
-
-  // Darken the responsive nav toggle
-  .navbar-toggle {
-    border-color: @navbar-inverse-toggle-border-color;
-    &:hover,
-    &:focus {
-      background-color: @navbar-inverse-toggle-hover-bg;
-    }
-    .icon-bar {
-      background-color: @navbar-inverse-toggle-icon-bar-bg;
-    }
-  }
-
-  .navbar-collapse,
-  .navbar-form {
-    border-color: darken(@navbar-inverse-bg, 7%);
-  }
-
-  // Dropdowns
-  .navbar-nav {
-    > .open > a {
-      &,
-      &:hover,
-      &:focus {
-        background-color: @navbar-inverse-link-active-bg;
-        color: @navbar-inverse-link-active-color;
-      }
-    }
-
-    @media (max-width: @grid-float-breakpoint-max) {
-      // Dropdowns get custom display
-      .open .dropdown-menu {
-        > .dropdown-header {
-          border-color: @navbar-inverse-border;
-        }
-        .divider {
-          background-color: @navbar-inverse-border;
-        }
-        > li > a {
-          color: @navbar-inverse-link-color;
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-hover-color;
-            background-color: @navbar-inverse-link-hover-bg;
-          }
-        }
-        > .active > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-active-color;
-            background-color: @navbar-inverse-link-active-bg;
-          }
-        }
-        > .disabled > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-disabled-color;
-            background-color: @navbar-inverse-link-disabled-bg;
-          }
-        }
-      }
-    }
-  }
-
-  .navbar-link {
-    color: @navbar-inverse-link-color;
-    &:hover {
-      color: @navbar-inverse-link-hover-color;
-    }
-  }
-
-  .btn-link {
-    color: @navbar-inverse-link-color;
-    &:hover,
-    &:focus {
-      color: @navbar-inverse-link-hover-color;
-    }
-    &[disabled],
-    fieldset[disabled] & {
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-disabled-color;
-      }
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/navs.less b/framework/crawler-ui/src/main/less/bootstrap-less/navs.less
deleted file mode 100644
index 24d3c2b..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/navs.less
+++ /dev/null
@@ -1,265 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Navs
-// --------------------------------------------------
-
-
-// Base class
-// --------------------------------------------------
-
-.nav {
-  margin-bottom: 0;
-  padding-left: 0; // Override default ul/ol
-  list-style: none;
-  &:extend(.clearfix all);
-
-  > li {
-    position: relative;
-    display: block;
-
-    > a {
-      position: relative;
-      display: block;
-      padding: @nav-link-padding;
-      &:hover,
-      &:focus {
-        text-decoration: none;
-        background-color: @nav-link-hover-bg;
-      }
-    }
-
-    // Disabled state sets text to gray and nukes hover/tab effects
-    &.disabled > a {
-      color: @nav-disabled-link-color;
-
-      &:hover,
-      &:focus {
-        color: @nav-disabled-link-hover-color;
-        text-decoration: none;
-        background-color: transparent;
-        cursor: @cursor-disabled;
-      }
-    }
-  }
-
-  // Open dropdowns
-  .open > a {
-    &,
-    &:hover,
-    &:focus {
-      background-color: @nav-link-hover-bg;
-      border-color: @link-color;
-    }
-  }
-
-  // Nav dividers (deprecated with v3.0.1)
-  //
-  // This should have been removed in v3 with the dropping of `.nav-list`, but
-  // we missed it. We don't currently support this anywhere, but in the interest
-  // of maintaining backward compatibility in case you use it, it's deprecated.
-  .nav-divider {
-    .nav-divider();
-  }
-
-  // Prevent IE8 from misplacing imgs
-  //
-  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
-  > li > a > img {
-    max-width: none;
-  }
-}
-
-
-// Tabs
-// -------------------------
-
-// Give the tabs something to sit on
-.nav-tabs {
-  border-bottom: 1px solid @nav-tabs-border-color;
-  > li {
-    float: left;
-    // Make the list-items overlay the bottom border
-    margin-bottom: -1px;
-
-    // Actual tabs (as links)
-    > a {
-      margin-right: 2px;
-      line-height: @line-height-base;
-      border: 1px solid transparent;
-      border-radius: @border-radius-base @border-radius-base 0 0;
-      &:hover {
-        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
-      }
-    }
-
-    // Active state, and its :hover to override normal :hover
-    &.active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @nav-tabs-active-link-hover-color;
-        background-color: @nav-tabs-active-link-hover-bg;
-        border: 1px solid @nav-tabs-active-link-hover-border-color;
-        border-bottom-color: transparent;
-        cursor: default;
-      }
-    }
-  }
-  // pulling this in mainly for less shorthand
-  &.nav-justified {
-    .nav-justified();
-    .nav-tabs-justified();
-  }
-}
-
-
-// Pills
-// -------------------------
-.nav-pills {
-  > li {
-    float: left;
-
-    // Links rendered as pills
-    > a {
-      border-radius: @nav-pills-border-radius;
-    }
-    + li {
-      margin-left: 2px;
-    }
-
-    // Active state
-    &.active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @nav-pills-active-link-hover-color;
-        background-color: @nav-pills-active-link-hover-bg;
-      }
-    }
-  }
-}
-
-
-// Stacked pills
-.nav-stacked {
-  > li {
-    float: none;
-    + li {
-      margin-top: 2px;
-      margin-left: 0; // no need for this gap between nav items
-    }
-  }
-}
-
-
-// Nav variations
-// --------------------------------------------------
-
-// Justified nav links
-// -------------------------
-
-.nav-justified {
-  width: 100%;
-
-  > li {
-    float: none;
-    > a {
-      text-align: center;
-      margin-bottom: 5px;
-    }
-  }
-
-  > .dropdown .dropdown-menu {
-    top: auto;
-    left: auto;
-  }
-
-  @media (min-width: @screen-sm-min) {
-    > li {
-      display: table-cell;
-      width: 1%;
-      > a {
-        margin-bottom: 0;
-      }
-    }
-  }
-}
-
-// Move borders to anchors instead of bottom of list
-//
-// Mixin for adding on top the shared `.nav-justified` styles for our tabs
-.nav-tabs-justified {
-  border-bottom: 0;
-
-  > li > a {
-    // Override margin from .nav-tabs
-    margin-right: 0;
-    border-radius: @border-radius-base;
-  }
-
-  > .active > a,
-  > .active > a:hover,
-  > .active > a:focus {
-    border: 1px solid @nav-tabs-justified-link-border-color;
-  }
-
-  @media (min-width: @screen-sm-min) {
-    > li > a {
-      border-bottom: 1px solid @nav-tabs-justified-link-border-color;
-      border-radius: @border-radius-base @border-radius-base 0 0;
-    }
-    > .active > a,
-    > .active > a:hover,
-    > .active > a:focus {
-      border-bottom-color: @nav-tabs-justified-active-link-border-color;
-    }
-  }
-}
-
-
-// Tabbable tabs
-// -------------------------
-
-// Hide tabbable panes to start, show them when `.active`
-.tab-content {
-  > .tab-pane {
-    display: none;
-  }
-  > .active {
-    display: block;
-  }
-}
-
-
-// Dropdowns
-// -------------------------
-
-// Specific dropdowns
-.nav-tabs .dropdown-menu {
-  // make dropdown border overlap tab border
-  margin-top: -1px;
-  // Remove the top rounded corners here since there is a hard edge above the menu
-  .border-top-radius(0);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/normalize.less b/framework/crawler-ui/src/main/less/bootstrap-less/normalize.less
deleted file mode 100644
index d1b168c..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/normalize.less
+++ /dev/null
@@ -1,447 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-
-//
-// 1. Set default font family to sans-serif.
-// 2. Prevent iOS and IE text size adjust after device orientation change,
-//    without disabling user zoom.
-//
-
-html {
-  font-family: sans-serif; // 1
-  -ms-text-size-adjust: 100%; // 2
-  -webkit-text-size-adjust: 100%; // 2
-}
-
-//
-// Remove default margin.
-//
-
-body {
-  margin: 0;
-}
-
-// HTML5 display definitions
-// ==========================================================================
-
-//
-// Correct `block` display not defined for any HTML5 element in IE 8/9.
-// Correct `block` display not defined for `details` or `summary` in IE 10/11
-// and Firefox.
-// Correct `block` display not defined for `main` in IE 11.
-//
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
-  display: block;
-}
-
-//
-// 1. Correct `inline-block` display not defined in IE 8/9.
-// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
-//
-
-audio,
-canvas,
-progress,
-video {
-  display: inline-block; // 1
-  vertical-align: baseline; // 2
-}
-
-//
-// Prevent modern browsers from displaying `audio` without controls.
-// Remove excess height in iOS 5 devices.
-//
-
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-//
-// Address `[hidden]` styling not present in IE 8/9/10.
-// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
-//
-
-[hidden],
-template {
-  display: none;
-}
-
-// Links
-// ==========================================================================
-
-//
-// Remove the gray background color from active links in IE 10.
-//
-
-a {
-  background-color: transparent;
-}
-
-//
-// Improve readability of focused elements when they are also in an
-// active/hover state.
-//
-
-a:active,
-a:hover {
-  outline: 0;
-}
-
-// Text-level semantics
-// ==========================================================================
-
-//
-// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
-//
-
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-
-//
-// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
-//
-
-b,
-strong {
-  font-weight: bold;
-}
-
-//
-// Address styling not present in Safari and Chrome.
-//
-
-dfn {
-  font-style: italic;
-}
-
-//
-// Address variable `h1` font-size and margin within `section` and `article`
-// contexts in Firefox 4+, Safari, and Chrome.
-//
-
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-//
-// Address styling not present in IE 8/9.
-//
-
-mark {
-  background: #ff0;
-  color: #000;
-}
-
-//
-// Address inconsistent and variable font size in all browsers.
-//
-
-small {
-  font-size: 80%;
-}
-
-//
-// Prevent `sub` and `sup` affecting `line-height` in all browsers.
-//
-
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-// Embedded content
-// ==========================================================================
-
-//
-// Remove border when inside `a` element in IE 8/9/10.
-//
-
-img {
-  border: 0;
-}
-
-//
-// Correct overflow not hidden in IE 9/10/11.
-//
-
-svg:not(:root) {
-  overflow: hidden;
-}
-
-// Grouping content
-// ==========================================================================
-
-//
-// Address margin not present in IE 8/9 and Safari.
-//
-
-figure {
-  margin: 1em 40px;
-}
-
-//
-// Address differences between Firefox and other browsers.
-//
-
-hr {
-  box-sizing: content-box;
-  height: 0;
-}
-
-//
-// Contain overflow in all browsers.
-//
-
-pre {
-  overflow: auto;
-}
-
-//
-// Address odd `em`-unit font size rendering in all browsers.
-//
-
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-// Forms
-// ==========================================================================
-
-//
-// Known limitation: by default, Chrome and Safari on OS X allow very limited
-// styling of `select`, unless a `border` property is set.
-//
-
-//
-// 1. Correct color not being inherited.
-//    Known issue: affects color of disabled elements.
-// 2. Correct font properties not being inherited.
-// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
-//
-
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit; // 1
-  font: inherit; // 2
-  margin: 0; // 3
-}
-
-//
-// Address `overflow` set to `hidden` in IE 8/9/10/11.
-//
-
-button {
-  overflow: visible;
-}
-
-//
-// Address inconsistent `text-transform` inheritance for `button` and `select`.
-// All other form control elements do not inherit `text-transform` values.
-// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
-// Correct `select` style inheritance in Firefox.
-//
-
-button,
-select {
-  text-transform: none;
-}
-
-//
-// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
-//    and `video` controls.
-// 2. Correct inability to style clickable `input` types in iOS.
-// 3. Improve usability and consistency of cursor style between image-type
-//    `input` and others.
-//
-
-button,
-html input[type="button"], // 1
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button; // 2
-  cursor: pointer; // 3
-}
-
-//
-// Re-set default cursor for disabled elements.
-//
-
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-
-//
-// Remove inner padding and border in Firefox 4+.
-//
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-
-//
-// Address Firefox 4+ setting `line-height` on `input` using `!important` in
-// the UA stylesheet.
-//
-
-input {
-  line-height: normal;
-}
-
-//
-// It's recommended that you don't attempt to style these elements.
-// Firefox's implementation doesn't respect box-sizing, padding, or width.
-//
-// 1. Address box sizing set to `content-box` in IE 8/9/10.
-// 2. Remove excess padding in IE 8/9/10.
-//
-
-input[type="checkbox"],
-input[type="radio"] {
-  box-sizing: border-box; // 1
-  padding: 0; // 2
-}
-
-//
-// Fix the cursor style for Chrome's increment/decrement buttons. For certain
-// `font-size` values of the `input`, it causes the cursor style of the
-// decrement button to change from `default` to `text`.
-//
-
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-//
-// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
-// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
-//
-
-input[type="search"] {
-  -webkit-appearance: textfield; // 1
-  box-sizing: content-box; //2
-}
-
-//
-// Remove inner padding and search cancel button in Safari and Chrome on OS X.
-// Safari (but not Chrome) clips the cancel button when the search input has
-// padding (and `textfield` appearance).
-//
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-//
-// Define consistent border, margin, and padding.
-//
-
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-
-//
-// 1. Correct `color` not being inherited in IE 8/9/10/11.
-// 2. Remove padding so people aren't caught out if they zero out fieldsets.
-//
-
-legend {
-  border: 0; // 1
-  padding: 0; // 2
-}
-
-//
-// Remove default vertical scrollbar in IE 8/9/10/11.
-//
-
-textarea {
-  overflow: auto;
-}
-
-//
-// Don't inherit the `font-weight` (applied by a rule above).
-// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
-//
-
-optgroup {
-  font-weight: bold;
-}
-
-// Tables
-// ==========================================================================
-
-//
-// Remove most spacing between table cells.
-//
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-td,
-th {
-  padding: 0;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/pager.less b/framework/crawler-ui/src/main/less/bootstrap-less/pager.less
deleted file mode 100644
index 45bf55c..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/pager.less
+++ /dev/null
@@ -1,77 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Pager pagination
-// --------------------------------------------------
-
-
-.pager {
-  padding-left: 0;
-  margin: @line-height-computed 0;
-  list-style: none;
-  text-align: center;
-  &:extend(.clearfix all);
-  li {
-    display: inline;
-    > a,
-    > span {
-      display: inline-block;
-      padding: 5px 14px;
-      background-color: @pager-bg;
-      border: 1px solid @pager-border;
-      border-radius: @pager-border-radius;
-    }
-
-    > a:hover,
-    > a:focus {
-      text-decoration: none;
-      background-color: @pager-hover-bg;
-    }
-  }
-
-  .next {
-    > a,
-    > span {
-      float: right;
-    }
-  }
-
-  .previous {
-    > a,
-    > span {
-      float: left;
-    }
-  }
-
-  .disabled {
-    > a,
-    > a:hover,
-    > a:focus,
-    > span {
-      color: @pager-disabled-color;
-      background-color: @pager-bg;
-      cursor: @cursor-disabled;
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/pagination.less b/framework/crawler-ui/src/main/less/bootstrap-less/pagination.less
deleted file mode 100644
index 5724f6b..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/pagination.less
+++ /dev/null
@@ -1,112 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Pagination (multiple pages)
-// --------------------------------------------------
-.pagination {
-  display: inline-block;
-  padding-left: 0;
-  margin: @line-height-computed 0;
-  border-radius: @border-radius-base;
-
-  > li {
-    display: inline; // Remove list-style and block-level defaults
-    > a,
-    > span {
-      position: relative;
-      float: left; // Collapse white-space
-      padding: @padding-base-vertical @padding-base-horizontal;
-      line-height: @line-height-base;
-      text-decoration: none;
-      color: @pagination-color;
-      background-color: @pagination-bg;
-      border: 1px solid @pagination-border;
-      margin-left: -1px;
-    }
-    &:first-child {
-      > a,
-      > span {
-        margin-left: 0;
-        .border-left-radius(@border-radius-base);
-      }
-    }
-    &:last-child {
-      > a,
-      > span {
-        .border-right-radius(@border-radius-base);
-      }
-    }
-  }
-
-  > li > a,
-  > li > span {
-    &:hover,
-    &:focus {
-      z-index: 2;
-      color: @pagination-hover-color;
-      background-color: @pagination-hover-bg;
-      border-color: @pagination-hover-border;
-    }
-  }
-
-  > .active > a,
-  > .active > span {
-    &,
-    &:hover,
-    &:focus {
-      z-index: 3;
-      color: @pagination-active-color;
-      background-color: @pagination-active-bg;
-      border-color: @pagination-active-border;
-      cursor: default;
-    }
-  }
-
-  > .disabled {
-    > span,
-    > span:hover,
-    > span:focus,
-    > a,
-    > a:hover,
-    > a:focus {
-      color: @pagination-disabled-color;
-      background-color: @pagination-disabled-bg;
-      border-color: @pagination-disabled-border;
-      cursor: @cursor-disabled;
-    }
-  }
-}
-
-// Sizing
-// --------------------------------------------------
-
-// Large
-.pagination-lg {
-  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
-}
-
-// Small
-.pagination-sm {
-  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/panels.less b/framework/crawler-ui/src/main/less/bootstrap-less/panels.less
deleted file mode 100644
index e86d458..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/panels.less
+++ /dev/null
@@ -1,294 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Panels
-// --------------------------------------------------
-
-
-// Base class
-.panel {
-  margin-bottom: @line-height-computed;
-  background-color: @panel-bg;
-  border: 1px solid transparent;
-  border-radius: @panel-border-radius;
-  .box-shadow(0 1px 1px rgba(0,0,0,.05));
-}
-
-// Panel contents
-.panel-body {
-  padding: @panel-body-padding;
-  &:extend(.clearfix all);
-}
-
-// Optional heading
-.panel-heading {
-  padding: @panel-heading-padding;
-  border-bottom: 1px solid transparent;
-  .border-top-radius((@panel-border-radius - 1));
-
-  > .dropdown .dropdown-toggle {
-    color: inherit;
-  }
-}
-
-// Within heading, strip any `h*` tag of its default margins for spacing.
-.panel-title {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: ceil((@font-size-base * 1.125));
-  color: inherit;
-
-  > a,
-  > small,
-  > .small,
-  > small > a,
-  > .small > a {
-    color: inherit;
-  }
-}
-
-// Optional footer (stays gray in every modifier class)
-.panel-footer {
-  padding: @panel-footer-padding;
-  background-color: @panel-footer-bg;
-  border-top: 1px solid @panel-inner-border;
-  .border-bottom-radius((@panel-border-radius - 1));
-}
-
-
-// List groups in panels
-//
-// By default, space out list group content from panel headings to account for
-// any kind of custom content between the two.
-
-.panel {
-  > .list-group,
-  > .panel-collapse > .list-group {
-    margin-bottom: 0;
-
-    .list-group-item {
-      border-width: 1px 0;
-      border-radius: 0;
-    }
-
-    // Add border top radius for first one
-    &:first-child {
-      .list-group-item:first-child {
-        border-top: 0;
-        .border-top-radius((@panel-border-radius - 1));
-      }
-    }
-
-    // Add border bottom radius for last one
-    &:last-child {
-      .list-group-item:last-child {
-        border-bottom: 0;
-        .border-bottom-radius((@panel-border-radius - 1));
-      }
-    }
-  }
-  > .panel-heading + .panel-collapse > .list-group {
-    .list-group-item:first-child {
-      .border-top-radius(0);
-    }
-  }
-}
-// Collapse space between when there's no additional content.
-.panel-heading + .list-group {
-  .list-group-item:first-child {
-    border-top-width: 0;
-  }
-}
-.list-group + .panel-footer {
-  border-top-width: 0;
-}
-
-// Tables in panels
-//
-// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
-// watch it go full width.
-
-.panel {
-  > .table,
-  > .table-responsive > .table,
-  > .panel-collapse > .table {
-    margin-bottom: 0;
-
-    caption {
-      padding-left: @panel-body-padding;
-      padding-right: @panel-body-padding;
-    }
-  }
-  // Add border top radius for first one
-  > .table:first-child,
-  > .table-responsive:first-child > .table:first-child {
-    .border-top-radius((@panel-border-radius - 1));
-
-    > thead:first-child,
-    > tbody:first-child {
-      > tr:first-child {
-        border-top-left-radius: (@panel-border-radius - 1);
-        border-top-right-radius: (@panel-border-radius - 1);
-
-        td:first-child,
-        th:first-child {
-          border-top-left-radius: (@panel-border-radius - 1);
-        }
-        td:last-child,
-        th:last-child {
-          border-top-right-radius: (@panel-border-radius - 1);
-        }
-      }
-    }
-  }
-  // Add border bottom radius for last one
-  > .table:last-child,
-  > .table-responsive:last-child > .table:last-child {
-    .border-bottom-radius((@panel-border-radius - 1));
-
-    > tbody:last-child,
-    > tfoot:last-child {
-      > tr:last-child {
-        border-bottom-left-radius: (@panel-border-radius - 1);
-        border-bottom-right-radius: (@panel-border-radius - 1);
-
-        td:first-child,
-        th:first-child {
-          border-bottom-left-radius: (@panel-border-radius - 1);
-        }
-        td:last-child,
-        th:last-child {
-          border-bottom-right-radius: (@panel-border-radius - 1);
-        }
-      }
-    }
-  }
-  > .panel-body + .table,
-  > .panel-body + .table-responsive,
-  > .table + .panel-body,
-  > .table-responsive + .panel-body {
-    border-top: 1px solid @table-border-color;
-  }
-  > .table > tbody:first-child > tr:first-child th,
-  > .table > tbody:first-child > tr:first-child td {
-    border-top: 0;
-  }
-  > .table-bordered,
-  > .table-responsive > .table-bordered {
-    border: 0;
-    > thead,
-    > tbody,
-    > tfoot {
-      > tr {
-        > th:first-child,
-        > td:first-child {
-          border-left: 0;
-        }
-        > th:last-child,
-        > td:last-child {
-          border-right: 0;
-        }
-      }
-    }
-    > thead,
-    > tbody {
-      > tr:first-child {
-        > td,
-        > th {
-          border-bottom: 0;
-        }
-      }
-    }
-    > tbody,
-    > tfoot {
-      > tr:last-child {
-        > td,
-        > th {
-          border-bottom: 0;
-        }
-      }
-    }
-  }
-  > .table-responsive {
-    border: 0;
-    margin-bottom: 0;
-  }
-}
-
-
-// Collapsible panels (aka, accordion)
-//
-// Wrap a series of panels in `.panel-group` to turn them into an accordion with
-// the help of our collapse JavaScript plugin.
-
-.panel-group {
-  margin-bottom: @line-height-computed;
-
-  // Tighten up margin so it's only between panels
-  .panel {
-    margin-bottom: 0;
-    border-radius: @panel-border-radius;
-
-    + .panel {
-      margin-top: 5px;
-    }
-  }
-
-  .panel-heading {
-    border-bottom: 0;
-
-    + .panel-collapse > .panel-body,
-    + .panel-collapse > .list-group {
-      border-top: 1px solid @panel-inner-border;
-    }
-  }
-
-  .panel-footer {
-    border-top: 0;
-    + .panel-collapse .panel-body {
-      border-bottom: 1px solid @panel-inner-border;
-    }
-  }
-}
-
-
-// Contextual variations
-.panel-default {
-  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
-}
-.panel-primary {
-  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
-}
-.panel-success {
-  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
-}
-.panel-info {
-  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
-}
-.panel-warning {
-  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
-}
-.panel-danger {
-  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/popovers.less b/framework/crawler-ui/src/main/less/bootstrap-less/popovers.less
deleted file mode 100644
index d2a98a5..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/popovers.less
+++ /dev/null
@@ -1,154 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Popovers
-// --------------------------------------------------
-
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: @zindex-popover;
-  display: none;
-  max-width: @popover-max-width;
-  padding: 1px;
-  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
-  // So reset our font and text properties to avoid inheriting weird values.
-  .reset-text();
-  font-size: @font-size-base;
-
-  background-color: @popover-bg;
-  background-clip: padding-box;
-  border: 1px solid @popover-fallback-border-color;
-  border: 1px solid @popover-border-color;
-  border-radius: @border-radius-large;
-  .box-shadow(0 5px 10px rgba(0,0,0,.2));
-
-  // Offset the popover to account for the popover arrow
-  &.top     { margin-top: -@popover-arrow-width; }
-  &.right   { margin-left: @popover-arrow-width; }
-  &.bottom  { margin-top: @popover-arrow-width; }
-  &.left    { margin-left: -@popover-arrow-width; }
-}
-
-.popover-title {
-  margin: 0; // reset heading margin
-  padding: 8px 14px;
-  font-size: @font-size-base;
-  background-color: @popover-title-bg;
-  border-bottom: 1px solid darken(@popover-title-bg, 5%);
-  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;
-}
-
-.popover-content {
-  padding: 9px 14px;
-}
-
-// Arrows
-//
-// .arrow is outer, .arrow:after is inner
-
-.popover > .arrow {
-  &,
-  &:after {
-    position: absolute;
-    display: block;
-    width: 0;
-    height: 0;
-    border-color: transparent;
-    border-style: solid;
-  }
-}
-.popover > .arrow {
-  border-width: @popover-arrow-outer-width;
-}
-.popover > .arrow:after {
-  border-width: @popover-arrow-width;
-  content: "";
-}
-
-.popover {
-  &.top > .arrow {
-    left: 50%;
-    margin-left: -@popover-arrow-outer-width;
-    border-bottom-width: 0;
-    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-top-color: @popover-arrow-outer-color;
-    bottom: -@popover-arrow-outer-width;
-    &:after {
-      content: " ";
-      bottom: 1px;
-      margin-left: -@popover-arrow-width;
-      border-bottom-width: 0;
-      border-top-color: @popover-arrow-color;
-    }
-  }
-  &.right > .arrow {
-    top: 50%;
-    left: -@popover-arrow-outer-width;
-    margin-top: -@popover-arrow-outer-width;
-    border-left-width: 0;
-    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-right-color: @popover-arrow-outer-color;
-    &:after {
-      content: " ";
-      left: 1px;
-      bottom: -@popover-arrow-width;
-      border-left-width: 0;
-      border-right-color: @popover-arrow-color;
-    }
-  }
-  &.bottom > .arrow {
-    left: 50%;
-    margin-left: -@popover-arrow-outer-width;
-    border-top-width: 0;
-    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-bottom-color: @popover-arrow-outer-color;
-    top: -@popover-arrow-outer-width;
-    &:after {
-      content: " ";
-      top: 1px;
-      margin-left: -@popover-arrow-width;
-      border-top-width: 0;
-      border-bottom-color: @popover-arrow-color;
-    }
-  }
-
-  &.left > .arrow {
-    top: 50%;
-    right: -@popover-arrow-outer-width;
-    margin-top: -@popover-arrow-outer-width;
-    border-right-width: 0;
-    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-left-color: @popover-arrow-outer-color;
-    &:after {
-      content: " ";
-      right: 1px;
-      border-right-width: 0;
-      border-left-color: @popover-arrow-color;
-      bottom: -@popover-arrow-width;
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/print.less b/framework/crawler-ui/src/main/less/bootstrap-less/print.less
deleted file mode 100644
index d41690b..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/print.less
+++ /dev/null
@@ -1,124 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
-
-// ==========================================================================
-// Print styles.
-// Inlined to avoid the additional HTTP request: h5bp.com/r
-// ==========================================================================
-
-@media print {
-    *,
-    *:before,
-    *:after {
-        background: transparent !important;
-        color: #000 !important; // Black prints faster: h5bp.com/s
-        box-shadow: none !important;
-        text-shadow: none !important;
-    }
-
-    a,
-    a:visited {
-        text-decoration: underline;
-    }
-
-    a[href]:after {
-        content: " (" attr(href) ")";
-    }
-
-    abbr[title]:after {
-        content: " (" attr(title) ")";
-    }
-
-    // Don't show links that are fragment identifiers,
-    // or use the `javascript:` pseudo protocol
-    a[href^="#"]:after,
-    a[href^="javascript:"]:after {
-        content: "";
-    }
-
-    pre,
-    blockquote {
-        border: 1px solid #999;
-        page-break-inside: avoid;
-    }
-
-    thead {
-        display: table-header-group; // h5bp.com/t
-    }
-
-    tr,
-    img {
-        page-break-inside: avoid;
-    }
-
-    img {
-        max-width: 100% !important;
-    }
-
-    p,
-    h2,
-    h3 {
-        orphans: 3;
-        widows: 3;
-    }
-
-    h2,
-    h3 {
-        page-break-after: avoid;
-    }
-
-    // Bootstrap specific changes start
-
-    // Bootstrap components
-    .navbar {
-        display: none;
-    }
-    .btn,
-    .dropup > .btn {
-        > .caret {
-            border-top-color: #000 !important;
-        }
-    }
-    .label {
-        border: 1px solid #000;
-    }
-
-    .table {
-        border-collapse: collapse !important;
-
-        td,
-        th {
-            background-color: #fff !important;
-        }
-    }
-    .table-bordered {
-        th,
-        td {
-            border: 1px solid #ddd !important;
-        }
-    }
-
-    // Bootstrap specific changes end
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/progress-bars.less b/framework/crawler-ui/src/main/less/bootstrap-less/progress-bars.less
deleted file mode 100644
index 98b9610..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/progress-bars.less
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Progress bars
-// --------------------------------------------------
-
-
-// Bar animations
-// -------------------------
-
-// WebKit
-@-webkit-keyframes progress-bar-stripes {
-  from  { background-position: 40px 0; }
-  to    { background-position: 0 0; }
-}
-
-// Spec and IE10+
-@keyframes progress-bar-stripes {
-  from  { background-position: 40px 0; }
-  to    { background-position: 0 0; }
-}
-
-
-// Bar itself
-// -------------------------
-
-// Outer container
-.progress {
-  overflow: hidden;
-  height: @line-height-computed;
-  margin-bottom: @line-height-computed;
-  background-color: @progress-bg;
-  border-radius: @progress-border-radius;
-  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
-}
-
-// Bar of progress
-.progress-bar {
-  float: left;
-  width: 0%;
-  height: 100%;
-  font-size: @font-size-small;
-  line-height: @line-height-computed;
-  color: @progress-bar-color;
-  text-align: center;
-  background-color: @progress-bar-bg;
-  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
-  .transition(width .6s ease);
-}
-
-// Striped bars
-//
-// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
-// `.progress-bar-striped` class, which you just add to an existing
-// `.progress-bar`.
-.progress-striped .progress-bar,
-.progress-bar-striped {
-  #gradient > .striped();
-  background-size: 40px 40px;
-}
-
-// Call animation for the active one
-//
-// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
-// `.progress-bar.active` approach.
-.progress.active .progress-bar,
-.progress-bar.active {
-  .animation(progress-bar-stripes 2s linear infinite);
-}
-
-
-// Variations
-// -------------------------
-
-.progress-bar-success {
-  .progress-bar-variant(@progress-bar-success-bg);
-}
-
-.progress-bar-info {
-  .progress-bar-variant(@progress-bar-info-bg);
-}
-
-.progress-bar-warning {
-  .progress-bar-variant(@progress-bar-warning-bg);
-}
-
-.progress-bar-danger {
-  .progress-bar-variant(@progress-bar-danger-bg);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/responsive-embed.less b/framework/crawler-ui/src/main/less/bootstrap-less/responsive-embed.less
deleted file mode 100644
index 398cf4b..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/responsive-embed.less
+++ /dev/null
@@ -1,58 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// Embeds responsive
-//
-// Credit: Nicolas Gallagher and SUIT CSS.
-
-.embed-responsive {
-  position: relative;
-  display: block;
-  height: 0;
-  padding: 0;
-  overflow: hidden;
-
-  .embed-responsive-item,
-  iframe,
-  embed,
-  object,
-  video {
-    position: absolute;
-    top: 0;
-    left: 0;
-    bottom: 0;
-    height: 100%;
-    width: 100%;
-    border: 0;
-  }
-}
-
-// Modifier class for 16:9 aspect ratio
-.embed-responsive-16by9 {
-  padding-bottom: 56.25%;
-}
-
-// Modifier class for 4:3 aspect ratio
-.embed-responsive-4by3 {
-  padding-bottom: 75%;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/responsive-utilities.less b/framework/crawler-ui/src/main/less/bootstrap-less/responsive-utilities.less
deleted file mode 100644
index 0ab4f4f..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/responsive-utilities.less
+++ /dev/null
@@ -1,217 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Responsive: Utility classes
-// --------------------------------------------------
-
-
-// IE10 in Windows (Phone) 8
-//
-// Support for responsive views via media queries is kind of borked in IE10, for
-// Surface/desktop in split view and for Windows Phone 8. This particular fix
-// must be accompanied by a snippet of JavaScript to sniff the user agent and
-// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
-// our Getting Started page for more information on this bug.
-//
-// For more information, see the following:
-//
-// Issue: https://github.com/twbs/bootstrap/issues/10497
-// Docs: http://getbootstrap.com/getting-started/#support-ie10-width
-// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
-// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
-
-@-ms-viewport {
-  width: device-width;
-}
-
-
-// Visibility utilities
-// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  .responsive-invisibility();
-}
-
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
-  display: none !important;
-}
-
-.visible-xs {
-  @media (max-width: @screen-xs-max) {
-    .responsive-visibility();
-  }
-}
-.visible-xs-block {
-  @media (max-width: @screen-xs-max) {
-    display: block !important;
-  }
-}
-.visible-xs-inline {
-  @media (max-width: @screen-xs-max) {
-    display: inline !important;
-  }
-}
-.visible-xs-inline-block {
-  @media (max-width: @screen-xs-max) {
-    display: inline-block !important;
-  }
-}
-
-.visible-sm {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    .responsive-visibility();
-  }
-}
-.visible-sm-block {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    display: block !important;
-  }
-}
-.visible-sm-inline {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    display: inline !important;
-  }
-}
-.visible-sm-inline-block {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    display: inline-block !important;
-  }
-}
-
-.visible-md {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    .responsive-visibility();
-  }
-}
-.visible-md-block {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    display: block !important;
-  }
-}
-.visible-md-inline {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    display: inline !important;
-  }
-}
-.visible-md-inline-block {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    display: inline-block !important;
-  }
-}
-
-.visible-lg {
-  @media (min-width: @screen-lg-min) {
-    .responsive-visibility();
-  }
-}
-.visible-lg-block {
-  @media (min-width: @screen-lg-min) {
-    display: block !important;
-  }
-}
-.visible-lg-inline {
-  @media (min-width: @screen-lg-min) {
-    display: inline !important;
-  }
-}
-.visible-lg-inline-block {
-  @media (min-width: @screen-lg-min) {
-    display: inline-block !important;
-  }
-}
-
-.hidden-xs {
-  @media (max-width: @screen-xs-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-sm {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-md {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-lg {
-  @media (min-width: @screen-lg-min) {
-    .responsive-invisibility();
-  }
-}
-
-
-// Print utilities
-//
-// Media queries are placed on the inside to be mixin-friendly.
-
-// Note: Deprecated .visible-print as of v3.2.0
-.visible-print {
-  .responsive-invisibility();
-
-  @media print {
-    .responsive-visibility();
-  }
-}
-.visible-print-block {
-  display: none !important;
-
-  @media print {
-    display: block !important;
-  }
-}
-.visible-print-inline {
-  display: none !important;
-
-  @media print {
-    display: inline !important;
-  }
-}
-.visible-print-inline-block {
-  display: none !important;
-
-  @media print {
-    display: inline-block !important;
-  }
-}
-
-.hidden-print {
-  @media print {
-    .responsive-invisibility();
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/scaffolding.less b/framework/crawler-ui/src/main/less/bootstrap-less/scaffolding.less
deleted file mode 100644
index eeadae6..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/scaffolding.less
+++ /dev/null
@@ -1,184 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Scaffolding
-// --------------------------------------------------
-
-
-// Reset the box-sizing
-//
-// Heads up! This reset may cause conflicts with some third-party widgets.
-// For recommendations on resolving such conflicts, see
-// http://getbootstrap.com/getting-started/#third-box-sizing
-* {
-  .box-sizing(border-box);
-}
-*:before,
-*:after {
-  .box-sizing(border-box);
-}
-
-
-// Body reset
-
-html {
-  font-size: 10px;
-  -webkit-tap-highlight-color: rgba(0,0,0,0);
-}
-
-body {
-  font-family: @font-family-base;
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @text-color;
-  background-color: @body-bg;
-}
-
-// Reset fonts for relevant elements
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-
-
-// Links
-
-a {
-  color: @link-color;
-  text-decoration: none;
-
-  &:hover,
-  &:focus {
-    color: @link-hover-color;
-    text-decoration: @link-hover-decoration;
-  }
-
-  &:focus {
-    .tab-focus();
-  }
-}
-
-
-// Figures
-//
-// We reset this here because previously Normalize had no `figure` margins. This
-// ensures we don't break anyone's use of the element.
-
-figure {
-  margin: 0;
-}
-
-
-// Images
-
-img {
-  vertical-align: middle;
-}
-
-// Responsive images (ensure images don't scale beyond their parents)
-.img-responsive {
-  .img-responsive();
-}
-
-// Rounded corners
-.img-rounded {
-  border-radius: @border-radius-large;
-}
-
-// Image thumbnails
-//
-// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
-.img-thumbnail {
-  padding: @thumbnail-padding;
-  line-height: @line-height-base;
-  background-color: @thumbnail-bg;
-  border: 1px solid @thumbnail-border;
-  border-radius: @thumbnail-border-radius;
-  .transition(all .2s ease-in-out);
-
-  // Keep them at most 100% wide
-  .img-responsive(inline-block);
-}
-
-// Perfect circle
-.img-circle {
-  border-radius: 50%; // set radius in percents
-}
-
-
-// Horizontal rules
-
-hr {
-  margin-top:    @line-height-computed;
-  margin-bottom: @line-height-computed;
-  border: 0;
-  border-top: 1px solid @hr-border;
-}
-
-
-// Only display content to screen readers
-//
-// See: http://a11yproject.com/posts/how-to-hide-content
-
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  margin: -1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0,0,0,0);
-  border: 0;
-}
-
-// Use in conjunction with .sr-only to only display content when it's focused.
-// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
-// Credit: HTML5 Boilerplate
-
-.sr-only-focusable {
-  &:active,
-  &:focus {
-    position: static;
-    width: auto;
-    height: auto;
-    margin: 0;
-    overflow: visible;
-    clip: auto;
-  }
-}
-
-
-// iOS "clickable elements" fix for role="button"
-//
-// Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
-// for traditionally non-focusable elements with role="button"
-// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
-
-[role="button"] {
-  cursor: pointer;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/tables.less b/framework/crawler-ui/src/main/less/bootstrap-less/tables.less
deleted file mode 100644
index 120e574..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/tables.less
+++ /dev/null
@@ -1,257 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Tables
-// --------------------------------------------------
-
-
-table {
-  background-color: @table-bg;
-}
-caption {
-  padding-top: @table-cell-padding;
-  padding-bottom: @table-cell-padding;
-  color: @text-muted;
-  text-align: left;
-}
-th {
-  text-align: left;
-}
-
-
-// Baseline styles
-
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: @line-height-computed;
-  // Cells
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        padding: @table-cell-padding;
-        line-height: @line-height-base;
-        vertical-align: top;
-        border-top: 1px solid @table-border-color;
-      }
-    }
-  }
-  // Bottom align for column headings
-  > thead > tr > th {
-    vertical-align: bottom;
-    border-bottom: 2px solid @table-border-color;
-  }
-  // Remove top border from thead by default
-  > caption + thead,
-  > colgroup + thead,
-  > thead:first-child {
-    > tr:first-child {
-      > th,
-      > td {
-        border-top: 0;
-      }
-    }
-  }
-  // Account for multiple tbody instances
-  > tbody + tbody {
-    border-top: 2px solid @table-border-color;
-  }
-
-  // Nesting
-  .table {
-    background-color: @body-bg;
-  }
-}
-
-
-// Condensed table w/ half padding
-
-.table-condensed {
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        padding: @table-condensed-cell-padding;
-      }
-    }
-  }
-}
-
-
-// Bordered version
-//
-// Add borders all around the table and between all the columns.
-
-.table-bordered {
-  border: 1px solid @table-border-color;
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        border: 1px solid @table-border-color;
-      }
-    }
-  }
-  > thead > tr {
-    > th,
-    > td {
-      border-bottom-width: 2px;
-    }
-  }
-}
-
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-.table-striped {
-  > tbody > tr:nth-of-type(odd) {
-    background-color: @table-bg-accent;
-  }
-}
-
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
-  > tbody > tr:hover {
-    background-color: @table-bg-hover;
-  }
-}
-
-
-// Table cell sizing
-//
-// Reset default table behavior
-
-table col[class*="col-"] {
-  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
-  float: none;
-  display: table-column;
-}
-table {
-  td,
-  th {
-    &[class*="col-"] {
-      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
-      float: none;
-      display: table-cell;
-    }
-  }
-}
-
-
-// Table backgrounds
-//
-// Exact selectors below required to override `.table-striped` and prevent
-// inheritance to nested tables.
-
-// Generate the contextual variants
-.table-row-variant(active; @table-bg-active);
-.table-row-variant(success; @state-success-bg);
-.table-row-variant(info; @state-info-bg);
-.table-row-variant(warning; @state-warning-bg);
-.table-row-variant(danger; @state-danger-bg);
-
-
-// Responsive tables
-//
-// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
-// by enabling horizontal scrolling. Only applies <768px. Everything above that
-// will display normally.
-
-.table-responsive {
-  overflow-x: auto;
-  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
-
-  @media screen and (max-width: @screen-xs-max) {
-    width: 100%;
-    margin-bottom: (@line-height-computed * 0.75);
-    overflow-y: hidden;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-    border: 1px solid @table-border-color;
-
-    // Tighten up spacing
-    > .table {
-      margin-bottom: 0;
-
-      // Ensure the content doesn't wrap
-      > thead,
-      > tbody,
-      > tfoot {
-        > tr {
-          > th,
-          > td {
-            white-space: nowrap;
-          }
-        }
-      }
-    }
-
-    // Special overrides for the bordered tables
-    > .table-bordered {
-      border: 0;
-
-      // Nuke the appropriate borders so that the parent can handle them
-      > thead,
-      > tbody,
-      > tfoot {
-        > tr {
-          > th:first-child,
-          > td:first-child {
-            border-left: 0;
-          }
-          > th:last-child,
-          > td:last-child {
-            border-right: 0;
-          }
-        }
-      }
-
-      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
-      // chances are there will be only one `tr` in a `thead` and that would
-      // remove the border altogether.
-      > tbody,
-      > tfoot {
-        > tr:last-child {
-          > th,
-          > td {
-            border-bottom: 0;
-          }
-        }
-      }
-
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/theme.less b/framework/crawler-ui/src/main/less/bootstrap-less/theme.less
deleted file mode 100644
index 19d7f01..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/theme.less
+++ /dev/null
@@ -1,308 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Load core variables and mixins
-// --------------------------------------------------
-
-@import "variables.less";
-@import "mixins.less";
-
-
-//
-// Buttons
-// --------------------------------------------------
-
-// Common styles
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
-  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
-  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
-  .box-shadow(@shadow);
-
-  // Reset the shadow
-  &:active,
-  &.active {
-    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-  }
-
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    .box-shadow(none);
-  }
-
-  .badge {
-    text-shadow: none;
-  }
-}
-
-// Mixin for generating new styles
-.btn-styles(@btn-color: #555) {
-  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));
-  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
-  background-repeat: repeat-x;
-  border-color: darken(@btn-color, 14%);
-
-  &:hover,
-  &:focus  {
-    background-color: darken(@btn-color, 12%);
-    background-position: 0 -15px;
-  }
-
-  &:active,
-  &.active {
-    background-color: darken(@btn-color, 12%);
-    border-color: darken(@btn-color, 14%);
-  }
-
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    &,
-    &:hover,
-    &:focus,
-    &.focus,
-    &:active,
-    &.active {
-      background-color: darken(@btn-color, 12%);
-      background-image: none;
-    }
-  }
-}
-
-// Common styles
-.btn {
-  // Remove the gradient for the pressed/active state
-  &:active,
-  &.active {
-    background-image: none;
-  }
-}
-
-// Apply the mixin to the buttons
-.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
-.btn-primary { .btn-styles(@btn-primary-bg); }
-.btn-success { .btn-styles(@btn-success-bg); }
-.btn-info    { .btn-styles(@btn-info-bg); }
-.btn-warning { .btn-styles(@btn-warning-bg); }
-.btn-danger  { .btn-styles(@btn-danger-bg); }
-
-
-//
-// Images
-// --------------------------------------------------
-
-.thumbnail,
-.img-thumbnail {
-  .box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-
-
-//
-// Dropdowns
-// --------------------------------------------------
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));
-  background-color: darken(@dropdown-link-hover-bg, 5%);
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));
-  background-color: darken(@dropdown-link-active-bg, 5%);
-}
-
-
-//
-// Navbar
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
-  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);
-  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
-  border-radius: @navbar-border-radius;
-  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
-  .box-shadow(@shadow);
-
-  .navbar-nav > .open > a,
-  .navbar-nav > .active > a {
-    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));
-    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
-  }
-}
-.navbar-brand,
-.navbar-nav > li > a {
-  text-shadow: 0 1px 0 rgba(255,255,255,.25);
-}
-
-// Inverted navbar
-.navbar-inverse {
-  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);
-  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
-  border-radius: @navbar-border-radius;
-  .navbar-nav > .open > a,
-  .navbar-nav > .active > a {
-    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));
-    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
-  }
-
-  .navbar-brand,
-  .navbar-nav > li > a {
-    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
-  }
-}
-
-// Undo rounded corners in static and fixed navbars
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  border-radius: 0;
-}
-
-// Fix active state of dropdown items in collapsed mode
-@media (max-width: @grid-float-breakpoint-max) {
-  .navbar .navbar-nav .open .dropdown-menu > .active > a {
-    &,
-    &:hover,
-    &:focus {
-      color: #fff;
-      #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));
-    }
-  }
-}
-
-
-//
-// Alerts
-// --------------------------------------------------
-
-// Common styles
-.alert {
-  text-shadow: 0 1px 0 rgba(255,255,255,.2);
-  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
-  .box-shadow(@shadow);
-}
-
-// Mixin for generating new styles
-.alert-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));
-  border-color: darken(@color, 15%);
-}
-
-// Apply the mixin to the alerts
-.alert-success    { .alert-styles(@alert-success-bg); }
-.alert-info       { .alert-styles(@alert-info-bg); }
-.alert-warning    { .alert-styles(@alert-warning-bg); }
-.alert-danger     { .alert-styles(@alert-danger-bg); }
-
-
-//
-// Progress bars
-// --------------------------------------------------
-
-// Give the progress background some depth
-.progress {
-  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)
-}
-
-// Mixin for generating new styles
-.progress-bar-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));
-}
-
-// Apply the mixin to the progress bars
-.progress-bar            { .progress-bar-styles(@progress-bar-bg); }
-.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }
-.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }
-.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }
-.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }
-
-// Reset the striped class because our mixins don't do multiple gradients and
-// the above custom styles override the new `.progress-bar-striped` in v3.2.0.
-.progress-bar-striped {
-  #gradient > .striped();
-}
-
-
-//
-// List groups
-// --------------------------------------------------
-
-.list-group {
-  border-radius: @border-radius-base;
-  .box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
-  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));
-  border-color: darken(@list-group-active-border, 7.5%);
-
-  .badge {
-    text-shadow: none;
-  }
-}
-
-
-//
-// Panels
-// --------------------------------------------------
-
-// Common styles
-.panel {
-  .box-shadow(0 1px 2px rgba(0,0,0,.05));
-}
-
-// Mixin for generating new styles
-.panel-heading-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));
-}
-
-// Apply the mixin to the panel headings only
-.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }
-.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }
-.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }
-.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }
-.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }
-.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }
-
-
-//
-// Wells
-// --------------------------------------------------
-
-.well {
-  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);
-  border-color: darken(@well-bg, 10%);
-  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
-  .box-shadow(@shadow);
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/thumbnails.less b/framework/crawler-ui/src/main/less/bootstrap-less/thumbnails.less
deleted file mode 100644
index 65cbf9c..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/thumbnails.less
+++ /dev/null
@@ -1,59 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Thumbnails
-// --------------------------------------------------
-
-
-// Mixin and adjust the regular image class
-.thumbnail {
-  display: block;
-  padding: @thumbnail-padding;
-  margin-bottom: @line-height-computed;
-  line-height: @line-height-base;
-  background-color: @thumbnail-bg;
-  border: 1px solid @thumbnail-border;
-  border-radius: @thumbnail-border-radius;
-  .transition(border .2s ease-in-out);
-
-  > img,
-  a > img {
-    &:extend(.img-responsive);
-    margin-left: auto;
-    margin-right: auto;
-  }
-
-  // Add a hover state for linked versions only
-  a&:hover,
-  a&:focus,
-  a&.active {
-    border-color: @link-color;
-  }
-
-  // Image captions
-  .caption {
-    padding: @thumbnail-caption-padding;
-    color: @thumbnail-caption-color;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/tooltip.less b/framework/crawler-ui/src/main/less/bootstrap-less/tooltip.less
deleted file mode 100644
index bbe48e8..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/tooltip.less
+++ /dev/null
@@ -1,124 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Tooltips
-// --------------------------------------------------
-
-
-// Base class
-.tooltip {
-  position: absolute;
-  z-index: @zindex-tooltip;
-  display: block;
-  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
-  // So reset our font and text properties to avoid inheriting weird values.
-  .reset-text();
-  font-size: @font-size-small;
-
-  .opacity(0);
-
-  &.in     { .opacity(@tooltip-opacity); }
-  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }
-  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }
-  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }
-  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
-  max-width: @tooltip-max-width;
-  padding: 3px 8px;
-  color: @tooltip-color;
-  text-align: center;
-  background-color: @tooltip-bg;
-  border-radius: @border-radius-base;
-}
-
-// Arrows
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
-.tooltip {
-  &.top .tooltip-arrow {
-    bottom: 0;
-    left: 50%;
-    margin-left: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.top-left .tooltip-arrow {
-    bottom: 0;
-    right: @tooltip-arrow-width;
-    margin-bottom: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.top-right .tooltip-arrow {
-    bottom: 0;
-    left: @tooltip-arrow-width;
-    margin-bottom: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.right .tooltip-arrow {
-    top: 50%;
-    left: 0;
-    margin-top: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-right-color: @tooltip-arrow-color;
-  }
-  &.left .tooltip-arrow {
-    top: 50%;
-    right: 0;
-    margin-top: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-left-color: @tooltip-arrow-color;
-  }
-  &.bottom .tooltip-arrow {
-    top: 0;
-    left: 50%;
-    margin-left: -@tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-  &.bottom-left .tooltip-arrow {
-    top: 0;
-    right: @tooltip-arrow-width;
-    margin-top: -@tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-  &.bottom-right .tooltip-arrow {
-    top: 0;
-    left: @tooltip-arrow-width;
-    margin-top: -@tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/type.less b/framework/crawler-ui/src/main/less/bootstrap-less/type.less
deleted file mode 100644
index 2b60135..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/type.less
+++ /dev/null
@@ -1,325 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Typography
-// --------------------------------------------------
-
-
-// Headings
-// -------------------------
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
-  font-family: @headings-font-family;
-  font-weight: @headings-font-weight;
-  line-height: @headings-line-height;
-  color: @headings-color;
-
-  small,
-  .small {
-    font-weight: normal;
-    line-height: 1;
-    color: @headings-small-color;
-  }
-}
-
-h1, .h1,
-h2, .h2,
-h3, .h3 {
-  margin-top: @line-height-computed;
-  margin-bottom: (@line-height-computed / 2);
-
-  small,
-  .small {
-    font-size: 65%;
-  }
-}
-h4, .h4,
-h5, .h5,
-h6, .h6 {
-  margin-top: (@line-height-computed / 2);
-  margin-bottom: (@line-height-computed / 2);
-
-  small,
-  .small {
-    font-size: 75%;
-  }
-}
-
-h1, .h1 { font-size: @font-size-h1; }
-h2, .h2 { font-size: @font-size-h2; }
-h3, .h3 { font-size: @font-size-h3; }
-h4, .h4 { font-size: @font-size-h4; }
-h5, .h5 { font-size: @font-size-h5; }
-h6, .h6 { font-size: @font-size-h6; }
-
-
-// Body text
-// -------------------------
-
-p {
-  margin: 0 0 (@line-height-computed / 2);
-}
-
-.lead {
-  margin-bottom: @line-height-computed;
-  font-size: floor((@font-size-base * 1.15));
-  font-weight: 300;
-  line-height: 1.4;
-
-  @media (min-width: @screen-sm-min) {
-    font-size: (@font-size-base * 1.5);
-  }
-}
-
-
-// Emphasis & misc
-// -------------------------
-
-// Ex: (12px small font / 14px base font) * 100% = about 85%
-small,
-.small {
-  font-size: floor((100% * @font-size-small / @font-size-base));
-}
-
-mark,
-.mark {
-  background-color: @state-warning-bg;
-  padding: .2em;
-}
-
-// Alignment
-.text-left           { text-align: left; }
-.text-right          { text-align: right; }
-.text-center         { text-align: center; }
-.text-justify        { text-align: justify; }
-.text-nowrap         { white-space: nowrap; }
-
-// Transformation
-.text-lowercase      { text-transform: lowercase; }
-.text-uppercase      { text-transform: uppercase; }
-.text-capitalize     { text-transform: capitalize; }
-
-// Contextual colors
-.text-muted {
-  color: @text-muted;
-}
-.text-primary {
-  .text-emphasis-variant(@brand-primary);
-}
-.text-success {
-  .text-emphasis-variant(@state-success-text);
-}
-.text-info {
-  .text-emphasis-variant(@state-info-text);
-}
-.text-warning {
-  .text-emphasis-variant(@state-warning-text);
-}
-.text-danger {
-  .text-emphasis-variant(@state-danger-text);
-}
-
-// Contextual backgrounds
-// For now we'll leave these alongside the text classes until v4 when we can
-// safely shift things around (per SemVer rules).
-.bg-primary {
-  // Given the contrast here, this is the only class to have its color inverted
-  // automatically.
-  color: #fff;
-  .bg-variant(@brand-primary);
-}
-.bg-success {
-  .bg-variant(@state-success-bg);
-}
-.bg-info {
-  .bg-variant(@state-info-bg);
-}
-.bg-warning {
-  .bg-variant(@state-warning-bg);
-}
-.bg-danger {
-  .bg-variant(@state-danger-bg);
-}
-
-
-// Page header
-// -------------------------
-
-.page-header {
-  padding-bottom: ((@line-height-computed / 2) - 1);
-  margin: (@line-height-computed * 2) 0 @line-height-computed;
-  border-bottom: 1px solid @page-header-border-color;
-}
-
-
-// Lists
-// -------------------------
-
-// Unordered and Ordered lists
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: (@line-height-computed / 2);
-  ul,
-  ol {
-    margin-bottom: 0;
-  }
-}
-
-// List options
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-
-// Inline turns list items into inline-block
-.list-inline {
-  .list-unstyled();
-  margin-left: -5px;
-
-  > li {
-    display: inline-block;
-    padding-left: 5px;
-    padding-right: 5px;
-  }
-}
-
-// Description Lists
-dl {
-  margin-top: 0; // Remove browser default
-  margin-bottom: @line-height-computed;
-}
-dt,
-dd {
-  line-height: @line-height-base;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0; // Undo browser default
-}
-
-// Horizontal description lists
-//
-// Defaults to being stacked without any of the below styles applied, until the
-// grid breakpoint is reached (default of ~768px).
-
-.dl-horizontal {
-  dd {
-    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
-  }
-
-  @media (min-width: @dl-horizontal-breakpoint) {
-    dt {
-      float: left;
-      width: (@dl-horizontal-offset - 20);
-      clear: left;
-      text-align: right;
-      .text-overflow();
-    }
-    dd {
-      margin-left: @dl-horizontal-offset;
-    }
-  }
-}
-
-
-// Misc
-// -------------------------
-
-// Abbreviations and acronyms
-abbr[title],
-// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted @abbr-border-color;
-}
-.initialism {
-  font-size: 90%;
-  .text-uppercase();
-}
-
-// Blockquotes
-blockquote {
-  padding: (@line-height-computed / 2) @line-height-computed;
-  margin: 0 0 @line-height-computed;
-  font-size: @blockquote-font-size;
-  border-left: 5px solid @blockquote-border-color;
-
-  p,
-  ul,
-  ol {
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  // Note: Deprecated small and .small as of v3.1.0
-  // Context: https://github.com/twbs/bootstrap/issues/11660
-  footer,
-  small,
-  .small {
-    display: block;
-    font-size: 80%; // back to default font-size
-    line-height: @line-height-base;
-    color: @blockquote-small-color;
-
-    &:before {
-      content: '\2014 \00A0'; // em dash, nbsp
-    }
-  }
-}
-
-// Opposite alignment of blockquote
-//
-// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid @blockquote-border-color;
-  border-left: 0;
-  text-align: right;
-
-  // Account for citation
-  footer,
-  small,
-  .small {
-    &:before { content: ''; }
-    &:after {
-      content: '\00A0 \2014'; // nbsp, em dash
-    }
-  }
-}
-
-// Addresses
-address {
-  margin-bottom: @line-height-computed;
-  font-style: normal;
-  line-height: @line-height-base;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/utilities.less b/framework/crawler-ui/src/main/less/bootstrap-less/utilities.less
deleted file mode 100644
index e44038f..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/utilities.less
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Utility classes
-// --------------------------------------------------
-
-
-// Floats
-// -------------------------
-
-.clearfix {
-  .clearfix();
-}
-.center-block {
-  .center-block();
-}
-.pull-right {
-  float: right !important;
-}
-.pull-left {
-  float: left !important;
-}
-
-
-// Toggling content
-// -------------------------
-
-// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
-.hide {
-  display: none !important;
-}
-.show {
-  display: block !important;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  .text-hide();
-}
-
-
-// Hide from screenreaders and browsers
-//
-// Credit: HTML5 Boilerplate
-
-.hidden {
-  display: none !important;
-}
-
-
-// For Affix plugin
-// -------------------------
-
-.affix {
-  position: fixed;
-}
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/variables.less b/framework/crawler-ui/src/main/less/bootstrap-less/variables.less
deleted file mode 100644
index 6aaca31..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/variables.less
+++ /dev/null
@@ -1,892 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Variables
-// --------------------------------------------------
-
-
-//== Colors
-//
-//## Gray and brand colors for use across Bootstrap.
-
-@gray-base:              #000;
-@gray-darker:            lighten(@gray-base, 13.5%); // #222
-@gray-dark:              lighten(@gray-base, 20%);   // #333
-@gray:                   lighten(@gray-base, 33.5%); // #555
-@gray-light:             lighten(@gray-base, 46.7%); // #777
-@gray-lighter:           lighten(@gray-base, 93.5%); // #eee
-
-@brand-primary:         darken(#428bca, 6.5%); // #337ab7
-@brand-success:         #5cb85c;
-@brand-info:            #5bc0de;
-@brand-warning:         #f0ad4e;
-@brand-danger:          #d9534f;
-
-
-//== Scaffolding
-//
-//## Settings for some of the most global styles.
-
-//** Background color for `<body>`.
-@body-bg:               #fff;
-//** Global text color on `<body>`.
-@text-color:            @gray-dark;
-
-//** Global textual link color.
-@link-color:            @brand-primary;
-//** Link hover color set via `darken()` function.
-@link-hover-color:      darken(@link-color, 15%);
-//** Link hover decoration.
-@link-hover-decoration: underline;
-
-
-//== Typography
-//
-//## Font, line-height, and color for body text, headings, and more.
-
-@font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif;
-@font-family-serif:       Georgia, "Times New Roman", Times, serif;
-//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
-@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
-@font-family-base:        @font-family-sans-serif;
-
-@font-size-base:          14px;
-@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
-@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
-
-@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
-@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
-@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
-@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
-@font-size-h5:            @font-size-base;
-@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-@line-height-base:        1.428571429; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
-
-//** By default, this inherits from the `<body>`.
-@headings-font-family:    inherit;
-@headings-font-weight:    500;
-@headings-line-height:    1.1;
-@headings-color:          inherit;
-
-
-//== Iconography
-//
-//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-//** Load fonts from this directory.
-@icon-font-path:          "../fonts/";
-//** File name for all font files.
-@icon-font-name:          "glyphicons-halflings-regular";
-//** Element ID within SVG icon file.
-@icon-font-svg-id:        "glyphicons_halflingsregular";
-
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-@padding-base-vertical:     6px;
-@padding-base-horizontal:   12px;
-
-@padding-large-vertical:    10px;
-@padding-large-horizontal:  16px;
-
-@padding-small-vertical:    5px;
-@padding-small-horizontal:  10px;
-
-@padding-xs-vertical:       1px;
-@padding-xs-horizontal:     5px;
-
-@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
-@line-height-small:         1.5;
-
-@border-radius-base:        4px;
-@border-radius-large:       6px;
-@border-radius-small:       3px;
-
-//** Global color for active items (e.g., navs or dropdowns).
-@component-active-color:    #fff;
-//** Global background color for active items (e.g., navs or dropdowns).
-@component-active-bg:       @brand-primary;
-
-//** Width of the `border` for generating carets that indicate dropdowns.
-@caret-width-base:          4px;
-//** Carets increase slightly in size for larger components.
-@caret-width-large:         5px;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for `<th>`s and `<td>`s.
-@table-cell-padding:            8px;
-//** Padding for cells in `.table-condensed`.
-@table-condensed-cell-padding:  5px;
-
-//** Default background color used for all tables.
-@table-bg:                      transparent;
-//** Background color used for `.table-striped`.
-@table-bg-accent:               #f9f9f9;
-//** Background color used for `.table-hover`.
-@table-bg-hover:                #f5f5f5;
-@table-bg-active:               @table-bg-hover;
-
-//** Border color for table and cell borders.
-@table-border-color:            #ddd;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-@btn-font-weight:                normal;
-
-@btn-default-color:              #333;
-@btn-default-bg:                 #fff;
-@btn-default-border:             #ccc;
-
-@btn-primary-color:              #fff;
-@btn-primary-bg:                 @brand-primary;
-@btn-primary-border:             darken(@btn-primary-bg, 5%);
-
-@btn-success-color:              #fff;
-@btn-success-bg:                 @brand-success;
-@btn-success-border:             darken(@btn-success-bg, 5%);
-
-@btn-info-color:                 #fff;
-@btn-info-bg:                    @brand-info;
-@btn-info-border:                darken(@btn-info-bg, 5%);
-
-@btn-warning-color:              #fff;
-@btn-warning-bg:                 @brand-warning;
-@btn-warning-border:             darken(@btn-warning-bg, 5%);
-
-@btn-danger-color:               #fff;
-@btn-danger-bg:                  @brand-danger;
-@btn-danger-border:              darken(@btn-danger-bg, 5%);
-
-@btn-link-disabled-color:        @gray-light;
-
-// Allows for customizing button radius independently from global border radius
-@btn-border-radius-base:         @border-radius-base;
-@btn-border-radius-large:        @border-radius-large;
-@btn-border-radius-small:        @border-radius-small;
-
-
-//== Forms
-//
-//##
-
-//** `<input>` background color
-@input-bg:                       #fff;
-//** `<input disabled>` background color
-@input-bg-disabled:              @gray-lighter;
-
-//** Text color for `<input>`s
-@input-color:                    @gray;
-//** `<input>` border color
-@input-border:                   #ccc;
-
-// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
-//** Default `.form-control` border radius
-// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
-@input-border-radius:            @border-radius-base;
-//** Large `.form-control` border radius
-@input-border-radius-large:      @border-radius-large;
-//** Small `.form-control` border radius
-@input-border-radius-small:      @border-radius-small;
-
-//** Border color for inputs on focus
-@input-border-focus:             #66afe9;
-
-//** Placeholder text color
-@input-color-placeholder:        #999;
-
-//** Default `.form-control` height
-@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
-//** Large `.form-control` height
-@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
-//** Small `.form-control` height
-@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
-
-//** `.form-group` margin
-@form-group-margin-bottom:       15px;
-
-@legend-color:                   @gray-dark;
-@legend-border-color:            #e5e5e5;
-
-//** Background color for textual input addons
-@input-group-addon-bg:           @gray-lighter;
-//** Border color for textual input addons
-@input-group-addon-border-color: @input-border;
-
-//** Disabled cursor for form controls and buttons.
-@cursor-disabled:                not-allowed;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-@dropdown-bg:                    #fff;
-//** Dropdown menu `border-color`.
-@dropdown-border:                rgba(0,0,0,.15);
-//** Dropdown menu `border-color` **for IE8**.
-@dropdown-fallback-border:       #ccc;
-//** Divider color for between dropdown items.
-@dropdown-divider-bg:            #e5e5e5;
-
-//** Dropdown link text color.
-@dropdown-link-color:            @gray-dark;
-//** Hover color for dropdown links.
-@dropdown-link-hover-color:      darken(@gray-dark, 5%);
-//** Hover background for dropdown links.
-@dropdown-link-hover-bg:         #f5f5f5;
-
-//** Active dropdown menu item text color.
-@dropdown-link-active-color:     @component-active-color;
-//** Active dropdown menu item background color.
-@dropdown-link-active-bg:        @component-active-bg;
-
-//** Disabled dropdown menu item background color.
-@dropdown-link-disabled-color:   @gray-light;
-
-//** Text color for headers within dropdown menus.
-@dropdown-header-color:          @gray-light;
-
-//** Deprecated `@dropdown-caret-color` as of v3.1.0
-@dropdown-caret-color:           #000;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-@zindex-navbar:            1000;
-@zindex-dropdown:          1000;
-@zindex-popover:           1060;
-@zindex-tooltip:           1070;
-@zindex-navbar-fixed:      1030;
-@zindex-modal-background:  1040;
-@zindex-modal:             1050;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-//** Deprecated `@screen-xs` as of v3.0.1
-@screen-xs:                  480px;
-//** Deprecated `@screen-xs-min` as of v3.2.0
-@screen-xs-min:              @screen-xs;
-//** Deprecated `@screen-phone` as of v3.0.1
-@screen-phone:               @screen-xs-min;
-
-// Small screen / tablet
-//** Deprecated `@screen-sm` as of v3.0.1
-@screen-sm:                  768px;
-@screen-sm-min:              @screen-sm;
-//** Deprecated `@screen-tablet` as of v3.0.1
-@screen-tablet:              @screen-sm-min;
-
-// Medium screen / desktop
-//** Deprecated `@screen-md` as of v3.0.1
-@screen-md:                  992px;
-@screen-md-min:              @screen-md;
-//** Deprecated `@screen-desktop` as of v3.0.1
-@screen-desktop:             @screen-md-min;
-
-// Large screen / wide desktop
-//** Deprecated `@screen-lg` as of v3.0.1
-@screen-lg:                  1200px;
-@screen-lg-min:              @screen-lg;
-//** Deprecated `@screen-lg-desktop` as of v3.0.1
-@screen-lg-desktop:          @screen-lg-min;
-
-// So media queries don't overlap when required, provide a maximum
-@screen-xs-max:              (@screen-sm-min - 1);
-@screen-sm-max:              (@screen-md-min - 1);
-@screen-md-max:              (@screen-lg-min - 1);
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-@grid-columns:              12;
-//** Padding between columns. Gets divided in half for the left and right.
-@grid-gutter-width:         30px;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-@grid-float-breakpoint:     @screen-sm-min;
-//** Point at which the navbar begins collapsing.
-@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-@container-tablet:             (720px + @grid-gutter-width);
-//** For `@screen-sm-min` and up.
-@container-sm:                 @container-tablet;
-
-// Medium screen / desktop
-@container-desktop:            (940px + @grid-gutter-width);
-//** For `@screen-md-min` and up.
-@container-md:                 @container-desktop;
-
-// Large screen / wide desktop
-@container-large-desktop:      (1140px + @grid-gutter-width);
-//** For `@screen-lg-min` and up.
-@container-lg:                 @container-large-desktop;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-@navbar-height:                    50px;
-@navbar-margin-bottom:             @line-height-computed;
-@navbar-border-radius:             @border-radius-base;
-@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
-@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
-@navbar-collapse-max-height:       340px;
-
-@navbar-default-color:             #777;
-@navbar-default-bg:                #f8f8f8;
-@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
-
-// Navbar links
-@navbar-default-link-color:                #777;
-@navbar-default-link-hover-color:          #333;
-@navbar-default-link-hover-bg:             transparent;
-@navbar-default-link-active-color:         #555;
-@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
-@navbar-default-link-disabled-color:       #ccc;
-@navbar-default-link-disabled-bg:          transparent;
-
-// Navbar brand label
-@navbar-default-brand-color:               @navbar-default-link-color;
-@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
-@navbar-default-brand-hover-bg:            transparent;
-
-// Navbar toggle
-@navbar-default-toggle-hover-bg:           #ddd;
-@navbar-default-toggle-icon-bar-bg:        #888;
-@navbar-default-toggle-border-color:       #ddd;
-
-
-//=== Inverted navbar
-// Reset inverted navbar basics
-@navbar-inverse-color:                      lighten(@gray-light, 15%);
-@navbar-inverse-bg:                         #222;
-@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
-
-// Inverted navbar links
-@navbar-inverse-link-color:                 lighten(@gray-light, 15%);
-@navbar-inverse-link-hover-color:           #fff;
-@navbar-inverse-link-hover-bg:              transparent;
-@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
-@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
-@navbar-inverse-link-disabled-color:        #444;
-@navbar-inverse-link-disabled-bg:           transparent;
-
-// Inverted navbar brand label
-@navbar-inverse-brand-color:                @navbar-inverse-link-color;
-@navbar-inverse-brand-hover-color:          #fff;
-@navbar-inverse-brand-hover-bg:             transparent;
-
-// Inverted navbar toggle
-@navbar-inverse-toggle-hover-bg:            #333;
-@navbar-inverse-toggle-icon-bar-bg:         #fff;
-@navbar-inverse-toggle-border-color:        #333;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-@nav-link-padding:                          10px 15px;
-@nav-link-hover-bg:                         @gray-lighter;
-
-@nav-disabled-link-color:                   @gray-light;
-@nav-disabled-link-hover-color:             @gray-light;
-
-//== Tabs
-@nav-tabs-border-color:                     #ddd;
-
-@nav-tabs-link-hover-border-color:          @gray-lighter;
-
-@nav-tabs-active-link-hover-bg:             @body-bg;
-@nav-tabs-active-link-hover-color:          @gray;
-@nav-tabs-active-link-hover-border-color:   #ddd;
-
-@nav-tabs-justified-link-border-color:            #ddd;
-@nav-tabs-justified-active-link-border-color:     @body-bg;
-
-//== Pills
-@nav-pills-border-radius:                   @border-radius-base;
-@nav-pills-active-link-hover-bg:            @component-active-bg;
-@nav-pills-active-link-hover-color:         @component-active-color;
-
-
-//== Pagination
-//
-//##
-
-@pagination-color:                     @link-color;
-@pagination-bg:                        #fff;
-@pagination-border:                    #ddd;
-
-@pagination-hover-color:               @link-hover-color;
-@pagination-hover-bg:                  @gray-lighter;
-@pagination-hover-border:              #ddd;
-
-@pagination-active-color:              #fff;
-@pagination-active-bg:                 @brand-primary;
-@pagination-active-border:             @brand-primary;
-
-@pagination-disabled-color:            @gray-light;
-@pagination-disabled-bg:               #fff;
-@pagination-disabled-border:           #ddd;
-
-
-//== Pager
-//
-//##
-
-@pager-bg:                             @pagination-bg;
-@pager-border:                         @pagination-border;
-@pager-border-radius:                  15px;
-
-@pager-hover-bg:                       @pagination-hover-bg;
-
-@pager-active-bg:                      @pagination-active-bg;
-@pager-active-color:                   @pagination-active-color;
-
-@pager-disabled-color:                 @pagination-disabled-color;
-
-
-//== Jumbotron
-//
-//##
-
-@jumbotron-padding:              30px;
-@jumbotron-color:                inherit;
-@jumbotron-bg:                   @gray-lighter;
-@jumbotron-heading-color:        inherit;
-@jumbotron-font-size:            ceil((@font-size-base * 1.5));
-@jumbotron-heading-font-size:    ceil((@font-size-base * 4.5));
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-@state-success-text:             #3c763d;
-@state-success-bg:               #dff0d8;
-@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
-
-@state-info-text:                #31708f;
-@state-info-bg:                  #d9edf7;
-@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
-
-@state-warning-text:             #8a6d3b;
-@state-warning-bg:               #fcf8e3;
-@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
-
-@state-danger-text:              #a94442;
-@state-danger-bg:                #f2dede;
-@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-@tooltip-max-width:           200px;
-//** Tooltip text color
-@tooltip-color:               #fff;
-//** Tooltip background color
-@tooltip-bg:                  #000;
-@tooltip-opacity:             .9;
-
-//** Tooltip arrow width
-@tooltip-arrow-width:         5px;
-//** Tooltip arrow color
-@tooltip-arrow-color:         @tooltip-bg;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-@popover-bg:                          #fff;
-//** Popover maximum width
-@popover-max-width:                   276px;
-//** Popover border color
-@popover-border-color:                rgba(0,0,0,.2);
-//** Popover fallback border color
-@popover-fallback-border-color:       #ccc;
-
-//** Popover title background color
-@popover-title-bg:                    darken(@popover-bg, 3%);
-
-//** Popover arrow width
-@popover-arrow-width:                 10px;
-//** Popover arrow color
-@popover-arrow-color:                 @popover-bg;
-
-//** Popover outer arrow width
-@popover-arrow-outer-width:           (@popover-arrow-width + 1);
-//** Popover outer arrow color
-@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
-//** Popover outer arrow fallback color
-@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-@label-default-bg:            @gray-light;
-//** Primary label background color
-@label-primary-bg:            @brand-primary;
-//** Success label background color
-@label-success-bg:            @brand-success;
-//** Info label background color
-@label-info-bg:               @brand-info;
-//** Warning label background color
-@label-warning-bg:            @brand-warning;
-//** Danger label background color
-@label-danger-bg:             @brand-danger;
-
-//** Default label text color
-@label-color:                 #fff;
-//** Default text color of a linked label
-@label-link-hover-color:      #fff;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-@modal-inner-padding:         15px;
-
-//** Padding applied to the modal title
-@modal-title-padding:         15px;
-//** Modal title line-height
-@modal-title-line-height:     @line-height-base;
-
-//** Background color of modal content area
-@modal-content-bg:                             #fff;
-//** Modal content border color
-@modal-content-border-color:                   rgba(0,0,0,.2);
-//** Modal content border color **for IE8**
-@modal-content-fallback-border-color:          #999;
-
-//** Modal backdrop background color
-@modal-backdrop-bg:           #000;
-//** Modal backdrop opacity
-@modal-backdrop-opacity:      .5;
-//** Modal header border color
-@modal-header-border-color:   #e5e5e5;
-//** Modal footer border color
-@modal-footer-border-color:   @modal-header-border-color;
-
-@modal-lg:                    900px;
-@modal-md:                    600px;
-@modal-sm:                    300px;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-@alert-padding:               15px;
-@alert-border-radius:         @border-radius-base;
-@alert-link-font-weight:      bold;
-
-@alert-success-bg:            @state-success-bg;
-@alert-success-text:          @state-success-text;
-@alert-success-border:        @state-success-border;
-
-@alert-info-bg:               @state-info-bg;
-@alert-info-text:             @state-info-text;
-@alert-info-border:           @state-info-border;
-
-@alert-warning-bg:            @state-warning-bg;
-@alert-warning-text:          @state-warning-text;
-@alert-warning-border:        @state-warning-border;
-
-@alert-danger-bg:             @state-danger-bg;
-@alert-danger-text:           @state-danger-text;
-@alert-danger-border:         @state-danger-border;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-@progress-bg:                 #f5f5f5;
-//** Progress bar text color
-@progress-bar-color:          #fff;
-//** Variable for setting rounded corners on progress bar.
-@progress-border-radius:      @border-radius-base;
-
-//** Default progress bar color
-@progress-bar-bg:             @brand-primary;
-//** Success progress bar color
-@progress-bar-success-bg:     @brand-success;
-//** Warning progress bar color
-@progress-bar-warning-bg:     @brand-warning;
-//** Danger progress bar color
-@progress-bar-danger-bg:      @brand-danger;
-//** Info progress bar color
-@progress-bar-info-bg:        @brand-info;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-@list-group-bg:                 #fff;
-//** `.list-group-item` border color
-@list-group-border:             #ddd;
-//** List group border radius
-@list-group-border-radius:      @border-radius-base;
-
-//** Background color of single list items on hover
-@list-group-hover-bg:           #f5f5f5;
-//** Text color of active list items
-@list-group-active-color:       @component-active-color;
-//** Background color of active list items
-@list-group-active-bg:          @component-active-bg;
-//** Border color of active list elements
-@list-group-active-border:      @list-group-active-bg;
-//** Text color for content within active list items
-@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
-
-//** Text color of disabled list items
-@list-group-disabled-color:      @gray-light;
-//** Background color of disabled list items
-@list-group-disabled-bg:         @gray-lighter;
-//** Text color for content within disabled list items
-@list-group-disabled-text-color: @list-group-disabled-color;
-
-@list-group-link-color:         #555;
-@list-group-link-hover-color:   @list-group-link-color;
-@list-group-link-heading-color: #333;
-
-
-//== Panels
-//
-//##
-
-@panel-bg:                    #fff;
-@panel-body-padding:          15px;
-@panel-heading-padding:       10px 15px;
-@panel-footer-padding:        @panel-heading-padding;
-@panel-border-radius:         @border-radius-base;
-
-//** Border color for elements within panels
-@panel-inner-border:          #ddd;
-@panel-footer-bg:             #f5f5f5;
-
-@panel-default-text:          @gray-dark;
-@panel-default-border:        #ddd;
-@panel-default-heading-bg:    #f5f5f5;
-
-@panel-primary-text:          #fff;
-@panel-primary-border:        @brand-primary;
-@panel-primary-heading-bg:    @brand-primary;
-
-@panel-success-text:          @state-success-text;
-@panel-success-border:        @state-success-border;
-@panel-success-heading-bg:    @state-success-bg;
-
-@panel-info-text:             @state-info-text;
-@panel-info-border:           @state-info-border;
-@panel-info-heading-bg:       @state-info-bg;
-
-@panel-warning-text:          @state-warning-text;
-@panel-warning-border:        @state-warning-border;
-@panel-warning-heading-bg:    @state-warning-bg;
-
-@panel-danger-text:           @state-danger-text;
-@panel-danger-border:         @state-danger-border;
-@panel-danger-heading-bg:     @state-danger-bg;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-@thumbnail-padding:           4px;
-//** Thumbnail background color
-@thumbnail-bg:                @body-bg;
-//** Thumbnail border color
-@thumbnail-border:            #ddd;
-//** Thumbnail border radius
-@thumbnail-border-radius:     @border-radius-base;
-
-//** Custom text color for thumbnail captions
-@thumbnail-caption-color:     @text-color;
-//** Padding around the thumbnail caption
-@thumbnail-caption-padding:   9px;
-
-
-//== Wells
-//
-//##
-
-@well-bg:                     #f5f5f5;
-@well-border:                 darken(@well-bg, 7%);
-
-
-//== Badges
-//
-//##
-
-@badge-color:                 #fff;
-//** Linked badge text color on hover
-@badge-link-hover-color:      #fff;
-@badge-bg:                    @gray-light;
-
-//** Badge text color in active nav link
-@badge-active-color:          @link-color;
-//** Badge background color in active nav link
-@badge-active-bg:             #fff;
-
-@badge-font-weight:           bold;
-@badge-line-height:           1;
-@badge-border-radius:         10px;
-
-
-//== Breadcrumbs
-//
-//##
-
-@breadcrumb-padding-vertical:   8px;
-@breadcrumb-padding-horizontal: 15px;
-//** Breadcrumb background color
-@breadcrumb-bg:                 #f5f5f5;
-//** Breadcrumb text color
-@breadcrumb-color:              #ccc;
-//** Text color of current page in the breadcrumb
-@breadcrumb-active-color:       @gray-light;
-//** Textual separator for between breadcrumb elements
-@breadcrumb-separator:          "/";
-
-
-//== Carousel
-//
-//##
-
-@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
-
-@carousel-control-color:                      #fff;
-@carousel-control-width:                      15%;
-@carousel-control-opacity:                    .5;
-@carousel-control-font-size:                  20px;
-
-@carousel-indicator-active-bg:                #fff;
-@carousel-indicator-border-color:             #fff;
-
-@carousel-caption-color:                      #fff;
-
-
-//== Close
-//
-//##
-
-@close-font-weight:           bold;
-@close-color:                 #000;
-@close-text-shadow:           0 1px 0 #fff;
-
-
-//== Code
-//
-//##
-
-@code-color:                  #c7254e;
-@code-bg:                     #f9f2f4;
-
-@kbd-color:                   #fff;
-@kbd-bg:                      #333;
-
-@pre-bg:                      #f5f5f5;
-@pre-color:                   @gray-dark;
-@pre-border-color:            #ccc;
-@pre-scrollable-max-height:   340px;
-
-
-//== Type
-//
-//##
-
-//** Horizontal offset for forms and lists.
-@component-offset-horizontal: 180px;
-//** Text muted color
-@text-muted:                  @gray-light;
-//** Abbreviations and acronyms border color
-@abbr-border-color:           @gray-light;
-//** Headings small color
-@headings-small-color:        @gray-light;
-//** Blockquote small color
-@blockquote-small-color:      @gray-light;
-//** Blockquote font size
-@blockquote-font-size:        (@font-size-base * 1.25);
-//** Blockquote border color
-@blockquote-border-color:     @gray-lighter;
-//** Page header border color
-@page-header-border-color:    @gray-lighter;
-//** Width of horizontal description list titles
-@dl-horizontal-offset:        @component-offset-horizontal;
-//** Point at which .dl-horizontal becomes horizontal
-@dl-horizontal-breakpoint:    @grid-float-breakpoint;
-//** Horizontal line color.
-@hr-border:                   @gray-lighter;
diff --git a/framework/crawler-ui/src/main/less/bootstrap-less/wells.less b/framework/crawler-ui/src/main/less/bootstrap-less/wells.less
deleted file mode 100644
index ef830a8..0000000
--- a/framework/crawler-ui/src/main/less/bootstrap-less/wells.less
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-//
-// Wells
-// --------------------------------------------------
-
-
-// Base class
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: @well-bg;
-  border: 1px solid @well-border;
-  border-radius: @border-radius-base;
-  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
-  blockquote {
-    border-color: #ddd;
-    border-color: rgba(0,0,0,.15);
-  }
-}
-
-// Sizes
-.well-lg {
-  padding: 24px;
-  border-radius: @border-radius-large;
-}
-.well-sm {
-  padding: 9px;
-  border-radius: @border-radius-small;
-}
diff --git a/framework/crawler-ui/src/main/less/boxes.less b/framework/crawler-ui/src/main/less/boxes.less
deleted file mode 100644
index a3e1540..0000000
--- a/framework/crawler-ui/src/main/less/boxes.less
+++ /dev/null
@@ -1,253 +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.
- */
-
-/*
- * Component: Box
- * --------------
- */
-.box {
-  position: relative;
-  background: #ffffff;
-  border:1px solid @box-border-color;
-  border-top: 3px solid @box-default-border-top-color;
-  margin-bottom: 20px;
-  width: 100%;
-  box-shadow: @box-boxshadow;
-
-  // Box color variations
-  &.box-primary {
-    border-top-color: @light-blue;
-  }
-  &.box-info {
-    border-top-color: @aqua;
-  }
-  &.box-danger {
-    border-top-color: @red;
-  }
-  &.box-warning {
-    border-top-color: @yellow;
-  }
-  &.box-success {
-    border-top-color: @green;
-  }
-  &.box-default {
-    border-top-color: @gray;
-  }
-
-  // collapsed mode
-  &.collapsed-box {
-    .box-body,
-    .box-footer {
-      display: none;
-    }
-  }
-
-  .nav-stacked {
-    > li {
-      border-bottom: 1px solid @box-border-color;
-      margin: 0;
-      &:last-of-type {
-        border-bottom: none;
-      }
-    }
-  }
-
-  // fixed height to 300px
-  &.height-control {
-    .box-body {
-      max-height: 300px;
-      overflow: auto;
-    }
-  }
-
-  .border-right {
-    border-right: 1px solid @box-border-color;
-  }
-  .border-left {
-    border-left: 1px solid @box-border-color;
-  }
-
-  //SOLID BOX
-  //---------
-  //use this class to get a colored header and borders
-
-  &.box-solid {
-    border-top: 0;
-    > .box-header {
-      .btn.btn-default {
-        background: transparent;
-      }
-      .btn,
-      a {
-        &:hover {
-          background: rgba(0,0,0,0.1)!important;
-        }
-      }
-    }
-
-    // Box color variations
-    &.box-default {
-      .box-solid-variant(@gray, #444);
-    }
-    &.box-primary {
-      .box-solid-variant(@light-blue);
-    }
-    &.box-info {
-      .box-solid-variant(@aqua);
-    }
-    &.box-danger {
-      .box-solid-variant(@red);
-    }
-    &.box-warning {
-      .box-solid-variant(@yellow);
-    }
-    &.box-success {
-      .box-solid-variant(@green);
-    }
-
-    > .box-header > .box-tools .btn {
-      border: 0;
-      box-shadow: none;
-    }
-
-    // Fix font color for tiles
-    &[class*='bg'] {
-      > .box-header {
-        color: #fff;
-      }
-    }
-
-  }
-
-  //BOX GROUP
-  .box-group {
-    > .box {
-      margin-bottom: 5px;
-    }
-  }
-}
-
-//Add clearfix to header, body and footer
-.box-header,
-.box-body,
-.box-footer {
-  .clearfix();
-}
-
-//Box header
-.box-header {
-  color: #444;
-  display: block;
-  padding-top: @box-padding;
-  position: relative;
-
-  //Add bottom border
-  &.with-border {
-    border-bottom: 1px solid @box-border-color;
-    .collapsed-box & {
-      border-bottom: none;
-    }
-  }
-
-  //Icons and box title
-  > .fa,
-  .box-title {
-    display: inline-block;
-    font-size: 18px;
-    margin: 0;
-    line-height: 1;
-  }
-  > .fa {
-    margin-right: 5px;
-  }
-  > .box-tools {
-    position: absolute;
-    right: 10px;
-    top: 5px;
-    [data-toggle="tooltip"] {
-      position: relative;
-    }
-    //float: none!important;
-    &.pull-right {
-      .dropdown-menu {
-        right: 0;
-        left: auto;
-      }
-    }
-  }
-}
-
-//Box Tools Buttons
-.btn-box-tool {
-  padding: 5px;
-  font-size: 12px;
-  background: transparent;
-  box-shadow: none!important;
-  color: darken(@box-default-border-top-color, 20%);
-  .open &,
-  &:hover {
-    color: darken(@box-default-border-top-color, 40%);
-  }
-  &:active {
-    outline: none!important;
-  }
-}
-
-//Box Body
-.box-body {
-  overflow:auto;
-  padding: @box-padding;
-  .no-header & {
-    .border-top-radius(@box-border-radius);
-  }
-  // Tables within the box body
-  > .table {
-    margin-bottom: 0;
-  }
-
-  // Calendar within the box body
-  .fc {
-    margin-top: 5px;
-  }
-
-  .full-width-chart {
-    margin: -19px;
-  }
-  &.no-padding .full-width-chart {
-    margin: -9px;
-  }
-
-  .box-pane {
-    //.border-radius(0; 0; @box-border-radius; 0);
-  }
-  .box-pane-right {
-    //.border-radius(0; 0; 0; @box-border-radius);
-  }
-}
-
-//Box footer
-.box-footer {
-  //.border-radius(0; 0; @box-border-radius; @box-border-radius);
-  border-top: 1px solid @box-border-color;
-  padding: @box-padding;
-  background-color: @box-footer-bg;
-}
-
-//Input in box
-.box-input {
-  max-width: 200px;
-}
diff --git a/framework/crawler-ui/src/main/less/buttons.less b/framework/crawler-ui/src/main/less/buttons.less
deleted file mode 100644
index 588010c..0000000
--- a/framework/crawler-ui/src/main/less/buttons.less
+++ /dev/null
@@ -1,153 +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.
- */
-
-/*
- * Component: Button
- * -----------------
- */
-
-.btn {
-  .border-radius(@btn-border-radius);
-  .box-shadow(@btn-boxshadow);
-  border: 1px solid transparent;
-
-  &.uppercase {
-    text-transform: uppercase
-  }
-
-  // Flat buttons
-  &.btn-flat {
-    .border-radius(0);
-    -webkit-box-shadow: none;
-    -moz-box-shadow: none;
-    box-shadow: none;
-    border-width: 1px;
-  }
-
-  // Active state
-  &:active {
-    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);
-    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);
-    box-shadow: inset 0 3px 5px rgba(0,0,0,.125);
-  }
-
-  &:focus {
-    outline: none;
-  }
-
-  // input file btn
-  &.btn-file {
-    position: relative;
-    overflow: hidden;
-    > input[type='file'] {
-      position: absolute;
-      top: 0;
-      right: 0;
-      min-width: 100%;
-      min-height: 100%;
-      font-size: 100px;
-      text-align: right;
-      .opacity(0);            
-      outline: none;
-      background: white;
-      cursor: inherit;
-      display: block;
-    }
-  }  
-}
-
-//Button color variations
-.btn-default {
-  color: #444;
-  border-color: #ddd;
-  &:hover, &:active, &.hover {
-    background-color:darken(#f4f4f4, 5%)!important;
-  }
-}
-.btn-primary {
-  .button-variant(@btn-primary-color; @light-blue; darken(@light-blue, 5%));
-}
-.btn-success {
-  .button-variant(@btn-primary-color; @green; darken(@green, 5%));
-}
-.btn-info {
-  .button-variant(@btn-primary-color; @aqua; darken(@aqua, 5%));
-}
-.btn-danger {
-  .button-variant(@btn-primary-color; @red; darken(@red, 5%));
-}
-.btn-warning {
-  .button-variant(@btn-primary-color; @yellow; darken(@yellow, 5%));
-}
-.btn-outline {
-  border: 1px solid #fff;
-  background: transparent;
-  color: #fff;
-  &:hover,
-    &:focus,
-    &:active {
-    color: rgba(255,255,255,.7);
-    border-color: rgba(255,255,255,.7);
-  }
-}
-.btn-link {
-  .box-shadow(none);
-}
-//General .btn with bg class
-.btn[class*='bg-']:hover {
-  .box-shadow(inset 0 0 100px rgba(0,0,0,0.2));
-}
-// Application buttons
-.btn-app {
-  .border-radius(3px);
-  position: relative;
-  padding: 15px 5px;
-  margin: 0 0 10px 10px;
-  min-width: 80px;
-  height: 60px;  
-  text-align: center;
-  color: #666;
-  border: 1px solid #ddd;
-  background-color: #f4f4f4;
-  font-size: 12px;
-  //Icons within the btn
-  > .fa {
-    font-size: 20px;
-    display: block;
-  }
-
-  &:hover {
-    background: #f4f4f4;
-    color: #444;
-    border-color: #aaa;
-  }
-
-  &:active, &:focus {
-    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);
-    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);
-    box-shadow: inset 0 3px 5px rgba(0,0,0,.125);
-  }
-
-  //The badge
-  > .badge {
-    position: absolute;
-    top: -3px;
-    right: -10px;
-    font-size: 10px;
-    font-weight: 400;
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/callout.less b/framework/crawler-ui/src/main/less/callout.less
deleted file mode 100644
index c539cd3..0000000
--- a/framework/crawler-ui/src/main/less/callout.less
+++ /dev/null
@@ -1,66 +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.
- */
-
-/*
- * Component: Callout
- * ------------------
- */
-
-// Base styles (regardless of theme)
-.callout {
-  .border-radius(3px);
-  margin: 0 0 10px 0;
-  padding: 15px 30px 15px 15px;
-  border-left: 5px solid #eee;
-  a {
-    color: #fff;
-    text-decoration: underline;
-    &:hover {
-      color: #eee;
-    }
-  }
-  h4 {
-    margin-top: 0;
-    font-weight: 600;
-  }
-  p:last-child {
-    margin-bottom: 0;
-  }
-  code,
-  .highlight {
-    background-color: #fff;
-  }
-
-  // Themes for different contexts
-  &.callout-danger {
-    &:extend(.bg-red);
-    border-color: darken(@red, 10%);
-  }
-  &.callout-warning {
-    &:extend(.bg-yellow);
-    border-color: darken(@yellow, 10%);
-  }
-  &.callout-info {
-    &:extend(.bg-aqua);
-    border-color: darken(@aqua, 10%);
-  }
-  &.callout-success {
-    &:extend(.bg-green);
-    border-color: darken(@green, 10%);
-  }
-  +.table{margin-top:10px;}
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/core.less b/framework/crawler-ui/src/main/less/core.less
deleted file mode 100644
index 850859a..0000000
--- a/framework/crawler-ui/src/main/less/core.less
+++ /dev/null
@@ -1,151 +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.
- */
-
-/*
- * Core: Genral Layout Style
- * -------------------------
- */
-html,
-body {
-  min-height: 100%;
-  .layout-boxed & {
-    height: 100%;
-  }
-}
-
-body {  
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  font-weight: 400;
-  overflow-x: hidden;
-  overflow-y: auto;
-  //background-color: @body-bg;
-}
-
-/* Layout */
-.wrapper {
-  .clearfix();
-  min-height: 100%;
-  position: static;
-  overflow: hidden;
-}
-
-/*
- * Content Wrapper - contains the main content
- */
-.content-wrapper,
-.main-footer {    
-  //Using disposable variable to join statements with a comma
-  @transition-rule: @transition-speed @transition-fn,
-                    margin @transition-speed @transition-fn;
-  .transition-transform(@transition-rule);
-  margin-left: @sidebar-width;
-  z-index: 820;
-  //Top nav layout
-  .layout-top-nav & {
-    margin-left: 0;
-  }
-  @media (max-width: @screen-xs-max) {    
-    margin-left: 0;
-  }
-  //When opening the sidebar on large screens
-  .sidebar-collapse & {
-    @media (min-width: @screen-sm) {
-      margin-left: 0;
-    }
-  }
-  //When opening the sidebar on small screens
-  .sidebar-open & {
-    @media (max-width: @screen-xs-max) {
-      .translate(@sidebar-width, 0);
-    }
-  }
-}
-
-.content-wrapper{
-  min-height: 100%;
-  background-color: @body-bg;
-  z-index: 800;
-}
-.main-footer {
-  background-color: @body-bg;
-  padding: 0 15px;
-  color: #444;
-  font-size: 12px;
-  height: @main-footer-height;
-  line-height: @main-footer-height - 1; //Subtract the border
-  display: none;
-}
-
-/* Fixed layout */
-.fixed {
-  .main-header,
-  .main-sidebar{
-    position: fixed;
-  }
-  .main-header {
-    top: 0;
-    right: 0;
-    left: 0;
-  }
-  .content-wrapper{
-    padding-top: @navbar-height;
-    @media (max-width: @screen-header-collapse) {
-      padding-top: 100px;
-    }
-  }
-  &.layout-boxed {
-    .wrapper {
-      max-width: 100%;
-    }
-  }
-}
-
-/* Content */
-.content {
-  min-height: 250px;
-  padding: 15px;
-  .container-fixed(@grid-gutter-width);
-}
-
-/* H1 - H6 font */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
-  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-}
-/* General Links */
-a {
-  color: @link-color;
-}
-a:hover,
-a:active,
-a:focus {
-  outline: none;
-  text-decoration: none;
-  color: @link-hover-color;
-}
diff --git a/framework/crawler-ui/src/main/less/displaytable.less b/framework/crawler-ui/src/main/less/displaytable.less
deleted file mode 100644
index 610a1ea..0000000
--- a/framework/crawler-ui/src/main/less/displaytable.less
+++ /dev/null
@@ -1,69 +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.
- */
-
-.displaytable,.formtable{
-  .table;
-  .table-bordered();
-}
-
-.displaytable,.formtable{
-  tr{
-    td{
-      padding:7px;
-    }
-    .separator,
-    .formseparator{
-      display: none;
-    }
-    .description{
-      font-weight: bold;
-    }
-  }
-}
-.displaytable,.formtable{
-  td{
-    input[type="text"],
-    input[type="password"],
-    select{
-      height: @input-height-base;
-      padding: @padding-base-vertical @padding-base-horizontal;
-      font-size: @font-size-base;
-      line-height: @line-height-base;
-      background-color: @input-bg;
-      background-image: none;
-      border: 1px solid @input-border;
-      border-radius: @input-border-radius;
-      .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
-      .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
-      .border-radius(@input-radius)!important;
-      box-shadow: none!important;
-      border-color: @gray;
-      width:auto!important;
-      &:focus {
-        border-color: @light-blue !important;
-        box-shadow: none;
-      }
-    }
-    input[type="submit"],
-    input[type="reset"],
-    input[type="button"]{
-      .btn;
-      .btn-primary;
-      color: #fff;
-    }
-  }
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/dropdown.less b/framework/crawler-ui/src/main/less/dropdown.less
deleted file mode 100644
index b676cf3..0000000
--- a/framework/crawler-ui/src/main/less/dropdown.less
+++ /dev/null
@@ -1,141 +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.
- */
-
-/*
- * Component: Dropdown menus
- * -------------------------
- */
-
-/*Dropdowns in general*/
-.dropdown-menu {
-  box-shadow: @box-boxshadow;
-  border-radius: 2px;
-  > li > a {
-    color: #777;
-  }
-  > li > a > .fa {
-    margin-right: 10px;
-  }
-  > li > a:hover {
-    background-color: lighten(@gray, 5%);
-    color: #333;
-  }
-  > .divider {
-    background-color: #eee;
-  }
-}
-
-/* Add fade animation to dropdown menus by appending
- the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/
-.open:not(.dropup) > .animated-dropdown-menu {
-  backface-visibility: visible !important;
-  .animation(flipInX .7s both);
-
-}
-@keyframes flipInX {
-  0% {
-    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
-    transition-timing-function: ease-in;
-    opacity: 0;
-  }
-
-  40% {
-    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
-    transition-timing-function: ease-in;
-  }
-
-  60% {
-    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
-    opacity: 1;
-  }
-
-  80% {
-    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
-  }
-
-  100% {
-    transform: perspective(400px);
-  }
-}
-@-webkit-keyframes flipInX {
-  0% {
-    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
-    transition-timing-function: ease-in;
-    opacity: 0;
-  }
-
-  40% {
-    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
-    transition-timing-function: ease-in;
-  }
-
-  60% {
-    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
-    opacity: 1;
-  }
-
-  80% {
-    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
-  }
-
-  100% {
-    transform: perspective(400px);
-  }
-}
-
-/* Fix dropdown menu in navbars */
-.navbar-custom-menu > .navbar-nav {
-    > li {
-      position: relative;
-      > .dropdown-menu {
-        position: absolute;
-        right: 0;
-        left: auto;
-      }
-    }
-  }
-@media (max-width: @screen-sm-max) {
-  .navbar-custom-menu > .navbar-nav {
-    float: right;
-    > li {
-      position: static;
-      > .dropdown-menu {
-        position: absolute;
-        right: 5%;
-        left: auto;
-        border: 1px solid #ddd;
-        background: #fff;
-      }
-    }
-  }
-}
-
-.bootstrap-select{
-  .btn{
-    border-radius: 0;
-  }
-  &.open{
-    .dropdown-toggle{
-      box-shadow: none;
-      -webkit-box-shadow: none;
-    }
-  }
-  &:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){
-   width:170px;
-  }
-}
-
diff --git a/framework/crawler-ui/src/main/less/forms.less b/framework/crawler-ui/src/main/less/forms.less
deleted file mode 100644
index 63148af..0000000
--- a/framework/crawler-ui/src/main/less/forms.less
+++ /dev/null
@@ -1,110 +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.
- */
-
-/*
- * Component: Form
- * ---------------
- */
-.form-control {
-  width:auto !important;
-  .border-radius(@input-radius)!important;  
-  box-shadow: none;
-  border-color: @gray;
-  color: #555;
-  &:focus {
-    border-color: @light-blue !important;
-    box-shadow: none !important;
-  }
-  &::-moz-placeholder {
-    color: #bbb;
-    opacity: 1;
-  }
-  &:-ms-input-placeholder {
-    color: #bbb;
-  }
-  &::-webkit-input-placeholder {
-    color: #bbb;
-  }
-
-  &:not(select) {
-    -webkit-appearance: none;
-    -moz-appearance: none;
-    appearance: none;
-  }
-}
-
-.form-group {
-  .form-control {
-    width: 100% !important;
-  }
-  
-  &.has-success {
-    label {
-      color: @green;
-    }
-    .form-control {
-      border-color: @green !important;
-      box-shadow: none;
-    }
-  }
-
-  &.has-warning {
-    label {
-      color: @yellow;
-    }
-    .form-control {
-      border-color: @yellow !important;
-      box-shadow: none;
-    }
-  }
-
-  &.has-error {
-    label {
-      color: @red;
-    }
-    .form-control {
-      border-color: @red !important;
-      box-shadow: none;
-    }
-  }
-}
-
-/* Input group */
-.input-group {
-  .input-group-addon {
-    .border-radius(@input-radius);
-    border-color: @gray;
-    background-color: #fff;
-  }
-  .label{
-    color:@black;
-    line-height: 3;
-  }
-  select{
-    .form-control;
-    display:table-cell;
-    width:auto;
-  }
-}
-/* button groups */
-.btn-group-vertical {
-  .btn {
-    &.btn-flat:first-of-type, &.btn-flat:last-of-type {
-      .border-radius(0);
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/header.less b/framework/crawler-ui/src/main/less/header.less
deleted file mode 100644
index 2510ab5..0000000
--- a/framework/crawler-ui/src/main/less/header.less
+++ /dev/null
@@ -1,220 +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.
- */
-
-/*
- * Component: Main Header
- * ----------------------
- */
-
-.main-header {
-  position: relative;
-  max-height: 100px;
-  z-index: 1030;
-  box-shadow: 0 5px 5px -5px #aaaaaa !important;
-  //Navbar
-  > .navbar {
-    .transition(margin-left @transition-speed @transition-fn);
-    margin-bottom: 0;
-    border: none;
-    min-height: @navbar-height;
-    border-radius: 0;
-    .layout-top-nav & {
-      margin-left: 0!important;
-    }
-    h1{
-      font-size: 24px;
-      color: #808080;
-      margin: 27px 10px;
-      float: left;
-      font-weight: 300;
-    }
-  }    
-
-  //Navbar Right Menu
-  .navbar-custom-menu,
-  .navbar-right {
-    float: right;
-    .spinner{
-      display: none;
-      margin: 28px 40px;
-      float: left;
-    }
-    @media (max-width: @screen-sm-max) {
-       a {
-        color: inherit;
-        background: transparent;
-      }
-      .spinner{
-        margin: 28px 20px;
-      }
-    }
-  }
-  .navbar-right {
-    @media (max-width: @screen-header-collapse) {
-      float: none;
-      .navbar-collapse & {
-        margin: 7.5px -15px;
-      }
-      > li {
-        color: inherit;
-        border: 0;
-      }
-    }
-  }
-  //Navbar toggle button
-  .sidebar-toggle {
-    float: left;
-    background-color: transparent;
-    background-image: none;
-    padding: @navbar-padding-vertical @navbar-padding-horizontal;
-    //Add the fontawesome bars icon
-    font-family: fontAwesome;
-    &:before {
-      content: "\f0c9";
-    }
-    &:hover {
-      color: #fff;
-    }
-    &:focus,
-    &:active {
-      background: transparent;
-    }
-  }
-  .sidebar-toggle .icon-bar {
-    display: none;
-  }
-  //Navbar User Menu
-  .navbar .nav > li.user > a {
-    > .fa {
-      margin-right: 5px;
-    }
-  }
-
-  //Labels in navbar
-  .navbar .nav > li > a > .label {
-    position: absolute;
-    top: 9px;
-    right: 7px;
-    text-align: center;
-    font-size: 9px;
-    padding: 2px 3px;
-    line-height: .9;
-  }
-
-  //Logo bar
-  .logo {
-    .transition(width @transition-speed @transition-fn);
-    display: block;
-    float: left;
-    height: @navbar-height;
-    font-size: 20px;
-    line-height: @navbar-height - 3;
-    text-align: center;
-    width: @sidebar-width;
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    padding: 0 15px;
-    font-weight: 300;
-    overflow: hidden;
-    //Add support to sidebar mini by allowing the user to create
-    //2 logo designs. mini and lg
-    .logo-lg {
-      //should be visibile when sidebar isn't collapsed
-      display: block;
-    }
-    .logo-mini {
-      display: none;
-    }
-    img{
-      width:100%;
-      height: 100%;
-    }
-  }
-  //Navbar Brand. Alternative logo with layout-top-nav
-  .navbar-brand {
-    color: #fff;
-  }
-}
-
-// Content Header
-.content-header {
-  position: relative;
-  padding: 15px 15px 0 15px;
-  // Header Text
-  > h1 {
-    margin: 0;
-    font-size: 24px;
-    > small {
-      font-size: 15px;
-      display: inline-block;
-      padding-left: 4px;
-      font-weight: 300;
-    }
-  }
-}
-.navbar-toggle {
-  color: #fff;
-  border: 0;
-  margin: 0;
-  padding: @navbar-padding-vertical @navbar-padding-horizontal;
-}
-//Control navbar scaffolding on x-small screens
-@media (max-width: @screen-sm-max) {
-  .navbar-custom-menu .navbar-nav > li {
-    float: left;
-  }
-  //Dont't let links get full width
-  .navbar-custom-menu .navbar-nav {
-    margin: 0;
-    float: left;
-  }
-
-  .navbar-custom-menu .navbar-nav > li > a {
-    padding-top: 15px;
-    padding-bottom: 15px;
-    line-height: 20px;
-  }
-}
-
-// Collapse header
-@media (max-width: @screen-header-collapse) {
-  .main-header {
-    position: relative;
-    .navbar {
-      margin: 0;
-    }
-    .navbar-custom-menu {
-      float: right;
-    }
-
-    .sidebar-toggle{
-      float:right;
-      border-left:solid 1px #eee;
-    }
-  }
-}
-
-.navbar-collapse.pull-left {
-  @media(max-width: @screen-sm-max) {
-    float: none!important;
-    + .navbar-custom-menu {      
-      display: block;
-      position: absolute;
-      top: 0;
-      right: 40px;
-    }
-  }  
-}
diff --git a/framework/crawler-ui/src/main/less/labels.less b/framework/crawler-ui/src/main/less/labels.less
deleted file mode 100644
index 70a8004..0000000
--- a/framework/crawler-ui/src/main/less/labels.less
+++ /dev/null
@@ -1,40 +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.
- */
-
-/*
- * Component: Label
- * ----------------
- */
-.label-default {
-  background-color: @gray;
-  color: #444;
-}
-.label-danger {
-  &:extend(.bg-red);
-}
-.label-info {
-  &:extend(.bg-aqua);
-}
-.label-waring {
-  &:extend(.bg-yellow);
-}
-.label-primary {
-  &:extend(.bg-light-blue);
-}
-.label-success {
-  &:extend(.bg-green);
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/login.less b/framework/crawler-ui/src/main/less/login.less
deleted file mode 100644
index bde6858..0000000
--- a/framework/crawler-ui/src/main/less/login.less
+++ /dev/null
@@ -1,59 +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.
- */
-
-/*
- * Page: Login & Register
- * ----------------------
- */
-
-.login-logo{
-  font-size: 35px;
-  text-align: center;
-  font-weight: 300;
-  padding:10px;
-  border-bottom:solid 1px @box-border-color;
-  a {
-    color: #444;
-  }
-}
-
-.login-box{
-  width: 360px;
-  margin: 0px auto;
-  border:solid 1px @box-border-color;
-  box-shadow: @box-boxshadow;
-  @media (max-width: @screen-sm) {
-    width: 90%;
-    margin-top: 20px;
-  }
-}
-
-.login-box-body{
-  background: #fff;
-  padding:20px;
-  color: #444;
-  border-top: 0;
-  color: #666;
-  .form-control-feedback {
-    color: #777;
-  }
-}
-.login-box-msg{
-  margin: 0;
-  text-align: center;  
-  padding: 0 20px 20px 20px;  
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/miscellaneous.less b/framework/crawler-ui/src/main/less/miscellaneous.less
deleted file mode 100644
index 4bf0d24..0000000
--- a/framework/crawler-ui/src/main/less/miscellaneous.less
+++ /dev/null
@@ -1,377 +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.
- */
-
-/*
- * General: Miscellaneous
- * ----------------------
- */
-// 10px padding and margins
-.pad {
-  padding: 10px;
-}
-.margin {
-  margin: 10px;
-}
-.margin-bottom {
-  margin-bottom: 20px;
-}
-// Display inline
-.inline {
-  display: inline;
-  width: auto;
-}
-
-// Description Blocks
-.description-block {
-  display: block;
-  margin: 10px 0;
-  text-align: center;
-  &.margin-bottom {
-    margin-bottom: 25px;
-  }
-  > .description-header {
-    margin: 0;
-    padding: 0;
-    font-weight: 600;
-    font-size: 16px;
-  }
-  > .description-text {
-    text-transform: uppercase;
-  }
-}
-
-// Background colors
-.bg-red,
-.bg-yellow,
-.bg-aqua,
-.bg-blue,
-.bg-light-blue,
-.bg-green,
-.bg-navy,
-.bg-teal,
-.bg-olive,
-.bg-lime,
-.bg-orange ,
-.bg-fuchsia,
-.bg-purple,
-.bg-maroon,
-.bg-black,
-.bg-red-active,
-.bg-yellow-active,
-.bg-aqua-active,
-.bg-blue-active,
-.bg-light-blue-active,
-.bg-green-active,
-.bg-navy-active,
-.bg-teal-active,
-.bg-olive-active,
-.bg-lime-active,
-.bg-orange-active,
-.bg-fuchsia-active,
-.bg-purple-active,
-.bg-maroon-active,
-.bg-black-active {
-  color: #fff !important;
-}
-.bg-gray {
-  color: #000;
-  background-color: @gray!important;
-}
-.bg-black {
-  background-color: @black!important;
-}
-.bg-red {
-  background-color: @red !important;
-}
-.bg-yellow {
-  background-color: @yellow !important;
-}
-.bg-aqua {
-  background-color: @aqua !important;
-}
-.bg-blue {
-  background-color: @blue !important;
-}
-.bg-light-blue {
-  background-color: @light-blue !important;
-}
-.bg-green {
-  background-color: @green !important;
-}
-.bg-navy {
-  background-color: @navy !important;
-}
-.bg-teal {
-  background-color: @teal !important;
-}
-.bg-olive {
-  background-color: @olive !important;
-}
-.bg-lime {
-  background-color: @lime !important;
-}
-.bg-orange {
-  background-color: @orange !important;
-}
-.bg-fuchsia {
-  background-color: @fuchsia !important;
-}
-.bg-purple {
-  background-color: @purple !important;
-}
-.bg-maroon {
-  background-color: @maroon !important;
-}
-
-//Set of Active Background Colors
-.bg-gray-active {
-  color: #000;
-  background-color: darken(@gray,10%)!important;
-}
-.bg-black-active {
-  background-color: darken(@black, 10%)!important;
-}
-.bg-red-active {
-  background-color: darken(@red , 6%)!important;
-}
-.bg-yellow-active {
-  background-color: darken(@yellow , 6%)!important;
-}
-.bg-aqua-active {
-  background-color: darken(@aqua , 6%)!important;
-}
-.bg-blue-active {
-  background-color: darken(@blue , 10%)!important;
-}
-.bg-light-blue-active {
-  background-color: darken(@light-blue , 6%)!important;
-}
-.bg-green-active {
-  background-color: darken(@green , 5%)!important;
-}
-.bg-navy-active {
-  background-color: darken(@navy , 2%)!important;
-}
-.bg-teal-active {
-  background-color: darken(@teal , 5%)!important;
-}
-.bg-olive-active {
-  background-color: darken(@olive , 5%)!important;
-}
-.bg-lime-active {
-  background-color: darken(@lime , 5%)!important;
-}
-.bg-orange-active {
-  background-color: darken(@orange , 5%)!important;
-}
-.bg-fuchsia-active {
-  background-color: darken(@fuchsia , 5%)!important;
-}
-.bg-purple-active {
-  background-color: darken(@purple , 5%)!important;
-}
-.bg-maroon-active {
-  background-color: darken(@maroon , 3%)!important;
-}
-
-//Disabled!
-[class^="bg-"].disabled {
-  .opacity(.65);
-}
-
-// Text colors
-.text-red {
-  color: @red !important;
-}
-.text-yellow {
-  color: @yellow !important;
-}
-.text-aqua {
-  color: @aqua !important;
-}
-.text-blue {
-  color: @blue !important;
-}
-.text-black {
-  color: @black!important;
-}
-.text-light-blue {
-  color: @light-blue !important;
-}
-.text-green {
-  color: @green !important;
-}
-.text-gray {
-  color: @gray !important;
-}
-.text-navy {
-  color: @navy !important;
-}
-.text-teal {
-  color: @teal !important;
-}
-.text-olive {
-  color: @olive !important;
-}
-.text-lime {
-  color: @lime !important;
-}
-.text-orange {
-  color: @orange !important;
-}
-.text-fuchsia {
-  color: @fuchsia !important;
-}
-.text-purple {
-  color: @purple !important;
-}
-.text-maroon {
-  color: @maroon !important;
-}
-
-// Hide elements by display none only
-.hide {
-  display: none !important;
-}
-
-// Remove borders
-.no-border {
-  border: 0px !important;
-}
-// Remove padding
-.no-padding {
-  padding: 0px !important;
-}
-// Remove margins
-.no-margin {
-  margin: 0px !important;
-}
-
-// Remove box shadow
-.no-shadow {
-  box-shadow: none!important;
-}
-
-// Unstyled List
-.list-unstyled {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-
-// Remove border radius
-.flat {
-  .border-radius(0)!important;
-}
-
-.text-bold {
-  &, &.table td, &.table th {
-    font-weight: 700;
-  }
-  
-}
-
-// Gradient Background colors
-.bg-teal-gradient {
-  .gradient(@teal; @teal; lighten(@teal, 16%))!important;
-  color: #fff;
-}
-.bg-light-blue-gradient {
-  .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%))!important;
-  color: #fff;
-}
-.bg-blue-gradient {
-  .gradient(@blue; @blue; lighten(@blue, 7%))!important;
-  color: #fff;
-}
-.bg-aqua-gradient {
-  .gradient(@aqua; @aqua; lighten(@aqua, 7%))!important;
-  color: #fff;
-}
-.bg-yellow-gradient {
-  .gradient(@yellow; @yellow; lighten(@yellow, 16%))!important;
-  color: #fff;
-}
-.bg-purple-gradient {
-  .gradient(@purple; @purple; lighten(@purple, 16%))!important;
-  color: #fff;
-}
-.bg-green-gradient {
-  .gradient(@green; @green; lighten(@green, 7%))!important;
-  color: #fff;
-}
-.bg-red-gradient {
-  .gradient(@red; @red; lighten(@red, 10%))!important;
-  color: #fff;
-}
-.bg-black-gradient {
-  .gradient(@black; @black; lighten(@black, 10%))!important;
-  color: #fff;
-}
-.bg-maroon-gradient {
-  .gradient(@maroon; @maroon; lighten(@maroon, 10%))!important;
-  color: #fff;
-}
-.connectedSortable {
-  min-height: 100px;
-}
-.ui-helper-hidden-accessible {
-  border: 0;
-  clip: rect(0 0 0 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px;
-}
-.sort-highlight {
-  background: #f4f4f4;
-  border: 1px dashed #ddd;
-  margin-bottom: 10px;
-}
-.full-opacity-hover {
-  .opacity(.65);
-  &:hover {
-    .opacity(1);
-  }
-}
-
-//Custom
-.fa-fw {
-  width:auto;
-  margin-right: 0.4em;
-}
-
-.overlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background-color: fade(@sidebar-dark-bg, 50%);
-  z-index: 9999;
-  color: white;
-  display: inline-block;
-
-  .spinner{
-    display: block;
-    position: relative;
-    top: 50%;
-    text-align: center;
-  }
- }
diff --git a/framework/crawler-ui/src/main/less/mixins.less b/framework/crawler-ui/src/main/less/mixins.less
deleted file mode 100644
index f1103ca..0000000
--- a/framework/crawler-ui/src/main/less/mixins.less
+++ /dev/null
@@ -1,139 +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.
- */
-
-//ManifoldCF mixins
-//===============
-
-
-//Changes the color and the hovering properties of the navbar
-.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) {
-  background-color: @color;
-  //Navbar links
-  .nav > li > a {
-    color: @font-color;
-  }
-
-  .nav > li > a:hover,
-    .nav > li > a:active,
-    .nav > li > a:focus,
-    .nav .open > a,
-    .nav .open > a:hover,
-    .nav .open > a:focus {
-    background: @hover-bg;
-    color: @hover-color;
-  }
-
-  //Add color to the sidebar toggle button
-  .sidebar-toggle {
-    color: @font-color;
-    &:hover {
-      color: @hover-color;
-      background: @hover-bg;
-    }
-  }
-}
-
-//Box solid color variantion creator
-.box-solid-variant(@color; @text-color: #fff) {
-  border: 1px solid @color;
-  > .box-header {
-    color: @text-color;
-    background: @color;
-    background-color: @color;
-    a,
-    .btn {
-      color: @text-color;
-    }
-  }
-}
-
-
-//border radius creator
-.border-radius(@radius) {
-  border-radius: @radius;
-}
-
-//Gradient background
-.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {
-  background: @color;
-  background: -webkit-gradient(linear,
-    left bottom,
-    left top,
-    color-stop(0, @start),
-    color-stop(1, @stop));
-  background: -ms-linear-gradient(bottom,
-    @start,
-    @stop);
-  background: -moz-linear-gradient(center bottom,
-    @start 0%,
-    @stop 100%);
-  background: -o-linear-gradient(@stop,
-    @start);
-  filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@stop,@start));
-}
-
-//Added 2.1.0
-//Skins Mixins
-
-//Dark Sidebar Mixin
-.skin-dark-sidebar(@link-hover-border-color) {
-  .main-sidebar{
-    background-color: @sidebar-dark-bg;
-  }
-
-  //Sidebar Menu. First level links
-  .sidebar-menu > li {
-    //Section Headning
-    &.header {
-      color: lighten(@sidebar-dark-bg, 20%);
-      background: darken(@sidebar-dark-bg, 4%);
-    }
-    //links
-    > a {
-      border-left: 3px solid transparent;      
-    }
-    //Hover and active states
-    &:hover > a, &.active > a {
-      color: @sidebar-dark-hover-color;
-      background: @sidebar-dark-hover-bg;
-      border-left-color: @link-hover-border-color;
-    }
-    //First Level Submenu
-    > .treeview-menu {
-      margin: 0 1px;
-      background: @sidebar-dark-submenu-bg;
-    }
-  }
-  //All links within the sidebar menu
-  .sidebar a {
-    color: @sidebar-dark-color;
-    &:hover {
-      text-decoration: none;
-    }
-  }
-  //All submenus
-  .treeview-menu {
-    > li {
-      > a {
-        color: @sidebar-dark-submenu-color;
-      }
-      &.active > a, > a:hover {
-        color: @sidebar-dark-submenu-hover-color;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/modal.less b/framework/crawler-ui/src/main/less/modal.less
deleted file mode 100644
index 89a429d..0000000
--- a/framework/crawler-ui/src/main/less/modal.less
+++ /dev/null
@@ -1,38 +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.
- */
-
-/*
- * Component: modal
- * ----------------
- */
-.modal {
-  background: rgba(0,0,0,.3);
-}
-.modal-content {
-  .border-radius(0);
-  .box-shadow(0 2px 3px rgba(0,0,0,.125))!important;
-  border: 0;
-  @media (min-width: @screen-sm-min) {
-    .box-shadow(0 2px 3px rgba(0,0,0,.125))!important;
-  }
-}
-.modal-header {
-  border-bottom-color: @box-border-color;
-}
-.modal-footer {
-  border-top-color: @box-border-color;
-}
diff --git a/framework/crawler-ui/src/main/less/navs.less b/framework/crawler-ui/src/main/less/navs.less
deleted file mode 100644
index a3ab1f9..0000000
--- a/framework/crawler-ui/src/main/less/navs.less
+++ /dev/null
@@ -1,161 +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.
- */
-
-/*
- * Component: Nav
- * --------------
- */
-
-
-.nav-tabs {
-  margin: 0;
-  border-bottom-color: #f4f4f4;
-  .border-top-radius(@box-border-radius);
-  > li {
-    border-top: 3px solid transparent;
-    margin-bottom: -2px;
-    > a {
-      .border-radius(0)!important;
-      &,
-      &:hover {
-        background: transparent;
-        margin: 0;
-      }
-    }
-    &:not(.active) {
-      > a:hover,
-        > a:focus,
-        > a:active {
-        border-color: transparent;
-      }
-    }
-    margin-right: 5px;
-  }
-
-  > li.active {
-    border-top-color: @light-blue;
-    & > a,
-    &:hover > a {
-      background-color: #fff;
-
-    }
-    > a {
-      border-top: 0;
-    }
-
-  }
-
-  > li:first-of-type {
-    margin-left: 10px;
-  }
-
-  //Pulled to the right
-  &.pull-right {
-    float: none!important;
-    > li {
-      float: right;
-    }
-    > li:first-of-type {
-      margin-right: 0;
-      &.active {
-        > a {
-          border-left-width: 1px;
-          border-right-width: 0;
-        }
-      }
-    }
-  }
-
-  > li.header {
-    line-height: 35px;
-    padding: 0 10px;
-    font-size: 20px;
-    color: #444;
-    > .fa {
-      margin-right: 5px;
-    }
-  }
-}
-
-.tab-content{
-  padding: 10px;
-  .tab-pane{
-    .form-control{
-      width:auto!important;
-      //display: inline;
-    }
-  }
-}
-
-
-/* Nav tabs bottom */
-.tabs-bottom {
-  &.nav-3 {
-    li a {
-      width: percentage(100/3)!important;
-    }
-  }
-  li a {
-    border: 0;
-  }
-}
-
-.tab-group{
-  border-bottom: 1px solid @box-border-color;
-  padding-bottom: 0px;
-  
-  .btn-group{
-    border:none;
-    border-radius:4px 4px 0px 0px;
-    border-top: 1px solid @nav-tabs-border-color;
-    margin:0px 3px;
-    
-    .btn{
-      padding:8px 12px;
-      border-radius:0px;
-      border-width: 3px 1px 0px 1px;
-      border-color:@nav-tabs-border-color;
-      border-top-color: transparent;
-      
-      &.active{
-        .box-shadow(none);
-        border-color:@btn-default-border;
-        border-top-color: @btn-primary-border ;
-      }
-      
-      &:active{
-        .box-shadow(none);
-      }
-    }
-  }
-  
-  > .btn-group:first-of-type{
-    margin-left:10px;
-  }
-}
-
-/* PAGINATION */
-.pagination {
-  > li > a {
-    background: #fafafa;
-    color: #666;
-  }
-  > li:first-of-type a,
-    > li:last-of-type a {
-    .border-radius(0);
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/sidebar-mini.less b/framework/crawler-ui/src/main/less/sidebar-mini.less
deleted file mode 100644
index 108f073..0000000
--- a/framework/crawler-ui/src/main/less/sidebar-mini.less
+++ /dev/null
@@ -1,144 +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.
- */
-
-/*
- * Component: Sidebar Mini
- */
-
-//Add sidebar-mini class to the body tag to activate this feature
-.sidebar-mini {
-  //Sidebar mini should work only on devices larger than @screen-sm
-  @media (min-width: @screen-sm) {
-    //When the sidebar is collapsed...
-    &.sidebar-collapse {
-
-      //Apply the new margining to the main content and footer
-      .content-wrapper,
-      .main-footer {
-        margin-left: 50px!important;
-        z-index: 840;
-      }
-
-      //Modify the sidebar to shrink instead of disappearing
-      .main-sidebar {
-        //Don't go away! Just shrink
-        .translate(0, 0);
-        width: 50px!important;
-        z-index: 850;
-      }
-
-      .sidebar-menu {
-        > li {
-          position: relative;
-          > a {
-            margin-right: 0;
-          }
-          > a > span {
-            border-top-right-radius: 4px;
-          }
-
-          &:not(.treeview) {
-            > a > span {
-              border-bottom-right-radius: 4px;
-            }
-          }
-
-          > .treeview-menu {
-            //Add some padding to the treeview menu
-            padding-top: 5px;
-            padding-bottom: 5px;
-            border-bottom-right-radius: 4px;
-          }
-
-          //Show menu items on hover
-          &:hover {
-            > a {
-              overflow: visible;
-            }
-            > a > span:not(.pull-right),
-            > .treeview-menu {
-              display: block!important;
-              position: absolute;
-              width: @sidebar-width;
-              left: 50px;
-            }
-
-            //position the header & treeview menus
-            > a > span {
-              top: 0;
-              margin-left: -3px;
-              padding: 12px 5px 12px 20px;
-              background-color: inherit;
-            }
-            > .treeview-menu {
-              top: 44px;
-              margin-left: 0;
-            }
-          }
-        }
-      }
-
-      //Make the sidebar links, menus, labels, badges
-      //and angle icons disappear
-      .main-sidebar .user-panel > .info,
-      .sidebar-form,
-      .sidebar-menu > li > a > span,
-      .sidebar-menu > li > .treeview-menu,
-      .sidebar-menu >li > a > .pull-right,
-      .sidebar-menu li.header {
-        display: none!important;
-      }
-
-      .main-header {
-        //Let's make the logo also shrink and the mini logo to appear
-        .logo {
-          > .logo-mini {
-            display: block;
-            margin-left: -15px;
-            margin-right: -15px;
-            font-size: 18px;
-          }
-          > .logo-lg {
-            display: none;
-          }
-        }
-      }
-    }
-  }
-}
-
-//A fix for text overflow while transitioning from sidebar mini to full sidebar
-.sidebar-menu li > a,
-.main-sidebar .user-panel,
-.sidebar-menu > li.header {
-  white-space: nowrap!important;
-  overflow: hidden;
-}
-.sidebar-form,
-.sidebar-menu > li.header {
-  overflow: hidden;
-  text-overflow: clip;
-}
-.sidebar-menu li > a {
-  position: relative;
-  > .pull-right {
-    position: absolute;
-    top: 50%;
-    right: 10px;
-    margin-top: -7px;
-  }
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/sidebar.less b/framework/crawler-ui/src/main/less/sidebar.less
deleted file mode 100644
index e797790..0000000
--- a/framework/crawler-ui/src/main/less/sidebar.less
+++ /dev/null
@@ -1,123 +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.
- */
-
-/*
- * Component: Sidebar
- * ------------------
- */
-//Main Sidebar
-.main-sidebar{
-  position: absolute;
-  top: @navbar-height;
-  left: 0;
-  min-height: 100%;
-  width: @sidebar-width;
-  z-index: 810;
-  box-shadow: 5px 0 5px -5px #333;
-  //Using disposable variable to join statements with a comma
-  @transition-rule: @transition-speed @transition-fn,
-    width @transition-speed @transition-fn;
-  .transition-transform(@transition-rule);
-  @media (max-width: @screen-xs-max) {
-    .translate(-@sidebar-width, 0);
-  }
-  .sidebar-collapse & {
-    @media (min-width: @screen-sm) {
-      .translate(-@sidebar-width, 0);
-    }
-  }
-  .sidebar-open & {
-    @media (max-width: @screen-xs-max) {
-      .translate(0, 0);
-    }
-  }
-}
-
-.sidebar {
-  padding-bottom: 10px;
-}
-
-// Sidebar menu
-.sidebar-menu {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-  //First Level
-  > li {
-    position: relative;
-    margin: 0;
-    padding: 0;
-    > a {
-      padding: 12px 5px 12px 15px;
-      display: block;
-      > .fa {
-        width: 20px;
-      }
-    }
-    .label,
-    .badge {
-      margin-top: 3px;
-      margin-right: 5px;
-    }
-  }
-  li.header {
-    padding: 10px 25px 10px 15px;
-    font-size: 12px;
-  }
-  li > a > .fa-angle-left {
-    width: auto;
-    height: auto;
-    padding: 0;
-    margin-right: 10px;
-    margin-top: 3px;
-  }
-  li.active {
-    > a > .fa-angle-left {
-      .rotate(-90deg);
-    }
-    > .treeview-menu {
-      display: block;
-    }
-  }
-
-  // Tree view menu
-  .treeview-menu {
-    display: none;
-    list-style: none;
-    padding:0;
-    margin:0;
-    padding-left: 5px;
-    .treeview-menu {
-      padding-left: 20px;
-    }
-    > li {
-      margin: 0;
-      > a {
-        padding: 5px 5px 5px 15px;
-        display: block;
-        font-size: 14px;
-        > .fa {
-          width: 20px;
-        }
-        > .fa-angle-left,
-        > .fa-angle-down {
-          width: auto;
-        }
-      }
-    }
-  }
-}
diff --git a/framework/crawler-ui/src/main/less/skin-black.less b/framework/crawler-ui/src/main/less/skin-black.less
deleted file mode 100644
index 5f3e0af..0000000
--- a/framework/crawler-ui/src/main/less/skin-black.less
+++ /dev/null
@@ -1,72 +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.
- */
-
-/*
- * Skin: Black
- * -----------
- */
-@import (reference) "bootstrap-less/mixins.less";
-@import (reference) "bootstrap-less/variables.less";
-@import (reference) "variables.less";
-@import (reference) "mixins.less";
-
-/* skin-black navbar */
-.skin-black {
-  //Navbar & LogoLogo
-  .main-header {
-    .navbar-toggle {
-      color: #333;
-    }
-    .navbar-brand {
-      color: #333;
-      border-right: 1px solid #eee;
-    }
-    > .navbar {
-      .navbar-variant(#fff; #333; #999; #fff);
-      > .sidebar-toggle {
-        color: #333;
-        border-right: 1px solid #eee;
-      }
-      .navbar-nav {
-        > li > a {
-          border-right: 1px solid #eee;
-        }
-      }
-      .navbar-custom-menu .navbar-nav,
-      .navbar-right {
-        > li {
-          > a {
-            border-left: 1px solid #eee;
-            border-right-width: 0;
-          }
-        }
-      }
-      > .logo {
-        color: #333;
-        border-right: 1px solid #eee;
-      }
-    }
-  }
-
-  //Content Header
-  .content-header {
-    background: transparent;
-    box-shadow: none;
-  }
-  //Create the sidebar skin
-  .skin-dark-sidebar(#fff);
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/spinner.less b/framework/crawler-ui/src/main/less/spinner.less
deleted file mode 100644
index dcb0635..0000000
--- a/framework/crawler-ui/src/main/less/spinner.less
+++ /dev/null
@@ -1,66 +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.
- */
-
-.spinner > div {
-  width: 18px;
-  height: 18px;
-  background-color: #208182;
-  border-radius: 100%;
-  display: inline-block;
-  -webkit-animation: bouncedelay 1.4s infinite ease-in-out;
-  animation: bouncedelay 1.4s infinite ease-in-out;
-  /* Prevent first frame from flickering when animation starts */
-  -webkit-animation-fill-mode: both;
-  animation-fill-mode: both;
-}
-
-.spinner .bounce1 {
-  -webkit-animation-delay: -0.32s;
-  animation-delay: -0.32s;
-}
-
-.spinner .bounce2 {
-  -webkit-animation-delay: -0.16s;
-  animation-delay: -0.16s;
-}
-
-@-webkit-keyframes bouncedelay {
-  0%, 80%, 100% { -webkit-transform: scale(0.0) }
-  40% { -webkit-transform: scale(1.0) }
-}
-
-@keyframes bouncedelay {
-  0%, 80%, 100% {
-    transform: scale(0.0);
-    -webkit-transform: scale(0.0);
-  } 40% {
-      transform: scale(1.0);
-      -webkit-transform: scale(1.0);
-    }
-}
-
-#loader{
-  background-color: #FFF8DC;
-  border: 1px solid #E0DCBF;
-  color: #444;
-  padding:3px 10px;
-  position: absolute;
-  top:1px;
-  right:~"calc(50% - 80px)";
-  z-index: 999;
-  display:none; /*deafult display to none*/
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/style.less b/framework/crawler-ui/src/main/less/style.less
deleted file mode 100644
index 17b4357..0000000
--- a/framework/crawler-ui/src/main/less/style.less
+++ /dev/null
@@ -1,57 +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.
- */
-
-//Bootstrap Variables & Mixins
-//The core bootstrap code have not been modified. These files
-//are included only for reference.
-@import (reference) "bootstrap-less/mixins.less";
-@import (reference) "bootstrap-less/variables.less";
-
-//MISC
-//----
-@import "core.less";
-@import "variables.less";
-@import "mixins.less";
-
-//COMPONENTS
-//-----------
-@import "header.less";
-@import "sidebar.less";
-@import "sidebar-mini.less";
-@import "dropdown.less";
-@import "forms.less";
-@import "boxes.less";
-@import "buttons.less";
-@import "callout.less";
-@import "alerts.less";
-@import "navs.less";
-@import "table.less";
-@import "labels.less";
-@import "modal.less";
-@import "spinner.less";
-
-//PAGES
-//------
-@import "login.less";
-
-//Miscellaneous
-//-------------
-@import "miscellaneous.less";
-@import "displaytable.less";
-
-//THEME
-@import "skin-black.less";
diff --git a/framework/crawler-ui/src/main/less/table.less b/framework/crawler-ui/src/main/less/table.less
deleted file mode 100644
index 7c1069c..0000000
--- a/framework/crawler-ui/src/main/less/table.less
+++ /dev/null
@@ -1,98 +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.
- */
-
-/*
- * Component: Table
- * ----------------
- */
-
-.table {
-  //Cells
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        border-top: 1px solid @box-border-color;
-      }
-    }
-  }
-  //thead cells
-  > thead > tr > th {
-    border-bottom: 2px solid @box-border-color;
-  }
-  //progress bars in tables
-  tr td .progress {
-    margin-top: 5px;
-  }
-  .table{
-    margin-bottom: 0px;
-  }
-  +.callout{
-    margin-top:10px;
-  }
-
-  .callout{
-    margin:0px;
-  }
-}
-
-//Bordered Table
-.table-bordered {
-  border: 1px solid @box-border-color;
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        border: 1px solid @box-border-color;
-      }
-    }
-  }
-  > thead > tr {
-    > th,
-    > td {
-      border-bottom-width: 2px;
-    }
-  }
-}
-
-.table.no-border {
-  &,
-  td,
-  th {
-    border: 0;
-  }
-}
-
-/* .text-center in tables */
-table.text-center {
-  &, td, th {
-    text-align: center;
-  }
-}
-
-.table.align {
-  th {
-    text-align: left;
-  }
-  td {
-    text-align: right;
-  }
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/less/variables.less b/framework/crawler-ui/src/main/less/variables.less
deleted file mode 100644
index 38e47d2..0000000
--- a/framework/crawler-ui/src/main/less/variables.less
+++ /dev/null
@@ -1,122 +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.
- */
-
-//ManifoldCF Variables.less
-//=========================
-
-//COLORS
-//--------------------------------------------------------
-
-@light-blue: #0275d8;  //Primary
-@red:        #d9534f;  //Danger
-@green:      #00a65a;  //Success
-@aqua:       #00c0ef;  //Info
-@yellow:     #f39c12;  //Warning
-@blue:       #0073b7;
-@navy:       #001F3F;
-@teal:       #39CCCC;
-@olive:      #3D9970;
-@lime:       #01FF70;
-@orange:     #f0ad4e;
-@fuchsia:    #F012BE;
-@purple:     #605ca8;
-@maroon:     #D81B60;
-@black:      #111;
-@gray:       #d2d6de;
-
-//LAYOUT
-//--------------------------------------------------------
-
-//Side bar and logo width
-@sidebar-width: 230px;
-//When the logo should go to the top of the screen
-@screen-header-collapse: @screen-xs-max;
-@main-footer-height: 30px;
-
-//Link colors (Aka: <a> tags)
-@link-color:       @light-blue;
-@link-hover-color: lighten(@link-color, 15%);
-
-//Body background (Affects main content background only)
-@body-bg: #ecf0f5;
-
-//SIDEBAR SKINS
-//--------------------------------------------------------
-
-//Dark sidebar
-@sidebar-dark-bg:                  #34343E;
-@sidebar-dark-hover-bg:            darken(@sidebar-dark-bg, 2%);
-@sidebar-dark-color:               lighten(@sidebar-dark-bg, 80%);
-@sidebar-dark-hover-color:         #fff;
-@sidebar-dark-submenu-bg:          lighten(@sidebar-dark-bg, 5%);
-@sidebar-dark-submenu-color:       lighten(@sidebar-dark-submenu-bg, 70%);
-@sidebar-dark-submenu-hover-color: #fff;
-
-//Light sidebar
-@sidebar-light-bg:                  #f9fafc;
-@sidebar-light-hover-bg:            lighten(#f0f0f1, 1.5%);
-@sidebar-light-color:               #444;
-@sidebar-light-hover-color:         #000;
-@sidebar-light-submenu-bg:          @sidebar-light-hover-bg;
-@sidebar-light-submenu-color:       #777;
-@sidebar-light-submenu-hover-color: #000;
-
-//CONTROL SIDEBAR
-//--------------------------------------------------------
-@control-sidebar-width: @sidebar-width;
-
-
-//BOXES
-//--------------------------------------------------------
-@box-border-color:  #f4f4f4;
-@box-border-radius: 3px;
-@box-footer-bg:     #fff;
-@box-boxshadow:     0 2px 2px 0 rgba(0,0,0,.16),0 0 2px 0 rgba(0,0,0,.12);
-@box-padding:       10px;
-
-//Box variants
-@box-default-border-top-color: #d2d6de;
-
-//BUTTONS
-//--------------------------------------------------------
-@btn-boxshadow: none;
-
-//PROGRESS BARS
-//--------------------------------------------------------
-@progress-bar-border-radius:    1px;
-@progress-bar-sm-border-radius: 1px;
-@progress-bar-xs-border-radius: 1px;
-
-//FORMS
-//--------------------------------------------------------
-@input-radius: 0px;
-
-//BUTTONS
-//--------------------------------------------------------
-
-//Border radius for non flat buttons
-@btn-border-radius: 3px;
-
-//TRANSITIONS SETTINGS
-//--------------------------------------------------------
-
-//Transition global options
-@transition-speed: .3s;
-@transition-fn:    ease-in-out;//cubic-bezier(0.32,1.25,0.375,1.15);
-
-//ManifoldCF variables
-@navbar-height:                    80px;
diff --git a/framework/crawler-ui/src/main/webapp/ManifoldCF-logo.png b/framework/crawler-ui/src/main/webapp/ManifoldCF-logo.png
deleted file mode 100644
index c8c5476..0000000
--- a/framework/crawler-ui/src/main/webapp/ManifoldCF-logo.png
+++ /dev/null
Binary files differ
diff --git a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/c.tld b/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/c.tld
deleted file mode 100644
index 3632fb3..0000000
--- a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/c.tld
+++ /dev/null
@@ -1,580 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
- 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.
--->
-
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-    version="2.0">
-    
-  <description>JSTL 1.1 core library</description>
-  <display-name>JSTL core</display-name>
-  <tlib-version>1.1</tlib-version>
-  <short-name>c</short-name>
-  <uri>http://java.sun.com/jsp/jstl/core</uri>
-
-  <validator>
-    <description>
-        Provides core validation features for JSTL tags.
-    </description>
-    <validator-class>
-        org.apache.taglibs.standard.tlv.JstlCoreTLV
-    </validator-class>
-  </validator>
-
-  <tag>
-    <description>
-        Catches any Throwable that occurs in its body and optionally
-        exposes it.
-    </description>
-    <name>catch</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-exception thrown from a nested action. The type of the
-scoped variable is the type of the exception thrown.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Simple conditional tag that establishes a context for
-	mutually exclusive conditional operations, marked by
-	&lt;when&gt; and &lt;otherwise&gt;
-    </description>
-    <name>choose</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
-    <body-content>JSP</body-content>
-  </tag>
-
-  <tag>
-    <description>
-	Simple conditional tag, which evalutes its body if the
-	supplied condition is true and optionally exposes a Boolean
-	scripting variable representing the evaluation of this condition
-    </description>
-    <name>if</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The test condition that determines whether or
-not the body content should be processed.
-        </description>
-        <name>test</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-	<type>boolean</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resulting value of the test condition. The type
-of the scoped variable is Boolean.        
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Retrieves an absolute or relative URL and exposes its contents
-        to either the page, a String in 'var', or a Reader in 'varReader'.
-    </description>
-    <name>import</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ImportTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.ImportTEI</tei-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The URL of the resource to import.
-        </description>
-        <name>url</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resource's content. The type of the scoped
-variable is String.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resource's content. The type of the scoped
-variable is Reader.
-        </description>
-        <name>varReader</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the context when accessing a relative
-URL resource that belongs to a foreign
-context.
-        </description>
-        <name>context</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Character encoding of the content at the input
-resource.
-        </description>
-        <name>charEncoding</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	The basic iteration tag, accepting many different
-        collection types and supporting subsetting and other
-        functionality
-    </description>
-    <name>forEach</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.ForEachTEI</tei-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Collection of items to iterate over.
-        </description>
-	<name>items</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>java.lang.Object</type>
-    </attribute>
-    <attribute>
-        <description>
-If items specified:
-Iteration begins at the item located at the
-specified index. First item of the collection has
-index 0.
-If items not specified:
-Iteration begins with index set at the value
-specified.
-        </description>
-	<name>begin</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-If items specified:
-Iteration ends at the item located at the
-specified index (inclusive).
-If items not specified:
-Iteration ends when index reaches the value
-specified.
-        </description>
-	<name>end</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration will only process every step items of
-the collection, starting with the first one.
-        </description>
-	<name>step</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-current item of the iteration. This scoped
-variable has nested visibility. Its type depends
-on the object of the underlying collection.
-        </description>
-	<name>var</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-status of the iteration. Object exported is of type
-javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested
-visibility.
-        </description>
-	<name>varStatus</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Iterates over tokens, separated by the supplied delimeters
-    </description>
-    <name>forTokens</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForTokensTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-String of tokens to iterate over.
-        </description>
-	<name>items</name>
-	<required>true</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>java.lang.String</type>
-    </attribute>
-    <attribute>
-        <description>
-The set of delimiters (the characters that
-separate the tokens in the string).
-        </description>
-	<name>delims</name>
-	<required>true</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>java.lang.String</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration begins at the token located at the
-specified index. First token has index 0.
-        </description>
-	<name>begin</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration ends at the token located at the
-specified index (inclusive).
-        </description>
-	<name>end</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration will only process every step tokens
-of the string, starting with the first one.
-        </description>
-	<name>step</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-current item of the iteration. This scoped
-variable has nested visibility.
-        </description>
-	<name>var</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-status of the iteration. Object exported is of
-type
-javax.servlet.jsp.jstl.core.LoopTag
-Status. This scoped variable has nested
-visibility.
-        </description>
-	<name>varStatus</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Like &lt;%= ... &gt;, but for expressions.
-    </description> 
-    <name>out</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Expression to be evaluated.
-        </description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Default value if the resulting value is null.
-        </description>
-        <name>default</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Determines whether characters &lt;,&gt;,&amp;,'," in the
-resulting string should be converted to their
-corresponding character entity codes. Default value is
-true.
-        </description>
-        <name>escapeXml</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-
-  <tag>
-    <description>
-        Subtag of &lt;choose&gt; that follows &lt;when&gt; tags
-        and runs only if all of the prior conditions evaluated to
-        'false'
-    </description>
-    <name>otherwise</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
-    <body-content>JSP</body-content>
-  </tag>
-
-  <tag>
-    <description>
-        Adds a parameter to a containing 'import' tag's URL.
-    </description>
-    <name>param</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ParamTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the query string parameter.
-        </description>
-        <name>name</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Value of the parameter.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Redirects to a new URL.
-    </description>
-    <name>redirect</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.RedirectTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The URL of the resource to redirect to.
-        </description>
-        <name>url</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the context when redirecting to a relative URL
-resource that belongs to a foreign context.
-        </description>
-        <name>context</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Removes a scoped variable (from a particular scope, if specified).
-    </description>
-    <name>remove</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Name of the scoped variable to be removed.
-        </description>
-        <name>var</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
- <tag>
-    <description>
-        Sets the result of an expression evaluation in a 'scope'
-    </description>
-    <name>set</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.SetTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable to hold the value
-specified in the action. The type of the scoped variable is
-whatever type the value expression evaluates to.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Expression to be evaluated.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Target object whose property will be set. Must evaluate to
-a JavaBeans object with setter property property, or to a
-java.util.Map object.
-        </description>
-        <name>target</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the property to be set in the target object.
-        </description>
-        <name>property</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Creates a URL with optional query parameters.
-    </description>
-    <name>url</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.UrlTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-processed url. The type of the scoped variable is
-String.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-URL to be processed.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the context when specifying a relative URL
-resource that belongs to a foreign context.
-        </description>
-        <name>context</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Subtag of &lt;choose&gt; that includes its body if its
-	condition evalutes to 'true'
-    </description>
-    <name>when</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.WhenTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The test condition that determines whether or not the
-body content should be processed.
-        </description>
-        <name>test</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-	<type>boolean</type>
-    </attribute>
-  </tag>
-
-</taglib>
diff --git a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/fmt.tld b/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/fmt.tld
deleted file mode 100644
index f23c9fd..0000000
--- a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/fmt.tld
+++ /dev/null
@@ -1,688 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
- 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.
--->
-
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-    version="2.0">
-    
-  <description>JSTL 1.1 i18n-capable formatting library</description>
-  <display-name>JSTL fmt</display-name>
-  <tlib-version>1.1</tlib-version>
-  <short-name>fmt</short-name>
-  <uri>http://java.sun.com/jsp/jstl/fmt</uri>
-
-  <validator>
-    <description>
-        Provides core validation features for JSTL tags.
-    </description>
-    <validator-class>
-        org.apache.taglibs.standard.tlv.JstlFmtTLV
-    </validator-class>
-  </validator>
-
-  <tag>
-    <description>
-        Sets the request character encoding
-    </description>
-    <name>requestEncoding</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.RequestEncodingTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Name of character encoding to be applied when
-decoding request parameters.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Stores the given locale in the locale configuration variable
-    </description>
-    <name>setLocale</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.SetLocaleTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-A String value is interpreted as the
-printable representation of a locale, which
-must contain a two-letter (lower-case)
-language code (as defined by ISO-639),
-and may contain a two-letter (upper-case)
-country code (as defined by ISO-3166).
-Language and country codes must be
-separated by hyphen (-) or underscore
-(_).        
-	</description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Vendor- or browser-specific variant.
-See the java.util.Locale javadocs for
-more information on variants.
-        </description>
-        <name>variant</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of the locale configuration variable.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Specifies the time zone for any time formatting or parsing actions
-        nested in its body
-    </description>
-    <name>timeZone</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.TimeZoneTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The time zone. A String value is interpreted as
-a time zone ID. This may be one of the time zone
-IDs supported by the Java platform (such as
-"America/Los_Angeles") or a custom time zone
-ID (such as "GMT-8"). See
-java.util.TimeZone for more information on
-supported time zone formats.
-        </description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Stores the given time zone in the time zone configuration variable
-    </description>
-    <name>setTimeZone</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.SetTimeZoneTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-The time zone. A String value is interpreted as
-a time zone ID. This may be one of the time zone
-IDs supported by the Java platform (such as
-"America/Los_Angeles") or a custom time zone
-ID (such as "GMT-8"). See java.util.TimeZone for
-more information on supported time zone
-formats.
-        </description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable which
-stores the time zone of type
-java.util.TimeZone.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var or the time zone configuration
-variable.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Loads a resource bundle to be used by its tag body
-    </description>
-    <name>bundle</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.BundleTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Resource bundle base name. This is the bundle's
-fully-qualified resource name, which has the same
-form as a fully-qualified class name, that is, it uses
-"." as the package component separator and does not
-have any file type (such as ".class" or ".properties")
-suffix.
-        </description>
-        <name>basename</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Prefix to be prepended to the value of the message
-key of any nested &lt;fmt:message&gt; action.
-        </description>
-        <name>prefix</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Loads a resource bundle and stores it in the named scoped variable or
-        the bundle configuration variable
-    </description>
-    <name>setBundle</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.SetBundleTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Resource bundle base name. This is the bundle's
-fully-qualified resource name, which has the same
-form as a fully-qualified class name, that is, it uses
-"." as the package component separator and does not
-have any file type (such as ".class" or ".properties")
-suffix.
-        </description>
-        <name>basename</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable which stores
-the i18n localization context of type
-javax.servlet.jsp.jstl.fmt.LocalizationC
-ontext.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var or the localization context
-configuration variable.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Maps key to localized message and performs parametric replacement
-    </description>
-    <name>message</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.MessageTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Message key to be looked up.
-        </description>
-        <name>key</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Localization context in whose resource
-bundle the message key is looked up.
-        </description>
-        <name>bundle</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable
-which stores the localized message.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Supplies an argument for parametric replacement to a containing
-        &lt;message&gt; tag
-    </description>
-    <name>param</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParamTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Argument used for parametric replacement.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Formats a numeric value as a number, currency, or percentage
-    </description>
-    <name>formatNumber</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.FormatNumberTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Numeric value to be formatted.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Specifies whether the value is to be
-formatted as number, currency, or
-percentage.
-        </description>
-        <name>type</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Custom formatting pattern.
-        </description>
-        <name>pattern</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-ISO 4217 currency code. Applied only
-when formatting currencies (i.e. if type is
-equal to "currency"); ignored otherwise.
-        </description>
-        <name>currencyCode</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Currency symbol. Applied only when
-formatting currencies (i.e. if type is equal
-to "currency"); ignored otherwise.
-        </description>
-        <name>currencySymbol</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Specifies whether the formatted output
-will contain any grouping separators.
-        </description>
-        <name>groupingUsed</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Maximum number of digits in the integer
-portion of the formatted output.
-        </description>
-        <name>maxIntegerDigits</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Minimum number of digits in the integer
-portion of the formatted output.
-        </description>
-        <name>minIntegerDigits</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Maximum number of digits in the
-fractional portion of the formatted output.
-        </description>
-        <name>maxFractionDigits</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Minimum number of digits in the
-fractional portion of the formatted output.
-        </description>
-        <name>minFractionDigits</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable
-which stores the formatted result as a
-String.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Parses the string representation of a number, currency, or percentage
-    </description>
-    <name>parseNumber</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseNumberTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-String to be parsed.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Specifies whether the string in the value
-attribute should be parsed as a number,
-currency, or percentage.
-        </description>
-        <name>type</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Custom formatting pattern that determines
-how the string in the value attribute is to be
-parsed.
-        </description>
-        <name>pattern</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Locale whose default formatting pattern (for
-numbers, currencies, or percentages,
-respectively) is to be used during the parse
-operation, or to which the pattern specified
-via the pattern attribute (if present) is
-applied.
-        </description>
-        <name>parseLocale</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Specifies whether just the integer portion of
-the given value should be parsed.
-        </description>
-        <name>integerOnly</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable which
-stores the parsed result (of type
-java.lang.Number).
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Formats a date and/or time using the supplied styles and pattern
-    </description>
-    <name>formatDate</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.FormatDateTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Date and/or time to be formatted.
-        </description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Specifies whether the time, the date, or both
-the time and date components of the given
-date are to be formatted. 
-        </description>
-        <name>type</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Predefined formatting style for dates. Follows
-the semantics defined in class
-java.text.DateFormat. Applied only
-when formatting a date or both a date and
-time (i.e. if type is missing or is equal to
-"date" or "both"); ignored otherwise.
-        </description>
-        <name>dateStyle</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Predefined formatting style for times. Follows
-the semantics defined in class
-java.text.DateFormat. Applied only
-when formatting a time or both a date and
-time (i.e. if type is equal to "time" or "both");
-ignored otherwise.
-        </description>
-        <name>timeStyle</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Custom formatting style for dates and times.
-        </description>
-        <name>pattern</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Time zone in which to represent the formatted
-time.
-        </description>
-        <name>timeZone</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable which
-stores the formatted result as a String.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Parses the string representation of a date and/or time
-    </description>
-    <name>parseDate</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseDateTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Date string to be parsed.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Specifies whether the date string in the
-value attribute is supposed to contain a
-time, a date, or both.
-        </description>
-        <name>type</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Predefined formatting style for days
-which determines how the date
-component of the date string is to be
-parsed. Applied only when formatting a
-date or both a date and time (i.e. if type
-is missing or is equal to "date" or "both");
-ignored otherwise.
-        </description>
-        <name>dateStyle</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Predefined formatting styles for times
-which determines how the time
-component in the date string is to be
-parsed. Applied only when formatting a
-time or both a date and time (i.e. if type
-is equal to "time" or "both"); ignored
-otherwise.
-        </description>
-        <name>timeStyle</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Custom formatting pattern which
-determines how the date string is to be
-parsed.
-        </description>
-        <name>pattern</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Time zone in which to interpret any time
-information in the date string.
-        </description>
-        <name>timeZone</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Locale whose predefined formatting styles
-for dates and times are to be used during
-the parse operation, or to which the
-pattern specified via the pattern
-attribute (if present) is applied.
-        </description>
-        <name>parseLocale</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable in
-which the parsing result (of type
-java.util.Date) is stored.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-</taglib>
diff --git a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/sql.tld b/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/sql.tld
deleted file mode 100644
index caddca4..0000000
--- a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/sql.tld
+++ /dev/null
@@ -1,306 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
- 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.
--->
-
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-    version="2.0">
-    
-  <description>JSTL 1.1 sql library</description>
-  <display-name>JSTL sql</display-name>
-  <tlib-version>1.1</tlib-version>
-  <short-name>sql</short-name>
-  <uri>http://java.sun.com/jsp/jstl/sql</uri>
-
-  <validator>
-    <description>
-        Provides core validation features for JSTL tags.
-    </description>
-    <validator-class>
-        org.apache.taglibs.standard.tlv.JstlSqlTLV
-    </validator-class>
-  </validator>
-
-  <tag>
-    <description>
-        Provides nested database action elements with a shared Connection,
-        set up to execute all statements as one transaction.
-    </description>
-    <name>transaction</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.sql.TransactionTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-DataSource associated with the database to access. A
-String value represents a relative path to a JNDI
-resource or the parameters for the JDBC
-DriverManager facility.
-        </description>
-        <name>dataSource</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Transaction isolation level. If not specified, it is the
-isolation level the DataSource has been configured
-with.
-        </description>
-        <name>isolation</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Executes the SQL query defined in its body or through the
-        sql attribute.
-    </description>
-    <name>query</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.sql.QueryTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-query result. The type of the scoped variable is
-javax.servlet.jsp.jstl.sql.
-Result (see Chapter 16 "Java APIs").
-        </description>
-        <name>var</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-SQL query statement.
-        </description>
-        <name>sql</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Data source associated with the database to
-query. A String value represents a relative path
-to a JNDI resource or the parameters for the
-DriverManager class.
-        </description>
-        <name>dataSource</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-The returned Result object includes the rows
-starting at the specified index. The first row of
-the original query result set is at index 0. If not
-specified, rows are included starting from the
-first row at index 0.
-        </description>
-        <name>startRow</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-The maximum number of rows to be included in
-the query result. If not specified, or set to -1, no
-limit on the maximum number of rows is
-enforced.
-        </description>
-        <name>maxRows</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Executes the SQL update defined in its body or through the
-        sql attribute.
-    </description>
-    <name>update</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.sql.UpdateTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the result
-of the database update. The type of the scoped
-variable is java.lang.Integer.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope of var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-SQL update statement.
-        </description>
-        <name>sql</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Data source associated with the database to update.
-A String value represents a relative path to a JNDI
-resource or the parameters for the JDBC
-DriverManager class.
-        </description>
-        <name>dataSource</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Sets a parameter in an SQL statement to the specified value.
-    </description>
-    <name>param</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.sql.ParamTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Parameter value.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Sets a parameter in an SQL statement to the specified java.util.Date value.
-    </description>
-    <name>dateParam</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.sql.DateParamTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Parameter value for DATE, TIME, or
-TIMESTAMP column in a database table.
-        </description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-One of "date", "time" or "timestamp".
-        </description>
-        <name>type</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Creates a simple DataSource suitable only for prototyping.
-    </description>
-    <name>setDataSource</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.sql.SetDataSourceTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable
-for the data source specified. Type can
-be String or DataSource.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-If var is specified, scope of the
-exported variable. Otherwise, scope of
-the data source configuration variable.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Data source. If specified as a string, it
-can either be a relative path to a JNDI
-resource, or a JDBC parameters string
-as defined in Section 10.1.1.
-        </description>
-        <name>dataSource</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-JDBC parameter: driver class name.
-        </description>
-        <name>driver</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-JDBC parameter: URL associated with
-the database.
-        </description>
-        <name>url</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-JDBC parameter: database user on
-whose behalf the connection to the
-database is being made.
-        </description>
-        <name>user</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-JDBC parameter: user password
-        </description>
-        <name>password</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-</taglib>
diff --git a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/x.tld b/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/x.tld
deleted file mode 100644
index 1b64026..0000000
--- a/framework/crawler-ui/src/main/webapp/WEB-INF/jsp/x.tld
+++ /dev/null
@@ -1,465 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
- 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.
--->
-
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-    version="2.0">
-    
-  <description>JSTL 1.1 XML library</description>
-  <display-name>JSTL XML</display-name>
-  <tlib-version>1.1</tlib-version>
-  <short-name>x</short-name>
-  <uri>http://java.sun.com/jsp/jstl/xml</uri>
-
-  <validator>
-    <description>
-        Provides validation features for JSTL XML tags.
-    </description>
-    <validator-class>
-	org.apache.taglibs.standard.tlv.JstlXmlTLV
-    </validator-class>
-  </validator>
-
-  <tag>
-    <description>
-        Simple conditional tag that establishes a context for
-        mutually exclusive conditional operations, marked by
-        &lt;when&gt; and &lt;otherwise&gt;
-    </description>
-    <name>choose</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
-    <body-content>JSP</body-content>
-  </tag>
-
-  <tag>
-    <description>
-	Like &lt;%= ... &gt;, but for XPath expressions.
-    </description>
-    <name>out</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.xml.ExprTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-XPath expression to be evaluated.
-        </description>
-        <name>select</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Determines whether characters &lt;,&gt;,&amp;,'," in the
-resulting string should be converted to their
-corresponding character entity codes. Default
-value is true.
-        </description>
-        <name>escapeXml</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        XML conditional tag, which evalutes its body if the
-        supplied XPath expression evalutes to 'true' as a boolean
-    </description>
-    <name>if</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.xml.IfTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The test condition that tells whether or not the
-body content should be processed.
-        </description>
-        <name>select</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resulting value of the test condition. The type
-of the scoped variable is Boolean.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	XML iteration tag.
-    </description>
-    <name>forEach</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.xml.ForEachTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-current item of the iteration. This scoped variable
-has nested visibility. Its type depends on the
-result of the XPath expression in the select
-attribute.
-        </description>
-	<name>var</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-XPath expression to be evaluated.
-        </description>
-	<name>select</name>
-	<required>true</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Iteration begins at the item located at the
-specified index. First item of the collection has
-index 0.
-        </description>
-	<name>begin</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration ends at the item located at the specified
-index (inclusive).
-        </description>
-	<name>end</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration will only process every step items of
-the collection, starting with the first one.
-        </description>
-	<name>step</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-status of the iteration. Object exported is of type
-javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested visibility.
-        </description>
-	<name>varStatus</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Subtag of &lt;choose&gt; that follows &lt;when&gt; tags
-	and runs only if all of the prior conditions evaluated to
-	'false'
-    </description>
-    <name>otherwise</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
-    <body-content>JSP</body-content>
-  </tag>
-
-  <tag>
-    <description>
-        Adds a parameter to a containing 'transform' tag's Transformer
-    </description>
-    <name>param</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.xml.ParamTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the transformation parameter.
-        </description>
-        <name>name</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Value of the parameter.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Parses XML content from 'source' attribute or 'body'
-    </description>
-    <name>parse</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.xml.ParseTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.XmlParseTEI</tei-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for
-the parsed XML document. The type of the
-scoped variable is implementation
-dependent.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for
-the parsed XML document. The type of the
-scoped variable is
-org.w3c.dom.Document.
-        </description>
-        <name>varDom</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for varDom.
-        </description>
-        <name>scopeDom</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Deprecated. Use attribute 'doc' instead.
-        </description>
-        <name>xml</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Source XML document to be parsed.
-        </description>
-        <name>doc</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-The system identifier (URI) for parsing the
-XML document.
-        </description>
-        <name>systemId</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Filter to be applied to the source
-document.
-        </description>
-        <name>filter</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Saves the result of an XPath expression evaluation in a 'scope'
-    </description>
-    <name>set</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.xml.SetTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable to hold
-the value specified in the action. The type of the
-scoped variable is whatever type the select
-expression evaluates to.
-        </description>
-        <name>var</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-XPath expression to be evaluated.
-        </description>
-	<name>select</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Conducts a transformation given a source XML document
-	and an XSLT stylesheet
-    </description>
-    <name>transform</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.xml.TransformTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.XmlTransformTEI</tei-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported
-scoped variable for the
-transformed XML
-document. The type of the
-scoped variable is
-org.w3c.dom.Document.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Result
-Object that captures or
-processes the transformation
-result.
-        </description>
-        <name>result</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Deprecated. Use attribute
-'doc' instead.
-        </description>
-        <name>xml</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Source XML document to be
-transformed. (If exported by
-&lt;x:set&gt;, it must correspond
-to a well-formed XML
-document, not a partial
-document.)
-        </description>
-        <name>doc</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Deprecated. Use attribute
-'docSystemId' instead.
-        </description>
-        <name>xmlSystemId</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-The system identifier (URI)
-for parsing the XML
-document.
-        </description>
-        <name>docSystemId</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-javax.xml.transform.Source
-Transformation stylesheet as
-a String, Reader, or
-Source object.
-        </description>
-	<name>xslt</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-The system identifier (URI)
-for parsing the XSLT
-stylesheet.
-        </description>
-	<name>xsltSystemId</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Subtag of &lt;choose&gt; that includes its body if its
-        expression evalutes to 'true'
-    </description>
-    <name>when</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.xml.WhenTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The test condition that tells whether or
-not the body content should be
-processed
-        </description>
-        <name>select</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-</taglib>
diff --git a/framework/crawler-ui/src/main/webapp/WEB-INF/web.xml b/framework/crawler-ui/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index dac5077..0000000
--- a/framework/crawler-ui/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!--
- 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.
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
-  <display-name>ManifoldCF Crawler Interface</display-name>
-
-  <description>ManifoldCF Crawler Interface</description>
-
-  <session-config>
-    <session-timeout>30</session-timeout>
-  </session-config>
-
-  <context-param>
-    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
-    <param-value>messages</param-value>
-  </context-param>
-
-  <listener>
-    <listener-class>org.apache.manifoldcf.crawlerui.ServletListener</listener-class>
-  </listener>
-
-</web-app>
diff --git a/framework/crawler-ui/src/main/webapp/WEB-INF/web.xml.external b/framework/crawler-ui/src/main/webapp/WEB-INF/web.xml.external
deleted file mode 100644
index ee4cb6d..0000000
--- a/framework/crawler-ui/src/main/webapp/WEB-INF/web.xml.external
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!DOCTYPE web-app
-	PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
-	"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-
-<!--
- 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.
--->
-
-<web-app>
-
-  <display-name>ManifoldCF Crawler Interface</display-name>
-
-  <description>ManifoldCF Crawler Interface</description>
-
-  <session-config>
-	<session-timeout>5</session-timeout>
-  </session-config>
-
-  <taglib>
-	<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
-	<taglib-location>/WEB-INF/jsp/c.tld</taglib-location>
-  </taglib>
-
-  <taglib>
-	<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
-	<taglib-location>/WEB-INF/jsp/fmt.tld</taglib-location>
-  </taglib>
-
-  <taglib>
-	<taglib-uri>http://java.sun.com/jstl/xml</taglib-uri>
-	<taglib-location>/WEB-INF/jsp/x.tld</taglib-location>
-  </taglib>
-
-  <taglib>
-	<taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
-	<taglib-location>/WEB-INF/jsp/sql.tld</taglib-location>
-  </taglib>
-
-  <security-constraint>
-    <web-resource-collection>
-      <web-resource-name>
-        ManifoldCF UI
-      </web-resource-name>
-      <url-pattern>*</url-pattern>
-    </web-resource-collection>
-    <auth-constraint>
-      <role-name>ingestuser</role-name>
-    </auth-constraint>
-  </security-constraint>
-
-  <!-- Define the Login Configuration for this Application -->
-  <login-config>
-    <auth-method>BASIC</auth-method>
-    <realm-name>ManifoldCF User Interface</realm-name>
-  </login-config>
-
-   <security-role>
-	<description>
-	    This role describes people who are allowed to use the
-	    ManifoldCF web UI.
-	</description>
-	<role-name>ingestuser</role-name>
-    </security-role>
-
-</web-app>
diff --git a/framework/crawler-ui/src/main/webapp/adminDefaults.jsp b/framework/crawler-ui/src/main/webapp/adminDefaults.jsp
deleted file mode 100644
index d367683..0000000
--- a/framework/crawler-ui/src/main/webapp/adminDefaults.jsp
+++ /dev/null
@@ -1,48 +0,0 @@
-<%@ page language="java" %>
-<%@ page import="org.apache.manifoldcf.core.interfaces.*" %>
-<%@ page import="org.apache.manifoldcf.ui.i18n.*" %>
-<%@ page import="org.apache.manifoldcf.agents.interfaces.*" %>
-<%@ page import="org.apache.manifoldcf.authorities.interfaces.*" %>
-<%@ page import="org.apache.manifoldcf.crawler.interfaces.*" %>
-<%@ page import="java.util.*" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<jsp:useBean id="thread" class="org.apache.manifoldcf.ui.beans.ThreadContext" scope="request"/>
-<jsp:useBean id="adminprofile" class="org.apache.manifoldcf.ui.beans.AdminProfile" scope="session"/>
-
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
-
-
-<%
-  IThreadContext threadContext = thread.getThreadContext();
-  org.apache.manifoldcf.ui.multipart.MultipartWrapper variableContext = (org.apache.manifoldcf.ui.multipart.MultipartWrapper)threadContext.get("__WRAPPER__");
-  if (variableContext == null)
-  {
-    variableContext = new org.apache.manifoldcf.ui.multipart.MultipartWrapper(request,adminprofile);
-    threadContext.save("__WRAPPER__",variableContext);
-  }
-%>
diff --git a/framework/crawler-ui/src/main/webapp/adminHeaders.jsp b/framework/crawler-ui/src/main/webapp/adminHeaders.jsp
deleted file mode 100644
index 96c414c..0000000
--- a/framework/crawler-ui/src/main/webapp/adminHeaders.jsp
+++ /dev/null
@@ -1,79 +0,0 @@
-<%
-response.setHeader("Pragma","No-cache");
-response.setDateHeader("Expires",0);
-response.setHeader("Cache-Control", "no-cache");
-response.setDateHeader("max-age", 0);
-response.setContentType("text/html;charset=utf-8");
-%>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%@ page language="java" %>
-<%@ page import="org.apache.manifoldcf.core.interfaces.*" %>
-<%@ page import="org.apache.manifoldcf.core.util.*" %>
-<%@ page import="org.apache.manifoldcf.ui.i18n.*" %>
-<%@ page import="org.apache.manifoldcf.agents.interfaces.*" %>
-<%@ page import="org.apache.manifoldcf.crawler.interfaces.*" %>
-<%@ page import="org.apache.manifoldcf.authorities.interfaces.*" %>
-<%@ page import="java.util.*" %>
-
-<jsp:useBean id="thread" class="org.apache.manifoldcf.ui.beans.ThreadContext" scope="request"/>
-<jsp:useBean id="adminprofile" class="org.apache.manifoldcf.ui.beans.AdminProfile" scope="session"/>
-
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
-
-
-<%
-  String queryString = request.getQueryString();
-  String requestURL = request.getRequestURI();
-  requestURL = requestURL.substring(requestURL.lastIndexOf("/") + 1);
-  requestURL += queryString == null ? "" : "?" + queryString;
-  if (adminprofile.getLoggedOn() == false)
-  {
-    if (queryString == null)
-    {
-      response.sendRedirect("login.jsp");
-    } else
-    {
-      if (!requestURL.startsWith("index.jsp"))
-      {
-        requestURL = "index.jsp?p=" + requestURL;
-      }
-      response.sendRedirect("login.jsp?nextUrl=" + URLEncoder.encode(requestURL));
-    }
-    return;
-  }
-
-  response.setHeader("page", requestURL);
-
-  IThreadContext threadContext = thread.getThreadContext();
-  org.apache.manifoldcf.ui.multipart.MultipartWrapper variableContext = (org.apache.manifoldcf.ui.multipart.MultipartWrapper)threadContext.get("__WRAPPER__");
-  if (variableContext == null)
-  {
-    variableContext = new org.apache.manifoldcf.ui.multipart.MultipartWrapper(request,adminprofile);
-    threadContext.save("__WRAPPER__",variableContext);
-  }
-%>
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.css b/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.css
deleted file mode 100644
index 97fa6dc..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.css
+++ /dev/null
@@ -1,317 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-

-select.bs-select-hidden,
-select.selectpicker {
-  display: none !important;
-}
-.bootstrap-select {
-  width: 220px \0;
-  /*IE9 and below*/
-}
-.bootstrap-select > .dropdown-toggle {
-  width: 100%;
-  padding-right: 25px;
-  z-index: 1;
-}
-.bootstrap-select > .dropdown-toggle.bs-placeholder,
-.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,
-.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,
-.bootstrap-select > .dropdown-toggle.bs-placeholder:active {
-  color: #999;
-}
-.bootstrap-select > select {
-  position: absolute !important;
-  bottom: 0;
-  left: 50%;
-  display: block !important;
-  width: 0.5px !important;
-  height: 100% !important;
-  padding: 0 !important;
-  opacity: 0 !important;
-  border: none;
-}
-.bootstrap-select > select.mobile-device {
-  top: 0;
-  left: 0;
-  display: block !important;
-  width: 100% !important;
-  z-index: 2;
-}
-.has-error .bootstrap-select .dropdown-toggle,
-.error .bootstrap-select .dropdown-toggle {
-  border-color: #b94a48;
-}
-.bootstrap-select.fit-width {
-  width: auto !important;
-}
-.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
-  width: 220px;
-}
-.bootstrap-select .dropdown-toggle:focus {
-  outline: thin dotted #333333 !important;
-  outline: 5px auto -webkit-focus-ring-color !important;
-  outline-offset: -2px;
-}
-.bootstrap-select.form-control {
-  margin-bottom: 0;
-  padding: 0;
-  border: none;
-}
-.bootstrap-select.form-control:not([class*="col-"]) {
-  width: 100%;
-}
-.bootstrap-select.form-control.input-group-btn {
-  z-index: auto;
-}
-.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.bootstrap-select.btn-group:not(.input-group-btn),
-.bootstrap-select.btn-group[class*="col-"] {
-  float: none;
-  display: inline-block;
-  margin-left: 0;
-}
-.bootstrap-select.btn-group.dropdown-menu-right,
-.bootstrap-select.btn-group[class*="col-"].dropdown-menu-right,
-.row .bootstrap-select.btn-group[class*="col-"].dropdown-menu-right {
-  float: right;
-}
-.form-inline .bootstrap-select.btn-group,
-.form-horizontal .bootstrap-select.btn-group,
-.form-group .bootstrap-select.btn-group {
-  margin-bottom: 0;
-}
-.form-group-lg .bootstrap-select.btn-group.form-control,
-.form-group-sm .bootstrap-select.btn-group.form-control {
-  padding: 0;
-}
-.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,
-.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle {
-  height: 100%;
-  font-size: inherit;
-  line-height: inherit;
-  border-radius: inherit;
-}
-.form-inline .bootstrap-select.btn-group .form-control {
-  width: 100%;
-}
-.bootstrap-select.btn-group.disabled,
-.bootstrap-select.btn-group > .disabled {
-  cursor: not-allowed;
-}
-.bootstrap-select.btn-group.disabled:focus,
-.bootstrap-select.btn-group > .disabled:focus {
-  outline: none !important;
-}
-.bootstrap-select.btn-group.bs-container {
-  position: absolute;
-  height: 0 !important;
-  padding: 0 !important;
-}
-.bootstrap-select.btn-group.bs-container .dropdown-menu {
-  z-index: 1060;
-}
-.bootstrap-select.btn-group .dropdown-toggle .filter-option {
-  display: inline-block;
-  overflow: hidden;
-  width: 100%;
-  text-align: left;
-}
-.bootstrap-select.btn-group .dropdown-toggle .caret {
-  position: absolute;
-  top: 50%;
-  right: 12px;
-  margin-top: -2px;
-  vertical-align: middle;
-}
-.bootstrap-select.btn-group[class*="col-"] .dropdown-toggle {
-  width: 100%;
-}
-.bootstrap-select.btn-group .dropdown-menu {
-  min-width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.bootstrap-select.btn-group .dropdown-menu.inner {
-  position: static;
-  float: none;
-  border: 0;
-  padding: 0;
-  margin: 0;
-  border-radius: 0;
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-.bootstrap-select.btn-group .dropdown-menu li {
-  position: relative;
-}
-.bootstrap-select.btn-group .dropdown-menu li.active small {
-  color: #fff;
-}
-.bootstrap-select.btn-group .dropdown-menu li.disabled a {
-  cursor: not-allowed;
-}
-.bootstrap-select.btn-group .dropdown-menu li a {
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
-.bootstrap-select.btn-group .dropdown-menu li a.opt {
-  position: relative;
-  padding-left: 2.25em;
-}
-.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {
-  display: none;
-}
-.bootstrap-select.btn-group .dropdown-menu li a span.text {
-  display: inline-block;
-}
-.bootstrap-select.btn-group .dropdown-menu li small {
-  padding-left: 0.5em;
-}
-.bootstrap-select.btn-group .dropdown-menu .notify {
-  position: absolute;
-  bottom: 5px;
-  width: 96%;
-  margin: 0 2%;
-  min-height: 26px;
-  padding: 3px 5px;
-  background: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  pointer-events: none;
-  opacity: 0.9;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.bootstrap-select.btn-group .no-results {
-  padding: 3px;
-  background: #f5f5f5;
-  margin: 0 5px;
-  white-space: nowrap;
-}
-.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option {
-  position: static;
-}
-.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret {
-  position: static;
-  top: auto;
-  margin-top: -1px;
-}
-.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
-  position: absolute;
-  display: inline-block;
-  right: 15px;
-  margin-top: 5px;
-}
-.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {
-  margin-right: 34px;
-}
-.bootstrap-select.show-menu-arrow.open > .dropdown-toggle {
-  z-index: 1061;
-}
-.bootstrap-select.show-menu-arrow .dropdown-toggle:before {
-  content: '';
-  border-left: 7px solid transparent;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid rgba(204, 204, 204, 0.2);
-  position: absolute;
-  bottom: -4px;
-  left: 9px;
-  display: none;
-}
-.bootstrap-select.show-menu-arrow .dropdown-toggle:after {
-  content: '';
-  border-left: 6px solid transparent;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid white;
-  position: absolute;
-  bottom: -4px;
-  left: 10px;
-  display: none;
-}
-.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {
-  bottom: auto;
-  top: -3px;
-  border-top: 7px solid rgba(204, 204, 204, 0.2);
-  border-bottom: 0;
-}
-.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {
-  bottom: auto;
-  top: -3px;
-  border-top: 6px solid white;
-  border-bottom: 0;
-}
-.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {
-  right: 12px;
-  left: auto;
-}
-.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {
-  right: 13px;
-  left: auto;
-}
-.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,
-.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {
-  display: block;
-}
-.bs-searchbox,
-.bs-actionsbox,
-.bs-donebutton {
-  padding: 4px 8px;
-}
-.bs-actionsbox {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.bs-actionsbox .btn-group button {
-  width: 50%;
-}
-.bs-donebutton {
-  float: left;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.bs-donebutton .btn-group button {
-  width: 100%;
-}
-.bs-searchbox + .bs-actionsbox {
-  padding: 0 8px 4px;
-}
-.bs-searchbox .form-control {
-  margin-bottom: 0;
-  width: 100%;
-  float: none;
-}
-/*# sourceMappingURL=bootstrap-select.css.map */
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.css.map b/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.css.map
deleted file mode 100644
index 53dd5db..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["less/bootstrap-select.less","bootstrap-select.css"],"names":[],"mappings":"AAQA;;EAEE,yBAAA;CCPD;ADUD;EACE,gBAAA;ECRA,iBAAiB;CAClB;ADMD;EAKI,YAAA;EACA,oBAAA;EACA,WAAA;CCRH;ADUG;;;;EAG0B,YAAA;CCP7B;ADLD;EAgBI,8BAAA;EACA,UAAA;EACA,UAAA;EACA,0BAAA;EACA,wBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,aAAA;CCRH;ADUG;EACE,OAAA;EACA,QAAA;EACA,0BAAA;EACA,uBAAA;EACA,WAAA;CCRL;ADaC;;EAEE,sBAAA;CCXH;ADcC;EACE,uBAAA;CCZH;ADeC;EACE,aAAA;CCbH;ADjCD;EAkDI,wCAAA;EACA,sDAAA;EACA,qBAAA;CCdH;ADkBD;EACE,iBAAA;EACA,WAAA;EACA,aAAA;CChBD;ADkBC;EACE,YAAA;CChBH;ADmBC;EACE,cAAA;CCjBH;ADmBG;EAEI,iBAAA;CClBP;AD0BC;;EAEE,YAAA;EACA,sBAAA;EACA,eAAA;CCxBH;AD+BG;;;EACE,aAAA;CC3BL;AD+BC;;;EAGE,iBAAA;CC7BH;ADgCC;;EAEE,WAAA;CC9BH;AD4BC;;EAKI,aAAA;EACA,mBAAA;EACA,qBAAA;EACA,uBAAA;CC7BL;ADmCC;EACE,YAAA;CCjCH;ADoCC;;EA/HA,oBAAA;CC+FD;ADoCG;;EACE,yBAAA;CCjCL;ADqCC;EACE,mBAAA;EACA,qBAAA;EACA,sBAAA;CCnCH;ADgCC;EAMI,cAAA;CCnCL;ADrBD;EA+DM,sBAAA;EACA,iBAAA;EACA,YAAA;EACA,iBAAA;CCvCL;AD3BD;EAsEM,mBAAA;EACA,SAAA;EACA,YAAA;EACA,iBAAA;EACA,uBAAA;CCxCL;AD4CC;EACE,YAAA;CC1CH;ADrCD;EAoFI,gBAAA;EACA,+BAAA;KAAA,4BAAA;UAAA,uBAAA;CC5CH;AD8CG;EACE,iBAAA;EACA,YAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,iBAAA;EACA,yBAAA;UAAA,iBAAA;CC5CL;ADlDD;EAkGM,mBAAA;CC7CL;AD+CK;EACE,YAAA;CC7CP;ADgDK;EA9LJ,oBAAA;CCiJD;AD3DD;EA6GQ,gBAAA;EACA,0BAAA;KAAA,uBAAA;MAAA,sBAAA;UAAA,kBAAA;CC/CP;ADiDO;EACE,mBAAA;EACA,qBAAA;CC/CT;ADnED;EAsHU,cAAA;CChDT;ADtED;EA0HU,sBAAA;CCjDT;ADzED;EA+HQ,oBAAA;CCnDP;AD5ED;EAoIM,mBAAA;EACA,YAAA;EACA,WAAA;EACA,aAAA;EACA,iBAAA;EACA,iBAAA;EACA,oBAAA;EACA,0BAAA;EACA,wDAAA;UAAA,gDAAA;EACA,qBAAA;EACA,aAAA;EACA,+BAAA;KAAA,4BAAA;UAAA,uBAAA;CCrDL;AD1FD;EAoJI,aAAA;EACA,oBAAA;EACA,cAAA;EACA,oBAAA;CCvDH;AD0DC;EAEI,iBAAA;CCzDL;ADuDC;EAMI,iBAAA;EACA,UAAA;EACA,iBAAA;CC1DL;AD+DG;EACE,mBAAA;EACA,sBAAA;EACA,YAAA;EACA,gBAAA;CC7DL;ADwDC;EASI,mBAAA;CC9DL;ADoEC;EACE,cAAA;CClEH;ADsEG;EACE,YAAA;EACA,mCAAA;EACA,oCAAA;EACA,kDAAA;EACA,mBAAA;EACA,aAAA;EACA,UAAA;EACA,cAAA;CCpEL;ADuEG;EACE,YAAA;EACA,mCAAA;EACA,oCAAA;EACA,+BAAA;EACA,mBAAA;EACA,aAAA;EACA,WAAA;EACA,cAAA;CCrEL;AD0EG;EACE,aAAA;EACA,UAAA;EACA,+CAAA;EACA,iBAAA;CCxEL;AD2EG;EACE,aAAA;EACA,UAAA;EACA,4BAAA;EACA,iBAAA;CCzEL;AD8EG;EACE,YAAA;EACA,WAAA;CC5EL;AD+EG;EACE,YAAA;EACA,WAAA;CC7EL;ADkFG;;EAEE,eAAA;CChFL;ADqFD;;;EAGE,iBAAA;CCnFD;ADsFD;EACE,YAAA;EACA,+BAAA;KAAA,4BAAA;UAAA,uBAAA;CCpFD;ADsFC;EACE,WAAA;CCpFH;ADwFD;EACE,YAAA;EACA,YAAA;EACA,+BAAA;KAAA,4BAAA;UAAA,uBAAA;CCtFD;ADwFC;EACE,YAAA;CCtFH;AD2FC;EACE,mBAAA;CCzFH;AD4FC;EACE,iBAAA;EACA,YAAA;EACA,YAAA;CC1FH","file":"bootstrap-select.css","sourcesContent":["@import \"variables\";\n\n// Mixins\n.cursor-disabled() {\n  cursor: not-allowed;\n}\n\n// Rules\nselect.bs-select-hidden,\nselect.selectpicker {\n  display: none !important;\n}\n\n.bootstrap-select {\n  width: 220px \\0; /*IE9 and below*/\n\n  // The selectpicker button\n  > .dropdown-toggle {\n    width: 100%;\n    padding-right: 25px;\n    z-index: 1;\n\n    &.bs-placeholder,\n    &.bs-placeholder:hover,\n    &.bs-placeholder:focus,\n    &.bs-placeholder:active { color: @input-color-placeholder; }\n  }\n\n  > select {\n    position: absolute !important;\n    bottom: 0;\n    left: 50%;\n    display: block !important;\n    width: 0.5px !important;\n    height: 100% !important;\n    padding: 0 !important;\n    opacity: 0 !important;\n    border: none;\n\n    &.mobile-device {\n      top: 0;\n      left: 0;\n      display: block !important;\n      width: 100% !important;\n      z-index: 2;\n    }\n  }\n\n  // Error display\n  .has-error & .dropdown-toggle,\n  .error & .dropdown-toggle {\n    border-color: @color-red-error;\n  }\n\n  &.fit-width {\n    width: auto !important;\n  }\n\n  &:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n    width: @width-default;\n  }\n\n  .dropdown-toggle:focus {\n    outline: thin dotted #333333 !important;\n    outline: 5px auto -webkit-focus-ring-color !important;\n    outline-offset: -2px;\n  }\n}\n\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n\n  &:not([class*=\"col-\"]) {\n    width: 100%;\n  }\n\n  &.input-group-btn {\n    z-index: auto;\n\n    &:not(:first-child):not(:last-child) {\n      > .btn {\n        border-radius: 0;\n      }\n    }\n  }\n}\n\n// The selectpicker components\n.bootstrap-select.btn-group {\n  &:not(.input-group-btn),\n  &[class*=\"col-\"] {\n    float: none;\n    display: inline-block;\n    margin-left: 0;\n  }\n\n  // Forces the pull to the right, if necessary\n  &,\n  &[class*=\"col-\"],\n  .row &[class*=\"col-\"] {\n    &.dropdown-menu-right {\n      float: right;\n    }\n  }\n\n  .form-inline &,\n  .form-horizontal &,\n  .form-group & {\n    margin-bottom: 0;\n  }\n\n  .form-group-lg &.form-control,\n  .form-group-sm &.form-control {\n    padding: 0;\n\n    .dropdown-toggle {\n      height: 100%;\n      font-size: inherit;\n      line-height: inherit;\n      border-radius: inherit;\n    }\n  }\n\n  // Set the width of the live search (and any other form control within an inline form)\n  // see https://github.com/silviomoreto/bootstrap-select/issues/685\n  .form-inline & .form-control {\n    width: 100%;\n  }\n\n  &.disabled,\n  > .disabled {\n    .cursor-disabled();\n\n    &:focus {\n      outline: none !important;\n    }\n  }\n\n  &.bs-container {\n    position: absolute;\n    height: 0 !important;\n    padding: 0 !important;\n    \n    .dropdown-menu {\n      z-index: @zindex-select-dropdown;\n    }\n  }\n\n  // The selectpicker button\n  .dropdown-toggle {\n    .filter-option {\n      display: inline-block;\n      overflow: hidden;\n      width: 100%;\n      text-align: left;\n    }\n\n    .caret {\n      position: absolute;\n      top: 50%;\n      right: 12px;\n      margin-top: -2px;\n      vertical-align: middle;\n    }\n  }\n\n  &[class*=\"col-\"] .dropdown-toggle {\n    width: 100%;\n  }\n\n  // The selectpicker dropdown\n  .dropdown-menu {\n    min-width: 100%;\n    box-sizing: border-box;\n\n    &.inner {\n      position: static;\n      float: none;\n      border: 0;\n      padding: 0;\n      margin: 0;\n      border-radius: 0;\n      box-shadow: none;\n    }\n\n    li {\n      position: relative;\n\n      &.active small {\n        color: #fff;\n      }\n\n      &.disabled a {\n        .cursor-disabled();\n      }\n\n      a {\n        cursor: pointer;\n        user-select: none;\n\n        &.opt {\n          position: relative;\n          padding-left: 2.25em;\n        }\n\n        span.check-mark {\n          display: none;\n        }\n\n        span.text {\n          display: inline-block;\n        }\n      }\n\n      small {\n        padding-left: 0.5em;\n      }\n    }\n\n    .notify {\n      position: absolute;\n      bottom: 5px;\n      width: 96%;\n      margin: 0 2%;\n      min-height: 26px;\n      padding: 3px 5px;\n      background: rgb(245, 245, 245);\n      border: 1px solid rgb(227, 227, 227);\n      box-shadow: inset 0 1px 1px fade(rgb(0, 0, 0), 5%);\n      pointer-events: none;\n      opacity: 0.9;\n      box-sizing: border-box;\n    }\n  }\n\n  .no-results {\n    padding: 3px;\n    background: #f5f5f5;\n    margin: 0 5px;\n    white-space: nowrap;\n  }\n\n  &.fit-width .dropdown-toggle {\n    .filter-option {\n      position: static;\n    }\n\n    .caret {\n      position: static;\n      top: auto;\n      margin-top: -1px;\n    }\n  }\n\n  &.show-tick .dropdown-menu li {\n    &.selected a span.check-mark {\n      position: absolute;\n      display: inline-block;\n      right: 15px;\n      margin-top: 5px;\n    }\n\n    a span.text {\n      margin-right: 34px;\n    }\n  }\n}\n\n.bootstrap-select.show-menu-arrow {\n  &.open > .dropdown-toggle {\n    z-index: (@zindex-select-dropdown + 1);\n  }\n\n  .dropdown-toggle {\n    &:before {\n      content: '';\n      border-left: 7px solid transparent;\n      border-right: 7px solid transparent;\n      border-bottom: 7px solid @color-grey-arrow;\n      position: absolute;\n      bottom: -4px;\n      left: 9px;\n      display: none;\n    }\n\n    &:after {\n      content: '';\n      border-left: 6px solid transparent;\n      border-right: 6px solid transparent;\n      border-bottom: 6px solid white;\n      position: absolute;\n      bottom: -4px;\n      left: 10px;\n      display: none;\n    }\n  }\n\n  &.dropup .dropdown-toggle {\n    &:before {\n      bottom: auto;\n      top: -3px;\n      border-top: 7px solid @color-grey-arrow;\n      border-bottom: 0;\n    }\n\n    &:after {\n      bottom: auto;\n      top: -3px;\n      border-top: 6px solid white;\n      border-bottom: 0;\n    }\n  }\n\n  &.pull-right .dropdown-toggle {\n    &:before {\n      right: 12px;\n      left: auto;\n    }\n\n    &:after {\n      right: 13px;\n      left: auto;\n    }\n  }\n\n  &.open > .dropdown-toggle {\n    &:before,\n    &:after {\n      display: block;\n    }\n  }\n}\n\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n\n.bs-actionsbox {\n  width: 100%;\n  box-sizing: border-box;\n\n  & .btn-group button {\n    width: 50%;\n  }\n}\n\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n\n  & .btn-group button {\n    width: 100%;\n  }\n}\n\n.bs-searchbox {\n  & + .bs-actionsbox {\n    padding: 0 8px 4px;\n  }\n\n  & .form-control {\n    margin-bottom: 0;\n    width: 100%;\n    float: none;\n  }\n}\n","select.bs-select-hidden,\nselect.selectpicker {\n  display: none !important;\n}\n.bootstrap-select {\n  width: 220px \\0;\n  /*IE9 and below*/\n}\n.bootstrap-select > .dropdown-toggle {\n  width: 100%;\n  padding-right: 25px;\n  z-index: 1;\n}\n.bootstrap-select > .dropdown-toggle.bs-placeholder,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:active {\n  color: #999;\n}\n.bootstrap-select > select {\n  position: absolute !important;\n  bottom: 0;\n  left: 50%;\n  display: block !important;\n  width: 0.5px !important;\n  height: 100% !important;\n  padding: 0 !important;\n  opacity: 0 !important;\n  border: none;\n}\n.bootstrap-select > select.mobile-device {\n  top: 0;\n  left: 0;\n  display: block !important;\n  width: 100% !important;\n  z-index: 2;\n}\n.has-error .bootstrap-select .dropdown-toggle,\n.error .bootstrap-select .dropdown-toggle {\n  border-color: #b94a48;\n}\n.bootstrap-select.fit-width {\n  width: auto !important;\n}\n.bootstrap-select:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n  width: 220px;\n}\n.bootstrap-select .dropdown-toggle:focus {\n  outline: thin dotted #333333 !important;\n  outline: 5px auto -webkit-focus-ring-color !important;\n  outline-offset: -2px;\n}\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n}\n.bootstrap-select.form-control:not([class*=\"col-\"]) {\n  width: 100%;\n}\n.bootstrap-select.form-control.input-group-btn {\n  z-index: auto;\n}\n.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.bootstrap-select.btn-group:not(.input-group-btn),\n.bootstrap-select.btn-group[class*=\"col-\"] {\n  float: none;\n  display: inline-block;\n  margin-left: 0;\n}\n.bootstrap-select.btn-group.dropdown-menu-right,\n.bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right,\n.row .bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right {\n  float: right;\n}\n.form-inline .bootstrap-select.btn-group,\n.form-horizontal .bootstrap-select.btn-group,\n.form-group .bootstrap-select.btn-group {\n  margin-bottom: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control,\n.form-group-sm .bootstrap-select.btn-group.form-control {\n  padding: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,\n.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle {\n  height: 100%;\n  font-size: inherit;\n  line-height: inherit;\n  border-radius: inherit;\n}\n.form-inline .bootstrap-select.btn-group .form-control {\n  width: 100%;\n}\n.bootstrap-select.btn-group.disabled,\n.bootstrap-select.btn-group > .disabled {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group.disabled:focus,\n.bootstrap-select.btn-group > .disabled:focus {\n  outline: none !important;\n}\n.bootstrap-select.btn-group.bs-container {\n  position: absolute;\n  height: 0 !important;\n  padding: 0 !important;\n}\n.bootstrap-select.btn-group.bs-container .dropdown-menu {\n  z-index: 1060;\n}\n.bootstrap-select.btn-group .dropdown-toggle .filter-option {\n  display: inline-block;\n  overflow: hidden;\n  width: 100%;\n  text-align: left;\n}\n.bootstrap-select.btn-group .dropdown-toggle .caret {\n  position: absolute;\n  top: 50%;\n  right: 12px;\n  margin-top: -2px;\n  vertical-align: middle;\n}\n.bootstrap-select.btn-group[class*=\"col-\"] .dropdown-toggle {\n  width: 100%;\n}\n.bootstrap-select.btn-group .dropdown-menu {\n  min-width: 100%;\n  box-sizing: border-box;\n}\n.bootstrap-select.btn-group .dropdown-menu.inner {\n  position: static;\n  float: none;\n  border: 0;\n  padding: 0;\n  margin: 0;\n  border-radius: 0;\n  box-shadow: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li {\n  position: relative;\n}\n.bootstrap-select.btn-group .dropdown-menu li.active small {\n  color: #fff;\n}\n.bootstrap-select.btn-group .dropdown-menu li.disabled a {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group .dropdown-menu li a {\n  cursor: pointer;\n  user-select: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a.opt {\n  position: relative;\n  padding-left: 2.25em;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {\n  display: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.text {\n  display: inline-block;\n}\n.bootstrap-select.btn-group .dropdown-menu li small {\n  padding-left: 0.5em;\n}\n.bootstrap-select.btn-group .dropdown-menu .notify {\n  position: absolute;\n  bottom: 5px;\n  width: 96%;\n  margin: 0 2%;\n  min-height: 26px;\n  padding: 3px 5px;\n  background: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  pointer-events: none;\n  opacity: 0.9;\n  box-sizing: border-box;\n}\n.bootstrap-select.btn-group .no-results {\n  padding: 3px;\n  background: #f5f5f5;\n  margin: 0 5px;\n  white-space: nowrap;\n}\n.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option {\n  position: static;\n}\n.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret {\n  position: static;\n  top: auto;\n  margin-top: -1px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {\n  position: absolute;\n  display: inline-block;\n  right: 15px;\n  margin-top: 5px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {\n  margin-right: 34px;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle {\n  z-index: 1061;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:before {\n  content: '';\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid rgba(204, 204, 204, 0.2);\n  position: absolute;\n  bottom: -4px;\n  left: 9px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:after {\n  content: '';\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid white;\n  position: absolute;\n  bottom: -4px;\n  left: 10px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {\n  bottom: auto;\n  top: -3px;\n  border-top: 7px solid rgba(204, 204, 204, 0.2);\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {\n  bottom: auto;\n  top: -3px;\n  border-top: 6px solid white;\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {\n  right: 12px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {\n  right: 13px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {\n  display: block;\n}\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n.bs-actionsbox {\n  width: 100%;\n  box-sizing: border-box;\n}\n.bs-actionsbox .btn-group button {\n  width: 50%;\n}\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n}\n.bs-donebutton .btn-group button {\n  width: 100%;\n}\n.bs-searchbox + .bs-actionsbox {\n  padding: 0 8px 4px;\n}\n.bs-searchbox .form-control {\n  margin-bottom: 0;\n  width: 100%;\n  float: none;\n}\n/*# sourceMappingURL=bootstrap-select.css.map */"]}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.min.css b/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.min.css
deleted file mode 100644
index e5a928d..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/css/bootstrap-select.min.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!

- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)

- *

- * Copyright (c) 2013-2015 bootstrap-select

- * 

- * 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, sublicense, and/or sell

- * copies of the Software, and to permit persons to whom the Software is

- * furnished to do so, subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * 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. IN NO EVENT SHALL THE

- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

- * SOFTWARE.

- */

-select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px\9}.bootstrap-select>.dropdown-toggle{width:100%;padding-right:25px;z-index:1}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2}.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle{border-color:#b94a48}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none}.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{z-index:auto}.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child)>.btn{border-radius:0}.bootstrap-select.btn-group:not(.input-group-btn),.bootstrap-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.btn-group.dropdown-menu-right,.bootstrap-select.btn-group[class*=col-].dropdown-menu-right,.row .bootstrap-select.btn-group[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select.btn-group,.form-horizontal .bootstrap-select.btn-group,.form-inline .bootstrap-select.btn-group{margin-bottom:0}.form-group-lg .bootstrap-select.btn-group.form-control,.form-group-sm .bootstrap-select.btn-group.form-control{padding:0}.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.form-inline .bootstrap-select.btn-group .form-control{width:100%}.bootstrap-select.btn-group.disabled,.bootstrap-select.btn-group>.disabled{cursor:not-allowed}.bootstrap-select.btn-group.disabled:focus,.bootstrap-select.btn-group>.disabled:focus{outline:0!important}.bootstrap-select.btn-group.bs-container{position:absolute;height:0!important;padding:0!important}.bootstrap-select.btn-group.bs-container .dropdown-menu{z-index:1060}.bootstrap-select.btn-group .dropdown-toggle .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.bootstrap-select.btn-group .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select.btn-group[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select.btn-group .dropdown-menu li{position:relative}.bootstrap-select.btn-group .dropdown-menu li.active small{color:#fff}.bootstrap-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select.btn-group .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select.btn-group .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select.btn-group .dropdown-menu li a span.check-mark{display:none}.bootstrap-select.btn-group .dropdown-menu li a span.text{display:inline-block}.bootstrap-select.btn-group .dropdown-menu li small{padding-left:.5em}.bootstrap-select.btn-group .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option{position:static}.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.js
deleted file mode 100644
index a50a687..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.js
+++ /dev/null
@@ -1,1912 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  'use strict';
-
-  //<editor-fold desc="Shims">
-  if (!String.prototype.includes) {
-    (function () {
-      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
-      var toString = {}.toString;
-      var defineProperty = (function () {
-        // IE 8 only supports `Object.defineProperty` on DOM elements
-        try {
-          var object = {};
-          var $defineProperty = Object.defineProperty;
-          var result = $defineProperty(object, object, object) && $defineProperty;
-        } catch (error) {
-        }
-        return result;
-      }());
-      var indexOf = ''.indexOf;
-      var includes = function (search) {
-        if (this == null) {
-          throw new TypeError();
-        }
-        var string = String(this);
-        if (search && toString.call(search) == '[object RegExp]') {
-          throw new TypeError();
-        }
-        var stringLength = string.length;
-        var searchString = String(search);
-        var searchLength = searchString.length;
-        var position = arguments.length > 1 ? arguments[1] : undefined;
-        // `ToInteger`
-        var pos = position ? Number(position) : 0;
-        if (pos != pos) { // better `isNaN`
-          pos = 0;
-        }
-        var start = Math.min(Math.max(pos, 0), stringLength);
-        // Avoid the `indexOf` call if no match is possible
-        if (searchLength + start > stringLength) {
-          return false;
-        }
-        return indexOf.call(string, searchString, pos) != -1;
-      };
-      if (defineProperty) {
-        defineProperty(String.prototype, 'includes', {
-          'value': includes,
-          'configurable': true,
-          'writable': true
-        });
-      } else {
-        String.prototype.includes = includes;
-      }
-    }());
-  }
-
-  if (!String.prototype.startsWith) {
-    (function () {
-      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
-      var defineProperty = (function () {
-        // IE 8 only supports `Object.defineProperty` on DOM elements
-        try {
-          var object = {};
-          var $defineProperty = Object.defineProperty;
-          var result = $defineProperty(object, object, object) && $defineProperty;
-        } catch (error) {
-        }
-        return result;
-      }());
-      var toString = {}.toString;
-      var startsWith = function (search) {
-        if (this == null) {
-          throw new TypeError();
-        }
-        var string = String(this);
-        if (search && toString.call(search) == '[object RegExp]') {
-          throw new TypeError();
-        }
-        var stringLength = string.length;
-        var searchString = String(search);
-        var searchLength = searchString.length;
-        var position = arguments.length > 1 ? arguments[1] : undefined;
-        // `ToInteger`
-        var pos = position ? Number(position) : 0;
-        if (pos != pos) { // better `isNaN`
-          pos = 0;
-        }
-        var start = Math.min(Math.max(pos, 0), stringLength);
-        // Avoid the `indexOf` call if no match is possible
-        if (searchLength + start > stringLength) {
-          return false;
-        }
-        var index = -1;
-        while (++index < searchLength) {
-          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
-            return false;
-          }
-        }
-        return true;
-      };
-      if (defineProperty) {
-        defineProperty(String.prototype, 'startsWith', {
-          'value': startsWith,
-          'configurable': true,
-          'writable': true
-        });
-      } else {
-        String.prototype.startsWith = startsWith;
-      }
-    }());
-  }
-
-  if (!Object.keys) {
-    Object.keys = function (
-      o, // object
-      k, // key
-      r  // result array
-      ){
-      // initialize object and result
-      r=[];
-      // iterate over object keys
-      for (k in o)
-          // fill result array with non-prototypical keys
-        r.hasOwnProperty.call(o, k) && r.push(k);
-      // return result
-      return r;
-    };
-  }
-
-  // set data-selected on select element if the value has been programmatically selected
-  // prior to initialization of bootstrap-select
-  // * consider removing or replacing an alternative method *
-  var valHooks = {
-    useDefault: false,
-    _set: $.valHooks.select.set
-  };
-
-  $.valHooks.select.set = function(elem, value) {
-    if (value && !valHooks.useDefault) $(elem).data('selected', true);
-
-    return valHooks._set.apply(this, arguments);
-  };
-
-  var changed_arguments = null;
-  $.fn.triggerNative = function (eventName) {
-    var el = this[0],
-        event;
-
-    if (el.dispatchEvent) { // for modern browsers & IE9+
-      if (typeof Event === 'function') {
-        // For modern browsers
-        event = new Event(eventName, {
-          bubbles: true
-        });
-      } else {
-        // For IE since it doesn't support Event constructor
-        event = document.createEvent('Event');
-        event.initEvent(eventName, true, false);
-      }
-
-      el.dispatchEvent(event);
-    } else if (el.fireEvent) { // for IE8
-      event = document.createEventObject();
-      event.eventType = eventName;
-      el.fireEvent('on' + eventName, event);
-    } else {
-      // fall back to jQuery.trigger
-      this.trigger(eventName);
-    }
-  };
-  //</editor-fold>
-
-  // Case insensitive contains search
-  $.expr.pseudos.icontains = function (obj, index, meta) {
-    var $obj = $(obj);
-    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();
-    return haystack.includes(meta[3].toUpperCase());
-  };
-
-  // Case insensitive begins search
-  $.expr.pseudos.ibegins = function (obj, index, meta) {
-    var $obj = $(obj);
-    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();
-    return haystack.startsWith(meta[3].toUpperCase());
-  };
-
-  // Case and accent insensitive contains search
-  $.expr.pseudos.aicontains = function (obj, index, meta) {
-    var $obj = $(obj);
-    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();
-    return haystack.includes(meta[3].toUpperCase());
-  };
-
-  // Case and accent insensitive begins search
-  $.expr.pseudos.aibegins = function (obj, index, meta) {
-    var $obj = $(obj);
-    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();
-    return haystack.startsWith(meta[3].toUpperCase());
-  };
-
-  /**
-   * Remove all diatrics from the given text.
-   * @access private
-   * @param {String} text
-   * @returns {String}
-   */
-  function normalizeToBase(text) {
-    var rExps = [
-      {re: /[\xC0-\xC6]/g, ch: "A"},
-      {re: /[\xE0-\xE6]/g, ch: "a"},
-      {re: /[\xC8-\xCB]/g, ch: "E"},
-      {re: /[\xE8-\xEB]/g, ch: "e"},
-      {re: /[\xCC-\xCF]/g, ch: "I"},
-      {re: /[\xEC-\xEF]/g, ch: "i"},
-      {re: /[\xD2-\xD6]/g, ch: "O"},
-      {re: /[\xF2-\xF6]/g, ch: "o"},
-      {re: /[\xD9-\xDC]/g, ch: "U"},
-      {re: /[\xF9-\xFC]/g, ch: "u"},
-      {re: /[\xC7-\xE7]/g, ch: "c"},
-      {re: /[\xD1]/g, ch: "N"},
-      {re: /[\xF1]/g, ch: "n"}
-    ];
-    $.each(rExps, function () {
-      text = text ? text.replace(this.re, this.ch) : '';
-    });
-    return text;
-  }
-
-
-  // List of HTML entities for escaping.
-  var escapeMap = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-  };
-  
-  var unescapeMap = {
-    '&amp;': '&',
-    '&lt;': '<',
-    '&gt;': '>',
-    '&quot;': '"',
-    '&#x27;': "'",
-    '&#x60;': '`'
-  };
-
-  // Functions for escaping and unescaping strings to/from HTML interpolation.
-  var createEscaper = function(map) {
-    var escaper = function(match) {
-      return map[match];
-    };
-    // Regexes for identifying a key that needs to be escaped.
-    var source = '(?:' + Object.keys(map).join('|') + ')';
-    var testRegexp = RegExp(source);
-    var replaceRegexp = RegExp(source, 'g');
-    return function(string) {
-      string = string == null ? '' : '' + string;
-      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
-    };
-  };
-
-  var htmlEscape = createEscaper(escapeMap);
-  var htmlUnescape = createEscaper(unescapeMap);
-
-  var Selectpicker = function (element, options) {
-    // bootstrap-select has been initialized - revert valHooks.select.set back to its original function
-    if (!valHooks.useDefault) {
-      $.valHooks.select.set = valHooks._set;
-      valHooks.useDefault = true;
-    }
-
-    this.$element = $(element);
-    this.$newElement = null;
-    this.$button = null;
-    this.$menu = null;
-    this.$lis = null;
-    this.options = options;
-
-    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a
-    // data-attribute)
-    if (this.options.title === null) {
-      this.options.title = this.$element.attr('title');
-    }
-
-    // Format window padding
-    var winPad = this.options.windowPadding;
-    if (typeof winPad === 'number') {
-      this.options.windowPadding = [winPad, winPad, winPad, winPad];
-    }
-
-    //Expose public methods
-    this.val = Selectpicker.prototype.val;
-    this.render = Selectpicker.prototype.render;
-    this.refresh = Selectpicker.prototype.refresh;
-    this.setStyle = Selectpicker.prototype.setStyle;
-    this.selectAll = Selectpicker.prototype.selectAll;
-    this.deselectAll = Selectpicker.prototype.deselectAll;
-    this.destroy = Selectpicker.prototype.destroy;
-    this.remove = Selectpicker.prototype.remove;
-    this.show = Selectpicker.prototype.show;
-    this.hide = Selectpicker.prototype.hide;
-
-    this.init();
-  };
-
-  Selectpicker.VERSION = '1.12.2';
-
-  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.
-  Selectpicker.DEFAULTS = {
-    noneSelectedText: 'Nothing selected',
-    noneResultsText: 'No results matched {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
-        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
-      ];
-    },
-    selectAllText: 'Select All',
-    deselectAllText: 'Deselect All',
-    doneButton: false,
-    doneButtonText: 'Close',
-    multipleSeparator: ', ',
-    styleBase: 'btn',
-    style: 'btn-default',
-    size: 'auto',
-    title: null,
-    selectedTextFormat: 'values',
-    width: false,
-    container: false,
-    hideDisabled: false,
-    showSubtext: false,
-    showIcon: true,
-    showContent: true,
-    dropupAuto: true,
-    header: false,
-    liveSearch: false,
-    liveSearchPlaceholder: null,
-    liveSearchNormalize: false,
-    liveSearchStyle: 'contains',
-    actionsBox: false,
-    iconBase: 'glyphicon',
-    tickIcon: 'glyphicon-ok',
-    showTick: false,
-    template: {
-      caret: '<span class="caret"></span>'
-    },
-    maxOptions: false,
-    mobile: false,
-    selectOnTab: false,
-    dropdownAlignRight: false,
-    windowPadding: 0
-  };
-
-  Selectpicker.prototype = {
-
-    constructor: Selectpicker,
-
-    init: function () {
-      var that = this,
-          id = this.$element.attr('id');
-
-      this.$element.addClass('bs-select-hidden');
-
-      // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility
-      // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index="' + index + '"]')
-      this.liObj = {};
-      this.multiple = this.$element.prop('multiple');
-      this.autofocus = this.$element.prop('autofocus');
-      this.$newElement = this.createView();
-      this.$element
-        .after(this.$newElement)
-        .appendTo(this.$newElement);
-      this.$button = this.$newElement.children('button');
-      this.$menu = this.$newElement.children('.dropdown-menu');
-      this.$menuInner = this.$menu.children('.inner');
-      this.$searchbox = this.$menu.find('input');
-
-      this.$element.removeClass('bs-select-hidden');
-
-      if (this.options.dropdownAlignRight === true) this.$menu.addClass('dropdown-menu-right');
-
-      if (typeof id !== 'undefined') {
-        this.$button.attr('data-id', id);
-        $('label[for="' + id + '"]').click(function (e) {
-          e.preventDefault();
-          that.$button.focus();
-        });
-      }
-
-      this.checkDisabled();
-      this.clickListener();
-      if (this.options.liveSearch) this.liveSearchListener();
-      this.render();
-      this.setStyle();
-      this.setWidth();
-      if (this.options.container) this.selectPosition();
-      this.$menu.data('this', this);
-      this.$newElement.data('this', this);
-      if (this.options.mobile) this.mobile();
-
-      this.$newElement.on({
-        'hide.bs.dropdown': function (e) {
-          that.$menuInner.attr('aria-expanded', false);
-          that.$element.trigger('hide.bs.select', e);
-        },
-        'hidden.bs.dropdown': function (e) {
-          that.$element.trigger('hidden.bs.select', e);
-        },
-        'show.bs.dropdown': function (e) {
-          that.$menuInner.attr('aria-expanded', true);
-          that.$element.trigger('show.bs.select', e);
-        },
-        'shown.bs.dropdown': function (e) {
-          that.$element.trigger('shown.bs.select', e);
-        }
-      });
-
-      if (that.$element[0].hasAttribute('required')) {
-        this.$element.on('invalid', function () {
-          that.$button
-            .addClass('bs-invalid')
-            .focus();
-
-          that.$element.on({
-            'focus.bs.select': function () {
-              that.$button.focus();
-              that.$element.off('focus.bs.select');
-            },
-            'shown.bs.select': function () {
-              that.$element
-                .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened
-                .off('shown.bs.select');
-            },
-            'rendered.bs.select': function () {
-              // if select is no longer invalid, remove the bs-invalid class
-              if (this.validity.valid) that.$button.removeClass('bs-invalid');
-              that.$element.off('rendered.bs.select');
-            }
-          });
-        });
-      }
-
-      setTimeout(function () {
-        that.$element.trigger('loaded.bs.select');
-      });
-    },
-
-    createDropdown: function () {
-      // Options
-      // If we are multiple or showTick option is set, then add the show-tick class
-      var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',
-          inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',
-          autofocus = this.autofocus ? ' autofocus' : '';
-      // Elements
-      var header = this.options.header ? '<div class="popover-title"><button type="button" class="close" aria-hidden="true">&times;</button>' + this.options.header + '</div>' : '';
-      var searchbox = this.options.liveSearch ?
-      '<div class="bs-searchbox">' +
-      '<input type="text" class="form-control" autocomplete="off"' +
-      (null === this.options.liveSearchPlaceholder ? '' : ' placeholder="' + htmlEscape(this.options.liveSearchPlaceholder) + '"') + ' role="textbox" aria-label="Search">' +
-      '</div>'
-          : '';
-      var actionsbox = this.multiple && this.options.actionsBox ?
-      '<div class="bs-actionsbox">' +
-      '<div class="btn-group btn-group-sm btn-block">' +
-      '<button type="button" class="actions-btn bs-select-all btn btn-default">' +
-      this.options.selectAllText +
-      '</button>' +
-      '<button type="button" class="actions-btn bs-deselect-all btn btn-default">' +
-      this.options.deselectAllText +
-      '</button>' +
-      '</div>' +
-      '</div>'
-          : '';
-      var donebutton = this.multiple && this.options.doneButton ?
-      '<div class="bs-donebutton">' +
-      '<div class="btn-group btn-block">' +
-      '<button type="button" class="btn btn-sm btn-default">' +
-      this.options.doneButtonText +
-      '</button>' +
-      '</div>' +
-      '</div>'
-          : '';
-      var drop =
-          '<div class="btn-group bootstrap-select' + showTick + inputGroup + '">' +
-          '<button type="button" class="' + this.options.styleBase + ' dropdown-toggle" data-toggle="dropdown"' + autofocus + ' role="button">' +
-          '<span class="filter-option pull-left"></span>&nbsp;' +
-          '<span class="bs-caret">' +
-          this.options.template.caret +
-          '</span>' +
-          '</button>' +
-          '<div class="dropdown-menu open" role="combobox">' +
-          header +
-          searchbox +
-          actionsbox +
-          '<ul class="dropdown-menu inner" role="listbox" aria-expanded="false">' +
-          '</ul>' +
-          donebutton +
-          '</div>' +
-          '</div>';
-
-      return $(drop);
-    },
-
-    createView: function () {
-      var $drop = this.createDropdown(),
-          li = this.createLi();
-
-      $drop.find('ul')[0].innerHTML = li;
-      return $drop;
-    },
-
-    reloadLi: function () {
-      // rebuild
-      var li = this.createLi();
-      this.$menuInner[0].innerHTML = li;
-    },
-
-    createLi: function () {
-      var that = this,
-          _li = [],
-          optID = 0,
-          titleOption = document.createElement('option'),
-          liIndex = -1; // increment liIndex whenever a new <li> element is created to ensure liObj is correct
-
-      // Helper functions
-      /**
-       * @param content
-       * @param [index]
-       * @param [classes]
-       * @param [optgroup]
-       * @returns {string}
-       */
-      var generateLI = function (content, index, classes, optgroup) {
-        return '<li' +
-            ((typeof classes !== 'undefined' & '' !== classes) ? ' class="' + classes + '"' : '') +
-            ((typeof index !== 'undefined' & null !== index) ? ' data-original-index="' + index + '"' : '') +
-            ((typeof optgroup !== 'undefined' & null !== optgroup) ? 'data-optgroup="' + optgroup + '"' : '') +
-            '>' + content + '</li>';
-      };
-
-      /**
-       * @param text
-       * @param [classes]
-       * @param [inline]
-       * @param [tokens]
-       * @returns {string}
-       */
-      var generateA = function (text, classes, inline, tokens) {
-        return '<a tabindex="0"' +
-            (typeof classes !== 'undefined' ? ' class="' + classes + '"' : '') +
-            (inline ? ' style="' + inline + '"' : '') +
-            (that.options.liveSearchNormalize ? ' data-normalized-text="' + normalizeToBase(htmlEscape($(text).html())) + '"' : '') +
-            (typeof tokens !== 'undefined' || tokens !== null ? ' data-tokens="' + tokens + '"' : '') +
-            ' role="option">' + text +
-            '<span class="' + that.options.iconBase + ' ' + that.options.tickIcon + ' check-mark"></span>' +
-            '</a>';
-      };
-
-      if (this.options.title && !this.multiple) {
-        // this option doesn't create a new <li> element, but does add a new option, so liIndex is decreased
-        // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended
-        liIndex--;
-
-        if (!this.$element.find('.bs-title-option').length) {
-          // Use native JS to prepend option (faster)
-          var element = this.$element[0];
-          titleOption.className = 'bs-title-option';
-          titleOption.innerHTML = this.options.title;
-          titleOption.value = '';
-          element.insertBefore(titleOption, element.firstChild);
-          // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.
-          // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,
-          // if so, the select will have the data-selected attribute
-          var $opt = $(element.options[element.selectedIndex]);
-          if ($opt.attr('selected') === undefined && this.$element.data('selected') === undefined) {
-            titleOption.selected = true;
-          }
-        }
-      }
-
-      this.$element.find('option').each(function (index) {
-        var $this = $(this);
-
-        liIndex++;
-
-        if ($this.hasClass('bs-title-option')) return;
-
-        // Get the class and text for the option
-        var optionClass = this.className || '',
-            inline = this.style.cssText,
-            text = $this.data('content') ? $this.data('content') : $this.html(),
-            tokens = $this.data('tokens') ? $this.data('tokens') : null,
-            subtext = typeof $this.data('subtext') !== 'undefined' ? '<small class="text-muted">' + $this.data('subtext') + '</small>' : '',
-            icon = typeof $this.data('icon') !== 'undefined' ? '<span class="' + that.options.iconBase + ' ' + $this.data('icon') + '"></span> ' : '',
-            $parent = $this.parent(),
-            isOptgroup = $parent[0].tagName === 'OPTGROUP',
-            isOptgroupDisabled = isOptgroup && $parent[0].disabled,
-            isDisabled = this.disabled || isOptgroupDisabled;
-
-        if (icon !== '' && isDisabled) {
-          icon = '<span>' + icon + '</span>';
-        }
-
-        if (that.options.hideDisabled && (isDisabled && !isOptgroup || isOptgroupDisabled)) {
-          liIndex--;
-          return;
-        }
-
-        if (!$this.data('content')) {
-          // Prepend any icon and append any subtext to the main text.
-          text = icon + '<span class="text">' + text + subtext + '</span>';
-        }
-
-        if (isOptgroup && $this.data('divider') !== true) {
-          if (that.options.hideDisabled && isDisabled) {
-            if ($parent.data('allOptionsDisabled') === undefined) {
-              var $options = $parent.children();
-              $parent.data('allOptionsDisabled', $options.filter(':disabled').length === $options.length);
-            }
-
-            if ($parent.data('allOptionsDisabled')) {
-              liIndex--;
-              return;
-            }
-          }
-
-          var optGroupClass = ' ' + $parent[0].className || '';
-
-          if ($this.index() === 0) { // Is it the first option of the optgroup?
-            optID += 1;
-
-            // Get the opt group label
-            var label = $parent[0].label,
-                labelSubtext = typeof $parent.data('subtext') !== 'undefined' ? '<small class="text-muted">' + $parent.data('subtext') + '</small>' : '',
-                labelIcon = $parent.data('icon') ? '<span class="' + that.options.iconBase + ' ' + $parent.data('icon') + '"></span> ' : '';
-
-            label = labelIcon + '<span class="text">' + htmlEscape(label) + labelSubtext + '</span>';
-
-            if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?
-              liIndex++;
-              _li.push(generateLI('', null, 'divider', optID + 'div'));
-            }
-            liIndex++;
-            _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));
-          }
-
-          if (that.options.hideDisabled && isDisabled) {
-            liIndex--;
-            return;
-          }
-
-          _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));
-        } else if ($this.data('divider') === true) {
-          _li.push(generateLI('', index, 'divider'));
-        } else if ($this.data('hidden') === true) {
-          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));
-        } else {
-          var showDivider = this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP';
-
-          // if previous element is not an optgroup and hideDisabled is true
-          if (!showDivider && that.options.hideDisabled) {
-            // get previous elements
-            var $prev = $(this).prevAll();
-
-            for (var i = 0; i < $prev.length; i++) {
-              // find the first element in the previous elements that is an optgroup
-              if ($prev[i].tagName === 'OPTGROUP') {
-                var optGroupDistance = 0;
-
-                // loop through the options in between the current option and the optgroup
-                // and check if they are hidden or disabled
-                for (var d = 0; d < i; d++) {
-                  var prevOption = $prev[d];
-                  if (prevOption.disabled || $(prevOption).data('hidden') === true) optGroupDistance++;
-                }
-
-                // if all of the options between the current option and the optgroup are hidden or disabled, show the divider
-                if (optGroupDistance === i) showDivider = true;
-
-                break;
-              }
-            }
-          }
-
-          if (showDivider) {
-            liIndex++;
-            _li.push(generateLI('', null, 'divider', optID + 'div'));
-          }
-          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));
-        }
-
-        that.liObj[index] = liIndex;
-      });
-
-      //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button
-      if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {
-        this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');
-      }
-
-      return _li.join('');
-    },
-
-    findLis: function () {
-      if (this.$lis == null) this.$lis = this.$menu.find('li');
-      return this.$lis;
-    },
-
-    /**
-     * @param [updateLi] defaults to true
-     */
-    render: function (updateLi) {
-      var that = this,
-          notDisabled;
-
-      //Update the LI to match the SELECT
-      if (updateLi !== false) {
-        this.$element.find('option').each(function (index) {
-          var $lis = that.findLis().eq(that.liObj[index]);
-
-          that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis);
-          that.setSelected(index, this.selected, $lis);
-        });
-      }
-
-      this.togglePlaceholder();
-
-      this.tabIndex();
-
-      var selectedItems = this.$element.find('option').map(function () {
-        if (this.selected) {
-          if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return;
-
-          var $this = $(this),
-              icon = $this.data('icon') && that.options.showIcon ? '<i class="' + that.options.iconBase + ' ' + $this.data('icon') + '"></i> ' : '',
-              subtext;
-
-          if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {
-            subtext = ' <small class="text-muted">' + $this.data('subtext') + '</small>';
-          } else {
-            subtext = '';
-          }
-          if (typeof $this.attr('title') !== 'undefined') {
-            return $this.attr('title');
-          } else if ($this.data('content') && that.options.showContent) {
-            return $this.data('content').toString();
-          } else {
-            return icon + $this.html() + subtext;
-          }
-        }
-      }).toArray();
-
-      //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled
-      //Convert all the values into a comma delimited string
-      var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);
-
-      //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..
-      if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {
-        var max = this.options.selectedTextFormat.split('>');
-        if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {
-          notDisabled = this.options.hideDisabled ? ', [disabled]' : '';
-          var totalCount = this.$element.find('option').not('[data-divider="true"], [data-hidden="true"]' + notDisabled).length,
-              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;
-          title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());
-        }
-      }
-
-      if (this.options.title == undefined) {
-        this.options.title = this.$element.attr('title');
-      }
-
-      if (this.options.selectedTextFormat == 'static') {
-        title = this.options.title;
-      }
-
-      //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text
-      if (!title) {
-        title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;
-      }
-
-      //strip all HTML tags and trim the result, then unescape any escaped tags
-      this.$button.attr('title', htmlUnescape($.trim(title.replace(/<[^>]*>?/g, ''))));
-      this.$button.children('.filter-option').html(title);
-
-      this.$element.trigger('rendered.bs.select');
-    },
-
-    /**
-     * @param [style]
-     * @param [status]
-     */
-    setStyle: function (style, status) {
-      if (this.$element.attr('class')) {
-        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, ''));
-      }
-
-      var buttonClass = style ? style : this.options.style;
-
-      if (status == 'add') {
-        this.$button.addClass(buttonClass);
-      } else if (status == 'remove') {
-        this.$button.removeClass(buttonClass);
-      } else {
-        this.$button.removeClass(this.options.style);
-        this.$button.addClass(buttonClass);
-      }
-    },
-
-    liHeight: function (refresh) {
-      if (!refresh && (this.options.size === false || this.sizeInfo)) return;
-
-      var newElement = document.createElement('div'),
-          menu = document.createElement('div'),
-          menuInner = document.createElement('ul'),
-          divider = document.createElement('li'),
-          li = document.createElement('li'),
-          a = document.createElement('a'),
-          text = document.createElement('span'),
-          header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,
-          search = this.options.liveSearch ? document.createElement('div') : null,
-          actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,
-          doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;
-
-      text.className = 'text';
-      newElement.className = this.$menu[0].parentNode.className + ' open';
-      menu.className = 'dropdown-menu open';
-      menuInner.className = 'dropdown-menu inner';
-      divider.className = 'divider';
-
-      text.appendChild(document.createTextNode('Inner text'));
-      a.appendChild(text);
-      li.appendChild(a);
-      menuInner.appendChild(li);
-      menuInner.appendChild(divider);
-      if (header) menu.appendChild(header);
-      if (search) {
-        var input = document.createElement('input');
-        search.className = 'bs-searchbox';
-        input.className = 'form-control';
-        search.appendChild(input);
-        menu.appendChild(search);
-      }
-      if (actions) menu.appendChild(actions);
-      menu.appendChild(menuInner);
-      if (doneButton) menu.appendChild(doneButton);
-      newElement.appendChild(menu);
-
-      document.body.appendChild(newElement);
-
-      var liHeight = a.offsetHeight,
-          headerHeight = header ? header.offsetHeight : 0,
-          searchHeight = search ? search.offsetHeight : 0,
-          actionsHeight = actions ? actions.offsetHeight : 0,
-          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,
-          dividerHeight = $(divider).outerHeight(true),
-          // fall back to jQuery if getComputedStyle is not supported
-          menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,
-          $menu = menuStyle ? null : $(menu),
-          menuPadding = {
-            vert: parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +
-                  parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +
-                  parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +
-                  parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),
-            horiz: parseInt(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) +
-                  parseInt(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) +
-                  parseInt(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) +
-                  parseInt(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth'))
-          },
-          menuExtras =  {
-            vert: menuPadding.vert +
-                  parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +
-                  parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2,
-            horiz: menuPadding.horiz +
-                  parseInt(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) +
-                  parseInt(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2
-          }
-
-      document.body.removeChild(newElement);
-
-      this.sizeInfo = {
-        liHeight: liHeight,
-        headerHeight: headerHeight,
-        searchHeight: searchHeight,
-        actionsHeight: actionsHeight,
-        doneButtonHeight: doneButtonHeight,
-        dividerHeight: dividerHeight,
-        menuPadding: menuPadding,
-        menuExtras: menuExtras
-      };
-    },
-
-    setSize: function () {
-      this.findLis();
-      this.liHeight();
-
-      if (this.options.header) this.$menu.css('padding-top', 0);
-      if (this.options.size === false) return;
-
-      var that = this,
-          $menu = this.$menu,
-          $menuInner = this.$menuInner,
-          $window = $(window),
-          selectHeight = this.$newElement[0].offsetHeight,
-          selectWidth = this.$newElement[0].offsetWidth,
-          liHeight = this.sizeInfo['liHeight'],
-          headerHeight = this.sizeInfo['headerHeight'],
-          searchHeight = this.sizeInfo['searchHeight'],
-          actionsHeight = this.sizeInfo['actionsHeight'],
-          doneButtonHeight = this.sizeInfo['doneButtonHeight'],
-          divHeight = this.sizeInfo['dividerHeight'],
-          menuPadding = this.sizeInfo['menuPadding'],
-          menuExtras = this.sizeInfo['menuExtras'],
-          notDisabled = this.options.hideDisabled ? '.disabled' : '',
-          menuHeight,
-          menuWidth,
-          getHeight,
-          getWidth,
-          selectOffsetTop,
-          selectOffsetBot,
-          selectOffsetLeft,
-          selectOffsetRight,
-          getPos = function() {
-            var pos = that.$newElement.offset(),
-                $container = $(that.options.container),
-                containerPos;
-
-            if (that.options.container && !$container.is('body')) {
-              containerPos = $container.offset();
-              containerPos.top += parseInt($container.css('borderTopWidth'));
-              containerPos.left += parseInt($container.css('borderLeftWidth'));
-            } else {
-              containerPos = { top: 0, left: 0 };
-            }
-
-            var winPad = that.options.windowPadding;
-            selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();
-            selectOffsetBot = $window.height() - selectOffsetTop - selectHeight - containerPos.top - winPad[2];
-            selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();
-            selectOffsetRight = $window.width() - selectOffsetLeft - selectWidth - containerPos.left - winPad[1];
-            selectOffsetTop -= winPad[0];
-            selectOffsetLeft -= winPad[3];
-          };
-
-      getPos();
-
-      if (this.options.size === 'auto') {
-        var getSize = function () {
-          var minHeight,
-              hasClass = function (className, include) {
-                return function (element) {
-                    if (include) {
-                        return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));
-                    } else {
-                        return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));
-                    }
-                };
-              },
-              lis = that.$menuInner[0].getElementsByTagName('li'),
-              lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),
-              optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');
-
-          getPos();
-          menuHeight = selectOffsetBot - menuExtras.vert;
-          menuWidth = selectOffsetRight - menuExtras.horiz;
-
-          if (that.options.container) {
-            if (!$menu.data('height')) $menu.data('height', $menu.height());
-            getHeight = $menu.data('height');
-
-            if (!$menu.data('width')) $menu.data('width', $menu.width());
-            getWidth = $menu.data('width');
-          } else {
-            getHeight = $menu.height();
-            getWidth = $menu.width();
-          }
-
-          if (that.options.dropupAuto) {
-            that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);
-          }
-
-          if (that.$newElement.hasClass('dropup')) {
-            menuHeight = selectOffsetTop - menuExtras.vert;
-          }
-
-          if (that.options.dropdownAlignRight === 'auto') {
-            $menu.toggleClass('dropdown-menu-right', selectOffsetLeft > selectOffsetRight && (menuWidth - menuExtras.horiz) < (getWidth - selectWidth));
-          }
-
-          if ((lisVisible.length + optGroup.length) > 3) {
-            minHeight = liHeight * 3 + menuExtras.vert - 2;
-          } else {
-            minHeight = 0;
-          }
-
-          $menu.css({
-            'max-height': menuHeight + 'px',
-            'overflow': 'hidden',
-            'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'
-          });
-          $menuInner.css({
-            'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert + 'px',
-            'overflow-y': 'auto',
-            'min-height': Math.max(minHeight - menuPadding.vert, 0) + 'px'
-          });
-        };
-        getSize();
-        this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);
-        $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);
-      } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {
-        var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),
-            divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;
-        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;
-
-        if (that.options.container) {
-          if (!$menu.data('height')) $menu.data('height', $menu.height());
-          getHeight = $menu.data('height');
-        } else {
-          getHeight = $menu.height();
-        }
-
-        if (that.options.dropupAuto) {
-          //noinspection JSUnusedAssignment
-          this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);
-        }
-        $menu.css({
-          'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',
-          'overflow': 'hidden',
-          'min-height': ''
-        });
-        $menuInner.css({
-          'max-height': menuHeight - menuPadding.vert + 'px',
-          'overflow-y': 'auto',
-          'min-height': ''
-        });
-      }
-    },
-
-    setWidth: function () {
-      if (this.options.width === 'auto') {
-        this.$menu.css('min-width', '0');
-
-        // Get correct width if element is hidden
-        var $selectClone = this.$menu.parent().clone().appendTo('body'),
-            $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,
-            ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),
-            btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();
-
-        $selectClone.remove();
-        $selectClone2.remove();
-
-        // Set width to whatever's larger, button title or longest option
-        this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');
-      } else if (this.options.width === 'fit') {
-        // Remove inline min-width so width can be changed from 'auto'
-        this.$menu.css('min-width', '');
-        this.$newElement.css('width', '').addClass('fit-width');
-      } else if (this.options.width) {
-        // Remove inline min-width so width can be changed from 'auto'
-        this.$menu.css('min-width', '');
-        this.$newElement.css('width', this.options.width);
-      } else {
-        // Remove inline min-width/width so width can be changed
-        this.$menu.css('min-width', '');
-        this.$newElement.css('width', '');
-      }
-      // Remove fit-width class if width is changed programmatically
-      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {
-        this.$newElement.removeClass('fit-width');
-      }
-    },
-
-    selectPosition: function () {
-      this.$bsContainer = $('<div class="bs-container" />');
-
-      var that = this,
-          $container = $(this.options.container),
-          pos,
-          containerPos,
-          actualHeight,
-          getPlacement = function ($element) {
-            that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));
-            pos = $element.offset();
-
-            if (!$container.is('body')) {
-              containerPos = $container.offset();
-              containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();
-              containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();
-            } else {
-              containerPos = { top: 0, left: 0 };
-            }
-
-            actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;
-
-            that.$bsContainer.css({
-              'top': pos.top - containerPos.top + actualHeight,
-              'left': pos.left - containerPos.left,
-              'width': $element[0].offsetWidth
-            });
-          };
-
-      this.$button.on('click', function () {
-        var $this = $(this);
-
-        if (that.isDisabled()) {
-          return;
-        }
-
-        getPlacement(that.$newElement);
-
-        that.$bsContainer
-          .appendTo(that.options.container)
-          .toggleClass('open', !$this.hasClass('open'))
-          .append(that.$menu);
-      });
-
-      $(window).on('resize scroll', function () {
-        getPlacement(that.$newElement);
-      });
-
-      this.$element.on('hide.bs.select', function () {
-        that.$menu.data('height', that.$menu.height());
-        that.$bsContainer.detach();
-      });
-    },
-
-    /**
-     * @param {number} index - the index of the option that is being changed
-     * @param {boolean} selected - true if the option is being selected, false if being deselected
-     * @param {JQuery} $lis - the 'li' element that is being modified
-     */
-    setSelected: function (index, selected, $lis) {
-      if (!$lis) {
-        this.togglePlaceholder(); // check if setSelected is being called by changing the value of the select
-        $lis = this.findLis().eq(this.liObj[index]);
-      }
-
-      $lis.toggleClass('selected', selected).find('a').attr('aria-selected', selected);
-    },
-
-    /**
-     * @param {number} index - the index of the option that is being disabled
-     * @param {boolean} disabled - true if the option is being disabled, false if being enabled
-     * @param {JQuery} $lis - the 'li' element that is being modified
-     */
-    setDisabled: function (index, disabled, $lis) {
-      if (!$lis) {
-        $lis = this.findLis().eq(this.liObj[index]);
-      }
-
-      if (disabled) {
-        $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1).attr('aria-disabled', true);
-      } else {
-        $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0).attr('aria-disabled', false);
-      }
-    },
-
-    isDisabled: function () {
-      return this.$element[0].disabled;
-    },
-
-    checkDisabled: function () {
-      var that = this;
-
-      if (this.isDisabled()) {
-        this.$newElement.addClass('disabled');
-        this.$button.addClass('disabled').attr('tabindex', -1).attr('aria-disabled', true);
-      } else {
-        if (this.$button.hasClass('disabled')) {
-          this.$newElement.removeClass('disabled');
-          this.$button.removeClass('disabled').attr('aria-disabled', false);
-        }
-
-        if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {
-          this.$button.removeAttr('tabindex');
-        }
-      }
-
-      this.$button.click(function () {
-        return !that.isDisabled();
-      });
-    },
-
-    togglePlaceholder: function () {
-      var value = this.$element.val();
-      this.$button.toggleClass('bs-placeholder', value === null || value === '' || (value.constructor === Array && value.length === 0));
-    },
-
-    tabIndex: function () {
-      if (this.$element.data('tabindex') !== this.$element.attr('tabindex') && 
-        (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) {
-        this.$element.data('tabindex', this.$element.attr('tabindex'));
-        this.$button.attr('tabindex', this.$element.data('tabindex'));
-      }
-
-      this.$element.attr('tabindex', -98);
-    },
-
-    clickListener: function () {
-      var that = this,
-          $document = $(document);
-
-      $document.data('spaceSelect', false);
-
-      this.$button.on('keyup', function (e) {
-        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {
-            e.preventDefault();
-            $document.data('spaceSelect', false);
-        }
-      });
-
-      this.$button.on('click', function () {
-        that.setSize();
-      });
-
-      this.$element.on('shown.bs.select', function () {
-        if (!that.options.liveSearch && !that.multiple) {
-          that.$menuInner.find('.selected a').focus();
-        } else if (!that.multiple) {
-          var selectedIndex = that.liObj[that.$element[0].selectedIndex];
-
-          if (typeof selectedIndex !== 'number' || that.options.size === false) return;
-
-          // scroll to selected option
-          var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;
-          offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2;
-          that.$menuInner[0].scrollTop = offset;
-        }
-      });
-
-      this.$menuInner.on('click', 'li a', function (e) {
-        var $this = $(this),
-            clickedIndex = $this.parent().data('originalIndex'),
-            prevValue = that.$element.val(),
-            prevIndex = that.$element.prop('selectedIndex'),
-            triggerChange = true;
-
-        // Don't close on multi choice menu
-        if (that.multiple && that.options.maxOptions !== 1) {
-          e.stopPropagation();
-        }
-
-        e.preventDefault();
-
-        //Don't run if we have been disabled
-        if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {
-          var $options = that.$element.find('option'),
-              $option = $options.eq(clickedIndex),
-              state = $option.prop('selected'),
-              $optgroup = $option.parent('optgroup'),
-              maxOptions = that.options.maxOptions,
-              maxOptionsGrp = $optgroup.data('maxOptions') || false;
-
-          if (!that.multiple) { // Deselect all others if not multi select box
-            $options.prop('selected', false);
-            $option.prop('selected', true);
-            that.$menuInner.find('.selected').removeClass('selected').find('a').attr('aria-selected', false);
-            that.setSelected(clickedIndex, true);
-          } else { // Toggle the one we have chosen if we are multi select.
-            $option.prop('selected', !state);
-            that.setSelected(clickedIndex, !state);
-            $this.blur();
-
-            if (maxOptions !== false || maxOptionsGrp !== false) {
-              var maxReached = maxOptions < $options.filter(':selected').length,
-                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;
-
-              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {
-                if (maxOptions && maxOptions == 1) {
-                  $options.prop('selected', false);
-                  $option.prop('selected', true);
-                  that.$menuInner.find('.selected').removeClass('selected');
-                  that.setSelected(clickedIndex, true);
-                } else if (maxOptionsGrp && maxOptionsGrp == 1) {
-                  $optgroup.find('option:selected').prop('selected', false);
-                  $option.prop('selected', true);
-                  var optgroupID = $this.parent().data('optgroup');
-                  that.$menuInner.find('[data-optgroup="' + optgroupID + '"]').removeClass('selected');
-                  that.setSelected(clickedIndex, true);
-                } else {
-                  var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,
-                      maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,
-                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),
-                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),
-                      $notify = $('<div class="notify"></div>');
-                  // If {var} is set in array, replace it
-                  /** @deprecated */
-                  if (maxOptionsArr[2]) {
-                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);
-                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);
-                  }
-
-                  $option.prop('selected', false);
-
-                  that.$menu.append($notify);
-
-                  if (maxOptions && maxReached) {
-                    $notify.append($('<div>' + maxTxt + '</div>'));
-                    triggerChange = false;
-                    that.$element.trigger('maxReached.bs.select');
-                  }
-
-                  if (maxOptionsGrp && maxReachedGrp) {
-                    $notify.append($('<div>' + maxTxtGrp + '</div>'));
-                    triggerChange = false;
-                    that.$element.trigger('maxReachedGrp.bs.select');
-                  }
-
-                  setTimeout(function () {
-                    that.setSelected(clickedIndex, false);
-                  }, 10);
-
-                  $notify.delay(750).fadeOut(300, function () {
-                    $(this).remove();
-                  });
-                }
-              }
-            }
-          }
-
-          if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {
-            that.$button.focus();
-          } else if (that.options.liveSearch) {
-            that.$searchbox.focus();
-          }
-
-          // Trigger select 'change'
-          if (triggerChange) {
-            if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {
-              // $option.prop('selected') is current option state (selected/unselected). state is previous option state.
-              changed_arguments = [clickedIndex, $option.prop('selected'), state];
-              that.$element
-                .triggerNative('change');
-            }
-          }
-        }
-      });
-
-      this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {
-        if (e.currentTarget == this) {
-          e.preventDefault();
-          e.stopPropagation();
-          if (that.options.liveSearch && !$(e.target).hasClass('close')) {
-            that.$searchbox.focus();
-          } else {
-            that.$button.focus();
-          }
-        }
-      });
-
-      this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {
-        e.preventDefault();
-        e.stopPropagation();
-        if (that.options.liveSearch) {
-          that.$searchbox.focus();
-        } else {
-          that.$button.focus();
-        }
-      });
-
-      this.$menu.on('click', '.popover-title .close', function () {
-        that.$button.click();
-      });
-
-      this.$searchbox.on('click', function (e) {
-        e.stopPropagation();
-      });
-
-      this.$menu.on('click', '.actions-btn', function (e) {
-        if (that.options.liveSearch) {
-          that.$searchbox.focus();
-        } else {
-          that.$button.focus();
-        }
-
-        e.preventDefault();
-        e.stopPropagation();
-
-        if ($(this).hasClass('bs-select-all')) {
-          that.selectAll();
-        } else {
-          that.deselectAll();
-        }
-      });
-
-      this.$element.change(function () {
-        that.render(false);
-        that.$element.trigger('changed.bs.select', changed_arguments);
-        changed_arguments = null;
-      });
-    },
-
-    liveSearchListener: function () {
-      var that = this,
-          $no_results = $('<li class="no-results"></li>');
-
-      this.$button.on('click.dropdown.data-api', function () {
-        that.$menuInner.find('.active').removeClass('active');
-        if (!!that.$searchbox.val()) {
-          that.$searchbox.val('');
-          that.$lis.not('.is-hidden').removeClass('hidden');
-          if (!!$no_results.parent().length) $no_results.remove();
-        }
-        if (!that.multiple) that.$menuInner.find('.selected').addClass('active');
-        setTimeout(function () {
-          that.$searchbox.focus();
-        }, 10);
-      });
-
-      this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {
-        e.stopPropagation();
-      });
-
-      this.$searchbox.on('input propertychange', function () {
-        that.$lis.not('.is-hidden').removeClass('hidden');
-        that.$lis.filter('.active').removeClass('active');
-        $no_results.remove();
-
-        if (that.$searchbox.val()) {
-          var $searchBase = that.$lis.not('.is-hidden, .divider, .dropdown-header'),
-              $hideItems;
-          if (that.options.liveSearchNormalize) {
-            $hideItems = $searchBase.find('a').not(':a' + that._searchStyle() + '("' + normalizeToBase(that.$searchbox.val()) + '")');
-          } else {
-            $hideItems = $searchBase.find('a').not(':' + that._searchStyle() + '("' + that.$searchbox.val() + '")');
-          }
-
-          if ($hideItems.length === $searchBase.length) {
-            $no_results.html(that.options.noneResultsText.replace('{0}', '"' + htmlEscape(that.$searchbox.val()) + '"'));
-            that.$menuInner.append($no_results);
-            that.$lis.addClass('hidden');
-          } else {
-            $hideItems.parent().addClass('hidden');
-
-            var $lisVisible = that.$lis.not('.hidden'),
-                $foundDiv;
-
-            // hide divider if first or last visible, or if followed by another divider
-            $lisVisible.each(function (index) {
-              var $this = $(this);
-
-              if ($this.hasClass('divider')) {
-                if ($foundDiv === undefined) {
-                  $this.addClass('hidden');
-                } else {
-                  if ($foundDiv) $foundDiv.addClass('hidden');
-                  $foundDiv = $this;
-                }
-              } else if ($this.hasClass('dropdown-header') && $lisVisible.eq(index + 1).data('optgroup') !== $this.data('optgroup')) {
-                $this.addClass('hidden');
-              } else {
-                $foundDiv = null;
-              }
-            });
-            if ($foundDiv) $foundDiv.addClass('hidden');
-
-            $searchBase.not('.hidden').first().addClass('active');
-          }
-        }
-      });
-    },
-
-    _searchStyle: function () {
-      var styles = {
-        begins: 'ibegins',
-        startsWith: 'ibegins'
-      };
-
-      return styles[this.options.liveSearchStyle] || 'icontains';
-    },
-
-    val: function (value) {
-      if (typeof value !== 'undefined') {
-        this.$element.val(value);
-        this.render();
-
-        return this.$element;
-      } else {
-        return this.$element.val();
-      }
-    },
-
-    changeAll: function (status) {
-      if (!this.multiple) return;
-      if (typeof status === 'undefined') status = true;
-
-      this.findLis();
-
-      var $options = this.$element.find('option'),
-          $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden'),
-          lisVisLen = $lisVisible.length,
-          selectedOptions = [];
-          
-      if (status) {
-        if ($lisVisible.filter('.selected').length === $lisVisible.length) return;
-      } else {
-        if ($lisVisible.filter('.selected').length === 0) return;
-      }
-          
-      $lisVisible.toggleClass('selected', status);
-
-      for (var i = 0; i < lisVisLen; i++) {
-        var origIndex = $lisVisible[i].getAttribute('data-original-index');
-        selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0];
-      }
-
-      $(selectedOptions).prop('selected', status);
-
-      this.render(false);
-
-      this.togglePlaceholder();
-
-      this.$element
-        .triggerNative('change');
-    },
-
-    selectAll: function () {
-      return this.changeAll(true);
-    },
-
-    deselectAll: function () {
-      return this.changeAll(false);
-    },
-
-    toggle: function (e) {
-      e = e || window.event;
-
-      if (e) e.stopPropagation();
-
-      this.$button.trigger('click');
-    },
-
-    keydown: function (e) {
-      var $this = $(this),
-          $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),
-          $items,
-          that = $parent.data('this'),
-          index,
-          next,
-          first,
-          last,
-          prev,
-          nextPrev,
-          prevIndex,
-          isActive,
-          selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',
-          keyCodeMap = {
-            32: ' ',
-            48: '0',
-            49: '1',
-            50: '2',
-            51: '3',
-            52: '4',
-            53: '5',
-            54: '6',
-            55: '7',
-            56: '8',
-            57: '9',
-            59: ';',
-            65: 'a',
-            66: 'b',
-            67: 'c',
-            68: 'd',
-            69: 'e',
-            70: 'f',
-            71: 'g',
-            72: 'h',
-            73: 'i',
-            74: 'j',
-            75: 'k',
-            76: 'l',
-            77: 'm',
-            78: 'n',
-            79: 'o',
-            80: 'p',
-            81: 'q',
-            82: 'r',
-            83: 's',
-            84: 't',
-            85: 'u',
-            86: 'v',
-            87: 'w',
-            88: 'x',
-            89: 'y',
-            90: 'z',
-            96: '0',
-            97: '1',
-            98: '2',
-            99: '3',
-            100: '4',
-            101: '5',
-            102: '6',
-            103: '7',
-            104: '8',
-            105: '9'
-          };
-
-      if (that.options.liveSearch) $parent = $this.parent().parent();
-
-      if (that.options.container) $parent = that.$menu;
-
-      $items = $('[role="listbox"] li', $parent);
-
-      isActive = that.$newElement.hasClass('open');
-
-      if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) {
-        if (!that.options.container) {
-          that.setSize();
-          that.$menu.parent().addClass('open');
-          isActive = true;
-        } else {
-          that.$button.trigger('click');
-        }
-        that.$searchbox.focus();
-        return;
-      }
-
-      if (that.options.liveSearch) {
-        if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive) {
-          e.preventDefault();
-          e.stopPropagation();
-          that.$menuInner.click();
-          that.$button.focus();
-        }
-        // $items contains li elements when liveSearch is enabled
-        $items = $('[role="listbox"] li' + selector, $parent);
-        if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {
-          if ($items.filter('.active').length === 0) {
-            $items = that.$menuInner.find('li');
-            if (that.options.liveSearchNormalize) {
-              $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');
-            } else {
-              $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');
-            }
-          }
-        }
-      }
-
-      if (!$items.length) return;
-
-      if (/(38|40)/.test(e.keyCode.toString(10))) {
-        index = $items.index($items.find('a').filter(':focus').parent());
-        first = $items.filter(selector).first().index();
-        last = $items.filter(selector).last().index();
-        next = $items.eq(index).nextAll(selector).eq(0).index();
-        prev = $items.eq(index).prevAll(selector).eq(0).index();
-        nextPrev = $items.eq(next).prevAll(selector).eq(0).index();
-
-        if (that.options.liveSearch) {
-          $items.each(function (i) {
-            if (!$(this).hasClass('disabled')) {
-              $(this).data('index', i);
-            }
-          });
-          index = $items.index($items.filter('.active'));
-          first = $items.first().data('index');
-          last = $items.last().data('index');
-          next = $items.eq(index).nextAll().eq(0).data('index');
-          prev = $items.eq(index).prevAll().eq(0).data('index');
-          nextPrev = $items.eq(next).prevAll().eq(0).data('index');
-        }
-
-        prevIndex = $this.data('prevIndex');
-
-        if (e.keyCode == 38) {
-          if (that.options.liveSearch) index--;
-          if (index != nextPrev && index > prev) index = prev;
-          if (index < first) index = first;
-          if (index == prevIndex) index = last;
-        } else if (e.keyCode == 40) {
-          if (that.options.liveSearch) index++;
-          if (index == -1) index = 0;
-          if (index != nextPrev && index < next) index = next;
-          if (index > last) index = last;
-          if (index == prevIndex) index = first;
-        }
-
-        $this.data('prevIndex', index);
-
-        if (!that.options.liveSearch) {
-          $items.eq(index).children('a').focus();
-        } else {
-          e.preventDefault();
-          if (!$this.hasClass('dropdown-toggle')) {
-            $items.removeClass('active').eq(index).addClass('active').children('a').focus();
-            $this.focus();
-          }
-        }
-
-      } else if (!$this.is('input')) {
-        var keyIndex = [],
-            count,
-            prevKey;
-
-        $items.each(function () {
-          if (!$(this).hasClass('disabled')) {
-            if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {
-              keyIndex.push($(this).index());
-            }
-          }
-        });
-
-        count = $(document).data('keycount');
-        count++;
-        $(document).data('keycount', count);
-
-        prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);
-
-        if (prevKey != keyCodeMap[e.keyCode]) {
-          count = 1;
-          $(document).data('keycount', count);
-        } else if (count >= keyIndex.length) {
-          $(document).data('keycount', 0);
-          if (count > keyIndex.length) count = 1;
-        }
-
-        $items.eq(keyIndex[count - 1]).children('a').focus();
-      }
-
-      // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu.
-      if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {
-        if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();
-        if (!that.options.liveSearch) {
-          var elem = $(':focus');
-          elem.click();
-          // Bring back focus for multiselects
-          elem.focus();
-          // Prevent screen from scrolling if the user hit the spacebar
-          e.preventDefault();
-          // Fixes spacebar selection of dropdown items in FF & IE
-          $(document).data('spaceSelect', true);
-        } else if (!/(32)/.test(e.keyCode.toString(10))) {
-          that.$menuInner.find('.active a').click();
-          $this.focus();
-        }
-        $(document).data('keycount', 0);
-      }
-
-      if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {
-        that.$menu.parent().removeClass('open');
-        if (that.options.container) that.$newElement.removeClass('open');
-        that.$button.focus();
-      }
-    },
-
-    mobile: function () {
-      this.$element.addClass('mobile-device');
-    },
-
-    refresh: function () {
-      this.$lis = null;
-      this.liObj = {};
-      this.reloadLi();
-      this.render();
-      this.checkDisabled();
-      this.liHeight(true);
-      this.setStyle();
-      this.setWidth();
-      if (this.$lis) this.$searchbox.trigger('propertychange');
-
-      this.$element.trigger('refreshed.bs.select');
-    },
-
-    hide: function () {
-      this.$newElement.hide();
-    },
-
-    show: function () {
-      this.$newElement.show();
-    },
-
-    remove: function () {
-      this.$newElement.remove();
-      this.$element.remove();
-    },
-
-    destroy: function () {
-      this.$newElement.before(this.$element).remove();
-
-      if (this.$bsContainer) {
-        this.$bsContainer.remove();
-      } else {
-        this.$menu.remove();
-      }
-
-      this.$element
-        .off('.bs.select')
-        .removeData('selectpicker')
-        .removeClass('bs-select-hidden selectpicker');
-    }
-  };
-
-  // SELECTPICKER PLUGIN DEFINITION
-  // ==============================
-  function Plugin(option) {
-    // get the args of the outer function..
-    var args = arguments;
-    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them
-    // to get lost/corrupted in android 2.3 and IE9 #715 #775
-    var _option = option;
-
-    [].shift.apply(args);
-
-    var value;
-    var chain = this.each(function () {
-      var $this = $(this);
-      if ($this.is('select')) {
-        var data = $this.data('selectpicker'),
-            options = typeof _option == 'object' && _option;
-
-        if (!data) {
-          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);
-          config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template);
-          $this.data('selectpicker', (data = new Selectpicker(this, config)));
-        } else if (options) {
-          for (var i in options) {
-            if (options.hasOwnProperty(i)) {
-              data.options[i] = options[i];
-            }
-          }
-        }
-
-        if (typeof _option == 'string') {
-          if (data[_option] instanceof Function) {
-            value = data[_option].apply(data, args);
-          } else {
-            value = data.options[_option];
-          }
-        }
-      }
-    });
-
-    if (typeof value !== 'undefined') {
-      //noinspection JSUnusedAssignment
-      return value;
-    } else {
-      return chain;
-    }
-  }
-
-  var old = $.fn.selectpicker;
-  $.fn.selectpicker = Plugin;
-  $.fn.selectpicker.Constructor = Selectpicker;
-
-  // SELECTPICKER NO CONFLICT
-  // ========================
-  $.fn.selectpicker.noConflict = function () {
-    $.fn.selectpicker = old;
-    return this;
-  };
-
-  $(document)
-      .data('keycount', 0)
-      .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input', Selectpicker.prototype.keydown)
-      .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input', function (e) {
-        e.stopPropagation();
-      });
-
-  // SELECTPICKER DATA-API
-  // =====================
-  $(window).on('load.bs.select.data-api', function () {
-    $('.selectpicker').each(function () {
-      var $selectpicker = $(this);
-      Plugin.call($selectpicker, $selectpicker.data());
-    })
-  });
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.js.map b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.js.map
deleted file mode 100644
index 82f842d..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["bootstrap-select.js"],"names":["root","factory","define","amd","a0","module","exports","require","this","jQuery","$","normalizeToBase","text","rExps","re","ch","each","replace","Plugin","option","args","arguments","_option","shift","apply","value","chain","$this","is","data","options","i","hasOwnProperty","config","extend","Selectpicker","DEFAULTS","fn","selectpicker","defaults","template","Function","String","prototype","includes","toString","defineProperty","object","$defineProperty","Object","result","error","indexOf","search","TypeError","string","call","stringLength","length","searchString","searchLength","position","undefined","pos","Number","start","Math","min","max","configurable","writable","startsWith","index","charCodeAt","keys","o","k","r","push","valHooks","useDefault","_set","select","set","elem","changed_arguments","triggerNative","eventName","event","el","dispatchEvent","Event","bubbles","document","createEvent","initEvent","fireEvent","createEventObject","eventType","trigger","expr","pseudos","icontains","obj","meta","$obj","haystack","toUpperCase","ibegins","aicontains","aibegins","escapeMap","&","<",">","\"","'","`","unescapeMap","&amp;","&lt;","&gt;","&quot;","&#x27;","&#x60;","createEscaper","map","escaper","match","source","join","testRegexp","RegExp","replaceRegexp","test","htmlEscape","htmlUnescape","element","$element","$newElement","$button","$menu","$lis","title","attr","winPad","windowPadding","val","render","refresh","setStyle","selectAll","deselectAll","destroy","remove","show","hide","init","VERSION","noneSelectedText","noneResultsText","countSelectedText","numSelected","numTotal","maxOptionsText","numAll","numGroup","selectAllText","deselectAllText","doneButton","doneButtonText","multipleSeparator","styleBase","style","size","selectedTextFormat","width","container","hideDisabled","showSubtext","showIcon","showContent","dropupAuto","header","liveSearch","liveSearchPlaceholder","liveSearchNormalize","liveSearchStyle","actionsBox","iconBase","tickIcon","showTick","caret","maxOptions","mobile","selectOnTab","dropdownAlignRight","constructor","that","id","addClass","liObj","multiple","prop","autofocus","createView","after","appendTo","children","$menuInner","$searchbox","find","removeClass","click","e","preventDefault","focus","checkDisabled","clickListener","liveSearchListener","setWidth","selectPosition","on","hide.bs.dropdown","hidden.bs.dropdown","show.bs.dropdown","shown.bs.dropdown","hasAttribute","focus.bs.select","off","shown.bs.select","rendered.bs.select","validity","valid","setTimeout","createDropdown","inputGroup","parent","hasClass","searchbox","actionsbox","donebutton","drop","$drop","li","createLi","innerHTML","reloadLi","_li","optID","titleOption","createElement","liIndex","generateLI","content","classes","optgroup","generateA","inline","tokens","html","className","insertBefore","firstChild","$opt","selectedIndex","selected","optionClass","cssText","subtext","icon","$parent","isOptgroup","tagName","isOptgroupDisabled","disabled","isDisabled","$options","filter","optGroupClass","label","labelSubtext","labelIcon","showDivider","previousElementSibling","$prev","prevAll","optGroupDistance","d","prevOption","eq","findLis","updateLi","notDisabled","setDisabled","parentNode","setSelected","togglePlaceholder","tabIndex","selectedItems","toArray","split","totalCount","not","tr8nText","trim","status","buttonClass","liHeight","sizeInfo","newElement","menu","menuInner","divider","a","cloneNode","actions","appendChild","createTextNode","input","body","offsetHeight","headerHeight","searchHeight","actionsHeight","doneButtonHeight","dividerHeight","outerHeight","menuStyle","getComputedStyle","menuPadding","vert","parseInt","paddingTop","css","paddingBottom","borderTopWidth","borderBottomWidth","horiz","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","menuExtras","marginTop","marginBottom","marginLeft","marginRight","removeChild","setSize","menuHeight","menuWidth","getHeight","getWidth","selectOffsetTop","selectOffsetBot","selectOffsetLeft","selectOffsetRight","$window","window","selectHeight","selectWidth","offsetWidth","divHeight","getPos","containerPos","offset","$container","top","left","scrollTop","height","scrollLeft","getSize","minHeight","include","classList","contains","lis","getElementsByTagName","lisVisible","Array","optGroup","toggleClass","max-height","overflow","min-height","overflow-y","optIndex","slice","last","divLength","$selectClone","clone","$selectClone2","ulWidth","outerWidth","btnWidth","$bsContainer","actualHeight","getPlacement","append","detach","removeAttr","$document","keyCode","offsetTop","clickedIndex","prevValue","prevIndex","triggerChange","stopPropagation","$option","state","$optgroup","maxOptionsGrp","blur","maxReached","maxReachedGrp","optgroupID","maxOptionsArr","maxTxt","maxTxtGrp","$notify","delay","fadeOut","currentTarget","target","change","$no_results","$hideItems","$searchBase","_searchStyle","$foundDiv","$lisVisible","first","styles","begins","changeAll","lisVisLen","selectedOptions","origIndex","getAttribute","toggle","keydown","$items","next","prev","nextPrev","isActive","selector","keyCodeMap","32","48","49","50","51","52","53","54","55","56","57","59","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","96","97","98","99","100","101","102","103","104","105","nextAll","count","prevKey","keyIndex","toLowerCase","substring","before","removeData","old","Constructor","noConflict","$selectpicker"],"mappings":";;;;;;CAOC,SAAUA,EAAMC,GACO,kBAAXC,SAAyBA,OAAOC,IAEzCD,QAAQ,UAAW,SAAUE,GAC3B,MAAQH,GAAQG,KAES,gBAAXC,SAAuBA,OAAOC,QAI9CD,OAAOC,QAAUL,EAAQM,QAAQ,WAEjCN,EAAQD,EAAa,SAEvBQ,KAAM,SAAUC,IAElB,SAAWC,GACT,YA4MA,SAASC,GAAgBC,GACvB,GAAIC,KACDC,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,eAAgBC,GAAI,MACxBD,GAAI,UAAWC,GAAI,MACnBD,GAAI,UAAWC,GAAI,KAKtB,OAHAL,GAAEM,KAAKH,EAAO,WACZD,EAAOA,EAAOA,EAAKK,QAAQT,KAAKM,GAAIN,KAAKO,IAAM,KAE1CH,EAoiDT,QAASM,GAAOC,GAEd,GAAIC,GAAOC,UAGPC,EAAUH,KAEXI,MAAMC,MAAMJ,EAEf,IAAIK,GACAC,EAAQlB,KAAKQ,KAAK,WACpB,GAAIW,GAAQjB,EAAEF,KACd,IAAImB,EAAMC,GAAG,UAAW,CACtB,GAAIC,GAAOF,EAAME,KAAK,gBAClBC,EAA4B,gBAAXR,IAAuBA,CAE5C,IAAKO,GAIE,GAAIC,EACT,IAAK,GAAIC,KAAKD,GACRA,EAAQE,eAAeD,KACzBF,EAAKC,QAAQC,GAAKD,EAAQC,QAPrB,CACT,GAAIE,GAASvB,EAAEwB,UAAWC,EAAaC,SAAU1B,EAAE2B,GAAGC,aAAaC,aAAgBZ,EAAME,OAAQC,EACjGG,GAAOO,SAAW9B,EAAEwB,UAAWC,EAAaC,SAASI,SAAW9B,EAAE2B,GAAGC,aAAaC,SAAW7B,EAAE2B,GAAGC,aAAaC,SAASC,YAAgBb,EAAME,OAAOW,SAAUV,EAAQU,UACvKb,EAAME,KAAK,eAAiBA,EAAO,GAAIM,GAAa3B,KAAMyB,IAStC,gBAAXX,KAEPG,EADEI,EAAKP,YAAoBmB,UACnBZ,EAAKP,GAASE,MAAMK,EAAMT,GAE1BS,EAAKC,QAAQR,MAM7B,OAAqB,mBAAVG,GAEFA,EAEAC,EA1yDNgB,OAAOC,UAAUC,WACnB,WAEC,GAAIC,MAAcA,SACdC,EAAkB,WAEpB,IACE,GAAIC,MACAC,EAAkBC,OAAOH,eACzBI,EAASF,EAAgBD,EAAQA,EAAQA,IAAWC,EACxD,MAAOG,IAET,MAAOD,MAELE,EAAU,GAAGA,QACbR,EAAW,SAAUS,GACvB,GAAY,MAAR7C,KACF,KAAM,IAAI8C,UAEZ,IAAIC,GAASb,OAAOlC,KACpB,IAAI6C,GAAmC,mBAAzBR,EAASW,KAAKH,GAC1B,KAAM,IAAIC,UAEZ,IAAIG,GAAeF,EAAOG,OACtBC,EAAejB,OAAOW,GACtBO,EAAeD,EAAaD,OAC5BG,EAAWxC,UAAUqC,OAAS,EAAIrC,UAAU,GAAKyC,OAEjDC,EAAMF,EAAWG,OAAOH,GAAY,CACpCE,IAAOA,IACTA,EAAM,EAER,IAAIE,GAAQC,KAAKC,IAAID,KAAKE,IAAIL,EAAK,GAAIN,EAEvC,SAAIG,EAAeK,EAAQR,IAGpBL,EAAQI,KAAKD,EAAQI,EAAcI,KAAQ,EAEhDjB,GACFA,EAAeJ,OAAOC,UAAW,YAC/BlB,MAASmB,EACTyB,cAAgB,EAChBC,UAAY,IAGd5B,OAAOC,UAAUC,SAAWA,KAK7BF,OAAOC,UAAU4B,aACnB,WAEC,GAAIzB,GAAkB,WAEpB,IACE,GAAIC,MACAC,EAAkBC,OAAOH,eACzBI,EAASF,EAAgBD,EAAQA,EAAQA,IAAWC,EACxD,MAAOG,IAET,MAAOD,MAELL,KAAcA,SACd0B,EAAa,SAAUlB,GACzB,GAAY,MAAR7C,KACF,KAAM,IAAI8C,UAEZ,IAAIC,GAASb,OAAOlC,KACpB,IAAI6C,GAAmC,mBAAzBR,EAASW,KAAKH,GAC1B,KAAM,IAAIC,UAEZ,IAAIG,GAAeF,EAAOG,OACtBC,EAAejB,OAAOW,GACtBO,EAAeD,EAAaD,OAC5BG,EAAWxC,UAAUqC,OAAS,EAAIrC,UAAU,GAAKyC,OAEjDC,EAAMF,EAAWG,OAAOH,GAAY,CACpCE,IAAOA,IACTA,EAAM,EAER,IAAIE,GAAQC,KAAKC,IAAID,KAAKE,IAAIL,EAAK,GAAIN,EAEvC,IAAIG,EAAeK,EAAQR,EACzB,OAAO,CAGT,KADA,GAAIe,IAAQ,IACHA,EAAQZ,GACf,GAAIL,EAAOkB,WAAWR,EAAQO,IAAUb,EAAac,WAAWD,GAC9D,OAAO,CAGX,QAAO,EAEL1B,GACFA,EAAeJ,OAAOC,UAAW,cAC/BlB,MAAS8C,EACTF,cAAgB,EAChBC,UAAY,IAGd5B,OAAOC,UAAU4B,WAAaA,KAK/BtB,OAAOyB,OACVzB,OAAOyB,KAAO,SACZC,EACAC,EACAC,GAGAA,IAEA,KAAKD,IAAKD,GAERE,EAAE7C,eAAewB,KAAKmB,EAAGC,IAAMC,EAAEC,KAAKF,EAExC,OAAOC,IAOX,IAAIE,IACFC,YAAY,EACZC,KAAMvE,EAAEqE,SAASG,OAAOC,IAG1BzE,GAAEqE,SAASG,OAAOC,IAAM,SAASC,EAAM3D,GAGrC,MAFIA,KAAUsD,EAASC,YAAYtE,EAAE0E,GAAMvD,KAAK,YAAY,GAErDkD,EAASE,KAAKzD,MAAMhB,KAAMa,WAGnC,IAAIgE,GAAoB,IACxB3E,GAAE2B,GAAGiD,cAAgB,SAAUC,GAC7B,GACIC,GADAC,EAAKjF,KAAK,EAGViF,GAAGC,eACgB,kBAAVC,OAETH,EAAQ,GAAIG,OAAMJ,GAChBK,SAAS,KAIXJ,EAAQK,SAASC,YAAY,SAC7BN,EAAMO,UAAUR,GAAW,GAAM,IAGnCE,EAAGC,cAAcF,IACRC,EAAGO,WACZR,EAAQK,SAASI,oBACjBT,EAAMU,UAAYX,EAClBE,EAAGO,UAAU,KAAOT,EAAWC,IAG/BhF,KAAK2F,QAAQZ,IAMjB7E,EAAE0F,KAAKC,QAAQC,UAAY,SAAUC,EAAK/B,EAAOgC,GAC/C,GAAIC,GAAO/F,EAAE6F,GACTG,GAAYD,EAAK5E,KAAK,WAAa4E,EAAK7F,QAAQiC,WAAW8D,aAC/D,OAAOD,GAAS9D,SAAS4D,EAAK,GAAGG,gBAInCjG,EAAE0F,KAAKC,QAAQO,QAAU,SAAUL,EAAK/B,EAAOgC,GAC7C,GAAIC,GAAO/F,EAAE6F,GACTG,GAAYD,EAAK5E,KAAK,WAAa4E,EAAK7F,QAAQiC,WAAW8D,aAC/D,OAAOD,GAASnC,WAAWiC,EAAK,GAAGG,gBAIrCjG,EAAE0F,KAAKC,QAAQQ,WAAa,SAAUN,EAAK/B,EAAOgC,GAChD,GAAIC,GAAO/F,EAAE6F,GACTG,GAAYD,EAAK5E,KAAK,WAAa4E,EAAK5E,KAAK,mBAAqB4E,EAAK7F,QAAQiC,WAAW8D,aAC9F,OAAOD,GAAS9D,SAAS4D,EAAK,GAAGG,gBAInCjG,EAAE0F,KAAKC,QAAQS,SAAW,SAAUP,EAAK/B,EAAOgC,GAC9C,GAAIC,GAAO/F,EAAE6F,GACTG,GAAYD,EAAK5E,KAAK,WAAa4E,EAAK5E,KAAK,mBAAqB4E,EAAK7F,QAAQiC,WAAW8D,aAC9F,OAAOD,GAASnC,WAAWiC,EAAK,GAAGG,eAiCrC,IAAII,IACFC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,SACLC,IAAK,UAGHC,GACFC,QAAS,IACTC,OAAQ,IACRC,OAAQ,IACRC,SAAU,IACVC,SAAU,IACVC,SAAU,KAIRC,EAAgB,SAASC,GAC3B,GAAIC,GAAU,SAASC,GACrB,MAAOF,GAAIE,IAGTC,EAAS,MAAQhF,OAAOyB,KAAKoD,GAAKI,KAAK,KAAO,IAC9CC,EAAaC,OAAOH,GACpBI,EAAgBD,OAAOH,EAAQ,IACnC,OAAO,UAAS1E,GAEd,MADAA,GAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7B4E,EAAWG,KAAK/E,GAAUA,EAAOtC,QAAQoH,EAAeN,GAAWxE,IAI1EgF,EAAaV,EAAcd,GAC3ByB,EAAeX,EAAcP,GAE7BnF,EAAe,SAAUsG,EAAS3G,GAE/BiD,EAASC,aACZtE,EAAEqE,SAASG,OAAOC,IAAMJ,EAASE,KACjCF,EAASC,YAAa,GAGxBxE,KAAKkI,SAAWhI,EAAE+H,GAClBjI,KAAKmI,YAAc,KACnBnI,KAAKoI,QAAU,KACfpI,KAAKqI,MAAQ,KACbrI,KAAKsI,KAAO,KACZtI,KAAKsB,QAAUA,EAIY,OAAvBtB,KAAKsB,QAAQiH,QACfvI,KAAKsB,QAAQiH,MAAQvI,KAAKkI,SAASM,KAAK,SAI1C,IAAIC,GAASzI,KAAKsB,QAAQoH,aACJ,iBAAXD,KACTzI,KAAKsB,QAAQoH,eAAiBD,EAAQA,EAAQA,EAAQA,IAIxDzI,KAAK2I,IAAMhH,EAAaQ,UAAUwG,IAClC3I,KAAK4I,OAASjH,EAAaQ,UAAUyG,OACrC5I,KAAK6I,QAAUlH,EAAaQ,UAAU0G,QACtC7I,KAAK8I,SAAWnH,EAAaQ,UAAU2G,SACvC9I,KAAK+I,UAAYpH,EAAaQ,UAAU4G,UACxC/I,KAAKgJ,YAAcrH,EAAaQ,UAAU6G,YAC1ChJ,KAAKiJ,QAAUtH,EAAaQ,UAAU8G,QACtCjJ,KAAKkJ,OAASvH,EAAaQ,UAAU+G,OACrClJ,KAAKmJ,KAAOxH,EAAaQ,UAAUgH,KACnCnJ,KAAKoJ,KAAOzH,EAAaQ,UAAUiH,KAEnCpJ,KAAKqJ,OAGP1H,GAAa2H,QAAU,SAGvB3H,EAAaC,UACX2H,iBAAkB,mBAClBC,gBAAiB,yBACjBC,kBAAmB,SAAUC,EAAaC,GACxC,MAAuB,IAAfD,EAAoB,oBAAsB,sBAEpDE,eAAgB,SAAUC,EAAQC,GAChC,OACa,GAAVD,EAAe,+BAAiC,gCACpC,GAAZC,EAAiB,qCAAuC,wCAG7DC,cAAe,aACfC,gBAAiB,eACjBC,YAAY,EACZC,eAAgB,QAChBC,kBAAmB,KACnBC,UAAW,MACXC,MAAO,cACPC,KAAM,OACN/B,MAAO,KACPgC,mBAAoB,SACpBC,OAAO,EACPC,WAAW,EACXC,cAAc,EACdC,aAAa,EACbC,UAAU,EACVC,aAAa,EACbC,YAAY,EACZC,QAAQ,EACRC,YAAY,EACZC,sBAAuB,KACvBC,qBAAqB,EACrBC,gBAAiB,WACjBC,YAAY,EACZC,SAAU,YACVC,SAAU,eACVC,UAAU,EACVvJ,UACEwJ,MAAO,+BAETC,YAAY,EACZC,QAAQ,EACRC,aAAa,EACbC,oBAAoB,EACpBlD,cAAe,GAGjB/G,EAAaQ,WAEX0J,YAAalK,EAEb0H,KAAM,WACJ,GAAIyC,GAAO9L,KACP+L,EAAK/L,KAAKkI,SAASM,KAAK,KAE5BxI,MAAKkI,SAAS8D,SAAS,oBAIvBhM,KAAKiM,SACLjM,KAAKkM,SAAWlM,KAAKkI,SAASiE,KAAK,YACnCnM,KAAKoM,UAAYpM,KAAKkI,SAASiE,KAAK,aACpCnM,KAAKmI,YAAcnI,KAAKqM,aACxBrM,KAAKkI,SACFoE,MAAMtM,KAAKmI,aACXoE,SAASvM,KAAKmI,aACjBnI,KAAKoI,QAAUpI,KAAKmI,YAAYqE,SAAS,UACzCxM,KAAKqI,MAAQrI,KAAKmI,YAAYqE,SAAS,kBACvCxM,KAAKyM,WAAazM,KAAKqI,MAAMmE,SAAS,UACtCxM,KAAK0M,WAAa1M,KAAKqI,MAAMsE,KAAK,SAElC3M,KAAKkI,SAAS0E,YAAY,oBAEtB5M,KAAKsB,QAAQsK,sBAAuB,GAAM5L,KAAKqI,MAAM2D,SAAS,uBAEhD,mBAAPD,KACT/L,KAAKoI,QAAQI,KAAK,UAAWuD,GAC7B7L,EAAE,cAAgB6L,EAAK,MAAMc,MAAM,SAAUC,GAC3CA,EAAEC,iBACFjB,EAAK1D,QAAQ4E,WAIjBhN,KAAKiN,gBACLjN,KAAKkN,gBACDlN,KAAKsB,QAAQ0J,YAAYhL,KAAKmN,qBAClCnN,KAAK4I,SACL5I,KAAK8I,WACL9I,KAAKoN,WACDpN,KAAKsB,QAAQmJ,WAAWzK,KAAKqN,iBACjCrN,KAAKqI,MAAMhH,KAAK,OAAQrB,MACxBA,KAAKmI,YAAY9G,KAAK,OAAQrB,MAC1BA,KAAKsB,QAAQoK,QAAQ1L,KAAK0L,SAE9B1L,KAAKmI,YAAYmF,IACfC,mBAAoB,SAAUT,GAC5BhB,EAAKW,WAAWjE,KAAK,iBAAiB,GACtCsD,EAAK5D,SAASvC,QAAQ,iBAAkBmH,IAE1CU,qBAAsB,SAAUV,GAC9BhB,EAAK5D,SAASvC,QAAQ,mBAAoBmH,IAE5CW,mBAAoB,SAAUX,GAC5BhB,EAAKW,WAAWjE,KAAK,iBAAiB,GACtCsD,EAAK5D,SAASvC,QAAQ,iBAAkBmH,IAE1CY,oBAAqB,SAAUZ,GAC7BhB,EAAK5D,SAASvC,QAAQ,kBAAmBmH,MAIzChB,EAAK5D,SAAS,GAAGyF,aAAa,aAChC3N,KAAKkI,SAASoF,GAAG,UAAW,WAC1BxB,EAAK1D,QACF4D,SAAS,cACTgB,QAEHlB,EAAK5D,SAASoF,IACZM,kBAAmB,WACjB9B,EAAK1D,QAAQ4E,QACblB,EAAK5D,SAAS2F,IAAI,oBAEpBC,kBAAmB,WACjBhC,EAAK5D,SACFS,IAAImD,EAAK5D,SAASS,OAClBkF,IAAI,oBAETE,qBAAsB,WAEhB/N,KAAKgO,SAASC,OAAOnC,EAAK1D,QAAQwE,YAAY,cAClDd,EAAK5D,SAAS2F,IAAI,2BAM1BK,WAAW,WACTpC,EAAK5D,SAASvC,QAAQ,uBAI1BwI,eAAgB,WAGd,GAAI5C,GAAYvL,KAAKkM,UAAYlM,KAAKsB,QAAQiK,SAAY,aAAe,GACrE6C,EAAapO,KAAKkI,SAASmG,SAASC,SAAS,eAAiB,mBAAqB,GACnFlC,EAAYpM,KAAKoM,UAAY,aAAe,GAE5CrB,EAAS/K,KAAKsB,QAAQyJ,OAAS,qGAAuG/K,KAAKsB,QAAQyJ,OAAS,SAAW,GACvKwD,EAAYvO,KAAKsB,QAAQ0J,WAC7B,wFAEC,OAAShL,KAAKsB,QAAQ2J,sBAAwB,GAAK,iBAAmBlD,EAAW/H,KAAKsB,QAAQ2J,uBAAyB,KAAO,6CAEzH,GACFuD,EAAaxO,KAAKkM,UAAYlM,KAAKsB,QAAQ8J,WAC/C,oJAGApL,KAAKsB,QAAQyI,cACb,sFAEA/J,KAAKsB,QAAQ0I,gBACb,wBAGM,GACFyE,EAAazO,KAAKkM,UAAYlM,KAAKsB,QAAQ2I,WAC/C,oHAGAjK,KAAKsB,QAAQ4I,eACb,wBAGM,GACFwE,EACA,yCAA2CnD,EAAW6C,EAAa,kCACjCpO,KAAKsB,QAAQ8I,UAAY,2CAA6CgC,EAAY,4FAGpHpM,KAAKsB,QAAQU,SAASwJ,MACtB,mEAGAT,EACAwD,EACAC,EACA,6EAEAC,EACA,cAGJ,OAAOvO,GAAEwO,IAGXrC,WAAY,WACV,GAAIsC,GAAQ3O,KAAKmO,iBACbS,EAAK5O,KAAK6O,UAGd,OADAF,GAAMhC,KAAK,MAAM,GAAGmC,UAAYF,EACzBD,GAGTI,SAAU,WAER,GAAIH,GAAK5O,KAAK6O,UACd7O,MAAKyM,WAAW,GAAGqC,UAAYF,GAGjCC,SAAU,WACR,GAAI/C,GAAO9L,KACPgP,KACAC,EAAQ,EACRC,EAAc7J,SAAS8J,cAAc,UACrCC,GAAU,EAUVC,EAAa,SAAUC,EAAStL,EAAOuL,EAASC,GAClD,MAAO,OACkB,mBAAZD,GAA0B,KAAOA,EAAW,WAAaA,EAAU,IAAM,KAC/D,mBAAVvL,GAAwB,OAASA,EAAS,yBAA2BA,EAAQ,IAAM,KACtE,mBAAbwL,GAA2B,OAASA,EAAY,kBAAoBA,EAAW,IAAM,IAC9F,IAAMF,EAAU,SAUlBG,EAAY,SAAUrP,EAAMmP,EAASG,EAAQC,GAC/C,MAAO,mBACiB,mBAAZJ,GAA0B,WAAaA,EAAU,IAAM,KAC9DG,EAAS,WAAaA,EAAS,IAAM,KACrC5D,EAAKxK,QAAQ4J,oBAAsB,0BAA4B/K,EAAgB4H,EAAW7H,EAAEE,GAAMwP,SAAW,IAAM,KACjG,mBAAXD,IAAqC,OAAXA,EAAkB,iBAAmBA,EAAS,IAAM,IACtF,kBAAoBvP,EACpB,gBAAkB0L,EAAKxK,QAAQ+J,SAAW,IAAMS,EAAKxK,QAAQgK,SAAW,2BAI9E,IAAItL,KAAKsB,QAAQiH,QAAUvI,KAAKkM,WAG9BkD,KAEKpP,KAAKkI,SAASyE,KAAK,oBAAoBzJ,QAAQ,CAElD,GAAI+E,GAAUjI,KAAKkI,SAAS,EAC5BgH,GAAYW,UAAY,kBACxBX,EAAYJ,UAAY9O,KAAKsB,QAAQiH,MACrC2G,EAAYjO,MAAQ,GACpBgH,EAAQ6H,aAAaZ,EAAajH,EAAQ8H,WAI1C,IAAIC,GAAO9P,EAAE+H,EAAQ3G,QAAQ2G,EAAQgI,eACP3M,UAA1B0M,EAAKxH,KAAK,aAAgElF,SAAnCtD,KAAKkI,SAAS7G,KAAK,cAC5D6N,EAAYgB,UAAW,GA4H7B,MAvHAlQ,MAAKkI,SAASyE,KAAK,UAAUnM,KAAK,SAAUwD,GAC1C,GAAI7C,GAAQjB,EAAEF,KAId,IAFAoP,KAEIjO,EAAMmN,SAAS,mBAAnB,CAGA,GAAI6B,GAAcnQ,KAAK6P,WAAa,GAChCH,EAAS1P,KAAKqK,MAAM+F,QACpBhQ,EAAOe,EAAME,KAAK,WAAaF,EAAME,KAAK,WAAaF,EAAMyO,OAC7DD,EAASxO,EAAME,KAAK,UAAYF,EAAME,KAAK,UAAY,KACvDgP,EAA2C,mBAA1BlP,GAAME,KAAK,WAA6B,6BAA+BF,EAAME,KAAK,WAAa,WAAa,GAC7HiP,EAAqC,mBAAvBnP,GAAME,KAAK,QAA0B,gBAAkByK,EAAKxK,QAAQ+J,SAAW,IAAMlK,EAAME,KAAK,QAAU,aAAe,GACvIkP,EAAUpP,EAAMkN,SAChBmC,EAAoC,aAAvBD,EAAQ,GAAGE,QACxBC,EAAqBF,GAAcD,EAAQ,GAAGI,SAC9CC,EAAa5Q,KAAK2Q,UAAYD,CAMlC,IAJa,KAATJ,GAAeM,IACjBN,EAAO,SAAWA,EAAO,WAGvBxE,EAAKxK,QAAQoJ,eAAiBkG,IAAeJ,GAAcE,GAE7D,WADAtB,IASF,IALKjO,EAAME,KAAK,aAEdjB,EAAOkQ,EAAO,sBAAwBlQ,EAAOiQ,EAAU,WAGrDG,GAAcrP,EAAME,KAAK,cAAe,EAAM,CAChD,GAAIyK,EAAKxK,QAAQoJ,cAAgBkG,EAAY,CAC3C,GAA2CtN,SAAvCiN,EAAQlP,KAAK,sBAAqC,CACpD,GAAIwP,GAAWN,EAAQ/D,UACvB+D,GAAQlP,KAAK,qBAAsBwP,EAASC,OAAO,aAAa5N,SAAW2N,EAAS3N,QAGtF,GAAIqN,EAAQlP,KAAK,sBAEf,WADA+N,KAKJ,GAAI2B,GAAgB,IAAMR,EAAQ,GAAGV,WAAa,EAElD,IAAsB,IAAlB1O,EAAM6C,QAAe,CACvBiL,GAAS,CAGT,IAAI+B,GAAQT,EAAQ,GAAGS,MACnBC,EAAkD,mBAA5BV,GAAQlP,KAAK,WAA6B,6BAA+BkP,EAAQlP,KAAK,WAAa,WAAa,GACtI6P,EAAYX,EAAQlP,KAAK,QAAU,gBAAkByK,EAAKxK,QAAQ+J,SAAW,IAAMkF,EAAQlP,KAAK,QAAU,aAAe,EAE7H2P,GAAQE,EAAY,sBAAwBnJ,EAAWiJ,GAASC,EAAe,UAEjE,IAAVjN,GAAegL,EAAI9L,OAAS,IAC9BkM,IACAJ,EAAI1K,KAAK+K,EAAW,GAAI,KAAM,UAAWJ,EAAQ,SAEnDG,IACAJ,EAAI1K,KAAK+K,EAAW2B,EAAO,KAAM,kBAAoBD,EAAe9B,IAGtE,GAAInD,EAAKxK,QAAQoJ,cAAgBkG,EAE/B,WADAxB,IAIFJ,GAAI1K,KAAK+K,EAAWI,EAAUrP,EAAM,OAAS+P,EAAcY,EAAerB,EAAQC,GAAS3L,EAAO,GAAIiL,QACjG,IAAI9N,EAAME,KAAK,cAAe,EACnC2N,EAAI1K,KAAK+K,EAAW,GAAIrL,EAAO,gBAC1B,IAAI7C,EAAME,KAAK,aAAc,EAClC2N,EAAI1K,KAAK+K,EAAWI,EAAUrP,EAAM+P,EAAaT,EAAQC,GAAS3L,EAAO,yBACpE,CACL,GAAImN,GAAcnR,KAAKoR,wBAAkE,aAAxCpR,KAAKoR,uBAAuBX,OAG7E,KAAKU,GAAerF,EAAKxK,QAAQoJ,aAI/B,IAAK,GAFD2G,GAAQnR,EAAEF,MAAMsR,UAEX/P,EAAI,EAAGA,EAAI8P,EAAMnO,OAAQ3B,IAEhC,GAAyB,aAArB8P,EAAM9P,GAAGkP,QAAwB,CAKnC,IAAK,GAJDc,GAAmB,EAIdC,EAAI,EAAGA,EAAIjQ,EAAGiQ,IAAK,CAC1B,GAAIC,GAAaJ,EAAMG,IACnBC,EAAWd,UAAYzQ,EAAEuR,GAAYpQ,KAAK,aAAc,IAAMkQ,IAIhEA,IAAqBhQ,IAAG4P,GAAc,EAE1C,OAKFA,IACF/B,IACAJ,EAAI1K,KAAK+K,EAAW,GAAI,KAAM,UAAWJ,EAAQ,SAEnDD,EAAI1K,KAAK+K,EAAWI,EAAUrP,EAAM+P,EAAaT,EAAQC,GAAS3L,IAGpE8H,EAAKG,MAAMjI,GAASoL,KAIjBpP,KAAKkM,UAA6D,IAAjDlM,KAAKkI,SAASyE,KAAK,mBAAmBzJ,QAAiBlD,KAAKsB,QAAQiH,OACxFvI,KAAKkI,SAASyE,KAAK,UAAU+E,GAAG,GAAGvF,KAAK,YAAY,GAAM3D,KAAK,WAAY,YAGtEwG,EAAItH,KAAK,KAGlBiK,QAAS,WAEP,MADiB,OAAb3R,KAAKsI,OAActI,KAAKsI,KAAOtI,KAAKqI,MAAMsE,KAAK,OAC5C3M,KAAKsI,MAMdM,OAAQ,SAAUgJ,GAChB,GACIC,GADA/F,EAAO9L,IAIP4R,MAAa,GACf5R,KAAKkI,SAASyE,KAAK,UAAUnM,KAAK,SAAUwD,GAC1C,GAAIsE,GAAOwD,EAAK6F,UAAUD,GAAG5F,EAAKG,MAAMjI,GAExC8H,GAAKgG,YAAY9N,EAAOhE,KAAK2Q,UAAwC,aAA5B3Q,KAAK+R,WAAWtB,SAA0BzQ,KAAK+R,WAAWpB,SAAUrI,GAC7GwD,EAAKkG,YAAYhO,EAAOhE,KAAKkQ,SAAU5H,KAI3CtI,KAAKiS,oBAELjS,KAAKkS,UAEL,IAAIC,GAAgBnS,KAAKkI,SAASyE,KAAK,UAAUrF,IAAI,WACnD,GAAItH,KAAKkQ,SAAU,CACjB,GAAIpE,EAAKxK,QAAQoJ,eAAiB1K,KAAK2Q,UAAwC,aAA5B3Q,KAAK+R,WAAWtB,SAA0BzQ,KAAK+R,WAAWpB,UAAW,MAExH,IAEIN,GAFAlP,EAAQjB,EAAEF,MACVsQ,EAAOnP,EAAME,KAAK,SAAWyK,EAAKxK,QAAQsJ,SAAW,aAAekB,EAAKxK,QAAQ+J,SAAW,IAAMlK,EAAME,KAAK,QAAU,UAAY,EAQvI,OAJEgP,GADEvE,EAAKxK,QAAQqJ,aAAexJ,EAAME,KAAK,aAAeyK,EAAKI,SACnD,8BAAgC/K,EAAME,KAAK,WAAa,WAExD,GAEuB,mBAAxBF,GAAMqH,KAAK,SACbrH,EAAMqH,KAAK,SACTrH,EAAME,KAAK,YAAcyK,EAAKxK,QAAQuJ,YACxC1J,EAAME,KAAK,WAAWgB,WAEtBiO,EAAOnP,EAAMyO,OAASS,KAGhC+B,UAIC7J,EAASvI,KAAKkM,SAA8BiG,EAAczK,KAAK1H,KAAKsB,QAAQ6I,mBAAnDgI,EAAc,EAG3C,IAAInS,KAAKkM,UAAYlM,KAAKsB,QAAQiJ,mBAAmB3H,QAAQ,UAAW,EAAI,CAC1E,GAAIgB,GAAM5D,KAAKsB,QAAQiJ,mBAAmB8H,MAAM,IAChD,IAAKzO,EAAIV,OAAS,GAAKiP,EAAcjP,OAASU,EAAI,IAAsB,GAAdA,EAAIV,QAAeiP,EAAcjP,QAAU,EAAI,CACvG2O,EAAc7R,KAAKsB,QAAQoJ,aAAe,eAAiB,EAC3D,IAAI4H,GAAatS,KAAKkI,SAASyE,KAAK,UAAU4F,IAAI,8CAAgDV,GAAa3O,OAC3GsP,EAAsD,kBAAnCxS,MAAKsB,QAAQmI,kBAAoCzJ,KAAKsB,QAAQmI,kBAAkB0I,EAAcjP,OAAQoP,GAActS,KAAKsB,QAAQmI,iBACxJlB,GAAQiK,EAAS/R,QAAQ,MAAO0R,EAAcjP,OAAOb,YAAY5B,QAAQ,MAAO6R,EAAWjQ,aAIrEiB,QAAtBtD,KAAKsB,QAAQiH,QACfvI,KAAKsB,QAAQiH,MAAQvI,KAAKkI,SAASM,KAAK,UAGH,UAAnCxI,KAAKsB,QAAQiJ,qBACfhC,EAAQvI,KAAKsB,QAAQiH,OAIlBA,IACHA,EAAsC,mBAAvBvI,MAAKsB,QAAQiH,MAAwBvI,KAAKsB,QAAQiH,MAAQvI,KAAKsB,QAAQiI,kBAIxFvJ,KAAKoI,QAAQI,KAAK,QAASR,EAAa9H,EAAEuS,KAAKlK,EAAM9H,QAAQ,YAAa,OAC1ET,KAAKoI,QAAQoE,SAAS,kBAAkBoD,KAAKrH,GAE7CvI,KAAKkI,SAASvC,QAAQ,uBAOxBmD,SAAU,SAAUuB,EAAOqI,GACrB1S,KAAKkI,SAASM,KAAK,UACrBxI,KAAKmI,YAAY6D,SAAShM,KAAKkI,SAASM,KAAK,SAAS/H,QAAQ,+DAAgE,IAGhI,IAAIkS,GAActI,EAAQA,EAAQrK,KAAKsB,QAAQ+I,KAEjC,QAAVqI,EACF1S,KAAKoI,QAAQ4D,SAAS2G,GACH,UAAVD,EACT1S,KAAKoI,QAAQwE,YAAY+F,IAEzB3S,KAAKoI,QAAQwE,YAAY5M,KAAKsB,QAAQ+I,OACtCrK,KAAKoI,QAAQ4D,SAAS2G,KAI1BC,SAAU,SAAU/J,GAClB,GAAKA,GAAY7I,KAAKsB,QAAQgJ,QAAS,IAAStK,KAAK6S,SAArD,CAEA,GAAIC,GAAazN,SAAS8J,cAAc,OACpC4D,EAAO1N,SAAS8J,cAAc,OAC9B6D,EAAY3N,SAAS8J,cAAc,MACnC8D,EAAU5N,SAAS8J,cAAc,MACjCP,EAAKvJ,SAAS8J,cAAc,MAC5B+D,EAAI7N,SAAS8J,cAAc,KAC3B/O,EAAOiF,SAAS8J,cAAc,QAC9BpE,EAAS/K,KAAKsB,QAAQyJ,QAAU/K,KAAKqI,MAAMsE,KAAK,kBAAkBzJ,OAAS,EAAIlD,KAAKqI,MAAMsE,KAAK,kBAAkB,GAAGwG,WAAU,GAAQ,KACtItQ,EAAS7C,KAAKsB,QAAQ0J,WAAa3F,SAAS8J,cAAc,OAAS,KACnEiE,EAAUpT,KAAKsB,QAAQ8J,YAAcpL,KAAKkM,UAAYlM,KAAKqI,MAAMsE,KAAK,kBAAkBzJ,OAAS,EAAIlD,KAAKqI,MAAMsE,KAAK,kBAAkB,GAAGwG,WAAU,GAAQ,KAC5JlJ,EAAajK,KAAKsB,QAAQ2I,YAAcjK,KAAKkM,UAAYlM,KAAKqI,MAAMsE,KAAK,kBAAkBzJ,OAAS,EAAIlD,KAAKqI,MAAMsE,KAAK,kBAAkB,GAAGwG,WAAU,GAAQ,IAcnK,IAZA/S,EAAKyP,UAAY,OACjBiD,EAAWjD,UAAY7P,KAAKqI,MAAM,GAAG0J,WAAWlC,UAAY,QAC5DkD,EAAKlD,UAAY,qBACjBmD,EAAUnD,UAAY,sBACtBoD,EAAQpD,UAAY,UAEpBzP,EAAKiT,YAAYhO,SAASiO,eAAe,eACzCJ,EAAEG,YAAYjT,GACdwO,EAAGyE,YAAYH,GACfF,EAAUK,YAAYzE,GACtBoE,EAAUK,YAAYJ,GAClBlI,GAAQgI,EAAKM,YAAYtI,GACzBlI,EAAQ,CACV,GAAI0Q,GAAQlO,SAAS8J,cAAc,QACnCtM,GAAOgN,UAAY,eACnB0D,EAAM1D,UAAY,eAClBhN,EAAOwQ,YAAYE,GACnBR,EAAKM,YAAYxQ,GAEfuQ,GAASL,EAAKM,YAAYD,GAC9BL,EAAKM,YAAYL,GACb/I,GAAY8I,EAAKM,YAAYpJ,GACjC6I,EAAWO,YAAYN,GAEvB1N,SAASmO,KAAKH,YAAYP,EAE1B,IAAIF,GAAWM,EAAEO,aACbC,EAAe3I,EAASA,EAAO0I,aAAe,EAC9CE,EAAe9Q,EAASA,EAAO4Q,aAAe,EAC9CG,EAAgBR,EAAUA,EAAQK,aAAe,EACjDI,EAAmB5J,EAAaA,EAAWwJ,aAAe,EAC1DK,EAAgB5T,EAAE+S,GAASc,aAAY,GAEvCC,EAAwC,kBAArBC,mBAAkCA,iBAAiBlB,GACtE1K,EAAQ2L,EAAY,KAAO9T,EAAE6S,GAC7BmB,GACEC,KAAMC,SAASJ,EAAYA,EAAUK,WAAahM,EAAMiM,IAAI,eACtDF,SAASJ,EAAYA,EAAUO,cAAgBlM,EAAMiM,IAAI,kBACzDF,SAASJ,EAAYA,EAAUQ,eAAiBnM,EAAMiM,IAAI,mBAC1DF,SAASJ,EAAYA,EAAUS,kBAAoBpM,EAAMiM,IAAI,sBACnEI,MAAON,SAASJ,EAAYA,EAAUW,YAActM,EAAMiM,IAAI,gBACxDF,SAASJ,EAAYA,EAAUY,aAAevM,EAAMiM,IAAI,iBACxDF,SAASJ,EAAYA,EAAUa,gBAAkBxM,EAAMiM,IAAI,oBAC3DF,SAASJ,EAAYA,EAAUc,iBAAmBzM,EAAMiM,IAAI,sBAEpES,GACEZ,KAAMD,EAAYC,KACZC,SAASJ,EAAYA,EAAUgB,UAAY3M,EAAMiM,IAAI,cACrDF,SAASJ,EAAYA,EAAUiB,aAAe5M,EAAMiM,IAAI,iBAAmB,EACjFI,MAAOR,EAAYQ,MACbN,SAASJ,EAAYA,EAAUkB,WAAa7M,EAAMiM,IAAI,eACtDF,SAASJ,EAAYA,EAAUmB,YAAc9M,EAAMiM,IAAI,gBAAkB,EAGrFjP,UAASmO,KAAK4B,YAAYtC,GAE1B9S,KAAK6S,UACHD,SAAUA,EACVc,aAAcA,EACdC,aAAcA,EACdC,cAAeA,EACfC,iBAAkBA,EAClBC,cAAeA,EACfI,YAAaA,EACba,WAAYA,KAIhBM,QAAS,WAKP,GAJArV,KAAK2R,UACL3R,KAAK4S,WAED5S,KAAKsB,QAAQyJ,QAAQ/K,KAAKqI,MAAMiM,IAAI,cAAe,GACnDtU,KAAKsB,QAAQgJ,QAAS,EAA1B,CAEA,GAeIgL,GACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAtBA/J,EAAO9L,KACPqI,EAAQrI,KAAKqI,MACboE,EAAazM,KAAKyM,WAClBqJ,EAAU5V,EAAE6V,QACZC,EAAehW,KAAKmI,YAAY,GAAGsL,aACnCwC,EAAcjW,KAAKmI,YAAY,GAAG+N,YAClCtD,EAAW5S,KAAK6S,SAAmB,SACnCa,EAAe1T,KAAK6S,SAAuB,aAC3Cc,EAAe3T,KAAK6S,SAAuB,aAC3Ce,EAAgB5T,KAAK6S,SAAwB,cAC7CgB,EAAmB7T,KAAK6S,SAA2B,iBACnDsD,EAAYnW,KAAK6S,SAAwB,cACzCqB,EAAclU,KAAK6S,SAAsB,YACzCkC,EAAa/U,KAAK6S,SAAqB,WACvChB,EAAc7R,KAAKsB,QAAQoJ,aAAe,YAAc,GASxD0L,EAAS,WACP,GAEIC,GAFA9S,EAAMuI,EAAK3D,YAAYmO,SACvBC,EAAarW,EAAE4L,EAAKxK,QAAQmJ,UAG5BqB,GAAKxK,QAAQmJ,YAAc8L,EAAWnV,GAAG,SAC3CiV,EAAeE,EAAWD,SAC1BD,EAAaG,KAAOpC,SAASmC,EAAWjC,IAAI,mBAC5C+B,EAAaI,MAAQrC,SAASmC,EAAWjC,IAAI,qBAE7C+B,GAAiBG,IAAK,EAAGC,KAAM,EAGjC,IAAIhO,GAASqD,EAAKxK,QAAQoH,aAC1BgN,GAAkBnS,EAAIiT,IAAMH,EAAaG,IAAMV,EAAQY,YACvDf,EAAkBG,EAAQa,SAAWjB,EAAkBM,EAAeK,EAAaG,IAAM/N,EAAO,GAChGmN,EAAmBrS,EAAIkT,KAAOJ,EAAaI,KAAOX,EAAQc,aAC1Df,EAAoBC,EAAQtL,QAAUoL,EAAmBK,EAAcI,EAAaI,KAAOhO,EAAO,GAClGiN,GAAmBjN,EAAO,GAC1BmN,GAAoBnN,EAAO,GAKjC,IAFA2N,IAE0B,SAAtBpW,KAAKsB,QAAQgJ,KAAiB,CAChC,GAAIuM,GAAU,WACZ,GAAIC,GACAxI,EAAW,SAAUuB,EAAWkH,GAC9B,MAAO,UAAU9O,GACb,MAAI8O,GACQ9O,EAAQ+O,UAAY/O,EAAQ+O,UAAUC,SAASpH,GAAa3P,EAAE+H,GAASqG,SAASuB,KAE/E5H,EAAQ+O,UAAY/O,EAAQ+O,UAAUC,SAASpH,GAAa3P,EAAE+H,GAASqG,SAASuB,MAInGqH,EAAMpL,EAAKW,WAAW,GAAG0K,qBAAqB,MAC9CC,EAAaC,MAAMlV,UAAU2O,OAASuG,MAAMlV,UAAU2O,OAAO9N,KAAKkU,EAAK5I,EAAS,UAAU,IAAUxC,EAAKxD,KAAKiK,IAAI,WAClH+E,EAAWD,MAAMlV,UAAU2O,OAASuG,MAAMlV,UAAU2O,OAAO9N,KAAKoU,EAAY9I,EAAS,mBAAmB,IAAS8I,EAAWtG,OAAO,mBAEvIsF,KACAd,EAAaK,EAAkBZ,EAAWZ,KAC1CoB,EAAYM,EAAoBd,EAAWL,MAEvC5I,EAAKxK,QAAQmJ,WACVpC,EAAMhH,KAAK,WAAWgH,EAAMhH,KAAK,SAAUgH,EAAMsO,UACtDnB,EAAYnN,EAAMhH,KAAK,UAElBgH,EAAMhH,KAAK,UAAUgH,EAAMhH,KAAK,QAASgH,EAAMmC,SACpDiL,EAAWpN,EAAMhH,KAAK,WAEtBmU,EAAYnN,EAAMsO,SAClBlB,EAAWpN,EAAMmC,SAGfsB,EAAKxK,QAAQwJ,YACfgB,EAAK3D,YAAYoP,YAAY,SAAU7B,EAAkBC,GAAoBL,EAAaP,EAAWZ,KAAQqB,GAG3G1J,EAAK3D,YAAYmG,SAAS,YAC5BgH,EAAaI,EAAkBX,EAAWZ,MAGJ,SAApCrI,EAAKxK,QAAQsK,oBACfvD,EAAMkP,YAAY,sBAAuB3B,EAAmBC,GAAsBN,EAAYR,EAAWL,MAAUe,EAAWQ,GAI9Ha,EADGM,EAAWlU,OAASoU,EAASpU,OAAU,EACnB,EAAX0P,EAAemC,EAAWZ,KAAO,EAEjC,EAGd9L,EAAMiM,KACJkD,aAAclC,EAAa,KAC3BmC,SAAY,SACZC,aAAcZ,EAAYpD,EAAeC,EAAeC,EAAgBC,EAAmB,OAE7FpH,EAAW6H,KACTkD,aAAclC,EAAa5B,EAAeC,EAAeC,EAAgBC,EAAmBK,EAAYC,KAAO,KAC/GwD,aAAc,OACdD,aAAchU,KAAKE,IAAIkT,EAAY5C,EAAYC,KAAM,GAAK,OAG9D0C,KACA7W,KAAK0M,WAAWmB,IAAI,wCAAwCP,GAAG,uCAAwCuJ,GACvGf,EAAQjI,IAAI,iCAAiCP,GAAG,gCAAiCuJ,OAC5E,IAAI7W,KAAKsB,QAAQgJ,MAA6B,QAArBtK,KAAKsB,QAAQgJ,MAAkBtK,KAAKsI,KAAKiK,IAAIV,GAAa3O,OAASlD,KAAKsB,QAAQgJ,KAAM,CACpH,GAAIsN,GAAW5X,KAAKsI,KAAKiK,IAAI,YAAYA,IAAIV,GAAarF,WAAWqL,MAAM,EAAG7X,KAAKsB,QAAQgJ,MAAMwN,OAAOzJ,SAASrK,QAC7G+T,EAAY/X,KAAKsI,KAAKuP,MAAM,EAAGD,EAAW,GAAG9G,OAAO,YAAY5N,MACpEoS,GAAa1C,EAAW5S,KAAKsB,QAAQgJ,KAAOyN,EAAY5B,EAAYjC,EAAYC,KAE5ErI,EAAKxK,QAAQmJ,WACVpC,EAAMhH,KAAK,WAAWgH,EAAMhH,KAAK,SAAUgH,EAAMsO,UACtDnB,EAAYnN,EAAMhH,KAAK,WAEvBmU,EAAYnN,EAAMsO,SAGhB7K,EAAKxK,QAAQwJ,YAEf9K,KAAKmI,YAAYoP,YAAY,SAAU7B,EAAkBC,GAAoBL,EAAaP,EAAWZ,KAAQqB,GAE/GnN,EAAMiM,KACJkD,aAAclC,EAAa5B,EAAeC,EAAeC,EAAgBC,EAAmB,KAC5F4D,SAAY,SACZC,aAAc,KAEhBjL,EAAW6H,KACTkD,aAAclC,EAAapB,EAAYC,KAAO,KAC9CwD,aAAc,OACdD,aAAc,QAKpBtK,SAAU,WACR,GAA2B,SAAvBpN,KAAKsB,QAAQkJ,MAAkB,CACjCxK,KAAKqI,MAAMiM,IAAI,YAAa,IAG5B,IAAI0D,GAAehY,KAAKqI,MAAMgG,SAAS4J,QAAQ1L,SAAS,QACpD2L,EAAgBlY,KAAKsB,QAAQmJ,UAAYzK,KAAKmI,YAAY8P,QAAQ1L,SAAS,QAAUyL,EACrFG,EAAUH,EAAaxL,SAAS,kBAAkB4L,aAClDC,EAAWH,EAAc5D,IAAI,QAAS,QAAQ9H,SAAS,UAAU4L,YAErEJ,GAAa9O,SACbgP,EAAchP,SAGdlJ,KAAKmI,YAAYmM,IAAI,QAAS5Q,KAAKE,IAAIuU,EAASE,GAAY,UAC5B,QAAvBrY,KAAKsB,QAAQkJ,OAEtBxK,KAAKqI,MAAMiM,IAAI,YAAa,IAC5BtU,KAAKmI,YAAYmM,IAAI,QAAS,IAAItI,SAAS,cAClChM,KAAKsB,QAAQkJ,OAEtBxK,KAAKqI,MAAMiM,IAAI,YAAa,IAC5BtU,KAAKmI,YAAYmM,IAAI,QAAStU,KAAKsB,QAAQkJ,SAG3CxK,KAAKqI,MAAMiM,IAAI,YAAa,IAC5BtU,KAAKmI,YAAYmM,IAAI,QAAS,IAG5BtU,MAAKmI,YAAYmG,SAAS,cAAuC,QAAvBtO,KAAKsB,QAAQkJ,OACzDxK,KAAKmI,YAAYyE,YAAY,cAIjCS,eAAgB,WACdrN,KAAKsY,aAAepY,EAAE,+BAEtB,IAEIqD,GACA8S,EACAkC,EAJAzM,EAAO9L,KACPuW,EAAarW,EAAEF,KAAKsB,QAAQmJ,WAI5B+N,EAAe,SAAUtQ,GACvB4D,EAAKwM,aAAatM,SAAS9D,EAASM,KAAK,SAAS/H,QAAQ,2BAA4B,KAAK8W,YAAY,SAAUrP,EAASoG,SAAS,WACnI/K,EAAM2E,EAASoO,SAEVC,EAAWnV,GAAG,QAKjBiV,GAAiBG,IAAK,EAAGC,KAAM,IAJ/BJ,EAAeE,EAAWD,SAC1BD,EAAaG,KAAOpC,SAASmC,EAAWjC,IAAI,mBAAqBiC,EAAWG,YAC5EL,EAAaI,MAAQrC,SAASmC,EAAWjC,IAAI,oBAAsBiC,EAAWK,cAKhF2B,EAAerQ,EAASoG,SAAS,UAAY,EAAIpG,EAAS,GAAGuL,aAE7D3H,EAAKwM,aAAahE,KAChBkC,IAAOjT,EAAIiT,IAAMH,EAAaG,IAAM+B,EACpC9B,KAAQlT,EAAIkT,KAAOJ,EAAaI,KAChCjM,MAAStC,EAAS,GAAGgO,cAI7BlW,MAAKoI,QAAQkF,GAAG,QAAS,WACvB,GAAInM,GAAQjB,EAAEF,KAEV8L,GAAK8E,eAIT4H,EAAa1M,EAAK3D,aAElB2D,EAAKwM,aACF/L,SAAST,EAAKxK,QAAQmJ,WACtB8M,YAAY,QAASpW,EAAMmN,SAAS,SACpCmK,OAAO3M,EAAKzD,UAGjBnI,EAAE6V,QAAQzI,GAAG,gBAAiB,WAC5BkL,EAAa1M,EAAK3D,eAGpBnI,KAAKkI,SAASoF,GAAG,iBAAkB,WACjCxB,EAAKzD,MAAMhH,KAAK,SAAUyK,EAAKzD,MAAMsO,UACrC7K,EAAKwM,aAAaI,YAStB1G,YAAa,SAAUhO,EAAOkM,EAAU5H,GACjCA,IACHtI,KAAKiS,oBACL3J,EAAOtI,KAAK2R,UAAUD,GAAG1R,KAAKiM,MAAMjI,KAGtCsE,EAAKiP,YAAY,WAAYrH,GAAUvD,KAAK,KAAKnE,KAAK,gBAAiB0H,IAQzE4B,YAAa,SAAU9N,EAAO2M,EAAUrI,GACjCA,IACHA,EAAOtI,KAAK2R,UAAUD,GAAG1R,KAAKiM,MAAMjI,KAGlC2M,EACFrI,EAAK0D,SAAS,YAAYQ,SAAS,KAAKhE,KAAK,OAAQ,KAAKA,KAAK,YAAY,GAAIA,KAAK,iBAAiB,GAErGF,EAAKsE,YAAY,YAAYJ,SAAS,KAAKmM,WAAW,QAAQnQ,KAAK,WAAY,GAAGA,KAAK,iBAAiB,IAI5GoI,WAAY,WACV,MAAO5Q,MAAKkI,SAAS,GAAGyI,UAG1B1D,cAAe,WACb,GAAInB,GAAO9L,IAEPA,MAAK4Q,cACP5Q,KAAKmI,YAAY6D,SAAS,YAC1BhM,KAAKoI,QAAQ4D,SAAS,YAAYxD,KAAK,YAAY,GAAIA,KAAK,iBAAiB,KAEzExI,KAAKoI,QAAQkG,SAAS,cACxBtO,KAAKmI,YAAYyE,YAAY,YAC7B5M,KAAKoI,QAAQwE,YAAY,YAAYpE,KAAK,iBAAiB,IAGzDxI,KAAKoI,QAAQI,KAAK,cAAe,GAAOxI,KAAKkI,SAAS7G,KAAK,aAC7DrB,KAAKoI,QAAQuQ,WAAW,aAI5B3Y,KAAKoI,QAAQyE,MAAM,WACjB,OAAQf,EAAK8E,gBAIjBqB,kBAAmB,WACjB,GAAIhR,GAAQjB,KAAKkI,SAASS,KAC1B3I,MAAKoI,QAAQmP,YAAY,iBAA4B,OAAVtW,GAA4B,KAAVA,GAAiBA,EAAM4K,cAAgBwL,OAA0B,IAAjBpW,EAAMiC,SAGrHgP,SAAU,WACJlS,KAAKkI,SAAS7G,KAAK,cAAgBrB,KAAKkI,SAASM,KAAK,aACvDxI,KAAKkI,SAASM,KAAK,eAAgB,IAA0C,QAAnCxI,KAAKkI,SAASM,KAAK,cAC9DxI,KAAKkI,SAAS7G,KAAK,WAAYrB,KAAKkI,SAASM,KAAK,aAClDxI,KAAKoI,QAAQI,KAAK,WAAYxI,KAAKkI,SAAS7G,KAAK,cAGnDrB,KAAKkI,SAASM,KAAK,YAAY,KAGjC0E,cAAe,WACb,GAAIpB,GAAO9L,KACP4Y,EAAY1Y,EAAEmF,SAElBuT,GAAUvX,KAAK,eAAe,GAE9BrB,KAAKoI,QAAQkF,GAAG,QAAS,SAAUR,GAC7B,OAAOhF,KAAKgF,EAAE+L,QAAQxW,SAAS,MAAQuW,EAAUvX,KAAK,iBACtDyL,EAAEC,iBACF6L,EAAUvX,KAAK,eAAe,MAIpCrB,KAAKoI,QAAQkF,GAAG,QAAS,WACvBxB,EAAKuJ,YAGPrV,KAAKkI,SAASoF,GAAG,kBAAmB,WAClC,GAAKxB,EAAKxK,QAAQ0J,YAAec,EAAKI,UAE/B,IAAKJ,EAAKI,SAAU,CACzB,GAAI+D,GAAgBnE,EAAKG,MAAMH,EAAK5D,SAAS,GAAG+H,cAEhD,IAA6B,gBAAlBA,IAA8BnE,EAAKxK,QAAQgJ,QAAS,EAAO,MAGtE,IAAIgM,GAASxK,EAAKxD,KAAKoJ,GAAGzB,GAAe,GAAG6I,UAAYhN,EAAKW,WAAW,GAAGqM,SAC3ExC,GAASA,EAASxK,EAAKW,WAAW,GAAGgH,aAAa,EAAI3H,EAAK+G,SAASD,SAAS,EAC7E9G,EAAKW,WAAW,GAAGiK,UAAYJ,OAT/BxK,GAAKW,WAAWE,KAAK,eAAeK,UAaxChN,KAAKyM,WAAWa,GAAG,QAAS,OAAQ,SAAUR,GAC5C,GAAI3L,GAAQjB,EAAEF,MACV+Y,EAAe5X,EAAMkN,SAAShN,KAAK,iBACnC2X,EAAYlN,EAAK5D,SAASS,MAC1BsQ,EAAYnN,EAAK5D,SAASiE,KAAK,iBAC/B+M,GAAgB,CAUpB,IAPIpN,EAAKI,UAAwC,IAA5BJ,EAAKxK,QAAQmK,YAChCqB,EAAEqM,kBAGJrM,EAAEC,kBAGGjB,EAAK8E,eAAiBzP,EAAMkN,SAASC,SAAS,YAAa,CAC9D,GAAIuC,GAAW/E,EAAK5D,SAASyE,KAAK,UAC9ByM,EAAUvI,EAASa,GAAGqH,GACtBM,EAAQD,EAAQjN,KAAK,YACrBmN,EAAYF,EAAQ/K,OAAO,YAC3B5C,EAAaK,EAAKxK,QAAQmK,WAC1B8N,EAAgBD,EAAUjY,KAAK,gBAAiB,CAEpD,IAAKyK,EAAKI,UAUR,GAJAkN,EAAQjN,KAAK,YAAakN,GAC1BvN,EAAKkG,YAAY+G,GAAeM,GAChClY,EAAMqY,OAEF/N,KAAe,GAAS8N,KAAkB,EAAO,CACnD,GAAIE,GAAahO,EAAaoF,EAASC,OAAO,aAAa5N,OACvDwW,EAAgBH,EAAgBD,EAAU3M,KAAK,mBAAmBzJ,MAEtE,IAAKuI,GAAcgO,GAAgBF,GAAiBG,EAClD,GAAIjO,GAA4B,GAAdA,EAChBoF,EAAS1E,KAAK,YAAY,GAC1BiN,EAAQjN,KAAK,YAAY,GACzBL,EAAKW,WAAWE,KAAK,aAAaC,YAAY,YAC9Cd,EAAKkG,YAAY+G,GAAc,OAC1B,IAAIQ,GAAkC,GAAjBA,EAAoB,CAC9CD,EAAU3M,KAAK,mBAAmBR,KAAK,YAAY,GACnDiN,EAAQjN,KAAK,YAAY,EACzB,IAAIwN,GAAaxY,EAAMkN,SAAShN,KAAK,WACrCyK,GAAKW,WAAWE,KAAK,mBAAqBgN,EAAa,MAAM/M,YAAY,YACzEd,EAAKkG,YAAY+G,GAAc,OAC1B,CACL,GAAInP,GAAwD,gBAAhCkC,GAAKxK,QAAQsI,gBAA+BkC,EAAKxK,QAAQsI,eAAgBkC,EAAKxK,QAAQsI,gBAAkBkC,EAAKxK,QAAQsI,eAC7IgQ,EAA0C,kBAAnBhQ,GAAgCA,EAAe6B,EAAY8N,GAAiB3P,EACnGiQ,EAASD,EAAc,GAAGnZ,QAAQ,MAAOgL,GACzCqO,EAAYF,EAAc,GAAGnZ,QAAQ,MAAO8Y,GAC5CQ,EAAU7Z,EAAE,6BAGZ0Z,GAAc,KAChBC,EAASA,EAAOpZ,QAAQ,QAASmZ,EAAc,GAAGnO,EAAa,EAAI,EAAI,IACvEqO,EAAYA,EAAUrZ,QAAQ,QAASmZ,EAAc,GAAGL,EAAgB,EAAI,EAAI,KAGlFH,EAAQjN,KAAK,YAAY,GAEzBL,EAAKzD,MAAMoQ,OAAOsB,GAEdtO,GAAcgO,IAChBM,EAAQtB,OAAOvY,EAAE,QAAU2Z,EAAS,WACpCX,GAAgB,EAChBpN,EAAK5D,SAASvC,QAAQ,yBAGpB4T,GAAiBG,IACnBK,EAAQtB,OAAOvY,EAAE,QAAU4Z,EAAY,WACvCZ,GAAgB,EAChBpN,EAAK5D,SAASvC,QAAQ,4BAGxBuI,WAAW,WACTpC,EAAKkG,YAAY+G,GAAc,IAC9B,IAEHgB,EAAQC,MAAM,KAAKC,QAAQ,IAAK,WAC9B/Z,EAAEF,MAAMkJ,iBA3DhB2H,GAAS1E,KAAK,YAAY,GAC1BiN,EAAQjN,KAAK,YAAY,GACzBL,EAAKW,WAAWE,KAAK,aAAaC,YAAY,YAAYD,KAAK,KAAKnE,KAAK,iBAAiB,GAC1FsD,EAAKkG,YAAY+G,GAAc,IA+D5BjN,EAAKI,UAAaJ,EAAKI,UAAwC,IAA5BJ,EAAKxK,QAAQmK,WACnDK,EAAK1D,QAAQ4E,QACJlB,EAAKxK,QAAQ0J,YACtBc,EAAKY,WAAWM,QAIdkM,IACGF,GAAalN,EAAK5D,SAASS,OAASmD,EAAKI,UAAc+M,GAAanN,EAAK5D,SAASiE,KAAK,mBAAqBL,EAAKI,YAEpHrH,GAAqBkU,EAAcK,EAAQjN,KAAK,YAAakN,GAC7DvN,EAAK5D,SACFpD,cAAc,cAMzB9E,KAAKqI,MAAMiF,GAAG,QAAS,6DAA8D,SAAUR,GACzFA,EAAEoN,eAAiBla,OACrB8M,EAAEC,iBACFD,EAAEqM,kBACErN,EAAKxK,QAAQ0J,aAAe9K,EAAE4M,EAAEqN,QAAQ7L,SAAS,SACnDxC,EAAKY,WAAWM,QAEhBlB,EAAK1D,QAAQ4E,WAKnBhN,KAAKyM,WAAWa,GAAG,QAAS,6BAA8B,SAAUR,GAClEA,EAAEC,iBACFD,EAAEqM,kBACErN,EAAKxK,QAAQ0J,WACfc,EAAKY,WAAWM,QAEhBlB,EAAK1D,QAAQ4E,UAIjBhN,KAAKqI,MAAMiF,GAAG,QAAS,wBAAyB,WAC9CxB,EAAK1D,QAAQyE,UAGf7M,KAAK0M,WAAWY,GAAG,QAAS,SAAUR,GACpCA,EAAEqM,oBAGJnZ,KAAKqI,MAAMiF,GAAG,QAAS,eAAgB,SAAUR,GAC3ChB,EAAKxK,QAAQ0J,WACfc,EAAKY,WAAWM,QAEhBlB,EAAK1D,QAAQ4E,QAGfF,EAAEC,iBACFD,EAAEqM,kBAEEjZ,EAAEF,MAAMsO,SAAS,iBACnBxC,EAAK/C,YAEL+C,EAAK9C,gBAIThJ,KAAKkI,SAASkS,OAAO,WACnBtO,EAAKlD,QAAO,GACZkD,EAAK5D,SAASvC,QAAQ,oBAAqBd,GAC3CA,EAAoB,QAIxBsI,mBAAoB,WAClB,GAAIrB,GAAO9L,KACPqa,EAAcna,EAAE,+BAEpBF,MAAKoI,QAAQkF,GAAG,0BAA2B,WACzCxB,EAAKW,WAAWE,KAAK,WAAWC,YAAY,UACtCd,EAAKY,WAAW/D,QACpBmD,EAAKY,WAAW/D,IAAI,IACpBmD,EAAKxD,KAAKiK,IAAI,cAAc3F,YAAY,UAClCyN,EAAYhM,SAASnL,QAAQmX,EAAYnR,UAE5C4C,EAAKI,UAAUJ,EAAKW,WAAWE,KAAK,aAAaX,SAAS,UAC/DkC,WAAW,WACTpC,EAAKY,WAAWM,SACf,MAGLhN,KAAK0M,WAAWY,GAAG,6EAA8E,SAAUR,GACzGA,EAAEqM,oBAGJnZ,KAAK0M,WAAWY,GAAG,uBAAwB,WAKzC,GAJAxB,EAAKxD,KAAKiK,IAAI,cAAc3F,YAAY,UACxCd,EAAKxD,KAAKwI,OAAO,WAAWlE,YAAY,UACxCyN,EAAYnR,SAER4C,EAAKY,WAAW/D,MAAO,CACzB,GACI2R,GADAC,EAAczO,EAAKxD,KAAKiK,IAAI,yCAQhC,IALE+H,EADExO,EAAKxK,QAAQ4J,oBACFqP,EAAY5N,KAAK,KAAK4F,IAAI,KAAOzG,EAAK0O,eAAiB,KAAOra,EAAgB2L,EAAKY,WAAW/D,OAAS,MAEvG4R,EAAY5N,KAAK,KAAK4F,IAAI,IAAMzG,EAAK0O,eAAiB,KAAO1O,EAAKY,WAAW/D,MAAQ,MAGhG2R,EAAWpX,SAAWqX,EAAYrX,OACpCmX,EAAYzK,KAAK9D,EAAKxK,QAAQkI,gBAAgB/I,QAAQ,MAAO,IAAMsH,EAAW+D,EAAKY,WAAW/D,OAAS,MACvGmD,EAAKW,WAAWgM,OAAO4B,GACvBvO,EAAKxD,KAAK0D,SAAS,cACd,CACLsO,EAAWjM,SAASrC,SAAS,SAE7B,IACIyO,GADAC,EAAc5O,EAAKxD,KAAKiK,IAAI,UAIhCmI,GAAYla,KAAK,SAAUwD,GACzB,GAAI7C,GAAQjB,EAAEF,KAEVmB,GAAMmN,SAAS,WACChL,SAAdmX,EACFtZ,EAAM6K,SAAS,WAEXyO,GAAWA,EAAUzO,SAAS,UAClCyO,EAAYtZ,GAELA,EAAMmN,SAAS,oBAAsBoM,EAAYhJ,GAAG1N,EAAQ,GAAG3C,KAAK,cAAgBF,EAAME,KAAK,YACxGF,EAAM6K,SAAS,UAEfyO,EAAY,OAGZA,GAAWA,EAAUzO,SAAS,UAElCuO,EAAYhI,IAAI,WAAWoI,QAAQ3O,SAAS,eAMpDwO,aAAc,WACZ,GAAII,IACFC,OAAQ,UACR9W,WAAY,UAGd,OAAO6W,GAAO5a,KAAKsB,QAAQ6J,kBAAoB,aAGjDxC,IAAK,SAAU1H,GACb,MAAqB,mBAAVA,IACTjB,KAAKkI,SAASS,IAAI1H,GAClBjB,KAAK4I,SAEE5I,KAAKkI,UAELlI,KAAKkI,SAASS,OAIzBmS,UAAW,SAAUpI,GACnB,GAAK1S,KAAKkM,SAAV,CACsB,mBAAXwG,KAAwBA,GAAS,GAE5C1S,KAAK2R,SAEL,IAAId,GAAW7Q,KAAKkI,SAASyE,KAAK,UAC9B+N,EAAc1a,KAAKsI,KAAKiK,IAAI,kDAC5BwI,EAAYL,EAAYxX,OACxB8X,IAEJ,IAAItI,GACF,GAAIgI,EAAY5J,OAAO,aAAa5N,SAAWwX,EAAYxX,OAAQ,WAEnE,IAA+C,IAA3CwX,EAAY5J,OAAO,aAAa5N,OAAc,MAGpDwX,GAAYnD,YAAY,WAAY7E,EAEpC,KAAK,GAAInR,GAAI,EAAGA,EAAIwZ,EAAWxZ,IAAK,CAClC,GAAI0Z,GAAYP,EAAYnZ,GAAG2Z,aAAa,sBAC5CF,GAAgBA,EAAgB9X,QAAU2N,EAASa,GAAGuJ,GAAW,GAGnE/a,EAAE8a,GAAiB7O,KAAK,WAAYuG,GAEpC1S,KAAK4I,QAAO,GAEZ5I,KAAKiS,oBAELjS,KAAKkI,SACFpD,cAAc,YAGnBiE,UAAW,WACT,MAAO/I,MAAK8a,WAAU,IAGxB9R,YAAa,WACX,MAAOhJ,MAAK8a,WAAU,IAGxBK,OAAQ,SAAUrO,GAChBA,EAAIA,GAAKiJ,OAAO/Q,MAEZ8H,GAAGA,EAAEqM,kBAETnZ,KAAKoI,QAAQzC,QAAQ,UAGvByV,QAAS,SAAUtO,GACjB,GAEIuO,GAEArX,EACAsX,EACAX,EACA7C,EACAyD,EACAC,EACAvC,EACAwC,EAXAta,EAAQjB,EAAEF,MACVuQ,EAAUpP,EAAMC,GAAG,SAAWD,EAAMkN,SAASA,SAAWlN,EAAMkN,SAE9DvC,EAAOyE,EAAQlP,KAAK,QASpBqa,EAAW,uDACXC,GACEC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IAWX,IARI7S,EAAKxK,QAAQ0J,aAAYuF,EAAUpP,EAAMkN,SAASA,UAElDvC,EAAKxK,QAAQmJ,YAAW8F,EAAUzE,EAAKzD,OAE3CgT,EAASnb,EAAE,sBAAuBqQ,GAElCkL,EAAW3P,EAAK3D,YAAYmG,SAAS,SAEhCmN,IAAa3O,EAAE+L,SAAW,IAAM/L,EAAE+L,SAAW,IAAM/L,EAAE+L,SAAW,IAAM/L,EAAE+L,SAAW,KAAO/L,EAAE+L,SAAW,IAAM/L,EAAE+L,SAAW,IAS7H,MARK/M,GAAKxK,QAAQmJ,UAKhBqB,EAAK1D,QAAQzC,QAAQ,UAJrBmG,EAAKuJ,UACLvJ,EAAKzD,MAAMgG,SAASrC,SAAS,QAC7ByP,GAAW,OAIb3P,GAAKY,WAAWM,OAyBlB,IArBIlB,EAAKxK,QAAQ0J,aACX,WAAWlD,KAAKgF,EAAE+L,QAAQxW,SAAS,MAAQoZ,IAC7C3O,EAAEC,iBACFD,EAAEqM,kBACFrN,EAAKW,WAAWI,QAChBf,EAAK1D,QAAQ4E,SAGfqO,EAASnb,EAAE,sBAAwBwb,EAAUnL,GACxCpP,EAAMwH,OAAU,UAAUb,KAAKgF,EAAE+L,QAAQxW,SAAS,MACb,IAApCgZ,EAAOvK,OAAO,WAAW5N,SAC3BmY,EAASvP,EAAKW,WAAWE,KAAK,MAE5B0O,EADEvP,EAAKxK,QAAQ4J,oBACNmQ,EAAOvK,OAAO,KAAOhF,EAAK0O,eAAiB,IAAMra,EAAgBwb,EAAW7O,EAAE+L,UAAY,KAE1FwC,EAAOvK,OAAO,IAAMhF,EAAK0O,eAAiB,IAAMmB,EAAW7O,EAAE+L,SAAW,OAMpFwC,EAAOnY,OAAZ,CAEA,GAAI,UAAU4E,KAAKgF,EAAE+L,QAAQxW,SAAS,KACpC2B,EAAQqX,EAAOrX,MAAMqX,EAAO1O,KAAK,KAAKmE,OAAO,UAAUzC,UACvDsM,EAAQU,EAAOvK,OAAO4K,GAAUf,QAAQ3W,QACxC8T,EAAOuD,EAAOvK,OAAO4K,GAAU5D,OAAO9T,QACtCsX,EAAOD,EAAO3J,GAAG1N,GAAO4a,QAAQlD,GAAUhK,GAAG,GAAG1N,QAChDuX,EAAOF,EAAO3J,GAAG1N,GAAOsN,QAAQoK,GAAUhK,GAAG,GAAG1N,QAChDwX,EAAWH,EAAO3J,GAAG4J,GAAMhK,QAAQoK,GAAUhK,GAAG,GAAG1N,QAE/C8H,EAAKxK,QAAQ0J,aACfqQ,EAAO7a,KAAK,SAAUe,GACfrB,EAAEF,MAAMsO,SAAS,aACpBpO,EAAEF,MAAMqB,KAAK,QAASE,KAG1ByC,EAAQqX,EAAOrX,MAAMqX,EAAOvK,OAAO,YACnC6J,EAAQU,EAAOV,QAAQtZ,KAAK,SAC5ByW,EAAOuD,EAAOvD,OAAOzW,KAAK,SAC1Bia,EAAOD,EAAO3J,GAAG1N,GAAO4a,UAAUlN,GAAG,GAAGrQ,KAAK,SAC7Cka,EAAOF,EAAO3J,GAAG1N,GAAOsN,UAAUI,GAAG,GAAGrQ,KAAK,SAC7Cma,EAAWH,EAAO3J,GAAG4J,GAAMhK,UAAUI,GAAG,GAAGrQ,KAAK,UAGlD4X,EAAY9X,EAAME,KAAK,aAEN,IAAbyL,EAAE+L,SACA/M,EAAKxK,QAAQ0J,YAAYhH,IACzBA,GAASwX,GAAYxX,EAAQuX,IAAMvX,EAAQuX,GAC3CvX,EAAQ2W,IAAO3W,EAAQ2W,GACvB3W,GAASiV,IAAWjV,EAAQ8T,IACV,IAAbhL,EAAE+L,UACP/M,EAAKxK,QAAQ0J,YAAYhH,IACzBA,IAAS,IAAIA,EAAQ,GACrBA,GAASwX,GAAYxX,EAAQsX,IAAMtX,EAAQsX,GAC3CtX,EAAQ8T,IAAM9T,EAAQ8T,GACtB9T,GAASiV,IAAWjV,EAAQ2W,IAGlCxZ,EAAME,KAAK,YAAa2C,GAEnB8H,EAAKxK,QAAQ0J,YAGhB8B,EAAEC,iBACG5L,EAAMmN,SAAS,qBAClB+M,EAAOzO,YAAY,UAAU8E,GAAG1N,GAAOgI,SAAS,UAAUQ,SAAS,KAAKQ,QACxE7L,EAAM6L,UALRqO,EAAO3J,GAAG1N,GAAOwI,SAAS,KAAKQ,YAS5B,KAAK7L,EAAMC,GAAG,SAAU,CAC7B,GACIyd,GACAC,EAFAC,IAIJ1D,GAAO7a,KAAK,WACLN,EAAEF,MAAMsO,SAAS,aAChBpO,EAAEuS,KAAKvS,EAAEF,MAAMwM,SAAS,KAAKpM,OAAO4e,eAAeC,UAAU,EAAG,IAAMtD,EAAW7O,EAAE+L,UACrFkG,EAASza,KAAKpE,EAAEF,MAAMgE,WAK5B6a,EAAQ3e,EAAEmF,UAAUhE,KAAK,YACzBwd,IACA3e,EAAEmF,UAAUhE,KAAK,WAAYwd,GAE7BC,EAAU5e,EAAEuS,KAAKvS,EAAE,UAAUE,OAAO4e,eAAeC,UAAU,EAAG,GAE5DH,GAAWnD,EAAW7O,EAAE+L,UAC1BgG,EAAQ,EACR3e,EAAEmF,UAAUhE,KAAK,WAAYwd,IACpBA,GAASE,EAAS7b,SAC3BhD,EAAEmF,UAAUhE,KAAK,WAAY,GACzBwd,EAAQE,EAAS7b,SAAQ2b,EAAQ,IAGvCxD,EAAO3J,GAAGqN,EAASF,EAAQ,IAAIrS,SAAS,KAAKQ,QAI/C,IAAK,UAAUlF,KAAKgF,EAAE+L,QAAQxW,SAAS,MAAS,QAAQyF,KAAKgF,EAAE+L,QAAQxW,SAAS,MAAQyJ,EAAKxK,QAAQqK,cAAiB8P,EAAU,CAE9H,GADK,OAAO3T,KAAKgF,EAAE+L,QAAQxW,SAAS,MAAMyK,EAAEC,iBACvCjB,EAAKxK,QAAQ0J,WASN,OAAOlD,KAAKgF,EAAE+L,QAAQxW,SAAS,OACzCyJ,EAAKW,WAAWE,KAAK,aAAaE;AAClC1L,EAAM6L,aAXsB,CAC5B,GAAIpI,GAAO1E,EAAE,SACb0E,GAAKiI,QAELjI,EAAKoI,QAELF,EAAEC,iBAEF7M,EAAEmF,UAAUhE,KAAK,eAAe,GAKlCnB,EAAEmF,UAAUhE,KAAK,WAAY,IAG1B,WAAWyG,KAAKgF,EAAE+L,QAAQxW,SAAS,MAAQoZ,IAAa3P,EAAKI,UAAYJ,EAAKxK,QAAQ0J,aAAiB,OAAOlD,KAAKgF,EAAE+L,QAAQxW,SAAS,OAASoZ,KAClJ3P,EAAKzD,MAAMgG,SAASzB,YAAY,QAC5Bd,EAAKxK,QAAQmJ,WAAWqB,EAAK3D,YAAYyE,YAAY,QACzDd,EAAK1D,QAAQ4E,WAIjBtB,OAAQ,WACN1L,KAAKkI,SAAS8D,SAAS,kBAGzBnD,QAAS,WACP7I,KAAKsI,KAAO,KACZtI,KAAKiM,SACLjM,KAAK+O,WACL/O,KAAK4I,SACL5I,KAAKiN,gBACLjN,KAAK4S,UAAS,GACd5S,KAAK8I,WACL9I,KAAKoN,WACDpN,KAAKsI,MAAMtI,KAAK0M,WAAW/G,QAAQ,kBAEvC3F,KAAKkI,SAASvC,QAAQ,wBAGxByD,KAAM,WACJpJ,KAAKmI,YAAYiB,QAGnBD,KAAM,WACJnJ,KAAKmI,YAAYgB,QAGnBD,OAAQ,WACNlJ,KAAKmI,YAAYe,SACjBlJ,KAAKkI,SAASgB,UAGhBD,QAAS,WACPjJ,KAAKmI,YAAY+W,OAAOlf,KAAKkI,UAAUgB,SAEnClJ,KAAKsY,aACPtY,KAAKsY,aAAapP,SAElBlJ,KAAKqI,MAAMa,SAGblJ,KAAKkI,SACF2F,IAAI,cACJsR,WAAW,gBACXvS,YAAY,kCAoDnB,IAAIwS,GAAMlf,EAAE2B,GAAGC,YACf5B,GAAE2B,GAAGC,aAAepB,EACpBR,EAAE2B,GAAGC,aAAaud,YAAc1d,EAIhCzB,EAAE2B,GAAGC,aAAawd,WAAa,WAE7B,MADApf,GAAE2B,GAAGC,aAAesd,EACbpf,MAGTE,EAAEmF,UACGhE,KAAK,WAAY,GACjBiM,GAAG,oBAAqB,oGAAqG3L,EAAaQ,UAAUiZ,SACpJ9N,GAAG,gBAAiB,oGAAqG,SAAUR,GAClIA,EAAEqM,oBAKRjZ,EAAE6V,QAAQzI,GAAG,0BAA2B,WACtCpN,EAAE,iBAAiBM,KAAK,WACtB,GAAI+e,GAAgBrf,EAAEF,KACtBU,GAAOsC,KAAKuc,EAAeA,EAAcle,aAG5CpB","file":"bootstrap-select.min.js"}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.min.js
deleted file mode 100644
index 0172807..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/bootstrap-select.min.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){"use strict";function b(b){var c=[{re:/[\xC0-\xC6]/g,ch:"A"},{re:/[\xE0-\xE6]/g,ch:"a"},{re:/[\xC8-\xCB]/g,ch:"E"},{re:/[\xE8-\xEB]/g,ch:"e"},{re:/[\xCC-\xCF]/g,ch:"I"},{re:/[\xEC-\xEF]/g,ch:"i"},{re:/[\xD2-\xD6]/g,ch:"O"},{re:/[\xF2-\xF6]/g,ch:"o"},{re:/[\xD9-\xDC]/g,ch:"U"},{re:/[\xF9-\xFC]/g,ch:"u"},{re:/[\xC7-\xE7]/g,ch:"c"},{re:/[\xD1]/g,ch:"N"},{re:/[\xF1]/g,ch:"n"}];return a.each(c,function(){b=b?b.replace(this.re,this.ch):""}),b}function c(b){var c=arguments,d=b;[].shift.apply(c);var e,f=this.each(function(){var b=a(this);if(b.is("select")){var f=b.data("selectpicker"),g="object"==typeof d&&d;if(f){if(g)for(var h in g)g.hasOwnProperty(h)&&(f.options[h]=g[h])}else{var i=a.extend({},k.DEFAULTS,a.fn.selectpicker.defaults||{},b.data(),g);i.template=a.extend({},k.DEFAULTS.template,a.fn.selectpicker.defaults?a.fn.selectpicker.defaults.template:{},b.data().template,g.template),b.data("selectpicker",f=new k(this,i))}"string"==typeof d&&(e=f[d]instanceof Function?f[d].apply(f,c):f.options[d])}});return"undefined"!=typeof e?e:f}String.prototype.includes||!function(){var a={}.toString,b=function(){try{var a={},b=Object.defineProperty,c=b(a,a,a)&&b}catch(a){}return c}(),c="".indexOf,d=function(b){if(null==this)throw new TypeError;var d=String(this);if(b&&"[object RegExp]"==a.call(b))throw new TypeError;var e=d.length,f=String(b),g=f.length,h=arguments.length>1?arguments[1]:void 0,i=h?Number(h):0;i!=i&&(i=0);var j=Math.min(Math.max(i,0),e);return!(g+j>e)&&c.call(d,f,i)!=-1};b?b(String.prototype,"includes",{value:d,configurable:!0,writable:!0}):String.prototype.includes=d}(),String.prototype.startsWith||!function(){var a=function(){try{var a={},b=Object.defineProperty,c=b(a,a,a)&&b}catch(a){}return c}(),b={}.toString,c=function(a){if(null==this)throw new TypeError;var c=String(this);if(a&&"[object RegExp]"==b.call(a))throw new TypeError;var d=c.length,e=String(a),f=e.length,g=arguments.length>1?arguments[1]:void 0,h=g?Number(g):0;h!=h&&(h=0);var i=Math.min(Math.max(h,0),d);if(f+i>d)return!1;for(var j=-1;++j<f;)if(c.charCodeAt(i+j)!=e.charCodeAt(j))return!1;return!0};a?a(String.prototype,"startsWith",{value:c,configurable:!0,writable:!0}):String.prototype.startsWith=c}(),Object.keys||(Object.keys=function(a,b,c){c=[];for(b in a)c.hasOwnProperty.call(a,b)&&c.push(b);return c});var d={useDefault:!1,_set:a.valHooks.select.set};a.valHooks.select.set=function(b,c){return c&&!d.useDefault&&a(b).data("selected",!0),d._set.apply(this,arguments)};var e=null;a.fn.triggerNative=function(a){var b,c=this[0];c.dispatchEvent?("function"==typeof Event?b=new Event(a,{bubbles:!0}):(b=document.createEvent("Event"),b.initEvent(a,!0,!1)),c.dispatchEvent(b)):c.fireEvent?(b=document.createEventObject(),b.eventType=a,c.fireEvent("on"+a,b)):this.trigger(a)},a.expr.pseudos.icontains=function(b,c,d){var e=a(b),f=(e.data("tokens")||e.text()).toString().toUpperCase();return f.includes(d[3].toUpperCase())},a.expr.pseudos.ibegins=function(b,c,d){var e=a(b),f=(e.data("tokens")||e.text()).toString().toUpperCase();return f.startsWith(d[3].toUpperCase())},a.expr.pseudos.aicontains=function(b,c,d){var e=a(b),f=(e.data("tokens")||e.data("normalizedText")||e.text()).toString().toUpperCase();return f.includes(d[3].toUpperCase())},a.expr.pseudos.aibegins=function(b,c,d){var e=a(b),f=(e.data("tokens")||e.data("normalizedText")||e.text()).toString().toUpperCase();return f.startsWith(d[3].toUpperCase())};var f={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},g={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#x27;":"'","&#x60;":"`"},h=function(a){var b=function(b){return a[b]},c="(?:"+Object.keys(a).join("|")+")",d=RegExp(c),e=RegExp(c,"g");return function(a){return a=null==a?"":""+a,d.test(a)?a.replace(e,b):a}},i=h(f),j=h(g),k=function(b,c){d.useDefault||(a.valHooks.select.set=d._set,d.useDefault=!0),this.$element=a(b),this.$newElement=null,this.$button=null,this.$menu=null,this.$lis=null,this.options=c,null===this.options.title&&(this.options.title=this.$element.attr("title"));var e=this.options.windowPadding;"number"==typeof e&&(this.options.windowPadding=[e,e,e,e]),this.val=k.prototype.val,this.render=k.prototype.render,this.refresh=k.prototype.refresh,this.setStyle=k.prototype.setStyle,this.selectAll=k.prototype.selectAll,this.deselectAll=k.prototype.deselectAll,this.destroy=k.prototype.destroy,this.remove=k.prototype.remove,this.show=k.prototype.show,this.hide=k.prototype.hide,this.init()};k.VERSION="1.12.2",k.DEFAULTS={noneSelectedText:"Nothing selected",noneResultsText:"No results matched {0}",countSelectedText:function(a,b){return 1==a?"{0} item selected":"{0} items selected"},maxOptionsText:function(a,b){return[1==a?"Limit reached ({n} item max)":"Limit reached ({n} items max)",1==b?"Group limit reached ({n} item max)":"Group limit reached ({n} items max)"]},selectAllText:"Select All",deselectAllText:"Deselect All",doneButton:!1,doneButtonText:"Close",multipleSeparator:", ",styleBase:"btn",style:"btn-default",size:"auto",title:null,selectedTextFormat:"values",width:!1,container:!1,hideDisabled:!1,showSubtext:!1,showIcon:!0,showContent:!0,dropupAuto:!0,header:!1,liveSearch:!1,liveSearchPlaceholder:null,liveSearchNormalize:!1,liveSearchStyle:"contains",actionsBox:!1,iconBase:"glyphicon",tickIcon:"glyphicon-ok",showTick:!1,template:{caret:'<span class="caret"></span>'},maxOptions:!1,mobile:!1,selectOnTab:!1,dropdownAlignRight:!1,windowPadding:0},k.prototype={constructor:k,init:function(){var b=this,c=this.$element.attr("id");this.$element.addClass("bs-select-hidden"),this.liObj={},this.multiple=this.$element.prop("multiple"),this.autofocus=this.$element.prop("autofocus"),this.$newElement=this.createView(),this.$element.after(this.$newElement).appendTo(this.$newElement),this.$button=this.$newElement.children("button"),this.$menu=this.$newElement.children(".dropdown-menu"),this.$menuInner=this.$menu.children(".inner"),this.$searchbox=this.$menu.find("input"),this.$element.removeClass("bs-select-hidden"),this.options.dropdownAlignRight===!0&&this.$menu.addClass("dropdown-menu-right"),"undefined"!=typeof c&&(this.$button.attr("data-id",c),a('label[for="'+c+'"]').click(function(a){a.preventDefault(),b.$button.focus()})),this.checkDisabled(),this.clickListener(),this.options.liveSearch&&this.liveSearchListener(),this.render(),this.setStyle(),this.setWidth(),this.options.container&&this.selectPosition(),this.$menu.data("this",this),this.$newElement.data("this",this),this.options.mobile&&this.mobile(),this.$newElement.on({"hide.bs.dropdown":function(a){b.$menuInner.attr("aria-expanded",!1),b.$element.trigger("hide.bs.select",a)},"hidden.bs.dropdown":function(a){b.$element.trigger("hidden.bs.select",a)},"show.bs.dropdown":function(a){b.$menuInner.attr("aria-expanded",!0),b.$element.trigger("show.bs.select",a)},"shown.bs.dropdown":function(a){b.$element.trigger("shown.bs.select",a)}}),b.$element[0].hasAttribute("required")&&this.$element.on("invalid",function(){b.$button.addClass("bs-invalid").focus(),b.$element.on({"focus.bs.select":function(){b.$button.focus(),b.$element.off("focus.bs.select")},"shown.bs.select":function(){b.$element.val(b.$element.val()).off("shown.bs.select")},"rendered.bs.select":function(){this.validity.valid&&b.$button.removeClass("bs-invalid"),b.$element.off("rendered.bs.select")}})}),setTimeout(function(){b.$element.trigger("loaded.bs.select")})},createDropdown:function(){var b=this.multiple||this.options.showTick?" show-tick":"",c=this.$element.parent().hasClass("input-group")?" input-group-btn":"",d=this.autofocus?" autofocus":"",e=this.options.header?'<div class="popover-title"><button type="button" class="close" aria-hidden="true">&times;</button>'+this.options.header+"</div>":"",f=this.options.liveSearch?'<div class="bs-searchbox"><input type="text" class="form-control" autocomplete="off"'+(null===this.options.liveSearchPlaceholder?"":' placeholder="'+i(this.options.liveSearchPlaceholder)+'"')+' role="textbox" aria-label="Search"></div>':"",g=this.multiple&&this.options.actionsBox?'<div class="bs-actionsbox"><div class="btn-group btn-group-sm btn-block"><button type="button" class="actions-btn bs-select-all btn btn-default">'+this.options.selectAllText+'</button><button type="button" class="actions-btn bs-deselect-all btn btn-default">'+this.options.deselectAllText+"</button></div></div>":"",h=this.multiple&&this.options.doneButton?'<div class="bs-donebutton"><div class="btn-group btn-block"><button type="button" class="btn btn-sm btn-default">'+this.options.doneButtonText+"</button></div></div>":"",j='<div class="btn-group bootstrap-select'+b+c+'"><button type="button" class="'+this.options.styleBase+' dropdown-toggle" data-toggle="dropdown"'+d+' role="button"><span class="filter-option pull-left"></span>&nbsp;<span class="bs-caret">'+this.options.template.caret+'</span></button><div class="dropdown-menu open" role="combobox">'+e+f+g+'<ul class="dropdown-menu inner" role="listbox" aria-expanded="false"></ul>'+h+"</div></div>";return a(j)},createView:function(){var a=this.createDropdown(),b=this.createLi();return a.find("ul")[0].innerHTML=b,a},reloadLi:function(){var a=this.createLi();this.$menuInner[0].innerHTML=a},createLi:function(){var c=this,d=[],e=0,f=document.createElement("option"),g=-1,h=function(a,b,c,d){return"<li"+("undefined"!=typeof c&""!==c?' class="'+c+'"':"")+("undefined"!=typeof b&null!==b?' data-original-index="'+b+'"':"")+("undefined"!=typeof d&null!==d?'data-optgroup="'+d+'"':"")+">"+a+"</li>"},j=function(d,e,f,g){return'<a tabindex="0"'+("undefined"!=typeof e?' class="'+e+'"':"")+(f?' style="'+f+'"':"")+(c.options.liveSearchNormalize?' data-normalized-text="'+b(i(a(d).html()))+'"':"")+("undefined"!=typeof g||null!==g?' data-tokens="'+g+'"':"")+' role="option">'+d+'<span class="'+c.options.iconBase+" "+c.options.tickIcon+' check-mark"></span></a>'};if(this.options.title&&!this.multiple&&(g--,!this.$element.find(".bs-title-option").length)){var k=this.$element[0];f.className="bs-title-option",f.innerHTML=this.options.title,f.value="",k.insertBefore(f,k.firstChild);var l=a(k.options[k.selectedIndex]);void 0===l.attr("selected")&&void 0===this.$element.data("selected")&&(f.selected=!0)}return this.$element.find("option").each(function(b){var f=a(this);if(g++,!f.hasClass("bs-title-option")){var k=this.className||"",l=this.style.cssText,m=f.data("content")?f.data("content"):f.html(),n=f.data("tokens")?f.data("tokens"):null,o="undefined"!=typeof f.data("subtext")?'<small class="text-muted">'+f.data("subtext")+"</small>":"",p="undefined"!=typeof f.data("icon")?'<span class="'+c.options.iconBase+" "+f.data("icon")+'"></span> ':"",q=f.parent(),r="OPTGROUP"===q[0].tagName,s=r&&q[0].disabled,t=this.disabled||s;if(""!==p&&t&&(p="<span>"+p+"</span>"),c.options.hideDisabled&&(t&&!r||s))return void g--;if(f.data("content")||(m=p+'<span class="text">'+m+o+"</span>"),r&&f.data("divider")!==!0){if(c.options.hideDisabled&&t){if(void 0===q.data("allOptionsDisabled")){var u=q.children();q.data("allOptionsDisabled",u.filter(":disabled").length===u.length)}if(q.data("allOptionsDisabled"))return void g--}var v=" "+q[0].className||"";if(0===f.index()){e+=1;var w=q[0].label,x="undefined"!=typeof q.data("subtext")?'<small class="text-muted">'+q.data("subtext")+"</small>":"",y=q.data("icon")?'<span class="'+c.options.iconBase+" "+q.data("icon")+'"></span> ':"";w=y+'<span class="text">'+i(w)+x+"</span>",0!==b&&d.length>0&&(g++,d.push(h("",null,"divider",e+"div"))),g++,d.push(h(w,null,"dropdown-header"+v,e))}if(c.options.hideDisabled&&t)return void g--;d.push(h(j(m,"opt "+k+v,l,n),b,"",e))}else if(f.data("divider")===!0)d.push(h("",b,"divider"));else if(f.data("hidden")===!0)d.push(h(j(m,k,l,n),b,"hidden is-hidden"));else{var z=this.previousElementSibling&&"OPTGROUP"===this.previousElementSibling.tagName;if(!z&&c.options.hideDisabled)for(var A=a(this).prevAll(),B=0;B<A.length;B++)if("OPTGROUP"===A[B].tagName){for(var C=0,D=0;D<B;D++){var E=A[D];(E.disabled||a(E).data("hidden")===!0)&&C++}C===B&&(z=!0);break}z&&(g++,d.push(h("",null,"divider",e+"div"))),d.push(h(j(m,k,l,n),b))}c.liObj[b]=g}}),this.multiple||0!==this.$element.find("option:selected").length||this.options.title||this.$element.find("option").eq(0).prop("selected",!0).attr("selected","selected"),d.join("")},findLis:function(){return null==this.$lis&&(this.$lis=this.$menu.find("li")),this.$lis},render:function(b){var c,d=this;b!==!1&&this.$element.find("option").each(function(a){var b=d.findLis().eq(d.liObj[a]);d.setDisabled(a,this.disabled||"OPTGROUP"===this.parentNode.tagName&&this.parentNode.disabled,b),d.setSelected(a,this.selected,b)}),this.togglePlaceholder(),this.tabIndex();var e=this.$element.find("option").map(function(){if(this.selected){if(d.options.hideDisabled&&(this.disabled||"OPTGROUP"===this.parentNode.tagName&&this.parentNode.disabled))return;var b,c=a(this),e=c.data("icon")&&d.options.showIcon?'<i class="'+d.options.iconBase+" "+c.data("icon")+'"></i> ':"";return b=d.options.showSubtext&&c.data("subtext")&&!d.multiple?' <small class="text-muted">'+c.data("subtext")+"</small>":"","undefined"!=typeof c.attr("title")?c.attr("title"):c.data("content")&&d.options.showContent?c.data("content").toString():e+c.html()+b}}).toArray(),f=this.multiple?e.join(this.options.multipleSeparator):e[0];if(this.multiple&&this.options.selectedTextFormat.indexOf("count")>-1){var g=this.options.selectedTextFormat.split(">");if(g.length>1&&e.length>g[1]||1==g.length&&e.length>=2){c=this.options.hideDisabled?", [disabled]":"";var h=this.$element.find("option").not('[data-divider="true"], [data-hidden="true"]'+c).length,i="function"==typeof this.options.countSelectedText?this.options.countSelectedText(e.length,h):this.options.countSelectedText;f=i.replace("{0}",e.length.toString()).replace("{1}",h.toString())}}void 0==this.options.title&&(this.options.title=this.$element.attr("title")),"static"==this.options.selectedTextFormat&&(f=this.options.title),f||(f="undefined"!=typeof this.options.title?this.options.title:this.options.noneSelectedText),this.$button.attr("title",j(a.trim(f.replace(/<[^>]*>?/g,"")))),this.$button.children(".filter-option").html(f),this.$element.trigger("rendered.bs.select")},setStyle:function(a,b){this.$element.attr("class")&&this.$newElement.addClass(this.$element.attr("class").replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi,""));var c=a?a:this.options.style;"add"==b?this.$button.addClass(c):"remove"==b?this.$button.removeClass(c):(this.$button.removeClass(this.options.style),this.$button.addClass(c))},liHeight:function(b){if(b||this.options.size!==!1&&!this.sizeInfo){var c=document.createElement("div"),d=document.createElement("div"),e=document.createElement("ul"),f=document.createElement("li"),g=document.createElement("li"),h=document.createElement("a"),i=document.createElement("span"),j=this.options.header&&this.$menu.find(".popover-title").length>0?this.$menu.find(".popover-title")[0].cloneNode(!0):null,k=this.options.liveSearch?document.createElement("div"):null,l=this.options.actionsBox&&this.multiple&&this.$menu.find(".bs-actionsbox").length>0?this.$menu.find(".bs-actionsbox")[0].cloneNode(!0):null,m=this.options.doneButton&&this.multiple&&this.$menu.find(".bs-donebutton").length>0?this.$menu.find(".bs-donebutton")[0].cloneNode(!0):null;if(i.className="text",c.className=this.$menu[0].parentNode.className+" open",d.className="dropdown-menu open",e.className="dropdown-menu inner",f.className="divider",i.appendChild(document.createTextNode("Inner text")),h.appendChild(i),g.appendChild(h),e.appendChild(g),e.appendChild(f),j&&d.appendChild(j),k){var n=document.createElement("input");k.className="bs-searchbox",n.className="form-control",k.appendChild(n),d.appendChild(k)}l&&d.appendChild(l),d.appendChild(e),m&&d.appendChild(m),c.appendChild(d),document.body.appendChild(c);var o=h.offsetHeight,p=j?j.offsetHeight:0,q=k?k.offsetHeight:0,r=l?l.offsetHeight:0,s=m?m.offsetHeight:0,t=a(f).outerHeight(!0),u="function"==typeof getComputedStyle&&getComputedStyle(d),v=u?null:a(d),w={vert:parseInt(u?u.paddingTop:v.css("paddingTop"))+parseInt(u?u.paddingBottom:v.css("paddingBottom"))+parseInt(u?u.borderTopWidth:v.css("borderTopWidth"))+parseInt(u?u.borderBottomWidth:v.css("borderBottomWidth")),horiz:parseInt(u?u.paddingLeft:v.css("paddingLeft"))+parseInt(u?u.paddingRight:v.css("paddingRight"))+parseInt(u?u.borderLeftWidth:v.css("borderLeftWidth"))+parseInt(u?u.borderRightWidth:v.css("borderRightWidth"))},x={vert:w.vert+parseInt(u?u.marginTop:v.css("marginTop"))+parseInt(u?u.marginBottom:v.css("marginBottom"))+2,horiz:w.horiz+parseInt(u?u.marginLeft:v.css("marginLeft"))+parseInt(u?u.marginRight:v.css("marginRight"))+2};document.body.removeChild(c),this.sizeInfo={liHeight:o,headerHeight:p,searchHeight:q,actionsHeight:r,doneButtonHeight:s,dividerHeight:t,menuPadding:w,menuExtras:x}}},setSize:function(){if(this.findLis(),this.liHeight(),this.options.header&&this.$menu.css("padding-top",0),this.options.size!==!1){var b,c,d,e,f,g,h,i,j=this,k=this.$menu,l=this.$menuInner,m=a(window),n=this.$newElement[0].offsetHeight,o=this.$newElement[0].offsetWidth,p=this.sizeInfo.liHeight,q=this.sizeInfo.headerHeight,r=this.sizeInfo.searchHeight,s=this.sizeInfo.actionsHeight,t=this.sizeInfo.doneButtonHeight,u=this.sizeInfo.dividerHeight,v=this.sizeInfo.menuPadding,w=this.sizeInfo.menuExtras,x=this.options.hideDisabled?".disabled":"",y=function(){var b,c=j.$newElement.offset(),d=a(j.options.container);j.options.container&&!d.is("body")?(b=d.offset(),b.top+=parseInt(d.css("borderTopWidth")),b.left+=parseInt(d.css("borderLeftWidth"))):b={top:0,left:0};var e=j.options.windowPadding;f=c.top-b.top-m.scrollTop(),g=m.height()-f-n-b.top-e[2],h=c.left-b.left-m.scrollLeft(),i=m.width()-h-o-b.left-e[1],f-=e[0],h-=e[3]};if(y(),"auto"===this.options.size){var z=function(){var m,n=function(b,c){return function(d){return c?d.classList?d.classList.contains(b):a(d).hasClass(b):!(d.classList?d.classList.contains(b):a(d).hasClass(b))}},u=j.$menuInner[0].getElementsByTagName("li"),x=Array.prototype.filter?Array.prototype.filter.call(u,n("hidden",!1)):j.$lis.not(".hidden"),z=Array.prototype.filter?Array.prototype.filter.call(x,n("dropdown-header",!0)):x.filter(".dropdown-header");y(),b=g-w.vert,c=i-w.horiz,j.options.container?(k.data("height")||k.data("height",k.height()),d=k.data("height"),k.data("width")||k.data("width",k.width()),e=k.data("width")):(d=k.height(),e=k.width()),j.options.dropupAuto&&j.$newElement.toggleClass("dropup",f>g&&b-w.vert<d),j.$newElement.hasClass("dropup")&&(b=f-w.vert),"auto"===j.options.dropdownAlignRight&&k.toggleClass("dropdown-menu-right",h>i&&c-w.horiz<e-o),m=x.length+z.length>3?3*p+w.vert-2:0,k.css({"max-height":b+"px",overflow:"hidden","min-height":m+q+r+s+t+"px"}),l.css({"max-height":b-q-r-s-t-v.vert+"px","overflow-y":"auto","min-height":Math.max(m-v.vert,0)+"px"})};z(),this.$searchbox.off("input.getSize propertychange.getSize").on("input.getSize propertychange.getSize",z),m.off("resize.getSize scroll.getSize").on("resize.getSize scroll.getSize",z)}else if(this.options.size&&"auto"!=this.options.size&&this.$lis.not(x).length>this.options.size){var A=this.$lis.not(".divider").not(x).children().slice(0,this.options.size).last().parent().index(),B=this.$lis.slice(0,A+1).filter(".divider").length;b=p*this.options.size+B*u+v.vert,j.options.container?(k.data("height")||k.data("height",k.height()),d=k.data("height")):d=k.height(),j.options.dropupAuto&&this.$newElement.toggleClass("dropup",f>g&&b-w.vert<d),k.css({"max-height":b+q+r+s+t+"px",overflow:"hidden","min-height":""}),l.css({"max-height":b-v.vert+"px","overflow-y":"auto","min-height":""})}}},setWidth:function(){if("auto"===this.options.width){this.$menu.css("min-width","0");var a=this.$menu.parent().clone().appendTo("body"),b=this.options.container?this.$newElement.clone().appendTo("body"):a,c=a.children(".dropdown-menu").outerWidth(),d=b.css("width","auto").children("button").outerWidth();a.remove(),b.remove(),this.$newElement.css("width",Math.max(c,d)+"px")}else"fit"===this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width","").addClass("fit-width")):this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width",this.options.width)):(this.$menu.css("min-width",""),this.$newElement.css("width",""));this.$newElement.hasClass("fit-width")&&"fit"!==this.options.width&&this.$newElement.removeClass("fit-width")},selectPosition:function(){this.$bsContainer=a('<div class="bs-container" />');var b,c,d,e=this,f=a(this.options.container),g=function(a){e.$bsContainer.addClass(a.attr("class").replace(/form-control|fit-width/gi,"")).toggleClass("dropup",a.hasClass("dropup")),b=a.offset(),f.is("body")?c={top:0,left:0}:(c=f.offset(),c.top+=parseInt(f.css("borderTopWidth"))-f.scrollTop(),c.left+=parseInt(f.css("borderLeftWidth"))-f.scrollLeft()),d=a.hasClass("dropup")?0:a[0].offsetHeight,e.$bsContainer.css({top:b.top-c.top+d,left:b.left-c.left,width:a[0].offsetWidth})};this.$button.on("click",function(){var b=a(this);e.isDisabled()||(g(e.$newElement),e.$bsContainer.appendTo(e.options.container).toggleClass("open",!b.hasClass("open")).append(e.$menu))}),a(window).on("resize scroll",function(){g(e.$newElement)}),this.$element.on("hide.bs.select",function(){e.$menu.data("height",e.$menu.height()),e.$bsContainer.detach()})},setSelected:function(a,b,c){c||(this.togglePlaceholder(),c=this.findLis().eq(this.liObj[a])),c.toggleClass("selected",b).find("a").attr("aria-selected",b)},setDisabled:function(a,b,c){c||(c=this.findLis().eq(this.liObj[a])),b?c.addClass("disabled").children("a").attr("href","#").attr("tabindex",-1).attr("aria-disabled",!0):c.removeClass("disabled").children("a").removeAttr("href").attr("tabindex",0).attr("aria-disabled",!1)},isDisabled:function(){return this.$element[0].disabled},checkDisabled:function(){var a=this;this.isDisabled()?(this.$newElement.addClass("disabled"),this.$button.addClass("disabled").attr("tabindex",-1).attr("aria-disabled",!0)):(this.$button.hasClass("disabled")&&(this.$newElement.removeClass("disabled"),this.$button.removeClass("disabled").attr("aria-disabled",!1)),this.$button.attr("tabindex")!=-1||this.$element.data("tabindex")||this.$button.removeAttr("tabindex")),this.$button.click(function(){return!a.isDisabled()})},togglePlaceholder:function(){var a=this.$element.val();this.$button.toggleClass("bs-placeholder",null===a||""===a||a.constructor===Array&&0===a.length)},tabIndex:function(){this.$element.data("tabindex")!==this.$element.attr("tabindex")&&this.$element.attr("tabindex")!==-98&&"-98"!==this.$element.attr("tabindex")&&(this.$element.data("tabindex",this.$element.attr("tabindex")),this.$button.attr("tabindex",this.$element.data("tabindex"))),this.$element.attr("tabindex",-98)},clickListener:function(){var b=this,c=a(document);c.data("spaceSelect",!1),this.$button.on("keyup",function(a){/(32)/.test(a.keyCode.toString(10))&&c.data("spaceSelect")&&(a.preventDefault(),c.data("spaceSelect",!1))}),this.$button.on("click",function(){b.setSize()}),this.$element.on("shown.bs.select",function(){if(b.options.liveSearch||b.multiple){if(!b.multiple){var a=b.liObj[b.$element[0].selectedIndex];if("number"!=typeof a||b.options.size===!1)return;var c=b.$lis.eq(a)[0].offsetTop-b.$menuInner[0].offsetTop;c=c-b.$menuInner[0].offsetHeight/2+b.sizeInfo.liHeight/2,b.$menuInner[0].scrollTop=c}}else b.$menuInner.find(".selected a").focus()}),this.$menuInner.on("click","li a",function(c){var d=a(this),f=d.parent().data("originalIndex"),g=b.$element.val(),h=b.$element.prop("selectedIndex"),i=!0;if(b.multiple&&1!==b.options.maxOptions&&c.stopPropagation(),c.preventDefault(),!b.isDisabled()&&!d.parent().hasClass("disabled")){var j=b.$element.find("option"),k=j.eq(f),l=k.prop("selected"),m=k.parent("optgroup"),n=b.options.maxOptions,o=m.data("maxOptions")||!1;if(b.multiple){if(k.prop("selected",!l),b.setSelected(f,!l),d.blur(),n!==!1||o!==!1){var p=n<j.filter(":selected").length,q=o<m.find("option:selected").length;if(n&&p||o&&q)if(n&&1==n)j.prop("selected",!1),k.prop("selected",!0),b.$menuInner.find(".selected").removeClass("selected"),b.setSelected(f,!0);else if(o&&1==o){m.find("option:selected").prop("selected",!1),k.prop("selected",!0);var r=d.parent().data("optgroup");b.$menuInner.find('[data-optgroup="'+r+'"]').removeClass("selected"),b.setSelected(f,!0)}else{var s="string"==typeof b.options.maxOptionsText?[b.options.maxOptionsText,b.options.maxOptionsText]:b.options.maxOptionsText,t="function"==typeof s?s(n,o):s,u=t[0].replace("{n}",n),v=t[1].replace("{n}",o),w=a('<div class="notify"></div>');t[2]&&(u=u.replace("{var}",t[2][n>1?0:1]),v=v.replace("{var}",t[2][o>1?0:1])),k.prop("selected",!1),b.$menu.append(w),n&&p&&(w.append(a("<div>"+u+"</div>")),i=!1,b.$element.trigger("maxReached.bs.select")),o&&q&&(w.append(a("<div>"+v+"</div>")),i=!1,b.$element.trigger("maxReachedGrp.bs.select")),setTimeout(function(){b.setSelected(f,!1)},10),w.delay(750).fadeOut(300,function(){a(this).remove()})}}}else j.prop("selected",!1),k.prop("selected",!0),b.$menuInner.find(".selected").removeClass("selected").find("a").attr("aria-selected",!1),b.setSelected(f,!0);!b.multiple||b.multiple&&1===b.options.maxOptions?b.$button.focus():b.options.liveSearch&&b.$searchbox.focus(),i&&(g!=b.$element.val()&&b.multiple||h!=b.$element.prop("selectedIndex")&&!b.multiple)&&(e=[f,k.prop("selected"),l],b.$element.triggerNative("change"))}}),this.$menu.on("click","li.disabled a, .popover-title, .popover-title :not(.close)",function(c){c.currentTarget==this&&(c.preventDefault(),c.stopPropagation(),b.options.liveSearch&&!a(c.target).hasClass("close")?b.$searchbox.focus():b.$button.focus())}),this.$menuInner.on("click",".divider, .dropdown-header",function(a){a.preventDefault(),a.stopPropagation(),b.options.liveSearch?b.$searchbox.focus():b.$button.focus()}),this.$menu.on("click",".popover-title .close",function(){b.$button.click()}),this.$searchbox.on("click",function(a){a.stopPropagation()}),this.$menu.on("click",".actions-btn",function(c){b.options.liveSearch?b.$searchbox.focus():b.$button.focus(),c.preventDefault(),c.stopPropagation(),a(this).hasClass("bs-select-all")?b.selectAll():b.deselectAll()}),this.$element.change(function(){b.render(!1),b.$element.trigger("changed.bs.select",e),e=null})},liveSearchListener:function(){var c=this,d=a('<li class="no-results"></li>');this.$button.on("click.dropdown.data-api",function(){c.$menuInner.find(".active").removeClass("active"),c.$searchbox.val()&&(c.$searchbox.val(""),c.$lis.not(".is-hidden").removeClass("hidden"),d.parent().length&&d.remove()),c.multiple||c.$menuInner.find(".selected").addClass("active"),setTimeout(function(){c.$searchbox.focus()},10)}),this.$searchbox.on("click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api",function(a){a.stopPropagation()}),this.$searchbox.on("input propertychange",function(){if(c.$lis.not(".is-hidden").removeClass("hidden"),c.$lis.filter(".active").removeClass("active"),d.remove(),c.$searchbox.val()){var e,f=c.$lis.not(".is-hidden, .divider, .dropdown-header");if(e=c.options.liveSearchNormalize?f.find("a").not(":a"+c._searchStyle()+'("'+b(c.$searchbox.val())+'")'):f.find("a").not(":"+c._searchStyle()+'("'+c.$searchbox.val()+'")'),e.length===f.length)d.html(c.options.noneResultsText.replace("{0}",'"'+i(c.$searchbox.val())+'"')),c.$menuInner.append(d),c.$lis.addClass("hidden");else{e.parent().addClass("hidden");var g,h=c.$lis.not(".hidden");h.each(function(b){var c=a(this);c.hasClass("divider")?void 0===g?c.addClass("hidden"):(g&&g.addClass("hidden"),g=c):c.hasClass("dropdown-header")&&h.eq(b+1).data("optgroup")!==c.data("optgroup")?c.addClass("hidden"):g=null}),g&&g.addClass("hidden"),f.not(".hidden").first().addClass("active")}}})},_searchStyle:function(){var a={begins:"ibegins",startsWith:"ibegins"};return a[this.options.liveSearchStyle]||"icontains"},val:function(a){return"undefined"!=typeof a?(this.$element.val(a),this.render(),this.$element):this.$element.val()},changeAll:function(b){if(this.multiple){"undefined"==typeof b&&(b=!0),this.findLis();var c=this.$element.find("option"),d=this.$lis.not(".divider, .dropdown-header, .disabled, .hidden"),e=d.length,f=[];if(b){if(d.filter(".selected").length===d.length)return}else if(0===d.filter(".selected").length)return;d.toggleClass("selected",b);for(var g=0;g<e;g++){var h=d[g].getAttribute("data-original-index");f[f.length]=c.eq(h)[0]}a(f).prop("selected",b),this.render(!1),this.togglePlaceholder(),this.$element.triggerNative("change")}},selectAll:function(){return this.changeAll(!0)},deselectAll:function(){return this.changeAll(!1)},toggle:function(a){a=a||window.event,a&&a.stopPropagation(),this.$button.trigger("click")},keydown:function(c){var d,e,f,g,h,i,j,k,l,m=a(this),n=m.is("input")?m.parent().parent():m.parent(),o=n.data("this"),p=":not(.disabled, .hidden, .dropdown-header, .divider)",q={32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"};if(o.options.liveSearch&&(n=m.parent().parent()),o.options.container&&(n=o.$menu),d=a('[role="listbox"] li',n),l=o.$newElement.hasClass("open"),!l&&(c.keyCode>=48&&c.keyCode<=57||c.keyCode>=96&&c.keyCode<=105||c.keyCode>=65&&c.keyCode<=90))return o.options.container?o.$button.trigger("click"):(o.setSize(),o.$menu.parent().addClass("open"),l=!0),void o.$searchbox.focus();if(o.options.liveSearch&&(/(^9$|27)/.test(c.keyCode.toString(10))&&l&&(c.preventDefault(),c.stopPropagation(),o.$menuInner.click(),o.$button.focus()),d=a('[role="listbox"] li'+p,n),m.val()||/(38|40)/.test(c.keyCode.toString(10))||0===d.filter(".active").length&&(d=o.$menuInner.find("li"),d=o.options.liveSearchNormalize?d.filter(":a"+o._searchStyle()+"("+b(q[c.keyCode])+")"):d.filter(":"+o._searchStyle()+"("+q[c.keyCode]+")"))),d.length){if(/(38|40)/.test(c.keyCode.toString(10)))e=d.index(d.find("a").filter(":focus").parent()),g=d.filter(p).first().index(),h=d.filter(p).last().index(),f=d.eq(e).nextAll(p).eq(0).index(),i=d.eq(e).prevAll(p).eq(0).index(),j=d.eq(f).prevAll(p).eq(0).index(),o.options.liveSearch&&(d.each(function(b){a(this).hasClass("disabled")||a(this).data("index",b)}),e=d.index(d.filter(".active")),g=d.first().data("index"),h=d.last().data("index"),f=d.eq(e).nextAll().eq(0).data("index"),i=d.eq(e).prevAll().eq(0).data("index"),j=d.eq(f).prevAll().eq(0).data("index")),k=m.data("prevIndex"),38==c.keyCode?(o.options.liveSearch&&e--,e!=j&&e>i&&(e=i),e<g&&(e=g),e==k&&(e=h)):40==c.keyCode&&(o.options.liveSearch&&e++,e==-1&&(e=0),e!=j&&e<f&&(e=f),e>h&&(e=h),e==k&&(e=g)),m.data("prevIndex",e),o.options.liveSearch?(c.preventDefault(),m.hasClass("dropdown-toggle")||(d.removeClass("active").eq(e).addClass("active").children("a").focus(),m.focus())):d.eq(e).children("a").focus();else if(!m.is("input")){var r,s,t=[];d.each(function(){a(this).hasClass("disabled")||a.trim(a(this).children("a").text().toLowerCase()).substring(0,1)==q[c.keyCode]&&t.push(a(this).index())}),r=a(document).data("keycount"),r++,a(document).data("keycount",r),s=a.trim(a(":focus").text().toLowerCase()).substring(0,1),s!=q[c.keyCode]?(r=1,a(document).data("keycount",r)):r>=t.length&&(a(document).data("keycount",0),r>t.length&&(r=1)),d.eq(t[r-1]).children("a").focus()}if((/(13|32)/.test(c.keyCode.toString(10))||/(^9$)/.test(c.keyCode.toString(10))&&o.options.selectOnTab)&&l){if(/(32)/.test(c.keyCode.toString(10))||c.preventDefault(),o.options.liveSearch)/(32)/.test(c.keyCode.toString(10))||(o.$menuInner.find(".active a").click(),
-m.focus());else{var u=a(":focus");u.click(),u.focus(),c.preventDefault(),a(document).data("spaceSelect",!0)}a(document).data("keycount",0)}(/(^9$|27)/.test(c.keyCode.toString(10))&&l&&(o.multiple||o.options.liveSearch)||/(27)/.test(c.keyCode.toString(10))&&!l)&&(o.$menu.parent().removeClass("open"),o.options.container&&o.$newElement.removeClass("open"),o.$button.focus())}},mobile:function(){this.$element.addClass("mobile-device")},refresh:function(){this.$lis=null,this.liObj={},this.reloadLi(),this.render(),this.checkDisabled(),this.liHeight(!0),this.setStyle(),this.setWidth(),this.$lis&&this.$searchbox.trigger("propertychange"),this.$element.trigger("refreshed.bs.select")},hide:function(){this.$newElement.hide()},show:function(){this.$newElement.show()},remove:function(){this.$newElement.remove(),this.$element.remove()},destroy:function(){this.$newElement.before(this.$element).remove(),this.$bsContainer?this.$bsContainer.remove():this.$menu.remove(),this.$element.off(".bs.select").removeData("selectpicker").removeClass("bs-select-hidden selectpicker")}};var l=a.fn.selectpicker;a.fn.selectpicker=c,a.fn.selectpicker.Constructor=k,a.fn.selectpicker.noConflict=function(){return a.fn.selectpicker=l,this},a(document).data("keycount",0).on("keydown.bs.select",'.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input',k.prototype.keydown).on("focusin.modal",'.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input',function(a){a.stopPropagation()}),a(window).on("load.bs.select.data-api",function(){a(".selectpicker").each(function(){var b=a(this);c.call(b,b.data())})})}(a)});
-//# sourceMappingURL=bootstrap-select.js.map
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ar_AR.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ar_AR.js
deleted file mode 100644
index 9044d0c..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ar_AR.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-/*!
- * Translated default messages for bootstrap-select.
- * Locale: AR (Arabic)
- * Author: Yasser Lotfy <y_l@alive.com>
- */
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'لم يتم إختيار شئ',
-    noneResultsText: 'لا توجد نتائج مطابقة لـ {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} خيار تم إختياره" : "{0} خيارات تمت إختيارها";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'تخطى الحد المسموح ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح ({n} خيارات بحد أقصى)',
-        (numGroup == 1) ? 'تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)'
-      ];
-    },
-    selectAllText: 'إختيار الجميع',
-    deselectAllText: 'إلغاء إختيار الجميع',
-    multipleSeparator: '، '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ar_AR.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ar_AR.min.js
deleted file mode 100644
index 09d6eda..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ar_AR.min.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){/*!
- * Translated default messages for bootstrap-select.
- * Locale: AR (Arabic)
- * Author: Yasser Lotfy <y_l@alive.com>
- */
-!function(a){a.fn.selectpicker.defaults={noneSelectedText:"لم يتم إختيار شئ",noneResultsText:"لا توجد نتائج مطابقة لـ {0}",countSelectedText:function(a,b){return 1==a?"{0} خيار تم إختياره":"{0} خيارات تمت إختيارها"},maxOptionsText:function(a,b){return[1==a?"تخطى الحد المسموح ({n} خيار بحد أقصى)":"تخطى الحد المسموح ({n} خيارات بحد أقصى)",1==b?"تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)":"تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)"]},selectAllText:"إختيار الجميع",deselectAllText:"إلغاء إختيار الجميع",multipleSeparator:"، "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-bg_BG.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-bg_BG.js
deleted file mode 100644
index f547391..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-bg_BG.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Нищо избрано',
-    noneResultsText: 'Няма резултат за {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} избран елемент" : "{0} избрани елемента";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',
-        (numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'
-      ];
-    },
-    selectAllText: 'Избери всички',
-    deselectAllText: 'Размаркирай всички',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-bg_BG.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-bg_BG.min.js
deleted file mode 100644
index 253c3e4..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-bg_BG.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Нищо избрано",noneResultsText:"Няма резултат за {0}",countSelectedText:function(a,b){return 1==a?"{0} избран елемент":"{0} избрани елемента"},maxOptionsText:function(a,b){return[1==a?"Лимита е достигнат ({n} елемент максимум)":"Лимита е достигнат ({n} елемента максимум)",1==b?"Груповия лимит е достигнат ({n} елемент максимум)":"Груповия лимит е достигнат ({n} елемента максимум)"]},selectAllText:"Избери всички",deselectAllText:"Размаркирай всички",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cro_CRO.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cro_CRO.js
deleted file mode 100644
index c36a356..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cro_CRO.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Odaberite stavku',
-    noneResultsText: 'Nema rezultata pretrage {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} stavka selektirana" : "{0} stavke selektirane";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Limit je postignut ({n} stvar maximalno)' : 'Limit je postignut ({n} stavke maksimalno)',
-        (numGroup == 1) ? 'Grupni limit je postignut ({n} stvar maksimalno)' : 'Grupni limit je postignut ({n} stavke maksimalno)'
-      ];
-    },
-    selectAllText: 'Selektiraj sve',
-    deselectAllText: 'Deselektiraj sve',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cro_CRO.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cro_CRO.min.js
deleted file mode 100644
index e93920e..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cro_CRO.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Odaberite stavku",noneResultsText:"Nema rezultata pretrage {0}",countSelectedText:function(a,b){return 1==a?"{0} stavka selektirana":"{0} stavke selektirane"},maxOptionsText:function(a,b){return[1==a?"Limit je postignut ({n} stvar maximalno)":"Limit je postignut ({n} stavke maksimalno)",1==b?"Grupni limit je postignut ({n} stvar maksimalno)":"Grupni limit je postignut ({n} stavke maksimalno)"]},selectAllText:"Selektiraj sve",deselectAllText:"Deselektiraj sve",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cs_CZ.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cs_CZ.js
deleted file mode 100644
index 9e0adc1..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cs_CZ.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nic není vybráno',
-    noneResultsText: 'Žádné výsledky {0}',
-    countSelectedText: 'Označeno {0} z {1}',
-    maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cs_CZ.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cs_CZ.min.js
deleted file mode 100644
index 1e53e0e..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-cs_CZ.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic není vybráno",noneResultsText:"Žádné výsledky {0}",countSelectedText:"Označeno {0} z {1}",maxOptionsText:["Limit překročen ({n} {var} max)","Limit skupiny překročen ({n} {var} max)",["položek","položka"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-da_DK.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-da_DK.js
deleted file mode 100644
index 34658e0..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-da_DK.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Intet valgt',
-    noneResultsText: 'Ingen resultater fundet {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} valgt" : "{0} valgt";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',
-        (numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'
-      ];
-    },
-    selectAllText: 'Markér alle',
-    deselectAllText: 'Afmarkér alle',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-da_DK.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-da_DK.min.js
deleted file mode 100644
index 82cfa81..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-da_DK.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Intet valgt",noneResultsText:"Ingen resultater fundet {0}",countSelectedText:function(a,b){return"{0} valgt"},maxOptionsText:function(a,b){return[1==a?"Begrænsning nået (max {n} valgt)":"Begrænsning nået (max {n} valgte)",1==b?"Gruppe-begrænsning nået (max {n} valgt)":"Gruppe-begrænsning nået (max {n} valgte)"]},selectAllText:"Markér alle",deselectAllText:"Afmarkér alle",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-de_DE.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-de_DE.js
deleted file mode 100644
index 8abd38a..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-de_DE.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Bitte wählen...',
-    noneResultsText: 'Keine Ergebnisse für {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} Element ausgewählt" : "{0} Elemente ausgewählt";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Limit erreicht ({n} Element max.)' : 'Limit erreicht ({n} Elemente max.)',
-        (numGroup == 1) ? 'Gruppen-Limit erreicht ({n} Element max.)' : 'Gruppen-Limit erreicht ({n} Elemente max.)'
-      ];
-    },
-    selectAllText: 'Alles auswählen',
-    deselectAllText: 'Nichts auswählen',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-de_DE.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-de_DE.min.js
deleted file mode 100644
index df0d8b3..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-de_DE.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Bitte wählen...",noneResultsText:"Keine Ergebnisse für {0}",countSelectedText:function(a,b){return 1==a?"{0} Element ausgewählt":"{0} Elemente ausgewählt"},maxOptionsText:function(a,b){return[1==a?"Limit erreicht ({n} Element max.)":"Limit erreicht ({n} Elemente max.)",1==b?"Gruppen-Limit erreicht ({n} Element max.)":"Gruppen-Limit erreicht ({n} Elemente max.)"]},selectAllText:"Alles auswählen",deselectAllText:"Nichts auswählen",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-en_US.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-en_US.js
deleted file mode 100644
index 8807e73..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-en_US.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nothing selected',
-    noneResultsText: 'No results match {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
-        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
-      ];
-    },
-    selectAllText: 'Select All',
-    deselectAllText: 'Deselect All',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-en_US.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-en_US.min.js
deleted file mode 100644
index 7bcaceb..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-en_US.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nothing selected",noneResultsText:"No results match {0}",countSelectedText:function(a,b){return 1==a?"{0} item selected":"{0} items selected"},maxOptionsText:function(a,b){return[1==a?"Limit reached ({n} item max)":"Limit reached ({n} items max)",1==b?"Group limit reached ({n} item max)":"Group limit reached ({n} items max)"]},selectAllText:"Select All",deselectAllText:"Deselect All",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_CL.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_CL.js
deleted file mode 100644
index c60cbb2..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_CL.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'No hay selección',
-    noneResultsText: 'No hay resultados {0}',
-    countSelectedText: 'Seleccionados {0} de {1}',
-    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
-    multipleSeparator: ', ',
-    selectAllText: 'Seleccionar Todos',
-    deselectAllText: 'Desmarcar Todos'
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_CL.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_CL.min.js
deleted file mode 100644
index d942b64..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_CL.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"No hay selección",noneResultsText:"No hay resultados {0}",countSelectedText:"Seleccionados {0} de {1}",maxOptionsText:["Límite alcanzado ({n} {var} max)","Límite del grupo alcanzado({n} {var} max)",["elementos","element"]],multipleSeparator:", ",selectAllText:"Seleccionar Todos",deselectAllText:"Desmarcar Todos"}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_ES.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_ES.js
deleted file mode 100644
index c60cbb2..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_ES.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'No hay selección',
-    noneResultsText: 'No hay resultados {0}',
-    countSelectedText: 'Seleccionados {0} de {1}',
-    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
-    multipleSeparator: ', ',
-    selectAllText: 'Seleccionar Todos',
-    deselectAllText: 'Desmarcar Todos'
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_ES.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_ES.min.js
deleted file mode 100644
index d942b64..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-es_ES.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"No hay selección",noneResultsText:"No hay resultados {0}",countSelectedText:"Seleccionados {0} de {1}",maxOptionsText:["Límite alcanzado ({n} {var} max)","Límite del grupo alcanzado({n} {var} max)",["elementos","element"]],multipleSeparator:", ",selectAllText:"Seleccionar Todos",deselectAllText:"Desmarcar Todos"}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-eu.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-eu.js
deleted file mode 100644
index e353048..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-eu.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Hautapenik ez',
-    noneResultsText: 'Emaitzarik ez {0}',
-    countSelectedText: '{1}(e)tik {0} hautatuta',
-    maxOptionsText: ['Mugara iritsita ({n} {var} gehienez)', 'Taldearen mugara iritsita ({n} {var} gehienez)', ['elementu', 'elementu']],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-eu.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-eu.min.js
deleted file mode 100644
index 5a96905..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-eu.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Hautapenik ez",noneResultsText:"Emaitzarik ez {0}",countSelectedText:"{1}(e)tik {0} hautatuta",maxOptionsText:["Mugara iritsita ({n} {var} gehienez)","Taldearen mugara iritsita ({n} {var} gehienez)",["elementu","elementu"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fa_IR.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fa_IR.js
deleted file mode 100644
index 43ce524..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fa_IR.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-    $.fn.selectpicker.defaults = {
-        noneSelectedText: 'چیزی انتخاب نشده است',
-        noneResultsText: 'هیج مشابهی برای {0} پیدا نشد',
-        countSelectedText: "{0} از {1} مورد انتخاب شده",
-        maxOptionsText: ['بیشتر ممکن نیست {حداکثر {n} عدد}', 'بیشتر ممکن نیست {حداکثر {n} عدد}'],
-        selectAllText: 'انتخاب همه',
-        deselectAllText: 'انتخاب هیچ کدام',
-        multipleSeparator: ', '
-    };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fa_IR.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fa_IR.min.js
deleted file mode 100644
index e63da5f..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fa_IR.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"چیزی انتخاب نشده است",noneResultsText:"هیج مشابهی برای {0} پیدا نشد",countSelectedText:"{0} از {1} مورد انتخاب شده",maxOptionsText:["بیشتر ممکن نیست {حداکثر {n} عدد}","بیشتر ممکن نیست {حداکثر {n} عدد}"],selectAllText:"انتخاب همه",deselectAllText:"انتخاب هیچ کدام",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fi_FI.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fi_FI.js
deleted file mode 100644
index b3998bc..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fi_FI.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Ei valintoja',
-    noneResultsText: 'Ei hakutuloksia {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} valittu" : "{0} valitut";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Valintojen maksimimäärä ({n} saavutettu)' : 'Valintojen maksimimäärä ({n} saavutettu)',
-        (numGroup == 1) ? 'Ryhmän maksimimäärä ({n} saavutettu)' : 'Ryhmän maksimimäärä ({n} saavutettu)'
-      ];
-    },
-    selectAllText: 'Valitse kaikki',
-    deselectAllText: 'Poista kaikki',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fi_FI.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fi_FI.min.js
deleted file mode 100644
index 16a1bdd..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fi_FI.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ei valintoja",noneResultsText:"Ei hakutuloksia {0}",countSelectedText:function(a,b){return 1==a?"{0} valittu":"{0} valitut"},maxOptionsText:function(a,b){return["Valintojen maksimimäärä ({n} saavutettu)","Ryhmän maksimimäärä ({n} saavutettu)"]},selectAllText:"Valitse kaikki",deselectAllText:"Poista kaikki",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fr_FR.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fr_FR.js
deleted file mode 100644
index c878f7e..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fr_FR.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Aucune sélection',
-    noneResultsText: 'Aucun résultat pour {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected > 1) ? "{0} éléments sélectionnés" : "{0} élément sélectionné";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll > 1) ? 'Limite atteinte ({n} éléments max)' : 'Limite atteinte ({n} élément max)',
-        (numGroup > 1) ? 'Limite du groupe atteinte ({n} éléments max)' : 'Limite du groupe atteinte ({n} élément max)'
-      ];
-    },
-    multipleSeparator: ', ',
-    selectAllText: 'Tout Sélectionner',
-    deselectAllText: 'Tout Dé-selectionner',
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fr_FR.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fr_FR.min.js
deleted file mode 100644
index 3494f09..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-fr_FR.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Aucune sélection",noneResultsText:"Aucun résultat pour {0}",countSelectedText:function(a,b){return a>1?"{0} éléments sélectionnés":"{0} élément sélectionné"},maxOptionsText:function(a,b){return[a>1?"Limite atteinte ({n} éléments max)":"Limite atteinte ({n} élément max)",b>1?"Limite du groupe atteinte ({n} éléments max)":"Limite du groupe atteinte ({n} élément max)"]},multipleSeparator:", ",selectAllText:"Tout Sélectionner",deselectAllText:"Tout Dé-selectionner"}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-hu_HU.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-hu_HU.js
deleted file mode 100644
index 3779840..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-hu_HU.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Válasszon!',
-    noneResultsText: 'Nincs találat {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return '{0} elem kiválasztva';
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        'Legfeljebb {n} elem választható',
-        'A csoportban legfeljebb {n} elem választható'
-      ];
-    },
-    selectAllText: 'Mind',
-    deselectAllText: 'Egyik sem',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-hu_HU.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-hu_HU.min.js
deleted file mode 100644
index 8316778..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-hu_HU.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Válasszon!",noneResultsText:"Nincs találat {0}",countSelectedText:function(a,b){return"{0} elem kiválasztva"},maxOptionsText:function(a,b){return["Legfeljebb {n} elem választható","A csoportban legfeljebb {n} elem választható"]},selectAllText:"Mind",deselectAllText:"Egyik sem",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-id_ID.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-id_ID.js
deleted file mode 100644
index fa0a887..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-id_ID.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Tidak ada yang dipilih',
-    noneResultsText: 'Tidak ada yang cocok {0}',
-    countSelectedText: '{0} terpilih',
-    maxOptionsText: ['Mencapai batas (maksimum {n})', 'Mencapai batas grup (maksimum {n})'],
-    selectAllText: 'Pilih Semua',
-    deselectAllText: 'Hapus Semua',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-id_ID.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-id_ID.min.js
deleted file mode 100644
index 370ac7b..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-id_ID.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Tidak ada yang dipilih",noneResultsText:"Tidak ada yang cocok {0}",countSelectedText:"{0} terpilih",maxOptionsText:["Mencapai batas (maksimum {n})","Mencapai batas grup (maksimum {n})"],selectAllText:"Pilih Semua",deselectAllText:"Hapus Semua",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-it_IT.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-it_IT.js
deleted file mode 100644
index 07046ce..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-it_IT.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nessuna selezione',
-    noneResultsText: 'Nessun risultato per {0}',
-    countSelectedText: function (numSelected, numTotal){
-      return (numSelected == 1) ? 'Selezionato {0} di {1}' : 'Selezionati {0} di {1}';
-    },
-    maxOptionsText: ['Limite raggiunto ({n} {var} max)', 'Limite del gruppo raggiunto ({n} {var} max)', ['elementi', 'elemento']],
-    multipleSeparator: ', ',
-    selectAllText: 'Seleziona Tutto',
-    deselectAllText: 'Deseleziona Tutto'
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-it_IT.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-it_IT.min.js
deleted file mode 100644
index fe26f87..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-it_IT.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nessuna selezione",noneResultsText:"Nessun risultato per {0}",countSelectedText:function(a,b){return 1==a?"Selezionato {0} di {1}":"Selezionati {0} di {1}"},maxOptionsText:["Limite raggiunto ({n} {var} max)","Limite del gruppo raggiunto ({n} {var} max)",["elementi","elemento"]],multipleSeparator:", ",selectAllText:"Seleziona Tutto",deselectAllText:"Deseleziona Tutto"}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ko_KR.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ko_KR.js
deleted file mode 100644
index 04505f2..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ko_KR.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: '항목을 선택해주세요',
-    noneResultsText: '{0} 검색 결과가 없습니다',
-    countSelectedText: function (numSelected, numTotal) {
-      return "{0}개를 선택하였습니다";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        '{n}개까지 선택 가능합니다',
-        '해당 그룹은 {n}개까지 선택 가능합니다'
-      ];
-    },
-    selectAllText: '전체선택',
-    deselectAllText: '전체해제',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ko_KR.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ko_KR.min.js
deleted file mode 100644
index a6abeb5..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ko_KR.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"항목을 선택해주세요",noneResultsText:"{0} 검색 결과가 없습니다",countSelectedText:function(a,b){return"{0}개를 선택하였습니다"},maxOptionsText:function(a,b){return["{n}개까지 선택 가능합니다","해당 그룹은 {n}개까지 선택 가능합니다"]},selectAllText:"전체선택",deselectAllText:"전체해제",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-lt_LT.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-lt_LT.js
deleted file mode 100644
index 9244d64..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-lt_LT.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Niekas nepasirinkta',
-    noneResultsText: 'Niekas nesutapo su {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} elementas pasirinktas" : "{0} elementai(-ų) pasirinkta";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Pasiekta riba ({n} elementas daugiausiai)' : 'Riba pasiekta ({n} elementai(-ų) daugiausiai)',
-        (numGroup == 1) ? 'Grupės riba pasiekta ({n} elementas daugiausiai)' : 'Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)'
-      ];
-    },
-    selectAllText: 'Pasirinkti visus',
-    deselectAllText: 'Atmesti visus',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-lt_LT.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-lt_LT.min.js
deleted file mode 100644
index 9eed893..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-lt_LT.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Niekas nepasirinkta",noneResultsText:"Niekas nesutapo su {0}",countSelectedText:function(a,b){return 1==a?"{0} elementas pasirinktas":"{0} elementai(-ų) pasirinkta"},maxOptionsText:function(a,b){return[1==a?"Pasiekta riba ({n} elementas daugiausiai)":"Riba pasiekta ({n} elementai(-ų) daugiausiai)",1==b?"Grupės riba pasiekta ({n} elementas daugiausiai)":"Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)"]},selectAllText:"Pasirinkti visus",deselectAllText:"Atmesti visus",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nb_NO.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nb_NO.js
deleted file mode 100644
index 8c680f7..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nb_NO.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Ingen valgt',
-    noneResultsText: 'Søket gir ingen treff {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} alternativ valgt" : "{0} alternativer valgt";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Grense nådd (maks {n} valg)' : 'Grense nådd (maks {n} valg)',
-        (numGroup == 1) ? 'Grense for grupper nådd (maks {n} grupper)' : 'Grense for grupper nådd (maks {n} grupper)'
-      ];
-    },
-    selectAllText: 'Merk alle',
-    deselectAllText: 'Fjern alle',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nb_NO.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nb_NO.min.js
deleted file mode 100644
index a3ae655..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nb_NO.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ingen valgt",noneResultsText:"Søket gir ingen treff {0}",countSelectedText:function(a,b){return 1==a?"{0} alternativ valgt":"{0} alternativer valgt"},maxOptionsText:function(a,b){return["Grense nådd (maks {n} valg)","Grense for grupper nådd (maks {n} grupper)"]},selectAllText:"Merk alle",deselectAllText:"Fjern alle",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nl_NL.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nl_NL.js
deleted file mode 100644
index 7affce5..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nl_NL.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Niets geselecteerd',
-    noneResultsText: 'Geen resultaten gevonden voor {0}',
-    countSelectedText: '{0} van {1} geselecteerd',
-    maxOptionsText: ['Limiet bereikt ({n} {var} max)', 'Groep limiet bereikt ({n} {var} max)', ['items', 'item']],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nl_NL.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nl_NL.min.js
deleted file mode 100644
index ad7ff41..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-nl_NL.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Niets geselecteerd",noneResultsText:"Geen resultaten gevonden voor {0}",countSelectedText:"{0} van {1} geselecteerd",maxOptionsText:["Limiet bereikt ({n} {var} max)","Groep limiet bereikt ({n} {var} max)",["items","item"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pl_PL.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pl_PL.js
deleted file mode 100644
index c97db05..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pl_PL.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nic nie zaznaczono',
-    noneResultsText: 'Brak wyników wyszukiwania {0}',
-    countSelectedText: 'Zaznaczono {0} z {1}',
-    maxOptionsText: ['Osiągnięto limit ({n} {var} max)', 'Limit grupy osiągnięty ({n} {var} max)', ['elementy', 'element']],
-    selectAll: 'Zaznacz wszystkie',
-    deselectAll: 'Odznacz wszystkie',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pl_PL.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pl_PL.min.js
deleted file mode 100644
index eacceb6..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pl_PL.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic nie zaznaczono",noneResultsText:"Brak wyników wyszukiwania {0}",countSelectedText:"Zaznaczono {0} z {1}",maxOptionsText:["Osiągnięto limit ({n} {var} max)","Limit grupy osiągnięty ({n} {var} max)",["elementy","element"]],selectAll:"Zaznacz wszystkie",deselectAll:"Odznacz wszystkie",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_BR.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_BR.js
deleted file mode 100644
index 65729d0..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_BR.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nada selecionado',
-    noneResultsText: 'Nada encontrado contendo {0}',
-    countSelectedText: 'Selecionado {0} de {1}',
-    maxOptionsText: ['Limite excedido (máx. {n} {var})', 'Limite do grupo excedido (máx. {n} {var})', ['itens', 'item']],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_BR.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_BR.min.js
deleted file mode 100644
index aba7a29..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_BR.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nada selecionado",noneResultsText:"Nada encontrado contendo {0}",countSelectedText:"Selecionado {0} de {1}",maxOptionsText:["Limite excedido (máx. {n} {var})","Limite do grupo excedido (máx. {n} {var})",["itens","item"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_PT.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_PT.js
deleted file mode 100644
index ea12dc7..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_PT.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-$.fn.selectpicker.defaults = {
-noneSelectedText: 'Nenhum seleccionado',
-noneResultsText: 'Sem resultados contendo {0}',
-countSelectedText: 'Selecionado {0} de {1}',
-maxOptionsText: ['Limite ultrapassado (máx. {n} {var})', 'Limite de seleções ultrapassado (máx. {n} {var})', ['itens', 'item']],
-multipleSeparator: ', '
-};
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_PT.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_PT.min.js
deleted file mode 100644
index 94a8a5e..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-pt_PT.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nenhum seleccionado",noneResultsText:"Sem resultados contendo {0}",countSelectedText:"Selecionado {0} de {1}",maxOptionsText:["Limite ultrapassado (máx. {n} {var})","Limite de seleções ultrapassado (máx. {n} {var})",["itens","item"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ro_RO.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ro_RO.js
deleted file mode 100644
index 0765915..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ro_RO.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nu a fost selectat nimic',
-    noneResultsText: 'Nu exista niciun rezultat {0}',
-    countSelectedText: '{0} din {1} selectat(e)',
-    maxOptionsText: ['Limita a fost atinsa ({n} {var} max)', 'Limita de grup a fost atinsa ({n} {var} max)', ['iteme', 'item']],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ro_RO.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ro_RO.min.js
deleted file mode 100644
index 499abf3..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ro_RO.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nu a fost selectat nimic",noneResultsText:"Nu exista niciun rezultat {0}",countSelectedText:"{0} din {1} selectat(e)",maxOptionsText:["Limita a fost atinsa ({n} {var} max)","Limita de grup a fost atinsa ({n} {var} max)",["iteme","item"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ru_RU.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ru_RU.js
deleted file mode 100644
index ab319b2..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ru_RU.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Ничего не выбрано',
-    noneResultsText: 'Совпадений не найдено {0}',
-    countSelectedText: 'Выбрано {0} из {1}',
-    maxOptionsText: ['Достигнут предел ({n} {var} максимум)', 'Достигнут предел в группе ({n} {var} максимум)', ['шт.', 'шт.']],
-    doneButtonText: 'Закрыть',
-    selectAllText: 'Выбрать все',
-    deselectAllText: 'Отменить все',    
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ru_RU.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ru_RU.min.js
deleted file mode 100644
index 8719e0c..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ru_RU.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ничего не выбрано",noneResultsText:"Совпадений не найдено {0}",countSelectedText:"Выбрано {0} из {1}",maxOptionsText:["Достигнут предел ({n} {var} максимум)","Достигнут предел в группе ({n} {var} максимум)",["шт.","шт."]],doneButtonText:"Закрыть",selectAllText:"Выбрать все",deselectAllText:"Отменить все",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sk_SK.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sk_SK.js
deleted file mode 100644
index 0688155..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sk_SK.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Vyberte zo zoznamu',
-    noneResultsText: 'Pre výraz {0} neboli nájdené žiadne výsledky',
-    countSelectedText: 'Vybrané {0} z {1}',
-    maxOptionsText: ['Limit prekročený ({n} {var} max)', 'Limit skupiny prekročený ({n} {var} max)', ['položiek', 'položka']],
-    selectAllText: 'Vybrať všetky',
-    deselectAllText: 'Zrušiť výber',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sk_SK.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sk_SK.min.js
deleted file mode 100644
index 07ef874..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sk_SK.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Vyberte zo zoznamu",noneResultsText:"Pre výraz {0} neboli nájdené žiadne výsledky",countSelectedText:"Vybrané {0} z {1}",maxOptionsText:["Limit prekročený ({n} {var} max)","Limit skupiny prekročený ({n} {var} max)",["položiek","položka"]],selectAllText:"Vybrať všetky",deselectAllText:"Zrušiť výber",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sl_SI.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sl_SI.js
deleted file mode 100644
index f540542..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sl_SI.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Nič izbranega',
-    noneResultsText: 'Ni zadetkov za {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      "Število izbranih: {0}";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        'Omejitev dosežena (max. izbranih: {n})',
-        'Omejitev skupine dosežena (max. izbranih: {n})'
-      ];
-    },
-    selectAllText: 'Izberi vse',
-    deselectAllText: 'Počisti izbor',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sl_SI.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sl_SI.min.js
deleted file mode 100644
index 3bd4f71..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sl_SI.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nič izbranega",noneResultsText:"Ni zadetkov za {0}",countSelectedText:function(a,b){"Število izbranih: {0}"},maxOptionsText:function(a,b){return["Omejitev dosežena (max. izbranih: {n})","Omejitev skupine dosežena (max. izbranih: {n})"]},selectAllText:"Izberi vse",deselectAllText:"Počisti izbor",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sv_SE.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sv_SE.js
deleted file mode 100644
index b50e31f..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sv_SE.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Inget valt',
-    noneResultsText: 'Inget sökresultat matchar {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected === 1) ? "{0} alternativ valt" : "{0} alternativ valda";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        'Gräns uppnåd (max {n} alternativ)',
-        'Gräns uppnåd (max {n} gruppalternativ)'
-      ];
-    },
-    selectAllText: 'Markera alla',
-    deselectAllText: 'Avmarkera alla',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sv_SE.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sv_SE.min.js
deleted file mode 100644
index 2e61581..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-sv_SE.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Inget valt",noneResultsText:"Inget sökresultat matchar {0}",countSelectedText:function(a,b){return 1===a?"{0} alternativ valt":"{0} alternativ valda"},maxOptionsText:function(a,b){return["Gräns uppnåd (max {n} alternativ)","Gräns uppnåd (max {n} gruppalternativ)"]},selectAllText:"Markera alla",deselectAllText:"Avmarkera alla",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-tr_TR.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-tr_TR.js
deleted file mode 100644
index 1fd0e13..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-tr_TR.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Hiçbiri seçilmedi',
-    noneResultsText: 'Hiçbir sonuç bulunamadı {0}',
-    countSelectedText: function (numSelected, numTotal) {
-      return (numSelected == 1) ? "{0} öğe seçildi" : "{0} öğe seçildi";
-    },
-    maxOptionsText: function (numAll, numGroup) {
-      return [
-        (numAll == 1) ? 'Limit aşıldı (maksimum {n} sayıda öğe )' : 'Limit aşıldı (maksimum {n} sayıda öğe)',
-        (numGroup == 1) ? 'Grup limiti aşıldı (maksimum {n} sayıda öğe)' : 'Grup limiti aşıldı (maksimum {n} sayıda öğe)'
-      ];
-    },
-    selectAllText: 'Tümünü Seç',
-    deselectAllText: 'Seçiniz',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-tr_TR.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-tr_TR.min.js
deleted file mode 100644
index a7db52f..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-tr_TR.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Hiçbiri seçilmedi",noneResultsText:"Hiçbir sonuç bulunamadı {0}",countSelectedText:function(a,b){return"{0} öğe seçildi"},maxOptionsText:function(a,b){return[1==a?"Limit aşıldı (maksimum {n} sayıda öğe )":"Limit aşıldı (maksimum {n} sayıda öğe)","Grup limiti aşıldı (maksimum {n} sayıda öğe)"]},selectAllText:"Tümünü Seç",deselectAllText:"Seçiniz",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ua_UA.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ua_UA.js
deleted file mode 100644
index 6db17a5..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ua_UA.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: 'Нічого не вибрано',
-    noneResultsText: 'Збігів не знайдено {0}',
-    countSelectedText: 'Вибрано {0} із {1}',
-    maxOptionsText: ['Досягнута межа ({n} {var} максимум)', 'Досягнута межа в групі ({n} {var} максимум)', ['items', 'item']],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ua_UA.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ua_UA.min.js
deleted file mode 100644
index bcc7b30..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-ua_UA.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Нічого не вибрано",noneResultsText:"Збігів не знайдено {0}",countSelectedText:"Вибрано {0} із {1}",maxOptionsText:["Досягнута межа ({n} {var} максимум)","Досягнута межа в групі ({n} {var} максимум)",["items","item"]],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_CN.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_CN.js
deleted file mode 100644
index 623b783..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_CN.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: '没有选中任何项',
-    noneResultsText: '没有找到匹配项',
-    countSelectedText: '选中{1}中的{0}项',
-    maxOptionsText: ['超出限制 (最多选择{n}项)', '组选择超出限制(最多选择{n}组)'],
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_CN.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_CN.min.js
deleted file mode 100644
index fe1c135..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_CN.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"没有选中任何项",noneResultsText:"没有找到匹配项",countSelectedText:"选中{1}中的{0}项",maxOptionsText:["超出限制 (最多选择{n}项)","组选择超出限制(最多选择{n}组)"],multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_TW.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_TW.js
deleted file mode 100644
index 2a1aae0..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_TW.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module unless amdModuleId is set
-    define(["jquery"], function (a0) {
-      return (factory(a0));
-    });
-  } else if (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    module.exports = factory(require("jquery"));
-  } else {
-    factory(root["jQuery"]);
-  }
-}(this, function (jQuery) {
-
-(function ($) {
-  $.fn.selectpicker.defaults = {
-    noneSelectedText: '沒有選取任何項目',
-    noneResultsText: '沒有找到符合的結果',
-    countSelectedText: '已經選取{0}個項目',
-    maxOptionsText: ['超過限制 (最多選擇{n}項)', '超過限制(最多選擇{n}組)'],
-    selectAllText: '選取全部',
-    deselectAllText: '全部取消',
-    multipleSeparator: ', '
-  };
-})(jQuery);
-
-
-}));
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_TW.min.js b/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_TW.min.js
deleted file mode 100644
index f667cdc..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap-select/js/i18n/defaults-zh_TW.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- * Copyright (c) 2013-2015 bootstrap-select
- * 
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"沒有選取任何項目",noneResultsText:"沒有找到符合的結果",countSelectedText:"已經選取{0}個項目",maxOptionsText:["超過限制 (最多選擇{n}項)","超過限制(最多選擇{n}組)"],selectAllText:"選取全部",deselectAllText:"全部取消",multipleSeparator:", "}}(a)});
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/config.json b/framework/crawler-ui/src/main/webapp/bootstrap/config.json
deleted file mode 100644
index 005d2c1..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/config.json
+++ /dev/null
@@ -1,423 +0,0 @@
-{
-  "vars": {
-    "@gray-base": "#000",
-    "@gray-darker": "lighten(@gray-base, 13.5%)",
-    "@gray-dark": "lighten(@gray-base, 20%)",
-    "@gray": "lighten(@gray-base, 33.5%)",
-    "@gray-light": "lighten(@gray-base, 46.7%)",
-    "@gray-lighter": "lighten(@gray-base, 93.5%)",
-    "@brand-primary": "darken(#428bca, 6.5%)",
-    "@brand-success": "#5cb85c",
-    "@brand-info": "#5bc0de",
-    "@brand-warning": "#f0ad4e",
-    "@brand-danger": "#d9534f",
-    "@body-bg": "#fff",
-    "@text-color": "@gray-dark",
-    "@link-color": "@brand-primary",
-    "@link-hover-color": "darken(@link-color, 15%)",
-    "@link-hover-decoration": "underline",
-    "@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif",
-    "@font-family-serif": "Georgia, \"Times New Roman\", Times, serif",
-    "@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace",
-    "@font-family-base": "@font-family-sans-serif",
-    "@font-size-base": "14px",
-    "@font-size-large": "ceil((@font-size-base * 1.25))",
-    "@font-size-small": "ceil((@font-size-base * 0.85))",
-    "@font-size-h1": "floor((@font-size-base * 2.6))",
-    "@font-size-h2": "floor((@font-size-base * 2.15))",
-    "@font-size-h3": "ceil((@font-size-base * 1.7))",
-    "@font-size-h4": "ceil((@font-size-base * 1.25))",
-    "@font-size-h5": "@font-size-base",
-    "@font-size-h6": "ceil((@font-size-base * 0.85))",
-    "@line-height-base": "1.428571429",
-    "@line-height-computed": "floor((@font-size-base * @line-height-base))",
-    "@headings-font-family": "inherit",
-    "@headings-font-weight": "500",
-    "@headings-line-height": "1.1",
-    "@headings-color": "inherit",
-    "@padding-base-vertical": "6px",
-    "@padding-base-horizontal": "12px",
-    "@padding-large-vertical": "10px",
-    "@padding-large-horizontal": "16px",
-    "@padding-small-vertical": "5px",
-    "@padding-small-horizontal": "10px",
-    "@padding-xs-vertical": "1px",
-    "@padding-xs-horizontal": "5px",
-    "@line-height-large": "1.3333333",
-    "@line-height-small": "1.5",
-    "@border-radius-base": "4px",
-    "@border-radius-large": "6px",
-    "@border-radius-small": "3px",
-    "@component-active-color": "#fff",
-    "@component-active-bg": "@brand-primary",
-    "@caret-width-base": "4px",
-    "@caret-width-large": "5px",
-    "@table-cell-padding": "8px",
-    "@table-condensed-cell-padding": "5px",
-    "@table-bg": "transparent",
-    "@table-bg-accent": "#f9f9f9",
-    "@table-bg-hover": "#f5f5f5",
-    "@table-bg-active": "@table-bg-hover",
-    "@table-border-color": "#ddd",
-    "@btn-font-weight": "normal",
-    "@btn-default-color": "#333",
-    "@btn-default-bg": "#fff",
-    "@btn-default-border": "#ccc",
-    "@btn-primary-color": "#fff",
-    "@btn-primary-bg": "@brand-primary",
-    "@btn-primary-border": "darken(@btn-primary-bg, 5%)",
-    "@btn-success-color": "#fff",
-    "@btn-success-bg": "@brand-success",
-    "@btn-success-border": "darken(@btn-success-bg, 5%)",
-    "@btn-info-color": "#fff",
-    "@btn-info-bg": "@brand-info",
-    "@btn-info-border": "darken(@btn-info-bg, 5%)",
-    "@btn-warning-color": "#fff",
-    "@btn-warning-bg": "@brand-warning",
-    "@btn-warning-border": "darken(@btn-warning-bg, 5%)",
-    "@btn-danger-color": "#fff",
-    "@btn-danger-bg": "@brand-danger",
-    "@btn-danger-border": "darken(@btn-danger-bg, 5%)",
-    "@btn-link-disabled-color": "@gray-light",
-    "@btn-border-radius-base": "@border-radius-base",
-    "@btn-border-radius-large": "@border-radius-large",
-    "@btn-border-radius-small": "@border-radius-small",
-    "@input-bg": "#fff",
-    "@input-bg-disabled": "@gray-lighter",
-    "@input-color": "@gray",
-    "@input-border": "#ccc",
-    "@input-border-radius": "@border-radius-base",
-    "@input-border-radius-large": "@border-radius-large",
-    "@input-border-radius-small": "@border-radius-small",
-    "@input-border-focus": "#66afe9",
-    "@input-color-placeholder": "#999",
-    "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
-    "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
-    "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
-    "@form-group-margin-bottom": "15px",
-    "@legend-color": "@gray-dark",
-    "@legend-border-color": "#e5e5e5",
-    "@input-group-addon-bg": "@gray-lighter",
-    "@input-group-addon-border-color": "@input-border",
-    "@cursor-disabled": "not-allowed",
-    "@dropdown-bg": "#fff",
-    "@dropdown-border": "rgba(0,0,0,.15)",
-    "@dropdown-fallback-border": "#ccc",
-    "@dropdown-divider-bg": "#e5e5e5",
-    "@dropdown-link-color": "@gray-dark",
-    "@dropdown-link-hover-color": "darken(@gray-dark, 5%)",
-    "@dropdown-link-hover-bg": "#f5f5f5",
-    "@dropdown-link-active-color": "@component-active-color",
-    "@dropdown-link-active-bg": "@component-active-bg",
-    "@dropdown-link-disabled-color": "@gray-light",
-    "@dropdown-header-color": "@gray-light",
-    "@dropdown-caret-color": "#000",
-    "@screen-xs": "480px",
-    "@screen-xs-min": "@screen-xs",
-    "@screen-phone": "@screen-xs-min",
-    "@screen-sm": "768px",
-    "@screen-sm-min": "@screen-sm",
-    "@screen-tablet": "@screen-sm-min",
-    "@screen-md": "992px",
-    "@screen-md-min": "@screen-md",
-    "@screen-desktop": "@screen-md-min",
-    "@screen-lg": "1200px",
-    "@screen-lg-min": "@screen-lg",
-    "@screen-lg-desktop": "@screen-lg-min",
-    "@screen-xs-max": "(@screen-sm-min - 1)",
-    "@screen-sm-max": "(@screen-md-min - 1)",
-    "@screen-md-max": "(@screen-lg-min - 1)",
-    "@grid-columns": "12",
-    "@grid-gutter-width": "30px",
-    "@grid-float-breakpoint": "@screen-sm-min",
-    "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)",
-    "@container-tablet": "(720px + @grid-gutter-width)",
-    "@container-sm": "@container-tablet",
-    "@container-desktop": "(940px + @grid-gutter-width)",
-    "@container-md": "@container-desktop",
-    "@container-large-desktop": "(1140px + @grid-gutter-width)",
-    "@container-lg": "@container-large-desktop",
-    "@navbar-height": "50px",
-    "@navbar-margin-bottom": "@line-height-computed",
-    "@navbar-border-radius": "@border-radius-base",
-    "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))",
-    "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)",
-    "@navbar-collapse-max-height": "340px",
-    "@navbar-default-color": "#777",
-    "@navbar-default-bg": "#f8f8f8",
-    "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)",
-    "@navbar-default-link-color": "#777",
-    "@navbar-default-link-hover-color": "#333",
-    "@navbar-default-link-hover-bg": "transparent",
-    "@navbar-default-link-active-color": "#555",
-    "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)",
-    "@navbar-default-link-disabled-color": "#ccc",
-    "@navbar-default-link-disabled-bg": "transparent",
-    "@navbar-default-brand-color": "@navbar-default-link-color",
-    "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)",
-    "@navbar-default-brand-hover-bg": "transparent",
-    "@navbar-default-toggle-hover-bg": "#ddd",
-    "@navbar-default-toggle-icon-bar-bg": "#888",
-    "@navbar-default-toggle-border-color": "#ddd",
-    "@navbar-inverse-color": "lighten(@gray-light, 15%)",
-    "@navbar-inverse-bg": "#222",
-    "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)",
-    "@navbar-inverse-link-color": "lighten(@gray-light, 15%)",
-    "@navbar-inverse-link-hover-color": "#fff",
-    "@navbar-inverse-link-hover-bg": "transparent",
-    "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color",
-    "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)",
-    "@navbar-inverse-link-disabled-color": "#444",
-    "@navbar-inverse-link-disabled-bg": "transparent",
-    "@navbar-inverse-brand-color": "@navbar-inverse-link-color",
-    "@navbar-inverse-brand-hover-color": "#fff",
-    "@navbar-inverse-brand-hover-bg": "transparent",
-    "@navbar-inverse-toggle-hover-bg": "#333",
-    "@navbar-inverse-toggle-icon-bar-bg": "#fff",
-    "@navbar-inverse-toggle-border-color": "#333",
-    "@nav-link-padding": "10px 15px",
-    "@nav-link-hover-bg": "@gray-lighter",
-    "@nav-disabled-link-color": "@gray-light",
-    "@nav-disabled-link-hover-color": "@gray-light",
-    "@nav-tabs-border-color": "#ddd",
-    "@nav-tabs-link-hover-border-color": "@gray-lighter",
-    "@nav-tabs-active-link-hover-bg": "@body-bg",
-    "@nav-tabs-active-link-hover-color": "@gray",
-    "@nav-tabs-active-link-hover-border-color": "#ddd",
-    "@nav-tabs-justified-link-border-color": "#ddd",
-    "@nav-tabs-justified-active-link-border-color": "@body-bg",
-    "@nav-pills-border-radius": "@border-radius-base",
-    "@nav-pills-active-link-hover-bg": "@component-active-bg",
-    "@nav-pills-active-link-hover-color": "@component-active-color",
-    "@pagination-color": "@link-color",
-    "@pagination-bg": "#fff",
-    "@pagination-border": "#ddd",
-    "@pagination-hover-color": "@link-hover-color",
-    "@pagination-hover-bg": "@gray-lighter",
-    "@pagination-hover-border": "#ddd",
-    "@pagination-active-color": "#fff",
-    "@pagination-active-bg": "@brand-primary",
-    "@pagination-active-border": "@brand-primary",
-    "@pagination-disabled-color": "@gray-light",
-    "@pagination-disabled-bg": "#fff",
-    "@pagination-disabled-border": "#ddd",
-    "@pager-bg": "@pagination-bg",
-    "@pager-border": "@pagination-border",
-    "@pager-border-radius": "15px",
-    "@pager-hover-bg": "@pagination-hover-bg",
-    "@pager-active-bg": "@pagination-active-bg",
-    "@pager-active-color": "@pagination-active-color",
-    "@pager-disabled-color": "@pagination-disabled-color",
-    "@jumbotron-padding": "30px",
-    "@jumbotron-color": "inherit",
-    "@jumbotron-bg": "@gray-lighter",
-    "@jumbotron-heading-color": "inherit",
-    "@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
-    "@jumbotron-heading-font-size": "ceil((@font-size-base * 4.5))",
-    "@state-success-text": "#3c763d",
-    "@state-success-bg": "#dff0d8",
-    "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
-    "@state-info-text": "#31708f",
-    "@state-info-bg": "#d9edf7",
-    "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)",
-    "@state-warning-text": "#8a6d3b",
-    "@state-warning-bg": "#fcf8e3",
-    "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)",
-    "@state-danger-text": "#a94442",
-    "@state-danger-bg": "#f2dede",
-    "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)",
-    "@tooltip-max-width": "200px",
-    "@tooltip-color": "#fff",
-    "@tooltip-bg": "#000",
-    "@tooltip-opacity": ".9",
-    "@tooltip-arrow-width": "5px",
-    "@tooltip-arrow-color": "@tooltip-bg",
-    "@popover-bg": "#fff",
-    "@popover-max-width": "276px",
-    "@popover-border-color": "rgba(0,0,0,.2)",
-    "@popover-fallback-border-color": "#ccc",
-    "@popover-title-bg": "darken(@popover-bg, 3%)",
-    "@popover-arrow-width": "10px",
-    "@popover-arrow-color": "@popover-bg",
-    "@popover-arrow-outer-width": "(@popover-arrow-width + 1)",
-    "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)",
-    "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)",
-    "@label-default-bg": "@gray-light",
-    "@label-primary-bg": "@brand-primary",
-    "@label-success-bg": "@brand-success",
-    "@label-info-bg": "@brand-info",
-    "@label-warning-bg": "@brand-warning",
-    "@label-danger-bg": "@brand-danger",
-    "@label-color": "#fff",
-    "@label-link-hover-color": "#fff",
-    "@modal-inner-padding": "15px",
-    "@modal-title-padding": "15px",
-    "@modal-title-line-height": "@line-height-base",
-    "@modal-content-bg": "#fff",
-    "@modal-content-border-color": "rgba(0,0,0,.2)",
-    "@modal-content-fallback-border-color": "#999",
-    "@modal-backdrop-bg": "#000",
-    "@modal-backdrop-opacity": ".5",
-    "@modal-header-border-color": "#e5e5e5",
-    "@modal-footer-border-color": "@modal-header-border-color",
-    "@modal-lg": "900px",
-    "@modal-md": "600px",
-    "@modal-sm": "300px",
-    "@alert-padding": "15px",
-    "@alert-border-radius": "@border-radius-base",
-    "@alert-link-font-weight": "bold",
-    "@alert-success-bg": "@state-success-bg",
-    "@alert-success-text": "@state-success-text",
-    "@alert-success-border": "@state-success-border",
-    "@alert-info-bg": "@state-info-bg",
-    "@alert-info-text": "@state-info-text",
-    "@alert-info-border": "@state-info-border",
-    "@alert-warning-bg": "@state-warning-bg",
-    "@alert-warning-text": "@state-warning-text",
-    "@alert-warning-border": "@state-warning-border",
-    "@alert-danger-bg": "@state-danger-bg",
-    "@alert-danger-text": "@state-danger-text",
-    "@alert-danger-border": "@state-danger-border",
-    "@progress-bg": "#f5f5f5",
-    "@progress-bar-color": "#fff",
-    "@progress-border-radius": "@border-radius-base",
-    "@progress-bar-bg": "@brand-primary",
-    "@progress-bar-success-bg": "@brand-success",
-    "@progress-bar-warning-bg": "@brand-warning",
-    "@progress-bar-danger-bg": "@brand-danger",
-    "@progress-bar-info-bg": "@brand-info",
-    "@list-group-bg": "#fff",
-    "@list-group-border": "#ddd",
-    "@list-group-border-radius": "@border-radius-base",
-    "@list-group-hover-bg": "#f5f5f5",
-    "@list-group-active-color": "@component-active-color",
-    "@list-group-active-bg": "@component-active-bg",
-    "@list-group-active-border": "@list-group-active-bg",
-    "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
-    "@list-group-disabled-color": "@gray-light",
-    "@list-group-disabled-bg": "@gray-lighter",
-    "@list-group-disabled-text-color": "@list-group-disabled-color",
-    "@list-group-link-color": "#555",
-    "@list-group-link-hover-color": "@list-group-link-color",
-    "@list-group-link-heading-color": "#333",
-    "@panel-bg": "#fff",
-    "@panel-body-padding": "15px",
-    "@panel-heading-padding": "10px 15px",
-    "@panel-footer-padding": "@panel-heading-padding",
-    "@panel-border-radius": "@border-radius-base",
-    "@panel-inner-border": "#ddd",
-    "@panel-footer-bg": "#f5f5f5",
-    "@panel-default-text": "@gray-dark",
-    "@panel-default-border": "#ddd",
-    "@panel-default-heading-bg": "#f5f5f5",
-    "@panel-primary-text": "#fff",
-    "@panel-primary-border": "@brand-primary",
-    "@panel-primary-heading-bg": "@brand-primary",
-    "@panel-success-text": "@state-success-text",
-    "@panel-success-border": "@state-success-border",
-    "@panel-success-heading-bg": "@state-success-bg",
-    "@panel-info-text": "@state-info-text",
-    "@panel-info-border": "@state-info-border",
-    "@panel-info-heading-bg": "@state-info-bg",
-    "@panel-warning-text": "@state-warning-text",
-    "@panel-warning-border": "@state-warning-border",
-    "@panel-warning-heading-bg": "@state-warning-bg",
-    "@panel-danger-text": "@state-danger-text",
-    "@panel-danger-border": "@state-danger-border",
-    "@panel-danger-heading-bg": "@state-danger-bg",
-    "@thumbnail-padding": "4px",
-    "@thumbnail-bg": "@body-bg",
-    "@thumbnail-border": "#ddd",
-    "@thumbnail-border-radius": "@border-radius-base",
-    "@thumbnail-caption-color": "@text-color",
-    "@thumbnail-caption-padding": "9px",
-    "@well-bg": "#f5f5f5",
-    "@well-border": "darken(@well-bg, 7%)",
-    "@badge-color": "#fff",
-    "@badge-link-hover-color": "#fff",
-    "@badge-bg": "@gray-light",
-    "@badge-active-color": "@link-color",
-    "@badge-active-bg": "#fff",
-    "@badge-font-weight": "bold",
-    "@badge-line-height": "1",
-    "@badge-border-radius": "10px",
-    "@breadcrumb-padding-vertical": "8px",
-    "@breadcrumb-padding-horizontal": "15px",
-    "@breadcrumb-bg": "#f5f5f5",
-    "@breadcrumb-color": "#ccc",
-    "@breadcrumb-active-color": "@gray-light",
-    "@breadcrumb-separator": "\"/\"",
-    "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)",
-    "@carousel-control-color": "#fff",
-    "@carousel-control-width": "15%",
-    "@carousel-control-opacity": ".5",
-    "@carousel-control-font-size": "20px",
-    "@carousel-indicator-active-bg": "#fff",
-    "@carousel-indicator-border-color": "#fff",
-    "@carousel-caption-color": "#fff",
-    "@close-font-weight": "bold",
-    "@close-color": "#000",
-    "@close-text-shadow": "0 1px 0 #fff",
-    "@code-color": "#c7254e",
-    "@code-bg": "#f9f2f4",
-    "@kbd-color": "#fff",
-    "@kbd-bg": "#333",
-    "@pre-bg": "#f5f5f5",
-    "@pre-color": "@gray-dark",
-    "@pre-border-color": "#ccc",
-    "@pre-scrollable-max-height": "340px",
-    "@component-offset-horizontal": "180px",
-    "@text-muted": "@gray-light",
-    "@abbr-border-color": "@gray-light",
-    "@headings-small-color": "@gray-light",
-    "@blockquote-small-color": "@gray-light",
-    "@blockquote-font-size": "(@font-size-base * 1.25)",
-    "@blockquote-border-color": "@gray-lighter",
-    "@page-header-border-color": "@gray-lighter",
-    "@dl-horizontal-offset": "@component-offset-horizontal",
-    "@dl-horizontal-breakpoint": "@grid-float-breakpoint",
-    "@hr-border": "@gray-lighter"
-  },
-  "css": [
-    "print.less",
-    "type.less",
-    "code.less",
-    "grid.less",
-    "tables.less",
-    "forms.less",
-    "buttons.less",
-    "responsive-utilities.less",
-    "button-groups.less",
-    "input-groups.less",
-    "navs.less",
-    "navbar.less",
-    "pagination.less",
-    "pager.less",
-    "labels.less",
-    "badges.less",
-    "thumbnails.less",
-    "alerts.less",
-    "progress-bars.less",
-    "media.less",
-    "list-group.less",
-    "panels.less",
-    "responsive-embed.less",
-    "close.less",
-    "component-animations.less",
-    "dropdowns.less",
-    "tooltip.less",
-    "popovers.less",
-    "modals.less"
-  ],
-  "js": [
-    "alert.js",
-    "dropdown.js",
-    "modal.js",
-    "tooltip.js",
-    "popover.js",
-    "tab.js",
-    "collapse.js",
-    "transition.js"
-  ],
-  "customizerUrl": "http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9"
-}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap-theme.css b/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap-theme.css
deleted file mode 100644
index b74b12e..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap-theme.css
+++ /dev/null
@@ -1,614 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * 
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9)
- * Config saved to config.json and https://gist.github.com/cda9ed63f8b65c2a175b3ce0f640dcf9
- */
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.btn-default:active,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active,
-.btn-default.active,
-.btn-primary.active,
-.btn-success.active,
-.btn-info.active,
-.btn-warning.active,
-.btn-danger.active {
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-}
-.btn-default.disabled,
-.btn-primary.disabled,
-.btn-success.disabled,
-.btn-info.disabled,
-.btn-warning.disabled,
-.btn-danger.disabled,
-.btn-default[disabled],
-.btn-primary[disabled],
-.btn-success[disabled],
-.btn-info[disabled],
-.btn-warning[disabled],
-.btn-danger[disabled],
-fieldset[disabled] .btn-default,
-fieldset[disabled] .btn-primary,
-fieldset[disabled] .btn-success,
-fieldset[disabled] .btn-info,
-fieldset[disabled] .btn-warning,
-fieldset[disabled] .btn-danger {
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-.btn-default .badge,
-.btn-primary .badge,
-.btn-success .badge,
-.btn-info .badge,
-.btn-warning .badge,
-.btn-danger .badge {
-  text-shadow: none;
-}
-.btn:active,
-.btn.active {
-  background-image: none;
-}
-.btn-default {
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0));
-  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #dbdbdb;
-  text-shadow: 0 1px 0 #fff;
-  border-color: #ccc;
-}
-.btn-default:hover,
-.btn-default:focus {
-  background-color: #e0e0e0;
-  background-position: 0 -15px;
-}
-.btn-default:active,
-.btn-default.active {
-  background-color: #e0e0e0;
-  border-color: #dbdbdb;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
-  background-color: #e0e0e0;
-  background-image: none;
-}
-.btn-primary {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
-  background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
-  background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #245580;
-}
-.btn-primary:hover,
-.btn-primary:focus {
-  background-color: #265a88;
-  background-position: 0 -15px;
-}
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #265a88;
-  border-color: #245580;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
-  background-color: #265a88;
-  background-image: none;
-}
-.btn-success {
-  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
-  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
-  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #3e8f3e;
-}
-.btn-success:hover,
-.btn-success:focus {
-  background-color: #419641;
-  background-position: 0 -15px;
-}
-.btn-success:active,
-.btn-success.active {
-  background-color: #419641;
-  border-color: #3e8f3e;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
-  background-color: #419641;
-  background-image: none;
-}
-.btn-info {
-  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
-  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
-  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #28a4c9;
-}
-.btn-info:hover,
-.btn-info:focus {
-  background-color: #2aabd2;
-  background-position: 0 -15px;
-}
-.btn-info:active,
-.btn-info.active {
-  background-color: #2aabd2;
-  border-color: #28a4c9;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
-  background-color: #2aabd2;
-  background-image: none;
-}
-.btn-warning {
-  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
-  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
-  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #e38d13;
-}
-.btn-warning:hover,
-.btn-warning:focus {
-  background-color: #eb9316;
-  background-position: 0 -15px;
-}
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #eb9316;
-  border-color: #e38d13;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
-  background-color: #eb9316;
-  background-image: none;
-}
-.btn-danger {
-  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
-  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
-  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #b92c28;
-}
-.btn-danger:hover,
-.btn-danger:focus {
-  background-color: #c12e2a;
-  background-position: 0 -15px;
-}
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #c12e2a;
-  border-color: #b92c28;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
-  background-color: #c12e2a;
-  background-image: none;
-}
-.thumbnail,
-.img-thumbnail {
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
-  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
-  background-color: #e8e8e8;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
-  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
-  background-color: #2e6da4;
-}
-.navbar-default {
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));
-  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .active > a {
-  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
-  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
-  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
-  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
-}
-.navbar-brand,
-.navbar-nav > li > a {
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
-}
-.navbar-inverse {
-  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);
-  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222));
-  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  border-radius: 4px;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .active > a {
-  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
-  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
-  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
-  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
-  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
-}
-.navbar-inverse .navbar-brand,
-.navbar-inverse .navbar-nav > li > a {
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  border-radius: 0;
-}
-@media (max-width: 767px) {
-  .navbar .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #fff;
-    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-    background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
-    background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
-  }
-}
-.alert {
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.alert-success {
-  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
-  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
-  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
-  border-color: #b2dba1;
-}
-.alert-info {
-  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
-  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
-  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
-  border-color: #9acfea;
-}
-.alert-warning {
-  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
-  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
-  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
-  border-color: #f5e79e;
-}
-.alert-danger {
-  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
-  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
-  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
-  border-color: #dca7a7;
-}
-.progress {
-  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
-  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
-  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
-}
-.progress-bar {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
-  background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
-  background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
-}
-.progress-bar-success {
-  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
-  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
-  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
-}
-.progress-bar-info {
-  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
-  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
-  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
-}
-.progress-bar-warning {
-  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
-  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
-  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
-}
-.progress-bar-danger {
-  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
-  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
-  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
-}
-.progress-bar-striped {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.list-group {
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  text-shadow: 0 -1px 0 #286090;
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
-  background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
-  background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
-  border-color: #2b669a;
-}
-.list-group-item.active .badge,
-.list-group-item.active:hover .badge,
-.list-group-item.active:focus .badge {
-  text-shadow: none;
-}
-.panel {
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.panel-default > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
-  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
-}
-.panel-primary > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
-  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
-}
-.panel-success > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
-  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
-  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
-}
-.panel-info > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
-  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
-  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
-}
-.panel-warning > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
-  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
-  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
-}
-.panel-danger > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
-  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
-  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
-}
-.well {
-  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
-  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
-  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
-  border-color: #dcdcdc;
-  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
-  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
-}
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap-theme.min.css b/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap-theme.min.css
deleted file mode 100644
index 280e774..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap-theme.min.css
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * 
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9)
- * Config saved to config.json and https://gist.github.com/cda9ed63f8b65c2a175b3ce0f640dcf9
- *//*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default.disabled,.btn-primary.disabled,.btn-success.disabled,.btn-info.disabled,.btn-warning.disabled,.btn-danger.disabled,.btn-default[disabled],.btn-primary[disabled],.btn-success[disabled],.btn-info[disabled],.btn-warning[disabled],.btn-danger[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-info,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-danger{-webkit-box-shadow:none;box-shadow:none}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-o-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#265a88));background-image:linear-gradient(to bottom, #337ab7 0, #265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#419641));background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#2aabd2));background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#eb9316));background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c12e2a));background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-o-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-o-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-o-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#286090));background-image:linear-gradient(to bottom, #337ab7 0, #286090 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2b669a));background-image:linear-gradient(to bottom, #337ab7 0, #2b669a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap.css b/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap.css
deleted file mode 100644
index feb5cc4..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap.css
+++ /dev/null
@@ -1,5666 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * 
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9)
- * Config saved to config.json and https://gist.github.com/cda9ed63f8b65c2a175b3ce0f640dcf9
- */
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-html {
-  font-family: sans-serif;
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-}
-body {
-  margin: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
-  display: block;
-}
-audio,
-canvas,
-progress,
-video {
-  display: inline-block;
-  vertical-align: baseline;
-}
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-[hidden],
-template {
-  display: none;
-}
-a {
-  background-color: transparent;
-}
-a:active,
-a:hover {
-  outline: 0;
-}
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-b,
-strong {
-  font-weight: bold;
-}
-dfn {
-  font-style: italic;
-}
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-mark {
-  background: #ff0;
-  color: #000;
-}
-small {
-  font-size: 80%;
-}
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-sup {
-  top: -0.5em;
-}
-sub {
-  bottom: -0.25em;
-}
-img {
-  border: 0;
-}
-svg:not(:root) {
-  overflow: hidden;
-}
-figure {
-  margin: 1em 40px;
-}
-hr {
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-  height: 0;
-}
-pre {
-  overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-button {
-  overflow: visible;
-}
-button,
-select {
-  text-transform: none;
-}
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button;
-  cursor: pointer;
-}
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-input {
-  line-height: normal;
-}
-input[type="checkbox"],
-input[type="radio"] {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  padding: 0;
-}
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-appearance: textfield;
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-legend {
-  border: 0;
-  padding: 0;
-}
-textarea {
-  overflow: auto;
-}
-optgroup {
-  font-weight: bold;
-}
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-td,
-th {
-  padding: 0;
-}
-/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
-@media print {
-  *,
-  *:before,
-  *:after {
-    background: transparent !important;
-    color: #000 !important;
-    -webkit-box-shadow: none !important;
-            box-shadow: none !important;
-    text-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-  a[href^="#"]:after,
-  a[href^="javascript:"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-  .navbar {
-    display: none;
-  }
-  .btn > .caret,
-  .dropup > .btn > .caret {
-    border-top-color: #000 !important;
-  }
-  .label {
-    border: 1px solid #000;
-  }
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table td,
-  .table th {
-    background-color: #fff !important;
-  }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #ddd !important;
-  }
-}
-* {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-*:before,
-*:after {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-html {
-  font-size: 10px;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-body {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #333333;
-  background-color: #ffffff;
-}
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-a {
-  color: #337ab7;
-  text-decoration: none;
-}
-a:hover,
-a:focus {
-  color: #23527c;
-  text-decoration: underline;
-}
-a:focus {
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-figure {
-  margin: 0;
-}
-img {
-  vertical-align: middle;
-}
-.img-responsive,
-.thumbnail > img,
-.thumbnail a > img {
-  display: block;
-  max-width: 100%;
-  height: auto;
-}
-.img-rounded {
-  border-radius: 6px;
-}
-.img-thumbnail {
-  padding: 4px;
-  line-height: 1.42857143;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-  -webkit-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-  display: inline-block;
-  max-width: 100%;
-  height: auto;
-}
-.img-circle {
-  border-radius: 50%;
-}
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-}
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  margin: -1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0);
-  border: 0;
-}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  margin: 0;
-  overflow: visible;
-  clip: auto;
-}
-[role="button"] {
-  cursor: pointer;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
-  font-family: inherit;
-  font-weight: 500;
-  line-height: 1.1;
-  color: inherit;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small,
-.h1 small,
-.h2 small,
-.h3 small,
-.h4 small,
-.h5 small,
-.h6 small,
-h1 .small,
-h2 .small,
-h3 .small,
-h4 .small,
-h5 .small,
-h6 .small,
-.h1 .small,
-.h2 .small,
-.h3 .small,
-.h4 .small,
-.h5 .small,
-.h6 .small {
-  font-weight: normal;
-  line-height: 1;
-  color: #777777;
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
-  margin-top: 20px;
-  margin-bottom: 10px;
-}
-h1 small,
-.h1 small,
-h2 small,
-.h2 small,
-h3 small,
-.h3 small,
-h1 .small,
-.h1 .small,
-h2 .small,
-.h2 .small,
-h3 .small,
-.h3 .small {
-  font-size: 65%;
-}
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-h4 small,
-.h4 small,
-h5 small,
-.h5 small,
-h6 small,
-.h6 small,
-h4 .small,
-.h4 .small,
-h5 .small,
-.h5 .small,
-h6 .small,
-.h6 .small {
-  font-size: 75%;
-}
-h1,
-.h1 {
-  font-size: 36px;
-}
-h2,
-.h2 {
-  font-size: 30px;
-}
-h3,
-.h3 {
-  font-size: 24px;
-}
-h4,
-.h4 {
-  font-size: 18px;
-}
-h5,
-.h5 {
-  font-size: 14px;
-}
-h6,
-.h6 {
-  font-size: 12px;
-}
-p {
-  margin: 0 0 10px;
-}
-.lead {
-  margin-bottom: 20px;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 1.4;
-}
-@media (min-width: 768px) {
-  .lead {
-    font-size: 21px;
-  }
-}
-small,
-.small {
-  font-size: 85%;
-}
-mark,
-.mark {
-  background-color: #fcf8e3;
-  padding: .2em;
-}
-.text-left {
-  text-align: left;
-}
-.text-right {
-  text-align: right;
-}
-.text-center {
-  text-align: center;
-}
-.text-justify {
-  text-align: justify;
-}
-.text-nowrap {
-  white-space: nowrap;
-}
-.text-lowercase {
-  text-transform: lowercase;
-}
-.text-uppercase {
-  text-transform: uppercase;
-}
-.text-capitalize {
-  text-transform: capitalize;
-}
-.text-muted {
-  color: #777777;
-}
-.text-primary {
-  color: #337ab7;
-}
-a.text-primary:hover,
-a.text-primary:focus {
-  color: #286090;
-}
-.text-success {
-  color: #3c763d;
-}
-a.text-success:hover,
-a.text-success:focus {
-  color: #2b542c;
-}
-.text-info {
-  color: #31708f;
-}
-a.text-info:hover,
-a.text-info:focus {
-  color: #245269;
-}
-.text-warning {
-  color: #8a6d3b;
-}
-a.text-warning:hover,
-a.text-warning:focus {
-  color: #66512c;
-}
-.text-danger {
-  color: #a94442;
-}
-a.text-danger:hover,
-a.text-danger:focus {
-  color: #843534;
-}
-.bg-primary {
-  color: #fff;
-  background-color: #337ab7;
-}
-a.bg-primary:hover,
-a.bg-primary:focus {
-  background-color: #286090;
-}
-.bg-success {
-  background-color: #dff0d8;
-}
-a.bg-success:hover,
-a.bg-success:focus {
-  background-color: #c1e2b3;
-}
-.bg-info {
-  background-color: #d9edf7;
-}
-a.bg-info:hover,
-a.bg-info:focus {
-  background-color: #afd9ee;
-}
-.bg-warning {
-  background-color: #fcf8e3;
-}
-a.bg-warning:hover,
-a.bg-warning:focus {
-  background-color: #f7ecb5;
-}
-.bg-danger {
-  background-color: #f2dede;
-}
-a.bg-danger:hover,
-a.bg-danger:focus {
-  background-color: #e4b9b9;
-}
-.page-header {
-  padding-bottom: 9px;
-  margin: 40px 0 20px;
-  border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: 10px;
-}
-ul ul,
-ol ul,
-ul ol,
-ol ol {
-  margin-bottom: 0;
-}
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-.list-inline {
-  padding-left: 0;
-  list-style: none;
-  margin-left: -5px;
-}
-.list-inline > li {
-  display: inline-block;
-  padding-left: 5px;
-  padding-right: 5px;
-}
-dl {
-  margin-top: 0;
-  margin-bottom: 20px;
-}
-dt,
-dd {
-  line-height: 1.42857143;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0;
-}
-@media (min-width: 768px) {
-  .dl-horizontal dt {
-    float: left;
-    width: 160px;
-    clear: left;
-    text-align: right;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-  .dl-horizontal dd {
-    margin-left: 180px;
-  }
-}
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #777777;
-}
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-blockquote {
-  padding: 10px 20px;
-  margin: 0 0 20px;
-  font-size: 17.5px;
-  border-left: 5px solid #eeeeee;
-}
-blockquote p:last-child,
-blockquote ul:last-child,
-blockquote ol:last-child {
-  margin-bottom: 0;
-}
-blockquote footer,
-blockquote small,
-blockquote .small {
-  display: block;
-  font-size: 80%;
-  line-height: 1.42857143;
-  color: #777777;
-}
-blockquote footer:before,
-blockquote small:before,
-blockquote .small:before {
-  content: '\2014 \00A0';
-}
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-  text-align: right;
-}
-.blockquote-reverse footer:before,
-blockquote.pull-right footer:before,
-.blockquote-reverse small:before,
-blockquote.pull-right small:before,
-.blockquote-reverse .small:before,
-blockquote.pull-right .small:before {
-  content: '';
-}
-.blockquote-reverse footer:after,
-blockquote.pull-right footer:after,
-.blockquote-reverse small:after,
-blockquote.pull-right small:after,
-.blockquote-reverse .small:after,
-blockquote.pull-right .small:after {
-  content: '\00A0 \2014';
-}
-address {
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 1.42857143;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
-}
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #c7254e;
-  background-color: #f9f2f4;
-  border-radius: 4px;
-}
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #ffffff;
-  background-color: #333333;
-  border-radius: 3px;
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-kbd kbd {
-  padding: 0;
-  font-size: 100%;
-  font-weight: bold;
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 1.42857143;
-  word-break: break-all;
-  word-wrap: break-word;
-  color: #333333;
-  background-color: #f5f5f5;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-}
-pre code {
-  padding: 0;
-  font-size: inherit;
-  color: inherit;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border-radius: 0;
-}
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-@media (min-width: 768px) {
-  .container {
-    width: 750px;
-  }
-}
-@media (min-width: 992px) {
-  .container {
-    width: 970px;
-  }
-}
-@media (min-width: 1200px) {
-  .container {
-    width: 1170px;
-  }
-}
-.container-fluid {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.row {
-  margin-left: -15px;
-  margin-right: -15px;
-}
-.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
-  position: relative;
-  min-height: 1px;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
-  float: left;
-}
-.col-xs-12 {
-  width: 100%;
-}
-.col-xs-11 {
-  width: 91.66666667%;
-}
-.col-xs-10 {
-  width: 83.33333333%;
-}
-.col-xs-9 {
-  width: 75%;
-}
-.col-xs-8 {
-  width: 66.66666667%;
-}
-.col-xs-7 {
-  width: 58.33333333%;
-}
-.col-xs-6 {
-  width: 50%;
-}
-.col-xs-5 {
-  width: 41.66666667%;
-}
-.col-xs-4 {
-  width: 33.33333333%;
-}
-.col-xs-3 {
-  width: 25%;
-}
-.col-xs-2 {
-  width: 16.66666667%;
-}
-.col-xs-1 {
-  width: 8.33333333%;
-}
-.col-xs-pull-12 {
-  right: 100%;
-}
-.col-xs-pull-11 {
-  right: 91.66666667%;
-}
-.col-xs-pull-10 {
-  right: 83.33333333%;
-}
-.col-xs-pull-9 {
-  right: 75%;
-}
-.col-xs-pull-8 {
-  right: 66.66666667%;
-}
-.col-xs-pull-7 {
-  right: 58.33333333%;
-}
-.col-xs-pull-6 {
-  right: 50%;
-}
-.col-xs-pull-5 {
-  right: 41.66666667%;
-}
-.col-xs-pull-4 {
-  right: 33.33333333%;
-}
-.col-xs-pull-3 {
-  right: 25%;
-}
-.col-xs-pull-2 {
-  right: 16.66666667%;
-}
-.col-xs-pull-1 {
-  right: 8.33333333%;
-}
-.col-xs-pull-0 {
-  right: auto;
-}
-.col-xs-push-12 {
-  left: 100%;
-}
-.col-xs-push-11 {
-  left: 91.66666667%;
-}
-.col-xs-push-10 {
-  left: 83.33333333%;
-}
-.col-xs-push-9 {
-  left: 75%;
-}
-.col-xs-push-8 {
-  left: 66.66666667%;
-}
-.col-xs-push-7 {
-  left: 58.33333333%;
-}
-.col-xs-push-6 {
-  left: 50%;
-}
-.col-xs-push-5 {
-  left: 41.66666667%;
-}
-.col-xs-push-4 {
-  left: 33.33333333%;
-}
-.col-xs-push-3 {
-  left: 25%;
-}
-.col-xs-push-2 {
-  left: 16.66666667%;
-}
-.col-xs-push-1 {
-  left: 8.33333333%;
-}
-.col-xs-push-0 {
-  left: auto;
-}
-.col-xs-offset-12 {
-  margin-left: 100%;
-}
-.col-xs-offset-11 {
-  margin-left: 91.66666667%;
-}
-.col-xs-offset-10 {
-  margin-left: 83.33333333%;
-}
-.col-xs-offset-9 {
-  margin-left: 75%;
-}
-.col-xs-offset-8 {
-  margin-left: 66.66666667%;
-}
-.col-xs-offset-7 {
-  margin-left: 58.33333333%;
-}
-.col-xs-offset-6 {
-  margin-left: 50%;
-}
-.col-xs-offset-5 {
-  margin-left: 41.66666667%;
-}
-.col-xs-offset-4 {
-  margin-left: 33.33333333%;
-}
-.col-xs-offset-3 {
-  margin-left: 25%;
-}
-.col-xs-offset-2 {
-  margin-left: 16.66666667%;
-}
-.col-xs-offset-1 {
-  margin-left: 8.33333333%;
-}
-.col-xs-offset-0 {
-  margin-left: 0%;
-}
-@media (min-width: 768px) {
-  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
-    float: left;
-  }
-  .col-sm-12 {
-    width: 100%;
-  }
-  .col-sm-11 {
-    width: 91.66666667%;
-  }
-  .col-sm-10 {
-    width: 83.33333333%;
-  }
-  .col-sm-9 {
-    width: 75%;
-  }
-  .col-sm-8 {
-    width: 66.66666667%;
-  }
-  .col-sm-7 {
-    width: 58.33333333%;
-  }
-  .col-sm-6 {
-    width: 50%;
-  }
-  .col-sm-5 {
-    width: 41.66666667%;
-  }
-  .col-sm-4 {
-    width: 33.33333333%;
-  }
-  .col-sm-3 {
-    width: 25%;
-  }
-  .col-sm-2 {
-    width: 16.66666667%;
-  }
-  .col-sm-1 {
-    width: 8.33333333%;
-  }
-  .col-sm-pull-12 {
-    right: 100%;
-  }
-  .col-sm-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-sm-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-sm-pull-9 {
-    right: 75%;
-  }
-  .col-sm-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-sm-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-sm-pull-6 {
-    right: 50%;
-  }
-  .col-sm-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-sm-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-sm-pull-3 {
-    right: 25%;
-  }
-  .col-sm-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-sm-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-sm-pull-0 {
-    right: auto;
-  }
-  .col-sm-push-12 {
-    left: 100%;
-  }
-  .col-sm-push-11 {
-    left: 91.66666667%;
-  }
-  .col-sm-push-10 {
-    left: 83.33333333%;
-  }
-  .col-sm-push-9 {
-    left: 75%;
-  }
-  .col-sm-push-8 {
-    left: 66.66666667%;
-  }
-  .col-sm-push-7 {
-    left: 58.33333333%;
-  }
-  .col-sm-push-6 {
-    left: 50%;
-  }
-  .col-sm-push-5 {
-    left: 41.66666667%;
-  }
-  .col-sm-push-4 {
-    left: 33.33333333%;
-  }
-  .col-sm-push-3 {
-    left: 25%;
-  }
-  .col-sm-push-2 {
-    left: 16.66666667%;
-  }
-  .col-sm-push-1 {
-    left: 8.33333333%;
-  }
-  .col-sm-push-0 {
-    left: auto;
-  }
-  .col-sm-offset-12 {
-    margin-left: 100%;
-  }
-  .col-sm-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-sm-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-sm-offset-9 {
-    margin-left: 75%;
-  }
-  .col-sm-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-sm-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-sm-offset-6 {
-    margin-left: 50%;
-  }
-  .col-sm-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-sm-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-sm-offset-3 {
-    margin-left: 25%;
-  }
-  .col-sm-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-sm-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-sm-offset-0 {
-    margin-left: 0%;
-  }
-}
-@media (min-width: 992px) {
-  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
-    float: left;
-  }
-  .col-md-12 {
-    width: 100%;
-  }
-  .col-md-11 {
-    width: 91.66666667%;
-  }
-  .col-md-10 {
-    width: 83.33333333%;
-  }
-  .col-md-9 {
-    width: 75%;
-  }
-  .col-md-8 {
-    width: 66.66666667%;
-  }
-  .col-md-7 {
-    width: 58.33333333%;
-  }
-  .col-md-6 {
-    width: 50%;
-  }
-  .col-md-5 {
-    width: 41.66666667%;
-  }
-  .col-md-4 {
-    width: 33.33333333%;
-  }
-  .col-md-3 {
-    width: 25%;
-  }
-  .col-md-2 {
-    width: 16.66666667%;
-  }
-  .col-md-1 {
-    width: 8.33333333%;
-  }
-  .col-md-pull-12 {
-    right: 100%;
-  }
-  .col-md-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-md-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-md-pull-9 {
-    right: 75%;
-  }
-  .col-md-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-md-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-md-pull-6 {
-    right: 50%;
-  }
-  .col-md-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-md-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-md-pull-3 {
-    right: 25%;
-  }
-  .col-md-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-md-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-md-pull-0 {
-    right: auto;
-  }
-  .col-md-push-12 {
-    left: 100%;
-  }
-  .col-md-push-11 {
-    left: 91.66666667%;
-  }
-  .col-md-push-10 {
-    left: 83.33333333%;
-  }
-  .col-md-push-9 {
-    left: 75%;
-  }
-  .col-md-push-8 {
-    left: 66.66666667%;
-  }
-  .col-md-push-7 {
-    left: 58.33333333%;
-  }
-  .col-md-push-6 {
-    left: 50%;
-  }
-  .col-md-push-5 {
-    left: 41.66666667%;
-  }
-  .col-md-push-4 {
-    left: 33.33333333%;
-  }
-  .col-md-push-3 {
-    left: 25%;
-  }
-  .col-md-push-2 {
-    left: 16.66666667%;
-  }
-  .col-md-push-1 {
-    left: 8.33333333%;
-  }
-  .col-md-push-0 {
-    left: auto;
-  }
-  .col-md-offset-12 {
-    margin-left: 100%;
-  }
-  .col-md-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-md-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-md-offset-9 {
-    margin-left: 75%;
-  }
-  .col-md-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-md-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-md-offset-6 {
-    margin-left: 50%;
-  }
-  .col-md-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-md-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-md-offset-3 {
-    margin-left: 25%;
-  }
-  .col-md-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-md-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-md-offset-0 {
-    margin-left: 0%;
-  }
-}
-@media (min-width: 1200px) {
-  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
-    float: left;
-  }
-  .col-lg-12 {
-    width: 100%;
-  }
-  .col-lg-11 {
-    width: 91.66666667%;
-  }
-  .col-lg-10 {
-    width: 83.33333333%;
-  }
-  .col-lg-9 {
-    width: 75%;
-  }
-  .col-lg-8 {
-    width: 66.66666667%;
-  }
-  .col-lg-7 {
-    width: 58.33333333%;
-  }
-  .col-lg-6 {
-    width: 50%;
-  }
-  .col-lg-5 {
-    width: 41.66666667%;
-  }
-  .col-lg-4 {
-    width: 33.33333333%;
-  }
-  .col-lg-3 {
-    width: 25%;
-  }
-  .col-lg-2 {
-    width: 16.66666667%;
-  }
-  .col-lg-1 {
-    width: 8.33333333%;
-  }
-  .col-lg-pull-12 {
-    right: 100%;
-  }
-  .col-lg-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-lg-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-lg-pull-9 {
-    right: 75%;
-  }
-  .col-lg-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-lg-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-lg-pull-6 {
-    right: 50%;
-  }
-  .col-lg-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-lg-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-lg-pull-3 {
-    right: 25%;
-  }
-  .col-lg-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-lg-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-lg-pull-0 {
-    right: auto;
-  }
-  .col-lg-push-12 {
-    left: 100%;
-  }
-  .col-lg-push-11 {
-    left: 91.66666667%;
-  }
-  .col-lg-push-10 {
-    left: 83.33333333%;
-  }
-  .col-lg-push-9 {
-    left: 75%;
-  }
-  .col-lg-push-8 {
-    left: 66.66666667%;
-  }
-  .col-lg-push-7 {
-    left: 58.33333333%;
-  }
-  .col-lg-push-6 {
-    left: 50%;
-  }
-  .col-lg-push-5 {
-    left: 41.66666667%;
-  }
-  .col-lg-push-4 {
-    left: 33.33333333%;
-  }
-  .col-lg-push-3 {
-    left: 25%;
-  }
-  .col-lg-push-2 {
-    left: 16.66666667%;
-  }
-  .col-lg-push-1 {
-    left: 8.33333333%;
-  }
-  .col-lg-push-0 {
-    left: auto;
-  }
-  .col-lg-offset-12 {
-    margin-left: 100%;
-  }
-  .col-lg-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-lg-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-lg-offset-9 {
-    margin-left: 75%;
-  }
-  .col-lg-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-lg-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-lg-offset-6 {
-    margin-left: 50%;
-  }
-  .col-lg-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-lg-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-lg-offset-3 {
-    margin-left: 25%;
-  }
-  .col-lg-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-lg-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-lg-offset-0 {
-    margin-left: 0%;
-  }
-}
-table {
-  background-color: transparent;
-}
-caption {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  color: #777777;
-  text-align: left;
-}
-th {
-  text-align: left;
-}
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: 20px;
-}
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td {
-  padding: 8px;
-  line-height: 1.42857143;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-.table > thead > tr > th {
-  vertical-align: bottom;
-  border-bottom: 2px solid #dddddd;
-}
-.table > caption + thead > tr:first-child > th,
-.table > colgroup + thead > tr:first-child > th,
-.table > thead:first-child > tr:first-child > th,
-.table > caption + thead > tr:first-child > td,
-.table > colgroup + thead > tr:first-child > td,
-.table > thead:first-child > tr:first-child > td {
-  border-top: 0;
-}
-.table > tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-.table .table {
-  background-color: #ffffff;
-}
-.table-condensed > thead > tr > th,
-.table-condensed > tbody > tr > th,
-.table-condensed > tfoot > tr > th,
-.table-condensed > thead > tr > td,
-.table-condensed > tbody > tr > td,
-.table-condensed > tfoot > tr > td {
-  padding: 5px;
-}
-.table-bordered {
-  border: 1px solid #dddddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
-  border: 1px solid #dddddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > thead > tr > td {
-  border-bottom-width: 2px;
-}
-.table-striped > tbody > tr:nth-of-type(odd) {
-  background-color: #f9f9f9;
-}
-.table-hover > tbody > tr:hover {
-  background-color: #f5f5f5;
-}
-table col[class*="col-"] {
-  position: static;
-  float: none;
-  display: table-column;
-}
-table td[class*="col-"],
-table th[class*="col-"] {
-  position: static;
-  float: none;
-  display: table-cell;
-}
-.table > thead > tr > td.active,
-.table > tbody > tr > td.active,
-.table > tfoot > tr > td.active,
-.table > thead > tr > th.active,
-.table > tbody > tr > th.active,
-.table > tfoot > tr > th.active,
-.table > thead > tr.active > td,
-.table > tbody > tr.active > td,
-.table > tfoot > tr.active > td,
-.table > thead > tr.active > th,
-.table > tbody > tr.active > th,
-.table > tfoot > tr.active > th {
-  background-color: #f5f5f5;
-}
-.table-hover > tbody > tr > td.active:hover,
-.table-hover > tbody > tr > th.active:hover,
-.table-hover > tbody > tr.active:hover > td,
-.table-hover > tbody > tr:hover > .active,
-.table-hover > tbody > tr.active:hover > th {
-  background-color: #e8e8e8;
-}
-.table > thead > tr > td.success,
-.table > tbody > tr > td.success,
-.table > tfoot > tr > td.success,
-.table > thead > tr > th.success,
-.table > tbody > tr > th.success,
-.table > tfoot > tr > th.success,
-.table > thead > tr.success > td,
-.table > tbody > tr.success > td,
-.table > tfoot > tr.success > td,
-.table > thead > tr.success > th,
-.table > tbody > tr.success > th,
-.table > tfoot > tr.success > th {
-  background-color: #dff0d8;
-}
-.table-hover > tbody > tr > td.success:hover,
-.table-hover > tbody > tr > th.success:hover,
-.table-hover > tbody > tr.success:hover > td,
-.table-hover > tbody > tr:hover > .success,
-.table-hover > tbody > tr.success:hover > th {
-  background-color: #d0e9c6;
-}
-.table > thead > tr > td.info,
-.table > tbody > tr > td.info,
-.table > tfoot > tr > td.info,
-.table > thead > tr > th.info,
-.table > tbody > tr > th.info,
-.table > tfoot > tr > th.info,
-.table > thead > tr.info > td,
-.table > tbody > tr.info > td,
-.table > tfoot > tr.info > td,
-.table > thead > tr.info > th,
-.table > tbody > tr.info > th,
-.table > tfoot > tr.info > th {
-  background-color: #d9edf7;
-}
-.table-hover > tbody > tr > td.info:hover,
-.table-hover > tbody > tr > th.info:hover,
-.table-hover > tbody > tr.info:hover > td,
-.table-hover > tbody > tr:hover > .info,
-.table-hover > tbody > tr.info:hover > th {
-  background-color: #c4e3f3;
-}
-.table > thead > tr > td.warning,
-.table > tbody > tr > td.warning,
-.table > tfoot > tr > td.warning,
-.table > thead > tr > th.warning,
-.table > tbody > tr > th.warning,
-.table > tfoot > tr > th.warning,
-.table > thead > tr.warning > td,
-.table > tbody > tr.warning > td,
-.table > tfoot > tr.warning > td,
-.table > thead > tr.warning > th,
-.table > tbody > tr.warning > th,
-.table > tfoot > tr.warning > th {
-  background-color: #fcf8e3;
-}
-.table-hover > tbody > tr > td.warning:hover,
-.table-hover > tbody > tr > th.warning:hover,
-.table-hover > tbody > tr.warning:hover > td,
-.table-hover > tbody > tr:hover > .warning,
-.table-hover > tbody > tr.warning:hover > th {
-  background-color: #faf2cc;
-}
-.table > thead > tr > td.danger,
-.table > tbody > tr > td.danger,
-.table > tfoot > tr > td.danger,
-.table > thead > tr > th.danger,
-.table > tbody > tr > th.danger,
-.table > tfoot > tr > th.danger,
-.table > thead > tr.danger > td,
-.table > tbody > tr.danger > td,
-.table > tfoot > tr.danger > td,
-.table > thead > tr.danger > th,
-.table > tbody > tr.danger > th,
-.table > tfoot > tr.danger > th {
-  background-color: #f2dede;
-}
-.table-hover > tbody > tr > td.danger:hover,
-.table-hover > tbody > tr > th.danger:hover,
-.table-hover > tbody > tr.danger:hover > td,
-.table-hover > tbody > tr:hover > .danger,
-.table-hover > tbody > tr.danger:hover > th {
-  background-color: #ebcccc;
-}
-.table-responsive {
-  overflow-x: auto;
-  min-height: 0.01%;
-}
-@media screen and (max-width: 767px) {
-  .table-responsive {
-    width: 100%;
-    margin-bottom: 15px;
-    overflow-y: hidden;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-    border: 1px solid #dddddd;
-  }
-  .table-responsive > .table {
-    margin-bottom: 0;
-  }
-  .table-responsive > .table > thead > tr > th,
-  .table-responsive > .table > tbody > tr > th,
-  .table-responsive > .table > tfoot > tr > th,
-  .table-responsive > .table > thead > tr > td,
-  .table-responsive > .table > tbody > tr > td,
-  .table-responsive > .table > tfoot > tr > td {
-    white-space: nowrap;
-  }
-  .table-responsive > .table-bordered {
-    border: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:first-child,
-  .table-responsive > .table-bordered > tbody > tr > th:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-  .table-responsive > .table-bordered > thead > tr > td:first-child,
-  .table-responsive > .table-bordered > tbody > tr > td:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
-    border-left: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:last-child,
-  .table-responsive > .table-bordered > tbody > tr > th:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-  .table-responsive > .table-bordered > thead > tr > td:last-child,
-  .table-responsive > .table-bordered > tbody > tr > td:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
-    border-right: 0;
-  }
-  .table-responsive > .table-bordered > tbody > tr:last-child > th,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
-  .table-responsive > .table-bordered > tbody > tr:last-child > td,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
-    border-bottom: 0;
-  }
-}
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-  min-width: 0;
-}
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: inherit;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-label {
-  display: inline-block;
-  max-width: 100%;
-  margin-bottom: 5px;
-  font-weight: bold;
-}
-input[type="search"] {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9;
-  line-height: normal;
-}
-input[type="file"] {
-  display: block;
-}
-input[type="range"] {
-  display: block;
-  width: 100%;
-}
-select[multiple],
-select[size] {
-  height: auto;
-}
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-output {
-  display: block;
-  padding-top: 7px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555555;
-}
-.form-control {
-  display: block;
-  width: 100%;
-  height: 34px;
-  padding: 6px 12px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555555;
-  background-color: #ffffff;
-  background-image: none;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-}
-.form-control:focus {
-  border-color: #66afe9;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
-  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
-}
-.form-control::-moz-placeholder {
-  color: #999999;
-  opacity: 1;
-}
-.form-control:-ms-input-placeholder {
-  color: #999999;
-}
-.form-control::-webkit-input-placeholder {
-  color: #999999;
-}
-.form-control::-ms-expand {
-  border: 0;
-  background-color: transparent;
-}
-.form-control[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
-  background-color: #eeeeee;
-  opacity: 1;
-}
-.form-control[disabled],
-fieldset[disabled] .form-control {
-  cursor: not-allowed;
-}
-textarea.form-control {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-appearance: none;
-}
-@media screen and (-webkit-min-device-pixel-ratio: 0) {
-  input[type="date"].form-control,
-  input[type="time"].form-control,
-  input[type="datetime-local"].form-control,
-  input[type="month"].form-control {
-    line-height: 34px;
-  }
-  input[type="date"].input-sm,
-  input[type="time"].input-sm,
-  input[type="datetime-local"].input-sm,
-  input[type="month"].input-sm,
-  .input-group-sm input[type="date"],
-  .input-group-sm input[type="time"],
-  .input-group-sm input[type="datetime-local"],
-  .input-group-sm input[type="month"] {
-    line-height: 30px;
-  }
-  input[type="date"].input-lg,
-  input[type="time"].input-lg,
-  input[type="datetime-local"].input-lg,
-  input[type="month"].input-lg,
-  .input-group-lg input[type="date"],
-  .input-group-lg input[type="time"],
-  .input-group-lg input[type="datetime-local"],
-  .input-group-lg input[type="month"] {
-    line-height: 46px;
-  }
-}
-.form-group {
-  margin-bottom: 15px;
-}
-.radio,
-.checkbox {
-  position: relative;
-  display: block;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.radio label,
-.checkbox label {
-  min-height: 20px;
-  padding-left: 20px;
-  margin-bottom: 0;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  position: absolute;
-  margin-left: -20px;
-  margin-top: 4px \9;
-}
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px;
-}
-.radio-inline,
-.checkbox-inline {
-  position: relative;
-  display: inline-block;
-  padding-left: 20px;
-  margin-bottom: 0;
-  vertical-align: middle;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
-  margin-top: 0;
-  margin-left: 10px;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"].disabled,
-input[type="checkbox"].disabled,
-fieldset[disabled] input[type="radio"],
-fieldset[disabled] input[type="checkbox"] {
-  cursor: not-allowed;
-}
-.radio-inline.disabled,
-.checkbox-inline.disabled,
-fieldset[disabled] .radio-inline,
-fieldset[disabled] .checkbox-inline {
-  cursor: not-allowed;
-}
-.radio.disabled label,
-.checkbox.disabled label,
-fieldset[disabled] .radio label,
-fieldset[disabled] .checkbox label {
-  cursor: not-allowed;
-}
-.form-control-static {
-  padding-top: 7px;
-  padding-bottom: 7px;
-  margin-bottom: 0;
-  min-height: 34px;
-}
-.form-control-static.input-lg,
-.form-control-static.input-sm {
-  padding-left: 0;
-  padding-right: 0;
-}
-.input-sm {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-select.input-sm {
-  height: 30px;
-  line-height: 30px;
-}
-textarea.input-sm,
-select[multiple].input-sm {
-  height: auto;
-}
-.form-group-sm .form-control {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.form-group-sm select.form-control {
-  height: 30px;
-  line-height: 30px;
-}
-.form-group-sm textarea.form-control,
-.form-group-sm select[multiple].form-control {
-  height: auto;
-}
-.form-group-sm .form-control-static {
-  height: 30px;
-  min-height: 32px;
-  padding: 6px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-}
-.input-lg {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-select.input-lg {
-  height: 46px;
-  line-height: 46px;
-}
-textarea.input-lg,
-select[multiple].input-lg {
-  height: auto;
-}
-.form-group-lg .form-control {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-.form-group-lg select.form-control {
-  height: 46px;
-  line-height: 46px;
-}
-.form-group-lg textarea.form-control,
-.form-group-lg select[multiple].form-control {
-  height: auto;
-}
-.form-group-lg .form-control-static {
-  height: 46px;
-  min-height: 38px;
-  padding: 11px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-}
-.has-feedback {
-  position: relative;
-}
-.has-feedback .form-control {
-  padding-right: 42.5px;
-}
-.form-control-feedback {
-  position: absolute;
-  top: 0;
-  right: 0;
-  z-index: 2;
-  display: block;
-  width: 34px;
-  height: 34px;
-  line-height: 34px;
-  text-align: center;
-  pointer-events: none;
-}
-.input-lg + .form-control-feedback,
-.input-group-lg + .form-control-feedback,
-.form-group-lg .form-control + .form-control-feedback {
-  width: 46px;
-  height: 46px;
-  line-height: 46px;
-}
-.input-sm + .form-control-feedback,
-.input-group-sm + .form-control-feedback,
-.form-group-sm .form-control + .form-control-feedback {
-  width: 30px;
-  height: 30px;
-  line-height: 30px;
-}
-.has-success .help-block,
-.has-success .control-label,
-.has-success .radio,
-.has-success .checkbox,
-.has-success .radio-inline,
-.has-success .checkbox-inline,
-.has-success.radio label,
-.has-success.checkbox label,
-.has-success.radio-inline label,
-.has-success.checkbox-inline label {
-  color: #3c763d;
-}
-.has-success .form-control {
-  border-color: #3c763d;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-success .form-control:focus {
-  border-color: #2b542c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
-}
-.has-success .input-group-addon {
-  color: #3c763d;
-  border-color: #3c763d;
-  background-color: #dff0d8;
-}
-.has-success .form-control-feedback {
-  color: #3c763d;
-}
-.has-warning .help-block,
-.has-warning .control-label,
-.has-warning .radio,
-.has-warning .checkbox,
-.has-warning .radio-inline,
-.has-warning .checkbox-inline,
-.has-warning.radio label,
-.has-warning.checkbox label,
-.has-warning.radio-inline label,
-.has-warning.checkbox-inline label {
-  color: #8a6d3b;
-}
-.has-warning .form-control {
-  border-color: #8a6d3b;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-warning .form-control:focus {
-  border-color: #66512c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
-}
-.has-warning .input-group-addon {
-  color: #8a6d3b;
-  border-color: #8a6d3b;
-  background-color: #fcf8e3;
-}
-.has-warning .form-control-feedback {
-  color: #8a6d3b;
-}
-.has-error .help-block,
-.has-error .control-label,
-.has-error .radio,
-.has-error .checkbox,
-.has-error .radio-inline,
-.has-error .checkbox-inline,
-.has-error.radio label,
-.has-error.checkbox label,
-.has-error.radio-inline label,
-.has-error.checkbox-inline label {
-  color: #a94442;
-}
-.has-error .form-control {
-  border-color: #a94442;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-error .form-control:focus {
-  border-color: #843534;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
-}
-.has-error .input-group-addon {
-  color: #a94442;
-  border-color: #a94442;
-  background-color: #f2dede;
-}
-.has-error .form-control-feedback {
-  color: #a94442;
-}
-.has-feedback label ~ .form-control-feedback {
-  top: 25px;
-}
-.has-feedback label.sr-only ~ .form-control-feedback {
-  top: 0;
-}
-.help-block {
-  display: block;
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: #737373;
-}
-@media (min-width: 768px) {
-  .form-inline .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .form-inline .form-control-static {
-    display: inline-block;
-  }
-  .form-inline .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .form-inline .input-group .input-group-addon,
-  .form-inline .input-group .input-group-btn,
-  .form-inline .input-group .form-control {
-    width: auto;
-  }
-  .form-inline .input-group > .form-control {
-    width: 100%;
-  }
-  .form-inline .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio,
-  .form-inline .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio label,
-  .form-inline .checkbox label {
-    padding-left: 0;
-  }
-  .form-inline .radio input[type="radio"],
-  .form-inline .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .form-inline .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox,
-.form-horizontal .radio-inline,
-.form-horizontal .checkbox-inline {
-  margin-top: 0;
-  margin-bottom: 0;
-  padding-top: 7px;
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox {
-  min-height: 27px;
-}
-.form-horizontal .form-group {
-  margin-left: -15px;
-  margin-right: -15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .control-label {
-    text-align: right;
-    margin-bottom: 0;
-    padding-top: 7px;
-  }
-}
-.form-horizontal .has-feedback .form-control-feedback {
-  right: 15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-lg .control-label {
-    padding-top: 11px;
-    font-size: 18px;
-  }
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-sm .control-label {
-    padding-top: 6px;
-    font-size: 12px;
-  }
-}
-.btn {
-  display: inline-block;
-  margin-bottom: 0;
-  font-weight: normal;
-  text-align: center;
-  vertical-align: middle;
-  -ms-touch-action: manipulation;
-      touch-action: manipulation;
-  cursor: pointer;
-  background-image: none;
-  border: 1px solid transparent;
-  white-space: nowrap;
-  padding: 6px 12px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  border-radius: 4px;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.btn:focus,
-.btn:active:focus,
-.btn.active:focus,
-.btn.focus,
-.btn:active.focus,
-.btn.active.focus {
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.btn:hover,
-.btn:focus,
-.btn.focus {
-  color: #333333;
-  text-decoration: none;
-}
-.btn:active,
-.btn.active {
-  outline: 0;
-  background-image: none;
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-}
-.btn.disabled,
-.btn[disabled],
-fieldset[disabled] .btn {
-  cursor: not-allowed;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-a.btn.disabled,
-fieldset[disabled] a.btn {
-  pointer-events: none;
-}
-.btn-default {
-  color: #333333;
-  background-color: #ffffff;
-  border-color: #cccccc;
-}
-.btn-default:focus,
-.btn-default.focus {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #8c8c8c;
-}
-.btn-default:hover {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active:hover,
-.btn-default.active:hover,
-.open > .dropdown-toggle.btn-default:hover,
-.btn-default:active:focus,
-.btn-default.active:focus,
-.open > .dropdown-toggle.btn-default:focus,
-.btn-default:active.focus,
-.btn-default.active.focus,
-.open > .dropdown-toggle.btn-default.focus {
-  color: #333333;
-  background-color: #d4d4d4;
-  border-color: #8c8c8c;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  background-image: none;
-}
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus {
-  background-color: #ffffff;
-  border-color: #cccccc;
-}
-.btn-default .badge {
-  color: #ffffff;
-  background-color: #333333;
-}
-.btn-primary {
-  color: #ffffff;
-  background-color: #337ab7;
-  border-color: #2e6da4;
-}
-.btn-primary:focus,
-.btn-primary.focus {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #122b40;
-}
-.btn-primary:hover {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #204d74;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #204d74;
-}
-.btn-primary:active:hover,
-.btn-primary.active:hover,
-.open > .dropdown-toggle.btn-primary:hover,
-.btn-primary:active:focus,
-.btn-primary.active:focus,
-.open > .dropdown-toggle.btn-primary:focus,
-.btn-primary:active.focus,
-.btn-primary.active.focus,
-.open > .dropdown-toggle.btn-primary.focus {
-  color: #ffffff;
-  background-color: #204d74;
-  border-color: #122b40;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  background-image: none;
-}
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus {
-  background-color: #337ab7;
-  border-color: #2e6da4;
-}
-.btn-primary .badge {
-  color: #337ab7;
-  background-color: #ffffff;
-}
-.btn-success {
-  color: #ffffff;
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success:focus,
-.btn-success.focus {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #255625;
-}
-.btn-success:hover {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active:hover,
-.btn-success.active:hover,
-.open > .dropdown-toggle.btn-success:hover,
-.btn-success:active:focus,
-.btn-success.active:focus,
-.open > .dropdown-toggle.btn-success:focus,
-.btn-success:active.focus,
-.btn-success.active.focus,
-.open > .dropdown-toggle.btn-success.focus {
-  color: #ffffff;
-  background-color: #398439;
-  border-color: #255625;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  background-image: none;
-}
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus {
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success .badge {
-  color: #5cb85c;
-  background-color: #ffffff;
-}
-.btn-info {
-  color: #ffffff;
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info:focus,
-.btn-info.focus {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #1b6d85;
-}
-.btn-info:hover {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active:hover,
-.btn-info.active:hover,
-.open > .dropdown-toggle.btn-info:hover,
-.btn-info:active:focus,
-.btn-info.active:focus,
-.open > .dropdown-toggle.btn-info:focus,
-.btn-info:active.focus,
-.btn-info.active.focus,
-.open > .dropdown-toggle.btn-info.focus {
-  color: #ffffff;
-  background-color: #269abc;
-  border-color: #1b6d85;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  background-image: none;
-}
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus {
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info .badge {
-  color: #5bc0de;
-  background-color: #ffffff;
-}
-.btn-warning {
-  color: #ffffff;
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning:focus,
-.btn-warning.focus {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #985f0d;
-}
-.btn-warning:hover {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active:hover,
-.btn-warning.active:hover,
-.open > .dropdown-toggle.btn-warning:hover,
-.btn-warning:active:focus,
-.btn-warning.active:focus,
-.open > .dropdown-toggle.btn-warning:focus,
-.btn-warning:active.focus,
-.btn-warning.active.focus,
-.open > .dropdown-toggle.btn-warning.focus {
-  color: #ffffff;
-  background-color: #d58512;
-  border-color: #985f0d;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  background-image: none;
-}
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus {
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning .badge {
-  color: #f0ad4e;
-  background-color: #ffffff;
-}
-.btn-danger {
-  color: #ffffff;
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger:focus,
-.btn-danger.focus {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #761c19;
-}
-.btn-danger:hover {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active:hover,
-.btn-danger.active:hover,
-.open > .dropdown-toggle.btn-danger:hover,
-.btn-danger:active:focus,
-.btn-danger.active:focus,
-.open > .dropdown-toggle.btn-danger:focus,
-.btn-danger:active.focus,
-.btn-danger.active.focus,
-.open > .dropdown-toggle.btn-danger.focus {
-  color: #ffffff;
-  background-color: #ac2925;
-  border-color: #761c19;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  background-image: none;
-}
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus {
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger .badge {
-  color: #d9534f;
-  background-color: #ffffff;
-}
-.btn-link {
-  color: #337ab7;
-  font-weight: normal;
-  border-radius: 0;
-}
-.btn-link,
-.btn-link:active,
-.btn-link.active,
-.btn-link[disabled],
-fieldset[disabled] .btn-link {
-  background-color: transparent;
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-.btn-link,
-.btn-link:hover,
-.btn-link:focus,
-.btn-link:active {
-  border-color: transparent;
-}
-.btn-link:hover,
-.btn-link:focus {
-  color: #23527c;
-  text-decoration: underline;
-  background-color: transparent;
-}
-.btn-link[disabled]:hover,
-fieldset[disabled] .btn-link:hover,
-.btn-link[disabled]:focus,
-fieldset[disabled] .btn-link:focus {
-  color: #777777;
-  text-decoration: none;
-}
-.btn-lg,
-.btn-group-lg > .btn {
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-.btn-sm,
-.btn-group-sm > .btn {
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-xs,
-.btn-group-xs > .btn {
-  padding: 1px 5px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-block {
-  display: block;
-  width: 100%;
-}
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-  -o-transition: opacity 0.15s linear;
-  transition: opacity 0.15s linear;
-}
-.fade.in {
-  opacity: 1;
-}
-.collapse {
-  display: none;
-}
-.collapse.in {
-  display: block;
-}
-tr.collapse.in {
-  display: table-row;
-}
-tbody.collapse.in {
-  display: table-row-group;
-}
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  -webkit-transition-property: height, visibility;
-  -o-transition-property: height, visibility;
-     transition-property: height, visibility;
-  -webkit-transition-duration: 0.35s;
-  -o-transition-duration: 0.35s;
-     transition-duration: 0.35s;
-  -webkit-transition-timing-function: ease;
-  -o-transition-timing-function: ease;
-     transition-timing-function: ease;
-}
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 2px;
-  vertical-align: middle;
-  border-top: 4px dashed;
-  border-top: 4px solid \9;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-}
-.dropup,
-.dropdown {
-  position: relative;
-}
-.dropdown-toggle:focus {
-  outline: 0;
-}
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  font-size: 14px;
-  text-align: left;
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 4px;
-  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
-  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-}
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-.dropdown-menu .divider {
-  height: 1px;
-  margin: 9px 0;
-  overflow: hidden;
-  background-color: #e5e5e5;
-}
-.dropdown-menu > li > a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 1.42857143;
-  color: #333333;
-  white-space: nowrap;
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  text-decoration: none;
-  color: #262626;
-  background-color: #f5f5f5;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  color: #ffffff;
-  text-decoration: none;
-  outline: 0;
-  background-color: #337ab7;
-}
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  color: #777777;
-}
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  text-decoration: none;
-  background-color: transparent;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  cursor: not-allowed;
-}
-.open > .dropdown-menu {
-  display: block;
-}
-.open > a {
-  outline: 0;
-}
-.dropdown-menu-right {
-  left: auto;
-  right: 0;
-}
-.dropdown-menu-left {
-  left: 0;
-  right: auto;
-}
-.dropdown-header {
-  display: block;
-  padding: 3px 20px;
-  font-size: 12px;
-  line-height: 1.42857143;
-  color: #777777;
-  white-space: nowrap;
-}
-.dropdown-backdrop {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  top: 0;
-  z-index: 990;
-}
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px dashed;
-  border-bottom: 4px solid \9;
-  content: "";
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 2px;
-}
-@media (min-width: 768px) {
-  .navbar-right .dropdown-menu {
-    left: auto;
-    right: 0;
-  }
-  .navbar-right .dropdown-menu-left {
-    left: 0;
-    right: auto;
-  }
-}
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-}
-.btn-group > .btn,
-.btn-group-vertical > .btn {
-  position: relative;
-  float: left;
-}
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group-vertical > .btn:focus,
-.btn-group > .btn:active,
-.btn-group-vertical > .btn:active,
-.btn-group > .btn.active,
-.btn-group-vertical > .btn.active {
-  z-index: 2;
-}
-.btn-group .btn + .btn,
-.btn-group .btn + .btn-group,
-.btn-group .btn-group + .btn,
-.btn-group .btn-group + .btn-group {
-  margin-left: -1px;
-}
-.btn-toolbar {
-  margin-left: -5px;
-}
-.btn-toolbar .btn,
-.btn-toolbar .btn-group,
-.btn-toolbar .input-group {
-  float: left;
-}
-.btn-toolbar > .btn,
-.btn-toolbar > .btn-group,
-.btn-toolbar > .input-group {
-  margin-left: 5px;
-}
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-.btn-group > .btn:first-child {
-  margin-left: 0;
-}
-.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
-  border-bottom-right-radius: 0;
-  border-top-right-radius: 0;
-}
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-.btn-group > .btn-group {
-  float: left;
-}
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
-.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-  border-bottom-right-radius: 0;
-  border-top-right-radius: 0;
-}
-.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
-  padding-left: 8px;
-  padding-right: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
-  padding-left: 12px;
-  padding-right: 12px;
-}
-.btn-group.open .dropdown-toggle {
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
-}
-.btn-group.open .dropdown-toggle.btn-link {
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-.btn .caret {
-  margin-left: 0;
-}
-.btn-lg .caret {
-  border-width: 5px 5px 0;
-  border-bottom-width: 0;
-}
-.dropup .btn-lg .caret {
-  border-width: 0 5px 5px;
-}
-.btn-group-vertical > .btn,
-.btn-group-vertical > .btn-group,
-.btn-group-vertical > .btn-group > .btn {
-  display: block;
-  float: none;
-  width: 100%;
-  max-width: 100%;
-}
-.btn-group-vertical > .btn-group > .btn {
-  float: none;
-}
-.btn-group-vertical > .btn + .btn,
-.btn-group-vertical > .btn + .btn-group,
-.btn-group-vertical > .btn-group + .btn,
-.btn-group-vertical > .btn-group + .btn-group {
-  margin-top: -1px;
-  margin-left: 0;
-}
-.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn:first-child:not(:last-child) {
-  border-top-right-radius: 4px;
-  border-top-left-radius: 4px;
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.btn-group-vertical > .btn:last-child:not(:first-child) {
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius: 4px;
-}
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
-.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-.btn-group-justified {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-  border-collapse: separate;
-}
-.btn-group-justified > .btn,
-.btn-group-justified > .btn-group {
-  float: none;
-  display: table-cell;
-  width: 1%;
-}
-.btn-group-justified > .btn-group .btn {
-  width: 100%;
-}
-.btn-group-justified > .btn-group .dropdown-menu {
-  left: auto;
-}
-[data-toggle="buttons"] > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn input[type="checkbox"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
-  position: absolute;
-  clip: rect(0, 0, 0, 0);
-  pointer-events: none;
-}
-.input-group {
-  position: relative;
-  display: table;
-  border-collapse: separate;
-}
-.input-group[class*="col-"] {
-  float: none;
-  padding-left: 0;
-  padding-right: 0;
-}
-.input-group .form-control {
-  position: relative;
-  z-index: 2;
-  float: left;
-  width: 100%;
-  margin-bottom: 0;
-}
-.input-group .form-control:focus {
-  z-index: 3;
-}
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-select.input-group-lg > .form-control,
-select.input-group-lg > .input-group-addon,
-select.input-group-lg > .input-group-btn > .btn {
-  height: 46px;
-  line-height: 46px;
-}
-textarea.input-group-lg > .form-control,
-textarea.input-group-lg > .input-group-addon,
-textarea.input-group-lg > .input-group-btn > .btn,
-select[multiple].input-group-lg > .form-control,
-select[multiple].input-group-lg > .input-group-addon,
-select[multiple].input-group-lg > .input-group-btn > .btn {
-  height: auto;
-}
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-select.input-group-sm > .form-control,
-select.input-group-sm > .input-group-addon,
-select.input-group-sm > .input-group-btn > .btn {
-  height: 30px;
-  line-height: 30px;
-}
-textarea.input-group-sm > .form-control,
-textarea.input-group-sm > .input-group-addon,
-textarea.input-group-sm > .input-group-btn > .btn,
-select[multiple].input-group-sm > .form-control,
-select[multiple].input-group-sm > .input-group-addon,
-select[multiple].input-group-sm > .input-group-btn > .btn {
-  height: auto;
-}
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: table-cell;
-}
-.input-group-addon:not(:first-child):not(:last-child),
-.input-group-btn:not(:first-child):not(:last-child),
-.input-group .form-control:not(:first-child):not(:last-child) {
-  border-radius: 0;
-}
-.input-group-addon,
-.input-group-btn {
-  width: 1%;
-  white-space: nowrap;
-  vertical-align: middle;
-}
-.input-group-addon {
-  padding: 6px 12px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 1;
-  color: #555555;
-  text-align: center;
-  background-color: #eeeeee;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-}
-.input-group-addon.input-sm {
-  padding: 5px 10px;
-  font-size: 12px;
-  border-radius: 3px;
-}
-.input-group-addon.input-lg {
-  padding: 10px 16px;
-  font-size: 18px;
-  border-radius: 6px;
-}
-.input-group-addon input[type="radio"],
-.input-group-addon input[type="checkbox"] {
-  margin-top: 0;
-}
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
-  border-bottom-right-radius: 0;
-  border-top-right-radius: 0;
-}
-.input-group-addon:first-child {
-  border-right: 0;
-}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-.input-group-addon:last-child {
-  border-left: 0;
-}
-.input-group-btn {
-  position: relative;
-  font-size: 0;
-  white-space: nowrap;
-}
-.input-group-btn > .btn {
-  position: relative;
-}
-.input-group-btn > .btn + .btn {
-  margin-left: -1px;
-}
-.input-group-btn > .btn:hover,
-.input-group-btn > .btn:focus,
-.input-group-btn > .btn:active {
-  z-index: 2;
-}
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group {
-  margin-right: -1px;
-}
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group {
-  z-index: 2;
-  margin-left: -1px;
-}
-.nav {
-  margin-bottom: 0;
-  padding-left: 0;
-  list-style: none;
-}
-.nav > li {
-  position: relative;
-  display: block;
-}
-.nav > li > a {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-}
-.nav > li > a:hover,
-.nav > li > a:focus {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-.nav > li.disabled > a {
-  color: #777777;
-}
-.nav > li.disabled > a:hover,
-.nav > li.disabled > a:focus {
-  color: #777777;
-  text-decoration: none;
-  background-color: transparent;
-  cursor: not-allowed;
-}
-.nav .open > a,
-.nav .open > a:hover,
-.nav .open > a:focus {
-  background-color: #eeeeee;
-  border-color: #337ab7;
-}
-.nav .nav-divider {
-  height: 1px;
-  margin: 9px 0;
-  overflow: hidden;
-  background-color: #e5e5e5;
-}
-.nav > li > a > img {
-  max-width: none;
-}
-.nav-tabs {
-  border-bottom: 1px solid #dddddd;
-}
-.nav-tabs > li {
-  float: left;
-  margin-bottom: -1px;
-}
-.nav-tabs > li > a {
-  margin-right: 2px;
-  line-height: 1.42857143;
-  border: 1px solid transparent;
-  border-radius: 4px 4px 0 0;
-}
-.nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
-  color: #555555;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-bottom-color: transparent;
-  cursor: default;
-}
-.nav-tabs.nav-justified {
-  width: 100%;
-  border-bottom: 0;
-}
-.nav-tabs.nav-justified > li {
-  float: none;
-}
-.nav-tabs.nav-justified > li > a {
-  text-align: center;
-  margin-bottom: 5px;
-}
-.nav-tabs.nav-justified > .dropdown .dropdown-menu {
-  top: auto;
-  left: auto;
-}
-@media (min-width: 768px) {
-  .nav-tabs.nav-justified > li {
-    display: table-cell;
-    width: 1%;
-  }
-  .nav-tabs.nav-justified > li > a {
-    margin-bottom: 0;
-  }
-}
-.nav-tabs.nav-justified > li > a {
-  margin-right: 0;
-  border-radius: 4px;
-}
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
-  border: 1px solid #dddddd;
-}
-@media (min-width: 768px) {
-  .nav-tabs.nav-justified > li > a {
-    border-bottom: 1px solid #dddddd;
-    border-radius: 4px 4px 0 0;
-  }
-  .nav-tabs.nav-justified > .active > a,
-  .nav-tabs.nav-justified > .active > a:hover,
-  .nav-tabs.nav-justified > .active > a:focus {
-    border-bottom-color: #ffffff;
-  }
-}
-.nav-pills > li {
-  float: left;
-}
-.nav-pills > li > a {
-  border-radius: 4px;
-}
-.nav-pills > li + li {
-  margin-left: 2px;
-}
-.nav-pills > li.active > a,
-.nav-pills > li.active > a:hover,
-.nav-pills > li.active > a:focus {
-  color: #ffffff;
-  background-color: #337ab7;
-}
-.nav-stacked > li {
-  float: none;
-}
-.nav-stacked > li + li {
-  margin-top: 2px;
-  margin-left: 0;
-}
-.nav-justified {
-  width: 100%;
-}
-.nav-justified > li {
-  float: none;
-}
-.nav-justified > li > a {
-  text-align: center;
-  margin-bottom: 5px;
-}
-.nav-justified > .dropdown .dropdown-menu {
-  top: auto;
-  left: auto;
-}
-@media (min-width: 768px) {
-  .nav-justified > li {
-    display: table-cell;
-    width: 1%;
-  }
-  .nav-justified > li > a {
-    margin-bottom: 0;
-  }
-}
-.nav-tabs-justified {
-  border-bottom: 0;
-}
-.nav-tabs-justified > li > a {
-  margin-right: 0;
-  border-radius: 4px;
-}
-.nav-tabs-justified > .active > a,
-.nav-tabs-justified > .active > a:hover,
-.nav-tabs-justified > .active > a:focus {
-  border: 1px solid #dddddd;
-}
-@media (min-width: 768px) {
-  .nav-tabs-justified > li > a {
-    border-bottom: 1px solid #dddddd;
-    border-radius: 4px 4px 0 0;
-  }
-  .nav-tabs-justified > .active > a,
-  .nav-tabs-justified > .active > a:hover,
-  .nav-tabs-justified > .active > a:focus {
-    border-bottom-color: #ffffff;
-  }
-}
-.tab-content > .tab-pane {
-  display: none;
-}
-.tab-content > .active {
-  display: block;
-}
-.nav-tabs .dropdown-menu {
-  margin-top: -1px;
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-.navbar {
-  position: relative;
-  min-height: 50px;
-  margin-bottom: 20px;
-  border: 1px solid transparent;
-}
-@media (min-width: 768px) {
-  .navbar {
-    border-radius: 4px;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-header {
-    float: left;
-  }
-}
-.navbar-collapse {
-  overflow-x: visible;
-  padding-right: 15px;
-  padding-left: 15px;
-  border-top: 1px solid transparent;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
-  -webkit-overflow-scrolling: touch;
-}
-.navbar-collapse.in {
-  overflow-y: auto;
-}
-@media (min-width: 768px) {
-  .navbar-collapse {
-    width: auto;
-    border-top: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-  }
-  .navbar-collapse.collapse {
-    display: block !important;
-    height: auto !important;
-    padding-bottom: 0;
-    overflow: visible !important;
-  }
-  .navbar-collapse.in {
-    overflow-y: visible;
-  }
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-static-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    padding-left: 0;
-    padding-right: 0;
-  }
-}
-.navbar-fixed-top .navbar-collapse,
-.navbar-fixed-bottom .navbar-collapse {
-  max-height: 340px;
-}
-@media (max-device-width: 480px) and (orientation: landscape) {
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    max-height: 200px;
-  }
-}
-.container > .navbar-header,
-.container-fluid > .navbar-header,
-.container > .navbar-collapse,
-.container-fluid > .navbar-collapse {
-  margin-right: -15px;
-  margin-left: -15px;
-}
-@media (min-width: 768px) {
-  .container > .navbar-header,
-  .container-fluid > .navbar-header,
-  .container > .navbar-collapse,
-  .container-fluid > .navbar-collapse {
-    margin-right: 0;
-    margin-left: 0;
-  }
-}
-.navbar-static-top {
-  z-index: 1000;
-  border-width: 0 0 1px;
-}
-@media (min-width: 768px) {
-  .navbar-static-top {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-}
-@media (min-width: 768px) {
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0;
-  border-width: 1px 0 0;
-}
-.navbar-brand {
-  float: left;
-  padding: 15px 15px;
-  font-size: 18px;
-  line-height: 20px;
-  height: 50px;
-}
-.navbar-brand:hover,
-.navbar-brand:focus {
-  text-decoration: none;
-}
-.navbar-brand > img {
-  display: block;
-}
-@media (min-width: 768px) {
-  .navbar > .container .navbar-brand,
-  .navbar > .container-fluid .navbar-brand {
-    margin-left: -15px;
-  }
-}
-.navbar-toggle {
-  position: relative;
-  float: right;
-  margin-right: 15px;
-  padding: 9px 10px;
-  margin-top: 8px;
-  margin-bottom: 8px;
-  background-color: transparent;
-  background-image: none;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.navbar-toggle:focus {
-  outline: 0;
-}
-.navbar-toggle .icon-bar {
-  display: block;
-  width: 22px;
-  height: 2px;
-  border-radius: 1px;
-}
-.navbar-toggle .icon-bar + .icon-bar {
-  margin-top: 4px;
-}
-@media (min-width: 768px) {
-  .navbar-toggle {
-    display: none;
-  }
-}
-.navbar-nav {
-  margin: 7.5px -15px;
-}
-.navbar-nav > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  line-height: 20px;
-}
-@media (max-width: 767px) {
-  .navbar-nav .open .dropdown-menu {
-    position: static;
-    float: none;
-    width: auto;
-    margin-top: 0;
-    background-color: transparent;
-    border: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-  }
-  .navbar-nav .open .dropdown-menu > li > a,
-  .navbar-nav .open .dropdown-menu .dropdown-header {
-    padding: 5px 15px 5px 25px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a {
-    line-height: 20px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-nav .open .dropdown-menu > li > a:focus {
-    background-image: none;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-nav {
-    float: left;
-    margin: 0;
-  }
-  .navbar-nav > li {
-    float: left;
-  }
-  .navbar-nav > li > a {
-    padding-top: 15px;
-    padding-bottom: 15px;
-  }
-}
-.navbar-form {
-  margin-left: -15px;
-  margin-right: -15px;
-  padding: 10px 15px;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-@media (min-width: 768px) {
-  .navbar-form .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control-static {
-    display: inline-block;
-  }
-  .navbar-form .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .navbar-form .input-group .input-group-addon,
-  .navbar-form .input-group .input-group-btn,
-  .navbar-form .input-group .form-control {
-    width: auto;
-  }
-  .navbar-form .input-group > .form-control {
-    width: 100%;
-  }
-  .navbar-form .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio,
-  .navbar-form .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio label,
-  .navbar-form .checkbox label {
-    padding-left: 0;
-  }
-  .navbar-form .radio input[type="radio"],
-  .navbar-form .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .navbar-form .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-@media (max-width: 767px) {
-  .navbar-form .form-group {
-    margin-bottom: 5px;
-  }
-  .navbar-form .form-group:last-child {
-    margin-bottom: 0;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-form {
-    width: auto;
-    border: 0;
-    margin-left: 0;
-    margin-right: 0;
-    padding-top: 0;
-    padding-bottom: 0;
-    -webkit-box-shadow: none;
-    box-shadow: none;
-  }
-}
-.navbar-nav > li > .dropdown-menu {
-  margin-top: 0;
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
-  margin-bottom: 0;
-  border-top-right-radius: 4px;
-  border-top-left-radius: 4px;
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.navbar-btn {
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-.navbar-btn.btn-sm {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.navbar-btn.btn-xs {
-  margin-top: 14px;
-  margin-bottom: 14px;
-}
-.navbar-text {
-  margin-top: 15px;
-  margin-bottom: 15px;
-}
-@media (min-width: 768px) {
-  .navbar-text {
-    float: left;
-    margin-left: 15px;
-    margin-right: 15px;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-left {
-    float: left !important;
-  }
-  .navbar-right {
-    float: right !important;
-    margin-right: -15px;
-  }
-  .navbar-right ~ .navbar-right {
-    margin-right: 0;
-  }
-}
-.navbar-default {
-  background-color: #f8f8f8;
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-brand {
-  color: #777777;
-}
-.navbar-default .navbar-brand:hover,
-.navbar-default .navbar-brand:focus {
-  color: #5e5e5e;
-  background-color: transparent;
-}
-.navbar-default .navbar-text {
-  color: #777777;
-}
-.navbar-default .navbar-nav > li > a {
-  color: #777777;
-}
-.navbar-default .navbar-nav > li > a:hover,
-.navbar-default .navbar-nav > li > a:focus {
-  color: #333333;
-  background-color: transparent;
-}
-.navbar-default .navbar-nav > .active > a,
-.navbar-default .navbar-nav > .active > a:hover,
-.navbar-default .navbar-nav > .active > a:focus {
-  color: #555555;
-  background-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .disabled > a,
-.navbar-default .navbar-nav > .disabled > a:hover,
-.navbar-default .navbar-nav > .disabled > a:focus {
-  color: #cccccc;
-  background-color: transparent;
-}
-.navbar-default .navbar-toggle {
-  border-color: #dddddd;
-}
-.navbar-default .navbar-toggle:hover,
-.navbar-default .navbar-toggle:focus {
-  background-color: #dddddd;
-}
-.navbar-default .navbar-toggle .icon-bar {
-  background-color: #888888;
-}
-.navbar-default .navbar-collapse,
-.navbar-default .navbar-form {
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .open > a:hover,
-.navbar-default .navbar-nav > .open > a:focus {
-  background-color: #e7e7e7;
-  color: #555555;
-}
-@media (max-width: 767px) {
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
-    color: #777777;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #333333;
-    background-color: transparent;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #555555;
-    background-color: #e7e7e7;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #cccccc;
-    background-color: transparent;
-  }
-}
-.navbar-default .navbar-link {
-  color: #777777;
-}
-.navbar-default .navbar-link:hover {
-  color: #333333;
-}
-.navbar-default .btn-link {
-  color: #777777;
-}
-.navbar-default .btn-link:hover,
-.navbar-default .btn-link:focus {
-  color: #333333;
-}
-.navbar-default .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-default .btn-link:hover,
-.navbar-default .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-default .btn-link:focus {
-  color: #cccccc;
-}
-.navbar-inverse {
-  background-color: #222222;
-  border-color: #080808;
-}
-.navbar-inverse .navbar-brand {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
-  color: #ffffff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-text {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-nav > li > a {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
-  color: #ffffff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
-  color: #ffffff;
-  background-color: #080808;
-}
-.navbar-inverse .navbar-nav > .disabled > a,
-.navbar-inverse .navbar-nav > .disabled > a:hover,
-.navbar-inverse .navbar-nav > .disabled > a:focus {
-  color: #444444;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-toggle {
-  border-color: #333333;
-}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
-  background-color: #333333;
-}
-.navbar-inverse .navbar-toggle .icon-bar {
-  background-color: #ffffff;
-}
-.navbar-inverse .navbar-collapse,
-.navbar-inverse .navbar-form {
-  border-color: #101010;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
-  background-color: #080808;
-  color: #ffffff;
-}
-@media (max-width: 767px) {
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
-    border-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
-    color: #9d9d9d;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #ffffff;
-    background-color: transparent;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #ffffff;
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #444444;
-    background-color: transparent;
-  }
-}
-.navbar-inverse .navbar-link {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-link:hover {
-  color: #ffffff;
-}
-.navbar-inverse .btn-link {
-  color: #9d9d9d;
-}
-.navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link:focus {
-  color: #ffffff;
-}
-.navbar-inverse .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-inverse .btn-link:focus {
-  color: #444444;
-}
-.pagination {
-  display: inline-block;
-  padding-left: 0;
-  margin: 20px 0;
-  border-radius: 4px;
-}
-.pagination > li {
-  display: inline;
-}
-.pagination > li > a,
-.pagination > li > span {
-  position: relative;
-  float: left;
-  padding: 6px 12px;
-  line-height: 1.42857143;
-  text-decoration: none;
-  color: #337ab7;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  margin-left: -1px;
-}
-.pagination > li:first-child > a,
-.pagination > li:first-child > span {
-  margin-left: 0;
-  border-bottom-left-radius: 4px;
-  border-top-left-radius: 4px;
-}
-.pagination > li:last-child > a,
-.pagination > li:last-child > span {
-  border-bottom-right-radius: 4px;
-  border-top-right-radius: 4px;
-}
-.pagination > li > a:hover,
-.pagination > li > span:hover,
-.pagination > li > a:focus,
-.pagination > li > span:focus {
-  z-index: 2;
-  color: #23527c;
-  background-color: #eeeeee;
-  border-color: #dddddd;
-}
-.pagination > .active > a,
-.pagination > .active > span,
-.pagination > .active > a:hover,
-.pagination > .active > span:hover,
-.pagination > .active > a:focus,
-.pagination > .active > span:focus {
-  z-index: 3;
-  color: #ffffff;
-  background-color: #337ab7;
-  border-color: #337ab7;
-  cursor: default;
-}
-.pagination > .disabled > span,
-.pagination > .disabled > span:hover,
-.pagination > .disabled > span:focus,
-.pagination > .disabled > a,
-.pagination > .disabled > a:hover,
-.pagination > .disabled > a:focus {
-  color: #777777;
-  background-color: #ffffff;
-  border-color: #dddddd;
-  cursor: not-allowed;
-}
-.pagination-lg > li > a,
-.pagination-lg > li > span {
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-}
-.pagination-lg > li:first-child > a,
-.pagination-lg > li:first-child > span {
-  border-bottom-left-radius: 6px;
-  border-top-left-radius: 6px;
-}
-.pagination-lg > li:last-child > a,
-.pagination-lg > li:last-child > span {
-  border-bottom-right-radius: 6px;
-  border-top-right-radius: 6px;
-}
-.pagination-sm > li > a,
-.pagination-sm > li > span {
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-}
-.pagination-sm > li:first-child > a,
-.pagination-sm > li:first-child > span {
-  border-bottom-left-radius: 3px;
-  border-top-left-radius: 3px;
-}
-.pagination-sm > li:last-child > a,
-.pagination-sm > li:last-child > span {
-  border-bottom-right-radius: 3px;
-  border-top-right-radius: 3px;
-}
-.pager {
-  padding-left: 0;
-  margin: 20px 0;
-  list-style: none;
-  text-align: center;
-}
-.pager li {
-  display: inline;
-}
-.pager li > a,
-.pager li > span {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-radius: 15px;
-}
-.pager li > a:hover,
-.pager li > a:focus {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-.pager .next > a,
-.pager .next > span {
-  float: right;
-}
-.pager .previous > a,
-.pager .previous > span {
-  float: left;
-}
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
-  color: #777777;
-  background-color: #ffffff;
-  cursor: not-allowed;
-}
-.label {
-  display: inline;
-  padding: .2em .6em .3em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: #ffffff;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: .25em;
-}
-a.label:hover,
-a.label:focus {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-.label:empty {
-  display: none;
-}
-.btn .label {
-  position: relative;
-  top: -1px;
-}
-.label-default {
-  background-color: #777777;
-}
-.label-default[href]:hover,
-.label-default[href]:focus {
-  background-color: #5e5e5e;
-}
-.label-primary {
-  background-color: #337ab7;
-}
-.label-primary[href]:hover,
-.label-primary[href]:focus {
-  background-color: #286090;
-}
-.label-success {
-  background-color: #5cb85c;
-}
-.label-success[href]:hover,
-.label-success[href]:focus {
-  background-color: #449d44;
-}
-.label-info {
-  background-color: #5bc0de;
-}
-.label-info[href]:hover,
-.label-info[href]:focus {
-  background-color: #31b0d5;
-}
-.label-warning {
-  background-color: #f0ad4e;
-}
-.label-warning[href]:hover,
-.label-warning[href]:focus {
-  background-color: #ec971f;
-}
-.label-danger {
-  background-color: #d9534f;
-}
-.label-danger[href]:hover,
-.label-danger[href]:focus {
-  background-color: #c9302c;
-}
-.badge {
-  display: inline-block;
-  min-width: 10px;
-  padding: 3px 7px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #ffffff;
-  line-height: 1;
-  vertical-align: middle;
-  white-space: nowrap;
-  text-align: center;
-  background-color: #777777;
-  border-radius: 10px;
-}
-.badge:empty {
-  display: none;
-}
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-.btn-xs .badge,
-.btn-group-xs > .btn .badge {
-  top: 0;
-  padding: 1px 5px;
-}
-a.badge:hover,
-a.badge:focus {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-.list-group-item.active > .badge,
-.nav-pills > .active > a > .badge {
-  color: #337ab7;
-  background-color: #ffffff;
-}
-.list-group-item > .badge {
-  float: right;
-}
-.list-group-item > .badge + .badge {
-  margin-right: 5px;
-}
-.nav-pills > li > a > .badge {
-  margin-left: 3px;
-}
-.thumbnail {
-  display: block;
-  padding: 4px;
-  margin-bottom: 20px;
-  line-height: 1.42857143;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-  -webkit-transition: border 0.2s ease-in-out;
-  -o-transition: border 0.2s ease-in-out;
-  transition: border 0.2s ease-in-out;
-}
-.thumbnail > img,
-.thumbnail a > img {
-  margin-left: auto;
-  margin-right: auto;
-}
-a.thumbnail:hover,
-a.thumbnail:focus,
-a.thumbnail.active {
-  border-color: #337ab7;
-}
-.thumbnail .caption {
-  padding: 9px;
-  color: #333333;
-}
-.alert {
-  padding: 15px;
-  margin-bottom: 20px;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.alert h4 {
-  margin-top: 0;
-  color: inherit;
-}
-.alert .alert-link {
-  font-weight: bold;
-}
-.alert > p,
-.alert > ul {
-  margin-bottom: 0;
-}
-.alert > p + p {
-  margin-top: 5px;
-}
-.alert-dismissable,
-.alert-dismissible {
-  padding-right: 35px;
-}
-.alert-dismissable .close,
-.alert-dismissible .close {
-  position: relative;
-  top: -2px;
-  right: -21px;
-  color: inherit;
-}
-.alert-success {
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-  color: #3c763d;
-}
-.alert-success hr {
-  border-top-color: #c9e2b3;
-}
-.alert-success .alert-link {
-  color: #2b542c;
-}
-.alert-info {
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-  color: #31708f;
-}
-.alert-info hr {
-  border-top-color: #a6e1ec;
-}
-.alert-info .alert-link {
-  color: #245269;
-}
-.alert-warning {
-  background-color: #fcf8e3;
-  border-color: #faebcc;
-  color: #8a6d3b;
-}
-.alert-warning hr {
-  border-top-color: #f7e1b5;
-}
-.alert-warning .alert-link {
-  color: #66512c;
-}
-.alert-danger {
-  background-color: #f2dede;
-  border-color: #ebccd1;
-  color: #a94442;
-}
-.alert-danger hr {
-  border-top-color: #e4b9c0;
-}
-.alert-danger .alert-link {
-  color: #843534;
-}
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-.progress {
-  overflow: hidden;
-  height: 20px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-.progress-bar {
-  float: left;
-  width: 0%;
-  height: 100%;
-  font-size: 12px;
-  line-height: 20px;
-  color: #ffffff;
-  text-align: center;
-  background-color: #337ab7;
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-transition: width 0.6s ease;
-  -o-transition: width 0.6s ease;
-  transition: width 0.6s ease;
-}
-.progress-striped .progress-bar,
-.progress-bar-striped {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-          background-size: 40px 40px;
-}
-.progress.active .progress-bar,
-.progress-bar.active {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-  -o-animation: progress-bar-stripes 2s linear infinite;
-  animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-bar-success {
-  background-color: #5cb85c;
-}
-.progress-striped .progress-bar-success {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-bar-info {
-  background-color: #5bc0de;
-}
-.progress-striped .progress-bar-info {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-bar-warning {
-  background-color: #f0ad4e;
-}
-.progress-striped .progress-bar-warning {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-bar-danger {
-  background-color: #d9534f;
-}
-.progress-striped .progress-bar-danger {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.media {
-  margin-top: 15px;
-}
-.media:first-child {
-  margin-top: 0;
-}
-.media,
-.media-body {
-  zoom: 1;
-  overflow: hidden;
-}
-.media-body {
-  width: 10000px;
-}
-.media-object {
-  display: block;
-}
-.media-object.img-thumbnail {
-  max-width: none;
-}
-.media-right,
-.media > .pull-right {
-  padding-left: 10px;
-}
-.media-left,
-.media > .pull-left {
-  padding-right: 10px;
-}
-.media-left,
-.media-right,
-.media-body {
-  display: table-cell;
-  vertical-align: top;
-}
-.media-middle {
-  vertical-align: middle;
-}
-.media-bottom {
-  vertical-align: bottom;
-}
-.media-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-.media-list {
-  padding-left: 0;
-  list-style: none;
-}
-.list-group {
-  margin-bottom: 20px;
-  padding-left: 0;
-}
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-}
-.list-group-item:first-child {
-  border-top-right-radius: 4px;
-  border-top-left-radius: 4px;
-}
-.list-group-item:last-child {
-  margin-bottom: 0;
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius: 4px;
-}
-a.list-group-item,
-button.list-group-item {
-  color: #555555;
-}
-a.list-group-item .list-group-item-heading,
-button.list-group-item .list-group-item-heading {
-  color: #333333;
-}
-a.list-group-item:hover,
-button.list-group-item:hover,
-a.list-group-item:focus,
-button.list-group-item:focus {
-  text-decoration: none;
-  color: #555555;
-  background-color: #f5f5f5;
-}
-button.list-group-item {
-  width: 100%;
-  text-align: left;
-}
-.list-group-item.disabled,
-.list-group-item.disabled:hover,
-.list-group-item.disabled:focus {
-  background-color: #eeeeee;
-  color: #777777;
-  cursor: not-allowed;
-}
-.list-group-item.disabled .list-group-item-heading,
-.list-group-item.disabled:hover .list-group-item-heading,
-.list-group-item.disabled:focus .list-group-item-heading {
-  color: inherit;
-}
-.list-group-item.disabled .list-group-item-text,
-.list-group-item.disabled:hover .list-group-item-text,
-.list-group-item.disabled:focus .list-group-item-text {
-  color: #777777;
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  z-index: 2;
-  color: #ffffff;
-  background-color: #337ab7;
-  border-color: #337ab7;
-}
-.list-group-item.active .list-group-item-heading,
-.list-group-item.active:hover .list-group-item-heading,
-.list-group-item.active:focus .list-group-item-heading,
-.list-group-item.active .list-group-item-heading > small,
-.list-group-item.active:hover .list-group-item-heading > small,
-.list-group-item.active:focus .list-group-item-heading > small,
-.list-group-item.active .list-group-item-heading > .small,
-.list-group-item.active:hover .list-group-item-heading > .small,
-.list-group-item.active:focus .list-group-item-heading > .small {
-  color: inherit;
-}
-.list-group-item.active .list-group-item-text,
-.list-group-item.active:hover .list-group-item-text,
-.list-group-item.active:focus .list-group-item-text {
-  color: #c7ddef;
-}
-.list-group-item-success {
-  color: #3c763d;
-  background-color: #dff0d8;
-}
-a.list-group-item-success,
-button.list-group-item-success {
-  color: #3c763d;
-}
-a.list-group-item-success .list-group-item-heading,
-button.list-group-item-success .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-success:hover,
-button.list-group-item-success:hover,
-a.list-group-item-success:focus,
-button.list-group-item-success:focus {
-  color: #3c763d;
-  background-color: #d0e9c6;
-}
-a.list-group-item-success.active,
-button.list-group-item-success.active,
-a.list-group-item-success.active:hover,
-button.list-group-item-success.active:hover,
-a.list-group-item-success.active:focus,
-button.list-group-item-success.active:focus {
-  color: #fff;
-  background-color: #3c763d;
-  border-color: #3c763d;
-}
-.list-group-item-info {
-  color: #31708f;
-  background-color: #d9edf7;
-}
-a.list-group-item-info,
-button.list-group-item-info {
-  color: #31708f;
-}
-a.list-group-item-info .list-group-item-heading,
-button.list-group-item-info .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-info:hover,
-button.list-group-item-info:hover,
-a.list-group-item-info:focus,
-button.list-group-item-info:focus {
-  color: #31708f;
-  background-color: #c4e3f3;
-}
-a.list-group-item-info.active,
-button.list-group-item-info.active,
-a.list-group-item-info.active:hover,
-button.list-group-item-info.active:hover,
-a.list-group-item-info.active:focus,
-button.list-group-item-info.active:focus {
-  color: #fff;
-  background-color: #31708f;
-  border-color: #31708f;
-}
-.list-group-item-warning {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-}
-a.list-group-item-warning,
-button.list-group-item-warning {
-  color: #8a6d3b;
-}
-a.list-group-item-warning .list-group-item-heading,
-button.list-group-item-warning .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-warning:hover,
-button.list-group-item-warning:hover,
-a.list-group-item-warning:focus,
-button.list-group-item-warning:focus {
-  color: #8a6d3b;
-  background-color: #faf2cc;
-}
-a.list-group-item-warning.active,
-button.list-group-item-warning.active,
-a.list-group-item-warning.active:hover,
-button.list-group-item-warning.active:hover,
-a.list-group-item-warning.active:focus,
-button.list-group-item-warning.active:focus {
-  color: #fff;
-  background-color: #8a6d3b;
-  border-color: #8a6d3b;
-}
-.list-group-item-danger {
-  color: #a94442;
-  background-color: #f2dede;
-}
-a.list-group-item-danger,
-button.list-group-item-danger {
-  color: #a94442;
-}
-a.list-group-item-danger .list-group-item-heading,
-button.list-group-item-danger .list-group-item-heading {
-  color: inherit;
-}
-a.list-group-item-danger:hover,
-button.list-group-item-danger:hover,
-a.list-group-item-danger:focus,
-button.list-group-item-danger:focus {
-  color: #a94442;
-  background-color: #ebcccc;
-}
-a.list-group-item-danger.active,
-button.list-group-item-danger.active,
-a.list-group-item-danger.active:hover,
-button.list-group-item-danger.active:hover,
-a.list-group-item-danger.active:focus,
-button.list-group-item-danger.active:focus {
-  color: #fff;
-  background-color: #a94442;
-  border-color: #a94442;
-}
-.list-group-item-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-.list-group-item-text {
-  margin-bottom: 0;
-  line-height: 1.3;
-}
-.panel {
-  margin-bottom: 20px;
-  background-color: #ffffff;
-  border: 1px solid transparent;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
-  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.panel-body {
-  padding: 15px;
-}
-.panel-heading {
-  padding: 10px 15px;
-  border-bottom: 1px solid transparent;
-  border-top-right-radius: 3px;
-  border-top-left-radius: 3px;
-}
-.panel-heading > .dropdown .dropdown-toggle {
-  color: inherit;
-}
-.panel-title {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: 16px;
-  color: inherit;
-}
-.panel-title > a,
-.panel-title > small,
-.panel-title > .small,
-.panel-title > small > a,
-.panel-title > .small > a {
-  color: inherit;
-}
-.panel-footer {
-  padding: 10px 15px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #dddddd;
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.panel > .list-group,
-.panel > .panel-collapse > .list-group {
-  margin-bottom: 0;
-}
-.panel > .list-group .list-group-item,
-.panel > .panel-collapse > .list-group .list-group-item {
-  border-width: 1px 0;
-  border-radius: 0;
-}
-.panel > .list-group:first-child .list-group-item:first-child,
-.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
-  border-top: 0;
-  border-top-right-radius: 3px;
-  border-top-left-radius: 3px;
-}
-.panel > .list-group:last-child .list-group-item:last-child,
-.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
-  border-bottom: 0;
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-.panel-heading + .list-group .list-group-item:first-child {
-  border-top-width: 0;
-}
-.list-group + .panel-footer {
-  border-top-width: 0;
-}
-.panel > .table,
-.panel > .table-responsive > .table,
-.panel > .panel-collapse > .table {
-  margin-bottom: 0;
-}
-.panel > .table caption,
-.panel > .table-responsive > .table caption,
-.panel > .panel-collapse > .table caption {
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.panel > .table:first-child,
-.panel > .table-responsive:first-child > .table:first-child {
-  border-top-right-radius: 3px;
-  border-top-left-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
-.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
-  border-top-left-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
-.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
-  border-top-right-radius: 3px;
-}
-.panel > .table:last-child,
-.panel > .table-responsive:last-child > .table:last-child {
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
-  border-bottom-left-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
-.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
-  border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
-.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
-  border-bottom-right-radius: 3px;
-}
-.panel > .panel-body + .table,
-.panel > .panel-body + .table-responsive,
-.panel > .table + .panel-body,
-.panel > .table-responsive + .panel-body {
-  border-top: 1px solid #dddddd;
-}
-.panel > .table > tbody:first-child > tr:first-child th,
-.panel > .table > tbody:first-child > tr:first-child td {
-  border-top: 0;
-}
-.panel > .table-bordered,
-.panel > .table-responsive > .table-bordered {
-  border: 0;
-}
-.panel > .table-bordered > thead > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
-.panel > .table-bordered > tbody > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
-.panel > .table-bordered > tfoot > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-.panel > .table-bordered > thead > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
-.panel > .table-bordered > tbody > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
-.panel > .table-bordered > tfoot > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
-  border-left: 0;
-}
-.panel > .table-bordered > thead > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
-.panel > .table-bordered > tbody > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
-.panel > .table-bordered > tfoot > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-.panel > .table-bordered > thead > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
-.panel > .table-bordered > tbody > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
-.panel > .table-bordered > tfoot > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
-  border-right: 0;
-}
-.panel > .table-bordered > thead > tr:first-child > td,
-.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
-.panel > .table-bordered > tbody > tr:first-child > td,
-.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
-.panel > .table-bordered > thead > tr:first-child > th,
-.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
-.panel > .table-bordered > tbody > tr:first-child > th,
-.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
-  border-bottom: 0;
-}
-.panel > .table-bordered > tbody > tr:last-child > td,
-.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
-.panel > .table-bordered > tfoot > tr:last-child > td,
-.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
-.panel > .table-bordered > tbody > tr:last-child > th,
-.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
-.panel > .table-bordered > tfoot > tr:last-child > th,
-.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
-  border-bottom: 0;
-}
-.panel > .table-responsive {
-  border: 0;
-  margin-bottom: 0;
-}
-.panel-group {
-  margin-bottom: 20px;
-}
-.panel-group .panel {
-  margin-bottom: 0;
-  border-radius: 4px;
-}
-.panel-group .panel + .panel {
-  margin-top: 5px;
-}
-.panel-group .panel-heading {
-  border-bottom: 0;
-}
-.panel-group .panel-heading + .panel-collapse > .panel-body,
-.panel-group .panel-heading + .panel-collapse > .list-group {
-  border-top: 1px solid #dddddd;
-}
-.panel-group .panel-footer {
-  border-top: 0;
-}
-.panel-group .panel-footer + .panel-collapse .panel-body {
-  border-bottom: 1px solid #dddddd;
-}
-.panel-default {
-  border-color: #dddddd;
-}
-.panel-default > .panel-heading {
-  color: #333333;
-  background-color: #f5f5f5;
-  border-color: #dddddd;
-}
-.panel-default > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #dddddd;
-}
-.panel-default > .panel-heading .badge {
-  color: #f5f5f5;
-  background-color: #333333;
-}
-.panel-default > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #dddddd;
-}
-.panel-primary {
-  border-color: #337ab7;
-}
-.panel-primary > .panel-heading {
-  color: #ffffff;
-  background-color: #337ab7;
-  border-color: #337ab7;
-}
-.panel-primary > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #337ab7;
-}
-.panel-primary > .panel-heading .badge {
-  color: #337ab7;
-  background-color: #ffffff;
-}
-.panel-primary > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #337ab7;
-}
-.panel-success {
-  border-color: #d6e9c6;
-}
-.panel-success > .panel-heading {
-  color: #3c763d;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-.panel-success > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #d6e9c6;
-}
-.panel-success > .panel-heading .badge {
-  color: #dff0d8;
-  background-color: #3c763d;
-}
-.panel-success > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #d6e9c6;
-}
-.panel-info {
-  border-color: #bce8f1;
-}
-.panel-info > .panel-heading {
-  color: #31708f;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-.panel-info > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #bce8f1;
-}
-.panel-info > .panel-heading .badge {
-  color: #d9edf7;
-  background-color: #31708f;
-}
-.panel-info > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #bce8f1;
-}
-.panel-warning {
-  border-color: #faebcc;
-}
-.panel-warning > .panel-heading {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-  border-color: #faebcc;
-}
-.panel-warning > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #faebcc;
-}
-.panel-warning > .panel-heading .badge {
-  color: #fcf8e3;
-  background-color: #8a6d3b;
-}
-.panel-warning > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #faebcc;
-}
-.panel-danger {
-  border-color: #ebccd1;
-}
-.panel-danger > .panel-heading {
-  color: #a94442;
-  background-color: #f2dede;
-  border-color: #ebccd1;
-}
-.panel-danger > .panel-heading + .panel-collapse > .panel-body {
-  border-top-color: #ebccd1;
-}
-.panel-danger > .panel-heading .badge {
-  color: #f2dede;
-  background-color: #a94442;
-}
-.panel-danger > .panel-footer + .panel-collapse > .panel-body {
-  border-bottom-color: #ebccd1;
-}
-.embed-responsive {
-  position: relative;
-  display: block;
-  height: 0;
-  padding: 0;
-  overflow: hidden;
-}
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  height: 100%;
-  width: 100%;
-  border: 0;
-}
-.embed-responsive-16by9 {
-  padding-bottom: 56.25%;
-}
-.embed-responsive-4by3 {
-  padding-bottom: 75%;
-}
-.close {
-  float: right;
-  font-size: 21px;
-  font-weight: bold;
-  line-height: 1;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-.close:hover,
-.close:focus {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-.modal-open {
-  overflow: hidden;
-}
-.modal {
-  display: none;
-  overflow: hidden;
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1050;
-  -webkit-overflow-scrolling: touch;
-  outline: 0;
-}
-.modal.fade .modal-dialog {
-  -webkit-transform: translate(0, -25%);
-  -ms-transform: translate(0, -25%);
-  -o-transform: translate(0, -25%);
-  transform: translate(0, -25%);
-  -webkit-transition: -webkit-transform 0.3s ease-out;
-  -o-transition: -o-transform 0.3s ease-out;
-  transition: transform 0.3s ease-out;
-}
-.modal.in .modal-dialog {
-  -webkit-transform: translate(0, 0);
-  -ms-transform: translate(0, 0);
-  -o-transform: translate(0, 0);
-  transform: translate(0, 0);
-}
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-}
-.modal-content {
-  position: relative;
-  background-color: #ffffff;
-  border: 1px solid #999999;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  border-radius: 6px;
-  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
-  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  outline: 0;
-}
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-.modal-backdrop.fade {
-  opacity: 0;
-  filter: alpha(opacity=0);
-}
-.modal-backdrop.in {
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-.modal-header {
-  padding: 15px;
-  border-bottom: 1px solid #e5e5e5;
-}
-.modal-header .close {
-  margin-top: -2px;
-}
-.modal-title {
-  margin: 0;
-  line-height: 1.42857143;
-}
-.modal-body {
-  position: relative;
-  padding: 15px;
-}
-.modal-footer {
-  padding: 15px;
-  text-align: right;
-  border-top: 1px solid #e5e5e5;
-}
-.modal-footer .btn + .btn {
-  margin-left: 5px;
-  margin-bottom: 0;
-}
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-.modal-footer .btn-block + .btn-block {
-  margin-left: 0;
-}
-.modal-scrollbar-measure {
-  position: absolute;
-  top: -9999px;
-  width: 50px;
-  height: 50px;
-  overflow: scroll;
-}
-@media (min-width: 768px) {
-  .modal-dialog {
-    width: 600px;
-    margin: 30px auto;
-  }
-  .modal-content {
-    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
-    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
-  }
-  .modal-sm {
-    width: 300px;
-  }
-}
-@media (min-width: 992px) {
-  .modal-lg {
-    width: 900px;
-  }
-}
-.tooltip {
-  position: absolute;
-  z-index: 1070;
-  display: block;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-style: normal;
-  font-weight: normal;
-  letter-spacing: normal;
-  line-break: auto;
-  line-height: 1.42857143;
-  text-align: left;
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  white-space: normal;
-  word-break: normal;
-  word-spacing: normal;
-  word-wrap: normal;
-  font-size: 12px;
-  opacity: 0;
-  filter: alpha(opacity=0);
-}
-.tooltip.in {
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-.tooltip.top {
-  margin-top: -3px;
-  padding: 5px 0;
-}
-.tooltip.right {
-  margin-left: 3px;
-  padding: 0 5px;
-}
-.tooltip.bottom {
-  margin-top: 3px;
-  padding: 5px 0;
-}
-.tooltip.left {
-  margin-left: -3px;
-  padding: 0 5px;
-}
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #ffffff;
-  text-align: center;
-  background-color: #000000;
-  border-radius: 4px;
-}
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000000;
-}
-.tooltip.top-left .tooltip-arrow {
-  bottom: 0;
-  right: 5px;
-  margin-bottom: -5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000000;
-}
-.tooltip.top-right .tooltip-arrow {
-  bottom: 0;
-  left: 5px;
-  margin-bottom: -5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-width: 5px 5px 5px 0;
-  border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-width: 5px 0 5px 5px;
-  border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000000;
-}
-.tooltip.bottom-left .tooltip-arrow {
-  top: 0;
-  right: 5px;
-  margin-top: -5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000000;
-}
-.tooltip.bottom-right .tooltip-arrow {
-  top: 0;
-  left: 5px;
-  margin-top: -5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000000;
-}
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1060;
-  display: none;
-  max-width: 276px;
-  padding: 1px;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-style: normal;
-  font-weight: normal;
-  letter-spacing: normal;
-  line-break: auto;
-  line-height: 1.42857143;
-  text-align: left;
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  white-space: normal;
-  word-break: normal;
-  word-spacing: normal;
-  word-wrap: normal;
-  font-size: 14px;
-  background-color: #ffffff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid #cccccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-}
-.popover.top {
-  margin-top: -10px;
-}
-.popover.right {
-  margin-left: 10px;
-}
-.popover.bottom {
-  margin-top: 10px;
-}
-.popover.left {
-  margin-left: -10px;
-}
-.popover-title {
-  margin: 0;
-  padding: 8px 14px;
-  font-size: 14px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  border-radius: 5px 5px 0 0;
-}
-.popover-content {
-  padding: 9px 14px;
-}
-.popover > .arrow,
-.popover > .arrow:after {
-  position: absolute;
-  display: block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.popover > .arrow {
-  border-width: 11px;
-}
-.popover > .arrow:after {
-  border-width: 10px;
-  content: "";
-}
-.popover.top > .arrow {
-  left: 50%;
-  margin-left: -11px;
-  border-bottom-width: 0;
-  border-top-color: #999999;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  bottom: -11px;
-}
-.popover.top > .arrow:after {
-  content: " ";
-  bottom: 1px;
-  margin-left: -10px;
-  border-bottom-width: 0;
-  border-top-color: #ffffff;
-}
-.popover.right > .arrow {
-  top: 50%;
-  left: -11px;
-  margin-top: -11px;
-  border-left-width: 0;
-  border-right-color: #999999;
-  border-right-color: rgba(0, 0, 0, 0.25);
-}
-.popover.right > .arrow:after {
-  content: " ";
-  left: 1px;
-  bottom: -10px;
-  border-left-width: 0;
-  border-right-color: #ffffff;
-}
-.popover.bottom > .arrow {
-  left: 50%;
-  margin-left: -11px;
-  border-top-width: 0;
-  border-bottom-color: #999999;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  top: -11px;
-}
-.popover.bottom > .arrow:after {
-  content: " ";
-  top: 1px;
-  margin-left: -10px;
-  border-top-width: 0;
-  border-bottom-color: #ffffff;
-}
-.popover.left > .arrow {
-  top: 50%;
-  right: -11px;
-  margin-top: -11px;
-  border-right-width: 0;
-  border-left-color: #999999;
-  border-left-color: rgba(0, 0, 0, 0.25);
-}
-.popover.left > .arrow:after {
-  content: " ";
-  right: 1px;
-  border-right-width: 0;
-  border-left-color: #ffffff;
-  bottom: -10px;
-}
-.clearfix:before,
-.clearfix:after,
-.dl-horizontal dd:before,
-.dl-horizontal dd:after,
-.container:before,
-.container:after,
-.container-fluid:before,
-.container-fluid:after,
-.row:before,
-.row:after,
-.form-horizontal .form-group:before,
-.form-horizontal .form-group:after,
-.btn-toolbar:before,
-.btn-toolbar:after,
-.btn-group-vertical > .btn-group:before,
-.btn-group-vertical > .btn-group:after,
-.nav:before,
-.nav:after,
-.navbar:before,
-.navbar:after,
-.navbar-header:before,
-.navbar-header:after,
-.navbar-collapse:before,
-.navbar-collapse:after,
-.pager:before,
-.pager:after,
-.panel-body:before,
-.panel-body:after,
-.modal-header:before,
-.modal-header:after,
-.modal-footer:before,
-.modal-footer:after {
-  content: " ";
-  display: table;
-}
-.clearfix:after,
-.dl-horizontal dd:after,
-.container:after,
-.container-fluid:after,
-.row:after,
-.form-horizontal .form-group:after,
-.btn-toolbar:after,
-.btn-group-vertical > .btn-group:after,
-.nav:after,
-.navbar:after,
-.navbar-header:after,
-.navbar-collapse:after,
-.pager:after,
-.panel-body:after,
-.modal-header:after,
-.modal-footer:after {
-  clear: both;
-}
-.center-block {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-.pull-right {
-  float: right !important;
-}
-.pull-left {
-  float: left !important;
-}
-.hide {
-  display: none !important;
-}
-.show {
-  display: block !important;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-.hidden {
-  display: none !important;
-}
-.affix {
-  position: fixed;
-}
-@-ms-viewport {
-  width: device-width;
-}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  display: none !important;
-}
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
-  display: none !important;
-}
-@media (max-width: 767px) {
-  .visible-xs {
-    display: block !important;
-  }
-  table.visible-xs {
-    display: table !important;
-  }
-  tr.visible-xs {
-    display: table-row !important;
-  }
-  th.visible-xs,
-  td.visible-xs {
-    display: table-cell !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-block {
-    display: block !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline {
-    display: inline !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm {
-    display: block !important;
-  }
-  table.visible-sm {
-    display: table !important;
-  }
-  tr.visible-sm {
-    display: table-row !important;
-  }
-  th.visible-sm,
-  td.visible-sm {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-block {
-    display: block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md {
-    display: block !important;
-  }
-  table.visible-md {
-    display: table !important;
-  }
-  tr.visible-md {
-    display: table-row !important;
-  }
-  th.visible-md,
-  td.visible-md {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-block {
-    display: block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg {
-    display: block !important;
-  }
-  table.visible-lg {
-    display: table !important;
-  }
-  tr.visible-lg {
-    display: table-row !important;
-  }
-  th.visible-lg,
-  td.visible-lg {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-block {
-    display: block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (max-width: 767px) {
-  .hidden-xs {
-    display: none !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .hidden-sm {
-    display: none !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .hidden-md {
-    display: none !important;
-  }
-}
-@media (min-width: 1200px) {
-  .hidden-lg {
-    display: none !important;
-  }
-}
-.visible-print {
-  display: none !important;
-}
-@media print {
-  .visible-print {
-    display: block !important;
-  }
-  table.visible-print {
-    display: table !important;
-  }
-  tr.visible-print {
-    display: table-row !important;
-  }
-  th.visible-print,
-  td.visible-print {
-    display: table-cell !important;
-  }
-}
-.visible-print-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-block {
-    display: block !important;
-  }
-}
-.visible-print-inline {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline {
-    display: inline !important;
-  }
-}
-.visible-print-inline-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline-block {
-    display: inline-block !important;
-  }
-}
-@media print {
-  .hidden-print {
-    display: none !important;
-  }
-}
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap.min.css b/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap.min.css
deleted file mode 100644
index 11dec6d..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/css/bootstrap.min.css
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * 
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9)
- * Config saved to config.json and https://gist.github.com/cda9ed63f8b65c2a175b3ce0f640dcf9
- *//*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/js/bootstrap.js b/framework/crawler-ui/src/main/webapp/bootstrap/js/bootstrap.js
deleted file mode 100644
index 64c52ed..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/js/bootstrap.js
+++ /dev/null
@@ -1,1698 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * 
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9)
- * Config saved to config.json and https://gist.github.com/cda9ed63f8b65c2a175b3ce0f640dcf9
- */
-if (typeof jQuery === 'undefined') {
-  throw new Error('Bootstrap\'s JavaScript requires jQuery')
-}
-+function ($) {
-  'use strict';
-  var version = $.fn.jquery.split(' ')[0].split('.')
-  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
-    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
-  }
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: alert.js v3.3.7
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // ALERT CLASS DEFINITION
-  // ======================
-
-  var dismiss = '[data-dismiss="alert"]'
-  var Alert   = function (el) {
-    $(el).on('click', dismiss, this.close)
-  }
-
-  Alert.VERSION = '3.3.7'
-
-  Alert.TRANSITION_DURATION = 150
-
-  Alert.prototype.close = function (e) {
-    var $this    = $(this)
-    var selector = $this.attr('data-target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    var $parent = $(selector === '#' ? [] : selector)
-
-    if (e) e.preventDefault()
-
-    if (!$parent.length) {
-      $parent = $this.closest('.alert')
-    }
-
-    $parent.trigger(e = $.Event('close.bs.alert'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      // detach from parent, fire event then clean up data
-      $parent.detach().trigger('closed.bs.alert').remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent
-        .one('bsTransitionEnd', removeElement)
-        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
-      removeElement()
-  }
-
-
-  // ALERT PLUGIN DEFINITION
-  // =======================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.alert')
-
-      if (!data) $this.data('bs.alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  var old = $.fn.alert
-
-  $.fn.alert             = Plugin
-  $.fn.alert.Constructor = Alert
-
-
-  // ALERT NO CONFLICT
-  // =================
-
-  $.fn.alert.noConflict = function () {
-    $.fn.alert = old
-    return this
-  }
-
-
-  // ALERT DATA-API
-  // ==============
-
-  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: dropdown.js v3.3.7
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // DROPDOWN CLASS DEFINITION
-  // =========================
-
-  var backdrop = '.dropdown-backdrop'
-  var toggle   = '[data-toggle="dropdown"]'
-  var Dropdown = function (element) {
-    $(element).on('click.bs.dropdown', this.toggle)
-  }
-
-  Dropdown.VERSION = '3.3.7'
-
-  function getParent($this) {
-    var selector = $this.attr('data-target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    var $parent = selector && $(selector)
-
-    return $parent && $parent.length ? $parent : $this.parent()
-  }
-
-  function clearMenus(e) {
-    if (e && e.which === 3) return
-    $(backdrop).remove()
-    $(toggle).each(function () {
-      var $this         = $(this)
-      var $parent       = getParent($this)
-      var relatedTarget = { relatedTarget: this }
-
-      if (!$parent.hasClass('open')) return
-
-      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
-
-      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
-
-      if (e.isDefaultPrevented()) return
-
-      $this.attr('aria-expanded', 'false')
-      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
-    })
-  }
-
-  Dropdown.prototype.toggle = function (e) {
-    var $this = $(this)
-
-    if ($this.is('.disabled, :disabled')) return
-
-    var $parent  = getParent($this)
-    var isActive = $parent.hasClass('open')
-
-    clearMenus()
-
-    if (!isActive) {
-      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
-        // if mobile we use a backdrop because click events don't delegate
-        $(document.createElement('div'))
-          .addClass('dropdown-backdrop')
-          .insertAfter($(this))
-          .on('click', clearMenus)
-      }
-
-      var relatedTarget = { relatedTarget: this }
-      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
-
-      if (e.isDefaultPrevented()) return
-
-      $this
-        .trigger('focus')
-        .attr('aria-expanded', 'true')
-
-      $parent
-        .toggleClass('open')
-        .trigger($.Event('shown.bs.dropdown', relatedTarget))
-    }
-
-    return false
-  }
-
-  Dropdown.prototype.keydown = function (e) {
-    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
-
-    var $this = $(this)
-
-    e.preventDefault()
-    e.stopPropagation()
-
-    if ($this.is('.disabled, :disabled')) return
-
-    var $parent  = getParent($this)
-    var isActive = $parent.hasClass('open')
-
-    if (!isActive && e.which != 27 || isActive && e.which == 27) {
-      if (e.which == 27) $parent.find(toggle).trigger('focus')
-      return $this.trigger('click')
-    }
-
-    var desc = ' li:not(.disabled):visible a'
-    var $items = $parent.find('.dropdown-menu' + desc)
-
-    if (!$items.length) return
-
-    var index = $items.index(e.target)
-
-    if (e.which == 38 && index > 0)                 index--         // up
-    if (e.which == 40 && index < $items.length - 1) index++         // down
-    if (!~index)                                    index = 0
-
-    $items.eq(index).trigger('focus')
-  }
-
-
-  // DROPDOWN PLUGIN DEFINITION
-  // ==========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.dropdown')
-
-      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  var old = $.fn.dropdown
-
-  $.fn.dropdown             = Plugin
-  $.fn.dropdown.Constructor = Dropdown
-
-
-  // DROPDOWN NO CONFLICT
-  // ====================
-
-  $.fn.dropdown.noConflict = function () {
-    $.fn.dropdown = old
-    return this
-  }
-
-
-  // APPLY TO STANDARD DROPDOWN ELEMENTS
-  // ===================================
-
-  $(document)
-    .on('click.bs.dropdown.data-api', clearMenus)
-    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
-    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
-    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
-    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.3.7
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // MODAL CLASS DEFINITION
-  // ======================
-
-  var Modal = function (element, options) {
-    this.options             = options
-    this.$body               = $(document.body)
-    this.$element            = $(element)
-    this.$dialog             = this.$element.find('.modal-dialog')
-    this.$backdrop           = null
-    this.isShown             = null
-    this.originalBodyPad     = null
-    this.scrollbarWidth      = 0
-    this.ignoreBackdropClick = false
-
-    if (this.options.remote) {
-      this.$element
-        .find('.modal-content')
-        .load(this.options.remote, $.proxy(function () {
-          this.$element.trigger('loaded.bs.modal')
-        }, this))
-    }
-  }
-
-  Modal.VERSION  = '3.3.7'
-
-  Modal.TRANSITION_DURATION = 300
-  Modal.BACKDROP_TRANSITION_DURATION = 150
-
-  Modal.DEFAULTS = {
-    backdrop: true,
-    keyboard: true,
-    show: true
-  }
-
-  Modal.prototype.toggle = function (_relatedTarget) {
-    return this.isShown ? this.hide() : this.show(_relatedTarget)
-  }
-
-  Modal.prototype.show = function (_relatedTarget) {
-    var that = this
-    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
-
-    this.$element.trigger(e)
-
-    if (this.isShown || e.isDefaultPrevented()) return
-
-    this.isShown = true
-
-    this.checkScrollbar()
-    this.setScrollbar()
-    this.$body.addClass('modal-open')
-
-    this.escape()
-    this.resize()
-
-    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
-    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
-      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
-        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
-      })
-    })
-
-    this.backdrop(function () {
-      var transition = $.support.transition && that.$element.hasClass('fade')
-
-      if (!that.$element.parent().length) {
-        that.$element.appendTo(that.$body) // don't move modals dom position
-      }
-
-      that.$element
-        .show()
-        .scrollTop(0)
-
-      that.adjustDialog()
-
-      if (transition) {
-        that.$element[0].offsetWidth // force reflow
-      }
-
-      that.$element.addClass('in')
-
-      that.enforceFocus()
-
-      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
-      transition ?
-        that.$dialog // wait for modal to slide in
-          .one('bsTransitionEnd', function () {
-            that.$element.trigger('focus').trigger(e)
-          })
-          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
-        that.$element.trigger('focus').trigger(e)
-    })
-  }
-
-  Modal.prototype.hide = function (e) {
-    if (e) e.preventDefault()
-
-    e = $.Event('hide.bs.modal')
-
-    this.$element.trigger(e)
-
-    if (!this.isShown || e.isDefaultPrevented()) return
-
-    this.isShown = false
-
-    this.escape()
-    this.resize()
-
-    $(document).off('focusin.bs.modal')
-
-    this.$element
-      .removeClass('in')
-      .off('click.dismiss.bs.modal')
-      .off('mouseup.dismiss.bs.modal')
-
-    this.$dialog.off('mousedown.dismiss.bs.modal')
-
-    $.support.transition && this.$element.hasClass('fade') ?
-      this.$element
-        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
-        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
-      this.hideModal()
-  }
-
-  Modal.prototype.enforceFocus = function () {
-    $(document)
-      .off('focusin.bs.modal') // guard against infinite focus loop
-      .on('focusin.bs.modal', $.proxy(function (e) {
-        if (document !== e.target &&
-            this.$element[0] !== e.target &&
-            !this.$element.has(e.target).length) {
-          this.$element.trigger('focus')
-        }
-      }, this))
-  }
-
-  Modal.prototype.escape = function () {
-    if (this.isShown && this.options.keyboard) {
-      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
-        e.which == 27 && this.hide()
-      }, this))
-    } else if (!this.isShown) {
-      this.$element.off('keydown.dismiss.bs.modal')
-    }
-  }
-
-  Modal.prototype.resize = function () {
-    if (this.isShown) {
-      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
-    } else {
-      $(window).off('resize.bs.modal')
-    }
-  }
-
-  Modal.prototype.hideModal = function () {
-    var that = this
-    this.$element.hide()
-    this.backdrop(function () {
-      that.$body.removeClass('modal-open')
-      that.resetAdjustments()
-      that.resetScrollbar()
-      that.$element.trigger('hidden.bs.modal')
-    })
-  }
-
-  Modal.prototype.removeBackdrop = function () {
-    this.$backdrop && this.$backdrop.remove()
-    this.$backdrop = null
-  }
-
-  Modal.prototype.backdrop = function (callback) {
-    var that = this
-    var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-    if (this.isShown && this.options.backdrop) {
-      var doAnimate = $.support.transition && animate
-
-      this.$backdrop = $(document.createElement('div'))
-        .addClass('modal-backdrop ' + animate)
-        .appendTo(this.$body)
-
-      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
-        if (this.ignoreBackdropClick) {
-          this.ignoreBackdropClick = false
-          return
-        }
-        if (e.target !== e.currentTarget) return
-        this.options.backdrop == 'static'
-          ? this.$element[0].focus()
-          : this.hide()
-      }, this))
-
-      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-      this.$backdrop.addClass('in')
-
-      if (!callback) return
-
-      doAnimate ?
-        this.$backdrop
-          .one('bsTransitionEnd', callback)
-          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
-        callback()
-
-    } else if (!this.isShown && this.$backdrop) {
-      this.$backdrop.removeClass('in')
-
-      var callbackRemove = function () {
-        that.removeBackdrop()
-        callback && callback()
-      }
-      $.support.transition && this.$element.hasClass('fade') ?
-        this.$backdrop
-          .one('bsTransitionEnd', callbackRemove)
-          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
-        callbackRemove()
-
-    } else if (callback) {
-      callback()
-    }
-  }
-
-  // these following methods are used to handle overflowing modals
-
-  Modal.prototype.handleUpdate = function () {
-    this.adjustDialog()
-  }
-
-  Modal.prototype.adjustDialog = function () {
-    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
-
-    this.$element.css({
-      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
-      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
-    })
-  }
-
-  Modal.prototype.resetAdjustments = function () {
-    this.$element.css({
-      paddingLeft: '',
-      paddingRight: ''
-    })
-  }
-
-  Modal.prototype.checkScrollbar = function () {
-    var fullWindowWidth = window.innerWidth
-    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
-      var documentElementRect = document.documentElement.getBoundingClientRect()
-      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
-    }
-    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
-    this.scrollbarWidth = this.measureScrollbar()
-  }
-
-  Modal.prototype.setScrollbar = function () {
-    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
-    this.originalBodyPad = document.body.style.paddingRight || ''
-    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
-  }
-
-  Modal.prototype.resetScrollbar = function () {
-    this.$body.css('padding-right', this.originalBodyPad)
-  }
-
-  Modal.prototype.measureScrollbar = function () { // thx walsh
-    var scrollDiv = document.createElement('div')
-    scrollDiv.className = 'modal-scrollbar-measure'
-    this.$body.append(scrollDiv)
-    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
-    this.$body[0].removeChild(scrollDiv)
-    return scrollbarWidth
-  }
-
-
-  // MODAL PLUGIN DEFINITION
-  // =======================
-
-  function Plugin(option, _relatedTarget) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.modal')
-      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
-      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option](_relatedTarget)
-      else if (options.show) data.show(_relatedTarget)
-    })
-  }
-
-  var old = $.fn.modal
-
-  $.fn.modal             = Plugin
-  $.fn.modal.Constructor = Modal
-
-
-  // MODAL NO CONFLICT
-  // =================
-
-  $.fn.modal.noConflict = function () {
-    $.fn.modal = old
-    return this
-  }
-
-
-  // MODAL DATA-API
-  // ==============
-
-  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
-    var $this   = $(this)
-    var href    = $this.attr('href')
-    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
-    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
-    if ($this.is('a')) e.preventDefault()
-
-    $target.one('show.bs.modal', function (showEvent) {
-      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
-      $target.one('hidden.bs.modal', function () {
-        $this.is(':visible') && $this.trigger('focus')
-      })
-    })
-    Plugin.call($target, option, this)
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.3.7
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // TOOLTIP PUBLIC CLASS DEFINITION
-  // ===============================
-
-  var Tooltip = function (element, options) {
-    this.type       = null
-    this.options    = null
-    this.enabled    = null
-    this.timeout    = null
-    this.hoverState = null
-    this.$element   = null
-    this.inState    = null
-
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.VERSION  = '3.3.7'
-
-  Tooltip.TRANSITION_DURATION = 150
-
-  Tooltip.DEFAULTS = {
-    animation: true,
-    placement: 'top',
-    selector: false,
-    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
-    trigger: 'hover focus',
-    title: '',
-    delay: 0,
-    html: false,
-    container: false,
-    viewport: {
-      selector: 'body',
-      padding: 0
-    }
-  }
-
-  Tooltip.prototype.init = function (type, element, options) {
-    this.enabled   = true
-    this.type      = type
-    this.$element  = $(element)
-    this.options   = this.getOptions(options)
-    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
-    this.inState   = { click: false, hover: false, focus: false }
-
-    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
-      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
-    }
-
-    var triggers = this.options.trigger.split(' ')
-
-    for (var i = triggers.length; i--;) {
-      var trigger = triggers[i]
-
-      if (trigger == 'click') {
-        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
-      } else if (trigger != 'manual') {
-        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
-        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
-
-        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
-        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
-      }
-    }
-
-    this.options.selector ?
-      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-      this.fixTitle()
-  }
-
-  Tooltip.prototype.getDefaults = function () {
-    return Tooltip.DEFAULTS
-  }
-
-  Tooltip.prototype.getOptions = function (options) {
-    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
-
-    if (options.delay && typeof options.delay == 'number') {
-      options.delay = {
-        show: options.delay,
-        hide: options.delay
-      }
-    }
-
-    return options
-  }
-
-  Tooltip.prototype.getDelegateOptions = function () {
-    var options  = {}
-    var defaults = this.getDefaults()
-
-    this._options && $.each(this._options, function (key, value) {
-      if (defaults[key] != value) options[key] = value
-    })
-
-    return options
-  }
-
-  Tooltip.prototype.enter = function (obj) {
-    var self = obj instanceof this.constructor ?
-      obj : $(obj.currentTarget).data('bs.' + this.type)
-
-    if (!self) {
-      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
-      $(obj.currentTarget).data('bs.' + this.type, self)
-    }
-
-    if (obj instanceof $.Event) {
-      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
-    }
-
-    if (self.tip().hasClass('in') || self.hoverState == 'in') {
-      self.hoverState = 'in'
-      return
-    }
-
-    clearTimeout(self.timeout)
-
-    self.hoverState = 'in'
-
-    if (!self.options.delay || !self.options.delay.show) return self.show()
-
-    self.timeout = setTimeout(function () {
-      if (self.hoverState == 'in') self.show()
-    }, self.options.delay.show)
-  }
-
-  Tooltip.prototype.isInStateTrue = function () {
-    for (var key in this.inState) {
-      if (this.inState[key]) return true
-    }
-
-    return false
-  }
-
-  Tooltip.prototype.leave = function (obj) {
-    var self = obj instanceof this.constructor ?
-      obj : $(obj.currentTarget).data('bs.' + this.type)
-
-    if (!self) {
-      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
-      $(obj.currentTarget).data('bs.' + this.type, self)
-    }
-
-    if (obj instanceof $.Event) {
-      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
-    }
-
-    if (self.isInStateTrue()) return
-
-    clearTimeout(self.timeout)
-
-    self.hoverState = 'out'
-
-    if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-    self.timeout = setTimeout(function () {
-      if (self.hoverState == 'out') self.hide()
-    }, self.options.delay.hide)
-  }
-
-  Tooltip.prototype.show = function () {
-    var e = $.Event('show.bs.' + this.type)
-
-    if (this.hasContent() && this.enabled) {
-      this.$element.trigger(e)
-
-      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
-      if (e.isDefaultPrevented() || !inDom) return
-      var that = this
-
-      var $tip = this.tip()
-
-      var tipId = this.getUID(this.type)
-
-      this.setContent()
-      $tip.attr('id', tipId)
-      this.$element.attr('aria-describedby', tipId)
-
-      if (this.options.animation) $tip.addClass('fade')
-
-      var placement = typeof this.options.placement == 'function' ?
-        this.options.placement.call(this, $tip[0], this.$element[0]) :
-        this.options.placement
-
-      var autoToken = /\s?auto?\s?/i
-      var autoPlace = autoToken.test(placement)
-      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
-
-      $tip
-        .detach()
-        .css({ top: 0, left: 0, display: 'block' })
-        .addClass(placement)
-        .data('bs.' + this.type, this)
-
-      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-      this.$element.trigger('inserted.bs.' + this.type)
-
-      var pos          = this.getPosition()
-      var actualWidth  = $tip[0].offsetWidth
-      var actualHeight = $tip[0].offsetHeight
-
-      if (autoPlace) {
-        var orgPlacement = placement
-        var viewportDim = this.getPosition(this.$viewport)
-
-        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
-                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
-                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
-                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
-                    placement
-
-        $tip
-          .removeClass(orgPlacement)
-          .addClass(placement)
-      }
-
-      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
-      this.applyPlacement(calculatedOffset, placement)
-
-      var complete = function () {
-        var prevHoverState = that.hoverState
-        that.$element.trigger('shown.bs.' + that.type)
-        that.hoverState = null
-
-        if (prevHoverState == 'out') that.leave(that)
-      }
-
-      $.support.transition && this.$tip.hasClass('fade') ?
-        $tip
-          .one('bsTransitionEnd', complete)
-          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
-        complete()
-    }
-  }
-
-  Tooltip.prototype.applyPlacement = function (offset, placement) {
-    var $tip   = this.tip()
-    var width  = $tip[0].offsetWidth
-    var height = $tip[0].offsetHeight
-
-    // manually read margins because getBoundingClientRect includes difference
-    var marginTop = parseInt($tip.css('margin-top'), 10)
-    var marginLeft = parseInt($tip.css('margin-left'), 10)
-
-    // we must check for NaN for ie 8/9
-    if (isNaN(marginTop))  marginTop  = 0
-    if (isNaN(marginLeft)) marginLeft = 0
-
-    offset.top  += marginTop
-    offset.left += marginLeft
-
-    // $.fn.offset doesn't round pixel values
-    // so we use setOffset directly with our own function B-0
-    $.offset.setOffset($tip[0], $.extend({
-      using: function (props) {
-        $tip.css({
-          top: Math.round(props.top),
-          left: Math.round(props.left)
-        })
-      }
-    }, offset), 0)
-
-    $tip.addClass('in')
-
-    // check to see if placing tip in new offset caused the tip to resize itself
-    var actualWidth  = $tip[0].offsetWidth
-    var actualHeight = $tip[0].offsetHeight
-
-    if (placement == 'top' && actualHeight != height) {
-      offset.top = offset.top + height - actualHeight
-    }
-
-    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
-
-    if (delta.left) offset.left += delta.left
-    else offset.top += delta.top
-
-    var isVertical          = /top|bottom/.test(placement)
-    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
-    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
-
-    $tip.offset(offset)
-    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
-  }
-
-  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
-    this.arrow()
-      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
-      .css(isVertical ? 'top' : 'left', '')
-  }
-
-  Tooltip.prototype.setContent = function () {
-    var $tip  = this.tip()
-    var title = this.getTitle()
-
-    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
-    $tip.removeClass('fade in top bottom left right')
-  }
-
-  Tooltip.prototype.hide = function (callback) {
-    var that = this
-    var $tip = $(this.$tip)
-    var e    = $.Event('hide.bs.' + this.type)
-
-    function complete() {
-      if (that.hoverState != 'in') $tip.detach()
-      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
-        that.$element
-          .removeAttr('aria-describedby')
-          .trigger('hidden.bs.' + that.type)
-      }
-      callback && callback()
-    }
-
-    this.$element.trigger(e)
-
-    if (e.isDefaultPrevented()) return
-
-    $tip.removeClass('in')
-
-    $.support.transition && $tip.hasClass('fade') ?
-      $tip
-        .one('bsTransitionEnd', complete)
-        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
-      complete()
-
-    this.hoverState = null
-
-    return this
-  }
-
-  Tooltip.prototype.fixTitle = function () {
-    var $e = this.$element
-    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
-      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
-    }
-  }
-
-  Tooltip.prototype.hasContent = function () {
-    return this.getTitle()
-  }
-
-  Tooltip.prototype.getPosition = function ($element) {
-    $element   = $element || this.$element
-
-    var el     = $element[0]
-    var isBody = el.tagName == 'BODY'
-
-    var elRect    = el.getBoundingClientRect()
-    if (elRect.width == null) {
-      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
-      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
-    }
-    var isSvg = window.SVGElement && el instanceof window.SVGElement
-    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
-    // See https://github.com/twbs/bootstrap/issues/20280
-    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
-    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
-    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
-
-    return $.extend({}, elRect, scroll, outerDims, elOffset)
-  }
-
-  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
-    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
-           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
-           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
-        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
-
-  }
-
-  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
-    var delta = { top: 0, left: 0 }
-    if (!this.$viewport) return delta
-
-    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
-    var viewportDimensions = this.getPosition(this.$viewport)
-
-    if (/right|left/.test(placement)) {
-      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
-      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
-      if (topEdgeOffset < viewportDimensions.top) { // top overflow
-        delta.top = viewportDimensions.top - topEdgeOffset
-      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
-        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
-      }
-    } else {
-      var leftEdgeOffset  = pos.left - viewportPadding
-      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
-      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
-        delta.left = viewportDimensions.left - leftEdgeOffset
-      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
-        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
-      }
-    }
-
-    return delta
-  }
-
-  Tooltip.prototype.getTitle = function () {
-    var title
-    var $e = this.$element
-    var o  = this.options
-
-    title = $e.attr('data-original-title')
-      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-    return title
-  }
-
-  Tooltip.prototype.getUID = function (prefix) {
-    do prefix += ~~(Math.random() * 1000000)
-    while (document.getElementById(prefix))
-    return prefix
-  }
-
-  Tooltip.prototype.tip = function () {
-    if (!this.$tip) {
-      this.$tip = $(this.options.template)
-      if (this.$tip.length != 1) {
-        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
-      }
-    }
-    return this.$tip
-  }
-
-  Tooltip.prototype.arrow = function () {
-    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
-  }
-
-  Tooltip.prototype.enable = function () {
-    this.enabled = true
-  }
-
-  Tooltip.prototype.disable = function () {
-    this.enabled = false
-  }
-
-  Tooltip.prototype.toggleEnabled = function () {
-    this.enabled = !this.enabled
-  }
-
-  Tooltip.prototype.toggle = function (e) {
-    var self = this
-    if (e) {
-      self = $(e.currentTarget).data('bs.' + this.type)
-      if (!self) {
-        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
-        $(e.currentTarget).data('bs.' + this.type, self)
-      }
-    }
-
-    if (e) {
-      self.inState.click = !self.inState.click
-      if (self.isInStateTrue()) self.enter(self)
-      else self.leave(self)
-    } else {
-      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
-    }
-  }
-
-  Tooltip.prototype.destroy = function () {
-    var that = this
-    clearTimeout(this.timeout)
-    this.hide(function () {
-      that.$element.off('.' + that.type).removeData('bs.' + that.type)
-      if (that.$tip) {
-        that.$tip.detach()
-      }
-      that.$tip = null
-      that.$arrow = null
-      that.$viewport = null
-      that.$element = null
-    })
-  }
-
-
-  // TOOLTIP PLUGIN DEFINITION
-  // =========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.tooltip')
-      var options = typeof option == 'object' && option
-
-      if (!data && /destroy|hide/.test(option)) return
-      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.tooltip
-
-  $.fn.tooltip             = Plugin
-  $.fn.tooltip.Constructor = Tooltip
-
-
-  // TOOLTIP NO CONFLICT
-  // ===================
-
-  $.fn.tooltip.noConflict = function () {
-    $.fn.tooltip = old
-    return this
-  }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.3.7
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // POPOVER PUBLIC CLASS DEFINITION
-  // ===============================
-
-  var Popover = function (element, options) {
-    this.init('popover', element, options)
-  }
-
-  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
-
-  Popover.VERSION  = '3.3.7'
-
-  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
-    placement: 'right',
-    trigger: 'click',
-    content: '',
-    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
-  })
-
-
-  // NOTE: POPOVER EXTENDS tooltip.js
-  // ================================
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
-
-  Popover.prototype.constructor = Popover
-
-  Popover.prototype.getDefaults = function () {
-    return Popover.DEFAULTS
-  }
-
-  Popover.prototype.setContent = function () {
-    var $tip    = this.tip()
-    var title   = this.getTitle()
-    var content = this.getContent()
-
-    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
-    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
-      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
-    ](content)
-
-    $tip.removeClass('fade top bottom left right in')
-
-    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
-    // this manually by checking the contents.
-    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
-  }
-
-  Popover.prototype.hasContent = function () {
-    return this.getTitle() || this.getContent()
-  }
-
-  Popover.prototype.getContent = function () {
-    var $e = this.$element
-    var o  = this.options
-
-    return $e.attr('data-content')
-      || (typeof o.content == 'function' ?
-            o.content.call($e[0]) :
-            o.content)
-  }
-
-  Popover.prototype.arrow = function () {
-    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
-  }
-
-
-  // POPOVER PLUGIN DEFINITION
-  // =========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.popover')
-      var options = typeof option == 'object' && option
-
-      if (!data && /destroy|hide/.test(option)) return
-      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.popover
-
-  $.fn.popover             = Plugin
-  $.fn.popover.Constructor = Popover
-
-
-  // POPOVER NO CONFLICT
-  // ===================
-
-  $.fn.popover.noConflict = function () {
-    $.fn.popover = old
-    return this
-  }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tab.js v3.3.7
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // TAB CLASS DEFINITION
-  // ====================
-
-  var Tab = function (element) {
-    // jscs:disable requireDollarBeforejQueryAssignment
-    this.element = $(element)
-    // jscs:enable requireDollarBeforejQueryAssignment
-  }
-
-  Tab.VERSION = '3.3.7'
-
-  Tab.TRANSITION_DURATION = 150
-
-  Tab.prototype.show = function () {
-    var $this    = this.element
-    var $ul      = $this.closest('ul:not(.dropdown-menu)')
-    var selector = $this.data('target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    if ($this.parent('li').hasClass('active')) return
-
-    var $previous = $ul.find('.active:last a')
-    var hideEvent = $.Event('hide.bs.tab', {
-      relatedTarget: $this[0]
-    })
-    var showEvent = $.Event('show.bs.tab', {
-      relatedTarget: $previous[0]
-    })
-
-    $previous.trigger(hideEvent)
-    $this.trigger(showEvent)
-
-    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
-
-    var $target = $(selector)
-
-    this.activate($this.closest('li'), $ul)
-    this.activate($target, $target.parent(), function () {
-      $previous.trigger({
-        type: 'hidden.bs.tab',
-        relatedTarget: $this[0]
-      })
-      $this.trigger({
-        type: 'shown.bs.tab',
-        relatedTarget: $previous[0]
-      })
-    })
-  }
-
-  Tab.prototype.activate = function (element, container, callback) {
-    var $active    = container.find('> .active')
-    var transition = callback
-      && $.support.transition
-      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
-
-    function next() {
-      $active
-        .removeClass('active')
-        .find('> .dropdown-menu > .active')
-          .removeClass('active')
-        .end()
-        .find('[data-toggle="tab"]')
-          .attr('aria-expanded', false)
-
-      element
-        .addClass('active')
-        .find('[data-toggle="tab"]')
-          .attr('aria-expanded', true)
-
-      if (transition) {
-        element[0].offsetWidth // reflow for transition
-        element.addClass('in')
-      } else {
-        element.removeClass('fade')
-      }
-
-      if (element.parent('.dropdown-menu').length) {
-        element
-          .closest('li.dropdown')
-            .addClass('active')
-          .end()
-          .find('[data-toggle="tab"]')
-            .attr('aria-expanded', true)
-      }
-
-      callback && callback()
-    }
-
-    $active.length && transition ?
-      $active
-        .one('bsTransitionEnd', next)
-        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
-      next()
-
-    $active.removeClass('in')
-  }
-
-
-  // TAB PLUGIN DEFINITION
-  // =====================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.tab')
-
-      if (!data) $this.data('bs.tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.tab
-
-  $.fn.tab             = Plugin
-  $.fn.tab.Constructor = Tab
-
-
-  // TAB NO CONFLICT
-  // ===============
-
-  $.fn.tab.noConflict = function () {
-    $.fn.tab = old
-    return this
-  }
-
-
-  // TAB DATA-API
-  // ============
-
-  var clickHandler = function (e) {
-    e.preventDefault()
-    Plugin.call($(this), 'show')
-  }
-
-  $(document)
-    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
-    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: collapse.js v3.3.7
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-/* jshint latedef: false */
-
-+function ($) {
-  'use strict';
-
-  // COLLAPSE PUBLIC CLASS DEFINITION
-  // ================================
-
-  var Collapse = function (element, options) {
-    this.$element      = $(element)
-    this.options       = $.extend({}, Collapse.DEFAULTS, options)
-    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
-                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
-    this.transitioning = null
-
-    if (this.options.parent) {
-      this.$parent = this.getParent()
-    } else {
-      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
-    }
-
-    if (this.options.toggle) this.toggle()
-  }
-
-  Collapse.VERSION  = '3.3.7'
-
-  Collapse.TRANSITION_DURATION = 350
-
-  Collapse.DEFAULTS = {
-    toggle: true
-  }
-
-  Collapse.prototype.dimension = function () {
-    var hasWidth = this.$element.hasClass('width')
-    return hasWidth ? 'width' : 'height'
-  }
-
-  Collapse.prototype.show = function () {
-    if (this.transitioning || this.$element.hasClass('in')) return
-
-    var activesData
-    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
-
-    if (actives && actives.length) {
-      activesData = actives.data('bs.collapse')
-      if (activesData && activesData.transitioning) return
-    }
-
-    var startEvent = $.Event('show.bs.collapse')
-    this.$element.trigger(startEvent)
-    if (startEvent.isDefaultPrevented()) return
-
-    if (actives && actives.length) {
-      Plugin.call(actives, 'hide')
-      activesData || actives.data('bs.collapse', null)
-    }
-
-    var dimension = this.dimension()
-
-    this.$element
-      .removeClass('collapse')
-      .addClass('collapsing')[dimension](0)
-      .attr('aria-expanded', true)
-
-    this.$trigger
-      .removeClass('collapsed')
-      .attr('aria-expanded', true)
-
-    this.transitioning = 1
-
-    var complete = function () {
-      this.$element
-        .removeClass('collapsing')
-        .addClass('collapse in')[dimension]('')
-      this.transitioning = 0
-      this.$element
-        .trigger('shown.bs.collapse')
-    }
-
-    if (!$.support.transition) return complete.call(this)
-
-    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
-
-    this.$element
-      .one('bsTransitionEnd', $.proxy(complete, this))
-      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
-  }
-
-  Collapse.prototype.hide = function () {
-    if (this.transitioning || !this.$element.hasClass('in')) return
-
-    var startEvent = $.Event('hide.bs.collapse')
-    this.$element.trigger(startEvent)
-    if (startEvent.isDefaultPrevented()) return
-
-    var dimension = this.dimension()
-
-    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
-
-    this.$element
-      .addClass('collapsing')
-      .removeClass('collapse in')
-      .attr('aria-expanded', false)
-
-    this.$trigger
-      .addClass('collapsed')
-      .attr('aria-expanded', false)
-
-    this.transitioning = 1
-
-    var complete = function () {
-      this.transitioning = 0
-      this.$element
-        .removeClass('collapsing')
-        .addClass('collapse')
-        .trigger('hidden.bs.collapse')
-    }
-
-    if (!$.support.transition) return complete.call(this)
-
-    this.$element
-      [dimension](0)
-      .one('bsTransitionEnd', $.proxy(complete, this))
-      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
-  }
-
-  Collapse.prototype.toggle = function () {
-    this[this.$element.hasClass('in') ? 'hide' : 'show']()
-  }
-
-  Collapse.prototype.getParent = function () {
-    return $(this.options.parent)
-      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
-      .each($.proxy(function (i, element) {
-        var $element = $(element)
-        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
-      }, this))
-      .end()
-  }
-
-  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
-    var isOpen = $element.hasClass('in')
-
-    $element.attr('aria-expanded', isOpen)
-    $trigger
-      .toggleClass('collapsed', !isOpen)
-      .attr('aria-expanded', isOpen)
-  }
-
-  function getTargetFromTrigger($trigger) {
-    var href
-    var target = $trigger.attr('data-target')
-      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
-
-    return $(target)
-  }
-
-
-  // COLLAPSE PLUGIN DEFINITION
-  // ==========================
-
-  function Plugin(option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.collapse')
-      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
-      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
-      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  var old = $.fn.collapse
-
-  $.fn.collapse             = Plugin
-  $.fn.collapse.Constructor = Collapse
-
-
-  // COLLAPSE NO CONFLICT
-  // ====================
-
-  $.fn.collapse.noConflict = function () {
-    $.fn.collapse = old
-    return this
-  }
-
-
-  // COLLAPSE DATA-API
-  // =================
-
-  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
-    var $this   = $(this)
-
-    if (!$this.attr('data-target')) e.preventDefault()
-
-    var $target = getTargetFromTrigger($this)
-    var data    = $target.data('bs.collapse')
-    var option  = data ? 'toggle' : $this.data()
-
-    Plugin.call($target, option)
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: transition.js v3.3.7
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
-  'use strict';
-
-  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
-  // ============================================================
-
-  function transitionEnd() {
-    var el = document.createElement('bootstrap')
-
-    var transEndEventNames = {
-      WebkitTransition : 'webkitTransitionEnd',
-      MozTransition    : 'transitionend',
-      OTransition      : 'oTransitionEnd otransitionend',
-      transition       : 'transitionend'
-    }
-
-    for (var name in transEndEventNames) {
-      if (el.style[name] !== undefined) {
-        return { end: transEndEventNames[name] }
-      }
-    }
-
-    return false // explicit for ie8 (  ._.)
-  }
-
-  // http://blog.alexmaccaw.com/css-transitions
-  $.fn.emulateTransitionEnd = function (duration) {
-    var called = false
-    var $el = this
-    $(this).one('bsTransitionEnd', function () { called = true })
-    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
-    setTimeout(callback, duration)
-    return this
-  }
-
-  $(function () {
-    $.support.transition = transitionEnd()
-
-    if (!$.support.transition) return
-
-    $.event.special.bsTransitionEnd = {
-      bindType: $.support.transition.end,
-      delegateType: $.support.transition.end,
-      handle: function (e) {
-        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
-      }
-    }
-  })
-
-}(jQuery);
diff --git a/framework/crawler-ui/src/main/webapp/bootstrap/js/bootstrap.min.js b/framework/crawler-ui/src/main/webapp/bootstrap/js/bootstrap.min.js
deleted file mode 100644
index 253357f..0000000
--- a/framework/crawler-ui/src/main/webapp/bootstrap/js/bootstrap.min.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * 
- * Copyright (c) 2011-2016 Twitter, Inc.
- *
- * 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, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=cda9ed63f8b65c2a175b3ce0f640dcf9)
- * Config saved to config.json and https://gist.github.com/cda9ed63f8b65c2a175b3ce0f640dcf9
- */
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),n=i.data("bs.alert");n||i.data("bs.alert",n=new o(this)),"string"==typeof e&&n[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.3.7",o.TRANSITION_DURATION=150,o.prototype.close=function(e){function i(){r.detach().trigger("closed.bs.alert").remove()}var n=t(this),s=n.attr("data-target");s||(s=n.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var r=t("#"===s?[]:s);e&&e.preventDefault(),r.length||(r=n.closest(".alert")),r.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(r.removeClass("in"),t.support.transition&&r.hasClass("fade")?r.one("bsTransitionEnd",i).emulateTransitionEnd(o.TRANSITION_DURATION):i())};var n=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=n,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function i(i){i&&3===i.which||(t(n).remove(),t(s).each(function(){var o=t(this),n=e(o),s={relatedTarget:this};n.hasClass("open")&&(i&&"click"==i.type&&/input|textarea/i.test(i.target.tagName)&&t.contains(n[0],i.target)||(n.trigger(i=t.Event("hide.bs.dropdown",s)),i.isDefaultPrevented()||(o.attr("aria-expanded","false"),n.removeClass("open").trigger(t.Event("hidden.bs.dropdown",s)))))}))}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new r(this)),"string"==typeof e&&o[e].call(i)})}var n=".dropdown-backdrop",s='[data-toggle="dropdown"]',r=function(e){t(e).on("click.bs.dropdown",this.toggle)};r.VERSION="3.3.7",r.prototype.toggle=function(o){var n=t(this);if(!n.is(".disabled, :disabled")){var s=e(n),r=s.hasClass("open");if(i(),!r){"ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(t(this)).on("click",i);var a={relatedTarget:this};if(s.trigger(o=t.Event("show.bs.dropdown",a)),o.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),s.toggleClass("open").trigger(t.Event("shown.bs.dropdown",a))}return!1}},r.prototype.keydown=function(i){if(/(38|40|27|32)/.test(i.which)&&!/input|textarea/i.test(i.target.tagName)){var o=t(this);if(i.preventDefault(),i.stopPropagation(),!o.is(".disabled, :disabled")){var n=e(o),r=n.hasClass("open");if(!r&&27!=i.which||r&&27==i.which)return 27==i.which&&n.find(s).trigger("focus"),o.trigger("click");var a=" li:not(.disabled):visible a",l=n.find(".dropdown-menu"+a);if(l.length){var d=l.index(i.target);38==i.which&&d>0&&d--,40==i.which&&d<l.length-1&&d++,~d||(d=0),l.eq(d).trigger("focus")}}}};var a=t.fn.dropdown;t.fn.dropdown=o,t.fn.dropdown.Constructor=r,t.fn.dropdown.noConflict=function(){return t.fn.dropdown=a,this},t(document).on("click.bs.dropdown.data-api",i).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",s,r.prototype.toggle).on("keydown.bs.dropdown.data-api",s,r.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",r.prototype.keydown)}(jQuery),+function(t){"use strict";function e(e,o){return this.each(function(){var n=t(this),s=n.data("bs.modal"),r=t.extend({},i.DEFAULTS,n.data(),"object"==typeof e&&e);s||n.data("bs.modal",s=new i(this,r)),"string"==typeof e?s[e](o):r.show&&s.show(o)})}var i=function(e,i){this.options=i,this.$body=t(document.body),this.$element=t(e),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};i.VERSION="3.3.7",i.TRANSITION_DURATION=300,i.BACKDROP_TRANSITION_DURATION=150,i.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},i.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},i.prototype.show=function(e){var o=this,n=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(n),this.isShown||n.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){o.$element.one("mouseup.dismiss.bs.modal",function(e){t(e.target).is(o.$element)&&(o.ignoreBackdropClick=!0)})}),this.backdrop(function(){var n=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),o.adjustDialog(),n&&o.$element[0].offsetWidth,o.$element.addClass("in"),o.enforceFocus();var s=t.Event("shown.bs.modal",{relatedTarget:e});n?o.$dialog.one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(s)}).emulateTransitionEnd(i.TRANSITION_DURATION):o.$element.trigger("focus").trigger(s)}))},i.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(i.TRANSITION_DURATION):this.hideModal())},i.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){document===t.target||this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},i.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},i.prototype.resize=function(){this.isShown?t(window).on("resize.bs.modal",t.proxy(this.handleUpdate,this)):t(window).off("resize.bs.modal")},i.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},i.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},i.prototype.backdrop=function(e){var o=this,n=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&n;if(this.$backdrop=t(document.createElement("div")).addClass("modal-backdrop "+n).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),s&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;s?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var r=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",r).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):r()}else e&&e()},i.prototype.handleUpdate=function(){this.adjustDialog()},i.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},i.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",t+this.scrollbarWidth)},i.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},i.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var o=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=i,t.fn.modal.noConflict=function(){return t.fn.modal=o,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(i){var o=t(this),n=o.attr("href"),s=t(o.attr("data-target")||n&&n.replace(/.*(?=#[^\s]+$)/,"")),r=s.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(n)&&n},s.data(),o.data());o.is("a")&&i.preventDefault(),s.one("show.bs.modal",function(t){t.isDefaultPrevented()||s.one("hidden.bs.modal",function(){o.is(":visible")&&o.trigger("focus")})}),e.call(s,r,this)})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tooltip"),s="object"==typeof e&&e;!n&&/destroy|hide/.test(e)||(n||o.data("bs.tooltip",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",t,e)};i.VERSION="3.3.7",i.TRANSITION_DURATION=150,i.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(t.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var n=this.options.trigger.split(" "),s=n.length;s--;){var r=n[s];if("click"==r)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=r){var a="hover"==r?"mouseenter":"focusin",l="hover"==r?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusin"==e.type?"focus":"hover"]=!0),i.tip().hasClass("in")||"in"==i.hoverState?void(i.hoverState="in"):(clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusout"==e.type?"focus":"hover"]=!1),i.isInStateTrue()?void 0:(clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide())},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,s=this.tip(),r=this.getUID(this.type);this.setContent(),s.attr("id",r),this.$element.attr("aria-describedby",r),this.options.animation&&s.addClass("fade");var a="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,d=l.test(a);d&&(a=a.replace(l,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(a).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var h=this.getPosition(),p=s[0].offsetWidth,c=s[0].offsetHeight;if(d){var f=a,u=this.getPosition(this.$viewport);a="bottom"==a&&h.bottom+c>u.bottom?"top":"top"==a&&h.top-c<u.top?"bottom":"right"==a&&h.right+p>u.width?"left":"left"==a&&h.left-p<u.left?"right":a,s.removeClass(f).addClass(a)}var g=this.getCalculatedOffset(a,h,p,c);this.applyPlacement(g,a);var m=function(){var t=n.hoverState;n.$element.trigger("shown.bs."+n.type),n.hoverState=null,"out"==t&&n.leave(n)};t.support.transition&&this.$tip.hasClass("fade")?s.one("bsTransitionEnd",m).emulateTransitionEnd(i.TRANSITION_DURATION):m()}},i.prototype.applyPlacement=function(e,i){var o=this.tip(),n=o[0].offsetWidth,s=o[0].offsetHeight,r=parseInt(o.css("margin-top"),10),a=parseInt(o.css("margin-left"),10);isNaN(r)&&(r=0),isNaN(a)&&(a=0),e.top+=r,e.left+=a,t.offset.setOffset(o[0],t.extend({using:function(t){o.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),o.addClass("in");var l=o[0].offsetWidth,d=o[0].offsetHeight;"top"==i&&d!=s&&(e.top=e.top+s-d);var h=this.getViewportAdjustedDelta(i,e,l,d);h.left?e.left+=h.left:e.top+=h.top;var p=/top|bottom/.test(i),c=p?2*h.left-n+l:2*h.top-s+d,f=p?"offsetWidth":"offsetHeight";o.offset(e),this.replaceArrow(c,o[0][f],p)},i.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},i.prototype.hide=function(e){function o(){"in"!=n.hoverState&&s.detach(),n.$element&&n.$element.removeAttr("aria-describedby").trigger("hidden.bs."+n.type),e&&e()}var n=this,s=t(this.$tip),r=t.Event("hide.bs."+this.type);return this.$element.trigger(r),r.isDefaultPrevented()?void 0:(s.removeClass("in"),t.support.transition&&s.hasClass("fade")?s.one("bsTransitionEnd",o).emulateTransitionEnd(i.TRANSITION_DURATION):o(),this.hoverState=null,this)},i.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},i.prototype.hasContent=function(){return this.getTitle()},i.prototype.getPosition=function(e){e=e||this.$element;var i=e[0],o="BODY"==i.tagName,n=i.getBoundingClientRect();null==n.width&&(n=t.extend({},n,{width:n.right-n.left,height:n.bottom-n.top}));var s=window.SVGElement&&i instanceof window.SVGElement,r=o?{top:0,left:0}:s?null:e.offset(),a={scroll:o?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop()},l=o?{width:t(window).width(),height:t(window).height()}:null;return t.extend({},n,a,l,r)},i.prototype.getCalculatedOffset=function(t,e,i,o){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},i.prototype.getViewportAdjustedDelta=function(t,e,i,o){var n={top:0,left:0};if(!this.$viewport)return n;var s=this.options.viewport&&this.options.viewport.padding||0,r=this.getPosition(this.$viewport);if(/right|left/.test(t)){var a=e.top-s-r.scroll,l=e.top+s-r.scroll+o;a<r.top?n.top=r.top-a:l>r.top+r.height&&(n.top=r.top+r.height-l)}else{var d=e.left-s,h=e.left+s+i;d<r.left?n.left=r.left-d:h>r.right&&(n.left=r.left+r.width-h)}return n},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){if(!this.$tip&&(this.$tip=t(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),e?(i.inState.click=!i.inState.click,i.isInStateTrue()?i.enter(i):i.leave(i)):i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.popover"),s="object"==typeof e&&e;!n&&/destroy|hide/.test(e)||(n||o.data("bs.popover",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.7",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tab");n||o.data("bs.tab",n=new i(this)),"string"==typeof e&&n[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.3.7",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var n=i.find(".active:last a"),s=t.Event("hide.bs.tab",{relatedTarget:e[0]}),r=t.Event("show.bs.tab",{relatedTarget:n[0]});if(n.trigger(s),e.trigger(r),!r.isDefaultPrevented()&&!s.isDefaultPrevented()){var a=t(o);this.activate(e.closest("li"),i),this.activate(a,a.parent(),function(){n.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:n[0]})})}}},i.prototype.activate=function(e,o,n){function s(){r.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),a?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),n&&n()}var r=o.find("> .active"),a=n&&t.support.transition&&(r.length&&r.hasClass("fade")||!!o.find("> .fade").length);r.length&&a?r.one("bsTransitionEnd",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),r.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this};var n=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',n).on("click.bs.tab.data-api",'[data-toggle="pill"]',n)}(jQuery),+function(t){"use strict";function e(e){var i,o=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(o)}function i(e){return this.each(function(){var i=t(this),n=i.data("bs.collapse"),s=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);!n&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),n||i.data("bs.collapse",n=new o(this,s)),"string"==typeof e&&n[e]()})}var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};o.VERSION="3.3.7",o.TRANSITION_DURATION=350,o.DEFAULTS={toggle:!0},o.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},o.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var s=t.Event("show.bs.collapse");if(this.$element.trigger(s),!s.isDefaultPrevented()){n&&n.length&&(i.call(n,"hide"),e||n.data("bs.collapse",null));var r=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[r](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[r](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return a.call(this);var l=t.camelCase(["scroll",r].join("-"));this.$element.one("bsTransitionEnd",t.proxy(a,this)).emulateTransitionEnd(o.TRANSITION_DURATION)[r](this.$element[0][l])}}}},o.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(o.TRANSITION_DURATION):n.call(this)}}},o.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},o.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,o){var n=t(o);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},o.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var n=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=o,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(o){var n=t(this);n.attr("data-target")||o.preventDefault();var s=e(n),r=s.data("bs.collapse"),a=r?"toggle":n.data();i.call(s,a)})}(jQuery),+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}t.fn.emulateTransitionEnd=function(e){var i=!1,o=this;t(this).one("bsTransitionEnd",function(){i=!0});var n=function(){i||t(o).trigger(t.support.transition.end)};return setTimeout(n,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){return t(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery);
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/css/font-awesome.css b/framework/crawler-ui/src/main/webapp/css/font-awesome.css
deleted file mode 100644
index 9dc2379..0000000
--- a/framework/crawler-ui/src/main/webapp/css/font-awesome.css
+++ /dev/null
@@ -1,2357 +0,0 @@
-/*!
- *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- *
- * 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, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
-  *
- * 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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- 
-/* FONT PATH
- * -------------------------- */
-@font-face {
-  font-family: 'FontAwesome';
-  src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
-  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
-  font-weight: normal;
-  font-style: normal;
-}
-.fa {
-  display: inline-block;
-  font: normal normal normal 14px/1 FontAwesome;
-  font-size: inherit;
-  text-rendering: auto;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-/* makes the font 33% larger relative to the icon container */
-.fa-lg {
-  font-size: 1.33333333em;
-  line-height: 0.75em;
-  vertical-align: -15%;
-}
-.fa-2x {
-  font-size: 2em;
-}
-.fa-3x {
-  font-size: 3em;
-}
-.fa-4x {
-  font-size: 4em;
-}
-.fa-5x {
-  font-size: 5em;
-}
-.fa-fw {
-  width: 1.28571429em;
-  text-align: center;
-}
-.fa-ul {
-  padding-left: 0;
-  margin-left: 2.14285714em;
-  list-style-type: none;
-}
-.fa-ul > li {
-  position: relative;
-}
-.fa-li {
-  position: absolute;
-  left: -2.14285714em;
-  width: 2.14285714em;
-  top: 0.14285714em;
-  text-align: center;
-}
-.fa-li.fa-lg {
-  left: -1.85714286em;
-}
-.fa-border {
-  padding: .2em .25em .15em;
-  border: solid 0.08em #eeeeee;
-  border-radius: .1em;
-}
-.fa-pull-left {
-  float: left;
-}
-.fa-pull-right {
-  float: right;
-}
-.fa.fa-pull-left {
-  margin-right: .3em;
-}
-.fa.fa-pull-right {
-  margin-left: .3em;
-}
-/* Deprecated as of 4.4.0 */
-.pull-right {
-  float: right;
-}
-.pull-left {
-  float: left;
-}
-.fa.pull-left {
-  margin-right: .3em;
-}
-.fa.pull-right {
-  margin-left: .3em;
-}
-.fa-spin {
-  -webkit-animation: fa-spin 2s infinite linear;
-  animation: fa-spin 2s infinite linear;
-}
-.fa-pulse {
-  -webkit-animation: fa-spin 1s infinite steps(8);
-  animation: fa-spin 1s infinite steps(8);
-}
-@-webkit-keyframes fa-spin {
-  0% {
-    -webkit-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  100% {
-    -webkit-transform: rotate(359deg);
-    transform: rotate(359deg);
-  }
-}
-@keyframes fa-spin {
-  0% {
-    -webkit-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  100% {
-    -webkit-transform: rotate(359deg);
-    transform: rotate(359deg);
-  }
-}
-.fa-rotate-90 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
-  -webkit-transform: rotate(90deg);
-  -ms-transform: rotate(90deg);
-  transform: rotate(90deg);
-}
-.fa-rotate-180 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
-  -webkit-transform: rotate(180deg);
-  -ms-transform: rotate(180deg);
-  transform: rotate(180deg);
-}
-.fa-rotate-270 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
-  -webkit-transform: rotate(270deg);
-  -ms-transform: rotate(270deg);
-  transform: rotate(270deg);
-}
-.fa-flip-horizontal {
-  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
-  -webkit-transform: scale(-1, 1);
-  -ms-transform: scale(-1, 1);
-  transform: scale(-1, 1);
-}
-.fa-flip-vertical {
-  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-  -webkit-transform: scale(1, -1);
-  -ms-transform: scale(1, -1);
-  transform: scale(1, -1);
-}
-:root .fa-rotate-90,
-:root .fa-rotate-180,
-:root .fa-rotate-270,
-:root .fa-flip-horizontal,
-:root .fa-flip-vertical {
-  filter: none;
-}
-.fa-stack {
-  position: relative;
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-.fa-stack-1x,
-.fa-stack-2x {
-  position: absolute;
-  left: 0;
-  width: 100%;
-  text-align: center;
-}
-.fa-stack-1x {
-  line-height: inherit;
-}
-.fa-stack-2x {
-  font-size: 2em;
-}
-.fa-inverse {
-  color: #ffffff;
-}
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
-   readers do not read off random characters that represent icons */
-.fa-glass:before {
-  content: "\f000";
-}
-.fa-music:before {
-  content: "\f001";
-}
-.fa-search:before {
-  content: "\f002";
-}
-.fa-envelope-o:before {
-  content: "\f003";
-}
-.fa-heart:before {
-  content: "\f004";
-}
-.fa-star:before {
-  content: "\f005";
-}
-.fa-star-o:before {
-  content: "\f006";
-}
-.fa-user:before {
-  content: "\f007";
-}
-.fa-film:before {
-  content: "\f008";
-}
-.fa-th-large:before {
-  content: "\f009";
-}
-.fa-th:before {
-  content: "\f00a";
-}
-.fa-th-list:before {
-  content: "\f00b";
-}
-.fa-check:before {
-  content: "\f00c";
-}
-.fa-remove:before,
-.fa-close:before,
-.fa-times:before {
-  content: "\f00d";
-}
-.fa-search-plus:before {
-  content: "\f00e";
-}
-.fa-search-minus:before {
-  content: "\f010";
-}
-.fa-power-off:before {
-  content: "\f011";
-}
-.fa-signal:before {
-  content: "\f012";
-}
-.fa-gear:before,
-.fa-cog:before {
-  content: "\f013";
-}
-.fa-trash-o:before {
-  content: "\f014";
-}
-.fa-home:before {
-  content: "\f015";
-}
-.fa-file-o:before {
-  content: "\f016";
-}
-.fa-clock-o:before {
-  content: "\f017";
-}
-.fa-road:before {
-  content: "\f018";
-}
-.fa-download:before {
-  content: "\f019";
-}
-.fa-arrow-circle-o-down:before {
-  content: "\f01a";
-}
-.fa-arrow-circle-o-up:before {
-  content: "\f01b";
-}
-.fa-inbox:before {
-  content: "\f01c";
-}
-.fa-play-circle-o:before {
-  content: "\f01d";
-}
-.fa-rotate-right:before,
-.fa-repeat:before {
-  content: "\f01e";
-}
-.fa-refresh:before {
-  content: "\f021";
-}
-.fa-list-alt:before {
-  content: "\f022";
-}
-.fa-lock:before {
-  content: "\f023";
-}
-.fa-flag:before {
-  content: "\f024";
-}
-.fa-headphones:before {
-  content: "\f025";
-}
-.fa-volume-off:before {
-  content: "\f026";
-}
-.fa-volume-down:before {
-  content: "\f027";
-}
-.fa-volume-up:before {
-  content: "\f028";
-}
-.fa-qrcode:before {
-  content: "\f029";
-}
-.fa-barcode:before {
-  content: "\f02a";
-}
-.fa-tag:before {
-  content: "\f02b";
-}
-.fa-tags:before {
-  content: "\f02c";
-}
-.fa-book:before {
-  content: "\f02d";
-}
-.fa-bookmark:before {
-  content: "\f02e";
-}
-.fa-print:before {
-  content: "\f02f";
-}
-.fa-camera:before {
-  content: "\f030";
-}
-.fa-font:before {
-  content: "\f031";
-}
-.fa-bold:before {
-  content: "\f032";
-}
-.fa-italic:before {
-  content: "\f033";
-}
-.fa-text-height:before {
-  content: "\f034";
-}
-.fa-text-width:before {
-  content: "\f035";
-}
-.fa-align-left:before {
-  content: "\f036";
-}
-.fa-align-center:before {
-  content: "\f037";
-}
-.fa-align-right:before {
-  content: "\f038";
-}
-.fa-align-justify:before {
-  content: "\f039";
-}
-.fa-list:before {
-  content: "\f03a";
-}
-.fa-dedent:before,
-.fa-outdent:before {
-  content: "\f03b";
-}
-.fa-indent:before {
-  content: "\f03c";
-}
-.fa-video-camera:before {
-  content: "\f03d";
-}
-.fa-photo:before,
-.fa-image:before,
-.fa-picture-o:before {
-  content: "\f03e";
-}
-.fa-pencil:before {
-  content: "\f040";
-}
-.fa-map-marker:before {
-  content: "\f041";
-}
-.fa-adjust:before {
-  content: "\f042";
-}
-.fa-tint:before {
-  content: "\f043";
-}
-.fa-edit:before,
-.fa-pencil-square-o:before {
-  content: "\f044";
-}
-.fa-share-square-o:before {
-  content: "\f045";
-}
-.fa-check-square-o:before {
-  content: "\f046";
-}
-.fa-arrows:before {
-  content: "\f047";
-}
-.fa-step-backward:before {
-  content: "\f048";
-}
-.fa-fast-backward:before {
-  content: "\f049";
-}
-.fa-backward:before {
-  content: "\f04a";
-}
-.fa-play:before {
-  content: "\f04b";
-}
-.fa-pause:before {
-  content: "\f04c";
-}
-.fa-stop:before {
-  content: "\f04d";
-}
-.fa-forward:before {
-  content: "\f04e";
-}
-.fa-fast-forward:before {
-  content: "\f050";
-}
-.fa-step-forward:before {
-  content: "\f051";
-}
-.fa-eject:before {
-  content: "\f052";
-}
-.fa-chevron-left:before {
-  content: "\f053";
-}
-.fa-chevron-right:before {
-  content: "\f054";
-}
-.fa-plus-circle:before {
-  content: "\f055";
-}
-.fa-minus-circle:before {
-  content: "\f056";
-}
-.fa-times-circle:before {
-  content: "\f057";
-}
-.fa-check-circle:before {
-  content: "\f058";
-}
-.fa-question-circle:before {
-  content: "\f059";
-}
-.fa-info-circle:before {
-  content: "\f05a";
-}
-.fa-crosshairs:before {
-  content: "\f05b";
-}
-.fa-times-circle-o:before {
-  content: "\f05c";
-}
-.fa-check-circle-o:before {
-  content: "\f05d";
-}
-.fa-ban:before {
-  content: "\f05e";
-}
-.fa-arrow-left:before {
-  content: "\f060";
-}
-.fa-arrow-right:before {
-  content: "\f061";
-}
-.fa-arrow-up:before {
-  content: "\f062";
-}
-.fa-arrow-down:before {
-  content: "\f063";
-}
-.fa-mail-forward:before,
-.fa-share:before {
-  content: "\f064";
-}
-.fa-expand:before {
-  content: "\f065";
-}
-.fa-compress:before {
-  content: "\f066";
-}
-.fa-plus:before {
-  content: "\f067";
-}
-.fa-minus:before {
-  content: "\f068";
-}
-.fa-asterisk:before {
-  content: "\f069";
-}
-.fa-exclamation-circle:before {
-  content: "\f06a";
-}
-.fa-gift:before {
-  content: "\f06b";
-}
-.fa-leaf:before {
-  content: "\f06c";
-}
-.fa-fire:before {
-  content: "\f06d";
-}
-.fa-eye:before {
-  content: "\f06e";
-}
-.fa-eye-slash:before {
-  content: "\f070";
-}
-.fa-warning:before,
-.fa-exclamation-triangle:before {
-  content: "\f071";
-}
-.fa-plane:before {
-  content: "\f072";
-}
-.fa-calendar:before {
-  content: "\f073";
-}
-.fa-random:before {
-  content: "\f074";
-}
-.fa-comment:before {
-  content: "\f075";
-}
-.fa-magnet:before {
-  content: "\f076";
-}
-.fa-chevron-up:before {
-  content: "\f077";
-}
-.fa-chevron-down:before {
-  content: "\f078";
-}
-.fa-retweet:before {
-  content: "\f079";
-}
-.fa-shopping-cart:before {
-  content: "\f07a";
-}
-.fa-folder:before {
-  content: "\f07b";
-}
-.fa-folder-open:before {
-  content: "\f07c";
-}
-.fa-arrows-v:before {
-  content: "\f07d";
-}
-.fa-arrows-h:before {
-  content: "\f07e";
-}
-.fa-bar-chart-o:before,
-.fa-bar-chart:before {
-  content: "\f080";
-}
-.fa-twitter-square:before {
-  content: "\f081";
-}
-.fa-facebook-square:before {
-  content: "\f082";
-}
-.fa-camera-retro:before {
-  content: "\f083";
-}
-.fa-key:before {
-  content: "\f084";
-}
-.fa-gears:before,
-.fa-cogs:before {
-  content: "\f085";
-}
-.fa-comments:before {
-  content: "\f086";
-}
-.fa-thumbs-o-up:before {
-  content: "\f087";
-}
-.fa-thumbs-o-down:before {
-  content: "\f088";
-}
-.fa-star-half:before {
-  content: "\f089";
-}
-.fa-heart-o:before {
-  content: "\f08a";
-}
-.fa-sign-out:before {
-  content: "\f08b";
-}
-.fa-linkedin-square:before {
-  content: "\f08c";
-}
-.fa-thumb-tack:before {
-  content: "\f08d";
-}
-.fa-external-link:before {
-  content: "\f08e";
-}
-.fa-sign-in:before {
-  content: "\f090";
-}
-.fa-trophy:before {
-  content: "\f091";
-}
-.fa-github-square:before {
-  content: "\f092";
-}
-.fa-upload:before {
-  content: "\f093";
-}
-.fa-lemon-o:before {
-  content: "\f094";
-}
-.fa-phone:before {
-  content: "\f095";
-}
-.fa-square-o:before {
-  content: "\f096";
-}
-.fa-bookmark-o:before {
-  content: "\f097";
-}
-.fa-phone-square:before {
-  content: "\f098";
-}
-.fa-twitter:before {
-  content: "\f099";
-}
-.fa-facebook-f:before,
-.fa-facebook:before {
-  content: "\f09a";
-}
-.fa-github:before {
-  content: "\f09b";
-}
-.fa-unlock:before {
-  content: "\f09c";
-}
-.fa-credit-card:before {
-  content: "\f09d";
-}
-.fa-feed:before,
-.fa-rss:before {
-  content: "\f09e";
-}
-.fa-hdd-o:before {
-  content: "\f0a0";
-}
-.fa-bullhorn:before {
-  content: "\f0a1";
-}
-.fa-bell:before {
-  content: "\f0f3";
-}
-.fa-certificate:before {
-  content: "\f0a3";
-}
-.fa-hand-o-right:before {
-  content: "\f0a4";
-}
-.fa-hand-o-left:before {
-  content: "\f0a5";
-}
-.fa-hand-o-up:before {
-  content: "\f0a6";
-}
-.fa-hand-o-down:before {
-  content: "\f0a7";
-}
-.fa-arrow-circle-left:before {
-  content: "\f0a8";
-}
-.fa-arrow-circle-right:before {
-  content: "\f0a9";
-}
-.fa-arrow-circle-up:before {
-  content: "\f0aa";
-}
-.fa-arrow-circle-down:before {
-  content: "\f0ab";
-}
-.fa-globe:before {
-  content: "\f0ac";
-}
-.fa-wrench:before {
-  content: "\f0ad";
-}
-.fa-tasks:before {
-  content: "\f0ae";
-}
-.fa-filter:before {
-  content: "\f0b0";
-}
-.fa-briefcase:before {
-  content: "\f0b1";
-}
-.fa-arrows-alt:before {
-  content: "\f0b2";
-}
-.fa-group:before,
-.fa-users:before {
-  content: "\f0c0";
-}
-.fa-chain:before,
-.fa-link:before {
-  content: "\f0c1";
-}
-.fa-cloud:before {
-  content: "\f0c2";
-}
-.fa-flask:before {
-  content: "\f0c3";
-}
-.fa-cut:before,
-.fa-scissors:before {
-  content: "\f0c4";
-}
-.fa-copy:before,
-.fa-files-o:before {
-  content: "\f0c5";
-}
-.fa-paperclip:before {
-  content: "\f0c6";
-}
-.fa-save:before,
-.fa-floppy-o:before {
-  content: "\f0c7";
-}
-.fa-square:before {
-  content: "\f0c8";
-}
-.fa-navicon:before,
-.fa-reorder:before,
-.fa-bars:before {
-  content: "\f0c9";
-}
-.fa-list-ul:before {
-  content: "\f0ca";
-}
-.fa-list-ol:before {
-  content: "\f0cb";
-}
-.fa-strikethrough:before {
-  content: "\f0cc";
-}
-.fa-underline:before {
-  content: "\f0cd";
-}
-.fa-table:before {
-  content: "\f0ce";
-}
-.fa-magic:before {
-  content: "\f0d0";
-}
-.fa-truck:before {
-  content: "\f0d1";
-}
-.fa-pinterest:before {
-  content: "\f0d2";
-}
-.fa-pinterest-square:before {
-  content: "\f0d3";
-}
-.fa-google-plus-square:before {
-  content: "\f0d4";
-}
-.fa-google-plus:before {
-  content: "\f0d5";
-}
-.fa-money:before {
-  content: "\f0d6";
-}
-.fa-caret-down:before {
-  content: "\f0d7";
-}
-.fa-caret-up:before {
-  content: "\f0d8";
-}
-.fa-caret-left:before {
-  content: "\f0d9";
-}
-.fa-caret-right:before {
-  content: "\f0da";
-}
-.fa-columns:before {
-  content: "\f0db";
-}
-.fa-unsorted:before,
-.fa-sort:before {
-  content: "\f0dc";
-}
-.fa-sort-down:before,
-.fa-sort-desc:before {
-  content: "\f0dd";
-}
-.fa-sort-up:before,
-.fa-sort-asc:before {
-  content: "\f0de";
-}
-.fa-envelope:before {
-  content: "\f0e0";
-}
-.fa-linkedin:before {
-  content: "\f0e1";
-}
-.fa-rotate-left:before,
-.fa-undo:before {
-  content: "\f0e2";
-}
-.fa-legal:before,
-.fa-gavel:before {
-  content: "\f0e3";
-}
-.fa-dashboard:before,
-.fa-tachometer:before {
-  content: "\f0e4";
-}
-.fa-comment-o:before {
-  content: "\f0e5";
-}
-.fa-comments-o:before {
-  content: "\f0e6";
-}
-.fa-flash:before,
-.fa-bolt:before {
-  content: "\f0e7";
-}
-.fa-sitemap:before {
-  content: "\f0e8";
-}
-.fa-umbrella:before {
-  content: "\f0e9";
-}
-.fa-paste:before,
-.fa-clipboard:before {
-  content: "\f0ea";
-}
-.fa-lightbulb-o:before {
-  content: "\f0eb";
-}
-.fa-exchange:before {
-  content: "\f0ec";
-}
-.fa-cloud-download:before {
-  content: "\f0ed";
-}
-.fa-cloud-upload:before {
-  content: "\f0ee";
-}
-.fa-user-md:before {
-  content: "\f0f0";
-}
-.fa-stethoscope:before {
-  content: "\f0f1";
-}
-.fa-suitcase:before {
-  content: "\f0f2";
-}
-.fa-bell-o:before {
-  content: "\f0a2";
-}
-.fa-coffee:before {
-  content: "\f0f4";
-}
-.fa-cutlery:before {
-  content: "\f0f5";
-}
-.fa-file-text-o:before {
-  content: "\f0f6";
-}
-.fa-building-o:before {
-  content: "\f0f7";
-}
-.fa-hospital-o:before {
-  content: "\f0f8";
-}
-.fa-ambulance:before {
-  content: "\f0f9";
-}
-.fa-medkit:before {
-  content: "\f0fa";
-}
-.fa-fighter-jet:before {
-  content: "\f0fb";
-}
-.fa-beer:before {
-  content: "\f0fc";
-}
-.fa-h-square:before {
-  content: "\f0fd";
-}
-.fa-plus-square:before {
-  content: "\f0fe";
-}
-.fa-angle-double-left:before {
-  content: "\f100";
-}
-.fa-angle-double-right:before {
-  content: "\f101";
-}
-.fa-angle-double-up:before {
-  content: "\f102";
-}
-.fa-angle-double-down:before {
-  content: "\f103";
-}
-.fa-angle-left:before {
-  content: "\f104";
-}
-.fa-angle-right:before {
-  content: "\f105";
-}
-.fa-angle-up:before {
-  content: "\f106";
-}
-.fa-angle-down:before {
-  content: "\f107";
-}
-.fa-desktop:before {
-  content: "\f108";
-}
-.fa-laptop:before {
-  content: "\f109";
-}
-.fa-tablet:before {
-  content: "\f10a";
-}
-.fa-mobile-phone:before,
-.fa-mobile:before {
-  content: "\f10b";
-}
-.fa-circle-o:before {
-  content: "\f10c";
-}
-.fa-quote-left:before {
-  content: "\f10d";
-}
-.fa-quote-right:before {
-  content: "\f10e";
-}
-.fa-spinner:before {
-  content: "\f110";
-}
-.fa-circle:before {
-  content: "\f111";
-}
-.fa-mail-reply:before,
-.fa-reply:before {
-  content: "\f112";
-}
-.fa-github-alt:before {
-  content: "\f113";
-}
-.fa-folder-o:before {
-  content: "\f114";
-}
-.fa-folder-open-o:before {
-  content: "\f115";
-}
-.fa-smile-o:before {
-  content: "\f118";
-}
-.fa-frown-o:before {
-  content: "\f119";
-}
-.fa-meh-o:before {
-  content: "\f11a";
-}
-.fa-gamepad:before {
-  content: "\f11b";
-}
-.fa-keyboard-o:before {
-  content: "\f11c";
-}
-.fa-flag-o:before {
-  content: "\f11d";
-}
-.fa-flag-checkered:before {
-  content: "\f11e";
-}
-.fa-terminal:before {
-  content: "\f120";
-}
-.fa-code:before {
-  content: "\f121";
-}
-.fa-mail-reply-all:before,
-.fa-reply-all:before {
-  content: "\f122";
-}
-.fa-star-half-empty:before,
-.fa-star-half-full:before,
-.fa-star-half-o:before {
-  content: "\f123";
-}
-.fa-location-arrow:before {
-  content: "\f124";
-}
-.fa-crop:before {
-  content: "\f125";
-}
-.fa-code-fork:before {
-  content: "\f126";
-}
-.fa-unlink:before,
-.fa-chain-broken:before {
-  content: "\f127";
-}
-.fa-question:before {
-  content: "\f128";
-}
-.fa-info:before {
-  content: "\f129";
-}
-.fa-exclamation:before {
-  content: "\f12a";
-}
-.fa-superscript:before {
-  content: "\f12b";
-}
-.fa-subscript:before {
-  content: "\f12c";
-}
-.fa-eraser:before {
-  content: "\f12d";
-}
-.fa-puzzle-piece:before {
-  content: "\f12e";
-}
-.fa-microphone:before {
-  content: "\f130";
-}
-.fa-microphone-slash:before {
-  content: "\f131";
-}
-.fa-shield:before {
-  content: "\f132";
-}
-.fa-calendar-o:before {
-  content: "\f133";
-}
-.fa-fire-extinguisher:before {
-  content: "\f134";
-}
-.fa-rocket:before {
-  content: "\f135";
-}
-.fa-maxcdn:before {
-  content: "\f136";
-}
-.fa-chevron-circle-left:before {
-  content: "\f137";
-}
-.fa-chevron-circle-right:before {
-  content: "\f138";
-}
-.fa-chevron-circle-up:before {
-  content: "\f139";
-}
-.fa-chevron-circle-down:before {
-  content: "\f13a";
-}
-.fa-html5:before {
-  content: "\f13b";
-}
-.fa-css3:before {
-  content: "\f13c";
-}
-.fa-anchor:before {
-  content: "\f13d";
-}
-.fa-unlock-alt:before {
-  content: "\f13e";
-}
-.fa-bullseye:before {
-  content: "\f140";
-}
-.fa-ellipsis-h:before {
-  content: "\f141";
-}
-.fa-ellipsis-v:before {
-  content: "\f142";
-}
-.fa-rss-square:before {
-  content: "\f143";
-}
-.fa-play-circle:before {
-  content: "\f144";
-}
-.fa-ticket:before {
-  content: "\f145";
-}
-.fa-minus-square:before {
-  content: "\f146";
-}
-.fa-minus-square-o:before {
-  content: "\f147";
-}
-.fa-level-up:before {
-  content: "\f148";
-}
-.fa-level-down:before {
-  content: "\f149";
-}
-.fa-check-square:before {
-  content: "\f14a";
-}
-.fa-pencil-square:before {
-  content: "\f14b";
-}
-.fa-external-link-square:before {
-  content: "\f14c";
-}
-.fa-share-square:before {
-  content: "\f14d";
-}
-.fa-compass:before {
-  content: "\f14e";
-}
-.fa-toggle-down:before,
-.fa-caret-square-o-down:before {
-  content: "\f150";
-}
-.fa-toggle-up:before,
-.fa-caret-square-o-up:before {
-  content: "\f151";
-}
-.fa-toggle-right:before,
-.fa-caret-square-o-right:before {
-  content: "\f152";
-}
-.fa-euro:before,
-.fa-eur:before {
-  content: "\f153";
-}
-.fa-gbp:before {
-  content: "\f154";
-}
-.fa-dollar:before,
-.fa-usd:before {
-  content: "\f155";
-}
-.fa-rupee:before,
-.fa-inr:before {
-  content: "\f156";
-}
-.fa-cny:before,
-.fa-rmb:before,
-.fa-yen:before,
-.fa-jpy:before {
-  content: "\f157";
-}
-.fa-ruble:before,
-.fa-rouble:before,
-.fa-rub:before {
-  content: "\f158";
-}
-.fa-won:before,
-.fa-krw:before {
-  content: "\f159";
-}
-.fa-bitcoin:before,
-.fa-btc:before {
-  content: "\f15a";
-}
-.fa-file:before {
-  content: "\f15b";
-}
-.fa-file-text:before {
-  content: "\f15c";
-}
-.fa-sort-alpha-asc:before {
-  content: "\f15d";
-}
-.fa-sort-alpha-desc:before {
-  content: "\f15e";
-}
-.fa-sort-amount-asc:before {
-  content: "\f160";
-}
-.fa-sort-amount-desc:before {
-  content: "\f161";
-}
-.fa-sort-numeric-asc:before {
-  content: "\f162";
-}
-.fa-sort-numeric-desc:before {
-  content: "\f163";
-}
-.fa-thumbs-up:before {
-  content: "\f164";
-}
-.fa-thumbs-down:before {
-  content: "\f165";
-}
-.fa-youtube-square:before {
-  content: "\f166";
-}
-.fa-youtube:before {
-  content: "\f167";
-}
-.fa-xing:before {
-  content: "\f168";
-}
-.fa-xing-square:before {
-  content: "\f169";
-}
-.fa-youtube-play:before {
-  content: "\f16a";
-}
-.fa-dropbox:before {
-  content: "\f16b";
-}
-.fa-stack-overflow:before {
-  content: "\f16c";
-}
-.fa-instagram:before {
-  content: "\f16d";
-}
-.fa-flickr:before {
-  content: "\f16e";
-}
-.fa-adn:before {
-  content: "\f170";
-}
-.fa-bitbucket:before {
-  content: "\f171";
-}
-.fa-bitbucket-square:before {
-  content: "\f172";
-}
-.fa-tumblr:before {
-  content: "\f173";
-}
-.fa-tumblr-square:before {
-  content: "\f174";
-}
-.fa-long-arrow-down:before {
-  content: "\f175";
-}
-.fa-long-arrow-up:before {
-  content: "\f176";
-}
-.fa-long-arrow-left:before {
-  content: "\f177";
-}
-.fa-long-arrow-right:before {
-  content: "\f178";
-}
-.fa-apple:before {
-  content: "\f179";
-}
-.fa-windows:before {
-  content: "\f17a";
-}
-.fa-android:before {
-  content: "\f17b";
-}
-.fa-linux:before {
-  content: "\f17c";
-}
-.fa-dribbble:before {
-  content: "\f17d";
-}
-.fa-skype:before {
-  content: "\f17e";
-}
-.fa-foursquare:before {
-  content: "\f180";
-}
-.fa-trello:before {
-  content: "\f181";
-}
-.fa-female:before {
-  content: "\f182";
-}
-.fa-male:before {
-  content: "\f183";
-}
-.fa-gittip:before,
-.fa-gratipay:before {
-  content: "\f184";
-}
-.fa-sun-o:before {
-  content: "\f185";
-}
-.fa-moon-o:before {
-  content: "\f186";
-}
-.fa-archive:before {
-  content: "\f187";
-}
-.fa-bug:before {
-  content: "\f188";
-}
-.fa-vk:before {
-  content: "\f189";
-}
-.fa-weibo:before {
-  content: "\f18a";
-}
-.fa-renren:before {
-  content: "\f18b";
-}
-.fa-pagelines:before {
-  content: "\f18c";
-}
-.fa-stack-exchange:before {
-  content: "\f18d";
-}
-.fa-arrow-circle-o-right:before {
-  content: "\f18e";
-}
-.fa-arrow-circle-o-left:before {
-  content: "\f190";
-}
-.fa-toggle-left:before,
-.fa-caret-square-o-left:before {
-  content: "\f191";
-}
-.fa-dot-circle-o:before {
-  content: "\f192";
-}
-.fa-wheelchair:before {
-  content: "\f193";
-}
-.fa-vimeo-square:before {
-  content: "\f194";
-}
-.fa-turkish-lira:before,
-.fa-try:before {
-  content: "\f195";
-}
-.fa-plus-square-o:before {
-  content: "\f196";
-}
-.fa-space-shuttle:before {
-  content: "\f197";
-}
-.fa-slack:before {
-  content: "\f198";
-}
-.fa-envelope-square:before {
-  content: "\f199";
-}
-.fa-wordpress:before {
-  content: "\f19a";
-}
-.fa-openid:before {
-  content: "\f19b";
-}
-.fa-institution:before,
-.fa-bank:before,
-.fa-university:before {
-  content: "\f19c";
-}
-.fa-mortar-board:before,
-.fa-graduation-cap:before {
-  content: "\f19d";
-}
-.fa-yahoo:before {
-  content: "\f19e";
-}
-.fa-google:before {
-  content: "\f1a0";
-}
-.fa-reddit:before {
-  content: "\f1a1";
-}
-.fa-reddit-square:before {
-  content: "\f1a2";
-}
-.fa-stumbleupon-circle:before {
-  content: "\f1a3";
-}
-.fa-stumbleupon:before {
-  content: "\f1a4";
-}
-.fa-delicious:before {
-  content: "\f1a5";
-}
-.fa-digg:before {
-  content: "\f1a6";
-}
-.fa-pied-piper-pp:before {
-  content: "\f1a7";
-}
-.fa-pied-piper-alt:before {
-  content: "\f1a8";
-}
-.fa-drupal:before {
-  content: "\f1a9";
-}
-.fa-joomla:before {
-  content: "\f1aa";
-}
-.fa-language:before {
-  content: "\f1ab";
-}
-.fa-fax:before {
-  content: "\f1ac";
-}
-.fa-building:before {
-  content: "\f1ad";
-}
-.fa-child:before {
-  content: "\f1ae";
-}
-.fa-paw:before {
-  content: "\f1b0";
-}
-.fa-spoon:before {
-  content: "\f1b1";
-}
-.fa-cube:before {
-  content: "\f1b2";
-}
-.fa-cubes:before {
-  content: "\f1b3";
-}
-.fa-behance:before {
-  content: "\f1b4";
-}
-.fa-behance-square:before {
-  content: "\f1b5";
-}
-.fa-steam:before {
-  content: "\f1b6";
-}
-.fa-steam-square:before {
-  content: "\f1b7";
-}
-.fa-recycle:before {
-  content: "\f1b8";
-}
-.fa-automobile:before,
-.fa-car:before {
-  content: "\f1b9";
-}
-.fa-cab:before,
-.fa-taxi:before {
-  content: "\f1ba";
-}
-.fa-tree:before {
-  content: "\f1bb";
-}
-.fa-spotify:before {
-  content: "\f1bc";
-}
-.fa-deviantart:before {
-  content: "\f1bd";
-}
-.fa-soundcloud:before {
-  content: "\f1be";
-}
-.fa-database:before {
-  content: "\f1c0";
-}
-.fa-file-pdf-o:before {
-  content: "\f1c1";
-}
-.fa-file-word-o:before {
-  content: "\f1c2";
-}
-.fa-file-excel-o:before {
-  content: "\f1c3";
-}
-.fa-file-powerpoint-o:before {
-  content: "\f1c4";
-}
-.fa-file-photo-o:before,
-.fa-file-picture-o:before,
-.fa-file-image-o:before {
-  content: "\f1c5";
-}
-.fa-file-zip-o:before,
-.fa-file-archive-o:before {
-  content: "\f1c6";
-}
-.fa-file-sound-o:before,
-.fa-file-audio-o:before {
-  content: "\f1c7";
-}
-.fa-file-movie-o:before,
-.fa-file-video-o:before {
-  content: "\f1c8";
-}
-.fa-file-code-o:before {
-  content: "\f1c9";
-}
-.fa-vine:before {
-  content: "\f1ca";
-}
-.fa-codepen:before {
-  content: "\f1cb";
-}
-.fa-jsfiddle:before {
-  content: "\f1cc";
-}
-.fa-life-bouy:before,
-.fa-life-buoy:before,
-.fa-life-saver:before,
-.fa-support:before,
-.fa-life-ring:before {
-  content: "\f1cd";
-}
-.fa-circle-o-notch:before {
-  content: "\f1ce";
-}
-.fa-ra:before,
-.fa-resistance:before,
-.fa-rebel:before {
-  content: "\f1d0";
-}
-.fa-ge:before,
-.fa-empire:before {
-  content: "\f1d1";
-}
-.fa-git-square:before {
-  content: "\f1d2";
-}
-.fa-git:before {
-  content: "\f1d3";
-}
-.fa-y-combinator-square:before,
-.fa-yc-square:before,
-.fa-hacker-news:before {
-  content: "\f1d4";
-}
-.fa-tencent-weibo:before {
-  content: "\f1d5";
-}
-.fa-qq:before {
-  content: "\f1d6";
-}
-.fa-wechat:before,
-.fa-weixin:before {
-  content: "\f1d7";
-}
-.fa-send:before,
-.fa-paper-plane:before {
-  content: "\f1d8";
-}
-.fa-send-o:before,
-.fa-paper-plane-o:before {
-  content: "\f1d9";
-}
-.fa-history:before {
-  content: "\f1da";
-}
-.fa-circle-thin:before {
-  content: "\f1db";
-}
-.fa-header:before {
-  content: "\f1dc";
-}
-.fa-paragraph:before {
-  content: "\f1dd";
-}
-.fa-sliders:before {
-  content: "\f1de";
-}
-.fa-share-alt:before {
-  content: "\f1e0";
-}
-.fa-share-alt-square:before {
-  content: "\f1e1";
-}
-.fa-bomb:before {
-  content: "\f1e2";
-}
-.fa-soccer-ball-o:before,
-.fa-futbol-o:before {
-  content: "\f1e3";
-}
-.fa-tty:before {
-  content: "\f1e4";
-}
-.fa-binoculars:before {
-  content: "\f1e5";
-}
-.fa-plug:before {
-  content: "\f1e6";
-}
-.fa-slideshare:before {
-  content: "\f1e7";
-}
-.fa-twitch:before {
-  content: "\f1e8";
-}
-.fa-yelp:before {
-  content: "\f1e9";
-}
-.fa-newspaper-o:before {
-  content: "\f1ea";
-}
-.fa-wifi:before {
-  content: "\f1eb";
-}
-.fa-calculator:before {
-  content: "\f1ec";
-}
-.fa-paypal:before {
-  content: "\f1ed";
-}
-.fa-google-wallet:before {
-  content: "\f1ee";
-}
-.fa-cc-visa:before {
-  content: "\f1f0";
-}
-.fa-cc-mastercard:before {
-  content: "\f1f1";
-}
-.fa-cc-discover:before {
-  content: "\f1f2";
-}
-.fa-cc-amex:before {
-  content: "\f1f3";
-}
-.fa-cc-paypal:before {
-  content: "\f1f4";
-}
-.fa-cc-stripe:before {
-  content: "\f1f5";
-}
-.fa-bell-slash:before {
-  content: "\f1f6";
-}
-.fa-bell-slash-o:before {
-  content: "\f1f7";
-}
-.fa-trash:before {
-  content: "\f1f8";
-}
-.fa-copyright:before {
-  content: "\f1f9";
-}
-.fa-at:before {
-  content: "\f1fa";
-}
-.fa-eyedropper:before {
-  content: "\f1fb";
-}
-.fa-paint-brush:before {
-  content: "\f1fc";
-}
-.fa-birthday-cake:before {
-  content: "\f1fd";
-}
-.fa-area-chart:before {
-  content: "\f1fe";
-}
-.fa-pie-chart:before {
-  content: "\f200";
-}
-.fa-line-chart:before {
-  content: "\f201";
-}
-.fa-lastfm:before {
-  content: "\f202";
-}
-.fa-lastfm-square:before {
-  content: "\f203";
-}
-.fa-toggle-off:before {
-  content: "\f204";
-}
-.fa-toggle-on:before {
-  content: "\f205";
-}
-.fa-bicycle:before {
-  content: "\f206";
-}
-.fa-bus:before {
-  content: "\f207";
-}
-.fa-ioxhost:before {
-  content: "\f208";
-}
-.fa-angellist:before {
-  content: "\f209";
-}
-.fa-cc:before {
-  content: "\f20a";
-}
-.fa-shekel:before,
-.fa-sheqel:before,
-.fa-ils:before {
-  content: "\f20b";
-}
-.fa-meanpath:before {
-  content: "\f20c";
-}
-.fa-buysellads:before {
-  content: "\f20d";
-}
-.fa-connectdevelop:before {
-  content: "\f20e";
-}
-.fa-dashcube:before {
-  content: "\f210";
-}
-.fa-forumbee:before {
-  content: "\f211";
-}
-.fa-leanpub:before {
-  content: "\f212";
-}
-.fa-sellsy:before {
-  content: "\f213";
-}
-.fa-shirtsinbulk:before {
-  content: "\f214";
-}
-.fa-simplybuilt:before {
-  content: "\f215";
-}
-.fa-skyatlas:before {
-  content: "\f216";
-}
-.fa-cart-plus:before {
-  content: "\f217";
-}
-.fa-cart-arrow-down:before {
-  content: "\f218";
-}
-.fa-diamond:before {
-  content: "\f219";
-}
-.fa-ship:before {
-  content: "\f21a";
-}
-.fa-user-secret:before {
-  content: "\f21b";
-}
-.fa-motorcycle:before {
-  content: "\f21c";
-}
-.fa-street-view:before {
-  content: "\f21d";
-}
-.fa-heartbeat:before {
-  content: "\f21e";
-}
-.fa-venus:before {
-  content: "\f221";
-}
-.fa-mars:before {
-  content: "\f222";
-}
-.fa-mercury:before {
-  content: "\f223";
-}
-.fa-intersex:before,
-.fa-transgender:before {
-  content: "\f224";
-}
-.fa-transgender-alt:before {
-  content: "\f225";
-}
-.fa-venus-double:before {
-  content: "\f226";
-}
-.fa-mars-double:before {
-  content: "\f227";
-}
-.fa-venus-mars:before {
-  content: "\f228";
-}
-.fa-mars-stroke:before {
-  content: "\f229";
-}
-.fa-mars-stroke-v:before {
-  content: "\f22a";
-}
-.fa-mars-stroke-h:before {
-  content: "\f22b";
-}
-.fa-neuter:before {
-  content: "\f22c";
-}
-.fa-genderless:before {
-  content: "\f22d";
-}
-.fa-facebook-official:before {
-  content: "\f230";
-}
-.fa-pinterest-p:before {
-  content: "\f231";
-}
-.fa-whatsapp:before {
-  content: "\f232";
-}
-.fa-server:before {
-  content: "\f233";
-}
-.fa-user-plus:before {
-  content: "\f234";
-}
-.fa-user-times:before {
-  content: "\f235";
-}
-.fa-hotel:before,
-.fa-bed:before {
-  content: "\f236";
-}
-.fa-viacoin:before {
-  content: "\f237";
-}
-.fa-train:before {
-  content: "\f238";
-}
-.fa-subway:before {
-  content: "\f239";
-}
-.fa-medium:before {
-  content: "\f23a";
-}
-.fa-yc:before,
-.fa-y-combinator:before {
-  content: "\f23b";
-}
-.fa-optin-monster:before {
-  content: "\f23c";
-}
-.fa-opencart:before {
-  content: "\f23d";
-}
-.fa-expeditedssl:before {
-  content: "\f23e";
-}
-.fa-battery-4:before,
-.fa-battery:before,
-.fa-battery-full:before {
-  content: "\f240";
-}
-.fa-battery-3:before,
-.fa-battery-three-quarters:before {
-  content: "\f241";
-}
-.fa-battery-2:before,
-.fa-battery-half:before {
-  content: "\f242";
-}
-.fa-battery-1:before,
-.fa-battery-quarter:before {
-  content: "\f243";
-}
-.fa-battery-0:before,
-.fa-battery-empty:before {
-  content: "\f244";
-}
-.fa-mouse-pointer:before {
-  content: "\f245";
-}
-.fa-i-cursor:before {
-  content: "\f246";
-}
-.fa-object-group:before {
-  content: "\f247";
-}
-.fa-object-ungroup:before {
-  content: "\f248";
-}
-.fa-sticky-note:before {
-  content: "\f249";
-}
-.fa-sticky-note-o:before {
-  content: "\f24a";
-}
-.fa-cc-jcb:before {
-  content: "\f24b";
-}
-.fa-cc-diners-club:before {
-  content: "\f24c";
-}
-.fa-clone:before {
-  content: "\f24d";
-}
-.fa-balance-scale:before {
-  content: "\f24e";
-}
-.fa-hourglass-o:before {
-  content: "\f250";
-}
-.fa-hourglass-1:before,
-.fa-hourglass-start:before {
-  content: "\f251";
-}
-.fa-hourglass-2:before,
-.fa-hourglass-half:before {
-  content: "\f252";
-}
-.fa-hourglass-3:before,
-.fa-hourglass-end:before {
-  content: "\f253";
-}
-.fa-hourglass:before {
-  content: "\f254";
-}
-.fa-hand-grab-o:before,
-.fa-hand-rock-o:before {
-  content: "\f255";
-}
-.fa-hand-stop-o:before,
-.fa-hand-paper-o:before {
-  content: "\f256";
-}
-.fa-hand-scissors-o:before {
-  content: "\f257";
-}
-.fa-hand-lizard-o:before {
-  content: "\f258";
-}
-.fa-hand-spock-o:before {
-  content: "\f259";
-}
-.fa-hand-pointer-o:before {
-  content: "\f25a";
-}
-.fa-hand-peace-o:before {
-  content: "\f25b";
-}
-.fa-trademark:before {
-  content: "\f25c";
-}
-.fa-registered:before {
-  content: "\f25d";
-}
-.fa-creative-commons:before {
-  content: "\f25e";
-}
-.fa-gg:before {
-  content: "\f260";
-}
-.fa-gg-circle:before {
-  content: "\f261";
-}
-.fa-tripadvisor:before {
-  content: "\f262";
-}
-.fa-odnoklassniki:before {
-  content: "\f263";
-}
-.fa-odnoklassniki-square:before {
-  content: "\f264";
-}
-.fa-get-pocket:before {
-  content: "\f265";
-}
-.fa-wikipedia-w:before {
-  content: "\f266";
-}
-.fa-safari:before {
-  content: "\f267";
-}
-.fa-chrome:before {
-  content: "\f268";
-}
-.fa-firefox:before {
-  content: "\f269";
-}
-.fa-opera:before {
-  content: "\f26a";
-}
-.fa-internet-explorer:before {
-  content: "\f26b";
-}
-.fa-tv:before,
-.fa-television:before {
-  content: "\f26c";
-}
-.fa-contao:before {
-  content: "\f26d";
-}
-.fa-500px:before {
-  content: "\f26e";
-}
-.fa-amazon:before {
-  content: "\f270";
-}
-.fa-calendar-plus-o:before {
-  content: "\f271";
-}
-.fa-calendar-minus-o:before {
-  content: "\f272";
-}
-.fa-calendar-times-o:before {
-  content: "\f273";
-}
-.fa-calendar-check-o:before {
-  content: "\f274";
-}
-.fa-industry:before {
-  content: "\f275";
-}
-.fa-map-pin:before {
-  content: "\f276";
-}
-.fa-map-signs:before {
-  content: "\f277";
-}
-.fa-map-o:before {
-  content: "\f278";
-}
-.fa-map:before {
-  content: "\f279";
-}
-.fa-commenting:before {
-  content: "\f27a";
-}
-.fa-commenting-o:before {
-  content: "\f27b";
-}
-.fa-houzz:before {
-  content: "\f27c";
-}
-.fa-vimeo:before {
-  content: "\f27d";
-}
-.fa-black-tie:before {
-  content: "\f27e";
-}
-.fa-fonticons:before {
-  content: "\f280";
-}
-.fa-reddit-alien:before {
-  content: "\f281";
-}
-.fa-edge:before {
-  content: "\f282";
-}
-.fa-credit-card-alt:before {
-  content: "\f283";
-}
-.fa-codiepie:before {
-  content: "\f284";
-}
-.fa-modx:before {
-  content: "\f285";
-}
-.fa-fort-awesome:before {
-  content: "\f286";
-}
-.fa-usb:before {
-  content: "\f287";
-}
-.fa-product-hunt:before {
-  content: "\f288";
-}
-.fa-mixcloud:before {
-  content: "\f289";
-}
-.fa-scribd:before {
-  content: "\f28a";
-}
-.fa-pause-circle:before {
-  content: "\f28b";
-}
-.fa-pause-circle-o:before {
-  content: "\f28c";
-}
-.fa-stop-circle:before {
-  content: "\f28d";
-}
-.fa-stop-circle-o:before {
-  content: "\f28e";
-}
-.fa-shopping-bag:before {
-  content: "\f290";
-}
-.fa-shopping-basket:before {
-  content: "\f291";
-}
-.fa-hashtag:before {
-  content: "\f292";
-}
-.fa-bluetooth:before {
-  content: "\f293";
-}
-.fa-bluetooth-b:before {
-  content: "\f294";
-}
-.fa-percent:before {
-  content: "\f295";
-}
-.fa-gitlab:before {
-  content: "\f296";
-}
-.fa-wpbeginner:before {
-  content: "\f297";
-}
-.fa-wpforms:before {
-  content: "\f298";
-}
-.fa-envira:before {
-  content: "\f299";
-}
-.fa-universal-access:before {
-  content: "\f29a";
-}
-.fa-wheelchair-alt:before {
-  content: "\f29b";
-}
-.fa-question-circle-o:before {
-  content: "\f29c";
-}
-.fa-blind:before {
-  content: "\f29d";
-}
-.fa-audio-description:before {
-  content: "\f29e";
-}
-.fa-volume-control-phone:before {
-  content: "\f2a0";
-}
-.fa-braille:before {
-  content: "\f2a1";
-}
-.fa-assistive-listening-systems:before {
-  content: "\f2a2";
-}
-.fa-asl-interpreting:before,
-.fa-american-sign-language-interpreting:before {
-  content: "\f2a3";
-}
-.fa-deafness:before,
-.fa-hard-of-hearing:before,
-.fa-deaf:before {
-  content: "\f2a4";
-}
-.fa-glide:before {
-  content: "\f2a5";
-}
-.fa-glide-g:before {
-  content: "\f2a6";
-}
-.fa-signing:before,
-.fa-sign-language:before {
-  content: "\f2a7";
-}
-.fa-low-vision:before {
-  content: "\f2a8";
-}
-.fa-viadeo:before {
-  content: "\f2a9";
-}
-.fa-viadeo-square:before {
-  content: "\f2aa";
-}
-.fa-snapchat:before {
-  content: "\f2ab";
-}
-.fa-snapchat-ghost:before {
-  content: "\f2ac";
-}
-.fa-snapchat-square:before {
-  content: "\f2ad";
-}
-.fa-pied-piper:before {
-  content: "\f2ae";
-}
-.fa-first-order:before {
-  content: "\f2b0";
-}
-.fa-yoast:before {
-  content: "\f2b1";
-}
-.fa-themeisle:before {
-  content: "\f2b2";
-}
-.fa-google-plus-circle:before,
-.fa-google-plus-official:before {
-  content: "\f2b3";
-}
-.fa-fa:before,
-.fa-font-awesome:before {
-  content: "\f2b4";
-}
-.fa-handshake-o:before {
-  content: "\f2b5";
-}
-.fa-envelope-open:before {
-  content: "\f2b6";
-}
-.fa-envelope-open-o:before {
-  content: "\f2b7";
-}
-.fa-linode:before {
-  content: "\f2b8";
-}
-.fa-address-book:before {
-  content: "\f2b9";
-}
-.fa-address-book-o:before {
-  content: "\f2ba";
-}
-.fa-vcard:before,
-.fa-address-card:before {
-  content: "\f2bb";
-}
-.fa-vcard-o:before,
-.fa-address-card-o:before {
-  content: "\f2bc";
-}
-.fa-user-circle:before {
-  content: "\f2bd";
-}
-.fa-user-circle-o:before {
-  content: "\f2be";
-}
-.fa-user-o:before {
-  content: "\f2c0";
-}
-.fa-id-badge:before {
-  content: "\f2c1";
-}
-.fa-drivers-license:before,
-.fa-id-card:before {
-  content: "\f2c2";
-}
-.fa-drivers-license-o:before,
-.fa-id-card-o:before {
-  content: "\f2c3";
-}
-.fa-quora:before {
-  content: "\f2c4";
-}
-.fa-free-code-camp:before {
-  content: "\f2c5";
-}
-.fa-telegram:before {
-  content: "\f2c6";
-}
-.fa-thermometer-4:before,
-.fa-thermometer:before,
-.fa-thermometer-full:before {
-  content: "\f2c7";
-}
-.fa-thermometer-3:before,
-.fa-thermometer-three-quarters:before {
-  content: "\f2c8";
-}
-.fa-thermometer-2:before,
-.fa-thermometer-half:before {
-  content: "\f2c9";
-}
-.fa-thermometer-1:before,
-.fa-thermometer-quarter:before {
-  content: "\f2ca";
-}
-.fa-thermometer-0:before,
-.fa-thermometer-empty:before {
-  content: "\f2cb";
-}
-.fa-shower:before {
-  content: "\f2cc";
-}
-.fa-bathtub:before,
-.fa-s15:before,
-.fa-bath:before {
-  content: "\f2cd";
-}
-.fa-podcast:before {
-  content: "\f2ce";
-}
-.fa-window-maximize:before {
-  content: "\f2d0";
-}
-.fa-window-minimize:before {
-  content: "\f2d1";
-}
-.fa-window-restore:before {
-  content: "\f2d2";
-}
-.fa-times-rectangle:before,
-.fa-window-close:before {
-  content: "\f2d3";
-}
-.fa-times-rectangle-o:before,
-.fa-window-close-o:before {
-  content: "\f2d4";
-}
-.fa-bandcamp:before {
-  content: "\f2d5";
-}
-.fa-grav:before {
-  content: "\f2d6";
-}
-.fa-etsy:before {
-  content: "\f2d7";
-}
-.fa-imdb:before {
-  content: "\f2d8";
-}
-.fa-ravelry:before {
-  content: "\f2d9";
-}
-.fa-eercast:before {
-  content: "\f2da";
-}
-.fa-microchip:before {
-  content: "\f2db";
-}
-.fa-snowflake-o:before {
-  content: "\f2dc";
-}
-.fa-superpowers:before {
-  content: "\f2dd";
-}
-.fa-wpexplorer:before {
-  content: "\f2de";
-}
-.fa-meetup:before {
-  content: "\f2e0";
-}
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  padding: 0;
-  margin: -1px;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0);
-  border: 0;
-}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  margin: 0;
-  overflow: visible;
-  clip: auto;
-}
diff --git a/framework/crawler-ui/src/main/webapp/css/font-awesome.css.map b/framework/crawler-ui/src/main/webapp/css/font-awesome.css.map
deleted file mode 100644
index 60763a8..0000000
--- a/framework/crawler-ui/src/main/webapp/css/font-awesome.css.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-"version": 3,
-"mappings": ";;;;;;;AAGA,UAUC;EATC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,ySAAmG;EAKxG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;ACTpB,GAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAAwD;EAC9D,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,SAAS,EAAE,eAAe;;;ACN5B,MAAsB;EACpB,SAAS,EAAE,SAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;ACVtC,MAAsB;EACpB,KAAK,EAAE,SAAW;EAClB,UAAU,EAAE,MAAM;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECKU,SAAS;EDJ9B,eAAe,EAAE,IAAI;EACrB,WAAK;IAAE,QAAQ,EAAE,QAAQ;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,UAAa;EACnB,KAAK,ECFgB,SAAS;EDG9B,GAAG,EAAE,SAAU;EACf,UAAU,EAAE,MAAM;EAClB,YAAuB;IACrB,IAAI,EAAE,UAA0B;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;AAGrB,WAAY;EAAE,KAAK,EAAE,KAAK;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;AAGtB,aAAY;EAAE,YAAY,EAAE,IAAI;AAChC,cAAa;EAAE,WAAW,EAAE,IAAI;;ACXlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AC5BrC,aAA8B;ECY5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;ADdrC,cAA8B;ECW5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADbrC,cAA8B;ECU5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADXrC,mBAAmC;ECejC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADjBzC,iBAAmC;ECcjC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADZzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;AAC5C,WAA2B;EAAE,KAAK,ELVZ,IAAI;;;;AMN1B,gBAAgC;EAAE,OAAO,ENoQ1B,GAAO;;AMnQtB,gBAAgC;EAAE,OAAO,EN0W1B,GAAO;;AMzWtB,iBAAiC;EAAE,OAAO,ENmb1B,GAAO;;AMlbvB,qBAAqC;EAAE,OAAO,ENmL1B,GAAO;;AMlL3B,gBAAgC;EAAE,OAAO,ENkR1B,GAAO;;AMjRtB,eAA+B;EAAE,OAAO,ENke1B,GAAO;;AMjerB,iBAAiC;EAAE,OAAO,ENse1B,GAAO;;AMrevB,eAA+B;EAAE,OAAO,EN+iB1B,GAAO;;AM9iBrB,eAA+B;EAAE,OAAO,ENyN1B,GAAO;;AMxNrB,mBAAmC;EAAE,OAAO,ENggB1B,GAAO;;AM/fzB,aAA6B;EAAE,OAAO,EN8f1B,GAAO;;AM7fnB,kBAAkC;EAAE,OAAO,EN+f1B,GAAO;;AM9fxB,gBAAgC;EAAE,OAAO,ENoG1B,GAAO;;AMnGtB;;gBAEgC;EAAE,OAAO,ENkgB1B,GAAO;;AMjgBtB,sBAAsC;EAAE,OAAO,ENua1B,GAAO;;AMta5B,uBAAuC;EAAE,OAAO,ENqa1B,GAAO;;AMpa7B,oBAAoC;EAAE,OAAO,EN+X1B,GAAO;;AM9X1B,iBAAiC;EAAE,OAAO,ENsb1B,GAAO;;AMrbvB;cAC8B;EAAE,OAAO,ENwH1B,GAAO;;AMvHpB,kBAAkC;EAAE,OAAO,ENygB1B,GAAO;;AMxgBxB,eAA+B;EAAE,OAAO,ENmQ1B,GAAO;;AMlQrB,iBAAiC;EAAE,OAAO,EN6L1B,GAAO;;AM5LvB,kBAAkC;EAAE,OAAO,EN0G1B,GAAO;;AMzGxB,eAA+B;EAAE,OAAO,EN+Y1B,GAAO;;AM9YrB,mBAAmC;EAAE,OAAO,ENiJ1B,GAAO;;AMhJzB,8BAA8C;EAAE,OAAO,ENI1B,GAAO;;AMHpC,4BAA4C;EAAE,OAAO,ENM1B,GAAO;;AMLlC,gBAAgC;EAAE,OAAO,ENkQ1B,GAAO;;AMjQtB,wBAAwC;EAAE,OAAO,EN4W1B,GAAO;;AM3W9B;iBACiC;EAAE,OAAO,ENmY1B,GAAO;;AMlYvB,kBAAkC;EAAE,OAAO,EN8X1B,GAAO;;AM7XxB,mBAAmC;EAAE,OAAO,ENiS1B,GAAO;;AMhSzB,eAA+B;EAAE,OAAO,ENoS1B,GAAO;;AMnSrB,eAA+B;EAAE,OAAO,ENgM1B,GAAO;;AM/LrB,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;AM9O3B,qBAAqC;EAAE,OAAO,EN8hB1B,GAAO;;AM7hB3B,sBAAsC;EAAE,OAAO,EN4hB1B,GAAO;;AM3hB5B,oBAAoC;EAAE,OAAO,EN6hB1B,GAAO;;AM5hB1B,iBAAiC;EAAE,OAAO,EN2W1B,GAAO;;AM1WvB,kBAAkC;EAAE,OAAO,ENW1B,GAAO;;AMVxB,cAA8B;EAAE,OAAO,ENod1B,GAAO;;AMndpB,eAA+B;EAAE,OAAO,ENod1B,GAAO;;AMndrB,eAA+B;EAAE,OAAO,EN2B1B,GAAO;;AM1BrB,mBAAmC;EAAE,OAAO,EN2B1B,GAAO;;AM1BzB,gBAAgC;EAAE,OAAO,ENkW1B,GAAO;;AMjWtB,iBAAiC;EAAE,OAAO,ENwC1B,GAAO;;AMvCvB,eAA+B;EAAE,OAAO,EN8L1B,GAAO;;AM7LrB,eAA+B;EAAE,OAAO,ENmB1B,GAAO;;AMlBrB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB,sBAAsC;EAAE,OAAO,ENid1B,GAAO;;AMhd5B,qBAAqC;EAAE,OAAO,ENid1B,GAAO;;AMhd3B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;AM2C3B,uBAAuC;EAAE,OAAO,EN7C1B,GAAO;;AM8C7B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;AM4C5B,wBAAwC;EAAE,OAAO,EN9C1B,GAAO;;AM+C9B,eAA+B;EAAE,OAAO,ENwQ1B,GAAO;;AMvQrB;kBACkC;EAAE,OAAO,ENmT1B,GAAO;;AMlTxB,iBAAiC;EAAE,OAAO,ENmO1B,GAAO;;AMlOvB,uBAAuC;EAAE,OAAO,ENigB1B,GAAO;;AMhgB7B;;oBAEoC;EAAE,OAAO,EN+T1B,GAAO;;AM9T1B,iBAAiC;EAAE,OAAO,ENwT1B,GAAO;;AMvTvB,qBAAqC;EAAE,OAAO,EN+Q1B,GAAO;;AM9Q3B,iBAAiC;EAAE,OAAO,EN5D1B,GAAO;;AM6DvB,eAA+B;EAAE,OAAO,EN8c1B,GAAO;;AM7crB;0BAC0C;EAAE,OAAO,ENqT1B,GAAO;;AMpThC,yBAAyC;EAAE,OAAO,ENuX1B,GAAO;;AMtX/B,yBAAyC;EAAE,OAAO,EN0C1B,GAAO;;AMzC/B,iBAAiC;EAAE,OAAO,ENjC1B,GAAO;;AMkCvB,wBAAwC;EAAE,OAAO,ENma1B,GAAO;;AMla9B,wBAAwC;EAAE,OAAO,EN4H1B,GAAO;;AM3H9B,mBAAmC;EAAE,OAAO,EN7B1B,GAAO;;AM8BzB,eAA+B;EAAE,OAAO,EN0T1B,GAAO;;AMzTrB,gBAAgC;EAAE,OAAO,ENwS1B,GAAO;;AMvStB,eAA+B;EAAE,OAAO,ENia1B,GAAO;;AMharB,kBAAkC;EAAE,OAAO,ENgK1B,GAAO;;AM/JxB,uBAAuC;EAAE,OAAO,ENuH1B,GAAO;;AMtH7B,uBAAuC;EAAE,OAAO,EN4Z1B,GAAO;;AM3Z7B,gBAAgC;EAAE,OAAO,EN4F1B,GAAO;;AM3FtB,uBAAuC;EAAE,OAAO,ENoC1B,GAAO;;AMnC7B,wBAAwC;EAAE,OAAO,ENoC1B,GAAO;;AMnC9B,sBAAsC;EAAE,OAAO,ENsT1B,GAAO;;AMrT5B,uBAAuC;EAAE,OAAO,ENyQ1B,GAAO;;AMxQ7B,uBAAuC;EAAE,OAAO,ENwb1B,GAAO;;AMvb7B,uBAAuC;EAAE,OAAO,ENsB1B,GAAO;;AMrB7B,0BAA0C;EAAE,OAAO,EN2T1B,GAAO;;AM1ThC,sBAAsC;EAAE,OAAO,ENsM1B,GAAO;;AMrM5B,qBAAqC;EAAE,OAAO,EN6D1B,GAAO;;AM5D3B,yBAAyC;EAAE,OAAO,ENob1B,GAAO;;AMnb/B,yBAAyC;EAAE,OAAO,ENkB1B,GAAO;;AMjB/B,cAA8B;EAAE,OAAO,EN/C1B,GAAO;;AMgDpB,qBAAqC;EAAE,OAAO,EN3D1B,GAAO;;AM4D3B,sBAAsC;EAAE,OAAO,EN3D1B,GAAO;;AM4D5B,mBAAmC;EAAE,OAAO,EN3D1B,GAAO;;AM4DzB,qBAAqC;EAAE,OAAO,EN/D1B,GAAO;;AMgE3B;gBACgC;EAAE,OAAO,ENqV1B,GAAO;;AMpVtB,iBAAiC;EAAE,OAAO,ENuF1B,GAAO;;AMtFvB,mBAAmC;EAAE,OAAO,EN4C1B,GAAO;;AM3CzB,eAA+B;EAAE,OAAO,ENmS1B,GAAO;;AMlSrB,gBAAgC;EAAE,OAAO,ENsP1B,GAAO;;AMrPtB,mBAAmC;EAAE,OAAO,EN9D1B,GAAO;;AM+DzB,6BAA6C;EAAE,OAAO,ENgF1B,GAAO;;AM/EnC,eAA+B;EAAE,OAAO,EN+I1B,GAAO;;AM9IrB,eAA+B;EAAE,OAAO,ENoM1B,GAAO;;AMnMrB,eAA+B;EAAE,OAAO,ENmH1B,GAAO;;AMlHrB,cAA8B;EAAE,OAAO,ENiF1B,GAAO;;AMhFpB,oBAAoC;EAAE,OAAO,ENiF1B,GAAO;;AMhF1B;+BAC+C;EAAE,OAAO,EN0E1B,GAAO;;AMzErC,gBAAgC;EAAE,OAAO,ENmR1B,GAAO;;AMlRtB,mBAAmC;EAAE,OAAO,EN/B1B,GAAO;;AMgCzB,iBAAiC;EAAE,OAAO,ENoS1B,GAAO;;AMnSvB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,iBAAiC;EAAE,OAAO,ENqN1B,GAAO;;AMpNvB,qBAAqC;EAAE,OAAO,ENE1B,GAAO;;AMD3B,uBAAuC;EAAE,OAAO,ENF1B,GAAO;;AMG7B,kBAAkC;EAAE,OAAO,EN2S1B,GAAO;;AM1SxB,wBAAwC;EAAE,OAAO,ENyU1B,GAAO;;AMxU9B,iBAAiC;EAAE,OAAO,EN8G1B,GAAO;;AM7GvB,sBAAsC;EAAE,OAAO,EN+G1B,GAAO;;AM9G5B,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,mBAAmC;EAAE,OAAO,ENrF1B,GAAO;;AMsFzB;oBACoC;EAAE,OAAO,EN/E1B,GAAO;;AMgF1B,yBAAyC;EAAE,OAAO,ENua1B,GAAO;;AMta/B,0BAA0C;EAAE,OAAO,ENmE1B,GAAO;;AMlEhC,uBAAuC;EAAE,OAAO,EN5C1B,GAAO;;AM6C7B,cAA8B;EAAE,OAAO,ENqK1B,GAAO;;AMpKpB;eAC+B;EAAE,OAAO,ENK1B,GAAO;;AMJrB,mBAAmC;EAAE,OAAO,ENQ1B,GAAO;;AMPzB,sBAAsC;EAAE,OAAO,ENmY1B,GAAO;;AMlY5B,wBAAwC;EAAE,OAAO,ENiY1B,GAAO;;AMhY9B,oBAAoC;EAAE,OAAO,EN2V1B,GAAO;;AM1V1B,kBAAkC;EAAE,OAAO,ENyI1B,GAAO;;AMxIxB,mBAAmC;EAAE,OAAO,ENyT1B,GAAO;;AMxTzB,0BAA0C;EAAE,OAAO,ENiL1B,GAAO;;AMhLhC,qBAAqC;EAAE,OAAO,EN0X1B,GAAO;;AMzX3B,wBAAwC;EAAE,OAAO,EN8C1B,GAAO;;AM7C9B,kBAAkC;EAAE,OAAO,ENoT1B,GAAO;;AMnTxB,iBAAiC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YvB,wBAAwC;EAAE,OAAO,EN6G1B,GAAO;;AM5G9B,iBAAiC;EAAE,OAAO,EN8Z1B,GAAO;;AM7ZvB,kBAAkC;EAAE,OAAO,EN+J1B,GAAO;;AM9JxB,gBAAgC;EAAE,OAAO,ENsO1B,GAAO;;AMrOtB,mBAAmC;EAAE,OAAO,EN2U1B,GAAO;;AM1UzB,qBAAqC;EAAE,OAAO,EN/E1B,GAAO;;AMgF3B,uBAAuC;EAAE,OAAO,ENoO1B,GAAO;;AMnO7B,kBAAkC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YxB;mBACmC;EAAE,OAAO,ENuC1B,GAAO;;AMtCzB,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,iBAAiC;EAAE,OAAO,ENiZ1B,GAAO;;AMhZvB,sBAAsC;EAAE,OAAO,ENR1B,GAAO;;AMS5B,cAA8B;EAAE,OAAO,EN4Q1B,GAAO;;AM3QpB,gBAAgC;EAAE,OAAO,ENgH1B,GAAO;;AM/GtB,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,eAA+B;EAAE,OAAO,ENzG1B,GAAO;;AM0GrB,sBAAsC;EAAE,OAAO,ENzD1B,GAAO;;AM0D5B,uBAAuC;EAAE,OAAO,EN0G1B,GAAO;;AMzG7B,sBAAsC;EAAE,OAAO,ENwG1B,GAAO;;AMvG5B,oBAAoC;EAAE,OAAO,ENyG1B,GAAO;;AMxG1B,sBAAsC;EAAE,OAAO,ENqG1B,GAAO;;AMpG5B,4BAA4C;EAAE,OAAO,EN5I1B,GAAO;;AM6IlC,6BAA6C;EAAE,OAAO,ENxI1B,GAAO;;AMyInC,0BAA0C;EAAE,OAAO,ENxI1B,GAAO;;AMyIhC,4BAA4C;EAAE,OAAO,ENhJ1B,GAAO;;AMiJlC,gBAAgC;EAAE,OAAO,ENsF1B,GAAO;;AMrFtB,iBAAiC;EAAE,OAAO,ENia1B,GAAO;;AMhavB,gBAAgC;EAAE,OAAO,ENiV1B,GAAO;;AMhVtB,iBAAiC;EAAE,OAAO,ENgD1B,GAAO;;AM/CvB,oBAAoC;EAAE,OAAO,ENvG1B,GAAO;;AMwG1B,qBAAqC;EAAE,OAAO,ENzI1B,GAAO;;AM0I3B;gBACgC;EAAE,OAAO,ENqY1B,GAAO;;AMpYtB;eAC+B;EAAE,OAAO,ENuI1B,GAAO;;AMtIrB,gBAAgC;EAAE,OAAO,ENpD1B,GAAO;;AMqDtB,gBAAgC;EAAE,OAAO,EN+C1B,GAAO;;AM9CtB;mBACmC;EAAE,OAAO,ENwP1B,GAAO;;AMvPzB;kBACkC;EAAE,OAAO,ENkC1B,GAAO;;AMjCxB,oBAAoC;EAAE,OAAO,ENsL1B,GAAO;;AMrL1B;mBACmC;EAAE,OAAO,EN0C1B,GAAO;;AMzCzB,iBAAiC;EAAE,OAAO,ENiS1B,GAAO;;AMhSvB;;eAE+B;EAAE,OAAO,EN9I1B,GAAO;;AM+IrB,kBAAkC;EAAE,OAAO,ENgI1B,GAAO;;AM/HxB,kBAAkC;EAAE,OAAO,EN8H1B,GAAO;;AM7HxB,wBAAwC;EAAE,OAAO,EN4S1B,GAAO;;AM3S9B,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;AMnW1B,gBAAgC;EAAE,OAAO,ENmT1B,GAAO;;AMlTtB,gBAAgC;EAAE,OAAO,ENkI1B,GAAO;;AMjItB,gBAAgC;EAAE,OAAO,ENuV1B,GAAO;;AMtVtB,oBAAoC;EAAE,OAAO,ENwL1B,GAAO;;AMvL1B,2BAA2C;EAAE,OAAO,ENyL1B,GAAO;;AMxLjC,6BAA6C;EAAE,OAAO,ENyD1B,GAAO;;AMxDnC,sBAAsC;EAAE,OAAO,ENuD1B,GAAO;;AMtD5B,gBAAgC;EAAE,OAAO,ENsJ1B,GAAO;;AMrJtB,qBAAqC;EAAE,OAAO,ENtH1B,GAAO;;AMuH3B,mBAAmC;EAAE,OAAO,ENhH1B,GAAO;;AMiHzB,qBAAqC;EAAE,OAAO,ENvH1B,GAAO;;AMwH3B,sBAAsC;EAAE,OAAO,ENvH1B,GAAO;;AMwH5B,kBAAkC;EAAE,OAAO,ENvE1B,GAAO;;AMwExB;eAC+B;EAAE,OAAO,EN2P1B,GAAO;;AM1PrB;oBACoC;EAAE,OAAO,EN+P1B,GAAO;;AM9P1B;mBACmC;EAAE,OAAO,EN4P1B,GAAO;;AM3PzB,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,mBAAmC;EAAE,OAAO,ENkG1B,GAAO;;AMjGzB;eAC+B;EAAE,OAAO,EN8U1B,GAAO;;AM7UrB;gBACgC;EAAE,OAAO,ENqB1B,GAAO;;AMpBtB;qBACqC;EAAE,OAAO,EN2R1B,GAAO;;AM1R3B,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;AMqF1B,qBAAqC;EAAE,OAAO,ENnF1B,GAAO;;AMoF3B;eAC+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,kBAAkC;EAAE,OAAO,ENkO1B,GAAO;;AMjOxB,mBAAmC;EAAE,OAAO,ENkU1B,GAAO;;AMjUzB;oBACoC;EAAE,OAAO,EN1G1B,GAAO;;AM2G1B,sBAAsC;EAAE,OAAO,ENgF1B,GAAO;;AM/E5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;AMoDzB,yBAAyC;EAAE,OAAO,ENzG1B,GAAO;;AM0G/B,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,kBAAkC;EAAE,OAAO,ENsU1B,GAAO;;AMrUxB,sBAAsC;EAAE,OAAO,EN+P1B,GAAO;;AM9P5B,mBAAmC;EAAE,OAAO,ENsQ1B,GAAO;;AMrQzB,iBAAiC;EAAE,OAAO,ENvL1B,GAAO;;AMwLvB,iBAAiC;EAAE,OAAO,ENzG1B,GAAO;;AM0GvB,kBAAkC;EAAE,OAAO,ENtF1B,GAAO;;AMuFxB,sBAAsC;EAAE,OAAO,EN3B1B,GAAO;;AM4B5B,qBAAqC;EAAE,OAAO,ENxK1B,GAAO;;AMyK3B,qBAAqC;EAAE,OAAO,ENkC1B,GAAO;;AMjC3B,oBAAoC;EAAE,OAAO,EN3O1B,GAAO;;AM4O1B,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;AMgD5B,eAA+B;EAAE,OAAO,ENpM1B,GAAO;;AMqMrB,mBAAmC;EAAE,OAAO,ENe1B,GAAO;;AMdzB,sBAAsC;EAAE,OAAO,ENgJ1B,GAAO;;AM/I5B,4BAA4C;EAAE,OAAO,EN5O1B,GAAO;;AM6OlC,6BAA6C;EAAE,OAAO,EN5O1B,GAAO;;AM6OnC,0BAA0C;EAAE,OAAO,EN5O1B,GAAO;;AM6OhC,4BAA4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC,qBAAqC;EAAE,OAAO,EN5O1B,GAAO;;AM6O3B,sBAAsC;EAAE,OAAO,EN5O1B,GAAO;;AM6O5B,mBAAmC;EAAE,OAAO,EN5O1B,GAAO;;AM6OzB,qBAAqC;EAAE,OAAO,ENhP1B,GAAO;;AMiP3B,kBAAkC;EAAE,OAAO,ENlG1B,GAAO;;AMmGxB,iBAAiC;EAAE,OAAO,ENuC1B,GAAO;;AMtCvB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB;iBACiC;EAAE,OAAO,ENyF1B,GAAO;;AMxFvB,mBAAmC;EAAE,OAAO,EN9I1B,GAAO;;AM+IzB,qBAAqC;EAAE,OAAO,EN0I1B,GAAO;;AMzI3B,sBAAsC;EAAE,OAAO,EN0I1B,GAAO;;AMzI5B,kBAAkC;EAAE,OAAO,ENgN1B,GAAO;;AM/MxB,iBAAiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;gBACgC;EAAE,OAAO,ENkJ1B,GAAO;;AMjJtB,qBAAqC;EAAE,OAAO,ENnB1B,GAAO;;AMoB3B,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,wBAAwC;EAAE,OAAO,ENvC1B,GAAO;;AMwC9B,kBAAkC;EAAE,OAAO,EN0L1B,GAAO;;AMzLxB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,gBAAgC;EAAE,OAAO,ENoE1B,GAAO;;AMnEtB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,iBAAiC;EAAE,OAAO,ENrD1B,GAAO;;AMsDvB,yBAAyC;EAAE,OAAO,ENvD1B,GAAO;;AMwD/B,mBAAmC;EAAE,OAAO,ENuO1B,GAAO;;AMtOzB,eAA+B;EAAE,OAAO,ENtJ1B,GAAO;;AMuJrB;oBACoC;EAAE,OAAO,ENqI1B,GAAO;;AMpI1B;;sBAEsC;EAAE,OAAO,ENuM1B,GAAO;;AMtM5B,yBAAyC;EAAE,OAAO,ENkC1B,GAAO;;AMjC/B,eAA+B;EAAE,OAAO,EN5I1B,GAAO;;AM6IrB,oBAAoC;EAAE,OAAO,EN7J1B,GAAO;;AM8J1B;uBACuC;EAAE,OAAO,EN1L1B,GAAO;;AM2L7B,mBAAmC;EAAE,OAAO,EN4G1B,GAAO;;AM3GzB,eAA+B;EAAE,OAAO,ENT1B,GAAO;;AMUrB,sBAAsC;EAAE,OAAO,ENhH1B,GAAO;;AMiH5B,sBAAsC;EAAE,OAAO,EN8M1B,GAAO;;AM7M5B,oBAAoC;EAAE,OAAO,ENyM1B,GAAO;;AMxM1B,iBAAiC;EAAE,OAAO,ENvH1B,GAAO;;AMwHvB,uBAAuC;EAAE,OAAO,ENmG1B,GAAO;;AMlG7B,qBAAqC;EAAE,OAAO,EN8C1B,GAAO;;AM7C3B,2BAA2C;EAAE,OAAO,EN8C1B,GAAO;;AM7CjC,iBAAiC;EAAE,OAAO,ENgJ1B,GAAO;;AM/IvB,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,4BAA4C;EAAE,OAAO,ENjF1B,GAAO;;AMkFlC,iBAAiC;EAAE,OAAO,ENoH1B,GAAO;;AMnHvB,iBAAiC;EAAE,OAAO,ENkC1B,GAAO;;AMjCvB,8BAA8C;EAAE,OAAO,ENlM1B,GAAO;;AMmMpC,+BAA+C;EAAE,OAAO,ENlM1B,GAAO;;AMmMrC,4BAA4C;EAAE,OAAO,ENlM1B,GAAO;;AMmMlC,8BAA8C;EAAE,OAAO,ENtM1B,GAAO;;AMuMpC,gBAAgC;EAAE,OAAO,EN/B1B,GAAO;;AMgCtB,eAA+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,iBAAiC;EAAE,OAAO,EN9S1B,GAAO;;AM+SvB,qBAAqC;EAAE,OAAO,ENmP1B,GAAO;;AMlP3B,mBAAmC;EAAE,OAAO,EN9O1B,GAAO;;AM+OzB,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN4G1B,GAAO;;AM3G3B,sBAAsC;EAAE,OAAO,ENsE1B,GAAO;;AMrE5B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;AM1MvB,uBAAuC;EAAE,OAAO,EN6B1B,GAAO;;AM5B7B,yBAAyC;EAAE,OAAO,EN6B1B,GAAO;;AM5B/B,mBAAmC;EAAE,OAAO,ENhB1B,GAAO;;AMiBzB,qBAAqC;EAAE,OAAO,ENlB1B,GAAO;;AMmB3B,uBAAuC;EAAE,OAAO,ENvN1B,GAAO;;AMwN7B,wBAAwC;EAAE,OAAO,ENiD1B,GAAO;;AMhD9B,+BAA+C;EAAE,OAAO,EN3I1B,GAAO;;AM4IrC,uBAAuC;EAAE,OAAO,ENkH1B,GAAO;;AMjH7B,kBAAkC;EAAE,OAAO,EN1L1B,GAAO;;AM2LxB;8BAC8C;EAAE,OAAO,ENjP1B,GAAO;;AMkPpC;4BAC4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC;+BAC+C;EAAE,OAAO,ENnP1B,GAAO;;AMoPrC;cAC8B;EAAE,OAAO,EN7J1B,GAAO;;AM8JpB,cAA8B;EAAE,OAAO,EN/F1B,GAAO;;AMgGpB;cAC8B;EAAE,OAAO,EN4N1B,GAAO;;AM3NpB;cAC8B;EAAE,OAAO,ENvD1B,GAAO;;AMwDpB;;;cAG8B;EAAE,OAAO,ENrD1B,GAAO;;AMsDpB;;cAE8B;EAAE,OAAO,EN8E1B,GAAO;;AM7EpB;cAC8B;EAAE,OAAO,ENtD1B,GAAO;;AMuDpB;cAC8B;EAAE,OAAO,ENzR1B,GAAO;;AM0RpB,eAA+B;EAAE,OAAO,ENzJ1B,GAAO;;AM0JrB,oBAAoC;EAAE,OAAO,EN7I1B,GAAO;;AM8I1B,yBAAyC;EAAE,OAAO,EN2G1B,GAAO;;AM1G/B,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,2BAA2C;EAAE,OAAO,EN2G1B,GAAO;;AM1GjC,2BAA2C;EAAE,OAAO,EN8G1B,GAAO;;AM7GjC,4BAA4C;EAAE,OAAO,EN8G1B,GAAO;;AM7GlC,oBAAoC;EAAE,OAAO,ENgK1B,GAAO;;AM/J1B,sBAAsC;EAAE,OAAO,EN4J1B,GAAO;;AM3J5B,yBAAyC;EAAE,OAAO,ENwO1B,GAAO;;AMvO/B,kBAAkC;EAAE,OAAO,ENqO1B,GAAO;;AMpOxB,eAA+B;EAAE,OAAO,EN+N1B,GAAO;;AM9NrB,sBAAsC;EAAE,OAAO,EN+N1B,GAAO;;AM9N5B,uBAAuC;EAAE,OAAO,ENmO1B,GAAO;;AMlO7B,kBAAkC;EAAE,OAAO,ENxM1B,GAAO;;AMyMxB,yBAAyC;EAAE,OAAO,EN+G1B,GAAO;;AM9G/B,oBAAoC;EAAE,OAAO,ENnF1B,GAAO;;AMoF1B,iBAAiC;EAAE,OAAO,EN/I1B,GAAO;;AMgJvB,cAA8B;EAAE,OAAO,ENhX1B,GAAO;;AMiXpB,oBAAoC;EAAE,OAAO,ENxT1B,GAAO;;AMyT1B,2BAA2C;EAAE,OAAO,ENxT1B,GAAO;;AMyTjC,iBAAiC;EAAE,OAAO,ENyK1B,GAAO;;AMxKvB,wBAAwC;EAAE,OAAO,ENyK1B,GAAO;;AMxK9B,0BAA0C;EAAE,OAAO,ENtD1B,GAAO;;AMuDhC,wBAAwC;EAAE,OAAO,ENpD1B,GAAO;;AMqD9B,0BAA0C;EAAE,OAAO,ENvD1B,GAAO;;AMwDhC,2BAA2C;EAAE,OAAO,ENvD1B,GAAO;;AMwDjC,gBAAgC;EAAE,OAAO,ENxW1B,GAAO;;AMyWtB,kBAAkC;EAAE,OAAO,EN0M1B,GAAO;;AMzMxB,kBAAkC;EAAE,OAAO,ENpX1B,GAAO;;AMqXxB,gBAAgC;EAAE,OAAO,ENpE1B,GAAO;;AMqEtB,mBAAmC;EAAE,OAAO,EN1N1B,GAAO;;AM2NzB,gBAAgC;EAAE,OAAO,ENqE1B,GAAO;;AMpEtB,qBAAqC;EAAE,OAAO,ENtJ1B,GAAO;;AMuJ3B,iBAAiC;EAAE,OAAO,ENuJ1B,GAAO;;AMtJvB,iBAAiC;EAAE,OAAO,EN/L1B,GAAO;;AMgMvB,eAA+B;EAAE,OAAO,EN1D1B,GAAO;;AM2DrB;mBACmC;EAAE,OAAO,ENnI1B,GAAO;;AMoIzB,gBAAgC;EAAE,OAAO,EN2G1B,GAAO;;AM1GtB,iBAAiC;EAAE,OAAO,ENxC1B,GAAO;;AMyCvB,kBAAkC;EAAE,OAAO,ENrX1B,GAAO;;AMsXxB,cAA8B;EAAE,OAAO,ENpU1B,GAAO;;AMqUpB,aAA6B;EAAE,OAAO,ENgL1B,GAAO;;AM/KnB,gBAAgC;EAAE,OAAO,ENqL1B,GAAO;;AMpLtB,iBAAiC;EAAE,OAAO,ENa1B,GAAO;;AMZvB,oBAAoC;EAAE,OAAO,ENrC1B,GAAO;;AMsC1B,yBAAyC;EAAE,OAAO,EN8E1B,GAAO;;AM7E/B,+BAA+C;EAAE,OAAO,ENtX1B,GAAO;;AMuXrC,8BAA8C;EAAE,OAAO,ENxX1B,GAAO;;AMyXpC;8BAC8C;EAAE,OAAO,EN3T1B,GAAO;;AM4TpC,uBAAuC;EAAE,OAAO,ENjP1B,GAAO;;AMkP7B,qBAAqC;EAAE,OAAO,EN+K1B,GAAO;;AM9K3B,uBAAuC;EAAE,OAAO,ENmK1B,GAAO;;AMlK7B;cAC8B;EAAE,OAAO,ENoI1B,GAAO;;AMnIpB,wBAAwC;EAAE,OAAO,ENjB1B,GAAO;;AMkB9B,wBAAwC;EAAE,OAAO,EN6D1B,GAAO;;AM5D9B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,0BAA0C;EAAE,OAAO,EN7O1B,GAAO;;AM8OhC,oBAAoC;EAAE,OAAO,EN2K1B,GAAO;;AM1K1B,iBAAiC;EAAE,OAAO,ENvD1B,GAAO;;AMwDvB;;qBAEqC;EAAE,OAAO,ENsI1B,GAAO;;AMrI3B;yBACyC;EAAE,OAAO,ENjK1B,GAAO;;AMkK/B,gBAAgC;EAAE,OAAO,ENwK1B,GAAO;;AMvKtB,iBAAiC;EAAE,OAAO,ENvK1B,GAAO;;AMwKvB,iBAAiC;EAAE,OAAO,ENhB1B,GAAO;;AMiBvB,wBAAwC;EAAE,OAAO,ENhB1B,GAAO;;AMiB9B,6BAA6C;EAAE,OAAO,ENsE1B,GAAO;;AMrEnC,sBAAsC;EAAE,OAAO,ENoE1B,GAAO;;AMnE5B,oBAAoC;EAAE,OAAO,EN7Q1B,GAAO;;AM8Q1B,eAA+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;AMkD3B,yBAAyC;EAAE,OAAO,ENjD1B,GAAO;;AMkD/B,iBAAiC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,mBAAmC;EAAE,OAAO,ENzI1B,GAAO;;AM0IzB,cAA8B;EAAE,OAAO,EN9O1B,GAAO;;AM+OpB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;AM4WzB,gBAAgC;EAAE,OAAO,EN9T1B,GAAO;;AM+TtB,cAA8B;EAAE,OAAO,ENnE1B,GAAO;;AMoEpB,gBAAgC;EAAE,OAAO,ENoC1B,GAAO;;AMnCtB,eAA+B;EAAE,OAAO,ENjS1B,GAAO;;AMkSrB,gBAAgC;EAAE,OAAO,ENjS1B,GAAO;;AMkStB,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;AMuYxB,yBAAyC;EAAE,OAAO,ENtY1B,GAAO;;AMuY/B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,uBAAuC;EAAE,OAAO,EN2C1B,GAAO;;AM1C7B,kBAAkC;EAAE,OAAO,ENvC1B,GAAO;;AMwCxB;cAC8B;EAAE,OAAO,EN3W1B,GAAO;;AM4WpB;eAC+B;EAAE,OAAO,EN2D1B,GAAO;;AM1DrB,eAA+B;EAAE,OAAO,ENuF1B,GAAO;;AMtFrB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,qBAAqC;EAAE,OAAO,ENpS1B,GAAO;;AMqS3B,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,mBAAmC;EAAE,OAAO,EN1S1B,GAAO;;AM2SzB,qBAAqC;EAAE,OAAO,ENxP1B,GAAO;;AMyP3B,sBAAsC;EAAE,OAAO,ENjP1B,GAAO;;AMkP5B,uBAAuC;EAAE,OAAO,EN9P1B,GAAO;;AM+P7B,4BAA4C;EAAE,OAAO,ENxP1B,GAAO;;AMyPlC;;uBAEuC;EAAE,OAAO,ENjQ1B,GAAO;;AMkQ7B;yBACyC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQ/B;uBACuC;EAAE,OAAO,ENxQ1B,GAAO;;AMyQ7B;uBACuC;EAAE,OAAO,EN7P1B,GAAO;;AM8P7B,sBAAsC;EAAE,OAAO,EN1Q1B,GAAO;;AM2Q5B,eAA+B;EAAE,OAAO,ENsG1B,GAAO;;AMrGrB,kBAAkC;EAAE,OAAO,ENlV1B,GAAO;;AMmVxB,mBAAmC;EAAE,OAAO,ENnL1B,GAAO;;AMoLzB;;;;oBAIoC;EAAE,OAAO,ENxK1B,GAAO;;AMyK1B,yBAAyC;EAAE,OAAO,ENpW1B,GAAO;;AMqW/B;gBACgC;EAAE,OAAO,EN1E1B,GAAO;;AM2EtB;iBACiC;EAAE,OAAO,ENpT1B,GAAO;;AMqTvB,qBAAqC;EAAE,OAAO,EN1O1B,GAAO;;AM2O3B,cAA8B;EAAE,OAAO,EN5O1B,GAAO;;AM6OpB,sBAAsC;EAAE,OAAO,EN7N1B,GAAO;;AM8N5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;AMvB9B,aAA6B;EAAE,OAAO,ENzF1B,GAAO;;AM0FnB;iBACiC;EAAE,OAAO,EN2F1B,GAAO;;AM1FvB;sBACsC;EAAE,OAAO,EN9H1B,GAAO;;AM+H5B;wBACwC;EAAE,OAAO,EN/H1B,GAAO;;AMgI9B,kBAAkC;EAAE,OAAO,EN3N1B,GAAO;;AM4NxB;sBACsC;EAAE,OAAO,ENrX1B,GAAO;;AMsX5B,iBAAiC;EAAE,OAAO,ENnO1B,GAAO;;AMoOvB,oBAAoC;EAAE,OAAO,ENlI1B,GAAO;;AMmI1B,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;AM2CxB,oBAAoC;EAAE,OAAO,EN7D1B,GAAO;;AM8D1B,2BAA2C;EAAE,OAAO,EN7D1B,GAAO;;AM8DjC,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;AMqbrB;mBACmC;EAAE,OAAO,ENzQ1B,GAAO;;AM0QzB,cAA8B;EAAE,OAAO,ENsC1B,GAAO;;AMrCpB,qBAAqC;EAAE,OAAO,EN/b1B,GAAO;;AMgc3B,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;AMsHrB,qBAAqC;EAAE,OAAO,ENlD1B,GAAO;;AMmD3B,iBAAiC;EAAE,OAAO,ENsC1B,GAAO;;AMrCvB,eAA+B;EAAE,OAAO,ENiF1B,GAAO;;AMhFrB,sBAAsC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ5B,eAA+B;EAAE,OAAO,ENuE1B,GAAO;;AMtErB,qBAAqC;EAAE,OAAO,ENjb1B,GAAO;;AMkb3B,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,wBAAwC;EAAE,OAAO,ENhQ1B,GAAO;;AMiQ9B,kBAAkC;EAAE,OAAO,EN9Z1B,GAAO;;AM+ZxB,wBAAwC;EAAE,OAAO,ENla1B,GAAO;;AMma9B,sBAAsC;EAAE,OAAO,ENpa1B,GAAO;;AMqa5B,kBAAkC;EAAE,OAAO,ENta1B,GAAO;;AMuaxB,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,qBAAqC;EAAE,OAAO,ENld1B,GAAO;;AMmd3B,uBAAuC;EAAE,OAAO,ENld1B,GAAO;;AMmd7B,gBAAgC;EAAE,OAAO,ENY1B,GAAO;;AMXtB,oBAAoC;EAAE,OAAO,EN3X1B,GAAO;;AM4X1B,aAA6B;EAAE,OAAO,ENre1B,GAAO;;AMsenB,qBAAqC;EAAE,OAAO,ENjV1B,GAAO;;AMkV3B,sBAAsC;EAAE,OAAO,ENpK1B,GAAO;;AMqK5B,wBAAwC;EAAE,OAAO,ENrd1B,GAAO;;AMsd9B,qBAAqC;EAAE,OAAO,EN3f1B,GAAO;;AM4f3B,oBAAoC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ1B,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,iBAAiC;EAAE,OAAO,EN1O1B,GAAO;;AM2OvB,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,qBAAqC;EAAE,OAAO,ENN1B,GAAO;;AMO3B,oBAAoC;EAAE,OAAO,ENN1B,GAAO;;AMO1B,kBAAkC;EAAE,OAAO,EN/d1B,GAAO;;AMgexB,cAA8B;EAAE,OAAO,EN7c1B,GAAO;;AM8cpB,kBAAkC;EAAE,OAAO,EN1P1B,GAAO;;AM2PxB,oBAAoC;EAAE,OAAO,ENhhB1B,GAAO;;AMihB1B,aAA6B;EAAE,OAAO,EN7b1B,GAAO;;AM8bnB;;cAE8B;EAAE,OAAO,ENxQ1B,GAAO;;AMyQpB,mBAAmC;EAAE,OAAO,EN7M1B,GAAO;;AM8MzB,qBAAqC;EAAE,OAAO,ENpd1B,GAAO;;AMqd3B,yBAAyC;EAAE,OAAO,ENnZ1B,GAAO;;AMoZ/B,mBAAmC;EAAE,OAAO,ENxY1B,GAAO;;AMyYzB,mBAAmC;EAAE,OAAO,EN1T1B,GAAO;;AM2TzB,kBAAkC;EAAE,OAAO,ENxP1B,GAAO;;AMyPxB,iBAAiC;EAAE,OAAO,ENrH1B,GAAO;;AMsHvB,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,sBAAsC;EAAE,OAAO,ENrG1B,GAAO;;AMsG5B,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;AMqGzB,oBAAoC;EAAE,OAAO,EN5c1B,GAAO;;AM6c1B,0BAA0C;EAAE,OAAO,EN9c1B,GAAO;;AM+chC,kBAAkC;EAAE,OAAO,EN3Y1B,GAAO;;AM4YxB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;AMiHrB,sBAAsC;EAAE,OAAO,ENI1B,GAAO;;AMH5B,qBAAqC;EAAE,OAAO,EN5M1B,GAAO;;AM6M3B,sBAAsC;EAAE,OAAO,ENpE1B,GAAO;;AMqE5B,oBAAoC;EAAE,OAAO,ENhS1B,GAAO;;AMiS1B,gBAAgC;EAAE,OAAO,ENG1B,GAAO;;AMFtB,eAA+B;EAAE,OAAO,ENtO1B,GAAO;;AMuOrB,kBAAkC;EAAE,OAAO,EN7N1B,GAAO;;AM8NxB,sBAAsC;EAAE,OAAO,ENhC1B,GAAO;;AMiC5B,0BAA0C;EAAE,OAAO,ENhC1B,GAAO;;AMiChC,uBAAuC;EAAE,OAAO,END1B,GAAO;;AME7B,sBAAsC;EAAE,OAAO,EN1O1B,GAAO;;AM2O5B,qBAAqC;EAAE,OAAO,ENF1B,GAAO;;AMG3B,sBAAsC;EAAE,OAAO,EN3O1B,GAAO;;AM4O5B,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,wBAAwC;EAAE,OAAO,EN5O1B,GAAO;;AM6O9B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;AMwNvB,4BAA4C;EAAE,OAAO,EN9X1B,GAAO;;AM+XlC,sBAAsC;EAAE,OAAO,ENhM1B,GAAO;;AMiM5B,mBAAmC;EAAE,OAAO,ENI1B,GAAO;;AMHzB,iBAAiC;EAAE,OAAO,EN7I1B,GAAO;;AM8IvB,oBAAoC;EAAE,OAAO,ENjB1B,GAAO;;AMkB1B,qBAAqC;EAAE,OAAO,ENhB1B,GAAO;;AMiB3B;cAC8B;EAAE,OAAO,ENphB1B,GAAO;;AMqhBpB,kBAAkC;EAAE,OAAO,ENd1B,GAAO;;AMexB,gBAAgC;EAAE,OAAO,ENnD1B,GAAO;;AMoDtB,iBAAiC;EAAE,OAAO,ENvF1B,GAAO;;AMwFvB,iBAAiC;EAAE,OAAO,ENrP1B,GAAO",
-"sources": ["../scss/_path.scss","../scss/_core.scss","../scss/_larger.scss","../scss/_fixed-width.scss","../scss/_list.scss","../scss/_variables.scss","../scss/_bordered-pulled.scss","../scss/_animated.scss","../scss/_rotated-flipped.scss","../scss/_mixins.scss","../scss/_stacked.scss","../scss/_icons.scss"],
-"names": [],
-"file": "font-awesome.css"
-}
diff --git a/framework/crawler-ui/src/main/webapp/css/font-awesome.min.css b/framework/crawler-ui/src/main/webapp/css/font-awesome.min.css
deleted file mode 100644
index c904c10..0000000
--- a/framework/crawler-ui/src/main/webapp/css/font-awesome.min.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- *
- * 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, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
-  *
- * 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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/framework/crawler-ui/src/main/webapp/documentstatus.jsp b/framework/crawler-ui/src/main/webapp/documentstatus.jsp
deleted file mode 100644
index a117e78..0000000
--- a/framework/crawler-ui/src/main/webapp/documentstatus.jsp
+++ /dev/null
@@ -1,596 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_REPORTS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-  
-  int k;
-
-  // Read the document selection parameters.
-
-  // The status report is connection based, so the connection has to be selected before anything else makes sense.
-  String statusConnection = variableContext.getParameter("statusconnection");
-  if (statusConnection == null)
-    statusConnection = "";
-
-  // Which jobs we care about also figure in the selection part of the query.  It is the user's responsibility to pick jobs
-  // that are in desired states.
-  String[] statusJobIdentifiers = variableContext.getParameterValues("statusjobs");
-  if (statusJobIdentifiers == null)
-    statusJobIdentifiers = new String[0];
-
-  // We can select documents from the queue based on the earliest time they can be acted upon.  This is specified in
-  // a delta in minutes offset from "now".  Empty means that we don't want to select on that criteria.
-  String activeTimeOffsetMinutes = variableContext.getParameter("statusscheduleoffset");
-  if (activeTimeOffsetMinutes == null)
-    activeTimeOffsetMinutes = "";
-
-  // There is a selection criteria also based on the document state; these are integers defined in IJobManager.
-  String[] documentStateTypes;
-  if (variableContext.getParameter("statusdocumentstates_posted") != null)
-  {
-    documentStateTypes = variableContext.getParameterValues("statusdocumentstates");
-    if (documentStateTypes == null)
-      documentStateTypes = new String[0];
-  }
-  else
-    documentStateTypes = null;
-
-  // There is a selection criteria based on the document status; these are also integers defined in IJobManager.
-  String[] documentStatusTypes;
-  if (variableContext.getParameter("statusdocumentstatuses_posted") != null)
-  {
-    documentStatusTypes = variableContext.getParameterValues("statusdocumentstatuses");
-    if (documentStatusTypes == null)
-      documentStatusTypes = new String[0];
-  }
-  else
-    documentStatusTypes = null;
-
-  // Match string for the document identifier
-  String identifierMatch = variableContext.getParameter("statusidentifiermatch");
-  if (identifierMatch == null)
-    identifierMatch = "";
-
-  // From the passed-in selection values, calculate the actual selection criteria that we'll use in the queries.
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-
-  IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-  // Repository connection name: This simply needs to be mapped to an eligible list of identifiers.
-  IJobDescription[] eligibleList = null;
-  HashMap selectedJobs = null;
-  if (statusConnection.length() > 0)
-  {
-    eligibleList = jobManager.findJobsForConnection(statusConnection);
-    selectedJobs = new HashMap();
-    k = 0;
-    while (k < statusJobIdentifiers.length)
-    {
-      Long identifier = new Long(statusJobIdentifiers[k++]);
-      selectedJobs.put(identifier,identifier);
-    }
-  }
-
-  // Time offset: Need to calculate the actual time in ms since epoch to use to query against the "checktime" field.
-  // Note that the checktime field is actually nullable and will only have a value when the document is in certain states;
-  // therefore, the query itself will only include checktime for those states where it makes sense.  An empty value
-  // means "from the beginning of time", or is equivalent to time 0.
-  long nowTime = 0L;
-  if (activeTimeOffsetMinutes.length() > 0)
-  {
-    nowTime = System.currentTimeMillis() + (new Long(activeTimeOffsetMinutes).longValue()) * 60000L;
-    if (nowTime < 0L)
-      nowTime = 0L;
-  }
-  else
-    nowTime = System.currentTimeMillis();
-
-  // Translate the states from a string to a number that will be understood by IJobManager.
-  int[] matchingStates;
-  if (documentStateTypes == null)
-  {
-    matchingStates = new int[]{IJobManager.DOCSTATE_NEVERPROCESSED,IJobManager.DOCSTATE_PREVIOUSLYPROCESSED,
-      IJobManager.DOCSTATE_OUTOFSCOPE};
-  }
-  else
-  {
-    matchingStates = new int[documentStateTypes.length];
-    k = 0;
-    while (k < matchingStates.length)
-    {
-      matchingStates[k] = new Integer(documentStateTypes[k]).intValue();
-      k++;
-    }
-  }
-  HashMap matchingStatesHash = new HashMap();
-  k = 0;
-  while (k < matchingStates.length)
-  {
-    Integer state = new Integer(matchingStates[k++]);
-    matchingStatesHash.put(state,state);
-  }
-
-  // Convert the status from a string to a number that will be understood by IJobManager
-  int[] matchingStatuses;
-  if (documentStatusTypes == null)
-  {
-    matchingStatuses = new int[]{IJobManager.DOCSTATUS_INACTIVE,IJobManager.DOCSTATUS_PROCESSING,IJobManager.DOCSTATUS_EXPIRING,
-      IJobManager.DOCSTATUS_DELETING,IJobManager.DOCSTATUS_READYFORPROCESSING,IJobManager.DOCSTATUS_READYFOREXPIRATION,
-      IJobManager.DOCSTATUS_WAITINGFORPROCESSING,IJobManager.DOCSTATUS_WAITINGFOREXPIRATION,IJobManager.DOCSTATUS_WAITINGFOREVER,
-      IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED};
-  }
-  else
-  {
-    matchingStatuses = new int[documentStatusTypes.length];
-    k = 0;
-    while (k < matchingStatuses.length)
-    {
-      matchingStatuses[k] = new Integer(documentStatusTypes[k]).intValue();
-      k++;
-    }
-  }
-  HashMap matchingStatusesHash = new HashMap();
-  k = 0;
-  while (k < matchingStatuses.length)
-  {
-    Integer status = new Integer(matchingStatuses[k++]);
-    matchingStatusesHash.put(status,status);
-  }
-
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "documentstatus.ApacheManifoldCFDocumentStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentStatus")%>',
-      'statusReports'
-  );
-
-  function Go()
-  {
-    if (!isInteger(report.rowcount.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"documentstatus.EnterALegalNumberForRowsPerPage")%>");
-      report.rowcount.focus();
-      return;
-    }
-    if (!isRegularExpression(report.statusidentifiermatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"documentstatus.IdentifierMatchMustBeAValidRegularExpression")%>");
-      report.statusidentifiermatch.focus();
-      return;
-    }
-
-    document.report.op.value="Status";
-    document.report.action = document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function Continue()
-  {
-    if (!isRegularExpression(report.statusidentifiermatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"documentstatus.IdentifierMatchMustBeAValidRegularExpression")%>");
-      report.statusidentifiermatch.focus();
-      return;
-    }
-    document.report.op.value = "Continue";
-    document.report.action = document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function ColumnClick(colname)
-  {
-    document.report.clickcolumn.value = colname;
-    Go();
-  }
-
-  function SetPosition(amt)
-  {
-    if (amt < 0)
-      amt = 0;
-    document.report.startrow.value = amt;
-    Go();
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo = "teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  $(function ()
-  {
-    $('.selectpicker').selectpicker();
-  });
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <form class="standardform" name="report" action="execute.jsp" method="POST">
-      <input type="hidden" name="op" value="Continue" />
-      <input type="hidden" name="type" value="documentstatus" />
-
-      <div class="box box-primary">
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Connection")%></th>
-              <td>
-                <select class="selectpicker" name="statusconnection">
-                  <option <%=(statusConnection.length()==0)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.NotSpecified")%> --</option>
-<%
-  int i = 0;
-  while (i < connList.length)
-  {
-    IRepositoryConnection conn = connList[i++];
-    String thisConnectionName = conn.getName();
-    String thisDescription = conn.getDescription();
-    if (thisDescription == null || thisDescription.length() == 0)
-      thisDescription = thisConnectionName;
-%>
-                  <option <%=(thisConnectionName.equals(statusConnection))?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisConnectionName)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  if (eligibleList != null)
-  {
-%>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Jobs")%></th>
-              <td>
-                <select class="selectpicker" multiple="true" name="statusjobs">
-<%
-    i = 0;
-    while (i < eligibleList.length)
-    {
-      IJobDescription job = eligibleList[i++];
-      String description = job.getDescription();
-      Long identifier = job.getID();
-%>
-                  <option <%=((selectedJobs.get(identifier)==null)?"":"selected=\"selected\"")%> value='<%=identifier.toString()%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></option>
-<%
-    }
-%>
-                </select>
-              </td>
-<%
-  }
-  else
-  {
-%>
-              <td colspan="2"></td>
-<%
-  }
-%>
-
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.TimeOffsetFromNowMinutes")%></th>
-              <td colspan="3">
-                <input name="statusscheduleoffset" type="text" size="6" value="" class="form-control" />
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentState")%></th>
-              <td colspan="3">
-                <input name="statusdocumentstates_posted" type="hidden" value="true"/>
-                <select class="selectpicker" name="statusdocumentstates" multiple="true">
-                  <option <%=((matchingStatesHash.get(new Integer(IJobManager.DOCSTATE_NEVERPROCESSED))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATE_NEVERPROCESSED)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsThatHaveNeverBeenProcessed")%></option>
-                  <option <%=((matchingStatesHash.get(new Integer(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsProcessedAtLeastOnce")%></option>
-                  <option <%=((matchingStatesHash.get(new Integer(IJobManager.DOCSTATE_OUTOFSCOPE))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATE_OUTOFSCOPE)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsOutOfScope")%></option>
-                </select>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentState")%></th>
-              <td colspan="3">
-                <input name="statusdocumentstatuses_posted" type="hidden" value="true"/>
-                <select class="selectpicker" name="statusdocumentstatuses" multiple="true">
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_INACTIVE))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_INACTIVE)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsThatAreNoLongerActive")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_PROCESSING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_PROCESSING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsCurrentlyInProgress")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_EXPIRING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_EXPIRING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsCurrentlyBeingExpired")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_DELETING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_DELETING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsCurrentlyBeingDeleted")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_READYFORPROCESSING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_READYFORPROCESSING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsCurrentlyAvailableForProcessing")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_READYFOREXPIRATION))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_READYFOREXPIRATION)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsCurrentlyAvailableForExpiration")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_WAITINGFORPROCESSING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_WAITINGFORPROCESSING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsNotYetProcessable")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsNotYetExpirable")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_WAITINGFOREVER))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_WAITINGFOREVER)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsWaitingForever")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentsHopcountExceeded")%></option>
-                </select>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.DocumentIdentifierMatch")%></th>
-              <td colspan="3">
-                <input type="text" name="statusidentifiermatch" size="40" class="form-control" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(identifierMatch)%>'/>
-              </td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-<%
-  if (statusConnection.length() > 0 && statusJobIdentifiers.length > 0)
-  {
-%>
-            <a href="#" class="btn btn-primary" role="button" onClick="javascript:Go()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"documentstatus.ExecuteThisQuery")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"documentstatus.ExecuteThisQuery")%></a>
-<%
-  }
-  else
-  {
-%>
-            <a href="#" class="btn btn-primary" role="button" onClick="javascript:Continue()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"documentstatus.Continue")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"documentstatus.Continue")%></a>
-<%
-  }
-%>
-          </div>
-        </div>
-      </div>
-
-<%
-  if (statusConnection.length() > 0)
-  {
-    if (statusJobIdentifiers.length > 0)
-    {
-      // Run the report.
-
-      // First, we need to gather the sort order object.
-      String sortOrderString = variableContext.getParameter("sortorder");
-      SortOrder sortOrder;
-      if (sortOrderString == null || sortOrderString.length() == 0)
-        sortOrder = new SortOrder();
-      else
-        sortOrder = new SortOrder(sortOrderString);
-
-      // Now, gather the column header that was clicked on (if any)
-      String clickedColumn = variableContext.getParameter("clickcolumn");
-      if (clickedColumn != null && clickedColumn.length() > 0)
-        sortOrder.clickColumn(clickedColumn);
-
-      // Gather the start
-      String startRowString = variableContext.getParameter("startrow");
-      int startRow = 0;
-      if (startRowString != null && startRowString.length() > 0)
-        startRow = Integer.parseInt(startRowString);
-
-      // Gather the max
-      String maxRowCountString = variableContext.getParameter("rowcount");
-      int rowCount = 20;
-      if (maxRowCountString != null && maxRowCountString.length() > 0)
-        rowCount = Integer.parseInt(maxRowCountString);
-
-      Long[] ourJobs = new Long[selectedJobs.size()];
-      Iterator iter = selectedJobs.keySet().iterator();
-      int zz = 0;
-      while (iter.hasNext())
-      {
-        ourJobs[zz++] = (Long)iter.next();
-      }
-
-      RegExpCriteria identifierMatchObject = null;
-      if (identifierMatch.length() > 0)
-        identifierMatchObject = new RegExpCriteria(identifierMatch,true);
-      StatusFilterCriteria criteria = new StatusFilterCriteria(ourJobs,nowTime,identifierMatchObject,matchingStates,matchingStatuses);
-
-      IResultSet set = jobManager.genDocumentStatus(statusConnection,criteria,sortOrder,startRow,rowCount+1);
-
-%>
-      <input type="hidden" name="clickcolumn" value=""/>
-      <input type="hidden" name="startrow" value='<%=Integer.toString(startRow)%>'/>
-      <input type="hidden" name="sortorder" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sortOrder.toString())%>'/>
-
-      <div class="box box-primary">
-        <div class="box-body table-responsive">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Identifier")%></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("job");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Job")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("state");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.State")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("status");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Status")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("scheduled");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Scheduled")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("action");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.ScheduledAction")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("retrycount");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.RetryCount")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("retrylimit");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.RetryLimit")%></a></th>
-            </tr>
-<%
-      zz = 0;
-      boolean hasMoreRows = (set.getRowCount() > rowCount);
-      int iterCount = hasMoreRows?rowCount:set.getRowCount();
-      while (zz < iterCount)
-      {
-        IResultRow row = set.getRow(zz);
-
-        // Translate column values into something that can be reasonably displayed.
-        // Note that the actual hard work of translating things to human-readable strings largely is done by the query itself; this is because
-        // we want to sort on the columns, so it has to be that way.
-
-        String[] identifierBreakdown = org.apache.manifoldcf.ui.util.Formatter.formatString(row.getValue("identifier").toString(),64,true,true);
-        Long scheduleTime = (Long)row.getValue("scheduled");
-        String scheduleTimeString = "";
-        if (scheduleTime != null)
-          scheduleTimeString = org.apache.manifoldcf.ui.util.Formatter.formatTime(scheduleTime.longValue());
-        String scheduledActionString = (String)row.getValue("action");
-        if (scheduledActionString == null)
-          scheduledActionString = "";
-        Long retryCount = (Long)row.getValue("retrycount");
-        String retryCountString = "";
-        if (retryCount != null)
-          retryCountString = retryCount.toString();
-        Long retryLimit = (Long)row.getValue("retrylimit");
-        String retryLimitString = "";
-        if (retryLimit != null)
-          retryLimitString = org.apache.manifoldcf.ui.util.Formatter.formatTime(retryLimit.longValue());
-
-%>
-            <tr>
-              <td>
-<%
-        int q = 0;
-        while (q < identifierBreakdown.length)
-        {
-%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(identifierBreakdown[q++])%></nobr><br />
-<%
-        }
-%>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("job").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("state").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("status").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(scheduleTimeString)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(scheduledActionString)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(retryCountString)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(retryLimitString)%></td>
-            </tr>
-<%
-        zz++;
-      }
-%>
-          </table>
-        </div>
-        <div class="box-footer">
-          <ul class="pagination pagination-sm no-margin pull-left">
-<%
-      if (startRow == 0)
-      {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Previous")%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li><a href="javascript:void(0);" onclick='<%="javascript:SetPosition("+Integer.toString(startRow-rowCount)+");"%>' title="Previous page" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Previous")%></a></li>
-<%
-      }
-%>
-
-<%
-      if (hasMoreRows == false)
-      {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Next")%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li><a href="javascript:void(0);" onclick='<%="javascript:SetPosition("+Integer.toString(startRow+rowCount)+");"%>' title="Next page"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Next")%></a></li>
-<%
-      }
-%>
-          </ul>
-          <ul class="pagination pagination-sm no-margin pull-right">
-            <li class="pad">
-              <span class="label label-primary">
-                <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.Rows")%>
-                <%=Integer.toString(startRow)%>-<%=(hasMoreRows?Integer.toString(startRow+rowCount-1):"END")%>
-              </span>
-            </li>
-            <li class="form-inline">
-              <div class="input-group input-group-sm">
-                <span class="input-group-addon"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.RowsPerPage")%></span>
-                <input type="text" class="form-control" name="rowcount" size="5" class="form-control" value='<%=Integer.toString(rowCount)%>'/>
-              </div>
-            </li>
-          </ul>
-        </div>
-
-<%
-    }
-    else
-    {
-%>
-        <div class="callout callout-info">
-          <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.PleaseSelectAtLeastOneJob")%></p>
-        </div>
-<%
-    }
-  }
-  else
-  {
-%>
-        <div class="callout callout-info">
-          <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"documentstatus.PleaseSelectaConnection")%></p>
-        </div>
-<%
-  }
-%>
-      </div>
-    </form>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/editauthority.jsp b/framework/crawler-ui/src/main/webapp/editauthority.jsp
deleted file mode 100644
index 5721caf..0000000
--- a/framework/crawler-ui/src/main/webapp/editauthority.jsp
+++ /dev/null
@@ -1,602 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "ConnectionObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listauthorities.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  // Get the domain manager handle
-  IAuthorizationDomainManager domainMgr = AuthorizationDomainManagerFactory.make(threadContext);
-  // Also get the list of available connectors
-  IAuthorityConnectorManager connectorManager = AuthorityConnectorManagerFactory.make(threadContext);
-  // Connections
-  IAuthorityConnectionManager connectionManager = AuthorityConnectionManagerFactory.make(threadContext);
-  // Get the mapping connection manager
-  IMappingConnectionManager mappingConnMgr = MappingConnectionManagerFactory.make(threadContext);
-  // Get the group manager
-  IAuthorityGroupManager authGroupManager = AuthorityGroupManagerFactory.make(threadContext);
-
-  // Get connectors, since this will be needed to determine what to display.
-  IResultSet set = connectorManager.getConnectors();
-  // Same for authority groups
-  IAuthorityGroup[] set2 = authGroupManager.getAllGroups();
-  // Get all mapping connections
-  IMappingConnection[] mappingConnections = mappingConnMgr.getAllConnections();
-  // Get set of domains
-  IResultSet domainSet = domainMgr.getDomains();
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Name");
-
-  String connectionName = null;
-  IAuthorityConnection connection = (IAuthorityConnection)threadContext.get("ConnectionObject");
-  if (connection == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    connectionName = variableContext.getParameter("connname");
-    // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (connectionName != null && connectionName.length() > 0)
-    {
-      connection = connectionManager.load(connectionName);
-    }
-  }
-
-  // Setup default fields
-  boolean isNew = true;
-  String description = "";
-  String className = "";
-  int maxConnections = 10;
-  ConfigParams parameters = new ConfigParams();
-  String prereq = null;
-  String authDomain = "";
-  String groupName = "";
-
-  if (connection != null)
-  {
-    // Set up values
-    isNew = connection.getIsNew();
-    connectionName = connection.getName();
-    description = connection.getDescription();
-    className = connection.getClassName();
-    parameters = connection.getConfigParams();
-    maxConnections = connection.getMaxConnections();
-    prereq = connection.getPrerequisiteMapping();
-    authDomain = connection.getAuthDomain();
-    if (authDomain == null)
-      authDomain = "";
-    groupName = connection.getAuthGroup();
-    if (groupName == null)
-      groupName = "";
-  }
-  else
-    connectionName = null;
-
-  if (connectionName == null)
-    connectionName = "";
-
-  // Initialize tabs array
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Name"));
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Type"));
-  if (className.length() > 0)
-  {
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Prerequisites"));
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Throttling"));
-  }
-
-%>
-
-<script type="text/javascript">
-    <!--
-
-<%
-  String title = null;
-  if (description.length() > 0)
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(), "editauthority.EditAuthority") + " - " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(), "editauthority.EditAnAuthority");
-  }
-%>
-
-    $.ManifoldCF.setTitle('<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.ApacheManifoldCFEditAuthority")%>','<%=title%>','authorities');
-
-    // Use this method to repost the form and pick a new tab
-    function SelectTab(newtab)
-    {
-        if (checkForm())
-        {
-            document.editconnection.tabname.value = newtab;
-            $.ManifoldCF.submit(document.editconnection);
-        }
-    }
-
-    // Use this method to repost the form,
-    // and set the anchor request.
-    function postFormSetAnchor(anchorValue)
-    {
-        if (checkForm())
-        {
-            if (anchorValue != "")
-                document.editconnection.action = document.editconnection.action + "#" + anchorValue;
-            $.ManifoldCF.submit(document.editconnection);
-        }
-    }
-
-    // Use this method to repost the form
-    function postForm()
-    {
-        if (checkForm())
-        {
-            $.ManifoldCF.submit(document.editconnection);
-        }
-    }
-
-    function Save()
-    {
-        if (checkForm())
-        {
-            // Can't submit until all required fields have been set.
-            // Some of these don't live on the current tab, so don't set
-            // focus.
-
-            // Check our part of the form, for save
-            if (editconnection.connname.value == "")
-            {
-                alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editauthority.ConnectionMustHaveAName")%>");
-                SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editauthority.Name")%>");
-                document.editconnection.connname.focus();
-                return;
-            }
-            if (editconnection.authoritygroup.value == "")
-            {
-                alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editauthority.ConnectionMustHaveAGroup")%>");
-                SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editauthority.Type")%>");
-                document.editconnection.authoritygroup.focus();
-                return;
-            }
-            if (window.checkConfigForSave)
-            {
-                if (!checkConfigForSave())
-                    return;
-            }
-            document.editconnection.op.value="Save";
-            $.ManifoldCF.submit(document.editconnection);
-        }
-    }
-
-    function Continue()
-    {
-        document.editconnection.op.value="Continue";
-        postForm();
-    }
-
-    function Cancel()
-    {
-        document.editconnection.op.value="Cancel";
-        $.ManifoldCF.submit(document.editconnection);
-    }
-
-    function checkForm()
-    {
-        if (!checkConnectionCount())
-            return false;
-        if (window.checkConfig)
-            return checkConfig();
-        return true;
-    }
-
-    function checkConnectionCount()
-    {
-        if (!isInteger(editconnection.maxconnections.value))
-        {
-            alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editauthority.TheMaximumNumberOfConnectionsMustBeAValidInteger")%>");
-            editconnection.maxconnections.focus();
-            return false;
-        }
-        return true;
-    }
-    
-    function isRegularExpression(value)
-    {
-        try
-        {
-            var foo = "teststring";
-            foo.search(value.replace(/\(\?i\)/,""));
-            return true;
-        }
-        catch (e)
-        {
-            return false;
-        }
-
-    }
-
-    function isInteger(value)
-    {
-        var anum=/(^\d+$)/;
-        return anum.test(value);
-    }
-
-    //-->
-</script>
-<%
-  AuthorityConnectorFactory.outputConfigurationHeader(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabsArray);
-%>
-
-<div class="row">
-  <div class="col-md-12">
-<%
-  if (set2.length == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.NoAuthorityGroupsDefinedCreateOneFirst")%></p>
-    </div>
-<%
-  }
-  else if (set.getRowCount() == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.NoAuthorityConnectorsRegistered")%></p>
-    </div>
-<%
-  }
-  else
-  {
-%>
-    <div class="box box-primary">
-      <form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="authority"/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-<%
-    int tabNum = 0;
-    int activeTab = 0;
-    while (tabNum < tabsArray.size())
-    {
-      String tab = (String)tabsArray.get(tabNum++);
-      if (tab.equals(tabName))
-      {
-%>
-            <li class="active"><a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                 alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.tab")%>'
-                 onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-    }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-<%
-
-    // Name tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Name")))
-    {
-%>
-          <div class="tab-pane active" id="tab_<%=activeTab%>">
-            <div class="form-group">
-              <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.NameColon")%></label>
-<%
-      // If the connection doesn't exist yet, we are allowed to change the name.
-      if (isNew)
-      {
-%>
-              <input type="text" size="32" name="connname" class="form-control" placeholder="Name..." value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-      else
-      {
-%>
-              <input type="text" size="32" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-              <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-%>
-            </div>
-            <div class="form-group">
-              <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.DescriptionColon")%> </label>
-              <input type="text" size="50" class="form-control" name="description" id="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-            </div>
-          </div>
-<%
-    }
-    else
-    {
-    // Hiddens for the Name tab
-%>
-          <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-          <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-    }
-
-
-    // "Type" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Type")))
-    {
-%>
-          <div class="tab-pane active" id="tab_<%=activeTab%>">
-            <div class="form-group">
-              <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.ConnectionTypeColon")%></label>
-
-<%
-      if (className.length() > 0)
-      {
-        String value = connectorManager.getDescription(className);
-        if (value == null)
-        {
-%>
-              <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editauthority.UNREGISTERED")%> <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(className)%></nobr>
-<%
-        }
-        else
-        {
-%>
-              <input type="text" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)%>'/>
-<%
-        }
-%>
-              <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-      }
-      else
-      {
-        int i = 0;
-%>
-              <select name="classname" class="form-control">
-<%
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          String thisClassName = row.getValue("classname").toString();
-          String thisDescription = row.getValue("description").toString();
-%>
-                <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisClassName)%>' <%=className.equals(thisClassName)?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-        }
-%>
-              </select>
-<%
-      }
-%>
-            </div>
-            <div class="form-group">
-              <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.AuthorityGroupColon")%></label>
-              <select name="authoritygroup" class="form-control">
-                <option value=""><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.SelectAGroup")%></option>
-<%
-      for (int i = 0; i < set2.length; i++)
-      {
-        IAuthorityGroup row = set2[i];
-        String thisAuthorityName = row.getName();
-        String thisDescription = row.getDescription();
-        if (thisDescription == null || thisDescription.length() == 0)
-          thisDescription = thisAuthorityName;
-%>
-                <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisAuthorityName)%>'<%=(groupName.equals(thisAuthorityName))?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-      }
-%>
-              </select>
-            </div>
-            <div class="form-group">
-              <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.AuthorizationDomainColon")%></label>
-              <select name="authdomain" class="form-control">
-                <option value="" <%=(authDomain == null || authDomain.length() == 0)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.DefaultDomainNone")%></option>
-<%
-      for (int i = 0; i < domainSet.getRowCount(); i++)
-      {
-        IResultRow row = domainSet.getRow(i);
-        String domainName = (String)row.getValue("domainname");
-        String thisDescription = (String)row.getValue("description");
-        if (thisDescription == null || thisDescription.length() == 0)
-          thisDescription = domainName;
-%>
-                <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(domainName)%>'<%=(authDomain!=null && domainName.equals(authDomain))?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-      }
-%>
-              </select>
-            </div>
-          </div>
-<%
-    }
-    else
-    {
-    // Hiddens for the "Type" tab
-%>
-          <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-          <input type="hidden" name="authdomain" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(authDomain)%>'/>
-          <input type="hidden" name="authoritygroup" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(groupName)%>'/>
-<%
-    }
-
-    // The "Prerequisites" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Prerequisites")))
-    {
-%>
-          <div class="tab-pane active" id="tab_<%=activeTab%>">
-            <div class="form-group">
-              <strong><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.PrerequisiteUserMappingColon")%></strong>
-
-              <div class="radio">
-                <label>
-                  <input type="hidden" name="prerequisites_present" value="true"/>
-<%
-      if (prereq == null)
-      {
-%>
-                  <input type="radio" name="prerequisites" value="" checked="true"/>&nbsp;<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.NoPrerequisites")%><br/>
-<%
-      }
-      else
-      {
-%>
-                  <input type="radio" name="prerequisites" value=""/>&nbsp;<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.NoPrerequisites")%><br/>
-<%
-      }
-
-      for (IMappingConnection mappingConnection : mappingConnections)
-      {
-        String mappingName = mappingConnection.getName();
-        String mappingDescription = mappingName;
-        if (mappingConnection.getDescription() != null && mappingConnection.getDescription().length() > 0)
-          mappingDescription += " (" + mappingConnection.getDescription()+")";
-        if (prereq != null && prereq.equals(mappingName))
-        {
-%>
-                  <input type="radio" name="prerequisites" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mappingName)%>' checked="true"/>&nbsp;<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mappingDescription)%><br/>
-<%
-        }
-        else
-        {
-%>
-                  <input type="radio" name="prerequisites" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mappingName)%>'/>&nbsp;<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mappingDescription)%><br/>
-<%
-        }
-      }
-%>
-                </label>
-              </div>
-            </div>
-          </div>
-<%
-    }
-    else
-    {
-    // Hiddens for Prerequisites tab
-%>
-          <input type="hidden" name="prerequisites_present" value="true"/>
-<%
-      if (prereq != null)
-      {
-%>
-          <input type="hidden" name="prerequisites" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(prereq)%>'/>
-<%
-      }
-    }
-
-    // The "Throttling" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Throttling")))
-    {
-%>
-          <div class="tab-pane active" id="tab_<%=activeTab%>">
-            <div class="form-group">
-              <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.MaxConnectionsColon")%></label>
-              <input type="text" size="6" name="maxconnections" class="form-control" value='<%=Integer.toString(maxConnections)%>'/>
-            </div>
-          </div>
-<%
-    }
-    else
-    {
-    // Hiddens for "Throttling" tab
-%>
-          <input type="hidden" name="maxconnections" value='<%=Integer.toString(maxConnections)%>'/>
-<%
-    }
-
-    if (className.length() > 0)
-      AuthorityConnectorFactory.outputConfigurationBody(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabName);
-%>
-          </div>
-        </div>
-
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-<%
-    if (className.length() > 0)
-    {
-%>
-            <a href="#" class="btn btn-primary" onClick="javascript:Save()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.SaveThisAuthorityConnection")%>" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.Save")%></a>
-<%
-    }
-    else
-    {
-      if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editauthority.Type")))
-      {
-%>
-            <a href="#" class="btn btn-primary" onClick="javascript:Continue()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.ContinueToNextPage")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.Continue")%></a>
-<%
-      }
-    }
-%>
-            <a href="#" class="btn btn-primary" onClick="javascript:Cancel()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.CancelAuthorityEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editauthority.Cancel")%></a>
-
-
-          </div>
-        </div>
-      </form>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listauthorities.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/editconnection.jsp b/framework/crawler-ui/src/main/webapp/editconnection.jsp
deleted file mode 100644
index c099bd9..0000000
--- a/framework/crawler-ui/src/main/webapp/editconnection.jsp
+++ /dev/null
@@ -1,614 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "ConnectionObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listconnections.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the connection manager handle
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  // Also get the list of available connectors
-  IConnectorManager connectorManager = ConnectorManagerFactory.make(threadContext);
-  IAuthorityGroupManager authGroupManager = AuthorityGroupManagerFactory.make(threadContext);
-
-  IAuthorityGroup[] set2 = authGroupManager.getAllGroups();
-  IResultSet set = connectorManager.getConnectors();
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Name");
-
-  String connectionName = null;
-  IRepositoryConnection connection = (IRepositoryConnection)threadContext.get("ConnectionObject");
-  if (connection == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    connectionName = variableContext.getParameter("connname");
-    // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (connectionName != null && connectionName.length() > 0)
-    {
-      connection = connMgr.load(connectionName);
-    }
-  }
-
-  // Set up default fields.
-  boolean isNew = true;
-  String description = "";
-  String className = "";
-  String authorityName = null;
-  int maxConnections = 10;
-  // Fetches per minute
-  ArrayList throttles = new ArrayList();
-  ConfigParams parameters = new ConfigParams();
-
-  // If there's a connection object, set up all our parameters from it.
-  if (connection != null)
-  {
-    // Set up values
-    isNew = connection.getIsNew();
-    connectionName = connection.getName();
-    description = connection.getDescription();
-    className = connection.getClassName();
-    parameters = connection.getConfigParams();
-    authorityName = connection.getACLAuthority();
-    maxConnections = connection.getMaxConnections();
-    String[] throttlesX = connection.getThrottles();
-    int j = 0;
-    while (j < throttlesX.length)
-    {
-      String throttleRegexp = throttlesX[j++];
-      Map map = new HashMap();
-      map.put("regexp",throttleRegexp);
-      map.put("description",connection.getThrottleDescription(throttleRegexp));
-      map.put("value",new Long((long)(((double)connection.getThrottleValue(throttleRegexp) * (double)60000.0) + 0.5)));
-      throttles.add(map);
-    }
-  }
-  else
-    connectionName = null;
-
-  if (connectionName == null)
-    connectionName = "";
-
-  // Initialize tabs array.
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Name"));
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Type"));
-  if (className.length() > 0)
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Throttling"));
-
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editconnection.ApacheManifoldCFEditConnection")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editconnection.EditRepositoryConnection")%>',
-      'repositories'
-  );
-
-  // Use this method to repost the form and pick a new tab
-  function SelectTab(newtab)
-  {
-    if (checkForm())
-    {
-      document.editconnection.tabname.value=newtab;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form,
-  // and set the anchor request.
-  function postFormSetAnchor(anchorValue)
-  {
-    if (checkForm())
-    {
-      if (anchorValue != "")
-        document.editconnection.action=document.editconnection.action + "#" + anchorValue;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form
-  function postForm()
-  {
-    if (checkForm())
-    {
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Save()
-  {
-    if (checkForm())
-    {
-      // Can't submit until all required fields have been set.
-      // Some of these don't live on the current tab, so don't set
-      // focus.
-
-      // Check our part of the form, for save
-      if (editconnection.connname.value == "")
-      {
-        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editconnection.ConnectionMustHaveAName")%>");
-        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editconnection.Name")%>");
-        document.editconnection.connname.focus();
-        return;
-      }
-      if (window.checkConfigForSave)
-      {
-        if (!checkConfigForSave())
-          return;
-      }
-      document.editconnection.op.value="Save";
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Continue()
-  {
-    document.editconnection.op.value="Continue";
-    postForm();
-  }
-
-  function Cancel()
-  {
-    document.editconnection.op.value="Cancel";
-    $.ManifoldCF.submit(document.editconnection);
-  }
-
-  function DeleteThrottle(i)
-  {
-    document.editconnection.throttleop.value="Delete";
-    document.editconnection.throttlenumber.value=i;
-    postForm();
-  }
-
-  function AddThrottle()
-  {
-    if (!isInteger(editconnection.throttlevalue.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editconnection.ThrottleRateMustBeAnInteger")%>");
-      document.editconnection.throttlevalue.focus();
-      return;
-    }
-    if (!isRegularExpression(editconnection.throttle.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editconnection.TheThrottleExpressionMustBeAValidRegularExpression")%>");
-      editconnection.throttle.focus();
-      return;
-    }
-    document.editconnection.throttleop.value="Add";
-    postForm();
-  }
-
-  function checkForm()
-  {
-    if (!checkConnectionCount())
-      return false;
-    if (window.checkConfig)
-      return checkConfig();
-    return true;
-  }
-
-  function checkConnectionCount()
-  {
-    if (!isInteger(editconnection.maxconnections.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editconnection.TheMaximumNumberOfConnectionsMustBeAValidInteger")%>");
-      editconnection.maxconnections.focus();
-      return false;
-    }
-    return true;
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-<%
-  RepositoryConnectorFactory.outputConfigurationHeader(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabsArray);
-%>
-<div class="row">
-  <div class="col-md-12">
-<%
-  // Get connector list; need this to decide what to do
-  if (set.getRowCount() == 0)
-  {
-%>
-
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.NoRepositoryConnectorsRegistered")%></p>
-    </div>
-<%
-  }
-  else
-  {
-%>
-    <div class="box box-primary">
-      <form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="connection"/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-<%
-    int tabNum = 0;
-    int activeTab = 0;
-    while (tabNum < tabsArray.size())
-    {
-      String tab = (String)tabsArray.get(tabNum++);
-      if (tab.equals(tabName))
-      {
-%>
-            <li class="active">
-              <a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-      else
-      {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                      alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.tab")%>'
-                      onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-    }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-
-<%
-
-    // Name tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Name")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.NameColon")%></label>
-<%
-      // If the connection doesn't exist yet, we are allowed to change the name.
-      if (isNew)
-      {
-%>
-                <input type="text" size="32" name="connname" class="form-control" placeholder="Name..." value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-      else
-      {
-%>
-
-                <input type="text" size="32" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-                <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-%>
-              </div>
-              <div class="form-group">
-                <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.DescriptionColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" id="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-    // Hiddens for the Name tab
-%>
-            <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-            <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-    }
-
-
-    // "Type" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Type")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.ConnectionTypeColon")%></label>
-<%
-      if (className.length() > 0)
-      {
-        String value = connectorManager.getDescription(className);
-        if (value == null)
-        {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.UNREGISTERED")%> <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(className)%></nobr>
-<%
-        }
-        else
-        {
-%>
-                <input type="text" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)%>'/>
-<%
-        }
-%>
-                <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-      }
-      else
-      {
-        int i = 0;
-%>
-                <select name="classname" class="form-control">
-<%
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          String thisClassName = row.getValue("classname").toString();
-          String thisDescription = row.getValue("description").toString();
-%>
-                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisClassName)%>'<%=className.equals(thisClassName)?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-        }
-%>
-                </select>
-<%
-      }
-%>
-              </div>
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.AuthorityGroupColon")%></label>
-
-<%
-      int i = 0;
-%>
-                <select name="authorityname" class="form-control">
-                  <option value="_none_" <%=(authorityName==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.GlobalAuthority")%></option>
-<%
-      while (i < set2.length)
-      {
-        IAuthorityGroup row = set2[i++];
-        String thisAuthorityName = row.getName();
-        String thisDescription = row.getDescription();
-        if (thisDescription == null || thisDescription.length() == 0)
-          thisDescription = thisAuthorityName;
-%>
-                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisAuthorityName)%>'<%=(authorityName!=null && authorityName.equals(thisAuthorityName))?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-      }
-%>
-                </select>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-    // Hiddens for the "Type" tab
-%>
-            <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-            <input type="hidden" name="authorityname" value='<%=(authorityName==null)?"_none_":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(authorityName)%>'/>
-<%
-    }
-
-
-    // The "Throttling" tab
-%>
-            <input type="hidden" name="throttlecount" value='<%=Integer.toString(throttles.size())%>'/>
-<%
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Throttling")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.MaxconnectionsColon")%></label>
-                <input type="text" size="6" name="maxconnections" class="form-control" value='<%=Integer.toString(maxConnections)%>'/>
-              </div>
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.ThrottlingColon")%></label>
-
-                <input type="hidden" name="throttleop" value="Continue"/>
-                <input type="hidden" name="throttlenumber" value=""/>
-                <table class="table table-bordered">
-                  <tr>
-                    <th>Action</th>
-                    <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.BinRegularExpression")%></th>
-                    <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.Description")%></th>
-                    <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.MaxAvgFetchesMin")%></th>
-                  </tr>
-<%
-    int k = 0;
-    while (k < throttles.size())
-    {
-      Map map = (Map)throttles.get(k);
-      String regexp = (String)map.get("regexp");
-      String desc = (String)map.get("description");
-      if (desc == null)
-        desc = "";
-      Long value = (Long)map.get("value");
-%>
-                  <tr>
-                    <td>
-                      <input class="btn btn-danger btn-xs" type="button"
-                              value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.Delete")%>"
-                              alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.Deletethrottle")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(regexp)%>'
-                              onclick='<%="javascript:DeleteThrottle("+Integer.toString(k)+");"%>'/>
-                    </td>
-                    <td>
-                      <input type="hidden" name='<%="throttle_"+Integer.toString(k)%>' value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(regexp)%>'/>
-                      <input type="hidden" name='<%="throttledesc_"+Integer.toString(k)%>' value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(desc)%>'/>
-                      <input type="hidden" name='<%="throttlevalue_"+Integer.toString(k)%>' value='<%=value.toString()%>'/>
-                      <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(regexp)%></nobr>
-                    </td>
-                    <td>
-<%
-      if (desc.length() > 0)
-      {
-%>
-                      <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(desc)%>
-<%
-      }
-%>
-                    </td>
-                    <td><%=value.toString()%></td>
-                  </tr>
-<%
-      k++;
-    }
-    if (k == 0)
-    {
-%>
-                  <div class="callout callout-info">
-                    <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.NoThrottlingSpecified")%>
-                  </div>
-<%
-    }
-%>
-                  <tr>
-                    <td>
-                      <input type="button" class="btn btn-success btn-xs"
-                              value="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.Add")%>"
-                              alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.Addthrottle")%>"
-                              onclick="javascript:AddThrottle();"/>
-                    </td>
-                    <td><input type="text" class="form-control" name="throttle" size="30" value=""/></td>
-                    <td><input type="text" class="form-control" name="throttledesc" size="30" value=""/></td>
-                    <td><input type="text" class="form-control" name="throttlevalue" size="5" value=""/></td>
-                  </tr>
-                </table>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-    // Hiddens for "Throttling" tab
-%>
-            <input type="hidden" name="maxconnections" value='<%=Integer.toString(maxConnections)%>'/>
-<%
-      int k = 0;
-      while (k < throttles.size())
-      {
-        Map map = (Map)throttles.get(k);
-        String regexp = (String)map.get("regexp");
-        String desc = (String)map.get("description");
-        if (desc == null)
-          desc = "";
-        Long value = (Long)map.get("value");
-%>
-            <input type="hidden" name='<%="throttle_"+Integer.toString(k)%>' value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(regexp)%>'/>
-            <input type="hidden" name='<%="throttledesc_"+Integer.toString(k)%>' value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(desc)%>'/>
-            <input type="hidden" name='<%="throttlevalue_"+Integer.toString(k)%>' value='<%=value.toString()%>'/>
-<%
-        k++;
-      }
-    }
-
-    if (className.length() > 0)
-    {
-      RepositoryConnectorFactory.outputConfigurationBody(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabName);
-    }
-%>
-
-          </div>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-
-<%
-    if (className.length() > 0)
-    {
-%>
-            <a href="#" class="btn btn-primary" onClick="javascript:Save()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.SaveThisAuthorityConnection")%>" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.Save")%></a>
-<%
-    }
-    else
-    {
-      if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editconnection.Type")))
-      {
-%>
-            <a href="#" class="btn btn-primary" onClick="javascript:Continue()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.ContinueToNextPage")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.Continue")%></a>
-<%
-      }
-    }
-%>
-            <a href="#" class="btn btn-primary" onClick="javascript:Cancel()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.CancelConnectionEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editconnection.Cancel")%></a>
-          </div>
-        </div>
-      </form>
-<%
-  }
-%>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listconnections.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/editgroup.jsp b/framework/crawler-ui/src/main/webapp/editgroup.jsp
deleted file mode 100644
index e6ab928..0000000
--- a/framework/crawler-ui/src/main/webapp/editgroup.jsp
+++ /dev/null
@@ -1,291 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "GroupObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listgroups.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the group manager
-  IAuthorityGroupManager authGroupManager = AuthorityGroupManagerFactory.make(threadContext);
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editgroup.Name");
-
-  String groupName = null;
-  IAuthorityGroup group = (IAuthorityGroup)threadContext.get("GroupObject");
-  if (group == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    groupName = variableContext.getParameter("groupname");
-    // If the groupname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (groupName != null && groupName.length() > 0)
-    {
-      group = authGroupManager.load(groupName);
-    }
-  }
-
-  // Setup default fields
-  boolean isNew = true;
-  String description = "";
-
-  if (group != null)
-  {
-    // Set up values
-    isNew = group.getIsNew();
-    groupName = group.getName();
-    description = group.getDescription();
-  }
-  else
-    groupName = null;
-
-  if (groupName == null)
-    groupName = "";
-
-  // Initialize tabs array
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editgroup.Name"));
-%>
-
-<script type="text/javascript">
-  <!--
-<%
-  String heading = null;
-  if (description.length() > 0)
-  {
-    heading = Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.EditGroup") + " - " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    heading = Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.EditAGroup");
-  }
-%>
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editgroup.ApacheManifoldCFEditAuthorityGroup")%>',
-      '<%=heading%>',
-      'authorities'
-  );
-  // Use this method to repost the form and pick a new tab
-  function SelectTab(newtab)
-  {
-    if (checkForm())
-    {
-      document.editgroup.tabname.value=newtab;
-      $.ManifoldCF.submit(document.editgroup);
-    }
-  }
-
-  // Use this method to repost the form,
-  // and set the anchor request.
-  function postFormSetAnchor(anchorValue)
-  {
-    if (checkForm())
-    {
-      if (anchorValue != "")
-        document.group.action=document.editgroup.action + "#" + anchorValue;
-      $.ManifoldCF.submit(document.editgroup);
-    }
-  }
-
-  // Use this method to repost the form
-  function postForm()
-  {
-    if (checkForm())
-    {
-      $.ManifoldCF.submit(document.editgroup);
-    }
-  }
-
-  function Save()
-  {
-    if (checkForm())
-    {
-      // Can't submit until all required fields have been set.
-      // Some of these don't live on the current tab, so don't set
-      // focus.
-
-      // Check our part of the form, for save
-      if (editgroup.groupname.value == "")
-      {
-        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editgroup.AuthorityGroupMustHaveAName")%>");
-        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editgroup.Name")%>");
-        document.editgroup.groupname.focus();
-        return;
-      }
-      if (window.checkConfigForSave)
-      {
-        if (!checkConfigForSave())
-          return;
-      }
-      document.editgroup.op.value="Save";
-      $.ManifoldCF.submit(document.editgroup);
-    }
-  }
-
-  function Continue()
-  {
-    document.editgroup.op.value="Continue";
-    postForm();
-  }
-
-  function Cancel()
-  {
-    document.editgroup.op.value="Cancel";
-    $.ManifoldCF.submit(document.editgroup);
-  }
-
-  function checkForm()
-  {
-    return true;
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-
-      <form class="standardform" name="editgroup" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="group"/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-
-<%
-  int tabNum = 0;
-  int activeTab = 0;
-  while (tabNum < tabsArray.size())
-  {
-    String tab = (String)tabsArray.get(tabNum++);
-    if (tab.equals(tabName))
-    {
-%>
-            <li class="active"><a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                      alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editgroup.tab")%>'
-                      onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-    }
-  }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-
-<%
-
-  // Name tab
-  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editgroup.Name")))
-  {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.NameColon")%></label>
-<%
-    // If the group doesn't exist yet, we are allowed to change the name.
-    if (isNew)
-    {
-%>
-                <input type="text" size="32" name="groupname" class="form-control" placeholder="Name..." value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(groupName)%>'/>
-<%
-    }
-    else
-    {
-%>
-                <input type="text" size="32" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(groupName)%>'/>
-                <input type="hidden" name="groupname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(groupName)%>'/>
-<%
-    }
-%>
-              </div>
-              <div class="form-group"> 
-                <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.DescriptionColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" id="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-              </div>
-            </div>
-<%
-  }
-  else
-  {
-    // Hiddens for the Name tab
-%>
-            <input type="hidden" name="groupname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(groupName)%>'/>
-            <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-  }
-%>
-          </div>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="javascript:void(0);" onClick="javascript:Save()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editgroup.SaveThisAuthorityGroup")%>"
-                    class="btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editgroup.Save")%></a>
-            <a href="javascript:void(0);" onClick="javascript:Cancel()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editgroup.CancelAuthorityGroupEditing")%>"
-                    class="btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editgroup.Cancel")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listauthorities.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/editjob.jsp b/framework/crawler-ui/src/main/webapp/editjob.jsp
deleted file mode 100644
index ae94b52..0000000
--- a/framework/crawler-ui/src/main/webapp/editjob.jsp
+++ /dev/null
@@ -1,1975 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a job or beginning the process of editing an existing job, or it is called via redirection from execute.jsp, in which case
-// the job object being edited will be placed in the thread context under the name "JobObject".
-// It may also be called directly with a parameter of "origjobid", which implies that a copy operation should be started.
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_JOBS))
-  {
-    variableContext.setParameter("target","listjobs.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  // Get the job manager handle
-  IJobManager manager = JobManagerFactory.make(threadContext);
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-  INotificationConnectionManager notificationMgr = NotificationConnectionManagerFactory.make(threadContext);
-  INotificationConnection[] notificationList = notificationMgr.getAllConnections();
-  IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(threadContext);
-  IOutputConnection[] outputList = outputMgr.getAllConnections();
-  ITransformationConnectionManager transformationMgr = TransformationConnectionManagerFactory.make(threadContext);
-  ITransformationConnection[] transformationList = transformationMgr.getAllConnections();
-
-  IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-  IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-  INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-  ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-
-  // Figure out tab name and sequence number
-  String tabName = variableContext.getParameter("tabname");
-  String tabSequenceNumber = variableContext.getParameter("sequencenumber");
-  int tabSequenceInt;
-  if (tabName == null || tabName.length() == 0)
-  {
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name");
-    tabSequenceInt = -1;
-  }
-  else
-  {
-    if (tabSequenceNumber == null || tabSequenceNumber.length() == 0)
-      tabSequenceInt = -1;
-    else
-      tabSequenceInt = Integer.parseInt(tabSequenceNumber);
-  }
-
-  // Get a loaded job object, somehow.
-  String jobID = null;
-  IJobDescription job = (IJobDescription)threadContext.get("JobObject");
-  if (job == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    jobID = variableContext.getParameter("jobid");
-    String origJobID = variableContext.getParameter("origjobid");
-    if (origJobID == null || origJobID.length() == 0)
-      origJobID = jobID;
-    if (origJobID != null)
-      job = manager.load(new Long(origJobID));
-  }
-  else
-    jobID = job.getID().toString();
-
-  // Setup default fields
-  String connectionName = "";
-  String description = "";
-  int type = IJobDescription.TYPE_SPECIFIED;
-  Specification documentSpecification = new Specification();
-
-  // Pipeline data
-  String[] pipelineConnectionNames = new String[0];
-  String[] pipelineDescriptions = new String[0];
-  boolean[] pipelineIsOutputs = new boolean[0];
-  int[] pipelinePrerequisites = new int[0];
-  Specification[] pipelineSpecifications = new Specification[0];
-
-  String[] notificationConnectionNames = new String[0];
-  String[] notificationDescriptions = new String[0];
-  Specification[] notificationSpecifications = new Specification[0];
-
-  ArrayList scheduleRecords = new ArrayList();
-
-  EnumeratedValues dayOfWeek = null;
-  EnumeratedValues dayOfMonth = null;
-  EnumeratedValues monthOfYear = null;
-  EnumeratedValues year = null;
-  EnumeratedValues hourOfDay = null;
-  EnumeratedValues minutesOfHour = null;
-  // Duration in minutes
-  Long duration = null;
-  // RequestMinimum flag
-  boolean requestMinimum = false;
-
-  // Priority
-  int priority = 5;
-  // Minimum recrawl interval (Default: 1 day)
-  Long recrawlInterval = new Long(60L * 24L);
-  // Maximum recrawl interval (Default: none)
-  Long maxRecrawlInterval = null;
-  // Reseed interval (Default: 60 minutes)
-  Long reseedInterval = new Long(60L);
-  // Expiration interval (Default: never)
-  Long expirationInterval = null;
-  // Start method
-  int startMethod = IJobDescription.START_DISABLE;
-  // Hopcount mode
-  int hopcountMode = IJobDescription.HOPCOUNT_ACCURATE;
-  // Hop filters
-  Map hopFilterMap = new HashMap();
-
-  // If the job is not null, prepopulate everything with what comes from it.
-  if (job != null)
-  {
-    // Set up values
-    description = job.getDescription();
-    connectionName = job.getConnectionName();
-
-    pipelineConnectionNames = new String[job.countPipelineStages()];
-    pipelineDescriptions = new String[job.countPipelineStages()];
-    pipelineIsOutputs = new boolean[job.countPipelineStages()];
-    pipelinePrerequisites = new int[job.countPipelineStages()];
-    pipelineSpecifications = new Specification[job.countPipelineStages()];
-    for (int j = 0; j < job.countPipelineStages(); j++)
-    {
-      pipelineConnectionNames[j] = job.getPipelineStageConnectionName(j);
-      pipelineDescriptions[j] = job.getPipelineStageDescription(j);
-      pipelineIsOutputs[j] = job.getPipelineStageIsOutputConnection(j);
-      pipelinePrerequisites[j] = job.getPipelineStagePrerequisite(j);
-      pipelineSpecifications[j] = job.getPipelineStageSpecification(j);
-    }
-    notificationConnectionNames = new String[job.countNotifications()];
-    notificationDescriptions = new String[job.countNotifications()];
-    notificationSpecifications = new Specification[job.countNotifications()];
-    for (int j = 0; j < job.countNotifications(); j++)
-    {
-      notificationConnectionNames[j] = job.getNotificationConnectionName(j);
-      notificationDescriptions[j] = job.getNotificationDescription(j);
-      notificationSpecifications[j] = job.getNotificationSpecification(j);
-    }
-
-    type = job.getType();
-    startMethod = job.getStartMethod();
-    hopcountMode = job.getHopcountMode();
-    documentSpecification = job.getSpecification();
-    // Fill in schedule records from job
-    for (int j = 0; j < job.getScheduleRecordCount(); j++)
-    {
-      scheduleRecords.add(job.getScheduleRecord(j));
-    }
-
-    priority = job.getPriority();
-    Long value = job.getInterval();
-    recrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
-    value = job.getMaxInterval();
-    maxRecrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
-    value = job.getReseedInterval();
-    reseedInterval = (value==null)?null:new Long(value.longValue()/60000L);
-    value = job.getExpiration();
-    expirationInterval = (value==null)?null:new Long(value.longValue()/60000L);
-    hopFilterMap = job.getHopCountFilters();
-  }
-
-
-  // This form reposts to itself.  It basically only allows the connection to be picked once; once done, the repost occurs
-  // and cannot be undone.
-  // Therefore, there are three possible entry conditions:
-  // 1) no jobid w/no connection name, which indicates a brand-new job without a chosen connection
-  // 2) no jobid w/a connection name, which indicates that the connection at least has been chosen
-  // 3) a jobid and a connection name, which indicates that we are editing an existing connection.
-  // There are similar combinations for output connections.
-
-  int model = IRepositoryConnector.MODEL_ADD_CHANGE_DELETE;
-  String[] relationshipTypes = null;
-  List<String> tabsArray = new ArrayList<String>();
-  List<Integer> sequenceArray = new ArrayList<Integer>();
-
-  IRepositoryConnection connection = null;
-  if (connectionName.length() > 0)
-  {
-    connection = connMgr.load(connectionName);
-    model = RepositoryConnectorFactory.getConnectorModel(threadContext,connection.getClassName());
-    relationshipTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-  }
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name"));
-  sequenceArray.add(null);
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection"));
-  sequenceArray.add(null);
-  if (connectionName.length() > 0)
-  {
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Scheduling"));
-    sequenceArray.add(null);
-    if (relationshipTypes != null && relationshipTypes.length > 0)
-    {
-      tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters"));
-      sequenceArray.add(null);
-    }
-  }
-
-  // Get the names of the various Javascript methods we'll need to call
-  String checkMethod = "checkSpecification";
-  String saveCheckMethod = "checkSpecificationForSave";
-  String[] pipelineCheckMethods = new String[pipelineConnectionNames.length];
-  String[] pipelineCheckForSaveMethods = new String[pipelineConnectionNames.length];
-  String[] notificationCheckMethods = new String[notificationConnectionNames.length];
-  String[] notificationCheckForSaveMethods = new String[notificationConnectionNames.length];
-
-  for (int j = 0; j < pipelineConnectionNames.length; j++)
-  {
-    pipelineCheckMethods[j] = "unknown";
-    pipelineCheckForSaveMethods[j] = "unknown";
-  }
-  for (int j = 0; j < notificationConnectionNames.length; j++)
-  {
-    notificationCheckMethods[j] = "unknown";
-    notificationCheckForSaveMethods[j] = "unknown";
-  }
-
-  if (connection != null)
-  {
-    IRepositoryConnector connector = RepositoryConnectorFactory.getConnectorNoCheck(connection.getClassName());
-    if (connector != null)
-    {
-      checkMethod = connector.getFormCheckJavascriptMethodName(0);
-      saveCheckMethod = connector.getFormPresaveCheckJavascriptMethodName(0);
-    }
-  }
-
-  for (int j = 0; j < pipelineConnectionNames.length; j++)
-  {
-    if (pipelineIsOutputs[j])
-    {
-      IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
-      if (outputConnection != null)
-      {
-        IOutputConnector outputConnector = OutputConnectorFactory.getConnectorNoCheck(outputConnection.getClassName());
-        if (outputConnector != null)
-        {
-          pipelineCheckMethods[j] = outputConnector.getFormCheckJavascriptMethodName(1+j);
-          pipelineCheckForSaveMethods[j] = outputConnector.getFormPresaveCheckJavascriptMethodName(1+j);
-        }
-      }
-    }
-    else
-    {
-      ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
-      if (transformationConnection != null)
-      {
-        ITransformationConnector transformationConnector = TransformationConnectorFactory.getConnectorNoCheck(transformationConnection.getClassName());
-        if (transformationConnector != null)
-        {
-          pipelineCheckMethods[j] = transformationConnector.getFormCheckJavascriptMethodName(1+j);
-          pipelineCheckForSaveMethods[j] = transformationConnector.getFormPresaveCheckJavascriptMethodName(1+j);
-        }
-      }
-    }
-  }
-
-  for (int j = 0; j < notificationConnectionNames.length; j++)
-  {
-    INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
-    if (notificationConnection != null)
-    {
-      INotificationConnector notificationConnector = NotificationConnectorFactory.getConnectorNoCheck(notificationConnection.getClassName());
-      if (notificationConnector != null)
-      {
-        notificationCheckMethods[j] = notificationConnector.getFormCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
-        notificationCheckForSaveMethods[j] = notificationConnector.getFormPresaveCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
-      }
-
-    }
-  }
-%>
-
-<script type="text/javascript">
-  <!--
-<%
-  String title = null;
-  if (description.length() > 0)
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditJob") + " - " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob");
-  }
-%>
-    $.ManifoldCF.setTitle(
-        '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.ApacheManifoldCFEditJob")%>',
-        '<%=title%>',
-        'jobs'
-    );
-
-// Use this method to repost the form and pick a new tab
-function SelectTab(newtab)
-{
-  if (checkForm())
-  {
-    document.editjob.tabname.value = newtab;
-    document.editjob.sequencenumber.value = "";
-    $.ManifoldCF.submit(document.editjob);
-  }
-}
-
-// Use this method to repost the form and pick a new tab
-function SelectSequencedTab(newtab, sequencenumber)
-{
-  if (checkForm())
-  {
-    document.editjob.tabname.value = newtab;
-    document.editjob.sequencenumber.value = sequencenumber;
-    $.ManifoldCF.submit(document.editjob);
-  }
-}
-
-// Use this method to repost the form,
-// and set the anchor request.
-function postFormSetAnchor(anchorValue)
-{
-  if (checkForm())
-  {
-    if (anchorValue != "")
-      document.editjob.action = document.editjob.action + "#" + anchorValue;
-    $.ManifoldCF.submit(document.editjob);
-  }
-}
-
-// Use this method to repost the form
-function postFormNew()
-{
-  if (checkForm())
-  {
-    $.ManifoldCF.submit(document.editjob);
-  }
-}
-
-// Deprecated
-function postForm(schedCount)
-{
-  if (checkForm())
-  {
-    $.ManifoldCF.submit(document.editjob);
-  }
-}
-
-function Save()
-{
-  if (checkForm())
-  {
-    // Can't submit until all required fields have been set.
-    // Some of these don't live on the current tab, so don't set
-    // focus.
-
-    // Check our part of the form, for save
-    if (editjob.description.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.JobMustHaveAName")%>");
-      SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.Name")%>");
-      document.editjob.description.focus();
-      return;
-    }
-<%
-  for (int j = 0; j < pipelineCheckForSaveMethods.length; j++)
-  {
-%>
-    if (window.<%=pipelineCheckForSaveMethods[j]%>)
-    {
-      if (<%=pipelineCheckForSaveMethods[j]%>() == false)
-        return;
-    }
-<%
-  }
-  for (int j = 0; j < notificationCheckForSaveMethods.length; j++)
-  {
-%>
-    if (window.<%=notificationCheckForSaveMethods[j]%>)
-    {
-      if (<%=notificationCheckForSaveMethods[j]%>() == false)
-        return;
-    }
-<%
-  }
-%>
-    if (window.<%=saveCheckMethod%>)
-    {
-      if (<%=saveCheckMethod%>() == false)
-        return;
-    }
-    document.editjob.op.value="Save";
-    $.ManifoldCF.submit(document.editjob);
-  }
-}
-
-function Cancel()
-{
-  document.editjob.op.value="Cancel";
-  $.ManifoldCF.submit(document.editjob);
-}
-
-function Continue()
-{
-  document.editjob.op.value="Continue";
-  postFormNew();
-}
-
-function InsertPipelineStageTransformation(n)
-{
-  if (editjob.transformation_connectionname.value == "")
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectATransformationStageConnectionName")%>");
-    editjob.transformation_connectionname.focus();
-    return;
-  }
-  eval("document.editjob.pipeline_"+n+"_op.value = 'InsertTransformation'");
-  postFormSetAnchor("pipeline_"+(n+1)+"_tag");
-}
-
-function InsertPipelineStageOutput(n)
-{
-  if (editjob.output_connectionname.value == "")
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectAnOutputStageConnectionName")%>");
-    editjob.output_connectionname.focus();
-    return;
-  }
-  eval("document.editjob.pipeline_"+n+"_op.value = 'InsertOutput'");
-  postFormSetAnchor("pipeline_"+(n+1)+"_tag");
-}
-
-function AppendPipelineStageOutput()
-{
-  if (editjob.output_connectionname.value == "")
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectAnOutputStageConnectionName")%>");
-    editjob.output_connectionname.focus();
-    return;
-  }
-  document.editjob.output_op.value="Add";
-  postFormSetAnchor("output_tag");
-}
-
-function DeletePipelineStage(n)
-{
-  eval("document.editjob.pipeline_"+n+"_op.value = 'Delete'");
-  if (n == 0)
-    postFormSetAnchor("pipeline_tag");
-  else
-    postFormSetAnchor("pipeline_"+(n-1)+"_tag");
-}
-
-function AppendNotification()
-{
-  if (editjob.notification_connectionname.value == "")
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectANotificationConnectionName")%>");
-    editjob.notification_connectionname.focus();
-    return;
-  }
-  document.editjob.notification_op.value="Add";
-  postFormSetAnchor("notification_tag");
-}
-
-function DeleteNotification(n)
-{
-  eval("document.editjob.notification_"+n+"_op.value = 'Delete'");
-  if (n == 0)
-    postFormSetAnchor("notification_tag");
-  else
-    postFormSetAnchor("notification_"+(n-1)+"_tag");
-}
-
-function AddScheduledTime()
-{
-  if (editjob.duration.value != "" && !isInteger(editjob.duration.value))
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.DurationMustBeAValidInteger")%>");
-    editjob.duration.focus();
-    return;
-  }
-  document.editjob.recordop.value="Add Scheduled Time";
-  postFormSetAnchor("add_schedule");
-}
-
-function RemoveSchedule(n)
-{
-  eval("document.editjob.recordop"+n+".value = 'Remove Schedule'");
-  if (n == 0)
-    postFormSetAnchor("add_schedule");
-  else
-    postFormSetAnchor("remove_schedule_"+(n-1));
-}
-
-function checkForm()
-{
-  if (!checkRecrawl())
-    return false;
-  if (!checkMaxRecrawl())
-    return false;
-  if (!checkRecrawlConsistent())
-    return false;
-  if (!checkReseed())
-    return false;
-  if (!checkExpiration())
-    return false;
-  if (!checkSchedule())
-    return false;
-<%
-  for (int j = 0; j < pipelineCheckMethods.length; j++)
-  {
-%>
-  if (window.<%=pipelineCheckMethods[j]%>)
-  {
-    if (<%=pipelineCheckMethods[j]%>() == false)
-      return false;
-  }
-<%
-  }
-  for (int j = 0; j < notificationCheckMethods.length; j++)
-  {
-%>
-  if (window.<%=notificationCheckMethods[j]%>)
-  {
-    if (<%=notificationCheckMethods[j]%>() == false)
-      return false;
-  }
-<%
-  }
-%>
-  // Check the connector part
-  if (window.<%=checkMethod%>)
-  {
-    if (<%=checkMethod%>() == false)
-      return false;
-  }
-  return true;
-}
-
-function checkSchedule()
-{
-  var i = 0;
-  var schedCount = <%=Integer.toString(scheduleRecords.size())%>;
-  while (i < schedCount)
-  {
-    var propertyname = "duration" + i;
-    if (eval("editjob."+propertyname+".value") != "" && !isInteger(eval("editjob."+propertyname+".value")))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.DurationMustBeAValidInteger")%>");
-      eval("editjob."+propertyname+".focus()");
-      return false;
-    }
-    i = i+1;
-  }
-  return true;
-}
-
-function checkRecrawl()
-{
-  if (editjob.recrawlinterval.value != "" && !isInteger(editjob.recrawlinterval.value))
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.RecrawlIntervalMustBeAValidIntegerOrNull")%>");
-    editjob.recrawlinterval.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkMaxRecrawl()
-{
-  if (editjob.maxrecrawlinterval.value != "" && !isInteger(editjob.maxrecrawlinterval.value))
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull")%>");
-    editjob.maxrecrawlinterval.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkRecrawlConsistent()
-{
-  if (editjob.maxrecrawlinterval.value != "" && editjob.recrawlinterval.value != "" && parseInt(editjob.maxrecrawlinterval.value) < parseInt(editjob.recrawlinterval.value))
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval")%>");
-    editjob.maxrecrawlinterval.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkReseed()
-{
-  if (editjob.reseedinterval.value != "" && !isInteger(editjob.reseedinterval.value))
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.ReseedIntervalMustBeAValidIntegerOrNull")%>");
-    editjob.reseedinterval.focus();
-    return false;
-  }
-  return true;
-}
-
-function checkExpiration()
-{
-  if (editjob.expirationinterval.value != "" && !isInteger(editjob.expirationinterval.value))
-  {
-    alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.ExpirationIntervalMustBeAValidIntegerOrNull")%>");
-    editjob.expirationinterval.focus();
-    return false;
-  }
-  return true;
-}
-
-function isInteger(value)
-{
-  var anum=/(^\d+$)/;
-  return anum.test(value);
-}
-
-function isRegularExpression(value)
-{
-  try
-  {
-    var foo = "teststring";
-    foo.search(value.replace(/\(\?i\)/,""));
-    return true;
-  }
-  catch (e)
-  {
-    return false;
-  }
-}
-
-  //-->
-</script>
-<%
-  if (connection != null)
-  {
-    IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
-    if (repositoryConnector != null)
-    {
-      try
-      {
-        repositoryConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),documentSpecification,0,tabsArray);
-      }
-      finally
-      {
-        repositoryConnectorPool.release(connection,repositoryConnector);
-      }
-    }
-    Integer repositoryConnectionSequenceNumber = new Integer(0);
-    while (sequenceArray.size() < tabsArray.size())
-    {
-      sequenceArray.add(repositoryConnectionSequenceNumber);
-    }
-  }
-%>
-
-<%
-  for (int j = 0; j < pipelineConnectionNames.length; j++)
-  {
-    if (pipelineIsOutputs[j])
-    {
-      IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
-      if (outputConnection != null)
-      {
-        IOutputConnector outputConnector = outputConnectorPool.grab(outputConnection);
-        if (outputConnector != null)
-        {
-          try
-          {
-            outputConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
-          }
-          finally
-          {
-            outputConnectorPool.release(outputConnection,outputConnector);
-          }
-        }
-      }
-    }
-    else
-    {
-      ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
-      if (transformationConnection != null)
-      {
-        ITransformationConnector transformationConnector = transformationConnectorPool.grab(transformationConnection);
-        if (transformationConnector != null)
-        {
-          try
-          {
-            transformationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
-          }
-          finally
-          {
-            transformationConnectorPool.release(transformationConnection,transformationConnector);
-          }
-        }
-      }
-    }
-    Integer connectionSequenceNumber = new Integer(1+j);
-    while (sequenceArray.size() < tabsArray.size())
-    {
-      sequenceArray.add(connectionSequenceNumber);
-    }
-  }
-
-%>
-
-<%
-  for (int j = 0; j < notificationConnectionNames.length; j++)
-  {
-    INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
-    if (notificationConnection != null)
-    {
-      INotificationConnector notificationConnector = notificationConnectorPool.grab(notificationConnection);
-      if (notificationConnector != null)
-      {
-        try
-        {
-          notificationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),notificationSpecifications[j],1+pipelineConnectionNames.length+j,tabsArray);
-        }
-        finally
-        {
-          notificationConnectorPool.release(notificationConnection,notificationConnector);
-        }
-      }
-    }
-    Integer connectionSequenceNumber = new Integer(1+pipelineConnectionNames.length+j);
-    while (sequenceArray.size() < tabsArray.size())
-    {
-      sequenceArray.add(connectionSequenceNumber);
-    }
-  }
-%>
-
-<div class="row">
-  <div class="col-md-12">
-<%
-  if (connList.length == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoRepositoryConnectionsDefinedCreateOneFirst")%></p>
-    </div>
-<%
-  }
-  else if (outputList.length == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoOutputConnectionsDefinedCreateOneFirst")%></p>
-    </div>
-<%
-  }
-  else
-  {
-%>
-    <div class="box box-primary">
-      <form class="standardform" name="editjob" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="job"/>
-        <input type="hidden" name="index" value=""/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="sequencenumber" value='<%=((tabSequenceInt==-1)?"":Integer.toString(tabSequenceInt))%>'/>
-<%
-  if (jobID != null)
-  {
-%>
-        <input type="hidden" name="jobid" value='<%=jobID%>'/>
-<%
-  }
-%>
-        <div class="box-header">
-          <div class="tab-group">
-<%
-  int activeTab = 0;
-  int lastTabSeq = -1;
-  for (int tabNum = 0; tabNum < tabsArray.size(); tabNum++)
-  {
-    String tab = tabsArray.get(tabNum);
-    Integer sequenceNumber = sequenceArray.get(tabNum);
-    int sequenceNumberInt = (sequenceNumber == null)?-1:sequenceNumber.intValue();
-    String activeClass = "";
-    if(tab.equals(tabName))
-    {
-      activeClass = "active";
-    }
-    else
-    {
-      activeClass = "";
-    }
-
-    if(sequenceNumber == null)
-    {
-%>
-          <div class="btn-group" sequenceNumber="<%= (sequenceNumberInt + 1) %>">
-            <a class="btn btn-md <%= activeClass %>" href="#tab_<%=tabNum%>" 
-                    alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.tab")%>'
-<%
-      if(activeClass.length() == 0)
-      {
-%>
-                    onclick='<%="javascript:SelectSequencedTab(\""+tab+"\",\""+((sequenceNumber==null)?"":sequenceNumber.toString())+"\");return false;"%>'
-<%
-      }
-%>                    
-            ><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-          </div>
-<%
-    }
-    else
-    {
-      int nextSeqNum = -1;
-      if(tabNum < tabsArray.size()-1)
-      {
-        nextSeqNum = sequenceArray.get(tabNum + 1);                    
-      }
-      else
-      {
-        nextSeqNum = -1;
-      }
-    
-      if(lastTabSeq != sequenceNumberInt)
-      {
-%>
-          <div class="btn-group" sequenceNumber="<%= (sequenceNumberInt + 1) %>">                        
-<% 
-      }
-%>                    
-            <a class="btn btn-md <%= activeClass %>" href="#tab_<%=tabNum%>" 
-                    alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.tab")%>'
-<%
-      if(activeClass.length() == 0)
-      {
-%>
-                    onclick='<%="javascript:SelectSequencedTab(\""+tab+"\",\""+((sequenceNumber==null)?"":sequenceNumber.toString())+"\");return false;"%>'
-<%
-      }
-%>
-            ><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-<%
-      if(nextSeqNum != sequenceNumberInt)
-      {
-%>
-          </div>
-<%
-      }
-      lastTabSeq = sequenceNumberInt;
-    }     
-  }
-  // Missing remainder tab ON PURPOSE -- comes from rowspan=2 tab above
-%>
-          </div>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-
-            <input type="hidden" name="schedulerecords" value='<%=Integer.toString(scheduleRecords.size())%>'/>
-<%
-  // The NAME tab
-  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name")) && tabSequenceInt == -1)
-  {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NameColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-              </div>
-            </div>
-<%
-  }
-  else
-  {
-%>
-            <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-  }
-
-  // Hop Filters tab
-  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters")) && tabSequenceInt == -1)
-  {
-    if (relationshipTypes != null)
-    {
-%>
-            <table class="displaytable table table-bordered">
-              <tr>
-                <td class="separator" colspan="4"><input type="hidden" name="hopfilters" value="true"/><hr/></td>
-              </tr>
-<%
-      int i = 0;
-      while (i < relationshipTypes.length)
-      {
-        String relationshipType = relationshipTypes[i++];
-        String mapField = "";
-        Long mapValue = (Long)hopFilterMap.get(relationshipType);
-        if (mapValue != null)
-          mapField = mapValue.toString();
-%>
-              <tr>
-                <td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MaximumHopCountForType")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(relationshipType)%>'<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.colon")%></nobr></td>
-                <td class="value" colspan="3">
-                  <input name='<%="hopmax_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(relationshipType)%>' type="text" size="5" value='<%=mapField%>'/>
-                </td>
-              </tr>
-<%
-      }
-%>
-
-              <tr>
-                <td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.HopCountModeColon")%></nobr></td>
-                <td class="value" colspan="3">
-                  <nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_ACCURATE)%>' <%=((hopcountMode == IJobDescription.HOPCOUNT_ACCURATE) ? "checked=\"true\"" : "")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.DeleteUnreachableDocuments")%></input></nobr><br/>
-                  <nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_NODELETE)%>' <%=((hopcountMode == IJobDescription.HOPCOUNT_NODELETE) ? "checked=\"true\"" : "")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.KeepUnreachableDocumentsForNow")%></input></nobr><br/>
-                  <nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_NEVERDELETE)%>' <%=((hopcountMode == IJobDescription.HOPCOUNT_NEVERDELETE) ? "checked=\"true\"" : "")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.KeepUnreachableDocumentsForever")%></input></nobr><br/>
-                </td>
-              </tr>
-            </table>
-<%
-    }
-  }
-  else
-  {
-    if (relationshipTypes != null)
-    {
-%>
-            <input type="hidden" name="hopfilters" value="true"/>
-<%
-      int i = 0;
-      while (i < relationshipTypes.length)
-      {
-        String relationshipType = relationshipTypes[i++];
-        String mapField = "";
-        Long mapValue = (Long)hopFilterMap.get(relationshipType);
-        if (mapValue != null)
-          mapField = mapValue.toString();
-%>
-            <input name='<%="hopmax_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(relationshipType)%>' type="hidden" value='<%=mapField%>'/>
-            <input name="hopcountmode" type="hidden" value='<%=Integer.toString(hopcountMode)%>'/>
-<%
-      }
-    }
-  }
-
-  // Connection tab
-  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection")) && tabSequenceInt == -1)
-  {
-
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.PipelineColon")%>
-                </label>
-                <table class="table table-bordered">
-                  <tr>
-                    <th><input name="pipeline_count" type="hidden" value="<%=pipelineConnectionNames.length%>"/></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageNumber")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageType")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StagePrecedent")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageDescription")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageConnectionName")%></nobr></th>
-                  </tr>
-                  <tr>
-                    <td></td>
-                    <td>1.</td>
-                    <td><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Repository")%></td>
-                    <td></td>
-                    <td></td>
-                    <td>
-<%
-    if (connectionName.length() == 0)
-    {
-%>
-                      <select name="connectionname" class="form-control">
-                        <option <%="".equals(connectionName)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NoneSelected")%> --</option>
-<%
-      for (IRepositoryConnection conn : connList)
-      {
-%>
-                        <option <%=conn.getName().equals(connectionName)?"selected=\"selected\"":""%>value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
-<%
-      }
-%>
-                      </select>
-<%
-    }
-    else
-    {
-%>
-                      <input type="hidden" name="connectionname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%>
-<%
-    }
-%>
-                    </td>
-                  </tr>
-<%
-    // A map of stage number to reference count
-    Map<Integer,Integer> referenceCounts = new HashMap<Integer,Integer>();
-    // A list of precedents to pick from, displayed at the end
-    List<Integer> precedents = new ArrayList<Integer>();
-    // Repository connection is always allowed
-    precedents.add(new Integer(-1));
-    Set<String> alreadyPresent = new HashSet<String>();
-    for (int j = 0; j < pipelineConnectionNames.length; j++)
-    {
-      if (pipelineIsOutputs[j])
-        alreadyPresent.add(pipelineConnectionNames[j]);
-      else
-        precedents.add(new Integer(j));
-      if (pipelinePrerequisites[j] != -1)
-      {
-        Integer thisOne = new Integer(pipelinePrerequisites[j]);
-        Integer x = referenceCounts.get(thisOne);
-        if (x == null)
-          referenceCounts.put(thisOne,new Integer(1));
-        else
-          referenceCounts.put(thisOne,new Integer(x.intValue() + 1));
-      }
-    }
-    boolean anyTransformationButtons = false;
-    for (int j = 0; j < pipelineConnectionNames.length; j++)
-    {
-      String pipelineConnectionName = pipelineConnectionNames[j];
-      String pipelineDescription = pipelineDescriptions[j];
-      if (pipelineDescription == null)
-        pipelineDescription = "";
-      String pipelineType = pipelineIsOutputs[j]?Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Output"):Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Transformation");
-%>
-                  <tr>
-                    <td>
-                      <input name="pipeline_<%=j%>_op" type="hidden" value="Continue"/>
-                      <a name="pipeline_<%=j%>_tag"/>
-
-                      <div class="btn-group-vertical">
-<%
-      // We don't want to leave orphans around.  If the pipeline stage is an output, we can delete it ONLY if:
-      // -- the precedent is -1, OR
-      // -- the precedent is not -1 BUT more than one stage refers to the precedent
-      if (!pipelineIsOutputs[j] || pipelinePrerequisites[j] == -1 || referenceCounts.get(new Integer(pipelinePrerequisites[j])).intValue() > 1)
-      {
-%>
-                        <input type="button" class="btn btn-sm btn-danger" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Delete")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Deletepipelinestage")%>' onclick="javascript:DeletePipelineStage(<%=j%>);"/>
-<%
-      }
-      if (transformationList.length > 0)
-      {
-        anyTransformationButtons = true;
-%>
-                        <input type="button" class="btn btn-sm btn-primary" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.InsertTransformationBefore")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Insertnewtransformationhere")%>' onclick="javascript:InsertPipelineStageTransformation(<%=j%>);"/>
-<%
-      }
-      if (outputList.length != alreadyPresent.size())
-      {
-%>
-                        <input type="button" class="btn btn-sm btn-primary"
-                               value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.InsertOutputBefore")%>"
-                               alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Insertnewoutputhere")%>'
-                               onclick="javascript:InsertPipelineStageOutput(<%=j%>);"/>
-<%
-      }
-%>
-                      </div>
-                    </td>
-                    <td><%=(j+2)%>.</td>
-                    <td><%=pipelineType%>
-                      <input name="pipeline_<%=j%>_isoutput" type="hidden" value='<%=pipelineIsOutputs[j]?"true":"false"%>'/>
-                    </td>
-                    <td><%=(pipelinePrerequisites[j] + 2)%>.
-                      <input name="pipeline_<%=j%>_precedent" type="hidden" value="<%=pipelinePrerequisites[j]%>"/>
-                    </td>
-                    <td>
-                      <input name="pipeline_<%=j%>_description" type="text" size="30" class="from-control" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pipelineDescription)%>"/>
-                    </td>
-                    <td>
-                      <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pipelineConnectionName)%></nobr>
-                      <input name="pipeline_<%=j%>_connectionname" type="hidden" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pipelineConnectionName)%>"/>
-                    </td>
-                  </tr>
-<%
-    }
-    if (anyTransformationButtons)
-    {
-%>
-                  <tr class="formrow">
-                    <td><a name="transformation_tag"/></td>
-                    <td></td>
-                    <td><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Transformation")%></td>
-                    <td></td>
-                    <td><input name="transformation_description" type="text" class="form-control" size="30" value=""/></td>
-                    <td>
-                      <select name="transformation_connectionname" class="form-control">
-                        <option selected="selected" value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NoneSelected")%> --</option>
-<%
-      for (ITransformationConnection conn : transformationList)
-      {
-%>
-                        <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
-<%
-      }
-%>
-                      </select>
-                    </td>
-                  </tr>
-<%
-    }
-    if (outputList.length != alreadyPresent.size())
-    {
-%>
-                  <tr class="formrow">
-                    <td>
-                      <a name="output_tag"/>
-                      <input type="button" class="btn btn-primary btn-sm"
-                             value='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddOutput")%>'
-                             alt='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddAnOutput")%>'
-                             onclick="javascript:AppendPipelineStageOutput();"/>
-                      <input name="output_op" type="hidden" value="Continue"/>
-                    </td>
-                    <td></td>
-                    <td><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Output")%></td>
-                    <td>
-                      <select name="output_precedent" class="form-control">
-<%
-      for (Integer pre : precedents)
-      {
-%>
-                        <option value="<%=pre%>"><%=(pre.intValue()+2)%></option>
-<%
-      }
-%>
-                      </select>
-                    </td>
-                    <td><input name="output_description" type="text" class="form-control" size="30" value=""/></td>
-                    <td>
-                      <select name="output_connectionname" class="form-control">
-                        <option selected="selected" value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NoneSelected")%> --</option>
-<%
-      for (IOutputConnection conn : outputList)
-      {
-        if (!alreadyPresent.contains(conn.getName()))
-        {
-%>
-                        <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
-<%
-        }
-      }
-%>
-                      </select>
-                    </td>
-                  </tr>
-<%
-    }
-%>
-                </table>
-              </div>
-
-<%
-    alreadyPresent = new HashSet<String>();
-    for (int j = 0; j < notificationConnectionNames.length; j++)
-    {
-      alreadyPresent.add(notificationConnectionNames[j]);
-    }
-    if (notificationList.length > 0)
-    {
-%>
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NotificationsColon")%></label>
-                <table class="table table-bordered">
-                  <tr>
-                    <th><input name="notification_count" type="hidden" value="<%=notificationConnectionNames.length%>"/></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.StageNumber")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NotificationDescription")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NotificationConnectionName")%></nobr></th>
-                  </tr>
-<%
-      for (int j = 0; j < notificationConnectionNames.length; j++)
-      {
-        String notificationConnectionName = notificationConnectionNames[j];
-        String notificationDescription = notificationDescriptions[j];
-        if (notificationDescription == null)
-          notificationDescription = "";
-%>
-                  <tr>
-                    <td>
-                      <input name="notification_<%=j%>_op" type="hidden" value="Continue"/>
-                      <a name="notification_<%=j%>_tag"/>
-                      <input type="button" class="btn btn-danger btn-sm"
-                             value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Delete")%>"
-                             alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Deletenotification")%>'
-                             onclick="javascript:DeleteNotification(<%=j%>);"/>
-                    </td>
-                    <td><%=(j+pipelineConnectionNames.length+2)%>.</td>
-                    <td>
-                      <input name="notification_<%=j%>_description" type="text" size="30"
-                             class="form-control"
-                             value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(notificationDescription)%>"/>
-                    </td>
-                    <td>
-                      <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(notificationConnectionName)%></nobr>
-                      <input name="notification_<%=j%>_connectionname" type="hidden" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(notificationConnectionName)%>"/>
-                    </td>
-                  </tr>
-<%
-      }
-      if (notificationList.length != alreadyPresent.size())
-      {
-%>
-                  <tr class="formrow">
-                    <td>
-                      <a name="notification_tag"/>
-                      <input type="button" class="btn btn-primary btn-sm"
-                             value='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddNotification")%>'
-                             alt='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddANotification")%>'
-                             onclick="javascript:AppendNotification();"/>
-                      <input name="notification_op" type="hidden" value="Continue"/>
-                    </td>
-                    <td></td>
-                    <td><input name="notification_description" type="text" size="30" value="" class="form-control"/></td>
-                    <td>
-                      <select name="notification_connectionname" class="form-control">
-                        <option selected="selected" value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.NoneSelected")%> --</option>
-<%
-        for (INotificationConnection conn : notificationList)
-        {
-          if (!alreadyPresent.contains(conn.getName()))
-          {
-%>
-                        <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
-<%
-          }
-        }
-%>
-                      </select>
-                    </td>
-                  </tr>
-<%
-      }
-%>
-                </table>
-              </div>
-<%
-    }
-%>
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.PriorityColon")%></label>
-                <select name="priority" class="form-control">
-                  <option value="1" <%=(priority==1)?"selected=\"selected\"":""%>>1 <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Highest")%></option>
-                  <option value="2" <%=(priority==2)?"selected=\"selected\"":""%>>2</option>
-                  <option value="3" <%=(priority==3)?"selected=\"selected\"":""%>>3</option>
-                  <option value="4" <%=(priority==4)?"selected=\"selected\"":""%>>4</option>
-                  <option value="5" <%=(priority==5)?"selected=\"selected\"":""%>>5</option>
-                  <option value="6" <%=(priority==6)?"selected=\"selected\"":""%>>6</option>
-                  <option value="7" <%=(priority==7)?"selected=\"selected\"":""%>>7</option>
-                  <option value="8" <%=(priority==8)?"selected=\"selected\"":""%>>8</option>
-                  <option value="9" <%=(priority==9)?"selected=\"selected\"":""%>>9</option>
-                  <option value="10" <%=(priority==10)?"selected=\"selected\"":""%>>10 <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Lowest")%></option>
-                </select>
-              </div>
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StartMethodColon")%></label>
-                <select name="startmethod" class="form-control">
-                  <option value='<%=IJobDescription.START_WINDOWBEGIN%>' <%=(startMethod==IJobDescription.START_WINDOWBEGIN)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StartWhenScheduleWindowStarts")%></option>
-                  <option value='<%=IJobDescription.START_WINDOWINSIDE%>' <%=(startMethod==IJobDescription.START_WINDOWINSIDE)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StartEvenInsideAScheduleWindow")%></option>
-                  <option value='<%=IJobDescription.START_DISABLE%>' <%=(startMethod==IJobDescription.START_DISABLE)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.DontAutomaticallyStartThisJob")%></option>
-                </select>
-              </div>
-            </div>
-<%
-  }
-  else
-  {
-%>
-            <input type="hidden" name="connectionname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-            <input type="hidden" name="pipeline_count" value="<%=pipelineConnectionNames.length%>"/>
-            <input type="hidden" name="notification_count" value="<%=notificationConnectionNames.length%>"/>
-<%
-    for (int j = 0; j < pipelineConnectionNames.length; j++)
-    {
-      String pipelineConnectionName = pipelineConnectionNames[j];
-      String pipelineDescription = pipelineDescriptions[j];
-      if (pipelineDescription == null)
-        pipelineDescription = "";
-%>
-            <input name="pipeline_<%=j%>_isoutput" type="hidden" value='<%=pipelineIsOutputs[j]?"true":"false"%>'/>
-            <input name="pipeline_<%=j%>_precedent" type="hidden" value="<%=pipelinePrerequisites[j]%>"/>
-            <input type="hidden" name="pipeline_<%=j%>_connectionname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pipelineConnectionName)%>"/>
-            <input type="hidden" name="pipeline_<%=j%>_description" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pipelineDescription)%>"/>
-<%
-    }
-    for (int j = 0; j < notificationConnectionNames.length; j++)
-    {
-      String notificationConnectionName = notificationConnectionNames[j];
-      String notificationDescription = notificationDescriptions[j];
-      if (notificationDescription == null)
-        notificationDescription = "";
-%>
-            <input type="hidden" name="notification_<%=j%>_connectionname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(notificationConnectionName)%>"/>
-            <input type="hidden" name="notification_<%=j%>_description" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(notificationDescription)%>"/>
-<%
-    }
-
-%>
-            <input type="hidden" name="priority" value='<%=priority%>'/>
-            <input type="hidden" name="startmethod" value='<%=startMethod%>'/>
-<%
-  }
-
-  // Scheduling tab
-  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Scheduling")) && tabSequenceInt == -1)
-  {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-<%
-    if (model != -1 && model != IRepositoryConnector.MODEL_ADD_CHANGE_DELETE && model != IRepositoryConnector.MODEL_CHAINED_ADD_CHANGE_DELETE)
-    {
-%>
-              <table class="table table-bordered">
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ScheduleTypeColon")%></nobr></th>
-                  <td colspan="3">
-                    <select name="scheduletype" class="form-control">
-                      <option value='<%=IJobDescription.TYPE_CONTINUOUS%>' <%=(type==IJobDescription.TYPE_CONTINUOUS)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.RescanDocumentsDynamically")%></option>
-                      <option value='<%=IJobDescription.TYPE_SPECIFIED%>' <%=(type==IJobDescription.TYPE_SPECIFIED)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ScanEveryDocumentOnce")%></option>
-                    </select>
-                  </td>
-                </tr>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.RecrawlIntervalIfContinuousColon")%></nobr></th>
-                  <td colspan="3">
-                    <nobr><input type="text" size="5" name="recrawlinterval" class="form-control" value='<%=((recrawlInterval==null)?"":recrawlInterval.toString())%>'/> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutesBlankInfinity")%></nobr>
-                  </td>
-                </tr>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalIfContinuousColon")%></nobr></th>
-                  <td colspan="3">
-                    <nobr><input type="text" size="5" name="maxrecrawlinterval" class="form-control" value='<%=((maxRecrawlInterval==null)?"":maxRecrawlInterval.toString())%>'/> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutesBlankInfinity")%></nobr>
-                  </td>
-                </tr>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ExpirationIntervalIfContinuousColon")%></nobr></th>
-                  <td colspan="3">
-                    <nobr><input type="text" size="5" name="expirationinterval" class="form-control" value='<%=((expirationInterval==null)?"":expirationInterval.toString())%>'/> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutesBlankInfinity")%></nobr>
-                  </td>
-                </tr>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ReseedIntervalIfContinuousColon")%></nobr></th>
-                  <td colspan="3">
-                    <nobr><input type="text" size="5" name="reseedinterval" class="form-control" value='<%=((reseedInterval==null)?"":reseedInterval.toString())%>'/> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutesBlankInfinity")%></nobr>
-                  </td>
-                </tr>
-<%
-    }
-    else
-    {
-%>
-                <input type="hidden" name="scheduletype" value='<%=type%>'/>
-                <input type="hidden" name="recrawlinterval" value='<%=((recrawlInterval==null)?"":recrawlInterval.toString())%>'/>
-                <input type="hidden" name="maxrecrawlinterval" value='<%=((maxRecrawlInterval==null)?"":maxRecrawlInterval.toString())%>'/>
-                <input type="hidden" name="reseedinterval" value='<%=((reseedInterval==null)?"":reseedInterval.toString())%>'/>
-                <input type="hidden" name="expirationinterval" value='<%=((expirationInterval==null)?"":expirationInterval.toString())%>'/>
-<%
-    }
-    
-    String[] availableIDs = java.util.TimeZone.getAvailableIDs();
-    String localTimezone = java.util.TimeZone.getDefault().getID();
-
-    if (scheduleRecords.size() == 0)
-    {
-%>
-                <div class="callout callout-info">
-                  <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoScheduleSpecified")%>
-                </div>
-<%
-    }
-    else
-    {
-      int l = 0;
-      while (l < scheduleRecords.size())
-      {
-        ScheduleRecord sr = (ScheduleRecord)scheduleRecords.get(l);
-        Long srDuration = sr.getDuration();
-        EnumeratedValues srDayOfWeek = sr.getDayOfWeek();
-        EnumeratedValues srMonthOfYear = sr.getMonthOfYear();
-        EnumeratedValues srDayOfMonth = sr.getDayOfMonth();
-        EnumeratedValues srYear = sr.getYear();
-        EnumeratedValues srHourOfDay = sr.getHourOfDay();
-        EnumeratedValues srMinutesOfHour = sr.getMinutesOfHour();
-        boolean srRequestMinimum = sr.getRequestMinimum();
-        String srTimezone = sr.getTimezone();
-        if (srTimezone == null)
-        {
-          srTimezone = java.util.TimeZone.getDefault().getID();
-        }
-        
-        String postFix = Integer.toString(l);
-        int k;
-
-%>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ScheduledTimeColon")%></nobr></th>
-                  <td colspan="3" class="value">
-                    <div class="input-group">
-                      <select class="selectpicker schedulepulldown" data-size="10" data-live-search="true" data-live-search-normalize="true" data-live-search-style="contains" name='<%="timezone"+postFix%>'>
-<%
-        k = 0;
-        while (k < availableIDs.length)
-        {
-          String id = availableIDs[k];
-          if (id.equals(srTimezone))
-          {
-%>
-                        <option value='<%=id%>' selected=\"selected\"><%=id%></option>
-<%
-          }
-          else
-          {
-%>
-                        <option value='<%=id%>'><%=id%></option>
-<%
-          }
-          k++;
-        }
-%>
-                      </select>
-                      <span class="label">:</span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2"  multiple="true" name='<%="dayofweek"+postFix%>'>
-                        <option value="none" <%=(srDayOfWeek==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.AnyDayOfWeek")%></option>
-                        <option value="0" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(0))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Sundays")%></option>
-                        <option value="1" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(1))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Mondays")%></option>
-                        <option value="2" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(2))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Tuesdays")%></option>
-                        <option value="3" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(3))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Wednesdays")%></option>
-                        <option value="4" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(4))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Thursdays")%></option>
-                        <option value="5" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(5))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Fridays")%></option>
-                        <option value="6" <%=(srDayOfWeek!=null&&srDayOfWeek.checkValue(6))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Saturdays")%></option>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.at")%></span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name='<%="hourofday"+postFix%>'>
-                        <option value="none" <%=(srHourOfDay==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MidnightAnyHourOfDay")%></option>
-<%
-        k = 0;
-        while (k < 24)
-        {
-          int q = k;
-          String ampm;
-          if (k < 12)
-            ampm = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.am");
-          else
-          {
-            ampm = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.pm");
-            q -= 12;
-          }
-          String hour;
-          if (q == 0)
-            q = 12;
-%>
-                        <option value='<%=k%>' <%=(srHourOfDay!=null&&srHourOfDay.checkValue(k))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-          k++;
-        }
-%>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.plus")%></span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name='<%="minutesofhour"+postFix%>'>
-                        <option value="none" <%=(srMinutesOfHour==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Nothing")%></option>
-<%
-        k = 0;
-        while (k < 60)
-        {
-%>
-                        <option value='<%=k%>' <%=(srMinutesOfHour!=null&&srMinutesOfHour.checkValue(k))?"selected=\"selected\"":""%>><%=Integer.toString(k)%> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutes")%></option>
-<%
-          k++;
-        }
-%>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.in")%></span>
-                      <select class="selectpicker" multiple="true" data-size="10" data-selected-text-format="count > 2" name='<%="monthofyear"+postFix%>'>
-                        <option value="none" <%=(srMonthOfYear==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EveryMonthOfYear")%></option>
-                        <option value="0" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(0))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.January")%></option>
-                        <option value="1" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(1))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.February")%></option>
-                        <option value="2" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(2))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.March")%></option>
-                        <option value="3" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(3))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.April")%></option>
-                        <option value="4" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(4))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.May")%></option>
-                        <option value="5" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(5))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.June")%></option>
-                        <option value="6" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(6))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.July")%></option>
-                        <option value="7" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(7))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.August")%></option>
-                        <option value="8" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(8))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.September")%></option>
-                        <option value="9" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(9))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.October")%></option>
-                        <option value="10" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(10))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.November")%></option>
-                        <option value="11" <%=(srMonthOfYear!=null&&srMonthOfYear.checkValue(11))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.December")%></option>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.on")%></span>
-                      <select class="selectpicker schedulepulldown" data-size="10" data-selected-text-format="count > 2" multiple="true" name='<%="dayofmonth"+postFix%>'>
-                        <option value="none" <%=(srDayOfMonth==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.AnyDayOfMonth")%></option>
-<%
-        k = 0;
-        while (k < 31)
-        {
-          int value = (k+1) % 10;
-          String suffix;
-          if (value == 1 && k != 10)
-            suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.st");
-          else if (value == 2 && k != 11)
-            suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.nd");
-          else if (value == 3 && k != 12)
-            suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.rd");
-          else
-          suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.th");
-%>
-                        <option value='<%=Integer.toString(k)%>' <%=(srDayOfMonth!=null&&srDayOfMonth.checkValue(k))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix+" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.dayofmonth")%></option>
-<%
-          k++;
-        }
-%>
-                      </select>
-                    </div>
-                    <input type="hidden" name='<%="year"+postFix%>' value="none"/>
-                  </td>
-                </tr>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MaximumRunTimeColon")%></nobr></th>
-                  <td class="value">
-                    <input type="text" size="5" name='<%="duration"+postFix%>' class="form-control" value='<%=((srDuration==null)?"":new Long(srDuration.longValue()/60000L).toString())%>'/> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutes")%>
-                  </td>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.JobInvocationColon")%></nobr></th>
-                  <td class="value">
-                    <select class="form-control schedulepulldown" name='<%="invocation"+postFix%>'>
-                      <option value="complete" <%=(srRequestMinimum==false)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Complete")%></option>
-                      <option value="minimal" <%=srRequestMinimum?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Minimal")%></option>
-                    </select>
-                  </td>
-                </tr>
-                <tr>
-                  <td class="message" colspan="4">
-                    <a name='<%="remove_schedule_"+Integer.toString(l)%>'>
-                      <input type="button" class="btn btn-primary btn-sm"
-                             value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.RemoveSchedule")%>"
-                             onClick='<%="Javascript:RemoveSchedule("+Integer.toString(l)+")"%>'
-                             alt='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.RemoveScheduleRecord")+Integer.toString(l)%>'/></a>
-                    <input type="hidden" name='<%="recordop"+postFix%>' value=""/>
-                  </td>
-                </tr>
-<%
-        l++;
-      }
-    }
-%>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ScheduledTimeColon")%></nobr></th>
-                  <td colspan="3" class="value">
-                    <div class="input-group">
-                      <select class="selectpicker schedulepulldown" data-size="10" data-live-search="true" data-live-search-normalize="true" data-live-search-style="contains" name="timezone">
-<%
-    int k = 0;
-    while (k < availableIDs.length)
-    {
-      String id = availableIDs[k];
-      if (id.equals(localTimezone))
-      {
-%>
-                        <option value='<%=id%>' selected=\"selected\"><%=id%></option>
-<%
-      }
-      else
-      {
-%>
-                        <option value='<%=id%>'><%=id%></option>
-<%
-      }
-      k++;
-    }
-%>
-                      </select>
-                      <span class="label">:</span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name="dayofweek">
-                        <option value="none" <%=(dayOfWeek==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.AnyDayOfWeek")%></option>
-                        <option value="0" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(0))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Sundays")%></option>
-                        <option value="1" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(1))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Mondays")%></option>
-                        <option value="2" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(2))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Tuesdays")%></option>
-                        <option value="3" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(3))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Wednesdays")%></option>
-                        <option value="4" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(4))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Thursdays")%></option>
-                        <option value="5" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(5))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Fridays")%></option>
-                        <option value="6" <%=(dayOfWeek!=null&&dayOfWeek.checkValue(6))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Saturdays")%></option>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.at")%></span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name="hourofday">
-                        <option value="none" <%=(hourOfDay==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MidnightAnyHourOfDay")%></option>
-<%
-    k = 0;
-    while (k < 24)
-    {
-      int q = k;
-      String ampm;
-      if (k < 12)
-        ampm = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.am");
-      else
-      {
-        ampm = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.pm");
-        q -= 12;
-      }
-      String hour;
-      if (q == 0)
-        q = 12;
-%>
-                        <option value='<%=k%>' <%=(hourOfDay!=null&&hourOfDay.checkValue(k))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%						
-      k++;
-    }
-%>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.plus")%></span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name="minutesofhour">
-                        <option value="none" <%=(minutesOfHour==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Nothing")%></option>
-<%
-    k = 0;
-    while (k < 60)
-    {
-%>
-                        <option value='<%=k%>' <%=(minutesOfHour!=null&&minutesOfHour.checkValue(k))?"selected=\"selected\"":""%>><%=Integer.toString(k)%> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutes")%></option>
-<%
-      k++;
-    }
-%>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.in")%></span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name="monthofyear">
-                        <option value="none" <%=(monthOfYear==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EveryMonthOfYear")%></option>
-                        <option value="0" <%=(monthOfYear!=null&&monthOfYear.checkValue(0))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.January")%></option>
-                        <option value="1" <%=(monthOfYear!=null&&monthOfYear.checkValue(1))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.February")%></option>
-                        <option value="2" <%=(monthOfYear!=null&&monthOfYear.checkValue(2))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.March")%></option>
-                        <option value="3" <%=(monthOfYear!=null&&monthOfYear.checkValue(3))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.April")%></option>
-                        <option value="4" <%=(monthOfYear!=null&&monthOfYear.checkValue(4))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.May")%></option>
-                        <option value="5" <%=(monthOfYear!=null&&monthOfYear.checkValue(5))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.June")%></option>
-                        <option value="6" <%=(monthOfYear!=null&&monthOfYear.checkValue(6))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.July")%></option>
-                        <option value="7" <%=(monthOfYear!=null&&monthOfYear.checkValue(7))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.August")%></option>
-                        <option value="8" <%=(monthOfYear!=null&&monthOfYear.checkValue(8))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.September")%></option>
-                        <option value="9" <%=(monthOfYear!=null&&monthOfYear.checkValue(9))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.October")%></option>
-                        <option value="10" <%=(monthOfYear!=null&&monthOfYear.checkValue(10))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.November")%></option>
-                        <option value="11" <%=(monthOfYear!=null&&monthOfYear.checkValue(11))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.December")%></option>
-                      </select>
-                      <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editjob.on")%></span>
-                      <select class="selectpicker" data-size="10" data-selected-text-format="count > 2" multiple="true" name="dayofmonth">
-                        <option value="none" <%=(dayOfMonth==null)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.AnyDayOfMonth")%></option>
-<%
-    k = 0;
-    while (k < 31)
-    {
-      int value = (k+1) % 10;
-      String suffix;
-      if (value == 1 && k != 10)
-        suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.st");
-      else if (value == 2 && k != 11)
-        suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.nd");
-      else if (value == 3 && k != 12)
-        suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.rd");
-      else
-        suffix = Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.th");
-%>
-                        <option value='<%=Integer.toString(k)%>' <%=(dayOfMonth!=null&&dayOfMonth.checkValue(k))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix+" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.dayofmonth")%></option>
-<%
-      k++;
-    }
-%>
-                      </select>
-                    </div>
-                    <input type="hidden" name="year" value="none"/>
-                  </td>
-                </tr>
-                <tr>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MaximumRunTimeColon")%></nobr></th>
-                  <td class="value">
-                    <input type="text" size="5" name="duration" class="form-control" value='<%=((duration==null)?"":duration.toString())%>'/> <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.minutes")%>
-                  </td>
-                  <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.JobInvocationColon")%></nobr></th>
-                  <td class="value">
-                    <select class="selectpicker" data-size="10" name="invocation" class="form-control">
-                      <option value="complete" <%=(requestMinimum==false)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Complete")%></option>
-                      <option value="minimal" <%=requestMinimum ?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Minimal")%></option>
-                    </select>
-                  </td>
-                </tr>
-                <tr>
-                  <td class="message" colspan="4">
-                    <input type="hidden" name="recordop" value=""/>
-                    <a name="add_schedule">
-                      <input type="button" class="btn btn-primary btn-sm"
-                              value="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddScheduledTime")%>"
-                              onClick="javascript:AddScheduledTime()"
-                              alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddNewScheduleRecord")%>"/></a>
-                  </td>
-                </tr>
-              </table>
-<%
-  }
-  else
-  {
-%>
-              <input type="hidden" name="scheduletype" value='<%=type%>'/>
-              <input type="hidden" name="recrawlinterval" value='<%=((recrawlInterval==null)?"":recrawlInterval.toString())%>'/>
-              <input type="hidden" name="maxrecrawlinterval" value='<%=((maxRecrawlInterval==null)?"":maxRecrawlInterval.toString())%>'/>
-              <input type="hidden" name="reseedinterval" value='<%=((reseedInterval==null)?"":reseedInterval.toString())%>'/>
-              <input type="hidden" name="expirationinterval" value='<%=((expirationInterval==null)?"":expirationInterval.toString())%>'/>
-<%
-
-    int l = 0;
-    while (l < scheduleRecords.size())
-    {
-      ScheduleRecord sr = (ScheduleRecord)scheduleRecords.get(l);
-      Long srDuration = sr.getDuration();
-      EnumeratedValues srDayOfWeek = sr.getDayOfWeek();
-      EnumeratedValues srMonthOfYear = sr.getMonthOfYear();
-      EnumeratedValues srDayOfMonth = sr.getDayOfMonth();
-      EnumeratedValues srYear = sr.getYear();
-      EnumeratedValues srHourOfDay = sr.getHourOfDay();
-      EnumeratedValues srMinutesOfHour = sr.getMinutesOfHour();
-      boolean srRequestMinimum = sr.getRequestMinimum();
-      String srTimezone = sr.getTimezone();
-      String postFix = Integer.toString(l);
-
-%>
-              <input type="hidden" name='<%="timezone"+postFix%>' value='<%=((srTimezone==null)?"":srTimezone)%>'/>
-<%
-      if (srDayOfWeek == null)
-      {
-%>
-              <input type="hidden" name='<%="dayofweek"+postFix%>' value="none"/>
-<%
-      }
-      else
-      {
-        Iterator iter = srDayOfWeek.getValues();
-        while (iter.hasNext())
-        {
-          Integer value = (Integer)iter.next();
-%>
-              <input type="hidden" name='<%="dayofweek"+postFix%>' value='<%=value%>'/>
-<%
-        }
-      }
-
-      if (srHourOfDay == null)
-      {
-%>
-              <input type="hidden" name='<%="hourofday"+postFix%>' value="none"/>
-<%
-      }
-      else
-      {
-        Iterator iter = srHourOfDay.getValues();
-        while (iter.hasNext())
-        {
-          Integer value = (Integer)iter.next();
-%>
-              <input type="hidden" name='<%="hourofday"+postFix%>' value='<%=value%>'/>
-<%
-        }
-      }
-
-      if (srMinutesOfHour == null)
-      {
-%>
-              <input type="hidden" name='<%="minutesofhour"+postFix%>' value="none"/>
-<%
-      }
-      else
-      {
-        Iterator iter = srMinutesOfHour.getValues();
-        while (iter.hasNext())
-        {
-          Integer value = (Integer)iter.next();
-%>
-              <input type="hidden" name='<%="minutesofhour"+postFix%>' value='<%=value%>'/>
-<%
-        } 
-      }
-
-      if (srDayOfMonth == null)
-      {
-%>
-              <input type="hidden" name='<%="dayofmonth"+postFix%>' value="none"/>
-<%
-      }
-      else
-      {
-        Iterator iter = srDayOfMonth.getValues();
-        while (iter.hasNext())
-        {
-          Integer value = (Integer)iter.next();
-%>
-              <input type="hidden" name='<%="dayofmonth"+postFix%>' value='<%=value%>'/>
-<%
-        }
-      }
-
-      if (srMonthOfYear == null)
-      {
-%>
-              <input type="hidden" name='<%="monthofyear"+postFix%>' value="none"/>
-<%
-      }
-      else
-      {
-        Iterator iter = srMonthOfYear.getValues();
-        while (iter.hasNext())
-        {
-          Integer value = (Integer)iter.next();
-%>
-              <input type="hidden" name='<%="monthofyear"+postFix%>' value='<%=value%>'/>
-<%
-        }
-      }
-%>
-              <input type="hidden" name='<%="duration"+postFix%>' value='<%=((srDuration==null)?"":new Long(srDuration.longValue()/60000L).toString())%>'/>
-              <input type="hidden" name='<%="invocation"+postFix%>' value='<%=srRequestMinimum?"minimal":"complete"%>'/>
-              <input type="hidden" name='<%="year"+postFix%>' value="none"/>
-<%
-      l++;
-    }
-  }
-
-  if (connection != null)
-  {
-    IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
-    if (repositoryConnector != null)
-    {
-      try
-      {
-        repositoryConnector.outputSpecificationBody(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),documentSpecification,0,tabSequenceInt,tabName);
-      }
-      finally
-      {
-        repositoryConnectorPool.release(connection,repositoryConnector);
-      }
-%>
-              <input type="hidden" name="connectionpresent" value="true"/>
-<%
-    }
-  }
-
-  boolean outputPresent = false;
-  for (int j = 0; j < pipelineConnectionNames.length; j++)
-  {
-    if (pipelineIsOutputs[j])
-    {
-      outputPresent = true;
-      IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
-      if (outputConnection != null)
-      {
-        IOutputConnector outputConnector = outputConnectorPool.grab(outputConnection);
-        if (outputConnector != null)
-        {
-          try
-          {
-            outputConnector.outputSpecificationBody(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabSequenceInt,tabName);
-          }
-          finally
-          {
-            outputConnectorPool.release(outputConnection,outputConnector);
-          }
-        }
-      }
-    }
-    else
-    {
-      ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
-      if (transformationConnection != null)
-      {
-        ITransformationConnector transformationConnector = transformationConnectorPool.grab(transformationConnection);
-        if (transformationConnector != null)
-        {
-          try
-          {
-            transformationConnector.outputSpecificationBody(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabSequenceInt,tabName);
-          }
-          finally
-          {
-            transformationConnectorPool.release(transformationConnection,transformationConnector);
-          }
-        }
-      }
-    }
-  }
-
-  for (int j = 0; j < notificationConnectionNames.length; j++)
-  {
-    INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
-    if (notificationConnection != null)
-    {
-      INotificationConnector notificationConnector = notificationConnectorPool.grab(notificationConnection);
-      if (notificationConnector != null)
-      {
-        try
-        {
-          notificationConnector.outputSpecificationBody(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),notificationSpecifications[j],1+pipelineConnectionNames.length+j,tabSequenceInt,tabName);
-        }
-        finally
-        {
-          notificationConnectorPool.release(notificationConnection,notificationConnector);
-        }
-      }
-    }
-  }
-
-%>
-            </div>
-          </div>
-          <div class="box-footer clearfix">
-            <div class="btn-group">
-<%
-  if (connectionName.length() > 0 && outputPresent)
-  {
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Save()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.SaveThisJob")%>" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.Save")%></a>
-<%
-  }
-  else
-  {
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection")) && tabSequenceInt == -1)
-    {
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Continue()" 
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.ContinueToNextScreen")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.Continue")%></a>
-<%
-    }
-  }
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Cancel()" 
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.CancelJobEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.cancel")%></a>
-
-            </div>
-          </div>
-      </form>
-<%
-  }
-%>
-    </div>
-  </div>
-</div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listjobs.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/editmapper.jsp b/framework/crawler-ui/src/main/webapp/editmapper.jsp
deleted file mode 100644
index da72137..0000000
--- a/framework/crawler-ui/src/main/webapp/editmapper.jsp
+++ /dev/null
@@ -1,539 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "ConnectionObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listmappers.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  // Get the connection manager handle
-  IMappingConnectionManager connMgr = MappingConnectionManagerFactory.make(threadContext);
-  // Also get the list of available connectors
-  IMappingConnectorManager connectorManager = MappingConnectorManagerFactory.make(threadContext);
-
-  // Get connectors, since this will be needed to determine what to display.
-  IResultSet set = connectorManager.getConnectors();
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Name");
-
-  String connectionName = null;
-  IMappingConnection connection = (IMappingConnection)threadContext.get("ConnectionObject");
-  if (connection == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    connectionName = variableContext.getParameter("connname");
-    // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (connectionName != null && connectionName.length() > 0)
-    {
-      connection = connMgr.load(connectionName);
-    }
-  }
-
-  // Mapping connections
-  IMappingConnection[] mappingConnections = connMgr.getAllNonLoopingConnections((connection==null)?null:connection.getName());
-
-  // Setup default fields
-  boolean isNew = true;
-  String description = "";
-  String className = "";
-  int maxConnections = 10;
-  ConfigParams parameters = new ConfigParams();
-  String prereq = null;
-
-  if (connection != null)
-  {
-    // Set up values
-    isNew = connection.getIsNew();
-    connectionName = connection.getName();
-    description = connection.getDescription();
-    className = connection.getClassName();
-    parameters = connection.getConfigParams();
-    maxConnections = connection.getMaxConnections();
-    prereq = connection.getPrerequisiteMapping();
-  }
-  else
-    connectionName = null;
-
-  if (connectionName == null)
-    connectionName = "";
-
-  // Initialize tabs array
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Name"));
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Type"));
-  if (className.length() > 0)
-  {
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Prerequisites"));
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Throttling"));
-  }
-
-%>
-<script type="text/javascript">
-  <!--
-
-<%
-  String title = null;
-  if (description.length() > 0)
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.EditMapping") + " - " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.EditAMapping");
-  }
-%>
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editmapper.ApacheManifoldCFEditMapping")%>',
-      '<%=title%>',
-      'authorities'
-  );
-
-  // Use this method to repost the form and pick a new tab
-  function SelectTab(newtab)
-  {
-    if (checkForm())
-    {
-      document.editconnection.tabname.value=newtab;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form,
-  // and set the anchor request.
-  function postFormSetAnchor(anchorValue)
-  {
-    if (checkForm())
-    {
-      if (anchorValue != "")
-        document.editconnection.action=document.editconnection.action + "#" + anchorValue;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form
-  function postForm()
-  {
-    if (checkForm())
-    {
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Save()
-  {
-    if (checkForm())
-    {
-      // Can't submit until all required fields have been set.
-      // Some of these don't live on the current tab, so don't set
-      // focus.
-
-      // Check our part of the form, for save
-      if (editconnection.connname.value == "")
-      {
-        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editmapper.ConnectionMustHaveAName")%>");
-        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editmapper.Name")%>");
-        document.editconnection.connname.focus();
-        return;
-      }
-      if (window.checkConfigForSave)
-      {
-        if (!checkConfigForSave())
-          return;
-      }
-      document.editconnection.op.value="Save";
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Continue()
-  {
-    document.editconnection.op.value="Continue";
-    postForm();
-  }
-
-  function Cancel()
-  {
-    document.editconnection.op.value="Cancel";
-    $.ManifoldCF.submit(document.editconnection);
-  }
-
-  function checkForm()
-  {
-    if (!checkConnectionCount())
-      return false;
-    if (window.checkConfig)
-      return checkConfig();
-    return true;
-  }
-
-  function checkConnectionCount()
-  {
-    if (!isInteger(editconnection.maxconnections.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editmapper.TheMaximumNumberOfConnectionsMustBeAValidInteger")%>");
-      editconnection.maxconnections.focus();
-      return false;
-    }
-    return true;
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-<%
-  MappingConnectorFactory.outputConfigurationHeader(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabsArray);
-%>
-
-<div class="row">
-  <div class="col-md-12">
-<%
-  // Get connectors, since this will be needed to determine what to display.
-  if (set.getRowCount() == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.NoMappingConnectorsRegistered")%></p>
-    </div>
-<%
-  }
-  else
-  {
-%>
-    <div class="box box-primary">
-      <form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="mapper"/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-<%
-    int tabNum = 0;
-    int activeTab = 0;
-    while (tabNum < tabsArray.size())
-    {
-      String tab = (String)tabsArray.get(tabNum++);
-      if (tab.equals(tabName))
-      {
-%>
-            <li class="active"><a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                      alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.tab")%>'
-                      onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-    }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-
-<%
-
-    // Name tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Name")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.NameColon")%></label>
-<%
-      // If the connection doesn't exist yet, we are allowed to change the name.
-      if (isNew)
-      {
-%>
-                <input type="text" size="32" name="connname" class="form-control" placeholder="Name..." value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-      else
-      {
-%>
-                <input type="text" size="32" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-                <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-%>
-              </div>
-              <div class="form-group">
-                <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.DescriptionColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" id="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the Name tab
-%>
-            <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-            <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-    }
-
-
-    // "Type" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Type")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.ConnectionTypeColon")%></label>
-<%
-      if (className.length() > 0)
-      {
-        String value = connectorManager.getDescription(className);
-        if (value == null)
-        {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.UNREGISTERED")%> <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(className)%></nobr>
-<%
-        }
-        else
-        {
-%>
-                <input type="text" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)%>'/>
-<%
-        }
-%>
-                <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-      }
-      else
-      {
-        int i = 0;
-%>
-                <select name="classname" class="form-control">
-<%
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          String thisClassName = row.getValue("classname").toString();
-          String thisDescription = row.getValue("description").toString();
-%>
-                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisClassName)%>' <%=className.equals(thisClassName)?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-        }
-%>
-                </select>
-<%
-      }
-%>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the "Type" tab
-%>
-            <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-    }
-
-    // The "Prerequisites" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Prerequisites")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <strong><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.PrerequisiteUserMappingColon")%></strong>
-
-                <div class="radio">
-                  <label>
-                    <input type="hidden" name="prerequisites_present" value="true"/>
-<%
-      if (prereq == null)
-      {
-%>
-                    <input type="radio" name="prerequisites" value="" checked="true"/>&nbsp;<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.NoPrerequisites")%><br/>
-<%
-      }
-      else
-      {
-%>
-                    <input type="radio" name="prerequisites" value=""/>&nbsp;<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.NoPrerequisites")%><br/>
-<%
-      }
-
-      for (IMappingConnection mappingConnection : mappingConnections)
-      {
-        String mappingName = mappingConnection.getName();
-        String mappingDescription = mappingName;
-        if (mappingConnection.getDescription() != null && mappingConnection.getDescription().length() > 0)
-          mappingDescription += " (" + mappingConnection.getDescription()+")";
-        if (prereq != null && prereq.equals(mappingName))
-        {
-%>
-                    <input type="radio" name="prerequisites"
-                            value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mappingName)%>'
-                            checked="true"/>&nbsp;<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mappingDescription)%><br/>
-<%
-        }
-        else
-        {
-%>
-                    <input type="radio" name="prerequisites" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(mappingName)%>'/>&nbsp;<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(mappingDescription)%><br/>
-<%
-        }
-      }
-%>
-                  </label>
-                </div>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for Prerequisites tab
-%>
-              <input type="hidden" name="prerequisites_present" value="true"/>
-<%
-      if (prereq != null)
-      {
-%>
-              <input type="hidden" name="prerequisites" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(prereq)%>'/>
-<%
-      }
-    }
-
-    // The "Throttling" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Throttling")))
-    {
-%>
-              <div class="tab-pane active" id="tab_<%=activeTab%>">
-                <div class="form-group">
-                  <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editmapper.MaxConnectionsColon")%></label>
-                  <input type="text" size="6" name="maxconnections" class="form-control" value='<%=Integer.toString(maxConnections)%>'/>
-                </div>
-              </div>
-<%
-    }
-    else
-    {
-      // Hiddens for "Throttling" tab
-%>
-              <input type="hidden" name="maxconnections" value='<%=Integer.toString(maxConnections)%>'/>
-<%
-    }
-
-    if (className.length() > 0)
-      MappingConnectorFactory.outputConfigurationBody(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabName);
-%>
-            </div>
-          </div>
-          <div class="box-footer clearfix">
-            <div class="btn-group">
-<%
-    if (className.length() > 0)
-    {
-%>
-              <a href="#" class="btn btn-primary" role="button" onClick="javascript:Save()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.SaveThisMappingConnection")%>" 
-                      data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.Save")%></a>
-<%
-    }
-    else
-    {
-      if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editmapper.Type")))
-      {
-%>
-              <a href="#" class="btn btn-primary" role="button" onClick="javascript:Continue()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.ContinueToNextPage")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.Continue")%></a>
-<%
-      }
-    }
-%>
-              <a href="#" class="btn btn-primary" role="button" onClick="javascript:Cancel()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.CancelMappingEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editmapper.Cancel")%></a>
-            </div>
-          </div>
-        </div>
-      </form>
-<%
-  }
-%>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listmappers.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/editnotification.jsp b/framework/crawler-ui/src/main/webapp/editnotification.jsp
deleted file mode 100644
index 10a4966..0000000
--- a/framework/crawler-ui/src/main/webapp/editnotification.jsp
+++ /dev/null
@@ -1,469 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "ConnectionObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listnotifications.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the connection manager handle
-  INotificationConnectionManager connMgr = NotificationConnectionManagerFactory.make(threadContext);
-  // Also get the list of available connectors
-  INotificationConnectorManager connectorManager = NotificationConnectorManagerFactory.make(threadContext);
-
-  IResultSet set = connectorManager.getConnectors();
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Name");
-  String connectionName = null;
-  INotificationConnection connection = (INotificationConnection)threadContext.get("ConnectionObject");
-  if (connection == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    connectionName = variableContext.getParameter("connname");
-    // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (connectionName != null && connectionName.length() > 0)
-    {
-      connection = connMgr.load(connectionName);
-    }
-  }
-
-  // Set up default fields.
-  boolean isNew = true;
-  String description = "";
-  String className = "";
-  int maxConnections = 10;
-  ConfigParams parameters = new ConfigParams();
-
-  // If there's a connection object, set up all our parameters from it.
-  if (connection != null)
-  {
-    // Set up values
-    isNew = connection.getIsNew();
-    connectionName = connection.getName();
-    description = connection.getDescription();
-    className = connection.getClassName();
-    parameters = connection.getConfigParams();
-    maxConnections = connection.getMaxConnections();
-  }
-  else
-    connectionName = null;
-
-  if (connectionName == null)
-    connectionName = "";
-
-  // Initialize tabs array.
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Name"));
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Type"));
-  if (className.length() > 0)
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Throttling"));
-
-%>
-
-<script type="text/javascript">
-  <!--
-<%
-  String title = null;
-  if (description.length() > 0)
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.EditNotificationConnection") + " - " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    title = Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.EditANotificationConnection");
-  }
-%>
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editnotification.ApacheManifoldCFEditNotificationConnection")%>',
-      '<%=title%>',
-      'repositories'
-  );
-  // Use this method to repost the form and pick a new tab
-  function SelectTab(newtab)
-  {
-    if (checkForm())
-    {
-      document.editconnection.tabname.value=newtab;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form,
-  // and set the anchor request.
-  function postFormSetAnchor(anchorValue)
-  {
-    if (checkForm())
-    {
-      if (anchorValue != "")
-        document.editconnection.action=document.editconnection.action + "#" + anchorValue;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form
-  function postForm()
-  {
-    if (checkForm())
-    {
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Save()
-  {
-    if (checkForm())
-    {
-      // Can't submit until all required fields have been set.
-      // Some of these don't live on the current tab, so don't set
-      // focus.
-
-      // Check our part of the form, for save
-      if (editconnection.connname.value == "")
-      {
-        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editnotification.ConnectionMustHaveAName")%>");
-        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editnotification.Name")%>");
-        document.editconnection.connname.focus();
-        return;
-      }
-      if (window.checkConfigForSave)
-      {
-        if (!checkConfigForSave())
-          return;
-      }
-      document.editconnection.op.value="Save";
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Continue()
-  {
-    document.editconnection.op.value="Continue";
-    postForm();
-  }
-
-  function Cancel()
-  {
-    document.editconnection.op.value="Cancel";
-    $.ManifoldCF.submit(document.editconnection);
-  }
-
-  function checkForm()
-  {
-    if (!checkConnectionCount())
-      return false;
-    if (window.checkConfig)
-      return checkConfig();
-    return true;
-  }
-
-  function checkConnectionCount()
-  {
-    if (!isInteger(editconnection.maxconnections.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editnotification.TheMaximumNumberOfConnectionsMustBeAValidInteger")%>");
-      editconnection.maxconnections.focus();
-      return false;
-    }
-    return true;
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-<%
-  NotificationConnectorFactory.outputConfigurationHeader(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabsArray);
-%>
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-
-<%
-  // Get connector list; need this to decide what to do
-  if (set.getRowCount() == 0)
-  {
-%>
-      <div class="box-body">
-        <div class="callout callout-warning">
-          <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.NoNotificationConnectorsRegistered")%></p>
-        </div>
-      </div>
-<%
-  }
-  else
-  {
-%>
-
-      <form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="notification"/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-
-<%
-    int tabNum = 0;
-    int activeTab = 0;
-    while (tabNum < tabsArray.size())
-    {
-      String tab = (String)tabsArray.get(tabNum++);
-      if (tab.equals(tabName))
-      {
-%>
-            <li class="active"><a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                      alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.tab")%>'
-                      onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-    }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-<%
-
-
-    // Name tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Name")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.NameColon")%></label>
-<%
-      // If the connection doesn't exist yet, we are allowed to change the name.
-      if (connection == null || connectionName.length() < 1)
-      {
-%>
-                <input type="text" size="32" name="connname" class="form-control" placeholder="Name..." value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-      else
-      {
-%>
-                <input type="text" size="32" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-                <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-%>
-              </div>
-              <div class="form-group">
-                <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.DescriptionColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" id="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the Name tab
-%>
-            <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-            <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-    }
-
-
-    // "Type" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Type")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.ConnectionTypeColon")%></label>
-
-<%
-      if (className.length() > 0)
-      {
-        String value = connectorManager.getDescription(className);
-        if (value == null)
-        {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.UNREGISTERED")%> <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(className)%></nobr>
-<%
-        }
-        else
-        {
-%>
-                <input type="text" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)%>'/>
-<%
-        }
-%>
-                <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-      }
-      else
-      {
-        int i = 0;
-%>
-                <select name="classname" class="form-control">
-<%
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          String thisClassName = row.getValue("classname").toString();
-          String thisDescription = row.getValue("description").toString();
-%>
-                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisClassName)%>' <%=className.equals(thisClassName)?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-        }
-%>
-                </select>
-<%
-      }
-%>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the "Type" tab
-%>
-            <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-    }
-
-
-    // The "Throttling" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Throttling")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editnotification.MaxConnectionsColon")%>
-                </label>
-                <input type="text" size="6" name="maxconnections" class="form-control" value='<%=Integer.toString(maxConnections)%>'/>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for "Throttling" tab
-%>
-            <input type="hidden" name="maxconnections" value='<%=Integer.toString(maxConnections)%>'/>
-<%
-    }
-
-    if (className.length() > 0)
-      NotificationConnectorFactory.outputConfigurationBody(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabName);
-
-%>
-          </div>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-
-<%
-    if (className.length() > 0)
-    {
-%>
-            <a href="#" role="button" class="btn btn-primary" onClick="javascript:Save()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.SaveThisNotificationConnection")%>" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.Save")%></a>
-
-<%
-    }
-    else
-    {
-      if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editnotification.Type")))
-      {
-%>
-            <a href="#" role="button" class="btn btn-primary" onClick="javascript:Continue()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.ContinueToNextPage")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.Continue")%></a>
-
-<%
-      }
-    }
-%>
-            <a href="#" role="button" class="btn btn-primary" onClick="javascript:Cancel()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.CancelNotificationConnectionEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editnotification.Cancel")%></a>
-          </div>
-        </div>
-      </form>
-
-<%
-  }
-%>
-    </div>
-  </div>
-</div>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listnotifications.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/editoutput.jsp b/framework/crawler-ui/src/main/webapp/editoutput.jsp
deleted file mode 100644
index d77c48d..0000000
--- a/framework/crawler-ui/src/main/webapp/editoutput.jsp
+++ /dev/null
@@ -1,469 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "ConnectionObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listoutputs.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  // Get the connection manager handle
-  IOutputConnectionManager connMgr = OutputConnectionManagerFactory.make(threadContext);
-  // Also get the list of available connectors
-  IOutputConnectorManager connectorManager = OutputConnectorManagerFactory.make(threadContext);
-
-  IResultSet set = connectorManager.getConnectors();
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Name");
-  String connectionName = null;
-  IOutputConnection connection = (IOutputConnection)threadContext.get("ConnectionObject");
-  if (connection == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    connectionName = variableContext.getParameter("connname");
-    // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (connectionName != null && connectionName.length() > 0)
-    {
-      connection = connMgr.load(connectionName);
-    }
-  }
-
-  // Set up default fields.
-  boolean isNew = true;
-  String description = "";
-  String className = "";
-  int maxConnections = 10;
-  ConfigParams parameters = new ConfigParams();
-
-  // If there's a connection object, set up all our parameters from it.
-  if (connection != null)
-  {
-    // Set up values
-    isNew = connection.getIsNew();
-    connectionName = connection.getName();
-    description = connection.getDescription();
-    className = connection.getClassName();
-    parameters = connection.getConfigParams();
-    maxConnections = connection.getMaxConnections();
-  }
-  else
-    connectionName = null;
-
-  if (connectionName == null)
-    connectionName = "";
-
-  // Initialize tabs array.
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Name"));
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Type"));
-  if (className.length() > 0)
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Throttling"));
-
-%>
-
-<%
-  String heading = null;
-  if (description.length() > 0)
-  {
-    heading = Messages.getBodyString(pageContext.getRequest()
-            .getLocale(),"editoutput.EditOutputConnection") + " - " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    heading = Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.EditAnOutputConnection");
-  }
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "editoutput.ApacheManifoldCFEditOutputConnection")%>',
-      '<%=heading%>',
-      'outputs'
-  );
-
-  // Use this method to repost the form and pick a new tab
-  function SelectTab(newtab)
-  {
-    if (checkForm())
-    {
-      document.editconnection.tabname.value=newtab;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form,
-  // and set the anchor request.
-  function postFormSetAnchor(anchorValue)
-  {
-    if (checkForm())
-    {
-      if (anchorValue != "")
-      {
-        document.editconnection.action=document.editconnection.action + "#" + anchorValue;
-      }
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form
-  function postForm()
-  {
-    if (checkForm())
-    {
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Save()
-  {
-    if (checkForm())
-    {
-      // Can't submit until all required fields have been set.
-      // Some of these don't live on the current tab, so don't set
-      // focus.
-
-      // Check our part of the form, for save
-      if (editconnection.connname.value == "")
-      {
-        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editoutput.ConnectionMustHaveAName")%>");
-        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editoutput.Name")%>");
-        document.editconnection.connname.focus();
-        return;
-      }
-      if (window.checkConfigForSave)
-      {
-        if (!checkConfigForSave())
-          return;
-      }
-      document.editconnection.op.value="Save";
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Continue()
-  {
-    document.editconnection.op.value="Continue";
-    postForm();
-  }
-
-  function Cancel()
-  {
-    document.editconnection.op.value="Cancel";
-    $.ManifoldCF.submit(document.editconnection);
-  }
-
-  function checkForm()
-  {
-    if (!checkConnectionCount())
-      return false;
-    if (window.checkConfig)
-      return checkConfig();
-    return true;
-  }
-
-  function checkConnectionCount()
-  {
-    if (!isInteger(editconnection.maxconnections.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editoutput.TheMaximumNumberOfConnectionsMustBeAValidInteger")%>");
-      editconnection.maxconnections.focus();
-      return false;
-    }
-    return true;
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-
-<section id="script">
-  <%
-    OutputConnectorFactory.outputConfigurationHeader(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabsArray);
-  %>
-</section>
-
-
-<div class="row">
-  <div class="col-md-12">
-<%
-  // Get connector list; need this to decide what to do
-  if (set.getRowCount() == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.NoOutputConnectorsRegistered")%></p>
-    </div>
-<%
-  }
-  else
-  {
-%>
-    <div class="box box-primary">
-      <form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="output"/>
-        <input type="hidden" name="tabname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>"/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-<%
-    int tabNum = 0;
-    int activeTab = 0;
-    while (tabNum < tabsArray.size())
-    {
-      String tab = (String)tabsArray.get(tabNum++);
-      if (tab.equals(tabName))
-      {
-%>
-            <li class="active"><a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                      alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.tab")%>'
-                      onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-    }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-<%
-
-
-    // Name tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Name")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.NameColon")%></label>
-<%
-      // If the connection doesn't exist yet, we are allowed to change the name.
-      if (connection == null || connectionName.length() < 1)
-      {
-%>
-                <input type="text" size="32" name="connname" class="form-control" placeholder="Name..." value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>"/>
-<%
-      }
-      else
-      {
-%>
-                <input type="text" class="form-control" disabled value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>"/>
-                <input type="hidden" name="connname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>"/>
-<%
-      }
-%>
-              </div>
-              <div class="form-group">
-                <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.DescriptionColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" id="description" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>"/>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the Name tab
-%>
-            <input type="hidden" name="connname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>"/>
-            <input type="hidden" name="description" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>"/>
-<%
-    }
-
-
-    // "Type" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Type")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.ConnectionTypeColon")%></label>
-<%
-      if (className.length() > 0)
-      {
-        String value = connectorManager.getDescription(className);
-        if (value == null)
-        {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.UNREGISTERED")%> <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(className)%></nobr>
-<%
-        }
-        else
-        {
-%>
-                <input type="text" class="form-control" disabled value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)%>"/>
-<%
-        }
-%>
-                <input type="hidden" name="classname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>"/>
-<%
-      }
-      else
-      {
-        int i = 0;
-%>
-                <select name="classname" clas="form-control">
-<%
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          String thisClassName = row.getValue("classname").toString();
-          String thisDescription = row.getValue("description").toString();
-%>
-                  <option value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisClassName)%>" <%=className.equals(thisClassName)?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-        }
-%>
-                </select>
-<%
-      }
-%>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the "Type" tab
-%>
-              <input type="hidden" name="classname" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>"/>
-<%
-    }
-
-
-    // The "Throttling" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Throttling")))
-    {
-%>
-              <div class="tab-pane active" id="tab_<%=activeTab%>">
-                <div class="form-group">
-                  <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editoutput.MaxConnectionsColon")%></label>
-                  <input type="text" size="6" name="maxconnections" class="form-control" value="<%=Integer.toString(maxConnections)%>"/>
-                </div>
-              </div>
-<%
-    }
-    else
-    {
-      // Hiddens for "Throttling" tab
-%>
-              <input type="hidden" name="maxconnections" value="<%=Integer.toString(maxConnections)%>"/>
-<%
-    }
-
-    if (className.length() > 0)
-      OutputConnectorFactory.outputConfigurationBody(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabName);
-
-%>
-            </div>
-          </div>
-          <div class="box-footer clearfix">
-            <div class="btn-group">
-<%
-    if (className.length() > 0)
-    {
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Save()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.SaveThisOutputConnection")%>" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.Save")%></a>
-<%
-    }
-    else
-    {
-      if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editoutput.Type")))
-      {
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Continue()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.ContinueToNextPage")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.Continue")%></a>
-<%
-      }
-    }
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Cancel()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.CancelOutputConnectionEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editoutput.Cancel")%></a>
-            </div>
-          </div>
-        </div>
-      </form>
-<%
-  }
-%>
-    </div>
-  </div>
-</div>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listoutputs.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/edittransformation.jsp b/framework/crawler-ui/src/main/webapp/edittransformation.jsp
deleted file mode 100644
index 946da6b..0000000
--- a/framework/crawler-ui/src/main/webapp/edittransformation.jsp
+++ /dev/null
@@ -1,465 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-// The contract of this edit page is as follows.  It is either called directly, in which case it is expected to be creating
-// a connection or beginning the process of editing an existing connection, or it is called via redirection from execute.jsp, in which case
-// the connection object being edited will be placed in the thread context under the name "ConnectionObject".
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-  {
-    variableContext.setParameter("target","listtransformations.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  // Get the connection manager handle
-  ITransformationConnectionManager connMgr = TransformationConnectionManagerFactory.make(threadContext);
-  // Also get the list of available connectors
-  ITransformationConnectorManager connectorManager = TransformationConnectorManagerFactory.make(threadContext);
-
-  IResultSet set = connectorManager.getConnectors();
-
-  // Figure out what the current tab name is.
-  String tabName = variableContext.getParameter("tabname");
-  if (tabName == null || tabName.length() == 0)
-    tabName = Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Name");
-  String connectionName = null;
-  ITransformationConnection connection = (ITransformationConnection)threadContext.get("ConnectionObject");
-  if (connection == null)
-  {
-    // We did not go through execute.jsp
-    // We might have received an argument specifying the connection name.
-    connectionName = variableContext.getParameter("connname");
-    // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-    if (connectionName != null && connectionName.length() > 0)
-    {
-      connection = connMgr.load(connectionName);
-    }
-  }
-
-  // Set up default fields.
-  boolean isNew = true;
-  String description = "";
-  String className = "";
-  int maxConnections = 10;
-  ConfigParams parameters = new ConfigParams();
-
-  // If there's a connection object, set up all our parameters from it.
-  if (connection != null)
-  {
-    // Set up values
-    isNew = connection.getIsNew();
-    connectionName = connection.getName();
-    description = connection.getDescription();
-    className = connection.getClassName();
-    parameters = connection.getConfigParams();
-    maxConnections = connection.getMaxConnections();
-  }
-  else
-    connectionName = null;
-
-  if (connectionName == null)
-    connectionName = "";
-
-  // Initialize tabs array.
-  ArrayList tabsArray = new ArrayList();
-
-  // Set up the predefined tabs
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Name"));
-  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Type"));
-  if (className.length() > 0)
-    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Throttling"));
-
-%>
-
-<script type="text/javascript">
-  <!--
-<%
-  String heading = null;
-  if (description.length() > 0)
-  {
-    heading = Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.EditTransformationConnection") + " " + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description);
-  }
-  else
-  {
-    heading = Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.EditATransformationConnection");
-  }
-%>
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "edittransformation.ApacheManifoldCFEditTransformationConnection")%>',
-      '<%=heading%>',
-      'outputs'
-  );
-  // Use this method to repost the form and pick a new tab
-  function SelectTab(newtab)
-  {
-    if (checkForm())
-    {
-      document.editconnection.tabname.value=newtab;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form,
-  // and set the anchor request.
-  function postFormSetAnchor(anchorValue)
-  {
-    if (checkForm())
-    {
-      if (anchorValue != "")
-        document.editconnection.action=document.editconnection.action + "#" + anchorValue;
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  // Use this method to repost the form
-  function postForm()
-  {
-    if (checkForm())
-    {
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Save()
-  {
-    if (checkForm())
-    {
-      // Can't submit until all required fields have been set.
-      // Some of these don't live on the current tab, so don't set
-      // focus.
-
-      // Check our part of the form, for save
-      if (editconnection.connname.value == "")
-      {
-        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"edittransformation.ConnectionMustHaveAName")%>");
-        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"edittransformation.Name")%>");
-        document.editconnection.connname.focus();
-        return;
-      }
-      if (window.checkConfigForSave)
-      {
-        if (!checkConfigForSave())
-          return;
-      }
-      document.editconnection.op.value="Save";
-      $.ManifoldCF.submit(document.editconnection);
-    }
-  }
-
-  function Continue()
-  {
-    document.editconnection.op.value="Continue";
-    postForm();
-  }
-
-  function Cancel()
-  {
-    document.editconnection.op.value="Cancel";
-    $.ManifoldCF.submit(document.editconnection);
-  }
-
-  function checkForm()
-  {
-    if (!checkConnectionCount())
-      return false;
-    if (window.checkConfig)
-      return checkConfig();
-    return true;
-  }
-
-  function checkConnectionCount()
-  {
-    if (!isInteger(editconnection.maxconnections.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"edittransformation.TheMaximumNumberOfConnectionsMustBeAValidInteger")%>");
-      editconnection.maxconnections.focus();
-      return false;
-    }
-    return true;
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-<%
-  TransformationConnectorFactory.outputConfigurationHeader(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabsArray);
-%>
-
-
-<div class="row">
-  <div class="col-md-12">
-
-<%
-  // Get connector list; need this to decide what to do
-  if (set.getRowCount() == 0)
-  {
-%>
-    <div class="callout callout-warning">
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.NoTransformationConnectorsRegistered")%></p>
-    </div>
-<%
-  }
-  else
-  {
-%>
-    <div class="box box-primary">
-      <form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="transformation"/>
-        <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-        <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
-
-        <div class="box-header">
-          <ul class="nav nav-tabs" role="tablist">
-<%
-    int tabNum = 0;
-    int activeTab = 0;
-    while (tabNum < tabsArray.size())
-    {
-      String tab = (String)tabsArray.get(tabNum++);
-      if (tab.equals(tabName))
-      {
-%>
-            <li class="active"><a href="#tab_<%=tabNum%>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></li>
-<%
-      }
-      else
-      {
-%>
-            <li>
-              <a href="#tab_<%=tabNum%>"
-                      alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.tab")%>'
-                      onclick='<%="javascript:SelectTab(\""+tab+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a>
-            </li>
-<%
-      }
-    }
-%>
-          </ul>
-        </div>
-        <div class="box-body">
-          <div class="tab-content">
-<%
-
-
-    // Name tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Name")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.NameColon")%></label>
-<%
-      // If the connection doesn't exist yet, we are allowed to change the name.
-      if (connection == null || connectionName.length() < 1)
-      {
-%>
-                <input type="text" size="32" name="connname" class="form-control" placeholder="Name..." value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-      else
-      {
-%>
-                <input type="text" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-                <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-<%
-      }
-%>
-              </div>
-              <div class="form-group">
-                <label for="description"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.DescriptionColon")%></label>
-                <input type="text" size="50" class="form-control" name="description" id="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the Name tab
-%>
-            <input type="hidden" name="connname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
-            <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-    }
-
-
-    // "Type" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Type")))
-    {
-%>
-            <div class="tab-pane active" id="tab_<%=activeTab%>">
-              <div class="form-group">
-                <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.ConnectionTypeColon")%></label>
-<%
-      if (className.length() > 0)
-      {
-        String value = connectorManager.getDescription(className);
-        if (value == null)
-        {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.UNREGISTERED")%> <%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(className)%></nobr>
-<%
-        }
-        else
-        {
-%>
-                <input type="text" class="form-control" disabled value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(value)%>'/>
-<%
-        }
-%>
-                <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-      }
-      else
-      {
-        int i = 0;
-%>
-                <select name="classname" clas="form-control">
-<%
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          String thisClassName = row.getValue("classname").toString();
-          String thisDescription = row.getValue("description").toString();
-%>
-                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisClassName)%>' <%=className.equals(thisClassName)?"selected=\"selected\"":""%>><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-        }
-%>
-                </select>
-<%
-      }
-%>
-              </div>
-            </div>
-<%
-    }
-    else
-    {
-      // Hiddens for the "Type" tab
-%>
-              <input type="hidden" name="classname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(className)%>'/>
-<%
-    }
-
-
-    // The "Throttling" tab
-    if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Throttling")))
-    {
-%>
-              <div class="tab-pane active" id="tab_<%=activeTab%>">
-                <div class="form-group">
-                  <label><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"edittransformation.MaxConnectionsColon")%></label>
-                  <input type="text" size="6" name="maxconnections" class="form-control" value='<%=Integer.toString(maxConnections)%>'/>
-                </div>
-              </div>
-<%
-    }
-    else
-    {
-      // Hiddens for "Throttling" tab
-%>
-              <input type="hidden" name="maxconnections" value='<%=Integer.toString(maxConnections)%>'/>
-<%
-    }
-
-    if (className.length() > 0)
-      TransformationConnectorFactory.outputConfigurationBody(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters,tabName);
-
-%>
-            </div>
-          </div>
-          <div class="box-footer clearfix">
-            <div class="btn-group">
-<%
-    if (className.length() > 0)
-    {
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Save()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.SaveThisTransformationConnection")%>" data-toggle="tooltip"><i class="fa fa-save fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.Save")%></a>
-<%
-    }
-    else
-    {
-      if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"edittransformation.Type")))
-      {
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Continue()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.ContinueToNextPage")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.Continue")%></a>
-<%
-      }
-    }
-%>
-              <a href="#" class="btn btn-primary" onClick="javascript:Cancel()"
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.CancelTransformationConnectionEditing")%>" data-toggle="tooltip"><i class="fa fa-times-circle-o fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"edittransformation.Cancel")%></a>
-            </div>
-          </div>
-        </div>
-      </form>
-
-<%
-  }
-%>
-
-    </div>
-  </div>
-</div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listtransformations.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/error.jsp b/framework/crawler-ui/src/main/webapp/error.jsp
deleted file mode 100644
index d36c8fa..0000000
--- a/framework/crawler-ui/src/main/webapp/error.jsp
+++ /dev/null
@@ -1,54 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"error.ApacheManifoldCFError")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"error.Error")%>'
-  );
-  //-->
-</script>
-
-<%
-  // These have to be fetched from request rather than variableContext since error
-  // forwards screw up the multipart wrapper
-  String errorText = variableContext.getParameter("text");
-  String target = variableContext.getParameter("target");
-%>
-
-<div class="box box-solid">
-  <div class="box-body">
-    <div class="alert alert-danger">
-      <h3><i class="icon fa fa-ban"></i> Error!</h3>
-      <h4><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(errorText)%></h4>
-    </div>
-  </div>
-  <div class="box-footer with-border">
-    <a class="link btn btn-primary" href='<%=org.apache.manifoldcf.core.util.URLEncoder.encode(target)%>' 
-            title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"error.Return")%>" data-toggle="tooltip">
-      <i class="fa fa-check fa-fw" aria-hidden="true"></i>OK
-    </a>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/execute.jsp b/framework/crawler-ui/src/main/webapp/execute.jsp
deleted file mode 100644
index cd61ab5..0000000
--- a/framework/crawler-ui/src/main/webapp/execute.jsp
+++ /dev/null
@@ -1,1750 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-  // The purpose of this jsp is to execute commands, and then dispatch to the right form or display page using
-  // jsp:forward.
-  // Note that, for errors, the logic must involve another step.  That step involves dispatching to the error
-  // page, and passing in the error and the name of the page to go to when the error is accepted by the user.
-  // This page must therefore NEVER cause text to be streamed, and must ALWAYS pass information to the page
-  // it forwards to using arguments and thread context only.
-  //
-  // The parameters that the page expects depend on the operation.  The operation is passed as the parameter "op".
-  // For many operations there is a secondary parameter determining the type of entity being operated on.
-  // This is passed in the parameter "type".
-  //
-  // Dispatches are handled within the logic for each operation type.  This includes dispatches to the error page.
-  // The error page receives the following argument values: "text" (the error text), and "target" (the page to go to
-  // on confirmation).
-  //
-  // If no operation at all is present, or if no dispatch occurs, then this code simply dispatches to the home admin page.
-
-  try
-  {
-    // Make a few things we will need
-    // Get the job manager handle
-    IJobManager manager = JobManagerFactory.make(threadContext);
-    IAuthorityGroupManager authGroupManager = AuthorityGroupManagerFactory.make(threadContext);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
-    INotificationConnectionManager notificationManager = NotificationConnectionManagerFactory.make(threadContext);
-    IAuthorityConnectionManager authConnManager = AuthorityConnectionManagerFactory.make(threadContext);
-    IMappingConnectionManager mappingConnManager = MappingConnectionManagerFactory.make(threadContext);
-    IOutputConnectionManager outputManager = OutputConnectionManagerFactory.make(threadContext);
-    ITransformationConnectionManager transformationManager = TransformationConnectionManagerFactory.make(threadContext);
-
-    IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-    ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-    IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-    INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-
-    String type = variableContext.getParameter("type");
-    String op = variableContext.getParameter("op");
-    if (type != null && op != null && type.equals("connection"))
-    {
-      // -- Connection editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          IRepositoryConnection connection = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String connectionName = variableContext.getParameter("connname");
-          // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-          if (connectionName != null && connectionName.length() > 0 && !isNew)
-          {
-            connection = connManager.load(connectionName);
-          }
-
-          if (connection == null)
-          {
-            connection = connManager.create();
-            if (connectionName != null && connectionName.length() > 0)
-              connection.setName(connectionName);
-          }
-
-          // Fill in connection object from posted data
-          connection.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            connection.setDescription(x);
-          x = variableContext.getParameter("classname");
-          if (x != null)
-            connection.setClassName(x);
-          x = variableContext.getParameter("authorityname");
-          if (x != null && x.length() > 0)
-          {
-            if (x.equals("_none_"))
-              connection.setACLAuthority(null);
-            else
-              connection.setACLAuthority(x);
-          }
-          x = variableContext.getParameter("maxconnections");
-          if (x != null && x.length() > 0)
-            connection.setMaxConnections(Integer.parseInt(x));
-
-          // Gather and save throttles
-          x = variableContext.getParameter("throttlecount");
-          if (x != null)
-          {
-            int throttleCount = Integer.parseInt(x);
-            connection.clearThrottleValues();
-            int j = 0;
-            while (j < throttleCount)
-            {
-              String regexp = variableContext.getParameter("throttle_"+Integer.toString(j));
-              String desc = variableContext.getParameter("throttledesc_"+Integer.toString(j));
-              if (desc == null)
-                desc = "";
-              String value = variableContext.getParameter("throttlevalue_"+Integer.toString(j));
-              connection.addThrottleValue(regexp,desc,(float)(((double)new Long(value).longValue())/(double)(60000.0)));
-              j++;
-            }
-            x = variableContext.getParameter("throttleop");
-            if (x != null && x.equals("Delete"))
-            {
-              // Delete an item from the throttles list
-              x = variableContext.getParameter("throttlenumber");
-              String regexp = variableContext.getParameter("throttle_"+x);
-              connection.deleteThrottleValue(regexp);
-            }
-            else if (x != null && x.equals("Add"))
-            {
-              // Add an item to the throttles list
-              String regexp = variableContext.getParameter("throttle");
-              String desc = variableContext.getParameter("throttledesc");
-              if (desc == null)
-                desc = "";
-              Long value = new Long(variableContext.getParameter("throttlevalue"));
-              connection.addThrottleValue(regexp,desc,(float)(((double)value.longValue())/(double)(60000.0)));
-            }
-          }
-
-          String error = RepositoryConnectorFactory.processConfigurationPost(threadContext,connection.getClassName(),variableContext,pageContext.getRequest().getLocale(),connection.getConfigParams());
-
-          if (error != null)
-          {
-            variableContext.setParameter("text",error);
-            variableContext.setParameter("target","listconnections.jsp");
-%>
-            <jsp:forward page="error.jsp"/>
-<%
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("ConnectionObject",connection);
-%>
-            <jsp:forward page="editconnection.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listconnections.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-            connManager.save(connection);
-            variableContext.setParameter("connname",connectionName);
-%>
-            <jsp:forward page="viewconnection.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listconnections.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          connManager.delete(connectionName);
-%>
-          <jsp:forward page="listconnections.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listconnections.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listconnections.jsp"/>
-<%
-      }
-      else if (op.equals("ClearHistory"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          connManager.cleanUpHistoryData(connectionName);
-%>
-          <jsp:forward page="listconnections.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listconnections.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to connection execution page");
-        variableContext.setParameter("target","listconnections.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && type.equals("group"))
-    {
-      // -- Group editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          IAuthorityGroup group = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String groupName = variableContext.getParameter("groupname");
-          // If the groupname is not null, load the group and prepopulate everything with what comes from it.
-          if (groupName != null && groupName.length() > 0 && !isNew)
-          {
-            group = authGroupManager.load(groupName);
-          }
-
-          if (group == null)
-          {
-            group = authGroupManager.create();
-            if (groupName != null && groupName.length() > 0)
-              group.setName(groupName);
-          }
-
-          // Gather all the data from the form.
-          group.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            group.setDescription(x);
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("GroupObject",group);
-%>
-              <jsp:forward page="editgroup.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listgroups.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            authGroupManager.save(group);
-            variableContext.setParameter("groupname",groupName);
-%>
-            <jsp:forward page="viewgroup.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listgroups.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String groupName = variableContext.getParameter("groupname");
-          if (groupName == null)
-            throw new ManifoldCFException("Missing group name parameter");
-          authGroupManager.delete(groupName);
-%>
-          <jsp:forward page="listgroups.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listgroups.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listgroups.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to authority group execution page");
-        variableContext.setParameter("target","listgroups.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-
-    }
-    else if (type != null && op != null && type.equals("authority"))
-    {
-      // -- Authority editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          IAuthorityConnection connection = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String connectionName = variableContext.getParameter("connname");
-          // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-          if (connectionName != null && connectionName.length() > 0 && !isNew)
-          {
-            connection = authConnManager.load(connectionName);
-          }
-
-          if (connection == null)
-          {
-            connection = authConnManager.create();
-            if (connectionName != null && connectionName.length() > 0)
-              connection.setName(connectionName);
-          }
-
-          // Gather all the data from the form.
-          connection.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            connection.setDescription(x);
-          x = variableContext.getParameter("classname");
-          if (x != null)
-            connection.setClassName(x);
-          x = variableContext.getParameter("maxconnections");
-          if (x != null)
-            connection.setMaxConnections(Integer.parseInt(x));
-          x = variableContext.getParameter("prerequisites_present");
-          if (x != null && x.equals("true"))
-          {
-            String y = variableContext.getParameter("prerequisites");
-            if (y != null && y.length() == 0)
-              y = null;
-            connection.setPrerequisiteMapping(y);
-          }
-          x = variableContext.getParameter("authdomain");
-          if (x != null)
-            connection.setAuthDomain(x);
-          x = variableContext.getParameter("authoritygroup");
-          if (x != null)
-            connection.setAuthGroup(x);
-
-          String error = AuthorityConnectorFactory.processConfigurationPost(threadContext,connection.getClassName(),variableContext,pageContext.getRequest().getLocale(),connection.getConfigParams());
-
-          if (error != null)
-          {
-            variableContext.setParameter("text",error);
-            variableContext.setParameter("target","listauthorities.jsp");
-%>
-            <jsp:forward page="error.jsp"/>
-<%
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("ConnectionObject",connection);
-%>
-            <jsp:forward page="editauthority.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listauthorities.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            authConnManager.save(connection);
-            variableContext.setParameter("connname",connectionName);
-%>
-            <jsp:forward page="viewauthority.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listauthorities.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          authConnManager.delete(connectionName);
-%>
-          <jsp:forward page="listauthorities.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listauthorities.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listauthorities.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to authority execution page");
-        variableContext.setParameter("target","listauthorities.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && type.equals("mapper"))
-    {
-      // -- Mapping editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          IMappingConnection connection = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String connectionName = variableContext.getParameter("connname");
-          // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-          if (connectionName != null && connectionName.length() > 0 && !isNew)
-          {
-            connection = mappingConnManager.load(connectionName);
-          }
-
-          if (connection == null)
-          {
-            connection = mappingConnManager.create();
-            if (connectionName != null && connectionName.length() > 0)
-              connection.setName(connectionName);
-          }
-
-          // Gather all the data from the form.
-          connection.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            connection.setDescription(x);
-          x = variableContext.getParameter("classname");
-          if (x != null)
-            connection.setClassName(x);
-          x = variableContext.getParameter("maxconnections");
-          if (x != null && x.length() > 0)
-            connection.setMaxConnections(Integer.parseInt(x));
-          x = variableContext.getParameter("prerequisites_present");
-          if (x != null && x.equals("true"))
-          {
-            String y = variableContext.getParameter("prerequisites");
-            if (y != null && y.length() == 0)
-              y = null;
-            connection.setPrerequisiteMapping(y);
-          }
-
-          String error = MappingConnectorFactory.processConfigurationPost(threadContext,connection.getClassName(),variableContext,pageContext.getRequest().getLocale(),connection.getConfigParams());
-
-          if (error != null)
-          {
-            variableContext.setParameter("text",error);
-            variableContext.setParameter("target","listmappers.jsp");
-%>
-            <jsp:forward page="error.jsp"/>
-<%
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("ConnectionObject",connection);
-%>
-            <jsp:forward page="editmapper.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listmappers.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            mappingConnManager.save(connection);
-            variableContext.setParameter("connname",connectionName);
-%>
-            <jsp:forward page="viewmapper.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listmappers.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          mappingConnManager.delete(connectionName);
-%>
-          <jsp:forward page="listmappers.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listmappers.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listmappers.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to mapping execution page");
-        variableContext.setParameter("target","listmappers.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && type.equals("output"))
-    {
-      // -- Output connection editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          IOutputConnection connection = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String connectionName = variableContext.getParameter("connname");
-          // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-          if (connectionName != null && connectionName.length() > 0 && !isNew)
-          {
-            connection = outputManager.load(connectionName);
-          }
-
-          if (connection == null)
-          {
-            connection = outputManager.create();
-            if (connectionName != null && connectionName.length() > 0)
-              connection.setName(connectionName);
-          }
-
-          // Gather all the data from the form.
-          connection.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            connection.setDescription(x);
-          x = variableContext.getParameter("classname");
-          if (x != null)
-            connection.setClassName(x);
-          x = variableContext.getParameter("maxconnections");
-          if (x != null && x.length() > 0)
-            connection.setMaxConnections(Integer.parseInt(x));
-
-          String error = OutputConnectorFactory.processConfigurationPost(threadContext,connection.getClassName(),variableContext,pageContext.getRequest().getLocale(),connection.getConfigParams());
-
-          if (error != null)
-          {
-            variableContext.setParameter("text",error);
-            variableContext.setParameter("target","listoutputs.jsp");
-%>
-            <jsp:forward page="error.jsp"/>
-<%
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("ConnectionObject",connection);
-%>
-            <jsp:forward page="editoutput.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listoutputs.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            outputManager.save(connection);
-            variableContext.setParameter("connname",connectionName);
-%>
-            <jsp:forward page="viewoutput.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listoutputs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          outputManager.delete(connectionName);
-%>
-          <jsp:forward page="listoutputs.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listoutputs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listoutputs.jsp"/>
-<%
-      }
-      else if (op.equals("ReingestAll"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          org.apache.manifoldcf.agents.system.ManifoldCF.signalOutputConnectionRedo(threadContext,connectionName);
-%>
-          <jsp:forward page="listoutputs.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listoutputs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("RemoveAll"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          org.apache.manifoldcf.agents.system.ManifoldCF.signalOutputConnectionRemoved(threadContext,connectionName);
-%>
-          <jsp:forward page="listoutputs.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listoutputs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to output connection execution page");
-        variableContext.setParameter("target","listoutputs.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && type.equals("transformation"))
-    {
-      // -- Output connection editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          ITransformationConnection connection = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String connectionName = variableContext.getParameter("connname");
-          // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-          if (connectionName != null && connectionName.length() > 0 && !isNew)
-          {
-            connection = transformationManager.load(connectionName);
-          }
-
-          if (connection == null)
-          {
-            connection = transformationManager.create();
-            if (connectionName != null && connectionName.length() > 0)
-              connection.setName(connectionName);
-          }
-
-          // Gather all the data from the form.
-          connection.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            connection.setDescription(x);
-          x = variableContext.getParameter("classname");
-          if (x != null)
-            connection.setClassName(x);
-          x = variableContext.getParameter("maxconnections");
-          if (x != null && x.length() > 0)
-            connection.setMaxConnections(Integer.parseInt(x));
-
-          String error = TransformationConnectorFactory.processConfigurationPost(threadContext,connection.getClassName(),variableContext,pageContext.getRequest().getLocale(),connection.getConfigParams());
-
-          if (error != null)
-          {
-            variableContext.setParameter("text",error);
-            variableContext.setParameter("target","listtransformations.jsp");
-%>
-            <jsp:forward page="error.jsp"/>
-<%
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("ConnectionObject",connection);
-%>
-            <jsp:forward page="edittransformation.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listtransformations.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            transformationManager.save(connection);
-            variableContext.setParameter("connname",connectionName);
-%>
-            <jsp:forward page="viewtransformation.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listtransformations.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          transformationManager.delete(connectionName);
-%>
-          <jsp:forward page="listtransformations.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listtransformations.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listtransformations.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to transformation connection execution page");
-        variableContext.setParameter("target","listtransformations.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && type.equals("notification"))
-    {
-      // -- Notification connection editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          // Set up a connection object that is a merge of an existing connection object plus what was posted.
-          INotificationConnection connection = null;
-          boolean isNew = true;
-          String x = variableContext.getParameter("isnewconnection");
-          if (x != null)
-            isNew = x.equals("true");
-
-          String connectionName = variableContext.getParameter("connname");
-          // If the connectionname is not null, load the connection description and prepopulate everything with what comes from it.
-          if (connectionName != null && connectionName.length() > 0 && !isNew)
-          {
-            connection = notificationManager.load(connectionName);
-          }
-
-          if (connection == null)
-          {
-            connection = notificationManager.create();
-            if (connectionName != null && connectionName.length() > 0)
-              connection.setName(connectionName);
-          }
-
-          // Gather all the data from the form.
-          connection.setIsNew(isNew);
-          x = variableContext.getParameter("description");
-          if (x != null)
-            connection.setDescription(x);
-          x = variableContext.getParameter("classname");
-          if (x != null)
-            connection.setClassName(x);
-          x = variableContext.getParameter("maxconnections");
-          if (x != null && x.length() > 0)
-            connection.setMaxConnections(Integer.parseInt(x));
-
-          String error = NotificationConnectorFactory.processConfigurationPost(threadContext,connection.getClassName(),variableContext,pageContext.getRequest().getLocale(),connection.getConfigParams());
-
-          if (error != null)
-          {
-            variableContext.setParameter("text",error);
-            variableContext.setParameter("target","listnotifications.jsp");
-%>
-            <jsp:forward page="error.jsp"/>
-<%
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("ConnectionObject",connection);
-%>
-            <jsp:forward page="editnotification.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-            {
-              variableContext.setParameter("target","listnotifications.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            notificationManager.save(connection);
-            variableContext.setParameter("connname",connectionName);
-%>
-            <jsp:forward page="viewnotification.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listnotifications.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String connectionName = variableContext.getParameter("connname");
-          if (connectionName == null)
-            throw new ManifoldCFException("Missing connection parameter");
-          notificationManager.delete(connectionName);
-%>
-          <jsp:forward page="listnotifications.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listnotifications.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-%>
-        <jsp:forward page="listnotifications.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to notification connection execution page");
-        variableContext.setParameter("target","listnotifications.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && type.equals("job"))
-    {
-      // -- Job editing operations --
-      if (op.equals("Save") || op.equals("Continue"))
-      {
-        try
-        {
-          String jobID = variableContext.getParameter("jobid");
-          IJobDescription job = null;
-          if (jobID != null)
-          {
-            job = manager.load(new Long(jobID));
-          }
-          if (job == null)
-            job = manager.createJob();
-
-          // Figure out what got posted.
-          String x = variableContext.getParameter("connectionpresent");
-          boolean connectionPresent = (x != null && x.equals("true"));
-
-          // Gather the rest of the data.
-          x = variableContext.getParameter("description");
-          if (x != null)
-            job.setDescription(x);
-          x = variableContext.getParameter("connectionname");
-          if (x != null)
-            job.setConnectionName(x);
-          x = variableContext.getParameter("scheduletype");
-          if (x != null)
-            job.setType(Integer.parseInt(x));
-          x = variableContext.getParameter("startmethod");
-          if (x != null)
-            job.setStartMethod(Integer.parseInt(x));
-          x = variableContext.getParameter("hopcountmode");
-          if (x != null)
-            job.setHopcountMode(Integer.parseInt(x));
-          x = variableContext.getParameter("pipeline_count");
-          if (x != null)
-          {
-            // Do we need to keep the old specifications around, or can we destroy them?
-            // Not clear that retention is required., so I'm not wasting time trying to implement that.
-            int count = Integer.parseInt(x);
-            job.clearPipeline();
-            for (int j = 0; j < count; j++)
-            {
-              // Gather everything first; we'll look at edits later
-              int precedent = Integer.parseInt(variableContext.getParameter("pipeline_"+j+"_precedent"));
-              boolean isOutput = variableContext.getParameter("pipeline_"+j+"_isoutput").equals("true");
-              String connectionName = variableContext.getParameter("pipeline_"+j+"_connectionname");
-              String description = variableContext.getParameter("pipeline_"+j+"_description");
-              job.addPipelineStage(precedent, isOutput, connectionName, description);
-            }
-          }
-          x = variableContext.getParameter("notification_count");
-          if (x != null)
-          {
-            // Do we need to keep the old specifications around, or can we destroy them?
-            // Not clear that retention is required., so I'm not wasting time trying to implement that.
-            int count = Integer.parseInt(x);
-            job.clearNotifications();
-            for (int j = 0; j < count; j++)
-            {
-              // Gather everything first; we'll look at edits later
-              String connectionName = variableContext.getParameter("notification_"+j+"_connectionname");
-              String description = variableContext.getParameter("notification_"+j+"_description");
-              job.addNotification(connectionName, description);
-            }
-          }
-
-          x = variableContext.getParameter("schedulerecords");
-          String[] y;
-
-          if (x != null)
-          {
-            // Read records and put them into the job description
-            job.clearScheduleRecords();
-            int recordCount = Integer.parseInt(x);
-            int j = 0;
-            while (j < recordCount)
-            {
-              String indexValue = Integer.toString(j);
-              EnumeratedValues srDayOfWeek = null;
-              EnumeratedValues srDayOfMonth = null;
-              EnumeratedValues srMonthOfYear = null;
-              EnumeratedValues srYear = null;
-              EnumeratedValues srHourOfDay = null;
-              EnumeratedValues srMinutesOfHour = null;
-              Long srDuration = null;
-              String srTimezone = null;
-              boolean srRequestMinimum = false;
-
-              srTimezone = variableContext.getParameter("timezone"+indexValue);
-              if (srTimezone != null && srTimezone.length() == 0)
-              {
-                srTimezone = null;
-              }
-              y = variableContext.getParameterValues("dayofweek"+indexValue);
-              if (y != null)
-              {
-                if (y.length >= 1 && y[0].equals("none"))
-                  srDayOfWeek = null;
-                else
-                  srDayOfWeek = new EnumeratedValues(y);
-              }
-              y = variableContext.getParameterValues("dayofmonth"+indexValue);
-              if (y != null)
-              {
-                if (y.length >= 1 && y[0].equals("none"))
-                  srDayOfMonth = null;
-                else
-                  srDayOfMonth = new EnumeratedValues(y);
-              }
-              y = variableContext.getParameterValues("monthofyear"+indexValue);
-              if (y != null)
-              {
-                if (y.length >= 1 && y[0].equals("none"))
-                  srMonthOfYear = null;
-                else
-                  srMonthOfYear = new EnumeratedValues(y);
-              }
-              y = variableContext.getParameterValues("year"+indexValue);
-              if (y != null)
-              {
-                if (y.length >= 1 && y[0].equals("none"))
-                  srYear = null;
-                else
-                  srYear = new EnumeratedValues(y);
-              }
-              y = variableContext.getParameterValues("hourofday"+indexValue);
-              if (y != null)
-              {
-                if (y.length >= 1 && y[0].equals("none"))
-                  srHourOfDay = null;
-                else
-                  srHourOfDay = new EnumeratedValues(y);
-              }
-              y = variableContext.getParameterValues("minutesofhour"+indexValue);
-              if (y != null)
-              {
-                if (y.length >= 1 && y[0].equals("none"))
-                  srMinutesOfHour = null;
-                else
-                  srMinutesOfHour = new EnumeratedValues(y);
-              }
-              x = variableContext.getParameter("duration"+indexValue);
-              if (x != null)
-              {
-                if (x.length() == 0)
-                  srDuration = null;
-                else
-                  srDuration = new Long(new Long(x).longValue()*60000L);
-              }
-              x = variableContext.getParameter("invocation"+indexValue);
-              if (x != null)
-              {
-                srRequestMinimum = x.equals("minimal");
-              }
-
-              x = variableContext.getParameter("recordop"+j);
-              if (x == null || !x.equals("Remove Schedule"))
-              {
-                ScheduleRecord sr = new ScheduleRecord(srDayOfWeek,srMonthOfYear,srDayOfMonth,srYear,srHourOfDay,srMinutesOfHour,
-                  srTimezone,srDuration,srRequestMinimum);
-                job.addScheduleRecord(sr);
-              }
-              j++;
-            }
-          }
-
-          // Check for operation that adds to schedule
-          x = variableContext.getParameter("recordop");
-          if (x != null && x.equals("Add Scheduled Time"))
-          {
-            EnumeratedValues srDayOfWeek = null;
-            EnumeratedValues srDayOfMonth = null;
-            EnumeratedValues srMonthOfYear = null;
-            EnumeratedValues srYear = null;
-            EnumeratedValues srHourOfDay = null;
-            EnumeratedValues srMinutesOfHour = null;
-            String srTimezone = null;
-            Long srDuration = null;
-            boolean srRequestMinimum = false;
-
-            x = variableContext.getParameter("timezone");
-            if (x != null)
-            {
-              srTimezone = x;
-            }
-            y = variableContext.getParameterValues("dayofweek");
-            if (y != null)
-            {
-              if (y.length >= 1 && y[0].equals("none"))
-                srDayOfWeek = null;
-              else
-                srDayOfWeek = new EnumeratedValues(y);
-            }
-            y = variableContext.getParameterValues("dayofmonth");
-            if (y != null)
-            {
-              if (y.length >= 1 && y[0].equals("none"))
-                srDayOfMonth = null;
-              else
-                srDayOfMonth = new EnumeratedValues(y);
-            }
-            y = variableContext.getParameterValues("monthofyear");
-            if (y != null)
-            {
-              if (y.length >= 1 && y[0].equals("none"))
-                srMonthOfYear = null;
-              else
-                srMonthOfYear = new EnumeratedValues(y);
-            }
-            y = variableContext.getParameterValues("year");
-            if (y != null)
-            {
-              if (y.length >= 1 && y[0].equals("none"))
-                srYear = null;
-              else
-                srYear = new EnumeratedValues(y);
-            }
-            y = variableContext.getParameterValues("hourofday");
-            if (y != null)
-            {
-              if (y.length >= 1 && y[0].equals("none"))
-                srHourOfDay = null;
-              else
-                srHourOfDay = new EnumeratedValues(y);
-            }
-            y = variableContext.getParameterValues("minutesofhour");
-            if (y != null)
-            {
-              if (y.length >= 1 && y[0].equals("none"))
-                srMinutesOfHour = null;
-              else
-                srMinutesOfHour = new EnumeratedValues(y);
-            }
-            x = variableContext.getParameter("duration");
-            if (x != null)
-            {
-              if (x.length() == 0)
-                srDuration = null;
-              else
-                srDuration = new Long(new Long(x).longValue() * 60000L);
-            }
-            x = variableContext.getParameter("invocation");
-            if (x != null)
-            {
-              srRequestMinimum = x.equals("minimal");
-            }
-
-            ScheduleRecord sr = new ScheduleRecord(srDayOfWeek,srMonthOfYear,srDayOfMonth,srYear,srHourOfDay,srMinutesOfHour,
-              srTimezone,srDuration,srRequestMinimum);
-            job.addScheduleRecord(sr);
-          }
-
-          x = variableContext.getParameter("priority");
-          if (x != null)
-            job.setPriority(Integer.parseInt(x));
-          x = variableContext.getParameter("recrawlinterval");
-          if (x != null)
-          {
-            if (x.length() == 0)
-              job.setInterval(null);
-            else
-              job.setInterval(new Long(new Long(x).longValue() * 60000L));
-          }
-          x = variableContext.getParameter("maxrecrawlinterval");
-          if (x != null)
-          {
-            if (x.length() == 0)
-              job.setMaxInterval(null);
-            else
-              job.setMaxInterval(new Long(new Long(x).longValue() * 60000L));
-          }
-          x = variableContext.getParameter("reseedinterval");
-          if (x != null)
-          {
-            if (x.length() == 0)
-              job.setReseedInterval(null);
-            else
-              job.setReseedInterval(new Long(new Long(x).longValue() * 60000L));
-          }
-          x = variableContext.getParameter("expirationinterval");
-          if (x != null)
-          {
-            if (x.length() == 0)
-              job.setExpiration(null);
-            else
-              job.setExpiration(new Long(new Long(x).longValue() * 60000L));
-          }
-
-          IRepositoryConnection connection = null;
-          if (job.getConnectionName() != null && job.getConnectionName().length() > 0)
-            connection = connManager.load(job.getConnectionName());
-
-          if (connection != null)
-          {
-            String[] relationshipTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-
-            // Gather hopcount filters
-            x = variableContext.getParameter("hopfilters");
-            if (x != null && relationshipTypes != null)
-            {
-              job.clearHopCountFilters();
-              int j = 0;
-              while (j < relationshipTypes.length)
-              {
-                String relationshipType = relationshipTypes[j++];
-                x = variableContext.getParameter("hopmax_"+relationshipType);
-                if (x != null && x.length() > 0)
-                {
-                  job.addHopCountFilter(relationshipType,new Long(x));
-                }
-              }
-            }
-          }
-
-          if (connectionPresent && connection != null)
-          {
-            IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
-            if (repositoryConnector != null)
-            {
-              try
-              {
-                String error = repositoryConnector.processSpecificationPost(variableContext,pageContext.getRequest().getLocale(),job.getSpecification(),0);
-                if (error != null)
-                {
-                  variableContext.setParameter("text",error);
-                  variableContext.setParameter("target","listjobs.jsp");
-%>
-                  <jsp:forward page="error.jsp"/>
-<%
-                }
-              }
-              finally
-              {
-                repositoryConnectorPool.release(connection,repositoryConnector);
-              }
-            }
-          }
-
-          // Process all pipeline stages
-          for (int j = 0; j < job.countPipelineStages(); j++)
-          {
-            if (job.getPipelineStageIsOutputConnection(j))
-            {
-              IOutputConnection outputConnection = outputManager.load(job.getPipelineStageConnectionName(j));
-              if (outputConnection != null)
-              {
-                IOutputConnector outputConnector = outputConnectorPool.grab(outputConnection);
-                if (outputConnector != null)
-                {
-                  try
-                  {
-                    String error = outputConnector.processSpecificationPost(variableContext,pageContext.getRequest().getLocale(),job.getPipelineStageSpecification(j),1+j);
-                    if (error != null)
-                    {
-                      variableContext.setParameter("text",error);
-                      variableContext.setParameter("target","listjobs.jsp");
-%>
-                  <jsp:forward page="error.jsp"/>
-<%
-                    }
-                  }
-                  finally
-                  {
-                    outputConnectorPool.release(outputConnection,outputConnector);
-                  }
-                }
-              }
-            }
-            else
-            {
-              ITransformationConnection transformationConnection = transformationManager.load(job.getPipelineStageConnectionName(j));
-              if (transformationConnection != null)
-              {
-                ITransformationConnector transformationConnector = transformationConnectorPool.grab(transformationConnection);
-                if (transformationConnector != null)
-                {
-                  try
-                  {
-                    String error = transformationConnector.processSpecificationPost(variableContext,pageContext.getRequest().getLocale(),job.getPipelineStageSpecification(j),1+j);
-                    if (error != null)
-                    {
-                      variableContext.setParameter("text",error);
-                      variableContext.setParameter("target","listjobs.jsp");
-%>
-                  <jsp:forward page="error.jsp"/>
-<%
-                    }
-                  }
-                  finally
-                  {
-                    transformationConnectorPool.release(transformationConnection,transformationConnector);
-                  }
-                }
-              }
-            }
-          }
-
-          for (int j = 0; j < job.countNotifications(); j++)
-          {
-            INotificationConnection notificationConnection = notificationManager.load(job.getNotificationConnectionName(j));
-            if (notificationConnection != null)
-            {
-              INotificationConnector notificationConnector = notificationConnectorPool.grab(notificationConnection);
-              if (notificationConnector != null)
-              {
-                try
-                {
-                  String error = notificationConnector.processSpecificationPost(variableContext,pageContext.getRequest().getLocale(),job.getNotificationSpecification(j),1+job.countPipelineStages()+j);
-                  if (error != null)
-                  {
-                    variableContext.setParameter("text",error);
-                    variableContext.setParameter("target","listjobs.jsp");
-%>
-                  <jsp:forward page="error.jsp"/>
-<%
-                  }
-                }
-                finally
-                {
-                  notificationConnectorPool.release(notificationConnection,notificationConnector);
-                }
-              }
-            }
-          }
-
-          // Now, after gathering is complete, consider doing changes to the pipeline.
-          int currentStage = 0;
-          for (int j = 0; j < job.countPipelineStages(); j++)
-          {
-            // Look at the operation
-            x = variableContext.getParameter("pipeline_"+j+"_op");
-            if (x != null && x.equals("Delete"))
-            {
-              // Delete this pipeline stage (and rewire other stages according to rules)
-              job.deletePipelineStage(currentStage);
-            }
-            else if (x != null && x.equals("InsertTransformation"))
-            {
-              // Insert a new stage before this one
-              String connectionName = variableContext.getParameter("transformation_connectionname");
-              String description = variableContext.getParameter("transformation_description");
-              job.insertPipelineStage(currentStage,false,connectionName,description);
-              currentStage++;
-            }
-            else if (x != null && x.equals("InsertOutput"))
-            {
-              // Insert a new stage before this one
-              String connectionName = variableContext.getParameter("output_connectionname");
-              String description = variableContext.getParameter("output_description");
-              job.insertPipelineStage(currentStage,true,connectionName,description);
-              currentStage++;
-            }
-            else
-              currentStage++;
-          }
-
-          x = variableContext.getParameter("output_op");
-          if (x != null && x.equals("Add"))
-          {
-            // Append a new stage at the end
-            int precedent = Integer.parseInt(variableContext.getParameter("output_precedent"));
-            String connectionName = variableContext.getParameter("output_connectionname");
-            String description = variableContext.getParameter("output_description");
-            job.addPipelineStage(precedent,true,connectionName,description);
-          }
-
-          currentStage = 0;
-          for (int j = 0; j < job.countNotifications(); j++)
-          {
-            // Look at the operation
-            x = variableContext.getParameter("notification_"+j+"_op");
-            if (x != null && x.equals("Delete"))
-            {
-              // Delete this pipeline stage (and rewire other stages according to rules)
-              job.deleteNotification(currentStage);
-            }
-            else
-              currentStage++;
-          }
-          x = variableContext.getParameter("notification_op");
-          if (x != null && x.equals("Add"))
-          {
-            // Append a new stage at the end
-            String connectionName = variableContext.getParameter("notification_connectionname");
-            String description = variableContext.getParameter("notification_description");
-            job.addNotification(connectionName,description);
-          }
-
-          if (op.equals("Continue"))
-          {
-            threadContext.save("JobObject",job);
-%>
-            <jsp:forward page="editjob.jsp"/>
-<%
-          }
-          else if (op.equals("Save"))
-          {
-            // Check if authorized
-            if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_EDIT_JOBS))
-            {
-              variableContext.setParameter("target","listjobs.jsp");
-%>
-                  <jsp:forward page="unauthorized.jsp"/>
-<%
-            }
-
-            manager.save(job);
-            // Reset the job schedule. We may want to make this explicit at some point; having
-            // this happen all the time seems wrong.
-            manager.resetJobSchedule(job.getID());
-            variableContext.setParameter("jobid",job.getID().toString());
-%>
-            <jsp:forward page="viewjob.jsp"/>
-<%
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listjobs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("StartOver"))
-      {
-        try
-        {
-          String jobID = variableContext.getParameter("jobid");
-          if (jobID == null)
-            throw new ManifoldCFException("Missing job parameter");
-          manager.clearJobSeedingState(new Long(jobID));
-%>
-          <jsp:forward page="listjobs.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listjobs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Delete"))
-      {
-        try
-        {
-          String jobID = variableContext.getParameter("jobid");
-          if (jobID == null)
-            throw new ManifoldCFException("Missing job parameter");
-          manager.deleteJob(new Long(jobID));
-%>
-          <jsp:forward page="listjobs.jsp"/>
-<%
-        }
-        catch (ManifoldCFException e)
-        {
-          e.printStackTrace();
-          variableContext.setParameter("text",e.getMessage());
-          variableContext.setParameter("target","listjobs.jsp");
-%>
-          <jsp:forward page="error.jsp"/>
-<%
-        }
-      }
-      else if (op.equals("Cancel"))
-      {
-        // Cancel operation
-%>
-        <jsp:forward page="listjobs.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to job definition execution page: "+op);
-        variableContext.setParameter("target","listjobs.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (type != null && op != null && (type.equals("simplereport") || type.equals("maxactivityreport") ||
-        type.equals("maxbandwidthreport") || type.equals("resultreport") ||
-        type.equals("documentstatus") || type.equals("queuestatus")))
-    {
-      // -- Report handling operations --
-      if (op.equals("Continue") || op.equals("Report") || op.equals("Status"))
-      {
-%>
-        <jsp:forward page='<%=type+".jsp"%>'/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to report/status execution page: "+op);
-        variableContext.setParameter("target","index.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else if (op != null && type != null && type.equals("jobstatus"))
-    {
-      if (op.equals("Start") || op.equals("StartMinimal"))
-      {
-        // -- Start a job --
-        String jobID = variableContext.getParameter("jobid");
-        manager.manualStart(new Long(jobID),op.equals("StartMinimal"));
-        // Forward to showjobstatus
-%>
-        <jsp:forward page="showjobstatus.jsp"/>
-<%
-      }
-      else if (op.equals("Pause"))
-      {
-        // -- Pause a job --
-        String jobID = variableContext.getParameter("jobid");
-        manager.pauseJob(new Long(jobID));
-        // Forward to showjobstatus
-%>
-        <jsp:forward page="showjobstatus.jsp"/>
-<%
-      }
-      else if (op.equals("Abort"))
-      {
-        // -- Abort a job --
-        String jobID = variableContext.getParameter("jobid");
-        manager.manualAbort(new Long(jobID));
-        // Forward to showjobstatus
-%>
-        <jsp:forward page="showjobstatus.jsp"/>
-<%
-      }
-      else if (op.equals("Restart") || op.equals("RestartMinimal"))
-      {
-        // -- Restart a job --
-        String jobID = variableContext.getParameter("jobid");
-        manager.manualAbortRestart(new Long(jobID),op.equals("RestartMinimal"));
-        // Forward to showjobstatus
-%>
-        <jsp:forward page="showjobstatus.jsp"/>
-<%
-      }
-      else if (op.equals("Resume"))
-      {
-        // -- Resume a job --
-        String jobID = variableContext.getParameter("jobid");
-        manager.restartJob(new Long(jobID));
-        // Forward to showjobstatus
-%>
-        <jsp:forward page="showjobstatus.jsp"/>
-<%
-      }
-      else
-      {
-        // Error
-        variableContext.setParameter("text","Illegal parameter to jobstatus execution page: "+op);
-        variableContext.setParameter("target","index.jsp");
-%>
-        <jsp:forward page="error.jsp"/>
-<%
-      }
-    }
-    else
-    {
-      /*
-      // If we didn't have an op, then we transfer control back to where the page said to.
-      String target = variableContext.getParameter("target");
-      if (target != null)
-      {
-        <jsp:forward page='<%=target%'/>
-      }
-
-      <jsp:forward page="index.jsp"/>
-      */
-
-      // Error
-      variableContext.setParameter("text","Illegal parameter to page");
-      variableContext.setParameter("target","index.jsp");
-%>
-      <jsp:forward page="error.jsp"/>
-<%
-    }
-  }
-  catch (ManifoldCFException e)
-  {
-    e.printStackTrace();
-    variableContext.setParameter("text",e.getMessage());
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="error.jsp"/>
-<%
-  }
-%>
diff --git a/framework/crawler-ui/src/main/webapp/fonts/FontAwesome.otf b/framework/crawler-ui/src/main/webapp/fonts/FontAwesome.otf
deleted file mode 100644
index 401ec0f..0000000
--- a/framework/crawler-ui/src/main/webapp/fonts/FontAwesome.otf
+++ /dev/null
Binary files differ
diff --git a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.eot b/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.eot
deleted file mode 100644
index e9f60ca..0000000
--- a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.eot
+++ /dev/null
Binary files differ
diff --git a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.svg b/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 855c845..0000000
--- a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg>
-<metadata>
-Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
- By ,,,
-Copyright Dave Gandy 2016. All rights reserved.
-</metadata>
-<defs>
-<font id="FontAwesome" horiz-adv-x="1536" >
-  <font-face 
-    font-family="FontAwesome"
-    font-weight="400"
-    font-stretch="normal"
-    units-per-em="1792"
-    panose-1="0 0 0 0 0 0 0 0 0 0"
-    ascent="1536"
-    descent="-256"
-    bbox="-1.02083 -256.962 2304.6 1537.02"
-    underline-thickness="0"
-    underline-position="0"
-    unicode-range="U+0020-F500"
-  />
-<missing-glyph horiz-adv-x="896" 
-d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
-    <glyph glyph-name=".notdef" horiz-adv-x="896" 
-d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
-    <glyph glyph-name=".null" horiz-adv-x="0" 
- />
-    <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" 
- />
-    <glyph glyph-name="space" unicode=" " horiz-adv-x="448" 
- />
-    <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792" 
-d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
-    <glyph glyph-name="music" unicode="&#xf001;" 
-d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
-t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" 
-d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
-t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-    <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792" 
-d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
-t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
-M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" 
-d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
-q-18 -18 -44 -18z" />
-    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" 
-d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
-l502 -73q56 -9 56 -46z" />
-    <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664" 
-d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
-l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
-    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" 
-d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
-t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-    <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" 
-d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
-q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
-t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
-q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
-t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664" 
-d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
-h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" 
-d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
-h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
-q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792" 
-d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
-h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792" 
-d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
-    <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408" 
-d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
-t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
-    <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664" 
-d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
-q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
-t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-    <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664" 
-d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
-M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
-" />
-    <glyph glyph-name="off" unicode="&#xf011;" 
-d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
-t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
-    <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" 
-d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
-v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="cog" unicode="&#xf013;" 
-d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
-q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
-l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
-q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
-    <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408" 
-d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
-q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
-q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664" 
-d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
-l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
-    <glyph glyph-name="file_alt" unicode="&#xf016;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-" />
-    <glyph glyph-name="time" unicode="&#xf017;" 
-d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920" 
-d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
-q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
-    <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664" 
-d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
-q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
-    <glyph glyph-name="download" unicode="&#xf01a;" 
-d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
-t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="upload" unicode="&#xf01b;" 
-d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
-t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="inbox" unicode="&#xf01c;" 
-d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
-q25 -61 25 -123z" />
-    <glyph glyph-name="play_circle" unicode="&#xf01d;" 
-d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="repeat" unicode="&#xf01e;" 
-d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
-l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
-    <glyph glyph-name="refresh" unicode="&#xf021;" 
-d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
-q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
-q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
-    <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792" 
-d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
-M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
-t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
-t47 -113z" />
-    <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" 
-d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792" 
-d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
-t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" 
-d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
-t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
-t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
-    <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768" 
-d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
-    <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152" 
-d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
-t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
-    <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664" 
-d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
-t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
-t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
-t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
-    <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408" 
-d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
-M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
-    <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792" 
-d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
-M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
-    <glyph glyph-name="tag" unicode="&#xf02b;" 
-d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
-l715 -714q37 -39 37 -91z" />
-    <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920" 
-d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
-l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
-    <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" 
-d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
-q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
-q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
-t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" 
-d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-    <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" 
-d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
-v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
-    <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" 
-d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
-q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" 
-d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
-q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
-q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
-    <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" 
-d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
-q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
-t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
-t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
-    <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" 
-d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
-q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
-    <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792" 
-d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
-t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
-q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
-q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
-    <glyph glyph-name="text_width" unicode="&#xf035;" 
-d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
-t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
-q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
-t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
-t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
-    <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792" 
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
-t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792" 
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
-h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792" 
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
-t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792" 
-d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
-t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" 
-d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
-t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
-q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
-t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
-q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
-    <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792" 
-d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
-t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
-q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-    <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792" 
-d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
-t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
-q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-    <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792" 
-d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
-q39 -17 39 -59z" />
-    <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920" 
-d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
-q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="pencil" unicode="&#xf040;" 
-d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
-q53 0 91 -38l235 -234q37 -39 37 -91z" />
-    <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024" 
-d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
-    <glyph glyph-name="adjust" unicode="&#xf042;" 
-d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" 
-d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
-q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
-    <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792" 
-d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
-q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
-l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
-    <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664" 
-d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
-q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
-t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
-    <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664" 
-d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
-q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
-q24 -24 24 -57t-24 -57z" />
-    <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792" 
-d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
-t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-    <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024" 
-d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" />
-    <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792" 
-d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
-q19 19 32 13t13 -32v-710q4 10 13 19z" />
-    <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664" 
-d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" />
-    <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408" 
-d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
-    <glyph glyph-name="pause" unicode="&#xf04c;" 
-d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="stop" unicode="&#xf04d;" 
-d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664" 
-d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
-    <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792" 
-d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
-q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
-    <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024" 
-d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" />
-    <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" 
-d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
-    <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280" 
-d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
-    <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280" 
-d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
-    <glyph glyph-name="plus_sign" unicode="&#xf055;" 
-d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
-t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="minus_sign" unicode="&#xf056;" 
-d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
-t103 -385.5z" />
-    <glyph glyph-name="remove_sign" unicode="&#xf057;" 
-d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
-q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="ok_sign" unicode="&#xf058;" 
-d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="question_sign" unicode="&#xf059;" 
-d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
-q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="info_sign" unicode="&#xf05a;" 
-d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
-t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="screenshot" unicode="&#xf05b;" 
-d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
-q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
-q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="remove_circle" unicode="&#xf05c;" 
-d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
-l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
-t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="ok_circle" unicode="&#xf05d;" 
-d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
-t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="ban_circle" unicode="&#xf05e;" 
-d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
-t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
-    <glyph glyph-name="arrow_left" unicode="&#xf060;" 
-d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
-t32.5 -90.5z" />
-    <glyph glyph-name="arrow_right" unicode="&#xf061;" 
-d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
-    <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664" 
-d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
-q37 -39 37 -91z" />
-    <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664" 
-d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-    <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792" 
-d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
-t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
-    <glyph glyph-name="resize_full" unicode="&#xf065;" 
-d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
-q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="resize_small" unicode="&#xf066;" 
-d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
-t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
-    <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" 
-d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" 
-d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664" 
-d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
-q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
-    <glyph glyph-name="exclamation_sign" unicode="&#xf06a;" 
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
-q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
-    <glyph glyph-name="gift" unicode="&#xf06b;" 
-d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
-q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
-t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" 
-d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
-q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
-t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
-    <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" 
-d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
-q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
-    <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792" 
-d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
-t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
-    <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792" 
-d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
-q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
-q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
-" />
-    <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792" 
-d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
-q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
-    <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408" 
-d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
-q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
-    <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664" 
-d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
-M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
-q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
-h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" 
-d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
-t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
-v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
-t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-    <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" 
-d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
-q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
-    <glyph glyph-name="magnet" unicode="&#xf076;" 
-d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
-q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792" 
-d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
-    <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792" 
-d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
-    <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" 
-d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
-zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
-" />
-    <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664" 
-d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
-t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664" 
-d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-    <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920" 
-d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
-t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
-    <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768" 
-d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
-    <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792" 
-d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-    <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048" 
-d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
-    <glyph glyph-name="twitter_sign" unicode="&#xf081;" 
-d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
-q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
-t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="facebook_sign" unicode="&#xf082;" 
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
-q0 119 84.5 203.5t203.5 84.5h960z" />
-    <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792" 
-d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
-t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
-q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
-    <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792" 
-d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
-l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
-t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
-    <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" 
-d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
-t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
-l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
-l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
-q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
-t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
-q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
-q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
-    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" 
-d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
-q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
-q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
-    <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;" 
-d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
-t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
-q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
-q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
-    <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;" 
-d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
-t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
-M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
-h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" />
-    <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896" 
-d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
-    <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792" 
-d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
-q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
-q224 0 351 -124t127 -344z" />
-    <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664" 
-d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
-q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
-    <glyph glyph-name="linkedin_sign" unicode="&#xf08c;" 
-d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
-q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152" 
-d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
-t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
-    <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792" 
-d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
-q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="signin" unicode="&#xf090;" 
-d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
-q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" 
-d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
-t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
-q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="github_sign" unicode="&#xf092;" 
-d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
-q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
-t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
-q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664" 
-d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
-t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
-    <glyph glyph-name="lemon" unicode="&#xf094;" 
-d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
-q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
-q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
-q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" />
-    <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" 
-d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
-q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
-t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
-    <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408" 
-d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
-q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280" 
-d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
-q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-    <glyph glyph-name="phone_sign" unicode="&#xf098;" 
-d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
-t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
-t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
-" />
-    <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664" 
-d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
-q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
-    <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024" 
-d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
-    <glyph glyph-name="github" unicode="&#xf09b;" 
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
-q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
-t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
-q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
-M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
-    <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" 
-d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
-t316.5 -131.5t131.5 -316.5z" />
-    <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920" 
-d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
-q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-    <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" 
-d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
-t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
-q187 -186 294 -425.5t120 -501.5z" />
-    <glyph glyph-name="hdd" unicode="&#xf0a0;" 
-d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
-h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
-l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
-    <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" 
-d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
-t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
-    <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792" 
-d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
-M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
-t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
-    <glyph glyph-name="certificate" unicode="&#xf0a3;" 
-d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
-l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
-l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
-    <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792" 
-d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
-q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
-q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
-t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
-    <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792" 
-d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
-t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
-M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
-q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
-    <glyph glyph-name="hand_up" unicode="&#xf0a6;" 
-d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
-q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
-t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
-q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
-    <glyph glyph-name="hand_down" unicode="&#xf0a7;" 
-d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
-t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
-q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
-q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
-    <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;" 
-d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;" 
-d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;" 
-d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;" 
-d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="globe" unicode="&#xf0ac;" 
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
-q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
-q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
-q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
-t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
-q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
-q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
-t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
-t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
-q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
-q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
-q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
-t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
-q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
-q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
-    <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664" 
-d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
-t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
-    <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" 
-d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
-t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" 
-d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
-    <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" 
-d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
-t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="fullscreen" unicode="&#xf0b2;" 
-d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
-l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
-" />
-    <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920" 
-d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
-t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
-t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
-t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
-    <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664" 
-d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
-l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
-t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
-q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
-    <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" 
-d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
-" />
-    <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664" 
-d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
-    <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792" 
-d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
-q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
-q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
-q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
-q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
-    <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792" 
-d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
-h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
-    <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408" 
-d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
-l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
-z" />
-    <glyph glyph-name="save" unicode="&#xf0c7;" 
-d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
-h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
-    <glyph glyph-name="sign_blank" unicode="&#xf0c8;" 
-d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="reorder" unicode="&#xf0c9;" 
-d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
-t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792" 
-d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
-t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
-M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-    <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792" 
-d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
-q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
-t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
-q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-    <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" 
-d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
-l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
-l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
-    <glyph glyph-name="underline" unicode="&#xf0cd;" 
-d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
-q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
-q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
-q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
-    <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" 
-d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
-v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
-q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
-q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
-z" />
-    <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664" 
-d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
-l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
-    <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792" 
-d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
-t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
-t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="pinterest" unicode="&#xf0d2;" 
-d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
-q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
-q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;" 
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
-t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
-t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
-    <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;" 
-d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
-h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304" 
-d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
-q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
-    <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" 
-d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
-v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024" 
-d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024" 
-d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-    <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640" 
-d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
-    <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640" 
-d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
-    <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" 
-d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" 
-d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-    <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024" 
-d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024" 
-d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-    <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792" 
-d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
-q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
-    <glyph glyph-name="linkedin" unicode="&#xf0e1;" 
-d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
-q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
-    <glyph glyph-name="undo" unicode="&#xf0e2;" 
-d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
-t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
-    <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792" 
-d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
-t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
-q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
-q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
-    <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792" 
-d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
-t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
-t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
-q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792" 
-d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
-q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
-t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-    <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792" 
-d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
-t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
-t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
-q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
-    <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" 
-d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
-    <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" 
-d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
-q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
-z" />
-    <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" 
-d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
-q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
-q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
-    <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792" 
-d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
-h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
-    <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024" 
-d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
-q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
-q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
-t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
-    <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" 
-d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
-q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-    <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920" 
-d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
-q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-    <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920" 
-d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
-q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-    <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408" 
-d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
-t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
-t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
-t271.5 -112.5t112.5 -271.5z" />
-    <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" 
-d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
-t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
-t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
-    <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" 
-d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
-t66 -158z" />
-    <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792" 
-d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
-t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
-    <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920" 
-d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
-t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
-    <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408" 
-d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
-t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="file_text_alt" unicode="&#xf0f6;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
-q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
-    <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408" 
-d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408" 
-d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
-M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
-t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
-v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920" 
-d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
-t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
-q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" 
-d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
-q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
-    <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920" 
-d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
-q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" />
-    <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664" 
-d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
-    <glyph glyph-name="h_sign" unicode="&#xf0fd;" 
-d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="f0fe" unicode="&#xf0fe;" 
-d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024" 
-d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
-t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
-    <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024" 
-d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
-l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-    <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152" 
-d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
-q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-    <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152" 
-d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
-t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-    <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640" 
-d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-    <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640" 
-d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-    <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152" 
-d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-    <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152" 
-d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-    <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" 
-d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
-t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" 
-d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
-M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
-    <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" 
-d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
-q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768" 
-d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
-q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="circle_blank" unicode="&#xf10c;" 
-d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
-t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664" 
-d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
-M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
-    <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664" 
-d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
-v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
-    <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792" 
-d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
-t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
-M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
-q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
-    <glyph glyph-name="circle" unicode="&#xf111;" 
-d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792" 
-d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
-l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
-    <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664" 
-d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
-q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
-t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
-q0 -87 -27 -168q136 -160 136 -398z" />
-    <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664" 
-d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
-q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-    <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920" 
-d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
-v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
-" />
-    <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="smile" unicode="&#xf118;" 
-d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
-t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
-t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="frown" unicode="&#xf119;" 
-d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
-t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
-t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="meh" unicode="&#xf11a;" 
-d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
-t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" 
-d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
-t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
-t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
-    <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920" 
-d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
-h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
-h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
-q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
-h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
-    <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792" 
-d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9
-h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102
-q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-    <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792" 
-d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2
-q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266
-q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8
-q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-    <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664" 
-d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9
-t9 -23z" />
-    <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920" 
-d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5
-l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
-    <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792" 
-d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1
-q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
-    <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664" 
-d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5
-l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
-    <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408" 
-d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
-    <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" 
-d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23
-v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024" 
-d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5
-q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497
-q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
-    <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664" 
-d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320
-q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18
-l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9
-t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-    <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024" 
-d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5
-t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
-    <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640" 
-d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192
-q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640" 
-d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
-    <glyph glyph-name="superscript" unicode="&#xf12b;" 
-d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
-M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5
-t-65.5 -51.5t-30.5 -63h232v80h126z" />
-    <glyph glyph-name="subscript" unicode="&#xf12c;" 
-d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
-M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73
-h232v80h126z" />
-    <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920" 
-d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
-    <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664" 
-d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5
-t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89
-q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117
-q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
-    <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" 
-d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5
-t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
-    <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408" 
-d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128
-q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23
-t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
-    <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" 
-d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150
-t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664" 
-d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
-q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408" 
-d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800
-q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113
-q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
-    <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664" 
-d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1
-q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
-    <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792" 
-d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
-    <glyph glyph-name="chevron_sign_left" unicode="&#xf137;" 
-d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="chevron_sign_right" unicode="&#xf138;" 
-d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="chevron_sign_up" unicode="&#xf139;" 
-d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;" 
-d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
-t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408" 
-d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
-    <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792" 
-d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
-    <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" 
-d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352
-q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19
-t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152" 
-d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181
-v-320h736z" />
-    <glyph glyph-name="bullseye" unicode="&#xf140;" 
-d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150
-t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
-q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408" 
-d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384" 
-d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192
-q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-    <glyph glyph-name="_303" unicode="&#xf143;" 
-d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128
-q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="play_sign" unicode="&#xf144;" 
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56
-q16 -8 32 -8q17 0 32 9z" />
-    <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792" 
-d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136
-t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
-    <glyph glyph-name="minus_sign_alt" unicode="&#xf146;" 
-d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
-t84.5 -203.5z" />
-    <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408" 
-d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5
-t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024" 
-d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
-    <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024" 
-d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
-    <glyph glyph-name="check_sign" unicode="&#xf14a;" 
-d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5
-t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="edit_sign" unicode="&#xf14b;" 
-d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120
-v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_312" unicode="&#xf14c;" 
-d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960
-q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="share_sign" unicode="&#xf14d;" 
-d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5
-t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="compass" unicode="&#xf14e;" 
-d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="collapse" unicode="&#xf150;" 
-d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120
-v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="collapse_top" unicode="&#xf151;" 
-d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_317" unicode="&#xf152;" 
-d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5
-t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024" 
-d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9
-t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26
-l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
-    <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024" 
-d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7
-q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
-    <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024" 
-d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43
-t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5
-t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50
-t53 -63.5t31.5 -76.5t13 -94z" />
-    <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" 
-d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102
-q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027" 
-d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61
-l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
-    <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" 
-d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128
-q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
-    <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" 
-d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23
-t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28
-q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280" 
-d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164
-l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30
-t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
-    <glyph glyph-name="file" unicode="&#xf15b;" 
-d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
-    <glyph glyph-name="file_text" unicode="&#xf15c;" 
-d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704
-q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
-    <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664" 
-d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23
-v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162
-l230 -662h70z" />
-    <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664" 
-d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150
-v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248
-v119h121z" />
-    <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792" 
-d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832
-q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256
-q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792" 
-d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192
-q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832
-q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="sort_by_order" unicode="&#xf162;" 
-d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23
-zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5
-t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
-    <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;" 
-d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9
-t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13
-q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
-    <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664" 
-d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76
-q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5
-t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
-    <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664" 
-d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135
-t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121
-t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
-    <glyph glyph-name="youtube_sign" unicode="&#xf166;" 
-d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15
-q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38
-q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5
-q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38
-q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5
-h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="youtube" unicode="&#xf167;" 
-d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73
-q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51
-q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99
-q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51
-q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
-    <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" 
-d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942
-q25 45 64 45h241q22 0 31 -15z" />
-    <glyph glyph-name="xing_sign" unicode="&#xf169;" 
-d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1
-l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792" 
-d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5
-l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136
-q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" />
-    <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792" 
-d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
-    <glyph glyph-name="stackexchange" unicode="&#xf16c;" 
-d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
-    <glyph glyph-name="instagram" unicode="&#xf16d;" 
-d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270
-q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5
-t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317
-q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
-    <glyph glyph-name="flickr" unicode="&#xf16e;" 
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150
-t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
-    <glyph glyph-name="adn" unicode="&#xf170;" 
-d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408" 
-d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22
-t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18
-t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5
-t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
-    <glyph glyph-name="bitbucket_sign" unicode="&#xf172;" 
-d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5
-t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z
-M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120
-v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024" 
-d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14
-q78 2 134 29z" />
-    <glyph glyph-name="tumblr_sign" unicode="&#xf174;" 
-d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z
-M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768" 
-d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
-    <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768" 
-d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
-    <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792" 
-d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792" 
-d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
-    <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408" 
-d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65
-q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
-    <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664" 
-d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
-    <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" 
-d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30
-t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5
-h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
-    <glyph glyph-name="linux" unicode="&#xf17c;" 
-d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z
-M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7
-q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15
-q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5
-t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19
-q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63
-q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92
-q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152
-q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4
-t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5
-t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43
-q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49
-t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54
-q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5
-t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5
-t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
-    <glyph glyph-name="dribble" unicode="&#xf17d;" 
-d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81
-t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19
-q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6
-t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="skype" unicode="&#xf17e;" 
-d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5
-t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5
-q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80
-q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
-    <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280" 
-d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z
-M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324
-l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
-    <glyph glyph-name="trello" unicode="&#xf181;" 
-d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408
-q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" 
-d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43
-q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-    <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" 
-d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z
-M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-    <glyph glyph-name="gittip" unicode="&#xf184;" 
-d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792" 
-d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4
-l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94
-q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
-    <glyph glyph-name="_366" unicode="&#xf186;" 
-d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61
-t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
-    <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792" 
-d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536
-q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664" 
-d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207
-q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19
-t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
-    <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920" 
-d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58
-t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6
-q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24
-q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2
-q39 5 64 -2.5t31 -16.5z" />
-    <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" 
-d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12
-q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422
-q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178
-q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z
-M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
-    <glyph glyph-name="renren" unicode="&#xf18b;" 
-d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495
-q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
-    <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408" 
-d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5
-t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56
-t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5
-t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
-    <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280" 
-d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z
-" />
-    <glyph glyph-name="_374" unicode="&#xf18e;" 
-d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
-t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;" 
-d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
-t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_376" unicode="&#xf191;" 
-d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z
-M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="dot_circle_alt" unicode="&#xf192;" 
-d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5
-t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664" 
-d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128
-q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
-    <glyph glyph-name="vimeo_square" unicode="&#xf194;" 
-d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179
-q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152" 
-d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160
-q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408" 
-d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832
-q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176" 
-d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40
-t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29
-q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
-    <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664" 
-d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9
-q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102
-t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
-    <glyph glyph-name="_384" unicode="&#xf199;" 
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69
-q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13
-t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
-    <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792" 
-d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5
-t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21
-t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286
-t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273
-t273 -182.5t331.5 -68z" />
-    <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792" 
-d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
-    <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048" 
-d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64
-q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
-    <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304" 
-d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433
-q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
-    <glyph glyph-name="_389" unicode="&#xf19e;" 
-d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0
-q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
-    <glyph glyph-name="uniF1A0" unicode="&#xf1a0;" 
-d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5
-t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
-    <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792" 
-d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26
-t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37
-q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191
-t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="_392" unicode="&#xf1a2;" 
-d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54
-q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83
-q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
-q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_393" unicode="&#xf1a3;" 
-d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150
-v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103
-t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920" 
-d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328
-v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
-    <glyph glyph-name="_395" unicode="&#xf1a5;" 
-d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
-t84.5 -203.5z" />
-    <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048" 
-d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
-v-369h123z" />
-    <glyph glyph-name="_397" unicode="&#xf1a7;" 
-d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101
-v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
-q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038" 
-d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14
-q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24
-q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33
-q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5
-t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43
-q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5
-t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13
-t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
-    <glyph glyph-name="_399" unicode="&#xf1a9;" 
-d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10
-q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14
-q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14
-t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44
-q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
-    <glyph glyph-name="_400" unicode="&#xf1aa;" 
-d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z
-M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5
-t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5
-q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126
-t135.5 51q85 0 145 -60.5t60 -145.5z" />
-    <glyph glyph-name="f1ab" unicode="&#xf1ab;" 
-d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5
-q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28
-q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z
-M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11
-q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5
-q20 0 20 -21v-418z" />
-    <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792" 
-d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48
-l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23
-t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128
-q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128
-q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
-    <glyph glyph-name="_403" unicode="&#xf1ad;" 
-d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9
-t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64
-q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
-q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9
-t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64
-q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
-q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9
-t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
-    <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280" 
-d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152
-q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-    <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664" 
-d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5
-q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819
-q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5
-t100.5 134t141.5 55.5z" />
-    <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768" 
-d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
-    <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792" 
-d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z
-" />
-    <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304" 
-d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67
-t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70
-v-400l434 -186q36 -16 57 -48t21 -70z" />
-    <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048" 
-d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658
-q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204
-q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
-    <glyph glyph-name="_410" unicode="&#xf1b5;" 
-d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5
-t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217
-t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
-    <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792" 
-d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5
-q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89
-q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
-    <glyph glyph-name="_412" unicode="&#xf1b7;" 
-d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5
-q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5
-q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z
-" />
-    <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792" 
-d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188
-l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5
-t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1
-q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
-    <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048" 
-d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384
-q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5
-l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
-    <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048" 
-d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5
-t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z
-M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
-    <glyph glyph-name="_416" unicode="&#xf1bb;" 
-d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384
-q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
-    <glyph glyph-name="_417" unicode="&#xf1bc;" 
-d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64
-q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37
-q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024" 
-d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
-    <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304" 
-d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11
-q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245
-q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785
-l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242
-q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236
-q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786
-q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
-    <glyph glyph-name="uniF1C0" unicode="&#xf1c0;" 
-d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127
-t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5
-t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
-    <glyph glyph-name="uniF1C1" unicode="&#xf1c1;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197
-q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8
-q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
-    <glyph glyph-name="_422" unicode="&#xf1c2;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5
-t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" />
-    <glyph glyph-name="_423" unicode="&#xf1c3;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107
-h-290v-107h68l189 -272l-194 -283h-68z" />
-    <glyph glyph-name="_424" unicode="&#xf1c4;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
-    <glyph glyph-name="_425" unicode="&#xf1c5;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
-    <glyph glyph-name="_426" unicode="&#xf1c6;" 
-d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400
-v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79
-q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
-    <glyph glyph-name="_427" unicode="&#xf1c7;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5
-q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
-    <glyph glyph-name="_428" unicode="&#xf1c8;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
-    <glyph glyph-name="_429" unicode="&#xf1c9;" 
-d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
-M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243
-l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
-    <glyph glyph-name="_430" unicode="&#xf1ca;" 
-d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406
-q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
-    <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792" 
-d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546
-q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
-    <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048" 
-d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94
-q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55
-t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" />
-    <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792" 
-d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194
-q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5
-t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
-    <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792" 
-d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5
-t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
-    <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792" 
-d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41
-t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170
-t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136
-q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
-    <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792" 
-d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251
-l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162
-q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33
-q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5
-t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
-t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="uniF1D2" unicode="&#xf1d2;" 
-d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85
-q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392
-q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072
-q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792" 
-d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58
-q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47
-q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171
-v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
-    <glyph glyph-name="_439" unicode="&#xf1d4;" 
-d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280" 
-d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5
-t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153
-t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
-    <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792" 
-d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5
-q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20
-t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5
-t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
-    <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048" 
-d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25
-q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5
-q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109
-q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
-    <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792" 
-d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
-    <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792" 
-d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137
-l863 639l-478 -797z" />
-    <glyph glyph-name="_445" unicode="&#xf1da;" 
-d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
-t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23
-t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="_446" unicode="&#xf1db;" 
-d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
-t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792" 
-d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15
-t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2
-t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160
-q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5
-q0 -26 -12 -48t-36 -22z" />
-    <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280" 
-d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179
-q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
-    <glyph glyph-name="_449" unicode="&#xf1de;" 
-d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256
-q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
-    <glyph glyph-name="uniF1E0" unicode="&#xf1e0;" 
-d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5
-t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
-    <glyph glyph-name="_451" unicode="&#xf1e1;" 
-d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5
-t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792" 
-d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5
-t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91
-q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9
-t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-    <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792" 
-d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323
-l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
-    <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792" 
-d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
-v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192
-q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23
-zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5
-t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
-    <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792" 
-d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z
-M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792" 
-d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234
-l401 400q38 37 91 37t90 -37z" />
-    <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792" 
-d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5
-t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z
-M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7
-t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
-    <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792" 
-d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
-    <glyph glyph-name="_459" unicode="&#xf1e9;" 
-d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36
-q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5
-t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87
-q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
-    <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048" 
-d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19
-t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
-    <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048" 
-d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121
-q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z
-M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
-    <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792" 
-d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
-t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5
-t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5
-t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
-M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38
-h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_463" unicode="&#xf1ed;" 
-d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246
-q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598
-q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
-    <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792" 
-d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640
-q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
-    <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304" 
-d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27
-q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128
-q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304" 
-d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249
-q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z
-M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32
-h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4
-q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75
-q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14
-q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22
-q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12
-q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122
-h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5
-t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304" 
-d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42
-q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604
-v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569
-q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73
-t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
-    <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304" 
-d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z
-M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260
-l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279
-v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040
-q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168
-q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5
-t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21
-h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5
-t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
-    <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304" 
-d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16
-t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76
-q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59
-t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489
-l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66
-q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304" 
-d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109
-q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118
-q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151
-q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31
-q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048" 
-d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5
-l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5
-l418 363q10 8 23.5 7t21.5 -11z" />
-    <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048" 
-d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128
-q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161
-q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
-    <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408" 
-d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704
-q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167
-q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="_474" unicode="&#xf1f9;" 
-d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5
-t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5
-t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_475" unicode="&#xf1fa;" 
-d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53
-q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24
-t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61
-t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
-    <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792" 
-d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10
-t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
-    <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792" 
-d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5
-t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
-    <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792" 
-d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5
-t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38
-t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448
-h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5
-q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
-    <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048" 
-d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
-    <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792" 
-d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048" 
-d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9
-t9 -23z" />
-    <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792" 
-d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20
-q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50
-t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1
-q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
-    <glyph glyph-name="_483" unicode="&#xf203;" 
-d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73
-q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110
-q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960
-q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048" 
-d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5
-t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5
-t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
-    <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048" 
-d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5
-t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
-    <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304" 
-d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94
-q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469
-q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400
-q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
-    <glyph glyph-name="_487" unicode="&#xf207;" 
-d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5
-h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
-t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
-    <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048" 
-d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327
-q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5
-q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
-    <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280" 
-d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119
-t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5
-t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14
-q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88
-q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5
-t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
-    <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048" 
-d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206
-q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307
-t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14
-t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
-    <glyph glyph-name="_491" unicode="&#xf20b;" 
-d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5
-t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="_492" unicode="&#xf20c;" 
-d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55
-q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410
-q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
-    <glyph glyph-name="_493" unicode="&#xf20d;" 
-d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
-    <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048" 
-d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335
-q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5
-q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438
-h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66
-l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946
-l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82
-zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
-    <glyph glyph-name="f210" unicode="&#xf210;" 
-d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
-    <glyph glyph-name="_496" unicode="&#xf211;" 
-d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384
-q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
-    <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048" 
-d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021
-q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25
-q209 0 374 -102q172 107 374 102z" />
-    <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048" 
-d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101
-q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284
-q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
-    <glyph glyph-name="_499" unicode="&#xf214;" 
-d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34
-l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114
-v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z
-M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378
-v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51
-h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5
-t-43 -34t-16.5 -53.5z" />
-    <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048" 
-d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832
-q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
-    <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048" 
-d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5
-t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113
-t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5
-q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
-    <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664" 
-d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
-t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
-q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664" 
-d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
-t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
-q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048" 
-d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20
-l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
-    <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048" 
-d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
-q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83
-q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314
-v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
-q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
-    <glyph glyph-name="_506" unicode="&#xf21b;" 
-d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14
-t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5
-q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31
-t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
-    <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304" 
-d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5
-t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105
-l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226
-t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
-    <glyph glyph-name="_508" unicode="&#xf21d;" 
-d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12
-q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384
-q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5
-t158.5 -65.5t65.5 -158.5z" />
-    <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792" 
-d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221
-q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124
-t127 -344z" />
-    <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280" 
-d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292
-q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
-    <glyph glyph-name="_511" unicode="&#xf222;" 
-d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5
-q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280" 
-d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5
-t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
-t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_513" unicode="&#xf224;" 
-d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
-q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
-t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792" 
-d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
-q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9
-t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5
-t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792" 
-d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23
-t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391
-q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391
-q0 -226 -154 -391q103 -57 218 -57z" />
-    <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920" 
-d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230
-q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9
-t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128
-q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
-    <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048" 
-d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23
-t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9
-t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5
-t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
-    <glyph glyph-name="_518" unicode="&#xf229;" 
-d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5
-t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
-t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280" 
-d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22
-t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5
-t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048" 
-d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5
-t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5
-t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280" 
-d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5
-t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-    <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280" 
-d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123
-t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
-    <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="_525" unicode="&#xf230;" 
-d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
-    <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280" 
-d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5
-l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5
-q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
-    <glyph glyph-name="_527" unicode="&#xf232;" 
-d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5
-t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233
-l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
-    <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792" 
-d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216
-q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
-    <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048" 
-d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5
-t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5
-t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
-    <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048" 
-d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136
-q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69
-t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
-    <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048" 
-d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704
-q-26 0 -45 -19t-19 -45v-384h1152z" />
-    <glyph glyph-name="_532" unicode="&#xf237;" 
-d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
-    <glyph glyph-name="_533" unicode="&#xf238;" 
-d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56
-t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
-    <glyph glyph-name="_534" unicode="&#xf239;" 
-d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47
-t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
-    <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792" 
-d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116
-q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
-    <glyph glyph-name="_536" unicode="&#xf23b;" 
-d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
-    <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296" 
-d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5
-q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5
-q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42
-q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37
-q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5
-q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139
-q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8
-t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132
-q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132
-q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z
-M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86
-t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103
-q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4
-l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130
-t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150
-q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12
-q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
-    <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304" 
-d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5
-t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5
-t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
-    <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792" 
-d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348
-t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23
-t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96
-q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512
-q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
-    <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304" 
-d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113
-v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
-    <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304" 
-d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
-h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-    <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304" 
-d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
-h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-    <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304" 
-d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
-h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-    <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304" 
-d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23
-v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-    <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280" 
-d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
-    <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024" 
-d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
-    <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048" 
-d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
-h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
-    <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304" 
-d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256
-v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
-    <glyph glyph-name="_549" unicode="&#xf249;" 
-d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
-    <glyph glyph-name="_550" unicode="&#xf24a;" 
-d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68
-z" />
-    <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304" 
-d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5
-t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88
-t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90
-t90 38h2048q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304" 
-d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294
-t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z
-M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792" 
-d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113
-zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304" 
-d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64
-q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91
-t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5
-t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
-    <glyph glyph-name="_555" unicode="&#xf250;" 
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5
-t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
-    <glyph glyph-name="_556" unicode="&#xf251;" 
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
-    <glyph glyph-name="_557" unicode="&#xf252;" 
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
-    <glyph glyph-name="_558" unicode="&#xf253;" 
-d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
-t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196
-h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
-    <glyph glyph-name="_559" unicode="&#xf254;" 
-d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87
-t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9
-h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
-    <glyph glyph-name="_560" unicode="&#xf255;" 
-d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25
-q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27
-t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21
-q72 69 174 69z" />
-    <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792" 
-d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33
-t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52
-h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
-    <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792" 
-d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668
-q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17
-t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5
-t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5
-q0 -42 -23 -78t-61 -53l-310 -141h91z" />
-    <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048" 
-d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32
-q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68
-q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
-    <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048" 
-d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79
-t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24
-q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26
-l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" />
-    <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792" 
-d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5
-q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5
-v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32
-v-384h32z" />
-    <glyph glyph-name="_566" unicode="&#xf25b;" 
-d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181
-v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46
-q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5
-q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308
-q0 -53 37.5 -90.5t90.5 -37.5h668z" />
-    <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973" 
-d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5
-t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141
-q13 0 22 -8.5t10 -20.5z" />
-    <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792" 
-d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109
-t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640
-q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792" 
-d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78
-q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5
-t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376
-q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191
-t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
-    <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048" 
-d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
-    <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792" 
-d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191
-t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304" 
-d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57
-t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197
-t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5
-t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5
-t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5
-q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
-    <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280" 
-d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5
-t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94
-q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
-    <glyph glyph-name="_574" unicode="&#xf264;" 
-d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32
-q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5
-zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720" 
-d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33
-l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
-    <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304" 
-d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540
-q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81
-l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
-    <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792" 
-d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640
-q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5
-t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5
-t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5
-t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191
-t191 -286t71 -348z" />
-    <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792" 
-d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962
-q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
-    <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792" 
-d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5
-q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5
-q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
-    <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792" 
-d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339
-q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z
-" />
-    <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792" 
-d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606
-q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z
-M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
-    <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048" 
-d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23
-v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792" 
-d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34
-h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100
-q-68 175 -180 287z" />
-    <glyph glyph-name="_584" unicode="&#xf26e;" 
-d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6
-q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13
-q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249
-q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183
-q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46
-t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
-    <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792" 
-d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z
-M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30
-q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57
-t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133
-q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
-    <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792" 
-d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9
-h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224
-v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
-    <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792" 
-d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23
-t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47
-t47 -113v-96h128q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792" 
-d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z
-M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
-q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792" 
-d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23
-t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47
-t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-    <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792" 
-d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
-    <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024" 
-d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249
-q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
-    <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792" 
-d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768
-q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
-    <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048" 
-d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173
-v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
-    <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792" 
-d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472
-q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
-    <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792" 
-d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5
-t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37
-t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-    <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792" 
-d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5
-t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5
-t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51
-t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
-    <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024" 
-d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
-    <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792" 
-d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246
-q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
-    <glyph glyph-name="f27e" unicode="&#xf27e;" 
-d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
-    <glyph glyph-name="uniF280" unicode="&#xf280;" 
-d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72
-h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275
-l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
-    <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792" 
-d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5
-l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44
-t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106
-q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
-    <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792" 
-d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53
-q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
-    <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304" 
-d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
-    <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792" 
-d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308
-t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20
-t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" />
-    <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792" 
-d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
-    <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792" 
-d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96
-q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5
-q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96
-q16 0 16 -16z" />
-    <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304" 
-d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96
-q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5
-t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
-    <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792" 
-d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348
-t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304" 
-d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22
-q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5
-q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13
-q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
-    <glyph glyph-name="_610" unicode="&#xf28a;" 
-d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83
-t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20
-q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5
-t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
-    <glyph glyph-name="_611" unicode="&#xf28b;" 
-d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103
-t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_612" unicode="&#xf28c;" 
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
-t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
-    <glyph glyph-name="_613" unicode="&#xf28d;" 
-d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
-t103 -385.5z" />
-    <glyph glyph-name="_614" unicode="&#xf28e;" 
-d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
-t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
-    <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792" 
-d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5
-t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-    <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048" 
-d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5
-t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416
-q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441
-h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
-    <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792" 
-d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12
-q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311
-q15 0 25 -12q9 -12 6 -28z" />
-    <glyph glyph-name="_618" unicode="&#xf293;" 
-d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5
-t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
-    <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024" 
-d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
-    <glyph glyph-name="_620" unicode="&#xf295;" 
-d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5
-t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
-t271.5 -112.5t112.5 -271.5z" />
-    <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792" 
-d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" />
-    <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792" 
-d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111
-q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" />
-    <glyph glyph-name="_623" unicode="&#xf298;" 
-d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14
-t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" />
-    <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792" 
-d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57
-q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285
-q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" />
-    <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792" 
-d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42
-q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
-M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298
-t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="_626" unicode="&#xf29b;" 
-d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300
-l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z
-M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" />
-    <glyph glyph-name="_627" unicode="&#xf29c;" 
-d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5
-t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5
-t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5
-t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408" 
-d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457
-q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521
-q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661
-q3 -1 7 1t7 4l3 2q11 9 11 17z" />
-    <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304" 
-d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10
-t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5
-t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5
-h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96
-t9.5 -70.5z" />
-    <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408" 
-d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5
-q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127
-l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272
-t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249
-q-18 -19 -45 -19z" />
-    <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176" 
-d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352
-q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864
-q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136
-t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56
-t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56
-t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136
-t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" />
-    <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792" 
-d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z
-M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72
-t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45
-t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4
-q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" />
-    <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304" 
-d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55
-q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5
-q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101
-q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35
-q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5
-q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" />
-    <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792" 
-d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19
-t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74
-t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233
-l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" />
-    <glyph glyph-name="uniF2A5" unicode="&#xf2a5;" 
-d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2
-q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10
-q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5
-t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535" 
-d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5
-l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5
-q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9
-q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" />
-    <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664" 
-d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37
-t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
-l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148
-q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26
-l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" />
-    <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792" 
-d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5
-q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841
-q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5
-q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" />
-    <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280" 
-d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5
-q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z
-M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" />
-    <glyph glyph-name="uniF2AA" unicode="&#xf2aa;" 
-d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z
-M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5
-q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
-t84.5 -203.5z" />
-    <glyph glyph-name="uniF2AB" unicode="&#xf2ab;" 
-d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114
-q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5
-t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
-t103 -385.5z" />
-    <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664" 
-d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35
-q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5
-t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" />
-    <glyph glyph-name="uniF2AD" unicode="&#xf2ad;" 
-d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115
-q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15
-t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960
-q119 0 203.5 -84.5t84.5 -203.5z" />
-    <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304" 
-d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7
-q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158
-q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" />
-    <glyph glyph-name="uniF2B0" unicode="&#xf2b0;" 
-d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104
-q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108
-l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z
-M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
-    <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664" 
-d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5
-t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" />
-    <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792" 
-d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5
-t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114
-q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50
-q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5
-t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46
-q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5
-q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177
-t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" />
-    <glyph glyph-name="uniF2B3" unicode="&#xf2b3;" 
-d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110
-h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-    <glyph glyph-name="uniF2B4" unicode="&#xf2b4;" 
-d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5
-q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304" 
-d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66
-l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180
-q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z
-M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421
-q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" />
-    <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792" 
-d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107
-t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39
-q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" />
-    <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792" 
-d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5
-l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5
-h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94
-q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" />
-    <glyph glyph-name="uniF2B8" unicode="&#xf2b8;" 
-d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465
-l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161
-q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74
-q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" />
-    <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664" 
-d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576
-q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216
-q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" />
-    <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664" 
-d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5
-t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96
-q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216
-q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" />
-    <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048" 
-d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z
-M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568
-q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9
-h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048" 
-d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925
-q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568
-q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5
-t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113
-t113 47h1728q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792" 
-d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5
-t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792" 
-d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61
-t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" />
-    <glyph glyph-name="uniF2C0" unicode="&#xf2c0;" 
-d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5
-t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145
-q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" />
-    <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280" 
-d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5
-t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352
-q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048" 
-d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56
-t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23
-v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728
-q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048" 
-d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z
-M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64
-q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47
-h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792" 
-d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117
-q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5
-t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" />
-    <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304" 
-d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21
-t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46
-t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54
-t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29
-q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5
-t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314
-q2 -42 2 -64z" />
-    <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792" 
-d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
-t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024" 
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
-    <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024" 
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
-    <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024" 
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
-    <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024" 
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
-t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
-v128h192z" />
-    <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024" 
-d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z
-M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
-    <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920" 
-d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41
-t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19
-t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768
-q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19
-t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384
-q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" />
-    <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792" 
-d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9
-t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9
-t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42
-q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9
-t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23
-t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" />
-    <glyph glyph-name="uniF2CE" unicode="&#xf2ce;" 
-d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5
-t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70
-q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20
-q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5
-t72.5 -263.5z" />
-    <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792" 
-d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792" 
-d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048" 
-d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47
-t47 -113z" />
-    <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792" 
-d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10
-l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792" 
-d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
-l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792" 
-d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794" 
-d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12
-t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5
-t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5
-q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5
-q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34
-q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5
-t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" />
-    <glyph glyph-name="uniF2D7" unicode="&#xf2d7;" 
-d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89
-q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5
-t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" />
-    <glyph glyph-name="uniF2D8" unicode="&#xf2d8;" 
-d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7
-t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5
-h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113
-v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" />
-    <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176" 
-d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584
-q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5
-q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15
-q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82
-q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104
-t302 11t306.5 -97q220 -115 333 -336t87 -474z" />
-    <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792" 
-d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178
-q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199
-t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297
-t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208
-t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" />
-    <glyph glyph-name="uniF2DB" unicode="&#xf2db;" 
-d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16
-q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28
-t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32
-q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16
-h48q16 0 16 -16z" />
-    <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664" 
-d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45
-t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33
-q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313
-l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106
-q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" />
-    <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792" 
-d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321
-q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" />
-    <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792" 
-d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62
-t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71
-t286 -191t191 -286t71 -348z" />
-    <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920" 
-d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3
-t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53
-q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5
-q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5
-t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5
-q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z
-M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21
-q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16
-q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" />
-    <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792" 
- />
-    <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792" 
- />
-  </font>
-</defs></svg>
diff --git a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.ttf b/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 35acda2..0000000
--- a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.ttf
+++ /dev/null
Binary files differ
diff --git a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.woff b/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 400014a..0000000
--- a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.woff
+++ /dev/null
Binary files differ
diff --git a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.woff2 b/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 4d13fc6..0000000
--- a/framework/crawler-ui/src/main/webapp/fonts/fontawesome-webfont.woff2
+++ /dev/null
Binary files differ
diff --git a/framework/crawler-ui/src/main/webapp/index.jsp b/framework/crawler-ui/src/main/webapp/index.jsp
deleted file mode 100644
index 375dfcd..0000000
--- a/framework/crawler-ui/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,133 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-  String mcfVersion = org.apache.manifoldcf.core.system.ManifoldCF.getMcfVersion();
-%>
-
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport"
-            content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <!-- Bootstrap -->
-    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
-    <link href="bootstrap-select/css/bootstrap-select.min.css" rel="stylesheet" type="text/css"/>
-    <link href="css/font-awesome.min.css" rel="stylesheet" type="text/css"/>
-    <link rel="stylesheet" href="css/style.css" type="text/css" media="screen"/>
-    
-  <script type="text/javascript">
-    var MCFError = {
-        ServerDown          :"<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"errorCode.ServerDown")%>",
-        InternalServerError :"<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"errorCode.InternalServerError")%>"
-    }
-  </script>
-  </head>
-  <body class="fixed skin-black sidebar-mini">
-    <div class="wrapper">
-      <header class="main-header">
-        <nav class="navbar navbar-static-top" role="navigation">
-          <a class="logo">
-            <img src="ManifoldCF-logo.png"/>
-          </a>
-          <!-- Sidebar toggle button-->
-          <a href="/" class="sidebar-toggle" data-toggle="offcanvas" role="button">
-            <span class="sr-only">Toggle navigation</span>
-          </a>
-
-          <h1 class="hidden-xs"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"banner.DocumentIngestion")%>
-          </h1>
-          <!-- Navbar Right Menu -->
-          <div class="navbar-custom-menu">
-            <div id="loader">Loading...</div>
-          </div>
-        </nav>
-      </header>
-      <aside class="main-sidebar">
-        <jsp:include page="sidebar.jsp" flush="true"/>
-      </aside>
-      <div class="content-wrapper">
-        <section class="content-header">
-          <h1 class="visible-print-block"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.ApacheManifoldCF")%></h1>
-
-          <h1 id="heading"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.WelcomeToApacheManifoldFC")%></h1>
-        </section>
-        <section id="content" class="content">
-        </section>
-      </div>
-      <footer class="main-footer">
-        <div class="pull-right hidden-xs"><b>Version</b>&nbsp;<%= mcfVersion %></div>
-        <strong><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.Copyright")%>&nbsp;&nbsp;&nbsp;&nbsp;<a target="_blank" href="https://www.apache.org/"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.TheApacheSoftwareFoundation")%></a></strong>
-      </footer>
-    </div>
-    <div class="overlay" style="display: none">
-      <div class="spinner">
-        <div class="bounce1"></div>
-        <div class="bounce2"></div>
-        <div class="bounce3"></div>
-      </div>
-    </div>
-    <!-- Error Modal -->
-    <div class="modal fade" id="exceptionModal" tabindex="-1" role="dialog" aria-labelledby="exceptionModalLabel">
-      <div class="modal-dialog modal-lg" role="document">
-        <div class="modal-content">
-          <div class="modal-header">
-            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-            <h4 class="modal-title" id="exceptionModalLabel">Internal Server Exception</h4>
-          </div>
-          <div class="modal-body" style="max-height:calc(100vh - 212px);overflow: auto;">
-          </div>
-          <div class="modal-footer">
-            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
-          </div>
-        </div>
-      </div>
-    </div>
-    <script src="javascript/jquery.min.js"></script>
-    <!-- Bootstrap JS -->
-    <script src="bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
-    <!-- Bootstrap Select -->
-    <script src="bootstrap-select/js/bootstrap-select.min.js" type="text/javascript"></script>
-    <script src="javascript/jquery.slimscroll.min.js" type="text/javascript"></script>
-    <!-- ManifoldCF -->
-    <script src="javascript/mcf.js?v=<%= mcfVersion %>" type="text/javascript"></script>
-<%
-  String reqPage = request.getParameter("p");
-  if (reqPage != null && reqPage.length() > 0)
-  {
-%>
-    <script type="application/javascript">
-      $(document).ready(function ()
-      {
-        $.ManifoldCF.loadContent('<%=URLEncoder.encode(reqPage)%>');
-      });
-    </script>
-<%
-  }
-%>
-  </body>
-</html>
diff --git a/framework/crawler-ui/src/main/webapp/javascript/jquery.min.js b/framework/crawler-ui/src/main/webapp/javascript/jquery.min.js
deleted file mode 100644
index e20ecac..0000000
--- a/framework/crawler-ui/src/main/webapp/javascript/jquery.min.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*!
- * jQuery v1.12.4 | (c) jQuery Foundation
- *
- * 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, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
-}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
-marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
-padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
diff --git a/framework/crawler-ui/src/main/webapp/javascript/jquery.slimscroll.min.js b/framework/crawler-ui/src/main/webapp/javascript/jquery.slimscroll.min.js
deleted file mode 100644
index fcff382..0000000
--- a/framework/crawler-ui/src/main/webapp/javascript/jquery.slimscroll.min.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*!
- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
- * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.  Distributed
- * by the ManifoldCF project under the terms of the MIT license.
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2011 Piotr Rochala (http://rocha.la)
- * 
- * 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, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * 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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- 
-/*
- * Version: 1.3.8
- *
- */
-(function(e){e.fn.extend({slimScroll:function(f){var a=e.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},f);this.each(function(){function v(d){if(r){d=d||window.event;
-var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&n(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function n(d,g,e){k=!1;var f=b.outerHeight()-c.outerHeight();g&&(g=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),g=Math.min(Math.max(g,0),f),g=0<d?Math.ceil(g):Math.floor(g),c.css({top:g+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());g=
-l*(b[0].scrollHeight-b.outerHeight());e&&(g=d,d=g/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),f),c.css({top:d+"px"}));b.scrollTop(g);b.trigger("slimscrolling",~~g);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+"px"});var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,
-!0).fadeIn("fast"),a.railVisible&&m.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut("slow"),m.fadeOut("slow"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var q=b.scrollTop(),c=b.siblings("."+a.barClass),m=b.siblings("."+a.railClass);x();if(e.isPlainObject(f)){if("height"in f&&"auto"==f.height){b.parent().css("height","auto");b.css("height","auto");var h=b.parent().parent().height();b.parent().css("height",
-h);b.css("height",h)}else"height"in f&&(h=f.height,b.parent().css("height",h),b.css("height",h));if("scrollTo"in f)q=parseInt(a.scrollTo);else if("scrollBy"in f)q+=parseInt(a.scrollBy);else if("destroy"in f){c.remove();m.remove();b.unwrap();return}n(q,!1,!0)}}else if(!(e.isPlainObject(f)&&"destroy"in f)){a.height="auto"==a.height?b.parent().height():a.height;q=e("<div></div>").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",
-width:a.width,height:a.height});var m=e("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,
-WebkitBorderRadius:a.borderRadius,zIndex:99}),h="right"==a.position?{right:a.distance}:{left:a.distance};m.css(h);c.css(h);b.wrap(q);b.parent().append(c);b.parent().append(m);a.railDraggable&&c.bind("mousedown",function(a){var b=e(document);z=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);n(0,c.position().top,!1)});b.bind("mouseup.slimscroll",function(a){z=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",
-function(a){a.stopPropagation();a.preventDefault();return!1});m.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(n((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});
-x();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),n(0,!0)):"top"!==a.start&&(n(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);
\ No newline at end of file
diff --git a/framework/crawler-ui/src/main/webapp/javascript/mcf.js b/framework/crawler-ui/src/main/webapp/javascript/mcf.js
deleted file mode 100644
index 9a8af69..0000000
--- a/framework/crawler-ui/src/main/webapp/javascript/mcf.js
+++ /dev/null
@@ -1,545 +0,0 @@
-/* $Id$ */
-
-/**
- * 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.
- */
-
-'use strict';
-
-//Make sure jQuery has been loaded before app.js
-if (typeof jQuery === "undefined")
-{
-  throw new Error("ManifoldCF requires jQuery");
-}
-
-/* ManifoldCF
- *
- * @type Object
- * @description $.ManifoldCF is the main object for the template's app.
- *              It's used for implementing functions and options related
- *              to the template. Keeping everything wrapped in an object
- *              prevents conflict with other plugins and is a better
- *              way to organize our code.
- */
-$.ManifoldCF={};
-
-/* --------------------
- * - ManifoldCF Options -
- * --------------------
- * Modify these options to suit your implementation
- */
-$.ManifoldCF.options={
-  //Sidebar push menu toggle button selector
-  sidebarToggleSelector: "[data-toggle='offcanvas']",
-  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
-  sidebarSlimScroll: true,
-  BSTooltipSelector: '[data-toggle="tooltip"]',
-  //The standard screen sizes that bootstrap uses.
-  //If you change these in the variables.less file, change
-  //them here too.
-  screenSizes: {
-    xs: 480,
-    sm: 768,
-    md: 992,
-    lg: 1200
-  }
-};
-
-/* ------------------
- * - Implementation -
- * ------------------
- * The next block of code implements ManifoldCF's
- * functions and plugins as specified by the
- * options above.
- */
-$(function ()
-{
-  //Easy access to options
-  var o=$.ManifoldCF.options;
-
-  //Set up the object
-  _init();
-
-  //Activate the layout maker
-  $.ManifoldCF.layout.activate();
-
-  //Enable sidebar tree view controls
-  $.ManifoldCF.tree('.sidebar');
-
-  //Activate sidebar push menu
-  $.ManifoldCF.pushMenu.activate(o.sidebarToggleSelector);
-
-  //Activate Bootstrap tooltip
-  $(o.BSTooltipSelector).tooltip({
-    trigger: 'hover',
-    container: 'body'
-  });
-
-  /*
-   * INITIALIZE BUTTON TOGGLE
-   * ------------------------
-   */
-  $('.btn-group[data-toggle="btn-toggle"]').each(function ()
-  {
-    var group=$(this);
-    $(this).find(".btn").click(function (e)
-    {
-      group.find(".btn.active").removeClass("active");
-      $(this).addClass("active");
-      e.preventDefault();
-    });
-
-  });
-});
-
-/* ----------------------------------
- * - Initialize the ManifoldCF Object -
- * ----------------------------------
- * All ManifoldCF functions are implemented below.
- */
-function _init()
-{
-
-  /* Layout
-   * ======
-   * Fixes the layout height in case min-height fails.
-   *
-   * @type Object
-   * @usage $.ManifoldCF.layout.activate()
-   *        $.ManifoldCF.layout.fix()
-   *        $.ManifoldCF.layout.fixSidebar()
-   */
-  $.ManifoldCF.layout={
-    activate: function ()
-    {
-      var _this=this;
-      _this.fix();
-      _this.fixSidebar();
-      $(window,".wrapper").resize(function ()
-      {
-        _this.fix();
-        _this.fixSidebar();
-      });
-    },
-    fix: function ()
-    {
-      //Get window height and the wrapper height
-      var neg=$('.main-header').outerHeight() + $('.main-footer').outerHeight();
-      var window_height=$(window).height();
-      var sidebar_height=$(".sidebar").height();
-      //Set the min-height of the content and sidebar based on the
-      //the height of the document.
-      if ($("body").hasClass("fixed"))
-      {
-        $(".content-wrapper, .right-side").css('min-height',window_height - $('.main-footer').outerHeight());
-      } else
-      {
-        var postSetWidth;
-        if (window_height >= sidebar_height)
-        {
-          $(".content-wrapper, .right-side").css('min-height',window_height - neg);
-          postSetWidth=window_height - neg;
-        } else
-        {
-          $(".content-wrapper, .right-side").css('min-height',sidebar_height);
-          postSetWidth=sidebar_height;
-        }
-      }
-      $('.main-footer').show();
-    },
-    fixSidebar: function ()
-    {
-      //Make sure the body tag has the .fixed class
-      if (!$("body").hasClass("fixed"))
-      {
-        if (typeof $.fn.slimScroll != 'undefined')
-        {
-          $(".sidebar").slimScroll({destroy: true}).height("auto");
-        }
-        return;
-      } else if (typeof $.fn.slimScroll == 'undefined' && console)
-      {
-        console.error("Error: the fixed layout requires the slimscroll plugin!");
-      }
-      //Enable slimscroll for fixed layout
-      if ($.ManifoldCF.options.sidebarSlimScroll)
-      {
-        if (typeof $.fn.slimScroll != 'undefined')
-        {
-          //Destroy if it exists
-          $(".sidebar").slimScroll({destroy: true}).height("auto");
-          //Add slimscroll
-          $(".sidebar").slimscroll({
-            height: ($(window).height() - $(".main-header").height()) + "px",
-            color: "rgba(255,255,255,0.8)",
-            size: "5px"
-          });
-        }
-      }
-    }
-  };
-
-  /* PushMenu()
-   * ==========
-   * Adds the push menu functionality to the sidebar.
-   *
-   * @type Function
-   * @usage: $.ManifoldCF.pushMenu("[data-toggle='offcanvas']")
-   */
-  $.ManifoldCF.pushMenu={
-    activate: function (toggleBtn)
-    {
-      //Get the screen sizes
-      var screenSizes=$.ManifoldCF.options.screenSizes;
-
-      //Enable sidebar toggle
-      $(toggleBtn).on('click',function (e)
-      {
-        e.preventDefault();
-
-        //Enable sidebar push menu
-        if ($(window).width() > (screenSizes.sm - 1))
-        {
-          $("body").toggleClass('sidebar-collapse');
-        }
-        //Handle sidebar push menu for small screens
-        else
-        {
-          if ($("body").hasClass('sidebar-open'))
-          {
-            $("body").removeClass('sidebar-open');
-            $("body").removeClass('sidebar-collapse')
-          } else
-          {
-            $("body").addClass('sidebar-open');
-          }
-        }
-      });
-
-      $(".content-wrapper").click(function ()
-      {
-        //Enable hide menu when clicking on the content-wrapper on small screens
-        if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open"))
-        {
-          $("body").removeClass('sidebar-open');
-        }
-      });
-
-      //Enable expand on hover for sidebar mini
-      if ($.ManifoldCF.options.sidebarExpandOnHover
-          || ($('body').hasClass('fixed')
-          && $('body').hasClass('sidebar-mini')))
-      {
-        this.expandOnHover();
-      }
-
-    },
-    expandOnHover: function ()
-    {
-      var _this=this;
-      var screenWidth=$.ManifoldCF.options.screenSizes.sm - 1;
-      //Expand sidebar on hover
-      $('.main-sidebar').hover(function ()
-      {
-        if ($('body').hasClass('sidebar-mini')
-            && $("body").hasClass('sidebar-collapse')
-            && $(window).width() > screenWidth)
-        {
-          _this.expand();
-        }
-      },function ()
-      {
-        if ($('body').hasClass('sidebar-mini')
-            && $('body').hasClass('sidebar-expanded-on-hover')
-            && $(window).width() > screenWidth)
-        {
-          _this.collapse();
-        }
-      });
-    },
-    expand: function ()
-    {
-      $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
-    },
-    collapse: function ()
-    {
-      if ($('body').hasClass('sidebar-expanded-on-hover'))
-      {
-        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
-      }
-    }
-  };
-
-  /* Tree()
-   * ======
-   * Converts the sidebar into a multilevel
-   * tree view menu.
-   *
-   * @type Function
-   * @Usage: $.ManifoldCF.tree('.sidebar')
-   */
-  $.ManifoldCF.tree=function (menu)
-  {
-    var _this=this;
-
-    $("li a",$(menu)).on('click',function (e)
-    {
-      //Get the clicked link and the next element
-      var $this=$(this);
-      var checkElement=$this.next();
-
-      //Check if the next element is a menu and is visible
-      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')))
-      {
-        //Close the menu
-        checkElement.slideUp('normal',function ()
-        {
-          checkElement.removeClass('menu-open');
-          //Fix the layout in case the sidebar stretches over the height of the window
-          //_this.layout.fix();
-        });
-        checkElement.parent("li").removeClass("active");
-      }
-      //If the menu is not visible
-      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible')))
-      {
-        //Get the parent menu
-        var parent=$this.parents('ul').first();
-        //Close all open menus within the parent
-        var ul=parent.find('ul:visible').slideUp('normal');
-        //Remove the menu-open class from the parent
-        ul.removeClass('menu-open');
-        //Get the parent li
-        var parent_li=$this.parent("li");
-
-        //Open the target menu and add the menu-open class
-        checkElement.slideDown('normal',function ()
-        {
-          //Add the class active to the parent li
-          checkElement.addClass('menu-open');
-          parent.find('li.active').removeClass('active');
-          parent_li.addClass('active');
-          //Fix the layout in case the sidebar stretches over the height of the window
-          _this.layout.fix();
-        });
-      }
-      //if this isn't a link, prevent the page from being redirected
-      if (checkElement.is('.treeview-menu'))
-      {
-        e.preventDefault();
-      }
-    });
-  };
-}
-
-$.ManifoldCF.setTitle=function (title,header,activeMenu)
-{
-  document.title=title;
-
-  $(".content-header #heading").text(header);
-
-  activeMenu=typeof activeMenu !== 'undefined'?activeMenu:'outputs';
-  $("." + activeMenu).addClass("active");
-
-  $(".selectpicker").selectpicker({iconBase:'fa',tickIcon:'fa-check'});
-};
-
-function displayError(xhr)
-{
-  $(".content-header #heading").text('Error!');
-  document.title='Error';
-  var msg = xhr.status + " " + xhr.statusText;
-  //Proper error message, if the server is down.
-  if(xhr.status === 0)
-  {
-    msg = MCFError.ServerDown;
-  }
-  else if(xhr.status === 500)
-  {
-    msg = MCFError.InternalServerError;
-  }
-  var errorTemplate = '<div class="box box-solid">' +
-                        '<div class="box-body">' +
-                          '<div class="alert alert-danger">' +
-                            '<h3><i class="fa fa-ban fa-fw"></i> Error!</h3>' +
-                            '<h4>' + msg +'</h4>' +
-                          '</div>' +
-                        '</div>' +
-                        '<div class="box-footer with-border">' +
-                          '<div class="btn-group">' +
-                            '<a class="btn btn-default" href="index.jsp" title="Return" data-toggle="tooltip">' +
-                              '<i class="fa fa-check fa-fw" aria-hidden="true"></i>OK' +
-                            '</a>';
-  if(xhr.status === 500)
-  {
-    errorTemplate +=        '<button type="button" class="btn btn-default" data-toggle="modal" data-target="#exceptionModal">' +
-                              '<i class="fa fa-exclamation-triangle fa-fw" aria-hidden="true"></i>See Exception</button>';
-    $('#exceptionModal .modal-body').empty();
-    $('#exceptionModal .modal-body').html(xhr.responseText);
-  }
-  errorTemplate +=        '</div>' +
-                        '</div>' +
-                      '</div>';
-  $("#content").html(errorTemplate);
-}
-
-function _endsWith(str, suffix) {
-    return str.indexOf(suffix, str.length - suffix.length) !== -1;
-}
-
-function _preLoadContent()
-{
-  console.log('_preLoadContent');
-  $($.ManifoldCF.options.BSTooltipSelector).tooltip('destroy');
-
-  //Temporary fix for Javascript bug, when loading connector javascript.
-  //Get all the global methods
-  var methods = Object.keys(window);
-  for(var i=0; i<=methods.length; i++){
-    var method = methods[i];
-      if (method && (_endsWith(method, 'checkConfig') ||
-          _endsWith(method, 'checkConfigForSave') ||
-          _endsWith(method, 'checkSpecification') ||
-          _endsWith(method, 'checkSpecificationForSave'))) {
-          delete window[method];
-      }
-  }
-}
-
-function _postLoadContent()
-{
-  console.log('_postLoadContent');
-  //Activate Bootstrap tooltip
-  $($.ManifoldCF.options.BSTooltipSelector).tooltip({
-    trigger: 'hover',
-    container: 'body'
-  });
-}
-
-$.ManifoldCF.loadContent=function (url)
-{
-  $('.overlay,#loader').show();
-  console.log("URL: " + url);
-  _preLoadContent();
-
-  //Add Client Timezone Offset
-  var timezone_offset = new Date().getTimezoneOffset();
-  var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
-
-  $('#content').load(decodeURIComponent(url), { client_timezone_offset : timezone_offset, client_timezone : timezone } ,function (response,status,xhr)
-  {
-    if (status == 'error')
-    {
-      displayError(xhr);
-    }
-    _postLoadContent();
-    $('.overlay,#loader').hide();
-  });
-};
-
-$.ManifoldCF.submit=function (form)
-{
-  $('.overlay,#loader').show();
-
-  var formData = new FormData(form),
-      $form = $(form),
-      action = $form.attr('action'),
-      method = $form.attr('method');
-
-  _preLoadContent();
-
-  //Add Client Timezone Offset
-  var timezone_offset = new Date().getTimezoneOffset();
-  var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
-  formData.append('client_timezone_offset',timezone_offset);
-  formData.append('client_timezone',timezone);
-
-  $.ajax({
-    type: method,
-    url: action,
-    data: formData,
-    cache: false,
-    contentType: false,
-    processData: false
-  }).done(function (data,textStatus,jqXHR)
-  {
-    var page=jqXHR.getResponseHeader("page");
-    console.log("page: " + page)
-    if (typeof page != 'undefined')
-    {
-      window.history.replaceState({urlPath: encodeURI(page)},null,'?p=' + page + '#execute');
-    }
-    else
-    {
-      window.history.replaceState({urlPath: encodeURI(action)},null,'#execute_' + form.name);
-    }
-    console.log("textStatus: " + textStatus);
-    $('#content').html(data);
-  }).fail(function (xhr,opts,error)
-  {
-    displayError(xhr);
-  }).always(function ()
-  {
-    _postLoadContent();
-    $('.overlay,#loader').hide();
-  });
-}
-
-window.onpopstate = function (event) {
-  console.log('historyEvent:',event);
-  if (event.state) {
-    // history changed because of pushState/replaceState
-    var state=window.history.state;
-    if (typeof  state != 'undefined')
-    {
-      if (!state.urlPath.startsWith('execute'))
-      {
-        $.ManifoldCF.loadContent(state.urlPath);
-      }
-    }
-  }
-  else
-  {
-    console.log('history changed because of a page load');
-  }
-}
-
-$(function(){
-  // navigation link handler
-  $(document.body).on("click",'.link',function (e)
-  {
-    e.preventDefault();
-    var urlPath=$(this).attr('href');
-    var title=$(this).text();
-
-    $.ManifoldCF.loadContent(urlPath);
-
-    var data = {urlPath: encodeURIComponent(urlPath)};
-    window.history.pushState(data,title,'?p=' + encodeURIComponent(urlPath) + '&_' + new Date().getTime());
-  });
-
-  //Prevent from submit on Enter
-  $(window).keydown(function(e){
-    var key = e.charCode || e.keyCode || 0;
-    var node = (e.target) ? e.target : ((e.srcElement) ? e.srcElement : null);
-    if(key == 13 && node.nodeName !== "TEXTAREA") {
-      console.log("Enter on input fields is disabled.");
-      e.preventDefault();
-      return false;
-    }
-  });
-
-});
diff --git a/framework/crawler-ui/src/main/webapp/listauthorities.jsp b/framework/crawler-ui/src/main/webapp/listauthorities.jsp
deleted file mode 100644
index 74dce7b..0000000
--- a/framework/crawler-ui/src/main/webapp/listauthorities.jsp
+++ /dev/null
@@ -1,149 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the authority connection manager handle
-  IAuthorityConnectionManager manager = AuthorityConnectionManagerFactory.make(threadContext);
-  IAuthorityConnectorManager connectorManager = AuthorityConnectorManagerFactory.make(threadContext);
-  IAuthorityConnection[] connections = manager.getAllConnections();
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listauthorities.ApacheManifoldCFListAuthorities")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listauthorities.ListOfAuthorityConnections")%>',
-      'authorities'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listauthorities.DeleteAuthority")%> '"+connectionName+"'?"))
-    {
-      document.listconnections.op.value="Delete";
-      document.listconnections.connname.value=connectionName;
-      $.ManifoldCF.submit(document.listconnections);
-    }
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listconnections" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="authority"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listauthorities.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listauthorities.Description")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listauthorities.AuthorityType")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listauthorities.Max")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < connections.length)
-  {
-    IAuthorityConnection connection = connections[i++];
-
-    String name = connection.getName();
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    int maxCount = connection.getMaxConnections();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + "(uninstalled)";
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewauthority.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.View") + " " +org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip">
-                    <i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.View")%></a>
-                  <a href='<%="editauthority.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.Edit") + " " + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip">
-                    <i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.Delete") + " " + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip">
-                    <i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></td>
-              <td><%=Integer.toString(maxCount)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editauthority.jsp" title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listauthorities.AddNewConnection")%>"
-                    class="link btn btn-primary" role="button">
-              <i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listauthorities.AddaNewConnection")%></a>
-          </div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listconnections.jsp b/framework/crawler-ui/src/main/webapp/listconnections.jsp
deleted file mode 100644
index 34b96d1..0000000
--- a/framework/crawler-ui/src/main/webapp/listconnections.jsp
+++ /dev/null
@@ -1,149 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the job manager handle
-  IRepositoryConnectionManager manager = RepositoryConnectionManagerFactory.make(threadContext);
-  IConnectorManager connectorManager = ConnectorManagerFactory.make(threadContext);
-  IRepositoryConnection[] connections = manager.getAllConnections();
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listconnections.ApacheManifoldCFListConnections")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listconnections.ListOfRepositoryConnections")%>',
-      'repositories'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listconnections.DeleteConnection")%> '"+connectionName+"'?"))
-    {
-      document.listconnections.op.value="Delete";
-      document.listconnections.connname.value=connectionName;
-      $.ManifoldCF.submit(document.listconnections);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listconnections" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="connection"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.Description")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.ConnectionType")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.AuthorityGroup")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.Max")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < connections.length)
-  {
-    IRepositoryConnection connection = connections[i++];
-
-    String name = connection.getName();
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"listconnections.uninstalled");
-    String authorityName = connection.getACLAuthority();
-    int maxCount = connection.getMaxConnections();
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewconnection.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.View")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>' 
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.View")%></a>
-                  <a href='<%="editconnection.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.Edit")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>' 
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.Delete")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>' 
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></td>
-              <td><%=((authorityName == null)?Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.GlobalAuthority"):org.apache.manifoldcf.ui.util.Encoder.bodyEscape(authorityName))%></td>
-              <td><%=Integer.toString(maxCount)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editconnection.jsp" class="link btn btn-primary" role="button" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listconnections.AddAConnection")%>"
-                    data-toggle="tooltip"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listconnections.AddNewConnection")%></a>
-          </div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listgroups.jsp b/framework/crawler-ui/src/main/webapp/listgroups.jsp
deleted file mode 100644
index 3300f4a..0000000
--- a/framework/crawler-ui/src/main/webapp/listgroups.jsp
+++ /dev/null
@@ -1,134 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the authority group manager handle
-  IAuthorityGroupManager manager = AuthorityGroupManagerFactory.make(threadContext);
-  IAuthorityGroup[] groups = manager.getAllGroups();
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listgroups.ApacheManifoldCFListAuthorityGroups")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listgroups.ListOfAuthorityGroups")%>',
-      'authorities'
-  );
-
-  function Delete(groupName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listgroups.DeleteAuthorityGroup")%> '"+groupName+"'?"))
-    {
-      document.listgroups.op.value="Delete";
-      document.listgroups.groupname.value=groupName;
-      $.ManifoldCF.submit(document.listgroups);
-    }
-  }
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listgroups" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="group"/>
-        <input type="hidden" name="groupname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listgroups.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listgroups.Description")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < groups.length)
-  {
-    IAuthorityGroup group = groups[i++];
-
-    String name = group.getName();
-    String description = group.getDescription();
-    if (description == null)
-      description = "";
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewgroup.jsp?groupname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listgroups.View")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listgroups.View")%></a>
-                  <a href='<%="editgroup.jsp?groupname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listgroups.Edit")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listgroups.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listgroups.Delete")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listgroups.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editgroup.jsp"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listgroups.AddNewGroup")%>"
-                    class="link btn btn-primary" role="button"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listgroups.AddaNewGroup")%></a>
-          </div>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listjobs.jsp b/framework/crawler-ui/src/main/webapp/listjobs.jsp
deleted file mode 100644
index b17382e..0000000
--- a/framework/crawler-ui/src/main/webapp/listjobs.jsp
+++ /dev/null
@@ -1,159 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_JOBS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the job manager handle
-  IJobManager manager = JobManagerFactory.make(threadContext);
-  IJobDescription[] jobs = manager.getAllJobs();
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listjobs.ApacheManifoldCFListJobDescriptions")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listjobs.JobList")%>',
-      'jobs'
-  );
-
-  function Delete(jobID)
-  {
-    if (confirm("Warning: Deleting this job will remove all\nassociated documents from the index.\nDo you want to proceed?"))
-    {
-      document.listjobs.op.value="Delete";
-      document.listjobs.jobid.value=jobID;
-      $.ManifoldCF.submit(document.listjobs);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listjobs" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="job"/>
-        <input type="hidden" name="jobid" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.OutputConnection")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.RepositoryConnection")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.ScheduleType")%></th>
-            </tr>
-<%
-  for (int i = 0; i < jobs.length; i++)
-  {
-    IJobDescription jd = jobs[i];
-
-    StringBuilder sb = new StringBuilder();
-    for (int j = 0; j < jd.countPipelineStages(); j++)
-    {
-      if (jd.getPipelineStageIsOutputConnection(j))
-      {
-        if (sb.length() > 0)
-          sb.append(",");
-        sb.append(jd.getPipelineStageConnectionName(j));
-      }
-    }
-    String outputConnectionNames = sb.toString();
-
-    String jobType = "";
-    switch (jd.getType())
-    {
-    case IJobDescription.TYPE_CONTINUOUS:
-      jobType = "Continuous crawl";
-      break;
-    case IJobDescription.TYPE_SPECIFIED:
-      jobType = "Specified time";
-      break;
-    default:
-    }
-
-%>
-            <tr job-id="<%= jd.getID() %>">
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewjob.jsp?jobid="+jd.getID()%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listjobs.Viewjob")+" "+jd.getID()%>'
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.View")%></a>
-                  <a href='<%="editjob.jsp?jobid="+jd.getID()%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listjobs.Editjob")+" "+jd.getID()%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.Edit")%></a>
-                  <a href='<%="javascript:Delete(\""+jd.getID()+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listjobs.DeleteJob")+" "+jd.getID()%>'
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.Delete")%></a>
-                  <a href='<%="editjob.jsp?origjobid="+jd.getID()%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listjobs.CopyJob")+" "+jd.getID()%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-clipboard fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.Copy")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(jd.getDescription())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(outputConnectionNames)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(jd.getConnectionName())%></td>
-              <td><%=jobType%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editjob.jsp" title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listjobs.Addajob")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listjobs.AddaNewJob")%></a>
-          </div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listmappers.jsp b/framework/crawler-ui/src/main/webapp/listmappers.jsp
deleted file mode 100644
index 427def3..0000000
--- a/framework/crawler-ui/src/main/webapp/listmappers.jsp
+++ /dev/null
@@ -1,144 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the mapping connection manager handle
-  IMappingConnectionManager manager = MappingConnectionManagerFactory.make(threadContext);
-  IMappingConnectorManager connectorManager = MappingConnectorManagerFactory.make(threadContext);
-  IMappingConnection[] connections = manager.getAllConnections();
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listmappers.ApacheManifoldCFListMappers")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listmappers.ListOfMappingConnections")%>',
-      'authorities'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listmappers.DeleteMapper")%> '"+connectionName+"'?"))
-    {
-      document.listconnections.op.value="Delete";
-      document.listconnections.connname.value=connectionName;
-      $.ManifoldCF.submit(document.listconnections);
-    }
-  }
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listconnections" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="mapper"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listmappers.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listmappers.Description")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listmappers.MapperType")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listmappers.Max")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < connections.length)
-  {
-    IMappingConnection connection = connections[i++];
-
-    String name = connection.getName();
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    int maxCount = connection.getMaxConnections();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"listmappers.uninstalled");
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewmapper.jsp?connname="+URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.View") + " " + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.View")%></a>
-                  <a href='<%="editmapper.jsp?connname="+URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.Edit")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.Delete")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></td>
-              <td><%=Integer.toString(maxCount)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editmapper.jsp"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listmappers.AddNewConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listmappers.AddaNewConnection")%></a>
-          </div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listnotifications.jsp b/framework/crawler-ui/src/main/webapp/listnotifications.jsp
deleted file mode 100644
index c10f185..0000000
--- a/framework/crawler-ui/src/main/webapp/listnotifications.jsp
+++ /dev/null
@@ -1,143 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the notification connection manager handle
-  INotificationConnectionManager manager = NotificationConnectionManagerFactory.make(threadContext);
-  INotificationConnectorManager connectorManager = NotificationConnectorManagerFactory.make(threadContext);
-  INotificationConnection[] connections = manager.getAllConnections();
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listnotifications.ApacheManifoldCFListNotificationConnections")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listnotifications.ListOfNotificationConnections")%>',
-      'repositories'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listnotifications.DeleteNotificationConnection")%> '"+connectionName+"'?"))
-    {
-      document.listconnections.op.value="Delete";
-      document.listconnections.connname.value=connectionName;
-      $.ManifoldCF.submit(document.listconnections);
-    }
-  }
-
-  //-->
-</script>
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listconnections" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="notification"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.Description")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.ConnectionType")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.Max")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < connections.length)
-  {
-    INotificationConnection connection = connections[i++];
-
-    String name = connection.getName();
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"listnotifications.uninstalled");
-    int maxCount = connection.getMaxConnections();
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewnotification.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listnotifications.View")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.View")%></a>
-                  <a href='<%="editnotification.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listnotifications.Edit")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listnotifications.Delete")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></td>
-              <td><%=Integer.toString(maxCount)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editnotification.jsp" title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listnotifications.AddANotificationConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listnotifications.AddaNewNotificationConnection")%></a>
-          </div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listoutputs.jsp b/framework/crawler-ui/src/main/webapp/listoutputs.jsp
deleted file mode 100644
index b3f9a6a..0000000
--- a/framework/crawler-ui/src/main/webapp/listoutputs.jsp
+++ /dev/null
@@ -1,144 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the output connection manager handle
-  IOutputConnectionManager manager = OutputConnectionManagerFactory.make(threadContext);
-  IOutputConnectorManager connectorManager = OutputConnectorManagerFactory.make(threadContext);
-  IOutputConnection[] connections = manager.getAllConnections();
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listoutputs.ApacheManifoldCFListOutputConnections")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listoutputs.ListOfOutputConnections")%>',
-      'outputs'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listoutputs.DeleteOutputConnection")%> '"+connectionName+"'?"))
-    {
-      document.listconnections.op.value="Delete";
-      document.listconnections.connname.value=connectionName;
-      $.ManifoldCF.submit(document.listconnections);
-    }
-  }
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form name="listconnections" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="output"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listoutputs.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listoutputs.Description")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listoutputs.ConnectionType")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listoutputs.Max")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < connections.length)
-  {
-    IOutputConnection connection = connections[i++];
-
-    String name = connection.getName();
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"listoutputs.uninstalled");
-    int maxCount = connection.getMaxConnections();
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewoutput.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.View")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>' 
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.View")%></a>
-                  <a href='<%="editoutput.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.Edit")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>' 
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.Delete")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>' 
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></td>
-              <td><%=Integer.toString(maxCount)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href="editoutput.jsp" title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listoutputs.AddAnOutputConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listoutputs.AddaNewOutputConnection")%></a>
-          </div>
-
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/listtransformations.jsp b/framework/crawler-ui/src/main/webapp/listtransformations.jsp
deleted file mode 100644
index dc38ab5..0000000
--- a/framework/crawler-ui/src/main/webapp/listtransformations.jsp
+++ /dev/null
@@ -1,144 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the transformation connection manager handle
-  ITransformationConnectionManager manager = TransformationConnectionManagerFactory.make(threadContext);
-  ITransformationConnectorManager connectorManager = TransformationConnectorManagerFactory.make(threadContext);
-  ITransformationConnection[] connections = manager.getAllConnections();
-%>
-
-
-<script type="text/javascript">
-
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listtransformations.ApacheManifoldCFListTransformationConnections")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "listtransformations.ListOfTransformationConnections")%>',
-      'outputs'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"listtransformations.DeleteTransformationConnection")%> '"+connectionName+"'?"))
-    {
-      document.listconnections.op.value="Delete";
-      document.listconnections.connname.value=connectionName;
-      $.ManifoldCF.submit(document.listconnections);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="listconnections" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="transformation"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listtransformations.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listtransformations.Description")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listtransformations.ConnectionType")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listtransformations.Max")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < connections.length)
-  {
-    ITransformationConnection connection = connections[i++];
-
-    String name = connection.getName();
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"listtransformations.uninstalled");
-    int maxCount = connection.getMaxConnections();
-
-%>
-            <tr>
-              <td>
-                <div class="btn-group">
-                  <a href='<%="viewtransformation.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.View")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-eye fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.View")%></a>
-                  <a href='<%="edittransformation.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(name)%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.Edit")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="link btn btn-primary btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.Edit")%></a>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(name)+"\")"%>'
-                          title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.Delete")+" "+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(name)%>'
-                          class="btn btn-danger btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.Delete")%></a>
-                </div>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(name)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></td>
-              <td><%=Integer.toString(maxCount)%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <a href="edittransformation.jsp" class="link btn btn-primary" role="button" 
-                  title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"listtransformations.AddATransformationConnection")%>" 
-                  data-toggle="tooltip"><i class="fa fa-plus-circle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"listtransformations.AddaNewTransformationConnection")%></a>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>        
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/login.jsp b/framework/crawler-ui/src/main/webapp/login.jsp
deleted file mode 100644
index 384f25a..0000000
--- a/framework/crawler-ui/src/main/webapp/login.jsp
+++ /dev/null
@@ -1,112 +0,0 @@
-<% response.setHeader("Pragma","No-cache");
-response.setDateHeader("Expires",0);
-response.setHeader("Cache-Control", "no-cache");
-response.setDateHeader("max-age", 0);
-response.setContentType("text/html;charset=utf-8");
-%><%@ include file="adminDefaults.jsp" %>
-
-<%
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html>
-<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-    <meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'>
-    <link href="css/font-awesome.min.css" rel="stylesheet" type="text/css"/>
-    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
-    <link rel="StyleSheet" href="css/style.css" type="text/css" media="screen"/>
-    <title><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.ApacheManifoldCFLogin")%></title>
-    <script type="text/javascript">
-      <!--
-      function login()
-      {
-        document.loginform.submit();
-      }
-
-      document.onkeypress = loginKeyPress;
-
-      function loginKeyPress(e)
-      {
-        e = e || window.event;
-        if (e.keyCode == 13)
-        {
-          document.getElementById('buttonLogin').click();
-          return false;
-        }
-        return true;
-      }
-      //-->
-    </script>
-  </head>
-  <body class="login-page">
-    <div class="login-box">
-      <div class="login-logo">
-        <a href="/"><img src="ManifoldCF-logo.png"/></a>
-      </div>
-      <!-- /.login-logo -->
-      <div class="login-box-body">
-        <p class="login-box-msg">Sign in to start your session</p>
-
-        <form class="standardform" name="loginform" action="setupAdminProfile.jsp" method="POST">
-<%
-if (request.getParameter("nextUrl") != null)
-{
-%>
-          <input type="hidden" name="nextUrl" value="<%=request.getParameter("nextUrl")%>">
-<%
-}
-%>
-<%
-String value = variableContext.getParameter("loginfailed");
-if (value != null && value.equals("true"))
-{
-%>
-          <div class="callout callout-danger">
-            <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.LoginFailed")%></p>
-          </div>
-
-<%
-}
-%>
-          <div class="form-group has-feedback">
-            <input name="userID" type="text" class="form-control" autofocus="autofocus" placeholder="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.UserIDColon")%>"/>
-            <span class="fa fa-user form-control-feedback"></span>
-          </div>
-          <div class="form-group has-feedback">
-            <input name="password" type="password" class="form-control" placeholder="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"index.PasswordColon")%>"/>
-            <span class="fa fa-lock form-control-feedback"></span>
-          </div>
-          <div class="row">
-            <div class="col-xs-8">
-            </div>
-            <div class="col-xs-4">
-              <a href="#" id="buttonLogin" class="btn btn-primary btn-block" onclick='Javascript:login();'
-                      title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"index.Login")%>'><i class="fa fa-sign-in fa-fw" aria-hidden="true"></i>&nbsp;<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"index.Login")%></a>
-            </div>
-          </div>
-        </form>
-      </div>
-    </div>
-  </body>
-</html>
diff --git a/framework/crawler-ui/src/main/webapp/logout.jsp b/framework/crawler-ui/src/main/webapp/logout.jsp
deleted file mode 100644
index 05fe62e..0000000
--- a/framework/crawler-ui/src/main/webapp/logout.jsp
+++ /dev/null
@@ -1,32 +0,0 @@
-<% response.setHeader("Pragma","No-cache");
-response.setDateHeader("Expires",0);
-response.setHeader("Cache-Control", "no-cache");
-response.setDateHeader("max-age", 0);
-response.setContentType("text/html;charset=utf-8");
-%><%@ include file="adminDefaults.jsp" %>
-
-<%
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-adminprofile.logout();
-response.sendRedirect("login.jsp");
-%>
diff --git a/framework/crawler-ui/src/main/webapp/maintenanceunderway.jsp b/framework/crawler-ui/src/main/webapp/maintenanceunderway.jsp
deleted file mode 100644
index 2bc2e63..0000000
--- a/framework/crawler-ui/src/main/webapp/maintenanceunderway.jsp
+++ /dev/null
@@ -1,47 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "error.ApacheManifoldCFMaintenanceUnderway")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "error.ApacheManifoldCFMaintenanceUnderway")%>'
-  );
-  //-->
-</script>
-
-<div class="box box-error">
-  <div class="box-body">
-    <div class="alert alert-danger">
-      <h3><i class="icon fa fa-ban"></i> Error!</h3>
-      <h4><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"error.MaintenanceUnderway")%></h4>
-      <p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"error.PleaseTryAgainLater")%></p>
-    </div>
-  </div>
-  <div class="box-footer with-border">
-    <a class="btn btn-primary" href='index.jsp' 
-            title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"error.Return")%>" data-toggle="tooltip">
-      <i class="fa fa-check fa-fw" aria-hidden="true"></i>OK
-    </a>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/maxactivityreport.jsp b/framework/crawler-ui/src/main/webapp/maxactivityreport.jsp
deleted file mode 100644
index 3252f6a..0000000
--- a/framework/crawler-ui/src/main/webapp/maxactivityreport.jsp
+++ /dev/null
@@ -1,860 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-final String clientTimezoneString = variableContext.getParameter("client_timezone");
-final TimeZone clientTimezone;
-if (clientTimezoneString == null || clientTimezoneString.length() == 0)
-{
-  clientTimezone = TimeZone.getDefault();
-}
-else
-{
-  clientTimezone = TimeZone.getTimeZone(clientTimezoneString);
-}
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_REPORTS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-  
-  int k;
-
-  // Read the parameters.
-  String reportConnection = variableContext.getParameter("reportconnection");
-  if (reportConnection == null)
-    reportConnection = "";
-  String[] reportActivities;
-  if (variableContext.getParameter("reportactivities_posted") != null)
-  {
-    reportActivities = variableContext.getParameterValues("reportactivities");
-    if (reportActivities == null)
-      reportActivities = new String[0];
-  }
-  else
-    reportActivities = null;
-
-  // Get the current time, so we can fill in default values where possible.
-  long currentTime = System.currentTimeMillis();
-
-  Long startTime = null;
-  Long endTime = null;
-
-  // Get start time, if selected
-  String startYear = variableContext.getParameter("reportstartyear");
-  String startMonth = variableContext.getParameter("reportstartmonth");
-  String startDay = variableContext.getParameter("reportstartday");
-  String startHour = variableContext.getParameter("reportstarthour");
-  String startMinute = variableContext.getParameter("reportstartminute");
-
-  // Get end time, if selected.
-  String endYear = variableContext.getParameter("reportendyear");
-  String endMonth = variableContext.getParameter("reportendmonth");
-  String endDay = variableContext.getParameter("reportendday");
-  String endHour = variableContext.getParameter("reportendhour");
-  String endMinute = variableContext.getParameter("reportendminute");
-
-  if (startYear == null && startMonth == null && startDay == null && startHour == null && startMinute == null &&
-      endYear == null && endMonth == null && endDay == null && endHour == null && endMinute == null)
-  {
-    // Nobody has selected a time range yet.  Pick the last hour.
-    endTime = null;
-    startTime = new Long(currentTime - 1000L * 60L * 60L);
-  }
-  else
-  {
-    // Get start time, if selected
-    if (startYear == null)
-      startYear = "";
-    if (startMonth == null)
-      startMonth = "";
-    if (startDay == null)
-      startDay = "";
-    if (startHour == null)
-      startHour = "";
-    if (startMinute == null)
-      startMinute = "";
-
-    // Get end time, if selected.
-    if (endYear == null)
-      endYear = "";
-    if (endMonth == null)
-      endMonth = "";
-    if (endDay == null)
-      endDay = "";
-    if (endHour == null)
-      endHour = "";
-    if (endMinute == null)
-      endMinute = "";
-
-    if (startYear.length() == 0 || startMonth.length() == 0 || startDay.length() == 0 || startHour.length() == 0 || startMinute.length() == 0)
-    {
-      // Undetermined start
-      startTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(startYear));
-      c.set(Calendar.MONTH,Integer.parseInt(startMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(startDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(startHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(startMinute));
-      startTime = new Long(c.getTimeInMillis());
-    }
-    if (endYear.length() == 0 || endMonth.length() == 0 || endDay.length() == 0 || endHour.length() == 0 || endMinute.length() == 0)
-    {
-      // Undetermined end
-      endTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(endYear));
-      c.set(Calendar.MONTH,Integer.parseInt(endMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(endDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(endHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(endMinute));
-      endTime = new Long(c.getTimeInMillis());
-    }
-  }
-
-  // Now, turn the startTime and endTime back into fielded values.  The values will be blank where there is no limit.
-  if (startTime == null)
-  {
-    startYear = "";
-    startMonth = "";
-    startDay = "";
-    startHour = "";
-    startMinute = "";
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(startTime.longValue());
-    startYear = Integer.toString(c.get(Calendar.YEAR));
-    startMonth = Integer.toString(c.get(Calendar.MONTH));
-    startDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    startHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    startMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  if (endTime == null)
-  {
-    endYear = "";
-    endMonth = "";
-    endDay = "";
-    endHour = "";
-    endMinute = "";
-
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(endTime.longValue());
-    endYear = Integer.toString(c.get(Calendar.YEAR));
-    endMonth = Integer.toString(c.get(Calendar.MONTH));
-    endDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    endHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    endMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  // Get the entity match string.
-  String entityMatch = variableContext.getParameter("reportentitymatch");
-  if (entityMatch == null)
-    entityMatch = "";
-
-  // Get the resultcode match string.
-  String resultCodeMatch = variableContext.getParameter("reportresultcodematch");
-  if (resultCodeMatch == null)
-    resultCodeMatch = "";
-
-  String reportBucketDesc = variableContext.getParameter("reportbucketdesc");
-  if (reportBucketDesc == null)
-    reportBucketDesc = "(.*)";
-  String intervalString = variableContext.getParameter("reportinterval");
-  int interval = 5;
-  if (intervalString != null && intervalString.length() > 0)
-    interval = Integer.parseInt(intervalString);
-  long intervalMilliseconds = ((long)interval) * 60L * 1000L;
-
-  // Read the other data we need.
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-
-  // Query the legal list of activities.  This will depend on the connection has been chosen, if any.
-  Map selectedActivities = null;
-  String[] activityList = null;
-  if (reportConnection.length() > 0)
-  {
-    activityList = org.apache.manifoldcf.crawler.system.ManifoldCF.getActivitiesList(threadContext,reportConnection);
-    if (activityList == null)
-      reportConnection = "";
-    else
-    {
-      selectedActivities = new HashMap();
-      String[] activitiesToNote;
-      int j = 0;
-      if (reportActivities == null)
-        activitiesToNote = activityList;
-      else
-        activitiesToNote = reportActivities;
-
-      while (j < activitiesToNote.length)
-      {
-        String activity = activitiesToNote[j++];
-        selectedActivities.put(activity,activity);
-      }
-    }
-  }
-
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "maxactivityreport.ApacheManifoldCFMaximumActivityReport")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "maxactivityreport.MaximumActivityReport")%>',
-      'historyreports'
-  );
-  function Go()
-  {
-    if (!isInteger(report.rowcount.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.EnterALegalNumberForRowsPerPage")%>");
-      report.rowcount.focus();
-      return;
-    }
-    if (!isInteger(report.reportinterval.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.EnterALegalIntervalSizeInMinutes")%>");
-      report.reportinterval.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClassDescriptionCannotBeEmpty")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value.indexOf("(") == -1 || report.reportbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-
-    document.report.op.value="Report";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function Continue()
-  {
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value.indexOf("(") == -1 || report.reportbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-
-    document.report.op.value="Continue";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function ColumnClick(colname)
-  {
-    document.report.clickcolumn.value=colname;
-    Go();
-  }
-
-  function SetPosition(amt)
-  {
-    if (amt < 0)
-      amt=0;
-    document.report.startrow.value=amt;
-    Go();
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <form class="standardform" name="report" action="execute.jsp" method="POST">
-      <input type="hidden" name="op" value="Continue"/>
-      <input type="hidden" name="type" value="maxactivityreport"/>
-
-      <div class="box box-primary">
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Connection")%></th>
-              <td colspan="1">
-                <select name="reportconnection" class="form-control">
-                  <option <%=(reportConnection.length()==0)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-<%
-  int i = 0;
-  while (i < connList.length)
-  {
-    IRepositoryConnection conn = connList[i++];
-    String thisConnectionName = conn.getName();
-    String thisDescription = conn.getDescription();
-    if (thisDescription == null || thisDescription.length() == 0)
-      thisDescription = thisConnectionName;
-%>
-                  <option <%=(thisConnectionName.equals(reportConnection))?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisConnectionName)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Activities")%></th>
-              <td colspan="1">
-                <input type="hidden" name="reportactivities_posted" value="true"/>
-                <select multiple="true" class="selectpicker" name="reportactivities">
-<%
-  i = 0;
-  while (i < activityList.length)
-  {
-    String activity = activityList[i++];
-%>
-                  <option <%=((selectedActivities.get(activity) == null)?"":"selected=\"selected\"")%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(activity)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(activity)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  }
-  else
-  {
-%>
-              <td colspan="2"></td>
-<%
-  }
-%>
-
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.StartTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportstarthour'>
-                    <option value="" <%=(startHour.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(startHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportstartminute'>
-                    <option value="" <%=(startMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(startMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.on")%></span>
-                  <select class="schedulepulldown" name='reportstartmonth'>
-                    <option value="" <%=(startMonth.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-                    <option value="0" <%=(startMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.January")%></option>
-                    <option value="1" <%=(startMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.February")%></option>
-                    <option value="2" <%=(startMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.March")%></option>
-                    <option value="3" <%=(startMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.April")%></option>
-                    <option value="4" <%=(startMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.May")%></option>
-                    <option value="5" <%=(startMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.June")%></option>
-                    <option value="6" <%=(startMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.July")%></option>
-                    <option value="7" <%=(startMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.August")%></option>
-                    <option value="8" <%=(startMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.September")%></option>
-                    <option value="9" <%=(startMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.October")%></option>
-                    <option value="10" <%=(startMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.November")%></option>
-                    <option value="11" <%=(startMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportstartday'>
-                    <option value="" <%=(startDay.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(startDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportstartyear'>
-                    <option value="" <%=(startYear.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-<% 
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (startYear.equals(""+year))?"selected=\"selected\"":""; 
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<% 
-  } 
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.EndTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportendhour'>
-                    <option value="" <%=(endHour.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%> --</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(endHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportendminute'>
-                    <option value="" <%=(endMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(endMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.on")%></span>
-                  <select class="schedulepulldown" name='reportendmonth'>
-                    <option value="" <%=(endMonth.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%>--</option>
-                    <option value="0" <%=(endMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.January")%></option>
-                    <option value="1" <%=(endMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.February")%></option>
-                    <option value="2" <%=(endMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.March")%></option>
-                    <option value="3" <%=(endMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.April")%></option>
-                    <option value="4" <%=(endMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.May")%></option>
-                    <option value="5" <%=(endMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.June")%></option>
-                    <option value="6" <%=(endMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.July")%></option>
-                    <option value="7" <%=(endMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.August")%></option>
-                    <option value="8" <%=(endMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.September")%></option>
-                    <option value="9" <%=(endMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.October")%></option>
-                    <option value="10" <%=(endMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.November")%></option>
-                    <option value="11" <%=(endMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportendday'>
-                    <option value="" <%=(endDay.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(endDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select><span class="label">,</span>
-                  <select class="schedulepulldown" name='reportendyear'>
-                    <option value="" <%=(endYear.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.NotSpecified")%>--</option>
-<% 
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (endYear.equals(""+year))?"selected=\"selected\"":"";
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<% 
-  }
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.EntityMatch")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportentitymatch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(entityMatch)%>'/></td>
-              <th class="description"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.ResultCodeMatch")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportresultcodematch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(resultCodeMatch)%>'/></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClassDescription")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportbucketdesc" size="20" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(reportBucketDesc)%>'/></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.SlidingWindowSize")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportinterval" size="5" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(interval))%>'/></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Go()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxactivityreport.ExecuteThisQuery")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxactivityreport.Go")%></a>
-<%
-  }
-  else
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Continue()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxactivityreport.Continue")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxactivityreport.Continue")%></a>
-<%
-  }
-%>
-          </div>
-        </div>
-      </div>
-<%
-  if (reportConnection.length() > 0)
-  {
-    // Run the report.
-
-    // First, we need to gather the sort order object.
-    String sortOrderString = variableContext.getParameter("sortorder");
-    SortOrder sortOrder;
-    if (sortOrderString == null || sortOrderString.length() == 0)
-      sortOrder = new SortOrder();
-    else
-      sortOrder = new SortOrder(sortOrderString);
-
-    // Now, gather the column header that was clicked on (if any)
-    String clickedColumn = variableContext.getParameter("clickcolumn");
-    if (clickedColumn != null && clickedColumn.length() > 0)
-      sortOrder.clickColumn(clickedColumn);
-
-    // Gather the start
-    String startRowString = variableContext.getParameter("startrow");
-    int startRow = 0;
-    if (startRowString != null && startRowString.length() > 0)
-      startRow = Integer.parseInt(startRowString);
-
-    // Gather the max
-    String maxRowCountString = variableContext.getParameter("rowcount");
-    int rowCount = 20;
-    if (maxRowCountString != null && maxRowCountString.length() > 0)
-      rowCount = Integer.parseInt(maxRowCountString);
-
-    String[] ourActivities = new String[selectedActivities.size()];
-    Iterator iter = selectedActivities.keySet().iterator();
-    int zz = 0;
-    while (iter.hasNext())
-    {
-      ourActivities[zz++] = (String)iter.next();
-    }
-
-    RegExpCriteria entityMatchObject = null;
-    if (entityMatch.length() > 0)
-      entityMatchObject = new RegExpCriteria(entityMatch,true);
-    RegExpCriteria resultCodeMatchObject = null;
-    if (resultCodeMatch.length() > 0)
-      resultCodeMatchObject = new RegExpCriteria(resultCodeMatch,true);
-    FilterCriteria criteria = new FilterCriteria(ourActivities,startTime,endTime,entityMatchObject,resultCodeMatchObject);
-%>
-      <input type="hidden" name="clickcolumn" value=""/>
-      <input type="hidden" name="startrow" value='<%=Integer.toString(startRow)%>'/>
-      <input type="hidden" name="sortorder" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sortOrder.toString())%>'/>
-<%
-    long count = connMgr.countHistoryRows(reportConnection,criteria);
-    long maxCount = connMgr.getMaxRows();
-    boolean hasMoreRows;
-    if (count > maxCount)
-    {
-      hasMoreRows = false;
-%>
-      <div class="callout callout-warning">
-        You have selected <%=new Long(count).toString()%> rows. Maximum allowed is <%=new Long(maxCount).toString()%>.
-      </div>
-<%
-    }
-    else
-    {
-      BucketDescription idBucket = new BucketDescription(reportBucketDesc,false);
-
-      IResultSet set = connMgr.genHistoryActivityCount(reportConnection,criteria,sortOrder,idBucket,
-        intervalMilliseconds,startRow,rowCount+1);
-
-%>
-
-      <div class="box box-primary">
-        <div class="box-body table-responsive">
-          <table class="table table-bordered">
-            <tr>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("idbucket");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.IdentifierClass")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("activitycount");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.HighestActivityRate")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("starttime");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.StartTime")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("endtime");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.EndTime")%></nobr></a></th>
-            </tr>
-<%
-      zz = 0;
-      hasMoreRows = (set.getRowCount() > rowCount);
-      int iterCount = hasMoreRows?rowCount:set.getRowCount();
-      while (zz < iterCount)
-      {
-        IResultRow row = set.getRow(zz);
-        Object idBucketObject = row.getValue("idbucket");
-        String idBucketString;
-        if (idBucketObject == null)
-          idBucketString = "";
-        else
-          idBucketString = idBucketObject.toString();
-
-        String startTimeString = org.apache.manifoldcf.ui.util.Formatter.formatTime(Converter.asLong(row.getValue("starttime")));
-        String endTimeString = org.apache.manifoldcf.ui.util.Formatter.formatTime(Converter.asLong(row.getValue("endtime")));
-        double activityCount = Converter.asDouble(row.getValue("activitycount"));
-        double activityRate = activityCount * 60000.0 / intervalMilliseconds;
-
-%>
-            <tr>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(idBucketString)%></nobr></td>
-              <td><%=new Double(activityRate).toString()%></td>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(startTimeString)%></nobr></td>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(endTimeString)%></nobr></td>
-            </tr>
-<%
-        zz++;
-      }
-%>
-          </table>
-        </div>
-        <%
-          }
-        %>
-        <div class="box-footer clearfix">
-          <ul class="pagination pagination-sm no-margin pull-left">
-<%
-    if (startRow == 0)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Previous")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li>
-              <a href="javascript:void(0);"
-                      onclick='<%="javascript:SetPosition("+Integer.toString(startRow-rowCount)+");"%>'
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxactivityreport.PreviousPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Previous")%></a>
-            </li>
-<%
-    }
-    if (hasMoreRows == false)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Next")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li>
-              <a href="javascript:void(0);"
-                      onclick='<%="javascript:SetPosition("+Integer.toString(startRow+rowCount)+");"%>'
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxactivityreport.NextPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Next")%></a>
-            </li>
-<%
-    }
-%>
-          </ul>
-          <ul class="pagination pagination-sm no-margin pull-right">
-            <li class="pad">
-              <span class="label label-primary"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.Rows")%><%=Integer.toString(startRow)%>-<%=(hasMoreRows?Integer.toString(startRow+rowCount-1):"END")%></span>
-            </li>
-            <li class="form-inline">
-              <div class="input-group input-group-sm">
-                <span class="input-group-addon"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.RowsPerPage")%></span>
-                <input type="text" class="form-control" name="rowcount" size="5" value='<%=Integer.toString(rowCount)%>'/>
-              </div>
-            </li>
-          </ul>
-        </div>
-      </div>
-
-<%
-  }
-  else
-  {
-%>
-      <div class="callout callout-info"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxactivityreport.PleaseSelectAConnection")%></div>
-<%
-  }
-%>
-    </form>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/maxbandwidthreport.jsp b/framework/crawler-ui/src/main/webapp/maxbandwidthreport.jsp
deleted file mode 100644
index 520f9fb..0000000
--- a/framework/crawler-ui/src/main/webapp/maxbandwidthreport.jsp
+++ /dev/null
@@ -1,854 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-final String clientTimezoneString = variableContext.getParameter("client_timezone");
-final TimeZone clientTimezone;
-if (clientTimezoneString == null || clientTimezoneString.length() == 0)
-{
-  clientTimezone = TimeZone.getDefault();
-}
-else
-{
-  clientTimezone = TimeZone.getTimeZone(clientTimezoneString);
-}
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_REPORTS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-  
-  int k;
-
-  // Read the parameters.
-  String reportConnection = variableContext.getParameter("reportconnection");
-  if (reportConnection == null)
-    reportConnection = "";
-  String[] reportActivities;
-  if (variableContext.getParameter("reportactivities_posted") != null)
-  {
-    reportActivities = variableContext.getParameterValues("reportactivities");
-    if (reportActivities == null)
-      reportActivities = new String[0];
-  }
-  else
-    reportActivities = null;
-
-  // Get the current time, so we can fill in default values where possible.
-  long currentTime = System.currentTimeMillis();
-
-  Long startTime = null;
-  Long endTime = null;
-
-  // Get start time, if selected
-  String startYear = variableContext.getParameter("reportstartyear");
-  String startMonth = variableContext.getParameter("reportstartmonth");
-  String startDay = variableContext.getParameter("reportstartday");
-  String startHour = variableContext.getParameter("reportstarthour");
-  String startMinute = variableContext.getParameter("reportstartminute");
-
-  // Get end time, if selected.
-  String endYear = variableContext.getParameter("reportendyear");
-  String endMonth = variableContext.getParameter("reportendmonth");
-  String endDay = variableContext.getParameter("reportendday");
-  String endHour = variableContext.getParameter("reportendhour");
-  String endMinute = variableContext.getParameter("reportendminute");
-
-  if (startYear == null && startMonth == null && startDay == null && startHour == null && startMinute == null &&
-      endYear == null && endMonth == null && endDay == null && endHour == null && endMinute == null)
-  {
-    // Nobody has selected a time range yet.  Pick the last hour.
-    endTime = null;
-    startTime = new Long(currentTime - 1000L * 60L * 60L);
-  }
-  else
-  {
-    // Get start time, if selected
-    if (startYear == null)
-      startYear = "";
-    if (startMonth == null)
-      startMonth = "";
-    if (startDay == null)
-      startDay = "";
-    if (startHour == null)
-      startHour = "";
-    if (startMinute == null)
-      startMinute = "";
-
-    // Get end time, if selected.
-    if (endYear == null)
-      endYear = "";
-    if (endMonth == null)
-      endMonth = "";
-    if (endDay == null)
-      endDay = "";
-    if (endHour == null)
-      endHour = "";
-    if (endMinute == null)
-      endMinute = "";
-
-    if (startYear.length() == 0 || startMonth.length() == 0 || startDay.length() == 0 || startHour.length() == 0 || startMinute.length() == 0)
-    {
-      // Undetermined start
-      startTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(startYear));
-      c.set(Calendar.MONTH,Integer.parseInt(startMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(startDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(startHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(startMinute));
-      startTime = new Long(c.getTimeInMillis());
-    }
-    if (endYear.length() == 0 || endMonth.length() == 0 || endDay.length() == 0 || endHour.length() == 0 || endMinute.length() == 0)
-    {
-      // Undetermined end
-      endTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(endYear));
-      c.set(Calendar.MONTH,Integer.parseInt(endMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(endDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(endHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(endMinute));
-      endTime = new Long(c.getTimeInMillis());
-    }
-  }
-
-  // Now, turn the startTime and endTime back into fielded values.  The values will be blank where there is no limit.
-  if (startTime == null)
-  {
-    startYear = "";
-    startMonth = "";
-    startDay = "";
-    startHour = "";
-    startMinute = "";
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(startTime.longValue());
-    startYear = Integer.toString(c.get(Calendar.YEAR));
-    startMonth = Integer.toString(c.get(Calendar.MONTH));
-    startDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    startHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    startMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  if (endTime == null)
-  {
-    endYear = "";
-    endMonth = "";
-    endDay = "";
-    endHour = "";
-    endMinute = "";
-
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(endTime.longValue());
-    endYear = Integer.toString(c.get(Calendar.YEAR));
-    endMonth = Integer.toString(c.get(Calendar.MONTH));
-    endDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    endHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    endMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  // Get the entity match string.
-  String entityMatch = variableContext.getParameter("reportentitymatch");
-  if (entityMatch == null)
-    entityMatch = "";
-
-  // Get the resultcode match string.
-  String resultCodeMatch = variableContext.getParameter("reportresultcodematch");
-  if (resultCodeMatch == null)
-    resultCodeMatch = "";
-
-  String reportBucketDesc = variableContext.getParameter("reportbucketdesc");
-  if (reportBucketDesc == null)
-    reportBucketDesc = "(.*)";
-  String intervalString = variableContext.getParameter("reportinterval");
-  int interval = 5;
-  if (intervalString != null && intervalString.length() > 0)
-    interval = Integer.parseInt(intervalString);
-  long intervalMilliseconds = ((long)interval) * 60L * 1000L;
-
-  // Read the other data we need.
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-
-  // Query the legal list of activities.  This will depend on the connection has been chosen, if any.
-  Map selectedActivities = null;
-  String[] activityList = null;
-  if (reportConnection.length() > 0)
-  {
-    activityList = org.apache.manifoldcf.crawler.system.ManifoldCF.getActivitiesList(threadContext,reportConnection);
-    if (activityList == null)
-      reportConnection = "";
-    else
-    {
-      selectedActivities = new HashMap();
-      String[] activitiesToNote;
-      int j = 0;
-      if (reportActivities == null)
-        activitiesToNote = activityList;
-      else
-        activitiesToNote = reportActivities;
-
-      while (j < activitiesToNote.length)
-      {
-        String activity = activitiesToNote[j++];
-        selectedActivities.put(activity,activity);
-      }
-    }
-  }
-
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "maxbandwidthreport.ApacheManifoldCFMaximumBandwidthReport")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "maxbandwidthreport.MaximumBandwidthReport")%>',
-      'historyreports'
-  );
-
-  function Go()
-  {
-    if (!isInteger(report.rowcount.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EnterALegalNumberForRowsPerPage")%>");
-      report.rowcount.focus();
-      return;
-    }
-    if (!isInteger(report.reportinterval.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EnterALegalIntervalSizeInMinutes")%>");
-      report.reportinterval.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClassDescriptionCannotBeEmpty")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value.indexOf("(") == -1 || report.reportbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-
-    document.report.op.value="Report";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function Continue()
-  {
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value.indexOf("(") == -1 || report.reportbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-
-    document.report.op.value="Continue";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function ColumnClick(colname)
-  {
-    document.report.clickcolumn.value=colname;
-    Go();
-  }
-
-  function SetPosition(amt)
-  {
-    if (amt < 0)
-      amt=0;
-    document.report.startrow.value=amt;
-    Go();
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <form class="standardform" name="report" action="execute.jsp" method="POST">
-      <input type="hidden" name="op" value="Continue"/>
-      <input type="hidden" name="type" value="maxbandwidthreport"/>
-
-      <div class="box box-primary">
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th colspan="1"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Connection")%></th>
-              <td colspan="1">
-                <select name="reportconnection" class="form-control">
-                  <option <%=(reportConnection.length()==0)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  int i = 0;
-  while (i < connList.length)
-  {
-    IRepositoryConnection conn = connList[i++];
-    String thisConnectionName = conn.getName();
-    String thisDescription = conn.getDescription();
-    if (thisDescription == null || thisDescription.length() == 0)
-      thisDescription = thisConnectionName;
-%>
-                  <option <%=(thisConnectionName.equals(reportConnection))?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisConnectionName)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-              <th colspan="1"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Activities")%></th>
-              <td colspan="1">
-                <input type="hidden" name="reportactivities_posted" value="true"/>
-                <select multiple="true" class="selectpicker" name="reportactivities">
-<%
-    i = 0;
-    while (i < activityList.length)
-    {
-      String activity = activityList[i++];
-%>
-                  <option <%=((selectedActivities.get(activity) == null)?"":"selected=\"selected\"")%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(activity)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(activity)%></option>
-<%
-    }
-%>
-                </select>
-              </td>
-<%
-  }
-  else
-  {
-%>
-              <td colspan="2"></td>
-<%
-  }
-%>
-
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.StartTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportstarthour'>
-                    <option value="" <%=(startHour.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(startHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportstartminute'>
-                    <option value="" <%=(startMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(startMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.on")%></span>
-                  <select class="schedulepulldown" name='reportstartmonth'>
-                    <option value="" <%=(startMonth.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-                    <option value="0" <%=(startMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.January")%></option>
-                    <option value="1" <%=(startMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.February")%></option>
-                    <option value="2" <%=(startMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.March")%></option>
-                    <option value="3" <%=(startMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.April")%></option>
-                    <option value="4" <%=(startMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.May")%></option>
-                    <option value="5" <%=(startMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.June")%></option>
-                    <option value="6" <%=(startMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.July")%></option>
-                    <option value="7" <%=(startMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.August")%></option>
-                    <option value="8" <%=(startMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.September")%></option>
-                    <option value="9" <%=(startMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.October")%></option>
-                    <option value="10" <%=(startMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.November")%></option>
-                    <option value="11" <%=(startMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.December")%></option>
-                  </select> 
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportstartday'>
-                    <option value="" <%=(startDay.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(startDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportstartyear'>
-                    <option value="" <%=(startYear.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<% 
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (startYear.equals(""+year))?"selected=\"selected\"":""; 
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<% 
-  } 
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EndTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportendhour'>
-                    <option value="" <%=(endHour.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(endHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportendminute'>
-                    <option value="" <%=(endMinute.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(endMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.on")%></span>
-                  <select class="schedulepulldown" name='reportendmonth'>
-                    <option value="" <%=(endMonth.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-                    <option value="0" <%=(endMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.January")%></option>
-                    <option value="1" <%=(endMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.February")%></option>
-                    <option value="2" <%=(endMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.March")%></option>
-                    <option value="3" <%=(endMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.April")%></option>
-                    <option value="4" <%=(endMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.May")%></option>
-                    <option value="5" <%=(endMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.June")%></option>
-                    <option value="6" <%=(endMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.July")%></option>
-                    <option value="7" <%=(endMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.August")%></option>
-                    <option value="8" <%=(endMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.September")%></option>
-                    <option value="9" <%=(endMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.October")%></option>
-                    <option value="10" <%=(endMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.November")%></option>
-                    <option value="11" <%=(endMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportendday'>
-                    <option value="" <%=(endDay.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(endDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportendyear'>
-                    <option value="" <%=(endYear.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NotSpecified")%>--</option>
-<% 
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (startYear.equals(""+year))?"selected=\"selected\"":"";
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<% 
-  } 
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EntityMatch")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportentitymatch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(entityMatch)%>'/></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.ResultCodeMatch")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportresultcodematch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(resultCodeMatch)%>'/></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClassDescription")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportbucketdesc" size="20" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(reportBucketDesc)%>'/></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.SlidingWindowSize")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportinterval" size="5" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(Integer.toString(interval))%>'/></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Go()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxbandwidthreport.ExecuteThisQuery")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Go")%></a>
-<%
-  }
-  else
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Continue()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Continue")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Continue")%></a>
-<%
-  }
-%>
-          </div>
-        </div>
-      </div>
-<%
-  if (reportConnection.length() > 0)
-  {
-    // Run the report.
-
-    // First, we need to gather the sort order object.
-    String sortOrderString = variableContext.getParameter("sortorder");
-    SortOrder sortOrder;
-    if (sortOrderString == null || sortOrderString.length() == 0)
-      sortOrder = new SortOrder();
-    else
-      sortOrder = new SortOrder(sortOrderString);
-
-    // Now, gather the column header that was clicked on (if any)
-    String clickedColumn = variableContext.getParameter("clickcolumn");
-    if (clickedColumn != null && clickedColumn.length() > 0)
-      sortOrder.clickColumn(clickedColumn);
-
-    // Gather the start
-    String startRowString = variableContext.getParameter("startrow");
-    int startRow = 0;
-    if (startRowString != null && startRowString.length() > 0)
-      startRow = Integer.parseInt(startRowString);
-
-    // Gather the max
-    String maxRowCountString = variableContext.getParameter("rowcount");
-    int rowCount = 20;
-    if (maxRowCountString != null && maxRowCountString.length() > 0)
-      rowCount = Integer.parseInt(maxRowCountString);
-
-    String[] ourActivities = new String[selectedActivities.size()];
-    Iterator iter = selectedActivities.keySet().iterator();
-    int zz = 0;
-    while (iter.hasNext())
-    {
-      ourActivities[zz++] = (String)iter.next();
-    }
-
-    RegExpCriteria entityMatchObject = null;
-    if (entityMatch.length() > 0)
-      entityMatchObject = new RegExpCriteria(entityMatch,true);
-    RegExpCriteria resultCodeMatchObject = null;
-    if (resultCodeMatch.length() > 0)
-      resultCodeMatchObject = new RegExpCriteria(resultCodeMatch,true);
-    FilterCriteria criteria = new FilterCriteria(ourActivities,startTime,endTime,entityMatchObject,resultCodeMatchObject);
-%>
-      <input type="hidden" name="clickcolumn" value=""/>
-      <input type="hidden" name="startrow" value='<%=Integer.toString(startRow)%>'/>
-      <input type="hidden" name="sortorder" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sortOrder.toString())%>'/>
-<%
-    long count = connMgr.countHistoryRows(reportConnection,criteria);
-    long maxCount = connMgr.getMaxRows();
-    boolean hasMoreRows;
-    if (count > maxCount)
-    {
-      hasMoreRows = false;
-%>
-      <div class="callout callout-warning">You have selected <%=new Long(count).toString()%> rows. Maximum allowed is <%=new Long(maxCount).toString()%>.</div>
-<%
-    }
-    else
-    {
-      BucketDescription idBucket = new BucketDescription(reportBucketDesc,false);
-
-      IResultSet set = connMgr.genHistoryByteCount(reportConnection,criteria,sortOrder,idBucket,
-        intervalMilliseconds,startRow,rowCount+1);
-
-%>
-      <div class="box box-primary">
-        <div class="box-body table-responsive">
-          <table class="table table-bordered">
-            <tr>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("idbucket");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.IdentifierClass")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("bytecount");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.HighestBandwidth")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("starttime");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.StartTime")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("endtime");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.EndTime")%></a></th>
-            </tr>
-<%
-      zz = 0;
-      hasMoreRows = (set.getRowCount() > rowCount);
-      int iterCount = hasMoreRows?rowCount:set.getRowCount();
-      while (zz < iterCount)
-      {
-        IResultRow row = set.getRow(zz);
-        Object idBucketObject = row.getValue("idbucket");
-        String idBucketString;
-        if (idBucketObject == null)
-          idBucketString = "";
-        else
-          idBucketString = idBucketObject.toString();
-        String startTimeString = org.apache.manifoldcf.ui.util.Formatter.formatTime(Converter.asLong(row.getValue("starttime")));
-        String endTimeString = org.apache.manifoldcf.ui.util.Formatter.formatTime(Converter.asLong(row.getValue("endtime").toString()));
-        double byteCount = Converter.asDouble(row.getValue("bytecount"));
-        double bandwidth = byteCount * 1000.0 / intervalMilliseconds;
-
-%>
-            <tr>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(idBucketString)%></nobr></td>
-              <td><%=new Double(bandwidth).toString()%></td>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(startTimeString)%></nobr></td>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(endTimeString)%></nobr></td>
-            </tr>
-<%
-        zz++;
-      }
-%>
-          </table>
-        </div>
-<%
-    }
-%>
-        <div class="box-footer clearfix">
-          <ul class="pagination pagination-sm no-margin pull-left">
-<%
-    if (startRow == 0)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Previous")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li><a href="javascript:void(0);" 
-                    onclick='<%="javascript:SetPosition("+Integer.toString(startRow-rowCount)+");"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxbandwidthreport.PreviousPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Previous")%></a>
-            </li>
-<%
-    }
-    if (hasMoreRows == false)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Next")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li><a href="javascript:void(0);" 
-                    onclick='<%="javascript:SetPosition("+Integer.toString(startRow+rowCount)+");"%>'
-                    titile="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"maxbandwidthreport.NextPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Next")%></a></li>
-<%
-    }
-%>
-          </ul>
-          <ul class="pagination pagination-sm no-margin pull-right">
-            <li class="pad">
-              <span class="label label-primary"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.Rows")%><%=Integer.toString(startRow)%>-<%=(hasMoreRows?Integer.toString(startRow+rowCount-1):"END")%></span>
-            </li>
-            <li class="form-inline">
-              <div class="input-group input-group-sm">
-                <span class="input-group-addon"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.RowsPerPage")%></span>
-                <input type="text" class="form-control" name="rowcount" size="5" value='<%=Integer.toString(rowCount)%>'/>
-              </div>
-            </li>
-          </ul>
-        </div>
-      </div>
-<%
-  }
-  else
-  {
-%>
-      <div class="callout callout-info"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"maxbandwidthreport.PleaseSelectAConnection")%></div>
-<%
-  }
-%>
-    </form>
-<%
-} catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/queuestatus.jsp b/framework/crawler-ui/src/main/webapp/queuestatus.jsp
deleted file mode 100644
index 89312d0..0000000
--- a/framework/crawler-ui/src/main/webapp/queuestatus.jsp
+++ /dev/null
@@ -1,636 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_REPORTS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-  
-  int k;
-
-  // Read the document selection parameters.
-
-  // The status report is connection based, so the connection has to be selected before anything else makes sense.
-  String statusConnection = variableContext.getParameter("statusconnection");
-  if (statusConnection == null)
-    statusConnection = "";
-
-  // Which jobs we care about also figure in the selection part of the query.  It is the user's responsibility to pick jobs
-  // that are in desired states.
-  String[] statusJobIdentifiers = variableContext.getParameterValues("statusjobs");
-  if (statusJobIdentifiers == null)
-    statusJobIdentifiers = new String[0];
-
-  // We can select documents from the queue based on the earliest time they can be acted upon.  This is specified in
-  // a delta in minutes offset from "now".  Empty means that we don't want to select on that criteria.
-  String activeTimeOffsetMinutes = variableContext.getParameter("statusscheduleoffset");
-  if (activeTimeOffsetMinutes == null)
-    activeTimeOffsetMinutes = "";
-
-  // There is a selection criteria also based on the document state; these are integers defined in IJobManager.
-  String[] documentStateTypes;
-  if (variableContext.getParameter("statusdocumentstates_posted") != null)
-  {
-    documentStateTypes = variableContext.getParameterValues("statusdocumentstates");
-    if (documentStateTypes == null)
-      documentStateTypes = new String[0];
-  }
-  else
-    documentStateTypes = null;
-
-  // There is a selection criteria based on the document status; these are also integers defined in IJobManager.
-  String[] documentStatusTypes;
-  if (variableContext.getParameter("statusdocumentstatuses_posted") != null)
-  {
-    documentStatusTypes = variableContext.getParameterValues("statusdocumentstatuses");
-    if (documentStatusTypes == null)
-      documentStatusTypes = new String[0];
-  }
-  else
-    documentStatusTypes = null;
-
-  // Match string for the document identifier
-  String identifierMatch = variableContext.getParameter("statusidentifiermatch");
-  if (identifierMatch == null)
-    identifierMatch = "";
-
-  String statusBucketDesc = variableContext.getParameter("statusbucketdesc");
-  if (statusBucketDesc == null)
-    statusBucketDesc = "(.*)";
-
-  // From the passed-in selection values, calculate the actual selection criteria that we'll use in the queries.
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-
-  IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-  // Repository connection name: This simply needs to be mapped to an eligible list of identifiers.
-  IJobDescription[] eligibleList = null;
-  HashMap selectedJobs = null;
-  if (statusConnection.length() > 0)
-  {
-    eligibleList = jobManager.findJobsForConnection(statusConnection);
-    selectedJobs = new HashMap();
-    k = 0;
-    while (k < statusJobIdentifiers.length)
-    {
-      Long identifier = new Long(statusJobIdentifiers[k++]);
-      selectedJobs.put(identifier,identifier);
-    }
-  }
-
-  // Time offset: Need to calculate the actual time in ms since epoch to use to query against the "checktime" field.
-  // Note that the checktime field is actually nullable and will only have a value when the document is in certain states;
-  // therefore, the query itself will only include checktime for those states where it makes sense.  An empty value
-  // means "from the beginning of time", or is equivalent to time 0.
-  long nowTime = 0L;
-  if (activeTimeOffsetMinutes.length() > 0)
-  {
-    nowTime = System.currentTimeMillis() + (new Long(activeTimeOffsetMinutes).longValue()) * 60000L;
-    if (nowTime < 0L)
-      nowTime = 0L;
-  }
-  else
-    nowTime = System.currentTimeMillis();
-
-  // Translate the states from a string to a number that will be understood by IJobManager.
-  int[] matchingStates;
-  if (documentStateTypes == null)
-  {
-    matchingStates = new int[]{IJobManager.DOCSTATE_NEVERPROCESSED,IJobManager.DOCSTATE_PREVIOUSLYPROCESSED,IJobManager.DOCSTATE_OUTOFSCOPE};
-  }
-  else
-  {
-    matchingStates = new int[documentStateTypes.length];
-    k = 0;
-    while (k < matchingStates.length)
-    {
-      matchingStates[k] = new Integer(documentStateTypes[k]).intValue();
-      k++;
-    }
-  }
-  HashMap matchingStatesHash = new HashMap();
-  k = 0;
-  while (k < matchingStates.length)
-  {
-    Integer state = new Integer(matchingStates[k++]);
-    matchingStatesHash.put(state,state);
-  }
-
-  // Convert the status from a string to a number that will be understood by IJobManager
-  int[] matchingStatuses;
-  if (documentStatusTypes == null)
-  {
-    matchingStatuses = new int[]{IJobManager.DOCSTATUS_INACTIVE,IJobManager.DOCSTATUS_PROCESSING,IJobManager.DOCSTATUS_EXPIRING,
-      IJobManager.DOCSTATUS_DELETING,IJobManager.DOCSTATUS_READYFORPROCESSING,IJobManager.DOCSTATUS_READYFOREXPIRATION,
-      IJobManager.DOCSTATUS_WAITINGFORPROCESSING,IJobManager.DOCSTATUS_WAITINGFOREXPIRATION,IJobManager.DOCSTATUS_WAITINGFOREVER,
-      IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED};
-  }
-  else
-  {
-    matchingStatuses = new int[documentStatusTypes.length];
-    k = 0;
-    while (k < matchingStatuses.length)
-    {
-      matchingStatuses[k] = new Integer(documentStatusTypes[k]).intValue();
-      k++;
-    }
-  }
-  HashMap matchingStatusesHash = new HashMap();
-  k = 0;
-  while (k < matchingStatuses.length)
-  {
-    Integer status = new Integer(matchingStatuses[k++]);
-    matchingStatusesHash.put(status,status);
-  }
-
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "queuestatus.ApacheManifoldCFQueueStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.QueueStatus")%>',
-      'statusReports'
-  );
-  function Go()
-  {
-    if (report.statusbucketdesc.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescriptionCannotBeEmpty")%>");
-      report.statusbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.statusbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.statusbucketdesc.focus();
-      return;
-    }
-    if (report.statusbucketdesc.value.indexOf("(") == -1 || report.statusbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.statusbucketdesc.focus();
-      return;
-    }
-    if (!isInteger(report.rowcount.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.EnterALegalNumberForRowsPerPage")%>");
-      report.rowcount.focus();
-      return;
-    }
-    if (!isRegularExpression(report.statusidentifiermatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierMatchMustBeAValidRegularExpression")%>");
-      report.statusidentifiermatch.focus();
-      return;
-    }
-
-    document.report.op.value="Status";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function Continue()
-  {
-    if (report.statusbucketdesc.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescriptionCannotBeEmpty")%>");
-      report.statusbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.statusbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.statusbucketdesc.focus();
-      return;
-    }
-    if (report.statusbucketdesc.value.indexOf("(") == -1 || report.statusbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.statusbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.statusidentifiermatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierMatchMustBeAValidRegularExpression")%>");
-      report.statusidentifiermatch.focus();
-      return;
-    }
-    document.report.op.value="Continue";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function ColumnClick(colname)
-  {
-    document.report.clickcolumn.value=colname;
-    Go();
-  }
-
-  function SetPosition(amt)
-  {
-    if (amt < 0)
-      amt=0;
-    document.report.startrow.value=amt;
-    Go();
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  $(function ()
-  {
-    $('.selectpicker').selectpicker();
-  });
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <form class="standardform" name="report" action="execute.jsp" method="POST">
-      <input type="hidden" name="op" value="Continue"/>
-      <input type="hidden" name="type" value="queuestatus"/>
-
-      <div class="box box-primary">
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Connection")%></th>
-              <td>
-                <select class="selectpicker" name="statusconnection">
-                  <option <%=(statusConnection.length() == 0)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.NotSpecified")%>--</option>
-<%
-  int i = 0;
-  while (i < connList.length)
-  {
-    IRepositoryConnection conn = connList[i++];
-    String thisConnectionName = conn.getName();
-    String thisDescription = conn.getDescription();
-    if (thisDescription == null || thisDescription.length() == 0)
-      thisDescription = thisConnectionName;
-%>
-                  <option <%=(thisConnectionName.equals(statusConnection))?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisConnectionName)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  if (eligibleList != null)
-  {
-%>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Jobs")%></th>
-              <th>
-                <select class="selectpicker" multiple="true" name="statusjobs">
-<%
-    i = 0;
-    while (i < eligibleList.length)
-    {
-      IJobDescription job = eligibleList[i++];
-      String description = job.getDescription();
-      Long identifier = job.getID();
-%>
-                  <option <%=((selectedJobs.get(identifier)==null)?"":"selected=\"selected\"")%> value='<%=identifier.toString()%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></option>
-<%
-    }
-%>
-                </select>
-              </td>
-<%
-  }
-  else
-  {
-%>
-              <td colspan="2"></td>
-<%
-  }
-%>
-
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.TimeOffsetFromNowMinutes")%></th>
-              <td colspan="3">
-                <input name="statusscheduleoffset" type="text" size="6" value=""/>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentState")%></th>
-              <td colspan="3">
-                <input name="statusdocumentstates_posted" type="hidden" value="true"/>
-                <select class="selectpicker" name="statusdocumentstates" multiple="true">
-                  <option <%=((matchingStatesHash.get(new Integer(IJobManager.DOCSTATE_NEVERPROCESSED))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATE_NEVERPROCESSED)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsThatHaveNeverBeenProcessed")%></option>
-                  <option <%=((matchingStatesHash.get(new Integer(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsProcessedAtLeastOnce")%></option>
-                  <option <%=((matchingStatesHash.get(new Integer(IJobManager.DOCSTATE_OUTOFSCOPE))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATE_OUTOFSCOPE)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsOutOfScope")%></option>
-                </select>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentState")%></th>
-              <td colspan="3">
-                <input name="statusdocumentstatuses_posted" type="hidden" value="true"/>
-                <select class="selectpicker" name="statusdocumentstatuses" multiple="true">
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_INACTIVE))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_INACTIVE)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsThatAreNoLongerActive")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_PROCESSING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_PROCESSING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsCurrentlyInProgress")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_EXPIRING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_EXPIRING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsCurrentlyBeingExpired")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_DELETING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_DELETING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsCurrentlyBeingDeleted")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_READYFORPROCESSING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_READYFORPROCESSING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsCurrentlyAvailableForProcessing")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_READYFOREXPIRATION))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_READYFOREXPIRATION)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsCurrentlyAvailableForExpiration")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_WAITINGFORPROCESSING))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_WAITINGFORPROCESSING)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsNotYetProcessable")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsNotYetExpirable")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_WAITINGFOREVER))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_WAITINGFOREVER)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsWaitingForever")%></option>
-                  <option <%=((matchingStatusesHash.get(new Integer(IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED))==null)?"":"selected=\"selected\"")%> value='<%=Integer.toString(IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED)%>'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentsHopcountExceeded")%></option>
-                </select>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.DocumentIdentifierMatch")%></th>
-              <td colspan="3">
-                <input type="text" name="statusidentifiermatch" size="40" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(identifierMatch)%>'/>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClassDescription")%></th>
-              <td colspan="3">
-                <input type="text" name="statusbucketdesc" size="40" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(statusBucketDesc)%>'/>
-              </td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-<%
-  if (statusConnection.length() > 0 && statusJobIdentifiers.length > 0)
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Go()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"queuestatus.ExecuteThisQuery")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"queuestatus.Go")%></a>
-<%
-  }
-  else
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Continue()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"queuestatus.Continue")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"queuestatus.Continue")%></a>
-<%
-  }
-%>
-          </div>
-        </div>
-      </div>
-<%
-  if (statusConnection.length() > 0)
-  {
-    if (statusJobIdentifiers.length > 0)
-    {
-      // Run the report.
-
-      // First, we need to gather the sort order object.
-      String sortOrderString = variableContext.getParameter("sortorder");
-      SortOrder sortOrder;
-      if (sortOrderString == null || sortOrderString.length() == 0)
-        sortOrder = new SortOrder();
-      else
-        sortOrder = new SortOrder(sortOrderString);
-
-      // Now, gather the column header that was clicked on (if any)
-      String clickedColumn = variableContext.getParameter("clickcolumn");
-      if (clickedColumn != null && clickedColumn.length() > 0)
-        sortOrder.clickColumn(clickedColumn);
-
-      // Gather the start
-      String startRowString = variableContext.getParameter("startrow");
-      int startRow = 0;
-      if (startRowString != null && startRowString.length() > 0)
-        startRow = Integer.parseInt(startRowString);
-
-      // Gather the max
-      String maxRowCountString = variableContext.getParameter("rowcount");
-      int rowCount = 20;
-      if (maxRowCountString != null && maxRowCountString.length() > 0)
-        rowCount = Integer.parseInt(maxRowCountString);
-
-      Long[] ourJobs = new Long[selectedJobs.size()];
-      Iterator iter = selectedJobs.keySet().iterator();
-      int zz = 0;
-      while (iter.hasNext())
-      {
-        ourJobs[zz++] = (Long)iter.next();
-      }
-
-      RegExpCriteria identifierMatchObject = null;
-      if (identifierMatch.length() > 0)
-        identifierMatchObject = new RegExpCriteria(identifierMatch,true);
-      StatusFilterCriteria criteria = new StatusFilterCriteria(ourJobs,nowTime,identifierMatchObject,matchingStates,matchingStatuses);
-
-      BucketDescription idBucket = new BucketDescription(statusBucketDesc,false);
-      IResultSet set = jobManager.genQueueStatus(statusConnection,criteria,sortOrder,idBucket,startRow,rowCount+1);
-
-%>
-          <input type="hidden" name="clickcolumn" value=""/>
-          <input type="hidden" name="startrow" value='<%=Integer.toString(startRow)%>'/>
-          <input type="hidden" name="sortorder" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sortOrder.toString())%>'/>
-
-      <div class="box box-primary">
-        <div class="box-body  table-responsive no-padding">
-          <table class="table table-bordered">
-            <tr>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("idbucket");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.IdentifierClass")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("inactive");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Inactive")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("processing");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Processing")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("expiring");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Expiring")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("deleting");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Deleting")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("processready");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.AboutToProcess")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("expireready");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.AboutToExpire")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("processwaiting");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.WaitingForProcessing")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("expirewaiting");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.WaitingForExpiration")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("waitingforever");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.WaitingForever")%></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("hopcountexceeded");'><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.HopcountExceeded")%></a></th>
-</tr>
-<%
-      zz = 0;
-      boolean hasMoreRows = (set.getRowCount() > rowCount);
-      int iterCount = hasMoreRows?rowCount:set.getRowCount();
-      while (zz < iterCount)
-      {
-        IResultRow row = set.getRow(zz);
-
-        // Translate column values into something that can be reasonably displayed.
-        // Note that the actual hard work of translating things to human-readable strings largely is done by the query itself; this is because
-        // we want to sort on the columns, so it has to be that way.
-
-        String idBucketValue = (String)row.getValue("idbucket");
-        if (idBucketValue == null)
-          idBucketValue = "";
-        String[] identifierBreakdown = org.apache.manifoldcf.ui.util.Formatter.formatString(idBucketValue,64,true,true);
-
-%>
-            <tr>
-              <td>
-<%
-        int q = 0;
-        while (q < identifierBreakdown.length)
-        {
-%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(identifierBreakdown[q++])%></nobr><br/>
-<%
-        }
-%>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("inactive").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("processing").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("expiring").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("deleting").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("processready").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("expireready").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("processwaiting").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("expirewaiting").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("waitingforever").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("hopcountexceeded").toString())%></td>
-            </tr>
-<%
-        zz++;
-      }
-%>
-          </table>
-        </div>
-        <div class="box-footer">
-          <div class="row">
-            <div class="col-md-7">
-              <ul class="pagination pagination-sm no-margin pull-left">
-<%
-      if (startRow == 0)
-      {
-%>
-                <li><a href="#"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Previous")%></a></li>
-<%
-      }
-      else
-      {
-%>
-                <li>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:SetPosition("+Integer.toString(startRow-rowCount)+");"%>'
-                          title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"queuestatus.PreviousPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Previous")%></a>
-                </li>
-<%
-      }
-      if (hasMoreRows == false)
-      {
-%>
-                <li><a href="#"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Next")%></a></li>
-<%
-      }
-      else
-      {
-%>
-                <li>
-                  <a href="javascript:void(0);"
-                          onclick='<%="javascript:SetPosition("+Integer.toString(startRow+rowCount)+");"%>'
-                          title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"queuestatus.NextPage")%>" data-toggle="title"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Next")%></a>
-                </li>
-<%
-      }
-%>
-              </ul>
-            </div>
-            <div class="col-md-2">
-              <span class="label label-primary"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.Rows")%></span>
-              <span class="label label-primary"><%=Integer.toString(startRow)%>-<%=(hasMoreRows?Integer.toString(startRow+rowCount-1):"END")%></span>
-            </div>
-            <div class="col-md-3">
-              <div class="input-group input-group-sm">
-                <span class="input-group-addon"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.RowsPerPage")%></span>
-                <input type="text" class="form-control" name="rowcount" size="5" value='<%=Integer.toString(rowCount)%>'/>
-              </div>
-            </div>
-          </div>
-        </div>
-
-<%
-    }
-    else
-    {
-%>
-        <div class="callout callout-info"><p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.PleaseSelectAtLeastOneJob")%></p></div>
-<%
-    }
-  }
-  else
-  {
-%>
-        <div class="callout callout-info"><p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"queuestatus.PleaseSelectaConnection")%></p></div>
-<%
-  }
-%>
-      </div>
-    </form>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/resultreport.jsp b/framework/crawler-ui/src/main/webapp/resultreport.jsp
deleted file mode 100644
index bddb60d..0000000
--- a/framework/crawler-ui/src/main/webapp/resultreport.jsp
+++ /dev/null
@@ -1,863 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-final String clientTimezoneString = variableContext.getParameter("client_timezone");
-final TimeZone clientTimezone;
-if (clientTimezoneString == null || clientTimezoneString.length() == 0)
-{
-  clientTimezone = TimeZone.getDefault();
-}
-else
-{
-  clientTimezone = TimeZone.getTimeZone(clientTimezoneString);
-}
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_REPORTS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-  
-  int k;
-
-  // Read the parameters.
-  String reportConnection = variableContext.getParameter("reportconnection");
-  if (reportConnection == null)
-    reportConnection = "";
-  String[] reportActivities;
-  if (variableContext.getParameter("reportactivities_posted") != null)
-  {
-    reportActivities = variableContext.getParameterValues("reportactivities");
-    if (reportActivities == null)
-      reportActivities = new String[0];
-  }
-  else
-    reportActivities = null;
-
-  // Get the current time, so we can fill in default values where possible.
-  long currentTime = System.currentTimeMillis();
-
-  Long startTime = null;
-  Long endTime = null;
-
-  // Get start time, if selected
-  String startYear = variableContext.getParameter("reportstartyear");
-  String startMonth = variableContext.getParameter("reportstartmonth");
-  String startDay = variableContext.getParameter("reportstartday");
-  String startHour = variableContext.getParameter("reportstarthour");
-  String startMinute = variableContext.getParameter("reportstartminute");
-
-  // Get end time, if selected.
-  String endYear = variableContext.getParameter("reportendyear");
-  String endMonth = variableContext.getParameter("reportendmonth");
-  String endDay = variableContext.getParameter("reportendday");
-  String endHour = variableContext.getParameter("reportendhour");
-  String endMinute = variableContext.getParameter("reportendminute");
-
-  if (startYear == null && startMonth == null && startDay == null && startHour == null && startMinute == null &&
-      endYear == null && endMonth == null && endDay == null && endHour == null && endMinute == null)
-  {
-    // Nobody has selected a time range yet.  Pick the last hour.
-    endTime = null;
-    startTime = new Long(currentTime - 1000L * 60L * 60L);
-  }
-  else
-  {
-    // Get start time, if selected
-    if (startYear == null)
-      startYear = "";
-    if (startMonth == null)
-      startMonth = "";
-    if (startDay == null)
-      startDay = "";
-    if (startHour == null)
-      startHour = "";
-    if (startMinute == null)
-      startMinute = "";
-
-    // Get end time, if selected.
-    if (endYear == null)
-      endYear = "";
-    if (endMonth == null)
-      endMonth = "";
-    if (endDay == null)
-      endDay = "";
-    if (endHour == null)
-      endHour = "";
-    if (endMinute == null)
-      endMinute = "";
-
-    if (startYear.length() == 0 || startMonth.length() == 0 || startDay.length() == 0 || startHour.length() == 0 || startMinute.length() == 0)
-    {
-      // Undetermined start
-      startTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(startYear));
-      c.set(Calendar.MONTH,Integer.parseInt(startMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(startDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(startHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(startMinute));
-      startTime = new Long(c.getTimeInMillis());
-    }
-    if (endYear.length() == 0 || endMonth.length() == 0 || endDay.length() == 0 || endHour.length() == 0 || endMinute.length() == 0)
-    {
-      // Undetermined end
-      endTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(endYear));
-      c.set(Calendar.MONTH,Integer.parseInt(endMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(endDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(endHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(endMinute));
-      endTime = new Long(c.getTimeInMillis());
-    }
-  }
-
-  // Now, turn the startTime and endTime back into fielded values.  The values will be blank where there is no limit.
-  if (startTime == null)
-  {
-    startYear = "";
-    startMonth = "";
-    startDay = "";
-    startHour = "";
-    startMinute = "";
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(startTime.longValue());
-    startYear = Integer.toString(c.get(Calendar.YEAR));
-    startMonth = Integer.toString(c.get(Calendar.MONTH));
-    startDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    startHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    startMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  if (endTime == null)
-  {
-    endYear = "";
-    endMonth = "";
-    endDay = "";
-    endHour = "";
-    endMinute = "";
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(endTime.longValue());
-    endYear = Integer.toString(c.get(Calendar.YEAR));
-    endMonth = Integer.toString(c.get(Calendar.MONTH));
-    endDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    endHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    endMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  // Get the entity match string.
-  String entityMatch = variableContext.getParameter("reportentitymatch");
-  if (entityMatch == null)
-    entityMatch = "";
-
-  // Get the resultcode match string.
-  String resultCodeMatch = variableContext.getParameter("reportresultcodematch");
-  if (resultCodeMatch == null)
-    resultCodeMatch = "";
-
-  String reportBucketDesc = variableContext.getParameter("reportbucketdesc");
-  if (reportBucketDesc == null)
-    reportBucketDesc = "(.*)";
-
-  String reportResultDesc = variableContext.getParameter("reportresultdesc");
-  if (reportResultDesc == null)
-    reportResultDesc = "(.*)";
-
-  // Read the other data we need.
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-
-  // Query the legal list of activities.  This will depend on the connection has been chosen, if any.
-  Map selectedActivities = null;
-  String[] activityList = null;
-  if (reportConnection.length() > 0)
-  {
-    activityList = org.apache.manifoldcf.crawler.system.ManifoldCF.getActivitiesList(threadContext,reportConnection);
-    if (activityList == null)
-      reportConnection = "";
-    else
-    {
-      selectedActivities = new HashMap();
-      String[] activitiesToNote;
-      int j = 0;
-      if (reportActivities == null)
-        activitiesToNote = activityList;
-      else
-        activitiesToNote = reportActivities;
-
-      while (j < activitiesToNote.length)
-      {
-        String activity = activitiesToNote[j++];
-        selectedActivities.put(activity,activity);
-      }
-    }
-  }
-
-
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "resultreport.ApacheManifoldCFActivityResultReport")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "resultreport.ActivityResultReport")%>',
-      'historyreports'
-  );
-
-  function Go()
-  {
-    if (!isInteger(report.rowcount.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.EnterALegalNumberForRowsPerPage")%>");
-      report.rowcount.focus();
-      return;
-    }
-
-    if (report.reportbucketdesc.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClassDescriptionCannotBeEmpty")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-
-    if (report.reportresultdesc.value == "")
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultClassDescriptionCannotBeEmpty")%>");
-      report.reportresultdesc.focus();
-      return;
-    }
-
-    if (!isRegularExpression(report.reportbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-
-    if (!isRegularExpression(report.reportresultdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportresultdesc.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value.indexOf("(") == -1 || report.reportbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (report.reportresultdesc.value.indexOf("(") == -1 || report.reportresultdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportresultdesc.focus();
-      return;
-    }
-
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-
-    document.report.op.value="Report";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function Continue()
-  {
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportbucketdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultdesc.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultClassDescriptionMustBeAValidRegularExpression")%>");
-      report.reportresultdesc.focus();
-      return;
-    }
-    if (report.reportbucketdesc.value.indexOf("(") == -1 || report.reportbucketdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportbucketdesc.focus();
-      return;
-    }
-    if (report.reportresultdesc.value.indexOf("(") == -1 || report.reportresultdesc.value.indexOf(")") == -1)
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"resultreport.ResultClassDescriptionMustDelimitAClassWithParentheses")%>");
-      report.reportresultdesc.focus();
-      return;
-    }
-
-    document.report.op.value="Continue";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function ColumnClick(colname)
-  {
-    document.report.clickcolumn.value=colname;
-    Go();
-  }
-
-  function SetPosition(amt)
-  {
-    if (amt < 0)
-      amt=0;
-    document.report.startrow.value=amt;
-    Go();
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <form class="standardform" name="report" action="execute.jsp" method="POST">
-      <input type="hidden" name="op" value="Continue"/>
-      <input type="hidden" name="type" value="resultreport"/>
-
-      <div class="box box-primary">
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th colspan="1"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Connection")%></th>
-              <td colspan="1">
-                <select name="reportconnection" class="form-control">
-                  <option <%=(reportConnection.length()==0)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  int i = 0;
-  while (i < connList.length)
-  {
-    IRepositoryConnection conn = connList[i++];
-    String thisConnectionName = conn.getName();
-    String thisDescription = conn.getDescription();
-    if (thisDescription == null || thisDescription.length() == 0)
-      thisDescription = thisConnectionName;
-%>
-                  <option <%=(thisConnectionName.equals(reportConnection))?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisConnectionName)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-              <th colspan="1"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Activities")%></th>
-              <td colspan="1">
-                <input type="hidden" name="reportactivities_posted" value="true"/>
-                <select multiple="true" class="selectpicker" name="reportactivities">
-<%
-    i = 0;
-    while (i < activityList.length)
-    {
-      String activity = activityList[i++];
-%>
-                  <option <%=((selectedActivities.get(activity) == null)?"":"selected=\"selected\"")%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(activity)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(activity)%></option>
-<%
-    }
-%>
-                </select>
-              </td>
-<%
-  }
-  else
-  {
-%>
-              <td colspan="2"></td>
-<%
-  }
-%>
-
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.StartTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportstarthour'>
-                    <option value="" <%=(startHour.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(startHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportstartminute'>
-                    <option value="" <%=(startMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(startMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.on")%></span>
-                  <select class="schedulepulldown" name='reportstartmonth'>
-                    <option value="" <%=(startMonth.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-                    <option value="0" <%=(startMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.January")%></option>
-                    <option value="1" <%=(startMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.February")%></option>
-                    <option value="2" <%=(startMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.March")%></option>
-                    <option value="3" <%=(startMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.April")%></option>
-                    <option value="4" <%=(startMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.May")%></option>
-                    <option value="5" <%=(startMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.June")%></option>
-                    <option value="6" <%=(startMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.July")%></option>
-                    <option value="7" <%=(startMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.August")%></option>
-                    <option value="8" <%=(startMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.September")%></option>
-                    <option value="9" <%=(startMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.October")%></option>
-                    <option value="10" <%=(startMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.November")%></option>
-                    <option value="11" <%=(startMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportstartday'>
-                    <option value="" <%=(startDay.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(startDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportstartyear'>
-                    <option value="" <%=(startYear.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<% 
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (startYear.equals(""+year))?"selected=\"selected\"":""; 
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<% 
-  }
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.EndTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportendhour'>
-                    <option value="" <%=(endHour.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(endHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportendminute'>
-                    <option value="" <%=(endMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(endMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.on")%></span>
-                  <select class="schedulepulldown" name='reportendmonth'>
-                    <option value="" <%=(endMonth.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-                    <option value="0" <%=(endMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.January")%></option>
-                    <option value="1" <%=(endMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.February")%></option>
-                    <option value="2" <%=(endMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.March")%></option>
-                    <option value="3" <%=(endMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.April")%></option>
-                    <option value="4" <%=(endMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.May")%></option>
-                    <option value="5" <%=(endMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.June")%></option>
-                    <option value="6" <%=(endMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.July")%></option>
-                    <option value="7" <%=(endMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.August")%></option>
-                    <option value="8" <%=(endMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.September")%></option>
-                    <option value="9" <%=(endMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.October")%></option>
-                    <option value="10" <%=(endMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.November")%></option>
-                    <option value="11" <%=(endMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportendday'>
-                    <option value="" <%=(endDay.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(endDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportendyear'>
-                    <option value="" <%=(endYear.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.NotSpecified")%>--</option>
-<%
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (startYear.equals("" + year))?"selected=\"selected\"":"";
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<%
-  }
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.EntityMatch")%></nobr></td>
-              <td><input type="text" class="form-control" name="reportentitymatch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(entityMatch)%>'/></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.ResultCodeMatch")%></nobr></td>
-              <td><input type="text" class="form-control" name="reportresultcodematch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(resultCodeMatch)%>'/></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClassDescription")%></nobr></td>
-              <td><input type="text" class="form-control" name="reportbucketdesc" size="20" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(reportBucketDesc)%>'/></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.ResultCodeClassDescription")%></nobr></td>
-              <td><input type="text" class="form-control" name="reportresultdesc" size="20" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(reportResultDesc)%>'/></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Go()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"resultreport.ExecuteThisQuery")%>"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"resultreport.Go")%></a>
-<%
-  }
-  else
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Continue()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"resultreport.Continue")%>"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"resultreport.Continue")%></a>
-            <%
-              }
-            %>
-          </div>
-        </div>
-      </div>
-<%
-  if (reportConnection.length() > 0)
-  {
-    // Run the report.
-
-    // First, we need to gather the sort order object.
-    String sortOrderString = variableContext.getParameter("sortorder");
-    SortOrder sortOrder;
-    if (sortOrderString == null || sortOrderString.length() == 0)
-      sortOrder = new SortOrder();
-    else
-      sortOrder = new SortOrder(sortOrderString);
-
-    // Now, gather the column header that was clicked on (if any)
-    String clickedColumn = variableContext.getParameter("clickcolumn");
-    if (clickedColumn != null && clickedColumn.length() > 0)
-      sortOrder.clickColumn(clickedColumn);
-
-    // Gather the start
-    String startRowString = variableContext.getParameter("startrow");
-    int startRow = 0;
-    if (startRowString != null && startRowString.length() > 0)
-      startRow = Integer.parseInt(startRowString);
-
-    // Gather the max
-    String maxRowCountString = variableContext.getParameter("rowcount");
-    int rowCount = 20;
-    if (maxRowCountString != null && maxRowCountString.length() > 0)
-      rowCount = Integer.parseInt(maxRowCountString);
-
-    String[] ourActivities = new String[selectedActivities.size()];
-    Iterator iter = selectedActivities.keySet().iterator();
-    int zz = 0;
-    while (iter.hasNext())
-    {
-      ourActivities[zz++] = (String)iter.next();
-    }
-
-    RegExpCriteria entityMatchObject = null;
-    if (entityMatch.length() > 0)
-      entityMatchObject = new RegExpCriteria(entityMatch,true);
-    RegExpCriteria resultCodeMatchObject = null;
-    if (resultCodeMatch.length() > 0)
-      resultCodeMatchObject = new RegExpCriteria(resultCodeMatch,true);
-    FilterCriteria criteria = new FilterCriteria(ourActivities,startTime,endTime,entityMatchObject,resultCodeMatchObject);
-
-    BucketDescription idBucket = new BucketDescription(reportBucketDesc,false);
-    BucketDescription resultBucket = new BucketDescription(reportResultDesc,false);
-
-    IResultSet set = connMgr.genHistoryResultCodes(reportConnection,criteria,sortOrder,resultBucket,idBucket,startRow,rowCount+1);
-
-%>
-      <input type="hidden" name="clickcolumn" value=""/>
-      <input type="hidden" name="startrow" value='<%=Integer.toString(startRow)%>'/>
-      <input type="hidden" name="sortorder" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sortOrder.toString())%>'/>
-
-      <div class="box box-primary">
-        <div class="box-body table-responsive">
-          <table class="table table-bordered">
-            <tr>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("idbucket");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.IdentifierClass")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("resultcodebucket");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.ResultClass")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("eventcount");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.EventCount")%></nobr></a></th>
-            </tr>
-<%
-    zz = 0;
-    boolean hasMoreRows = (set.getRowCount() > rowCount);
-    int iterCount = hasMoreRows?rowCount:set.getRowCount();
-    while (zz < iterCount)
-    {
-      IResultRow row = set.getRow(zz);
-      Object idBucketObject = row.getValue("idbucket");
-      String idBucketString;
-      if (idBucketObject == null)
-        idBucketString = "";
-      else
-        idBucketString = idBucketObject.toString();
-      Object resultCodeBucketObject = row.getValue("resultcodebucket");
-      String resultCodeBucketString;
-      if (resultCodeBucketObject == null)
-        resultCodeBucketString = "";
-      else
-        resultCodeBucketString = resultCodeBucketObject.toString();
-%>
-            <tr <%="class=\""+((zz%2==0)?"evendatarow":"odddatarow")+"\""%>>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(idBucketString)%></nobr></td>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(resultCodeBucketString)%></nobr></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("eventcount").toString())%></td>
-            </tr>
-<%
-      zz++;
-    }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <ul class="pagination pagination-sm no-margin pull-left">
-<%
-    if (startRow == 0)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Previous")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li><a href="javascript:void(0);" onclick='<%="javascript:SetPosition("+Integer.toString(startRow-rowCount)+");"%>' 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"resultreport.PreviousPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Previous")%></a></li>
-<%
-    }
-    if (hasMoreRows == false)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Next")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li><a href="javascript:void(0);" onclick='<%="javascript:SetPosition("+Integer.toString(startRow+rowCount)+");"%>' 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"resultreport.NextPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Next")%></a></li>
-<%
-    }
-%>
-          </ul>
-          <ul class="pagination pagination-sm no-margin pull-right">
-            <li class="pad">
-              <span class="label label-primary"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.Rows")%><%=Integer.toString(startRow)%>-<%=(hasMoreRows?Integer.toString(startRow+rowCount-1):"END")%></span>
-            </li>
-            <li class="form-inline">
-              <div class="input-group input-group-sm">
-                <span class="input-group-addon"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.RowsPerPage")%></span><input type="text" class="form-control" name="rowcount" size="5" value='<%=Integer.toString(rowCount)%>'/>
-              </div>
-            </li>
-          </ul>
-        </div>
-      </div>
-<%
-  }
-  else
-  {
-%>
-      <div class="callout callout-info"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"resultreport.PleaseSelectAConnection")%></div>
-<%
-  }
-%>
-    </form>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-<jsp:forward page="error.jsp"/>
-<%
-}
-%>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/setupAdminProfile.jsp b/framework/crawler-ui/src/main/webapp/setupAdminProfile.jsp
deleted file mode 100644
index 948f2f9..0000000
--- a/framework/crawler-ui/src/main/webapp/setupAdminProfile.jsp
+++ /dev/null
@@ -1,56 +0,0 @@
-<%@ page import="org.apache.manifoldcf.core.util.URLDecoder" %>
-<% response.setHeader("Pragma","No-cache");
-response.setDateHeader("Expires",0);
-response.setHeader("Cache-Control", "no-cache");
-response.setDateHeader("max-age", 0);
-response.setContentType("text/html;charset=utf-8");
-%><%@ include file="adminDefaults.jsp" %>
-
-<%
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-String userID = variableContext.getParameter("userID");
-String password = variableContext.getParameter("password");
-if (userID == null)
-  userID = "";
-if (password == null)
-  password = "";
-
-adminprofile.login(threadContext,userID,password);
-if (adminprofile.getLoggedOn())
-{
-  String nextUri = request.getParameter("nextUrl");
-  if (nextUri == null)
-  {
-    response.sendRedirect("index.jsp");
-  }
-  else
-  {
-    response.sendRedirect(URLDecoder.decode(nextUri));
-  }
-}
-else
-{
-  // Go back to login page, but with signal that login failed
-  response.sendRedirect("login.jsp?loginfailed=true");
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/showjobstatus.jsp b/framework/crawler-ui/src/main/webapp/showjobstatus.jsp
deleted file mode 100644
index d012103..0000000
--- a/framework/crawler-ui/src/main/webapp/showjobstatus.jsp
+++ /dev/null
@@ -1,309 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_RUN_JOBS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-  
-  // Get the max count
-  int maxCount = LockManagerFactory.getIntProperty(threadContext,"org.apache.manifoldcf.ui.maxstatuscount",500000);
-  // Get the job manager handle
-  IJobManager manager = JobManagerFactory.make(threadContext);
-  JobStatus[] jobs = manager.getAllStatus(true,maxCount);
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "showjobstatus.ApacheManifoldCFStatusOfAllJobs")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "showjobstatus.StatusOfJobs")%>',
-      'jobs'
-  );
-
-  function Start(jobID)
-  {
-    document.liststatuses.op.value="Start";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  function StartMinimal(jobID)
-  {
-    document.liststatuses.op.value="StartMinimal";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  function Abort(jobID)
-  {
-    document.liststatuses.op.value="Abort";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  function Restart(jobID)
-  {
-    document.liststatuses.op.value="Restart";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  function RestartMinimal(jobID)
-  {
-    document.liststatuses.op.value="RestartMinimal";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  function Pause(jobID)
-  {
-    document.liststatuses.op.value="Pause";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  function Resume(jobID)
-  {
-    document.liststatuses.op.value="Resume";
-    document.liststatuses.jobid.value=jobID;
-    $.ManifoldCF.submit(document.liststatuses);
-  }
-
-  //-->
-</script>
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="liststatuses" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="jobstatus"/>
-        <input type="hidden" name="jobid" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th>Action</th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Name")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Status")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.StartTime")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.EndTime")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Documents")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Active")%></th>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Processed")%></th>
-            </tr>
-<%
-  int i = 0;
-  while (i < jobs.length)
-  {
-    JobStatus js = jobs[i++];
-    String statusName;
-    int status = js.getStatus();
-    switch (status)
-    {
-    case JobStatus.JOBSTATUS_NOTYETRUN:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Notyetrun");
-      break;
-    case JobStatus.JOBSTATUS_RUNNING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Running");
-      break;
-    case JobStatus.JOBSTATUS_RUNNING_UNINSTALLED:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Runningnoconnector");
-      break;
-    case JobStatus.JOBSTATUS_ABORTING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Aborting");
-      break;
-    case JobStatus.JOBSTATUS_RESTARTING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Restarting");
-      break;
-    case JobStatus.JOBSTATUS_STOPPING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Stopping");
-      break;
-    case JobStatus.JOBSTATUS_RESUMING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Resuming");
-      break;
-    case JobStatus.JOBSTATUS_PAUSED:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Paused");
-      break;
-    case JobStatus.JOBSTATUS_COMPLETED:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Done");
-      break;
-    case JobStatus.JOBSTATUS_WINDOWWAIT:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Waiting");
-      break;
-    case JobStatus.JOBSTATUS_STARTING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Startingup");
-      break;
-    case JobStatus.JOBSTATUS_DESTRUCTING:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Cleaningup");
-      break;
-    case JobStatus.JOBSTATUS_JOBENDCLEANUP:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Terminating");
-      break;
-    case JobStatus.JOBSTATUS_JOBENDNOTIFICATION:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Endnotification");
-      break;
-    case JobStatus.JOBSTATUS_ERROR:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.ErrorColon")+" "+js.getErrorText();
-      break;
-    default:
-      statusName = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Unknown");
-      break;
-    }
-    String startTime = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Notstarted");
-    if (js.getStartTime() != -1L)
-      startTime = new Date(js.getStartTime()).toString();
-    String endTime = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Aborted");
-    if (js.getStartTime() == -1L)
-      endTime = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Neverrun");
-    else
-    {
-      if (js.getEndTime() == -1L)
-      {
-        if (status == JobStatus.JOBSTATUS_COMPLETED)
-          endTime = Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Aborted");
-        else
-          endTime = "";
-      }
-      else
-        endTime = new Date(js.getEndTime()).toString();
-    }
-%>
-            <tr job-id="<%= js.getJobID() %>" job-status="<%= status %>" job-status-name="<%= statusName%>">
-              <td>
-
-<%
-    if (status == JobStatus.JOBSTATUS_NOTYETRUN ||
-      status == JobStatus.JOBSTATUS_COMPLETED ||
-      status == JobStatus.JOBSTATUS_ERROR)
-    {
-%>
-                <a href='<%="javascript:Start(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Startjob")+" "+js.getJobID()%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-play fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Start")%></a>
-                <a href='<%="javascript:StartMinimal(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Startjob")+" "+js.getJobID()+" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.minimally")%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-compress fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Startminimal")%></a>
-<%
-    }
-    if (status == JobStatus.JOBSTATUS_RUNNING ||
-      status == JobStatus.JOBSTATUS_RUNNING_UNINSTALLED ||
-      status == JobStatus.JOBSTATUS_WINDOWWAIT ||
-      status == JobStatus.JOBSTATUS_PAUSED ||
-      status == JobStatus.JOBSTATUS_STARTING)
-    {
-%>
-                <a href='<%="javascript:Restart(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Restartjob")+" "+js.getJobID()%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-play fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Restart")%></a>
-                <a href='<%="javascript:RestartMinimal(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Restartjob")+" "+js.getJobID()+" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.minimally")%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-compress fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Restartminimal")%></a>
-<%
-    }
-    if (status == JobStatus.JOBSTATUS_RUNNING ||
-      status == JobStatus.JOBSTATUS_RUNNING_UNINSTALLED ||
-      status == JobStatus.JOBSTATUS_WINDOWWAIT)
-    {
-%>
-                <a href='<%="javascript:Pause(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Pausejob")+" "+js.getJobID()%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-pause fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Pause")%></a>
-<%
-    }
-    if (status == JobStatus.JOBSTATUS_RUNNING ||
-      status == JobStatus.JOBSTATUS_RUNNING_UNINSTALLED ||
-      status == JobStatus.JOBSTATUS_STOPPING ||
-      status == JobStatus.JOBSTATUS_RESUMING ||
-      status == JobStatus.JOBSTATUS_WINDOWWAIT ||
-      status == JobStatus.JOBSTATUS_PAUSED ||
-      status == JobStatus.JOBSTATUS_STARTING ||
-      status == JobStatus.JOBSTATUS_RESTARTING)
-    {
-%>
-                <a href='<%="javascript:Abort(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Abortjob")+" "+js.getJobID()%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-stop fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Abort")%></a>
-<%
-    }
-    if (status == JobStatus.JOBSTATUS_PAUSED)
-    {
-%>
-                <a href='<%="javascript:Resume(\""+js.getJobID()+"\")"%>'
-                        title='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.Resumejob")+" "+js.getJobID()%>'
-                        class="btn btn-success btn-xs" role="button" data-toggle="tooltip"><i class="fa fa-play fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Resume")%></a>
-<%
-    }
-%>
-
-              </td>
-              <td><%="<!--jobid=" + js.getJobID() + "-->"%><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(js.getDescription())%></td>
-              <td><%=statusName%></td>
-              <td><%=startTime%></td>
-              <td><%=endTime%></td>
-              <td><%=(js.getQueueCountExact()?"":"&gt; ")%><%=new Long(js.getDocumentsInQueue()).toString()%></td>
-              <td><%=(js.getOutstandingCountExact()?"":"&gt; ")%><%=new Long(js.getDocumentsOutstanding()).toString()%></td>
-              <td><%=(js.getProcessedCountExact()?"":"&gt; ")%><%=new Long(js.getDocumentsProcessed()).toString()%></td>
-            </tr>
-<%
-  }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-            <a href="showjobstatus.jsp"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"showjobstatus.RefreshStatus")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"showjobstatus.Refresh")%></a>
-        </div>
-          
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-<jsp:forward page="error.jsp"/>
-<%
-}
-%>
-      </form>
-    </div>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/sidebar.jsp b/framework/crawler-ui/src/main/webapp/sidebar.jsp
deleted file mode 100644
index ce63756..0000000
--- a/framework/crawler-ui/src/main/webapp/sidebar.jsp
+++ /dev/null
@@ -1,192 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<section class="sidebar">
-  <ul class="sidebar-menu">
-    <li class="header">MAIN NAVIGATION</li>
-    <li class="outputs treeview">
-      <a href="#">
-        <i class="fa fa-outdent" aria-hidden="true"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Outputs")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a class="link" href="listtransformations.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listtransformationconnections")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListTransformationConnections")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="listoutputs.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listoutputconnections")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListOutputConnections")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-    <li class="authorities treeview">
-      <a href="#">
-        <i class="fa fa-user" aria-hidden="true"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Authorities")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a class="link" href="listgroups.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listauthoritygroups")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListAuthorityGroups")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="listmappers.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listusermappings")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListUserMappings")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="listauthorities.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listauthorities")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListAuthorityConnections")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-    <li class="repositories treeview">
-      <a href="#">
-        <i class="fa fa-download" aria-hidden="true"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Repositories")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a class="link" href="listconnections.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listrepositoryconnections")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListRepositoryConnections")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="listnotifications.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listnotificationconnections")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListNotificationConnections")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-    <li class="jobs treeview">
-      <a href="#">
-        <i class="fa fa-laptop"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Jobs")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a class="link" href="listjobs.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Listjobs")%>">
-            <i class="fa fa-list" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ListAllJobs")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="showjobstatus.jsp"
-                  alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Managejobs")%>">
-            <i class="fa fa-list" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.StatusAndJobManagement")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-    <li class="statusreports treeview">
-      <a href="#">
-        <i class="fa fa-table"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.StatusReports")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a class="link" href="documentstatus.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Documentstatus")%>">
-            <i class="fa fa-file-text"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.DocumentStatus")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="queuestatus.jsp"
-                  alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Queuestatus")%>">
-            <i class="fa fa-list" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.QueueStatus")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-    <li class="historyreports treeview">
-      <a href="#">
-        <i class="fa fa-history"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.HistoryReports")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a class="link" href="simplereport.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Simplehistory")%>">
-            <i class="fa fa-history"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.SimpleHistory")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="maxactivityreport.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Maximumactivity")%>">
-            <i class="fa fa-circle-o"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.MaximumActivity")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="maxbandwidthreport.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Maximumbandwidth")%>">
-            <i class="fa fa-bar-chart"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.MaximumBandwidth")%>
-          </a>
-        </li>
-        <li>
-          <a class="link" href="resultreport.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Resulthistogram")%>">
-            <i class="fa fa-area-chart"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.ResultHistogram")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-    <li class="miscellaneous treeview">
-      <a href="#">
-        <i class="fa fa-info" aria-hidden="true"></i>
-        <span><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Miscellaneous")%></span>
-        <i class="fa fa-angle-left pull-right"></i>
-      </a>
-      <ul class="treeview-menu">
-        <li>
-          <a href="<%="http://manifoldcf.apache.org/"+Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Locale")+"/release-documentation.html"%>" target="_blank" 
-                  alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.Help")%>"><i class="fa fa-book"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.Help")%></a>
-        </li>
-        <li>
-          <a href="logout.jsp" alt="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"navigation.LogOut")%>">
-            <i class="fa fa-sign-out" aria-hidden="true"></i>
-            <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"navigation.LogOut")%>
-          </a>
-        </li>
-      </ul>
-    </li>
-  </ul>
-</section>
diff --git a/framework/crawler-ui/src/main/webapp/simplereport.jsp b/framework/crawler-ui/src/main/webapp/simplereport.jsp
deleted file mode 100644
index 485e80c..0000000
--- a/framework/crawler-ui/src/main/webapp/simplereport.jsp
+++ /dev/null
@@ -1,806 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-final String clientTimezoneString = variableContext.getParameter("client_timezone");
-final TimeZone clientTimezone;
-if (clientTimezoneString == null || clientTimezoneString.length() == 0)
-{
-  clientTimezone = TimeZone.getDefault();
-}
-else
-{
-  clientTimezone = TimeZone.getTimeZone(clientTimezoneString);
-}
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_REPORTS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  if (org.apache.manifoldcf.crawler.system.ManifoldCF.checkMaintenanceUnderway())
-  {
-%>
-    <jsp:forward page="maintenanceunderway.jsp"/>
-<%
-  }
-
-  int k;
-
-  // Read the parameters.
-  String reportConnection = variableContext.getParameter("reportconnection");
-  if (reportConnection == null)
-    reportConnection = "";
-  String[] reportActivities;
-  if (variableContext.getParameter("reportactivities_posted") != null)
-  {
-    reportActivities = variableContext.getParameterValues("reportactivities");
-    if (reportActivities == null)
-      reportActivities = new String[0];
-  }
-  else
-    reportActivities = null;
-
-  // Get the current time, so we can fill in default values where possible.
-  long currentTime = System.currentTimeMillis();
-
-  Long startTime = null;
-  Long endTime = null;
-
-  // Get start time, if selected
-  String startYear = variableContext.getParameter("reportstartyear");
-  String startMonth = variableContext.getParameter("reportstartmonth");
-  String startDay = variableContext.getParameter("reportstartday");
-  String startHour = variableContext.getParameter("reportstarthour");
-  String startMinute = variableContext.getParameter("reportstartminute");
-
-  // Get end time, if selected.
-  String endYear = variableContext.getParameter("reportendyear");
-  String endMonth = variableContext.getParameter("reportendmonth");
-  String endDay = variableContext.getParameter("reportendday");
-  String endHour = variableContext.getParameter("reportendhour");
-  String endMinute = variableContext.getParameter("reportendminute");
-
-  if (startYear == null && startMonth == null && startDay == null && startHour == null && startMinute == null &&
-      endYear == null && endMonth == null && endDay == null && endHour == null && endMinute == null)
-  {
-    // Nobody has selected a time range yet.  Pick the last hour.
-    endTime = null;
-    startTime = new Long(currentTime - 1000L * 60L * 60L);
-  }
-  else
-  {
-    // Get start time, if selected
-    if (startYear == null)
-      startYear = "";
-    if (startMonth == null)
-      startMonth = "";
-    if (startDay == null)
-      startDay = "";
-    if (startHour == null)
-      startHour = "";
-    if (startMinute == null)
-      startMinute = "";
-
-    // Get end time, if selected.
-    if (endYear == null)
-      endYear = "";
-    if (endMonth == null)
-      endMonth = "";
-    if (endDay == null)
-      endDay = "";
-    if (endHour == null)
-      endHour = "";
-    if (endMinute == null)
-      endMinute = "";
-
-    if (startYear.length() == 0 || startMonth.length() == 0 || startDay.length() == 0 || startHour.length() == 0 || startMinute.length() == 0)
-    {
-      // Undetermined start
-      startTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(startYear));
-      c.set(Calendar.MONTH,Integer.parseInt(startMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(startDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(startHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(startMinute));
-      startTime = new Long(c.getTimeInMillis());
-    }
-    if (endYear.length() == 0 || endMonth.length() == 0 || endDay.length() == 0 || endHour.length() == 0 || endMinute.length() == 0)
-    {
-      // Undetermined end
-      endTime = null;
-    }
-    else
-    {
-      // Convert the specified times to a long.
-      Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-      c.set(Calendar.YEAR,Integer.parseInt(endYear));
-      c.set(Calendar.MONTH,Integer.parseInt(endMonth));
-      c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(endDay) + 1);
-      c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(endHour));
-      c.set(Calendar.MINUTE,Integer.parseInt(endMinute));
-      endTime = new Long(c.getTimeInMillis());
-    }
-  }
-
-  // Now, turn the startTime and endTime back into fielded values.  The values will be blank where there is no limit.
-  if (startTime == null)
-  {
-    startYear = "";
-    startMonth = "";
-    startDay = "";
-    startHour = "";
-    startMinute = "";
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(startTime.longValue());
-    startYear = Integer.toString(c.get(Calendar.YEAR));
-    startMonth = Integer.toString(c.get(Calendar.MONTH));
-    startDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    startHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    startMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  if (endTime == null)
-  {
-    endYear = "";
-    endMonth = "";
-    endDay = "";
-    endHour = "";
-    endMinute = "";
-  }
-  else
-  {
-    // Do the conversion
-    Calendar c = new GregorianCalendar(clientTimezone, pageContext.getRequest().getLocale());
-    c.setTimeInMillis(endTime.longValue());
-    endYear = Integer.toString(c.get(Calendar.YEAR));
-    endMonth = Integer.toString(c.get(Calendar.MONTH));
-    endDay = Integer.toString(c.get(Calendar.DAY_OF_MONTH)-1);
-    endHour = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
-    endMinute = Integer.toString(c.get(Calendar.MINUTE));
-  }
-
-  // Get the entity match string.
-  String entityMatch = variableContext.getParameter("reportentitymatch");
-  if (entityMatch == null)
-    entityMatch = "";
-
-  // Get the resultcode match string.
-  String resultCodeMatch = variableContext.getParameter("reportresultcodematch");
-  if (resultCodeMatch == null)
-    resultCodeMatch = "";
-
-
-  // Read the other data we need.
-  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnection[] connList = connMgr.getAllConnections();
-
-  // Query the legal list of activities.  This will depend on the connection has been chosen, if any.
-  Map selectedActivities = null;
-  String[] activityList = null;
-  if (reportConnection.length() > 0)
-  {
-    activityList = org.apache.manifoldcf.crawler.system.ManifoldCF.getActivitiesList(threadContext,reportConnection);
-    if (activityList == null)
-      reportConnection = "";
-    else
-    {
-      selectedActivities = new HashMap();
-      String[] activitiesToNote;
-      int j = 0;
-      if (reportActivities == null)
-        activitiesToNote = activityList;
-      else
-        activitiesToNote = reportActivities;
-
-      while (j < activitiesToNote.length)
-      {
-        String activity = activitiesToNote[j++];
-        selectedActivities.put(activity,activity);
-      }
-    }
-  }
-
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "simplereport.ApacheManifoldCFSimpleHistoryReport")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "simplereport.SimpleHistoryReport")%>',
-      'historyreports'
-  );
-
-  function Go()
-  {
-    if (!isInteger(report.rowcount.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"simplereport.EnterALegalNumberForRowsPerPage")%>");
-      report.rowcount.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"simplereport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"simplereport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-
-    document.report.op.value="Report";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function Continue()
-  {
-    if (!isRegularExpression(report.reportentitymatch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"simplereport.EntityMatchMustBeAValidRegularExpression")%>");
-      report.reportentitymatch.focus();
-      return;
-    }
-    if (!isRegularExpression(report.reportresultcodematch.value))
-    {
-      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"simplereport.ResultCodeMatchMustBeAValidRegularExpression")%>");
-      report.reportresultcodematch.focus();
-      return;
-    }
-    document.report.op.value="Continue";
-    document.report.action=document.report.action + "#MainButton";
-    $.ManifoldCF.submit(document.report);
-  }
-
-  function ColumnClick(colname)
-  {
-    document.report.clickcolumn.value=colname;
-    Go();
-  }
-
-  function SetPosition(amt)
-  {
-    if (amt < 0)
-      amt=0;
-    document.report.startrow.value=amt;
-    Go();
-  }
-
-  function isRegularExpression(value)
-  {
-    try
-    {
-      var foo="teststring";
-      foo.search(value.replace(/\(\?i\)/,""));
-      return true;
-    }
-    catch (e)
-    {
-      return false;
-    }
-
-  }
-
-  function isInteger(value)
-  {
-    var anum=/(^\d+$)/;
-    return anum.test(value);
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <form class="standardform" name="report" action="execute.jsp" method="POST">
-      <input type="hidden" name="op" value="Continue"/>
-      <input type="hidden" name="type" value="simplereport"/>
-
-      <div class="box box-primary">
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Connection")%></th>
-              <td colspan="1">
-                <select name="reportconnection" class="form-control">
-                  <option <%=(reportConnection.length() == 0)?"selected=\"selected\"":""%>value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  int i = 0;
-  while (i < connList.length)
-  {
-    IRepositoryConnection conn = connList[i++];
-    String thisConnectionName = conn.getName();
-    String thisDescription = conn.getDescription();
-    if (thisDescription == null || thisDescription.length() == 0)
-      thisDescription = thisConnectionName;
-%>
-                  <option <%=(thisConnectionName.equals(reportConnection))?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(thisConnectionName)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(thisDescription)%></option>
-<%
-  }
-%>
-                </select>
-              </td>
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Activities")%></th>
-              <td colspan="1">
-                <input type="hidden" name="reportactivities_posted" value="true"/>
-
-                <select multiple="true" class="selectpicker" name="reportactivities">
-<%
-    i = 0;
-    while (i < activityList.length)
-    {
-      String activity = activityList[i++];
-%>
-                  <option <%=((selectedActivities.get(activity)==null)?"":"selected=\"selected\"")%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(activity)%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(activity)%></option>
-<%
-    }
-%>
-                </select>
-              </td>
-<%
-  }
-  else
-  {
-%>
-              <td colspan="2"></td>
-<%
-  }
-%>
-
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.StartTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportstarthour'>
-                    <option value="" <%=(startHour.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(startHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportstartminute'>
-                    <option value="" <%=(startMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(startMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.on")%></span>
-                  <select class="schedulepulldown" name='reportstartmonth'>
-                    <option value="" <%=(startMonth.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-                    <option value="0" <%=(startMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.January")%></option>
-                    <option value="1" <%=(startMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.February")%></option>
-                    <option value="2" <%=(startMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.March")%></option>
-                    <option value="3" <%=(startMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.April")%></option>
-                    <option value="4" <%=(startMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.May")%></option>
-                    <option value="5" <%=(startMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.June")%></option>
-                    <option value="6" <%=(startMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.July")%></option>
-                    <option value="7" <%=(startMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.August")%></option>
-                    <option value="8" <%=(startMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.September")%></option>
-                    <option value="9" <%=(startMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.October")%></option>
-                    <option value="10" <%=(startMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.November")%></option>
-                    <option value="11" <%=(startMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportstartday'>
-                    <option value="" <%=(startDay.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(startDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportstartyear'>
-                    <option value="" <%=(startYear.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<% 
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (startYear.equals(""+year))?"selected=\"selected\"":"";
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<%
-  }
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.EndTime")%></th>
-              <td colspan="3">
-                <div class="input-group">
-                  <select class="schedulepulldown" name='reportendhour'>
-                    <option value="" <%=(endHour.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 24)
-  {
-    int q = k;
-    String ampm;
-    if (k < 12)
-      ampm = "am";
-    else
-    {
-      ampm = "pm";
-      q -= 12;
-    }
-    String hour;
-    if (q == 0)
-      q = 12;
-%>
-                    <option value='<%=k%>' <%=(endHour.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(q)+" "+ampm%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">:</span>
-                  <select class="schedulepulldown" name='reportendminute'>
-                    <option value="" <%=(endMinute.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 60)
-  {
-%>
-                    <option value='<%=k%>' <%=(endMinute.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k)%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.on")%></span>
-                  <select class="schedulepulldown" name='reportendmonth'>
-                    <option value="" <%=(endMonth.length() == 0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option> 
-                    <option value="0" <%=(endMonth.equals("0"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.January")%></option>
-                    <option value="1" <%=(endMonth.equals("1"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.February")%></option>
-                    <option value="2" <%=(endMonth.equals("2"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.March")%></option>
-                    <option value="3" <%=(endMonth.equals("3"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.April")%></option>
-                    <option value="4" <%=(endMonth.equals("4"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.May")%></option>
-                    <option value="5" <%=(endMonth.equals("5"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.June")%></option>
-                    <option value="6" <%=(endMonth.equals("6"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.July")%></option>
-                    <option value="7" <%=(endMonth.equals("7"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.August")%></option>
-                    <option value="8" <%=(endMonth.equals("8"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.September")%></option>
-                    <option value="9" <%=(endMonth.equals("9"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.October")%></option>
-                    <option value="10" <%=(endMonth.equals("10"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.November")%></option>
-                    <option value="11" <%=(endMonth.equals("11"))?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.December")%></option>
-                  </select>
-                  <span class="label">-</span>
-                  <select class="schedulepulldown" name='reportendday'>
-                    <option value="" <%=(endDay.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  k = 0;
-  while (k < 31)
-  {
-    int value = (k+1) % 10;
-    String suffix;
-    if (value == 1 && k != 10)
-      suffix = "st";
-    else if (value == 2 && k != 11)
-      suffix = "nd";
-    else if (value == 3 && k != 12)
-      suffix = "rd";
-    else
-      suffix = "th";
-%>
-                    <option value='<%=Integer.toString(k)%>' <%=(endDay.equals(Integer.toString(k)))?"selected=\"selected\"":""%>><%=Integer.toString(k+1)+suffix%></option>
-<%
-    k++;
-  }
-%>
-                  </select>
-                  <span class="label">,</span>
-                  <select class="schedulepulldown" name='reportendyear'>
-                    <option value="" <%=(endYear.length()==0)?"selected=\"selected\"":""%>>-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.NotSpecified")%>--</option>
-<%
-  for(int year=2005; year <= java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); year++)
-  {
-    String selected = (endYear.equals(""+year))?"selected=\"selected\"":"";
-%>
-                    <option value="<%= year %>" <%= selected %>><%= year %></option>
-<%
-  }
-%>
-                  </select>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.EntityMatch")%></nobr></th>
-              <th><input type="text" name="reportentitymatch" class="form-control" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(entityMatch)%>'/></th>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.ResultCodeMatch")%></nobr></th>
-              <td><input type="text" class="form-control" name="reportresultcodematch" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(resultCodeMatch)%>'/></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-
-<%
-  if (reportConnection.length() > 0)
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Go()"
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"simplereport.ExecuteThisQuery")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"simplereport.Go")%></a>
-<%
-  }
-  else
-  {
-%>
-            <a href="#" name="MainButton" class="btn btn-primary" role="button" onClick="javascript:Continue()" 
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"simplereport.Continue")%>" data-toggle="tooltip"><i class="fa fa-play fa-fw"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"simplereport.Continue")%></a>
-<%
-  }
-%>
-          </div>
-        </div>
-      </div>
-<%
-  if (reportConnection.length() > 0)
-  {
-    // Run the report.
-
-    // First, we need to gather the sort order object.
-    String sortOrderString = variableContext.getParameter("sortorder");
-    SortOrder sortOrder;
-    if (sortOrderString == null || sortOrderString.length() == 0)
-      sortOrder = new SortOrder();
-    else
-      sortOrder = new SortOrder(sortOrderString);
-
-    // Now, gather the column header that was clicked on (if any)
-    String clickedColumn = variableContext.getParameter("clickcolumn");
-    if (clickedColumn != null && clickedColumn.length() > 0)
-      sortOrder.clickColumn(clickedColumn);
-
-    // Gather the start
-    String startRowString = variableContext.getParameter("startrow");
-    int startRow = 0;
-    if (startRowString != null && startRowString.length() > 0)
-      startRow = Integer.parseInt(startRowString);
-
-    // Gather the max
-    String maxRowCountString = variableContext.getParameter("rowcount");
-    int rowCount = 20;
-    if (maxRowCountString != null && maxRowCountString.length() > 0)
-      rowCount = Integer.parseInt(maxRowCountString);
-
-    String[] ourActivities = new String[selectedActivities.size()];
-    Iterator iter = selectedActivities.keySet().iterator();
-    int zz = 0;
-    while (iter.hasNext())
-    {
-      ourActivities[zz++] = (String)iter.next();
-    }
-
-    RegExpCriteria entityMatchObject = null;
-    if (entityMatch.length() > 0)
-      entityMatchObject = new RegExpCriteria(entityMatch,true);
-    RegExpCriteria resultCodeMatchObject = null;
-    if (resultCodeMatch.length() > 0)
-      resultCodeMatchObject = new RegExpCriteria(resultCodeMatch,true);
-    FilterCriteria criteria = new FilterCriteria(ourActivities,startTime,endTime,entityMatchObject,resultCodeMatchObject);
-
-    IResultSet set = connMgr.genHistorySimple(reportConnection,criteria,sortOrder,startRow,rowCount+1);
-
-%>
-      <input type="hidden" name="clickcolumn" value=""/>
-      <input type="hidden" name="startrow" value='<%=Integer.toString(startRow)%>'/>
-      <input type="hidden" name="sortorder" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(sortOrder.toString())%>'/>
-
-      <div class="box box-primary">
-        <div class="box-body table-responsive">
-          <table class="table table-bordered">
-            <tr>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("starttime");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.StartTime")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("activity");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Activity")%></nobr></a></th>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Identifier")%></nobr></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("resultcode");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.ResultCode")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("bytes");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Bytes")%></nobr></a></th>
-              <th><a href="javascript:void(0);" onclick='javascript:ColumnClick("elapsedtime");'><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Time")%></nobr></a></th>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.ResultDescription")%></nobr></th>
-            </tr>
-<%
-  zz = 0;
-
-  boolean hasMoreRows = (set.getRowCount() > rowCount);
-  int iterCount = hasMoreRows?rowCount:set.getRowCount();
-  while (zz < iterCount)
-  {
-    IResultRow row = set.getRow(zz);
-    String startTimeString = org.apache.manifoldcf.ui.util.Formatter.formatTime(Converter.asLong(row.getValue("starttime")));
-    String resultCode = "";
-    Object resultCodeObject = row.getValue("resultcode");
-    if (resultCodeObject != null)
-      resultCode = resultCodeObject.toString();
-    String resultDescription = "";
-    Object resultDescriptionObject = row.getValue("resultdesc");
-    resultDescriptionObject = row.getValue("resultdesc");
-    if (resultDescriptionObject != null)
-      resultDescription = resultDescriptionObject.toString();
-    String[] identifierBreakdown = org.apache.manifoldcf.ui.util.Formatter.formatString(row.getValue("identifier").toString(),64,true,true);
-%>
-            <tr>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(startTimeString)%></nobr></td>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("activity").toString())%></nobr></td>
-              <td>
-<%
-  int q = 0;
-  while (q < identifierBreakdown.length)
-  {
-%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(identifierBreakdown[q++])%></nobr><br/>
-<%
-  }
-%>
-              </td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(resultCode)%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("bytes").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(row.getValue("elapsedtime").toString())%></td>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(resultDescription)%></td>
-            </tr>
-<%
-      zz++;
-    }
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <ul class="pagination pagination-sm no-margin pull-left">
-<%
-    if (startRow == 0)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Previous")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li>
-              <a href="javascript:void(0);" onclick='<%="javascript:SetPosition("+Integer.toString(startRow-rowCount)+");"%>'
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"simplereport.PreviousPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-left fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Previous")%></a>
-            </li>
-<%
-    }
-    if (hasMoreRows == false)
-    {
-%>
-            <li><a href="#"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Next")%></a></li>
-<%
-    }
-    else
-    {
-%>
-            <li>
-              <a href="javascript:void(0);" onclick='<%="javascript:SetPosition("+Integer.toString(startRow+rowCount)+");"%>'
-                      title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"simplereport.NextPage")%>" data-toggle="tooltip"><i class="fa fa-arrow-circle-o-right fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Next")%>
-              </a>
-            </li>
-<%
-    }
-%>
-          </ul>
-          <ul class="pagination pagination-sm no-margin pull-right">
-            <li class="pad">
-              <span class="label label-primary"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.Rows")%><%=Integer.toString(startRow)%>-<%=(hasMoreRows?Integer.toString(startRow+rowCount-1):"END")%></span>
-            </li>
-            <li class="form-inline">
-              <div class="input-group input-group-sm">
-                <span class="input-group-addon"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.RowsPerPage")%></span>
-                <input type="text" class="form-control" name="rowcount" size="5" value='<%=Integer.toString(rowCount)%>'/>
-              </div>
-            </li>
-          </ul>
-        </div>
-      </div>
-<%
-  }
-  else
-  {
-%>
-      <div class="callout callout-info"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"simplereport.PleaseSelectAConnection")%></div>
-      <%
-        }
-      %>
-
-    </form>
-<%
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","index.jsp");
-%>
-<jsp:forward page="error.jsp"/>
-<%
-}
-%>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/unauthorized.jsp b/framework/crawler-ui/src/main/webapp/unauthorized.jsp
deleted file mode 100644
index 1556b0c..0000000
--- a/framework/crawler-ui/src/main/webapp/unauthorized.jsp
+++ /dev/null
@@ -1,53 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "error.Unauthorized")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "error.Unauthorized")%>'
-  );
-  //-->
-</script>
-
-<%
-  // These have to be fetched from request rather than variableContext since error
-  // forwards screw up the multipart wrapper
-  String target = variableContext.getParameter("target");
-%>
-
-<div class="box box-danger">
-  <div class="box-body">
-    <div class="alert alert-danger">
-      <h3><i class="icon fa fa-ban"></i> Error!</h3>
-      <h4><%=Messages.getBodyString(pageContext.getRequest().getLocale(), "error.Unauthorized")%></h4>
-    </div>
-  </div>
-  <div class="box-footer with-border">
-    <a class="btn btn-primary" href='<%=org.apache.manifoldcf.core.util.URLEncoder.encode(target)%>' 
-            title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"error.Return")%>" data-toggle="tooltip">
-      <i class="fa fa-check fa-fw" aria-hidden="true"></i>OK
-    </a>
-  </div>
-</div>
diff --git a/framework/crawler-ui/src/main/webapp/viewauthority.jsp b/framework/crawler-ui/src/main/webapp/viewauthority.jsp
deleted file mode 100644
index 762aefa..0000000
--- a/framework/crawler-ui/src/main/webapp/viewauthority.jsp
+++ /dev/null
@@ -1,209 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  IAuthorityConnectionManager manager = AuthorityConnectionManagerFactory.make(threadContext);
-  IAuthorityConnectorManager connectorManager = AuthorityConnectorManagerFactory.make(threadContext);
-  IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
-  String connectionName = variableContext.getParameter("connname");
-  IAuthorityConnection connection = manager.load(connectionName);
-  if (connection == null)
-  {
-    throw new ManifoldCFException("No such authority: '"+connectionName+"'");
-  }
-  else
-  {
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"viewauthority.uninstalled");
-    int maxCount = connection.getMaxConnections();
-    String prereq = connection.getPrerequisiteMapping();
-    String authDomain = connection.getAuthDomain();
-    if (authDomain == null)
-      authDomain = "";
-    String groupName = connection.getAuthGroup();
-    if (groupName == null)
-      groupName = "";
-
-    ConfigParams parameters = connection.getConfigParams();
-
-    // Do stuff so we can call out to display the parameters
-    //String JSPFolder = AuthorityConnectorFactory.getJSPFolder(threadContext,className);
-    //threadContext.save("Parameters",parameters);
-
-    // Now, test the connection.
-    String connectionStatus;
-    try
-    {
-      IAuthorityConnector c = authorityConnectorPool.grab(connection);
-      if (c == null)
-      {
-        connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewauthority.Connectorisnotinstalled");
-      }
-      else
-      {
-        try
-        {
-          connectionStatus = c.check();
-        }
-        finally
-        {
-          authorityConnectorPool.release(connection,c);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewauthority.Threwexception")+" '"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"'";
-    }
-%>
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.ViewAuthorityConnectionStatus") + " - " + connectionName %>',
-      'authorities'
-  );
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewauthority.DeleteConnection")%> '"+connectionName+"'<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewauthority.qmark")%>"))
-    {
-      document.viewconnection.op.value="Delete";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewconnection" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="authority"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.NameColon")%></nobr></th>
-              <td><%="<!--connection=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName) + "-->"%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></nobr>
-              </td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.DescriptionColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.AuthorityTypeColon")%></nobr></th>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.MaxConnectionsColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(Integer.toString(maxCount))%></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.AuthorityGroupColon")%></nobr></th>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(groupName)%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.AuthorizationDomainColon")%></nobr></th>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(authDomain)%></nobr>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.PrerequisiteUserMappingColon")%></nobr></th>
-              <td colspan="3">
-<%
-  if (prereq != null)
-  {
-%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(prereq)%></nobr>
-<%
-  }
-  else
-  {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.NoPrerequisites")%></nobr>
-<%
-  }
-%>
-              </td>
-            </tr>
-            <tr>
-              <td colspan="4">
-<%
-    AuthorityConnectorFactory.viewConfiguration(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters);
-%>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewauthority.ConnectionStatusColon")%></nobr></th>
-              <td colspan="3"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionStatus)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="viewauthority.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewauthority.Refresh")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewauthority.Refresh")%></a>
-            <a href='<%="editauthority.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewauthority.EditThisAuthorityConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewauthority.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewauthority.DeleteThisAuthorityConnection")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewauthority.Delete")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listauthorities.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewconnection.jsp b/framework/crawler-ui/src/main/webapp/viewconnection.jsp
deleted file mode 100644
index bfcf7bf..0000000
--- a/framework/crawler-ui/src/main/webapp/viewconnection.jsp
+++ /dev/null
@@ -1,238 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  IConnectorManager connectorManager = ConnectorManagerFactory.make(threadContext);
-  // Get the connection manager handle
-  IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
-  IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-  String connectionName = variableContext.getParameter("connname");
-  IRepositoryConnection connection = connManager.load(connectionName);
-  if (connection == null)
-  {
-    throw new ManifoldCFException("No such connection: '"+connectionName+"'");
-  }
-  else
-  {
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"viewconnection.uninstalled");
-    String authorityName = connection.getACLAuthority();
-    if (authorityName == null)
-      authorityName = Messages.getString(pageContext.getRequest().getLocale(),"viewconnection.NoneGlobalAuthority");
-    int maxCount = connection.getMaxConnections();
-    String[] throttles = connection.getThrottles();
-    ConfigParams parameters = connection.getConfigParams();
-
-    // Do stuff so we can call out to display the parameters
-    //String JSPFolder = RepositoryConnectorFactory.getJSPFolder(threadContext,className);
-    //threadContext.save("Parameters",parameters);
-
-    // Now, test the connection.
-    String connectionStatus;
-    try
-    {
-      IRepositoryConnector c = repositoryConnectorPool.grab(connection);
-      if (c == null)
-        connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewconnection.Connectorisnotinstalled");
-      else
-      {
-        try
-        {
-          connectionStatus = c.check();
-        }
-        finally
-        {
-          repositoryConnectorPool.release(connection,c);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewconnection.Threwexception")+" '"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"'";
-    }
-%>
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewconnection.ApacheManifoldCFViewRepositoryConnectionStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewconnection.ViewRepositoryConnectionStatus")%>',
-      'repositories'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewconnection.DeleteConnection")%> '"+connectionName+"'<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewconnection.qmark")%>"))
-    {
-      document.viewconnection.op.value="Delete";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  function ClearHistory(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewconnection.Thiscommandwillclearallhistoryrelatedto")%> '"+connectionName+"' <%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewconnection.period")%>"))
-    {
-      document.viewconnection.op.value="ClearHistory";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewconnection" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="connection"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.NameColon")%></nobr></th>
-              <td><%="<!--connection=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName) + "-->"%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></nobr>
-              </td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.DescriptionColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.ConnectionTypeColon")%></nobr></th>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.MaxConnectionsColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(Integer.toString(maxCount))%></td></tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.AuthorityGroupColon")%></nobr></th>
-              <td colspan="3"><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(authorityName)%></nobr></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.ThrottlingColon")%></nobr></th>
-              <td colspan="3">
-                <table class="table table-bordered">
-                  <tr>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.Binregularexpression")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.Description")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.Maxavgfetches")%></nobr></th>
-                  </tr>
-<%
-    int j = 0;
-    while (j < throttles.length)
-    {
-%>
-                  <tr>
-                    <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(throttles[j])%></nobr></td>
-                    <td>
-<%
-      String tdescription = connection.getThrottleDescription(throttles[j]);
-      if (tdescription != null && tdescription.length() > 0)
-      {
-%>
-                      <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tdescription)%></nobr>
-<%
-      }
-%>
-                    </td>
-                    <td><%=new Long((long)((double)connection.getThrottleValue(throttles[j])*(double)60000.0+0.5)).toString()%></td>
-                  </tr>
-<%
-      j++;
-    }
-    if (j == 0)
-    {
-%>
-                  <tr><td class="text-yellow" colspan="3"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.NoThrottles")%></nobr></td></tr>
-<%
-    }
-%>
-                </table>
-              </td>
-            </tr>
-            <tr>
-              <td colspan="4">
-<%
-    RepositoryConnectorFactory.viewConfiguration(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters);
-%>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewconnection.ConnectionStatusColon")%></nobr></th>
-              <td colspan="3"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionStatus)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="viewconnection.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.Refresh")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.Refresh")%></a>
-            <a href='<%="editconnection.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.EditThisConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.Deletethisconnection")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.Deletethisconnection")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:ClearHistory(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.ClearHistoryAssociatedWithThisConnection")%>"
-                    class="btn btn-warning" role="button" data-toggle="tooltip"><i class="fa fa-remove fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewconnection.ClearAllRelatedHistory")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listconnections.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewgroup.jsp b/framework/crawler-ui/src/main/webapp/viewgroup.jsp
deleted file mode 100644
index 39974bb..0000000
--- a/framework/crawler-ui/src/main/webapp/viewgroup.jsp
+++ /dev/null
@@ -1,120 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  // Get the job manager handle
-  IAuthorityGroupManager manager = AuthorityGroupManagerFactory.make(threadContext);
-  String groupName = variableContext.getParameter("groupname");
-  IAuthorityGroup group = manager.load(groupName);
-  if (group == null)
-  {
-    throw new ManifoldCFException("No such group: "+groupName);
-  }
-  else
-  {
-    String description = group.getDescription();
-    if (description == null)
-      description = "";
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewgroup.ApacheManifoldCFViewGroup")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewgroup.ViewAuthorityGroup") + " - " + groupName %>',
-      'authorities'
-  );
-
-  function Delete(groupName)
-  {
-    document.viewgroup.op.value="Delete";
-    document.viewgroup.groupname.value=groupName;
-    $.ManifoldCF.submit(document.viewgroup);
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewgroup" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="group"/>
-        <input type="hidden" name="groupname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewgroup.NameColon")%></nobr></th>
-              <td><%="<!--group=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(groupName) + "-->"%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(groupName)%></nobr>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewgroup.DescriptionColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="editgroup.jsp?groupname="+org.apache.manifoldcf.core.util.URLEncoder.encode(groupName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewgroup.EditThisAuthorityGroup")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewgroup.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(groupName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewgroup.DeleteThisAuthorityGroup")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-remove fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewgroup.Delete")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listgroups.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewjob.jsp b/framework/crawler-ui/src/main/webapp/viewjob.jsp
deleted file mode 100644
index 6f0c0c7..0000000
--- a/framework/crawler-ui/src/main/webapp/viewjob.jsp
+++ /dev/null
@@ -1,759 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_JOBS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-
-  // Get the job manager handle
-  IJobManager manager = JobManagerFactory.make(threadContext);
-  IOutputConnectionManager outputManager = OutputConnectionManagerFactory.make(threadContext);
-  IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
-  INotificationConnectionManager notificationManager = NotificationConnectionManagerFactory.make(threadContext);
-  ITransformationConnectionManager transformationManager = TransformationConnectionManagerFactory.make(threadContext);
-
-  IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-  IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-  INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-  ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-
-  String jobID = variableContext.getParameter("jobid");
-  IJobDescription job = manager.load(new Long(jobID));
-  if (job == null)
-  {
-    throw new ManifoldCFException("No such job: "+jobID);
-  }
-  else
-  {
-    String naMessage = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Notapplicable");
-    String jobType = "";
-    String intervalString = naMessage;
-    String maxIntervalString = naMessage;
-    String reseedIntervalString = naMessage;
-    String expirationIntervalString = naMessage;
-
-    switch (job.getType())
-    {
-    case IJobDescription.TYPE_CONTINUOUS:
-      String infinityMessage = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Infinity");
-      String minutesMessage = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.minutes");
-      jobType = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Rescandocumentsdynamically");
-      Long recrawlInterval = job.getInterval();
-      Long maxRecrawlInterval = job.getMaxInterval();
-      Long reseedInterval = job.getReseedInterval();
-      Long expirationInterval = job.getExpiration();
-      intervalString = (recrawlInterval==null)?infinityMessage:(new Long(recrawlInterval.longValue()/60000L).toString()+" "+minutesMessage);
-      maxIntervalString = (maxRecrawlInterval==null)?infinityMessage:(new Long(maxRecrawlInterval.longValue()/60000L).toString()+" "+minutesMessage);
-      reseedIntervalString = (reseedInterval==null)?infinityMessage:(new Long(reseedInterval.longValue()/60000L).toString()+" "+minutesMessage);
-      expirationIntervalString = (expirationInterval==null)?infinityMessage:(new Long(expirationInterval.longValue()/60000L).toString()+" "+minutesMessage);
-      break;
-    case IJobDescription.TYPE_SPECIFIED:
-      jobType = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Scaneverydocumentonce");
-      break;
-    default:
-    }
-
-    String startMethod = "";
-    switch (job.getStartMethod())
-    {
-    case IJobDescription.START_WINDOWBEGIN:
-      startMethod = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Startatbeginningofschedulewindow");
-      break;
-    case IJobDescription.START_WINDOWINSIDE:
-      startMethod = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Startinsideschedulewindow");
-      break;
-    case IJobDescription.START_DISABLE:
-      startMethod = Messages.getString(pageContext.getRequest().getLocale(),"viewjob.Dontautomaticallystart");
-      break;
-    default:
-      break;
-    }
-
-    int priority = job.getPriority();
-
-    String connectionName = job.getConnectionName();
-    IRepositoryConnection connection = connManager.load(connectionName);
-
-    int model = RepositoryConnectorFactory.getConnectorModel(threadContext,connection.getClassName());
-    String[] relationshipTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-    Map hopCountFilters = job.getHopCountFilters();
-    int hopcountMode = job.getHopcountMode();
-
-    //threadContext.save("OutputSpecification",job.getOutputSpecification());
-    //threadContext.save("OutputConnection",outputConnection);
-    //threadContext.save("DocumentSpecification",job.getSpecification());
-    //threadContext.save("RepositoryConnection",connection);
-    int rowCounter = 0;
-
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewjob.ApacheManifoldCFViewJob")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewjob.ViewAJob")%>',
-      'jobs'
-  );
-
-  function Delete(jobID)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewjob.DeleteJobConfirmation")%>"))
-    {
-      document.viewjob.op.value="Delete";
-      document.viewjob.jobid.value=jobID;
-      $.ManifoldCF.submit(document.viewjob);
-    }
-  }
-
-  function StartOver(jobID)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewjob.StartOverConfirmation")%>"))
-    {
-      document.viewjob.op.value="StartOver";
-      document.viewjob.jobid.value=jobID;
-      $.ManifoldCF.submit(document.viewjob);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-
-      <form class="standardform" name="viewjob" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="job"/>
-        <input type="hidden" name="jobid" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.NameColon")%></nobr></th>
-              <td colspan="3"><%="<!--jobid=" + jobID + "-->"%><span id="job" jobid="<%= jobID %>"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(job.getDescription())%></span></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.PipelineColon")%></nobr></th>
-              <td colspan="3">
-                <table class="table table-bordered">
-                  <tr>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StageNumber")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StageType")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StagePrecedent")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StageDescription")%></nobr></th>
-                    <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StageConnectionName")%></nobr></th>
-                  </tr>
-                  <tr>
-                    <td>1.</td>
-                    <td><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Repository")%></td>
-                    <td></td>
-                    <td></td>
-                    <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></td>
-                  </tr>
-<%
-    for (int j = 0; j < job.countPipelineStages(); j++)
-    {
-%>
-                  <tr>
-                    <td><%=(j+2)%>.</td>
-                    <td><%=job.getPipelineStageIsOutputConnection(j)?Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Output"):Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Transformation")%></td>
-                    <td><%=(job.getPipelineStagePrerequisite(j)+2)%>.</td>
-                    <td><%=(job.getPipelineStageDescription(j)!=null)?org.apache.manifoldcf.ui.util.Encoder.bodyEscape(job.getPipelineStageDescription(j)):""%></td>
-                    <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(job.getPipelineStageConnectionName(j))%></td>
-                  </tr>
-<%
-    }
-%>
-                </table>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.NotificationsColon")%></nobr></th>
-              <td colspan="3">
-                <table class="table table-bordered">
-                  <tr>
-                    <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StageNumber")%></th>
-                    <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.NotificationDescription")%></th>
-                    <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.NotificationConnectionName")%></th>
-                  </tr>
-<%
-    for (int j = 0; j < job.countNotifications(); j++)
-    {
-%>
-                  <tr>
-                    <td><%=(j+job.countPipelineStages()+2)%>.</td>
-                    <td><%=(job.getNotificationDescription(j)!=null)?org.apache.manifoldcf.ui.util.Encoder.bodyEscape(job.getNotificationDescription(j)):""%></td>
-                    <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(job.getNotificationConnectionName(j))%></td>
-                  </tr>
-<%
-    }
-    if (job.countNotifications() == 0)
-    {
-%>
-                  <tr>
-                    <td colspan="3">
-                      <div class="callout callout-info"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.NoNotificationConnections")%></div>
-<%
-    }
-%>
-                </table>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.PriorityColon")%></nobr></th>
-              <td><%=priority%></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.StartMethodColon")%></nobr></th>
-              <td><%=startMethod%></td>
-            </tr>
-<%
-    if (model != -1 && model != IRepositoryConnector.MODEL_ADD_CHANGE_DELETE)
-    {
-%>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ScheduleTypeColon")%></nobr></th>
-              <td colspan="3"><nobr><%=jobType%></nobr></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.MinimumRecrawlIntervalColon")%></nobr></th>
-              <td><nobr><%=intervalString%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.MaximumRecrawlIntervalColon")%></nobr></th>
-              <td><nobr><%=maxIntervalString%></nobr></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ExpirationIntervalColon")%></nobr></th>
-              <td><nobr><%=expirationIntervalString%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ReseedIntervalColon")%></nobr></th>
-              <td><nobr><%=reseedIntervalString%></nobr></td>
-            </tr>
-<%
-    }
-    if (job.getScheduleRecordCount() == 0)
-    {
-%>
-            <tr>
-              <td colspan="4">
-                <div class="callout callout-info"><p><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.NoScheduledRunTimes")%></p></div>
-              </td>
-            </tr>
-<%
-    }
-    else
-    {
-      // Loop through the schedule records
-      int j = 0;
-      while (j < job.getScheduleRecordCount())
-      {
-        ScheduleRecord sr = job.getScheduleRecord(j);
-        Long srDuration = sr.getDuration();
-        boolean srRequestMinimum = sr.getRequestMinimum();
-        String srTimezone = sr.getTimezone();
-        EnumeratedValues srDayOfWeek = sr.getDayOfWeek();
-        EnumeratedValues srMonthOfYear = sr.getMonthOfYear();
-        EnumeratedValues srDayOfMonth = sr.getDayOfMonth();
-        EnumeratedValues srYear = sr.getYear();
-        EnumeratedValues srHourOfDay = sr.getHourOfDay();
-        EnumeratedValues srMinutesOfHour = sr.getMinutesOfHour();
-
-%>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ScheduledTimeColon")%></nobr></th>
-              <td colspan="3">
-<%
-          if (srTimezone != null)
-          {
-            out.println(srTimezone + ": ");
-          }
-          if (srDayOfWeek == null)
-            out.println(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Anydayoftheweek"));
-          else
-          {
-            StringBuffer sb = new StringBuffer();
-            boolean firstTime = true;
-            if (srDayOfWeek.checkValue(0))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Sundays"));
-            }
-            if (srDayOfWeek.checkValue(1))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Mondays"));
-            }
-            if (srDayOfWeek.checkValue(2))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Tuesdays"));
-            }
-            if (srDayOfWeek.checkValue(3))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Wednesdays"));
-            }
-            if (srDayOfWeek.checkValue(4))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Thursdays"));
-            }
-            if (srDayOfWeek.checkValue(5))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Fridays"));
-            }
-            if (srDayOfWeek.checkValue(6))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Saturdays"));
-            }
-            out.println(sb.toString());
-          }
-%>
-<%
-          if (srHourOfDay == null)
-          {
-            if (srMinutesOfHour != null)
-              out.println(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.oneveryhour")+" ");
-            else
-              out.println(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.atmidnight")+" ");
-          }
-          else
-          {
-            out.println(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.at")+" ");
-            int k = 0;
-            while (k < 24)
-            {
-              int q = k;
-              String ampm;
-              if (k < 12)
-                ampm = Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.am");
-              else
-              {
-                ampm = Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.pm");
-                q -= 12;
-              }
-              String hour;
-              if (q == 0)
-                q = 12;
-              if (srHourOfDay.checkValue(k))
-                out.println(Integer.toString(q)+" "+ampm+" ");
-              k++;
-            }
-          }
-%>
-<%
-          if (srMinutesOfHour != null)
-          {
-            out.println(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.plus")+" ");
-            int k = 0;
-            while (k < 60)
-            {
-              if (srMinutesOfHour.checkValue(k))
-                out.println(Integer.toString(k)+" ");
-              k++;
-            }
-            out.println(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.minutes")+" ");
-          }
-%>
-<%
-          if (srMonthOfYear == null)
-          {
-            if (srDayOfMonth == null && srDayOfWeek == null && srHourOfDay == null && srMinutesOfHour == null)
-              out.println(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ineverymonthofyear"));
-          }
-          else
-          {
-            StringBuffer sb = new StringBuffer(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.in")+" ");
-            boolean firstTime = true;
-            if (srMonthOfYear.checkValue(0))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.January"));
-            }
-            if (srMonthOfYear.checkValue(1))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.February"));
-            }
-            if (srMonthOfYear.checkValue(2))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.March"));
-            }
-            if (srMonthOfYear.checkValue(3))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.April"));
-            }
-            if (srMonthOfYear.checkValue(4))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.May"));
-            }
-            if (srMonthOfYear.checkValue(5))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.June"));
-            }
-            if (srMonthOfYear.checkValue(6))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.July"));
-            }
-            if (srMonthOfYear.checkValue(7))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.August"));
-            }
-            if (srMonthOfYear.checkValue(8))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.September"));
-            }
-            if (srMonthOfYear.checkValue(9))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.October"));
-            }
-            if (srMonthOfYear.checkValue(10))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.November"));
-            }
-            if (srMonthOfYear.checkValue(11))
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.December"));
-            }
-            out.println(sb.toString());
-          }
-%>
-<%
-          if (srDayOfMonth == null)
-          {
-            if (srDayOfWeek == null && srHourOfDay == null && srMinutesOfHour == null)
-              out.println(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.onanydayofthemonth"));
-          }
-          else
-          {
-            StringBuffer sb = new StringBuffer(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.onthe")+" ");
-            int k = 0;
-            boolean firstTime = true;
-            while (k < 31)
-            {
-              if (srDayOfMonth.checkValue(k))
-              {
-                if (firstTime)
-                  firstTime = false;
-                else
-                  sb.append(",");
-                sb.append(Integer.toString(k+1));
-                int value = (k+1) % 10;
-                if (value == 1 && k != 10)
-                  sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.st"));
-                else if (value == 2 && k != 11)
-                  sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.nd"));
-                else if (value == 3 && k != 12)
-                  sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.rd"));
-                else
-                  sb.append(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.th"));
-              }
-              k++;
-            }
-            sb.append(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ofthemonth"));
-            out.println(sb.toString());
-          }
-%>
-<%
-          if (srYear != null)
-          {
-            StringBuffer sb = new StringBuffer(" "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.inyears")+" ");
-            Iterator iter = srYear.getValues();
-            boolean firstTime = true;
-            while (iter.hasNext())
-            {
-              if (firstTime)
-                firstTime = false;
-              else
-                sb.append(",");
-              Integer value = (Integer)iter.next();
-              sb.append(value.toString());
-            }
-            out.println(sb.toString());
-          }
-%>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.MaximumRunTimeColon")%></th>
-              <td>
-<%
-          if (srDuration == null)
-            out.println(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Nolimit"));
-          else
-            out.println(new Long(srDuration.longValue()/60000L).toString() + " "+Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.minutes"));
-%>
-              </td>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.JobInvocationColon")%></th>
-              <td>
-<%
-          if (srRequestMinimum)
-            out.println(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Minimal"));
-          else
-            out.println(Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Complete"));
-%>
-              </td>
-            </tr>
-<%
-        j++;
-      }
-    }
-
-    if (relationshipTypes != null && relationshipTypes.length > 0)
-    {
-      int k = 0;
-      while (k < relationshipTypes.length)
-      {
-        String relationshipType = relationshipTypes[k++];
-        Long value = (Long)hopCountFilters.get(relationshipType);
-%>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.MaximumHopCountForLinkType")%>'<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(relationshipType)%>':</nobr></th>
-              <td colspan="3"><%=((value==null)?Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Unlimited"):value.toString())%></td>
-            </tr>
-
-<%
-      }
-%>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.HopCountModeColon")%></nobr></th>
-              <td colspan="3">
-                <nobr>
-                  <%=(hopcountMode==IJobDescription.HOPCOUNT_ACCURATE)?Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Deleteunreachabledocuments"):""%>
-                  <%=(hopcountMode==IJobDescription.HOPCOUNT_NODELETE)?Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Nodeletesfornow"):""%>
-                  <%=(hopcountMode==IJobDescription.HOPCOUNT_NEVERDELETE)?Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Nodeletesforever"):""%>
-                </nobr>
-              </td>
-            </tr>
-<%
-
-    }
-%>
-            <tr>
-              <td colspan="4">
-                <span class="label label-primary pull-left">1.</span><br/>
-<%
-    if (connection != null)
-    {
-      IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
-      if (repositoryConnector != null)
-      {
-        try
-        {
-          repositoryConnector.viewSpecification(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),job.getSpecification(),0);
-        }
-        finally
-        {
-          repositoryConnectorPool.release(connection,repositoryConnector);
-        }
-      }
-    }
-%>
-              </td>
-            </tr>
-<%
-    for (int j = 0; j < job.countPipelineStages(); j++)
-    {
-%>
-            <tr>
-              <td colspan="4">
-                <span class="label label-primary pull-left"><%=(j + 2)%>.</span><br/>
-<%
-      Specification os = job.getPipelineStageSpecification(j);
-      if (job.getPipelineStageIsOutputConnection(j))
-      {
-        IOutputConnection thisConnection = outputManager.load(job.getPipelineStageConnectionName(j));
-        IOutputConnector outputConnector = outputConnectorPool.grab(thisConnection);
-        if (outputConnector != null)
-        {
-          try
-          {
-            outputConnector.viewSpecification(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),os,1+j);
-          }
-          finally
-          {
-            outputConnectorPool.release(thisConnection,outputConnector);
-          }
-        }
-      }
-      else
-      {
-        ITransformationConnection thisConnection = transformationManager.load(job.getPipelineStageConnectionName(j));
-        ITransformationConnector transformationConnector = transformationConnectorPool.grab(thisConnection);
-        if (transformationConnector != null)
-        {
-          try
-          {
-            transformationConnector.viewSpecification(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),os,1+j);
-          }
-          finally
-          {
-            transformationConnectorPool.release(thisConnection,transformationConnector);
-          }
-        }
-      }
-%>
-              </td>
-            </tr>
-<%
-    }
-
-    for (int j = 0; j < job.countNotifications(); j++)
-    {
-%>
-            <tr>
-              <td colspan="4">
-                <span class="label label-primary pull-left"><%=(j + job.countPipelineStages() + 2)%>.</span><br/>
-<%
-      Specification os = job.getNotificationSpecification(j);
-      INotificationConnection thisConnection = notificationManager.load(job.getNotificationConnectionName(j));
-      INotificationConnector notificationConnector = notificationConnectorPool.grab(thisConnection);
-      if (notificationConnector != null)
-      {
-        try
-        {
-          notificationConnector.viewSpecification(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),os,1+job.countPipelineStages()+j);
-        }
-        finally
-        {
-          notificationConnectorPool.release(thisConnection,notificationConnector);
-        }
-      }
-%>
-              </td>
-            </tr>
-<%
-    }
-
-%>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="editjob.jsp?origjobid="+jobID%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewjob.CopyThisJob")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-clipboard fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Copy")%></a>
-            <a href='<%="editjob.jsp?jobid="+jobID%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewjob.EditThisJob")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Edit")%></a>
-            <a href='<%="javascript:Delete(\""+jobID+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewjob.DeleteThisJob")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.Delete")%></a>
-            <a href='<%="javascript:StartOver(\""+jobID+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewjob.ResetSeedingThisJob")%>"
-                    class="btn btn-warning" role="button" data-toggle="tooltip"><i class="fa fa-recycle fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewjob.ResetSeeding")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listjobs.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewmapper.jsp b/framework/crawler-ui/src/main/webapp/viewmapper.jsp
deleted file mode 100644
index ea1df54..0000000
--- a/framework/crawler-ui/src/main/webapp/viewmapper.jsp
+++ /dev/null
@@ -1,191 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  IMappingConnectionManager manager = MappingConnectionManagerFactory.make(threadContext);
-  IMappingConnectorManager connectorManager = MappingConnectorManagerFactory.make(threadContext);
-  IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
-  String connectionName = variableContext.getParameter("connname");
-  IMappingConnection connection = manager.load(connectionName);
-  if (connection == null)
-  {
-    throw new ManifoldCFException("No such mapping connection: '"+connectionName+"'");
-  }
-  else
-  {
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"viewmapper.uninstalled");
-    int maxCount = connection.getMaxConnections();
-    String prereq = connection.getPrerequisiteMapping();
-
-    ConfigParams parameters = connection.getConfigParams();
-
-    // Now, test the connection.
-    String connectionStatus;
-    try
-    {
-      IMappingConnector c = mappingConnectorPool.grab(connection);
-      if (c == null)
-      {
-        connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewmapper.Connectorisnotinstalled");
-      }
-      else
-      {
-        try
-        {
-          connectionStatus = c.check();
-        }
-        finally
-        {
-          mappingConnectorPool.release(connection,c);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewmapper.Threwexception")+" '"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"'";
-    }
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewmapper.ApacheManifoldCFViewMappingConnectionStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.ViewMappingConnectionStatus") + " - " + connectionName %>',
-      'authorities'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewmapper.DeleteConnection")%> '"+connectionName+"'<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewmapper.qmark")%>"))
-    {
-      document.viewconnection.op.value="Delete";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewconnection" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="mapper"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.NameColon")%></nobr></th>
-              <td><%="<!--connection=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName) + "-->"%><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.DescriptionColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.MapperTypeColon")%></nobr></th>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.MaxConnectionsColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(Integer.toString(maxCount))%></td></tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.PrerequisiteUserMappingColon")%></nobr></th>
-              <td colspan="3">
-<%
-    if (prereq != null)
-    {
-%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(prereq)%></nobr><br/>
-<%
-    }
-    else
-    {
-%>
-                <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.NoPrerequisites")%></nobr>
-<%
-    }
-%>
-              </td>
-            </tr>
-            <tr>
-              <td colspan="4">
-<%
-    MappingConnectorFactory.viewConfiguration(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters);
-%>
-
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.ConnectionStatusColon")%></nobr></th>
-              <td colspan="3"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionStatus)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="viewmapper.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewmapper.Refresh")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.Refresh")%></a>
-            <a href='<%="editmapper.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewmapper.EditThisMappingConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewmapper.DeleteThisMappingConnection")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewmapper.Delete")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listmappers.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewnotification.jsp b/framework/crawler-ui/src/main/webapp/viewnotification.jsp
deleted file mode 100644
index 26e7c92..0000000
--- a/framework/crawler-ui/src/main/webapp/viewnotification.jsp
+++ /dev/null
@@ -1,174 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  INotificationConnectorManager connectorManager = NotificationConnectorManagerFactory.make(threadContext);
-  // Get the connection manager handle
-  INotificationConnectionManager connManager = NotificationConnectionManagerFactory.make(threadContext);
-  INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-  String connectionName = variableContext.getParameter("connname");
-  INotificationConnection connection = connManager.load(connectionName);
-  if (connection == null)
-  {
-    throw new ManifoldCFException("No such connection: '"+connectionName+"'");
-  }
-  else
-  {
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"viewnotification.uninstalled");
-    int maxCount = connection.getMaxConnections();
-    ConfigParams parameters = connection.getConfigParams();
-
-    // Do stuff so we can call out to display the parameters
-    //String JSPFolder = NotificationConnectorFactory.getJSPFolder(threadContext,className);
-    //threadContext.save("Parameters",parameters);
-
-    // Now, test the connection.
-    String connectionStatus;
-    try
-    {
-      INotificationConnector c = notificationConnectorPool.grab(connection);
-      if (c == null)
-        connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewnotification.Connectorisnotinstalled");
-      else
-      {
-        try
-        {
-          connectionStatus = c.check();
-        }
-        finally
-        {
-          notificationConnectorPool.release(connection,c);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewnotification.Threwexception")+" '"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"'";
-    }
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewnotification.ApacheManifoldCFViewNotificationConnectionStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewnotification.ViewNotificationConnectionStatus")%>',
-      'repositories'
-  );
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewnotification.Deletenotificationconnection")%> '"+connectionName+"'<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewnotification.qmark")%>"))
-    {
-      document.viewconnection.op.value="Delete";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  //-->
-</script>
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewconnection" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="notification"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.NameColon")%></nobr></th>
-              <td><%="<!--connection=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName) + "-->"%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></nobr>
-              </td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.DescriptionColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.ConnectionTypeColon")%></nobr></th>
-              <td><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></nobr></td>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.MaxConnectionsColon")%></nobr></th>
-              <td><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(Integer.toString(maxCount))%></td>
-            </tr>
-            <tr>
-              <td colspan="4">
-<%
-    NotificationConnectorFactory.viewConfiguration(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters);
-%>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.ConnectionStatusColon")%></nobr></th>
-              <td colspan="3"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionStatus)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="viewnotification.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewnotification.Refresh")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.Refresh")%></a>
-            <a href='<%="editnotification.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewnotification.EditThisNotificationConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewnotification.DeleteThisNotificationConnection")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewnotification.Delete")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listnotifications.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewoutput.jsp b/framework/crawler-ui/src/main/webapp/viewoutput.jsp
deleted file mode 100644
index b549de6..0000000
--- a/framework/crawler-ui/src/main/webapp/viewoutput.jsp
+++ /dev/null
@@ -1,204 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  IOutputConnectorManager connectorManager = OutputConnectorManagerFactory.make(threadContext);
-  // Get the connection manager handle
-  IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(threadContext);
-  IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-  String connectionName = variableContext.getParameter("connname");
-  IOutputConnection connection = connManager.load(connectionName);
-  if (connection == null)
-  {
-    throw new ManifoldCFException("No such connection: '"+connectionName+"'");
-  }
-  else
-  {
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"viewoutput.uninstalled");
-    int maxCount = connection.getMaxConnections();
-    ConfigParams parameters = connection.getConfigParams();
-
-    // Do stuff so we can call out to display the parameters
-    //String JSPFolder = OutputConnectorFactory.getJSPFolder(threadContext,className);
-    //threadContext.save("Parameters",parameters);
-
-    // Now, test the connection.
-    String connectionStatus;
-    try
-    {
-      IOutputConnector c = outputConnectorPool.grab(connection);
-      if (c == null)
-        connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewoutput.Connectorisnotinstalled");
-      else
-      {
-        try
-        {
-          connectionStatus = c.check();
-        }
-        finally
-        {
-          outputConnectorPool.release(connection,c);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewoutput.Threwexception")+" '"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"'";
-    }
-%>
-
-<script type="text/javascript">
-  <!--
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewoutput.ApacheManifoldCFViewOutputConnectionStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewoutput.ViewOutputConnectionStatus") + " - " + connectionName %>',
-      'outputs'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewoutput.Deleteoutputconnection")%> '"+connectionName+"'<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewoutput.qmark")%>"))
-    {
-      document.viewconnection.op.value="Delete";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  function ReingestAll(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewoutput.Thiscommandwillforce")%> '"+connectionName+"' <%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewoutput.toberecrawled")%>"))
-    {
-      document.viewconnection.op.value="ReingestAll";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  function RemoveAll(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewoutput.Thiscommandwillcause")%> '"+connectionName+"' <%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewoutput.tobeforgotten")%>"))
-    {
-      document.viewconnection.op.value="RemoveAll";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  //-->
-</script>
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewconnection" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="output"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewoutput.NameColon")%></th>
-              <td class="value" colspan="1"><%="<!--connection=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName) + "-->"%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></nobr>
-              </td>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewoutput.DescriptionColon")%></th>
-              <td class="value" colspan="1"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewoutput.ConnectionTypeColon")%></th>
-              <td class="value" colspan="1"><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></nobr></td>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewoutput.MaxConnectionsColon")%></th>
-              <td class="value" colspan="1"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(Integer.toString(maxCount))%></td>
-            </tr>
-            <tr>
-              <td colspan="4">
-<%
-    OutputConnectorFactory.viewConfiguration(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters);
-%>
-              </td>
-            </tr>
-            <tr>
-              <th><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewoutput.ConnectionStatusColon")%></nobr></th>
-              <td colspan="3"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionStatus)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="viewoutput.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.Refresh")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.Refresh")%></a>
-            <a href='<%="editoutput.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.EditThisOutputConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.DeleteThisOutputConnection")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.Delete")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:ReingestAll(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.ReIngestAllDocumentsAssociatedWithThisOutputConnection")%>"
-                    class="btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-repeat fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.ReIngestAllAssociatedDocuments")%></a>
-            <a href="javascript:void(0)"
-                    onclick='<%="javascript:RemoveAll(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.RemoveAllDocumentsAssociatedWithThisOutputConnection")%>"
-                    class="btn btn-warning" role="button" data-toggle="tooltip"><i class="fa fa-remove fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewoutput.RemoveAllAssociatedDocuments")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listoutputs.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/crawler-ui/src/main/webapp/viewtransformation.jsp b/framework/crawler-ui/src/main/webapp/viewtransformation.jsp
deleted file mode 100644
index f3325e5..0000000
--- a/framework/crawler-ui/src/main/webapp/viewtransformation.jsp
+++ /dev/null
@@ -1,178 +0,0 @@
-<%@ include file="adminHeaders.jsp" %>
-
-<%
-
-/* $Id$ */
-
-/**
-* 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.
-*/
-%>
-
-<%
-try
-{
-  // Check if authorized
-  if (!adminprofile.checkAllowed(threadContext,IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-  {
-    variableContext.setParameter("target","index.jsp");
-%>
-    <jsp:forward page="unauthorized.jsp"/>
-<%
-  }
-  ITransformationConnectorManager connectorManager = TransformationConnectorManagerFactory.make(threadContext);
-  // Get the connection manager handle
-  ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(threadContext);
-  ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-  String connectionName = variableContext.getParameter("connname");
-  ITransformationConnection connection = connManager.load(connectionName);
-  if (connection == null)
-  {
-    throw new ManifoldCFException("No such connection: '"+connectionName+"'");
-  }
-  else
-  {
-    String description = connection.getDescription();
-    if (description == null)
-      description = "";
-    String className = connection.getClassName();
-    String connectorName = connectorManager.getDescription(className);
-    if (connectorName == null)
-      connectorName = className + Messages.getString(pageContext.getRequest().getLocale(),"viewtransformation.uninstalled");
-    int maxCount = connection.getMaxConnections();
-    ConfigParams parameters = connection.getConfigParams();
-
-    // Do stuff so we can call out to display the parameters
-    //String JSPFolder = TransformationConnectorFactory.getJSPFolder(threadContext,className);
-    //threadContext.save("Parameters",parameters);
-
-    // Now, test the connection.
-    String connectionStatus;
-    try
-    {
-      ITransformationConnector c = transformationConnectorPool.grab(connection);
-      if (c == null)
-        connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewtransformation.Connectorisnotinstalled");
-      else
-      {
-        try
-        {
-          connectionStatus = c.check();
-        }
-        finally
-        {
-          transformationConnectorPool.release(connection,c);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      connectionStatus = Messages.getString(pageContext.getRequest().getLocale(),"viewtransformation.Threwexception")+" '"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage())+"'";
-    }
-%>
-
-<script type="text/javascript">
-  <!--
-
-  $.ManifoldCF.setTitle(
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewtransformation.ApacheManifoldCFViewTransformationConnectionStatus")%>',
-      '<%=Messages.getBodyString(pageContext.getRequest().getLocale(), "viewtransformation.ViewTransformationConnectionStatus") + " - " + connectionName%>',
-      'outputs'
-  );
-
-  function Delete(connectionName)
-  {
-    if (confirm("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewtransformation.Deletetransformationconnection")%> '"+connectionName+"'<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"viewtransformation.qmark")%>"))
-    {
-      document.viewconnection.op.value="Delete";
-      document.viewconnection.connname.value=connectionName;
-      $.ManifoldCF.submit(document.viewconnection);
-    }
-  }
-
-  //-->
-</script>
-
-
-<div class="row">
-  <div class="col-md-12">
-    <div class="box box-primary">
-      <form class="standardform" name="viewconnection" action="execute.jsp" method="POST">
-        <input type="hidden" name="op" value="Continue"/>
-        <input type="hidden" name="type" value="transformation"/>
-        <input type="hidden" name="connname" value=""/>
-
-        <div class="box-body">
-          <table class="table table-bordered">
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewtransformation.NameColon")%></th>
-              <td class="value" colspan="1"><%="<!--connection=" + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName) + "-->"%>
-                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%></nobr>
-              </td>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewtransformation.DescriptionColon")%></th>
-              <td class="value" colspan="1"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%></td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewtransformation.ConnectionTypeColon")%></th>
-              <td class="value" colspan="1"><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectorName)%></nobr></td>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewtransformation.MaxConnectionsColon")%></th>
-              <td class="value" colspan="1"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(Integer.toString(maxCount))%></td>
-            </tr>
-            <tr>
-              <td colspan="4">
-<%
-    TransformationConnectorFactory.viewConfiguration(threadContext,className,new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),parameters);
-%>
-              </td>
-            </tr>
-            <tr>
-              <th><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"viewtransformation.ConnectionStatusColon")%></th>
-              <td class="value" colspan="3"><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionStatus)%></td>
-            </tr>
-          </table>
-        </div>
-        <div class="box-footer clearfix">
-          <div class="btn-group">
-            <a href='<%="viewtransformation.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewtransformation.Refresh")%>"
-                    class="link btn btn-success" role="button" data-toggle="tooltip"><i class="fa fa-refresh fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewtransformation.Refresh")%></a>
-            <a href='<%="edittransformation.jsp?connname="+org.apache.manifoldcf.core.util.URLEncoder.encode(connectionName)%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewtransformation.EditThisTransformationConnection")%>"
-                    class="link btn btn-primary" role="button" data-toggle="tooltip"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewtransformation.Edit")%></a>
-            <a href="javascript:void(0);"
-                    onclick='<%="javascript:Delete(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(connectionName)+"\")"%>'
-                    title="<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewtransformation.DeleteThisTransformationConnection")%>"
-                    class="btn btn-danger" role="button" data-toggle="tooltip"><i class="fa fa-trash fa-fw" aria-hidden="true"></i><%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"viewtransformation.Delete")%></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </div>
-</div>
-<%
-  }
-}
-catch (ManifoldCFException e)
-{
-  e.printStackTrace();
-  variableContext.setParameter("text",e.getMessage());
-  variableContext.setParameter("target","listtransformations.jsp");
-%>
-  <jsp:forward page="error.jsp"/>
-<%
-}
-%>
diff --git a/framework/engine-scripts/options.env.unix b/framework/engine-scripts/options.env.unix
deleted file mode 100644
index 156d79b..0000000
--- a/framework/engine-scripts/options.env.unix
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms8m
--Xmx8m
--cp
-.:
diff --git a/framework/engine-scripts/options.env.win b/framework/engine-scripts/options.env.win
deleted file mode 100644
index 0b49b24..0000000
--- a/framework/engine-scripts/options.env.win
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms8m

--Xmx8m

--cp

-.;

diff --git a/framework/engine-scripts/run-script.bat b/framework/engine-scripts/run-script.bat
deleted file mode 100644
index 8717f71..0000000
--- a/framework/engine-scripts/run-script.bat
+++ /dev/null
@@ -1,30 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist "..\lib" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type options.env.win') do call setjavaoption.bat "%%a"

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.scriptengine.ScriptParser %*

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Script must be run from script-engine directory.

-goto done

-:done

diff --git a/framework/engine-scripts/run-script.sh b/framework/engine-scripts/run-script.sh
deleted file mode 100644
index a235382..0000000
--- a/framework/engine-scripts/run-script.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="options.env.win"
-else
-    OPTIONSFILE="options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -e ../lib ] ; then
-    
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.scriptengine.ScriptParser "$@"
-        exit $?
-        
-    else
-        echo "Script must be run from script-engine directory." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-common/README.txt b/framework/example-common/README.txt
deleted file mode 100644
index a3d38a8..0000000
--- a/framework/example-common/README.txt
+++ /dev/null
@@ -1,25 +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.
-
-This directory is meant to contain proprietary jars required for the execution
-of connectors, which cannot be redistributed under the Apache license.
-
-If you receive the binary distribution of ManifoldCF, and you want to enable
-one of the proprietary connectors, you must place the required proprietary
-material in this directory, and then enable the connector by uncommenting
-the appropriate entries in the connectors.xml file.  Further information can be
-found on the "how-to-build-and-deploy.html" documentation page.
-
-
diff --git a/framework/example-common/connectors.xml b/framework/example-common/connectors.xml
deleted file mode 100644
index 0130559..0000000
--- a/framework/example-common/connectors.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<!-- The connectors registry file permits registration of domains and connectors upon the
-      startup of the jetty-based ManifoldCF example.  In a real installation, this registration
-      step would be done ideally just once, but in the example the connectors
-      are all reregistered on every startup.
--->
-<connectors>
-    <!-- Add any authorization domains here -->
-    <!-- authorizationdomain domain="AD" name="ActiveDirectory"/-->
-    <!-- authorizationdomain domain="SHP" name="SharePoint"/-->
-    <!-- authorizationdomain domain="FB" name="FaceBook"/-->
-
-    <!-- Add your output connectors here -->
-
-    <!-- Add your transformation connectors here -->
-
-    <!-- Add your mapping connectors here -->
-    
-    <!-- Add your authority connectors here -->
-    
-    <!-- Add your repository connectors here -->
-
-    <!-- Add your notification connectors here -->
-
-</connectors>
diff --git a/framework/example-file-resources/README.txt b/framework/example-file-resources/README.txt
deleted file mode 100644
index 97b5257..0000000
--- a/framework/example-file-resources/README.txt
+++ /dev/null
@@ -1,25 +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.
-
-This directory is meant to contain file resources that your connectors may need.
-It is referenced by the org.apache.manifoldcf.fileresources property in all of the
-distributed examples.  The kinds of resources that go here are common files,
-such as OpenNLP model files.
-
-Read more about how to populate this directory on the "how-to-build-and-deploy.html"
-documentation page.
-
-
-
diff --git a/framework/example-multiprocess-common/initialize.bat b/framework/example-multiprocess-common/initialize.bat
deleted file mode 100644
index 73a9bbf..0000000
--- a/framework/example-multiprocess-common/initialize.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-rem invoke the RegisterAll command

-cmd /c ".\executecommand.bat org.apache.manifoldcf.crawler.InitializeAndRegister"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/example-multiprocess-common/initialize.sh b/framework/example-multiprocess-common/initialize.sh
deleted file mode 100755
index fd322f9..0000000
--- a/framework/example-multiprocess-common/initialize.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        ./executecommand.sh org.apache.manifoldcf.crawler.InitializeAndRegister
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-multiprocess-common/jetty.xml b/framework/example-multiprocess-common/jetty.xml
deleted file mode 100644
index 5346990..0000000
--- a/framework/example-multiprocess-common/jetty.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
-
-<!--
- 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.
--->
-
-<Configure id="server" class="org.eclipse.jetty.server.Server">
-  <Set name="connectors">
-    <Array type="org.eclipse.jetty.server.Connector">
-      <Item>
-        <New class="org.eclipse.jetty.server.ServerConnector">
-          <Arg><Ref refid="server"/></Arg>
-          <Set name="port">8345</Set>
-        </New>
-      </Item>
-    </Array>
-  </Set>
-</Configure>
diff --git a/framework/example-multiprocess-common/logging.xml b/framework/example-multiprocess-common/logging.xml
deleted file mode 100644
index 8152ad4..0000000
--- a/framework/example-multiprocess-common/logging.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<Configuration status="warn" name="ManifoldCF" packages="">
-  <Appenders>
-    <File name="MyFile" fileName="logs/manifoldcf.log">
-      <PatternLayout>
-        <Pattern>%5p %d{ISO8601} (%t) - %m%n</Pattern>
-      </PatternLayout>
-    </File>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="MyFile"/>
-    </Root>
-  </Loggers>
-</Configuration>
diff --git a/framework/example-multiprocess-common/start-agents-2.bat b/framework/example-multiprocess-common/start-agents-2.bat
deleted file mode 100644
index 943d8e6..0000000
--- a/framework/example-multiprocess-common/start-agents-2.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-rem invoke the AgentRun command

-cmd /c ".\executecommand.bat -Dorg.apache.manifoldcf.processid=B org.apache.manifoldcf.agents.AgentRun"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/example-multiprocess-common/start-agents-2.sh b/framework/example-multiprocess-common/start-agents-2.sh
deleted file mode 100755
index 9558884..0000000
--- a/framework/example-multiprocess-common/start-agents-2.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        ./executecommand.sh -Dorg.apache.manifoldcf.processid=B org.apache.manifoldcf.agents.AgentRun
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-multiprocess-common/start-agents.bat b/framework/example-multiprocess-common/start-agents.bat
deleted file mode 100644
index 5dcba86..0000000
--- a/framework/example-multiprocess-common/start-agents.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-rem invoke the AgentRun command

-cmd /c ".\executecommand.bat -Dorg.apache.manifoldcf.processid=A org.apache.manifoldcf.agents.AgentRun"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/example-multiprocess-common/start-agents.sh b/framework/example-multiprocess-common/start-agents.sh
deleted file mode 100755
index ff08431..0000000
--- a/framework/example-multiprocess-common/start-agents.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        ./executecommand.sh -Dorg.apache.manifoldcf.processid=A org.apache.manifoldcf.agents.AgentRun
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-multiprocess-common/stop-agents.bat b/framework/example-multiprocess-common/stop-agents.bat
deleted file mode 100644
index 32a9a8e..0000000
--- a/framework/example-multiprocess-common/stop-agents.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-rem invoke the AgentStop command

-cmd /c ".\executecommand.bat org.apache.manifoldcf.agents.AgentStop"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/example-multiprocess-common/stop-agents.sh b/framework/example-multiprocess-common/stop-agents.sh
deleted file mode 100755
index ad1a87d..0000000
--- a/framework/example-multiprocess-common/stop-agents.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        ./executecommand.sh org.apache.manifoldcf.agents.AgentStop
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-multiprocess-file-common/lock-clean.bat b/framework/example-multiprocess-file-common/lock-clean.bat
deleted file mode 100644
index 055dd45..0000000
--- a/framework/example-multiprocess-file-common/lock-clean.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-rem invoke the LockClean command

-cmd /c "executecommand.bat org.apache.manifoldcf.core.LockClean"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/example-multiprocess-file-common/lock-clean.sh b/framework/example-multiprocess-file-common/lock-clean.sh
deleted file mode 100755
index 6e697c5..0000000
--- a/framework/example-multiprocess-file-common/lock-clean.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        ./executecommand.sh org.apache.manifoldcf.core.LockClean
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-multiprocess-file-proprietary/properties.xml b/framework/example-multiprocess-file-proprietary/properties.xml
deleted file mode 100644
index 9554558..0000000
--- a/framework/example-multiprocess-file-proprietary/properties.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<configuration>
-  <!-- Version string for UI -->
-  <property name="org.apache.manifoldcf.versionstring" value="unknown version"/>
-  <!-- Point to the wars and configure Jetty -->
-  <property name="org.apache.manifoldcf.crawleruiwarpath" value="../web-proprietary/war/mcf-crawler-ui.war"/>
-  <property name="org.apache.manifoldcf.authorityservicewarpath" value="../web-proprietary/war/mcf-authority-service.war"/>
-  <property name="org.apache.manifoldcf.apiservicewarpath" value="../web-proprietary/war/mcf-api-service.war"/>
-  <property name="org.apache.manifoldcf.usejettyparentclassloader" value="false"/>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- Point to the synchronization area -->
-  <property name="org.apache.manifoldcf.synchdirectory" value="./syncharea"/>
-  <!-- Select HSQLDB as the database implementation, and specify multiprocess access -->
-  <property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceHSQLDB"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseprotocol" value="hsql"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseserver" value="localhost"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseinstance" value="xdb"/>
-  <property name="org.apache.manifoldcf.dbsuperusername" value="sa"/>
-  <property name="org.apache.manifoldcf.dbsuperuserpassword" value=""/>
-  <property name="org.apache.manifoldcf.database.maxhandles" value="100"/>
-  <property name="org.apache.manifoldcf.crawler.threads" value="50"/>
-  <!-- Point to a specific (common) logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="../connectors-proprietary.xml"/>
-  <!-- Specify the path to the file resources directory -->
-  <property name="org.apache.manifoldcf.fileresources" value="../file-resources"/>
-  <!-- Tell MCF where to find the connector jars -->
-  <libdir path="../connector-lib"/>
-  <libdir path="../connector-common-lib"/>
-  <libdir path="../connector-lib-proprietary"/>
-  <!-- WSDD references -->
-  <!-- Any additional properties go here -->
-</configuration>
diff --git a/framework/example-multiprocess-file/properties.xml b/framework/example-multiprocess-file/properties.xml
deleted file mode 100644
index 85532ff..0000000
--- a/framework/example-multiprocess-file/properties.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<configuration>
-  <!-- Version string for UI -->
-  <property name="org.apache.manifoldcf.versionstring" value="unknown version"/>
-  <!-- Point to the wars and configure Jetty -->
-  <property name="org.apache.manifoldcf.crawleruiwarpath" value="../web/war/mcf-crawler-ui.war"/>
-  <property name="org.apache.manifoldcf.authorityservicewarpath" value="../web/war/mcf-authority-service.war"/>
-  <property name="org.apache.manifoldcf.apiservicewarpath" value="../web/war/mcf-api-service.war"/>
-  <property name="org.apache.manifoldcf.usejettyparentclassloader" value="false"/>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- Point to the synchronization area -->
-  <property name="org.apache.manifoldcf.synchdirectory" value="./syncharea"/>
-  <!-- Select HSQLDB as the database implementation, and specify multiprocess access -->
-  <property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceHSQLDB"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseprotocol" value="hsql"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseserver" value="localhost"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseinstance" value="xdb"/>
-  <property name="org.apache.manifoldcf.dbsuperusername" value="sa"/>
-  <property name="org.apache.manifoldcf.dbsuperuserpassword" value=""/>
-  <property name="org.apache.manifoldcf.database.maxhandles" value="100"/>
-  <property name="org.apache.manifoldcf.crawler.threads" value="50"/>
-  <!-- Point to a specific (common) logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="../connectors.xml"/>
-  <!-- Specify the path to the file resources directory -->
-  <property name="org.apache.manifoldcf.fileresources" value="../file-resources"/>
-  <!-- Tell MCF where to find the connector jars -->
-  <libdir path="../connector-lib"/>
-  <libdir path="../connector-common-lib"/>
-  <libdir path="../connector-lib-proprietary"/>
-  <!-- WSDD references -->
-  <!-- Any additional properties go here -->
-</configuration>
diff --git a/framework/example-multiprocess-zk-common/properties-global.xml b/framework/example-multiprocess-zk-common/properties-global.xml
deleted file mode 100644
index 27f226f..0000000
--- a/framework/example-multiprocess-zk-common/properties-global.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<!-- This file contains ONLY global (shared) configuration, for use on systems using
-    ZooKeeper to coordinate ManifoldCF processes. -->
-<configuration>
-  <!-- Version string for UI -->
-  <property name="org.apache.manifoldcf.versionstring" value="unknown version"/>
-  <!-- Select HSQLDB as the database implementation, and specify multiprocess access -->
-  <property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceHSQLDB"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseprotocol" value="hsql"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseserver" value="localhost"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabaseinstance" value="xdb"/>
-  <property name="org.apache.manifoldcf.dbsuperusername" value="sa"/>
-  <property name="org.apache.manifoldcf.dbsuperuserpassword" value=""/>
-  <property name="org.apache.manifoldcf.database.maxhandles" value="100"/>
-  <property name="org.apache.manifoldcf.crawler.threads" value="20"/>
-  <!-- Any additional global properties go here -->
-</configuration>
diff --git a/framework/example-multiprocess-zk-common/setglobalproperties.bat b/framework/example-multiprocess-zk-common/setglobalproperties.bat
deleted file mode 100644
index d7b12f6..0000000
--- a/framework/example-multiprocess-zk-common/setglobalproperties.bat
+++ /dev/null
@@ -1,28 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-cmd /c ".\executecommand.bat org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager properties-global.xml"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/example-multiprocess-zk-common/setglobalproperties.sh b/framework/example-multiprocess-zk-common/setglobalproperties.sh
deleted file mode 100755
index b11a171..0000000
--- a/framework/example-multiprocess-zk-common/setglobalproperties.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        ./executecommand.sh org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager properties-global.xml
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/example-multiprocess-zk-common/zookeeper.cfg b/framework/example-multiprocess-zk-common/zookeeper.cfg
deleted file mode 100644
index d1af846..0000000
--- a/framework/example-multiprocess-zk-common/zookeeper.cfg
+++ /dev/null
@@ -1,22 +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.
-
-tickTime=5000
-dataDir=zookeeper
-clientPort=8349
-maxClientCnxns=1000
-autopurge.snapRetainCount=3
-autopurge.purgeInterval=6
-
diff --git a/framework/example-multiprocess-zk-proprietary/properties.xml b/framework/example-multiprocess-zk-proprietary/properties.xml
deleted file mode 100644
index 7986627..0000000
--- a/framework/example-multiprocess-zk-proprietary/properties.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<!-- This configuration file contains only non-global configuration information,
-    which is basically limited to file paths and ZooKeeper configuration -->
-<configuration>
-  <!-- Point to the wars and configure Jetty -->
-  <property name="org.apache.manifoldcf.crawleruiwarpath" value="../web-proprietary/war/mcf-crawler-ui.war"/>
-  <property name="org.apache.manifoldcf.authorityservicewarpath" value="../web-proprietary/war/mcf-authority-service.war"/>
-  <property name="org.apache.manifoldcf.apiservicewarpath" value="../web-proprietary/war/mcf-api-service.war"/>
-  <property name="org.apache.manifoldcf.usejettyparentclassloader" value="false"/>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- ZooKeeper lock manager configuration -->
-  <property name="org.apache.manifoldcf.lockmanagerclass" value="org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager"/>
-  <property name="org.apache.manifoldcf.zookeeper.connectstring" value="localhost:8349"/>
-  <property name="org.apache.manifoldcf.zookeeper.sessiontimeout" value="300000"/>
-  <!-- Point to a specific (common) logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="../connectors-proprietary.xml"/>
-  <!-- Specify the path to the file resources directory -->
-  <property name="org.apache.manifoldcf.fileresources" value="../file-resources"/>
-  <!-- Tell MCF where to find the connector jars -->
-  <libdir path="../connector-lib"/>
-  <libdir path="../connector-common-lib"/>
-  <libdir path="../connector-lib-proprietary"/>
-  <!-- Any additional local properties go here -->
-</configuration>
diff --git a/framework/example-multiprocess-zk/properties.xml b/framework/example-multiprocess-zk/properties.xml
deleted file mode 100644
index 3e8baff..0000000
--- a/framework/example-multiprocess-zk/properties.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<!-- This configuration file contains only non-global configuration information,
-    which is basically limited to file paths and ZooKeeper configuration -->
-<configuration>
-  <!-- Point to the wars and configure Jetty -->
-  <property name="org.apache.manifoldcf.crawleruiwarpath" value="../web/war/mcf-crawler-ui.war"/>
-  <property name="org.apache.manifoldcf.authorityservicewarpath" value="../web/war/mcf-authority-service.war"/>
-  <property name="org.apache.manifoldcf.apiservicewarpath" value="../web/war/mcf-api-service.war"/>
-  <property name="org.apache.manifoldcf.usejettyparentclassloader" value="false"/>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- ZooKeeper lock manager configuration -->
-  <property name="org.apache.manifoldcf.lockmanagerclass" value="org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager"/>
-  <property name="org.apache.manifoldcf.zookeeper.connectstring" value="localhost:8349"/>
-  <property name="org.apache.manifoldcf.zookeeper.sessiontimeout" value="300000"/>
-  <!-- Point to a specific (common) logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="../connectors.xml"/>
-  <!-- Specify the path to the file resources directory -->
-  <property name="org.apache.manifoldcf.fileresources" value="../file-resources"/>
-  <!-- Tell MCF where to find the connector jars -->
-  <libdir path="../connector-lib"/>
-  <libdir path="../connector-common-lib"/>
-  <libdir path="../connector-lib-proprietary"/>
-  <!-- Any additional local properties go here -->
-</configuration>
diff --git a/framework/example-singleprocess-common/jetty.xml b/framework/example-singleprocess-common/jetty.xml
deleted file mode 100644
index 5346990..0000000
--- a/framework/example-singleprocess-common/jetty.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
-
-<!--
- 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.
--->
-
-<Configure id="server" class="org.eclipse.jetty.server.Server">
-  <Set name="connectors">
-    <Array type="org.eclipse.jetty.server.Connector">
-      <Item>
-        <New class="org.eclipse.jetty.server.ServerConnector">
-          <Arg><Ref refid="server"/></Arg>
-          <Set name="port">8345</Set>
-        </New>
-      </Item>
-    </Array>
-  </Set>
-</Configure>
diff --git a/framework/example-singleprocess-common/logging.xml b/framework/example-singleprocess-common/logging.xml
deleted file mode 100644
index 8152ad4..0000000
--- a/framework/example-singleprocess-common/logging.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<Configuration status="warn" name="ManifoldCF" packages="">
-  <Appenders>
-    <File name="MyFile" fileName="logs/manifoldcf.log">
-      <PatternLayout>
-        <Pattern>%5p %d{ISO8601} (%t) - %m%n</Pattern>
-      </PatternLayout>
-    </File>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="MyFile"/>
-    </Root>
-  </Loggers>
-</Configuration>
diff --git a/framework/example-singleprocess-proprietary/properties.xml b/framework/example-singleprocess-proprietary/properties.xml
deleted file mode 100644
index d454218..0000000
--- a/framework/example-singleprocess-proprietary/properties.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<configuration>
-  <!-- Version string for UI -->
-  <property name="org.apache.manifoldcf.versionstring" value="unknown version"/>
-  <!-- Point to the wars and configure Jetty -->
-  <property name="org.apache.manifoldcf.crawleruiwarpath" value="../web-proprietary/war/mcf-crawler-ui.war"/>
-  <property name="org.apache.manifoldcf.authorityservicewarpath" value="../web-proprietary/war/mcf-authority-service.war"/>
-  <property name="org.apache.manifoldcf.apiservicewarpath" value="../web-proprietary/war/mcf-api-service.war"/>
-  <property name="org.apache.manifoldcf.usejettyparentclassloader" value="true"/>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- Point to the combined war in case we start the single-process example that way -->
-  <property name="org.apache.manifoldcf.combinedwarpath" value="../web-proprietary/war/mcf-combined-service.war"/>
-  <!-- Select Derby as the database implementation, and specify where the database will be stored -->
-  <property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceHSQLDB"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabasepath" value="."/>
-  <property name="org.apache.manifoldcf.database.maxhandles" value="100"/>
-  <property name="org.apache.manifoldcf.crawler.threads" value="50"/>
-  <property name="org.apache.manifoldcf.crawler.historycleanupinterval" value="2592000000"/>
-  <!-- Point to a specific logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="../connectors-proprietary.xml"/>
-  <!-- Specify the path to the file resources directory -->
-  <property name="org.apache.manifoldcf.fileresources" value="../file-resources"/>
-  <!-- Tell MCF where to find the connector jars -->
-  <libdir path="../connector-lib"/>
-  <libdir path="../connector-common-lib"/>
-  <libdir path="../connector-lib-proprietary"/>
-  <!-- WSDD references -->
-  <!-- Any additional properties go here -->
-</configuration>
diff --git a/framework/example-singleprocess/properties.xml b/framework/example-singleprocess/properties.xml
deleted file mode 100644
index e151290..0000000
--- a/framework/example-singleprocess/properties.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<configuration>
-  <!-- Version string for UI -->
-  <property name="org.apache.manifoldcf.versionstring" value="unknown version"/>
-  <!-- Point to the wars and configure Jetty -->
-  <property name="org.apache.manifoldcf.crawleruiwarpath" value="../web/war/mcf-crawler-ui.war"/>
-  <property name="org.apache.manifoldcf.authorityservicewarpath" value="../web/war/mcf-authority-service.war"/>
-  <property name="org.apache.manifoldcf.apiservicewarpath" value="../web/war/mcf-api-service.war"/>
-  <property name="org.apache.manifoldcf.usejettyparentclassloader" value="true"/>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- Point to the combined war in case we start the single-process example that way -->
-  <property name="org.apache.manifoldcf.combinedwarpath" value="../web/war/mcf-combined-service.war"/>
-  <!-- Select HSQLDB as the database implementation, and specify where the database will be stored -->
-  <property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceHSQLDB"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabasepath" value="."/>
-  <property name="org.apache.manifoldcf.database.maxhandles" value="100"/>
-  <property name="org.apache.manifoldcf.crawler.threads" value="50"/>
-  <property name="org.apache.manifoldcf.crawler.historycleanupinterval" value="2592000000"/>
-  <!-- Point to a specific logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="../connectors.xml"/>
-  <!-- Specify the path to the file resources directory -->
-  <property name="org.apache.manifoldcf.fileresources" value="../file-resources"/>
-  <!-- Tell MCF where to find the connector jars -->
-  <libdir path="../connector-lib"/>
-  <libdir path="../connector-common-lib"/>
-  <libdir path="../connector-lib-proprietary"/>
-  <!-- WSDD references -->
-  <!-- Any additional properties go here -->
-</configuration>
diff --git a/framework/jetty-runner/.gitignore b/framework/jetty-runner/.gitignore
deleted file mode 100644
index fbdf7eb..0000000
--- a/framework/jetty-runner/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.classpath
-/.project
-/.settings/
diff --git a/framework/jetty-runner/pom.xml b/framework/jetty-runner/pom.xml
deleted file mode 100644
index d368d29..0000000
--- a/framework/jetty-runner/pom.xml
+++ /dev/null
@@ -1,447 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-jettyrunner</artifactId>
-  <name>ManifoldCF - Framework - Jetty Runner</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-           <execution>
-            <id>copy-war</id>
-            <phase>validate</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/dependency</outputDirectory>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-api-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-authority-service</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                </artifactItem>
-                <artifactItem>
-                  <groupId>${project.groupId}</groupId>
-                  <artifactId>mcf-crawler-ui</artifactId>
-                  <version>${project.version}</version>
-                  <type>war</type>
-                  <overWrite>false</overWrite>
-                </artifactItem>
-              </artifactItems>
-            </configuration>
-          </execution>
-        </executions>
-      
-      </plugin>
-      
-      <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-        <version>2.7</version>
-        <executions>
-          <execution>
-            <id>copy-resource-one</id>
-            <phase>validate</phase>
-            <goals>
-              <goal>copy-resources</goal>
-            </goals>
-
-            <configuration>
-              <outputDirectory>${basedir}/target/run</outputDirectory>
-              <resources>
-                <resource>
-                  <directory>src/main/resources</directory>
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-        
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.2</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <executable>java</executable>
-          <workingDirectory>target/run</workingDirectory>
-          <arguments>
-            <argument>-Dorg.apache.manifoldcf.configfile=properties.xml</argument>
-            <argument>-classpath</argument>
-            <classpath />
-            <argument>org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner</argument>
-            <argument>8345</argument>
-            <argument>../dependency/mcf-crawler-ui-${project.version}.war</argument>
-            <argument>../dependency/mcf-authority-service-${project.version}.war</argument>
-            <argument>../dependency/mcf-api-service-${project.version}.war</argument>
-          </arguments>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-api-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-authority-service</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-crawler-ui</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-pull-agent</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- Compile-time dependencies -->
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-
-    <!-- output connectors -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-solr-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-nulloutput-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-gts-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- authority connectors -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-nullauthority-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-activedirectory-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-cmis-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- repository connectors -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-web-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-rss-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-jdbc-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-filesystem-connector</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- web dependencies -->
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>${servlet-api.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-jsp-jdt</artifactId>
-      <version>${jetty-jsp-jdt.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>*</groupId>
-          <artifactId>*</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-schemas</artifactId>
-      <version>${jetty-schemas.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tomcat</groupId>
-      <artifactId>jasper</artifactId>
-      <version>${tomcat.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tomcat</groupId>
-      <artifactId>jasper-el</artifactId>
-      <version>${tomcat.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tomcat</groupId>
-      <artifactId>juli</artifactId>
-      <version>${tomcat.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jdt.core.compiler</groupId>
-      <artifactId>ecj</artifactId>
-      <version>${ecj.version}</version>
-    </dependency>
-
-    <!-- databases -->
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- jdbc connector databases -->
-    <dependency>
-      <groupId>net.sourceforge.jtds</groupId>
-      <artifactId>jtds</artifactId>
-      <version>${jtds.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>${mysql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mariadb.jdbc</groupId>
-      <artifactId>mariadb-java-client</artifactId>
-      <version>${mariadb.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <!-- runtime dependencies -->
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>${commons-lang.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>${commons-io.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-el</groupId>
-      <artifactId>commons-el</artifactId>
-      <version>${commons-el.version}</version>
-      <scope>runtime</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-      <version>${commons-collections.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-fileupload</groupId>
-      <artifactId>commons-fileupload</artifactId>
-      <version>${commons-fileupload.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xalan</groupId>
-      <artifactId>serializer</artifactId>
-      <version>${xalan.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>${xerces.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xml-apis</groupId>
-      <artifactId>xml-apis</artifactId>
-      <version>${xml-apis.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    
-		
-  </dependencies>
-
-</project>
diff --git a/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFCombinedJettyRunner.java b/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFCombinedJettyRunner.java
deleted file mode 100644
index 9ccc479..0000000
--- a/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFCombinedJettyRunner.java
+++ /dev/null
@@ -1,222 +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 org.apache.manifoldcf.jettyrunner;
-
-import java.io.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import org.apache.manifoldcf.crawler.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.xml.XmlConfiguration;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.server.handler.ShutdownHandler;
-import org.eclipse.jetty.server.Handler;
-
- /* Run ManifoldCF with jetty.
- * 
- */
-public class ManifoldCFCombinedJettyRunner
-{
-
-  public static final String _rcsid = "@(#)$Id$";
-
-  public static final String combinedWarPathProperty = "org.apache.manifoldcf.combinedwarpath";
-  public static final String jettyConfigFileProperty = "org.apache.manifoldcf.jettyconfigfile";
-  
-  protected Server server;
-  
-
-  public ManifoldCFCombinedJettyRunner( File configFile, String combinedWarPath )
-    throws Exception
-  {
-    Resource fileserverXml = Resource.newResource(configFile.getCanonicalFile());
-    XmlConfiguration configuration = new XmlConfiguration(fileserverXml.getInputStream());
-    server = (Server)configuration.configure();
-    initializeServer( combinedWarPath );
-  }
-
-  public ManifoldCFCombinedJettyRunner( int port, String combinedWarPath )
-  {
-    server = new Server( port );
-    initializeServer( combinedWarPath );
-  }
-
-  protected void initializeServer( String combinedWarPath )
-  {
-    server.setStopAtShutdown( true );
-    
-    // Initialize the servlets
-    ContextHandlerCollection contexts = new ContextHandlerCollection();
-    WebAppContext mcfCombined = new WebAppContext(combinedWarPath,"/mcf");
-    mcfCombined.setParentLoaderPriority(false);
-    contexts.addHandler(mcfCombined);
-    
-    HandlerList handlers = new HandlerList();
-    handlers.addHandler(contexts);
-    
-    // Pick up shutdown token
-    String shutdownToken = System.getProperty("org.apache.manifoldcf.jettyshutdowntoken");
-    if (shutdownToken != null)
-    {
-      ShutdownHandler shutdown = new ShutdownHandler(shutdownToken);
-      shutdown.setExitJvm(true);
-
-      handlers.addHandler(shutdown);
-    }
-    server.setHandler(handlers);
-  }
-  
-  public void start()
-    throws ManifoldCFException
-  {
-    if(!server.isRunning() )
-    {
-      try
-      {
-        server.start();
-      }
-      catch (Exception e)
-      {
-        throw new ManifoldCFException("Couldn't start: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  public void stop()
-    throws ManifoldCFException
-  {
-    if( server.isRunning() )
-    {
-      try
-      {
-        server.stop();
-      }
-      catch (Exception e)
-      {
-        throw new ManifoldCFException("Couldn't stop: "+e.getMessage(),e);
-      }
-      try
-      {
-        server.join();
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-  }
-
-  /**
-   * Returns the Local Port of the first Connector found for the jetty Server.
-   * @return the port number.
-   */
-  public int getLocalPort()
-    throws ManifoldCFException
-  {
-    ServerConnector[] conns = (ServerConnector[]) server.getConnectors();
-    if (0 == conns.length) {
-      throw new ManifoldCFException("Jetty Server has no Connectors");
-    }
-    return conns[0].getLocalPort();
-  }
-
-  /**
-   * A main class that starts jetty+mcf
-   */
-  public static void main( String[] args )
-  {
-    if (args.length != 2 && args.length != 1 && args.length != 0)
-    {
-      System.err.println("Usage: ManifoldCFCombinedJettyRunner [<port> [<combined-war-path>]]");
-      System.exit(1);
-    }
-
-    
-    // Ready to begin in earnest...
-    if (System.getProperty(ManifoldCF.lcfConfigFileProperty) == null)
-    	System.setProperty(ManifoldCF.lcfConfigFileProperty,"./properties.xml");
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-
-      // Grab the parameters which locate the wars and describe how we work with Jetty
-      File combinedWarPath = ManifoldCF.getFileProperty(combinedWarPathProperty);
-      File jettyConfigFile = ManifoldCF.getFileProperty(jettyConfigFileProperty);
-      if (jettyConfigFile == null)
-        jettyConfigFile = new File("./jetty.xml");
-      if (args.length == 2)
-      {
-        combinedWarPath = new File(args[1]);
-      }
-      else
-      {
-        if (combinedWarPath == null)
-          throw new ManifoldCFException("The property '"+combinedWarPathProperty+"' must be set");
-      }
-      
-      System.err.println("Starting jetty...");
-      
-      // Create a jetty instance
-      ManifoldCFCombinedJettyRunner jetty = new ManifoldCFCombinedJettyRunner(jettyConfigFile,combinedWarPath.toString());
-      // This will register a shutdown hook as well.
-      jetty.start();
-
-      System.err.println("Jetty started.");
-
-      // Go to sleep until interrupted.
-      while (true)
-      {
-        try
-        {
-          Thread.sleep(5000);
-          continue;
-        }
-        catch (InterruptedException e)
-        {
-          break;
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (Logging.root != null)
-        Logging.root.error("Exception: "+e.getMessage(),e);
-      e.printStackTrace(System.err);
-      System.exit(1);
-    }
-  }
-  
-}
-
-
diff --git a/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFJettyRunner.java b/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFJettyRunner.java
deleted file mode 100644
index 7ddff4a..0000000
--- a/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFJettyRunner.java
+++ /dev/null
@@ -1,285 +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 org.apache.manifoldcf.jettyrunner;
-
-import java.io.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import org.apache.manifoldcf.crawler.*;
-import org.apache.manifoldcf.agents.system.AgentsDaemon;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.xml.XmlConfiguration;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.server.handler.ShutdownHandler;
-import org.eclipse.jetty.server.Handler;
-
-/**
- * Run ManifoldCF with jetty.
- * 
- */
-public class ManifoldCFJettyRunner
-{
-
-  public static final String _rcsid = "@(#)$Id: ManifoldCFJettyRunner.java 989983 2010-08-27 00:10:12Z kwright $";
-
-  public static final String crawlerUIWarPathProperty = "org.apache.manifoldcf.crawleruiwarpath";
-  public static final String authorityServiceWarPathProperty = "org.apache.manifoldcf.authorityservicewarpath";
-  public static final String apiServiceWarPathProperty = "org.apache.manifoldcf.apiservicewarpath";
-  public static final String useJettyParentClassLoaderProperty = "org.apache.manifoldcf.usejettyparentclassloader";
-  public static final String jettyConfigFileProperty = "org.apache.manifoldcf.jettyconfigfile";
-  
-  protected Server server;
-  
-  public ManifoldCFJettyRunner( File configFile, String crawlerWarPath, String authorityServiceWarPath, String apiWarPath, boolean useParentLoader )
-    throws Exception
-  {
-    Resource fileserverXml = Resource.newResource(configFile.getCanonicalFile());
-    XmlConfiguration configuration = new XmlConfiguration(fileserverXml.getInputStream());
-    server = (Server)configuration.configure();
-    initializeServer(crawlerWarPath, authorityServiceWarPath, apiWarPath, useParentLoader);
-  }
-  
-  public ManifoldCFJettyRunner( int port, String crawlerWarPath, String authorityServiceWarPath, String apiWarPath, boolean useParentLoader )
-  {
-    Server server = new Server( port );
-    initializeServer(crawlerWarPath, authorityServiceWarPath, apiWarPath, useParentLoader);
-  }
-  
-  protected void initializeServer( String crawlerWarPath, String authorityServiceWarPath, String apiWarPath, boolean useParentLoader )
-  {
-    server.setStopAtShutdown( true );
-    
-    // Initialize the servlets
-    ContextHandlerCollection contexts = new ContextHandlerCollection();
-    WebAppContext lcfCrawlerUI = new WebAppContext(crawlerWarPath,"/mcf-crawler-ui");
-    // This can cause jetty to ignore all of the framework and jdbc jars in the war, which is what we
-    // want in the single-process case.
-    lcfCrawlerUI.setParentLoaderPriority(useParentLoader);
-    contexts.addHandler(lcfCrawlerUI);
-    WebAppContext lcfAuthorityService = new WebAppContext(authorityServiceWarPath,"/mcf-authority-service");
-    // This can cause jetty to ignore all of the framework and jdbc jars in the war, which is what we
-    // want in the single-process case.
-    lcfAuthorityService.setParentLoaderPriority(useParentLoader);
-    contexts.addHandler(lcfAuthorityService);
-    WebAppContext lcfApi = new WebAppContext(apiWarPath,"/mcf-api-service");
-    // This can cause jetty to ignore all of the framework and jdbc jars in the war, which is what we
-    // want in the single-process case.
-    lcfApi.setParentLoaderPriority(useParentLoader);
-    contexts.addHandler(lcfApi);
-    
-    HandlerList handlers = new HandlerList();
-    handlers.addHandler(contexts);
-    
-    // Pick up shutdown token
-    String shutdownToken = System.getProperty("org.apache.manifoldcf.jettyshutdowntoken");
-    if (shutdownToken != null)
-    {
-      ShutdownHandler shutdown = new ShutdownHandler(shutdownToken);
-      shutdown.setExitJvm(true);
-
-      handlers.addHandler(shutdown);
-    }
-    server.setHandler(handlers);
-
-  }
-
-  public void start()
-    throws ManifoldCFException
-  {
-    if(!server.isRunning() )
-    {
-      try
-      {
-        server.start();
-      }
-      catch (Exception e)
-      {
-        throw new ManifoldCFException("Couldn't start: "+e.getMessage(),e);
-      }
-    }
-  }
-
-  public void stop()
-    throws ManifoldCFException
-  {
-    if( server.isRunning() )
-    {
-      try
-      {
-        server.stop();
-      }
-      catch (Exception e)
-      {
-        throw new ManifoldCFException("Couldn't stop: "+e.getMessage(),e);
-      }
-      try
-      {
-        server.join();
-      }
-      catch (InterruptedException e)
-      {
-        throw new ManifoldCFException(e.getMessage(),e,ManifoldCFException.INTERRUPTED);
-      }
-    }
-  }
-
-  /**
-   * Returns the Local Port of the first Connector found for the jetty Server.
-   * @return the port number.
-   */
-  public int getLocalPort()
-    throws ManifoldCFException
-  {
-    ServerConnector[] conns = (ServerConnector[]) server.getConnectors();
-    if (0 == conns.length) {
-      throw new ManifoldCFException("Jetty Server has no Connectors");
-    }
-    return conns[0].getLocalPort();
-  }
-
-  /** Run the agents process.  This method will not return unless the agents process is shut down.
-  */
-  public static void runAgents(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    String processID = ManifoldCF.getProcessID();
-    // Do this so we don't have to call stopAgents() ourselves.
-    AgentsDaemon ad = new AgentsDaemon(processID);
-    ad.registerAgentsShutdownHook(tc);
-    ad.runAgents(tc);
-  }
-
-  /**
-   * A main class that starts jetty+mcf
-   */
-  public static void main( String[] args )
-  {
-    if (args.length != 4 && args.length != 1 && args.length != 0)
-    {
-      System.err.println("Usage: ManifoldCFJettyRunner [<jetty-config-file> [<crawler-war-path> <authority-service-war-path> <api-war-path>]]");
-      System.exit(1);
-    }
-
-    
-    // Ready to begin in earnest...
-    if (System.getProperty(ManifoldCF.lcfConfigFileProperty) == null)
-    	System.setProperty(ManifoldCF.lcfConfigFileProperty,"./properties.xml");
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-
-      // Grab the parameters which locate the wars and describe how we work with Jetty.  These are not shared.
-      File crawlerWarPath = ManifoldCF.getFileProperty(crawlerUIWarPathProperty);
-      File authorityserviceWarPath = ManifoldCF.getFileProperty(authorityServiceWarPathProperty);
-      File apiWarPath = ManifoldCF.getFileProperty(apiServiceWarPathProperty);
-      boolean useParentClassLoader = ManifoldCF.getBooleanProperty(useJettyParentClassLoaderProperty,true);
-      File jettyConfigFile = ManifoldCF.getFileProperty(jettyConfigFileProperty);
-
-      if (jettyConfigFile == null)
-        jettyConfigFile = new File("./jetty.xml");
-      if (args.length == 4)
-      {
-        crawlerWarPath = new File(args[1]);
-        authorityserviceWarPath = new File(args[2]);
-        apiWarPath = new File(args[3]);
-      }
-      else
-      {
-        if (crawlerWarPath == null)
-          throw new ManifoldCFException("The property '"+crawlerUIWarPathProperty+"' must be set");
-        if (authorityserviceWarPath == null)
-          throw new ManifoldCFException("The property '"+authorityServiceWarPathProperty+"' must be set");
-        if (apiWarPath == null)
-          throw new ManifoldCFException("The property '"+apiServiceWarPathProperty+"' must be set");
-      }
-      
-      if (useParentClassLoader)
-      {
-        // Clear the agents shutdown signal.
-        AgentsDaemon.clearAgentsShutdownSignal(tc);
-        
-        // Do the basic initialization of the database and its schema
-        ManifoldCF.createSystemDatabase(tc);
-        
-        ManifoldCF.installTables(tc);
-        
-        org.apache.manifoldcf.crawler.system.ManifoldCF.registerThisAgent(tc);
-        
-        ManifoldCF.reregisterAllConnectors(tc);
-      }
-      
-      System.err.println("Starting jetty...");
-      
-      // Create a jetty instance
-      ManifoldCFJettyRunner jetty = new ManifoldCFJettyRunner(jettyConfigFile,crawlerWarPath.toString(),authorityserviceWarPath.toString(),apiWarPath.toString(),useParentClassLoader);
-      // This will register a shutdown hook as well.
-      jetty.start();
-
-      System.err.println("Jetty started.");
-
-      if (useParentClassLoader)
-      {
-        System.err.println("Starting crawler...");
-        runAgents(tc);
-        System.err.println("Shutting down crawler...");
-      }
-      else
-      {
-        // Go to sleep until interrupted.
-        while (true)
-        {
-          try
-          {
-            Thread.sleep(5000);
-            continue;
-          }
-          catch (InterruptedException e)
-          {
-            break;
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      if (Logging.root != null)
-        Logging.root.error("Exception: "+e.getMessage(),e);
-      e.printStackTrace(System.err);
-      System.exit(1);
-    }
-  }
-  
-}
-
-
diff --git a/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFJettyShutdown.java b/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFJettyShutdown.java
deleted file mode 100644
index 6dc946f..0000000
--- a/framework/jetty-runner/src/main/java/org/apache/manifoldcf/jettyrunner/ManifoldCFJettyShutdown.java
+++ /dev/null
@@ -1,149 +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 org.apache.manifoldcf.jettyrunner;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.HttpEntity;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.entity.ContentType;
-import org.apache.http.ParseException;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.util.EntityUtils;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-import java.net.URLEncoder;
-import java.nio.charset.Charset;
-
- /* Shutdown jetty by posting the shutdown token
- * 
- */
-public class ManifoldCFJettyShutdown
-{
-
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final String jettyBaseURL;
-  
-  public ManifoldCFJettyShutdown(String jettyBaseURL)
-  {
-    this.jettyBaseURL = jettyBaseURL;
-  }
-
-  public void shutdownJetty()
-    throws Exception
-  {
-    // Pick up shutdown token
-    String shutdownToken = System.getProperty("org.apache.manifoldcf.jettyshutdowntoken");
-    if (shutdownToken != null)
-    {
-      int socketTimeout = 900000;
-      int connectionTimeout = 300000;
-
-      PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
-      poolingConnectionManager.setDefaultMaxPerRoute(1);
-      poolingConnectionManager.setValidateAfterInactivity(60000);
-      poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-        .setTcpNoDelay(true)
-        .setSoTimeout(socketTimeout)
-        .build());
-      HttpClientConnectionManager connectionManager = poolingConnectionManager;
-        
-      RequestConfig.Builder requestBuilder = RequestConfig.custom()
-        .setCircularRedirectsAllowed(true)
-        .setSocketTimeout(socketTimeout)
-        .setExpectContinueEnabled(true)
-        .setConnectTimeout(connectionTimeout)
-        .setConnectionRequestTimeout(socketTimeout);
-
-      HttpClient httpClient = HttpClients.custom()
-        .setConnectionManager(connectionManager)
-        .disableAutomaticRetries()
-        .setDefaultRequestConfig(requestBuilder.build())
-        .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-        .setRedirectStrategy(new DefaultRedirectStrategy())
-        .build();
-
-      HttpPost method = new HttpPost(jettyBaseURL+"/shutdown?token="+URLEncoder.encode(shutdownToken,"UTF-8"));
-      method.setEntity(new StringEntity("",ContentType.create("text/plain", StandardCharsets.UTF_8)));
-      try
-      {
-        HttpResponse httpResponse = httpClient.execute(method);
-        int resultCode = httpResponse.getStatusLine().getStatusCode();
-        if (resultCode != 200)
-          throw new Exception("Received result code "+resultCode+" from POST");
-      }
-      catch (org.apache.http.NoHttpResponseException e)
-      {
-        // This is ok and expected
-      }
-    }
-    else
-    {
-      throw new Exception("No jetty shutdown token specified");
-    }
-  }
-  
-  /**
-   * A main class that sends a shutdown token to Jetty
-   */
-  public static void main( String[] args )
-  {
-    if (args.length != 0 && args.length != 1)
-    {
-      System.err.println("Usage: ManifoldCFJettyShutdown [<jetty_base_url>]");
-      System.exit(1);
-    }
-    
-    String jettyURL;
-    if (args.length > 0)
-      jettyURL = args[0];
-    else
-      jettyURL = "http://localhost:8345";
-    
-    try
-    {
-      ManifoldCFJettyShutdown js = new ManifoldCFJettyShutdown(jettyURL);
-      js.shutdownJetty();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(1);
-    }
-  }
-  
-}
-
-
diff --git a/framework/jetty-runner/src/main/resources/connectors.xml b/framework/jetty-runner/src/main/resources/connectors.xml
deleted file mode 100644
index b160a00..0000000
--- a/framework/jetty-runner/src/main/resources/connectors.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<!-- The connectors registry file permits registration of connectors upon the
-      startup of the jetty-based LCF example.  In a real installation, this registration
-      step would be done ideally just once, but in the example the connectors
-      are all reregistered on every startup.
--->
-<connectors>
-  <!-- Add your output connectors here -->
-  <outputconnector name="Solr" class="org.apache.manifoldcf.agents.output.solr.SolrConnector"/>
-  <outputconnector name="Null" class="org.apache.manifoldcf.agents.output.nullconnector.NullConnector"/>
-  <outputconnector name="MetaCarta GTS" class="org.apache.manifoldcf.agents.output.gts.GTSConnector"/>
-    <!-- Add your authority connectors here -->
-  <authorityconnector name="Null" class="org.apache.manifoldcf.authorities.authorities.nullauthority.NullAuthority"/>
-  <authorityconnector name="CMIS" class="org.apache.manifoldcf.authorities.authorities.cmis.CmisAuthorityConnector"/>
-  <authorityconnector name="Active Directory" class="org.apache.manifoldcf.authorities.authorities.activedirectory.ActiveDirectoryAuthority"/>
-    <!-- Add your repository connectors here -->
-  <repositoryconnector name="Web" class="org.apache.manifoldcf.crawler.connectors.webcrawler.WebcrawlerConnector"/>
-  <repositoryconnector name="RSS" class="org.apache.manifoldcf.crawler.connectors.rss.RSSConnector"/>
-  <repositoryconnector name="JDBC" class="org.apache.manifoldcf.crawler.connectors.jdbc.JDBCConnector"/>
-  <repositoryconnector name="File system" class="org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector"/>
-  <repositoryconnector name="CMIS" class="org.apache.manifoldcf.crawler.connectors.cmis.CmisRepositoryConnector"/>
-</connectors>
diff --git a/framework/jetty-runner/src/main/resources/jetty.xml b/framework/jetty-runner/src/main/resources/jetty.xml
deleted file mode 100644
index 5346990..0000000
--- a/framework/jetty-runner/src/main/resources/jetty.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
-
-<!--
- 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.
--->
-
-<Configure id="server" class="org.eclipse.jetty.server.Server">
-  <Set name="connectors">
-    <Array type="org.eclipse.jetty.server.Connector">
-      <Item>
-        <New class="org.eclipse.jetty.server.ServerConnector">
-          <Arg><Ref refid="server"/></Arg>
-          <Set name="port">8345</Set>
-        </New>
-      </Item>
-    </Array>
-  </Set>
-</Configure>
diff --git a/framework/jetty-runner/src/main/resources/logging.xml b/framework/jetty-runner/src/main/resources/logging.xml
deleted file mode 100644
index 8152ad4..0000000
--- a/framework/jetty-runner/src/main/resources/logging.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<Configuration status="warn" name="ManifoldCF" packages="">
-  <Appenders>
-    <File name="MyFile" fileName="logs/manifoldcf.log">
-      <PatternLayout>
-        <Pattern>%5p %d{ISO8601} (%t) - %m%n</Pattern>
-      </PatternLayout>
-    </File>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="MyFile"/>
-    </Root>
-  </Loggers>
-</Configuration>
diff --git a/framework/jetty-runner/src/main/resources/properties.xml b/framework/jetty-runner/src/main/resources/properties.xml
deleted file mode 100644
index 05c881c..0000000
--- a/framework/jetty-runner/src/main/resources/properties.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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.
--->
-
-<configuration>
-  <property name="org.apache.manifoldcf.jettyconfigfile" value="./jetty.xml"/>
-  <!-- Select Derby as the database implementation, and specify where the database will be stored -->
-  <property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceHSQLDB"/>
-  <property name="org.apache.manifoldcf.hsqldbdatabasepath" value="."/>
-  <property name="org.apache.manifoldcf.database.maxhandles" value="100"/>
-  <property name="org.apache.manifoldcf.crawler.threads" value="50"/>
-  <!-- Point to a specific logging file -->
-  <property name="org.apache.manifoldcf.logconfigfile" value="./logging.xml"/>
-  <!-- Specify the connectors to be loaded -->
-  <property name="org.apache.manifoldcf.connectorsconfigurationfile" value="./connectors.xml"/>
-  <!-- Tell LCF where to find the connector jars -->
-  <!--libdir path="./connector-lib"/-->
-  <!-- WSDD references -->
-  <!-- Any additional properties go here -->
-</configuration>
diff --git a/framework/less-compiler/pom.xml b/framework/less-compiler/pom.xml
deleted file mode 100644
index c425674..0000000
--- a/framework/less-compiler/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-less-compiler</artifactId>
-  <name>ManifoldCF - Framework - Less Compiler</name>
-  <packaging>jar</packaging>
-
-  <dependencies>
-
-    <!-- Less compiler -->
-    <dependency>
-      <groupId>com.github.sommeri</groupId>
-      <artifactId>less4j</artifactId>
-      <version>1.17.2</version>
-    </dependency>
-
-  </dependencies>
-
-</project>
diff --git a/framework/less-compiler/src/main/java/org/apache/manifoldcf/less/MCFLessCompiler.java b/framework/less-compiler/src/main/java/org/apache/manifoldcf/less/MCFLessCompiler.java
deleted file mode 100644
index 882b1d9..0000000
--- a/framework/less-compiler/src/main/java/org/apache/manifoldcf/less/MCFLessCompiler.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/* $Id$ */
-
-/**
- * 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 org.apache.manifoldcf.less;
-
-
-import com.github.sommeri.less4j.Less4jException;
-import com.github.sommeri.less4j.LessCompiler;
-import com.github.sommeri.less4j.LessSource;
-import com.github.sommeri.less4j.core.DefaultLessCompiler;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-
-import java.io.*;
-
-/**
- * Created by Kishore Kumar on 4/28/17.
- */
-public class MCFLessCompiler
-{
-  final static String lessFolderPath = "./framework/crawler-ui/src/main/webapp/less";
-  final static String cssFolderPath = "./framework/crawler-ui/src/main/webapp/css";
-  boolean compress = false;
-
-  private LessCompiler.Configuration createConfiguration(File cssOutut)
-  {
-
-    LessCompiler.Configuration configuration = new LessCompiler.Configuration();
-    configuration.setCssResultLocation(new LessSource.FileSource(cssOutut));
-    configuration.setCompressing(compress);
-
-    return configuration;
-  }
-
-  public void compile(String inputLess)
-  {
-    String outputCSS = null;
-    if (inputLess != null && !inputLess.isEmpty())
-      outputCSS = FilenameUtils.removeExtension(inputLess) + ".css";
-    compile(inputLess, outputCSS);
-  }
-
-  public void compile(String inputLess, String outputCSS)
-  {
-    compile(inputLess, outputCSS, false);
-  }
-
-  public void compile(String inputLess, String outputCSS, boolean compress)
-  {
-    this.compress = compress;
-    LessCompiler compiler = new DefaultLessCompiler();
-    try
-    {
-      LessCompiler.Configuration configuration = createConfiguration(new File(outputCSS));
-      LessCompiler.CompilationResult compilationResult = compiler.compile(new LessSource.FileSource(new File(inputLess)), configuration);
-
-      if (compilationResult.getWarnings().size() > 0)
-      {
-        for (LessCompiler.Problem warning : compilationResult.getWarnings())
-        {
-          System.err.println(warning);
-        }
-      }
-      else
-      {
-        if (outputCSS != null && !outputCSS.isEmpty())
-        {
-          FileUtils.writeStringToFile(new File(outputCSS), compilationResult.getCss());
-        }
-
-        //Generate Source map if compressing
-        if (compress)
-        {
-          String cssFileName = FilenameUtils.removeExtension(outputCSS);
-          String mapFileName = cssFileName + ".map";
-          FileUtils.writeStringToFile(new File(mapFileName), compilationResult.getSourceMap());
-        }
-      }
-    }
-    catch (Less4jException e)
-    {
-      e.printStackTrace();
-    }
-    catch (IOException e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  public static void main(String... args)
-  {
-
-    String outputLess = lessFolderPath + "/style.less";
-    String outputCSS = cssFolderPath + "/style.css";
-    boolean compress = false;
-
-    MCFLessCompiler compiler = new MCFLessCompiler();
-
-    switch (args.length)
-    {
-      case 1:
-        outputLess = args[0];
-        compiler.compile(outputLess);
-        break;
-      case 2:
-        outputLess = args[0];
-        outputCSS = args[1];
-        compiler.compile(outputLess, outputCSS);
-        break;
-      case 3:
-        outputLess = args[0];
-        outputCSS = args[1];
-        compress = Boolean.valueOf(args[2]);
-        compiler.compile(outputLess, outputCSS, compress);
-        break;
-      default:
-        compiler.compile(outputLess, outputCSS, compress);
-
-    }
-
-  }
-
-}
diff --git a/framework/obfuscate-scripts/obfuscate.bat b/framework/obfuscate-scripts/obfuscate.bat
deleted file mode 100644
index 30c3c61..0000000
--- a/framework/obfuscate-scripts/obfuscate.bat
+++ /dev/null
@@ -1,30 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist "..\lib" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type options.env.win') do call setjavaoption.bat "%%a"

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.core.Obfuscate %*

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Script must be run from obfuscate directory.

-goto done

-:done

diff --git a/framework/obfuscate-scripts/obfuscate.sh b/framework/obfuscate-scripts/obfuscate.sh
deleted file mode 100644
index ab2971c..0000000
--- a/framework/obfuscate-scripts/obfuscate.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="options.env.win"
-else
-    OPTIONSFILE="options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -e ../lib ] ; then
-    
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.core.Obfuscate "$@"
-        exit $?
-        
-    else
-        echo "Script must be run from obfuscate directory." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/obfuscate-scripts/options.env.unix b/framework/obfuscate-scripts/options.env.unix
deleted file mode 100644
index 156d79b..0000000
--- a/framework/obfuscate-scripts/options.env.unix
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms8m
--Xmx8m
--cp
-.:
diff --git a/framework/obfuscate-scripts/options.env.win b/framework/obfuscate-scripts/options.env.win
deleted file mode 100644
index 0b49b24..0000000
--- a/framework/obfuscate-scripts/options.env.win
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms8m

--Xmx8m

--cp

-.;

diff --git a/framework/pom.xml b/framework/pom.xml
deleted file mode 100644
index 956cc32..0000000
--- a/framework/pom.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-parent</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>org.apache.manifoldcf</groupId>
-  <artifactId>mcf-framework</artifactId>
-  <version>2.10-SNAPSHOT</version>
-
-  <name>ManifoldCF - Framework</name>
-  <packaging>pom</packaging>
-
-  <modules>
-    <module>less-compiler</module>
-    <module>core</module>
-    <module>connector-common</module>
-    <module>ui-core</module>
-    <module>agents</module>
-    <module>pull-agent</module>
-    <module>authority-servlet</module>
-    <module>api-servlet</module>
-    <module>authority-service</module>
-    <module>api-service</module>
-    <module>crawler-ui</module>
-    <module>script-engine</module>
-    <module>combined-service</module>
-  </modules>
-
-</project>
\ No newline at end of file
diff --git a/framework/pull-agent/.gitignore b/framework/pull-agent/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/framework/pull-agent/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/framework/pull-agent/pom.xml b/framework/pull-agent/pom.xml
deleted file mode 100644
index 5135f07..0000000
--- a/framework/pull-agent/pom.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-pull-agent</artifactId>
-  <name>ManifoldCF - Framework - Pull Agent</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/*Postgresql*.java</exclude>
-            <exclude>**/*HSQLDBext*.java</exclude>
-            <exclude>**/*MySQL*.java</exclude>
-          </excludes>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <workingDirectory>target/test-output</workingDirectory>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-http</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-security</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-continuation</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${jetty.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-agents</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>${postgresql.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>${hsqldb.version}</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseAuthoritiesInitializationCommand.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseAuthoritiesInitializationCommand.java
deleted file mode 100644
index 3f3fb56..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseAuthoritiesInitializationCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import org.apache.manifoldcf.authorities.interfaces.AuthorityConnectorManagerFactory;
-import org.apache.manifoldcf.authorities.interfaces.IAuthorityConnectorManager;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-
-/**
- * @author Jettro Coenradie
- */
-public abstract class BaseAuthoritiesInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    IAuthorityConnectorManager mgr = AuthorityConnectorManagerFactory.make(tc);
-
-    doExecute(mgr);
-  }
-
-  protected abstract void doExecute(IAuthorityConnectorManager mgr) throws ManifoldCFException;
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseDomainsInitializationCommand.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseDomainsInitializationCommand.java
deleted file mode 100644
index 70855dc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseDomainsInitializationCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import org.apache.manifoldcf.authorities.interfaces.AuthorizationDomainManagerFactory;
-import org.apache.manifoldcf.authorities.interfaces.IAuthorizationDomainManager;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-
-/**
- * @author Jettro Coenradie
- */
-public abstract class BaseDomainsInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    IAuthorizationDomainManager mgr = AuthorizationDomainManagerFactory.make(tc);
-
-    doExecute(mgr);
-  }
-
-  protected abstract void doExecute(IAuthorizationDomainManager mgr) throws ManifoldCFException;
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseMappersInitializationCommand.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseMappersInitializationCommand.java
deleted file mode 100644
index 66fd4e5..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/BaseMappersInitializationCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import org.apache.manifoldcf.authorities.interfaces.MappingConnectorManagerFactory;
-import org.apache.manifoldcf.authorities.interfaces.IMappingConnectorManager;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-
-/**
- * @author Jettro Coenradie
- */
-public abstract class BaseMappersInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    IMappingConnectorManager mgr = MappingConnectorManagerFactory.make(tc);
-
-    doExecute(mgr);
-  }
-
-  protected abstract void doExecute(IMappingConnectorManager mgr) throws ManifoldCFException;
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/ChangeAuthSpec.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/ChangeAuthSpec.java
deleted file mode 100644
index 66e7c4a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/ChangeAuthSpec.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id: ChangeAuthSpec.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class ChangeAuthSpec
-{
-        public static final String _rcsid = "@(#)$Id: ChangeAuthSpec.java 988245 2010-08-23 18:39:35Z kwright $";
-
-        private ChangeAuthSpec()
-        {
-        }
-
-        public static void main(String[] args)
-        {
-                if (args.length != 2)
-                {
-                        System.err.println("Usage: ChangeAuthSpec <connection_name> <connection_xml>");
-                        System.exit(1);
-                }
-
-                String connectionName = args[0];
-                String connectionXML = args[1];
-
-
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        IAuthorityConnectionManager connManager = AuthorityConnectionManagerFactory.make(tc);
-                        IAuthorityConnection conn = connManager.load(connectionName);
-                        if (conn == null)
-                        {
-                                System.err.println("No such connection: '"+connectionName+"'");
-                                System.exit(3);
-                        }
-                        conn.getConfigParams().fromXML(connectionXML);
-
-                        // Now, save
-                        connManager.save(conn);
-                        System.out.println("Authority specification has been changed");
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-                
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/CheckAll.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/CheckAll.java
deleted file mode 100644
index bc2ae41..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/CheckAll.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/* $Id: CheckAll.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class CheckAll
-{
-  public static final String _rcsid = "@(#)$Id: CheckAll.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private CheckAll()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 0)
-    {
-      System.err.println("Usage: CheckAll");
-      System.exit(1);
-    }
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(tc);
-      // Now, get a list of the authority connections
-      IAuthorityConnectionManager mgr = AuthorityConnectionManagerFactory.make(tc);
-      IAuthorityConnection[] connections = mgr.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        // Grab the connection and perform a check operation.
-        // Check operations that return "connection working" are ignored.
-        // Operations that return anything else stream stuff to standard error,
-        // in a form which is parseable.  This will be an escaped form of the authority identifying string, followed by ":",
-        // followed by the message and a newline
-        IAuthorityConnection connection = connections[i++];
-        String identifyingName = connection.getDescription();
-        if (identifyingName == null || identifyingName.length() == 0)
-          identifyingName = connection.getName();
-
-        String className = connection.getClassName();
-        int maxCount = connection.getMaxConnections();
-        ConfigParams parameters = connection.getConfigParams();
-
-        // Now, test the connection.
-        String connectionStatus;
-        try
-        {
-          IAuthorityConnector c = authorityConnectorPool.grab(connection);
-          if (c != null)
-          {
-            try
-            {
-              connectionStatus = c.check();
-            }
-            finally
-            {
-              authorityConnectorPool.release(connection,c);
-            }
-          }
-          else
-            connectionStatus = "Connector not installed";
-        }
-        catch (ManifoldCFException e)
-        {
-          connectionStatus = "Threw exception: '"+e.getMessage()+"'";
-        }
-
-        if (connectionStatus.startsWith("Connection working"))
-          continue;
-
-        UTF8Stdout.println(encode(identifyingName)+":"+encode(connectionStatus));
-      }
-      System.err.println("Done getting authority status");
-    }
-    catch (Exception e)
-    {
-      System.err.print(e.getMessage());
-      Logging.root.warn("Exception in CheckAll: "+e.getMessage(),e);
-      System.exit(2);
-    }
-  }
-
-  /** Encode a string so that it doesn't have control characters, newlines, or colons in it */
-  protected static String encode(String input)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == ':')
-        sb.append('\\').append(x);
-      else if (x < ' ' && x >= 0)
-        sb.append(' ');
-      else
-        sb.append(x);
-    }
-    return sb.toString();
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/CheckConfigured.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/CheckConfigured.java
deleted file mode 100644
index 458829e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/CheckConfigured.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id: CheckConfigured.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class CheckConfigured
-{
-        public static final String _rcsid = "@(#)$Id: CheckConfigured.java 988245 2010-08-23 18:39:35Z kwright $";
-
-        private CheckConfigured()
-        {
-        }
-
-        public static void main(String[] args)
-        {
-                if (args.length != 0)
-                {
-                        System.err.println("Usage: CheckConfigured");
-                        System.exit(1);
-                }
-
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        // Now, get a list of the authority connections
-                        IAuthorityConnectionManager mgr = AuthorityConnectionManagerFactory.make(tc);
-                        if (mgr.getAllConnections().length > 0)
-                                System.out.println("CONFIGURED");
-                        else
-                                System.out.println("OK");
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DefineAuthorityConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DefineAuthorityConnection.java
deleted file mode 100644
index 7a978bb..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DefineAuthorityConnection.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id: DefineAuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DefineAuthorityConnection
-{
-  public static final String _rcsid = "@(#)$Id: DefineAuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DefineAuthorityConnection()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length < 4)
-    {
-      System.err.println("Usage: DefineAuthorityConnection <connection_name> <description> <connector_class> <pool_max> <param1>=<value1> ...");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String description = args[1];
-    String connectorClass = args[2];
-    String poolMax = args[3];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IAuthorityConnectionManager mgr = AuthorityConnectionManagerFactory.make(tc);
-      IAuthorityConnection conn = mgr.create();
-      conn.setName(connectionName);
-      conn.setDescription(description);
-      conn.setClassName(connectorClass);
-      conn.setMaxConnections(new Integer(poolMax).intValue());
-      ConfigParams x = conn.getConfigParams();
-      int i = 4;
-      while (i < args.length)
-      {
-        String arg = args[i++];
-        // Parse
-        int pos = arg.indexOf("=");
-        if (pos == -1)
-          throw new ManifoldCFException("Argument missing =");
-        String name = arg.substring(0,pos);
-        String value = arg.substring(pos+1);
-        if (name.endsWith("assword"))
-          x.setObfuscatedParameter(name,value);
-        else
-          x.setParameter(name,value);
-      }
-
-      // Now, save
-      mgr.save(conn);
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(2);
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DefineMappingConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DefineMappingConnection.java
deleted file mode 100644
index c211acc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DefineMappingConnection.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DefineMappingConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private DefineMappingConnection()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length < 4)
-    {
-      System.err.println("Usage: DefineMappingConnection <connection_name> <description> <connector_class> <pool_max> <param1>=<value1> ...");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String description = args[1];
-    String connectorClass = args[2];
-    String poolMax = args[3];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IMappingConnectionManager mgr = MappingConnectionManagerFactory.make(tc);
-      IMappingConnection conn = mgr.create();
-      conn.setName(connectionName);
-      conn.setDescription(description);
-      conn.setClassName(connectorClass);
-      conn.setMaxConnections(new Integer(poolMax).intValue());
-      ConfigParams x = conn.getConfigParams();
-      int i = 4;
-      while (i < args.length)
-      {
-        String arg = args[i++];
-        // Parse
-        int pos = arg.indexOf("=");
-        if (pos == -1)
-          throw new ManifoldCFException("Argument missing =");
-        String name = arg.substring(0,pos);
-        String value = arg.substring(pos+1);
-        if (name.endsWith("assword"))
-          x.setObfuscatedParameter(name,value);
-        else
-          x.setParameter(name,value);
-      }
-
-      // Now, save
-      mgr.save(conn);
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(2);
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DeleteAuthorityConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DeleteAuthorityConnection.java
deleted file mode 100644
index cd8eb36..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DeleteAuthorityConnection.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: DeleteAuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DeleteAuthorityConnection
-{
-  public static final String _rcsid = "@(#)$Id: DeleteAuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DeleteAuthorityConnection()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: DeleteAuthorityConnection <connection_name>");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IAuthorityConnectionManager mgr = AuthorityConnectionManagerFactory.make(tc);
-      mgr.delete(connectionName);
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(2);
-    }
-  }
-
-
-
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DeleteMappingConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DeleteMappingConnection.java
deleted file mode 100644
index affc9c2..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/DeleteMappingConnection.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DeleteMappingConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private DeleteMappingConnection()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: DeleteMappingConnection <connection_name>");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IMappingConnectionManager mgr = MappingConnectionManagerFactory.make(tc);
-      mgr.delete(connectionName);
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(2);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterAuthority.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterAuthority.java
deleted file mode 100644
index 3815dbb..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterAuthority.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: RegisterAuthority.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class RegisterAuthority extends BaseAuthoritiesInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: RegisterAuthority.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-  private final String description;
-
-  public RegisterAuthority(String className, String description)
-  {
-    this.className = className;
-    this.description = description;
-  }
-
-  protected void doExecute(IAuthorityConnectorManager mgr) throws ManifoldCFException
-  {
-    mgr.registerConnector(description,className);
-    Logging.root.info("Successfully registered connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: RegisterAuthority <classname> <description>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    String description = args[1];
-
-    try
-    {
-      RegisterAuthority registerAuthority = new RegisterAuthority(className,description);
-      registerAuthority.execute();
-      System.err.println("Successfully registered connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterDomain.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterDomain.java
deleted file mode 100644
index 248df88..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterDomain.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class RegisterDomain extends BaseDomainsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final String domainName;
-  private final String description;
-
-  public RegisterDomain(String domainName, String description)
-  {
-    this.domainName = domainName;
-    this.description = description;
-  }
-
-  protected void doExecute(IAuthorizationDomainManager mgr) throws ManifoldCFException
-  {
-    mgr.registerDomain(description,domainName);
-    Logging.root.info("Successfully registered authorization domain '"+domainName+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: RegisterDomain <domainname> <description>");
-      System.exit(1);
-    }
-
-    String domainName = args[0];
-    String description = args[1];
-
-    try
-    {
-      RegisterDomain registerDomain = new RegisterDomain(domainName,description);
-      registerDomain.execute();
-      System.err.println("Successfully registered authorization domain '"+domainName+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterMapper.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterMapper.java
deleted file mode 100644
index c9b29c8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/RegisterMapper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class RegisterMapper extends BaseMappersInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final String className;
-  private final String description;
-
-  public RegisterMapper(String className, String description)
-  {
-    this.className = className;
-    this.description = description;
-  }
-
-  protected void doExecute(IMappingConnectorManager mgr) throws ManifoldCFException
-  {
-    mgr.registerConnector(description,className);
-    Logging.root.info("Successfully registered connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: RegisterMapper <classname> <description>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    String description = args[1];
-
-    try
-    {
-      RegisterMapper registerMapper = new RegisterMapper(className,description);
-      registerMapper.execute();
-      System.err.println("Successfully registered connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/SynchronizeAuthorities.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/SynchronizeAuthorities.java
deleted file mode 100644
index b2b2cd3..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/SynchronizeAuthorities.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/* $Id: SynchronizeAuthorities.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class SynchronizeAuthorities extends BaseAuthoritiesInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: SynchronizeAuthorities.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public SynchronizeAuthorities()
-  {
-  }
-
-
-  protected void doExecute(IAuthorityConnectorManager mgr) throws ManifoldCFException
-  {
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String classname = (String)row.getValue("classname");
-      try
-      {
-        AuthorityConnectorFactory.getConnectorNoCheck(classname);
-      }
-      catch (ManifoldCFException e)
-      {
-        mgr.removeConnector(classname);
-      }
-    }
-    Logging.root.info("Successfully synchronized all authorities");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: SynchronizeAuthorities");
-      System.exit(1);
-    }
-
-
-    try
-    {
-      SynchronizeAuthorities synchronizeAuthorities = new SynchronizeAuthorities();
-      synchronizeAuthorities.execute();
-      System.err.println("Successfully synchronized all authorities");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/SynchronizeMappers.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/SynchronizeMappers.java
deleted file mode 100644
index 6ffa2a4..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/SynchronizeMappers.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class SynchronizeMappers extends BaseMappersInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  public SynchronizeMappers()
-  {
-  }
-
-
-  protected void doExecute(IMappingConnectorManager mgr) throws ManifoldCFException
-  {
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String classname = (String)row.getValue("classname");
-      try
-      {
-        MappingConnectorFactory.getConnectorNoCheck(classname);
-      }
-      catch (ManifoldCFException e)
-      {
-        mgr.removeConnector(classname);
-      }
-    }
-    Logging.root.info("Successfully synchronized all mappers");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: SynchronizeMappers");
-      System.exit(1);
-    }
-
-
-    try
-    {
-      SynchronizeMappers synchronizeMappers = new SynchronizeMappers();
-      synchronizeMappers.execute();
-      System.err.println("Successfully synchronized all mappers");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAllAuthorities.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAllAuthorities.java
deleted file mode 100644
index 579e611..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAllAuthorities.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id: UnRegisterAllAuthorities.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class UnRegisterAllAuthorities extends BaseAuthoritiesInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegisterAllAuthorities.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private UnRegisterAllAuthorities()
-  {
-  }
-
-  protected void doExecute(IAuthorityConnectorManager mgr) throws ManifoldCFException
-  {
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      mgr.unregisterConnector((String)row.getValue("classname"));
-    }
-    Logging.root.info("Successfully unregistered all connectors");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: UnRegisterAllAuthorities");
-      System.exit(1);
-    }
-
-
-    try
-    {
-      UnRegisterAllAuthorities unRegisterAllAuthorities = new UnRegisterAllAuthorities();
-      unRegisterAllAuthorities.execute();
-      System.err.println("Successfully unregistered all connectors");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAllMappers.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAllMappers.java
deleted file mode 100644
index cef4ccd..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAllMappers.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class UnRegisterAllMappers extends BaseMappersInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private UnRegisterAllMappers()
-  {
-  }
-
-  protected void doExecute(IMappingConnectorManager mgr) throws ManifoldCFException
-  {
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      mgr.unregisterConnector((String)row.getValue("classname"));
-    }
-    Logging.root.info("Successfully unregistered all connectors");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: UnRegisterAllMappers");
-      System.exit(1);
-    }
-
-
-    try
-    {
-      UnRegisterAllMappers unRegisterAllMappers = new UnRegisterAllMappers();
-      unRegisterAllMappers.execute();
-      System.err.println("Successfully unregistered all connectors");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAuthority.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAuthority.java
deleted file mode 100644
index 623c00a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterAuthority.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: UnRegisterAuthority.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class UnRegisterAuthority extends BaseAuthoritiesInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegisterAuthority.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-
-  public UnRegisterAuthority(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IAuthorityConnectorManager mgr) throws ManifoldCFException
-  {
-    mgr.unregisterConnector(className);
-    Logging.root.info("Successfully unregistered connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegisterAuthority <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-
-    try
-    {
-      UnRegisterAuthority unRegisterAuthority = new UnRegisterAuthority(className);
-      unRegisterAuthority.execute();
-      System.err.println("Successfully unregistered connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterDomain.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterDomain.java
deleted file mode 100644
index 0289668..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterDomain.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class UnRegisterDomain extends BaseDomainsInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final String domainName;
-
-  public UnRegisterDomain(String domainName)
-  {
-    this.domainName = domainName;
-  }
-
-  protected void doExecute(IAuthorizationDomainManager mgr) throws ManifoldCFException
-  {
-    mgr.unregisterDomain(domainName);
-    Logging.root.info("Successfully unregistered domain '"+domainName+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegisterDomain <domainname>");
-      System.exit(1);
-    }
-
-    String domainName = args[0];
-
-    try
-    {
-      UnRegisterDomain unRegisterDomain = new UnRegisterDomain(domainName);
-      unRegisterDomain.execute();
-      System.err.println("Successfully unregistered domain '"+domainName+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterMapper.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterMapper.java
deleted file mode 100644
index 1c7d9f8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/UnRegisterMapper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.*;
-
-public class UnRegisterMapper extends BaseMappersInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  private final String className;
-
-  public UnRegisterMapper(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IMappingConnectorManager mgr) throws ManifoldCFException
-  {
-    mgr.unregisterConnector(className);
-    Logging.root.info("Successfully unregistered connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegisterMapper <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-
-    try
-    {
-      UnRegisterMapper unRegisterMapper = new UnRegisterMapper(className);
-      unRegisterMapper.execute();
-      System.err.println("Successfully unregistered connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authconnmgr/AuthorityConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authconnmgr/AuthorityConnectorManager.java
deleted file mode 100644
index d5f185d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authconnmgr/AuthorityConnectorManager.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/* $Id: AuthorityConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authconnmgr;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.interfaces.CacheKeyFactory;
-
-/** This is the implementation of that authority connector manager.
- * 
- * <br><br>
- * <b>authconnectors</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class AuthorityConnectorManager extends org.apache.manifoldcf.core.database.BaseTable implements IAuthorityConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id: AuthorityConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public AuthorityConnectorManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"authconnectors");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always use a loop, in case there's upgrade retries needed.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Schema upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    // First, go through all registered connectors.  This is all inside a transaction.
-    beginTransaction();
-    try
-    {
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        // Call the deinstall method
-        AuthorityConnectorFactory.deinstall(threadContext,className);
-      }
-      performDrop(invKeys);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      //performLock();
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(classNameField,className);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+classNameField+"=?",params,invKeys);
-      }
-
-      // Either way, we must do the install/upgrade itself.
-      AuthorityConnectorFactory.install(threadContext,className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the class name of the connector to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // Uninstall first
-      AuthorityConnectorFactory.deinstall(threadContext,className);
-
-      removeConnector(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove a connector.
-  * Call this when the connector cannot be instantiated.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+classNameField+" AS classname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    return row.getValue(descriptionField).toString();
-  }
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException
-  {
-    // Use the global table key; that's good enough because we don't expect stuff to change out from under very often.
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT * FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authdomains/AuthorizationDomainManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authdomains/AuthorizationDomainManager.java
deleted file mode 100644
index c6a9c24..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authdomains/AuthorizationDomainManager.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authdomains;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.interfaces.CacheKeyFactory;
-
-/** This is the implementation of that authority connector manager.
- * 
- * <br><br>
- * <b>authdomains</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>domainname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class AuthorizationDomainManager extends org.apache.manifoldcf.core.database.BaseTable implements IAuthorizationDomainManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String domainNameField = "domainname";
-
-  // Thread context
-  protected final IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public AuthorizationDomainManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"authdomains");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always use a loop, in case there's upgrade retries needed.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(domainNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Schema upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    performDrop(invKeys);
-  }
-
-  /** Register a new domain.
-  *@param description is the description to use in the UI.
-  *@param domainName is the internal domain name used by the authority service.
-  */
-  @Override
-  public void registerDomain(String description, String domainName)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(domainName);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+domainNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(domainNameField,domainName);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+domainNameField+"=?",params,invKeys);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a domain.
-  * This may fail if any authority connections refer to the domain.
-  *@param domainName is the internal domain name to unregister.
-  */
-  @Override
-  public void unregisterDomain(String domainName)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(domainName);
-    performDelete("WHERE "+domainNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of domains.
-  *@return a resultset with the columns "description" and "domainname".
-  * These will be ordered by description.
-  */
-  @Override
-  public IResultSet getDomains()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+domainNameField+" AS domainname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a domain name.
-  *@param domainName is the domain name.
-  *@return the description, or null if the domain is not registered.
-  */
-  @Override
-  public String getDescription(String domainName)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(domainName);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+domainNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    String x = (String)row.getValue(descriptionField);
-    if (x == null)
-      return "";
-    return x;
-  }
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authgroups/AuthorityGroup.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authgroups/AuthorityGroup.java
deleted file mode 100644
index 9caf739..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authgroups/AuthorityGroup.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authgroups;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-/** This is the implementation of the authority group interface, which describes a paper object
-* to be manipulated in order to create, edit, or save an authority group definition.
-*/
-public class AuthorityGroup implements IAuthorityGroup
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-
-  /** Constructor.
-  */
-  public AuthorityGroup()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public AuthorityGroup duplicate()
-  {
-    AuthorityGroup rval = new AuthorityGroup();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authgroups/AuthorityGroupManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authgroups/AuthorityGroupManager.java
deleted file mode 100644
index d4f7b5e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authgroups/AuthorityGroupManager.java
+++ /dev/null
@@ -1,666 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authgroups;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.interfaces.IRepositoryConnectionManager;
-import org.apache.manifoldcf.crawler.interfaces.RepositoryConnectionManagerFactory;
-
-/** Implementation of the authority group manager functionality.
- * 
- * <br><br>
- * <b>authgroups</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>groupname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class AuthorityGroupManager extends org.apache.manifoldcf.core.database.BaseTable implements IAuthorityGroupManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final static String nameField = "groupname";
-  protected final static String descriptionField = "description";
-
-  // Cache manager
-  ICacheManager cacheManager;
-  // Thread context
-  IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public AuthorityGroupManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"authgroups");
-
-    cacheManager = CacheManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always do a loop, in case upgrade needs it.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the "objects" table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade, when needed
-      }
-
-      // Index management goes here
-
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Export configuration */
-  @Override
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,1);
-    // Get the authority list
-    IAuthorityGroup[] list = getAllGroups();
-    // Write the number of groups
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual group info
-    int i = 0;
-    while (i < list.length)
-    {
-      IAuthorityGroup conn = list[i++];
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-    }
-  }
-
-  /** Import configuration */
-  @Override
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version < 1 || version > 1)
-      throw new java.io.IOException("Unknown authority group configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    int i = 0;
-    while (i < count)
-    {
-      IAuthorityGroup conn = create();
-      conn.setName(ManifoldCF.readString(is));
-      conn.setDescription(ManifoldCF.readString(is));
-      // Attempt to save this connection
-      save(conn);
-      i++;
-    }
-  }
-
-  /** Obtain a list of the authority grouops, ordered by name.
-  *@return an array of connection objects.
-  */
-  @Override
-  public IAuthorityGroup[] getAllGroups()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getAuthorityGroupsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      int i = 0;
-      while (i < names.length)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-        i++;
-      }
-      return loadMultiple(names);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Load an authority group by name.
-  *@param name is the name of the authority group.
-  *@return the loaded group object, or null if not found.
-  */
-  @Override
-  public IAuthorityGroup load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  /** Load multiple authority groups by name.
-  *@param names are the names to load.
-  *@return the loaded group objects.
-  */
-  @Override
-  public IAuthorityGroup[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    AuthorityGroupDescription[] objectDescriptions = new AuthorityGroupDescription[names.length];
-    int i = 0;
-    StringSetBuffer ssb = new StringSetBuffer();
-    while (i < names.length)
-    {
-      ssb.clear();
-      ssb.add(getAuthorityGroupKey(names[i]));
-      objectDescriptions[i] = new AuthorityGroupDescription(names[i],new StringSet(ssb));
-      i++;
-    }
-
-    AuthorityGroupExecutor exec = new AuthorityGroupExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    return exec.getResults();
-  }
-
-  /** Create a new authority group object.
-  *@return the new object.
-  */
-  @Override
-  public IAuthorityGroup create()
-    throws ManifoldCFException
-  {
-    AuthorityGroup rval = new AuthorityGroup();
-    return rval;
-  }
-
-  /** Save an authority group object.
-  *@param object is the object to save.
-  *@return true if the object is created, false otherwise.
-  */
-  @Override
-  public boolean save(IAuthorityGroup object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getAuthorityGroupsKey());
-    ssb.add(getAuthorityGroupKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      long sleepAmt = 0L;
-      try
-      {
-        ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-        try
-        {
-          beginTransaction();
-          try
-          {
-            //performLock();
-            ManifoldCF.noteConfigurationChange();
-            boolean isNew = object.getIsNew();
-            // See whether the instance exists
-            ArrayList params = new ArrayList();
-            String query = buildConjunctionClause(params,new ClauseDescription[]{
-              new UnitaryClause(nameField,object.getName())});
-            IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-              query+" FOR UPDATE",params,null,null);
-            HashMap values = new HashMap();
-            values.put(descriptionField,object.getDescription());
-
-            boolean isCreated;
-            
-            if (set.getRowCount() > 0)
-            {
-              // If the object is supposedly new, it is bad that we found one that already exists.
-              if (isNew)
-                throw new ManifoldCFException("Authority group '"+object.getName()+"' already exists");
-              isCreated = false;
-              // Update
-              params.clear();
-              query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              performUpdate(values," WHERE "+query,params,null);
-            }
-            else
-            {
-              // If the object is not supposed to be new, it is bad that we did not find one.
-              if (!isNew)
-                throw new ManifoldCFException("Authority group '"+object.getName()+"' no longer exists");
-              isCreated = true;
-              // Insert
-              values.put(nameField,object.getName());
-              // We only need the general key because this is new.
-              performInsert(values,null);
-            }
-
-            cacheManager.invalidateKeys(ch);
-            return isCreated;
-          }
-          catch (ManifoldCFException e)
-          {
-            signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            signalRollback();
-            throw e;
-          }
-          finally
-          {
-            endTransaction();
-          }
-        }
-        finally
-        {
-          cacheManager.leaveCache(ch);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete an authority group.
-  *@param name is the name of the group to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  @Override
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-    // Grab repository connection manager handle, to check on legality of deletion.
-    IRepositoryConnectionManager repoManager = RepositoryConnectionManagerFactory.make(threadContext);
-    IAuthorityConnectionManager authManager = AuthorityConnectionManagerFactory.make(threadContext);
-    
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getAuthorityGroupsKey());
-    ssb.add(getAuthorityGroupKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-    ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-    try
-    {
-      beginTransaction();
-      try
-      {
-        // Check if anything refers to this group name
-        if (repoManager.isGroupReferenced(name))
-          throw new ManifoldCFException("Can't delete authority group '"+name+"': existing repository connections refer to it");
-        if (authManager.isGroupReferenced(name))
-          throw new ManifoldCFException("Can't delete authority group '"+name+"': existing authority connections refer to it");
-        ManifoldCF.noteConfigurationChange();
-        ArrayList params = new ArrayList();
-        String query = buildConjunctionClause(params,new ClauseDescription[]{
-          new UnitaryClause(nameField,name)});
-        performDelete("WHERE "+query,params,null);
-        cacheManager.invalidateKeys(ch);
-      }
-      catch (ManifoldCFException e)
-      {
-        signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        signalRollback();
-        throw e;
-      }
-      finally
-      {
-        endTransaction();
-      }
-    }
-    finally
-    {
-      cacheManager.leaveCache(ch);
-    }
-
-  }
-
-  /** Get the authority group name column.
-  *@return the name column.
-  */
-  @Override
-  public String getGroupNameColumn()
-  {
-    return nameField;
-  }
-
-  /** Get the authority connection description column.
-  *@return the description column.
-  */
-  @Override
-  public String getGroupDescriptionColumn()
-  {
-    return descriptionField;
-  }
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // repository connections.
-
-  /** Construct a key which represents the general list of repository connectors.
-  *@return the cache key.
-  */
-  protected static String getAuthorityGroupsKey()
-  {
-    return CacheKeyFactory.makeAuthorityGroupsKey();
-  }
-
-  /** Construct a key which represents an individual authority group.
-  *@param groupName is the name of the group.
-  *@return the cache key.
-  */
-  protected static String getAuthorityGroupKey(String groupName)
-  {
-    return CacheKeyFactory.makeAuthorityGroupKey(groupName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple authority groups at a single time.
-  *@param groupNames are a list of group names.
-  *@return the corresponding authority group objects.
-  */
-  protected AuthorityGroup[] getAuthorityGroupsMultiple(String[] groupNames)
-    throws ManifoldCFException
-  {
-    AuthorityGroup[] rval = new AuthorityGroup[groupNames.length];
-    HashMap returnIndex = new HashMap();
-    int i = 0;
-    while (i < groupNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(groupNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetAuthorityGroupsChunk();
-      while (i < groupNames.length)
-      {
-        if (j == maxIn)
-        {
-          getAuthorityGroupsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(groupNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getAuthorityGroupsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Find the maximum number of clauses for getAuthorityConnectionsChunk.
-  */
-  protected int maxClauseGetAuthorityGroupsChunk()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Read a chunk of authority groups.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getAuthorityGroupsChunk(AuthorityGroup[] rval, Map returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = ((Integer)returnIndex.get(name)).intValue();
-      AuthorityGroup rc = new AuthorityGroup();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rval[index] = rc;
-    }
-  }
-
-  // The cached instance will be a AuthorityGroup.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for an authority group object.
-  */
-  protected static class AuthorityGroupDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String groupName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public AuthorityGroupDescription(String groupName, StringSet invKeys)
-    {
-      super("authoritygroupcache");
-      this.groupName = groupName;
-      criticalSectionName = getClass().getName()+"-"+groupName;
-      cacheKeys = invKeys;
-    }
-
-    public String getGroupName()
-    {
-      return groupName;
-    }
-
-    public int hashCode()
-    {
-      return groupName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorityGroupDescription))
-        return false;
-      AuthorityGroupDescription d = (AuthorityGroupDescription)o;
-      return d.groupName.equals(groupName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating authority group objects.
-  */
-  protected static class AuthorityGroupExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected AuthorityGroupManager thisManager;
-    protected AuthorityGroup[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the AuthorityGroupManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public AuthorityGroupExecutor(AuthorityGroupManager manager, AuthorityGroupDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new AuthorityGroup[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getGroupName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public AuthorityGroup[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the AuthorityGroup requests
-      String[] groupNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < groupNames.length)
-      {
-        AuthorityGroupDescription desc = (AuthorityGroupDescription)objectDescriptions[i];
-        groupNames[i] = desc.getGroupName();
-        i++;
-      }
-
-      return thisManager.getAuthorityGroupsMultiple(groupNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      AuthorityGroupDescription objectDesc = (AuthorityGroupDescription)objectDescription;
-      AuthorityGroup ci = (AuthorityGroup)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getGroupName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authorities/BaseAuthorityConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authorities/BaseAuthorityConnector.java
deleted file mode 100644
index 304c919..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authorities/BaseAuthorityConnector.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* $Id: BaseAuthorityConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorities;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An authority connector supplies an ACL of some kind for a given user.  This is necessary so that the search UI
-* can find the documents that can be legally seen.
-*
-* An instance of this interface provides this functionality.  Authority connector instances are pooled, so that session
-* setup does not need to be done repeatedly.  The pool is segregated by specific sets of configuration parameters.
-*/
-public abstract class BaseAuthorityConnector extends org.apache.manifoldcf.core.connector.BaseConnector implements IAuthorityConnector
-{
-  public static final String _rcsid = "@(#)$Id: BaseAuthorityConnector.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // For repositories that have the ability to deny access based on a user's access tokens
-  protected static final AuthorizationResponse RESPONSE_UNREACHABLE = new AuthorizationResponse(new String[]{GLOBAL_DENY_TOKEN},
-    AuthorizationResponse.RESPONSE_UNREACHABLE);
-  protected static final AuthorizationResponse RESPONSE_USERNOTFOUND = new AuthorizationResponse(new String[]{GLOBAL_DENY_TOKEN},
-    AuthorizationResponse.RESPONSE_USERNOTFOUND);
-  protected static final AuthorizationResponse RESPONSE_USERUNAUTHORIZED = new AuthorizationResponse(new String[]{GLOBAL_DENY_TOKEN},
-    AuthorizationResponse.RESPONSE_USERUNAUTHORIZED);
-
-  // For repositories that DO NOT have the ability to deny access based on a user's access tokens
-  protected static final AuthorizationResponse RESPONSE_UNREACHABLE_ADDITIVE = new AuthorizationResponse(new String[0],
-    AuthorizationResponse.RESPONSE_UNREACHABLE);
-  protected static final AuthorizationResponse RESPONSE_USERNOTFOUND_ADDITIVE = new AuthorizationResponse(new String[0],
-    AuthorizationResponse.RESPONSE_USERNOTFOUND);
-  protected static final AuthorizationResponse RESPONSE_USERUNAUTHORIZED_ADDITIVE = new AuthorizationResponse(new String[0],
-    AuthorizationResponse.RESPONSE_USERUNAUTHORIZED);
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  @Override
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException
-  {
-    // Implementation for old-style behavior.  Override this method for new-style behavior.
-    try
-    {
-      String[] accessTokens = getAccessTokens(userName);
-      if (accessTokens == null)
-        return new AuthorizationResponse(new String[0],AuthorizationResponse.RESPONSE_USERNOTFOUND);
-      return new AuthorizationResponse(accessTokens,AuthorizationResponse.RESPONSE_OK);
-    }
-    catch (ManifoldCFException e)
-    {
-      // There's an authorization failure of some kind.
-      String[] defaultAccessTokens = getDefaultAccessTokens(userName);
-      if (defaultAccessTokens == null)
-      {
-        // Treat it as an authorization failure
-        return new AuthorizationResponse(new String[0],AuthorizationResponse.RESPONSE_USERUNAUTHORIZED);
-      }
-      return new AuthorizationResponse(defaultAccessTokens,AuthorizationResponse.RESPONSE_UNREACHABLE);
-    }
-  }
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  @Override
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName)
-  {
-    String[] acls = getDefaultAccessTokens(userName);
-    if (acls == null)
-      return new AuthorizationResponse(new String[0],AuthorizationResponse.RESPONSE_USERUNAUTHORIZED);
-    else
-      return new AuthorizationResponse(acls,AuthorizationResponse.RESPONSE_UNREACHABLE);
-  }
-
-  /** Obtain the access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the tokens (according to the current authority), or null if the user does not exist.
-  * (Throw an exception if access is denied, usually because the authority is down).
-  */
-  public String[] getAccessTokens(String userName)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-
-  /** Return the default access tokens in the case where the getAccessTokens() method could not
-  * connect with the server.
-  *@param userName is the username that the access tokens are for.  Typically this is not used.
-  *@return the default tokens, or null if there are no default takens, and the error should be
-  * treated as a hard one.
-  */
-  public String[] getDefaultAccessTokens(String userName)
-  {
-    return null;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authority/AuthorityConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authority/AuthorityConnection.java
deleted file mode 100644
index b154afe..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authority/AuthorityConnection.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/* $Id: AuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authority;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-/** This is the implementation of the authority connection interface, which describes a paper object
-* to be manipulated in order to create, edit, or save an authority definition.
-*/
-public class AuthorityConnection implements IAuthorityConnection
-{
-  public static final String _rcsid = "@(#)$Id: AuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-  protected String className = null;
-  protected ConfigParams configParams = new ConfigParams();
-  protected int maxCount = 100;
-  protected String prerequisiteMapping = null;
-  protected String authDomain = null;
-  protected String authGroup = null;
-
-  /** Constructor.
-  */
-  public AuthorityConnection()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public AuthorityConnection duplicate()
-  {
-    AuthorityConnection rval = new AuthorityConnection();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    rval.className = className;
-    rval.maxCount = maxCount;
-    rval.configParams = configParams.duplicate();
-    rval.prerequisiteMapping = prerequisiteMapping;
-    rval.authDomain = authDomain;
-    rval.authGroup = authGroup;
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className)
-  {
-    this.className = className;
-  }
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName()
-  {
-    return className;
-  }
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams()
-  {
-    return configParams;
-  }
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount)
-  {
-    this.maxCount = maxCount;
-  }
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections()
-  {
-    return maxCount;
-  }
-
-  /** Set the prerequisite mapper, if any.
-  *@param mapping is the name of the mapping connection to use to get the input user name,
-  *  or null.
-  */
-  public void setPrerequisiteMapping(String mapping)
-  {
-    prerequisiteMapping = mapping;
-  }
-  
-  /** Get the prerequisite mapper, if any.
-  *@return the mapping connection name whose output should be used as the input user name.
-  */
-  public String getPrerequisiteMapping()
-  {
-    return prerequisiteMapping;
-  }
-
-  /** Set the authorization domain.
-  *@param domain is the authorization domain.
-  */
-  public void setAuthDomain(String domain)
-  {
-    authDomain = domain;
-  }
-  
-  /** Get the authorization domain.
-  *@return the authorization domain.
-  */
-  public String getAuthDomain()
-  {
-    return authDomain;
-  }
-
-  /** Set authorization group.
-  *@param groupName is the name of the group.
-  */
-  public void setAuthGroup(String groupName)
-  {
-    authGroup = groupName;
-  }
-  
-  /** Get the authorization group.
-  *@return the group.
-  */
-  public String getAuthGroup()
-  {
-    return authGroup;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authority/AuthorityConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authority/AuthorityConnectionManager.java
deleted file mode 100644
index 025c1bc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authority/AuthorityConnectionManager.java
+++ /dev/null
@@ -1,830 +0,0 @@
-/* $Id: AuthorityConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authority;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-import org.apache.manifoldcf.crawler.interfaces.IRepositoryConnectionManager;
-import org.apache.manifoldcf.crawler.interfaces.RepositoryConnectionManagerFactory;
-
-/** Implementation of the authority connection manager functionality.
- * 
- * <br><br>
- * <b>authconnections</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>authorityname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>maxcount</td><td>BIGINT</td><td></td></tr>
- * <tr><td>configxml</td><td>LONGTEXT</td><td></td></tr>
- * <tr><td>mappingname</td><td>VARCHAR(32)</td><td></td></tr>
- * <tr><td>authdomainname</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>groupname</td><td>VARCHAR(32)</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class AuthorityConnectionManager extends org.apache.manifoldcf.core.database.BaseTable implements IAuthorityConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id: AuthorityConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Special field suffix
-  private final static String passwordSuffix = "password";
-
-  protected final static String nameField = "authorityname";      // Changed this to work around a bug in postgresql
-  protected final static String descriptionField = "description";
-  protected final static String classNameField = "classname";
-  protected final static String maxCountField = "maxcount";
-  protected final static String configField = "configxml";
-  protected final static String mappingField = "mappingname";
-  protected final static String authDomainField = "authdomainname";
-  protected final static String groupNameField = "groupname";
-  
-  // Cache manager
-  protected final ICacheManager cacheManager;
-  // Thread context
-  protected final IThreadContext threadContext;
-  // Lock manager
-  protected final ILockManager lockManager;
-  
-  protected final static String authoritiesLock = "AUTHORITIES_LOCK";
-  
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public AuthorityConnectionManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"authconnections");
-
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    // First, get the authority manager table name and name column
-    IAuthorityGroupManager authMgr = AuthorityGroupManagerFactory.make(threadContext);
-
-    // Always do a loop, in case upgrade needs it.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the "objects" table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(maxCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(configField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(mappingField,new ColumnDescription("VARCHAR(32)",false,true,null,null,false));
-        map.put(authDomainField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(groupNameField,new ColumnDescription("VARCHAR(32)",false,false,
-          authMgr.getTableName(),authMgr.getGroupNameColumn(),false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade goes here if any
-      }
-
-      // Index management goes here
-      IndexDescription authDomainIndex = new IndexDescription(false,new String[]{authDomainField});
-      IndexDescription authorityIndex = new IndexDescription(false,new String[]{groupNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (authDomainIndex != null && id.equals(authDomainIndex))
-          authDomainIndex = null;
-        if (authorityIndex != null && id.equals(authorityIndex))
-          authorityIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (authDomainIndex != null)
-        performAddIndex(null,authDomainIndex);
-      if (authorityIndex != null)
-        performAddIndex(null,authorityIndex);
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Export configuration */
-  @Override
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,3);
-    // Get the authority list
-    IAuthorityConnection[] list = getAllConnections();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual authority info
-    int i = 0;
-    while (i < list.length)
-    {
-      IAuthorityConnection conn = list[i++];
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-      ManifoldCF.writeString(os,conn.getClassName());
-      ManifoldCF.writeString(os,conn.getConfigParams().toXML());
-      ManifoldCF.writeDword(os,conn.getMaxConnections());
-      ManifoldCF.writeString(os,conn.getPrerequisiteMapping());
-      ManifoldCF.writeString(os,conn.getAuthDomain());
-      ManifoldCF.writeString(os,conn.getAuthGroup());
-    }
-  }
-
-  /** Import configuration */
-  @Override
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    IAuthorityGroupManager authMgr = AuthorityGroupManagerFactory.make(threadContext);
-    int version = ManifoldCF.readDword(is);
-    if (version < 3 || version > 3)
-      throw new java.io.IOException("Unknown authority configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    int i = 0;
-    while (i < count)
-    {
-      IAuthorityConnection conn = create();
-      String name = ManifoldCF.readString(is);
-      String description = ManifoldCF.readString(is);
-      conn.setName(name);
-      conn.setDescription(description);
-      conn.setClassName(ManifoldCF.readString(is));
-      conn.getConfigParams().fromXML(ManifoldCF.readString(is));
-      conn.setMaxConnections(ManifoldCF.readDword(is));
-      conn.setPrerequisiteMapping(ManifoldCF.readString(is));
-      conn.setAuthDomain(ManifoldCF.readString(is));
-      conn.setAuthGroup(ManifoldCF.readString(is));
-      
-      // Attempt to save this connection
-      save(conn);
-      i++;
-    }
-  }
-
-  /** Return true if the specified authority group name is referenced.
-  *@param groupName is the authority group name.
-  *@return true if referenced, false otherwise.
-  */
-  @Override
-  public boolean isGroupReferenced(String groupName)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getAuthorityConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(groupNameField,groupName)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-  /** Obtain a list of the authority connections which correspond to an auth domain.
-  *@param authDomain is the domain to get connections for.
-  *@return an array of connection objects.
-  */
-  @Override
-  public IAuthorityConnection[] getDomainConnections(String authDomain)
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(authoritiesLock);
-    try
-    {
-      // Read the connections for the domain
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getAuthorityConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      StringBuilder sb = new StringBuilder("SELECT ");
-      ArrayList list = new ArrayList();
-      sb.append(nameField).append(" FROM ").append(getTableName()).append(" WHERE ");
-      sb.append(buildConjunctionClause(list,new ClauseDescription[]{new UnitaryClause(authDomainField,authDomain)}));
-      IResultSet set = performQuery(sb.toString(),list,localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(authoritiesLock);
-    }
-  }
-  
-  /** Obtain a list of the authority connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  @Override
-  public IAuthorityConnection[] getAllConnections()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(authoritiesLock);
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getAuthorityConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(authoritiesLock);
-    }
-  }
-
-  /** Load a repository connection by name.
-  *@param name is the name of the repository connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  @Override
-  public IAuthorityConnection load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  protected final static int FETCH_MAX = 200;
-
-  /** Load multiple repository connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  @Override
-  public IAuthorityConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    IAuthorityConnection[] rval = new IAuthorityConnection[names.length];
-    if (names.length == 0)
-      return rval;
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (names.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,names,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,names,inputIndex,names.length-inputIndex);
-    return rval;
-  }
-  
-  protected int loadMultipleInternal(IAuthorityConnection[] rval, int outputIndex, String[] fetchNames, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    AuthorityConnectionDescription[] objectDescriptions = new AuthorityConnectionDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      ssb.clear();
-      String name = fetchNames[inputIndex + i];
-      ssb.add(getAuthorityConnectionKey(name));
-      objectDescriptions[i] = new AuthorityConnectionDescription(name,new StringSet(ssb));
-    }
-
-    AuthorityConnectionExecutor exec = new AuthorityConnectionExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    IAuthorityConnection[] results = exec.getResults();
-    for (IAuthorityConnection result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Create a new repository connection object.
-  *@return the new object.
-  */
-  @Override
-  public IAuthorityConnection create()
-    throws ManifoldCFException
-  {
-    AuthorityConnection rval = new AuthorityConnection();
-    return rval;
-  }
-
-  /** Save a repository connection object.
-  *@param object is the object to save.
-  *@return true if the object is created, false otherwise.
-  */
-  @Override
-  public boolean save(IAuthorityConnection object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getAuthorityConnectionsKey());
-    ssb.add(getAuthorityConnectionKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(authoritiesLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              ManifoldCF.noteConfigurationChange();
-              boolean isNew = object.getIsNew();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,object.getDescription());
-              values.put(classNameField,object.getClassName());
-              values.put(maxCountField,new Long((long)object.getMaxConnections()));
-              values.put(configField,object.getConfigParams().toXML());
-              values.put(mappingField,object.getPrerequisiteMapping());
-              values.put(authDomainField,object.getAuthDomain());
-              values.put(groupNameField,object.getAuthGroup());
-
-              boolean isCreated;
-              
-              if (set.getRowCount() > 0)
-              {
-                // If the object is supposedly new, it is bad that we found one that already exists.
-                if (isNew)
-                  throw new ManifoldCFException("Authority connection '"+object.getName()+"' already exists");
-                isCreated = false;
-                // Update
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(nameField,object.getName())});
-                performUpdate(values," WHERE "+query,params,null);
-              }
-              else
-              {
-                // If the object is not supposed to be new, it is bad that we did not find one.
-                if (!isNew)
-                  throw new ManifoldCFException("Authority connection '"+object.getName()+"' no longer exists");
-                isCreated = true;
-                // Insert
-                values.put(nameField,object.getName());
-                // We only need the general key because this is new.
-                performInsert(values,null);
-              }
-
-              cacheManager.invalidateKeys(ch);
-              return isCreated;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(authoritiesLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete an authority connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  @Override
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getAuthorityConnectionsKey());
-    ssb.add(getAuthorityConnectionKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-    lockManager.enterNonExWriteLock(authoritiesLock);
-    try
-    {
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-        beginTransaction();
-        try
-        {
-          ManifoldCF.noteConfigurationChange();
-          ArrayList params = new ArrayList();
-          String query = buildConjunctionClause(params,new ClauseDescription[]{
-            new UnitaryClause(nameField,name)});
-          performDelete("WHERE "+query,params,null);
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(authoritiesLock);
-    }
-  }
-
-  /** Get the authority connection name column.
-  *@return the name column.
-  */
-  @Override
-  public String getAuthorityNameColumn()
-  {
-    return nameField;
-  }
-
-  /** Return true if the specified mapping name is referenced.
-  *@param mappingName is the mapping name.
-  *@return true if referenced, false otherwise.
-  */
-  @Override
-  public boolean isMappingReferenced(String mappingName)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getAuthorityConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(mappingField,mappingName)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // repository connections.
-
-  /** Construct a key which represents the general list of repository connectors.
-  *@return the cache key.
-  */
-  protected static String getAuthorityConnectionsKey()
-  {
-    return CacheKeyFactory.makeAuthorityConnectionsKey();
-  }
-
-  /** Construct a key which represents an individual repository connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getAuthorityConnectionKey(String connectionName)
-  {
-    return CacheKeyFactory.makeAuthorityConnectionKey(connectionName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple repository connections at a single time.
-  *@param connectionNames are a list of connection names.
-  *@return the corresponding repository connection objects.
-  */
-  protected AuthorityConnection[] getAuthorityConnectionsMultiple(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    AuthorityConnection[] rval = new AuthorityConnection[connectionNames.length];
-    HashMap returnIndex = new HashMap();
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(connectionNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetAuthorityConnectionsChunk();
-      while (i < connectionNames.length)
-      {
-        if (j == maxIn)
-        {
-          getAuthorityConnectionsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(connectionNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getAuthorityConnectionsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Find the maximum number of clauses for getAuthorityConnectionsChunk.
-  */
-  protected int maxClauseGetAuthorityConnectionsChunk()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Read a chunk of authority connections.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getAuthorityConnectionsChunk(AuthorityConnection[] rval, Map returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = ((Integer)returnIndex.get(name)).intValue();
-      AuthorityConnection rc = new AuthorityConnection();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rc.setClassName((String)row.getValue(classNameField));
-      rc.setMaxConnections((int)((Long)row.getValue(maxCountField)).longValue());
-      rc.setPrerequisiteMapping((String)row.getValue(mappingField));
-      rc.setAuthDomain((String)row.getValue(authDomainField));
-      rc.setAuthGroup((String)row.getValue(groupNameField));
-      String xml = (String)row.getValue(configField);
-      if (xml != null && xml.length() > 0)
-        rc.getConfigParams().fromXML(xml);
-      rval[index] = rc;
-    }
-  }
-
-  // The cached instance will be a AuthorityConnection.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for a repository connection object.
-  */
-  protected static class AuthorityConnectionDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String connectionName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public AuthorityConnectionDescription(String connectionName, StringSet invKeys)
-    {
-      super("authorityconnectioncache");
-      this.connectionName = connectionName;
-      criticalSectionName = getClass().getName()+"-"+connectionName;
-      cacheKeys = invKeys;
-    }
-
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-
-    public int hashCode()
-    {
-      return connectionName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof AuthorityConnectionDescription))
-        return false;
-      AuthorityConnectionDescription d = (AuthorityConnectionDescription)o;
-      return d.connectionName.equals(connectionName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating repository connection objects.
-  */
-  protected static class AuthorityConnectionExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected AuthorityConnectionManager thisManager;
-    protected AuthorityConnection[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the ToolManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public AuthorityConnectionExecutor(AuthorityConnectionManager manager, AuthorityConnectionDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new AuthorityConnection[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getConnectionName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public AuthorityConnection[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      String[] connectionNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < connectionNames.length)
-      {
-        AuthorityConnectionDescription desc = (AuthorityConnectionDescription)objectDescriptions[i];
-        connectionNames[i] = desc.getConnectionName();
-        i++;
-      }
-
-      return thisManager.getAuthorityConnectionsMultiple(connectionNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      AuthorityConnectionDescription objectDesc = (AuthorityConnectionDescription)objectDescription;
-      AuthorityConnection ci = (AuthorityConnection)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getConnectionName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authorityconnectorpool/AuthorityConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authorityconnectorpool/AuthorityConnectorPool.java
deleted file mode 100644
index f382b3f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/authorityconnectorpool/AuthorityConnectorPool.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.authorityconnectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An implementation of IAuthorityConnectorPool.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public class AuthorityConnectorPool implements IAuthorityConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Local connector pool */
-  protected final static LocalPool localPool = new LocalPool();
-
-  // This implementation is a place-holder for the real one, which will likely fold in the pooling code
-  // as we strip it out of AuthorityConnectorFactory.
-
-  /** Thread context */
-  protected final IThreadContext threadContext;
-  
-  /** Constructor */
-  public AuthorityConnectorPool(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get multiple authority connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param authorityConnections are the connections to use the build the connector instances.
-  */
-  @Override
-  public IAuthorityConnector[] grabMultiple(String[] orderingKeys, IAuthorityConnection[] authorityConnections)
-    throws ManifoldCFException
-  {
-    // For now, use the AuthorityConnectorFactory method.  This will require us to extract info
-    // from each authority connection, however.
-    String[] connectionNames = new String[authorityConnections.length];
-    String[] classNames = new String[authorityConnections.length];
-    ConfigParams[] configInfos = new ConfigParams[authorityConnections.length];
-    int[] maxPoolSizes = new int[authorityConnections.length];
-    
-    for (int i = 0; i < authorityConnections.length; i++)
-    {
-      connectionNames[i] = authorityConnections[i].getName();
-      classNames[i] = authorityConnections[i].getClassName();
-      configInfos[i] = authorityConnections[i].getConfigParams();
-      maxPoolSizes[i] = authorityConnections[i].getMaxConnections();
-    }
-    return localPool.grabMultiple(threadContext,
-      orderingKeys, connectionNames, classNames, configInfos, maxPoolSizes);
-  }
-
-  /** Get an authority connector.
-  * The connector is specified by an authority connection object.
-  *@param authorityConnection is the authority connection to base the connector instance on.
-  */
-  @Override
-  public IAuthorityConnector grab(IAuthorityConnection authorityConnection)
-    throws ManifoldCFException
-  {
-    return localPool.grab(threadContext, authorityConnection.getName(), authorityConnection.getClassName(),
-      authorityConnection.getConfigParams(), authorityConnection.getMaxConnections());
-  }
-
-  /** Release multiple authority connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  @Override
-  public void releaseMultiple(IAuthorityConnection[] connections, IAuthorityConnector[] connectors)
-    throws ManifoldCFException
-  {
-    String[] connectionNames = new String[connections.length];
-    for (int i = 0; i < connections.length; i++)
-    {
-      connectionNames[i] = connections[i].getName();
-    }
-    localPool.releaseMultiple(threadContext, connectionNames, connectors);
-  }
-
-  /** Release an output connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  @Override
-  public void release(IAuthorityConnection connection, IAuthorityConnector connector)
-    throws ManifoldCFException
-  {
-    localPool.release(threadContext, connection.getName(), connector);
-  }
-
-  /** Idle notification for inactive authority connector handles.
-  * This method polls all inactive handles.
-  */
-  @Override
-  public void pollAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.pollAllConnectors(threadContext);
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  @Override
-  public void flushUnusedConnectors()
-    throws ManifoldCFException
-  {
-    localPool.flushUnusedConnectors(threadContext);
-  }
-
-  /** Clean up all open authority connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  @Override
-  public void closeAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.closeAllConnectors(threadContext);
-  }
-
-  /** Actual static output connector pool */
-  protected static class LocalPool extends org.apache.manifoldcf.core.connectorpool.ConnectorPool<IAuthorityConnector>
-  {
-    public LocalPool()
-    {
-      super("_AUTHORITYCONNECTORPOOL_");
-    }
-    
-    @Override
-    protected boolean isInstalled(IThreadContext tc, String className)
-      throws ManifoldCFException
-    {
-      IAuthorityConnectorManager connectorManager = AuthorityConnectorManagerFactory.make(tc);
-      return connectorManager.isInstalled(className);
-    }
-    
-    @Override
-    protected boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-      throws ManifoldCFException
-    {
-      IAuthorityConnectionManager connectionManager = AuthorityConnectionManagerFactory.make(tc);
-      return connectionManager.load(connectionName) != null;
-    }
-
-    public IAuthorityConnector[] grabMultiple(IThreadContext tc, String[] orderingKeys, String connectionNames[], String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-      throws ManifoldCFException
-    {
-      return grabMultiple(tc,IAuthorityConnector.class,orderingKeys,connectionNames,classNames,configInfos,maxPoolSizes);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectionManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectionManagerFactory.java
deleted file mode 100644
index f6ab223..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectionManagerFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id: AuthorityConnectionManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** This is the factory class for authority connection manager objects.
-*/
-public class AuthorityConnectionManagerFactory
-{
-  // name to use in thread context pool of objects
-  private final static String objectName = "_AuthConnectionMgr_";
-
-  private AuthorityConnectionManagerFactory()
-  {
-  }
-
-  /** Make an authority connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IAuthorityConnectionManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IAuthorityConnectionManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.authorities.authority.AuthorityConnectionManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (IAuthorityConnectionManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorFactory.java
deleted file mode 100644
index d2e2aa8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorFactory.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/* $Id: AuthorityConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This class manages a pool of authority connectors.
-*/
-public class AuthorityConnectorFactory extends ConnectorFactory<IAuthorityConnector>
-{
-  // Static factory
-  protected final static AuthorityConnectorFactory thisFactory = new AuthorityConnectorFactory();
-  
-  protected AuthorityConnectorFactory()
-  {
-  }
-
-  @Override
-  protected boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException
-  {
-    IAuthorityConnectorManager connMgr = AuthorityConnectorManagerFactory.make(tc);
-    return connMgr.isInstalled(className);
-  }
-
-  /** Get the default response from a connector.  Called if the connection attempt fails.
-  */
-  public AuthorizationResponse getThisDefaultAuthorizationResponse(IThreadContext threadContext, String className, String userName)
-    throws ManifoldCFException
-  {
-    IAuthorityConnector connector = getThisConnector(threadContext,className);
-    if (connector == null)
-      return null;
-    return connector.getDefaultAuthorizationResponse(userName);
-  }
-
-  /** Install connector.
-  *@param className is the class name.
-  */
-  public static void install(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.installThis(threadContext,className);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  public static void deinstall(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.deinstallThis(threadContext,className);
-  }
-
-  /** Get the default response from a connector.  Called if the connection attempt fails.
-  */
-  public static AuthorizationResponse getDefaultAuthorizationResponse(IThreadContext threadContext, String className, String userName)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisDefaultAuthorizationResponse(threadContext,className,userName);
-  }
-
-  /** Output the configuration header section.
-  */
-  public static void outputConfigurationHeader(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationHeader(threadContext,className,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  public static void outputConfigurationBody(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationBody(threadContext,className,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  public static String processConfigurationPost(IThreadContext threadContext, String className, IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    return thisFactory.processThisConfigurationPost(threadContext,className,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  public static void viewConfiguration(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.viewThisConfiguration(threadContext,className,out,locale,configParams);
-  }
-
-  /** Get a repository connector instance, but do NOT check if class is installed first!
-  *@param className is the class name.
-  *@return the instance.
-  */
-  public static IAuthorityConnector getConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorNoCheck(className);
-  }
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorManagerFactory.java
deleted file mode 100644
index 667cae7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id: AuthorityConnectorManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** This class is the factory for the Authority Connector Manager.
-*/
-public class AuthorityConnectorManagerFactory
-{
-  protected static final String connMgr = "_AuthorityConnectorManager_";
-
-  private AuthorityConnectorManagerFactory()
-  {
-  }
-
-  /** Construct a connector manager.
-  *@param tc is the thread context.
-  *@return the connector manager handle.
-  */
-  public static IAuthorityConnectorManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof IAuthorityConnectorManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.authorities.authconnmgr.AuthorityConnectorManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (IAuthorityConnectorManager)o;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorPoolFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorPoolFactory.java
deleted file mode 100644
index b253abc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityConnectorPoolFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-
-/** Authority connector pool manager factory.
-*/
-public class AuthorityConnectorPoolFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_AuthorityConnectorPoolMgr_";
-
-  private AuthorityConnectorPoolFactory()
-  {
-  }
-
-  /** Make an output connector pool handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IAuthorityConnectorPool make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IAuthorityConnectorPool))
-    {
-      o = new org.apache.manifoldcf.authorities.authorityconnectorpool.AuthorityConnectorPool(tc);
-      tc.save(objectName,o);
-    }
-    return (IAuthorityConnectorPool)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityGroupManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityGroupManagerFactory.java
deleted file mode 100644
index 3631396..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorityGroupManagerFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** This is the factory class for authority group manager objects.
-*/
-public class AuthorityGroupManagerFactory
-{
-  // name to use in thread context pool of objects
-  private final static String objectName = "_AuthGroupMgr_";
-
-  private AuthorityGroupManagerFactory()
-  {
-  }
-
-  /** Make an authority connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IAuthorityGroupManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IAuthorityGroupManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.authorities.authgroups.AuthorityGroupManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (IAuthorityGroupManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorizationDomainManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorizationDomainManagerFactory.java
deleted file mode 100644
index 3bd389c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorizationDomainManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** This class is the factory for the Authorization Domain Manager.
-*/
-public class AuthorizationDomainManagerFactory
-{
-  protected static final String connMgr = "_AuthorizationDomainManager_";
-
-  private AuthorizationDomainManagerFactory()
-  {
-  }
-
-  /** Construct a connector manager.
-  *@param tc is the thread context.
-  *@return the connector manager handle.
-  */
-  public static IAuthorizationDomainManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof IAuthorizationDomainManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.authorities.authdomains.AuthorizationDomainManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (IAuthorizationDomainManager)o;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorizationResponse.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorizationResponse.java
deleted file mode 100644
index 2bbabb7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/AuthorizationResponse.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id: AuthorizationResponse.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** An authorization response must contain the following information:
-* (a) A list of access tokens
-* (b) An indication of how that result was obtained - specifically:
-*     - Whether the authority was reachable or not
-*     - Whether the user was found or not
-*     - Whether the user was authorized or not
-*/
-public class AuthorizationResponse
-{
-  // Here are the kinds of conditions that apply to the response
-  public final static int RESPONSE_OK = 0;
-  public final static int RESPONSE_UNREACHABLE = 1;
-  public final static int RESPONSE_USERNOTFOUND = 2;
-  public final static int RESPONSE_USERUNAUTHORIZED = 3;
-
-  /** The list of access tokens */
-  protected String[] accessTokens;
-  /** The status */
-  protected int responseStatus;
-
-  /** Constructor */
-  public AuthorizationResponse(String[] accessTokens, int responseStatus)
-  {
-    this.accessTokens = accessTokens;
-    this.responseStatus = responseStatus;
-  }
-
-  /** Get the status */
-  public int getResponseStatus()
-  {
-    return responseStatus;
-  }
-
-  /** Get the tokens */
-  public String[] getAccessTokens()
-  {
-    return accessTokens;
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/CacheKeyFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/CacheKeyFactory.java
deleted file mode 100644
index bed2983..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/CacheKeyFactory.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/* $Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-/** This class just represents a central place where cache keys are assembled.
-* All methods are static.
-*/
-public class CacheKeyFactory extends org.apache.manifoldcf.core.interfaces.CacheKeyFactory
-{
-
-  protected CacheKeyFactory()
-  {
-  }
-
-  /** Construct a key which represents the general list of authority groups.
-  *@return the cache key.
-  */
-  public static String makeAuthorityGroupsKey()
-  {
-    return "AUTHORITYGROUPS";
-  }
-
-  /** Construct a key which represents an individual authority group.
-  *@param groupName is the name of the group.
-  *@return the cache key.
-  */
-  public static String makeAuthorityGroupKey(String groupName)
-  {
-    return "AUTHORITYGROUP_"+groupName;
-  }
-
-  /** Construct a key which represents the general list of authority connectors.
-  *@return the cache key.
-  */
-  public static String makeAuthorityConnectionsKey()
-  {
-    return "AUTHORITYCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual authority connection.
-  *@param connectionName is the name of the connection.
-  *@return the cache key.
-  */
-  public static String makeAuthorityConnectionKey(String connectionName)
-  {
-    return "AUTHORITYCONNECTION_"+connectionName;
-  }
-
-  /** Construct a key which represents the general list of mapping connectors.
-  *@return the cache key.
-  */
-  public static String makeMappingConnectionsKey()
-  {
-    return "MAPPINGCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual mapping connection.
-  *@param connectionName is the name of the connection.
-  *@return the cache key.
-  */
-  public static String makeMappingConnectionKey(String connectionName)
-  {
-    return "MAPPINGCONNECTION_"+connectionName;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnection.java
deleted file mode 100644
index 68e7c0b..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnection.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* $Id: IAuthorityConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes a paper object which is an authority connection.
-*/
-public interface IAuthorityConnection
-{
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className);
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName();
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams();
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount);
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections();
-
-  /** Set the prerequisite mapper, if any.
-  *@param mapping is the name of the mapping connection to use to get the input user name,
-  *  or null.
-  */
-  public void setPrerequisiteMapping(String mapping);
-
-  /** Get the prerequisite mapper, if any.
-  *@return the mapping connection name whose output should be used as the input user name.
-  */
-  public String getPrerequisiteMapping();
-
-  /** Set the authorization domain.
-  *@param domain is the authorization domain.
-  */
-  public void setAuthDomain(String domain);
-  
-  /** Get the authorization domain.
-  *@return the authorization domain.
-  */
-  public String getAuthDomain();
-  
-  /** Set authorization group.
-  *@param groupName is the name of the group.
-  */
-  public void setAuthGroup(String groupName);
-  
-  /** Get the authorization group.
-  *@return the group.
-  */
-  public String getAuthGroup();
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectionManager.java
deleted file mode 100644
index bc00aa2..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectionManager.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/* $Id: IAuthorityConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes the functionality in the authority connection manager.
-* The authority connection manager manages the definitions of individual connections,
-* and allows them to be defined, edited, and removed.
-*/
-public interface IAuthorityConnectionManager
-{
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Return true if the specified authority group name is referenced.
-  *@param authorityGroup is the authority group name.
-  *@return true if referenced, false otherwise.
-  */
-  public boolean isGroupReferenced(String authorityGroup)
-    throws ManifoldCFException;
-
-  /** Obtain a list of the authority connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public IAuthorityConnection[] getAllConnections()
-    throws ManifoldCFException;
-
-  /** Obtain a list of the authority connections which correspond to an auth domain.
-  *@param authDomain is the domain to get connections for.
-  *@return an array of connection objects.
-  */
-  public IAuthorityConnection[] getDomainConnections(String authDomain)
-    throws ManifoldCFException;
-
-  /** Load a authority connection by name.
-  *@param name is the name of the authority connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public IAuthorityConnection load(String name)
-    throws ManifoldCFException;
-
-  /** Load multiple repository connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  public IAuthorityConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new authority connection object.
-  *@return the new object.
-  */
-  public IAuthorityConnection create()
-    throws ManifoldCFException;
-
-  /** Save an authority connection object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  public boolean save(IAuthorityConnection object)
-    throws ManifoldCFException;
-
-  /** Delete an authority connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Get the authority connection table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Get the authority connection name column.
-  *@return the name column.
-  */
-  public String getAuthorityNameColumn();
-
-  /** Return true if the specified mapping name is referenced.
-  *@param mappingName is the mapping name.
-  *@return true if referenced, false otherwise.
-  */
-  public boolean isMappingReferenced(String mappingName)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnector.java
deleted file mode 100644
index ca7b766..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnector.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id: IAuthorityConnector.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An authority connector supplies an ACL of some kind for a given user.  This is necessary so that the search UI
-* can find the documents that can be legally seen.
-*
-* An instance of this interface provides this functionality.  Authority connector instances are pooled, so that session
-* setup does not need to be done repeatedly.  The pool is segregated by specific sets of configuration parameters.
-*/
-public interface IAuthorityConnector extends IConnector
-{
-
-  /** This is the global deny token.  This should be ingested with all documents. */
-  public static final String GLOBAL_DENY_TOKEN = "DEAD_AUTHORITY";
-
-  /** Obtain the access tokens for a given Active Directory user name.
-  *@param userName is the user name or identifier.
-  *@return the response tokens (according to the current authority).
-  * (Should throws an exception only when a condition cannot be properly described within the authorization response object.)
-  */
-  public AuthorizationResponse getAuthorizationResponse(String userName)
-    throws ManifoldCFException;
-
-  /** Obtain the default access tokens for a given user name.
-  *@param userName is the user name or identifier.
-  *@return the default response tokens, presuming that the connect method fails.
-  */
-  public AuthorizationResponse getDefaultAuthorizationResponse(String userName);
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectorManager.java
deleted file mode 100644
index 6ea5ec4..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectorManager.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id: IAuthorityConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the authority connector registry.  Authority connectors are registered here, so that
-* they can be made available when an authority connection is created.
-*/
-public interface IAuthorityConnectorManager
-{
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException;
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the connector class to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException;
-
-  /** Remove a connector.
-  * Call this when the connector cannot be instantiated.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException;
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException;
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException;
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectorPool.java
deleted file mode 100644
index 9f313bb..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityConnectorPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An object implementing this interface functions as a pool of authority connectors.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public interface IAuthorityConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get multiple authority connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param authorityConnections are the connections to use the build the connector instances.
-  */
-  public IAuthorityConnector[] grabMultiple(String[] orderingKeys, IAuthorityConnection[] authorityConnections)
-    throws ManifoldCFException;
-
-  /** Get an authority connector.
-  * The connector is specified by an authority connection object.
-  *@param outputConnection is the authority connection to base the connector instance on.
-  */
-  public IAuthorityConnector grab(IAuthorityConnection authorityConnection)
-    throws ManifoldCFException;
-
-  /** Release multiple authority connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  public void releaseMultiple(IAuthorityConnection[] connections, IAuthorityConnector[] connectors)
-    throws ManifoldCFException;
-
-  /** Release an authority connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  public void release(IAuthorityConnection connection, IAuthorityConnector connector)
-    throws ManifoldCFException;
-
-  /** Idle notification for inactive authority connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors()
-    throws ManifoldCFException;
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors()
-    throws ManifoldCFException;
-
-  /** Clean up all open authority connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  public void closeAllConnectors()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityGroup.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityGroup.java
deleted file mode 100644
index a58002e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityGroup.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes a paper object which is an authority group.
-*/
-public interface IAuthorityGroup
-{
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityGroupManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityGroupManager.java
deleted file mode 100644
index 16b4ae6..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorityGroupManager.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes the functionality in the authority group manager.
-* The authority group manager manages the definitions of individual groups,
-* and allows them to be defined, edited, and removed.
-*/
-public interface IAuthorityGroupManager
-{
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Obtain a list of the authority groups, ordered by name.
-  *@return an array of group objects.
-  */
-  public IAuthorityGroup[] getAllGroups()
-    throws ManifoldCFException;
-
-  /** Load a authority group by name.
-  *@param name is the name of the authority group.
-  *@return the loaded group object, or null if not found.
-  */
-  public IAuthorityGroup load(String name)
-    throws ManifoldCFException;
-
-  /** Load multiple authority groups by name.
-  *@param names are the names to load.
-  *@return the loaded group objects.
-  */
-  public IAuthorityGroup[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new authority group object.
-  *@return the new object.
-  */
-  public IAuthorityGroup create()
-    throws ManifoldCFException;
-
-  /** Save an authority group object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  public boolean save(IAuthorityGroup object)
-    throws ManifoldCFException;
-
-  /** Delete an authority group.
-  *@param name is the name of the group to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Get the authority connection table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Get the authority connection name column.
-  *@return the name column.
-  */
-  public String getGroupNameColumn();
-
-  /** Get the authority connection description column.
-  *@return the description column.
-  */
-  public String getGroupDescriptionColumn();
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorizationDomainManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorizationDomainManager.java
deleted file mode 100644
index e14f845..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IAuthorizationDomainManager.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the authorization domain registry.  Authorization domains are registered here, so that
-* they can be made available when an authority connection is created.
-*/
-public interface IAuthorizationDomainManager
-{
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new domain.
-  *@param description is the description to use in the UI.
-  *@param domainName is the internal domain name used by the authority service.
-  */
-  public void registerDomain(String description, String domainName)
-    throws ManifoldCFException;
-
-  /** Unregister a domain.
-  * This may fail if any authority connections refer to the domain.
-  *@param domainName is the internal domain name to unregister.
-  */
-  public void unregisterDomain(String domainName)
-    throws ManifoldCFException;
-
-  /** Get ordered list of domains.
-  *@return a resultset with the columns "description" and "domainname".
-  * These will be ordered by description.
-  */
-  public IResultSet getDomains()
-    throws ManifoldCFException;
-
-  /** Get a description given a domain name.
-  *@param domainName is the domain name.
-  *@return the description, or null if the domain is not registered.
-  */
-  public String getDescription(String domainName)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnection.java
deleted file mode 100644
index a330e53..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnection.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes a paper object which is an mapping connection.
-*/
-public interface IMappingConnection
-{
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className);
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName();
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams();
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount);
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections();
-
-  /** Set the prerequisite mapper, if any.
-  *@param mapping is the name of the mapping connection to use to get the input user name,
-  *  or null.
-  */
-  public void setPrerequisiteMapping(String mapping);
-
-  /** Get the prerequisite mapper, if any.
-  *@return the mapping connection name whose output should be used as the input user name.
-  */
-  public String getPrerequisiteMapping();
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectionManager.java
deleted file mode 100644
index 94bc295..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectionManager.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes the functionality in the mapping connection manager.
-* The authority connection manager manages the definitions of individual connections,
-* and allows them to be defined, edited, and removed.
-*/
-public interface IMappingConnectionManager
-{
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Obtain a list of the mapping connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public IMappingConnection[] getAllConnections()
-    throws ManifoldCFException;
-
-  /** Obtain a list of the mapping connections, ordered by name,
-  * excluding those that would form a prerequisite loop if chosen.
-  *@param startingConnectionName is the name of the connection we would be starting with.
-  * Pass null for all connections.
-  *@return an array of connection objects.
-  */
-  public IMappingConnection[] getAllNonLoopingConnections(String startingConnectionName)
-    throws ManifoldCFException;
-
-  /** Load a mapping connection by name.
-  *@param name is the name of the mapping connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public IMappingConnection load(String name)
-    throws ManifoldCFException;
-
-  /** Load multiple mapping connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  public IMappingConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new mapping connection object.
-  *@return the new object.
-  */
-  public IMappingConnection create()
-    throws ManifoldCFException;
-
-  /** Save an mapping connection object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  public boolean save(IMappingConnection object)
-    throws ManifoldCFException;
-
-  /** Delete an mapping connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Get the authority connection table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Get the mapping connection name column.
-  *@return the name column.
-  */
-  public String getMappingNameColumn();
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnector.java
deleted file mode 100644
index 76a950d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnector.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** A Mapping Connector helps fill out the user identification information for a user.
-*
-* An instance of this interface provides this functionality.  Mapping connector instances are pooled, so that session
-* setup does not need to be done repeatedly.  The pool is segregated by specific sets of configuration parameters.
-*/
-public interface IMappingConnector extends IConnector
-{
-
-  /** Map an input user name to an output name.
-  *@param userName is the name to map
-  *@return the mapped user name
-  */
-  public String mapUser(String userName)
-    throws ManifoldCFException;
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectorManager.java
deleted file mode 100644
index a23c4cd..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectorManager.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes the mapping connector registry.  Mapping connectors are registered here, so that
-* they can be made available when an mapping connection is created.
-*/
-public interface IMappingConnectorManager
-{
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException;
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the connector class to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException;
-
-  /** Remove a connector.
-  * Call this when the connector cannot be instantiated.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException;
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException;
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException;
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectorPool.java
deleted file mode 100644
index 513e394..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/IMappingConnectorPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An object implementing this interface functions as a pool of mapping connectors.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public interface IMappingConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get multiple mapping connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param mappingConnections are the connections to use the build the connector instances.
-  */
-  public IMappingConnector[] grabMultiple(String[] orderingKeys, IMappingConnection[] mappingConnections)
-    throws ManifoldCFException;
-
-  /** Get a mapping connector.
-  * The connector is specified by a mapping connection object.
-  *@param mappingConnection is the mapping connection to base the connector instance on.
-  */
-  public IMappingConnector grab(IMappingConnection mappingConnection)
-    throws ManifoldCFException;
-
-  /** Release multiple mapping connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  public void releaseMultiple(IMappingConnection[] connections, IMappingConnector[] connectors)
-    throws ManifoldCFException;
-
-  /** Release a mapping connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  public void release(IMappingConnection connection, IMappingConnector connector)
-    throws ManifoldCFException;
-
-  /** Idle notification for inactive mapping connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors()
-    throws ManifoldCFException;
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors()
-    throws ManifoldCFException;
-
-  /** Clean up all open mapping connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  public void closeAllConnectors()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectionManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectionManagerFactory.java
deleted file mode 100644
index abcc219..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectionManagerFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** This is the factory class for mapping connection manager objects.
-*/
-public class MappingConnectionManagerFactory
-{
-  // name to use in thread context pool of objects
-  private final static String objectName = "_MapConnectionMgr_";
-
-  private MappingConnectionManagerFactory()
-  {
-  }
-
-  /** Make an authority connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IMappingConnectionManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IMappingConnectionManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.authorities.mapping.MappingConnectionManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (IMappingConnectionManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorFactory.java
deleted file mode 100644
index 35e227e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorFactory.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This class manages a pool of mapping connectors.
-*/
-public class MappingConnectorFactory extends ConnectorFactory<IMappingConnector>
-{
-
-  // Static factory
-  protected final static MappingConnectorFactory thisFactory = new MappingConnectorFactory();
-
-  protected MappingConnectorFactory()
-  {
-  }
-
-  @Override
-  protected boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException
-  {
-    IMappingConnectorManager connMgr = MappingConnectorManagerFactory.make(tc);
-    return connMgr.isInstalled(className);
-  }
-
-  /** Install connector.
-  *@param className is the class name.
-  */
-  public static void install(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.installThis(threadContext,className);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  public static void deinstall(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.deinstallThis(threadContext,className);
-  }
-
-  /** Output the configuration header section.
-  */
-  public static void outputConfigurationHeader(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationHeader(threadContext,className,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  public static void outputConfigurationBody(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationBody(threadContext,className,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  public static String processConfigurationPost(IThreadContext threadContext, String className, IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    return thisFactory.processThisConfigurationPost(threadContext,className,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  public static void viewConfiguration(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.viewThisConfiguration(threadContext,className,out,locale,configParams);
-  }
-
-  /** Get a mapping connector instance, but do NOT check if class is installed first!
-  *@param className is the class name.
-  *@return the instance.
-  */
-  public static IMappingConnector getConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorNoCheck(className);
-  }
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorManagerFactory.java
deleted file mode 100644
index 70b9196..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** This class is the factory for the Mapping Connector Manager.
-*/
-public class MappingConnectorManagerFactory
-{
-  protected static final String connMgr = "_MappingConnectorManager_";
-
-  private MappingConnectorManagerFactory()
-  {
-  }
-
-  /** Construct a connector manager.
-  *@param tc is the thread context.
-  *@return the connector manager handle.
-  */
-  public static IMappingConnectorManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof IMappingConnectorManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.authorities.mapconnmgr.MappingConnectorManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (IMappingConnectorManager)o;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorPoolFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorPoolFactory.java
deleted file mode 100644
index ba28133..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/interfaces/MappingConnectorPoolFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-
-/** Mapping connector pool manager factory.
-*/
-public class MappingConnectorPoolFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_MappingConnectorPoolMgr_";
-
-  private MappingConnectorPoolFactory()
-  {
-  }
-
-  /** Make a mapping connector pool handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IMappingConnectorPool make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IMappingConnectorPool))
-    {
-      o = new org.apache.manifoldcf.authorities.mappingconnectorpool.MappingConnectorPool(tc);
-      tc.save(objectName,o);
-    }
-    return (IMappingConnectorPool)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapconnmgr/MappingConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapconnmgr/MappingConnectorManager.java
deleted file mode 100644
index 785f6e3..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapconnmgr/MappingConnectorManager.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mapconnmgr;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.interfaces.CacheKeyFactory;
-
-/** This is the implementation of that authority connector manager.
- * 
- * <br><br>
- * <b>mapconnectors</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class MappingConnectorManager extends org.apache.manifoldcf.core.database.BaseTable implements IMappingConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public MappingConnectorManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"mapconnectors");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always use a loop, in case there's upgrade retries needed.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Schema upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    // First, go through all registered connectors.  This is all inside a transaction.
-    beginTransaction();
-    try
-    {
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        // Call the deinstall method
-        MappingConnectorFactory.deinstall(threadContext,className);
-      }
-      performDrop(invKeys);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      //performLock();
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(classNameField,className);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+classNameField+"=?",params,invKeys);
-      }
-
-      // Either way, we must do the install/upgrade itself.
-      MappingConnectorFactory.install(threadContext,className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the class name of the connector to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // Uninstall first
-      MappingConnectorFactory.deinstall(threadContext,className);
-
-      removeConnector(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove a connector.
-  * Call this when the connector cannot be instantiated.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+classNameField+" AS classname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    return row.getValue(descriptionField).toString();
-  }
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException
-  {
-    // Use the global table key; that's good enough because we don't expect stuff to change out from under very often.
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT * FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mappers/BaseMappingConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mappers/BaseMappingConnector.java
deleted file mode 100644
index c1b898f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mappers/BaseMappingConnector.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mappers;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-
-/** A mapping connector massages a UserRecord to augment the user identification information within.
-*
-* An instance of this interface provides this functionality.  Mapping connector instances are pooled, so that session
-* setup does not need to be done repeatedly.  The pool is segregated by specific sets of configuration parameters.
-*/
-public abstract class BaseMappingConnector extends org.apache.manifoldcf.core.connector.BaseConnector implements IMappingConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // This class is provided for future backwards compatibility reasons, so it is wise to
-  // extend it.
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapping/MappingConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapping/MappingConnection.java
deleted file mode 100644
index e69dbea..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapping/MappingConnection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mapping;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-/** This is the implementation of the authority connection interface, which describes a paper object
-* to be manipulated in order to create, edit, or save an authority definition.
-*/
-public class MappingConnection implements IMappingConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-  protected String className = null;
-  protected ConfigParams configParams = new ConfigParams();
-  protected int maxCount = 100;
-  protected String prerequisiteMapping = null;
-
-  /** Constructor.
-  */
-  public MappingConnection()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public MappingConnection duplicate()
-  {
-    MappingConnection rval = new MappingConnection();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    rval.className = className;
-    rval.maxCount = maxCount;
-    rval.configParams = configParams.duplicate();
-    rval.prerequisiteMapping = prerequisiteMapping;
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className)
-  {
-    this.className = className;
-  }
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName()
-  {
-    return className;
-  }
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams()
-  {
-    return configParams;
-  }
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount)
-  {
-    this.maxCount = maxCount;
-  }
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections()
-  {
-    return maxCount;
-  }
-
-  /** Set the prerequisite mapper, if any.
-  *@param mapping is the name of the mapping connection to use to get the input user name,
-  *  or null.
-  */
-  public void setPrerequisiteMapping(String mapping)
-  {
-    prerequisiteMapping = mapping;
-  }
-  
-  /** Get the prerequisite mapper, if any.
-  *@return the mapping connection name whose output should be used as the input user name.
-  */
-  public String getPrerequisiteMapping()
-  {
-    return prerequisiteMapping;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapping/MappingConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapping/MappingConnectionManager.java
deleted file mode 100644
index 82de6be..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mapping/MappingConnectionManager.java
+++ /dev/null
@@ -1,872 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mapping;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-import org.apache.manifoldcf.authorities.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.authorities.system.ManifoldCF;
-
-/** Implementation of the authority connection manager functionality.
- * 
- * <br><br>
- * <b>mapconnections</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>mappingname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>maxcount</td><td>BIGINT</td><td></td></tr>
- * <tr><td>configxml</td><td>LONGTEXT</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class MappingConnectionManager extends org.apache.manifoldcf.core.database.BaseTable implements IMappingConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Special field suffix
-  private final static String passwordSuffix = "password";
-
-  protected final static String nameField = "connname";      // Changed this to work around a bug in postgresql
-  protected final static String descriptionField = "description";
-  protected final static String classNameField = "classname";
-  protected final static String maxCountField = "maxcount";
-  protected final static String configField = "configxml";
-  protected final static String mappingField = "mappingname";
-
-  // Cache manager
-  protected final ICacheManager cacheManager;
-  // Thread context
-  protected final IThreadContext threadContext;
-  // Lock manager
-  protected final ILockManager lockManager;
-  
-  protected final static String mappingsLock = "MAPPINGS_LOCK";
-  
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public MappingConnectionManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"mapconnections");
-
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always do a loop, in case upgrade needs it.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the "objects" table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(maxCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(configField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(mappingField,new ColumnDescription("VARCHAR(32)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here
-      }
-
-      // Index management goes here
-
-      break;
-    }
-    
-
-  }
-
-  /** Uninstall the manager.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Export configuration */
-  @Override
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,1);
-    // Get the authority list
-    IMappingConnection[] list = getAllConnections();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual mapping info
-    for (IMappingConnection conn : list)
-    {
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-      ManifoldCF.writeString(os,conn.getClassName());
-      ManifoldCF.writeString(os,conn.getConfigParams().toXML());
-      ManifoldCF.writeDword(os,conn.getMaxConnections());
-      ManifoldCF.writeString(os,conn.getPrerequisiteMapping());
-    }
-    
-  }
-
-  /** Import configuration */
-  @Override
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version != 1)
-      throw new java.io.IOException("Unknown mapping configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    for (int i = 0; i < count; i++)
-    {
-      IMappingConnection conn = create();
-      conn.setName(ManifoldCF.readString(is));
-      conn.setDescription(ManifoldCF.readString(is));
-      conn.setClassName(ManifoldCF.readString(is));
-      conn.getConfigParams().fromXML(ManifoldCF.readString(is));
-      conn.setMaxConnections(ManifoldCF.readDword(is));
-      conn.setPrerequisiteMapping(ManifoldCF.readString(is));
-      // Attempt to save this connection
-      save(conn);
-    }
-  }
-
-  /** Obtain a list of the mapping connections, ordered by name,
-  * excluding those that would form a prerequisite loop if chosen.
-  *@param startingConnectionName is the name of the connection we would be starting with.
-  * Pass null for all connections.
-  *@return an array of connection objects.
-  */
-  public IMappingConnection[] getAllNonLoopingConnections(String startingConnectionName)
-    throws ManifoldCFException
-  {
-    // The point of this method is to prune connections from the list that, if a new prereq was established
-    // between the specified starting connection name and the listed mapping connection, a loop would develop.
-    IMappingConnection[] connections = getAllConnections();
-    // Degenerate case: no (existing) starting point.
-    if (startingConnectionName == null)
-      return connections;
-    
-    List<IMappingConnection> finalConnections = new ArrayList<IMappingConnection>();
-    
-    Map<String,IMappingConnection> connectionMap = new HashMap<String,IMappingConnection>();
-    for (IMappingConnection thisConnection : connections)
-    {
-      connectionMap.put(thisConnection.getName(), thisConnection);
-    }
-    
-    for (IMappingConnection connectionToEvaluate : connections)
-    {
-      // The algorithm we want is as follows (from Wikipedia):
-      //
-      // L <- Empty list where we put the sorted elements
-      // Q <- Set of all nodes with no incoming edges
-      // while Q is non-empty do
-      //    remove a node n from Q
-      //    insert n into L
-      //    for each node m with an edge e from n to m do
-      //        remove edge e from the graph
-      //        if m has no other incoming edges then
-      //            insert m into Q
-      // if graph has edges then
-      //    output error message (graph has a cycle)
-      // else 
-      //    output message (proposed topologically sorted order: L)
-      //
-      // In order to "remove" a link, we have to either keep a list of links we've already processed, or copy the
-      // structure to another one where we *can* remove links.  I opt for the former.
-      // The second issue is that we need to generate Q up front.  This is easy enough; just keep a hash of connections
-      // that have not been referenced (yet), and remove connections from the hash as refs are found.
-      // Also interesting: we don't actually need to keep L.
-      
-      // The set of nodes with NO incoming edges
-      Set<String> Q = new HashSet<String>();
-      // The set of links in the graph
-      Set<String> links = new HashSet<String>();
-      // The count of the number of incoming links to a node
-      Map<String,Integer> incomingCount = new HashMap<String,Integer>();
-
-      for (int i = 0; i < connections.length; i++)
-      {
-        Q.add(connections[i].getName());
-      }
-      for (int i = 0; i < connections.length; i++)
-      {
-        String connectionName = connections[i].getName();
-        String prerequisite;
-        if (connectionName.equals(startingConnectionName))
-        {
-          // We ignore what's saved and instead substitute a hypothetical
-          // There is a "proposed" edge from the current connection, ending at connectionToEvaluate,
-          // so for the purpose of determining cycles, add that one too into the graph
-          prerequisite = connectionToEvaluate.getName();
-        }
-        else
-        {
-          // Use what's actually saved
-          prerequisite = connections[i].getPrerequisiteMapping();
-        }
-        if (prerequisite != null)
-        {
-          Integer x = incomingCount.get(prerequisite);
-          if (x == null)
-            incomingCount.put(prerequisite,new Integer(1));
-          else
-            incomingCount.put(prerequisite,new Integer(x.intValue()+1));
-          Q.remove(prerequisite);
-          links.add(connectionName + ":" + prerequisite);
-        }
-      }
-
-
-      // Now, repeat until Q is empty
-      while (!Q.isEmpty())
-      {
-        Iterator<String> iter = Q.iterator();
-        String checkConnectionName = iter.next();
-        Q.remove(checkConnectionName);
-        // Get prereqs for the connection, those that are still in the graph
-        String s;
-        if (checkConnectionName.equals(startingConnectionName))
-        {
-          // We have a hypothetical link to evaluate and remove
-          s = connectionToEvaluate.getName();
-        }
-        else
-        {
-          IMappingConnection sourceConnection = connectionMap.get(checkConnectionName);
-          s = sourceConnection.getPrerequisiteMapping();
-        }
-        
-        if (s != null)
-        {
-          String edgeName = checkConnectionName + ":" + s;
-          if (links.contains(edgeName))
-          {
-            // Remove edgeName from graph
-            links.remove(edgeName);
-            // If s has no other incoming edges then insert it into Q
-            Integer x = incomingCount.get(s);
-            if (x.intValue() == 1)
-            {
-              incomingCount.remove(s);
-              Q.add(s);
-            }
-            else
-              incomingCount.put(s,new Integer(x.intValue() - 1));
-            
-          }
-        }
-      }
-      
-      // If there are links, we've failed to remove them and thus they must be part of cycles
-      if (links.isEmpty())
-      {
-        // No cycles.  Add this connection to the final list.
-        finalConnections.add(connectionToEvaluate);
-      }
-    }
-    return finalConnections.toArray(new IMappingConnection[0]);
-  }
-
-  /** Obtain a list of the repository connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  @Override
-  public IMappingConnection[] getAllConnections()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(mappingsLock);
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getMappingConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(mappingsLock);
-    }
-  }
-
-  /** Load a mapping connection by name.
-  *@param name is the name of the mapping connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  @Override
-  public IMappingConnection load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  protected final static int FETCH_MAX = 200;
-
-  /** Load multiple mapping connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  @Override
-  public IMappingConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    IMappingConnection[] rval = new IMappingConnection[names.length];
-    if (names.length == 0)
-      return rval;
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (names.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,names,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,names,inputIndex,names.length-inputIndex);
-    return rval;
-  }
-  
-  protected int loadMultipleInternal(IMappingConnection[] rval, int outputIndex, String[] fetchNames, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    MappingConnectionDescription[] objectDescriptions = new MappingConnectionDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      ssb.clear();
-      String name = fetchNames[inputIndex + i];
-      ssb.add(getMappingConnectionKey(name));
-      objectDescriptions[i] = new MappingConnectionDescription(name,new StringSet(ssb));
-    }
-
-    MappingConnectionExecutor exec = new MappingConnectionExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    IMappingConnection[] results = exec.getResults();
-    for (IMappingConnection result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Create a new repository connection object.
-  *@return the new object.
-  */
-  @Override
-  public IMappingConnection create()
-    throws ManifoldCFException
-  {
-    MappingConnection rval = new MappingConnection();
-    return rval;
-  }
-
-  /** Save a mapping connection object.
-  *@param object is the object to save.
-  *@return true if the object is created, false otherwise.
-  */
-  @Override
-  public boolean save(IMappingConnection object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getMappingConnectionsKey());
-    ssb.add(getMappingConnectionKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(mappingsLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              ManifoldCF.noteConfigurationChange();
-              boolean isNew = object.getIsNew();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,object.getDescription());
-              values.put(classNameField,object.getClassName());
-              values.put(maxCountField,new Long((long)object.getMaxConnections()));
-              values.put(configField,object.getConfigParams().toXML());
-              values.put(mappingField,object.getPrerequisiteMapping());
-
-              boolean isCreated;
-              
-              if (set.getRowCount() > 0)
-              {
-                // If the object is supposedly new, it is bad that we found one that already exists.
-                if (isNew)
-                  throw new ManifoldCFException("Authority connection '"+object.getName()+"' already exists");
-                isCreated = false;
-                // Update
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(nameField,object.getName())});
-                performUpdate(values," WHERE "+query,params,null);
-              }
-              else
-              {
-                // If the object is not supposed to be new, it is bad that we did not find one.
-                if (!isNew)
-                  throw new ManifoldCFException("Mapping connection '"+object.getName()+"' no longer exists");
-                isCreated = true;
-                // Insert
-                values.put(nameField,object.getName());
-                // We only need the general key because this is new.
-                performInsert(values,null);
-              }
-
-              cacheManager.invalidateKeys(ch);
-              return isCreated;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(mappingsLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete an authority connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  @Override
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-
-    // Grab authority connection manager handle, to check on legality of deletion.
-    IAuthorityConnectionManager authManager = AuthorityConnectionManagerFactory.make(threadContext);
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getMappingConnectionsKey());
-    ssb.add(getMappingConnectionKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-
-    lockManager.enterNonExWriteLock(mappingsLock);
-    try
-    {
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-        beginTransaction();
-        try
-        {
-          // Check if any other mapping refers to this connection name
-          if (isReferenced(name))
-            throw new ManifoldCFException("Can't delete mapping connection '"+name+"': existing mapping connections refer to it");
-          if (authManager.isMappingReferenced(name))
-            throw new ManifoldCFException("Can't delete mapping connection '"+name+"': existing authority connections refer to it");
-          ManifoldCF.noteConfigurationChange();
-          ArrayList params = new ArrayList();
-          String query = buildConjunctionClause(params,new ClauseDescription[]{
-            new UnitaryClause(nameField,name)});
-          performDelete("WHERE "+query,params,null);
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(mappingsLock);
-    }
-  }
-
-  /** Get the mapping connection name column.
-  *@return the name column.
-  */
-  @Override
-  public String getMappingNameColumn()
-  {
-    return nameField;
-  }
-
-  /** Return true if the specified mapping name is referenced.
-  *@param mappingName is the mapping name.
-  *@return true if referenced, false otherwise.
-  */
-  protected boolean isReferenced(String mappingName)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getMappingConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(mappingField,mappingName)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // repository connections.
-
-  /** Construct a key which represents the general list of mapping connectors.
-  *@return the cache key.
-  */
-  protected static String getMappingConnectionsKey()
-  {
-    return CacheKeyFactory.makeMappingConnectionsKey();
-  }
-
-  /** Construct a key which represents an individual mapping connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getMappingConnectionKey(String connectionName)
-  {
-    return CacheKeyFactory.makeMappingConnectionKey(connectionName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple mapping connections at a single time.
-  *@param connectionNames are a list of connection names.
-  *@return the corresponding mapping connection objects.
-  */
-  protected MappingConnection[] getMappingConnectionsMultiple(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    MappingConnection[] rval = new MappingConnection[connectionNames.length];
-    HashMap returnIndex = new HashMap();
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(connectionNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetMappingConnectionsChunk();
-      while (i < connectionNames.length)
-      {
-        if (j == maxIn)
-        {
-          getMappingConnectionsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(connectionNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getMappingConnectionsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Find the maximum number of clauses for getMappingConnectionsChunk.
-  */
-  protected int maxClauseGetMappingConnectionsChunk()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Read a chunk of mapping connections.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getMappingConnectionsChunk(MappingConnection[] rval, Map returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = ((Integer)returnIndex.get(name)).intValue();
-      MappingConnection rc = new MappingConnection();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rc.setClassName((String)row.getValue(classNameField));
-      rc.setMaxConnections((int)((Long)row.getValue(maxCountField)).longValue());
-      rc.setPrerequisiteMapping((String)row.getValue(mappingField));
-      String xml = (String)row.getValue(configField);
-      if (xml != null && xml.length() > 0)
-        rc.getConfigParams().fromXML(xml);
-      rval[index] = rc;
-    }
-  }
-
-  // The cached instance will be a MappingConnection.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for a mapping connection object.
-  */
-  protected static class MappingConnectionDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String connectionName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public MappingConnectionDescription(String connectionName, StringSet invKeys)
-    {
-      super("mappingconnectioncache");
-      this.connectionName = connectionName;
-      criticalSectionName = getClass().getName()+"-"+connectionName;
-      cacheKeys = invKeys;
-    }
-
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-
-    public int hashCode()
-    {
-      return connectionName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof MappingConnectionDescription))
-        return false;
-      MappingConnectionDescription d = (MappingConnectionDescription)o;
-      return d.connectionName.equals(connectionName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating mapping connection objects.
-  */
-  protected static class MappingConnectionExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected MappingConnectionManager thisManager;
-    protected MappingConnection[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the ToolManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public MappingConnectionExecutor(MappingConnectionManager manager, MappingConnectionDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new MappingConnection[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getConnectionName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public MappingConnection[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      String[] connectionNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < connectionNames.length)
-      {
-        MappingConnectionDescription desc = (MappingConnectionDescription)objectDescriptions[i];
-        connectionNames[i] = desc.getConnectionName();
-        i++;
-      }
-
-      return thisManager.getMappingConnectionsMultiple(connectionNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      MappingConnectionDescription objectDesc = (MappingConnectionDescription)objectDescription;
-      MappingConnection ci = (MappingConnection)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getConnectionName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mappingconnectorpool/MappingConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mappingconnectorpool/MappingConnectorPool.java
deleted file mode 100644
index cd9ebdf..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/mappingconnectorpool/MappingConnectorPool.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.mappingconnectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An implementation of IMappingConnectorPool.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public class MappingConnectorPool implements IMappingConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Local connector pool */
-  protected final static LocalPool localPool = new LocalPool();
-
-  // This implementation is a place-holder for the real one, which will likely fold in the pooling code
-  // as we strip it out of MappingConnectorFactory.
-
-  /** Thread context */
-  protected final IThreadContext threadContext;
-  
-  /** Constructor */
-  public MappingConnectorPool(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get multiple mapping connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param mappingConnections are the connections to use the build the connector instances.
-  */
-  @Override
-  public IMappingConnector[] grabMultiple(String[] orderingKeys, IMappingConnection[] mappingConnections)
-    throws ManifoldCFException
-  {
-    // For now, use the MappingConnectorFactory method.  This will require us to extract info
-    // from each mapping connection, however.
-    String[] connectionNames = new String[mappingConnections.length];
-    String[] classNames = new String[mappingConnections.length];
-    ConfigParams[] configInfos = new ConfigParams[mappingConnections.length];
-    int[] maxPoolSizes = new int[mappingConnections.length];
-    
-    for (int i = 0; i < mappingConnections.length; i++)
-    {
-      connectionNames[i] = mappingConnections[i].getName();
-      classNames[i] = mappingConnections[i].getClassName();
-      configInfos[i] = mappingConnections[i].getConfigParams();
-      maxPoolSizes[i] = mappingConnections[i].getMaxConnections();
-    }
-    return localPool.grabMultiple(threadContext,
-      orderingKeys, connectionNames, classNames, configInfos, maxPoolSizes);
-  }
-
-  /** Get a mapping connector.
-  * The connector is specified by an mapping connection object.
-  *@param mappingConnection is the mapping connection to base the connector instance on.
-  */
-  @Override
-  public IMappingConnector grab(IMappingConnection mappingConnection)
-    throws ManifoldCFException
-  {
-    return localPool.grab(threadContext, mappingConnection.getName(),
-      mappingConnection.getClassName(),
-      mappingConnection.getConfigParams(), mappingConnection.getMaxConnections());
-  }
-
-  /** Release multiple mapping connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  @Override
-  public void releaseMultiple(IMappingConnection[] connections, IMappingConnector[] connectors)
-    throws ManifoldCFException
-  {
-    String[] connectionNames = new String[connections.length];
-    for (int i = 0; i < connections.length; i++)
-    {
-      connectionNames[i] = connections[i].getName();
-    }
-    localPool.releaseMultiple(threadContext, connectionNames, connectors);
-  }
-
-  /** Release a mapping connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  @Override
-  public void release(IMappingConnection connection, IMappingConnector connector)
-    throws ManifoldCFException
-  {
-    localPool.release(threadContext, connection.getName(), connector);
-  }
-
-  /** Idle notification for inactive mapping connector handles.
-  * This method polls all inactive handles.
-  */
-  @Override
-  public void pollAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.pollAllConnectors(threadContext);
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  @Override
-  public void flushUnusedConnectors()
-    throws ManifoldCFException
-  {
-    localPool.flushUnusedConnectors(threadContext);
-  }
-
-  /** Clean up all open mapping connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  @Override
-  public void closeAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.closeAllConnectors(threadContext);
-  }
-
-  /** Actual static mapping connector pool */
-  protected static class LocalPool extends org.apache.manifoldcf.core.connectorpool.ConnectorPool<IMappingConnector>
-  {
-    public LocalPool()
-    {
-      super("_MAPPINGCONNECTORPOOL_");
-    }
-    
-    @Override
-    protected boolean isInstalled(IThreadContext tc, String className)
-      throws ManifoldCFException
-    {
-      IMappingConnectorManager connectorManager = MappingConnectorManagerFactory.make(tc);
-      return connectorManager.isInstalled(className);
-    }
-
-    @Override
-    protected boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-      throws ManifoldCFException
-    {
-      IMappingConnectionManager connectionManager = MappingConnectionManagerFactory.make(tc);
-      return connectionManager.load(connectionName) != null;
-    }
-
-    public IMappingConnector[] grabMultiple(IThreadContext tc, String[] orderingKeys, String[] connectionNames, String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-      throws ManifoldCFException
-    {
-      return grabMultiple(tc,IMappingConnector.class,orderingKeys,connectionNames,classNames,configInfos,maxPoolSizes);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/AuthCheckThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/AuthCheckThread.java
deleted file mode 100644
index fc04d98..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/AuthCheckThread.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/* $Id: AuthCheckThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically calls the cleanup method in all connected repository connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class AuthCheckThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: AuthCheckThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  protected RequestQueue<AuthRequest> requestQueue;
-
-  /** Constructor.
-  */
-  public AuthCheckThread(String id, RequestQueue<AuthRequest> requestQueue)
-    throws ManifoldCFException
-  {
-    super();
-    this.requestQueue = requestQueue;
-    setName("Auth check thread "+id);
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    // Create a thread context object.
-    IThreadContext threadContext = ThreadContextFactory.make();
-    try
-    {
-      // Create an authority connection pool object.
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Wait for a request.
-          AuthRequest theRequest = requestQueue.getRequest();
-
-          // Try to fill the request before going back to sleep.
-          if (Logging.authorityService.isDebugEnabled())
-          {
-            Logging.authorityService.debug(" Calling connector class '"+theRequest.getAuthorityConnection().getClassName()+"'");
-          }
-
-          AuthorizationResponse response = null;
-          Throwable exception = null;
-
-          // Grab an authorization response only if there's a user
-          if (theRequest.getUserID() != null)
-          {
-            try
-            {
-              IAuthorityConnector connector = authorityConnectorPool.grab(theRequest.getAuthorityConnection());
-              // If this is null, we MUST treat this as an "unauthorized" condition!!
-              // We signal that by setting the exception value.
-              try
-              {
-                if (connector == null)
-                  exception = new ManifoldCFException("Authority connector "+theRequest.getAuthorityConnection().getClassName()+" is not registered.");
-                else
-                {
-                  // Get the acl for the user
-                  try
-                  {
-                    response = connector.getAuthorizationResponse(theRequest.getUserID());
-                  }
-                  catch (ManifoldCFException e)
-                  {
-                    if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                      throw e;
-                    Logging.authorityService.warn("Authority error: "+e.getMessage(),e);
-                    response = AuthorityConnectorFactory.getDefaultAuthorizationResponse(threadContext,theRequest.getAuthorityConnection().getClassName(),theRequest.getUserID());
-                  }
-
-                }
-              }
-              finally
-              {
-                authorityConnectorPool.release(theRequest.getAuthorityConnection(),connector);
-              }
-            }
-            catch (ManifoldCFException e)
-            {
-              if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                throw e;
-              Logging.authorityService.warn("Authority connection exception: "+e.getMessage(),e);
-              response = AuthorityConnectorFactory.getDefaultAuthorizationResponse(threadContext,theRequest.getAuthorityConnection().getClassName(),theRequest.getUserID());
-              if (response == null)
-                exception = e;
-            }
-            catch (Throwable e)
-            {
-              Logging.authorityService.warn("Authority connection error: "+e.getMessage(),e);
-              response = AuthorityConnectorFactory.getDefaultAuthorizationResponse(threadContext,theRequest.getAuthorityConnection().getClassName(),theRequest.getUserID());
-              if (response == null)
-                exception = e;
-            }
-          }
-
-          // The request is complete
-          theRequest.completeRequest(response,exception);
-
-          // Repeat, and only go to sleep if there are no more requests.
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          // Log it, but keep the thread alive
-          Logging.authorityService.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.authorityService.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      // Severe error on initialization
-      System.err.println("Authority service auth check thread could not start - shutting down");
-      Logging.authorityService.fatal("AuthCheckThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/AuthRequest.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/AuthRequest.java
deleted file mode 100644
index 2f59871..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/AuthRequest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* $Id: AuthRequest.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-/** This class describes a authorization request.  The request has state: It can be in an incomplete state, or it can be in a complete state.
-* The thread that cares whether the request is complete needs to be able to wait for that situation to occur, so the request has
-* a method that does just that.
-*/
-public class AuthRequest
-{
-  public static final String _rcsid = "@(#)$Id: AuthRequest.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // This is where the request data actually lives
-  protected String userID;
-  protected final IAuthorityConnection authorityConnection;
-  protected final String identifyingString;
-
-  // These are the possible results of the request
-  protected boolean answerComplete = false;
-  protected AuthorizationResponse answerResponse = null;
-  protected Throwable answerException = null;
-
-  /** Construct the request, and record the question.
-  */
-  public AuthRequest(IAuthorityConnection authorityConnection, String identifyingString)
-  {
-    this.authorityConnection = authorityConnection;
-    this.identifyingString = identifyingString;
-  }
-
-  /** Set the user ID we'll be using */
-  public void setUserID(String userID)
-  {
-    this.userID = userID;
-  }
-  
-  /** Get the user id */
-  public String getUserID()
-  {
-    return userID;
-  }
-
-  /** Get the authority connection */
-  public IAuthorityConnection getAuthorityConnection()
-  {
-    return authorityConnection;
-  }
-
-  /** Get the identifying string, to pass back to the user if there was a problem */
-  public String getIdentifyingString()
-  {
-    return identifyingString;
-  }
-
-  /** Wait for an auth request to be complete.
-  */
-  public void waitForComplete()
-    throws InterruptedException
-  {
-    synchronized (this)
-    {
-      if (answerComplete)
-        return;
-      this.wait();
-    }
-  }
-
-  /** Note that the request is complete, and record the answers.
-  */
-  public void completeRequest(AuthorizationResponse answerResponse, Throwable answerException)
-  {
-    synchronized (this)
-    {
-      if (answerComplete)
-        return;
-
-      // Record the answer.
-      answerComplete = true;
-      this.answerResponse = answerResponse;
-      this.answerException = answerException;
-
-      // Notify threads waiting on the answer.
-      this.notifyAll();
-    }
-  }
-
-  /** Get the answer tokens */
-  public AuthorizationResponse getAnswerResponse()
-  {
-    return answerResponse;
-  }
-
-  /** Get the answer exception */
-  public Throwable getAnswerException()
-  {
-    return answerException;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/IdleCleanupThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/IdleCleanupThread.java
deleted file mode 100644
index c390088..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/IdleCleanupThread.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/* $Id: IdleCleanupThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically calls the cleanup method in all connected repository connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class IdleCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: IdleCleanupThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-
-
-  /** Constructor.
-  */
-  public IdleCleanupThread()
-    throws ManifoldCFException
-  {
-    super();
-    setName("Authorities idle cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
-      IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Do the cleanup
-          authorityConnectorPool.pollAllConnectors();
-          mappingConnectorPool.pollAllConnectors();
-          // Poll all basic services
-          ManifoldCF.pollAll(threadContext);
-          
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          // Log it, but keep the thread alive
-          Logging.authorityService.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.authorityService.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("Authority service idle cleanup could not start - shutting down");
-      Logging.authorityService.fatal("IdleCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/Logging.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/Logging.java
deleted file mode 100644
index 7101356..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/Logging.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-import org.apache.log4j.Logger;
-
-/** This class furnishes the logging environment for the authorities application.
-*/
-public class Logging extends org.apache.manifoldcf.core.system.Logging
-{
-
-  // Public logger objects
-  public static Logger authorityService = null;
-  public static Logger authorityConnectors = null;
-  public static Logger mappingConnectors = null;
-
-  /** Initialize logger setup.
-  */
-  public static synchronized void initializeLoggers()
-  {
-    org.apache.manifoldcf.core.system.Logging.initializeLoggers();
-
-    if (authorityService != null)
-      return;
-
-    // package loggers
-    authorityService = newLogger("org.apache.manifoldcf.authorityservice");
-    authorityConnectors = newLogger("org.apache.manifoldcf.authorityconnectors");
-    mappingConnectors = newLogger("org.apache.manifoldcf.mappingconnectors");
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/ManifoldCF.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/ManifoldCF.java
deleted file mode 100644
index 0be8832..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/ManifoldCF.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/* $Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-public class ManifoldCF extends org.apache.manifoldcf.core.system.ManifoldCF
-{
-  // Initialization needed flag
-  protected static boolean authoritiesInitialized = false;
-  
-  // Threads
-  protected static IdleCleanupThread idleCleanupThread = null;
-  protected static AuthCheckThread[] authCheckThreads = null;
-  protected static MappingThread[] mappingThreads = null;
-
-  // Number of auth check threads
-  protected static int numAuthCheckThreads = 0;
-  // Number of mapping threads
-  protected static int numMappingThreads = 0;
-  
-  protected static final String authCheckThreadCountProperty = "org.apache.manifoldcf.authorityservice.threads";
-  protected static final String mappingThreadCountProperty = "org.apache.manifoldcf.authorityservice.mappingthreads";
-
-  // Request queue
-  protected static RequestQueue<AuthRequest> requestQueue = null;
-  // Mapping request queue
-  protected static RequestQueue<MappingRequest> mappingRequestQueue = null;
-  
-  /** Initialize environment.
-  */
-  public static void initializeEnvironment(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      org.apache.manifoldcf.core.system.ManifoldCF.initializeEnvironment(tc);
-      org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
-    }
-  }
-
-  public static void cleanUpEnvironment(IThreadContext tc)
-  {
-    synchronized (initializeFlagLock)
-    {
-      org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
-      org.apache.manifoldcf.core.system.ManifoldCF.cleanUpEnvironment(tc);
-    }
-  }
-
-  public static void localInitialize(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      if (authoritiesInitialized)
-        return;
-
-      Logging.initializeLoggers();
-      Logging.setLogLevels(tc);
-      authoritiesInitialized = true;
-    }
-  }
-  
-  public static void localCleanup(IThreadContext tc)
-  {
-    // Since pools are a shared resource, we clean them up only
-    // when we are certain nothing else is using them in the JVM.
-    try
-    {
-      AuthorityConnectorPoolFactory.make(tc).closeAllConnectors();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (Logging.authorityService != null)
-        Logging.authorityService.warn("Exception closing authority connection pool: "+e.getMessage(),e);
-    }
-    try
-    {
-      MappingConnectorPoolFactory.make(tc).closeAllConnectors();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (Logging.authorityService != null)
-        Logging.authorityService.warn("Exception closing mapping connection pool: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Install all the authority manager system tables.
-  *@param threadcontext is the thread context.
-  */
-  public static void installSystemTables(IThreadContext threadcontext)
-    throws ManifoldCFException
-  {
-    IAuthorizationDomainManager domainMgr = AuthorizationDomainManagerFactory.make(threadcontext);
-    IAuthorityGroupManager groupMgr = AuthorityGroupManagerFactory.make(threadcontext);
-    IAuthorityConnectorManager connMgr = AuthorityConnectorManagerFactory.make(threadcontext);
-    IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(threadcontext);
-    IMappingConnectorManager mappingConnectorMgr = MappingConnectorManagerFactory.make(threadcontext);
-    IMappingConnectionManager mappingConnectionMgr = MappingConnectionManagerFactory.make(threadcontext);
-
-    domainMgr.install();
-    connMgr.install();
-    mappingConnectorMgr.install();
-    groupMgr.install();
-    authConnMgr.install();
-    mappingConnectionMgr.install();
-  }
-
-  /** Uninstall all the authority manager system tables.
-  *@param threadcontext is the thread context.
-  */
-  public static void deinstallSystemTables(IThreadContext threadcontext)
-    throws ManifoldCFException
-  {
-    IAuthorizationDomainManager domainMgr = AuthorizationDomainManagerFactory.make(threadcontext);
-    IAuthorityConnectorManager connMgr = AuthorityConnectorManagerFactory.make(threadcontext);
-    IAuthorityGroupManager groupMgr = AuthorityGroupManagerFactory.make(threadcontext);
-    IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(threadcontext);
-    IMappingConnectorManager mappingConnectorMgr = MappingConnectorManagerFactory.make(threadcontext);
-    IMappingConnectionManager mappingConnectionMgr = MappingConnectionManagerFactory.make(threadcontext);
-
-    mappingConnectionMgr.deinstall();
-    authConnMgr.deinstall();
-    groupMgr.deinstall();
-    mappingConnectorMgr.deinstall();
-    connMgr.deinstall();
-    domainMgr.deinstall();
-  }
-
-  /** Start the authority system.
-  */
-  public static void startSystem(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Read any parameters
-    numAuthCheckThreads = LockManagerFactory.getIntProperty(threadContext, authCheckThreadCountProperty, 10);
-    if (numAuthCheckThreads < 1 || numAuthCheckThreads > 100)
-      throw new ManifoldCFException("Illegal value for the number of auth check threads");
-
-    numMappingThreads = LockManagerFactory.getIntProperty(threadContext, mappingThreadCountProperty, 10);
-    if (numMappingThreads < 1 || numMappingThreads > 100)
-      throw new ManifoldCFException("Illegal value for the number of mapping threads");
-
-    // Start up threads
-    idleCleanupThread = new IdleCleanupThread();
-    idleCleanupThread.start();
-
-    requestQueue = new RequestQueue<AuthRequest>();
-    mappingRequestQueue = new RequestQueue<MappingRequest>();
-
-    authCheckThreads = new AuthCheckThread[numAuthCheckThreads];
-    for (int i = 0; i < numAuthCheckThreads; i++)
-    {
-      authCheckThreads[i] = new AuthCheckThread(Integer.toString(i),requestQueue);
-      authCheckThreads[i].start();
-    }
-    
-    mappingThreads = new MappingThread[numMappingThreads];
-    for (int i = 0; i < numMappingThreads; i++)
-    {
-      mappingThreads[i] = new MappingThread(Integer.toString(i),mappingRequestQueue);
-      mappingThreads[i].start();
-    }
-
-  }
-
-  /** Shut down the authority system.
-  */
-  public static void stopSystem(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-
-    while (idleCleanupThread != null || authCheckThreads != null || mappingThreads != null)
-    {
-      if (idleCleanupThread != null)
-      {
-        idleCleanupThread.interrupt();
-      }
-      if (authCheckThreads != null)
-      {
-        for (int i = 0; i < authCheckThreads.length; i++)
-        {
-          Thread authCheckThread = authCheckThreads[i];
-          if (authCheckThread != null)
-            authCheckThread.interrupt();
-        }
-      }
-      if (mappingThreads != null)
-      {
-        for (int i = 0; i < mappingThreads.length; i++)
-        {
-          Thread mappingThread = mappingThreads[i];
-          if (mappingThread != null)
-            mappingThread.interrupt();
-        }
-      }
-      
-      if (idleCleanupThread != null)
-      {
-        if (!idleCleanupThread.isAlive())
-          idleCleanupThread = null;
-      }
-      if (authCheckThreads != null)
-      {
-        boolean isAlive = false;
-        for (int i = 0; i < authCheckThreads.length; i++)
-        {
-          Thread authCheckThread = authCheckThreads[i];
-          if (authCheckThread != null)
-          {
-            if (!authCheckThread.isAlive())
-              authCheckThreads[i] = null;
-            else
-              isAlive = true;
-          }
-          i++;
-        }
-        if (!isAlive)
-          authCheckThreads = null;
-      }
-
-      if (mappingThreads != null)
-      {
-        boolean isAlive = false;
-        for (int i = 0; i < mappingThreads.length; i++)
-        {
-          Thread mappingThread = mappingThreads[i];
-          if (mappingThread != null)
-          {
-            if (!mappingThread.isAlive())
-              mappingThreads[i] = null;
-            else
-              isAlive = true;
-          }
-          i++;
-        }
-        if (!isAlive)
-          mappingThreads = null;
-      }
-
-      try
-      {
-        ManifoldCF.sleep(1000);
-      }
-      catch (InterruptedException e)
-      {
-      }
-    }
-
-    // Release all authority connectors
-    AuthorityConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
-    numAuthCheckThreads = 0;
-    requestQueue = null;
-    MappingConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
-    numMappingThreads = 0;
-    mappingRequestQueue = null;
-  }
-
-  /** Get the current request queue */
-  public static RequestQueue<AuthRequest> getRequestQueue()
-  {
-    return requestQueue;
-  }
-
-  /** Get the current mapping request queue */
-  public static RequestQueue<MappingRequest> getMappingRequestQueue()
-  {
-    return mappingRequestQueue;
-  }
-  
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/MappingRequest.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/MappingRequest.java
deleted file mode 100644
index f51b4f2..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/MappingRequest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-/** This class describes a user mapping request.  The request has state: It can be in an incomplete state, or it can be in a complete state.
-* The thread that cares whether the request is complete needs to be able to wait for that situation to occur, so the request has
-* a method that does just that.
-*/
-public class MappingRequest
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // This is where the request data actually lives
-  protected String userID;
-  protected final IMappingConnection mappingConnection;
-  protected final String identifyingString;
-
-  // These are the possible results of the request
-  protected boolean answerComplete = false;
-  protected String outputUserID = null;
-  protected Throwable answerException = null;
-
-  /** Construct the request, and record the question.
-  */
-  public MappingRequest(IMappingConnection mappingConnection, String identifyingString)
-  {
-    this.mappingConnection = mappingConnection;
-    this.identifyingString = identifyingString;
-  }
-
-  /** Set the user ID we'll be using */
-  public void setUserID(String userID)
-  {
-    this.userID = userID;
-  }
-  
-  /** Get the user ID */
-  public String getUserID()
-  {
-    return userID;
-  }
-  
-  /** Get the mapping connection.
-  */
-  public IMappingConnection getMappingConnection()
-  {
-    return mappingConnection;
-  }
-
-  /** Get the identifying string, to pass back to the user if there was a problem */
-  public String getIdentifyingString()
-  {
-    return identifyingString;
-  }
-
-  /** Wait for an auth request to be complete.
-  */
-  public void waitForComplete()
-    throws InterruptedException
-  {
-    synchronized (this)
-    {
-      if (answerComplete)
-        return;
-      this.wait();
-    }
-  }
-
-  /** Note that the request is complete, and record the answers.
-  */
-  public void completeRequest(String outputUserID, Throwable answerException)
-  {
-    synchronized (this)
-    {
-      if (answerComplete)
-        return;
-
-      // Record the answer.
-      answerComplete = true;
-      this.outputUserID = outputUserID;
-      this.answerException = answerException;
-
-      // Notify threads waiting on the answer.
-      this.notifyAll();
-    }
-  }
-
-  /** Get the answer user */
-  public String getAnswerResponse()
-  {
-    return outputUserID;
-  }
-
-  /** Get the answer exception */
-  public Throwable getAnswerException()
-  {
-    return answerException;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/MappingThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/MappingThread.java
deleted file mode 100644
index fd1fe45..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/MappingThread.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.authorities.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread performs actual user mapping operations.
-*/
-public class MappingThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Local data
-  protected RequestQueue<MappingRequest> requestQueue;
-
-  /** Constructor.
-  */
-  public MappingThread(String id, RequestQueue<MappingRequest> requestQueue)
-    throws ManifoldCFException
-  {
-    super();
-    this.requestQueue = requestQueue;
-    setName("Mapping thread "+id);
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    // Create a thread context object.
-    IThreadContext threadContext = ThreadContextFactory.make();
-    try
-    {
-      IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Wait for a request.
-          MappingRequest theRequest = requestQueue.getRequest();
-
-          // Try to fill the request before going back to sleep.
-          if (Logging.authorityService.isDebugEnabled())
-          {
-            Logging.authorityService.debug(" Calling mapping connector class '"+theRequest.getMappingConnection().getClassName()+"'");
-          }
-
-          String outputUserID = null;
-          Throwable exception = null;
-
-          // Only try a mapping if we have a user to map...
-          if (theRequest.getUserID() != null)
-          {
-            try
-            {
-              IMappingConnector connector = mappingConnectorPool.grab(theRequest.getMappingConnection());
-              try
-              {
-                if (connector == null)
-                  exception = new ManifoldCFException("Mapping connector "+theRequest.getMappingConnection().getClassName()+" is not registered.");
-                else
-                {
-                  // Do the mapping
-                  try
-                  {
-                    outputUserID = connector.mapUser(theRequest.getUserID());
-                  }
-                  catch (ManifoldCFException e)
-                  {
-                    if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                      throw e;
-                    Logging.authorityService.warn("Mapping error: "+e.getMessage(),e);
-                  }
-
-                }
-              }
-              finally
-              {
-                mappingConnectorPool.release(theRequest.getMappingConnection(),connector);
-              }
-            }
-            catch (ManifoldCFException e)
-            {
-              if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                throw e;
-              Logging.authorityService.warn("Mapping connection exception: "+e.getMessage(),e);
-              exception = e;
-            }
-            catch (Throwable e)
-            {
-              Logging.authorityService.warn("Mapping connection error: "+e.getMessage(),e);
-              exception = e;
-            }
-          }
-
-          // The request is complete
-          theRequest.completeRequest(outputUserID, exception);
-
-          // Repeat, and only go to sleep if there are no more requests.
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          // Log it, but keep the thread alive
-          Logging.authorityService.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.authorityService.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      // Severe error on initialization
-      System.err.println("Authority service mapping thread could not start - shutting down");
-      Logging.authorityService.fatal("MappingThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/RequestQueue.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/RequestQueue.java
deleted file mode 100644
index 5bba282..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/authorities/system/RequestQueue.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id: RequestQueue.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.authorities.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import java.util.*;
-
-/** This class describes a authorization request queue, which has a "stuffer" servlet and many "reader" threads.
-* The queue manages thread synchronization so that (a) the "stuffer" servlet blindly appends authority requests, and
-* then waits for these requests to be completed, and
-* (b) the "reader" threads block if queue is empty.
-* The objects being queued are all AuthRequest objects.
-*/
-public class RequestQueue<T>
-{
-  public static final String _rcsid = "@(#)$Id: RequestQueue.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Since the queue has a maximum size, an ArrayList is a fine way to keep it
-  protected List<T> queue = new ArrayList<T>();
-
-  /** Constructor.
-  */
-  public RequestQueue()
-  {
-  }
-
-  /** Add a request to the queue.
-  *@param dd is the request.
-  */
-  public void addRequest(T dd)
-  {
-    synchronized (queue)
-    {
-      queue.add(dd);
-      queue.notify();
-    }
-  }
-
-  /** Pull the next request off the queue, but wait if there is
-  * nothing there.
-  *@return the request to be processed.
-  */
-  public T getRequest()
-    throws InterruptedException
-  {
-    synchronized (queue)
-    {
-      // If queue is empty, go to sleep
-      while (queue.size() == 0)
-        queue.wait();
-
-      return queue.remove(queue.size()-1);
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/AbortJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/AbortJob.java
deleted file mode 100644
index e29b020..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/AbortJob.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: AbortJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class AbortJob
-{
-  public static final String _rcsid = "@(#)$Id: AbortJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private AbortJob()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: AbortJob <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.manualAbort(new Long(jobID));
-      System.err.println("Job aborting");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/AddScheduledTime.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/AddScheduledTime.java
deleted file mode 100644
index 2280487..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/AddScheduledTime.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/* $Id: AddScheduledTime.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class AddScheduledTime
-{
-  public static final String _rcsid = "@(#)$Id: AddScheduledTime.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private AddScheduledTime()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 8 && args.length != 9)
-    {
-      System.err.println("Usage: AddScheduledTime <jobid> <interval_minutes> <day_of_week_list>");
-      System.err.println("      <day_of_month_list> <month_list> <year_list> <hour_list> <minute_list> [<request_minimum>]");
-      System.err.println("");
-      System.err.println("If <interval_minutes> is an empty string, no interval limit");
-      System.err.println("All lists are comma-separated");
-      System.err.println("All list values can be empty to indicate no constraint");
-      System.err.println("Days of week are lower case, full day names, e.g. tuesday");
-      System.err.println("Months are full month names in lower case, e.g. january");
-      System.err.println("Years are full year values, e.g. 1999");
-      System.err.println("Hours include am or pm in lower case, e.g. 12am or 2pm");
-      System.err.println("<request_minimum> is 'true' or 'false'");
-
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-    String interval = args[1];
-    String dayOfWeekList = args[2];
-    String dayOfMonthList = args[3];
-    String monthList = args[4];
-    String yearList = args[5];
-    String hourList = args[6];
-    String minuteList = args[7];
-    String requestMinimum;
-    if (args.length == 9)
-      requestMinimum = args[8];
-    else
-      requestMinimum = "false";
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-
-      IJobDescription desc = jobManager.load(new Long(jobID));
-      if (desc == null)
-        throw new ManifoldCFException("No such job: '"+jobID+"'");
-
-      ScheduleRecord sr = new ScheduleRecord(
-        parseDayOfWeek(dayOfWeekList),
-        parseMonthOfYear(monthList),
-        parseDayOfMonth(dayOfMonthList),
-        parseYear(yearList),
-        parseHourOfDay(hourList),
-        parseMinutes(minuteList),
-        null,
-        (interval.length()>0)?new Long(interval):null,
-        requestMinimum.equals("true"));
-
-      desc.addScheduleRecord(sr);
-      jobManager.save(desc);
-
-      System.out.println("Job updated");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static EnumeratedValues parseDayOfWeek(String list)
-    throws Exception
-  {
-    if (list.length() == 0)
-      return null;
-
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      if (index != 0)
-        sb.append(",");
-      int newIndex = list.indexOf(",",index);
-      if (newIndex == -1)
-      {
-        sb.append(new Integer(mapToWeekday(list.substring(index))).toString());
-        break;
-      }
-      sb.append(new Integer(mapToWeekday(list.substring(index,newIndex))).toString());
-      index = newIndex+1;
-    }
-    return new EnumeratedValues(sb.toString());
-  }
-
-  protected static int mapToWeekday(String day)
-    throws Exception
-  {
-    if (day.equals("sunday"))
-      return 0;
-    if (day.equals("monday"))
-      return 1;
-    if (day.equals("tuesday"))
-      return 2;
-    if (day.equals("wednesday"))
-      return 3;
-    if (day.equals("thursday"))
-      return 4;
-    if (day.equals("friday"))
-      return 5;
-    if (day.equals("saturday"))
-      return 6;
-    throw new ManifoldCFException("Bad day of week: '"+day+"'");
-  }
-
-  protected static EnumeratedValues parseMonthOfYear(String list)
-    throws Exception
-  {
-    if (list.length() == 0)
-      return null;
-
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      if (index != 0)
-        sb.append(",");
-      int newIndex = list.indexOf(",",index);
-      if (newIndex == -1)
-      {
-        sb.append(new Integer(mapToMonth(list.substring(index))).toString());
-        break;
-      }
-      sb.append(new Integer(mapToMonth(list.substring(index,newIndex))).toString());
-      index = newIndex+1;
-    }
-    return new EnumeratedValues(sb.toString());
-
-  }
-
-  protected static int mapToMonth(String day)
-    throws Exception
-  {
-    if (day.equals("january"))
-      return 0;
-    if (day.equals("february"))
-      return 1;
-    if (day.equals("march"))
-      return 2;
-    if (day.equals("april"))
-      return 3;
-    if (day.equals("may"))
-      return 4;
-    if (day.equals("june"))
-      return 5;
-    if (day.equals("july"))
-      return 6;
-    if (day.equals("august"))
-      return 7;
-    if (day.equals("september"))
-      return 8;
-    if (day.equals("october"))
-      return 9;
-    if (day.equals("november"))
-      return 10;
-    if (day.equals("december"))
-      return 11;
-
-    throw new ManifoldCFException("Bad month: '"+day+"'");
-  }
-
-  protected static EnumeratedValues parseDayOfMonth(String list)
-    throws Exception
-  {
-    // Zero based internally
-    if (list.length() == 0)
-      return null;
-
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      if (index != 0)
-        sb.append(",");
-      int newIndex = list.indexOf(",",index);
-      if (newIndex == -1)
-      {
-        sb.append(new Integer(new Integer(list.substring(index)).intValue() - 1).toString());
-        break;
-      }
-      sb.append(new Integer(new Integer(list.substring(index,newIndex)).intValue() - 1).toString());
-      index = newIndex+1;
-    }
-    return new EnumeratedValues(sb.toString());
-  }
-
-  protected static EnumeratedValues parseYear(String list)
-    throws Exception
-  {
-    if (list.length() == 0)
-      return null;
-    return new EnumeratedValues(list);
-  }
-
-  protected static EnumeratedValues parseHourOfDay(String list)
-    throws Exception
-  {
-    if (list.length() == 0)
-      return null;
-
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      if (index != 0)
-        sb.append(",");
-      int newIndex = list.indexOf(",",index);
-      if (newIndex == -1)
-      {
-        sb.append(new Integer(mapToHour(list.substring(index))).toString());
-        break;
-      }
-      sb.append(new Integer(mapToHour(list.substring(index,newIndex))).toString());
-      index = newIndex+1;
-    }
-    return new EnumeratedValues(sb.toString());
-
-  }
-
-  protected static int mapToHour(String hour)
-    throws Exception
-  {
-    boolean isPM;
-    String value;
-    if (hour.endsWith("am"))
-    {
-      isPM = false;
-      value = hour.substring(0,hour.length()-2);
-    }
-    else if (hour.endsWith("pm"))
-    {
-      isPM = true;
-      value = hour.substring(0,hour.length()-2);
-    }
-    else
-    {
-      isPM = false;
-      value = hour;
-    }
-
-    int rval = new Integer(value).intValue();
-    if (rval == 12)
-      rval = 0;
-    if (isPM)
-      rval += 12;
-    return rval;
-  }
-
-  protected static EnumeratedValues parseMinutes(String list)
-    throws Exception
-  {
-    if (list.length() == 0)
-      return null;
-
-    return new EnumeratedValues(list);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/BaseCrawlerInitializationCommand.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/BaseCrawlerInitializationCommand.java
deleted file mode 100644
index 11a869c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/BaseCrawlerInitializationCommand.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.IThreadContext;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.core.interfaces.ThreadContextFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/**
- * @author Jettro Coenradie
- */
-public abstract class BaseCrawlerInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    doExecute(tc);
-  }
-
-  protected abstract void doExecute(IThreadContext tc) throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ChangeJobDocSpec.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ChangeJobDocSpec.java
deleted file mode 100644
index 067fc6e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ChangeJobDocSpec.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id: ChangeJobDocSpec.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class ChangeJobDocSpec
-{
-  public static final String _rcsid = "@(#)$Id: ChangeJobDocSpec.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private ChangeJobDocSpec()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: ChangeJobDocSpec <jobid> <filespec_xml>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-    String filespecXML = args[1];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription desc = jobManager.load(new Long(jobID));
-      if (desc == null)
-      {
-        System.err.println("No such job: "+jobID);
-        System.exit(3);
-      }
-      desc.getSpecification().fromXML(filespecXML);
-
-      // Now, save
-      jobManager.save(desc);
-      System.err.println("Job doc spec has been changed");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/CheckConfigured.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/CheckConfigured.java
deleted file mode 100644
index 224a6c6..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/CheckConfigured.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $Id: CheckConfigured.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class CheckConfigured
-{
-  public static final String _rcsid = "@(#)$Id: CheckConfigured.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private CheckConfigured()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 0)
-    {
-      System.err.println("Usage: CheckConfigured");
-      System.exit(1);
-    }
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-      if (connManager.getAllConnections().length > 0)
-        UTF8Stdout.println("CONFIGURED");
-      else
-        UTF8Stdout.println("OK");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DefineJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DefineJob.java
deleted file mode 100644
index 90fe523..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DefineJob.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/* $Id: DefineJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DefineJob
-{
-  public static final String _rcsid = "@(#)$Id: DefineJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DefineJob()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 13)
-    {
-      System.err.println("Usage: DefineJob <description> <connection_name> <type> <start_method> <hopcount_method> <recrawl_interval> <expiration_interval> <reseed_interval> <job_priority> <hop_filters> <filespec_xml>");
-      System.err.println("<type> is one of: continuous or specified");
-      System.err.println("<start_method> is one of: windowbegin, windowinside, disable");
-      System.err.println("<hopcount_method> is one of: accurate, nodelete, neverdelete");
-      System.err.println("<recrawl_interval> is the default document recrawl interval in minutes");
-      System.err.println("<expiration_interval> is the default document expiration interval in minutes");
-      System.err.println("<reseed_interval> is the default document reseed interval in minutes");
-      System.err.println("<job_priority> is the job priority (and integer between 0 and 10)");
-      System.err.println("<hop_filters> is a comma-separated list of tuples, of the form 'linktype=maxhops'");
-      System.err.println("<filespec_xml> is the document specification XML, its form dependent on the connection type");
-      System.exit(-1);
-    }
-
-    String description = args[0];
-    String connectionName = args[1];
-    String typeString = args[2];
-    String startString = args[3];
-    String hopcountString = args[4];
-    String recrawlInterval = args[5];
-    String expirationInterval = args[6];
-    String reseedInterval = args[7];
-    String jobPriority = args[8];
-    String hopFilters = args[9];
-    String filespecXML = args[10];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription desc = jobManager.createJob();
-
-      desc.setDescription(description);
-      desc.setConnectionName(connectionName);
-
-      if (typeString.equals("continuous"))
-        desc.setType(IJobDescription.TYPE_CONTINUOUS);
-      else if (typeString.equals("specified"))
-        desc.setType(IJobDescription.TYPE_SPECIFIED);
-      else
-        throw new ManifoldCFException("Unknown type: '"+typeString+"'");
-      if (startString.equals("windowbegin"))
-        desc.setStartMethod(IJobDescription.START_WINDOWBEGIN);
-      else if (startString.equals("windowinside"))
-        desc.setStartMethod(IJobDescription.START_WINDOWINSIDE);
-      else if (startString.equals("disable"))
-        desc.setStartMethod(IJobDescription.START_DISABLE);
-      else
-        throw new ManifoldCFException("Unknown start method: '"+startString+"'");
-
-      if (hopcountString.equals("accurate"))
-        desc.setHopcountMode(IJobDescription.HOPCOUNT_ACCURATE);
-      else if (hopcountString.equals("nodelete"))
-        desc.setHopcountMode(IJobDescription.HOPCOUNT_NODELETE);
-      else if (hopcountString.equals("neverdelete"))
-        desc.setHopcountMode(IJobDescription.HOPCOUNT_NEVERDELETE);
-      else
-        throw new ManifoldCFException("Unknown hopcount mode: '"+hopcountString+"'");
-      
-      if (recrawlInterval.length() > 0)
-        desc.setInterval(new Long(recrawlInterval));
-      if (expirationInterval.length() > 0)
-        desc.setExpiration(new Long(expirationInterval));
-      if (reseedInterval.length() > 0)
-        desc.setReseedInterval(new Long(reseedInterval));
-      desc.setPriority(Integer.parseInt(jobPriority));
-      
-      String[] hopFilterSet = hopFilters.split(",");
-      int i = 0;
-      while (i < hopFilterSet.length)
-      {
-        String hopFilter = hopFilterSet[i++];
-        if (hopFilter != null && hopFilter.length() > 0)
-        {
-            String[] stuff = hopFilter.trim().split("=");
-            if (stuff != null && stuff.length == 2)
-          desc.addHopCountFilter(stuff[0],((stuff[1].length()>0)?new Long(stuff[1]):null));
-        }
-      }
-      
-      desc.getSpecification().fromXML(filespecXML);
-      
-      // Now, save
-      jobManager.save(desc);
-
-      System.out.print(desc.getID().toString());
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(-2);
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DefineRepositoryConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DefineRepositoryConnection.java
deleted file mode 100644
index 087662e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DefineRepositoryConnection.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id: DefineRepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DefineRepositoryConnection
-{
-  public static final String _rcsid = "@(#)$Id: DefineRepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DefineRepositoryConnection()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length < 5)
-    {
-      System.err.println("Usage: DefineRepositoryConnection <connection_name> <description> <connector_class> <authority_name> <pool_max> <param1>=<value1> ...");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String description = args[1];
-    String connectorClass = args[2];
-    String authorityName = args[3];
-    String poolMax = args[4];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection conn = mgr.create();
-      conn.setName(connectionName);
-      conn.setDescription(description);
-      conn.setClassName(connectorClass);
-      if (authorityName.length() > 0)
-        conn.setACLAuthority(authorityName);
-      conn.setMaxConnections(new Integer(poolMax).intValue());
-      ConfigParams x = conn.getConfigParams();
-      int i = 5;
-      while (i < args.length)
-      {
-        String arg = args[i++];
-        // Parse
-        int pos = arg.indexOf("=");
-        if (pos == -1)
-          throw new ManifoldCFException("Argument missing =");
-        String name = arg.substring(0,pos);
-        String value = arg.substring(pos+1);
-        if (name.endsWith("assword"))
-          x.setObfuscatedParameter(name,value);
-        else
-          x.setParameter(name,value);
-      }
-
-      // Now, save
-      mgr.save(conn);
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DeleteJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DeleteJob.java
deleted file mode 100644
index 5a2f83a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DeleteJob.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id: DeleteJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DeleteJob
-{
-  public static final String _rcsid = "@(#)$Id: DeleteJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DeleteJob()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: DeleteJob <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.deleteJob(new Long(jobID));
-      System.out.println("Job deleting");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DeleteRepositoryConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DeleteRepositoryConnection.java
deleted file mode 100644
index 6d2842d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/DeleteRepositoryConnection.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: DeleteRepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class DeleteRepositoryConnection
-{
-  public static final String _rcsid = "@(#)$Id: DeleteRepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private DeleteRepositoryConnection()
-  {
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: DeleteRepositoryConnection <connection_name>");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-      mgr.delete(connectionName);
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-
-
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ExportConfiguration.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ExportConfiguration.java
deleted file mode 100644
index ec3b98c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ExportConfiguration.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id: ExportConfiguration.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/**
- * This class provides a script hook to export the crawler configuration to a file.
- */
-public class ExportConfiguration extends BaseCrawlerInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: ExportConfiguration.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String exportFilename;
-  private final String passCode;
-
-  public ExportConfiguration(String exportFilename, String passCode)
-  {
-    this.exportFilename = exportFilename;
-    this.passCode = passCode;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ManifoldCF.exportConfiguration(tc,exportFilename, passCode);
-    Logging.root.info("Configuration exported");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1 && args.length != 2)
-    {
-      System.err.println("Usage: ExportConfiguration <filename> [<passcode>]");
-      System.exit(1);
-    }
-
-    String exportFilename = args[0];
-    String passCode = (args.length == 2) ? args[1] : null;
-
-    try
-    {
-      ExportConfiguration exportConfiguration = new ExportConfiguration(exportFilename, passCode);
-      exportConfiguration.execute();
-      System.err.println("Configuration exported");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/FindJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/FindJob.java
deleted file mode 100644
index a65c05c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/FindJob.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $Id: FindJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class converts a job name into a job identifier.
-* Warning: Since multiple jobs can have the same name, a list of job identifiers will be returned.
-*/
-public class FindJob
-{
-  public static final String _rcsid = "@(#)$Id: FindJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private FindJob()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: FindJob <job_name>");
-      System.exit(1);
-    }
-
-    String jobName = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription[] jobs = jobManager.getAllJobs();
-      int i = 0;
-      while (i < jobs.length)
-      {
-        IJobDescription jobDesc = jobs[i++];
-        if (jobDesc.getDescription().equals(jobName))
-          UTF8Stdout.println(jobDesc.getID().toString());
-      }
-      System.err.println("Job search done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/GetJobSchedule.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/GetJobSchedule.java
deleted file mode 100644
index 6377be7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/GetJobSchedule.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/* $Id: GetJobSchedule.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class gets the schedule records associated with a job.
-*/
-public class GetJobSchedule
-{
-  public static final String _rcsid = "@(#)$Id: GetJobSchedule.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private GetJobSchedule()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: GetJobSchedule <job_id>");
-      System.err.println("");
-      System.err.println("The result will be UTF-8 encoded and will consist of the following columns:");
-      System.err.println("    daysofweek,years,months,days,hours,minutes,timezone,duration,requestminimum");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-
-      IJobDescription job = jobManager.load(new Long(jobID));
-      if (job == null)
-        throw new ManifoldCFException("No such job: "+jobID);
-
-      int i = 0;
-      while (i < job.getScheduleRecordCount())
-      {
-        ScheduleRecord sr = job.getScheduleRecord(i++);
-
-        // daysofweek,years,months,days,hours,minutes,timezone,duration
-        UTF8Stdout.println(enumerate(sr.getDayOfWeek())+","+
-          enumerate(sr.getYear())+","+
-          enumerate(sr.getMonthOfYear())+","+
-          enumerate(sr.getDayOfMonth())+","+
-          enumerate(sr.getHourOfDay())+","+
-          enumerate(sr.getMinutesOfHour())+","+
-          ((sr.getTimezone()==null)?"":sr.getTimezone())+","+
-          presentInterval(sr.getDuration())+","+
-          (sr.getRequestMinimum()?"true":"false"));
-      }
-      System.err.println("Schedule list done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String enumerate(EnumeratedValues ev)
-  {
-    if (ev == null)
-      return "any";
-    StringBuilder sb = new StringBuilder();
-    Iterator iter = ev.getValues();
-    boolean first = true;
-    while (iter.hasNext())
-    {
-      Integer val = (Integer)iter.next();
-      if (first)
-        first = false;
-      else
-        sb.append(";");
-      sb.append(val.toString());
-    }
-    return sb.toString();
-  }
-
-  protected static String presentInterval(Long interval)
-  {
-    if (interval == null)
-      return "infinite";
-    else
-      return interval.toString();
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ImportConfiguration.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ImportConfiguration.java
deleted file mode 100644
index ca16aeb..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ImportConfiguration.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id: ImportConfiguration.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/**
- * This class provides a script hook to allow import of crawler configuration information from a file.
- */
-public class ImportConfiguration extends BaseCrawlerInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: ImportConfiguration.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String importFilename;
-  private final String passCode;
-
-  public ImportConfiguration(String importFilename, String passCode)
-  {
-    this.importFilename = importFilename;
-    this.passCode = passCode;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    ManifoldCF.importConfiguration(tc,importFilename, passCode);
-    Logging.root.info("Configuration imported");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1 && args.length != 2)
-    {
-      System.err.println("Usage: ImportConfiguration <filename> [<passcode>]");
-      System.exit(1);
-    }
-
-    String importFilename = args[0];
-    String passCode = (args.length == 2) ? args[1] : null;
-
-    try
-    {
-      ImportConfiguration importConfiguration = new ImportConfiguration(importFilename, passCode);
-      importConfiguration.execute();
-      System.err.println("Configuration imported");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/InitializeAndRegister.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/InitializeAndRegister.java
deleted file mode 100644
index 23524c1..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/InitializeAndRegister.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.File;
-
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.core.interfaces.*;
-
-public class InitializeAndRegister
-{
-    public static final String _rcsid = "@(#)$Id$";
-
-    private InitializeAndRegister()
-    {
-    }
-    
-    protected void doExecute(IThreadContext tc) throws ManifoldCFException 
-    {
-      // Do the basic initialization of the database and its schema
-      ManifoldCF.createSystemDatabase(tc);
-      
-      ManifoldCF.installTables(tc);
-
-      org.apache.manifoldcf.crawler.system.ManifoldCF.registerThisAgent(tc);
-      
-      ManifoldCF.reregisterAllConnectors(tc);
-    }
-    
-    public static void main(String[] args)
-    {
-      if (args.length > 0)
-      {
-        System.err.println("Usage: InitializeAndRegister");
-        System.exit(1);
-      }
-
-      try
-      {
-        IThreadContext tc = ThreadContextFactory.make();
-        ManifoldCF.initializeEnvironment(tc);
-      
-        InitializeAndRegister register = new InitializeAndRegister();
-        register.doExecute(tc);
-        
-        System.err.println("Successfully initialized database and registered all connectors");
-      }
-      catch (ManifoldCFException e)
-      {
-        e.printStackTrace();
-        System.exit(1);
-      }
-    }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ListJobStatuses.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ListJobStatuses.java
deleted file mode 100644
index 2dda179..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ListJobStatuses.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/* $Id: ListJobStatuses.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class lists the status of all jobs presently being handled by the connector framework.
-*/
-public class ListJobStatuses
-{
-  public static final String _rcsid = "@(#)$Id: ListJobStatuses.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  private ListJobStatuses()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 0)
-    {
-      System.err.println("Usage: ListJobStatuses");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, UTF-8 encoded, and will contain the following columns:");
-      System.err.println("    identifier,description,status,inqueue,outstanding,processed,starttime,endtime,errortext");
-      System.exit(1);
-    }
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      JobStatus[] jobStatuses = jobManager.getAllStatus();
-
-      int i = 0;
-      while (i < jobStatuses.length)
-      {
-        JobStatus jobStatus = jobStatuses[i++];
-
-        // identifier,description,status,inqueue,outstanding,processed,starttime,endtime,errortext
-        UTF8Stdout.println(jobStatus.getJobID().toString()+","+
-          ((jobStatus.getDescription()==null)?"":commaEscape(jobStatus.getDescription()))+","+
-          statusMap(jobStatus.getStatus())+","+
-          new Long(jobStatus.getDocumentsInQueue()).toString()+","+
-          new Long(jobStatus.getDocumentsOutstanding()).toString()+","+
-          new Long(jobStatus.getDocumentsProcessed()).toString()+","+
-          new Long(jobStatus.getStartTime()).toString()+","+
-          new Long(jobStatus.getEndTime()).toString()+","+
-          ((jobStatus.getErrorText()==null)?"":commaEscape(jobStatus.getErrorText())));
-
-      }
-      System.err.println("Job status list done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String statusMap(int status)
-  {
-    switch (status)
-    {
-    case JobStatus.JOBSTATUS_NOTYETRUN:
-      return "not yet run";
-    case JobStatus.JOBSTATUS_RUNNING:
-      return "running";
-    case JobStatus.JOBSTATUS_PAUSED:
-      return "paused";
-    case JobStatus.JOBSTATUS_COMPLETED:
-      return "done";
-    case JobStatus.JOBSTATUS_WINDOWWAIT:
-      return "waiting";
-    case JobStatus.JOBSTATUS_STARTING:
-      return "starting up";
-    case JobStatus.JOBSTATUS_DESTRUCTING:
-      return "cleaning up";
-    case JobStatus.JOBSTATUS_ERROR:
-      return "error";
-    case JobStatus.JOBSTATUS_ABORTING:
-      return "aborting";
-    case JobStatus.JOBSTATUS_RESTARTING:
-      return "restarting";
-    case JobStatus.JOBSTATUS_RUNNING_UNINSTALLED:
-      return "running no connector";
-    case JobStatus.JOBSTATUS_JOBENDCLEANUP:
-      return "terminating";
-    case JobStatus.JOBSTATUS_JOBENDNOTIFICATION:
-      return "notifying";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ListJobs.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ListJobs.java
deleted file mode 100644
index 2cded9c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/ListJobs.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/* $Id: ListJobs.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class lists all jobs presently being handled by the connector framework.
-*/
-public class ListJobs
-{
-  public static final String _rcsid = "@(#)$Id: ListJobs.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private ListJobs()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 0)
-    {
-      System.err.println("Usage: ListJobs");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, will be UTF-8 encoded, and will contain the following columns:");
-      System.err.println("    identifier,description,connection,startmode,runmode,hopcountmode,priority,rescaninterval,expirationinterval,reseedinterval");
-      System.exit(1);
-    }
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription[] jobs = jobManager.getAllJobs();
-
-      int i = 0;
-      while (i < jobs.length)
-      {
-        IJobDescription job = jobs[i++];
-
-        //identifier,description,connection,startmode,runmode,hopcountmode,priority,rescaninterval,expirationinterval,reseedinterval
-
-        UTF8Stdout.println(job.getID().toString()+","+
-          ((job.getDescription()==null)?"":commaEscape(job.getDescription()))+","+
-          commaEscape(job.getConnectionName())+","+
-          startModeMap(job.getStartMethod())+","+
-          runModeMap(job.getType())+","+
-          hopcountModeMap(job.getHopcountMode())+","+
-          Integer.toString(job.getPriority())+","+
-          presentInterval(job.getInterval())+","+
-          presentInterval(job.getExpiration())+","+
-          presentInterval(job.getReseedInterval()));
-      }
-      System.err.println("Job list done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String presentInterval(Long interval)
-  {
-    if (interval == null)
-      return "infinite";
-    return interval.toString();
-  }
-
-  protected static String startModeMap(int startMethod)
-  {
-    switch (startMethod)
-    {
-    case IJobDescription.START_WINDOWBEGIN:
-      return "schedule window start";
-    case IJobDescription.START_WINDOWINSIDE:
-      return "schedule window anytime";
-    case IJobDescription.START_DISABLE:
-      return "manual";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static String runModeMap(int type)
-  {
-    switch (type)
-    {
-    case IJobDescription.TYPE_CONTINUOUS:
-      return "continuous";
-    case IJobDescription.TYPE_SPECIFIED:
-      return "scan once";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static String hopcountModeMap(int mode)
-  {
-    switch (mode)
-    {
-    case IJobDescription.HOPCOUNT_ACCURATE:
-      return "accurate";
-    case IJobDescription.HOPCOUNT_NODELETE:
-      return "no delete";
-    case IJobDescription.HOPCOUNT_NEVERDELETE:
-      return "never delete";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/PauseJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/PauseJob.java
deleted file mode 100644
index 2a2d0bc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/PauseJob.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: PauseJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class PauseJob
-{
-  public static final String _rcsid = "@(#)$Id: PauseJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private PauseJob()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: PauseJob <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.pauseJob(new Long(jobID));
-      System.out.println("Job paused");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/Register.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/Register.java
deleted file mode 100644
index 100227a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/Register.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/* $Id: Register.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/**
- * Register a repository connector class
- */
-public class Register extends TransactionalCrawlerInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: Register.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-  private final String description;
-
-  private Register(String className, String description)
-  {
-    this.className = className;
-    this.description = description;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    // First, register connector
-    mgr.registerConnector(description,className);
-    // Then, signal to all jobs that might depend on this connector that they can switch state
-    // Find the connection names that come with this class
-    String[] connectionNames = connManager.findConnectionsForConnector(className);
-    // For each connection name, modify the jobs to note that the connector is now installed
-    jobManager.noteConnectorRegistration(connectionNames);
-
-    Logging.root.info("Successfully registered connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 2)
-    {
-      System.err.println("Usage: Register <classname> <description>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    String description = args[1];
-
-    try
-    {
-      Register register = new Register(className,description);
-      register.execute();
-      System.err.println("Successfully registered connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RestartJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RestartJob.java
deleted file mode 100644
index d2d550c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RestartJob.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: RestartJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class RestartJob
-{
-  public static final String _rcsid = "@(#)$Id: RestartJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RestartJob()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: RestartJob <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.restartJob(new Long(jobID));
-      System.err.println("Job resuming");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunDocumentStatus.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunDocumentStatus.java
deleted file mode 100644
index fc527be..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunDocumentStatus.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/* $Id: RunDocumentStatus.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class runs a document status report.  It prints the report data in a comma-separated form to stdout.
-*/
-public class RunDocumentStatus
-{
-  public static final String _rcsid = "@(#)$Id: RunDocumentStatus.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RunDocumentStatus()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 9)
-    {
-      System.err.println("Usage: RunDocumentStatus <connection_name> <job_id_list> <time_ms> <match_state_list> <match_status_list> <match_regexp> <sortorder_list> <start_row> <row_count>");
-      System.err.println("<connection_name> is the name of the connection");
-      System.err.println("<job_id_list> is a comma-separated list of job identifiers");
-      System.err.println("<time_ms> is the time for which each document state and status will be calculated");
-      System.err.println("<match_state_list> is a comma-separated list of states, one of:");
-      System.err.println("    'neverprocessed', 'previouslyprocessed'");
-      System.err.println("<match_status_list> is a comma-separated list of statuses, one of:");
-      System.err.println("    'inactive', 'processing', 'expiring', 'deleting',");
-      System.err.println("    'readyforprocessing', 'readyforexpiration', 'waitingforprocessing', 'waitingforexpiration', 'waitingforever'");
-      System.err.println("<match_regexp> is the regular expression that describes which document identifiers to include");
-      System.err.println("<sortorder_list> is a comma-separated list of fields describing the sort order, preceded by + or -");
-      System.err.println("    for ascending or descending; the legal field names are: 'identifier', 'job', 'state', 'status',");
-      System.err.println("    'scheduled', 'action', 'retrycount', 'retrylimit'");
-      System.err.println("<start_row> is the number of the first row to include, starting with 0");
-      System.err.println("<row_count> is the maximum number of rows to include");
-      System.err.println("");
-      System.err.println("The printed result will be UTF-8 encoded and has the following columns, in order:");
-      System.err.println("    doc_identifier, job_description, document_state, document_status,");
-      System.err.println("    when_scheduled, action_to_take, remaining_retrycount, retrylimit_time");
-
-
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String jobList = args[1];
-    String currentTime = args[2];
-    String matchStateList = args[3];
-    String matchStatusList = args[4];
-    String matchRegexp = args[5];
-    String sortorderList = args[6];
-    String startRow = args[7];
-    String rowCount = args[8];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-
-      StatusFilterCriteria filter = parseFilterCriteria(jobList,currentTime,matchRegexp,matchStateList,matchStatusList);
-      SortOrder sortOrderValue = parseSortorder(sortorderList);
-      int startRowValue = Integer.parseInt(startRow);
-      int rowCountValue = Integer.parseInt(rowCount);
-
-      IResultSet result = jobManager.genDocumentStatus(connectionName,filter,sortOrderValue,startRowValue,rowCountValue);
-      int i = 0;
-      while (i < result.getRowCount())
-      {
-        IResultRow row = result.getRow(i++);
-        Long scheduled = (Long)row.getValue("scheduled");
-        String action = (String)row.getValue("action");
-        Long retrycount = (Long)row.getValue("retrycount");
-        Long retrylimit = (Long)row.getValue("retrylimit");
-        UTF8Stdout.println(commaEscape((String)row.getValue("identifier"))+","+
-          row.getValue("job").toString()+","+
-          row.getValue("state").toString()+","+
-          row.getValue("status").toString()+","+
-          ((scheduled==null)?"":scheduled.toString())+","+
-          ((action==null)?"":action)+","+
-          ((retrycount==null)?"":retrycount.toString())+","+
-          ((retrylimit==null)?"":retrylimit.toString()) );
-      }
-      System.err.println("Status query done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  protected static StatusFilterCriteria parseFilterCriteria(String jobList, String currentTime, String matchRegexp, String matchStateList, String matchStatusList)
-    throws Exception
-  {
-    Long[] jobIds = parseJobList(jobList);
-    RegExpCriteria matchRegexpValue = parseRegexp(matchRegexp);
-    long currentTimeValue = new Long(currentTime).longValue();
-    int[] matchStateValue = parseStateList(matchStateList);
-    int[] matchStatusValue = parseStatusList(matchStatusList);
-    return new StatusFilterCriteria(jobIds,currentTimeValue,matchRegexpValue, matchStateValue,matchStatusValue);
-  }
-
-  protected static Long[] parseJobList(String jobList)
-    throws Exception
-  {
-    String[] jobs = jobList.split(",");
-    Long[] rval = new Long[jobs.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String job = jobs[i].trim();
-      rval[i] = new Long(job);
-      i++;
-    }
-    return rval;
-  }
-
-  private static HashMap stateMap;
-  static
-  {
-    stateMap = new HashMap();
-    stateMap.put("neverprocessed",new Integer(IJobManager.DOCSTATE_NEVERPROCESSED));
-    stateMap.put("previouslyprocessed",new Integer(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED));
-  }
-
-  protected static int[] parseStateList(String stateList)
-    throws Exception
-  {
-    String[] states = stateList.split(",");
-    int[] rval = new int[states.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String state = states[i].trim();
-      Integer value = (Integer)stateMap.get(state.toLowerCase(Locale.ROOT));
-      if (value == null)
-        throw new ManifoldCFException("State value of '"+state+"' is illegal");
-      rval[i++] = value.intValue();
-    }
-    return rval;
-  }
-
-  private static HashMap statusMap;
-  static
-  {
-    statusMap = new HashMap();
-    statusMap.put("inactive",new Integer(IJobManager.DOCSTATUS_INACTIVE));
-    statusMap.put("processing",new Integer(IJobManager.DOCSTATUS_PROCESSING));
-    statusMap.put("expiring",new Integer(IJobManager.DOCSTATUS_EXPIRING));
-    statusMap.put("deleting",new Integer(IJobManager.DOCSTATUS_DELETING));
-    statusMap.put("readyforprocessing",new Integer(IJobManager.DOCSTATUS_READYFORPROCESSING));
-    statusMap.put("readyforexpiration",new Integer(IJobManager.DOCSTATUS_READYFOREXPIRATION));
-    statusMap.put("waitingforprocessing",new Integer(IJobManager.DOCSTATUS_WAITINGFORPROCESSING));
-    statusMap.put("waitingforexpiration",new Integer(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION));
-    statusMap.put("waitingforever",new Integer(IJobManager.DOCSTATUS_WAITINGFOREVER));
-  }
-
-  protected static int[] parseStatusList(String statusList)
-    throws Exception
-  {
-    String[] statuses = statusList.split(",");
-    int[] rval = new int[statuses.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String status = statuses[i].trim();
-      Integer value = (Integer)statusMap.get(status.toLowerCase(Locale.ROOT));
-      if (value == null)
-        throw new ManifoldCFException("Status value of '"+status+"' is illegal");
-      rval[i++] = value.intValue();
-    }
-    return rval;
-
-  }
-
-  protected static RegExpCriteria parseRegexp(String regexp)
-    throws Exception
-  {
-    if (regexp == null || regexp.length() == 0)
-      return null;
-    return new RegExpCriteria(regexp,true);
-  }
-
-  protected static SortOrder parseSortorder(String sortorder)
-    throws Exception
-  {
-    SortOrder so = new SortOrder();
-    if (sortorder == null || sortorder.length() == 0)
-      return so;
-    String[] columns = sortorder.split(",");
-    int i = 0;
-    while (i < columns.length)
-    {
-      String column = columns[i++].trim();
-      int clickCount = 1;
-      if (column.startsWith("+"))
-        column = column.substring(1);
-      else if (column.startsWith("-"))
-      {
-        clickCount++;
-        column = column.substring(1);
-      }
-      while (clickCount > 0)
-      {
-        clickCount--;
-        so.clickColumn(column);
-      }
-    }
-    return so;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunMaxActivityHistory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunMaxActivityHistory.java
deleted file mode 100644
index 78889a2..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunMaxActivityHistory.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/* $Id: RunMaxActivityHistory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** Generate a maximum activity report.
-*/
-public class RunMaxActivityHistory
-{
-  public static final String _rcsid = "@(#)$Id: RunMaxActivityHistory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RunMaxActivityHistory()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 11)
-    {
-      System.err.println("Usage: RunMaxActivityHistory <connection_name> <activity_list> <start_time> <end_time> <entity_regexp> <resultcode_regexp> <sortorder_list> <id_bucket_regexp> <interval_ms> <start_row> <row_count>");
-      System.err.println("<connection_name> is the name of the repository connection");
-      System.err.println("<activity_list> is the comma-separated list of activity names to include");
-      System.err.println("<start_time> is the earliest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<end_time> is the latest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<entity_regexp> describes which document identifiers to include");
-      System.err.println("<resultcode_regexp> describes which result codes to include");
-      System.err.println("<sortorder_list> a comma-separated list of fields describing the sort order, preceded by + or -");
-      System.err.println("    for ascending or descending; the legal field names are: 'idbucket', 'starttime', 'endtime', 'activitycount'");
-      System.err.println("<id_bucket_regexp> is a regular expression which extracts the bucket part from a document identifier");
-      System.err.println("<interval_ms> is the measurement interval in milliseconds");
-      System.err.println("<start_row> describes which row to start at, beginning at 0");
-      System.err.println("<row_count> indicates the maximum number of rows to include");
-      System.err.println("");
-      System.err.println("The result will be UTF-8 encoded, and will be printed to standard out, and will contain the following columns:");
-      System.err.println("    identifier_bucket, starttime_ms, endtime_ms, activity_count");
-
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String activityList = args[1];
-    String startTime = args[2];
-    String endTime = args[3];
-    String entityRegexp = args[4];
-    String resultCodeRegexp = args[5];
-    String sortOrder = args[6];
-    String entityBucketRegexp = args[7];
-    String interval = args[8];
-    String startRow = args[9];
-    String rowCount = args[10];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-
-      FilterCriteria filter = parseFilterCriteria(activityList,startTime,endTime,entityRegexp,resultCodeRegexp);
-      SortOrder sortOrderValue = parseSortorder(sortOrder);
-      BucketDescription entityBucket = parseBucketDescription(entityBucketRegexp);
-      long intervalValue = new Long(interval).longValue();
-
-      int startRowValue = Integer.parseInt(startRow);
-      int rowCountValue = Integer.parseInt(rowCount);
-
-      IResultSet result = connManager.genHistoryActivityCount(connectionName,filter,sortOrderValue,entityBucket,intervalValue,startRowValue,rowCountValue);
-      int i = 0;
-      while (i < result.getRowCount())
-      {
-        IResultRow row = result.getRow(i++);
-        UTF8Stdout.println(commaEscape((String)row.getValue("idbucket"))+","+
-          row.getValue("starttime").toString()+","+
-          row.getValue("endtime").toString()+","+
-          row.getValue("activitycount").toString());
-      }
-      System.err.println("History query done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  protected static FilterCriteria parseFilterCriteria(String activityList, String startTime, String endTime, String entityRegexp, String resultCodeRegexp)
-    throws Exception
-  {
-    String[] activityTypes = parseActivityList(activityList);
-    Long startTimeValue;
-    if (startTime != null && startTime.length() > 0)
-      startTimeValue = new Long(startTime);
-    else
-      startTimeValue = null;
-    Long endTimeValue;
-    if (endTime != null && endTime.length() > 0)
-      endTimeValue = new Long(endTime);
-    else
-      endTimeValue = null;
-
-    RegExpCriteria entityRegexpValue = parseRegexp(entityRegexp);
-    RegExpCriteria resultCodeRegexpValue = parseRegexp(resultCodeRegexp);
-
-    return new FilterCriteria(activityTypes,startTimeValue,endTimeValue,entityRegexpValue,resultCodeRegexpValue);
-  }
-
-  protected static String[] parseActivityList(String activityList)
-    throws Exception
-  {
-    String[] activities = activityList.split(",");
-    String[] rval = new String[activities.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String activity = activities[i].trim();
-      rval[i] = activity;
-      i++;
-    }
-    return rval;
-  }
-
-  protected static RegExpCriteria parseRegexp(String regexp)
-    throws Exception
-  {
-    if (regexp == null || regexp.length() == 0)
-      return null;
-    return new RegExpCriteria(regexp,true);
-  }
-
-  protected static BucketDescription parseBucketDescription(String bucketDesc)
-    throws Exception
-  {
-    return new BucketDescription(bucketDesc,false);
-  }
-
-  protected static SortOrder parseSortorder(String sortorder)
-    throws Exception
-  {
-    SortOrder so = new SortOrder();
-    if (sortorder == null || sortorder.length() == 0)
-      return so;
-    String[] columns = sortorder.split(",");
-    int i = 0;
-    while (i < columns.length)
-    {
-      String column = columns[i++].trim();
-      int clickCount = 1;
-      if (column.startsWith("+"))
-        column = column.substring(1);
-      else if (column.startsWith("-"))
-      {
-        clickCount++;
-        column = column.substring(1);
-      }
-      while (clickCount > 0)
-      {
-        clickCount--;
-        so.clickColumn(column);
-      }
-    }
-    return so;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunMaxBandwidthHistory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunMaxBandwidthHistory.java
deleted file mode 100644
index a3afac0..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunMaxBandwidthHistory.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/* $Id: RunMaxBandwidthHistory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class runs a maximum bandwidth history report
-*/
-public class RunMaxBandwidthHistory
-{
-  public static final String _rcsid = "@(#)$Id: RunMaxBandwidthHistory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RunMaxBandwidthHistory()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 11)
-    {
-      System.err.println("Usage: RunMaxBandwidthHistory <connection_name> <activity_list> <start_time> <end_time> <entity_regexp> <resultcode_regexp> <sortorder_list> <id_bucket_regexp> <interval_ms> <start_row> <row_count>");
-      System.err.println("<connection_name> is the name of the repository connection");
-      System.err.println("<activity_list> is the comma-separated list of activity names to include");
-      System.err.println("<start_time> is the earliest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<end_time> is the latest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<entity_regexp> describes which document identifiers to include");
-      System.err.println("<resultcode_regexp> describes which result codes to include");
-      System.err.println("<sortorder_list> a comma-separated list of fields describing the sort order, preceded by + or -");
-      System.err.println("    for ascending or descending; the legal field names are: 'idbucket', 'starttime', 'endtime', 'bytecount'");
-      System.err.println("<id_bucket_regexp> is a regular expression which extracts the bucket part from a document identifier");
-      System.err.println("<interval_ms> is the measurement interval in milliseconds");
-      System.err.println("<start_row> describes which row to start at, beginning at 0");
-      System.err.println("<row_count> indicates the maximum number of rows to include");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, will be UTF-8 encoded, and will contain the following columns:");
-      System.err.println("    identifier_bucket, starttime_ms, endtime_ms, byte_count");
-
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String activityList = args[1];
-    String startTime = args[2];
-    String endTime = args[3];
-    String entityRegexp = args[4];
-    String resultCodeRegexp = args[5];
-    String sortOrder = args[6];
-    String entityBucketRegexp = args[7];
-    String interval = args[8];
-    String startRow = args[9];
-    String rowCount = args[10];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-
-      FilterCriteria filter = parseFilterCriteria(activityList,startTime,endTime,entityRegexp,resultCodeRegexp);
-      SortOrder sortOrderValue = parseSortorder(sortOrder);
-      BucketDescription entityBucket = parseBucketDescription(entityBucketRegexp);
-      long intervalValue = new Long(interval).longValue();
-
-      int startRowValue = Integer.parseInt(startRow);
-      int rowCountValue = Integer.parseInt(rowCount);
-
-      IResultSet result = connManager.genHistoryByteCount(connectionName,filter,sortOrderValue,entityBucket,intervalValue,startRowValue,rowCountValue);
-      int i = 0;
-      while (i < result.getRowCount())
-      {
-        IResultRow row = result.getRow(i++);
-        UTF8Stdout.println(commaEscape((String)row.getValue("idbucket"))+","+
-          row.getValue("starttime").toString()+","+
-          row.getValue("endtime").toString()+","+
-          row.getValue("bytecount").toString());
-      }
-      System.err.println("History query done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  protected static FilterCriteria parseFilterCriteria(String activityList, String startTime, String endTime, String entityRegexp, String resultCodeRegexp)
-    throws Exception
-  {
-    String[] activityTypes = parseActivityList(activityList);
-    Long startTimeValue;
-    if (startTime != null && startTime.length() > 0)
-      startTimeValue = new Long(startTime);
-    else
-      startTimeValue = null;
-    Long endTimeValue;
-    if (endTime != null && endTime.length() > 0)
-      endTimeValue = new Long(endTime);
-    else
-      endTimeValue = null;
-
-    RegExpCriteria entityRegexpValue = parseRegexp(entityRegexp);
-    RegExpCriteria resultCodeRegexpValue = parseRegexp(resultCodeRegexp);
-
-    return new FilterCriteria(activityTypes,startTimeValue,endTimeValue,entityRegexpValue,resultCodeRegexpValue);
-  }
-
-  protected static String[] parseActivityList(String activityList)
-    throws Exception
-  {
-    String[] activities = activityList.split(",");
-    String[] rval = new String[activities.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String activity = activities[i].trim();
-      rval[i] = activity;
-      i++;
-    }
-    return rval;
-  }
-
-  protected static RegExpCriteria parseRegexp(String regexp)
-    throws Exception
-  {
-    if (regexp == null || regexp.length() == 0)
-      return null;
-    return new RegExpCriteria(regexp,true);
-  }
-
-  protected static BucketDescription parseBucketDescription(String bucketDesc)
-    throws Exception
-  {
-    return new BucketDescription(bucketDesc,false);
-  }
-
-  protected static SortOrder parseSortorder(String sortorder)
-    throws Exception
-  {
-    SortOrder so = new SortOrder();
-    if (sortorder == null || sortorder.length() == 0)
-      return so;
-    String[] columns = sortorder.split(",");
-    int i = 0;
-    while (i < columns.length)
-    {
-      String column = columns[i++].trim();
-      int clickCount = 1;
-      if (column.startsWith("+"))
-        column = column.substring(1);
-      else if (column.startsWith("-"))
-      {
-        clickCount++;
-        column = column.substring(1);
-      }
-      while (clickCount > 0)
-      {
-        clickCount--;
-        so.clickColumn(column);
-      }
-    }
-    return so;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunQueueStatus.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunQueueStatus.java
deleted file mode 100644
index 8ee6b43..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunQueueStatus.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/* $Id: RunQueueStatus.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class runs a queue status report.  It prints the report data in a comma-separated form to stdout.
-*/
-public class RunQueueStatus
-{
-  public static final String _rcsid = "@(#)$Id: RunQueueStatus.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RunQueueStatus()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 10)
-    {
-      System.err.println("Usage: RunQueueStatus <connection_name> <job_id_list> <time_ms> <match_state_list> <match_status_list> <match_regexp> <sortorder_list> <bucket_regexp> <start_row> <row_count>");
-      System.err.println("<connection_name> is the name of the connection");
-      System.err.println("<job_id_list> is a comma-separated list of job identifiers");
-      System.err.println("<time_ms> is the time for which each document state and status will be calculated");
-      System.err.println("<match_state_list> is a comma-separated list of states, one of:");
-      System.err.println("    'neverprocessed', 'previouslyprocessed'");
-      System.err.println("<match_status_list> is a comma-separated list of statuses, one of:");
-      System.err.println("    'inactive', 'processing', 'expiring', 'deleting',");
-      System.err.println("    'readyforprocessing', 'readyforexpiration', 'waitingforprocessing', 'waitingforexpiration', 'waitingforever'");
-      System.err.println("<match_regexp> is the regular expression that describes which document identifiers to include");
-      System.err.println("<sortorder_list> is a comma-separated list of fields describing the sort order, preceded by + or -");
-      System.err.println("    for ascending or descending; the legal field names are: 'idbucket', 'inactive',");
-      System.err.println("    'processing', 'expiring', 'deleting', 'processready', 'expireready',");
-      System.err.println("    'processwaiting', 'expirewaiting', 'waitingforever'");
-      System.err.println("<bucket_regexp> is the regular expression which identifies a document's bucket from its identifier");
-      System.err.println("<start_row> is the number of the first row to include, starting with 0");
-      System.err.println("<row_count> is the maximum number of rows to include");
-      System.err.println("");
-      System.err.println("The printed result is UTF-8 encoded and has the following columns, in order:");
-      System.err.println("    id_bucket, inactive_count, processing_count, expiring_count, deleting_count,");
-      System.err.println("    process_ready_count, expire_ready_count, process_waiting_count, expire_waiting_count, waiting_forever_count");
-
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String jobList = args[1];
-    String currentTime = args[2];
-    String matchStateList = args[3];
-    String matchStatusList = args[4];
-    String matchRegexp = args[5];
-    String sortorderList = args[6];
-    String bucketRegexp = args[7];
-    String startRow = args[8];
-    String rowCount = args[9];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-
-      StatusFilterCriteria filter = parseFilterCriteria(jobList,currentTime,matchRegexp,matchStateList,matchStatusList);
-      SortOrder sortOrderValue = parseSortorder(sortorderList);
-      int startRowValue = Integer.parseInt(startRow);
-      int rowCountValue = Integer.parseInt(rowCount);
-      BucketDescription bucketDescription = parseBucketDescription(bucketRegexp);
-
-      IResultSet result = jobManager.genQueueStatus(connectionName,filter,sortOrderValue,bucketDescription,startRowValue,rowCountValue);
-      int i = 0;
-      while (i < result.getRowCount())
-      {
-        IResultRow row = result.getRow(i++);
-        UTF8Stdout.println(commaEscape((String)row.getValue("idbucket"))+","+
-          row.getValue("inactive").toString()+","+
-          row.getValue("processing").toString()+","+
-          row.getValue("expiring").toString()+","+
-          row.getValue("deleting").toString()+","+
-          row.getValue("processready").toString()+","+
-          row.getValue("expireready").toString()+","+
-          row.getValue("processwaiting").toString()+","+
-          row.getValue("expirewaiting").toString()+","+
-          row.getValue("waitingforever").toString());
-
-      }
-      System.err.println("Status query done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  protected static StatusFilterCriteria parseFilterCriteria(String jobList, String currentTime, String matchRegexp, String matchStateList, String matchStatusList)
-    throws Exception
-  {
-    Long[] jobIds = parseJobList(jobList);
-    RegExpCriteria matchRegexpValue = parseRegexp(matchRegexp);
-    long currentTimeValue = new Long(currentTime).longValue();
-    int[] matchStateValue = parseStateList(matchStateList);
-    int[] matchStatusValue = parseStatusList(matchStatusList);
-    return new StatusFilterCriteria(jobIds,currentTimeValue,matchRegexpValue, matchStateValue,matchStatusValue);
-  }
-
-  protected static Long[] parseJobList(String jobList)
-    throws Exception
-  {
-    String[] jobs = jobList.split(",");
-    Long[] rval = new Long[jobs.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String job = jobs[i].trim();
-      rval[i] = new Long(job);
-      i++;
-    }
-    return rval;
-  }
-
-  private static HashMap stateMap;
-  static
-  {
-    stateMap = new HashMap();
-    stateMap.put("neverprocessed",new Integer(IJobManager.DOCSTATE_NEVERPROCESSED));
-    stateMap.put("previouslyprocessed",new Integer(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED));
-  }
-
-  protected static int[] parseStateList(String stateList)
-    throws Exception
-  {
-    String[] states = stateList.split(",");
-    int[] rval = new int[states.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String state = states[i].trim();
-      Integer value = (Integer)stateMap.get(state.toLowerCase(Locale.ROOT));
-      if (value == null)
-        throw new ManifoldCFException("State value of '"+state+"' is illegal");
-      rval[i++] = value.intValue();
-    }
-    return rval;
-  }
-
-  private static HashMap statusMap;
-  static
-  {
-    statusMap = new HashMap();
-    statusMap.put("inactive",new Integer(IJobManager.DOCSTATUS_INACTIVE));
-    statusMap.put("processing",new Integer(IJobManager.DOCSTATUS_PROCESSING));
-    statusMap.put("expiring",new Integer(IJobManager.DOCSTATUS_EXPIRING));
-    statusMap.put("deleting",new Integer(IJobManager.DOCSTATUS_DELETING));
-    statusMap.put("readyforprocessing",new Integer(IJobManager.DOCSTATUS_READYFORPROCESSING));
-    statusMap.put("readyforexpiration",new Integer(IJobManager.DOCSTATUS_READYFOREXPIRATION));
-    statusMap.put("waitingforprocessing",new Integer(IJobManager.DOCSTATUS_WAITINGFORPROCESSING));
-    statusMap.put("waitingforexpiration",new Integer(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION));
-    statusMap.put("waitingforever",new Integer(IJobManager.DOCSTATUS_WAITINGFOREVER));
-  }
-
-  protected static int[] parseStatusList(String statusList)
-    throws Exception
-  {
-    String[] statuses = statusList.split(",");
-    int[] rval = new int[statuses.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String status = statuses[i].trim();
-      Integer value = (Integer)statusMap.get(status.toLowerCase(Locale.ROOT));
-      if (value == null)
-        throw new ManifoldCFException("Status value of '"+status+"' is illegal");
-      rval[i++] = value.intValue();
-    }
-    return rval;
-
-  }
-
-  protected static RegExpCriteria parseRegexp(String regexp)
-    throws Exception
-  {
-    if (regexp == null || regexp.length() == 0)
-      return null;
-    return new RegExpCriteria(regexp,true);
-  }
-
-  protected static BucketDescription parseBucketDescription(String bucketDesc)
-    throws Exception
-  {
-    return new BucketDescription(bucketDesc,false);
-  }
-
-  protected static SortOrder parseSortorder(String sortorder)
-    throws Exception
-  {
-    SortOrder so = new SortOrder();
-    if (sortorder == null || sortorder.length() == 0)
-      return so;
-    String[] columns = sortorder.split(",");
-    int i = 0;
-    while (i < columns.length)
-    {
-      String column = columns[i++].trim();
-      int clickCount = 1;
-      if (column.startsWith("+"))
-        column = column.substring(1);
-      else if (column.startsWith("-"))
-      {
-        clickCount++;
-        column = column.substring(1);
-      }
-      while (clickCount > 0)
-      {
-        clickCount--;
-        so.clickColumn(column);
-      }
-    }
-    return so;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunResultHistory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunResultHistory.java
deleted file mode 100644
index e043c8d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunResultHistory.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/* $Id: RunResultHistory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class runs a result history report.
-*/
-public class RunResultHistory
-{
-  public static final String _rcsid = "@(#)$Id: RunResultHistory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RunResultHistory()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 11)
-    {
-      System.err.println("Usage: RunResultHistory <connection_name> <activity_list> <start_time> <end_time> <entity_regexp> <resultcode_regexp> <sortorder_list> <id_bucket_regexp> <result_bucket_regexp> <start_row> <row_count>");
-      System.err.println("<connection_name> is the name of the repository connection");
-      System.err.println("<activity_list> is the comma-separated list of activity names to include");
-      System.err.println("<start_time> is the earliest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<end_time> is the latest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<entity_regexp> describes which document identifiers to include");
-      System.err.println("<resultcode_regexp> describes which result codes to include");
-      System.err.println("<sortorder_list> a comma-separated list of fields describing the sort order, preceded by + or -");
-      System.err.println("    for ascending or descending; the legal field names are: 'idbucket', 'resultcodebucket', 'eventcount'");
-      System.err.println("<id_bucket_regexp> is a regular expression which extracts the bucket part from a document identifier");
-      System.err.println("<result_bucket_regexp> is a regular expression which extracts the bucket part from a result code");
-      System.err.println("<start_row> describes which row to start at, beginning at 0");
-      System.err.println("<row_count> indicates the maximum number of rows to include");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, will be UTF-8 encoded, and will contain the following columns:");
-      System.err.println("    identifier_bucket, resultcode_bucket, event_count");
-
-
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String activityList = args[1];
-    String startTime = args[2];
-    String endTime = args[3];
-    String entityRegexp = args[4];
-    String resultCodeRegexp = args[5];
-    String sortOrder = args[6];
-    String entityBucketRegexp = args[7];
-    String resultBucketRegexp = args[8];
-    String startRow = args[9];
-    String rowCount = args[10];
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-
-      FilterCriteria filter = parseFilterCriteria(activityList,startTime,endTime,entityRegexp,resultCodeRegexp);
-      SortOrder sortOrderValue = parseSortorder(sortOrder);
-      BucketDescription entityBucket = parseBucketDescription(entityBucketRegexp);
-      BucketDescription resultBucket = parseBucketDescription(resultBucketRegexp);
-      int startRowValue = Integer.parseInt(startRow);
-      int rowCountValue = Integer.parseInt(rowCount);
-
-      IResultSet result = connManager.genHistoryResultCodes(connectionName,filter,sortOrderValue,resultBucket,entityBucket,startRowValue,rowCountValue);
-      int i = 0;
-      while (i < result.getRowCount())
-      {
-        IResultRow row = result.getRow(i++);
-
-        UTF8Stdout.println(commaEscape((String)row.getValue("idbucket"))+","+
-          commaEscape((String)row.getValue("resultcodebucket"))+","+
-          row.getValue("eventcount").toString());
-      }
-      System.err.println("History query done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuffer output = new StringBuffer();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  protected static FilterCriteria parseFilterCriteria(String activityList, String startTime, String endTime, String entityRegexp, String resultCodeRegexp)
-    throws Exception
-  {
-    String[] activityTypes = parseActivityList(activityList);
-    Long startTimeValue;
-    if (startTime != null && startTime.length() > 0)
-      startTimeValue = new Long(startTime);
-    else
-      startTimeValue = null;
-    Long endTimeValue;
-    if (endTime != null && endTime.length() > 0)
-      endTimeValue = new Long(endTime);
-    else
-      endTimeValue = null;
-
-    RegExpCriteria entityRegexpValue = parseRegexp(entityRegexp);
-    RegExpCriteria resultCodeRegexpValue = parseRegexp(resultCodeRegexp);
-
-    return new FilterCriteria(activityTypes,startTimeValue,endTimeValue,entityRegexpValue,resultCodeRegexpValue);
-  }
-
-  protected static String[] parseActivityList(String activityList)
-    throws Exception
-  {
-    String[] activities = activityList.split(",");
-    String[] rval = new String[activities.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String activity = activities[i].trim();
-      rval[i] = activity;
-      i++;
-    }
-    return rval;
-  }
-
-  protected static RegExpCriteria parseRegexp(String regexp)
-    throws Exception
-  {
-    if (regexp == null || regexp.length() == 0)
-      return null;
-    return new RegExpCriteria(regexp,true);
-  }
-
-  protected static BucketDescription parseBucketDescription(String bucketDesc)
-    throws Exception
-  {
-    return new BucketDescription(bucketDesc,false);
-  }
-
-  protected static SortOrder parseSortorder(String sortorder)
-    throws Exception
-  {
-    SortOrder so = new SortOrder();
-    if (sortorder == null || sortorder.length() == 0)
-      return so;
-    String[] columns = sortorder.split(",");
-    int i = 0;
-    while (i < columns.length)
-    {
-      String column = columns[i++].trim();
-      int clickCount = 1;
-      if (column.startsWith("+"))
-        column = column.substring(1);
-      else if (column.startsWith("-"))
-      {
-        clickCount++;
-        column = column.substring(1);
-      }
-      while (clickCount > 0)
-      {
-        clickCount--;
-        so.clickColumn(column);
-      }
-    }
-    return so;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunSimpleHistory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunSimpleHistory.java
deleted file mode 100644
index 5497962..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/RunSimpleHistory.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/* $Id: RunSimpleHistory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class converts a job name into a job identifier.
-* Warning: Since multiple jobs can have the same name, a list of job identifiers will be returned.
-*/
-public class RunSimpleHistory
-{
-  public static final String _rcsid = "@(#)$Id: RunSimpleHistory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private RunSimpleHistory()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 9)
-    {
-      System.err.println("Usage: RunSimpleHistory <connection_name> <activity_list> <start_time> <end_time> <entity_regexp> <resultcode_regexp> <sortorder_list> <start_row> <row_count>");
-      System.err.println("<connection_name> is the name of the repository connection");
-      System.err.println("<activity_list> is the comma-separated list of activity names to include");
-      System.err.println("<start_time> is the earliest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<end_time> is the latest time to include, in ms. since epoch [blank if no limit]");
-      System.err.println("<entity_regexp> describes which document identifiers to include");
-      System.err.println("<resultcode_regexp> describes which result codes to include");
-      System.err.println("<sortorder_list> a comma-separated list of fields describing the sort order, preceded by + or -");
-      System.err.println("    for ascending or descending; the legal field names are: 'identifier', 'activity', 'starttime',");
-      System.err.println("    'elapsedtime', 'resultcode', 'resultdesc', 'bytes'");
-      System.err.println("<start_row> describes which row to start at, beginning at 0");
-      System.err.println("<row_count> indicates the maximum number of rows to include");
-      System.err.println("");
-      System.err.println("The result will be printed to standard out, UTF-8 encoded, and will contain the following columns:");
-      System.err.println("    identifier, activity, start_time, elapsed_time, result_code, result_desc, byte_count");
-      System.exit(1);
-    }
-
-    String connectionName = args[0];
-    String activityList = args[1];
-    String startTime = args[2];
-    String endTime = args[3];
-    String entityRegexp = args[4];
-    String resultCodeRegexp = args[5];
-    String sortOrder = args[6];
-    String startRow = args[7];
-    String rowCount = args[8];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-
-      FilterCriteria filter = parseFilterCriteria(activityList,startTime,endTime,entityRegexp,resultCodeRegexp);
-      SortOrder sortOrderValue = parseSortorder(sortOrder);
-      int startRowValue = Integer.parseInt(startRow);
-      int rowCountValue = Integer.parseInt(rowCount);
-
-      IResultSet result = connManager.genHistorySimple(connectionName,filter,sortOrderValue,startRowValue,rowCountValue);
-      int i = 0;
-      while (i < result.getRowCount())
-      {
-        IResultRow row = result.getRow(i++);
-
-        Long startTimeValue = (Long)row.getValue("starttime");
-        Long elapsedTimeValue = (Long)row.getValue("elapsedtime");
-        String resultCodeValue = (String)row.getValue("resultcode");
-        String resultDescValue = (String)row.getValue("resultdesc");
-        Long bytesValue = (Long)row.getValue("bytes");
-
-        UTF8Stdout.println(commaEscape((String)row.getValue("identifier"))+","+
-          commaEscape((String)row.getValue("activity"))+","+
-          ((startTimeValue==null)?"":startTimeValue.toString())+","+
-          ((elapsedTimeValue==null)?"":elapsedTimeValue.toString())+","+
-          ((resultCodeValue==null)?"":commaEscape(resultCodeValue))+","+
-          ((resultDescValue==null)?"":commaEscape(resultDescValue))+","+
-          ((bytesValue==null)?"":bytesValue.toString()));
-      }
-      System.err.println("History query done");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-  protected static String commaEscape(String input)
-  {
-    StringBuilder output = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x < ' ')
-        x = ' ';
-      if (x == '\\' || x == ',')
-        output.append("\\");
-      output.append(x);
-    }
-    return output.toString();
-  }
-
-  protected static FilterCriteria parseFilterCriteria(String activityList, String startTime, String endTime, String entityRegexp, String resultCodeRegexp)
-    throws Exception
-  {
-    String[] activityTypes = parseActivityList(activityList);
-    Long startTimeValue;
-    if (startTime != null && startTime.length() > 0)
-      startTimeValue = new Long(startTime);
-    else
-      startTimeValue = null;
-    Long endTimeValue;
-    if (endTime != null && endTime.length() > 0)
-      endTimeValue = new Long(endTime);
-    else
-      endTimeValue = null;
-
-    RegExpCriteria entityRegexpValue = parseRegexp(entityRegexp);
-    RegExpCriteria resultCodeRegexpValue = parseRegexp(resultCodeRegexp);
-
-    return new FilterCriteria(activityTypes,startTimeValue,endTimeValue,entityRegexpValue,resultCodeRegexpValue);
-  }
-
-  protected static String[] parseActivityList(String activityList)
-    throws Exception
-  {
-    String[] activities = activityList.split(",");
-    String[] rval = new String[activities.length];
-    int i = 0;
-    while (i < rval.length)
-    {
-      String activity = activities[i].trim();
-      rval[i] = activity;
-      i++;
-    }
-    return rval;
-  }
-
-  protected static RegExpCriteria parseRegexp(String regexp)
-    throws Exception
-  {
-    if (regexp == null || regexp.length() == 0)
-      return null;
-    return new RegExpCriteria(regexp,true);
-  }
-
-  protected static SortOrder parseSortorder(String sortorder)
-    throws Exception
-  {
-    SortOrder so = new SortOrder();
-    if (sortorder == null || sortorder.length() == 0)
-      return so;
-    String[] columns = sortorder.split(",");
-    int i = 0;
-    while (i < columns.length)
-    {
-      String column = columns[i++].trim();
-      int clickCount = 1;
-      if (column.startsWith("+"))
-        column = column.substring(1);
-      else if (column.startsWith("-"))
-      {
-        clickCount++;
-        column = column.substring(1);
-      }
-      while (clickCount > 0)
-      {
-        clickCount--;
-        so.clickColumn(column);
-      }
-    }
-    return so;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/StartJob.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/StartJob.java
deleted file mode 100644
index 6b51192..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/StartJob.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: StartJob.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class StartJob
-{
-        public static final String _rcsid = "@(#)$Id: StartJob.java 988245 2010-08-23 18:39:35Z kwright $";
-
-        private StartJob()
-        {
-        }
-
-        // Add: throttle, priority, recrawl interval
-
-        public static void main(String[] args)
-        {
-                if (args.length != 1)
-                {
-                        System.err.println("Usage: StartJob <jobid>");
-                        System.exit(1);
-                }
-
-                String jobID = args[0];
-
-
-                try
-                {
-                        IThreadContext tc = ThreadContextFactory.make();
-                        ManifoldCF.initializeEnvironment(tc);
-                        IJobManager jobManager = JobManagerFactory.make(tc);
-                        jobManager.manualStart(new Long(jobID));
-                        System.out.println("Job starting");
-                }
-                catch (Exception e)
-                {
-                        e.printStackTrace();
-                        System.exit(2);
-                }
-        }
-                
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/SynchronizeConnectors.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/SynchronizeConnectors.java
deleted file mode 100644
index a98206d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/SynchronizeConnectors.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/* $Id: SynchronizeConnectors.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-
-/**
- * Un-register all registered repository connector classes that can't be found
- */
-public class SynchronizeConnectors extends BaseCrawlerInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: SynchronizeConnectors.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public SynchronizeConnectors()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String className = (String)row.getValue("classname");
-      try
-      {
-        RepositoryConnectorFactory.getConnectorNoCheck(className);
-      }
-      catch (ManifoldCFException e)
-      {
-        // Deregistration should be done in a transaction
-        database.beginTransaction();
-        try
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(className);
-          // For each connection name, modify the jobs to note that the connector is no longer installed
-          jobManager.noteConnectorDeregistration(connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.removeConnector(className);
-        }
-        catch (ManifoldCFException e2)
-        {
-          database.signalRollback();
-          throw e2;
-        }
-        catch (Error e2)
-        {
-          database.signalRollback();
-          throw e2;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-    }
-    Logging.root.info("Successfully synchronized all connectors");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: SynchronizeConnectors");
-      System.exit(1);
-    }
-
-    try
-    {
-      SynchronizeConnectors synchronizeConnectors = new SynchronizeConnectors();
-      synchronizeConnectors.execute();
-      System.err.println("Successfully synchronized all connectors");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/TransactionalCrawlerInitializationCommand.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/TransactionalCrawlerInitializationCommand.java
deleted file mode 100644
index 44fd63e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/TransactionalCrawlerInitializationCommand.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $Id: Obfuscate.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.InitializationCommand;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/**
- * @author Jettro Coenradie
- */
-public abstract class TransactionalCrawlerInitializationCommand implements InitializationCommand
-{
-  public void execute() throws ManifoldCFException
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    ManifoldCF.initializeEnvironment(tc);
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      org.apache.manifoldcf.agents.system.ManifoldCF.getMasterDatabaseName(),
-      org.apache.manifoldcf.agents.system.ManifoldCF.getMasterDatabaseUsername(),
-      org.apache.manifoldcf.agents.system.ManifoldCF.getMasterDatabasePassword());
-
-    try
-    {
-      database.beginTransaction();
-      doExecute(tc);
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-
-  }
-
-  protected abstract void doExecute(IThreadContext tc) throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/UnRegister.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/UnRegister.java
deleted file mode 100644
index 212a9f0..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/UnRegister.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id: UnRegister.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/**
- * Un-register a repository connector class
- */
-public class UnRegister extends TransactionalCrawlerInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegister.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private final String className;
-
-  public UnRegister(String className)
-  {
-    this.className = className;
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    // Find the connection names that come with this class
-    String[] connectionNames = connManager.findConnectionsForConnector(className);
-    // For each connection name, modify the jobs to note that the connector is no longer installed
-    jobManager.noteConnectorDeregistration(connectionNames);
-    // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-    mgr.unregisterConnector(className);
-    Logging.root.info("Successfully unregistered connector '"+className+"'");
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: UnRegister <classname>");
-      System.exit(1);
-    }
-
-    String className = args[0];
-    try
-    {
-      UnRegister unRegister = new UnRegister(className);
-      unRegister.execute();
-      System.err.println("Successfully unregistered connector '"+className+"'");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/UnRegisterAll.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/UnRegisterAll.java
deleted file mode 100644
index ff967e3..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/UnRegisterAll.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/* $Id: UnRegisterAll.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/**
- * Un-register all repository connector classes
- */
-public class UnRegisterAll extends BaseCrawlerInitializationCommand
-{
-  public static final String _rcsid = "@(#)$Id: UnRegisterAll.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  public UnRegisterAll()
-  {
-  }
-
-  protected void doExecute(IThreadContext tc) throws ManifoldCFException
-  {
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    IResultSet classNames = mgr.getConnectors();
-    int i = 0;
-    while (i < classNames.getRowCount())
-    {
-      IResultRow row = classNames.getRow(i++);
-      String className = (String)row.getValue("classname");
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(className);
-        // For each connection name, modify the jobs to note that the connector is no longer installed
-        jobManager.noteConnectorDeregistration(connectionNames);
-        // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-        mgr.unregisterConnector(className);
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    Logging.root.info("Successfully unregistered all connectors");
-  }
-
-
-  public static void main(String[] args)
-  {
-    if (args.length > 0)
-    {
-      System.err.println("Usage: UnRegisterAll");
-      System.exit(1);
-    }
-
-    try
-    {
-      UnRegisterAll unRegisterAll = new UnRegisterAll();
-      unRegisterAll.execute();
-      System.err.println("Successfully unregistered all connectors");
-    }
-    catch (ManifoldCFException e)
-    {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitForJobDeleted.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitForJobDeleted.java
deleted file mode 100644
index 7efa596..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitForJobDeleted.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $Id: WaitForJobDeleted.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class WaitForJobDeleted
-{
-  public static final String _rcsid = "@(#)$Id: WaitForJobDeleted.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private WaitForJobDeleted()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: WaitForJobDeleted <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      while (true)
-      {
-        JobStatus status = jobManager.getStatus(new Long(jobID));
-        if (status == null)
-          break;
-        ManifoldCF.sleep(10000);
-      }
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitForJobInactive.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitForJobInactive.java
deleted file mode 100644
index 9b4a99f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitForJobInactive.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $Id: WaitForJobInactive.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class WaitForJobInactive
-{
-  public static final String _rcsid = "@(#)$Id: WaitForJobInactive.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private WaitForJobInactive()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: WaitForJobInactive <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-
-      while (true)
-      {
-        JobStatus status = jobManager.getStatus(new Long(jobID));
-        if (status == null)
-          throw new ManifoldCFException("No such job: '"+jobID+"'");
-        int statusValue = status.getStatus();
-        switch (statusValue)
-        {
-        case JobStatus.JOBSTATUS_NOTYETRUN:
-          System.out.println("Never run");
-          break;
-        case JobStatus.JOBSTATUS_COMPLETED:
-          System.out.println("OK");
-          break;
-        case JobStatus.JOBSTATUS_ERROR:
-          System.out.println("Error: "+status.getErrorText());
-          break;
-        default:
-          ManifoldCF.sleep(10000);
-          continue;
-        }
-        break;
-      }
-
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitJobPaused.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitJobPaused.java
deleted file mode 100644
index 3f16438..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/WaitJobPaused.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id: WaitJobPaused.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler;
-
-import java.io.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-import java.util.*;
-
-/** This class is used during testing.
-*/
-public class WaitJobPaused
-{
-  public static final String _rcsid = "@(#)$Id: WaitJobPaused.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  private WaitJobPaused()
-  {
-  }
-
-  // Add: throttle, priority, recrawl interval
-
-  public static void main(String[] args)
-  {
-    if (args.length != 1)
-    {
-      System.err.println("Usage: WaitJobPaused <jobid>");
-      System.exit(1);
-    }
-
-    String jobID = args[0];
-
-
-    try
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      ManifoldCF.initializeEnvironment(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      while (true)
-      {
-        if (jobManager.checkJobBusy(new Long(jobID)))
-        {
-          ManifoldCF.sleep(5000);
-          continue;
-        }
-        break;
-      }
-      System.err.println("Job no longer busy");
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      System.exit(2);
-    }
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/bins/BinManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/bins/BinManager.java
deleted file mode 100644
index 262c991..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/bins/BinManager.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.bins;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-
-/** This class manages the docbins table.
-* A row in this table represents a document bin.  The count that is kept is the
-* number of documents in this particular bin that have been assigned a document priority.
-* 
-* <br><br>
-* <b>docbins</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>binname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
-* <tr><td>bincounter</td><td>BIGINT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class BinManager extends org.apache.manifoldcf.core.database.BaseTable implements IBinManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Field names
-  public final static String connectorClassField = "connectorclass";
-  public final static String binNameField = "binname";
-  public final static String binCounterField = "bincounter";
-  
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public BinManager(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"docbins");
-  }
-
-  /** Install or upgrade this table.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    // Standard practice: outer loop for installs
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        // HSQLDB does not like null primary keys!!
-        map.put(connectorClassField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(binNameField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(binCounterField,new ColumnDescription("FLOAT",false,false,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade
-        if (existing.get(connectorClassField) == null) {
-          HashMap map = new HashMap();
-          map.put(connectorClassField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-          performAlter(map,null,null,null);
-        }
-      }
-
-      // Index management goes here
-      IndexDescription binIndex = new IndexDescription(true,new String[]{connectorClassField,binNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (binIndex != null && id.equals(binIndex))
-          binIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (binIndex != null)
-        performAddIndex(null,binIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Reset all bins */
-  @Override
-  public void reset()
-    throws ManifoldCFException
-  {
-    performDelete("", null, null);
-  }
-
-  /** Get N bin values (and set next one).  If the record does not yet exist, create it with a starting value.
-  * We expect this to happen within a transaction!!.
-  *@param connectorClass is the class name of the connector
-  *@param binName is the name of the bin (256 char max)
-  *@param newBinValue is the value to use if there is no such bin yet.  This is the value that will be
-  * returned; what will be stored will be that value + 1.
-  *@param count is the number of values desired.
-  *@return the counter values.
-  */
-  @Override
-  public double[] getIncrementBinValues(String connectorClass, String binName, double newBinValue, int count)
-    throws ManifoldCFException
-  {
-    double[] returnValues = new double[count];
-    // SELECT FOR UPDATE/MODIFY is the most common path
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(connectorClassField,connectorClass),
-      new UnitaryClause(binNameField,binName)});
-    IResultSet result = performQuery("SELECT "+binCounterField+" FROM "+getTableName()+" WHERE "+query+" FOR UPDATE",params,null,null);
-    if (result.getRowCount() > 0)
-    {
-      IResultRow row = result.getRow(0);
-      Double value = (Double)row.getValue(binCounterField);
-      double rval = value.doubleValue();
-      if (rval < newBinValue)
-        rval = newBinValue;
-      // rval is the starting value; compute the entire array based on it.
-      for (int i = 0; i < count; i++)
-      {
-        returnValues[i] = rval;
-        rval += 1.0;
-      }
-      HashMap map = new HashMap();
-      map.put(binCounterField,new Double(rval));
-      performUpdate(map," WHERE "+query,params,null);
-    }
-    else
-    {
-      for (int i = 0; i < count; i++)
-      {
-        returnValues[i] = newBinValue;
-        newBinValue += 1.0;
-      }
-      HashMap map = new HashMap();
-      map.put(connectorClassField,connectorClass);
-      map.put(binNameField,binName);
-      map.put(binCounterField,new Double(newBinValue));
-      performInsert(map,null);
-    }
-    return returnValues;
-  }
-
-  /** Get N bin values (and set next one).  If the record does not yet exist, create it with a starting value.
-  * This method invokes its own retry-able transaction.
-  *@param connectorClass is the class name of the connector
-  *@param binName is the name of the bin (256 char max)
-  *@param newBinValue is the value to use if there is no such bin yet.  This is the value that will be
-  * returned; what will be stored will be that value + 1.
-  *@param count is the number of values desired.
-  *@return the counter values.
-  */
-  @Override
-  public double[] getIncrementBinValuesInTransaction(String connectorClass, String binName, double newBinValue, int count)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      beginTransaction();
-      try
-      {
-        return getIncrementBinValues(connectorClass, binName, newBinValue, count);
-      }
-      catch (Error e)
-      {
-        signalRollback();
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        signalRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction obtaining docpriorities: "+e.getMessage());
-          sleepAmt = getSleepAmt();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connectors/BaseRepositoryConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connectors/BaseRepositoryConnector.java
deleted file mode 100644
index c58c1fd..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connectors/BaseRepositoryConnector.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/* $Id: BaseRepositoryConnector.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connectors;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This base class describes an instance of a connection between a repository and ManifoldCF's
-* standard "pull" ingestion agent.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connectors are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.  The complete list is:
-*
-*
-* The purpose of the repository connector is to allow documents to be fetched from the repository.
-*
-* Each repository connector describes a set of documents that are known only to that connector.
-* It therefore establishes a space of document identifiers.  Each connector will only ever be
-* asked to deal with identifiers that have in some way originated from the connector.
-*
-* Documents are fetched using processDocuments(), which then gets to decide how to dispose of the
-* document using the methods available by means of the provided IProcessActivity object.
-*/
-public abstract class BaseRepositoryConnector extends org.apache.manifoldcf.core.connector.BaseConnector implements IRepositoryConnector
-{
-  public static final String _rcsid = "@(#)$Id: BaseRepositoryConnector.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  /** Tell the world what model this connector uses for getDocumentIdentifiers().
-  * This must return a model value as specified above.
-  *@return the model type value.
-  */
-  @Override
-  public int getConnectorModel()
-  {
-    // Return the simplest model - full everything
-    return MODEL_ALL;
-  }
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  *@return the list.
-  */
-  @Override
-  public String[] getActivitiesList()
-  {
-    return new String[0];
-  }
-
-  /** Return the list of relationship types that this connector recognizes.
-  *@return the list.
-  */
-  @Override
-  public String[] getRelationshipTypes()
-  {
-    // The base situation is that there are no relationships.
-    return new String[0];
-  }
-
-  /** Get the bin name strings for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  *@param documentIdentifier is the document identifier.
-  *@return the set of bin names.  If an empty array is returned, it is equivalent to there being no request
-  * rate throttling available for this identifier.
-  */
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    // Base version has one bin for all documents.  Use empty string for this since "*" would make
-    // regexps be difficult to write.
-    return new String[]{""};
-  }
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    return "";
-  }
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // Base implementation does nothing
-  }
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  @Override
-  public int getMaxDocumentRequest()
-  {
-    // Base implementation does one at a time.
-    return 1;
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-    //return "checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-    //return "checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-}
-
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connmgr/ConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connmgr/ConnectorManager.java
deleted file mode 100644
index ca83c46..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connmgr/ConnectorManager.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/* $Id: ConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.connmgr;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import java.util.*;
-
-/** Implementation of IConnectorManager.
- * 
- * <br><br>
- * <b>connectors</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class ConnectorManager extends org.apache.manifoldcf.core.database.BaseTable implements IConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id: ConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public ConnectorManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"connectors");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always do an outer loop, to support upgrade complexities
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade goes here if needed
-      }
-      
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    // First, go through all registered connectors.  This is all inside a transaction.
-    beginTransaction();
-    try
-    {
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        // Call the deinstall method
-        RepositoryConnectorFactory.deinstall(threadContext,className);
-      }
-      performDrop(invKeys);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      //performLock();
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(classNameField,className);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+classNameField+"=?",params,invKeys);
-      }
-
-      // Either way, we must do the install/upgrade itself.
-      RepositoryConnectorFactory.install(threadContext,className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the class of the connector to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // Uninstall first
-      RepositoryConnectorFactory.deinstall(threadContext,className);
-
-      removeConnector(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+classNameField+" AS classname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    return row.getValue(descriptionField).toString();
-  }
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException
-  {
-    // Use the global table key; that's good enough because we don't expect stuff to change out from under very often.
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT * FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BinManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BinManagerFactory.java
deleted file mode 100644
index 4c47d75..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BinManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/** Factory class for IBinManager.
-*/
-public class BinManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Name
-  protected final static String binManagerName = "_BinManager_";
-
-  private BinManagerFactory()
-  {
-  }
-
-  /** Create a bin manager handle.
-  *@param threadContext is the thread context.
-  *@return the handle.
-  */
-  public static IBinManager make(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Object o = threadContext.get(binManagerName);
-    if (o == null || !(o instanceof IBinManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.crawler.bins.BinManager(database);
-      threadContext.save(binManagerName,o);
-    }
-    return (IBinManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BlockingDocuments.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BlockingDocuments.java
deleted file mode 100644
index 7be0b2b..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BlockingDocuments.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id: BlockingDocuments.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-
-/** An instance of this class keeps track of a pool of documents that the stuffer thread believes are ready to be reprioritized.
-* The way it works is that when the stuffer sees documents that it can't use, but which it thinks are eligible from reprioritization,
-* it hands them to this object.  The prioritization thread then takes documents out of this queue and prioritizes them, before it
-* goes looking for other documents.  This process guarantees that the stuffer is not blocked by documents that need reprioritization.
-*/
-public class BlockingDocuments
-{
-  public static final String _rcsid = "@(#)$Id: BlockingDocuments.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // It's a simple queue.  This is the set of DocumentDescription objects that have been placed here by the stuffer.
-  // Since there is a chance that the same document will be entered more than once, it's stored as a hash.
-  protected HashMap docsInNeed = new HashMap();
-
-  /** Constructor */
-  public BlockingDocuments()
-  {
-  }
-
-  /** Add a document to the set */
-  public synchronized void addBlockingDocument(DocumentDescription dd)
-  {
-    docsInNeed.put(dd.getID(),dd);
-  }
-
-  /** Pop a document from the set.
-  *@return null if there are no remaining documents.
-  */
-  public synchronized DocumentDescription getBlockingDocument()
-  {
-    if (docsInNeed.size() == 0)
-      return null;
-    Iterator iter = docsInNeed.keySet().iterator();
-    return (DocumentDescription)docsInNeed.remove((Long)iter.next());
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BucketDescription.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BucketDescription.java
deleted file mode 100644
index 5300115..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/BucketDescription.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $Id: BucketDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Class which describes a specification of how to map a string to another string.
-* This facility is by necessity based on PostgreSQL's implementation of Posix regular expressions,
-* and the substring() operator they provide to extract data from a matched expression of these kinds.
-* See http://www.postgresql.org/docs/7.4/static/functions-matching.html for details.
-*/
-public class BucketDescription
-{
-  public static final String _rcsid = "@(#)$Id: BucketDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the regexp to match.  This will be Posix. */
-  protected String regexp;
-  /** Set to true if the match should be case sensitive, or false if insensitive. */
-  protected boolean isSensitive;
-
-  /** Constructor.
-  */
-  public BucketDescription(String regexp, boolean isSensitive)
-  {
-    this.regexp = regexp;
-    this.isSensitive = isSensitive;
-  }
-
-  /** Get the regexp value.
-  */
-  public String getRegexp()
-  {
-    return regexp;
-  }
-
-  /** Is this case sensitive?
-  */
-  public boolean isSensitive()
-  {
-    return isSensitive;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/CacheKeyFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/CacheKeyFactory.java
deleted file mode 100644
index c843741..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/CacheKeyFactory.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/* $Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-/** This class just represents a central place where cache keys are assembled.
-* All methods are static.
-*/
-public class CacheKeyFactory extends org.apache.manifoldcf.agents.interfaces.CacheKeyFactory
-{
-  public static final String _rcsid = "@(#)$Id: CacheKeyFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected CacheKeyFactory()
-  {
-  }
-
-  /** Construct a key which represents the general list of authority connectors.
-  *@return the cache key.
-  */
-  public static String makeAuthorityConnectionsKey()
-  {
-    return "AUTHORITYCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual authority connection.
-  *@param connectionName is the name of the connection.
-  *@return the cache key.
-  */
-  public static String makeAuthorityConnectionKey(String connectionName)
-  {
-    return "AUTHORITYCONNECTION_"+connectionName;
-  }
-
-  /** Construct a key which represents the general list of repository connectors.
-  *@return the cache key.
-  */
-  public static String makeRepositoryConnectionsKey()
-  {
-    return "REPOSITORYCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual repository connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  public static String makeRepositoryConnectionKey(String connectionName)
-  {
-    return "REPOSITORYCONNECTION_"+connectionName;
-  }
-
-  /** Construct a key which represents the general list of notification connectors.
-  *@return the cache key.
-  */
-  public static String makeNotificationConnectionsKey()
-  {
-    return "NOTIFICATIONCONNECTIONS";
-  }
-
-  /** Construct a key which represents an individual notification connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  public static String makeNotificationConnectionKey(String connectionName)
-  {
-    return "NOTIFICATIONCONNECTION_"+connectionName;
-  }
-
-
-  /** Construct a key which represents the general list of jobs - for queries
-  * that depend on the fixed kind of job data, not the dynamic data (e.g. status)
-  *@return the cache key.
-  */
-  public static String makeJobsKey()
-  {
-    return "JOBS";
-  }
-
-  /** Construct a key which represents the fixed kind of data for an individual job.
-  *@param jobID is the job identifier.
-  *@return the cache key.
-  */
-  public static String makeJobIDKey(String jobID)
-  {
-    return "JOB_"+jobID;
-  }
-
-  /** Construct a key which represents the collective statuses of all jobs.
-  *@return the cache key.
-  */
-  public static String makeJobStatusKey()
-  {
-    return "JOBSTATUSES";
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ConnectorManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ConnectorManagerFactory.java
deleted file mode 100644
index e8a2829..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ConnectorManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id: ConnectorManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/** Factory for connector manager.
-*/
-public class ConnectorManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: ConnectorManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected static final String connMgr = "_ConnectorManager_";
-
-  private ConnectorManagerFactory()
-  {
-  }
-
-  /** Construct a connector manager.
-  *@param tc is the thread context.
-  *@return the connector manager handle.
-  */
-  public static IConnectorManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof IConnectorManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.crawler.connmgr.ConnectorManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (IConnectorManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/Connectors.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/Connectors.java
deleted file mode 100644
index b110fb7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/Connectors.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $Id: Connectors.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-import java.io.*;
-
-/** This class represents the configuration data read from the 'connectors.xml' file, which
-* describes all the individual connector classes and their pretty names.
-*/
-public class Connectors extends Configuration
-{
-  public static final String _rcsid = "@(#)$Id: Connectors.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Constructor.
-  */
-  public Connectors()
-  {
-    super("connectors");
-  }
-
-  /** Construct from XML.
-  *@param xmlStream is the input XML stream.
-  */
-  public Connectors(InputStream xmlStream)
-    throws ManifoldCFException
-  {
-    super("connectors");
-    fromXML(xmlStream);
-  }
-
-  /** Create a new object of the appropriate class.
-  */
-  protected Configuration createNew()
-  {
-    return new Connectors();
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DepthStatistics.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DepthStatistics.java
deleted file mode 100644
index fb90f9a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DepthStatistics.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id: DepthStatistics.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-
-/** An instance of this class keeps a running average of how long it takes for every connection to process a document.
-* This information is used to limit queuing per connection to something reasonable given the characteristics of the connection.
-*/
-public class DepthStatistics
-{
-  public static final String _rcsid = "@(#)$Id: DepthStatistics.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // These are the bins used by all the documents scanned in a set.  Each element is a String[].
-  protected ArrayList scanSetBins = new ArrayList();
-
-  /** Constructor */
-  public DepthStatistics()
-  {
-  }
-
-  /** Add a document's bins to the set */
-  public synchronized void addBins(Double priority)
-  {
-    //System.out.println("Adding "+Integer.toString(binNames.length)+" bins to scan record");
-    scanSetBins.add(priority);
-  }
-
-  /** Grab all the bins in a big array */
-  public synchronized Double[] getBins()
-  {
-    Double[] rval = new Double[scanSetBins.size()];
-    int i = 0;
-    while (i < scanSetBins.size())
-    {
-      rval[i] = (Double)scanSetBins.get(i);
-      //System.out.println(" Bin record "+Integer.toString(i)+" has "+Integer.toString(rval[i].length)+" bins");
-      i++;
-    }
-    //System.out.println("Returning "+Integer.toString(rval.length)+" individual bin records");
-    return rval;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentDescription.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentDescription.java
deleted file mode 100644
index 7b433e8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentDescription.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/* $Id: DocumentDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-/** This class describes a document to be fetched and processes, plus the job it's being fetched as part of, and
-* the time beyond which a failed fetch is considered to be a hard error.
-* It is immutable.
-*/
-public class DocumentDescription
-{
-  public static final String _rcsid = "@(#)$Id: DocumentDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Member variables
-  protected final Long id;
-  protected final Long jobID;
-  protected final String documentIdentifierHash;
-  protected final String documentIdentifier;
-  protected final long failTime;
-  protected final int failRetryCount;
-
-  /** Constructor.
-  *@param id is the record id.
-  *@param jobID is the job identifier for a document to be processed.
-  *@param documentIdentifierHash is the document identifier hash (primary key).
-  *@param documentIdentifier is the document identifier.
-  */
-  public DocumentDescription(Long id, Long jobID, String documentIdentifierHash, String documentIdentifier)
-  {
-    this.id = id;
-    this.jobID = jobID;
-    this.documentIdentifierHash = documentIdentifierHash;
-    this.documentIdentifier = documentIdentifier;
-    this.failTime = -1L;
-    this.failRetryCount = -1;
-  }
-
-  /** Constructor.
-  *@param id is the record id.
-  *@param jobID is the job identifier for a document to be processed.
-  *@param documentIdentifierHash is the document identifier hash (primary key).
-  *@param documentIdentifier is the document identifier.
-  *@param failTime is the time beyond which a failed fetch will be considered a hard error.
-  */
-  public DocumentDescription(Long id, Long jobID, String documentIdentifierHash, String documentIdentifier, long failTime, int failRetryCount)
-  {
-    this.id = id;
-    this.jobID = jobID;
-    this.documentIdentifierHash = documentIdentifierHash;
-    this.documentIdentifier = documentIdentifier;
-    this.failTime = failTime;
-    this.failRetryCount = failRetryCount;
-  }
-
-  /** Get the job queue id.
-  *@return the id.
-  */
-  public Long getID()
-  {
-    return id;
-  }
-
-  /** Get the job identifier.
-  *@return the job id.
-  */
-  public Long getJobID()
-  {
-    return jobID;
-  }
-
-  /** Get document identifier hash (primary key).
-  */
-  public String getDocumentIdentifierHash()
-  {
-    return documentIdentifierHash;
-  }
-
-  /** Get document identifier.
-  *@return the identifier.
-  */
-  public String getDocumentIdentifier()
-  {
-    return documentIdentifier;
-  }
-
-  /** Get the hard fail time.
-  *@return the fail time in ms since epoch, or -1L if none.
-  */
-  public long getFailTime()
-  {
-    return failTime;
-  }
-
-  /** Get the hard fail retry count.
-  *@return the fail retry count, or -1 if none.
-  */
-  public int getFailRetryCount()
-  {
-    return failRetryCount;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentSetAndFlags.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentSetAndFlags.java
deleted file mode 100644
index ac9db0c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentSetAndFlags.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-/** This class describes a set of documents and an associated boolean flag for each.
-*/
-public class DocumentSetAndFlags
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected DocumentDescription[] documentSet;
-  protected boolean[] flags;
-  
-  /** Constructor. */
-  public DocumentSetAndFlags(DocumentDescription[] documentSet, boolean[] flags)
-  {
-    this.documentSet = documentSet;
-    this.flags = flags;
-  }
-  
-  /** Get the document set. */
-  public DocumentDescription[] getDocumentSet()
-  {
-    return documentSet;
-  }
-  
-  /** Get the flags */
-  public boolean[] getFlags()
-  {
-    return flags;
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentVersions.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentVersions.java
deleted file mode 100644
index 29d3279..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/DocumentVersions.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This class represents a set of document versions, organized by document identifier.
-* It's part of the IRepositoryConnector API.
-*/
-public class DocumentVersions
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final Map<String,VersionContext> documentVersions = new HashMap<String,VersionContext>();
-  protected final Set<String> alwaysRefetch = new HashSet<String>();
-  
-  /** Constructor */
-  public DocumentVersions()
-  {
-  }
-  
-  /** Set a non-special document version.
-  *@param documentIdentifier is the document identifier.
-  *@param documentVersion is the document version.
-  */
-  public void setDocumentVersion(String documentIdentifier, VersionContext documentVersion)
-  {
-    documentVersions.put(documentIdentifier,documentVersion);
-  }
-  
-  /** Signal to always refetch document.
-  *@param documentIdentifier is the document identifier.
-  */
-  public void alwaysRefetch(String documentIdentifier)
-  {
-    alwaysRefetch.add(documentIdentifier);
-  }
-  
-  /** Get the document version, if any.
-  *@param documentIdentifier is the document identifier.
-  *@return the document version, if any.  Null indicates that no such document was found.
-  */
-  public VersionContext getDocumentVersion(String documentIdentifier)
-  {
-    return documentVersions.get(documentIdentifier);
-  }
-  
-  /** Check whether we should always refetch a specified document.
-  *@param documentIdentifier is the document identifier.
-  *@return true if we are directed to always refetch.  False will be returned by default.
-  */
-  public boolean isAlwaysRefetch(String documentIdentifier)
-  {
-    return alwaysRefetch.contains(documentIdentifier);
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/EnumeratedValues.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/EnumeratedValues.java
deleted file mode 100644
index d7e05d5..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/EnumeratedValues.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/* $Id: EnumeratedValues.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import java.util.*;
-
-/** This class represents a set of enumerated integer values.
-*/
-public class EnumeratedValues
-{
-  public static final String _rcsid = "@(#)$Id: EnumeratedValues.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Member variables
-  protected HashMap legalValues = new HashMap();
-
-  /** Create enumerated values.
-  *@param values is the set of legal values.
-  */
-  public EnumeratedValues(int[] values)
-  {
-    int i = 0;
-    while (i < values.length)
-    {
-      Integer x = new Integer(values[i++]);
-      legalValues.put(x,x);
-    }
-  }
-
-  /** Create from arraylist.
-  *@param values is the arraylist.
-  */
-  public EnumeratedValues(ArrayList values)
-  {
-    int i = 0;
-    while (i < values.size())
-    {
-      Integer x = (Integer)values.get(i++);
-      legalValues.put(x,x);
-    }
-  }
-
-  /** Create from a list of semicolon-separated strings.
-  *@param values are the values, as strings
-  */
-  public EnumeratedValues(String[] values)
-  {
-    int i = 0;
-    while (i < values.length)
-    {
-      Integer val = new Integer(values[i++]);
-      legalValues.put(val,val);
-    }
-  }
-
-  /** Create for comma-separated list.
-  */
-  public EnumeratedValues(String commaList)
-  {
-    int startIndex = 0;
-    while (true)
-    {
-      int pos = commaList.indexOf(",",startIndex);
-      if (pos == -1)
-      {
-        String endString = commaList.substring(startIndex).trim();
-        if (endString.length() > 0)
-        {
-          Integer x = new Integer(endString);
-          legalValues.put(x,x);
-        }
-        break;
-      }
-      String value = commaList.substring(startIndex,pos).trim();
-      startIndex = pos+1;
-      if (value.length() > 0)
-      {
-        Integer x = new Integer(value);
-        legalValues.put(x,x);
-      }
-    }
-  }
-
-  public boolean checkValue(int value)
-  {
-    return (legalValues.get(new Integer(value)) != null);
-  }
-
-  public Iterator getValues()
-  {
-    return legalValues.keySet().iterator();
-  }
-
-  public int size()
-  {
-    return legalValues.size();
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/FilterCriteria.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/FilterCriteria.java
deleted file mode 100644
index a558883..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/FilterCriteria.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/* $Id: FilterCriteria.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Class which describes specification of history records to include in a report.
-*/
-public class FilterCriteria
-{
-  public static final String _rcsid = "@(#)$Id: FilterCriteria.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The set of activities to match. */
-  protected String[] activityTypes;
-  /** The lowest time of interest. */
-  protected Long startTime;
-  /** The highest time of interest, plus 1. */
-  protected Long endTime;
-  /** The regular expression string to match the entity identifier. */
-  protected RegExpCriteria entityMatch;
-  /** The regular expression string to match the resultcode. */
-  protected RegExpCriteria resultCodeMatch;
-
-  /** Constructor.
-  */
-  public FilterCriteria(String[] activityTypes, Long startTime, Long endTime, RegExpCriteria entityMatch,
-    RegExpCriteria resultCodeMatch)
-  {
-    this.activityTypes = activityTypes;
-    this.startTime = startTime;
-    this.endTime = endTime;
-    this.entityMatch = entityMatch;
-    this.resultCodeMatch = resultCodeMatch;
-  }
-
-  /** Get the desired activities criteria.
-  */
-  public String[] getActivities()
-  {
-    return activityTypes;
-  }
-
-  /** Get desired start time criteria.
-  */
-  public Long getStartTime()
-  {
-    return startTime;
-  }
-
-
-  /** Get desired end time criteria.
-  */
-  public Long getEndTime()
-  {
-    return endTime;
-  }
-
-  /** Get the regular expression to match the entity identifier.
-  */
-  public RegExpCriteria getEntityMatch()
-  {
-    return entityMatch;
-  }
-
-  /** Get the regular expression to match the result code.
-  */
-  public RegExpCriteria getResultCodeMatch()
-  {
-    return resultCodeMatch;
-  }
-
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IAbortActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IAbortActivity.java
deleted file mode 100644
index 0d527d1..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IAbortActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id: IAbortActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that handle job aborts.
-*/
-public interface IAbortActivity
-{
-  public static final String _rcsid = "@(#)$Id: IAbortActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Check whether current job is still active.
-  * This method is provided to allow an individual connector that needs to wait on some long-term condition to give up waiting due to the job
-  * itself being aborted.  If the connector should abort, this method will raise a properly-formed ServiceInterruption, which if thrown to the
-  * caller, will signal that the current seeding activity remains incomplete and must be retried when the job is resumed.
-  */
-  public void checkJobStillActive()
-    throws ManifoldCFException, ServiceInterruption;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IBinManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IBinManager.java
deleted file mode 100644
index a972de6..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IBinManager.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface represents a class that tracks data in document bins.
-*/
-public interface IBinManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Install or upgrade this table.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Reset all bins */
-  public void reset()
-    throws ManifoldCFException;
-
-  /** Get N bin values (and set next one).  If the record does not yet exist, create it with a starting value.
-  * We expect this to happen within a transaction!! 
-  *@param connectorClass is the class name of the connector
-  *@param binName is the name of the bin (256 char max)
-  *@param newBinValue is the value to use if there is no such bin yet.  This is the value that will be
-  * returned; what will be stored will be that value + 1.
-  *@param count is the number of values desired.
-  *@return the counter values.
-  */
-  public double[] getIncrementBinValues(String connectorClass, String binName, double newBinValue, int count)
-    throws ManifoldCFException;
-
-  /** Get N bin values (and set next one).  If the record does not yet exist, create it with a starting value.
-  * This method invokes its own retry-able transaction.
-  *@param connectorClass is the class name of the connector
-  *@param binName is the name of the bin (256 char max)
-  *@param newBinValue is the value to use if there is no such bin yet.  This is the value that will be
-  * returned; what will be stored will be that value + 1.
-  *@param count is the number of values desired.
-  *@return the counter values.
-  */
-  public double[] getIncrementBinValuesInTransaction(String connectorClass, String binName, double newBinValue, int count)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ICarrydownActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ICarrydownActivity.java
deleted file mode 100644
index d6f8be8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ICarrydownActivity.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface describes activities related to carry-down information.
-*/
-public interface ICarrydownActivity
-{
-  /** Retrieve data passed from parents to a specified child document.
-  *@param localIdentifier is the document identifier of the document we want the recorded data for.
-  *@param dataName is the name of the data items to retrieve.
-  *@return an array containing the unique data values passed from ALL parents.  Note that these are in no particular order, and there will not be any duplicates.
-  */
-  public String[] retrieveParentData(String localIdentifier, String dataName)
-    throws ManifoldCFException;
-
-  /** Retrieve data passed from parents to a specified child document.
-  *@param localIdentifier is the document identifier of the document we want the recorded data for.
-  *@param dataName is the name of the data items to retrieve.
-  *@return an array containing the unique data values passed from ALL parents.  Note that these are in no particular order, and there will not be any duplicates.
-  */
-  public CharacterInput[] retrieveParentDataAsFiles(String localIdentifier, String dataName)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IConnectorManager.java
deleted file mode 100644
index d597950..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IConnectorManager.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id: IConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a manager for the registry of connectors.
-* Use this to register or remove a connector from the list of available choices.
-*/
-public interface IConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id: IConnectorManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException;
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the connector class to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException;
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException;
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException;
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException;
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IEventActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IEventActivity.java
deleted file mode 100644
index 80d6705..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IEventActivity.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* $Id: IEventActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that use and govern events.
-*
-* The purpose of this model is to allow a connector to:
-* (a) insure that documents whose prerequisites have not been met do not get processed until those prerequisites are completed
-* (b) guarantee that only one thread at a time deal with sequencing of documents
-*
-* The way it works is as follows.  We define the notion of an "event", which is described by a simple string (and thus can be global,
-* local to a connection, or local to a job, whichever is appropriate).  An event is managed solely by the connector that knows about it.
-* Effectively it can be in either of two states: "completed", or "pending".  The only time the framework ever changes an event state is when
-* the crawler is restarted, at which point all pending events are marked "completed".
-*
-* Documents, when they are added to the processing queue, specify the set of events on which they will block.  If an event is in the "pending" state,
-* no documents that block on that event will be processed at that time.  Of course, it is possible that a document could be handed to processing just before
-* an event entered the "pending" state - in which case it is the responsibility of the connector itself to avoid any problems or conflicts.  This can
-* usually be handled by proper handling of event signalling.  More on that later.
-*
-* The presumed underlying model of flow inside the connector's processing method is as follows:
-* (1) The connector examines the document in question, and decides whether it can be processed successfully or not, based on what it knows about sequencing
-* (2) If the connector determines that the document can properly be processed, it does so, and that's it.
-* (3) If the connector finds a sequencing-related problem, it:
-*     (a) Begins an appropriate event sequence.
-*     (b) If the framework indicates that this event is already in the "pending" state, then some other thread is already handling the event, and the connector
-*          should abort processing of the current document.
-*     (c) If the framework successfully begins the event sequence, then the connector code knows unequivocably that it is the only thread processing the event.
-*         It should take whatever action it needs to - which might be requesting special documents, for instance.  [Note well: At this time, there is no way
-*         to guarantee that special documents added to the queue are in fact properly synchronized by this mechanism, so I recommend avoiding this practice,
-*         and instead handling any special document sequences without involving the queue.]
-*     (d) If the connector CANNOT successfully take the action it needs to to push the sequence along, it MUST set the event back to the "completed" state.
-*         Otherwise, the event will remain in the "pending" state until the next time the crawler is restarted.
-*     (e) If the current document cannot yet be processed, its processing should be aborted.
-* (4) When the connector determines that the event's conditions have been met, or when it determines that an event sequence is no longer viable and has been
-*     aborted, it must set the event status to "completed".
-*
-* In summary, a connector may perform the following event-related actions:
-* (a) Set an event into the "pending" state
-* (b) Set an event into the "completed" state
-* (c) Add a document to the queue with a specified set of prerequisite events attached
-* (d) Request that the current document be requeued for later processing (i.e. abort processing of a document due to sequencing reasons)
-*
-*/
-public interface IEventActivity extends INamingActivity
-{
-  public static final String _rcsid = "@(#)$Id: IEventActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Begin an event sequence.
-  * This method should be called by a connector when a sequencing event should enter the "pending" state.  If the event is already in that state,
-  * this method will return false, otherwise true.  The connector has the responsibility of appropriately managing sequencing given the response
-  * status.
-  *@param eventName is the event name.
-  *@return false if the event is already in the "pending" state.
-  */
-  public boolean beginEventSequence(String eventName)
-    throws ManifoldCFException;
-
-  /** Complete an event sequence.
-  * This method should be called to signal that an event is no longer in the "pending" state.  This can mean that the prerequisite processing is
-  * completed, but it can also mean that prerequisite processing was aborted or cannot be completed.
-  * Note well: This method should not be called unless the connector is CERTAIN that an event is in progress, and that the current thread has
-  * the sole right to complete it.  Otherwise, race conditions can develop which would be difficult to diagnose.
-  *@param eventName is the event name.
-  */
-  public void completeEventSequence(String eventName)
-    throws ManifoldCFException;
-
-  /** Abort processing a document (for sequencing reasons).
-  * This method should be called in order to cause the specified document to be requeued for later processing.  While this is similar in some respects
-  * to the semantics of a ServiceInterruption, it is applicable to only one document at a time, and also does not specify any delay period, since it is
-  * presumed that the reason for the requeue is because of sequencing issues synchronized around an underlying event.
-  *@param localIdentifier is the document identifier to requeue
-  */
-  public void retryDocumentProcessing(String localIdentifier)
-    throws ManifoldCFException;
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IExistingVersions.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IExistingVersions.java
deleted file mode 100644
index af7196c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IExistingVersions.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** This interface describes functionality designed to allow retrieval of existing
-* version information from previous crawls.  It is part of the IRepositoryConnector API.
-*/
-public interface IExistingVersions
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Retrieve the primary existing version string given a document identifier.
-  *@param documentIdentifier is the document identifier.
-  *@return the document version string, or null if the document was never previously indexed.
-  */
-  public String getIndexedVersionString(String documentIdentifier)
-    throws ManifoldCFException;
-
-  /** Retrieve a component existing version string given a document identifier.
-  *@param documentIdentifier is the document identifier.
-  *@param componentIdentifier is the component identifier, if any.
-  *@return the document version string, or null of the document component was never previously indexed.
-  */
-  public String getIndexedVersionString(String documentIdentifier, String componentIdentifier)
-    throws ManifoldCFException;
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IFingerprintActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IFingerprintActivity.java
deleted file mode 100644
index 0eb60d4..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IFingerprintActivity.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id: IFingerprintActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** This interface abstracts from the activities that handle document fingerprinting and mime type acceptance.
-*/
-public interface IFingerprintActivity
-{
-  public static final String _rcsid = "@(#)$Id: IFingerprintActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Detect if a date is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param date is the date of the document; may be null
-  *@return true if a document with that date is indexable by this connector.
-  */
-  public boolean checkDateIndexable(Date date)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  public boolean checkMimeTypeIndexable(String mimeType)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Check whether a document is indexable by the currently specified output connector.
-  *@param localFile is the local copy of the file to check.
-  *@return true if the document is indexable.
-  */
-  public boolean checkDocumentIndexable(File localFile)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Check whether a document of a specific length is indexable by the currently specified output connector.
-  *@param length is the document length.
-  *@return true if the document is indexable.
-  */
-  public boolean checkLengthIndexable(long length)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's URL is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that are not worth indexing.
-  *@param url is the URL of the document.
-  *@return true if the file is indexable.
-  */
-  public boolean checkURLIndexable(String url)
-    throws ManifoldCFException, ServiceInterruption;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IHistoryActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IHistoryActivity.java
deleted file mode 100644
index 55f4b5e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IHistoryActivity.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id: IHistoryActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that manage history information.
-*/
-public interface IHistoryActivity
-{
-  public static final String _rcsid = "@(#)$Id: IHistoryActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // General result codes.  Use these rather than inventing your own, where reasonable.
-  public static final String EXCLUDED_URL = IOutputHistoryActivity.EXCLUDED_URL;
-  public static final String EXCLUDED_LENGTH = IOutputHistoryActivity.EXCLUDED_LENGTH;
-  public static final String EXCLUDED_MIMETYPE = IOutputHistoryActivity.EXCLUDED_MIMETYPE;
-  public static final String EXCLUDED_DATE = IOutputHistoryActivity.EXCLUDED_DATE;
-  public static final String EXCLUDED_CONTENT = IOutputHistoryActivity.EXCLUDED_CONTENT;
-
-  /**
-   * Use this result code when you get URL value from repository and it is not valid.
-   */
-  public static final String BAD_URL = "BADURL";
-  /**
-   * Use this result code when you get URL value from repository and it is null.
-   */
-  public static final String NULL_URL = "NULLURL";
-  /** Record time-stamped information about the activity of the connector.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       activity has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-  *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-  *       "fetch document" activity.  Cannot be null.
-  *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-  *@param entityIdentifier is a (possibly long) string which identifies the object involved in the history record.
-  *       The interpretation of this field will differ from connector to connector.  May be null.
-  *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-  *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  *@param childIdentifiers is a set of child entity identifiers associated with this activity.  May be null.
-  */
-  public void recordActivity(Long startTime, String activityType, Long dataSize,
-    String entityIdentifier, String resultCode, String resultDescription, String[] childIdentifiers)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IJobDescription.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IJobDescription.java
deleted file mode 100644
index 0b028ba..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IJobDescription.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/* $Id: IJobDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-/** This is a paper object describing a job.
-* Each job in lcf has:
-* - an identifier;
-* - a description;
-* - a repository connection;
-* - one of a number of scheduling options: starting every n hours/days/weeks/months, on specific dates, or "continuous" (which basically
-*   establishes a priority queue based on modification frequency);
-* - "seeds" (or starting points), which are the places that scanning begins.
-* Also remember that since incremental deletion must occur on a job-by-job basis, the scanning data also records the job that
-* performed the scan, so that each job can rescan previous ingested data, and delete documents that have been removed.
-*/
-public interface IJobDescription
-{
-  public static final String _rcsid = "@(#)$Id: IJobDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Kinds of document scheduling that are allowed
-  public final static int TYPE_CONTINUOUS = 0;    // Never stops, just reschedules individual documents indefinitely
-  public final static int TYPE_SPECIFIED = 1;     // Stops when out of documents to process; never reschedules documents
-
-  // Kinds of job starting that are allowed
-  public final static int START_WINDOWBEGIN = 0;  // Only start at the beginning of a window
-  public final static int START_WINDOWINSIDE = 1; // Restart even inside a window.
-  public final static int START_DISABLE = 2;      // Disable this job from starting.
-
-  // Hopcount models
-  public final static int HOPCOUNT_ACCURATE = 0;  // Calculate an accurate hopcount, taking into account deletions
-  public final static int HOPCOUNT_NODELETE = 1;  // Hopcount does not reflect any deletions which may have taken place
-  public final static int HOPCOUNT_NEVERDELETE =2;        // This job will never become HOPCOUNT_ACCURATE.
-
-  /** Get isnew.
-  *@return true if the object is new.
-  */
-  public boolean getIsNew();
-
-  /** Get the id.
-  *@return the id.
-  */
-  public Long getID();
-
-  /** Set the description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get the description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the connection name.
-  *@param connectionName is the connection name.
-  */
-  public void setConnectionName(String connectionName);
-
-  /** Get the connection name.
-  *@return the connection name.
-  */
-  public String getConnectionName();
-
-  /** Clear pipeline connections.
-  */
-  public void clearPipeline();
-  
-  /** Add a pipeline connection.
-  *@param prerequisiteStage is the prerequisite stage number for this connection, or -1 if there is none.
-  *@param isOutput is true if the pipeline stage is an output connection.
-  *@param pipelineStageConnectionName is the name of the pipeline connection to add.
-  *@param pipelineStageDescription is a description of the pipeline stage being added.
-  *@return the empty output specification for this pipeline stage.
-  */
-  public Specification addPipelineStage(int prerequisiteStage, boolean isOutput, String pipelineStageConnectionName, String pipelineStageDescription);
-  
-  /** Get a count of pipeline connections.
-  *@return the current number of pipeline connections.
-  */
-  public int countPipelineStages();
-  
-  /** Get the prerequisite stage number for a pipeline stage.
-  *@param index is the index of the pipeline stage to get.
-  *@return the preceding stage number for that stage, or -1 if there is none.
-  */
-  public int getPipelineStagePrerequisite(int index);
-  
-  /** Check if a pipeline stage is an output connection.
-  *@param index is the index of the pipeline stage to check.
-  *@return true if it is an output connection.
-  */
-  public boolean getPipelineStageIsOutputConnection(int index);
-  
-  /** Get a specific pipeline connection name.
-  *@param index is the index of the pipeline stage whose connection name to get.
-  *@return the name of the connection.
-  */
-  public String getPipelineStageConnectionName(int index);
-
-  /** Get a specific pipeline stage description.
-  *@param index is the index of the pipeline stage whose description to get.
-  *@return the name of the connection.
-  */
-  public String getPipelineStageDescription(int index);
-
-  /** Get a specific pipeline stage specification.
-  *@param index is the index of the pipeline stage whose specification is needed.
-  *@return the specification for the connection.
-  */
-  public Specification getPipelineStageSpecification(int index);
-
-  /** Delete a pipeline stage.
-  *@param index is the index of the pipeline stage to delete.
-  */
-  public void deletePipelineStage(int index);
-  
-  /** Insert a new pipeline stage.
-  *@param index is the index to insert pipeline stage before
-  *@param pipelineStageConnectionName is the connection name.
-  *@param pipelineStageDescription is the description.
-  *@return the newly-created output specification.
-  */
-  public Specification insertPipelineStage(int index, boolean isOutput, String pipelineStageConnectionName, String pipelineStageDescription);
-
-  /** Clear notification connections.
-  */
-  public void clearNotifications();
-  
-  /** Add a notification.
-  *@param notificationConnectionName is the name of the notification connection to add.
-  *@param notificationDescription is a description of the notification being added.
-  *@return the empty specification for this notification.
-  */
-  public Specification addNotification(String notificationConnectionName, String notificationDescription);
-  
-  /** Get a count of pipeline connections.
-  *@return the current number of pipeline connections.
-  */
-  public int countNotifications();
-  
-  /** Get a specific notification connection name.
-  *@param index is the index of the notification whose connection name to get.
-  *@return the name of the connection.
-  */
-  public String getNotificationConnectionName(int index);
-
-  /** Get a specific notification description.
-  *@param index is the index of the notification whose description to get.
-  *@return the name of the connection.
-  */
-  public String getNotificationDescription(int index);
-
-  /** Get a specific notification specification.
-  *@param index is the index of the notification whose specification is needed.
-  *@return the specification for the connection.
-  */
-  public Specification getNotificationSpecification(int index);
-
-  /** Delete a notification.
-  *@param index is the index of the notification to delete.
-  */
-  public void deleteNotification(int index);
-  
-  /** Insert a new notification.
-  *@param index is the index to insert pipeline stage before
-  *@param notificationConnectionName is the connection name.
-  *@param notificationDescription is the description.
-  *@return the newly-created output specification.
-  */
-  public Specification insertNotification(int index, String notificationConnectionName, String notificationDescription);
-  
-  /** Set the job type.
-  *@param type is the type (as an integer).
-  */
-  public void setType(int type);
-
-  /** Get the job type.
-  *@return the type (as an integer).
-  */
-  public int getType();
-
-  /** Set the job's start method.
-  *@param startMethod is the start description.
-  */
-  public void setStartMethod(int startMethod);
-
-  /** Get the job's start method.
-  *@return the start method.
-  */
-  public int getStartMethod();
-
-
-  // For time-specified (scheduled) jobs.  These occur at a given time that matches the specifications.
-  // The specifications set certain criteria (specific hours, days of the week, etc.)
-
-  /** Clear all the scheduling records.
-  */
-  public void clearScheduleRecords();
-
-  /** Add a record.
-  *@param record is the record to add.
-  */
-  public void addScheduleRecord(ScheduleRecord record);
-
-  /** Get the number of schedule records.
-  *@return the count.
-  */
-  public int getScheduleRecordCount();
-
-  /** Get a specified schedule record.
-  *@param index is the record number.
-  *@return the record.
-  */
-  public ScheduleRecord getScheduleRecord(int index);
-
-  /** Delete a specified schedule record.
-  *@param index is the record number.
-  */
-  public void deleteScheduleRecord(int index);
-
-
-  // For continuous jobs
-  // This is the rescheduling interval to use when no calculated interval is known
-
-  /** Set the rescheduling interval, in milliseconds, or null if forever.
-  *@param interval is the default interval.
-  */
-  public void setInterval(Long interval);
-
-  /** Get the rescheduling interval, in milliseconds.
-  *@return the default interval, or null if forever.
-  */
-  public Long getInterval();
-
-  /** Set the maximum rescheduling interval, in milliseconds, or null if forever.
-  *@param interval is the maximum interval.
-  */
-  public void setMaxInterval(Long interval);
-
-  /** Get the maximum rescheduling interval, in milliseconds.
-  *@return the max interval, or null if forever.
-  */
-  public Long getMaxInterval();
-
-  /** Set the expiration time, in milliseconds.
-  *@param time is the maximum expiration time of a document, in milliseconds, or null if none.
-  */
-  public void setExpiration(Long time);
-
-  /** Get the expiration time, in milliseconds.
-  *@return the maximum expiration time of a document, or null if none.
-  */
-  public Long getExpiration();
-
-  /** Set the reseeding interval, in milliseconds.
-  *@param interval is the interval, or null for infinite.
-  */
-  public void setReseedInterval(Long interval);
-
-  /** Get the reseeding interval, in milliseconds.
-  *@return the interval, or null if infinite.
-  */
-  public Long getReseedInterval();
-
-  // Document specification
-
-  /** Get the document specification (which can be modified).
-  *@return the specification.
-  */
-  public Specification getSpecification();
-
-
-  // Priority
-
-  /** Set the job priority.  This is a simple integer between 1 and 10, where
-  * 1 is the highest priority.
-  *@param priority is the priority.
-  */
-  public void setPriority(int priority);
-
-  /** Get the job priority.
-  *@return the priority (a number between 1 and 10).
-  */
-  public int getPriority();
-
-  // Hopcount filters
-
-  /** Get the set of hopcount filters the job has defined.
-  *@return the set as a map, keyed by Strings and containing Longs.
-  */
-  public Map getHopCountFilters();
-
-  /** Clear the set of hopcount filters for the job.
-  */
-  public void clearHopCountFilters();
-
-  /** Add a hopcount filter to the job.
-  *@param linkType is the type of link the filter applies to.
-  *@param maxHops is the maximum hop count.  Use null to remove a filter.
-  */
-  public void addHopCountFilter(String linkType, Long maxHops);
-
-  /** Get the hopcount mode. */
-  public int getHopcountMode();
-
-  /** Set the hopcount mode. */
-  public void setHopcountMode(int mode);
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IJobManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IJobManager.java
deleted file mode 100644
index 1db9843..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IJobManager.java
+++ /dev/null
@@ -1,1261 +0,0 @@
-/* $Id: IJobManager.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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.f
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.List;
-
-/** This manager deals with jobs.  Each job is associated with a repository connection, and has a number
-* of scheduling options: starting every n hours/days/weeks/months, on specific dates, or "continuous" (which basically
-* establishes a priority queue based on modification frequency).
-* The job itself also specifies "seeds" (or starting points), which are the places that scanning begins.
-* NOTE WELL: Every job is incremental.  This means that the job will check for deletions among all the documents
-* that it has scanned in the past, as part of the process of ingesting.
-*/
-public interface IJobManager
-{
-  public static final String _rcsid = "@(#)$Id: IJobManager.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  // Actions, for continuous crawling
-  public static final int ACTION_RESCAN = 0;
-  public static final int ACTION_REMOVE = 1;
-
-  // Document states, for status reports.
-  public static final int DOCSTATE_NEVERPROCESSED = 0;
-  public static final int DOCSTATE_PREVIOUSLYPROCESSED = 1;
-  public static final int DOCSTATE_OUTOFSCOPE = 2;
-
-  // Document statuses, for status reports.
-  public static final int DOCSTATUS_INACTIVE = 0;
-  public static final int DOCSTATUS_PROCESSING = 1;
-  public static final int DOCSTATUS_EXPIRING = 2;
-  public static final int DOCSTATUS_DELETING = 3;
-  public static final int DOCSTATUS_READYFORPROCESSING = 4;
-  public static final int DOCSTATUS_READYFOREXPIRATION = 5;
-  public static final int DOCSTATUS_WAITINGFORPROCESSING = 6;
-  public static final int DOCSTATUS_WAITINGFOREXPIRATION = 7;
-  public static final int DOCSTATUS_WAITINGFOREVER = 8;
-  public static final int DOCSTATUS_HOPCOUNTEXCEEDED = 9;
-
-  // Job stop reasons
-  public static final int STOP_ERRORABORT = 0;
-  public static final int STOP_MANUALABORT = 1;
-  public static final int STOP_MANUALPAUSE = 2;
-  public static final int STOP_SCHEDULEPAUSE = 3;
-  public static final int STOP_RESTART = 4;
-  
-  /** Install the job manager's tables.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the job manager's tables.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Load a sorted list of job descriptions.
-  *@return the list, sorted by description.
-  */
-  public IJobDescription[] getAllJobs()
-    throws ManifoldCFException;
-
-  /** Create a new job.
-  *@return the new job.
-  */
-  public IJobDescription createJob()
-    throws ManifoldCFException;
-
-  /** Delete a job.
-  *@param id is the job's identifier.  This method will purge all the records belonging to the job from the database, as
-  * well as remove all documents indexed by the job from the index.
-  */
-  public void deleteJob(Long id)
-    throws ManifoldCFException;
-
-  /** Load a job for editing.
-  *@param id is the job's identifier.
-  *@return null if the job doesn't exist.
-  */
-  public IJobDescription load(Long id)
-    throws ManifoldCFException;
-
-  /** Load a job.
-  *@param id is the job's identifier.
-  *@param readOnly is true if a read-only object is desired.
-  *@return null if the job doesn't exist.
-  */
-  public IJobDescription load(Long id, boolean readOnly)
-    throws ManifoldCFException;
-
-  /** Save a job.
-  *@param jobDescription is the job description.
-  */
-  public void save(IJobDescription jobDescription)
-    throws ManifoldCFException;
-
-  /** See if there's a reference to a connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfReference(String connectionName)
-    throws ManifoldCFException;
-
-  /** See if there's a reference to a notification connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfNotificationReference(String connectionName)
-    throws ManifoldCFException;
-
-  /** See if there's a reference to an output connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfOutputReference(String connectionName)
-    throws ManifoldCFException;
-
-  /** See if there's a reference to a transformation connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfTransformationReference(String connectionName)
-    throws ManifoldCFException;
-
-  /** Get the job IDs associated with a given connection name.
-  *@param connectionName is the name of the connection.
-  *@return the set of job id's associated with that connection.
-  */
-  public IJobDescription[] findJobsForConnection(String connectionName)
-    throws ManifoldCFException;
-
-  /** Clear job seeding state.
-  *@param jobID is the job ID.
-  */
-  public void clearJobSeedingState(Long jobID)
-    throws ManifoldCFException;
-
-  // These methods cover activities that require interaction with the job queue.
-  // The job queue is maintained underneath this interface, and all threads that perform
-  // job activities need to go through this layer.
-
-  /** Reset the job queue for an individual process ID.
-  * If a node was shut down in the middle of doing something, sufficient information should
-  * be around in the database to allow the node's activities to be cleaned up.
-  *@param processID is the process ID of the node we want to clean up after.
-  */
-  public void cleanupProcessData(String processID)
-    throws ManifoldCFException;
-
-  /** Reset the job queue for all process IDs.
-  * If a node was shut down in the middle of doing something, sufficient information should
-  * be around in the database to allow the node's activities to be cleaned up.
-  */
-  public void cleanupProcessData()
-    throws ManifoldCFException;
-
-  /** Prepare to start the entire cluster.
-  * If there are no other nodes alive, then at the time the first node comes up, we need to
-  * reset the job queue for ALL processes that had been running before.  This method must
-  * be called in addition to cleanupProcessData().
-  */
-  public void prepareForClusterStart()
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring document worker threads.
-  *@param processID is the current process ID.
-  */
-  public void resetDocumentWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring seeding threads.
-  */
-  public void resetSeedingWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring doc delete threads.
-  *@param processID is the current process ID.
-  */
-  public void resetDocDeleteWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring doc cleanup threads.
-  *@param processID is the current process ID.
-  */
-  public void resetDocCleanupWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring delete startup threads.
-  *@param processID is the current process ID.
-  */
-  public void resetDeleteStartupWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring notification threads.
-  *@param processID is the current process ID.
-  */
-  public void resetNotificationWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  /** Reset as part of restoring startup threads.
-  *@param processID is the current process ID.
-  */
-  public void resetStartupWorkerStatus(String processID)
-    throws ManifoldCFException;
-
-  // These methods support the "set doc priority" thread
-
-  /** Clear all document priorities, in preparation for reprioritization of all previously-prioritized documents.
-  * This method is called to start the dynamic reprioritization cycle, which follows this
-  * method with explicit prioritization of all documents, piece-meal, using getNextNotYetProcessedReprioritizationDocuments(),
-  * and writeDocumentPriorities().
-  */
-  public void clearAllDocumentPriorities()
-    throws ManifoldCFException;
-
-  /** Get a list of not-yet-processed documents to reprioritize.  Documents in all jobs will be
-  * returned by this method.  Up to n document descriptions will be returned.
-  *@param processID is the process that requests the reprioritization documents.
-  *@param n is the maximum number of document descriptions desired.
-  *@return the document descriptions.
-  */
-  public DocumentDescription[] getNextNotYetProcessedReprioritizationDocuments(String processID, int n)
-    throws ManifoldCFException;
-
-  /** Save a set of document priorities.  In the case where a document was eligible to have its
-  * priority set, but it no longer is eligible, then the provided priority will not be written.
-  *@param descriptions are the document descriptions.
-  *@param priorities are the desired priorities.
-  */
-  public void writeDocumentPriorities(DocumentDescription[] descriptions, IPriorityCalculator[] priorities)
-    throws ManifoldCFException;
-
-  // This method supports the "expiration" thread
-
-  /** Get up to the next n documents to be expired.
-  * This method marks the documents whose descriptions have been returned as "being processed", or active.
-  * The same marking is used as is used for documents that have been queued for worker threads.  The model
-  * is thus identical.
-  *
-  *@param processID is the current process ID.
-  *@param n is the maximum number of records desired.
-  *@param currentTime is the current time.
-  *@return the array of document descriptions to expire.
-  */
-  public DocumentSetAndFlags getExpiredDocuments(String processID, int n, long currentTime)
-    throws ManifoldCFException;
-
-  // This method supports the "queue stuffer" thread
-
-  /** Get up to the next n document(s) to be fetched and processed.
-  * This fetch returns records that contain the document identifier, plus all instructions
-  * pertaining to the document's handling (e.g. whether it should be refetched if the version
-  * has not changed).
-  * This method also marks the documents whose descriptions have be returned as "being processed".
-  *@param processID is the current process ID.
-  *@param n is the number of documents desired.
-  *@param currentTime is the current time; some fetches do not occur until a specific time.
-  *@param interval is the number of milliseconds that this set of documents should represent (for throttling).
-  *@param blockingDocuments is the place to record documents that were encountered, are eligible for reprioritization,
-  *  but could not be queued due to throttling considerations.
-  *@param statistics are the current performance statistics per connection, which are used to balance the queue stuffing
-  *  so that individual connections are not overwhelmed.
-  *@param scanRecord retains the bins from all documents encountered from the query, even those that were skipped due
-  * to being overcommitted.
-  *@return the array of document descriptions to fetch and process.
-  */
-  public DocumentDescription[] getNextDocuments(String processID,
-    int n, long currentTime, long interval,
-    BlockingDocuments blockingDocuments, PerformanceStatistics statistics,
-    DepthStatistics scanRecord)
-    throws ManifoldCFException;
-
-  // These methods support the individual fetch/process threads.
-
-  /** Verify that a specific job is indeed still active.  This is used to permit abort or pause to be relatively speedy.
-  * The query done within MUST be cached in order to not cause undue performance degradation.
-  *@param jobID is the job identifier.
-  *@return true if the job is in one of the "active" states.
-  */
-  public boolean checkJobActive(Long jobID)
-    throws ManifoldCFException;
-
-  /** Verify if a job is still processing documents, or no longer has any outstanding active documents */
-  public boolean checkJobBusy(Long jobID)
-    throws ManifoldCFException;
-
-  /** Note completion of document processing by a job thread of a document.
-  * This method causes the state of the document to be marked as "completed".
-  *@param documentDescriptions are the description objects for the documents that were processed.
-  */
-  public void markDocumentCompletedMultiple(DocumentDescription[] documentDescriptions)
-    throws ManifoldCFException;
-
-  /** Note completion of document processing by a job thread of a document.
-  * This method causes the state of the document to be marked as "completed".
-  *@param documentDescription is the description object for the document that was processed.
-  */
-  public void markDocumentCompleted(DocumentDescription documentDescription)
-    throws ManifoldCFException;
-
-  /** Delete from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be deleted, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentDeletedMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Delete from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be deleted, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentDeleted(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Mark hopcount removal from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be marked as removed, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentHopcountRemovalMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Mark hopcount removal from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be marked as removed, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentHopcountRemoval(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Delete from queue as a result of expiration of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  Since the document expired,
-  * no special activity takes place as a result of the document being in a RESCAN state.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentExpiredMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException;
-  
-  /** Delete from queue as a result of expiration of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  Since the document expired,
-  * no special activity takes place as a result of the document being in a RESCAN state.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentExpired(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Delete from queue as a result of cleaning up an unreachable document.
-  * The document is expected to be in the PURGATORY state.  There is never any need to reprocess the
-  * document.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentCleanedUpMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Delete from queue as a result of cleaning up an unreachable document.
-  * The document is expected to be in the PURGATORY state.  There is never any need to reprocess the
-  * document.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] markDocumentCleanedUp(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Requeue a document set because of carrydown changes.
-  * This method is called when carrydown data is modified for a set of documents.  The documents must be requeued for immediate reprocessing, even to the
-  * extent that if one is *already* being processed, it will need to be done over again.
-  *@param documentDescriptions is the set of description objects for the documents that have had their parent carrydown information changed.
-  *@param docPriorities are the document priorities to assign to the documents, if needed.
-  */
-  public void carrydownChangeDocumentMultiple(DocumentDescription[] documentDescriptions, IPriorityCalculator[] docPriorities)
-    throws ManifoldCFException;
-
-  /** Requeue a document because of carrydown changes.
-  * This method is called when carrydown data is modified for a document.  The document must be requeued for immediate reprocessing, even to the
-  * extent that if it is *already* being processed, it will need to be done over again.
-  *@param documentDescription is the description object for the document that has had its parent carrydown information changed.
-  *@param docPriority is the document priority to assign to the document, if needed.
-  */
-  public void carrydownChangeDocument(DocumentDescription documentDescription, IPriorityCalculator docPriority)
-    throws ManifoldCFException;
-
-  /** Requeue a document for further processing in the future.
-  * This method is called after a document is processed, when the job is a "continuous" one.
-  * It is essentially equivalent to noting that the document processing is complete, except the
-  * document remains on the queue.
-  *@param documentDescriptions is the set of description objects for the document that was processed.
-  *@param executeTimes are the times that the documents should be rescanned.  Null indicates "never".
-  *@param actions are what should be done when the time arrives.  Choices are ACTION_RESCAN or ACTION_REMOVE.
-  */
-  public void requeueDocumentMultiple(DocumentDescription[] documentDescriptions, Long[] executeTimes,
-    int[] actions)
-    throws ManifoldCFException;
-
-
-  /** Requeue a document for further processing in the future.
-  * This method is called after a document is processed, when the job is a "continuous" one.
-  * It is essentially equivalent to noting that the document processing is complete, except the
-  * document remains on the queue.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param executeTime is the time that the document should be rescanned.  Null indicates "never".
-  *@param action is what should be done when the time arrives.  Choices include ACTION_RESCAN or ACTION_REMOVE.
-  */
-  public void requeueDocument(DocumentDescription documentDescription, Long executeTime,
-    int action)
-    throws ManifoldCFException;
-
-  /** Reset documents for further processing in the future.
-  * This method is called after a service interruption is thrown.
-  * It is essentially equivalent to resetting the time for documents to be reprocessed.
-  *@param documentDescriptions is the set of description objects for the document that was processed.
-  *@param executeTime is the time that the documents should be rescanned.
-  *@param failTime is the time beyond which hard failure should occur.
-  *@param failCount is the number of permitted failures before a hard error is signalled.
-  */
-  public void resetDocumentMultiple(DocumentDescription[] documentDescriptions, long executeTime,
-    int action, long failTime, int failCount)
-    throws ManifoldCFException;
-
-  /** Reset an active document back to its former state.
-  * This gets done when there's a service interruption and the document cannot be processed yet.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param executeTime is the time that the document should be rescanned.
-  *@param failTime is the time that the document should be considered to have failed, if it has not been
-  * successfully read until then.
-  *@param failCount is the number of permitted failures before a hard error is signalled.
-  */
-  public void resetDocument(DocumentDescription documentDescription, long executeTime, int action, long failTime,
-    int failCount)
-    throws ManifoldCFException;
-
-  /** Reset a set of deleting documents for further processing in the future.
-  * This method is called after some unknown number of the documents were deleted, but then an ingestion service interruption occurred.
-  * Note well: The logic here basically presumes that we cannot know whether the documents were indeed processed or not.
-  * If we knew for a fact that none of the documents had been handled, it would be possible to look at the document's
-  * current status and decide what the new status ought to be, based on a true rollback scenario.  Such cases, however, are rare enough so that
-  * special logic is probably not worth it.
-  *@param documentDescriptions is the set of description objects for the document that was processed.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  public void resetDeletingDocumentMultiple(DocumentDescription[] documentDescriptions, long checkTime)
-    throws ManifoldCFException;
-
-  /** Reset a deleting document back to its former state.
-  * This gets done when a deleting thread sees a service interruption, etc., from the ingestion system.
-  *@param documentDescription is the description object for the document that was cleaned.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  public void resetDeletingDocument(DocumentDescription documentDescription, long checkTime)
-    throws ManifoldCFException;
-
-  /** Reset a cleaning document back to its former state.
-  * This gets done when a cleaning thread sees a service interruption, etc., from the ingestion system.
-  *@param documentDescription is the description object for the document that was cleaned.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  public void resetCleaningDocument(DocumentDescription documentDescription, long checkTime)
-    throws ManifoldCFException;
-
-  /** Reset a set of cleaning documents for further processing in the future.
-  * This method is called after some unknown number of the documents were cleaned, but then an ingestion service interruption occurred.
-  * Note well: The logic here basically presumes that we cannot know whether the documents were indeed cleaned or not.
-  * If we knew for a fact that none of the documents had been handled, it would be possible to look at the document's
-  * current status and decide what the new status ought to be, based on a true rollback scenario.  Such cases, however, are rare enough so that
-  * special logic is probably not worth it.
-  *@param documentDescriptions is the set of description objects for the document that was cleaned.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  public void resetCleaningDocumentMultiple(DocumentDescription[] documentDescriptions, long checkTime)
-    throws ManifoldCFException;
-
-  /** Retry startup.
-  *@param jobStartRecord is the current job startup record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failRetryCount is the new fail retry count (-1 if none).
-  */
-  public void retryStartup(JobStartRecord jobStartRecord, long failTime, int failRetryCount)
-    throws ManifoldCFException;
-
-  /** Retry seeding.
-  *@param jobSeedingRecord is the current job seeding record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failRetryCount is the new fail retry count (-1 if none).
-  */
-  public void retrySeeding(JobSeedingRecord jobSeedingRecord, long failTime, int failRetryCount)
-    throws ManifoldCFException;
-
-  /** Retry notification.
-  *@param jobNotifyRecord is the current job notification record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failRetryCount is the new fail retry count (-1 if none).
-  */
-  public void retryNotification(JobNotifyRecord jobNotifyRecord, long failTime, int failRetryCount)
-    throws ManifoldCFException;
-
-  /** Retry delete notification.
-  *@param jnr is the current job notification record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failCount is the new fail retry count (-1 if none).
-  */
-  public void retryDeleteNotification(JobNotifyRecord jnr, long failTime, int failCount)
-    throws ManifoldCFException;
-
-  /** Add an initial set of documents to the queue.
-  * This method is called during job startup, when the queue is being loaded.
-  * A set of document references is passed to this method, which updates the status of the document
-  * in the specified job's queue, according to specific state rules.
-  *@param processID is the current process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes are the hashes of the local document identifiers (primary key).
-  *@param docIDs are the local document identifiers.
-  *@param overrideSchedule is true if any existing document schedule should be overridden.
-  *@param hopcountMethod is either accurate, nodelete, or neverdelete.
-  *@param documentPriorities are the document priorities corresponding to the document identifiers.
-  *@param prereqEventNames are the events that must be completed before each document can be processed.
-  */
-  public void addDocumentsInitial(String processID,
-    Long jobID, String[] legalLinkTypes,
-    String[] docIDHashes, String[] docIDs, boolean overrideSchedule,
-    int hopcountMethod, IPriorityCalculator[] documentPriorities,
-    String[][] prereqEventNames)
-    throws ManifoldCFException;
-
-  /** Add an initial set of remaining documents to the queue.
-  * This method is called during job startup, when the queue is being loaded, to list documents that
-  * were NOT included by calling addDocumentsInitial().  Documents listed here are simply designed to
-  * enable the framework to get rid of old, invalid seeds.  They are not queued for processing.
-  *@param processID is the current process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes are the hash values of the local document identifiers.
-  *@param hopcountMethod is either accurate, nodelete, or neverdelete.
-  */
-  public void addRemainingDocumentsInitial(String processID,
-    Long jobID, String[] legalLinkTypes,
-    String[] docIDHashes,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Signal that a seeding pass has been done.
-  * Call this method at the end of a seeding pass.  It is used to perform the bookkeeping necessary to
-  * maintain the hopcount table.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param isPartial is set if the seeds provided are only a partial list.  Some connectors cannot
-  *       supply a full list of seeds on every seeding iteration; this acknowledges that limitation.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  */
-  public void doneDocumentsInitial(Long jobID, String[] legalLinkTypes, boolean isPartial,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Begin an event sequence.
-  *@param processID is the current process ID.
-  *@param eventName is the name of the event.
-  *@return true if the event could be created, or false if it's already there.
-  */
-  public boolean beginEventSequence(String processID, String eventName)
-    throws ManifoldCFException;
-
-  /** Complete an event sequence.
-  *@param eventName is the name of the event.
-  */
-  public void completeEventSequence(String eventName)
-    throws ManifoldCFException;
-
-  /** Get the specified hop counts, with the limit as described.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes is the set of document hashes to find the hopcount for.
-  *@param linkType is the kind of link to find the hopcount for.
-  *@param limit is the limit, beyond which a negative distance may be returned.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return a vector of booleans corresponding to the documents requested.  A true value is returned
-  * if the document is within the specified limit, false otherwise.
-  */
-  public boolean[] findHopCounts(Long jobID, String[] legalLinkTypes, String[] docIDHashes, String linkType, int limit,
-    int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Get all the current seeds.
-  * Returns the seed document identifiers for a job.
-  *@param jobID is the job identifier.
-  *@return the document identifier hashes that are currently considered to be seeds.
-  */
-  public String[] getAllSeeds(Long jobID)
-    throws ManifoldCFException;
-
-  /** Add a document to the queue.
-  * This method is called during document processing, when a document reference is discovered.
-  * The document reference is passed to this method, which updates the status of the document
-  * in the specified job's queue, according to specific state rules.
-  *@param processID is the current process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHash is the local document identifier hash value.
-  *@param parentIdentifierHash is the optional parent identifier hash value for this document.  Pass null if none.
-  *       MUST be present in the case of carrydown information.
-  *@param relationshipType is the optional link type between this document and its parent.  Pass null if there
-  *       is no relationship with a parent.
-  *@param hopcountMethod is either accurate, nodelete, or neverdelete.
-  *@param dataNames are the names of the data to carry down to the child from this parent.
-  *@param dataValues are the values to carry down to the child from this parent, corresponding to dataNames above.  If CharacterInput objects are passed in here,
-  *       it is the caller's responsibility to clean these up.
-  *@param priority is the desired document priority for the document.
-  *@param prereqEventNames are the events that must be completed before the document can be processed.
-  */
-  public void addDocument(String processID,
-    Long jobID, String[] legalLinkTypes,
-    String docIDHash, String docID,
-    String parentIdentifierHash,
-    String relationshipType,
-    int hopcountMethod, String[] dataNames, Object[][] dataValues,
-    IPriorityCalculator priority, String[] prereqEventNames)
-    throws ManifoldCFException;
-
-  /** Add documents to the queue in bulk.
-  * This method is called during document processing, when a set of document references are discovered.
-  * The document references are passed to this method, which updates the status of the document(s)
-  * in the specified job's queue, according to specific state rules.
-  *@param processID is the current process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes are the hashes of the local document identifiers.
-  *@param docIDs are the local document identifiers.
-  *@param parentIdentifierHash is the optional parent identifier hash of these documents.  Pass null if none.
-  *       MUST be present in the case of carrydown information.
-  *@param relationshipType is the optional link type between this document and its parent.  Pass null if there
-  *       is no relationship with a parent.
-  *@param hopcountMethod is either accurate, nodelete, or neverdelete.
-  *@param dataNames are the names of the data to carry down to the child from this parent.
-  *@param dataValues are the values to carry down to the child from this parent, corresponding to dataNames above.  If CharacterInput objects are passed in here,
-  *       it is the caller's responsibility to clean these up.
-  *@param priorities are the desired document priorities for the documents.
-  *@param prereqEventNames are the events that must be completed before each document can be processed.
-  */
-  public void addDocuments(String processID,
-    Long jobID, String[] legalLinkTypes,
-    String[] docIDHashes, String[] docIDs,
-    String parentIdentifierHash,
-    String relationshipType,
-    int hopcountMethod, String[][] dataNames, Object[][][] dataValues,
-    IPriorityCalculator[] priorities,
-    String[][] prereqEventNames)
-    throws ManifoldCFException;
-
-  /** Complete adding child documents to the queue, for a set of documents.
-  * This method is called at the end of document processing, to help the hopcount tracking engine do its bookkeeping.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param parentIdentifierHashes are the hashes of the document identifiers for whom child link extraction just took place.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  public DocumentDescription[] finishDocuments(Long jobID, String[] legalLinkTypes,
-    String[] parentIdentifierHashes, int hopcountMethod)
-    throws ManifoldCFException;
-
-  /** Undo the addition of child documents to the queue, for a set of documents.
-  * This method is called at the end of document processing, to back out any incomplete additions to the queue, and restore
-  * the status quo ante prior to the incomplete additions.  Call this method instead of finishDocuments() if the
-  * addition of documents was not completed.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param parentIdentifierHashes are the hashes of the document identifiers for whom child link extraction just took place.
-  */
-  public void revertDocuments(Long jobID, String[] legalLinkTypes,
-    String[] parentIdentifierHashes)
-    throws ManifoldCFException;
-
-  /** Retrieve specific parent data for a given document.
-  *@param jobID is the job identifier.
-  *@param docIDHash is the hash of the document identifier.
-  *@param dataName is the kind of data to retrieve.
-  *@return the unique data values.
-  */
-  public String[] retrieveParentData(Long jobID, String docIDHash, String dataName)
-    throws ManifoldCFException;
-
-  /** Retrieve specific parent data for a given document.
-  *@param jobID is the job identifier.
-  *@param docIDHash is the document identifier hash value.
-  *@param dataName is the kind of data to retrieve.
-  *@return the unique data values.
-  */
-  public CharacterInput[] retrieveParentDataAsFiles(Long jobID, String docIDHash, String dataName)
-    throws ManifoldCFException;
-
-  // These methods support the job threads (which start jobs and end jobs)
-  // There is one thread that starts jobs.  It simply looks for jobs which are ready to
-  // start, and changes their state accordingly.
-  // There is also a pool of threads that end jobs.  These threads wait for a job that
-  // looks like it is done, and do completion processing if it is.
-
-  /** Manually start a job.  The specified job will be run REGARDLESS of the timed windows, and
-  * will not cease until complete.  If the job is already running, this operation will assure that
-  * the job does not pause when its window ends.  The job can be manually paused, or manually aborted.
-  *@param jobID is the ID of the job to start.
-  *@param requestMinimum is true if a minimal job run is requested.
-  */
-  public void manualStart(Long jobID, boolean requestMinimum)
-    throws ManifoldCFException;
-
-  /** Manually start a job.  The specified job will be run REGARDLESS of the timed windows, and
-  * will not cease until complete.  If the job is already running, this operation will assure that
-  * the job does not pause when its window ends.  The job can be manually paused, or manually aborted.
-  *@param jobID is the ID of the job to start.
-  */
-  public void manualStart(Long jobID)
-    throws ManifoldCFException;
-
-  /** Manually abort a running job.  The job will be permanently stopped, and will not run again until
-  * automatically started based on schedule, or manually started.
-  *@param jobID is the job to abort.
-  */
-  public void manualAbort(Long jobID)
-    throws ManifoldCFException;
-
-  /** Manually restart a running job.  The job will be stopped and restarted.  Any schedule affinity will be lost,
-  * until the job finishes on its own.
-  *@param jobID is the job to abort.
-  *@param requestMinimum is true if a minimal job run is requested.
-  */
-  public void manualAbortRestart(Long jobID, boolean requestMinimum)
-    throws ManifoldCFException;
-
-  /** Manually restart a running job.  The job will be stopped and restarted.  Any schedule affinity will be lost,
-  * until the job finishes on its own.
-  *@param jobID is the job to abort.
-  */
-  public void manualAbortRestart(Long jobID)
-    throws ManifoldCFException;
-
-  /** Pause a job.
-  *@param jobID is the job identifier to pause.
-  */
-  public void pauseJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Restart a paused job.
-  *@param jobID is the job identifier to restart.
-  */
-  public void restartJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Reset job schedule.  This re-evaluates whether the job should be started now.  This method would typically
-  * be called after a job's scheduling window has been changed.
-  *@param jobID is the job identifier.
-  */
-  public void resetJobSchedule(Long jobID)
-    throws ManifoldCFException;
-
-  // These methods are called by automatic processes
-
-  /** Start jobs based on schedule.
-  * This method marks all the appropriate jobs as "in progress", which is all that should be
-  * needed to start them.
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@param unwaitList is filled in with the set of job id's that were resumed (Long's).
-  */
-  public void startJobs(long currentTime, List<Long> unwaitList)
-    throws ManifoldCFException;
-
-
-  /** Put active or paused jobs in wait state, if they've exceeded their window.
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@param waitList is filled in with the set of job id's that were put into a wait state (Long's).
-  */
-  public void waitJobs(long currentTime, List<Long> waitList)
-    throws ManifoldCFException;
-
-  /** Get the list of jobs that are ready for seeding.
-  *@param processID is the current process ID.
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@return jobs that are active and are running in adaptive mode.  These will be seeded
-  * based on what the connector says should be added to the queue.
-  */
-  public JobSeedingRecord[] getJobsReadyForSeeding(String processID, long currentTime)
-    throws ManifoldCFException;
-
-  /** Reset a seeding job back to "active" state.
-  *@param jobID is the job id.
-  */
-  public void resetSeedJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Get the list of jobs that are ready for delete cleanup.
-  *@param processID is the current process ID.
-  *@return jobs that were in the "readyfordelete" state.
-  */
-  public JobDeleteRecord[] getJobsReadyForDeleteCleanup(String processID)
-    throws ManifoldCFException;
-    
-  /** Get the list of jobs that are ready for startup.
-  *@param processID is the current process ID.
-  *@return jobs that were in the "readyforstartup" state.  These will be marked as being in the "starting up" state.
-  */
-  public JobStartRecord[] getJobsReadyForStartup(String processID)
-    throws ManifoldCFException;
-
-  /** Find the list of jobs that need to have their connectors notified of job completion.
-  *@param processID is the current process ID.
-  *@return the ID's of jobs that need their output connectors notified in order to become inactive.
-  */
-  public JobNotifyRecord[] getJobsReadyForInactivity(String processID)
-    throws ManifoldCFException;
-
-  /** Find the list of jobs that need to have their connectors notified of job deletion.
-  *@param processID is the process ID.
-  *@return the ID's of jobs that need their output connectors notified in order to be removed.
-  */
-  public JobNotifyRecord[] getJobsReadyForDelete(String processID)
-    throws ManifoldCFException;
-
-  /** Inactivate a job, from the notification state.
-  *@param jobID is the ID of the job to inactivate.
-  */
-  public void inactivateJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Remove a job, from the notification state.
-  *@param jobID is the ID of the job to remove.
-  */
-  public void removeJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Reset a job starting for delete back to "ready for delete"
-  * state.
-  *@param jobID is the job id.
-  */
-  public void resetStartDeleteJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Reset a job that is notifying back to "ready for notify"
-  * state.
-  *@param jobID is the job id.
-  */
-  public void resetNotifyJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Reset a job that is delete notifying back to "ready for delete notify"
-  * state.
-  *@param jobID is the job id.
-  */
-  public void resetDeleteNotifyJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Reset a starting job back to "ready for startup" state.
-  *@param jobID is the job id.
-  */
-  public void resetStartupJob(Long jobID)
-    throws ManifoldCFException;
-
-  /** Prepare for a delete scan.
-  *@param jobID is the job id.
-  */
-  public void prepareDeleteScan(Long jobID)
-    throws ManifoldCFException;
-
-  /** Prepare a job to be run.
-  * This method is called regardless of the details of the job; what differs is only the flags that are passed in.
-  * The code inside will determine the appropriate procedures.
-  * (This method replaces prepareFullScan() and prepareIncrementalScan(). )
-  *@param jobID is the job id.
-  *@param legalLinkTypes are the link types allowed for the job.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@param connectorModel is the model used by the connector for the job.
-  *@param continuousJob is true if the job is a continuous one.
-  *@param fromBeginningOfTime is true if the job is running starting from time 0.
-  *@param requestMinimum is true if the minimal amount of work is requested for the job run.
-  */
-  public void prepareJobScan(Long jobID, String[] legalLinkTypes, int hopcountMethod,
-    int connectorModel, boolean continuousJob, boolean fromBeginningOfTime,
-    boolean requestMinimum)
-    throws ManifoldCFException;
-  
-  /** Note job delete started.
-  *@param jobID is the job id.
-  *@param startTime is the job start time.
-  */
-  public void noteJobDeleteStarted(Long jobID, long startTime)
-    throws ManifoldCFException;
-
-  /** Note job started.
-  *@param jobID is the job id.
-  *@param startTime is the job start time.
-  *@param seedingVersion is the seeding version to record with the job start.
-  */
-  public void noteJobStarted(Long jobID, long startTime, String seedingVersion)
-    throws ManifoldCFException;
-
-  /** Note job seeded.
-  *@param jobID is the job id.
-  *@param seedingVersion is the seeding version string to record.
-  */
-  public void noteJobSeeded(Long jobID, String seedingVersion)
-    throws ManifoldCFException;
-
-  /**  Note the deregistration of a connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note the registration of a connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /**  Note the deregistration of a notification connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteNotificationConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note the registration of a notification connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteNotificationConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note a change in connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external repository change
-  * is signalled.
-  */
-  public void noteConnectionChange(String connectionName)
-    throws ManifoldCFException;
-
-  /** Note a change in notification connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external repository change
-  * is signalled.
-  */
-  public void noteNotificationConnectionChange(String connectionName)
-    throws ManifoldCFException;
-    
-  /**  Note the deregistration of an output connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteOutputConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note the registration of an output connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteOutputConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note a change in output connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external output target change
-  * is signalled.
-  */
-  public void noteOutputConnectionChange(String connectionName)
-    throws ManifoldCFException;
-
-  /**  Note the deregistration of a transformation connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteTransformationConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note the registration of a transformation connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  public void noteTransformationConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException;
-
-  /** Note a change in transformation connection configuration.
-  * This method will be called whenever a connection's configuration is modified.
-  */
-  public void noteTransformationConnectionChange(String connectionName)
-    throws ManifoldCFException;
-
-  /** Assess jobs marked to be in need of assessment for connector status changes.
-  */
-  public void assessMarkedJobs()
-    throws ManifoldCFException;
-
-  /** Delete jobs in need of being deleted (which are marked "ready for delete").
-  * This method is meant to be called periodically to perform delete processing on jobs.
-  */
-  public void deleteJobsReadyForDelete()
-    throws ManifoldCFException;
-
-  /** Get list of deletable document descriptions.  This list will take into account
-  * multiple jobs that may own the same document.
-  *@param processID is the current process ID.
-  *@param n is the maximum number of documents to return.
-  *@param currentTime is the current time; some fetches do not occur until a specific time.
-  *@return the document descriptions for these documents.
-  */
-  public DocumentDescription[] getNextDeletableDocuments(String processID,
-    int n, long currentTime)
-    throws ManifoldCFException;
-
-  /** Get list of cleanable document descriptions.  This list will take into account
-  * multiple jobs that may own the same document.
-  *@param processID is the current process ID.
-  *@param n is the maximum number of documents to return.
-  *@param currentTime is the current time; some fetches do not occur until a specific time.
-  *@return the document descriptions for these documents.
-  */
-  public DocumentSetAndFlags getNextCleanableDocuments(String processID,
-    int n, long currentTime)
-    throws ManifoldCFException;
-
-  /** Delete ingested document identifiers (as part of deleting the owning job).
-  * The number of identifiers specified is guaranteed to be less than the maxInClauseCount
-  * for the database.
-  *@param identifiers is the set of document identifiers.
-  */
-  public void deleteIngestedDocumentIdentifiers(DocumentDescription[] identifiers)
-    throws ManifoldCFException;
-
-  /** Abort a running job due to a fatal error condition.
-  *@param jobID is the job to abort.
-  *@param errorText is the error text.
-  *@return true if this is the first abort for the job.
-  */
-  public boolean errorAbort(Long jobID, String errorText)
-    throws ManifoldCFException;
-
-  /** Complete the sequence that stops jobs, either for abort, pause, or because of a scheduling
-  * window.  The logic will move the job to its next state (INACTIVE, PAUSED, ACTIVEWAIT),
-  * and will record the jobs that have been so modified.
-  *@param timestamp is the current time in milliseconds since epoch.
-  *@param modifiedJobs is filled in with the set of IJobDescription objects that were stopped.
-  *@param stopNotificationTypes is filled in with the type of stop notification.
-  */
-  public void finishJobStops(long timestamp, List<IJobDescription> modifiedJobs, List<Integer> stopNotificationTypes)
-    throws ManifoldCFException;
-
-  /** Complete the sequence that resumes jobs, either from a pause or from a scheduling window
-  * wait.  The logic will restore the job to an active state (many possibilities depending on
-  * connector status), and will record the jobs that have been so modified.
-  *@param timestamp is the current time in milliseconds since epoch.
-  *@param modifiedJobs is filled in with the set of IJobDescription objects that were resumed.
-  */
-  public void finishJobResumes(long timestamp, List<IJobDescription> modifiedJobs)
-    throws ManifoldCFException;
-    
-  /** Put all eligible jobs in the "shutting down" state.
-  */
-  public void finishJobs()
-    throws ManifoldCFException;
-
-  /** Reset eligible jobs either back to the "inactive" state, or make them active again.  The
-  * latter will occur if the cleanup phase of the job generated more pending documents.
-  *
-  *  This method is used to pick up all jobs in the shutting down state
-  * whose purgatory or being-cleaned records have been all processed.
-  *
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@param resetJobs is filled in with the set of IJobDescription objects that were reset.
-  */
-  public void resetJobs(long currentTime, List<IJobDescription> resetJobs)
-    throws ManifoldCFException;
-
-
-  // Status reports
-
-  /** Get the status of a job.
-  *@param jobID is the job ID.
-  *@return the status object for the specified job.
-  */
-  public JobStatus getStatus(Long jobID)
-    throws ManifoldCFException;
-
-  /** Get a list of all jobs, and their status information.
-  *@return an ordered array of job status objects.
-  */
-  public JobStatus[] getAllStatus()
-    throws ManifoldCFException;
-
-  /** Get a list of running jobs.  This is for status reporting.
-  *@return an array of the job status objects.
-  */
-  public JobStatus[] getRunningJobs()
-    throws ManifoldCFException;
-
-  /** Get a list of completed jobs, and their statistics.
-  *@return an array of the job status objects.
-  */
-  public JobStatus[] getFinishedJobs()
-    throws ManifoldCFException;
-
-  /** Get the status of a job.
-  *@param jobID is the job ID.
-  *@param includeCounts is true if document counts should be included.
-  *@return the status object for the specified job.
-  */
-  public JobStatus getStatus(Long jobID, boolean includeCounts)
-    throws ManifoldCFException;
-
-  /** Get a list of all jobs, and their status information.
-  *@param includeCounts is true if document counts should be included.
-  *@return an ordered array of job status objects.
-  */
-  public JobStatus[] getAllStatus(boolean includeCounts)
-    throws ManifoldCFException;
-
-  /** Get a list of running jobs.  This is for status reporting.
-  *@param includeCounts is true if document counts should be included.
-  *@return an array of the job status objects.
-  */
-  public JobStatus[] getRunningJobs(boolean includeCounts)
-    throws ManifoldCFException;
-
-  /** Get a list of completed jobs, and their statistics.
-  *@param includeCounts is true if document counts should be included.
-  *@return an array of the job status objects.
-  */
-  public JobStatus[] getFinishedJobs(boolean includeCounts)
-    throws ManifoldCFException;
-
-  /** Get the status of a job.
-  *@param jobID is the job ID.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return the status object for the specified job.
-  */
-  public JobStatus getStatus(Long jobID, boolean includeCounts, int maxCount)
-    throws ManifoldCFException;
-
-  /** Get a list of all jobs, and their status information.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return an ordered array of job status objects.
-  */
-  public JobStatus[] getAllStatus(boolean includeCounts, int maxCount)
-    throws ManifoldCFException;
-
-  /** Get a list of running jobs.  This is for status reporting.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return an array of the job status objects.
-  */
-  public JobStatus[] getRunningJobs(boolean includeCounts, int maxCount)
-    throws ManifoldCFException;
-
-  /** Get a list of completed jobs, and their statistics.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return an array of the job status objects.
-  */
-  public JobStatus[] getFinishedJobs(boolean includeCounts, int maxCount)
-    throws ManifoldCFException;
-
-  // The following commands generate reports based on the queue.
-
-  /** Run a 'document status' report.
-  *@param connectionName is the name of the connection.
-  *@param filterCriteria are the criteria used to limit the records considered for the report.
-  *@param sortOrder is the specified sort order of the final report.
-  *@param startRow is the first row to include.
-  *@param rowCount is the number of rows to include.
-  *@return the results, with the following columns: identifier, job, state, status, scheduled, action, retrycount, retrylimit.  The "scheduled" column and the
-  * "retrylimit" column are long values representing a time; all other values will be user-friendly strings.
-  */
-  public IResultSet genDocumentStatus(String connectionName, StatusFilterCriteria filterCriteria, SortOrder sortOrder,
-    int startRow, int rowCount)
-    throws ManifoldCFException;
-
-  /** Run a 'queue status' report.
-  *@param connectionName is the name of the connection.
-  *@param filterCriteria are the criteria used to limit the records considered for the report.
-  *@param sortOrder is the specified sort order of the final report.
-  *@param idBucketDescription is the bucket description for generating the identifier class.
-  *@param startRow is the first row to include.
-  *@param rowCount is the number of rows to include.
-  *@return the results, with the following columns: idbucket, inactive, processing, expiring, deleting,
-  processready, expireready, processwaiting, expirewaiting
-  */
-  public IResultSet genQueueStatus(String connectionName, StatusFilterCriteria filterCriteria, SortOrder sortOrder,
-    BucketDescription idBucketDescription, int startRow, int rowCount)
-    throws ManifoldCFException;
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INamingActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INamingActivity.java
deleted file mode 100644
index 8e34adc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INamingActivity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $Id: INamingActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that use global, connection-specific, and job-specific names.
-*
-*/
-public interface INamingActivity
-{
-  public static final String _rcsid = "@(#)$Id: INamingActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Create a global string from a simple string.
-  *@param simpleString is the simple string.
-  *@return a global string.
-  */
-  public String createGlobalString(String simpleString);
-
-  /** Create a connection-specific string from a simple string.
-  *@param simpleString is the simple string.
-  *@return a connection-specific string.
-  */
-  public String createConnectionSpecificString(String simpleString);
-
-  /** Create a job-based string from a simple string.
-  *@param simpleString is the simple string.
-  *@return a job-specific string.
-  */
-  public String createJobSpecificString(String simpleString);
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnection.java
deleted file mode 100644
index 2c68f3f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnection.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** An instance of this interface represents a paper object that describes a notification connection.
-* This is the paper object meant for editing and manipulation.
-*/
-public interface INotificationConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className);
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName();
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams();
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount);
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections();
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectionManager.java
deleted file mode 100644
index 713eb75..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectionManager.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Manager classes of this kind use the database to contain a human description of a notification connection.
-*/
-public interface INotificationConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Obtain a list of the notification connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public INotificationConnection[] getAllConnections()
-    throws ManifoldCFException;
-
-  /** Load a notification connection by name.
-  *@param name is the name of the notification connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public INotificationConnection load(String name)
-    throws ManifoldCFException;
-
-  /** Load a set of notification connections.
-  *@param names are the names of the notification connections.
-  *@return the descriptors of the notification connections, with null
-  * values for those not found.
-  */
-  public INotificationConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new notification connection object.
-  *@return the new object.
-  */
-  public INotificationConnection create()
-    throws ManifoldCFException;
-
-  /** Save a notification connection object.
-  *@param object is the object to save.
-  *@return true if the object is created, false otherwise.
-  */
-  public boolean save(INotificationConnection object)
-    throws ManifoldCFException;
-
-  /** Delete a notification connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  /** Get a list of notification connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the notification connections that use that connector.
-  */
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException;
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Return the primary table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Return the name column.
-  *@return the name column.
-  */
-  public String getConnectionNameColumn();
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnector.java
deleted file mode 100644
index be77d76..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnector.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes an instance of a connection between a notification engine
-* and ManifoldCF's standard "pull" ingestion agent.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connectors are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.
-*
-* The purpose of the notification connector is to notify people of job interruptions.
-*
-*/
-public interface INotificationConnector extends IConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several
-  * connector-specific queries.  These are usually used to create external UI's.  The connector will be
-  * connected before this method is called.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException;
-
-  /** Notify of job stop due to error abort.
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobStopErrorAbort(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify of job stop due to manual abort.
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobStopManualAbort(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify of job stop due to manual pause.
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobStopManualPause(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify of job stop due to schedule pause.
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobStopSchedulePause(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify of job stop due to restart.
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobStopRestart(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Notify of job end
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobEnd(Specification spec)
-    throws ManifoldCFException, ServiceInterruption;
-	
-  // UI support methods.
-  //
-  // The UI support methods come in two varieties.  The first group (inherited from IConnector) is involved
-  //  in setting up connection configuration information.
-  //
-  // The second group is listed here.  These methods are is involved in presenting and editing document specification
-  //  information for a job.
-  //
-  // The two kinds of methods are accordingly treated differently, in that the first group cannot assume that
-  // the current connector object is connected, while the second group can.  That is why the first group
-  // receives a thread context argument for all UI methods, while the second group does not need one
-  // (since it has already been applied via the connect() method).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber);
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber);
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException;
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException;
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException;
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException;
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectorManager.java
deleted file mode 100644
index dacbd1c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectorManager.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface describes a manager for the registry of notification connectors.
-* Use this to register or remove a connector from the list of available choices.
-*/
-public interface INotificationConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Install.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException;
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the connector class to unregister.
-  */
-  public void unregisterConnector(String className)
-    throws ManifoldCFException;
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  public void removeConnector(String className)
-    throws ManifoldCFException;
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  public IResultSet getConnectors()
-    throws ManifoldCFException;
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  public String getDescription(String className)
-    throws ManifoldCFException;
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  public boolean isInstalled(String className)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectorPool.java
deleted file mode 100644
index 4db9f91..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/INotificationConnectorPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An object implementing this interface functions as a pool of notification connectors.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public interface INotificationConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get multiple notification connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param notificationConnections are the connections to use the build the connector instances.
-  */
-  public INotificationConnector[] grabMultiple(String[] orderingKeys, INotificationConnection[] authorityConnections)
-    throws ManifoldCFException;
-
-  /** Get a notification connector.
-  * The connector is specified by a notification connection object.
-  *@param notificationConnection is the authority connection to base the connector instance on.
-  */
-  public INotificationConnector grab(INotificationConnection notificationConnection)
-    throws ManifoldCFException;
-
-  /** Release multiple notification connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  public void releaseMultiple(INotificationConnection[] connections, INotificationConnector[] connectors)
-    throws ManifoldCFException;
-
-  /** Release a notification connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  public void release(INotificationConnection connection, INotificationConnector connector)
-    throws ManifoldCFException;
-
-  /** Idle notification for inactive notification connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors()
-    throws ManifoldCFException;
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors()
-    throws ManifoldCFException;
-
-  /** Clean up all open notification connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  public void closeAllConnectors()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IPriorityCalculator.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IPriorityCalculator.java
deleted file mode 100644
index d483fe9..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IPriorityCalculator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface represents an object that calculates a document priority
-* value, for inclusion in the jobqueue table.  One of these objects is passed in
-* lieu of a document priority for every document being added to the table.
-*/
-public interface IPriorityCalculator
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Compute the document priority.  This MUST be called from within a
-  * a retry-able database transaction!!
-  *@return the document priority.
-  */
-  public double getDocumentPriority()
-    throws ManifoldCFException;
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IProcessActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IProcessActivity.java
deleted file mode 100644
index 2951ded..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IProcessActivity.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/* $Id: IProcessActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import java.io.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that a connector's processDocuments() method can do.
-* The processing flow for a document is expected to go something like this:
-* (1) The connector's processDocuments() method is called with a set of documents to be processed.
-* (2) The connector computes a version string for each document in the set as part of determining
-*    whether the document indeed needs to be refetched.
-* (3) For each document processed, there can be one of several dispositions:
-*   (a) There is no such document (anymore): deleteDocument() called for the document.
-*   (b) The document is (re)indexed: ingestDocumentWithException() is called for the document.
-*   (c) The document is determined to be unchanged and no updates are needed: nothing needs to be called
-*     for the document.
-*   (d) The document is determined to be unchanged BUT the version string needs to be updated: recordDocument()
-*     is called for the document.
-*   (e) The document is determined to be unindexable BUT it still exists in the repository: noDocument()
-*    is called for the document.
-*   (f) There was a service interruption: ServiceInterruption is thrown.
-* (4) In order to determine whether a document needs to be reindexed, the method checkDocumentNeedsReindexing()
-*    is available to return an opinion on that matter.
-*/
-public interface IProcessActivity extends IHistoryActivity, IEventActivity, IAbortActivity, IFingerprintActivity, ICarrydownActivity
-{
-  public static final String _rcsid = "@(#)$Id: IProcessActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Check if a document needs to be reindexed, based on a computed version string.
-  * Call this method to determine whether reindexing is necessary.  Pass in a newly-computed version
-  * string.  This method will return "true" if the document needs to be re-indexed.
-  *@param documentIdentifier is the document identifier.
-  *@param newVersionString is the newly-computed version string.
-  *@return true if the document needs to be reindexed.
-  */
-  public boolean checkDocumentNeedsReindexing(String documentIdentifier,
-    String newVersionString)
-    throws ManifoldCFException;
-
-  /** Check if a document needs to be reindexed, based on a computed version string.
-  * Call this method to determine whether reindexing is necessary.  Pass in a newly-computed version
-  * string.  This method will return "true" if the document needs to be re-indexed.
-  *@param documentIdentifier is the document identifier.
-  *@param componentIdentifier is the component document identifier, if any.
-  *@param newVersionString is the newly-computed version string.
-  *@return true if the document needs to be reindexed.
-  */
-  public boolean checkDocumentNeedsReindexing(String documentIdentifier,
-    String componentIdentifier,
-    String newVersionString)
-    throws ManifoldCFException;
-
-  /** Add a document description to the current job's queue.
-  *@param documentIdentifier is the local document identifier to add (for the connector that
-  * fetched the document).
-  *@param parentIdentifier is the document identifier that is considered to be the "parent"
-  * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-  * MUST be present in the case of carrydown information.
-  *@param relationshipType is the string describing the kind of relationship described by this
-  * reference.  This must be one of the strings returned by the IRepositoryConnector method
-  * "getRelationshipTypes()".  May be null.
-  *@param dataNames is the list of carry-down data from the parent to the child.  May be null.  Each name is limited to 255 characters!
-  *@param dataValues are the values that correspond to the data names in the dataNames parameter.  May be null only if dataNames is null.
-  *          The type of each object must either be a String, or a CharacterInput.
-  *@param originationTime is the time, in ms since epoch, that the document originated.  Pass null if none or unknown.
-  *@param prereqEventNames are the names of the prerequisite events which this document requires prior to processing.  Pass null if none.
-  */
-  public void addDocumentReference(String documentIdentifier, String parentIdentifier, String relationshipType,
-    String[] dataNames, Object[][] dataValues, Long originationTime, String[] prereqEventNames)
-    throws ManifoldCFException;
-
-  /** Add a document description to the current job's queue.
-  *@param documentIdentifier is the document identifier to add (for the connector that
-  * fetched the document).
-  *@param parentIdentifier is the document identifier that is considered to be the "parent"
-  * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-  * MUST be present in the case of carrydown information.
-  *@param relationshipType is the string describing the kind of relationship described by this
-  * reference.  This must be one of the strings returned by the IRepositoryConnector method
-  * "getRelationshipTypes()".  May be null.
-  *@param dataNames is the list of carry-down data from the parent to the child.  May be null.  Each name is limited to 255 characters!
-  *@param dataValues are the values that correspond to the data names in the dataNames parameter.  May be null only if dataNames is null.
-  *          The type of each object must either be a String, or a CharacterInput.
-  *@param originationTime is the time, in ms since epoch, that the document originated.  Pass null if none or unknown.
-  */
-  public void addDocumentReference(String documentIdentifier, String parentIdentifier, String relationshipType,
-    String[] dataNames, Object[][] dataValues, Long originationTime)
-    throws ManifoldCFException;
-
-  /** Add a document description to the current job's queue.
-  *@param documentIdentifier is the document identifier to add (for the connector that
-  * fetched the document).
-  *@param parentIdentifier is the document identifier that is considered to be the "parent"
-  * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-  * MUST be present in the case of carrydown information.
-  *@param relationshipType is the string describing the kind of relationship described by this
-  * reference.  This must be one of the strings returned by the IRepositoryConnector method
-  * "getRelationshipTypes()".  May be null.
-  *@param dataNames is the list of carry-down data from the parent to the child.  May be null.  Each name is limited to 255 characters!
-  *@param dataValues are the values that correspond to the data names in the dataNames parameter.  May be null only if dataNames is null.
-  *          The type of each object must either be a String, or a CharacterInput.
-  */
-  public void addDocumentReference(String documentIdentifier, String parentIdentifier, String relationshipType,
-    String[] dataNames, Object[][] dataValues)
-    throws ManifoldCFException;
-
-  /** Add a document description to the current job's queue.
-  *@param documentIdentifier is the document identifier to add (for the connector that
-  * fetched the document).
-  *@param parentIdentifier is the document identifier that is considered to be the "parent"
-  * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-  *@param relationshipType is the string describing the kind of relationship described by this
-  * reference.  This must be one of the strings returned by the IRepositoryConnector method
-  * "getRelationshipTypes()".  May be null.
-  */
-  public void addDocumentReference(String documentIdentifier, String parentIdentifier, String relationshipType)
-    throws ManifoldCFException;
-
-  /** Add a document description to the current job's queue.  This method is equivalent to
-  * addDocumentReference(localIdentifier,null,null).
-  *@param documentIdentifier is the document identifier to add (for the connector that
-  * fetched the document).
-  */
-  public void addDocumentReference(String documentIdentifier)
-    throws ManifoldCFException;
-
-  /** Ingest the current document.
-  *@param documentIdentifier is the document's identifier.
-  *@param version is the version of the document, as reported by the getDocumentVersions() method of the
-  *       corresponding repository connector.  An empty version string signals that there is no calculable
-  *       document version string, and that the document should always be indexed.
-  *@param documentURI is the URI to use to retrieve this document from the search interface (and is
-  *       also the unique key in the index).
-  *@param data is the document data.  The data is closed after ingestion is complete.
-  *@throws IOException only when data stream reading fails.
-  */
-  public void ingestDocumentWithException(String documentIdentifier,
-    String version, String documentURI, RepositoryDocument data)
-    throws ManifoldCFException, ServiceInterruption, IOException;
-
-  /** Ingest the current document.
-  *@param documentIdentifier is the document's identifier.
-  *@param componentIdentifier is the component document identifier, if any.
-  *@param version is the version of the document, as reported by the getDocumentVersions() method of the
-  *       corresponding repository connector.
-  *@param documentURI is the URI to use to retrieve this document from the search interface (and is
-  *       also the unique key in the index).
-  *@param data is the document data.  The data is closed after ingestion is complete.
-  *@throws IOException only when data stream reading fails.
-  */
-  public void ingestDocumentWithException(String documentIdentifier,
-    String componentIdentifier,
-    String version, String documentURI, RepositoryDocument data)
-    throws ManifoldCFException, ServiceInterruption, IOException;
-
-  /** Remove the specified document from the search engine index, and update the
-  * recorded version information for the document.
-  *@param documentIdentifier is the document's local identifier.
-  *@param version is the version string to be recorded for the document.
-  */
-  public void noDocument(String documentIdentifier,
-    String version)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Remove the specified document from the search engine index, and update the
-  * recorded version information for the document.
-  *@param documentIdentifier is the document's local identifier.
-  *@param componentIdentifier is the component document identifier, if any.
-  *@param version is the version string to be recorded for the document.
-  */
-  public void noDocument(String documentIdentifier,
-    String componentIdentifier,
-    String version)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Remove the specified document primary component permanently from the search engine index,
-  * and from the status table.  Use this method when your document has components and
-  * now also has a primary document, but will not have a primary document again for the foreseeable
-  * future.  This is a rare situation.
-  *@param documentIdentifier is the document's identifier.
-  */
-  public void removeDocument(String documentIdentifier)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Retain existing document component.  Use this method to signal that an already-existing
-  * document component does not need to be reindexed.  The default behavior is to remove
-  * components that are not mentioned during processing.
-  *@param documentIdentifier is the document's identifier.
-  *@param componentIdentifier is the component document identifier, which cannot be null.
-  */
-  public void retainDocument(String documentIdentifier,
-    String componentIdentifier)
-    throws ManifoldCFException;
-
-  /** Retain all existing document components of a primary document.  Use this method to signal that
-  * no document components need to be reindexed.  The default behavior is to remove
-  * components that are not mentioned during processing.
-  *@param documentIdentifier is the document's identifier.
-  */
-  public void retainAllComponentDocument(String documentIdentifier)
-    throws ManifoldCFException;
-
-  /** Record a document version, WITHOUT reindexing it, or removing it.  (Other
-  * documents with the same URL, however, will still be removed.)  This is
-  * useful if the version string changes but the document contents are known not
-  * to have changed.
-  *@param documentIdentifier is the document identifier.
-  *@param version is the document version.
-  */
-  public void recordDocument(String documentIdentifier,
-    String version)
-    throws ManifoldCFException;
-
-  /** Record a document version, WITHOUT reindexing it, or removing it.  (Other
-  * documents with the same URL, however, will still be removed.)  This is
-  * useful if the version string changes but the document contents are known not
-  * to have changed.
-  *@param documentIdentifier is the document identifier.
-  *@param componentIdentifier is the component document identifier, if any.
-  *@param version is the document version.
-  */
-  public void recordDocument(String documentIdentifier,
-    String componentIdentifier,
-    String version)
-    throws ManifoldCFException;
-
-  /** Delete the specified document permanently from the search engine index, and from the status table,
-  * along with all its components.
-  * This method does NOT keep track of any document version information for the document and thus can
-  * lead to "churn", whereby the same document is queued, processed,
-  * and removed on subsequent crawls.  It is therefore preferable to use noDocument() instead,
-  * in any case where the same decision will need to be made over and over.
-  *@param documentIdentifier is the document's identifier.
-  */
-  public void deleteDocument(String documentIdentifier)
-    throws ManifoldCFException;
-
-  /** Override the schedule for the next time a document is crawled.
-  * Calling this method allows you to set an upper recrawl bound, lower recrawl bound, upper expire bound, lower expire bound,
-  * or a combination of these, on a specific document.  This method is only effective if the job is a continuous one, and if the
-  * identifier you pass in is being processed.
-  *@param documentIdentifier is the document's identifier.
-  *@param lowerRecrawlBoundTime is the time in ms since epoch that the reschedule time should not fall BELOW, or null if none.
-  *@param upperRecrawlBoundTime is the time in ms since epoch that the reschedule time should not rise ABOVE, or null if none.
-  *@param lowerExpireBoundTime is the time in ms since epoch that the expire time should not fall BELOW, or null if none.
-  *@param upperExpireBoundTime is the time in ms since epoch that the expire time should not rise ABOVE, or null if none.
-  */
-  public void setDocumentScheduleBounds(String documentIdentifier,
-    Long lowerRecrawlBoundTime, Long upperRecrawlBoundTime,
-    Long lowerExpireBoundTime, Long upperExpireBoundTime)
-    throws ManifoldCFException;
-
-  /** Override a document's origination time.
-  * Use this method to signal the framework that a document's origination time is something other than the first time it was crawled.
-  *@param documentIdentifier is the document's identifier.
-  *@param originationTime is the document's origination time, or null if unknown.
-  */
-  public void setDocumentOriginationTime(String documentIdentifier,
-    Long originationTime)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnection.java
deleted file mode 100644
index c7f687b..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnection.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: IRepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** An instance of this interface represents a paper object that describes a repository connection.
-* This is the paper object meant for editing and manipulation.
-*/
-public interface IRepositoryConnection
-{
-  public static final String _rcsid = "@(#)$Id: IRepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew);
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew();
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name);
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName();
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description);
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription();
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className);
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName();
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams();
-
-  /** Set the ACL authority name.
-  *@param authorityName is the ACL authority name.
-  */
-  public void setACLAuthority(String authorityName);
-
-  /** Get the ACL authority name.
-  *@return the ACL authority name.
-  */
-  public String getACLAuthority();
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount);
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections();
-
-  // Connection throttle control
-
-  /** Clear all throttle values. */
-  public void clearThrottleValues();
-
-  /** Add a throttle value.
-  *@param description is the throttle description.
-  *@param match is the regexp to be applied to the bin names.
-  *@param throttle is the fetch rate to use, in fetches per millisecond.
-  */
-  public void addThrottleValue(String match, String description, float throttle);
-
-  /** Delete a throttle.
-  *@param match is the regexp describing the throttle to be removed.
-  */
-  public void deleteThrottleValue(String match);
-
-  /** Get throttles.  This will return a list of match strings, ordered by description and then
-  * match string.
-  *@return the ordered list of throttles.
-  */
-  public String[] getThrottles();
-
-  /** Get the description for a throttle.
-  *@param match describes the throttle.
-  *@return the description.
-  */
-  public String getThrottleDescription(String match);
-
-  /** Get the throttle value for a throttle.
-  *@param match describes the throttle.
-  *@return the throttle value, in fetches per millisecond.
-  */
-  public float getThrottleValue(String match);
-
-  /** Set the maximum number of document fetches per millisecond, for all bins (.*).
-  *@param rate is the rate, in fetches/millisecond.
-  */
-  public void setThrottle(Float rate);
-
-  /** Get the maximum number of document fetches per millisecond, for all bins (.*).
-  *@return fetches/ms, or null if there is no such throttle.
-  */
-  public Float getThrottle();
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnectionManager.java
deleted file mode 100644
index 3d1b156..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnectionManager.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/* $Id: IRepositoryConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Manager classes of this kind use the database to contain a human description of a repository connection.
-*/
-public interface IRepositoryConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id: IRepositoryConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException;
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException;
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException;
-
-  /** Obtain a list of the repository connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public IRepositoryConnection[] getAllConnections()
-    throws ManifoldCFException;
-
-  /** Load a repository connection by name.
-  *@param name is the name of the repository connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public IRepositoryConnection load(String name)
-    throws ManifoldCFException;
-
-  /** Load a set of repository connections.
-  *@param names are the names of the repository connections.
-  *@return the descriptors of the repository connections, with null
-  * values for those not found.
-  */
-  public IRepositoryConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException;
-
-  /** Create a new repository connection object.
-  *@return the new object.
-  */
-  public IRepositoryConnection create()
-    throws ManifoldCFException;
-
-  /** Save a repository connection object.
-  *@param object is the object to save.
-  *@return true if the object is created, false otherwise.
-  */
-  public boolean save(IRepositoryConnection object)
-    throws ManifoldCFException;
-
-  /** Delete a repository connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException;
-
-  /** Return true if the specified authority group name is referenced.
-  *@param authorityGroup is the authority group name.
-  *@return true if referenced, false otherwise.
-  */
-  public boolean isGroupReferenced(String authorityGroup)
-    throws ManifoldCFException;
-
-  /** Get a list of repository connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the repository connections that use that connector.
-  */
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException;
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException;
-
-  // Schema related
-
-  /** Return the primary table name.
-  *@return the table name.
-  */
-  public String getTableName();
-
-  /** Return the name column.
-  *@return the name column.
-  */
-  public String getConnectionNameColumn();
-
-
-  // Reporting and analysis related
-
-  /** Delete history rows related to a specific connection, upon user request.
-  *@param connectionName is the connection whose history records should be removed.
-  */
-  public void cleanUpHistoryData(String connectionName)
-    throws ManifoldCFException;
-  
-  /** Delete history rows older than a specified timestamp.
-  *@param timeCutoff is the timestamp to delete older rows before.
-  */
-  public void cleanUpHistoryData(long timeCutoff)
-    throws ManifoldCFException;
-
-  // Activities the Connector Framework records
-
-  /** Start a job */
-  public static final String ACTIVITY_JOBSTART = "job start";
-  /** Finish a job */
-  public static final String ACTIVITY_JOBEND = "job end";
-  /** Stop a job */
-  public static final String ACTIVITY_JOBSTOP = "job stop";
-  /** Continue a job */
-  public static final String ACTIVITY_JOBCONTINUE = "job continue";
-  /** Wait due to schedule */
-  public static final String ACTIVITY_JOBWAIT = "job wait";
-  /** Unwait due to schedule */
-  public static final String ACTIVITY_JOBUNWAIT = "job unwait";
-  
-  /** The set of activity records. */
-  public static final String[] activitySet = new String[]
-  {
-    ACTIVITY_JOBSTART,
-    ACTIVITY_JOBSTOP,
-    ACTIVITY_JOBCONTINUE,
-    ACTIVITY_JOBWAIT,
-    ACTIVITY_JOBUNWAIT,
-    ACTIVITY_JOBEND
-  };
-
-  /** Record time-stamped information about the activity of the connection.  This information can originate from
-  * either the connector or from the framework.  The reason it is here is that it is viewed as 'belonging' to an
-  * individual connection, and is segregated accordingly.
-  *@param connectionName is the connection to which the record belongs.  If the connection is deleted, the
-  * corresponding records will also be deleted.  Cannot be null.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       activity has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-  *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-  *       "fetch document" activity, while the framework might record "ingest document", "job start", "job finish",
-  *       "job abort", etc.  Cannot be null.
-  *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-  *@param entityIdentifier is a (possibly long) string which identifies the object involved in the history record.
-  *       The interpretation of this field will differ from connector to connector.  May be null.
-  *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-  *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  *@param childIdentifiers is a set of child entity identifiers associated with this activity.  May be null.
-  */
-  public void recordHistory(String connectionName, Long startTime, String activityType, Long dataSize,
-    String entityIdentifier, String resultCode, String resultDescription, String[] childIdentifiers)
-    throws ManifoldCFException;
-
-  /** Generate a report, listing the start time, elapsed time, result code and description, number of bytes, and entity identifier.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The resultset returned should have the following columns: "activity","starttime","elapsedtime","resultcode","resultdesc","bytes","identifier".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistorySimple(String connectionName, FilterCriteria criteria, SortOrder sort, int startRow, int maxRowCount)
-    throws ManifoldCFException;
-
-  /** Count the number of rows specified by a given set of criteria.  This can be used to make decisions
-  * as to whether a query based on those rows will complete in an acceptable amount of time.
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@return the number of rows included by the criteria.
-  */
-  public long countHistoryRows(String connectionName, FilterCriteria criteria)
-    throws ManifoldCFException;
-
-  /** Get the maximum number of rows a window-based report can work with.
-  *@return the maximum rows.
-  */
-  public long getMaxRows()
-    throws ManifoldCFException;
-    
-  /** Generate a report, listing the start time, activity count, and identifier bucket, given
-  * a time slice (interval) size.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The identifier bucket description is specified by the bucket description object.
-  * The resultset returned should have the following columns: "starttime","endtime","activitycount","idbucket".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param idBucket is the description of the bucket based on processed entity identifiers.
-  *@param interval is the time interval, in milliseconds, to locate.  There will be one row in the resultset
-  *       for each distinct idBucket value, and the returned activity count will the maximum found over the
-  *       specified interval size.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistoryActivityCount(String connectionName, FilterCriteria criteria, SortOrder sort, BucketDescription idBucket,
-    long interval, int startRow, int maxRowCount)
-    throws ManifoldCFException;
-
-  /** Generate a report, listing the start time, bytes processed, and identifier bucket, given
-  * a time slice (interval) size.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The identifier bucket description is specified by the bucket description object.
-  * The resultset returned should have the following columns: "starttime","endtime","bytecount","idbucket".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param idBucket is the description of the bucket based on processed entity identifiers.
-  *@param interval is the time interval, in milliseconds, to locate.  There will be one row in the resultset
-  *       for each distinct idBucket value, and the returned activity count will the maximum found over the
-  *       specified interval size.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistoryByteCount(String connectionName, FilterCriteria criteria, SortOrder sort, BucketDescription idBucket,
-    long interval, int startRow, int maxRowCount)
-    throws ManifoldCFException;
-
-
-  /** Generate a report, listing the result bucket and identifier bucket.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The result code bucket description is specified by a bucket description object.
-  * The identifier bucket description is specified by a bucket description object.
-  * The resultset returned should have the following columns: "eventcount","resultcodebucket","idbucket".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param resultCodeBucket is the description of the bucket based on processed result codes.
-  *@param idBucket is the description of the bucket based on processed entity identifiers.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistoryResultCodes(String connectionName, FilterCriteria criteria, SortOrder sort,
-    BucketDescription resultCodeBucket, BucketDescription idBucket, int startRow, int maxRowCount)
-    throws ManifoldCFException;
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnector.java
deleted file mode 100644
index ee31ee6..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnector.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/* $Id: IRepositoryConnector.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This interface describes an instance of a connection between a repository and ManifoldCF's
-* standard "pull" ingestion agent.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connectors are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.  The complete list is:
-*
-*
-* The purpose of the repository connector is to allow documents to be fetched from the repository.
-*
-* Each repository connector describes a set of documents that are known only to that connector.
-* It therefore establishes a space of document identifiers.  Each connector will only ever be
-* asked to deal with identifiers that have in some way originated from the connector.
-*
-* Documents are fetched by ManifoldCF in two stages.  First, the addSeedDocuments() method is called in the connector
-* implementation.  This method is meant to add a set of document identifiers to the queue.  When ManifoldCF is ready
-* to process a document, the document identifier is used to build a version string for the document and check whether
-* the document needs to be indexed, and index it if needed (the second stage).  The second stage
-* consists of the processDocuments() method.
-*
-* All of these methods interact with ManifoldCF by means of an "activity" interface.
-*
-* A note on connector models:
-*
-* These values describe what the connector returns for the addSeedDocuments() method.  The framework
-* uses these to figure out how to most efficiently use the connector.  It is desirable to pick a model that
-* is the most restrictive that is still accurate.  For example, if MODEL_ADD_CHANGE_DELETE applies, you would
-* return that value rather than MODEL_ADD.
-*
-* For the CHAINED models, what the connector is describing are the documents that will be processed IF the seeded
-* documents are followed to their leaves.  For instance, imagine a hierarchy where the root document is the only one ever
-* seeded, but if that document is processed, and its discovered changed children are processed as well, then all documents
-* that have been added, changed, or deleted will eventually be discovered.  In that case, model
-* MODEL_CHAINED_ADD_CHANGE_DELETE would be appropriate.  But, if a changed node can only discover child
-* additions and changes, then MODEL_CHAINED_ADD_CHANGE would be the right choice.
-*	
-* A CHAINED model also requires cooperation on the part of the connector for processing.  Specifically,
-* a document may be unchanged but its references are expected to still be extracted in order for a CHAINED
-* model to do the right thing.  For non-CHAINED models, re-extraction of references if there are no reference changes
-* for a document is NOT required.
-*/
-public interface IRepositoryConnector extends IConnector
-{
-  public static final String _rcsid = "@(#)$Id: IRepositoryConnector.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  /** This is the legacy ManifoldCF catch-all crawling model.  All existing documents will be rechecked when a crawl
-  * is done, every time.  This model was typically used for models where seeds were essentially fixed and all
-  * real documents were discovered during crawling. */
-  public static final int MODEL_ALL = 0;
-  /** This indicates that the seeds are never complete; the previous seeds are lost and cannot be retrieved. */
-  public static final int MODEL_PARTIAL = 4;
-
-  /** Supply at least the documents that have been added since the specified start time.  Connector is
-  * aware of the start time and end time of the request, and supplies at least the documents that have been
-  * added within the specified time range. */
-  public static final int MODEL_ADD = 1;
-  /** Supply at least the documents that have been added or changed within the specified time range. */
-  public static final int MODEL_ADD_CHANGE = 2;
-  /** Supply at least the documents that have been added, changed, or deleted within the specified time range. */
-  public static final int MODEL_ADD_CHANGE_DELETE = 3;
-
-  /** Like MODEL_ADD, except considering document discovery */
-  public static final int MODEL_CHAINED_ADD = 9;
-  /** Like MODEL_ADD_CHANGE, except considering document discovery */
-  public static final int MODEL_CHAINED_ADD_CHANGE = 10;
-  /** Like MODEL_ADD_CHANGE_DELETE, except considering document discovery */
-  public static final int MODEL_CHAINED_ADD_CHANGE_DELETE = 11;
-  
-  // These are the job modes the connector may want to know about.
-  // For a once-only job, it is essential that documents that are processed by processDocuments() always queue up their child links,
-  // This is not true for continuous jobs, which never delete unreachable links because they never terminate.
-  public static final int JOBMODE_ONCEONLY = IJobDescription.TYPE_SPECIFIED;
-  public static final int JOBMODE_CONTINUOUS = IJobDescription.TYPE_CONTINUOUS;
-
-  /** This is the global deny token.  This should be ingested with all documents. */
-  public static final String GLOBAL_DENY_TOKEN = "DEAD_AUTHORITY";
-
-  /** Tell the world what model this connector uses for addSeedDocuments().
-  * This must return a model value as specified above.  The connector does not have to be connected
-  * for this method to be called.
-  *@return the model type value.
-  */
-  public int getConnectorModel();
-
-  /** Return the list of activities that this connector supports (i.e. writes into the log).
-  * The connector does not have to be connected for this method to be called.
-  *@return the list.
-  */
-  public String[] getActivitiesList();
-
-  /** Return the list of relationship types that this connector recognizes.
-  * The connector does not need to be connected for this method to be called.
-  *@return the list.
-  */
-  public String[] getRelationshipTypes();
-
-  /** Get the bin name strings for a document identifier.  The bin name describes the queue to which the
-  * document will be assigned for throttling purposes.  Throttling controls the rate at which items in a
-  * given queue are fetched; it does not say anything about the overall fetch rate, which may operate on
-  * multiple queues or bins.
-  * For example, if you implement a web crawler, a good choice of bin name would be the server name, since
-  * that is likely to correspond to a real resource that will need real throttle protection.
-  * The connector must be connected for this method to be called.
-  *@param documentIdentifier is the document identifier.
-  *@return the set of bin names.  If an empty array is returned, it is equivalent to there being no request
-  * rate throttling available for this identifier.
-  */
-  public String[] getBinNames(String documentIdentifier);
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several
-  * connector-specific queries.  These are usually used to create external UI's.  The connector will be
-  * connected before this method is called.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException;
-
-  /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
-  * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
-  *
-  * This method can choose to find repository changes that happen only during the specified time interval.
-  * The seeds recorded by this method will be viewed by the framework based on what the
-  * getConnectorModel() method returns.
-  *
-  * It is not a big problem if the connector chooses to create more seeds than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * The end time and seeding version string passed to this method may be interpreted for greatest efficiency.
-  * For continuous crawling jobs, this method will
-  * be called once, when the job starts, and at various periodic intervals as the job executes.
-  *
-  * When a job's specification is changed, the framework automatically resets the seeding version string to null.  The
-  * seeding version string may also be set to null on each job run, depending on the connector model returned by
-  * getConnectorModel().
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  * The connector will be connected before this method can be called.
-  *@param activities is the interface this method should use to perform whatever framework actions are desired.
-  *@param spec is a document specification (that comes from the job).
-  *@param seedTime is the end of the time range of documents to consider, exclusive.
-  *@param lastSeedVersionString is the last seeding version string for this job, or null if the job has no previous seeding version string.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@return an updated seeding version string, to be stored with the job.
-  */
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Get the maximum number of documents to amalgamate together into one batch, for this connector.
-  * The connector does not need to be connected for this method to be called.
-  *@return the maximum number. 0 indicates "unlimited".
-  */
-  public int getMaxDocumentRequest();
-
-  // UI support methods.
-  //
-  // The UI support methods come in two varieties.  The first group (inherited from IConnector) is involved
-  //  in setting up connection configuration information.
-  //
-  // The second group is listed here.  These methods are is involved in presenting and editing document specification
-  //  information for a job.
-  //
-  // The two kinds of methods are accordingly treated differently, in that the first group cannot assume that
-  // the current connector object is connected, while the second group can.  That is why the first group
-  // receives a thread context argument for all UI methods, while the second group does not need one
-  // (since it has already been applied via the connect() method).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber);
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber);
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException;
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException;
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException;
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException;
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnectorPool.java
deleted file mode 100644
index e2d361f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IRepositoryConnectorPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An object implementing this interface functions as a pool of repository connectors.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public interface IRepositoryConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Get multiple repository connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param repositoryConnections are the connections to use the build the connector instances.
-  */
-  public IRepositoryConnector[] grabMultiple(String[] orderingKeys, IRepositoryConnection[] authorityConnections)
-    throws ManifoldCFException;
-
-  /** Get a repository connector.
-  * The connector is specified by a repository connection object.
-  *@param repositoryConnection is the authority connection to base the connector instance on.
-  */
-  public IRepositoryConnector grab(IRepositoryConnection repositoryConnection)
-    throws ManifoldCFException;
-
-  /** Release multiple repository connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  public void releaseMultiple(IRepositoryConnection[] connections, IRepositoryConnector[] connectors)
-    throws ManifoldCFException;
-
-  /** Release a repository connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  public void release(IRepositoryConnection connection, IRepositoryConnector connector)
-    throws ManifoldCFException;
-
-  /** Idle notification for inactive repository connector handles.
-  * This method polls all inactive handles.
-  */
-  public void pollAllConnectors()
-    throws ManifoldCFException;
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  public void flushUnusedConnectors()
-    throws ManifoldCFException;
-
-  /** Clean up all open repository connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  public void closeAllConnectors()
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IReprioritizationTracker.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IReprioritizationTracker.java
deleted file mode 100644
index 4436936..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/IReprioritizationTracker.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface represents functionality that tracks cluster-wide
-* reprioritization operations.
-* These operations are driven forward by whatever thread needs them,
-* and are completed if those processes die by the threads that clean up
-* after the original process.
-*/
-public interface IReprioritizationTracker
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Start a reprioritization activity.
-  *@param processID is the process ID of the process performing/waiting for the prioritization
-  * to complete.
-  *@param reproID is the reprocessing thread ID
-  */
-  public void startReprioritization(String processID, String reproID)
-    throws ManifoldCFException;
-  
-  /** Complete a reprioritization activity.  Prioritization will be marked as complete
-  * only if the processID matches the one that started the current reprioritization.
-  *@param processID is the process ID of the process completing the prioritization.
-  */
-  public void doneReprioritization(String reproID)
-    throws ManifoldCFException;
-  
-  /** Check if the specified processID is the one performing reprioritization.
-  *@param processID is the process ID to check.
-  *@return the repro ID if the processID is confirmed to be the one.
-  */
-  public String isSpecifiedProcessReprioritizing(String processID)
-    throws ManifoldCFException;
-  
-  /** Assess the current minimum depth.
-  * This method is called to provide information about the priorities of the documents being currently
-  * queued.  It is the case that it is unoptimal to assign document priorities that are fundamentally higher than this value,
-  * because then the new documents will be preferentially queued, and the goal of distributing documents across bins will not be
-  * adequately met.
-  *@param binNamesSet is the current set of priorities we see on the queuing operation.
-  */
-  public void assessMinimumDepth(Double[] binNamesSet)
-    throws ManifoldCFException;
-
-  /** Retrieve current minimum depth.
-  *@return the current minimum depth to use.
-  */
-  public double getMinimumDepth()
-    throws ManifoldCFException;
-  
-  /** Note preload amounts.
-  */
-  public void addPreloadRequest(String connectorClass, String binName, double weightedMinimumDepth);
-  
-  /** Preload bin values.  Call this OUTSIDE of a transaction.
-  */
-  public void preloadBinValues()
-    throws ManifoldCFException;
-  
-  /** Clear any preload requests.
-  */
-  public void clearPreloadRequests();
-  
-  /** Clear remaining preloaded values.
-  */
-  public void clearPreloadedValues();
-
-  /** Get a bin value.  Must be called INSIDE a transaction.
-  *@param connectorClass is the connector class name.
-  *@param binName is the bin name.
-  *@param weightedMinimumDepth is the minimum depth to use.
-  *@return the bin value.
-  */
-  public double getIncrementBinValue(String connectorClass, String binName, double weightedMinimumDepth)
-    throws ManifoldCFException;
-  
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ISeedingActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ISeedingActivity.java
deleted file mode 100644
index 38014f1..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ISeedingActivity.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/* $Id: ISeedingActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-/** This interface abstracts from the activities that a seeding operation can do.
-*
-* See IProcessActivity for a description of the framework's prerequisite event model.  This interface too has support for that model.
-*
-*/
-public interface ISeedingActivity extends IHistoryActivity, INamingActivity, IAbortActivity
-{
-  public static final String _rcsid = "@(#)$Id: ISeedingActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Record a "seed" document identifier.
-  * Seeds passed to this method will be loaded into the job's queue at the beginning of the
-  * job's execution, and for continuous crawling jobs, periodically throughout the crawl.
-  *
-  * All documents passed to this method are placed on the "pending documents" list, and are marked as being seed
-  * documents.  All pending documents will be processed to determine if they have changed or have been deleted.
-  * It is not a big problem if the connector chooses to put more documents onto the pending list than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  *
-  *@param documentIdentifier is the identifier of the document to add to the "pending" queue.
-  *@param prereqEventNames is the list of prerequisite events required for this document, or null if none.
-  */
-  public void addSeedDocument(String documentIdentifier, String[] prereqEventNames)
-    throws ManifoldCFException;
-
-  /** Record a "seed" document identifier.
-  * Seeds passed to this method will be loaded into the job's queue at the beginning of the
-  * job's execution, and for continuous crawling jobs, periodically throughout the crawl.
-  *
-  * All documents passed to this method are placed on the "pending documents" list, and are marked as being seed
-  * documents.  All pending documents will be processed to determine if they have changed or have been deleted.
-  * It is not a big problem if the connector chooses to put more documents onto the pending list than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  *
-  *@param documentIdentifier is the identifier of the document to add to the "pending" queue.
-  */
-  public void addSeedDocument(String documentIdentifier)
-    throws ManifoldCFException;
-
-  /** This method receives document identifiers that should be considered part of the seeds, but do not need to be
-  * queued for processing at this time.  (This method is used to keep the hopcount tables up to date.)  It is
-  * allowed to receive more identifiers than it strictly needs to, specifically identifiers that may have also been
-  * sent to the getDocumentIdentifiers() method above.  However, the connector must constrain the identifiers
-  * it sends by the document specification.
-  * This method is only required to be called at all if the connector supports hopcount determination (which it
-  * should signal by having more than zero legal relationship types returned by the getRelationshipTypes() method).
-  *
-  *@param documentIdentifier is the identifier of the document to consider as a seed, but not to put in the
-  * "pending" queue.
-  */
-  public void addUnqueuedSeedDocument(String documentIdentifier)
-    throws ManifoldCFException;
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobDeleteRecord.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobDeleteRecord.java
deleted file mode 100644
index 0a8278a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobDeleteRecord.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-
-/** This class is a paper object which contains a job ID.
-*/
-public class JobDeleteRecord extends JobRecord
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Constructor.
-  */
-  public JobDeleteRecord(Long jobID)
-  {
-    super(jobID);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobManagerFactory.java
deleted file mode 100644
index a696d23..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id: JobManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/** Factory class for IJobManager.
-*/
-public class JobManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: JobManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Name
-  protected final static String jobManagerName = "_JobManager_";
-
-  private JobManagerFactory()
-  {
-  }
-
-  /** Create a job manager handle.
-  *@param threadContext is the thread context.
-  *@return the handle.
-  */
-  public static IJobManager make(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Object o = threadContext.get(jobManagerName);
-    if (o == null || !(o instanceof IJobManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.crawler.jobs.JobManager(threadContext,database);
-      threadContext.save(jobManagerName,o);
-    }
-    return (IJobManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobNotifyRecord.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobNotifyRecord.java
deleted file mode 100644
index 8e9befa..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobNotifyRecord.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-
-/** This class is a paper object which contains a job ID.
-*/
-public class JobNotifyRecord extends JobRecord
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Fail time; -1L if none currently set */
-  protected final long failTime;
-  /** Fail retry count; -1 if none currently set */
-  protected final int failRetryCount;
-  
-  /** Constructor.
-  */
-  public JobNotifyRecord(Long jobID, long failTime, int failRetryCount)
-  {
-    super(jobID);
-    this.failTime = failTime;
-    this.failRetryCount = failRetryCount;
-  }
-
-  /** Get the hard fail time.
-  *@return the fail time in ms since epoch, or -1L if none.
-  */
-  public long getFailTime()
-  {
-    return failTime;
-  }
-
-  /** Get the hard fail retry count.
-  *@return the fail retry count, or -1 if none.
-  */
-  public int getFailRetryCount()
-  {
-    return failRetryCount;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobRecord.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobRecord.java
deleted file mode 100644
index 28fdf36..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobRecord.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-
-/** This class is a paper object which contains a job ID.
-*/
-public class JobRecord
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** The job id. */
-  protected final Long jobID;
-  /** Whether this job was started or not */
-  protected boolean wasStarted = false;
-
-  /** Constructor.
-  */
-  public JobRecord(Long jobID)
-  {
-    this.jobID = jobID;
-  }
-
-  /** Get the job ID.
-  *@return the id.
-  */
-  public Long getJobID()
-  {
-    return jobID;
-  }
-
-  /** Note that the job was started.
-  */
-  public void noteStarted()
-  {
-    wasStarted = true;
-  }
-
-  /** Check whether job was started.
-  *@return true if started.
-  */
-  public boolean wasStarted()
-  {
-    return wasStarted;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobSeedingRecord.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobSeedingRecord.java
deleted file mode 100644
index 248f287..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobSeedingRecord.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-
-/** This class is a paper object which contains a job ID and a last job start time (0 if none).
-*/
-public class JobSeedingRecord extends JobRecord
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** The last seeding version */
-  protected final String seedingVersionString;
-  /** The fail time, or -1L if none */
-  protected final long failTime;
-  /** The fail count, or -1 if none */
-  protected final int failRetryCount;
-
-  /** Constructor.
-  */
-  public JobSeedingRecord(Long jobID, String seedingVersionString, long failTime, int failRetryCount)
-  {
-    super(jobID);
-    this.seedingVersionString = seedingVersionString;
-    this.failTime = failTime;
-    this.failRetryCount = failRetryCount;
-  }
-
-  /** Get the seeding version string.
-  *@return the string.
-  */
-  public String getSeedingVersionString()
-  {
-    return seedingVersionString;
-  }
-
-  /** Get the hard fail time.
-  *@return the fail time in ms since epoch, or -1L if none.
-  */
-  public long getFailTime()
-  {
-    return failTime;
-  }
-
-  /** Get the hard fail retry count.
-  *@return the fail retry count, or -1 if none.
-  */
-  public int getFailRetryCount()
-  {
-    return failRetryCount;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobStartRecord.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobStartRecord.java
deleted file mode 100644
index eec5e26..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobStartRecord.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/* $Id: JobStartRecord.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-
-/** This class is a paper object which contains a job ID and a last job start time.
-*/
-public class JobStartRecord extends JobRecord
-{
-  public static final String _rcsid = "@(#)$Id: JobStartRecord.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The last seeding version */
-  protected final String seedingVersionString;
-  /** The requestMinimum flag */
-  protected final boolean requestMinimum;
-  /** The fail time, or -1L if none */
-  protected final long failTime;
-  /** The fail count, or -1 if none */
-  protected final int failRetryCount;
-
-  /** Constructor.
-  */
-  public JobStartRecord(Long jobID, String seedingVersionString, boolean requestMinimum, long failTime, int failRetryCount)
-  {
-    super(jobID);
-    this.seedingVersionString = seedingVersionString;
-    this.requestMinimum = requestMinimum;
-    this.failTime = failTime;
-    this.failRetryCount = failRetryCount;
-  }
-
-  /** Get the seeding version string.
-  *@return the string.
-  */
-  public String getSeedingVersionString()
-  {
-    return seedingVersionString;
-  }
-
-  /** Get the requestMinimum flag.
-  *@return the flag.
-  */
-  public boolean getRequestMinimum()
-  {
-    return requestMinimum;
-  }
-  
-  /** Get the hard fail time.
-  *@return the fail time in ms since epoch, or -1L if none.
-  */
-  public long getFailTime()
-  {
-    return failTime;
-  }
-
-  /** Get the hard fail retry count.
-  *@return the fail retry count, or -1 if none.
-  */
-  public int getFailRetryCount()
-  {
-    return failRetryCount;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobStatus.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobStatus.java
deleted file mode 100644
index 3a70c21..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/JobStatus.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/* $Id: JobStatus.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-/** This class describes the complete status of a job.
-* It is immutable.
-*/
-public class JobStatus
-{
-  public static final String _rcsid = "@(#)$Id: JobStatus.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  // Job status values
-  public final static int JOBSTATUS_NOTYETRUN = 0;
-  public final static int JOBSTATUS_RUNNING = 1;
-  public final static int JOBSTATUS_STOPPING = 2;
-  public final static int JOBSTATUS_PAUSED = 3;
-  public final static int JOBSTATUS_RESUMING = 4;
-  public final static int JOBSTATUS_COMPLETED = 5;
-  public final static int JOBSTATUS_WINDOWWAIT = 6;
-  public final static int JOBSTATUS_STARTING = 7;
-  public final static int JOBSTATUS_DESTRUCTING = 8;
-  public final static int JOBSTATUS_ERROR = 9;
-  public final static int JOBSTATUS_ABORTING = 10;
-  public final static int JOBSTATUS_RESTARTING = 11;
-  public final static int JOBSTATUS_RUNNING_UNINSTALLED = 12;
-  public final static int JOBSTATUS_JOBENDCLEANUP = 13;
-  public final static int JOBSTATUS_JOBENDNOTIFICATION = 14;
-
-
-  // Member variables.
-  protected final String jobID;
-  protected final String description;
-  protected final int status;
-  protected final long documentsInQueue;
-  protected final long documentsOutstanding;
-  protected final long documentsProcessed;
-  protected final boolean queueCountExact;
-  protected final boolean outstandingCountExact;
-  protected final boolean processedCountExact;
-  protected final long startTime;       // -1 if job never started
-  protected final long endTime;         // -1 if job has not ended yet
-  protected final String errorText;     // null if no error on previous action
-
-  /** Constructor.
-  *@param jobID is the job identifier.
-  *@param description is the job description.
-  *@param status is the job status.
-  *@param documentsInQueue is the total number of documents currently in the document queue for the job.
-  *@param documentsOutstanding is the total number of documents currently marked for processing.
-  *@param documentsProcessed is the total number of documents that have been processed at least once.
-  *@param startTime is time the job started (use -1 for never)
-  *@param endTime is the time the job ended (use -1 for not yet)
-  */
-  public JobStatus(String jobID,
-    String description,
-    int status,
-    long documentsInQueue,
-    long documentsOutstanding,
-    long documentsProcessed,
-    boolean queueCountExact,
-    boolean outstandingCountExact,
-    boolean processedCountExact,
-    long startTime,
-    long endTime,
-    String errorText)
-  {
-    this.jobID = jobID;
-    this.description = description;
-    this.status = status;
-    this.documentsInQueue = documentsInQueue;
-    this.documentsOutstanding = documentsOutstanding;
-    this.documentsProcessed = documentsProcessed;
-    this.queueCountExact = queueCountExact;
-    this.outstandingCountExact = outstandingCountExact;
-    this.processedCountExact = processedCountExact;
-    this.startTime = startTime;
-    this.endTime = endTime;
-    this.errorText = errorText;
-  }
-
-  /** Get the job id.
-  *@return the id.
-  */
-  public String getJobID()
-  {
-    return jobID;
-  }
-
-  /** Get the job description.
-  *@return the description.
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Get the job status.
-  *@return the status.
-  */
-  public int getStatus()
-  {
-    return status;
-  }
-
-  /** Get the number of documents in the queue.
-  *@return the number of documents in the queue.
-  */
-  public long getDocumentsInQueue()
-  {
-    return documentsInQueue;
-  }
-
-  /** Get whether the queue count is accurate, or an estimate.
-  *@return true if accurate.
-  */
-  public boolean getQueueCountExact()
-  {
-    return queueCountExact;
-  }
-  
-  /** Get the number of documents outstanding.
-  *@return the documents that are waiting for processing.
-  */
-  public long getDocumentsOutstanding()
-  {
-    return documentsOutstanding;
-  }
-
-  /** Get whether the outstanding count is accurate, or an estimate.
-  *@return true if accurate.
-  */
-  public boolean getOutstandingCountExact()
-  {
-    return outstandingCountExact;
-  }
-
-  /** Get the number of documents that have been processed at least once.
-  *@return the document count.
-  */
-  public long getDocumentsProcessed()
-  {
-    return documentsProcessed;
-  }
-
-  /** Get whether the processed count is accurate, or an estimate.
-  *@return true if accurate.
-  */
-  public boolean getProcessedCountExact()
-  {
-    return processedCountExact;
-  }
-
-  /** Get the start time.
-  *@return the start time, or -1
-  */
-  public long getStartTime()
-  {
-    return startTime;
-  }
-
-  /** Get the end time.
-  *@return the end time, or -1
-  */
-  public long getEndTime()
-  {
-    return endTime;
-  }
-
-  /** Get the error text.
-  *@return the text, or null.
-  */
-  public String getErrorText()
-  {
-    return errorText;
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectionManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectionManagerFactory.java
deleted file mode 100644
index 09008cb..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectionManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/** Notification connection manager factory.
-*/
-public class NotificationConnectionManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_NotificationConnectionMgr_";
-
-  private NotificationConnectionManagerFactory()
-  {
-  }
-
-  /** Make a notification connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static INotificationConnectionManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof INotificationConnectionManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.crawler.notification.NotificationConnectionManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (INotificationConnectionManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorFactory.java
deleted file mode 100644
index 5cf3202..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorFactory.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This is the factory class for INotificationConnector objects.
-*/
-public class NotificationConnectorFactory extends ConnectorFactory<INotificationConnector>
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Static factory
-  protected final static NotificationConnectorFactory thisFactory = new NotificationConnectorFactory();
-
-  private NotificationConnectorFactory()
-  {
-  }
-
-  @Override
-  protected boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException
-  {
-    INotificationConnectorManager connMgr = NotificationConnectorManagerFactory.make(tc);
-    return connMgr.isInstalled(className);
-  }
-
-  /** Install connector.
-  *@param className is the class name.
-  */
-  public static void install(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.installThis(threadContext,className);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  public static void deinstall(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.deinstallThis(threadContext,className);
-  }
-
-  /** Output the configuration header section.
-  */
-  public static void outputConfigurationHeader(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationHeader(threadContext,className,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  public static void outputConfigurationBody(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationBody(threadContext,className,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  public static String processConfigurationPost(IThreadContext threadContext, String className, IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    return thisFactory.processThisConfigurationPost(threadContext,className,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  public static void viewConfiguration(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.viewThisConfiguration(threadContext,className,out,locale,configParams);
-  }
-
-  /** Get a notification connector instance, without checking for installed connector.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  public static INotificationConnector getConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorNoCheck(className);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorManagerFactory.java
deleted file mode 100644
index 689e7a1..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/** Factory for notification connector manager.
-*/
-public class NotificationConnectorManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected static final String connMgr = "_NotificationConnectorManager_";
-
-  private NotificationConnectorManagerFactory()
-  {
-  }
-
-  /** Construct a connector manager.
-  *@param tc is the thread context.
-  *@return the connector manager handle.
-  */
-  public static INotificationConnectorManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(connMgr);
-    if (o == null || !(o instanceof INotificationConnectorManager))
-    {
-
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.crawler.notificationconnmgr.NotificationConnectorManager(tc,database);
-      tc.save(connMgr,o);
-    }
-    return (INotificationConnectorManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorPoolFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorPoolFactory.java
deleted file mode 100644
index 643a06f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/NotificationConnectorPoolFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-
-/** Repository connector pool manager factory.
-*/
-public class NotificationConnectorPoolFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_NotificationConnectorPoolMgr_";
-
-  private NotificationConnectorPoolFactory()
-  {
-  }
-
-  /** Make a notification connector pool handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static INotificationConnectorPool make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof INotificationConnectorPool))
-    {
-      o = new org.apache.manifoldcf.crawler.notificationconnectorpool.NotificationConnectorPool(tc);
-      tc.save(objectName,o);
-    }
-    return (INotificationConnectorPool)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/PerformanceStatistics.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/PerformanceStatistics.java
deleted file mode 100644
index 8b48a23..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/PerformanceStatistics.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: PerformanceStatistics.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-
-/** An instance of this class keeps a running average of how long it takes for every connection to process a document.
-* This information is used to limit queuing per connection to something reasonable given the characteristics of the connection.
-*/
-public class PerformanceStatistics
-{
-  public static final String _rcsid = "@(#)$Id: PerformanceStatistics.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the fetch rate that will be returned in the complete absence of any other information.  This represents a 'wild guess' of a sort,
-  * used only at the very start of a job, and designed to not hopelessly overload the queue with stuff from one connection only. */
-  protected static double DEFAULT_FETCH_RATE = 900.0;
-  protected static long DEFAULT_FETCH_TIME = (long)(((double)60000.0)/DEFAULT_FETCH_RATE);
-
-  /** These are the weighting coefficients for the average.  They should all add up to 1.0 */
-  protected static double[] weights = new double[]{0.5,0.25,0.125,0.0625,0.0625};
-
-  /** This hash is keyed by the connection name, and has elements of type AveragingQueue */
-  protected HashMap connectionHash = new HashMap();
-
-  /** Constructor */
-  public PerformanceStatistics()
-  {
-  }
-
-  /** Note the successful completion of a set of documents using a single connection, and record the statistics for them. **/
-  public synchronized void noteDocumentsCompleted(String connectionName, int documentSetSize, long elapsedTime)
-  {
-    AveragingQueue q = (AveragingQueue)connectionHash.get(connectionName);
-    if (q == null)
-    {
-      q = new AveragingQueue();
-      connectionHash.put(connectionName,q);
-    }
-    q.addRecord(documentSetSize,elapsedTime);
-  }
-
-  /** Obtain current average document fetch rate (in documents per minute per connection) */
-  public synchronized double calculateConnectionFetchRate(String connectionName)
-  {
-    AveragingQueue q = (AveragingQueue)connectionHash.get(connectionName);
-    if (q == null)
-      // If there's no averaging queue, return a value that is consistent with wide-open performance
-      return DEFAULT_FETCH_RATE;
-    return q.calculateFetchRate();
-  }
-
-  /** This class keeps track of some depth of fetch history for an individual connection, and is used to calculate a
-  * weighted average fetches-per-minute rate. */
-  protected static class AveragingQueue
-  {
-    /** The internal structure of the averaging queue is a circular buffer, which gets initialized to the default value */
-    protected AveragingRecord[] records;
-
-    /** This is the current start pointer */
-    protected int startIndex;
-
-    /** Constructor */
-    public AveragingQueue()
-    {
-      records = new AveragingRecord[weights.length];
-      int i = 0;
-      while (i < weights.length)
-      {
-        records[i++] = new AveragingRecord(1,DEFAULT_FETCH_TIME);
-      }
-      startIndex = 0;
-    }
-
-    /** Add a record */
-    public void addRecord(int setSize, long elapsedTime)
-    {
-      records[startIndex] = new AveragingRecord(setSize,elapsedTime);
-      startIndex++;
-      if (startIndex == records.length)
-        startIndex -= records.length;
-    }
-
-    /** Calculate running-average fetch rate */
-    public double calculateFetchRate()
-    {
-      // The calculation involves calculating the fetch rate for each point in the history we keep, and then multiplying it times the appropriate weight,
-      // and summing the whole thing.
-      double rval = 0.0;
-      int currentIndex = startIndex;
-      int i = 0;
-      while (i < weights.length)
-      {
-        double currentWeight = weights[i++];
-        if (currentIndex == 0)
-          currentIndex = records.length;
-        currentIndex--;
-        AveragingRecord ar = records[currentIndex];
-        rval += currentWeight * ar.calculateRate();
-      }
-      return rval;
-    }
-  }
-
-  /** This class contains the data for a single document set against the given connection */
-  protected static class AveragingRecord
-  {
-    protected int documentCount;
-    protected long elapsedTime;
-
-    public AveragingRecord(int documentCount, long elapsedTime)
-    {
-      this.documentCount = documentCount;
-      this.elapsedTime = elapsedTime;
-    }
-
-    public double calculateRate()
-    {
-      return 60000.0 * ((double)documentCount)/((double)elapsedTime);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/QueueTracker.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/QueueTracker.java
deleted file mode 100644
index fb5659c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/QueueTracker.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/* $Id: QueueTracker.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** This class attempts to provide document priorities in order to acheive as much balance as possible between documents having different bins.
-* A document's priority assignment takes place at the time the document is added to the queue, and will be recalculated when a job is aborted, or
-* when the crawler daemon is started.  The document priorities are strictly obeyed when documents are chosen from the queue and handed to
-* worker threads; higher-priority documents always have precedence, except due to deliberate priority adjustment specified by the job priority.
-*
-* The priority values themselves are logarithmic: 0.0 is the highest, and the larger the number, the lower the priority.
-*
-* The basis for the calculation for each document priority handed out by this module are:
-*
-* - number of documents having a given bin (tracked)
-* - performance of a connection (gathered through statistics)
-* - throttling that applies to the each document bin
-*
-*
-* The queuing prioritization model hooks into the document lifecycle in the following places:
-* (1) When a document is added to the queue (and thus when its priority is handed out)
-* (2) When documents that were *supposed* to be added to the queue turned out to already be there and already have an established priority,
-*     (in which case the priority that was handed out before is returned to the pool for reuse)
-* (3) When a document is pulled from the database queue (which sets the current highest priority level that should not be exceeded in step (1))
-*
-* The assignment prioritization model is largely independent of the queuing prioritization model, and is used to select among documents that have
-* been marked "active" as they are handed to worker threads.  These events cause information to be logged:
-* (1) When a document is handed to a worker thread
-* (2) When the worker thread completes the document
-*
-*/
-public class QueueTracker
-{
-  public static final String _rcsid = "@(#)$Id: QueueTracker.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Factor by which bins are reduced */
-  protected final static double binReductionFactor = 1.0;
-
-  /** These are the accumulated performance averages for all connections etc. */
-  protected final PerformanceStatistics performanceStatistics = new PerformanceStatistics();
-
-  /** These are the bin counts for tracking the documents that are on
-  * the active queue, but are not being processed yet */
-  protected final Map<String,BinCount> queuedBinCounts = new HashMap<String,BinCount>();
-
-  /** These are the bin counts for active threads */
-  protected final Map<String,BinCount> activeBinCounts = new HashMap<String,BinCount>();
-
-  /** Constructor */
-  public QueueTracker()
-  {
-  }
-
-  /** Add an access record to the queue tracker.  This happens when a document
-  * is added to the in-memory queue, and allows us to keep track of that particular event so
-  * we can schedule in a way that meets our distribution goals.
-  *@param binNames are the set of bins, as returned from the connector in question, for
-  * the document that is being queued.  These bins are considered global in nature.
-  */
-  public void addRecord(String[] binNames)
-  {
-    int i = 0;
-    while (i < binNames.length)
-    {
-      String binName = binNames[i++];
-      synchronized (queuedBinCounts)
-      {
-        BinCount value = queuedBinCounts.get(binName);
-        if (value == null)
-        {
-          value = new BinCount();
-          queuedBinCounts.put(binName,value);
-        }
-        value.increment();
-      }
-    }
-
-  }
-
-  /** Note the time required to successfully complete a set of documents.  This allows this module to keep track of
-  * the performance characteristics of each individual connection, so distribution across connections can be balanced
-  * properly.
-  */
-  public void noteConnectionPerformance(int docCount, String connectionName, long elapsedTime)
-  {
-    performanceStatistics.noteDocumentsCompleted(connectionName,docCount,elapsedTime);
-  }
-
-  /** Obtain the current performance statistics object */
-  public PerformanceStatistics getCurrentStatistics()
-  {
-    return performanceStatistics;
-  }
-
-  /** Note that we are beginning processing for a document with a particular set of bins.
-  * This method is called when a worker thread starts work on a set of documents.
-  */
-  public void beginProcessing(String[] binNames)
-  {
-    // Effectively, we are moving the document from one status to another, so we adjust the bin counts of the source and
-    // the target both.
-
-    int i = 0;
-    while (i < binNames.length)
-    {
-      String binName = binNames[i++];
-
-      // Increment queued bin count for this bin.
-      synchronized (queuedBinCounts)
-      {
-        BinCount value = queuedBinCounts.get(binName);
-        if (value != null)
-        {
-          if (value.decrement())
-            queuedBinCounts.remove(binName);
-        }
-      }
-
-      // Decrement active bin count for this bin.
-      synchronized (activeBinCounts)
-      {
-        BinCount value = activeBinCounts.get(binName);
-        if (value == null)
-        {
-          value = new BinCount();
-          activeBinCounts.put(binName,value);
-        }
-        value.increment();
-      }
-    }
-  }
-
-
-  /** Note that we have completed processing of a document with a given set of bins.
-  * This method gets called when a Worker Thread has finished with a document.
-  */
-  public void endProcessing(String[] binNames)
-  {
-    // Remove the document from the active queue, by decrementing the corresponding active bin counts.
-
-    int i = 0;
-    while (i < binNames.length)
-    {
-      String binName = binNames[i++];
-      synchronized (activeBinCounts)
-      {
-        BinCount value = activeBinCounts.get(binName);
-        if (value != null)
-        {
-          if (value.decrement())
-            activeBinCounts.remove(binName);
-        }
-      }
-    }
-  }
-
-  /** Calculate an assignment rating for a set of bins based on what's currently in use.
-  * This rating is used to help determine which documents returned from a queueing query actually get made "active",
-  * and which ones are skipped for the moment.
-  *
-  * The rating returned
-  * for each bin will be 1 divided by one plus the active thread count for that bin.  The higher the
-  * rating, the better.  The ratings are combined by multiplying the rating for each bin by that for
-  * every other bin, and then taking the nth root (where n is the number of bins) to normalize for
-  * the number of bins.
-  * The repository connection is used to reduce the priority of assignment, based on the fetch rate that will
-  * result from this set of bins.
-  */
-  public double calculateAssignmentRating(String[] binNames, IRepositoryConnection connection)
-  {
-    // Work in log space
-    double ratingLog = 0.0;
-    int i = 0;
-    while (i < binNames.length)
-    {
-      String binName = binNames[i++];
-      int count = 0;
-      synchronized (activeBinCounts)
-      {
-        BinCount value = activeBinCounts.get(binName);
-        if (value != null)
-          count = value.getValue();
-      }
-      // rating *= (1.0 / (1.0 + (double)count))
-      ratingLog -= Math.log(1.0 + (double)count);
-    }
-
-    // Take the ith root of the bin rating, and leave it in log form
-    return ratingLog/(double)i;
-  }
-
-
-  /** This is the class which allows a mutable integer count value to be saved in the bincount table.
-  */
-  protected static class BinCount
-  {
-    /** The count */
-    protected int count = 0;
-
-    /** Create */
-    public BinCount()
-    {
-    }
-
-    public BinCount duplicate()
-    {
-      BinCount rval = new BinCount();
-      rval.count = this.count;
-      return rval;
-    }
-
-    /** Increment the counter */
-    public void increment()
-    {
-      count++;
-    }
-
-    /** Decrement the counter, returning true if empty */
-    public boolean decrement()
-    {
-      count--;
-      return count == 0;
-    }
-
-    /** Set the counter value */
-    public void setValue(int count)
-    {
-      this.count = count;
-    }
-
-    /** Get the counter value */
-    public int getValue()
-    {
-      return count;
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RegExpCriteria.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RegExpCriteria.java
deleted file mode 100644
index 941ff3d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RegExpCriteria.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id: RegExpCriteria.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Class which describes a regular expression specification.
-*/
-public class RegExpCriteria
-{
-  public static final String _rcsid = "@(#)$Id: RegExpCriteria.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** If true, means the regexp is case insensitive. */
-  protected boolean isInsensitive;
-  /** The regexp string. */
-  protected String regExp;
-
-  /** Constructor.
-  */
-  public RegExpCriteria(String regExp, boolean isInsensitive)
-  {
-    this.regExp = regExp;
-    this.isInsensitive = isInsensitive;
-  }
-
-  /** Get regexp string.
-  */
-  public String getRegexpString()
-  {
-    return regExp;
-  }
-
-  /** Get whether case insensitive or not.
-  */
-  public boolean isInsensitive()
-  {
-    return isInsensitive;
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectionManagerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectionManagerFactory.java
deleted file mode 100644
index 0b78e13..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectionManagerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id: RepositoryConnectionManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/** Repository connection manager factory.
-*/
-public class RepositoryConnectionManagerFactory
-{
-  public static final String _rcsid = "@(#)$Id: RepositoryConnectionManagerFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_RepoConnectionMgr_";
-
-  private RepositoryConnectionManagerFactory()
-  {
-  }
-
-  /** Make a repository connection manager handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IRepositoryConnectionManager make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IRepositoryConnectionManager))
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      o = new org.apache.manifoldcf.crawler.repository.RepositoryConnectionManager(tc,database);
-      tc.save(objectName,o);
-    }
-    return (IRepositoryConnectionManager)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectorFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectorFactory.java
deleted file mode 100644
index 12292b4..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectorFactory.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/* $Id: RepositoryConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This is the factory class for IRepositoryConnector objects.
-*/
-public class RepositoryConnectorFactory extends ConnectorFactory<IRepositoryConnector>
-{
-  public static final String _rcsid = "@(#)$Id: RepositoryConnectorFactory.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Static factory
-  protected final static RepositoryConnectorFactory thisFactory = new RepositoryConnectorFactory();
-
-  private RepositoryConnectorFactory()
-  {
-  }
-
-  @Override
-  protected boolean isInstalled(IThreadContext tc, String className)
-    throws ManifoldCFException
-  {
-    IConnectorManager connMgr = ConnectorManagerFactory.make(tc);
-    return connMgr.isInstalled(className);
-  }
-
-  /** Get the activities supported by this connector.
-  *@param className is the class name.
-  *@return the list of activities.
-  */
-  protected String[] getThisActivitiesList(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    IRepositoryConnector connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return null;
-    String[] values = connector.getActivitiesList();
-    java.util.Arrays.sort(values);
-    return values;
-  }
-
-  /** Get the link types logged by this connector.
-  *@param className is the class name.
-  *@return the list of link types, in sorted order.
-  */
-  protected String[] getThisRelationshipTypes(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    IRepositoryConnector connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return null;
-    String[] values = connector.getRelationshipTypes();
-    java.util.Arrays.sort(values);
-    return values;
-  }
-
-  /** Get the operating mode for a connector.
-  *@param className is the class name.
-  *@return the connector operating model, as specified in IRepositoryConnector.
-  */
-  protected int getThisConnectorModel(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    IRepositoryConnector connector = getThisConnector(threadContext, className);
-    if (connector == null)
-      return -1;
-    return connector.getConnectorModel();
-  }
-
-  /** Install connector.
-  *@param className is the class name.
-  */
-  public static void install(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.installThis(threadContext,className);
-  }
-
-  /** Uninstall connector.
-  *@param className is the class name.
-  */
-  public static void deinstall(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    thisFactory.deinstallThis(threadContext,className);
-  }
-
-  /** Get the activities supported by this connector.
-  *@param className is the class name.
-  *@return the list of activities.
-  */
-  public static String[] getActivitiesList(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisActivitiesList(threadContext,className);
-  }
-
-  /** Get the link types logged by this connector.
-  *@param className is the class name.
-  *@return the list of link types, in sorted order.
-  */
-  public static String[] getRelationshipTypes(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisRelationshipTypes(threadContext,className);
-  }
-
-  /** Get the operating mode for a connector.
-  *@param className is the class name.
-  *@return the connector operating model, as specified in IRepositoryConnector.
-  */
-  public static int getConnectorModel(IThreadContext threadContext, String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorModel(threadContext,className);
-  }
-
-  /** Output the configuration header section.
-  */
-  public static void outputConfigurationHeader(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, ArrayList tabsArray)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationHeader(threadContext,className,out,locale,parameters,tabsArray);
-  }
-
-  /** Output the configuration body section.
-  */
-  public static void outputConfigurationBody(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.outputThisConfigurationBody(threadContext,className,out,locale,parameters,tabName);
-  }
-
-  /** Process configuration post data for a connector.
-  */
-  public static String processConfigurationPost(IThreadContext threadContext, String className, IPostParameters variableContext, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException
-  {
-    return thisFactory.processThisConfigurationPost(threadContext,className,variableContext,locale,configParams);
-  }
-  
-  /** View connector configuration.
-  */
-  public static void viewConfiguration(IThreadContext threadContext, String className, IHTTPOutput out, Locale locale, ConfigParams configParams)
-    throws ManifoldCFException, IOException
-  {
-    thisFactory.viewThisConfiguration(threadContext,className,out,locale,configParams);
-  }
-
-  /** Get a repository connector instance, without checking for installed connector.
-  *@param className is the class name.
-  *@return the instance.
-  */
-  public static IRepositoryConnector getConnectorNoCheck(String className)
-    throws ManifoldCFException
-  {
-    return thisFactory.getThisConnectorNoCheck(className);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectorPoolFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectorPoolFactory.java
deleted file mode 100644
index bac5f3d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/RepositoryConnectorPoolFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-import java.util.*;
-
-/** Repository connector pool manager factory.
-*/
-public class RepositoryConnectorPoolFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // name to use in thread context pool of objects
-  private final static String objectName = "_RepositoryConnectorPoolMgr_";
-
-  private RepositoryConnectorPoolFactory()
-  {
-  }
-
-  /** Make a repository connector pool handle.
-  *@param tc is the thread context.
-  *@return the handle.
-  */
-  public static IRepositoryConnectorPool make(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IRepositoryConnectorPool))
-    {
-      o = new org.apache.manifoldcf.crawler.repositoryconnectorpool.RepositoryConnectorPool(tc);
-      tc.save(objectName,o);
-    }
-    return (IRepositoryConnectorPool)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ReprioritizationTrackerFactory.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ReprioritizationTrackerFactory.java
deleted file mode 100644
index a142dea..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ReprioritizationTrackerFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.system.*;
-
-/** Factory class for IReprioritizationTracker.
-*/
-public class ReprioritizationTrackerFactory
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Name
-  protected final static String reprioritizationTrackerName = "_ReprioritizationTracker_";
-
-  private ReprioritizationTrackerFactory()
-  {
-  }
-
-  /** Create a reprioritization tracker handle.
-  *@param threadContext is the thread context.
-  *@return the handle.
-  */
-  public static IReprioritizationTracker make(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Object o = threadContext.get(reprioritizationTrackerName);
-    if (o == null || !(o instanceof IReprioritizationTracker))
-    {
-      o = new org.apache.manifoldcf.crawler.reprioritizationtracker.ReprioritizationTracker(threadContext);
-      threadContext.save(reprioritizationTrackerName,o);
-    }
-    return (IReprioritizationTracker)o;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ScheduleRecord.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ScheduleRecord.java
deleted file mode 100644
index 9b89b07..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/ScheduleRecord.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/* $Id: ScheduleRecord.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import java.util.*;
-
-/** This class describes a single scheduling record, which describes a matching date and time for
-* a job to be started or unblocked.  It also describes the throttle rate that should be in effect
-* for the interval.  This class is immutable.
-*/
-public class ScheduleRecord
-{
-  public static final String _rcsid = "@(#)$Id: ScheduleRecord.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Absolute job-triggering times
-  protected final EnumeratedValues dayOfWeek;
-  protected final EnumeratedValues monthOfYear;
-  protected final EnumeratedValues dayOfMonth;
-  protected final EnumeratedValues year;
-  protected final EnumeratedValues hourOfDay;
-  protected final EnumeratedValues minutesOfHour;
-  protected final String timezone;
-  protected final Long duration;
-  protected final boolean requestMinimum;
-  
-  /** Constructor.
-  *@param dayOfWeek is the day-of-week enumeration.
-  *@param monthOfYear is the month-of-year enumeration.
-  *@param dayOfMonth is the day-of-month enumeration.
-  *@param year is the year enumeration.
-  *@param hourOfDay is the time of day enumeration.
-  *@param minutesOfHour is the minutes enumeration.
-  *@param timezone is the timezone.
-  *@param duration is the window duration, or null if infinite.
-  */
-  public ScheduleRecord(EnumeratedValues dayOfWeek,
-    EnumeratedValues monthOfYear,
-    EnumeratedValues dayOfMonth,
-    EnumeratedValues year,
-    EnumeratedValues hourOfDay,
-    EnumeratedValues minutesOfHour,
-    String timezone,
-    Long duration,
-    boolean requestMinimum)
-  {
-    this.dayOfWeek = dayOfWeek;
-    this.monthOfYear = monthOfYear;
-    this.dayOfMonth = dayOfMonth;
-    this.year = year;
-    this.hourOfDay = hourOfDay;
-    this.minutesOfHour = minutesOfHour;
-    this.timezone = timezone;
-    this.duration = duration;
-    this.requestMinimum = requestMinimum;
-  }
-
-  /** Get the day of week.
-  *@return the enumeration or null.
-  */
-  public EnumeratedValues getDayOfWeek()
-  {
-    return dayOfWeek;
-  }
-
-  /** Get the month of year.
-  *@return the enumeration or null.
-  */
-  public EnumeratedValues getMonthOfYear()
-  {
-    return monthOfYear;
-  }
-
-  /** Get the day of month.
-  *@return the enumeration or null.
-  */
-  public EnumeratedValues getDayOfMonth()
-  {
-    return dayOfMonth;
-  }
-
-  /** Get the year.
-  *@return the enumeration or null.
-  */
-  public EnumeratedValues getYear()
-  {
-    return year;
-  }
-
-  /** Get the hour of the day.
-  *@return the enumeration or null.
-  */
-  public EnumeratedValues getHourOfDay()
-  {
-    return hourOfDay;
-  }
-
-  /** Get the minutes of the hour.
-  *@return the enumeration or null.
-  */
-  public EnumeratedValues getMinutesOfHour()
-  {
-    return minutesOfHour;
-  }
-
-  /** Get the timezone.
-  *@return the timezone or null.
-  */
-  public String getTimezone()
-  {
-    return timezone;
-  }
-
-  /** Get the window duration.
-  *@return the duration or null.
-  */
-  public Long getDuration()
-  {
-    return duration;
-  }
-
-  /** Get whether the schedule record corresponds to a minimal request or not.
-  *@return true if minimal request.
-  */
-  public boolean getRequestMinimum()
-  {
-    return requestMinimum;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/SortOrder.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/SortOrder.java
deleted file mode 100644
index 4858491..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/SortOrder.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/* $Id: SortOrder.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** Class which describes specification of the sort order for a report.
-*/
-public class SortOrder
-{
-  public static final String _rcsid = "@(#)$Id: SortOrder.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Sort ascending */
-  public static final int SORT_ASCENDING = 0;
-  /** Sort descending */
-  public static final int SORT_DESCENDING = 1;
-
-  /** The sort order list.  This is an array of SortSpec objects */
-  protected ArrayList sortList = new ArrayList();
-
-  /** Constructor.
-  */
-  public SortOrder()
-  {
-  }
-
-  /** Constructor from string representation.
-  */
-  public SortOrder(String rep)
-    throws ManifoldCFException
-  {
-    ParseBuffer pb = new ParseBuffer(rep);
-    StringBuilder numBuffer = new StringBuilder();
-    while (true)
-    {
-      int x = pb.peekCharAt();
-      if (x == -1)
-        throw new ManifoldCFException("Unexpected end");
-      char y = (char)x;
-      pb.next();
-      if (y == ':')
-        break;
-      numBuffer.append(y);
-    }
-    try
-    {
-      int numCount = Integer.parseInt(numBuffer.toString());
-      int i = 0;
-      while (i < numCount)
-      {
-        SortSpec ss = new SortSpec(pb);
-        sortList.add(ss);
-        i++;
-      }
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Bad number",e);
-    }
-  }
-
-  /** Convert to string form.
-  */
-  public String toString()
-  {
-    StringBuilder output = new StringBuilder();
-    output.append(Integer.toString(sortList.size()));
-    output.append(":");
-    int i = 0;
-    while (i < sortList.size())
-    {
-      SortSpec ss = (SortSpec)sortList.get(i++);
-      output.append(ss.toString());
-    }
-    return output.toString();
-  }
-
-  /** Click a column.
-  */
-  public void clickColumn(String columnName)
-  {
-    int findIndex = -1;
-    int i = 0;
-    while (i < sortList.size())
-    {
-      SortSpec ss = (SortSpec)sortList.get(i);
-      if (ss.getColumn().equals(columnName))
-        findIndex = i;
-      i++;
-    }
-    if (findIndex == -1)
-      addCriteria(columnName,SORT_ASCENDING);
-    else
-    {
-      if (findIndex == 0)
-      {
-        // Flip the sort order of the first entry
-        SortSpec ss = (SortSpec)sortList.get(findIndex);
-        sortList.remove(findIndex);
-        addCriteria(columnName,(ss.getDirection()==SORT_ASCENDING)?SORT_DESCENDING:SORT_ASCENDING);
-      }
-      else
-      {
-        // Just move it around to the front
-        SortSpec ss = (SortSpec)sortList.remove(findIndex);
-        sortList.add(0,ss);
-      }
-    }
-  }
-
-  /** Add a sort criteria, at the front.
-  */
-  public void addCriteria(String columnName, int order)
-  {
-    sortList.add(0,new SortSpec(columnName,order));
-  }
-
-  /** Get the sort spec count.
-  */
-  public int getCount()
-  {
-    return sortList.size();
-  }
-
-  /** Return an individual sort column.
-  */
-  public String getColumn(int i)
-  {
-    return ((SortSpec)sortList.get(i)).getColumn();
-  }
-
-  /** Return an individual direction.
-  */
-  public int getDirection(int i)
-  {
-    return ((SortSpec)sortList.get(i)).getDirection();
-  }
-
-  public static class ParseBuffer
-  {
-    protected String value;
-    protected int startPosition;
-
-    public ParseBuffer(String value)
-    {
-      this.value = value;
-      startPosition = 0;
-    }
-
-    public int peekCharAt()
-    {
-      if (startPosition == value.length())
-        return -1;
-      return (int)value.charAt(startPosition);
-    }
-
-    public void next()
-    {
-      if (startPosition < value.length())
-        startPosition++;
-    }
-  }
-
-  public static class SortSpec
-  {
-    protected String column;
-    protected int direction;
-
-    public SortSpec(String column, int direction)
-    {
-      this.column = column;
-      this.direction = direction;
-    }
-
-    public SortSpec(ParseBuffer pb)
-      throws ManifoldCFException
-    {
-      int x = pb.peekCharAt();
-      if (x == -1)
-        throw new ManifoldCFException("Unexpected end");
-      char y = (char)x;
-      if (y == '+')
-        this.direction = SORT_ASCENDING;
-      else if (y == '-')
-        this.direction = SORT_DESCENDING;
-      else
-        throw new ManifoldCFException("Bad direction");
-      pb.next();
-      StringBuilder sb = new StringBuilder();
-      while (true)
-      {
-        x = pb.peekCharAt();
-        if (x == -1)
-          throw new ManifoldCFException("Unexpected end");
-        y = (char)x;
-        pb.next();
-        if (y == '.')
-          break;
-        sb.append(y);
-      }
-      column = sb.toString();
-    }
-
-    public String getColumn()
-    {
-      return column;
-    }
-
-    public int getDirection()
-    {
-      return direction;
-    }
-
-    public String toString()
-    {
-      StringBuilder output = new StringBuilder();
-      if (direction == SORT_ASCENDING)
-        output.append("+");
-      else
-        output.append("-");
-      output.append(column).append(".");
-      return output.toString();
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/StatusFilterCriteria.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/StatusFilterCriteria.java
deleted file mode 100644
index 422529f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/interfaces/StatusFilterCriteria.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $Id: StatusFilterCriteria.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.interfaces;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Class which describes specification of history records to include in a report.
-*/
-public class StatusFilterCriteria
-{
-  public static final String _rcsid = "@(#)$Id: StatusFilterCriteria.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The set of jobs to match. */
-  protected Long[] ourJobs;
-  /** The lowest time of interest. */
-  protected long nowTime;
-  /** The regular expression string to match the doucment identifier. */
-  protected RegExpCriteria identifierMatchObject;
-  /** Matching states */
-  protected int[] matchingStates;
-  /** Matching statuses */
-  protected int[] matchingStatuses;
-
-  /** Constructor.
-  */
-  public StatusFilterCriteria(Long[] ourJobs, long nowTime, RegExpCriteria identifierMatchObject,
-    int[] matchingStates, int[] matchingStatuses)
-  {
-    this.ourJobs = ourJobs;
-    this.nowTime = nowTime;
-    this.identifierMatchObject = identifierMatchObject;
-    this.matchingStates = matchingStates;
-    this.matchingStatuses = matchingStatuses;
-  }
-
-  /** Get the desired activities criteria.
-  */
-  public Long[] getJobs()
-  {
-    return ourJobs;
-  }
-
-  /** Get the "now" time
-  */
-  public long getNowTime()
-  {
-    return nowTime;
-  }
-
-  /** Get the regular expression to match the entity identifier.
-  */
-  public RegExpCriteria getIdentifierMatch()
-  {
-    return identifierMatchObject;
-  }
-
-  /** Get the match states
-  */
-  public int[] getMatchingStates()
-  {
-    return matchingStates;
-  }
-
-  /** Get the match statuses
-  */
-  public int[] getMatchingStatuses()
-  {
-    return matchingStatuses;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/Carrydown.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/Carrydown.java
deleted file mode 100644
index 83da0bd..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/Carrydown.java
+++ /dev/null
@@ -1,927 +0,0 @@
-/* $Id: Carrydown.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import java.util.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/** This class manages the table that keeps track of intrinsic relationships between documents.
- * 
- * <br><br>
- * <b>carrydown</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>jobid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
- * <tr><td>parentidhash</td><td>VARCHAR(40)</td><td></td></tr>
- * <tr><td>childidhash</td><td>VARCHAR(40)</td><td></td></tr>
- * <tr><td>dataname</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>datavaluehash</td><td>VARCHAR(40)</td><td></td></tr>
- * <tr><td>datavalue</td><td>LONGTEXT</td><td></td></tr>
- * <tr><td>isnew</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>processid</td><td>VARCHAR(16)</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class Carrydown extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: Carrydown.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Field names
-  public static final String jobIDField = "jobid";
-  public static final String parentIDHashField = "parentidhash";
-  public static final String childIDHashField = "childidhash";
-  public static final String dataNameField = "dataname";
-  public static final String dataValueHashField = "datavaluehash";
-  public static final String dataValueField = "datavalue";
-  public static final String newField = "isnew";
-  public static final String processIDField = "processid";
-
-  /** The standard value for the "isnew" field.  Means that the link existed prior to this scan, and no new link
-  * was found yet. */
-  protected static final int ISNEW_BASE = 0;
-  /** This value means that the link is brand-new; it did not exist before this pass. */
-  protected static final int ISNEW_NEW = 1;
-  /** This value means that the link existed before, and has been found during this scan. */
-  protected static final int ISNEW_EXISTING = 2;
-
-  // Map from string character to link status
-  protected static Map isNewMap;
-  static
-  {
-    isNewMap = new HashMap();
-    isNewMap.put("B",new Integer(ISNEW_BASE));
-    isNewMap.put("N",new Integer(ISNEW_NEW));
-    isNewMap.put("E",new Integer(ISNEW_EXISTING));
-  }
-
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public Carrydown(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"carrydown");
-  }
-
-  /** Install or upgrade.
-  */
-  public void install(String jobsTable, String jobsColumn)
-    throws ManifoldCFException
-  {
-    // Standard practice: Outer loop, to support upgrade requirements.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // I'm going to allow the parent to be null, which basically will be able to represent carry-down from the seeding
-        // process to the seed, in case this ever arises.
-        //
-        // I am also going to allow null data values.
-        HashMap map = new HashMap();
-        map.put(jobIDField,new ColumnDescription("BIGINT",false,false,jobsTable,jobsColumn,false));
-        map.put(parentIDHashField,new ColumnDescription("VARCHAR(40)",false,true,null,null,false));
-        map.put(childIDHashField,new ColumnDescription("VARCHAR(40)",false,false,null,null,false));
-        map.put(dataNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(dataValueHashField,new ColumnDescription("VARCHAR(40)",false,true,null,null,false));
-        map.put(dataValueField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(newField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        map.put(processIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-
-        performCreate(map,null);
-
-      }
-      else
-      {
-        // Upgrade code goes here, if needed.
-      }
-
-      // Now do index management
-
-      IndexDescription uniqueIndex = new IndexDescription(true,new String[]{jobIDField,parentIDHashField,childIDHashField,dataNameField,dataValueHashField});
-      IndexDescription jobChildDataIndex = new IndexDescription(false,new String[]{jobIDField,childIDHashField,dataNameField});
-      IndexDescription newIndex = new IndexDescription(false,new String[]{newField,processIDField});
-
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (uniqueIndex != null && id.equals(uniqueIndex))
-          uniqueIndex = null;
-        else if (jobChildDataIndex != null && id.equals(jobChildDataIndex))
-          jobChildDataIndex = null;
-        else if (newIndex != null && id.equals(newIndex))
-          newIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Create the indexes we are missing
-
-      if (jobChildDataIndex != null)
-        performAddIndex(null,jobChildDataIndex);
-
-      if (newIndex != null)
-        performAddIndex(null,newIndex);
-
-      // This index is the constraint.  Only one row per job,dataname,datavalue,parent,and child.
-      if (uniqueIndex != null)
-        performAddIndex(null,uniqueIndex);
-
-      // Install/upgrade complete
-      break;
-    }
-
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Analyze job tables that need analysis.
-  */
-  public void analyzeTables()
-    throws ManifoldCFException
-  {
-    long startTime = System.currentTimeMillis();
-    Logging.perf.debug("Beginning to analyze carrydown table");
-    analyzeTable();
-    Logging.perf.debug("Done analyzing carrydown table in "+new Long(System.currentTimeMillis()-startTime)+" ms");
-  }
-
-  /** Delete an owning job (and clean up the corresponding carrydown rows).
-  */
-  public void deleteOwner(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-    performDelete("WHERE "+query,list,null);
-  }
-
-  // The strategy here is to leave all rows that have a given document as a parent labelled as "BASE" at the start of the
-  // processing of that parent.  As data are encountered, the values get written as "NEW" or flipped to "EXISTING".
-  // When the document's processing has been completed, another method is called
-  // that will remove all rows that belong to the parent which are still labelled "BASE", and will map the other rows that
-  // belong to the parent back to the "BASE" state.
-  //
-  //  If the daemon is aborted and restarted, the "new" rows should be deleted, and the EXISTING rows should be reset to
-  // BASE, in order to restore the system to a good base state.
-  //
-
-  /** Reset, at startup time.
-  *@param processID is the process ID.
-  */
-  public void restart(String processID)
-    throws ManifoldCFException
-  {
-    // Delete "new" rows
-    HashMap map = new HashMap();
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(newField,statusToString(ISNEW_NEW)),
-      new UnitaryClause(processIDField,processID)});
-    performDelete("WHERE "+query,list,null);
-
-    // Convert "existing" rows to base
-    map.put(newField,statusToString(ISNEW_BASE));
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(newField,statusToString(ISNEW_EXISTING)),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Clean up after all process IDs.
-  */
-  public void restart()
-    throws ManifoldCFException
-  {
-    // Delete "new" rows
-    HashMap map = new HashMap();
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(newField,statusToString(ISNEW_NEW))});
-    performDelete("WHERE "+query,list,null);
-
-    // Convert "existing" rows to base
-    map.put(newField,statusToString(ISNEW_BASE));
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(newField,statusToString(ISNEW_EXISTING))});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-  
-  /** Reset, at startup time, entire cluster
-  */
-  public void restartCluster()
-    throws ManifoldCFException
-  {
-    // Does nothing
-  }
-
-  /** Add carrydown data for a given parent/child pair.
-  *
-  *@return true if new carrydown data was recorded; false otherwise.
-  */
-  public boolean recordCarrydownData(Long jobID, String parentDocumentIDHash, String childDocumentIDHash,
-    String[] documentDataNames, String[][] documentDataValueHashes, Object[][] documentDataValues, String processID)
-    throws ManifoldCFException
-  {
-    return recordCarrydownDataMultiple(jobID,parentDocumentIDHash,new String[]{childDocumentIDHash},
-      new String[][]{documentDataNames},new String[][][]{documentDataValueHashes},new Object[][][]{documentDataValues},processID)[0];
-  }
-
-  /** Add carrydown data to the table.
-  */
-  public boolean[] recordCarrydownDataMultiple(Long jobID, String parentDocumentIDHash, String[] childDocumentIDHashes,
-    String[][] dataNames, String[][][] dataValueHashes, Object[][][] dataValues, String processID)
-    throws ManifoldCFException
-  {
-
-    // Need to go into a transaction because we need to distinguish between update and insert.
-    HashMap duplicateRemoval = new HashMap();
-    HashMap presentMap = new HashMap();
-
-    int maxClause = getMaxOrClause();
-    StringBuilder sb = new StringBuilder();
-    ArrayList list = new ArrayList();
-    int i = 0;
-    int k = 0;
-    // Keep track of the data items that have been seen vs. those that were unseen.
-    while (k < childDocumentIDHashes.length)
-    {
-      String childDocumentIDHash = childDocumentIDHashes[k];
-
-      // Loop through data names and values for this document
-      String[] documentDataNames = dataNames[k];
-      String[][] documentDataValueHashes = dataValueHashes[k];
-      Object[][] documentDataValues = dataValues[k];
-      k++;
-
-      int q = 0;
-      while (q < documentDataNames.length)
-      {
-        String documentDataName = documentDataNames[q];
-        String[] documentDataValueHashSet = documentDataValueHashes[q];
-        Object[] documentDataValueSet = documentDataValues[q];
-        q++;
-
-        if (documentDataValueHashSet != null)
-        {
-          int p = 0;
-          while (p < documentDataValueHashSet.length)
-          {
-            String documentDataValueHash = documentDataValueHashSet[p];
-            Object documentDataValue = documentDataValueSet[p];
-            // blank values equivalent to null
-            if (documentDataValueHash != null && documentDataValueHash.length() == 0)
-              documentDataValueHash = null;
-            // Build a hash record
-            ValueRecord vr = new ValueRecord(childDocumentIDHash,
-              documentDataName,documentDataValueHash,documentDataValue);
-            if (duplicateRemoval.get(vr) != null)
-              continue;
-            duplicateRemoval.put(vr,vr);
-            if (i == maxClause)
-            {
-              // Do the query and record the results
-              performExistsCheck(presentMap,sb.toString(),list);
-              i = 0;
-              sb.setLength(0);
-              list.clear();
-            }
-            if (i > 0)
-              sb.append(" OR ");
-            
-            sb.append(buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobIDField,jobID),
-              new UnitaryClause(parentIDHashField,parentDocumentIDHash),
-              new UnitaryClause(childIDHashField,childDocumentIDHash),
-              new UnitaryClause(dataNameField,documentDataName),
-              (documentDataValueHash==null)?
-                new NullCheckClause(dataValueHashField,true):
-                new UnitaryClause(dataValueHashField,documentDataValueHash)}));
-
-            i++;
-            p++;
-          }
-        }
-      }
-    }
-    if (i > 0)
-      performExistsCheck(presentMap,sb.toString(),list);
-
-    // Go through the list again, and based on the results above, decide to do either an insert or
-    // an update.  Keep track of this information also, so we can build the return array when done.
-
-    HashMap insertHappened = new HashMap();
-
-    int j = 0;
-    Iterator iter = duplicateRemoval.keySet().iterator();
-    while (iter.hasNext())
-    {
-      ValueRecord childDocumentRecord = (ValueRecord)iter.next();
-
-      String childDocumentIDHash = childDocumentRecord.getDocumentIDHash();
-
-      HashMap map = new HashMap();
-      String dataName = childDocumentRecord.getDataName();
-      String dataValueHash = childDocumentRecord.getDataValueHash();
-      Object dataValue = childDocumentRecord.getDataValue();
-
-      if (presentMap.get(childDocumentRecord) == null)
-      {
-        map.put(jobIDField,jobID);
-        map.put(parentIDHashField,parentDocumentIDHash);
-        map.put(childIDHashField,childDocumentIDHash);
-        map.put(dataNameField,dataName);
-        if (dataValueHash != null)
-        {
-          map.put(dataValueHashField,dataValueHash);
-          map.put(dataValueField,dataValue);
-        }
-
-        map.put(newField,statusToString(ISNEW_NEW));
-        map.put(processIDField,processID);
-        performInsert(map,null);
-        noteModifications(1,0,0);
-        insertHappened.put(childDocumentIDHash,new Boolean(true));
-      }
-      else
-      {
-        sb = new StringBuilder("WHERE ");
-        ArrayList updateList = new ArrayList();
-        sb.append(buildConjunctionClause(updateList,new ClauseDescription[]{
-          new UnitaryClause(jobIDField,jobID),
-          new UnitaryClause(parentIDHashField,parentDocumentIDHash),
-          new UnitaryClause(childIDHashField,childDocumentIDHash),
-          new UnitaryClause(dataNameField,dataName),
-          (dataValueHash==null)?
-            new NullCheckClause(dataValueHashField,true):
-            new UnitaryClause(dataValueHashField,dataValueHash)}));
-
-        /*
-        sb.append(jobIDField).append("=? AND ")
-          .append(parentIDHashField).append("=? AND ")
-          .append(childIDHashField).append("=? AND ")
-          .append(dataNameField).append("=? AND ");
-
-        updateList.add(jobID);
-        updateList.add(parentDocumentIDHash);
-        updateList.add(childDocumentIDHash);
-        updateList.add(dataName);
-        if (dataValueHash != null)
-        {
-          sb.append(dataValueHashField).append("=?");
-          updateList.add(dataValueHash);
-        }
-        else
-        {
-          sb.append(dataValueHashField).append(" IS NULL");
-        }
-        */
-            
-        map.put(newField,statusToString(ISNEW_EXISTING));
-        map.put(processIDField,processID);
-        performUpdate(map,sb.toString(),updateList,null);
-        noteModifications(0,1,0);
-      }
-    }
-
-    boolean[] rval = new boolean[childDocumentIDHashes.length];
-    i = 0;
-    while (i < rval.length)
-    {
-      String childDocumentIDHash = childDocumentIDHashes[i];
-      rval[i++] = (insertHappened.get(childDocumentIDHash) != null);
-    }
-
-    return rval;
-  }
-
-  /** Do the exists check, in batch. */
-  protected void performExistsCheck(Map presentMap, String query, ArrayList list)
-    throws ManifoldCFException
-  {
-    // Note well: presentMap is only checked for the *existence* of a record, so we do not need to populate the datavalue field!
-    // This is crucial, because otherwise we'd either be using an undetermined amount of memory, or we'd need to read into a temporary file.
-    IResultSet result = performQuery("SELECT "+childIDHashField+","+dataNameField+","+dataValueHashField+" FROM "+getTableName()+" WHERE "+query+" FOR UPDATE",list,null,null);
-    int i = 0;
-    while (i < result.getRowCount())
-    {
-      IResultRow row = result.getRow(i++);
-      String documentIDHash = (String)row.getValue(childIDHashField);
-      String dataName = (String)row.getValue(dataNameField);
-      String dataValueHash = (String)row.getValue(dataValueHashField);
-      //String dataValue = (String)row.getValue(dataValueField);
-      ValueRecord vr = new ValueRecord(documentIDHash,dataName,dataValueHash,null);
-
-      presentMap.put(vr,vr);
-    }
-  }
-  
-  /** Revert all records belonging to the specified parent documents to their original,
-  * pre-modified, state.
-  */
-  public void revertRecords(Long jobID, String[] parentDocumentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = getMaxInClause();
-    StringBuilder sb = new StringBuilder();
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String parentDocumentIDHash : parentDocumentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performRevertRecords(sb.toString(),jobID,list);
-        sb.setLength(0);
-        list.clear();
-        k = 0;
-      }
-      if (k > 0)
-        sb.append(",");
-      sb.append("?");
-      list.add(parentDocumentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performRevertRecords(sb.toString(),jobID,list);
-  }
-  
-  protected void performRevertRecords(String query, Long jobID, List<String> list)
-    throws ManifoldCFException
-  {
-    // Delete new records
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList newList = new ArrayList();
-    
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list)})).append(" AND ");
-      
-    sb.append(newField).append("=?");
-    newList.add(statusToString(ISNEW_NEW));
-    performDelete(sb.toString(),newList,null);
-
-    // Restore old values
-    sb = new StringBuilder("WHERE ");
-    newList.clear();
-
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list)})).append(" AND ");
-
-    sb.append(newField).append("=?");
-    newList.add(statusToString(ISNEW_EXISTING));
-    
-    HashMap map = new HashMap();
-    map.put(newField,statusToString(ISNEW_BASE));
-    map.put(processIDField,null);
-    performUpdate(map,sb.toString(),newList,null);
-    
-    noteModifications(0,list.size(),0);
-  }
-
-  /** Return all records belonging to the specified parent documents to the base state,
-  * and delete the old (eliminated) child records.
-  */
-  public void restoreRecords(Long jobID, String[] parentDocumentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = getMaxInClause();
-    StringBuilder sb = new StringBuilder();
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String parentDocumentIDHash : parentDocumentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performRestoreRecords(sb.toString(),jobID,list);
-        sb.setLength(0);
-        list.clear();
-        k = 0;
-      }
-      if (k > 0)
-        sb.append(",");
-      sb.append("?");
-      list.add(parentDocumentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performRestoreRecords(sb.toString(),jobID,list);
-  }
-
-  protected void performRestoreRecords(String query, Long jobID, List<String> list)
-    throws ManifoldCFException
-  {
-    // Delete
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList newList = new ArrayList();
-    
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list)})).append(" AND ");
-      
-    sb.append(newField).append("=?");
-    newList.add(statusToString(ISNEW_BASE));
-    performDelete(sb.toString(),newList,null);
-
-    // Restore new values
-    sb = new StringBuilder("WHERE ");
-    newList.clear();
-
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list)})).append(" AND ");
-
-    sb.append(newField).append(" IN (?,?)");
-    newList.add(statusToString(ISNEW_EXISTING));
-    newList.add(statusToString(ISNEW_NEW));
-    
-    HashMap map = new HashMap();
-    map.put(newField,statusToString(ISNEW_BASE));
-    map.put(processIDField,null);
-    performUpdate(map,sb.toString(),newList,null);
-    
-    noteModifications(0,list.size(),0);
-  }
-
-  /** Delete all records that mention a particular set of document identifiers.
-  */
-  public void deleteRecords(Long jobID, String[] documentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = maxClausePerformDeleteRecords(jobID);
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String documentIDHash : documentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performDeleteRecords(jobID,list);
-        list.clear();
-        k = 0;
-      }
-      list.add(documentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performDeleteRecords(jobID,list);
-  }
-
-  protected int maxClausePerformDeleteRecords(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-  }
-    
-  protected void performDeleteRecords(Long jobID, List<String> list)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList newList = new ArrayList();
-    
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(childIDHashField,list)}));
-    performDelete(sb.toString(),newList,null);
-    
-    sb = new StringBuilder("WHERE ");
-    newList.clear();
-    
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list)}));
-    performDelete(sb.toString(),newList,null);
-
-    noteModifications(0,0,list.size()*2);
-  }
-
-  /** Get unique values given a document identifier, data name, an job identifier */
-  public String[] getDataValues(Long jobID, String documentIdentifierHash, String dataName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(childIDHashField,documentIdentifierHash),
-      new UnitaryClause(dataNameField,dataName)});
-
-    IResultSet set = getDBInterface().performQuery("SELECT "+dataValueHashField+","+dataValueField+" FROM "+getTableName()+" WHERE "+
-      query+" ORDER BY 1 ASC",list,null,null,-1,null,new ResultDuplicateEliminator());
-
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(dataValueField);
-      if (rval[i] == null)
-        rval[i] = "";
-      i++;
-    }
-    return rval;
-  }
-
-  /** Get unique values given a document identifier, data name, an job identifier */
-  public CharacterInput[] getDataValuesAsFiles(Long jobID, String documentIdentifierHash, String dataName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(childIDHashField,documentIdentifierHash),
-      new UnitaryClause(dataNameField,dataName)});
-
-    ResultSpecification rs = new ResultSpecification();
-    rs.setForm(dataValueField,ResultSpecification.FORM_STREAM);
-    IResultSet set = getDBInterface().performQuery("SELECT "+dataValueHashField+","+dataValueField+" FROM "+getTableName()+" WHERE "+
-      query+" ORDER BY 1 ASC",list,null,null,-1,rs,new ResultDuplicateEliminator());
-
-    CharacterInput[] rval = new CharacterInput[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (CharacterInput)row.getValue(dataValueField);
-      i++;
-    }
-    return rval;
-  }
-
-  /** Convert string to link status. */
-  public static int stringToStatus(String status)
-  {
-    Integer value = (Integer)isNewMap.get(status);
-    return value.intValue();
-  }
-
-  /** Convert link status to string */
-  public static String statusToString(int status)
-  {
-    switch (status)
-    {
-    case ISNEW_BASE:
-      return "B";
-    case ISNEW_NEW:
-      return "N";
-    case ISNEW_EXISTING:
-      return "E";
-    default:
-      return null;
-    }
-  }
-
-  /** Limit checker which removes duplicate rows, based on datavaluehash */
-  protected static class ResultDuplicateEliminator implements ILimitChecker
-  {
-    // The last value of data hash
-    protected String currentDataHashValue = null;
-
-    public ResultDuplicateEliminator()
-    {
-    }
-
-    public boolean doesCompareWork()
-    {
-      return false;
-    }
-
-    public ILimitChecker duplicate()
-    {
-      return null;
-    }
-
-    public int hashCode()
-    {
-      return 0;
-    }
-
-    public boolean equals(Object object)
-    {
-      return false;
-    }
-
-    /** See if a result row should be included in the final result set.
-    *@param row is the result row to check.
-    *@return true if it should be included, false otherwise.
-    */
-    public boolean checkInclude(IResultRow row)
-      throws ManifoldCFException
-    {
-      // Check to be sure that this row is different from the last; only then agree to include it.
-      String value = (String)row.getValue(dataValueHashField);
-      if (value == null)
-        value = "";
-      if (currentDataHashValue == null || !value.equals(currentDataHashValue))
-      {
-        currentDataHashValue = value;
-        return true;
-      }
-      return false;
-    }
-
-    /** See if we should examine another row.
-    *@return true if we need to keep going, or false if we are done.
-    */
-    public boolean checkContinue()
-      throws ManifoldCFException
-    {
-      return true;
-    }
-  }
-
-  protected static class ValueRecord
-  {
-    protected String documentIdentifierHash;
-    protected String dataName;
-    protected String dataValueHash;
-    // This value may be null, if we're simply using this record as a key
-    protected Object dataValue;
-
-    public ValueRecord(String documentIdentifierHash, String dataName, String dataValueHash, Object dataValue)
-    {
-      this.documentIdentifierHash = documentIdentifierHash;
-      this.dataName = dataName;
-      this.dataValueHash = dataValueHash;
-      this.dataValue = dataValue;
-    }
-
-    public String getDocumentIDHash()
-    {
-      return documentIdentifierHash;
-    }
-
-    public String getDataName()
-    {
-      return dataName;
-    }
-
-    public String getDataValueHash()
-    {
-      return dataValueHash;
-    }
-
-    public Object getDataValue()
-    {
-      return dataValue;
-    }
-
-    public int hashCode()
-    {
-      return documentIdentifierHash.hashCode() + dataName.hashCode() + ((dataValueHash == null)?0:dataValueHash.hashCode());
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ValueRecord))
-        return false;
-      ValueRecord v = (ValueRecord)o;
-      if (!documentIdentifierHash.equals(v.documentIdentifierHash))
-        return false;
-      if (!dataName.equals(v.dataName))
-        return false;
-      if (dataValueHash == null && v.dataValueHash != null)
-        return false;
-      if (dataValueHash != null && v.dataValueHash == null)
-        return false;
-      if (dataValueHash == null)
-        return true;
-      return dataValueHash.equals(v.dataValueHash);
-    }
-  }
-
-  // This class filters an ordered resultset to return only the duplicates
-  protected static class DuplicateFinder implements ILimitChecker
-  {
-    protected Long prevJobID = null;
-    protected String prevParentIDHash = null;
-    protected String prevChildIDHash = null;
-    protected String prevDataName = null;
-    protected String prevDataValue = null;
-
-    public DuplicateFinder()
-    {
-    }
-
-    /** See if this class can be legitimately compared against another of
-    * the same type.
-    *@return true if comparisons will ever return "true".
-    */
-    public boolean doesCompareWork()
-    {
-      return false;
-    }
-
-    /** Create a duplicate of this class instance.  All current state should be preserved.
-    * NOTE: Since doesCompareWork() returns false, queries using this limit checker cannot
-    * be cached, and therefore duplicate() is never called from the query executor.
-    *@return the duplicate.
-    */
-    public ILimitChecker duplicate()
-    {
-      DuplicateFinder df = new DuplicateFinder();
-      df.prevJobID = prevJobID;
-      df.prevParentIDHash = prevParentIDHash;
-      df.prevChildIDHash = prevChildIDHash;
-      df.prevDataName = prevDataName;
-      df.prevDataValue = prevDataValue;
-      return df;
-    }
-
-    /** Find the hashcode for this class.  This will only ever be used if
-    * doesCompareWork() returns true.
-    *@return the hashcode.
-    */
-    public int hashCode()
-    {
-      return 0;
-    }
-
-    /** Compare two objects and see if equal.  This will only ever be used
-    * if doesCompareWork() returns true.
-    *@param object is the object to compare against.
-    *@return true if equal.
-    */
-    public boolean equals(Object object)
-    {
-      return false;
-    }
-
-    /** See if a result row should be included in the final result set.
-    *@param row is the result row to check.
-    *@return true if it should be included, false otherwise.
-    */
-    public boolean checkInclude(IResultRow row)
-      throws ManifoldCFException
-    {
-      Long jobID = (Long)row.getValue(jobIDField);
-      String parentIDHash = (String)row.getValue(parentIDHashField);
-      if (parentIDHash == null)
-        parentIDHash = "";
-      String childIDHash = (String)row.getValue(childIDHashField);
-      if (childIDHash == null)
-        childIDHash = "";
-      String dataName = (String)row.getValue(dataNameField);
-      String dataValue = (String)row.getValue(dataValueField);
-      if (dataValue == null)
-        dataValue = "";
-
-      // If this is a duplicate, we want to keep it!
-      if (prevJobID != null && jobID.equals(prevJobID) && dataName.equals(prevDataName) && dataValue.equals(prevDataValue) && parentIDHash.equals(prevParentIDHash) && childIDHash.equals(prevChildIDHash))
-        return true;
-      prevJobID = jobID;
-      prevDataName = dataName;
-      prevParentIDHash = parentIDHash;
-      prevChildIDHash = childIDHash;
-      prevDataValue = dataValue;
-      return false;
-    }
-
-    /** See if we should examine another row.
-    *@return true if we need to keep going, or false if we are done.
-    */
-    public boolean checkContinue()
-      throws ManifoldCFException
-    {
-      return true;
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/DeleteDependency.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/DeleteDependency.java
deleted file mode 100644
index 47abc4e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/DeleteDependency.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id: DeleteDependency.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class represents and describes a single delete dependency.
-*/
-public class DeleteDependency
-{
-  public static final String _rcsid = "@(#)$Id: DeleteDependency.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Data
-  protected String linkType;
-  protected String parentIDHash;
-  protected String childIDHash;
-
-  /** Constructor. */
-  public DeleteDependency(String linkType, String parentIDHash, String childIDHash)
-  {
-    if (linkType == null)
-      linkType = "";
-    this.linkType = linkType;
-    this.parentIDHash = parentIDHash;
-    if (childIDHash == null)
-      childIDHash = "";
-    this.childIDHash = childIDHash;
-  }
-
-  /** Get linktype */
-  public String getLinkType()
-  {
-    return linkType;
-  }
-
-  /** Get parent identifier */
-  public String getParentIDHash()
-  {
-    return parentIDHash;
-  }
-
-  /** Get child identifier */
-  public String getChildIDHash()
-  {
-    return childIDHash;
-  }
-
-  /** hash */
-  public int hashCode()
-  {
-    return linkType.hashCode() + parentIDHash.hashCode() + childIDHash.hashCode();
-  }
-
-  /** Compare */
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof DeleteDependency))
-      return false;
-    DeleteDependency d = (DeleteDependency)o;
-    return linkType.equals(d.linkType) && parentIDHash.equals(d.parentIDHash) && childIDHash.equals(d.childIDHash);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/EventManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/EventManager.java
deleted file mode 100644
index 508c971..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/EventManager.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/* $Id: EventManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-
-/** This class manages the events table.
-* A row in this table indicates that a specific event sequence is in progress.  For example, a login sequence for a specific web domain
-* may be underway.  During the time that the event is taking place, no documents that depend on that event will be queued for processing.
-* 
-* <br><br>
-* <b>events</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>name</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
-* <tr><td>processid</td><td>VARCHAR(16)</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class EventManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: EventManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Field names
-  public final static String eventNameField = "name";
-  public final static String processIDField = "processid";
-  
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public EventManager(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"events");
-  }
-
-  /** Install or upgrade this table.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // Standard practice: outer loop for installs
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(eventNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-        map.put(processIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade goes here if needed
-      }
-
-      // Index management goes here
-      IndexDescription processIDIndex = new IndexDescription(false,new String[]{processIDField});
-      // Get rid of unused indexes
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (processIDIndex != null && id.equals(processIDIndex))
-          processIDIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Build missing indexes
-
-      if (processIDIndex != null)
-        performAddIndex(null,processIDIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Prepare for restart.
-  *@param processID is the processID to restart.
-  */
-  public void restart(String processID)
-    throws ManifoldCFException
-  {
-    // Delete all rows in this table matching the processID
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(processIDField,processID)});
-    performDelete("WHERE "+query,list,null);
-  }
-
-  /** Clean up after all processIDs.
-  */
-  public void restart()
-    throws ManifoldCFException
-  {
-    performDelete("",null,null);
-  }
-  
-  /** Restart cluster.
-  */
-  public void restartCluster()
-    throws ManifoldCFException
-  {
-    // Does nothing
-  }
-  
-  /** Atomically create an event - and return false if the event already exists */
-  public void createEvent(String eventName, String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(eventNameField,eventName);
-    map.put(processIDField,processID);
-    performInsert(map,null);
-  }
-
-  /** Destroy an event */
-  public void destroyEvent(String eventName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(eventName);
-    performDelete("WHERE "+eventNameField+"=?",list,null);
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopCount.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopCount.java
deleted file mode 100644
index 2016f4f..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopCount.java
+++ /dev/null
@@ -1,3289 +0,0 @@
-/* $Id: HopCount.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import java.util.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/** This class manages the table that keeps track of hop count, and algorithmically determines this value
-* for a document identifier upon request.
-* 
-* <br><br>
-* <b>hopcount</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>id</td><td>BIGINT</td><td>Primary Key</td></tr>
-* <tr><td>jobid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
-* <tr><td>linktype</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>parentidhash</td><td>VARCHAR(40)</td><td></td></tr>
-* <tr><td>distance</td><td>BIGINT</td><td></td></tr>
-* <tr><td>deathmark</td><td>CHAR(1)</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class HopCount extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: HopCount.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Answer constants
-  public static final int ANSWER_UNKNOWN = -1;
-  public static final int ANSWER_INFINITY = -2;
-
-  // Notes on the schema
-  // ===================
-  //
-  // This schema consists of three interrelated tables.  The table controlled directly by this class
-  // is the table where cached distance results are kept.  It has a child table, which keeps track
-  // of certain dependencies, so that we have a way of figuring out relatively accurately which cached links
-  // need to be re-evaluated when there is a change.  Finally, there is a related table where intrinsic
-  // (i.e. direct) link information is kept.
-  //
-  // When links are recorded, a source document refers to target documents.  The convention here is
-  // that the source document is called the "child", and the target document is called the "parent".
-  // Also by convention, a child value of null means "the root".  Since all cached distances are to
-  // the root, we only store the "parent" in the hopcount table.
-  //
-  // Each row in the main hopcount table is linked with the child tables by means of an id field.
-  //
-  // Database table management for hopcount determination
-  // ====================================================
-  //
-  // The critical operation we want to be able to do is to propagate the effects of a change throughout
-  // the cached data.  I originally assumed that that meant "blowing the cache" - deleting all minimum
-  // hop counts stored in the database which corresponded to the link we have added or deleted.
-  // However, after the naive algorithm ran for a while, it became clear that it was not going to perform
-  // well, because the sheer quantity of dependency information made management of dependencies far
-  // exceed reason.  Caching of hopcount, however, still was clearly essential, because when I removed
-  // the caching completely, things just plain wedged.
-  //
-  // Then I realized that by far the most common activity involves adding links to the graph, and therefore
-  // if I could optimize that activity without storing huge quantities of dependency information, the
-  // performance goals would be met.  So, this is how the thinking went:
-  //
-  // - We always start with a graph where the cached hopcount values only exist IF the hopcount values
-  //   that were needed to come up with that value also exist.  Any changes to the graph MUST preserve this
-  //   situation.
-  // - Under these conditions, adding a link between a source and target could encounter either of two conditions:
-  //   (a) the target has no cached hopcount, or
-  //   (b) the target DOES have a cached hopcount.
-  //   In case (a), we must treat the existing non-record as meaning "infinite distance", which is clearly wrong.
-  //   We therefore must create a record for that location, which has a value of infinity.  After that, treat this
-  //   the exact same way as for (b).
-  //   In the case of (b), we need to re-evaluate the hopcount with the new link in place,
-  //   and compare it against the existing hopcount.  The new value cannot be larger (unless the table was somehow corrupted),
-  //   because adding a link can NEVER increase a hopcount.  If the new hopcount is less than the old, then
-  //   we change the value in the table, and examine all the target nodes in the same way.  Most likely, the
-  //   propagation will stop quickly, because there are lots of ways of getting to a node and this is just one
-  //   of them.
-  // - When a link is deleted, we run the risk of leaving around disconnected loops that evaluate forever, if
-  //   we use the same propagation algorithm.  So instead, we want to keep track of what nodes will need reevaluation
-  //   when a link is destroyed.  This list is relatively small, since only the shortest possible path to a node
-  //   is represented in this dependency information.
-  //   So, when a link is deleted, the following steps take place.  All the dependent hopcount nodes are queued, but
-  //   in such a way as to be reset to having an "infinite" distance.  Then, re-evaluation occurs in the same manner as for
-  //   the add case above.
-  // - In order to determine the hopcount value of a node at any given time, all you need to do is to look for a cached
-  //   hopcount value.  If you find it, that's the right number.  If you don't, you can presume the value is infinity.
-  //
-  //
-  // Activities that should occur when a hopcount changes
-  // ====================================================
-  //
-  // Documents in the job queue may be excluded from consideration based on hopcount.  If the hopcount for a document changes
-  // (decreases), this assessment could well change.  Therefore, this hopcount module MUST cause documents to be switched
-  // to a "pending" state whenever a hopcount change occurs that makes the document pass its hopcount filtering criteria.
-  //
-  //
-
-  // Field names
-  public static final String idField = "id";
-  public static final String jobIDField = "jobid";
-  public static final String linkTypeField = "linktype";
-  public static final String parentIDHashField = "parentidhash";
-  public static final String distanceField = "distance";
-  public static final String markForDeathField = "deathmark";
-
-  // Mark for death status
-  public static final int MARK_NORMAL = 0;
-  public static final int MARK_QUEUED = 1;
-  public static final int MARK_DELETING = 2;
-
-  protected static Map markMap;
-
-  static
-  {
-    markMap = new HashMap();
-    markMap.put("N",new Integer(MARK_NORMAL));
-    markMap.put("Q",new Integer(MARK_QUEUED));
-    markMap.put("D",new Integer(MARK_DELETING));
-  }
-
-  /** Intrinsic link table manager. */
-  protected IntrinsicLink intrinsicLinkManager;
-  /** Hop "delete" dependencies manager */
-  protected HopDeleteDeps deleteDepsManager;
-
-  /** Thread context */
-  protected IThreadContext threadContext;
-  
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public HopCount(IThreadContext tc, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"hopcount");
-    this.threadContext = tc;
-    intrinsicLinkManager = new IntrinsicLink(database);
-    deleteDepsManager = new HopDeleteDeps(database);
-  }
-
-  /** Install or upgrade.
-  */
-  public void install(String jobsTable, String jobsColumn)
-    throws ManifoldCFException
-  {
-    // Per convention, always have outer loop in install() methods
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(idField,new ColumnDescription("BIGINT",true,false,null,null,false));
-        map.put(jobIDField,new ColumnDescription("BIGINT",false,false,jobsTable,jobsColumn,false));
-        map.put(linkTypeField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(parentIDHashField,new ColumnDescription("VARCHAR(40)",false,false,null,null,false));
-        map.put(distanceField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(markForDeathField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        performCreate(map,null);
-
-      }
-      else
-      {
-        // Upgrade goes here, if needed
-      }
-
-      // Do child tables.
-      intrinsicLinkManager.install(jobsTable,jobsColumn);
-      deleteDepsManager.install(jobsTable,jobsColumn,getTableName(),idField);
-
-      // Do indexes
-      IndexDescription jobLinktypeParentIndex = new IndexDescription(true,new String[]{jobIDField,parentIDHashField,linkTypeField});
-      IndexDescription jobDeathIndex = new IndexDescription(false,new String[]{jobIDField,markForDeathField,parentIDHashField,linkTypeField});
-
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (jobLinktypeParentIndex != null && id.equals(jobLinktypeParentIndex))
-          jobLinktypeParentIndex = null;
-        else if (jobDeathIndex != null && id.equals(jobDeathIndex))
-          jobDeathIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      if (jobLinktypeParentIndex != null)
-        performAddIndex(null,jobLinktypeParentIndex);
-
-      if (jobDeathIndex != null)
-        performAddIndex(null,jobDeathIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      deleteDepsManager.deinstall();
-      intrinsicLinkManager.deinstall();
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-  }
-
-  /** Go from string to mark.
-  *@param value is the string.
-  *@return the status value.
-  */
-  public static int stringToMark(String value)
-    throws ManifoldCFException
-  {
-    Integer x = (Integer)markMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Bad mark value: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Go from mark to string.
-  *@param mark is the mark.
-  *@return the string.
-  */
-  public static String markToString(int mark)
-    throws ManifoldCFException
-  {
-    switch (mark)
-    {
-    case MARK_NORMAL:
-      return "N";
-    case MARK_QUEUED:
-      return "Q";
-    case MARK_DELETING:
-      return "D";
-    default:
-      throw new ManifoldCFException("Bad mark value");
-    }
-  }
-
-  /** Delete an owner (and clean up the corresponding hopcount rows).
-  */
-  public void deleteOwner(Long jobID)
-    throws ManifoldCFException
-  {
-    // Delete the intrinsic rows belonging to this job.
-    intrinsicLinkManager.deleteOwner(jobID);
-
-    // Delete the deletedeps rows
-    deleteDepsManager.deleteJob(jobID);
-
-    // Delete our own rows.
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-    performDelete("WHERE "+query,list,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Reset, at startup time.
-  *@param processID is the process ID.
-  */
-  public void restart(String processID)
-    throws ManifoldCFException
-  {
-    intrinsicLinkManager.restart(processID);
-  }
-
-  /** Clean up after all process IDs.
-  */
-  public void restart()
-    throws ManifoldCFException
-  {
-    intrinsicLinkManager.restart();
-  }
-  
-  /** Restart entire cluster.
-  */
-  public void restartCluster()
-    throws ManifoldCFException
-  {
-    intrinsicLinkManager.restartCluster();
-  }
-  
-  /** Record a references from a set of documents to the root.  These will be marked as "new" or "existing", and
-  * will have a null linktype.
-  */
-  public void recordSeedReferences(Long jobID, String[] legalLinkTypes, String[] targetDocumentIDHashes, int hopcountMethod, String processID)
-    throws ManifoldCFException
-  {
-    doRecord(jobID,legalLinkTypes,"",targetDocumentIDHashes,"",hopcountMethod,processID);
-  }
-
-  /** Finish seed references.  Seed references are special in that the only source is the root.
-  */
-  public void finishSeedReferences(Long jobID, String[] legalLinkTypes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    doFinish(jobID,legalLinkTypes,new String[]{""},hopcountMethod);
-  }
-
-  /** Record a reference from source to target.  This reference will be marked as "new" or "existing".
-  */
-  public boolean recordReference(Long jobID, String[] legalLinkTypes, String sourceDocumentIDHash, String targetDocumentIDHash, String linkType,
-    int hopcountMethod, String processID)
-    throws ManifoldCFException
-  {
-    return doRecord(jobID,legalLinkTypes,sourceDocumentIDHash,new String[]{targetDocumentIDHash},linkType,hopcountMethod,processID)[0];
-  }
-
-  /** Record a set of references from source to target.  This reference will be marked as "new" or "existing".
-  */
-  public boolean[] recordReferences(Long jobID, String[] legalLinkTypes, String sourceDocumentIDHash, String[] targetDocumentIDHashes, String linkType,
-    int hopcountMethod, String processID)
-    throws ManifoldCFException
-  {
-    return doRecord(jobID,legalLinkTypes,sourceDocumentIDHash,targetDocumentIDHashes,linkType,hopcountMethod,processID);
-  }
-
-  /** Complete a recalculation pass for a set of source documents.  All child links that are not marked as "new"
-  * or "existing" will be removed.  At the completion of this pass, the links will have their "new" flag cleared.
-  */
-  public void finishParents(Long jobID, String[] legalLinkTypes, String[] sourceDocumentHashes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    doFinish(jobID,legalLinkTypes,sourceDocumentHashes,hopcountMethod);
-  }
-
-  /** Revert newly-added links, because of a possibly incomplete document processing phase.
-  * All child links marked as "new" will be removed, and all links marked as "existing" will be
-  * reset to be "base".
-  */
-  public void revertParents(Long jobID, String[] sourceDocumentHashes)
-    throws ManifoldCFException
-  {
-    intrinsicLinkManager.revertLinks(jobID,sourceDocumentHashes);
-  }
-  
-  /** Do the work of recording source-target references. */
-  protected boolean[] doRecord(Long jobID, String[] legalLinkTypes, String sourceDocumentIDHash, String[] targetDocumentIDHashes, String linkType,
-    int hopcountMethod, String processID)
-    throws ManifoldCFException
-  {
-    // NOTE: In order for the revertParents() call above to be correct in its current form,
-    // this method would need to be revised to not process any additions until the finishParents() call
-    // is made.  At the moment, revertParents() is not used by any thread.
-    // TBD, MHL
-    boolean[] rval = new boolean[targetDocumentIDHashes.length];
-    for (int i = 0; i < rval.length; i++)
-    {
-      rval[i] = false;
-    }
-    
-    String[] newReferences = intrinsicLinkManager.recordReferences(jobID,sourceDocumentIDHash,targetDocumentIDHashes,linkType,processID);
-    if (newReferences.length > 0)
-    {
-      // There are added links.
-        
-
-      // The add causes hopcount records to be queued for processing (and created if they don't exist).
-      // ALL the hopcount records for the target document ids must be queued, for all the link types
-      // there are for this job.  Other times, the queuing requirement is less stringent, such as
-      // when a hopcount for one linktype changes.  In those cases we only want to queue up hopcount
-      // records corresponding to the changed record.
-
-      // What we need to do is create a queue which contains only the target hopcount table rows, if they
-      // exist.  Then we run the update algorithm until the cache is empty.
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Queueing "+Integer.toString(targetDocumentIDHashes.length)+" documents");
-
-      // Since we really want efficiency, we can write the answer in place now, based on the current
-      // hopcount rows.  This works even if the current row is out of date, because if we change the
-      // current row's value, the target rows will be requeued at that point.
-
-      // When we record new links, we must come up with an initial calculation or requeue ALL legal link
-      // types.  If this isn't done, then we cannot guarantee that the target record will exist - and
-      // somebody will then interpret the distance as being 'infinity'.
-      //
-      // It would be possible to change this but we would then also need to change how a missing record
-      // would be interpreted.
-
-      //if (!(linkType == null || linkType.length() == 0))
-      //      legalLinkTypes = new String[]{linkType};
-
-      // So, let's load what we have for hopcount and dependencies for sourceDocumentID.
-
-      Answer[] estimates = new Answer[legalLinkTypes.length];
-
-      if (sourceDocumentIDHash == null || sourceDocumentIDHash.length() == 0)
-      {
-        for (int i = 0; i < estimates.length; i++)
-        {
-          estimates[i] = new Answer(0);
-        }
-      }
-      else
-      {
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-          
-        sb.append(idField).append(",")
-          .append(distanceField).append(",")
-          .append(linkTypeField)
-          .append(" FROM ").append(getTableName()).append(" WHERE ");
-          
-        sb.append(buildConjunctionClause(list,new ClauseDescription[]{
-          new UnitaryClause(jobIDField,jobID),
-          new UnitaryClause(parentIDHashField,sourceDocumentIDHash),
-          new MultiClause(linkTypeField,legalLinkTypes)}));
-
-        IResultSet set = performQuery(sb.toString(),list,null,null);
-        Map<String,Answer> answerMap = new HashMap<String,Answer>();
-        for (int i = 0; i < estimates.length; i++)
-        {
-          estimates[i] = new Answer(ANSWER_INFINITY);
-          answerMap.put(legalLinkTypes[i],estimates[i]);
-        }
-
-        for (int i = 0; i < set.getRowCount(); i++)
-        {
-          IResultRow row = set.getRow(i);
-          Long id = (Long)row.getValue(idField);
-          DeleteDependency[] dds;
-          if (hopcountMethod != IJobDescription.HOPCOUNT_NEVERDELETE)
-            dds = deleteDepsManager.getDeleteDependencies(id);
-          else
-            dds = new DeleteDependency[0];
-          Long distance = (Long)row.getValue(distanceField);
-          String recordedLinkType = (String)row.getValue(linkTypeField);
-          Answer a = answerMap.get(recordedLinkType);
-          int recordedDistance = (int)distance.longValue();
-          if (recordedDistance != -1)
-          {
-            a.setAnswer(recordedDistance,dds);
-          }
-        }
-      }
-
-      // Now add these documents to the processing queue
-      boolean[] hasChanged = addToProcessingQueue(jobID,legalLinkTypes,newReferences,estimates,sourceDocumentIDHash,linkType,hopcountMethod);
-
-      // First, note them in return value
-      Map<String,Boolean> changeMap = new HashMap<String,Boolean>();
-      for (int i = 0; i < newReferences.length; i++)
-      {
-        changeMap.put(newReferences[i],new Boolean(hasChanged[i]));
-      }
-      for (int i = 0; i < rval.length; i++)
-      {
-        Boolean x = changeMap.get(targetDocumentIDHashes[i]);
-        if (x != null && x.booleanValue())
-          rval[i] = true;
-      }
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Done queueing "+Integer.toString(targetDocumentIDHashes.length)+" documents");
-    }
-    return rval;
-  }
-
-  /** Remove a set of document identifiers specified as a criteria.  This will remove hopcount rows and
-  * also intrinsic links that have the specified document identifiers as sources.
-  */
-  public void deleteMatchingDocuments(Long jobID, String[] legalLinkTypes,
-    String joinTableName,
-    String joinTableIDColumn, String joinTableJobColumn,
-    String joinTableCriteria, ArrayList joinTableParams,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    // This should work similarly to deleteDocumentIdentifiers() except that the identifiers
-    // come from a subquery rather than a list.
-    // This also removes the links themselves...
-    if (hopcountMethod == IJobDescription.HOPCOUNT_ACCURATE)
-    {
-      doDeleteDocuments(jobID,joinTableName,
-        joinTableIDColumn,joinTableJobColumn,
-        joinTableCriteria,joinTableParams);
-    }
-  }
-
-
-  /** Remove a set of document identifier hashes.  This will also remove the intrinsic links that have these document
-  * identifier hashes as sources, as well as invalidating cached hop counts that depend on them.
-  */
-  public void deleteDocumentIdentifiers(Long jobID, String[] legalLinkTypes, String[] documentHashes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    // What I want to do here is to first perform the invalidation of the cached hopcounts.
-    //
-    // UPDATE hopcount SET markfordeath='X' WHERE EXISTS(SELECT 'x' FROM hopdeletedeps t0 WHERE t0.ownerid=hopcount.id AND t0.jobid=<jobid>
-    //      AND EXISTS(SELECT 'x' FROM intrinsiclinks t1 WHERE t1.linktype=t0.linktype AND t1.parentid=t0.parentid
-    //              AND t1.childid=t0.childid AND t1.jobid=<jobid> AND t1.childid IN(<sourcedocs>)))
-    //
-    // ... and then, re-evaluate all hopcount records and their dependencies that are marked for delete.
-    //
-
-
-    // This also removes the links themselves...
-    if (hopcountMethod == IJobDescription.HOPCOUNT_ACCURATE)
-      doDeleteDocuments(jobID,documentHashes);
-
-  }
-
-  /** Calculate a bunch of hop-counts.  The values returned are only guaranteed to be an upper bound, unless
-  * the queue has recently been processed (via processQueue below).  -1 will be returned to indicate "infinity".
-  */
-  public int[] findHopCounts(Long jobID, String[] parentIdentifierHashes, String linkType)
-    throws ManifoldCFException
-  {
-    // No transaction, since we can happily interpret whatever comes back.
-    ArrayList list = new ArrayList();
-
-    int[] rval = new int[parentIdentifierHashes.length];
-    HashMap rvalMap = new HashMap();
-    int i = 0;
-    while (i < rval.length)
-    {
-      rval[i] = -1;
-      rvalMap.put(parentIdentifierHashes[i],new Integer(i));
-      i++;
-    }
-
-    int maxClause = maxClauseProcessFind(jobID,linkType);
-    i = 0;
-    int k = 0;
-    while (i < parentIdentifierHashes.length)
-    {
-      if (k == maxClause)
-      {
-        processFind(rval,rvalMap,jobID,linkType,list);
-        k = 0;
-        list.clear();
-      }
-      list.add(parentIdentifierHashes[i]);
-      k++;
-      i++;
-    }
-    if (k > 0)
-      processFind(rval,rvalMap,jobID,linkType,list);
-
-    return rval;
-  }
-
-  /** Find max clause count.
-  */
-  protected int maxClauseProcessFind(Long jobID, String linkType)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(linkTypeField,linkType)});
-  }
-  
-  /** Process a portion of a find request for hopcount information.
-  */
-  protected void processFind(int[] rval, Map rvalMap, Long jobID, String linkType, ArrayList list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list),
-      new UnitaryClause(linkTypeField,linkType)});
-      
-    IResultSet set = performQuery("SELECT "+distanceField+","+parentIDHashField+" FROM "+getTableName()+" WHERE "+query,newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String parentIDHash = (String)row.getValue(parentIDHashField);
-      Long distance = (Long)row.getValue(distanceField);
-      rval[((Integer)rvalMap.get(parentIDHash)).intValue()] = (int)distance.longValue();
-    }
-  }
-
-  /** Process a stage of the propagation queue for a job.
-  *@param jobID is the job we need to have the hopcount propagated for.
-  *@return true if the queue is empty.
-  */
-  public boolean processQueue(Long jobID, String[] legalLinkTypes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    // We can't instantiate the DocumentHash object here, because it will wind up having
-    // cached in it the answers from the previous round of calculation.  That round had
-    // a different set of marked nodes than the current round.
-
-    ArrayList list = new ArrayList();
-
-    // Pick off up to n queue items at a time.  We don't want to pick off too many (because
-    // then we wind up delaying other threads too much), nor do we want to do one at a time
-    // (because that is inefficient against the database), so I picked 200 as being 200+x faster
-    // than 1...
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(markForDeathField,markToString(MARK_QUEUED))});
-      
-    IResultSet set = performQuery("SELECT "+linkTypeField+","+parentIDHashField+" FROM "+
-      getTableName()+" WHERE "+query+" "+constructOffsetLimitClause(0,200)+" FOR UPDATE",list,null,null,200);
-
-    // No more entries == we are done
-    if (set.getRowCount() == 0)
-      return true;
-
-    DocumentHash dh = new DocumentHash(jobID,legalLinkTypes,hopcountMethod);
-
-    Question[] questions = new Question[set.getRowCount()];
-
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      String parentIdentifierHash = (String)row.getValue(parentIDHashField);
-      String linkType = (String)row.getValue(linkTypeField);
-
-      // All documents in the set have the same basic assumptions; another set may be queued
-      // as a side effect of some of these getting resolved, but treating them in chunks
-      // seems like it should not cause problems (because the same underlying assumptions
-      // underlie the whole chunk).  The side effects *may* cause other documents that are
-      // still in the queue to be evaluated as well, in which case they will disappear from
-      // the queue and not be processed further.
-
-      // Create a document hash object.
-      questions[i] = new Question(parentIdentifierHash,linkType);
-      i++;
-    }
-
-    // We don't care what the response is; we just want the documents to leave the queue.
-    dh.askQuestions(questions);
-    return false;
-  }
-
-  /** Calculate max clauses */
-  protected int maxClausePerformFindMissingRecords(Long jobID, String[] affectedLinkTypes)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(linkTypeField,affectedLinkTypes)});
-  }
-  
-  /** Limited find for missing records.
-  */
-  protected void performFindMissingRecords(Long jobID, String[] affectedLinkTypes, ArrayList list, Map<Question,Long> matchMap)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list),
-      new MultiClause(linkTypeField,affectedLinkTypes)});
-      
-    // The naive query is this - but postgres does not find the index this way:
-    //IResultSet set = performQuery("SELECT "+parentIDField+","+linkTypeField+" FROM "+getTableName()+" WHERE "+
-    //      parentIDField+" IN("+query+") AND "+jobIDField+"=?",list,null,null);
-    IResultSet set = performQuery("SELECT "+parentIDHashField+","+linkTypeField+","+distanceField+" FROM "+getTableName()+" WHERE "+query,newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String docIDHash = (String)row.getValue(parentIDHashField);
-      String linkType = (String)row.getValue(linkTypeField);
-      Long distance = (Long)row.getValue(distanceField);
-      Question q = new Question(docIDHash,linkType);
-      matchMap.put(q,distance);
-    }
-  }
-
-
-  /** Add documents to the processing queue.  For the supplied bunch of link types and document ids,
-  * the corresponding hopcount records will be marked as being queued.  If, for example, the affected link types
-  * are 'link' and 'redirect', and the specified document id's are 'A' and 'B' and 'C', then six hopcount
-  * rows will be created and/or queued.
-  * The values that this code uses for initial distance or delete dependencies for each of the hopcount
-  * rows combinatorially described above are calculated by this method by starting with the passed-in hopcount values
-  * and dependencies for each of the affectedLinkTypes for the specified "source" document.  The result estimates are then
-  * generated by passing these values and dependencies over the links to the target document identifiers, presuming that
-  * the link is of the supplied link type.
-  *
-  *@param jobID is the job the documents belong to.
-  *@param affectedLinkTypes are the set of affected link types.
-  *@param documentIDHashes are the documents to add.
-  *@param startingAnswers are the hopcounts for the documents as they are currently known.
-  *@param sourceDocumentIDHash is the source document identifier for the links from source to target documents.
-  *@param linkType is the link type for this queue addition.
-  *@param hopcountMethod is the desired method of managing hopcounts.
-  *@return a boolean array which is the subset of documentIDHashes whose distances may have changed.
-  */
-  protected boolean[] addToProcessingQueue(Long jobID, String[] affectedLinkTypes, String[] documentIDHashes,
-    Answer[] startingAnswers, String sourceDocumentIDHash, String linkType, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    // If we're given the source hopcount distances, we should write the derived target values into the NEW
-    // hopcount records we create, because it will save much database access in the long run, and handles the
-    // typical case in an inexpensive way.  These records do not even need to be queued - since we are creating
-    // them, we know there are no other paths to them yet (or paths that depend upon them).  So we can write in
-    // 'final' values, which will need to be updated only if the source hopcount row's distance is lowered (and
-    // then, the targets will all be requeued anyhow).
-    //
-    // For EXISTING hopcount rows, I've opted to not consider the passed-in distance estimates.  Even if I should
-    // detect that the hopcount has improved, there would still be the requirement of requeuing all the target's
-    // targets.  This kind of propagation is probably best handled by the normal queue processing code, which does
-    // as much in bulk as is possible.  So, for existing target hopcount rows, they simply get queued.
-
-    if (Logging.hopcount.isDebugEnabled())
-    {
-      Logging.hopcount.debug("Adding "+Integer.toString(documentIDHashes.length)+" documents to processing queue");
-      for (int z = 0; z < documentIDHashes.length; z++)
-      {
-        Logging.hopcount.debug("  Adding '"+documentIDHashes[z]+"' to processing queue");
-      }
-      Logging.hopcount.debug("The source id is '"+sourceDocumentIDHash+"' and linktype is '"+linkType+"', and there are "+
-        Integer.toString(affectedLinkTypes.length)+" affected link types, as below:");
-      for (int z = 0; z < affectedLinkTypes.length; z++)
-      {
-        Logging.hopcount.debug("  Linktype '"+affectedLinkTypes[z]+"', current distance "+Integer.toString(startingAnswers[z].getAnswer())+" with "+
-          Integer.toString(startingAnswers[z].countDeleteDependencies())+" delete dependencies.");
-      }
-    }
-
-
-    // If hopcount records for the targets for the links don't yet exist, we had better create them,
-    // so we can make sure they are added to the queue properly.
-
-    // Make a map of the combinations of link type and document id we want to have present
-    Map<Question,Long> matchMap = new HashMap();
-
-    // Make a map from the link type to the corresponding Answer object
-    Map<String,Answer> answerMap = new HashMap<String,Answer>();
-    for (int u = 0; u < affectedLinkTypes.length; u++)
-    {
-      answerMap.put(affectedLinkTypes[u],startingAnswers[u]);
-    }
-
-    boolean[] rval = new boolean[documentIDHashes.length];
-    for (int i = 0; i < rval.length; i++)
-    {
-      rval[i] = false;
-    }
-
-    // I don't think we have to throw a table lock here, because even though we base decisions for insertion on the lack of existence
-    // of a record, there can be only one thread in here at a time.
-
-    int maxClause = maxClausePerformFindMissingRecords(jobID,affectedLinkTypes);
-    ArrayList list = new ArrayList();
-      
-    int k = 0;
-    for (int i = 0; i < documentIDHashes.length; i++)
-    {
-      String documentIDHash = documentIDHashes[i];
-        
-      if (k == maxClause)
-      {
-        performFindMissingRecords(jobID,affectedLinkTypes,list,matchMap);
-        k = 0;
-        list.clear();
-      }
-        
-      list.add(documentIDHash);
-      k++;
-    }
-    if (k > 0)
-      performFindMissingRecords(jobID,affectedLinkTypes,list,matchMap);
-
-    // Repeat our pass through the documents and legal link types.  For each document/legal link type,
-    // see if there was an existing row.  If not, we create a row.  If so, we compare the recorded
-    // distance against the distance estimate we would have given it.  If the new distance is LOWER, it gets left around
-    // for queuing.
-
-    HashMap map = new HashMap();
-    for (int i = 0; i < documentIDHashes.length; i++)
-    {
-      String documentIDHash = documentIDHashes[i];
-      for (int j = 0; j < affectedLinkTypes.length; j++)
-      {
-        String affectedLinkType = affectedLinkTypes[j];
-        Question q = new Question(documentIDHash,affectedLinkType);
-
-        // Calculate what our new answer would be.
-        Answer startingAnswer = (Answer)answerMap.get(affectedLinkType);
-        int newAnswerValue = startingAnswer.getAnswer();
-        if (newAnswerValue >= 0 && affectedLinkType.equals(linkType))
-          newAnswerValue++;
-
-        // Now, see if there's a distance already present.
-        Long currentDistance = (Long)matchMap.get(q);
-        if (currentDistance == null)
-        {
-          // Prepare to do an insert.
-          // The dependencies are the old dependencies, plus the one we are about to add.
-          DeleteDependency dd = new DeleteDependency(linkType,documentIDHash,sourceDocumentIDHash);
-          // Build a new answer, based on the starting answer and the kind of link this is.
-          map.clear();
-          Long hopCountID = new Long(IDFactory.make(threadContext));
-          map.put(idField,hopCountID);
-          map.put(parentIDHashField,q.getDocumentIdentifierHash());
-          map.put(linkTypeField,q.getLinkType());
-          if (newAnswerValue == ANSWER_INFINITY)
-            map.put(distanceField,new Long(-1L));
-          else
-            map.put(distanceField,new Long((long)newAnswerValue));
-          map.put(jobIDField,jobID);
-          map.put(markForDeathField,markToString(MARK_NORMAL));
-          if (Logging.hopcount.isDebugEnabled())
-            Logging.hopcount.debug("Inserting new record for '"+documentIDHash+"' linktype '"+affectedLinkType+"' distance "+Integer.toString(newAnswerValue)+" for job "+jobID);
-          performInsert(map,null);
-          noteModifications(1,0,0);
-          if (hopcountMethod != IJobDescription.HOPCOUNT_NEVERDELETE)
-          {
-            deleteDepsManager.writeDependency(hopCountID,jobID,dd);
-            Iterator iter2 = startingAnswer.getDeleteDependencies();
-            while (iter2.hasNext())
-            {
-              dd = (DeleteDependency)iter2.next();
-              deleteDepsManager.writeDependency(hopCountID,jobID,dd);
-            }
-          }
-        }
-        else
-        {
-          // If the new distance >= saved distance, don't queue anything.  That means, remove it from the hash.
-          int oldAnswerValue = (int)currentDistance.longValue();
-          if (!(newAnswerValue >= 0 && (oldAnswerValue < 0 || newAnswerValue < oldAnswerValue)))
-          {
-            // New answer is no better than the old answer, so don't queue
-            if (Logging.hopcount.isDebugEnabled())
-              Logging.hopcount.debug("Existing record for '"+documentIDHash+"' linktype '"+affectedLinkType+"' has better distance "+Integer.toString(oldAnswerValue)+
-              " than new distance "+Integer.toString(newAnswerValue)+", so not queuing for job "+jobID);
-            matchMap.remove(q);
-          }
-          else
-            rval[i] = true;
-        }
-      }
-    }
-
-    // For all the records still in the matchmap, queue them.
-
-    // The query I want to run is:
-    // UPDATE hopcount SET markfordeath='Q' WHERE jobID=? AND parentid IN (...)
-    // but postgresql is stupid and won't use the index that way.  So do this instead:
-    // UPDATE hopcount SET markfordeath='Q' WHERE (jobID=? AND parentid=?) OR (jobid=? AND parentid=?)...
-
-    maxClause = getMaxOrClause();
-    StringBuilder sb = new StringBuilder();
-    list = new ArrayList();
-    k = 0;
-    for (int i = 0; i < documentIDHashes.length; i++)
-    {
-      String documentIDHash = documentIDHashes[i];
-      for (int j = 0; j < affectedLinkTypes.length; j++)
-      {
-        String affectedLinkType = affectedLinkTypes[j];
-
-        Question q = new Question(documentIDHash,affectedLinkType);
-        if (matchMap.get(q) != null)
-        {
-          if (k == maxClause)
-          {
-            performMarkAddDeps(sb.toString(),list);
-            k = 0;
-            sb.setLength(0);
-            list.clear();
-          }
-          if (k > 0)
-            sb.append(" OR ");
-
-          // We only want to queue up hopcount records that correspond to the affected link types.
-          //
-          // Also, to reduce deadlock, do not update any records that are already marked as queued.  These would be infrequent,
-          // but they nevertheless seem to cause deadlock very easily.
-          //
-          if (Logging.hopcount.isDebugEnabled())
-            Logging.hopcount.debug("Queuing '"+documentIDHash+"' linktype '"+affectedLinkType+"' for job "+jobID);
-            
-          sb.append(buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobIDField,jobID),
-            new MultiClause(markForDeathField,new Object[]{
-              markToString(MARK_NORMAL),
-              markToString(MARK_DELETING)}),
-            new UnitaryClause(parentIDHashField,documentIDHash),
-            new UnitaryClause(linkTypeField,affectedLinkType)}));
-              
-          k++;
-        }
-      }
-    }
-    if (k > 0)
-      performMarkAddDeps(sb.toString(),list);
-
-    // Leave the dependency records for the queued rows.  This will save lots of work if we decide not to
-    // update the distance.  It's safe to leave the old dep records, because they must only record links that furnish
-    // A minimal path, not THE minimal path.
-
-    noteModifications(0,documentIDHashes.length,0);
-    return rval;
-  }
-
-  /** Do the work of marking add-dep-dependent links in the hopcount table. */
-  protected void performMarkAddDeps(String query, ArrayList list)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(markForDeathField,markToString(MARK_QUEUED));
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-
-  /** Method that does the work of "finishing" a set of child references. */
-  protected void doFinish(Long jobID, String[] legalLinkTypes, String[] sourceDocumentHashes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    if (hopcountMethod == IJobDescription.HOPCOUNT_ACCURATE)
-    {
-      // First, blow the cache.
-      //
-      // To do this, I'd the following queries to occur:
-      //
-      // UPDATE hopcount SET markfordeath='Q' WHERE EXISTS(SELECT 'x' FROM hopdeletedeps t0 WHERE t0.ownerid=hopcount.id AND t0.jobid=<jobid>
-      //      AND EXISTS(SELECT 'x' FROM intrinsiclinks t1 WHERE t1.linktype=t0.linktype AND t1.parentid=t0.parentid
-      //              AND t1.childid=t0.childid AND t1.jobid=<jobid> AND t1.isnew=<base> AND t1.childid IN(<sourcedocs>)))
-      //
-      // ... and then, get rid of all hopcount records and their dependencies that are marked for delete.
-
-
-      // Invalidate all links with the given source documents that match the common expression
-      doDeleteInvalidation(jobID,sourceDocumentHashes);
-    }
-    // Make all new and existing links become just "base" again.
-    intrinsicLinkManager.restoreLinks(jobID,sourceDocumentHashes);
-  }
-
-  /** Invalidate links that start with a specific set of documents, described by
-  * a table join.
-  */
-  protected void doDeleteDocuments(Long jobID,
-    String joinTableName,
-    String joinTableIDColumn, String joinTableJobColumn,
-    String joinTableCriteria, ArrayList joinTableParams)
-    throws ManifoldCFException
-  {
-    if (Logging.hopcount.isDebugEnabled())
-    {
-      Logging.hopcount.debug("Marking for delete for job "+jobID+" all hopcount document references"+
-        " from table "+joinTableName+" matching "+joinTableCriteria);
-    }
-    
-    // For this query, postgresql seems to not do the right thing unless the subclause is a three-way join:
-    //
-    // UPDATE hopcount SET x=y WHERE id IN(SELECT t0.ownerid FROM hopdeletedeps t0,jobqueue t99,intrinsiclink t1 WHERE
-    //      t0.jobid=? and t99.jobid=? and t1.jobid=? and
-    //      t0.childidhash=t99.dochash and t0.childid=t99.docid and t99.status='P' and
-    //      t0.parentidhash=t1.parentidhash and t0.childidhash=t1.childidhash and t0.linktype=t1.linktype and
-    //      t0.parentid=t1.parentid and t0.childid=t1.childid)
-        
-    // MHL to figure out the "correct" way to state this for all databases
-
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList list = new ArrayList();
-        
-    sb.append(idField).append(" IN(SELECT t0.").append(deleteDepsManager.ownerIDField).append(" FROM ")
-      .append(deleteDepsManager.getTableName()).append(" t0,").append(joinTableName).append(",")
-      .append(intrinsicLinkManager.getTableName()).append(" t1 WHERE ");
-
-    sb.append(buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause("t0."+deleteDepsManager.jobIDField,jobID)})).append(" AND ");
-
-    sb.append(buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause("t1."+intrinsicLinkManager.jobIDField,jobID),
-      new JoinClause("t1."+intrinsicLinkManager.parentIDHashField,"t0."+deleteDepsManager.parentIDHashField),
-      new JoinClause("t1."+intrinsicLinkManager.linkTypeField,"t0."+deleteDepsManager.linkTypeField),
-      new JoinClause("t1."+intrinsicLinkManager.childIDHashField,"t0."+deleteDepsManager.childIDHashField)})).append(" AND ");
-
-    sb.append(buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(joinTableJobColumn,jobID),
-      new JoinClause(joinTableIDColumn,"t0."+deleteDepsManager.childIDHashField)})).append(" AND ");
-          
-    sb.append(joinTableCriteria);
-    list.addAll(joinTableParams);
-
-    sb.append(")");
-
-    HashMap map = new HashMap();
-    // These are whacked back to "infinity" to avoid infinite looping in a cut-off graph.
-    map.put(distanceField,new Long(-1L));
-    map.put(markForDeathField,markToString(MARK_DELETING));
-    performUpdate(map,sb.toString(),list,null);
-    noteModifications(0,1,0);
-      
-    // We do NOT do the parentID because otherwise we have the potential to delete links that we need later.  See CONNECTORS-501.
-
-    if (Logging.hopcount.isDebugEnabled())
-      Logging.hopcount.debug("Done setting hopcount rows for job "+jobID+" to initial distances");
-
-    // Remove the intrinsic links that we said we would - BEFORE we evaluate the queue.
-    intrinsicLinkManager.removeDocumentLinks(jobID,
-      joinTableName,
-      joinTableIDColumn,joinTableJobColumn,
-      joinTableCriteria,joinTableParams);
-
-    // Remove the delete dependencies of the nodes marked as being queued, with distance infinity.
-    ArrayList queryList = new ArrayList();
-    String query = buildConjunctionClause(queryList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(markForDeathField,markToString(MARK_DELETING))});
-    deleteDepsManager.removeMarkedRows(getTableName(),idField,query,queryList);
-
-    // Set the hopcount rows back to just "queued".
-    HashMap newMap = new HashMap();
-    newMap.put(markForDeathField,markToString(MARK_QUEUED));
-    performUpdate(newMap,"WHERE "+query,queryList,null);
-
-    // At this point, we have a queue that contains all the hopcount entries that our dependencies told us
-    // needed to change as a result of the deletions.  Evaluating the queue will clean up hopcount entries
-    // and dependencies that are just going away, as well as updating those that are still around but
-    // will have new hopcount values.
-
-    if (Logging.hopcount.isDebugEnabled())
-      Logging.hopcount.debug("Done queueing for deletion for "+jobID);
-
-  }
-  
-  /** Invalidate links that start with a specific set of documents.
-  */
-  protected void doDeleteDocuments(Long jobID,
-    String[] documentHashes)
-    throws ManifoldCFException
-  {
-    // Clear up hopcount table
-    if (documentHashes.length > 0)
-    {
-      if (Logging.hopcount.isDebugEnabled())
-      {
-        Logging.hopcount.debug("Marking for delete for job "+jobID+" all hopcount document references"+
-          " from:");
-        for (int k = 0; k < documentHashes.length; k++)
-        {
-          Logging.hopcount.debug("  "+documentHashes[k]);
-        }
-      }
-
-      // The query form I found that seems to work ok with postgresql looks like this:
-      //
-      // UPDATE hopcount SET x=y WHERE id IN (SELECT ownerid FROM hopdeletedeps t0
-      //   WHERE ((t0.jobid=? AND t0.childid=?)
-      //       OR (t0.jobid=? AND t0.childid=?)
-      //       ...
-      //       OR (t0.jobid=? AND t0.childid=?))
-      //       AND EXISTS(SELECT 'x' FROM intrinsiclink t1 WHERE t1.linktype=t0.linktype
-      //              AND t1.parentid=t0.parentid AND t1.childid=t0.childid AND t1.jobid=t0.jobid AND t1.isnew='B'))
-      //
-      // Here's a revised form that would take advantage of postgres's better ability to work with joins, if this should
-      // turn out to be necessary:
-      //
-      // UPDATE hopcount SET x=y WHERE id IN (SELECT t0.ownerid FROM hopdeletedeps t0, intrinsiclink t1
-      //      WHERE t1.childidhash=t0.childidhash AND t1.jobid=? AND t1.linktype=t0.linktype AND t1.parentid=t0.parentid AND t1.childid=t0.childid AND t1.isnew='B'
-      //      AND ((t0.jobid=? AND t0.childidhash=? AND t0.childid=?)
-      //       OR (t0.jobid=? AND t0.childidhash=? AND t0.childid=?)
-      //       ...
-      //       OR (t0.jobid=? AND t0.childidhash=? AND t0.childid=?))
-
-      int maxClause = maxClauseMarkForDocumentDelete(jobID);
-      ArrayList list = new ArrayList();
-      int i = 0;
-      int k = 0;
-      while (i < documentHashes.length)
-      {
-        if (k == maxClause)
-        {
-          markForDocumentDelete(jobID,list);
-          list.clear();
-          k = 0;
-        }
-        list.add(documentHashes[i]);
-        i++;
-        k++;
-      }
-      if (k > 0)
-        markForDocumentDelete(jobID,list);
-      noteModifications(0,documentHashes.length,0);
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Done setting hopcount rows for job "+jobID+" to initial distances");
-
-      // Remove the intrinsic links that we said we would - BEFORE we evaluate the queue.
-      intrinsicLinkManager.removeDocumentLinks(jobID,
-        documentHashes);
-
-      // Remove the delete dependencies of the nodes marked as being queued, with distance infinity.
-      ArrayList queryList = new ArrayList();
-      String query = buildConjunctionClause(queryList,new ClauseDescription[]{
-        new UnitaryClause(jobIDField,jobID),
-        new UnitaryClause(markForDeathField,markToString(MARK_DELETING))});
-      deleteDepsManager.removeMarkedRows(getTableName(),idField,query,queryList);
-
-      // Set the hopcount rows back to just "queued".
-      HashMap newMap = new HashMap();
-      newMap.put(markForDeathField,markToString(MARK_QUEUED));
-      performUpdate(newMap,"WHERE "+query,queryList,null);
-
-      // At this point, we have a queue that contains all the hopcount entries that our dependencies told us
-      // needed to change as a result of the deletions.  Evaluating the queue will clean up hopcount entries
-      // and dependencies that are just going away, as well as updating those that are still around but
-      // will have new hopcount values.
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Done queueing for deletion for "+jobID);
-
-    }
-  }
-  
-  protected int maxClauseMarkForDocumentDelete(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause("t0."+deleteDepsManager.jobIDField,jobID)});
-  }
-
-  protected void markForDocumentDelete(Long jobID, ArrayList list)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList thisList = new ArrayList();
-
-    sb.append(idField).append(" IN(SELECT ").append(deleteDepsManager.ownerIDField).append(" FROM ").append(deleteDepsManager.getTableName()).append(" t0 WHERE ")
-      .append(buildConjunctionClause(thisList,new ClauseDescription[]{
-        new UnitaryClause("t0."+deleteDepsManager.jobIDField,jobID),
-        new MultiClause("t0."+deleteDepsManager.childIDHashField,list)})).append(" AND ");
-        
-    sb.append("EXISTS(SELECT 'x' FROM ").append(intrinsicLinkManager.getTableName()).append(" t1 WHERE ")
-      .append(buildConjunctionClause(thisList,new ClauseDescription[]{
-        new JoinClause("t1."+intrinsicLinkManager.jobIDField,"t0."+deleteDepsManager.jobIDField),
-        new JoinClause("t1."+intrinsicLinkManager.linkTypeField,"t0."+deleteDepsManager.linkTypeField),
-        new JoinClause("t1."+intrinsicLinkManager.parentIDHashField,"t0."+deleteDepsManager.parentIDHashField),
-        new JoinClause("t1."+intrinsicLinkManager.childIDHashField,"t0."+deleteDepsManager.childIDHashField)}));
-    
-    sb.append("))");
-
-    HashMap map = new HashMap();
-    // These are whacked back to "infinity" to avoid infinite looping in a cut-off graph.
-    map.put(distanceField,new Long(-1L));
-    map.put(markForDeathField,markToString(MARK_DELETING));
-    performUpdate(map,sb.toString(),thisList,null);
-
-    // We do NOT do the parentID because we need to leave intrinsic links around that could be used again.
-    // See CONNECTORS-501.
-  }
-
-  /** Invalidate links meeting a simple criteria which have a given set of source documents.  This also runs a queue
-  * which is initialized with all the documents that have sources that exist in the hopcount table.  The purpose
-  * of that queue is to re-establish non-infinite values for all nodes that are described in IntrinsicLinks, that are
-  * still connected to the root. */
-  protected void doDeleteInvalidation(Long jobID,
-    String[] sourceDocumentHashes)
-    throws ManifoldCFException
-  {
-    ArrayList commonNewList = new ArrayList();
-    commonNewList.add(intrinsicLinkManager.statusToString(intrinsicLinkManager.LINKSTATUS_BASE));
-    String commonNewExpression = intrinsicLinkManager.newField+"=?";
-
-    // Clear up hopcount table
-    if (sourceDocumentHashes.length > 0)
-    {
-      if (Logging.hopcount.isDebugEnabled())
-      {
-        Logging.hopcount.debug("Marking for delete for job "+jobID+" all target document references matching '"+commonNewExpression+"'"+
-          " from:");
-        for (int k = 0; k < sourceDocumentHashes.length; k++)
-        {
-          Logging.hopcount.debug("  "+sourceDocumentHashes[k]);
-        }
-      }
-
-      // The query form I found that seems to work ok with postgresql looks like this:
-      //
-      // UPDATE hopcount SET x=y WHERE id IN (SELECT ownerid FROM hopdeletedeps t0
-      //   WHERE ((t0.jobid=? AND t0.childid=?)
-      //       OR (t0.jobid=? AND t0.childid=?)
-      //       ...
-      //       OR (t0.jobid=? AND t0.childid=?))
-      //       AND EXISTS(SELECT 'x' FROM intrinsiclink t1 WHERE t1.linktype=t0.linktype
-      //              AND t1.parentid=t0.parentid AND t1.childid=t0.childid AND t1.jobid=t0.jobid AND t1.isnew='B'))
-      //
-      // Here's a revised form that would take advantage of postgres's better ability to work with joins, if this should
-      // turn out to be necessary:
-      //
-      // UPDATE hopcount SET x=y WHERE id IN (SELECT t0.ownerid FROM hopdeletedeps t0, intrinsiclink t1
-      //      WHERE t1.childidhash=t0.childidhash AND t1.jobid=? AND t1.linktype=t0.linktype AND t1.parentid=t0.parentid AND t1.childid=t0.childid AND t1.isnew='B'
-      //      AND ((t0.jobid=? AND t0.childidhash=? AND t0.childid=?)
-      //       OR (t0.jobid=? AND t0.childidhash=? AND t0.childid=?)
-      //       ...
-      //       OR (t0.jobid=? AND t0.childidhash=? AND t0.childid=?))
-
-      int maxClause = maxClauseMarkForDelete(jobID);
-      ArrayList list = new ArrayList();
-      int i = 0;
-      int k = 0;
-      while (i < sourceDocumentHashes.length)
-      {
-        if (k == maxClause)
-        {
-          markForDelete(jobID,list,commonNewExpression,commonNewList);
-          list.clear();
-          k = 0;
-        }
-        list.add(sourceDocumentHashes[i]);
-        i++;
-        k++;
-      }
-      if (k > 0)
-        markForDelete(jobID,list,commonNewExpression,commonNewList);
-      noteModifications(0,sourceDocumentHashes.length,0);
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Done setting hopcount rows for job "+jobID+" to initial distances");
-
-      // Remove the intrinsic links that we said we would - BEFORE we evaluate the queue.
-      intrinsicLinkManager.removeLinks(jobID,
-        commonNewExpression,commonNewList,
-        sourceDocumentHashes);
-
-      // Remove the delete dependencies of the nodes marked as being queued, with distance infinity.
-      ArrayList queryList = new ArrayList();
-      String query = buildConjunctionClause(queryList,new ClauseDescription[]{
-        new UnitaryClause(jobIDField,jobID),
-        new UnitaryClause(markForDeathField,markToString(MARK_DELETING))});
-      deleteDepsManager.removeMarkedRows(getTableName(),idField,query,queryList);
-
-      // Set the hopcount rows back to just "queued".
-      HashMap newMap = new HashMap();
-      newMap.put(markForDeathField,markToString(MARK_QUEUED));
-      performUpdate(newMap,"WHERE "+query,queryList,null);
-
-      // At this point, we have a queue that contains all the hopcount entries that our dependencies told us
-      // needed to change as a result of the deletions.  Evaluating the queue will clean up hopcount entries
-      // and dependencies that are just going away, as well as updating those that are still around but
-      // will have new hopcount values.
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Done queueing for deletion for "+jobID);
-
-    }
-
-  }
-  
-  protected int maxClauseMarkForDelete(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause("t0."+deleteDepsManager.jobIDField,jobID)});
-  }
-
-  protected void markForDelete(Long jobID, ArrayList list, String commonNewExpression, ArrayList commonNewList)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList thisList = new ArrayList();
-
-    sb.append(idField).append(" IN(SELECT ").append(deleteDepsManager.ownerIDField).append(" FROM ").append(deleteDepsManager.getTableName()).append(" t0 WHERE ")
-      .append(buildConjunctionClause(thisList,new ClauseDescription[]{
-        new UnitaryClause("t0."+deleteDepsManager.jobIDField,jobID),
-        new MultiClause("t0."+deleteDepsManager.childIDHashField,list)})).append(" AND ");
-        
-    sb.append("EXISTS(SELECT 'x' FROM ").append(intrinsicLinkManager.getTableName()).append(" t1 WHERE ")
-      .append(buildConjunctionClause(thisList,new ClauseDescription[]{
-        new JoinClause("t1."+intrinsicLinkManager.jobIDField,"t0."+deleteDepsManager.jobIDField),
-        new JoinClause("t1."+intrinsicLinkManager.linkTypeField,"t0."+deleteDepsManager.linkTypeField),
-        new JoinClause("t1."+intrinsicLinkManager.parentIDHashField,"t0."+deleteDepsManager.parentIDHashField),
-        new JoinClause("t1."+intrinsicLinkManager.childIDHashField,"t0."+deleteDepsManager.childIDHashField)}));
-        
-    if (commonNewExpression != null)
-    {
-      sb.append(" AND t1.").append(commonNewExpression);
-      thisList.addAll(commonNewList);
-    }
-    sb.append("))");
-
-    HashMap map = new HashMap();
-    // These are whacked back to "infinity" to avoid infinite looping in a cut-off graph.
-    map.put(distanceField,new Long(-1L));
-    map.put(markForDeathField,markToString(MARK_DELETING));
-    performUpdate(map,sb.toString(),thisList,null);
-  }
-
-  /** Get document's children.
-  *@return rows that contain the children.  Column names are 'linktype','childidentifier'.
-  */
-  protected IResultSet getDocumentChildren(Long jobID, String documentIDHash)
-    throws ManifoldCFException
-  {
-    return intrinsicLinkManager.getDocumentChildren(jobID,documentIDHash);
-  }
-
-  /** Find the cached distance from a set of identifiers to the root.
-  * This is tricky, because if there is a queue assessment going on, some values are not valid.
-  * In general, one would treat a missing record as meaning "infinity".  But if the missing record
-  * is simply invalidated at the moment, we want it to be treated as "missing".  So... we pick up
-  * the record despite it potentially being marked, and we then examine the mark to figure out
-  * what to do.
-  *@return the corresponding list of nodes, taking into account unknown distances.
-  */
-  protected DocumentNode[] readCachedNodes(Long jobID, Question[] unansweredQuestions)
-    throws ManifoldCFException
-  {
-    // We should not ever get requests that are duplications, or are not germane (e.g.
-    // for the root).
-
-    DocumentNode[] rval = new DocumentNode[unansweredQuestions.length];
-
-    // Set the node up as being "infinity" first; we'll change it around later
-    Answer a = new Answer(ANSWER_INFINITY);
-
-    Map indexMap = new HashMap();
-    int i = 0;
-    while (i < unansweredQuestions.length)
-    {
-      indexMap.put(unansweredQuestions[i],new Integer(i));
-      // If we wind up deleting a row in the hopcount table, because it's distance is infinity,
-      // we need to treat that here as loading a node with ANSWER_INFINITY as the value.  Right
-      // now, we load UNKNOWN in this case, which is wrong.
-      //
-      // The way in which this deletion occurs is that nodes get marked BEFORE the intrinsic link goes
-      // away (supposedly), and then the intrinsic link(s) are removed.  Plus, all possible nodes are not
-      // added in this case.  Therefore, we should expect questions pertaining to nodes that don't exist
-      // to work.
-
-      DocumentNode dn = new DocumentNode(unansweredQuestions[i]);
-      rval[i] = dn;
-
-      // Make the node "complete", since we found a legit value.
-      dn.setStartingAnswer(a);
-      dn.setTrialAnswer(a);
-      // Leave bestPossibleAnswer alone.  It's not used after node is marked complete.
-      dn.makeCompleteNoWrite();
-
-      i++;
-    }
-
-    // Accumulate the ids of rows where I need deps too.  This is keyed by id and has the right answer object as a value.
-    Map depsMap = new HashMap();
-
-    int maxClause = maxClausePerformGetCachedDistances(jobID);
-    ArrayList list = new ArrayList();
-    ArrayList ltList = new ArrayList();
-      
-    i = 0;
-    int k = 0;
-    while (i < unansweredQuestions.length)
-    {
-      if (k == maxClause)
-      {
-        performGetCachedDistances(rval,indexMap,depsMap,jobID,ltList,list);
-        k = 0;
-        list.clear();
-        ltList.clear();
-      }
-      Question q = unansweredQuestions[i++];
-      ltList.add(q.getLinkType());
-      list.add(q.getDocumentIdentifierHash());
-      k++;
-    }
-    if (k > 0)
-      performGetCachedDistances(rval,indexMap,depsMap,jobID,ltList,list);
-
-    // Now, find the required delete dependencies too.
-    maxClause = maxClausePerformGetCachedDistanceDeps();
-    list.clear();
-    k = 0;
-    Iterator iter = depsMap.keySet().iterator();
-    while (iter.hasNext())
-    {
-      Long id = (Long)iter.next();
-      if (k == maxClause)
-      {
-        performGetCachedDistanceDeps(depsMap,list);
-        k = 0;
-        list.clear();
-      }
-      list.add(id);
-      k++;
-    }
-    if (k > 0)
-      performGetCachedDistanceDeps(depsMap,list);
-
-    return rval;
-  }
-
-  protected int maxClausePerformGetCachedDistanceDeps()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-  
-  /** Do a limited fetch of cached distance dependencies */
-  protected void performGetCachedDistanceDeps(Map depsMap, ArrayList list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(deleteDepsManager.ownerIDField,list)});
-      
-    IResultSet set = performQuery("SELECT "+deleteDepsManager.ownerIDField+","+
-      deleteDepsManager.linkTypeField+","+
-      deleteDepsManager.parentIDHashField+","+
-      deleteDepsManager.childIDHashField+" FROM "+deleteDepsManager.getTableName()+
-      " WHERE "+query,newList,null,null);
-
-    // Each dependency needs to be filed by owner id, so let's populate a hash.  The
-    // hash will be keyed by owner id and contain an arraylist of deletedependency
-    // objects.
-
-    HashMap ownerHash = new HashMap();
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long ownerID = (Long)row.getValue(deleteDepsManager.ownerIDField);
-      String linkType = (String)row.getValue(deleteDepsManager.linkTypeField);
-      if (linkType == null)
-        linkType = "";
-      String parentIDHash = (String)row.getValue(deleteDepsManager.parentIDHashField);
-      String childIDHash = (String)row.getValue(deleteDepsManager.childIDHashField);
-      if (childIDHash == null)
-        childIDHash = "";
-      DeleteDependency dd = new DeleteDependency(linkType,parentIDHash,childIDHash);
-      ArrayList ddlist = (ArrayList)ownerHash.get(ownerID);
-      if (ddlist == null)
-      {
-        ddlist = new ArrayList();
-        ownerHash.put(ownerID,ddlist);
-      }
-      ddlist.add(dd);
-    }
-
-    // Now, for each owner, populate the dependencies in the answer
-    Iterator iter = ownerHash.keySet().iterator();
-    while (iter.hasNext())
-    {
-      Long owner = (Long)iter.next();
-      ArrayList ddlist = (ArrayList)ownerHash.get(owner);
-      if (ddlist != null)
-      {
-        DocumentNode dn = (DocumentNode)depsMap.get(owner);
-        DeleteDependency[] array = new DeleteDependency[ddlist.size()];
-        int j = 0;
-        while (j < array.length)
-        {
-          array[j] = (DeleteDependency)ddlist.get(j);
-          j++;
-        }
-        // In the DocumentNode's created earlier, the starting answer and trial answer refer
-        // to the same answer object, so fooling
-        // with it will set both values, just as we want.
-        Answer a = dn.getStartingAnswer();
-        dn.setStartingAnswer(new Answer(a.getAnswer(),array));
-        a = dn.getTrialAnswer();
-        dn.setTrialAnswer(new Answer(a.getAnswer(),array));
-      }
-    }
-  }
-
-  /** Calculate the max clauses.
-  */
-  protected int maxClausePerformGetCachedDistances(Long jobID)
-  {
-    // Always OR clauses, so it's maxORClause.
-    return getMaxOrClause();
-  }
-  
-  /** Do a limited fetch of cached distances */
-  protected void performGetCachedDistances(DocumentNode[] rval, Map indexMap, Map depsMap, Long jobID, ArrayList ltList, ArrayList list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    StringBuilder sb = new StringBuilder();
-    
-    for (int i = 0 ; i < list.size() ; i++)
-    {
-      if (i > 0)
-        sb.append(" OR ");
-      sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-        new UnitaryClause(jobIDField,jobID),
-        new UnitaryClause(parentIDHashField,list.get(i)),
-        new UnitaryClause(linkTypeField,ltList.get(i))}));
-    }
-    
-    String query = sb.toString();
-
-    IResultSet set = performQuery("SELECT "+idField+","+parentIDHashField+","+linkTypeField+","+distanceField+","+markForDeathField+
-      " FROM "+getTableName()+" WHERE "+query,newList,null,null);
-
-    // Go through results and create answers
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String parentIDHash = (String)row.getValue(parentIDHashField);
-      String linkType = (String)row.getValue(linkTypeField);
-      Question q = new Question(parentIDHash,linkType);
-
-      Long id = (Long)row.getValue(idField);
-      Long distance = (Long)row.getValue(distanceField);
-      int answerDistance;
-      if (distance.longValue() == -1L)
-        answerDistance = ANSWER_INFINITY;
-      else
-        answerDistance = (int)distance.longValue();
-
-      DocumentNode dn = rval[((Integer)indexMap.get(q)).intValue()];
-
-      // If the record is marked, don't use it's value; we'll look at it again on write.
-      // Get the mark.
-      int foundMark = stringToMark((String)row.getValue(markForDeathField));
-      if (foundMark != MARK_NORMAL)
-      {
-        if (foundMark == MARK_QUEUED)
-        {
-          // The record has been disabled because it's on the queue.
-          // We treat this as 'unknown value'.
-          if (Logging.hopcount.isDebugEnabled())
-            Logging.hopcount.debug("For '"+parentIDHash+"' linktype '"+linkType+"', the record is marked: returned 'unknown'");
-          // Reset the node to be "unknown" and "incomplete"
-          dn.reset();
-          // Leave the document node as-is (unknown), except set the source information.
-          dn.setSource(id,answerDistance);
-          continue;
-        }
-        else
-        {
-          Logging.hopcount.error("Document '"+parentIDHash+"' linktype '"+linkType+"' is labeled with 'DELETING'!");
-          throw new ManifoldCFException("Algorithm transaction error!");
-        }
-      }
-
-
-      // Initially the returned answer has no dependencies.  We'll add the dependencies later.
-      if (answerDistance != ANSWER_INFINITY)
-      {
-        // Need the dependencies for anything better than infinity
-        depsMap.put(id,dn);
-      }
-
-      // Make the node "complete", since we found a legit value.
-      dn.setStartingAnswer(new Answer(answerDistance));
-      dn.setTrialAnswer(new Answer(answerDistance));
-      // Leave bestPossibleAnswer alone.  It's not used after node is marked complete.
-      dn.makeCompleteNoWrite();
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("For '"+parentIDHash+"' linktype '"+linkType+"', the value returned is "+Integer.toString(dn.getFinalAnswer()));
-    }
-  }
-
-  /** Write a distance into the cache.
-  */
-  protected void writeCachedDistance(Long jobID, String[] legalLinkTypes, DocumentNode dn, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    Question q = dn.getQuestion();
-    String linkType = q.getLinkType();
-    String parentIDHash = q.getDocumentIdentifierHash();
-    Answer answer = dn.getTrialAnswer();
-
-    if (Logging.hopcount.isDebugEnabled())
-      Logging.hopcount.debug("Deciding whether to cache answer for document '"+parentIDHash+"' linktype '"+linkType+"' answer="+Integer.toString(answer.getAnswer()));
-
-    int answerValue = answer.getAnswer();
-    if (answerValue < 0 && answerValue != ANSWER_INFINITY)
-      return;
-
-    // Write cached distance and dependencies, all together.
-    // Yeah, this is expected to take place in a larger transaction, but I've bracketed necessary atomicity here
-    // also in case later we want to call this in another way.
-
-
-    HashMap map = new HashMap();
-    Iterator iter;
-
-    // Find the existing record
-    int existingDistance = dn.getDatabaseValue();
-    Long existingID = dn.getDatabaseRow();
-
-    if (existingID != null)
-    {
-      // If we find a cached distance here, it will be marked with the same value as is passed in.
-      // The algorithm makes us compare values in that case.  If the new value is LESS than the current
-      // value, we must throw all the target documents of this node onto the queue.
-
-      // If the new answer is "infinity", delete the old record too.
-      if (answerValue == ANSWER_INFINITY)
-      {
-        if (Logging.hopcount.isDebugEnabled())
-          Logging.hopcount.debug("Caching infinity for document '"+parentIDHash+"' linktype '"+linkType+"' answer="+Integer.toString(answer.getAnswer()));
-
-        // Delete the old dependencies in any case.
-        deleteDepsManager.deleteOwnerRows(new Long[]{existingID});
-
-        ArrayList list = new ArrayList();
-        String query = buildConjunctionClause(list,new ClauseDescription[]{
-          new UnitaryClause(idField,existingID)});
-
-        performDelete("WHERE "+query,list,null);
-        noteModifications(0,0,1);
-        // Since infinity is not a reduction of any kind, we're done here.
-        return;
-      }
-
-      // It should not be possible for an existing value to be better than the new value,
-      // because the way we get rid of links should clean up all questionable existing values.
-      if (existingDistance != ANSWER_INFINITY && existingDistance < answerValue)
-      {
-        Logging.hopcount.error("Existing distance "+Integer.toString(existingDistance)+" better than new distance "+
-          Integer.toString(answerValue)+" for '"+parentIDHash+"' linktype '"+linkType+"'");
-        throw new ManifoldCFException("Existing distance is better than new distance! Failure.");
-      }
-
-      // If the new distance is exactly the same as the old, we can leave everything as is.
-      // If the distance has improved, then push target documents onto the queue.
-      // Use the intrinsic link table for this.
-      if (existingDistance == ANSWER_INFINITY || existingDistance > answerValue)
-      {
-        // Update existing row, and write new delete dependencies.
-
-        if (Logging.hopcount.isDebugEnabled())
-          Logging.hopcount.debug("Updating answer for document '"+parentIDHash+"' linktype '"+linkType+"' answer="+Integer.toString(answer.getAnswer()));
-
-        // We need to make sure the delete deps agree with what we have in mind.
-
-        // This is currently the most expensive part of propagating lots of changes, because most of the nodes
-        // have numerous delete dependencies.  I therefore reorganized this code to be incremental where it makes
-        // sense to be.  This could cut back on the number of required operations significantly.
-
-        HashMap existingDepsMap = new HashMap();
-        if (hopcountMethod != IJobDescription.HOPCOUNT_NEVERDELETE)
-        {
-          // If we knew in advance which nodes we'd be writing, we could have read the old
-          // delete deps when we read the old distance value, in one largish query per some 25 nodes.
-          // But we don't know in advance, so it's not clear whether we'd win or lose by such a strategy.
-          //
-          // In any case, I do believe that it will be rare for wholesale changes to occur to these dependencies,
-          // so I've chosen to optimize by reading the old dependencies and just writing out the deltas.
-          DeleteDependency[] existingDeps = deleteDepsManager.getDeleteDependencies(existingID);
-
-          /*  This code demonstrated that once in a while Postgresql forgets to inherit the isolation level properly.  I wound up disabling nested transactions inside
-            serializable transactions as a result, in DBInterfacePostgresql.
-
-            IResultSet set = performQuery("SHOW TRANSACTION ISOLATION LEVEL",null, null,null);
-            if (set.getRowCount() != 1)
-              throw new ManifoldCFException("Unexpected return: no rows");
-            IResultRow row = set.getRow(0);
-            if (row.getColumnCount() != 1)
-              throw new ManifoldCFException("Unexpected return: no columns");
-            Iterator itera = row.getColumns();
-            String columnName = (String)itera.next();
-            if (row.getValue(columnName).toString().indexOf("serializ") == -1)
-              throw new ManifoldCFException("Not in a serializable transaction! "+row.getValue(columnName).toString());
-            */
-
-          // Drop these into a hash map.
-          int k = 0;
-          while (k < existingDeps.length)
-          {
-            DeleteDependency dep = existingDeps[k++];
-            existingDepsMap.put(dep,dep);
-          }
-        }
-
-        map.put(distanceField,new Long((long)answerValue));
-        map.put(markForDeathField,markToString(MARK_NORMAL));
-        ArrayList list = new ArrayList();
-        String query = buildConjunctionClause(list,new ClauseDescription[]{
-          new UnitaryClause(idField,existingID)});
-        performUpdate(map,"WHERE "+query,list,null);
-        noteModifications(0,1,0);
-
-        if (hopcountMethod != IJobDescription.HOPCOUNT_NEVERDELETE)
-        {
-          // Write either dependencies, or dependency deltas
-          int incrementalOpCount = 0;
-
-          iter = existingDepsMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            DeleteDependency dep = (DeleteDependency)iter.next();
-            if (answer.hasDependency(dep) == false)
-              incrementalOpCount++;
-          }
-          iter = answer.getDeleteDependencies();
-          while (iter.hasNext())
-          {
-            DeleteDependency dep = (DeleteDependency)iter.next();
-            if (existingDepsMap.get(dep) == null)
-              incrementalOpCount++;
-          }
-
-          if (incrementalOpCount > 1 + answer.countDeleteDependencies())
-          {
-            deleteDepsManager.deleteOwnerRows(new Long[]{existingID});
-            existingDepsMap.clear();
-          }
-
-          // Write the individual deletes...
-          iter = existingDepsMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            DeleteDependency dep = (DeleteDependency)iter.next();
-            if (answer.hasDependency(dep) == false)
-              deleteDepsManager.deleteDependency(existingID,dep);
-          }
-
-          // Then, inserts...
-          iter = answer.getDeleteDependencies();
-          while (iter.hasNext())
-          {
-            DeleteDependency dep = (DeleteDependency)iter.next();
-            if (existingDepsMap.get(dep) == null)
-              deleteDepsManager.writeDependency(existingID,jobID,dep);
-          }
-        }
-
-        String[] targetDocumentIDHashes = intrinsicLinkManager.getDocumentUniqueParents(jobID,parentIDHash);
-
-        // Push the target documents onto the queue!
-
-        // It makes sense to drop in a maximal estimate of the hopcount when we do this queuing,
-        // because that estimate may well be low enough so that the true hopcount value doesn't
-        // need to be calculated for a time.  So, calculate an estimate and pass it in.
-        // The estimate will by definition be larger than the final value.
-
-        addToProcessingQueue(jobID,new String[]{linkType},targetDocumentIDHashes,new Answer[]{answer},parentIDHash,linkType,hopcountMethod);
-      }
-      else
-      {
-        // Take the row off the queue.
-        map.put(markForDeathField,markToString(MARK_NORMAL));
-        ArrayList list = new ArrayList();
-        String query = buildConjunctionClause(list,new ClauseDescription[]{
-          new UnitaryClause(idField,existingID)});
-        performUpdate(map,"WHERE "+query,list,null);
-        noteModifications(0,1,0);
-      }
-
-      // Done
-      return;
-    }
-
-
-    // The logic for dealing with "infinity" is that we need to remove such records from the table,
-    // in order to keep the table from growing forever.
-    if (answerValue == ANSWER_INFINITY)
-    {
-      // There is nothing currently recorded, so just exit.
-
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Caching infinity for document '"+parentIDHash+"' linktype '"+linkType+"' answer="+Integer.toString(answer.getAnswer()));
-
-      return;
-    }
-
-    if (Logging.hopcount.isDebugEnabled())
-      Logging.hopcount.debug("Caching answer for document '"+parentIDHash+"' linktype '"+linkType+"' answer="+Integer.toString(answer.getAnswer()));
-
-    // We do NOT expect there to already be a cached entry!  If there is, we've screwed
-    // up somehow, and it's a bug.
-    Long id = new Long(IDFactory.make(threadContext));
-
-    map.put(idField,id);
-    map.put(jobIDField,jobID);
-    if (linkType.length() > 0)
-      map.put(linkTypeField,linkType);
-    map.put(parentIDHashField,parentIDHash);
-    map.put(distanceField,new Long(answer.getAnswer()));
-    performInsert(map,null);
-    noteModifications(1,0,0);
-
-    if (hopcountMethod != IJobDescription.HOPCOUNT_NEVERDELETE)
-    {
-      iter = answer.getDeleteDependencies();
-      while (iter.hasNext())
-      {
-        DeleteDependency dep = (DeleteDependency)iter.next();
-        deleteDepsManager.writeDependency(id,jobID,dep);
-      }
-    }
-  }
-
-  /** A class describing a document identifier and a link type, to be used in looking up the appropriate node in
-  * the hash.
-  */
-  protected static class Question
-  {
-    /** Document identifier. */
-    protected String documentIdentifierHash;
-    /** Link type. */
-    protected String linkType;
-
-    /** Constructor. */
-    public Question(String documentIdentifierHash, String linkType)
-    {
-      this.documentIdentifierHash = documentIdentifierHash;
-      this.linkType = linkType;
-    }
-
-    /** Get the document identifier.
-    */
-    public String getDocumentIdentifierHash()
-    {
-      return documentIdentifierHash;
-    }
-
-    /** Get the link type.
-    */
-    public String getLinkType()
-    {
-      return linkType;
-    }
-
-    /** The 'question' is uniquely described by linktype, document identifier,
-    * and maximum hop count.  However, there is good reason to want to merge answers where possible that have
-    * the same linktype and document identifier, so that's what we key on for hashing.
-    */
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof Question))
-        return false;
-      Question dn = (Question)o;
-      return dn.documentIdentifierHash.equals(documentIdentifierHash) && dn.linkType.equals(linkType);
-    }
-
-    /** Hash must agree with equals, above.
-    */
-    public int hashCode()
-    {
-      return documentIdentifierHash.hashCode() + linkType.hashCode();
-    }
-
-  }
-
-  /** This class represents an answer - which consists both of an answer value, and also the dependencies
-  * of that answer (i.e. the add dependencies and delete dependencies).
-  */
-  protected static class Answer
-  {
-    /** The answer value */
-    protected int answer = ANSWER_UNKNOWN;
-    /** This is the set of delete dependencies.  It is keyed by a DeleteDependency object. */
-    protected HashMap deleteDependencies = new HashMap();
-
-    /** Constructor. */
-    public Answer()
-    {
-    }
-
-    public Answer(Answer other)
-    {
-      answer = other.answer;
-      // Shallow copy is fine, because the stuff in these dependencies is immutable.
-      deleteDependencies = (HashMap)other.deleteDependencies.clone();
-    }
-
-    public Answer(int value)
-    {
-      answer = value;
-    }
-
-    /** Set an answer from initial data. */
-    public Answer(int answer, DeleteDependency[] deleteDeps)
-    {
-      this.answer = answer;
-      int i = 0;
-      while (i < deleteDeps.length)
-      {
-        DeleteDependency dep = (DeleteDependency)deleteDeps[i++];
-        deleteDependencies.put(dep,dep);
-      }
-    }
-
-    /** Get the current answer value.
-    */
-    public int getAnswer()
-    {
-      return answer;
-    }
-
-    /** Get the number of delete dependencies */
-    public int countDeleteDependencies()
-    {
-      return deleteDependencies.size();
-    }
-
-    /** Iterate over the delete dependencies. */
-    public Iterator getDeleteDependencies()
-    {
-      return deleteDependencies.keySet().iterator();
-    }
-
-    /** Check if a delete dependency is present */
-    public boolean hasDependency(DeleteDependency dep)
-    {
-      return deleteDependencies.get(dep) != null;
-    }
-
-    /** Initialize this answer object.  This sets the answer value to ANSWER_INFINITY
-    * and clears the maps.
-    */
-    public void initialize(int value)
-    {
-      answer = value;
-      deleteDependencies.clear();
-    }
-
-    /** Copy the answer value from another answer object */
-    public void duplicate(Answer other)
-    {
-      answer = other.answer;
-      // Shallow copy is fine, because the stuff in these dependencies is immutable.
-      deleteDependencies = (HashMap)other.deleteDependencies.clone();
-    }
-
-    /** Update the current answer, using a child link's information and answer.
-    * This method basically decides if the child is relevant, and if so merges the answer from the
-    * child together with the current value stored here.
-    *@param childAnswer is the current answer found for the child.
-    *@param isIncrementingLink is true if this link is the kind being counted, and thus increments
-    * the hopcount.
-    *@param linkType is the type of THIS link (for building appropriate delete dependency).
-    *@param parentIDHash is the hash of the parent document id for THIS link.
-    *@param childIDHash is the hash of the child document id for THIS link.
-    */
-    public void merge(Answer childAnswer, boolean isIncrementingLink,
-      String linkType, String parentIDHash, String childIDHash)
-    {
-      // For answers, we obviously pick the best answer we can.
-      // For dependencies, this is the process:
-      //
-      // 1) Delete dependencies
-      //    There can be only one delete dependency resulting from any given link.  This
-      //    dependency will only be created if the link is "the best" so far.  The child
-      //    node's delete dependencies will also be included whenever a new best match is
-      //    found.
-      //
-      //
-
-      // Now, get the child answer value.
-      int childAnswerValue = childAnswer.getAnswer();
-
-      // If the link is the same kind as the kind of answer we want, then it adds one
-      // to the distance measurement to the child.
-      if (answer >= 0)
-      {
-        // Determined distance against whatever the child says.
-        if (childAnswerValue >= 0)
-        {
-          if (isIncrementingLink)
-            childAnswerValue++;
-          if (childAnswerValue < answer)
-          {
-            // Use the child answer value
-            setAnswerFromChild(childAnswerValue,childAnswer.deleteDependencies,linkType,parentIDHash,childIDHash);
-            return;
-          }
-        }
-        // The current answer is better than either infinity or greater-than-max.
-        return;
-      }
-      // If the current answer is infinity, use the child answer.
-      if (answer == ANSWER_INFINITY)
-      {
-        if (childAnswerValue >= 0)
-        {
-          if (isIncrementingLink)
-            childAnswerValue++;
-          // Use the child answer value
-          setAnswerFromChild(childAnswerValue,childAnswer.deleteDependencies,linkType,parentIDHash,childIDHash);
-          return;
-        }
-        // Leave the current answer.
-        return;
-      }
-      // For the current answer being "greater than max":
-      if (childAnswerValue >= 0)
-      {
-        if (isIncrementingLink)
-          childAnswerValue++;
-        // Use the child answer value
-        setAnswerFromChild(childAnswerValue,childAnswer.deleteDependencies,linkType,parentIDHash,childIDHash);
-        return;
-      }
-      // All other cases: just keep the current answer.
-    }
-
-    /** Set answer from child */
-    protected void setAnswerFromChild(int newAnswer, HashMap childDeleteDependencies, String linkType, String parentIDHash, String childIDHash)
-    {
-      answer = newAnswer;
-      deleteDependencies = (HashMap)childDeleteDependencies.clone();
-      DeleteDependency x = new DeleteDependency(linkType,parentIDHash,childIDHash);
-      deleteDependencies.put(x,x);
-    }
-
-    /** Set an answer from initial data. */
-    public void setAnswer(int answer, DeleteDependency[] deleteDeps)
-    {
-      this.answer = answer;
-      deleteDependencies.clear();
-      int i = 0;
-      while (i < deleteDeps.length)
-      {
-        DeleteDependency dep = (DeleteDependency)deleteDeps[i++];
-        deleteDependencies.put(dep,dep);
-      }
-    }
-  }
-
-  /** This class describes a document reference. */
-  protected static class DocumentReference
-  {
-    protected String childIdentifierHash;
-    protected String linkType;
-
-    /** Constructor */
-    public DocumentReference(String childIdentifierHash, String linkType)
-    {
-      this.childIdentifierHash = childIdentifierHash;
-      this.linkType = linkType;
-    }
-
-    /** Get the child identifier */
-    public String getChildIdentifierHash()
-    {
-      return childIdentifierHash;
-    }
-
-    /** Get the link type */
-    public String getLinkType()
-    {
-      return linkType;
-    }
-  }
-
-  /** This class describes a node link reference. */
-  protected static class NodeReference
-  {
-
-    /** The node being referred to */
-    protected DocumentNode theNode;
-    /** The kind of link it is */
-    protected String linkType;
-
-    /** Constructor */
-    public NodeReference(DocumentNode theNode, String linkType)
-    {
-      this.theNode = theNode;
-      this.linkType = linkType;
-    }
-
-    /** Get the node */
-    public DocumentNode getNode()
-    {
-      return theNode;
-    }
-
-    /** Get the link type */
-    public String getLinkType()
-    {
-      return linkType;
-    }
-
-    /** Hash function. */
-    public int hashCode()
-    {
-      return theNode.hashCode() + linkType.hashCode();
-    }
-
-    /** Is this equal? */
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof NodeReference))
-        return false;
-      NodeReference other = (NodeReference)o;
-      // DocumentNode objects compare only with themselves.
-      return theNode.equals(other.theNode) && this.linkType.equals(other.linkType);
-    }
-  }
-
-  /** This class keeps track of the data associated with a node in the hash map.
-  * This basically includes the following:
-  * - the document identifier
-  * - the 'question' that was asked, which has the form (link type, maximum distance)
-  * - possibly the 'answer' to the question, which is either ">(maximum distance)", or a number.
-  * - references to the nodes which care about this answer, if they are still queued.
-  * - summary of the information we've gathered from children so far (if answer not known yet)
-  * - references to the children of this node that can affect the answer, including link details
-  *   (if answer not known yet)
-  */
-  protected static class DocumentNode
-  {
-    /** The question. */
-    protected Question question;
-
-    /** This is the original answer (if any), which is the current value in the database */
-    protected int databaseAnswerValue = ANSWER_UNKNOWN;
-    /** The original database row, if any */
-    protected Long databaseRow = null;
-
-    /** The answer, as calculated up to the level of all the completed children, which will
-    * not include incomplete child references of this node.  This is a starting point for every reassessment
-    * of this node's current answer.  It is adjust only when additional children are noted as being complete.
-    */
-    protected Answer startingAnswer = new Answer(ANSWER_UNKNOWN);
-
-    /** The current best answer.  This takes into account the current status of all the child nodes.  If the
-    * node is not complete, then the answer must be viewed as being less than or equal to this value.
-    */
-    protected Answer trialAnswer = new Answer(ANSWER_UNKNOWN);
-
-    /** The best (lowest) possible answer value for this node.  This value is calculated based on the known
-    * child link structure of a node, and can only increase.  The value will start low (at 0) and will climb
-    * as more knowledge is gained, as the children's best possible answer value increases upon re-evaluation.
-    * When the trial answer (above) reaches a value equal to the best possible value, then the node will be
-    * immediately marked as "complete", and further processing will be considered unnecessary.
-    * As far as dependencies are concerned, the bestPossibleAnswer includes dependencies that have gone
-    * into its assessment.  These dependencies represent what would need to be changed to invalidate
-    * the answer as it stands.  (Invalidation means that a smaller best possible answer would be possible, so
-    * only add dependencies would need consideration.)
-    *
-    */
-    protected Answer bestPossibleAnswer = new Answer(0);
-
-    /** Answer complete flag.  Will be set to true only if the value of "trialAnswer" is deemed final. */
-    protected boolean isComplete = false;
-    /** This flag is meaningful only if the complete flag is set. */
-    protected boolean writeNeeded = true;
-    /** Parent nodes who care (i.e. are still queued).  This map contains DocumentNode objects. */
-    protected Map parentsWhoCare = new HashMap();
-    /** Child node references.  This is a reference to an actual document node object which has a parent reference
-    * back to this one.  If the child node is modified, there is an obligation to cause the parent node to be
-    * re-evaluated.  The re-evaluation process examines all child nodes and may adjust the status of the trial
-    * answer, and may indeed even remove the reference to the child.
-    * This map contains NodeReference objects. */
-    protected Map childReferences = new HashMap();
-
-    /** Create a document node.  This will happen only if there is no comparable one already in the hash.
-    */
-    public DocumentNode(Question question)
-    {
-      this.question = question;
-    }
-
-    /** Get the question. */
-    public Question getQuestion()
-    {
-      return question;
-    }
-
-    /** Reset back to an "unknown" state.
-    */
-    public void reset()
-    {
-      isComplete = false;
-      writeNeeded = true;
-      databaseAnswerValue = ANSWER_UNKNOWN;
-      databaseRow = null;
-      trialAnswer.initialize(ANSWER_UNKNOWN);
-      startingAnswer.initialize(ANSWER_UNKNOWN);
-      bestPossibleAnswer.initialize(0);
-    }
-
-    /** Clear child references. */
-    public void clearChildReferences()
-    {
-      childReferences.clear();
-    }
-
-    /** Check if there are children. */
-    public boolean hasChildren()
-    {
-      return childReferences.size() > 0;
-    }
-
-    /** Get an answer that's final.
-    * Returns "unknown" if the current answer is incomplete.
-    */
-    public int getFinalAnswer()
-    {
-      if (isComplete)
-      {
-        return trialAnswer.getAnswer();
-      }
-      else
-        return ANSWER_UNKNOWN;
-    }
-
-    /** Check if the answer is complete.  Returns true if the answer is complete.
-    */
-    public boolean isAnswerComplete()
-    {
-      return isComplete;
-    }
-
-    /** Check if the node is complete, given the question it represents. */
-    public boolean isComplete()
-    {
-      return isComplete;
-    }
-
-    /** Check if a write of the answer is needed to the database */
-    public boolean isWriteNeeded()
-    {
-      return writeNeeded;
-    }
-
-    /** Check if answer is still needed.
-    */
-    public boolean isAnswerNeeded()
-    {
-      // Check to make sure there are parents that care.
-      return parentsWhoCare.size() > 0;
-    }
-
-    /** Get best possible answer */
-    public Answer getBestPossibleAnswer()
-    {
-      return bestPossibleAnswer;
-    }
-
-    /** Set best possible answer */
-    public void setBestPossibleAnswer(Answer answer)
-    {
-      bestPossibleAnswer.duplicate(answer);
-    }
-
-    /** Get the current best answer.
-    */
-    public Answer getTrialAnswer()
-    {
-      return trialAnswer;
-    }
-
-    /** Set the answer for this node.
-    */
-    public void setTrialAnswer(Answer answer)
-    {
-      this.trialAnswer.duplicate(answer);
-    }
-
-    /** Get the starting (base) answer. */
-    public Answer getStartingAnswer()
-    {
-      return startingAnswer;
-    }
-
-    /** Set the starting (base) answer. */
-    public void setStartingAnswer(Answer answer)
-    {
-      startingAnswer.duplicate(answer);
-    }
-
-    /** Mark the node as being "complete", with a write needed. */
-    public void makeComplete()
-    {
-      if (!isComplete)
-      {
-        isComplete = true;
-        writeNeeded = true;
-      }
-    }
-
-    /** Mark the answer as being "complete", and not needing a write. */
-    public void makeCompleteNoWrite()
-    {
-      isComplete = true;
-      writeNeeded = false;
-    }
-
-    /** Add a parent who should be notified if this node's answer changes.
-    * The parent is responsible for figuring out when this reference should be removed.
-    */
-    public void addParent(DocumentNode parent)
-    {
-      parentsWhoCare.put(parent,parent);
-    }
-
-    /** Clear the 'write needed' flag, to prevent another write. */
-    public void clearWriteNeeded()
-    {
-      writeNeeded = false;
-    }
-
-    /** Add a child reference.
-    *@param childRef is the child node reference to add.
-    */
-    public void addChild(NodeReference childRef)
-    {
-      childReferences.put(childRef,childRef);
-    }
-
-    /** Remove a child reference.
-    *@param childRef is the child node reference to remove.
-    */
-    public void removeChild(NodeReference childRef)
-    {
-      childReferences.remove(childRef);
-    }
-
-    /** Remove a parent.  This method will get called when the parent's answer no longer can be affected by
-    * this child's answer (probably because the child's answer has become complete).
-    */
-    public void removeParent(DocumentNode parent)
-    {
-      parentsWhoCare.remove(parent);
-    }
-
-    /** Iterate through all current parents.  This is an iterator over DocumentNode objects. */
-    public Iterator getCurrentParents()
-    {
-      return parentsWhoCare.keySet().iterator();
-    }
-
-    /** Iterate through current children.  This is an iterator over NodeReference objects. */
-    public Iterator getCurrentChildren()
-    {
-      return childReferences.keySet().iterator();
-    }
-
-    /** Set the database row and answer value */
-    public void setSource(Long rowID, int answerValue)
-    {
-      this.databaseRow = rowID;
-      this.databaseAnswerValue = answerValue;
-    }
-
-    /** Get the database row */
-    public Long getDatabaseRow()
-    {
-      return databaseRow;
-    }
-
-    /** Get the database answer value */
-    public int getDatabaseValue()
-    {
-      return databaseAnswerValue;
-    }
-
-    // Do NOT override hashCode() and equals(), since we want a node to match only itself.
-  }
-
-  /** A queue object allows document nodes to be ordered appropriately for the most efficient execution.
-  * The queue handles DocumentNode objects exclusively.  Mapping of Question to DocumentNode object
-  * involves structures outside of all queues.
-  */
-  protected static class NodeQueue
-  {
-    protected HashMap nodeMap = new HashMap();
-
-    /** Constructor.
-    */
-    public NodeQueue()
-    {
-    }
-
-    /** Queue a document node.
-    */
-    public void addToQueue(DocumentNode node)
-    {
-      if (nodeMap.get(node.getQuestion()) == null)
-      {
-        if (Logging.hopcount.isDebugEnabled())
-          Logging.hopcount.debug("Adding document node "+node.toString()+" to queue "+toString());
-
-        nodeMap.put(node.getQuestion(),node);
-      }
-    }
-
-    /** Remove a node from the queue.  This might happen if the node no longer needs evaluation.
-    */
-    public void removeFromQueue(DocumentNode node)
-    {
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Removing document node "+node.toString()+" from queue "+toString());
-
-      nodeMap.remove(node.getQuestion());
-    }
-
-    /** Fetch the next object off the queue for processing.  Returns null if there are no more objects.
-    */
-    public DocumentNode nextNode()
-    {
-      if (nodeMap.size() == 0)
-      {
-        if (Logging.hopcount.isDebugEnabled())
-          Logging.hopcount.debug("Retrieving node from queue "+toString()+": none found!");
-
-        return null;
-      }
-
-      Question q = (Question)nodeMap.keySet().iterator().next();
-      DocumentNode dn = (DocumentNode)nodeMap.remove(q);
-      if (Logging.hopcount.isDebugEnabled())
-        Logging.hopcount.debug("Retrieving node "+dn.toString()+" from queue "+toString());
-      return dn;
-    }
-
-    /** Fetch ALL of the nodes off the queue in one step.
-    */
-    public DocumentNode[] nextNodes()
-    {
-      DocumentNode[] rval = new DocumentNode[nodeMap.size()];
-      Iterator iter = nodeMap.keySet().iterator();
-      int j = 0;
-      while (iter.hasNext())
-      {
-        Question q = (Question)iter.next();
-        rval[j++] = (DocumentNode)nodeMap.get(q);
-      }
-      nodeMap.clear();
-      return rval;
-    }
-
-
-  }
-
-  /** The Document Hash structure contains the document nodes we are interested in, including those we need answers
-  * for to proceed.  The main interface involves specifying a set of questions and receiving the answers.  This
-  * structure permits multiple requests to be made to each object, and in-memory caching is used to reduce the amount of database
-  * activity as much as possible.
-  * It is also presumed that these requests take place inside of the appropriate transactions, since both read and write
-  * database activity may well occur.
-  */
-  protected class DocumentHash
-  {
-    /** The job identifier */
-    protected Long jobID;
-
-
-    /** This is the map of known questions to DocumentNode objects. */
-    protected Map questionLookupMap = new HashMap();
-
-    /** This is the queue for nodes that need to be initialized, who need child fetching. */
-    protected NodeQueue childFetchQueue = new NodeQueue();
-
-    /** This is the queue for evaluating nodes.  For all of these nodes, the processing
-    * has begun: all child nodes have been queued, and at least a partial answer is present.  Evaluating one
-    * of these nodes involves potentially updating the node's answer, and when that is done, all listed parents
-    * will be requeued on this queue.
-    */
-    protected NodeQueue evaluationQueue = new NodeQueue();
-
-    /** These are the legal link types for the job */
-    protected String[] legalLinkTypes;
-
-    /** The hopcount method */
-    protected int hopcountMethod;
-
-    /** Constructor */
-    public DocumentHash(Long jobID, String[] legalLinkTypes, int hopcountMethod)
-    {
-      this.jobID = jobID;
-      this.legalLinkTypes = legalLinkTypes;
-      this.hopcountMethod = hopcountMethod;
-    }
-
-    /** Throw in some questions, and prepare for the answers. */
-    public int[] askQuestions(Question[] questions)
-      throws ManifoldCFException
-    {
-      if (Logging.hopcount.isDebugEnabled())
-      {
-        Logging.hopcount.debug("Questions asked as follows:");
-        int i = 0;
-        while (i < questions.length)
-        {
-          Logging.hopcount.debug("  Linktype='"+questions[i].getLinkType()+"' DocumentID='"+questions[i].getDocumentIdentifierHash()+"'");
-          i++;
-        }
-        Logging.hopcount.debug("");
-      }
-
-      // The algorithm is complex, and works as follows.  There are two queues - a queue for
-      // starting off a node's evaluation (called the child fetch queue), and a second queue for
-      // re-evaluating nodes (called the evaluation queue).
-      //
-      // Whenever a node is first examined, and no answer is available, the node is placed on the
-      // child fetch queue.  The activity associated with this queue is to fetch a node's children
-      // and queue them in turn (if needed).  But in any case, the node is initialized with the
-      // best available answer.
-      //
-      // If the answer is complete, the node is not placed in any queues.
-      // Parent nodes do not need to be notified, because
-      // they must already be in the evaluation queue, and will be processed in time.
-      //
-      // If the answer was incomplete, the node will be placed into the evaluation queue.  Nodes in this
-      // queue are there because some of their children have changed state in a meaningful way since the
-      // last time a tentative answer was calculated.  The processing of nodes from this queue involves
-      // updating the answer value, deciding whether it is complete or not, and, if so, writing the answer
-      // to the database.  Nodes that are not complete but have not been modified are not placed in a
-      // queue; they are simply left unqueued.  When all processing is complete, these nodes will be
-      // checked and converted to "completed" states.
-
-      int[] answers = new int[questions.length];
-      DocumentNode[] nodes = queueQuestions(questions);
-
-      // Throw these questions into the opennodes structure, unless the answer is already known.
-      int i = 0;
-      while (i < nodes.length)
-      {
-        // Flag these questions as having a special parent, so they can't be removed.
-        nodes[i++].addParent(null);
-      }
-
-      // Now, process until we have all the answers we wanted.
-      while (true)
-      {
-        if (Thread.currentThread().isInterrupted())
-          throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-        // Early decision!
-        // For each question, see if there's a completed answer yet
-        i = 0;
-        while (i < questions.length)
-        {
-          DocumentNode dn = nodes[i];
-          int answer = dn.getFinalAnswer();
-          if (answer == ANSWER_UNKNOWN)
-            break;
-          // Found one!  Record it, just in case we finish.
-          answers[i++] = answer;
-        }
-
-        if (i != questions.length)
-        {
-
-          // Evaluation queue has priority.  If there's anything waiting on it, process it.
-          DocumentNode evaluationNode = evaluationQueue.nextNode();
-          if (evaluationNode != null)
-          {
-            // Evaluate!
-            evaluateNode(evaluationNode);
-            continue;
-          }
-
-          Logging.hopcount.debug("Found no nodes to evaluate at the moment");
-
-          // Nothing left to evaluate.  Do the child fetch bit instead.
-          DocumentNode[] fetchNodes = childFetchQueue.nextNodes();
-          if (fetchNodes.length > 0)
-          {
-            // Fetch children and initialize the node
-            getNodeChildren(fetchNodes);
-            continue;
-          }
-
-          Logging.hopcount.debug("Found no children to fetch at the moment");
-
-          // Nothing left to do at all.
-          // Scan the map and convert all non-complete answers to complete ones.  They'll
-          // be left in an incomplete state if there were loops.
-
-          Iterator iter = questionLookupMap.values().iterator();
-          while (iter.hasNext())
-          {
-            DocumentNode dn = (DocumentNode)iter.next();
-            if (!dn.isComplete())
-            {
-              makeNodeComplete(dn);
-            }
-          }
-
-          Logging.hopcount.debug("Made remaining nodes complete");
-
-          // Copy out the answer.  All nodes are guaranteed to be complete now.
-          i = 0;
-          while (i < questions.length)
-          {
-            DocumentNode dn = nodes[i];
-            answers[i++] = dn.getFinalAnswer();
-          }
-
-          Logging.hopcount.debug("Done (copied out the answers)");
-        }
-        else
-          Logging.hopcount.debug("Done (because answers already available)");
-
-        if (Logging.hopcount.isDebugEnabled())
-        {
-          Logging.hopcount.debug("Answers returned as follows:");
-          i = 0;
-          while (i < questions.length)
-          {
-            Logging.hopcount.debug("  Linktype='"+questions[i].getLinkType()+"' DocumentID='"+questions[i].getDocumentIdentifierHash()+"'"+
-              " Answer="+Integer.toString(answers[i]));
-            i++;
-          }
-          Logging.hopcount.debug("");
-        }
-
-        return answers;
-      }
-    }
-
-    /** Evaluate a node from the evaluation queue.
-    */
-    protected void evaluateNode(DocumentNode node)
-      throws ManifoldCFException
-    {
-      if (Logging.hopcount.isDebugEnabled())
-      {
-        Logging.hopcount.debug("Evaluating node; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-          node.getQuestion().getLinkType()+"'"+
-          " BaseAnswer="+Integer.toString(node.getStartingAnswer().getAnswer())+
-          " TrialAnswer="+Integer.toString(node.getTrialAnswer().getAnswer()));
-      }
-
-      // The base (or starting) answer should already have been set for this node.
-      // What we do here is go through all the remaining listed children,
-      // and evaluate a new trial answer.  There are some special cases we want to
-      // catch:
-      //
-      // 1) If an answer goes to zero, then the node is automatically marked "complete".
-      //    All child references are removed.
-      // 2) Child references should only be kept around if there's a chance they would
-      //    REDUCE the current answer.  So, we should keep children that are incomplete.
-      //    Complete children should be factored into the base answer, and discarded.
-      // 3) If the node is still marked incomplete, AND if there are no parents, then
-      //    simply delete it.
-      // 4) If the node is now complete, it should be marked as such, and the distance
-      //    from the node to the root should be written into the database.  Parent
-      //    should be requeued also.
-      // 5) If the node is incomplete, and the trial answer has changed, then update the
-      //    trial answer and requeue all parents.
-
-      boolean signalParentsNeeded = false;
-
-      Answer baseAnswer = new Answer(node.getStartingAnswer());
-      // THe baseAnswer already includes the current node in its add deps, so I don't have to add it here.
-
-      // Make a pass through the children, looking for completed nodes.
-      // Keep track of the ones we find, so we can remove them from the child list.
-
-      ArrayList childRemovalList = new ArrayList();
-      Iterator iter = node.getCurrentChildren();
-      while (iter.hasNext())
-      {
-        NodeReference childRef = (NodeReference)iter.next();
-        DocumentNode child = childRef.getNode();
-        String linkType = childRef.getLinkType();
-        if (child.isComplete())
-        {
-          childRemovalList.add(childRef);
-          baseAnswer.merge(child.getTrialAnswer(),
-            linkType.equals(node.getQuestion().getLinkType()),
-            linkType,
-            node.getQuestion().getDocumentIdentifierHash(),
-            child.getQuestion().getDocumentIdentifierHash());
-        }
-      }
-
-      // Get rid of the marked children.
-      int i = 0;
-      while (i < childRemovalList.size())
-      {
-        NodeReference childRef = (NodeReference)childRemovalList.get(i++);
-        childRef.getNode().removeParent(node);
-        node.removeChild(childRef);
-      }
-
-      // Set new starting answer, if it has changed.  This will NOT cause a requeue of parents,
-      // all by itself.
-      node.setStartingAnswer(baseAnswer);
-      if (Logging.hopcount.isDebugEnabled())
-      {
-        Logging.hopcount.debug("Setting baseAnswer; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-          node.getQuestion().getLinkType()+"' baseAnswer="+Integer.toString(baseAnswer.getAnswer()));
-      }
-
-      // Now, go through remaining nodes and build a trial answer.
-      Answer trialAnswer = new Answer(baseAnswer);
-      iter = node.getCurrentChildren();
-      while (iter.hasNext())
-      {
-        NodeReference childRef = (NodeReference)iter.next();
-        DocumentNode child = childRef.getNode();
-        String linkType = childRef.getLinkType();
-        trialAnswer.merge(child.getTrialAnswer(),
-          linkType.equals(node.getQuestion().getLinkType()),
-          linkType,
-          node.getQuestion().getDocumentIdentifierHash(),
-          child.getQuestion().getDocumentIdentifierHash());
-      }
-
-      // Get the current trial answer, so we can compare
-      Answer currentTrialAnswer = node.getTrialAnswer();
-      if (trialAnswer.getAnswer() != currentTrialAnswer.getAnswer())
-      {
-        signalParentsNeeded = true;
-      }
-
-      // See if we mark this "complete".
-      if (trialAnswer.getAnswer() == node.getBestPossibleAnswer().getAnswer())
-      {
-        // Early exit.
-        if (Logging.hopcount.isDebugEnabled())
-        {
-          Logging.hopcount.debug("Setting complete [bestpossible]; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-            node.getQuestion().getLinkType()+"' trialAnswer="+Integer.toString(trialAnswer.getAnswer()));
-        }
-        node.setTrialAnswer(trialAnswer);
-        makeNodeComplete(node);
-        signalParentsNeeded = true;
-      }
-      else if (!node.hasChildren())
-      {
-        if (Logging.hopcount.isDebugEnabled())
-        {
-          Logging.hopcount.debug("Setting complete [nochildren]; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-            node.getQuestion().getLinkType()+"' trialAnswer="+Integer.toString(trialAnswer.getAnswer()));
-        }
-        // Simply have no more children that aren't complete, so we are done.
-        node.setTrialAnswer(trialAnswer);
-        // It's complete!
-        makeNodeComplete(node);
-        signalParentsNeeded = true;
-      }
-      else
-      {
-        // Update the answer.
-        if (Logging.hopcount.isDebugEnabled())
-        {
-          Logging.hopcount.debug("Setting trialAnswer; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-            node.getQuestion().getLinkType()+"' trialAnswer="+Integer.toString(trialAnswer.getAnswer()));
-        }
-
-        node.setTrialAnswer(trialAnswer);
-
-        // Still not complete.  If it has no parents, it's not needed anymore, so chuck it.
-        if (!node.isAnswerNeeded())
-        {
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("Discarding [unneeded]; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-              node.getQuestion().getLinkType()+"'");
-          }
-
-          // Take this node out of the main map.
-          questionLookupMap.remove(node.getQuestion());
-          // Remove all the child references
-          removeChildLinks(node);
-          Logging.hopcount.debug("Done node evaluation");
-          return;
-        }
-      }
-
-      if (signalParentsNeeded)
-      {
-        Logging.hopcount.debug("Requeueing parent nodes");
-        // Requeue the parents.
-        queueParents(node);
-      }
-
-      Logging.hopcount.debug("Done node evaluation");
-    }
-
-    /** Fetch a the children of a bunch of nodes, and initialize all of the nodes appropriately.
-    */
-    protected void getNodeChildren(DocumentNode[] nodes)
-      throws ManifoldCFException
-    {
-      if (Logging.hopcount.isDebugEnabled())
-      {
-        Logging.hopcount.debug("Finding children for the following nodes:");
-        int z = 0;
-        while (z < nodes.length)
-        {
-          DocumentNode node = nodes[z++];
-          Logging.hopcount.debug("  DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-            node.getQuestion().getLinkType()+"'");
-        }
-      }
-
-      // Need to figure out which nodes need processing, and which don't.
-      // All of the current nodes are (by definition) not in any queues.  We need to keep track of
-      // which queues these nodes have to go into.
-      // - Some will just be deleted
-      // - Some will be made complete, and not put into any queue
-      //
-      // Naively, we might presume that some will be queued (on the evaluation queue) as a result of being the
-      // parent of a node that was changed.  But, in fact, being on the "child fetch" queue means that we
-      // DON'T have any loaded child references yet.  So - that can't happen, at least not until the child references
-      // are loaded and the nodes initialized.
-      //
-      // The real question therefore is how, exactly, to handle the situation where we load children for a bunch of
-      // nodes, and initialize the nodes, and then need to put their parents on the evaluation queue.  When we did
-      // only a single node at a time, the parents became queued but no further evaluation took place here.
-      // Since one of the nodes being processed may in fact refer to another node being processed, the
-      // 'full' initialization cannot easily be handled here; the nodes must be simply initialized to a basic incomplete
-      // state, and put on the evaluation queue, for complete evaluation.
-
-      // This is a map where I'll put the nodes that I still need children for, so I can get all children at once.
-      HashMap nodesNeedingChildren = new HashMap();
-
-      // From the nodes needing children, come up with a unique set of parent identifiers, so
-      // we can get the children as efficiently as possible.
-      HashMap parentMap = new HashMap();
-
-      int k = 0;
-      while (k < nodes.length)
-      {
-        DocumentNode node = nodes[k++];
-
-        if (!node.isAnswerNeeded())
-        {
-          // If there are no parents for this node, then this node is not currently needed, so just ditch it.
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("Discard before getting node children[unneeded]; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-              node.getQuestion().getLinkType()+"'");
-          }
-          questionLookupMap.remove(node.getQuestion());
-        }
-        else if (node.getQuestion().getDocumentIdentifierHash().length() == 0)
-        {
-          // If this is the root, set all node values accordingly.
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("Found root; DocID='"+node.getQuestion().getDocumentIdentifierHash()+"' Linktype='"+
-              node.getQuestion().getLinkType()+"'");
-          }
-
-          node.setStartingAnswer(new Answer(0));
-          node.setTrialAnswer(new Answer(0));
-          node.makeCompleteNoWrite();
-          queueParents(node);
-        }
-        nodesNeedingChildren.put(node.getQuestion(),node);
-        parentMap.put(node.getQuestion().getDocumentIdentifierHash(),node.getQuestion().getDocumentIdentifierHash());
-      }
-
-      // Now, we want all the children of all the nodes that are left - if any
-      if (nodesNeedingChildren.size() == 0)
-        return;
-
-      // This map will get built as a map keyed by parent document identifier and containing as
-      // a value an arraylist of DocumentReference objects.
-
-      HashMap referenceMap = new HashMap();
-
-      int maxClause = maxClauseFindChildren(jobID);
-      ArrayList list = new ArrayList();
-      k = 0;
-      Iterator iter = parentMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String parentIDHash = (String)iter.next();
-        referenceMap.put(parentIDHash,new ArrayList());
-        if (k == maxClause)
-        {
-          findChildren(referenceMap,jobID,list);
-          k = 0;
-          list.clear();
-        }
-        list.add(parentIDHash);
-        k++;
-      }
-
-      if (k > 0)
-        findChildren(referenceMap,jobID,list);
-
-      // Go through the 'nodes needing children'.  For each node, look up the child references, and create a set
-      // of questions for all the node children.  We'll refer directly to this list when putting together the
-      // nodes in the last step.
-
-      HashMap childQuestionMap = new HashMap();
-
-      iter = nodesNeedingChildren.keySet().iterator();
-      while (iter.hasNext())
-      {
-        Question q = (Question)iter.next();
-        ArrayList childlist = (ArrayList)referenceMap.get(q.getDocumentIdentifierHash());
-        k = 0;
-        while (k < childlist.size())
-        {
-          DocumentReference dr = (DocumentReference)childlist.get(k++);
-          Question childQuestion = new Question(dr.getChildIdentifierHash(),q.getLinkType());
-          childQuestionMap.put(childQuestion,childQuestion);
-        }
-      }
-
-      // Put together a child question array
-      Question[] questionsToAsk = new Question[childQuestionMap.size()];
-      k = 0;
-      iter = childQuestionMap.keySet().iterator();
-      while (iter.hasNext())
-      {
-        questionsToAsk[k++] = (Question)iter.next();
-      }
-
-      // Ask the questions in batch (getting back nodes that we can then refer to)
-      DocumentNode[] resultNodes = queueQuestions(questionsToAsk);
-
-      // Put the resulting nodes into the map for ease of lookup.
-      k = 0;
-      while (k < resultNodes.length)
-      {
-        childQuestionMap.put(questionsToAsk[k],resultNodes[k]);
-        k++;
-      }
-
-
-      // Now, go through all the nodes that need processing one-by-one, and use the childQuestionMap to find
-      // the nodes we need, and the referenceMap to find the link details.
-      iter = nodesNeedingChildren.keySet().iterator();
-      while (iter.hasNext())
-      {
-        Question q = (Question)iter.next();
-        DocumentNode node = (DocumentNode)nodesNeedingChildren.get(q);
-        String documentIdentifierHash = q.getDocumentIdentifierHash();
-
-        Answer startingAnswer = new Answer(ANSWER_INFINITY);
-        Answer trialAnswer = new Answer(ANSWER_INFINITY);
-        int bestPossibleAnswerValue = ANSWER_INFINITY;
-
-        ArrayList childReferences = (ArrayList)referenceMap.get(q.getDocumentIdentifierHash());
-
-        // Each childReference is a DocumentReference object which will allow the lookup of
-        // the child node from the childQuestionMap.
-        k = 0;
-        while (k < childReferences.size())
-        {
-          DocumentReference dr = (DocumentReference)childReferences.get(k++);
-          String childIdentifierHash = dr.getChildIdentifierHash();
-          Question lookupQuestion = new Question(childIdentifierHash,q.getLinkType());
-          DocumentNode childNode = (DocumentNode)childQuestionMap.get(lookupQuestion);
-          String linkType = dr.getLinkType();
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("  Child found for DocID='"+documentIdentifierHash+"' Linktype='"+
-              q.getLinkType()+"'; ID='"+childIdentifierHash+"' linktype='"+linkType+"'");
-          }
-
-          boolean isIncrementing = linkType.equals(node.getQuestion().getLinkType());
-          int bestPossibleCheckValue = 0;
-          if (isIncrementing)
-          {
-            bestPossibleCheckValue = 1;
-          }
-
-          if (bestPossibleAnswerValue == ANSWER_INFINITY || bestPossibleAnswerValue > bestPossibleCheckValue)
-            bestPossibleAnswerValue = bestPossibleCheckValue;
-
-          // Decide how to tally this - into starting answer (and don't record), or
-          // record it and scan it later?
-
-          // If the node is complete, incorporate it into BOTH the starting answer and the
-          // trial answer.  If incomplete, leave a parent reference around.
-          Answer childAnswer = childNode.getTrialAnswer();
-          if (childNode.isComplete())
-          {
-            startingAnswer.merge(childAnswer,isIncrementing,
-              linkType,documentIdentifierHash,childIdentifierHash);
-            trialAnswer.merge(childAnswer,isIncrementing,
-              linkType,documentIdentifierHash,childIdentifierHash);
-          }
-          else
-          {
-            // Add it as a child, and only include these results in the trial answer.
-            childNode.addParent(node);
-            node.addChild(new NodeReference(childNode,linkType));
-            trialAnswer.merge(childAnswer,isIncrementing,
-              linkType,documentIdentifierHash,childIdentifierHash);
-          }
-        }
-
-        node.setStartingAnswer(startingAnswer);
-        if (Logging.hopcount.isDebugEnabled())
-        {
-          Logging.hopcount.debug("Setting baseAnswer; DocID='"+documentIdentifierHash+"' Linktype='"+
-            q.getLinkType()+"' baseAnswer="+Integer.toString(startingAnswer.getAnswer()));
-        }
-
-        // Set up best possible answer
-        Answer bestPossible = new Answer(bestPossibleAnswerValue);
-        node.setBestPossibleAnswer(bestPossible);
-
-        // If the node has managed to complete itself, just throw it onto the "completed" stack
-        // See if we mark this "complete".
-        if (trialAnswer.getAnswer() == bestPossible.getAnswer())
-        {
-          // It's complete, but we need to update the trial answer's add deps
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("Setting complete [bestpossible]; DocID='"+documentIdentifierHash+"' Linktype='"+
-              q.getLinkType()+"' trialAnswer="+Integer.toString(trialAnswer.getAnswer()));
-          }
-          node.setTrialAnswer(trialAnswer);
-          makeNodeComplete(node);
-        }
-        else if (!node.hasChildren())
-        {
-          // It's complete!
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("Setting complete [nochildren]; DocID='"+documentIdentifierHash+"' Linktype='"+
-              q.getLinkType()+"' trialAnswer="+Integer.toString(trialAnswer.getAnswer()));
-          }
-          node.setTrialAnswer(trialAnswer);
-          makeNodeComplete(node);
-        }
-        else
-        {
-          if (Logging.hopcount.isDebugEnabled())
-          {
-            Logging.hopcount.debug("Setting trialAnswer; DocID='"+documentIdentifierHash+"' Linktype='"+
-              q.getLinkType()+"' trialAnswer="+Integer.toString(trialAnswer.getAnswer()));
-          }
-
-          node.setTrialAnswer(trialAnswer);
-        }
-
-        // Notify parents.
-        queueParents(node);
-      }
-    }
-
-    /** Get the max clauses.
-    */
-    protected int maxClauseFindChildren(Long jobID)
-    {
-      return findConjunctionClauseMax(new ClauseDescription[]{
-        new UnitaryClause(intrinsicLinkManager.jobIDField,jobID)});
-    }
-    
-    /** Get the children of a bunch of nodes.
-    */
-    protected void findChildren(Map referenceMap, Long jobID, ArrayList list)
-      throws ManifoldCFException
-    {
-      ArrayList newList = new ArrayList();
-
-      String query = buildConjunctionClause(newList,new ClauseDescription[]{
-        new UnitaryClause(intrinsicLinkManager.jobIDField,jobID),
-        new MultiClause(intrinsicLinkManager.parentIDHashField,list)});
-        
-      // Grab the appropriate rows from the intrinsic link table.
-      IResultSet set = performQuery("SELECT "+intrinsicLinkManager.childIDHashField+","+intrinsicLinkManager.linkTypeField+","+
-        intrinsicLinkManager.parentIDHashField+" FROM "+intrinsicLinkManager.getTableName()+" WHERE "+query,newList,null,null);
-
-      // What I want to produce from this is a filled-in reference map, where the parentid is the
-      // key, and the value is an ArrayList of DocumentReference objects.
-
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i);
-        String parentIDHash = (String)row.getValue(intrinsicLinkManager.parentIDHashField);
-        String childIDHash = (String)row.getValue(intrinsicLinkManager.childIDHashField);
-        String linkType = (String)row.getValue(intrinsicLinkManager.linkTypeField);
-        if (linkType == null)
-          linkType = "";
-        if (childIDHash == null)
-          childIDHash = "";
-        ArrayList children = (ArrayList)referenceMap.get(parentIDHash);
-        children.add(new DocumentReference(childIDHash,linkType));
-        i++;
-      }
-    }
-
-    /** Queue the parents on the evaluation queue. */
-    protected void queueParents(DocumentNode node)
-    {
-      Iterator iter = node.getCurrentParents();
-      while (iter.hasNext())
-      {
-        DocumentNode dn = (DocumentNode)iter.next();
-        if (dn != null && dn.getTrialAnswer().getAnswer() != ANSWER_UNKNOWN)
-        {
-          // This is no longer needed, since it's not ordered anymore.
-          // evaluationQueue.removeFromQueue(dn);
-          evaluationQueue.addToQueue(dn);
-        }
-      }
-    }
-
-
-    /** Make a node be complete.  This involves writing the node's data to the database,
-    * if appropriate.
-    */
-    protected void makeNodeComplete(DocumentNode node)
-      throws ManifoldCFException
-    {
-      node.makeComplete();
-      // Clean up children.
-      removeChildLinks(node);
-      if (node.isWriteNeeded())
-      {
-        // The answer did not not change, so notification of parents is unnecessary.
-        // But, we need to write this value to the database now.
-        writeCachedDistance(jobID,legalLinkTypes,node,hopcountMethod);
-        node.clearWriteNeeded();
-      }
-    }
-
-    /** Queue up a set of questions.  If the question is completed, nothing is done and the node is
-    * returned. If the question is queued already, the node may be modified if the question is more specific than what was
-    * already there.  In any case, if the answer isn't ready, null is returned.
-    *@param questions are the set of questions.
-    */
-    protected DocumentNode[] queueQuestions(Question[] questions)
-      throws ManifoldCFException
-    {
-      DocumentNode[] rval = new DocumentNode[questions.length];
-
-      // Map for keeping track of questions that need to check database data.
-      HashMap requestHash = new HashMap();
-
-      int z = 0;
-      while (z < questions.length)
-      {
-        Question q = questions[z++];
-
-        if (Logging.hopcount.isDebugEnabled())
-          Logging.hopcount.debug("Queuing question: DocID='"+q.getDocumentIdentifierHash()+"' Linktype='"+q.getLinkType()+
-          "'");
-
-        // The first thing to do is locate any existing nodes that correspond to the question,
-        // and find the ones we need to query the database for.
-        DocumentNode dn = (DocumentNode)questionLookupMap.get(q);
-        if (dn != null)
-        {
-          if (Logging.hopcount.isDebugEnabled())
-            Logging.hopcount.debug("Question exists: DocID='"+q.getDocumentIdentifierHash()+"' Linktype='"+q.getLinkType()+
-            "'");
-
-          // Try to figure out what to do based on the node's status.
-          // Possible options include:
-          // 1) Just use the node's complete answer as it stands
-          // 2) Wait on the node to have a complete answer
-
-          if (dn.isAnswerComplete())
-          {
-            if (Logging.hopcount.isDebugEnabled())
-              Logging.hopcount.debug("Answer complete for: DocID='"+q.getDocumentIdentifierHash()+"' Linktype='"+q.getLinkType()+
-              "'");
-            continue;
-          }
-
-          // The answer is incomplete.
-          if (Logging.hopcount.isDebugEnabled())
-            Logging.hopcount.debug("Returning incomplete answer: DocID='"+q.getDocumentIdentifierHash()+"' Linktype='"+q.getLinkType()+
-            "'");
-
-          continue;
-        }
-
-        // If it's the root, build a record with zero distance.
-        if (q.getDocumentIdentifierHash() == null || q.getDocumentIdentifierHash().length() == 0)
-        {
-          Logging.hopcount.debug("Creating root document node, with distance 0");
-          Answer a = new Answer(0);
-          dn = new DocumentNode(q);
-          dn.setStartingAnswer(a);
-          dn.setTrialAnswer(a);
-          // Leave bestPossibleAnswer alone.  It's not used after node is marked complete.
-          dn.makeCompleteNoWrite();
-          questionLookupMap.put(q,dn);
-          continue;
-        }
-
-        // There is no existing node.  Put a null value in the slot, and throw the question into a hash
-        // so we can ask it later (as part of a bulk request).
-        requestHash.put(q,q);
-      }
-
-      // Query for any cached entries that correspond to questions in the request hash
-      Question[] unansweredQuestions = new Question[requestHash.size()];
-      z = 0;
-      Iterator iter = requestHash.keySet().iterator();
-      while (iter.hasNext())
-      {
-        Question q = (Question)iter.next();
-        unansweredQuestions[z++] = q;
-      }
-
-      // Look up the cached distances in bulk
-      DocumentNode[] nodes = readCachedNodes(jobID,unansweredQuestions);
-      z = 0;
-      while (z < nodes.length)
-      {
-        Question q = unansweredQuestions[z];
-        DocumentNode dn = nodes[z];
-
-        // If the node is not complete, need to queue it.
-        if (!dn.isComplete())
-        {
-          // We don't know the distance, so we need to calculate it.
-          // Queue the question in the child fetch pool.  That pool reads the children and queues them,
-          // and queues the parent for evaluation.
-          childFetchQueue.addToQueue(dn);
-        }
-
-        questionLookupMap.put(q,dn);
-
-        z++;
-      }
-
-      // Go through the original questions again, and look up the nodes to return.
-      z = 0;
-      while (z < questions.length)
-      {
-        Question q = questions[z];
-        rval[z] = (DocumentNode)questionLookupMap.get(q);
-        z++;
-      }
-      return rval;
-    }
-
-    /** Notify parents of a node's change of state. */
-    protected void notifyParents(DocumentNode node)
-    {
-      Iterator iter = node.getCurrentParents();
-      while (iter.hasNext())
-      {
-        DocumentNode dn = (DocumentNode)iter.next();
-        if (dn.getTrialAnswer().getAnswer() != ANSWER_UNKNOWN)
-        {
-          // As long as it's not on the childFetch queue, we put it onto
-          // the eval queue
-          evaluationQueue.removeFromQueue(dn);
-          evaluationQueue.addToQueue(dn);
-        }
-      }
-    }
-
-    /** Remove remaining links to children. */
-    protected void removeChildLinks(DocumentNode dn)
-    {
-      Iterator iter = dn.getCurrentChildren();
-      while (iter.hasNext())
-      {
-        NodeReference nr = (NodeReference)iter.next();
-        // Ditch the parent reference
-        DocumentNode child = nr.getNode();
-        child.removeParent(dn);
-      }
-      dn.clearChildReferences();
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopDeleteDeps.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopDeleteDeps.java
deleted file mode 100644
index 4d27a37..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopDeleteDeps.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/* $Id: HopDeleteDeps.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-
-/** This class manages the table that keeps track of link deletion dependencies for cached
-* hopcounts.
-* 
-* <br><br>
-* <b>hopdeletedeps</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>jobid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
-* <tr><td>ownerid</td><td>BIGINT</td><td>Reference:hopcount.id</td></tr>
-* <tr><td>linktype</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>parentidhash</td><td>VARCHAR(40)</td><td></td></tr>
-* <tr><td>childidhash</td><td>VARCHAR(40)</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class HopDeleteDeps extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: HopDeleteDeps.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Field names
-  public static final String jobIDField = "jobid";
-  public static final String ownerIDField = "ownerid";
-  public static final String linkTypeField = "linktype";
-  public static final String parentIDHashField = "parentidhash";
-  public static final String childIDHashField = "childidhash";
-
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public HopDeleteDeps(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"hopdeletedeps");
-  }
-
-  /** Install or upgrade.
-  */
-  public void install(String jobsTable, String jobsColumn, String hopCountTable, String idColumn)
-    throws ManifoldCFException
-  {
-    // Standard practice: outer retry loop
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(jobIDField,new ColumnDescription("BIGINT",false,false,jobsTable,jobsColumn,false));
-        map.put(ownerIDField,new ColumnDescription("BIGINT",false,false,hopCountTable,idColumn,false));
-        map.put(linkTypeField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(parentIDHashField,new ColumnDescription("VARCHAR(40)",false,false,null,null,false));
-        map.put(childIDHashField,new ColumnDescription("VARCHAR(40)",false,true,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription completeIndex = new IndexDescription(true,new String[]{ownerIDField,parentIDHashField,linkTypeField,childIDHashField});
-      IndexDescription jobChildIndex = new IndexDescription(false,new String[]{jobIDField,childIDHashField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (completeIndex != null && id.equals(completeIndex))
-          completeIndex = null;
-        else if (jobChildIndex != null && id.equals(jobChildIndex))
-          jobChildIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (completeIndex != null)
-        performAddIndex(null,completeIndex);
-      if (jobChildIndex != null)
-        performAddIndex(null,jobChildIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Analyze job tables that need analysis.
-  */
-  public void analyzeTables()
-    throws ManifoldCFException
-  {
-    long startTime = System.currentTimeMillis();
-    Logging.perf.debug("Beginning to analyze hopdeletedeps table");
-    analyzeTable();
-    Logging.perf.debug("Done analyzing hopdeletedeps table in "+new Long(System.currentTimeMillis()-startTime)+" ms");
-  }
-
-  /** Delete a job. */
-  public void deleteJob(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-    performDelete("WHERE "+query,list,null);
-    // Log one event - it may not be enough, but it's the best we can do without overhead
-    noteModifications(0,0,1);
-  }
-
-  /** Remove rows that correspond to specific hopcount records.
-  */
-  public void removeMarkedRows(String parentTable, String parentIDHashField, String query, ArrayList queryList)
-    throws ManifoldCFException
-  {
-    // This didn't perform very well.
-    //performDelete("WHERE EXISTS(SELECT 'x' FROM "+parentTable+" t0 WHERE t0."+parentIDField+"="+ownerIDField+
-    //      " AND t0."+markField+"=?)",list,null);
-    performDelete("WHERE "+ownerIDField+" IN(SELECT "+parentIDHashField+" FROM "+parentTable+" WHERE "+query+")",
-      queryList,null);
-    // Log one event - it may not be enough, but it's the best we can do without overhead
-    noteModifications(0,0,1);
-  }
-
-  /** Delete rows related to specified owners.  The list of
-  * specified owners does not exceed the maximum database in-clause
-  * size.
-  */
-  public void deleteOwnerRows(Long[] ownerIDs)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(ownerIDField,ownerIDs)});
-      
-    performDelete("WHERE "+query,list,null);
-    noteModifications(0,0,ownerIDs.length);
-  }
-
-  /** Get the delete dependencies for an owner.
-  *@return the links
-  */
-  public DeleteDependency[] getDeleteDependencies(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)});
-      
-    IResultSet set = performQuery("SELECT "+linkTypeField+", "+parentIDHashField+", "+
-      childIDHashField+" FROM "+getTableName()+" WHERE "+query,list,null,null);
-    DeleteDependency[] rval = new DeleteDependency[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = new DeleteDependency((String)row.getValue(linkTypeField),
-        (String)row.getValue(parentIDHashField),
-        (String)row.getValue(childIDHashField));
-      i++;
-    }
-    return rval;
-  }
-
-  /** Delete a dependency */
-  public void deleteDependency(Long ownerID, DeleteDependency dd)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID),
-      new UnitaryClause(parentIDHashField,dd.getParentIDHash()),
-      (dd.getLinkType().length() > 0)?
-        new UnitaryClause(linkTypeField,dd.getLinkType()):
-        new NullCheckClause(linkTypeField,true),
-      (dd.getChildIDHash().length() > 0)?
-        new UnitaryClause(childIDHashField,dd.getChildIDHash()):
-        new NullCheckClause(childIDHashField,true)});
-        
-    performDelete("WHERE "+query,list,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Write a delete dependency.
-  */
-  public void writeDependency(Long ownerID, Long jobID, DeleteDependency dd)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(jobIDField,jobID);
-    map.put(ownerIDField,ownerID);
-    if (dd.getLinkType().length() > 0)
-      map.put(linkTypeField,dd.getLinkType());
-    map.put(parentIDHashField,dd.getParentIDHash());
-    if (dd.getChildIDHash().length() > 0)
-    {
-      map.put(childIDHashField,dd.getChildIDHash());
-    }
-    performInsert(map,null);
-    noteModifications(1,0,0);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopFilterManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopFilterManager.java
deleted file mode 100644
index b6270d7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/HopFilterManager.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/* $Id: HopFilterManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class manages the "hopfilters" table, which contains the hopcount filters for each job.
-* It's separated from the main jobs table because we will need multiple hop filters per job.
-* 
-* <br><br>
-* <b>jobhopfilters</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>ownerid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
-* <tr><td>linktype</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>maxhops</td><td>BIGINT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class HopFilterManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: HopFilterManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Schema
-  public final static String ownerIDField = "ownerid";
-  public final static String linkTypeField = "linktype";
-  public final static String maxHopsField = "maxhops";
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database instance.
-  */
-  public HopFilterManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"jobhopfilters");
-  }
-
-  /** Install or upgrade.
-  *@param ownerTable is the name of the table that owns this one.
-  *@param owningTablePrimaryKey is the primary key of the owning table.
-  */
-  public void install(String ownerTable, String owningTablePrimaryKey)
-    throws ManifoldCFException
-  {
-    // Standard practice: outer loop
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerIDField,new ColumnDescription("BIGINT",false,false,ownerTable,owningTablePrimaryKey,false));
-        // Null link types are NOT allowed here.  The restrictions can only be made on a real link type.
-        map.put(linkTypeField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(maxHopsField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here, as needed
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(true,new String[]{ownerIDField,linkTypeField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Read rows for a given owner id.
-  *@param id is the owner id.
-  *@return a map of link type to max hop count (as a Long).
-  */
-  public Map readRows(Long id)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(id);
-    IResultSet set = performQuery("SELECT "+linkTypeField+","+maxHopsField+" FROM "+getTableName()+" WHERE "+ownerIDField+"=?",list,
-      null,null);
-    Map rval = new HashMap();
-    if (set.getRowCount() == 0)
-      return rval;
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      String linkType = (String)row.getValue(linkTypeField);
-      Long max = (Long)row.getValue(maxHopsField);
-      rval.put(linkType,max);
-      i++;
-    }
-    return rval;
-  }
-
-  /** Fill in a set of filters corresponding to a set of owner id's.
-  *@param returnValues is a map keyed by ownerID, with value of JobDescription.
-  *@param ownerIDList is the list of owner id's.
-  *@param ownerIDParams is the corresponding set of owner id parameters.
-  */
-  public void getRows(Map<Long,JobDescription> returnValues, String ownerIDList, ArrayList ownerIDParams)
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+ownerIDField+" IN ("+ownerIDList+")",ownerIDParams,
-      null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      Long ownerID = (Long)row.getValue(ownerIDField);
-      String linkType = (String)row.getValue(linkTypeField);
-      Long maxHops = (Long)row.getValue(maxHopsField);
-      returnValues.get(ownerID).addHopCountFilter(linkType,maxHops);
-      i++;
-    }
-  }
-
-  /** Compare a filter list against what's in a job description.
-  *@param ownerID is the owning identifier.
-  *@param list is the job description to write hopcount filters for.
-  */
-  public boolean compareRows(Long ownerID, IJobDescription list)
-    throws ManifoldCFException
-  {
-    // Compare hopcount filter criteria.
-    Map filterRows = readRows(ownerID);
-    Map newFilterRows = list.getHopCountFilters();
-    if (filterRows.size() != newFilterRows.size())
-      return false;
-    for (String linkType : (Collection<String>)filterRows.keySet())
-    {
-      Long oldCount = (Long)filterRows.get(linkType);
-      Long newCount = (Long)newFilterRows.get(linkType);
-      if (oldCount == null || newCount == null)
-        return false;
-      if (oldCount.longValue() != newCount.longValue())
-        return false;
-    }
-    return true;
-  }
-  
-  /** Write a filter list into the database.
-  *@param ownerID is the owning identifier.
-  *@param list is the job description to write hopcount filters for.
-  */
-  public void writeRows(Long ownerID, IJobDescription list)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      int i = 0;
-      HashMap map = new HashMap();
-      Map filters = list.getHopCountFilters();
-      Iterator iter = filters.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String linkType = (String)iter.next();
-        Long maxHops = (Long)filters.get(linkType);
-        map.clear();
-        map.put(linkTypeField,linkType);
-        map.put(maxHopsField,maxHops);
-        map.put(ownerIDField,ownerID);
-        performInsert(map,null);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Delete rows.
-  *@param ownerID is the owner whose rows to delete.
-  */
-  public void deleteRows(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(ownerID);
-    performDelete("WHERE "+ownerIDField+"=?",list,null);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/IntrinsicLink.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/IntrinsicLink.java
deleted file mode 100644
index c926b7a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/IntrinsicLink.java
+++ /dev/null
@@ -1,721 +0,0 @@
-/* $Id: IntrinsicLink.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import java.util.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/** This class manages the table that keeps track of intrinsic relationships between documents.
- * 
- * <br><br>
- * <b>intrinsiclink</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>jobid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
- * <tr><td>linktype</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>parentidhash</td><td>VARCHAR(40)</td><td></td></tr>
- * <tr><td>childidhash</td><td>VARCHAR(40)</td><td></td></tr>
- * <tr><td>isnew</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>processid</td><td>VARCHAR(16)</td><td></td></tr>
- * </table>
- * <br><br>
- * 
-*/
-public class IntrinsicLink extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: IntrinsicLink.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // "new" field values
-
-  /** The standard value for this field.  Means that the link existed prior to this scan, and no new link
-  * was found yet. */
-  protected static final int LINKSTATUS_BASE = 0;
-  /** This value means that the link is brand-new; it did not exist before this pass. */
-  protected static final int LINKSTATUS_NEW = 1;
-  /** This value means that the link existed before, and has been found during this scan. */
-  protected static final int LINKSTATUS_EXISTING = 2;
-
-  // Field names
-  public static final String jobIDField = "jobid";
-  public static final String linkTypeField = "linktype";
-  public static final String parentIDHashField = "parentidhash";
-  public static final String childIDHashField = "childidhash";
-  public static final String newField = "isnew";
-  public static final String processIDField = "processid";
-
-  // Map from string character to link status
-  protected static Map linkstatusMap;
-  static
-  {
-    linkstatusMap = new HashMap();
-    linkstatusMap.put("B",new Integer(LINKSTATUS_BASE));
-    linkstatusMap.put("N",new Integer(LINKSTATUS_NEW));
-    linkstatusMap.put("E",new Integer(LINKSTATUS_EXISTING));
-  }
-
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public IntrinsicLink(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"intrinsiclink");
-  }
-
-  /** Install or upgrade.
-  */
-  public void install(String jobsTable, String jobsColumn)
-    throws ManifoldCFException
-  {
-    // Creating a unique index as part of upgrading could well fail, so we must have the ability to fix things up and retry if that happens.
-    while (true)
-    {
-      // Schema
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(jobIDField,new ColumnDescription("BIGINT",false,false,jobsTable,jobsColumn,false));
-        map.put(linkTypeField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(parentIDHashField,new ColumnDescription("VARCHAR(40)",false,false,null,null,false));
-        map.put(childIDHashField,new ColumnDescription("VARCHAR(40)",false,true,null,null,false));
-        map.put(newField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        map.put(processIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Perform upgrade, if needed.
-      }
-
-      // Indexes
-      IndexDescription uniqueIndex = new IndexDescription(true,new String[]{jobIDField,parentIDHashField,linkTypeField,childIDHashField});
-      IndexDescription jobChildNewIndex = new IndexDescription(false,new String[]{jobIDField,childIDHashField,newField});
-      IndexDescription newIndex = new IndexDescription(false,new String[]{newField,processIDField});
-
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (uniqueIndex != null && id.equals(uniqueIndex))
-          uniqueIndex = null;
-        else if (jobChildNewIndex != null && id.equals(jobChildNewIndex))
-          jobChildNewIndex = null;
-        else if (newIndex != null && id.equals(newIndex))
-          newIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Create the indexes we are still missing
-      if (jobChildNewIndex != null)
-        performAddIndex(null,jobChildNewIndex);
-
-      if (newIndex != null)
-        performAddIndex(null,newIndex);
-
-      if (uniqueIndex != null)
-        performAddIndex(null,uniqueIndex);
-      
-      // All done
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Analyze job tables that need analysis.
-  */
-  public void analyzeTables()
-    throws ManifoldCFException
-  {
-    long startTime = System.currentTimeMillis();
-    Logging.perf.debug("Beginning to analyze intrinsiclink table");
-    analyzeTable();
-    Logging.perf.debug("Done analyzing intrinsiclink table in "+new Long(System.currentTimeMillis()-startTime)+" ms");
-  }
-
-  /** Delete an owner (and clean up the corresponding hopcount rows).
-  */
-  public void deleteOwner(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-    performDelete("WHERE "+query,list,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Reset, at startup time.  Since links can only be added in a transactionally safe way by processing
-  * of documents, and cached records of hopcount are updated only when requested, it is safest to simply
-  * move any "new" or "new existing" links back to base state on startup.  Then, the next time that page
-  * is processed, the links will be updated properly.
-  *@param processID is the process to restart.
-  */
-  public void restart(String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(newField,statusToString(LINKSTATUS_BASE));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(newField,new Object[]{
-        statusToString(LINKSTATUS_NEW),
-        statusToString(LINKSTATUS_EXISTING)}),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Clean up after all process IDs
-  */
-  public void restart()
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(newField,statusToString(LINKSTATUS_BASE));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(newField,new Object[]{
-        statusToString(LINKSTATUS_NEW),
-        statusToString(LINKSTATUS_EXISTING)})});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-  
-  public void restartCluster()
-    throws ManifoldCFException
-  {
-    // Does nothing
-  }
-  
-  /** Record a references from source to targets.  These references will be marked as either "new" or "existing".
-  *@return the target document ID's that are considered "new".
-  */
-  public String[] recordReferences(Long jobID, String sourceDocumentIDHash,
-    String[] targetDocumentIDHashes, String linkType, String processID)
-    throws ManifoldCFException
-  {
-    Set<String> duplicateRemoval = new HashSet<String>();
-    int maxClause = maxClausePerformExistsCheck(jobID,linkType,sourceDocumentIDHash);
-    List<String> list = new ArrayList<String>();
-    int i = 0;
-    // Keep track of the document identifiers that have been seen vs. those that were unseen.
-    Set<String> presentMap = new HashSet<String>();
-    for (String targetDocumentIDHash : targetDocumentIDHashes)
-    {
-      if (duplicateRemoval.contains(targetDocumentIDHash))
-        continue;
-      duplicateRemoval.add(targetDocumentIDHash);
-      if (i == maxClause)
-      {
-        // Do the query and record the results
-        performExistsCheck(presentMap,jobID,linkType,sourceDocumentIDHash,list);
-        i = 0;
-        list.clear();
-      }
-      list.add(targetDocumentIDHash);
-      i++;
-    }
-    if (i > 0)
-      performExistsCheck(presentMap,jobID,linkType,sourceDocumentIDHash,list);
-
-    // Go through the list again, and based on the results above, decide to do either an insert or
-    // an update.
-    // We have to count these by hand, in case there are duplicates in the array.
-    int count = 0;
-    Iterator<String> iter = duplicateRemoval.iterator();
-    while (iter.hasNext())
-    {
-      String targetDocumentIDHash = iter.next();
-      if (!presentMap.contains(targetDocumentIDHash))
-        count++;
-    }
-    String[] newReferences = new String[count];
-    int j = 0;
-    // Note: May be able to make this more efficient if we update things in batches...
-    iter = duplicateRemoval.iterator();
-    while (iter.hasNext())
-    {
-      String targetDocumentIDHash = iter.next();
-
-      if (!presentMap.contains(targetDocumentIDHash))
-      {
-        newReferences[j++] = targetDocumentIDHash;
-        HashMap map = new HashMap();
-        map.put(jobIDField,jobID);
-        map.put(parentIDHashField,targetDocumentIDHash);
-        map.put(childIDHashField,sourceDocumentIDHash);
-        map.put(linkTypeField,linkType);
-        map.put(newField,statusToString(LINKSTATUS_NEW));
-        map.put(processIDField,processID);
-        performInsert(map,null);
-        noteModifications(1,0,0);
-      }
-      else
-      {
-        HashMap map = new HashMap();
-        map.put(newField,statusToString(LINKSTATUS_EXISTING));
-        map.put(processIDField,processID);
-        ArrayList updateList = new ArrayList();
-        String query = buildConjunctionClause(updateList,new ClauseDescription[]{
-          new UnitaryClause(jobIDField,jobID),
-          new UnitaryClause(parentIDHashField,targetDocumentIDHash),
-          new UnitaryClause(linkTypeField,linkType),
-          new UnitaryClause(childIDHashField,sourceDocumentIDHash)});
-        performUpdate(map,"WHERE "+query,updateList,null);
-        noteModifications(0,1,0);
-      }
-    }
-    return newReferences;
-  }
-
-  /** Calculate the max clauses for the exists check
-  */
-  protected int maxClausePerformExistsCheck(Long jobID, String linkType, String childIDHash)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(linkTypeField,linkType),
-      new UnitaryClause(childIDHashField,childIDHash)});
-  }
-    
-  /** Do the exists check, in batch. */
-  protected void performExistsCheck(Set<String> presentMap, Long jobID, String linkType, String childIDHash, List<String> list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(parentIDHashField,list),
-      new UnitaryClause(linkTypeField,linkType),
-      new UnitaryClause(childIDHashField,childIDHash)});
-
-    IResultSet result = performQuery("SELECT "+parentIDHashField+" FROM "+getTableName()+" WHERE "+query+" FOR UPDATE",newList,null,null);
-    for (int i = 0; i < result.getRowCount(); i++)
-    {
-      IResultRow row = result.getRow(i);
-      String parentIDHash = (String)row.getValue(parentIDHashField);
-      presentMap.add(parentIDHash);
-    }
-  }
-
-  /** Remove all links that mention a specific set of documents, as described by a join.
-  */
-  public void removeDocumentLinks(Long jobID,
-    String joinTableName,
-    String joinTableIDColumn, String joinTableJobColumn,
-    String joinTableCriteria, ArrayList joinTableParams)
-    throws ManifoldCFException
-  {
-    // Delete matches for childIDHashField
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList list = new ArrayList();
-          
-    sb.append("EXISTS(SELECT 'x' FROM ").append(joinTableName).append(" WHERE ")
-      .append(buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(joinTableJobColumn,jobID),
-        new JoinClause(joinTableIDColumn,getTableName()+"."+childIDHashField)})).append(" AND ");
-
-    sb.append(joinTableCriteria);
-    list.addAll(joinTableParams);
-              
-    sb.append(")");
-              
-    performDelete(sb.toString(),list,null);
-    noteModifications(0,0,1);
-      
-    // DON'T delete ParentID matches; we need to leave those around for bookkeeping to
-    // be correct.  See CONNECTORS-501.
-  }
-
-  /** Remove all links that mention a specific set of documents.
-  */
-  public void removeDocumentLinks(Long jobID,
-    String[] documentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = maxClausePerformRemoveDocumentLinks(jobID);
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String documentIDHash : documentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performRemoveDocumentLinks(list,jobID);
-        list.clear();
-        k = 0;
-      }
-      list.add(documentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performRemoveDocumentLinks(list,jobID);
-    noteModifications(0,0,documentIDHashes.length);
-  }
-
-  protected int maxClausePerformRemoveDocumentLinks(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-  }
-    
-  protected void performRemoveDocumentLinks(List<String> list, Long jobID)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList thisList = new ArrayList();
-
-    sb.append(buildConjunctionClause(thisList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(childIDHashField,list)}));
-    performDelete(sb.toString(),thisList,null);
-    
-    // DON'T do parentID matches; we need to leave those around.  See CONNECTORS-501.
-  }
-
-  /** Remove all target links of the specified source documents that are not marked as "new" or "existing", and
-  * return the others to their base state.
-  */
-  public void removeLinks(Long jobID,
-    String commonNewExpression, ArrayList commonNewParams,
-    String[] sourceDocumentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = maxClausePerformRemoveLinks(jobID);
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String sourceDocumentIDHash : sourceDocumentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performRemoveLinks(list,jobID,commonNewExpression,commonNewParams);
-        list.clear();
-        k = 0;
-      }
-      list.add(sourceDocumentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performRemoveLinks(list,jobID,commonNewExpression,commonNewParams);
-    noteModifications(0,0,sourceDocumentIDHashes.length);
-  }
-  
-  protected int maxClausePerformRemoveLinks(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-  }
-    
-  protected void performRemoveLinks(List<String> list, Long jobID, String commonNewExpression,
-    ArrayList commonNewParams)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList thisList = new ArrayList();
-
-    sb.append(buildConjunctionClause(thisList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(childIDHashField,list)}));
-    if (commonNewExpression != null)
-    {
-      sb.append(" AND ").append(commonNewExpression);
-      thisList.addAll(commonNewParams);
-    }
-    performDelete(sb.toString(),thisList,null);
-  }
-
-  /** Return all target links of the specified source documents to their base state.
-  */
-  public void restoreLinks(Long jobID, String[] sourceDocumentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = maxClausesPerformRestoreLinks(jobID);
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String sourceDocumentIDHash : sourceDocumentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performRestoreLinks(jobID,list);
-        list.clear();
-        k = 0;
-      }
-      list.add(sourceDocumentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performRestoreLinks(jobID,list);
-    noteModifications(0,sourceDocumentIDHashes.length,0);
-  }
-
-  protected int maxClausesPerformRestoreLinks(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-  }
-  
-  protected void performRestoreLinks(Long jobID, List<String> list)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(newField,statusToString(LINKSTATUS_BASE));
-    map.put(processIDField,null);
-    
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList newList = new ArrayList();
-    
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(childIDHashField,list)})).append(" AND ")
-      .append(newField).append(" IN (?,?)");
-    newList.add(statusToString(LINKSTATUS_EXISTING));
-    newList.add(statusToString(LINKSTATUS_NEW));
-    performUpdate(map,sb.toString(),newList,null);
-  }
-
-  /** Throw away links added during (aborted) processing.
-  */
-  public void revertLinks(Long jobID, String[] sourceDocumentIDHashes)
-    throws ManifoldCFException
-  {
-    int maxClause = maxClausesPerformRevertLinks(jobID);
-    List<String> list = new ArrayList<String>();
-    int k = 0;
-    for (String sourceDocumentIDHash : sourceDocumentIDHashes)
-    {
-      if (k == maxClause)
-      {
-        performRevertLinks(jobID,list);
-        list.clear();
-        k = 0;
-      }
-      list.add(sourceDocumentIDHash);
-      k++;
-    }
-
-    if (k > 0)
-      performRevertLinks(jobID,list);
-    noteModifications(0,sourceDocumentIDHashes.length,0);
-  }
-
-  protected int maxClausesPerformRevertLinks(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-  }
-  
-  protected void performRevertLinks(Long jobID, List<String> list)
-    throws ManifoldCFException
-  {
-    // First, delete everything marked as "new"
-    StringBuilder sb = new StringBuilder("WHERE ");
-    ArrayList newList = new ArrayList();
-
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(childIDHashField,list)})).append(" AND ")
-      .append(newField).append("=?");
-    newList.add(statusToString(LINKSTATUS_NEW));
-    performDelete(sb.toString(),newList,null);
-
-    // Now map everything marked as "EXISTING" back to "BASE".
-    HashMap map = new HashMap();
-    map.put(newField,statusToString(LINKSTATUS_BASE));
-    map.put(processIDField,null);
-    
-    sb = new StringBuilder();
-    newList.clear();
-    
-    sb.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(childIDHashField,list)})).append(" AND ")
-      .append(newField).append("=?");
-    newList.add(statusToString(LINKSTATUS_EXISTING));
-    performUpdate(map,sb.toString(),newList,null);
-  }
-
-  /** Get document's children.
-  *@return rows that contain the children.  Column names are 'linktype','childidentifier'.
-  */
-  public IResultSet getDocumentChildren(Long jobID, String parentIDHash)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(parentIDHashField,parentIDHash)});
-    return performQuery("SELECT "+linkTypeField+" AS linktype,"+childIDHashField+" AS childidentifier FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-  }
-
-  /** Get document's parents.
-  *@return a set of document identifier hashes that constitute parents of the specified identifier.
-  */
-  public String[] getDocumentUniqueParents(Long jobID, String childIDHash)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(childIDHashField,childIDHash)});
-      
-    IResultSet set = performQuery("SELECT DISTINCT "+parentIDHashField+" FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-    String[] rval = new String[set.getRowCount()];
-    for (int i = 0; i < rval.length; i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(parentIDHashField);
-    }
-    return rval;
-  }
-
-  /** Convert string to link status. */
-  public static int stringToStatus(String status)
-  {
-    Integer value = (Integer)linkstatusMap.get(status);
-    return value.intValue();
-  }
-
-  /** Convert link status to string */
-  public static String statusToString(int status)
-  {
-    switch (status)
-    {
-    case LINKSTATUS_BASE:
-      return "B";
-    case LINKSTATUS_NEW:
-      return "N";
-    case LINKSTATUS_EXISTING:
-      return "E";
-    default:
-      return null;
-    }
-  }
-
-  // This class filters an ordered resultset to return only the duplicates
-  protected static class DuplicateFinder implements ILimitChecker
-  {
-    protected Long prevJobID = null;
-    protected String prevLinkType = null;
-    protected String prevParentIDHash = null;
-    protected String prevChildIDHash = null;
-
-    public DuplicateFinder()
-    {
-    }
-
-    /** See if this class can be legitimately compared against another of
-    * the same type.
-    *@return true if comparisons will ever return "true".
-    */
-    public boolean doesCompareWork()
-    {
-      return false;
-    }
-
-    /** Create a duplicate of this class instance.  All current state should be preserved.
-    * NOTE: Since doesCompareWork() returns false, queries using this limit checker cannot
-    * be cached, and therefore duplicate() is never called from the query executor.
-    *@return the duplicate.
-    */
-    public ILimitChecker duplicate()
-    {
-      DuplicateFinder df = new DuplicateFinder();
-      df.prevJobID = prevJobID;
-      df.prevLinkType = prevLinkType;
-      df.prevParentIDHash = prevParentIDHash;
-      df.prevChildIDHash = prevChildIDHash;
-      return df;
-    }
-
-    /** Find the hashcode for this class.  This will only ever be used if
-    * doesCompareWork() returns true.
-    *@return the hashcode.
-    */
-    public int hashCode()
-    {
-      return 0;
-    }
-
-    /** Compare two objects and see if equal.  This will only ever be used
-    * if doesCompareWork() returns true.
-    *@param object is the object to compare against.
-    *@return true if equal.
-    */
-    public boolean equals(Object object)
-    {
-      return false;
-    }
-
-    /** See if a result row should be included in the final result set.
-    *@param row is the result row to check.
-    *@return true if it should be included, false otherwise.
-    */
-    public boolean checkInclude(IResultRow row)
-      throws ManifoldCFException
-    {
-      Long jobID = (Long)row.getValue(jobIDField);
-      String linkType = (String)row.getValue(linkTypeField);
-      String parentIDHash = (String)row.getValue(parentIDHashField);
-      if (parentIDHash == null)
-        parentIDHash = "";
-      String childIDHash = (String)row.getValue(childIDHashField);
-      if (childIDHash == null)
-        childIDHash = "";
-
-      // If this is a duplicate, we want to keep it!
-      if (prevJobID != null && jobID.equals(prevJobID) && linkType.equals(prevLinkType) && parentIDHash.equals(prevParentIDHash) && childIDHash.equals(prevChildIDHash))
-        return true;
-      prevJobID = jobID;
-      prevLinkType = linkType;
-      prevParentIDHash = parentIDHash;
-      prevChildIDHash = childIDHash;
-      return false;
-    }
-
-    /** See if we should examine another row.
-    *@return true if we need to keep going, or false if we are done.
-    */
-    public boolean checkContinue()
-      throws ManifoldCFException
-    {
-      return true;
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobDescription.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobDescription.java
deleted file mode 100644
index 406d8ec..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobDescription.java
+++ /dev/null
@@ -1,825 +0,0 @@
-/* $Id: JobDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This is a paper object describing a job.
-* Each job in the lcf framework has:
-* - an identifier;
-* - a description;
-* - a repository connection;
-* - one of a number of scheduling options: starting every n hours/days/weeks/months, on specific dates, or "continuous" (which basically
-*   establishes a priority queue based on modification frequency);
-* - "seeds" (or starting points), which are the places that scanning begins.
-* Also remember that since incremental deletion must occur on a job-by-job basis, the scanning data also records the job that
-* performed the scan, so that each job can rescan previous ingested data, and delete documents that have been removed.
-*/
-public class JobDescription implements IJobDescription
-{
-  public static final String _rcsid = "@(#)$Id: JobDescription.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Data
-  protected boolean isNew = true;
-  protected Long id = null;
-  protected String description = null;
-  protected String connectionName = null;
-  protected final List<PipelineStage> pipelineStages = new ArrayList<PipelineStage>();
-  protected final List<Notification> notifications = new ArrayList<Notification>();
-  protected int type = TYPE_CONTINUOUS;
-  protected int startMethod = START_WINDOWBEGIN;
-  protected int priority = 5;
-
-  // Absolute job-triggering times
-  protected ScheduleList scheduleList = new ScheduleList();
-
-  // Throttle
-  protected Float rate = null;
-
-  // Default interval for continuous crawling
-  protected Long interval = new Long(1000L*3600L*24L);            // 1 day is the default
-
-  // Maximum interval for continuous crawling
-  protected Long maxInterval = null;
-  
-  // Document expiration time for this job, in milliseconds
-  protected Long expiration = null;                       // Never is the default
-
-  // Default reseed interval for continuous crawling
-  protected Long reseedInterval = new Long(60L * 60L * 1000L);    // 1 hour is the default
-
-  // Document specification
-  protected Specification documentSpecification = new Specification();
-
-  // Hop count filters.
-  protected HashMap hopCountFilters = new HashMap();
-
-  // Hopcount mode
-  protected int hopcountMode = HOPCOUNT_ACCURATE;
-
-  // Read-only mode
-  protected boolean readOnly = false;
-
-
-  /** Duplicate method, with optional "readonly" flag.
-  */
-  public JobDescription duplicate(boolean readOnly)
-  {
-    if (readOnly && this.readOnly)
-      return this;
-    // Make a new copy; we'll label it as readonly or not based on the input flag
-    JobDescription rval = new JobDescription();
-    rval.id = id;
-    rval.isNew = isNew;
-    rval.connectionName = connectionName;
-    // Direct modification of this object is possible - so it also has to know if it is read-only!!
-    rval.documentSpecification = documentSpecification.duplicate(readOnly);
-    for (PipelineStage pipelineStage : pipelineStages)
-    {
-      rval.pipelineStages.add(new PipelineStage(pipelineStage.getPrerequisiteStage(),
-        pipelineStage.getIsOutput(),
-        pipelineStage.getConnectionName(),
-        pipelineStage.getDescription(),
-        pipelineStage.getSpecification().duplicate(readOnly)));
-    }
-    for (Notification notification : notifications)
-    {
-      rval.notifications.add(new Notification(notification.getConnectionName(),
-        notification.getDescription(),
-        notification.getSpecification().duplicate(readOnly)));
-    }
-    rval.description = description;
-    rval.type = type;
-    // No direct modification of this object is possible
-    rval.scheduleList = scheduleList.duplicate();
-    rval.interval = interval;
-    rval.maxInterval = maxInterval;
-    rval.expiration = expiration;
-    rval.reseedInterval = reseedInterval;
-    rval.rate = rate;
-    rval.priority = priority;
-    rval.startMethod = startMethod;
-    rval.hopcountMode = hopcountMode;
-    Iterator iter = hopCountFilters.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String linkType = (String)iter.next();
-      Long maxHops = (Long)hopCountFilters.get(linkType);
-      rval.hopCountFilters.put(linkType,maxHops);
-    }
-    rval.readOnly = readOnly;
-    return rval;
-  }
-
-  /** Make the description "read only".  This must be done after the object has been complete specified.
-  * Once a document is read-only, it cannot be made writable without duplication.
-  */
-  public void makeReadOnly()
-  {
-    if (readOnly)
-      return;
-    readOnly = true;
-    for (PipelineStage pipelineStage : pipelineStages)
-    {
-      pipelineStage.getSpecification().makeReadOnly();
-    }
-    for (Notification notification : notifications)
-    {
-      notification.getSpecification().makeReadOnly();
-    }
-    documentSpecification.makeReadOnly();
-  }
-
-  /** Set isnew.
-  *@param isNew is true if the object is new.
-  */
-  public void setIsNew(boolean isNew)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.isNew = isNew;
-  }
-
-  /** Get isnew.
-  *@return true if the object is new.
-  */
-  @Override
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-
-  /** Set the id.
-  *@param id is the id.
-  */
-  public void setID(Long id)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.id = id;
-  }
-
-  /** Get the id.
-  *@return the id.
-  */
-  @Override
-  public Long getID()
-  {
-    return id;
-  }
-
-  /** Set the description.
-  *@param description is the description.
-  */
-  @Override
-  public void setDescription(String description)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.description = description;
-  }
-
-  /** Get the description.
-  *@return the description
-  */
-  @Override
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the connection name.
-  *@param connectionName is the connection name.
-  */
-  @Override
-  public void setConnectionName(String connectionName)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.connectionName = connectionName;
-  }
-
-  /** Get the connection name.
-  *@return the connection name.
-  */
-  @Override
-  public String getConnectionName()
-  {
-    return connectionName;
-  }
-
-  /** Clear pipeline connections */
-  @Override
-  public void clearPipeline()
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    pipelineStages.clear();
-  }
-  
-  /** Add a pipeline connection.
-  *@param prerequisiteStage is the prerequisite stage number for this connection, or -1 if there is none.
-  *@param isOutput is true if the pipeline stage is an output connection.
-  *@param pipelineStageConnectionName is the name of the pipeline connection to add.
-  *@param pipelineStageDescription is a description of the pipeline stage being added.
-  *@return the empty output specification for this pipeline stage.
-  */
-  @Override
-  public Specification addPipelineStage(int prerequisiteStage, boolean isOutput, String pipelineStageConnectionName, String pipelineStageDescription)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    PipelineStage ps = new PipelineStage(prerequisiteStage,isOutput,pipelineStageConnectionName,pipelineStageDescription);
-    pipelineStages.add(ps);
-    return ps.getSpecification();
-  }
-  
-  /** Get a count of pipeline stages */
-  @Override
-  public int countPipelineStages()
-  {
-    return pipelineStages.size();
-  }
-  
-  /** Insert a new pipeline stage.
-  *@param index is the index to insert pipeline stage before
-  *@param pipelineStageConnectionName is the connection name.
-  *@param pipelineStageDescription is the description.
-  *@return the newly-created output specification.
-  */
-  @Override
-  public Specification insertPipelineStage(int index, boolean isOutput, String pipelineStageConnectionName, String pipelineStageDescription)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    // What we do here depends on the kind of stage we're inserting.
-    // Both kinds take the current stage's prerequisite as their own.  But what happens to the current stage will
-    // differ as to whether its reference changes or not.
-    PipelineStage currentStage = pipelineStages.get(index);
-    PipelineStage ps = new PipelineStage(currentStage.getPrerequisiteStage(),isOutput,pipelineStageConnectionName,pipelineStageDescription);
-    pipelineStages.add(index,ps);
-    currentStage.adjustReplacedStage(index,isOutput);
-    // Adjust stage back-references
-    int stage = index + 2;
-    while (stage < pipelineStages.size())
-    {
-      pipelineStages.get(stage).adjustForInsert(index);
-      stage++;
-    }
-    return ps.getSpecification();
-  }
-  
-  /** Get the prerequisite stage number for a pipeline stage.
-  *@param index is the index of the pipeline stage to get.
-  *@return the preceding stage number for that stage, or -1 if there is none.
-  */
-  @Override
-  public int getPipelineStagePrerequisite(int index)
-  {
-    return pipelineStages.get(index).getPrerequisiteStage();
-  }
-  
-  /** Check if a pipeline stage is an output connection.
-  *@param index is the index of the pipeline stage to check.
-  *@return true if it is an output connection.
-  */
-  @Override
-  public boolean getPipelineStageIsOutputConnection(int index)
-  {
-    return pipelineStages.get(index).getIsOutput();
-  }
-
-  /** Get a specific pipeline connection name.
-  *@param index is the index of the pipeline stage whose connection name to get.
-  *@return the name of the connection.
-  */
-  @Override
-  public String getPipelineStageConnectionName(int index)
-  {
-    return pipelineStages.get(index).getConnectionName();
-  }
-  
-  /** Get a specific pipeline stage description.
-  *@param index is the index of the pipeline stage whose description to get.
-  *@return the name of the connection.
-  */
-  @Override
-  public String getPipelineStageDescription(int index)
-  {
-    return pipelineStages.get(index).getDescription();
-  }
-
-  /** Get a specific pipeline stage specification.
-  *@param index is the index of the pipeline stage whose specification is needed.
-  *@return the specification for the connection.
-  */
-  @Override
-  public Specification getPipelineStageSpecification(int index)
-  {
-    return pipelineStages.get(index).getSpecification();
-  }
-
-  /** Delete a pipeline stage.
-  *@param index is the index of the pipeline stage to delete.
-  */
-  @Override
-  public void deletePipelineStage(int index)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    PipelineStage ps = pipelineStages.remove(index);
-    int stage = index;
-    while (stage < pipelineStages.size())
-    {
-      pipelineStages.get(stage).adjustForDelete(index,ps.getPrerequisiteStage());
-      stage++;
-    }
-  }
-
-  /** Clear notification connections.
-  */
-  @Override
-  public void clearNotifications()
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    notifications.clear();
-  }
-  
-  /** Add a notification.
-  *@param notificationConnectionName is the name of the notification connection to add.
-  *@param notificationDescription is a description of the notification being added.
-  *@return the empty specification for this notification.
-  */
-  @Override
-  public Specification addNotification(String notificationConnectionName, String notificationDescription)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    Notification ps = new Notification(notificationConnectionName,notificationDescription);
-    notifications.add(ps);
-    return ps.getSpecification();
-  }
-  
-  /** Get a count of pipeline connections.
-  *@return the current number of pipeline connections.
-  */
-  @Override
-  public int countNotifications()
-  {
-    return notifications.size();
-  }
-  
-  /** Get a specific notification connection name.
-  *@param index is the index of the notification whose connection name to get.
-  *@return the name of the connection.
-  */
-  @Override
-  public String getNotificationConnectionName(int index)
-  {
-    return notifications.get(index).getConnectionName();
-  }
-
-  /** Get a specific notification description.
-  *@param index is the index of the notification whose description to get.
-  *@return the name of the connection.
-  */
-  @Override
-  public String getNotificationDescription(int index)
-  {
-    return notifications.get(index).getDescription();
-  }
-
-  /** Get a specific notification specification.
-  *@param index is the index of the notification whose specification is needed.
-  *@return the specification for the connection.
-  */
-  @Override
-  public Specification getNotificationSpecification(int index)
-  {
-    return notifications.get(index).getSpecification();
-  }
-
-  /** Delete a notification.
-  *@param index is the index of the notification to delete.
-  */
-  @Override
-  public void deleteNotification(int index)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    notifications.remove(index);
-  }
-  
-  /** Insert a new notification.
-  *@param index is the index to insert pipeline stage before
-  *@param notificationConnectionName is the connection name.
-  *@param notificationDescription is the description.
-  *@return the newly-created output specification.
-  */
-  @Override
-  public Specification insertNotification(int index, String notificationConnectionName, String notificationDescription)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    // What we do here depends on the kind of stage we're inserting.
-    // Both kinds take the current stage's prerequisite as their own.  But what happens to the current stage will
-    // differ as to whether its reference changes or not.
-    Notification ps = new Notification(notificationConnectionName,notificationDescription);
-    notifications.add(index,ps);
-    return ps.getSpecification();
-  }
-  
-  /** Set the job type.
-  *@param type is the type (as an integer).
-  */
-  @Override
-  public void setType(int type)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.type = type;
-  }
-
-  /** Get the job type.
-  *@return the type (as an integer).
-  */
-  @Override
-  public int getType()
-  {
-    return type;
-  }
-
-  /** Set the job's start method.
-  *@param startMethod is the start description.
-  */
-  @Override
-  public void setStartMethod(int startMethod)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.startMethod = startMethod;
-  }
-
-  /** Get the job's start method.
-  *@return the start method.
-  */
-  @Override
-  public int getStartMethod()
-  {
-    return startMethod;
-  }
-
-
-  // For day-specific jobs.  These occur at a given time that matches the specifications.
-  // The specifications set certain criteria (specific hours, days of the week, etc.)
-
-  /** Clear all the scheduling records.
-  */
-  @Override
-  public void clearScheduleRecords()
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    scheduleList.clear();
-  }
-
-  /** Add a record.
-  *@param record is the record to add.
-  */
-  @Override
-  public void addScheduleRecord(ScheduleRecord record)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    scheduleList.addRecord(record);
-  }
-
-  /** Get the number of schedule records.
-  *@return the count.
-  */
-  @Override
-  public int getScheduleRecordCount()
-  {
-    return scheduleList.getRecordCount();
-  }
-
-  /** Get a specified schedule record.
-  *@param index is the record number.
-  *@return the record.
-  */
-  @Override
-  public ScheduleRecord getScheduleRecord(int index)
-  {
-    return scheduleList.getRecord(index);
-  }
-
-  /** Delete a specified schedule record.
-  *@param index is the record number.
-  */
-  @Override
-  public void deleteScheduleRecord(int index)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    scheduleList.deleteRecord(index);
-  }
-
-
-  // For continuous jobs
-  // This is the rescheduling interval to use when no calculated interval is known
-
-  /** Set the rescheduling interval, in milliseconds.
-  *@param interval is the default interval, or null for infinite.
-  */
-  @Override
-  public void setInterval(Long interval)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.interval = interval;
-  }
-
-  /** Get the rescheduling interval, in milliseconds.
-  *@return the default interval, or null for infinite.
-  */
-  @Override
-  public Long getInterval()
-  {
-    return interval;
-  }
-
-  /** Set the maximum rescheduling interval, in milliseconds, or null if forever.
-  *@param interval is the maximum interval.
-  */
-  @Override
-  public void setMaxInterval(Long interval)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.maxInterval = interval;
-  }
-
-  /** Get the maximum rescheduling interval, in milliseconds.
-  *@return the max interval, or null if forever.
-  */
-  @Override
-  public Long getMaxInterval()
-  {
-    return maxInterval;
-  }
-
-  /** Set the expiration time, in milliseconds.
-  *@param time is the maximum expiration time of a document, in milliseconds, or null if none.
-  */
-  @Override
-  public void setExpiration(Long time)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    expiration = time;
-  }
-
-  /** Get the expiration time, in milliseconds.
-  *@return the maximum expiration time of a document, or null if none.
-  */
-  @Override
-  public Long getExpiration()
-  {
-    return expiration;
-  }
-
-  /** Set the reseeding interval, in milliseconds.
-  *@param interval is the interval, or null for infinite.
-  */
-  @Override
-  public void setReseedInterval(Long interval)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.reseedInterval = interval;
-  }
-
-  /** Get the reseeding interval, in milliseconds.
-  *@return the interval, or null if infinite.
-  */
-  @Override
-  public Long getReseedInterval()
-  {
-    return reseedInterval;
-  }
-
-  /** Get the document specification.
-  *@return the document specification object.
-  */
-  @Override
-  public Specification getSpecification()
-  {
-    return documentSpecification;
-  }
-
-
-  /** Set the job priority.  This is a simple integer between 1 and 10, where
-  * 1 is the highest priority.
-  *@param priority is the priority.
-  */
-  @Override
-  public void setPriority(int priority)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    this.priority = priority;
-  }
-
-  /** Get the job priority.
-  *@return the priority (a number between 1 and 10).
-  */
-  @Override
-  public int getPriority()
-  {
-    return priority;
-  }
-
-  // Hopcount filters
-
-  /** Get the set of hopcount filters the job has defined.
-  *@return the set as a map, keyed by Strings and containing Longs.
-  */
-  @Override
-  public Map getHopCountFilters()
-  {
-    return (Map)hopCountFilters.clone();
-  }
-
-  /** Clear the set of hopcount filters for the job.
-  */
-  @Override
-  public void clearHopCountFilters()
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    hopCountFilters.clear();
-  }
-
-
-  /** Add a hopcount filter to the job.
-  *@param linkType is the type of link the filter applies to.
-  *@param maxHops is the maximum hop count.  Use null to remove a filter.
-  */
-  @Override
-  public void addHopCountFilter(String linkType, Long maxHops)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    hopCountFilters.put(linkType,maxHops);
-  }
-
-  /** Get the hopcount mode. */
-  @Override
-  public int getHopcountMode()
-  {
-    return hopcountMode;
-  }
-
-  /** Set the hopcount mode. */
-  @Override
-  public void setHopcountMode(int mode)
-  {
-    if (readOnly)
-      throw new IllegalStateException("Attempt to change read-only object");
-    hopcountMode = mode;
-  }
-
-  protected static class Notification
-  {
-    protected final String connectionName;
-    protected final String description;
-    protected final Specification specification;
-    
-    public Notification(String connectionName, String description)
-    {
-      this.connectionName = connectionName;
-      this.description = description;
-      this.specification = new Specification();
-    }
-
-    public Notification(String connectionName, String description, Specification spec)
-    {
-      this.connectionName = connectionName;
-      this.description = description;
-      this.specification = spec;
-    }
-
-    public Specification getSpecification()
-    {
-      return specification;
-    }
-    
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-    
-    public String getDescription()
-    {
-      return description;
-    }
-
-  }
-  
-  protected static class PipelineStage
-  {
-    protected int prerequisiteStage;
-    protected final boolean isOutput;
-    protected final String connectionName;
-    protected final String description;
-    protected final Specification specification;
-    
-    public PipelineStage(int prerequisiteStage, boolean isOutput, String connectionName, String description)
-    {
-      this.prerequisiteStage = prerequisiteStage;
-      this.isOutput = isOutput;
-      this.connectionName = connectionName;
-      this.description = description;
-      this.specification = new Specification();
-    }
-
-    public PipelineStage(int prerequisiteStage, boolean isOutput, String connectionName, String description, Specification spec)
-    {
-      this.prerequisiteStage = prerequisiteStage;
-      this.isOutput = isOutput;
-      this.connectionName = connectionName;
-      this.description = description;
-      this.specification = spec;
-    }
-    
-    public void adjustReplacedStage(int index, boolean isOutput)
-    {
-      if (!isOutput)
-	prerequisiteStage = index;
-      else
-	adjustForInsert(index);
-    }
-    
-    public void adjustForInsert(int index)
-    {
-      if (prerequisiteStage >= index)
-      {
-        prerequisiteStage++;
-      }
-    }
-    
-    public void adjustForDelete(int index, int prerequisite)
-    {
-      if (prerequisiteStage > index)
-        prerequisiteStage--;
-      else if (prerequisiteStage == index)
-        prerequisiteStage = prerequisite;
-    }
-    
-    public Specification getSpecification()
-    {
-      return specification;
-    }
-    
-    public int getPrerequisiteStage()
-    {
-      return prerequisiteStage;
-    }
-    
-    public boolean getIsOutput()
-    {
-      return isOutput;
-    }
-    
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-    
-    public String getDescription()
-    {
-      return description;
-    }
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
deleted file mode 100644
index 50f0e12..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
+++ /dev/null
@@ -1,10211 +0,0 @@
-/* $Id: JobManager.java 998576 2010-09-19 01:11:02Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-/** This is the main job manager.  It provides methods that support both job definition, and the threads that execute the jobs.
-*/
-public class JobManager implements IJobManager
-{
-  public static final String _rcsid = "@(#)$Id: JobManager.java 998576 2010-09-19 01:11:02Z kwright $";
-
-  protected static final String stufferLock = "_STUFFER_";
-  protected static final String reprioritizationLock = "_REPRIORITIZER_";
-  protected static final String deleteStufferLock = "_DELETESTUFFER_";
-  protected static final String expireStufferLock = "_EXPIRESTUFFER_";
-  protected static final String cleanStufferLock = "_CLEANSTUFFER_";
-  protected static final String jobStopLock = "_JOBSTOP_";
-  protected static final String jobResumeLock = "_JOBRESUME_";
-  protected static final String hopLock = "_HOPLOCK_";
-
-  // Member variables
-  protected final IDBInterface database;
-  protected final IOutputConnectionManager outputMgr;
-  protected final IRepositoryConnectionManager connectionMgr;
-  protected final INotificationConnectionManager notificationMgr;
-  protected final ITransformationConnectionManager transformationMgr;
-  
-  protected final IOutputConnectorManager outputConnectorMgr;
-  protected final IConnectorManager connectorMgr;
-  protected final ITransformationConnectorManager transformationConnectorMgr;
-  
-  protected final IRepositoryConnectorPool repositoryConnectorPool;
-  protected final ILockManager lockManager;
-  protected final IThreadContext threadContext;
-  protected final JobQueue jobQueue;
-  protected final Jobs jobs;
-  protected final HopCount hopCount;
-  protected final Carrydown carryDown;
-  protected final EventManager eventManager;
-
-
-  protected static Random random = new Random();
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database.
-  */
-  public JobManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    this.database = database;
-    this.threadContext = threadContext;
-    jobs = new Jobs(threadContext,database);
-    jobQueue = new JobQueue(threadContext,database);
-    hopCount = new HopCount(threadContext,database);
-    carryDown = new Carrydown(database);
-    eventManager = new EventManager(database);
-    outputMgr = OutputConnectionManagerFactory.make(threadContext);
-    connectionMgr = RepositoryConnectionManagerFactory.make(threadContext);
-    notificationMgr = NotificationConnectionManagerFactory.make(threadContext);
-    transformationMgr = TransformationConnectionManagerFactory.make(threadContext);
-    outputConnectorMgr = OutputConnectorManagerFactory.make(threadContext);
-    connectorMgr = ConnectorManagerFactory.make(threadContext);
-    transformationConnectorMgr = TransformationConnectorManagerFactory.make(threadContext);
-    repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-  }
-
-  /** Install.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    jobs.install(transformationMgr.getTableName(),transformationMgr.getConnectionNameColumn(),
-      outputMgr.getTableName(),outputMgr.getConnectionNameColumn(),
-      connectionMgr.getTableName(),connectionMgr.getConnectionNameColumn(),
-      notificationMgr.getTableName(),notificationMgr.getConnectionNameColumn());
-    jobQueue.install(jobs.getTableName(),jobs.idField);
-    hopCount.install(jobs.getTableName(),jobs.idField);
-    carryDown.install(jobs.getTableName(),jobs.idField);
-    eventManager.install();
-  }
-
-  /** Uninstall.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    eventManager.deinstall();
-    carryDown.deinstall();
-    hopCount.deinstall();
-    jobQueue.deinstall();
-    jobs.deinstall();
-  }
-
-  /** Export configuration */
-  @Override
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,8);
-    // Get the job list
-    IJobDescription[] list = getAllJobs();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual repository connection info
-    for (IJobDescription job : list)
-    {
-      ManifoldCF.writeString(os,job.getConnectionName());
-      ManifoldCF.writeString(os,job.getDescription());
-      ManifoldCF.writeDword(os,job.getType());
-      ManifoldCF.writeDword(os,job.getStartMethod());
-      ManifoldCF.writeLong(os,job.getInterval());
-      ManifoldCF.writeLong(os,job.getMaxInterval());
-      ManifoldCF.writeLong(os,job.getExpiration());
-      ManifoldCF.writeLong(os,job.getReseedInterval());
-      ManifoldCF.writeDword(os,job.getPriority());
-      ManifoldCF.writeDword(os,job.getHopcountMode());
-      ManifoldCF.writeString(os,job.getSpecification().toXML());
-
-      // Write schedule
-      int recCount = job.getScheduleRecordCount();
-      ManifoldCF.writeDword(os,recCount);
-      for (int j = 0; j < recCount; j++)
-      {
-        ScheduleRecord sr = job.getScheduleRecord(j);
-        writeEnumeratedValues(os,sr.getDayOfWeek());
-        writeEnumeratedValues(os,sr.getMonthOfYear());
-        writeEnumeratedValues(os,sr.getDayOfMonth());
-        writeEnumeratedValues(os,sr.getYear());
-        writeEnumeratedValues(os,sr.getHourOfDay());
-        writeEnumeratedValues(os,sr.getMinutesOfHour());
-        ManifoldCF.writeString(os,sr.getTimezone());
-        ManifoldCF.writeLong(os,sr.getDuration());
-        ManifoldCF.writeByte(os,sr.getRequestMinimum()?1:0);
-      }
-
-      // Write hop count filters
-      Map filters = job.getHopCountFilters();
-      ManifoldCF.writeDword(os,filters.size());
-      Iterator iter = filters.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String linkType = (String)iter.next();
-        Long hopcount = (Long)filters.get(linkType);
-        ManifoldCF.writeString(os,linkType);
-        ManifoldCF.writeLong(os,hopcount);
-      }
-      
-      // Write pipeline information
-      ManifoldCF.writeDword(os,job.countPipelineStages());
-      for (int j = 0; j < job.countPipelineStages(); j++)
-      {
-        ManifoldCF.writeSdword(os,job.getPipelineStagePrerequisite(j));
-        ManifoldCF.writeByte(os,job.getPipelineStageIsOutputConnection(j)?0x1:0x0);
-        ManifoldCF.writeString(os,job.getPipelineStageConnectionName(j));
-        ManifoldCF.writeString(os,job.getPipelineStageDescription(j));
-        ManifoldCF.writeString(os,job.getPipelineStageSpecification(j).toXML());
-      }
-      
-      // Write notification information
-      ManifoldCF.writeDword(os,job.countNotifications());
-      for (int j = 0; j < job.countNotifications(); j++)
-      {
-        ManifoldCF.writeString(os,job.getNotificationConnectionName(j));
-        ManifoldCF.writeString(os,job.getNotificationDescription(j));
-        ManifoldCF.writeString(os,job.getNotificationSpecification(j).toXML());
-      }
-
-    }
-  }
-
-  protected static void writeEnumeratedValues(java.io.OutputStream os, EnumeratedValues ev)
-    throws java.io.IOException
-  {
-    if (ev == null)
-    {
-      ManifoldCF.writeSdword(os,-1);
-      return;
-    }
-    int size = ev.size();
-    ManifoldCF.writeSdword(os,size);
-    Iterator iter = ev.getValues();
-    while (iter.hasNext())
-    {
-      ManifoldCF.writeDword(os,((Integer)iter.next()).intValue());
-    }
-  }
-
-  /** Import configuration */
-  @Override
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version != 5 && version != 6 && version != 8)
-      throw new java.io.IOException("Unknown job configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    for (int i = 0; i < count; i++)
-    {
-      IJobDescription job = createJob();
-
-      job.setConnectionName(ManifoldCF.readString(is));
-      job.setDescription(ManifoldCF.readString(is));
-      job.setType(ManifoldCF.readDword(is));
-      job.setStartMethod(ManifoldCF.readDword(is));
-      job.setInterval(ManifoldCF.readLong(is));
-      if (version >= 6)
-        job.setMaxInterval(ManifoldCF.readLong(is));
-      job.setExpiration(ManifoldCF.readLong(is));
-      job.setReseedInterval(ManifoldCF.readLong(is));
-      job.setPriority(ManifoldCF.readDword(is));
-      job.setHopcountMode(ManifoldCF.readDword(is));
-      job.getSpecification().fromXML(ManifoldCF.readString(is));
-
-      // Read schedule
-      int recCount = ManifoldCF.readDword(is);
-      for (int j = 0; j < recCount; j++)
-      {
-        EnumeratedValues dayOfWeek = readEnumeratedValues(is);
-        EnumeratedValues monthOfYear = readEnumeratedValues(is);
-        EnumeratedValues dayOfMonth = readEnumeratedValues(is);
-        EnumeratedValues year = readEnumeratedValues(is);
-        EnumeratedValues hourOfDay = readEnumeratedValues(is);
-        EnumeratedValues minutesOfHour = readEnumeratedValues(is);
-        String timezone = ManifoldCF.readString(is);
-        Long duration = ManifoldCF.readLong(is);
-        boolean requestMinimum = (ManifoldCF.readByte(is) != 0);
-
-        ScheduleRecord sr = new ScheduleRecord(dayOfWeek, monthOfYear, dayOfMonth, year,
-          hourOfDay, minutesOfHour, timezone, duration, requestMinimum);
-        job.addScheduleRecord(sr);
-      }
-
-      // Read hop count filters
-      int hopFilterCount = ManifoldCF.readDword(is);
-      for (int j = 0; j < hopFilterCount; j++)
-      {
-        String linkType = ManifoldCF.readString(is);
-        Long hopcount = ManifoldCF.readLong(is);
-        job.addHopCountFilter(linkType,hopcount);
-      }
-
-      // Read pipeline information
-      int pipelineCount = ManifoldCF.readDword(is);
-      for (int j = 0; j < pipelineCount; j++)
-      {
-        int prerequisite = ManifoldCF.readSdword(is);
-        int isOutput = ManifoldCF.readByte(is);
-        String connectionName = ManifoldCF.readString(is);
-        String description = ManifoldCF.readString(is);
-        String specification = ManifoldCF.readString(is);
-        job.addPipelineStage(prerequisite,isOutput == 0x1,connectionName,description).fromXML(specification);
-      }
-      
-      if (version >= 8)
-      {
-        int notificationCount = ManifoldCF.readDword(is);
-        for (int j = 0; j < notificationCount; j++)
-        {
-          String connectionName = ManifoldCF.readString(is);
-          String description = ManifoldCF.readString(is);
-          String specification = ManifoldCF.readString(is);
-          job.addNotification(connectionName, description).fromXML(specification);
-        }
-      }
-      
-      // Attempt to save this job
-      save(job);
-    }
-  }
-
-  protected EnumeratedValues readEnumeratedValues(java.io.InputStream is)
-    throws java.io.IOException
-  {
-    int size = ManifoldCF.readSdword(is);
-    if (size == -1)
-      return null;
-    int[] values = new int[size];
-    int i = 0;
-    while (i < size)
-    {
-      values[i++] = ManifoldCF.readDword(is);
-    }
-    return new EnumeratedValues(values);
-  }
-
-  /**  Note the deregistration of a connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteConnectionDeregistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteConnectionDeregistration(list);
-  }
-
-  /** Note deregistration for a batch of connection names.
-  */
-  protected void noteConnectionDeregistration(List<String> list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = database.buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(jobs.connectionNameField,list)});
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    IResultSet set = database.performQuery("SELECT "+jobs.idField+","+jobs.statusField+" FROM "+
-      jobs.getTableName()+" WHERE "+query+" FOR UPDATE",
-      newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteConnectorDeregistration(jobID,statusValue);
-    }
-  }
-
-  /** Note the registration of a connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteConnectionRegistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteConnectionRegistration(list);
-  }
-
-  /** Note registration for a batch of connection names.
-  */
-  protected void noteConnectionRegistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    ArrayList newList = new ArrayList();
-    String query = database.buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(jobs.connectionNameField,list)});
-    IResultSet set = database.performQuery("SELECT "+jobs.idField+","+jobs.statusField+" FROM "+
-      jobs.getTableName()+" WHERE "+query+" FOR UPDATE",
-      newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteConnectorRegistration(jobID,statusValue);
-    }
-  }
-
-  /**  Note the deregistration of a notification connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteNotificationConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteNotificationConnectionDeregistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteNotificationConnectionDeregistration(list);
-  }
-
-  /** Note deregistration for a batch of notification connection names.
-  */
-  protected void noteNotificationConnectionDeregistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    Long[] jobIDs = jobs.findJobsMatchingNotifications(list);
-    if (jobIDs.length == 0)
-      return;
-
-    StringBuilder query = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    query.append("SELECT ").append(jobs.idField).append(",").append(jobs.statusField)
-      .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new MultiClause(jobs.idField,jobIDs)}))
-      .append(" FOR UPDATE");
-    IResultSet set = database.performQuery(query.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteNotificationConnectorDeregistration(jobID,statusValue);
-    }
- }
-
-  /** Note the registration of a notification connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteNotificationConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteNotificationConnectionRegistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteNotificationConnectionRegistration(list);
-  }
-
-  /** Note registration for a batch of connection names.
-  */
-  protected void noteNotificationConnectionRegistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    Long[] jobIDs = jobs.findJobsMatchingNotifications(list);
-    if (jobIDs.length == 0)
-      return;
-
-    StringBuilder query = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    query.append("SELECT ").append(jobs.idField).append(",").append(jobs.statusField)
-      .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new MultiClause(jobs.idField,jobIDs)}))
-      .append(" FOR UPDATE");
-    IResultSet set = database.performQuery(query.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteNotificationConnectorDeregistration(jobID,statusValue);
-    }
-  }
-
-  /**  Note the deregistration of an output connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteOutputConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteOutputConnectionDeregistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteOutputConnectionDeregistration(list);
-  }
-
-  /** Note deregistration for a batch of output connection names.
-  */
-  protected void noteOutputConnectionDeregistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    Long[] jobIDs = jobs.findJobsMatchingOutputs(list);
-    if (jobIDs.length == 0)
-      return;
-
-    StringBuilder query = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    query.append("SELECT ").append(jobs.idField).append(",").append(jobs.statusField)
-      .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new MultiClause(jobs.idField,jobIDs)}))
-      .append(" FOR UPDATE");
-    IResultSet set = database.performQuery(query.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteOutputConnectorDeregistration(jobID,statusValue);
-    }
-  }
-
-  /** Note the registration of an output connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteOutputConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteOutputConnectionRegistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteOutputConnectionRegistration(list);
-  }
-
-  /** Note registration for a batch of output connection names.
-  */
-  protected void noteOutputConnectionRegistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    Long[] jobIDs = jobs.findJobsMatchingOutputs(list);
-    if (jobIDs.length == 0)
-      return;
-
-    StringBuilder query = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    query.append("SELECT ").append(jobs.idField).append(",").append(jobs.statusField)
-      .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new MultiClause(jobs.idField,jobIDs)}))
-      .append(" FOR UPDATE");
-    IResultSet set = database.performQuery(query.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteOutputConnectorRegistration(jobID,statusValue);
-    }
-  }
-
-  /**  Note the deregistration of a transformation connector used by the specified connections.
-  * This method will be called when the connector is deregistered.  Jobs that use these connections
-  *  must therefore enter appropriate states.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteTransformationConnectorDeregistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteConnectionDeregistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteTransformationConnectionDeregistration(list);
-  }
-
-  /** Note deregistration for a batch of transformation connection names.
-  */
-  protected void noteTransformationConnectionDeregistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    Long[] jobIDs = jobs.findJobsMatchingTransformations(list);
-    if (jobIDs.length == 0)
-      return;
-
-    StringBuilder query = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    query.append("SELECT ").append(jobs.idField).append(",").append(jobs.statusField)
-      .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new MultiClause(jobs.idField,jobIDs)}))
-      .append(" FOR UPDATE");
-    IResultSet set = database.performQuery(query.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteTransformationConnectorDeregistration(jobID,statusValue);
-    }
-  }
-
-  /** Note the registration of a transformation connector used by the specified connections.
-  * This method will be called when a connector is registered, on which the specified
-  * connections depend.
-  *@param connectionNames is the set of connection names.
-  */
-  @Override
-  public void noteTransformationConnectorRegistration(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // For each connection, find the corresponding list of jobs.  From these jobs, we want the job id and the status.
-    List<String> list = new ArrayList<String>();
-    int maxCount = database.findConjunctionClauseMax(new ClauseDescription[]{});
-    int currentCount = 0;
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      if (currentCount == maxCount)
-      {
-        noteConnectionDeregistration(list);
-        list.clear();
-        currentCount = 0;
-      }
-
-      list.add(connectionNames[i++]);
-      currentCount++;
-    }
-    if (currentCount > 0)
-      noteTransformationConnectionRegistration(list);
-  }
-
-  /** Note registration for a batch of transformation connection names.
-  */
-  protected void noteTransformationConnectionRegistration(List<String> list)
-    throws ManifoldCFException
-  {
-    // Query for the matching jobs, and then for each job potentially adjust the state
-    Long[] jobIDs = jobs.findJobsMatchingTransformations(list);
-    if (jobIDs.length == 0)
-      return;
-
-    StringBuilder query = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    query.append("SELECT ").append(jobs.idField).append(",").append(jobs.statusField)
-      .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new MultiClause(jobs.idField,jobIDs)}))
-      .append(" FOR UPDATE");
-    IResultSet set = database.performQuery(query.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long jobID = (Long)row.getValue(jobs.idField);
-      int statusValue = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-      jobs.noteTransformationConnectorRegistration(jobID,statusValue);
-    }
-  }
-
-  /** Note a change in connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external repository change
-  * is signalled.
-  */
-  @Override
-  public void noteConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    jobs.noteConnectionChange(connectionName);
-  }
-
-  /** Note a change in notification connection configuration.
-  * This method will be called whenever a notification connection's configuration is modified, or when an external repository change
-  * is signalled.
-  */
-  @Override
-  public void noteNotificationConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    jobs.noteConnectionChange(connectionName);
-  }
-
-  /** Note a change in output connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external target config change
-  * is signalled.
-  */
-  @Override
-  public void noteOutputConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    jobs.noteOutputConnectionChange(connectionName);
-  }
-
-  /** Note a change in transformation connection configuration.
-  * This method will be called whenever a connection's configuration is modified.
-  */
-  @Override
-  public void noteTransformationConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    jobs.noteTransformationConnectionChange(connectionName);
-  }
-
-  /** Assess jobs marked to be in need of assessment for connector status changes.
-  */
-  public void assessMarkedJobs()
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Query for all jobs marked "ASSESSMENT_UNKNOWN".
-        jobs.assessMarkedJobs();
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction assessing jobs: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Load a sorted list of job descriptions.
-  *@return the list, sorted by description.
-  */
-  @Override
-  public IJobDescription[] getAllJobs()
-    throws ManifoldCFException
-  {
-    return jobs.getAll();
-  }
-
-  /** Create a new job.
-  *@return the new job.
-  */
-  @Override
-  public IJobDescription createJob()
-    throws ManifoldCFException
-  {
-    return jobs.create();
-  }
-
-  /** Get the hoplock for a given job ID */
-  protected String getHopLockName(Long jobID)
-  {
-    return hopLock + jobID;
-  }
-
-
-
-  /** Delete a job.
-  *@param id is the job's identifier.  This method will purge all the records belonging to the job from the database, as
-  * well as remove all documents indexed by the job from the index.
-  */
-  @Override
-  public void deleteJob(Long id)
-    throws ManifoldCFException
-  {
-    database.beginTransaction();
-    try
-    {
-      // If the job is running, throw an error
-      ArrayList list = new ArrayList();
-      String query = database.buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(jobs.idField,id)});
-      IResultSet set = database.performQuery("SELECT "+jobs.statusField+" FROM "+
-        jobs.getTableName()+" WHERE "+query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Attempting to delete a job that doesn't exist: "+id);
-      IResultRow row = set.getRow(0);
-      int status = jobs.stringToStatus(row.getValue(jobs.statusField).toString());
-      if (status == jobs.STATUS_ACTIVE || status == jobs.STATUS_ACTIVESEEDING ||
-        status == jobs.STATUS_ACTIVE_UNINSTALLED || status == jobs.STATUS_ACTIVESEEDING_UNINSTALLED)
-      throw new ManifoldCFException("Job "+id+" is active; you must shut it down before deleting it");
-      if (status != jobs.STATUS_INACTIVE)
-        throw new ManifoldCFException("Job "+id+" is busy; you must wait and/or shut it down before deleting it");
-      jobs.writePermanentStatus(id,jobs.STATUS_READYFORDELETE,true);
-      Logging.jobs.info("Job "+id+" marked for deletion");
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-
-  }
-
-  /** Load a job for editing.
-  *@param id is the job's identifier.
-  *@return null if the job doesn't exist.
-  */
-  @Override
-  public IJobDescription load(Long id)
-    throws ManifoldCFException
-  {
-    return jobs.load(id,false);
-  }
-
-  /** Load a job.
-  *@param id is the job's identifier.
-  *@param readOnly is true if a read-only object is desired.
-  *@return null if the job doesn't exist.
-  */
-  @Override
-  public IJobDescription load(Long id, boolean readOnly)
-    throws ManifoldCFException
-  {
-    return jobs.load(id,readOnly);
-  }
-
-  /** Save a job.
-  *@param jobDescription is the job description.
-  */
-  @Override
-  public void save(IJobDescription jobDescription)
-    throws ManifoldCFException
-  {
-    ManifoldCF.noteConfigurationChange();
-    jobs.save(jobDescription);
-  }
-
-  /** See if there's a reference to a connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  @Override
-  public boolean checkIfReference(String connectionName)
-    throws ManifoldCFException
-  {
-    return jobs.checkIfReference(connectionName);
-  }
-
-  /** See if there's a reference to a notification connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  @Override
-  public boolean checkIfNotificationReference(String connectionName)
-    throws ManifoldCFException
-  {
-    return jobs.checkIfNotificationReference(connectionName);
-  }
-
-  /** See if there's a reference to an output connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  @Override
-  public boolean checkIfOutputReference(String connectionName)
-    throws ManifoldCFException
-  {
-    return jobs.checkIfOutputReference(connectionName);
-  }
-
-  /** See if there's a reference to a transformation connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  @Override
-  public boolean checkIfTransformationReference(String connectionName)
-    throws ManifoldCFException
-  {
-    return jobs.checkIfTransformationReference(connectionName);
-  }
-
-  /** Get the job IDs associated with a given connection name.
-  *@param connectionName is the name of the connection.
-  *@return the set of job id's associated with that connection.
-  */
-  @Override
-  public IJobDescription[] findJobsForConnection(String connectionName)
-    throws ManifoldCFException
-  {
-    return jobs.findJobsForConnection(connectionName);
-  }
-
-  /** Clear job seeding state.
-  *@param jobID is the job ID.
-  */
-  @Override
-  public void clearJobSeedingState(Long jobID)
-    throws ManifoldCFException
-  {
-    jobs.clearSeedingState(jobID);
-  }
-
-  // These methods cover activities that require interaction with the job queue.
-  // The job queue is maintained underneath this interface, and all threads that perform
-  // job activities need to go through this layer.
-
-  /** Reset the job queue for an individual process ID.
-  * If a node was shut down in the middle of doing something, sufficient information should
-  * be around in the database to allow the node's activities to be cleaned up.
-  *@param processID is the process ID of the node we want to clean up after.
-  */
-  @Override
-  public void cleanupProcessData(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Cleaning up process data for process '"+processID+"'");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Clean up events
-        eventManager.restart(processID);
-        // Clean up job queue
-        jobQueue.restart(processID);
-        // Clean up jobs
-        jobs.restart(processID);
-        // Clean up hopcount stuff
-        hopCount.restart(processID);
-        // Clean up carrydown stuff
-        carryDown.restart(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        Logging.jobs.info("Cleanup complete");
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting for restart: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset the job queue for all process IDs.
-  * If a node was shut down in the middle of doing something, sufficient information should
-  * be around in the database to allow the node's activities to be cleaned up.
-  */
-  @Override
-  public void cleanupProcessData()
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Cleaning up all process data");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Clean up events
-        eventManager.restart();
-        // Clean up job queue
-        jobQueue.restart();
-        // Clean up jobs
-        jobs.restart();
-        // Clean up hopcount stuff
-        hopCount.restart();
-        // Clean up carrydown stuff
-        carryDown.restart();
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        Logging.jobs.info("Cleanup complete");
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting for restart: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Prepare to start the entire cluster.
-  * If there are no other nodes alive, then at the time the first node comes up, we need to
-  * reset the job queue for ALL processes that had been running before.  This method must
-  * be called in addition to cleanupProcessData().
-  */
-  @Override
-  public void prepareForClusterStart()
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Starting cluster");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Clean up events
-        eventManager.restartCluster();
-        // Clean up job queue
-        jobQueue.restartCluster();
-        // Clean up jobs
-        jobs.restartCluster();
-        // Clean up hopcount stuff
-        hopCount.restartCluster();
-        // Clean up carrydown stuff
-        carryDown.restartCluster();
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        Logging.jobs.info("Cluster start complete");
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction starting cluster: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset as part of restoring document worker threads.
-  *@param processID is the current process ID.
-  */
-  @Override
-  public void resetDocumentWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting document active status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobQueue.resetDocumentWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting document active status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-    Logging.jobs.info("Reset complete");
-  }
-
-  /** Reset as part of restoring seeding threads.
-  *@param processID is the current process ID.
-  */
-  @Override
-  public void resetSeedingWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting seeding status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.resetSeedingWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting seeding worker status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Reset complete");
-  }
-
-  /** Reset as part of restoring doc delete threads.
-  *@param processID is the current process ID.
-  */
-  @Override
-  public void resetDocDeleteWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting doc deleting status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobQueue.resetDocDeleteWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting doc deleting worker status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Reset complete");
-  }
-
-  /** Reset as part of restoring doc cleanup threads.
-  *@param processID is the current process ID.
-  */
-  @Override
-  public void resetDocCleanupWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting doc cleaning status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobQueue.resetDocCleanupWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting doc cleaning status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Reset complete");
-  }
-
-  /** Reset as part of restoring delete startup threads.
-  *@param processID is the current process ID.
-  */
-  @Override
-  public void resetDeleteStartupWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting job delete starting up status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.resetDeleteStartupWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting job delete starting up status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Reset complete");
-  }
-
-  /** Reset as part of restoring notification threads.
-  */
-  @Override
-  public void resetNotificationWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting notification worker status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.resetNotificationWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting notification worker status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Reset complete");
-  }
-
-  /** Reset as part of restoring startup threads.
-  */
-  @Override
-  public void resetStartupWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Resetting job starting up status");
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.resetStartupWorkerStatus(processID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting job starting up status: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Reset complete");
-  }
-
-  // These methods support job delete threads
-
-  /** Delete ingested document identifiers (as part of deleting the owning job).
-  * The number of identifiers specified is guaranteed to be less than the maxInClauseCount
-  * for the database.
-  *@param identifiers is the set of document identifiers.
-  */
-  @Override
-  public void deleteIngestedDocumentIdentifiers(DocumentDescription[] identifiers)
-    throws ManifoldCFException
-  {
-    jobQueue.deleteIngestedDocumentIdentifiers(identifiers);
-    // Hopcount rows get removed when the job itself is removed.
-    // carrydown records get removed when the job itself is removed.
-  }
-
-  /** Get list of cleanable document descriptions.  This list will take into account
-  * multiple jobs that may own the same document.  All documents for which a description
-  * is returned will be transitioned to the "beingcleaned" state.  Documents which are
-  * not in transition and are eligible, but are owned by other jobs, will have their
-  * jobqueue entries deleted by this method.
-  *@param processID is the current process ID.
-  *@param maxCount is the maximum number of documents to return.
-  *@param currentTime is the current time; some fetches do not occur until a specific time.
-  *@return the document descriptions for these documents.
-  */
-  @Override
-  public DocumentSetAndFlags getNextCleanableDocuments(String processID, int maxCount, long currentTime)
-    throws ManifoldCFException
-  {
-    // The query will be built here, because it joins the jobs table against the jobqueue
-    // table.
-    //
-    // This query must only pick up documents that are not active in any job and
-    // which belong to a job that's in a "shutting down" state and are in
-    // a "purgatory" state.
-    //
-    // We are in fact more conservative in this query than we need to be; the documents
-    // excluded will include some that simply match our criteria, which is designed to
-    // be fast rather than perfect.  The match we make is: hashvalue against hashvalue, and
-    // different job id's.
-    //
-    // SELECT id,jobid,docid FROM jobqueue t0 WHERE t0.status='P' AND EXISTS(SELECT 'x' FROM
-    //              jobs t3 WHERE t0.jobid=t3.id AND t3.status='X')
-    //      AND NOT EXISTS(SELECT 'x' FROM jobqueue t2 WHERE t0.hashval=t2.hashval AND t0.jobid!=t2.jobid
-    //              AND t2.status IN ('A','F','B'))
-    //
-
-    // Do a simple preliminary query, since the big query is currently slow, so that we don't waste time during stasis or
-    // ingestion.
-    // Moved outside of transaction, so we have no chance of locking up job status cache key for an extended period of time.
-    if (!jobs.cleaningJobsPresent())
-      return new DocumentSetAndFlags(new DocumentDescription[0],new boolean[0]);
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to find documents to put on the cleaning queue");
-    }
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      
-      // Enter a write lock.  This means we don't need a FOR UPDATE on the query.
-      lockManager.enterWriteLock(cleanStufferLock);
-      try
-      {
-        database.beginTransaction();
-        try
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("After "+new Long(System.currentTimeMillis()-startTime).toString()+" ms, beginning query to look for documents to put on cleaning queue");
-
-          // Note: This query does not do "FOR UPDATE", because it is running under the only thread that can possibly change the document's state to "being cleaned".
-          ArrayList list = new ArrayList();
-          
-          StringBuilder sb = new StringBuilder("SELECT ");
-          sb.append(jobQueue.idField).append(",")
-            .append(jobQueue.jobIDField).append(",")
-            .append(jobQueue.docHashField).append(",")
-            .append(jobQueue.docIDField).append(",")
-            .append(jobQueue.failTimeField).append(",")
-            .append(jobQueue.failCountField)
-            .append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause("t0."+jobQueue.statusField,jobQueue.statusToString(jobQueue.STATUS_PURGATORY))})).append(" AND ")
-            .append("(t0.").append(jobQueue.checkTimeField).append(" IS NULL OR t0.").append(jobQueue.checkTimeField).append("<=?) AND ");
-            
-          list.add(new Long(currentTime));
-
-          sb.append("EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause("t1."+jobs.statusField,jobs.statusToString(jobs.STATUS_SHUTTINGDOWN)),
-              new JoinClause("t1."+jobs.idField,"t0."+jobQueue.jobIDField)}))
-            .append(") AND ");
-          
-          sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.getTableName()).append(" t2 WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new JoinClause("t2."+jobQueue.docHashField,"t0."+jobQueue.docHashField),
-              new MultiClause("t2."+jobQueue.statusField,new String[]{
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-                jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED),
-                jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED)}),
-              new JoinClause("t2."+jobQueue.jobIDField,"t0."+jobQueue.jobIDField,"!=")}))
-            .append(") ");
-            
-          sb.append(database.constructOffsetLimitClause(0,maxCount));
-          
-          // The checktime is null field check is for backwards compatibility
-          IResultSet set = database.performQuery(sb.toString(),list,null,null,maxCount,null);
-
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Done getting docs to cleaning queue after "+new Long(System.currentTimeMillis()-startTime).toString()+" ms.");
-
-          // We need to organize the returned set by connection name and output connection name, so that we can efficiently
-          // use  getUnindexableDocumentIdentifiers.
-          // This is a table keyed by connection name and containing an ArrayList, which in turn contains DocumentDescription
-          // objects.
-          Map<String,List<DocumentDescription>> connectionNameMap = new HashMap<String,List<DocumentDescription>>();
-          Map<String,DocumentDescription> documentIDMap = new HashMap<String,DocumentDescription>();
-          for (int i = 0; i < set.getRowCount(); i++)
-          {
-            IResultRow row = set.getRow(i);
-            Long jobID = (Long)row.getValue(jobQueue.jobIDField);
-            String documentIDHash = (String)row.getValue(jobQueue.docHashField);
-            String documentID = (String)row.getValue(jobQueue.docIDField);
-            Long failTimeValue = (Long)row.getValue(jobQueue.failTimeField);
-            Long failCountValue = (Long)row.getValue(jobQueue.failCountField);
-            // Failtime is probably not useful in this context, but we'll bring it along for completeness
-            long failTime;
-            if (failTimeValue == null)
-              failTime = -1L;
-            else
-              failTime = failTimeValue.longValue();
-            int failCount;
-            if (failCountValue == null)
-              failCount = 0;
-            else
-              failCount = (int)failCountValue.longValue();
-            IJobDescription jobDesc = load(jobID);
-            String connectionName = jobDesc.getConnectionName();
-            DocumentDescription dd = new DocumentDescription((Long)row.getValue(jobQueue.idField),
-              jobID,documentIDHash,documentID,failTime,failCount);
-            String compositeDocumentID = makeCompositeID(documentIDHash,connectionName);
-            documentIDMap.put(compositeDocumentID,dd);
-            List<DocumentDescription> x = connectionNameMap.get(connectionName);
-            if (x == null)
-            {
-              // New entry needed
-              x = new ArrayList<DocumentDescription>();
-              connectionNameMap.put(connectionName,x);
-            }
-            x.add(dd);
-          }
-
-          // For each bin, obtain a filtered answer, and enter all answers into a hash table.
-          // We'll then scan the result again to look up the right descriptions for return,
-          // and delete the ones that are owned multiply.
-          Map<String,String> allowedDocIds = new HashMap<String,String>();
-          Iterator<String> iter = connectionNameMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            String connectionName = iter.next();
-            List<DocumentDescription> x = connectionNameMap.get(connectionName);
-            // Do the filter query
-            DocumentDescription[] descriptions = new DocumentDescription[x.size()];
-            for (int j = 0; j < descriptions.length; j++)
-            {
-              descriptions[j] = (DocumentDescription)x.get(j);
-            }
-            String[] docIDHashes = getUnindexableDocumentIdentifiers(descriptions,connectionName);
-            for (String docIDHash : docIDHashes)
-            {
-              String key = makeCompositeID(docIDHash,connectionName);
-              allowedDocIds.put(key,docIDHash);
-            }
-          }
-
-          // Now, assemble a result, and change the state of the records accordingly
-          // First thing to do is order by document hash, so we reduce the risk of deadlock.
-          String[] compositeIDArray = new String[documentIDMap.size()];
-          int j = 0;
-          iter = documentIDMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            compositeIDArray[j++] = iter.next();
-          }
-          
-          java.util.Arrays.sort(compositeIDArray);
-          
-          DocumentDescription[] rval = new DocumentDescription[documentIDMap.size()];
-          boolean[] rvalBoolean = new boolean[documentIDMap.size()];
-          for (int i = 0; i < compositeIDArray.length; i++)
-          {
-            String compositeDocID = compositeIDArray[i];
-            DocumentDescription dd = documentIDMap.get(compositeDocID);
-            // Determine whether we can delete it from the index or not
-            rvalBoolean[i] = (allowedDocIds.get(compositeDocID) != null);
-            // Set the record status to "being cleaned" and return it
-            rval[i] = dd;
-            jobQueue.setCleaningStatus(dd.getID(),processID);
-          }
-
-          TrackerClass.notePrecommit();
-          database.performCommit();
-          TrackerClass.noteCommit();
-          
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Done pruning unindexable docs after "+new Long(System.currentTimeMillis()-startTime).toString()+" ms.");
-
-          return new DocumentSetAndFlags(rval,rvalBoolean);
-
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          TrackerClass.noteRollback();
-          throw e;
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          TrackerClass.noteRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction finding deleteable docs: "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(cleanStufferLock);
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Create a composite document hash key.  This consists of the document id hash plus the
-  * connection name.
-  */
-  protected static String makeCompositeID(String docIDHash, String connectionName)
-  {
-    return docIDHash + ":" + connectionName;
-  }
-  
-  /** Get list of deletable document descriptions.  This list will take into account
-  * multiple jobs that may own the same document.  All documents for which a description
-  * is returned will be transitioned to the "beingdeleted" state.  Documents which are
-  * not in transition and are eligible, but are owned by other jobs, will have their
-  * jobqueue entries deleted by this method.
-  *@param processID is the current process ID.
-  *@param maxCount is the maximum number of documents to return.
-  *@param currentTime is the current time; some fetches do not occur until a specific time.
-  *@return the document descriptions for these documents.
-  */
-  @Override
-  public DocumentDescription[] getNextDeletableDocuments(String processID,
-    int maxCount, long currentTime)
-    throws ManifoldCFException
-  {
-    // The query will be built here, because it joins the jobs table against the jobqueue
-    // table.
-    //
-    // This query must only pick up documents that are not active in any job and
-    // which either belong to a job that's in a "delete pending" state and are in
-    // a "complete", "purgatory", or "pendingpurgatory" state, OR belong to a job
-    // that's in a "shutting down" state and are in the "purgatory" state.
-    //
-    // We are in fact more conservative in this query than we need to be; the documents
-    // excluded will include some that simply match our criteria, which is designed to
-    // be fast rather than perfect.  The match we make is: hashvalue against hashvalue, and
-    // different job id's.
-    //
-    // SELECT id,jobid,docid FROM jobqueue t0 WHERE (t0.status IN ('C','P','G') AND EXISTS(SELECT 'x' FROM
-    //      jobs t1 WHERE t0.jobid=t1.id AND t1.status='D')
-    //      AND NOT EXISTS(SELECT 'x' FROM jobqueue t2 WHERE t0.hashval=t2.hashval AND t0.jobid!=t2.jobid
-    //              AND t2.status IN ('A','F','B'))
-    //
-
-    // Do a simple preliminary query, since the big query is currently slow, so that we don't waste time during stasis or
-    // ingestion.
-    // Moved outside of transaction, so we have no chance of locking up job status cache key for an extended period of time.
-    if (!jobs.deletingJobsPresent())
-      return new DocumentDescription[0];
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to find documents to put on the delete queue");
-    }
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      
-      // Enter a write lock so that multiple threads can't be in here at the same time
-      lockManager.enterWriteLock(deleteStufferLock);
-      try
-      {
-        database.beginTransaction();
-        try
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("After "+new Long(System.currentTimeMillis()-startTime).toString()+" ms, beginning query to look for documents to put on delete queue");
-
-          // Note: This query does not do "FOR UPDATE", because it is running under the only thread that can possibly change the document's state to "being deleted".
-          // If FOR UPDATE was included, deadlock happened a lot.
-          ArrayList list = new ArrayList();
-          StringBuilder sb = new StringBuilder("SELECT ");
-          sb.append(jobQueue.idField).append(",")
-            .append(jobQueue.jobIDField).append(",")
-            .append(jobQueue.docHashField).append(",")
-            .append(jobQueue.docIDField).append(",")
-            .append(jobQueue.failTimeField).append(",")
-            .append(jobQueue.failCountField).append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause("t0."+jobQueue.statusField,jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE))})).append(" AND ")
-            .append("t0.").append(jobQueue.checkTimeField).append("<=? AND ");
-          
-          list.add(new Long(currentTime));
-          
-          sb.append("EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause("t1."+jobs.statusField,jobs.statusToString(jobs.STATUS_DELETING)),
-              new JoinClause("t1."+jobs.idField,"t0."+jobQueue.jobIDField)})).append(") AND ");
-            
-          sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.getTableName()).append(" t2 WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new JoinClause("t2."+jobQueue.docHashField,"t0."+jobQueue.docHashField),
-              new MultiClause("t2."+jobQueue.statusField,new String[]{
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-                jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED),
-                jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED)}),
-              new JoinClause("t2."+jobQueue.jobIDField,"t0."+jobQueue.jobIDField,"!=")}))
-            .append(") ");
-            
-          sb.append(database.constructOffsetLimitClause(0,maxCount));
-          
-          // The checktime is null field check is for backwards compatibility
-          IResultSet set = database.performQuery(sb.toString(),list,null,null,maxCount,null);
-
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Done getting docs to delete queue after "+new Long(System.currentTimeMillis()-startTime).toString()+" ms.");
-
-          // We need to organize the returned set by connection name, so that we can efficiently
-          // use  getUnindexableDocumentIdentifiers.
-          // This is a table keyed by connection name and containing an ArrayList, which in turn contains DocumentDescription
-          // objects.
-          Map<String,List<DocumentDescription>> connectionNameMap = new HashMap<String,List<DocumentDescription>>();
-          Map<String,DocumentDescription> documentIDMap = new HashMap<String,DocumentDescription>();
-          for (int i = 0; i < set.getRowCount(); i++)
-          {
-            IResultRow row = set.getRow(i);
-            Long jobID = (Long)row.getValue(jobQueue.jobIDField);
-            String documentIDHash = (String)row.getValue(jobQueue.docHashField);
-            String documentID = (String)row.getValue(jobQueue.docIDField);
-            Long failTimeValue = (Long)row.getValue(jobQueue.failTimeField);
-            Long failCountValue = (Long)row.getValue(jobQueue.failCountField);
-            // Failtime is probably not useful in this context, but we'll bring it along for completeness
-            long failTime;
-            if (failTimeValue == null)
-              failTime = -1L;
-            else
-              failTime = failTimeValue.longValue();
-            int failCount;
-            if (failCountValue == null)
-              failCount = 0;
-            else
-              failCount = (int)failCountValue.longValue();
-            IJobDescription jobDesc = load(jobID);
-            String connectionName = jobDesc.getConnectionName();
-            DocumentDescription dd = new DocumentDescription((Long)row.getValue(jobQueue.idField),
-              jobID,documentIDHash,documentID,failTime,failCount);
-            String compositeDocumentID = makeCompositeID(documentIDHash,connectionName);
-            documentIDMap.put(compositeDocumentID,dd);
-            List<DocumentDescription> x = connectionNameMap.get(connectionName);
-            if (x == null)
-            {
-              // New entry needed
-              x = new ArrayList<DocumentDescription>();
-              connectionNameMap.put(connectionName,x);
-            }
-            x.add(dd);
-          }
-
-          // For each bin, obtain a filtered answer, and enter all answers into a hash table.
-          // We'll then scan the result again to look up the right descriptions for return,
-          // and delete the ones that are owned multiply.
-          Map<String,String> allowedDocIds = new HashMap<String,String>();
-          Iterator<String> iter = connectionNameMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            String connectionName = iter.next();
-            List<DocumentDescription> x = connectionNameMap.get(connectionName);
-            // Do the filter query
-            DocumentDescription[] descriptions = new DocumentDescription[x.size()];
-            for (int j = 0; j < descriptions.length; j++)
-            {
-              descriptions[j] = x.get(j);
-            }
-            String[] docIDHashes = getUnindexableDocumentIdentifiers(descriptions,connectionName);
-            for (int j = 0; j < docIDHashes.length; j++)
-            {
-              String docIDHash = docIDHashes[j];
-              String key = makeCompositeID(docIDHash,connectionName);
-              allowedDocIds.put(key,docIDHash);
-            }
-          }
-
-          // Now, assemble a result, and change the state of the records accordingly
-          // First thing to do is order by document hash to reduce chances of deadlock.
-          String[] compositeIDArray = new String[documentIDMap.size()];
-          int j = 0;
-          iter = documentIDMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            compositeIDArray[j++] = iter.next();
-          }
-          
-          java.util.Arrays.sort(compositeIDArray);
-          
-          DocumentDescription[] rval = new DocumentDescription[allowedDocIds.size()];
-          j = 0;
-          for (int i = 0; i < compositeIDArray.length; i++)
-          {
-            String compositeDocumentID = compositeIDArray[i];
-            DocumentDescription dd = documentIDMap.get(compositeDocumentID);
-            if (allowedDocIds.get(compositeDocumentID) == null)
-            {
-              // Delete this record and do NOT return it.
-              jobQueue.deleteRecord(dd.getID());
-              // What should we do about hopcount here?
-              // We are deleting a record which belongs to a job that is being
-              // cleaned up.  The job itself will go away when this is done,
-              // and so will all the hopcount stuff pertaining to it.  So, the
-              // treatment I've chosen here is to leave the hopcount alone and
-              // let the job cleanup get rid of it at the right time.
-              // Note: carrydown records handled in the same manner...
-              //carryDown.deleteRecords(dd.getJobID(),new String[]{dd.getDocumentIdentifier()});
-            }
-            else
-            {
-              // Set the record status to "being deleted" and return it
-              rval[j++] = dd;
-              jobQueue.setDeletingStatus(dd.getID(),processID);
-            }
-          }
-
-          TrackerClass.notePrecommit();
-          database.performCommit();
-          TrackerClass.noteCommit();
-          
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Done pruning unindexable docs after "+new Long(System.currentTimeMillis()-startTime).toString()+" ms.");
-
-          return rval;
-
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          TrackerClass.noteRollback();
-          throw e;
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          TrackerClass.noteRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction finding deleteable docs: "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(deleteStufferLock);
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Get a list of document identifiers that should actually be deleted from the index, from a list that
-  * might contain identifiers that are shared with other jobs, which are targeted to the same output connection.
-  * The input list is guaranteed to be smaller in size than maxInClauseCount for the database.
-  *@param documentIdentifiers is the set of document identifiers to consider.
-  *@param connectionName is the connection name for ALL the document identifiers.
-  *@return the set of documents which should be removed from the index, where there are no potential conflicts.
-  */
-  protected String[] getUnindexableDocumentIdentifiers(DocumentDescription[] documentIdentifiers, String connectionName)
-    throws ManifoldCFException
-  {
-    // This is where we will count the individual document id's
-    Map<String,MutableInteger> countMap = new HashMap<String,MutableInteger>();
-
-    // First thing: Compute the set of document identifier hash values to query against
-    Set<String> map = new HashSet<String>();
-    for (int i = 0; i < documentIdentifiers.length; i++)
-    {
-      String hash = documentIdentifiers[i].getDocumentIdentifierHash();
-      map.add(hash);
-      countMap.put(hash,new MutableInteger(0));
-    }
-
-    if (map.size() == 0)
-      return new String[0];
-
-    // Build a query
-    StringBuilder sb = new StringBuilder();
-    ArrayList list = new ArrayList();
-    
-    List<String> docList = new ArrayList<String>();
-    Iterator<String> iter = map.iterator();
-    while (iter.hasNext())
-    {
-      docList.add(iter.next());
-    }
-
-    // Note: There is a potential race condition here.  One job may be running while another is in process of
-    // being deleted.  If they share a document, then the delete task could decide to delete the document and do so right
-    // after the ingestion takes place in the running job, but right before the document's status is updated
-    // in the job queue [which would have prevented the deletion].
-    // Unless a transaction is thrown around the time ingestion is taking place (which is a very bad idea)
-    // we are stuck with the possibility of this condition, which will essentially lead to a document being
-    // missing from the index.
-    // One way of dealing with this is to treat "active" documents as already ingested, for the purpose of
-    // reference counting.  Then these documents will not be deleted.  The risk then becomes that the "active"
-    // document entry will not be completed (say, because of a restart), and thus the corresponding document
-    // will never be removed from the index.
-    //
-    // Instead, the only solution is to not queue a document for any activity that is inconsistent with activities
-    // that may already be ongoing for that document.  For this reason, I have introduced a "BEING_DELETED"
-    // and "BEING_CLEANED" state
-    // for a document.  These states will allow the various queries that queue up activities to avoid documents that
-    // are currently being processed elsewhere.
-
-    sb.append("SELECT t0.").append(jobQueue.docHashField).append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new MultiClause("t0."+jobQueue.docHashField,docList)})).append(" AND ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?,?,?,?) AND ");
-
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_UNCHANGED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE));
-    
-    sb.append("EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new JoinClause("t1."+jobs.idField,"t0."+jobQueue.jobIDField)})).append(" AND ")
-      .append("t1.").append(jobs.connectionNameField).append("=?)");
-
-    list.add(connectionName);
-
-    // Do the query, and then count the number of times each document identifier occurs.
-    IResultSet results = database.performQuery(sb.toString(),list,null,null);
-    for (int i = 0; i < results.getRowCount(); i++)
-    {
-      IResultRow row = results.getRow(i);
-      String docIDHash = (String)row.getValue(jobQueue.docHashField);
-      MutableInteger mi = (MutableInteger)countMap.get(docIDHash);
-      if (mi != null)
-        mi.increment();
-    }
-
-    // Go through and count only those that have a count of 1.
-    int count = 0;
-    iter = countMap.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String docIDHash = iter.next();
-      MutableInteger mi = countMap.get(docIDHash);
-      if (mi.intValue() == 1)
-        count++;
-    }
-
-    String[] rval = new String[count];
-    iter = countMap.keySet().iterator();
-    count = 0;
-    while (iter.hasNext())
-    {
-      String docIDHash = iter.next();
-      MutableInteger mi = countMap.get(docIDHash);
-      if (mi.intValue() == 1)
-        rval[count++] = docIDHash;
-    }
-
-    return rval;
-  }
-
-  // These methods support the reprioritization thread.
-
-  /** Clear all document priorities, in preparation for reprioritization of all previously-prioritized documents.
-  * This method is called to start the dynamic reprioritization cycle, which follows this
-  * method with explicit prioritization of all documents, piece-meal, using getNextNotYetProcessedReprioritizationDocuments(),
-  * and writeDocumentPriorities().
-  */
-  public void clearAllDocumentPriorities()
-    throws ManifoldCFException
-  {
-    // Note: This can be called at any time, even while worker and seeding threads are also reprioritizing documents.
-    
-    // Retry loop - in case we get a deadlock despite our best efforts
-    while (true)
-    {
-      long sleepAmt = 0L;
-
-      // Start the transaction now
-      database.beginTransaction();
-      try
-      {
-        jobQueue.clearAllDocPriorities();
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction clearing doc priorities for reprioritization: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Get a list of not-yet-processed documents to reprioritize.  Documents in all jobs will be
-  * returned by this method.  Up to n document descriptions will be returned.
-  *@param processID is the process that requests the reprioritization documents.
-  *@param n is the maximum number of document descriptions desired.
-  *@return the document descriptions.
-  */
-  @Override
-  public DocumentDescription[] getNextNotYetProcessedReprioritizationDocuments(String processID, int n)
-    throws ManifoldCFException
-  {
-    // Retry loop - in case we get a deadlock despite our best efforts
-    while (true)
-    {
-      long sleepAmt = 0L;
-
-      // Write lock insures that only one thread cluster-wide can be doing this at a given time, so FOR UPDATE is unneeded.
-      lockManager.enterWriteLock(reprioritizationLock);
-      try
-      {
-        // Start the transaction now
-        database.beginTransaction();
-        try
-        {
-
-          StringBuilder sb = new StringBuilder("SELECT ");
-          ArrayList list = new ArrayList();
-
-          // This query MUST return only documents that are in a pending state which belong to an active job!!!
-
-          sb.append(jobQueue.idField).append(",")
-            .append(jobQueue.docHashField).append(",")
-            .append(jobQueue.docIDField).append(",")
-            .append(jobQueue.jobIDField)
-            .append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobQueue.needPriorityField,jobQueue.needPriorityToString(JobQueue.NEEDPRIORITY_TRUE))})).append(" ")
-            .append(database.constructOffsetLimitClause(0,n));
-
-          // Analyze jobqueue tables unconditionally, since it's become much more sensitive in 8.3 than it used to be.
-          //jobQueue.unconditionallyAnalyzeTables();
-
-          //IResultSet set = database.performQuery(sb.toString(),list,null,null,n,null);
-          IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-          DocumentDescription[] rval = new DocumentDescription[set.getRowCount()];
-          // To avoid deadlock, we want to update the document id hashes in order.  This means reading into a structure I can sort by docid hash,
-          // before updating any rows in jobqueue.
-          String[] docIDHashes = new String[set.getRowCount()];
-          Map<String,DocumentDescription> storageMap = new HashMap<String,DocumentDescription>();
-
-          for (int i = 0 ; i < set.getRowCount() ; i++)
-          {
-            IResultRow row = set.getRow(i);
-            String docHash = (String)row.getValue(jobQueue.docHashField);
-            Long jobID = (Long)row.getValue(jobQueue.jobIDField);
-            rval[i] = new DocumentDescription((Long)row.getValue(jobQueue.idField),
-              jobID,
-              docHash,
-              (String)row.getValue(jobQueue.docIDField));
-            // Compute the doc ID hash
-            docIDHashes[i] = docHash + ":" + jobID;
-            storageMap.put(docIDHashes[i],rval[i]);
-          }
-          
-          java.util.Arrays.sort(docIDHashes);
-          for (String docIDHash : docIDHashes)
-          {
-            DocumentDescription dd = storageMap.get(docIDHash);
-            jobQueue.markNeedPriorityInProgress(dd.getID(),processID);
-          }
-
-          database.performCommit();
-          return rval;
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction finding documents for reprioritization: "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(reprioritizationLock);
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Save a set of document priorities.  In the case where a document was eligible to have its
-  * priority set, but it no longer is eligible, then the provided priority will not be written.
-  *@param documentDescriptions are the document descriptions.
-  *@param priorities are the desired priorities.
-  */
-  @Override
-  public void writeDocumentPriorities(DocumentDescription[] documentDescriptions, IPriorityCalculator[] priorities)
-    throws ManifoldCFException
-  {
-
-    // Retry loop - in case we get a deadlock despite our best efforts
-    while (true)
-    {
-      // This should be ordered by document identifier hash in order to prevent potential deadlock conditions
-      Map<String,Integer> indexMap = new HashMap<String,Integer>();
-      String[] docIDHashes = new String[documentDescriptions.length];
-
-      for (int i = 0; i < documentDescriptions.length; i++)
-      {
-        String documentIDHash = documentDescriptions[i].getDocumentIdentifierHash() + ":"+documentDescriptions[i].getJobID();
-        docIDHashes[i] = documentIDHash;
-        indexMap.put(documentIDHash,new Integer(i));
-      }
-
-      java.util.Arrays.sort(docIDHashes);
-
-      long sleepAmt = 0L;
-
-      // Start the transaction now
-      database.beginTransaction();
-      try
-      {
-
-        // Need to order the writes by doc id.
-        for (int i = 0; i < docIDHashes.length; i++)
-        {
-          String docIDHash = docIDHashes[i];
-          Integer x = indexMap.remove(docIDHash);
-          if (x == null)
-            throw new ManifoldCFException("Assertion failure: duplicate document identifier jobid/hash detected!");
-          int index = x.intValue();
-          DocumentDescription dd = documentDescriptions[index];
-          // Query for the status
-          ArrayList list = new ArrayList();
-          String query = database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobQueue.idField,dd.getID())});
-          IResultSet set = database.performQuery("SELECT "+jobQueue.needPriorityField+" FROM "+jobQueue.getTableName()+" WHERE "+
-            query+" FOR UPDATE",list,null,null);
-          if (set.getRowCount() > 0)
-          {
-            IResultRow row = set.getRow(0);
-            // Grab the needPriority value
-            int needPriority = jobQueue.stringToNeedPriority((String)row.getValue(jobQueue.needPriorityField));
-            if (needPriority == JobQueue.NEEDPRIORITY_INPROGRESS)
-            {
-              IPriorityCalculator priority = priorities[index];
-              jobQueue.writeDocPriority(dd.getID(),priority);
-            }
-          }
-        }
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction writing doc priorities: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Get up to the next n documents to be expired.
-  * This method marks the documents whose descriptions have been returned as "being processed", or active.
-  * The same marking is used as is used for documents that have been queued for worker threads.  The model
-  * is thus identical.
-  *
-  *@param processID is the current process ID.
-  *@param n is the maximum number of records desired.
-  *@param currentTime is the current time.
-  *@return the array of document descriptions to expire.
-  */
-  @Override
-  public DocumentSetAndFlags getExpiredDocuments(String processID, int n, long currentTime)
-    throws ManifoldCFException
-  {
-    // Screening query
-    // Moved outside of transaction, so there's less chance of keeping jobstatus cache key tied up
-    // for an extended period of time.
-    if (!jobs.activeJobsPresent())
-      return new DocumentSetAndFlags(new DocumentDescription[0], new boolean[0]);
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Beginning query to look for documents to expire");
-    }
-
-    // Put together a query with a limit of n
-    // Note well: This query does not do "FOR UPDATE".  The reason is that only one thread can possibly change the document's state to active.
-    // If FOR UPDATE was included, deadlock conditions would be common because of the complexity of this query.
-
-    ArrayList list = new ArrayList();
-
-    StringBuilder sb = new StringBuilder("SELECT ");
-    sb.append("t0.").append(jobQueue.idField).append(",")
-      .append("t0.").append(jobQueue.jobIDField).append(",")
-      .append("t0.").append(jobQueue.docHashField).append(",")
-      .append("t0.").append(jobQueue.docIDField).append(",")
-      .append("t0.").append(jobQueue.statusField).append(",")
-      .append("t0.").append(jobQueue.failTimeField).append(",")
-      .append("t0.").append(jobQueue.failCountField)
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new MultiClause("t0."+jobQueue.statusField,new Object[]{
-          jobQueue.statusToString(JobQueue.STATUS_PENDING),
-          jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY)}),
-        new UnitaryClause("t0."+jobQueue.checkActionField,jobQueue.actionToString(JobQueue.ACTION_REMOVE)),
-        new UnitaryClause("t0."+jobQueue.checkTimeField,"<=",new Long(currentTime))})).append(" AND ");
-
-    sb.append("EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new MultiClause("t1."+jobs.statusField,new Object[]{
-          jobs.statusToString(jobs.STATUS_ACTIVE),
-          jobs.statusToString(jobs.STATUS_ACTIVESEEDING)}),
-        new JoinClause("t1."+jobs.idField,"t0."+jobQueue.jobIDField)})).append(") AND ");
-    
-    sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.getTableName()).append(" t2 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new JoinClause("t2."+jobQueue.docHashField,"t0."+jobQueue.docHashField),
-        new MultiClause("t2."+jobQueue.statusField,new String[]{
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-          jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED),
-          jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED)}),
-        new JoinClause("t2."+jobQueue.jobIDField,"t0."+jobQueue.jobIDField,"!=")}))
-      .append(") ");
-
-    sb.append(database.constructOffsetLimitClause(0,n));
-
-    String query = sb.toString();
-
-    // Analyze jobqueue tables unconditionally, since it's become much more sensitive in 8.3 than it used to be.
-    //jobQueue.unconditionallyAnalyzeTables();
-
-    ArrayList answers = new ArrayList();
-
-    int repeatCount = 0;
-    while (true)
-    {
-      long sleepAmt = 0L;
-
-      // Enter a write lock, so only one thread can be doing this.  That makes FOR UPDATE unnecessary.
-      lockManager.enterWriteLock(expireStufferLock);
-      try
-      {
-        if (Logging.perf.isDebugEnabled())
-        {
-          repeatCount++;
-          Logging.perf.debug(" Attempt "+Integer.toString(repeatCount)+" to expire documents, after "+
-            new Long(System.currentTimeMillis() - startTime)+" ms");
-        }
-
-        database.beginTransaction();
-        try
-        {
-          IResultSet set = database.performQuery(query,list,null,null,n,null);
-
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug(" Expiring "+Integer.toString(set.getRowCount())+" documents");
-
-          // To avoid deadlock, we want to update the document id hashes in order.  This means reading into a structure I can sort by docid hash,
-          // before updating any rows in jobqueue.
-          Map<String,List<DocumentDescription>> connectionNameMap = new HashMap<String,List<DocumentDescription>>();
-          Map<String,DocumentDescription> documentIDMap = new HashMap<String,DocumentDescription>();
-          Map<String,Integer> statusMap = new HashMap<String,Integer>();
-
-          for (int i = 0; i < set.getRowCount(); i++)
-          {
-            IResultRow row = set.getRow(i);
-            Long jobID = (Long)row.getValue(jobQueue.jobIDField);
-            String documentIDHash = (String)row.getValue(jobQueue.docHashField);
-            String documentID = (String)row.getValue(jobQueue.docIDField);
-            int status = jobQueue.stringToStatus(row.getValue(jobQueue.statusField).toString());
-            Long failTimeValue = (Long)row.getValue(jobQueue.failTimeField);
-            Long failCountValue = (Long)row.getValue(jobQueue.failCountField);
-            // Failtime is probably not useful in this context, but we'll bring it along for completeness
-            long failTime;
-            if (failTimeValue == null)
-              failTime = -1L;
-            else
-              failTime = failTimeValue.longValue();
-            int failCount;
-            if (failCountValue == null)
-              failCount = 0;
-            else
-              failCount = (int)failCountValue.longValue();
-            IJobDescription jobDesc = load(jobID);
-            String connectionName = jobDesc.getConnectionName();
-            DocumentDescription dd = new DocumentDescription((Long)row.getValue(jobQueue.idField),
-              jobID,documentIDHash,documentID,failTime,failCount);
-            String compositeDocumentID = makeCompositeID(documentIDHash,connectionName);
-            documentIDMap.put(compositeDocumentID,dd);
-            statusMap.put(compositeDocumentID,new Integer(status));
-            List<DocumentDescription> x = connectionNameMap.get(connectionName);
-            if (x == null)
-            {
-              // New entry needed
-              x = new ArrayList<DocumentDescription>();
-              connectionNameMap.put(connectionName,x);
-            }
-            x.add(dd);
-          }
-
-          // For each bin, obtain a filtered answer, and enter all answers into a hash table.
-          // We'll then scan the result again to look up the right descriptions for return,
-          // and delete the ones that are owned multiply.
-          Map<String,String> allowedDocIds = new HashMap<String,String>();
-          Iterator<String> iter = connectionNameMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            String connectionName = iter.next();
-            List<DocumentDescription> x = connectionNameMap.get(connectionName);
-            // Do the filter query
-            DocumentDescription[] descriptions = new DocumentDescription[x.size()];
-            for (int j = 0; j < descriptions.length; j++)
-            {
-              descriptions[j] = x.get(j);
-            }
-            String[] docIDHashes = getUnindexableDocumentIdentifiers(descriptions,connectionName);
-            for (int j = 0; j < docIDHashes.length; j++)
-            {
-              String docIDHash = docIDHashes[j];
-              String key = makeCompositeID(docIDHash,connectionName);
-              allowedDocIds.put(key,docIDHash);
-            }
-          }
-
-          // Now, assemble a result, and change the state of the records accordingly
-          // First thing to do is order by document hash, so we reduce the risk of deadlock.
-          String[] compositeIDArray = new String[documentIDMap.size()];
-          int j = 0;
-          iter = documentIDMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            compositeIDArray[j++] = iter.next();
-          }
-          
-          java.util.Arrays.sort(compositeIDArray);
-          
-          DocumentDescription[] rval = new DocumentDescription[documentIDMap.size()];
-          boolean[] rvalBoolean = new boolean[documentIDMap.size()];
-          for (int i = 0; i < compositeIDArray.length; i++)
-          {
-            String compositeDocID = compositeIDArray[i];
-            DocumentDescription dd = documentIDMap.get(compositeDocID);
-            // Determine whether we can delete it from the index or not
-            rvalBoolean[i] = (allowedDocIds.get(compositeDocID) != null);
-            // Set the record status to "being cleaned" and return it
-            rval[i] = dd;
-            jobQueue.updateActiveRecord(dd.getID(),statusMap.get(compositeDocID).intValue(),processID);
-          }
-
-          TrackerClass.notePrecommit();
-          database.performCommit();
-          TrackerClass.noteCommit();
-          
-          return new DocumentSetAndFlags(rval, rvalBoolean);
-
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          TrackerClass.noteRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction finding docs to expire: "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          TrackerClass.noteRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(expireStufferLock);
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  // This method supports the "queue stuffer" thread
-
-  /**
-  /** Get up to the next n document(s) to be fetched and processed.
-  * This fetch returns records that contain the document identifier, plus all instructions
-  * pertaining to the document's handling (e.g. whether it should be refetched if the version
-  * has not changed).
-  * This method also marks the documents whose descriptions have be returned as "being processed".
-  *@param processID is the current process ID.
-  *@param n is the maximum number of records desired.
-  *@param currentTime is the current time; some fetches do not occur until a specific time.
-  *@param interval is the number of milliseconds that this set of documents should represent (for throttling).
-  *@param blockingDocuments is the place to record documents that were encountered, are eligible for reprioritization,
-  *  but could not be queued due to throttling considerations.
-  *@param statistics are the current performance statistics per connection, which are used to balance the queue stuffing
-  *  so that individual connections are not overwhelmed.
-  *@param scanRecord retains the bins from all documents encountered from the query, even those that were skipped due
-  * to being overcommitted.
-  *@return the array of document descriptions to fetch and process.
-  */
-  @Override
-  public DocumentDescription[] getNextDocuments(String processID,
-    int n, long currentTime, long interval,
-    BlockingDocuments blockingDocuments, PerformanceStatistics statistics,
-    DepthStatistics scanRecord)
-    throws ManifoldCFException
-  {
-    // NOTE WELL: Jobs that are throttled must control the number of documents that are fetched in
-    // a given interval.  Therefore, the returned result has the following constraints on it:
-    // 1) There must be no more than n documents returned total;
-    // 2) For any given job that is throttled, the total number of documents returned must be
-    //    consistent with the time interval provided.
-    // In general, this requires the database layer to perform fairly advanced filtering on the
-    // the result, far in excess of a simple count.  An implementation of an interface is therefore
-    // going to need to be passed into the performQuery() operation, which prunes the resultset
-    // as it is being read into memory.  That's a new feature that will need to be added to the
-    // database layer.
-
-    // Screening query
-    // Moved outside of transaction, so there's less chance of keeping jobstatus cache key tied up
-    // for an extended period of time.
-    if (!jobs.activeJobsPresent())
-      return new DocumentDescription[0];
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to find documents to queue");
-    }
-
-    // Below there used to be one large transaction, with multiple read seconds and multiple write sections.
-    // As part of reducing the chance of postgresql encountering deadlock conditions, I wanted to break this
-    // transaction up.  However, the transaction depended for its correctness in throttling on making sure
-    // that the throttles that were built were based on the same active jobs that the subsequent queries
-    // that did the stuffing relied upon.  This made reorganization impossible until I realized that with
-    // Postgresql's way of doing transaction isolation this was going to happen anyway, so I needed a more
-    // robust solution.
-    //
-    // Specifically, I chose to change the way documents were queued so that only documents from properly
-    // throttled jobs could be queued.  That meant I needed to add stuff to the ThrottleLimit class to track
-    // the very knowledge of an active job.  This had the additional benefit of meaning there was no chance of
-    // a query occurring from inside a resultset filter.
-    //
-    // But, after I did this, it was no longer necessary to have such a large transaction either.
-
-
-    ThrottleLimit vList = new ThrottleLimit(n);
-
-    IResultSet jobconnections = jobs.getActiveJobConnections();
-    Set<String> connectionSet = new HashSet<String>();
-    int i = 0;
-    while (i < jobconnections.getRowCount())
-    {
-      IResultRow row = jobconnections.getRow(i++);
-      Long jobid = (Long)row.getValue("jobid");
-      String connectionName = (String)row.getValue("connectionname");
-      vList.addJob(jobid,connectionName);
-      connectionSet.add(connectionName);
-    }
-
-    // Find the active connection names.  We'll load these, and then get throttling info
-    // from each one.
-    String[] activeConnectionNames = new String[connectionSet.size()];
-    i = 0;
-    for (String connectionName : connectionSet)
-    {
-      activeConnectionNames[i++] = connectionName;
-    }
-    IRepositoryConnection[] connections = connectionMgr.loadMultiple(activeConnectionNames);
-
-
-    // Accumulate a sum of the max_connection_count * avg_connection_rate values, so we can calculate the appropriate adjustment
-    // factor and set the connection limits.
-    Map<String,Double> rawFetchCounts = new HashMap<String,Double>();
-    double rawFetchCountTotal = 0.0;
-    for (IRepositoryConnection connection : connections)
-    {
-      String connectionName = connection.getName();
-      int maxConnections = connection.getMaxConnections();
-      double avgFetchRate = statistics.calculateConnectionFetchRate(connectionName);
-      double weightedRawFetchCount = avgFetchRate * (double)maxConnections;
-      // Keep the avg rate for later use, since it may get updated before next time we need it.
-      rawFetchCounts.put(connectionName,new Double(weightedRawFetchCount));
-      rawFetchCountTotal += weightedRawFetchCount;
-    }
-
-    // Calculate an adjustment factor
-    double fetchCountAdjustmentFactor = ((double)n) / rawFetchCountTotal;
-
-    // For each job, we must amortize the maximum number of fetches per ms to the actual interval,
-    // and also randomly select an extra fetch based on the fractional probability.  (This latter is
-    // necessary for the case where the maximum fetch rate is specified to be pretty low.)
-    //
-    for (IRepositoryConnection connection : connections)
-    {
-      String connectionName = connection.getName();
-      // Check if throttled...
-      String[] throttles = connection.getThrottles();
-      for (String throttle : throttles)
-      {
-        // The key is the regexp value itself
-        float throttleValue = connection.getThrottleValue(throttle);
-        // For the given connection, set the fetch limit per bin.  This is calculated using the time interval
-        // and the desired fetch rate.  The fractional remainder is used to conditionally provide an "extra fetch"
-        // on a weighted random basis.
-        //
-        // In the future, the connection may specify tuples which pair a regexp describing a set of bins against
-        // a fetch rate.  In that case, each fetch rate would need to be turned into a precise maximum
-        // count.
-        double fetchesPerTimeInterval = (double)throttleValue * (double)interval;
-        // Actual amount will be the integer value of this, plus an additional 1 if the random number aligns
-        int fetches = (int)fetchesPerTimeInterval;
-        fetchesPerTimeInterval -= (double)fetches;
-        if (random.nextDouble() <= fetchesPerTimeInterval)
-          fetches++;
-        // Save the limit in the ThrottleLimit structure
-        vList.addLimit(connectionName,throttle,fetches);
-      }
-      // For the overall connection, we also have a limit which is based on the number of connections there are actually available.
-      Double weightedRawFetchCount = rawFetchCounts.get(connectionName);
-      double adjustedFetchCount = weightedRawFetchCount.doubleValue() * fetchCountAdjustmentFactor;
-
-      // Note well: Queuing starvation that results from there being very few available documents for high-priority connections is dealt with here by simply allowing
-      // the stuffer thread to keep queuing documents until there are enough.  This will be pretty inefficient if there's an active connection that is fast and has lots
-      // of available connection handles, but the bulk of the activity is on slow speed/highly handle limited connections, but I honestly can't think of a better way at the moment.
-      // One good way to correct a bit for this problem is to set a higher document count floor for each connection - say 5 documents - then we won't loop as much.
-      //
-      // Be off in the higher direction rather than the lower; this also prohibits zero values and sets a minimum.
-      int fetchCount = ((int)adjustedFetchCount) + 5;
-
-      vList.setConnectionLimit(connectionName,fetchCount);
-    }
-
-
-    if (Logging.perf.isDebugEnabled())
-      Logging.perf.debug("After "+new Long(System.currentTimeMillis()-startTime).toString()+" ms, beginning query to look for documents to queue");
-
-    // System.out.println("Done building throttle structure");
-
-    // Locate records.
-    // Note that we do NOT want to get everything there is to know about the job
-    // using this query, since the file specification may be large and expensive
-    // to parse.  We will load a (cached) copy of the job description for that purpose.
-    //
-    // NOTE: This query deliberately excludes documents which may be being processed by another job.
-    // (It actually excludes a bit more than that, because the exact query is impossible to write given
-    // the fact that document id's cannot be compared.)  These are documents where there is ANOTHER
-    // document entry with the same hash value, a different job id, and a status which is either "active",
-    // "activepurgatory", or "beingdeleted".  (It does not check whether the jobs have the same connection or
-    // whether the document id's are in fact the same, and therefore may temporarily block legitimate document
-    // activity under rare circumstances.)
-    //
-    // The query I want is:
-    // SELECT jobid,docid,status FROM jobqueue t0 WHERE status IN ('P','G') AND checktime <=xxx
-    //              AND EXISTS(SELECT 'x' FROM
-    //                      jobs t1 WHERE t0.jobid=t1.id AND t1.status='A')
-    //              AND NOT EXISTS(SELECT 'x' FROM jobqueue t2 WHERE t0.hashval=t2.hashval AND t0.jobid!=t2.jobid
-    //                      AND t2.status IN ('A','F','D'))
-    //                  ORDER BY docpriority ASC LIMIT xxx
-    //
-
-    // NOTE WELL: The above query did just fine until adaptive recrawling was seriously tried.  Then, because every
-    // document in a job was still active, it failed miserably, actually causing Postgresql to stop responding at
-    // one point.  Why?  Well, the key thing is the sort criteria - there just isn't any way to sort 1M documents
-    // without working with a monster resultset.
-    //
-    // I introduced a new index as a result - based solely on docpriority - and postgresql now correctly uses that index
-    // to pull its results in an ordered fashion
-    //
-    //
-    // Another subtlety is that I *must* mark the documents active as I find them, so that they do not
-    // have any chance of getting returned twice.
-
-    // Accumulate the answers here
-    List<DocumentDescription> answers = new ArrayList<DocumentDescription>();
-
-    // The current time value
-    Long currentTimeValue = new Long(currentTime);
-
-    // Always analyze jobqueue before this query.  Otherwise stuffing may get a bad plan, interfering with performance.
-    // This turned out to be needed in postgresql 8.3, even though 8.2 worked fine.
-    //jobQueue.unconditionallyAnalyzeTables();
-
-    // Loop through priority values
-    int currentPriority = 1;
-
-    boolean isDone = false;
-
-    while (!isDone && currentPriority <= 10)
-    {
-      if (jobs.hasPriorityJobs(currentPriority))
-      {
-        Long currentPriorityValue = new Long((long)currentPriority);
-        fetchAndProcessDocuments(answers,currentTimeValue,currentPriorityValue,vList,connections,processID);
-        isDone = !vList.checkContinue();
-      }
-      currentPriority++;
-    }
-
-    // Assert the blocking documents we discovered
-    vList.tallyBlockingDocuments(blockingDocuments);
-
-    // Convert the saved answers to an array
-    DocumentDescription[] rval = new DocumentDescription[answers.size()];
-    i = 0;
-    for (DocumentDescription answer : answers)
-    {
-      rval[i++] = answer;
-    }
-
-    // After we're done pulling stuff from the queue, find the eligible row with the best priority on the queue, and save the bins for assessment.
-    // This done to decide what the "floor" bincount should be - the idea being that it is wrong to assign priorities for new documents which are
-    // higher than the current level that is currently being  dequeued.
-    //
-    // The complicating factor here is that there are indeed many potential *classes* of documents, each of which might have its own current
-    // document priority level.  For example, documents could be classed by job, which might make sense because there is a possibility that two jobs'
-    // job priorities may differ.  Also, because of document fetch scheduling, each time frame may represent a class in its own right as well.
-    // These classes would have to be associated with independent bin counts, if we were to make any use of them.  Then, it would be also necessary
-    // to know what classes a document belonged to in order to be able to calculate its priority.
-    //
-    // An alternative way to proceed is to just have ONE class, and document priorities then get assigned without regard to job, queuing time, etc.
-    // That's the current reality.  The code below works in that model, knowing full well that it is an approximation to an ideal.
-
-    // Find the one row from a live job that has the best document priority, which is available within the current time window.
-    // Note that if there is NO such document, it means we were able to queue all eligible documents, and thus prioritization is probably not even
-    // germane at the moment.
-
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-    
-    sb.append(jobQueue.docPriorityField).append(",").append(jobQueue.jobIDField).append(",")
-      .append(jobQueue.docHashField).append(",").append(jobQueue.docIDField)
-      .append(" FROM ").append(jobQueue.getTableName())
-      .append(" t0 ").append(jobQueue.getGetNextDocumentsIndexHint()).append(" WHERE ");
-      
-    sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause("t0."+jobQueue.docPriorityField,"<",JobQueue.nullDocPriority),  // Note: This is technically correct, but I need to confirm that it works OK for MySQL and HSQLDB
-      new MultiClause(jobQueue.statusField,
-        new Object[]{jobQueue.statusToString(JobQueue.STATUS_PENDING),
-          jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY)}),
-      new UnitaryClause(jobQueue.checkActionField,"=",jobQueue.actionToString(JobQueue.ACTION_RESCAN)),
-      new UnitaryClause(jobQueue.checkTimeField,"<=",currentTimeValue)})).append(" AND ");
-
-    sb.append("EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new MultiClause("t1."+jobs.statusField,new Object[]{
-          Jobs.statusToString(jobs.STATUS_ACTIVE),
-          Jobs.statusToString(jobs.STATUS_ACTIVESEEDING)}),
-        new JoinClause("t1."+jobs.idField,"t0."+jobQueue.jobIDField)}))
-      .append(") ");
-      
-    sb.append(" ").append(database.constructIndexOrderByClause(new String[]{
-      jobQueue.docPriorityField, jobQueue.statusField, jobQueue.checkActionField, jobQueue.checkTimeField},
-      true)).append(" ")
-      .append(database.constructOffsetLimitClause(0,1,true));
-
-    IResultSet set;
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        set = database.performQuery(sb.toString(),list,null,null,1,null);
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction adding document bins: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-
-    if (set.getRowCount() > 0)
-    {
-      IResultRow row = set.getRow(0);
-      Double docPriority = (Double)row.getValue(jobQueue.docPriorityField);
-      if (docPriority != null && docPriority.doubleValue() < jobQueue.noDocPriorityValue)
-        scanRecord.addBins(docPriority);
-    }
-    return rval;
-  }
-
-  /** Fetch and process documents matching the passed-in criteria */
-  protected void fetchAndProcessDocuments(List<DocumentDescription> answers, Long currentTimeValue, Long currentPriorityValue,
-    ThrottleLimit vList, IRepositoryConnection[] connections, String processID)
-    throws ManifoldCFException
-  {
-
-    // Note well: This query does not do "FOR UPDATE".  The reason is that only one thread can possibly change the document's state to active.
-    // When FOR UPDATE was included, deadlock conditions were common because of the complexity of this query.
-    // So, instead, as part of CONNECTORS-781, I've introduced a write lock for the pertinent section.
-
-    ArrayList list = new ArrayList();
-
-    StringBuilder sb = new StringBuilder("SELECT t0.");
-    sb.append(jobQueue.idField).append(",t0.");
-    if (Logging.scheduling.isDebugEnabled())
-      sb.append(jobQueue.docPriorityField).append(",t0.");
-    sb.append(jobQueue.jobIDField).append(",t0.")
-      .append(jobQueue.docHashField).append(",t0.")
-      .append(jobQueue.docIDField).append(",t0.")
-      .append(jobQueue.statusField).append(",t0.")
-      .append(jobQueue.failTimeField).append(",t0.")
-      .append(jobQueue.failCountField).append(" FROM ").append(jobQueue.getTableName())
-      .append(" t0 ").append(jobQueue.getGetNextDocumentsIndexHint()).append(" WHERE ");
-    
-    sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause("t0."+jobQueue.docPriorityField,"<",JobQueue.nullDocPriority),  // Note: This is technically correct, but I need to confirm that it works OK for MySQL and HSQLDB
-      new MultiClause("t0."+jobQueue.statusField,new Object[]{
-        jobQueue.statusToString(JobQueue.STATUS_PENDING),
-        jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY)}),
-      new UnitaryClause("t0."+jobQueue.checkActionField,"=",jobQueue.actionToString(JobQueue.ACTION_RESCAN)),
-      new UnitaryClause("t0."+jobQueue.checkTimeField,"<=",currentTimeValue)})).append(" AND ");
-        
-    sb.append("EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new MultiClause("t1."+jobs.statusField,new Object[]{
-          Jobs.statusToString(jobs.STATUS_ACTIVE),
-          Jobs.statusToString(jobs.STATUS_ACTIVESEEDING)}),
-        new JoinClause("t1."+jobs.idField,"t0."+jobQueue.jobIDField),
-        new UnitaryClause("t1."+jobs.priorityField,currentPriorityValue)}))
-      .append(") AND ");
-    
-    sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.getTableName()).append(" t2 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new JoinClause("t2."+jobQueue.docHashField,"t0."+jobQueue.docHashField),
-        new MultiClause("t2."+jobQueue.statusField,new String[]{
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-          jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-          jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED),
-          jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED)}),
-        new JoinClause("t2."+jobQueue.jobIDField,"t0."+jobQueue.jobIDField,"!=")}))
-      .append(") AND ");
-
-    // Prerequisite event clause: AND NOT EXISTS(SELECT 'x' FROM prereqevents t3,events t4 WHERE t3.ownerid=t0.id AND t3.name=t4.name)
-    sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.prereqEventManager.getTableName()).append(" t3,").append(eventManager.getTableName()).append(" t4 WHERE t0.")
-      .append(jobQueue.idField).append("=t3.").append(jobQueue.prereqEventManager.ownerField).append(" AND t3.")
-      .append(jobQueue.prereqEventManager.eventNameField).append("=t4.").append(eventManager.eventNameField)
-      .append(")");
-
-    sb.append(" ").append(database.constructIndexOrderByClause(new String[]{
-      "t0."+jobQueue.docPriorityField, "t0."+jobQueue.statusField, "t0."+jobQueue.checkActionField, "t0."+jobQueue.checkTimeField},
-      true)).append(" ");
-
-    String query = sb.toString();
-
-    // Before entering the transaction, we must provide the throttlelimit object with all the connector
-    // instances it could possibly need.  The purpose for doing this is to prevent a deadlock where
-    // connector starvation causes database lockup.
-    //
-    // The preallocation of multiple connector instances is certainly a worry.  If any other part
-    // of the code allocates multiple connector instances also, the potential exists for this to cause
-    // deadlock all by itself.  I've therefore built a "grab multiple" and a "release multiple"
-    // at the connector factory level to make sure these requests are properly ordered.
-
-    String[] orderingKeys = new String[connections.length];
-    int k = 0;
-    while (k < connections.length)
-    {
-      IRepositoryConnection connection = connections[k];
-      orderingKeys[k] = connection.getName();
-      k++;
-    }
-    
-    // Never sleep with a resource locked!
-    while (true)
-    {
-      long sleepAmt = 0L;
-
-      // Write lock insures that only one thread cluster-wide can be doing this at a given time, so FOR UPDATE is unneeded.
-      lockManager.enterWriteLock(stufferLock);
-      try
-      {
-    
-        IRepositoryConnector[] connectors = repositoryConnectorPool.grabMultiple(orderingKeys,connections);
-        try
-        {
-          // Hand the connectors off to the ThrottleLimit instance
-          k = 0;
-          while (k < connections.length)
-          {
-            vList.addConnectionName(connections[k].getName(),connectors[k]);
-            k++;
-          }
-
-          // Now we can tack the limit onto the query.  Before this point, remainingDocuments would be crap
-          int limitValue = vList.getRemainingDocuments();
-          String finalQuery = query + database.constructOffsetLimitClause(0,limitValue,true);
-
-          if (Logging.perf.isDebugEnabled())
-          {
-            Logging.perf.debug("Queuing documents from time "+currentTimeValue.toString()+" job priority "+currentPriorityValue.toString()+
-              " (up to "+Integer.toString(vList.getRemainingDocuments())+" documents)");
-          }
-
-          database.beginTransaction();
-          try
-          {
-            IResultSet set = database.performQuery(finalQuery,list,null,null,-1,vList);
-
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug(" Queuing "+Integer.toString(set.getRowCount())+" documents");
-
-            // To avoid deadlock, we want to update the document id hashes in order.  This means reading into a structure I can sort by docid hash,
-            // before updating any rows in jobqueue.
-            String[] docIDHashes = new String[set.getRowCount()];
-            Map<String,DocumentDescription> storageMap = new HashMap<String,DocumentDescription>();
-            Map<String,Integer> statusMap = new HashMap<String,Integer>();
-
-            for (int i = 0; i < set.getRowCount(); i++)
-            {
-              IResultRow row = set.getRow(i);
-              Long id = (Long)row.getValue(jobQueue.idField);
-              Long jobID = (Long)row.getValue(jobQueue.jobIDField);
-              String docIDHash = (String)row.getValue(jobQueue.docHashField);
-              String docID = (String)row.getValue(jobQueue.docIDField);
-              int status = jobQueue.stringToStatus(row.getValue(jobQueue.statusField).toString());
-              Long failTimeValue = (Long)row.getValue(jobQueue.failTimeField);
-              Long failCountValue = (Long)row.getValue(jobQueue.failCountField);
-              long failTime;
-              if (failTimeValue == null)
-                failTime = -1L;
-              else
-                failTime = failTimeValue.longValue();
-              int failCount;
-              if (failCountValue == null)
-                failCount = -1;
-              else
-                failCount = (int)failCountValue.longValue();
-
-              DocumentDescription dd = new DocumentDescription(id,jobID,docIDHash,docID,failTime,failCount);
-              docIDHashes[i] = docIDHash + ":" + jobID;
-              storageMap.put(docIDHashes[i],dd);
-              statusMap.put(docIDHashes[i],new Integer(status));
-              if (Logging.scheduling.isDebugEnabled())
-              {
-                Double docPriority = (Double)row.getValue(jobQueue.docPriorityField);
-                Logging.scheduling.debug("Stuffing document '"+docID+"' that has priority "+docPriority.toString()+" onto active list");
-              }
-            }
-
-            // No duplicates are possible here
-            java.util.Arrays.sort(docIDHashes);
-
-            for (String docIDHash : docIDHashes)
-            {
-              DocumentDescription dd = storageMap.get(docIDHash);
-              Long id = dd.getID();
-              int status = statusMap.get(docIDHash).intValue();
-
-              // Set status to "ACTIVE".
-              jobQueue.updateActiveRecord(id,status,processID);
-
-              answers.add(dd);
-            }
-            TrackerClass.notePrecommit();
-            database.performCommit();
-            TrackerClass.noteCommit();
-            break;
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-            {
-              if (Logging.perf.isDebugEnabled())
-                Logging.perf.debug("Aborted transaction finding docs to queue: "+e.getMessage());
-              sleepAmt = getRandomAmount();
-              continue;
-            }
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-        finally
-        {
-          repositoryConnectorPool.releaseMultiple(connections,connectors);
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(stufferLock);
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  // These methods support the individual fetch/process threads.
-
-  /** Verify that a specific job is indeed still active.  This is used to permit abort or pause to be relatively speedy.
-  * The query done within MUST be cached in order to not cause undue performance degradation.
-  *@param jobID is the job identifier.
-  *@return true if the job is in one of the "active" states.
-  */
-  @Override
-  public boolean checkJobActive(Long jobID)
-    throws ManifoldCFException
-  {
-    return jobs.checkJobActive(jobID);
-  }
-
-  /** Verify if a job is still processing documents, or no longer has any outstanding active documents */
-  @Override
-  public boolean checkJobBusy(Long jobID)
-    throws ManifoldCFException
-  {
-    return jobQueue.checkJobBusy(jobID);
-  }
-
-  /** Note completion of document processing by a job thread of a document.
-  * This method causes the state of the document to be marked as "completed".
-  *@param documentDescriptions are the description objects for the documents that were processed.
-  */
-  @Override
-  public void markDocumentCompletedMultiple(DocumentDescription[] documentDescriptions)
-    throws ManifoldCFException
-  {
-    // Before we can change a document status, we need to know the *current* status.  Therefore, a SELECT xxx FOR UPDATE/UPDATE
-    // transaction is needed in order to complete these documents correctly.
-    //
-    // Since we are therefore setting row locks on thejobqueue table, we need to work to avoid unnecessary deadlocking.  To do that, we have to
-    // lock rows in document id hash order!!  Luckily, the DocumentDescription objects have a document identifier buried within, which we can use to
-    // order the "select for update" operations appropriately.
-    //
-
-    Map<String,Integer> indexMap = new HashMap<String,Integer>();
-    String[] docIDHashes = new String[documentDescriptions.length];
-
-    for (int i = 0; i < documentDescriptions.length; i++)
-    {
-      String documentIDHash = documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      docIDHashes[i] = documentIDHash;
-      indexMap.put(documentIDHash,new Integer(i));
-    }
-
-    java.util.Arrays.sort(docIDHashes);
-
-    // Retry loop - in case we get a deadlock despite our best efforts
-    while (true)
-    {
-      long sleepAmt = 0L;
-
-      // Start the transaction now
-      database.beginTransaction();
-      try
-      {
-        // Do one row at a time, to avoid deadlocking things
-        for (String docIDHash : docIDHashes)
-        {
-          // Get the DocumentDescription object
-          DocumentDescription dd = documentDescriptions[indexMap.get(docIDHash).intValue()];
-
-          // Query for the status
-          ArrayList list = new ArrayList();
-          String query = database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobQueue.idField,dd.getID())});
-          TrackerClass.notePreread(dd.getID());
-          IResultSet set = database.performQuery("SELECT "+jobQueue.statusField+" FROM "+jobQueue.getTableName()+" WHERE "+
-            query+" FOR UPDATE",list,null,null);
-          TrackerClass.noteRead(dd.getID());
-          if (set.getRowCount() > 0)
-          {
-            IResultRow row = set.getRow(0);
-            // Grab the status
-            int status = jobQueue.stringToStatus((String)row.getValue(jobQueue.statusField));
-            // Update the jobqueue table
-            jobQueue.updateCompletedRecord(dd.getID(),status);
-          }
-        }
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction marking completed "+Integer.toString(docIDHashes.length)+
-            " docs: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Note completion of document processing by a job thread of a document.
-  * This method causes the state of the document to be marked as "completed".
-  *@param documentDescription is the description object for the document that was processed.
-  */
-  @Override
-  public void markDocumentCompleted(DocumentDescription documentDescription)
-    throws ManifoldCFException
-  {
-    markDocumentCompletedMultiple(new DocumentDescription[]{documentDescription});
-  }
-
-  /** Delete from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be deleted, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentDeletedMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    // It's no longer an issue to have to deal with documents being conditionally deleted; that's been
-    // taken over by the hopcountremoval method below.  So just use the simple 'delete' functionality.
-    return doDeleteMultiple(jobID,legalLinkTypes,documentDescriptions,hopcountMethod);
-  }
-
-  /** Delete from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be deleted, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentDeleted(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    return markDocumentDeletedMultiple(jobID,legalLinkTypes,new DocumentDescription[]{documentDescription},hopcountMethod);
-  }
-
-  /** Mark hopcount removal from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be marked as removed, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentHopcountRemovalMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    // For each record, we're going to have to choose between marking it as "hopcount removed", and marking
-    // it for rescan.  So the basic flow will involve changing a document's status,.
-    
-    // Before we can change a document status, we need to know the *current* status.  Therefore, a SELECT xxx FOR UPDATE/UPDATE
-    // transaction is needed in order to complete these documents correctly.
-    //
-    // Since we are therefore setting row locks on thejobqueue table, we need to work to avoid unnecessary deadlocking.  To do that, we have to
-    // lock rows in document id hash order!!  Luckily, the DocumentDescription objects have a document identifier buried within, which we can use to
-    // order the "select for update" operations appropriately.
-    //
-
-    HashMap indexMap = new HashMap();
-    String[] docIDHashes = new String[documentDescriptions.length];
-
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      String documentIDHash = documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      docIDHashes[i] = documentIDHash;
-      indexMap.put(documentIDHash,new Integer(i));
-      i++;
-    }
-
-    java.util.Arrays.sort(docIDHashes);
-
-    // Retry loop - in case we get a deadlock despite our best efforts
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        // Do one row at a time, to avoid deadlocking things
-        List<String> deleteList = new ArrayList<String>();
-        
-        i = 0;
-        while (i < docIDHashes.length)
-        {
-          String docIDHash = docIDHashes[i];
-
-          // Get the DocumentDescription object
-          DocumentDescription dd = documentDescriptions[((Integer)indexMap.get(docIDHash)).intValue()];
-
-          // Query for the status
-          ArrayList list = new ArrayList();
-          String query = database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobQueue.idField,dd.getID())});
-          TrackerClass.notePreread(dd.getID());
-          IResultSet set = database.performQuery("SELECT "+jobQueue.statusField+" FROM "+jobQueue.getTableName()+" WHERE "+
-            query+" FOR UPDATE",list,null,null);
-          TrackerClass.noteRead(dd.getID());
-          if (set.getRowCount() > 0)
-          {
-            IResultRow row = set.getRow(0);
-            // Grab the status
-            int status = jobQueue.stringToStatus((String)row.getValue(jobQueue.statusField));
-            // Update the jobqueue table
-            boolean didDelete = jobQueue.updateOrHopcountRemoveRecord(dd.getID(),status);
-            if (didDelete)
-            {
-              deleteList.add(dd.getDocumentIdentifierHash());
-            }
-          }
-          i++;
-        }
-        
-        String[] docIDSimpleHashes = new String[deleteList.size()];
-        for (int j = 0; j < docIDSimpleHashes.length; j++)
-        {
-          docIDSimpleHashes[j] = deleteList.get(j);
-        }
-        
-        // Next, find the documents that are affected by carrydown deletion.
-        DocumentDescription[] rval = calculateAffectedDeleteCarrydownChildren(jobID,docIDSimpleHashes);
-
-        // Since hopcount inheritance and prerequisites came from the addDocument() method,
-        // we don't delete them here.
-        
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        return rval;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction marking completed "+Integer.toString(docIDHashes.length)+
-            " docs: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Mark hopcount removal from queue as a result of processing of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  The RESCAN variants are interpreted
-  * as meaning that the document should not be marked as removed, but should instead be popped back on the queue for
-  * a repeat processing attempt.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentHopcountRemoval(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    return markDocumentHopcountRemovalMultiple(jobID,legalLinkTypes,new DocumentDescription[]{documentDescription},hopcountMethod);
-  }
-
-  /** Delete from queue as a result of expiration of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  Since the document expired,
-  * no special activity takes place as a result of the document being in a RESCAN state.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentExpiredMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    return doDeleteMultiple(jobID,legalLinkTypes,documentDescriptions,hopcountMethod);
-  }
-  
-  /** Delete from queue as a result of expiration of an active document.
-  * The document is expected to be in one of the active states: ACTIVE, ACTIVESEEDING,
-  * ACTIVENEEDSRESCAN, ACTIVESEEDINGNEEDSRESCAN.  Since the document expired,
-  * no special activity takes place as a result of the document being in a RESCAN state.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentExpired(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    return markDocumentExpiredMultiple(jobID,legalLinkTypes,new DocumentDescription[]{documentDescription},hopcountMethod);
-  }
-
-  /** Delete from queue as a result of cleaning up an unreachable document.
-  * The document is expected to be in the PURGATORY state.  There is never any need to reprocess the
-  * document.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentCleanedUpMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    return doDeleteMultiple(jobID,legalLinkTypes,documentDescriptions,hopcountMethod);
-  }
-
-  /** Delete from queue as a result of cleaning up an unreachable document.
-  * The document is expected to be in the PURGATORY state.  There is never any need to reprocess the
-  * document.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] markDocumentCleanedUp(Long jobID, String[] legalLinkTypes, DocumentDescription documentDescription,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    return markDocumentCleanedUpMultiple(jobID,legalLinkTypes,new DocumentDescription[]{documentDescription},hopcountMethod);
-  }
-
-  /** Delete documents with no repercussions.  We don't have to worry about the current state of each document,
-  * since the document is definitely going away.
-  *@param documentDescriptions are the set of description objects for the documents that were processed.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  protected DocumentDescription[] doDeleteMultiple(Long jobID, String[] legalLinkTypes, DocumentDescription[] documentDescriptions,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    if (documentDescriptions.length == 0)
-      return new DocumentDescription[0];
-
-    // Order of locking is not normally important here, because documents that wind up being deleted are never being worked on by anything else.
-    // In all cases, the state of the document excludes other activity.
-    // The only tricky situation is when a thread is processing a document which happens to be getting deleted, while another thread is trying to add
-    // a reference for the very same document to the queue.  Then, order of locking matters, so the deletions should happen in a specific order to avoid
-    // the possibility of deadlock.  Nevertheless, this is enough of a risk that I've chosen to order the deletions by document id hash order, just like everywhere
-    // else.
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to delete "+Integer.toString(documentDescriptions.length)+" docs and clean up hopcount for job "+jobID.toString());
-    }
-
-    HashMap indexMap = new HashMap();
-    String[] docIDHashes = new String[documentDescriptions.length];
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      docIDHashes[i] = documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      indexMap.put(docIDHashes[i],new Integer(i));
-      i++;
-    }
-
-    // Sort by doc hash, to establish non-blocking lock order
-    java.util.Arrays.sort(docIDHashes);
-
-    DocumentDescription[] rval;
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Waited "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to start deleting "+Integer.toString(docIDHashes.length)+
-          " docs and clean up hopcount for job "+jobID.toString());
-
-        String[] docIDSimpleHashes = new String[docIDHashes.length];
-        // Delete jobqueue rows FIRST.  Even though we do this before assessing the carrydown implications, it is OK because it's the CHILDREN of these
-        // rows that might get affected by carrydown data deletion, not the rows themselves!
-        i = 0;
-        while (i < docIDHashes.length)
-        {
-          String docIDHash = docIDHashes[i];
-          DocumentDescription dd = documentDescriptions[((Integer)indexMap.get(docIDHash)).intValue()];
-          // Individual operations are necessary so order can be controlled.
-          jobQueue.deleteRecord(dd.getID());
-          docIDSimpleHashes[i] = dd.getDocumentIdentifierHash();
-          i++;
-        }
-
-        // Next, find the documents that are affected by carrydown deletion.
-        rval = calculateAffectedDeleteCarrydownChildren(jobID,docIDSimpleHashes);
-
-        // Finally, delete the carrydown records in question.
-        carryDown.deleteRecords(jobID,docIDSimpleHashes);
-        if (legalLinkTypes.length > 0)
-          hopCount.deleteDocumentIdentifiers(jobID,legalLinkTypes,docIDSimpleHashes,hopcountMethod);
-
-        database.performCommit();
-        
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to delete "+Integer.toString(docIDHashes.length)+
-          " docs and clean up hopcount for job "+jobID.toString());
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction deleting "+Integer.toString(docIDHashes.length)+
-            " docs and clean up hopcount for job "+jobID.toString()+": "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-    return rval;
-  }
-
-  /** Helper method: Find the document descriptions that will be affected due to carrydown row deletions.
-  */
-  protected DocumentDescription[] calculateAffectedDeleteCarrydownChildren(Long jobID, String[] docIDHashes)
-    throws ManifoldCFException
-  {
-    // Break the request into pieces, as needed, and throw everything into a hash for uniqueness.
-    // We are going to need to break up this query into a number of subqueries, each covering a subset of parent id hashes.
-    // The goal is to throw all the children into a hash, to make them unique at the end.
-    HashMap resultHash = new HashMap();
-    ArrayList list = new ArrayList();
-    int maxCount = maxClauseProcessDeleteHashSet();
-    int i = 0;
-    int z = 0;
-    while (i < docIDHashes.length)
-    {
-      if (z == maxCount)
-      {
-        processDeleteHashSet(jobID,resultHash,list);
-        list.clear();
-        z = 0;
-      }
-      list.add(docIDHashes[i]);
-      i++;
-      z++;
-    }
-
-    if (z > 0)
-      processDeleteHashSet(jobID,resultHash,list);
-
-    // Now, put together the result document list from the hash.
-    DocumentDescription[] rval = new DocumentDescription[resultHash.size()];
-    i = 0;
-    Iterator iter = resultHash.keySet().iterator();
-    while (iter.hasNext())
-    {
-      Long id = (Long)iter.next();
-      DocumentDescription dd = (DocumentDescription)resultHash.get(id);
-      rval[i++] = dd;
-    }
-    return rval;
-  }
-
-  /** Get maximum count.
-  */
-  protected int maxClauseProcessDeleteHashSet()
-  {
-    return database.findConjunctionClauseMax(new ClauseDescription[]{
-      new JoinClause("t1."+carryDown.jobIDField,"t0."+jobQueue.jobIDField),
-      new JoinClause("t1."+carryDown.childIDHashField,"t0."+jobQueue.docHashField)});
-  }
-  
-  /** Helper method: look up rows affected by a deleteRecords operation.
-  */
-  protected void processDeleteHashSet(Long jobID, HashMap resultHash, ArrayList list)
-    throws ManifoldCFException
-  {
-    // The query here mirrors the carrydown.restoreRecords() delete query!  However, it also fetches enough information to build a DocumentDescription
-    // object for return, and so a join is necessary against the jobqueue table.
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList newList = new ArrayList();
-
-    sb.append("t0.").append(jobQueue.idField).append(",")
-      .append("t0.").append(jobQueue.docHashField).append(",")
-      .append("t0.").append(jobQueue.docIDField)
-      .append(" FROM ").append(carryDown.getTableName()).append(" t1, ")
-        .append(jobQueue.getTableName()).append(" t0 WHERE ");
-
-    sb.append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause("t1."+carryDown.jobIDField,jobID),
-      new MultiClause("t1."+carryDown.parentIDHashField,list)})).append(" AND ");
-        
-    sb.append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-      new JoinClause("t0."+jobQueue.docHashField,"t1."+carryDown.childIDHashField),
-      new JoinClause("t0."+jobQueue.jobIDField,"t1."+carryDown.jobIDField)}));
-
-    /*
-    sb.append("t0.").append(jobQueue.idField).append(",")
-      .append("t0.").append(jobQueue.docHashField).append(",")
-      .append("t0.").append(jobQueue.docIDField)
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new UnitaryClause("t0."+jobQueue.jobIDField,jobID)})).append(" AND ");
-    
-    sb.append("EXISTS(SELECT 'x' FROM ").append(carryDown.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(newList,new ClauseDescription[]{
-        new JoinClause("t1."+carryDown.jobIDField,"t0."+jobQueue.jobIDField),
-        new MultiClause("t1."+carryDown.parentIDHashField,list),
-        new JoinClause("t1."+carryDown.childIDHashField,"t0."+jobQueue.docHashField)}))
-      .append(")");
-      */
-    
-    IResultSet set = database.performQuery(sb.toString(),newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long id = (Long)row.getValue(jobQueue.idField);
-      String documentIdentifierHash = (String)row.getValue(jobQueue.docHashField);
-      String documentIdentifier = (String)row.getValue(jobQueue.docIDField);
-      resultHash.put(id,new DocumentDescription(id,jobID,documentIdentifierHash,documentIdentifier));
-    }
-  }
-
-
-
-  /** Requeue a document for further processing in the future.
-  * This method is called after a document is processed, when the job is a "continuous" one.
-  * It is essentially equivalent to noting that the document processing is complete, except the
-  * document remains on the queue.
-  *@param documentDescriptions is the set of description objects for the document that was processed.
-  *@param executeTimes are the times that the documents should be rescanned.  Null indicates "never".
-  *@param actions are what should be done when the time arrives.  Choices are ACTION_RESCAN or ACTION_REMOVE.
-  */
-  @Override
-  public void requeueDocumentMultiple(DocumentDescription[] documentDescriptions, Long[] executeTimes,
-    int[] actions)
-    throws ManifoldCFException
-  {
-    String[] docIDHashes = new String[documentDescriptions.length];
-    Long[] ids = new Long[documentDescriptions.length];
-    Long[] executeTimesNew = new Long[documentDescriptions.length];
-    int[] actionsNew = new int[documentDescriptions.length];
-
-    // First loop maps document identifier back to an index.
-    HashMap indexMap = new HashMap();
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      docIDHashes[i] =documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      indexMap.put(docIDHashes[i],new Integer(i));
-      i++;
-    }
-
-    // Sort!
-    java.util.Arrays.sort(docIDHashes);
-
-    // Next loop populates the actual arrays we use to feed the operation so that the ordering is correct.
-    i = 0;
-    while (i < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[i];
-      Integer x = (Integer)indexMap.remove(docIDHash);
-      if (x == null)
-        throw new ManifoldCFException("Assertion failure: duplicate document identifier jobid/hash detected!");
-      int index = x.intValue();
-      ids[i] = documentDescriptions[index].getID();
-      executeTimesNew[i] = executeTimes[index];
-      actionsNew[i] = actions[index];
-      i++;
-    }
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Going through ids in order should greatly reduce or eliminate chances of deadlock occurring.  We thus need to pay attention to the sorted order.
-        i = 0;
-        while (i < ids.length)
-        {
-          jobQueue.setRequeuedStatus(ids[i],executeTimesNew[i],actionsNew[i],-1L,-1);
-          i++;
-        }
-
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction requeuing documents: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Requeue a document for further processing in the future.
-  * This method is called after a document is processed, when the job is a "continuous" one.
-  * It is essentially equivalent to noting that the document processing is complete, except the
-  * document remains on the queue.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param executeTime is the time that the document should be rescanned.  Null indicates "never".
-  *@param action is what should be done when the time arrives.  Choices include ACTION_RESCAN or ACTION_REMOVE.
-  */
-  @Override
-  public void requeueDocument(DocumentDescription documentDescription, Long executeTime, int action)
-    throws ManifoldCFException
-  {
-    requeueDocumentMultiple(new DocumentDescription[]{documentDescription},new Long[]{executeTime},new int[]{action});
-  }
-
-  /** Reset a set of documents for further processing in the future.
-  * This method is called after some unknown number of the documents were processed, but then a service interruption occurred.
-  * Note well: The logic here basically presumes that we cannot know whether the documents were indeed processed or not.
-  * If we knew for a fact that none of the documents had been handled, it would be possible to look at the document's
-  * current status and decide what the new status ought to be, based on a true rollback scenario.  Such cases, however, are rare enough so that
-  * special logic is probably not worth it.
-  *@param documentDescriptions is the set of description objects for the document that was processed.
-  *@param executeTime is the time that the documents should be rescanned.
-  *@param failTime is the time beyond which a service interruption will be considered a hard failure.
-  *@param failCount is the number of retries beyond which a service interruption will be considered a hard failure.
-  */
-  @Override
-  public void resetDocumentMultiple(DocumentDescription[] documentDescriptions, long executeTime,
-    int action, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    Long executeTimeLong = new Long(executeTime);
-    Long[] ids = new Long[documentDescriptions.length];
-    String[] docIDHashes = new String[documentDescriptions.length];
-    Long[] executeTimes = new Long[documentDescriptions.length];
-    int[] actions = new int[documentDescriptions.length];
-    long[] failTimes = new long[documentDescriptions.length];
-    int[] failCounts = new int[documentDescriptions.length];
-
-    // First loop maps document identifier back to an index.
-    HashMap indexMap = new HashMap();
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      docIDHashes[i] =documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      indexMap.put(docIDHashes[i],new Integer(i));
-      i++;
-    }
-
-    // Sort!
-    java.util.Arrays.sort(docIDHashes);
-
-    // Next loop populates the actual arrays we use to feed the operation so that the ordering is correct.
-    i = 0;
-    while (i < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[i];
-      Integer x = (Integer)indexMap.remove(docIDHash);
-      if (x == null)
-        throw new ManifoldCFException("Assertion failure: duplicate document identifier jobid/hash detected!");
-      int index = x.intValue();
-      ids[i] = documentDescriptions[index].getID();
-      executeTimes[i] = executeTimeLong;
-      actions[i] = action;
-      long oldFailTime = documentDescriptions[index].getFailTime();
-      if (oldFailTime == -1L)
-        oldFailTime = failTime;
-      failTimes[i] = oldFailTime;
-      int oldFailCount = documentDescriptions[index].getFailRetryCount();
-      if (oldFailCount == -1)
-        oldFailCount = failCount;
-      else
-      {
-        oldFailCount--;
-        if (failCount != -1 && oldFailCount > failCount)
-          oldFailCount = failCount;
-      }
-      failCounts[i] = oldFailCount;
-      i++;
-    }
-
-    // Documents get marked PENDINGPURGATORY regardless of their current state; this is because we can't know at this point whether
-    // an ingestion attempt occurred or not, so we have to treat the documents as having been processed at least once.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Going through ids in order should greatly reduce or eliminate chances of deadlock occurring.  We thus need to pay attention to the sorted order.
-        i = 0;
-        while (i < ids.length)
-        {
-          jobQueue.setRequeuedStatus(ids[i],executeTimes[i],actions[i],(failTimes==null)?-1L:failTimes[i],(failCounts==null)?-1:failCounts[i]);
-          i++;
-        }
-
-        database.performCommit();
-        break;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting documents: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-
-  /** Reset a set of cleaning documents for further processing in the future.
-  * This method is called after some unknown number of the documents were cleaned, but then an ingestion service interruption occurred.
-  * Note well: The logic here basically presumes that we cannot know whether the documents were indeed cleaned or not.
-  * If we knew for a fact that none of the documents had been handled, it would be possible to look at the document's
-  * current status and decide what the new status ought to be, based on a true rollback scenario.  Such cases, however, are rare enough so that
-  * special logic is probably not worth it.
-  *@param documentDescriptions is the set of description objects for the document that was cleaned.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  @Override
-  public void resetCleaningDocumentMultiple(DocumentDescription[] documentDescriptions, long checkTime)
-    throws ManifoldCFException
-  {
-    Long[] ids = new Long[documentDescriptions.length];
-    String[] docIDHashes = new String[documentDescriptions.length];
-
-    // First loop maps document identifier back to an index.
-    HashMap indexMap = new HashMap();
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      docIDHashes[i] =documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      indexMap.put(docIDHashes[i],new Integer(i));
-      i++;
-    }
-
-    // Sort!
-    java.util.Arrays.sort(docIDHashes);
-
-    // Next loop populates the actual arrays we use to feed the operation so that the ordering is correct.
-    i = 0;
-    while (i < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[i];
-      Integer x = (Integer)indexMap.remove(docIDHash);
-      if (x == null)
-        throw new ManifoldCFException("Assertion failure: duplicate document identifier jobid/hash detected!");
-      int index = x.intValue();
-      ids[i] = documentDescriptions[index].getID();
-      i++;
-    }
-
-    // Documents get marked PURGATORY regardless of their current state; this is because we can't know at this point what the actual prior state was.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Going through ids in order should greatly reduce or eliminate chances of deadlock occurring.  We thus need to pay attention to the sorted order.
-        i = 0;
-        while (i < ids.length)
-        {
-          jobQueue.setUncleaningStatus(ids[i],checkTime);
-          i++;
-        }
-
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting cleaning documents: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a cleaning document back to its former state.
-  * This gets done when a deleting thread sees a service interruption, etc., from the ingestion system.
-  *@param documentDescription is the description of the document that was cleaned.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  @Override
-  public void resetCleaningDocument(DocumentDescription documentDescription, long checkTime)
-    throws ManifoldCFException
-  {
-    resetCleaningDocumentMultiple(new DocumentDescription[]{documentDescription},checkTime);
-  }
-
-  /** Reset a set of deleting documents for further processing in the future.
-  * This method is called after some unknown number of the documents were deleted, but then an ingestion service interruption occurred.
-  * Note well: The logic here basically presumes that we cannot know whether the documents were indeed processed or not.
-  * If we knew for a fact that none of the documents had been handled, it would be possible to look at the document's
-  * current status and decide what the new status ought to be, based on a true rollback scenario.  Such cases, however, are rare enough so that
-  * special logic is probably not worth it.
-  *@param documentDescriptions is the set of description objects for the document that was processed.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  @Override
-  public void resetDeletingDocumentMultiple(DocumentDescription[] documentDescriptions, long checkTime)
-    throws ManifoldCFException
-  {
-    Long[] ids = new Long[documentDescriptions.length];
-    String[] docIDHashes = new String[documentDescriptions.length];
-
-    // First loop maps document identifier back to an index.
-    HashMap indexMap = new HashMap();
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      docIDHashes[i] =documentDescriptions[i].getDocumentIdentifierHash() + ":" + documentDescriptions[i].getJobID();
-      indexMap.put(docIDHashes[i],new Integer(i));
-      i++;
-    }
-
-    // Sort!
-    java.util.Arrays.sort(docIDHashes);
-
-    // Next loop populates the actual arrays we use to feed the operation so that the ordering is correct.
-    i = 0;
-    while (i < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[i];
-      Integer x = (Integer)indexMap.remove(docIDHash);
-      if (x == null)
-        throw new ManifoldCFException("Assertion failure: duplicate document identifier jobid/hash detected!");
-      int index = x.intValue();
-      ids[i] = documentDescriptions[index].getID();
-      i++;
-    }
-
-    // Documents get marked COMPLETED regardless of their current state; this is because we can't know at this point what the actual prior state was.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Going through ids in order should greatly reduce or eliminate chances of deadlock occurring.  We thus need to pay attention to the sorted order.
-        i = 0;
-        while (i < ids.length)
-        {
-          jobQueue.setUndeletingStatus(ids[i],checkTime);
-          i++;
-        }
-
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting documents: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a deleting document back to its former state.
-  * This gets done when a deleting thread sees a service interruption, etc., from the ingestion system.
-  *@param documentDescription is the description object for the document that was cleaned.
-  *@param checkTime is the minimum time for the next cleaning attempt.
-  */
-  @Override
-  public void resetDeletingDocument(DocumentDescription documentDescription, long checkTime)
-    throws ManifoldCFException
-  {
-    resetDeletingDocumentMultiple(new DocumentDescription[]{documentDescription},checkTime);
-  }
-
-
-  /** Reset an active document back to its former state.
-  * This gets done when there's a service interruption and the document cannot be processed yet.
-  * Note well: This method formerly presumed that a perfect rollback was possible, and that there was zero chance of any
-  * processing activity occuring before it got called.  That assumption appears incorrect, however, so I've opted to now
-  * presume that processing has perhaps occurred.  Perfect rollback is thus no longer possible.
-  *@param documentDescription is the description object for the document that was processed.
-  *@param executeTime is the time that the document should be rescanned.
-  *@param failTime is the time that the document should be considered to have failed, if it has not been
-  * successfully read until then.
-  */
-  @Override
-  public void resetDocument(DocumentDescription documentDescription, long executeTime, int action, long failTime,
-    int failCount)
-    throws ManifoldCFException
-  {
-    resetDocumentMultiple(new DocumentDescription[]{documentDescription},executeTime,action,failTime,failCount);
-  }
-
-  /** Eliminate duplicates, and sort */
-  protected static String[] eliminateDuplicates(String[] docIDHashes)
-  {
-    HashMap map = new HashMap();
-    int i = 0;
-    while (i < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[i++];
-      map.put(docIDHash,docIDHash);
-    }
-    String[] rval = new String[map.size()];
-    i = 0;
-    Iterator iter = map.keySet().iterator();
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-
-  /** Build a reorder map, describing how to convert an original index into a reordered index. */
-  protected static HashMap buildReorderMap(String[] originalIDHashes, String[] reorderedIDHashes)
-  {
-    HashMap reorderSet = new HashMap();
-    int i = 0;
-    while (i < reorderedIDHashes.length)
-    {
-      String reorderedIDHash = reorderedIDHashes[i];
-      Integer position = new Integer(i);
-      reorderSet.put(reorderedIDHash,position);
-      i++;
-    }
-
-    HashMap map = new HashMap();
-    int j = 0;
-    while (j < originalIDHashes.length)
-    {
-      String originalIDHash = originalIDHashes[j];
-      Integer position = (Integer)reorderSet.get(originalIDHash);
-      if (position != null)
-      {
-        map.put(new Integer(j),position);
-        // Remove, so that only one of each duplicate will have a place in the map
-        reorderSet.remove(originalIDHash);
-      }
-      j++;
-    }
-
-    return map;
-  }
-
-  // Retry methods.  These set failTime and failCount.
-  
-  /** Retry startup.
-  *@param jsr is the current job notification record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failCount is the new fail retry count (-1 if none).
-  */
-  @Override
-  public void retryStartup(JobStartRecord jsr, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    Long jobID = jsr.getJobID();
-    long oldFailTime = jsr.getFailTime();
-    if (oldFailTime == -1L)
-      oldFailTime = failTime;
-    failTime = oldFailTime;
-    int oldFailCount = jsr.getFailRetryCount();
-    if (oldFailCount == -1)
-      oldFailCount = failCount;
-    else
-    {
-      oldFailCount--;
-      if (failCount != -1 && oldFailCount > failCount)
-        oldFailCount = failCount;
-    }
-    failCount = oldFailCount;
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.retryStartup(jobID,jsr.getRequestMinimum(),failTime,failCount);
-        database.performCommit();
-        break;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting job startup: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Retry seeding.
-  *@param jsr is the current job seeding record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failCount is the new fail retry count (-1 if none).
-  */
-  @Override
-  public void retrySeeding(JobSeedingRecord jsr, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    Long jobID = jsr.getJobID();
-    long oldFailTime = jsr.getFailTime();
-    if (oldFailTime == -1L)
-      oldFailTime = failTime;
-    failTime = oldFailTime;
-    int oldFailCount = jsr.getFailRetryCount();
-    if (oldFailCount == -1)
-      oldFailCount = failCount;
-    else
-    {
-      oldFailCount--;
-      if (failCount != -1 && oldFailCount > failCount)
-        oldFailCount = failCount;
-    }
-    failCount = oldFailCount;
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.retrySeeding(jobID,failTime,failCount);
-        database.performCommit();
-        break;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting job seeding: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Retry notification.
-  *@param jnr is the current job notification record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failCount is the new fail retry count (-1 if none).
-  */
-  @Override
-  public void retryNotification(JobNotifyRecord jnr, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    Long jobID = jnr.getJobID();
-    long oldFailTime = jnr.getFailTime();
-    if (oldFailTime == -1L)
-      oldFailTime = failTime;
-    failTime = oldFailTime;
-    int oldFailCount = jnr.getFailRetryCount();
-    if (oldFailCount == -1)
-      oldFailCount = failCount;
-    else
-    {
-      oldFailCount--;
-      if (failCount != -1 && oldFailCount > failCount)
-        oldFailCount = failCount;
-    }
-    failCount = oldFailCount;
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.retryNotification(jobID,failTime,failCount);
-        database.performCommit();
-        break;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting job notification: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-  }
-
-  /** Retry delete notification.
-  *@param jnr is the current job notification record.
-  *@param failTime is the new fail time (-1L if none).
-  *@param failCount is the new fail retry count (-1 if none).
-  */
-  @Override
-  public void retryDeleteNotification(JobNotifyRecord jnr, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    Long jobID = jnr.getJobID();
-    long oldFailTime = jnr.getFailTime();
-    if (oldFailTime == -1L)
-      oldFailTime = failTime;
-    failTime = oldFailTime;
-    int oldFailCount = jnr.getFailRetryCount();
-    if (oldFailCount == -1)
-      oldFailCount = failCount;
-    else
-    {
-      oldFailCount--;
-      if (failCount != -1 && oldFailCount > failCount)
-        oldFailCount = failCount;
-    }
-    failCount = oldFailCount;
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.retryDeleteNotification(jobID,failTime,failCount);
-        database.performCommit();
-        break;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting job notification: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-  }
-
-  // Add documents methods
-  
-  /** Add an initial set of documents to the queue.
-  * This method is called during job startup, when the queue is being loaded.
-  * A set of document references is passed to this method, which updates the status of the document
-  * in the specified job's queue, according to specific state rules.
-  *@param processID is the current process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDs are the local document identifiers.
-  *@param overrideSchedule is true if any existing document schedule should be overridden.
-  *@param hopcountMethod is either accurate, nodelete, or neverdelete.
-  *@param documentPriorities are the document priorities corresponding to the document identifiers.
-  *@param prereqEventNames are the events that must be completed before each document can be processed.
-  */
-  @Override
-  public void addDocumentsInitial(String processID, Long jobID, String[] legalLinkTypes,
-    String[] docIDHashes, String[] docIDs, boolean overrideSchedule,
-    int hopcountMethod, IPriorityCalculator[] documentPriorities,
-    String[][] prereqEventNames)
-    throws ManifoldCFException
-  {
-    if (docIDHashes.length == 0)
-      return;
-
-    // The document identifiers need to be sorted in a consistent fashion to reduce deadlock, and have duplicates removed, before going ahead.
-    // But, the documentPriorities and the return booleans need to correspond to the initial array.  So, after we come up with
-    // our internal order, we need to construct a map that takes an original index and maps it to the reduced, reordered index.
-    String[] reorderedDocIDHashes = eliminateDuplicates(docIDHashes);
-    HashMap reorderMap = buildReorderMap(docIDHashes,reorderedDocIDHashes);
-    IPriorityCalculator[] reorderedDocumentPriorities = new IPriorityCalculator[reorderedDocIDHashes.length];
-    String[][] reorderedDocumentPrerequisites = new String[reorderedDocIDHashes.length][];
-    String[] reorderedDocumentIdentifiers = new String[reorderedDocIDHashes.length];
-    int i = 0;
-    while (i < docIDHashes.length)
-    {
-      Integer newPosition = (Integer)reorderMap.get(new Integer(i));
-      if (newPosition != null)
-      {
-        reorderedDocumentPriorities[newPosition.intValue()] = documentPriorities[i];
-        if (prereqEventNames != null)
-          reorderedDocumentPrerequisites[newPosition.intValue()] = prereqEventNames[i];
-        else
-          reorderedDocumentPrerequisites[newPosition.intValue()] = null;
-        reorderedDocumentIdentifiers[newPosition.intValue()] = docIDs[i];
-      }
-      i++;
-    }
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to add "+Integer.toString(reorderedDocIDHashes.length)+" initial docs and hopcounts for job "+jobID.toString());
-    }
-
-    // Postgres gets all screwed up if we permit multiple threads into the hopcount code, unless serialized
-    // transactions are used.  But serialized transactions may require a retry in order
-    // to resolve transaction conflicts.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Waited "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to start adding "+Integer.toString(reorderedDocIDHashes.length)+
-          " initial docs and hopcounts for job "+jobID.toString());
-
-        // Go through document id's one at a time, in order - mainly to prevent deadlock as much as possible.  Search for any existing row in jobqueue first (for update)
-        int z = 0;
-        while (z < reorderedDocIDHashes.length)
-        {
-          String docIDHash = reorderedDocIDHashes[z];
-          IPriorityCalculator docPriority = reorderedDocumentPriorities[z];
-          String docID = reorderedDocumentIdentifiers[z];
-          String[] docPrereqs = reorderedDocumentPrerequisites[z];
-
-          StringBuilder sb = new StringBuilder("SELECT ");
-          ArrayList list = new ArrayList();
-          
-          sb.append(jobQueue.idField).append(",")
-            .append(jobQueue.statusField).append(",")
-            .append(jobQueue.checkTimeField)
-            .append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobQueue.docHashField,docIDHash),
-              new UnitaryClause(jobQueue.jobIDField,jobID)}));
-
-          sb.append(" FOR UPDATE");
-
-          IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-          long executeTime = overrideSchedule?0L:-1L;
-
-          if (set.getRowCount() > 0)
-          {
-            // Found a row, and it is now locked.
-            IResultRow row = set.getRow(0);
-
-            // Decode the row
-            Long rowID = (Long)row.getValue(jobQueue.idField);
-            int status = jobQueue.stringToStatus((String)row.getValue(jobQueue.statusField));
-            Long checkTimeValue = (Long)row.getValue(jobQueue.checkTimeField);
-
-            jobQueue.updateExistingRecordInitial(rowID,status,checkTimeValue,executeTime,docPriority,docPrereqs,processID);
-          }
-          else
-          {
-            // Not found.  Attempt an insert instead.  This may fail due to constraints, but if this happens, the whole transaction will be retried.
-            jobQueue.insertNewRecordInitial(jobID,docIDHash,docID,docPriority,executeTime,docPrereqs,processID);
-          }
-
-          z++;
-        }
-
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to add "+Integer.toString(reorderedDocIDHashes.length)+
-          " initial docs for job "+jobID.toString());
-
-        if (legalLinkTypes.length > 0)
-          hopCount.recordSeedReferences(jobID,legalLinkTypes,reorderedDocIDHashes,hopcountMethod,processID);
-
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to add "+Integer.toString(reorderedDocIDHashes.length)+
-          " initial docs and hopcounts for job "+jobID.toString());
-
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction adding "+Integer.toString(reorderedDocIDHashes.length)+
-            " initial docs for job "+jobID.toString()+": "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Add an initial set of remaining documents to the queue.
-  * This method is called during job startup, when the queue is being loaded, to list documents that
-  * were NOT included by calling addDocumentsInitial().  Documents listed here are simply designed to
-  * enable the framework to get rid of old, invalid seeds.  They are not queued for processing.
-  *@param processID is the current process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes are the local document identifier hashes.
-  *@param hopcountMethod is either accurate, nodelete, or neverdelete.
-  */
-  @Override
-  public void addRemainingDocumentsInitial(String processID,
-    Long jobID, String[] legalLinkTypes, String[] docIDHashes,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    if (docIDHashes.length == 0)
-      return;
-
-    String[] reorderedDocIDHashes = eliminateDuplicates(docIDHashes);
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to add "+Integer.toString(reorderedDocIDHashes.length)+" remaining docs and hopcounts for job "+jobID.toString());
-    }
-
-    // Postgres gets all screwed up if we permit multiple threads into the hopcount code, unless the transactions are serialized,
-    // and allows one transaction to see the effects of another transaction before it's been committed.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Waited "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to start adding "+Integer.toString(reorderedDocIDHashes.length)+
-          " remaining docs and hopcounts for job "+jobID.toString());
-
-        jobQueue.addRemainingDocumentsInitial(jobID,reorderedDocIDHashes,processID);
-        if (legalLinkTypes.length > 0)
-          hopCount.recordSeedReferences(jobID,legalLinkTypes,reorderedDocIDHashes,hopcountMethod,processID);
-
-        database.performCommit();
-        
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to add "+Integer.toString(reorderedDocIDHashes.length)+
-          " remaining docs and hopcounts for job "+jobID.toString());
-
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction adding "+Integer.toString(reorderedDocIDHashes.length)+
-            " remaining docs and hopcounts for job "+jobID.toString()+": "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Signal that a seeding pass has been done.
-  * Call this method at the end of a seeding pass.  It is used to perform the bookkeeping necessary to
-  * maintain the hopcount table.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param isPartial is set if the seeds provided are only a partial list.  Some connectors cannot
-  *       supply a full list of seeds on every seeding iteration; this acknowledges that limitation.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  */
-  @Override
-  public void doneDocumentsInitial(Long jobID, String[] legalLinkTypes, boolean isPartial,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to finish initial docs and hopcounts for job "+jobID.toString());
-    }
-
-    // Postgres gets all screwed up if we permit multiple threads into the hopcount code, unless serialized transactions are used.
-    // and allows one transaction to see the effects of another transaction before it's been committed.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Waited "+new Long(System.currentTimeMillis()-startTime).toString()+
-          " ms to start finishing initial docs and hopcounts for job "+jobID.toString());
-
-        jobQueue.doneDocumentsInitial(jobID,isPartial);
-
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+
-          " ms to finish initial docs for job "+jobID.toString());
-
-        if (legalLinkTypes.length > 0)
-          hopCount.finishSeedReferences(jobID,legalLinkTypes,hopcountMethod);
-
-        database.performCommit();
-        
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+
-          " ms to finish initial docs and hopcounts for job "+jobID.toString());
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction finishing initial docs and hopcounts for job "+jobID.toString()+": "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Get the specified hop counts, with the limit as described.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes are the hashes for the set of documents to find the hopcount for.
-  *@param linkType is the kind of link to find the hopcount for.
-  *@param limit is the limit, beyond which a negative distance may be returned.
-  *@param hopcountMethod is the method for managing hopcounts that is in effect.
-  *@return a vector of booleans corresponding to the documents requested.  A true value is returned
-  * if the document is within the specified limit, false otherwise.
-  */
-  @Override
-  public boolean[] findHopCounts(Long jobID, String[] legalLinkTypes, String[] docIDHashes, String linkType, int limit,
-    int hopcountMethod)
-    throws ManifoldCFException
-  {
-    if (docIDHashes.length == 0)
-      return new boolean[0];
-
-    if (legalLinkTypes.length == 0)
-      throw new ManifoldCFException("Nonsensical request; asking for hopcounts where none are kept");
-
-    // The idea is to delay queue processing as much as possible, because that avoids having to wait
-    // on locks and having to repeat our evaluations.
-    //
-    // Luckily, we can glean a lot of information from what's hanging around.  Specifically, whatever value
-    // we find in the table is an upper bound on the true hop distance value.  So, only if we have documents
-    // that are outside the limit does the queue need to be processed.
-    //
-    // It is therefore really helpful to write in an estimated value for any newly created record, if possible.  Even if the
-    // estimate is possibly greater than the true value, a great deal of locking and queue processing will be
-    // avoided.
-
-    // The flow here is to:
-    // - grab the right hoplock
-    // - process the queue
-    // - if the queue is empty, get the hopcounts we wanted, otherwise release the lock and loop around
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Beginning work to get "+Integer.toString(docIDHashes.length)+" hopcounts for job "+jobID.toString());
-    }
-
-    // Make an answer array.
-    boolean[] rval = new boolean[docIDHashes.length];
-
-    // Make a hash of what we still need a definitive answer for.
-    HashMap badAnswers = new HashMap();
-    int i = 0;
-    while (i < rval.length)
-    {
-      String docIDHash = docIDHashes[i];
-      rval[i] = false;
-      badAnswers.put(docIDHash,new Integer(i));
-      i++;
-    }
-
-    int iterationCount = 0;
-    while (true)
-    {
-      // Ask for only about documents we don't have a definitive answer for yet.
-      String[] askDocIDHashes = new String[badAnswers.size()];
-      i = 0;
-      Iterator iter = badAnswers.keySet().iterator();
-      while (iter.hasNext())
-      {
-        askDocIDHashes[i++] = (String)iter.next();
-      }
-
-      int[] distances = hopCount.findHopCounts(jobID,askDocIDHashes,linkType);
-      i = 0;
-      while (i < distances.length)
-      {
-        int distance = distances[i];
-        String docIDHash = askDocIDHashes[i];
-        if (distance != -1 && distance <= limit)
-        {
-          // Found a usable value
-          rval[((Integer)badAnswers.remove(docIDHash)).intValue()] = true;
-        }
-        i++;
-      }
-
-      if (Logging.perf.isDebugEnabled())
-        Logging.perf.debug("Iteration "+Integer.toString(iterationCount++)+": After initial check, "+Integer.toString(badAnswers.size())+
-        " hopcounts remain to be found for job "+jobID.toString()+", out of "+Integer.toString(docIDHashes.length)+
-        " ("+new Long(System.currentTimeMillis()-startTime).toString()+" ms)");
-
-      if (badAnswers.size() == 0)
-        return rval;
-
-      // It appears we need to process the queue.  We need to enter the hoplock section
-      // to make sure only one player is updating values at a time.  Then, before we exit, we get the
-      // remaining values.
-
-      askDocIDHashes = new String[badAnswers.size()];
-      i = 0;
-      iter = badAnswers.keySet().iterator();
-      while (iter.hasNext())
-      {
-        askDocIDHashes[i++] = (String)iter.next();
-      }
-
-      // Currently, only one thread can possibly process any of the queue at a given time.  This is because the queue marks are not set to something
-      // other than than the "in queue" value during processing.  My instinct is that queue processing is likely to interfere with other queue processing,
-      // so I've taken the route of prohibiting more than one batch of queue processing at a time, for now.
-
-      String hopLockName = getHopLockName(jobID);
-      long sleepAmt = 0L;
-      lockManager.enterWriteLock(hopLockName);
-      try
-      {
-        database.beginTransaction(database.TRANSACTION_SERIALIZED);
-        try
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Processing queue for job "+jobID.toString()+" ("+new Long(System.currentTimeMillis()-startTime).toString()+" ms)");
-
-          // The internal queue processing only does 200 at a time.  This is a compromise between maximum efficiency (bigger number)
-          // and the requirement that database writes are effectively blocked for a while (which argues for a smaller number).
-          boolean definitive = hopCount.processQueue(jobID,legalLinkTypes,hopcountMethod);
-          // If definitive answers were not found, we leave the lock and go back to check on the status of the questions we were
-          // interested in.  If the answers are all OK then we are done; if not, we need to process more queue, and keep doing that
-          // until we really ARE done.
-          if (!definitive)
-          {
-            // Sleep a little bit so another thread can have a whack at things
-            sleepAmt = 100L;
-            database.performCommit();
-            continue;
-          }
-
-          // Definitive answers found; continue through.
-          distances = hopCount.findHopCounts(jobID,askDocIDHashes,linkType);
-          database.performCommit();
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction processing queue for job "+jobID.toString()+": "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(hopLockName);
-        sleepFor(sleepAmt);
-      }
-
-      if (Logging.perf.isDebugEnabled())
-        Logging.perf.debug("Definitive answers found for "+Integer.toString(docIDHashes.length)+
-        " hopcounts for job "+jobID.toString()+" ("+new Long(System.currentTimeMillis()-startTime).toString()+" ms)");
-
-      // All answers are guaranteed to be accurate now.
-      i = 0;
-      while (i < distances.length)
-      {
-        int distance = distances[i];
-        String docIDHash = askDocIDHashes[i];
-        if (distance != -1 && distance <= limit)
-        {
-          // Found a usable value
-          rval[((Integer)badAnswers.remove(docIDHash)).intValue()] = true;
-        }
-        i++;
-      }
-      return rval;
-    }
-  }
-
-  /** Get all the current seeds.
-  * Returns the seed document identifiers for a job.
-  *@param jobID is the job identifier.
-  *@return the document identifiers that are currently considered to be seeds.
-  */
-  @Override
-  public String[] getAllSeeds(Long jobID)
-    throws ManifoldCFException
-  {
-    return jobQueue.getAllSeeds(jobID);
-  }
-
-  /** Add documents to the queue in bulk.
-  * This method is called during document processing, when a set of document references are discovered.
-  * The document references are passed to this method, which updates the status of the document(s)
-  * in the specified job's queue, according to specific state rules.
-  *@param processID is the process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHashes are the local document identifier hashes.
-  *@param parentIdentifierHash is the optional parent identifier hash of this document.  Pass null if none. 
-  *       MUST be present in the case of carrydown information.
-  *@param relationshipType is the optional link type between this document and its parent.  Pass null if there
-  *       is no relationship with a parent.
-  *@param hopcountMethod is the desired method for managing hopcounts.
-  *@param dataNames are the names of the data to carry down to the child from this parent.
-  *@param dataValues are the values to carry down to the child from this parent, corresponding to dataNames above.  If CharacterInput objects are passed in here,
-  *       it is the caller's responsibility to clean these up.
-  *@param currentTime is the time in milliseconds since epoch that will be recorded for this operation.
-  *@param documentPriorities are the desired document priorities for the documents.
-  *@param prereqEventNames are the events that must be completed before a document can be queued.
-  */
-  @Override
-  public void addDocuments(String processID,
-    Long jobID, String[] legalLinkTypes,
-    String[] docIDHashes, String[] docIDs,
-    String parentIdentifierHash, String relationshipType,
-    int hopcountMethod, String[][] dataNames, Object[][][] dataValues,
-    IPriorityCalculator[] documentPriorities,
-    String[][] prereqEventNames)
-    throws ManifoldCFException
-  {
-    if (docIDs.length == 0)
-      return;
-
-    // Sort the id hashes and eliminate duplicates.  This will help avoid deadlock conditions.
-    // However, we also need to keep the carrydown data in synch, so track that around as well, and merge if there are
-    // duplicate document identifiers.
-    HashMap nameMap = new HashMap();
-    int k = 0;
-    while (k < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[k];
-      // If there are duplicates, we need to merge them.
-      HashMap names = (HashMap)nameMap.get(docIDHash);
-      if (names == null)
-      {
-        names = new HashMap();
-        nameMap.put(docIDHash,names);
-      }
-
-      String[] nameList = dataNames[k];
-      Object[][] dataList = dataValues[k];
-
-      int z = 0;
-      while (z < nameList.length)
-      {
-        String name = nameList[z];
-        Object[] values = dataList[z];
-        HashMap valueMap = (HashMap)names.get(name);
-        if (valueMap == null)
-        {
-          valueMap = new HashMap();
-          names.put(name,valueMap);
-        }
-        int y = 0;
-        while (y < values.length)
-        {
-          // Calculate the value hash; that's the true key, and the one that cannot be duplicated.
-          String valueHash;
-          if (values[y] instanceof CharacterInput)
-          {
-            // It's a CharacterInput object.
-            valueHash = ((CharacterInput)values[y]).getHashValue();
-          }
-          else
-          {
-            // It better be a String.
-            valueHash = ManifoldCF.hash((String)values[y]);
-          }
-          valueMap.put(valueHash,values[y]);
-          y++;
-        }
-        z++;
-      }
-      k++;
-    }
-
-    String[] reorderedDocIDHashes = eliminateDuplicates(docIDHashes);
-    HashMap reorderMap = buildReorderMap(docIDHashes,reorderedDocIDHashes);
-    IPriorityCalculator[] reorderedDocumentPriorities = new IPriorityCalculator[reorderedDocIDHashes.length];
-    String[][] reorderedDocumentPrerequisites = new String[reorderedDocIDHashes.length][];
-    String[] reorderedDocumentIdentifiers = new String[reorderedDocIDHashes.length];
-    boolean[] rval = new boolean[docIDHashes.length];
-    int i = 0;
-    while (i < docIDHashes.length)
-    {
-      Integer newPosition = (Integer)reorderMap.get(new Integer(i));
-      if (newPosition != null)
-      {
-        reorderedDocumentPriorities[newPosition.intValue()] = documentPriorities[i];
-        if (prereqEventNames != null)
-          reorderedDocumentPrerequisites[newPosition.intValue()] = prereqEventNames[i];
-        else
-          reorderedDocumentPrerequisites[newPosition.intValue()] = null;
-        reorderedDocumentIdentifiers[newPosition.intValue()] = docIDs[i];
-      }
-      rval[i] = false;
-      i++;
-    }
-
-    dataNames = new String[reorderedDocIDHashes.length][];
-    String[][][] dataHashValues = new String[reorderedDocIDHashes.length][][];
-    dataValues = new Object[reorderedDocIDHashes.length][][];
-
-    k = 0;
-    while (k < reorderedDocIDHashes.length)
-    {
-      String docIDHash = reorderedDocIDHashes[k];
-      HashMap names = (HashMap)nameMap.get(docIDHash);
-      dataNames[k] = new String[names.size()];
-      dataHashValues[k] = new String[names.size()][];
-      dataValues[k] = new Object[names.size()][];
-      Iterator iter = names.keySet().iterator();
-      int z = 0;
-      while (iter.hasNext())
-      {
-        String dataName = (String)iter.next();
-        (dataNames[k])[z] = dataName;
-        HashMap values = (HashMap)names.get(dataName);
-        (dataHashValues[k])[z] = new String[values.size()];
-        (dataValues[k])[z] = new Object[values.size()];
-        Iterator iter2 = values.keySet().iterator();
-        int y = 0;
-        while (iter2.hasNext())
-        {
-          String dataValueHash = (String)iter2.next();
-          Object dataValue = values.get(dataValueHash);
-          ((dataHashValues[k])[z])[y] = dataValueHash;
-          ((dataValues[k])[z])[y] = dataValue;
-          y++;
-        }
-        z++;
-      }
-      k++;
-    }
-
-    long startTime = 0L;
-    if (Logging.perf.isDebugEnabled())
-    {
-      startTime = System.currentTimeMillis();
-      Logging.perf.debug("Waiting to add "+Integer.toString(reorderedDocIDHashes.length)+" docs and hopcounts for job "+jobID.toString()+" parent identifier "+parentIdentifierHash);
-    }
-
-    // Postgres gets all screwed up if we permit multiple threads into the hopcount code,
-    // and allows one transaction to see the effects of another transaction before it's been committed.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Waited "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to start adding "+Integer.toString(reorderedDocIDHashes.length)+
-          " docs and hopcounts for job "+jobID.toString()+" parent identifier hash "+parentIdentifierHash);
-
-        // Go through document id's one at a time, in order - mainly to prevent deadlock as much as possible.  Search for any existing row in jobqueue first (for update)
-        Map<String,JobqueueRecord> existingRows = new HashMap<String,JobqueueRecord>();
-
-        for (int z = 0; z < reorderedDocIDHashes.length; z++)
-        {
-          String docIDHash = reorderedDocIDHashes[z];
-
-          StringBuilder sb = new StringBuilder("SELECT ");
-          ArrayList list = new ArrayList();
-          
-          sb.append(jobQueue.idField).append(",")
-            .append(jobQueue.statusField).append(",")
-            .append(jobQueue.checkTimeField)
-            .append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobQueue.docHashField,docIDHash),
-              new UnitaryClause(jobQueue.jobIDField,jobID)}));
-              
-          sb.append(" FOR UPDATE");
-              
-          IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-          if (set.getRowCount() > 0)
-          {
-            // Found a row, and it is now locked.
-            IResultRow row = set.getRow(0);
-
-            // Decode the row
-            Long rowID = (Long)row.getValue(jobQueue.idField);
-            int status = jobQueue.stringToStatus((String)row.getValue(jobQueue.statusField));
-            Long checkTimeValue = (Long)row.getValue(jobQueue.checkTimeField);
-
-            existingRows.put(docIDHash,new JobqueueRecord(rowID,status,checkTimeValue));
-          }
-          else
-          {
-            // Not found.  Attempt an insert instead.  This may fail due to constraints, but if this happens, the whole transaction will be retried.
-            jobQueue.insertNewRecord(jobID,docIDHash,reorderedDocumentIdentifiers[z],reorderedDocumentPriorities[z],0L,reorderedDocumentPrerequisites[z]);
-          }
-
-        }
-
-        // Update all the carrydown data at once, for greatest efficiency.
-        boolean[] carrydownChangesSeen = carryDown.recordCarrydownDataMultiple(jobID,parentIdentifierHash,reorderedDocIDHashes,dataNames,dataHashValues,dataValues,processID);
-
-        // Same with hopcount.
-        boolean[] hopcountChangesSeen = null;
-        if (parentIdentifierHash != null && relationshipType != null)
-          hopcountChangesSeen = hopCount.recordReferences(jobID,legalLinkTypes,parentIdentifierHash,reorderedDocIDHashes,relationshipType,hopcountMethod,processID);
-
-        boolean reactivateRemovedHopcountRecords = false;
-        
-        for (int z = 0; z < reorderedDocIDHashes.length; z++)
-        {
-          String docIDHash = reorderedDocIDHashes[z];
-          JobqueueRecord jr = existingRows.get(docIDHash);
-          if (jr != null)
-          {
-            // It was an existing row; do the update logic
-            // The hopcountChangesSeen array describes whether each reference is a new one.  This
-            // helps us determine whether we're going to need to "flip" HOPCOUNTREMOVED documents
-            // to the PENDING state.  If the new link ended in an existing record, THEN we need to flip them all!
-            jobQueue.updateExistingRecord(jr.getRecordID(),jr.getStatus(),jr.getCheckTimeValue(),
-              0L,carrydownChangesSeen[z] || (hopcountChangesSeen!=null && hopcountChangesSeen[z]),
-              reorderedDocumentPriorities[z],reorderedDocumentPrerequisites[z]);
-            // Signal if we need to perform the flip
-            if (hopcountChangesSeen != null && hopcountChangesSeen[z])
-              reactivateRemovedHopcountRecords = true;
-          }
-        }
-
-        if (reactivateRemovedHopcountRecords)
-          jobQueue.reactivateHopcountRemovedRecords(jobID);
-
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        
-        if (Logging.perf.isDebugEnabled())
-          Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to add "+Integer.toString(reorderedDocIDHashes.length)+
-          " docs and hopcounts for job "+jobID.toString()+" parent identifier hash "+parentIdentifierHash);
-
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          sleepAmt = getRandomAmount();
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction adding "+Integer.toString(reorderedDocIDHashes.length)+
-            " docs and hopcounts for job "+jobID.toString()+" parent identifier hash "+parentIdentifierHash+": "+e.getMessage()+"; sleeping for "+new Long(sleepAmt).toString()+" ms",e);
-          continue;
-        }
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-
-  /** Add a document to the queue.
-  * This method is called during document processing, when a document reference is discovered.
-  * The document reference is passed to this method, which updates the status of the document
-  * in the specified job's queue, according to specific state rules.
-  *@param processID is the process ID.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param docIDHash is the local document identifier hash value.
-  *@param parentIdentifierHash is the optional parent identifier hash of this document.  Pass null if none.
-  *       MUST be present in the case of carrydown information.
-  *@param relationshipType is the optional link type between this document and its parent.  Pass null if there
-  *       is no relationship with a parent.
-  *@param hopcountMethod is the desired method for managing hopcounts.
-  *@param dataNames are the names of the data to carry down to the child from this parent.
-  *@param dataValues are the values to carry down to the child from this parent, corresponding to dataNames above.
-  *@param priority is the desired document priority for the document.
-  *@param prereqEventNames are the events that must be completed before the document can be processed.
-  */
-  @Override
-  public void addDocument(String processID,
-    Long jobID, String[] legalLinkTypes, String docIDHash, String docID,
-    String parentIdentifierHash, String relationshipType,
-    int hopcountMethod, String[] dataNames, Object[][] dataValues,
-    IPriorityCalculator priority, String[] prereqEventNames)
-    throws ManifoldCFException
-  {
-    addDocuments(processID,jobID,legalLinkTypes,
-      new String[]{docIDHash},new String[]{docID},
-      parentIdentifierHash,relationshipType,hopcountMethod,new String[][]{dataNames},
-      new Object[][][]{dataValues},new IPriorityCalculator[]{priority},new String[][]{prereqEventNames});
-  }
-
-  /** Undo the addition of child documents to the queue, for a set of documents.
-  * This method is called at the end of document processing, to back out any incomplete additions to the queue, and restore
-  * the status quo ante prior to the incomplete additions.  Call this method instead of finishDocuments() if the
-  * addition of documents was not completed.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param parentIdentifierHashes are the hashes of the document identifiers for whom child link extraction just took place.
-  */
-  @Override
-  public void revertDocuments(Long jobID, String[] legalLinkTypes,
-    String[] parentIdentifierHashes)
-    throws ManifoldCFException
-  {
-    if (parentIdentifierHashes.length == 0)
-      return;
-    
-    if (legalLinkTypes.length == 0)
-    {
-      while (true)
-      {
-        long sleepAmt = 0L;
-        database.beginTransaction(database.TRANSACTION_SERIALIZED);
-        try
-        {
-          // Revert carrydown records
-          carryDown.revertRecords(jobID,parentIdentifierHashes);
-          database.performCommit();
-          break;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        catch (RuntimeException e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-          sleepFor(sleepAmt);
-        }
-      }
-    }
-    else
-    {
-      // Revert both hopcount and carrydown
-      while (true)
-      {
-        long sleepAmt = 0L;
-        database.beginTransaction(database.TRANSACTION_SERIALIZED);
-        try
-        {
-          carryDown.revertRecords(jobID,parentIdentifierHashes);
-          hopCount.revertParents(jobID,parentIdentifierHashes);
-          database.performCommit();
-          break;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        catch (RuntimeException e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-          sleepFor(sleepAmt);
-        }
-      }
-    }
-  }
-
-  /** Complete adding child documents to the queue, for a set of documents.
-  * This method is called at the end of document processing, to help the hopcount tracking engine do its bookkeeping.
-  *@param jobID is the job identifier.
-  *@param legalLinkTypes is the set of legal link types that this connector generates.
-  *@param parentIdentifierHashes are the document identifier hashes for whom child link extraction just took place.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@return the set of documents for which carrydown data was changed by this operation.  These documents are likely
-  *  to be requeued as a result of the change.
-  */
-  @Override
-  public DocumentDescription[] finishDocuments(Long jobID, String[] legalLinkTypes, String[] parentIdentifierHashes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    if (parentIdentifierHashes.length == 0)
-      return new DocumentDescription[0];
-
-    DocumentDescription[] rval;
-
-    if (legalLinkTypes.length == 0)
-    {
-      // Must at least end the carrydown transaction.  By itself, this does not need a serialized transaction; however, occasional
-      // deadlock is possible when a document shares multiple parents, so do the whole retry drill
-      while (true)
-      {
-        long sleepAmt = 0L;
-        database.beginTransaction(database.TRANSACTION_SERIALIZED);
-        try
-        {
-          // A certain set of carrydown records are going to be deleted by the ensuing restoreRecords command.  Calculate that set of records!
-          rval = calculateAffectedRestoreCarrydownChildren(jobID,parentIdentifierHashes);
-          carryDown.restoreRecords(jobID,parentIdentifierHashes);
-          database.performCommit();
-          break;
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction finishing "+
-              Integer.toString(parentIdentifierHashes.length)+" doc carrydown records for job "+jobID.toString()+": "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        catch (RuntimeException e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-          sleepFor(sleepAmt);
-        }
-      }
-    }
-    else
-    {
-      long startTime = 0L;
-      if (Logging.perf.isDebugEnabled())
-      {
-        startTime = System.currentTimeMillis();
-        Logging.perf.debug("Waiting to finish "+Integer.toString(parentIdentifierHashes.length)+" doc hopcounts for job "+jobID.toString());
-      }
-
-      // Postgres gets all screwed up if we permit multiple threads into the hopcount code,
-      // and allows one transaction to see the effects of another transaction before it's been committed.
-      while (true)
-      {
-        long sleepAmt = 0L;
-        database.beginTransaction(database.TRANSACTION_SERIALIZED);
-        try
-        {
-          // A certain set of carrydown records are going to be deleted by the ensuing restoreRecords command.  Calculate that set of records!
-          rval = calculateAffectedRestoreCarrydownChildren(jobID,parentIdentifierHashes);
-
-          carryDown.restoreRecords(jobID,parentIdentifierHashes);
-
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Waited "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to start finishing "+
-            Integer.toString(parentIdentifierHashes.length)+" doc hopcounts for job "+jobID.toString());
-
-          hopCount.finishParents(jobID,legalLinkTypes,parentIdentifierHashes,hopcountMethod);
-          database.performCommit();
-          
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Took "+new Long(System.currentTimeMillis()-startTime).toString()+" ms to finish "+
-            Integer.toString(parentIdentifierHashes.length)+" doc hopcounts for job "+jobID.toString());
-          break;
-        }
-        catch (ManifoldCFException e)
-        {
-          database.signalRollback();
-          if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-          {
-            if (Logging.perf.isDebugEnabled())
-              Logging.perf.debug("Aborted transaction finishing "+
-              Integer.toString(parentIdentifierHashes.length)+" doc hopcounts for job "+jobID.toString()+": "+e.getMessage());
-            sleepAmt = getRandomAmount();
-            continue;
-          }
-          throw e;
-        }
-        catch (Error e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        catch (RuntimeException e)
-        {
-          database.signalRollback();
-          throw e;
-        }
-        finally
-        {
-          database.endTransaction();
-          sleepFor(sleepAmt);
-        }
-      }
-    }
-    return rval;
-  }
-
-  /** Helper method: Calculate the unique set of affected carrydown children resulting from a "restoreRecords" operation.
-  */
-  protected DocumentDescription[] calculateAffectedRestoreCarrydownChildren(Long jobID, String[] parentIDHashes)
-    throws ManifoldCFException
-  {
-    // We are going to need to break up this query into a number of subqueries, each covering a subset of parent id hashes.
-    // The goal is to throw all the children into a hash, to make them unique at the end.
-    HashMap resultHash = new HashMap();
-    ArrayList list = new ArrayList();
-    int maxCount = database.getMaxOrClause();
-    int i = 0;
-    int z = 0;
-    while (i < parentIDHashes.length)
-    {
-      if (z == maxCount)
-      {
-        processParentHashSet(jobID,resultHash,list);
-        list.clear();
-        z = 0;
-      }
-      list.add(parentIDHashes[i]);
-      i++;
-      z++;
-    }
-
-    if (z > 0)
-      processParentHashSet(jobID,resultHash,list);
-
-    // Now, put together the result document list from the hash.
-    DocumentDescription[] rval = new DocumentDescription[resultHash.size()];
-    i = 0;
-    Iterator iter = resultHash.keySet().iterator();
-    while (iter.hasNext())
-    {
-      Long id = (Long)iter.next();
-      DocumentDescription dd = (DocumentDescription)resultHash.get(id);
-      rval[i++] = dd;
-    }
-    return rval;
-  }
-
-  /** Helper method: look up rows affected by a restoreRecords operation.
-  */
-  protected void processParentHashSet(Long jobID, HashMap resultHash, ArrayList list)
-    throws ManifoldCFException
-  {
-    // The query here mirrors the carrydown.restoreRecords() delete query!  However, it also fetches enough information to build a DocumentDescription
-    // object for return, and so a join is necessary against the jobqueue table.
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList newlist = new ArrayList();
-    
-    sb.append("t0.").append(jobQueue.idField).append(",")
-      .append("t0.").append(jobQueue.docHashField).append(",")
-      .append("t0.").append(jobQueue.docIDField)
-      .append(" FROM ").append(carryDown.getTableName()).append(" t1, ")
-        .append(jobQueue.getTableName()).append(" t0 WHERE ");
-
-    sb.append(database.buildConjunctionClause(newlist,new ClauseDescription[]{
-      new UnitaryClause("t1."+carryDown.jobIDField,jobID),
-      new MultiClause("t1."+carryDown.parentIDHashField,list)})).append(" AND ");
-      
-    sb.append(database.buildConjunctionClause(newlist,new ClauseDescription[]{
-      new JoinClause("t0."+jobQueue.docHashField,"t1."+carryDown.childIDHashField),
-      new JoinClause("t0."+jobQueue.jobIDField,"t1."+carryDown.jobIDField)})).append(" AND ");
-      
-    sb.append("t1.").append(carryDown.newField).append("=?");
-    newlist.add(carryDown.statusToString(carryDown.ISNEW_BASE));
-
-    /*
-    sb.append("t0.").append(jobQueue.idField).append(",")
-      .append("t0.").append(jobQueue.docHashField).append(",")
-      .append("t0.").append(jobQueue.docIDField)
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE ")
-      .append(database.buildConjunctionClause(newlist,new ClauseDescription[]{
-        new UnitaryClause("t0."+jobQueue.jobIDField,jobID)})).append(" AND ");
-    
-    sb.append("EXISTS(SELECT 'x' FROM ").append(carryDown.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(newlist,new ClauseDescription[]{
-        new JoinClause("t1."+carryDown.jobIDField,"t0."+jobQueue.jobIDField),
-        new MultiClause("t1."+carryDown.parentIDHashField,list),
-        new JoinClause("t1."+carryDown.childIDHashField,"t0."+jobQueue.docHashField)})).append(" AND ")
-      .append("t1.").append(carryDown.newField).append("=?")
-      .append(")");
-        
-    newlist.add(carryDown.statusToString(carryDown.ISNEW_BASE));
-    */
-    
-    IResultSet set = database.performQuery(sb.toString(),newlist,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      Long id = (Long)row.getValue(jobQueue.idField);
-      String documentIdentifierHash = (String)row.getValue(jobQueue.docHashField);
-      String documentIdentifier = (String)row.getValue(jobQueue.docIDField);
-      resultHash.put(id,new DocumentDescription(id,jobID,documentIdentifierHash,documentIdentifier));
-    }
-  }
-
-  /** Begin an event sequence.
-  *@param processID is the current process ID.
-  *@param eventName is the name of the event.
-  *@return true if the event could be created, or false if it's already there.
-  */
-  @Override
-  public boolean beginEventSequence(String processID, String eventName)
-    throws ManifoldCFException
-  {
-    try
-    {
-      eventManager.createEvent(eventName,processID);
-      return true;
-    }
-    catch (ManifoldCFException e)
-    {
-      if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        return false;
-      throw e;
-    }
-  }
-
-  /** Complete an event sequence.
-  *@param eventName is the name of the event.
-  */
-  @Override
-  public void completeEventSequence(String eventName)
-    throws ManifoldCFException
-  {
-    eventManager.destroyEvent(eventName);
-  }
-
-
-  /** Requeue a document set because of carrydown changes.
-  * This method is called when carrydown data is modified for a set of documents.  The documents must be requeued for immediate reprocessing, even to the
-  * extent that if one is *already* being processed, it will need to be done over again.
-  *@param documentDescriptions is the set of description objects for the documents that have had their parent carrydown information changed.
-  *@param docPriorities are the document priorities to assign to the documents, if needed.
-  */
-  @Override
-  public void carrydownChangeDocumentMultiple(DocumentDescription[] documentDescriptions, IPriorityCalculator[] docPriorities)
-    throws ManifoldCFException
-  {
-    if (documentDescriptions.length == 0)
-      return;
-
-    // Order the updates by document hash, to prevent deadlock as much as possible.
-
-    // This map contains the original index of the document id hash.
-    HashMap docHashMap = new HashMap();
-
-    String[] docIDHashes = new String[documentDescriptions.length];
-    int i = 0;
-    while (i < documentDescriptions.length)
-    {
-      docIDHashes[i] = documentDescriptions[i].getDocumentIdentifier() + ":" + documentDescriptions[i].getJobID();
-      docHashMap.put(docIDHashes[i],new Integer(i));
-      i++;
-    }
-
-    // Sort the hashes
-    java.util.Arrays.sort(docIDHashes);
-
-    // Enter transaction and prepare to look up document states in dochash order
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        // This is the map that will contain the rows we found, keyed by docIDHash.
-        HashMap existingRows = new HashMap();
-
-        // Loop through hashes in order
-        int j = 0;
-        while (j < docIDHashes.length)
-        {
-          String docIDHash = docIDHashes[j];
-          // Get the index
-          int originalIndex = ((Integer)docHashMap.get(docIDHash)).intValue();
-          // Lookup document description
-          DocumentDescription dd = documentDescriptions[originalIndex];
-          // Do the query.  We can base this on the id column since we have that.
-          StringBuilder sb = new StringBuilder("SELECT ");
-          ArrayList list = new ArrayList();
-
-          sb.append(jobQueue.idField).append(",")
-            .append(jobQueue.statusField).append(",")
-            .append(jobQueue.checkTimeField)
-            .append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobQueue.idField,dd.getID())})).append(" FOR UPDATE");
-              
-          IResultSet set = database.performQuery(sb.toString(),list,null,null);
-          // If the row is there, we use its current info to requeue it properly.
-          if (set.getRowCount() > 0)
-          {
-            // Found a row, and it is now locked.
-            IResultRow row = set.getRow(0);
-
-            // Decode the row
-            Long rowID = (Long)row.getValue(jobQueue.idField);
-            int status = jobQueue.stringToStatus((String)row.getValue(jobQueue.statusField));
-            Long checkTimeValue = (Long)row.getValue(jobQueue.checkTimeField);
-
-            existingRows.put(docIDHash,new JobqueueRecord(rowID,status,checkTimeValue));
-          }
-          j++;
-        }
-
-        // Ok, existingRows contains all the rows we want to try to update.  Go through these and update.
-        while (j < docIDHashes.length)
-        {
-          String docIDHash = docIDHashes[j];
-          int originalIndex = ((Integer)docHashMap.get(docIDHash)).intValue();
-
-          JobqueueRecord jr = (JobqueueRecord)existingRows.get(docIDHash);
-          if (jr != null)
-            // It was an existing row; do the update logic; use the 'carrydown changes' flag = true all the time.
-            jobQueue.updateExistingRecord(jr.getRecordID(),jr.getStatus(),jr.getCheckTimeValue(),
-              0L,true,docPriorities[originalIndex],null);
-          j++;
-        }
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction handling "+Integer.toString(docIDHashes.length)+" carrydown changes: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Requeue a document because of carrydown changes.
-  * This method is called when carrydown data is modified for a document.  The document must be requeued for immediate reprocessing, even to the
-  * extent that if it is *already* being processed, it will need to be done over again.
-  *@param documentDescription is the description object for the document that has had its parent carrydown information changed.
-  *@param docPriority is the document priority to assign to the document, if needed.
-  */
-  @Override
-  public void carrydownChangeDocument(DocumentDescription documentDescription, IPriorityCalculator docPriority)
-    throws ManifoldCFException
-  {
-    carrydownChangeDocumentMultiple(new DocumentDescription[]{documentDescription},new IPriorityCalculator[]{docPriority});
-  }
-
-  /** Sleep a random amount of time after a transaction abort.
-  */
-  protected long getRandomAmount()
-  {
-    return database.getSleepAmt();
-  }
-
-  protected void sleepFor(long amt)
-    throws ManifoldCFException
-  {
-    database.sleepFor(amt);
-  }
-
-  /** Retrieve specific parent data for a given document.
-  *@param jobID is the job identifier.
-  *@param docIDHash is the document identifier hash value.
-  *@param dataName is the kind of data to retrieve.
-  *@return the unique data values.
-  */
-  @Override
-  public String[] retrieveParentData(Long jobID, String docIDHash, String dataName)
-    throws ManifoldCFException
-  {
-    return carryDown.getDataValues(jobID,docIDHash,dataName);
-  }
-
-  /** Retrieve specific parent data for a given document.
-  *@param jobID is the job identifier.
-  *@param docIDHash is the document identifier hash value.
-  *@param dataName is the kind of data to retrieve.
-  *@return the unique data values.
-  */
-  @Override
-  public CharacterInput[] retrieveParentDataAsFiles(Long jobID, String docIDHash, String dataName)
-    throws ManifoldCFException
-  {
-    return carryDown.getDataValuesAsFiles(jobID,docIDHash,dataName);
-  }
-
-  // These methods support the job threads (which start jobs and end jobs)
-  // There is one thread that starts jobs.  It simply looks for jobs which are ready to
-  // start, and changes their state accordingly.
-  // There is also a pool of threads that end jobs.  These threads wait for a job that
-  // looks like it is done, and do completion processing if it is.
-
-  /** Start all jobs in need of starting.
-  * This method marks all the appropriate jobs as "in progress", which is all that should be
-  * needed to start them.
-  * It's also the case that the start event should be logged in the event log.  In order to make it possible for
-  * the caller to do this logging, a set of job ID's will be returned containing the jobs that
-  * were started.
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@param unwaitList is filled in with the set of job ID objects that were resumed.
-  */
-  @Override
-  public void startJobs(long currentTime, List<Long> unwaitList)
-    throws ManifoldCFException
-  {
-    // This method should compare the lasttime field against the current time, for all
-    // "not active" jobs, and see if a job should be started.
-    //
-    // If a job is to be started, then the following occurs:
-    // (1) If the job is "full scan", then all COMPLETED jobqueue entries are converted to
-    //     PURGATORY.
-    // (2) The job is labeled as "ACTIVE".
-    // (3) The starttime field is set.
-    // (4) The endtime field is nulled out.
-    //
-    // This method also assesses jobs that are ACTIVE or PAUSED to see if they should be
-    // converted to ACTIVEWAIT or PAUSEDWAIT.  This would happen if the current time exceeded
-    // the value in the "windowend" field for the job.
-    //
-    // Finally, jobs in ACTIVEWAIT or PAUSEDWAIT are assessed to see if they should become
-    // ACTIVE or PAUSED.  This will occur if we have entered a new window for the job.
-
-    // Note well: We can't combine locks across both our lock manager and the database unless we do it consistently.  The
-    // consistent practice throughout CF is to do the external locks first, then the database locks.  This particular method
-    // thus cannot use cached job description information, because it must throw database locks first against the jobs table.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // First, query the appropriate fields of all jobs.
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(",")
-          .append(jobs.lastTimeField).append(",")
-          .append(jobs.statusField).append(",")
-          .append(jobs.startMethodField).append(",")
-          .append(jobs.connectionNameField)
-          .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new MultiClause(jobs.statusField,new Object[]{
-              jobs.statusToString(jobs.STATUS_INACTIVE),
-              jobs.statusToString(jobs.STATUS_ACTIVEWAIT),
-              jobs.statusToString(jobs.STATUS_ACTIVEWAITSEEDING),
-              jobs.statusToString(jobs.STATUS_PAUSEDWAIT),
-              jobs.statusToString(jobs.STATUS_PAUSEDWAITSEEDING)})})).append(" AND ")
-          .append(jobs.startMethodField).append("!=? FOR UPDATE");
-        
-        list.add(jobs.startMethodToString(IJobDescription.START_DISABLE));
-        
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-        // Next, we query for the schedule information.  In order to do that, we amass a list of job identifiers that we want schedule info
-        // for.
-        Long[] jobIDSet = new Long[set.getRowCount()];
-        int i = 0;
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i);
-          jobIDSet[i++] = (Long)row.getValue(jobs.idField);
-        }
-
-        ScheduleRecord[][] srSet = jobs.readScheduleRecords(jobIDSet);
-
-        i = 0;
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i);
-
-          Long jobID = (Long)row.getValue(jobs.idField);
-          int startMethod = jobs.stringToStartMethod((String)row.getValue(jobs.startMethodField));
-          String connectionName = (String)row.getValue(jobs.connectionNameField);
-          ScheduleRecord[] thisSchedule = srSet[i++];
-
-          // Run at specific times
-
-          // We need to start with the start time as given, plus one
-          long startInterval = ((Long)row.getValue(jobs.lastTimeField)).longValue() + 1;
-          if (Logging.jobs.isDebugEnabled())
-            Logging.jobs.debug("Checking if job "+jobID.toString()+" needs to be started; it was last checked at "+
-            new Long(startInterval).toString()+", and now it is "+new Long(currentTime).toString());
-
-          // Proceed to the current time, and find a match if there is one to be found.
-          // If not -> continue
-
-          // We go through *all* the schedule records.  The one that matches that has the latest
-          // end time is the one we take.
-          Long matchTime = null;
-          Long duration = null;
-          boolean requestMinimum = false;
-          
-          for (int l = 0; l < thisSchedule.length; l++)
-          {
-            long trialStartInterval = startInterval;
-            ScheduleRecord sr = thisSchedule[l];
-            Long thisDuration = sr.getDuration();
-            if (startMethod == IJobDescription.START_WINDOWINSIDE &&
-              thisDuration != null)
-            {
-              // Bump the start interval back before the beginning of the current interval.
-              // This will guarantee a start as long as there is time in the window.
-              long trialStart = currentTime - thisDuration.longValue();
-              if (trialStart < trialStartInterval)
-                trialStartInterval = trialStart;
-            }
-
-            Long thisMatchTime = checkTimeMatch(trialStartInterval,currentTime,
-              sr.getDayOfWeek(),
-              sr.getDayOfMonth(),
-              sr.getMonthOfYear(),
-              sr.getYear(),
-              sr.getHourOfDay(),
-              sr.getMinutesOfHour(),
-              sr.getTimezone(),
-              thisDuration);
-
-            if (thisMatchTime == null)
-            {
-              if (Logging.jobs.isDebugEnabled())
-                Logging.jobs.debug(" No time match found within interval "+new Long(trialStartInterval).toString()+
-                " to "+new Long(currentTime).toString());
-              continue;
-            }
-
-            if (Logging.jobs.isDebugEnabled())
-              Logging.jobs.debug(" Time match FOUND within interval "+new Long(trialStartInterval).toString()+
-              " to "+new Long(currentTime).toString());
-
-            if (matchTime == null || thisDuration == null ||
-              (duration != null && thisMatchTime.longValue() + thisDuration.longValue() >
-                matchTime.longValue() + duration.longValue()))
-            {
-              matchTime = thisMatchTime;
-              duration = thisDuration;
-              requestMinimum = sr.getRequestMinimum();
-              //System.out.println("Scheduled job start; requestMinimum = "+requestMinimum);
-            }
-          }
-
-          if (matchTime == null)
-          {
-            jobs.updateLastTime(jobID,currentTime);
-            continue;
-          }
-
-          int status = jobs.stringToStatus(row.getValue(jobs.statusField).toString());
-
-
-          // Calculate the end of the window
-          Long windowEnd = null;
-          if (duration != null)
-          {
-            windowEnd = new Long(matchTime.longValue()+duration.longValue());
-          }
-
-          Logging.jobs.info("Job '"+jobID+"' is within run window at "+new Long(currentTime).toString()+" ms. (which starts at "+
-              matchTime.toString()+" ms."+((duration==null)?"":(" and goes for "+duration.toString()+" ms."))+")");
-
-          int newJobState;
-          switch (status)
-          {
-          case Jobs.STATUS_INACTIVE:
-            // If job was formerly "inactive", do the full startup.
-            // Start this job!  but with no end time.
-            // This does not get logged because the startup thread does the logging.
-            //System.out.println("Starting job with requestMinimum = "+requestMinimum);
-            jobs.startJob(jobID,windowEnd,requestMinimum);
-            jobQueue.clearFailTimes(jobID);
-            Logging.jobs.info("Signalled for job start for job "+jobID);
-            break;
-          case Jobs.STATUS_ACTIVEWAIT:
-            unwaitList.add(jobID);
-            jobs.unwaitJob(jobID,Jobs.STATUS_RESUMING,windowEnd);
-            jobQueue.clearFailTimes(jobID);
-            Logging.jobs.info("Un-waited job "+jobID);
-            break;
-          case Jobs.STATUS_ACTIVEWAITSEEDING:
-            unwaitList.add(jobID);
-            jobs.unwaitJob(jobID,Jobs.STATUS_RESUMINGSEEDING,windowEnd);
-            jobQueue.clearFailTimes(jobID);
-            Logging.jobs.info("Un-waited job "+jobID);
-            break;
-          case Jobs.STATUS_PAUSEDWAIT:
-            unwaitList.add(jobID);
-            jobs.unwaitJob(jobID,jobs.STATUS_PAUSED,windowEnd);
-            Logging.jobs.info("Un-waited (but still paused) job "+jobID);
-            break;
-          case Jobs.STATUS_PAUSEDWAITSEEDING:
-            unwaitList.add(jobID);
-            jobs.unwaitJob(jobID,jobs.STATUS_PAUSEDSEEDING,windowEnd);
-            Logging.jobs.info("Un-waited (but still paused) job "+jobID);
-            break;
-          case Jobs.STATUS_PAUSINGWAITING:
-            unwaitList.add(jobID);
-            jobs.unwaitJob(jobID,jobs.STATUS_PAUSING,windowEnd);
-            Logging.jobs.info("Un-waited (but still paused) job "+jobID);
-            break;
-          case Jobs.STATUS_PAUSINGWAITINGSEEDING:
-            unwaitList.add(jobID);
-            jobs.unwaitJob(jobID,jobs.STATUS_PAUSINGSEEDING,windowEnd);
-            Logging.jobs.info("Un-waited (but still paused) job "+jobID);
-            break;
-          default:
-            break;
-          }
-
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction resetting for restart: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-  
-  /** Put active or paused jobs in wait state, if they've exceeded their window.
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@param waitList is filled in with the set of job ID's that were put into a wait state.
-  */
-  @Override
-  public void waitJobs(long currentTime, List<Long> waitList)
-    throws ManifoldCFException
-  {
-    // This method assesses jobs that are ACTIVE or PAUSED to see if they should be
-    // converted to ACTIVEWAIT or PAUSEDWAIT.  This would happen if the current time exceeded
-    // the value in the "windowend" field for the job.
-    //
-    database.beginTransaction();
-    try
-    {
-      // First, query the appropriate fields of all jobs.
-      StringBuilder sb = new StringBuilder("SELECT ");
-      ArrayList list = new ArrayList();
-      
-      sb.append(jobs.idField).append(",")
-        .append(jobs.statusField)
-        .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-        .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(jobs.statusField,new Object[]{
-            jobs.statusToString(jobs.STATUS_ACTIVE),
-            jobs.statusToString(jobs.STATUS_ACTIVESEEDING),
-            jobs.statusToString(jobs.STATUS_ACTIVE_UNINSTALLED),
-            jobs.statusToString(jobs.STATUS_ACTIVESEEDING_UNINSTALLED),
-            jobs.statusToString(jobs.STATUS_PAUSED),
-            jobs.statusToString(jobs.STATUS_PAUSEDSEEDING)})})).append(" AND ")
-        .append(jobs.windowEndField).append("<? FOR UPDATE");
-        
-      list.add(new Long(currentTime));
-      
-      IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-
-        Long jobID = (Long)row.getValue(jobs.idField);
-        waitList.add(jobID);
-
-        int status = jobs.stringToStatus(row.getValue(jobs.statusField).toString());
-
-        // Make the job wait.
-        switch (status)
-        {
-        case Jobs.STATUS_ACTIVE:
-        case Jobs.STATUS_ACTIVE_UNINSTALLED:
-          jobs.waitJob(jobID,Jobs.STATUS_ACTIVEWAITING);
-          Logging.jobs.info("Job "+jobID+" now in 'wait' state due to window end");
-          break;
-        case Jobs.STATUS_ACTIVESEEDING:
-        case Jobs.STATUS_ACTIVESEEDING_UNINSTALLED:
-          jobs.waitJob(jobID,Jobs.STATUS_ACTIVEWAITINGSEEDING);
-          Logging.jobs.info("Job "+jobID+" now in 'wait' state due to window end");
-          break;
-        case Jobs.STATUS_PAUSED:
-          jobs.waitJob(jobID,Jobs.STATUS_PAUSEDWAIT);
-          Logging.jobs.info("Job "+jobID+" now in 'wait paused' state due to window end");
-          break;
-        case Jobs.STATUS_PAUSEDSEEDING:
-          jobs.waitJob(jobID,Jobs.STATUS_PAUSEDWAITSEEDING);
-          Logging.jobs.info("Job "+jobID+" now in 'wait paused' state due to window end");
-          break;
-        case Jobs.STATUS_PAUSING:
-          jobs.waitJob(jobID,Jobs.STATUS_PAUSINGWAITING);
-          Logging.jobs.info("Job "+jobID+" now in 'wait paused' state due to window end");
-          break;
-        case Jobs.STATUS_PAUSINGSEEDING:
-          jobs.waitJob(jobID,Jobs.STATUS_PAUSINGWAITINGSEEDING);
-          Logging.jobs.info("Job "+jobID+" now in 'wait paused' state due to window end");
-          break;
-        default:
-          break;
-        }
-
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-  }
-
-  /** Reset job schedule.  This re-evaluates whether the job should be started now.  This method would typically
-  * be called after a job's scheduling window has been changed.
-  *@param jobID is the job identifier.
-  */
-  @Override
-  public void resetJobSchedule(Long jobID)
-    throws ManifoldCFException
-  {
-    // Note:  This is problematic; the expected behavior is for the job to start if "we are within the window",
-    // but not to start if the transition to active status was long enough ago.
-    // Since there's no "right" way to do this, do nothing for now.
-
-    // This explicitly did NOT work - it caused the job to refire every time it was saved.
-    // jobs.updateLastTime(jobID,0L);
-  }
-
-  /** Check if the specified job parameters have a 'hit' within the specified interval.
-  *@param startTime is the start time.
-  *@param currentTimestamp is the end time.
-  *@param daysOfWeek is the enumerated days of the week, or null.
-  *@param daysOfMonth is the enumerated days of the month, or null.
-  *@param months is the enumerated months, or null.
-  *@param years is the enumerated years, or null.
-  *@param hours is the enumerated hours, or null.
-  *@param minutes is the enumerated minutes, or null.
-  *@return null if there is NO hit within the interval; otherwise the actual time of the hit in milliseconds
-  * from epoch is returned.
-  */
-  protected static Long checkTimeMatch(long startTime, long currentTimestamp,
-    EnumeratedValues daysOfWeek,
-    EnumeratedValues daysOfMonth,
-    EnumeratedValues months,
-    EnumeratedValues years,
-    EnumeratedValues hours,
-    EnumeratedValues minutes,
-    String timezone,
-    Long duration)
-  {
-    // What we do here is start with the previous timestamp, and advance until we
-    // either encounter a match, or we exceed the current timestamp.
-
-    Calendar c;
-    if (timezone == null)
-    {
-      c = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT);
-    }
-    else
-    {
-      c = Calendar.getInstance(TimeZone.getTimeZone(timezone), Locale.ROOT);
-    }
-
-    // Get the current starting time
-    c.setTimeInMillis(startTime);
-
-    // If there's a duration value, we can't match unless we're within the window.
-    // That means we find a match, and then we verify that the end time is greater than the currenttimestamp.
-    // If not, we move on (by incrementing)
-
-    // The main loop works off of the calendar and these values.
-    while (c.getTimeInMillis() < currentTimestamp)
-    {
-      // Round up to the nearest minute, unless at 0 already
-      int x = c.get(Calendar.MILLISECOND);
-      if (x != c.getMinimum(Calendar.MILLISECOND))
-      {
-        int amtToAdd = c.getLeastMaximum(Calendar.MILLISECOND)+1-x;
-        if (amtToAdd < 1)
-          amtToAdd = 1;
-        c.add(Calendar.MILLISECOND,amtToAdd);
-        continue;
-      }
-      x = c.get(Calendar.SECOND);
-      if (x != c.getMinimum(Calendar.SECOND))
-      {
-        int amtToAdd = c.getLeastMaximum(Calendar.SECOND)+1-x;
-        if (amtToAdd < 1)
-          amtToAdd = 1;
-        c.add(Calendar.SECOND,amtToAdd);
-        continue;
-      }
-      boolean startedToCareYet = false;
-      x = c.get(Calendar.MINUTE);
-      // If we care about minutes, round up, otherwise go to the 0 value
-      if (minutes == null)
-      {
-        if (x != c.getMinimum(Calendar.MINUTE))
-        {
-          int amtToAdd = c.getLeastMaximum(Calendar.MINUTE)+1-x;
-          if (amtToAdd < 1)
-            amtToAdd = 1;
-          c.add(Calendar.MINUTE,amtToAdd);
-          continue;
-        }
-      }
-      else
-      {
-        // See if it is a legit value.
-        if (!minutes.checkValue(x-c.getMinimum(Calendar.MINUTE)))
-        {
-          // Advance to next legit value
-          // We could be clever, but we just advance one
-          c.add(Calendar.MINUTE,1);
-          continue;
-        }
-        startedToCareYet = true;
-      }
-      // Hours
-      x = c.get(Calendar.HOUR_OF_DAY);
-      if (hours == null)
-      {
-        if (!startedToCareYet && x != c.getMinimum(Calendar.HOUR_OF_DAY))
-        {
-          int amtToAdd = c.getLeastMaximum(Calendar.HOUR_OF_DAY)+1-x;
-          if (amtToAdd < 1)
-            amtToAdd = 1;
-          c.add(Calendar.HOUR_OF_DAY,amtToAdd);
-          continue;
-        }
-      }
-      else
-      {
-        if (!hours.checkValue(x-c.getMinimum(Calendar.HOUR_OF_DAY)))
-        {
-          // next hour
-          c.add(Calendar.HOUR_OF_DAY,1);
-          continue;
-        }
-        startedToCareYet = true;
-      }
-      // Days of month and days of week are at the same level;
-      // these advance concurrently.  However, if NEITHER is specified, and nothing
-      // earlier was, then we do the 1st of the month.
-      x = c.get(Calendar.DAY_OF_WEEK);
-      if (daysOfWeek != null)
-      {
-        if (!daysOfWeek.checkValue(x-c.getMinimum(Calendar.DAY_OF_WEEK)))
-        {
-          // next day
-          c.add(Calendar.DAY_OF_WEEK,1);
-          continue;
-        }
-        startedToCareYet = true;
-      }
-      x = c.get(Calendar.DAY_OF_MONTH);
-      if (daysOfMonth == null)
-      {
-        // If nothing is specified but the month or the year, do it on the 1st.
-        if (!startedToCareYet && x != c.getMinimum(Calendar.DAY_OF_MONTH))
-        {
-          // Move as rapidly as possible towards the first of the month.  But in no case, increment
-          // less than one day.
-          int amtToAdd = c.getLeastMaximum(Calendar.DAY_OF_MONTH)+1-x;
-          if (amtToAdd < 1)
-            amtToAdd = 1;
-          c.add(Calendar.DAY_OF_MONTH,amtToAdd);
-          continue;
-        }
-      }
-      else
-      {
-        if (!daysOfMonth.checkValue(x-c.getMinimum(Calendar.DAY_OF_MONTH)))
-        {
-          // next day
-          c.add(Calendar.DAY_OF_MONTH,1);
-          continue;
-        }
-        startedToCareYet = true;
-      }
-      x = c.get(Calendar.MONTH);
-      if (months == null)
-      {
-        if (!startedToCareYet && x != c.getMinimum(Calendar.MONTH))
-        {
-          int amtToAdd = c.getLeastMaximum(Calendar.MONTH)+1-x;
-          if (amtToAdd < 1)
-            amtToAdd = 1;
-          c.add(Calendar.MONTH,amtToAdd);
-          continue;
-        }
-      }
-      else
-      {
-        if (!months.checkValue(x-c.getMinimum(Calendar.MONTH)))
-        {
-          c.add(Calendar.MONTH,1);
-          continue;
-        }
-        startedToCareYet = true;
-      }
-      x = c.get(Calendar.YEAR);
-      if (years != null)
-      {
-        if (!years.checkValue(x))
-        {
-          c.add(Calendar.YEAR,1);
-          continue;
-        }
-        startedToCareYet = true;
-      }
-
-      // Looks like a match.
-      // Last check is to be sure we are in the window, if any.  If we are outside the window,
-      // must skip forward.
-      if (duration != null && c.getTimeInMillis() + duration.longValue() <= currentTimestamp)
-      {
-        c.add(Calendar.MILLISECOND,c.getLeastMaximum(Calendar.MILLISECOND));
-        continue;
-      }
-
-      return new Long(c.getTimeInMillis());
-    }
-    return null;
-  }
-
-  /** Manually start a job.  The specified job will be run REGARDLESS of the timed windows, and
-  * will not cease until complete.  If the job is already running, this operation will assure that
-  * the job does not pause when its window ends.  The job can be manually paused, or manually aborted.
-  *@param jobID is the ID of the job to start.
-  */
-  @Override
-  public void manualStart(Long jobID)
-    throws ManifoldCFException
-  {
-    manualStart(jobID,false);
-  }
-  
-  /** Manually start a job.  The specified job will be run REGARDLESS of the timed windows, and
-  * will not cease until complete.  If the job is already running, this operation will assure that
-  * the job does not pause when its window ends.  The job can be manually paused, or manually aborted.
-  *@param jobID is the ID of the job to start.
-  *@param requestMinimum is true if a minimal job run is requested.
-  */
-  @Override
-  public void manualStart(Long jobID, boolean requestMinimum)
-    throws ManifoldCFException
-  {
-    database.beginTransaction();
-    try
-    {
-      // First, query the appropriate fields of all jobs.
-      StringBuilder sb = new StringBuilder("SELECT ");
-      ArrayList list = new ArrayList();
-      
-      sb.append(jobs.statusField)
-        .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-        .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new UnitaryClause(jobs.idField,jobID)}))
-        .append(" FOR UPDATE");
-          
-      IResultSet set = database.performQuery(sb.toString(),list,null,null);
-      if (set.getRowCount() < 1)
-        throw new ManifoldCFException("No such job: "+jobID);
-
-      IResultRow row = set.getRow(0);
-      int status = jobs.stringToStatus(row.getValue(jobs.statusField).toString());
-      if (status != Jobs.STATUS_INACTIVE)
-        throw new ManifoldCFException("Job "+jobID+" is already running");
-
-      IJobDescription jobDescription = jobs.load(jobID,true);
-      
-      Logging.jobs.info("Manually starting job "+jobID);
-      // Start this job!  but with no end time.
-      jobs.startJob(jobID,null,requestMinimum);
-      jobQueue.clearFailTimes(jobID);
-      
-      Logging.jobs.info("Manual job start signal for job "+jobID+" successfully sent");
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-  }
-
-  /** Note job delete started.
-  *@param jobID is the job id.
-  *@param startTime is the job delete start time.
-  */
-  @Override
-  public void noteJobDeleteStarted(Long jobID, long startTime)
-    throws ManifoldCFException
-  {
-    jobs.noteJobDeleteStarted(jobID,startTime);
-    Logging.jobs.info("Job "+jobID+" delete is now started");
-  }
-
-  /** Note job started.
-  *@param jobID is the job id.
-  *@param startTime is the job start time.
-  */
-  @Override
-  public void noteJobStarted(Long jobID, long startTime, String seedingVersion)
-    throws ManifoldCFException
-  {
-    jobs.noteJobStarted(jobID,startTime,seedingVersion);
-    Logging.jobs.info("Job "+jobID+" is now started");
-  }
-
-  /** Note job seeded.
-  *@param jobID is the job id.
-  *@param seedingVersion is the job seeding version string to record.
-  */
-  @Override
-  public void noteJobSeeded(Long jobID, String seedingVersion)
-    throws ManifoldCFException
-  {
-    jobs.noteJobSeeded(jobID,seedingVersion);
-    Logging.jobs.info("Job "+jobID+" has been successfully reseeded");
-  }
-
-  /** Prepare for a delete scan.
-  *@param jobID is the job id.
-  */
-  @Override
-  public void prepareDeleteScan(Long jobID)
-    throws ManifoldCFException
-  {
-    // No special treatment needed for hopcount or carrydown, since these all get deleted at once
-    // at the end of the job delete process.
-    TrackerClass.notePrecommit();
-    jobQueue.prepareDeleteScan(jobID);
-    TrackerClass.noteCommit();
-  }
-  
-  /** Prepare a job to be run.
-  * This method is called regardless of the details of the job; what differs is only the flags that are passed in.
-  * The code inside will determine the appropriate procedures.
-  * (This method replaces prepareFullScan() and prepareIncrementalScan(). )
-  *@param jobID is the job id.
-  *@param legalLinkTypes are the link types allowed for the job.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  *@param connectorModel is the model used by the connector for the job.
-  *@param continuousJob is true if the job is a continuous one.
-  *@param fromBeginningOfTime is true if the job is running starting from time 0.
-  *@param requestMinimum is true if the minimal amount of work is requested for the job run.
-  */
-  @Override
-  public void prepareJobScan(Long jobID, String[] legalLinkTypes, int hopcountMethod,
-    int connectorModel, boolean continuousJob, boolean fromBeginningOfTime,
-    boolean requestMinimum)
-    throws ManifoldCFException
-  {
-    // (1) If the connector has MODEL_ADD_CHANGE_DELETE, then
-    // we let the connector run the show; there's no purge phase, and therefore the
-    // documents are left in a COMPLETED state if they don't show up in the list
-    // of seeds that require the attention of the connector.  However, we do need to
-    // preload the queue with all the existing documents, if there was any change to the
-    // specification information (which will mean that fromBeginningOfTime is set).
-    //
-    // (2) If the connector has MODEL_ALL, then it's a full crawl no matter what, so
-    // we do a full scan initialization.
-    //
-    // (3) If the connector has some other model, we look at the start time.  A start
-    // time of 0 implies a full scan, while any other start time implies an incremental
-    // scan.
-    
-    // Always reset document schedules for those documents already pending!
-    jobQueue.resetPendingDocumentSchedules(jobID);
-    jobQueue.prioritizeQueuedDocuments(jobID);
-    
-    // Complete connector model is told everything, so no delete phase.
-    if (connectorModel == IRepositoryConnector.MODEL_ADD_CHANGE_DELETE)
-    {
-      if (fromBeginningOfTime)
-        queueAllExisting(jobID,legalLinkTypes);
-      return;
-    }
-    
-    // If the connector model is complete via chaining, then we just need to make
-    // sure discovery works to queue the changes.
-    if (connectorModel == IRepositoryConnector.MODEL_CHAINED_ADD_CHANGE_DELETE)
-    {
-      if (fromBeginningOfTime)
-        queueAllExisting(jobID,legalLinkTypes);
-      else
-        jobQueue.preparePartialScan(jobID);
-      return;
-    }
-
-    // Look for a minimum crawl.
-    // Minimum crawls do only what is seeded, in general.  These are partial scans, always.  MODEL_ALL disables this
-    // functionality, as does a scan from the beginning of time (after the job spec has been changed).
-    if (requestMinimum && connectorModel != IRepositoryConnector.MODEL_ALL && !fromBeginningOfTime)
-    {
-      // Minimum crawl requested.
-      // If it is a chained model, do the partial prep.  If it's a non-chained model, do nothing for prep; the seeding
-      // will flag the documents we want to look at.
-      if (connectorModel == IRepositoryConnector.MODEL_CHAINED_ADD ||
-        connectorModel == IRepositoryConnector.MODEL_CHAINED_ADD_CHANGE)
-        jobQueue.preparePartialScan(jobID);
-      return;
-    }
-    
-    if (!continuousJob && connectorModel != IRepositoryConnector.MODEL_PARTIAL &&
-      (connectorModel == IRepositoryConnector.MODEL_ALL || fromBeginningOfTime))
-    {
-      // Prepare for a full scan if:
-      // (a) not a continuous job, and
-      // (b) not a partial model (which always disables full scans), and
-      // (c) either MODEL_ALL or from the beginning of time (which are essentially equivalent)
-      prepareFullScan(jobID,legalLinkTypes,hopcountMethod);
-    }
-    else
-    {
-      // Map COMPLETE and UNCHANGED to PENDINGPURGATORY, if:
-      // (a) job is continuous, OR
-      // (b) MODEL_PARTIAL, OR
-      // (c) not MODEL_ALL AND not from beginning of time
-      // This causes all existing documents to be rechecked!  This is needed because the model is not
-      // complete at this point; we have ADD but we don't have either CHANGE or DELETE.
-      jobQueue.prepareIncrementalScan(jobID);
-    }
-  }
-
-  /** Queue all existing.
-  *@param jobID is the job id.
-  *@param legalLinkTypes are the link types allowed for the job.
-  */
-  protected void queueAllExisting(Long jobID, String[] legalLinkTypes)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        if (legalLinkTypes.length > 0)
-        {
-          jobQueue.reactivateHopcountRemovedRecords(jobID);
-        }
-
-        jobQueue.queueAllExisting(jobID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction during queueAllExisting: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-  }
-  
-  /** Prepare for a full scan.
-  *@param jobID is the job id.
-  *@param legalLinkTypes are the link types allowed for the job.
-  *@param hopcountMethod describes how to handle deletions for hopcount purposes.
-  */
-  protected void prepareFullScan(Long jobID, String[] legalLinkTypes, int hopcountMethod)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      // Since we delete documents here, we need to manage the hopcount part of the world too.
-      database.beginTransaction(database.TRANSACTION_SERIALIZED);
-      try
-      {
-        // Delete the documents we have never fetched, including any hopcount records we've calculated.
-        if (legalLinkTypes.length > 0)
-        {
-          ArrayList list = new ArrayList();
-          String query = database.buildConjunctionClause(list,new ClauseDescription[]{
-            new MultiClause("t99."+jobQueue.statusField,new Object[]{
-              jobQueue.statusToString(jobQueue.STATUS_PENDING),
-              jobQueue.statusToString(jobQueue.STATUS_HOPCOUNTREMOVED)})});
-          hopCount.deleteMatchingDocuments(jobID,legalLinkTypes,jobQueue.getTableName()+" t99",
-            "t99."+jobQueue.docHashField,"t99."+jobQueue.jobIDField,
-            query,list,
-            hopcountMethod);
-        }
-
-        jobQueue.prepareFullScan(jobID);
-        TrackerClass.notePrecommit();
-        database.performCommit();
-        TrackerClass.noteCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction preparing full scan: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Manually abort a running job.  The job will be permanently stopped, and will not run again until
-  * automatically started based on schedule, or manually started.
-  *@param jobID is the job to abort.
-  */
-  @Override
-  public void manualAbort(Long jobID)
-    throws ManifoldCFException
-  {
-    // Just whack status back to "INACTIVE".  The active documents will continue to be processed until done,
-    // but that's fine.  There will be no finishing stage, obviously.
-    Logging.jobs.info("Manually aborting job "+jobID);
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.abortJob(jobID,null);
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction aborting job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-    
-    Logging.jobs.info("Job "+jobID+" abort signal successfully sent");
-  }
-
-  /** Manually restart a running job.  The job will be stopped and restarted.  Any schedule affinity will be lost,
-  * until the job finishes on its own.
-  *@param jobID is the job to abort.
-  *@param requestMinimum is true if a minimal job run is requested.
-  */
-  @Override
-  public void manualAbortRestart(Long jobID, boolean requestMinimum)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Manually restarting job "+jobID);
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.abortRestartJob(jobID,requestMinimum);
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction restarting job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Job "+jobID+" restart signal successfully sent");
-  }
-
-  /** Manually restart a running job.  The job will be stopped and restarted.  Any schedule affinity will be lost,
-  * until the job finishes on its own.
-  *@param jobID is the job to abort.
-  */
-  @Override
-  public void manualAbortRestart(Long jobID)
-    throws ManifoldCFException
-  {
-    manualAbortRestart(jobID,false);
-  }
-
-  /** Abort a running job due to a fatal error condition.
-  *@param jobID is the job to abort.
-  *@param errorText is the error text.
-  *@return true if this is the first logged abort request for this job.
-  */
-  @Override
-  public boolean errorAbort(Long jobID, String errorText)
-    throws ManifoldCFException
-  {
-    // Just whack status back to "INACTIVE".  The active documents will continue to be processed until done,
-    // but that's fine.  There will be no finishing stage, obviously.
-    Logging.jobs.info("Aborting job "+jobID+" due to error '"+errorText+"'");
-    
-    boolean rval;
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        rval = jobs.abortJob(jobID,errorText);
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction aborting job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-    
-    Logging.jobs.info("Job "+jobID+" abort signal successfully sent");
-      
-    return rval;
-  }
-
-  /** Pause a job.
-  *@param jobID is the job identifier to pause.
-  */
-  @Override
-  public void pauseJob(Long jobID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Manually pausing job "+jobID);
-      
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.pauseJob(jobID);
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction pausing job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Job "+jobID+" successfully paused");
-
-  }
-
-  /** Restart a paused job.
-  *@param jobID is the job identifier to restart.
-  */
-  @Override
-  public void restartJob(Long jobID)
-    throws ManifoldCFException
-  {
-    Logging.jobs.info("Manually restarting paused job "+jobID);
-      
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobs.restartJob(jobID);
-        jobQueue.clearFailTimes(jobID);
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction restarting pausing job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-
-    Logging.jobs.info("Job "+jobID+" successfully restarted");
-  }
-
-  /** Get the list of jobs that are ready for seeding.
-  *@param processID is the current process ID.
-  *@return jobs that are active and are running in adaptive mode.  These will be seeded
-  * based on what the connector says should be added to the queue.
-  */
-  @Override
-  public JobSeedingRecord[] getJobsReadyForSeeding(String processID, long currentTime)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Do the query
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(",")
-          .append(jobs.seedingVersionField).append(",")
-          .append(jobs.failTimeField).append(",")
-          .append(jobs.failCountField).append(",")
-          .append(jobs.reseedIntervalField)
-          .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.statusField,jobs.statusToString(jobs.STATUS_ACTIVE))})).append(" AND ")
-          .append(jobs.typeField).append("=? AND ")
-          .append("(").append(jobs.reseedTimeField).append(" IS NULL OR ").append(jobs.reseedTimeField).append("<=?)")
-          .append(" FOR UPDATE");
-            
-        list.add(jobs.typeToString(jobs.TYPE_CONTINUOUS));
-        list.add(new Long(currentTime));
-        
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        // Update them all
-        JobSeedingRecord[] rval = new JobSeedingRecord[set.getRowCount()];
-        int i = 0;
-        while (i < rval.length)
-        {
-          IResultRow row = set.getRow(i);
-          Long jobID = (Long)row.getValue(jobs.idField);
-          String seedingVersionString = (String)row.getValue(jobs.seedingVersionField);
-
-          Long r = (Long)row.getValue(jobs.reseedIntervalField);
-          Long reseedTime;
-          if (r != null)
-            reseedTime = new Long(currentTime + r.longValue());
-          else
-            reseedTime = null;
-
-          Long failTimeLong = (Long)row.getValue(jobs.failTimeField);
-          Long failRetryCountLong = (Long)row.getValue(jobs.failCountField);
-          long failTime;
-          if (failTimeLong == null)
-            failTime = -1L;
-          else
-            failTime = failTimeLong.longValue();
-          int failRetryCount;
-          if (failRetryCountLong == null)
-            failRetryCount = -1;
-          else
-            failRetryCount = (int)failRetryCountLong.longValue();
-
-          // Mark status of job as "active/seeding".  Special status is needed so that abort
-          // will not complete until seeding is completed.
-          jobs.writeTransientStatus(jobID,jobs.STATUS_ACTIVESEEDING,reseedTime,processID);
-          Logging.jobs.info("Marked job "+jobID+" for seeding");
-            
-          rval[i] = new JobSeedingRecord(jobID,seedingVersionString,failTime,failRetryCount);
-          i++;
-        }
-        database.performCommit();
-        return rval;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted getting jobs ready for seeding: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Get the list of jobs that are ready for delete cleanup.
-  *@param processID is the current process ID.
-  *@return jobs that were in the "readyfordelete" state.
-  */
-  @Override
-  public JobDeleteRecord[] getJobsReadyForDeleteCleanup(String processID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Do the query
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.statusField,jobs.statusToString(jobs.STATUS_READYFORDELETE))}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        // Update them all
-        JobDeleteRecord[] rval = new JobDeleteRecord[set.getRowCount()];
-        int i = 0;
-        while (i < rval.length)
-        {
-          IResultRow row = set.getRow(i);
-          Long jobID = (Long)row.getValue(jobs.idField);
-
-          // Mark status of job as "starting delete"
-          jobs.writeTransientStatus(jobID,jobs.STATUS_DELETESTARTINGUP,processID);
-          Logging.jobs.info("Marked job "+jobID+" for delete startup");
-
-          rval[i] = new JobDeleteRecord(jobID);
-          i++;
-        }
-        database.performCommit();
-        return rval;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted getting jobs ready for startup: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Get the list of jobs that are ready for startup.
-  *@param processID is the current process ID.
-  *@return jobs that were in the "readyforstartup" state.  These will be marked as being in the "starting up" state.
-  */
-  @Override
-  public JobStartRecord[] getJobsReadyForStartup(String processID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Do the query
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(",")
-          .append(jobs.failTimeField).append(",")
-          .append(jobs.failCountField).append(",")
-          .append(jobs.seedingVersionField).append(",")
-          .append(jobs.statusField)
-          .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new MultiClause(jobs.statusField,new Object[]{
-              jobs.statusToString(jobs.STATUS_READYFORSTARTUP),
-              jobs.statusToString(jobs.STATUS_READYFORSTARTUPMINIMAL)})}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        // Update them all
-        JobStartRecord[] rval = new JobStartRecord[set.getRowCount()];
-        int i = 0;
-        while (i < rval.length)
-        {
-          IResultRow row = set.getRow(i);
-          Long jobID = (Long)row.getValue(jobs.idField);
-          String seedingVersionString = (String)row.getValue(jobs.seedingVersionField);
-          int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-          Long failTimeLong = (Long)row.getValue(jobs.failTimeField);
-          Long failRetryCountLong = (Long)row.getValue(jobs.failCountField);
-          long failTime;
-          if (failTimeLong == null)
-            failTime = -1L;
-          else
-            failTime = failTimeLong.longValue();
-          int failRetryCount;
-          if (failRetryCountLong == null)
-            failRetryCount = -1;
-          else
-            failRetryCount = (int)failRetryCountLong.longValue();
-
-          boolean requestMinimum = (status == jobs.STATUS_READYFORSTARTUPMINIMAL);
-          //System.out.println("When starting the job, requestMinimum = "+requestMinimum);
-          
-          // Mark status of job as "starting"
-          jobs.writeTransientStatus(jobID,requestMinimum?jobs.STATUS_STARTINGUPMINIMAL:jobs.STATUS_STARTINGUP,processID);
-          Logging.jobs.info("Marked job "+jobID+" for startup");
-
-          rval[i] = new JobStartRecord(jobID,seedingVersionString,requestMinimum,failTime,failRetryCount);
-          i++;
-        }
-        database.performCommit();
-        return rval;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted getting jobs ready for startup: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Inactivate a job, from the notification state.
-  *@param jobID is the ID of the job to inactivate.
-  */
-  @Override
-  public void inactivateJob(Long jobID)
-    throws ManifoldCFException
-  {
-    // While there is no flow that can cause a job to be in the wrong state when this gets called, as a precaution
-    // it might be a good idea to put this in a transaction and have the state get checked first.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          throw new ManifoldCFException("No such job: "+jobID);
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-
-        switch (status)
-        {
-        case Jobs.STATUS_NOTIFYINGOFCOMPLETION:
-          jobs.notificationComplete(jobID);
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted clearing notification state for job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Remove a job, from the notification state.
-  *@param jobID is the ID of the job to remove.
-  */
-  @Override
-  public void removeJob(Long jobID)
-    throws ManifoldCFException
-  {
-    // While there is no flow that can cause a job to be in the wrong state when this gets called, as a precaution
-    // it might be a good idea to put this in a transaction and have the state get checked first.
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          // Presume already removed!
-          return;
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-
-        switch (status)
-        {
-        case Jobs.STATUS_NOTIFYINGOFDELETION:
-          ManifoldCF.noteConfigurationChange();
-          // Remove documents from job queue
-          jobQueue.deleteAllJobRecords(jobID);
-          // Remove carrydowns for the job
-          carryDown.deleteOwner(jobID);
-          // Nothing is in a critical section - so this should be OK.
-          hopCount.deleteOwner(jobID);
-          jobs.delete(jobID);
-          
-          Logging.jobs.info("Removed job "+jobID);          
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted clearing delete notification state for job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a job starting for delete back to "ready for delete"
-  * state.
-  *@param jobID is the job id.
-  */
-  @Override
-  public void resetStartDeleteJob(Long jobID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          throw new ManifoldCFException("No such job: "+jobID);
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-
-        switch (status)
-        {
-        case Jobs.STATUS_DELETESTARTINGUP:
-          Logging.jobs.info("Setting job "+jobID+" back to 'ReadyForDelete' state");
-
-          // Set the state of the job back to "ReadyForStartup"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_READYFORDELETE,true);
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted resetting start delete job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a job that is notifying back to "ready for notify"
-  * state.
-  *@param jobID is the job id.
-  */
-  @Override
-  public void resetNotifyJob(Long jobID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          throw new ManifoldCFException("No such job: "+jobID);
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-
-        switch (status)
-        {
-        case Jobs.STATUS_NOTIFYINGOFCOMPLETION:
-          Logging.jobs.info("Setting job "+jobID+" back to 'ReadyForNotify' state");
-
-          // Set the state of the job back to "ReadyForNotify"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_READYFORNOTIFY,true);
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted resetting notify job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a job that is delete notifying back to "ready for delete notify"
-  * state.
-  *@param jobID is the job id.
-  */
-  @Override
-  public void resetDeleteNotifyJob(Long jobID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          throw new ManifoldCFException("No such job: "+jobID);
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-
-        switch (status)
-        {
-        case Jobs.STATUS_NOTIFYINGOFDELETION:
-          Logging.jobs.info("Setting job "+jobID+" back to 'ReadyForDeleteNotify' state");
-
-          // Set the state of the job back to "ReadyForNotify"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_READYFORDELETENOTIFY,true);
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted resetting delete notify job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a starting job back to "ready for startup" state.
-  *@param jobID is the job id.
-  */
-  @Override
-  public void resetStartupJob(Long jobID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          throw new ManifoldCFException("No such job: "+jobID);
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-
-        switch (status)
-        {
-        case Jobs.STATUS_STARTINGUP:
-          Logging.jobs.info("Setting job "+jobID+" back to 'ReadyForStartup' state");
-
-          // Set the state of the job back to "ReadyForStartup"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_READYFORSTARTUP,true);
-          break;
-        case Jobs.STATUS_STARTINGUPMINIMAL:
-          Logging.jobs.info("Setting job "+jobID+" back to 'ReadyForStartupMinimal' state");
-
-          // Set the state of the job back to "ReadyForStartupMinimal"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_READYFORSTARTUPMINIMAL,true);
-          break;
-        case Jobs.STATUS_ABORTINGSTARTINGUPFORRESTART:
-          Logging.jobs.info("Setting job "+jobID+" to 'AbortingForRestart' state");
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ABORTINGFORRESTART,true);
-          break;
-        case Jobs.STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL:
-          Logging.jobs.info("Setting job "+jobID+" to 'AbortingForRestartMinimal' state");
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ABORTINGFORRESTARTMINIMAL,true);
-          break;
-
-        case Jobs.STATUS_READYFORSTARTUP:
-        case Jobs.STATUS_READYFORSTARTUPMINIMAL:
-        case Jobs.STATUS_ABORTING:
-        case Jobs.STATUS_ABORTINGFORRESTART:
-        case Jobs.STATUS_ABORTINGFORRESTARTMINIMAL:
-          // ok
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted resetting startup job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Reset a seeding job back to "active" state.
-  *@param jobID is the job id.
-  */
-  @Override
-  public void resetSeedJob(Long jobID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Check job status
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.statusField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.idField,jobID)}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        if (set.getRowCount() == 0)
-          throw new ManifoldCFException("No such job: "+jobID);
-        IResultRow row = set.getRow(0);
-        int status = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-        switch (status)
-        {
-        case Jobs.STATUS_ACTIVESEEDING_UNINSTALLED:
-          Logging.jobs.info("Setting job "+jobID+" back to 'Active_Uninstalled' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ACTIVE_UNINSTALLED);
-          break;
-        case Jobs.STATUS_ACTIVESEEDING:
-          Logging.jobs.info("Setting job "+jobID+" back to 'Active' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ACTIVE);
-          break;
-        case Jobs.STATUS_ACTIVEWAITSEEDING:
-          Logging.jobs.info("Setting job "+jobID+" back to 'ActiveWait' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ACTIVEWAIT);
-          break;
-        case Jobs.STATUS_PAUSEDSEEDING:
-          Logging.jobs.info("Setting job "+jobID+" back to 'Paused' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_PAUSED);
-          break;
-        case Jobs.STATUS_PAUSEDWAITSEEDING:
-          Logging.jobs.info("Setting job "+jobID+" back to 'PausedWait' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_PAUSEDWAIT);
-          break;
-
-        case Jobs.STATUS_ABORTINGFORRESTARTSEEDING:
-          Logging.jobs.info("Setting job "+jobID+" back to 'AbortingForRestart' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ABORTINGFORRESTART);
-          break;
-
-        case Jobs.STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:
-          Logging.jobs.info("Setting job "+jobID+" back to 'AbortingForRestartMinimal' state");
-
-          // Set the state of the job back to "Active"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_ABORTINGFORRESTARTMINIMAL);
-          break;
-
-        case Jobs.STATUS_ABORTING:
-        case Jobs.STATUS_ABORTINGFORRESTART:
-        case Jobs.STATUS_ABORTINGFORRESTARTMINIMAL:
-        case Jobs.STATUS_ACTIVE:
-        case Jobs.STATUS_ACTIVE_UNINSTALLED:
-        case Jobs.STATUS_PAUSED:
-        case Jobs.STATUS_ACTIVEWAIT:
-        case Jobs.STATUS_PAUSEDWAIT:
-          // ok
-          break;
-        default:
-          throw new ManifoldCFException("Unexpected job status: "+Integer.toString(status));
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted resetting seeding job: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-
-  /** Delete jobs in need of being deleted (which are marked "ready for delete").
-  * This method is meant to be called periodically to perform delete processing on jobs.
-  */
-  @Override
-  public void deleteJobsReadyForDelete()
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      // This method must find only jobs that have nothing hanging around in their jobqueue that represents an ingested
-      // document.  Any jobqueue entries which are in a state to interfere with the delete will be cleaned up by other
-      // threads, so eventually a job will become eligible.  This happens when there are no records that have an ingested
-      // status: complete, purgatory, being-cleaned, being-deleted, or pending purgatory.
-      database.beginTransaction();
-      try
-      {
-        // The original query was:
-        //
-        // SELECT id FROM jobs t0 WHERE status='D' AND NOT EXISTS(SELECT 'x' FROM jobqueue t1 WHERE t0.id=t1.jobid AND
-        //      t1.status IN ('C', 'F', 'G'))
-        //
-        // However, this did not work well with Postgres when the tables got big.  So I revised things to do the following multi-stage process:
-        // (1) The query should be broken up, such that n queries are done:
-        //     (a) the first one should get all candidate jobs (those that have the right state)
-        //     (b) there should be a query for each job of roughly this form: SELECT id FROM jobqueue WHERE jobid=xxx AND status IN (...) LIMIT 1
-        // This will work way better than postgresql currently works, because neither the cost-based analysis nor the actual NOT clause seem to allow
-        // early exit!!
-
-        // Do the first query, getting the candidate jobs to be considered
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.statusField,jobs.statusToString(jobs.STATUS_DELETING))}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-        // Now, loop through this list.  For each one, verify that it's okay to delete it
-        int i = 0;
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          Long jobID = (Long)row.getValue(jobs.idField);
-
-          list.clear();
-          sb = new StringBuilder("SELECT ");
-          
-          sb.append(jobQueue.idField).append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobQueue.jobIDField,jobID),
-              new MultiClause(jobQueue.statusField,new Object[]{
-                jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE),
-                jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)})}))
-            .append(" ").append(database.constructOffsetLimitClause(0,1));
-
-          IResultSet confirmSet = database.performQuery(sb.toString(),list,null,null,1,null);
-
-          if (confirmSet.getRowCount() > 0)
-            continue;
-
-          jobs.finishJobCleanup(jobID);
-          Logging.jobs.info("Job "+jobID+" cleanup is now completed");
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted deleting jobs ready for delete: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Put all eligible jobs in the "shutting down" state.
-  */
-  @Override
-  public void finishJobs()
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      // The jobs we should transition:
-      // - are active
-      // - have no ACTIVE, PENDING, ACTIVEPURGATORY, or PENDINGPURGATORY records
-      database.beginTransaction();
-      try
-      {
-        // The query I used to emit was:
-        // SELECT jobid FROM jobs t0 WHERE t0.status='A' AND NOT EXISTS(SELECT 'x' FROM jobqueue t1 WHERE
-        //              t0.id=t1.jobid AND t1.status IN ('A','P','F','G'))
-
-        // This did not get along well with Postgresql, so instead this is what is now done:
-        // (1) The query should be broken up, such that n queries are done:
-        //     (a) the first one should get all candidate jobs (those that have the right state)
-        //     (b) there should be a query for each job of roughly this form: SELECT id FROM jobqueue WHERE jobid=xxx AND status IN (...) LIMIT 1
-        // This will work way better than postgresql currently works, because neither the cost-based analysis nor the actual NOT clause seem to allow
-        // early exit!!
-
-        // Do the first query, getting the candidate jobs to be considered
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new MultiClause(jobs.statusField,new Object[]{
-              jobs.statusToString(jobs.STATUS_ACTIVE),
-              jobs.statusToString(jobs.STATUS_ACTIVEWAIT),
-              jobs.statusToString(jobs.STATUS_ACTIVE_UNINSTALLED)})}))
-          .append(" FOR UPDATE");
-        
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-        int i = 0;
-        while (i < set.getRowCount())
-        {
-          IResultRow row = set.getRow(i++);
-          Long jobID = (Long)row.getValue(jobs.idField);
-
-          // Check to be sure the job is a candidate for shutdown
-          sb = new StringBuilder("SELECT ");
-          list.clear();
-          
-          sb.append(jobQueue.idField).append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-            .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-              new UnitaryClause(jobQueue.jobIDField,jobID),
-              new MultiClause(jobQueue.statusField,new Object[]{
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-                jobQueue.statusToString(jobQueue.STATUS_PENDING),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-                jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-                jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)})}))
-            .append(" ").append(database.constructOffsetLimitClause(0,1));
-
-          IResultSet confirmSet = database.performQuery(sb.toString(),list,null,null,1,null);
-
-          if (confirmSet.getRowCount() > 0)
-            continue;
-
-          // Mark status of job as "finishing"
-          jobs.writePermanentStatus(jobID,jobs.STATUS_SHUTTINGDOWN,true);
-          Logging.jobs.info("Marked job "+jobID+" for shutdown");
-
-        }
-        database.performCommit();
-        return;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted finishing jobs: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Find the list of jobs that need to have their connectors notified of job completion.
-  *@param processID is the process ID.
-  *@return the ID's of jobs that need their output connectors notified in order to become inactive.
-  */
-  @Override
-  public JobNotifyRecord[] getJobsReadyForInactivity(String processID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Do the query
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(",").append(jobs.failTimeField).append(",").append(jobs.failCountField)
-          .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.statusField,jobs.statusToString(jobs.STATUS_READYFORNOTIFY))}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        // Return them all
-        JobNotifyRecord[] rval = new JobNotifyRecord[set.getRowCount()];
-        int i = 0;
-        while (i < rval.length)
-        {
-          IResultRow row = set.getRow(i);
-          Long jobID = (Long)row.getValue(jobs.idField);
-          Long failTimeLong = (Long)row.getValue(jobs.failTimeField);
-          Long failRetryCountLong = (Long)row.getValue(jobs.failCountField);
-          long failTime;
-          if (failTimeLong == null)
-            failTime = -1L;
-          else
-            failTime = failTimeLong.longValue();
-          int failRetryCount;
-          if (failRetryCountLong == null)
-            failRetryCount = -1;
-          else
-            failRetryCount = (int)failRetryCountLong.longValue();
-      
-          // Mark status of job as "starting delete"
-          jobs.writeTransientStatus(jobID,jobs.STATUS_NOTIFYINGOFCOMPLETION,processID);
-          Logging.jobs.info("Found job "+jobID+" in need of notification");
-            
-          rval[i++] = new JobNotifyRecord(jobID,failTime,failRetryCount);
-        }
-        database.performCommit();
-        return rval;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted getting jobs ready for notify: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Find the list of jobs that need to have their connectors notified of job deletion.
-  *@param processID is the process ID.
-  *@return the ID's of jobs that need their output connectors notified in order to be removed.
-  */
-  @Override
-  public JobNotifyRecord[] getJobsReadyForDelete(String processID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        // Do the query
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-        
-        sb.append(jobs.idField).append(",").append(jobs.failTimeField).append(",").append(jobs.failCountField)
-          .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobs.statusField,jobs.statusToString(jobs.STATUS_READYFORDELETENOTIFY))}))
-          .append(" FOR UPDATE");
-            
-        IResultSet set = database.performQuery(sb.toString(),list,null,null);
-        // Return them all
-        JobNotifyRecord[] rval = new JobNotifyRecord[set.getRowCount()];
-        int i = 0;
-        while (i < rval.length)
-        {
-          IResultRow row = set.getRow(i);
-          Long jobID = (Long)row.getValue(jobs.idField);
-          Long failTimeLong = (Long)row.getValue(jobs.failTimeField);
-          Long failRetryCountLong = (Long)row.getValue(jobs.failCountField);
-          long failTime;
-          if (failTimeLong == null)
-            failTime = -1L;
-          else
-            failTime = failTimeLong.longValue();
-          int failRetryCount;
-          if (failRetryCountLong == null)
-            failRetryCount = -1;
-          else
-            failRetryCount = (int)failRetryCountLong.longValue();
-      
-          // Mark status of job as "starting delete"
-          jobs.writeTransientStatus(jobID,jobs.STATUS_NOTIFYINGOFDELETION,processID);
-          Logging.jobs.info("Found job "+jobID+" in need of delete notification");
-
-          rval[i++] = new JobNotifyRecord(jobID,failTime,failRetryCount);
-        }
-        database.performCommit();
-        return rval;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted getting jobs ready for notify: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Complete the sequence that resumes jobs, either from a pause or from a scheduling window
-  * wait.  The logic will restore the job to an active state (many possibilities depending on
-  * connector status), and will record the jobs that have been so modified.
-  *@param timestamp is the current time in milliseconds since epoch.
-  *@param modifiedJobs is filled in with the set of IJobDescription objects that were resumed.
-  */
-  @Override
-  public void finishJobResumes(long timestamp, List<IJobDescription> modifiedJobs)
-    throws ManifoldCFException
-  {
-    // Alternative to using a write lock here: Put this in a transaction, with a "FOR UPDATE" on the first query.
-    // I think that still causes way too much locking, though, on some databases.
-    lockManager.enterWriteLock(jobResumeLock);
-    try
-    {
-    // Do the first query, getting the candidate jobs to be considered
-      StringBuilder sb = new StringBuilder("SELECT ");
-      ArrayList list = new ArrayList();
-          
-      sb.append(jobs.idField)
-        .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-        .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(jobs.statusField,new Object[]{
-            jobs.statusToString(jobs.STATUS_RESUMING),
-            jobs.statusToString(jobs.STATUS_RESUMINGSEEDING)
-            })}));
-          
-      IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        Long jobID = (Long)row.getValue(jobs.idField);
-
-        // There are no secondary checks that need to be made; just resume
-        IJobDescription jobDesc = jobs.load(jobID,true);
-        modifiedJobs.add(jobDesc);
-
-        // Note that all the documents that are alive need priorities
-        jobQueue.prioritizeQueuedDocuments(jobID);
-        // Now, resume the job
-        jobs.finishResumeJob(jobID,timestamp);
-            
-        Logging.jobs.info("Resumed job "+jobID);
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(jobResumeLock);
-    }
-  }
-
-  /** Complete the sequence that stops jobs, either for abort, pause, or because of a scheduling
-  * window.  The logic will move the job to its next state (INACTIVE, PAUSED, ACTIVEWAIT),
-  * and will record the jobs that have been so modified.
-  *@param timestamp is the current time in milliseconds since epoch.
-  *@param modifiedJobs is filled in with the set of IJobDescription objects that were stopped.
-  *@param stopNotificationTypes is filled in with the type of stop notification.
-  */
-  @Override
-  public void finishJobStops(long timestamp, List<IJobDescription> modifiedJobs, List<Integer> stopNotificationTypes)
-    throws ManifoldCFException
-  {
-    // Alternative to using a write lock here: Put this in a transaction, with a "FOR UPDATE" on the first query.
-    // I think that still causes way too much locking, though, on some databases.
-    lockManager.enterWriteLock(jobStopLock);
-    try
-    {
-      // The query I used to emit was:
-      // SELECT jobid FROM jobs t0 WHERE t0.status='X' AND NOT EXISTS(SELECT 'x' FROM jobqueue t1 WHERE
-      //              t0.id=t1.jobid AND t1.status IN ('A','F'))
-      // Now the query is broken up so that Postgresql behaves more efficiently.
-
-      // Do the first query, getting the candidate jobs to be considered
-      StringBuilder sb = new StringBuilder("SELECT ");
-      ArrayList list = new ArrayList();
-          
-      sb.append(jobs.idField).append(",").append(jobs.statusField).append(",").append(jobs.errorField)
-        .append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-        .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(jobs.statusField,new Object[]{
-            jobs.statusToString(jobs.STATUS_ABORTING),
-            jobs.statusToString(jobs.STATUS_ABORTINGFORRESTART),
-            jobs.statusToString(jobs.STATUS_ABORTINGFORRESTARTMINIMAL),
-            jobs.statusToString(jobs.STATUS_ABORTINGSHUTTINGDOWN),
-            jobs.statusToString(jobs.STATUS_PAUSING),
-            jobs.statusToString(jobs.STATUS_PAUSINGSEEDING),
-            jobs.statusToString(jobs.STATUS_ACTIVEWAITING),
-            jobs.statusToString(jobs.STATUS_ACTIVEWAITINGSEEDING),
-            jobs.statusToString(jobs.STATUS_PAUSINGWAITING),
-            jobs.statusToString(jobs.STATUS_PAUSINGWAITINGSEEDING)
-            })}));
-          
-      IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        Long jobID = (Long)row.getValue(jobs.idField);
-        int jobStatus = jobs.stringToStatus((String)row.getValue(jobs.statusField));
-        String errorText = (String)row.getValue(jobs.errorField);
-        
-        sb = new StringBuilder("SELECT ");
-        list.clear();
-
-        sb.append(jobQueue.idField).append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobQueue.jobIDField,jobID),
-            new MultiClause(jobQueue.statusField,new Object[]{
-              jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-              jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-              jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-              jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-              jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED)})}))
-          .append(" ").append(database.constructOffsetLimitClause(0,1));
-
-        IResultSet confirmSet = database.performQuery(sb.toString(),list,null,null,1,null);
-
-        if (confirmSet.getRowCount() > 0)
-          continue;
-
-        // All the job's documents need to have their docpriority set to null, to clear dead wood out of the docpriority index.
-        // See CONNECTORS-290.
-        // We do this BEFORE updating the job state.
-        
-        noDocPriorities(jobID);
-            
-        IJobDescription jobDesc = jobs.load(jobID,true);
-        modifiedJobs.add(jobDesc);
-        stopNotificationTypes.add(mapToNotificationType(jobStatus,(errorText==null || errorText.length() == 0)));
-        
-        jobs.finishStopJob(jobID,timestamp);
-            
-        Logging.jobs.info("Stopped job "+jobID);
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(jobStopLock);
-    }
-  }
-
-  protected static Integer mapToNotificationType(int jobStatus, boolean noErrorText)
-  {
-    switch (jobStatus)
-    {
-    case Jobs.STATUS_ABORTING:
-    case Jobs.STATUS_ABORTINGSHUTTINGDOWN:
-      return noErrorText?STOP_MANUALABORT:STOP_ERRORABORT;
-    case Jobs.STATUS_ABORTINGFORRESTART:
-    case Jobs.STATUS_ABORTINGFORRESTARTMINIMAL:
-      return STOP_RESTART;
-    case Jobs.STATUS_PAUSING:
-    case Jobs.STATUS_PAUSINGSEEDING:
-    case Jobs.STATUS_PAUSINGWAITING:
-    case Jobs.STATUS_PAUSINGWAITINGSEEDING:
-      return STOP_MANUALPAUSE;
-    case Jobs.STATUS_ACTIVEWAITING:
-    case Jobs.STATUS_ACTIVEWAITINGSEEDING:
-      return STOP_SCHEDULEPAUSE;
-    default:
-      throw new RuntimeException("Unexpected job status: "+jobStatus);
-    }
-  }
-
-  protected void noDocPriorities(Long jobID)
-    throws ManifoldCFException
-  {
-    while (true)
-    {
-      long sleepAmt = 0L;
-      database.beginTransaction();
-      try
-      {
-        jobQueue.noDocPriorities(jobID);
-        database.performCommit();
-        break;
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug("Aborted transaction clearing document priorities: "+e.getMessage());
-          sleepAmt = getRandomAmount();
-          continue;
-        }
-        throw e;
-      }
-      catch (RuntimeException e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        TrackerClass.noteRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-  
-  /** Reset eligible jobs either back to the "inactive" state, or make them active again.  The
-  * latter will occur if the cleanup phase of the job generated more pending documents.
-  *
-  *  This method is used to pick up all jobs in the shutting down state
-  * whose purgatory or being-cleaned records have been all processed.
-  *
-  *@param currentTime is the current time in milliseconds since epoch.
-  *@param resetJobs is filled in with the set of IJobDescription objects that were reset.
-  */
-  @Override
-  public void resetJobs(long currentTime, List<IJobDescription> resetJobs)
-    throws ManifoldCFException
-  {
-    // Alternative to using a write lock here: Put this in a transaction, with a "FOR UPDATE" on the first query.
-    // I think that still causes way too much locking, though, on some databases.
-    // Note well: This MUST be the same lock as for finishStopJobs, since ABORTINGSHUTTINGDOWN is handled
-    // by one and SHUTTINGDOWN is handled by the other.  CONNECTORS-1191.
-    lockManager.enterWriteLock(jobStopLock);
-    try
-    {
-      // Query for all jobs that fulfill the criteria
-      // The query used to look like:
-      //
-      // SELECT id FROM jobs t0 WHERE status='D' AND NOT EXISTS(SELECT 'x' FROM jobqueue t1 WHERE
-      //      t0.id=t1.jobid AND t1.status='P')
-      //
-      // Now, the query is broken up, for performance
-
-      // Do the first query, getting the candidate jobs to be considered
-      StringBuilder sb = new StringBuilder("SELECT ");
-      ArrayList list = new ArrayList();
-          
-      sb.append(jobs.idField).append(" FROM ").append(jobs.getTableName()).append(" WHERE ")
-        .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new UnitaryClause(jobs.statusField,jobs.statusToString(jobs.STATUS_SHUTTINGDOWN))}));
-              
-      IResultSet set = database.performQuery(sb.toString(),list,null,null);
-
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        Long jobID = (Long)row.getValue(jobs.idField);
-
-        // Check to be sure the job is a candidate for shutdown
-        sb = new StringBuilder("SELECT ");
-        list.clear();
-            
-        sb.append(jobQueue.idField).append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobQueue.jobIDField,jobID),
-            new MultiClause(jobQueue.statusField,new Object[]{
-              jobQueue.statusToString(jobQueue.STATUS_PURGATORY),
-              jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED)})}))
-          .append(" ").append(database.constructOffsetLimitClause(0,1));
-
-        IResultSet confirmSet = database.performQuery(sb.toString(),list,null,null,1,null);
-
-        if (confirmSet.getRowCount() > 0)
-          continue;
-
-        // The shutting-down phase is complete.  However, we need to check if there are any outstanding
-        // PENDING or PENDINGPURGATORY records before we can decide what to do.
-        sb = new StringBuilder("SELECT ");
-        list.clear();
-            
-        sb.append(jobQueue.idField).append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-          .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-            new UnitaryClause(jobQueue.jobIDField,jobID),
-            new MultiClause(jobQueue.statusField,new Object[]{
-              jobQueue.statusToString(jobQueue.STATUS_PENDING),
-              jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)})}))
-          .append(" ").append(database.constructOffsetLimitClause(0,1));
-
-        confirmSet = database.performQuery(sb.toString(),list,null,null,1,null);
-
-        if (confirmSet.getRowCount() > 0)
-        {
-          // This job needs to re-enter the active state.  Make that happen.
-          jobs.returnJobToActive(jobID);
-          Logging.jobs.info("Job "+jobID+" is re-entering active state");
-        }
-        else
-        {
-          // This job should be marked as finished.
-          IJobDescription jobDesc = jobs.load(jobID,true);
-          resetJobs.add(jobDesc);
-              
-          jobs.finishJob(jobID,currentTime);
-          Logging.jobs.info("Job "+jobID+" now completed");
-        }
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(jobStopLock);
-    }
-  }
-
-  
-  // Status reports
-
-  /** Get the status of a job.
-  *@return the status object for the specified job.
-  */
-  @Override
-  public JobStatus getStatus(Long jobID)
-    throws ManifoldCFException
-  {
-    return getStatus(jobID,true);
-  }
-
-  /** Get a list of all jobs, and their status information.
-  *@return an ordered array of job status objects.
-  */
-  @Override
-  public JobStatus[] getAllStatus()
-    throws ManifoldCFException
-  {
-    return getAllStatus(true);
-  }
-
-  /** Get a list of running jobs.  This is for status reporting.
-  *@return an array of the job status objects.
-  */
-  @Override
-  public JobStatus[] getRunningJobs()
-    throws ManifoldCFException
-  {
-    return getRunningJobs(true);
-  }
-
-  /** Get a list of completed jobs, and their statistics.
-  *@return an array of the job status objects.
-  */
-  @Override
-  public JobStatus[] getFinishedJobs()
-    throws ManifoldCFException
-  {
-    return getFinishedJobs(true);
-  }
-
-  /** Get the status of a job.
-  *@param jobID is the job ID.
-  *@param includeCounts is true if document counts should be included.
-  *@return the status object for the specified job.
-  */
-  @Override
-  public JobStatus getStatus(Long jobID, boolean includeCounts)
-    throws ManifoldCFException
-  {
-    return getStatus(jobID, includeCounts, Integer.MAX_VALUE);
-  }
-
-  /** Get a list of all jobs, and their status information.
-  *@param includeCounts is true if document counts should be included.
-  *@return an ordered array of job status objects.
-  */
-  @Override
-  public JobStatus[] getAllStatus(boolean includeCounts)
-    throws ManifoldCFException
-  {
-    return getAllStatus(includeCounts, Integer.MAX_VALUE);
-  }
-
-  /** Get a list of running jobs.  This is for status reporting.
-  *@param includeCounts is true if document counts should be included.
-  *@return an array of the job status objects.
-  */
-  @Override
-  public JobStatus[] getRunningJobs(boolean includeCounts)
-    throws ManifoldCFException
-  {
-    return getRunningJobs(includeCounts, Integer.MAX_VALUE);
-  }
-
-  /** Get a list of completed jobs, and their statistics.
-  *@param includeCounts is true if document counts should be included.
-  *@return an array of the job status objects.
-  */
-  @Override
-  public JobStatus[] getFinishedJobs(boolean includeCounts)
-    throws ManifoldCFException
-  {
-    return getFinishedJobs(includeCounts, Integer.MAX_VALUE);
-  }
-
-  /** Get the status of a job.
-  *@param includeCounts is true if document counts should be included.
-  *@return the status object for the specified job.
-  */
-  @Override
-  public JobStatus getStatus(Long jobID, boolean includeCounts, int maxCount)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String whereClause = Jobs.idField+"=?";
-    list.add(jobID);
-    JobStatus[] records = makeJobStatus(whereClause,list,includeCounts,maxCount);
-    if (records.length == 0)
-      return null;
-    return records[0];
-  }
-
-
-  /** Get a list of all jobs, and their status information.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return an ordered array of job status objects.
-  */
-  @Override
-  public JobStatus[] getAllStatus(boolean includeCounts, int maxCount)
-    throws ManifoldCFException
-  {
-    return makeJobStatus(null,null,includeCounts,maxCount);
-  }
-
-  /** Get a list of running jobs.  This is for status reporting.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return an array of the job status objects.
-  */
-  @Override
-  public JobStatus[] getRunningJobs(boolean includeCounts, int maxCount)
-    throws ManifoldCFException
-  {
-    ArrayList whereParams = new ArrayList();
-    
-    String whereClause = database.buildConjunctionClause(whereParams,new ClauseDescription[]{
-      new MultiClause(Jobs.statusField,new Object[]{
-        Jobs.statusToString(Jobs.STATUS_ACTIVE),
-        Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING),
-        Jobs.statusToString(Jobs.STATUS_ACTIVE_UNINSTALLED),
-        Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_UNINSTALLED),
-        Jobs.statusToString(Jobs.STATUS_PAUSED),
-        Jobs.statusToString(Jobs.STATUS_PAUSEDSEEDING),
-        Jobs.statusToString(Jobs.STATUS_ACTIVEWAIT),
-        Jobs.statusToString(Jobs.STATUS_ACTIVEWAITSEEDING),
-        Jobs.statusToString(Jobs.STATUS_PAUSEDWAIT),
-        Jobs.statusToString(Jobs.STATUS_PAUSEDWAITSEEDING),
-        Jobs.statusToString(Jobs.STATUS_PAUSING),
-        Jobs.statusToString(Jobs.STATUS_PAUSINGSEEDING),
-        Jobs.statusToString(Jobs.STATUS_ACTIVEWAITING),
-        Jobs.statusToString(Jobs.STATUS_ACTIVEWAITINGSEEDING),
-        Jobs.statusToString(Jobs.STATUS_PAUSINGWAITING),
-        Jobs.statusToString(Jobs.STATUS_PAUSINGWAITINGSEEDING),
-        Jobs.statusToString(Jobs.STATUS_RESUMING),
-        Jobs.statusToString(Jobs.STATUS_RESUMINGSEEDING)
-        })});
-    
-    return makeJobStatus(whereClause,whereParams,includeCounts,maxCount);
-  }
-
-  /** Get a list of completed jobs, and their statistics.
-  *@param includeCounts is true if document counts should be included.
-  *@param maxCount is the maximum number of documents we want to count for each status.
-  *@return an array of the job status objects.
-  */
-  @Override
-  public JobStatus[] getFinishedJobs(boolean includeCounts, int maxCount)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder();
-    ArrayList whereParams = new ArrayList();
-    
-    sb.append(database.buildConjunctionClause(whereParams,new ClauseDescription[]{
-      new UnitaryClause(Jobs.statusField,Jobs.statusToString(Jobs.STATUS_INACTIVE))})).append(" AND ")
-    .append(Jobs.endTimeField).append(" IS NOT NULL");
-      
-    return makeJobStatus(sb.toString(),whereParams,includeCounts,maxCount);
-  }
-
-  // Protected methods and classes
-
-  /** Make a job status array from a query result.
-  *@param whereClause is the where clause for the jobs we are interested in.
-  *@return the status array.
-  */
-  protected JobStatus[] makeJobStatus(String whereClause, ArrayList whereParams, boolean includeCounts, int maxCount)
-    throws ManifoldCFException
-  {
-    IResultSet set = database.performQuery("SELECT t0."+
-      Jobs.idField+",t0."+
-      Jobs.descriptionField+",t0."+
-      Jobs.statusField+",t0."+
-      Jobs.startTimeField+",t0."+
-      Jobs.endTimeField+",t0."+
-      Jobs.errorField+
-      " FROM "+jobs.getTableName()+" t0 "+((whereClause==null)?"":(" WHERE "+whereClause))+" ORDER BY "+Jobs.descriptionField+" ASC",
-      whereParams,null,null);
-
-    // Build hashes for set2 and set3
-    Map<Long,Long> set2Hash = new HashMap<Long,Long>();
-    Map<Long,Long> set3Hash = new HashMap<Long,Long>();
-    Map<Long,Long> set4Hash = new HashMap<Long,Long>();
-    Map<Long,Boolean> set2Exact = new HashMap<Long,Boolean>();
-    Map<Long,Boolean> set3Exact = new HashMap<Long,Boolean>();
-    Map<Long,Boolean> set4Exact = new HashMap<Long,Boolean>();
-    
-    if (includeCounts)
-    {
-      // If we are counting all of them anyway, do this via GROUP BY since it will be the fastest.  But
-      // otherwise, fire off an individual query at a time.
-      if (maxCount == Integer.MAX_VALUE)
-      {
-        buildCountsUsingGroupBy(whereClause,whereParams,set2Hash,set3Hash,set4Hash,set2Exact,set3Exact,set4Exact);
-      }
-      else
-      {
-        // Check if the total matching jobqueue rows exceeds the limit.  If not, we can still use the cheaper query.
-        StringBuilder sb = new StringBuilder("SELECT ");
-        ArrayList list = new ArrayList();
-            
-        sb.append(database.constructCountClause("t2.x")).append(" AS doccount")
-          .append(" FROM (SELECT 'x' AS x FROM ").append(jobQueue.getTableName()).append(" t1");
-        addWhereClause(sb,list,whereClause,whereParams,false);
-        sb.append(" ").append(database.constructOffsetLimitClause(0,maxCount+1,false))
-          .append(") t2");
-        IResultSet countResult = database.performQuery(sb.toString(),list,null,null);
-        if (countResult.getRowCount() > 0 && ((Long)countResult.getRow(0).getValue("doccount")).longValue() > maxCount)
-        {
-          // Too many items in queue; do it the hard way
-          buildCountsUsingIndividualQueries(whereClause,whereParams,maxCount,set2Hash,set3Hash,set4Hash,set2Exact,set3Exact,set4Exact);
-        }
-        else
-        {
-          // Cheap way should still work.
-          buildCountsUsingGroupBy(whereClause,whereParams,set2Hash,set3Hash,set4Hash,set2Exact,set3Exact,set4Exact);
-        }
-      }
-    }
-    
-    JobStatus[] rval = new JobStatus[set.getRowCount()];
-    for (int i = 0; i < rval.length; i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long jobID = (Long)row.getValue(Jobs.idField);
-      String description = row.getValue(Jobs.descriptionField).toString();
-      int status = Jobs.stringToStatus(row.getValue(Jobs.statusField).toString());
-      Long startTimeValue = (Long)row.getValue(Jobs.startTimeField);
-      long startTime = -1;
-      if (startTimeValue != null)
-        startTime = startTimeValue.longValue();
-      Long endTimeValue = (Long)row.getValue(Jobs.endTimeField);
-      long endTime = -1;
-      if (endTimeValue != null)
-        endTime = endTimeValue.longValue();
-      String errorText = (String)row.getValue(Jobs.errorField);
-      if (errorText != null && errorText.length() == 0)
-        errorText = null;
-      int rstatus = JobStatus.JOBSTATUS_NOTYETRUN;
-
-      switch (status)
-      {
-      case Jobs.STATUS_INACTIVE:
-        if (errorText != null)
-          rstatus = JobStatus.JOBSTATUS_ERROR;
-        else
-        {
-          if (startTime >= 0)
-            rstatus = JobStatus.JOBSTATUS_COMPLETED;
-          else
-            rstatus = JobStatus.JOBSTATUS_NOTYETRUN;
-        }
-        break;
-      case Jobs.STATUS_ACTIVE_UNINSTALLED:
-      case Jobs.STATUS_ACTIVESEEDING_UNINSTALLED:
-        rstatus = JobStatus.JOBSTATUS_RUNNING_UNINSTALLED;
-        break;
-      case Jobs.STATUS_ACTIVE:
-      case Jobs.STATUS_ACTIVESEEDING:
-        rstatus = JobStatus.JOBSTATUS_RUNNING;
-        break;
-      case Jobs.STATUS_SHUTTINGDOWN:
-        rstatus = JobStatus.JOBSTATUS_JOBENDCLEANUP;
-        break;
-      case Jobs.STATUS_READYFORNOTIFY:
-      case Jobs.STATUS_NOTIFYINGOFCOMPLETION:
-      case Jobs.STATUS_READYFORDELETENOTIFY:
-      case Jobs.STATUS_NOTIFYINGOFDELETION:
-        rstatus = JobStatus.JOBSTATUS_JOBENDNOTIFICATION;
-        break;
-      case Jobs.STATUS_ABORTING:
-      case Jobs.STATUS_ABORTINGSHUTTINGDOWN:
-        rstatus = JobStatus.JOBSTATUS_ABORTING;
-        break;
-      case Jobs.STATUS_ABORTINGFORRESTART:
-      case Jobs.STATUS_ABORTINGFORRESTARTMINIMAL:
-      case Jobs.STATUS_ABORTINGFORRESTARTSEEDING:
-      case Jobs.STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:
-      case Jobs.STATUS_ABORTINGSTARTINGUPFORRESTART:
-      case Jobs.STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL:
-        rstatus = JobStatus.JOBSTATUS_RESTARTING;
-        break;
-      case Jobs.STATUS_PAUSING:
-      case Jobs.STATUS_PAUSINGSEEDING:
-      case Jobs.STATUS_ACTIVEWAITING:
-      case Jobs.STATUS_ACTIVEWAITINGSEEDING:
-      case Jobs.STATUS_PAUSINGWAITING:
-      case Jobs.STATUS_PAUSINGWAITINGSEEDING:
-        rstatus = JobStatus.JOBSTATUS_STOPPING;
-        break;
-      case Jobs.STATUS_RESUMING:
-      case Jobs.STATUS_RESUMINGSEEDING:
-        rstatus = JobStatus.JOBSTATUS_RESUMING;
-        break;
-      case Jobs.STATUS_PAUSED:
-      case Jobs.STATUS_PAUSEDSEEDING:
-        rstatus = JobStatus.JOBSTATUS_PAUSED;
-        break;
-      case Jobs.STATUS_ACTIVEWAIT:
-      case Jobs.STATUS_ACTIVEWAITSEEDING:
-        rstatus = JobStatus.JOBSTATUS_WINDOWWAIT;
-        break;
-      case Jobs.STATUS_PAUSEDWAIT:
-      case Jobs.STATUS_PAUSEDWAITSEEDING:
-        rstatus = JobStatus.JOBSTATUS_PAUSED;
-        break;
-      case Jobs.STATUS_STARTINGUP:
-      case Jobs.STATUS_STARTINGUPMINIMAL:
-      case Jobs.STATUS_READYFORSTARTUP:
-      case Jobs.STATUS_READYFORSTARTUPMINIMAL:
-        rstatus = JobStatus.JOBSTATUS_STARTING;
-        break;
-      case Jobs.STATUS_DELETESTARTINGUP:
-      case Jobs.STATUS_READYFORDELETE:
-      case Jobs.STATUS_DELETING:
-      case Jobs.STATUS_DELETING_NOOUTPUT:
-        rstatus = JobStatus.JOBSTATUS_DESTRUCTING;
-        break;
-      default:
-        break;
-      }
-
-      Long set2Value = set2Hash.get(jobID);
-      Long set3Value = set3Hash.get(jobID);
-      Long set4Value = set4Hash.get(jobID);
-      Boolean set2ExactValue = set2Exact.get(jobID);
-      Boolean set3ExactValue = set3Exact.get(jobID);
-      Boolean set4ExactValue = set4Exact.get(jobID);
-      
-      rval[i] = new JobStatus(jobID.toString(),description,rstatus,((set2Value==null)?0L:set2Value.longValue()),
-        ((set3Value==null)?0L:set3Value.longValue()),
-        ((set4Value==null)?0L:set4Value.longValue()),
-        ((set2ExactValue==null)?true:set2ExactValue.booleanValue()),
-        ((set3ExactValue==null)?true:set3ExactValue.booleanValue()),
-        ((set4ExactValue==null)?true:set4ExactValue.booleanValue()),
-        startTime,endTime,errorText);
-    }
-    return rval;
-  }
-
-  protected static ClauseDescription buildOutstandingClause()
-    throws ManifoldCFException
-  {
-    return new MultiClause(JobQueue.statusField,new Object[]{
-    JobQueue.statusToString(JobQueue.STATUS_ACTIVE),
-    JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCAN),
-    JobQueue.statusToString(JobQueue.STATUS_PENDING),
-    JobQueue.statusToString(JobQueue.STATUS_ACTIVEPURGATORY),
-    JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-    JobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY)});
-  }
-    
-  protected static ClauseDescription buildProcessedClause()
-    throws ManifoldCFException
-  {
-    return new MultiClause(JobQueue.statusField,new Object[]{
-    JobQueue.statusToString(JobQueue.STATUS_COMPLETE),
-    JobQueue.statusToString(JobQueue.STATUS_UNCHANGED),
-    JobQueue.statusToString(JobQueue.STATUS_PURGATORY),
-    JobQueue.statusToString(JobQueue.STATUS_ACTIVEPURGATORY),
-    JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-    JobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY)});
-  }
-
-  protected void buildCountsUsingIndividualQueries(String whereClause, ArrayList whereParams, int maxCount,
-    Map<Long,Long> set2Hash, Map<Long,Long> set3Hash, Map<Long,Long> set4Hash,
-    Map<Long,Boolean> set2Exact, Map<Long,Boolean> set3Exact, Map<Long,Boolean> set4Exact)
-    throws ManifoldCFException
-  {
-    // Fire off an individual query with a limit for each job
-    
-    // First, get the list of jobs that we are interested in.
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-
-    sb.append(Jobs.idField).append(" FROM ").append(jobs.getTableName()).append(" t0");
-    if (whereClause != null)
-    {
-      sb.append(" WHERE ")
-        .append(whereClause);
-      if (whereParams != null)
-        list.addAll(whereParams);
-    }
-    
-    IResultSet jobSet = database.performQuery(sb.toString(),list,null,null);
-
-    // Scan the set of jobs
-    for (int i = 0; i < jobSet.getRowCount(); i++)
-    {
-      IResultRow row = jobSet.getRow(i);
-      Long jobID = (Long)row.getValue(Jobs.idField);
-      
-      // Now, for each job, fire off a separate, limited, query for each count we care about
-      sb = new StringBuilder("SELECT ");
-      list.clear();
-      sb.append(database.constructCountClause("t2.x")).append(" AS doccount")
-        .append(" FROM (SELECT 'x' AS x FROM ").append(jobQueue.getTableName()).append(" WHERE ");
-      sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{new UnitaryClause(JobQueue.jobIDField,jobID)}));
-      sb.append(" ").append(database.constructOffsetLimitClause(0,maxCount+1,false))
-        .append(") t2");
-      
-      IResultSet totalSet = database.performQuery(sb.toString(),list,null,null);
-      if (totalSet.getRowCount() > 0)
-      {
-        long rowCount = ((Long)totalSet.getRow(0).getValue("doccount")).longValue();
-        if (rowCount > maxCount)
-        {
-          set2Hash.put(jobID,new Long(maxCount));
-          set2Exact.put(jobID,new Boolean(false));
-        }
-        else
-        {
-          set2Hash.put(jobID,new Long(rowCount));
-          set2Exact.put(jobID,new Boolean(true));
-        }
-      }
-          
-      sb = new StringBuilder("SELECT ");
-      list.clear();
-      sb.append(database.constructCountClause("t2.x")).append(" AS doccount")
-        .append(" FROM (SELECT 'x' AS x FROM ").append(jobQueue.getTableName()).append(" WHERE ");
-      sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{new UnitaryClause(JobQueue.jobIDField,jobID)}));
-      sb.append(" AND ");
-      sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{buildOutstandingClause()}));
-      sb.append(" ").append(database.constructOffsetLimitClause(0,maxCount+1,false))
-        .append(") t2");
-      
-      IResultSet outstandingSet = database.performQuery(sb.toString(),list,null,null);
-      if (outstandingSet.getRowCount() > 0)
-      {
-        long rowCount = ((Long)outstandingSet.getRow(0).getValue("doccount")).longValue();
-        if (rowCount > maxCount)
-        {
-          set3Hash.put(jobID,new Long(maxCount));
-          set3Exact.put(jobID,new Boolean(false));
-        }
-        else
-        {
-          set3Hash.put(jobID,new Long(rowCount));
-          set3Exact.put(jobID,new Boolean(true));
-        }
-      }
-
-      sb = new StringBuilder("SELECT ");
-      list.clear();
-      sb.append(database.constructCountClause("t2.x")).append(" AS doccount")
-        .append(" FROM (SELECT 'x' AS x FROM ").append(jobQueue.getTableName()).append(" WHERE ");
-      sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{new UnitaryClause(JobQueue.jobIDField,jobID)}));
-      sb.append(" AND ");
-      sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{buildProcessedClause()}));
-      sb.append(" ").append(database.constructOffsetLimitClause(0,maxCount+1,false))
-        .append(") t2");
-      
-      IResultSet processedSet = database.performQuery(sb.toString(),list,null,null);
-      if (processedSet.getRowCount() > 0)
-      {
-        long rowCount = ((Long)processedSet.getRow(0).getValue("doccount")).longValue();
-        if (rowCount > maxCount)
-        {
-          set4Hash.put(jobID,new Long(maxCount));
-          set4Exact.put(jobID,new Boolean(false));
-        }
-        else
-        {
-          set4Hash.put(jobID,new Long(rowCount));
-          set4Exact.put(jobID,new Boolean(true));
-        }
-      }
-    }
-  }
-
-  protected void buildCountsUsingGroupBy(String whereClause, ArrayList whereParams,
-    Map<Long,Long> set2Hash, Map<Long,Long> set3Hash, Map<Long,Long> set4Hash,
-    Map<Long,Boolean> set2Exact, Map<Long,Boolean> set3Exact, Map<Long,Boolean> set4Exact)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-        
-    sb.append(JobQueue.jobIDField).append(",")
-      .append(database.constructCountClause(JobQueue.docHashField)).append(" AS doccount")
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t1");
-    addWhereClause(sb,list,whereClause,whereParams,false);
-    sb.append(" GROUP BY ").append(JobQueue.jobIDField);
-    
-    IResultSet set2 = database.performQuery(sb.toString(),list,null,null);
-
-    sb = new StringBuilder("SELECT ");
-    list.clear();
-        
-    sb.append(JobQueue.jobIDField).append(",")
-      .append(database.constructCountClause(JobQueue.docHashField)).append(" AS doccount")
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{buildOutstandingClause()}));
-    addWhereClause(sb,list,whereClause,whereParams,true);
-    sb.append(" GROUP BY ").append(JobQueue.jobIDField);
-        
-    IResultSet set3 = database.performQuery(sb.toString(),list,null,null);
-
-    sb = new StringBuilder("SELECT ");
-    list.clear();
-        
-    sb.append(JobQueue.jobIDField).append(",")
-      .append(database.constructCountClause(JobQueue.docHashField)).append(" AS doccount")
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{buildProcessedClause()}));
-    addWhereClause(sb,list,whereClause,whereParams,true);
-    sb.append(" GROUP BY ").append(JobQueue.jobIDField);
-        
-    IResultSet set4 = database.performQuery(sb.toString(),list,null,null);
-        
-    for (int j = 0; j < set2.getRowCount(); j++)
-    {
-      IResultRow row = set2.getRow(j);
-      Long jobID = (Long)row.getValue(JobQueue.jobIDField);
-      set2Hash.put(jobID,(Long)row.getValue("doccount"));
-      set2Exact.put(jobID,new Boolean(true));
-    }
-    for (int j = 0; j < set3.getRowCount(); j++)
-    {
-      IResultRow row = set3.getRow(j);
-      Long jobID = (Long)row.getValue(JobQueue.jobIDField);
-      set3Hash.put(jobID,(Long)row.getValue("doccount"));
-      set3Exact.put(jobID,new Boolean(true));
-    }
-    for (int j = 0; j < set4.getRowCount(); j++)
-    {
-      IResultRow row = set4.getRow(j);
-      Long jobID = (Long)row.getValue(JobQueue.jobIDField);
-      set4Hash.put(jobID,(Long)row.getValue("doccount"));
-      set4Exact.put(jobID,new Boolean(true));
-    }
-  }
-
-  protected void addWhereClause(StringBuilder sb, ArrayList list, String whereClause, ArrayList whereParams, boolean wherePresent)
-  {
-    if (whereClause != null)
-    {
-      if (wherePresent)
-        sb.append(" AND");
-      else
-        sb.append(" WHERE");
-      
-      sb.append(" EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t0 WHERE ")
-        .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new JoinClause("t0."+Jobs.idField,"t1."+JobQueue.jobIDField)})).append(" AND ")
-        .append(whereClause)
-        .append(")");
-      if (whereParams != null)
-        list.addAll(whereParams);
-    }
-  }
-  
-  // These methods generate reports for direct display in the UI.
-
-  /** Run a 'document status' report.
-  *@param connectionName is the name of the connection.
-  *@param filterCriteria are the criteria used to limit the records considered for the report.
-  *@param sortOrder is the specified sort order of the final report.
-  *@param startRow is the first row to include.
-  *@param rowCount is the number of rows to include.
-  *@return the results, with the following columns: identifier, job, state, status, scheduled, action, retrycount, retrylimit.  The "scheduled" column and the
-  * "retrylimit" column are long values representing a time; all other values will be user-friendly strings.
-  */
-  @Override
-  public IResultSet genDocumentStatus(String connectionName, StatusFilterCriteria filterCriteria, SortOrder sortOrder,
-    int startRow, int rowCount)
-    throws ManifoldCFException
-  {
-    // Build the query.
-    Long currentTime = new Long(System.currentTimeMillis());
-    
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-    
-    sb.append("t0.").append(jobQueue.idField).append(" AS id,")
-      .append("t0.").append(jobQueue.docIDField).append(" AS identifier,")
-      .append("t1.").append(jobs.descriptionField).append(" AS job,")
-      .append("CASE")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Not yet processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Not yet processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Not yet processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Being removed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Being removed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Being removed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Out of scope'")
-      .append(" ELSE 'Unknown'")
-      .append(" END AS state,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?,?)")
-      .append(" THEN 'Inactive'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkActionField).append("=?")
-      .append(" AND t0.").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" THEN 'Ready for processing'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkActionField).append("=?")
-      .append(" AND t0.").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" THEN 'Ready for expiration'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkActionField).append("=?")
-      .append(" AND t0.").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" THEN 'Waiting for processing'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkActionField).append("=?")
-      .append(" AND t0.").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" THEN 'Waiting for expiration'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkTimeField).append(" IS NULL")
-      .append(" THEN 'Waiting forever'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append("=?")
-      .append(" THEN 'Hopcount exceeded'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append(" IN (?,?,?)")
-      .append(" THEN 'Deleting'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?,?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkActionField).append("=?")
-      .append(" THEN 'Processing'")
-      .append(" WHEN ")
-      .append("t0.").append(jobQueue.statusField).append(" IN (?,?,?,?)")
-      .append(" AND ").append("t0.").append(jobQueue.checkActionField).append("=?")
-      .append(" THEN 'Expiring'")
-      .append(" ELSE 'Unknown'")
-      .append(" END AS status,")
-      .append("t0.").append(jobQueue.checkTimeField).append(" AS scheduled,")
-      .append("CASE")
-      .append(" WHEN ").append("t0.").append(jobQueue.checkActionField).append("=? THEN 'Process'")
-      .append(" WHEN ").append("t0.").append(jobQueue.checkActionField).append("=? THEN 'Expire'")
-      .append(" ELSE 'Unknown'")
-      .append(" END AS action,")
-      .append("t0.").append(jobQueue.failCountField).append(" AS retrycount,")
-      .append("t0.").append(jobQueue.failTimeField).append(" AS retrylimit")
-      .append(" FROM ").append(jobQueue.getTableName()).append(" t0,").append(jobs.getTableName()).append(" t1 WHERE ")
-      .append(database.buildConjunctionClause(list,new ClauseDescription[]{
-        new JoinClause("t0."+jobQueue.jobIDField,"t1."+jobs.idField)}));
-
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_UNCHANGED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_HOPCOUNTREMOVED));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_UNCHANGED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_HOPCOUNTREMOVED));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    addCriteria(sb,list,"t0.",connectionName,filterCriteria,true);
-    // The intrinsic ordering is provided by the "id" column, and nothing else.
-    addOrdering(sb,new String[]{"id"},sortOrder);
-    addLimits(sb,startRow,rowCount);
-    return database.performQuery(sb.toString(),list,null,null,rowCount,null);
-  }
-
-  /** Run a 'queue status' report.
-  *@param connectionName is the name of the connection.
-  *@param filterCriteria are the criteria used to limit the records considered for the report.
-  *@param sortOrder is the specified sort order of the final report.
-  *@param idBucketDescription is the bucket description for generating the identifier class.
-  *@param startRow is the first row to include.
-  *@param rowCount is the number of rows to include.
-  *@return the results, with the following columns: idbucket, inactive, processing, expiring, deleting,
-  processready, expireready, processwaiting, expirewaiting
-  */
-  @Override
-  public IResultSet genQueueStatus(String connectionName, StatusFilterCriteria filterCriteria, SortOrder sortOrder,
-    BucketDescription idBucketDescription, int startRow, int rowCount)
-    throws ManifoldCFException
-  {
-    // SELECT substring(docid FROM '<id_regexp>') AS idbucket,
-    //        substring(entityidentifier FROM '<id_regexp>') AS idbucket,
-    //        SUM(CASE WHEN status='C' then 1 else 0 end)) AS inactive FROM jobqueue WHERE <criteria>
-    //              GROUP BY idbucket
-
-    Long currentTime = new Long(System.currentTimeMillis());
-
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-    
-    sb.append("t1.idbucket,SUM(t1.inactive) AS inactive,SUM(t1.processing) AS processing,SUM(t1.expiring) AS expiring,SUM(t1.deleting) AS deleting,")
-      .append("SUM(t1.processready) AS processready,SUM(t1.expireready) AS expireready,SUM(t1.processwaiting) AS processwaiting,SUM(t1.expirewaiting) AS expirewaiting,")
-      .append("SUM(t1.waitingforever) AS waitingforever,SUM(t1.hopcountexceeded) AS hopcountexceeded FROM (SELECT ");
-    
-    addBucketExtract(sb,list,"",jobQueue.docIDField,idBucketDescription);
-    
-    sb.append(" AS idbucket,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?,?)")
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" AS inactive,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?,?,?)")
-      .append(" AND ").append(jobQueue.checkActionField).append("=?")
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as processing,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?,?,?)")
-      .append(" AND ").append(jobQueue.checkActionField).append("=?")
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as expiring,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?,?)")
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as deleting,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append(jobQueue.checkActionField).append("=?")
-      .append(" AND ").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as processready,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append(jobQueue.checkActionField).append("=?")
-      .append(" AND ").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as expireready,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append(jobQueue.checkActionField).append("=?")
-      .append(" AND ").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as processwaiting,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append(jobQueue.checkActionField).append("=?")
-      .append(" AND ").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as expirewaiting,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append(" IN (?,?)")
-      .append(" AND ").append(jobQueue.checkTimeField).append(" IS NULL")
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as waitingforever,")
-      .append("CASE")
-      .append(" WHEN ")
-      .append(jobQueue.statusField).append("=?")
-      .append(" THEN 1 ELSE 0")
-      .append(" END")
-      .append(" as hopcountexceeded");
-    sb.append(" FROM ").append(jobQueue.getTableName());
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_UNCHANGED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
-    
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
-
-    list.add(jobQueue.statusToString(jobQueue.STATUS_HOPCOUNTREMOVED));
-
-    addCriteria(sb,list,"",connectionName,filterCriteria,false);
-    sb.append(") t1 GROUP BY idbucket");
-    addOrdering(sb,new String[]{"idbucket","inactive","processing","expiring","deleting","processready","expireready","processwaiting","expirewaiting","waitingforever","hopcountexceeded"},sortOrder);
-    addLimits(sb,startRow,rowCount);
-    return database.performQuery(sb.toString(),list,null,null,rowCount,null);
-  }
-
-  // Protected methods for report generation
-
-  /** Turn a bucket description into a return column.
-  * This is complicated by the fact that the extraction code is inherently case sensitive.  So if case insensitive is
-  * desired, that means we whack the whole thing to lower case before doing the match.
-  */
-  protected void addBucketExtract(StringBuilder sb, ArrayList list, String columnPrefix, String columnName, BucketDescription bucketDesc)
-  {
-    boolean isSensitive = bucketDesc.isSensitive();
-    list.add(bucketDesc.getRegexp());
-    sb.append(database.constructSubstringClause(columnPrefix+columnName,"?",!isSensitive));
-  }
-
-  /** Add criteria clauses to query.
-  */
-  protected boolean addCriteria(StringBuilder sb, ArrayList list, String fieldPrefix, String connectionName, StatusFilterCriteria criteria, boolean whereEmitted)
-    throws ManifoldCFException
-  {
-    Long[] matchingJobs = criteria.getJobs();
-
-    if (matchingJobs != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      if (matchingJobs.length == 0)
-      {
-        sb.append("0>1");
-      }
-      else
-      {
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.jobIDField,matchingJobs)}));
-      }
-    }
-
-    RegExpCriteria identifierRegexp = criteria.getIdentifierMatch();
-    if (identifierRegexp != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      list.add(identifierRegexp.getRegexpString());
-      sb.append(database.constructRegexpClause(fieldPrefix+jobQueue.docIDField,"?",identifierRegexp.isInsensitive()));
-    }
-
-    Long nowTime = new Long(criteria.getNowTime());
-    int[] states = criteria.getMatchingStates();
-    int[] statuses = criteria.getMatchingStatuses();
-    if (states.length == 0 || statuses.length == 0)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      sb.append("0>1");
-      return whereEmitted;
-    }
-
-    // Iterate through the specified states, and emit a series of OR clauses, one for each state.  The contents of the clause will be complex.
-    whereEmitted = emitClauseStart(sb,whereEmitted);
-    sb.append("(");
-    int k = 0;
-    while (k < states.length)
-    {
-      int stateValue = states[k];
-      if (k > 0)
-        sb.append(" OR ");
-      switch (stateValue)
-      {
-      case DOCSTATE_NEVERPROCESSED:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDING),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)})}));
-        break;
-      case DOCSTATE_PREVIOUSLYPROCESSED:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY),
-            jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE),
-            jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED),
-            jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED),
-            jobQueue.statusToString(jobQueue.STATUS_COMPLETE),
-            jobQueue.statusToString(jobQueue.STATUS_UNCHANGED),
-            jobQueue.statusToString(jobQueue.STATUS_PURGATORY)})}));
-        break;
-      case DOCSTATE_OUTOFSCOPE:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_HOPCOUNTREMOVED)})}));
-        break;
-      }
-      k++;
-    }
-    sb.append(")");
-
-    whereEmitted = emitClauseStart(sb,whereEmitted);
-    sb.append("(");
-    k = 0;
-    while (k < statuses.length)
-    {
-      int stateValue = statuses[k];
-      if (k > 0)
-        sb.append(" OR ");
-      switch (stateValue)
-      {
-      case DOCSTATUS_INACTIVE:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_COMPLETE),
-            jobQueue.statusToString(jobQueue.STATUS_UNCHANGED),
-            jobQueue.statusToString(jobQueue.STATUS_PURGATORY)})}));
-        break;
-      case DOCSTATUS_PROCESSING:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)}),
-          new UnitaryClause(fieldPrefix+jobQueue.checkActionField,jobQueue.actionToString(jobQueue.ACTION_RESCAN))}));
-        break;
-      case DOCSTATUS_EXPIRING:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVE),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY),
-            jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)}),
-          new UnitaryClause(fieldPrefix+jobQueue.checkActionField,jobQueue.actionToString(jobQueue.ACTION_REMOVE))}));
-        break;
-      case DOCSTATUS_DELETING:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED),
-            jobQueue.statusToString(jobQueue.STATUS_BEINGCLEANED),
-            jobQueue.statusToString(jobQueue.STATUS_ELIGIBLEFORDELETE)})}));
-        break;
-      case DOCSTATUS_READYFORPROCESSING:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDING),
-            jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)}),
-          new UnitaryClause(fieldPrefix+jobQueue.checkActionField,jobQueue.actionToString(jobQueue.ACTION_RESCAN)),
-          new UnitaryClause(fieldPrefix+jobQueue.checkTimeField,"<=",nowTime)}));
-        break;
-      case DOCSTATUS_READYFOREXPIRATION:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDING),
-            jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)}),
-          new UnitaryClause(fieldPrefix+jobQueue.checkActionField,jobQueue.actionToString(jobQueue.ACTION_REMOVE)),
-          new UnitaryClause(fieldPrefix+jobQueue.checkTimeField,"<=",nowTime)}));
-        break;
-      case DOCSTATUS_WAITINGFORPROCESSING:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDING),
-            jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)}),
-          new UnitaryClause(fieldPrefix+jobQueue.checkActionField,jobQueue.actionToString(jobQueue.ACTION_RESCAN)),
-          new UnitaryClause(fieldPrefix+jobQueue.checkTimeField,">",nowTime)}));
-        break;
-      case DOCSTATUS_WAITINGFOREXPIRATION:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDING),
-            jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)}),
-          new UnitaryClause(fieldPrefix+jobQueue.checkActionField,jobQueue.actionToString(jobQueue.ACTION_REMOVE)),
-          new UnitaryClause(fieldPrefix+jobQueue.checkTimeField,">",nowTime)}));
-        break;
-      case DOCSTATUS_WAITINGFOREVER:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_PENDING),
-            jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)})}))
-          .append(" AND ").append(fieldPrefix).append(jobQueue.checkTimeField).append(" IS NULL");
-        break;
-      case DOCSTATUS_HOPCOUNTEXCEEDED:
-        sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
-          new MultiClause(fieldPrefix+jobQueue.statusField,new Object[]{
-            jobQueue.statusToString(jobQueue.STATUS_HOPCOUNTREMOVED)})}));
-        break;
-      }
-      k++;
-    }
-    sb.append(")");
-
-    return whereEmitted;
-  }
-
-  /** Emit a WHERE or an AND, depending...
-  */
-  protected boolean emitClauseStart(StringBuilder sb, boolean whereEmitted)
-  {
-    if (whereEmitted)
-      sb.append(" AND ");
-    else
-      sb.append(" WHERE ");
-    return true;
-  }
-
-  /** Add ordering.
-  */
-  protected void addOrdering(StringBuilder sb, String[] completeFieldList, SortOrder sort)
-  {
-    // Keep track of the fields we've seen
-    Map hash = new HashMap();
-
-    // Emit the "Order by"
-    sb.append(" ORDER BY ");
-
-    // Go through the specified list
-    int i = 0;
-    int count = sort.getCount();
-    while (i < count)
-    {
-      if (i > 0)
-        sb.append(",");
-      String column = sort.getColumn(i);
-      sb.append(column);
-      if (sort.getDirection(i) == sort.SORT_ASCENDING)
-        sb.append(" ASC");
-      else
-        sb.append(" DESC");
-      hash.put(column,column);
-      i++;
-    }
-
-    // Now, go through the complete field list, and emit sort criteria for everything
-    // not actually specified.  This is so LIMIT and OFFSET give consistent results.
-
-    int j = 0;
-    while (j < completeFieldList.length)
-    {
-      String field = completeFieldList[j];
-      if (hash.get(field) == null)
-      {
-        if (i > 0)
-          sb.append(",");
-        sb.append(field);
-        sb.append(" DESC");
-        //if (j == 0)
-        //  sb.append(" DESC");
-        //else
-        //  sb.append(" ASC");
-        i++;
-      }
-      j++;
-    }
-  }
-
-  /** Add limit and offset.
-  */
-  protected void addLimits(StringBuilder sb, int startRow, int maxRowCount)
-  {
-    sb.append(" ").append(database.constructOffsetLimitClause(startRow,maxRowCount));
-  }
-
-
-  /** Class for tracking existing jobqueue row data */
-  protected static class JobqueueRecord
-  {
-    protected Long recordID;
-    protected int status;
-    protected Long checkTimeValue;
-
-    public JobqueueRecord(Long recordID, int status, Long checkTimeValue)
-    {
-      this.recordID = recordID;
-      this.status = status;
-      this.checkTimeValue = checkTimeValue;
-    }
-
-    public Long getRecordID()
-    {
-      return recordID;
-    }
-
-    public int getStatus()
-    {
-      return status;
-    }
-
-    public Long getCheckTimeValue()
-    {
-      return checkTimeValue;
-    }
-  }
-
-  /** We go through 2x the number of documents we should need if we were perfect at setting document priorities.  */
-  private static int EXTRA_FACTOR = 2;
-
-  /** This class provides the throttling limits for the job queueing query.
-  */
-  protected static class ThrottleLimit implements ILimitChecker
-  {
-    // For each connection, there is (a) a number (which is the maximum per bin), and (b)
-    // a current running count per bin.  These are stored as elements in a hash map.
-    protected Map<String,ThrottleJobItem> connectionMap = new HashMap<String,ThrottleJobItem>();
-
-    // The maximum number of jobs that have reached their chunk size limit that we
-    // need
-    protected final int n;
-
-    // This is the hash table that maps a job ID to the object that tracks the number
-    // of documents already accumulated for this resultset.  The count of the number
-    // of queue records we have is tallied by going through each job in this table
-    // and adding the records outstanding for it.
-    protected final Map<Long,QueueHashItem> jobQueueHash = new HashMap<Long,QueueHashItem>();
-
-    // This is the map from jobid to connection name
-    protected Map<Long,String> jobConnection = new HashMap<Long,String>();
-
-    // This is the set of allowed connection names.  We discard all documents that are
-    // not from that set.
-    protected Map<String,IRepositoryConnector> activeConnections = new HashMap<String,IRepositoryConnector>();
-
-    // This is the number of documents per set per connection.
-    protected Map<String,Integer> setSizes = new HashMap<String,Integer>();
-
-    // These are the individual connection maximums, keyed by connection name.
-    protected Map<String,MutableInteger> maxConnectionCounts = new HashMap<String,MutableInteger>();
-
-    // This is the maximum number of documents per set over all the connections we are looking at.  This helps us establish a sanity limit.
-    protected int maxSetSize = 0;
-
-    // This is the number of documents processed so far
-    protected int documentsProcessed = 0;
-
-    // This is where we accumulate blocking documents.  This is an arraylist of DocumentDescription objects.
-    protected final List<DocumentDescription> blockingDocumentArray = new ArrayList<DocumentDescription>();
-
-    /** Constructor.
-    * This class is built up piecemeal, so the constructor does nothing.
-    *@param n is the maximum number of full job descriptions we want at this time.
-    */
-    public ThrottleLimit(int n)
-    {
-      this.n = n;
-      Logging.perf.debug("Limit instance created");
-    }
-
-    /** Transfer blocking documents discovered to BlockingDocuments object */
-    public void tallyBlockingDocuments(BlockingDocuments blockingDocuments)
-    {
-      int i = 0;
-      while (i < blockingDocumentArray.size())
-      {
-        DocumentDescription dd = (DocumentDescription)blockingDocumentArray.get(i++);
-        blockingDocuments.addBlockingDocument(dd);
-      }
-      blockingDocumentArray.clear();
-    }
-
-    /** Add a job/connection name map entry.
-    *@param jobID is the job id.
-    *@param connectionName is the connection name.
-    */
-    public void addJob(Long jobID, String connectionName)
-    {
-      jobConnection.put(jobID,connectionName);
-    }
-
-    /** Add an active connection.  This is the pool of active connections that will be used for the lifetime of this operation.
-    *@param connectionName is the connection name.
-    */
-    public void addConnectionName(String connectionName, IRepositoryConnector connectorInstance)
-      throws ManifoldCFException
-    {
-      activeConnections.put(connectionName,connectorInstance);
-      int setSize = connectorInstance.getMaxDocumentRequest();
-      setSizes.put(connectionName,new Integer(setSize));
-      if (setSize > maxSetSize)
-        maxSetSize = setSize;
-    }
-
-    /** Add a document limit for a specified connection.  This is the limit across all matching bins; if any
-    * individual matching bin exceeds that limit, then documents that belong to that bin will be excluded.
-    *@param connectionName is the connection name.
-    *@param regexp is the regular expression, which we will match against various bins.
-    *@param upperLimit is the maximum count associated with the specified job.
-    */
-    public void addLimit(String connectionName, String regexp, int upperLimit)
-    {
-      if (Logging.perf.isDebugEnabled())
-        Logging.perf.debug(" Adding fetch limit of "+Integer.toString(upperLimit)+" fetches for expression '"+regexp+"' for connection '"+connectionName+"'");
-
-      ThrottleJobItem ji = connectionMap.get(connectionName);
-      if (ji == null)
-      {
-        ji = new ThrottleJobItem();
-        connectionMap.put(connectionName,ji);
-      }
-      ji.addLimit(regexp,upperLimit);
-    }
-
-    /** Set a connection-based total document limit.
-    */
-    public void setConnectionLimit(String connectionName, int maxDocuments)
-    {
-      if (Logging.perf.isDebugEnabled())
-        Logging.perf.debug(" Setting connection limit of "+Integer.toString(maxDocuments)+" for connection "+connectionName);
-      maxConnectionCounts.put(connectionName,new MutableInteger(maxDocuments));
-    }
-
-    /** See if this class can be legitimately compared against another of
-    * the same type.
-    *@return true if comparisons will ever return "true".
-    */
-    public boolean doesCompareWork()
-    {
-      return false;
-    }
-
-    /** Create a duplicate of this class instance.  All current state should be preserved.
-    * NOTE: Since doesCompareWork() returns false, queries using this limit checker cannot
-    * be cached, and therefore duplicate() is never called from the query executor.  But it can
-    * be called from other places.
-    *@return the duplicate.
-    */
-    public ILimitChecker duplicate()
-    {
-      return makeDeepCopy();
-    }
-
-    /** Make a deep copy */
-    public ThrottleLimit makeDeepCopy()
-    {
-      ThrottleLimit rval = new ThrottleLimit(n);
-      // Create a true copy of all the structures in which counts are kept.  The referential structures (e.g. connection hashes)
-      // do not need a deep copy.
-      rval.activeConnections = activeConnections;
-      rval.setSizes = setSizes;
-      rval.maxConnectionCounts = maxConnectionCounts;
-      rval.maxSetSize = maxSetSize;
-      rval.jobConnection = jobConnection;
-      // The structures where counts are maintained DO need a deep copy.
-      rval.documentsProcessed = documentsProcessed;
-      for (String key : connectionMap.keySet())
-      {
-        rval.connectionMap.put(key,connectionMap.get(key).duplicate());
-      }
-      for (Long key : jobQueueHash.keySet())
-      {
-        rval.jobQueueHash.put(key,jobQueueHash.get(key).duplicate());
-      }
-      return rval;
-    }
-
-    /** Find the hashcode for this class.  This will only ever be used if
-    * doesCompareWork() returns true.
-    *@return the hashcode.
-    */
-    public int hashCode()
-    {
-      return 0;
-    }
-
-    /** Compare two objects and see if equal.  This will only ever be used
-    * if doesCompareWork() returns true.
-    *@param object is the object to compare against.
-    *@return true if equal.
-    */
-    public boolean equals(Object object)
-    {
-      return false;
-    }
-
-    /** Get the remaining documents we should query for.
-    *@return the maximal remaining count.
-    */
-    public int getRemainingDocuments()
-    {
-      return EXTRA_FACTOR * n * maxSetSize - documentsProcessed;
-    }
-
-    /** See if a result row should be included in the final result set.
-    *@param row is the result row to check.
-    *@return true if it should be included, false otherwise.
-    */
-    public boolean checkInclude(IResultRow row)
-      throws ManifoldCFException
-    {
-      // Note: This method does two things: First, it insures that the number of documents per job per bin does
-      // not exceed the calculated throttle number.  Second, it keeps track of how many document queue items
-      // will be needed, so we can stop when we've got enough for the moment.
-      Logging.perf.debug("Checking if row should be included");
-      // This is the end that does the work.
-      // The row passed in has the following jobqueue columns: idField, jobIDField, docIDField, and statusField
-      Long jobIDValue = (Long)row.getValue(JobQueue.jobIDField);
-
-      // Get the connection name for this row
-      String connectionName = jobConnection.get(jobIDValue);
-      if (connectionName == null)
-      {
-        Logging.perf.debug(" Row does not have an eligible job - excluding");
-        return false;
-      }
-      IRepositoryConnector connectorInstance = activeConnections.get(connectionName);
-      if (connectorInstance == null)
-      {
-        Logging.perf.debug(" Row does not have an eligible connector instance - excluding");
-        return false;
-      }
-
-      // Find the connection limit for this document
-      MutableInteger connectionLimit = maxConnectionCounts.get(connectionName);
-      if (connectionLimit != null)
-      {
-        if (connectionLimit.intValue() == 0)
-        {
-          Logging.perf.debug(" Row exceeds its connection limit - excluding");
-          return false;
-        }
-        connectionLimit.decrement();
-      }
-
-      // Tally this item in the job queue hash, so we can detect when to stop
-      QueueHashItem queueItem = jobQueueHash.get(jobIDValue);
-      if (queueItem == null)
-      {
-        // Need to talk to the connector to get a max number of docs per chunk
-        int maxCount = setSizes.get(connectionName).intValue();
-        queueItem = new QueueHashItem(maxCount);
-        jobQueueHash.put(jobIDValue,queueItem);
-
-      }
-
-      String docIDHash = (String)row.getValue(JobQueue.docHashField);
-      String docID = (String)row.getValue(JobQueue.docIDField);
-
-      // Figure out what the right bins are, given the data we have.
-      // This will involve a call to the connector.
-      String[] binNames = ManifoldCF.calculateBins(connectorInstance,docID);
-      // Keep the running count, so we can abort without going through the whole set.
-      documentsProcessed++;
-      //scanRecord.addBins(binNames);
-
-      ThrottleJobItem item = connectionMap.get(connectionName);
-
-      // If there is no schedule-based throttling on this connection, we're done.
-      if (item == null)
-      {
-        queueItem.addDocument();
-        Logging.perf.debug(" Row has no throttling - including");
-        return true;
-      }
-
-
-      int j = 0;
-      while (j < binNames.length)
-      {
-        if (item.isEmpty(binNames[j]))
-        {
-          if (Logging.perf.isDebugEnabled())
-            Logging.perf.debug(" Bin "+binNames[j]+" has no more available fetches - excluding");
-
-          //???
-          //Object o = row.getValue(JobQueue.prioritySetField);
-          //if (o == null || ((Long)o).longValue() <= prioritizationTime)
-          // Fully enabling blocking document logic, for now.
-          if (true)
-          {
-            // Need to add a document descriptor based on this row to the blockingDocuments object!
-            // This will cause it to be reprioritized preferentially, getting it out of the way if it shouldn't
-            // be there.
-            Long id = (Long)row.getValue(JobQueue.idField);
-            Long jobID = (Long)row.getValue(JobQueue.jobIDField);
-            DocumentDescription dd = new DocumentDescription(id,jobID,docIDHash,docID);
-            blockingDocumentArray.add(dd);
-          }
-
-          return false;
-        }
-        j++;
-      }
-      j = 0;
-      while (j < binNames.length)
-      {
-        item.decrement(binNames[j++]);
-      }
-      queueItem.addDocument();
-      Logging.perf.debug(" Including!");
-      return true;
-    }
-
-    /** See if we should examine another row.
-    *@return true if we need to keep going, or false if we are done.
-    */
-    public boolean checkContinue()
-      throws ManifoldCFException
-    {
-      if (documentsProcessed >= EXTRA_FACTOR * n * maxSetSize)
-        return false;
-
-      // If the number of chunks exceeds n, we are done
-      int count = 0;
-      for (Long jobID : jobQueueHash.keySet())
-      {
-        QueueHashItem item = jobQueueHash.get(jobID);
-        count += item.getChunkCount();
-        if (count > n)
-          return false;
-      }
-      return true;
-    }
-
-
-
-  }
-
-  /** This class contains information per job on how many queue items have so far been accumulated.
-  */
-  protected static class QueueHashItem
-  {
-    // The number of items per chunk for this job
-    final int itemsPerChunk;
-    // The number of chunks so far, INCLUDING incomplete chunks
-    int chunkCount = 0;
-    // The number of documents in the current incomplete chunk
-    int currentDocumentCount = 0;
-
-    /** Construct.
-    *@param itemsPerChunk is the number of items per chunk for this job.
-    */
-    public QueueHashItem(int itemsPerChunk)
-    {
-      this.itemsPerChunk = itemsPerChunk;
-    }
-
-    /** Duplicate. */
-    public QueueHashItem duplicate()
-    {
-      QueueHashItem rval = new QueueHashItem(itemsPerChunk);
-      rval.chunkCount = chunkCount;
-      rval.currentDocumentCount = currentDocumentCount;
-      return rval;
-    }
-
-    /** Add a document to this job.
-    */
-    public void addDocument()
-    {
-      currentDocumentCount++;
-      if (currentDocumentCount == 1)
-        chunkCount++;
-      if (currentDocumentCount == itemsPerChunk)
-        currentDocumentCount = 0;
-    }
-
-    /** Get the number of chunks.
-    *@return the number of chunks.
-    */
-    public int getChunkCount()
-    {
-      return chunkCount;
-    }
-  }
-
-  /** This class represents the information stored PER JOB in the throttling structure.
-  * In this structure, "remaining" counts are kept for each bin.  When the bin becomes empty,
-  * then no more documents that would map to that bin will be returned, for this query.
-  *
-  * The way in which the maximum count per bin is determined is not part of this class.
-  */
-  protected static class ThrottleJobItem
-  {
-    /** These are the bin limits.  This is an array of ThrottleLimitSpec objects. */
-    protected List<ThrottleLimitSpec> throttleLimits = new ArrayList<ThrottleLimitSpec>();
-    /** This is a map of the bins and their current counts. If an entry doesn't exist, it's considered to be
-    * the same as maxBinCount. */
-    protected final Map<String,MutableInteger> binCounts = new HashMap<String,MutableInteger>();
-
-    /** Constructor. */
-    public ThrottleJobItem()
-    {
-    }
-
-    /** Add a bin limit.
-    *@param regexp is the regular expression describing the bins to which the limit applies to.
-    *@param maxCount is the maximum number of fetches allowed for that bin.
-    */
-    public void addLimit(String regexp, int maxCount)
-    {
-      try
-      {
-        throttleLimits.add(new ThrottleLimitSpec(regexp,maxCount));
-      }
-      catch (PatternSyntaxException e)
-      {
-        // Ignore the bad entry; it just won't contribute any throttling.
-      }
-    }
-
-    /** Create a duplicate of this item.
-    *@return the duplicate.
-    */
-    public ThrottleJobItem duplicate()
-    {
-      ThrottleJobItem rval = new ThrottleJobItem();
-      rval.throttleLimits = throttleLimits;
-      for (String key : binCounts.keySet())
-      {
-        this.binCounts.put(key,binCounts.get(key).duplicate());
-      }
-      return rval;
-    }
-
-    /** Check if the specified bin is empty.
-    *@param binName is the bin name.
-    *@return true if empty.
-    */
-    public boolean isEmpty(String binName)
-    {
-      MutableInteger value = binCounts.get(binName);
-      int remaining;
-      if (value == null)
-      {
-        int x = findMaxCount(binName);
-        if (x == -1)
-          return false;
-        remaining = x;
-      }
-      else
-        remaining = value.intValue();
-      return (remaining == 0);
-    }
-
-    /** Decrement specified bin.
-    *@param binName is the bin name.
-    */
-    public void decrement(String binName)
-    {
-      MutableInteger value = binCounts.get(binName);
-      if (value == null)
-      {
-        int x = findMaxCount(binName);
-        if (x == -1)
-          return;
-        value = new MutableInteger(x);
-        binCounts.put(binName,value);
-      }
-      value.decrement();
-    }
-
-    /** Given a bin name, find the max value for it using the regexps that are in place.
-    *@param binName is the bin name.
-    *@return the max count for that bin, or -1 if infinite.
-    */
-    protected int findMaxCount(String binName)
-    {
-      // Each connector generates a set of bins per descriptor, e.g. "", ".com", ".metacarta.com", "foo.metacarta.com"
-      //
-      // We want to be able to do a couple of different kinds of things easily.  For example, we want to:
-      // - be able to "turn off" or restrict fetching for a given domain, to a lower value than for other domains
-      // - be able to control fetch rates of .com, .metacarta.com, and foo.metacarta.com such that we
-      //   can establish a faster rate for .com than for foo.metacarta.com
-      //
-      // The standard case is to limit fetch rate for all terminal domains (e.g. foo.metacarta.com) to some number:
-      //    ^[^\.] = 8
-      //
-      // To apply an additional limit restriction on a specific domain easily requires that the MINIMUM rate
-      // value be chosen when more than one regexp match is found:
-      //    ^[^\.] = 8
-      //    ^foo\.metacarta\.com = 4
-      //
-      // To apply different rates for different levels:
-      //    ^[^\.] = 8
-      //    ^\.[^\.]*\.[^\.]*$ = 20
-      //    ^\.[^\.]*$ = 40
-      //
-
-      // If the same bin is matched by more than one regexp, I now take the MINIMUM value, since this seems to be
-      // more what the world wants to do (restrict, rather than increase, fetch rates).
-      int maxCount = -1;
-      int i = 0;
-      while (i < throttleLimits.size())
-      {
-        ThrottleLimitSpec spec = throttleLimits.get(i++);
-        Pattern p = spec.getRegexp();
-        Matcher m = p.matcher(binName);
-        if (m.find())
-        {
-          int limit = spec.getMaxCount();
-          if (maxCount == -1 || limit < maxCount)
-            maxCount = limit;
-        }
-      }
-
-      return maxCount;
-    }
-  }
-
-  /** This is a class which describes an individual throttle limit, in fetches. */
-  protected static class ThrottleLimitSpec
-  {
-    /** Regexp */
-    protected final Pattern regexp;
-    /** The fetch limit for all bins matching that regexp */
-    protected final int maxCount;
-
-    /** Constructor */
-    public ThrottleLimitSpec(String regexp, int maxCount)
-      throws PatternSyntaxException
-    {
-      this.regexp = Pattern.compile(regexp);
-      this.maxCount = maxCount;
-    }
-
-    /** Get the regexp. */
-    public Pattern getRegexp()
-    {
-      return regexp;
-    }
-
-    /** Get the max count */
-    public int getMaxCount()
-    {
-      return maxCount;
-    }
-  }
-
-  /** Mutable integer class.
-  */
-  protected static class MutableInteger
-  {
-    int value;
-
-    /** Construct.
-    */
-    public MutableInteger(int value)
-    {
-      this.value = value;
-    }
-
-    /** Duplicate */
-    public MutableInteger duplicate()
-    {
-      return new MutableInteger(value);
-    }
-
-    /** Decrement.
-    */
-    public void decrement()
-    {
-      value--;
-    }
-
-    /** Increment.
-    */
-    public void increment()
-    {
-      value++;
-    }
-
-    /** Get value.
-    */
-    public int intValue()
-    {
-      return value;
-    }
-  }
-
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java
deleted file mode 100644
index 0a740a3..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java
+++ /dev/null
@@ -1,1966 +0,0 @@
-/* $Id: JobQueue.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import java.util.*;
-
-/** This is the job queue manager class.  It is responsible for managing the jobqueue database table.
- * 
- * <br><br>
- * <b>jobqueue</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>id</td><td>BIGINT</td><td>Primary Key</td></tr>
- * <tr><td>jobid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
- * <tr><td>dochash</td><td>VARCHAR(40)</td><td></td></tr>
- * <tr><td>docid</td><td>LONGTEXT</td><td></td></tr>
- * <tr><td>checktime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>failtime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>failcount</td><td>BIGINT</td><td></td></tr>
- * <tr><td>status</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>isseed</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>docpriority</td><td>FLOAT</td><td></td></tr>
- * <tr><td>checkaction</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>processid</td><td>VARCHAR(16)</td><td></td></tr>
- * <tr><td>seedingprocessid</td><td>VARCHAR(16)</td><td></td></tr>
- * <tr><td>needpriority</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>needpriorityprocessid</td><td>VARCHAR(16)</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class JobQueue extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: JobQueue.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Seeding status values
-  public final static int SEEDSTATUS_NOTSEED = 0;
-  public final static int SEEDSTATUS_SEED = 1;
-  public final static int SEEDSTATUS_NEWSEED = 2;
-
-  // Status values
-  public final static int STATUS_PENDING = 0;
-  public final static int STATUS_ACTIVE = 1;
-  public final static int STATUS_COMPLETE = 2;
-  public final static int STATUS_UNCHANGED = 3;
-  public final static int STATUS_PENDINGPURGATORY = 4;
-  public final static int STATUS_ACTIVEPURGATORY = 5;
-  public final static int STATUS_PURGATORY = 6;
-  public final static int STATUS_BEINGDELETED = 7;
-  public final static int STATUS_ACTIVENEEDRESCAN = 8;
-  public final static int STATUS_ACTIVENEEDRESCANPURGATORY = 9;
-  public final static int STATUS_BEINGCLEANED = 10;
-  public final static int STATUS_ELIGIBLEFORDELETE = 11;
-  public final static int STATUS_HOPCOUNTREMOVED = 12;
-  
-  // Action values
-  public final static int ACTION_RESCAN = 0;
-  public final static int ACTION_REMOVE = 1;
-
-  // Need priority status
-  public final static int NEEDPRIORITY_FALSE = 0;
-  public final static int NEEDPRIORITY_INPROGRESS = 1;
-  public final static int NEEDPRIORITY_TRUE = 2;
-  
-  // State descriptions are as follows:
-  // PENDING means a newly-added reference that has not been scanned before.
-  // ACTIVE means a newly-added reference that is being scanned for the first time.
-  // COMPLETE means a reference that has been already scanned (and does not need to be
-  //   scanned again for this job session)
-  // UNCHANGED represents a document that was previously COMPLETE, and is eligible
-  //   to be discovered or seeded, but hasn't been yet.  This is different from PURGATORY because
-  //   UNCHANGED documents are not cleaned up at the end, but PURGATORY documents are.
-  // PURGATORY means a reference that was complete before, which means it will need to be deleted if
-  //   it isn't included in this job session)
-  // PENDINGPURGATORY means a reference that was complete before, but which has been rediscovered in
-  //   this job session, but hasn't been scanned yet
-  // ACTIVEPURGATORY means a reference that was PENDINGPURGATORY before, and has been picked up by a
-  //   thread for processing
-  //
-  // PENDINGPURGATORY and ACTIVEPURGATORY exist in order to allow the system to properly recover from
-  // an aborted job.  On recovery, PENDING and ACTIVE records are deleted (since they were never
-  // completed), while PENDINGPURGATORY and ACTIVEPURGATORY records are retained but get marked as PURGATORY.
-  //
-  // BEINGDELETED means that the document is queued because the owning job is being
-  //   deleted.  It exists so that jobs that are active can avoid processing a document until the cleanup
-  //   activity is done.
-  //
-  // BEINGCLEANED means that the document is queued because the owning job is in the SHUTTINGDOWN
-  //   state, and the document was never encountered during the crawl.
-
-  // Field names
-  public static final String idField = "id";
-  public static final String jobIDField = "jobid";
-  public static final String docHashField = "dochash";
-  public static final String docIDField = "docid";
-  public static final String checkTimeField = "checktime";
-  public static final String statusField = "status";
-  public static final String failTimeField = "failtime";
-  public static final String failCountField = "failcount";
-  public static final String isSeedField = "isseed";
-  public static final String docPriorityField = "docpriority";
-  public static final String checkActionField = "checkaction";
-  public static final String processIDField = "processid";
-  public static final String seedingProcessIDField = "seedingprocessid";
-  public static final String needPriorityField = "needpriority";
-  public static final String needPriorityProcessIDField = "needpriorityprocessid";
-  
-  public static final double noDocPriorityValue = 1e9;
-  public static final Double nullDocPriority = new Double(noDocPriorityValue + 1.0);
-  
-  protected static final Map<String,Integer> statusMap = new HashMap<String,Integer>();
-
-  static
-  {
-    statusMap.put("P",new Integer(STATUS_PENDING));
-    statusMap.put("A",new Integer(STATUS_ACTIVE));
-    statusMap.put("C",new Integer(STATUS_COMPLETE));
-    statusMap.put("U",new Integer(STATUS_UNCHANGED));
-    statusMap.put("G",new Integer(STATUS_PENDINGPURGATORY));
-    statusMap.put("F",new Integer(STATUS_ACTIVEPURGATORY));
-    statusMap.put("Z",new Integer(STATUS_PURGATORY));
-    statusMap.put("E",new Integer(STATUS_ELIGIBLEFORDELETE));
-    statusMap.put("D",new Integer(STATUS_BEINGDELETED));
-    statusMap.put("a",new Integer(STATUS_ACTIVENEEDRESCAN));
-    statusMap.put("f",new Integer(STATUS_ACTIVENEEDRESCANPURGATORY));
-    statusMap.put("d",new Integer(STATUS_BEINGCLEANED));
-    statusMap.put("H",new Integer(STATUS_HOPCOUNTREMOVED));
-  }
-
-  protected static final Map<String,Integer> seedstatusMap = new HashMap<String,Integer>();
-
-  static
-  {
-    seedstatusMap.put("F",new Integer(SEEDSTATUS_NOTSEED));
-    seedstatusMap.put("S",new Integer(SEEDSTATUS_SEED));
-    seedstatusMap.put("N",new Integer(SEEDSTATUS_NEWSEED));
-  }
-
-  protected static final Map<String,Integer> actionMap = new HashMap<String,Integer>();
-
-  static
-  {
-    actionMap.put("R",new Integer(ACTION_RESCAN));
-    actionMap.put("D",new Integer(ACTION_REMOVE));
-  }
-
-  protected static final Map<String,Integer> needPriorityMap = new HashMap<String,Integer>();
-  
-  static
-  {
-    needPriorityMap.put("T",new Integer(NEEDPRIORITY_TRUE));
-    needPriorityMap.put("I",new Integer(NEEDPRIORITY_INPROGRESS));
-    needPriorityMap.put("F",new Integer(NEEDPRIORITY_FALSE));
-  }
-  
-  /** Prerequisite event manager */
-  protected PrereqEventManager prereqEventManager;
-
-  /** Thread context */
-  protected IThreadContext threadContext;
-  
-  /** Cached getNextDocuments order-by index hint */
-  protected String getNextDocumentsIndexHint = null;
-  
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public JobQueue(IThreadContext tc, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"jobqueue");
-    this.threadContext = tc;
-    prereqEventManager = new PrereqEventManager(database);
-  }
-
-  /** Install or upgrade.
-  */
-  public void install(String jobsTable, String jobsColumn)
-    throws ManifoldCFException
-  {
-    // Standard practice to use outer loop to allow retry in case of upgrade.
-    while (true)
-    {
-      // Handle schema
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(idField,new ColumnDescription("BIGINT",true,false,null,null,false));
-        map.put(jobIDField,new ColumnDescription("BIGINT",false,false,jobsTable,jobsColumn,false));
-        // this is the local document identifier.
-        map.put(docHashField,new ColumnDescription("VARCHAR(40)",false,false,null,null,false));
-        map.put(docIDField,new ColumnDescription("LONGTEXT",false,false,null,null,false));
-        map.put(checkTimeField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(failTimeField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(failCountField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(statusField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(isSeedField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        map.put(docPriorityField,new ColumnDescription("FLOAT",false,true,null,null,false));
-        map.put(checkActionField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        map.put(processIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        map.put(seedingProcessIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        map.put(needPriorityField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        map.put(needPriorityProcessIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade; null docpriority fields bashed to 'infinity', so they don't slow down MySQL
-      }
-
-      // Secondary table installation
-      prereqEventManager.install(getTableName(),idField);
-
-      // Handle indexes
-      IndexDescription uniqueIndex = new IndexDescription(true,new String[]{docHashField,jobIDField});
-      IndexDescription jobStatusIndex = new IndexDescription(false,new String[]{jobIDField,statusField});
-      IndexDescription jobSeedIndex = new IndexDescription(false,new String[]{isSeedField,jobIDField});
-      IndexDescription failTimeIndex = new IndexDescription(false,new String[]{failTimeField,jobIDField});
-      IndexDescription actionTimeStatusIndex = new IndexDescription(false,new String[]{statusField,checkActionField,checkTimeField});
-      IndexDescription needPriorityIndex = new IndexDescription(false,new String[]{needPriorityField});
-      // No evidence that the extra fields help at all, for any database...
-      IndexDescription docpriorityIndex = new IndexDescription(false,new String[]{docPriorityField,statusField,checkActionField,checkTimeField});
-
-      // Get rid of unused indexes
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (uniqueIndex != null && id.equals(uniqueIndex))
-          uniqueIndex = null;
-        else if (needPriorityIndex != null && id.equals(needPriorityIndex))
-          needPriorityIndex = null;
-        else if (jobStatusIndex != null && id.equals(jobStatusIndex))
-          jobStatusIndex = null;
-        else if (jobSeedIndex != null && id.equals(jobSeedIndex))
-          jobSeedIndex = null;
-        else if (failTimeIndex != null && id.equals(failTimeIndex))
-          failTimeIndex = null;
-        else if (actionTimeStatusIndex != null && id.equals(actionTimeStatusIndex))
-          actionTimeStatusIndex = null;
-        else if (docpriorityIndex != null && id.equals(docpriorityIndex))
-          docpriorityIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Build missing indexes
-
-      if (jobStatusIndex != null)
-        performAddIndex(null,jobStatusIndex);
-
-      if (needPriorityIndex != null)
-        performAddIndex(null,needPriorityIndex);
-      
-      if (jobSeedIndex != null)
-        performAddIndex(null,jobSeedIndex);
-
-      if (failTimeIndex != null)
-        performAddIndex(null,failTimeIndex);
-      
-      if (actionTimeStatusIndex != null)
-        performAddIndex(null,actionTimeStatusIndex);
-
-      if (docpriorityIndex != null)
-        performAddIndex(null,docpriorityIndex);
-
-      if (uniqueIndex != null)
-        performAddIndex(null,uniqueIndex);
-
-
-      break;
-    }
-  }
-
-  /** Get the 'getNextDocuments' index hint.
-  */
-  public String getGetNextDocumentsIndexHint()
-    throws ManifoldCFException
-  {
-    if (getNextDocumentsIndexHint == null)
-    {
-      // Figure out what index it is
-      getNextDocumentsIndexHint = getDBInterface().constructIndexHintClause(getTableName(),
-        new IndexDescription(false,new String[]{docPriorityField,statusField,checkActionField,checkTimeField}));
-    }
-    return getNextDocumentsIndexHint;
-  }
-  
-  /** Analyze job tables due to major event */
-  public void unconditionallyAnalyzeTables()
-    throws ManifoldCFException
-  {
-    long startTime = System.currentTimeMillis();
-    Logging.perf.debug("Beginning to analyze jobqueue table");
-    analyzeTable();
-    Logging.perf.debug("Done analyzing jobqueue table in "+new Long(System.currentTimeMillis()-startTime)+" ms");
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      prereqEventManager.deinstall();
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Restart.
-  * This method should be called at initial startup time.  It resets the status of all documents to something
-  * reasonable, so the jobs can be restarted and work properly to completion.
-  *@param processID is the processID to clean up after.
-  */
-  public void restart(String processID)
-    throws ManifoldCFException
-  {
-    // Map NEEDPRIORITY_INPROCESS back to NEEDPRIORITY_TRUE
-    HashMap map = new HashMap();
-    ArrayList list = new ArrayList();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(needPriorityField,needPriorityToString(NEEDPRIORITY_INPROGRESS)),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map ACTIVE back to PENDING.
-    map.clear();
-    list.clear();
-    map.put(statusField,statusToString(STATUS_PENDING));
-    map.put(processIDField,null);
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVENEEDRESCAN)}),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map ACTIVEPURGATORY to PENDINGPURGATORY
-    map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-    map.put(processIDField,null);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVEPURGATORY),
-        statusToString(STATUS_ACTIVENEEDRESCANPURGATORY)}),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map BEINGDELETED to ELIGIBLEFORDELETE
-    map.put(statusField,statusToString(STATUS_ELIGIBLEFORDELETE));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_BEINGDELETED)),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map BEINGCLEANED to PURGATORY
-    map.put(statusField,statusToString(STATUS_PURGATORY));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_BEINGCLEANED)),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map newseed fields to seed
-    map.clear();
-    map.put(isSeedField,seedstatusToString(SEEDSTATUS_SEED));
-    map.put(seedingProcessIDField,null);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(isSeedField,seedstatusToString(SEEDSTATUS_NEWSEED)),
-      new UnitaryClause(seedingProcessIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Not accurate, but best we can do without overhead.  This number is chosen so that default
-    // values of the reindexing parameters will cause reindexing to occur at this point, but users
-    // can configure them higher and shut this down.
-    noteModifications(0,50000,0);
-    // Always analyze.
-    unconditionallyAnalyzeTables();
-
-    TrackerClass.noteGlobalChange("Restart");
-  }
-
-  /** Cleanup after all processIDs.
-  */
-  public void restart()
-    throws ManifoldCFException
-  {
-    // Map NEEDPRIORITY_INPROGRESS to NEEDPRIORITY_TRUE
-    HashMap map = new HashMap();
-    ArrayList list = new ArrayList();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(needPriorityField,needPriorityToString(NEEDPRIORITY_INPROGRESS))});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map ACTIVE back to PENDING.
-    map.clear();
-    list.clear();
-    map.put(statusField,statusToString(STATUS_PENDING));
-    map.put(processIDField,null);
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVENEEDRESCAN)})});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map ACTIVEPURGATORY to PENDINGPURGATORY
-    map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-    map.put(processIDField,null);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVEPURGATORY),
-        statusToString(STATUS_ACTIVENEEDRESCANPURGATORY)})});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map BEINGDELETED to ELIGIBLEFORDELETE
-    map.put(statusField,statusToString(STATUS_ELIGIBLEFORDELETE));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_BEINGDELETED))});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map BEINGCLEANED to PURGATORY
-    map.put(statusField,statusToString(STATUS_PURGATORY));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_BEINGCLEANED))});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map newseed fields to seed
-    map.clear();
-    map.put(isSeedField,seedstatusToString(SEEDSTATUS_SEED));
-    map.put(seedingProcessIDField,null);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(isSeedField,seedstatusToString(SEEDSTATUS_NEWSEED))});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Not accurate, but best we can do without overhead.  This number is chosen so that default
-    // values of the reindexing parameters will cause reindexing to occur at this point, but users
-    // can configure them higher and shut this down.
-    noteModifications(0,50000,0);
-    unconditionallyAnalyzeTables();
-
-    TrackerClass.noteGlobalChange("Restart cluster");
-  }
-  
-  /** Restart for entire cluster.
-  */
-  public void restartCluster()
-    throws ManifoldCFException
-  {
-    // Clear out all failtime fields (since we obviously haven't been retrying whilst we were not
-    // running)
-    HashMap map = new HashMap();
-    map.put(failTimeField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new NullCheckClause(failTimeField,false)});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-  
-  /** Flip all records for a job that have status HOPCOUNTREMOVED back to PENDING.
-  * NOTE: We need to actually schedule these!!!  so the following can't really work. 
-  */
-  public void reactivateHopcountRemovedRecords(Long jobID)
-    throws ManifoldCFException
-  {
-    Map map = new HashMap();
-    // Map HOPCOUNTREMOVED to PENDING
-    map.put(statusField,statusToString(STATUS_PENDING));
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(statusField,statusToString(STATUS_HOPCOUNTREMOVED))});
-    performUpdate(map,"WHERE "+query,list,null);
-    unconditionallyAnalyzeTables();
-    
-    TrackerClass.noteJobChange(jobID,"Map HOPCOUNTREMOVED to PENDING");
-  }
-
-
-  /** Clear the failtimes for all documents associated with a job.
-  * This method is called when the system detects that a significant delaying event has occurred,
-  * and therefore the "failure clock" needs to be reset.
-  *@param jobID is the job identifier.
-  */
-  public void clearFailTimes(Long jobID)
-    throws ManifoldCFException
-  {
-    Map map = new HashMap();
-    map.put(failTimeField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new NullCheckClause(failTimeField,false),
-      new UnitaryClause(jobIDField,jobID)});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Reset as part of restoring document worker threads.
-  * This will get called if something went wrong that could have screwed up the
-  * status of a worker thread.  The threads all die/end, and this method
-  * resets any active documents back to the right state (waiting for stuffing).
-  *@param processID is the current processID.
-  */
-  public void resetDocumentWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    // Map ACTIVE back to PENDING.
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_PENDING));
-    map.put(processIDField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVENEEDRESCAN)}),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Map ACTIVEPURGATORY to PENDINGPURGATORY
-    map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-    map.put(processIDField,null);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVEPURGATORY),
-        statusToString(STATUS_ACTIVENEEDRESCANPURGATORY)}),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    unconditionallyAnalyzeTables();
-        
-    TrackerClass.noteGlobalChange("Reset document worker status");
-  }
-
-  /** Reset doc delete worker status.
-  */
-  public void resetDocDeleteWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    // Map BEINGDELETED to ELIGIBLEFORDELETE
-    map.put(statusField,statusToString(STATUS_ELIGIBLEFORDELETE));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_BEINGDELETED)),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    unconditionallyAnalyzeTables();
-
-    TrackerClass.noteGlobalChange("Reset document delete worker status");
-  }
-
-  /** Reset doc cleaning worker status.
-  */
-  public void resetDocCleanupWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    // Map BEINGCLEANED to PURGATORY
-    map.put(statusField,statusToString(STATUS_PURGATORY));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(0L));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_BEINGCLEANED)),
-      new UnitaryClause(processIDField,processID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    unconditionallyAnalyzeTables();
-
-    TrackerClass.noteGlobalChange("Reset document cleanup worker status");
-  }
-
-  /** Prepare for a job delete pass.  This will not be called
-  * unless the job is in an INACTIVE state.
-  * Does the following:
-  * (1) Delete PENDING entries
-  * (2) Maps PENDINGPURGATORY, PURGATORY, and COMPLETED entries to ELIGIBLEFORDELETE
-  *@param jobID is the job identifier.
-  */
-  public void prepareDeleteScan(Long jobID)
-    throws ManifoldCFException
-  {
-    // Delete PENDING entries
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause("t0."+jobIDField,jobID),
-      new MultiClause("t0."+statusField,new Object[]{
-        statusToString(STATUS_PENDING),
-        statusToString(STATUS_HOPCOUNTREMOVED)})});
-    // Clean out prereqevents table first
-    prereqEventManager.deleteRows(getTableName()+" t0","t0."+idField,query,list);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_PENDING),
-        statusToString(STATUS_HOPCOUNTREMOVED)})});
-    performDelete("WHERE "+query,list,null);
-
-    // Turn PENDINGPURGATORY, PURGATORY, COMPLETED into ELIGIBLEFORDELETE.
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_ELIGIBLEFORDELETE));
-    map.put(checkTimeField,new Long(0L));
-    map.put(checkActionField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_PENDINGPURGATORY),
-        statusToString(STATUS_COMPLETE),
-        statusToString(STATUS_UNCHANGED),
-        statusToString(STATUS_PURGATORY)})});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Not accurate, but best we can do without overhead
-    noteModifications(0,2,0);
-    // Do an analyze, otherwise our plans are going to be crap right off the bat
-    unconditionallyAnalyzeTables();
-
-    TrackerClass.noteJobChange(jobID,"Prepare delete scan");
-  }
-  
-  /** Prepare for a "full scan" job.  This will not be called
-  * unless the job is in the "INACTIVE" state.
-  * This does the following:
-  * (1) get rid of all PENDING entries.
-  * (2) map PENDINGPURGATORY entries to PURGATORY.
-  * (4) map COMPLETED entries to PURGATORY.
-  *@param jobID is the job identifier.
-  */
-  public void prepareFullScan(Long jobID)
-    throws ManifoldCFException
-  {
-    // Delete PENDING and HOPCOUNTREMOVED entries (they are treated the same)
-    ArrayList list = new ArrayList();
-    // Clean out prereqevents table first
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause("t0."+jobIDField,jobID),
-      new MultiClause("t0."+statusField,new Object[]{
-        statusToString(STATUS_PENDING),
-        statusToString(STATUS_HOPCOUNTREMOVED)})});
-    prereqEventManager.deleteRows(getTableName()+" t0","t0."+idField,query,list);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_PENDING),
-        statusToString(STATUS_HOPCOUNTREMOVED)})});
-    performDelete("WHERE "+query,list,null);
-
-    // Turn PENDINGPURGATORY and COMPLETED into PURGATORY.
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_PURGATORY));
-    map.put(checkTimeField,new Long(0L));
-    map.put(checkActionField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    // Do not reset priorities.  This means, of course, that they may be out of date - but they are probably more accurate in their current form
-    // than being set back to some arbitrary value.
-    // The alternative, which would be to reprioritize all the documents at this point, is somewhat attractive, but let's see if we can get away
-    // without for now.
-      
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{  
-        statusToString(STATUS_PENDINGPURGATORY),
-        statusToString(STATUS_UNCHANGED),
-        statusToString(STATUS_COMPLETE)})});
-    performUpdate(map,"WHERE "+query,list,null);
-
-    // Not accurate, but best we can do without overhead
-    noteModifications(0,2,0);
-    // Do an analyze, otherwise our plans are going to be crap right off the bat
-    unconditionallyAnalyzeTables();
-        
-    TrackerClass.noteJobChange(jobID,"Prepare full scan");
-  }
-
-  /** Reset schedule for all PENDINGPURGATORY entries.
-  *@param jobID is the job identifier.
-  */
-  public void resetPendingDocumentSchedules(Long jobID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    // Do not reset priorities here!  They should all be blank at this point.
-    map.put(checkTimeField,new Long(0L));
-    map.put(checkActionField,actionToString(ACTION_RESCAN));
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_PENDINGPURGATORY),
-        statusToString(STATUS_PENDING)})});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-  }
-  
-  /** For ADD_CHANGE_DELETE jobs where the specifications have been changed,
-  * we must reconsider every existing document.  So reconsider them all.
-  *@param jobID is the job identifier.
-  */
-  public void queueAllExisting(Long jobID)
-    throws ManifoldCFException
-  {
-    // Map COMPLETE to PENDINGPURGATORY
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    // Do not reset priorities here!  They should all be blank at this point.
-    map.put(checkTimeField,new Long(0L));
-    map.put(checkActionField,actionToString(ACTION_RESCAN));
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(statusField,statusToString(STATUS_COMPLETE))});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    // Do an analyze, otherwise our plans are going to be crap right off the bat
-    unconditionallyAnalyzeTables();
-  }
-    
-  /** Prepare for a "partial" job.  This is called ONLY when the job is inactive.
-  *
-  * This method maps all COMPLETE entries to UNCHANGED.  The purpose is to
-  * allow discovery to find the documents that need to be processed.  If they were
-  * marked as COMPLETE that would stop them from being queued.
-  *@param jobID is the job identifier.
-  */
-  public void preparePartialScan(Long jobID)
-    throws ManifoldCFException
-  {
-    // Map COMPLETE to UNCHANGED.
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_UNCHANGED));
-    // Do not reset priorities here!  They should all be blank at this point.
-    map.put(checkTimeField,new Long(0L));
-    map.put(checkActionField,actionToString(ACTION_RESCAN));
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new UnitaryClause(statusField,statusToString(STATUS_COMPLETE))});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    // Do an analyze, otherwise our plans are going to be crap right off the bat
-    unconditionallyAnalyzeTables();
-  }
-  
-  /** Prepare for an "incremental" job.  This is called ONLY when the job is inactive;
-  * that is, there should be no ACTIVE or ACTIVEPURGATORY entries at all.
-  *
-  * The preparation for starting an incremental job is to requeue all documents that are
-  * currently in the system that are marked "COMPLETE".  These get marked as "PENDINGPURGATORY",
-  * since the idea is to queue them in such a way that we know they were ingested before.
-  *@param jobID is the job identifier.
-  */
-  public void prepareIncrementalScan(Long jobID)
-    throws ManifoldCFException
-  {
-    // Map COMPLETE to PENDINGPURGATORY.
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    // Do not reset priorities here!  They should all be blank at this point.
-    map.put(checkTimeField,new Long(0L));
-    map.put(checkActionField,actionToString(ACTION_RESCAN));
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_COMPLETE),
-        statusToString(STATUS_UNCHANGED)})});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    // Do an analyze, otherwise our plans are going to be crap right off the bat
-    unconditionallyAnalyzeTables();
-      
-    TrackerClass.noteJobChange(jobID,"Prepare incremental scan");
-  }
-
-  /** Delete ingested document identifiers (as part of deleting the owning job).
-  * The number of identifiers specified is guaranteed to be less than the maxInClauseCount
-  * for the database.
-  *@param identifiers is the set of document identifiers.
-  */
-  public void deleteIngestedDocumentIdentifiers(DocumentDescription[] identifiers)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    int i = 0;
-    while (i < identifiers.length)
-    {
-      list.add(identifiers[i].getID());
-      i++;
-    }
-    if (list.size() > 0)
-      doDeletes(list);
-    noteModifications(0,0,identifiers.length);
-  }
-
-  /** Check if there are any outstanding active documents for a job */
-  public boolean checkJobBusy(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVEPURGATORY),
-        statusToString(STATUS_ACTIVENEEDRESCAN),
-        statusToString(STATUS_ACTIVENEEDRESCANPURGATORY)})});
-    IResultSet set = performQuery("SELECT "+docHashField+" FROM "+getTableName()+
-      " WHERE "+query+" "+constructOffsetLimitClause(0,1),list,null,null,1);
-    return set.getRowCount() > 0;
-  }
-
-  /** For a job deletion: Delete all records for a job.
-  *@param jobID is the job identifier.
-  */
-  public void deleteAllJobRecords(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    list.add(jobID);
-    // Clean out prereqevents table first
-    prereqEventManager.deleteRows(getTableName()+" t0","t0."+idField,"t0."+jobIDField+"=?",list);
-    list.clear();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-    performDelete("WHERE "+query,list,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Prepare to calculate a document priority for a given row. */
-  public void markNeedPriorityInProgress(Long rowID, String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_INPROGRESS));
-    map.put(needPriorityProcessIDField,processID);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,rowID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-  }
-  
-  /** Write out a document priority */
-  public void writeDocPriority(Long rowID, IPriorityCalculator priority)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-    map.put(needPriorityProcessIDField,null);
-    map.put(docPriorityField,new Double(priority.getDocumentPriority()));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,rowID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-  }
-
-  /** Mark queued documents for prioritization */
-  public void prioritizeQueuedDocuments(Long jobID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID),
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_PENDING),
-        statusToString(STATUS_PENDINGPURGATORY)})});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-  }
-  
-  /** Clear all document priorities for a job that is going to sleep */
-  public void noDocPriorities(Long jobID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-    map.put(needPriorityProcessIDField,null);
-    map.put(docPriorityField,nullDocPriority);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-  }
-  
-  /** Clear all document priorities globally for all documents that
-  * have priorities set, and signal that we need new priorities for all.
-  */
-  public void clearAllDocPriorities()
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_TRUE));
-    map.put(needPriorityProcessIDField,null);
-    map.put(docPriorityField,nullDocPriority);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(docPriorityField,"<",nullDocPriority)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-  }
-  
-  /** Set the "completed" status for a record.
-  */
-  public void updateCompletedRecord(Long recID, int currentStatus)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    
-    int newStatus;
-    String actionFieldValue;
-    Long checkTimeValue;
-    
-    switch (currentStatus)
-    {
-    case STATUS_ACTIVE:
-    case STATUS_ACTIVEPURGATORY:
-      newStatus = STATUS_COMPLETE;
-      actionFieldValue = null;
-      checkTimeValue = null;
-      // Remove document priority; we don't want to pollute the queue.  See CONNECTORS-290.
-      map.put(docPriorityField,nullDocPriority);
-      map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-      break;
-    case STATUS_ACTIVENEEDRESCAN:
-    case STATUS_ACTIVENEEDRESCANPURGATORY:
-      newStatus = STATUS_PENDINGPURGATORY;
-      actionFieldValue = actionToString(ACTION_RESCAN);
-      checkTimeValue = new Long(0L);
-      // Leave doc priority unchanged.
-      break;
-    default:
-      TrackerClass.printForensics(recID, currentStatus);
-      throw new ManifoldCFException("Unexpected jobqueue status - record id "+recID.toString()+", expecting active status, saw "+Integer.toString(currentStatus));
-    }
-
-    map.put(statusField,statusToString(newStatus));
-    map.put(processIDField,null);
-    map.put(checkTimeField,checkTimeValue);
-    map.put(checkActionField,actionFieldValue);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,recID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(recID, newStatus, "Note completion");
-  }
-
-  /** Either mark a record as hopcountremoved, or set status to "rescan", depending on the
-  * record's state.
-  */
-  public boolean updateOrHopcountRemoveRecord(Long recID, int currentStatus)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    
-    int newStatus;
-    String actionFieldValue;
-    Long checkTimeValue;
-    
-    boolean rval;
-    
-    switch (currentStatus)
-    {
-    case STATUS_ACTIVE:
-    case STATUS_ACTIVEPURGATORY:
-      // Mark as hopcountremove (and remove its priority too)
-      newStatus = STATUS_HOPCOUNTREMOVED;
-      map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-      map.put(needPriorityProcessIDField,null);
-      map.put(docPriorityField,nullDocPriority);
-      actionFieldValue = actionToString(ACTION_RESCAN);
-      checkTimeValue = new Long(0L);
-      rval = true;
-      break;
-    case STATUS_ACTIVENEEDRESCAN:
-    case STATUS_ACTIVENEEDRESCANPURGATORY:
-      newStatus = STATUS_PENDINGPURGATORY;
-      actionFieldValue = actionToString(ACTION_RESCAN);
-      checkTimeValue = new Long(0L);
-      rval = false;
-      // Leave doc priority unchanged.
-      break;
-    default:
-      TrackerClass.printForensics(recID, currentStatus);
-      throw new ManifoldCFException("Unexpected jobqueue status - record id "+recID.toString()+", expecting active status, saw "+Integer.toString(currentStatus));
-    }
-
-    map.put(statusField,statusToString(newStatus));
-    map.put(processIDField,null);
-    map.put(checkTimeField,checkTimeValue);
-    map.put(checkActionField,actionFieldValue);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,recID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(recID, newStatus, "Update or hopcount remove");
-    return rval;
-  }
-
-  /** Set the status to active on a record, leaving alone priority or check time.
-  *@param id is the job queue id.
-  *@param currentStatus is the current status
-  */
-  public void updateActiveRecord(Long id, int currentStatus, String processID)
-    throws ManifoldCFException
-  {
-    int newStatus;
-    switch (currentStatus)
-    {
-    case STATUS_PENDING:
-      newStatus = STATUS_ACTIVE;
-      break;
-    case STATUS_PENDINGPURGATORY:
-      newStatus = STATUS_ACTIVEPURGATORY;
-      break;
-    default:
-      TrackerClass.printForensics(id, currentStatus);
-      throw new ManifoldCFException("Unexpected status value for jobqueue record "+id.toString()+"; got "+Integer.toString(currentStatus));
-    }
-
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    map.put(processIDField,processID);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,id)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(id, newStatus, "Make active");
-  }
-
-  /** Set the status on a record, including check time and priority.
-  *@param id is the job queue id.
-  *@param checkTime is the check time.
-  */
-  public void setRequeuedStatus(Long id,
-    Long checkTime, int action, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-    map.put(processIDField,null);
-    map.put(checkTimeField,checkTime);
-    map.put(checkActionField,actionToString(action));
-    if (failTime == -1L)
-      map.put(failTimeField,null);
-    else
-      map.put(failTimeField,new Long(failTime));
-    if (failCount == -1)
-      map.put(failCountField,null);
-    else
-      map.put(failCountField,new Long(failCount));
-    // This does not need to set docPriorityField, because we want to preserve whatever
-    // priority was in place from before.
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,id)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(id, STATUS_PENDINGPURGATORY, "Set requeued status");
-  }
-
-  /** Set the status of a document to "being deleted".
-  */
-  public void setDeletingStatus(Long id, String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_BEINGDELETED));
-    map.put(processIDField,processID);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,id)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(id, STATUS_BEINGDELETED, "Set deleting status");
-  }
-
-  /** Set the status of a document to be "no longer deleting" */
-  public void setUndeletingStatus(Long id, long checkTime)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_ELIGIBLEFORDELETE));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(checkTime));
-    map.put(checkActionField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,id)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(id, STATUS_ELIGIBLEFORDELETE, "Set undeleting status");
-  }
-
-  /** Set the status of a document to "being cleaned".
-  */
-  public void setCleaningStatus(Long id, String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_BEINGCLEANED));
-    map.put(processIDField,processID);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,id)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(id, STATUS_BEINGCLEANED, "Set cleaning status");
-  }
-
-  /** Set the status of a document to be "no longer cleaning" */
-  public void setUncleaningStatus(Long id, long checkTime)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_PURGATORY));
-    map.put(processIDField,null);
-    map.put(checkTimeField,new Long(checkTime));
-    map.put(checkActionField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,id)});
-    performUpdate(map,"WHERE "+query,list,null);
-    noteModifications(0,1,0);
-    TrackerClass.noteRecordChange(id, STATUS_PURGATORY, "Set uncleaning status");
-  }
-
-  /** Remove multiple records entirely.
-  *@param ids is the set of job queue id's
-  */
-  public void deleteRecordMultiple(Long[] ids)
-    throws ManifoldCFException
-  {
-    // Delete in chunks
-    int maxClause = maxClauseDoDeletes();
-    ArrayList list = new ArrayList();
-    int j = 0;
-    int i = 0;
-    while (i < ids.length)
-    {
-      if (j == maxClause)
-      {
-        doDeletes(list);
-        list.clear();
-        j = 0;
-      }
-      list.add(ids[i++]);
-      j++;
-    }
-    if (j > 0)
-      doDeletes(list);
-    noteModifications(0,0,ids.length);
-  }
-
-  /** Calculate the number of deletes we can do at once.
-  */
-  protected int maxClauseDoDeletes()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Do a batch of deletes.
-  */
-  protected void doDeletes(ArrayList list)
-    throws ManifoldCFException
-  {
-    // Clean out prereqevents table first
-    prereqEventManager.deleteRows(list);
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(idField,list)});
-    performDelete("WHERE "+query,newList,null);
-  }
-
-  /** Remove a record entirely.
-  *@param id is the job queue id.
-  */
-  public void deleteRecord(Long id)
-    throws ManifoldCFException
-  {
-    deleteRecordMultiple(new Long[]{id});
-  }
-
-  /** Update an existing record (as the result of an initial add).
-  * The record is presumed to exist and have been locked, via "FOR UPDATE".
-  */
-  public void updateExistingRecordInitial(Long recordID, int currentStatus, Long checkTimeValue,
-    long desiredExecuteTime, IPriorityCalculator desiredPriority, String[] prereqEvents,
-    String processID)
-    throws ManifoldCFException
-  {
-    // The general rule here is:
-    // If doesn't exist, make a PENDING entry.
-    // If PENDING, keep it as PENDING.  
-    // If COMPLETE, make a PENDING entry.
-    // If PURGATORY, make a PENDINGPURGATORY entry.
-    // Leave everything else alone and do nothing.
-
-    HashMap map = new HashMap();
-    switch (currentStatus)
-    {
-    case STATUS_ACTIVE:
-    case STATUS_ACTIVEPURGATORY:
-    case STATUS_ACTIVENEEDRESCAN:
-    case STATUS_ACTIVENEEDRESCANPURGATORY:
-    case STATUS_BEINGCLEANED:
-      // These are all the active states.  Being in this state implies that a thread may be working on the document.  We
-      // must not interrupt it.
-      // Initial adds never bring along any carrydown info, so we should be satisfied as long as the record exists.
-      break;
-
-    case STATUS_COMPLETE:
-    case STATUS_UNCHANGED:
-    case STATUS_PURGATORY:
-      // Set the status and time both
-      map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-      TrackerClass.noteRecordChange(recordID, STATUS_PENDINGPURGATORY, "Update existing record initial");
-      if (desiredExecuteTime == -1L)
-        map.put(checkTimeField,new Long(0L));
-      else
-        map.put(checkTimeField,new Long(desiredExecuteTime));
-      map.put(checkActionField,actionToString(ACTION_RESCAN));
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-      // Update the doc priority.
-      map.put(docPriorityField,new Double(desiredPriority.getDocumentPriority()));
-      map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-      break;
-
-    case STATUS_PENDING:
-      // Bump up the schedule if called for
-      Long cv = checkTimeValue;
-      if (cv != null)
-      {
-        long currentExecuteTime = cv.longValue();
-        if ((desiredExecuteTime == -1L ||currentExecuteTime <= desiredExecuteTime))
-        {
-          break;
-        }
-      }
-      else
-      {
-        if (desiredExecuteTime == -1L)
-        {
-          break;
-        }
-      }
-      map.put(checkTimeField,new Long(desiredExecuteTime));
-      map.put(checkActionField,actionToString(ACTION_RESCAN));
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-      // The existing doc priority field should be preserved.
-      break;
-
-    case STATUS_PENDINGPURGATORY:
-      // In this case we presume that the reason we are in this state is due to adaptive crawling or retry, so DON'T bump up the schedule!
-      // The existing doc priority field should also be preserved.
-      break;
-
-    default:
-      break;
-
-    }
-    map.put(isSeedField,seedstatusToString(SEEDSTATUS_NEWSEED));
-    map.put(seedingProcessIDField,processID);
-    // Delete any existing prereqevent entries first
-    prereqEventManager.deleteRows(recordID);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,recordID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    // Insert prereqevent entries, if any
-    prereqEventManager.addRows(recordID,prereqEvents);
-    noteModifications(0,1,0);
-  }
-
-  /** Insert a new record into the jobqueue table (as part of adding an initial reference).
-  *
-  *@param jobID is the job identifier.
-  *@param docHash is the hash of the local document identifier.
-  *@param docID is the local document identifier.
-  */
-  public void insertNewRecordInitial(Long jobID, String docHash, String docID, IPriorityCalculator desiredDocPriority,
-    long desiredExecuteTime, String[] prereqEvents, String processID)
-    throws ManifoldCFException
-  {
-    // No prerequisites should be possible at this point.
-    HashMap map = new HashMap();
-    Long recordID = new Long(IDFactory.make(threadContext));
-    map.put(idField,recordID);
-    if (desiredExecuteTime == -1L)
-      map.put(checkTimeField,new Long(0L));
-    else
-      map.put(checkTimeField,new Long(desiredExecuteTime));
-    map.put(checkActionField,actionToString(ACTION_RESCAN));
-    map.put(jobIDField,jobID);
-    map.put(docHashField,docHash);
-    map.put(docIDField,docID);
-    map.put(statusField,statusToString(STATUS_PENDING));
-    map.put(isSeedField,seedstatusToString(SEEDSTATUS_NEWSEED));
-    map.put(seedingProcessIDField,processID);
-    // Set the document priority
-    map.put(docPriorityField,new Double(desiredDocPriority.getDocumentPriority()));
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-    performInsert(map,null);
-    prereqEventManager.addRows(recordID,prereqEvents);
-    noteModifications(1,0,0);
-    TrackerClass.noteRecordChange(recordID, STATUS_PENDING, "Create initial");
-  }
-
-  /** Note the remaining documents that do NOT need to be queued.  These are noted so that the
-  * doneDocumentsInitial() method does not clean up seeds from previous runs wrongly.
-  */
-  public void addRemainingDocumentsInitial(Long jobID, String[] docIDHashes, String processID)
-    throws ManifoldCFException
-  {
-    if (docIDHashes.length == 0)
-      return;
-
-    // Basically, all we want to do is move the documents whose status is still SEED
-    // to become NEWSEED.
-
-    HashMap inSet = new HashMap();
-    int j = 0;
-    while (j < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[j++];
-      inSet.put(docIDHash,docIDHash);
-    }
-
-    HashMap idMap = new HashMap();
-    int k = 0;
-
-    // To avoid deadlock, use 1 instead of something larger.  The docIDs are presumed to come in in sorted order.
-    int maxClause = 1;
-
-    ArrayList list = new ArrayList();
-    j = 0;
-    while (j < docIDHashes.length)
-    {
-      String docIDHash = docIDHashes[j++];
-
-      if (k == maxClause)
-      {
-        processRemainingDocuments(idMap,jobID,list,inSet);
-        k = 0;
-        list.clear();
-      }
-
-      list.add(docIDHash);
-      k++;
-    }
-    if (k > 0)
-      processRemainingDocuments(idMap,jobID,list,inSet);
-
-    // We have a set of id's.  Process those in bulk.
-    k = 0;
-    list.clear();
-    maxClause = maxClauseUpdateRemainingDocuments();
-    Iterator idValues = idMap.keySet().iterator();
-    while (idValues.hasNext())
-    {
-      if (k == maxClause)
-      {
-        updateRemainingDocuments(list,processID);
-        k = 0;
-        list.clear();
-      }
-      list.add(idValues.next());
-      k++;
-    }
-    if (k > 0)
-      updateRemainingDocuments(list,processID);
-    noteModifications(0,docIDHashes.length,0);
-  }
-
-  /** Calculate max */
-  protected int maxClauseProcessRemainingDocuments(Long jobID)
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{
-      new UnitaryClause(jobIDField,jobID)});
-  }
-  
-  /** Process the specified set of documents. */
-  protected void processRemainingDocuments(Map idMap, Long jobID, ArrayList list, Map inSet)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(docHashField,list),
-      new UnitaryClause(jobIDField,jobID)});
-    newList.add(seedstatusToString(SEEDSTATUS_SEED));
-    IResultSet set = performQuery("SELECT "+idField+","+docHashField+" FROM "+getTableName()+
-      " WHERE "+query+" AND "+isSeedField+"=? FOR UPDATE",newList,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String docIDHash = (String)row.getValue(docHashField);
-      if (inSet.get(docIDHash) != null)
-      {
-        Long idValue = (Long)row.getValue(idField);
-        idMap.put(idValue,idValue);
-      }
-    }
-  }
-
-  /** Get the maximum count */
-  protected int maxClauseUpdateRemainingDocuments()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-  
-  /** Update the specified set of documents to be "NEWSEED" */
-  protected void updateRemainingDocuments(ArrayList list, String processID)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(isSeedField,seedstatusToString(SEEDSTATUS_NEWSEED));
-    map.put(seedingProcessIDField,processID);
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(idField,list)});
-    performUpdate(map,"WHERE "+query,newList,null);
-  }
-
-  /** Complete the initial set of documents.  This method converts the seeding statuses for the
-  * job to their steady-state values.
-  * SEEDSTATUS_SEED becomes SEEDSTATUS_NOTSEED, and SEEDSTATUS_NEWSEED becomes
-  * SEEDSTATUS_SEED.  If the seeding was partial, then all previous seeds are preserved as such.
-  *@param jobID is the job identifier.
-  *@param isPartial is true of the passed list of seeds is not complete.
-  */
-  public void doneDocumentsInitial(Long jobID, boolean isPartial)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query;
-    HashMap map = new HashMap();
-    if (!isPartial)
-    {
-      query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(isSeedField,seedstatusToString(SEEDSTATUS_SEED)),
-        new UnitaryClause(jobIDField,jobID)});
-      map.put(isSeedField,seedstatusToString(SEEDSTATUS_NOTSEED));
-      performUpdate(map,"WHERE "+query,list,null);
-      list.clear();
-    }
-    query =  buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(isSeedField,seedstatusToString(SEEDSTATUS_SEED)),
-      new UnitaryClause(jobIDField,jobID)});
-    map.put(isSeedField,seedstatusToString(SEEDSTATUS_SEED));
-    map.put(seedingProcessIDField,null);
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Get all the current seeds.
-  * Returns the seed document identifiers for a job.
-  *@param jobID is the job identifier.
-  *@return the document identifier hashes that are currently considered to be seeds.
-  */
-  public String[] getAllSeeds(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(isSeedField,seedstatusToString(SEEDSTATUS_SEED)),
-      new UnitaryClause(jobIDField,jobID)});
-    IResultSet set = performQuery("SELECT "+docHashField+" FROM "+getTableName()+" WHERE "+query,
-      list,null,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i++] = (String)row.getValue(docHashField);
-    }
-    return rval;
-  }
-
-  /** Update an existing record (as the result of a reference add).
-  * The record is presumed to exist and have been locked, via "FOR UPDATE".
-  */
-  public void updateExistingRecord(Long recordID, int currentStatus, Long checkTimeValue,
-    long desiredExecuteTime, boolean otherChangesSeen,
-    IPriorityCalculator desiredPriority, String[] prereqEvents)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    switch (currentStatus)
-    {
-    case STATUS_PURGATORY:
-    case STATUS_UNCHANGED:
-      // Set the status and time both
-      map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-      TrackerClass.noteRecordChange(recordID, STATUS_PENDINGPURGATORY, "Update existing");
-      map.put(checkTimeField,new Long(desiredExecuteTime));
-      map.put(checkActionField,actionToString(ACTION_RESCAN));
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-      // Going into pending: set the docpriority.
-      map.put(docPriorityField,new Double(desiredPriority.getDocumentPriority()));
-      map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-      break;
-    case STATUS_COMPLETE:
-    case STATUS_BEINGCLEANED:
-      // Requeue the document for processing, if there have been other changes.
-      if (otherChangesSeen)
-      {
-        // The document has been processed before, so it has to go into PENDINGPURGATORY.
-        // Set the status and time both
-        map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
-        TrackerClass.noteRecordChange(recordID, STATUS_PENDINGPURGATORY, "Update existing");
-        map.put(checkTimeField,new Long(desiredExecuteTime));
-        map.put(checkActionField,actionToString(ACTION_RESCAN));
-        map.put(failTimeField,null);
-        map.put(failCountField,null);
-        // Going into pending: set the docpriority.
-        map.put(docPriorityField,new Double(desiredPriority.getDocumentPriority()));
-        map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-        break;
-      }
-      return;
-    case STATUS_ACTIVENEEDRESCAN:
-    case STATUS_ACTIVENEEDRESCANPURGATORY:
-      // Document is in the queue, but already needs a rescan for prior reasons.
-      // We're done.
-      return;
-    case STATUS_ACTIVE:
-      // Document is in the queue.
-      // The problem here is that we have no idea when the document is actually being worked on; we only find out when the document is actually *done*.
-      // Any update to the carrydown information may therefore be too late for the current processing cycle.
-      // Given that being the case, the "proper" thing to do is to requeue the document when the processing is completed, so that we can guarantee
-      // reprocessing will take place.
-      // Additional document states must therefore be added to represent the situation:
-      // (ACTIVE or ACTIVEPURGATORY equivalent, but where document is requeued upon completion, rather than put into "COMPLETED".
-      if (otherChangesSeen)
-      {
-        // Flip the state to the new one, and set the document priority at this time too - it will be preserved when the
-        // processing is completed.
-        map.put(statusField,statusToString(STATUS_ACTIVENEEDRESCAN));
-        TrackerClass.noteRecordChange(recordID, STATUS_ACTIVENEEDRESCAN, "Update existing");
-        map.put(checkTimeField,new Long(desiredExecuteTime));
-        map.put(checkActionField,actionToString(ACTION_RESCAN));
-        map.put(failTimeField,null);
-        map.put(failCountField,null);
-        // Going into pending: set the docpriority.
-        map.put(docPriorityField,new Double(desiredPriority.getDocumentPriority()));
-        map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-        break;
-      }
-      return;
-    case STATUS_ACTIVEPURGATORY:
-      // Document is in the queue.
-      // The problem here is that we have no idea when the document is actually being worked on; we only find out when the document is actually *done*.
-      // Any update to the carrydown information may therefore be too late for the current processing cycle.
-      // Given that being the case, the "proper" thing to do is to requeue the document when the processing is completed, so that we can guarantee
-      // reprocessing will take place.
-      // Additional document states must therefore be added to represent the situation:
-      // (ACTIVE or ACTIVEPURGATORY equivalent, but where document is requeued upon completion, rather than put into "COMPLETED".
-      if (otherChangesSeen)
-      {
-        // Flip the state to the new one, and set the document priority at this time too - it will be preserved when the
-        // processing is completed.
-        map.put(statusField,statusToString(STATUS_ACTIVENEEDRESCANPURGATORY));
-        TrackerClass.noteRecordChange(recordID, STATUS_ACTIVENEEDRESCANPURGATORY, "Update existing");
-        map.put(checkTimeField,new Long(desiredExecuteTime));
-        map.put(checkActionField,actionToString(ACTION_RESCAN));
-        map.put(failTimeField,null);
-        map.put(failCountField,null);
-        // Going into pending: set the docpriority.
-        map.put(docPriorityField,new Double(desiredPriority.getDocumentPriority()));
-        map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-        break;
-      }
-      return;
-    case STATUS_PENDING:
-      // Document is already waiting to be processed.
-      // Bump up the schedule, if called for.  Otherwise, just leave it alone.
-      Long cv = checkTimeValue;
-      if (cv != null)
-      {
-        long currentExecuteTime = cv.longValue();
-        if (currentExecuteTime <= desiredExecuteTime)
-          return;
-      }
-      map.put(checkTimeField,new Long(desiredExecuteTime));
-      map.put(checkActionField,actionToString(ACTION_RESCAN));
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-      // Leave doc priority alone
-      break;
-    case STATUS_PENDINGPURGATORY:
-      // This is just like PENDING except we know that the document was processed at least once before.
-      // In this case we presume that the schedule was already set for adaptive or retry reasons, so DON'T change the schedule or activity
-      // Also, leave doc priority alone
-      // Fall through...
-    default:
-      return;
-    }
-    prereqEventManager.deleteRows(recordID);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,recordID)});
-    performUpdate(map,"WHERE "+query,list,null);
-    prereqEventManager.addRows(recordID,prereqEvents);
-    noteModifications(0,1,0);
-    return;
-  }
-
-  /** Insert a new record into the jobqueue table (as part of adding a child reference).
-  *
-  */
-  public void insertNewRecord(Long jobID, String docIDHash, String docID, IPriorityCalculator desiredDocPriority, long desiredExecuteTime,
-    String[] prereqEvents)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    Long recordID = new Long(IDFactory.make(threadContext));
-    map.put(idField,recordID);
-    map.put(checkTimeField,new Long(desiredExecuteTime));
-    map.put(checkActionField,actionToString(ACTION_RESCAN));
-    map.put(jobIDField,jobID);
-    map.put(docHashField,docIDHash);
-    map.put(docIDField,docID);
-    map.put(statusField,statusToString(STATUS_PENDING));
-    // Be sure to set the priority also
-    map.put(docPriorityField,new Double(desiredDocPriority.getDocumentPriority()));
-    map.put(needPriorityField,needPriorityToString(NEEDPRIORITY_FALSE));
-    performInsert(map,null);
-    prereqEventManager.addRows(recordID,prereqEvents);
-    noteModifications(1,0,0);
-    TrackerClass.noteRecordChange(recordID, STATUS_PENDING, "Create new");
-
-  }
-
-  // Methods to convert status strings to integers and back
-
-  /** Convert seedstatus value to a string.
-  */
-  public static String seedstatusToString(int status)
-    throws ManifoldCFException
-  {
-    switch (status)
-    {
-    case SEEDSTATUS_NOTSEED:
-      return "F";
-    case SEEDSTATUS_SEED:
-      return "S";
-    case SEEDSTATUS_NEWSEED:
-      return "N";
-    default:
-      throw new ManifoldCFException("Invalid seed status: "+Integer.toString(status));
-    }
-  }
-
-  /** Convert seedstatus field value to a boolean.
-  */
-  public static int stringToSeedstatus(String x)
-    throws ManifoldCFException
-  {
-    if (x == null || x.length() == 0)
-      return SEEDSTATUS_NOTSEED;
-    Integer y = seedstatusMap.get(x);
-    if (y == null)
-      throw new ManifoldCFException("Unknown seed status code: "+x);
-    return y.intValue();
-  }
-
-  /** Convert action field value to integer.
-  */
-  public static int stringToAction(String value)
-    throws ManifoldCFException
-  {
-    Integer x = actionMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Unknown action string: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Convert integer to action string */
-  public static String actionToString(int action)
-    throws ManifoldCFException
-  {
-    switch (action)
-    {
-    case ACTION_RESCAN:
-      return "R";
-    case ACTION_REMOVE:
-      return "D";
-    default:
-      throw new ManifoldCFException("Bad action value: "+Integer.toString(action));
-    }
-  }
-
-  /** Convert need priority value to boolean.
-  */
-  public static int stringToNeedPriority(String value)
-    throws ManifoldCFException
-  {
-    if (value == null || value.length() == 0)
-      return NEEDPRIORITY_FALSE;
-    Integer x = needPriorityMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Unknown needpriority string: '"+value+"'");
-    return x.intValue();
-  }
-  
-  /** Convert boolean to need priority value.
-  */
-  public static String needPriorityToString(int value)
-    throws ManifoldCFException
-  {
-    switch (value)
-    {
-    case NEEDPRIORITY_TRUE:
-      return "T";
-    case NEEDPRIORITY_FALSE:
-      return "F";
-    case NEEDPRIORITY_INPROGRESS:
-      return "I";
-    default:
-      throw new ManifoldCFException("Bad needpriority value: "+Integer.toString(value));
-    }
-  }
-  
-  /** Convert status field value to integer.
-  *@param value is the string.
-  *@return the integer.
-  */
-  public static int stringToStatus(String value)
-    throws ManifoldCFException
-  {
-    Integer x = statusMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Unknown status string: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Convert status to string.
-  *@param status is the status value.
-  *@return the database string.
-  */
-  public static String statusToString(int status)
-    throws ManifoldCFException
-  {
-    switch (status)
-    {
-    case STATUS_PENDING:
-      return "P";
-    case STATUS_ACTIVE:
-      return "A";
-    case STATUS_COMPLETE:
-      return "C";
-    case STATUS_UNCHANGED:
-      return "U";
-    case STATUS_PENDINGPURGATORY:
-      return "G";
-    case STATUS_ACTIVEPURGATORY:
-      return "F";
-    case STATUS_PURGATORY:
-      return "Z";
-    case STATUS_ELIGIBLEFORDELETE:
-      return "E";
-    case STATUS_BEINGDELETED:
-      return "D";
-    case STATUS_ACTIVENEEDRESCAN:
-      return "a";
-    case STATUS_ACTIVENEEDRESCANPURGATORY:
-      return "f";
-    case STATUS_BEINGCLEANED:
-      return "d";
-    case STATUS_HOPCOUNTREMOVED:
-      return "H";
-    default:
-      throw new ManifoldCFException("Bad status value: "+Integer.toString(status));
-    }
-
-  }
-
-  /** Get a hash value from a document id string.  This will convert the string into something that can fit in 20 characters.
-  * (Someday this will be an MD5 hash, but for now just use java hashing.)
-  *@param documentIdentifier is the input document id string.
-  *@return the hash code.
-  */
-  public static String getHashCode(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    return ManifoldCF.hash(documentIdentifier);
-  }
-
-  // This class filters an ordered resultset to return only the duplicates
-  protected static class DuplicateFinder implements ILimitChecker
-  {
-    protected Long prevJobID = null;
-    protected String prevDocIDHash = null;
-
-    public DuplicateFinder()
-    {
-    }
-
-    /** See if this class can be legitimately compared against another of
-    * the same type.
-    *@return true if comparisons will ever return "true".
-    */
-    public boolean doesCompareWork()
-    {
-      return false;
-    }
-
-    /** Create a duplicate of this class instance.  All current state should be preserved.
-    * NOTE: Since doesCompareWork() returns false, queries using this limit checker cannot
-    * be cached, and therefore duplicate() is never called from the query executor.
-    *@return the duplicate.
-    */
-    public ILimitChecker duplicate()
-    {
-      DuplicateFinder df = new DuplicateFinder();
-      df.prevJobID = prevJobID;
-      df.prevDocIDHash = prevDocIDHash;
-      return df;
-    }
-
-    /** Find the hashcode for this class.  This will only ever be used if
-    * doesCompareWork() returns true.
-    *@return the hashcode.
-    */
-    public int hashCode()
-    {
-      return 0;
-    }
-
-    /** Compare two objects and see if equal.  This will only ever be used
-    * if doesCompareWork() returns true.
-    *@param object is the object to compare against.
-    *@return true if equal.
-    */
-    public boolean equals(Object object)
-    {
-      return false;
-    }
-
-    /** See if a result row should be included in the final result set.
-    *@param row is the result row to check.
-    *@return true if it should be included, false otherwise.
-    */
-    public boolean checkInclude(IResultRow row)
-      throws ManifoldCFException
-    {
-      Long jobID = (Long)row.getValue(jobIDField);
-      String docIDHash = (String)row.getValue(docHashField);
-      // If this is a duplicate, we want to keep it!
-      if (prevJobID != null && jobID.equals(prevJobID) && docIDHash.equals(prevDocIDHash))
-        return true;
-      prevJobID = jobID;
-      prevDocIDHash = docIDHash;
-      return false;
-    }
-
-    /** See if we should examine another row.
-    *@return true if we need to keep going, or false if we are done.
-    */
-    public boolean checkContinue()
-      throws ManifoldCFException
-    {
-      return true;
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/Jobs.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/Jobs.java
deleted file mode 100644
index 9792644..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/Jobs.java
+++ /dev/null
@@ -1,3767 +0,0 @@
-/* $Id: Jobs.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import java.util.*;
-
-/** This class manages the jobs table.
- * 
- * <br><br>
- * <b>jobs</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>id</td><td>BIGINT</td><td>Primary Key</td></tr>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>status</td><td>CHAR(1)</td><td>operational field</td></tr>
- * <tr><td>lasttime</td><td>BIGINT</td><td>operational field</td></tr>
- * <tr><td>starttime</td><td>BIGINT</td><td>operational field</td></tr>
- * <tr><td>lastchecktime</td><td>BIGINT</td><td>operational field</td></tr>
- * <tr><td>seedingversion</td><td>LONGTEXT</td><td>operational field</td></tr>
- * <tr><td>endtime</td><td>BIGINT</td><td>operational field</td></tr>
- * <tr><td>docspec</td><td>LONGTEXT</td><td></td></tr>
- * <tr><td>connectionname</td><td>VARCHAR(32)</td><td>Reference:repoconnections.connectionname</td></tr>
- * <tr><td>type</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>intervaltime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>maxintervaltime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>expirationtime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>windowend</td><td>BIGINT</td><td></td></tr>
- * <tr><td>priority</td><td>BIGINT</td><td></td></tr>
- * <tr><td>startmethod</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>errortext</td><td>LONGTEXT</td><td></td></tr>
- * <tr><td>reseedinterval</td><td>BIGINT</td><td></td></tr>
- * <tr><td>reseedtime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>hopcountmode</td><td>CHAR(1)</td><td></td></tr>
- * <tr><td>processid</td><td>VARCHAR(16)</td><td></td></tr>
- * <tr><td>failtime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>failcount</td><td>BIGINT</td><td></td></tr>
- * <tr><td>assessmentstate</td><td>CHAR(1)</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class Jobs extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: Jobs.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  // Status field values
-  //
-  // There are some themes in this state diagram.  For instance, for all active states there's a corresponding "active seeding" state, which
-  // indicates that automatic seeding is taking place at that time.  Also, the "pause a job" sequence goes from "pausing" to "paused",  while
-  // "resuming a job" goes from "resuming" to "active".  This is complicated by the fact that entering the "activewait" state is very similar
-  // to entering the "paused" state, in that the job must go first to the "active waiting" state and then to the "active wait" state, but it
-  // is completely orthogonal to the "paused" state, because one is triggered automatically and the other by human control.  Similarly,
-  // resuming from an "active wait" state must transition through another state to return to the "active" state.
-  // 
-  // However, it is only certain transitions that require special states.  For example, leaving a waited/paused state and returning to "active"
-  // does something, as does entering either active wait or paused.  Also transitions between these states do NOT require intermediates.
-  // The state diagram reflects that.  But it also has to reflect that during the "pausing" stage, "activewait" may occur, and visa versa.
-  public static final int STATUS_INACTIVE = 0;                            // Not running
-  public static final int STATUS_ACTIVE = 1;                              // Active, within a valid window
-  public static final int STATUS_ACTIVESEEDING = 2;               // Same as active, but seeding process is currently active also.
-  public static final int STATUS_ACTIVEWAITING = 3;                 // In the process of waiting due to window expiration; will enter STATUS_ACTIVEWAIT when done.
-  public static final int STATUS_ACTIVEWAITINGSEEDING = 4;    // In the process of waiting due to window exp, also seeding; will enter STATUS_ACTIVEWAITSEEDING when done.
-  public static final int STATUS_ACTIVEWAIT = 5;                     // Active, but paused due to window expiration
-  public static final int STATUS_ACTIVEWAITSEEDING = 6;        // Same as active wait, but seeding process is currently active also.
-  public static final int STATUS_PAUSING = 7;                            // In the process of pausing a job; will enter STATUS_PAUSED when done.
-  public static final int STATUS_PAUSINGSEEDING = 8;                 // In the process of pausing a job, but seeding also; will enter STATUS_PAUSEDSEEDING when done.
-  public static final int STATUS_PAUSINGWAITING = 9;                // In the process of pausing a job; will enter STATUS_PAUSEDWAIT when done.
-  public static final int STATUS_PAUSINGWAITINGSEEDING = 10;        // In the process of pausing a job, but seeding also; will enter STATUS_PAUSEDWAITSEEDING when done.
-  public static final int STATUS_PAUSED = 11;                             // Paused, but within a valid window
-  public static final int STATUS_PAUSEDSEEDING = 12;              // Same as paused, but seeding process is currently active also.
-  public static final int STATUS_PAUSEDWAIT = 13;                        // Paused, and outside of window expiration
-  public static final int STATUS_PAUSEDWAITSEEDING = 14;        // Same as paused wait, but seeding process is currently active also.
-  public static final int STATUS_SHUTTINGDOWN = 15;                  // Done, except for process cleanup
-  public static final int STATUS_RESUMING = 16;                          // In the process of resuming a paused or waited job; will enter STATUS_ACTIVE when done
-  public static final int STATUS_RESUMINGSEEDING = 17;               // In the process of resuming a paused or waited job, seeding process active too; will enter STATUS_ACTIVESEEDING when done.
-  public static final int STATUS_ABORTING = 18;                          // Aborting (not yet aborted because documents still being processed)
-  public static final int STATUS_STARTINGUP = 19;                        // Loading the queue (will go into ACTIVE if successful, or INACTIVE if not)
-  public static final int STATUS_STARTINGUPMINIMAL = 20;           // Loading the queue for minimal job run (will go into ACTIVE if successful, or INACTIVE if not)
-  public static final int STATUS_READYFORSTARTUP = 23;             // Job is marked for minimal startup; startup thread has not taken it yet.
-  public static final int STATUS_READYFORSTARTUPMINIMAL = 24;   // Job is marked for startup; startup thread has not taken it yet.
-  public static final int STATUS_READYFORDELETE = 25;             // Job is marked for delete; delete thread has not taken it yet.
-  public static final int STATUS_ABORTINGFORRESTART = 27;       // Same as aborting, except after abort is complete startup will happen.
-  public static final int STATUS_ABORTINGFORRESTARTMINIMAL = 28;  // Same as aborting, except after abort is complete startup will happen.
-  public static final int STATUS_ABORTINGFORRESTARTSEEDING = 29;  // Seeding version of aborting for restart
-  public static final int STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL = 30;  // Seeding version of aborting for restart
-  public static final int STATUS_ABORTINGSTARTINGUPFORRESTART = 31; // Starting up version of aborting for restart
-  public static final int STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL = 32; // Starting up version of aborting for restart
-  public static final int STATUS_READYFORNOTIFY = 33;                   // Job is ready to be notified of completion
-  public static final int STATUS_NOTIFYINGOFCOMPLETION = 34;    // Notifying connector of terminating job (either aborted, or finished)
-  public static final int STATUS_DELETING = 35;                         // The job is deleting.
-  public static final int STATUS_DELETESTARTINGUP = 36;         // The delete is starting up.
-  public static final int STATUS_ABORTINGSHUTTINGDOWN = 37;     // Aborting the cleanup phase.
-  public static final int STATUS_READYFORDELETENOTIFY = 38;     // Job is ready for delete notification
-  public static final int STATUS_NOTIFYINGOFDELETION = 39;      // Notifying connector of job deletion
-  
-  // These statuses have to do with whether a job has an installed underlying connector or not.
-  // There are two reasons to have a special state here: (1) if the behavior of the crawler differs, or (2) if the
-  // UI would present something different.
-  //
-  // For the base states, such as for an inactive job, I've chosen not to have an "uninstalled" version of the state, for now.
-  // This is because I believe that feedback will be adequate without such states.
-  // But, since there is no indication in the jobs table of an uninstalled connector for such jobs, the code which starts
-  // jobs up (or otherwise would enter any state that has a corresponding special state) must check to see if the underlying
-  // connector exists before deciding what state to put the job into.
-  public static final int STATUS_ACTIVE_UNINSTALLED = 40;               // Active, but repository connector not installed
-  public static final int STATUS_ACTIVESEEDING_UNINSTALLED = 41;   // Active and seeding, but repository connector not installed
-  public static final int STATUS_DELETING_NOOUTPUT = 42;                // Job is being deleted but there's no output connector installed
-
-  // Deprecated states.  These states should never be used; they're defined only for upgrade purposes
-  public static final int STATUS_ACTIVE_NOOUTPUT = 100;                  // Active, but output connector not installed
-  public static final int STATUS_ACTIVESEEDING_NOOUTPUT = 101;       // Active and seeding, but output connector not installed
-  public static final int STATUS_ACTIVE_NEITHER = 102;                     // Active, but neither repository connector nor output connector installed
-  public static final int STATUS_ACTIVESEEDING_NEITHER = 103;          // Active and seeding, but neither repository connector nor output connector installed
-
-  // Need Connector Assessment states
-  public static final int ASSESSMENT_KNOWN = 0;                         // State is known.
-  public static final int ASSESSMENT_UNKNOWN = 1;                       // State is unknown, and job needs assessment
-  
-  // Type field values
-  public static final int TYPE_CONTINUOUS = IJobDescription.TYPE_CONTINUOUS;
-  public static final int TYPE_SPECIFIED = IJobDescription.TYPE_SPECIFIED;
-
-  // Start method field values
-  public static final int START_WINDOWBEGIN = IJobDescription.START_WINDOWBEGIN;
-  public static final int START_WINDOWINSIDE = IJobDescription.START_WINDOWINSIDE;
-  public static final int START_DISABLE = IJobDescription.START_DISABLE;
-
-  // Hopcount mode values
-  public static final int HOPCOUNT_ACCURATE = IJobDescription.HOPCOUNT_ACCURATE;
-  public static final int HOPCOUNT_NODELETE = IJobDescription.HOPCOUNT_NODELETE;
-  public static final int HOPCOUNT_NEVERDELETE = IJobDescription.HOPCOUNT_NEVERDELETE;
-
-  // Field names
-  public final static String idField = "id";
-  public final static String descriptionField = "description";
-  public final static String documentSpecField = "docspec";
-  public final static String connectionNameField = "connectionname";
-  public final static String typeField = "type";
-  /** This is the minimum reschedule interval for a document being crawled adaptively (in ms.) */
-  public final static String intervalField = "intervaltime";
-  /** This is the maximum reschedule interval for a document being crawled adaptively (in ms.) */
-  public final static String maxIntervalField = "maxintervaltime";
-  /** This is the expiration time of documents for a given job (in ms.) */
-  public final static String expirationField = "expirationtime";
-  /** This is the job's priority vs. other jobs. */
-  public final static String priorityField = "priority";
-  /** How/when to start the job */
-  public final static String startMethodField = "startmethod";
-  /** If this is an adaptive job, what should the reseed interval be (in milliseconds) */
-  public final static String reseedIntervalField = "reseedinterval";
-
-  // These fields are NOT part of the definition, but are operational
-  /** Status of this job. */
-  public final static String statusField = "status";
-  /** The last time this job was assessed, in ms. since epoch. */
-  public final static String lastTimeField = "lasttime";
-  /** If active, paused, activewait, or pausedwait, the start time of the current session, else null. */
-  public final static String startTimeField = "starttime";
-  /** This text data represents the seeding version string, which for many connectors is simply the last time seeding was done */
-  public final static String seedingVersionField = "seedingversion";
-  /** If inactive, the end time of the LAST session, if any. */
-  public final static String endTimeField = "endtime";
-  /** If non-null, this is the time that the current execution window closes, in ms since epoch. */
-  public final static String windowEndField = "windowend";
-  /** If non-null, this is the last error that occurred (which aborted the last task, either running the job or doing the
-  * delete cleanup). */
-  public final static String errorField = "errortext";
-  /** For an adaptive job, this is the next time to reseed the job. */
-  public final static String reseedTimeField = "reseedtime";
-  /** For a job whose connector supports hopcounts, this describes how those hopcounts are handled. */
-  public final static String hopcountModeField = "hopcountmode";
-  /** Process id field, for keeping track of which process owns transient state */
-  public final static String processIDField = "processid";
-  /** When non-null, indicates the time that, when a ServiceInterruption occurs, the attempt will be considered to have actually failed */
-  public static final String failTimeField = "failtime";
-  /** When non-null, indicates the number of retries remaining, after which the attempt will be considered to have actually failed */
-  public static final String failCountField = "failcount";
-  /** Set to N when the job needs connector-installed assessment */
-  public static final String assessmentStateField = "assessmentstate";
-  
-  protected static Map<String,Integer> statusMap;
-  protected static Map<String,Integer> typeMap;
-  protected static Map<String,Integer> startMap;
-  protected static Map<String,Integer> hopmodeMap;
-  protected static Map<String,Integer> assessmentMap;
-  
-  static
-  {
-    statusMap = new HashMap<String,Integer>();
-    statusMap.put("N",new Integer(STATUS_INACTIVE));
-    statusMap.put("A",new Integer(STATUS_ACTIVE));
-    statusMap.put("P",new Integer(STATUS_PAUSED));
-    statusMap.put("S",new Integer(STATUS_SHUTTINGDOWN));
-    statusMap.put("s",new Integer(STATUS_READYFORNOTIFY));
-    statusMap.put("n",new Integer(STATUS_NOTIFYINGOFCOMPLETION));
-    statusMap.put("d",new Integer(STATUS_READYFORDELETENOTIFY));
-    statusMap.put("j",new Integer(STATUS_NOTIFYINGOFDELETION));
-    statusMap.put("W",new Integer(STATUS_ACTIVEWAIT));
-    statusMap.put("Z",new Integer(STATUS_PAUSEDWAIT));
-    statusMap.put("X",new Integer(STATUS_ABORTING));
-    statusMap.put("B",new Integer(STATUS_STARTINGUP));
-    statusMap.put("b",new Integer(STATUS_STARTINGUPMINIMAL));
-    statusMap.put("C",new Integer(STATUS_READYFORSTARTUP));
-    statusMap.put("c",new Integer(STATUS_READYFORSTARTUPMINIMAL));
-    statusMap.put("E",new Integer(STATUS_READYFORDELETE));
-    statusMap.put("V",new Integer(STATUS_DELETESTARTINGUP));
-    statusMap.put("e",new Integer(STATUS_DELETING));
-    statusMap.put("Y",new Integer(STATUS_ABORTINGFORRESTART));
-    statusMap.put("M",new Integer(STATUS_ABORTINGFORRESTARTMINIMAL));
-    statusMap.put("T",new Integer(STATUS_ABORTINGSTARTINGUPFORRESTART));
-    statusMap.put("t",new Integer(STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL));
-
-    statusMap.put("a",new Integer(STATUS_ACTIVESEEDING));
-    statusMap.put("p",new Integer(STATUS_PAUSEDSEEDING));
-    statusMap.put("w",new Integer(STATUS_ACTIVEWAITSEEDING));
-    statusMap.put("z",new Integer(STATUS_PAUSEDWAITSEEDING));
-    statusMap.put("y",new Integer(STATUS_ABORTINGFORRESTARTSEEDING));
-    statusMap.put("m",new Integer(STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL));
-    statusMap.put("v",new Integer(STATUS_ABORTINGSHUTTINGDOWN));
-    
-    statusMap.put("H",new Integer(STATUS_ACTIVEWAITING));
-    statusMap.put("h",new Integer(STATUS_ACTIVEWAITINGSEEDING));
-    statusMap.put("F",new Integer(STATUS_PAUSING));
-    statusMap.put("f",new Integer(STATUS_PAUSINGSEEDING));
-    statusMap.put("G",new Integer(STATUS_PAUSINGWAITING));
-    statusMap.put("g",new Integer(STATUS_PAUSINGWAITINGSEEDING));
-    statusMap.put("I",new Integer(STATUS_RESUMING));
-    statusMap.put("i",new Integer(STATUS_RESUMINGSEEDING));
-
-
-    // These are the uninstalled states.  The values, I'm afraid, are pretty random.
-    statusMap.put("R",new Integer(STATUS_ACTIVE_UNINSTALLED));
-    statusMap.put("r",new Integer(STATUS_ACTIVESEEDING_UNINSTALLED));
-    statusMap.put("D",new Integer(STATUS_DELETING_NOOUTPUT));
-
-    // These are deprecated states; we may be able to reclaim them
-    statusMap.put("O",new Integer(STATUS_ACTIVE_NOOUTPUT));
-    statusMap.put("o",new Integer(STATUS_ACTIVESEEDING_NOOUTPUT));
-    statusMap.put("U",new Integer(STATUS_ACTIVE_NEITHER));
-    statusMap.put("u",new Integer(STATUS_ACTIVESEEDING_NEITHER));
-
-    typeMap = new HashMap<String,Integer>();
-    typeMap.put("C",new Integer(TYPE_CONTINUOUS));
-    typeMap.put("S",new Integer(TYPE_SPECIFIED));
-
-    startMap = new HashMap<String,Integer>();
-    startMap.put("B",new Integer(START_WINDOWBEGIN));
-    startMap.put("I",new Integer(START_WINDOWINSIDE));
-    startMap.put("D",new Integer(START_DISABLE));
-
-    hopmodeMap = new HashMap<String,Integer>();
-    hopmodeMap.put("A",new Integer(HOPCOUNT_ACCURATE));
-    hopmodeMap.put("N",new Integer(HOPCOUNT_NODELETE));
-    hopmodeMap.put("V",new Integer(HOPCOUNT_NEVERDELETE));
-    
-    assessmentMap = new HashMap<String,Integer>();
-    assessmentMap.put("Y",new Integer(ASSESSMENT_KNOWN));
-    assessmentMap.put("N",new Integer(ASSESSMENT_UNKNOWN));
-  }
-
-  /* Transient vs. non-transient states
-  *==================================
-  * There are two kinds of states.  The first kind of state is that which is considered permanent; if the
-  * whole world restarts, the state would not change.  Such states reflect the underlying status of the job.
-  * The second kind of state is that which is clearly transient but is attached to a given process.  So if the
-  * process is killed, the job should leave the transient state and return to a permanent state.  For example,
-  * when a given thread decided to undertake seeding, the job is annotated with the process ID of the thread
-  * that is performing the seeding operation.  These states are called process-transient.
-  *
-  * The permanent states are:
-  * STATUS_INACTIVE
-  * STATUS_ACTIVE
-  * STATUS_ACTIVEWAIT
-  * STATUS_PAUSEDWAIT
-  * STATUS_PAUSED
-  * STATUS_READYFORNOTIFY
-  * STATUS_READYFORDELETENOTIFY
-  * STATUS_READYFORDELETE
-  * STATUS_DELETING
-  * STATUS_READYFORSTARTUP
-  * STATUS_READYFORSTARTUPMINIMAL
-  * STATUS_SHUTTINGDOWN
-  * STATUS_ABORTINGFORRESTART
-  * STATUS_ABORTINGFORRESTARTMINIMAL
-  * STATUS_ACTIVE_UNINSTALLED
-  * STATUS_ACTIVE_NOOUTPUT
-  * STATUS_ACTIVE_NEITHER
-  * STATUS_DELETING_NOOUTPUT
-  * STATUS_ABORTING
-  * STATUS_ACTIVEWAITING
-  * STATUS_PAUSING
-  * STATUS_PAUSINGWAITING
-  * STATUS_RESUMING
-  * STATUS_ABORTINGSHUTTINGDOWN
-  *  
-  * These are the process-transient states:
-  * STATUS_DELETESTARTINGUP
-  * STATUS_NOTIFYINGOFCOMPLETION
-  * STATUS_NOTIFYINGOFDELETION
-  * STATUS_STARTINGUP
-  * STATUS_STARTINGUPMINIMAL
-  * STATUS_ABORTINGSTARTINGUPFORRESTART
-  * STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL
-  * STATUS_ACTIVEWAITINGSEEDING
-  * STATUS_ACTIVEWAITSEEDING
-  * STATUS_ACTIVESEEDING
-  * STATUS_PAUSINGSEEDING
-  * STATUS_PAUSINGWAITINGSEEDING
-  * STATUS_PAUSEDSEEDING
-  * STATUS_PAUSEDWAITSEEDING
-  * STATUS_RESUMINGSEEDING
-  * STATUS_ABORTINGFORRESTARTSEEDING
-  * STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL
-  * STATUS_ACTIVESEEDING_UNINSTALLED
-  * STATUS_ACTIVESEEDING_NOOUTPUT
-  * STATUS_ACTIVESEEDING_NEITHER
-  *
-  *
-  */
-  
-  // Local variables
-  protected final ICacheManager cacheManager;
-  protected final ScheduleManager scheduleManager;
-  protected final HopFilterManager hopFilterManager;
-  protected final PipelineManager pipelineManager;
-  protected final NotificationManager notificationManager;
-  
-  protected final IOutputConnectionManager outputMgr;
-  protected final IRepositoryConnectionManager connectionMgr;
-  protected final ITransformationConnectionManager transMgr;
-  
-  protected final ILockManager lockManager;
-  
-  protected final IThreadContext threadContext;
-  
-  protected final static String jobsLock = "JOBS_LOCK";
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public Jobs(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"jobs");
-    this.threadContext = threadContext;
-    scheduleManager = new ScheduleManager(threadContext,database);
-    hopFilterManager = new HopFilterManager(threadContext,database);
-    pipelineManager = new PipelineManager(threadContext,database);
-    notificationManager = new NotificationManager(threadContext,database);
-    
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    
-    outputMgr = OutputConnectionManagerFactory.make(threadContext);
-    connectionMgr = RepositoryConnectionManagerFactory.make(threadContext);
-    transMgr = TransformationConnectionManagerFactory.make(threadContext);
-  }
-
-  /** Install or upgrade this table.
-  */
-  public void install(String transTableName, String transNameField,
-    String outputTableName, String outputNameField,
-    String connectionTableName, String connectionNameField,
-    String notificationConnectionTableName, String notificationConnectionNameField)
-    throws ManifoldCFException
-  {
-    // Standard practice: Have a loop around everything, in case upgrade needs it.
-    while (true)
-    {
-      // These are fields we want to get rid of.
-      String oldOutputSpecField = "outputspec";
-      String oldOutputNameField = "outputname";
-      String oldLastCheckTimeField = "lastchecktime";
-
-      // A place to keep the outputs we find, so we can add them into the pipeline at the end.
-      IResultSet outputSet = null;
-      
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(idField,new ColumnDescription("BIGINT",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(statusField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(lastTimeField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(startTimeField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(seedingVersionField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(endTimeField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(documentSpecField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(this.connectionNameField,new ColumnDescription("VARCHAR(32)",false,false,connectionTableName,connectionNameField,false));
-        map.put(typeField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(intervalField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(maxIntervalField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(expirationField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(windowEndField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(priorityField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(startMethodField,new ColumnDescription("CHAR(1)",false,false,null,null,false));
-        map.put(errorField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        map.put(reseedIntervalField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(reseedTimeField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(hopcountModeField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        map.put(processIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
-        map.put(failTimeField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(failCountField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(assessmentStateField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Do any needed upgrades
-      }
-
-      // Handle related tables
-      pipelineManager.install(getTableName(),idField,outputTableName,outputNameField,transTableName,transNameField);
-      if (outputSet != null)
-      {
-        // Go through set and add pipeline stages corresponding to outputs
-        for (int k = 0; k < outputSet.getRowCount(); k++)
-        {
-          IResultRow row = outputSet.getRow(k);
-          Long id = (Long)row.getValue(idField);
-          String outputConnectionName = (String)row.getValue(oldOutputNameField);
-          String outputConnectionSpec = (String)row.getValue(oldOutputSpecField);
-          pipelineManager.writeOutputStage(id,outputConnectionName,outputConnectionSpec);
-        }
-      }
-      notificationManager.install(getTableName(),idField,notificationConnectionTableName,notificationConnectionNameField);
-      scheduleManager.install(getTableName(),idField);
-      hopFilterManager.install(getTableName(),idField);
-
-      // Index management
-      IndexDescription statusIndex = new IndexDescription(false,new String[]{statusField,idField,priorityField});
-      IndexDescription statusProcessIndex = new IndexDescription(false,new String[]{statusField,processIDField});
-      IndexDescription connectionIndex = new IndexDescription(false,new String[]{connectionNameField});
-      IndexDescription failTimeIndex = new IndexDescription(false,new String[]{failTimeField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (statusIndex != null && id.equals(statusIndex))
-          statusIndex = null;
-        else if (statusProcessIndex != null && id.equals(statusProcessIndex))
-          statusProcessIndex = null;
-        else if (connectionIndex != null && id.equals(connectionIndex))
-          connectionIndex = null;
-        else if (failTimeIndex != null && id.equals(failTimeIndex))
-          failTimeIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (statusIndex != null)
-        performAddIndex(null,statusIndex);
-      if (statusProcessIndex != null)
-        performAddIndex(null,statusProcessIndex);
-      if (connectionIndex != null)
-        performAddIndex(null,connectionIndex);
-      if (failTimeIndex != null)
-        performAddIndex(null,failTimeIndex);
-
-      break;
-
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      hopFilterManager.deinstall();
-      scheduleManager.deinstall();
-      notificationManager.deinstall();
-      pipelineManager.deinstall();
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Come up with a maximum time (in minutes) for re-analyzing tables.
-  *@return the time, in minutes.
-  */
-  public int getAnalyzeTime()
-    throws ManifoldCFException
-  {
-    // Since we never expect jobs to grow rapidly, every 24hrs should always be fine
-    return 24 * 60;
-  }
-
-  /** Analyze job tables that need analysis.
-  */
-  public void analyzeTables()
-    throws ManifoldCFException
-  {
-    analyzeTable();
-  }
-
-  /** Find a list of jobs matching specified notification names.
-  */
-  public Long[] findJobsMatchingNotifications(List<String> notificationConnectionNames)
-    throws ManifoldCFException
-  {
-    StringBuilder query = new StringBuilder();
-    ArrayList params = new ArrayList();
-    query.append("SELECT ").append(idField)
-      .append(" FROM ").append(getTableName()).append(" t1 WHERE EXISTS(");
-    notificationManager.buildNotificationQueryClause(query,params,"t1."+idField,notificationConnectionNames);
-    query.append(")");
-    IResultSet set = performQuery(query.toString(),params,null,null);
-    Long[] rval = new Long[set.getRowCount()];
-    for (int i = 0; i < rval.length; i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (Long)row.getValue(idField);
-    }
-    return rval;
-  }
-
-  /** Find a list of jobs matching specified transformation names.
-  */
-  public Long[] findJobsMatchingTransformations(List<String> transformationConnectionNames)
-    throws ManifoldCFException
-  {
-    StringBuilder query = new StringBuilder();
-    ArrayList params = new ArrayList();
-    query.append("SELECT ").append(idField)
-      .append(" FROM ").append(getTableName()).append(" t1 WHERE EXISTS(");
-    pipelineManager.buildTransformationQueryClause(query,params,"t1."+idField,transformationConnectionNames);
-    query.append(")");
-    IResultSet set = performQuery(query.toString(),params,null,null);
-    Long[] rval = new Long[set.getRowCount()];
-    for (int i = 0; i < rval.length; i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (Long)row.getValue(idField);
-    }
-    return rval;
-  }
-
-  /** Find a list of jobs matching specified output names.
-  */
-  public Long[] findJobsMatchingOutputs(List<String> outputConnectionNames)
-    throws ManifoldCFException
-  {
-    StringBuilder query = new StringBuilder();
-    ArrayList params = new ArrayList();
-    query.append("SELECT ").append(idField)
-      .append(" FROM ").append(getTableName()).append(" t1 WHERE EXISTS(");
-    pipelineManager.buildOutputQueryClause(query,params,"t1."+idField,outputConnectionNames);
-    query.append(")");
-    IResultSet set = performQuery(query.toString(),params,null,null);
-    Long[] rval = new Long[set.getRowCount()];
-    for (int i = 0; i < rval.length; i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (Long)row.getValue(idField);
-    }
-    return rval;
-  }
-
-  /** Read schedule records for a specified set of jobs.  Cannot use caching!
-  */
-  public ScheduleRecord[][] readScheduleRecords(Long[] jobIDs)
-    throws ManifoldCFException
-  {
-    Map uniqueIDs = new HashMap();
-    int i = 0;
-    while (i < jobIDs.length)
-    {
-      Long jobID = jobIDs[i++];
-      uniqueIDs.put(jobID,jobID);
-    }
-
-    HashMap returnValues = new HashMap();
-    beginTransaction();
-    try
-    {
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = scheduleManager.maxClauseGetRowsAlternate();
-      Iterator iter = uniqueIDs.keySet().iterator();
-      while (iter.hasNext())
-      {
-        if (j == maxIn)
-        {
-          scheduleManager.getRowsAlternate(returnValues,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(iter.next());
-        j++;
-      }
-      if (j > 0)
-        scheduleManager.getRowsAlternate(returnValues,params);
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-    // Fill the return array
-    ScheduleRecord[][] rval = new ScheduleRecord[jobIDs.length][];
-    i = 0;
-    while (i < jobIDs.length)
-    {
-      ArrayList al = (ArrayList)returnValues.get(jobIDs[i]);
-      ScheduleRecord[] srList;
-      if (al == null)
-        srList = new ScheduleRecord[0];
-      else
-      {
-        srList = new ScheduleRecord[al.size()];
-        int k = 0;
-        while (k < srList.length)
-        {
-          srList[k] = (ScheduleRecord)al.get(k);
-          k++;
-        }
-      }
-      rval[i++] = srList;
-    }
-
-    return rval;
-  }
-
-  // Only fetch 200 jobs at a time, for resource reasons
-  protected final int FETCH_MAX = 200;
-
-  /** Get a list of all jobs which are not in the process of being deleted already.
-  *@return the array of all jobs.
-  */
-  public IJobDescription[] getAll()
-    throws ManifoldCFException
-  {
-    // Begin transaction
-    lockManager.enterReadLock(jobsLock);
-    try
-    {
-      // Put together cache key
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getJobsKey());
-      ssb.add(getJobStatusKey());
-      StringSet cacheKeys = new StringSet(ssb);
-
-      ArrayList list = new ArrayList();
-      list.add(statusToString(STATUS_READYFORDELETE));
-      list.add(statusToString(STATUS_DELETESTARTINGUP));
-      list.add(statusToString(STATUS_DELETING));
-      list.add(statusToString(STATUS_DELETING_NOOUTPUT));
-      IResultSet set = performQuery("SELECT "+idField+","+descriptionField+" FROM "+
-        getTableName()+" WHERE "+statusField+"!=? AND "+statusField+"!=? AND "+statusField+"!=? AND "+statusField+"!=?"+
-        " ORDER BY "+descriptionField+" ASC",list,cacheKeys,null);
-      
-      Long[] ids = new Long[set.getRowCount()];
-      boolean[] readOnlies = new boolean[set.getRowCount()];
-      
-      for (int i = 0; i < set.getRowCount(); i++)
-      {
-        IResultRow row = set.getRow(i);
-        ids[i] = (Long)row.getValue(idField);
-        readOnlies[i] = true;
-      }
-      return loadMultiple(ids,readOnlies);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(jobsLock);
-    }
-  }
-
-  /** Get a list of active job identifiers and their associated connection names.
-  *@return a resultset with "jobid" and "connectionname" fields.
-  */
-  public IResultSet getActiveJobConnections()
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVESEEDING)})});
-    return performQuery("SELECT "+idField+" AS jobid,"+connectionNameField+" AS connectionname FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-  }
-
-  /** Get unique connection names for all active jobs.
-  *@return the array of connection names corresponding to active jobs.
-  */
-  public String[] getActiveConnectionNames()
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVESEEDING)})});
-    IResultSet set = performQuery("SELECT DISTINCT "+connectionNameField+" FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(connectionNameField);
-      i++;
-    }
-    return rval;
-  }
-
-  /** Are there any jobs that have a specified priority level */
-  public boolean hasPriorityJobs(int priority)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVESEEDING)})});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+query+" AND "+priorityField+"="+Integer.toString(priority)+
-      " "+constructOffsetLimitClause(0,1),list,null,null,1);
-    return set.getRowCount() > 0;
-  }
-
-  /** Create a job.
-  */
-  public IJobDescription create()
-    throws ManifoldCFException
-  {
-    JobDescription rval = new JobDescription();
-    rval.setIsNew(true);
-    rval.setID(new Long(IDFactory.make(threadContext)));
-    return rval;
-  }
-
-  /** Delete a job.  This is not enough by itself; the queue entries also need to be deleted.
-  *@param id is the job id.
-  */
-  public void delete(Long id)
-    throws ManifoldCFException
-  {
-    lockManager.enterNonExWriteLock(jobsLock);
-    try
-    {
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getJobsKey());
-      ssb.add(getJobStatusKey());
-      ssb.add(getJobIDKey(id));
-      StringSet cacheKeys = new StringSet(ssb);
-      beginTransaction();
-      try
-      {
-        scheduleManager.deleteRows(id);
-        hopFilterManager.deleteRows(id);
-        pipelineManager.deleteRows(id);
-        notificationManager.deleteRows(id);
-        ArrayList params = new ArrayList();
-        String query = buildConjunctionClause(params,new ClauseDescription[]{
-          new UnitaryClause(idField,id)});
-        performDelete("WHERE "+query,params,cacheKeys);
-      }
-      catch (ManifoldCFException e)
-      {
-        signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        signalRollback();
-        throw e;
-      }
-      finally
-      {
-        endTransaction();
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(jobsLock);
-    }
-  }
-
-  /** Load a job for editing.
-  *@param id is the job id.
-  *@return the editable job description.
-  */
-  public IJobDescription load(Long id, boolean readOnly)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new Long[]{id}, new boolean[]{readOnly})[0];
-  }
-
-  /** Load multiple jobs for editing.
-  *@param ids is the set of id's to load
-  *@param readOnlies are boolean values, set to true if the job description to be read is to be designated "read only".
-  *@return the array of objects, in order.
-  */
-  public IJobDescription[] loadMultiple(Long[] ids, boolean[] readOnlies)
-    throws ManifoldCFException
-  {
-    IJobDescription[] rval = new IJobDescription[ids.length];
-    if (ids.length == 0)
-      return rval;
-
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (ids.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,ids,readOnlies,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,ids,readOnlies,inputIndex,ids.length-inputIndex);
-    return rval;
-  }
-
-  protected int loadMultipleInternal(IJobDescription[] rval, int outputIndex, Long[] ids, boolean[] readOnlies, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    JobObjectDescription[] objectDescriptions = new JobObjectDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      Long id = ids[inputIndex + i];
-      ssb.clear();
-      ssb.add(getJobIDKey(id));
-      objectDescriptions[i] = new JobObjectDescription(id,new StringSet(ssb));
-    }
-
-    JobObjectExecutor exec = new JobObjectExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    IJobDescription[] results = exec.getResults(readOnlies,inputIndex);
-    for (IJobDescription result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Save a job description.
-  *@param jobDescription is the job description.
-  */
-  public void save(IJobDescription jobDescription)
-    throws ManifoldCFException
-  {
-    // The invalidation keys for this are both the general and the specific.
-    Long id = jobDescription.getID();
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getJobsKey());
-    ssb.add(getJobStatusKey());
-    ssb.add(getJobIDKey(id));
-    StringSet invKeys = new StringSet(ssb);
-
-    while (true)
-    {
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(jobsLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,invKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(idField,id)});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,jobDescription.getDescription());
-              values.put(connectionNameField,jobDescription.getConnectionName());
-              String newXML = jobDescription.getSpecification().toXML();
-              values.put(documentSpecField,newXML);
-              values.put(typeField,typeToString(jobDescription.getType()));
-              values.put(startMethodField,startMethodToString(jobDescription.getStartMethod()));
-              values.put(intervalField,jobDescription.getInterval());
-              values.put(maxIntervalField,jobDescription.getMaxInterval());
-              values.put(reseedIntervalField,jobDescription.getReseedInterval());
-              values.put(expirationField,jobDescription.getExpiration());
-              values.put(priorityField,new Integer(jobDescription.getPriority()));
-              values.put(hopcountModeField,hopcountModeToString(jobDescription.getHopcountMode()));
-
-              if (set.getRowCount() > 0)
-              {
-                // Update
-                // We need to reset the seedingVersionField if there are any changes that
-                // could affect what set of documents we allow!!!
-
-                IResultRow row = set.getRow(0);
-
-                // Determine whether we need to reset the scan time for documents.
-                // Basically, any change to job parameters that could affect ingestion should clear isSame so that we
-                // relook at all the documents, not just the recent ones.
-
-                boolean isSame = pipelineManager.compareRows(id,jobDescription);
-                if (!isSame)
-                {
-                  int currentStatus = stringToStatus((String)row.getValue(statusField));
-                  if (currentStatus == STATUS_ACTIVE || currentStatus == STATUS_ACTIVESEEDING ||
-                    currentStatus == STATUS_ACTIVE_UNINSTALLED || currentStatus == STATUS_ACTIVESEEDING_UNINSTALLED)
-                    values.put(assessmentStateField,assessmentStateToString(ASSESSMENT_UNKNOWN));
-                }
-
-                // Changing notifications should never reset seeding.
-                /*
-                if (isSame)
-                {
-                  isSame = notificationManager.compareRows(id,jobDescription);
-                }
-                */
-                
-                if (isSame)
-                {
-                  String oldDocSpecXML = (String)row.getValue(documentSpecField);
-                  if (!oldDocSpecXML.equals(newXML))
-                    isSame = false;
-                }
-
-                if (isSame)
-                  isSame = hopFilterManager.compareRows(id,jobDescription);
-
-                if (!isSame) {
-                  //System.out.println("Setting version field to null");
-                  values.put(seedingVersionField,null);
-                } else {
-                  //System.out.println("NOT setting version field to null");
-                }
-
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(idField,id)});
-                performUpdate(values," WHERE "+query,params,null);
-                pipelineManager.deleteRows(id);
-                notificationManager.deleteRows(id);
-                scheduleManager.deleteRows(id);
-                hopFilterManager.deleteRows(id);
-              }
-              else
-              {
-                // Insert
-                values.put(startTimeField,null);
-                values.put(seedingVersionField,null);
-                values.put(endTimeField,null);
-                values.put(statusField,statusToString(STATUS_INACTIVE));
-                values.put(lastTimeField,new Long(System.currentTimeMillis()));
-                values.put(idField,id);
-                performInsert(values,null);
-              }
-
-              // Write pipeline rows
-              pipelineManager.writeRows(id,jobDescription);
-              // Write notification rows
-              notificationManager.writeRows(id,jobDescription);
-              // Write schedule records
-              scheduleManager.writeRows(id,jobDescription);
-              // Write hop filter rows
-              hopFilterManager.writeRows(id,jobDescription);
-              
-              cacheManager.invalidateKeys(ch);
-              break;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(jobsLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-        continue;
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Clear seeding state for a job.
-  *@param jobID is the job whose state should be cleared.
-  */
-  public void clearSeedingState(Long jobID)
-    throws ManifoldCFException
-  {
-    Map values = new HashMap();
-    values.put(seedingVersionField,null);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    performUpdate(values,"WHERE "+query,params,null);
-  }
-
-  /** This method is called on a restart.
-  *@param processID is the process to be restarting.
-  */
-  public void restart(String processID)
-    throws ManifoldCFException
-  {
-    StringSet invKey = new StringSet(getJobStatusKey());
-    ArrayList list = new ArrayList();
-    HashMap map = new HashMap();
-    String query;
-      
-    // Starting up delete goes back to just being ready for delete
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_DELETESTARTINGUP)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORDELETE));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Notifying of completion goes back to just being ready for notify
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_NOTIFYINGOFCOMPLETION)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORNOTIFY));
-    map.put(processIDField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Notifying of deletion goes back to just being ready for delete notify
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_NOTIFYINGOFDELETION)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORDELETENOTIFY));
-    map.put(processIDField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Starting up or aborting starting up goes back to just being ready
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_STARTINGUP)}),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORSTARTUP));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Starting up or aborting starting up goes back to just being ready
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_STARTINGUPMINIMAL)}),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORSTARTUPMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Aborting starting up for restart state goes to ABORTINGFORRESTART
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGSTARTINGUPFORRESTART)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTART));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Aborting starting up for restart state goes to ABORTINGFORRESTART
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTARTMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // All seeding values return to pre-seeding values
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVESEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVE));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVEWAITINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVEWAITING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSINGWAITINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSINGWAITING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_RESUMINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_RESUMING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGFORRESTARTSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTART));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTARTMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSEDSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSED));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVEWAITSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVEWAIT));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSEDWAITSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSEDWAIT));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVESEEDING_UNINSTALLED)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVE_UNINSTALLED));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-
-  }
-
-  /** Clean up after all process IDs.
-  */
-  public void restart()
-    throws ManifoldCFException
-  {
-    StringSet invKey = new StringSet(getJobStatusKey());
-    ArrayList list = new ArrayList();
-    HashMap map = new HashMap();
-    String query;
-    
-    // All jobs with non-null failTime and failCount get set to null failTime and failCount
-    
-    // Starting up delete goes back to just being ready for delete
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_DELETESTARTINGUP))});
-    map.put(statusField,statusToString(STATUS_READYFORDELETE));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Notifying of completion goes back to just being ready for notify
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_NOTIFYINGOFCOMPLETION))});
-    map.put(statusField,statusToString(STATUS_READYFORNOTIFY));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Notifying of deletion goes back to just being ready for delete notify
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_NOTIFYINGOFDELETION))});
-    map.put(statusField,statusToString(STATUS_READYFORDELETENOTIFY));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Starting up or aborting starting up goes back to just being ready
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_STARTINGUP)})});
-    map.put(statusField,statusToString(STATUS_READYFORSTARTUP));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Starting up or aborting starting up goes back to just being ready
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_STARTINGUPMINIMAL)})});
-    map.put(statusField,statusToString(STATUS_READYFORSTARTUPMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Aborting starting up for restart state goes to ABORTINGFORRESTART
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGSTARTINGUPFORRESTART))});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTART));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // Aborting starting up for restart state goes to ABORTINGFORRESTART
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL))});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTARTMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-    // All seeding values return to pre-seeding values
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVESEEDING))});
-    map.put(statusField,statusToString(STATUS_ACTIVE));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSINGSEEDING))});
-    map.put(statusField,statusToString(STATUS_PAUSING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVEWAITINGSEEDING))});
-    map.put(statusField,statusToString(STATUS_ACTIVEWAITING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSINGWAITINGSEEDING))});
-    map.put(statusField,statusToString(STATUS_PAUSINGWAITING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_RESUMINGSEEDING))});
-    map.put(statusField,statusToString(STATUS_RESUMING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGFORRESTARTSEEDING))});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTART));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL))});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTARTMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSEDSEEDING))});
-    map.put(statusField,statusToString(STATUS_PAUSED));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVEWAITSEEDING))});
-    map.put(statusField,statusToString(STATUS_ACTIVEWAIT));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSEDWAITSEEDING))});
-    map.put(statusField,statusToString(STATUS_PAUSEDWAIT));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVESEEDING_UNINSTALLED))});
-    map.put(statusField,statusToString(STATUS_ACTIVE_UNINSTALLED));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-  }
-
-  public void restartCluster()
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(failTimeField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new NullCheckClause(failTimeField,false)});
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Invalidate current state with respect to installed connectors, as a result of registration.
-  */
-  public void invalidateCurrentUnregisteredState(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    // If we are in a state that cares about the connector state, then we have to signal we need an assessment.
-    if (oldStatusValue == STATUS_ACTIVE_UNINSTALLED || oldStatusValue == STATUS_ACTIVESEEDING_UNINSTALLED || oldStatusValue == STATUS_DELETING_NOOUTPUT)
-    {
-      // Assessment state is not cached, so no cache invalidation needed
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      HashMap map = new HashMap();
-      map.put(assessmentStateField,assessmentStateToString(ASSESSMENT_UNKNOWN));
-      performUpdate(map,"WHERE "+query,list,null);
-    }
-  }
-  
-  /** Signal to a job that an underlying transformation connector has gone away.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteTransformationConnectorDeregistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    int newStatusValue;
-    // The following states are special, in that when the underlying connector goes away, the jobs
-    // in such states are switched away to something else.  There are TWO reasons that a state may be in
-    // this category: EITHER we don't want the job in this state to be treated in the same way if its
-    // connector is uninstalled, OR we need feedback for the user interface.  If it's the latter situation,
-    // then all usages of the corresponding states will be identical - and that's in fact precisely where we
-    // start with in all the code.
-    switch (oldStatusValue)
-    {
-    case STATUS_ACTIVE:
-      newStatusValue = STATUS_ACTIVE_UNINSTALLED;
-      break;
-    case STATUS_ACTIVESEEDING:
-      newStatusValue = STATUS_ACTIVESEEDING_UNINSTALLED;
-      break;
-    default:
-      newStatusValue = oldStatusValue;
-      break;
-    }
-    if (newStatusValue == oldStatusValue)
-      return;
-
-    StringSet invKey = new StringSet(getJobStatusKey());
-
-    HashMap newValues = new HashMap();
-    newValues.put(statusField,statusToString(newStatusValue));
-    newValues.put(assessmentStateField,assessmentStateToString(ASSESSMENT_KNOWN));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    performUpdate(newValues,"WHERE "+query,list,invKey);
-  }
-
-  /** Signal to a job that an underlying transformation connector has been registered.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteTransformationConnectorRegistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    invalidateCurrentUnregisteredState(jobID,oldStatusValue);
-  }
-
-  /** Signal to a job that its underlying output connector has gone away.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteOutputConnectorDeregistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    int newStatusValue;
-    // The following states are special, in that when the underlying connector goes away, the jobs
-    // in such states are switched away to something else.  There are TWO reasons that a state may be in
-    // this category: EITHER we don't want the job in this state to be treated in the same way if its
-    // connector is uninstalled, OR we need feedback for the user interface.  If it's the latter situation,
-    // then all usages of the corresponding states will be identical - and that's in fact precisely where we
-    // start with in all the code.
-    switch (oldStatusValue)
-    {
-    case STATUS_ACTIVE:
-      newStatusValue = STATUS_ACTIVE_UNINSTALLED;
-      break;
-    case STATUS_ACTIVESEEDING:
-      newStatusValue = STATUS_ACTIVESEEDING_UNINSTALLED;
-      break;
-    case STATUS_DELETING:
-      newStatusValue = STATUS_DELETING_NOOUTPUT;
-      break;
-    default:
-      newStatusValue = oldStatusValue;
-      break;
-    }
-    if (newStatusValue == oldStatusValue)
-      return;
-
-    StringSet invKey = new StringSet(getJobStatusKey());
-
-    HashMap newValues = new HashMap();
-    newValues.put(statusField,statusToString(newStatusValue));
-    newValues.put(assessmentStateField,assessmentStateToString(ASSESSMENT_KNOWN));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    performUpdate(newValues,"WHERE "+query,list,invKey);
-  }
-  
-  /** Signal to a job that its underlying output connector has returned.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteOutputConnectorRegistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    if (oldStatusValue == STATUS_DELETING_NOOUTPUT)
-    {
-      // We can do the state transition now.
-      StringSet invKey = new StringSet(getJobStatusKey());
-
-      HashMap newValues = new HashMap();
-      newValues.put(statusField,statusToString(STATUS_DELETING));
-      newValues.put(assessmentStateField,assessmentStateToString(ASSESSMENT_KNOWN));
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      performUpdate(newValues,"WHERE "+query,list,invKey);
-      return;
-    }
-    // Otherwise, we don't know the state, and can't do the work now because we'd deadlock
-    invalidateCurrentUnregisteredState(jobID,oldStatusValue);
-  }
-  
-  /** Signal to a job that its underlying notification connector has gone away.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteNotificationConnectorDeregistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    // MHL
-  }
-  
-  /** Signal to a job that its underlying connector has gone away.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteConnectorDeregistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    int newStatusValue;
-    // The following states are special, in that when the underlying connector goes away, the jobs
-    // in such states are switched away to something else.  There are TWO reasons that a state may be in
-    // this category: EITHER we don't want the job in this state to be treated in the same way if its
-    // connector is uninstalled, OR we need feedback for the user interface.  If it's the latter situation,
-    // then all usages of the corresponding states will be identical - and that's in fact precisely where we
-    // start with in all the code.
-    switch (oldStatusValue)
-    {
-    case STATUS_ACTIVE:
-      newStatusValue = STATUS_ACTIVE_UNINSTALLED;
-      break;
-    case STATUS_ACTIVESEEDING:
-      newStatusValue = STATUS_ACTIVESEEDING_UNINSTALLED;
-      break;
-    default:
-      newStatusValue = oldStatusValue;
-      break;
-    }
-    if (newStatusValue == oldStatusValue)
-      return;
-
-    StringSet invKey = new StringSet(getJobStatusKey());
-
-    HashMap newValues = new HashMap();
-    newValues.put(statusField,statusToString(newStatusValue));
-    newValues.put(assessmentStateField,assessmentStateToString(ASSESSMENT_KNOWN));
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    performUpdate(newValues,"WHERE "+query,list,invKey);
-  }
-  
-  /** Signal to a job that its underlying notification connector has returned.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteNotificationConnectorRegistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    // MHL
-  }
-
-  /** Signal to a job that its underlying connector has returned.
-  *@param jobID is the identifier of the job.
-  *@param oldStatusValue is the current status value for the job.
-  */
-  public void noteConnectorRegistration(Long jobID, int oldStatusValue)
-    throws ManifoldCFException
-  {
-    invalidateCurrentUnregisteredState(jobID,oldStatusValue);
-  }
-  
-  /** Note a change in connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external repository change
-  * is signalled.
-  */
-  public void noteConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    // No cache keys need invalidation, since we're changing the start time, not the status.
-    HashMap newValues = new HashMap();
-    newValues.put(seedingVersionField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(connectionNameField,connectionName)});
-    performUpdate(newValues,"WHERE "+query,list,null);
-  }
-
-  /** Note a change in notification connection configuration.
-  * This method will be called whenever a notification connection's configuration is modified, or when an external repository change
-  * is signalled.
-  */
-  public void noteNotificationConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    // Notification configuration change does not change anything in a crawl
-  }
-
-  /** Note a change in output connection configuration.
-  * This method will be called whenever a connection's configuration is modified, or when an external target config change
-  * is signalled.
-  */
-  public void noteOutputConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    // No cache keys need invalidation, since we're changing the start time, not the status.
-    HashMap newValues = new HashMap();
-    newValues.put(seedingVersionField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new JoinClause(getTableName()+"."+idField,pipelineManager.ownerIDField),
-      new UnitaryClause(pipelineManager.outputNameField,connectionName)});
-    performUpdate(newValues,"WHERE EXISTS(SELECT 'x' FROM "+pipelineManager.getTableName()+" WHERE "+query+")",list,null);
-  }
-
-  /** Note a change in transformation connection configuration.
-  * This method will be called whenever a connection's configuration is modified.
-  */
-  public void noteTransformationConnectionChange(String connectionName)
-    throws ManifoldCFException
-  {
-    // No cache keys need invalidation, since we're changing the start time, not the status.
-    HashMap newValues = new HashMap();
-    newValues.put(seedingVersionField,null);
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new JoinClause(getTableName()+"."+idField,pipelineManager.ownerIDField),
-      new UnitaryClause(pipelineManager.transformationNameField,connectionName)});
-    performUpdate(newValues,"WHERE EXISTS(SELECT 'x' FROM "+pipelineManager.getTableName()+" WHERE "+query+")",list,null);
-  }
-  
-  /** Check whether a job's status indicates that it is in ACTIVE or ACTIVESEEDING state.
-  */
-  public boolean checkJobActive(Long jobID)
-    throws ManifoldCFException
-  {
-    StringSet cacheKeys = new StringSet(getJobStatusKey());
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    IResultSet set = performQuery("SELECT "+statusField+" FROM "+
-      getTableName()+" WHERE "+query,list,cacheKeys,null);
-    if (set.getRowCount() == 0)
-      return false;
-    IResultRow row = set.getRow(0);
-    String statusValue = (String)row.getValue(statusField);
-    int status = stringToStatus(statusValue);
-    // Any active state in the lifecycle will do: seeding, active, active_seeding
-    return (status == STATUS_ACTIVE || status == STATUS_ACTIVESEEDING ||
-      status == STATUS_STARTINGUP || status == STATUS_STARTINGUPMINIMAL);
-  }
-
-  /** Reset delete startup worker thread status.
-  */
-  public void resetDeleteStartupWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    // This handles everything that the delete startup thread would resolve.
-
-    ArrayList list = new ArrayList();
-    HashMap map = new HashMap();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_DELETESTARTINGUP)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORDELETE));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-  }
-  
-  /** Reset notification worker thread status.
-  */
-  public void resetNotificationWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    // This resets everything that the job notification thread would resolve.
-
-    ArrayList list = new ArrayList();
-    HashMap map = new HashMap();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_NOTIFYINGOFCOMPLETION)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORNOTIFY));
-    map.put(processIDField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-    list.clear();
-    map.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_NOTIFYINGOFDELETION)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORDELETENOTIFY));
-    map.put(processIDField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-  }
-  
-  /** Reset startup worker thread status.
-  */
-  public void resetStartupWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    // We have to handle all states that the startup thread would resolve, and change them to something appropriate.
-
-    ArrayList list = new ArrayList();
-    HashMap map = new HashMap();
-    String query;
-
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_STARTINGUP)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORSTARTUP));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_STARTINGUPMINIMAL)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_READYFORSTARTUPMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGSTARTINGUPFORRESTART)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTART));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTARTMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-
-  }
-
-  /** Reset as part of restoring seeding worker threads.
-  */
-  public void resetSeedingWorkerStatus(String processID)
-    throws ManifoldCFException
-  {
-    StringSet invKey = new StringSet(getJobStatusKey());
-    ArrayList list = new ArrayList();
-    HashMap map = new HashMap();
-    String query;
-    // All seeding values return to pre-seeding values
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVESEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVE));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVEWAITINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVEWAITING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSINGWAITINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSINGWAITING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_RESUMINGSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_RESUMING));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGFORRESTARTSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTART));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ABORTINGFORRESTARTMINIMAL));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSEDSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSED));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVEWAITSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVEWAIT));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_PAUSEDWAITSEEDING)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_PAUSEDWAIT));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-    list.clear();
-    query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_ACTIVESEEDING_UNINSTALLED)),
-      new UnitaryClause(processIDField,processID)});
-    map.put(statusField,statusToString(STATUS_ACTIVE_UNINSTALLED));
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,invKey);
-
-  }
-
-  /** Retry startup.
-  *@param jobID is the job identifier.
-  *@param requestMinimum is true for a minimal crawl.
-  *@param failTime is the fail time, -1 == none
-  *@param failCount is the fail count to use, -1 == none.
-  */
-  public void retryStartup(Long jobID, boolean requestMinimum, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    if (requestMinimum)
-      map.put(statusField,statusToString(STATUS_READYFORSTARTUPMINIMAL));
-    else
-      map.put(statusField,statusToString(STATUS_READYFORSTARTUP));
-    if (failTime == -1L)
-      map.put(failTimeField,null);
-    else
-      map.put(failTimeField,new Long(failTime));
-    if (failCount == -1)
-      map.put(failCountField,null);
-    else
-      map.put(failCountField,failCount);
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Retry seeding.
-  *@param jobID is the job identifier.
-  *@param failTime is the fail time, -1 == none
-  *@param failCount is the fail count to use, -1 == none.
-  */
-  public void retrySeeding(Long jobID, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      // Map the field values we see to those we want.
-      // This is exactly equivalent to finishing seeding, except for fail time etc.
-      IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+" WHERE "+
-        query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Can't find job "+jobID.toString());
-      IResultRow row = set.getRow(0);
-      int status = stringToStatus((String)row.getValue(statusField));
-      int newStatus;
-      switch (status)
-      {
-      case STATUS_ACTIVESEEDING:
-        newStatus = STATUS_ACTIVE;
-        break;
-      case STATUS_PAUSINGSEEDING:
-        newStatus = STATUS_PAUSING;
-        break;
-      case STATUS_ACTIVEWAITINGSEEDING:
-        newStatus = STATUS_ACTIVEWAITING;
-        break;
-      case STATUS_PAUSINGWAITINGSEEDING:
-        newStatus = STATUS_PAUSINGWAITING;
-        break;
-      case STATUS_ACTIVESEEDING_UNINSTALLED:
-        newStatus = STATUS_ACTIVE_UNINSTALLED;
-        break;
-      case STATUS_ACTIVEWAITSEEDING:
-        newStatus = STATUS_ACTIVEWAIT;
-        break;
-      case STATUS_PAUSEDSEEDING:
-        newStatus = STATUS_PAUSED;
-        break;
-      case STATUS_PAUSEDWAITSEEDING:
-        newStatus = STATUS_PAUSEDWAIT;
-        break;
-      case STATUS_ABORTINGFORRESTARTSEEDING:
-        newStatus = STATUS_ABORTINGFORRESTART;
-        break;
-      case STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:
-        newStatus = STATUS_ABORTINGFORRESTARTMINIMAL;
-        break;
-      default:
-        throw new ManifoldCFException("Unexpected job status encountered: "+Integer.toString(status));
-      }
-      HashMap map = new HashMap();
-      map.put(statusField,statusToString(newStatus));
-      if (failTime == -1L)
-        map.put(failTimeField,null);
-      else
-        map.put(failTimeField,new Long(failTime));
-      if (failCount == -1)
-        map.put(failCountField,null);
-      else
-        map.put(failCountField,failCount);
-      map.put(processIDField,null);
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Retry notification.
-  *@param jobID is the job identifier.
-  *@param failTime is the fail time, -1 == none
-  *@param failCount is the fail count to use, -1 == none.
-  */
-  public void retryNotification(Long jobID, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_READYFORNOTIFY));
-    if (failTime == -1L)
-      map.put(failTimeField,null);
-    else
-      map.put(failTimeField,new Long(failTime));
-    if (failCount == -1)
-      map.put(failCountField,null);
-    else
-      map.put(failCountField,failCount);
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Retry delete notification.
-  *@param jobID is the job identifier.
-  *@param failTime is the fail time, -1 == none
-  *@param failCount is the fail count to use, -1 == none.
-  */
-  public void retryDeleteNotification(Long jobID, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_READYFORDELETENOTIFY));
-    if (failTime == -1L)
-      map.put(failTimeField,null);
-    else
-      map.put(failTimeField,new Long(failTime));
-    if (failCount == -1)
-      map.put(failCountField,null);
-    else
-      map.put(failCountField,failCount);
-    map.put(processIDField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Write job status and window end, and clear the endtime field.  (The start time will be written
-  * when the job enters the "active" state.)
-  *@param jobID is the job identifier.
-  *@param windowEnd is the window end time, if any
-  *@param requestMinimum is true if a minimal job run is requested
-  */
-  public void startJob(Long jobID, Long windowEnd, boolean requestMinimum)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(requestMinimum?STATUS_READYFORSTARTUPMINIMAL:STATUS_READYFORSTARTUP));
-    map.put(endTimeField,null);
-    // Make sure error is removed (from last time)
-    map.put(errorField,null);
-    map.put(windowEndField,windowEnd);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Assess all marked jobs to determine if they can be reactivated.
-  */
-  public void assessMarkedJobs()
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(assessmentStateField,assessmentStateToString(ASSESSMENT_UNKNOWN))});
-    // Query for the matching jobs, and then for each job potentially adjust the state based on the connector status
-    IResultSet set = performQuery("SELECT "+idField+","+statusField+","+connectionNameField+" FROM "+
-      getTableName()+" WHERE "+query+" FOR UPDATE",
-      newList,null,null);
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long jobID = (Long)row.getValue(idField);
-      String connectionName = (String)row.getValue(connectionNameField);
-      String[] transformationNames = pipelineManager.getTransformationConnectionNames(jobID);
-      String[] outputNames = pipelineManager.getOutputConnectionNames(jobID);
-      int statusValue = stringToStatus((String)row.getValue(statusField));
-      int newValue;
-      
-      // Based on status value, see what we need to know to determine if the state can be switched
-      switch (statusValue)
-      {
-      case STATUS_DELETING_NOOUTPUT:
-        if (checkOutputsInstalled(outputNames))
-          newValue = STATUS_DELETING;
-        else
-          return;
-        break;
-      case STATUS_ACTIVE_UNINSTALLED:
-        if (connectionMgr.checkConnectorExists(connectionName) &&
-          checkTransformationsInstalled(transformationNames) &&
-          checkOutputsInstalled(outputNames))
-          newValue = STATUS_ACTIVE;
-        else
-          return;
-        break;
-      case STATUS_ACTIVESEEDING_UNINSTALLED:
-        if (connectionMgr.checkConnectorExists(connectionName) &&
-          checkTransformationsInstalled(transformationNames) &&
-          checkOutputsInstalled(outputNames))
-          newValue = STATUS_ACTIVESEEDING;
-        else
-          return;
-        break;
-      default:
-        return;
-      }
-      
-      ArrayList list = new ArrayList();
-      query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      HashMap map = new HashMap();
-      map.put(assessmentStateField,assessmentStateToString(ASSESSMENT_KNOWN));
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-
-  }
-  
-  /** Put job back into active state, from the shutting-down state.
-  *@param jobID is the job identifier.
-  */
-  public void returnJobToActive(Long jobID)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      IResultSet set = performQuery("SELECT "+statusField+","+connectionNameField+" FROM "+getTableName()+" WHERE "+
-        query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Can't find job "+jobID.toString());
-      
-      IResultRow row = set.getRow(0);
-      
-      int status = stringToStatus((String)row.getValue(statusField));
-      int newStatus;
-      switch (status)
-      {
-      case STATUS_SHUTTINGDOWN:
-        String[] transformationConnectionNames = pipelineManager.getTransformationConnectionNames(jobID);
-        String[] outputConnectionNames = pipelineManager.getOutputConnectionNames(jobID);
-        String connectionName = (String)row.getValue(connectionNameField);
-        // Want either STATUS_ACTIVE, or STATUS_ACTIVE_UNINSTALLED
-        if (!checkTransformationsInstalled(transformationConnectionNames) ||
-          !checkOutputsInstalled(outputConnectionNames) ||
-          !connectionMgr.checkConnectorExists(connectionName))
-          newStatus = STATUS_ACTIVE_UNINSTALLED;
-        else
-          newStatus = STATUS_ACTIVE;
-        break;
-      default:
-        // Complain!
-        throw new ManifoldCFException("Unexpected job status encountered: "+Integer.toString(status));
-      }
-
-      HashMap map = new HashMap();
-      map.put(statusField,statusToString(newStatus));
-      map.put(processIDField,null);
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  protected boolean checkTransformationsInstalled(String[] transformationNames)
-    throws ManifoldCFException
-  {
-    for (String transformationName : transformationNames)
-    {
-      if (!transMgr.checkConnectorExists(transformationName))
-        return false;
-    }
-    return true;
-  }
-
-  protected boolean checkOutputsInstalled(String[] outputNames)
-    throws ManifoldCFException
-  {
-    for (String outputName : outputNames)
-    {
-      if (!outputMgr.checkConnectorExists(outputName))
-        return false;
-    }
-    return true;
-  }
-  
-  /** Put job into "deleting" state, and set the start time field.
-  *@param jobID is the job identifier.
-  *@param startTime is the current time in milliseconds from start of epoch.
-  */
-  public void noteJobDeleteStarted(Long jobID, long startTime)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+" WHERE "+
-        query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Can't find job "+jobID.toString());
-      IResultRow row = set.getRow(0);
-      int status = stringToStatus((String)row.getValue(statusField));
-      String[] outputNames = pipelineManager.getOutputConnectionNames(jobID);
-      int newStatus;
-      switch (status)
-      {
-      case STATUS_DELETESTARTINGUP:
-        if (checkOutputsInstalled(outputNames))
-          newStatus = STATUS_DELETING;
-        else
-          newStatus = STATUS_DELETING_NOOUTPUT;
-        break;
-      default:
-        // Complain!
-        throw new ManifoldCFException("Unexpected job status encountered: "+Integer.toString(status));
-      }
-
-      HashMap map = new HashMap();
-      map.put(statusField,statusToString(newStatus));
-      if (newStatus == STATUS_DELETING || newStatus == STATUS_DELETING_NOOUTPUT)
-      {
-        map.put(startTimeField,new Long(startTime));
-      }
-      // Clear out seeding version, in case we wind up keeping the job and rerunning it
-      map.put(seedingVersionField,null);
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Make job active, and set the start time field.
-  *@param jobID is the job identifier.
-  *@param startTime is the current time in milliseconds from start of epoch.
-  *@param seedVersionString is the version string to record for the seeding.
-  */
-  public void noteJobStarted(Long jobID, long startTime, String seedVersionString)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      IResultSet set = performQuery("SELECT "+statusField+","+connectionNameField+" FROM "+getTableName()+" WHERE "+
-        query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Can't find job "+jobID.toString());
-      IResultRow row = set.getRow(0);
-      
-      int status = stringToStatus((String)row.getValue(statusField));
-      int newStatus;
-      switch (status)
-      {
-      case STATUS_STARTINGUP:
-      case STATUS_STARTINGUPMINIMAL:
-        String[] transformationConnectionNames = pipelineManager.getTransformationConnectionNames(jobID);
-        String[] outputConnectionNames = pipelineManager.getOutputConnectionNames(jobID);
-        String connectionName = (String)row.getValue(connectionNameField);
-
-        // Need to set either STATUS_ACTIVE, or STATUS_ACTIVE_UNINSTALLED
-        if (!checkTransformationsInstalled(transformationConnectionNames) ||
-          !checkOutputsInstalled(outputConnectionNames) ||
-          !connectionMgr.checkConnectorExists(connectionName))
-          newStatus = STATUS_ACTIVE_UNINSTALLED;
-        else
-          newStatus = STATUS_ACTIVE;
-        break;
-      case STATUS_ABORTINGSTARTINGUPFORRESTART:
-        newStatus = STATUS_ABORTINGFORRESTART;
-        break;
-      case STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL:
-        newStatus = STATUS_ABORTINGFORRESTARTMINIMAL;
-        break;
-      default:
-        // Complain!
-        throw new ManifoldCFException("Unexpected job status encountered: "+Integer.toString(status));
-      }
-
-      HashMap map = new HashMap();
-      map.put(statusField,statusToString(newStatus));
-      if (newStatus == STATUS_ACTIVE || newStatus == STATUS_ACTIVE_UNINSTALLED)
-      {
-        map.put(startTimeField,new Long(startTime));
-      }
-      // The seeding was complete or we wouldn't have gotten called, so at least note that.
-      map.put(seedingVersionField,seedVersionString);
-      // Clear out the retry fields we might have set
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-      map.put(processIDField,null);
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Note job seeded.
-  *@param jobID is the job id.
-  *@param seedVersionString is the job seed version string.
-  */
-  public void noteJobSeeded(Long jobID, String seedVersionString)
-    throws ManifoldCFException
-  {
-    // We have to convert the current status to the non-seeding equivalent
-    beginTransaction();
-    try
-    {
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+" WHERE "+
-        query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Can't find job "+jobID.toString());
-      IResultRow row = set.getRow(0);
-      int status = stringToStatus((String)row.getValue(statusField));
-      int newStatus;
-      switch (status)
-      {
-      case STATUS_ACTIVESEEDING:
-        newStatus = STATUS_ACTIVE;
-        break;
-      case STATUS_PAUSINGSEEDING:
-        newStatus = STATUS_PAUSING;
-        break;
-      case STATUS_ACTIVEWAITINGSEEDING:
-        newStatus = STATUS_ACTIVEWAITING;
-        break;
-      case STATUS_PAUSINGWAITINGSEEDING:
-        newStatus = STATUS_PAUSINGWAITING;
-        break;
-      case STATUS_ACTIVESEEDING_UNINSTALLED:
-        newStatus = STATUS_ACTIVE_UNINSTALLED;
-        break;
-      case STATUS_ACTIVEWAITSEEDING:
-        newStatus = STATUS_ACTIVEWAIT;
-        break;
-      case STATUS_PAUSEDSEEDING:
-        newStatus = STATUS_PAUSED;
-        break;
-      case STATUS_PAUSEDWAITSEEDING:
-        newStatus = STATUS_PAUSEDWAIT;
-        break;
-      case STATUS_ABORTINGFORRESTARTSEEDING:
-        newStatus = STATUS_ABORTINGFORRESTART;
-        break;
-      case STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:
-        newStatus = STATUS_ABORTINGFORRESTARTMINIMAL;
-        break;
-      default:
-        throw new ManifoldCFException("Unexpected job status encountered: "+Integer.toString(status));
-      }
-      HashMap map = new HashMap();
-      map.put(statusField,statusToString(newStatus));
-      map.put(processIDField,null);
-      map.put(seedingVersionField,seedVersionString);
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (RuntimeException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Cause job that is in "wait" state to become un-waited.
-  *@param jobID is the job identifier.
-  *@param newStatus is the new status (either STATUS_ACTIVE or STATUS_PAUSED or
-  *  STATUS_ACTIVESEEDING or STATUS_PAUSEDSEEDING)
-  *@param windowEnd is the window end time, if any.
-  */
-  public void unwaitJob(Long jobID, int newStatus, Long windowEnd)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    map.put(windowEndField,windowEnd);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Cause job that is in active or paused state to become waited.
-  *@param jobID is the job identifier.
-  *@param newStatus is the new status (either STATUS_ACTIVEWAIT or STATUS_PAUSEDWAIT or
-  *  STATUS_ACTIVEWAITSEEDING or STATUS_PAUSEDWAITSEEDING)
-  */
-  public void waitJob(Long jobID, int newStatus)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    map.put(assessmentStateField,assessmentStateToString(ASSESSMENT_KNOWN));
-    map.put(windowEndField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Abort a job.
-  *@param jobID is the job id.
-  *@param errorText is the error, or null if none.
-  *@return true if there wasn't an abort already logged for this job.
-  */
-  public boolean abortJob(Long jobID, String errorText)
-    throws ManifoldCFException
-  {
-    // Get the current job status
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+
-      " WHERE "+query+" FOR UPDATE",list,null,null);
-    if (set.getRowCount() == 0)
-      throw new ManifoldCFException("Job does not exist: "+jobID);
-    IResultRow row = set.getRow(0);
-    int status = stringToStatus(row.getValue(statusField).toString());
-    if (status == STATUS_ABORTING ||
-      status == STATUS_ABORTINGSHUTTINGDOWN)
-      return false;
-    int newStatus;
-    switch (status)
-    {
-    case STATUS_NOTIFYINGOFCOMPLETION:
-      newStatus = STATUS_INACTIVE;
-      break;
-    case STATUS_STARTINGUP:
-    case STATUS_ABORTINGSTARTINGUPFORRESTART:
-      newStatus = STATUS_ABORTING;
-      break;
-    case STATUS_STARTINGUPMINIMAL:
-    case STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL:
-      newStatus = STATUS_ABORTING;
-      break;
-    case STATUS_SHUTTINGDOWN:
-      newStatus = STATUS_ABORTINGSHUTTINGDOWN;
-      break;
-    case STATUS_READYFORSTARTUP:
-    case STATUS_READYFORSTARTUPMINIMAL:
-    case STATUS_ACTIVE:
-    case STATUS_ACTIVE_UNINSTALLED:
-    case STATUS_ACTIVEWAIT:
-    case STATUS_PAUSING:
-    case STATUS_ACTIVEWAITING:
-    case STATUS_PAUSINGWAITING:
-    case STATUS_PAUSED:
-    case STATUS_PAUSEDWAIT:
-    case STATUS_ABORTINGFORRESTART:
-    case STATUS_ABORTINGFORRESTARTMINIMAL:
-      newStatus = STATUS_ABORTING;
-      break;
-    case STATUS_ACTIVESEEDING:
-    case STATUS_ACTIVESEEDING_UNINSTALLED:
-    case STATUS_ACTIVEWAITSEEDING:
-    case STATUS_PAUSINGSEEDING:
-    case STATUS_ACTIVEWAITINGSEEDING:
-    case STATUS_PAUSINGWAITINGSEEDING:
-    case STATUS_PAUSEDSEEDING:
-    case STATUS_PAUSEDWAITSEEDING:
-    case STATUS_ABORTINGFORRESTARTSEEDING:
-    case STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:
-      newStatus = STATUS_ABORTING;
-      break;
-    default:
-      throw new ManifoldCFException("Job "+jobID+" is not active");
-    }
-    // Pause the job
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    map.put(errorField,errorText);
-    map.put(processIDField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    return true;
-  }
-
-  /** Restart a job.  Finish off what's currently happening, and then start the job up again.
-  *@param jobID is the job id.
-  *@param requestMinimum is true if the minimal job run is requested.
-  */
-  public void abortRestartJob(Long jobID, boolean requestMinimum)
-    throws ManifoldCFException
-  {
-    // Get the current job status
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+
-      " WHERE "+query+" FOR UPDATE",list,null,null);
-    if (set.getRowCount() == 0)
-      throw new ManifoldCFException("Job does not exist: "+jobID);
-    IResultRow row = set.getRow(0);
-    int status = stringToStatus(row.getValue(statusField).toString());
-    if (status == STATUS_ABORTINGFORRESTART || status == STATUS_ABORTINGFORRESTARTSEEDING ||
-      status == STATUS_ABORTINGSTARTINGUPFORRESTART ||
-      status == STATUS_ABORTINGFORRESTARTMINIMAL || status == STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL ||
-      status == STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL)
-      return;
-    int newStatus;
-    switch (status)
-    {
-    case STATUS_STARTINGUP:
-    case STATUS_STARTINGUPMINIMAL:
-      newStatus = requestMinimum?STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL:STATUS_ABORTINGSTARTINGUPFORRESTART;
-      break;
-    case STATUS_READYFORSTARTUP:
-    case STATUS_READYFORSTARTUPMINIMAL:
-    case STATUS_ACTIVE:
-    case STATUS_ACTIVE_UNINSTALLED:
-    case STATUS_ACTIVEWAIT:
-    case STATUS_PAUSING:
-    case STATUS_ACTIVEWAITING:
-    case STATUS_PAUSINGWAITING:
-    case STATUS_PAUSED:
-    case STATUS_PAUSEDWAIT:
-      newStatus = requestMinimum?STATUS_ABORTINGFORRESTARTMINIMAL:STATUS_ABORTINGFORRESTART;
-      break;
-    case STATUS_ACTIVESEEDING:
-    case STATUS_ACTIVESEEDING_UNINSTALLED:
-    case STATUS_ACTIVEWAITSEEDING:
-    case STATUS_PAUSINGSEEDING:
-    case STATUS_ACTIVEWAITINGSEEDING:
-    case STATUS_PAUSINGWAITINGSEEDING:
-    case STATUS_PAUSEDSEEDING:
-    case STATUS_PAUSEDWAITSEEDING:
-      newStatus = requestMinimum?STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:STATUS_ABORTINGFORRESTARTSEEDING;
-      break;
-    default:
-      throw new ManifoldCFException("Job "+jobID+" is not restartable");
-    }
-    // reset the job
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Pause a job.
-  *@param jobID is the job id.
-  */
-  public void pauseJob(Long jobID)
-    throws ManifoldCFException
-  {
-    // Get the current job status
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+
-      " WHERE "+query+" FOR UPDATE",list,null,null);
-    if (set.getRowCount() == 0)
-      throw new ManifoldCFException("Job does not exist: "+jobID);
-    IResultRow row = set.getRow(0);
-    int status = stringToStatus(row.getValue(statusField).toString());
-    int newStatus;
-    switch (status)
-    {
-    case STATUS_ACTIVE:
-    case STATUS_ACTIVE_UNINSTALLED:
-      newStatus = STATUS_PAUSING;
-      break;
-    case STATUS_ACTIVEWAITING:
-      newStatus = STATUS_PAUSINGWAITING;
-      break;
-    case STATUS_ACTIVEWAIT:
-      newStatus = STATUS_PAUSEDWAIT;
-      break;
-    case STATUS_ACTIVESEEDING:
-    case STATUS_ACTIVESEEDING_UNINSTALLED:
-      newStatus = STATUS_PAUSINGSEEDING;
-      break;
-    case STATUS_ACTIVEWAITINGSEEDING:
-      newStatus = STATUS_PAUSINGWAITINGSEEDING;
-      break;
-    case STATUS_ACTIVEWAITSEEDING:
-      newStatus = STATUS_PAUSEDWAITSEEDING;
-      break;
-    default:
-      throw new ManifoldCFException("Job "+jobID+" is not active");
-    }
-    // Pause the job
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Restart a job.
-  *@param jobID is the job id.
-  */
-  public void restartJob(Long jobID)
-    throws ManifoldCFException
-  {
-    // Get the current job status
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+
-      " WHERE "+query+" FOR UPDATE",list,null,null);
-    if (set.getRowCount() == 0)
-      throw new ManifoldCFException("Job does not exist: "+jobID);
-    IResultRow row = set.getRow(0);
-    int status = stringToStatus(row.getValue(statusField).toString());
-    int newStatus;
-    switch (status)
-    {
-    case STATUS_PAUSED:
-      newStatus = STATUS_RESUMING;
-      break;
-    case STATUS_PAUSEDWAIT:
-      newStatus = STATUS_ACTIVEWAIT;
-      break;
-    case STATUS_PAUSEDSEEDING:
-      newStatus = STATUS_RESUMINGSEEDING;
-      break;
-    case STATUS_PAUSEDWAITSEEDING:
-      newStatus = STATUS_ACTIVEWAITSEEDING;
-      break;
-    default:
-      throw new ManifoldCFException("Job "+jobID+" is not paused");
-    }
-    // Pause the job
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(newStatus));
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Update a job's status, and its reseed time.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  *@param reseedTime is the reseed time.
-  */
-  public void writeTransientStatus(Long jobID, int status, Long reseedTime, String processID)
-    throws ManifoldCFException
-  {
-    writeStatus(jobID, status, reseedTime, processID, false);
-  }
-
-  /** Update a job's status, and its reseed time.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  *@param reseedTime is the reseed time.
-  */
-  public void writePermanentStatus(Long jobID, int status, Long reseedTime)
-    throws ManifoldCFException
-  {
-    writeStatus(jobID, status, reseedTime, null, false);
-  }
-
-  /** Update a job's status, and its reseed time.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  *@param reseedTime is the reseed time.
-  */
-  public void writePermanentStatus(Long jobID, int status, Long reseedTime, boolean clearFailTime)
-    throws ManifoldCFException
-  {
-    writeStatus(jobID, status, reseedTime, null, clearFailTime);
-  }
-
-  /** Update a job's status, and its reseed time.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  *@param reseedTime is the reseed time.
-  */
-  protected void writeStatus(Long jobID, int status, Long reseedTime, String processID, boolean clearFailTime)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(status));
-    map.put(processIDField,processID);
-    map.put(reseedTimeField,reseedTime);
-    if (clearFailTime)
-    {
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-    }
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Update a job's status.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  */
-  public void writeTransientStatus(Long jobID, int status, String processID)
-    throws ManifoldCFException
-  {
-    writeStatus(jobID, status, processID, false);
-  }
-  
-  /** Update a job's status.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  */
-  public void writePermanentStatus(Long jobID, int status)
-    throws ManifoldCFException
-  {
-    writeStatus(jobID, status, null, false);
-  }
-
-  /** Update a job's status.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  */
-  public void writePermanentStatus(Long jobID, int status, boolean clearFailTime)
-    throws ManifoldCFException
-  {
-    writeStatus(jobID, status, null, clearFailTime);
-  }
-
-  /** Update a job's status.
-  *@param jobID is the job id.
-  *@param status is the desired status.
-  */
-  protected void writeStatus(Long jobID, int status, String processID, boolean clearFailTime)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(status));
-    map.put(processIDField,processID);
-    if (clearFailTime)
-    {
-      map.put(failTimeField,null);
-      map.put(failCountField,null);
-    }
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Update a job's last-time field.
-  *@param jobID is the job id.
-  *@param currentTime is the current time.
-  */
-  public void updateLastTime(Long jobID, long currentTime)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(lastTimeField,new Long(currentTime));
-    performUpdate(map,"WHERE "+query,list,null);
-  }
-
-  /** Finish a job.
-  * Write completion and the current time.
-  *@param jobID is the job id.
-  *@param finishTime is the finish time.
-  */
-  public void finishJob(Long jobID, long finishTime)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_READYFORNOTIFY));
-    map.put(errorField,null);
-    map.put(endTimeField,new Long(finishTime));
-    map.put(lastTimeField,new Long(finishTime));
-    map.put(windowEndField,null);
-    map.put(reseedTimeField,null);
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Finish job cleanup.
-  * Write completion and the current time.
-  *@param jobID is the job id.
-  */
-  public void finishJobCleanup(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_READYFORDELETENOTIFY));
-    map.put(errorField,null);
-    // Anything else?
-    // MHL
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-
-  /** Resume a stopped job (from a pause or activewait).
-  * Updates the job record in a manner consistent with the job's state.
-  */
-  public void finishResumeJob(Long jobID, long currentTime)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      // Get the current job status
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      IResultSet set = performQuery("SELECT "+statusField+","+connectionNameField+" FROM "+getTableName()+
-        " WHERE "+query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Job does not exist: "+jobID);
-      IResultRow row = set.getRow(0);
-      int status = stringToStatus(row.getValue(statusField).toString());
-      String[] transformationConnectionNames = pipelineManager.getTransformationConnectionNames(jobID);
-      String[] outputConnectionNames = pipelineManager.getOutputConnectionNames(jobID);
-      String connectionName = (String)row.getValue(connectionNameField);
-      int newStatus;
-      HashMap map = new HashMap();
-      switch (status)
-      {
-      case STATUS_RESUMING:
-        // Want either STATUS_ACTIVE or STATUS_ACTIVE_UNINSTALLED
-        if (!checkTransformationsInstalled(transformationConnectionNames) ||
-          !checkOutputsInstalled(outputConnectionNames) ||
-          !connectionMgr.checkConnectorExists(connectionName))
-          newStatus = STATUS_ACTIVE_UNINSTALLED;
-        else
-          newStatus = STATUS_ACTIVE;
-        map.put(statusField,statusToString(newStatus));
-        break;
-      case STATUS_RESUMINGSEEDING:
-        // Want either STATUS_ACTIVESEEDING or STATUS_ACTIVESEEDING_UNINSTALLED
-        if (!checkTransformationsInstalled(transformationConnectionNames) ||
-          !checkOutputsInstalled(outputConnectionNames) ||
-          !connectionMgr.checkConnectorExists(connectionName))
-          newStatus = STATUS_ACTIVESEEDING_UNINSTALLED;
-        else
-          newStatus = STATUS_ACTIVESEEDING;
-        map.put(statusField,statusToString(newStatus));
-        break;
-      default:
-        throw new ManifoldCFException("Unexpected value for job status: "+Integer.toString(status));
-      }
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-  
-  /** Stop a job suddenly (abort, pause, activewait).
-  * Updates the job record in a manner consistent with the job's state.
-  */
-  public void finishStopJob(Long jobID, long currentTime)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      // Get the current job status
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(idField,jobID)});
-      IResultSet set = performQuery("SELECT "+statusField+" FROM "+getTableName()+
-        " WHERE "+query+" FOR UPDATE",list,null,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("Job does not exist: "+jobID);
-      IResultRow row = set.getRow(0);
-      int status = stringToStatus(row.getValue(statusField).toString());
-      HashMap map = new HashMap();
-      switch (status)
-      {
-      case STATUS_ABORTINGSHUTTINGDOWN:
-      case STATUS_ABORTING:
-        // Mark status of job as "inactive"
-        map.put(statusField,statusToString(STATUS_READYFORNOTIFY));
-        map.put(endTimeField,null);
-        map.put(lastTimeField,new Long(currentTime));
-        map.put(windowEndField,null);
-        map.put(reseedTimeField,null);
-        break;
-      case STATUS_ABORTINGFORRESTART:
-        map.put(statusField,statusToString(STATUS_READYFORSTARTUP));
-        map.put(endTimeField,null);
-        // Make sure error is removed (from last time)
-        map.put(errorField,null);
-        map.put(windowEndField,null);
-        break;
-      case STATUS_ABORTINGFORRESTARTMINIMAL:
-        map.put(statusField,statusToString(STATUS_READYFORSTARTUPMINIMAL));
-        map.put(endTimeField,null);
-        // Make sure error is removed (from last time)
-        map.put(errorField,null);
-        map.put(windowEndField,null);
-        break;
-      case STATUS_PAUSING:
-        map.put(statusField,statusToString(STATUS_PAUSED));
-        break;
-      case STATUS_PAUSINGSEEDING:
-        map.put(statusField,statusToString(STATUS_PAUSEDSEEDING));
-        break;
-      case STATUS_ACTIVEWAITING:
-        map.put(statusField,statusToString(STATUS_ACTIVEWAIT));
-        break;
-      case STATUS_ACTIVEWAITINGSEEDING:
-        map.put(statusField,statusToString(STATUS_ACTIVEWAITSEEDING));
-        break;
-      case STATUS_PAUSINGWAITING:
-        map.put(statusField,statusToString(STATUS_PAUSEDWAIT));
-        break;
-      case STATUS_PAUSINGWAITINGSEEDING:
-        map.put(statusField,statusToString(STATUS_PAUSEDWAITSEEDING));
-        break;
-      default:
-        throw new ManifoldCFException("Unexpected value for job status: "+Integer.toString(status));
-      }
-      performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-  
-  /** Mark job as having properly notified the output connector of completion.
-  *@param jobID is the job id.
-  */
-  public void notificationComplete(Long jobID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(idField,jobID)});
-    HashMap map = new HashMap();
-    map.put(statusField,statusToString(STATUS_INACTIVE));
-    map.put(processIDField,null);
-    map.put(failTimeField,null);
-    map.put(failCountField,null);
-    // Leave everything else around from the abort/finish.
-    performUpdate(map,"WHERE "+query,list,new StringSet(getJobStatusKey()));
-  }
-  
-  /** See if there's a reference to a connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfReference(String connectionName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(connectionNameField,connectionName)});
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+getTableName()+
-      " WHERE "+query,list,new StringSet(getJobsKey()),null);
-    return set.getRowCount() > 0;
-  }
-
-  /** See if there's a reference to a notification connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfNotificationReference(String connectionName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(notificationManager.notificationNameField,connectionName)});
-    IResultSet set = performQuery("SELECT "+notificationManager.ownerIDField+" FROM "+notificationManager.getTableName()+
-      " WHERE "+query,list,new StringSet(getJobsKey()),null);
-    return set.getRowCount() > 0;
-  }
-
-  /** See if there's a reference to an output connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfOutputReference(String connectionName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(pipelineManager.outputNameField,connectionName)});
-    IResultSet set = performQuery("SELECT "+pipelineManager.ownerIDField+" FROM "+pipelineManager.getTableName()+
-      " WHERE "+query,list,new StringSet(getJobsKey()),null);
-    return set.getRowCount() > 0;
-  }
-
-  /** See if there's a reference to a transformation connection name.
-  *@param connectionName is the name of the connection.
-  *@return true if there is a reference, false otherwise.
-  */
-  public boolean checkIfTransformationReference(String connectionName)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(pipelineManager.transformationNameField,connectionName)});
-    IResultSet set = performQuery("SELECT "+pipelineManager.ownerIDField+" FROM "+pipelineManager.getTableName()+
-      " WHERE "+query,list,new StringSet(getJobsKey()),null);
-    return set.getRowCount() > 0;
-  }
-
-  /** Get the job IDs associated with a given connection name.
-  *@param connectionName is the name of the connection.
-  *@return the set of job id's associated with that connection.
-  */
-  public IJobDescription[] findJobsForConnection(String connectionName)
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(jobsLock);
-    try
-    {
-      // Put together cache key
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getJobsKey());
-      StringSet cacheKeys = new StringSet(ssb);
-      ArrayList list = new ArrayList();
-      String query = buildConjunctionClause(list,new ClauseDescription[]{
-        new UnitaryClause(connectionNameField,connectionName)});
-
-      IResultSet set = performQuery("SELECT "+idField+","+descriptionField+" FROM "+
-        getTableName()+" WHERE "+query+
-        " ORDER BY "+descriptionField+" ASC",list,cacheKeys,null);
-
-      // Convert to an array of id's, and then load them
-      Long[] ids = new Long[set.getRowCount()];
-      boolean[] readOnlies = new boolean[set.getRowCount()];
-      for (int i = 0; i < ids.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        ids[i] = (Long)row.getValue(idField);
-        readOnlies[i] = true;
-      }
-      return loadMultiple(ids,readOnlies);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(jobsLock);
-    }
-
-  }
-
-  /** Return true if there is a job in the DELETING state.  (This matches the
-  * conditions for values to be returned from
-  * getNextDeletableDocuments).
-  *@return true if such jobs exist.
-  */
-  public boolean deletingJobsPresent()
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_DELETING))});
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+getTableName()+" WHERE "+
-      query+" "+constructOffsetLimitClause(0,1),
-      list,new StringSet(getJobStatusKey()),null,1);
-    return set.getRowCount() > 0;
-  }
-
-  /** Return true if there is a job in the
-  * SHUTTINGDOWN state.  (This matches the conditions for values to be returned from
-  * getNextCleanableDocuments).
-  *@return true if such jobs exist.
-  */
-  public boolean cleaningJobsPresent()
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(statusField,statusToString(STATUS_SHUTTINGDOWN))});
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+getTableName()+" WHERE "+
-      query+" "+constructOffsetLimitClause(0,1),
-      list,new StringSet(getJobStatusKey()),null,1);
-    return set.getRowCount() > 0;
-  }
-
-
-  /** Return true if there is a job in either the ACTIVE or the ACTIVESEEDING state.
-  * (This matches the conditions for values to be returned from getNextDocuments).
-  *@return true if such jobs exist.
-  */
-  public boolean activeJobsPresent()
-    throws ManifoldCFException
-  {
-    // To improve the postgres CPU usage of the system at rest, we do a *fast* check to be
-    // sure there are ANY jobs in an active state.
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(statusField,new Object[]{
-        statusToString(STATUS_ACTIVE),
-        statusToString(STATUS_ACTIVESEEDING)})});
-    IResultSet set = performQuery("SELECT "+idField+" FROM "+getTableName()+" WHERE "+
-      query+" "+constructOffsetLimitClause(0,1),list,new StringSet(getJobStatusKey()),null,1);
-    return set.getRowCount() > 0;
-  }
-
-  // These functions map from status to a string and back
-
-  /** Go from string to status.
-  *@param value is the string.
-  *@return the status value.
-  */
-  public static int stringToStatus(String value)
-    throws ManifoldCFException
-  {
-    Integer x = (Integer)statusMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Bad status value: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Go from status to string.
-  *@param status is the status.
-  *@return the string.
-  */
-  public static String statusToString(int status)
-    throws ManifoldCFException
-  {
-    switch (status)
-    {
-    case STATUS_INACTIVE:
-      return "N";
-    case STATUS_ACTIVE:
-      return "A";
-    case STATUS_PAUSED:
-      return "P";
-    case STATUS_SHUTTINGDOWN:
-      return "S";
-    case STATUS_NOTIFYINGOFCOMPLETION:
-      return "n";
-    case STATUS_READYFORNOTIFY:
-      return "s";
-    case STATUS_NOTIFYINGOFDELETION:
-      return "j";
-    case STATUS_READYFORDELETENOTIFY:
-      return "d";
-    case STATUS_ACTIVEWAIT:
-      return "W";
-    case STATUS_PAUSEDWAIT:
-      return "Z";
-    case STATUS_ABORTING:
-      return "X";
-    case STATUS_ABORTINGFORRESTART:
-      return "Y";
-    case STATUS_ABORTINGFORRESTARTMINIMAL:
-      return "M";
-    case STATUS_STARTINGUP:
-      return "B";
-    case STATUS_STARTINGUPMINIMAL:
-      return "b";
-    case STATUS_ABORTINGSTARTINGUPFORRESTART:
-      return "T";
-    case STATUS_ABORTINGSTARTINGUPFORRESTARTMINIMAL:
-      return "t";
-    case STATUS_READYFORSTARTUP:
-      return "C";
-    case STATUS_READYFORSTARTUPMINIMAL:
-      return "c";
-    case STATUS_READYFORDELETE:
-      return "E";
-    case STATUS_DELETESTARTINGUP:
-      return "V";
-    case STATUS_DELETING:
-      return "e";
-    case STATUS_ACTIVESEEDING:
-      return "a";
-    case STATUS_PAUSEDSEEDING:
-      return "p";
-    case STATUS_ACTIVEWAITSEEDING:
-      return "w";
-    case STATUS_PAUSEDWAITSEEDING:
-      return "z";
-    case STATUS_ABORTINGFORRESTARTSEEDING:
-      return "y";
-    case STATUS_ABORTINGFORRESTARTSEEDINGMINIMAL:
-      return "m";
-    case STATUS_ACTIVE_UNINSTALLED:
-      return "R";
-    case STATUS_ACTIVESEEDING_UNINSTALLED:
-      return "r";
-    case STATUS_DELETING_NOOUTPUT:
-      return "D";
-    
-    case STATUS_ACTIVEWAITING:
-      return "H";
-    case STATUS_ACTIVEWAITINGSEEDING:
-      return "h";
-    case STATUS_PAUSING:
-      return "F";
-    case STATUS_PAUSINGSEEDING:
-      return "f";
-    case STATUS_PAUSINGWAITING:
-      return "G";
-    case STATUS_PAUSINGWAITINGSEEDING:
-      return "g";
-    case STATUS_RESUMING:
-      return "I";
-    case STATUS_RESUMINGSEEDING:
-      return "i";
-
-    case STATUS_ABORTINGSHUTTINGDOWN:
-      return "v";
-
-    // These are deprecated
-    case STATUS_ACTIVE_NOOUTPUT:
-      return "O";
-    case STATUS_ACTIVESEEDING_NOOUTPUT:
-      return "o";
-    case STATUS_ACTIVE_NEITHER:
-      return "U";
-    case STATUS_ACTIVESEEDING_NEITHER:
-      return "u";
-
-    default:
-      throw new ManifoldCFException("Bad status value: "+Integer.toString(status));
-    }
-  }
-
-  /** Go from string to type.
-  *@param value is the string.
-  *@return the type value.
-  */
-  public static int stringToType(String value)
-    throws ManifoldCFException
-  {
-    Integer x = (Integer)typeMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Bad type value: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Go from type to string.
-  *@param type is the type.
-  *@return the string.
-  */
-  public static String typeToString(int type)
-    throws ManifoldCFException
-  {
-    switch (type)
-    {
-    case TYPE_CONTINUOUS:
-      return "C";
-    case TYPE_SPECIFIED:
-      return "S";
-    default:
-      throw new ManifoldCFException("Bad type: "+Integer.toString(type));
-    }
-  }
-
-  /** Go from string to assessment state.
-  */
-  public static int stringToAssessmentState(String value)
-    throws ManifoldCFException
-  {
-    if (value == null || value.length() == 0)
-      return ASSESSMENT_KNOWN;
-    Integer x = assessmentMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Bad assessment value: '"+value+"'");
-    return x.intValue();
-  }
-  
-  /** Go from assessment state to string.
-  */
-  public static String assessmentStateToString(int value)
-    throws ManifoldCFException
-  {
-    switch(value)
-    {
-    case ASSESSMENT_KNOWN:
-      return "Y";
-    case ASSESSMENT_UNKNOWN:
-      return "N";
-    default:
-      throw new ManifoldCFException("Unknown assessment state value "+Integer.toString(value));
-    }
-  }
-
-  /** Go from string to hopcount mode.
-  */
-  public static int stringToHopcountMode(String value)
-    throws ManifoldCFException
-  {
-    if (value == null || value.length() == 0)
-      return HOPCOUNT_ACCURATE;
-    Integer x = hopmodeMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Bad hopcount mode value: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Go from hopcount mode to string.
-  */
-  public static String hopcountModeToString(int value)
-    throws ManifoldCFException
-  {
-    switch(value)
-    {
-    case HOPCOUNT_ACCURATE:
-      return "A";
-    case HOPCOUNT_NODELETE:
-      return "N";
-    case HOPCOUNT_NEVERDELETE:
-      return "V";
-    default:
-      throw new ManifoldCFException("Unknown hopcount mode value "+Integer.toString(value));
-    }
-  }
-
-  /** Go from string to start method.
-  *@param value is the string.
-  *@return the start method value.
-  */
-  public static int stringToStartMethod(String value)
-    throws ManifoldCFException
-  {
-    Integer x = (Integer)startMap.get(value);
-    if (x == null)
-      throw new ManifoldCFException("Bad start method value: '"+value+"'");
-    return x.intValue();
-  }
-
-  /** Get from start method to string.
-  *@param startMethod is the start method.
-  *@return a string.
-  */
-  public static String startMethodToString(int startMethod)
-    throws ManifoldCFException
-  {
-    switch(startMethod)
-    {
-    case START_WINDOWBEGIN:
-      return "B";
-    case START_WINDOWINSIDE:
-      return "I";
-    case START_DISABLE:
-      return "D";
-    default:
-      throw new ManifoldCFException("Bad start method: "+Integer.toString(startMethod));
-    }
-  }
-
-
-  /** Go from string to enumerated value.
-  *@param value is the input.
-  *@return the enumerated value.
-  */
-  public static EnumeratedValues stringToEnumeratedValue(String value)
-    throws ManifoldCFException
-  {
-    if (value == null)
-      return null;
-    try
-    {
-      ArrayList valStore = new ArrayList();
-      if (!value.equals("*"))
-      {
-        int curpos = 0;
-        while (true)
-        {
-          int newpos = value.indexOf(",",curpos);
-          if (newpos == -1)
-          {
-            valStore.add(new Integer(value.substring(curpos)));
-            break;
-          }
-          valStore.add(new Integer(value.substring(curpos,newpos)));
-          curpos = newpos+1;
-        }
-      }
-      return new EnumeratedValues(valStore);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Bad number: '"+value+"'",e);
-    }
-
-  }
-
-  /** Go from enumerated value to string.
-  *@param values is the enumerated value.
-  *@return the string value.
-  */
-  public static String enumeratedValueToString(EnumeratedValues values)
-  {
-    if (values == null)
-      return null;
-    if (values.size() == 0)
-      return "*";
-    StringBuilder rval = new StringBuilder();
-    Iterator iter = values.getValues();
-    boolean first = true;
-    while (iter.hasNext())
-    {
-      if (first)
-        first = false;
-      else
-        rval.append(',');
-      rval.append(((Integer)iter.next()).toString());
-    }
-    return rval.toString();
-  }
-
-  // Cache key picture for jobs.  There is one global job cache key, and a cache key for each individual job (which is based on
-  // id).
-
-  protected static String getJobsKey()
-  {
-    return CacheKeyFactory.makeJobsKey();
-  }
-
-  protected static String getJobIDKey(Long jobID)
-  {
-    return CacheKeyFactory.makeJobIDKey(jobID.toString());
-  }
-
-  protected static String getJobStatusKey()
-  {
-    return CacheKeyFactory.makeJobStatusKey();
-  }
-
-  /** Get multiple jobs (without caching)
-  *@param ids is the set of ids to get jobs for.
-  *@return the corresponding job descriptions.
-  */
-  protected JobDescription[] getJobsMultiple(Long[] ids)
-    throws ManifoldCFException
-  {
-    // Fetch all the jobs, but only once for each ID.  Then, assign each one by id into the final array.
-    Set<Long> uniqueIDs = new HashSet<Long>();
-    for (Long id : ids)
-    {
-      uniqueIDs.add(id);
-    }
-    Map<Long,JobDescription> returnValues = new HashMap<Long,JobDescription>();
-    beginTransaction();
-    try
-    {
-      StringBuilder sb = new StringBuilder();
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = getMaxInClause();
-      for (Long uniqueID : uniqueIDs)
-      {
-        if (j == maxIn)
-        {
-          getJobsChunk(returnValues,sb.toString(),params);
-          sb.setLength(0);
-          params.clear();
-          j = 0;
-        }
-        if (j > 0)
-          sb.append(',');
-        sb.append('?');
-        params.add(uniqueID);
-        j++;
-      }
-      if (j > 0)
-        getJobsChunk(returnValues,sb.toString(),params);
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-
-    // Build the return array
-    JobDescription[] rval = new JobDescription[ids.length];
-    for (int i = 0; i < rval.length; i++)
-    {
-      Long id = ids[i];
-      JobDescription jd = returnValues.get(id);
-      if (jd != null)
-        jd.makeReadOnly();
-      rval[i] = jd;
-    }
-    return rval;
-  }
-
-  /** Read a chunk of repository connections.
-  *@param returnValues is keyed by id and contains a JobDescription value.
-  *@param idList is the list of id's.
-  *@param params is the set of parameters.
-  */
-  protected void getJobsChunk(Map<Long,JobDescription> returnValues, String idList, ArrayList params)
-    throws ManifoldCFException
-  {
-    try
-    {
-      IResultSet set;
-      set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-        idField+" IN ("+idList+")",params,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        Long id = (Long)row.getValue(idField);
-        JobDescription rc = new JobDescription();
-        rc.setID(id);
-        rc.setIsNew(false);
-        rc.setDescription(row.getValue(descriptionField).toString());
-        rc.setConnectionName(row.getValue(connectionNameField).toString());
-        rc.setType(stringToType(row.getValue(typeField).toString()));
-        rc.setStartMethod(stringToStartMethod(row.getValue(startMethodField).toString()));
-        rc.setHopcountMode(stringToHopcountMode((String)row.getValue(hopcountModeField)));
-        rc.getSpecification().fromXML(row.getValue(documentSpecField).toString());
-
-        Object x;
-
-        rc.setInterval((Long)row.getValue(intervalField));
-        rc.setMaxInterval((Long)row.getValue(maxIntervalField));
-        rc.setReseedInterval((Long)row.getValue(reseedIntervalField));
-        rc.setExpiration((Long)row.getValue(expirationField));
-
-        rc.setPriority(Integer.parseInt(row.getValue(priorityField).toString()));
-        returnValues.put(id,rc);
-      }
-
-      // Fill in schedules for jobs
-      pipelineManager.getRows(returnValues,idList,params);
-      notificationManager.getRows(returnValues,idList,params);
-      scheduleManager.getRows(returnValues,idList,params);
-      hopFilterManager.getRows(returnValues,idList,params);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Bad number: "+e.getMessage(),e);
-    }
-  }
-
-  /** Job object description class.  This class describes an object in the cache.
-  */
-  protected static class JobObjectDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected Long jobID;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public JobObjectDescription(Long jobID, StringSet invKeys)
-    {
-      super("jobdescriptioncache");
-      this.jobID = jobID;
-      criticalSectionName = getClass().getName()+"-"+jobID.toString();
-      cacheKeys = invKeys;
-    }
-
-    public Long getJobID()
-    {
-      return jobID;
-    }
-
-    public int hashCode()
-    {
-      return jobID.hashCode() ;
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof JobObjectDescription))
-        return false;
-      JobObjectDescription d = (JobObjectDescription)o;
-      return d.jobID.equals(jobID);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-  /** This is the executor object for locating job objects.
-  */
-  protected static class JobObjectExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected Jobs thisManager;
-    protected JobDescription[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the ToolManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public JobObjectExecutor(Jobs manager, JobObjectDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new JobDescription[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getJobID(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public JobDescription[] getResults(boolean[] readOnlies, int inputIndex)
-    {
-      JobDescription[] rval = new JobDescription[returnValues.length];
-      for (int i = 0; i < rval.length; i++)
-      {
-        JobDescription jd = returnValues[i];
-        if (jd != null)
-          rval[i] = jd.duplicate(readOnlies[inputIndex + i]);
-        else
-          rval[i] = null;
-      }
-      return rval;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      Long[] ids = new Long[objectDescriptions.length];
-      int i = 0;
-      while (i < ids.length)
-      {
-        JobObjectDescription desc = (JobObjectDescription)objectDescriptions[i];
-        ids[i] = desc.getJobID();
-        i++;
-      }
-
-      return thisManager.getJobsMultiple(ids);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      JobObjectDescription objectDesc = (JobObjectDescription)objectDescription;
-      JobDescription ci = (JobDescription)cachedObject;
-
-      // All objects stored in this cache are read-only; no need to duplicate them at this level.
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getJobID())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/NotificationManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/NotificationManager.java
deleted file mode 100644
index b78fe12..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/NotificationManager.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class manages the "jobnotifications" table, which contains the ordered list of notification
-* connections and their specification data.
-* 
-* <br><br>
-* <b>jobnotifications</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>ownerid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
-* <tr><td>ordinal</td><td>BIGINT</td><td></td></tr>
-* <tr><td>notificationname</td><td>VARCHAR(32)</td><td></td></tr>
-* <tr><td>connectiondesc</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>connectionspec</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class NotificationManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Schema
-  public final static String ownerIDField = "ownerid";
-  public final static String ordinalField = "ordinal";
-  public final static String notificationNameField = "notificationname";
-  public final static String connectionDescriptionField = "connectiondesc";
-  public final static String connectionSpecField = "connectionspec";
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database instance.
-  */
-  public NotificationManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"jobnotifications");
-  }
-
-  /** Install or upgrade.
-  *@param ownerTable is the name of the table that owns this one.
-  *@param owningTablePrimaryKey is the primary key of the owning table.
-  */
-  public void install(String ownerTable, String owningTablePrimaryKey,
-    String notificationTableName, String notificationTableNameField)
-    throws ManifoldCFException
-  {
-    // Standard practice: Outer loop to support upgrades
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerIDField,new ColumnDescription("BIGINT",false,false,ownerTable,owningTablePrimaryKey,false));
-        map.put(ordinalField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(notificationNameField,new ColumnDescription("VARCHAR(32)",false,true,notificationTableName,notificationTableNameField,false));
-        map.put(connectionDescriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(connectionSpecField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerIDField});
-      IndexDescription notificationNameIndex = new IndexDescription(false,new String[]{notificationNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        else if (notificationNameIndex != null && id.equals(notificationNameIndex))
-          notificationNameIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-      if (notificationNameIndex != null)
-        performAddIndex(null,notificationNameIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Build a query clause matching a set of notification connection names.
-  */
-  public void buildNotificationQueryClause(StringBuilder query, ArrayList params,
-    String parentIDField, List<String> connectionNames)
-  {
-    query.append("SELECT 'x' FROM ").append(getTableName()).append(" WHERE ");
-    query.append(buildConjunctionClause(params,new ClauseDescription[]{
-      new JoinClause(parentIDField,ownerIDField),
-      new MultiClause(notificationNameField,connectionNames)}));
-  }
-
-  /** Get all the notification connection names for a job.
-  *@param ownerID is the job ID.
-  *@return the set of connection names.
-  */
-  public String[] getNotificationConnectionNames(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    StringBuilder query = new StringBuilder("SELECT ");
-    query.append(notificationNameField).append(" FROM ").append(getTableName()).append(" WHERE ");
-    query.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)}));
-    IResultSet set = performQuery(query.toString(),newList,null,null);
-    String[] rval = new String[set.getRowCount()];
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(notificationNameField);
-    }
-    return rval;
-  }
-
-  /** Fill in a set of notifications corresponding to a set of owner id's.
-  *@param returnValues is a map keyed by ownerID, with value of JobDescription.
-  *@param ownerIDList is the list of owner id's.
-  *@param ownerIDParams is the corresponding set of owner id parameters.
-  */
-  public void getRows(Map<Long,JobDescription> returnValues, String ownerIDList, ArrayList ownerIDParams)
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+ownerIDField+" IN ("+ownerIDList+") ORDER BY "+ordinalField+" ASC",ownerIDParams,
-      null,null);
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long ownerID = (Long)row.getValue(ownerIDField);
-      String notificationName = (String)row.getValue(notificationNameField);
-      String notificationDesc = (String)row.getValue(connectionDescriptionField);
-      String notificationSpec = (String)row.getValue(connectionSpecField);
-      JobDescription jd = returnValues.get(ownerID);
-      jd.addNotification(notificationName,notificationDesc).fromXML(notificationSpec);
-    }
-  }
-
-  /** Compare rows in job description with what's currently in the database.
-  *@param ownerID is the owning identifier.
-  *@param job is a job description.
-  */
-  public boolean compareRows(Long ownerID, IJobDescription job)
-    throws ManifoldCFException
-  {
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query+" ORDER BY "+ordinalField+" ASC",params,null,null);
-    if (set.getRowCount() != job.countNotifications())
-      return false;
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      String notificationConnectionName = (String)row.getValue(notificationNameField);
-      String spec = (String)row.getValue(connectionSpecField);
-      if (spec == null)
-        spec = "";
-      if (!job.getNotificationConnectionName(i).equals(notificationConnectionName))
-        return false;
-      if (!job.getNotificationSpecification(i).toXML().equals(spec))
-        return false;
-    }
-    return true;
-  }
-  
-  /** Write a pipeline list into the database.
-  *@param ownerID is the owning identifier.
-  *@param job is the job description that is the source of the pipeline.
-  */
-  public void writeRows(Long ownerID, IJobDescription job)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      HashMap map = new HashMap();
-      for (int i = 0; i < job.countNotifications(); i++)
-      {
-        String notificationConnectionName = job.getNotificationConnectionName(i);
-        String notificationDescription = job.getNotificationDescription(i);
-        Specification os = job.getNotificationSpecification(i);
-        map.clear();
-        map.put(ownerIDField,ownerID);
-        map.put(ordinalField,new Long((long)i));
-        map.put(notificationNameField,notificationConnectionName);
-        if (notificationDescription != null && notificationDescription.length() > 0)
-          map.put(connectionDescriptionField,notificationDescription);
-        map.put(connectionSpecField,os.toXML());
-        performInsert(map,null);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Delete rows.
-  *@param ownerID is the owner whose rows to delete.
-  */
-  public void deleteRows(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)});
-      
-    performDelete("WHERE "+query,list,null);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/PipelineManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/PipelineManager.java
deleted file mode 100644
index 8d3f85d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/PipelineManager.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class manages the "pipelines" table, which contains the ordered transformation
-* connections and their specification data.
-* 
-* <br><br>
-* <b>jobpipelines</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>ownerid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
-* <tr><td>ordinal</td><td>BIGINT</td><td></td></tr>
-* <tr><td>prerequisite</td><td>BIGINT</td><td></td></tr>
-* <tr><td>outputname</td><td>VARCHAR(32)</td><td></td></tr>
-* <tr><td>transformationname</td><td>VARCHAR(32)</td><td></td></tr>
-* <tr><td>connectiondesc</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>connectionspec</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class PipelineManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Schema
-  public final static String ownerIDField = "ownerid";
-  public final static String ordinalField = "ordinal";
-  public final static String prerequisiteField = "prerequisite";
-  public final static String outputNameField = "outputname";
-  public final static String transformationNameField = "transformationname";
-  public final static String connectionDescriptionField = "connectiondesc";
-  public final static String connectionSpecField = "connectionspec";
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database instance.
-  */
-  public PipelineManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"jobpipelines");
-  }
-
-  /** Install or upgrade.
-  *@param ownerTable is the name of the table that owns this one.
-  *@param owningTablePrimaryKey is the primary key of the owning table.
-  */
-  public void install(String ownerTable, String owningTablePrimaryKey,
-    String outputTableName, String outputTableNameField,
-    String transformationTableName, String transformationTableNameField)
-    throws ManifoldCFException
-  {
-    // Standard practice: Outer loop to support upgrades
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerIDField,new ColumnDescription("BIGINT",false,false,ownerTable,owningTablePrimaryKey,false));
-        map.put(ordinalField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(prerequisiteField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(outputNameField,new ColumnDescription("VARCHAR(32)",false,true,outputTableName,outputTableNameField,false));
-        map.put(transformationNameField,new ColumnDescription("VARCHAR(32)",false,true,transformationTableName,transformationTableNameField,false));
-        map.put(connectionDescriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(connectionSpecField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerIDField});
-      IndexDescription transformationNameIndex = new IndexDescription(false,new String[]{transformationNameField});
-      IndexDescription outputNameIndex = new IndexDescription(false,new String[]{outputNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        else if (transformationNameIndex != null && id.equals(transformationNameIndex))
-          transformationNameIndex = null;
-        else if (outputNameIndex != null && id.equals(outputNameIndex))
-          outputNameIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-      if (transformationNameIndex != null)
-        performAddIndex(null,transformationNameIndex);
-      if (outputNameIndex != null)
-        performAddIndex(null,outputNameIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Build a query clause matching a set of transformation connection names.
-  */
-  public void buildTransformationQueryClause(StringBuilder query, ArrayList params,
-    String parentIDField, List<String> connectionNames)
-  {
-    query.append("SELECT 'x' FROM ").append(getTableName()).append(" WHERE ");
-    query.append(buildConjunctionClause(params,new ClauseDescription[]{
-      new JoinClause(parentIDField,ownerIDField),
-      new MultiClause(transformationNameField,connectionNames)}));
-  }
-
-  /** Build a query clause matching a set of output connection names.
-  */
-  public void buildOutputQueryClause(StringBuilder query, ArrayList params,
-    String parentIDField, List<String> connectionNames)
-  {
-    query.append("SELECT 'x' FROM ").append(getTableName()).append(" WHERE ");
-    query.append(buildConjunctionClause(params,new ClauseDescription[]{
-      new JoinClause(parentIDField,ownerIDField),
-      new MultiClause(outputNameField,connectionNames)}));
-  }
-  
-  /** Get all the transformation connection names for a job.
-  *@param ownerID is the job ID.
-  *@return the set of connection names.
-  */
-  public String[] getTransformationConnectionNames(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    StringBuilder query = new StringBuilder("SELECT ");
-    query.append(transformationNameField).append(" FROM ").append(getTableName()).append(" WHERE ");
-    query.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID),
-      new NullCheckClause(transformationNameField,false)}));
-    IResultSet set = performQuery(query.toString(),newList,null,null);
-    String[] rval = new String[set.getRowCount()];
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(transformationNameField);
-    }
-    return rval;
-  }
-
-  /** Get all the output connection names for a job.
-  *@param ownerID is the job ID.
-  *@return the set of connection names.
-  */
-  public String[] getOutputConnectionNames(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    StringBuilder query = new StringBuilder("SELECT ");
-    query.append(outputNameField).append(" FROM ").append(getTableName()).append(" WHERE ");
-    query.append(buildConjunctionClause(newList,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID),
-      new NullCheckClause(outputNameField,false)}));
-    IResultSet set = performQuery(query.toString(),newList,null,null);
-    String[] rval = new String[set.getRowCount()];
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(outputNameField);
-    }
-    return rval;
-  }
-
-  /** Fill in a set of pipelines corresponding to a set of owner id's.
-  *@param returnValues is a map keyed by ownerID, with value of JobDescription.
-  *@param ownerIDList is the list of owner id's.
-  *@param ownerIDParams is the corresponding set of owner id parameters.
-  */
-  public void getRows(Map<Long,JobDescription> returnValues, String ownerIDList, ArrayList ownerIDParams)
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+ownerIDField+" IN ("+ownerIDList+") ORDER BY "+ordinalField+" ASC",ownerIDParams,
-      null,null);
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      Long ownerID = (Long)row.getValue(ownerIDField);
-      Long prerequisite = (Long)row.getValue(prerequisiteField);
-      String outputName = (String)row.getValue(outputNameField);
-      String transformationName = (String)row.getValue(transformationNameField);
-      String transformationDesc = (String)row.getValue(connectionDescriptionField);
-      String transformationSpec = (String)row.getValue(connectionSpecField);
-      boolean isOutput = outputName != null && outputName.length() > 0;
-      int prerequisiteValue = (prerequisite == null)?-1:(int)prerequisite.longValue();
-      JobDescription jd = returnValues.get(ownerID);
-      jd.addPipelineStage(prerequisiteValue,isOutput,isOutput?outputName:transformationName,transformationDesc).fromXML(transformationSpec);
-    }
-  }
-
-  /** Compare rows in job description with what's currently in the database.
-  *@param ownerID is the owning identifier.
-  *@param job is a job description.
-  */
-  public boolean compareRows(Long ownerID, IJobDescription job)
-    throws ManifoldCFException
-  {
-    // Compute a set of the outputs
-    Set<String> outputSet = new HashSet<String>();
-    for (int i = 0; i < job.countPipelineStages(); i++)
-    {
-      if (job.getPipelineStageIsOutputConnection(i))
-      {
-        String outputName = job.getPipelineStageConnectionName(i);
-        if (outputSet.contains(outputName))
-          throw new ManifoldCFException("Output name '"+outputName+"' is duplicated within job; not allowed");
-        outputSet.add(outputName);
-      }
-    }
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query+" ORDER BY "+ordinalField+" ASC",params,null,null);
-    if (set.getRowCount() != job.countPipelineStages())
-      return false;
-    for (int i = 0; i < set.getRowCount(); i++)
-    {
-      IResultRow row = set.getRow(i);
-      String outputConnectionName = (String)row.getValue(outputNameField);
-      boolean isOutputConnection = outputConnectionName != null && outputConnectionName.length() > 0;
-      if (isOutputConnection)
-      {
-        if (!outputSet.contains(outputConnectionName))
-          throw new ManifoldCFException("Output name '"+outputConnectionName+"' removed from job; not allowed");
-      }
-      String transformationConnectionName = (String)row.getValue(transformationNameField);
-      Long prerequisite = (Long)row.getValue(prerequisiteField);
-      String spec = (String)row.getValue(connectionSpecField);
-      if (spec == null)
-        spec = "";
-      int prerequisiteValue = (prerequisite==null)?-1:(int)prerequisite.longValue();
-      if (job.getPipelineStagePrerequisite(i) != prerequisiteValue)
-        return false;
-      if (job.getPipelineStageIsOutputConnection(i) != isOutputConnection)
-        return false;
-      if (!job.getPipelineStageConnectionName(i).equals(isOutputConnection?outputConnectionName:transformationConnectionName))
-        return false;
-      if (!job.getPipelineStageSpecification(i).toXML().equals(spec))
-        return false;
-    }
-    return true;
-  }
-  
-  /** Write an output stage (part of the upgrade code).
-  */
-  public void writeOutputStage(Long ownerID, String outputConnectionName, String outputSpecification)
-    throws ManifoldCFException
-  {
-    HashMap map = new HashMap();
-    map.put(ownerIDField,ownerID);
-    map.put(ordinalField,new Long(0));
-    map.put(outputNameField,outputConnectionName);
-    map.put(connectionSpecField,outputSpecification);
-    performInsert(map,null);
-  }
-  
-  /** Write a pipeline list into the database.
-  *@param ownerID is the owning identifier.
-  *@param job is the job description that is the source of the pipeline.
-  */
-  public void writeRows(Long ownerID, IJobDescription job)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      HashMap map = new HashMap();
-      for (int i = 0; i < job.countPipelineStages(); i++)
-      {
-        boolean isOutput = job.getPipelineStageIsOutputConnection(i);
-        int prerequisite = job.getPipelineStagePrerequisite(i);
-        String pipelineConnectionName = job.getPipelineStageConnectionName(i);
-        String pipelineStageDescription = job.getPipelineStageDescription(i);
-        Specification os = job.getPipelineStageSpecification(i);
-        map.clear();
-        map.put(ownerIDField,ownerID);
-        map.put(ordinalField,new Long((long)i));
-        if (prerequisite != -1)
-          map.put(prerequisiteField,new Long(prerequisite));
-        if (isOutput)
-          map.put(outputNameField,pipelineConnectionName);
-        else
-          map.put(transformationNameField,pipelineConnectionName);
-        if (pipelineStageDescription != null && pipelineStageDescription.length() > 0)
-          map.put(connectionDescriptionField,pipelineStageDescription);
-        map.put(connectionSpecField,os.toXML());
-        performInsert(map,null);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Delete rows.
-  *@param ownerID is the owner whose rows to delete.
-  */
-  public void deleteRows(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)});
-      
-    performDelete("WHERE "+query,list,null);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/PrereqEventManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/PrereqEventManager.java
deleted file mode 100644
index 3e11eef..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/PrereqEventManager.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/* $Id: PrereqEventManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import java.util.*;
-
-/** This class manages the prerequisite event table.
-* This table lists the prerequisite event rows that must NOT exist in order for a jobqueue entry to be queued for processing.  If a prerequisite event row does, in fact,
-* exist, then queuing and processing do not take place until that row is cleared.
-* 
-* <br><br>
-* <b>prereqevents</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>owner</td><td>BIGINT</td><td>Reference:jobqueue.id</td></tr>
-* <tr><td>eventname</td><td>VARCHAR(255)</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class PrereqEventManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: PrereqEventManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Field names
-  public final static String ownerField = "owner";
-  public final static String eventNameField = "eventname";
-
-  /** Constructor.
-  *@param database is the database handle.
-  */
-  public PrereqEventManager(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"prereqevents");
-  }
-
-  /** Install or upgrade this table.
-  */
-  public void install(String ownerTableName, String ownerColumn)
-    throws ManifoldCFException
-  {
-    // Standard practice: Outer loop for upgrade support.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerField,new ColumnDescription("BIGINT",false,false,ownerTableName,ownerColumn,false));
-        map.put(eventNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Schema upgrade goes here, when needed.
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerField});
-      // eventNameIndex was proposed by postgresql team, but it did not help, so I am removing it.
-      //IndexDescription eventNameIndex = new IndexDescription(false,new String[]{eventNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        //else if (eventNameIndex != null && id.equals(eventNameIndex))
-        //  eventNameIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-      //if (eventNameIndex != null)
-      //  performAddIndex(null,eventNameIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Delete specified rows, based on jobqueue criteria. */
-  public void deleteRows(String parentTableName, String joinField, String parentCriteria, ArrayList list)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder();
-    ArrayList newList = new ArrayList();
-    
-    sb.append("WHERE EXISTS(SELECT 'x' FROM ").append(parentTableName).append(" WHERE ")
-      .append(buildConjunctionClause(newList,new ClauseDescription[]{
-        new JoinClause(joinField,getTableName() + "." + ownerField)}));
-
-    if (parentCriteria != null)
-    {
-      sb.append(" AND ").append(parentCriteria);
-      if (list != null)
-        newList.addAll(list);
-    }
-    
-    sb.append(")");
-    
-    performDelete(sb.toString(),newList,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Delete specified rows, as directly specified without a join. */
-  public void deleteRows(ArrayList list)
-    throws ManifoldCFException
-  {
-    ArrayList newList = new ArrayList();
-    String query = buildConjunctionClause(newList,new ClauseDescription[]{
-      new MultiClause(ownerField,list)});
-    performDelete("WHERE "+query,newList,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Delete rows pertaining to a single entry */
-  public void deleteRows(Long recordID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerField,recordID)});
-    performDelete(" WHERE "+query,list,null);
-    noteModifications(0,0,1);
-  }
-
-  /** Add rows pertaining to a single entry */
-  public void addRows(Long recordID, String[] eventNames)
-    throws ManifoldCFException
-  {
-    if (eventNames != null)
-    {
-      int i = 0;
-      while (i < eventNames.length)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerField,recordID);
-        map.put(eventNameField,eventNames[i++]);
-        performInsert(map,null);
-      }
-      noteModifications(i,0,0);
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/ScheduleList.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/ScheduleList.java
deleted file mode 100644
index 54fc3d3..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/ScheduleList.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/* $Id: ScheduleList.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class describes an ordered set of schedule records.  They are ordered only for
-* UI nicety, not any functional reason.
-*/
-public class ScheduleList
-{
-  public static final String _rcsid = "@(#)$Id: ScheduleList.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // This is where the records are kept.
-  protected ArrayList list = new ArrayList();
-
-  /** Constructor.
-  */
-  public ScheduleList()
-  {
-  }
-
-  /** Clear it.
-  */
-  public void clear()
-  {
-    list.clear();
-  }
-
-  /** Duplicate this list.
-  *@return the duplicate.
-  */
-  public ScheduleList duplicate()
-  {
-    ScheduleList rval = new ScheduleList();
-    int i = 0;
-    while (i < list.size())
-    {
-      rval.list.add(list.get(i));
-      i++;
-    }
-    return rval;
-  }
-
-  /** Add a record.
-  *@param sr is the record to add to the end.
-  */
-  public void addRecord(ScheduleRecord sr)
-  {
-    list.add(sr);
-  }
-
-  /** Get the number of records.
-  *@return the record count.
-  */
-  public int getRecordCount()
-  {
-    return list.size();
-  }
-
-  /** Get the specified record.
-  *@param index is the record number.
-  *@return the record.
-  */
-  public ScheduleRecord getRecord(int index)
-  {
-    return (ScheduleRecord)list.get(index);
-  }
-
-  /** Delete a record.
-  *@param index is the record number.
-  */
-  public void deleteRecord(int index)
-  {
-    list.remove(index);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/ScheduleManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/ScheduleManager.java
deleted file mode 100644
index 93e3431..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/ScheduleManager.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/* $Id: ScheduleManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class manages the "schedules" table, which contains the automatic execution schedule for each job.
-* It's separated from the main jobs table because we will need multiple timeslots per job.
-* 
-* <br><br>
-* <b>schedules</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>ownerid</td><td>BIGINT</td><td>Reference:jobs.id</td></tr>
-* <tr><td>ordinal</td><td>BIGINT</td><td></td></tr>
-* <tr><td>dayofweek</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>dayofmonth</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>monthofyear</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>yearlist</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>hourofday</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>minutesofhour</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>timezone</td><td>VARCHAR(32)</td><td></td></tr>
-* <tr><td>windowlength</td><td>BIGINT</td><td></td></tr>
-* <tr><td>requestminimum</td><td>CHAR(1)</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class ScheduleManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: ScheduleManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Schema
-  public final static String ownerIDField = "ownerid";
-  public final static String ordinalField = "ordinal";
-  public final static String dayOfWeekField = "dayofweek";
-  public final static String dayOfMonthField = "dayofmonth";
-  public final static String monthOfYearField = "monthofyear";
-  public final static String yearField = "yearlist";
-  public final static String hourOfDayField = "hourofday";
-  public final static String minutesOfHourField = "minutesofhour";
-  public final static String timezoneField = "timezone";
-  public final static String windowDurationField = "windowlength";
-  public final static String requestMinimumField = "requestminimum";
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database instance.
-  */
-  public ScheduleManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"schedules");
-  }
-
-  /** Install or upgrade.
-  *@param ownerTable is the name of the table that owns this one.
-  *@param owningTablePrimaryKey is the primary key of the owning table.
-  */
-  public void install(String ownerTable, String owningTablePrimaryKey)
-    throws ManifoldCFException
-  {
-    // Standard practice: Outer loop to support upgrades
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerIDField,new ColumnDescription("BIGINT",false,false,ownerTable,owningTablePrimaryKey,false));
-        map.put(ordinalField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(dayOfWeekField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(dayOfMonthField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(monthOfYearField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(yearField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(hourOfDayField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(minutesOfHourField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(timezoneField,new ColumnDescription("VARCHAR(32)",false,true,null,null,false));
-        map.put(windowDurationField,new ColumnDescription("BIGINT",false,true,null,null,false));
-        map.put(requestMinimumField,new ColumnDescription("CHAR(1)",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerIDField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Fill in a set of schedules corresponding to a set of owner id's.
-  *@param returnValues is a map keyed by ownerID, with value of JobDescription.
-  *@param ownerIDList is the list of owner id's.
-  *@param ownerIDParams is the corresponding set of owner id parameters.
-  */
-  public void getRows(Map<Long,JobDescription> returnValues, String ownerIDList, ArrayList ownerIDParams)
-    throws ManifoldCFException
-  {
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+ownerIDField+" IN ("+ownerIDList+") ORDER BY "+ordinalField+" ASC",ownerIDParams,
-      null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      Long ownerID = (Long)row.getValue(ownerIDField);
-      ScheduleRecord sr = new ScheduleRecord(stringToEnumeratedValue((String)row.getValue(dayOfWeekField)),
-        stringToEnumeratedValue((String)row.getValue(monthOfYearField)),
-        stringToEnumeratedValue((String)row.getValue(dayOfMonthField)),
-        stringToEnumeratedValue((String)row.getValue(yearField)),
-        stringToEnumeratedValue((String)row.getValue(hourOfDayField)),
-        stringToEnumeratedValue((String)row.getValue(minutesOfHourField)),
-        (String)row.getValue(timezoneField),
-        (Long)row.getValue(windowDurationField),
-        stringToRequestMinimumValue((String)row.getValue(requestMinimumField)));
-      returnValues.get(ownerID).addScheduleRecord(sr);
-      i++;
-    }
-  }
-
-  /** Get the max clauses that can be used with getRowsAlternate.
-  */
-  public int maxClauseGetRowsAlternate()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Fill in a set of schedules corresponding to a set of owner id's.
-  *@param returnValues is a map keyed by ownerID, with a value that is an ArrayList of ScheduleRecord objects.
-  *@param ownerIDParams is the corresponding set of owner id parameters.
-  */
-  public void getRowsAlternate(Map returnValues, ArrayList ownerIDParams)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(ownerIDField,ownerIDParams)});
-      
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+query+" ORDER BY "+ordinalField+" ASC",list,
-      null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      Long ownerID = (Long)row.getValue(ownerIDField);
-      ScheduleRecord sr = new ScheduleRecord(stringToEnumeratedValue((String)row.getValue(dayOfWeekField)),
-        stringToEnumeratedValue((String)row.getValue(monthOfYearField)),
-        stringToEnumeratedValue((String)row.getValue(dayOfMonthField)),
-        stringToEnumeratedValue((String)row.getValue(yearField)),
-        stringToEnumeratedValue((String)row.getValue(hourOfDayField)),
-        stringToEnumeratedValue((String)row.getValue(minutesOfHourField)),
-        (String)row.getValue(timezoneField),
-        (Long)row.getValue(windowDurationField),
-        stringToRequestMinimumValue((String)row.getValue(requestMinimumField)));
-      ArrayList theList = (ArrayList)returnValues.get(ownerID);
-      if (theList == null)
-      {
-        theList = new ArrayList();
-        returnValues.put(ownerID,theList);
-      }
-      theList.add(sr);
-      i++;
-    }
-  }
-
-  /** Write a schedule list into the database.
-  *@param ownerID is the owning identifier.
-  *@param list is the job description that is the source of the schedule.
-  */
-  public void writeRows(Long ownerID, IJobDescription list)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      int i = 0;
-      HashMap map = new HashMap();
-      while (i < list.getScheduleRecordCount())
-      {
-        ScheduleRecord record = list.getScheduleRecord(i);
-        map.clear();
-        map.put(dayOfWeekField,enumeratedValueToString(record.getDayOfWeek()));
-        map.put(monthOfYearField,enumeratedValueToString(record.getMonthOfYear()));
-        map.put(dayOfMonthField,enumeratedValueToString(record.getDayOfMonth()));
-        map.put(yearField,enumeratedValueToString(record.getYear()));
-        map.put(hourOfDayField,enumeratedValueToString(record.getHourOfDay()));
-        map.put(minutesOfHourField,enumeratedValueToString(record.getMinutesOfHour()));
-        map.put(timezoneField,record.getTimezone());
-        map.put(windowDurationField,record.getDuration());
-        map.put(requestMinimumField,requestMinimumValueToString(record.getRequestMinimum()));
-        map.put(ownerIDField,ownerID);
-        map.put(ordinalField,new Long((long)i));
-        performInsert(map,null);
-        i++;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Delete rows.
-  *@param ownerID is the owner whose rows to delete.
-  */
-  public void deleteRows(Long ownerID)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerIDField,ownerID)});
-      
-    performDelete("WHERE "+query,list,null);
-  }
-
-  /** Go from string to enumerated value.
-  *@param value is the input.
-  *@return the enumerated value.
-  */
-  public static EnumeratedValues stringToEnumeratedValue(String value)
-    throws ManifoldCFException
-  {
-    if (value == null)
-      return null;
-    try
-    {
-      ArrayList valStore = new ArrayList();
-      if (!value.equals("*"))
-      {
-        int curpos = 0;
-        while (true)
-        {
-          int newpos = value.indexOf(",",curpos);
-          if (newpos == -1)
-          {
-            valStore.add(new Integer(value.substring(curpos)));
-            break;
-          }
-          valStore.add(new Integer(value.substring(curpos,newpos)));
-          curpos = newpos+1;
-        }
-      }
-      return new EnumeratedValues(valStore);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ManifoldCFException("Bad number: '"+value+"'",e);
-    }
-
-  }
-
-  /** Go from enumerated value to string.
-  *@param values is the enumerated value.
-  *@return the string value.
-  */
-  public static String enumeratedValueToString(EnumeratedValues values)
-  {
-    if (values == null)
-      return null;
-    if (values.size() == 0)
-      return "*";
-    StringBuilder rval = new StringBuilder();
-    Iterator iter = values.getValues();
-    boolean first = true;
-    while (iter.hasNext())
-    {
-      if (first)
-        first = false;
-      else
-        rval.append(',');
-      rval.append(((Integer)iter.next()).toString());
-    }
-    return rval.toString();
-  }
-
-  public static String requestMinimumValueToString(boolean requestMinimum)
-  {
-    return requestMinimum?"T":"F";
-  }
-  
-  public static boolean stringToRequestMinimumValue(String requestMinimum)
-    throws ManifoldCFException
-  {
-    if (requestMinimum == null)
-      return false;
-    else if (requestMinimum.equals("T"))
-      return true;
-    else if (requestMinimum.equals("F"))
-      return false;
-    else
-      throw new ManifoldCFException("Bad requestminimum value: '"+requestMinimum+"'");
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/TrackerClass.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/TrackerClass.java
deleted file mode 100644
index 51ae464..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/TrackerClass.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.jobs;
-
-import java.util.*;
-import java.io.*;
-
-import org.apache.manifoldcf.crawler.system.Logging;
-
-/** Debugging class to keep track of recent modifications to the jobqueue table,
-* along with context as to where it occurred.  If a jobqueue state error occurs,
-* we can then print out all of the pertinent history and find the culprit.
-*/
-public class TrackerClass
-{
-  // The goal of this class is to keep track of at least some of the history
-  // potentially affecting each record.
-  protected final static long HISTORY_LENGTH = 60000L * 15;     // 15 minutes
-
-  // Active transaction
-  protected final static Map<String,TransactionData> transactionData = new HashMap<String,TransactionData>();
-  
-  // Modification history
-  protected final static List<HistoryRecord> history = new ArrayList<HistoryRecord>();
-  
-  // Place where we keep track of individual modifications
-  private TrackerClass()
-  {
-  }
-  
-  /** Add a single record event, as yet uncommitted */
-  public static void noteRecordChange(Long recordID, int newStatus, String description)
-  {
-    if (Logging.diagnostics.isDebugEnabled())
-      addChange(new RecordChange(recordID, newStatus, description));
-  }
-  
-  /** Add a global event, as yet uncommitted, which has the potential
-  * to affect any record's state in a given job.
-  */
-  public static void noteJobChange(Long jobID, String description)
-  {
-    if (Logging.diagnostics.isDebugEnabled())
-      addChange(new JobChange(jobID, description));
-  }
-  
-  /** Add a global event, as yet uncommitted, which has the potential
-  * to affect the state of any record.
-  */
-  public static void noteGlobalChange(String description)
-  {
-    if (Logging.diagnostics.isDebugEnabled())
-      addChange(new GlobalChange(description));
-  }
-  
-  protected static void addChange(DataChange dc)
-  {
-    String threadName = Thread.currentThread().getName();
-    TransactionData td;
-    synchronized (transactionData)
-    {
-      td = transactionData.get(threadName);
-      if (td == null)
-      {
-        td = new TransactionData();
-        transactionData.put(threadName,td);
-      }
-    }
-    td.addChange(dc);
-  }
-  
-  /** Note that we are about to commit.
-  */
-  public static void notePrecommit()
-  {
-    if (!Logging.diagnostics.isDebugEnabled())
-      return;
-
-    long currentTime = System.currentTimeMillis();
-    String threadName = Thread.currentThread().getName();
-
-    TransactionData td;
-    synchronized (transactionData)
-    {
-      td = transactionData.get(threadName);
-    }
-    
-    if (td == null)
-      return;
-    
-    HistoryRecord hr = new PrecommitEvent(new Exception("Precommit stack trace"),currentTime,threadName,td);
-    
-    synchronized (history)
-    {
-      history.add(hr);
-    }
-  }
-  
-  /** Note a read status operation.
-  */
-  public static void noteRead(Long recordID)
-  {
-    if (!Logging.diagnostics.isDebugEnabled())
-      return;
-    
-    long currentTime = System.currentTimeMillis();
-    String threadName = Thread.currentThread().getName();
-
-    HistoryRecord hr = new ReadEvent(new Exception("Read stack trace"),currentTime,threadName,recordID);
-    
-    synchronized (history)
-    {
-      history.add(hr);
-    }
-  }
-
-  /** Note about to read status operation.
-  */
-  public static void notePreread(Long recordID)
-  {
-    if (!Logging.diagnostics.isDebugEnabled())
-      return;
-    
-    long currentTime = System.currentTimeMillis();
-    String threadName = Thread.currentThread().getName();
-
-    HistoryRecord hr = new PrereadEvent(new Exception("Pre-read stack trace"),currentTime,threadName,recordID);
-    
-    synchronized (history)
-    {
-      history.add(hr);
-    }
-  }
-  
-  /** Note a commit operation.
-  */
-  public static void noteCommit()
-  {
-    if (!Logging.diagnostics.isDebugEnabled())
-      return;
-    
-    long currentTime = System.currentTimeMillis();
-    String threadName = Thread.currentThread().getName();
-
-    TransactionData td;
-    synchronized (transactionData)
-    {
-      td = transactionData.get(threadName);
-      transactionData.remove(threadName);
-    }
-
-    if (td == null)
-      return;
-
-    HistoryRecord hr = new CommitEvent(new Exception("Commit stack trace"),currentTime,threadName,td);
-
-    // Only keep stuff around for an hour
-    long removalCutoff = currentTime - HISTORY_LENGTH;
-    synchronized (history)
-    {
-      history.add(hr);
-      // Clean out older records
-      // MHL - this logic is wrong
-      while (history.size() > 0)
-      {
-        HistoryRecord oldRecord = history.get(0);
-        if (oldRecord.isFlushable(removalCutoff))
-          history.remove(0);
-        else
-          break;
-      }
-    }
-    
-  }
-  
-  /** Note a rollback operation.
-  */
-  public static void noteRollback()
-  {
-    if (!Logging.diagnostics.isDebugEnabled())
-      return;
-
-    String threadName = Thread.currentThread().getName();
-    synchronized (transactionData)
-    {
-      transactionData.remove(threadName);
-    }
-  }
-  
-  public static void printForensics(Long recordID, int existingStatus)
-  {
-    if (Logging.diagnostics.isDebugEnabled())
-    {
-      synchronized (transactionData)
-      {
-        synchronized (history)
-        {
-          Logging.diagnostics.debug("==== Forensics for record "+recordID+", current status: "+existingStatus+" ====");
-          Logging.diagnostics.debug("=== Current stack trace ===",new Exception("Forensics stack trace"));
-          Logging.diagnostics.debug("=== Active transactions ===");
-          for (String threadName : transactionData.keySet())
-          {
-            for (DataChange dc : transactionData.get(threadName).getChanges())
-            {
-              if (dc.applies(recordID))
-              {
-                Logging.diagnostics.debug("Thread '"+threadName+"' was doing things to this record: " + dc.getDescription());
-              }
-            }
-          }
-          Logging.diagnostics.debug("=== Pertinent History ===");
-          for (HistoryRecord hr : history)
-          {
-            if (hr.applies(recordID))
-            {
-              hr.print();
-            }
-          }
-        }
-      }
-    }
-  }
-  
-  protected static class TransactionData
-  {
-    protected final List<DataChange> changes = new ArrayList<DataChange>();
-    
-    public TransactionData()
-    {
-    }
-    
-    public void addChange(DataChange change)
-    {
-      changes.add(change);
-    }
-    
-    public List<DataChange> getChanges()
-    {
-      return changes;
-    }
-    
-    public boolean applies(Long recordID)
-    {
-      for (DataChange dc : changes)
-      {
-        if (dc.applies(recordID))
-          return true;
-      }
-      return false;
-    }
-  }
-  
-  protected abstract static class DataChange
-  {
-    protected final String description;
-    
-    public DataChange(String description)
-    {
-      this.description = description;
-    }
-    
-    public String getDescription()
-    {
-      return description;
-    }
-    
-    public abstract boolean applies(Long recordID);
-
-  }
-  
-  protected abstract static class HistoryRecord
-  {
-    protected final long timestamp;
-    protected final Exception trace;
-    protected final String threadName;
-    
-    public HistoryRecord(Exception trace, long timestamp, String threadName)
-    {
-      this.trace = trace;
-      this.timestamp = timestamp;
-      this.threadName = threadName;
-    }
-    
-    public void print(String description)
-    {
-      Logging.diagnostics.debug("== "+description+" by '"+threadName+"' at "+new Long(timestamp)+" ==",trace);
-    }
-    
-    public boolean isFlushable(long timestamp)
-    {
-      return this.timestamp < timestamp;
-    }
-
-    public abstract boolean applies(Long recordID);
-    
-    public abstract void print();
-
-  }
-  
-  protected static class CommitEvent extends HistoryRecord
-  {
-    protected final TransactionData transactionData;
-    
-    public CommitEvent(Exception trace, long timestamp, String threadName, TransactionData transactionData)
-    {
-      super(trace,timestamp,threadName);
-      this.transactionData = transactionData;
-    }
-
-    @Override
-    public void print()
-    {
-      super.print("Commit transaction");
-      Logging.diagnostics.debug("    Transaction includes:");
-      for (DataChange dc : transactionData.getChanges())
-      {
-        Logging.diagnostics.debug("      "+dc.getDescription());
-      }
-    }
-    
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return transactionData.applies(recordID);
-    }
-    
-  }
-
-  protected static class PrecommitEvent extends HistoryRecord
-  {
-    protected final TransactionData transactionData;
-    
-    public PrecommitEvent(Exception trace, long timestamp, String threadName, TransactionData transactionData)
-    {
-      super(trace,timestamp,threadName);
-      this.transactionData = transactionData;
-    }
-
-    @Override
-    public void print()
-    {
-      super.print("About to commit transaction");
-      Logging.diagnostics.debug("    Transaction includes:");
-      for (DataChange dc : transactionData.getChanges())
-      {
-        Logging.diagnostics.debug("      "+dc.getDescription());
-      }
-    }
-        
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return transactionData.applies(recordID);
-    }
-  }
-  
-  protected static class ReadEvent extends HistoryRecord
-  {
-    protected final Long recordID;
-    
-    public ReadEvent(Exception trace, long timestamp, String threadName, Long recordID)
-    {
-      super(trace,timestamp,threadName);
-      this.recordID = recordID;
-    }
-    
-    @Override
-    public void print()
-    {
-      super.print("Read status");
-    }
-    
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return recordID.equals(this.recordID);
-    }
-  }
-
-  protected static class PrereadEvent extends HistoryRecord
-  {
-    protected final Long recordID;
-    
-    public PrereadEvent(Exception trace, long timestamp, String threadName, Long recordID)
-    {
-      super(trace,timestamp,threadName);
-      this.recordID = recordID;
-    }
-    
-    @Override
-    public void print()
-    {
-      super.print("About to read status");
-    }
-    
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return recordID.equals(this.recordID);
-    }
-  }
-  
-  protected static class RecordChange extends DataChange
-  {
-    protected final Long recordID;
-    protected final int newStatus;
-    
-    public RecordChange(Long recordID, int newStatus, String description)
-    {
-      super(description);
-      this.recordID = recordID;
-      this.newStatus = newStatus;
-    }
-    
-    @Override
-    public String getDescription()
-    {
-      return "Record "+recordID+" status modified to "+newStatus+": "+super.getDescription();
-    }
-    
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return recordID.equals(this.recordID);
-    }
-  }
-  
-  protected static class JobChange extends DataChange
-  {
-    protected final Long jobID;
-    
-    public JobChange(Long jobID, String description)
-    {
-      super(description);
-      this.jobID = jobID;
-    }
-    
-    @Override
-    public String getDescription()
-    {
-      return "All job related records modified for job "+jobID+": "+super.getDescription();
-    }
-    
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return true;
-    }
-  }
-  
-  protected static class GlobalChange extends DataChange
-  {
-    public GlobalChange(String description)
-    {
-      super(description);
-    }
-    
-    @Override
-    public String getDescription()
-    {
-      return "All records modified: "+super.getDescription();
-    }
-
-    @Override
-    public boolean applies(Long recordID)
-    {
-      return true;
-    }
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notification/NotificationConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notification/NotificationConnection.java
deleted file mode 100644
index dc2ac49..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notification/NotificationConnection.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notification;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** An instance of this class represents a persistently-stored notification connection description.
-* This is the paper object meant for editing and manipulation.
-*/
-public class NotificationConnection implements INotificationConnection
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-  protected String className = null;
-  protected ConfigParams configParams = new ConfigParams();
-  protected int maxCount = 100;
-
-  /** Constructor.
-  */
-  public NotificationConnection()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public NotificationConnection duplicate()
-  {
-    NotificationConnection rval = new NotificationConnection();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    rval.className = className;
-    rval.maxCount = maxCount;
-    rval.configParams = configParams.duplicate();
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  @Override
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  @Override
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-
-  /** Set name.
-  *@param name is the name.
-  */
-  @Override
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  @Override
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  @Override
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  @Override
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  @Override
-  public void setClassName(String className)
-  {
-    this.className = className;
-  }
-
-  /** Get the class name.
-  *@return the class name
-  */
-  @Override
-  public String getClassName()
-  {
-    return className;
-  }
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  @Override
-  public ConfigParams getConfigParams()
-  {
-    return configParams;
-  }
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  @Override
-  public void setMaxConnections(int maxCount)
-  {
-    this.maxCount = maxCount;
-  }
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  @Override
-  public int getMaxConnections()
-  {
-    return maxCount;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notification/NotificationConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notification/NotificationConnectionManager.java
deleted file mode 100644
index f213ece..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notification/NotificationConnectionManager.java
+++ /dev/null
@@ -1,842 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notification;
-
-import java.util.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-
-/** This class is the manager of the notification connection description.  Inside, multiple database tables are managed,
-* with appropriate caching.
-* Note well: The database handle is instantiated here using the DBInterfaceFactory.  This is acceptable because the
-* actual database that this table is located in is fixed.
-* 
-* <br><br>
-* <b>notificationconnections</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>connectionname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
-* <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>classname</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>maxcount</td><td>BIGINT</td><td></td></tr>
-* <tr><td>configxml</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-*
-*/
-public class NotificationConnectionManager extends org.apache.manifoldcf.core.database.BaseTable implements INotificationConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Special field suffix
-  private final static String passwordSuffix = "password";
-
-  // Database fields
-  protected final static String nameField = "connectionname";     // Changed this to work around constraint bug in postgresql
-  protected final static String descriptionField = "description";
-  protected final static String classNameField = "classname";
-  protected final static String maxCountField = "maxcount";
-  protected final static String configField = "configxml";
-
-  protected static Random random = new Random();
-
-  // Cache manager
-  protected final ICacheManager cacheManager;
-  // Thread context
-  protected final IThreadContext threadContext;
-  // Lock manager
-  protected final ILockManager lockManager;
-  
-  protected final String notificationsLock = "NOTIFICATIONS_LOCK";
-  
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public NotificationConnectionManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"notificationconnections");
-
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-
-    // Always use a loop, and no transaction, as we may need to retry due to upgrade
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the "objects" table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(maxCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(configField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code
-      }
-
-      // Index management
-      IndexDescription classIndex = new IndexDescription(false,new String[]{classNameField});
-      
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (classIndex != null && id.equals(classIndex))
-          classIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (classIndex != null)
-        performAddIndex(null,classIndex);
-      
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Export configuration */
-  @Override
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,1);
-    // Get the authority list
-    INotificationConnection[] list = getAllConnections();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual repository connection info
-    int i = 0;
-    while (i < list.length)
-    {
-      INotificationConnection conn = list[i++];
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-      ManifoldCF.writeString(os,conn.getClassName());
-      ManifoldCF.writeString(os,conn.getConfigParams().toXML());
-      ManifoldCF.writeDword(os,conn.getMaxConnections());
-    }
-  }
-
-  /** Import configuration */
-  @Override
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version != 1)
-      throw new java.io.IOException("Unknown notification connection configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    int i = 0;
-    while (i < count)
-    {
-      INotificationConnection conn = create();
-      conn.setName(ManifoldCF.readString(is));
-      conn.setDescription(ManifoldCF.readString(is));
-      conn.setClassName(ManifoldCF.readString(is));
-      conn.getConfigParams().fromXML(ManifoldCF.readString(is));
-      conn.setMaxConnections(ManifoldCF.readDword(is));
-      // Attempt to save this connection
-      save(conn);
-      i++;
-    }
-  }
-
-  /** Obtain a list of the notification connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  @Override
-  public INotificationConnection[] getAllConnections()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(notificationsLock);
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getNotificationConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(notificationsLock);
-    }
-  }
-
-  /** Load a notification connection by name.
-  *@param name is the name of the notification connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  @Override
-  public INotificationConnection load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  protected final static int FETCH_MAX = 200;
-  
-  /** Load multiple notification connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  @Override
-  public INotificationConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    INotificationConnection[] rval = new INotificationConnection[names.length];
-    if (names.length == 0)
-      return rval;
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (names.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,names,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,names,inputIndex,names.length-inputIndex);
-    return rval;
-  }
-  
-  protected int loadMultipleInternal(INotificationConnection[] rval, int outputIndex, String[] fetchNames, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    NotificationConnectionDescription[] objectDescriptions = new NotificationConnectionDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      ssb.clear();
-      String name = fetchNames[inputIndex + i];
-      ssb.add(getNotificationConnectionKey(name));
-      objectDescriptions[i] = new NotificationConnectionDescription(name,new StringSet(ssb));
-    }
-
-    NotificationConnectionExecutor exec = new NotificationConnectionExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    INotificationConnection[] results = exec.getResults();
-    for (INotificationConnection result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Create a new notification connection object.
-  *@return the new object.
-  */
-  @Override
-  public INotificationConnection create()
-    throws ManifoldCFException
-  {
-    NotificationConnection rval = new NotificationConnection();
-    return rval;
-  }
-
-  /** Save a notification connection object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  @Override
-  public boolean save(INotificationConnection object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getNotificationConnectionsKey());
-    ssb.add(getNotificationConnectionKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      // Catch deadlock condition
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(notificationsLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              // Notify of a change to the configuration
-              ManifoldCF.noteConfigurationChange();
-              boolean isNew = object.getIsNew();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,object.getDescription());
-              values.put(classNameField,object.getClassName());
-              values.put(maxCountField,new Long((long)object.getMaxConnections()));
-              String configXML = object.getConfigParams().toXML();
-              values.put(configField,configXML);
-              boolean notificationNeeded = false;
-              boolean isCreated;
-              
-              if (set.getRowCount() > 0)
-              {
-                // If the object is supposedly new, it is bad that we found one that already exists.
-                if (isNew)
-                  throw new ManifoldCFException("Notification connection '"+object.getName()+"' already exists");
-                isCreated = false;
-                IResultRow row = set.getRow(0);
-                String oldXML = (String)row.getValue(configField);
-                if (oldXML == null || !oldXML.equals(configXML))
-                  notificationNeeded = true;
-                
-                // Update
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(nameField,object.getName())});
-                performUpdate(values," WHERE "+query,params,null);
-              }
-              else
-              {
-                // If the object is not supposed to be new, it is bad that we did not find one.
-                if (!isNew)
-                  throw new ManifoldCFException("Notification connection '"+object.getName()+"' no longer exists");
-                isCreated = true;
-                // Insert
-                values.put(nameField,object.getName());
-                // We only need the general key because this is new.
-                performInsert(values,null);
-              }
-
-              // If notification required, do it.
-              if (notificationNeeded)
-              {
-                IJobManager jobManager = JobManagerFactory.make(threadContext);
-                jobManager.noteNotificationConnectionChange(object.getName());
-              }
-
-              cacheManager.invalidateKeys(ch);
-              return isCreated;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(notificationsLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete a notification connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  @Override
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-    // Grab a job manager handle.  We will need to check if any jobs refer to this connection.
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getNotificationConnectionsKey());
-    ssb.add(getNotificationConnectionKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-    lockManager.enterNonExWriteLock(notificationsLock);
-    try
-    {
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-        beginTransaction();
-        try
-        {
-          // Check if any jobs refer to this connection name
-          if (jobManager.checkIfNotificationReference(name))
-            throw new ManifoldCFException("Can't delete notification connection '"+name+"': existing jobs refer to it");
-          ManifoldCF.noteConfigurationChange();
-          ArrayList params = new ArrayList();
-          String query = buildConjunctionClause(params,new ClauseDescription[]{
-            new UnitaryClause(nameField,name)});
-          performDelete("WHERE "+query,params,null);
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(notificationsLock);
-    }
-  }
-
-  /** Get a list of notification connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the notification connections that use that connector.
-  */
-  @Override
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getNotificationConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(classNameField,className)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(nameField);
-      i++;
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  @Override
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getNotificationConnectionKey(name));
-      StringSet localCacheKeys = new StringSet(ssb);
-      ArrayList params = new ArrayList();
-      String query = buildConjunctionClause(params,new ClauseDescription[]{
-        new UnitaryClause(nameField,name)});
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName()+" WHERE "+query,params,
-        localCacheKeys,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("No such connection: '"+name+"'");
-      IResultRow row = set.getRow(0);
-      String className = (String)row.getValue(classNameField);
-      INotificationConnectorManager cm = NotificationConnectorManagerFactory.make(threadContext);
-      return cm.isInstalled(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  // Schema related
-  /** Return the name column.
-  *@return the name column.
-  */
-  @Override
-  public String getConnectionNameColumn()
-  {
-    return nameField;
-  }
-
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // repository connections.
-
-  /** Construct a key which represents the general list of notification connectors.
-  *@return the cache key.
-  */
-  protected static String getNotificationConnectionsKey()
-  {
-    return CacheKeyFactory.makeNotificationConnectionsKey();
-  }
-
-  /** Construct a key which represents an individual notification connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getNotificationConnectionKey(String connectionName)
-  {
-    return CacheKeyFactory.makeNotificationConnectionKey(connectionName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple notification connections at a single time.
-  *@param connectionNames are a list of connection names.
-  *@return the corresponding repository connection objects.
-  */
-  protected NotificationConnection[] getNotificationConnectionsMultiple(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    NotificationConnection[] rval = new NotificationConnection[connectionNames.length];
-    HashMap returnIndex = new HashMap();
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(connectionNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetNotificationConnectionsChunk();
-      while (i < connectionNames.length)
-      {
-        if (j == maxIn)
-        {
-          getNotificationConnectionsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(connectionNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getNotificationConnectionsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Calculate how many notification connections to get at once.
-  */
-  protected int maxClauseGetNotificationConnectionsChunk()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-  
-  /** Read a chunk of notification connections.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getNotificationConnectionsChunk(NotificationConnection[] rval, Map returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = ((Integer)returnIndex.get(name)).intValue();
-      NotificationConnection rc = new NotificationConnection();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rc.setClassName((String)row.getValue(classNameField));
-      rc.setMaxConnections((int)((Long)row.getValue(maxCountField)).longValue());
-      String xml = (String)row.getValue(configField);
-      if (xml != null && xml.length() > 0)
-        rc.getConfigParams().fromXML(xml);
-      rval[index] = rc;
-    }
-
-  }
-
-  // The cached instance will be a NotificationConnection.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for a repository connection object.
-  */
-  protected static class NotificationConnectionDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String connectionName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public NotificationConnectionDescription(String connectionName, StringSet invKeys)
-    {
-      super("notificationconnectioncache");
-      this.connectionName = connectionName;
-      criticalSectionName = getClass().getName()+"-"+connectionName;
-      cacheKeys = invKeys;
-    }
-
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-
-    public int hashCode()
-    {
-      return connectionName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof NotificationConnectionDescription))
-        return false;
-      NotificationConnectionDescription d = (NotificationConnectionDescription)o;
-      return d.connectionName.equals(connectionName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating notification connection objects.
-  */
-  protected static class NotificationConnectionExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected NotificationConnectionManager thisManager;
-    protected NotificationConnection[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the NotificationManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public NotificationConnectionExecutor(NotificationConnectionManager manager, NotificationConnectionDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new NotificationConnection[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getConnectionName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public NotificationConnection[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      String[] connectionNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < connectionNames.length)
-      {
-        NotificationConnectionDescription desc = (NotificationConnectionDescription)objectDescriptions[i];
-        connectionNames[i] = desc.getConnectionName();
-        i++;
-      }
-
-      return thisManager.getNotificationConnectionsMultiple(connectionNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      NotificationConnectionDescription objectDesc = (NotificationConnectionDescription)objectDescription;
-      NotificationConnection ci = (NotificationConnection)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getConnectionName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notificationconnectorpool/NotificationConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notificationconnectorpool/NotificationConnectorPool.java
deleted file mode 100644
index 690d72c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notificationconnectorpool/NotificationConnectorPool.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notificationconnectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An implementation of INotificationConnectorPool.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public class NotificationConnectorPool implements INotificationConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Local connector pool */
-  protected final static LocalPool localPool = new LocalPool();
-
-  // This implementation is a place-holder for the real one, which will likely fold in the pooling code
-  // as we strip it out of RepositoryConnectorFactory.
-
-  /** Thread context */
-  protected final IThreadContext threadContext;
-  
-  /** Constructor */
-  public NotificationConnectorPool(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get multiple notification connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param notificationConnections are the connections to use the build the connector instances.
-  */
-  @Override
-  public INotificationConnector[] grabMultiple(String[] orderingKeys, INotificationConnection[] notificationConnections)
-    throws ManifoldCFException
-  {
-    // For now, use the NotificationConnectorFactory method.  This will require us to extract info
-    // from each notification connection, however.
-    String[] connectionNames = new String[notificationConnections.length];
-    String[] classNames = new String[notificationConnections.length];
-    ConfigParams[] configInfos = new ConfigParams[notificationConnections.length];
-    int[] maxPoolSizes = new int[notificationConnections.length];
-    
-    for (int i = 0; i < notificationConnections.length; i++)
-    {
-      connectionNames[i] = notificationConnections[i].getName();
-      classNames[i] = notificationConnections[i].getClassName();
-      configInfos[i] = notificationConnections[i].getConfigParams();
-      maxPoolSizes[i] = notificationConnections[i].getMaxConnections();
-    }
-    return localPool.grabMultiple(threadContext,
-      orderingKeys, connectionNames, classNames, configInfos, maxPoolSizes);
-  }
-
-  /** Get a notification connector.
-  * The connector is specified by a notification connection object.
-  *@param authorityConnection is the notification connection to base the connector instance on.
-  */
-  @Override
-  public INotificationConnector grab(INotificationConnection notificationConnection)
-    throws ManifoldCFException
-  {
-    return localPool.grab(threadContext, notificationConnection.getName(), notificationConnection.getClassName(),
-      notificationConnection.getConfigParams(), notificationConnection.getMaxConnections());
-  }
-
-  /** Release multiple notification connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  @Override
-  public void releaseMultiple(INotificationConnection[] connections, INotificationConnector[] connectors)
-    throws ManifoldCFException
-  {
-    String[] connectionNames = new String[connections.length];
-    for (int i = 0; i < connections.length; i++)
-    {
-      connectionNames[i] = connections[i].getName();
-    }
-    localPool.releaseMultiple(threadContext, connectionNames, connectors);
-  }
-
-  /** Release a notification connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  @Override
-  public void release(INotificationConnection connection, INotificationConnector connector)
-    throws ManifoldCFException
-  {
-    localPool.release(threadContext, connection.getName(), connector);
-  }
-
-  /** Idle notification for inactive repository connector handles.
-  * This method polls all inactive handles.
-  */
-  @Override
-  public void pollAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.pollAllConnectors(threadContext);
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  @Override
-  public void flushUnusedConnectors()
-    throws ManifoldCFException
-  {
-    localPool.flushUnusedConnectors(threadContext);
-  }
-
-  /** Clean up all open repository connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  @Override
-  public void closeAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.closeAllConnectors(threadContext);
-  }
-
-  /** Actual static mapping connector pool */
-  protected static class LocalPool extends org.apache.manifoldcf.core.connectorpool.ConnectorPool<INotificationConnector>
-  {
-    public LocalPool()
-    {
-      super("_NOTIFICATIONCONNECTORPOOL_");
-    }
-    
-    @Override
-    protected boolean isInstalled(IThreadContext tc, String className)
-      throws ManifoldCFException
-    {
-      INotificationConnectorManager connectorManager = NotificationConnectorManagerFactory.make(tc);
-      return connectorManager.isInstalled(className);
-    }
-
-    @Override
-    protected boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-      throws ManifoldCFException
-    {
-      INotificationConnectionManager connectionManager = NotificationConnectionManagerFactory.make(tc);
-      return connectionManager.load(connectionName) != null;
-    }
-
-    public INotificationConnector[] grabMultiple(IThreadContext tc, String[] orderingKeys, String[] connectionNames, String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-      throws ManifoldCFException
-    {
-      return grabMultiple(tc,INotificationConnector.class,orderingKeys,connectionNames,classNames,configInfos,maxPoolSizes);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notificationconnmgr/NotificationConnectorManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notificationconnmgr/NotificationConnectorManager.java
deleted file mode 100644
index 854efa5..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notificationconnmgr/NotificationConnectorManager.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notificationconnmgr;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import java.util.*;
-
-/** Implementation of INotificationConnectorManager.
- * 
- * <br><br>
- * <b>connectors</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>classname</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class NotificationConnectorManager extends org.apache.manifoldcf.core.database.BaseTable implements INotificationConnectorManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Fields
-  protected static final String descriptionField = "description";
-  protected static final String classNameField = "classname";
-
-  // Thread context
-  protected IThreadContext threadContext;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  *@param database is the database handle.
-  */
-  public NotificationConnectorManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"notificationconnectors");
-    this.threadContext = threadContext;
-  }
-
-
-  /** Install or upgrade.
-  */
-  @Override
-  public void install()
-    throws ManifoldCFException
-  {
-    // Always do an outer loop, to support upgrade complexities
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
-
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade goes here if needed
-      }
-      
-      // Index management
-      IndexDescription descriptionIndex = new IndexDescription(true,new String[]{descriptionField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (descriptionIndex != null && id.equals(descriptionIndex))
-          descriptionIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (descriptionIndex != null)
-        performAddIndex(null,descriptionIndex);
-
-      break;
-    }
-  }
-
-
-  /** Uninstall.  This also unregisters all connectors.
-  */
-  @Override
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    // First, go through all registered connectors.  This is all inside a transaction.
-    beginTransaction();
-    try
-    {
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName(),null,null,null);
-      int i = 0;
-      while (i < set.getRowCount())
-      {
-        IResultRow row = set.getRow(i++);
-        String className = row.getValue(classNameField).toString();
-        // Call the deinstall method
-        NotificationConnectorFactory.deinstall(threadContext,className);
-      }
-      performDrop(invKeys);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Register a new connector.
-  * The connector's install method will also be called.
-  *@param description is the description to use in the UI.
-  *@param className is the class name.
-  */
-  @Override
-  public void registerConnector(String description, String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      //performLock();
-      // See if already there.
-      ArrayList params = new ArrayList();
-      params.add(className);
-      IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=? FOR UPDATE",params,null,null);
-      HashMap map = new HashMap();
-      map.put(descriptionField,description);
-      if (set.getRowCount() == 0)
-      {
-        // Insert it into table first.
-        map.put(classNameField,className);
-        performInsert(map,invKeys);
-      }
-      else
-      {
-        performUpdate(map,"WHERE "+classNameField+"=?",params,invKeys);
-      }
-
-      // Either way, we must do the install/upgrade itself.
-      NotificationConnectorFactory.install(threadContext,className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Unregister a connector.
-  * The connector's deinstall method will also be called.
-  *@param className is the class of the connector to unregister.
-  */
-  @Override
-  public void unregisterConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    beginTransaction();
-    try
-    {
-      // Uninstall first
-      NotificationConnectorFactory.deinstall(threadContext,className);
-
-      removeConnector(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Remove a connector.
-  * Use this method when the connector doesn't seem to be in the
-  * classpath, so deregistration cannot occur.
-  *@param className is the connector class to remove.
-  */
-  @Override
-  public void removeConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-    ArrayList list = new ArrayList();
-    list.add(className);
-    performDelete("WHERE "+classNameField+"=?",list,invKeys);
-  }
-
-  /** Get ordered list of connectors.
-  *@return a resultset with the columns "description" and "classname".
-  * These will be ordered by description.
-  */
-  @Override
-  public IResultSet getConnectors()
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    return performQuery("SELECT "+descriptionField+" AS description,"+classNameField+" AS classname FROM "+
-      getTableName()+" ORDER BY "+descriptionField+" ASC",null,invKeys,null);
-  }
-
-  /** Get a description given a class name.
-  *@param className is the class name.
-  *@return the description, or null if the class is not registered.
-  */
-  @Override
-  public String getDescription(String className)
-    throws ManifoldCFException
-  {
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT "+descriptionField+" FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    if (set.getRowCount() == 0)
-      return null;
-    IResultRow row = set.getRow(0);
-    return row.getValue(descriptionField).toString();
-  }
-
-  /** Check if a particular connector is installed or not.
-  *@param className is the class name of the connector.
-  *@return true if installed, false otherwise.
-  */
-  @Override
-  public boolean isInstalled(String className)
-    throws ManifoldCFException
-  {
-    // Use the global table key; that's good enough because we don't expect stuff to change out from under very often.
-    StringSet invKeys = new StringSet(getCacheKey());
-
-    ArrayList list = new ArrayList();
-    list.add(className);
-    IResultSet set = performQuery("SELECT * FROM "+
-      getTableName()+" WHERE "+classNameField+"=?",list,invKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-
-
-  // Protected methods
-
-  /** Get the cache key for the connector manager table.
-  *@return the cache key
-  */
-  protected String getCacheKey()
-  {
-    return CacheKeyFactory.makeTableKey(null,getTableName(),getDBInterface().getDatabaseName());
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notifications/BaseNotificationConnector.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notifications/BaseNotificationConnector.java
deleted file mode 100644
index fe60ab7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/notifications/BaseNotificationConnector.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.notifications;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import java.io.*;
-import java.util.*;
-
-/** This base class describes an instance of a connection between a notification engine and ManifoldCF's
-* standard "pull" ingestion agent.
-*
-* Each instance of this interface is used in only one thread at a time.  Connection Pooling
-* on these kinds of objects is performed by the factory which instantiates repository connectors
-* from symbolic names and config parameters, and is pooled by these parameters.  That is, a pooled connector
-* handle is used only if all the connection parameters for the handle match.
-*
-* Implementers of this interface should provide a default constructor which has this signature:
-*
-* xxx();
-*
-* Connectors are either configured or not.  If configured, they will persist in a pool, and be
-* reused multiple times.  Certain methods of a connector may be called before the connector is
-* configured.  This includes basically all methods that permit inspection of the connector's
-* capabilities.
-*
-*
-* The purpose of the notification connector is to notify people of job interruptions.
-*
-*/
-public abstract class BaseNotificationConnector extends org.apache.manifoldcf.core.connector.BaseConnector implements INotificationConnector
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Request arbitrary connector information.
-  * This method is called directly from the API in order to allow API users to perform any one of several connector-specific
-  * queries.
-  *@param output is the response object, to be filled in by this method.
-  *@param command is the command, which is taken directly from the API request.
-  *@return true if the resource is found, false if not.  In either case, output may be filled in.
-  */
-  @Override
-  public boolean requestInfo(Configuration output, String command)
-    throws ManifoldCFException
-  {
-    return false;
-  }
-
-  /** Notify of job stop due to error abort.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopErrorAbort(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    notifyOfJobStop(spec);
-  }
-
-  /** Notify of job stop due to manual abort.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopManualAbort(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    notifyOfJobStop(spec);
-  }
-
-  /** Notify of job stop due to manual pause.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopManualPause(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    notifyOfJobStop(spec);
-  }
-
-  /** Notify of job stop due to schedule pause.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopSchedulePause(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    notifyOfJobStop(spec);
-  }
-
-  /** Notify of job stop due to restart.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobStopRestart(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    notifyOfJobStop(spec);
-  }
-
-  /** Notify of job stop.
-  *@param spec is the notification specification.
-  */
-  public void notifyOfJobStop(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-  }
-
-  /** Notify of job end.
-  *@param spec is the notification specification.
-  */
-  @Override
-  public void notifyOfJobEnd(Specification spec)
-    throws ManifoldCFException, ServiceInterruption
-  {
-  }
-
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch is involved in setting up connection configuration information.  The second bunch
-  // is involved in presenting and editing document specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-
-  /** Obtain the name of the form check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form check javascript method.
-  */
-  @Override
-  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecification";
-    //return "checkSpecification";
-  }
-
-  /** Obtain the name of the form presave check javascript method to call.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return the name of the form presave check javascript method.
-  */
-  @Override
-  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
-  {
-    return "s"+connectionSequenceNumber+"_checkSpecificationForSave";
-    //return "checkSpecificationForSave";
-  }
-
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to add the required tabs to the list, and to output any javascript methods
-  * that might be needed by the job editing HTML.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  @Override
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, List<String> tabsArray)
-    throws ManifoldCFException, IOException
-  {
-  }
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected a repository connection of the
-  * current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate
-  *  <html>, <body>, and <form> tags.  The name of the form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@param actualSequenceNumber is the connection within the job that has currently been selected.
-  *@param tabName is the current tab name.  (actualSequenceNumber, tabName) form a unique tuple within
-  *  the job.
-  */
-  @Override
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form
-  * data for a connection has been posted.  Its purpose is to gather form information and modify the
-  * document specification accordingly.  The name of the posted form is always "editjob".
-  * The connector will be connected before this method can be called.
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of
-  * the job (and cause a redirection to an error page).
-  */
-  @Override
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException
-  {
-    return null;
-  }
-
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the document
-  * specification information to the user.  The coder can presume that the HTML that is output from
-  * this configuration will be within appropriate <html> and <body> tags.
-  * The connector will be connected before this method can be called.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the locale the output is preferred to be in.
-  *@param ds is the current document specification for this job.
-  *@param connectionSequenceNumber is the unique number of this connection within the job.
-  */
-  @Override
-  public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds,
-    int connectionSequenceNumber)
-    throws ManifoldCFException, IOException
-  {
-  }
-
-}
-
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryConnection.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryConnection.java
deleted file mode 100644
index 21f97af..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryConnection.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/* $Id: RepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.repository;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** An instance of this class represents a persistently-stored repository connection description.
-* This is the paper object meant for editing and manipulation.
-*/
-public class RepositoryConnection implements IRepositoryConnection
-{
-  public static final String _rcsid = "@(#)$Id: RepositoryConnection.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // data
-  protected boolean isNew = true;
-  protected String name = null;
-  protected String description = null;
-  protected String className = null;
-  protected String authorityName = null;
-  protected ConfigParams configParams = new ConfigParams();
-  protected int maxCount = 100;
-
-  // Throttles.  Keyed by regexp, and has ThrottleItem values.
-  protected HashMap throttles = new HashMap();
-
-  /** Constructor.
-  */
-  public RepositoryConnection()
-  {
-  }
-
-  /** Clone this object.
-  *@return the cloned object.
-  */
-  public RepositoryConnection duplicate()
-  {
-    RepositoryConnection rval = new RepositoryConnection();
-    rval.isNew = isNew;
-    rval.name = name;
-    rval.description = description;
-    rval.className = className;
-    rval.authorityName = authorityName;
-    rval.maxCount = maxCount;
-    rval.configParams = configParams.duplicate();
-    Iterator iter = throttles.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String key = (String)iter.next();
-      ThrottleItem ti = (ThrottleItem)throttles.get(key);
-      rval.throttles.put(key,ti);
-    }
-    return rval;
-  }
-
-  /** Set 'isnew' condition.
-  *@param isnew true if this is a new instance.
-  */
-  public void setIsNew(boolean isnew)
-  {
-    this.isNew = isnew;
-  }
-  
-  /** Get 'isnew' condition.
-  *@return true if this is a new connection, false otherwise.
-  */
-  public boolean getIsNew()
-  {
-    return isNew;
-  }
-
-  /** Set name.
-  *@param name is the name.
-  */
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
-  /** Get name.
-  *@return the name
-  */
-  public String getName()
-  {
-    return name;
-  }
-
-  /** Set description.
-  *@param description is the description.
-  */
-  public void setDescription(String description)
-  {
-    this.description = description;
-  }
-
-  /** Get description.
-  *@return the description
-  */
-  public String getDescription()
-  {
-    return description;
-  }
-
-  /** Set the class name.
-  *@param className is the class name.
-  */
-  public void setClassName(String className)
-  {
-    this.className = className;
-  }
-
-  /** Get the class name.
-  *@return the class name
-  */
-  public String getClassName()
-  {
-    return className;
-  }
-
-  /** Set the ACL authority name.
-  *@param authorityName is the ACL authority name.
-  */
-  public void setACLAuthority(String authorityName)
-  {
-    this.authorityName = authorityName;
-  }
-
-  /** Get the ACL authority name.
-  *@return the ACL authority name.
-  */
-  public String getACLAuthority()
-  {
-    return authorityName;
-  }
-
-  /** Get the configuration parameters.
-  *@return the map.  Can be modified.
-  */
-  public ConfigParams getConfigParams()
-  {
-    return configParams;
-  }
-
-  /** Set the maximum size of the connection pool.
-  *@param maxCount is the maximum connection count per JVM.
-  */
-  public void setMaxConnections(int maxCount)
-  {
-    this.maxCount = maxCount;
-  }
-
-  /** Get the maximum size of the connection pool.
-  *@return the maximum size.
-  */
-  public int getMaxConnections()
-  {
-    return maxCount;
-  }
-
-  /** Clear all throttle values. */
-  public void clearThrottleValues()
-  {
-    throttles.clear();
-  }
-
-  /** Add a throttle value.
-  *@param description is the throttle description.
-  *@param match is the regexp to be applied to the bin names.
-  *@param throttle is the fetch rate to use, in fetches per millisecond.
-  */
-  public void addThrottleValue(String match, String description, float throttle)
-  {
-    throttles.put(match,new ThrottleItem(match,description,throttle));
-  }
-
-  /** Delete a throttle.
-  *@param match is the regexp describing the throttle to be removed.
-  */
-  public void deleteThrottleValue(String match)
-  {
-    throttles.remove(match);
-  }
-
-  /** Get throttles.  This will return a list of match strings, ordered by description and then
-  * match string.
-  *@return the ordered list of throttles.
-  */
-  public String[] getThrottles()
-  {
-    String[] rval = new String[throttles.size()];
-    Iterator iter = throttles.keySet().iterator();
-    int i = 0;
-    while (iter.hasNext())
-    {
-      rval[i++] = (String)iter.next();
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-
-  /** Get the description for a throttle.
-  *@param match describes the throttle.
-  *@return the description.
-  */
-  public String getThrottleDescription(String match)
-  {
-    ThrottleItem i = (ThrottleItem)throttles.get(match);
-    if (i == null)
-      return null;
-    return i.getDescription();
-  }
-
-  /** Get the throttle value for a throttle.
-  *@param match describes the throttle.
-  *@return the throttle value, in fetches per millisecond.
-  */
-  public float getThrottleValue(String match)
-  {
-    ThrottleItem i = (ThrottleItem)throttles.get(match);
-    if (i == null)
-      return 0.0f;
-    return i.getValue();
-  }
-
-  /** Set the maximum number of document fetches per millisecond.
-  *@param rate is the rate, in fetches/millisecond.
-  */
-  public void setThrottle(Float rate)
-  {
-    if (rate == null)
-      deleteThrottleValue(".*");
-    else
-      addThrottleValue(".*","All bins",rate.floatValue());
-  }
-
-  /** Get the maximum number of document fetches per millisecond.
-  *@return fetches/ms, or null if there is no throttle.
-  */
-  public Float getThrottle()
-  {
-    float rate = getThrottleValue(".*");
-    if (rate == 0.0f)
-      return null;
-    return new Float(rate);
-  }
-
-  /** Throttle item class.  Each instance describes a particular throttle.
-  */
-  protected static class ThrottleItem
-  {
-    /** The regexp key. */
-    protected String match;
-    /** The description. */
-    protected String description;
-    /** The throttle value */
-    protected float value;
-
-    /** Constructor. */
-    public ThrottleItem(String match, String description, float value)
-    {
-      this.match = match;
-      this.description = description;
-      this.value = value;
-    }
-
-    /** Get the match. */
-    public String getMatch()
-    {
-      return match;
-    }
-
-    /** Get the description. */
-    public String getDescription()
-    {
-      return description;
-    }
-
-    /** Get the throttle value. */
-    public float getValue()
-    {
-      return value;
-    }
-
-    /** Get the hash code. */
-    public int hashCode()
-    {
-      return match.hashCode();
-    }
-
-    /** Compare. */
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof ThrottleItem))
-        return false;
-      ThrottleItem other = (ThrottleItem)o;
-      return match.equals(other.match);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryConnectionManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryConnectionManager.java
deleted file mode 100644
index 42beab1..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryConnectionManager.java
+++ /dev/null
@@ -1,1085 +0,0 @@
-/* $Id: RepositoryConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.repository;
-
-import java.util.*;
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-
-/** This class is the manager of the repository connection description.  Inside, multiple database tables are managed,
-* with appropriate caching.
-* Note well: The database handle is instantiated here using the DBInterfaceFactory.  This is acceptable because the
-* actual database that this table is located in is fixed.
-* 
-* <br><br>
-* <b>repoconnections</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>connectionname</td><td>VARCHAR(32)</td><td>Primary Key</td></tr>
-* <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>classname</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>groupname</td><td>VARCHAR(32)</td><td></td></tr>
-* <tr><td>maxcount</td><td>BIGINT</td><td></td></tr>
-* <tr><td>configxml</td><td>LONGTEXT</td><td></td></tr>
-* </table>
-* <br><br>
-*
-*/
-public class RepositoryConnectionManager extends org.apache.manifoldcf.core.database.BaseTable implements IRepositoryConnectionManager
-{
-  public static final String _rcsid = "@(#)$Id: RepositoryConnectionManager.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Special field suffix
-  private final static String passwordSuffix = "password";
-
-  // Database fields
-  protected final static String nameField = "connectionname";     // Changed this to work around constraint bug in postgresql
-  protected final static String descriptionField = "description";
-  protected final static String classNameField = "classname";
-  protected final static String maxCountField = "maxcount";
-  protected final static String configField = "configxml";
-  protected final static String groupNameField = "groupname";
-
-  // Discontinued fields
-  protected final static String authorityNameField = "authorityname";
-
-  protected static Random random = new Random();
-
-  // Handle for repository history manager
-  protected final RepositoryHistoryManager historyManager;
-  // Handle for throttle spec storage
-  protected final ThrottleSpecManager throttleSpecManager;
-
-  // Cache manager
-  protected final ICacheManager cacheManager;
-  // Thread context
-  protected final IThreadContext threadContext;
-  // Lock manager
-  protected final ILockManager lockManager;
-  
-  protected final String repositoriesLock = "REPOSITORIES_LOCK";
-  
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public RepositoryConnectionManager(IThreadContext threadContext, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"repoconnections");
-
-    historyManager = new RepositoryHistoryManager(threadContext,database);
-    throttleSpecManager = new ThrottleSpecManager(database);
-    cacheManager = CacheManagerFactory.make(threadContext);
-    lockManager = LockManagerFactory.make(threadContext);
-    this.threadContext = threadContext;
-  }
-
-  /** Install the manager.
-  */
-  public void install()
-    throws ManifoldCFException
-  {
-    // First, get the authority manager table name and name column
-    IAuthorityGroupManager authMgr = AuthorityGroupManagerFactory.make(threadContext);
-
-    // Always use a loop, and no transaction, as we may need to retry due to upgrade
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        // Install the "objects" table.
-        HashMap map = new HashMap();
-        map.put(nameField,new ColumnDescription("VARCHAR(32)",true,false,null,null,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(classNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
-        map.put(groupNameField,new ColumnDescription("VARCHAR(32)",false,true,
-          authMgr.getTableName(),authMgr.getGroupNameColumn(),false));
-        map.put(maxCountField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(configField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code
-      }
-
-      // Install dependent tables.
-      historyManager.install(getTableName(),nameField);
-      throttleSpecManager.install(getTableName(),nameField);
-
-      // Index management
-      IndexDescription authorityIndex = new IndexDescription(false,new String[]{groupNameField});
-      IndexDescription classIndex = new IndexDescription(false,new String[]{classNameField});
-      
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (authorityIndex != null && id.equals(authorityIndex))
-          authorityIndex = null;
-        else if (classIndex != null && id.equals(classIndex))
-          classIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (authorityIndex != null)
-        performAddIndex(null,authorityIndex);
-
-      if (classIndex != null)
-        performAddIndex(null,classIndex);
-      
-      break;
-    }
-  }
-
-  /** Uninstall the manager.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      throttleSpecManager.deinstall();
-      historyManager.deinstall();
-      performDrop(null);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Export configuration */
-  public void exportConfiguration(java.io.OutputStream os)
-    throws java.io.IOException, ManifoldCFException
-  {
-    // Write a version indicator
-    ManifoldCF.writeDword(os,1);
-    // Get the authority list
-    IRepositoryConnection[] list = getAllConnections();
-    // Write the number of authorities
-    ManifoldCF.writeDword(os,list.length);
-    // Loop through the list and write the individual repository connection info
-    int i = 0;
-    while (i < list.length)
-    {
-      IRepositoryConnection conn = list[i++];
-      ManifoldCF.writeString(os,conn.getName());
-      ManifoldCF.writeString(os,conn.getDescription());
-      ManifoldCF.writeString(os,conn.getClassName());
-      ManifoldCF.writeString(os,conn.getConfigParams().toXML());
-      ManifoldCF.writeString(os,conn.getACLAuthority());
-      ManifoldCF.writeDword(os,conn.getMaxConnections());
-      String[] throttles = conn.getThrottles();
-      ManifoldCF.writeDword(os,throttles.length);
-      int j = 0;
-      while (j < throttles.length)
-      {
-        String throttleName = throttles[j++];
-        ManifoldCF.writeString(os,throttleName);
-        ManifoldCF.writeString(os,conn.getThrottleDescription(throttleName));
-        ManifoldCF.writefloat(os,conn.getThrottleValue(throttleName));
-      }
-    }
-  }
-
-  /** Import configuration */
-  public void importConfiguration(java.io.InputStream is)
-    throws java.io.IOException, ManifoldCFException
-  {
-    int version = ManifoldCF.readDword(is);
-    if (version != 1)
-      throw new java.io.IOException("Unknown repository connection configuration version: "+Integer.toString(version));
-    int count = ManifoldCF.readDword(is);
-    int i = 0;
-    while (i < count)
-    {
-      IRepositoryConnection conn = create();
-      conn.setName(ManifoldCF.readString(is));
-      conn.setDescription(ManifoldCF.readString(is));
-      conn.setClassName(ManifoldCF.readString(is));
-      conn.getConfigParams().fromXML(ManifoldCF.readString(is));
-      conn.setACLAuthority(ManifoldCF.readString(is));
-      conn.setMaxConnections(ManifoldCF.readDword(is));
-      int throttleCount = ManifoldCF.readDword(is);
-      int j = 0;
-      while (j < throttleCount)
-      {
-        String throttleName = ManifoldCF.readString(is);
-        conn.addThrottleValue(throttleName,ManifoldCF.readString(is),ManifoldCF.readfloat(is));
-        j++;
-      }
-      // Attempt to save this connection
-      save(conn);
-      i++;
-    }
-  }
-
-  /** Obtain a list of the repository connections, ordered by name.
-  *@return an array of connection objects.
-  */
-  public IRepositoryConnection[] getAllConnections()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(repositoriesLock);
-    try
-    {
-      // Read all the tools
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getRepositoryConnectionsKey());
-      StringSet localCacheKeys = new StringSet(ssb);
-      IResultSet set = performQuery("SELECT "+nameField+",lower("+nameField+") AS sortfield FROM "+getTableName()+" ORDER BY sortfield ASC",null,
-        localCacheKeys,null);
-      String[] names = new String[set.getRowCount()];
-      for (int i = 0; i < names.length; i++)
-      {
-        IResultRow row = set.getRow(i);
-        names[i] = row.getValue(nameField).toString();
-      }
-      return loadMultiple(names);
-    }
-    finally
-    {
-      lockManager.leaveReadLock(repositoriesLock);
-    }
-  }
-
-  /** Load a repository connection by name.
-  *@param name is the name of the repository connection.
-  *@return the loaded connection object, or null if not found.
-  */
-  public IRepositoryConnection load(String name)
-    throws ManifoldCFException
-  {
-    return loadMultiple(new String[]{name})[0];
-  }
-
-  protected final static int FETCH_MAX = 200;
-  
-  /** Load multiple repository connections by name.
-  *@param names are the names to load.
-  *@return the loaded connection objects.
-  */
-  public IRepositoryConnection[] loadMultiple(String[] names)
-    throws ManifoldCFException
-  {
-    IRepositoryConnection[] rval = new IRepositoryConnection[names.length];
-    if (names.length == 0)
-      return rval;
-    int inputIndex = 0;
-    int outputIndex = 0;
-    while (names.length - inputIndex > FETCH_MAX)
-    {
-      outputIndex = loadMultipleInternal(rval,outputIndex,names,inputIndex,FETCH_MAX);
-      inputIndex += FETCH_MAX;
-    }
-    loadMultipleInternal(rval,outputIndex,names,inputIndex,names.length-inputIndex);
-    return rval;
-  }
-  
-  protected int loadMultipleInternal(IRepositoryConnection[] rval, int outputIndex, String[] fetchNames, int inputIndex, int length)
-    throws ManifoldCFException
-  {
-    // Build description objects
-    RepositoryConnectionDescription[] objectDescriptions = new RepositoryConnectionDescription[length];
-    StringSetBuffer ssb = new StringSetBuffer();
-    for (int i = 0; i < length; i++)
-    {
-      ssb.clear();
-      String name = fetchNames[inputIndex + i];
-      ssb.add(getRepositoryConnectionKey(name));
-      objectDescriptions[i] = new RepositoryConnectionDescription(name,new StringSet(ssb));
-    }
-
-    RepositoryConnectionExecutor exec = new RepositoryConnectionExecutor(this,objectDescriptions);
-    cacheManager.findObjectsAndExecute(objectDescriptions,null,exec,getTransactionID());
-    IRepositoryConnection[] results = exec.getResults();
-    for (IRepositoryConnection result : results)
-    {
-      rval[outputIndex++] = result;
-    }
-    return outputIndex;
-  }
-
-  /** Create a new repository connection object.
-  *@return the new object.
-  */
-  public IRepositoryConnection create()
-    throws ManifoldCFException
-  {
-    RepositoryConnection rval = new RepositoryConnection();
-    return rval;
-  }
-
-  /** Save a repository connection object.
-  *@param object is the object to save.
-  *@return true if the object was created, false otherwise.
-  */
-  public boolean save(IRepositoryConnection object)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getRepositoryConnectionsKey());
-    ssb.add(getRepositoryConnectionKey(object.getName()));
-    StringSet cacheKeys = new StringSet(ssb);
-    while (true)
-    {
-      // Catch deadlock condition
-      long sleepAmt = 0L;
-      try
-      {
-        lockManager.enterNonExWriteLock(repositoriesLock);
-        try
-        {
-          ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-          try
-          {
-            beginTransaction();
-            try
-            {
-              //performLock();
-              // Notify of a change to the configuration
-              ManifoldCF.noteConfigurationChange();
-              boolean isNew = object.getIsNew();
-              // See whether the instance exists
-              ArrayList params = new ArrayList();
-              String query = buildConjunctionClause(params,new ClauseDescription[]{
-                new UnitaryClause(nameField,object.getName())});
-              IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-                query+" FOR UPDATE",params,null,null);
-              HashMap values = new HashMap();
-              values.put(descriptionField,object.getDescription());
-              values.put(classNameField,object.getClassName());
-              values.put(groupNameField,object.getACLAuthority());
-              values.put(maxCountField,new Long((long)object.getMaxConnections()));
-              String configXML = object.getConfigParams().toXML();
-              values.put(configField,configXML);
-              boolean notificationNeeded = false;
-              boolean isCreated;
-              
-              if (set.getRowCount() > 0)
-              {
-                // If the object is supposedly new, it is bad that we found one that already exists.
-                if (isNew)
-                  throw new ManifoldCFException("Repository connection '"+object.getName()+"' already exists");
-                isCreated = false;
-                IResultRow row = set.getRow(0);
-                String oldXML = (String)row.getValue(configField);
-                if (oldXML == null || !oldXML.equals(configXML))
-                  notificationNeeded = true;
-                
-                // Update
-                params.clear();
-                query = buildConjunctionClause(params,new ClauseDescription[]{
-                  new UnitaryClause(nameField,object.getName())});
-                performUpdate(values," WHERE "+query,params,null);
-                throttleSpecManager.deleteRows(object.getName());
-              }
-              else
-              {
-                // If the object is not supposed to be new, it is bad that we did not find one.
-                if (!isNew)
-                  throw new ManifoldCFException("Repository connection '"+object.getName()+"' no longer exists");
-                isCreated = true;
-                // Insert
-                values.put(nameField,object.getName());
-                // We only need the general key because this is new.
-                performInsert(values,null);
-              }
-
-              // Write secondary table stuff
-              throttleSpecManager.writeRows(object.getName(),object);
-
-              // If notification required, do it.
-              if (notificationNeeded)
-              {
-                IJobManager jobManager = JobManagerFactory.make(threadContext);
-                jobManager.noteConnectionChange(object.getName());
-              }
-
-              cacheManager.invalidateKeys(ch);
-              return isCreated;
-            }
-            catch (ManifoldCFException e)
-            {
-              signalRollback();
-              throw e;
-            }
-            catch (Error e)
-            {
-              signalRollback();
-              throw e;
-            }
-            finally
-            {
-              endTransaction();
-            }
-          }
-          finally
-          {
-            cacheManager.leaveCache(ch);
-          }
-        }
-        finally
-        {
-          lockManager.leaveNonExWriteLock(repositoriesLock);
-        }
-      }
-      catch (ManifoldCFException e)
-      {
-        // Is this a deadlock exception?  If so, we want to try again.
-        if (e.getErrorCode() != ManifoldCFException.DATABASE_TRANSACTION_ABORT)
-          throw e;
-        sleepAmt = getSleepAmt();
-      }
-      finally
-      {
-        sleepFor(sleepAmt);
-      }
-    }
-  }
-
-  /** Delete a repository connection.
-  *@param name is the name of the connection to delete.  If the
-  * name does not exist, no error is returned.
-  */
-  public void delete(String name)
-    throws ManifoldCFException
-  {
-    // Grab a job manager handle.  We will need to check if any jobs refer to this connection.
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getRepositoryConnectionsKey());
-    ssb.add(getRepositoryConnectionKey(name));
-    StringSet cacheKeys = new StringSet(ssb);
-    lockManager.enterNonExWriteLock(repositoriesLock);
-    try
-    {
-      ICacheHandle ch = cacheManager.enterCache(null,cacheKeys,getTransactionID());
-      try
-      {
-        beginTransaction();
-        try
-        {
-          // Check if any jobs refer to this connection name
-          if (jobManager.checkIfReference(name))
-            throw new ManifoldCFException("Can't delete repository connection '"+name+"': existing jobs refer to it");
-          ManifoldCF.noteConfigurationChange();
-          throttleSpecManager.deleteRows(name);
-          historyManager.deleteOwner(name);
-          ArrayList params = new ArrayList();
-          String query = buildConjunctionClause(params,new ClauseDescription[]{
-            new UnitaryClause(nameField,name)});
-          performDelete("WHERE "+query,params,null);
-          cacheManager.invalidateKeys(ch);
-        }
-        catch (ManifoldCFException e)
-        {
-          signalRollback();
-          throw e;
-        }
-        catch (Error e)
-        {
-          signalRollback();
-          throw e;
-        }
-        finally
-        {
-          endTransaction();
-        }
-      }
-      finally
-      {
-        cacheManager.leaveCache(ch);
-      }
-    }
-    finally
-    {
-      lockManager.leaveNonExWriteLock(repositoriesLock);
-    }
-  }
-
-  /** Return true if the specified authority name is referenced.
-  *@param groupName is the group name.
-  *@return true if referenced, false otherwise.
-  */
-  @Override
-  public boolean isGroupReferenced(String groupName)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getRepositoryConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(groupNameField,groupName)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    return set.getRowCount() > 0;
-  }
-
-  /** Get a list of repository connections that share the same connector.
-  *@param className is the class name of the connector.
-  *@return the repository connections that use that connector.
-  */
-  @Override
-  public String[] findConnectionsForConnector(String className)
-    throws ManifoldCFException
-  {
-    StringSetBuffer ssb = new StringSetBuffer();
-    ssb.add(getRepositoryConnectionsKey());
-    StringSet localCacheKeys = new StringSet(ssb);
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(classNameField,className)});
-    IResultSet set = performQuery("SELECT "+nameField+" FROM "+getTableName()+" WHERE "+query,params,
-      localCacheKeys,null);
-    String[] rval = new String[set.getRowCount()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      IResultRow row = set.getRow(i);
-      rval[i] = (String)row.getValue(nameField);
-      i++;
-    }
-    java.util.Arrays.sort(rval);
-    return rval;
-  }
-
-  /** Check if underlying connector exists.
-  *@param name is the name of the connection to check.
-  *@return true if the underlying connector is registered.
-  */
-  @Override
-  public boolean checkConnectorExists(String name)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      StringSetBuffer ssb = new StringSetBuffer();
-      ssb.add(getRepositoryConnectionKey(name));
-      StringSet localCacheKeys = new StringSet(ssb);
-      ArrayList params = new ArrayList();
-      String query = buildConjunctionClause(params,new ClauseDescription[]{
-        new UnitaryClause(nameField,name)});
-      IResultSet set = performQuery("SELECT "+classNameField+" FROM "+getTableName()+" WHERE "+query,params,
-        localCacheKeys,null);
-      if (set.getRowCount() == 0)
-        throw new ManifoldCFException("No such connection: '"+name+"'");
-      IResultRow row = set.getRow(0);
-      String className = (String)row.getValue(classNameField);
-      IConnectorManager cm = ConnectorManagerFactory.make(threadContext);
-      return cm.isInstalled(className);
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  // Schema related
-  /** Return the name column.
-  *@return the name column.
-  */
-  @Override
-  public String getConnectionNameColumn()
-  {
-    return nameField;
-  }
-
-
-  // Reporting and analysis related
-
-  /** Delete history rows related to a specific connection, upon user request.
-  *@param connectionName is the connection whose history records should be removed.
-  */
-  @Override
-  public void cleanUpHistoryData(String connectionName)
-    throws ManifoldCFException
-  {
-    historyManager.deleteOwner(connectionName);
-  }
-  
-  /** Delete history rows older than a specified timestamp.
-  *@param timeCutoff is the timestamp to delete older rows before.
-  */
-  @Override
-  public void cleanUpHistoryData(long timeCutoff)
-    throws ManifoldCFException
-  {
-    historyManager.deleteOldRows(timeCutoff);
-  }
-  
-  /** Record time-stamped information about the activity of the connection.  This information can originate from
-  * either the connector or from the framework.  The reason it is here is that it is viewed as 'belonging' to an
-  * individual connection, and is segregated accordingly.
-  *@param connectionName is the connection to which the record belongs.  If the connection is deleted, the
-  * corresponding records will also be deleted.  Cannot be null.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       activity has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-  *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-  *       "fetch document" activity, while the framework might record "ingest document", "job start", "job finish",
-  *       "job abort", etc.  Cannot be null.
-  *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-  *@param entityIdentifier is a (possibly long) string which identifies the object involved in the history record.
-  *       The interpretation of this field will differ from connector to connector.  May be null.
-  *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-  *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  *@param childIdentifiers is a set of child entity identifiers associated with this activity.  May be null.
-  */
-  public void recordHistory(String connectionName, Long startTime, String activityType, Long dataSize,
-    String entityIdentifier, String resultCode, String resultDescription, String[] childIdentifiers)
-    throws ManifoldCFException
-  {
-    long endTimeValue = System.currentTimeMillis();
-    long startTimeValue;
-    if (startTime == null)
-      startTimeValue = endTimeValue - 1L;
-    else
-    {
-      startTimeValue = startTime.longValue();
-      if (startTimeValue == endTimeValue)
-        startTimeValue -= 1L;   // Zero-time events are not allowed.
-    }
-
-    long dataSizeValue;
-    if (dataSize == null)
-      dataSizeValue = 0L;
-    else
-      dataSizeValue = dataSize.longValue();
-
-    Long rowID = historyManager.addRow(connectionName,startTimeValue,endTimeValue,dataSizeValue,activityType,
-      entityIdentifier,resultCode,resultDescription);
-    // child identifiers are not stored, for now.
-    // MHL
-  }
-
-  /** Count the number of rows specified by a given set of criteria.  This can be used to make decisions
-  * as to whether a query based on those rows will complete in an acceptable amount of time.
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@return the number of rows included by the criteria.
-  */
-  public long countHistoryRows(String connectionName, FilterCriteria criteria)
-    throws ManifoldCFException
-  {
-    return historyManager.countHistoryRows(connectionName,criteria);
-  }
-
-  /** Get the maximum number of rows a window-based report can work with.
-  *@return the maximum rows.
-  */
-  public long getMaxRows()
-    throws ManifoldCFException
-  {
-    return historyManager.getMaxRows();
-  }
-
-  /** Generate a report, listing the start time, elapsed time, result code and description, number of bytes, and entity identifier.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The resultset returned should have the following columns: "starttime","elapsedtime","resultcode","resultdesc","bytes","identifier".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistorySimple(String connectionName, FilterCriteria criteria, SortOrder sort, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    return historyManager.simpleReport(connectionName,criteria,sort,startRow,maxRowCount);
-  }
-
-  /** Generate a report, listing the start time, activity count, and identifier bucket, given
-  * a time slice (interval) size.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The identifier bucket description is specified by the bucket description object.
-  * The resultset returned should have the following columns: "starttime","endtime","activitycount","idbucket".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param idBucket is the description of the bucket based on processed entity identifiers.
-  *@param interval is the time interval, in milliseconds, to locate.  There will be one row in the resultset
-  *       for each distinct idBucket value, and the returned activity count will the maximum found over the
-  *       specified interval size.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistoryActivityCount(String connectionName, FilterCriteria criteria, SortOrder sort, BucketDescription idBucket,
-    long interval, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    return historyManager.maxActivityCountReport(connectionName,criteria,sort,idBucket,interval,startRow,maxRowCount);
-  }
-
-  /** Generate a report, listing the start time, bytes processed, and identifier bucket, given
-  * a time slice (interval) size.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The identifier bucket description is specified by the bucket description object.
-  * The resultset returned should have the following columns: "starttime","endtime","bytecount","idbucket".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param idBucket is the description of the bucket based on processed entity identifiers.
-  *@param interval is the time interval, in milliseconds, to locate.  There will be one row in the resultset
-  *       for each distinct idBucket value, and the returned activity count will the maximum found over the
-  *       specified interval size.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistoryByteCount(String connectionName, FilterCriteria criteria, SortOrder sort, BucketDescription idBucket,
-    long interval, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    return historyManager.maxByteCountReport(connectionName,criteria,sort,idBucket,interval,startRow,maxRowCount);
-  }
-
-
-  /** Generate a report, listing the result bucket and identifier bucket.
-  * The records selected for this report are based on the filtering criteria object passed into this method.
-  * The record order is based on the sorting criteria object passed into this method.
-  * The result code bucket description is specified by a bucket description object.
-  * The identifier bucket description is specified by a bucket description object.
-  * The resultset returned should have the following columns: "resultcodebucket","idbucket".
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@param sort is the sorting order, which can specify sort based on the result columns.
-  *@param resultCodeBucket is the description of the bucket based on processed result codes.
-  *@param idBucket is the description of the bucket based on processed entity identifiers.
-  *@param startRow is the first row to include (beginning with 0)
-  *@param maxRowCount is the maximum number of rows to include.
-  */
-  public IResultSet genHistoryResultCodes(String connectionName, FilterCriteria criteria, SortOrder sort,
-    BucketDescription resultCodeBucket, BucketDescription idBucket, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    return historyManager.resultCodesReport(connectionName,criteria,sort,resultCodeBucket,idBucket,startRow,maxRowCount);
-  }
-
-  // Caching strategy: Individual connection descriptions are cached, and there is a global cache key for the list of
-  // repository connections.
-
-  /** Construct a key which represents the general list of repository connectors.
-  *@return the cache key.
-  */
-  protected static String getRepositoryConnectionsKey()
-  {
-    return CacheKeyFactory.makeRepositoryConnectionsKey();
-  }
-
-  /** Construct a key which represents an individual repository connection.
-  *@param connectionName is the name of the connector.
-  *@return the cache key.
-  */
-  protected static String getRepositoryConnectionKey(String connectionName)
-  {
-    return CacheKeyFactory.makeRepositoryConnectionKey(connectionName);
-  }
-
-  // Other utility methods.
-
-  /** Fetch multiple repository connections at a single time.
-  *@param connectionNames are a list of connection names.
-  *@return the corresponding repository connection objects.
-  */
-  protected RepositoryConnection[] getRepositoryConnectionsMultiple(String[] connectionNames)
-    throws ManifoldCFException
-  {
-    RepositoryConnection[] rval = new RepositoryConnection[connectionNames.length];
-    HashMap returnIndex = new HashMap();
-    int i = 0;
-    while (i < connectionNames.length)
-    {
-      rval[i] = null;
-      returnIndex.put(connectionNames[i],new Integer(i));
-      i++;
-    }
-    beginTransaction();
-    try
-    {
-      i = 0;
-      ArrayList params = new ArrayList();
-      int j = 0;
-      int maxIn = maxClauseGetRepositoryConnectionsChunk();
-      while (i < connectionNames.length)
-      {
-        if (j == maxIn)
-        {
-          getRepositoryConnectionsChunk(rval,returnIndex,params);
-          params.clear();
-          j = 0;
-        }
-        params.add(connectionNames[i]);
-        i++;
-        j++;
-      }
-      if (j > 0)
-        getRepositoryConnectionsChunk(rval,returnIndex,params);
-      return rval;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Calculate how many repository connections to get at once.
-  */
-  protected int maxClauseGetRepositoryConnectionsChunk()
-  {
-    return Math.min(findConjunctionClauseMax(new ClauseDescription[]{}),
-      throttleSpecManager.maxClauseGetRows());
-  }
-  
-  /** Read a chunk of repository connections.
-  *@param rval is the place to put the read policies.
-  *@param returnIndex is a map from the object id (resource id) and the rval index.
-  *@param params is the set of parameters.
-  */
-  protected void getRepositoryConnectionsChunk(RepositoryConnection[] rval, Map returnIndex, ArrayList params)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(nameField,params)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+
-      query,list,null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i++);
-      String name = row.getValue(nameField).toString();
-      int index = ((Integer)returnIndex.get(name)).intValue();
-      RepositoryConnection rc = new RepositoryConnection();
-      rc.setIsNew(false);
-      rc.setName(name);
-      rc.setDescription((String)row.getValue(descriptionField));
-      rc.setClassName((String)row.getValue(classNameField));
-      rc.setACLAuthority((String)row.getValue(groupNameField));
-      rc.setMaxConnections((int)((Long)row.getValue(maxCountField)).longValue());
-      String xml = (String)row.getValue(configField);
-      if (xml != null && xml.length() > 0)
-        rc.getConfigParams().fromXML(xml);
-      rval[index] = rc;
-    }
-
-    // Do throttle part
-    throttleSpecManager.getRows(rval,returnIndex,params);
-  }
-
-  // The cached instance will be a RepositoryConnection.  The cached version will be duplicated when it is returned
-  // from the cache.
-  //
-  // The description object is based completely on the name.
-
-  /** This is the object description for a repository connection object.
-  */
-  protected static class RepositoryConnectionDescription extends org.apache.manifoldcf.core.cachemanager.BaseDescription
-  {
-    protected String connectionName;
-    protected String criticalSectionName;
-    protected StringSet cacheKeys;
-
-    public RepositoryConnectionDescription(String connectionName, StringSet invKeys)
-    {
-      super("repositoryconnectioncache");
-      this.connectionName = connectionName;
-      criticalSectionName = getClass().getName()+"-"+connectionName;
-      cacheKeys = invKeys;
-    }
-
-    public String getConnectionName()
-    {
-      return connectionName;
-    }
-
-    public int hashCode()
-    {
-      return connectionName.hashCode();
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof RepositoryConnectionDescription))
-        return false;
-      RepositoryConnectionDescription d = (RepositoryConnectionDescription)o;
-      return d.connectionName.equals(connectionName);
-    }
-
-    public String getCriticalSectionName()
-    {
-      return criticalSectionName;
-    }
-
-    /** Get the cache keys for an object (which may or may not exist yet in
-    * the cache).  This method is called in order for cache manager to throw the correct locks.
-    * @return the object's cache keys, or null if the object should not
-    * be cached.
-    */
-    public StringSet getObjectKeys()
-    {
-      return cacheKeys;
-    }
-
-  }
-
-  /** This is the executor object for locating repository connection objects.
-  */
-  protected static class RepositoryConnectionExecutor extends org.apache.manifoldcf.core.cachemanager.ExecutorBase
-  {
-    // Member variables
-    protected RepositoryConnectionManager thisManager;
-    protected RepositoryConnection[] returnValues;
-    protected HashMap returnMap = new HashMap();
-
-    /** Constructor.
-    *@param manager is the ToolManager.
-    *@param objectDescriptions are the object descriptions.
-    */
-    public RepositoryConnectionExecutor(RepositoryConnectionManager manager, RepositoryConnectionDescription[] objectDescriptions)
-    {
-      super();
-      thisManager = manager;
-      returnValues = new RepositoryConnection[objectDescriptions.length];
-      int i = 0;
-      while (i < objectDescriptions.length)
-      {
-        returnMap.put(objectDescriptions[i].getConnectionName(),new Integer(i));
-        i++;
-      }
-    }
-
-    /** Get the result.
-    *@return the looked-up or read cached instances.
-    */
-    public RepositoryConnection[] getResults()
-    {
-      return returnValues;
-    }
-
-    /** Create a set of new objects to operate on and cache.  This method is called only
-    * if the specified object(s) are NOT available in the cache.  The specified objects
-    * should be created and returned; if they are not created, it means that the
-    * execution cannot proceed, and the execute() method will not be called.
-    * @param objectDescriptions is the set of unique identifier of the object.
-    * @return the newly created objects to cache, or null, if any object cannot be created.
-    *  The order of the returned objects must correspond to the order of the object descriptinos.
-    */
-    public Object[] create(ICacheDescription[] objectDescriptions) throws ManifoldCFException
-    {
-      // Turn the object descriptions into the parameters for the ToolInstance requests
-      String[] connectionNames = new String[objectDescriptions.length];
-      int i = 0;
-      while (i < connectionNames.length)
-      {
-        RepositoryConnectionDescription desc = (RepositoryConnectionDescription)objectDescriptions[i];
-        connectionNames[i] = desc.getConnectionName();
-        i++;
-      }
-
-      return thisManager.getRepositoryConnectionsMultiple(connectionNames);
-    }
-
-
-    /** Notify the implementing class of the existence of a cached version of the
-    * object.  The object is passed to this method so that the execute() method below
-    * will have it available to operate on.  This method is also called for all objects
-    * that are freshly created as well.
-    * @param objectDescription is the unique identifier of the object.
-    * @param cachedObject is the cached object.
-    */
-    public void exists(ICacheDescription objectDescription, Object cachedObject) throws ManifoldCFException
-    {
-      // Cast what came in as what it really is
-      RepositoryConnectionDescription objectDesc = (RepositoryConnectionDescription)objectDescription;
-      RepositoryConnection ci = (RepositoryConnection)cachedObject;
-
-      // Duplicate it!
-      if (ci != null)
-        ci = ci.duplicate();
-
-      // In order to make the indexes line up, we need to use the hashtable built by
-      // the constructor.
-      returnValues[((Integer)returnMap.get(objectDesc.getConnectionName())).intValue()] = ci;
-    }
-
-    /** Perform the desired operation.  This method is called after either createGetObject()
-    * or exists() is called for every requested object.
-    */
-    public void execute() throws ManifoldCFException
-    {
-      // Does nothing; we only want to fetch objects in this cacher.
-    }
-
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryHistoryManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryHistoryManager.java
deleted file mode 100644
index 0887fbc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/RepositoryHistoryManager.java
+++ /dev/null
@@ -1,718 +0,0 @@
-/* $Id: RepositoryHistoryManager.java 999670 2010-09-21 22:18:19Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.repository;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class is the manager for the history records belonging to the repository connector.
- * 
- * <br><br>
- * <b>repohistory</b>
- * <table border="1" cellpadding="3" cellspacing="0">
- * <tr class="TableHeadingColor">
- * <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
- * <tr><td>id</td><td>BIGINT</td><td>Primary Key</td></tr>
- * <tr><td>owner</td><td>VARCHAR(32)</td><td>Reference:repoconnections.connectionname</td></tr>
- * <tr><td>starttime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>endtime</td><td>BIGINT</td><td></td></tr>
- * <tr><td>datasize</td><td>BIGINT</td><td></td></tr>
- * <tr><td>activitytype</td><td>VARCHAR(64)</td><td></td></tr>
- * <tr><td>entityid</td><td>LONGTEXT</td><td></td></tr>
- * <tr><td>resultcode</td><td>VARCHAR(255)</td><td></td></tr>
- * <tr><td>resultdesc</td><td>LONGTEXT</td><td></td></tr>
- * </table>
- * <br><br>
- * 
- */
-public class RepositoryHistoryManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: RepositoryHistoryManager.java 999670 2010-09-21 22:18:19Z kwright $";
-
-  // Fields
-  protected final static String idField = "id";
-  protected final static String ownerNameField = "owner";
-  protected final static String startTimeField = "starttime";
-  protected final static String endTimeField = "endtime";
-  protected final static String dataSizeField = "datasize";
-  protected final static String activityTypeField = "activitytype";
-  protected final static String entityIdentifierField = "entityid";
-  protected final static String resultCodeField = "resultcode";
-  protected final static String resultDescriptionField = "resultdesc";
-
-  /** Thread context */
-  protected IThreadContext threadContext;
-
-  /** A lock manager handle. */
-  protected final ILockManager lockManager;
-
-  /** Constructor.
-  *@param database is the database instance.
-  */
-  public RepositoryHistoryManager(IThreadContext tc, IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"repohistory");
-    this.threadContext = tc;
-    this.lockManager = LockManagerFactory.make(tc);
-  }
-
-  /** Install or upgrade the table.
-  *@param parentTable is the parent table.
-  *@param parentField is the parent field.
-  */
-  public void install(String parentTable, String parentField)
-    throws ManifoldCFException
-  {
-    // Always have an outer loop, in case of upgrade
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerNameField,new ColumnDescription("VARCHAR(32)",false,false,parentTable,parentField,false));
-        map.put(idField,new ColumnDescription("BIGINT",true,false,null,null,false));
-        map.put(startTimeField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(endTimeField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(dataSizeField,new ColumnDescription("BIGINT",false,false,null,null,false));
-        map.put(activityTypeField,new ColumnDescription("VARCHAR(64)",false,false,null,null,false));
-        map.put(entityIdentifierField,new ColumnDescription("LONGTEXT",false,false,null,null,false));
-        map.put(resultCodeField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(resultDescriptionField,new ColumnDescription("LONGTEXT",false,true,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code.
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerNameField});
-      IndexDescription startTimeIndex = new IndexDescription(false,new String[]{startTimeField});
-      IndexDescription endTimeIndex = new IndexDescription(false,new String[]{endTimeField});
-      IndexDescription activityTypeIndex = new IndexDescription(false,new String[]{activityTypeField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        else if (startTimeIndex != null && id.equals(startTimeIndex))
-          startTimeIndex = null;
-        else if (endTimeIndex != null && id.equals(endTimeIndex))
-          endTimeIndex = null;
-        else if (activityTypeIndex == null && id.equals(activityTypeIndex))
-          activityTypeIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-      if (startTimeIndex != null)
-        performAddIndex(null,startTimeIndex);
-      if (endTimeIndex != null)
-        performAddIndex(null,endTimeIndex);
-      if (activityTypeIndex != null)
-        performAddIndex(null,activityTypeIndex);
-
-      break;
-
-    }
-  }
-
-  /** Uninstall the table.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Delete all records associated with given owner.
-  *@param owner is the name of the owner.
-  *@param invKeys are the invalidation keys.
-  */
-  public void deleteOwner(String owner)
-    throws ManifoldCFException
-  {
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(ownerNameField,owner)});
-    performDelete("WHERE "+query,params,null);
-  }
-
-  /** Delete records older than a specified time.
-  *@param timeCutoff is the time, earlier than which records are removed.
-  */
-  public void deleteOldRows(long timeCutoff)
-    throws ManifoldCFException
-  {
-    ArrayList params = new ArrayList();
-    String query = buildConjunctionClause(params,new ClauseDescription[]{
-      new UnitaryClause(startTimeField,"<",new Long(timeCutoff))});
-    performDelete("WHERE "+query,params,null);
-  }
-  
-  /** Add row to table, and reanalyze if necessary.
-  */
-  public Long addRow(String connectionName, long startTime, long endTime, long dataSize, String activityType,
-    String entityIdentifier, String resultCode, String resultDescription)
-    throws ManifoldCFException
-  {
-    Long id = new Long(IDFactory.make(threadContext));   
-    if (lockManager.getSharedConfiguration().getBooleanProperty("org.apache.manifoldcf.crawler.repository.store_history",true))
-    {
-      HashMap map = new HashMap();
-      map.put(idField,id);
-      map.put(ownerNameField,connectionName);
-      map.put(startTimeField,new Long(startTime));
-      map.put(endTimeField,new Long(endTime));
-      map.put(dataSizeField,new Long(dataSize));
-      map.put(activityTypeField,activityType);
-      map.put(entityIdentifierField,entityIdentifier);
-      if (resultCode != null)
-        map.put(resultCodeField,resultCode);
-      if (resultDescription != null)
-        map.put(resultDescriptionField,resultDescription);
-      performInsert(map,null);
-      // Not accurate, but best we can do without overhead
-      noteModifications(1,0,0);
-    }
-    return id;
-  }
-
-  // For result analysis, we make heavy use of Postgresql's more advanced posix regular expression
-  // handling.  The queries in general are fairly messy.  There's a "front aligned" way of doing things,
-  // which uses the start time of a row and finds everything that overlaps the interval from "start time"
-  // to "start time + interval".  Then there's a "rear aligned"" way of doing things, which uses the
-  // time range from "end time - interval" to "end time".  Both sets of data must be evaluated to have a
-  // complete set of possible unique window positions.
-  //
-  // Some of the examples below only use one or the other alignment; they're meant to be illustrative rather
-  // than complete.
-  //
-  // 1) How to come up with the "total count" or "total bytes" of the events in the time window:
-  //
-  // SELECT substring(entityid from '<expr>') AS entitybucket, COUNT('x') AS eventcount
-  //      FROM table WHERE starttime > xxx AND endtime <= yyy AND <everything else> GROUP BY entitybucket
-  // SELECT substring(entityid from '<expr>') AS entitybucket, SUM(bytecount) AS bytecount
-  //      FROM table WHERE starttime > xxx AND endtime <= yyy AND <everything else> GROUP BY entitybucket
-  //
-  // Sample queries tried against test table:
-  // SELECT substring(url from 'gov$') AS urlbucket, COUNT('x') AS eventcount, MIN(starttime) as minstarttime, MAX(endtime) AS maxendtime FROM testtable GROUP BY urlbucket;
-  // SELECT substring(lower(url) from 'gov$') AS urlbucket, SUM(bytes) AS bytecount, MIN(starttime) as minstarttime, MAX(endtime) AS maxendtime FROM testtable GROUP BY urlbucket;
-  // SELECT substring(upper(url) from 'gov$') AS urlbucket, COUNT('x') AS eventcount, MIN(starttime) as minstarttime, MAX(endtime) AS maxendtime FROM testtable GROUP BY urlbucket;
-  //
-  // 2) How to find a set of rows within the interval window for each row in the greater range (FRONT ALIGNED!!!):
-  //
-  // SELECT t0.url AS starturl,t0.starttime AS starttime,t1.url AS secondurl,t1.starttime AS secondstart,t1.endtime AS secondend FROM testtable t0,testtable t1
-  //      WHERE t1.starttime < t0.starttime + 15 AND t1.endtime > t0.starttime
-  //
-  // 3) Another way to do it (REAR ALIGNED!!!):
-  //
-  // SELECT t0.url AS starturl,t0.endtime AS endtime,t1.url AS secondurl,t1.starttime AS secondstart,t1.endtime AS secondend FROM testtable t0,testtable t1
-  //      WHERE t1.starttime < t0.endtime AND t1.endtime > t0.endtime - 15
-  //
-  // 4) How to find the byte count for each of the intervals:
-  //
-  // SELECT t0.url AS starturl, t0.starttime AS windowstart, SUM(t1.bytes) AS bytecount FROM testtable t0, testtable t1
-  //       WHERE t1.starttime < t0.starttime + 15 AND t1.endtime > t0.starttime GROUP BY starturl,windowstart;
-  //
-  // 5) How to find the byte count per bucket for each of the intervals:
-  //
-  // SELECT substring(t0.url from '^.*(gov|com)$') AS bucket, t0.starttime AS windowstart, SUM(t1.bytes) AS bytecount FROM testtable t0, testtable t1
-  //      WHERE substring(t0.url from '^.*(gov|com)$')=substring(t1.url from '^.*(gov|com)$') AND t1.starttime < t0.starttime + 15 AND t1.endtime > t0.starttime GROUP BY bucket,windowstart;
-  //
-  // 6) How to find the max byte count for the highest interval for each bucket:
-  //
-  // SELECT t2.bucket AS bucketname, MAX(t2.bytecount) AS maxbytecount FROM (SELECT substring(t0.url from '^.*(gov|com)$') AS bucket, t0.starttime AS windowstart, SUM(t1.bytes) AS bytecount FROM testtable t0, testtable t1
-  //      WHERE substring(t0.url from '^.*(gov|com)$')=substring(t1.url from '^.*(gov|com)$') AND t1.starttime < t0.starttime + 15 AND t1.endtime > t0.starttime GROUP BY bucket,windowstart) t2 GROUP BY bucketname;
-  //
-  // 7) But, how do we include the right start time?  We want the start time from the row that yielded the max bytecount!
-  //    So, use select distinct:
-  //
-  // SELECT DISTINCT ON (bucketname) t2.bucket AS bucketname, t2.bytecount AS maxbytecount, t2.windowstart AS windowstart FROM (SELECT substring(t0.url from '^.*(gov|com)$') AS bucket, t0.starttime AS windowstart, SUM(t1.bytes) AS bytecount FROM testtable t0, testtable t1
-  //      WHERE substring(t0.url from '^.*(gov|com)$')=substring(t1.url from '^.*(gov|com)$') AND t1.starttime < t0.starttime + 15 AND t1.endtime > t0.starttime GROUP BY bucket,windowstart) t2 ORDER BY bucketname ASC,maxbytecount DESC;
-  //
-  // 8) How do we account for boundary conditions?  E.g., fetches that start within the window but go over the window boundary?
-  //    A: We can try to prorate based on window size.  This would involve a more complex query:
-  //
-  // ... least(t0.starttime + <interval>,t1.endtime) - greatest(t0.starttime,t1.starttime) AS overlaptime ...
-  //
-  // 9) Prorated byte count, FRONT ALIGNED form and BACK ALIGNED form:
-  //
-  // ... bytes * (least(t0.starttime + <interval>,t1.endtime) - greatest(t0.starttime,t1.starttime))/(t1.endtime-t1.starttime) AS bytecount ...
-  // OR
-  // ... bytes * (least(t0.endtime,t1.endtime) - greatest(t0.endtime - <interval>,t1.starttime))/(t1.endtime-t1.starttime) AS bytecount ...
-  //
-  // But, our version of postgresql doesn't know about greatest() and least(), so do this:
-  //
-  // SELECT t0.url AS starturl,t0.starttime AS starttime,t1.url AS secondurl,t1.starttime AS secondstart,t1.endtime AS secondend,
-  //      t1.bytes AS fullbytes,
-  //      t1.bytes * ((case when t0.starttime + 15<t1.endtime then t0.starttime + 15 else t1.endtime end) -
-  //                  (case when t0.starttime>t1.starttime then t0.starttime else t1.starttime end))/(t1.endtime - t1.starttime) AS proratedbytes
-  //      FROM testtable t0,testtable t1 WHERE t1.starttime < t0.starttime + 15 AND t1.endtime > t0.starttime
-
-  /** Get a simple history, based on the passed-in filtering criteria and sort order.
-  * The resultset returned should have the following columns: "activity","starttime","elapsedtime","resultcode","resultdesc","bytes","identifier".
-  */
-  public IResultSet simpleReport(String connectionName, FilterCriteria criteria, SortOrder sort, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    // Build the query.
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-    sb.append(idField).append(" AS id,").append(activityTypeField).append(" AS activity,").append(startTimeField).append(" AS starttime,(")
-      .append(endTimeField).append("-").append(startTimeField).append(")")
-      .append(" AS elapsedtime,").append(resultCodeField).append(" AS resultcode,").append(resultDescriptionField)
-      .append(" AS resultdesc,").append(dataSizeField).append(" AS bytes,").append(entityIdentifierField)
-      .append(" AS identifier FROM ").append(getTableName());
-    addCriteria(sb,list,"",connectionName,criteria,false);
-    // Note well: We can't order by "identifier" in all databases, so in order to guarantee order we use "id".  This will force a specific internal
-    // order for the OFFSET/LIMIT clause.  We include "starttime" because that's the default ordering.
-    addOrdering(sb,new String[]{"starttime","id"},sort);
-    addLimits(sb,startRow,maxRowCount);
-    return performQuery(sb.toString(),list,null,null,maxRowCount);
-  }
-
-  /** Count the number of rows specified by a given set of criteria.  This can be used to make decisions
-  * as to whether a query based on those rows will complete in an acceptable amount of time.
-  *@param connectionName is the name of the connection.
-  *@param criteria is the filtering criteria, which selects the records of interest.
-  *@return the number of rows included by the criteria.
-  */
-  public long countHistoryRows(String connectionName, FilterCriteria criteria)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder("SELECT ");
-    ArrayList list = new ArrayList();
-    sb.append(constructCountClause("*")).append(" AS countcol FROM ");
-    sb.append(getTableName());
-    addCriteria(sb,list,"",connectionName,criteria,false);
-    IResultSet set = performQuery(sb.toString(),list,null,null);
-    if (set.getRowCount() < 1)
-      throw new ManifoldCFException("Expected at least one row");
-    IResultRow row = set.getRow(0);
-    Long value = (Long)row.getValue("countcol");
-    return value.longValue();
-  }
-
-  /** Get the maximum number of rows a window-based report can work with.
-  *@return the maximum rows.
-  */
-  public long getMaxRows()
-    throws ManifoldCFException
-  {
-    return getWindowedReportMaxRows();
-  }
-
-  /** Get a bucketed history, with sliding window, of maximum activity level.
-  * The resultset returned should have the following columns: "starttime","endtime","activitycount","idbucket".
-  * An activity is counted as being within the interval window on a prorated basis, which can lead to fractional
-  * counts.
-  */
-  public IResultSet maxActivityCountReport(String connectionName, FilterCriteria filterCriteria, SortOrder sort, BucketDescription idBucket,
-    long interval, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    // The query we will generate here looks like this:
-    // SELECT *
-    //   FROM
-    //     (SELECT DISTINCT ON (idbucket) t3.bucket AS idbucket, t3.activitycount AS activitycount,
-    //                               t3.windowstart AS starttime, t3.windowend AS endtime
-    //        FROM (SELECT * FROM (SELECT t0.bucket AS bucket, t0.starttime AS windowstart, t0.starttime + <interval> AS windowend,
-    //                   SUM(CAST(((case when t0.starttime + <interval> < t1.endtime then t0.starttime + <interval> else t1.endtime end) -
-    //                     (case when t0.starttime>t1.starttime then t0.starttime else t1.starttime end)) AS double precision)
-    //                      / CAST((t1.endtime - t1.starttime) AS double precision)) AS activitycount
-    //                   FROM (SELECT DISTINCT substring(entityid from '<bucketregexp>') AS bucket, starttime FROM repohistory WHERE <criteria>) t0, repohistory t1
-    //                   WHERE t0.bucket=substring(t1.entityid from '<bucket_regexp>')
-    //                      AND t1.starttime < t0.starttime + <interval> AND t1.endtime > t0.starttime
-    //                      AND <criteria on t1>
-    //                          GROUP BY bucket,windowstart,windowend
-    //              UNION SELECT t0a.bucket AS bucket, t0a.endtime - <interval> AS windowstart, t0a.endtime AS windowend,
-    //                   SUM(CAST(((case when t0a.endtime < t1a.endtime then t0a.endtime else t1a.endtime end) -
-    //                     (case when t0a.endtime - <interval> > t1a.starttime then t0a.endtime - <interval> else t1a.starttime end)) AS double precision)
-    //                      / CAST((t1a.endtime - t1a.starttime) AS double precision)) AS activitycount
-    //                   FROM (SELECT DISTINCT substring(entityid from '<bucketregexp>') AS bucket, endtime FROM repohistory WHERE <criteria>) t0a, repohistory t1a
-    //                   WHERE t0a.bucket=substring(t1a.entityid from '<bucket_regexp>')
-    //                      AND (t1a.starttime < t0a.endtime AND t1a.endtime > t0a.endtime - <interval>
-    //                      AND <criteria on t1a>
-    //                          GROUP BY bucket,windowstart,windowend) t2
-    //                              ORDER BY bucket ASC,activitycount DESC) t3) t4 ORDER BY xxx LIMIT yyy OFFSET zzz;
-    //
-    // There are two different intervals being considered; each one may independently contribute possible
-    // items to the list.  One is based on the start time of the current record; the other is based on the
-    // end time of the current record.  That's why there are two inner clauses with a UNION.
-
-    StringBuilder sb = new StringBuilder();
-    ArrayList list = new ArrayList();
-    sb.append("SELECT * FROM (SELECT t6.bucket AS bucket,")
-      .append("t6.windowstart AS windowstart,t6.windowend AS windowend, SUM(t6.activitycount) AS activitycount")
-      .append(" FROM (SELECT ");
-
-    // Turn the interval into a string, since we'll need it a lot.
-    String intervalString = new Long(interval).toString();
-
-    sb.append("t0.bucket AS bucket, t0.").append(startTimeField).append(" AS windowstart, t0.")
-      .append(startTimeField).append("+").append(intervalString).append(" AS windowend, ")
-      .append(constructDoubleCastClause("((CASE WHEN t0."+
-	startTimeField+"+"+intervalString+"<t1."+endTimeField+" THEN t0."+
-        startTimeField+"+"+intervalString+" ELSE t1."+endTimeField+" END) - (CASE WHEN t0."+
-        startTimeField+">t1."+startTimeField+" THEN t0."+startTimeField+" ELSE t1."+startTimeField+" END))"))
-      .append(" / ").append(constructDoubleCastClause("(t1."+endTimeField+"-t1."+startTimeField+")"))
-      .append(" AS activitycount FROM (SELECT DISTINCT ");
-    addBucketExtract(sb,list,"",entityIdentifierField,idBucket);
-    sb.append(" AS bucket,").append(startTimeField).append(" FROM ").append(getTableName());
-    addCriteria(sb,list,"",connectionName,filterCriteria,false);
-    sb.append(") t0,")
-      .append(getTableName()).append(" t1 WHERE ");
-    sb.append("t0.bucket=");
-    addBucketExtract(sb,list,"t1.",entityIdentifierField,idBucket);
-    sb.append(" AND t1.").append(startTimeField).append("<t0.").append(startTimeField).append("+").append(intervalString)
-      .append(" AND t1.").append(endTimeField).append(">t0.").append(startTimeField);
-    addCriteria(sb,list,"t1.",connectionName,filterCriteria,true);
-    sb.append(") t6 GROUP BY bucket,windowstart,windowend UNION SELECT t6a.bucket AS bucket,")
-      .append("t6a.windowstart AS windowstart, t6a.windowend AS windowend, SUM(t6a.activitycount) AS activitycount")
-      .append(" FROM (SELECT ");
-    sb.append("t0a.bucket AS bucket, t0a.").append(endTimeField).append("-").append(intervalString).append(" AS windowstart, t0a.")
-      .append(endTimeField).append(" AS windowend, ")
-      .append(constructDoubleCastClause("((CASE WHEN t0a."+
-        endTimeField+"<t1a."+endTimeField+" THEN t0a."+endTimeField+
-        " ELSE t1a."+endTimeField+" END) - (CASE WHEN t0a."+
-        endTimeField+"-"+intervalString+">t1a."+startTimeField+
-        " THEN t0a."+endTimeField+"-"+intervalString+" ELSE t1a."+startTimeField+" END))"))
-      .append(" / ").append(constructDoubleCastClause("(t1a."+endTimeField+"-t1a."+startTimeField+")"))
-      .append(" AS activitycount FROM (SELECT DISTINCT ");
-    addBucketExtract(sb,list,"",entityIdentifierField,idBucket);
-    sb.append(" AS bucket,").append(endTimeField).append(" FROM ").append(getTableName());
-    addCriteria(sb,list,"",connectionName,filterCriteria,false);
-    sb.append(") t0a,")
-      .append(getTableName()).append(" t1a WHERE ");
-    sb.append("t0a.bucket=");
-    addBucketExtract(sb,list,"t1a.",entityIdentifierField,idBucket);
-    sb.append(" AND t1a.").append(startTimeField).append("<t0a.").append(endTimeField)
-      .append(" AND t1a.").append(endTimeField).append(">t0a.").append(endTimeField).append("-").append(intervalString);
-    addCriteria(sb,list,"t1a.",connectionName,filterCriteria,true);
-    sb.append(") t6a GROUP BY bucket,windowstart,windowend) t2");
-
-    Map otherColumns = new HashMap();
-    otherColumns.put("idbucket","bucket");
-    otherColumns.put("activitycount","activitycount");
-    otherColumns.put("starttime","windowstart");
-    otherColumns.put("endtime","windowend");
-    
-    StringBuilder newsb = new StringBuilder("SELECT * FROM (");
-    ArrayList newList = new ArrayList();
-    newsb.append(constructDistinctOnClause(newList,sb.toString(),list,new String[]{"idbucket"},
-      new String[]{"activitycount"},new boolean[]{false},otherColumns)).append(") t4");
-    addOrdering(newsb,new String[]{"activitycount","starttime","endtime","idbucket"},sort);
-    addLimits(newsb,startRow,maxRowCount);
-    return performQuery(newsb.toString(),newList,null,null,maxRowCount);
-  }
-
-
-  /** Get a bucketed history, with sliding window, of maximum byte count.
-  * The resultset returned should have the following columns: "starttime","endtime","bytecount","idbucket".
-  */
-  public IResultSet maxByteCountReport(String connectionName, FilterCriteria filterCriteria, SortOrder sort, BucketDescription idBucket,
-    long interval, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    // The query we will generate here looks like this:
-    // SELECT *
-    //   FROM
-    //     (SELECT DISTINCT ON (idbucket) t3.bucket AS idbucket, t3.bytecount AS bytecount,
-    //                               t3.windowstart AS starttime, t3.windowend AS endtime
-    //        FROM (SELECT * FROM (SELECT t0.bucket AS bucket, t0.starttime AS windowstart, t0.starttime + <interval> AS windowend,
-    //                   SUM(t1.datasize * ((case when t0.starttime + <interval> < t1.endtime then t0.starttime + <interval> else t1.endtime end) -
-    //                     (case when t0.starttime>t1.starttime then t0.starttime else t1.starttime end))
-    //                      / (t1.endtime - t1.starttime)) AS bytecount
-    //                   FROM (SELECT DISTINCT substring(entityid from '<bucketregexp>') AS bucket, starttime FROM repohistory WHERE <criteria>) t0, repohistory t1
-    //                   WHERE t0.bucket=substring(t1.entityid from '<bucket_regexp>')
-    //                      AND t1.starttime < t0.starttime + <interval> AND t1.endtime > t0.starttime
-    //                      AND <criteria on t1>
-    //                          GROUP BY bucket,windowstart,windowend
-    //              UNION SELECT t0a.bucket AS bucket, t0a.endtime - <interval> AS windowstart, t0a.endtime AS windowend,
-    //                   SUM(t1a.datasize * ((case when t0a.endtime < t1a.endtime then t0a.endtime else t1a.endtime end) -
-    //                     (case when t0a.endtime - <interval> > t1a.starttime then t0a.endtime - <interval> else t1a.starttime end))
-    //                      / (t1a.endtime - t1a.starttime)) AS bytecount
-    //                   FROM (SELECT DISTINCT substring(entityid from '<bucketregexp>') AS bucket, endtime FROM repohistory WHERE <criteria>) t0a, repohistory t1a
-    //                   WHERE t0a.bucket=substring(t1a.entityid from '<bucket_regexp>')
-    //                      AND (t1a.starttime < t0a.endtime AND t1a.endtime > t0a.endtime - <interval>
-    //                      AND <criteria on t1a>
-    //                          GROUP BY bucket,windowstart,windowend) t2
-    //                              ORDER BY bucket ASC,bytecount DESC) t3) t4 ORDER BY xxx LIMIT yyy OFFSET zzz;
-    //
-    // There are two different intervals being considered; each one may independently contribute possible
-    // items to the list.  One is based on the start time of the current record; the other is based on the
-    // end time of the current record.  That's why there are two inner clauses with a UNION.
-
-    StringBuilder sb = new StringBuilder();
-    ArrayList list = new ArrayList();
-    sb.append("SELECT * FROM (SELECT t6.bucket AS bucket,")
-      .append("t6.windowstart AS windowstart, t6.windowend AS windowend, SUM(t6.bytecount) AS bytecount")
-      .append(" FROM (SELECT ");
-
-    // Turn the interval into a string, since we'll need it a lot.
-    String intervalString = new Long(interval).toString();
-
-    sb.append("t0.bucket AS bucket, t0.").append(startTimeField).append(" AS windowstart, t0.")
-      .append(startTimeField).append("+").append(intervalString).append(" AS windowend, ")
-      .append("t1.").append(dataSizeField)
-      .append(" * ((CASE WHEN t0.")
-      .append(startTimeField).append("+").append(intervalString).append("<t1.").append(endTimeField)
-      .append(" THEN t0.").append(startTimeField).append("+").append(intervalString).append(" ELSE t1.")
-      .append(endTimeField).append(" END) - (CASE WHEN t0.").append(startTimeField).append(">t1.").append(startTimeField)
-      .append(" THEN t0.").append(startTimeField).append(" ELSE t1.").append(startTimeField)
-      .append(" END)) / (t1.").append(endTimeField).append("-t1.").append(startTimeField)
-      .append(")")
-      .append(" AS bytecount FROM (SELECT DISTINCT ");
-    addBucketExtract(sb,list,"",entityIdentifierField,idBucket);
-    sb.append(" AS bucket,").append(startTimeField).append(" FROM ").append(getTableName());
-    addCriteria(sb,list,"",connectionName,filterCriteria,false);
-    sb.append(") t0,")
-      .append(getTableName()).append(" t1 WHERE ");
-    sb.append("t0.bucket=");
-    addBucketExtract(sb,list,"t1.",entityIdentifierField,idBucket);
-    sb.append(" AND t1.").append(startTimeField).append("<t0.").append(startTimeField).append("+").append(intervalString)
-      .append(" AND t1.").append(endTimeField).append(">t0.").append(startTimeField);
-    addCriteria(sb,list,"t1.",connectionName,filterCriteria,true);
-    sb.append(") t6 GROUP BY bucket,windowstart,windowend UNION SELECT t6a.bucket AS bucket,")
-      .append("t6a.windowstart AS windowstart, t6a.windowend AS windowend, SUM(t6a.bytecount) AS bytecount")
-      .append(" FROM (SELECT ")
-      .append("t0a.bucket AS bucket, t0a.").append(endTimeField).append("-").append(intervalString).append(" AS windowstart, t0a.")
-      .append(endTimeField).append(" AS windowend, ")
-      .append("t1a.").append(dataSizeField).append(" * ((CASE WHEN t0a.")
-      .append(endTimeField).append("<t1a.").append(endTimeField)
-      .append(" THEN t0a.").append(endTimeField).append(" ELSE t1a.")
-      .append(endTimeField).append(" END) - (CASE WHEN t0a.").append(endTimeField).append("-").append(intervalString)
-      .append(">t1a.").append(startTimeField)
-      .append(" THEN t0a.").append(endTimeField).append("-").append(intervalString).append(" ELSE t1a.")
-      .append(startTimeField)
-      .append(" END)) / (t1a.").append(endTimeField).append("-t1a.").append(startTimeField)
-      .append(")")
-      .append(" AS bytecount FROM (SELECT DISTINCT ");
-    addBucketExtract(sb,list,"",entityIdentifierField,idBucket);
-    sb.append(" AS bucket,").append(endTimeField).append(" FROM ").append(getTableName());
-    addCriteria(sb,list,"",connectionName,filterCriteria,false);
-    sb.append(") t0a,")
-      .append(getTableName()).append(" t1a WHERE ");
-    sb.append("t0a.bucket=");
-    addBucketExtract(sb,list,"t1a.",entityIdentifierField,idBucket);
-    sb.append(" AND t1a.").append(startTimeField).append("<t0a.").append(endTimeField)
-      .append(" AND t1a.").append(endTimeField).append(">t0a.").append(endTimeField).append("-").append(intervalString);
-    addCriteria(sb,list,"t1a.",connectionName,filterCriteria,true);
-    sb.append(") t6a GROUP BY bucket,windowstart,windowend) t2");
-    
-    Map otherColumns = new HashMap();
-    otherColumns.put("idbucket","bucket");
-    otherColumns.put("bytecount","bytecount");
-    otherColumns.put("starttime","windowstart");
-    otherColumns.put("endtime","windowend");
-    StringBuilder newsb = new StringBuilder("SELECT * FROM (");
-    ArrayList newList = new ArrayList();
-    newsb.append(constructDistinctOnClause(newList,sb.toString(),list,new String[]{"idbucket"},
-      new String[]{"bytecount"},new boolean[]{false},otherColumns)).append(") t4");
-    addOrdering(newsb,new String[]{"bytecount","starttime","endtime","idbucket"},sort);
-    addLimits(newsb,startRow,maxRowCount);
-    return performQuery(newsb.toString(),newList,null,null,maxRowCount);
-  }
-
-  /** Get a bucketed history of different result code/identifier combinations.
-  * The resultset returned should have the following columns: "eventcount","resultcodebucket","idbucket".
-  */
-  public IResultSet resultCodesReport(String connectionName, FilterCriteria filterCriteria, SortOrder sort,
-    BucketDescription resultCodeBucket, BucketDescription idBucket, int startRow, int maxRowCount)
-    throws ManifoldCFException
-  {
-    // The query we'll use here will be:
-    //
-    // SELECT * FROM (SELECT substring(resultcode FROM '<result_regexp>') AS resultcodebucket,
-    //        substring(entityidentifier FROM '<id_regexp>') AS idbucket,
-    //        COUNT('x') AS eventcount FROM repohistory WHERE <criteria>) t1
-    //              GROUP BY t1.resultcodebucket,t1.idbucket
-    //                      ORDER BY xxx LIMIT yyy OFFSET zzz
-
-    StringBuilder sb = new StringBuilder("SELECT t1.resultcodebucket,t1.idbucket,");
-    ArrayList list = new ArrayList();
-    sb.append(constructCountClause("'x'")).append(" AS eventcount FROM (SELECT ");
-    addBucketExtract(sb,list,"",resultCodeField,resultCodeBucket);
-    sb.append(" AS resultcodebucket, ");
-    addBucketExtract(sb,list,"",entityIdentifierField,idBucket);
-    sb.append(" AS idbucket FROM ").append(getTableName());
-    addCriteria(sb,list,"",connectionName,filterCriteria,false);
-    sb.append(") t1 GROUP BY resultcodebucket,idbucket");
-    addOrdering(sb,new String[]{"eventcount","resultcodebucket","idbucket"},sort);
-    addLimits(sb,startRow,maxRowCount);
-    return performQuery(sb.toString(),list,null,null,maxRowCount);
-  }
-
-  /** Turn a bucket description into a return column.
-  * This is complicated by the fact that the extraction code is inherently case sensitive.  So if case insensitive is
-  * desired, that means we whack the whole thing to lower case before doing the match.
-  */
-  protected void addBucketExtract(StringBuilder sb, ArrayList list, String columnPrefix, String columnName, BucketDescription bucketDesc)
-  {
-    boolean isSensitive = bucketDesc.isSensitive();
-    sb.append(constructSubstringClause(columnPrefix+columnName,"?",!isSensitive));
-    list.add(bucketDesc.getRegexp());
-  }
-
-  /** Add criteria clauses to query.
-  */
-  protected boolean addCriteria(StringBuilder sb, ArrayList list, String fieldPrefix, String connectionName, FilterCriteria criteria, boolean whereEmitted)
-  {
-    whereEmitted = emitClauseStart(sb,whereEmitted);
-    sb.append(fieldPrefix).append(ownerNameField).append("=?");
-    list.add(connectionName);
-
-    String[] activities = criteria.getActivities();
-    if (activities != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      if (activities.length == 0)
-      {
-        sb.append("0>1");
-      }
-      else
-      {
-        sb.append(fieldPrefix).append(activityTypeField).append(" IN(");
-        int i = 0;
-        while (i < activities.length)
-        {
-          if (i > 0)
-            sb.append(",");
-          String activity = activities[i++];
-          sb.append("?");
-          list.add(activity);
-        }
-        sb.append(")");
-      }
-    }
-
-    Long startTime = criteria.getStartTime();
-    if (startTime != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      sb.append(fieldPrefix).append(startTimeField).append(">").append(startTime.toString());
-    }
-
-    Long endTime = criteria.getEndTime();
-    if (endTime != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      sb.append(fieldPrefix).append(endTimeField).append("<=").append(endTime.toString());
-    }
-
-    RegExpCriteria entityMatch = criteria.getEntityMatch();
-    if (entityMatch != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      sb.append(constructRegexpClause(fieldPrefix+entityIdentifierField,"?",entityMatch.isInsensitive()));
-      list.add(entityMatch.getRegexpString());
-    }
-
-    RegExpCriteria resultCodeMatch = criteria.getResultCodeMatch();
-    if (resultCodeMatch != null)
-    {
-      whereEmitted = emitClauseStart(sb,whereEmitted);
-      sb.append(constructRegexpClause(fieldPrefix+resultCodeField,"?",resultCodeMatch.isInsensitive()));
-      list.add(resultCodeMatch.getRegexpString());
-    }
-
-    return whereEmitted;
-  }
-
-  /** Emit a WHERE or an AND, depending...
-  */
-  protected boolean emitClauseStart(StringBuilder sb, boolean whereEmitted)
-  {
-    if (whereEmitted)
-      sb.append(" AND ");
-    else
-      sb.append(" WHERE ");
-    return true;
-  }
-
-  /** Add ordering.
-  */
-  protected void addOrdering(StringBuilder sb, String[] completeFieldList, SortOrder sort)
-  {
-    // Keep track of the fields we've seen
-    Map hash = new HashMap();
-
-    // Emit the "Order by"
-    sb.append(" ORDER BY ");
-
-    // Go through the specified list
-    int i = 0;
-    int count = sort.getCount();
-    while (i < count)
-    {
-      if (i > 0)
-        sb.append(",");
-      String column = sort.getColumn(i);
-      sb.append(column);
-      if (sort.getDirection(i) == sort.SORT_ASCENDING)
-        sb.append(" ASC");
-      else
-        sb.append(" DESC");
-      hash.put(column,column);
-      i++;
-    }
-
-    // Now, go through the complete field list, and emit sort criteria for everything
-    // not actually specified.  This is so LIMIT and OFFSET give consistent results.
-
-    int j = 0;
-    while (j < completeFieldList.length)
-    {
-      String field = completeFieldList[j];
-      if (hash.get(field) == null)
-      {
-        if (i > 0)
-          sb.append(",");
-        sb.append(field);
-	// Always make it DESC order...
-	sb.append(" DESC");
-        i++;
-      }
-      j++;
-    }
-  }
-
-  /** Add limit and offset.
-  */
-  protected void addLimits(StringBuilder sb, int startRow, int maxRowCount)
-  {
-    sb.append(" ").append(constructOffsetLimitClause(startRow,maxRowCount));
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/ThrottleSpecManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/ThrottleSpecManager.java
deleted file mode 100644
index a0469ff..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repository/ThrottleSpecManager.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/* $Id: ThrottleSpecManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.repository;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class manages the "throttlespec" table, which contains the throttle specifications for each connection.
-* These are basically tuples consisting of a regexp and a fetch rate.  There's a description of each tuple,
-* so that a person can attach a description of what they are attempting to do with each limit.
-* 
-* <br><br>
-* <b>throttlespec</b>
-* <table border="1" cellpadding="3" cellspacing="0">
-* <tr class="TableHeadingColor">
-* <th>Field</th><th>Type</th><th>Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
-* <tr><td>ownername</td><td>VARCHAR(32)</td><td>Reference:repoconnections.connectionname</td></tr>
-* <tr><td>description</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>matchstring</td><td>VARCHAR(255)</td><td></td></tr>
-* <tr><td>throttle</td><td>FLOAT</td><td></td></tr>
-* </table>
-* <br><br>
-* 
-*/
-public class ThrottleSpecManager extends org.apache.manifoldcf.core.database.BaseTable
-{
-  public static final String _rcsid = "@(#)$Id: ThrottleSpecManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Schema
-  public final static String ownerNameField = "ownername";
-  public final static String descriptionField = "description";
-  public final static String matchField = "matchstring";
-  public final static String throttleField = "throttle";
-
-  /** Constructor.
-  *@param database is the database instance.
-  */
-  public ThrottleSpecManager(IDBInterface database)
-    throws ManifoldCFException
-  {
-    super(database,"throttlespec");
-  }
-
-  /** Install or upgrade.
-  *@param ownerTable is the name of the table that owns this one.
-  *@param owningTablePrimaryKey is the primary key of the owning table.
-  */
-  public void install(String ownerTable, String owningTablePrimaryKey)
-    throws ManifoldCFException
-  {
-    // Always use a loop, in case upgrade needs it.
-    while (true)
-    {
-      Map existing = getTableSchema(null,null);
-      if (existing == null)
-      {
-        HashMap map = new HashMap();
-        map.put(ownerNameField,new ColumnDescription("VARCHAR(32)",false,false,ownerTable,owningTablePrimaryKey,false));
-        map.put(descriptionField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(matchField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false));
-        map.put(throttleField,new ColumnDescription("FLOAT",false,false,null,null,false));
-        performCreate(map,null);
-      }
-      else
-      {
-        // Upgrade code goes here, if needed.
-      }
-
-      // Index management
-      IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerNameField});
-
-      // Get rid of indexes that shouldn't be there
-      Map indexes = getTableIndexes(null,null);
-      Iterator iter = indexes.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String indexName = (String)iter.next();
-        IndexDescription id = (IndexDescription)indexes.get(indexName);
-
-        if (ownerIndex != null && id.equals(ownerIndex))
-          ownerIndex = null;
-        else if (indexName.indexOf("_pkey") == -1)
-          // This index shouldn't be here; drop it
-          performRemoveIndex(indexName);
-      }
-
-      // Add the ones we didn't find
-      if (ownerIndex != null)
-        performAddIndex(null,ownerIndex);
-
-      break;
-    }
-  }
-
-  /** Uninstall.
-  */
-  public void deinstall()
-    throws ManifoldCFException
-  {
-    performDrop(null);
-  }
-
-  /** Read rows for a given owner name.
-  *@param name is the owner name.
-  *@return a list, with columns: "description", "match", and "value".
-  */
-  public IResultSet readRows(String name)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerNameField,name)});
-    return performQuery("SELECT "+descriptionField+" AS description,"+matchField+" AS match,"+throttleField+" AS value FROM "+
-      getTableName()+" WHERE "+query,list,null,null);
-  }
-
-  /** Calculate the maximum number of clauses we can use with getRows.
-  */
-  public int maxClauseGetRows()
-  {
-    return findConjunctionClauseMax(new ClauseDescription[]{});
-  }
-    
-  /** Fill in a set of throttles corresponding to a set of connection names.
-  *@param connections is the set of connections to fill in.
-  *@param indexMap maps the connection name to the index in the connections array.
-  *@param ownerNameParams is the corresponding set of connection name parameters.
-  */
-  public void getRows(IRepositoryConnection[] connections, Map indexMap, ArrayList ownerNameParams)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new MultiClause(ownerNameField,ownerNameParams)});
-    IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+query,list,
-      null,null);
-    int i = 0;
-    while (i < set.getRowCount())
-    {
-      IResultRow row = set.getRow(i);
-      String ownerName = (String)row.getValue(ownerNameField);
-      int index = ((Integer)indexMap.get(ownerName)).intValue();
-      String description = (String)row.getValue(descriptionField);
-      String match = (String)row.getValue(matchField);
-      float throttle = new Float(row.getValue(throttleField).toString()).floatValue();
-      connections[index].addThrottleValue(match,description,throttle);
-      i++;
-    }
-  }
-
-  /** Write a throttle spec into the database.
-  *@param owner is the owning connection name.
-  *@param connection is the connection to write throttle specs for.
-  */
-  public void writeRows(String owner, IRepositoryConnection connection)
-    throws ManifoldCFException
-  {
-    beginTransaction();
-    try
-    {
-      int i = 0;
-      HashMap map = new HashMap();
-      String[] matches = connection.getThrottles();
-      while (i < matches.length)
-      {
-        String match = matches[i++];
-        String description = connection.getThrottleDescription(match);
-        float value = connection.getThrottleValue(match);
-        map.clear();
-        map.put(matchField,match);
-        if (description != null && description.length() > 0)
-          map.put(descriptionField,description);
-        map.put(throttleField,new Float(value));
-        map.put(ownerNameField,owner);
-        performInsert(map,null);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      signalRollback();
-      throw e;
-    }
-    finally
-    {
-      endTransaction();
-    }
-  }
-
-  /** Delete rows.
-  *@param owner is the owner whose rows to delete.
-  */
-  public void deleteRows(String owner)
-    throws ManifoldCFException
-  {
-    ArrayList list = new ArrayList();
-    String query = buildConjunctionClause(list,new ClauseDescription[]{
-      new UnitaryClause(ownerNameField,owner)});
-    performDelete("WHERE "+query,list,null);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repositoryconnectorpool/RepositoryConnectorPool.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repositoryconnectorpool/RepositoryConnectorPool.java
deleted file mode 100644
index 2c7858b..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/repositoryconnectorpool/RepositoryConnectorPool.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.repositoryconnectorpool;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import java.util.*;
-import java.io.*;
-
-/** An implementation of IRepositoryConnectorPool.
-* Coordination and allocation among cluster members is managed within. 
-* These objects are thread-local, so do not share them among threads.
-*/
-public class RepositoryConnectorPool implements IRepositoryConnectorPool
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Local connector pool */
-  protected final static LocalPool localPool = new LocalPool();
-
-  // This implementation is a place-holder for the real one, which will likely fold in the pooling code
-  // as we strip it out of RepositoryConnectorFactory.
-
-  /** Thread context */
-  protected final IThreadContext threadContext;
-  
-  /** Constructor */
-  public RepositoryConnectorPool(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    this.threadContext = threadContext;
-  }
-  
-  /** Get multiple repository connectors, all at once.  Do this in a particular order
-  * so that any connector exhaustion will not cause a deadlock.
-  *@param orderingKeys are the keys which determine in what order the connectors are obtained.
-  *@param repositoryConnections are the connections to use the build the connector instances.
-  */
-  @Override
-  public IRepositoryConnector[] grabMultiple(String[] orderingKeys, IRepositoryConnection[] repositoryConnections)
-    throws ManifoldCFException
-  {
-    // For now, use the RepositoryConnectorFactory method.  This will require us to extract info
-    // from each repository connection, however.
-    String[] connectionNames = new String[repositoryConnections.length];
-    String[] classNames = new String[repositoryConnections.length];
-    ConfigParams[] configInfos = new ConfigParams[repositoryConnections.length];
-    int[] maxPoolSizes = new int[repositoryConnections.length];
-    
-    for (int i = 0; i < repositoryConnections.length; i++)
-    {
-      connectionNames[i] = repositoryConnections[i].getName();
-      classNames[i] = repositoryConnections[i].getClassName();
-      configInfos[i] = repositoryConnections[i].getConfigParams();
-      maxPoolSizes[i] = repositoryConnections[i].getMaxConnections();
-    }
-    return localPool.grabMultiple(threadContext,
-      orderingKeys, connectionNames, classNames, configInfos, maxPoolSizes);
-  }
-
-  /** Get a repository connector.
-  * The connector is specified by a repository connection object.
-  *@param authorityConnection is the repository connection to base the connector instance on.
-  */
-  @Override
-  public IRepositoryConnector grab(IRepositoryConnection repositoryConnection)
-    throws ManifoldCFException
-  {
-    return localPool.grab(threadContext, repositoryConnection.getName(), repositoryConnection.getClassName(),
-      repositoryConnection.getConfigParams(), repositoryConnection.getMaxConnections());
-  }
-
-  /** Release multiple repository connectors.
-  *@param connections are the connections describing the instances to release.
-  *@param connectors are the connector instances to release.
-  */
-  @Override
-  public void releaseMultiple(IRepositoryConnection[] connections, IRepositoryConnector[] connectors)
-    throws ManifoldCFException
-  {
-    String[] connectionNames = new String[connections.length];
-    for (int i = 0; i < connections.length; i++)
-    {
-      connectionNames[i] = connections[i].getName();
-    }
-    localPool.releaseMultiple(threadContext, connectionNames, connectors);
-  }
-
-  /** Release a repository connector.
-  *@param connection is the connection describing the instance to release.
-  *@param connector is the connector to release.
-  */
-  @Override
-  public void release(IRepositoryConnection connection, IRepositoryConnector connector)
-    throws ManifoldCFException
-  {
-    localPool.release(threadContext, connection.getName(), connector);
-  }
-
-  /** Idle notification for inactive repository connector handles.
-  * This method polls all inactive handles.
-  */
-  @Override
-  public void pollAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.pollAllConnectors(threadContext);
-  }
-
-  /** Flush only those connector handles that are currently unused.
-  */
-  @Override
-  public void flushUnusedConnectors()
-    throws ManifoldCFException
-  {
-    localPool.flushUnusedConnectors(threadContext);
-  }
-
-  /** Clean up all open repository connector handles.
-  * This method is called when the connector pool needs to be flushed,
-  * to free resources.
-  */
-  @Override
-  public void closeAllConnectors()
-    throws ManifoldCFException
-  {
-    localPool.closeAllConnectors(threadContext);
-  }
-
-  /** Actual static mapping connector pool */
-  protected static class LocalPool extends org.apache.manifoldcf.core.connectorpool.ConnectorPool<IRepositoryConnector>
-  {
-    public LocalPool()
-    {
-      super("_REPOSITORYCONNECTORPOOL_");
-    }
-    
-    @Override
-    protected boolean isInstalled(IThreadContext tc, String className)
-      throws ManifoldCFException
-    {
-      IConnectorManager connectorManager = ConnectorManagerFactory.make(tc);
-      return connectorManager.isInstalled(className);
-    }
-
-    @Override
-    protected boolean isConnectionNameValid(IThreadContext tc, String connectionName)
-      throws ManifoldCFException
-    {
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      return connectionManager.load(connectionName) != null;
-    }
-
-    public IRepositoryConnector[] grabMultiple(IThreadContext tc, String[] orderingKeys, String[] connectionNames, String[] classNames, ConfigParams[] configInfos, int[] maxPoolSizes)
-      throws ManifoldCFException
-    {
-      return grabMultiple(tc,IRepositoryConnector.class,orderingKeys,connectionNames,classNames,configInfos,maxPoolSizes);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/reprioritizationtracker/ReprioritizationTracker.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/reprioritizationtracker/ReprioritizationTracker.java
deleted file mode 100644
index 5e05183..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/reprioritizationtracker/ReprioritizationTracker.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.reprioritizationtracker;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-
-/** This class tracks cluster-wide reprioritization operations.
-* These operations are driven forward by whatever thread needs them,
-* and are completed if those processes die by the threads that clean up
-* after the original process.
-*/
-public class ReprioritizationTracker implements IReprioritizationTracker
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final static String trackerWriteLock = "_REPR_TRACKER_LOCK_";
-  protected final static String trackerProcessIDResource = "_REPR_TRACKER_PID_";
-  protected final static String trackerReproIDResource = "_REPR_TRACKER_RID_";
-  protected final static String trackerMinimumDepthResource = "_REPR_MINDEPTH_";
-  
-  /** Lock manager */
-  protected final ILockManager lockManager;
-  protected final IBinManager binManager;
-
-  /** Preload requests */
-  protected final Map<PreloadKey,PreloadRequest> preloadRequests = new HashMap<PreloadKey,PreloadRequest>();
-  /** Preload values */
-  protected final Map<PreloadKey,PreloadedValues> preloadedValues = new HashMap<PreloadKey,PreloadedValues>();
-    
-  /** Constructor.
-  */
-  public ReprioritizationTracker(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    lockManager = LockManagerFactory.make(threadContext);
-    binManager = BinManagerFactory.make(threadContext);
-  }
-  
-  /** Start a reprioritization activity.
-  *@param prioritizationTime is the timestamp of the prioritization.
-  *@param processID is the process ID of the process performing/waiting for the prioritization
-  * to complete.
-  *@param reproID is the reprocessing thread ID
-  */
-  @Override
-  public void startReprioritization(String processID, String reproID)
-    throws ManifoldCFException
-  {
-    lockManager.enterWriteLock(trackerWriteLock);
-    try
-    {
-      String currentProcessID = readProcessID();
-      if (currentProcessID != null)
-      {
-        // Already a reprioritization in progress.
-        return;
-      }
-      writeProcessID(processID);
-      writeReproID(reproID);
-      try
-      {
-        binManager.reset();
-      }
-      catch (Throwable e)
-      {
-        writeProcessID(null);
-        writeReproID(null);
-        if (e instanceof Error)
-          throw (Error)e;
-        else if (e instanceof RuntimeException)
-          throw (RuntimeException)e;
-        else if (e instanceof ManifoldCFException)
-          throw (ManifoldCFException)e;
-        else
-          throw new RuntimeException("Unknown exception: "+e.getClass().getName()+": "+e.getMessage(),e);
-      }
-      writeMinimumDepth(0.0);
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(trackerWriteLock);
-    }
-  }
-  
-  
-  /** Complete a reprioritization activity.  Prioritization will be marked as complete
-  * only if the processID matches the one that started the current reprioritization.
-  *@param processID is the process ID of the process completing the prioritization.
-  */
-  @Override
-  public void doneReprioritization(String reproID)
-    throws ManifoldCFException
-  {
-    lockManager.enterWriteLock(trackerWriteLock);
-    try
-    {
-      String currentProcessID = readProcessID();
-      String currentReproID = readReproID();
-      if (currentProcessID != null && currentReproID != null && currentReproID.equals(reproID))
-      {
-        // Null out the fields
-        writeProcessID(null);
-        writeReproID(null);
-      }
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(trackerWriteLock);
-    }
-  }
-  
-  /** Check if the specified processID is the one performing reprioritization.
-  *@param processID is the process ID to check.
-  *@return the repro ID if the processID is confirmed to be the one.
-  */
-  @Override
-  public String isSpecifiedProcessReprioritizing(String processID)
-    throws ManifoldCFException
-  {
-    lockManager.enterWriteLock(trackerWriteLock);
-    try
-    {
-      String currentProcessID = readProcessID();
-      String currentReproID = readReproID();
-      if (currentProcessID != null && currentReproID != null && currentProcessID.equals(processID))
-        return currentReproID;
-      return null;
-    }
-    finally
-    {
-      lockManager.leaveWriteLock(trackerWriteLock);
-    }
-  }
-  
-  /** Assess the current minimum depth.
-  * This method is called to provide information about the priorities of the documents being currently
-  * queued.  It is the case that it is unoptimal to assign document priorities that are fundamentally higher than this value,
-  * because then the new documents will be preferentially queued, and the goal of distributing documents across bins will not be
-  * adequately met.
-  *@param binNamesSet is the current set of priorities we see on the queuing operation.
-  */
-  @Override
-  public void assessMinimumDepth(Double[] binNamesSet)
-    throws ManifoldCFException
-  {
-    double newMinPriority = Double.MAX_VALUE;
-    for (Double binValue : binNamesSet)
-    {
-      if (binValue.doubleValue() < newMinPriority)
-        newMinPriority = binValue.doubleValue();
-    }
-
-    if (newMinPriority != Double.MAX_VALUE)
-    {
-
-      lockManager.enterWriteLock(trackerWriteLock);
-      try
-      {
-        String processID = readProcessID();
-        if (processID == null)
-        {
-          double currentMinimumDepth = readMinimumDepth();
-
-          // Convert minPriority to minDepth.
-          // Note that this calculation does not take into account anything having to do with connection rates, throttling,
-          // or other adjustment factors.  It allows us only to obtain the "raw" minimum depth: the depth without any
-          // adjustments.
-          double newMinDepth = Math.exp(newMinPriority)-1.0;
-
-          if (newMinDepth > currentMinimumDepth)
-          {
-            writeMinimumDepth(newMinDepth);
-            if (Logging.scheduling.isDebugEnabled())
-              Logging.scheduling.debug("Setting new minimum depth value to "+new Double(currentMinimumDepth).toString());
-          }
-          else
-          {
-            if (newMinDepth < currentMinimumDepth && Logging.scheduling.isDebugEnabled())
-              Logging.scheduling.debug("Minimum depth value seems to have been set too high too early! currentMin = "+new Double(currentMinimumDepth).toString()+"; queue value = "+new Double(newMinDepth).toString());
-          }
-        }
-      }
-      finally
-      {
-        lockManager.leaveWriteLock(trackerWriteLock);
-      }
-    }
-  }
-
-  /** Retrieve current minimum depth.
-  *@return the current minimum depth to use.
-  */
-  @Override
-  public double getMinimumDepth()
-    throws ManifoldCFException
-  {
-    lockManager.enterReadLock(trackerWriteLock);
-    try
-    {
-      return readMinimumDepth();
-    }
-    finally
-    {
-      lockManager.leaveReadLock(trackerWriteLock);
-    }
-  }
-  
-  /** Note preload amounts.
-  */
-  @Override
-  public void addPreloadRequest(String connectorClass, String binName, double weightedMinimumDepth)
-  {
-    final PreloadKey pk = new PreloadKey(connectorClass, binName);
-    PreloadRequest pr = preloadRequests.get(pk);
-    if (pr == null)
-    {
-      pr = new PreloadRequest(weightedMinimumDepth);
-      preloadRequests.put(pk,pr);
-    }
-    else
-      pr.updateRequest(weightedMinimumDepth);
-  }
-  
-  
-  /** Preload bin values.  Call this OUTSIDE of a transaction.
-  */
-  @Override
-  public void preloadBinValues()
-    throws ManifoldCFException
-  {
-    for (PreloadKey pk : preloadRequests.keySet())
-    {
-      PreloadRequest pr = preloadRequests.get(pk);
-      double[] newValues = binManager.getIncrementBinValuesInTransaction(pk.connectorClass, pk.binName, pr.getWeightedMinimumDepth(), pr.getRequestCount());
-      PreloadedValues pv = new PreloadedValues(newValues);
-      preloadedValues.put(pk,pv);
-    }
-    preloadRequests.clear();
-  }
-  
-  /** Clear any preload requests.
-  */
-  @Override
-  public void clearPreloadRequests()
-  {
-    preloadRequests.clear();
-  }
-  
-  /** Clear remaining preloaded values.
-  */
-  @Override
-  public void clearPreloadedValues()
-  {
-    preloadedValues.clear();
-  }
-
-  /** Get a bin value.
-  *@param connectorClass is the connector class name.
-  *@param binName is the bin name.
-  *@param weightedMinimumDepth is the minimum depth to use.
-  *@return the bin value.
-  */
-  @Override
-  public double getIncrementBinValue(String connectorClass, String binName, double weightedMinimumDepth)
-    throws ManifoldCFException
-  {
-    final PreloadKey key = new PreloadKey(connectorClass,binName);
-    PreloadedValues pv = preloadedValues.get(key);
-    if (pv != null)
-    {
-      Double rval = pv.getNextValue();
-      if (rval != null)
-        return rval.doubleValue();
-    }
-    return binManager.getIncrementBinValues(connectorClass, binName, weightedMinimumDepth,1)[0];
-  }
-  
-  // Protected methods
-  
-  /** Read process ID.
-  *@return processID, or null if none.
-  */
-  protected String readProcessID()
-    throws ManifoldCFException
-  {
-    byte[] processIDData = lockManager.readData(trackerProcessIDResource);
-    if (processIDData == null)
-      return null;
-    else
-      return new String(processIDData, StandardCharsets.UTF_8);
-
-  }
-  
-  /** Write process ID.
-  *@param processID is the process ID to write.
-  */
-  protected void writeProcessID(String processID)
-    throws ManifoldCFException
-  {
-    if (processID == null)
-      lockManager.writeData(trackerProcessIDResource, null);
-    else
-    {
-        byte[] processIDData = processID.getBytes(StandardCharsets.UTF_8);
-        lockManager.writeData(trackerProcessIDResource, processIDData);
-    }
-  }
-
-  /** Read repriotization ID.
-  *@return reproID, or null if none.
-  */
-  protected String readReproID()
-    throws ManifoldCFException
-  {
-    byte[] reproIDData = lockManager.readData(trackerReproIDResource);
-    if (reproIDData == null)
-      return null;
-    else
-      return new String(reproIDData, StandardCharsets.UTF_8);
-
-  }
-  
-  /** Write repro ID.
-  *@param reproID is the repro ID to write.
-  */
-  protected void writeReproID(String reproID)
-    throws ManifoldCFException
-  {
-    if (reproID == null)
-      lockManager.writeData(trackerReproIDResource, null);
-    else
-    {
-        byte[] reproIDData = reproID.getBytes(StandardCharsets.UTF_8);
-        lockManager.writeData(trackerReproIDResource, reproIDData);
-    }
-  }
-
-  /** Read minimum depth.
-  *@return the minimum depth.
-  */
-  protected double readMinimumDepth()
-    throws ManifoldCFException
-  {
-    byte[] data = lockManager.readData(trackerMinimumDepthResource);
-    if (data == null || data.length != 8)
-      return 0.0;
-    long dataLong = (((long)data[0]) & 0xffL) +
-      ((((long)data[1]) << 8) & 0xff00L) +
-      ((((long)data[2]) << 16) & 0xff0000L) +
-      ((((long)data[3]) << 24) & 0xff000000L) +
-      ((((long)data[4]) << 32) & 0xff00000000L) +
-      ((((long)data[5]) << 40) & 0xff0000000000L) +
-      ((((long)data[6]) << 48) & 0xff000000000000L) +
-      ((((long)data[7]) << 56) & 0xff00000000000000L);
-
-    return Double.longBitsToDouble(dataLong);
-  }
-  
-  /** Write minimum depth.
-  *@param the minimum depth.
-  */
-  protected void writeMinimumDepth(double depth)
-    throws ManifoldCFException
-  {
-    long dataLong = Double.doubleToLongBits(depth);
-    byte[] data = new byte[8];
-    data[0] = (byte)(dataLong & 0xffL);
-    data[1] = (byte)((dataLong >> 8) & 0xffL);
-    data[2] = (byte)((dataLong >> 16) & 0xffL);
-    data[3] = (byte)((dataLong >> 24) & 0xffL);
-    data[4] = (byte)((dataLong >> 32) & 0xffL);
-    data[5] = (byte)((dataLong >> 40) & 0xffL);
-    data[6] = (byte)((dataLong >> 48) & 0xffL);
-    data[7] = (byte)((dataLong >> 56) & 0xffL);
-    lockManager.writeData(trackerMinimumDepthResource,data);
-  }
-  
-  /** A preload request */
-  protected static class PreloadRequest
-  {
-    protected double weightedMinimumDepth;
-    protected int requestCount;
-    
-    public PreloadRequest(double weightedMinimumDepth)
-    {
-      this.weightedMinimumDepth = weightedMinimumDepth;
-      this.requestCount = 1;
-    }
-    
-    public void updateRequest(double weightedMinimumDepth)
-    {
-      if (this.weightedMinimumDepth < weightedMinimumDepth)
-        this.weightedMinimumDepth = weightedMinimumDepth;
-      requestCount++;
-    }
-    
-    public double getWeightedMinimumDepth()
-    {
-      return weightedMinimumDepth;
-    }
-    
-    public int getRequestCount()
-    {
-      return requestCount;
-    }
-  }
-  
-  /** A set of preloaded values */
-  protected static class PreloadedValues
-  {
-    protected double[] values;
-    protected int valueIndex;
-    
-    public PreloadedValues(double[] values)
-    {
-      this.values = values;
-      this.valueIndex = valueIndex;
-    }
-    
-    public Double getNextValue()
-    {
-      if (valueIndex == values.length)
-        return null;
-      return new Double(values[valueIndex++]);
-    }
-  }
-  
-  /** Connector class name, bin name pair */
-  protected static class PreloadKey
-  {
-    public final String connectorClass;
-    public final String binName;
-    
-    public PreloadKey(final String connectorClass, final String binName) {
-      this.connectorClass = connectorClass;
-      this.binName = binName;
-    }
-    
-    public int hashCode() {
-      return connectorClass.hashCode() + binName.hashCode();
-    }
-    
-    public boolean equals(final Object o) {
-      if (!(o instanceof PreloadKey))
-        return false;
-      final PreloadKey pk = (PreloadKey)o;
-      return connectorClass.equals(pk.connectorClass) &&
-        binName.equals(pk.binName);
-    }
-  }
-  
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/AssessmentThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/AssessmentThread.java
deleted file mode 100644
index 0396b00..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/AssessmentThread.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically checks for jobs whose assessment state is marked
-* "UNKNOWN", and assesses those jobs to make the proper state transitions occur.
-*/
-public class AssessmentThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public AssessmentThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("Assessment thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.threads.debug("Start up assessment thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Do the assessment
-          jobManager.assessMarkedJobs();
-          
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Assessment thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("AssessmentThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/CleanupQueuedDocument.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/CleanupQueuedDocument.java
deleted file mode 100644
index a40111e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/CleanupQueuedDocument.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-/** This class represents a document that will be placed on the document cleanup queue, and will be
-* processed by a cleanup worker thread.
-*/
-public class CleanupQueuedDocument extends DeleteQueuedDocument
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Flag indicating whether we should delete the document from the index or not. */
-  protected boolean deleteFromIndex;
-
-  /** Constructor.
-  *@param documentDescription is the document description.
-  */
-  public CleanupQueuedDocument(DocumentDescription documentDescription, boolean deleteFromIndex)
-  {
-    super(documentDescription);
-    this.deleteFromIndex = deleteFromIndex;
-  }
-
-  /** Check if document should be removed from the index.
-  *@return true if it should be removed.
-  */
-  public boolean shouldBeRemovedFromIndex()
-  {
-    return deleteFromIndex;
-  }
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/CrawlerAgent.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/CrawlerAgent.java
deleted file mode 100644
index 5f62552..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/CrawlerAgent.java
+++ /dev/null
@@ -1,796 +0,0 @@
-/* $Id: CrawlerAgent.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This is the main agent class for the crawler.
-*/
-public class CrawlerAgent implements IAgent
-{
-  public static final String _rcsid = "@(#)$Id: CrawlerAgent.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Thread objects.
-  // These get filled in as threads are created.
-  protected JobStartThread jobStartThread = null;
-  protected StufferThread stufferThread = null;
-  protected FinisherThread finisherThread = null;
-  protected JobNotificationThread notificationThread = null;
-  protected StartupThread startupThread = null;
-  protected StartDeleteThread startDeleteThread = null;
-  protected JobDeleteThread jobDeleteThread = null;
-  protected WorkerThread[] workerThreads = null;
-  protected ExpireStufferThread expireStufferThread = null;
-  protected ExpireThread[] expireThreads = null;
-  protected DocumentDeleteStufferThread deleteStufferThread = null;
-  protected DocumentDeleteThread[] deleteThreads = null;
-  protected DocumentCleanupStufferThread cleanupStufferThread = null;
-  protected DocumentCleanupThread[] cleanupThreads = null;
-  protected JobResetThread jobResetThread = null;
-  protected SeedingThread seedingThread = null;
-  protected IdleCleanupThread idleCleanupThread = null;
-  protected SetPriorityThread setPriorityThread = null;
-  protected HistoryCleanupThread historyCleanupThread = null;
-  protected AssessmentThread assessmentThread = null;
-  
-  // Reset managers
-  /** Worker thread pool reset manager */
-  protected WorkerResetManager workerResetManager = null;
-  /** Delete thread pool reset manager */
-  protected DocDeleteResetManager docDeleteResetManager = null;
-  /** Cleanup thread pool reset manager */
-  protected DocCleanupResetManager docCleanupResetManager = null;
-
-  // Number of worker threads
-  protected int numWorkerThreads = 0;
-  // Number of delete threads
-  protected int numDeleteThreads = 0;
-  // Number of cleanup threads
-  protected int numCleanupThreads = 0;
-  // Number of expiration threads
-  protected int numExpireThreads = 0;
-  // Factor for low water level in queueing
-  protected float lowWaterFactor = 5.0f;
-  // Factor in amount to stuff
-  protected float stuffAmtFactor = 0.5f;
-
-  /** Process identifier for this agent */
-  protected String processID = null;
-
-  /** Constructor.
-  *@param threadContext is the thread context.
-  */
-  public CrawlerAgent()
-    throws ManifoldCFException
-  {
-  }
-
-  /** Initialize agent environment.
-  * This is called before any of the other operations are called, and is meant to insure that
-  * the environment is properly initialized.
-  */
-  public void initialize(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(threadContext);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localInitialize(threadContext);
-  }
-  
-  /** Tear down agent environment.
-  * This is called after all the other operations are completed, and is meant to allow
-  * environment resources to be freed.
-  */
-  public void cleanUp(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localCleanup(threadContext);
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(threadContext);
-  }
-
-  /** Install agent.  This usually installs the agent's database tables etc.
-  */
-  @Override
-  public void install(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Install the system tables for the crawler.
-    ManifoldCF.installSystemTables(threadContext);
-  }
-
-  /** Uninstall agent.  This must clean up everything the agent is responsible for.
-  */
-  @Override
-  public void deinstall(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    ManifoldCF.deinstallSystemTables(threadContext);
-  }
-
-  /** Called ONLY when no other active services of this kind are running.  Meant to be
-  * used after the cluster has been down for an indeterminate period of time.
-  */
-  @Override
-  public void clusterInit(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.prepareForClusterStart();
-  }
-
-  /** Cleanup after ALL agents processes.
-  * Call this method to clean up dangling persistent state when a cluster is just starting
-  * to come up.  This method CANNOT be called when there are any active agents
-  * processes at all.
-  *@param processID is the current process ID.
-  */
-  @Override
-  public void cleanUpAllAgentData(IThreadContext threadContext, String currentProcessID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.cleanupProcessData();
-    // What kind of reprioritization should be done here?
-    // Answer: since we basically keep everything in the database now, the only kind of reprioritization we need
-    // to take care of are dangling ones that won't get done because the process that was doing them went
-    // away.  BUT: somebody may have blown away lock info, in which case we won't know anything at all.
-    // So we do everything in that case.
-    
-    ManifoldCF.resetAllDocumentPriorities(threadContext,currentProcessID);
-
-  }
-  
-  /** Cleanup after agents process.
-  * Call this method to clean up dangling persistent state after agent has been stopped.
-  * This method CANNOT be called when the agent is active, but it can
-  * be called at any time and by any process in order to guarantee that a terminated
-  * agent does not block other agents from completing their tasks.
-  *@param currentProcessID is the current process ID.
-  *@param cleanupProcessID is the process ID of the agent to clean up after.
-  */
-  @Override
-  public void cleanUpAgentData(IThreadContext threadContext, String currentProcessID, String cleanupProcessID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.cleanupProcessData(cleanupProcessID);
-    
-    // If one agents process was starting a reprioritization, it could have started the reprioritization sequence, but
-    // failed to complete it.  If so, we may need to reset/complete the reprioritization sequence, which is defined as:
-    // - Resetting prioritization parameters
-    // - Removing all existing document priorities
-    // These must go together in order for the reset to be correct.
-    
-    IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-    String reproID = rt.isSpecifiedProcessReprioritizing(cleanupProcessID);
-    if (reproID != null)
-    {
-      // We have to take over the prioritization for the process, which apparently died
-      // in the middle.
-      
-      jobManager.clearAllDocumentPriorities();
-      
-      /*
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-
-      // Reprioritize all documents in the jobqueue, 1000 at a time
-
-      Map<String,IRepositoryConnection> connectionMap = new HashMap<String,IRepositoryConnection>();
-      Map<Long,IJobDescription> jobDescriptionMap = new HashMap<Long,IJobDescription>();
-      
-      // Do the 'not yet processed' documents only.  Documents that are queued for reprocessing will be assigned
-      // new priorities.  Already processed documents won't.  This guarantees that our bins are appropriate for current thread
-      // activity.
-      // In order for this to be the correct functionality, ALL reseeding and requeuing operations MUST reset the associated document
-      // priorities.
-      // ??? -- start the process of reprioritization ONLY; don't do the whole thing.
-      while (true)
-      {
-        long startTime = System.currentTimeMillis();
-
-        Long currentTimeValue = rt.checkReprioritizationInProgress();
-        if (currentTimeValue == null)
-        {
-          // Some other process or thread superceded us.
-          return;
-        }
-        long updateTime = currentTimeValue.longValue();
-        
-        DocumentDescription[] docs = jobManager.getNextNotYetProcessedReprioritizationDocuments(10000);
-        if (docs.length == 0)
-          break;
-
-        // Calculate new priorities for all these documents
-        ManifoldCF.writeDocumentPriorities(threadContext,docs,connectionMap,jobDescriptionMap);
-
-        Logging.threads.debug("Reprioritized "+Integer.toString(docs.length)+" not-yet-processed documents in "+new Long(System.currentTimeMillis()-startTime)+" ms");
-      }
-      */
-      
-      rt.doneReprioritization(reproID);
-    }
-  }
-
-  /** Start the agent.  This method should spin up the agent threads, and
-  * then return.
-  */
-  @Override
-  public void startAgent(IThreadContext threadContext, String processID)
-    throws ManifoldCFException
-  {
-    this.processID = processID;
-    startSystem(threadContext);
-  }
-
-  /** Stop the agent.  This should shut down the agent threads etc.
-  */
-  @Override
-  public void stopAgent(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    stopSystem(threadContext);
-  }
-
-  /** Request permission from agent to delete an output connection.
-  *@param connName is the name of the output connection.
-  *@return true if the connection is in use, false otherwise.
-  */
-  @Override
-  public boolean isOutputConnectionInUse(IThreadContext threadContext, String connName)
-    throws ManifoldCFException
-  {
-    // Check with job manager.
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    return jobManager.checkIfOutputReference(connName);
-  }
-
-  /** Note the deregistration of a set of output connections.
-  *@param connectionNames are the names of the connections being deregistered.
-  */
-  @Override
-  public void noteOutputConnectorDeregistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Notify job manager
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.noteOutputConnectorDeregistration(connectionNames);
-  }
-
-  /** Note the registration of a set of output connections.
-  *@param connectionNames are the names of the connections being registered.
-  */
-  @Override
-  public void noteOutputConnectorRegistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Notify job manager
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.noteOutputConnectorRegistration(connectionNames);
-  }
-
-  /** Note a change in configuration for an output connection.
-  *@param connectionName is the name of the connections being changed.
-  */
-  @Override
-  public void noteOutputConnectionChange(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    // Notify job manager
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.noteOutputConnectionChange(connectionName);
-  }
-
-  /** Request permission from agent to delete a transformation connection.
-  *@param connName is the name of the transformation connection.
-  *@return true if the connection is in use, false otherwise.
-  */
-  @Override
-  public boolean isTransformationConnectionInUse(IThreadContext threadContext, String connName)
-    throws ManifoldCFException
-  {
-    // Check with job manager.
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    return jobManager.checkIfTransformationReference(connName);
-  }
-
-  /** Note the deregistration of a set of transformation connections.
-  *@param connectionNames are the names of the connections being deregistered.
-  */
-  @Override
-  public void noteTransformationConnectorDeregistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Notify job manager
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.noteTransformationConnectorDeregistration(connectionNames);
-  }
-
-  /** Note the registration of a set of transformation connections.
-  *@param connectionNames are the names of the connections being registered.
-  */
-  @Override
-  public void noteTransformationConnectorRegistration(IThreadContext threadContext, String[] connectionNames)
-    throws ManifoldCFException
-  {
-    // Notify job manager
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.noteTransformationConnectorRegistration(connectionNames);
-  }
-
-  /** Note a change in configuration for a transformation connection.
-  *@param connectionName is the name of the connection being changed.
-  */
-  @Override
-  public void noteTransformationConnectionChange(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    // Notify job manager
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    jobManager.noteTransformationConnectionChange(connectionName);
-  }
-
-  /** Start everything.
-  */
-  public void startSystem(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Logging.root.info("Starting up pull-agent...");
-    // Now, start all the threads
-    numWorkerThreads = ManifoldCF.getMaxWorkerThreads(threadContext);
-    if (numWorkerThreads < 1 || numWorkerThreads > 300)
-      throw new ManifoldCFException("Illegal value for the number of worker threads", ManifoldCFException.SETUP_ERROR);
-    numDeleteThreads = ManifoldCF.getMaxDeleteThreads(threadContext);
-    numCleanupThreads = ManifoldCF.getMaxCleanupThreads(threadContext);
-    numExpireThreads = ManifoldCF.getMaxExpireThreads(threadContext);
-    if (numDeleteThreads < 1 || numDeleteThreads > 300)
-      throw new ManifoldCFException("Illegal value for the number of delete threads", ManifoldCFException.SETUP_ERROR);
-    if (numCleanupThreads < 1 || numCleanupThreads > 300)
-      throw new ManifoldCFException("Illegal value for the number of cleanup threads", ManifoldCFException.SETUP_ERROR);
-    if (numExpireThreads < 1 || numExpireThreads > 300)
-      throw new ManifoldCFException("Illegal value for the number of expire threads", ManifoldCFException.SETUP_ERROR);
-    lowWaterFactor = (float)LockManagerFactory.getDoubleProperty(threadContext,ManifoldCF.lowWaterFactorProperty,5.0);
-    if (lowWaterFactor < 1.0 || lowWaterFactor > 1000.0)
-      throw new ManifoldCFException("Illegal value for the low water factor", ManifoldCFException.SETUP_ERROR);
-    stuffAmtFactor = (float)LockManagerFactory.getDoubleProperty(threadContext,ManifoldCF.stuffAmtFactorProperty,2.0);
-    if (stuffAmtFactor < 0.1 || stuffAmtFactor > 1000.0)
-      throw new ManifoldCFException("Illegal value for the stuffing amount factor", ManifoldCFException.SETUP_ERROR);
-
-
-    // Create the threads and objects.  This MUST be completed before there is any chance of "shutdownSystem" getting called.
-
-    QueueTracker queueTracker = new QueueTracker();
-
-
-    DocumentQueue documentQueue = new DocumentQueue();
-    DocumentDeleteQueue documentDeleteQueue = new DocumentDeleteQueue();
-    DocumentCleanupQueue documentCleanupQueue = new DocumentCleanupQueue();
-    DocumentCleanupQueue expireQueue = new DocumentCleanupQueue();
-
-    BlockingDocuments blockingDocuments = new BlockingDocuments();
-
-    workerResetManager = new WorkerResetManager(documentQueue,expireQueue,processID);
-    docDeleteResetManager = new DocDeleteResetManager(documentDeleteQueue,processID);
-    docCleanupResetManager = new DocCleanupResetManager(documentCleanupQueue,processID);
-
-    jobStartThread = new JobStartThread(processID);
-    startupThread = new StartupThread(new StartupResetManager(processID),processID);
-    startDeleteThread = new StartDeleteThread(new DeleteStartupResetManager(processID),processID);
-    finisherThread = new FinisherThread(processID);
-    notificationThread = new JobNotificationThread(new NotificationResetManager(processID),processID);
-    jobDeleteThread = new JobDeleteThread(processID);
-    stufferThread = new StufferThread(documentQueue,numWorkerThreads,workerResetManager,queueTracker,blockingDocuments,lowWaterFactor,stuffAmtFactor,processID);
-    expireStufferThread = new ExpireStufferThread(expireQueue,numExpireThreads,workerResetManager,processID);
-    setPriorityThread = new SetPriorityThread(numWorkerThreads,blockingDocuments,processID);
-    historyCleanupThread = new HistoryCleanupThread(processID);
-
-    workerThreads = new WorkerThread[numWorkerThreads];
-    int i = 0;
-    while (i < numWorkerThreads)
-    {
-      workerThreads[i] = new WorkerThread(Integer.toString(i),documentQueue,workerResetManager,queueTracker,processID);
-      i++;
-    }
-
-    expireThreads = new ExpireThread[numExpireThreads];
-    i = 0;
-    while (i < numExpireThreads)
-    {
-      expireThreads[i] = new ExpireThread(Integer.toString(i),expireQueue,workerResetManager,processID);
-      i++;
-    }
-
-    deleteStufferThread = new DocumentDeleteStufferThread(documentDeleteQueue,numDeleteThreads,docDeleteResetManager,processID);
-    deleteThreads = new DocumentDeleteThread[numDeleteThreads];
-    i = 0;
-    while (i < numDeleteThreads)
-    {
-      deleteThreads[i] = new DocumentDeleteThread(Integer.toString(i),documentDeleteQueue,docDeleteResetManager,processID);
-      i++;
-    }
-      
-    cleanupStufferThread = new DocumentCleanupStufferThread(documentCleanupQueue,numCleanupThreads,docCleanupResetManager,processID);
-    cleanupThreads = new DocumentCleanupThread[numCleanupThreads];
-    i = 0;
-    while (i < numCleanupThreads)
-    {
-      cleanupThreads[i] = new DocumentCleanupThread(Integer.toString(i),documentCleanupQueue,docCleanupResetManager,processID);
-      i++;
-    }
-
-    jobResetThread = new JobResetThread(processID);
-    seedingThread = new SeedingThread(new SeedingResetManager(processID),processID);
-    idleCleanupThread = new IdleCleanupThread(processID);
-    assessmentThread = new AssessmentThread(processID);
-
-    // Start all the threads
-    jobStartThread.start();
-    startupThread.start();
-    startDeleteThread.start();
-    finisherThread.start();
-    notificationThread.start();
-    jobDeleteThread.start();
-    stufferThread.start();
-    expireStufferThread.start();
-    setPriorityThread.start();
-    historyCleanupThread.start();
-
-    i = 0;
-    while (i < numWorkerThreads)
-    {
-      workerThreads[i].start();
-      i++;
-    }
-
-    i = 0;
-    while (i < numExpireThreads)
-    {
-      expireThreads[i].start();
-      i++;
-    }
-
-    cleanupStufferThread.start();
-    i = 0;
-    while (i < numCleanupThreads)
-    {
-      cleanupThreads[i].start();
-      i++;
-    }
-
-    deleteStufferThread.start();
-    i = 0;
-    while (i < numDeleteThreads)
-    {
-      deleteThreads[i].start();
-      i++;
-    }
-
-    jobResetThread.start();
-    seedingThread.start();
-    idleCleanupThread.start();
-    assessmentThread.start();
-
-    Logging.root.info("Pull-agent started");
-  }
-
-  /** Stop the system.
-  */
-  public void stopSystem(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    Logging.root.info("Shutting down pull-agent...");
-    while (jobDeleteThread != null || startupThread != null || startDeleteThread != null ||
-      jobStartThread != null || stufferThread != null ||
-      finisherThread != null || notificationThread != null || workerThreads != null || expireStufferThread != null || expireThreads != null ||
-      deleteStufferThread != null || deleteThreads != null ||
-      cleanupStufferThread != null || cleanupThreads != null ||
-      jobResetThread != null || seedingThread != null || idleCleanupThread != null || assessmentThread != null || setPriorityThread != null || historyCleanupThread != null)
-    {
-      // Send an interrupt to all threads that are still there.
-      // In theory, this only needs to be done once.  In practice, I have seen cases where the thread loses track of the fact that it has been
-      // interrupted (which may be a JVM bug - who knows?), but in any case there's no harm in doing it again.
-      if (historyCleanupThread != null)
-      {
-        historyCleanupThread.interrupt();
-      }
-      if (setPriorityThread != null)
-      {
-        setPriorityThread.interrupt();
-      }
-      if (jobStartThread != null)
-      {
-        jobStartThread.interrupt();
-      }
-      if (jobDeleteThread != null)
-      {
-        jobDeleteThread.interrupt();
-      }
-      if (startupThread != null)
-      {
-        startupThread.interrupt();
-      }
-      if (startDeleteThread != null)
-      {
-        startDeleteThread.interrupt();
-      }
-      if (stufferThread != null)
-      {
-        stufferThread.interrupt();
-      }
-      if (expireStufferThread != null)
-      {
-        expireStufferThread.interrupt();
-      }
-      if (finisherThread != null)
-      {
-        finisherThread.interrupt();
-      }
-      if (notificationThread != null)
-      {
-        notificationThread.interrupt();
-      }
-      if (workerThreads != null)
-      {
-        int i = 0;
-        while (i < workerThreads.length)
-        {
-          Thread workerThread = workerThreads[i++];
-          if (workerThread != null)
-            workerThread.interrupt();
-        }
-      }
-      if (expireThreads != null)
-      {
-        int i = 0;
-        while (i < expireThreads.length)
-        {
-          Thread expireThread = expireThreads[i++];
-          if (expireThread != null)
-            expireThread.interrupt();
-        }
-      }
-      if (cleanupStufferThread != null)
-      {
-        cleanupStufferThread.interrupt();
-      }
-      if (cleanupThreads != null)
-      {
-        int i = 0;
-        while (i < cleanupThreads.length)
-        {
-          Thread cleanupThread = cleanupThreads[i++];
-          if (cleanupThread != null)
-            cleanupThread.interrupt();
-        }
-      }
-      if (deleteStufferThread != null)
-      {
-        deleteStufferThread.interrupt();
-      }
-      if (deleteThreads != null)
-      {
-        int i = 0;
-        while (i < deleteThreads.length)
-        {
-          Thread deleteThread = deleteThreads[i++];
-          if (deleteThread != null)
-            deleteThread.interrupt();
-        }
-      }
-      if (jobResetThread != null)
-      {
-        jobResetThread.interrupt();
-      }
-      if (seedingThread != null)
-      {
-        seedingThread.interrupt();
-      }
-      if (idleCleanupThread != null)
-      {
-        idleCleanupThread.interrupt();
-      }
-      if (assessmentThread != null)
-      {
-        assessmentThread.interrupt();
-      }
-
-      // Now, wait for all threads to die.
-      try
-      {
-        ManifoldCF.sleep(1000L);
-      }
-      catch (InterruptedException e)
-      {
-      }
-
-      // Check to see which died.
-      if (historyCleanupThread != null)
-      {
-        if (!historyCleanupThread.isAlive())
-          historyCleanupThread = null;
-      }
-      if (setPriorityThread != null)
-      {
-        if (!setPriorityThread.isAlive())
-          setPriorityThread = null;
-      }
-      if (jobDeleteThread != null)
-      {
-        if (!jobDeleteThread.isAlive())
-          jobDeleteThread = null;
-      }
-      if (startupThread != null)
-      {
-        if (!startupThread.isAlive())
-          startupThread = null;
-      }
-      if (startDeleteThread != null)
-      {
-        if (!startDeleteThread.isAlive())
-          startDeleteThread = null;
-      }
-      if (jobStartThread != null)
-      {
-        if (!jobStartThread.isAlive())
-          jobStartThread = null;
-      }
-      if (stufferThread != null)
-      {
-        if (!stufferThread.isAlive())
-          stufferThread = null;
-      }
-      if (expireStufferThread != null)
-      {
-        if (!expireStufferThread.isAlive())
-          expireStufferThread = null;
-      }
-      if (finisherThread != null)
-      {
-        if (!finisherThread.isAlive())
-          finisherThread = null;
-      }
-      if (notificationThread != null)
-      {
-        if (!notificationThread.isAlive())
-          notificationThread = null;
-      }
-      if (workerThreads != null)
-      {
-        int i = 0;
-        boolean isAlive = false;
-        while (i < workerThreads.length)
-        {
-          Thread workerThread = workerThreads[i];
-          if (workerThread != null)
-          {
-            if (!workerThread.isAlive())
-              workerThreads[i] = null;
-            else
-              isAlive = true;
-          }
-          i++;
-        }
-        if (!isAlive)
-          workerThreads = null;
-      }
-
-      if (expireThreads != null)
-      {
-        int i = 0;
-        boolean isAlive = false;
-        while (i < expireThreads.length)
-        {
-          Thread expireThread = expireThreads[i];
-          if (expireThread != null)
-          {
-            if (!expireThread.isAlive())
-              expireThreads[i] = null;
-            else
-              isAlive = true;
-          }
-          i++;
-        }
-        if (!isAlive)
-          expireThreads = null;
-      }
-      
-      if (cleanupStufferThread != null)
-      {
-        if (!cleanupStufferThread.isAlive())
-          cleanupStufferThread = null;
-      }
-      if (cleanupThreads != null)
-      {
-        int i = 0;
-        boolean isAlive = false;
-        while (i < cleanupThreads.length)
-        {
-          Thread cleanupThread = cleanupThreads[i];
-          if (cleanupThread != null)
-          {
-            if (!cleanupThread.isAlive())
-              cleanupThreads[i] = null;
-            else
-              isAlive = true;
-          }
-          i++;
-        }
-        if (!isAlive)
-          cleanupThreads = null;
-      }
-
-      if (deleteStufferThread != null)
-      {
-        if (!deleteStufferThread.isAlive())
-          deleteStufferThread = null;
-      }
-      if (deleteThreads != null)
-      {
-        int i = 0;
-        boolean isAlive = false;
-        while (i < deleteThreads.length)
-        {
-          Thread deleteThread = deleteThreads[i];
-          if (deleteThread != null)
-          {
-            if (!deleteThread.isAlive())
-              deleteThreads[i] = null;
-            else
-              isAlive = true;
-          }
-          i++;
-        }
-        if (!isAlive)
-          deleteThreads = null;
-      }
-      if (jobResetThread != null)
-      {
-        if (!jobResetThread.isAlive())
-          jobResetThread = null;
-      }
-      if (seedingThread != null)
-      {
-        if (!seedingThread.isAlive())
-          seedingThread = null;
-      }
-      if (idleCleanupThread != null)
-      {
-        if (!idleCleanupThread.isAlive())
-          idleCleanupThread = null;
-      }
-      if (assessmentThread != null)
-      {
-        if (!assessmentThread.isAlive())
-          assessmentThread = null;
-      }
-    }
-
-    // Threads are down; release connectors
-    RepositoryConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
-    NotificationConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
-    numWorkerThreads = 0;
-    numDeleteThreads = 0;
-    numExpireThreads = 0;
-    Logging.root.info("Pull-agent successfully shut down");
-  }
-  
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DeleteQueuedDocument.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DeleteQueuedDocument.java
deleted file mode 100644
index e6f5cbb..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DeleteQueuedDocument.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* $Id: DeleteQueuedDocument.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-/** This class represents a document that will be placed on the document delete queue, and will be
-* processed by a delete or expire worker thread.
-* The reason that DocumentDescription by itself is not used has to do with the fact that
-* a good deal more information about the document must be obtained in order to find the
-* last version ingested (which must be done in bulk, for performance reasons).  Since we
-* are finding everything anyway, it makes sense to put what we have in a structure so
-* that the worker threads don't need to repeat what the stuffer thread did.
-*/
-public class DeleteQueuedDocument
-{
-  public static final String _rcsid = "@(#)$Id: DeleteQueuedDocument.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The document description. */
-  protected DocumentDescription documentDescription;
-  /** This flag indicates whether the document has been processed or not. */
-  protected boolean wasProcessed = false;
-
-  /** Constructor.
-  *@param documentDescription is the document description.
-  */
-  public DeleteQueuedDocument(DocumentDescription documentDescription)
-  {
-    this.documentDescription = documentDescription;
-  }
-
-  /** Get the document description.
-  *@return the document description.
-  */
-  public DocumentDescription getDocumentDescription()
-  {
-    return documentDescription;
-  }
-
-  /** Check if document has been processed yet.
-  *@return true if processed, false if not.
-  */
-  public boolean wasProcessed()
-  {
-    return wasProcessed;
-  }
-
-  /** Note that the document was processed in some way.
-  */
-  public void setProcessed()
-  {
-    wasProcessed = true;
-  }
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DeleteStartupResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DeleteStartupResetManager.java
deleted file mode 100644
index 276668c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DeleteStartupResetManager.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** Class which handles reset for seeding thread pool (of which there's
-* typically only one member).  The reset action here
-* is to move the status of jobs back from "seeding" to normal.
-*/
-public class DeleteStartupResetManager extends ResetManager
-{
-
-  /** Constructor. */
-  public DeleteStartupResetManager(String processID)
-  {
-    super(processID);
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetDeleteStartupWorkerStatus(processID);
-  }
-    
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocCleanupResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocCleanupResetManager.java
deleted file mode 100644
index fc303a4..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocCleanupResetManager.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** Class which handles reset for cleanup thread pool (of which there's
-* typically only one member).  The reset action here
-* is to move the status of documents from "???" back to "PURGATORY".
-*/
-public class DocCleanupResetManager extends ResetManager
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected final DocumentCleanupQueue ddq;
-
-  /** Constructor. */
-  public DocCleanupResetManager(DocumentCleanupQueue ddq, String processID)
-  {
-    super(processID);
-    this.ddq = ddq;
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetDocCleanupWorkerStatus(processID);
-    ddq.clear();
-  }
-  
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-    ddq.reset();
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocDeleteResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocDeleteResetManager.java
deleted file mode 100644
index d11f280..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocDeleteResetManager.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id: DocDeleteResetManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** Class which handles reset for seeding thread pool (of which there's
-* typically only one member).  The reset action here
-* is to move the status of documents from "BEINGDELETED" back to "COMPLETED".
-*/
-public class DocDeleteResetManager extends ResetManager
-{
-  public static final String _rcsid = "@(#)$Id: DocDeleteResetManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final DocumentDeleteQueue ddq;
-
-  /** Constructor. */
-  public DocDeleteResetManager(DocumentDeleteQueue ddq, String processID)
-  {
-    super(processID);
-    this.ddq = ddq;
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetDocDeleteWorkerStatus(processID);
-    ddq.clear();
-  }
-
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-    ddq.reset();
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupQueue.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupQueue.java
deleted file mode 100644
index 60791ac..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupQueue.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class describes a cleanup document queue, which has a "stuffer" thread and many "reader" threads.
-* The queue manages thread synchronization so that (a) the "stuffer" thread blocks until queue is empty, and
-* (b) the "reader" threads block if queue is empty.
-* The objects being queued are all QueuedDocumentSet objects.
-*/
-public class DocumentCleanupQueue
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Since the queue has a maximum size, an ArrayList is a fine way to keep it
-  protected final List<DocumentCleanupSet> queue = new ArrayList<DocumentCleanupSet>();
-  // This flag gets set to 'true' if the queue is being cleared due to a reset
-  protected boolean resetFlag = false;
-
-  /** Constructor.
-  */
-  public DocumentCleanupQueue()
-  {
-  }
-
-  /** Wake up all threads waiting on this queue.  This happens at the beginning of a reset.
-  */
-  public void reset()
-  {
-    synchronized (queue)
-    {
-      resetFlag = true;
-      queue.notifyAll();
-    }
-  }
-
-  /** Clear.  This is only used on reset.
-  */
-  public void clear()
-  {
-    synchronized (queue)
-    {
-      queue.clear();
-      resetFlag = false;
-    }
-  }
-
-  /** Check if "empty".
-  *@param n is the low-water mark; if the number falls below this, then this method will return true.
-  */
-  public boolean checkIfEmpty(int n)
-  {
-    synchronized (queue)
-    {
-      if (queue.size() <= n)
-        return true;
-    }
-    return false;
-  }
-
-  /** Add a document set to the queue.  This will be a set of n documents (where n is some chunk size
-  * set by experiment).
-  *@param dd is the document set.
-  */
-  public void addDocuments(DocumentCleanupSet dd)
-  {
-    synchronized (queue)
-    {
-      queue.add(dd);
-      queue.notify();
-    }
-  }
-
-  /** Pull a document set off the queue, and wait if there is
-  * nothing there.
-  *@return the document.
-  */
-  public DocumentCleanupSet getDocuments()
-    throws InterruptedException
-  {
-    synchronized (queue)
-    {
-      // If queue is empty, go to sleep
-      if (resetFlag)
-        return null;
-        
-      while (queue.size() == 0 && resetFlag == false)
-        queue.wait();
-      
-      // If we've been awakened, there's either an entry to grab, or we've been
-      // awakened because it's time to reset.
-      if (resetFlag)
-          return null;
-      
-      // If we've been awakened, there's an entry to grab
-      DocumentCleanupSet dd = queue.remove(queue.size()-1);
-      return dd;
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupSet.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupSet.java
deleted file mode 100644
index 8748c00..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupSet.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class is what's actually queued for cleanup threads.  It represents an array of DocumentDescription objects,
-* of an appropriate size to be a decent chunk.  It will be processed by a single cleanup worker thread, in bulk.
-*/
-public class DocumentCleanupSet
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** This is the array of documents to delete. */
-  protected CleanupQueuedDocument[] documents;
-  /** The job description for this set of documents. */
-  protected IJobDescription jobDescription;
-
-  /** Constructor.
-  *@param documents is the arraylist representing the documents for this chunk.
-  *@param jobDescription is the job description for all the documents.
-  */
-  public DocumentCleanupSet(CleanupQueuedDocument[] documents, IJobDescription jobDescription)
-  {
-    this.documents = documents;
-    this.jobDescription = jobDescription;
-  }
-
-  /** Get the job description.
-  *@return the job description.
-  */
-  public IJobDescription getJobDescription()
-  {
-    return this.jobDescription;
-  }
-
-  /** Get the number of documents.
-  *@return the number.
-  */
-  public int getCount()
-  {
-    return documents.length;
-  }
-
-  /** Get the nth document.
-  *@param index is the document number.
-  *@return the document.
-  */
-  public CleanupQueuedDocument getDocument(int index)
-  {
-    return documents[index];
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupStufferThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupStufferThread.java
deleted file mode 100644
index e52408c..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupStufferThread.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class looks for documents that need to be deleted (as part of an end-of-job cleanup), and
-* queues them up for the various document cleanup threads to take care of.
-* To do this, this thread performs a query which returns a chunk of results, then queues those
-* results.  The individual document delete threads will be waiting on the queue.
-* Once the queue is full enough, the thread then sleeps until the delete queue is empty again.
-*/
-public class DocumentCleanupStufferThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Local data
-  /** This is a reference to the static main document queue */
-  protected final DocumentCleanupQueue documentCleanupQueue;
-  /** This is the reset manager */
-  protected final DocCleanupResetManager resetManager;
-  /** This is the number of entries we want to stuff at any one time. */
-  protected final int n;
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  *@param documentCleanupQueue is the document queue we'll be stuffing.
-  *@param n is the maximum number of threads that will be doing delete processing.
-  */
-  public DocumentCleanupStufferThread(DocumentCleanupQueue documentCleanupQueue, int n, DocCleanupResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.documentCleanupQueue = documentCleanupQueue;
-    this.n = n;
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Document cleanup stuffer thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-      ArrayList docList = new ArrayList();
-
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      int deleteChunkSize = database.getMaxInClause();
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          resetManager.waitForReset(threadContext);
-
-          // Wait until the delete queue is "empty" (meaning that some delete threads
-          // can run out of work if we don't act).
-          if (documentCleanupQueue.checkIfEmpty(n) == false)
-          {
-            ManifoldCF.sleep(100L);
-            continue;
-          }
-
-          Logging.threads.debug("Document cleanup stuffer thread woke up");
-
-          long currentTime = System.currentTimeMillis();
-          
-          // Get a single chunk at a time (but keep going until everything is stuffed)
-          // This method will set the status of the documents in question
-          // to "beingcleaned".
-
-          DocumentSetAndFlags documentsToClean = jobManager.getNextCleanableDocuments(processID,deleteChunkSize,currentTime);
-          DocumentDescription[] descs = documentsToClean.getDocumentSet();
-          boolean[] removeFromIndex = documentsToClean.getFlags();
-          
-          // If there are no chunks at all, then we can sleep for a while.
-          // The theory is that we need to allow stuff to accumulate.
-          if (descs.length == 0)
-          {
-            Logging.threads.debug("Document cleanup stuffer thread found nothing to do");
-            ManifoldCF.sleep(1000L);       // 1 second
-            continue;
-          }
-
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Document cleanup stuffer thread found "+Integer.toString(descs.length)+" documents");
-
-          // Do the stuffing.  Each set must be segregated by job, since we need the job ID in the doc set.
-          Map jobMap = new HashMap();
-          int k = 0;
-          while (k < descs.length)
-          {
-            CleanupQueuedDocument x = new CleanupQueuedDocument(descs[k],removeFromIndex[k]);
-            Long jobID = descs[k].getJobID();
-            List y = (List)jobMap.get(jobID);
-            if (y == null)
-            {
-              y = new ArrayList();
-              jobMap.put(jobID,y);
-            }
-            y.add(x);
-            k++;
-          }
-          
-          Iterator iter = jobMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            Long jobID = (Long)iter.next();
-            IJobDescription jobDescription = jobManager.load(jobID,true);
-            List y = (List)jobMap.get(jobID);
-            CleanupQueuedDocument[] docDescs = new CleanupQueuedDocument[y.size()];
-            k = 0;
-            while (k < docDescs.length)
-            {
-              docDescs[k] = (CleanupQueuedDocument)y.get(k);
-              k++;
-            }
-            DocumentCleanupSet set = new DocumentCleanupSet(docDescs,jobDescription);
-            documentCleanupQueue.addDocuments(set);
-          }
-
-          // If we don't wait here, the other threads don't have a chance to queue anything else up.
-          yield();
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Cleanup stuffer thread aborting and restarting due to database connection reset",e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("DocumentCleanupStufferThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupThread.java
deleted file mode 100644
index 63aa702..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentCleanupThread.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents a document cleanup thread.  This thread's job is to pull document sets to be cleaned up off of
-* a queue, and kill them.  It finishes a cleanup set by getting rid of the corresponding rows in the job queue, and from
-* carrydown, and from hopcount.
-*
-* There are very few decisions that this thread needs to make; essentially all the hard thought went into deciding
-* what documents to queue in the first place.
-*
-* The only caveat is that the ingestion API may not be accepting delete requests at the time that this thread wants it
-* to be able to accept them.  In that case, it's acceptable for the thread to block until the ingestion service is
-* functioning again.
-*
-* Transactions are not much needed for this class; it simply needs to not fail to remove the appropriate jobqueue
-* table rows at the end of the delete.
-*/
-public class DocumentCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  // Local data
-  /** Thread id */
-  protected final String id;
-  /** This is a reference to the static main document queue */
-  protected final DocumentCleanupQueue documentCleanupQueue;
-  /** Delete thread pool reset manager */
-  protected final DocCleanupResetManager resetManager;
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  *@param id is the worker thread id.
-  */
-  public DocumentCleanupThread(String id, DocumentCleanupQueue documentCleanupQueue,
-    DocCleanupResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.id = id;
-    this.documentCleanupQueue = documentCleanupQueue;
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Document cleanup thread '"+id+"'");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-      ITransformationConnectionManager transformationConnectionManager = TransformationConnectionManagerFactory.make(threadContext);
-      IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
-      
-      IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // Once we pull something off the queue, we MUST make sure that
-          // we update its status, even if there is an exception!!!
-
-          // See if there is anything on the queue for me
-          DocumentCleanupSet dds = documentCleanupQueue.getDocuments();
-          if (dds == null)
-            // It's a reset, so recycle
-            continue;
-
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          IJobDescription job = dds.getJobDescription();
-          String connectionName = job.getConnectionName();
-          IPipelineConnections pipelineConnections = new PipelineConnections(new PipelineSpecificationBasic(job),transformationConnectionManager,outputConnectionManager);
-
-          try
-          {
-            long currentTime = System.currentTimeMillis();
-
-            // Produce a map of connection name->connection object.  We will use this to perform a request for multiple connector objects
-            IRepositoryConnection connection = connMgr.load(connectionName);
-            
-            // This is where we store the hopcount cleanup data
-            List<String> arrayDocHashes = new ArrayList<String>();
-            List<CleanupQueuedDocument> arrayDocsToDelete = new ArrayList<CleanupQueuedDocument>();
-            List<String[]> arrayRelationshipTypes = new ArrayList<String[]>();
-            List<Integer> hopcountMethods = new ArrayList<Integer>();
-
-            for (int j = 0; j < dds.getCount(); j++)
-            {
-              CleanupQueuedDocument dqd = dds.getDocument(j);
-              DocumentDescription ddd = dqd.getDocumentDescription();
-              if (job != null && connection != null)
-              {
-                // We'll need the legal link types; grab those before we proceed
-                String[] legalLinkTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-                if (legalLinkTypes != null)
-                {
-                  arrayDocHashes.add(ddd.getDocumentIdentifierHash());
-                  arrayDocsToDelete.add(dqd);
-                  arrayRelationshipTypes.add(legalLinkTypes);
-                  hopcountMethods.add(new Integer(job.getHopcountMode()));
-                }
-              }
-            }
-
-            // Grab one connection for each connectionName.  If we fail, nothing is lost and retries are possible.
-            IRepositoryConnector connector = repositoryConnectorPool.grab(connection);
-            try
-            {
-
-              // Iterate over the outputs
-              boolean[] deleteFromQueue = new boolean[arrayDocHashes.size()];
-                    
-              // Count the number of docs to actually delete.  This will be a subset of the documents in the list.
-              int removeCount = 0;
-              for (int k = 0; k < arrayDocHashes.size(); k++)
-              {
-                if (arrayDocsToDelete.get(k).shouldBeRemovedFromIndex())
-                {
-                  deleteFromQueue[k] = false;
-                  removeCount++;
-                }
-                else
-                  deleteFromQueue[k] = true;
-              }
-                    
-              // Allocate removal arrays
-              String[] docClassesToRemove = new String[removeCount];
-              String[] hashedDocsToRemove = new String[removeCount];
-
-              // Now, iterate over the list
-              removeCount = 0;
-              for (int k = 0; k < arrayDocHashes.size(); k++)
-              {
-                if (arrayDocsToDelete.get(k).shouldBeRemovedFromIndex())
-                {
-                  docClassesToRemove[removeCount] = connectionName;
-                  hashedDocsToRemove[removeCount] = arrayDocHashes.get(k);
-                  removeCount++;
-                }
-              }
-                
-              OutputRemoveActivity activities = new OutputRemoveActivity(connectionName,connMgr);
-
-              // Finally, go ahead and delete the documents from the ingestion system.
-
-              try
-              {
-                ingester.documentDeleteMultiple(pipelineConnections,docClassesToRemove,hashedDocsToRemove,activities);
-                // Success!  Label all these as needing deletion from queue.
-                for (int k = 0; k < arrayDocHashes.size(); k++)
-                {
-                  if (arrayDocsToDelete.get(k).shouldBeRemovedFromIndex())
-                    deleteFromQueue[k] = true;
-                }
-              }
-              catch (ServiceInterruption e)
-              {
-                // We don't know which failed, or maybe they all did.
-                // Go through the list of documents we just tried, and reset them on the queue based on the
-                // ServiceInterruption parameters.  Then we must proceed to delete ONLY the documents that
-                // were not part of the index deletion attempt.
-                for (int k = 0; k < arrayDocHashes.size(); k++)
-                {
-                  CleanupQueuedDocument cqd = arrayDocsToDelete.get(k);
-                  if (cqd.shouldBeRemovedFromIndex())
-                  {
-                    DocumentDescription dd = cqd.getDocumentDescription();
-                    // To recover from a cleanup failure, requeue the document to PURGATORY.
-                    jobManager.resetCleaningDocument(dd,e.getRetryTime());
-                    cqd.setProcessed();
-                  }
-                }
-              }
-
-              // Successfully deleted some documents from ingestion system.  Now, remove them from job queue.  This
-              // must currently happen one document at a time, because the jobs and connectors for each document
-              // potentially differ.
-              for (int k = 0; k < arrayDocHashes.size(); k++)
-              {
-                if (deleteFromQueue[k])
-                {
-                  CleanupQueuedDocument dqd = arrayDocsToDelete.get(k);
-                  DocumentDescription ddd = dqd.getDocumentDescription();
-                  Long jobID = ddd.getJobID();
-                  int hopcountMethod = hopcountMethods.get(k).intValue();
-                  String[] legalLinkTypes = arrayRelationshipTypes.get(k);
-                  DocumentDescription[] requeueCandidates = jobManager.markDocumentCleanedUp(jobID,legalLinkTypes,ddd,hopcountMethod);
-                  // Use the common method for doing the requeuing
-                  ManifoldCF.requeueDocumentsDueToCarrydown(jobManager,requeueCandidates,
-                    connector,connection,rt,currentTime);
-                  // Finally, completed expiration of the document.
-                  dqd.setProcessed();
-                }
-              }
-            }
-            finally
-            {
-              // Free up the reserved connector instance
-              repositoryConnectorPool.release(connection,connector);
-            }
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              break;
-
-            if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-              throw e;
-
-            // It's ok to abort a job because we can't talk to the search engine during cleanup.
-            if (jobManager.errorAbort(dds.getJobDescription().getID(),e.getMessage()))
-            {
-              // We eat the exception if there was already one recorded.
-
-              // An exception occurred in the processing of a set of documents.
-              // Shut the corresponding job down, with an appropriate error
-              Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-            }
-          }
-          finally
-          {
-            // Insure that the documents that were not deleted get restored to the proper state.
-            int j = 0;
-            while (j < dds.getCount())
-            {
-              DeleteQueuedDocument dqd = dds.getDocument(j);
-              if (dqd.wasProcessed() == false)
-              {
-                DocumentDescription ddd = dqd.getDocumentDescription();
-                // Requeue this document!
-                jobManager.resetCleaningDocument(ddd,0L);
-                dqd.setProcessed();
-              }
-              j++;
-            }
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            // Note the failure, which will cause a reset to occur
-            resetManager.noteEvent();
-
-            Logging.threads.error("Document cleanup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // An exception occurred in the cleanup from another error.
-          // Log the error (but that's all we can do)
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("DocumentCleanupThread "+id+" initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-
-  /** The ingest logger class */
-  protected static class OutputRemoveActivity implements IOutputRemoveActivity
-  {
-
-    // Connection name
-    protected final String connectionName;
-    // Connection manager
-    protected final IRepositoryConnectionManager connMgr;
-
-    /** Constructor */
-    public OutputRemoveActivity(String connectionName, IRepositoryConnectionManager connMgr)
-    {
-      this.connectionName = connectionName;
-      this.connMgr = connMgr;
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      connMgr.recordHistory(connectionName,startTime,activityType,dataSize,entityURI,resultCode,
-        resultDescription,null);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteQueue.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteQueue.java
deleted file mode 100644
index 616cdaf..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteQueue.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/* $Id: DocumentDeleteQueue.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class describes a document queue, which has a "stuffer" thread and many "reader" threads.
-* The queue manages thread synchronization so that (a) the "stuffer" thread blocks until queue is empty, and
-* (b) the "reader" threads block if queue is empty.
-* The objects being queued are all QueuedDocumentSet objects.
-*/
-public class DocumentDeleteQueue
-{
-  public static final String _rcsid = "@(#)$Id: DocumentDeleteQueue.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Since the queue has a maximum size, an ArrayList is a fine way to keep it
-  protected ArrayList queue = new ArrayList();
-
-  /** Constructor.
-  */
-  public DocumentDeleteQueue()
-  {
-  }
-
-  /** Wake up all threads waiting on this queue.  This happens at the beginning of a reset.
-  */
-  public void reset()
-  {
-    synchronized (queue)
-    {
-      queue.notifyAll();
-    }
-  }
-
-  /** Clear.  This is only used on reset.
-  */
-  public void clear()
-  {
-    synchronized (queue)
-    {
-      queue.clear();
-    }
-  }
-
-  /** Check if "empty".
-  *@param n is the low-water mark; if the number falls below this, then this method will return true.
-  */
-  public boolean checkIfEmpty(int n)
-  {
-    synchronized (queue)
-    {
-      if (queue.size() <= n)
-        return true;
-    }
-    return false;
-  }
-
-  /** Add a document set to the queue.  This will be a set of n documents (where n is some chunk size
-  * set by experiment).
-  *@param dd is the document set.
-  */
-  public void addDocuments(DocumentDeleteSet dd)
-  {
-    synchronized (queue)
-    {
-      queue.add(dd);
-      queue.notify();
-    }
-  }
-
-  /** Pull a document set off the queue, and wait if there is
-  * nothing there.
-  *@return the document.
-  */
-  public DocumentDeleteSet getDocuments()
-    throws InterruptedException
-  {
-    synchronized (queue)
-    {
-      // If queue is empty, go to sleep
-      while (queue.size() == 0)
-        queue.wait();
-      // If we've been awakened, there's either an entry to grab, or we've been
-      // awakened because it's time to reset.
-      if (queue.size() == 0)
-        return null;
-      // If we've been awakened, there's an entry to grab
-      DocumentDeleteSet dd = (DocumentDeleteSet)queue.remove(queue.size()-1);
-      return dd;
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteSet.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteSet.java
deleted file mode 100644
index de71760..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteSet.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $Id: DocumentDeleteSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class is what's actually queued for delete threads.  It represents an array of DocumentDescription objects,
-* of an appropriate size to be a decent chunk.  It will be processed by a single delete worker thread, in bulk.
-*/
-public class DocumentDeleteSet
-{
-  public static final String _rcsid = "@(#)$Id: DocumentDeleteSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the array of documents to delete. */
-  protected DeleteQueuedDocument[] documents;
-  /** The job description for this set of documents. */
-  protected IJobDescription jobDescription;
-  
-  /** Constructor.
-  *@param documents is the arraylist representing the documents for this chunk.
-  *@param jobDescription is the job description for all the documents.
-  */
-  public DocumentDeleteSet(DeleteQueuedDocument[] documents, IJobDescription jobDescription)
-  {
-    this.documents = documents;
-    this.jobDescription = jobDescription;
-  }
-
-  /** Get the job description.
-  *@return the job description.
-  */
-  public IJobDescription getJobDescription()
-  {
-    return this.jobDescription;
-  }
-  
-  /** Get the number of documents.
-  *@return the number.
-  */
-  public int getCount()
-  {
-    return documents.length;
-  }
-
-  /** Get the nth document.
-  *@param index is the document number.
-  *@return the document.
-  */
-  public DeleteQueuedDocument getDocument(int index)
-  {
-    return documents[index];
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteStufferThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteStufferThread.java
deleted file mode 100644
index 4d281d4..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteStufferThread.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/* $Id: DocumentDeleteStufferThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class looks for documents that need to be deleted (as part of a job deletion), and
-* queues them up for the various document delete threads to take care of.
-* To do this, this thread performs a query which returns a chunk of results, then queues those
-* results.  The individual document delete threads will be waiting on the queue.
-* Once the queue is full enough, the thread then sleeps until the delete queue is empty again.
-*/
-public class DocumentDeleteStufferThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: DocumentDeleteStufferThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** This is a reference to the static main document queue */
-  protected final DocumentDeleteQueue documentDeleteQueue;
-  /** This is the reset manager */
-  protected final DocDeleteResetManager resetManager;
-  /** This is the number of entries we want to stuff at any one time. */
-  protected final int n;
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  *@param documentDeleteQueue is the document queue we'll be stuffing.
-  *@param n is the maximum number of threads that will be doing delete processing.
-  */
-  public DocumentDeleteStufferThread(DocumentDeleteQueue documentDeleteQueue, int n, DocDeleteResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.documentDeleteQueue = documentDeleteQueue;
-    this.n = n;
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Document delete stuffer thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-      ArrayList docList = new ArrayList();
-
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      int deleteChunkSize = database.getMaxInClause();
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          resetManager.waitForReset(threadContext);
-
-          // Wait until the delete queue is "empty" (meaning that some delete threads
-          // can run out of work if we don't act).
-          if (documentDeleteQueue.checkIfEmpty(n * 3) == false)
-          {
-            ManifoldCF.sleep(100L);
-            continue;
-          }
-
-          Logging.threads.debug("Document delete stuffer thread woke up");
-
-          long currentTime = System.currentTimeMillis();
-          
-          // Get a single chunk at a time (but keep going until everything is stuffed)
-          // This method will set the status of the documents in question
-          // to "beingdeleted".
-
-          DocumentDescription[] descs = jobManager.getNextDeletableDocuments(processID,deleteChunkSize,currentTime);
-
-          // If there are no chunks at all, then we can sleep for a while.
-          // The theory is that we need to allow stuff to accumulate.
-          if (descs.length == 0)
-          {
-            Logging.threads.debug("Document delete stuffer thread found nothing to do");
-            ManifoldCF.sleep(1000L);       // 1 second
-            continue;
-          }
-
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Document delete stuffer thread found "+Integer.toString(descs.length)+" documents");
-
-          // Do the stuffing.  Each set must be segregated by job, since we need the job ID in the doc set.
-          Map jobMap = new HashMap();
-          int k = 0;
-          while (k < descs.length)
-          {
-            DeleteQueuedDocument x = new DeleteQueuedDocument(descs[k]);
-            Long jobID = descs[k].getJobID();
-            List y = (List)jobMap.get(jobID);
-            if (y == null)
-            {
-              y = new ArrayList();
-              jobMap.put(jobID,y);
-            }
-            y.add(x);
-            k++;
-          }
-          
-          Iterator iter = jobMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            Long jobID = (Long)iter.next();
-            IJobDescription jobDescription = jobManager.load(jobID,true);
-            List y = (List)jobMap.get(jobID);
-            DeleteQueuedDocument[] docDescs = new DeleteQueuedDocument[y.size()];
-            k = 0;
-            while (k < docDescs.length)
-            {
-              docDescs[k] = (DeleteQueuedDocument)y.get(k);
-              k++;
-            }
-            DocumentDeleteSet set = new DocumentDeleteSet(docDescs,jobDescription);
-            documentDeleteQueue.addDocuments(set);
-          }
-
-          // If we don't wait here, the other threads don't have a chance to queue anything else up.
-          yield();
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Delete stuffer thread aborting and restarting due to database connection reset",e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("DocumentDeleteStufferThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteThread.java
deleted file mode 100644
index 05695f7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentDeleteThread.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/* $Id: DocumentDeleteThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents a document delete thread.  This thread's job is to pull document sets to be deleted off of
-* a queue, and kill them.  It finishes a delete set by getting rid of the corresponding rows in the job queue.
-*
-* There are very few decisions that this thread needs to make; essentially all the hard thought went into deciding
-* what documents to queue in the first place.
-*
-* The only caveat is that the ingestion API may not be accepting delete requests at the time that this thread wants it
-* to be able to accept them.  In that case, it's acceptable for the thread to block until the ingestion service is
-* functioning again.
-*
-* Transactions are not much needed for this class; it simply needs to not fail to remove the appropriate jobqueue
-* table rows at the end of the delete.
-*/
-public class DocumentDeleteThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: DocumentDeleteThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-
-  // Local data
-  /** Thread ID */
-  protected final String id;
-  /** This is a reference to the static main document queue */
-  protected final DocumentDeleteQueue documentDeleteQueue;
-  /** Delete thread pool reset manager */
-  protected final DocDeleteResetManager resetManager;
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  *@param id is the worker thread id.
-  */
-  public DocumentDeleteThread(String id, DocumentDeleteQueue documentDeleteQueue, DocDeleteResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.id = id;
-    this.documentDeleteQueue = documentDeleteQueue;
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Document delete thread '"+id+"'");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-      ITransformationConnectionManager transformationConnectionManager = TransformationConnectionManagerFactory.make(threadContext);
-      IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // See if there is anything on the queue for me
-          DocumentDeleteSet dds = documentDeleteQueue.getDocuments();
-          if (dds == null)
-            // Reset
-            continue;
-
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Document delete thread received "+Integer.toString(dds.getCount())+" documents to delete for job "+dds.getJobDescription().getID().toString());
-          
-          IJobDescription job = dds.getJobDescription();
-          String connectionName = job.getConnectionName();
-          IPipelineConnections pipelineConnections = new PipelineConnections(new PipelineSpecificationBasic(job),transformationConnectionManager,outputConnectionManager);
-          
-          try
-          {
-            // Do the delete work.
-
-            // Delete these identifiers.  The underlying IIncrementalIngester method will need to be provided an activities object consistent
-            // with the individual connection, so the first job is to segregate what came in into connection bins.  Then, we process each connection
-            // bin appropriately.
-
-            boolean[] deleteFromQueue = new boolean[dds.getCount()];
-                
-            String[] docClassesToRemove = new String[dds.getCount()];
-            String[] hashedDocsToRemove = new String[dds.getCount()];
-            DeleteQueuedDocument[] docsToDelete = new DeleteQueuedDocument[dds.getCount()];
-            for (int j = 0; j < dds.getCount(); j++)
-            {
-              DeleteQueuedDocument dqd = dds.getDocument(j);
-              DocumentDescription ddd = dqd.getDocumentDescription();
-              docClassesToRemove[j] = connectionName;
-              hashedDocsToRemove[j] = ddd.getDocumentIdentifierHash();
-              docsToDelete[j] = dqd;
-              deleteFromQueue[j] = false;
-            }
-                
-            OutputRemoveActivity logger = new OutputRemoveActivity(connectionName,connMgr);
-                
-            try
-            {
-              ingester.documentDeleteMultiple(pipelineConnections,docClassesToRemove,hashedDocsToRemove,logger);
-              for (int j = 0; j < dds.getCount(); j++)
-              {
-                deleteFromQueue[j] = true;
-              }
-            }
-            catch (ServiceInterruption e)
-            {
-              // We don't know which failed, or maybe they all did.
-              // Go through the list of documents we just tried, and reset them on the queue based on the
-              // ServiceInterruption parameters.  Then we must proceed to delete ONLY the documents that
-              // were not part of the index deletion attempt.
-              for (int j = 0; j < dds.getCount(); j++)
-              {
-                DeleteQueuedDocument cqd = docsToDelete[j];
-                DocumentDescription dd = cqd.getDocumentDescription();
-                // To recover from an expiration failure, requeue the document to COMPLETED etc.
-                jobManager.resetDeletingDocument(dd,e.getRetryTime());
-                cqd.setProcessed();
-              }
-            }
-
-            // Count the records we're actually going to delete
-            int recordCount = 0;
-            for (int j = 0; j < dds.getCount(); j++)
-            {
-              if (deleteFromQueue[j])
-                recordCount++;
-            }
-                
-            // Delete the records
-            DocumentDescription[] deleteDescriptions = new DocumentDescription[recordCount];
-            recordCount = 0;
-            for (int j = 0; j < dds.getCount(); j++)
-            {
-              if (deleteFromQueue[j])
-                deleteDescriptions[recordCount++] = docsToDelete[j].getDocumentDescription();
-            }
-            jobManager.deleteIngestedDocumentIdentifiers(deleteDescriptions);
-            // Mark them as gone
-            for (int j = 0; j < dds.getCount(); j++)
-            {
-              if (deleteFromQueue[j])
-                docsToDelete[j].wasProcessed();
-            }
-            // Go around again
-          }
-          finally
-          {
-            // Here we should take steps to insure that the documents that have been handed to us
-            // are dealt with appropriately.  This may involve setting the document state to "complete"
-            // so that they will be picked up again.
-            for (int j = 0; j < dds.getCount(); j++)
-            {
-              DeleteQueuedDocument dqd = dds.getDocument(j);
-
-              if (dqd.wasProcessed() == false)
-              {
-                // Pop this document back into the jobqueue in an appropriate state
-                DocumentDescription ddd = dqd.getDocumentDescription();
-                // Requeue this document!
-                jobManager.resetDeletingDocument(ddd,0L);
-                dqd.setProcessed();
-
-              }
-            }
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Document delete thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("DocumentDeleteThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-  /** The OutputRemoveActivity class */
-  protected static class OutputRemoveActivity implements IOutputRemoveActivity
-  {
-    // Connection manager
-    protected final IRepositoryConnectionManager connMgr;
-    // Output connection name
-    protected final String connectionName;
-
-    /** Constructor */
-    public OutputRemoveActivity(String connectionName, IRepositoryConnectionManager connMgr)
-    {
-      this.connectionName = connectionName;
-      this.connMgr = connMgr;
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      connMgr.recordHistory(connectionName,startTime,activityType,dataSize,entityURI,resultCode,
-        resultDescription,null);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentQueue.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentQueue.java
deleted file mode 100644
index 66a2a81..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/DocumentQueue.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/* $Id: DocumentQueue.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class describes a document queue, which has a "stuffer" thread and many "reader" threads.
-* The queue manages thread synchronization so that (a) the "stuffer" thread blocks until queue is empty, and
-* (b) the "reader" threads block if queue is empty.
-* The objects being queued are all QueuedDocumentSet objects.
-*/
-public class DocumentQueue
-{
-  public static final String _rcsid = "@(#)$Id: DocumentQueue.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Since the queue has a maximum size, an ArrayList is a fine way to keep it
-  protected final List<QueuedDocumentSet> queue = new ArrayList<QueuedDocumentSet>();
-  // This flag gets set to 'true' if the queue is being cleared due to a reset
-  protected boolean resetFlag = false;
-
-  /** Constructor.
-  */
-  public DocumentQueue()
-  {
-  }
-
-  /** Wake up all threads waiting on this queue.  This happens at the beginning of a reset.
-  */
-  public void reset()
-  {
-    synchronized (queue)
-    {
-      resetFlag = true;
-      queue.notifyAll();
-    }
-  }
-
-  /** Clear the queue.  This happens during a reset.
-  */
-  public void clear()
-  {
-    synchronized (queue)
-    {
-      queue.clear();
-      resetFlag = false;
-    }
-  }
-
-  /** Check if "empty".
-  *@param n is the low-water mark; if the number falls below this, then this method will return true.
-  */
-  public boolean checkIfEmpty(int n)
-  {
-    synchronized (queue)
-    {
-      if (queue.size() <= n)
-        return true;
-    }
-    return false;
-  }
-
-
-  /** Add a document to the queue.
-  *@param dd is the document description.
-  */
-  public void addDocument(QueuedDocumentSet dd)
-  {
-    synchronized (queue)
-    {
-      queue.add(dd);
-      queue.notify();
-    }
-  }
-
-  /** Pull the best-rated document set off the queue, but wait if there is
-  * nothing there.
-  *@param overlapCalculator performs analysis of the document sets on the queue so that we can
-  * pick the best one.
-  *@return the document set.
-  */
-  public QueuedDocumentSet getDocument(QueueTracker overlapCalculator)
-    throws InterruptedException
-  {
-    synchronized (queue)
-    {
-      // If we are being reset, return null
-      if (resetFlag)
-        return null;
-
-      // If queue is empty, go to sleep
-      while (queue.size() == 0 && resetFlag == false)
-        queue.wait();
-
-      // If we've been awakened, there's either an entry to grab, or we've been
-      // awakened because it's time to reset.
-      if (resetFlag)
-        return null;
-
-      // Go through all the documents and pick the one with the best rating
-      int i = 0;
-      int bestIndex = -1;
-      double bestRating = Double.NEGATIVE_INFINITY;
-      while (i < queue.size())
-      {
-        QueuedDocumentSet dd = queue.get(i);
-        // Evaluate each document's bins.  These will be saved in the QueuedDocumentSet.
-        double rating = dd.calculateAssignmentRating(overlapCalculator);
-        if (bestIndex == -1 || rating > bestRating)
-        {
-          bestIndex = i;
-          bestRating = rating;
-        }
-        i++;
-      }
-      // Pull off the best one.  DON'T REORDER!!
-      QueuedDocumentSet rval = queue.remove(bestIndex);
-      return rval;
-    }
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ExpireStufferThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ExpireStufferThread.java
deleted file mode 100644
index f2d6546..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ExpireStufferThread.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/* $Id: ExpireStufferThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the stuffer thread.  This thread's job is to request documents from the database and add them to the
-* document queue.  The thread then sleeps until the document queue is empty again.
-*/
-public class ExpireStufferThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: ExpireStufferThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** This is a reference to the static main document expiration queue */
-  protected final DocumentCleanupQueue documentQueue;
-  /** Worker thread pool reset manager */
-  protected final WorkerResetManager resetManager;
-  /** This is the number of entries we want to stuff at any one time. */
-  protected final int n;
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  *@param documentQueue is the document queue we'll be stuffing.
-  *@param n represents the number of threads that will be processing queued stuff, NOT the
-  * number of documents to be done at once!
-  */
-  public ExpireStufferThread(DocumentCleanupQueue documentQueue, int n, WorkerResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.documentQueue = documentQueue;
-    this.n = n;
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Expire stuffer thread");
-    setDaemon(true);
-    // The priority of this thread is higher than most others.  We want stuffing to proceed even if the machine
-    // is pretty busy already.
-    setPriority(getPriority()+1);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-      Logging.threads.debug("Expire stuffer thread: Maximum document count per check is "+Integer.toString(n));
-
-      // Hashmap keyed by jobid and containing ArrayLists.
-      // This way we can guarantee priority will do the right thing, because the
-      // priority is per-job.  We CANNOT guarantee anything about scheduling order, however,
-      // other than that it falls in the time window.
-      HashMap documentSets = new HashMap();
-
-      // Job description map (local) - designed to improve performance.
-      // Cleared and reloaded on every batch of documents.
-      HashMap jobDescriptionMap = new HashMap();
-
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      int deleteChunkSize = database.getMaxInClause();
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Check if we're okay
-          resetManager.waitForReset(threadContext);
-
-          // System.out.println("Waiting...");
-          // Wait until queue is empty enough.
-          boolean isEmpty = documentQueue.checkIfEmpty(n*3);
-          if (isEmpty == false)
-          {
-            sleep(1000);
-            continue;
-          }
-
-          Logging.threads.debug("Expiration stuffer thread woke up");
-
-          // What we want to do is load enough documents to completely fill n queued document sets.
-          // The number n passed in here thus cannot be used in a query to limit the number of returned
-          // results.  Instead, it must be factored into the limit portion of the query.
-          long currentTime = System.currentTimeMillis();
-          DocumentSetAndFlags docsAndFlags = jobManager.getExpiredDocuments(processID,deleteChunkSize,currentTime);
-          DocumentDescription[] descs = docsAndFlags.getDocumentSet();
-          boolean[] deleteFromIndex = docsAndFlags.getFlags();
-          
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          if (Logging.threads.isDebugEnabled())
-          {
-            Logging.threads.debug("Expiration stuffer thread: Found "+Integer.toString(descs.length)+" documents to expire");
-          }
-
-          // If there are no documents at all, then we can sleep for a while.
-          // The theory is that we need to allow stuff to accumulate.
-          if (descs.length == 0)
-          {
-            ManifoldCF.sleep(5000L);      // 5 seconds
-            continue;
-          }
-
-          // Do the stuffing.  Each set must be segregated by job, since we need the job ID in the doc set.
-          Map jobMap = new HashMap();
-          int k = 0;
-          while (k < descs.length)
-          {
-            CleanupQueuedDocument x = new CleanupQueuedDocument(descs[k],deleteFromIndex[k]);
-            Long jobID = descs[k].getJobID();
-            List y = (List)jobMap.get(jobID);
-            if (y == null)
-            {
-              y = new ArrayList();
-              jobMap.put(jobID,y);
-            }
-            y.add(x);
-            k++;
-          }
-          
-          Iterator iter = jobMap.keySet().iterator();
-          while (iter.hasNext())
-          {
-            Long jobID = (Long)iter.next();
-            IJobDescription jobDescription = jobManager.load(jobID,true);
-            List y = (List)jobMap.get(jobID);
-            CleanupQueuedDocument[] docDescs = new CleanupQueuedDocument[y.size()];
-            k = 0;
-            while (k < docDescs.length)
-            {
-              docDescs[k] = (CleanupQueuedDocument)y.get(k);
-              k++;
-            }
-            DocumentCleanupSet set = new DocumentCleanupSet(docDescs,jobDescription);
-            documentQueue.addDocuments(set);
-          }
-
-          yield();
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Expiration stuffer thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("ExpirationStufferThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ExpireThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ExpireThread.java
deleted file mode 100644
index e986b00..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ExpireThread.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/* $Id: ExpireThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents an expire thread.  These threads expire documents, by deleting them from the system.
-*/
-public class ExpireThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: ExpireThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-
-  // Local data
-  /** Thread id */
-  protected final String id;
-  /** This is a reference to the static main document queue */
-  protected final DocumentCleanupQueue documentQueue;
-  /** Worker thread pool reset manager */
-  protected final WorkerResetManager resetManager;
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  *@param id is the expire thread id.
-  */
-  public ExpireThread(String id, DocumentCleanupQueue documentQueue, WorkerResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.id = id;
-    this.documentQueue = documentQueue;
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Expiration thread '"+id+"'");
-    setDaemon(true);
-
-  }
-
-  public void run()
-  {
-    // Register this thread in the worker reset manager
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-      ITransformationConnectionManager transformationConnectionManager = TransformationConnectionManagerFactory.make(threadContext);
-      IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
-      IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // Once we pull something off the queue, we MUST make sure that
-          // we update its status, even if there is an exception!!!
-
-          // See if there is anything on the queue for me
-          DocumentCleanupSet dds = documentQueue.getDocuments();
-          if (dds == null)
-            // It's a reset, so recycle
-            continue;
-
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          IJobDescription job = dds.getJobDescription();
-          String connectionName = job.getConnectionName();
-          IPipelineConnections pipelineConnections = new PipelineConnections(new PipelineSpecificationBasic(job),transformationConnectionManager,outputConnectionManager);
-          
-          try
-          {
-            long currentTime = System.currentTimeMillis();
-
-            // Documents will be naturally segregated by connection, since each set comes from a single job.
-
-            // Produce a map of connection name->connection object.  We will use this to perform a request for multiple connector objects
-            IRepositoryConnection connection = connMgr.load(connectionName);
-            
-            // This is where we store the hopcount cleanup data
-            List<String> arrayDocHashes = new ArrayList<String>();
-            List<CleanupQueuedDocument> arrayDocsToDelete = new ArrayList<CleanupQueuedDocument>();
-            List<String[]> arrayRelationshipTypes = new ArrayList<String[]>();
-            List<Integer> hopcountMethods = new ArrayList<Integer>();
-            
-            int j = 0;
-            while (j < dds.getCount())
-            {
-              CleanupQueuedDocument dqd = dds.getDocument(j);
-              DocumentDescription ddd = dqd.getDocumentDescription();
-              if (job != null && connection != null)
-              {
-                // We'll need the legal link types; grab those before we proceed
-                String[] legalLinkTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-                if (legalLinkTypes != null)
-                {
-                  arrayDocHashes.add(ddd.getDocumentIdentifierHash());
-                  arrayDocsToDelete.add(dqd);
-                  arrayRelationshipTypes.add(legalLinkTypes);
-                  hopcountMethods.add(new Integer(job.getHopcountMode()));
-                }
-              }
-              j++;
-            }
-
-            // Grab one connection for the connectionName.  If we fail, nothing is lost and retries are possible.
-            IRepositoryConnector connector = repositoryConnectorPool.grab(connection);
-            try
-            {
-
-              // Iterate over the outputs
-              boolean[] deleteFromQueue = new boolean[arrayDocHashes.size()];
-                    
-              // Count the number of docs to actually delete.  This will be a subset of the documents in the list.
-              int removeCount = 0;
-              for (int k = 0; k < arrayDocHashes.size(); k++)
-              {
-                if (arrayDocsToDelete.get(k).shouldBeRemovedFromIndex())
-                {
-                  deleteFromQueue[k] = false;
-                  removeCount++;
-                }
-                else
-                  deleteFromQueue[k] = true;
-              }
-                    
-              // Allocate removal arrays
-              String[] docClassesToRemove = new String[removeCount];
-              String[] hashedDocsToRemove = new String[removeCount];
-
-              // Now, iterate over the list
-              removeCount = 0;
-              for (int k = 0; k < arrayDocHashes.size(); k++)
-              {
-                if (arrayDocsToDelete.get(k).shouldBeRemovedFromIndex())
-                {
-                  docClassesToRemove[removeCount] = connectionName;
-                  hashedDocsToRemove[removeCount] = arrayDocHashes.get(k);
-                  removeCount++;
-                }
-              }
-
-              OutputRemoveActivity activities = new OutputRemoveActivity(connectionName,connMgr);
-
-              // Finally, go ahead and delete the documents from the ingestion system.
-              // If we fail, we need to put the documents back on the queue.
-              try
-              {
-                ingester.documentDeleteMultiple(pipelineConnections,docClassesToRemove,hashedDocsToRemove,activities);
-                // Success!  Label all these as needing deletion from queue.
-                for (int k = 0; k < arrayDocHashes.size(); k++)
-                {
-                  if (arrayDocsToDelete.get(k).shouldBeRemovedFromIndex())
-                    deleteFromQueue[k] = true;
-                }
-              }
-              catch (ServiceInterruption e)
-              {
-                // We don't know which failed, or maybe they all did.
-                // Go through the list of documents we just tried, and reset them on the queue based on the
-                // ServiceInterruption parameters.  Then we must proceed to delete ONLY the documents that
-                // were not part of the index deletion attempt.
-                for (int k = 0; k < arrayDocHashes.size(); k++)
-                {
-                  CleanupQueuedDocument cqd = arrayDocsToDelete.get(k);
-                  if (cqd.shouldBeRemovedFromIndex())
-                  {
-                    DocumentDescription dd = cqd.getDocumentDescription();
-                    if (dd.getFailTime() != -1L && dd.getFailTime() < e.getRetryTime() ||
-                      dd.getFailRetryCount() == 0)
-                    {
-                      // Treat this as a hard failure.
-                      if (e.isAbortOnFail())
-                        throw new ManifoldCFException("Repeated service interruptions - failure expiring document"+((e.getCause()!=null)?": "+e.getCause().getMessage():""),e.getCause());
-                    }
-                    else
-                    {
-                      // To recover from an expiration failure, requeue the document to PENDING etc.
-                      jobManager.resetDocument(dd,e.getRetryTime(),
-                        IJobManager.ACTION_REMOVE,e.getFailTime(),e.getFailRetryCount());
-                      cqd.setProcessed();
-                    }
-                  }
-                }
-              }
-
-              // Successfully deleted some documents from ingestion system.  Now, remove them from job queue.  This
-              // must currently happen one document at a time, because the jobs and connectors for each document
-              // potentially differ.
-              for (int k = 0; k < arrayDocHashes.size(); k++)
-              {
-                if (deleteFromQueue[k])
-                {
-                  CleanupQueuedDocument dqd = arrayDocsToDelete.get(k);
-                  DocumentDescription ddd = dqd.getDocumentDescription();
-                  Long jobID = ddd.getJobID();
-                  int hopcountMethod = hopcountMethods.get(k).intValue();
-                  String[] legalLinkTypes = arrayRelationshipTypes.get(k);
-                  DocumentDescription[] requeueCandidates = jobManager.markDocumentExpired(jobID,legalLinkTypes,ddd,hopcountMethod);
-                  // Use the common method for doing the requeuing
-                  ManifoldCF.requeueDocumentsDueToCarrydown(jobManager,requeueCandidates,
-                    connector,connection,rt,currentTime);
-                  // Finally, completed expiration of the document.
-                  dqd.setProcessed();
-                }
-              }
-            }
-            finally
-            {
-              // Free up the reserved connector instance
-              repositoryConnectorPool.release(connection,connector);
-            }
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              break;
-
-            if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-              throw e;
-
-            // It's ok to abort a job because we can't talk to the search engine.
-            if (jobManager.errorAbort(dds.getJobDescription().getID(),e.getMessage()))
-            {
-              // We eat the exception if there was already one recorded.
-
-              // An exception occurred in the processing of a set of documents.
-              // Shut the corresponding job down, with an appropriate error
-              Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-            }
-          }
-          finally
-          {
-            // Insure that the documents that were not deleted get restored to the proper state.
-            int j = 0;
-            while (j < dds.getCount())
-            {
-              CleanupQueuedDocument dqd = dds.getDocument(j);
-              if (dqd.wasProcessed() == false)
-              {
-                DocumentDescription ddd = dqd.getDocumentDescription();
-                // Requeue this document!
-                jobManager.resetDocument(ddd,0L,IJobManager.ACTION_REMOVE,-1L,-1);
-                dqd.setProcessed();
-              }
-              j++;
-            }
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            // Note the failure, which will cause a reset to occur
-            resetManager.noteEvent();
-
-            Logging.threads.error("Expiration thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // An exception occurred in the cleanup from another error.
-          // Log the error (but that's all we can do)
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("ExpirationThread "+id+" initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-
-  /** The ingest logger class */
-  protected static class OutputRemoveActivity implements IOutputRemoveActivity
-  {
-
-    // Connection name
-    protected final String connectionName;
-    // Connection manager
-    protected final IRepositoryConnectionManager connMgr;
-
-    /** Constructor */
-    public OutputRemoveActivity(String connectionName, IRepositoryConnectionManager connMgr)
-    {
-      this.connectionName = connectionName;
-      this.connMgr = connMgr;
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      connMgr.recordHistory(connectionName,startTime,activityType,dataSize,entityURI,resultCode,
-        resultDescription,null);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/FinisherThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/FinisherThread.java
deleted file mode 100644
index ff2134e..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/FinisherThread.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id: FinisherThread.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the finisher thread.  This thread's job is to detect when a job is completed, and mark it as such.
-*/
-public class FinisherThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: FinisherThread.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public FinisherThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("Finisher thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.threads.debug("Start up finisher thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          Logging.threads.debug("Cleaning up completed jobs...");
-          // See if there are any completed jobs
-          jobManager.finishJobs();
-          Logging.threads.debug("Done cleaning up completed jobs");
-          ManifoldCF.sleep(10000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Finisher thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("FinisherThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/HistoryCleanupThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/HistoryCleanupThread.java
deleted file mode 100644
index 652d7b3..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/HistoryCleanupThread.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class describes the thread that cleans up history records.
-* It fires infrequently and removes history records older than a configuration-determined cutoff.
-*/
-public class HistoryCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  protected static final String historyCleanupIntervalProperty = "org.apache.manifoldcf.crawler.historycleanupinterval";
-  
-  // Local data
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public HistoryCleanupThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("History cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-      // Default zero value means we never clean up, which is the backwards-compatible behavior
-      long historyCleanupInterval = LockManagerFactory.getLongProperty(threadContext, historyCleanupIntervalProperty, 0L);
-      // Loop
-      while (true)
-      {
-        if (Thread.currentThread().isInterrupted())
-          break;
-
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Get current time
-          long currentTime = System.currentTimeMillis();
-          // Log it
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("History cleanup thread - removing old history at "+new Long(currentTime).toString());
-          if (historyCleanupInterval > 0L && historyCleanupInterval < currentTime)
-            connectionManager.cleanUpHistoryData(currentTime - historyCleanupInterval);
-          else
-            Logging.threads.debug(" History cleanup thread did nothing because cleanup disabled");
-          // Loop around again, after resting a while
-          ManifoldCF.sleep(60L * 60L * 1000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("History thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("HistoryCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/IdleCleanupThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/IdleCleanupThread.java
deleted file mode 100644
index 59594b0..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/IdleCleanupThread.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/* $Id: IdleCleanupThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This thread periodically calls the cleanup method in all connected repository connectors.  The ostensible purpose
-* is to allow the connectors to shutdown idle connections etc.
-*/
-public class IdleCleanupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: IdleCleanupThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public IdleCleanupThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("Crawler idle cleanup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    Logging.threads.debug("Start up crawler idle cleanup thread");
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Do the cleanup
-          repositoryConnectorPool.pollAllConnectors();
-          notificationConnectorPool.pollAllConnectors();
-          // This is unnecessary because agents.interfaces.IdleCleanupThread does it.
-          //ManifoldCF.pollAll(threadContext);
-          
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(5000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Idle cleanup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("IdleCleanupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobDeleteThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobDeleteThread.java
deleted file mode 100644
index 5416ef9..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobDeleteThread.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/* $Id: JobDeleteThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the job delete thread.  This thread's job is to find jobs that are marked for delete
-* and which have no remaining ingested documents, and delete them.
-* The query which locates these jobs is in fact where all the work is; this query finds only jobs where there are
-* no remaining documents in the "completed", "purgatory", or "pendingpurgatory" states, which are in the "READYFORDELETE" state.
-*/
-public class JobDeleteThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: JobDeleteThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  */
-  public JobDeleteThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("Job delete thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionMgr = RepositoryConnectionManagerFactory.make(threadContext);
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Accumulate the wait before doing the next check.
-          // We start with 10 seconds, which is the maximum.  If there's a service request
-          // that's faster than that, we'll adjust the time downward.
-          long waitTime = 10000L;
-
-          // See if there are any starting jobs.
-          // Note: Since this following call changes the job state, we must be careful to reset it on any kind of failure.
-          Logging.threads.debug("Deleting jobs that need cleanup");
-          jobManager.deleteJobsReadyForDelete();
-
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(waitTime);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Job delete thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("JobDeleteThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobNotificationThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobNotificationThread.java
deleted file mode 100644
index c51bcb1..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobNotificationThread.java
+++ /dev/null
@@ -1,593 +0,0 @@
-/* $Id: JobNotificationThread.java 998081 2010-09-17 11:33:15Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the thread that notices jobs that have completed their "notify connector" phase, and resets them back to
-* inactive.
-*/
-public class JobNotificationThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: JobNotificationThread.java 998081 2010-09-17 11:33:15Z kwright $";
-
-  /** Notification reset manager */
-  protected final NotificationResetManager resetManager;
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  */
-  public JobNotificationThread(NotificationResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Job notification thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(threadContext);
-      IRepositoryConnectionManager repositoryConnectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // Find the jobs ready for inactivity and notify them
-          JobNotifyRecord[] jobsNeedingNotification = jobManager.getJobsReadyForInactivity(processID);
-          try
-          {
-            Set<OutputAndRepositoryConnection> connectionNames = new HashSet<OutputAndRepositoryConnection>();
-            
-            for (JobNotifyRecord jsr : jobsNeedingNotification)
-            {
-              Long jobID = jsr.getJobID();
-              IJobDescription job = jobManager.load(jobID,true);
-              if (job != null)
-              {
-                // Get the connection name
-                String repositoryConnectionName = job.getConnectionName();
-                IPipelineSpecificationBasic basicSpec = new PipelineSpecificationBasic(job);
-                for (int i = 0; i < basicSpec.getOutputCount(); i++)
-                {
-                  String outputConnectionName = basicSpec.getStageConnectionName(basicSpec.getOutputStage(i));
-                  OutputAndRepositoryConnection c = new OutputAndRepositoryConnection(outputConnectionName, repositoryConnectionName);
-                  connectionNames.add(c);
-                }
-              }
-            }
-            
-            // Attempt to notify the specified connections
-            Map<OutputAndRepositoryConnection,Disposition> notifiedConnections = new HashMap<OutputAndRepositoryConnection,Disposition>();
-            
-            for (OutputAndRepositoryConnection connections : connectionNames)
-            {
-              String outputConnectionName = connections.getOutputConnectionName();
-              String repositoryConnectionName = connections.getRepositoryConnectionName();
-              
-              OutputNotifyActivity activity = new OutputNotifyActivity(repositoryConnectionName,repositoryConnectionManager,outputConnectionName);
-              
-              IOutputConnection connection = connectionManager.load(outputConnectionName);
-              if (connection != null)
-              {
-                // Grab an appropriate connection instance
-                IOutputConnector connector = outputConnectorPool.grab(connection);
-                if (connector != null)
-                {
-                  try
-                  {
-                    // Do the notification itself
-                    try
-                    {
-                      connector.noteJobComplete(activity);
-                      notifiedConnections.put(connections,new Disposition());
-                    }
-                    catch (ServiceInterruption e)
-                    {
-                      notifiedConnections.put(connections,new Disposition(e));
-                    }
-                    catch (ManifoldCFException e)
-                    {
-                      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                        throw e;
-                      if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-                        throw e;
-                      if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-                        throw e;
-                      // Nothing special; report the error and keep going.
-                      Logging.threads.error(e.getMessage(),e);
-                    }
-                  }
-                  finally
-                  {
-                    outputConnectorPool.release(connection,connector);
-                  }
-                }
-              }
-            }
-            
-            // Go through jobs again, and put the notified ones into the inactive state.
-            for (JobNotifyRecord jsr : jobsNeedingNotification)
-            {
-              Long jobID = jsr.getJobID();
-              IJobDescription job = jobManager.load(jobID,true);
-              if (job != null)
-              {
-                // Get the connection name
-                String repositoryConnectionName = job.getConnectionName();
-                IPipelineSpecificationBasic basicSpec = new PipelineSpecificationBasic(job);
-                boolean allOK = true;
-                for (int i = 0; i < basicSpec.getOutputCount(); i++)
-                {
-                  String outputConnectionName = basicSpec.getStageConnectionName(basicSpec.getOutputStage(i));
-
-                  OutputAndRepositoryConnection c = new OutputAndRepositoryConnection(outputConnectionName, repositoryConnectionName);
-                  
-                  Disposition d = notifiedConnections.get(c);
-                  if (d != null)
-                  {
-                    ServiceInterruption e = d.getServiceInterruption();
-                    if (e == null)
-                    {
-                      break;
-                    }
-                    else
-                    {
-                      if (!e.jobInactiveAbort())
-                      {
-                        Logging.jobs.warn("Notification service interruption reported for job "+
-                          jobID+" output connection '"+outputConnectionName+"': "+
-                          e.getMessage(),e);
-                      }
-
-                      // If either we are going to be requeuing beyond the fail time, OR
-                      // the number of retries available has hit 0, THEN we treat this
-                      // as either an "ignore" or a hard error.
-                      if (!e.jobInactiveAbort() && (jsr.getFailTime() != -1L && jsr.getFailTime() < e.getRetryTime() ||
-                        jsr.getFailRetryCount() == 0))
-                      {
-                        // Treat this as a hard failure.
-                        if (e.isAbortOnFail())
-                        {
-                          // Note the error in the job, and transition to inactive state
-                          String message = e.jobInactiveAbort()?"":"Repeated service interruptions during notification"+((e.getCause()!=null)?": "+e.getCause().getMessage():"");
-                          if (jobManager.errorAbort(jobID,message) && message.length() > 0)
-                            Logging.jobs.error(message,e.getCause());
-                          jsr.noteStarted();
-                        }
-                        else
-                        {
-                          // Not sure this can happen -- but just transition silently to inactive state
-                          jobManager.inactivateJob(jobID);
-                          jsr.noteStarted();
-                        }
-                      }
-                      else
-                      {
-                        // Reset the job to the READYFORNOTIFY state, updating the failtime and failcount fields
-                        jobManager.retryNotification(jsr,e.getFailTime(),e.getFailRetryCount());
-                        jsr.noteStarted();
-                      }
-                      allOK = false;
-                      break;
-                    }
-                  }
-                }
-                if (allOK)
-                {
-                  jobManager.inactivateJob(jobID);
-                  jsr.noteStarted();
-                }
-
-              }
-            }
-          }
-          finally
-          {
-            // Clean up all jobs that did not start
-            ManifoldCFException exception = null;
-            int i = 0;
-            while (i < jobsNeedingNotification.length)
-            {
-              JobNotifyRecord jsr = jobsNeedingNotification[i++];
-              if (!jsr.wasStarted())
-              {
-                // Clean up from failed start.
-                try
-                {
-                  jobManager.resetNotifyJob(jsr.getJobID());
-                }
-                catch (ManifoldCFException e)
-                {
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    throw e;
-                  exception = e;
-                }
-              }
-            }
-            if (exception != null)
-              throw exception;
-          }
-
-          // We also need to do a notify for jobs that are about to be deleted
-          JobNotifyRecord[] jobsNeedingDeleteNotification = jobManager.getJobsReadyForDelete(processID);
-          try
-          {
-            Set<OutputAndRepositoryConnection> connectionNames = new HashSet<OutputAndRepositoryConnection>();
-            
-            for (JobNotifyRecord jsr : jobsNeedingDeleteNotification)
-            {
-              Long jobID = jsr.getJobID();
-              IJobDescription job = jobManager.load(jobID,true);
-              if (job != null)
-              {
-                // Get the connection name
-                String repositoryConnectionName = job.getConnectionName();
-                IPipelineSpecificationBasic basicSpec = new PipelineSpecificationBasic(job);
-                for (int i = 0; i < basicSpec.getOutputCount(); i++)
-                {
-                  String outputConnectionName = basicSpec.getStageConnectionName(basicSpec.getOutputStage(i));
-                  OutputAndRepositoryConnection c = new OutputAndRepositoryConnection(outputConnectionName, repositoryConnectionName);
-                  connectionNames.add(c);
-                }
-              }
-            }
-            
-            // Attempt to notify the specified connections
-            Map<OutputAndRepositoryConnection,Disposition> notifiedConnections = new HashMap<OutputAndRepositoryConnection,Disposition>();
-            
-            for (OutputAndRepositoryConnection connections : connectionNames)
-            {
-              String outputConnectionName = connections.getOutputConnectionName();
-              String repositoryConnectionName = connections.getRepositoryConnectionName();
-              
-              OutputNotifyActivity activity = new OutputNotifyActivity(repositoryConnectionName,repositoryConnectionManager,outputConnectionName);
-              
-              IOutputConnection connection = connectionManager.load(outputConnectionName);
-              if (connection != null)
-              {
-                // Grab an appropriate connection instance
-                IOutputConnector connector = outputConnectorPool.grab(connection);
-                if (connector != null)
-                {
-                  try
-                  {
-                    // Do the notification itself
-                    try
-                    {
-                      connector.noteJobComplete(activity);
-                      notifiedConnections.put(connections,new Disposition());
-                    }
-                    catch (ServiceInterruption e)
-                    {
-                      notifiedConnections.put(connections,new Disposition(e));
-                    }
-                    catch (ManifoldCFException e)
-                    {
-                      if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                        throw e;
-                      if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-                        throw e;
-                      if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-                        throw e;
-                      // Nothing special; report the error and keep going.
-                      Logging.threads.error(e.getMessage(),e);
-                    }
-                  }
-                  finally
-                  {
-                    outputConnectorPool.release(connection,connector);
-                  }
-                }
-              }
-            }
-            
-            // Go through jobs again, and put the notified ones into the inactive state.
-            for (JobNotifyRecord jsr : jobsNeedingDeleteNotification)
-            {
-              Long jobID = jsr.getJobID();
-              IJobDescription job = jobManager.load(jobID,true);
-              if (job != null)
-              {
-                // Get the connection name
-                String repositoryConnectionName = job.getConnectionName();
-                IPipelineSpecificationBasic basicSpec = new PipelineSpecificationBasic(job);
-                boolean allOK = true;
-                for (int i = 0; i < basicSpec.getOutputCount(); i++)
-                {
-                  String outputConnectionName = basicSpec.getStageConnectionName(basicSpec.getOutputStage(i));
-
-                  OutputAndRepositoryConnection c = new OutputAndRepositoryConnection(outputConnectionName, repositoryConnectionName);
-                  
-                  Disposition d = notifiedConnections.get(c);
-                  if (d != null)
-                  {
-                    ServiceInterruption e = d.getServiceInterruption();
-                    if (e == null)
-                    {
-                      break;
-                    }
-                    else
-                    {
-                      if (!e.jobInactiveAbort())
-                      {
-                        Logging.jobs.warn("Delete notification service interruption reported for job "+
-                          jobID+" output connection '"+outputConnectionName+"': "+
-                          e.getMessage(),e);
-                      }
-
-                      // If either we are going to be requeuing beyond the fail time, OR
-                      // the number of retries available has hit 0, THEN we treat this
-                      // as either an "ignore" or a hard error.
-                      ///System.out.println("jsr.getFailTime()="+jsr.getFailTime()+"; e.getRetryTime()="+e.getRetryTime()+"; jsr.getFailRetryCount()="+jsr.getFailRetryCount());
-                      if (!e.jobInactiveAbort() && (jsr.getFailTime() != -1L && jsr.getFailTime() < e.getRetryTime() ||
-                        jsr.getFailRetryCount() == 0))
-                      {
-                        // Treat this as a hard failure.
-                        if (e.isAbortOnFail())
-                        {
-                          // Note the error in the job, and transition to inactive state
-                          String message = e.jobInactiveAbort()?"":"Repeated service interruptions during delete notification"+((e.getCause()!=null)?": "+e.getCause().getMessage():"");
-                          if (message.length() > 0)
-                            Logging.jobs.error(message,e.getCause());
-                          // Can't abort a delete!!
-                          jobManager.removeJob(jobID);
-                          jsr.noteStarted();
-                        }
-                        else
-                        {
-                          // Not sure this can happen -- but just transition silently to inactive state
-                          jobManager.removeJob(jobID);
-                          jsr.noteStarted();
-                        }
-                      }
-                      else
-                      {
-                        // Reset the job to the READYFORDELETENOTIFY state, updating the failtime and failcount fields
-                        //System.out.println("Retrying... e.getFailTime()="+e.getFailTime()+"; e.getFailRetryCount()="+e.getFailRetryCount());
-                        jobManager.retryDeleteNotification(jsr,e.getFailTime(),e.getFailRetryCount());
-                        jsr.noteStarted();
-                      }
-                      allOK = false;
-                      break;
-                    }
-                  }
-                }
-                if (allOK)
-                {
-                  jobManager.removeJob(jobID);
-                  jsr.noteStarted();
-                }
-
-              }
-            }
-          }
-          finally
-          {
-            // Clean up all jobs that did not start
-            ManifoldCFException exception = null;
-            int i = 0;
-            while (i < jobsNeedingDeleteNotification.length)
-            {
-              JobNotifyRecord jsr = jobsNeedingDeleteNotification[i++];
-              if (!jsr.wasStarted())
-              {
-                // Clean up from failed start.
-                try
-                {
-                  jobManager.resetDeleteNotifyJob(jsr.getJobID());
-                }
-                catch (ManifoldCFException e)
-                {
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    throw e;
-                  exception = e;
-                }
-              }
-            }
-            if (exception != null)
-              throw exception;
-          }
-
-          ManifoldCF.sleep(10000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-            
-            Logging.threads.error("Job notification thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("JobNotificationThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-  /** Disposition of an output/repository connection combination */
-  protected static class Disposition
-  {
-    protected final ServiceInterruption serviceInterruption;
-    
-    public Disposition(ServiceInterruption serviceInterruption)
-    {
-      this.serviceInterruption = serviceInterruption;
-    }
-    
-    public Disposition()
-    {
-      this.serviceInterruption = null;
-    }
-    
-    public ServiceInterruption getServiceInterruption()
-    {
-      return serviceInterruption;
-    }
-  }
-  
-  /** Output connection/repository connection pair object */
-  protected static class OutputAndRepositoryConnection
-  {
-    protected final String outputConnectionName;
-    protected final String repositoryConnectionName;
-    
-    public OutputAndRepositoryConnection(String outputConnectionName, String repositoryConnectionName)
-    {
-      this.outputConnectionName = outputConnectionName;
-      this.repositoryConnectionName = repositoryConnectionName;
-    }
-    
-    public String getOutputConnectionName()
-    {
-      return outputConnectionName;
-    }
-    
-    public String getRepositoryConnectionName()
-    {
-      return repositoryConnectionName;
-    }
-    
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof OutputAndRepositoryConnection))
-        return false;
-      OutputAndRepositoryConnection x = (OutputAndRepositoryConnection)o;
-      return this.outputConnectionName.equals(x.outputConnectionName) && this.repositoryConnectionName.equals(x.repositoryConnectionName);
-    }
-    
-    public int hashCode()
-    {
-      return outputConnectionName.hashCode() + repositoryConnectionName.hashCode();
-    }
-  }
-  
-  /** The ingest logger class */
-  protected static class OutputNotifyActivity implements IOutputNotifyActivity
-  {
-
-    // Connection name
-    protected String connectionName;
-    // Connection manager
-    protected IRepositoryConnectionManager connMgr;
-    // Output connection name
-    protected String outputConnectionName;
-
-    /** Constructor */
-    public OutputNotifyActivity(String connectionName, IRepositoryConnectionManager connMgr, String outputConnectionName)
-    {
-      this.connectionName = connectionName;
-      this.connMgr = connMgr;
-      this.outputConnectionName = outputConnectionName;
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      connMgr.recordHistory(connectionName,startTime,ManifoldCF.qualifyOutputActivityName(activityType,outputConnectionName),dataSize,entityURI,resultCode,
-        resultDescription,null);
-    }
-
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobResetThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobResetThread.java
deleted file mode 100644
index 2e9f343..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobResetThread.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/* $Id: JobResetThread.java 991295 2010-08-31 19:12:14Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the thread that notices jobs that have completed their shutdown phase, and puts them in the
-* "notify connector" state.
-*/
-public class JobResetThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: JobResetThread.java 991295 2010-08-31 19:12:14Z kwright $";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public JobResetThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    setName("Job reset thread");
-    setDaemon(true);
-    this.processID = processID;
-  }
-
-  public void run()
-  {
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-
-      INotificationConnectionManager notificationManager = NotificationConnectionManagerFactory.make(threadContext);
-      INotificationConnectorPool notificationPool = NotificationConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // See if there are any completed jobs
-          long currentTime = System.currentTimeMillis();
-          
-          List<IJobDescription> jobStops = new ArrayList<IJobDescription>();
-          List<Integer> jobStopNotifications = new ArrayList<Integer>();
-          jobManager.finishJobStops(currentTime,jobStops,jobStopNotifications);
-          List<IJobDescription> jobResumes = new ArrayList<IJobDescription>();
-          jobManager.finishJobResumes(currentTime,jobResumes);
-          List<IJobDescription> jobCompletions = new ArrayList<IJobDescription>();
-          jobManager.resetJobs(currentTime,jobCompletions);
-          
-          // If there were any job aborts, we must reprioritize all active documents, since we've done something
-          // not predicted by the algorithm that assigned those priorities.  This is, of course, quite expensive,
-          // but it cannot be helped (at least, I cannot find a way to avoid it).
-          //
-          if (jobStops.size() > 0)
-          {
-            Logging.threads.debug("Job reset thread reprioritizing documents...");
-
-            ManifoldCF.resetAllDocumentPriorities(threadContext,processID);
-            
-            Logging.threads.debug("Job reset thread done reprioritizing documents.");
-
-          }
-
-          int k = 0;
-          while (k < jobStops.size())
-          {
-            IJobDescription desc = jobStops.get(k);
-            Integer notificationType = jobStopNotifications.get(k);
-            connectionManager.recordHistory(desc.getConnectionName(),
-              null,connectionManager.ACTIVITY_JOBSTOP,null,
-              desc.getID().toString()+"("+desc.getDescription()+")",null,null,null);
-            // As a courtesy, call all the notification connections (if any)
-            doStopNotifications(desc,notificationType,notificationManager,notificationPool);
-            k++;
-          }
-
-          k = 0;
-          while (k < jobResumes.size())
-          {
-            IJobDescription desc = jobResumes.get(k++);
-            connectionManager.recordHistory(desc.getConnectionName(),
-              null,connectionManager.ACTIVITY_JOBCONTINUE,null,
-              desc.getID().toString()+"("+desc.getDescription()+")",null,null,null);
-          }
-
-          k = 0;
-          while (k < jobCompletions.size())
-          {
-            IJobDescription desc = jobCompletions.get(k++);
-            connectionManager.recordHistory(desc.getConnectionName(),
-              null,connectionManager.ACTIVITY_JOBEND,null,
-              desc.getID().toString()+"("+desc.getDescription()+")",null,null,null);
-            // As a courtesy, call all the notification connections (if any)
-            doEndNotifications(desc,notificationManager,notificationPool);
-          }
-          
-          ManifoldCF.sleep(10000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Job reset thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("JobResetThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-  protected static void doStopNotifications(IJobDescription jobDescription, int notificationType, INotificationConnectionManager notificationManager,
-    INotificationConnectorPool notificationPool)
-    throws ManifoldCFException
-  {
-    for (int j = 0; j < jobDescription.countNotifications(); j++)
-    {
-      String notificationConnectionName = jobDescription.getNotificationConnectionName(j);
-      try
-      {
-        INotificationConnection c = notificationManager.load(notificationConnectionName);
-        if (c != null)
-        {
-          INotificationConnector connector = notificationPool.grab(c);
-          if (connector != null)
-          {
-            try
-            {
-              switch (notificationType)
-              {
-              case IJobManager.STOP_ERRORABORT:
-                connector.notifyOfJobStopErrorAbort(jobDescription.getNotificationSpecification(j));
-                break;
-              case IJobManager.STOP_MANUALABORT:
-                connector.notifyOfJobStopManualAbort(jobDescription.getNotificationSpecification(j));
-                break;
-              case IJobManager.STOP_MANUALPAUSE:
-                connector.notifyOfJobStopManualPause(jobDescription.getNotificationSpecification(j));
-                break;
-              case IJobManager.STOP_SCHEDULEPAUSE:
-                connector.notifyOfJobStopSchedulePause(jobDescription.getNotificationSpecification(j));
-                break;
-              case IJobManager.STOP_RESTART:
-                connector.notifyOfJobStopRestart(jobDescription.getNotificationSpecification(j));
-                break;
-              default:
-                throw new RuntimeException("Unhandled notification type: "+notificationType);
-              }
-            }
-            finally
-            {
-              notificationPool.release(c,connector);
-            }
-          }
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        Logging.connectors.warn("Can't notify right now: "+e.getMessage(),e);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          throw e;
-        Logging.connectors.warn("Error notifying: "+ e.getMessage(),e);
-      }
-    }
-  }
-  
-  protected static void doEndNotifications(IJobDescription jobDescription, INotificationConnectionManager notificationManager,
-    INotificationConnectorPool notificationPool)
-    throws ManifoldCFException
-  {
-    for (int j = 0; j < jobDescription.countNotifications(); j++)
-    {
-      String notificationConnectionName = jobDescription.getNotificationConnectionName(j);
-      try
-      {
-        INotificationConnection c = notificationManager.load(notificationConnectionName);
-        if (c != null)
-        {
-          INotificationConnector connector = notificationPool.grab(c);
-          if (connector != null)
-          {
-            try
-            {
-              connector.notifyOfJobEnd(jobDescription.getNotificationSpecification(j));
-            }
-            finally
-            {
-              notificationPool.release(c,connector);
-            }
-          }
-        }
-      }
-      catch (ServiceInterruption e)
-      {
-        Logging.connectors.warn("Can't notify right now: "+e.getMessage(),e);
-      }
-      catch (ManifoldCFException e)
-      {
-        if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-          throw e;
-        Logging.connectors.warn("Error notifying: "+ e.getMessage(),e);
-      }
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobStartThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobStartThread.java
deleted file mode 100644
index bfaa1bd..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/JobStartThread.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/* $Id: JobStartThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class describes the thread that starts up jobs.  Basically, it periodically evaluates whether any jobs are ready to begin,
-* if it finds any, starts them.
-*/
-public class JobStartThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: JobStartThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  */
-  public JobStartThread(String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.processID = processID;
-    setName("Job start thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-
-      // Loop
-      while (true)
-      {
-        if (Thread.currentThread().isInterrupted())
-          break;
-
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Get current time
-          long currentTime = System.currentTimeMillis();
-          // Log it
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Job start thread - checking for jobs to start at "+new Long(currentTime).toString());
-          // Start any waiting jobs
-          List<Long> unwaitJobs = new ArrayList<Long>();
-          jobManager.startJobs(currentTime,unwaitJobs);
-          // Log these events in the event log
-          int k = 0;
-          while (k < unwaitJobs.size())
-          {
-            Long jobID = unwaitJobs.get(k++);
-            IJobDescription desc = jobManager.load(jobID);
-            connectionManager.recordHistory(desc.getConnectionName(),
-              null,connectionManager.ACTIVITY_JOBUNWAIT,null,
-              desc.getID().toString()+"("+desc.getDescription()+")",null,null,null);
-          }
-          // Cause jobs out of window to stop.
-          List<Long> waitJobs = new ArrayList<Long>();
-          jobManager.waitJobs(currentTime,waitJobs);
-          k = 0;
-          while (k < waitJobs.size())
-          {
-            Long jobID = waitJobs.get(k++);
-            IJobDescription desc = jobManager.load(jobID);
-            connectionManager.recordHistory(desc.getConnectionName(),
-              null,connectionManager.ACTIVITY_JOBWAIT,null,
-              desc.getID().toString()+"("+desc.getDescription()+")",null,null,null);
-          }
-          // Loop around again, after resting a while
-          ManifoldCF.sleep(10000L);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Job start thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("JobStartThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/Logging.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/Logging.java
deleted file mode 100644
index d197de8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/Logging.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-import org.apache.log4j.Logger;
-
-/** This class furnishes the logging environment for the crawler application.
-*/
-public class Logging extends org.apache.manifoldcf.agents.system.Logging
-{
-  public static final String _rcsid = "@(#)$Id: Logging.java 988245 2010-08-23 18:39:35Z kwright $";
-
-
-  // Public logger objects
-  public static Logger threads = null;
-  public static Logger jobs = null;
-  public static Logger connectors = null;
-  public static Logger hopcount = null;
-  public static Logger scheduling = null;
-
-  /** Initialize logger setup.
-  */
-  public static synchronized void initializeLoggers()
-  {
-    org.apache.manifoldcf.agents.system.Logging.initializeLoggers();
-
-    if (jobs != null)
-      return;
-
-    // package loggers
-    threads = newLogger("org.apache.manifoldcf.crawlerthreads");
-    jobs = newLogger("org.apache.manifoldcf.jobs");
-    connectors = newLogger("org.apache.manifoldcf.connectors");
-    hopcount = newLogger("org.apache.manifoldcf.hopcount");
-    scheduling = newLogger("org.apache.manifoldcf.scheduling");
-  }
-
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java
deleted file mode 100644
index d4fff2d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java
+++ /dev/null
@@ -1,6156 +0,0 @@
-/* $Id: ManifoldCF.java 996524 2010-09-13 13:38:01Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-
-import java.io.*;
-import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.InvalidParameterException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import java.util.*;
-
-import javax.crypto.Cipher;
-import javax.crypto.CipherInputStream;
-import javax.crypto.CipherOutputStream;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.PBEKeySpec;
-import javax.crypto.spec.SecretKeySpec;
-
-public class ManifoldCF extends org.apache.manifoldcf.agents.system.ManifoldCF
-{
-  public static final String _rcsid = "@(#)$Id: ManifoldCF.java 996524 2010-09-13 13:38:01Z kwright $";
-
-  // Initialization flag.
-  protected static boolean crawlerInitialized = false;
-
-  // Properties
-  protected static final String workerThreadCountProperty = "org.apache.manifoldcf.crawler.threads";
-  protected static final String deleteThreadCountProperty = "org.apache.manifoldcf.crawler.deletethreads";
-  protected static final String cleanupThreadCountProperty = "org.apache.manifoldcf.crawler.cleanupthreads";
-  protected static final String expireThreadCountProperty = "org.apache.manifoldcf.crawler.expirethreads";
-  protected static final String lowWaterFactorProperty = "org.apache.manifoldcf.crawler.lowwaterfactor";
-  protected static final String stuffAmtFactorProperty = "org.apache.manifoldcf.crawler.stuffamountfactor";
-  protected static final String connectorsConfigurationFileProperty = "org.apache.manifoldcf.connectorsconfigurationfile";
-  protected static final String databaseSuperuserNameProperty = "org.apache.manifoldcf.dbsuperusername";
-  protected static final String databaseSuperuserPasswordProperty = "org.apache.manifoldcf.dbsuperuserpassword";
-
-  
-  /** Initialize environment.
-  */
-  public static void initializeEnvironment(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      org.apache.manifoldcf.agents.system.ManifoldCF.initializeEnvironment(tc);
-      org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
-      org.apache.manifoldcf.crawler.system.ManifoldCF.localInitialize(tc);
-    }
-  }
-
-  public static void cleanUpEnvironment(IThreadContext tc)
-  {
-    synchronized (initializeFlagLock)
-    {
-      org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
-      org.apache.manifoldcf.crawler.system.ManifoldCF.localCleanup(tc);
-      org.apache.manifoldcf.agents.system.ManifoldCF.cleanUpEnvironment(tc);
-    }
-  }
-  
-  public static void localInitialize(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    synchronized (initializeFlagLock)
-    {
-      
-      if (crawlerInitialized)
-        return;
-      
-      Logging.initializeLoggers();
-      Logging.setLogLevels(tc);
-      crawlerInitialized = true;
-    }
-  }
-  
-  public static void localCleanup(IThreadContext tc)
-  {
-    try
-    {
-      RepositoryConnectorPoolFactory.make(tc).closeAllConnectors();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (Logging.root != null)
-        Logging.root.warn("Exception tossed on repository connector pool cleanup: "+e.getMessage(),e);
-    }
-    try
-    {
-      NotificationConnectorPoolFactory.make(tc).closeAllConnectors();
-    }
-    catch (ManifoldCFException e)
-    {
-      if (Logging.root != null)
-        Logging.root.warn("Exception tossed on notification connector pool cleanup: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Create system database using superuser properties from properties.xml.
-  */
-  public static void createSystemDatabase(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    // Get the specified superuser name and password, in case this isn't Derby we're using
-    String superuserName = LockManagerFactory.getStringProperty(threadContext, databaseSuperuserNameProperty, "");
-    String superuserPassword = LockManagerFactory.getPossiblyObfuscatedStringProperty(threadContext, databaseSuperuserPasswordProperty, "");
-    createSystemDatabase(threadContext,superuserName,superuserPassword);
-  }
-  
-  /** Register this agent */
-  public static void registerThisAgent(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    // Register 
-    IAgentManager agentMgr = AgentManagerFactory.make(tc);
-    agentMgr.registerAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-  }
-
-  /** Register or re-register all connectors, based on a connectors.xml file.
-  */
-  public static void reregisterAllConnectors(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    // Read connectors configuration file (to figure out what we need to register)
-    File connectorConfigFile = getFileProperty(connectorsConfigurationFileProperty);
-    Connectors c = readConnectorDeclarations(connectorConfigFile);
-    
-    // Unregister all the connectors we don't want.
-    unregisterAllConnectors(tc,c);
-
-    // Register (or update) all connectors specified by connectors.xml
-    registerConnectors(tc,c);
-  }
-  
-  /** Read connectors configuration file.
-  */
-  public static Connectors readConnectorDeclarations(File connectorConfigFile)
-    throws ManifoldCFException
-  {
-    Connectors c = null;
-    if (connectorConfigFile != null)
-    {
-      try
-      {
-        // Open the file, read it, and attempt to do the connector registrations
-        InputStream is = new FileInputStream(connectorConfigFile);
-        try
-        {
-          c = new Connectors(is);
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      catch (FileNotFoundException e)
-      {
-        throw new ManifoldCFException("Couldn't find connector configuration file: "+e.getMessage(),e);
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Error reading connector configuration file: "+e.getMessage(),e);
-      }
-    }
-    return c;
-  }
-
-  /** Unregister all connectors.
-  */
-  public static void unregisterAllConnectors(IThreadContext tc)
-    throws ManifoldCFException
-  {
-    unregisterAllConnectors(tc,null);
-  }
-
-  // Connectors configuration file
-  protected static final String NODE_AUTHORIZATIONDOMAIN = "authorizationdomain";
-  protected static final String NODE_OUTPUTCONNECTOR = "outputconnector";
-  protected static final String NODE_TRANSFORMATIONCONNECTOR = "transformationconnector";
-  protected static final String NODE_MAPPINGCONNECTOR = "mappingconnector";
-  protected static final String NODE_AUTHORITYCONNECTOR = "authorityconnector";
-  protected static final String NODE_NOTIFICATIONCONNECTOR = "notificationconnector";
-  protected static final String NODE_REPOSITORYCONNECTOR = "repositoryconnector";
-  protected static final String ATTRIBUTE_NAME = "name";
-  protected static final String ATTRIBUTE_CLASS = "class";
-  protected static final String ATTRIBUTE_DOMAIN = "domain";
-  
-  /** Unregister all connectors which don't match a specified connector list.
-  */
-  public static void unregisterAllConnectors(IThreadContext tc, Connectors c)
-    throws ManifoldCFException
-  {
-    // Create a map of class name and description, so we can compare what we can find
-    // against what we want.
-    Map<String,String> desiredOutputConnectors = new HashMap<String,String>();
-    Map<String,String> desiredTransformationConnectors = new HashMap<String,String>();
-    Map<String,String> desiredMappingConnectors = new HashMap<String,String>();
-    Map<String,String> desiredAuthorityConnectors = new HashMap<String,String>();
-    Map<String,String> desiredNotificationConnectors = new HashMap<String,String>();
-    Map<String,String> desiredRepositoryConnectors = new HashMap<String,String>();
-
-    Map<String,String> desiredDomains = new HashMap<String,String>();
-
-    if (c != null)
-    {
-      for (int i = 0; i < c.getChildCount(); i++)
-      {
-        ConfigurationNode cn = c.findChild(i);
-        if (cn.getType().equals(NODE_AUTHORIZATIONDOMAIN))
-        {
-          String domainName = cn.getAttributeValue(ATTRIBUTE_DOMAIN);
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          desiredDomains.put(domainName,name);
-        }
-        else if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          desiredOutputConnectors.put(className,name);
-        }
-        else if (cn.getType().equals(NODE_TRANSFORMATIONCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          desiredTransformationConnectors.put(className,name);
-        }
-        else if (cn.getType().equals(NODE_MAPPINGCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          desiredMappingConnectors.put(className,name);
-        }
-        else if (cn.getType().equals(NODE_AUTHORITYCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          desiredAuthorityConnectors.put(className,name);
-        }
-        else if (cn.getType().equals(NODE_NOTIFICATIONCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          desiredNotificationConnectors.put(className,name);
-        }
-        else if (cn.getType().equals(NODE_REPOSITORYCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          desiredRepositoryConnectors.put(className,name);
-        }
-      }
-    }
-
-    // Grab a database handle, so we can use transactions later.
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-
-    // Domains...
-    {
-      IAuthorizationDomainManager mgr = AuthorizationDomainManagerFactory.make(tc);
-      IResultSet domains = mgr.getDomains();
-      for (int i = 0; i < domains.getRowCount(); i++)
-      {
-        IResultRow row = domains.getRow(i);
-        String domainName = (String)row.getValue("domainname");
-        String description = (String)row.getValue("description");
-        if (desiredDomains.get(domainName) == null || !desiredDomains.get(domainName).equals(description))
-        {
-          mgr.unregisterDomain(domainName);
-        }
-      }
-      System.err.println("Successfully unregistered all domains");
-    }
-    
-    // Output connectors...
-    {
-      IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
-      IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-      IResultSet classNames = mgr.getConnectors();
-      int i = 0;
-      while (i < classNames.getRowCount())
-      {
-        IResultRow row = classNames.getRow(i++);
-        String className = (String)row.getValue("classname");
-        String description = (String)row.getValue("description");
-        if (desiredOutputConnectors.get(className) == null || !desiredOutputConnectors.get(className).equals(description))
-        {
-          // Deregistration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For all connection names, notify all agents of the deregistration
-            AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-            // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-            mgr.unregisterConnector(className);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-      }
-      System.err.println("Successfully unregistered all output connectors");
-    }
-
-    // Output connectors...
-    {
-      ITransformationConnectorManager mgr = TransformationConnectorManagerFactory.make(tc);
-      ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-      IResultSet classNames = mgr.getConnectors();
-      int i = 0;
-      while (i < classNames.getRowCount())
-      {
-        IResultRow row = classNames.getRow(i++);
-        String className = (String)row.getValue("classname");
-        String description = (String)row.getValue("description");
-        if (desiredTransformationConnectors.get(className) == null || !desiredTransformationConnectors.get(className).equals(description))
-        {
-          // Deregistration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For all connection names, notify all agents of the deregistration
-            AgentManagerFactory.noteTransformationConnectorDeregistration(tc,connectionNames);
-            // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-            mgr.unregisterConnector(className);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-      }
-      System.err.println("Successfully unregistered all transformation connectors");
-    }
-
-    // Mapping connectors...
-    {
-      IMappingConnectorManager mgr = MappingConnectorManagerFactory.make(tc);
-      IResultSet classNames = mgr.getConnectors();
-      int i = 0;
-      while (i < classNames.getRowCount())
-      {
-        IResultRow row = classNames.getRow(i++);
-        String className = (String)row.getValue("classname");
-        String description = (String)row.getValue("description");
-        if (desiredMappingConnectors.get(className) == null || !desiredMappingConnectors.get(className).equals(description))
-        {
-          mgr.unregisterConnector(className);
-        }
-      }
-      System.err.println("Successfully unregistered all mapping connectors");
-    }
-
-    // Authority connectors...
-    {
-      IAuthorityConnectorManager mgr = AuthorityConnectorManagerFactory.make(tc);
-      IResultSet classNames = mgr.getConnectors();
-      int i = 0;
-      while (i < classNames.getRowCount())
-      {
-        IResultRow row = classNames.getRow(i++);
-        String className = (String)row.getValue("classname");
-        String description = (String)row.getValue("description");
-        if (desiredAuthorityConnectors.get(className) == null || !desiredAuthorityConnectors.get(className).equals(description))
-        {
-          mgr.unregisterConnector(className);
-        }
-      }
-      System.err.println("Successfully unregistered all authority connectors");
-    }
-      
-    // Notification connectors...
-    {
-      INotificationConnectorManager mgr = NotificationConnectorManagerFactory.make(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      INotificationConnectionManager connManager = NotificationConnectionManagerFactory.make(tc);
-      IResultSet classNames = mgr.getConnectors();
-      int i = 0;
-      while (i < classNames.getRowCount())
-      {
-        IResultRow row = classNames.getRow(i++);
-        String className = (String)row.getValue("classname");
-        String description = (String)row.getValue("description");
-        if (desiredNotificationConnectors.get(className) == null || !desiredNotificationConnectors.get(className).equals(description))
-        {
-          // Deregistration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For each connection name, modify the jobs to note that the connector is no longer installed
-            jobManager.noteNotificationConnectorDeregistration(connectionNames);
-            // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-            mgr.unregisterConnector(className);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-      }
-    }
-    
-    // Repository connectors...
-    {
-      IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-      IResultSet classNames = mgr.getConnectors();
-      int i = 0;
-      while (i < classNames.getRowCount())
-      {
-        IResultRow row = classNames.getRow(i++);
-        String className = (String)row.getValue("classname");
-        String description = (String)row.getValue("description");
-        if (desiredRepositoryConnectors.get(className) == null || !desiredRepositoryConnectors.get(className).equals(description))
-        {
-          // Deregistration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For each connection name, modify the jobs to note that the connector is no longer installed
-            jobManager.noteConnectorDeregistration(connectionNames);
-            // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-            mgr.unregisterConnector(className);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-      }
-      System.err.println("Successfully unregistered all repository connectors");
-    }
-  }
-
-
-  /** Register all connectors as specified by a Connectors structure, usually read from the connectors.xml file.
-  */
-  public static void registerConnectors(IThreadContext tc, Connectors c)
-    throws ManifoldCFException
-  {
-    if (c != null)
-    {
-      // Grab a database handle, so we can use transactions later.
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-        
-      // Other code will go here to discover and register various connectors that exist in the classpath
-      int i = 0;
-      while (i < c.getChildCount())
-      {
-        ConfigurationNode cn = c.findChild(i++);
-        if (cn.getType().equals(NODE_AUTHORIZATIONDOMAIN))
-        {
-          String domainName = cn.getAttributeValue(ATTRIBUTE_DOMAIN);
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          IAuthorizationDomainManager mgr = AuthorizationDomainManagerFactory.make(tc);
-          mgr.registerDomain(name,domainName);
-        }
-        else if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
-          IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-          // Registration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // First, register connector
-            mgr.registerConnector(name,className);
-            // Then, signal to all jobs that might depend on this connector that they can switch state
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For all connection names, notify all agents of the registration
-            AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-          System.err.println("Successfully registered output connector '"+className+"'");
-        }
-        else if (cn.getType().equals(NODE_TRANSFORMATIONCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          ITransformationConnectorManager mgr = TransformationConnectorManagerFactory.make(tc);
-          ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-          // Registration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // First, register connector
-            mgr.registerConnector(name,className);
-            // Then, signal to all jobs that might depend on this connector that they can switch state
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For all connection names, notify all agents of the registration
-            AgentManagerFactory.noteTransformationConnectorRegistration(tc,connectionNames);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-          System.err.println("Successfully registered transformation connector '"+className+"'");
-        }
-        else if (cn.getType().equals(NODE_AUTHORITYCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          IAuthorityConnectorManager mgr = AuthorityConnectorManagerFactory.make(tc);
-          mgr.registerConnector(name,className);
-          System.err.println("Successfully registered authority connector '"+className+"'");
-        }
-        else if (cn.getType().equals(NODE_MAPPINGCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          IMappingConnectorManager mgr = MappingConnectorManagerFactory.make(tc);
-          mgr.registerConnector(name,className);
-          System.err.println("Successfully registered mapping connector '"+className+"'");
-        }
-        else if (cn.getType().equals(NODE_NOTIFICATIONCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          INotificationConnectorManager mgr = NotificationConnectorManagerFactory.make(tc);
-          IJobManager jobManager = JobManagerFactory.make(tc);
-          INotificationConnectionManager connManager = NotificationConnectionManagerFactory.make(tc);
-          // Deregistration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // First, register connector
-            mgr.registerConnector(name,className);
-            // Then, signal to all jobs that might depend on this connector that they can switch state
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For each connection name, modify the jobs to note that the connector is now installed
-            jobManager.noteNotificationConnectorRegistration(connectionNames);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-          System.err.println("Successfully registered notification connector '"+className+"'");
-        }
-        else if (cn.getType().equals(NODE_REPOSITORYCONNECTOR))
-        {
-          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
-          String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
-          IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-          IJobManager jobManager = JobManagerFactory.make(tc);
-          IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-          // Deregistration should be done in a transaction
-          database.beginTransaction();
-          try
-          {
-            // First, register connector
-            mgr.registerConnector(name,className);
-            // Then, signal to all jobs that might depend on this connector that they can switch state
-            // Find the connection names that come with this class
-            String[] connectionNames = connManager.findConnectionsForConnector(className);
-            // For each connection name, modify the jobs to note that the connector is now installed
-            jobManager.noteConnectorRegistration(connectionNames);
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-          System.err.println("Successfully registered repository connector '"+className+"'");
-        }
-        else
-          throw new ManifoldCFException("Unrecognized connectors node type '"+cn.getType()+"'");
-      }
-    }
-  }
-
-  /** Install all the crawler system tables.
-  *@param threadcontext is the thread context.
-  */
-  public static void installSystemTables(IThreadContext threadcontext)
-    throws ManifoldCFException
-  {
-    IConnectorManager repConnMgr = ConnectorManagerFactory.make(threadcontext);
-    IRepositoryConnectionManager repCon = RepositoryConnectionManagerFactory.make(threadcontext);
-    INotificationConnectorManager notConnMgr = NotificationConnectorManagerFactory.make(threadcontext);
-    INotificationConnectionManager notCon = NotificationConnectionManagerFactory.make(threadcontext);
-    IJobManager jobManager = JobManagerFactory.make(threadcontext);
-    IBinManager binManager = BinManagerFactory.make(threadcontext);
-    org.apache.manifoldcf.authorities.system.ManifoldCF.installSystemTables(threadcontext);
-    repConnMgr.install();
-    repCon.install();
-    notConnMgr.install();
-    notCon.install();
-    jobManager.install();
-    binManager.install();
-  }
-
-  /** Uninstall all the crawler system tables.
-  *@param threadcontext is the thread context.
-  */
-  public static void deinstallSystemTables(IThreadContext threadcontext)
-    throws ManifoldCFException
-  {
-    IConnectorManager repConnMgr = ConnectorManagerFactory.make(threadcontext);
-    IRepositoryConnectionManager repCon = RepositoryConnectionManagerFactory.make(threadcontext);
-    INotificationConnectorManager notConnMgr = NotificationConnectorManagerFactory.make(threadcontext);
-    INotificationConnectionManager notCon = NotificationConnectionManagerFactory.make(threadcontext);
-    IJobManager jobManager = JobManagerFactory.make(threadcontext);
-    IBinManager binManager = BinManagerFactory.make(threadcontext);
-    binManager.deinstall();
-    jobManager.deinstall();
-    notCon.deinstall();
-    notConnMgr.deinstall();
-    repCon.deinstall();
-    repConnMgr.deinstall();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.deinstallSystemTables(threadcontext);
-  }
-
-  /** Atomically export the crawler configuration */
-  public static void exportConfiguration(IThreadContext threadContext, String exportFilename, String passCode)
-    throws ManifoldCFException
-  {
-    // The basic idea here is that we open a zip stream, into which we dump all the pertinent information in a transactionally-consistent manner.
-    // First, we need a database handle...
-    IDBInterface database = DBInterfaceFactory.make(threadContext,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    // Also create the following managers, which will handle the actual details of writing configuration data
-    IOutputConnectionManager outputManager = OutputConnectionManagerFactory.make(threadContext);
-    ITransformationConnectionManager transManager = TransformationConnectionManagerFactory.make(threadContext);
-    IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(threadContext);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
-    INotificationConnectionManager notificationConnManager = NotificationConnectionManagerFactory.make(threadContext);
-    IMappingConnectionManager mappingManager = MappingConnectionManagerFactory.make(threadContext);
-    IAuthorityConnectionManager authManager = AuthorityConnectionManagerFactory.make(threadContext);
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-    File outputFile = new File(exportFilename);
-
-    // Create a zip output stream, which is what we will use as a mechanism for handling the output data
-    try
-    {
-      
-      OutputStream os = new FileOutputStream(outputFile);
-      
-      try
-      {
-        
-        java.util.zip.ZipOutputStream zos = null;
-        CipherOutputStream cos = null;
-        
-        // Check whether we need to encrypt the file content:
-        if (passCode != null && passCode.length() > 0)
-        {
-          
-          // Write IV as a prefix:
-          byte[] iv = getSecureRandom();
-          os.write(iv);
-          os.flush();
-          
-          Cipher cipher = getCipher(threadContext, Cipher.ENCRYPT_MODE, passCode, iv);
-          cos = new CipherOutputStream(os, cipher);
-          zos = new java.util.zip.ZipOutputStream(cos);
-        }
-        else
-          zos = new java.util.zip.ZipOutputStream(os);
- 
-        try
-        {
-          // Now, work within a transaction.
-          database.beginTransaction();
-          try
-          {
-            // At the outermost level, I've decided that the best structure is to have a zipentry for each
-            // manager.  Each manager must manage its own data as a binary blob, including any format versioning information,
-            // This guarantees flexibility for the future.
-
-            // The zipentries must be written in an order that permits their proper restoration.  The "lowest level" is thus
-            // written first, which yields the order: authority connections, repository connections, jobs
-            java.util.zip.ZipEntry transEntry = new java.util.zip.ZipEntry("transformations");
-            zos.putNextEntry(transEntry);
-            transManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry outputEntry = new java.util.zip.ZipEntry("outputs");
-            zos.putNextEntry(outputEntry);
-            outputManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry groupEntry = new java.util.zip.ZipEntry("groups");
-            zos.putNextEntry(groupEntry);
-            groupManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry mappingEntry = new java.util.zip.ZipEntry("mappings");
-            zos.putNextEntry(mappingEntry);
-            mappingManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry authEntry = new java.util.zip.ZipEntry("authorities");
-            zos.putNextEntry(authEntry);
-            authManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry connEntry = new java.util.zip.ZipEntry("connections");
-            zos.putNextEntry(connEntry);
-            connManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry notConnEntry = new java.util.zip.ZipEntry("notifications");
-            zos.putNextEntry(notConnEntry);
-            notificationConnManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            java.util.zip.ZipEntry jobsEntry = new java.util.zip.ZipEntry("jobs");
-            zos.putNextEntry(jobsEntry);
-            jobManager.exportConfiguration(zos);
-            zos.closeEntry();
-
-            // All done
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-        finally
-        {
-          zos.close();
-          if (cos != null) {
-            cos.close();
-          }
-        }
-      }
-      finally
-      {
-        os.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      // On error, delete any file we created
-      outputFile.delete();
-      // Convert I/O error into lcf exception
-      throw new ManifoldCFException("Error creating configuration file: "+e.getMessage(),e);
-    }
-  }
-  
-
-  /** Atomically import a crawler configuration */
-  public static void importConfiguration(IThreadContext threadContext, String importFilename, String passCode)
-    throws ManifoldCFException
-  {
-    // First, we need a database handle...
-    IDBInterface database = DBInterfaceFactory.make(threadContext,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    // Also create the following managers, which will handle the actual details of reading configuration data
-    IOutputConnectionManager outputManager = OutputConnectionManagerFactory.make(threadContext);
-    ITransformationConnectionManager transManager = TransformationConnectionManagerFactory.make(threadContext);
-    IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(threadContext);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
-    INotificationConnectionManager notificationConnManager = NotificationConnectionManagerFactory.make(threadContext);
-    IMappingConnectionManager mappingManager = MappingConnectionManagerFactory.make(threadContext);
-    IAuthorityConnectionManager authManager = AuthorityConnectionManagerFactory.make(threadContext);
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-
-    File inputFile = new File(importFilename);
-
-    // Create a zip input stream, which is what we will use as a mechanism for handling the input data
-    try
-    {
-      InputStream is = new FileInputStream(inputFile);
-      try
-      {
-        java.util.zip.ZipInputStream zis = null;
-        CipherInputStream cis = null;
-        
-        // Check whether we need to decrypt the file content:
-        if (passCode != null && passCode.length() > 0)
-        {
-          
-          byte[] iv = new byte[IV_LENGTH];
-          is.read(iv);
-
-          Cipher cipher = getCipher(threadContext, Cipher.DECRYPT_MODE, passCode, iv);
-          cis = new CipherInputStream(is, cipher);
-          zis = new java.util.zip.ZipInputStream(cis);
-        }
-        else
-          zis = new java.util.zip.ZipInputStream(is);
-
-        try
-        {
-          // Now, work within a transaction.
-          database.beginTransaction();
-          try
-          {
-            // Process the entries in the order in which they were recorded.
-            int entries = 0;
-            while (true)
-            {
-              java.util.zip.ZipEntry z = zis.getNextEntry();
-              // Stop if there are no more entries
-              if (z == null)
-                break;
-              entries++;
-              // Get the name of the entry
-              String name = z.getName();
-              if (name.equals("transformations"))
-                transManager.importConfiguration(zis);
-              else if (name.equals("outputs"))
-                outputManager.importConfiguration(zis);
-              else if (name.equals("groups"))
-                groupManager.importConfiguration(zis);
-              else if (name.equals("mappings"))
-                mappingManager.importConfiguration(zis);
-              else if (name.equals("authorities"))
-                authManager.importConfiguration(zis);
-              else if (name.equals("connections"))
-                connManager.importConfiguration(zis);
-              else if (name.equals("notifications"))
-                notificationConnManager.importConfiguration(zis);
-              else if (name.equals("jobs"))
-                jobManager.importConfiguration(zis);
-              else
-                throw new ManifoldCFException("Configuration file has an entry named '"+name+"' that I do not recognize");
-              zis.closeEntry();
-
-            }
-            if (entries == 0 && passCode != null && passCode.length() > 0)
-              throw new ManifoldCFException("Cannot read configuration file. Please check your passcode and/or SALT value.");
-            // All done!!
-          }
-          catch (ManifoldCFException e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          catch (Error e)
-          {
-            database.signalRollback();
-            throw e;
-          }
-          finally
-          {
-            database.endTransaction();
-          }
-        }
-        finally
-        {
-          zis.close();
-          if (cis != null) {
-            cis.close();
-          }
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      // Convert I/O error into lcf exception
-      throw new ManifoldCFException("Error reading configuration file: "+e.getMessage(),e);
-    }
-  }
-
-
-  /** Get the maximum number of worker threads.
-  */
-  public static int getMaxWorkerThreads(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    return LockManagerFactory.getIntProperty(threadContext,workerThreadCountProperty,100);
-  }
-
-  /** Get the maximum number of delete threads.
-  */
-  public static int getMaxDeleteThreads(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    return LockManagerFactory.getIntProperty(threadContext,deleteThreadCountProperty,10);
-  }
-
-  /** Get the maximum number of expire threads.
-  */
-  public static int getMaxExpireThreads(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    return LockManagerFactory.getIntProperty(threadContext,expireThreadCountProperty,10);
-  }
-
-  /** Get the maximum number of cleanup threads.
-  */
-  public static int getMaxCleanupThreads(IThreadContext threadContext)
-    throws ManifoldCFException
-  {
-    return LockManagerFactory.getIntProperty(threadContext,cleanupThreadCountProperty,10);
-  }
-  
-  /** Requeue documents due to carrydown.
-  */
-  public static void requeueDocumentsDueToCarrydown(IJobManager jobManager,
-    DocumentDescription[] requeueCandidates,
-    IRepositoryConnector connector, IRepositoryConnection connection, IReprioritizationTracker rt, long currentTime)
-    throws ManifoldCFException
-  {
-    // A list of document descriptions from finishDocuments() above represents those documents that may need to be requeued, for the
-    // reason that carrydown information for those documents has changed.  In order to requeue, we need to calculate document priorities, however.
-    IPriorityCalculator[] docPriorities = new IPriorityCalculator[requeueCandidates.length];
-    String[][] binNames = new String[requeueCandidates.length][];
-    int q = 0;
-    while (q < requeueCandidates.length)
-    {
-      DocumentDescription dd = requeueCandidates[q];
-      String[] bins = calculateBins(connector,dd.getDocumentIdentifier());
-      binNames[q] = bins;
-      docPriorities[q] = new PriorityCalculator(rt,connection,bins,dd.getDocumentIdentifier());
-      q++;
-    }
-
-    // Now, requeue the documents with the new priorities
-    jobManager.carrydownChangeDocumentMultiple(requeueCandidates,docPriorities);
-  }
-
-  /** Stuff colons so we can't have conflicts. */
-  public static String colonStuff(String input)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < input.length())
-    {
-      char x  = input.charAt(i++);
-      if (x == ':' || x == '\\')
-        sb.append('\\');
-      sb.append(x);
-    }
-    return sb.toString();
-  }
-
-  /** Create a global string */
-  public static String createGlobalString(String simpleString)
-  {
-    return ":" + simpleString;
-  }
-
-  /** Create a connection-specific string */
-  public static String createConnectionSpecificString(String connectionName, String simpleString)
-  {
-    return "C "+colonStuff(connectionName) + ":" + simpleString;
-  }
-
-  /** Create a job-specific string */
-  public static String createJobSpecificString(Long jobID, String simpleString)
-  {
-    return "J "+jobID.toString() + ":" + simpleString;
-  }
-
-  /** Given a connector object and a document identifier, calculate its bins.
-  */
-  public static String[] calculateBins(IRepositoryConnector connector, String documentIdentifier)
-  {
-    // Get the bins for the document identifier
-    return connector.getBinNames(documentIdentifier);
-  }
-
-  /** Reset all (active) document priorities.  This operation may occur due to various externally-triggered
-  * events, such a job abort, pause, resume, wait, or unwait.
-  */
-  public static void resetAllDocumentPriorities(IThreadContext threadContext, String processID)
-    throws ManifoldCFException
-  {
-    // The reprioritization cycle is as follows now:
-    // (1) We reset the reprioritization tracker, which causes all bins to be be reset, and locks reprioritization so that it is blocked;
-    // (2) We clear all document priorities;
-    // (3) We unlock reprioritization, so that it may proceed.
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-    String reproID = IDFactory.make(threadContext);
-
-    rt.startReprioritization(processID,reproID);
-
-    jobManager.clearAllDocumentPriorities();
-
-    rt.doneReprioritization(reproID);
-
-  /*
-    ILockManager lockManager = LockManagerFactory.make(threadContext);
-    IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-    IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-    String reproID = IDFactory.make(threadContext);
-
-    rt.startReprioritization(System.currentTimeMillis(),processID,reproID);
-    // Reprioritize all documents in the jobqueue, 1000 at a time
-
-    Map<String,IRepositoryConnection> connectionMap = new HashMap<String,IRepositoryConnection>();
-    Map<Long,IJobDescription> jobDescriptionMap = new HashMap<Long,IJobDescription>();
-    
-    // Do the 'not yet processed' documents only.  Documents that are queued for reprocessing will be assigned
-    // new priorities.  Already processed documents won't.  This guarantees that our bins are appropriate for current thread
-    // activity.
-    // In order for this to be the correct functionality, ALL reseeding and requeuing operations MUST reset the associated document
-    // priorities.
-    // ???? Should only start the process of reprioritization, not complete it.
-    while (true)
-    {
-      long startTime = System.currentTimeMillis();
-
-      Long currentTimeValue = rt.checkReprioritizationInProgress();
-      if (currentTimeValue == null)
-      {
-        // Some other process or thread superceded us.
-        return;
-      }
-      long updateTime = currentTimeValue.longValue();
-      
-      DocumentDescription[] docs = jobManager.getNextNotYetProcessedReprioritizationDocuments(10000);
-      if (docs.length == 0)
-        break;
-
-      // Calculate new priorities for all these documents
-      writeDocumentPriorities(threadContext,docs,connectionMap,jobDescriptionMap);
-
-      Logging.threads.debug("Reprioritized "+Integer.toString(docs.length)+" not-yet-processed documents in "+new Long(System.currentTimeMillis()-startTime)+" ms");
-    }
-    
-    rt.doneReprioritization(reproID);
-    */
-  }
-  
-  /** Write a set of document priorities, based on the current queue tracker.
-  */
-  public static void writeDocumentPriorities(IThreadContext threadContext, DocumentDescription[] descs,
-    Map<String,IRepositoryConnection> connectionMap, Map<Long,IJobDescription> jobDescriptionMap)
-    throws ManifoldCFException
-  {
-    IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(threadContext);
-    IJobManager jobManager = JobManagerFactory.make(threadContext);
-    IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-    
-    if (Logging.scheduling.isDebugEnabled())
-      Logging.scheduling.debug("Reprioritizing "+Integer.toString(descs.length)+" documents");
-
-
-    IPriorityCalculator[] priorities = new IPriorityCalculator[descs.length];
-
-    rt.clearPreloadRequests();
-    
-    // Compute the list of connector instances we will need.
-    // This has a side effect of fetching all job descriptions too.
-    Set<String> connectionNames = new HashSet<String>();
-    for (int i = 0; i < descs.length; i++)
-    {
-      DocumentDescription dd = descs[i];
-      IJobDescription job = jobDescriptionMap.get(dd.getJobID());
-      if (job == null)
-      {
-        job = jobManager.load(dd.getJobID(),true);
-        jobDescriptionMap.put(dd.getJobID(),job);
-      }
-      connectionNames.add(job.getConnectionName());
-    }
-    String[] orderingKeys = new String[connectionNames.size()];
-    IRepositoryConnection[] connections = new IRepositoryConnection[connectionNames.size()];
-    int z = 0;
-    for (String connectionName : connectionNames)
-    {
-      orderingKeys[z] = connectionName;
-      IRepositoryConnection connection = connectionMap.get(connectionName);
-      if (connection == null)
-      {
-        connection = mgr.load(connectionName);
-        connectionMap.put(connectionName,connection);
-      }
-      connections[z] = connection;
-      z++;
-    }
-
-    // Now, grab the connector instances we need
-    IRepositoryConnector[] connectors = repositoryConnectorPool.grabMultiple(orderingKeys,connections);
-    try
-    {
-      // Map from connection name to connector instance
-      Map<String,IRepositoryConnector> connectorMap = new HashMap<String,IRepositoryConnector>();
-      for (z = 0; z < orderingKeys.length; z++)
-      {
-        connectorMap.put(orderingKeys[z],connectors[z]);
-      }
-      // Go through the documents and calculate the priorities
-      double minimumDepth = rt.getMinimumDepth();
-      for (int i = 0; i < descs.length; i++)
-      {
-        DocumentDescription dd = descs[i];
-        IJobDescription job = jobDescriptionMap.get(dd.getJobID());
-        String connectionName = job.getConnectionName();
-        IRepositoryConnector connector = connectorMap.get(connectionName);
-        IRepositoryConnection connection = connectionMap.get(connectionName);
-        String[] binNames;
-        if (connector == null)
-          binNames = new String[]{""};
-        else
-          // Get the bins for the document identifier
-          binNames = connector.getBinNames(descs[i].getDocumentIdentifier());
-        PriorityCalculator p = new PriorityCalculator(rt,minimumDepth,connection,binNames,descs[i].getDocumentIdentifier());
-        priorities[i] = p;
-        p.makePreloadRequest();
-      }
-    }
-    finally
-    {
-      // Release all the connector instances we grabbed
-      repositoryConnectorPool.releaseMultiple(connections,connectors);
-    }
-    
-    rt.preloadBinValues();
-    
-    // Now, write all the priorities we can.
-    jobManager.writeDocumentPriorities(descs,priorities);
-
-    rt.clearPreloadedValues();
-  }
-
-  /** Get the activities list for a given repository connection.
-  */
-  public static String[] getActivitiesList(IThreadContext threadContext, String connectionName)
-    throws ManifoldCFException
-  {
-    IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(threadContext);
-    IRepositoryConnection thisConnection = connectionManager.load(connectionName);
-    if (thisConnection == null)
-      return null;
-    String[] outputActivityList = OutputConnectionManagerFactory.getAllOutputActivities(threadContext);
-    String[] transformationActivityList = TransformationConnectionManagerFactory.getAllTransformationActivities(threadContext);
-    String[] connectorActivityList = RepositoryConnectorFactory.getActivitiesList(threadContext,thisConnection.getClassName());
-    String[] globalActivityList = IRepositoryConnectionManager.activitySet;
-    String[] activityList = new String[transformationActivityList.length + outputActivityList.length + ((connectorActivityList==null)?0:connectorActivityList.length) + globalActivityList.length];
-    int k2 = 0;
-    if (transformationActivityList != null)
-    {
-      for (String transformationActivity: transformationActivityList)
-      {
-        activityList[k2++] = transformationActivity;
-      }
-    }
-    if (outputActivityList != null)
-    {
-      for (String outputActivity : outputActivityList)
-      {
-        activityList[k2++] = outputActivity;
-      }
-    }
-    if (connectorActivityList != null)
-    {
-      for (String connectorActivity : connectorActivityList)
-      {
-        activityList[k2++] = connectorActivity;
-      }
-    }
-    for (String globalActivity : globalActivityList)
-    {
-      activityList[k2++] = globalActivity;
-    }
-    java.util.Arrays.sort(activityList);
-    return activityList;
-  }
-  
-  // ========================== API support ===========================
-  
-  protected static final String API_JOBNODE = "job";
-  protected static final String API_JOBSTATUSNODE = "jobstatus";
-  protected static final String API_AUTHORIZATIONDOMAINNODE = "authorizationdomain";
-  protected static final String API_AUTHORITYGROUPNODE = "authoritygroup";
-  protected static final String API_REPOSITORYCONNECTORNODE = "repositoryconnector";
-  protected static final String API_NOTIFICATIONCONNECTORNODE = "notificationconnector";
-  protected static final String API_OUTPUTCONNECTORNODE = "outputconnector";
-  protected static final String API_TRANSFORMATIONCONNECTORNODE = "transformationconnector";
-  protected static final String API_AUTHORITYCONNECTORNODE = "authorityconnector";
-  protected static final String API_MAPPINGCONNECTORNODE = "mappingconnector";
-  protected static final String API_REPOSITORYCONNECTIONNODE = "repositoryconnection";
-  protected static final String API_NOTIFICATIONCONNECTIONNODE = "notificationconnection";
-  protected static final String API_OUTPUTCONNECTIONNODE = "outputconnection";
-  protected static final String API_TRANSFORMATIONCONNECTIONNODE = "transformationconnection";
-  protected static final String API_AUTHORITYCONNECTIONNODE = "authorityconnection";
-  protected static final String API_MAPPINGCONNECTIONNODE = "mappingconnection";
-  protected static final String API_CHECKRESULTNODE = "check_result";
-  protected static final String API_JOBIDNODE = "job_id";
-  protected static final String API_CONNECTIONNAMENODE = "connection_name";
-  protected final static String API_ROWNODE = "row";
-  protected final static String API_COLUMNNODE = "column";
-  protected final static String API_NAMENODE = "name";
-  protected final static String API_VALUENODE = "value";
-  protected final static String API_ACTIVITYNODE = "activity";
-  
-  // Connector nodes
-  protected static final String CONNECTORNODE_DESCRIPTION = "description";
-  protected static final String CONNECTORNODE_CLASSNAME = "class_name";
-  
-  // Authorization domain nodes
-  protected static final String AUTHORIZATIONDOMAINNODE_DESCRIPTION = "description";
-  protected static final String AUTHORIZATIONDOMAINNODE_DOMAINNAME = "domain_name";
-  
-  /** Decode path element.
-  * Path elements in the API world cannot have "/" characters, or they become impossible to parse.  This method undoes
-  * escaping that prevents "/" from appearing.
-  */
-  public static String decodeAPIPathElement(String startingPathElement)
-    throws ManifoldCFException
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < startingPathElement.length())
-    {
-      char x = startingPathElement.charAt(i++);
-      if (x == '.')
-      {
-        if (i == startingPathElement.length())
-          throw new ManifoldCFException("Element decoding failed; illegal '.' character in '"+startingPathElement+"'");
-        
-        x = startingPathElement.charAt(i++);
-        if (x == '.')
-          sb.append(x);
-        else if (x == '+')
-          sb.append('/');
-        else
-          throw new ManifoldCFException("Element decoding failed; illegal post-'.' character in '"+startingPathElement+"'");
-      }
-      else
-        sb.append(x);
-    }
-    return sb.toString();
-  }
-
-  // Read (GET) functions
-  
-  // Read result codes
-  public static final int READRESULT_NOTFOUND = 0;
-  public static final int READRESULT_FOUND = 1;
-  public static final int READRESULT_NOTALLOWED = 2;
-  
-  /** Read jobs */
-  protected static int apiReadJobs(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription[] jobs = jobManager.getAllJobs();
-      int i = 0;
-      while (i < jobs.length)
-      {
-        ConfigurationNode jobNode = new ConfigurationNode(API_JOBNODE);
-        formatJobDescription(jobNode,jobs[i++]);
-        output.addChild(output.getChildCount(),jobNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read a job */
-  protected static int apiReadJob(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription job = jobManager.load(jobID);
-      if (job != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode jobNode = new ConfigurationNode(API_JOBNODE);
-        formatJobDescription(jobNode,job);
-        output.addChild(output.getChildCount(),jobNode);
-      }
-      else
-      {
-        createErrorNode(output,"Job does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read an output connection status */
-  protected static int apiReadOutputConnectionStatus(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(tc);
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(tc);
-      IOutputConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-          
-      String results;
-      // Grab a connection handle, and call the test method
-      IOutputConnector connector = outputConnectorPool.grab(connection);
-      try
-      {
-        results = connector.check();
-      }
-      catch (ManifoldCFException e)
-      {
-        results = e.getMessage();
-      }
-      finally
-      {
-        outputConnectorPool.release(connection,connector);
-      }
-          
-      ConfigurationNode response = new ConfigurationNode(API_CHECKRESULTNODE);
-      response.setValue(results);
-      output.addChild(output.getChildCount(),response);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read a transformation connection status */
-  protected static int apiReadTransformationConnectionStatus(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-    
-    try
-    {
-      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(tc);
-      ITransformationConnectionManager connectionManager = TransformationConnectionManagerFactory.make(tc);
-      ITransformationConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-          
-      String results;
-      // Grab a connection handle, and call the test method
-      ITransformationConnector connector = transformationConnectorPool.grab(connection);
-      try
-      {
-        results = connector.check();
-      }
-      catch (ManifoldCFException e)
-      {
-        results = e.getMessage();
-      }
-      finally
-      {
-        transformationConnectorPool.release(connection,connector);
-      }
-          
-      ConfigurationNode response = new ConfigurationNode(API_CHECKRESULTNODE);
-      response.setValue(results);
-      output.addChild(output.getChildCount(),response);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read an authority connection status */
-  protected static int apiReadAuthorityConnectionStatus(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(tc);
-      IAuthorityConnectionManager connectionManager = AuthorityConnectionManagerFactory.make(tc);
-      IAuthorityConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-          
-      String results;
-      // Grab a connection handle, and call the test method
-      IAuthorityConnector connector = authorityConnectorPool.grab(connection);
-      try
-      {
-        results = connector.check();
-      }
-      catch (ManifoldCFException e)
-      {
-        results = e.getMessage();
-      }
-      finally
-      {
-        authorityConnectorPool.release(connection,connector);
-      }
-          
-      ConfigurationNode response = new ConfigurationNode(API_CHECKRESULTNODE);
-      response.setValue(results);
-      output.addChild(output.getChildCount(),response);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read a mapping connection status */
-  protected static int apiReadMappingConnectionStatus(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(tc);
-      IMappingConnectionManager connectionManager = MappingConnectionManagerFactory.make(tc);
-      IMappingConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-          
-      String results;
-      // Grab a connection handle, and call the test method
-      IMappingConnector connector = mappingConnectorPool.grab(connection);
-      try
-      {
-        results = connector.check();
-      }
-      catch (ManifoldCFException e)
-      {
-        results = e.getMessage();
-      }
-      finally
-      {
-        mappingConnectorPool.release(connection,connector);
-      }
-          
-      ConfigurationNode response = new ConfigurationNode(API_CHECKRESULTNODE);
-      response.setValue(results);
-      output.addChild(output.getChildCount(),response);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read a repository connection status */
-  protected static int apiReadRepositoryConnectionStatus(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(tc);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-          
-      String results;
-      // Grab a connection handle, and call the test method
-      IRepositoryConnector connector = repositoryConnectorPool.grab(connection);
-      try
-      {
-        results = connector.check();
-      }
-      catch (ManifoldCFException e)
-      {
-        results = e.getMessage();
-      }
-      finally
-      {
-        repositoryConnectorPool.release(connection,connector);
-      }
-          
-      ConfigurationNode response = new ConfigurationNode(API_CHECKRESULTNODE);
-      response.setValue(results);
-      output.addChild(output.getChildCount(),response);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read a notification connection status */
-  protected static int apiReadNotificationConnectionStatus(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(tc);
-      INotificationConnectionManager connectionManager = NotificationConnectionManagerFactory.make(tc);
-      INotificationConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-          
-      String results;
-      // Grab a connection handle, and call the test method
-      INotificationConnector connector = notificationConnectorPool.grab(connection);
-      try
-      {
-        results = connector.check();
-      }
-      catch (ManifoldCFException e)
-      {
-        results = e.getMessage();
-      }
-      finally
-      {
-        notificationConnectorPool.release(connection,connector);
-      }
-          
-      ConfigurationNode response = new ConfigurationNode(API_CHECKRESULTNODE);
-      response.setValue(results);
-      output.addChild(output.getChildCount(),response);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read an output connection's info */
-  protected static int apiReadOutputConnectionInfo(IThreadContext tc, Configuration output, String connectionName, String command, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(tc);
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(tc);
-      IOutputConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-
-      // Grab a connection handle, and call the test method
-      IOutputConnector connector = outputConnectorPool.grab(connection);
-      try
-      {
-        return connector.requestInfo(output,command)?READRESULT_FOUND:READRESULT_NOTFOUND;
-      }
-      finally
-      {
-        outputConnectorPool.release(connection,connector);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read a transformation connection's info */
-  protected static int apiReadTransformationConnectionInfo(IThreadContext tc, Configuration output, String connectionName, String command, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(tc);
-      ITransformationConnectionManager connectionManager = TransformationConnectionManagerFactory.make(tc);
-      ITransformationConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-
-      // Grab a connection handle, and call the test method
-      ITransformationConnector connector = transformationConnectorPool.grab(connection);
-      try
-      {
-        return connector.requestInfo(output,command)?READRESULT_FOUND:READRESULT_NOTFOUND;
-      }
-      finally
-      {
-        transformationConnectorPool.release(connection,connector);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read a repository connection's info */
-  protected static int apiReadRepositoryConnectionInfo(IThreadContext tc, Configuration output, String connectionName, String command, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(tc);
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-
-      // Grab a connection handle, and call the test method
-      IRepositoryConnector connector = repositoryConnectorPool.grab(connection);
-      try
-      {
-        return connector.requestInfo(output,command)?READRESULT_FOUND:READRESULT_NOTFOUND;
-      }
-      finally
-      {
-        repositoryConnectorPool.release(connection,connector);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read a notification connection's info */
-  protected static int apiReadNotificationConnectionInfo(IThreadContext tc, Configuration output, String connectionName, String command, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(tc);
-      INotificationConnectionManager connectionManager = NotificationConnectionManagerFactory.make(tc);
-      INotificationConnection connection = connectionManager.load(connectionName);
-      if (connection == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-
-      // Grab a connection handle, and call the test method
-      INotificationConnector connector = notificationConnectorPool.grab(connection);
-      try
-      {
-        return connector.requestInfo(output,command)?READRESULT_FOUND:READRESULT_NOTFOUND;
-      }
-      finally
-      {
-        notificationConnectorPool.release(connection,connector);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get api job statuses */
-  protected static int apiReadJobStatuses(IThreadContext tc, Configuration output, Map<String,List<String>> queryParameters, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
-      return READRESULT_NOTALLOWED;
-
-    if (queryParameters == null)
-      queryParameters = new HashMap<String,List<String>>();
-    int maxCount;
-    List<String> maxCountList = queryParameters.get("maxcount");
-    if (maxCountList == null || maxCountList.size() == 0)
-      maxCount = Integer.MAX_VALUE;
-    else if (maxCountList.size() > 1)
-      throw new ManifoldCFException("Multiple values for maxcount parameter");
-    else
-      maxCount = new Integer(maxCountList.get(0)).intValue();
-      
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      JobStatus[] jobStatuses = jobManager.getAllStatus(true,maxCount);
-      int i = 0;
-      while (i < jobStatuses.length)
-      {
-        ConfigurationNode jobStatusNode = new ConfigurationNode(API_JOBSTATUSNODE);
-        formatJobStatus(jobStatusNode,jobStatuses[i++]);
-        output.addChild(output.getChildCount(),jobStatusNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get api job statuses */
-  protected static int apiReadJobStatusesNoCounts(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      JobStatus[] jobStatuses = jobManager.getAllStatus(false);
-      int i = 0;
-      while (i < jobStatuses.length)
-      {
-        ConfigurationNode jobStatusNode = new ConfigurationNode(API_JOBSTATUSNODE);
-        formatJobStatus(jobStatusNode,jobStatuses[i++]);
-        output.addChild(output.getChildCount(),jobStatusNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Get api job status */
-  protected static int apiReadJobStatus(IThreadContext tc, Configuration output, Long jobID, Map<String,List<String>> queryParameters, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
-      return READRESULT_NOTALLOWED;
-
-    if (queryParameters == null)
-      queryParameters = new HashMap<String,List<String>>();
-    int maxCount;
-    List<String> maxCountList = queryParameters.get("maxcount");
-    if (maxCountList == null || maxCountList.size() == 0)
-      maxCount = Integer.MAX_VALUE;
-    else if (maxCountList.size() > 1)
-      throw new ManifoldCFException("Multiple values for maxcount parameter");
-    else
-      maxCount = new Integer(maxCountList.get(0)).intValue();
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      JobStatus status = jobManager.getStatus(jobID,true,maxCount);
-      if (status != null)
-      {
-        ConfigurationNode jobStatusNode = new ConfigurationNode(API_JOBSTATUSNODE);
-        formatJobStatus(jobStatusNode,status);
-        output.addChild(output.getChildCount(),jobStatusNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get api job status with no counts */
-  protected static int apiReadJobStatusNoCounts(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      JobStatus status = jobManager.getStatus(jobID,false);
-      if (status != null)
-      {
-        ConfigurationNode jobStatusNode = new ConfigurationNode(API_JOBSTATUSNODE);
-        formatJobStatus(jobStatusNode,status);
-        output.addChild(output.getChildCount(),jobStatusNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Get authority groups */
-  protected static int apiReadAuthorityGroups(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
-      IAuthorityGroup[] groups = groupManager.getAllGroups();
-      int i = 0;
-      while (i < groups.length)
-      {
-        ConfigurationNode groupNode = new ConfigurationNode(API_AUTHORITYGROUPNODE);
-        formatAuthorityGroup(groupNode,groups[i++]);
-        output.addChild(output.getChildCount(),groupNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read authority group */
-  protected static int apiReadAuthorityGroup(IThreadContext tc, Configuration output, String groupName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
-      IAuthorityGroup group = groupManager.load(groupName);
-      if (group != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode groupNode = new ConfigurationNode(API_AUTHORITYGROUPNODE);
-        formatAuthorityGroup(groupNode,group);
-        output.addChild(output.getChildCount(),groupNode);
-      }
-      else
-      {
-        createErrorNode(output,"Authority group '"+groupName+"' does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get output connections */
-  protected static int apiReadOutputConnections(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
-      IOutputConnection[] connections = connManager.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        ConfigurationNode connectionNode = new ConfigurationNode(API_OUTPUTCONNECTIONNODE);
-        formatOutputConnection(connectionNode,connections[i++]);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read output connection */
-  protected static int apiReadOutputConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(tc);
-      IOutputConnection connection = connectionManager.load(connectionName);
-      if (connection != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode connectionNode = new ConfigurationNode(API_OUTPUTCONNECTIONNODE);
-        formatOutputConnection(connectionNode,connection);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-      else
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-    /** Get transformation connections */
-  protected static int apiReadTransformationConnections(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      ITransformationConnectionManager connManager = TransformationConnectionManagerFactory.make(tc);
-      ITransformationConnection[] connections = connManager.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        ConfigurationNode connectionNode = new ConfigurationNode(API_TRANSFORMATIONCONNECTIONNODE);
-        formatTransformationConnection(connectionNode,connections[i++]);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read transformation connection */
-  protected static int apiReadTransformationConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      ITransformationConnectionManager connectionManager = TransformationConnectionManagerFactory.make(tc);
-      ITransformationConnection connection = connectionManager.load(connectionName);
-      if (connection != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode connectionNode = new ConfigurationNode(API_TRANSFORMATIONCONNECTIONNODE);
-        formatTransformationConnection(connectionNode,connection);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-      else
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get authority connections */
-  protected static int apiReadAuthorityConnections(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityConnectionManager connManager = AuthorityConnectionManagerFactory.make(tc);
-      IAuthorityConnection[] connections = connManager.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        ConfigurationNode connectionNode = new ConfigurationNode(API_AUTHORITYCONNECTIONNODE);
-        formatAuthorityConnection(connectionNode,connections[i++]);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get mapping connections */
-  protected static int apiReadMappingConnections(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IMappingConnectionManager connManager = MappingConnectionManagerFactory.make(tc);
-      IMappingConnection[] connections = connManager.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        ConfigurationNode connectionNode = new ConfigurationNode(API_MAPPINGCONNECTIONNODE);
-        formatMappingConnection(connectionNode,connections[i++]);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read authority connection */
-  protected static int apiReadAuthorityConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityConnectionManager connectionManager = AuthorityConnectionManagerFactory.make(tc);
-      IAuthorityConnection connection = connectionManager.load(connectionName);
-      if (connection != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode connectionNode = new ConfigurationNode(API_AUTHORITYCONNECTIONNODE);
-        formatAuthorityConnection(connectionNode,connection);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-      else
-      {
-        createErrorNode(output,"Authority connection '"+connectionName+"' does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Read mapping connection */
-  protected static int apiReadMappingConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IMappingConnectionManager connectionManager = MappingConnectionManagerFactory.make(tc);
-      IMappingConnection connection = connectionManager.load(connectionName);
-      if (connection != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode connectionNode = new ConfigurationNode(API_MAPPINGCONNECTIONNODE);
-        formatMappingConnection(connectionNode,connection);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-      else
-      {
-        createErrorNode(output,"Mapping connection '"+connectionName+"' does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get repository connections */
-  protected static int apiReadRepositoryConnections(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection[] connections = connManager.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        ConfigurationNode connectionNode = new ConfigurationNode(API_REPOSITORYCONNECTIONNODE);
-        formatRepositoryConnection(connectionNode,connections[i++]);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read repository connection */
-  protected static int apiReadRepositoryConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      IRepositoryConnection connection = connectionManager.load(connectionName);
-      if (connection != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode connectionNode = new ConfigurationNode(API_REPOSITORYCONNECTIONNODE);
-        formatRepositoryConnection(connectionNode,connection);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-      else
-      {
-        createErrorNode(output,"Repository connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** Get notification connections */
-  protected static int apiReadNotificationConnections(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      INotificationConnectionManager connManager = NotificationConnectionManagerFactory.make(tc);
-      INotificationConnection[] connections = connManager.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        ConfigurationNode connectionNode = new ConfigurationNode(API_NOTIFICATIONCONNECTIONNODE);
-        formatNotificationConnection(connectionNode,connections[i++]);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Read notification connection */
-  protected static int apiReadNotificationConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      INotificationConnectionManager connectionManager = NotificationConnectionManagerFactory.make(tc);
-      INotificationConnection connection = connectionManager.load(connectionName);
-      if (connection != null)
-      {
-        // Fill the return object with job information
-        ConfigurationNode connectionNode = new ConfigurationNode(API_NOTIFICATIONCONNECTIONNODE);
-        formatNotificationConnection(connectionNode,connection);
-        output.addChild(output.getChildCount(),connectionNode);
-      }
-      else
-      {
-        createErrorNode(output,"Notification connection '"+connectionName+"' does not exist");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** List output connectors */
-  protected static int apiReadOutputConnectors(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered output connectors
-    try
-    {
-      IOutputConnectorManager manager = OutputConnectorManagerFactory.make(tc);
-      IResultSet resultSet = manager.getConnectors();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_OUTPUTCONNECTORNODE);
-        String description = (String)row.getValue("description");
-        String className = (String)row.getValue("classname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(CONNECTORNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(CONNECTORNODE_CLASSNAME);
-        node.setValue(className);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** List transformation connectors */
-  protected static int apiReadTransformationConnectors(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered transformation connectors
-    try
-    {
-      ITransformationConnectorManager manager = TransformationConnectorManagerFactory.make(tc);
-      IResultSet resultSet = manager.getConnectors();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_TRANSFORMATIONCONNECTORNODE);
-        String description = (String)row.getValue("description");
-        String className = (String)row.getValue("classname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(CONNECTORNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(CONNECTORNODE_CLASSNAME);
-        node.setValue(className);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** List authority connectors */
-  protected static int apiReadAuthorityConnectors(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered authority connectors
-    try
-    {
-      IAuthorityConnectorManager manager = AuthorityConnectorManagerFactory.make(tc);
-      IResultSet resultSet = manager.getConnectors();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_AUTHORITYCONNECTORNODE);
-        String description = (String)row.getValue("description");
-        String className = (String)row.getValue("classname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(CONNECTORNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(CONNECTORNODE_CLASSNAME);
-        node.setValue(className);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** List mapping connectors */
-  protected static int apiReadMappingConnectors(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered authority connectors
-    try
-    {
-      IMappingConnectorManager manager = MappingConnectorManagerFactory.make(tc);
-      IResultSet resultSet = manager.getConnectors();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_MAPPINGCONNECTORNODE);
-        String description = (String)row.getValue("description");
-        String className = (String)row.getValue("classname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(CONNECTORNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(CONNECTORNODE_CLASSNAME);
-        node.setValue(className);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** List authorization domains */
-  protected static int apiReadAuthorizationDomains(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered authorization domains
-    try
-    {
-      IAuthorizationDomainManager manager = AuthorizationDomainManagerFactory.make(tc);
-      IResultSet resultSet = manager.getDomains();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_AUTHORIZATIONDOMAINNODE);
-        String description = (String)row.getValue("description");
-        String domainName = (String)row.getValue("domainname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(AUTHORIZATIONDOMAINNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(AUTHORIZATIONDOMAINNODE_DOMAINNAME);
-        node.setValue(domainName);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-
-  }
-  
-  /** List repository connectors */
-  protected static int apiReadRepositoryConnectors(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered repository connectors
-    try
-    {
-      IConnectorManager manager = ConnectorManagerFactory.make(tc);
-      IResultSet resultSet = manager.getConnectors();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_REPOSITORYCONNECTORNODE);
-        String description = (String)row.getValue("description");
-        String className = (String)row.getValue("classname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(CONNECTORNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(CONNECTORNODE_CLASSNAME);
-        node.setValue(className);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-
-  /** List notification connectors */
-  protected static int apiReadNotificationConnectors(IThreadContext tc, Configuration output, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    // List registered notification connectors
-    try
-    {
-      IConnectorManager manager = ConnectorManagerFactory.make(tc);
-      IResultSet resultSet = manager.getConnectors();
-      int j = 0;
-      while (j < resultSet.getRowCount())
-      {
-        IResultRow row = resultSet.getRow(j++);
-        ConfigurationNode child = new ConfigurationNode(API_NOTIFICATIONCONNECTORNODE);
-        String description = (String)row.getValue("description");
-        String className = (String)row.getValue("classname");
-        ConfigurationNode node;
-        if (description != null)
-        {
-          node = new ConfigurationNode(CONNECTORNODE_DESCRIPTION);
-          node.setValue(description);
-          child.addChild(child.getChildCount(),node);
-        }
-        node = new ConfigurationNode(CONNECTORNODE_CLASSNAME);
-        node.setValue(className);
-        child.addChild(child.getChildCount(),node);
-
-        output.addChild(output.getChildCount(),child);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-      
-  protected final static Map<String,Integer> docState;
-  static
-  {
-    docState = new HashMap<String,Integer>();
-    docState.put("neverprocessed",new Integer(IJobManager.DOCSTATE_NEVERPROCESSED));
-    docState.put("previouslyprocessed",new Integer(IJobManager.DOCSTATE_PREVIOUSLYPROCESSED));
-    docState.put("outofscope",new Integer(IJobManager.DOCSTATE_OUTOFSCOPE));
-  }
-
-  protected final static Map<String,Integer> docStatus;
-  static
-  {
-    docStatus = new HashMap<String,Integer>();
-    docStatus.put("inactive",new Integer(IJobManager.DOCSTATUS_INACTIVE));
-    docStatus.put("processing",new Integer(IJobManager.DOCSTATUS_PROCESSING));
-    docStatus.put("expiring",new Integer(IJobManager.DOCSTATUS_EXPIRING));
-    docStatus.put("deleting",new Integer(IJobManager.DOCSTATUS_DELETING));
-    docStatus.put("readyforprocessing",new Integer(IJobManager.DOCSTATUS_READYFORPROCESSING));
-    docStatus.put("readyforexpiration",new Integer(IJobManager.DOCSTATUS_READYFOREXPIRATION));
-    docStatus.put("waitingforprocessing",new Integer(IJobManager.DOCSTATUS_WAITINGFORPROCESSING));
-    docStatus.put("waitingforexpiration",new Integer(IJobManager.DOCSTATUS_WAITINGFOREXPIRATION));
-    docStatus.put("waitingforever",new Integer(IJobManager.DOCSTATUS_WAITINGFOREVER));
-    docStatus.put("hopcountexceeded",new Integer(IJobManager.DOCSTATUS_HOPCOUNTEXCEEDED));
-  }
-
-  /** Queue reports */
-  protected static int apiReadRepositoryConnectionQueue(IThreadContext tc, Configuration output,
-    String connectionName, Map<String,List<String>> queryParameters, IAuthorizer authorizer) throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
-      return READRESULT_NOTALLOWED;
-
-    if (queryParameters == null)
-      queryParameters = new HashMap<String,List<String>>();
-
-    // Jobs (specified by id)
-    Long[] jobs;
-    List<String> jobList = queryParameters.get("job");
-    if (jobList == null)
-      jobs = new Long[0];
-    else
-    {
-      jobs = new Long[jobList.size()];
-      for (int i = 0; i < jobs.length; i++)
-      {
-        jobs[i] = new Long(jobList.get(i));
-      }
-    }
-
-    // Now time
-    long now;
-    List<String> nowList = queryParameters.get("now");
-    if (nowList == null || nowList.size() == 0)
-      now = System.currentTimeMillis();
-    else if (nowList.size() > 1)
-      throw new ManifoldCFException("Multiple values for now parameter");
-    else
-      now = new Long(nowList.get(0)).longValue();
-      
-    // Identifier match
-    RegExpCriteria idMatch;
-    List<String> idMatchList = queryParameters.get("idmatch");
-    List<String> idMatchInsensitiveList = queryParameters.get("idmatch_insensitive");
-    if (idMatchList != null && idMatchInsensitiveList != null)
-      throw new ManifoldCFException("Either use idmatch or idmatch_insensitive, not both.");
-    boolean isInsensitiveIdMatch;
-    if (idMatchInsensitiveList != null)
-    {
-      idMatchList = idMatchInsensitiveList;
-      isInsensitiveIdMatch = true;
-    }
-    else
-      isInsensitiveIdMatch = false;
-      
-    if (idMatchList == null || idMatchList.size() == 0)
-      idMatch = null;
-    else if (idMatchList.size() > 1)
-      throw new ManifoldCFException("Multiple id match regexps specified.");
-    else
-      idMatch = new RegExpCriteria(idMatchList.get(0),isInsensitiveIdMatch);
-
-    List<String> stateMatchList = queryParameters.get("statematch");
-    int[] matchStates;
-    if (stateMatchList == null)
-      matchStates = new int[0];
-    else
-    {
-      matchStates = new int[stateMatchList.size()];
-      for (int i = 0; i < matchStates.length; i++)
-      {
-        Integer value = docState.get(stateMatchList.get(i));
-        if (value == null)
-          throw new ManifoldCFException("Unrecognized state value: '"+stateMatchList.get(i)+"'");
-        matchStates[i] = value.intValue();
-      }
-    }
-      
-    List<String> statusMatchList = queryParameters.get("statusmatch");
-    int[] matchStatuses;
-    if (statusMatchList == null)
-      matchStatuses = new int[0];
-    else
-    {
-      matchStatuses = new int[statusMatchList.size()];
-      for (int i = 0; i < matchStatuses.length; i++)
-      {
-        Integer value = docStatus.get(statusMatchList.get(i));
-        if (value == null)
-          throw new ManifoldCFException("Unrecognized status value: '"+statusMatchList.get(i)+"'");
-        matchStatuses[i] = value.intValue();
-      }
-    }
-      
-    StatusFilterCriteria filterCriteria = new StatusFilterCriteria(jobs,now,idMatch,matchStates,matchStatuses);
-      
-    // Look for sort order parameters...
-    SortOrder sortOrder = new SortOrder();
-    List<String> sortColumnsList = queryParameters.get("sortcolumn");
-    List<String> sortColumnsDirList = queryParameters.get("sortcolumn_direction");
-    if (sortColumnsList != null || sortColumnsDirList != null)
-    {
-      if (sortColumnsList == null || sortColumnsDirList == null || sortColumnsList.size() != sortColumnsDirList.size())
-        throw new ManifoldCFException("sortcolumn and sortcolumn_direction must have the same cardinality.");
-      for (int i = 0; i < sortColumnsList.size(); i++)
-      {
-        String column = sortColumnsList.get(i);
-        String dir = sortColumnsDirList.get(i);
-        int dirInt;
-        if (dir.equals("ascending"))
-          dirInt = SortOrder.SORT_ASCENDING;
-        else if (dir.equals("descending"))
-          dirInt = SortOrder.SORT_DESCENDING;
-        else
-          throw new ManifoldCFException("sortcolumn_direction must be 'ascending' or 'descending'.");
-        sortOrder.addCriteria(column,dirInt);
-      }
-    }
-      
-    // Start row and row count
-    int startRow;
-    List<String> startRowList = queryParameters.get("startrow");
-    if (startRowList == null || startRowList.size() == 0)
-      startRow = 0;
-    else if (startRowList.size() > 1)
-      throw new ManifoldCFException("Multiple start rows specified.");
-    else
-      startRow = new Integer(startRowList.get(0)).intValue();
-      
-    int rowCount;
-    List<String> rowCountList = queryParameters.get("rowcount");
-    if (rowCountList == null || rowCountList.size() == 0)
-      rowCount = 20;
-    else if (rowCountList.size() > 1)
-      throw new ManifoldCFException("Multiple row counts specified.");
-    else
-      rowCount = new Integer(rowCountList.get(0)).intValue();
-
-    List<String> reportTypeList = queryParameters.get("report");
-    String reportType;
-    if (reportTypeList == null || reportTypeList.size() == 0)
-      reportType = "document";
-    else if (reportTypeList.size() > 1)
-      throw new ManifoldCFException("Multiple report types specified.");
-    else
-      reportType = reportTypeList.get(0);
-
-    IJobManager jobManager = JobManagerFactory.make(tc);
-      
-    IResultSet result;
-    String[] resultColumns;
-      
-    if (reportType.equals("document"))
-    {
-      try
-      {
-        result = jobManager.genDocumentStatus(connectionName,filterCriteria,sortOrder,startRow,rowCount);
-      }
-      catch (ManifoldCFException e)
-      {
-        createErrorNode(output,e);
-        return READRESULT_FOUND;
-      }
-      resultColumns = new String[]{"identifier","job","state","status","scheduled","action","retrycount","retrylimit"};
-    }
-    else if (reportType.equals("status"))
-    {
-      BucketDescription idBucket;
-      List<String> idBucketList = queryParameters.get("idbucket");
-      List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
-      if (idBucketList != null && idBucketInsensitiveList != null)
-        throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
-      boolean isInsensitiveIdBucket;
-      if (idBucketInsensitiveList != null)
-      {
-        idBucketList = idBucketInsensitiveList;
-        isInsensitiveIdBucket = true;
-      }
-      else
-        isInsensitiveIdBucket = false;
-      if (idBucketList == null || idBucketList.size() == 0)
-        idBucket = new BucketDescription("()",false);
-      else if (idBucketList.size() > 1)
-        throw new ManifoldCFException("Multiple idbucket regexps specified.");
-      else
-        idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
-        
-      try
-      {
-        result = jobManager.genQueueStatus(connectionName,filterCriteria,sortOrder,idBucket,startRow,rowCount);
-      }
-      catch (ManifoldCFException e)
-      {
-        createErrorNode(output,e);
-        return READRESULT_FOUND;
-      }
-      resultColumns = new String[]{"idbucket","inactive","processing","expiring","deleting",
-        "processready","expireready","processwaiting","expirewaiting","waitingforever","hopcountexceeded"};
-    }
-    else
-      throw new ManifoldCFException("Unknown report type '"+reportType+"'.");
-
-    createResultsetNode(output,result,resultColumns);
-    return READRESULT_FOUND;
-  }
-  
-  /** Get jobs for connection */
-  protected static int apiReadRepositoryConnectionJobs(IThreadContext tc, Configuration output,
-    String connectionName, IAuthorizer authorizer) throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IJobDescription[] jobs = jobManager.findJobsForConnection(connectionName);
-      if (jobs == null)
-      {
-        createErrorNode(output,"Unknown connection '"+connectionName+"'");
-        return READRESULT_NOTFOUND;
-      }
-      int i = 0;
-      while (i < jobs.length)
-      {
-        ConfigurationNode jobNode = new ConfigurationNode(API_JOBNODE);
-        formatJobDescription(jobNode,jobs[i++]);
-        output.addChild(output.getChildCount(),jobNode);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** History reports */
-  protected static int apiReadRepositoryConnectionHistory(IThreadContext tc, Configuration output,
-    String connectionName, Map<String,List<String>> queryParameters, IAuthorizer authorizer) throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
-      return READRESULT_NOTALLOWED;
-
-    if (queryParameters == null)
-      queryParameters = new HashMap<String,List<String>>();
-      
-    // Look for filter criteria parameters...
-      
-    // Start time
-    List<String> startTimeList = queryParameters.get("starttime");
-    Long startTime;
-    if (startTimeList == null || startTimeList.size() == 0)
-      startTime = null;
-    else if (startTimeList.size() > 1)
-      throw new ManifoldCFException("Multiple start times specified.");
-    else
-      startTime = new Long(startTimeList.get(0));
-
-    // End time
-    List<String> endTimeList = queryParameters.get("endtime");
-    Long endTime;
-    if (endTimeList == null || endTimeList.size() == 0)
-      endTime = null;
-    else if (endTimeList.size() > 1)
-      throw new ManifoldCFException("Multiple end times specified.");
-    else
-      endTime = new Long(endTimeList.get(0));
-      
-    // Activities
-    List<String> activityList = queryParameters.get("activity");
-    String[] activities;
-    if (activityList == null)
-      activities = new String[0];
-    else
-      activities = activityList.toArray(new String[0]);
-      
-    // Entity match
-    RegExpCriteria entityMatch;
-    List<String> entityMatchList = queryParameters.get("entitymatch");
-    List<String> entityMatchInsensitiveList = queryParameters.get("entitymatch_insensitive");
-    if (entityMatchList != null && entityMatchInsensitiveList != null)
-      throw new ManifoldCFException("Either use entitymatch or entitymatch_insensitive, not both.");
-    boolean isInsensitiveEntityMatch;
-    if (entityMatchInsensitiveList != null)
-    {
-      entityMatchList = entityMatchInsensitiveList;
-      isInsensitiveEntityMatch = true;
-    }
-    else
-      isInsensitiveEntityMatch = false;
-      
-    if (entityMatchList == null || entityMatchList.size() == 0)
-      entityMatch = null;
-    else if (entityMatchList.size() > 1)
-      throw new ManifoldCFException("Multiple entity match regexps specified.");
-    else
-      entityMatch = new RegExpCriteria(entityMatchList.get(0),isInsensitiveEntityMatch);
-      
-    // Result code match
-    RegExpCriteria resultCodeMatch;
-    List<String> resultCodeMatchList = queryParameters.get("resultcodematch");
-    List<String> resultCodeMatchInsensitiveList = queryParameters.get("resultcodematch_insensitive");
-    if (resultCodeMatchList != null && resultCodeMatchInsensitiveList != null)
-      throw new ManifoldCFException("Either use resultcodematch or resultcodematch_insensitive, not both.");
-    boolean isInsensitiveResultCodeMatch;
-    if (entityMatchInsensitiveList != null)
-    {
-      resultCodeMatchList = resultCodeMatchInsensitiveList;
-      isInsensitiveResultCodeMatch = true;
-    }
-    else
-      isInsensitiveResultCodeMatch = false;
-      
-    if (resultCodeMatchList == null || resultCodeMatchList.size() == 0)
-      resultCodeMatch = null;
-    else if (resultCodeMatchList.size() > 1)
-      throw new ManifoldCFException("Multiple resultcode match regexps specified.");
-    else
-      resultCodeMatch = new RegExpCriteria(resultCodeMatchList.get(0),isInsensitiveResultCodeMatch);
-      
-    // Filter criteria
-    FilterCriteria filterCriteria = new FilterCriteria(activities,startTime,endTime,entityMatch,resultCodeMatch);
-      
-    // Look for sort order parameters...
-    SortOrder sortOrder = new SortOrder();
-    List<String> sortColumnsList = queryParameters.get("sortcolumn");
-    List<String> sortColumnsDirList = queryParameters.get("sortcolumn_direction");
-    if (sortColumnsList != null || sortColumnsDirList != null)
-    {
-      if (sortColumnsList == null || sortColumnsDirList == null || sortColumnsList.size() != sortColumnsDirList.size())
-        throw new ManifoldCFException("sortcolumn and sortcolumn_direction must have the same cardinality.");
-      for (int i = 0; i < sortColumnsList.size(); i++)
-      {
-        String column = sortColumnsList.get(i);
-        String dir = sortColumnsDirList.get(i);
-        int dirInt;
-        if (dir.equals("ascending"))
-          dirInt = SortOrder.SORT_ASCENDING;
-        else if (dir.equals("descending"))
-          dirInt = SortOrder.SORT_DESCENDING;
-        else
-          throw new ManifoldCFException("sortcolumn_direction must be 'ascending' or 'descending'.");
-        sortOrder.addCriteria(column,dirInt);
-      }
-    }
-      
-    // Start row and row count
-    int startRow;
-    List<String> startRowList = queryParameters.get("startrow");
-    if (startRowList == null || startRowList.size() == 0)
-      startRow = 0;
-    else if (startRowList.size() > 1)
-      throw new ManifoldCFException("Multiple start rows specified.");
-    else
-      startRow = new Integer(startRowList.get(0)).intValue();
-      
-    int rowCount;
-    List<String> rowCountList = queryParameters.get("rowcount");
-    if (rowCountList == null || rowCountList.size() == 0)
-      rowCount = 20;
-    else if (rowCountList.size() > 1)
-      throw new ManifoldCFException("Multiple row counts specified.");
-    else
-      rowCount = new Integer(rowCountList.get(0)).intValue();
-
-    List<String> reportTypeList = queryParameters.get("report");
-    String reportType;
-    if (reportTypeList == null || reportTypeList.size() == 0)
-      reportType = "simple";
-    else if (reportTypeList.size() > 1)
-      throw new ManifoldCFException("Multiple report types specified.");
-    else
-      reportType = reportTypeList.get(0);
-
-    IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      
-    IResultSet result;
-    String[] resultColumns;
-      
-    if (reportType.equals("simple"))
-    {
-      try
-      {
-        result = connectionManager.genHistorySimple(connectionName,filterCriteria,sortOrder,startRow,rowCount);
-      }
-      catch (ManifoldCFException e)
-      {
-        createErrorNode(output,e);
-        return READRESULT_FOUND;
-      }
-      resultColumns = new String[]{"starttime","resultcode","resultdesc","identifier","activity","bytes","elapsedtime"};
-    }
-    else if (reportType.equals("maxactivity"))
-    {
-      long maxInterval = connectionManager.getMaxRows();
-      long actualRows = connectionManager.countHistoryRows(connectionName,filterCriteria);
-      if (actualRows > maxInterval)
-        throw new ManifoldCFException("Too many history rows specified for maxactivity report - actual is "+actualRows+", max is "+maxInterval+".");
-        
-      BucketDescription idBucket;
-      List<String> idBucketList = queryParameters.get("idbucket");
-      List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
-      if (idBucketList != null && idBucketInsensitiveList != null)
-        throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
-      boolean isInsensitiveIdBucket;
-      if (idBucketInsensitiveList != null)
-      {
-        idBucketList = idBucketInsensitiveList;
-        isInsensitiveIdBucket = true;
-      }
-      else
-        isInsensitiveIdBucket = false;
-      if (idBucketList == null || idBucketList.size() == 0)
-        idBucket = new BucketDescription("()",false);
-      else if (idBucketList.size() > 1)
-        throw new ManifoldCFException("Multiple idbucket regexps specified.");
-      else
-        idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
-
-      long interval;
-      List<String> intervalList = queryParameters.get("interval");
-      if (intervalList == null || intervalList.size() == 0)
-        interval = 300000L;
-      else if (intervalList.size() > 1)
-        throw new ManifoldCFException("Multiple intervals specified.");
-      else
-        interval = new Long(intervalList.get(0)).longValue();
-        
-      try
-      {
-        result = connectionManager.genHistoryActivityCount(connectionName,filterCriteria,sortOrder,idBucket,interval,startRow,rowCount);
-      }
-      catch (ManifoldCFException e)
-      {
-        createErrorNode(output,e);
-        return READRESULT_FOUND;
-      }
-      resultColumns = new String[]{"starttime","endtime","activitycount","idbucket"};
-    }
-    else if (reportType.equals("maxbandwidth"))
-    {
-      long maxInterval = connectionManager.getMaxRows();
-      long actualRows = connectionManager.countHistoryRows(connectionName,filterCriteria);
-      if (actualRows > maxInterval)
-        throw new ManifoldCFException("Too many history rows specified for maxbandwidth report - actual is "+actualRows+", max is "+maxInterval+".");
-        
-      BucketDescription idBucket;
-      List<String> idBucketList = queryParameters.get("idbucket");
-      List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
-      if (idBucketList != null && idBucketInsensitiveList != null)
-        throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
-      boolean isInsensitiveIdBucket;
-      if (idBucketInsensitiveList != null)
-      {
-        idBucketList = idBucketInsensitiveList;
-        isInsensitiveIdBucket = true;
-      }
-      else
-        isInsensitiveIdBucket = false;
-      if (idBucketList == null || idBucketList.size() == 0)
-        idBucket = new BucketDescription("()",false);
-      else if (idBucketList.size() > 1)
-        throw new ManifoldCFException("Multiple idbucket regexps specified.");
-      else
-        idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
-        
-      long interval;
-      List<String> intervalList = queryParameters.get("interval");
-      if (intervalList == null || intervalList.size() == 0)
-        interval = 300000L;
-      else if (intervalList.size() > 1)
-        throw new ManifoldCFException("Multiple intervals specified.");
-      else
-        interval = new Long(intervalList.get(0)).longValue();
-
-      try
-      {
-        result = connectionManager.genHistoryByteCount(connectionName,filterCriteria,sortOrder,idBucket,interval,startRow,rowCount);
-      }
-      catch (ManifoldCFException e)
-      {
-        createErrorNode(output,e);
-        return READRESULT_FOUND;
-      }
-      resultColumns = new String[]{"starttime","endtime","bytecount","idbucket"};
-    }
-    else if (reportType.equals("result"))
-    {
-      BucketDescription idBucket;
-      List<String> idBucketList = queryParameters.get("idbucket");
-      List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
-      if (idBucketList != null && idBucketInsensitiveList != null)
-        throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
-      boolean isInsensitiveIdBucket;
-      if (idBucketInsensitiveList != null)
-      {
-        idBucketList = idBucketInsensitiveList;
-        isInsensitiveIdBucket = true;
-      }
-      else
-        isInsensitiveIdBucket = false;
-      if (idBucketList == null || idBucketList.size() == 0)
-        idBucket = new BucketDescription("()",false);
-      else if (idBucketList.size() > 1)
-        throw new ManifoldCFException("Multiple idbucket regexps specified.");
-      else
-        idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
-
-      BucketDescription resultCodeBucket;
-      List<String> resultCodeBucketList = queryParameters.get("resultcodebucket");
-      List<String> resultCodeBucketInsensitiveList = queryParameters.get("resultcodebucket_insensitive");
-      if (resultCodeBucketList != null && resultCodeBucketInsensitiveList != null)
-        throw new ManifoldCFException("Either use resultcodebucket or resultcodebucket_insensitive, not both.");
-      boolean isInsensitiveResultCodeBucket;
-      if (resultCodeBucketInsensitiveList != null)
-      {
-        resultCodeBucketList = resultCodeBucketInsensitiveList;
-        isInsensitiveResultCodeBucket = true;
-      }
-      else
-        isInsensitiveResultCodeBucket = false;
-      if (resultCodeBucketList == null || resultCodeBucketList.size() == 0)
-        resultCodeBucket = new BucketDescription("(.*)",false);
-      else if (resultCodeBucketList.size() > 1)
-        throw new ManifoldCFException("Multiple resultcodebucket regexps specified.");
-      else
-        resultCodeBucket = new BucketDescription(resultCodeBucketList.get(0),isInsensitiveResultCodeBucket);
-
-      try
-      {
-        result = connectionManager.genHistoryResultCodes(connectionName,filterCriteria,sortOrder,resultCodeBucket,idBucket,startRow,rowCount);
-      }
-      catch (ManifoldCFException e)
-      {
-        createErrorNode(output,e);
-        return READRESULT_FOUND;
-      }
-      resultColumns = new String[]{"idbucket","resultcodebucket","eventcount"};
-    }
-    else
-      throw new ManifoldCFException("Unknown report type '"+reportType+"'.");
-
-    createResultsetNode(output,result,resultColumns);
-    return READRESULT_FOUND;
-  }
-  
-  /** Add a resultset node to the output. */
-  protected static void createResultsetNode(Configuration output, IResultSet result, String[] resultColumns)
-    throws ManifoldCFException
-  {
-    // Go through result set and add results to output
-    for (int i = 0; i < result.getRowCount(); i++)
-    {
-      IResultRow row = result.getRow(i);
-      ConfigurationNode rowValue = new ConfigurationNode(API_ROWNODE);
-      for (String columnName : resultColumns)
-      {
-        ConfigurationNode columnValue = new ConfigurationNode(API_COLUMNNODE);
-        Object value = row.getValue(columnName);
-        String valueToUse;
-        if (value == null)
-          valueToUse = "";
-        else
-          valueToUse = value.toString();
-        ConfigurationNode nameNode = new ConfigurationNode(API_NAMENODE);
-        nameNode.setValue(columnName);
-        columnValue.addChild(columnValue.getChildCount(),nameNode);
-        ConfigurationNode valueNode = new ConfigurationNode(API_VALUENODE);
-        valueNode.setValue(valueToUse);
-        columnValue.addChild(columnValue.getChildCount(),valueNode);
-        rowValue.addChild(rowValue.getChildCount(),columnValue);
-      }
-      output.addChild(output.getChildCount(),rowValue);
-    }
-  }
-  
-  /** Read the activity list for a given connection name. */
-  protected static int apiReadRepositoryConnectionActivities(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      String[] activities = getActivitiesList(tc,connectionName);
-      if (activities == null)
-      {
-        createErrorNode(output,"Connection '"+connectionName+"' does not exist.");
-        return READRESULT_NOTFOUND;
-      }
-      for (String activity : activities)
-      {
-        ConfigurationNode node = new ConfigurationNode(API_ACTIVITYNODE);
-        node.setValue(activity);
-        output.addChild(output.getChildCount(),node);
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return READRESULT_FOUND;
-  }
-  
-  /** Execute specified read command.
-  *@param tc is the thread context.
-  *@param output is the output object, to be filled in.
-  *@param path is the object path.
-  *@return read status - either found, not found, or bad args
-  */
-  public static int executeReadCommand(IThreadContext tc, Configuration output, String path,
-    Map<String,List<String>> queryParameters, IAuthorizer authorizer) throws ManifoldCFException
-  {
-    if (path.equals("jobs"))
-    {
-      return apiReadJobs(tc,output,authorizer);
-    }
-    else if (path.startsWith("jobs/"))
-    {
-      Long jobID = new Long(path.substring("jobs/".length()));
-      return apiReadJob(tc,output,jobID,authorizer);
-    }
-    else if (path.startsWith("repositoryconnectionactivities/"))
-    {
-      int firstSeparator = "repositoryconnectionactivities/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiReadRepositoryConnectionActivities(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("repositoryconnectionhistory/"))
-    {
-      int firstSeparator = "repositoryconnectionhistory/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiReadRepositoryConnectionHistory(tc,output,connectionName,queryParameters,authorizer);
-    }
-    else if (path.startsWith("repositoryconnectionqueue/"))
-    {
-      int firstSeparator = "repositoryconnectionqueue/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiReadRepositoryConnectionQueue(tc,output,connectionName,queryParameters,authorizer);
-    }
-    else if (path.startsWith("repositoryconnectionjobs/"))
-    {
-      int firstSeparator = "repositoryconnectionjobs/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiReadRepositoryConnectionJobs(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("status/"))
-    {
-      int firstSeparator = "status/".length();
-      int secondSeparator = path.indexOf("/",firstSeparator);
-      if (secondSeparator == -1)
-      {
-        createErrorNode(output,"Need connection name.");
-        return READRESULT_NOTFOUND;
-      }
-      
-      String connectionType = path.substring(firstSeparator,secondSeparator);
-      String connectionName = decodeAPIPathElement(path.substring(secondSeparator+1));
-      
-      if (connectionType.equals("outputconnections"))
-      {
-        return apiReadOutputConnectionStatus(tc,output,connectionName,authorizer);
-      }
-      else if (connectionType.equals("transformationconnections"))
-      {
-        return apiReadTransformationConnectionStatus(tc,output,connectionName,authorizer);
-      }
-      else if (connectionType.equals("mappingconnections"))
-      {
-        return apiReadMappingConnectionStatus(tc,output,connectionName,authorizer);
-      }
-      else if (connectionType.equals("authorityconnections"))
-      {
-        return apiReadAuthorityConnectionStatus(tc,output,connectionName,authorizer);
-      }
-      else if (connectionType.equals("repositoryconnections"))
-      {
-        return apiReadRepositoryConnectionStatus(tc,output,connectionName,authorizer);
-      }
-      else if (connectionType.equals("notificationconnections"))
-      {
-        return apiReadNotificationConnectionStatus(tc,output,connectionName,authorizer);
-      }
-      else
-      {
-        createErrorNode(output,"Unknown connection type '"+connectionType+"'.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    else if (path.startsWith("info/"))
-    {
-      int firstSeparator = "info/".length();
-      int secondSeparator = path.indexOf("/",firstSeparator);
-      if (secondSeparator == -1)
-      {
-        createErrorNode(output,"Need connection type and connection name.");
-        return READRESULT_NOTFOUND;
-      }
-
-      int thirdSeparator = path.indexOf("/",secondSeparator+1);
-      if (thirdSeparator == -1)
-      {
-        createErrorNode(output,"Need connection name.");
-        return READRESULT_NOTFOUND;
-      }
-
-      String connectionType = path.substring(firstSeparator,secondSeparator);
-      String connectionName = decodeAPIPathElement(path.substring(secondSeparator+1,thirdSeparator));
-      String command = path.substring(thirdSeparator+1);
-      
-      if (connectionType.equals("outputconnections"))
-      {
-        return apiReadOutputConnectionInfo(tc,output,connectionName,command,authorizer);
-      }
-      else if (connectionType.equals("transformationconnections"))
-      {
-        return apiReadTransformationConnectionInfo(tc,output,connectionName,command,authorizer);
-      }
-      else if (connectionType.equals("repositoryconnections"))
-      {
-        return apiReadRepositoryConnectionInfo(tc,output,connectionName,command,authorizer);
-      }
-      else if (connectionType.equals("notificationconnections"))
-      {
-        return apiReadNotificationConnectionInfo(tc,output,connectionName,command,authorizer);
-      }
-      else
-      {
-        createErrorNode(output,"Unknown connection type '"+connectionType+"'.");
-        return READRESULT_NOTFOUND;
-      }
-    }
-    else if (path.equals("jobstatuses"))
-    {
-      return apiReadJobStatuses(tc,output,queryParameters,authorizer);
-    }
-    else if (path.startsWith("jobstatuses/"))
-    {
-      Long jobID = new Long(path.substring("jobstatuses/".length()));
-      return apiReadJobStatus(tc,output,jobID,queryParameters,authorizer);
-    }
-    else if (path.equals("jobstatusesnocounts"))
-    {
-      return apiReadJobStatusesNoCounts(tc,output,authorizer);
-    }
-    else if (path.startsWith("jobstatusesnocounts/"))
-    {
-      Long jobID = new Long(path.substring("jobstatusesnocounts/".length()));
-      return apiReadJobStatusNoCounts(tc,output,jobID,authorizer);
-    }
-    else if (path.equals("authoritygroups"))
-    {
-      return apiReadAuthorityGroups(tc,output,authorizer);
-    }
-    else if (path.startsWith("authoritygroups/"))
-    {
-      String groupName = decodeAPIPathElement(path.substring("authoritygroups/".length()));
-      return apiReadAuthorityGroup(tc,output,groupName,authorizer);
-    }
-    else if (path.equals("outputconnections"))
-    {
-      return apiReadOutputConnections(tc,output,authorizer);
-    }
-    else if (path.startsWith("outputconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("outputconnections/".length()));
-      return apiReadOutputConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.equals("transformationconnections"))
-    {
-      return apiReadTransformationConnections(tc,output,authorizer);
-    }
-    else if (path.startsWith("transformationconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("transformationconnections/".length()));
-      return apiReadTransformationConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.equals("mappingconnections"))
-    {
-      return apiReadMappingConnections(tc,output,authorizer);
-    }
-    else if (path.startsWith("mappingconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("mappingconnections/".length()));
-      return apiReadMappingConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.equals("authorityconnections"))
-    {
-      return apiReadAuthorityConnections(tc,output,authorizer);
-    }
-    else if (path.startsWith("authorityconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("authorityconnections/".length()));
-      return apiReadAuthorityConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.equals("repositoryconnections"))
-    {
-      return apiReadRepositoryConnections(tc,output,authorizer);
-    }
-    else if (path.startsWith("repositoryconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("repositoryconnections/".length()));
-      return apiReadRepositoryConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.equals("notificationconnections"))
-    {
-      return apiReadNotificationConnections(tc,output,authorizer);
-    }
-    else if (path.startsWith("notificationconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("notificationconnections/".length()));
-      return apiReadNotificationConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.equals("outputconnectors"))
-    {
-      return apiReadOutputConnectors(tc,output,authorizer);
-    }
-    else if (path.equals("transformationconnectors"))
-    {
-      return apiReadTransformationConnectors(tc,output,authorizer);
-    }
-    else if (path.equals("mappingconnectors"))
-    {
-      return apiReadMappingConnectors(tc,output,authorizer);
-    }
-    else if (path.equals("authorityconnectors"))
-    {
-      return apiReadAuthorityConnectors(tc,output,authorizer);
-    }
-    else if (path.equals("repositoryconnectors"))
-    {
-      return apiReadRepositoryConnectors(tc,output,authorizer);
-    }
-    else if (path.equals("notificationconnectors"))
-    {
-      return apiReadNotificationConnectors(tc,output,authorizer);
-    }
-    else if (path.equals("authorizationdomains"))
-    {
-      return apiReadAuthorizationDomains(tc,output,authorizer);
-    }
-    else
-    {
-      createErrorNode(output,"Unrecognized resource.");
-      return READRESULT_NOTFOUND;
-    }
-  }
-  
-  // Post result codes
-  public static final int POSTRESULT_NOTFOUND = 0;
-  public static final int POSTRESULT_FOUND = 1;
-  public static final int POSTRESULT_CREATED = 2;
-  public static final int POSTRESULT_NOTALLOWED = 3;
-  
-  /** Post job.
-  */
-  protected static int apiPostJob(IThreadContext tc, Configuration output, Configuration input, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode jobNode = findConfigurationNode(input,API_JOBNODE);
-    if (jobNode == null)
-      throw new ManifoldCFException("Input must have '"+API_JOBNODE+"' field");
-
-    // Turn the configuration node into a JobDescription
-    org.apache.manifoldcf.crawler.jobs.JobDescription job = new org.apache.manifoldcf.crawler.jobs.JobDescription();
-    processJobDescription(job,jobNode);
-      
-    if (job.getID() != null)
-      throw new ManifoldCFException("Input job cannot supply an ID field for create");
-      
-    try
-    {
-      Long jobID = new Long(IDFactory.make(tc));
-      job.setID(jobID);
-      job.setIsNew(true);
-        
-      // Save the job.
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.save(job);
-
-      ConfigurationNode idNode = new ConfigurationNode(API_JOBIDNODE);
-      idNode.setValue(jobID.toString());
-      output.addChild(output.getChildCount(),idNode);
-        
-      return POSTRESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return POSTRESULT_FOUND;
-  }
-  
-  /** Execute specified post command.
-  *@param tc is the thread context.
-  *@param output is the output object, to be filled in.
-  *@param path is the object path.
-  *@param input is the input object.
-  *@return write result - either "not found", "found", or "created".
-  */
-  public static int executePostCommand(IThreadContext tc, Configuration output, String path, Configuration input, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (path.equals("jobs"))
-    {
-      return apiPostJob(tc,output,input,authorizer);
-    }
-    else
-    {
-      createErrorNode(output,"Unrecognized resource.");
-      return POSTRESULT_NOTFOUND;
-    }
-  }
-
-  // Write result codes
-  public static final int WRITERESULT_NOTFOUND = 0;
-  public static final int WRITERESULT_FOUND = 1;
-  public static final int WRITERESULT_CREATED = 2;
-  public static final int WRITERESULT_NOTALLOWED = 3;
-  
-  /** Start a job.
-  */
-  protected static int apiWriteStartJob(IThreadContext tc, Configuration output, Long jobID, boolean requestMinimum, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_RUN_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.manualStart(jobID,requestMinimum);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-  
-  /** Abort a job.
-  */
-  protected static int apiWriteAbortJob(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_RUN_JOBS))
-      return READRESULT_NOTALLOWED;
-    
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.manualAbort(jobID);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-  
-  /** Restart a job.
-  */
-  protected static int apiWriteRestartJob(IThreadContext tc, Configuration output, Long jobID, boolean requestMinimum, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_RUN_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.manualAbortRestart(jobID,requestMinimum);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Pause a job.
-  */
-  protected static int apiWritePauseJob(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_RUN_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.pauseJob(jobID);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Resume a job.
-  */
-  protected static int apiWriteResumeJob(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_RUN_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.restartJob(jobID);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Reset incremental seeding for a job.
-  */
-  protected static int apiWriteReseedJob(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_RUN_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.clearJobSeedingState(jobID);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-  
-  /** Write job.
-  */
-  protected static int apiWriteJob(IThreadContext tc, Configuration output, Configuration input, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode jobNode = findConfigurationNode(input,API_JOBNODE);
-    if (jobNode == null)
-      throw new ManifoldCFException("Input must have '"+API_JOBNODE+"' field");
-
-    // Turn the configuration node into a JobDescription
-    org.apache.manifoldcf.crawler.jobs.JobDescription job = new org.apache.manifoldcf.crawler.jobs.JobDescription();
-    processJobDescription(job,jobNode);
-      
-    try
-    {
-      if (job.getID() == null)
-      {
-        job.setID(jobID);
-      }
-      else
-      {
-        if (!job.getID().equals(jobID))
-          throw new ManifoldCFException("Job identifier must agree within object and within path");
-      }
-        
-      job.setIsNew(false);
-        
-      // Save the job.
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.save(job);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Write authority group.
-  */
-  protected static int apiWriteAuthorityGroup(IThreadContext tc, Configuration output, Configuration input, String groupName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode groupNode = findConfigurationNode(input,API_AUTHORITYGROUPNODE);
-    if (groupNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_AUTHORITYGROUPNODE+"' field");
-      
-    // Turn the configuration node into an AuthorityGroup
-    org.apache.manifoldcf.authorities.authgroups.AuthorityGroup authorityGroup = new org.apache.manifoldcf.authorities.authgroups.AuthorityGroup();
-    processAuthorityGroup(authorityGroup,groupNode);
-      
-    if (authorityGroup.getName() == null)
-      authorityGroup.setName(groupName);
-    else
-    {
-      if (!authorityGroup.getName().equals(groupName))
-        throw new ManifoldCFException("Authority group name in path and in object must agree");
-    }
-      
-    try
-    {
-      // Save the connection.
-      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
-      if (groupManager.save(authorityGroup))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Write output connection.
-  */
-  protected static int apiWriteOutputConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode connectionNode = findConfigurationNode(input,API_OUTPUTCONNECTIONNODE);
-    if (connectionNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_OUTPUTCONNECTIONNODE+"' field");
-      
-    // Turn the configuration node into an OutputConnection
-    org.apache.manifoldcf.agents.outputconnection.OutputConnection outputConnection = new org.apache.manifoldcf.agents.outputconnection.OutputConnection();
-    processOutputConnection(outputConnection,connectionNode);
-      
-    if (outputConnection.getName() == null)
-      outputConnection.setName(connectionName);
-    else
-    {
-      if (!outputConnection.getName().equals(connectionName))
-        throw new ManifoldCFException("Connection name in path and in object must agree");
-    }
-      
-    try
-    {
-      // Save the connection.
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(tc);
-      if (connectionManager.save(outputConnection))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Write transformation connection.
-  */
-  protected static int apiWriteTransformationConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-    
-    ConfigurationNode connectionNode = findConfigurationNode(input,API_TRANSFORMATIONCONNECTIONNODE);
-    if (connectionNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_TRANSFORMATIONCONNECTIONNODE+"' field");
-      
-    // Turn the configuration node into a TransformationConnection
-    org.apache.manifoldcf.agents.transformationconnection.TransformationConnection transformationConnection = new org.apache.manifoldcf.agents.transformationconnection.TransformationConnection();
-    processTransformationConnection(transformationConnection,connectionNode);
-      
-    if (transformationConnection.getName() == null)
-      transformationConnection.setName(connectionName);
-    else
-    {
-      if (!transformationConnection.getName().equals(connectionName))
-        throw new ManifoldCFException("Connection name in path and in object must agree");
-    }
-      
-    try
-    {
-      // Save the connection.
-      ITransformationConnectionManager connectionManager = TransformationConnectionManagerFactory.make(tc);
-      if (connectionManager.save(transformationConnection))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-  
-  /** Write authority connection.
-  */
-  protected static int apiWriteAuthorityConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode connectionNode = findConfigurationNode(input,API_AUTHORITYCONNECTIONNODE);
-    if (connectionNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_AUTHORITYCONNECTIONNODE+"' field");
-      
-    // Turn the configuration node into an OutputConnection
-    org.apache.manifoldcf.authorities.authority.AuthorityConnection authorityConnection = new org.apache.manifoldcf.authorities.authority.AuthorityConnection();
-    processAuthorityConnection(authorityConnection,connectionNode);
-      
-    if (authorityConnection.getName() == null)
-      authorityConnection.setName(connectionName);
-    else
-    {
-      if (!authorityConnection.getName().equals(connectionName))
-        throw new ManifoldCFException("Connection name in path and in object must agree");
-    }
-      
-    try
-    {
-      // Save the connection.
-      IAuthorityConnectionManager connectionManager = AuthorityConnectionManagerFactory.make(tc);
-      if (connectionManager.save(authorityConnection))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-  
-  /** Write mapping connection.
-  */
-  protected static int apiWriteMappingConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode connectionNode = findConfigurationNode(input,API_MAPPINGCONNECTIONNODE);
-    if (connectionNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_MAPPINGCONNECTIONNODE+"' field");
-      
-    // Turn the configuration node into an OutputConnection
-    org.apache.manifoldcf.authorities.mapping.MappingConnection mappingConnection = new org.apache.manifoldcf.authorities.mapping.MappingConnection();
-    processMappingConnection(mappingConnection,connectionNode);
-      
-    if (mappingConnection.getName() == null)
-      mappingConnection.setName(connectionName);
-    else
-    {
-      if (!mappingConnection.getName().equals(connectionName))
-        throw new ManifoldCFException("Connection name in path and in object must agree");
-    }
-      
-    try
-    {
-      // Save the connection.
-      IMappingConnectionManager connectionManager = MappingConnectionManagerFactory.make(tc);
-      if (connectionManager.save(mappingConnection))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Write repository connection.
-  */
-  protected static int apiWriteRepositoryConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode connectionNode = findConfigurationNode(input,API_REPOSITORYCONNECTIONNODE);
-    if (connectionNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_REPOSITORYCONNECTIONNODE+"' field");
-      
-    // Turn the configuration node into an OutputConnection
-    org.apache.manifoldcf.crawler.repository.RepositoryConnection repositoryConnection = new org.apache.manifoldcf.crawler.repository.RepositoryConnection();
-    processRepositoryConnection(repositoryConnection,connectionNode);
-      
-    if (repositoryConnection.getName() == null)
-      repositoryConnection.setName(connectionName);
-    else
-    {
-      if (!repositoryConnection.getName().equals(connectionName))
-        throw new ManifoldCFException("Connection name in path and in object must agree");
-    }
-
-    try
-    {
-      // Save the connection.
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      if (connectionManager.save(repositoryConnection))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Clear repository connection history.
-  */
-  protected static int apiWriteClearHistoryRepositoryConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      connectionManager.cleanUpHistoryData(connectionName);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Write notification connection.
-  */
-  protected static int apiWriteNotificationConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    ConfigurationNode connectionNode = findConfigurationNode(input,API_NOTIFICATIONCONNECTIONNODE);
-    if (connectionNode == null)
-      throw new ManifoldCFException("Input argument must have '"+API_NOTIFICATIONCONNECTIONNODE+"' field");
-      
-    // Turn the configuration node into an NotificationConnection
-    org.apache.manifoldcf.crawler.notification.NotificationConnection notificationConnection = new org.apache.manifoldcf.crawler.notification.NotificationConnection();
-    processNotificationConnection(notificationConnection,connectionNode);
-      
-    if (notificationConnection.getName() == null)
-      notificationConnection.setName(connectionName);
-    else
-    {
-      if (!notificationConnection.getName().equals(connectionName))
-        throw new ManifoldCFException("Connection name in path and in object must agree");
-    }
-
-    try
-    {
-      // Save the connection.
-      INotificationConnectionManager connectionManager = NotificationConnectionManagerFactory.make(tc);
-      if (connectionManager.save(notificationConnection))
-        return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Reset output connection (reset version of all recorded documents).
-  */
-  protected static int apiWriteClearVersionsOutputConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      signalOutputConnectionRedo(tc,connectionName);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-
-  /** Clear output connection (remove all recorded documents).
-  */
-  protected static int apiWriteClearOutputConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      signalOutputConnectionRemoved(tc,connectionName);
-      return WRITERESULT_CREATED;
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return WRITERESULT_FOUND;
-  }
-  
-  /** Execute specified write command.
-  *@param tc is the thread context.
-  *@param output is the output object, to be filled in.
-  *@param path is the object path.
-  *@param input is the input object.
-  *@return write result - either "not found", "found", or "created".
-  */
-  public static int executeWriteCommand(IThreadContext tc, Configuration output, String path, Configuration input, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (path.startsWith("start/"))
-    {
-      Long jobID = new Long(path.substring("start/".length()));
-      return apiWriteStartJob(tc,output,jobID,false,authorizer);
-    }
-    else if (path.startsWith("startminimal/"))
-    {
-      Long jobID = new Long(path.substring("startminimal/".length()));
-      return apiWriteStartJob(tc,output,jobID,true,authorizer);
-    }
-    else if (path.startsWith("abort/"))
-    {
-      Long jobID = new Long(path.substring("abort/".length()));
-      return apiWriteAbortJob(tc,output,jobID,authorizer);
-    }
-    else if (path.startsWith("restart/"))
-    {
-      Long jobID = new Long(path.substring("restart/".length()));
-      return apiWriteRestartJob(tc,output,jobID,false,authorizer);
-    }
-    else if (path.startsWith("restartminimal/"))
-    {
-      Long jobID = new Long(path.substring("restartminimal/".length()));
-      return apiWriteRestartJob(tc,output,jobID,true,authorizer);
-    }
-    else if (path.startsWith("pause/"))
-    {
-      Long jobID = new Long(path.substring("pause/".length()));
-      return apiWritePauseJob(tc,output,jobID,authorizer);
-    }
-    else if (path.startsWith("resume/"))
-    {
-      Long jobID = new Long(path.substring("resume/".length()));
-      return apiWriteResumeJob(tc,output,jobID,authorizer);
-    }
-    else if (path.startsWith("reseed/"))
-    {
-      Long jobID = new Long(path.substring("reseed/".length()));
-      return apiWriteReseedJob(tc,output,jobID,authorizer);
-    }
-    else if (path.startsWith("jobs/"))
-    {
-      Long jobID = new Long(path.substring("jobs/".length()));
-      return apiWriteJob(tc,output,input,jobID,authorizer);
-    }
-    else if (path.startsWith("authoritygroups/"))
-    {
-      String groupName = decodeAPIPathElement(path.substring("authoritygroups/".length()));
-      return apiWriteAuthorityGroup(tc,output,input,groupName,authorizer);
-    }
-    else if (path.startsWith("outputconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("outputconnections/".length()));
-      return apiWriteOutputConnection(tc,output,input,connectionName,authorizer);
-    }
-    else if (path.startsWith("transformationconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("transformationconnections/".length()));
-      return apiWriteTransformationConnection(tc,output,input,connectionName,authorizer);
-    }
-    else if (path.startsWith("mappingconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("mappingconnections/".length()));
-      return apiWriteMappingConnection(tc,output,input,connectionName,authorizer);
-    }
-    else if (path.startsWith("authorityconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("authorityconnections/".length()));
-      return apiWriteAuthorityConnection(tc,output,input,connectionName,authorizer);
-    }
-    else if (path.startsWith("repositoryconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("repositoryconnections/".length()));
-      return apiWriteRepositoryConnection(tc,output,input,connectionName,authorizer);
-    }
-    else if (path.startsWith("notificationconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("notificationconnections/".length()));
-      return apiWriteNotificationConnection(tc,output,input,connectionName,authorizer);
-    }
-    else if (path.startsWith("clearhistory/"))
-    {
-      int firstSeparator = "clearhistory/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiWriteClearHistoryRepositoryConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("reset/"))
-    {
-      // This form is deprecated
-      int firstSeparator = "reset/".length();
-      int secondSeparator = path.indexOf("/",firstSeparator);
-      if (secondSeparator == -1)
-      {
-        createErrorNode(output,"Need connection name.");
-        return WRITERESULT_NOTFOUND;
-      }
-      
-      String connectionType = path.substring(firstSeparator,secondSeparator);
-      String connectionName = decodeAPIPathElement(path.substring(secondSeparator+1));
-      
-      if (connectionType.equals("outputconnections"))
-      {
-        return apiWriteClearVersionsOutputConnection(tc,output,connectionName,authorizer);
-      }
-      else
-      {
-        createErrorNode(output,"Unknown connection type '"+connectionType+"'.");
-        return WRITERESULT_NOTFOUND;
-      }
-    }
-    else if (path.startsWith("clearversions/"))
-    {
-      int firstSeparator = "clearversions/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiWriteClearVersionsOutputConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("clearrecords/"))
-    {
-      int firstSeparator = "clearrecords/".length();
-      String connectionName = decodeAPIPathElement(path.substring(firstSeparator));
-      return apiWriteClearOutputConnection(tc,output,connectionName,authorizer);
-    }
-    else
-    {
-      createErrorNode(output,"Unrecognized resource.");
-      return WRITERESULT_NOTFOUND;
-    }
-  }
-  
-  // Delete result codes
-  public static final int DELETERESULT_NOTFOUND = 0;
-  public static final int DELETERESULT_FOUND = 1;
-  public static final int DELETERESULT_NOTALLOWED = 2;
-  
-  /** Delete a job.
-  */
-  protected static int apiDeleteJob(IThreadContext tc, Configuration output, Long jobID, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_JOBS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      jobManager.deleteJob(jobID);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-  
-  /** Delete authority group.
-  */
-  protected static int apiDeleteAuthorityGroup(IThreadContext tc, Configuration output, String groupName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
-      groupManager.delete(groupName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-
-  /** Delete output connection.
-  */
-  protected static int apiDeleteOutputConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IOutputConnectionManager connectionManager = OutputConnectionManagerFactory.make(tc);
-      connectionManager.delete(connectionName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-
-  /** Delete authority connection.
-  */
-  protected static int apiDeleteAuthorityConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IAuthorityConnectionManager connectionManager = AuthorityConnectionManagerFactory.make(tc);
-      connectionManager.delete(connectionName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-  
-  /** Delete mapping connection.
-  */
-  protected static int apiDeleteMappingConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IMappingConnectionManager connectionManager = MappingConnectionManagerFactory.make(tc);
-      connectionManager.delete(connectionName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-
-  /** Delete transformation connection.
-  */
-  protected static int apiDeleteTransformationConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      ITransformationConnectionManager connectionManager = TransformationConnectionManagerFactory.make(tc);
-      connectionManager.delete(connectionName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-
-  /** Delete repository connection.
-  */
-  protected static int apiDeleteRepositoryConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
-      connectionManager.delete(connectionName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-
-  /** Delete notification connection.
-  */
-  protected static int apiDeleteNotificationConnection(IThreadContext tc, Configuration output, String connectionName, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_EDIT_CONNECTIONS))
-      return READRESULT_NOTALLOWED;
-
-    try
-    {
-      INotificationConnectionManager connectionManager = NotificationConnectionManagerFactory.make(tc);
-      connectionManager.delete(connectionName);
-    }
-    catch (ManifoldCFException e)
-    {
-      createErrorNode(output,e);
-    }
-    return DELETERESULT_FOUND;
-  }
-  
-  /** Execute specified delete command.
-  *@param tc is the thread context.
-  *@param output is the output object, to be filled in.
-  *@param path is the object path.
-  *@return delete result code
-  */
-  public static int executeDeleteCommand(IThreadContext tc, Configuration output, String path, IAuthorizer authorizer)
-    throws ManifoldCFException
-  {
-    if (path.startsWith("jobs/"))
-    {
-      Long jobID = new Long(path.substring("jobs/".length()));
-      return apiDeleteJob(tc,output,jobID,authorizer);
-    }
-    else if (path.startsWith("authoritygroups/"))
-    {
-      String groupName = decodeAPIPathElement(path.substring("authoritygroups/".length()));
-      return apiDeleteAuthorityGroup(tc,output,groupName,authorizer);
-    }
-    else if (path.startsWith("outputconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("outputconnections/".length()));
-      return apiDeleteOutputConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("mappingconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("mappingconnections/".length()));
-      return apiDeleteAuthorityConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("authorityconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("authorityconnections/".length()));
-      return apiDeleteAuthorityConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("transformationconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("transformationconnections/".length()));
-      return apiDeleteTransformationConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("repositoryconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("repositoryconnections/".length()));
-      return apiDeleteRepositoryConnection(tc,output,connectionName,authorizer);
-    }
-    else if (path.startsWith("notificationconnections/"))
-    {
-      String connectionName = decodeAPIPathElement(path.substring("notificationconnections/".length()));
-      return apiDeleteNotificationConnection(tc,output,connectionName,authorizer);
-    }
-    else
-    {
-      createErrorNode(output,"Unrecognized resource.");
-      return DELETERESULT_NOTFOUND;
-    }
-  }
-  
-  // The following chunk of code is responsible for formatting a job description into a set of nodes, and for reading back a formatted job description.
-  // This is needed to support the job-related API methods, above.
-  
-  // Job node types
-  protected static final String JOBNODE_ID = "id";
-  protected static final String JOBNODE_DESCRIPTION = "description";
-  protected static final String JOBNODE_CONNECTIONNAME = "repository_connection";
-  protected static final String JOBNODE_DOCUMENTSPECIFICATION = "document_specification";
-  protected static final String JOBNODE_STARTMODE = "start_mode";
-  protected static final String JOBNODE_RUNMODE = "run_mode";
-  protected static final String JOBNODE_HOPCOUNTMODE = "hopcount_mode";
-  protected static final String JOBNODE_PRIORITY = "priority";
-  protected static final String JOBNODE_RECRAWLINTERVAL = "recrawl_interval";
-  protected static final String JOBNODE_MAXRECRAWLINTERVAL = "max_recrawl_interval";
-  protected static final String JOBNODE_EXPIRATIONINTERVAL = "expiration_interval";
-  protected static final String JOBNODE_RESEEDINTERVAL = "reseed_interval";
-  protected static final String JOBNODE_HOPCOUNT = "hopcount";
-  protected static final String JOBNODE_SCHEDULE = "schedule";
-  protected static final String JOBNODE_LINKTYPE = "link_type";
-  protected static final String JOBNODE_COUNT = "count";
-  protected static final String JOBNODE_REQUESTMINIMUM = "requestminimum";
-  protected static final String JOBNODE_TIMEZONE = "timezone";
-  protected static final String JOBNODE_DURATION = "duration";
-  protected static final String JOBNODE_DAYOFWEEK = "dayofweek";
-  protected static final String JOBNODE_MONTHOFYEAR = "monthofyear";
-  protected static final String JOBNODE_DAYOFMONTH = "dayofmonth";
-  protected static final String JOBNODE_YEAR = "year";
-  protected static final String JOBNODE_HOUROFDAY = "hourofday";
-  protected static final String JOBNODE_MINUTESOFHOUR = "minutesofhour";
-  protected static final String JOBNODE_ENUMVALUE = "value";
-  protected static final String JOBNODE_PARAMNAME = "paramname";
-  protected static final String JOBNODE_PARAMVALUE = "paramvalue";
-  protected static final String JOBNODE_PIPELINESTAGE = "pipelinestage";
-  protected static final String JOBNODE_STAGEID = "stage_id";
-  protected static final String JOBNODE_STAGEPREREQUISITE = "stage_prerequisite";
-  protected static final String JOBNODE_STAGEISOUTPUT = "stage_isoutput";
-  protected static final String JOBNODE_STAGECONNECTIONNAME = "stage_connectionname";
-  protected static final String JOBNODE_STAGEDESCRIPTION = "stage_description";
-  protected static final String JOBNODE_STAGESPECIFICATION = "stage_specification";
-  protected static final String JOBNODE_NOTIFICATIONSTAGE = "notificationstage";
-
-  /** Convert a node into a job description.
-  *@param jobDescription is the job to be filled in.
-  *@param jobNode is the configuration node corresponding to the whole job itself.
-  */
-  protected static void processJobDescription(org.apache.manifoldcf.crawler.jobs.JobDescription jobDescription, ConfigurationNode jobNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    Map<String,PipelineStage> pipelineStages = new HashMap<String,PipelineStage>();
-    for (int i = 0; i < jobNode.getChildCount(); i++)
-    {
-      ConfigurationNode child = jobNode.findChild(i);
-      String childType = child.getType();
-      if (childType.equals(JOBNODE_ID))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Job id node requires a value");
-        jobDescription.setID(new Long(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_DESCRIPTION))
-      {
-        jobDescription.setDescription(child.getValue());
-      }
-      else if (childType.equals(JOBNODE_CONNECTIONNAME))
-      {
-        jobDescription.setConnectionName(child.getValue());
-      }
-      else if (childType.equals(JOBNODE_PIPELINESTAGE))
-      {
-        String stageID = null;
-        String stagePrerequisite = null;
-        String stageIsOutput = null;
-        String stageConnectionName = null;
-        String stageDescription = null;
-        ConfigurationNode stageSpecification = null;
-        for (int q = 0; q < child.getChildCount(); q++)
-        {
-          ConfigurationNode cn = child.findChild(q);
-          if (cn.getType().equals(JOBNODE_STAGEID))
-            stageID = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGEPREREQUISITE))
-            stagePrerequisite = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGEISOUTPUT))
-            stageIsOutput = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGECONNECTIONNAME))
-            stageConnectionName = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGEDESCRIPTION))
-            stageDescription = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGESPECIFICATION))
-          {
-            stageSpecification = cn;
-          }
-          else
-            throw new ManifoldCFException("Found an unexpected node type: '"+cn.getType()+"'");
-        }
-        if (stageID == null)
-          throw new ManifoldCFException("Missing required field: '"+JOBNODE_STAGEID+"'");
-        if (stageIsOutput == null)
-          throw new ManifoldCFException("Missing required field: '"+JOBNODE_STAGEISOUTPUT+"'");
-        if (stageConnectionName == null)
-          throw new ManifoldCFException("Missing required field: '"+JOBNODE_STAGECONNECTIONNAME+"'");
-        pipelineStages.put(stageID,new PipelineStage(stagePrerequisite,stageIsOutput.equals("true"),
-          stageConnectionName,stageDescription,stageSpecification));
-      }
-      else if (childType.equals(JOBNODE_NOTIFICATIONSTAGE))
-      {
-        String stageConnectionName = null;
-        String stageDescription = null;
-        ConfigurationNode stageSpecification = null;
-        for (int q = 0; q < child.getChildCount(); q++)
-        {
-          ConfigurationNode cn = child.findChild(q);
-          if (cn.getType().equals(JOBNODE_STAGECONNECTIONNAME))
-            stageConnectionName = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGEDESCRIPTION))
-            stageDescription = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_STAGESPECIFICATION))
-          {
-            stageSpecification = cn;
-          }
-          else
-            throw new ManifoldCFException("Found an unexpected node type: '"+cn.getType()+"'");
-        }
-        if (stageConnectionName == null)
-          throw new ManifoldCFException("Missing required field: '"+JOBNODE_STAGECONNECTIONNAME+"'");
-        Specification os = jobDescription.addNotification(stageConnectionName,stageDescription);
-        os.clearChildren();
-        if (stageSpecification != null)
-        {
-          for (int j = 0; j < stageSpecification.getChildCount(); j++)
-          {
-            ConfigurationNode cn = stageSpecification.findChild(j);
-            os.addChild(os.getChildCount(),new SpecificationNode(cn));
-          }
-        }
-
-      }
-      else if (childType.equals(JOBNODE_DOCUMENTSPECIFICATION))
-      {
-        // Get the job's document specification, clear out the children, and copy new ones from the child.
-        Specification ds = jobDescription.getSpecification();
-        ds.clearChildren();
-        for (int j = 0; j < child.getChildCount(); j++)
-        {
-          ConfigurationNode cn = child.findChild(j);
-          ds.addChild(ds.getChildCount(),new SpecificationNode(cn));
-        }
-      }
-      else if (childType.equals(JOBNODE_STARTMODE))
-      {
-        jobDescription.setStartMethod(mapToStartMode(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_RUNMODE))
-      {
-        jobDescription.setType(mapToRunMode(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_HOPCOUNTMODE))
-      {
-        jobDescription.setHopcountMode(mapToHopcountMode(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_PRIORITY))
-      {
-        try
-        {
-          jobDescription.setPriority(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException(e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(JOBNODE_RECRAWLINTERVAL))
-      {
-        jobDescription.setInterval(interpretInterval(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_MAXRECRAWLINTERVAL))
-      {
-        jobDescription.setMaxInterval(interpretInterval(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_EXPIRATIONINTERVAL))
-      {
-        jobDescription.setExpiration(interpretInterval(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_RESEEDINTERVAL))
-      {
-        jobDescription.setReseedInterval(interpretInterval(child.getValue()));
-      }
-      else if (childType.equals(JOBNODE_HOPCOUNT))
-      {
-        // Read the hopcount values
-        String linkType = null;
-        String hopCount = null;
-        
-        int q = 0;
-        while (q < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(q++);
-          if (cn.getType().equals(JOBNODE_LINKTYPE))
-            linkType = cn.getValue();
-          else if (cn.getType().equals(JOBNODE_COUNT))
-            hopCount = cn.getValue();
-          else
-            throw new ManifoldCFException("Found an unexpected node type: '"+cn.getType()+"'");
-        }
-        if (linkType == null)
-          throw new ManifoldCFException("Missing required field: '"+JOBNODE_LINKTYPE+"'");
-        if (hopCount == null)
-          throw new ManifoldCFException("Missing required field: '"+JOBNODE_COUNT+"'");
-        jobDescription.addHopCountFilter(linkType,new Long(hopCount));
-      }
-      else if (childType.equals(JOBNODE_SCHEDULE))
-      {
-        // Create a schedule record.
-        String timezone = null;
-        Long duration = null;
-        boolean requestMinimum = false;
-        EnumeratedValues dayOfWeek = null;
-        EnumeratedValues monthOfYear = null;
-        EnumeratedValues dayOfMonth = null;
-        EnumeratedValues year = null;
-        EnumeratedValues hourOfDay = null;
-        EnumeratedValues minutesOfHour = null;
-            
-        // Now, walk through children of the schedule node.
-        int q = 0;
-        while (q < child.getChildCount())
-        {
-          ConfigurationNode scheduleField = child.findChild(q++);
-          String fieldType = scheduleField.getType();
-          if (fieldType.equals(JOBNODE_REQUESTMINIMUM))
-          {
-            requestMinimum = scheduleField.getValue().equals("true");
-          }
-          else if (fieldType.equals(JOBNODE_TIMEZONE))
-          {
-            timezone = scheduleField.getValue();
-          }
-          else if (fieldType.equals(JOBNODE_DURATION))
-          {
-            duration = new Long(scheduleField.getValue());
-          }
-          else if (fieldType.equals(JOBNODE_DAYOFWEEK))
-          {
-            dayOfWeek = processEnumeratedValues(scheduleField);
-          }
-          else if (fieldType.equals(JOBNODE_MONTHOFYEAR))
-          {
-            monthOfYear = processEnumeratedValues(scheduleField);
-          }
-          else if (fieldType.equals(JOBNODE_YEAR))
-          {
-            year = processEnumeratedValues(scheduleField);
-          }
-          else if (fieldType.equals(JOBNODE_DAYOFMONTH))
-          {
-            dayOfMonth = processEnumeratedValues(scheduleField);
-          }
-          else if (fieldType.equals(JOBNODE_HOUROFDAY))
-          {
-            hourOfDay = processEnumeratedValues(scheduleField);
-          }
-          else if (fieldType.equals(JOBNODE_MINUTESOFHOUR))
-          {
-            minutesOfHour = processEnumeratedValues(scheduleField);
-          }
-          else
-            throw new ManifoldCFException("Unrecognized field in schedule record: '"+fieldType+"'");
-        }
-        ScheduleRecord sr = new ScheduleRecord(dayOfWeek,monthOfYear,dayOfMonth,year,hourOfDay,minutesOfHour,timezone,duration,requestMinimum);
-        // Add the schedule record to the job.
-        jobDescription.addScheduleRecord(sr);
-      }
-      else
-        throw new ManifoldCFException("Unrecognized job field: '"+childType+"'");
-    }
-    
-    // Do pipeline stages.  These must be ordered so that the prerequisites are always done first.
-    List<String> orderedStageNames = new ArrayList<String>();
-    Set<String> keysSeen = new HashSet<String>();
-    for (String stageName : pipelineStages.keySet())
-    {
-      PipelineStage ps = pipelineStages.get(stageName);
-      if (keysSeen.contains(stageName))
-        continue;
-      // Look at the prerequisite; insert them beforehand if they aren't already there
-      addStage(stageName,orderedStageNames,keysSeen,pipelineStages);
-    }
-    
-    // Now, add stages to job in  order, and map to ordinals
-    int k = 0;
-    for (String stageName : orderedStageNames)
-    {
-      PipelineStage ps = pipelineStages.get(stageName);
-      ps.ordinal = k++;
-      int prerequisite = (ps.prerequisite == null)?-1:pipelineStages.get(ps.prerequisite).ordinal;
-      Specification os = jobDescription.addPipelineStage(prerequisite,ps.isOutput,ps.connectionName,ps.description);
-      os.clearChildren();
-      if (ps.specification != null)
-      {
-        for (int j = 0; j < ps.specification.getChildCount(); j++)
-        {
-          ConfigurationNode cn = ps.specification.findChild(j);
-          os.addChild(os.getChildCount(),new SpecificationNode(cn));
-        }
-      }
-    }
-  }
-
-  protected static void addStage(String stageName, List<String> orderedStageNames, Set<String> keysSeen,
-    Map<String,PipelineStage> pipelineStages)
-    throws ManifoldCFException
-  {
-    if (keysSeen.contains(stageName))
-      return;
-    PipelineStage ps = pipelineStages.get(stageName);
-    if (ps == null)
-      throw new ManifoldCFException("Stage reference error: '"+stageName+"' is unknown");
-    if (ps.prerequisite != null)
-      addStage(ps.prerequisite,orderedStageNames,keysSeen,pipelineStages);
-    // All prerequisites added!
-    orderedStageNames.add(stageName);
-    keysSeen.add(stageName);
-  }
-  
-  protected static class PipelineStage
-  {
-    public final String prerequisite;
-    public final boolean isOutput;
-    public final String connectionName;
-    public final String description;
-    public final ConfigurationNode specification;
-    public int ordinal;
-    
-    public PipelineStage(String prerequisite, boolean isOutput, String connectionName, String description, ConfigurationNode specification)
-    {
-      this.prerequisite = prerequisite;
-      this.isOutput = isOutput;
-      this.connectionName = connectionName;
-      this.description = description;
-      this.specification = specification;
-    }
-    
-  }
-
-  /** Convert a job description into a ConfigurationNode.
-  *@param jobNode is the node to be filled in.
-  *@param job is the job description.
-  */
-  protected static void formatJobDescription(ConfigurationNode jobNode, IJobDescription job)
-  {
-    // For each field of the job, add an appropriate child node, with value.
-    ConfigurationNode child;
-    
-    // id
-    if (job.getID() != null)
-    {
-      child = new ConfigurationNode(JOBNODE_ID);
-      child.setValue(job.getID().toString());
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-    
-    // description
-    if (job.getDescription() != null)
-    {
-      child = new ConfigurationNode(JOBNODE_DESCRIPTION);
-      child.setValue(job.getDescription());
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-    
-    // connection
-    if (job.getConnectionName() != null)
-    {
-      child = new ConfigurationNode(JOBNODE_CONNECTIONNAME);
-      child.setValue(job.getConnectionName());
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-
-    // Document specification
-    Specification ds = job.getSpecification();
-    child = new ConfigurationNode(JOBNODE_DOCUMENTSPECIFICATION);
-    for (int j = 0; j < ds.getChildCount(); j++)
-    {
-      ConfigurationNode cn = ds.getChild(j);
-      child.addChild(child.getChildCount(),cn);
-    }
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Pipeline stages
-    for (int j = 0; j < job.countPipelineStages(); j++)
-    {
-      child = new ConfigurationNode(JOBNODE_PIPELINESTAGE);
-      ConfigurationNode stage;
-      stage = new ConfigurationNode(JOBNODE_STAGEID);
-      stage.setValue(Integer.toString(j));
-      child.addChild(child.getChildCount(),stage);
-      if (job.getPipelineStagePrerequisite(j) != -1)
-      {
-        stage = new ConfigurationNode(JOBNODE_STAGEPREREQUISITE);
-        stage.setValue(Integer.toString(job.getPipelineStagePrerequisite(j)));
-        child.addChild(child.getChildCount(),stage);
-      }
-      stage = new ConfigurationNode(JOBNODE_STAGEISOUTPUT);
-      stage.setValue(job.getPipelineStageIsOutputConnection(j)?"true":"false");
-      child.addChild(child.getChildCount(),stage);
-      stage = new ConfigurationNode(JOBNODE_STAGECONNECTIONNAME);
-      stage.setValue(job.getPipelineStageConnectionName(j));
-      child.addChild(child.getChildCount(),stage);
-      String description = job.getPipelineStageDescription(j);
-      if (description != null)
-      {
-        stage = new ConfigurationNode(JOBNODE_STAGEDESCRIPTION);
-        stage.setValue(description);
-        child.addChild(child.getChildCount(),stage);
-      }
-      Specification spec = job.getPipelineStageSpecification(j);
-      stage = new ConfigurationNode(JOBNODE_STAGESPECIFICATION);
-      for (int k = 0; k < spec.getChildCount(); k++)
-      {
-        ConfigurationNode cn = spec.getChild(k);
-        stage.addChild(stage.getChildCount(),cn);
-      }
-      child.addChild(child.getChildCount(),stage);
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-
-    for (int j = 0; j < job.countNotifications(); j++)
-    {
-      child = new ConfigurationNode(JOBNODE_NOTIFICATIONSTAGE);
-      ConfigurationNode stage;
-      stage = new ConfigurationNode(JOBNODE_STAGECONNECTIONNAME);
-      stage.setValue(job.getNotificationConnectionName(j));
-      child.addChild(child.getChildCount(),stage);
-      String description = job.getNotificationDescription(j);
-      if (description != null)
-      {
-        stage = new ConfigurationNode(JOBNODE_STAGEDESCRIPTION);
-        stage.setValue(description);
-        child.addChild(child.getChildCount(),stage);
-      }
-      Specification spec = job.getNotificationSpecification(j);
-      stage = new ConfigurationNode(JOBNODE_STAGESPECIFICATION);
-      for (int k = 0; k < spec.getChildCount(); k++)
-      {
-        ConfigurationNode cn = spec.getChild(k);
-        stage.addChild(stage.getChildCount(),cn);
-      }
-      child.addChild(child.getChildCount(),stage);
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-
-    // Start mode
-    child = new ConfigurationNode(JOBNODE_STARTMODE);
-    child.setValue(startModeMap(job.getStartMethod()));
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Run mode
-    child = new ConfigurationNode(JOBNODE_RUNMODE);
-    child.setValue(runModeMap(job.getType()));
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Hopcount mode
-    child = new ConfigurationNode(JOBNODE_HOPCOUNTMODE);
-    child.setValue(hopcountModeMap(job.getHopcountMode()));
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Priority
-    child = new ConfigurationNode(JOBNODE_PRIORITY);
-    child.setValue(Integer.toString(job.getPriority()));
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Recrawl interval
-    child = new ConfigurationNode(JOBNODE_RECRAWLINTERVAL);
-    child.setValue((job.getInterval()==null)?"infinite":job.getInterval().toString());
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Max recrawl interval
-    child = new ConfigurationNode(JOBNODE_MAXRECRAWLINTERVAL);
-    child.setValue((job.getMaxInterval()==null)?"infinite":job.getMaxInterval().toString());
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    child = new ConfigurationNode(JOBNODE_EXPIRATIONINTERVAL);
-    child.setValue((job.getExpiration()==null)?"infinite":job.getExpiration().toString());
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    child = new ConfigurationNode(JOBNODE_RESEEDINTERVAL);
-    child.setValue((job.getReseedInterval()==null)?"infinite":job.getReseedInterval().toString());
-    jobNode.addChild(jobNode.getChildCount(),child);
-
-    // Hopcount records
-    Map filters = job.getHopCountFilters();
-    Iterator iter = filters.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String linkType = (String)iter.next();
-      Long hopCount = (Long)filters.get(linkType);
-      child = new ConfigurationNode(JOBNODE_HOPCOUNT);
-      ConfigurationNode cn;
-      cn = new ConfigurationNode(JOBNODE_LINKTYPE);
-      cn.setValue(linkType);
-      child.addChild(child.getChildCount(),cn);
-      cn = new ConfigurationNode(JOBNODE_COUNT);
-      cn.setValue(hopCount.toString());
-      child.addChild(child.getChildCount(),cn);
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-    
-    // Schedule records
-    for (int j = 0; j < job.getScheduleRecordCount(); j++)
-    {
-      ScheduleRecord sr = job.getScheduleRecord(j);
-      child = new ConfigurationNode(JOBNODE_SCHEDULE);
-      ConfigurationNode recordChild;
-      
-      // requestminimum
-      recordChild = new ConfigurationNode(JOBNODE_REQUESTMINIMUM);
-      recordChild.setValue(sr.getRequestMinimum()?"true":"false");
-      child.addChild(child.getChildCount(),recordChild);
-      
-      // timezone
-      if (sr.getTimezone() != null)
-      {
-        recordChild = new ConfigurationNode(JOBNODE_TIMEZONE);
-        recordChild.setValue(sr.getTimezone());
-        child.addChild(child.getChildCount(),recordChild);
-      }
-
-      // duration
-      if (sr.getDuration() != null)
-      {
-        recordChild = new ConfigurationNode(JOBNODE_DURATION);
-        recordChild.setValue(sr.getDuration().toString());
-        child.addChild(child.getChildCount(),recordChild);
-      }
-      
-      // Schedule specification values
-      
-      // day of week
-      if (sr.getDayOfWeek() != null)
-        formatEnumeratedValues(child,JOBNODE_DAYOFWEEK,sr.getDayOfWeek());
-      if (sr.getMonthOfYear() != null)
-        formatEnumeratedValues(child,JOBNODE_MONTHOFYEAR,sr.getMonthOfYear());
-      if (sr.getDayOfMonth() != null)
-        formatEnumeratedValues(child,JOBNODE_DAYOFMONTH,sr.getDayOfMonth());
-      if (sr.getYear() != null)
-        formatEnumeratedValues(child,JOBNODE_YEAR,sr.getYear());
-      if (sr.getHourOfDay() != null)
-        formatEnumeratedValues(child,JOBNODE_HOUROFDAY,sr.getHourOfDay());
-      if (sr.getMinutesOfHour() != null)
-        formatEnumeratedValues(child,JOBNODE_MINUTESOFHOUR,sr.getMinutesOfHour());
-      
-      jobNode.addChild(jobNode.getChildCount(),child);
-    }
-  }
-
-  protected static void formatEnumeratedValues(ConfigurationNode recordNode, String childType, EnumeratedValues value)
-  {
-    ConfigurationNode child = new ConfigurationNode(childType);
-    Iterator iter = value.getValues();
-    while (iter.hasNext())
-    {
-      Integer theValue = (Integer)iter.next();
-      ConfigurationNode valueNode = new ConfigurationNode(JOBNODE_ENUMVALUE);
-      valueNode.setValue(theValue.toString());
-      child.addChild(child.getChildCount(),valueNode);
-    }
-    recordNode.addChild(recordNode.getChildCount(),child);
-  }
-  
-  protected static EnumeratedValues processEnumeratedValues(ConfigurationNode fieldNode)
-    throws ManifoldCFException
-  {
-    ArrayList values = new ArrayList();
-    int i = 0;
-    while (i < fieldNode.getChildCount())
-    {
-      ConfigurationNode cn = fieldNode.findChild(i++);
-      if (cn.getType().equals(JOBNODE_ENUMVALUE))
-      {
-        try
-        {
-          values.add(new Integer(cn.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error processing enumerated value node: "+e.getMessage(),e);
-        }
-      }
-      else
-        throw new ManifoldCFException("Error processing enumerated value nodes: Unrecognized node type '"+cn.getType()+"'");
-    }
-    return new EnumeratedValues(values);
-  }
-  
-  protected static String presentInterval(Long interval)
-  {
-    if (interval == null)
-      return "infinite";
-    return interval.toString();
-  }
-
-  protected static Long interpretInterval(String interval)
-    throws ManifoldCFException
-  {
-    if (interval == null || interval.equals("infinite"))
-      return null;
-    else
-      return new Long(interval);
-  }
-  
-  protected static String startModeMap(int startMethod)
-  {
-    switch (startMethod)
-    {
-    case IJobDescription.START_WINDOWBEGIN:
-      return "schedule window start";
-    case IJobDescription.START_WINDOWINSIDE:
-      return "schedule window anytime";
-    case IJobDescription.START_DISABLE:
-      return "manual";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static int mapToStartMode(String startMethod)
-    throws ManifoldCFException
-  {
-    if (startMethod.equals("schedule window start"))
-      return IJobDescription.START_WINDOWBEGIN;
-    else if (startMethod.equals("schedule window anytime"))
-      return IJobDescription.START_WINDOWINSIDE;
-    else if (startMethod.equals("manual"))
-      return IJobDescription.START_DISABLE;
-    else
-      throw new ManifoldCFException("Unrecognized start method: '"+startMethod+"'");
-  }
-  
-  protected static String runModeMap(int type)
-  {
-    switch (type)
-    {
-    case IJobDescription.TYPE_CONTINUOUS:
-      return "continuous";
-    case IJobDescription.TYPE_SPECIFIED:
-      return "scan once";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static int mapToRunMode(String mode)
-    throws ManifoldCFException
-  {
-    if (mode.equals("continuous"))
-      return IJobDescription.TYPE_CONTINUOUS;
-    else if (mode.equals("scan once"))
-      return IJobDescription.TYPE_SPECIFIED;
-    else
-      throw new ManifoldCFException("Unrecognized run method: '"+mode+"'");
-  }
-  
-  protected static String hopcountModeMap(int mode)
-  {
-    switch (mode)
-    {
-    case IJobDescription.HOPCOUNT_ACCURATE:
-      return "accurate";
-    case IJobDescription.HOPCOUNT_NODELETE:
-      return "no delete";
-    case IJobDescription.HOPCOUNT_NEVERDELETE:
-      return "never delete";
-    default:
-      return "unknown";
-    }
-  }
-
-  protected static int mapToHopcountMode(String mode)
-    throws ManifoldCFException
-  {
-    if (mode.equals("accurate"))
-      return IJobDescription.HOPCOUNT_ACCURATE;
-    else if (mode.equals("no delete"))
-      return IJobDescription.HOPCOUNT_NODELETE;
-    else if (mode.equals("never delete"))
-      return IJobDescription.HOPCOUNT_NEVERDELETE;
-    else
-      throw new ManifoldCFException("Unrecognized hopcount method: '"+mode+"'");
-  }
-  
-  // End of job API support code.
-  
-  // The following chunk of code supports job statuses in the API.  Only a formatting method is required, since we never "save" a status.
-
-  // Node types used to handle job statuses.
-  protected static final String JOBSTATUSNODE_JOBID = "job_id";
-  protected static final String JOBSTATUSNODE_STATUS = "status";
-  protected static final String JOBSTATUSNODE_ERRORTEXT = "errortext";
-  protected static final String JOBSTATUSNODE_STARTTIME = "start_time";
-  protected static final String JOBSTATUSNODE_ENDTIME = "end_time";
-  protected static final String JOBSTATUSNODE_DOCUMENTSINQUEUE = "documents_in_queue";
-  protected static final String JOBSTATUSNODE_DOCUMENTSOUTSTANDING = "documents_outstanding";
-  protected static final String JOBSTATUSNODE_DOCUMENTSPROCESSED = "documents_processed";
-  protected static final String JOBSTATUSNODE_QUEUEEXACT = "queue_exact";
-  protected static final String JOBSTATUSNODE_OUTSTANDINGEXACT = "outstanding_exact";
-  protected static final String JOBSTATUSNODE_PROCESSEDEXACT = "processed_exact";
-  
-  /** Format a job status.
-  */
-  protected static void formatJobStatus(ConfigurationNode jobStatusNode, JobStatus jobStatus)
-  {
-    // For each field of the job, add an appropriate child node, with value.
-    ConfigurationNode child;
-    int j;
-    
-    // id
-    child = new ConfigurationNode(JOBSTATUSNODE_JOBID);
-    child.setValue(jobStatus.getJobID().toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    // status
-    child = new ConfigurationNode(JOBSTATUSNODE_STATUS);
-    child.setValue(statusMap(jobStatus.getStatus()));
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    // error text
-    if (jobStatus.getErrorText() != null)
-    {
-      child = new ConfigurationNode(JOBSTATUSNODE_ERRORTEXT);
-      child.setValue(jobStatus.getErrorText());
-      jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-    }
-    
-    // start time
-    if (jobStatus.getStartTime() != -1L)
-    {
-      child = new ConfigurationNode(JOBSTATUSNODE_STARTTIME);
-      child.setValue(new Long(jobStatus.getStartTime()).toString());
-      jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-    }
-    
-    // end time
-    if (jobStatus.getEndTime() != -1L)
-    {
-      child = new ConfigurationNode(JOBSTATUSNODE_ENDTIME);
-      child.setValue(new Long(jobStatus.getEndTime()).toString());
-      jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-    }
-
-    // documents in queue
-    child = new ConfigurationNode(JOBSTATUSNODE_DOCUMENTSINQUEUE);
-    child.setValue(new Long(jobStatus.getDocumentsInQueue()).toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    // documents outstanding
-    child = new ConfigurationNode(JOBSTATUSNODE_DOCUMENTSOUTSTANDING);
-    child.setValue(new Long(jobStatus.getDocumentsOutstanding()).toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    // documents processed
-    child = new ConfigurationNode(JOBSTATUSNODE_DOCUMENTSPROCESSED);
-    child.setValue(new Long(jobStatus.getDocumentsProcessed()).toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    // Exact flags
-    child = new ConfigurationNode(JOBSTATUSNODE_QUEUEEXACT);
-    child.setValue(new Boolean(jobStatus.getQueueCountExact()).toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    child = new ConfigurationNode(JOBSTATUSNODE_OUTSTANDINGEXACT);
-    child.setValue(new Boolean(jobStatus.getOutstandingCountExact()).toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-    child = new ConfigurationNode(JOBSTATUSNODE_PROCESSEDEXACT);
-    child.setValue(new Boolean(jobStatus.getProcessedCountExact()).toString());
-    jobStatusNode.addChild(jobStatusNode.getChildCount(),child);
-
-  }
-
-  protected static String statusMap(int status)
-  {
-    switch (status)
-    {
-    case JobStatus.JOBSTATUS_NOTYETRUN:
-      return "not yet run";
-    case JobStatus.JOBSTATUS_RUNNING:
-      return "running";
-    case JobStatus.JOBSTATUS_STOPPING:
-      return "stopping";
-    case JobStatus.JOBSTATUS_RESUMING:
-      return "resuming";
-    case JobStatus.JOBSTATUS_PAUSED:
-      return "paused";
-    case JobStatus.JOBSTATUS_COMPLETED:
-      return "done";
-    case JobStatus.JOBSTATUS_WINDOWWAIT:
-      return "waiting";
-    case JobStatus.JOBSTATUS_STARTING:
-      return "starting up";
-    case JobStatus.JOBSTATUS_DESTRUCTING:
-      return "cleaning up";
-    case JobStatus.JOBSTATUS_ERROR:
-      return "error";
-    case JobStatus.JOBSTATUS_ABORTING:
-      return "aborting";
-    case JobStatus.JOBSTATUS_RESTARTING:
-      return "restarting";
-    case JobStatus.JOBSTATUS_RUNNING_UNINSTALLED:
-      return "running no connector";
-    case JobStatus.JOBSTATUS_JOBENDCLEANUP:
-      return "terminating";
-    case JobStatus.JOBSTATUS_JOBENDNOTIFICATION:
-      return "notifying";
-    default:
-      return "unknown";
-    }
-  }
-
-  // End of jobstatus API support.
-  
-  // Authority group API
-  
-  protected static final String AUTHGROUPNODE_ISNEW = "isnew";
-  protected static final String AUTHGROUPNODE_NAME = "name";
-  protected static final String AUTHGROUPNODE_DESCRIPTION = "description";
-  
-  // Output connection API support.
-  
-  /** Convert input hierarchy into an AuthorityGroup object.
-  */
-  protected static void processAuthorityGroup(org.apache.manifoldcf.authorities.authgroups.AuthorityGroup group, ConfigurationNode groupNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < groupNode.getChildCount())
-    {
-      ConfigurationNode child = groupNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(AUTHGROUPNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Authority group isnew node requires a value");
-        group.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(AUTHGROUPNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Authority group name node requires a value");
-        group.setName(child.getValue());
-      }
-      else if (childType.equals(AUTHGROUPNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Authority group description node requires a value");
-        group.setDescription(child.getValue());
-      }
-      else
-        throw new ManifoldCFException("Unrecognized authority group field: '"+childType+"'");
-    }
-
-  }
-  
-  /** Format an authority group.
-  */
-  protected static void formatAuthorityGroup(ConfigurationNode groupNode, IAuthorityGroup group)
-  {
-    ConfigurationNode child;
-    int j;
-
-    child = new ConfigurationNode(AUTHGROUPNODE_ISNEW);
-    child.setValue(group.getIsNew()?"true":"false");
-    groupNode.addChild(groupNode.getChildCount(),child);
-
-    child = new ConfigurationNode(AUTHGROUPNODE_NAME);
-    child.setValue(group.getName());
-    groupNode.addChild(groupNode.getChildCount(),child);
-
-    if (group.getDescription() != null)
-    {
-      child = new ConfigurationNode(AUTHGROUPNODE_DESCRIPTION);
-      child.setValue(group.getDescription());
-      groupNode.addChild(groupNode.getChildCount(),child);
-    }
-    
-  }
-
-  // Connection API
-  
-  protected static final String CONNECTIONNODE_ISNEW = "isnew";
-  protected static final String CONNECTIONNODE_NAME = "name";
-  protected static final String CONNECTIONNODE_CLASSNAME = "class_name";
-  protected static final String CONNECTIONNODE_MAXCONNECTIONS = "max_connections";
-  protected static final String CONNECTIONNODE_DESCRIPTION = "description";
-  protected static final String CONNECTIONNODE_PREREQUISITE = "prerequisite";
-  protected static final String CONNECTIONNODE_CONFIGURATION = "configuration";
-  protected static final String CONNECTIONNODE_ACLAUTHORITY = "acl_authority";
-  protected static final String CONNECTIONNODE_THROTTLE = "throttle";
-  protected static final String CONNECTIONNODE_MATCH = "match";
-  protected static final String CONNECTIONNODE_MATCHDESCRIPTION = "match_description";
-  protected static final String CONNECTIONNODE_RATE = "rate";
-  protected static final String CONNECTIONNODE_AUTHDOMAIN = "authdomain";
-  protected static final String CONNECTIONNODE_AUTHGROUP = "authgroup";
-  
-  // Output connection API support.
-  
-  /** Convert input hierarchy into an OutputConnection object.
-  */
-  protected static void processOutputConnection(org.apache.manifoldcf.agents.outputconnection.OutputConnection connection, ConfigurationNode connectionNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < connectionNode.getChildCount())
-    {
-      ConfigurationNode child = connectionNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(CONNECTIONNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection isnew node requires a value");
-        connection.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(CONNECTIONNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection name node requires a value");
-        connection.setName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CLASSNAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection classname node requires a value");
-        connection.setClassName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_MAXCONNECTIONS))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection maxconnections node requires a value");
-        try
-        {
-          connection.setMaxConnections(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error parsing max connections: "+e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection description node requires a value");
-        connection.setDescription(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CONFIGURATION))
-      {
-        // Get the connection's configuration, clear out the children, and copy new ones from the child.
-        ConfigParams cp = connection.getConfigParams();
-        cp.clearChildren();
-        int j = 0;
-        while (j < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(j++);
-          cp.addChild(cp.getChildCount(),new ConfigNode(cn));
-        }
-      }
-      else
-        throw new ManifoldCFException("Unrecognized output connection field: '"+childType+"'");
-    }
-    if (connection.getClassName() == null)
-      throw new ManifoldCFException("Missing connection field: '"+CONNECTIONNODE_CLASSNAME+"'");
-
-  }
-  
-  /** Format an output connection.
-  */
-  protected static void formatOutputConnection(ConfigurationNode connectionNode, IOutputConnection connection)
-  {
-    ConfigurationNode child;
-    int j;
-
-    child = new ConfigurationNode(CONNECTIONNODE_ISNEW);
-    child.setValue(connection.getIsNew()?"true":"false");
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_NAME);
-    child.setValue(connection.getName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_CLASSNAME);
-    child.setValue(connection.getClassName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_MAXCONNECTIONS);
-    child.setValue(Integer.toString(connection.getMaxConnections()));
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getDescription() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_DESCRIPTION);
-      child.setValue(connection.getDescription());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    ConfigParams cp = connection.getConfigParams();
-    child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
-    j = 0;
-    while (j < cp.getChildCount())
-    {
-      ConfigurationNode cn = cp.findChild(j++);
-      child.addChild(child.getChildCount(),cn);
-    }
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-  }
-
-  // Transformation connection API support
-  
-    /** Convert input hierarchy into a TransformationConnection object.
-  */
-  protected static void processTransformationConnection(org.apache.manifoldcf.agents.transformationconnection.TransformationConnection connection, ConfigurationNode connectionNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < connectionNode.getChildCount())
-    {
-      ConfigurationNode child = connectionNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(CONNECTIONNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection isnew node requires a value");
-        connection.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(CONNECTIONNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection name node requires a value");
-        connection.setName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CLASSNAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection classname node requires a value");
-        connection.setClassName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_MAXCONNECTIONS))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection maxconnections node requires a value");
-        try
-        {
-          connection.setMaxConnections(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error parsing max connections: "+e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection description node requires a value");
-        connection.setDescription(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CONFIGURATION))
-      {
-        // Get the connection's configuration, clear out the children, and copy new ones from the child.
-        ConfigParams cp = connection.getConfigParams();
-        cp.clearChildren();
-        int j = 0;
-        while (j < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(j++);
-          cp.addChild(cp.getChildCount(),new ConfigNode(cn));
-        }
-      }
-      else
-        throw new ManifoldCFException("Unrecognized output connection field: '"+childType+"'");
-    }
-    if (connection.getClassName() == null)
-      throw new ManifoldCFException("Missing connection field: '"+CONNECTIONNODE_CLASSNAME+"'");
-
-  }
-
-  /** Format a transformation connection.
-  */
-  protected static void formatTransformationConnection(ConfigurationNode connectionNode, ITransformationConnection connection)
-  {
-    ConfigurationNode child;
-    int j;
-
-    child = new ConfigurationNode(CONNECTIONNODE_ISNEW);
-    child.setValue(connection.getIsNew()?"true":"false");
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_NAME);
-    child.setValue(connection.getName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_CLASSNAME);
-    child.setValue(connection.getClassName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_MAXCONNECTIONS);
-    child.setValue(Integer.toString(connection.getMaxConnections()));
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getDescription() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_DESCRIPTION);
-      child.setValue(connection.getDescription());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    ConfigParams cp = connection.getConfigParams();
-    child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
-    j = 0;
-    while (j < cp.getChildCount())
-    {
-      ConfigurationNode cn = cp.findChild(j++);
-      child.addChild(child.getChildCount(),cn);
-    }
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-  }
-
-  // Authority connection API support
-  
-  /** Convert input hierarchy into an AuthorityConnection object.
-  */
-  protected static void processAuthorityConnection(org.apache.manifoldcf.authorities.authority.AuthorityConnection connection, ConfigurationNode connectionNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < connectionNode.getChildCount())
-    {
-      ConfigurationNode child = connectionNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(CONNECTIONNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection isnew node requires a value");
-        connection.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(CONNECTIONNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection name node requires a value");
-        connection.setName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CLASSNAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection classname node requires a value");
-        connection.setClassName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_MAXCONNECTIONS))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection maxconnections node requires a value");
-        try
-        {
-          connection.setMaxConnections(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error parsing max connections: "+e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_PREREQUISITE))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection prerequisite node requires a value");
-        connection.setPrerequisiteMapping(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_AUTHDOMAIN))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection authdomain node requires a value");
-        connection.setAuthDomain(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_AUTHGROUP))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection authgroup node requires a value");
-        connection.setAuthGroup(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection description node requires a value");
-        connection.setDescription(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CONFIGURATION))
-      {
-        // Get the connection's configuration, clear out the children, and copy new ones from the child.
-        ConfigParams cp = connection.getConfigParams();
-        cp.clearChildren();
-        int j = 0;
-        while (j < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(j++);
-          cp.addChild(cp.getChildCount(),new ConfigNode(cn));
-        }
-      }
-      else
-        throw new ManifoldCFException("Unrecognized authority connection field: '"+childType+"'");
-    }
-    if (connection.getClassName() == null)
-      throw new ManifoldCFException("Missing connection field: '"+CONNECTIONNODE_CLASSNAME+"'");
-
-  }
-
-
-  /** Format an authority connection.
-  */
-  protected static void formatAuthorityConnection(ConfigurationNode connectionNode, IAuthorityConnection connection)
-  {
-    ConfigurationNode child;
-    int j;
-    
-    child = new ConfigurationNode(CONNECTIONNODE_ISNEW);
-    child.setValue(connection.getIsNew()?"true":"false");
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_NAME);
-    child.setValue(connection.getName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_CLASSNAME);
-    child.setValue(connection.getClassName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_MAXCONNECTIONS);
-    child.setValue(Integer.toString(connection.getMaxConnections()));
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getPrerequisiteMapping() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_PREREQUISITE);
-      child.setValue(connection.getPrerequisiteMapping());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-
-    if (connection.getDescription() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_DESCRIPTION);
-      child.setValue(connection.getDescription());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    if (connection.getAuthDomain() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_AUTHDOMAIN);
-      child.setValue(connection.getAuthDomain());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    child = new ConfigurationNode(CONNECTIONNODE_AUTHGROUP);
-    child.setValue(connection.getAuthGroup());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    ConfigParams cp = connection.getConfigParams();
-    child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
-    j = 0;
-    while (j < cp.getChildCount())
-    {
-      ConfigurationNode cn = cp.findChild(j++);
-      child.addChild(child.getChildCount(),cn);
-    }
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-  }
-
-  // Mapping connection API methods
-  
-  /** Convert input hierarchy into an MappingConnection object.
-  */
-  protected static void processMappingConnection(org.apache.manifoldcf.authorities.mapping.MappingConnection connection, ConfigurationNode connectionNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < connectionNode.getChildCount())
-    {
-      ConfigurationNode child = connectionNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(CONNECTIONNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection isnew node requires a value");
-        connection.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(CONNECTIONNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection name node requires a value");
-        connection.setName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CLASSNAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection classname node requires a value");
-        connection.setClassName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_MAXCONNECTIONS))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection maxconnections node requires a value");
-        try
-        {
-          connection.setMaxConnections(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error parsing max connections: "+e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_PREREQUISITE))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection prerequisite node requires a value");
-        connection.setPrerequisiteMapping(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection description node requires a value");
-        connection.setDescription(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CONFIGURATION))
-      {
-        // Get the connection's configuration, clear out the children, and copy new ones from the child.
-        ConfigParams cp = connection.getConfigParams();
-        cp.clearChildren();
-        int j = 0;
-        while (j < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(j++);
-          cp.addChild(cp.getChildCount(),new ConfigNode(cn));
-        }
-      }
-      else
-        throw new ManifoldCFException("Unrecognized mapping connection field: '"+childType+"'");
-    }
-    if (connection.getClassName() == null)
-      throw new ManifoldCFException("Missing connection field: '"+CONNECTIONNODE_CLASSNAME+"'");
-
-  }
-
-  /** Format a mapping connection.
-  */
-  protected static void formatMappingConnection(ConfigurationNode connectionNode, IMappingConnection connection)
-  {
-    ConfigurationNode child;
-    int j;
-    
-    child = new ConfigurationNode(CONNECTIONNODE_ISNEW);
-    child.setValue(connection.getIsNew()?"true":"false");
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_NAME);
-    child.setValue(connection.getName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_CLASSNAME);
-    child.setValue(connection.getClassName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_MAXCONNECTIONS);
-    child.setValue(Integer.toString(connection.getMaxConnections()));
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getPrerequisiteMapping() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_PREREQUISITE);
-      child.setValue(connection.getPrerequisiteMapping());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    if (connection.getDescription() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_DESCRIPTION);
-      child.setValue(connection.getDescription());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    ConfigParams cp = connection.getConfigParams();
-    child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
-    j = 0;
-    while (j < cp.getChildCount())
-    {
-      ConfigurationNode cn = cp.findChild(j++);
-      child.addChild(child.getChildCount(),cn);
-    }
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-  }
-
-  // Repository connection API support methods
-  
-  /** Convert input hierarchy into a RepositoryConnection object.
-  */
-  protected static void processRepositoryConnection(org.apache.manifoldcf.crawler.repository.RepositoryConnection connection, ConfigurationNode connectionNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < connectionNode.getChildCount())
-    {
-      ConfigurationNode child = connectionNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(CONNECTIONNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection isnew node requires a value");
-        connection.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(CONNECTIONNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection name node requires a value");
-        connection.setName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CLASSNAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection classname node requires a value");
-        connection.setClassName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_MAXCONNECTIONS))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection maxconnections node requires a value");
-        try
-        {
-          connection.setMaxConnections(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error parsing max connections: "+e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection description node requires a value");
-        connection.setDescription(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CONFIGURATION))
-      {
-        // Get the connection's configuration, clear out the children, and copy new ones from the child.
-        ConfigParams cp = connection.getConfigParams();
-        cp.clearChildren();
-        int j = 0;
-        while (j < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(j++);
-          cp.addChild(cp.getChildCount(),new ConfigNode(cn));
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_ACLAUTHORITY))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection aclauthority node requires a value");
-        connection.setACLAuthority(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_THROTTLE))
-      {
-        String match = null;
-        String description = null;
-        Float rate = null;
-            
-        int q = 0;
-        while (q < child.getChildCount())
-        {
-          ConfigurationNode throttleField = child.findChild(q++);
-          String fieldType = throttleField.getType();
-          if (fieldType.equals(CONNECTIONNODE_MATCH))
-          {
-            match = throttleField.getValue();
-          }
-          else if (fieldType.equals(CONNECTIONNODE_MATCHDESCRIPTION))
-          {
-            description = throttleField.getValue();
-          }
-          else if (fieldType.equals(CONNECTIONNODE_RATE))
-          {
-            rate = new Float(throttleField.getValue());
-          }
-          else
-            throw new ManifoldCFException("Unrecognized throttle field: '"+fieldType+"'");
-        }
-        if (match == null)
-          throw new ManifoldCFException("Missing throttle field: '"+CONNECTIONNODE_MATCH+"'");
-        if (rate == null)
-          throw new ManifoldCFException("Missing throttle field: '"+CONNECTIONNODE_RATE+"'");
-        connection.addThrottleValue(match,description,rate.floatValue());
-      }
-      else
-        throw new ManifoldCFException("Unrecognized repository connection field: '"+childType+"'");
-    }
-    if (connection.getClassName() == null)
-      throw new ManifoldCFException("Missing connection field: '"+CONNECTIONNODE_CLASSNAME+"'");
-
-  }
-  
-  /** Format a repository connection.
-  */
-  protected static void formatRepositoryConnection(ConfigurationNode connectionNode, IRepositoryConnection connection)
-  {
-    ConfigurationNode child;
-    int j;
-
-    child = new ConfigurationNode(CONNECTIONNODE_ISNEW);
-    child.setValue(connection.getIsNew()?"true":"false");
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_NAME);
-    child.setValue(connection.getName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_CLASSNAME);
-    child.setValue(connection.getClassName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_MAXCONNECTIONS);
-    child.setValue(Integer.toString(connection.getMaxConnections()));
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getDescription() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_DESCRIPTION);
-      child.setValue(connection.getDescription());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    ConfigParams cp = connection.getConfigParams();
-    child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
-    j = 0;
-    while (j < cp.getChildCount())
-    {
-      ConfigurationNode cn = cp.findChild(j++);
-      child.addChild(child.getChildCount(),cn);
-    }
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getACLAuthority() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_ACLAUTHORITY);
-      child.setValue(connection.getACLAuthority());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    String[] throttles = connection.getThrottles();
-    j = 0;
-    while (j < throttles.length)
-    {
-      String match = throttles[j++];
-      String description = connection.getThrottleDescription(match);
-      float rate = connection.getThrottleValue(match);
-      child = new ConfigurationNode(CONNECTIONNODE_THROTTLE);
-      ConfigurationNode throttleChildNode;
-      
-      throttleChildNode = new ConfigurationNode(CONNECTIONNODE_MATCH);
-      throttleChildNode.setValue(match);
-      child.addChild(child.getChildCount(),throttleChildNode);
-      
-      if (description != null)
-      {
-        throttleChildNode = new ConfigurationNode(CONNECTIONNODE_MATCHDESCRIPTION);
-        throttleChildNode.setValue(description);
-        child.addChild(child.getChildCount(),throttleChildNode);
-      }
-
-      throttleChildNode = new ConfigurationNode(CONNECTIONNODE_RATE);
-      throttleChildNode.setValue(new Float(rate).toString());
-      child.addChild(child.getChildCount(),throttleChildNode);
-
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-  }
-
-  // Notification connection node handling
-  
-  /** Convert input hierarchy into a NotificationConnection object.
-  */
-  protected static void processNotificationConnection(org.apache.manifoldcf.crawler.notification.NotificationConnection connection, ConfigurationNode connectionNode)
-    throws ManifoldCFException
-  {
-    // Walk through the node's children
-    int i = 0;
-    while (i < connectionNode.getChildCount())
-    {
-      ConfigurationNode child = connectionNode.findChild(i++);
-      String childType = child.getType();
-      if (childType.equals(CONNECTIONNODE_ISNEW))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection isnew node requires a value");
-        connection.setIsNew(child.getValue().equals("true"));
-      }
-      else if (childType.equals(CONNECTIONNODE_NAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection name node requires a value");
-        connection.setName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CLASSNAME))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection classname node requires a value");
-        connection.setClassName(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_MAXCONNECTIONS))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection maxconnections node requires a value");
-        try
-        {
-          connection.setMaxConnections(Integer.parseInt(child.getValue()));
-        }
-        catch (NumberFormatException e)
-        {
-          throw new ManifoldCFException("Error parsing max connections: "+e.getMessage(),e);
-        }
-      }
-      else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
-      {
-        if (child.getValue() == null)
-          throw new ManifoldCFException("Connection description node requires a value");
-        connection.setDescription(child.getValue());
-      }
-      else if (childType.equals(CONNECTIONNODE_CONFIGURATION))
-      {
-        // Get the connection's configuration, clear out the children, and copy new ones from the child.
-        ConfigParams cp = connection.getConfigParams();
-        cp.clearChildren();
-        int j = 0;
-        while (j < child.getChildCount())
-        {
-          ConfigurationNode cn = child.findChild(j++);
-          cp.addChild(cp.getChildCount(),new ConfigNode(cn));
-        }
-      }
-      else
-        throw new ManifoldCFException("Unrecognized notification connection field: '"+childType+"'");
-    }
-    if (connection.getClassName() == null)
-      throw new ManifoldCFException("Missing connection field: '"+CONNECTIONNODE_CLASSNAME+"'");
-
-  }
-
-  /** Format a notification connection.
-  */
-  protected static void formatNotificationConnection(ConfigurationNode connectionNode, INotificationConnection connection)
-  {
-    ConfigurationNode child;
-    int j;
-
-    child = new ConfigurationNode(CONNECTIONNODE_ISNEW);
-    child.setValue(connection.getIsNew()?"true":"false");
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_NAME);
-    child.setValue(connection.getName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_CLASSNAME);
-    child.setValue(connection.getClassName());
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    child = new ConfigurationNode(CONNECTIONNODE_MAXCONNECTIONS);
-    child.setValue(Integer.toString(connection.getMaxConnections()));
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-    if (connection.getDescription() != null)
-    {
-      child = new ConfigurationNode(CONNECTIONNODE_DESCRIPTION);
-      child.setValue(connection.getDescription());
-      connectionNode.addChild(connectionNode.getChildCount(),child);
-    }
-    
-    ConfigParams cp = connection.getConfigParams();
-    child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
-    j = 0;
-    while (j < cp.getChildCount())
-    {
-      ConfigurationNode cn = cp.findChild(j++);
-      child.addChild(child.getChildCount(),cn);
-    }
-    connectionNode.addChild(connectionNode.getChildCount(),child);
-
-  }
-
-  // End of connection API code
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/NotificationResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/NotificationResetManager.java
deleted file mode 100644
index 77062e8..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/NotificationResetManager.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** Class which handles reset for seeding thread pool (of which there's
-* typically only one member).  The reset action here
-* is to move the status of jobs back from "seeding" to normal.
-*/
-public class NotificationResetManager extends ResetManager
-{
-
-  /** Constructor. */
-  public NotificationResetManager(String processID)
-  {
-    super(processID);
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetNotificationWorkerStatus(processID);
-  }
-
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineConnections.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineConnections.java
deleted file mode 100644
index 2f67b15..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineConnections.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-
-import java.util.*;
-
-/** Pipeline connections implementation.
-*/
-public class PipelineConnections implements IPipelineConnections
-{
-  protected final IPipelineSpecificationBasic spec;
-  protected final String[] transformationConnectionNames;
-  protected final ITransformationConnection[] transformationConnections;
-  protected final String[] outputConnectionNames;
-  protected final IOutputConnection[] outputConnections;
-  // We need a way to get from stage index to connection index.
-  // These arrays are looked up by stage index, and return the appropriate connection index.
-  protected final Map<Integer,Integer> transformationConnectionLookupMap = new HashMap<Integer,Integer>();
-  protected final Map<Integer,Integer> outputConnectionLookupMap = new HashMap<Integer,Integer>();
-    
-  public PipelineConnections(IPipelineSpecificationBasic spec, ITransformationConnectionManager transformationConnectionManager,
-    IOutputConnectionManager outputConnectionManager)
-    throws ManifoldCFException
-  {
-    this.spec = spec;
-    // Now, load all the connections we'll ever need, being sure to only load one copy of each.
-    // We first segregate them into unique transformation and output connections.
-    int count = spec.getStageCount();
-    Set<String> transformations = new HashSet<String>();
-    Set<String> outputs = new HashSet<String>();
-    for (int i = 0; i < count; i++)
-    {
-      if (spec.checkStageOutputConnection(i))
-        outputs.add(spec.getStageConnectionName(i));
-      else
-        transformations.add(spec.getStageConnectionName(i));
-    }
-      
-    Map<String,Integer> transformationNameMap = new HashMap<String,Integer>();
-    Map<String,Integer> outputNameMap = new HashMap<String,Integer>();
-    transformationConnectionNames = new String[transformations.size()];
-    outputConnectionNames = new String[outputs.size()];
-    int index = 0;
-    for (String connectionName : transformations)
-    {
-      transformationConnectionNames[index] = connectionName;
-      transformationNameMap.put(connectionName,new Integer(index++));
-    }
-    index = 0;
-    for (String connectionName : outputs)
-    {
-      outputConnectionNames[index] = connectionName;
-      outputNameMap.put(connectionName,new Integer(index++));
-    }
-    // Load!
-    transformationConnections = transformationConnectionManager.loadMultiple(transformationConnectionNames);
-    outputConnections = outputConnectionManager.loadMultiple(outputConnectionNames);
-      
-    for (int i = 0; i < count; i++)
-    {
-      Integer k;
-      if (spec.checkStageOutputConnection(i))
-      {
-        outputConnectionLookupMap.put(new Integer(i),outputNameMap.get(spec.getStageConnectionName(i)));
-      }
-      else
-      {
-        transformationConnectionLookupMap.put(new Integer(i),transformationNameMap.get(spec.getStageConnectionName(i)));
-      }
-    }
-  }
-
-  /** Get a count of all stages.
-  *@return the total count of all stages.
-  */
-  @Override
-  public int getStageCount()
-  {
-    return spec.getStageCount();
-  }
-  
-  /** Find children of a given pipeline stage.  Pass -1 to find the children of the root stage.
-  *@param stage is the stage index to get the children of.
-  *@return the pipeline stages that represent those children.
-  */
-  @Override
-  public int[] getStageChildren(int stage)
-  {
-    return spec.getStageChildren(stage);
-  }
-  
-  /** Find parent of a given pipeline stage.  Returns -1 if there's no parent (it's the root).
-  *@param stage is the stage index to get the parent of.
-  *@return the pipeline stage that is the parent, or -1.
-  */
-  @Override
-  public int getStageParent(int stage)
-  {
-    return spec.getStageParent(stage);
-  }
-
-  /** Get the connection name for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the connection name for that stage.
-  */
-  @Override
-  public String getStageConnectionName(int stage)
-  {
-    return spec.getStageConnectionName(stage);
-  }
-
-  /** Check if a stage is an output stage.
-  *@param stage is the stage to check.
-  *@return true if the stage represents an output connection.
-  */
-  @Override
-  public boolean checkStageOutputConnection(int stage)
-  {
-    return spec.checkStageOutputConnection(stage);
-  }
-  
-  /** Return the number of output connections.
-  *@return the total number of output connections in this specification.
-  */
-  @Override
-  public int getOutputCount()
-  {
-    return spec.getOutputCount();
-  }
-  
-  /** Given an output index, return the stage number for that output.
-  *@param index is the output connection index.
-  *@return the stage number.
-  */
-  @Override
-  public int getOutputStage(int index)
-  {
-    return spec.getOutputStage(index);
-  }
-  
-  @Override
-  public String[] getTransformationConnectionNames()
-  {
-    return transformationConnectionNames;
-  }
-    
-  @Override
-  public ITransformationConnection[] getTransformationConnections()
-  {
-    return transformationConnections;
-  }
-    
-  @Override
-  public String[] getOutputConnectionNames()
-  {
-    return outputConnectionNames;
-  }
-    
-  @Override
-  public IOutputConnection[] getOutputConnections()
-  {
-    return outputConnections;
-  }
-    
-  @Override
-  public Integer getTransformationConnectionIndex(int stage)
-  {
-    return transformationConnectionLookupMap.get(new Integer(stage));
-  }
-    
-  @Override
-  public Integer getOutputConnectionIndex(int stage)
-  {
-    return outputConnectionLookupMap.get(new Integer(stage));
-  }
-    
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecification.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecification.java
deleted file mode 100644
index bba3b1a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecification.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-/** Class which handles pipeline specifications that include current (new) description strings.
-*/
-public class PipelineSpecification implements IPipelineSpecification
-{
-  protected final IPipelineConnections connections;
-  protected final VersionContext[] pipelineDescriptionStrings;
-    
-  public PipelineSpecification(IPipelineConnections connections, IJobDescription job, IIncrementalIngester ingester)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    this.connections = connections;
-    this.pipelineDescriptionStrings = new VersionContext[connections.getStageCount()];
-    for (int i = 0; i < pipelineDescriptionStrings.length; i++)
-    {
-      // Note: this needs to change when output connections become part of the pipeline
-      VersionContext descriptionString;
-      if (connections.checkStageOutputConnection(i))
-      {
-        descriptionString = ingester.getOutputDescription(connections.getOutputConnections()[connections.getOutputConnectionIndex(i).intValue()],job.getPipelineStageSpecification(i));
-      }
-      else
-      {
-        descriptionString = ingester.getTransformationDescription(connections.getTransformationConnections()[connections.getTransformationConnectionIndex(i).intValue()],job.getPipelineStageSpecification(i));
-      }
-      this.pipelineDescriptionStrings[i] = descriptionString;
-    }
-  }
-
-  /** Get a count of all stages.
-  *@return the total count of all stages.
-  */
-  @Override
-  public int getStageCount()
-  {
-    return connections.getStageCount();
-  }
-  
-  /** Find children of a given pipeline stage.  Pass -1 to find the children of the root stage.
-  *@param stage is the stage index to get the children of.
-  *@return the pipeline stages that represent those children.
-  */
-  @Override
-  public int[] getStageChildren(int stage)
-  {
-    return connections.getStageChildren(stage);
-  }
-  
-  /** Find parent of a given pipeline stage.  Returns -1 if there's no parent (it's the root).
-  *@param stage is the stage index to get the parent of.
-  *@return the pipeline stage that is the parent, or -1.
-  */
-  @Override
-  public int getStageParent(int stage)
-  {
-    return connections.getStageParent(stage);
-  }
-
-  /** Get the connection name for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the connection name for that stage.
-  */
-  @Override
-  public String getStageConnectionName(int stage)
-  {
-    return connections.getStageConnectionName(stage);
-  }
-
-  /** Check if a stage is an output stage.
-  *@param stage is the stage to check.
-  *@return true if the stage represents an output connection.
-  */
-  @Override
-  public boolean checkStageOutputConnection(int stage)
-  {
-    return connections.checkStageOutputConnection(stage);
-  }
-  
-  /** Return the number of output connections.
-  *@return the total number of output connections in this specification.
-  */
-  @Override
-  public int getOutputCount()
-  {
-    return connections.getOutputCount();
-  }
-  
-  /** Given an output index, return the stage number for that output.
-  *@param index is the output connection index.
-  *@return the stage number.
-  */
-  @Override
-  public int getOutputStage(int index)
-  {
-    return connections.getOutputStage(index);
-  }
-
-  /** Get the transformation connection names mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public String[] getTransformationConnectionNames()
-  {
-    return connections.getTransformationConnectionNames();
-  }
-  
-  /** Get the transformation connection instances mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public ITransformationConnection[] getTransformationConnections()
-  {
-    return connections.getTransformationConnections();
-  }
-  
-  /** Get the output connection names mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public String[] getOutputConnectionNames()
-  {
-    return connections.getOutputConnectionNames();
-  }
-  
-  /** Get the output connection instances mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public IOutputConnection[] getOutputConnections()
-  {
-    return connections.getOutputConnections();
-  }
-  
-  /** Get the index of the transformation connection corresponding to a
-  * specific pipeline stage. */
-  @Override
-  public Integer getTransformationConnectionIndex(int stage)
-  {
-    return connections.getTransformationConnectionIndex(stage);
-  }
-  
-  /** Get the index of the output connection corresponding to a
-  * specific pipeline stage. */
-  @Override
-  public Integer getOutputConnectionIndex(int stage)
-  {
-    return connections.getOutputConnectionIndex(stage);
-  }
-
-  /** Get the description string for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the description string that stage.
-  */
-  @Override
-  public VersionContext getStageDescriptionString(int stage)
-  {
-    return pipelineDescriptionStrings[stage];
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecificationBasic.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecificationBasic.java
deleted file mode 100644
index 970a90a..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecificationBasic.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-/** Basic pipeline specification implementation.  Constructed from a job description.
-*/
-public class PipelineSpecificationBasic implements IPipelineSpecificationBasic
-{
-  protected final IJobDescription job;
-  
-  // This is offset by 1, so the first element corresponds to -1
-  protected final int[][] pipelineStageChildren;
-  
-  protected final int[] outputs;
-  
-  public PipelineSpecificationBasic(IJobDescription job)
-  {
-    this.job = job;
-    this.pipelineStageChildren = new int[job.countPipelineStages()+1][];
-    int[] childrenCount = new int[pipelineStageChildren.length];
-    int outputCount = 0;
-    for (int i = 0; i < job.countPipelineStages(); i++)
-    {
-      int prerequisite = job.getPipelineStagePrerequisite(i);
-      childrenCount[prerequisite+1] ++;
-      if (job.getPipelineStageIsOutputConnection(i))
-        outputCount++;
-    }
-    for (int i = 0; i < pipelineStageChildren.length; i++)
-    {
-      pipelineStageChildren[i] = new int[childrenCount[i]];
-      childrenCount[i] = 0;
-    }
-    outputs = new int[outputCount];
-    outputCount = 0;
-    for (int i = 0; i < job.countPipelineStages(); i++)
-    {
-      int prerequisite = job.getPipelineStagePrerequisite(i);
-      (pipelineStageChildren[prerequisite+1])[childrenCount[prerequisite+1]++] = i;
-      if (job.getPipelineStageIsOutputConnection(i))
-        outputs[outputCount++] = i;
-    }
-  }
-    
-  /** Get a count of all stages.
-  *@return the total count of all stages.
-  */
-  @Override
-  public int getStageCount()
-  {
-    return job.countPipelineStages();
-  }
-
-  /** Find children of a given pipeline stage.  Pass -1 to find the children of the root stage.
-  *@param stage is the stage index to get the children of.
-  *@return the pipeline stages that represent those children.
-  */
-  @Override
-  public int[] getStageChildren(int stage)
-  {
-    return pipelineStageChildren[stage+1];
-  }
-    
-  /** Find parent of a given pipeline stage.  Returns -1 if there's no parent (it's the root).
-  *@param stage is the stage index to get the parent of.
-  *@return the pipeline stage that is the parent, or -1.
-  */
-  public int getStageParent(int stage)
-  {
-    return job.getPipelineStagePrerequisite(stage);
-  }
-
-  /** Get the connection name for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the connection name for that stage.
-  */
-  @Override
-  public String getStageConnectionName(int stage)
-  {
-    return job.getPipelineStageConnectionName(stage);
-  }
-    
-  /** Check if a stage is an output stage.
-  *@param stage is the stage to check.
-  *@return true if the stage represents an output connection.
-  */
-  @Override
-  public boolean checkStageOutputConnection(int stage)
-  {
-    return job.getPipelineStageIsOutputConnection(stage);
-  }
-
-  /** Return the number of output connections.
-  *@return the total number of output connections in this specification.
-  */
-  public int getOutputCount()
-  {
-    return outputs.length;
-  }
-    
-  /** Given an output index, return the stage number for that output.
-  *@param index is the output connection index.
-  *@return the stage number.
-  */
-  public int getOutputStage(int index)
-  {
-    return outputs[index];
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecificationWithVersions.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecificationWithVersions.java
deleted file mode 100644
index 551d926..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PipelineSpecificationWithVersions.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-/** Class which handles pipeline specifications, including both new versions and old versions.
-*/
-public class PipelineSpecificationWithVersions implements IPipelineSpecificationWithVersions
-{
-  protected final IPipelineSpecification pipelineSpecification;
-  protected final QueuedDocument queuedDocument;
-  protected final String componentIDHash;
-    
-  public PipelineSpecificationWithVersions(IPipelineSpecification pipelineSpecification,
-    QueuedDocument queuedDocument, String componentIDHash)
-  {
-    this.pipelineSpecification = pipelineSpecification;
-    this.queuedDocument = queuedDocument;
-    this.componentIDHash = componentIDHash;
-  }
-  
-  protected DocumentIngestStatus getStatus(int index)
-  {
-    DocumentIngestStatusSet set = queuedDocument.getLastIngestedStatus(pipelineSpecification.getStageConnectionName(pipelineSpecification.getOutputStage(index)));
-    if (set == null)
-      return null;
-    return set.getComponent(componentIDHash);
-  }
-
-  /** Get a count of all stages.
-  *@return the total count of all stages.
-  */
-  @Override
-  public int getStageCount()
-  {
-    return pipelineSpecification.getStageCount();
-  }
-  
-  /** Find children of a given pipeline stage.  Pass -1 to find the children of the root stage.
-  *@param stage is the stage index to get the children of.
-  *@return the pipeline stages that represent those children.
-  */
-  @Override
-  public int[] getStageChildren(int stage)
-  {
-    return pipelineSpecification.getStageChildren(stage);
-  }
-  
-  /** Find parent of a given pipeline stage.  Returns -1 if there's no parent (it's the root).
-  *@param stage is the stage index to get the parent of.
-  *@return the pipeline stage that is the parent, or -1.
-  */
-  @Override
-  public int getStageParent(int stage)
-  {
-    return pipelineSpecification.getStageParent(stage);
-  }
-
-  /** Get the connection name for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the connection name for that stage.
-  */
-  @Override
-  public String getStageConnectionName(int stage)
-  {
-    return pipelineSpecification.getStageConnectionName(stage);
-  }
-
-  /** Check if a stage is an output stage.
-  *@param stage is the stage to check.
-  *@return true if the stage represents an output connection.
-  */
-  @Override
-  public boolean checkStageOutputConnection(int stage)
-  {
-    return pipelineSpecification.checkStageOutputConnection(stage);
-  }
-  
-  /** Return the number of output connections.
-  *@return the total number of output connections in this specification.
-  */
-  @Override
-  public int getOutputCount()
-  {
-    return pipelineSpecification.getOutputCount();
-  }
-  
-  /** Given an output index, return the stage number for that output.
-  *@param index is the output connection index.
-  *@return the stage number.
-  */
-  @Override
-  public int getOutputStage(int index)
-  {
-    return pipelineSpecification.getOutputStage(index);
-  }
-
-  /** Get the transformation connection names mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public String[] getTransformationConnectionNames()
-  {
-    return pipelineSpecification.getTransformationConnectionNames();
-  }
-  
-  /** Get the transformation connection instances mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public ITransformationConnection[] getTransformationConnections()
-  {
-    return pipelineSpecification.getTransformationConnections();
-  }
-  
-  /** Get the output connection names mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public String[] getOutputConnectionNames()
-  {
-    return pipelineSpecification.getOutputConnectionNames();
-  }
-  
-  /** Get the output connection instances mentioned by the IPipelineSpecification
-  * object. */
-  @Override
-  public IOutputConnection[] getOutputConnections()
-  {
-    return pipelineSpecification.getOutputConnections();
-  }
-  
-  /** Get the index of the transformation connection corresponding to a
-  * specific pipeline stage. */
-  @Override
-  public Integer getTransformationConnectionIndex(int stage)
-  {
-    return pipelineSpecification.getTransformationConnectionIndex(stage);
-  }
-  
-  /** Get the index of the output connection corresponding to a
-  * specific pipeline stage. */
-  @Override
-  public Integer getOutputConnectionIndex(int stage)
-  {
-    return pipelineSpecification.getOutputConnectionIndex(stage);
-  }
-
-  /** Get the description string for a pipeline stage.
-  *@param stage is the stage to get the connection name for.
-  *@return the description string that stage.
-  */
-  @Override
-  public VersionContext getStageDescriptionString(int stage)
-  {
-    return pipelineSpecification.getStageDescriptionString(stage);
-  }
-
-  /** For a given output index, return a document version string.
-  *@param index is the output index.
-  *@return the document version string.
-  */
-  @Override
-  public String getOutputDocumentVersionString(int index)
-  {
-    DocumentIngestStatus status = getStatus(index);
-    if (status == null)
-      return null;
-    return status.getDocumentVersion();
-  }
-    
-
-  /** For a given output index, return a transformation version string.
-  *@param index is the output index.
-  *@return the transformation version string.
-  */
-  @Override
-  public String getOutputTransformationVersionString(int index)
-  {
-    DocumentIngestStatus status = getStatus(index);
-    if (status == null)
-      return null;
-    return status.getTransformationVersion();
-  }
-
-  /** For a given output index, return an output version string.
-  *@param index is the output index.
-  *@return the output version string.
-  */
-  @Override
-  public String getOutputVersionString(int index)
-  {
-    DocumentIngestStatus status = getStatus(index);
-    if (status == null)
-      return null;
-    return status.getOutputVersion();
-  }
-    
-  /** For a given output index, return an authority name string.
-  *@param index is the output index.
-  *@return the authority name string.
-  */
-  @Override
-  public String getAuthorityNameString(int index)
-  {
-    DocumentIngestStatus status = getStatus(index);
-    if (status == null)
-      return null;
-    return status.getDocumentAuthorityNameString();
-  }
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PriorityCalculator.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PriorityCalculator.java
deleted file mode 100644
index e7279cc..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/PriorityCalculator.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-import java.util.regex.*;
-
-/** This class calculates a document priority given all the required inputs.
-* It is not thread safe, but calls classes that are (e.g. QueueTracker).
-*/
-public class PriorityCalculator implements IPriorityCalculator
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** This is a made-up constant, originally based on 100 documents/second, but adjusted downward as a result of experimentation and testing, which is described as "T" below.
-  */
-  private final static double minMsPerFetch = 50.0;
-
-  protected final IRepositoryConnection connection;
-  protected final String[] binNames;
-  protected final String documentIdentifier;
-  protected final IReprioritizationTracker rt;
-  
-  protected final double[] binCountScaleFactors;
-  protected final double[] weightedMinimumDepths;
-  
-  protected Double cachedValue = null;
-  
-  /** Constructor. */
-  public PriorityCalculator(IReprioritizationTracker rt, IRepositoryConnection connection, String[] documentBins, String documentIdentifier)
-    throws ManifoldCFException
-  {
-    this(rt,rt.getMinimumDepth(),connection,documentBins,documentIdentifier);
-  }
-  
-  public PriorityCalculator(IReprioritizationTracker rt, double currentMinimumDepth, IRepositoryConnection connection, String[] documentBins, String documentIdentifier)
-    throws ManifoldCFException
-  {
-    this.documentIdentifier = documentIdentifier;
-    this.connection = connection;
-    this.binNames = documentBins;
-    this.rt = rt;
-    
-    // Now, precompute the weightedMinimumDepths etc; we'll need it whether we preload or not.
-    
-    // For each bin, we will be calculating the bin count scale factor, which is what we multiply the bincount by to adjust for the
-    // throttling on that bin.
-    binCountScaleFactors = new double[binNames.length];
-    weightedMinimumDepths = new double[binNames.length];
-
-    // NOTE: We must be sure to adjust the return value by the factor calculated due to performance; a slower throttle rate
-    // should yield a lower priority.  In theory it should be possible to calculate an adjusted priority pretty exactly,
-    // on the basis that the fetch rates of two distinct bins should grant priorities such that:
-    //
-    //  (n documents) / (the rate of fetch (docs/millisecond) of the first bin) = milliseconds for the first bin
-    //
-    //  should equal:
-    //
-    //  (m documents) / (the rate of fetch of the second bin) = milliseconds for the second bin
-    //
-    // ... and then assigning priorities so that after a given number of document priorities are assigned from the first bin, the
-    // corresponding (*m/n) number of document priorities would get assigned for the second bin.
-    //
-    // Suppose the maximum fetch rate for the document is F fetches per millisecond.  If the document priority assigned for the Bth
-    // bin member is -log(1/(1+B)) for a document fetched with no throttling whatsoever,
-    // then we want the priority to be -log(1/(1+k)) for a throttled bin, where k is chosen so that:
-    // k = B * ((T + 1/F)/T) = B * (1 + 1/TF)
-    // ... where T is the time taken to fetch a single document that has no throttling at all.
-    // For the purposes of this exercise, a value of 100 doc/sec, or T=10ms.
-    //
-    // Basically, for F = 0, k should be infinity, and for F = infinity, k should be B.
-
-    // First, calculate the document's max fetch rate, in fetches per millisecond.  This will be used to adjust the priority, and
-    // also when resetting the bin counts.
-    double[] maxFetchRates = calculateMaxFetchRates(binNames,connection);
-
-    // Before calculating priority, calculate some factors that will allow us to determine the proper starting value for a bin.
-    // First thing to do is to reset the bin values based on the current minimum.
-    for (int i = 0; i < binNames.length; i++)
-    {
-      String binName = binNames[i];
-      // Remember, maxFetchRate is in fetches per ms.
-      double maxFetchRate = maxFetchRates[i];
-
-      // Calculate (and save for later) the scale factor for this bin.
-      double binCountScaleFactor;
-      if (maxFetchRate == 0.0)
-        binCountScaleFactor = Double.POSITIVE_INFINITY;
-      else
-        binCountScaleFactor = 1.0 + 1.0 / (minMsPerFetch * maxFetchRate);
-      binCountScaleFactors[i] = binCountScaleFactor;
-      weightedMinimumDepths[i] = currentMinimumDepth / binCountScaleFactor;
-    }
-    
-  }
-  
-  /** Log a preload request for this priority value.
-  */
-  public void makePreloadRequest()
-  {
-    for (int i = 0; i < binNames.length; i++)
-    {
-      String binName = binNames[i];
-      rt.addPreloadRequest(connection.getClassName(), binName, weightedMinimumDepths[i]);
-    }
-
-  }
-
-  /** Calculate a document priority value.  Priorities are reversed, and in log space, so that
-  * zero (0.0) is considered the highest possible priority, and larger priority values are considered lower in actual priority.
-  *@param binNames are the global bins to which the document belongs.
-  *@param connection is the connection, from which the throttles may be obtained.  More highly throttled connections are given
-  *          less favorable priority.
-  *@return the priority value, based on recent history.  Also updates statistics atomically.
-  */
-  @Override
-  public double getDocumentPriority()
-    throws ManifoldCFException
-  {
-     if (cachedValue != null)
-       return cachedValue.doubleValue();
-
-    double highestAdjustedCount = 0.0;
-    // Find the bin with the largest effective count, and use that for the document's priority.
-    // (This of course assumes that the slowest throttle is the one that wins.)
-    for (int i = 0; i < binNames.length; i++)
-    {
-      String binName = binNames[i];
-      double binCountScaleFactor = binCountScaleFactors[i];
-      double weightedMinimumDepth = weightedMinimumDepths[i];
-
-      double thisCount = rt.getIncrementBinValue(connection.getClassName(),binName,weightedMinimumDepth);
-      double adjustedCount;
-      // Use the scale factor already calculated above to yield a priority that is adjusted for the fetch rate.
-      if (binCountScaleFactor == Double.POSITIVE_INFINITY)
-        adjustedCount = Double.POSITIVE_INFINITY;
-      else
-        adjustedCount = thisCount * binCountScaleFactor;
-      if (adjustedCount > highestAdjustedCount)
-        highestAdjustedCount = adjustedCount;
-    }
-    
-    // Calculate the proper log value
-    double returnValue;
-    
-    if (highestAdjustedCount == Double.POSITIVE_INFINITY)
-      returnValue = Double.POSITIVE_INFINITY;
-    else
-      returnValue = Math.log(1.0 + highestAdjustedCount);
-
-    if (Logging.scheduling.isDebugEnabled())
-    {
-      StringBuilder sb = new StringBuilder();
-      int k = 0;
-      while (k < binNames.length)
-      {
-        sb.append(binNames[k++]).append(" ");
-      }
-      Logging.scheduling.debug("Document '"+documentIdentifier+"' with bins ["+sb.toString()+"] given priority value "+new Double(returnValue).toString());
-    }
-
-    cachedValue = new Double(returnValue);
-
-    return returnValue;
-  }
-
-
-  /** Calculate the maximum fetch rate for a given set of bins for a given connection.
-  * This is used to adjust the final priority of a document.
-  */
-  protected static double[] calculateMaxFetchRates(String[] binNames, IRepositoryConnection connection)
-  {
-    ThrottleLimits tl = new ThrottleLimits(connection);
-    return tl.getMaximumRates(binNames);
-  }
-
-  /** This class represents the throttle limits out of the connection specification */
-  protected static class ThrottleLimits
-  {
-    protected List<ThrottleLimitSpec> specs = new ArrayList<ThrottleLimitSpec>();
-
-    public ThrottleLimits(IRepositoryConnection connection)
-    {
-      String[] throttles = connection.getThrottles();
-      int i = 0;
-      while (i < throttles.length)
-      {
-        try
-        {
-          specs.add(new ThrottleLimitSpec(throttles[i],(double)connection.getThrottleValue(throttles[i])));
-        }
-        catch (PatternSyntaxException e)
-        {
-        }
-        i++;
-      }
-    }
-
-    public double[] getMaximumRates(String[] binNames)
-    {
-      double[] rval = new double[binNames.length];
-      for (int j = 0 ; j < binNames.length ; j++)
-      {
-        String binName = binNames[j];
-        double maxRate = Double.POSITIVE_INFINITY;
-        for (ThrottleLimitSpec spec : specs)
-        {
-          Pattern p = spec.getRegexp();
-          Matcher m = p.matcher(binName);
-          if (m.find())
-          {
-            double rate = spec.getMaxRate();
-            // The direction of this inequality reflects the fact that the throttling is conservative when more rules are present.
-            if (rate < maxRate)
-              maxRate = rate;
-          }
-        }
-        rval[j] = maxRate;
-      }
-      return rval;
-    }
-
-  }
-
-  /** This is a class which describes an individual throttle limit, in fetches per millisecond. */
-  protected static class ThrottleLimitSpec
-  {
-    /** Regexp */
-    protected final Pattern regexp;
-    /** The fetch limit for all bins matching that regexp, in fetches per millisecond */
-    protected final double maxRate;
-
-    /** Constructor */
-    public ThrottleLimitSpec(String regexp, double maxRate)
-      throws PatternSyntaxException
-    {
-      this.regexp = Pattern.compile(regexp);
-      this.maxRate = maxRate;
-    }
-
-    /** Get the regexp. */
-    public Pattern getRegexp()
-    {
-      return regexp;
-    }
-
-    /** Get the max count */
-    public double getMaxRate()
-    {
-      return maxRate;
-    }
-  }
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/QueuedDocument.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/QueuedDocument.java
deleted file mode 100644
index c36c3d6..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/QueuedDocument.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/* $Id: QueuedDocument.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-
-import java.util.*;
-
-/** This class represents a document that will be placed on the document queue, and will be
-* processed by a worker thread.
-* The reason that DocumentDescription by itself is not used has to do with the fact that
-* a good deal more information about the document must be obtained in order to find the
-* last version ingested (which must be done in bulk, for performance reasons).  Since we
-* are finding everything anyway, it makes sense to put what we have in a structure so
-* that the worker threads don't need to repeat what the stuffer thread did.
-*/
-public class QueuedDocument
-{
-  public static final String _rcsid = "@(#)$Id: QueuedDocument.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The document description. */
-  protected final DocumentDescription documentDescription;
-  /** The last ingested status, null meaning "never ingested". */
-  protected final Map<String,DocumentIngestStatusSet> lastIngestedStatus;
-  /** The binnames for the document, according to the connector */
-  protected final String[] binNames;
-  /** This flag indicates whether the document has been processed or not. */
-  protected boolean wasProcessed = false;
-
-  /** Constructor.
-  *@param documentDescription is the document description.
-  *@param lastIngestedStatus is the document's last ingested status.
-  *@param binNames are the bins associated with the document.
-  */
-  public QueuedDocument(DocumentDescription documentDescription, Map<String,DocumentIngestStatusSet> lastIngestedStatus, String[] binNames)
-  {
-    this.documentDescription = documentDescription;
-    this.lastIngestedStatus = lastIngestedStatus;
-    this.binNames = binNames;
-  }
-
-  /** Get the document description.
-  *@return the document description.
-  */
-  public DocumentDescription getDocumentDescription()
-  {
-    return documentDescription;
-  }
-
-  /** Get the last ingested status.
-  *@param outputConnectionName is the name of the output connection.
-  *@return the last ingested status for that output, or null if not found.
-  */
-  public DocumentIngestStatusSet getLastIngestedStatus(String outputConnectionName)
-  {
-    if (lastIngestedStatus == null)
-      return null;
-    return lastIngestedStatus.get(outputConnectionName);
-  }
-
-  /** Return true if there are *any* last ingested records.
-  *@return true if any last ingested records exist.
-  */
-  public boolean anyLastIngestedRecords()
-  {
-    if (lastIngestedStatus == null)
-      return false;
-    return lastIngestedStatus.size() > 0;
-  }
-  
-  /** Get the bin names for this document */
-  public String[] getBinNames()
-  {
-    return binNames;
-  }
-
-  /** Check if document has been processed yet.
-  *@return true if processed, false if not.
-  */
-  public boolean wasProcessed()
-  {
-    return wasProcessed;
-  }
-
-  /** Note that the document was processed in some way.
-  */
-  public void setProcessed()
-  {
-    wasProcessed = true;
-  }
-
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/QueuedDocumentSet.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/QueuedDocumentSet.java
deleted file mode 100644
index adf28f9..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/QueuedDocumentSet.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/* $Id: QueuedDocumentSet.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.util.*;
-
-/** This class is what's actually queued.  It is immutable and it represents an array or set of QueuedDocument objects, all of which
-* will be processed by a single worker thread in bulk.
-*/
-public class QueuedDocumentSet
-{
-  public static final String _rcsid = "@(#)$Id: QueuedDocumentSet.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** This is the array of QueuedDocument objects. */
-  protected final QueuedDocument[] documents;
-  /** The job description that applies to this document set.  There is no guarantee that
-  * this won't change before we get around to processing the document; therefore any
-  * job-based metadata changes will also need to go through the queue mechanism. */
-  protected final IJobDescription jobDescription;
-  /** The connection description that applies to this document set. */
-  protected final IRepositoryConnection connection;
-
-  /** Constructor.
-  *@param documents is the arraylist representing the documents accumulated for a single connection.
-  */
-  public QueuedDocumentSet(List<QueuedDocument> documents, IJobDescription jobDescription, IRepositoryConnection connection)
-  {
-    this.documents = (QueuedDocument[])documents.toArray(new QueuedDocument[0]);
-    this.jobDescription = jobDescription;
-    this.connection = connection;
-  }
-
-  /** Get the number of documents.
-  *@return the number.
-  */
-  public int getCount()
-  {
-    return documents.length;
-  }
-
-  /** Get the nth document.
-  *@param index is the document number.
-  *@return the document.
-  */
-  public QueuedDocument getDocument(int index)
-  {
-    return documents[index];
-  }
-
-  /** Log that we are beginning the processing of a set of documents */
-  public void beginProcessing(QueueTracker queueTracker)
-  {
-    int l = 0;
-    while (l < documents.length)
-    {
-      QueuedDocument d = documents[l++];
-      if (Logging.scheduling.isDebugEnabled())
-      {
-        StringBuilder sb = new StringBuilder();
-        for (String binName : d.getBinNames())
-        {
-          sb.append(binName).append(" ");
-        }
-        Logging.scheduling.debug("Handing document '"+d.getDocumentDescription().getDocumentIdentifier()+"' with bins ["+sb.toString()+"] to worker thread");
-      }
-
-      queueTracker.beginProcessing(d.getBinNames());
-    }
-  }
-
-  /** Log that we are done processing a set of documents */
-  public void endProcessing(QueueTracker queueTracker)
-  {
-    int l = 0;
-    while (l < documents.length)
-    {
-      QueuedDocument d = documents[l++];
-      if (Logging.scheduling.isDebugEnabled())
-      {
-        StringBuilder sb = new StringBuilder();
-        for (String binName : d.getBinNames())
-        {
-          sb.append(binName).append(" ");
-        }
-        Logging.scheduling.debug("Worker thread done document '"+d.getDocumentDescription().getDocumentIdentifier()+"' with bins ["+sb.toString()+"]");
-      }
-
-      queueTracker.endProcessing(d.getBinNames());
-    }
-
-  }
-
-  /** Calculate a rating for this set.
-  *@param overlapCalculator is the calculator object.
-  *@return the rating.
-  */
-  public double calculateAssignmentRating(QueueTracker overlapCalculator)
-  {
-    // This rating is the average across all documents in the set.
-    double ratingAccumulator = 0.0;
-    int i = 0;
-    while (i < documents.length)
-    {
-      QueuedDocument d = documents[i++];
-      double rating = overlapCalculator.calculateAssignmentRating(d.getBinNames(),connection);
-      if (false && Logging.scheduling.isDebugEnabled())
-      {
-        StringBuilder sb = new StringBuilder();
-        for (String binName : d.getBinNames())
-        {
-          sb.append(binName).append(" ");
-        }
-        Logging.scheduling.debug("Document '"+d.getDocumentDescription().getDocumentIdentifier()+"' with bins ["+sb.toString()+"] given assignment rating "+new Double(rating).toString());
-      }
-
-      ratingAccumulator += rating;
-    }
-
-    return ratingAccumulator / (double)documents.length;
-  }
-
-  /** Get the job description.
-  *@return the job description.
-  */
-  public IJobDescription getJobDescription()
-  {
-    return jobDescription;
-  }
-
-  /** Get the connection.
-  *@return the connection.
-  */
-  public IRepositoryConnection getConnection()
-  {
-    return connection;
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ResetManager.java
deleted file mode 100644
index 2a809f5..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ResetManager.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/* $Id: ResetManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** The reset manager basically keeps track of threads that work together.  If the
-* threads get hosed as a result of problems, then certain resets need to be done.
-* Each instance of this manager therefore tracks all the threads which depend or
-* affect a condition that needs explicit resetting.  When a thread recognizes that
-* the database (or whatever resource) is potentially in a state where a reset for
-* the particular condition is required, then the corresponding reset manager object
-* will cause all dependent threads to block, until they are all accounted for.
-* Then, the corrective reset is done, and the threads are released (with a signal
-* corresponding to the fact that a reset occurred returned).
-*
-* This class is meant to be extended in order to implement the exact reset
-* functionality required.
-*/
-public abstract class ResetManager
-{
-  public static final String _rcsid = "@(#)$Id: ResetManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Process ID */
-  protected final String processID;
-  
-  /** Boolean which describes whether an event requiring reset has occurred. */
-  protected volatile boolean resetRequired = false;
-  /** This is the count of the threads that care about this resource. */
-  protected int involvedThreadCount = 0;
-  /** This is the number of threads that are waiting for the reset. */
-  protected volatile int waitingThreads = 0;
-
-  /** Constructor.
-  */
-  public ResetManager(String processID)
-  {
-    this.processID = processID;
-  }
-
-  /** Register a thread with this reset manager.
-  */
-  public synchronized void registerMe()
-  {
-    involvedThreadCount++;
-  }
-
-  /** Note a resettable event.
-  */
-  public void noteEvent()
-  {
-    //System.out.println(this + " Event noted; involvedThreadCount = "+involvedThreadCount);
-    synchronized (this)
-    {
-      resetRequired = true;
-    }
-    performWakeupLogic();
-  }
-
-  /** Enter "wait" state for current thread.
-  * This method is the main logic for the reset manager.  A thread
-  * calls this method, which may block until all other threads are
-  * waiting too.  Then, the reset method is called by exactly ONE
-  * of the waiting threads, and they all are released.
-  * @return false if no reset took place, or true if one did.
-  */
-  public synchronized boolean waitForReset(IThreadContext tc)
-    throws ManifoldCFException, InterruptedException
-  {
-    if (resetRequired == false)
-      return false;
-
-    waitingThreads++;
-
-    // Check if this is the "Prince Charming" thread, who will wake up
-    // all the others.
-    if (waitingThreads == involvedThreadCount)
-    {
-      //System.out.println(this + " Prince Charming thread found!");
-      // Kick off reset, and wake everyone up
-      // There's a question of what to do if the reset fails.
-      // Right now, my notion is that we throw the exception
-      // in the current thread, and just make sure everything
-      // is tracked.
-      try
-      {
-        performResetLogic(tc, processID);
-      }
-      finally
-      {
-        // MUST do all this in the finally block, because if the reset fails we'll wind up with
-        // all threads blocked if we don't.  All waiting threads will be restarted, and will fail
-        // again, but that's the only way we can retry.
-        waitingThreads = 0;
-        resetRequired = false;
-        notifyAll();
-      }
-      return true;
-    }
-
-    //System.out.println(this + " Waiting threads = "+waitingThreads+"; going to sleep");
-    // Just go to sleep until kicked.
-    wait();
-    // If we were awakened, it's because reset was fired.
-    return true;
-  }
-
-  /** Do the reset logic.
-  */
-  protected abstract void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException;
-
-  /** Do the wakeup logic.
-  */
-  protected abstract void performWakeupLogic();
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingActivity.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingActivity.java
deleted file mode 100644
index ad5c453..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingActivity.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/* $Id: SeedingActivity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the things you can do with the framework while
-* seeding.
-*/
-public class SeedingActivity implements ISeedingActivity
-{
-  public static final String _rcsid = "@(#)$Id: SeedingActivity.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // This is the maximum number of documents passed to the queue at one time.
-  protected static final int MAX_COUNT = 100;
-
-  // Variables
-  protected final String processID;
-  protected final String connectionName;
-  protected final IRepositoryConnectionManager connManager;
-  protected final IJobManager jobManager;
-  protected final IReprioritizationTracker rt;
-  protected final IRepositoryConnection connection;
-  protected final IRepositoryConnector connector;
-  protected final Long jobID;
-  protected final String[] legalLinkTypes;
-  protected final boolean overrideSchedule;
-  protected final int hopcountMethod;
-  
-  protected final String[] documentHashList = new String[MAX_COUNT];
-  protected final String[] documentList = new String[MAX_COUNT];
-  protected final String[][] documentPrereqList = new String[MAX_COUNT][];
-  protected int documentCount = 0;
-  protected final String[] remainingDocumentHashList = new String[MAX_COUNT];
-  protected int remainingDocumentCount = 0;
-
-  /** Constructor.
-  */
-  public SeedingActivity(String connectionName, IRepositoryConnectionManager connManager,
-    IJobManager jobManager,
-    IReprioritizationTracker rt, IRepositoryConnection connection, IRepositoryConnector connector,
-    Long jobID, String[] legalLinkTypes, boolean overrideSchedule, int hopcountMethod, String processID)
-  {
-    this.processID = processID;
-    this.connectionName = connectionName;
-    this.connManager = connManager;
-    this.jobManager = jobManager;
-    this.rt = rt;
-    this.connection = connection;
-    this.connector = connector;
-    this.jobID = jobID;
-    this.legalLinkTypes = legalLinkTypes;
-    this.overrideSchedule = overrideSchedule;
-    this.hopcountMethod = hopcountMethod;
-  }
-
-  /** Record a "seed" document identifier.
-  * Seeds passed to this method will be loaded into the job's queue at the beginning of the
-  * job's execution, and for continuous crawling jobs, periodically throughout the crawl.
-  *
-  * All documents passed to this method are placed on the "pending documents" list, and are marked as being seed
-  * documents.  All pending documents will be processed to determine if they have changed or have been deleted.
-  * It is not a big problem if the connector chooses to put more documents onto the pending list than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  *
-  *@param documentIdentifier is the identifier of the document to add to the "pending" queue.
-  *@param prereqEventNames is the list of prerequisite events required for this document, or null if none.
-  */
-  public void addSeedDocument(String documentIdentifier, String[] prereqEventNames)
-    throws ManifoldCFException
-  {
-    if (documentCount == MAX_COUNT)
-    {
-      // Prioritize and write the seed documents.
-      writeSeedDocuments(documentHashList,documentList,documentPrereqList);
-      documentCount = 0;
-    }
-    documentHashList[documentCount] = ManifoldCF.hash(documentIdentifier);
-    documentList[documentCount] = documentIdentifier;
-    if (prereqEventNames != null)
-      documentPrereqList[documentCount] = prereqEventNames;
-    else
-      documentPrereqList[documentCount] = null;
-    documentCount++;
-  }
-
-  /** Record a "seed" document identifier.
-  * Seeds passed to this method will be loaded into the job's queue at the beginning of the
-  * job's execution, and for continuous crawling jobs, periodically throughout the crawl.
-  *
-  * All documents passed to this method are placed on the "pending documents" list, and are marked as being seed
-  * documents.  All pending documents will be processed to determine if they have changed or have been deleted.
-  * It is not a big problem if the connector chooses to put more documents onto the pending list than are
-  * strictly necessary; it is merely a question of overall work required.
-  *
-  * Note that it is always ok to send MORE documents rather than less to this method.
-  *
-  *@param documentIdentifier is the identifier of the document to add to the "pending" queue.
-  */
-  public void addSeedDocument(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    addSeedDocument(documentIdentifier,null);
-  }
-
-  /** This method receives document identifiers that should be considered part of the seeds, but do not need to be
-  * queued for processing at this time.  (This method is used to keep the hopcount tables up to date.)  It is
-  * allowed to receive more identifiers than it strictly needs to, specifically identifiers that may have also been
-  * sent to the addSeedDocuments() method above.  However, the connector must constrain the identifiers
-  * it sends by the document specification.
-  * This method is only required to be called at all if the connector supports hopcount determination (which it
-  * should signal by having more than zero legal relationship types returned by the getRelationshipTypes() method).
-  *
-  *@param documentIdentifier is the identifier of the document to consider as a seed, but not to put in the
-  * "pending" queue.
-  */
-  public void addUnqueuedSeedDocument(String documentIdentifier)
-    throws ManifoldCFException
-  {
-    if (remainingDocumentCount == MAX_COUNT)
-    {
-      // Flush the remaining documents
-      jobManager.addRemainingDocumentsInitial(processID,jobID,legalLinkTypes,remainingDocumentHashList,hopcountMethod);
-      remainingDocumentCount = 0;
-    }
-    remainingDocumentHashList[remainingDocumentCount++] = ManifoldCF.hash(documentIdentifier);
-  }
-
-  /** Finish a seeding pass */
-  public void doneSeeding(boolean isPartial)
-    throws ManifoldCFException
-  {
-    if (documentCount > 0)
-    {
-      String[] documentHashes = new String[documentCount];
-      String[] documents = new String[documentCount];
-      String[][] documentPrereqs = new String[documentCount][];
-      int i = 0;
-      while (i < documentHashes.length)
-      {
-        documentHashes[i] = documentHashList[i];
-        documents[i] = documentList[i];
-        documentPrereqs[i] = documentPrereqList[i];
-        i++;
-      }
-      writeSeedDocuments(documentHashes,documents,documentPrereqs);
-      documentCount = 0;
-    }
-    if (remainingDocumentCount > 0)
-    {
-      String[] documents = new String[remainingDocumentCount];
-      int i = 0;
-      while (i < documents.length)
-      {
-        documents[i] = remainingDocumentHashList[i];
-        i++;
-      }
-      jobManager.addRemainingDocumentsInitial(processID,jobID,legalLinkTypes,documents,hopcountMethod);
-      remainingDocumentCount = 0;
-    }
-
-    // Need to signal JobManager that seeding is done.
-    jobManager.doneDocumentsInitial(jobID,legalLinkTypes,isPartial,hopcountMethod);
-  }
-
-  /** Record time-stamped information about the activity of the connector.
-  *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-  *       activity has an associated time; the startTime field records when the activity began.  A null value
-  *       indicates that the start time and the finishing time are the same.
-  *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-  *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-  *       "fetch document" activity.  Cannot be null.
-  *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-  *@param entityIdentifier is a (possibly long) string which identifies the object involved in the history record.
-  *       The interpretation of this field will differ from connector to connector.  May be null.
-  *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-  *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-  *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-  *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-  *@param childIdentifiers is a set of child entity identifiers associated with this activity.  May be null.
-  */
-  public void recordActivity(Long startTime, String activityType, Long dataSize,
-    String entityIdentifier, String resultCode, String resultDescription, String[] childIdentifiers)
-    throws ManifoldCFException
-  {
-    connManager.recordHistory(connectionName,startTime,activityType,dataSize,entityIdentifier,resultCode,
-      resultDescription,childIdentifiers);
-  }
-
-  /** Write specified documents after calculating their priorities */
-  protected void writeSeedDocuments(String[] docIDHashes, String[] docIDs, String[][] prereqEventNames)
-    throws ManifoldCFException
-  {
-    // First, prioritize the documents using the queue tracker
-    IPriorityCalculator[] docPriorities = new IPriorityCalculator[docIDHashes.length];
-
-    rt.clearPreloadRequests();
-
-    for (int i = 0 ; i < docIDHashes.length ; i++)
-    {
-      // Calculate desired document priority based on current queuetracker status.
-      String[] bins = connector.getBinNames(docIDs[i]);
-      PriorityCalculator p = new PriorityCalculator(rt,connection,bins,docIDs[i]);
-      docPriorities[i] = p;
-      p.makePreloadRequest();
-    }
-
-    rt.preloadBinValues();
-
-    jobManager.addDocumentsInitial(processID,
-      jobID,legalLinkTypes,docIDHashes,docIDs,overrideSchedule,hopcountMethod,
-      docPriorities,prereqEventNames);
-
-  }
-
-  /** Check whether current job is still active.
-  * This method is provided to allow an individual connector that needs to wait on some long-term condition to give up waiting due to the job
-  * itself being aborted.  If the connector should abort, this method will raise a properly-formed ServiceInterruption, which if thrown to the
-  * caller, will signal that the current seeding activity remains incomplete and must be retried when the job is resumed.
-  */
-  public void checkJobStillActive()
-    throws ManifoldCFException, ServiceInterruption
-  {
-    if (jobManager.checkJobActive(jobID) == false)
-      throw new ServiceInterruption("Job no longer active",System.currentTimeMillis());
-  }
-
-  /** Create a global string from a simple string.
-  *@param simpleString is the simple string.
-  *@return a global string.
-  */
-  public String createGlobalString(String simpleString)
-  {
-    return ManifoldCF.createGlobalString(simpleString);
-  }
-
-  /** Create a connection-specific string from a simple string.
-  *@param simpleString is the simple string.
-  *@return a connection-specific string.
-  */
-  public String createConnectionSpecificString(String simpleString)
-  {
-    return ManifoldCF.createConnectionSpecificString(connection.getName(),simpleString);
-  }
-
-  /** Create a job-based string from a simple string.
-  *@param simpleString is the simple string.
-  *@return a job-specific string.
-  */
-  public String createJobSpecificString(String simpleString)
-  {
-    return ManifoldCF.createJobSpecificString(jobID,simpleString);
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingResetManager.java
deleted file mode 100644
index b2723b2..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingResetManager.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** Class which handles reset for seeding thread pool (of which there's
-* typically only one member).  The reset action here
-* is to move the status of jobs back from "seeding" to normal.
-*/
-public class SeedingResetManager extends ResetManager
-{
-
-  /** Constructor. */
-  public SeedingResetManager(String processID)
-  {
-    super(processID);
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetSeedingWorkerStatus(processID);
-  }
-    
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingThread.java
deleted file mode 100644
index 613afec..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SeedingThread.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/* $Id: SeedingThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the background seeding thread.  Its job is to add
-* seeded documents from the connector periodically, during adaptive crawls
-* (which continue until stopped).  The actual use case is for creating a
-* connector that handles RSS feeds, including keeping them current and
-* handling deletions.
-*/
-public class SeedingThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: SeedingThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** Seeding reset manager */
-  protected final SeedingResetManager resetManager;
-  /** Process ID */
-  protected final String processID;
-
-  /** The number of documents that are added to the queue per transaction */
-  protected final static int MAX_COUNT = 100;
-
-  /** Constructor.
-  */
-  public SeedingThread(SeedingResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    setName("Seeding thread");
-    setDaemon(true);
-    this.resetManager = resetManager;
-    this.processID = processID;
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionMgr = RepositoryConnectionManagerFactory.make(threadContext);
-      IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      
-      String[] identifiers = new String[MAX_COUNT];
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          long currentTime = System.currentTimeMillis();
-
-          // Accumulate the wait before doing the next check.
-          // We start with 10 seconds, which is the maximum.  If there's a service request
-          // that's faster than that, we'll adjust the time downward.
-          long waitTime = 60000L;
-
-          Logging.threads.debug("Seeding thread woke up");
-
-          // Grab active, adaptive jobs (and set their state to xxxSEEDING as a side effect)
-          JobSeedingRecord[] seedJobs = jobManager.getJobsReadyForSeeding(processID,currentTime);
-
-          // Process these jobs, and do the seeding.  The seeding is based on what came back
-          // in the job start record for sync time.  If there's an interruption, we just go on
-          // to the next job, since the whole thing will retry anyhow.
-          try
-          {
-
-            if (seedJobs.length == 0)
-            {
-              Logging.threads.debug("Seeding thread found nothing to do");
-              ManifoldCF.sleep(waitTime);
-              continue;
-            }
-
-            if (Logging.threads.isDebugEnabled())
-              Logging.threads.debug("Seeding thread: Found "+Integer.toString(seedJobs.length)+" jobs to seed");
-
-            // Loop through jobs
-            int i = 0;
-            while (i < seedJobs.length)
-            {
-              JobSeedingRecord jsr = seedJobs[i++];
-              Long jobID = jsr.getJobID();
-              try
-              {
-                String lastSeedingVersion = jsr.getSeedingVersionString();
-                IJobDescription jobDescription = jobManager.load(jobID,true);
-                int jobType = jobDescription.getType();
-
-                int hopcountMethod = jobDescription.getHopcountMode();
-
-                IRepositoryConnection connection = connectionMgr.load(jobDescription.getConnectionName());
-                IRepositoryConnector connector = repositoryConnectorPool.grab(connection);
-                // Null will come back if the connector instance could not be obtained, so just skip in that case.
-                if (connector == null)
-                  continue;
-
-                String newSeedingVersion = null;
-                try
-                {
-                  
-                  // Get the number of link types.
-                  String[] legalLinkTypes = connector.getRelationshipTypes();
-
-                  int model = connector.getConnectorModel();
-
-                  try
-                  {
-
-                    SeedingActivity activity = new SeedingActivity(connection.getName(),connectionMgr,
-                      jobManager,rt,
-                      connection,connector,jobID,legalLinkTypes,false,hopcountMethod,processID);
-
-                    if (Logging.threads.isDebugEnabled())
-                      Logging.threads.debug("Seeding thread: Getting seeds for job "+jobID.toString());
-
-                    newSeedingVersion = connector.addSeedDocuments(activity,jobDescription.getSpecification(),lastSeedingVersion,currentTime,jobType);
-
-                    activity.doneSeeding(model==connector.MODEL_PARTIAL);
-
-                    if (Logging.threads.isDebugEnabled())
-                      Logging.threads.debug("Seeding thread: Done processing seeds from job "+jobID.toString());
-
-
-                  }
-                  catch (ServiceInterruption e)
-                  {
-                    if (!e.jobInactiveAbort())
-                    {
-                      Logging.jobs.warn("Seeding service interruption reported for job "+
-                        jobID+" connection '"+connection.getName()+"': "+
-                        e.getMessage(),e);
-                    }
-
-                    // If either we are going to be requeuing beyond the fail time, OR
-                    // the number of retries available has hit 0, THEN we treat this
-                    // as either an "ignore" or a hard error.
-                    if (!e.jobInactiveAbort() && (jsr.getFailTime() != -1L && jsr.getFailTime() < e.getRetryTime() ||
-                      jsr.getFailRetryCount() == 0))
-                    {
-                      // Treat this as a hard failure.
-                      if (e.isAbortOnFail())
-                      {
-                        // Note the error in the job, and transition to inactive state
-                        String message = e.jobInactiveAbort()?"":"Repeated service interruptions during seeding"+((e.getCause()!=null)?": "+e.getCause().getMessage():"");
-                        if (jobManager.errorAbort(jobID,message) && message.length() > 0)
-                          Logging.jobs.error(message,e.getCause());
-                        jsr.noteStarted();
-                      }
-                      else
-                      {
-                        // Not sure this can happen -- but just transition silently to active state
-                        jobManager.noteJobSeeded(jobID,newSeedingVersion);
-                        jsr.noteStarted();
-                      }
-                    }
-                    else
-                    {
-                      // Reset the job to the READYFORSTARTUP state, updating the failtime and failcount fields
-                      jobManager.retrySeeding(jsr,e.getFailTime(),e.getFailRetryCount());
-                      jsr.noteStarted();
-                    }
-                    // Go on to the next job
-                    continue;
-                  }
-                }
-                finally
-                {
-                  repositoryConnectorPool.release(connection,connector);
-                }
-
-
-                if (Logging.threads.isDebugEnabled())
-                  Logging.threads.debug("Seeding thread: Successfully reseeded job "+jobID.toString());
-
-                // Note that this job has been seeded!
-                jobManager.noteJobSeeded(jobID,newSeedingVersion);
-                jsr.noteStarted();
-
-              }
-              catch (ManifoldCFException e)
-              {
-                if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                  throw new InterruptedException();
-                if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-                  throw e;
-                if (jobManager.errorAbort(jobID,e.getMessage()))
-                  Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-                jsr.noteStarted();
-              }
-            }
-          }
-          finally
-          {
-            // Clean up all jobs that did not seed
-            ManifoldCFException exception = null;
-            int i = 0;
-            while (i < seedJobs.length)
-            {
-              JobSeedingRecord jsr = seedJobs[i++];
-              if (!jsr.wasStarted())
-              {
-                if (Logging.threads.isDebugEnabled())
-                  Logging.threads.debug("Seeding thread: aborting reseed for "+jsr.getJobID().toString());
-
-                // Clean up from failed seed.
-                try
-                {
-                  jobManager.resetSeedJob(jsr.getJobID());
-                }
-                catch (ManifoldCFException e)
-                {
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    throw e;
-                  exception = e;
-                }
-              }
-            }
-            if (exception != null)
-              throw exception;
-          }
-
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(waitTime);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Seeding thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("SeedingThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SetPriorityThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SetPriorityThread.java
deleted file mode 100644
index a1b6e35..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/SetPriorityThread.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/* $Id: SetPriorityThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class describes a thread whose job it is to continuously reset document priorities, based on recent
-* queuing activity.  The goal is to evenly distribute queued documents across jobs and within classes of documents
-* inside jobs.
-* The way it works is for the thread to do some number of pending documents at a time.  The documents are fetched in such
-* a way as to get the ones that have been least recently assessed preferentially.  The assessment process involves
-* getting hold of a connector for the job that owns the document, and calculating the priority based on the recent
-* history as maintained in the queueTracker object.
-*/
-public class SetPriorityThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: SetPriorityThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** This is the number of documents per cycle */
-  protected final int cycleCount;
-  /** The blocking documents object */
-  protected final BlockingDocuments blockingDocuments;
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  */
-  public SetPriorityThread(int workerThreadCount, BlockingDocuments blockingDocuments, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.blockingDocuments = blockingDocuments;
-    this.processID = processID;
-    cycleCount = workerThreadCount * 10;
-    setName("Set priority thread");
-    setDaemon(true);
-    // This thread's priority is highest so that stuffer thread does not go wanting
-    setPriority(MAX_PRIORITY);
-  }
-
-  public void run()
-  {
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      
-      Logging.threads.debug("Set priority thread coming up");
-
-      // Job description map (local) - designed to improve performance.
-      // Cleared and reloaded on every batch of documents.
-      HashMap jobDescriptionMap = new HashMap();
-
-      // Repository connection map (local) - designed to improve performance.
-      // Cleared and reloaded on every batch of documents.
-      HashMap connectionMap = new HashMap();
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          Logging.threads.debug("Set priority thread woke up");
-
-          // We're going to go through all eligible documents.  We will pick them up in
-          // chunks however.
-          long currentTime = System.currentTimeMillis();
-
-          // Note well:
-          // The priority that is given to a document is based on what priorities have been handed out in the past.  It is based
-          // on the documents that have been queued for action, what job they belong to, the throttling in effect for the job,
-          // and what the connection says that the document's throttling bins are.
-          // Periodically, however, QueueTracker deliberately destroys the history.  My thinking here is that we need to "start over"
-          // periodically to guarantee that we respond appropriately to changes in the environment - specifically, starting and
-          // stopping jobs, changing throttling parameters, etc.
-
-          // Clear the job description map and connection map
-          jobDescriptionMap.clear();
-          connectionMap.clear();
-
-          // Do up to cycleCount documents in a "block".  Beyond this number we reset everything and loop back around.
-          // This allows everything to restart, and higher priority documents can be found again.
-          int processedCount = 0;
-          while (true)
-          {
-            if (Thread.currentThread().isInterrupted())
-              throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-            if (processedCount >= cycleCount)
-            {
-              Logging.threads.debug("Done reprioritizing because exceeded cycle count");
-              break;
-            }
-
-            // Cycle through the current list of stuffer-identified documents until we come to the end.  Reprioritize these
-            // first.  NOTE: These documents will already have document priorities.
-            DocumentDescription desc = blockingDocuments.getBlockingDocument();
-            if (desc != null)
-            {
-              ManifoldCF.writeDocumentPriorities(threadContext,
-                new DocumentDescription[]{desc},connectionMap,jobDescriptionMap);
-              processedCount++;
-              continue;
-            }
-	    
-            // Grab a list of document identifiers to set priority on.
-            // We may well wind up calculating priority for documents that wind up having their
-            // state changed before we can write back, but this is okay because update is only
-            // going to be permitted for rows that still have the right state.
-            DocumentDescription[] descs = jobManager.getNextNotYetProcessedReprioritizationDocuments(processID,1000);
-            if (descs.length > 0)
-            {
-              ManifoldCF.writeDocumentPriorities(threadContext,
-                descs,connectionMap,jobDescriptionMap);
-              processedCount += descs.length;
-              continue;
-            }
-
-            Logging.threads.debug("Done reprioritizing because no more documents to reprioritize");
-            ManifoldCF.sleep(5000L);
-            break;
-
-          }
-
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            Logging.threads.error("Set priority thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("SetPriorityThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartDeleteThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartDeleteThread.java
deleted file mode 100644
index 082673b..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartDeleteThread.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the start delete thread.  This thread's job is to detect when a job is
-* ready for deletion, initialize it, and put it into the DELETING state.
-*/
-public class StartDeleteThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Delete startup reset manager */
-  protected final DeleteStartupResetManager resetManager;
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  */
-  public StartDeleteThread(DeleteStartupResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.resetManager = resetManager;
-    this.processID = processID;
-    setName("Delete startup thread");
-    setDaemon(true);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionMgr = RepositoryConnectionManagerFactory.make(threadContext);
-
-      IDBInterface database = DBInterfaceFactory.make(threadContext,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // Accumulate the wait before doing the next check.
-          // We start with 10 seconds, which is the maximum.  If there's a service request
-          // that's faster than that, we'll adjust the time downward.
-          long waitTime = 10000L;
-
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Checking for deleting jobs");
-
-          // See if there are any starting jobs.
-          // Note: Since this following call changes the job state, we must be careful to reset it on any kind of failure.
-          JobDeleteRecord[] deleteJobs = jobManager.getJobsReadyForDeleteCleanup(processID);
-          try
-          {
-
-            if (deleteJobs.length == 0)
-            {
-              ManifoldCF.sleep(waitTime);
-              continue;
-            }
-
-            if (Logging.threads.isDebugEnabled())
-              Logging.threads.debug("Found "+Integer.toString(deleteJobs.length)+" jobs ready to be deleted");
-
-            long currentTime = System.currentTimeMillis();
-
-
-            // Loop through jobs
-            int i = 0;
-            while (i < deleteJobs.length)
-            {
-              JobDeleteRecord jsr = deleteJobs[i++];
-              Long jobID = jsr.getJobID();
-	      try
-	      {
-		jobManager.prepareDeleteScan(jobID);
-                // Start deleting this job!
-                jobManager.noteJobDeleteStarted(jobID,currentTime);
-                jsr.noteStarted();
-              }
-              catch (ManifoldCFException e)
-              {
-                if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                  throw new InterruptedException();
-                if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-                  throw e;
-		// We cannot abort the delete startup, but if we fall through, we'll put the job back into
-		// the state whence it came.  So, fall through.
-		Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-              }
-            }
-          }
-          finally
-          {
-            // Clean up all jobs that did not start
-            ManifoldCFException exception = null;
-            int i = 0;
-            while (i < deleteJobs.length)
-            {
-              JobDeleteRecord jsr = deleteJobs[i++];
-              if (!jsr.wasStarted())
-              {
-                // Clean up from failed start.
-                try
-                {
-                  jobManager.resetStartDeleteJob(jsr.getJobID());
-                }
-                catch (ManifoldCFException e)
-                {
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    throw e;
-                  exception = e;
-                }
-              }
-            }
-            if (exception != null)
-              throw exception;
-          }
-
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(waitTime);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Start delete thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("StartDeleteThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartupResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartupResetManager.java
deleted file mode 100644
index 55e0e12..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartupResetManager.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** Class which handles reset for seeding thread pool (of which there's
-* typically only one member).  The reset action here
-* is to move the status of jobs back from "seeding" to normal.
-*/
-public class StartupResetManager extends ResetManager
-{
-
-  /** Constructor. */
-  public StartupResetManager(String processID)
-  {
-    super(processID);
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetStartupWorkerStatus(processID);
-  }
-    
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartupThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartupThread.java
deleted file mode 100644
index 5a61f00..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StartupThread.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/* $Id: StartupThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the startup thread.  This thread's job is to detect when a job is starting, and stuff its queue
-* appropriately.  Finally, the job is marked as "started".
-*/
-public class StartupThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: StartupThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  // Local data
-  /** Process ID */
-  protected final String processID;
-  /** Reset manager */
-  protected final StartupResetManager resetManager;
-  
-  /** Constructor.
-  */
-  public StartupThread(StartupResetManager resetManager, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    setName("Startup thread");
-    setDaemon(true);
-    this.resetManager = resetManager;
-    this.processID = processID;
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connectionMgr = RepositoryConnectionManagerFactory.make(threadContext);
-      IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // Accumulate the wait before doing the next check.
-          // We start with 10 seconds, which is the maximum.  If there's a service request
-          // that's faster than that, we'll adjust the time downward.
-          long waitTime = 10000L;
-
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Checking for starting jobs");
-
-          // See if there are any starting jobs.
-          // Note: Since this following call changes the job state, we must be careful to reset it on any kind of failure.
-          JobStartRecord[] startupJobs = jobManager.getJobsReadyForStartup(processID);
-          try
-          {
-
-            if (startupJobs.length == 0)
-            {
-              ManifoldCF.sleep(waitTime);
-              continue;
-            }
-
-            if (Logging.threads.isDebugEnabled())
-              Logging.threads.debug("Found "+Integer.toString(startupJobs.length)+" jobs ready to be started");
-
-            long currentTime = System.currentTimeMillis();
-
-
-            // Loop through jobs
-            for (int i = 0; i < startupJobs.length; i++)
-            {
-              JobStartRecord jsr = startupJobs[i];
-              Long jobID = jsr.getJobID();
-              try
-              {
-                String lastSeedingVersion = jsr.getSeedingVersionString();
-                IJobDescription jobDescription = jobManager.load(jobID,true);
-
-                int jobType = jobDescription.getType();
-                int hopcountMethod = jobDescription.getHopcountMode();
-
-                IRepositoryConnection connection = connectionMgr.load(jobDescription.getConnectionName());
-                IRepositoryConnector connector = repositoryConnectorPool.grab(connection);
-
-                // If the attempt to grab a connector instance failed, don't start the job, of course.
-                if (connector == null)
-                  continue;
-
-                String newSeedingVersion = null;
-                try
-                {
-                  // Only now record the fact that we are trying to start the job.
-                  connectionMgr.recordHistory(jobDescription.getConnectionName(),
-                    null,connectionMgr.ACTIVITY_JOBSTART,null,
-                    jobID.toString()+"("+jobDescription.getDescription()+")",null,null,null);
-
-                  int model = connector.getConnectorModel();
-                  // Get the number of link types.
-                  String[] legalLinkTypes = connector.getRelationshipTypes();
-
-                  boolean requestMinimum = jsr.getRequestMinimum();
-                  
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug("Preparing job "+jobID.toString()+" for execution...");
-                  jobManager.prepareJobScan(jobID,legalLinkTypes,hopcountMethod,
-                    model,jobType == IJobDescription.TYPE_CONTINUOUS,lastSeedingVersion == null,
-                    requestMinimum);
-                  
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug("Prepared job "+jobID.toString()+" for execution.");
-
-                  try
-                  {
-                    SeedingActivity activity = new SeedingActivity(connection.getName(),connectionMgr,
-                      jobManager,rt,
-                      connection,connector,jobID,legalLinkTypes,true,hopcountMethod,processID);
-
-                    if (Logging.threads.isDebugEnabled())
-                      Logging.threads.debug("Adding initial seed documents for job "+jobID.toString()+"...");
-                    // Get the initial seed documents, and make sure those are added
-                    newSeedingVersion = connector.addSeedDocuments(activity,jobDescription.getSpecification(),lastSeedingVersion,currentTime,jobType);
-                    // Flush anything left
-                    activity.doneSeeding(model==connector.MODEL_PARTIAL);
-                    if (Logging.threads.isDebugEnabled())
-                      Logging.threads.debug("Done adding initial seed documents for job "+jobID.toString()+".");
-                  }
-                  catch (ServiceInterruption e)
-                  {
-                    if (!e.jobInactiveAbort())
-                    {
-                      Logging.jobs.warn("Startup service interruption reported for job "+
-                        jobID+" connection '"+connection.getName()+"': "+
-                        e.getMessage(),e);
-                    }
-
-                    // If either we are going to be requeuing beyond the fail time, OR
-                    // the number of retries available has hit 0, THEN we treat this
-                    // as either an "ignore" or a hard error.
-                    if (!e.jobInactiveAbort() && (jsr.getFailTime() != -1L && jsr.getFailTime() < e.getRetryTime() ||
-                      jsr.getFailRetryCount() == 0))
-                    {
-                      // Treat this as a hard failure.
-                      if (e.isAbortOnFail())
-                      {
-                        // Note the error in the job, and transition to inactive state
-                        String message = e.jobInactiveAbort()?"":"Repeated service interruptions during startup"+((e.getCause()!=null)?": "+e.getCause().getMessage():"");
-                        if (jobManager.errorAbort(jobID,message) && message.length() > 0)
-                          Logging.jobs.error(message,e.getCause());
-                        jsr.noteStarted();
-                      }
-                      else
-                      {
-                        // Not sure this can happen -- but just transition silently to active state
-                        jobManager.noteJobStarted(jobID,currentTime,newSeedingVersion);
-                        jsr.noteStarted();
-                      }
-                    }
-                    else
-                    {
-                      // Reset the job to the READYFORSTARTUP state, updating the failtime and failcount fields
-                      jobManager.retryStartup(jsr,e.getFailTime(),e.getFailRetryCount());
-                      jsr.noteStarted();
-                    }
-                    // Go on to the next job
-                    continue;
-                  }
-                }
-                finally
-                {
-                  repositoryConnectorPool.release(connection,connector);
-                }
-
-                // Start this job!
-                jobManager.noteJobStarted(jobID,currentTime,newSeedingVersion);
-                jsr.noteStarted();
-              }
-              catch (ManifoldCFException e)
-              {
-                if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                  throw new InterruptedException();
-                if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-                  throw e;
-                // Note: The error abort below will put the job in the "ABORTING" state. 
-                if (jobManager.errorAbort(jobID,e.getMessage()))
-                  Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-                jsr.noteStarted();
-              }
-            }
-          }
-          finally
-          {
-            // Clean up all jobs that did not start
-            ManifoldCFException exception = null;
-            int i = 0;
-            while (i < startupJobs.length)
-            {
-              JobStartRecord jsr = startupJobs[i++];
-              if (!jsr.wasStarted())
-              {
-                // Clean up from failed start.
-                try
-                {
-                  jobManager.resetStartupJob(jsr.getJobID());
-                }
-                catch (ManifoldCFException e)
-                {
-                  if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-                    throw e;
-                  exception = e;
-                }
-              }
-            }
-            if (exception != null)
-              throw exception;
-          }
-
-          // Sleep for the retry interval.
-          ManifoldCF.sleep(waitTime);
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Startup thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            // Shut the whole system down!
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("StartupThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StufferThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StufferThread.java
deleted file mode 100644
index 9f692c6..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/StufferThread.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/* $Id: StufferThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.Logging;
-import java.util.*;
-import java.lang.reflect.*;
-
-/** This class represents the stuffer thread.  This thread's job is to request documents from the database and add them to the
-* document queue.  The thread then sleeps until the document queue is empty again.
-*/
-public class StufferThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: StufferThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Write lock which allows us to keep track of the last time ANY stuffer thread stuffed data */
-  protected final static String stufferThreadLockName = "_STUFFERTHREAD_LOCK";
-  /** Datum which contains the last time, in milliseconds since epoch, that any stuffer thread in the cluster
-      successfully fired. */
-  protected final static String stufferThreadLastTimeDatumName = "_STUFFERTHREAD_LASTTIME";
-  
-  // Local data
-  
-  /** This is a reference to the static main document queue */
-  protected final DocumentQueue documentQueue;
-  /** Worker thread pool reset manager */
-  protected final WorkerResetManager resetManager;
-  /** This is the lowest number of entries we want ot stuff at any one time */
-  protected final int lowestStuffAmt;
-  /** This is the number of entries we want to stuff at any one time. */
-  protected int stuffAmt;
-  /** This is the low water mark for attempting to restuff */
-  protected final int lowWaterMark;
-  /** This is the queue tracker object. */
-  protected final QueueTracker queueTracker;
-  /** Blocking documents object. */
-  protected final BlockingDocuments blockingDocuments;
-  /** Process ID */
-  protected final String processID;
-  
-  /** Constructor.
-  *@param documentQueue is the document queue we'll be stuffing.
-  *@param n represents the number of threads that will be processing queued stuff, NOT the
-  * number of documents to be done at once!
-  */
-  public StufferThread(DocumentQueue documentQueue, int n, WorkerResetManager resetManager, QueueTracker qt,
-    BlockingDocuments blockingDocuments, float lowWaterFactor, float stuffSizeFactor, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.documentQueue = documentQueue;
-    this.lowWaterMark = (int)(lowWaterFactor * (float)n);
-    this.lowestStuffAmt = (int)(stuffSizeFactor * (float)n);
-    this.stuffAmt = lowestStuffAmt;
-    this.resetManager = resetManager;
-    this.queueTracker = qt;
-    this.blockingDocuments = blockingDocuments;
-    this.processID = processID;
-    setName("Stuffer thread");
-    setDaemon(true);
-    // The priority of this thread is higher than most others.  We want stuffing to proceed even if the machine
-    // is pretty busy already.
-    setPriority(getPriority()+1);
-  }
-
-  public void run()
-  {
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(threadContext);
-      IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      ILockManager lockManager = LockManagerFactory.make(threadContext);
-      IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      
-      Logging.threads.debug("Stuffer thread: Low water mark is "+Integer.toString(lowWaterMark)+"; amount per stuffing is "+Integer.toString(stuffAmt));
-
-      // Hashmap keyed by jobid and containing ArrayLists.
-      // This way we can guarantee priority will do the right thing, because the
-      // priority is per-job.  We CANNOT guarantee anything about scheduling order, however,
-      // other than that it falls in the time window.
-      Map<Long,List<QueuedDocument>> documentSets = new HashMap<Long,List<QueuedDocument>>();
-
-      // Job description map (local) - designed to improve performance.
-      // Cleared and reloaded on every batch of documents.
-      Map<Long,IJobDescription> jobDescriptionMap = new HashMap<Long,IJobDescription>();
-
-      // Repository connection map (local) - designed to improve performance.
-      // Cleared and reloaded on every batch of documents.
-      Map<String,IRepositoryConnection> connectionMap = new HashMap<String,IRepositoryConnection>();
-
-      // Parameters we need in order to adjust the number of documents we fetch.  We base the number on how long it took to queue documents vs.
-      // how long it took to need to queue again.
-      long lastQueueStart = -1L;
-      long lastQueueEnd = -1L;
-      boolean lastQueueFullResults = false;
-
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Check if we're okay
-          resetManager.waitForReset(threadContext);
-
-          // System.out.println("Waiting...");
-          // Wait until queue is below low water mark.
-          boolean isEmpty = documentQueue.checkIfEmpty(lowWaterMark);
-          if (isEmpty == false)
-          {
-            ManifoldCF.sleep(1000L);
-            continue;
-          }
-          long queueNeededTime = System.currentTimeMillis();
-
-          Logging.threads.debug("Document stuffer thread woke up");
-
-          // Adjust stuffAmt based on how well we did in the last queuing attempt keeping up with the worker threads.
-          if (lastQueueFullResults)
-          {
-            if (lastQueueEnd - lastQueueStart >= queueNeededTime - lastQueueEnd)
-              stuffAmt *= 2;
-            else if (lastQueueEnd - lastQueueStart < 4 * (queueNeededTime - lastQueueEnd))
-            {
-              stuffAmt /= 2;
-              if (stuffAmt < lowestStuffAmt)
-                stuffAmt = lowestStuffAmt;
-            }
-          }
-
-          // What we want to do is load enough documents to completely fill n queued document sets.
-          // The number n passed in here thus cannot be used in a query to limit the number of returned
-          // results.  Instead, it must be factored into the limit portion of the query.
-          
-          // Note well: the stuffer code stuffs based on intervals, so it is perfectly OK to 
-          // compute the interval for this request AND update the global "last time" even
-          // before actually firing off the query.  The worst that can happen is if the query
-          // fails, the interval will be "lost", and thus fewer documents will be stuffed than could
-          // be.
-          long stuffingStartTime;
-          long stuffingEndTime;
-          lockManager.enterWriteLock(stufferThreadLockName);
-          try
-          {
-            stuffingStartTime = readLastTime(lockManager);
-            stuffingEndTime = System.currentTimeMillis();
-            // Set the last time to be the current time
-            writeLastTime(lockManager,stuffingEndTime);
-          }
-          finally
-          {
-            lockManager.leaveWriteLock(stufferThreadLockName);
-          }
-
-          lastQueueStart = System.currentTimeMillis();
-          DepthStatistics depthStatistics = new DepthStatistics();
-          DocumentDescription[] descs = jobManager.getNextDocuments(processID,stuffAmt,stuffingEndTime,stuffingEndTime-stuffingStartTime,
-            blockingDocuments,queueTracker.getCurrentStatistics(),depthStatistics);
-          lastQueueEnd = System.currentTimeMillis();
-          lastQueueFullResults = (descs.length == stuffAmt);
-          
-          // Assess what we've done.
-          rt.assessMinimumDepth(depthStatistics.getBins());
-
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          if (Logging.threads.isDebugEnabled())
-          {
-            Logging.threads.debug("Stuffer thread: Found "+Integer.toString(descs.length)+" documents to queue");
-          }
-
-          // If there are no queuable documents at all, then we can sleep for a while.
-          // The theory is that we need to allow stuff to accumulate.
-          if (descs.length == 0)
-          {
-            ManifoldCF.sleep(2000L);       // 2 seconds
-            continue;
-          }
-
-          // if (Logging.threads.isDebugEnabled())
-          //      Logging.threads.debug("Found "+Integer.toString(descs.length)+" documents to stuff");
-
-          // Clear the job description map and connection map
-          jobDescriptionMap.clear();
-          connectionMap.clear();
-
-          // We need to get the last ingested version string for all of these documents, in bulk!
-
-          IJobDescription[] jobs = new IJobDescription[descs.length];
-          IRepositoryConnection[] connections = new IRepositoryConnection[descs.length];
-          Map[] versions = new HashMap[descs.length];
-          IPipelineSpecificationBasic[] pipelineSpecifications = new IPipelineSpecificationBasic[descs.length];
-          String[] documentClasses = new String[descs.length];
-          String[] documentIDHashes = new String[descs.length];
-
-          // Go through the documents and set up jobs, prefixed id's
-          Set<String> connectionNames = new HashSet<String>();
-          for (int i = 0; i < descs.length; i++)
-          {
-            DocumentDescription dd = descs[i];
-            IJobDescription job = jobDescriptionMap.get(dd.getJobID());
-            if (job == null)
-            {
-              job = jobManager.load(dd.getJobID(),true);
-              jobDescriptionMap.put(dd.getJobID(),job);
-            }
-            jobs[i] = job;
-            String connectionName = job.getConnectionName();
-            connectionNames.add(connectionName);
-            documentClasses[i] = connectionName;
-            pipelineSpecifications[i] = new PipelineSpecificationBasic(job);
-            IRepositoryConnection connection = connectionMap.get(connectionName);
-            if (connection == null)
-            {
-              connection = mgr.load(connectionName);
-              connectionMap.put(connectionName,connection);
-            }
-            connections[i] = connection;
-            documentIDHashes[i] = dd.getDocumentIdentifierHash();
-
-          }
-
-          IngestStatuses statuses = new IngestStatuses();
-          ingester.getPipelineDocumentIngestDataMultiple(statuses,pipelineSpecifications,documentClasses,documentIDHashes);
-          // Break apart the result.
-          for (int i = 0; i < descs.length; i++)
-          {
-            versions[i] = new HashMap<String,DocumentIngestStatus>();
-            for (int j = 0; j < pipelineSpecifications[i].getOutputCount(); j++)
-            {
-              String outputName = pipelineSpecifications[i].getStageConnectionName(pipelineSpecifications[i].getOutputStage(j));
-              DocumentIngestStatusSet statusSet = statuses.getStatus(documentClasses[i],documentIDHashes[i],outputName);
-              if (statusSet != null)
-                versions[i].put(outputName,statusSet);
-            }
-          }
-
-          // We need to go through the list, and segregate them by job, so the individual
-          // connectors can work in batch.
-          documentSets.clear();
-
-          // Prepare to grab all the connector instances we'll need
-          String[] orderingKeys = new String[connectionNames.size()];
-          IRepositoryConnection[] grabConnections = new IRepositoryConnection[connectionNames.size()];
-          int z = 0;
-          for (String connectionName : connectionNames)
-          {
-            orderingKeys[z] = connectionName;
-            IRepositoryConnection connection = connectionMap.get(connectionName);
-            grabConnections[z] = connection;
-            z++;
-          }
-
-          String[][] descBinNames = new String[descs.length][];
-          int[] descMaxDocuments = new int[descs.length];
-          try
-          {
-            IRepositoryConnector[] connectors = repositoryConnectorPool.grabMultiple(orderingKeys,grabConnections);
-            try
-            {
-              // Map from connection name to connector instance
-              Map<String,IRepositoryConnector> connectorMap = new HashMap<String,IRepositoryConnector>();
-              for (z = 0; z < orderingKeys.length; z++)
-              {
-                connectorMap.put(orderingKeys[z],connectors[z]);
-              }
-
-              for (int i = 0; i < descs.length; i++)
-              {
-                // We have to see how we are doing with respect to the limit for this connector.
-                // We also need to log the queuing activity to the queue tracker, so that
-                // the priority setter thread can do its thing properly.
-
-                // Get a repository connection appropriate for this document.
-                IRepositoryConnection connection = connections[i];
-                int maxDocuments;
-                String[] binNames;
-                // Grab a connector handle
-                IRepositoryConnector connector = connectorMap.get(connection.getName());
-                if (connector == null)
-                {
-                  maxDocuments = 1;
-                  binNames = new String[]{""};
-                }
-                else
-                {
-                  // Convert the document identifier to a URI
-                  maxDocuments = connector.getMaxDocumentRequest();
-                  // Get the bins for the document identifier
-                  binNames = connector.getBinNames(descs[i].getDocumentIdentifier());
-                }
-                descBinNames[i] = binNames;
-                descMaxDocuments[i] = maxDocuments;
-              }
-            }
-            finally
-            {
-              // Release all the connector instances we grabbed
-              repositoryConnectorPool.releaseMultiple(grabConnections,connectors);
-            }
-            
-          }
-          catch (ManifoldCFException e)
-          {
-            // If we were interrupted, then we are allowed to leave, because the process is terminating, but that's the only exception to the rule
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              throw e;
-
-            // Note: We really should never leave this block by throwing an exception, since that could easily leave dangling
-            // active jobqueue entries around.  Instead, log the error and continue IN ALL CASES.
-            Logging.threads.error("Stuffer thread ManifoldCF Exception thrown: "+e.getMessage()+" - continuing",
-              e);
-          }
-          catch (OutOfMemoryError e)
-          {
-            System.err.println("agents process ran out of memory - shutting down");
-            e.printStackTrace(System.err);
-            System.exit(-200);
-          }
-          catch (Throwable e)
-          {
-            // Note: We really should never leave this block by throwing an exception, since that could easily leave dangling
-            // active jobqueue entries around.  Instead, log the error and continue IN ALL CASES.
-            Logging.threads.fatal("Stuffer thread Throwable thrown: "+e.getMessage()+" - continuing",
-              e);
-          }
-
-          for (int i = 0; i < descs.length; i++)
-          {
-            Long jobID = jobs[i].getID();
-            String[] binNames = descBinNames[i];
-            if (binNames == null)
-              binNames = new String[]{""};
-            int maxDocuments = descMaxDocuments[i];
-            if (maxDocuments == 0)
-              maxDocuments = 1;
-            QueuedDocument qd = new QueuedDocument(descs[i],(Map<String,DocumentIngestStatusSet>)versions[i],binNames);
-
-            // Grab the arraylist that's there, or create it.
-            List<QueuedDocument> set = documentSets.get(jobID);
-            if (set == null)
-            {
-              set = new ArrayList<QueuedDocument>();
-              documentSets.put(jobID,set);
-            }
-            set.add(qd);
-
-            // Note the queuing activity
-            if (Logging.scheduling.isDebugEnabled())
-            {
-              StringBuilder sb = new StringBuilder();
-              int j = 0;
-              while (j < binNames.length)
-              {
-                sb.append(binNames[j++]).append(" ");
-              }
-              Logging.scheduling.debug("Putting document '"+descs[i].getDocumentIdentifier()+"' with bins ["+sb.toString()+"] onto active queue");
-            }
-            queueTracker.addRecord(binNames);
-
-            if (set.size() >= maxDocuments)
-            {
-              // Create and queue this as a document set
-              // if (Logging.threads.isDebugEnabled())
-              //      Logging.threads.debug("Queuing "+Integer.toString(set.size())+" documents in one request");
-              QueuedDocumentSet qds = new QueuedDocumentSet(set,jobs[i],connections[i]);
-              documentQueue.addDocument(qds);
-              set.clear();
-            }
-          }
-
-          // Stuff everything left into the queue.
-          for (int i = 0; i < descs.length; i++)
-          {
-            Long jobID = jobs[i].getID();
-            List<QueuedDocument> x = documentSets.get(jobID);
-            if (x != null && x.size() > 0)
-            {
-              QueuedDocumentSet set = new QueuedDocumentSet(x,jobs[i],connections[i]);
-              documentQueue.addDocument(set);
-              documentSets.remove(jobID);
-            }
-          }
-
-          // If we don't wait here, the other threads don't seem to have a chance to queue anything else up.
-          //Thread.yield();
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            resetManager.noteEvent();
-
-            Logging.threads.error("Stuffer thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // Log it, but keep the thread alive
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-          if (e.getErrorCode() == ManifoldCFException.SETUP_ERROR)
-          {
-            System.exit(1);
-          }
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("StufferThread initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-  }
-
-  protected static long readLastTime(ILockManager lockManager)
-    throws ManifoldCFException
-  {
-    byte[] data = lockManager.readData(stufferThreadLastTimeDatumName);
-    if (data == null || data.length != 8)
-      return System.currentTimeMillis();
-    long value = (((long)data[0]) & 0xffL) +
-      ((((long)data[1]) << 8) & 0xff00L) +
-      ((((long)data[2]) << 16) & 0xff0000L) +
-      ((((long)data[3]) << 24) & 0xff000000L) +
-      ((((long)data[4]) << 32) & 0xff00000000L) +
-      ((((long)data[5]) << 40) & 0xff0000000000L) +
-      ((((long)data[6]) << 48) & 0xff000000000000L) +
-      ((((long)data[7]) << 56) & 0xff00000000000000L);
-    return value;
-  }
-
-  protected static void writeLastTime(ILockManager lockManager, long lastTime)
-    throws ManifoldCFException
-  {
-    byte[] data = new byte[8];
-    data[0] = (byte)(lastTime & 0xffL);
-    data[1] = (byte)((lastTime >> 8) & 0xffL);
-    data[2] = (byte)((lastTime >> 16) & 0xffL);
-    data[3] = (byte)((lastTime >> 24) & 0xffL);
-    data[4] = (byte)((lastTime >> 32) & 0xffL);
-    data[5] = (byte)((lastTime >> 40) & 0xffL);
-    data[6] = (byte)((lastTime >> 48) & 0xffL);
-    data[7] = (byte)((lastTime >> 56) & 0xffL);
-    lockManager.writeData(stufferThreadLastTimeDatumName,data);
-  }
-  
-}
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/WorkerResetManager.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/WorkerResetManager.java
deleted file mode 100644
index 6b5d1d7..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/WorkerResetManager.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: WorkerResetManager.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import java.io.*;
-import java.util.*;
-
-/** Class which handles reset for worker thread pool.  The reset action here
-* is to mark all active documents as being ready for queuing.
-*/
-public class WorkerResetManager extends ResetManager
-{
-  public static final String _rcsid = "@(#)$Id: WorkerResetManager.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The document queue */
-  protected final DocumentQueue dq;
-  /** The expiration queue */
-  protected final DocumentCleanupQueue eq;
-
-  /** Constructor. */
-  public WorkerResetManager(DocumentQueue dq, DocumentCleanupQueue eq, String processID)
-  {
-    super(processID);
-    this.dq = dq;
-    this.eq = eq;
-  }
-
-  /** Reset */
-  @Override
-  protected void performResetLogic(IThreadContext tc, String processID)
-    throws ManifoldCFException
-  {
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    jobManager.resetDocumentWorkerStatus(processID);
-    dq.clear();
-    eq.clear();
-  }
-  
-  /** Do the wakeup logic.
-  */
-  @Override
-  protected void performWakeupLogic()
-  {
-    // Wake up all sleeping worker threads
-    dq.reset();
-    eq.reset();
-  }
-}
-
diff --git a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/WorkerThread.java b/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/WorkerThread.java
deleted file mode 100644
index 707bd3d..0000000
--- a/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/WorkerThread.java
+++ /dev/null
@@ -1,2648 +0,0 @@
-/* $Id: WorkerThread.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.system;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.core.util.URLEncoder;
-import java.util.*;
-import java.io.*;
-import java.lang.reflect.*;
-
-/** This class represents a worker thread.  Hundreds of these threads are instantiated in order to
-* perform crawling and extraction.
-*/
-public class WorkerThread extends Thread
-{
-  public static final String _rcsid = "@(#)$Id: WorkerThread.java 988245 2010-08-23 18:39:35Z kwright $";
-
-
-  // Local data
-  /** Thread id */
-  protected final String id;
-  /** This is a reference to the static main document queue */
-  protected final DocumentQueue documentQueue;
-  /** Worker thread pool reset manager */
-  protected final WorkerResetManager resetManager;
-  /** Queue tracker */
-  protected final QueueTracker queueTracker;
-  /** Process ID */
-  protected final String processID;
-
-  /** Constructor.
-  *@param id is the worker thread id.
-  */
-  public WorkerThread(String id, DocumentQueue documentQueue, WorkerResetManager resetManager, QueueTracker queueTracker, String processID)
-    throws ManifoldCFException
-  {
-    super();
-    this.id = id;
-    this.documentQueue = documentQueue;
-    this.resetManager = resetManager;
-    this.queueTracker = queueTracker;
-    this.processID = processID;
-    setName("Worker thread '"+id+"'");
-    setDaemon(true);
-
-  }
-
-  public void run()
-  {
-    // Register this thread in the worker reset manager
-    resetManager.registerMe();
-
-    try
-    {
-      // Create a thread context object.
-      IThreadContext threadContext = ThreadContextFactory.make();
-      IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
-      IJobManager jobManager = JobManagerFactory.make(threadContext);
-      IBinManager binManager = BinManagerFactory.make(threadContext);
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-      ITransformationConnectionManager transformationConnectionManager = TransformationConnectionManagerFactory.make(threadContext);
-      IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
-      IReprioritizationTracker rt = ReprioritizationTrackerFactory.make(threadContext);
-
-      IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-      
-      // This is the set of documents that we will either be marking as complete, or requeued, depending on the kind of crawl.
-      List<QueuedDocument> finishList = new ArrayList<QueuedDocument>();
-
-      // This is where we accumulate the document QueuedDocuments to be deleted from the job queue.
-      List<QueuedDocument> deleteList = new ArrayList<QueuedDocument>();
-
-      // This is where we accumulate documents that need to be placed in the HOPCOUNTREMOVED
-      // state
-      List<QueuedDocument> hopcountremoveList = new ArrayList<QueuedDocument>();
-      
-      // This is where we accumulate documents that need to be rescanned
-      List<QueuedDocument> rescanList = new ArrayList<QueuedDocument>();
-      
-      // This is where we store document ID strings of documents that need to be noted as having
-      // been checked.
-      List<String> ingesterCheckList = new ArrayList<String>();
-
-      // Service interruption thrown with "abort on fail".
-      ManifoldCFException abortOnFail = null;
-      
-      // Loop
-      while (true)
-      {
-        // Do another try/catch around everything in the loop
-        try
-        {
-          if (Thread.currentThread().isInterrupted())
-            throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-          // Before we begin, conditionally reset
-          resetManager.waitForReset(threadContext);
-
-          // Once we pull something off the queue, we MUST make sure that
-          // we update its status, even if there is an exception!!!
-
-          // See if there is anything on the queue for me
-          QueuedDocumentSet qds = documentQueue.getDocument(queueTracker);
-          if (qds == null)
-            // It's a reset, so recycle
-            continue;
-
-          try
-          {
-            // System.out.println("Got a document set");
-
-            if (Thread.currentThread().isInterrupted())
-              throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-
-            // First of all: find out if the job for these documents has been aborted, paused, etc.
-            // If so, we requeue the documents immediately.
-            IJobDescription job = qds.getJobDescription();
-            Long jobID = job.getID();
-            if (jobManager.checkJobActive(jobID) == false)
-              // Recycle; let these documents be requeued and go get the next set.
-              continue;
-
-            if (Logging.threads.isDebugEnabled())
-            {
-              StringBuilder sb = new StringBuilder();
-              for (int z = 0; z < qds.getCount(); z++)
-              {
-                sb.append(qds.getDocument(z).getDocumentDescription().getID()).append(" ");
-              }
-              Logging.threads.debug("Worker thread processing documents: "+sb);
-            }
-
-            // Build a basic pipeline specification right off; we need it whenever
-            // we interact with Incremental Ingester.
-            IPipelineConnections pipelineConnections = new PipelineConnections(new PipelineSpecificationBasic(job),transformationConnectionManager,outputConnectionManager);
-            
-            String lastIndexedOutputConnectionName = ingester.getLastIndexedOutputConnectionName(pipelineConnections);
-
-            // Universal job data we'll need later
-            String connectionName = job.getConnectionName();
-            Specification spec = job.getSpecification();
-            int jobType = job.getType();
-
-            IRepositoryConnection connection = qds.getConnection();
-            
-            OutputActivity ingestLogger = new OutputActivity(connectionName,connMgr);
-
-            // The flow through this section of the code is as follows.
-            // (1) We start with a list of documents
-            // (2) We attempt to do various things to these documents
-            // (3) Based on what happens, and what errors we get, we progressively move documents out of the main list
-            //     and into secondary lists that will be all treated in the same way
-            
-            // First, initialize the active document set to contain everything.
-            List<QueuedDocument> activeDocuments = new ArrayList<QueuedDocument>(qds.getCount());
-            
-            for (int i = 0; i < qds.getCount(); i++)
-            {
-              QueuedDocument qd = qds.getDocument(i);
-              activeDocuments.add(qd);
-            }
-
-            // Clear out all of our disposition lists
-            finishList.clear();
-            deleteList.clear();
-            ingesterCheckList.clear();
-            hopcountremoveList.clear();
-            rescanList.clear(); //                  jobManager.resetDocument(dd,0L,IJobManager.ACTION_RESCAN,-1L,-1);
-            abortOnFail = null;
-
-            // Keep track of the starting processing time, for statistics calculation
-            long processingStartTime = System.currentTimeMillis();
-            // Log these documents in the overlap calculator
-            qds.beginProcessing(queueTracker);
-            try
-            {
-              long currentTime = System.currentTimeMillis();
-
-              if (Logging.threads.isDebugEnabled())
-                Logging.threads.debug("Worker thread starting document count is "+Integer.toString(activeDocuments.size()));
-
-              // Get the legal link types.  This is needed for later hopcount checking.
-              String[] legalLinkTypes = null;
-              if (activeDocuments.size() > 0)
-              {
-                legalLinkTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-                // If this came back null, it means that there is no underlying implementation available, so treat this like a kind of service interruption.
-                if (legalLinkTypes == null)
-                {
-                  // Failure here puts all remaining documents into rescan list
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug(" Moving "+makeListString(activeDocuments)+" to rescanList");
-                  moveList(activeDocuments,rescanList);
-                }
-              }
-
-              if (Logging.threads.isDebugEnabled())
-                Logging.threads.debug("Post-relationship document count is "+Integer.toString(activeDocuments.size()));
-
-              // Do the hopcount checks, if any.  This will iteratively reduce the viable list of
-              // document identifiers in need of having their versions fetched.
-              if (legalLinkTypes != null && activeDocuments.size() > 0)
-              {
-                // Set up the current ID array
-                String[] currentDocIDHashArray = new String[activeDocuments.size()];
-                for (int i = 0; i < currentDocIDHashArray.length; i++)
-                {
-                  currentDocIDHashArray[i] = activeDocuments.get(i).getDocumentDescription().getDocumentIdentifierHash();
-                }
-                Map filterMap = job.getHopCountFilters();
-                Iterator filterIter = filterMap.keySet().iterator();
-                // Array to accumulate hopcount results for all link types
-                boolean[] overallResults = new boolean[currentDocIDHashArray.length];
-                for (int i = 0; i < overallResults.length; i++)
-                {
-                  overallResults[i] = true;
-                }
-                // Calculate the hopcount result for each link type, and fold it in.
-                while (filterIter.hasNext())
-                {
-                  String linkType = (String)filterIter.next();
-                  int maxHop = (int)((Long)filterMap.get(linkType)).longValue();
-                  boolean[] results = jobManager.findHopCounts(job.getID(),legalLinkTypes,currentDocIDHashArray,linkType,
-                    maxHop,job.getHopcountMode());
-                  for (int i = 0; i < results.length; i++)
-                  {
-                    overallResults[i] = overallResults[i] && results[i];
-                  }
-                }
-                // Move all documents to the appropriate list
-                List<QueuedDocument> newActiveSet = new ArrayList<QueuedDocument>(activeDocuments.size());
-                for (int i = 0; i < overallResults.length; i++)
-                {
-                  if (overallResults[i] == false)
-                  {
-                    if (Logging.threads.isDebugEnabled())
-                      Logging.threads.debug(" Adding "+activeDocuments.get(i).getDocumentDescription().getID()+" to hopcountremovelist");
-                    hopcountremoveList.add(activeDocuments.get(i));
-                  }
-                  else
-                  {
-                    newActiveSet.add(activeDocuments.get(i));
-                  }
-                }
-                activeDocuments = newActiveSet;
-              }
-
-              if (Logging.threads.isDebugEnabled())
-                Logging.threads.debug(" Post-hopcount pruned document count is "+Integer.toString(activeDocuments.size()));
-              
-              // From here on down we need a connector instance, so get one.
-              IRepositoryConnector connector = null;
-              if (activeDocuments.size() > 0 || hopcountremoveList.size() > 0)
-              {
-                connector = repositoryConnectorPool.grab(connection);
-
-                // If we wind up with a null here, it means that a document got queued for a connector which is now gone.
-                // Basically, what we want to do in that case is to treat this kind of like a service interruption - the document
-                // must be requeued for immediate reprocessing.  When the rest of the world figures out that the job that owns this
-                // document is in fact unable to function, we'll stop getting such documents handed to us, because the state of the
-                // job will be changed.
-
-                if (connector == null)
-                {
-                  // Failure here puts all remaining documents into rescan list
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug(" Moving "+makeListString(activeDocuments)+" to rescanList");
-                  moveList(activeDocuments,rescanList);
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug(" Moving "+makeListString(hopcountremoveList)+" to rescanList");
-                  moveList(hopcountremoveList,rescanList);
-                }
-              }
-              
-              if (connector != null)
-              {
-                // Open try/finally block to free the connector instance no matter what
-                try
-                {
-                  // Check for interruption before we start fetching
-                  if (Thread.currentThread().isInterrupted())
-                    throw new ManifoldCFException("Interrupted",ManifoldCFException.INTERRUPTED);
-                  
-                  // We need first to assemble an IPipelineSpecificationWithVersions object for each document we're going to process.
-                  // We put this in a map so it can be looked up by document identifier.
-                  // Create a full PipelineSpecification, including description strings.  (This is per-job still, but can throw ServiceInterruptions, so we do it in here.)
-                  IPipelineSpecification pipelineSpecification;
-                  try
-                  {
-                    pipelineSpecification = new PipelineSpecification(pipelineConnections,job,ingester);
-                  }
-                  catch (ServiceInterruption e)
-                  {
-                    // Handle service interruption from pipeline
-                    if (!e.jobInactiveAbort())
-                      Logging.jobs.warn("Service interruption reported for job "+
-                      job.getID()+" connection '"+job.getConnectionName()+"': "+
-                      e.getMessage());
-
-                    // All documents get requeued, because we never got far enough to make distinctions.  All we have to decide
-                    // is whether to requeue or abort.
-                    List<QueuedDocument> requeueList = new ArrayList<QueuedDocument>();
-
-                    for (QueuedDocument qd : activeDocuments)
-                    {
-                      DocumentDescription dd = qd.getDocumentDescription();
-                      // Check for hard failure.  But no hard failure possible of it's a job inactive abort.
-                      if (!e.jobInactiveAbort() && (dd.getFailTime() != -1L && dd.getFailTime() < e.getRetryTime() ||
-                        dd.getFailRetryCount() == 0))
-                      {
-                        // Treat this as a hard failure.
-                        if (e.isAbortOnFail())
-                        {
-                          rescanList.add(qd);
-                          abortOnFail = new ManifoldCFException("Repeated service interruptions - failure processing document"+((e.getCause()!=null)?": "+e.getCause().getMessage():""),e.getCause());
-                        }
-                        else
-                        {
-                          if (Logging.threads.isDebugEnabled())
-                            Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to requeueList because of output service interruption");
-                          requeueList.add(qd);
-                        }
-                      }
-                      else
-                      {
-                        if (Logging.threads.isDebugEnabled())
-                          Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to requeueList because of output service interruption");
-                        requeueList.add(qd);
-                      }
-                    }
-                      
-                    requeueDocuments(jobManager,requeueList,e.getRetryTime(),e.getFailTime(),
-                      e.getFailRetryCount());
-                    
-                    Logging.threads.debug(" Clearing active documents list due to output service interruption");
-                    activeDocuments.clear();
-                    pipelineSpecification = null;
-                  }
-
-                  if (activeDocuments.size() > 0)
-                  {
-                    
-                    // **** New worker thread code starts here!!! ****
-                    
-                    IExistingVersions existingVersions = new ExistingVersions(lastIndexedOutputConnectionName,activeDocuments);
-                    String aclAuthority = connection.getACLAuthority();
-                    if (aclAuthority == null)
-                      aclAuthority = "";
-                    boolean isDefaultAuthority = (aclAuthority.length() == 0);
-
-                    // Build the processActivity object
-                    Map<String,QueuedDocument> previousDocuments = new HashMap<String,QueuedDocument>();
-                    
-                    String[] documentIDs = new String[activeDocuments.size()];
-                    int k = 0;
-                    for (QueuedDocument qd : activeDocuments)
-                    {
-                      previousDocuments.put(qd.getDocumentDescription().getDocumentIdentifierHash(),qd);
-                      documentIDs[k++] = qd.getDocumentDescription().getDocumentIdentifier();
-                    }
-                    
-                    ProcessActivity activity = new ProcessActivity(job.getID(),processID,
-                      rt,jobManager,ingester,
-                      connectionName,pipelineSpecification,
-                      previousDocuments,
-                      currentTime,
-                      job.getExpiration(),
-                      job.getInterval(),
-                      job.getMaxInterval(),
-                      job.getHopcountMode(),
-                      connection,connector,connMgr,legalLinkTypes,ingestLogger);
-                    try
-                    {
-                      if (Logging.threads.isDebugEnabled())
-                        Logging.threads.debug("Worker thread about to process "+makeListString(activeDocuments));
-
-                      // Now, process in bulk -- catching and handling ServiceInterruptions
-                      ServiceInterruption serviceInterruption = null;
-                      try
-                      {
-                        connector.processDocuments(documentIDs,existingVersions,job.getSpecification(),activity,jobType,isDefaultAuthority);
-                        
-                        // Now do everything that the connector might have done if we were not doing it for it.
-
-                        // Right now, that's just getting rid of untouched components.
-                        for (QueuedDocument qd : activeDocuments)
-                        {
-                          String documentIdentifier = qd.getDocumentDescription().getDocumentIdentifier();
-                          if (!activity.wasDocumentAborted(documentIdentifier) && !activity.wasDocumentDeleted(documentIdentifier))
-                          {
-                            String documentIdentifierHash = qd.getDocumentDescription().getDocumentIdentifierHash();
-                            // In order to be able to loop over all the components that the incremental ingester knows about, we need to know
-                            // what the FIRST output is.
-                            DocumentIngestStatusSet set = qd.getLastIngestedStatus(ingester.getFirstIndexedOutputConnectionName(pipelineConnections));
-                            if (set != null)
-                            {
-                              Iterator<String> componentHashes = set.componentIterator();
-                              while (componentHashes.hasNext())
-                              {
-                                String componentHash = componentHashes.next();
-                                // Check whether we've indexed or not
-                                if (!activity.wasDocumentComponentTouched(documentIdentifier,
-                                  componentHash))
-                                {
-                                  // This component must be removed.
-                                  ingester.documentRemove(
-                                    pipelineConnections,
-                                    connectionName,documentIdentifierHash,componentHash,
-                                    ingestLogger);
-                                }
-                              }
-                            }
-                          }
-                        }
-
-                        // Done with connector functionality!
-                      }
-                      catch (ServiceInterruption e)
-                      {
-                        serviceInterruption = e;
-                        if (!e.jobInactiveAbort())
-                          Logging.jobs.warn("Service interruption reported for job "+
-                          job.getID()+" connection '"+job.getConnectionName()+"': "+
-                          e.getMessage());
-                      }
-
-                      // Flush remaining references into the database!
-                      activity.flush();
-
-                      if (Logging.threads.isDebugEnabled())
-                        Logging.threads.debug("Worker thread done processing "+Integer.toString(documentIDs.length)+" documents");
-
-                      // Either way, handle the documents we were supposed to process.  But if there was a service interruption,
-                      // and the disposition of the document was unclear, then the document will need to be requeued instead of handled normally.
-                      List<QueuedDocument> requeueList = new ArrayList<QueuedDocument>();
-
-                      for (QueuedDocument qd : activeDocuments)
-                      {
-                        // If this document was aborted, then treat it specially.
-                        if (activity.wasDocumentAborted(qd.getDocumentDescription().getDocumentIdentifier()))
-                        {
-                          // Special treatment for aborted documents.
-                          // We ignore the returned version string completely, since it's presumed that processing was not completed for this doc.
-                          // We want to give up immediately on this one, and just requeue it for immediate reprocessing (pending its prereqs being all met).
-                          // Add to the finish list, so it gets requeued.  Because the document is already marked as aborted, this should be enough to cause an
-                          // unconditional requeue.
-                          if (Logging.threads.isDebugEnabled())
-                            Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to finishList");
-                          finishList.add(qd);
-                        }
-                        else if (activity.wasDocumentDeleted(qd.getDocumentDescription().getDocumentIdentifier()))
-                        {
-                          if (Logging.threads.isDebugEnabled())
-                            Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to deleteList");
-                          deleteList.add(qd);
-                        }
-                        else if (serviceInterruption != null)
-                        {
-
-                          // Service interruption has precedence over unchanged, because we might have been interrupted while scanning the document
-                          // for references
-                          DocumentDescription dd = qd.getDocumentDescription();
-                          // Check for hard failure.  But no hard failure possible of it's a job inactive abort.
-                          if (!serviceInterruption.jobInactiveAbort() && (dd.getFailTime() != -1L && dd.getFailTime() < serviceInterruption.getRetryTime() ||
-                            dd.getFailRetryCount() == 0))
-                          {
-                            // Treat this as a hard failure.
-                            if (serviceInterruption.isAbortOnFail())
-                            {
-                              // Make sure that the job aborts.
-                              abortOnFail = new ManifoldCFException("Repeated service interruptions - failure processing document"+((serviceInterruption.getCause()!=null)?": "+serviceInterruption.getCause().getMessage():""),serviceInterruption.getCause());
-                              if (Logging.threads.isDebugEnabled())
-                                Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to rescanList due to service interruption");
-                              rescanList.add(qd);
-                            }
-                            else
-                            {
-                              // Skip the document, rather than failing.
-                              // We want this particular document to be not included in the
-                              // reprocessing.  Therefore, we do the same thing as we would
-                              // if we got back a null version.
-                              if (Logging.threads.isDebugEnabled())
-                                Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to deleteList due to service interruption");
-                              deleteList.add(qd);
-                            }
-                          }
-                          else
-                          {
-                            // Not a hard failure.  Requeue.
-                            if (Logging.threads.isDebugEnabled())
-                              Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to requeueList");
-                            requeueList.add(qd);
-                          }
-                        }
-                        else
-                        {
-                          if (Logging.threads.isDebugEnabled())
-                            Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to finishList");
-                          finishList.add(qd);
-                        }
-                        
-                        // Note whether the document was untouched; if so, update it
-                        if (!activity.wasDocumentTouched(qd.getDocumentDescription().getDocumentIdentifier()))
-                        {
-                          if (Logging.threads.isDebugEnabled())
-                            Logging.threads.debug(" Adding "+qd.getDocumentDescription().getID()+" to ingesterCheckList");
-                          ingesterCheckList.add(qd.getDocumentDescription().getDocumentIdentifierHash());
-                        }
-                      }
-                      
-
-                      if (serviceInterruption != null)
-                      {
-                        // Requeue the documents we've identified as needing to be repeated
-                        if (Logging.threads.isDebugEnabled())
-                          Logging.threads.debug("Requeuing documents "+makeListString(requeueList));
-                        requeueDocuments(jobManager,requeueList,serviceInterruption.getRetryTime(),serviceInterruption.getFailTime(),
-                          serviceInterruption.getFailRetryCount());
-                      }
-                      
-                      // Note the documents that have been checked but not reingested.  This should happen BEFORE we need
-                      // the statistics (which are calculated during the finishlist step below)
-                      if (ingesterCheckList.size() > 0)
-                      {
-                        String[] checkClasses = new String[ingesterCheckList.size()];
-                        String[] checkIDs = new String[ingesterCheckList.size()];
-                        for (int i = 0; i < checkIDs.length; i++)
-                        {
-                          checkClasses[i] = connectionName;
-                          checkIDs[i] = ingesterCheckList.get(i);
-                        }
-                        // This method should exercise reasonable intelligence.  If the document has never been indexed, it should detect that
-                        // and stop.  Otherwise, it should update the statistics accordingly.
-                        ingester.documentCheckMultiple(pipelineConnections,checkClasses,checkIDs,currentTime);
-                      }
-
-                      // Process the finish list!
-                      if (finishList.size() > 0)
-                      {
-                        if (Logging.threads.isDebugEnabled())
-                          Logging.threads.debug("Finishing documents "+makeListString(finishList));
-
-                        // "Finish" the documents (removing unneeded carrydown info, and compute hopcounts).
-                        // This can ONLY be done on fully-completed documents; everything else should be left in a dangling
-                        // state (which we know is OK because it will be fixed the next time the document is attempted).
-                        String[] documentIDHashes = new String[finishList.size()];
-                        k = 0;
-                        for (QueuedDocument qd : finishList)
-                        {
-                          documentIDHashes[k++] = qd.getDocumentDescription().getDocumentIdentifierHash();
-                        }
-                        DocumentDescription[] requeueCandidates = jobManager.finishDocuments(job.getID(),legalLinkTypes,documentIDHashes,job.getHopcountMode());
-                        if (Logging.threads.isDebugEnabled())
-                          Logging.threads.debug(" Requeueing documents due to carrydown "+makeListString(requeueCandidates));
-                        ManifoldCF.requeueDocumentsDueToCarrydown(jobManager,requeueCandidates,connector,connection,rt,currentTime);
-                        
-                        // In both job types, we have to go through the finishList to figure out what to do with the documents.
-                        // In the case of a document that was aborted, we must requeue it for immediate reprocessing in BOTH job types.
-                        switch (job.getType())
-                        {
-                        case IJobDescription.TYPE_CONTINUOUS:
-                          {
-                            // We need to populate timeArray
-                            String[] timeIDClasses = new String[finishList.size()];
-                            String[] timeIDHashes = new String[finishList.size()];
-                            for (int i = 0; i < timeIDHashes.length; i++)
-                            {
-                              QueuedDocument qd = (QueuedDocument)finishList.get(i);
-                              DocumentDescription dd = qd.getDocumentDescription();
-                              String documentIDHash = dd.getDocumentIdentifierHash();
-                              timeIDClasses[i] = connectionName;
-                              timeIDHashes[i] = documentIDHash;
-                            }
-                            long[] timeArray = ingester.getDocumentUpdateIntervalMultiple(pipelineConnections,timeIDClasses,timeIDHashes);
-                            Long[] recheckTimeArray = new Long[timeArray.length];
-                            int[] actionArray = new int[timeArray.length];
-                            DocumentDescription[] recrawlDocs = new DocumentDescription[finishList.size()];
-                            for (int i = 0; i < finishList.size(); i++)
-                            {
-                              QueuedDocument qd = finishList.get(i);
-                              recrawlDocs[i] = qd.getDocumentDescription();
-                              String documentID = recrawlDocs[i].getDocumentIdentifier();
-
-                              // If aborted due to sequencing issue, then requeue for reprocessing immediately, ignoring everything else.
-                              boolean wasAborted = activity.wasDocumentAborted(documentID);
-                              if (wasAborted)
-                              {
-                                // Requeue for immediate reprocessing
-                                if (Logging.scheduling.isDebugEnabled())
-                                  Logging.scheduling.debug("Document '"+documentID+"' will be RESCANNED as soon as prerequisites are met");
-
-                                actionArray[i] = IJobManager.ACTION_RESCAN;
-                                recheckTimeArray[i] = new Long(0L);     // Must not use null; that means 'never'.
-                              }
-                              else
-                              {
-                                // Calculate the next time to run, or time to expire.
-
-                                // For run time, the formula is to calculate the running avg interval between changes,
-                                // add an additional interval (which comes from the job description),
-                                // and add that to the current time.
-                                // One caveat: we really want to calculate the interval from the last
-                                // time change was detected, but this is not implemented yet.
-                                long timeAmt = timeArray[i];
-                                // null value indicates never to schedule
-
-                                Long recrawlTime = activity.calculateDocumentRescheduleTime(currentTime,timeAmt,documentID);
-                                Long expireTime = activity.calculateDocumentExpireTime(currentTime,documentID);
-
-
-                                // Merge the two times together.  We decide on the action based on the action with the lowest time.
-                                if (expireTime == null || (recrawlTime != null && recrawlTime.longValue() < expireTime.longValue()))
-                                {
-                                  if (Logging.scheduling.isDebugEnabled())
-                                    Logging.scheduling.debug("Document '"+documentID+"' will be RESCANNED at "+recrawlTime.toString());
-                                  recheckTimeArray[i] = recrawlTime;
-                                  actionArray[i] = IJobManager.ACTION_RESCAN;
-                                }
-                                else if (recrawlTime == null || (expireTime != null && recrawlTime.longValue() > expireTime.longValue()))
-                                {
-                                  if (Logging.scheduling.isDebugEnabled())
-                                    Logging.scheduling.debug("Document '"+documentID+"' will be REMOVED at "+expireTime.toString());
-                                  recheckTimeArray[i] = expireTime;
-                                  actionArray[i] = IJobManager.ACTION_REMOVE;
-                                }
-                                else
-                                {
-                                  // Default activity if conflict will be rescan
-                                  if (Logging.scheduling.isDebugEnabled() && recrawlTime != null)
-                                    Logging.scheduling.debug("Document '"+documentID+"' will be RESCANNED at "+recrawlTime.toString());
-                                  recheckTimeArray[i] = recrawlTime;
-                                  actionArray[i] = IJobManager.ACTION_RESCAN;
-                                }
-                              }
-                            }
-
-                            if (Logging.threads.isDebugEnabled())
-                              Logging.threads.debug(" Requeuing "+makeListString(recrawlDocs));
-                            jobManager.requeueDocumentMultiple(recrawlDocs,recheckTimeArray,actionArray);
-
-                          }
-                          break;
-                        case IJobDescription.TYPE_SPECIFIED:
-                          {
-                            // Separate the ones we actually finished from the ones we need to requeue because they were aborted
-                            List<DocumentDescription> completedList = new ArrayList<DocumentDescription>();
-                            List<DocumentDescription> abortedList = new ArrayList<DocumentDescription>();
-                            for (QueuedDocument qd : finishList)
-                            {
-                              DocumentDescription dd = qd.getDocumentDescription();
-                              if (activity.wasDocumentAborted(dd.getDocumentIdentifier()))
-                              {
-                                // The document was aborted, so put it into the abortedList
-                                abortedList.add(dd);
-                              }
-                              else
-                              {
-                                // The document was completed.
-                                completedList.add(dd);
-                              }
-                            }
-
-                            // Requeue the ones that must be repeated
-                            if (abortedList.size() > 0)
-                            {
-                              DocumentDescription[] docDescriptions = new DocumentDescription[abortedList.size()];
-                              Long[] recheckTimeArray = new Long[docDescriptions.length];
-                              int[] actionArray = new int[docDescriptions.length];
-                              for (int i = 0; i < docDescriptions.length; i++)
-                              {
-                                docDescriptions[i] = abortedList.get(i);
-                                recheckTimeArray[i] = new Long(0L);
-                                actionArray[i] = IJobManager.ACTION_RESCAN;
-                              }
-
-                              if (Logging.threads.isDebugEnabled())
-                                Logging.threads.debug(" Requeuing "+makeListString(docDescriptions));
-                              jobManager.requeueDocumentMultiple(docDescriptions,recheckTimeArray,actionArray);
-                            }
-
-                            // Mark the ones completed that were actually completed.
-                            if (completedList.size() > 0)
-                            {
-                              DocumentDescription[] docDescriptions = new DocumentDescription[completedList.size()];
-                              for (int i = 0; i < docDescriptions.length; i++)
-                              {
-                                docDescriptions[i] = completedList.get(i);
-                              }
-
-                              if (Logging.threads.isDebugEnabled())
-                                Logging.threads.debug(" Marking completed "+makeListString(docDescriptions));
-                              jobManager.markDocumentCompletedMultiple(docDescriptions);
-                            }
-                          }
-                          break;
-                        default:
-                          throw new ManifoldCFException("Unexpected value for job type: '"+Integer.toString(job.getType())+"'");
-                        }
-
-                        // Finally, if we're still alive, mark everything we finished as "processed".
-                        for (QueuedDocument qd : finishList)
-                        {
-                          qd.setProcessed();
-                        }
-                      }
-                    }
-                    finally
-                    {
-                      // Make sure we don't leave any dangling carrydown files
-                      activity.discard();
-                    }
-                    
-                    // Successful processing of the set
-                    // We count 'get version' time in the average, so even if we decide not to process a doc
-                    // it still counts.
-                    long elapsedTime = System.currentTimeMillis() - processingStartTime;
-                    if (Logging.scheduling.isDebugEnabled())
-                      Logging.scheduling.debug("Worker thread for connection "+connectionName+" took "+new Long(elapsedTime).toString()+"ms to handle "+Integer.toString(qds.getCount())+" documents");
-                    queueTracker.noteConnectionPerformance(qds.getCount(),connectionName,elapsedTime);
-
-                  }
-                  
-                  // Now, handle the delete list
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug("Deleting "+makeListString(deleteList));
-                  processDeleteLists(pipelineConnections,connector,connection,jobManager,
-                    deleteList,ingester,
-                    job.getID(),legalLinkTypes,ingestLogger,job.getHopcountMode(),rt,currentTime);
-
-                  // Handle hopcount removal
-                  if (Logging.threads.isDebugEnabled())
-                    Logging.threads.debug("Hopcount removal "+makeListString(hopcountremoveList));
-                  processHopcountRemovalLists(pipelineConnections,connector,connection,jobManager,
-                    hopcountremoveList,ingester,
-                    job.getID(),legalLinkTypes,ingestLogger,job.getHopcountMode(),rt,currentTime);
-
-                }
-                finally
-                {
-                  repositoryConnectorPool.release(connection,connector);
-                }
-              
-              }
-              
-              // Handle rescanning
-              if (Logging.threads.isDebugEnabled())
-                Logging.threads.debug("Rescanning documents "+makeListString(rescanList));
-              for (QueuedDocument qd : rescanList)
-              {
-                jobManager.resetDocument(qd.getDocumentDescription(),0L,IJobManager.ACTION_RESCAN,-1L,-1);
-                qd.setProcessed();
-              }
-                
-            }
-            finally
-            {
-              // Note termination of processing of these documents in the overlap calculator
-              qds.endProcessing(queueTracker);
-            }
-            
-            if (abortOnFail != null)
-              throw abortOnFail;
-            
-          }
-          catch (ManifoldCFException e)
-          {
-            if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-              break;
-
-            if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-              throw e;
-
-            if (jobManager.errorAbort(qds.getJobDescription().getID(),e.getMessage()))
-            {
-              // We eat the exception if there was already one recorded.
-
-              // An exception occurred in the processing of a set of documents.
-              // Shut the corresponding job down, with an appropriate error
-              Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-            }
-          }
-          finally
-          {
-            // Go through qds and requeue any that aren't closed out in one way or another.  This allows the job
-            // to be aborted; no dangling entries are left around.
-            for (int i = 0; i < qds.getCount(); i++)
-            {
-              QueuedDocument qd = qds.getDocument(i);
-              if (!qd.wasProcessed())
-              {
-                jobManager.resetDocument(qd.getDocumentDescription(),0L,IJobManager.ACTION_RESCAN,-1L,-1);
-              }
-            }
-          }
-        }
-        catch (ManifoldCFException e)
-        {
-          if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
-            break;
-
-          if (e.getErrorCode() == ManifoldCFException.DATABASE_CONNECTION_ERROR)
-          {
-            // Note the failure, which will cause a reset to occur
-            resetManager.noteEvent();
-
-            Logging.threads.error("Worker thread aborting and restarting due to database connection reset: "+e.getMessage(),e);
-            try
-            {
-              // Give the database a chance to catch up/wake up
-              ManifoldCF.sleep(10000L);
-            }
-            catch (InterruptedException se)
-            {
-              break;
-            }
-            continue;
-          }
-
-          // An exception occurred in the cleanup from another error.
-          // Log the error (but that's all we can do)
-          Logging.threads.error("Exception tossed: "+e.getMessage(),e);
-
-        }
-        catch (InterruptedException e)
-        {
-          // We're supposed to quit
-          break;
-        }
-        catch (OutOfMemoryError e)
-        {
-          System.err.println("agents process ran out of memory - shutting down");
-          e.printStackTrace(System.err);
-          System.exit(-200);
-        }
-        catch (Throwable e)
-        {
-          // A more severe error - but stay alive
-          Logging.threads.fatal("Error tossed: "+e.getMessage(),e);
-        }
-      }
-    }
-    catch (Throwable e)
-    {
-      // Severe error on initialization
-      System.err.println("agents process could not start - shutting down");
-      Logging.threads.fatal("WorkerThread "+id+" initialization error tossed: "+e.getMessage(),e);
-      System.exit(-300);
-    }
-
-  }
-
-  /** Compare two sorted collection names lists.
-  */
-  protected static boolean compareArrays(String[] array1, String[] array2)
-  {
-    if (array1.length != array2.length)
-      return false;
-    int i = 0;
-    while (i < array1.length)
-    {
-      if (!array1[i].equals(array2[i]))
-        return false;
-      i++;
-    }
-    return true;
-  }
-
-  protected static String makeListString(List<QueuedDocument> sourceList)
-  {
-    StringBuilder sb = new StringBuilder("{");
-    for (QueuedDocument qd : sourceList)
-    {
-      sb.append(qd.getDocumentDescription().getID()).append(" ");
-    }
-    sb.append("}");
-    return sb.toString();
-  }
-
-  protected static String makeListString(DocumentDescription[] sourceList)
-  {
-    StringBuilder sb = new StringBuilder("{");
-    for (DocumentDescription dd : sourceList)
-    {
-      sb.append(dd.getID()).append(" ");
-    }
-    sb.append("}");
-    return sb.toString();
-  }
-  
-  protected static void moveList(List<QueuedDocument> sourceList, List<QueuedDocument> targetList)
-  {
-    for (int i = 0; i < sourceList.size(); i++)
-    {
-      targetList.add(sourceList.get(i));
-    }
-    sourceList.clear();
-  }
-
-  /** Mark specified documents as 'hopcount removed', and remove them from the
-  * index.  Documents in this state are presumed to have:
-  * (a) nothing in the index
-  * (b) no intrinsic links for which they are the origin
-  * In order to guarantee this situation, this method must be capable of doing much
-  * of what the deletion method must do.  Specifically, it should be capable of deleting
-  * documents from the index should they be already present.
-  */
-  protected static void processHopcountRemovalLists(IPipelineConnections pipelineConnections,
-    IRepositoryConnector connector,
-    IRepositoryConnection connection, IJobManager jobManager,
-    List<QueuedDocument> hopcountremoveList,
-    IIncrementalIngester ingester,
-    Long jobID, String[] legalLinkTypes, OutputActivity ingestLogger,
-    int hopcountMethod, IReprioritizationTracker rt, long currentTime)
-    throws ManifoldCFException
-  {
-    // Remove from index
-    hopcountremoveList = removeFromIndex(pipelineConnections,connection.getName(),jobManager,hopcountremoveList,ingester,ingestLogger);
-    // Mark as 'hopcountremoved' in the job queue
-    processJobQueueHopcountRemovals(hopcountremoveList,connector,connection,
-      jobManager,jobID,legalLinkTypes,hopcountMethod,rt,currentTime);
-  }
-
-  /** Clear specified documents out of the job queue and from the appliance.
-  *@param pipelineConnections is the basic pipeline specification for this job.
-  *@param jobManager is the job manager.
-  *@param deleteList is a list of QueuedDocument objects to clean out.
-  *@param ingester is the handle to the incremental ingestion API control object.
-  *@param ingesterDeleteList is a list of document id's to delete.
-  */
-  protected static void processDeleteLists(IPipelineConnections pipelineConnections,
-    IRepositoryConnector connector,
-    IRepositoryConnection connection, IJobManager jobManager,
-    List<QueuedDocument> deleteList,
-    IIncrementalIngester ingester,
-    Long jobID, String[] legalLinkTypes, OutputActivity ingestLogger,
-    int hopcountMethod, IReprioritizationTracker rt, long currentTime)
-    throws ManifoldCFException
-  {
-    // Remove from index
-    deleteList = removeFromIndex(pipelineConnections,connection.getName(),jobManager,deleteList,ingester,ingestLogger);
-    // Delete from the job queue
-    processJobQueueDeletions(deleteList,connector,connection,
-      jobManager,jobID,legalLinkTypes,hopcountMethod,rt,currentTime);
-  }
-
-  /** Remove a specified set of documents from the index.
-  *@return the list of documents whose state needs to be updated in jobqueue.
-  */
-  protected static List<QueuedDocument> removeFromIndex(IPipelineConnections pipelineConnections,
-    String connectionName, IJobManager jobManager, List<QueuedDocument> deleteList, 
-    IIncrementalIngester ingester, OutputActivity ingestLogger)
-    throws ManifoldCFException
-  {
-    List<String> ingesterDeleteList = new ArrayList<String>(deleteList.size());
-    for (int i = 0; i < deleteList.size(); i++)
-    {
-      QueuedDocument qd = deleteList.get(i);
-      // See if we need to delete from index
-      if (qd.anyLastIngestedRecords())
-      {
-        // Queue up to issue deletion
-        ingesterDeleteList.add(qd.getDocumentDescription().getDocumentIdentifierHash());
-      }
-    }
-    
-    // First, do the ingester delete list.  This guarantees that if the ingestion system is down, this operation will be handled atomically.
-    if (ingesterDeleteList.size() > 0)
-    {
-      String[] deleteClasses = new String[ingesterDeleteList.size()];
-      String[] deleteIDs = new String[ingesterDeleteList.size()];
-
-      for (int i = 0; i < ingesterDeleteList.size(); i++)
-      {
-        deleteClasses[i] = connectionName;
-        deleteIDs[i] = ingesterDeleteList.get(i);
-      }
-      
-      // Try to delete the documents via the output connection.
-      try
-      {
-        ingester.documentDeleteMultiple(pipelineConnections,deleteClasses,deleteIDs,ingestLogger);
-      }
-      catch (ServiceInterruption e)
-      {
-        // It looks like the output connection is not currently functioning, so we need to requeue instead of deleting
-        // those documents that could not be removed.
-        List<QueuedDocument> newDeleteList = new ArrayList<QueuedDocument>();
-        List<QueuedDocument> newRequeueList = new ArrayList<QueuedDocument>();
-        
-        Set<String> ingesterSet = new HashSet<String>();
-        for (int j = 0 ; j < ingesterDeleteList.size() ; j++)
-        {
-          String id = ingesterDeleteList.get(j);
-          ingesterSet.add(id);
-        }
-        for (int j = 0 ; j < deleteList.size() ; j++)
-        {
-          QueuedDocument qd = deleteList.get(j);
-          DocumentDescription dd = qd.getDocumentDescription();
-          String documentIdentifierHash = dd.getDocumentIdentifierHash();
-          if (ingesterSet.contains(documentIdentifierHash))
-            newRequeueList.add(qd);
-          else
-            newDeleteList.add(qd);
-        }
-
-        // Requeue those that are supposed to be requeued
-        requeueDocuments(jobManager,newRequeueList,e.getRetryTime(),e.getFailTime(),
-          e.getFailRetryCount());
-        
-        // Process the ones that are just new job queue changes
-        deleteList = newDeleteList;
-      }
-    }
-    return deleteList;
-  }
-  
-  /** Process job queue deletions.  Either the indexer has already been updated, or it is not necessary to update it.
-  */
-  protected static void processJobQueueDeletions(List<QueuedDocument> jobmanagerDeleteList,
-    IRepositoryConnector connector, IRepositoryConnection connection, IJobManager jobManager,
-    Long jobID, String[] legalLinkTypes, int hopcountMethod, IReprioritizationTracker rt, long currentTime)
-    throws ManifoldCFException
-  {
-    // Now, do the document queue cleanup for deletions.
-    if (jobmanagerDeleteList.size() > 0)
-    {
-      DocumentDescription[] deleteDescriptions = new DocumentDescription[jobmanagerDeleteList.size()];
-      for (int i = 0; i < deleteDescriptions.length; i++)
-      {
-        QueuedDocument qd = jobmanagerDeleteList.get(i);
-        deleteDescriptions[i] = qd.getDocumentDescription();
-      }
-
-      // Do the actual work.
-      DocumentDescription[] requeueCandidates = jobManager.markDocumentDeletedMultiple(jobID,legalLinkTypes,deleteDescriptions,hopcountMethod);
-
-      // Requeue those documents that had carrydown data modifications
-      ManifoldCF.requeueDocumentsDueToCarrydown(jobManager,
-        requeueCandidates,connector,connection,rt,currentTime);
-
-      // Mark all these as done
-      for (int i = 0; i < jobmanagerDeleteList.size(); i++)
-      {
-        QueuedDocument qd = jobmanagerDeleteList.get(i);
-        qd.setProcessed();
-      }
-    }
-  }
-
-  /** Process job queue hopcount removals.  All indexer updates have already taken place.
-  */
-  protected static void processJobQueueHopcountRemovals(List<QueuedDocument> jobmanagerRemovalList,
-    IRepositoryConnector connector, IRepositoryConnection connection, IJobManager jobManager,
-    Long jobID, String[] legalLinkTypes, int hopcountMethod, IReprioritizationTracker rt, long currentTime)
-    throws ManifoldCFException
-  {
-    // Now, do the document queue cleanup for deletions.
-    if (jobmanagerRemovalList.size() > 0)
-    {
-      DocumentDescription[] removalDescriptions = new DocumentDescription[jobmanagerRemovalList.size()];
-      for (int i = 0; i < removalDescriptions.length; i++)
-      {
-        QueuedDocument qd = jobmanagerRemovalList.get(i);
-        removalDescriptions[i] = qd.getDocumentDescription();
-      }
-
-      // Do the actual work.
-      DocumentDescription[] requeueCandidates = jobManager.markDocumentHopcountRemovalMultiple(jobID,legalLinkTypes,removalDescriptions,hopcountMethod);
-
-      // Requeue those documents that had carrydown data modifications
-      ManifoldCF.requeueDocumentsDueToCarrydown(jobManager,
-        requeueCandidates,connector,connection,rt,currentTime);
-
-      // Mark all these as done
-      for (QueuedDocument qd : jobmanagerRemovalList)
-      {
-        qd.setProcessed();
-      }
-    }
-  }
-
-  /** Requeue documents after a service interruption was detected.
-  *@param jobManager is the job manager object.
-  *@param requeueList is a list of QueuedDocument objects describing what needs to be requeued.
-  *@param retryTime is the time that the first retry ought to be scheduled for.
-  *@param failTime is the time beyond which retries lead to hard failure.
-  *@param failCount is the number of retries allowed until hard failure.
-  */
-  protected static void requeueDocuments(IJobManager jobManager, List<QueuedDocument> requeueList, long retryTime, long failTime, int failCount)
-    throws ManifoldCFException
-  {
-    if (requeueList.size() > 0)
-    {
-      DocumentDescription[] requeueDocs = new DocumentDescription[requeueList.size()];
-
-      for (int i = 0; i < requeueDocs.length; i++)
-      {
-        QueuedDocument qd = requeueList.get(i);
-        DocumentDescription dd = qd.getDocumentDescription();
-        requeueDocs[i] = dd;
-      }
-
-      jobManager.resetDocumentMultiple(requeueDocs,retryTime,IJobManager.ACTION_RESCAN,failTime,failCount);
-
-      for (QueuedDocument qd : requeueList)
-      {
-        qd.setProcessed();
-      }
-    }
-  }
-
-  /** The maximum number of adds that happen in a single transaction */
-  protected static final int MAX_ADDS_IN_TRANSACTION = 20;
-
-  // Nested classes
-
-  /** Process activity class wraps access to the ingester and job queue.
-  */
-  protected static class ProcessActivity implements IProcessActivity
-  {
-    // Member variables
-    protected final Long jobID;
-    protected final String processID;
-    protected final IJobManager jobManager;
-    protected final IIncrementalIngester ingester;
-    protected final String connectionName;
-    protected final IPipelineSpecification pipelineSpecification;
-    protected final Map<String,QueuedDocument> previousDocuments;
-    protected final long currentTime;
-    protected final Long expireInterval;
-    protected final Long recrawlInterval;
-    protected final Long maxInterval;
-    protected final int hopcountMode;
-    protected final IRepositoryConnection connection;
-    protected final IRepositoryConnector connector;
-    protected final IRepositoryConnectionManager connMgr;
-    protected final String[] legalLinkTypes;
-    protected final OutputActivity ingestLogger;
-    protected final IReprioritizationTracker rt;
-
-    // We submit references in bulk, because that's way more efficient.
-    protected final Map<DocumentReference,DocumentReference> referenceList = new HashMap<DocumentReference,DocumentReference>();
-
-    // Keep track of lower and upper reschedule bounds separately.  Contains a Long and is keyed by a document identifier.
-    protected final Map<String,Long> lowerRescheduleBounds = new HashMap<String,Long>();
-    protected final Map<String,Long> upperRescheduleBounds = new HashMap<String,Long>();
-    protected final Map<String,Long> lowerExpireBounds = new HashMap<String,Long>();
-    protected final Map<String,Long> upperExpireBounds = new HashMap<String,Long>();
-
-    // Origination times
-    protected final Map<String,Long> originationTimes = new HashMap<String,Long>();
-
-    // Whether the document was aborted or not
-    protected final Set<String> abortSet = new HashSet<String>();
-
-    // Whether the document was touched or not
-    protected final Set<String> touchedSet = new HashSet<String>();
-    
-    // Whether document was deleted
-    protected final Set<String> documentDeletedSet = new HashSet<String>();
-    
-    // Whether a component was touched or not, keyed by document identifier.
-    // If there's an entry here, then it means that *all* components for the document are to be retained.
-    protected final Set<String> allComponentsSet = new HashSet<String>();
-    // This does not include primary document.  The set is keyed by component id hash.
-    protected final Map<String,Set<String>> touchedComponentSet = new HashMap<String,Set<String>>();
-    // This represents primary documents.
-    protected final Set<String> touchedPrimarySet = new HashSet<String>();
-    
-    /** Constructor.
-    *@param jobManager is the job manager
-    *@param ingester is the ingester
-    */
-    public ProcessActivity(Long jobID, String processID,
-      IReprioritizationTracker rt, IJobManager jobManager,
-      IIncrementalIngester ingester,
-      String connectionName,
-      IPipelineSpecification pipelineSpecification,
-      Map<String,QueuedDocument> previousDocuments,
-      long currentTime,
-      Long expireInterval,
-      Long recrawlInterval,
-      Long maxInterval,
-      int hopcountMode,
-      IRepositoryConnection connection, IRepositoryConnector connector,
-      IRepositoryConnectionManager connMgr, String[] legalLinkTypes, OutputActivity ingestLogger)
-    {
-      this.jobID = jobID;
-      this.processID = processID;
-      this.rt = rt;
-      this.jobManager = jobManager;
-      this.ingester = ingester;
-      this.connectionName = connectionName;
-      this.pipelineSpecification = pipelineSpecification;
-      this.previousDocuments = previousDocuments;
-      this.currentTime = currentTime;
-      this.expireInterval = expireInterval;
-      this.recrawlInterval = recrawlInterval;
-      this.maxInterval = maxInterval;
-      this.hopcountMode = hopcountMode;
-      this.connection = connection;
-      this.connector = connector;
-      this.connMgr = connMgr;
-      this.legalLinkTypes = legalLinkTypes;
-      this.ingestLogger = ingestLogger;
-    }
-
-    /** Clean up any dangling information, before abandoning this process activity object */
-    public void discard()
-      throws ManifoldCFException
-    {
-      for (DocumentReference dr : referenceList.keySet())
-      {
-        dr.discard();
-      }
-      referenceList.clear();
-    }
-
-    /** Check whether a document (and its version string) was touched or not.
-    */
-    public boolean wasDocumentTouched(String documentIdentifier)
-    {
-      return touchedSet.contains(documentIdentifier);
-    }
-
-    /** Check whether a document component was touched or not.
-    */
-    public boolean wasDocumentComponentTouched(String documentIdentifier,
-      String componentIdentifierHash)
-    {
-      if (allComponentsSet.contains(documentIdentifier))
-        return true;
-      Set<String> components = touchedComponentSet.get(documentIdentifier);
-      if (components == null)
-        return false;
-      return components.contains(componentIdentifierHash);
-    }
-    
-    /** Check whether document was deleted or not.
-    */
-    public boolean wasDocumentDeleted(String documentIdentifier)
-    {
-      return documentDeletedSet.contains(documentIdentifier);
-    }
-    
-    /** Check whether a document was aborted or not.
-    */
-    public boolean wasDocumentAborted(String documentIdentifier)
-    {
-      return abortSet.contains(documentIdentifier);
-    }
-    
-    /** Check if a document needs to be reindexed, based on a computed version string.
-    * Call this method to determine whether reindexing is necessary.  Pass in a newly-computed version
-    * string.  This method will return "true" if the document needs to be re-indexed.
-    *@param documentIdentifier is the document identifier.
-    *@param newVersionString is the newly-computed version string.
-    *@return true if the document needs to be reindexed.
-    */
-    @Override
-    public boolean checkDocumentNeedsReindexing(String documentIdentifier,
-      String newVersionString)
-      throws ManifoldCFException
-    {
-      return checkDocumentNeedsReindexing(documentIdentifier,null,newVersionString);
-    }
-
-    /** Check if a document needs to be reindexed, based on a computed version string.
-    * Call this method to determine whether reindexing is necessary.  Pass in a newly-computed version
-    * string.  This method will return "true" if the document needs to be re-indexed.
-    *@param documentIdentifier is the document identifier.
-    *@param componentIdentifier is the component document identifier, if any.
-    *@param newVersionString is the newly-computed version string.
-    *@return true if the document needs to be reindexed.
-    */
-    @Override
-    public boolean checkDocumentNeedsReindexing(String documentIdentifier,
-      String componentIdentifier,
-      String newVersionString)
-      throws ManifoldCFException
-    {
-      String documentIdentifierHash = ManifoldCF.hash(documentIdentifier);
-      String componentIdentifierHash = computeComponentIDHash(componentIdentifier);
-      IPipelineSpecificationWithVersions spec = computePipelineSpecificationWithVersions(documentIdentifierHash,componentIdentifierHash,documentIdentifier);
-      return ingester.checkFetchDocument(spec,newVersionString,connection.getACLAuthority());
-    }
-
-    /** Add a document description to the current job's queue.
-    *@param localIdentifier is the local document identifier to add (for the connector that
-    * fetched the document).
-    *@param parentIdentifier is the document identifier that is considered to be the "parent"
-    * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-    *@param relationshipType is the string describing the kind of relationship described by this
-    * reference.  This must be one of the strings returned by the IRepositoryConnector method
-    * "getRelationshipTypes()".  May be null.
-    *@param dataNames is the list of carry-down data from the parent to the child.  May be null.  Each name is limited to 255 characters!
-    *@param dataValues are the values that correspond to the data names in the dataNames parameter.  May be null only if dataNames is null.
-    *          The type of each object must either be a String, or a CharacterInput.
-    *@param originationTime is the time, in ms since epoch, that the document originated.  Pass null if none or unknown.
-    *@param prereqEventNames are the names of the prerequisite events which this document requires prior to processing.  Pass null if none.
-    */
-    @Override
-    public void addDocumentReference(String localIdentifier, String parentIdentifier, String relationshipType,
-      String[] dataNames, Object[][] dataValues, Long originationTime, String[] prereqEventNames)
-      throws ManifoldCFException
-    {
-      String localIdentifierHash = ManifoldCF.hash(localIdentifier);
-      String parentIdentifierHash = null;
-      if (parentIdentifier != null && parentIdentifier.length() > 0)
-        parentIdentifierHash = ManifoldCF.hash(parentIdentifier);
-
-      if (Logging.threads.isDebugEnabled())
-        Logging.threads.debug("Adding document reference, from "+((parentIdentifier==null)?"no parent":"'"+parentIdentifier+"'")
-      +" to '"+localIdentifier+"', relationship type "+((relationshipType==null)?"null":"'"+relationshipType+"'")
-      +", with "+((dataNames==null)?"no":Integer.toString(dataNames.length))+" data types, origination time="+((originationTime==null)?"unknown":originationTime.toString()));
-
-      //Long expireInterval = job.getExpiration();
-      if (expireInterval != null)
-      {
-        // We should not queue documents that have already expired; it wastes time
-        // So, calculate when this document will expire
-        long currentTime = System.currentTimeMillis();
-        long expireTime;
-        if (originationTime == null)
-          expireTime = currentTime + expireInterval.longValue();
-        else
-          expireTime = originationTime.longValue() + expireInterval.longValue();
-        if (expireTime <= currentTime)
-        {
-          if (Logging.threads.isDebugEnabled())
-            Logging.threads.debug("Not adding document reference for '"+localIdentifier+"', since it has already expired");
-          return;
-        }
-      }
-
-      if (referenceList.size() == MAX_ADDS_IN_TRANSACTION)
-      {
-        // Output what we've got, and reset
-        processDocumentReferences();
-      }
-      DocumentReference dr = new DocumentReference(localIdentifierHash,localIdentifier,new DocumentBin(parentIdentifierHash,relationshipType));
-      DocumentReference existingDr = referenceList.get(dr);
-      if (existingDr == null)
-      {
-        referenceList.put(dr,dr);
-        existingDr = dr;
-      }
-      // We can't just keep a reference to the passed-in data values, because if these are files the caller will delete them upon the return of this method.  So, for all data values we keep,
-      // make a local copy, and remove the file pointer from the caller's copy.  It then becomes the responsibility of the ProcessActivity object to clean up these items when it is discarded.
-      Object[][] savedDataValues;
-      if (dataValues != null)
-      {
-        savedDataValues = new Object[dataValues.length][];
-        int q = 0;
-        while (q < savedDataValues.length)
-        {
-          Object[] innerArray = dataValues[q];
-          if (innerArray != null)
-          {
-            savedDataValues[q] = new Object[innerArray.length];
-            int z = 0;
-            while (z < innerArray.length)
-            {
-              Object innerValue = innerArray[z];
-              if (innerValue != null)
-              {
-                if (innerValue instanceof CharacterInput)
-                  (savedDataValues[q])[z] = ((CharacterInput)innerValue).transfer();
-                else
-                  (savedDataValues[q])[z] = innerValue;
-              }
-              else
-                (savedDataValues[q])[z] = null;
-              z++;
-            }
-          }
-          else
-            savedDataValues[q] = null;
-          q++;
-        }
-      }
-      else
-        savedDataValues = null;
-
-      existingDr.addData(dataNames,savedDataValues);
-      existingDr.addPrerequisiteEvents(prereqEventNames);
-    }
-
-    /** Add a document description to the current job's queue.
-    *@param localIdentifier is the local document identifier to add (for the connector that
-    * fetched the document).
-    *@param parentIdentifier is the document identifier that is considered to be the "parent"
-    * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-    *@param relationshipType is the string describing the kind of relationship described by this
-    * reference.  This must be one of the strings returned by the IRepositoryConnector method
-    * "getRelationshipTypes()".  May be null.
-    *@param dataNames is the list of carry-down data from the parent to the child.  May be null.  Each name is limited to 255 characters!
-    *@param dataValues are the values that correspond to the data names in the dataNames parameter.  May be null only if dataNames is null.
-    *@param originationTime is the time, in ms since epoch, that the document originated.  Pass null if none or unknown.
-    */
-    @Override
-    public void addDocumentReference(String localIdentifier, String parentIdentifier, String relationshipType,
-      String[] dataNames, Object[][] dataValues, Long originationTime)
-      throws ManifoldCFException
-    {
-      addDocumentReference(localIdentifier,parentIdentifier,relationshipType,dataNames,dataValues,originationTime,null);
-    }
-
-    /** Add a document description to the current job's queue.
-    *@param localIdentifier is the local document identifier to add (for the connector that
-    * fetched the document).
-    *@param parentIdentifier is the document identifier that is considered to be the "parent"
-    * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-    *@param relationshipType is the string describing the kind of relationship described by this
-    * reference.  This must be one of the strings returned by the IRepositoryConnector method
-    * "getRelationshipTypes()".  May be null.
-    *@param dataNames is the list of carry-down data from the parent to the child.  May be null.  Each name is limited to 255 characters!
-    *@param dataValues are the values that correspond to the data names in the dataNames parameter.  May be null only if dataNames is null.
-    */
-    @Override
-    public void addDocumentReference(String localIdentifier, String parentIdentifier, String relationshipType,
-      String[] dataNames, Object[][] dataValues)
-      throws ManifoldCFException
-    {
-      addDocumentReference(localIdentifier,parentIdentifier,relationshipType,dataNames,dataValues,null);
-    }
-
-    /** Add a document description to the current job's queue.
-    *@param localIdentifier is the local document identifier to add (for the connector that
-    * fetched the document).
-    *@param parentIdentifier is the document identifier that is considered to be the "parent"
-    * of this identifier.  May be null, if no hopcount filtering desired for this kind of relationship.
-    *@param relationshipType is the string describing the kind of relationship described by this
-    * reference.  This must be one of the strings returned by the IRepositoryConnector method
-    * "getRelationshipTypes()".  May be null.
-    */
-    @Override
-    public void addDocumentReference(String localIdentifier, String parentIdentifier, String relationshipType)
-      throws ManifoldCFException
-    {
-      addDocumentReference(localIdentifier,parentIdentifier,relationshipType,null,null);
-    }
-
-    /** Add a document description to the current job's queue.  This method is equivalent to
-    * addDocumentReference(localIdentifier,null,null).
-    *@param localIdentifier is the local document identifier to add (for the connector that
-    * fetched the document).
-    */
-    @Override
-    public void addDocumentReference(String localIdentifier)
-      throws ManifoldCFException
-    {
-      addDocumentReference(localIdentifier,null,null,null,null);
-    }
-
-    /** Retrieve data passed from parents to a specified child document.
-    *@param localIdentifier is the document identifier of the document we want the recorded data for.
-    *@param dataName is the name of the data items to retrieve.
-    *@return an array containing the unique data values passed from ALL parents.  Note that these are in no particular order, and there will not be any duplicates.
-    */
-    @Override
-    public String[] retrieveParentData(String localIdentifier, String dataName)
-      throws ManifoldCFException
-    {
-      return jobManager.retrieveParentData(jobID,ManifoldCF.hash(localIdentifier),dataName);
-    }
-
-    /** Retrieve data passed from parents to a specified child document.
-    *@param localIdentifier is the document identifier of the document we want the recorded data for.
-    *@param dataName is the name of the data items to retrieve.
-    *@return an array containing the unique data values passed from ALL parents.  Note that these are in no particular order, and there will not be any duplicates.
-    */
-    @Override
-    public CharacterInput[] retrieveParentDataAsFiles(String localIdentifier, String dataName)
-      throws ManifoldCFException
-    {
-      return jobManager.retrieveParentDataAsFiles(jobID,ManifoldCF.hash(localIdentifier),dataName);
-    }
-
-    /** Record a document version, but don't ingest it.
-    *@param documentIdentifier is the document identifier.
-    *@param version is the document version.
-    */
-    @Override
-    public void recordDocument(String documentIdentifier, String version)
-      throws ManifoldCFException
-    {
-      recordDocument(documentIdentifier,null,version);
-    }
-
-    /** Record a document version, WITHOUT reindexing it, or removing it.  (Other
-    * documents with the same URL, however, will still be removed.)  This is
-    * useful if the version string changes but the document contents are known not
-    * to have changed.
-    *@param documentIdentifier is the document identifier.
-    *@param componentIdentifier is the component document identifier, if any.
-    *@param version is the document version.
-    */
-    @Override
-    public void recordDocument(String documentIdentifier,
-      String componentIdentifier,
-      String version)
-      throws ManifoldCFException
-    {
-      String documentIdentifierHash = ManifoldCF.hash(documentIdentifier);
-      String componentIdentifierHash = computeComponentIDHash(componentIdentifier);
-      checkMultipleDispositions(documentIdentifier,componentIdentifier,componentIdentifierHash);
-      ingester.documentRecord(
-        pipelineSpecification,
-        connectionName,documentIdentifierHash,componentIdentifierHash,
-        version,currentTime);
-      touchedSet.add(documentIdentifier);
-      touchComponentSet(documentIdentifier,componentIdentifierHash);
-    }
-
-    /** Ingest the current document.
-    *@param documentIdentifier is the document's local identifier.
-    *@param version is the version of the document, as reported by the getDocumentVersions() method of the
-    *       corresponding repository connector.
-    *@param documentURI is the URI to use to retrieve this document from the search interface (and is
-    *       also the unique key in the index).
-    *@param data is the document data.  The data is closed after ingestion is complete.
-    *@throws IOException only when data stream reading fails.
-    */
-    @Override
-    public void ingestDocumentWithException(String documentIdentifier, String version, String documentURI, RepositoryDocument data)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      ingestDocumentWithException(documentIdentifier,null,version,documentURI,data);
-    }
-
-    /** Ingest the current document.
-    *@param documentIdentifier is the document's identifier.
-    *@param componentIdentifier is the component document identifier, if any.
-    *@param version is the version of the document, as reported by the getDocumentVersions() method of the
-    *       corresponding repository connector.
-    *@param documentURI is the URI to use to retrieve this document from the search interface (and is
-    *       also the unique key in the index).
-    *@param data is the document data.  The data is closed after ingestion is complete.
-    *@throws IOException only when data stream reading fails.
-    */
-    @Override
-    public void ingestDocumentWithException(String documentIdentifier,
-      String componentIdentifier,
-      String version, String documentURI, RepositoryDocument data)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      // We should not get called here if versions agree, unless the repository
-      // connector cannot distinguish between versions - in which case it must
-      // always ingest (essentially)
-
-      String documentIdentifierHash = ManifoldCF.hash(documentIdentifier);
-      String componentIdentifierHash = computeComponentIDHash(componentIdentifier);
-      checkMultipleDispositions(documentIdentifier,componentIdentifier,componentIdentifierHash);
-
-      // This method currently signals whether the document is accepted or rejected permanently.
-      // Permanent rejection should involve leaving the document in the queue (since it probably
-      // will be rediscovered), and noting its version (so that we don't try doing anything with it
-      // again).  But the documentIngest method will already take care of the latter, so we really need to
-      // do nothing different based on the results of the documentIngest invocation.
-      // The only time it would be great to do something different would be if the document's version
-      // indicates that it should always be refetched.  But I have no way to describe this situation
-      // in the database at the moment.
-      ingester.documentIngest(
-        computePipelineSpecificationWithVersions(documentIdentifierHash,componentIdentifierHash,documentIdentifier),
-        connectionName,documentIdentifierHash,componentIdentifierHash,
-        version,
-        connection.getACLAuthority(),
-        data,currentTime,
-        documentURI,
-        ingestLogger);
-      
-      touchedSet.add(documentIdentifier);
-      touchComponentSet(documentIdentifier,componentIdentifierHash);
-    }
-
-    /** Remove the specified document from the search engine index, while keeping track of the version information
-    * for it (to reduce churn).
-    *@param documentIdentifier is the document's local identifier.
-    *@param version is the version string to be recorded for the document.
-    */
-    @Override
-    public void noDocument(String documentIdentifier, String version)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      noDocument(documentIdentifier,null,version);
-    }
-
-    /** Remove the specified document from the search engine index, and update the
-    * recorded version information for the document.
-    *@param documentIdentifier is the document's local identifier.
-    *@param componentIdentifier is the component document identifier, if any.
-    *@param version is the version string to be recorded for the document.
-    */
-    @Override
-    public void noDocument(String documentIdentifier,
-      String componentIdentifier,
-      String version)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      // Special interpretation for empty version string; treat as if the document doesn't exist
-      // (by ignoring it and allowing it to be deleted later)
-      String documentIdentifierHash = ManifoldCF.hash(documentIdentifier);
-      String componentIdentifierHash = computeComponentIDHash(componentIdentifier);
-      checkMultipleDispositions(documentIdentifier,componentIdentifier,componentIdentifierHash);
-
-      ingester.documentNoData(
-        computePipelineSpecificationWithVersions(documentIdentifierHash,componentIdentifierHash,documentIdentifier),
-        connectionName,documentIdentifierHash,componentIdentifierHash,
-        version,
-        connection.getACLAuthority(),
-        currentTime,
-        ingestLogger);
-      
-      touchedSet.add(documentIdentifier);
-      touchComponentSet(documentIdentifier,componentIdentifierHash);
-    }
-
-    /** Remove the specified document primary component permanently from the search engine index,
-    * and from the status table.  Use this method when your document has components and
-    * now also has a primary document, but will not have a primary document again for the foreseeable
-    * future.  This is a rare situation.
-    *@param documentIdentifier is the document's identifier.
-    */
-    @Override
-    public void removeDocument(String documentIdentifier)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      checkMultipleDispositions(documentIdentifier,null,null);
-
-      String documentIdentifierHash = ManifoldCF.hash(documentIdentifier);
-      ingester.documentRemove(
-        pipelineSpecification,
-        connectionName,documentIdentifierHash,null,
-        ingestLogger);
-        
-      // Note that we touched it, so it won't get checked
-      touchedSet.add(documentIdentifier);
-      touchComponentSet(documentIdentifier,null);
-    }
-
-    /** Retain existing document component.  Use this method to signal that an already-existing
-    * document component does not need to be reindexed.  The default behavior is to remove
-    * components that are not mentioned during processing.
-    *@param documentIdentifier is the document's identifier.
-    *@param componentIdentifier is the component document identifier, which cannot be null.
-    */
-    @Override
-    public void retainDocument(String documentIdentifier,
-      String componentIdentifier)
-      throws ManifoldCFException
-    {
-      String componentIdentifierHash = computeComponentIDHash(componentIdentifier);
-      checkMultipleDispositions(documentIdentifier,componentIdentifier,componentIdentifierHash);
-      touchComponentSet(documentIdentifier,componentIdentifierHash);
-    }
-
-    /** Retain all existing document components of a primary document.  Use this method to signal that
-    * no document components need to be reindexed.  The default behavior is to remove
-    * components that are not mentioned during processing.
-    *@param documentIdentifier is the document's identifier.
-    */
-    @Override
-    public void retainAllComponentDocument(String documentIdentifier)
-      throws ManifoldCFException
-    {
-      checkAllComponentsMultipleDispositions(documentIdentifier);
-      touchAllComponentsSet(documentIdentifier);
-    }
-
-    /** Delete the specified document from the search engine index, and from the status table.  This
-    *  method does NOT keep track of version
-    * information for the document and thus can lead to "churn", whereby the same document is queued, processed,
-    * and removed on subsequent crawls.  It is therefore preferable to use noDocument() instead,
-    * in any case where the same decision will need to be made over and over.
-    *@param documentIdentifier is the document's identifier.
-    */
-    @Override
-    public void deleteDocument(String documentIdentifier)
-      throws ManifoldCFException
-    {
-      documentDeletedSet.add(documentIdentifier);
-    }
-
-    /** Override the schedule for the next time a document is crawled.
-    * Calling this method allows you to set an upper recrawl bound, lower recrawl bound, upper expire bound, lower expire bound,
-    * or a combination of these, on a specific document.  This method is only effective if the job is a continuous one, and if the
-    * identifier you pass in is being processed.
-    *@param localIdentifier is the document's local identifier.
-    *@param lowerRecrawlBoundTime is the time in ms since epoch that the reschedule time should not fall BELOW, or null if none.
-    *@param upperRecrawlBoundTime is the time in ms since epoch that the reschedule time should not rise ABOVE, or null if none.
-    *@param lowerExpireBoundTime is the time in ms since epoch that the expire time should not fall BELOW, or null if none.
-    *@param upperExpireBoundTime is the time in ms since epoch that the expire time should not rise ABOVE, or null if none.
-    */
-    @Override
-    public void setDocumentScheduleBounds(String localIdentifier,
-      Long lowerRecrawlBoundTime, Long upperRecrawlBoundTime,
-      Long lowerExpireBoundTime, Long upperExpireBoundTime)
-      throws ManifoldCFException
-    {
-      if (lowerRecrawlBoundTime != null)
-        lowerRescheduleBounds.put(localIdentifier,lowerRecrawlBoundTime);
-      else
-        lowerRescheduleBounds.remove(localIdentifier);
-      if (upperRecrawlBoundTime != null)
-        upperRescheduleBounds.put(localIdentifier,upperRecrawlBoundTime);
-      else
-        upperRescheduleBounds.remove(localIdentifier);
-      if (lowerExpireBoundTime != null)
-        lowerExpireBounds.put(localIdentifier,lowerExpireBoundTime);
-      else
-        lowerExpireBounds.remove(localIdentifier);
-      if (upperExpireBoundTime != null)
-        upperExpireBounds.put(localIdentifier,upperExpireBoundTime);
-      else
-        upperExpireBounds.remove(localIdentifier);
-    }
-
-    /** Override a document's origination time.
-    * Use this method to signal the framework that a document's origination time is something other than the first time it was crawled.
-    *@param localIdentifier is the document's local identifier.
-    *@param originationTime is the document's origination time, or null if unknown.
-    */
-    @Override
-    public void setDocumentOriginationTime(String localIdentifier,
-      Long originationTime)
-      throws ManifoldCFException
-    {
-      if (originationTime == null)
-        originationTimes.remove(localIdentifier);
-      else
-        originationTimes.put(localIdentifier,originationTime);
-    }
-
-    /** Find a document's lower rescheduling time bound, if any */
-    public Long getDocumentRescheduleLowerBoundTime(String localIdentifier)
-    {
-      return lowerRescheduleBounds.get(localIdentifier);
-    }
-
-    /** Find a document's upper rescheduling time bound, if any */
-    public Long getDocumentRescheduleUpperBoundTime(String localIdentifier)
-    {
-      return upperRescheduleBounds.get(localIdentifier);
-    }
-
-    /** Find a document's lower expiration time bound, if any */
-    public Long getDocumentExpirationLowerBoundTime(String localIdentifier)
-    {
-      return lowerExpireBounds.get(localIdentifier);
-    }
-
-    /** Find a document's upper expiration time bound, if any */
-    public Long getDocumentExpirationUpperBoundTime(String localIdentifier)
-    {
-      return upperExpireBounds.get(localIdentifier);
-    }
-
-    /** Get a document's origination time */
-    public Long getDocumentOriginationTime(String localIdentifier)
-    {
-      return originationTimes.get(localIdentifier);
-    }
-
-    public Long calculateDocumentRescheduleTime(long currentTime, long timeAmt, String localIdentifier)
-    {
-      Long recrawlTime = null;
-      //Long recrawlInterval = job.getInterval();
-      if (recrawlInterval != null)
-      {
-        //Long maxInterval = job.getMaxInterval();
-        long actualInterval = recrawlInterval.longValue() + timeAmt;
-        if (maxInterval != null && actualInterval > maxInterval.longValue())
-          actualInterval = maxInterval.longValue();
-        recrawlTime = new Long(currentTime + actualInterval);
-      }
-      if (Logging.scheduling.isDebugEnabled())
-        Logging.scheduling.debug("Default rescan time for document '"+localIdentifier+"' is "+((recrawlTime==null)?"NEVER":recrawlTime.toString()));
-      Long lowerBound = getDocumentRescheduleLowerBoundTime(localIdentifier);
-      if (lowerBound != null)
-      {
-        if (recrawlTime == null || recrawlTime.longValue() < lowerBound.longValue())
-        {
-          recrawlTime = lowerBound;
-          if (Logging.scheduling.isDebugEnabled())
-            Logging.scheduling.debug(" Rescan time overridden for document '"+localIdentifier+"' due to lower bound; new value is "+recrawlTime.toString());
-        }
-      }
-      Long upperBound = getDocumentRescheduleUpperBoundTime(localIdentifier);
-      if (upperBound != null)
-      {
-        if (recrawlTime == null || recrawlTime.longValue() > upperBound.longValue())
-        {
-          recrawlTime = upperBound;
-          if (Logging.scheduling.isDebugEnabled())
-            Logging.scheduling.debug(" Rescan time overridden for document '"+localIdentifier+"' due to upper bound; new value is "+recrawlTime.toString());
-        }
-      }
-      return recrawlTime;
-    }
-
-    public Long calculateDocumentExpireTime(long currentTime, String localIdentifier)
-    {
-      // For expire time, we take the document's origination time, plus the expiration interval (which comes from the job).
-      Long originationTime = getDocumentOriginationTime(localIdentifier);
-      if (originationTime == null)
-        originationTime = new Long(currentTime);
-      //Long expireInterval = job.getExpiration();
-      Long expireTime = null;
-      if (expireInterval != null)
-        expireTime = new Long(originationTime.longValue() + expireInterval.longValue());
-      Long lowerBound = getDocumentExpirationLowerBoundTime(localIdentifier);
-      if (lowerBound != null)
-      {
-        if (expireTime == null || expireTime.longValue() < lowerBound.longValue())
-          expireTime = lowerBound;
-      }
-      Long upperBound = getDocumentExpirationUpperBoundTime(localIdentifier);
-      if (upperBound != null)
-      {
-        if (expireTime == null || expireTime.longValue() > upperBound.longValue())
-          expireTime = upperBound;
-      }
-      return expireTime;
-    }
-
-    /** Reset the recorded times */
-    public void resetTimes()
-    {
-      lowerRescheduleBounds.clear();
-      upperRescheduleBounds.clear();
-      lowerExpireBounds.clear();
-      upperExpireBounds.clear();
-    }
-
-    /** Record time-stamped information about the activity of the connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityIdentifier is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    *@param childIdentifiers is a set of child entity identifiers associated with this activity.  May be null.
-    */
-    @Override
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityIdentifier, String resultCode, String resultDescription, String[] childIdentifiers)
-      throws ManifoldCFException
-    {
-      connMgr.recordHistory(connection.getName(),startTime,activityType,dataSize,entityIdentifier,resultCode,
-        resultDescription,childIdentifiers);
-    }
-
-    /** Flush the outstanding references into the database.
-    */
-    public void flush()
-      throws ManifoldCFException
-    {
-      processDocumentReferences();
-    }
-
-    /** Process outstanding document references, in batch.
-    */
-    protected void processDocumentReferences()
-      throws ManifoldCFException
-    {
-      if (referenceList.size() == 0)
-        return;
-
-      // We have to segregate the references by link type and parent.
-      Map<DocumentBin,List<DocumentReference>> linkBins = new HashMap<DocumentBin,List<DocumentReference>>();
-      for (DocumentReference dr : referenceList.keySet())
-      {
-        DocumentBin key = dr.getKey();
-        List<DocumentReference> set = linkBins.get(key);
-        if (set == null)
-        {
-          set = new ArrayList<DocumentReference>();
-          linkBins.put(key,set);
-        }
-        set.add(dr);
-      }
-
-      // Now, go through link types.
-      for (DocumentBin db : linkBins.keySet())
-      {
-        List<DocumentReference> set = linkBins.get(db);
-
-        String[] docidHashes = new String[set.size()];
-        String[] docids = new String[set.size()];
-        IPriorityCalculator[] priorities = new IPriorityCalculator[set.size()];
-        String[][] dataNames = new String[docids.length][];
-        Object[][][] dataValues = new Object[docids.length][][];
-        String[][] eventNames = new String[docids.length][];
-
-        long currentTime = System.currentTimeMillis();
-
-        double currentMinimumDepth = rt.getMinimumDepth();
-        rt.clearPreloadRequests();
-        for (int j = 0; j < docidHashes.length; j++)
-        {
-          DocumentReference dr = set.get(j);
-          docidHashes[j] = dr.getLocalIdentifierHash();
-          docids[j] = dr.getLocalIdentifier();
-          dataNames[j] = dr.getDataNames();
-          dataValues[j] = dr.getDataValues();
-          eventNames[j] = dr.getPrerequisiteEventNames();
-
-          // Calculate desired document priority based on current queuetracker status.
-          String[] bins = ManifoldCF.calculateBins(connector,dr.getLocalIdentifier());
-          PriorityCalculator p = new PriorityCalculator(rt,currentMinimumDepth,connection,bins,dr.getLocalIdentifier());
-          priorities[j] = p;
-          p.makePreloadRequest();
-        }
-        rt.preloadBinValues();
-
-        jobManager.addDocuments(processID,
-          jobID,legalLinkTypes,docidHashes,docids,db.getParentIdentifierHash(),db.getLinkType(),hopcountMode,
-          dataNames,dataValues,priorities,eventNames);
-        
-        rt.clearPreloadedValues();
-      }
-
-      discard();
-    }
-
-    /** Check whether current job is still active.
-    * This method is provided to allow an individual connector that needs to wait on some long-term condition to give up waiting due to the job
-    * itself being aborted.  If the connector should abort, this method will raise a properly-formed ServiceInterruption, which if thrown to the
-    * caller, will signal that the current processing activity remains incomplete and must be retried when the job is resumed.
-    */
-    @Override
-    public void checkJobStillActive()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (jobManager.checkJobActive(jobID) == false)
-        throw new ServiceInterruption("Job no longer active",System.currentTimeMillis());
-    }
-
-    /** Begin an event sequence.
-    * This method should be called by a connector when a sequencing event should enter the "pending" state.  If the event is already in that state,
-    * this method will return false, otherwise true.  The connector has the responsibility of appropriately managing sequencing given the response
-    * status.
-    *@param eventName is the event name.
-    *@return false if the event is already in the "pending" state.
-    */
-    @Override
-    public boolean beginEventSequence(String eventName)
-      throws ManifoldCFException
-    {
-      return jobManager.beginEventSequence(processID,eventName);
-    }
-
-    /** Complete an event sequence.
-    * This method should be called to signal that an event is no longer in the "pending" state.  This can mean that the prerequisite processing is
-    * completed, but it can also mean that prerequisite processing was aborted or cannot be completed.
-    * Note well: This method should not be called unless the connector is CERTAIN that an event is in progress, and that the current thread has
-    * the sole right to complete it.  Otherwise, race conditions can develop which would be difficult to diagnose.
-    *@param eventName is the event name.
-    */
-    @Override
-    public void completeEventSequence(String eventName)
-      throws ManifoldCFException
-    {
-      jobManager.completeEventSequence(eventName);
-    }
-
-    /** Abort processing a document (for sequencing reasons).
-    * This method should be called in order to cause the specified document to be requeued for later processing.  While this is similar in some respects
-    * to the semantics of a ServiceInterruption, it is applicable to only one document at a time, and also does not specify any delay period, since it is
-    * presumed that the reason for the requeue is because of sequencing issues synchronized around an underlying event.
-    *@param localIdentifier is the document identifier to requeue
-    */
-    @Override
-    public void retryDocumentProcessing(String localIdentifier)
-      throws ManifoldCFException
-    {
-      // Accumulate aborts
-      abortSet.add(localIdentifier);
-    }
-
-    /** Detect if a date is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-    * unusable documents that will be passed to this output connector.
-    *@param date is the date of the document; may be null
-    *@return true if a document with that date is indexable by this connector.
-    */
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return ingester.checkDateIndexable(
-        pipelineSpecification,date,
-        ingestLogger);
-    }
-
-    /** Check whether a mime type is indexable by the currently specified output connector.
-    *@param mimeType is the mime type to check, not including any character set specification.
-    *@return true if the mime type is indexable.
-    */
-    @Override
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return ingester.checkMimeTypeIndexable(
-        pipelineSpecification,mimeType,
-        ingestLogger);
-    }
-
-    /** Check whether a document is indexable by the currently specified output connector.
-    *@param localFile is the local copy of the file to check.
-    *@return true if the document is indexable.
-    */
-    @Override
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return ingester.checkDocumentIndexable(
-        pipelineSpecification,localFile,
-        ingestLogger);
-    }
-
-    /** Check whether a document of a specified length is indexable by the currently specified output connector.
-    *@param length is the length to check.
-    *@return true if the document is indexable.
-    */
-    @Override
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return ingester.checkLengthIndexable(
-        pipelineSpecification,length,
-        ingestLogger);
-    }
-
-    /** Pre-determine whether a document's URL is indexable by this connector.  This method is used by participating repository connectors
-    * to help filter out documents that are not worth indexing.
-    *@param url is the URL of the document.
-    *@return true if the file is indexable.
-    */
-    @Override
-    public boolean checkURLIndexable(String url)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return ingester.checkURLIndexable(
-        pipelineSpecification,url,
-        ingestLogger);
-    }
-
-    /** Create a global string from a simple string.
-    *@param simpleString is the simple string.
-    *@return a global string.
-    */
-    @Override
-    public String createGlobalString(String simpleString)
-    {
-      return ManifoldCF.createGlobalString(simpleString);
-    }
-
-    /** Create a connection-specific string from a simple string.
-    *@param simpleString is the simple string.
-    *@return a connection-specific string.
-    */
-    @Override
-    public String createConnectionSpecificString(String simpleString)
-    {
-      return ManifoldCF.createConnectionSpecificString(connection.getName(),simpleString);
-    }
-
-    /** Create a job-based string from a simple string.
-    *@param simpleString is the simple string.
-    *@return a job-specific string.
-    */
-    @Override
-    public String createJobSpecificString(String simpleString)
-    {
-      return ManifoldCF.createJobSpecificString(jobID,simpleString);
-    }
-
-    protected void checkAllComponentsMultipleDispositions(String documentIdentifier)
-    {
-      if (abortSet.contains(documentIdentifier))
-        throw new IllegalStateException("Multiple document dispositions not allowed: Abort cannot be combined with component disposition; document '"+documentIdentifier+"'");
-      if (documentDeletedSet.contains(documentIdentifier))
-        throw new IllegalStateException("Multiple document dispositions not allowed: Document delete cannot be combined with component disposition; document '"+documentIdentifier+"'");
-      Set<String> components = touchedComponentSet.get(documentIdentifier);
-      if (components != null && components.size() > 0)
-        throw new IllegalStateException("Multiple document dispositions not allowed: Retain all components cannot be combined with individual component disposition; document '"+documentIdentifier+"'");
-    }
-    
-    protected void checkMultipleDispositions(String documentIdentifier, String componentIdentifier, String componentIdentifierHash)
-    {
-      if (abortSet.contains(documentIdentifier))
-        throw new IllegalStateException("Multiple document dispositions not allowed: Abort cannot be combined with component disposition; document '"+documentIdentifier+"'");
-      if (documentDeletedSet.contains(documentIdentifier))
-        throw new IllegalStateException("Multiple document dispositions not allowed: Document delete cannot be combined with component disposition; document '"+documentIdentifier+"'");
-      if (componentIdentifierHash == null)
-      {
-        // Primary
-        if (touchedPrimarySet.contains(documentIdentifier))
-          throw new IllegalStateException("Multiple document primary component dispositions not allowed: document '"+documentIdentifier+"'");
-      }
-      else
-      {
-        if (allComponentsSet.contains(documentIdentifier))
-          throw new IllegalStateException("Multiple document component dispositions not allowed: document '"+documentIdentifier+"', component '"+componentIdentifier+"'");
-        Set<String> components = touchedComponentSet.get(documentIdentifier);
-        if (components != null && components.contains(componentIdentifierHash))
-          throw new IllegalStateException("Multiple document component dispositions not allowed: document '"+documentIdentifier+"', component '"+componentIdentifier+"'");
-      }
-    }
-    
-    protected void touchAllComponentsSet(String documentIdentifier)
-    {
-      allComponentsSet.add(documentIdentifier);
-    }
-    
-    protected void touchComponentSet(String documentIdentifier, String componentIdentifierHash)
-    {
-      if (componentIdentifierHash == null)
-      {
-        touchedPrimarySet.add(documentIdentifier);
-        return;
-      }
-      Set<String> components = touchedComponentSet.get(documentIdentifier);
-      if (components == null)
-      {
-        components = new HashSet<String>();
-        touchedComponentSet.put(documentIdentifier,components);
-      }
-      components.add(componentIdentifierHash);
-    }
-    
-    protected IPipelineSpecificationWithVersions computePipelineSpecificationWithVersions(String documentIdentifierHash,
-      String componentIdentifierHash,
-      String documentIdentifier)
-    {
-      QueuedDocument qd = previousDocuments.get(documentIdentifierHash);
-      if (qd == null)
-        throw new IllegalArgumentException("Unrecognized document identifier: '"+documentIdentifier+"'");
-      return new PipelineSpecificationWithVersions(pipelineSpecification,qd,componentIdentifierHash);
-    }
-
-  }
-
-  protected static String computeComponentIDHash(String componentIdentifier)
-    throws ManifoldCFException
-  {
-    if (componentIdentifier != null)
-      return ManifoldCF.hash(componentIdentifier);
-    else
-      return null;
-  }
-    
-  /** DocumentBin class */
-  protected static class DocumentBin
-  {
-    protected String linkType;
-    protected String parentIdentifierHash;
-
-    public DocumentBin(String parentIdentifierHash, String linkType)
-    {
-      this.parentIdentifierHash = parentIdentifierHash;
-      this.linkType = linkType;
-    }
-
-    public String getParentIdentifierHash()
-    {
-      return parentIdentifierHash;
-    }
-
-    public String getLinkType()
-    {
-      return linkType;
-    }
-
-    public int hashCode()
-    {
-      return ((linkType==null)?0:linkType.hashCode()) + ((parentIdentifierHash==null)?0:parentIdentifierHash.hashCode());
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof DocumentBin))
-        return false;
-      DocumentBin db = (DocumentBin)o;
-      if (linkType == null || db.linkType == null)
-      {
-        if (linkType != db.linkType)
-          return false;
-      }
-      else
-      {
-        if (!linkType.equals(db.linkType))
-          return false;
-      }
-      if (parentIdentifierHash == null || db.parentIdentifierHash == null)
-      {
-        if (parentIdentifierHash != db.parentIdentifierHash)
-          return false;
-      }
-      else
-      {
-        if (!parentIdentifierHash.equals(db.parentIdentifierHash))
-          return false;
-      }
-      return true;
-    }
-    
-  }
-
-  /** Class describing document reference.
-  * Note: If the same document reference occurs multiple times, the data names and values should AGGREGATE, rather than the newer one replacing the older.
-  * Similar treatment will occur for prerequisites, although that's unlikely to be used.
-  */
-  protected static class DocumentReference
-  {
-    protected String localIdentifierHash;
-    protected String localIdentifier;
-    protected DocumentBin db;
-    /** This hashmap is keyed by data name and has a hashmap as a value (which contains the data values) */
-    protected HashMap data = new HashMap();
-    /** This hashmap contains the prerequisite event names */
-    protected HashMap prereqEvents = new HashMap();
-
-    public DocumentReference(String localIdentifierHash, String localIdentifier, DocumentBin db)
-    {
-      this.localIdentifierHash = localIdentifierHash;
-      this.localIdentifier = localIdentifier;
-      this.db = db;
-    }
-
-    /** Close all object data references.  This should be called whenever a DocumentReference object is abandoned. */
-    public void discard()
-      throws ManifoldCFException
-    {
-      Iterator iter = data.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String dataName = (String)iter.next();
-        ArrayList list = (ArrayList)data.get(dataName);
-        int i = 0;
-        while (i < list.size())
-        {
-          Object o = (Object)list.get(i++);
-          if (o instanceof CharacterInput)
-            ((CharacterInput)o).discard();
-        }
-      }
-    }
-
-    public void addData(String[] dataNames, Object[][] dataValues)
-    {
-      if (dataNames == null || dataValues == null)
-        return;
-      int i = 0;
-      while (i < dataNames.length)
-      {
-        addData(dataNames[i],dataValues[i]);
-        i++;
-      }
-    }
-
-    public void addData(String dataName, Object[] dataValues)
-    {
-      if (dataName == null || dataValues == null)
-        return;
-      int i = 0;
-      while (i < dataValues.length)
-      {
-        addData(dataName,dataValues[i++]);
-      }
-    }
-
-    public void addData(String dataName, Object dataValue)
-    {
-      if (dataName == null)
-        return;
-      ArrayList valueMap = (ArrayList)data.get(dataName);
-      if (valueMap == null)
-      {
-        valueMap = new ArrayList();
-        data.put(dataName,valueMap);
-      }
-      // Without the hash value, it's impossible to keep track of value uniqueness in this layer.  So, I've removed any attempts to do so; jobManager.addDocuments()
-      // will have to do that job instead.
-      valueMap.add(dataValue);
-    }
-
-    public void addPrerequisiteEvents(String[] eventNames)
-    {
-      if (eventNames == null)
-        return;
-      int i = 0;
-      while (i < eventNames.length)
-      {
-        addPrerequisiteEvent(eventNames[i++]);
-      }
-    }
-
-    public void addPrerequisiteEvent(String eventName)
-    {
-      prereqEvents.put(eventName,eventName);
-    }
-
-    public DocumentBin getKey()
-    {
-      return db;
-    }
-
-    public String getLocalIdentifierHash()
-    {
-      return localIdentifierHash;
-    }
-
-    public String getLocalIdentifier()
-    {
-      return localIdentifier;
-    }
-
-    public String[] getPrerequisiteEventNames()
-    {
-      String[] rval = new String[prereqEvents.size()];
-      int i = 0;
-      Iterator iter = prereqEvents.keySet().iterator();
-      while (iter.hasNext())
-      {
-        rval[i++] = (String)iter.next();
-      }
-      return rval;
-    }
-
-    public String[] getDataNames()
-    {
-      String[] rval = new String[data.size()];
-      int i = 0;
-      Iterator iter = data.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String dataName = (String)iter.next();
-        rval[i++] = dataName;
-      }
-      return rval;
-    }
-
-    public Object[][] getDataValues()
-    {
-      // Presumably the values will correspond with the names ONLY if no changes have occurred to the hash table.
-      Object[][] rval = new Object[data.size()][];
-      int i = 0;
-      Iterator iter = data.keySet().iterator();
-      while (iter.hasNext())
-      {
-        String dataName = (String)iter.next();
-        ArrayList values = (ArrayList)data.get(dataName);
-        Object[] valueArray = new Object[values.size()];
-        rval[i] = valueArray;
-        int j = 0;
-        while (j < valueArray.length)
-        {
-          valueArray[j] = values.get(j);
-          j++;
-        }
-        i++;
-      }
-      return rval;
-    }
-
-    public boolean equals(Object o)
-    {
-      if (!(o instanceof DocumentReference))
-        return false;
-      DocumentReference other = (DocumentReference)o;
-      if (!other.localIdentifierHash.equals(localIdentifierHash))
-        return false;
-      return other.db.equals(db);
-    }
-
-    public int hashCode()
-    {
-      return localIdentifierHash.hashCode() + db.hashCode();
-    }
-  }
-
-  /** Class that represents a decision to process a document.
-  */
-  protected static class DocumentToProcess
-  {
-    protected QueuedDocument document;
-    protected boolean scanOnly;
-
-    /** Construct.
-    *@param document is the document to process.
-    *@param scanOnly is true if the document should be scanned, but not ingested.
-    */
-    public DocumentToProcess(QueuedDocument document, boolean scanOnly)
-    {
-      this.document = document;
-      this.scanOnly = scanOnly;
-    }
-
-    /** Get the document.
-    *@return the document.
-    */
-    public QueuedDocument getDocument()
-    {
-      return document;
-    }
-
-    /** Get the 'scan only' flag.
-    *@return true if only scan should be attempted.
-    */
-    public boolean getScanOnly()
-    {
-      return scanOnly;
-    }
-  }
-
-  /** The check activity class */
-  protected static class CheckActivity implements IOutputCheckActivity
-  {
-    public CheckActivity()
-    {
-    }
-
-    /** Detect if a date is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-    * in the first place.
-    *@param date is the document's date
-    *@return true if the document with that date can be accepted by the downstream connection.
-    */
-    @Override
-    public boolean checkDateIndexable(Date date)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return false;
-    }
-
-    /** Detect if a mime type is acceptable downstream or not.  This method is used to determine whether it makes sense to fetch a document
-    * in the first place.
-    *@param mimeType is the mime type of the document.
-    *@return true if the mime type can be accepted by the downstream connection.
-    */
-    @Override
-    public boolean checkMimeTypeIndexable(String mimeType)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return false;
-    }
-
-    /** Pre-determine whether a document (passed here as a File object) is acceptable downstream.  This method is
-    * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
-    * search engines that only handle a small set of accepted file types.
-    *@param localFile is the local file to check.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkDocumentIndexable(File localFile)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return false;
-    }
-
-    /** Pre-determine whether a document's length is acceptable downstream.  This method is used
-    * to determine whether to fetch a document in the first place.
-    *@param length is the length of the document.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkLengthIndexable(long length)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return false;
-    }
-
-    /** Pre-determine whether a document's URL is acceptable downstream.  This method is used
-    * to help filter out documents that cannot be indexed in advance.
-    *@param url is the URL of the document.
-    *@return true if the file is acceptable by the downstream connection.
-    */
-    @Override
-    public boolean checkURLIndexable(String url)
-      throws ManifoldCFException, ServiceInterruption
-    {
-      return false;
-    }
-    
-  }
-  
-  /** The implementation of the IExistingVersions interface.
-  */
-  protected static class ExistingVersions implements IExistingVersions
-  {
-    protected final Map<String,QueuedDocument> map;
-    protected final String lastOutputConnectionName;
-    
-    public ExistingVersions(String lastOutputConnectionName, List<QueuedDocument> list)
-    {
-      this.lastOutputConnectionName = lastOutputConnectionName;
-      this.map = new HashMap<String,QueuedDocument>();
-      for (QueuedDocument qd : list)
-      {
-        map.put(qd.getDocumentDescription().getDocumentIdentifier(),qd);
-      }
-    }
-    
-    /** Retrieve an existing version string given a document identifier.
-    *@param documentIdentifier is the document identifier.
-    *@return the document version string, or null if the document was never previously indexed.
-    */
-    @Override
-    public String getIndexedVersionString(String documentIdentifier)
-      throws ManifoldCFException
-    {
-      return getIndexedVersionString(documentIdentifier,null);
-    }
-
-    /** Retrieve a component existing version string given a document identifier.
-    *@param documentIdentifier is the document identifier.
-    *@param componentIdentifier is the component identifier, if any.
-    *@return the document version string, or null of the document component was never previously indexed.
-    */
-    @Override
-    public String getIndexedVersionString(String documentIdentifier, String componentIdentifier)
-      throws ManifoldCFException
-    {
-      QueuedDocument qd = map.get(documentIdentifier);
-      DocumentIngestStatusSet status = qd.getLastIngestedStatus(lastOutputConnectionName);
-      if (status == null)
-        return null;
-      String componentIdentifierHash;
-      if (componentIdentifier == null)
-        componentIdentifierHash = null;
-      else
-        componentIdentifierHash = ManifoldCF.hash(componentIdentifier);
-      DocumentIngestStatus s = status.getComponent(componentIdentifierHash);
-      if (s == null)
-        return null;
-      return s.getDocumentVersion();
-    }
-
-  }
-  
-  /** The ingest logger class */
-  protected static class OutputActivity extends CheckActivity implements IOutputActivity
-  {
-
-    // Connection name
-    protected final String connectionName;
-    // Connection manager
-    protected final IRepositoryConnectionManager connMgr;
-
-    /** Constructor */
-    public OutputActivity(String connectionName, IRepositoryConnectionManager connMgr)
-    {
-      this.connectionName = connectionName;
-      this.connMgr = connMgr;
-    }
-
-    /** Record time-stamped information about the activity of the output connector.
-    *@param startTime is either null or the time since the start of epoch in milliseconds (Jan 1, 1970).  Every
-    *       activity has an associated time; the startTime field records when the activity began.  A null value
-    *       indicates that the start time and the finishing time are the same.
-    *@param activityType is a string which is fully interpretable only in the context of the connector involved, which is
-    *       used to categorize what kind of activity is being recorded.  For example, a web connector might record a
-    *       "fetch document" activity.  Cannot be null.
-    *@param dataSize is the number of bytes of data involved in the activity, or null if not applicable.
-    *@param entityURI is a (possibly long) string which identifies the object involved in the history record.
-    *       The interpretation of this field will differ from connector to connector.  May be null.
-    *@param resultCode contains a terse description of the result of the activity.  The description is limited in
-    *       size to 255 characters, and can be interpreted only in the context of the current connector.  May be null.
-    *@param resultDescription is a (possibly long) human-readable string which adds detail, if required, to the result
-    *       described in the resultCode field.  This field is not meant to be queried on.  May be null.
-    */
-    @Override
-    public void recordActivity(Long startTime, String activityType, Long dataSize,
-      String entityURI, String resultCode, String resultDescription)
-      throws ManifoldCFException
-    {
-      connMgr.recordHistory(connectionName,startTime,activityType,dataSize,entityURI,resultCode,
-        resultDescription,null);
-    }
-
-    /** Qualify an access token appropriately, to match access tokens as returned by mod_aa.  This method
-    * includes the authority name with the access token, if any, so that each authority may establish its own token space.
-    *@param authorityNameString is the name of the authority to use to qualify the access token.
-    *@param accessToken is the raw, repository access token.
-    *@return the properly qualified access token.
-    */
-    @Override
-    public String qualifyAccessToken(String authorityNameString, String accessToken)
-      throws ManifoldCFException
-    {
-        if (authorityNameString == null)
-          return URLEncoder.encode(accessToken);
-        else
-          return URLEncoder.encode(authorityNameString) + ":" + URLEncoder.encode(accessToken);
-    }
-
-    /** Send a document via the pipeline to the next output connection.
-    *@param documentURI is the document's URI.
-    *@param document is the document data to be processed (handed to the output data store).
-    *@return the document status (accepted or permanently rejected); return codes are listed in IPipelineConnector.
-    *@throws IOException only if there's an IO error reading the data from the document.
-    */
-    @Override
-    public int sendDocument(String documentURI, RepositoryDocument document)
-      throws ManifoldCFException, ServiceInterruption, IOException
-    {
-      // No downstream connection at output connection level.
-      return IPipelineConnector.DOCUMENTSTATUS_REJECTED;
-    }
-
-    /** Send NO document via the pipeline to the next output connection.  This is equivalent
-    * to sending an empty document placeholder.
-    */
-    @Override
-    public void noDocument()
-      throws ManifoldCFException, ServiceInterruption
-    {
-    }
-
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseHSQLDB.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseHSQLDB.java
deleted file mode 100644
index a1bab4b..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseHSQLDB.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDB extends org.apache.manifoldcf.agents.tests.BaseHSQLDB
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    mgr.registerAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      IAgentManager mgr = AgentManagerFactory.make(tc);
-      mgr.unregisterAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localInitialize(tc);
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localCleanup(tc);
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseHSQLDBext.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseHSQLDBext.java
deleted file mode 100644
index 759a2f1..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseHSQLDBext.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseHSQLDBext extends org.apache.manifoldcf.agents.tests.BaseHSQLDBext
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    mgr.registerAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      IAgentManager mgr = AgentManagerFactory.make(tc);
-      mgr.unregisterAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localInitialize(tc);
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localCleanup(tc);
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITHSQLDB.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITHSQLDB.java
deleted file mode 100644
index 3c98e5f..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITHSQLDB.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITHSQLDB extends ConnectorBaseHSQLDB
-{
-  protected final ManifoldCFInstance mcfInstance;
-  
-  public BaseITHSQLDB()
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance();
-  }
-  
-  public BaseITHSQLDB(boolean singleWar)
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance(singleWar);
-  }
-  
-  public BaseITHSQLDB(boolean singleWar, boolean webapps)
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance(singleWar, webapps);
-  }
-  
-  // Basic job support
-  
-  protected void waitJobInactiveNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    mcfInstance.waitJobInactiveNative(jobManager,jobID,maxTime);
-  }
-  
-  protected void waitJobDeletedNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    mcfInstance.waitJobDeletedNative(jobManager,jobID,maxTime);
-  }
-
-  // API support
-  
-  // These methods allow communication with the ManifoldCF api webapp, via the locally-instantiated jetty
-  
-  protected void startJobAPI(String jobIDString)
-    throws Exception
-  {
-    mcfInstance.startJobAPI(jobIDString);
-  }
-  
-  protected void deleteJobAPI(String jobIDString)
-    throws Exception
-  {
-    mcfInstance.deleteJobAPI(jobIDString);
-  }
-
-  protected String getJobStatusAPI(String jobIDString)
-    throws Exception
-  {
-    return mcfInstance.getJobStatusAPI(jobIDString);
-  }
-  
-  protected long getJobDocumentsProcessedAPI(String jobIDString)
-    throws Exception
-  {
-    return mcfInstance.getJobDocumentsProcessedAPI(jobIDString);
-  }
-
-  protected void waitJobInactiveAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    mcfInstance.waitJobInactiveAPI(jobIDString,maxTime);
-  }
-
-  protected void waitJobDeletedAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    mcfInstance.waitJobDeletedAPI(jobIDString,maxTime);
-  }
-  
-  /** Construct a command url.
-  */
-  protected String makeAPIURL(String command)
-    throws Exception
-  {
-    return mcfInstance.makeAPIURL(command);
-  }
-  
-  /** Perform an json API GET operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIGetOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIGetOperation(apiURL,expectedResponse);
-  }
-
-  /** Perform an json API DELETE operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIDeleteOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIDeleteOperation(apiURL,expectedResponse);
-  }
-
-  /** Perform an json API PUT operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIPutOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    return mcfInstance.performAPIPutOperation(apiURL,expectedResponse,input);
-  }
-
-  /** Perform an json API POST operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIPostOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    return mcfInstance.performAPIPostOperation(apiURL,expectedResponse,input);
-  }
-
-  /** Perform a json GET API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIGetOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIGetOperationViaNodes(command,expectedResponse);
-  }
-
-  /** Perform a json DELETE API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIDeleteOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIDeleteOperationViaNodes(command,expectedResponse);
-  }
-
-  /** Perform a json PUT API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIPutOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    return mcfInstance.performAPIPutOperationViaNodes(command,expectedResponse,argument);
-  }
-
-  /** Perform a json POST API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIPostOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    return mcfInstance.performAPIPostOperationViaNodes(command,expectedResponse,argument);
-  }
-
-  // Setup/teardown
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    mcfInstance.start();
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    Exception currentException = null;
-    try
-    {
-      mcfInstance.stop();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    // Last, shut down the web applications.
-    // If this is done too soon it closes the database before the rest of the cleanup happens.
-    try
-    {
-      mcfInstance.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    if (currentException != null)
-      throw currentException;
-    cleanupSystem();
-  }
-  
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITMySQL.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITMySQL.java
deleted file mode 100644
index e784017..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITMySQL.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITMySQL extends ConnectorBaseMySQL
-{
-  protected final ManifoldCFInstance mcfInstance;
-  
-  public BaseITMySQL()
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance();
-  }
-  
-  public BaseITMySQL(boolean singleWar)
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance(singleWar);
-  }
-
-  // Basic job support
-  
-  protected void waitJobInactiveNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    mcfInstance.waitJobInactiveNative(jobManager,jobID,maxTime);
-  }
-  
-  protected void waitJobDeletedNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    mcfInstance.waitJobDeletedNative(jobManager,jobID,maxTime);
-  }
-
-  // API support
-  
-  // These methods allow communication with the ManifoldCF api webapp, via the locally-instantiated jetty
-  
-  protected void startJobAPI(String jobIDString)
-    throws Exception
-  {
-    mcfInstance.startJobAPI(jobIDString);
-  }
-  
-  protected void deleteJobAPI(String jobIDString)
-    throws Exception
-  {
-    mcfInstance.deleteJobAPI(jobIDString);
-  }
-
-  protected String getJobStatusAPI(String jobIDString)
-    throws Exception
-  {
-    return mcfInstance.getJobStatusAPI(jobIDString);
-  }
-  
-  protected long getJobDocumentsProcessedAPI(String jobIDString)
-    throws Exception
-  {
-    return mcfInstance.getJobDocumentsProcessedAPI(jobIDString);
-  }
-
-  protected void waitJobInactiveAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    mcfInstance.waitJobInactiveAPI(jobIDString,maxTime);
-  }
-
-  protected void waitJobDeletedAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    mcfInstance.waitJobDeletedAPI(jobIDString,maxTime);
-  }
-  
-  /** Construct a command url.
-  */
-  protected String makeAPIURL(String command)
-    throws Exception
-  {
-    return mcfInstance.makeAPIURL(command);
-  }
-  
-  /** Perform an json API GET operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIGetOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIGetOperation(apiURL,expectedResponse);
-  }
-
-  /** Perform an json API DELETE operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIDeleteOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIDeleteOperation(apiURL,expectedResponse);
-  }
-
-  /** Perform an json API PUT operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIPutOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    return mcfInstance.performAPIPutOperation(apiURL,expectedResponse,input);
-  }
-
-  /** Perform an json API POST operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIPostOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    return mcfInstance.performAPIPostOperation(apiURL,expectedResponse,input);
-  }
-
-  /** Perform a json GET API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIGetOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIGetOperationViaNodes(command,expectedResponse);
-  }
-
-  /** Perform a json DELETE API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIDeleteOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIDeleteOperationViaNodes(command,expectedResponse);
-  }
-
-  /** Perform a json PUT API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIPutOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    return mcfInstance.performAPIPutOperationViaNodes(command,expectedResponse,argument);
-  }
-
-  /** Perform a json POST API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIPostOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    return mcfInstance.performAPIPostOperationViaNodes(command,expectedResponse,argument);
-  }
-
-  // Setup/teardown
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    mcfInstance.start();
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    Exception currentException = null;
-    try
-    {
-      mcfInstance.stop();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    // Last, shut down the web applications.
-    // If this is done too soon it closes the database before the rest of the cleanup happens.
-    try
-    {
-      mcfInstance.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    if (currentException != null)
-      throw currentException;
-    cleanupSystem();
-  }
-  
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITPostgresql.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITPostgresql.java
deleted file mode 100644
index 984f919..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseITPostgresql.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class BaseITPostgresql extends ConnectorBasePostgresql
-{
-  protected final ManifoldCFInstance mcfInstance;
-  
-  public BaseITPostgresql()
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance();
-  }
-  
-  public BaseITPostgresql(boolean singleWar)
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance(singleWar);
-  }
-  
-  // Basic job support
-  
-  protected void waitJobInactiveNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    mcfInstance.waitJobInactiveNative(jobManager,jobID,maxTime);
-  }
-  
-  protected void waitJobDeletedNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    mcfInstance.waitJobDeletedNative(jobManager,jobID,maxTime);
-  }
-
-  // API support
-  
-  // These methods allow communication with the ManifoldCF api webapp, via the locally-instantiated jetty
-  
-  protected void startJobAPI(String jobIDString)
-    throws Exception
-  {
-    mcfInstance.startJobAPI(jobIDString);
-  }
-  
-  protected void deleteJobAPI(String jobIDString)
-    throws Exception
-  {
-    mcfInstance.deleteJobAPI(jobIDString);
-  }
-
-  protected String getJobStatusAPI(String jobIDString)
-    throws Exception
-  {
-    return mcfInstance.getJobStatusAPI(jobIDString);
-  }
-  
-  protected long getJobDocumentsProcessedAPI(String jobIDString)
-    throws Exception
-  {
-    return mcfInstance.getJobDocumentsProcessedAPI(jobIDString);
-  }
-
-  protected void waitJobInactiveAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    mcfInstance.waitJobInactiveAPI(jobIDString,maxTime);
-  }
-
-  protected void waitJobDeletedAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    mcfInstance.waitJobDeletedAPI(jobIDString,maxTime);
-  }
-  
-  /** Construct a command url.
-  */
-  protected String makeAPIURL(String command)
-    throws Exception
-  {
-    return mcfInstance.makeAPIURL(command);
-  }
-  
-  /** Perform an json API GET operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIGetOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIGetOperation(apiURL,expectedResponse);
-  }
-
-  /** Perform an json API DELETE operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIDeleteOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIDeleteOperation(apiURL,expectedResponse);
-  }
-
-  /** Perform an json API PUT operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIPutOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    return mcfInstance.performAPIPutOperation(apiURL,expectedResponse,input);
-  }
-
-  /** Perform an json API POST operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  protected String performAPIPostOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    return mcfInstance.performAPIPostOperation(apiURL,expectedResponse,input);
-  }
-
-  /** Perform a json GET API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIGetOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIGetOperationViaNodes(command,expectedResponse);
-  }
-
-  /** Perform a json DELETE API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIDeleteOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    return mcfInstance.performAPIDeleteOperationViaNodes(command,expectedResponse);
-  }
-
-  /** Perform a json PUT API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIPutOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    return mcfInstance.performAPIPutOperationViaNodes(command,expectedResponse,argument);
-  }
-
-  /** Perform a json POST API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  protected Configuration performAPIPostOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    return mcfInstance.performAPIPostOperationViaNodes(command,expectedResponse,argument);
-  }
-
-  // Setup/teardown
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    mcfInstance.start();
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    Exception currentException = null;
-    try
-    {
-      mcfInstance.stop();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    // Last, shut down the web applications.
-    // If this is done too soon it closes the database before the rest of the cleanup happens.
-    try
-    {
-      mcfInstance.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    if (currentException != null)
-      throw currentException;
-    cleanupSystem();
-  }
-  
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseMySQL.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseMySQL.java
deleted file mode 100644
index cba246c..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BaseMySQL.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BaseMySQL extends org.apache.manifoldcf.agents.tests.BaseMySQL
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    mgr.registerAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      IAgentManager mgr = AgentManagerFactory.make(tc);
-      mgr.unregisterAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localInitialize(tc);
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localCleanup(tc);
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BasePostgresql.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BasePostgresql.java
deleted file mode 100644
index ddd03e3..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/BasePostgresql.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/* $Id: TestBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class BasePostgresql extends org.apache.manifoldcf.agents.tests.BasePostgresql
-{
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-    IAgentManager mgr = AgentManagerFactory.make(tc);
-    mgr.registerAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    try
-    {
-      IAgentManager mgr = AgentManagerFactory.make(tc);
-      mgr.unregisterAgent("org.apache.manifoldcf.crawler.system.CrawlerAgent");
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-  protected void initializeSystem()
-    throws Exception
-  {
-    super.initializeSystem();
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localInitialize(tc);
-  }
-  
-  protected void cleanupSystem()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
-    org.apache.manifoldcf.crawler.system.ManifoldCF.localCleanup(tc);
-    super.cleanupSystem();
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeHSQLDBTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeHSQLDBTest.java
deleted file mode 100644
index c1f07bd..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeHSQLDBTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test of connection caching */
-public class ConnectionChangeHSQLDBTest extends ConnectorBaseHSQLDB
-{
-  protected final ManifoldCFInstance mcfInstance;
-  protected ConnectionChangeTester tester;
-
-  public ConnectionChangeHSQLDBTest()
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance("A",false,false);
-    tester = new ConnectionChangeTester(mcfInstance);
-  }
-  
-  @Override
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.ConnectionChangeRepositoryConnector"};
-  }
-  
-  @Override
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"ConnectionChangeConnector"};
-  }
-
-  @Override
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  @Override
-  protected String[] getOutputNames()
-  {
-    return new String[]{"NullOutput"};
-  }
-
-  @Test
-  public void interruptionTestRun()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    Exception currentException = null;
-    // Last, shut down the web applications.
-    // If this is done too soon it closes the database before the rest of the cleanup happens.
-    try
-    {
-      mcfInstance.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    if (currentException != null)
-      throw currentException;
-    cleanupSystem();
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeRepositoryConnector.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeRepositoryConnector.java
deleted file mode 100644
index 2d3bd08..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeRepositoryConnector.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** Connector class to be used by integration test that insures caching is not stuck in some way */
-public class ConnectionChangeRepositoryConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public ConnectionChangeRepositoryConnector()
-  {
-  }
-
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String docCount = "10";
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals("documentcount"))
-        docCount = sn.getAttributeValue("count");
-    }
-    int count = Integer.parseInt(docCount);
-    
-    for (int i = 0; i < count; i++)
-    {
-      String doc = "test"+i+".txt";
-      activities.addSeedDocument(doc,null);
-    }
-    return "";
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String blockOnDocument = params.getParameter("proceed");
-    boolean block = (blockOnDocument==null||blockOnDocument.equals("false"));
-    
-    for (int i = 0; i < documentIdentifiers.length; i++)
-    {
-      String documentIdentifier = documentIdentifiers[i];
-      if (block && documentIdentifier.equals("test0.txt"))
-      {
-        // This will emulate one particular document failing (and being skipped)
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Pretending there's a service interruption",
-          null,currentTime+1000L,currentTime+5000L,1000,true);
-      }
-      RepositoryDocument rd = new RepositoryDocument();
-      byte[] bytes = documentIdentifier.getBytes(StandardCharsets.UTF_8);
-      rd.setBinary(new ByteArrayInputStream(bytes),bytes.length);
-      try
-      {
-        activities.ingestDocumentWithException(documentIdentifier,"","http://"+documentIdentifier,rd);
-      }
-      catch (IOException e)
-      {
-        throw new RuntimeException("Shouldn't be seeing IOException from binary array input stream: "+e.getMessage(),e);
-      }
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeTester.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeTester.java
deleted file mode 100644
index 650a12d..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectionChangeTester.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a test whether we deal with changes to configuration properly */
-public class ConnectionChangeTester
-{
-  protected final ManifoldCFInstance instance;
-  
-  public ConnectionChangeTester(ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    instance.start();
-    
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("ConnectionChangeTest Connection");
-    conn.setDescription("ConnectionChangeTest Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.tests.ConnectionChangeRepositoryConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("ConnectionChangeTest Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    //job.setOutputConnectionName("Null Connection");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it is running.
-    jobManager.manualStart(job.getID());
-    instance.waitJobRunningNative(jobManager,job.getID(),30000L);
-    
-    // Now, update the connection to allow the job to finish.
-    conn = mgr.load("ConnectionChangeTest Connection");
-    ConfigParams cp = conn.getConfigParams();
-    cp.setParameter("proceed","true");
-    mgr.save(conn);
-    
-    // Wait for the job to become inactive.  The time should not exceed 10 seconds for the actual crawl.
-    instance.waitJobInactiveNative(jobManager,job.getID(),30000L);
-    // The document will be skipped in the end.
-    if (jobManager.getStatus(job.getID()).getDocumentsProcessed() != 10)
-      throw new Exception("Expected 10 documents, saw "+jobManager.getStatus(job.getID()).getDocumentsProcessed());
-    
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),60000L);
-
-    // Shut down instance2
-    instance.stop();
-  }
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseHSQLDB.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseHSQLDB.java
deleted file mode 100644
index f7bef5c..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseHSQLDB.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class ConnectorBaseHSQLDB extends org.apache.manifoldcf.crawler.tests.BaseHSQLDB
-{
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[0];
-  }
-  
-  @Override
-  protected void writeConnectors(StringBuilder output)
-    throws Exception
-  {
-    String[] connectorClasses = getConnectorClasses();
-    String[] connectorNames = getConnectorNames();
-    for (int i = 0; i < connectorNames.length; i++)
-    {
-      output.append("    <repositoryconnector name=\""+connectorNames[i]+"\" class=\""+connectorClasses[i]+"\"/>\n");
-    }
-    
-    String[] outputClasses = getOutputClasses();
-    String[] outputNames = getOutputNames();
-    for (int i = 0; i < outputNames.length; i++)
-    {
-      output.append("    <outputconnector name=\""+outputNames[i]+"\" class=\""+outputClasses[i]+"\"/>\n");
-    }
-
-    String[] authorityClasses = getAuthorityClasses();
-    String[] authorityNames = getAuthorityNames();
-    for (int i = 0; i < authorityNames.length; i++)
-    {
-      output.append("    <authorityconnector name=\""+authorityNames[i]+"\" class=\""+authorityClasses[i]+"\"/>\n");
-    }
-
-  }
-
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-
-    // Deregistration should be done in a transaction
-    database.beginTransaction();
-    try
-    {
-      int i;
-      
-      String[] connectorClasses = getConnectorClasses();
-      String[] connectorNames = getConnectorNames();
-
-      i = 0;
-      while (i < connectorClasses.length)
-      {
-        // First, register connector
-        mgr.registerConnector(connectorNames[i],connectorClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-        // For each connection name, modify the jobs to note that the connector is now installed
-        jobManager.noteConnectorRegistration(connectionNames);
-        i++;
-      }
-      
-      String[] authorityClasses = getAuthorityClasses();
-      String[] authorityNames = getAuthorityNames();
-      
-      i = 0;
-      while (i < authorityClasses.length)
-      {
-        authMgr.registerConnector(authorityNames[i],authorityClasses[i]);
-        i++;
-      }
-      
-      String[] outputClasses = getOutputClasses();
-      String[] outputNames = getOutputNames();
-      
-      i = 0;
-      while (i < outputClasses.length)
-      {
-        // First, register connector
-        outputMgr.registerConnector(outputNames[i],outputClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-        // For all connection names, notify all agents of the registration
-        AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
-        i++;
-      }
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    Exception currentException = null;
-    // First, tear down all jobs, connections, authority connections, and output connections.
-    try
-    {
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(tc);
-      IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(tc);
-      IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-        
-      // Now, get a list of the repository connections
-      IRepositoryConnection[] connections = connMgr.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        connMgr.delete(connections[i++].getName());
-      }
-
-      // Get a list of authority connections
-      IAuthorityConnection[] authorities = authConnMgr.getAllConnections();
-      i = 0;
-      while (i < authorities.length)
-      {
-        authConnMgr.delete(authorities[i++].getName());
-      }
-        
-      // Finally, get rid of output connections
-      IOutputConnection[] outputs = outputMgr.getAllConnections();
-      i = 0;
-      while (i < outputs.length)
-      {
-        outputMgr.delete(outputs[i++].getName());
-      }
-
-    }
-    catch (Exception e)
-    {
-      currentException = e;
-    }
-    try
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-        
-      IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-      IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-      IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-      IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-        
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        int i;
-          
-        String[] connectorClasses = getConnectorClasses();
-
-        i = 0;
-        while (i < connectorClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-          // For each connection name, modify the jobs to note that the connector is no longer installed
-          jobManager.noteConnectorDeregistration(connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.unregisterConnector(connectorClasses[i]);
-          i++;
-        }
-          
-        String[] authorityClasses = getAuthorityClasses();
-          
-        i = 0;
-        while (i < authorityClasses.length)
-        {
-          authMgr.unregisterConnector(authorityClasses[i]);
-          i++;
-        }
-          
-        String[] outputClasses = getOutputClasses();
-          
-        i = 0;
-        while (i < outputClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-          // For all connection names, notify all agents of the deregistration
-          AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          outputMgr.unregisterConnector(outputClasses[i]);
-          i++;
-        }
-          
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseHSQLDBext.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseHSQLDBext.java
deleted file mode 100644
index 5a216d7..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseHSQLDBext.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class ConnectorBaseHSQLDBext extends org.apache.manifoldcf.crawler.tests.BaseHSQLDBext
-{
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[0];
-  }
-
-  @Override
-  protected void writeConnectors(StringBuilder output)
-    throws Exception
-  {
-    String[] connectorClasses = getConnectorClasses();
-    String[] connectorNames = getConnectorNames();
-    for (int i = 0; i < connectorNames.length; i++)
-    {
-      output.append("    <repositoryconnector name=\""+connectorNames[i]+"\" class=\""+connectorClasses[i]+"\"/>\n");
-    }
-    
-    String[] outputClasses = getOutputClasses();
-    String[] outputNames = getOutputNames();
-    for (int i = 0; i < outputNames.length; i++)
-    {
-      output.append("    <outputconnector name=\""+outputNames[i]+"\" class=\""+outputClasses[i]+"\"/>\n");
-    }
-
-    String[] authorityClasses = getAuthorityClasses();
-    String[] authorityNames = getAuthorityNames();
-    for (int i = 0; i < authorityNames.length; i++)
-    {
-      output.append("    <authorityconnector name=\""+authorityNames[i]+"\" class=\""+authorityClasses[i]+"\"/>\n");
-    }
-
-  }
-
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-
-    // Deregistration should be done in a transaction
-    database.beginTransaction();
-    try
-    {
-      int i;
-      
-      String[] connectorClasses = getConnectorClasses();
-      String[] connectorNames = getConnectorNames();
-
-      i = 0;
-      while (i < connectorClasses.length)
-      {
-        // First, register connector
-        mgr.registerConnector(connectorNames[i],connectorClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-        // For each connection name, modify the jobs to note that the connector is now installed
-        jobManager.noteConnectorRegistration(connectionNames);
-        i++;
-      }
-      
-      String[] authorityClasses = getAuthorityClasses();
-      String[] authorityNames = getAuthorityNames();
-      
-      i = 0;
-      while (i < authorityClasses.length)
-      {
-        authMgr.registerConnector(authorityNames[i],authorityClasses[i]);
-        i++;
-      }
-      
-      String[] outputClasses = getOutputClasses();
-      String[] outputNames = getOutputNames();
-      
-      i = 0;
-      while (i < outputClasses.length)
-      {
-        // First, register connector
-        outputMgr.registerConnector(outputNames[i],outputClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-        // For all connection names, notify all agents of the registration
-        AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
-        i++;
-      }
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-     
-    Exception currentException = null;
-    // First, tear down all jobs, connections, authority connections, and output connections.
-    try
-    {
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(tc);
-      IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(tc);
-      IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-      
-      // Now, get a list of the repository connections
-      IRepositoryConnection[] connections = connMgr.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        connMgr.delete(connections[i++].getName());
-      }
-
-      // Get a list of authority connections
-      IAuthorityConnection[] authorities = authConnMgr.getAllConnections();
-      i = 0;
-      while (i < authorities.length)
-      {
-        authConnMgr.delete(authorities[i++].getName());
-      }
-      
-      // Finally, get rid of output connections
-      IOutputConnection[] outputs = outputMgr.getAllConnections();
-      i = 0;
-      while (i < outputs.length)
-      {
-        outputMgr.delete(outputs[i++].getName());
-      }
-
-    }
-    catch (Exception e)
-    {
-      currentException = e;
-    }
-    try
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-      
-      IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-      IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-      IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-      IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-      
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        int i;
-        
-        String[] connectorClasses = getConnectorClasses();
-
-        i = 0;
-        while (i < connectorClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-          // For each connection name, modify the jobs to note that the connector is no longer installed
-          jobManager.noteConnectorDeregistration(connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.unregisterConnector(connectorClasses[i]);
-          i++;
-        }
-        
-        String[] authorityClasses = getAuthorityClasses();
-        
-        i = 0;
-        while (i < authorityClasses.length)
-        {
-          authMgr.unregisterConnector(authorityClasses[i]);
-          i++;
-        }
-        
-        String[] outputClasses = getOutputClasses();
-        
-        i = 0;
-        while (i < outputClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-          // For all connection names, notify all agents of the deregistration
-          AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          outputMgr.unregisterConnector(outputClasses[i]);
-          i++;
-        }
-        
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseMySQL.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseMySQL.java
deleted file mode 100644
index 415f181..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseMySQL.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class ConnectorBaseMySQL extends org.apache.manifoldcf.crawler.tests.BaseMySQL
-{
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[0];
-  }
-
-  @Override
-  protected void writeConnectors(StringBuilder output)
-    throws Exception
-  {
-    String[] connectorClasses = getConnectorClasses();
-    String[] connectorNames = getConnectorNames();
-    for (int i = 0; i < connectorNames.length; i++)
-    {
-      output.append("    <repositoryconnector name=\""+connectorNames[i]+"\" class=\""+connectorClasses[i]+"\"/>\n");
-    }
-    
-    String[] outputClasses = getOutputClasses();
-    String[] outputNames = getOutputNames();
-    for (int i = 0; i < outputNames.length; i++)
-    {
-      output.append("    <outputconnector name=\""+outputNames[i]+"\" class=\""+outputClasses[i]+"\"/>\n");
-    }
-
-    String[] authorityClasses = getAuthorityClasses();
-    String[] authorityNames = getAuthorityNames();
-    for (int i = 0; i < authorityNames.length; i++)
-    {
-      output.append("    <authorityconnector name=\""+authorityNames[i]+"\" class=\""+authorityClasses[i]+"\"/>\n");
-    }
-
-  }
-
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-
-    // Deregistration should be done in a transaction
-    database.beginTransaction();
-    try
-    {
-      int i;
-      
-      String[] connectorClasses = getConnectorClasses();
-      String[] connectorNames = getConnectorNames();
-
-      i = 0;
-      while (i < connectorClasses.length)
-      {
-        // First, register connector
-        mgr.registerConnector(connectorNames[i],connectorClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-        // For each connection name, modify the jobs to note that the connector is now installed
-        jobManager.noteConnectorRegistration(connectionNames);
-        i++;
-      }
-      
-      String[] authorityClasses = getAuthorityClasses();
-      String[] authorityNames = getAuthorityNames();
-      
-      i = 0;
-      while (i < authorityClasses.length)
-      {
-        authMgr.registerConnector(authorityNames[i],authorityClasses[i]);
-        i++;
-      }
-      
-      String[] outputClasses = getOutputClasses();
-      String[] outputNames = getOutputNames();
-      
-      i = 0;
-      while (i < outputClasses.length)
-      {
-        // First, register connector
-        outputMgr.registerConnector(outputNames[i],outputClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-        // For all connection names, notify all agents of the registration
-        AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
-        i++;
-      }
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    
-    Exception currentException = null;
-    // First, tear down all jobs, connections, authority connections, and output connections.
-    try
-    {
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(tc);
-      IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(tc);
-      IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-      
-      // Now, get a list of the repository connections
-      IRepositoryConnection[] connections = connMgr.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        connMgr.delete(connections[i++].getName());
-      }
-
-      // Get a list of authority connections
-      IAuthorityConnection[] authorities = authConnMgr.getAllConnections();
-      i = 0;
-      while (i < authorities.length)
-      {
-        authConnMgr.delete(authorities[i++].getName());
-      }
-      
-      // Finally, get rid of output connections
-      IOutputConnection[] outputs = outputMgr.getAllConnections();
-      i = 0;
-      while (i < outputs.length)
-      {
-        outputMgr.delete(outputs[i++].getName());
-      }
-
-    }
-    catch (Exception e)
-    {
-      currentException = e;
-    }
-    try
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-      
-      IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-      IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-      IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-      IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-      
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        int i;
-        
-        String[] connectorClasses = getConnectorClasses();
-
-        i = 0;
-        while (i < connectorClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-          // For each connection name, modify the jobs to note that the connector is no longer installed
-          jobManager.noteConnectorDeregistration(connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.unregisterConnector(connectorClasses[i]);
-          i++;
-        }
-        
-        String[] authorityClasses = getAuthorityClasses();
-        
-        i = 0;
-        while (i < authorityClasses.length)
-        {
-          authMgr.unregisterConnector(authorityClasses[i]);
-          i++;
-        }
-        
-        String[] outputClasses = getOutputClasses();
-        
-        i = 0;
-        while (i < outputClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-          // For all connection names, notify all agents of the deregistration
-          AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          outputMgr.unregisterConnector(outputClasses[i]);
-          i++;
-        }
-        
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBasePostgresql.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBasePostgresql.java
deleted file mode 100644
index 08dea61..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBasePostgresql.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/* $Id: TestConnectorBase.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.authorities.interfaces.*;
-import org.apache.manifoldcf.core.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a testing base class that is responsible for setting up/tearing down the agents framework. */
-public class ConnectorBasePostgresql extends org.apache.manifoldcf.crawler.tests.BasePostgresql
-{
-  
-  protected String[] getConnectorClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getConnectorNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getAuthorityNames()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputClasses()
-  {
-    return new String[0];
-  }
-  
-  protected String[] getOutputNames()
-  {
-    return new String[0];
-  }
-
-  @Override
-  protected void writeConnectors(StringBuilder output)
-    throws Exception
-  {
-    String[] connectorClasses = getConnectorClasses();
-    String[] connectorNames = getConnectorNames();
-    for (int i = 0; i < connectorNames.length; i++)
-    {
-      output.append("    <repositoryconnector name=\""+connectorNames[i]+"\" class=\""+connectorClasses[i]+"\"/>\n");
-    }
-    
-    String[] outputClasses = getOutputClasses();
-    String[] outputNames = getOutputNames();
-    for (int i = 0; i < outputNames.length; i++)
-    {
-      output.append("    <outputconnector name=\""+outputNames[i]+"\" class=\""+outputClasses[i]+"\"/>\n");
-    }
-
-    String[] authorityClasses = getAuthorityClasses();
-    String[] authorityNames = getAuthorityNames();
-    for (int i = 0; i < authorityNames.length; i++)
-    {
-      output.append("    <authorityconnector name=\""+authorityNames[i]+"\" class=\""+authorityClasses[i]+"\"/>\n");
-    }
-
-  }
-
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-
-  protected void localSetUp()
-    throws Exception
-  {
-    
-    super.localSetUp();
-    
-    IThreadContext tc = ThreadContextFactory.make();
-
-    IDBInterface database = DBInterfaceFactory.make(tc,
-      ManifoldCF.getMasterDatabaseName(),
-      ManifoldCF.getMasterDatabaseUsername(),
-      ManifoldCF.getMasterDatabasePassword());
-    
-    IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-    IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-    IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-    IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-
-    // Deregistration should be done in a transaction
-    database.beginTransaction();
-    try
-    {
-      int i;
-      
-      String[] connectorClasses = getConnectorClasses();
-      String[] connectorNames = getConnectorNames();
-
-      i = 0;
-      while (i < connectorClasses.length)
-      {
-        // First, register connector
-        mgr.registerConnector(connectorNames[i],connectorClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-        // For each connection name, modify the jobs to note that the connector is now installed
-        jobManager.noteConnectorRegistration(connectionNames);
-        i++;
-      }
-      
-      String[] authorityClasses = getAuthorityClasses();
-      String[] authorityNames = getAuthorityNames();
-      
-      i = 0;
-      while (i < authorityClasses.length)
-      {
-        authMgr.registerConnector(authorityNames[i],authorityClasses[i]);
-        i++;
-      }
-      
-      String[] outputClasses = getOutputClasses();
-      String[] outputNames = getOutputNames();
-      
-      i = 0;
-      while (i < outputClasses.length)
-      {
-        // First, register connector
-        outputMgr.registerConnector(outputNames[i],outputClasses[i]);
-        // Then, signal to all jobs that might depend on this connector that they can switch state
-        // Find the connection names that come with this class
-        String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-        // For all connection names, notify all agents of the registration
-        AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
-        i++;
-      }
-      
-    }
-    catch (ManifoldCFException e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    catch (Error e)
-    {
-      database.signalRollback();
-      throw e;
-    }
-    finally
-    {
-      database.endTransaction();
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    cleanupSystem();
-  }
-
-  protected void localCleanUp()
-    throws Exception
-  {
-    IThreadContext tc = ThreadContextFactory.make();
-    
-    Exception currentException = null;
-    // First, tear down all jobs, connections, authority connections, and output connections.
-    try
-    {
-      IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(tc);
-      IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(tc);
-      IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-      
-      // Now, get a list of the repository connections
-      IRepositoryConnection[] connections = connMgr.getAllConnections();
-      int i = 0;
-      while (i < connections.length)
-      {
-        connMgr.delete(connections[i++].getName());
-      }
-
-      // Get a list of authority connections
-      IAuthorityConnection[] authorities = authConnMgr.getAllConnections();
-      i = 0;
-      while (i < authorities.length)
-      {
-        authConnMgr.delete(authorities[i++].getName());
-      }
-      
-      // Finally, get rid of output connections
-      IOutputConnection[] outputs = outputMgr.getAllConnections();
-      i = 0;
-      while (i < outputs.length)
-      {
-        outputMgr.delete(outputs[i++].getName());
-      }
-
-    }
-    catch (Exception e)
-    {
-      currentException = e;
-    }
-    try
-    {
-      IDBInterface database = DBInterfaceFactory.make(tc,
-        ManifoldCF.getMasterDatabaseName(),
-        ManifoldCF.getMasterDatabaseUsername(),
-        ManifoldCF.getMasterDatabasePassword());
-      
-      IConnectorManager mgr = ConnectorManagerFactory.make(tc);
-      IAuthorityConnectorManager authMgr = AuthorityConnectorManagerFactory.make(tc);
-      IOutputConnectorManager outputMgr = OutputConnectorManagerFactory.make(tc);
-      IOutputConnectionManager outputConnManager = OutputConnectionManagerFactory.make(tc);
-      IJobManager jobManager = JobManagerFactory.make(tc);
-      IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
-      
-      // Deregistration should be done in a transaction
-      database.beginTransaction();
-      try
-      {
-        int i;
-        
-        String[] connectorClasses = getConnectorClasses();
-
-        i = 0;
-        while (i < connectorClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = connManager.findConnectionsForConnector(connectorClasses[i]);
-          // For each connection name, modify the jobs to note that the connector is no longer installed
-          jobManager.noteConnectorDeregistration(connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          mgr.unregisterConnector(connectorClasses[i]);
-          i++;
-        }
-        
-        String[] authorityClasses = getAuthorityClasses();
-        
-        i = 0;
-        while (i < authorityClasses.length)
-        {
-          authMgr.unregisterConnector(authorityClasses[i]);
-          i++;
-        }
-        
-        String[] outputClasses = getOutputClasses();
-        
-        i = 0;
-        while (i < outputClasses.length)
-        {
-          // Find the connection names that come with this class
-          String[] connectionNames = outputConnManager.findConnectionsForConnector(outputClasses[i]);
-          // For all connection names, notify all agents of the deregistration
-          AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
-          // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
-          outputMgr.unregisterConnector(outputClasses[i]);
-          i++;
-        }
-        
-      }
-      catch (ManifoldCFException e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      catch (Error e)
-      {
-        database.signalRollback();
-        throw e;
-      }
-      finally
-      {
-        database.endTransaction();
-      }
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    try
-    {
-      super.localCleanUp();
-    }
-    catch (Exception e)
-    {
-      if (currentException != null)
-        currentException = e;
-    }
-    if (currentException != null)
-      throw currentException;
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIHSQLDB.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIHSQLDB.java
deleted file mode 100644
index a25d523..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIHSQLDB.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class ConnectorBaseUIHSQLDB extends BaseITHSQLDB
-{
-  protected SeleniumTester testerInstance = null;
-  
-  public ConnectorBaseUIHSQLDB()
-  {
-    super();
-  }
-  
-  public ConnectorBaseUIHSQLDB(boolean singleWar)
-  {
-    super(singleWar);
-  }
-
-  @Before
-  public void setupHTMLTester()
-    throws Exception
-  {
-    testerInstance = new SeleniumTester();
-    testerInstance.setup();
-  }
-  
-  @After
-  public void teardownHTMLTester()
-    throws Exception
-  {
-    if (testerInstance != null)
-    {
-      testerInstance.teardown();
-      testerInstance = null;
-    }
-  }
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIMySQL.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIMySQL.java
deleted file mode 100644
index 8cc233d..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIMySQL.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class ConnectorBaseUIMySQL extends BaseITMySQL
-{
-  protected SeleniumTester testerInstance = null;
-  
-  public ConnectorBaseUIMySQL()
-  {
-    super();
-  }
-  
-  public ConnectorBaseUIMySQL(boolean singleWar)
-  {
-    super(singleWar);
-  }
-
-  @Before
-  public void setupHTMLTester()
-    throws Exception
-  {
-    testerInstance = new SeleniumTester();
-    testerInstance.setup();
-  }
-  
-  @After
-  public void teardownHTMLTester()
-    throws Exception
-  {
-    if (testerInstance != null)
-    {
-      testerInstance.teardown();
-      testerInstance = null;
-    }
-  }
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIPostgresql.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIPostgresql.java
deleted file mode 100644
index 5232951..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ConnectorBaseUIPostgresql.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-import org.apache.manifoldcf.core.tests.SeleniumTester;
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class ConnectorBaseUIPostgresql extends BaseITPostgresql
-{
-  protected SeleniumTester testerInstance = null;
-
-  public ConnectorBaseUIPostgresql()
-  {
-    super();
-  }
-  
-  public ConnectorBaseUIPostgresql(boolean singleWar)
-  {
-    super(singleWar);
-  }
-
-  @Before
-  public void setupHTMLTester()
-    throws Exception
-  {
-    testerInstance = new SeleniumTester();
-    testerInstance.setup();
-  }
-  
-  @After
-  public void teardownHTMLTester()
-    throws Exception
-  {
-    if (testerInstance != null)
-    {
-      testerInstance.teardown();
-      testerInstance = null;
-    }
-  }
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionHSQLDBTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionHSQLDBTest.java
deleted file mode 100644
index 9067448..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionHSQLDBTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test of service interruptions */
-public class InterruptionHSQLDBTest extends ConnectorBaseHSQLDB
-{
-  protected final ManifoldCFInstance mcfInstance;
-  protected InterruptionTester tester;
-
-  public InterruptionHSQLDBTest()
-  {
-    super();
-    mcfInstance = new ManifoldCFInstance("A",false,false);
-    tester = new InterruptionTester(mcfInstance);
-  }
-  
-  @Override
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.InterruptionRepositoryConnector"};
-  }
-  
-  @Override
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"InterruptionConnector"};
-  }
-
-  @Override
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  @Override
-  protected String[] getOutputNames()
-  {
-    return new String[]{"NullOutput"};
-  }
-
-  @Test
-  public void interruptionTestRun()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    Exception currentException = null;
-    // Last, shut down the web applications.
-    // If this is done too soon it closes the database before the rest of the cleanup happens.
-    try
-    {
-      mcfInstance.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    if (currentException != null)
-      throw currentException;
-    cleanupSystem();
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionRepositoryConnector.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionRepositoryConnector.java
deleted file mode 100644
index 1095a8a..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionRepositoryConnector.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** Connector class to be used by general integration tests that need documents */
-public class InterruptionRepositoryConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public InterruptionRepositoryConnector()
-  {
-  }
-
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String docCount = "10";
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals("documentcount"))
-        docCount = sn.getAttributeValue("count");
-    }
-    int count = Integer.parseInt(docCount);
-    
-    for (int i = 0; i < count; i++)
-    {
-      String doc = "test"+i+".txt";
-      activities.addSeedDocument(doc,null);
-    }
-    return "";
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    for (int i = 0; i < documentIdentifiers.length; i++)
-    {
-      String documentIdentifier = documentIdentifiers[i];
-      if (documentIdentifier.equals("test0.txt"))
-      {
-        // This will emulate one particular document failing (and being skipped)
-        long currentTime = System.currentTimeMillis();
-        throw new ServiceInterruption("Pretending there's a service interruption",
-          null,currentTime+1000L,currentTime+5000L,10,false);
-      }
-      RepositoryDocument rd = new RepositoryDocument();
-      byte[] bytes = documentIdentifier.getBytes(StandardCharsets.UTF_8);
-      rd.setBinary(new ByteArrayInputStream(bytes),bytes.length);
-      try
-      {
-        activities.ingestDocumentWithException(documentIdentifier,"","http://"+documentIdentifier,rd);
-      }
-      catch (IOException e)
-      {
-        throw new RuntimeException("Shouldn't be seeing IOException from binary array input stream: "+e.getMessage(),e);
-      }
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionTester.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionTester.java
deleted file mode 100644
index 8f07043..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionTester.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a test whether we can handle service interruptions */
-public class InterruptionTester
-{
-  protected final ManifoldCFInstance instance;
-  
-  public InterruptionTester(ManifoldCFInstance instance)
-  {
-    this.instance = instance;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    instance.start();
-    
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("InterruptionTest Connection");
-    conn.setDescription("InterruptionTest Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.tests.InterruptionRepositoryConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("InterruptionTest Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    //job.setOutputConnectionName("Null Connection");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it is running.
-    jobManager.manualStart(job.getID());
-    instance.waitJobRunningNative(jobManager,job.getID(),30000L);
-    
-    // Wait for the job to become inactive.  The time should not exceed 10 seconds for the actual crawl.
-    instance.waitJobInactiveNative(jobManager,job.getID(),60000L);
-    // The document will be skipped in the end.
-    if (jobManager.getStatus(job.getID()).getDocumentsProcessed() != 9)
-      throw new Exception("Expected 9 documents, saw "+jobManager.getStatus(job.getID()).getDocumentsProcessed());
-    
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance.waitJobDeletedNative(jobManager,job.getID(),60000L);
-
-    // Shut down instance2
-    instance.stop();
-  }
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ManifoldCFInstance.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ManifoldCFInstance.java
deleted file mode 100644
index 39b5261..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/ManifoldCFInstance.java
+++ /dev/null
@@ -1,822 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.manifoldcf.agents.system.AgentsDaemon;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.nio.charset.Charset;
-import org.junit.*;
-
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.webapp.WebAppContext;
-
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpEntity;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.ParseException;
-
-
-/** Tests that run the "agents daemon" should be derived from this */
-public class ManifoldCFInstance
-{
-  protected final boolean webapps;
-  protected final boolean singleWar;
-  protected final int testPort;
-  protected final String processID;
-  
-  protected DaemonThread daemonThread = null;
-  protected Server server = null;
-
-  public ManifoldCFInstance()
-  {
-    this("", 8346, false, true);
-  }
-  
-  public ManifoldCFInstance(String processID)
-  {
-    this(processID, 8346, false, true);
-  }
-
-  public ManifoldCFInstance(boolean singleWar)
-  {
-    this("", 8346, singleWar, true);
-  }
-  
-  public ManifoldCFInstance(String processID, boolean singleWar)
-  {
-    this(processID, 8346, singleWar, true);
-  }
-
-  public ManifoldCFInstance(boolean singleWar, boolean webapps)
-  {
-    this("", 8346, singleWar, webapps);
-  }
-
-  public ManifoldCFInstance(String processID, boolean singleWar, boolean webapps)
-  {
-    this(processID, 8346, singleWar, webapps);
-  }
-  
-  public ManifoldCFInstance(String processID, int testPort)
-  {
-    this(processID, testPort, false, true);
-  }
-
-  public ManifoldCFInstance(String processID, int testPort, boolean singleWar)
-  {
-    this(processID, testPort, singleWar, true);
-  }
-
-  public ManifoldCFInstance(String processID, int testPort, boolean singleWar, boolean webapps)
-  {
-    this.processID = processID;
-    this.webapps = webapps;
-    this.testPort = testPort;
-    this.singleWar = singleWar;
-  }
-  
-  // Basic job support
-  
-  public void waitJobInactiveNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      JobStatus status = jobManager.getStatus(jobID);
-      if (status == null)
-        throw new ManifoldCFException("No such job: '"+jobID+"'");
-      int statusValue = status.getStatus();
-      switch (statusValue)
-      {
-        case JobStatus.JOBSTATUS_NOTYETRUN:
-          throw new ManifoldCFException("Job was never started.");
-        case JobStatus.JOBSTATUS_COMPLETED:
-          break;
-        case JobStatus.JOBSTATUS_ERROR:
-          throw new ManifoldCFException("Job reports error status: "+status.getErrorText());
-        default:
-          ManifoldCF.sleep(1000L);
-          continue;
-      }
-      return;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-  
-  public void waitJobDeletedNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      JobStatus status = jobManager.getStatus(jobID);
-      if (status == null)
-        return;
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-    
-  public void waitJobRunningNative(IJobManager jobManager, Long jobID, long maxTime)
-    throws ManifoldCFException, InterruptedException
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      JobStatus status = jobManager.getStatus(jobID);
-      if (status == null)
-        throw new ManifoldCFException("No such job: '"+jobID+"'");
-      int statusValue = status.getStatus();
-      switch (statusValue)
-      {
-        case JobStatus.JOBSTATUS_NOTYETRUN:
-          throw new ManifoldCFException("Job was never started.");
-        case JobStatus.JOBSTATUS_COMPLETED:
-          throw new ManifoldCFException("Job ended on its own!");
-        case JobStatus.JOBSTATUS_ERROR:
-          throw new ManifoldCFException("Job reports error status: "+status.getErrorText());
-        case JobStatus.JOBSTATUS_RUNNING:
-          break;
-        default:
-          ManifoldCF.sleep(1000L);
-          continue;
-      }
-      return;
-    }
-    throw new ManifoldCFException("ManifoldCF did not start in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-
-  // API support
-  
-  // These methods allow communication with the ManifoldCF api webapp, via the locally-instantiated jetty
-  
-  public void loginAPI(String userID, String password)
-    throws Exception
-  {
-    Configuration requestObject = new Configuration();
-    ConfigurationNode cn = new ConfigurationNode("userID");
-    cn.setValue(userID);
-    requestObject.addChild(requestObject.getChildCount(),cn);
-    cn = new ConfigurationNode("password");
-    cn.setValue(password);
-    requestObject.addChild(requestObject.getChildCount(),cn);
-    performAPIPostOperationViaNodes("LOGIN",200,requestObject);
-  }
-  
-  public void startJobAPI(String jobIDString)
-    throws Exception
-  {
-    Configuration requestObject = new Configuration();
-    
-    Configuration result = performAPIPutOperationViaNodes("start/"+jobIDString,201,requestObject);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-  }
-  
-  public void deleteJobAPI(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIDeleteOperationViaNodes("jobs/"+jobIDString,200);
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-    }
-
-  }
-  
-  public String getJobStatusAPI(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatusesnocounts/"+jobIDString,200);
-    String status = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("status"))
-            status = childNode.getValue();
-        }
-      }
-    }
-    return status;
-  }
-
-  public long getJobDocumentsProcessedAPI(String jobIDString)
-    throws Exception
-  {
-    Configuration result = performAPIGetOperationViaNodes("jobstatuses/"+jobIDString,200);
-    String documentsProcessed = null;
-    int i = 0;
-    while (i < result.getChildCount())
-    {
-      ConfigurationNode resultNode = result.findChild(i++);
-      if (resultNode.getType().equals("error"))
-        throw new Exception(resultNode.getValue());
-      else if (resultNode.getType().equals("jobstatus"))
-      {
-        int j = 0;
-        while (j < resultNode.getChildCount())
-        {
-          ConfigurationNode childNode = resultNode.findChild(j++);
-          if (childNode.getType().equals("documents_processed"))
-            documentsProcessed = childNode.getValue();
-        }
-      }
-    }
-    if (documentsProcessed == null)
-      throw new Exception("Expected a documents_processed field, didn't find it");
-    return new Long(documentsProcessed).longValue();
-  }
-
-  public void waitJobInactiveAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatusAPI(jobIDString);
-      if (status == null)
-        throw new Exception("No such job: '"+jobIDString+"'");
-      if (status.equals("not yet run"))
-        throw new Exception("Job was never started.");
-      if (status.equals("done"))
-        return;
-      if (status.equals("error"))
-        throw new Exception("Job reports error.");
-      ManifoldCF.sleep(1000L);
-      continue;
-    }
-    throw new ManifoldCFException("ManifoldCF did not terminate in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-  
-  public void waitJobDeletedAPI(String jobIDString, long maxTime)
-    throws Exception
-  {
-    long startTime = System.currentTimeMillis();
-    while (System.currentTimeMillis() < startTime + maxTime)
-    {
-      String status = getJobStatusAPI(jobIDString);
-      if (status == null)
-        return;
-      ManifoldCF.sleep(1000L);
-    }
-    throw new ManifoldCFException("ManifoldCF did not delete in the allotted time of "+new Long(maxTime).toString()+" milliseconds");
-  }
-    
-  /** Construct a command url.
-  */
-  public String makeAPIURL(String command)
-    throws Exception
-  {
-    if (webapps)
-    {
-      if (singleWar)
-        return "http://localhost:"+Integer.toString(testPort)+"/mcf/api/json/"+command;
-      else
-        return "http://localhost:"+Integer.toString(testPort)+"/mcf-api-service/json/"+command;
-    }
-    else
-      throw new Exception("No API servlet running");
-  }
-
-  public static String convertToString(HttpResponse httpResponse)
-    throws IOException
-  {
-    HttpEntity entity = httpResponse.getEntity();
-    if (entity != null)
-    {
-      InputStream is = entity.getContent();
-      try
-      {
-        Charset charSet;
-        try
-        {
-          ContentType ct = ContentType.get(entity);
-          if (ct == null)
-            charSet = StandardCharsets.UTF_8;
-          else
-            charSet = ct.getCharset();
-        }
-        catch (ParseException e)
-        {
-          charSet = StandardCharsets.UTF_8;
-        }
-        char[] buffer = new char[65536];
-        Reader r = new InputStreamReader(is,charSet);
-        Writer w = new StringWriter();
-        try
-        {
-          while (true)
-          {
-            int amt = r.read(buffer);
-            if (amt == -1)
-              break;
-            w.write(buffer,0,amt);
-          }
-        }
-        finally
-        {
-          w.flush();
-        }
-        return w.toString();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    return "";
-  }
-
-  /** Perform an json API GET operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  public String performAPIGetOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    HttpClient client = HttpClients.createDefault();
-    HttpGet method = new HttpGet(apiURL);
-    try
-    {
-      HttpResponse response = client.execute(method);
-      int responseCode = response.getStatusLine().getStatusCode();
-      String responseString = convertToString(response);
-      if (responseCode != expectedResponse)
-        throw new Exception("API http error; expected "+Integer.toString(expectedResponse)+", saw "+Integer.toString(responseCode)+": "+responseString);
-      return responseString;
-    }
-    finally
-    {
-      method.abort();
-    }
-  }
-
-  /** Perform an json API DELETE operation.
-  *@param apiURL is the operation.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  public String performAPIDeleteOperation(String apiURL, int expectedResponse)
-    throws Exception
-  {
-    HttpClient client = HttpClients.createDefault();
-    HttpDelete method = new HttpDelete(apiURL);
-    try
-    {
-      HttpResponse response = client.execute(method);
-      int responseCode = response.getStatusLine().getStatusCode();
-      String responseString = convertToString(response);
-      if (responseCode != expectedResponse)
-        throw new Exception("API http error; expected "+Integer.toString(expectedResponse)+", saw "+Integer.toString(responseCode)+": "+responseString);
-      // We presume that the data is utf-8, since that's what the API uses throughout.
-      return responseString;
-    }
-    finally
-    {
-      method.abort();
-    }
-  }
-
-  /** Perform an json API PUT operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  public String performAPIPutOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    HttpClient client = HttpClients.createDefault();
-    HttpPut method = new HttpPut(apiURL);
-    try
-    {
-      method.setEntity(new StringEntity(input,ContentType.create("text/plain",StandardCharsets.UTF_8)));
-      HttpResponse response = client.execute(method);
-      int responseCode = response.getStatusLine().getStatusCode();
-      String responseString = convertToString(response);
-      if (responseCode != expectedResponse)
-        throw new Exception("API http error; expected "+Integer.toString(expectedResponse)+", saw "+Integer.toString(responseCode)+": "+responseString);
-      // We presume that the data is utf-8, since that's what the API uses throughout.
-      return responseString;
-    }
-    finally
-    {
-      method.abort();
-    }
-  }
-
-  /** Perform an json API POST operation.
-  *@param apiURL is the operation.
-  *@param input is the input JSON.
-  *@param expectedResponse is the expected response code.
-  *@return the json response.
-  */
-  public String performAPIPostOperation(String apiURL, int expectedResponse, String input)
-    throws Exception
-  {
-    HttpClient client = HttpClients.createDefault();
-    HttpPost method = new HttpPost(apiURL);
-    try
-    {
-      method.setEntity(new StringEntity(input,ContentType.create("text/plain",StandardCharsets.UTF_8)));
-      HttpResponse response = client.execute(method);
-      int responseCode = response.getStatusLine().getStatusCode();
-      String responseString = convertToString(response);
-      if (responseCode != expectedResponse)
-        throw new Exception("API http error; expected "+Integer.toString(expectedResponse)+", saw "+Integer.toString(responseCode)+": "+responseString);
-      // We presume that the data is utf-8, since that's what the API uses throughout.
-      return responseString;
-    }
-    finally
-    {
-      method.abort();
-    }
-  }
-
-  /** Perform a json GET API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  public Configuration performAPIGetOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    String result = performAPIGetOperation(makeAPIURL(command),expectedResponse);
-    Configuration cfg = new Configuration();
-    cfg.fromJSON(result);
-    return cfg;
-  }
-
-  /** Perform a json DELETE API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  public Configuration performAPIDeleteOperationViaNodes(String command, int expectedResponse)
-    throws Exception
-  {
-    String result = performAPIDeleteOperation(makeAPIURL(command),expectedResponse);
-    Configuration cfg = new Configuration();
-    cfg.fromJSON(result);
-    return cfg;
-  }
-
-  /** Perform a json PUT API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  public Configuration performAPIPutOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    String argumentJson;
-    if (argument != null)
-      argumentJson = argument.toJSON();
-    else
-      argumentJson = null;
-    
-    String result = performAPIPutOperation(makeAPIURL(command),expectedResponse,argumentJson);
-    Configuration cfg = new Configuration();
-    cfg.fromJSON(result);
-    return cfg;
-  }
-
-  /** Perform a json POST API operation, using Configuration structures to represent the json.  This is for testing convenience,
-  * mostly.
-  */
-  public Configuration performAPIPostOperationViaNodes(String command, int expectedResponse, Configuration argument)
-    throws Exception
-  {
-    String argumentJson;
-    if (argument != null)
-      argumentJson = argument.toJSON();
-    else
-      argumentJson = null;
-    
-    String result = performAPIPostOperation(makeAPIURL(command),expectedResponse,argumentJson);
-    Configuration cfg = new Configuration();
-    cfg.fromJSON(result);
-    return cfg;
-  }
-
-  // Setup/teardown
-  
-  public void start()
-    throws Exception
-  {
-    ContextHandlerCollection contexts = new ContextHandlerCollection();
-    if (webapps)
-    {
-      // Start jetty
-      server = new Server( testPort );    
-      server.setStopAtShutdown( true );
-      // Initialize the servlets
-      server.setHandler(contexts);
-    }
-
-    if (singleWar)
-    {
-      if (webapps)
-      {
-        // Start the single combined war
-        String combinedWarPath = "../../framework/build/war-proprietary/mcf-combined-service.war";
-        if (System.getProperty("combinedWarPath") != null)
-          combinedWarPath = System.getProperty("combinedWarPath");
-        
-        // Initialize the servlet
-        WebAppContext lcfCombined = new WebAppContext(combinedWarPath,"/mcf");
-        // This will cause jetty to ignore all of the framework and jdbc jars in the war, which is what we want.
-        lcfCombined.setParentLoaderPriority(true);
-        contexts.addHandler(lcfCombined);
-        server.start();
-      }
-      else
-        throw new Exception("Can't run singleWar without webapps");
-    }
-    else
-    {
-      if (webapps)
-      {
-        String crawlerWarPath = "../../framework/build/war-proprietary/mcf-crawler-ui.war";
-        String authorityserviceWarPath = "../../framework/build/war-proprietary/mcf-authority-service.war";
-        String apiWarPath = "../../framework/build/war-proprietary/mcf-api-service.war";
-
-        if (System.getProperty("crawlerWarPath") != null)
-            crawlerWarPath = System.getProperty("crawlerWarPath");
-        if (System.getProperty("authorityserviceWarPath") != null)
-            authorityserviceWarPath = System.getProperty("authorityserviceWarPath");
-        if (System.getProperty("apiWarPath") != null)
-            apiWarPath = System.getProperty("apiWarPath");
-
-        // Initialize the servlets
-        WebAppContext lcfCrawlerUI = new WebAppContext(crawlerWarPath,"/mcf-crawler-ui");
-        // This will cause jetty to ignore all of the framework and jdbc jars in the war, which is what we want.
-        lcfCrawlerUI.setParentLoaderPriority(true);
-        contexts.addHandler(lcfCrawlerUI);
-        WebAppContext lcfAuthorityService = new WebAppContext(authorityserviceWarPath,"/mcf-authority-service");
-        // This will cause jetty to ignore all of the framework and jdbc jars in the war, which is what we want.
-        lcfAuthorityService.setParentLoaderPriority(true);
-        contexts.addHandler(lcfAuthorityService);
-        WebAppContext lcfApi = new WebAppContext(apiWarPath,"/mcf-api-service");
-        lcfApi.setParentLoaderPriority(true);
-        contexts.addHandler(lcfApi);
-        server.start();
-      }
-
-      // If all worked, then we can start the daemon.
-      // Clear the agents shutdown signal.
-      IThreadContext tc = ThreadContextFactory.make();
-      AgentsDaemon.clearAgentsShutdownSignal(tc);
-
-      daemonThread = new DaemonThread(processID);
-      daemonThread.start();
-    }
-  }
-  
-  public void stop()
-    throws Exception
-  {
-    Exception currentException = null;
-    IThreadContext tc = ThreadContextFactory.make();
-
-    // Delete all jobs (and wait for them to go away)
-    if (daemonThread != null || singleWar)
-    {
-      IJobManager jobManager = JobManagerFactory.make(tc);
-          
-      // Get a list of the current active jobs
-      IJobDescription[] jobs = jobManager.getAllJobs();
-      int i = 0;
-      while (i < jobs.length)
-      {
-        IJobDescription desc = jobs[i++];
-        // Abort this job, if it is running
-        try
-        {
-          jobManager.manualAbort(desc.getID());
-        }
-        catch (ManifoldCFException e)
-        {
-          // This generally means that the job was not running
-        }
-      }
-      i = 0;
-      while (i < jobs.length)
-      {
-        IJobDescription desc = jobs[i++];
-        // Wait for this job to stop
-        while (true)
-        {
-          JobStatus status = jobManager.getStatus(desc.getID(),false);
-          if (status != null)
-          {
-            int statusValue = status.getStatus();
-            switch (statusValue)
-            {
-            case JobStatus.JOBSTATUS_NOTYETRUN:
-            case JobStatus.JOBSTATUS_COMPLETED:
-            case JobStatus.JOBSTATUS_ERROR:
-              break;
-            default:
-              ManifoldCF.sleep(10000);
-              continue;
-            }
-          }
-          break;
-        }
-      }
-
-      // Now, delete them all
-      i = 0;
-      while (i < jobs.length)
-      {
-        IJobDescription desc = jobs[i++];
-        try
-        {
-          jobManager.deleteJob(desc.getID());
-        }
-        catch (ManifoldCFException e)
-        {
-          // This usually means that the job is already being deleted
-        }
-      }
-
-      i = 0;
-      while (i < jobs.length)
-      {
-        IJobDescription desc = jobs[i++];
-        // Wait for this job to disappear
-        while (true)
-        {
-          JobStatus status = jobManager.getStatus(desc.getID(),false);
-          if (status != null)
-          {
-            ManifoldCF.sleep(10000);
-            continue;
-          }
-          break;
-        }
-      }
-
-      try
-      {
-        stopNoCleanup();
-      }
-      catch (Exception e)
-      {
-        if (currentException == null)
-          currentException = e;
-      }
-    }
-  }
-  
-  public void stopNoCleanup()
-    throws Exception
-  {
-    if (daemonThread != null)
-    {
-      Exception currentException = null;
-      
-      // Shut down daemon - but only ONE daemon
-      //AgentsDaemon.assertAgentsShutdownSignal(tc);
-        
-      // Wait for daemon thread to exit.
-      while (true)
-      {
-        daemonThread.interrupt();
-        if (daemonThread.isAlive())
-        {
-          Thread.sleep(1000L);
-          continue;
-        }
-        break;
-      }
-
-      Exception e = daemonThread.getDaemonException();
-      if (e != null || !(e instanceof InterruptedException))
-        currentException = e;
-
-      if (currentException != null)
-        throw currentException;
-    }
-        
-  }
-  
-  public void unload()
-    throws Exception
-  {
-    if (server != null)
-    {
-      // Unfortunately, this causes the shutdown hooks to be called, which causes
-      // no end of trouble unless it is done last.
-      server.stop();
-      server.join();
-      server = null;
-    }
-  }
-  
-  protected static class DaemonThread extends Thread
-  {
-    protected final String processID;
-    protected Exception daemonException = null;
-    
-    public DaemonThread(String processID)
-    {
-      this.processID = processID;
-      setName("Daemon thread");
-    }
-    
-    public void run()
-    {
-      IThreadContext tc = ThreadContextFactory.make();
-      // Now, start the server, and then wait for the shutdown signal.  On shutdown, we have to actually do the cleanup,
-      // because the JVM isn't going away.
-      AgentsDaemon ad = new AgentsDaemon(processID);
-      try
-      {
-        ad.runAgents(tc);
-      }
-      catch (ManifoldCFException e)
-      {
-        daemonException = e;
-      }
-      finally
-      {
-        try
-        {
-          ad.stopAgents(tc);
-        }
-        catch (ManifoldCFException e)
-        {
-          daemonException = e;
-        }
-      }
-    }
-    
-    public Exception getDaemonException()
-    {
-      return daemonException;
-    }
-    
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityHSQLDBTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityHSQLDBTest.java
deleted file mode 100644
index ac73eaa..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityHSQLDBTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBTest extends BaseHSQLDB
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityHSQLDBextTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityHSQLDBextTest.java
deleted file mode 100644
index 126159a..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityHSQLDBextTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityHSQLDBextTest extends BaseHSQLDBext
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityMySQLTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityMySQLTest.java
deleted file mode 100644
index d9ccc62..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityMySQLTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityMySQLTest extends BaseMySQL
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityPostgresqlTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityPostgresqlTest.java
deleted file mode 100644
index ff90acf..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SanityPostgresqlTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id: Sanity.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a very basic sanity check */
-public class SanityPostgresqlTest extends BasePostgresql
-{
-  
-  @Test
-  public void sanityCheck()
-    throws Exception
-  {
-    // If we get this far, it must mean that the setup was successful, which is all that I'm shooting for in this test.
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulerHSQLDBTest.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulerHSQLDBTest.java
deleted file mode 100644
index c66c8e3..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulerHSQLDBTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.agents.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-import org.junit.*;
-
-/** This is a test of the scheduler.  If the test succeeds, it is because
-* the scheduler has properly distributed requests for all bins evenly. */
-public class SchedulerHSQLDBTest extends ConnectorBaseHSQLDB
-{
-  protected final ManifoldCFInstance mcfInstance1;
-  protected final ManifoldCFInstance mcfInstance2;
-  protected SchedulerTester tester;
-
-  public SchedulerHSQLDBTest()
-  {
-    super();
-    mcfInstance1 = new ManifoldCFInstance("A",false,false);
-    mcfInstance2 = new ManifoldCFInstance("B",false,false);
-    tester = new SchedulerTester(mcfInstance1,mcfInstance2);
-  }
-  
-  @Override
-  protected String[] getConnectorClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.crawler.tests.SchedulingRepositoryConnector"};
-  }
-  
-  @Override
-  protected String[] getConnectorNames()
-  {
-    return new String[]{"SchedulingConnector"};
-  }
-
-  @Override
-  protected String[] getOutputClasses()
-  {
-    return new String[]{"org.apache.manifoldcf.agents.tests.TestingOutputConnector"};
-  }
-  
-  @Override
-  protected String[] getOutputNames()
-  {
-    return new String[]{"NullOutput"};
-  }
-
-  @Test
-  public void schedulingTestRun()
-    throws Exception
-  {
-    tester.executeTest();
-  }
-  
-  @Before
-  public void setUp()
-    throws Exception
-  {
-    initializeSystem();
-    try
-    {
-      localReset();
-    }
-    catch (Exception e)
-    {
-      System.out.println("Warning: Preclean failed: "+e.getMessage());
-    }
-    try
-    {
-      localSetUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-  }
-  
-  @After
-  public void cleanUp()
-    throws Exception
-  {
-    Exception currentException = null;
-    // Last, shut down the web applications.
-    // If this is done too soon it closes the database before the rest of the cleanup happens.
-    try
-    {
-      mcfInstance1.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      mcfInstance2.unload();
-    }
-    catch (Exception e)
-    {
-      if (currentException == null)
-        currentException = e;
-    }
-    try
-    {
-      localCleanUp();
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw e;
-    }
-    if (currentException != null)
-      throw currentException;
-    cleanupSystem();
-  }
-  
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulerTester.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulerTester.java
deleted file mode 100644
index 87305ee..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulerTester.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** This is a very basic sanity check */
-public class SchedulerTester
-{
-  protected final ManifoldCFInstance instance1;
-  protected final ManifoldCFInstance instance2;
-  
-  public SchedulerTester(ManifoldCFInstance instance1, ManifoldCFInstance instance2)
-  {
-    this.instance1 = instance1;
-    this.instance2 = instance2;
-  }
-  
-  public void executeTest()
-    throws Exception
-  {
-    instance1.start();
-    
-    // Hey, we were able to install the file system connector etc.
-    // Now, create a local test job and run it.
-    IThreadContext tc = ThreadContextFactory.make();
-      
-    // Create a basic file system connection, and save it.
-    IRepositoryConnectionManager mgr = RepositoryConnectionManagerFactory.make(tc);
-    IRepositoryConnection conn = mgr.create();
-    conn.setName("SchedulerTest Connection");
-    conn.setDescription("SchedulerTest Connection");
-    conn.setClassName("org.apache.manifoldcf.crawler.tests.SchedulingRepositoryConnector");
-    conn.setMaxConnections(100);
-    // Now, save
-    mgr.save(conn);
-      
-    // Create a basic null output connection, and save it.
-    IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(tc);
-    IOutputConnection outputConn = outputMgr.create();
-    outputConn.setName("Null Connection");
-    outputConn.setDescription("Null Connection");
-    outputConn.setClassName("org.apache.manifoldcf.agents.tests.TestingOutputConnector");
-    outputConn.setMaxConnections(100);
-    // Now, save
-    outputMgr.save(outputConn);
-
-    // Create a job.
-    IJobManager jobManager = JobManagerFactory.make(tc);
-    IJobDescription job = jobManager.createJob();
-    job.setDescription("Test Job");
-    job.setConnectionName("SchedulerTest Connection");
-    job.addPipelineStage(-1,true,"Null Connection","");
-    //job.setOutputConnectionName("Null Connection");
-    job.setType(job.TYPE_SPECIFIED);
-    job.setStartMethod(job.START_DISABLE);
-    job.setHopcountMode(job.HOPCOUNT_ACCURATE);
-      
-    // Save the job.
-    jobManager.save(job);
-
-    // Now, start the job, and wait until it is running.
-    jobManager.manualStart(job.getID());
-    instance1.waitJobRunningNative(jobManager,job.getID(),30000L);
-    
-    // Start the second instance.
-    instance2.start();
-    // Wait long enough for the stuffing etc to take place once
-    Thread.sleep(5000L);
-    // Terminate instance1.  Instance2 should keep going.
-    instance1.stopNoCleanup();
-    
-    // Wait for the job to become inactive.  The time should be at least long enough to handle
-    // 100 documents per bin, but not significantly greater than that.  Let's say 120 seconds.
-    long startTime = System.currentTimeMillis();
-    instance2.waitJobInactiveNative(jobManager,job.getID(),1200000L);
-    long endTime = System.currentTimeMillis();
-    System.out.println("Crawl took "+(endTime-startTime)+" milliseconds");
-    if (jobManager.getStatus(job.getID()).getDocumentsProcessed() != 10+10*200)
-      throw new Exception("Expected 2010 documents, saw "+jobManager.getStatus(job.getID()).getDocumentsProcessed());
-    if (endTime - startTime > 150000L)
-      throw new Exception("Expected crawl to complete in less than 150 seconds; took "+(endTime-startTime)+" ms");
-    if (endTime-startTime < 96000L)
-      throw new Exception("Job finished too quickly; throttling clearly failed");
-    
-    // Now, delete the job.
-    jobManager.deleteJob(job.getID());
-    instance2.waitJobDeletedNative(jobManager,job.getID(),120000L);
-
-    // Shut down instance2
-    instance2.stop();
-  }
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulingRepositoryConnector.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulingRepositoryConnector.java
deleted file mode 100644
index 033e8dd..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulingRepositoryConnector.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.util.*;
-
-/** Connector class to be used by scheduling tests */
-public class SchedulingRepositoryConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  // Throttling: the next time a fetch is allowed, per bin.
-  protected static final Map<String,Long> nextFetchTime = new HashMap<String,Long>();
-
-  public SchedulingRepositoryConnector()
-  {
-  }
-
-  @Override
-  public String[] getBinNames(String documentIdentifier)
-  {
-    int index = documentIdentifier.indexOf("/");
-    return new String[]{documentIdentifier.substring(0,index)};
-  }
-
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    // A seed per domain
-    String numberDomainsString = params.getParameter("numberDomains");
-    if (numberDomainsString == null)
-      numberDomainsString = "10";
-    int numberDomains = Integer.parseInt(numberDomainsString);
-    for (int i = 0; i < numberDomains; i++)
-    {
-      activities.addSeedDocument(Integer.toString(i)+"/",null);
-    }
-    System.out.println("Seeding completed at "+System.currentTimeMillis());
-    return "";
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String documentsPerSeedString = params.getParameter("documentsperseed");
-    if (documentsPerSeedString == null)
-      documentsPerSeedString = "200";
-    int documentsPerSeed = Integer.parseInt(documentsPerSeedString);
-    String timePerDocumentString = params.getParameter("timeperdocument");
-    if (timePerDocumentString == null)
-      timePerDocumentString = "500";
-    int timePerDocument = Integer.parseInt(timePerDocumentString);
-
-    // Seeds process instantly; other documents have a throttle based on the bin.
-    for (int i = 0; i < documentIdentifiers.length; i++)
-    {
-      String documentIdentifier = documentIdentifiers[i];
-      if (documentIdentifier.endsWith("/"))
-      {
-        System.out.println("Evaluating seed for "+documentIdentifier+" at "+System.currentTimeMillis());
-        // Seed document.  Add the document ID's
-        for (int j = 0; j < documentsPerSeed; j++)
-        {
-          activities.addDocumentReference(documentIdentifier + Integer.toString(j),documentIdentifier,null,
-            null,null,null);
-        }
-        System.out.println("Done evaluating seed for "+documentIdentifier+" at "+System.currentTimeMillis());
-      }
-      else
-      {
-        System.out.println("Fetching "+documentIdentifier);
-        // Find the bin
-        String bin = documentIdentifier.substring(0,documentIdentifier.indexOf("/"));
-        // For now they are all the same
-        long binTimePerDocument = timePerDocument;
-        long now = System.currentTimeMillis();
-        long whenFetch;
-        synchronized (nextFetchTime)
-        {
-          Long time = nextFetchTime.get(bin);
-          if (time == null)
-            whenFetch = now;
-          else
-            whenFetch = time.longValue();
-          nextFetchTime.put(bin,new Long(whenFetch + binTimePerDocument));
-        }
-        if (whenFetch > now)
-        {
-          System.out.println("Waiting "+(whenFetch-now)+" to fetch "+documentIdentifier);
-          try
-          {
-            ManifoldCF.sleep(whenFetch-now);
-          }
-          catch (InterruptedException e)
-          {
-            throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-          }
-          System.out.println("Wait complete for "+documentIdentifier);
-        }
-      }
-    }
-  }
-
-}
diff --git a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/TestingRepositoryConnector.java b/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/TestingRepositoryConnector.java
deleted file mode 100644
index 5fd179e..0000000
--- a/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/TestingRepositoryConnector.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.crawler.tests;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.agents.interfaces.*;
-import org.apache.manifoldcf.crawler.interfaces.*;
-import org.apache.manifoldcf.crawler.system.ManifoldCF;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** Connector class to be used by general integration tests that need documents */
-public class TestingRepositoryConnector extends org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector
-{
-  public TestingRepositoryConnector()
-  {
-  }
-
-  @Override
-  public String addSeedDocuments(ISeedingActivity activities, Specification spec,
-    String lastSeedVersion, long seedTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    String docCount = "3";
-    for (int i = 0; i < spec.getChildCount(); i++)
-    {
-      SpecificationNode sn = spec.getChild(i);
-      if (sn.getType().equals("documentcount"))
-        docCount = sn.getAttributeValue("count");
-    }
-    int count = Integer.parseInt(docCount);
-    
-    for (int i = 0; i < count; i++)
-    {
-      String doc = "test"+i+".txt";
-      activities.addSeedDocument(doc,null);
-    }
-    return "";
-  }
-  
-  /** Process a set of documents.
-  * This is the method that should cause each document to be fetched, processed, and the results either added
-  * to the queue of documents for the current job, and/or entered into the incremental ingestion manager.
-  * The document specification allows this class to filter what is done based on the job.
-  * The connector will be connected before this method can be called.
-  *@param documentIdentifiers is the set of document identifiers to process.
-  *@param statuses are the currently-stored document versions for each document in the set of document identifiers
-  * passed in above.
-  *@param activities is the interface this method should use to queue up new document references
-  * and ingest documents.
-  *@param jobMode is an integer describing how the job is being run, whether continuous or once-only.
-  *@param usesDefaultAuthority will be true only if the authority in use for these documents is the default one.
-  */
-  @Override
-  public void processDocuments(String[] documentIdentifiers, IExistingVersions statuses, Specification spec,
-    IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
-    throws ManifoldCFException, ServiceInterruption
-  {
-    for (int i = 0; i < documentIdentifiers.length; i++)
-    {
-      String documentIdentifier = documentIdentifiers[i];
-      RepositoryDocument rd = new RepositoryDocument();
-      byte[] bytes = documentIdentifier.getBytes(StandardCharsets.UTF_8);
-      rd.setBinary(new ByteArrayInputStream(bytes),bytes.length);
-      try
-      {
-        activities.ingestDocumentWithException(documentIdentifier,"","http://"+documentIdentifier,rd);
-      }
-      catch (IOException e)
-      {
-        throw new RuntimeException("Shouldn't be seeing IOException from binary array input stream: "+e.getMessage(),e);
-      }
-    }
-  }
-
-}
diff --git a/framework/script-engine/.gitignore b/framework/script-engine/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/framework/script-engine/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/framework/script-engine/pom.xml b/framework/script-engine/pom.xml
deleted file mode 100644
index 1734337..0000000
--- a/framework/script-engine/pom.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-scriptengine</artifactId>
-  <name>ManifoldCF - Framework - Script Engine</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.2</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <executable>java</executable>
-          <arguments>
-            <argument>-classpath</argument>
-            <classpath />
-            <argument>org.apache.manifoldcf.scriptengine.ScriptParser</argument>
-          </arguments>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    
-    <!-- runtime dependencies -->
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>${commons-io.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>${commons-codec.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>${httpcomponent.httpclient.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-      <version>${commons-collections.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>${commons-logging.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java
deleted file mode 100644
index 8e98e9f..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import java.io.*;
-
-/** Convert a sequence of characters into a stream of tokens.
-*/
-public class BasicTokenStream implements TokenStream
-{
-  protected CharacterStream characterStream;
-  protected Token currentToken = null;
-  
-  public BasicTokenStream(Reader reader)
-  {
-    this.characterStream = new CharacterStream(reader);
-  }
-  
-  public Token peek()
-    throws ScriptException
-  {
-    if (currentToken == null)
-      currentToken = parseNextToken();
-    return currentToken;
-  }
-  
-  public void skip()
-  {
-    currentToken = null;
-  }
-  
-  // Protected methods
-  
-  protected Token parseNextToken()
-    throws ScriptException
-  {
-    char y;
-    int lineNumber;
-    int characterNumber;
-
-    // Skip to the start of the next token (or exit if no token start can be found)
-    while (true)
-    {
-      
-      // Skip white space
-      while (true)
-      {
-        // Remember current position so we can properly characterize the token.
-        lineNumber = characterStream.getLineNumber();
-        characterNumber = characterStream.getCharacterNumber();
-        int x = characterStream.peek();
-        if (x == -1)
-          return null;
-        y = (char)x;
-        if (y > ' ')
-          break;
-        characterStream.skip();
-      }
-
-      // Is it a comment?
-      if (y == '#')
-      {
-        // Skip to the end of the line, or the end of the text.
-        while (true)
-        {
-          int x = characterStream.peek();
-          if (x == -1)
-            return null;
-          characterStream.skip();
-          y = (char)x;
-          if (y == '\n')
-            break;
-        }
-        continue;
-      }
-      break;
-    }
-
-    // At the start of the next token.
-    if (isQuoteCharacter(y))
-    {
-      // Legal token character
-      StringBuilder tokenBuffer = new StringBuilder();
-      char quoteMark = y;
-      characterStream.skip();
-      while (true)
-      {
-        int x = characterStream.peek();
-        if (x == -1)
-          break;
-        y = (char)x;
-        characterStream.skip();
-        if (y == quoteMark)
-          // End of the quotation
-          break;
-        if (y == '\\')
-        {
-          // Escape character
-          x = characterStream.peek();
-          if (x != -1)
-          {
-            tokenBuffer.append((char)x);
-            characterStream.skip();
-          }
-        }
-        else
-          tokenBuffer.append(y);
-      }
-      return new Token(Token.TOKEN_STRING,tokenBuffer.toString(),lineNumber,characterNumber);
-    }
-    else if (isTokenCharacter(y))
-    {
-      // Legal token character
-      StringBuilder tokenBuffer = new StringBuilder();
-      while (true)
-      {
-        int x = characterStream.peek();
-        if (x == -1)
-          break;
-        y = (char)x;
-        if (isTokenCharacter(y) || isNumberCharacter(y))
-        {
-          // Tokens can include numbers, just so long they aren't the first character
-          characterStream.skip();
-          tokenBuffer.append(y);
-        }
-        else
-          break;
-      }
-      return new Token(Token.TOKEN_TOKEN,tokenBuffer.toString(),lineNumber,characterNumber);
-    }
-    else if (isNumberCharacter(y))
-    {
-      StringBuilder tokenBuffer = new StringBuilder();
-      boolean seenDot = false;
-      while (true)
-      {
-        int x = characterStream.peek();
-        if (x == -1)
-          break;
-        y = (char)x;
-        if (isNumberCharacter(y))
-        {
-          tokenBuffer.append(y);
-          characterStream.skip();
-        }
-        else if (y == '.' && seenDot == false)
-        {
-          tokenBuffer.append(y);
-          seenDot = true;
-          characterStream.skip();
-        }
-        else
-          break;
-      }
-      if (seenDot)
-        return new Token(Token.TOKEN_FLOAT,tokenBuffer.toString(),lineNumber,characterNumber);
-      else
-        return new Token(Token.TOKEN_INTEGER,tokenBuffer.toString(),lineNumber,characterNumber);
-    }
-    else
-    {
-      // Set a punctuation token
-      characterStream.skip();
-      if (y == '=' || y == '!' || y == '>' || y == '<' || y == '&' || y == '|')
-      {
-        int x = characterStream.peek();
-        if (x != -1)
-        {
-          char q = (char)x;
-          if (y == '=' && q == '=' ||
-            y == '!' && q == '=' ||
-            y == '>' && q == '=' ||
-            y == '<' && q == '=' ||
-            y == '&' && q == '&' ||
-            y == '|' && q == '|' ||
-            y == '>' && q == '>' ||
-            y == '<' && q == '<')
-          {
-            characterStream.skip();
-            return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder().append(y).append(q).toString(),
-              lineNumber,characterNumber);
-          }
-        }
-      }
-      return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder().append(y).toString(),
-        lineNumber,characterNumber);
-    }
-  }
-  
-  protected static boolean isQuoteCharacter(char x)
-  {
-    return (x == '\'' || x == '"');
-  }
-  
-  protected static boolean isNumberCharacter(char x)
-  {
-    return (x >= '0' && x <= '9');
-  }
-  
-  protected static boolean isTokenCharacter(char x)
-  {
-    if (x >= 'a' && x <= 'z')
-      return true;
-    if (x >= 'A' && x <='Z')
-      return true;
-    if (x == '_' || x == '$' || x == '@')
-      return true;
-    return false;
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java
deleted file mode 100644
index 666fba6..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BreakCommand.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Break command. */
-public class BreakCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    return true;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java
deleted file mode 100644
index 231eefb..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/CharacterStream.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import java.io.*;
-
-/** Convert a Reader into a sequence of characters, while keeping track of line
-* endings.
-*/
-public class CharacterStream
-{
-  protected Reader reader;
-  protected int currentCharacter = -1;
-  protected int lineNumber = 0;
-  protected int characterNumber = 0;
-  
-  public CharacterStream(Reader reader)
-  {
-    this.reader = reader;
-  }
-  
-  public int peek()
-    throws ScriptException
-  {
-    if (currentCharacter == -1)
-      currentCharacter = readNextCharacter();
-    return currentCharacter;
-  }
-  
-  public void skip()
-  {
-    currentCharacter = -1;
-  }
-  
-  public int getLineNumber()
-  {
-    return lineNumber;
-  }
-  
-  public int getCharacterNumber()
-  {
-    return characterNumber;
-  }
-  
-  // Protected methods
-  
-  protected int readNextCharacter()
-    throws ScriptException
-  {
-    if (reader == null)
-      return -1;
-    
-    try
-    {
-      int rval = reader.read();
-      if (rval == -1)
-      {
-        reader.close();
-        reader = null;
-        return -1;
-      }
-      characterNumber++;
-      if (((char)rval) == '\n')
-      {
-        lineNumber++;
-        characterNumber = 0;
-      }
-      return rval;
-    }
-    catch (IOException e)
-    {
-      throw new ScriptException("I/O exception: "+e.getMessage(),e);
-    }
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java
deleted file mode 100644
index 7e19706..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Command.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Interface describing what a command needs to do.
-*/
-public interface Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException;
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException;
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java
deleted file mode 100644
index d7202c1..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ContextVariableReference.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Overwritable variable references from within a context.
-*/
-public class ContextVariableReference implements VariableReference
-{
-  protected Variable variable = null;
-  
-  public ContextVariableReference()
-  {
-  }
-  
-  /** Set the reference */
-  public void setReference(Variable object)
-    throws ScriptException
-  {
-    variable = object;
-  }
-  
-  /** Resolve the reference */
-  public Variable resolve()
-    throws ScriptException
-  {
-    return variable;
-  }
-
-  /** Check if this reference is null */
-  public boolean isNull()
-  {
-    return variable == null;
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java
deleted file mode 100644
index 87d009d..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/DELETECommand.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.http.client.HttpClient;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.util.EntityUtils;
-import java.io.*;
-
-/** DELETE command.  This performs a REST-style DELETE operation, designed to work
-* against the ManifoldCF API.  The syntax is: DELETE resultvariable = urlvariable */
-public class DELETECommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference result = sp.evaluateExpression(currentStream);
-    if (result == null)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    VariableReference url = sp.evaluateExpression(currentStream);
-    if (url == null)
-      sp.syntaxError(currentStream,"Missing URL expression");
-    
-    // Perform the actual GET.
-    String urlString = sp.resolveMustExist(currentStream,url).getStringValue();
-    
-    try
-    {
-      HttpClient client = sp.getHttpClient();
-      HttpDelete method = new HttpDelete(urlString);
-      try
-      {
-        HttpResponse httpResponse = client.execute(method);
-        int resultCode = httpResponse.getStatusLine().getStatusCode();
-        String resultJSON = sp.convertToString(httpResponse);
-        result.setReference(new VariableResult(resultCode,resultJSON));
-      
-        return false;
-      }
-      finally
-      {
-        //method.releaseConnection();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing URL expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ErrorCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ErrorCommand.java
deleted file mode 100644
index 0059cf1..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ErrorCommand.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Error command. */
-public class ErrorCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference vr = sp.evaluateExpression(currentStream);
-    if (vr == null)
-      sp.syntaxError(currentStream,"Missing error message expression");
-    Variable v = sp.resolveMustExist(currentStream,vr);
-    throw new ScriptException(v.getStringValue());
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing error message expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java
deleted file mode 100644
index e0973c3..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/GETCommand.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.http.client.HttpClient;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.util.EntityUtils;
-import java.io.*;
-
-/** GET command.  This performs a REST-style GET operation, designed to work
-* against the ManifoldCF API.  The syntax is: GET resultvariable = urlvariable */
-public class GETCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference result = sp.evaluateExpression(currentStream);
-    if (result == null)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    VariableReference url = sp.evaluateExpression(currentStream);
-    if (url == null)
-      sp.syntaxError(currentStream,"Missing URL expression");
-    
-    // Perform the actual GET.
-    String urlString = sp.resolveMustExist(currentStream,url).getStringValue();
-    
-    try
-    {
-      HttpClient client = sp.getHttpClient();
-      HttpGet method = new HttpGet(urlString);
-      try
-      {
-        HttpResponse httpResponse = client.execute(method);
-        int resultCode = httpResponse.getStatusLine().getStatusCode();
-        String resultJSON = sp.convertToString(httpResponse);
-        result.setReference(new VariableResult(resultCode,resultJSON));
-      
-        return false;
-      }
-      finally
-      {
-        //method.releaseConnection();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing URL expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java
deleted file mode 100644
index 30c5e3c..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/IfCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** If command. */
-public class IfCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    boolean rval = false;
-    VariableReference ifCondition = sp.evaluateExpression(currentStream);
-    if (ifCondition == null)
-      sp.syntaxError(currentStream,"Missing if expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("then"))
-      sp.syntaxError(currentStream,"Missing 'then' in if statement");
-    currentStream.skip();
-    if (sp.resolveMustExist(currentStream,ifCondition).getBooleanValue())
-    {
-      rval = sp.parseStatements(currentStream);
-      t = currentStream.peek();
-      if (t != null && t.getToken() != null && t.getToken().equals("else"))
-      {
-        currentStream.skip();
-        // Skip statements
-        sp.skipStatements(currentStream);
-      }
-    }
-    else
-    {
-      sp.skipStatements(currentStream);
-      t = currentStream.peek();
-      if (t != null && t.getToken() != null && t.getToken().equals("else"))
-      {
-        currentStream.skip();
-        // Parse statements
-        rval = sp.parseStatements(currentStream);
-      }
-    }
-    return rval;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing if expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("then"))
-      sp.syntaxError(currentStream,"Missing 'then' in if statement");
-    currentStream.skip();
-    sp.skipStatements(currentStream);
-    t = currentStream.peek();
-    if (t != null && t.getToken() != null && t.getToken().equals("else"))
-    {
-      currentStream.skip();
-      // Skip statements
-      sp.skipStatements(currentStream);
-    }
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/InsertCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/InsertCommand.java
deleted file mode 100644
index a58bf0b..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/InsertCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Insert command.  This command inserts an object into an array, either at the specified position, or at the end. */
-public class InsertCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    // Insert xxx into yyy [at zzz]
-    VariableReference objectRef = sp.evaluateExpression(currentStream);
-    if (objectRef == null)
-      sp.syntaxError(currentStream,"Missing object expression");
-    Variable object = objectRef.resolve();
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("into"))
-      sp.syntaxError(currentStream,"Missing 'into'");
-    currentStream.skip();
-    VariableReference targetRef = sp.evaluateExpression(currentStream);
-    if (targetRef == null)
-      sp.syntaxError(currentStream,"Missing target expression");
-    Variable target = sp.resolveMustExist(currentStream,targetRef);
-    t = currentStream.peek();
-    if (t != null && t.getToken() != null && t.getToken().equals("at"))
-    {
-      currentStream.skip();
-      VariableReference indexRef = sp.evaluateExpression(currentStream);
-      if (indexRef == null)
-        sp.syntaxError(currentStream,"Missing expression after 'at'");
-      target.insertAt(object,indexRef.resolve());
-    }
-    else
-    {
-      target.insertAt(object,null);
-    }
-    return false;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing object expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("into"))
-      sp.syntaxError(currentStream,"Missing 'into'");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing target expression");
-    t = currentStream.peek();
-    if (t != null && t.getToken() != null && t.getToken().equals("at"))
-    {
-      currentStream.skip();
-      if (sp.skipExpression(currentStream) == false)
-        sp.syntaxError(currentStream,"Missing expression after 'at'");
-    }
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewArray.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewArray.java
deleted file mode 100644
index 8e2354e..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewArray.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new array object.
-*/
-public class NewArray implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    return new VariableArray();
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConfiguration.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConfiguration.java
deleted file mode 100644
index 3475bd6..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConfiguration.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new VariableConfiguration object.
-*/
-public class NewConfiguration implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    return new VariableConfiguration();
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConfigurationNode.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConfigurationNode.java
deleted file mode 100644
index 8397b6b..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConfigurationNode.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new VariableConfigurationNode object.
-*/
-public class NewConfigurationNode implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    // The arguments should be the type of the node, as an expression.
-    VariableReference nodeType = sp.evaluateExpression(currentStream);
-    if (nodeType == null)
-      sp.syntaxError(currentStream,"Need node type expression");
-    String nodeTypeName = sp.resolveMustExist(currentStream,nodeType).getStringValue();
-    return new VariableConfigurationNode(nodeTypeName);
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    sp.skipExpression(currentStream);
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConnectionName.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConnectionName.java
deleted file mode 100644
index d54e75d..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewConnectionName.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new Connection Name object.
-*/
-public class NewConnectionName implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference connectionName = sp.evaluateExpression(currentStream);
-    if (connectionName == null)
-      sp.syntaxError(currentStream,"Need connection name expression");
-    String connectionNameString = sp.resolveMustExist(currentStream,connectionName).getStringValue();
-    return new VariableConnectionName(connectionNameString);
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    sp.skipExpression(currentStream);
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewDictionary.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewDictionary.java
deleted file mode 100644
index 9f892c2..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewDictionary.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new dictionary object.
-*/
-public class NewDictionary implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    return new VariableDict();
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewOperation.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewOperation.java
deleted file mode 100644
index 60669c3..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewOperation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Interface describing what a "new" operation needs to do.
-*/
-public interface NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException;
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException;
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewQueryArgument.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewQueryArgument.java
deleted file mode 100644
index 264a98a..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewQueryArgument.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new Query Argument object.
-*/
-public class NewQueryArgument implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference name = sp.evaluateExpression(currentStream);
-    if (name == null)
-      sp.syntaxError(currentStream,"Need name expression");
-    String nameString = sp.resolveMustExist(currentStream,name).getStringValue();
-    String valueString = null;
-    Token equal = currentStream.peek();
-    if (equal != null && equal.getPunctuation() != null && equal.getPunctuation().equals("="))
-    {
-      currentStream.skip();
-      VariableReference value = sp.evaluateExpression(currentStream);
-      if (value == null)
-        sp.syntaxError(currentStream,"Need value expression");
-      valueString = sp.resolveMustExist(currentStream,value).getStringValue();
-    }
-    return new VariableQueryArg(nameString,valueString);
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    sp.skipExpression(currentStream);
-    Token equal = currentStream.peek();
-    if (equal != null && equal.getPunctuation() != null && equal.getPunctuation().equals("="))
-    {
-      currentStream.skip();
-      sp.skipExpression(currentStream);
-    }
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewURL.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewURL.java
deleted file mode 100644
index c27d496..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NewURL.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Class defining the creation of a new URL object.
-*/
-public class NewURL implements NewOperation
-{
-  /** Parse and execute.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return the variable reference that got created.  Should never be null.
-  */
-  @Override
-  public VariableReference parseAndCreate(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference basePath = sp.evaluateExpression(currentStream);
-    if (basePath == null)
-      sp.syntaxError(currentStream,"Need url base path expression");
-    String basePathString = sp.resolveMustExist(currentStream,basePath).getStringValue();
-    return new VariableURL(basePathString);
-  }
-  
-  /** Parse and skip.  Parsing begins right after the "new" keyword and the operation name token.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  @Override
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    sp.skipExpression(currentStream);
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java
deleted file mode 100644
index 7ffb0ea..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/NullVariableReference.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Null variable reference.
-*/
-public class NullVariableReference implements VariableReference
-{
-  public NullVariableReference()
-  {
-  }
-  
-  /** Set the reference */
-  public void setReference(Variable object)
-    throws ScriptException
-  {
-    throw new ScriptException("Null reference is immutable");
-  }
-  
-  /** Resolve the reference */
-  public Variable resolve()
-    throws ScriptException
-  {
-    return null;
-  }
-
-  /** Check if this reference is null */
-  public boolean isNull()
-  {
-    return true;
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java
deleted file mode 100644
index 04f31eb..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/POSTCommand.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.client.HttpClient;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.util.EntityUtils;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** POST command.  This performs a REST-style POST operation, designed to work
-* against the ManifoldCF API.  The syntax is: POST resultvariable = sendvariable to urlvariable*/
-public class POSTCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference result = sp.evaluateExpression(currentStream);
-    if (result == null)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    VariableReference send = sp.evaluateExpression(currentStream);
-    if (send == null)
-      sp.syntaxError(currentStream,"Missing send expression");
-    t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("to"))
-      sp.syntaxError(currentStream,"Missing 'to'");
-    currentStream.skip();
-    VariableReference url = sp.evaluateExpression(currentStream);
-    if (url == null)
-      sp.syntaxError(currentStream,"Missing URL expression");
-    
-    // Perform the actual PUT.
-    String urlString = sp.resolveMustExist(currentStream,url).getStringValue();
-    Configuration configuration = sp.resolveMustExist(currentStream,send).getConfigurationValue();
-    
-    try
-    {
-      String json = configuration.toJSON();
-      HttpClient client = sp.getHttpClient();
-      HttpPost method = new HttpPost(urlString);
-      try
-      {
-        method.setEntity(new StringEntity(json,ContentType.create("text/plain", StandardCharsets.UTF_8)));
-        HttpResponse httpResponse = client.execute(method);
-        int resultCode = httpResponse.getStatusLine().getStatusCode();
-        String resultJSON = sp.convertToString(httpResponse);
-        result.setReference(new VariableResult(resultCode,resultJSON));
-      
-        return false;
-      }
-      finally
-      {
-        //method.releaseConnection();
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-    catch (IOException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing send expression");
-    t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("to"))
-      sp.syntaxError(currentStream,"Missing 'to'");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing URL expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java
deleted file mode 100644
index b37382b..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PUTCommand.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.client.HttpClient;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.util.EntityUtils;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
-/** PUT command.  This performs a REST-style PUT operation, designed to work
-* against the ManifoldCF API.  The syntax is: PUT resultvariable = sendvariable to urlvariable*/
-public class PUTCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference result = sp.evaluateExpression(currentStream);
-    if (result == null)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    VariableReference send = sp.evaluateExpression(currentStream);
-    if (send == null)
-      sp.syntaxError(currentStream,"Missing send expression");
-    t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("to"))
-      sp.syntaxError(currentStream,"Missing 'to'");
-    currentStream.skip();
-    VariableReference url = sp.evaluateExpression(currentStream);
-    if (url == null)
-      sp.syntaxError(currentStream,"Missing URL expression");
-    
-    // Perform the actual PUT.
-    String urlString = sp.resolveMustExist(currentStream,url).getStringValue();
-    Configuration configuration = sp.resolveMustExist(currentStream,send).getConfigurationValue();
-
-    try
-    {
-      String json = configuration.toJSON();
-      HttpClient client = sp.getHttpClient();
-      HttpPut method = new HttpPut(urlString);
-      try
-      {
-        method.setEntity(new StringEntity(json,ContentType.create("text/plain", StandardCharsets.UTF_8)));
-        HttpResponse httpResponse = client.execute(method);
-        int resultCode = httpResponse.getStatusLine().getStatusCode();
-        String resultJSON = sp.convertToString(httpResponse);
-        result.setReference(new VariableResult(resultCode,resultJSON));
-      
-        return false;
-      }
-      finally
-      {
-        //method.releaseConnection();
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-    catch (IOException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing result expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' sign");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing send expression");
-    t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("to"))
-      sp.syntaxError(currentStream,"Missing 'to'");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing URL expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java
deleted file mode 100644
index d2ff348..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/PrintCommand.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Print command. */
-public class PrintCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference expr = sp.evaluateExpression(currentStream);
-    if (expr == null)
-      sp.syntaxError(currentStream,"Missing print expression");
-    System.out.println(sp.resolveMustExist(currentStream,expr).getStringValue());
-    return false;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing print expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RemoveCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RemoveCommand.java
deleted file mode 100644
index ee370d2..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RemoveCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Remove command.  This command removes an object from an array at a specified position. */
-public class RemoveCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    // Remove <index> from <node>
-    VariableReference indexRef = sp.evaluateExpression(currentStream);
-    if (indexRef == null)
-      sp.syntaxError(currentStream,"Missing index expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("from"))
-      sp.syntaxError(currentStream,"Missing 'from'");
-    currentStream.skip();
-    VariableReference targetRef = sp.evaluateExpression(currentStream);
-    if (targetRef == null)
-      sp.syntaxError(currentStream,"Missing target expression");
-    Variable target = sp.resolveMustExist(currentStream,targetRef);
-    target.removeAt(indexRef.resolve());
-    return false;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing index expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("from"))
-      sp.syntaxError(currentStream,"Missing 'from'");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing target expression");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java
deleted file mode 100644
index 5d3f2ca..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/RewindableTokenStream.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import java.util.*;
-
-/** Allows a TokenStream to be repeated as long as a sequence start is kept.
-*/
-public class RewindableTokenStream implements TokenStream
-{
-  protected TokenStream parent;
-  protected List<Token> history = new ArrayList<Token>();
-  protected int currentIndex = 0;
-  protected int committedSize = 0;
-  
-  public RewindableTokenStream(TokenStream parent)
-  {
-    this.parent = parent;
-  }
-  
-  public Token peek()
-    throws ScriptException
-  {
-    if (history.size() > currentIndex)
-      return history.get(currentIndex);
-    Token rval = parent.peek();
-    history.add(rval);
-    return rval;
-  }
-  
-  public void skip()
-  {
-    currentIndex++;
-    if (currentIndex > committedSize)
-    {
-      parent.skip();
-      committedSize++;
-    }
-    if (currentIndex > committedSize)
-      throw new RuntimeException("Two skips in a row!");
-  }
-  
-  public void reset()
-  {
-    currentIndex = 0;
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptException.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptException.java
deleted file mode 100644
index 5202120..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-public class ScriptException extends Exception
-{
-  public ScriptException(String msg)
-  {
-    super(msg);
-  }
-  
-  public ScriptException(String msg, Throwable e)
-  {
-    super(msg,e);
-  }
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptParser.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptParser.java
deleted file mode 100644
index 317741a..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/ScriptParser.java
+++ /dev/null
@@ -1,1336 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpException;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpEntity;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.impl.client.LaxRedirectStrategy;
-import org.apache.http.entity.ContentType;
-import org.apache.http.ParseException;
-
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.io.*;
-import java.nio.charset.Charset;
-
-/** Class to parse various syntactical parts of a script and execute them.
-*/
-public class ScriptParser
-{
-  /** The connection manager. */
-  protected HttpClientConnectionManager connectionManager = null;
-  
-  /** The client instance */
-  protected HttpClient httpClient = null;
-  
-  /** The lock for the httpclient factory */
-  protected Integer httpClientLock = new Integer(0);
-  
-  /** The current variable context. */
-  protected Map<String,ContextVariableReference> context = new HashMap<String,ContextVariableReference>();
-  
-  /** A table of commands that we know how to deal with. */
-  protected Map<String,Command> commands = new HashMap<String,Command>();
-  
-  /** A table of "new" operations that we know how to deal with. */
-  protected Map<String,NewOperation> newOperations = new HashMap<String,NewOperation>();
-
-  public ScriptParser()
-  {
-  }
-  
-  /** Add a command.
-  *@param commandName is the name of the command.
-  *@param command is the command instance.
-  */
-  public void addCommand(String commandName, Command command)
-  {
-    commands.put(commandName,command);
-  }
-
-  /** Add a "new" operation.
-  *@param operationName is the name of the operation.
-  *@param operation is the operation to create.
-  */
-  public void addNewOperation(String operationName, NewOperation operation)
-  {
-    newOperations.put(operationName,operation);
-  }
-  
-  /** Add a variable.
-  */
-  public void addVariable(String variableName, Variable v)
-    throws ScriptException
-  {
-    ContextVariableReference cvr = new ContextVariableReference();
-    cvr.setReference(v);
-    context.put(variableName,cvr);
-  }
-
-  /** Execute script. */
-  public void execute(TokenStream currentStream)
-    throws ScriptException
-  {
-    if (parseStatements(currentStream))
-      localError(currentStream,"Break command must be inside a loop");
-    Token t = currentStream.peek();
-    if (t != null)
-      localError(currentStream,"Characters after end of script");
-  }
-
-  // Statement return codes
-  protected static final int STATEMENT_NOTME = 0;
-  protected static final int STATEMENT_ISME = 1;
-  protected static final int STATEMENT_BREAK = 2;
-  
-  /** Parse and execute multiple statements.
-  *@param currentStream is the token stream to parse.
-  *@return true for a break signal.
-  */
-  public boolean parseStatements(TokenStream currentStream)
-    throws ScriptException
-  {
-    boolean breakSignal = false;
-    while (true)
-    {
-      if (breakSignal)
-      {
-        if (skipStatement(currentStream) == false)
-          break;
-      }
-      else
-      {
-        int result = parseStatement(currentStream);
-        if (result == STATEMENT_NOTME)
-          break;
-        if (result == STATEMENT_BREAK)
-          breakSignal = true;
-      }
-    }
-    return breakSignal;
-  }
-  
-  /** Skip multiple statements.
-  *@param currentStream is the token stream to parse.
-  */
-  public void skipStatements(TokenStream currentStream)
-    throws ScriptException
-  {
-    while (true)
-    {
-      if (skipStatement(currentStream) == false)
-        break;
-    }
-  }
-  
-  
-  /** Parse a single statement.
-  *@param currentStream is the current token stream.
-  *@return a signal indicating either NOTME, ISME, or BREAK.
-  */
-  protected int parseStatement(TokenStream currentStream)
-    throws ScriptException
-  {
-    int rval = STATEMENT_ISME;
-    
-    Token command = currentStream.peek();
-    if (command == null)
-      return STATEMENT_NOTME;
-    String commandString = command.getToken();
-    if (commandString == null)
-      return STATEMENT_NOTME;
-    
-    // Let's see if we know about this command.
-    Token t = currentStream.peek();
-    if (t != null && t.getToken() != null)
-    {
-      Command c = commands.get(t.getToken());
-      if (c != null)
-      {
-        // We do know about it.  So skip the command name and call the parse method.
-        currentStream.skip();
-        if (c.parseAndExecute(this,currentStream))
-          rval = STATEMENT_BREAK;
-        else
-          rval = STATEMENT_ISME;
-      }
-      else
-        return STATEMENT_NOTME;
-    }
-    else
-      return STATEMENT_NOTME;
-    
-    Token semi = currentStream.peek();
-    if (semi == null || semi.getPunctuation() == null || !semi.getPunctuation().equals(";"))
-      syntaxError(currentStream,"Missing semicolon");
-    currentStream.skip();
-    return rval;
-  }
-
-  /** Skip a single statement.
-  *@param currentStream is the current token stream.
-  *@return true if a statement was detected, false otherwise.
-  */
-  protected boolean skipStatement(TokenStream currentStream)
-    throws ScriptException
-  {
-    Token command = currentStream.peek();
-    if (command == null)
-      return false;
-    String commandString = command.getToken();
-    if (commandString == null)
-      return false;
-    
-    // Let's see if we know about this command.
-    Token t = currentStream.peek();
-    if (t != null && t.getToken() != null)
-    {
-      Command c = commands.get(t.getToken());
-      if (c != null)
-      {
-        // We do know about it.  So skip the command name and call the parse method.
-        currentStream.skip();
-        c.parseAndSkip(this,currentStream);
-        // Fall through
-      }
-      else
-        return false;
-    }
-    else
-      return false;
-    
-    Token semi = currentStream.peek();
-    if (semi == null || semi.getPunctuation() == null || !semi.getPunctuation().equals(";"))
-      syntaxError(currentStream,"Missing semicolon");
-    currentStream.skip();
-    return true;
-  }
-  
-  /** Evaluate an expression.
-  *@param currentStream is the token stream to parse.
-  *@return a VariableReference object if an expression was detected, null otherwise.
-  */
-  public VariableReference evaluateExpression(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for pipe operations
-    VariableReference vr = evaluateExpression_1(currentStream);
-    if (vr == null)
-      return null;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("||"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_1(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '||'");
-        vr = resolveMustExist(currentStream,vr).doublePipe(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("|"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_1(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '|'");
-        vr = resolveMustExist(currentStream,vr).pipe(v.resolve());
-      }
-      else
-        break;
-    }
-    return vr;
-  }
-  
-  /** Skip an expression.
-  *@param currentStream is the token stream to parse.
-  *@return true if an expression was detected, false otherwise.
-  */
-  public boolean skipExpression(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for pipe operations
-    if (skipExpression_1(currentStream) == false)
-      return false;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("||"))
-      {
-        currentStream.skip();
-        if (skipExpression_1(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '||'");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("|"))
-      {
-        currentStream.skip();
-        if (skipExpression_1(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '|'");
-      }
-      else
-        break;
-    }
-    return true;
-  }
-  
-  protected VariableReference evaluateExpression_1(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for ampersand operations
-    VariableReference vr = evaluateExpression_2(currentStream);
-    if (vr == null)
-      return null;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("&&"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_2(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '&&'");
-        vr = resolveMustExist(currentStream,vr).doubleAmpersand(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("&"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_2(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '&'");
-        vr = resolveMustExist(currentStream,vr).ampersand(v.resolve());
-      }
-      else
-        break;
-    }
-    return vr;
-  }
-  
-  protected boolean skipExpression_1(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for ampersand operations
-    if (skipExpression_2(currentStream) == false)
-      return false;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("&&"))
-      {
-        currentStream.skip();
-        if (skipExpression_2(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '&&'");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("&"))
-      {
-        currentStream.skip();
-        if (skipExpression_2(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '&'");
-      }
-      else
-        break;
-    }
-    return true;
-  }
-
-  protected VariableReference evaluateExpression_2(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for exclamation operations
-    Token t = currentStream.peek();
-    if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("!"))
-    {
-      currentStream.skip();
-      VariableReference v = evaluateExpression_2(currentStream);
-      if (v == null)
-        syntaxError(currentStream,"Missing expression after '!'");
-      return resolveMustExist(currentStream,v).unaryExclamation();
-    }
-    return evaluateExpression_3(currentStream);
-  }
-  
-  protected boolean skipExpression_2(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for exclamation operations
-    Token t = currentStream.peek();
-    if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("!"))
-    {
-      currentStream.skip();
-      if (skipExpression_2(currentStream) == false)
-        syntaxError(currentStream,"Missing expression after '!'");
-      return true;
-    }
-    return skipExpression_3(currentStream);
-  }
-  
-  protected VariableReference evaluateExpression_3(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for comparison operations
-    VariableReference vr = evaluateExpression_4(currentStream);
-    if (vr == null)
-      return null;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("=="))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_4(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '=='");
-        vr = resolveMustExist(currentStream,vr).doubleEquals(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("!="))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_4(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '!='");
-        vr = resolveMustExist(currentStream,vr).exclamationEquals(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("<"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_4(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '<'");
-        vr = resolveMustExist(currentStream,vr).lesserAngle(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(">"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_4(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '>'");
-        vr = resolveMustExist(currentStream,vr).greaterAngle(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("<="))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_4(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '<='");
-        vr = resolveMustExist(currentStream,vr).lesserAngleEquals(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(">="))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_4(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '>='");
-        vr = resolveMustExist(currentStream,vr).greaterAngleEquals(v.resolve());
-      }
-      else
-        break;
-    }
-    return vr;
-  }
-  
-  protected boolean skipExpression_3(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for comparison operations
-    if (skipExpression_4(currentStream) == false)
-      return false;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("=="))
-      {
-        currentStream.skip();
-        if (skipExpression_4(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '=='");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("!="))
-      {
-        currentStream.skip();
-        if (skipExpression_4(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '!='");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("<"))
-      {
-        currentStream.skip();
-        if (skipExpression_4(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '<'");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(">"))
-      {
-        currentStream.skip();
-        if (skipExpression_4(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '>'");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("<="))
-      {
-        currentStream.skip();
-        if (skipExpression_4(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '<='");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(">="))
-      {
-        currentStream.skip();
-        if (skipExpression_4(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '>='");
-      }
-      else
-        break;
-    }
-    return true;
-  }
-  
-  protected VariableReference evaluateExpression_4(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for +/- operations
-    VariableReference vr = evaluateExpression_5(currentStream);
-    if (vr == null)
-      return null;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("+"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_5(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '+'");
-        vr = resolveMustExist(currentStream,vr).plus(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("-"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_5(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '-'");
-        vr = resolveMustExist(currentStream,vr).minus(v.resolve());
-      }
-      else
-        break;
-    }
-    return vr;
-  }
-
-  protected boolean skipExpression_4(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for +/- operations
-    if (skipExpression_5(currentStream) == false)
-      return false;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("+"))
-      {
-        currentStream.skip();
-        if (skipExpression_5(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '+'");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("-"))
-      {
-        currentStream.skip();
-        if (skipExpression_5(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '-'");
-      }
-      else
-        break;
-    }
-    return true;
-  }
-
-  protected VariableReference evaluateExpression_5(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for *// operations
-    VariableReference vr = evaluateExpression_6(currentStream);
-    if (vr == null)
-      return null;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("*"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_6(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '*'");
-        vr = resolveMustExist(currentStream,vr).asterisk(v.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("/"))
-      {
-        currentStream.skip();
-        VariableReference v = evaluateExpression_6(currentStream);
-        if (v == null)
-          syntaxError(currentStream,"Missing expression after '/'");
-        vr = resolveMustExist(currentStream,vr).slash(v.resolve());
-      }
-      else
-        break;
-    }
-    return vr;
-  }
-
-  protected boolean skipExpression_5(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for *// operations
-    if (skipExpression_6(currentStream) == false)
-      return false;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("*"))
-      {
-        currentStream.skip();
-        if (skipExpression_6(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '*'");
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("/"))
-      {
-        currentStream.skip();
-        if (skipExpression_6(currentStream) == false)
-          syntaxError(currentStream,"Missing expression after '/'");
-      }
-      else
-        break;
-    }
-    return true;
-  }
-
-  protected VariableReference evaluateExpression_6(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for - operations
-    Token t = currentStream.peek();
-    if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("-"))
-    {
-      currentStream.skip();
-      VariableReference v = evaluateExpression_6(currentStream);
-      if (v == null)
-        syntaxError(currentStream,"Missing expression after '-'");
-      return resolveMustExist(currentStream,v).unaryMinus();
-    }
-    return parseVariableReference(currentStream);
-  }
-  
-  protected boolean skipExpression_6(TokenStream currentStream)
-    throws ScriptException
-  {
-    // Look for - operations
-    Token t = currentStream.peek();
-    if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("-"))
-    {
-      currentStream.skip();
-      if (skipExpression_6(currentStream) == false)
-        syntaxError(currentStream,"Missing expression after '-'");
-      return true;
-    }
-    return skipVariableReference(currentStream);
-  }
-
-  protected VariableReference parseVariableReference(TokenStream currentStream)
-    throws ScriptException
-  {
-    // variable_reference -> 'isnull' variable_reference
-    // variable_reference -> variable_reference_0
-    Token t = currentStream.peek();
-    if (t != null && t.getToken() != null && t.getToken().equals("isnull"))
-    {
-      currentStream.skip();
-      VariableReference reference = parseVariableReference(currentStream);
-      if (reference == null)
-        syntaxError(currentStream,"Missing variable reference");
-      return new VariableBoolean(reference.isNull());
-    }
-    else
-      return parseVariableReference_0(currentStream);
-  }
-
-  protected boolean skipVariableReference(TokenStream currentStream)
-    throws ScriptException
-  {
-    // variable_reference -> 'isnull' variable_reference
-    // variable_reference -> variable_reference_0
-    Token t = currentStream.peek();
-    if (t != null && t.getToken() != null && t.getToken().equals("isnull"))
-    {
-      currentStream.skip();
-      if (skipVariableReference(currentStream) == false)
-        syntaxError(currentStream,"Missing variable reference");
-      return true;
-    }
-    else
-      return skipVariableReference_0(currentStream);
-  }
-  
-  protected VariableReference parseVariableReference_0(TokenStream currentStream)
-    throws ScriptException
-  {
-    // variable_reference -> variable_reference '[' expression ']'
-    // variable_reference -> variable_reference.property_name
-    // variable_reference -> variable_reference_1
-    
-    VariableReference vr = parseVariableReference_1(currentStream);
-    if (vr == null)
-      return vr;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("["))
-      {
-	currentStream.skip();
-	VariableReference expression = evaluateExpression(currentStream);
-	if (expression == null)
-	  syntaxError(currentStream,"Missing expression after '['");
-	Variable v = resolveMustExist(currentStream,vr);
-	t = currentStream.peek();
-	if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("]"))
-	  syntaxError(currentStream,"Missing ']'");
-	currentStream.skip();
-        vr = v.getIndexed(expression.resolve());
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("."))
-      {
-	currentStream.skip();
-	t = currentStream.peek();
-	if (t == null || t.getToken() == null)
-	  syntaxError(currentStream,"Need attribute name");
-	Variable v = resolveMustExist(currentStream,vr);
-	currentStream.skip();
-        vr = v.getAttribute(t.getToken());
-      }
-      else
-	break;
-    }
-      
-    return vr;
-  }
-  
-  protected VariableReference parseVariableReference_1(TokenStream currentStream)
-    throws ScriptException
-  {
-    Token t = currentStream.peek();
-    if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("("))
-    {
-      currentStream.skip();
-      VariableReference rval = evaluateExpression(currentStream);
-      if (rval == null)
-        syntaxError(currentStream,"Missing expression after '('");
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(")"))
-        syntaxError(currentStream,"Missing ')'");
-      currentStream.skip();
-      return rval;
-    }
-    else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("["))
-    {
-      currentStream.skip();
-      VariableArray va = new VariableArray();
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("]"))
-      {
-        while (true)
-        {
-          VariableReference vr = evaluateExpression(currentStream);
-          if (vr == null)
-            syntaxError(currentStream,"Missing expression in array initializer");
-          va.insertAt(vr.resolve(),null);
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("]"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-      return va;
-    }
-    else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("{"))
-    {
-      currentStream.skip();
-      VariableConfiguration va = new VariableConfiguration();
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("}"))
-      {
-        while (true)
-        {
-          VariableReference vr = evaluateExpression(currentStream);
-          if (vr == null)
-            syntaxError(currentStream,"Missing expression in configuration object initializer");
-          va.insertAt(vr.resolve(),null);
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("}"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-      return va;
-    }
-    else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("<<"))
-    {
-      currentStream.skip();
-      // Parse the node type
-      VariableReference nodeTypeRef = evaluateExpression(currentStream);
-      if (nodeTypeRef == null)
-        syntaxError(currentStream,"Missing node type");
-      Variable nodeType = resolveMustExist(currentStream,nodeTypeRef);
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(":"))
-        syntaxError(currentStream,"Missing ':'");
-      currentStream.skip();
-      
-      VariableConfigurationNode va = new VariableConfigurationNode(nodeType.getStringValue());
-
-      // Parse the node value
-      VariableReference nodeValueRef = evaluateExpression(currentStream);
-      if (nodeValueRef == null)
-        syntaxError(currentStream,"Missing node value");
-      Variable nodeValue = resolveMustExist(currentStream,nodeValueRef);
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(":"))
-        syntaxError(currentStream,"Missing ':'");
-      currentStream.skip();
-      
-      va.getAttribute(Variable.ATTRIBUTE_VALUE).setReference(nodeValue);
-      
-      // Parse the attributes
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(":"))
-      {
-        while (true)
-        {
-          VariableReference vr = evaluateExpression(currentStream);
-          if (vr == null)
-            syntaxError(currentStream,"Missing name expression in configurationnode attribute initializer");
-          Variable attrName = resolveMustExist(currentStream,vr);
-          t = currentStream.peek();
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-            syntaxError(currentStream,"Missing '='");
-          currentStream.skip();
-          vr = evaluateExpression(currentStream);
-          if (vr == null)
-            syntaxError(currentStream,"Missing value expression in configurationnode attribute initializer");
-          va.getAttribute(attrName.getStringValue()).setReference(vr.resolve());
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(":"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-
-      // Parse the children
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(">>"))
-      {
-        while (true)
-        {
-          VariableReference vr = evaluateExpression(currentStream);
-          if (vr == null)
-            syntaxError(currentStream,"Missing expression in configurationnode object initializer");
-          va.insertAt(vr.resolve(),null);
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(">>"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-      return va;
-    }
-
-    return parseVariableReference_2(currentStream);
-  }
-  
-  protected VariableReference parseVariableReference_2(TokenStream currentStream)
-    throws ScriptException
-  {
-    Token t = currentStream.peek();
-    if (t != null && t.getToken() != null)
-    {
-      currentStream.skip();
-      String variableName = t.getToken();
-      if (variableName.equals("true"))
-        return new VariableBoolean(true);
-      else if (variableName.equals("false"))
-        return new VariableBoolean(false);
-      else if (variableName.equals("null"))
-        return new NullVariableReference();
-      else if (variableName.equals("new"))
-      {
-        // Parse the new operation name
-        t = currentStream.peek();
-        if (t == null || t.getToken() == null)
-          syntaxError(currentStream,"Missing 'new' operation name");
-        String operationName = t.getToken();
-        // Look up operation
-        NewOperation newOperation = newOperations.get(operationName);
-        if (newOperation == null)
-          syntaxError(currentStream,"New operation type is unknown");
-        currentStream.skip();
-        return newOperation.parseAndCreate(this,currentStream);
-      }
-      else
-      {
-        // Look up variable reference in current context
-        ContextVariableReference x = context.get(variableName);
-        if (x == null)
-        {
-          x = new ContextVariableReference();
-          context.put(variableName,x);
-        }
-        return x;
-      }
-    }
-    else if (t != null && t.getString() != null)
-    {
-      currentStream.skip();
-      return new VariableString(t.getString());
-    }
-    else if (t != null && t.getFloat() != null)
-    {
-      currentStream.skip();
-      return new VariableFloat(new Double(t.getFloat()).doubleValue());
-    }
-    else if (t != null && t.getInteger() != null)
-    {
-      currentStream.skip();
-      return new VariableInt(Integer.parseInt(t.getInteger()));
-    }
-    else
-      return null;
-  }
-  
-  protected boolean skipVariableReference_0(TokenStream currentStream)
-    throws ScriptException
-  {
-    if (skipVariableReference_1(currentStream) == false)
-      return false;
-    while (true)
-    {
-      Token t = currentStream.peek();
-      if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("["))
-      {
-	currentStream.skip();
-	if (skipExpression(currentStream) == false)
-	  syntaxError(currentStream,"Missing expression after '['");
-	t = currentStream.peek();
-	if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("]"))
-	  syntaxError(currentStream,"Missing ']'");
-	currentStream.skip();
-      }
-      else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("."))
-      {
-	currentStream.skip();
-	t = currentStream.peek();
-	if (t == null || t.getToken() == null)
-	  syntaxError(currentStream,"Need property name");
-	currentStream.skip();
-      }
-      else
-	break;
-    }
-      
-    return true;
-  }
-
-  protected boolean skipVariableReference_1(TokenStream currentStream)
-    throws ScriptException
-  {
-    Token t = currentStream.peek();
-    if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("("))
-    {
-      currentStream.skip();
-      if (skipExpression(currentStream) == false)
-        syntaxError(currentStream,"Missing expression after '('");
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(")"))
-        syntaxError(currentStream,"Missing ')'");
-      currentStream.skip();
-      return true;
-    }
-    else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("["))
-    {
-      currentStream.skip();
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("]"))
-      {
-        while (true)
-        {
-          if (skipExpression(currentStream) == false)
-            syntaxError(currentStream,"Missing expression in array initializer");
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("]"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-      return true;
-    }
-    else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("{"))
-    {
-      currentStream.skip();
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("}"))
-      {
-        while (true)
-        {
-          if (skipExpression(currentStream) == false)
-            syntaxError(currentStream,"Missing expression in configuration object initializer");
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("}"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-      return true;
-    }
-    else if (t != null && t.getPunctuation() != null && t.getPunctuation().equals("<<"))
-    {
-      currentStream.skip();
-      // Parse the node type
-      if (skipExpression(currentStream) == false)
-        syntaxError(currentStream,"Missing node type");
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(":"))
-        syntaxError(currentStream,"Missing ':'");
-      currentStream.skip();
-      
-      // Parse the node value
-      if (skipExpression(currentStream) == false)
-        syntaxError(currentStream,"Missing node value");
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(":"))
-        syntaxError(currentStream,"Missing ':'");
-      currentStream.skip();
-      
-      // Parse the attributes
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(":"))
-      {
-        while (true)
-        {
-          if (skipExpression(currentStream) == false)
-            syntaxError(currentStream,"Missing name expression in configurationnode attribute initializer");
-          t = currentStream.peek();
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-            syntaxError(currentStream,"Missing '='");
-          currentStream.skip();
-          if (skipExpression(currentStream) == false)
-            syntaxError(currentStream,"Missing value expression in configurationnode attribute initializer");
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(":"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-
-      // Parse the children
-      t = currentStream.peek();
-      if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(">>"))
-      {
-        while (true)
-        {
-          if (skipExpression(currentStream) == false)
-            syntaxError(currentStream,"Missing expression in configurationnode object initializer");
-          t = currentStream.peek();
-          if (t != null && t.getPunctuation() != null && t.getPunctuation().equals(">>"))
-            break;
-          if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals(","))
-            syntaxError(currentStream,"Missing ','");
-          currentStream.skip();
-        }
-      }
-      currentStream.skip();
-      return true;
-    }
-
-    return skipVariableReference_2(currentStream);
-  }
-
-  protected boolean skipVariableReference_2(TokenStream currentStream)
-    throws ScriptException
-  {
-    Token t = currentStream.peek();
-    if (t != null && t.getToken() != null)
-    {
-      currentStream.skip();
-      if (t.getToken().equals("new"))
-      {
-        // Parse the new operation name
-        t = currentStream.peek();
-        if (t == null || t.getToken() == null)
-          syntaxError(currentStream,"Missing 'new' operation name");
-        String operationName = t.getToken();
-        // Look up operation
-        NewOperation newOperation = newOperations.get(operationName);
-        if (newOperation == null)
-          syntaxError(currentStream,"New operation type is unknown");
-        currentStream.skip();
-        newOperation.parseAndSkip(this,currentStream);
-      }
-      return true;
-    }
-    else if (t != null && t.getString() != null)
-    {
-      currentStream.skip();
-      return true;
-    }
-    else if (t != null && t.getFloat() != null)
-    {
-      currentStream.skip();
-      return true;
-    }
-    else if (t != null && t.getInteger() != null)
-    {
-      currentStream.skip();
-      return true;
-    }
-
-    return false;
-  }
-  
-  public static void syntaxError(TokenStream currentStream, String message)
-    throws ScriptException
-  {
-    localError(currentStream,"Syntax error: "+message);
-  }
-  
-  public static Variable resolveMustExist(TokenStream currentStream, VariableReference vr)
-    throws ScriptException
-  {
-    Variable v = vr.resolve();
-    if (v == null)
-      localError(currentStream,"Expression cannot be null");
-    return v;
-  }
-  
-  public static void localError(TokenStream currentStream, String message)
-    throws ScriptException
-  {
-    Token t = currentStream.peek();
-    if (t == null)
-      throw new ScriptException(message+", at end of file");
-    else
-      t.throwException(message + ": "+t);
-  }
-  
-  public static String convertToString(HttpResponse httpResponse)
-    throws IOException
-  {
-    HttpEntity entity = httpResponse.getEntity();
-    if (entity != null)
-    {
-      InputStream is = entity.getContent();
-      try
-      {
-        Charset charSet;
-        try
-        {
-          ContentType ct = ContentType.get(entity);
-          if (ct == null)
-            charSet = StandardCharsets.UTF_8;
-          else
-            charSet = ct.getCharset();
-        }
-        catch (ParseException e)
-        {
-          charSet = StandardCharsets.UTF_8;
-        }
-        char[] buffer = new char[65536];
-        Reader r = new InputStreamReader(is,charSet);
-        Writer w = new StringWriter();
-        try
-        {
-          while (true)
-          {
-            int amt = r.read(buffer);
-            if (amt == -1)
-              break;
-            w.write(buffer,0,amt);
-          }
-        }
-        finally
-        {
-          w.flush();
-        }
-        return w.toString();
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    return "";
-  }
-  
-  public HttpClient getHttpClient()
-  {
-    synchronized (httpClientLock)
-    {
-      if (httpClient == null)
-      {
-        int socketTimeout = 900000;
-        int connectionTimeout = 300000;
-
-        PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
-        poolingConnectionManager.setDefaultMaxPerRoute(1);
-        poolingConnectionManager.setValidateAfterInactivity(60000);
-        poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
-          .setTcpNoDelay(true)
-          .setSoTimeout(socketTimeout)
-          .build());
-        connectionManager = poolingConnectionManager;
-        
-        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-
-        RequestConfig.Builder requestBuilder = RequestConfig.custom()
-          .setCircularRedirectsAllowed(true)
-          .setSocketTimeout(socketTimeout)
-          .setExpectContinueEnabled(true)
-          .setConnectTimeout(connectionTimeout)
-          .setConnectionRequestTimeout(socketTimeout);
-
-        httpClient = HttpClients.custom()
-          .setConnectionManager(connectionManager)
-          .setMaxConnTotal(1)
-          .disableAutomaticRetries()
-          .setDefaultRequestConfig(requestBuilder.build())
-          .setDefaultCredentialsProvider(credentialsProvider)
-          //.setSSLSocketFactory(myFactory)
-          .setRequestExecutor(new HttpRequestExecutor(socketTimeout))
-          .setRedirectStrategy(new LaxRedirectStrategy())
-          .build();
-
-      }
-    }
-    return httpClient;
-  }
-  
-  public static void main(String[] argv)
-  {
-    // Usage: ScriptParser [<filename> [arg1 [arg2 ...]]
-    
-    ScriptParser sp = new ScriptParser();
-    
-    // Initialize script parser with the appropriate commands.
-    sp.addCommand("break",new BreakCommand());
-    sp.addCommand("print",new PrintCommand());
-    sp.addCommand("if",new IfCommand());
-    sp.addCommand("while",new WhileCommand());
-    sp.addCommand("set",new SetCommand());
-    sp.addCommand("insert",new InsertCommand());
-    sp.addCommand("remove",new RemoveCommand());
-    sp.addCommand("error",new ErrorCommand());
-    sp.addCommand("wait",new WaitCommand());
-    
-    sp.addCommand("GET",new GETCommand());
-    sp.addCommand("PUT",new PUTCommand());
-    sp.addCommand("DELETE",new DELETECommand());
-    sp.addCommand("POST", new POSTCommand());
-    
-    // Add the new operations we need
-    sp.addNewOperation("configuration",new NewConfiguration());
-    sp.addNewOperation("configurationnode",new NewConfigurationNode());
-    sp.addNewOperation("url",new NewURL());
-    sp.addNewOperation("connectionname",new NewConnectionName());
-    sp.addNewOperation("array",new NewArray());
-    sp.addNewOperation("dictionary",new NewDictionary());
-    sp.addNewOperation("queryarg",new NewQueryArgument());
-    
-    try
-    {
-      Reader reader;
-      if (argv.length >= 1)
-      {
-        File inputFile = new File(argv[0]);
-        reader = new InputStreamReader(new FileInputStream(inputFile),StandardCharsets.UTF_8);
-        VariableArray va = new VariableArray();
-        int i = 0;
-        while (i < argv.length - 1)
-        {
-          String arg = argv[i+1];
-          va.insertAt(new VariableString(arg),null);
-          i++;
-        }
-        sp.addVariable("__args__",va);
-        TokenStream ts = new BasicTokenStream(reader);
-        sp.execute(ts);
-      }
-      else
-      {
-        reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
-      
-        while (true)
-        {
-          TokenStream ts = new BasicTokenStream(reader);
-          try
-          {
-            sp.execute(ts);
-            break;
-          }
-          catch (ScriptException e)
-          {
-            System.out.println("Error: "+e.getMessage());
-            if (ts.peek() == null)
-              break;
-          }
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace(System.err);
-      System.exit(2);
-    }
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/SetCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/SetCommand.java
deleted file mode 100644
index ecdefaf..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/SetCommand.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Set command. */
-public class SetCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference lhs = sp.evaluateExpression(currentStream);
-    if (lhs == null)
-      sp.syntaxError(currentStream,"Missing lhs expression in set command");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' in set command");
-    currentStream.skip();
-    VariableReference rhs = sp.evaluateExpression(currentStream);
-    if (rhs == null)
-      sp.syntaxError(currentStream,"Missing rhs expression in set command");
-    lhs.setReference(rhs.resolve());
-    return false;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing lhs expression in set command");
-    Token t = currentStream.peek();
-    if (t == null || t.getPunctuation() == null || !t.getPunctuation().equals("="))
-      sp.syntaxError(currentStream,"Missing '=' in set command");
-    currentStream.skip();
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing rhs expression in set command");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Token.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Token.java
deleted file mode 100644
index 9578f94..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Token.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-public class Token
-{
-  public static final int TOKEN_PUNCTUATION = 0;
-  public static final int TOKEN_STRING = 1;
-  public static final int TOKEN_INTEGER = 2;
-  public static final int TOKEN_FLOAT = 3;
-  public static final int TOKEN_TOKEN = 4;
-  
-  protected int tokenType;
-  protected String tokenValue;
-  protected int lineNumber;
-  protected int characterPosition;
-  
-  public Token(int type, String value, int lineNumber, int characterPosition)
-  {
-    this.tokenType = type;
-    this.tokenValue = value;
-    this.lineNumber = lineNumber;
-    this.characterPosition = characterPosition;
-  }
-  
-  public void throwException(String message)
-    throws ScriptException
-  {
-    throw new ScriptException(message+" at line "+lineNumber+" position "+characterPosition);
-  }
-  
-  public String getPunctuation()
-  {
-    if (tokenType == TOKEN_PUNCTUATION)
-      return tokenValue;
-    return null;
-  }
-  
-  public String getToken()
-  {
-    if (tokenType == TOKEN_TOKEN)
-      return tokenValue;
-    return null;
-  }
-  
-  public String getString()
-  {
-    if (tokenType == TOKEN_STRING)
-      return tokenValue;
-    return null;
-  }
-  
-  public String getFloat()
-  {
-    if (tokenType == TOKEN_FLOAT)
-      return tokenValue;
-    return null;
-  }
-  
-  public String getInteger()
-  {
-    if (tokenType == TOKEN_INTEGER)
-      return tokenValue;
-    return null;
-  }
-  
-  public String toString()
-  {
-    return "Type: "+Integer.toString(tokenType)+" Value: '"+tokenValue+"' Line: "+Integer.toString(lineNumber)+" Char: "+Integer.toString(characterPosition);
-  }
-  
-}
\ No newline at end of file
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java
deleted file mode 100644
index 603ad41..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/TokenStream.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Describe a sequence of tokens.
-*/
-public interface TokenStream
-{
-  /** Examine the current token.
-  */
-  public Token peek()
-    throws ScriptException;
-  
-  /** Skip the current token.
-  */
-  public void skip();
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Variable.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Variable.java
deleted file mode 100644
index 03c4d45..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/Variable.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** This interface represents a variable within the ManifoldCF script engine.
-* A variable may have a value, and may have various named properties, as described below.
-* 
-*/
-public interface Variable
-{
-  // Special attributes
-  
-  /** Conversion to string */
-  public static String ATTRIBUTE_STRING = "__string__";
-  /** Conversion to int */
-  public static String ATTRIBUTE_INT = "__int__";
-  /** Conversion to float */
-  public static String ATTRIBUTE_FLOAT = "__float__";
-  /** Conversion to boolean */
-  public static String ATTRIBUTE_BOOLEAN = "__boolean__";
-  /** Script value */
-  public static String ATTRIBUTE_SCRIPT = "__script__";
-  /** Name attribute */
-  public static String ATTRIBUTE_TYPE = "__type__";
-  /** Value attribute */
-  public static String ATTRIBUTE_VALUE = "__value__";
-  /** Size attribute */
-  public static String ATTRIBUTE_SIZE = "__size__";
-  /** Dict attribute */
-  public static String ATTRIBUTE_DICT = "__dict__";
-  /** OK status attribute */
-  public static String ATTRIBUTE_OKSTATUS = "__OK__";
-  /** NOTFOUND status attribute */
-  public static String ATTRIBUTE_NOTFOUNDSTATUS = "__NOTFOUND__";
-  /** CREATED status attribute */
-  public static String ATTRIBUTE_CREATEDSTATUS = "__CREATED__";
-  /** UNAUTHORIZED status attribute */
-  public static String ATTRIBUTE_UNAUTHORIZEDSTATUS = "__UNAUTHORIZED__";
-  
-  /** Check if the variable has a string value */
-  public boolean hasStringValue()
-    throws ScriptException;
-    
-  /** Get the variable's value as a string */
-  public String getStringValue()
-    throws ScriptException;
-
-  /** Check if the variable has a script value */
-  public boolean hasScriptValue()
-    throws ScriptException;
-
-  /** Get the variable's script value */
-  public String getScriptValue()
-    throws ScriptException;
-
-  /** Check if the variable has a Configuration value */
-  public boolean hasConfigurationValue()
-    throws ScriptException;
-
-  /** Get the variable's value as a Configuration object */
-  public Configuration getConfigurationValue()
-    throws ScriptException;
-  
-  /** Check if the variable has a ConfigurationNode value */
-  public boolean hasConfigurationNodeValue()
-    throws ScriptException;
-
-  /** Get the variable's value as a ConfigurationNode object */
-  public ConfigurationNode getConfigurationNodeValue()
-    throws ScriptException;
-
-  /** Check if the variable has a boolean value */
-  public boolean hasBooleanValue()
-    throws ScriptException;
-
-  /** Get the variable's value as a boolean */
-  public boolean getBooleanValue()
-    throws ScriptException;
-  
-  /** Check if the variable has an int value */
-  public boolean hasIntValue()
-    throws ScriptException;
-
-  /** Get the variable's value as an integer */
-  public int getIntValue()
-    throws ScriptException;
-  
-  /** Check if the variable has a double value */
-  public boolean hasDoubleValue()
-    throws ScriptException;
-
-  /** Get the variable's value as a double */
-  public double getDoubleValue()
-    throws ScriptException;
-    
-  /** Check if the variable has a query argument value */
-  public boolean hasQueryArgumentValue()
-    throws ScriptException;
-
-  /** Get the variable's value as a properly-encoded query argument */
-  public String getQueryArgumentValue()
-    throws ScriptException;
-  
-  /** Check if the variable has a URL path value */
-  public boolean hasURLPathValue()
-    throws ScriptException;
-    
-  /** Get the variable's value as a URL path component */
-  public String getURLPathValue()
-    throws ScriptException;
-    
-  // Arithmetic and comparison operators
-  
-  public VariableReference plus(Variable v)
-    throws ScriptException;
-    
-  public VariableReference minus(Variable v)
-    throws ScriptException;
-    
-  public VariableReference asterisk(Variable v)
-    throws ScriptException;
-    
-  public VariableReference slash(Variable v)
-    throws ScriptException;
-    
-  public VariableReference unaryMinus()
-    throws ScriptException;
-  
-  public VariableReference greaterAngle(Variable v)
-    throws ScriptException;
-    
-  public VariableReference lesserAngle(Variable v)
-    throws ScriptException;
-    
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException;
-    
-  public VariableReference greaterAngleEquals(Variable v)
-    throws ScriptException;
-    
-  public VariableReference lesserAngleEquals(Variable v)
-    throws ScriptException;
-  
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException;
-  
-  public VariableReference ampersand(Variable v)
-    throws ScriptException;
-    
-  public VariableReference pipe(Variable v)
-    throws ScriptException;
-
-  public VariableReference doubleAmpersand(Variable v)
-    throws ScriptException;
-    
-  public VariableReference doublePipe(Variable v)
-    throws ScriptException;
-
-  public VariableReference unaryExclamation()
-    throws ScriptException;
-    
-  // The following operations allow manipulation of a Configuration structure
-
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException;
-  
-  /** Insert an object into this variable at a position.  Use null to insert at end. */
-  public void insertAt(Variable v, Variable index)
-    throws ScriptException;
-    
-  /** Delete an object from this variable at a position. */
-  public void removeAt(Variable index)
-    throws ScriptException;
-    
-  // The following operations correspond to xxx[index]
-  
-  /** Get an indexed property of the variable */
-  public VariableReference getIndexed(Variable index)
-    throws ScriptException;
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableArray.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableArray.java
deleted file mode 100644
index 22d75ce..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableArray.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** Array variable object.
-*/
-public class VariableArray extends VariableBase
-{
-  protected List<Variable> array = new ArrayList<Variable>();
-  
-  public VariableArray()
-  {
-  }
-  
-  @Override
-  public int hashCode()
-  {
-    int rval = 0;
-    int i = 0;
-    while (i < array.size())
-    {
-      Variable v = array.get(i++);
-      rval += v.hashCode();
-    }
-    return rval;
-  }
-
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableArray))
-      return false;
-    VariableArray va = (VariableArray)o;
-    if (va.array.size() != array.size())
-      return false;
-    int i = 0;
-    while (i < array.size())
-    {
-      Variable v = array.get(i);
-      Variable v2 = va.array.get(i);
-      if (!v.equals(v2))
-        return false;
-      i++;
-    }
-    return true;
-  }
-  
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder("[ ");
-    int i = 0;
-    while (i < array.size())
-    {
-      if (i > 0)
-        sb.append(", ");
-      Variable v = array.get(i++);
-      if (v == null)
-        sb.append("null");
-      else
-        sb.append(v.getScriptValue());
-    }
-    sb.append(" ]");
-    return sb.toString();
-  }
-  
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  @Override
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException
-  {
-    // We recognize only the __size__ attribute
-    if (attributeName.equals(ATTRIBUTE_SIZE))
-      return new VariableInt(array.size());
-    return super.getAttribute(attributeName);
-  }
-  
-  /** Get an indexed property of the variable */
-  @Override
-  public VariableReference getIndexed(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Subscript cannot be null"));
-    int indexValue = index.getIntValue();
-    if (indexValue >= 0 && indexValue < array.size())
-      return new ElementReference(indexValue);
-    throw new ScriptException(composeMessage("Index out of bounds: "+indexValue));
-  }
-  
-  /** Insert an object into this variable at a position. */
-  @Override
-  public void insertAt(Variable v, Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      array.add(v);
-    else
-    {
-      int indexValue = index.getIntValue();
-      if (indexValue < 0 || indexValue > array.size())
-        throw new ScriptException(composeMessage("Insert index out of bounds: "+indexValue));
-      array.add(indexValue,v);
-    }
-  }
-
-  /** Delete an object from this variable at a position. */
-  @Override
-  public void removeAt(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Array remove index cannot be null"));
-    int indexValue = index.getIntValue();
-    if (indexValue < 0 || indexValue >= array.size())
-      throw new ScriptException(composeMessage("Array remove index out of bounds: "+indexValue));
-    array.remove(indexValue);
-  }
-
-  /** Extend VariableReference class so we capture attempts to set the reference, and actually overwrite the child when that is done */
-  protected class ElementReference implements VariableReference
-  {
-    protected int index;
-    
-    public ElementReference(int index)
-    {
-      this.index = index;
-    }
-
-    @Override
-    public void setReference(Variable v)
-      throws ScriptException
-    {
-      if (index < 0 || index >= array.size())
-        throw new ScriptException(composeMessage("Index out of range for array children: "+index));
-      array.set(index,v);
-    }
-    
-    @Override
-    public Variable resolve()
-      throws ScriptException
-    {
-      if (index < 0 || index >= array.size())
-        throw new ScriptException(composeMessage("Index out of range for array children: "+index));
-      return array.get(index);
-    }
-    
-    /** Check if this reference is null */
-    @Override
-    public boolean isNull()
-    {
-      return index < 0 || index >= array.size() || array.get(index) == null;
-    }
-
-  }
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBase.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBase.java
deleted file mode 100644
index 7ac78da..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBase.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Base class for variables.
-* Basically, everything is illegal until overridden.
-*/
-public class VariableBase implements Variable, VariableReference
-{
-  public VariableBase()
-  {
-  }
-  
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return false;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return false;
-  }
-
-  /** Check if the variable has a Configuration value */
-  @Override
-  public boolean hasConfigurationValue()
-    throws ScriptException
-  {
-    return false;
-  }
-  
-  /** Check if the variable has a ConfigurationNode value */
-  @Override
-  public boolean hasConfigurationNodeValue()
-    throws ScriptException
-  {
-    return false;
-  }
-
-  /** Check if the variable has a boolean value */
-  @Override
-  public boolean hasBooleanValue()
-    throws ScriptException
-  {
-    return false;
-  }
-  
-  /** Check if the variable has an int value */
-  @Override
-  public boolean hasIntValue()
-    throws ScriptException
-  {
-    return false;
-  }
-  
-  /** Check if the variable has a double value */
-  @Override
-  public boolean hasDoubleValue()
-    throws ScriptException
-  {
-    return false;
-  }
-    
-  /** Check if the variable has a query argument value */
-  @Override
-  public boolean hasQueryArgumentValue()
-    throws ScriptException
-  {
-    return false;
-  }
-
-  /** Check if the variable has a URL path value */
-  @Override
-  public boolean hasURLPathValue()
-    throws ScriptException
-  {
-    return false;
-  }
-    
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Variable has no script value"));
-  }
-
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to string"));
-  }
-  
-  /** Get the variable's value as a Configuration object */
-  @Override
-  public Configuration getConfigurationValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to Configuration object"));
-  }
-    
-  /** Get the variable's value as a ConfigurationNode object */
-  @Override
-  public ConfigurationNode getConfigurationNodeValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to ConfigurationNode object"));
-  }
-
-  /** Get the variable's value as a boolean */
-  @Override
-  public boolean getBooleanValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to boolean"));
-  }
-  
-  /** Get the variable's value as an integer */
-  @Override
-  public int getIntValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to int"));
-  }
-  
-  /** Get the variable's value as a double */
-  @Override
-  public double getDoubleValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to float"));
-  }
-
-  /** Get the variable's value as a properly-encoded query argument */
-  @Override
-  public String getQueryArgumentValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to query argument"));
-  }
-
-  /** Get the variable's value as a URL path component */
-  @Override
-  public String getURLPathValue()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot convert variable to URL path component"));
-  }
-    
-  // Operations
-  
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '+' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference minus(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '-' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference asterisk(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '*' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference slash(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '/' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference unaryMinus()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Unary '-' operator illegal for this type"));
-  }
-  
-  @Override
-  public VariableReference greaterAngle(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '>' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference lesserAngle(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '<' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '==' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference greaterAngleEquals(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '>=' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference lesserAngleEquals(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '<=' operator illegal for this type"));
-  }
-  
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '!=' operator illegal for this type"));
-  }
-  
-  @Override
-  public VariableReference ampersand(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '&' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference pipe(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '|' operator illegal for this type"));
-  }
-
-  @Override
-  public VariableReference doubleAmpersand(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '&&' operator illegal for this type"));
-  }
-    
-  @Override
-  public VariableReference doublePipe(Variable v)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Binary '||' operator illegal for this type"));
-  }
-  
-  @Override
-  public VariableReference unaryExclamation()
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Unary '!' operator illegal for this type"));
-  }
-
-  // The following operations allow manipulation of a Configuration structure
-
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  @Override
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException
-  {
-    if (attributeName.equals(ATTRIBUTE_STRING))
-      return new VariableString(getStringValue());
-    else if (attributeName.equals(ATTRIBUTE_INT))
-      return new VariableInt(getIntValue());
-    else if (attributeName.equals(ATTRIBUTE_FLOAT))
-      return new VariableFloat(getDoubleValue());
-    else if (attributeName.equals(ATTRIBUTE_BOOLEAN))
-      return new VariableBoolean(getBooleanValue());
-    else if (attributeName.equals(ATTRIBUTE_SCRIPT))
-      return new VariableString(getScriptValue());
-    else
-      throw new ScriptException(composeMessage("Variable has no attribute called '"+attributeName+"'"));
-  }
-  
-  /** Insert an object into this variable at a position. */
-  @Override
-  public void insertAt(Variable v, Variable index)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Variable does not support 'insert' operation"));
-  }
-
-  /** Delete an object from this variable at a position. */
-  @Override
-  public void removeAt(Variable index)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Variable does not support 'remove' operation"));
-  }
-    
-
-  // The following two operations correspond to <xxx> and xxx[index]
-  
-  /** Get an indexed property of the variable */
-  @Override
-  public VariableReference getIndexed(Variable index)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Variable does not support subscripts"));
-  }
-
-  // As a variable reference, refer to self
-  
-  /** Set the reference */
-  @Override
-  public void setReference(Variable object)
-    throws ScriptException
-  {
-    throw new ScriptException(composeMessage("Cannot set reference"));
-  }
-  
-  /** Resolve the reference */
-  @Override
-  public Variable resolve()
-    throws ScriptException
-  {
-    return this;
-  }
-
-  /** Check if this reference is null */
-  @Override
-  public boolean isNull()
-  {
-    return false;
-  }
-
-  // Protected methods
-  
-  /** Compose a message which includes the current class name, so we can see what type of variable it is. */
-  protected String composeMessage(String input)
-  {
-    return "Variable of type '"+getClass().getName()+"': "+input;
-  }
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBoolean.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBoolean.java
deleted file mode 100644
index 2305cec..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableBoolean.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Variable class representing an integer.
-*/
-public class VariableBoolean extends VariableBase
-{
-  protected boolean value;
-  
-  public VariableBoolean(boolean value)
-  {
-    this.value = value;
-  }
-
-  @Override
-  public int hashCode()
-  {
-    return new Boolean(value).hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableBoolean))
-      return false;
-    return ((VariableBoolean)o).value == value;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    if (value)
-      return "true";
-    return "false";
-  }
-
-  /** Check if the variable has a boolean value */
-  @Override
-  public boolean hasBooleanValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's value as a boolean */
-  @Override
-  public boolean getBooleanValue()
-    throws ScriptException
-  {
-    return value;
-  }
-
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(value == v.getBooleanValue());
-  }
-
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(value != v.getBooleanValue());
-  }
-
-  @Override
-  public VariableReference doubleAmpersand(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '&&' operand cannot be null"));
-    return new VariableBoolean(value && v.getBooleanValue());
-  }
-    
-  @Override
-  public VariableReference doublePipe(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '||' operand cannot be null"));
-    return new VariableBoolean(value || v.getBooleanValue());
-  }
-
-  @Override
-  public VariableReference ampersand(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '&' operand cannot be null"));
-    return new VariableBoolean(value && v.getBooleanValue());
-  }
-    
-  @Override
-  public VariableReference pipe(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '|' operand cannot be null"));
-    return new VariableBoolean(value || v.getBooleanValue());
-  }
-
-  @Override
-  public VariableReference unaryExclamation()
-    throws ScriptException
-  {
-    return new VariableBoolean(! value);
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfiguration.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfiguration.java
deleted file mode 100644
index ca40e69..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfiguration.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Variable wrapper for Configuration object.
-*/
-public class VariableConfiguration extends VariableBase
-{
-  protected Configuration configuration;
-  
-  public VariableConfiguration()
-  {
-    configuration = new Configuration();
-  }
-
-  public VariableConfiguration(Configuration c)
-  {
-    configuration = c;
-  }
-  
-  public VariableConfiguration(String json)
-    throws ScriptException
-  {
-    configuration = new Configuration();
-    if (json != null && json.length() > 0)
-    {
-      try
-      {
-        configuration.fromJSON(json);
-      }
-      catch (ManifoldCFException e)
-      {
-        throw new ScriptException("Invalid json: '"+json+"': "+e.getMessage(),e);
-      }
-    }
-  }
-  
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("{ ");
-    int i = 0;
-    while (i < configuration.getChildCount())
-    {
-      if (i > 0)
-        sb.append(", ");
-      ConfigurationNode child = configuration.findChild(i++);
-      sb.append(new VariableConfigurationNode(child).getScriptValue());
-    }
-    sb.append(" }");
-    return sb.toString();
-  }
-  
-  /** Check if the variable has a Configuration value */
-  @Override
-  public boolean hasConfigurationValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's value as a Configuration object */
-  @Override
-  public Configuration getConfigurationValue()
-    throws ScriptException
-  {
-    return configuration;
-  }
-  
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  @Override
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException
-  {
-    // We recognize only the __size__ attribute
-    if (attributeName.equals(ATTRIBUTE_SIZE))
-      return new VariableInt(configuration.getChildCount());
-    if (attributeName.equals(ATTRIBUTE_DICT))
-    {
-      VariableDict dict = new VariableDict();
-      int i = 0;
-      while (i < configuration.getChildCount())
-      {
-        ConfigurationNode child = configuration.findChild(i++);
-        String type = child.getType();
-        dict.getIndexed(new VariableString(type)).setReference(new VariableConfigurationNode(child));
-      }
-      return dict;
-    }
-    return super.getAttribute(attributeName);
-  }
-  
-  /** Get an indexed property of the variable */
-  @Override
-  public VariableReference getIndexed(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Subscript cannot be null"));
-    int indexValue = index.getIntValue();
-    if (indexValue >= 0 && indexValue < configuration.getChildCount())
-      return new NodeReference(indexValue);
-    throw new ScriptException(composeMessage("Subscript is out of bounds: "+indexValue));
-  }
-  
-  /** Insert an object into this variable at a position. */
-  @Override
-  public void insertAt(Variable v, Variable index)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Can't insert a null object into a configuration"));
-    if (index == null)
-      configuration.addChild(configuration.getChildCount(),v.getConfigurationNodeValue());
-    else
-    {
-      int indexValue = index.getIntValue();
-      if (indexValue < 0 || indexValue > configuration.getChildCount())
-        throw new ScriptException(composeMessage("Configuration insert out of bounds: "+indexValue));
-      configuration.addChild(indexValue,v.getConfigurationNodeValue());
-    }
-  }
-
-  /** Delete an object from this variable at a position. */
-  @Override
-  public void removeAt(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Configuration remove index cannot be null"));
-    int indexValue = index.getIntValue();
-    if (indexValue < 0 || indexValue >= configuration.getChildCount())
-      throw new ScriptException(composeMessage("Configuration remove index out of bounds"));
-    configuration.removeChild(indexValue);
-  }
-
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '+' can't add a null object"));
-    ConfigurationNode node = v.getConfigurationNodeValue();
-    Configuration c = new Configuration();
-    int i = 0;
-    while (i < configuration.getChildCount())
-    {
-      ConfigurationNode child = configuration.findChild(i++);
-      c.addChild(c.getChildCount(),child);
-    }
-    c.addChild(c.getChildCount(),node);
-    return new VariableConfiguration(c);
-  }
-
-
-  /** Extend VariableReference class so we capture attempts to set the reference, and actually overwrite the child when that is done */
-  protected class NodeReference implements VariableReference
-  {
-    protected int index;
-    
-    public NodeReference(int index)
-    {
-      this.index = index;
-    }
-    
-    @Override
-    public void setReference(Variable v)
-      throws ScriptException
-    {
-      if (index < 0 || index >= configuration.getChildCount())
-        throw new ScriptException(composeMessage("Index out of range for Configuration children: "+index));
-      ConfigurationNode confNode = v.getConfigurationNodeValue();
-      configuration.removeChild(index);
-      configuration.addChild(index,confNode);
-    }
-    
-    @Override
-    public Variable resolve()
-      throws ScriptException
-    {
-      if (index < 0 || index >= configuration.getChildCount())
-        throw new ScriptException(composeMessage("Index out of range for Configuration children: "+index));
-      return new VariableConfigurationNode(configuration.findChild(index));
-    }
-    
-    /** Check if this reference is null */
-    @Override
-    public boolean isNull()
-    {
-      return index < 0 || index >= configuration.getChildCount();
-    }
-
-  }
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfigurationNode.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfigurationNode.java
deleted file mode 100644
index 824311a..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConfigurationNode.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** Variable wrapper for ConfigurationNode object.
-*/
-public class VariableConfigurationNode extends VariableBase
-{
-  protected ConfigurationNode configurationNode;
-  
-  public VariableConfigurationNode(String name)
-  {
-    configurationNode = new ConfigurationNode(name);
-  }
-  
-  public VariableConfigurationNode(ConfigurationNode node)
-  {
-    configurationNode = node;
-  }
-  
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("<< ");
-    sb.append(new VariableString(configurationNode.getType()).getScriptValue());
-    sb.append(" : ");
-    String valueField = configurationNode.getValue();
-    if (valueField == null)
-      valueField = "";
-    sb.append(new VariableString(valueField).getScriptValue());
-    sb.append(" : ");
-    boolean needComma = false;
-    Iterator<String> iter = configurationNode.getAttributes();
-    String[] attrs = new String[configurationNode.getAttributeCount()];
-    int i = 0;
-    while (iter.hasNext())
-    {
-      String attrName = iter.next();
-      attrs[i++] = attrName;
-    }
-    java.util.Arrays.sort(attrs);
-    i = 0;
-    while (i < attrs.length)
-    {
-      String attrName = attrs[i++];
-      String value = configurationNode.getAttributeValue(attrName);
-      if (needComma)
-        sb.append(", ");
-      else
-        needComma = true;
-      sb.append(new VariableString(attrName).getScriptValue());
-      sb.append("=");
-      sb.append(new VariableString(value).getScriptValue());
-    }
-    sb.append(" : ");
-    i = 0;
-    while (i < configurationNode.getChildCount())
-    {
-      ConfigurationNode child = configurationNode.findChild(i);
-      if (i > 0)
-        sb.append(", ");
-      sb.append(new VariableConfigurationNode(child).getScriptValue());
-      i++;
-    }
-    sb.append(" >>");
-    return sb.toString();
-  }
-
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Convert to a value */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    if (configurationNode.getValue() == null)
-      return "";
-    return configurationNode.getValue();
-  }
-  
-  /** Get the variable's value as a ConfigurationNode object */
-  public ConfigurationNode getConfigurationNodeValue()
-    throws ScriptException
-  {
-    return configurationNode;
-  }
-
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  @Override
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException
-  {
-    // We recognize the __size__ attribute
-    if (attributeName.equals(ATTRIBUTE_SIZE))
-      return new VariableInt(configurationNode.getChildCount());
-    // Also, the __type__ attribute
-    if (attributeName.equals(ATTRIBUTE_TYPE))
-      return new VariableString(configurationNode.getType());
-    // And the __value__ attribute
-    if (attributeName.equals(ATTRIBUTE_VALUE))
-      return new ValueReference();
-    if (attributeName.equals(ATTRIBUTE_DICT))
-    {
-      VariableDict dict = new VariableDict();
-      int i = 0;
-      while (i < configurationNode.getChildCount())
-      {
-        ConfigurationNode child = configurationNode.findChild(i++);
-        String type = child.getType();
-        dict.getIndexed(new VariableString(type)).setReference(new VariableConfigurationNode(child));
-      }
-      return dict;
-    }
-    if (attributeName.equals(ATTRIBUTE_SCRIPT) ||
-      attributeName.equals(ATTRIBUTE_STRING) ||
-      attributeName.equals(ATTRIBUTE_INT) ||
-      attributeName.equals(ATTRIBUTE_FLOAT) || 
-      attributeName.equals(ATTRIBUTE_BOOLEAN))
-      return super.getAttribute(attributeName);
-    // All others are presumed to be attributes of the configuration node, which can be set or cleared.
-    return new AttributeReference(attributeName);
-  }
-  
-  /** Get an indexed property of the variable */
-  @Override
-  public VariableReference getIndexed(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Subscript cannot be null"));
-    int indexValue = index.getIntValue();
-    if (indexValue >= 0 && indexValue < configurationNode.getChildCount())
-      return new NodeReference(indexValue);
-    throw new ScriptException(composeMessage("Subscript is out of bounds: "+indexValue));
-  }
-
-  /** Insert an object into this variable at a position. */
-  @Override
-  public void insertAt(Variable v, Variable index)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Can't insert a null object"));
-    if (index == null)
-      configurationNode.addChild(configurationNode.getChildCount(),v.getConfigurationNodeValue());
-    else
-    {
-      int indexValue = index.getIntValue();
-      if (indexValue < 0 || indexValue > configurationNode.getChildCount())
-        throw new ScriptException(composeMessage("Insert out of bounds: "+indexValue));
-      configurationNode.addChild(indexValue,v.getConfigurationNodeValue());
-    }
-  }
-
-  /** Delete an object from this variable at a position. */
-  @Override
-  public void removeAt(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Remove index cannot be null"));
-    int indexValue = index.getIntValue();
-    if (indexValue < 0 || indexValue >= configurationNode.getChildCount())
-      throw new ScriptException(composeMessage("Remove index out of bounds: "+indexValue));
-    configurationNode.removeChild(indexValue);
-  }
-
-
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Can't add a null object"));
-    ConfigurationNode node = v.getConfigurationNodeValue();
-    ConfigurationNode cn = new ConfigurationNode(configurationNode.getType());
-    cn.setValue(configurationNode.getValue());
-    Iterator<String> attIter = configurationNode.getAttributes();
-    while (attIter.hasNext())
-    {
-      String attrName = attIter.next();
-      String attrValue = configurationNode.getAttributeValue(attrName);
-      cn.setAttribute(attrName,attrValue);
-    }
-    int i = 0;
-    while (i < configurationNode.getChildCount())
-    {
-      ConfigurationNode child = configurationNode.findChild(i++);
-      cn.addChild(cn.getChildCount(),child);
-    }
-    cn.addChild(cn.getChildCount(),node);
-    return new VariableConfigurationNode(cn);
-  }
-
-  /** Implement VariableReference to allow values to be set or cleared */
-  protected class ValueReference implements VariableReference
-  {
-    public ValueReference()
-    {
-    }
-    
-    @Override
-    public void setReference(Variable v)
-      throws ScriptException
-    {
-      if (v == null)
-        configurationNode.setValue(null);
-      else
-      {
-        String value = v.getStringValue();
-        configurationNode.setValue(value);
-      }
-    }
-    
-    @Override
-    public Variable resolve()
-      throws ScriptException
-    {
-      String value = configurationNode.getValue();
-      if (value == null)
-        value = "";
-      return new VariableString(value);
-    }
-    
-    @Override
-    public boolean isNull()
-    {
-      return false;
-    }
-  }
-  
-  /** Implement VariableReference to allow attributes to be set or cleared */
-  protected class AttributeReference implements VariableReference
-  {
-    protected String attributeName;
-    
-    public AttributeReference(String attributeName)
-    {
-      this.attributeName = attributeName;
-    }
-    
-    @Override
-    public void setReference(Variable v)
-      throws ScriptException
-    {
-      if (v == null)
-        configurationNode.setAttribute(attributeName,null);
-      else
-      {
-        String value = v.getStringValue();
-        configurationNode.setAttribute(attributeName,value);
-      }
-    }
-
-    @Override
-    public Variable resolve()
-      throws ScriptException
-    {
-      String attrValue = configurationNode.getAttributeValue(attributeName);
-      if (attrValue == null)
-        throw new ScriptException(composeMessage("No attribute named '"+attributeName+"'"));
-      return new VariableString(attrValue);
-    }
-
-    @Override
-    public boolean isNull()
-    {
-      return (configurationNode.getAttributeValue(attributeName) == null);
-    }
-  }
-  
-  /** Extend VariableReference class so we capture attempts to set the reference, and actually overwrite the child when that is done */
-  protected class NodeReference implements VariableReference
-  {
-    protected int index;
-    
-    public NodeReference(int index)
-    {
-      this.index = index;
-    }
-    
-    @Override
-    public void setReference(Variable v)
-      throws ScriptException
-    {
-      if (index < 0 || index >= configurationNode.getChildCount())
-        throw new ScriptException(composeMessage("Index out of range: "+index));
-      ConfigurationNode confNode = v.getConfigurationNodeValue();
-      configurationNode.removeChild(index);
-      configurationNode.addChild(index,confNode);
-    }
-
-    @Override
-    public Variable resolve()
-      throws ScriptException
-    {
-      if (index < 0 || index >= configurationNode.getChildCount())
-        throw new ScriptException(composeMessage("Index out of range: "+index));
-      return new VariableConfigurationNode(configurationNode.findChild(index));
-    }
-
-    /** Check if this reference is null */
-    @Override
-    public boolean isNull()
-    {
-      return index < 0 || index >= configurationNode.getChildCount();
-    }
-
-  }
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConnectionName.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConnectionName.java
deleted file mode 100644
index 5329dc6..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableConnectionName.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-/** Variable class representing a ManifoldCF API URL connection name segment.  In conjunction
-* with the URL variable, this variable will properly character-stuff the connection name to make
-* a valid URL.
-*/
-public class VariableConnectionName extends VariableBase
-{
-  protected String encodedConnectionName;
-  protected String connectionName;
-  
-  public VariableConnectionName(String connectionName)
-  {
-    this.connectionName = connectionName;
-    this.encodedConnectionName = encode(connectionName);
-  }
-
-  @Override
-  public int hashCode()
-  {
-    return connectionName.hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableConnectionName))
-      return false;
-    return ((VariableConnectionName)o).connectionName.equals(connectionName);
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("(new connectionname \"");
-    int i = 0;
-    while (i < connectionName.length())
-    {
-      char x = connectionName.charAt(i++);
-      if (x == '\\' || x == '\"')
-        sb.append('\\');
-      sb.append(x);
-    }
-    sb.append("\")");
-    return sb.toString();
-  }
-  
-  /** Check if the variable has a URL path value */
-  @Override
-  public boolean hasURLPathValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's value as a URL path component */
-  @Override
-  public String getURLPathValue()
-    throws ScriptException
-  {
-      return URLEncoder.encode(encodedConnectionName).replace("+","%20");
-  }
-
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    return encodedConnectionName;
-  }
-
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(encodedConnectionName.equals(v.getStringValue()));
-  }
-
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(!encodedConnectionName.equals(v.getStringValue()));
-  }
-
-  protected static String encode(String connectionName)
-  {
-    StringBuilder sb = new StringBuilder();
-    int i = 0;
-    while (i < connectionName.length())
-    {
-      char x = connectionName.charAt(i++);
-      if (x == '/')
-        sb.append('.').append('+');
-      else if (x == '.')
-        sb.append('.').append('.');
-      else
-        sb.append(x);
-    }
-    return sb.toString();
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableDict.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableDict.java
deleted file mode 100644
index 27a99e5..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableDict.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import java.util.*;
-
-/** Array variable object.
-*/
-public class VariableDict extends VariableBase
-{
-  protected Map<Variable,VariableReference> dict = new HashMap<Variable,VariableReference>();
-  
-  public VariableDict()
-  {
-  }
-  
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  @Override
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException
-  {
-    // We recognize only the __size__ attribute
-    if (attributeName.equals(ATTRIBUTE_SIZE))
-      return new VariableInt(dict.size());
-    return super.getAttribute(attributeName);
-  }
-  
-  /** Get an indexed property of the variable */
-  @Override
-  public VariableReference getIndexed(Variable index)
-    throws ScriptException
-  {
-    if (index == null)
-      throw new ScriptException(composeMessage("Subscript cannot be null"));
-    VariableReference rval = dict.get(index);
-    if (rval == null)
-    {
-      rval = new ContextVariableReference();
-      dict.put(index,rval);
-    }
-    return rval;
-  }
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableFloat.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableFloat.java
deleted file mode 100644
index 0167feb..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableFloat.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Variable class representing an integer.
-*/
-public class VariableFloat extends VariableBase
-{
-  protected double value;
-  
-  public VariableFloat(double value)
-  {
-    this.value = value;
-  }
-  
-  @Override
-  public int hashCode()
-  {
-    return new Double(value).hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableFloat))
-      return false;
-    return ((VariableFloat)o).value == value;
-  }
-
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has an int value */
-  @Override
-  public boolean hasIntValue()
-    throws ScriptException
-  {
-    return true;
-  }
-  
-  /** Check if the variable has a double value */
-  @Override
-  public boolean hasDoubleValue()
-    throws ScriptException
-  {
-    return true;
-  }
-    
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    return new Double(value).toString();
-  }
-  
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    return new Double(value).toString();
-  }
-
-  /** Get the variable's value as an integer */
-  @Override
-  public int getIntValue()
-    throws ScriptException
-  {
-    return (int)value;
-  }
-  
-  /** Get the variable's value as a double */
-  @Override
-  public double getDoubleValue()
-    throws ScriptException
-  {
-    return value;
-  }
-
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '+' operand cannot be null"));
-    return new VariableFloat(value + v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference minus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '-' operand cannot be null"));
-    return new VariableFloat(value - v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference asterisk(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '*' operand cannot be null"));
-    return new VariableFloat(value * v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference slash(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '/' operand cannot be null"));
-    return new VariableFloat(value / v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference unaryMinus()
-    throws ScriptException
-  {
-    return new VariableFloat(-value);
-  }
-  
-  @Override
-  public VariableReference greaterAngle(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '>' operand cannot be null"));
-    return new VariableBoolean(value > v.getDoubleValue());
-  }
-  
-  @Override
-  public VariableReference lesserAngle(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '<' operand cannot be null"));
-    return new VariableBoolean(value < v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(value == v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference greaterAngleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '>=' operand cannot be null"));
-    return new VariableBoolean(value >= v.getDoubleValue());
-  }
-    
-  @Override
-  public VariableReference lesserAngleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '<=' operand cannot be null"));
-    return new VariableBoolean(value <= v.getDoubleValue());
-  }
-  
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(value != v.getDoubleValue());
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableInt.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableInt.java
deleted file mode 100644
index 3cc937d..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableInt.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Variable class representing an integer.
-*/
-public class VariableInt extends VariableBase
-{
-  protected int value;
-  
-  public VariableInt(int value)
-  {
-    this.value = value;
-  }
-
-  @Override
-  public int hashCode()
-  {
-    return new Integer(value).hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableInt))
-      return false;
-    return ((VariableInt)o).value == value;
-  }
-  
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has an int value */
-  @Override
-  public boolean hasIntValue()
-    throws ScriptException
-  {
-    return true;
-  }
-  
-  /** Check if the variable has a double value */
-  @Override
-  public boolean hasDoubleValue()
-    throws ScriptException
-  {
-    return true;
-  }
-    
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    return Integer.toString(value);
-  }
-
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    return Integer.toString(value);
-  }
-
-  /** Get the variable's value as an integer */
-  @Override
-  public int getIntValue()
-    throws ScriptException
-  {
-    return value;
-  }
-  
-  /** Get the variable's value as a double */
-  @Override
-  public double getDoubleValue()
-    throws ScriptException
-  {
-    return (double)value;
-  }
-
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '+' operand cannot be null"));
-    return new VariableInt(value + v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference minus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '-' operand cannot be null"));
-    return new VariableInt(value - v.getIntValue());
-  }
-
-  
-  @Override
-  public VariableReference asterisk(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '*' operand cannot be null"));
-    return new VariableInt(value * v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference slash(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '/' operand cannot be null"));
-    return new VariableInt(value / v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference unaryMinus()
-    throws ScriptException
-  {
-    return new VariableInt(-value);
-  }
-  
-  @Override
-  public VariableReference greaterAngle(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '>' operand cannot be null"));
-    return new VariableBoolean(value > v.getIntValue());
-  }
-  
-  @Override
-  public VariableReference lesserAngle(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '<' operand cannot be null"));
-    return new VariableBoolean(value < v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(value == v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference greaterAngleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '>=' operand cannot be null"));
-    return new VariableBoolean(value >= v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference lesserAngleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '<=' operand cannot be null"));
-    return new VariableBoolean(value <= v.getIntValue());
-  }
-  
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(value != v.getIntValue());
-  }
-  
-  @Override
-  public VariableReference ampersand(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '&' operand cannot be null"));
-    return new VariableInt(value & v.getIntValue());
-  }
-    
-  @Override
-  public VariableReference pipe(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '|' operand cannot be null"));
-    return new VariableInt(value | v.getIntValue());
-  }
-
-  @Override
-  public VariableReference unaryExclamation()
-    throws ScriptException
-  {
-    return new VariableInt(value ^ value);
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableQueryArg.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableQueryArg.java
deleted file mode 100644
index f2a3407..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableQueryArg.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-/** Variable class representing a ManifoldCF query argument, with a name
-* and a value.
-*/
-public class VariableQueryArg extends VariableBase
-{
-  protected final String name;
-  protected final String value;
-  
-  public VariableQueryArg(String name, String value)
-  {
-    if (value == null)
-      value = "";
-    this.name = name;
-    this.value = value;
-  }
-  
-  @Override
-  public int hashCode()
-  {
-    return name.hashCode() + value.hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableQueryArg))
-      return false;
-    VariableQueryArg other = (VariableQueryArg)o;
-    return other.name.equals(name) && other.value.equals(value);
-  }
-
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a query arg value */
-  @Override
-  public boolean hasQueryArgumentValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("new queryarg ").append(escapeValue(name)).append("=").append(escapeValue(value));
-    return sb.toString();
-  }
-  
-  protected static String escapeValue(String input)
-  {
-    StringBuilder sb = new StringBuilder("\"");
-    int i = 0;
-    while (i < input.length())
-    {
-      char x = input.charAt(i++);
-      if (x == '\\' || x == '\"')
-        sb.append('\\');
-      sb.append(x);
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-  
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-      return URLEncoder.encode(name).replace("+","%20") + "=" +
-        URLEncoder.encode(value).replace("+","%20");
-  }
-
-  @Override
-  public String getQueryArgumentValue()
-    throws ScriptException
-  {
-    return getStringValue();
-  }
-  
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(getStringValue().equals(v.getStringValue()));
-  }
-
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(!getStringValue().equals(v.getStringValue()));
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableReference.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableReference.java
deleted file mode 100644
index 2ad61a6..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableReference.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** This interface represents a mutable reference to a variable.
-* It exists as a separate entity so that the reference to the underlying
-* variable can be easily modified.  The reference can, of course, be null.
-*/
-public interface VariableReference
-{
-  /** Set the reference */
-  public void setReference(Variable object)
-    throws ScriptException;
-  
-  /** Resolve the reference */
-  public Variable resolve()
-    throws ScriptException;
-  
-  /** Check if this reference is null */
-  public boolean isNull();
-  
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableResult.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableResult.java
deleted file mode 100644
index e99c403..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableResult.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Variable class representing the result of an http operation.
-* This consists of two parts: a result code, and a VariableConfiguration object.
-*/
-public class VariableResult extends VariableBase
-{
-  protected int resultCode;
-  protected VariableConfiguration result;
-  
-  public VariableResult(int resultCode, String json)
-    throws ScriptException
-  {
-    this.resultCode = resultCode;
-    this.result = new VariableConfiguration(json);
-  }
-  
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has an int value */
-  @Override
-  public boolean hasIntValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    return "("+Integer.toString(resultCode)+") "+result.getScriptValue();
-  }
-
-  /** Get the variable's value as an integer */
-  @Override
-  public int getIntValue()
-    throws ScriptException
-  {
-    return resultCode;
-  }
-  
-  /** Get a named attribute of the variable; e.g. xxx.yyy */
-  @Override
-  public VariableReference getAttribute(String attributeName)
-    throws ScriptException
-  {
-    if (attributeName.equals(ATTRIBUTE_OKSTATUS))
-      return new VariableBoolean(resultCode == 200);
-    else if (attributeName.equals(ATTRIBUTE_CREATEDSTATUS))
-      return new VariableBoolean(resultCode == 201);
-    else if (attributeName.equals(ATTRIBUTE_NOTFOUNDSTATUS))
-      return new VariableBoolean(resultCode == 404);
-    else if (attributeName.equals(ATTRIBUTE_UNAUTHORIZEDSTATUS))
-      return new VariableBoolean(resultCode == 401);
-    else if (attributeName.equals(ATTRIBUTE_VALUE))
-      return result;
-    else
-      return super.getAttribute(attributeName);
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableString.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableString.java
deleted file mode 100644
index 20ba276..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableString.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import org.apache.manifoldcf.core.util.URLEncoder;
-
-/** Variable class representing an integer.
-*/
-public class VariableString extends VariableBase
-{
-  protected String value;
-
-  public VariableString(String value)
-  {
-    this.value = value;
-  }
-
-  @Override
-  public int hashCode()
-  {
-    return value.hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableString))
-      return false;
-    return ((VariableString)o).value.equals(value);
-  }
-
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has an int value */
-  @Override
-  public boolean hasIntValue()
-    throws ScriptException
-  {
-    return true;
-  }
-  
-  /** Check if the variable has a double value */
-  @Override
-  public boolean hasDoubleValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a URL path value */
-  @Override
-  public boolean hasURLPathValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's value as a URL path component */
-  @Override
-  public String getURLPathValue()
-    throws ScriptException
-  {
-      return URLEncoder.encode(value).replace("+","%20");
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("\"");
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '\"')
-        sb.append('\\');
-      sb.append(x);
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    return value;
-  }
-
-  /** Get the variable's value as an integer */
-  @Override
-  public int getIntValue()
-    throws ScriptException
-  {
-    try
-    {
-      return Integer.parseInt(value);
-    }
-    catch (NumberFormatException e)
-    {
-      throw new ScriptException(e.getMessage(),e);
-    }
-  }
-  
-  /** Get the variable's value as a double */
-  @Override
-  public double getDoubleValue()
-    throws ScriptException
-  {
-    return new Double(value).doubleValue();
-  }
-
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '+' operand cannot be null"));
-    return new VariableString(value + v.getStringValue());
-  }
-  
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(value.equals(v.getStringValue()));
-  }
-
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(!value.equals(v.getStringValue()));
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableURL.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableURL.java
deleted file mode 100644
index 28bb2a1..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/VariableURL.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-import java.net.*;
-import java.io.*;
-
-/** Variable class representing a ManifoldCF API URL.  As the URL is glued together, the
-* individual path pieces are appropriately encoded.
-*/
-public class VariableURL extends VariableBase
-{
-  protected String encodedURL;
-  protected String encodedArgs;
-  
-  public VariableURL(String baseURLValue)
-  {
-    this(baseURLValue,null);
-  }
-  
-  public VariableURL(String baseURLValue, String encodedArgsValue)
-  {
-    this.encodedURL = baseURLValue;
-    if (encodedURL.endsWith("/"))
-      this.encodedURL = this.encodedURL.substring(0,this.encodedURL.length()-1);
-    this.encodedArgs = encodedArgsValue;
-  }
-  
-  @Override
-  public int hashCode()
-  {
-    return encodedURL.hashCode() + encodedArgs.hashCode();
-  }
-  
-  @Override
-  public boolean equals(Object o)
-  {
-    if (!(o instanceof VariableURL))
-      return false;
-    VariableURL other = (VariableURL)o;
-    if (!other.encodedURL.equals(encodedURL))
-      return false;
-    if (other.encodedArgs != null || encodedArgs != null)
-    {
-      if (other.encodedArgs == encodedArgs)
-        return true;
-      if (other.encodedArgs == null || encodedArgs == null)
-        return false;
-      return other.encodedArgs.equals(encodedArgs);
-    }
-    return true;
-  }
-
-  /** Check if the variable has a string value */
-  @Override
-  public boolean hasStringValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Check if the variable has a script value */
-  @Override
-  public boolean hasScriptValue()
-    throws ScriptException
-  {
-    return true;
-  }
-
-  /** Get the variable's script value */
-  @Override
-  public String getScriptValue()
-    throws ScriptException
-  {
-    StringBuilder sb = new StringBuilder();
-    String value = getStringValue();
-    sb.append("\"");
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\\' || x == '\"')
-        sb.append('\\');
-      sb.append(x);
-    }
-    sb.append("\"");
-    return sb.toString();
-  }
-  
-  /** Get the variable's value as a string */
-  @Override
-  public String getStringValue()
-    throws ScriptException
-  {
-    if (encodedArgs != null)
-      return encodedURL + "?" + encodedArgs;
-    else
-      return encodedURL;
-  }
-
-  @Override
-  public VariableReference plus(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '+' operand cannot be null"));
-    String urlSide = encodedURL;
-    if (v.hasURLPathValue())
-      urlSide += "/" + v.getURLPathValue();
-    String argSide = encodedArgs;
-    if (v.hasQueryArgumentValue())
-    {
-      if (argSide == null)
-        argSide = v.getQueryArgumentValue();
-      else
-        argSide += "&" + v.getQueryArgumentValue();
-    }
-    return new VariableURL(urlSide,argSide);
-  }
-  
-  @Override
-  public VariableReference doubleEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '==' operand cannot be null"));
-    return new VariableBoolean(getStringValue().equals(v.getStringValue()));
-  }
-
-  @Override
-  public VariableReference exclamationEquals(Variable v)
-    throws ScriptException
-  {
-    if (v == null)
-      throw new ScriptException(composeMessage("Binary '!=' operand cannot be null"));
-    return new VariableBoolean(!getStringValue().equals(v.getStringValue()));
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WaitCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WaitCommand.java
deleted file mode 100644
index 96c9df3..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WaitCommand.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** Wait command. */
-public class WaitCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    VariableReference vr = sp.evaluateExpression(currentStream);
-    if (vr == null)
-      sp.syntaxError(currentStream,"Missing expression in wait command");
-    Variable v = sp.resolveMustExist(currentStream,vr);
-    int waitTime = v.getIntValue();
-    try
-    {
-      Thread.sleep((long)waitTime);
-      return false;
-    }
-    catch (InterruptedException e)
-    {
-      throw new ScriptException("Interrupted: "+e.getMessage(),e);
-    }
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing expression in wait command");
-  }
-
-}
diff --git a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WhileCommand.java b/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WhileCommand.java
deleted file mode 100644
index 07e4370..0000000
--- a/framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/WhileCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine;
-
-/** While command. */
-public class WhileCommand implements Command
-{
-  /** Parse and execute.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  *@return true to send a break signal, false otherwise.
-  */
-  public boolean parseAndExecute(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    RewindableTokenStream rts = new RewindableTokenStream(currentStream);
-    boolean breakFromLoop = false;
-    while (true)
-    {
-      rts.reset();
-      if (breakFromLoop)
-      {
-        sp.skipStatements(rts);
-        break;
-      }
-      VariableReference whileCondition = sp.evaluateExpression(rts);
-      if (whileCondition == null)
-        sp.syntaxError(rts,"Missing while expression");
-      Token t = rts.peek();
-      if (t == null || t.getToken() == null || !t.getToken().equals("do"))
-        sp.syntaxError(rts,"Missing 'do' in while statement");
-      rts.skip();
-      if (sp.resolveMustExist(rts,whileCondition).getBooleanValue())
-      {
-        breakFromLoop = sp.parseStatements(rts);
-      }
-      else
-      {
-        sp.skipStatements(rts);
-        break;
-      }
-    }
-    return false;
-  }
-  
-  /** Parse and skip.  Parsing begins right after the command name, and should stop before the trailing semicolon.
-  *@param sp is the script parser to use to help in the parsing.
-  *@param currentStream is the current token stream.
-  */
-  public void parseAndSkip(ScriptParser sp, TokenStream currentStream)
-    throws ScriptException
-  {
-    if (sp.skipExpression(currentStream) == false)
-      sp.syntaxError(currentStream,"Missing while expression");
-    Token t = currentStream.peek();
-    if (t == null || t.getToken() == null || !t.getToken().equals("do"))
-      sp.syntaxError(currentStream,"Missing 'do' in if statement");
-    currentStream.skip();
-    sp.skipStatements(currentStream);
-  }
-
-}
diff --git a/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/CommandTest.java b/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/CommandTest.java
deleted file mode 100644
index 73363a1..0000000
--- a/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/CommandTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine.tests;
-
-import org.apache.manifoldcf.scriptengine.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class CommandTest extends ScriptEngineBase
-{
-  @Test
-  public void setCommand()
-    throws Exception
-  {
-    VariableReference vr;
-    assertEquals(false,executeStatements("set x = 1;"));
-    vr = evaluateExpression("x");
-    assertNotNull(vr);
-    assertEquals(1,vr.resolve().getIntValue());
-  }
-
-  @Test
-  public void ifCommand()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    assertEquals(false,executeStatements("if 1==1 then set y = 1; else set y = 2; ;"));
-    vr = evaluateExpression("y");
-    assertNotNull(vr);
-    assertEquals(1,vr.resolve().getIntValue());
-
-    assertEquals(false,executeStatements("if 1==0 then set y = 1; else set y = 2; ;"));
-    vr = evaluateExpression("y");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-
-  }
-
-  @Test
-  public void whileCommand()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    assertEquals(false,executeStatements("set counter = 10; while counter > 0 do set counter = counter - 1; ;"));
-
-    vr = evaluateExpression("counter");
-    assertNotNull(vr);
-    assertEquals(0,vr.resolve().getIntValue());
-
-    assertEquals(false,executeStatements("set flag = null; while ! isnull foo do set flag = 1; ;"));
-
-    vr = evaluateExpression("flag");
-    assertNotNull(vr);
-    assertNull(vr.resolve());
-  }
-
-  @Test
-  public void breakCommand()
-    throws Exception
-  {
-    VariableReference vr;
-
-    assertEquals(true,executeStatements("set x = null; break; set x = 1;"));
-    
-    vr = evaluateExpression("x");
-    assertNotNull(vr);
-    assertNull(vr.resolve());
-  }
-
-  @Test
-  public void waitCommand()
-    throws Exception
-  {
-    long now = System.currentTimeMillis();
-    assertEquals(false,executeStatements("wait 1000;"));
-    assertEquals(true,(now + 1000L) <= System.currentTimeMillis());
-  }
-
-  @Test
-  public void errorCommand()
-    throws Exception
-  {
-    boolean sawException = false;
-    try
-    {
-      executeStatements("error '123456';");
-    }
-    catch (ScriptException e)
-    {
-      if (e.getMessage().indexOf("123456") != -1)
-        sawException = true;
-      else
-        throw e;
-    }
-    assertEquals(true,sawException);
-  }
-
-  @Test
-  public void printCommand()
-    throws Exception
-  {
-    assertEquals(false,executeStatements("print 'hello';"));
-  }
-  
-  // MHL for GET, PUT, DELETE and POST commands, which need a jetty instance to work against.
-  
-}
\ No newline at end of file
diff --git a/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/ExpressionTest.java b/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/ExpressionTest.java
deleted file mode 100644
index 0695915..0000000
--- a/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/ExpressionTest.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine.tests;
-
-import org.apache.manifoldcf.scriptengine.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
-public class ExpressionTest extends ScriptEngineBase
-{
-
-  @Test
-  public void basicIntOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Binary +
-    vr = evaluateExpression("1+2");
-    assertNotNull(vr);
-    assertEquals(3,vr.resolve().getIntValue());
-    
-    // Binary -
-    vr = evaluateExpression("1-2");
-    assertNotNull(vr);
-    assertEquals(-1,vr.resolve().getIntValue());
-
-    // Binary *
-    vr = evaluateExpression("2*3");
-    assertNotNull(vr);
-    assertEquals(6,vr.resolve().getIntValue());
-
-    // Binary /
-    vr = evaluateExpression("3/2");
-    assertNotNull(vr);
-    assertEquals(1,vr.resolve().getIntValue());
-
-    // Unary -
-    vr = evaluateExpression("-2");
-    assertNotNull(vr);
-    assertEquals(-2,vr.resolve().getIntValue());
-
-    // Binary &
-    vr = evaluateExpression("1&5");
-    assertNotNull(vr);
-    assertEquals(1,vr.resolve().getIntValue());
-
-    // Binary |
-    vr = evaluateExpression("1|2");
-    assertNotNull(vr);
-    assertEquals(3,vr.resolve().getIntValue());
-
-    // Unary !
-    vr = evaluateExpression("!2");
-    assertNotNull(vr);
-    assertEquals(2^2,vr.resolve().getIntValue());
-
-    // >
-    vr = evaluateExpression("1>1");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("2>1");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // >=
-    vr = evaluateExpression("0>=1");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1>=1");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // <
-    vr = evaluateExpression("2<2");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1<2");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // <=
-    vr = evaluateExpression("2<=1");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1<=1");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // ==
-    vr = evaluateExpression("1==2");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1==1");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // !=
-    vr = evaluateExpression("1!=1");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1!=2");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Attributes
-    vr = evaluateExpression("2 .__int__");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-    vr = evaluateExpression("2 .__string__");
-    assertNotNull(vr);
-    assertEquals("2",vr.resolve().getStringValue());
-    vr = evaluateExpression("2 .__float__");
-    assertNotNull(vr);
-    assertEquals(2.0,vr.resolve().getDoubleValue(),0.0);
-    vr = evaluateExpression("2 .__script__");
-    assertNotNull(vr);
-    assertEquals("2",vr.resolve().getStringValue());
-
-    // Various values
-    assertEquals(2,new VariableInt(2).getIntValue());
-    assertEquals("2",new VariableInt(2).getStringValue());
-    assertEquals(2.0,new VariableInt(2).getDoubleValue(),0.0);
-
-  }
-
-  @Test
-  public void basicFloatOperations()
-    throws Exception
-  {
-    VariableReference vr;
-
-    // Binary +
-    vr = evaluateExpression("1.0+2.0");
-    assertNotNull(vr);
-    assertEquals(3.0,vr.resolve().getDoubleValue(),0.0);
-    
-    // Binary -
-    vr = evaluateExpression("1.0-2.0");
-    assertNotNull(vr);
-    assertEquals(-1.0,vr.resolve().getDoubleValue(),0.0);
-
-    // Binary *
-    vr = evaluateExpression("2.0*3.0");
-    assertNotNull(vr);
-    assertEquals(6.0,vr.resolve().getDoubleValue(),0.0);
-
-    // Binary /
-    vr = evaluateExpression("3.0/2.0");
-    assertNotNull(vr);
-    assertEquals(1.5,vr.resolve().getDoubleValue(),0.0);
-
-    // Unary -
-    vr = evaluateExpression("-2.0");
-    assertNotNull(vr);
-    assertEquals(-2.0,vr.resolve().getDoubleValue(),0.0);
-
-    // >
-    vr = evaluateExpression("1.0>1.0");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("2.0>1.0");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // >=
-    vr = evaluateExpression("0.0>=1.0");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1.0>=1.0");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // <
-    vr = evaluateExpression("2.0<2.0");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1.0<2.0");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // <=
-    vr = evaluateExpression("2.0<=1.0");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1.0<=1.0");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // ==
-    vr = evaluateExpression("1.0==2.0");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1.0==1.0");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // !=
-    vr = evaluateExpression("1.0!=1.0");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("1.0!=2.0");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Attributes
-    vr = evaluateExpression("2.0 .__int__");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-    vr = evaluateExpression("2.0 .__string__");
-    assertNotNull(vr);
-    assertEquals("2.0",vr.resolve().getStringValue());
-    vr = evaluateExpression("2.0 .__float__");
-    assertNotNull(vr);
-    assertEquals(2.0,vr.resolve().getDoubleValue(),0.0);
-    vr = evaluateExpression("2.0 .__script__");
-    assertNotNull(vr);
-    assertEquals("2.0",vr.resolve().getStringValue());
-
-    // Various values
-    assertEquals(2,new VariableFloat(2.0).getIntValue());
-    assertEquals("2.0",new VariableFloat(2.0).getStringValue());
-    assertEquals(2.0,new VariableFloat(2.0).getDoubleValue(),0.0);
-
-  }
-
-  @Test
-  public void basicBooleanOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Binary &
-    vr = evaluateExpression("true&false");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-
-    // Binary |
-    vr = evaluateExpression("true|false");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Binary &&
-    vr = evaluateExpression("true&&false");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-
-    // Binary ||
-    vr = evaluateExpression("true||false");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Unary !
-    vr = evaluateExpression("!true");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-
-    // ==
-    vr = evaluateExpression("true==false");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("true==true");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // !=
-    vr = evaluateExpression("true!=true");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("true!=false");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Attributes
-    vr = evaluateExpression("true .__script__");
-    assertNotNull(vr);
-    assertEquals("true",vr.resolve().getStringValue());
-
-  }
-
-  @Test
-  public void basicStringOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Binary +
-    vr = evaluateExpression("'1'+'2'");
-    assertNotNull(vr);
-    assertEquals("12",vr.resolve().getStringValue());
-    
-    // ==
-    vr = evaluateExpression("'1'=='2'");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("'1'=='1'");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // !=
-    vr = evaluateExpression("'1'!='1'");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("'1'!='2'");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Attributes
-    vr = evaluateExpression("'2'.__int__");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-    vr = evaluateExpression("'2'.__string__");
-    assertNotNull(vr);
-    assertEquals("2",vr.resolve().getStringValue());
-    vr = evaluateExpression("'2'.__float__");
-    assertNotNull(vr);
-    assertEquals(2.0,vr.resolve().getDoubleValue(),0.0);
-    vr = evaluateExpression("'2'.__script__");
-    assertNotNull(vr);
-    assertEquals("\"2\"",vr.resolve().getStringValue());
-
-    // Various values
-    assertEquals(2,new VariableString("2").getIntValue());
-    assertEquals("2",new VariableString("2").getStringValue());
-    assertEquals(2.0,new VariableString("2").getDoubleValue(),0.0);
-
-  }
-
-  @Test
-  public void basicURLOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Binary +
-    vr = evaluateExpression("(new url 'http://localhost:8345/mcf-api-service/json') + 'jobs' + '123'");
-    assertNotNull(vr);
-    assertEquals("http://localhost:8345/mcf-api-service/json/jobs/123",vr.resolve().getStringValue());
-    
-    // ==
-    vr = evaluateExpression("(new url 'hello')==(new url 'there')");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("(new url 'hello')==(new url 'hello')");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // !=
-    vr = evaluateExpression("(new url 'hello')!=(new url 'hello')");
-    assertNotNull(vr);
-    assertEquals(false,vr.resolve().getBooleanValue());
-    vr = evaluateExpression("(new url 'hello')!=(new url 'there')");
-    assertNotNull(vr);
-    assertEquals(true,vr.resolve().getBooleanValue());
-
-    // Attributes
-    vr = evaluateExpression("((new url 'abc') + 'def ghi').__string__");
-    assertNotNull(vr);
-    assertEquals("abc/def%20ghi",vr.resolve().getStringValue());
-    vr = evaluateExpression("(new url 'abc').__script__");
-    assertNotNull(vr);
-    assertEquals("\"abc\"",vr.resolve().getStringValue());
-
-    // Various values
-    assertEquals("abc",new VariableURL("abc").getStringValue());
-
-    // Connectionname objecfs
-    vr = evaluateExpression("((new url 'hello') + (new connectionname 'there/guys.')).__string__");
-    assertNotNull(vr);
-    assertEquals("hello/there.%2Bguys..",vr.resolve().getStringValue());
-
-  }
-
-  @Test
-  public void basicArrayOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // initializer and subscript
-    assertEquals(false,executeStatements("set x = [1,'2',3];")); 
-
-    vr = evaluateExpression("x[2]");
-    assertNotNull(vr);
-    assertEquals(3,vr.resolve().getIntValue());
-
-    // Attributes
-    vr = evaluateExpression("x.__script__");
-    assertNotNull(vr);
-    assertEquals("[ 1, \"2\", 3 ]",vr.resolve().getStringValue());
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(3,vr.resolve().getIntValue());
-
-    // Do inserts
-    assertEquals(false,executeStatements("insert 'tail' into x;"));
-    vr = evaluateExpression("x[3]");
-    assertNotNull(vr);
-    assertEquals("tail",vr.resolve().getStringValue());
-    assertEquals(false,executeStatements("insert 'head' into x at 0;"));
-    vr = evaluateExpression("x[1]");
-    assertNotNull(vr);
-    assertEquals(1,vr.resolve().getIntValue());
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(5,vr.resolve().getIntValue());
-    
-    // Do deletes
-    assertEquals(false,executeStatements("remove 1 from x;"));
-    vr = evaluateExpression("x[1]");
-    assertNotNull(vr);
-    assertEquals("2",vr.resolve().getStringValue());
-    vr = evaluateExpression("x[0]");
-    assertNotNull(vr);
-    assertEquals("head",vr.resolve().getStringValue());
-
-  }
-
-  @Test
-  public void basicDictOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Set up
-    assertEquals(false,executeStatements("set x = new dictionary; set x['a'] = 1; set x['b'] = 2;"));
-    vr = evaluateExpression("x['a']");
-    assertNotNull(vr);
-    assertEquals(1,vr.resolve().getIntValue());
-
-    // Attributes
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-
-  }
-
-  @Test
-  public void basicConfigurationnodeOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Set up
-    assertEquals(false,executeStatements("set x = << 'type' : 'value' : 'attr1' = 'av1', 'attr2' = 'av2' : << 'child1' : 'cv1' : : >>, << 'child2' : 'cv2' : : >> >>;")); 
-
-    // Subscripts
-    vr = evaluateExpression("x[0].__type__");
-    assertNotNull(vr);
-    assertEquals("child1",vr.resolve().getStringValue());
-    vr = evaluateExpression("x[0].__value__");
-    assertNotNull(vr);
-    assertEquals("cv1",vr.resolve().getStringValue());
-
-    // Size
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-    
-    // Dict
-    vr = evaluateExpression("x.__dict__['child1'].__value__");
-    assertNotNull(vr);
-    assertEquals("cv1",vr.resolve().getStringValue());
-
-    // User attributes
-    vr = evaluateExpression("x.attr1");
-    assertNotNull(vr);
-    assertEquals("av1",vr.resolve().getStringValue());
-    vr = evaluateExpression("x.attr2");
-    assertNotNull(vr);
-    assertEquals("av2",vr.resolve().getStringValue());
-
-    // Do inserts
-    assertEquals(false,executeStatements("insert << 'child3' : 'cv3' : : >> into x;"));
-    vr = evaluateExpression("x[2].__type__");
-    assertNotNull(vr);
-    assertEquals("child3",vr.resolve().getStringValue());
-    assertEquals(false,executeStatements("insert << 'childn1' : 'cvn1' : : >> into x at 0;"));
-    vr = evaluateExpression("x[1].__type__");
-    assertNotNull(vr);
-    assertEquals("child1",vr.resolve().getStringValue());
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(4,vr.resolve().getIntValue());
-    
-    // Do deletes
-    assertEquals(false,executeStatements("remove 1 from x;"));
-    vr = evaluateExpression("x[1].__type__");
-    assertNotNull(vr);
-    assertEquals("child2",vr.resolve().getStringValue());
-    vr = evaluateExpression("x[0].__type__");
-    assertNotNull(vr);
-    assertEquals("childn1",vr.resolve().getStringValue());
-
-    // Script value
-    vr = evaluateExpression("x.__script__");
-    assertNotNull(vr);
-    assertEquals("<< \"type\" : \"value\" : \"attr1\"=\"av1\", \"attr2\"=\"av2\" : << \"childn1\" : \"cvn1\" :  :  >>, << \"child2\" : \"cv2\" :  :  >>, << \"child3\" : \"cv3\" :  :  >> >>",vr.resolve().getStringValue());
-  }
-
-  @Test
-  public void basicConfigurationOperations()
-    throws Exception
-  {
-    VariableReference vr;
-    
-    // Set up
-    assertEquals(false,executeStatements("set x = {<< 'child1' : 'cv1' : : >>, << 'child2' : 'cv2' : : >>};")); 
-
-    // Subscripts
-    vr = evaluateExpression("x[0].__type__");
-    assertNotNull(vr);
-    assertEquals("child1",vr.resolve().getStringValue());
-    vr = evaluateExpression("x[0].__value__");
-    assertNotNull(vr);
-    assertEquals("cv1",vr.resolve().getStringValue());
-
-    // Size
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(2,vr.resolve().getIntValue());
-    
-    // Dict
-    vr = evaluateExpression("x.__dict__['child1'].__value__");
-    assertNotNull(vr);
-    assertEquals("cv1",vr.resolve().getStringValue());
-
-    // Do inserts
-    assertEquals(false,executeStatements("insert << 'child3' : 'cv3' : : >> into x;"));
-    vr = evaluateExpression("x[2].__type__");
-    assertNotNull(vr);
-    assertEquals("child3",vr.resolve().getStringValue());
-    assertEquals(false,executeStatements("insert << 'childn1' : 'cvn1' : : >> into x at 0;"));
-    vr = evaluateExpression("x[1].__type__");
-    assertNotNull(vr);
-    assertEquals("child1",vr.resolve().getStringValue());
-    vr = evaluateExpression("x.__size__");
-    assertNotNull(vr);
-    assertEquals(4,vr.resolve().getIntValue());
-    
-    // Do deletes
-    assertEquals(false,executeStatements("remove 1 from x;"));
-    vr = evaluateExpression("x[1].__type__");
-    assertNotNull(vr);
-    assertEquals("child2",vr.resolve().getStringValue());
-    vr = evaluateExpression("x[0].__type__");
-    assertNotNull(vr);
-    assertEquals("childn1",vr.resolve().getStringValue());
-
-    // Script value
-    vr = evaluateExpression("x.__script__");
-    assertNotNull(vr);
-    assertEquals("{ << \"childn1\" : \"cvn1\" :  :  >>, << \"child2\" : \"cv2\" :  :  >>, << \"child3\" : \"cv3\" :  :  >> }",vr.resolve().getStringValue());
-  }
-
-}
diff --git a/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/ScriptEngineBase.java b/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/ScriptEngineBase.java
deleted file mode 100644
index 8b99cc5..0000000
--- a/framework/script-engine/src/test/java/org/apache/manifoldcf/scriptengine/tests/ScriptEngineBase.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.scriptengine.tests;
-
-import org.apache.manifoldcf.scriptengine.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-import java.io.*;
-
-public class ScriptEngineBase
-{
-  protected ScriptParser scriptParser = new ScriptParser();
-  
-  @Before
-  public void initializeCommands()
-    throws Exception
-  {
-    scriptParser.addCommand("break",new BreakCommand());
-    scriptParser.addCommand("print",new PrintCommand());
-    scriptParser.addCommand("if",new IfCommand());
-    scriptParser.addCommand("while",new WhileCommand());
-    scriptParser.addCommand("set",new SetCommand());
-    scriptParser.addCommand("insert",new InsertCommand());
-    scriptParser.addCommand("remove",new RemoveCommand());
-    scriptParser.addCommand("error",new ErrorCommand());
-    scriptParser.addCommand("wait",new WaitCommand());
-    
-    scriptParser.addCommand("GET",new GETCommand());
-    scriptParser.addCommand("PUT",new PUTCommand());
-    scriptParser.addCommand("DELETE",new DELETECommand());
-    scriptParser.addCommand("POST", new POSTCommand());
-  }
-
-  @Before
-  public void initializeNewOperations()
-    throws Exception
-  {
-    scriptParser.addNewOperation("configuration",new NewConfiguration());
-    scriptParser.addNewOperation("configurationnode",new NewConfigurationNode());
-    scriptParser.addNewOperation("url",new NewURL());
-    scriptParser.addNewOperation("connectionname",new NewConnectionName());
-    scriptParser.addNewOperation("array",new NewArray());
-    scriptParser.addNewOperation("dictionary",new NewDictionary());
-  }
-  
-  protected VariableReference evaluateExpression(String expression)
-    throws Exception
-  {
-    Reader r = new StringReader(expression);
-    TokenStream ts = new BasicTokenStream(r);
-    return scriptParser.evaluateExpression(ts);
-  }
-  
-  protected boolean executeStatements(String statements)
-    throws Exception
-  {
-    Reader r = new StringReader(statements);
-    TokenStream ts = new BasicTokenStream(r);
-    return scriptParser.parseStatements(ts);
-  }
-
-}
diff --git a/framework/script-example/file-crawl-example.mcf b/framework/script-example/file-crawl-example.mcf
deleted file mode 100644
index be04981..0000000
--- a/framework/script-example/file-crawl-example.mcf
+++ /dev/null
@@ -1,148 +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.
-
-# Script to create a file system job and run it, sending the files to the null output connector
-# Argument: the base path of the API service, e.g. "http://localhost:8345/mcf-api-service".
-
-# Decode the argument, if any
-if __args__.__size__ > 4 || __args__.__size__ < 1 || __args__.__size__ == 3 then
-  error "Usage: file-crawl-example <file_path> [ <url_path> [ <user_name> <password> ] ]";
-;
-if __args__.__size__ == 1 then
-  set basepath = "http://localhost:8345/mcf-api-service";
-else
-  set basepath = __args__[1];
-;
-if __args__.__size__ == 4 then
-  set username = __args__[2];
-  set password = __args__[3];
-else
-  set username = "";
-  set password = "";
-;
-
-set baseurl = (new url basepath) + "json";
-
-# Define all the connection names, job names, etc.
-set outputConnectionName = "Null Output";
-set outputConnectionDescription = "Null Output Connection";
-set repositoryConnectionName = "File System";
-set repositoryConnectionDescription = "File System Connection";
-set fileCrawlPath = __args__[0];
-set fileCrawlJobName = "File system crawl of "+fileCrawlPath;
-
-# First, login
-POST result = {
-  << "userID" : username :  :  >>,
-  << "password" : password : : >> }
-  to baseurl + "LOGIN";
-if result.__OK__ then
-  print "Login successful";
-else
-  error "Login failed";
-;
-
-# Now, create the null output connection, unless it's already there.
-PUT result = {
-  << "outputconnection" : "" :  :
-    << "description" : outputConnectionDescription :  :  >>,
-    << "configuration" : "" :  :  >>,
-    << "class_name" : "org.apache.manifoldcf.agents.output.nullconnector.NullConnector" :  :  >>,
-    << "name" : outputConnectionName :  :  >>,
-    << "max_connections" : "100" :  :  >> >> }
-  to baseurl + "outputconnections" + new connectionname outputConnectionName;
-if result.__CREATED__ || result.__OK__ then
-  print "Output connection created (or already exists)";
-else
-  error "Unexpected result: "+result.__script__;
-;
-
-# Same deal with the repository connection
-PUT result = {
-  << "repositoryconnection" : "" :  : 
-    << "description" : repositoryConnectionDescription :  :  >>,
-    << "configuration" : "" :  :  >>,
-    << "class_name" : "org.apache.manifoldcf.crawler.connectors.filesystem.FileConnector" :  :  >>,
-    << "name" : repositoryConnectionName :  :  >>,
-    << "max_connections" : "100" :  :  >> >> }
-  to baseurl + "repositoryconnections" + new connectionname repositoryConnectionName;
-if result.__CREATED__ || result.__OK__ then
-  print "Repository connection created (or already exists)";
-else
-  error "Unexpected result: "+result.__script__;
-;
-
-# Create the job (if it can't find it)
-POST result = {
-  << "job" : "" :  : 
-    << "start_mode" : "manual" :  :  >>,
-    << "reseed_interval" : "3600000" :  :  >>,
-    << "recrawl_interval" : "86400000" :  :  >>,
-    << "run_mode" : "scan once" :  :  >>,
-    << "hopcount_mode" : "never delete" :  :  >>,
-    << "description" : fileCrawlJobName :  :  >>,
-    << "repository_connection" : "File System" :  :  >>,
-    << "document_specification" : "" :  :
-      << "startpoint" : "" : "path"=fileCrawlPath : 
-        << "include" : "" : "match"="*", "type"="file" :  >>,
-        << "include" : "" : "match"="*", "type"="directory" :  >> >> >>,
-    << "pipelinestage" : "" :  :
-      << "stage_id" : 0 :  :  >>,
-      << "stage_isoutput": "true" :  :  >>,
-      << "stage_specification" : "" :  :  >>,
-      << "stage_connectionname" : "Null Output" :  :  >> >>,
-    << "priority" : "5" :  :  >>,
-    << "expiration_interval" : "infinite" :  :  >> >> }
-  to baseurl + "jobs";
-if result.__CREATED__ then
-  print "Job created";
-  set jobid = result.__value__[0].__value__;
-else
-  error "Unexpected result: "+result.__script__;
-;
-
-print "The job id is "+jobid;
-
-# Start the job
-PUT result = { }
-  to baseurl + "start" + jobid;
-  
-# Wait for the job to finish
-while true do
-  GET result = baseurl + "jobstatuses" + jobid;
-  if !result.__OK__ then
-    error "Couldn't get job status";
-  ;
-
-  # Find the job's status
-  set jobstatus = result.__value__.__dict__["jobstatus"];
-  if isnull jobstatus then
-    error "Couldn't find job status in response: " + result.__script__;
-  ;
-  
-  set thestatus = jobstatus.__dict__["status"].__value__;
-  
-  if thestatus == "done" || thestatus == "error" then
-    break;
-  ;
-  wait 10000;
-;
-
-if thestatus == "error" then
-  print "The job aborted, with error: " + jobstatus.__dict__["error_text"].__value;
-else
-  print "The job completed";
-;
-
diff --git a/framework/scripts-combined/combined-options.env.unix b/framework/scripts-combined/combined-options.env.unix
deleted file mode 100644
index 39b11c2..0000000
--- a/framework/scripts-combined/combined-options.env.unix
+++ /dev/null
@@ -1,6 +0,0 @@
--Xms512m
--Xmx512m
--Dorg.apache.manifoldcf.configfile=./properties.xml
--Dorg.apache.manifoldcf.jettyshutdowntoken=secret_token
--cp
-.:
diff --git a/framework/scripts-combined/combined-options.env.win b/framework/scripts-combined/combined-options.env.win
deleted file mode 100644
index 8bc8d1e..0000000
--- a/framework/scripts-combined/combined-options.env.win
+++ /dev/null
@@ -1,6 +0,0 @@
--Xms512m

--Xmx512m

--Dorg.apache.manifoldcf.configfile=.\properties.xml

--Dorg.apache.manifoldcf.jettyshutdowntoken=secret_token

--cp

-.;

diff --git a/framework/scripts-combined/start-combined.bat b/framework/scripts-combined/start-combined.bat
deleted file mode 100644
index e08b337..0000000
--- a/framework/scripts-combined/start-combined.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type combined-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.jettyrunner.ManifoldCFCombinedJettyRunner

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-combined/start-combined.sh b/framework/scripts-combined/start-combined.sh
deleted file mode 100755
index f10d0c8..0000000
--- a/framework/scripts-combined/start-combined.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="combined-options.env.win"
-else
-    OPTIONSFILE="combined-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.jettyrunner.ManifoldCFCombinedJettyRunner
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-combined/stop-combined.bat b/framework/scripts-combined/stop-combined.bat
deleted file mode 100644
index 068dff0..0000000
--- a/framework/scripts-combined/stop-combined.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type combined-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.jettyrunner.ManifoldCFJettyShutdown "http://localhost:8345"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-combined/stop-combined.sh b/framework/scripts-combined/stop-combined.sh
deleted file mode 100644
index 0c9b02b..0000000
--- a/framework/scripts-combined/stop-combined.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="combined-options.env.win"
-else
-    OPTIONSFILE="combined-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.jettyrunner.ManifoldCFJettyShutdown "http://localhost:8345"
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-common/setjavaoption.bat b/framework/scripts-common/setjavaoption.bat
deleted file mode 100644
index b040d45..0000000
--- a/framework/scripts-common/setjavaoption.bat
+++ /dev/null
@@ -1,16 +0,0 @@
-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-set JAVAOPTIONS=%JAVAOPTIONS% %1

diff --git a/framework/scripts-hsqldb/hsqldb-options.env.unix b/framework/scripts-hsqldb/hsqldb-options.env.unix
deleted file mode 100644
index 5f1a7c6..0000000
--- a/framework/scripts-hsqldb/hsqldb-options.env.unix
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms256m
--Xmx256m
--cp
-.:
diff --git a/framework/scripts-hsqldb/hsqldb-options.env.win b/framework/scripts-hsqldb/hsqldb-options.env.win
deleted file mode 100644
index b90b890..0000000
--- a/framework/scripts-hsqldb/hsqldb-options.env.win
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms256m

--Xmx256m

--cp

-.;

diff --git a/framework/scripts-hsqldb/start-database.bat b/framework/scripts-hsqldb/start-database.bat
deleted file mode 100644
index a1b7a11..0000000
--- a/framework/scripts-hsqldb/start-database.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type hsqldb-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.hsqldb.Server -database.0 file:extdb;hsqldb.tx=mvcc;hsqldb.cache_file_scale=512 -dbname.0 xdb

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-hsqldb/start-database.sh b/framework/scripts-hsqldb/start-database.sh
deleted file mode 100644
index 89d2fce..0000000
--- a/framework/scripts-hsqldb/start-database.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="hsqldb-options.env.win"
-else
-    OPTIONSFILE="hsqldb-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.hsqldb.Server -database.0 "file:extdb;hsqldb.tx=mvcc;hsqldb.cache_file_scale=512" -dbname.0 xdb
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-jetty/jetty-options.env.unix b/framework/scripts-jetty/jetty-options.env.unix
deleted file mode 100644
index 2cc4ce8..0000000
--- a/framework/scripts-jetty/jetty-options.env.unix
+++ /dev/null
@@ -1,6 +0,0 @@
--Xms256m
--Xmx256m
--Dorg.apache.manifoldcf.configfile=./properties.xml
--Dorg.apache.manifoldcf.jettyshutdowntoken=secret_token
--cp
-.:
diff --git a/framework/scripts-jetty/jetty-options.env.win b/framework/scripts-jetty/jetty-options.env.win
deleted file mode 100644
index 9100059..0000000
--- a/framework/scripts-jetty/jetty-options.env.win
+++ /dev/null
@@ -1,6 +0,0 @@
--Xms256m

--Xmx256m

--Dorg.apache.manifoldcf.configfile=.\properties.xml

--Dorg.apache.manifoldcf.jettyshutdowntoken=secret_token

--cp

-.;

diff --git a/framework/scripts-jetty/start-webapps.bat b/framework/scripts-jetty/start-webapps.bat
deleted file mode 100644
index 654edbc..0000000
--- a/framework/scripts-jetty/start-webapps.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type jetty-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-jetty/start-webapps.sh b/framework/scripts-jetty/start-webapps.sh
deleted file mode 100755
index 727b3a0..0000000
--- a/framework/scripts-jetty/start-webapps.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="jetty-options.env.win"
-else
-    OPTIONSFILE="jetty-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-start/start-options.env.unix b/framework/scripts-start/start-options.env.unix
deleted file mode 100644
index 39b11c2..0000000
--- a/framework/scripts-start/start-options.env.unix
+++ /dev/null
@@ -1,6 +0,0 @@
--Xms512m
--Xmx512m
--Dorg.apache.manifoldcf.configfile=./properties.xml
--Dorg.apache.manifoldcf.jettyshutdowntoken=secret_token
--cp
-.:
diff --git a/framework/scripts-start/start-options.env.win b/framework/scripts-start/start-options.env.win
deleted file mode 100644
index 8bc8d1e..0000000
--- a/framework/scripts-start/start-options.env.win
+++ /dev/null
@@ -1,6 +0,0 @@
--Xms512m

--Xmx512m

--Dorg.apache.manifoldcf.configfile=.\properties.xml

--Dorg.apache.manifoldcf.jettyshutdowntoken=secret_token

--cp

-.;

diff --git a/framework/scripts-start/start.bat b/framework/scripts-start/start.bat
deleted file mode 100644
index 43a56cf..0000000
--- a/framework/scripts-start/start.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type start-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-start/start.sh b/framework/scripts-start/start.sh
deleted file mode 100644
index d15b612..0000000
--- a/framework/scripts-start/start.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="start-options.env.win"
-else
-    OPTIONSFILE="start-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-start/stop.bat b/framework/scripts-start/stop.bat
deleted file mode 100644
index 2810d36..0000000
--- a/framework/scripts-start/stop.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type start-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.manifoldcf.jettyrunner.ManifoldCFJettyShutdown "http://localhost:8345"

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-start/stop.sh b/framework/scripts-start/stop.sh
deleted file mode 100644
index 7a25be8..0000000
--- a/framework/scripts-start/stop.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="start-options.env.win"
-else
-    OPTIONSFILE="start-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.manifoldcf.jettyrunner.ManifoldCFJettyShutdown "http://localhost:8345"
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-zookeeper/runzookeeper.bat b/framework/scripts-zookeeper/runzookeeper.bat
deleted file mode 100644
index d9fb8d1..0000000
--- a/framework/scripts-zookeeper/runzookeeper.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME is set, and that the current directory is correct

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type zk-options.env.win') do call setjavaoption.bat "%%a"

-rem invoke java with the jetty class

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% org.apache.zookeeper.server.quorum.QuorumPeerMain zookeeper.cfg

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Current working directory does not contain a properties.xml file.

-goto done

-:done

diff --git a/framework/scripts-zookeeper/runzookeeper.sh b/framework/scripts-zookeeper/runzookeeper.sh
deleted file mode 100644
index 60eecab..0000000
--- a/framework/scripts-zookeeper/runzookeeper.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="zk-options.env.win"
-else
-    OPTIONSFILE="zk-options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS org.apache.zookeeper.server.quorum.QuorumPeerMain zookeeper.cfg
-        exit $?
-        
-    else
-        echo "Working directory contains no properties.xml file." 1>&2
-        exit 1
-    fi
-
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts-zookeeper/zk-options.env.unix b/framework/scripts-zookeeper/zk-options.env.unix
deleted file mode 100644
index 5f1a7c6..0000000
--- a/framework/scripts-zookeeper/zk-options.env.unix
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms256m
--Xmx256m
--cp
-.:
diff --git a/framework/scripts-zookeeper/zk-options.env.win b/framework/scripts-zookeeper/zk-options.env.win
deleted file mode 100644
index b90b890..0000000
--- a/framework/scripts-zookeeper/zk-options.env.win
+++ /dev/null
@@ -1,4 +0,0 @@
--Xms256m

--Xmx256m

--cp

-.;

diff --git a/framework/scripts/executecommand.bat b/framework/scripts/executecommand.bat
deleted file mode 100644
index ebb0c43..0000000
--- a/framework/scripts/executecommand.bat
+++ /dev/null
@@ -1,30 +0,0 @@
-@echo off

-rem Licensed to the Apache Software Foundation (ASF) under one or more

-rem contributor license agreements.  See the NOTICE file distributed with

-rem this work for additional information regarding copyright ownership.

-rem The ASF licenses this file to You under the Apache License, Version 2.0

-rem (the "License"); you may not use this file except in compliance with

-rem the License.  You may obtain a copy of the License at

-rem

-rem     http://www.apache.org/licenses/LICENSE-2.0

-rem

-rem Unless required by applicable law or agreed to in writing, software

-rem distributed under the License is distributed on an "AS IS" BASIS,

-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-rem See the License for the specific language governing permissions and

-rem limitations under the License.

-

-rem check that JAVA_HOME and MCF_HOME are set

-if not exist "%JAVA_HOME%\bin\java.exe" goto nojavahome

-if not exist ".\properties.xml" goto nolcfhome

-set JAVAOPTIONS=

-for /f "delims=" %%a in ('type options.env.win') do call setjavaoption.bat "%%a"

-"%JAVA_HOME%\bin\java" %JAVAOPTIONS% %*

-goto done

-:nojavahome

-echo Environment variable JAVA_HOME is not set properly.

-goto done

-:nolcfhome

-echo Working directory is not set properly.

-goto done

-:done

diff --git a/framework/scripts/executecommand.sh b/framework/scripts/executecommand.sh
deleted file mode 100755
index 3c4cfbe..0000000
--- a/framework/scripts/executecommand.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash -e
-
-# 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.
-
-if [[ $OSTYPE == "cygwin" ]] ; then
-    OPTIONSFILE="options.env.win"
-else
-    OPTIONSFILE="options.env.unix"
-fi
-
-#Make sure environment variables are properly set
-if [ -e "$JAVA_HOME"/bin/java ] ; then
-    if [ -f ./properties.xml ] ; then
-    
-        # Build the global options
-        OPTIONS=$(cat "$OPTIONSFILE")
-        
-        "$JAVA_HOME/bin/java" $OPTIONS $@
-        exit $?
-        
-    else
-        echo "Working directory is not properly set." 1>&2
-        exit 1
-    fi
-    
-else
-    echo "Environment variable JAVA_HOME is not properly set." 1>&2
-    exit 1
-fi
diff --git a/framework/scripts/options.env.unix b/framework/scripts/options.env.unix
deleted file mode 100644
index 5b395e4..0000000
--- a/framework/scripts/options.env.unix
+++ /dev/null
@@ -1,5 +0,0 @@
--Xms512m
--Xmx512m
--Dorg.apache.manifoldcf.configfile=./properties.xml
--cp
-.:
diff --git a/framework/scripts/options.env.win b/framework/scripts/options.env.win
deleted file mode 100644
index e035abf..0000000
--- a/framework/scripts/options.env.win
+++ /dev/null
@@ -1,5 +0,0 @@
--Xms512m

--Xmx512m

--Dorg.apache.manifoldcf.configfile=.\properties.xml

--cp

-.;

diff --git a/framework/ui-core/.gitignore b/framework/ui-core/.gitignore
deleted file mode 100644
index d98981c..0000000
--- a/framework/ui-core/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.classpath
-/.project
-/.settings/
diff --git a/framework/ui-core/pom.xml b/framework/ui-core/pom.xml
deleted file mode 100644
index 891d519..0000000
--- a/framework/ui-core/pom.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-framework</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>mcf-ui-core</artifactId>
-  <name>ManifoldCF - Framework - UI Core</name>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/native2ascii</directory>
-      </resource>
-    </resources> 
-
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>native2ascii-maven-plugin</artifactId>
-        <version>1.0-beta-1</version>
-        <configuration>
-            <workDir>target/classes</workDir>
-        </configuration>
-        <executions>
-            <execution>
-                <id>native2ascii-utf8</id>
-                <goals>
-                    <goal>native2ascii</goal>
-                </goals>
-                <configuration>
-                    <encoding>UTF8</encoding>
-                    <includes>
-                      <include>**/*.properties</include>
-                    </includes>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- Internal dependencies -->
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mcf-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-api-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-    </dependency>    
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jsp-2.1-glassfish</artifactId>
-      <version>${glassfish.version}</version>
-    </dependency>
-
-    <!-- other dependencies -->
-     <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>${commons-lang.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-fileupload</groupId>
-      <artifactId>commons-fileupload</artifactId>
-      <version>${commons-fileupload.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>${commons-io.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.velocity</groupId>
-      <artifactId>velocity</artifactId>
-      <version>${velocity.version}</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/APIProfile.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/APIProfile.java
deleted file mode 100644
index a3e2906..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/APIProfile.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.ui.beans;
-
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.*;
-
-/** The profile object contains an API user's login information, and helps establish the
-* session model for the application.  This particular bean maintains the user (against
-* the IAdminUserManager service).
-*/
-public class APIProfile implements HttpSessionBindingListener, IAuthorizer
-{
-  public static final String _rcsid = "@(#)$Id$";
-
-  /** Time of login */
-  private long loginTime = -1L;
-  /** Logged in user */
-  private String userID = null;
-  /** Set to "true" if user is logged in. */
-  private boolean isLoggedIn = false;
-
-  /** Session identifier */
-  private String sessionIdentifier = null;
-
-  /** Constructor.
-  */
-  public APIProfile()
-  {
-  }
-
-  // The following methods constitute the "login process" for this bean.
-  // Set the user and the company, then set LoggedOn.
-
-  /** Get the current session identifier.
-  *@return the identifier.
-  */
-  public String session()
-  {
-    return sessionIdentifier;
-  }
-
-  /** Get the admin user id.
-  *@return the last login user id.
-  */
-  public String getUserID()
-  {
-    return userID;
-  }
-
-  /** Log out the current user.
-  */
-  public void logout()
-  {
-    sessionCleanup();
-  }
-
-  /** Log on the user, with the already-set user id and company
-  * description.
-  *@param userPassword is the login password for the user.
-  */
-  public void login(IThreadContext threadContext,
-    String userID, String userPassword)
-  {
-    sessionCleanup();
-    try
-    {
-      IAuth auth = AuthFactory.make(threadContext);
-      // Check if everything is in place.
-      if (auth.verifyAPILogin(userID,userPassword))
-      {
-        isLoggedIn = true;
-        loginTime = System.currentTimeMillis();
-        this.userID = userID;
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.misc.fatal("Exception logging in: "+e.getMessage(),e);
-    }
-  }
-
-  /** Get the logged-in status, which will be false if the log-in did not succeed, or
-  * timed out.
-  *@return the current login status: true if logged in.
-  */
-  public boolean getLoggedOn()
-  {
-    return isLoggedIn;
-  }
-
-  /** Get the current login time as a string.
-  *@return the last login time.
-  */
-  public String getLoginTime()
-  {
-    return new java.util.Date(loginTime).toString();
-  }
-
-  /** Get the current login time as a long.
-  *@return the last login time.
-  */
-  public long getLoginTimeLong()
-  {
-    return loginTime;
-  }
-
-  // Nuke stuff for security and the garbage
-  // collector threads
-  private void sessionCleanup()
-  {
-    // Un-log-in the user
-    isLoggedIn = false;
-    userID = null;
-    loginTime = -1L;
-  }
-
-  /** Check user capability */
-  @Override
-  public boolean checkAllowed(final IThreadContext threadContext, final int capability)
-    throws ManifoldCFException
-  {
-    if (!isLoggedIn)
-      return false;
-    IAuth auth = AuthFactory.make(threadContext);
-    // Check if everything is in place.
-    return auth.checkCapability(userID,capability);
-  }
-
-  //*****************************************************************
-  // Bind listener api - support session invalidation
-  // vis logout or timeout
-  @Override
-  public void valueBound(HttpSessionBindingEvent e)
-  {
-    HttpSession ss = e.getSession();
-
-    if (sessionIdentifier==null)
-    {
-      sessionIdentifier = ss.getId();
-    }
-  }
-
-  @Override
-  public void valueUnbound(HttpSessionBindingEvent e)
-  {
-    sessionCleanup();
-    sessionIdentifier = null;
-  }
-
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/AdminProfile.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/AdminProfile.java
deleted file mode 100644
index 9df1666..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/AdminProfile.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/* $Id: AdminProfile.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.beans;
-
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.*;
-import org.apache.manifoldcf.ui.passwords.PasswordMapper;
-
-/** The profile object contains an admin user's login information, and helps establish the
-* session model for the application.  This particular bean maintains the user (against
-* the IAdminUserManager service).
-*/
-public class AdminProfile implements HttpSessionBindingListener, IAuthorizer
-{
-  public static final String _rcsid = "@(#)$Id: AdminProfile.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Time of login */
-  private long loginTime = -1L;
-  /** Logged in user */
-  private String userID = null;
-  /** Set to "true" if user is logged in. */
-  private boolean isLoggedIn = false;
-  /** Set to "true" if user can manage users. */
-  private boolean manageUsers = false;
-  /** Password mapper */
-  private PasswordMapper passwordMapper = null;
-
-  /** Session identifier */
-  private String sessionIdentifier = null;
-
-  /** Constructor.
-  */
-  public AdminProfile()
-  {
-  }
-
-  // The following methods constitute the "login process" for this bean.
-  // Set the user and the company, then set LoggedOn.
-
-  /** Get the current session identifier.
-  *@return the identifier.
-  */
-  public String session()
-  {
-    return sessionIdentifier;
-  }
-
-  /** Get the admin user id.
-  *@return the last login user id.
-  */
-  public String getUserID()
-  {
-    return userID;
-  }
-
-  /** Get whether this user can manage users.
-  *@return true if the user can manage other users.
-  */
-  public boolean getManageUsers()
-  {
-    return manageUsers;
-  }
-
-  /** Log out the current user.
-  */
-  public void logout()
-  {
-    sessionCleanup();
-  }
-
-  /** Log on the user, with the already-set user id and company
-  * description.
-  *@param userPassword is the login password for the user.
-  */
-  public void login(IThreadContext threadContext,
-    String userID, String userPassword)
-  {
-    sessionCleanup();
-    try
-    {
-      IAuth auth = AuthFactory.make(threadContext);
-      // Check if everything is in place.
-      if (auth.verifyUILogin(userID,userPassword))
-      {
-        isLoggedIn = true;
-        loginTime = System.currentTimeMillis();
-        this.userID = userID;
-        manageUsers = false;
-        passwordMapper = new PasswordMapper();
-      }
-    }
-    catch (ManifoldCFException e)
-    {
-      Logging.misc.fatal("Exception logging in: "+e.getMessage(),e);
-    }
-  }
-
-  /** Get the logged-in status, which will be false if the log-in did not succeed, or
-  * timed out.
-  *@return the current login status: true if logged in.
-  */
-  public boolean getLoggedOn()
-  {
-    return isLoggedIn;
-  }
-
-  /** Get the current login time as a string.
-  *@return the last login time.
-  */
-  public String getLoginTime()
-  {
-    return new java.util.Date(loginTime).toString();
-  }
-
-  /** Get the current login time as a long.
-  *@return the last login time.
-  */
-  public long getLoginTimeLong()
-  {
-    return loginTime;
-  }
-
-  /** Get the password mapper object.
-  *@return the password mapper object.
-  */
-  public PasswordMapper getPasswordMapper()
-  {
-    return passwordMapper;
-  }
-  
-  // Nuke stuff for security and the garbage
-  // collector threads
-  private void sessionCleanup()
-  {
-    // Un-log-in the user
-    isLoggedIn = false;
-    userID = null;
-    manageUsers = false;
-    loginTime = -1L;
-    passwordMapper = null;
-  }
-
-  /** Check user capability */
-  @Override
-  public boolean checkAllowed(final IThreadContext threadContext, final int capability)
-    throws ManifoldCFException
-  {
-    if (!isLoggedIn)
-      return false;
-    IAuth auth = AuthFactory.make(threadContext);
-    // Check if everything is in place.
-    return auth.checkCapability(userID,capability);
-  }
-
-  //*****************************************************************
-  // Bind listener api - support session invalidation
-  // vis logout or timeout
-  @Override
-  public void valueBound(HttpSessionBindingEvent e)
-  {
-    HttpSession ss = e.getSession();
-
-    if (sessionIdentifier==null)
-    {
-      sessionIdentifier = ss.getId();
-    }
-  }
-
-  @Override
-  public void valueUnbound(HttpSessionBindingEvent e)
-  {
-    sessionCleanup();
-    sessionIdentifier = null;
-  }
-
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/ThreadContext.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/ThreadContext.java
deleted file mode 100644
index ae2aa72..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/beans/ThreadContext.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $Id: ThreadContext.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.beans;
-
-import org.apache.manifoldcf.core.interfaces.*;
-
-/** Class to provide a threadcontext bean for every JSP page
-*/
-public class ThreadContext
-{
-  public static final String _rcsid = "@(#)$Id: ThreadContext.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** thread context interface
-  */
-  private IThreadContext itc;
-
-  /** Constructor
-  */
-  public ThreadContext()
-  {
-
-    itc = ThreadContextFactory.make();
-  }
-
-  /** Get the thread context.
-  *@return the context.
-  */
-  public IThreadContext getThreadContext()
-  {
-    return itc;
-  }
-}
-
-
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/i18n/Messages.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/i18n/Messages.java
deleted file mode 100644
index 5015fad..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/i18n/Messages.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.ui.i18n;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
-import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
-import org.apache.manifoldcf.ui.util.Encoder;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
-
-public class Messages extends org.apache.manifoldcf.core.i18n.Messages
-{
-  public static final String DEFAULT_BUNDLE_NAME="org.apache.manifoldcf.ui.i18n.common";
-
-  public static String getString(Locale locale, String messageKey)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyString(Locale locale, String messageKey)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, null);
-  }
-
-  public static String getString(Locale locale, String messageKey, Object[] args)
-  {
-    return getString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-  
-  public static String getBodyString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getAttributeJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(DEFAULT_BUNDLE_NAME, locale, messageKey, args);
-  }
-
-  // More general methods which allow bundlenames and class loaders to be specified.
-  
-  public static String getString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getAttributeString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyString(Messages.class, bundleName, locale, messageKey, args);
-  }
-  
-  public static String getAttributeJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getAttributeJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  public static String getBodyJavascriptString(String bundleName, Locale locale, String messageKey, Object[] args)
-  {
-    return getBodyJavascriptString(Messages.class, bundleName, locale, messageKey, args);
-  }
-
-  /** Constructor - do no instantiate
-  */
-  protected Messages()
-  {
-  }
-
-  public static void outputResourceWithVelocity(IHTTPOutput output, Class clazz, String bundleName, String pathName,
-    Locale locale, String resourceKey, Map<String,Object> contextObjects)
-    throws ManifoldCFException
-  {
-    VelocityEngine engine = createVelocityEngine(clazz);
-    try {
-      VelocityContext context = new VelocityContext();
-      
-      // Add utility methods the UI needs
-      context.put("Encoder",org.apache.manifoldcf.ui.util.Encoder.class);
-      context.put("Formatter",org.apache.manifoldcf.ui.util.Formatter.class);
-      context.put("MultilineParser",org.apache.manifoldcf.ui.util.MultilineParser.class);
-      
-      // Add in the resource bundle
-      ResourceBundle rb = getResourceBundle(clazz,bundleName,locale);
-      context.put("ResourceBundle",new ResourceBundleWrapper(rb,bundleName,locale));
-      
-      if (contextObjects != null)
-      {
-        Iterator<String> i = contextObjects.keySet().iterator();
-        while(i.hasNext())
-        {
-          String key = i.next();
-          Object value = contextObjects.get(key);
-          context.put(key,value);
-        }
-      }
-      
-      String resourcePath = localizeResourceName(pathName, resourceKey, locale);
-          
-      Writer outputWriter = new OutputWriter(output);
-      engine.mergeTemplate(resourcePath, StandardCharsets.UTF_8.name(), context, outputWriter);
-      outputWriter.flush();
-    } catch (IOException e) {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-  
-  /** Write a resource to HTTP output, specifying what to substitute, and more importantly, how.
-   * $PARAM_NAME will be substituted directly with the value.
-   * $PARAM_NAME_A will be substituted with HTML attribute-escaped value.
-   * $PARAM_NAME_B will be substituted with HTML body-escaped value.
-   * $PARAM_NAME_AJ will be substituted with HTML attribute + Javascript escaped value.
-   * $PARAM_NAME_BJ will be substituted with HTML body + Javascript escaped value.
-   */
-   public static void outputResourceWithVelocity(IHTTPOutput output, Class clazz, String bundleName, String pathName,
-     Locale locale, String resourceKey, Map<String,String> substitutionParameters, boolean mapToUpperCase)
-     throws ManifoldCFException
-  {
-    Map<String,Object> contextObjects = null;
-    if (substitutionParameters != null)
-    {
-      contextObjects = new HashMap<String,Object>();
-      Iterator<String> i = substitutionParameters.keySet().iterator();
-      while(i.hasNext())
-      {
-        String key = i.next();
-        String value = substitutionParameters.get(key);
-        if (mapToUpperCase)
-          key = key.toUpperCase(Locale.ROOT);
-        if (value == null)
-          value = "";
-             
-        contextObjects.put(key,value);
-        contextObjects.put(key+"_A",Encoder.attributeEscape(value));
-        contextObjects.put(key+"_B",Encoder.bodyEscape(value));
-        contextObjects.put(key+"_AJ",Encoder.attributeJavascriptEscape(value));
-        contextObjects.put(key+"_BJ",Encoder.bodyJavascriptEscape(value));
-      }
-    }
-    outputResourceWithVelocity(output,clazz,bundleName,pathName,locale,resourceKey,contextObjects);
-  }
-  
-  private static class OutputWriter extends Writer
-  {
-    private IHTTPOutput output;
-    
-    public OutputWriter(IHTTPOutput output)
-    {
-      super();
-      this.output = output;
-    }
-    
-    public void write(char[] cbuf, int off, int len)
-      throws IOException
-    {
-      if (off == 0 && len == cbuf.length)
-        output.print(cbuf);
-      else
-        output.print(new String(cbuf,off,len));
-    }
-
-    public void close()
-      throws IOException
-    {
-    }
-    
-    public void flush()
-      throws IOException
-    {
-    }
-    
-  }
-  
-  private static String localizeResourceName(String pathName, String resourceName, Locale locale)
-  {
-    return resourceName;
-  }
-  
-  /** Write a resource to HTTP output, specifying what to substitute, and more importantly, how.
-  * ${PARAM_NAME} will be substituted directly with the value.
-  * ${PARAM_NAME:A} will be substituted with HTML attribute-escaped value.
-  * ${PARAM_NAME:B} will be substituted with HTML body-escaped value.
-  * ${PARAM_NAME:AJ} will be substituted with HTML attribute + Javascript escaped value.
-  * ${PARAM_NAME:BJ} will be substituted with HTML body + Javascript escaped value.
-  */
-  public static void outputResource(IHTTPOutput output, Class classInstance, String pathName,
-    Locale locale, String resourceKey, Map<String,String> substitutionParameters, boolean mapToUpperCase)
-    throws ManifoldCFException
-  {
-    try
-    {
-      InputStream is = getResourceAsStream(classInstance,pathName,locale,resourceKey);
-      try
-      {
-        BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
-        String line;
-        while ((line = br.readLine()) != null)
-        {
-          if (substitutionParameters != null)
-          {
-            Iterator<String> i = substitutionParameters.keySet().iterator();
-            boolean parsedLine = false;
-            while(i.hasNext())
-            {
-              String key = i.next();
-              String value = substitutionParameters.get(key);
-              if (mapToUpperCase)
-                key = key.toUpperCase(Locale.ROOT);
-              if (value == null)
-                value = "";
-              //System.out.println("Processed key = '"+key+"', processed value = '"+value+"'");
-              // We replace 4x, with 4 different replacement strings
-              line = doReplace(line,"${"+key+"}",value);
-              line = doReplace(line,"${"+key+":A}",Encoder.attributeEscape(value));
-              line = doReplace(line,"${"+key+":B}",Encoder.bodyEscape(value));
-              line = doReplace(line,"${"+key+":AJ}",Encoder.attributeJavascriptEscape(value));
-              line = doReplace(line,"${"+key+":BJ}",Encoder.bodyJavascriptEscape(value));
-            }
-          }
-          output.println(line);
-        }
-      }
-      finally
-      {
-        is.close();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),e);
-    }
-  }
-
-  private static String doReplace(String line, String key, String value)
-  {
-    if (line.indexOf(key) == -1)
-    {
-      return line;
-    }
-    StringBuilder sb = new StringBuilder();
-    int index = 0;
-    while (true)
-    {
-      int newIndex = line.indexOf(key,index);
-      if (newIndex == -1)
-      {
-        sb.append(line.substring(index));
-        break;
-      }
-      sb.append(line.substring(index,newIndex)).append(value);
-      index = newIndex + key.length();
-    }
-    return sb.toString();
-  }
-  
-  /** Obtain a string given a classloader, bundle, locale, message key, and arguments, and escape it for HTML body context.
-  */
-  public static String getBodyString(Class clazz, String bundleName, Locale locale,
-    String messageKey, Object[] args)
-  {
-    return Encoder.bodyEscape(getString(clazz,bundleName,locale,messageKey,args));
-  }
-  
-  /** Obtain a string given a classloader, bundle, locale, message key, and arguments, and escape it for HTML attribute context.
-  */
-  public static String getAttributeString(Class clazz, String bundleName, Locale locale,
-    String messageKey, Object[] args)
-  {
-    return Encoder.attributeEscape(getString(clazz,bundleName,locale,messageKey,args));
-  }
-
-  /** Obtain a string given a classloader, bundle, locale, message key, and arguments, and escape it for HTML attribute/javascript context.
-  */
-  public static String getAttributeJavascriptString(Class clazz, String bundleName, Locale locale,
-    String messageKey, Object[] args)
-  {
-    return Encoder.attributeJavascriptEscape(getString(clazz,bundleName,locale,messageKey,args));
-  }
-
-  /** Obtain a string given a classloader, bundle, locale, message key, and arguments, and escape it for HTML body/javascript context.
-  */
-  public static String getBodyJavascriptString(Class clazz, String bundleName, Locale locale,
-    String messageKey, Object[] args)
-  {
-    return Encoder.bodyJavascriptEscape(getString(clazz,bundleName,locale,messageKey,args));
-  }
-
-}
-
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/i18n/ResourceBundleWrapper.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/i18n/ResourceBundleWrapper.java
deleted file mode 100644
index 1a1a31b..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/i18n/ResourceBundleWrapper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.ui.i18n;
-
-import java.util.ResourceBundle;
-import java.util.Locale;
-
-public class ResourceBundleWrapper
-{
-  protected ResourceBundle resourceBundle;
-  protected String bundleName;
-  protected Locale locale;
-  
-  /** Constructor
-  */
-  public ResourceBundleWrapper(ResourceBundle resourceBundle, String bundleName,
-    Locale locale)
-  {
-    this.resourceBundle = resourceBundle;
-    this.bundleName = bundleName;
-    this.locale = locale;
-  }
-  
-  /** Get a string with appropruate handling of exceptions
-  */
-  public String getString(String messageKey)
-  {
-    return Messages.getString(resourceBundle,bundleName,locale,messageKey);
-  }
-  
-  /** Same thing with arguments
-  */
-  public String getString(String messageKey, Object[] args)
-  {
-    return Messages.getString(resourceBundle,bundleName,locale,messageKey,args);
-  }
-  
-}
-
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/jsp/JspWrapper.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/jsp/JspWrapper.java
deleted file mode 100644
index d1fb733..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/jsp/JspWrapper.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/* $Id: JspWrapper.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.jsp;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.ui.beans.AdminProfile;
-import javax.servlet.jsp.*;
-import java.io.*;
-
-/** This class provides an implementation of IHTTPOutput, which provides output
-* services to connector UI interfaces.  More broadly, it provides the services that all
-* connectors will need in order to provide UI components.
-*/
-public class JspWrapper implements IHTTPOutput
-{
-  public static final String _rcsid = "@(#)$Id: JspWrapper.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  protected final JspWriter writer;
-  protected final AdminProfile adminProfile;
-
-  /** Constructor.
-  */
-  public JspWrapper(JspWriter writer, AdminProfile adminProfile)
-  {
-    this.writer = writer;
-    this.adminProfile = adminProfile;
-  }
-
-  /** Flush the stream */
-  @Override
-  public void flush()
-    throws IOException
-  {
-    writer.flush();
-  }
-  
-  /** Write a newline */
-  @Override
-  public void newLine()
-    throws IOException
-  {
-    writer.newLine();
-  }
-  
-  /** Write a boolean */
-  @Override
-  public void print(boolean b)
-    throws IOException
-  {
-    writer.print(b);
-  }
-  
-  /** Write a char */
-  @Override
-  public void print(char c)
-    throws IOException
-  {
-    writer.print(c);
-  }
-  
-  /** Write an array of chars */
-  @Override
-  public void print(char[] c)
-    throws IOException
-  {
-    writer.print(c);
-  }
-  
-  /** Write a double */
-  @Override
-  public void print(double d)
-    throws IOException
-  {
-    writer.print(d);
-  }
-  
-  /** Write a float */
-  @Override
-  public void print(float f)
-    throws IOException
-  {
-    writer.print(f);
-  }
-  
-  /** Write an int */
-  @Override
-  public void print(int i)
-    throws IOException
-  {
-    writer.print(i);
-  }
-  
-  /** Write a long */
-  @Override
-  public void print(long l)
-    throws IOException
-  {
-    writer.print(l);
-  }
-  
-  /** Write an object */
-  @Override
-  public void print(Object o)
-    throws IOException
-  {
-    writer.print(o);
-  }
-  
-  /** Write a string */
-  @Override
-  public void print(String s)
-    throws IOException
-  {
-    writer.print(s);
-  }
-  
-  /** Write a boolean */
-  @Override
-  public void println(boolean b)
-    throws IOException
-  {
-    writer.println(b);
-  }
-  
-  /** Write a char */
-  @Override
-  public void println(char c)
-    throws IOException
-  {
-    writer.println(c);
-  }
-  
-  /** Write an array of chars */
-  @Override
-  public void println(char[] c)
-    throws IOException
-  {
-    writer.println(c);
-  }
-  
-  /** Write a double */
-  @Override
-  public void println(double d)
-    throws IOException
-  {
-    writer.println(d);
-  }
-  
-  /** Write a float */
-  @Override
-  public void println(float f)
-    throws IOException
-  {
-    writer.println(f);
-  }
-  
-  /** Write an int */
-  @Override
-  public void println(int i)
-    throws IOException
-  {
-    writer.println(i);
-  }
-  
-  /** Write a long */
-  @Override
-  public void println(long l)
-    throws IOException
-  {
-    writer.println(l);
-  }
-  
-  /** Write an object */
-  @Override
-  public void println(Object o)
-    throws IOException
-  {
-    writer.println(o);
-  }
-  
-  /** Write a string */
-  @Override
-  public void println(String s)
-    throws IOException
-  {
-    writer.println(s);
-  }
-
-  /** Map a password to a unique key.
-  * This method works within a specific given browser session to replace an existing password with
-  * a key which can be used to look up the password at a later time.
-  *@param password is the password.
-  *@return the key.
-  */
-  @Override
-  public String mapPasswordToKey(String password)
-  {
-    return adminProfile.getPasswordMapper().mapPasswordToKey(password);
-  }
-  
-  /** Convert a key, created by mapPasswordToKey, back to the original password, within
-  * the lifetime of the browser session.  If the provided key is not an actual key, instead
-  * the key value is assumed to be a new password value.
-  *@param key is the key.
-  *@return the password.
-  */
-  @Override
-  public String mapKeyToPassword(String key)
-  {
-    return adminProfile.getPasswordMapper().mapKeyToPassword(key);
-  }
-
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/multipart/MultipartWrapper.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/multipart/MultipartWrapper.java
deleted file mode 100644
index 93d656e..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/multipart/MultipartWrapper.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/* $Id: MultipartWrapper.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.multipart;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.ui.beans.AdminProfile;
-import org.apache.commons.fileupload.*;
-import org.apache.commons.fileupload.disk.*;
-import org.apache.commons.fileupload.servlet.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.util.*;
-import java.io.*;
-
-/** This class provides abstract parameter service, including support for uploaded files and
-* multipart forms.  It is styled much like HttpServletRequest, but wraps this interface so
-* that code can access either standard post data or multipart data transparently.
-*/
-public class MultipartWrapper implements IPostParameters
-{
-  public static final String _rcsid = "@(#)$Id: MultipartWrapper.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** The Admin Profile bean, for password mapping. */
-  protected final AdminProfile adminProfile;
-  /** This is the HttpServletRequest object, which will be used for parameters only if
-  * the form is not multipart. */
-  protected HttpServletRequest request = null;
-  protected Map variableMap = new HashMap();
-  protected String characterEncoding = null;
-
-  /** Constructor.
-  */
-  public MultipartWrapper(HttpServletRequest request, AdminProfile adminProfile)
-    throws ManifoldCFException
-  {
-    this.adminProfile = adminProfile;
-
-    // Check that we have a file upload request
-    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
-    if (!isMultipart)
-    {
-      this.request = request;
-      return;
-    }
-
-    // It is multipart!
-
-    // Create a factory for disk-based file items
-    DiskFileItemFactory factory = new DiskFileItemFactory();
-
-    // Create a new file upload handler
-    ServletFileUpload upload = new ServletFileUpload(factory);
-
-    // Parse the request
-    try
-    {
-      characterEncoding = request.getCharacterEncoding();
-      // Handle broken tomcat; characterEncoding always comes back null for tomcat4
-      if (characterEncoding == null)
-        characterEncoding = "utf8";
-      List items = upload.parseRequest(request);
-      Iterator iter = items.iterator();
-      while (iter.hasNext())
-      {
-        FileItem item = (FileItem) iter.next();
-        String name = item.getFieldName();
-        ArrayList list = (ArrayList)variableMap.get(name);
-        if (list == null)
-        {
-          list = new ArrayList();
-          variableMap.put(name,list);
-        }
-        else
-        {
-          if (((FileItem)list.get(0)).isFormField() != item.isFormField())
-            throw new ManifoldCFException("Illegal form data; posted form has the same name for different data types ('"+name+"')!");
-        }
-        list.add(item);
-      }
-    }
-    catch (FileUploadException e)
-    {
-      throw new ManifoldCFException("Problem uploading file: "+e.getMessage(),e);
-    }
-  }
-
-  /** Get multiple parameter values.
-  */
-  @Override
-  public String[] getParameterValues(String name)
-  {
-    // Expect multiple items, all strings
-    ArrayList list = (ArrayList)variableMap.get(name);
-    if (list == null)
-    {
-      if (request != null)
-        return request.getParameterValues(name);
-      return null;
-    }
-
-    Object x = list.get(0);
-
-    if ((x instanceof FileItem) && !((FileItem)x).isFormField())
-      return null;
-
-    String[] rval = new String[list.size()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      x = list.get(i);
-      if (x instanceof String)
-        rval[i] = (String)x;
-      else
-      {
-        try
-        {
-          rval[i] = ((FileItem)x).getString(characterEncoding);
-        }
-        catch (UnsupportedEncodingException e)
-        {
-          rval[i] = ((FileItem)x).getString();
-        }
-      }
-      i++;
-    }
-    return rval;
-  }
-
-  /** Get single parameter value.
-  */
-  @Override
-  public String getParameter(String name)
-  {
-    // Get it as a parameter.
-    ArrayList list = (ArrayList)variableMap.get(name);
-    if (list == null)
-    {
-      if (request != null)
-        return request.getParameter(name);
-      return null;
-    }
-
-    Object x = list.get(0);
-    if (x instanceof String)
-      return (String)x;
-
-    FileItem item = (FileItem)x;
-    if (!item.isFormField())
-      return null;
-
-    try
-    {
-      return item.getString(characterEncoding);
-    }
-    catch (UnsupportedEncodingException e)
-    {
-      return item.getString();
-    }
-  }
-
-  /** Get a file parameter, as a binary input.
-  */
-  @Override
-  public BinaryInput getBinaryStream(String name)
-    throws ManifoldCFException
-  {
-    if (request != null)
-      return null;
-
-    ArrayList list = (ArrayList)variableMap.get(name);
-    if (list == null)
-      return null;
-
-    Object x = list.get(0);
-    if (x instanceof String)
-      return null;
-
-    FileItem item = (FileItem)x;
-    if (item.isFormField())
-      return null;
-
-    try
-    {
-      InputStream uploadedStream = item.getInputStream();
-      try
-      {
-        return new TempFileInput(uploadedStream);
-      }
-      finally
-      {
-        uploadedStream.close();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new ManifoldCFException("Error creating file binary stream",e);
-    }
-  }
-
-  /** Get file parameter, as a byte array.
-  */
-  @Override
-  public byte[] getBinaryBytes(String name)
-  {
-    if (request != null)
-      return null;
-
-    ArrayList list = (ArrayList)variableMap.get(name);
-    if (list == null)
-      return null;
-
-    Object x = list.get(0);
-    if (x instanceof String)
-      return null;
-
-    FileItem item = (FileItem)x;
-    if (item.isFormField())
-      return null;
-
-    return item.get();
-  }
-
-  /** Set a parameter value
-  */
-  @Override
-  public void setParameter(String name, String value)
-  {
-    ArrayList values = new ArrayList();
-    if (value != null)
-      values.add(value);
-    variableMap.put(name,values);
-  }
-
-  /** Set an array of parameter values
-  */
-  @Override
-  public void setParameterValues(String name, String[] values)
-  {
-    ArrayList valueArray = new ArrayList();
-    int i = 0;
-    while (i < values.length)
-    {
-      valueArray.add(values[i++]);
-    }
-    variableMap.put(name,valueArray);
-  }
-
-  // Password mapping
-  
-  /** Map a password to a unique key.
-  * This method works within a specific given browser session to replace an existing password with
-  * a key which can be used to look up the password at a later time.
-  *@param password is the password.
-  *@return the key.
-  */
-  @Override
-  public String mapPasswordToKey(String password)
-  {
-    return adminProfile.getPasswordMapper().mapPasswordToKey(password);
-  }
-  
-  /** Convert a key, created by mapPasswordToKey, back to the original password, within
-  * the lifetime of the browser session.  If the provided key is not an actual key, instead
-  * the key value is assumed to be a new password value.
-  *@param key is the key.
-  *@return the password.
-  */
-  @Override
-  public String mapKeyToPassword(String key)
-  {
-    return adminProfile.getPasswordMapper().mapKeyToPassword(key);
-  }
-  
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/passwords/PasswordMapper.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/passwords/PasswordMapper.java
deleted file mode 100644
index 2699298..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/passwords/PasswordMapper.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/* $Id$ */
-
-/**
-* 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 org.apache.manifoldcf.ui.passwords;
-
-import org.apache.manifoldcf.core.interfaces.*;
-import org.apache.manifoldcf.core.system.*;
-import java.util.*;
-
-/** This object manages a session-based map of password keys.
-*/
-public class PasswordMapper
-{
-  public static final String _rcsid = "@(#)$Id$";
-  
-  private final String randomPrefix;
-  private final Map<String,Integer> passwordToKey = new HashMap<String,Integer>();
-  private final List<String> passwordList = new ArrayList<String>();
-  
-  /** Constructor */
-  public PasswordMapper()
-  {
-    randomPrefix = generateRandomPrefix();
-  }
-  
-  /** Map a password to a key.
-  *@param password is the password.
-  *@return the key.
-  */
-  public synchronized String mapPasswordToKey(String password)
-  {
-    // Special case for null or empty password
-    if (password == null || password.length() == 0)
-      return password;
-    Integer index = passwordToKey.get(password);
-    if (index == null)
-    {
-      // Need a new key.
-      index = new Integer(passwordList.size());
-      passwordList.add(password);
-      passwordToKey.put(password,index);
-    }
-    return randomPrefix + index;
-  }
-  
-  /** Map a key back to a password.
-  *@param key is the key (or a password, if changed)
-  *@return the password.
-  */
-  public synchronized String mapKeyToPassword(String key)
-  {
-    if (key != null && key.startsWith(randomPrefix))
-    {
-      String intPart = key.substring(randomPrefix.length());
-      try
-      {
-        int index = Integer.parseInt(intPart);
-        if (index < passwordList.size())
-          return passwordList.get(index);
-      }
-      catch (NumberFormatException e)
-      {
-      }
-    }
-    return key;
-  }
-  
-  // Protected methods
-  
-  protected static char[] pickChars = new char[]{'\u0d5d','\u20c4','\u0392','\u1a2b'};
-  
-  /** Generate a random prefix that will not likely collide with any password */
-  protected static String generateRandomPrefix()
-  {
-    Random r = new Random(System.currentTimeMillis());
-    StringBuilder sb = new StringBuilder("_");
-    for (int i = 0; i < 8; i++)
-    {
-      int index = r.nextInt(pickChars.length);
-      sb.append(pickChars[index]);
-    }
-    sb.append("_");
-    return sb.toString();
-  }
-  
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/Encoder.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/Encoder.java
deleted file mode 100644
index cbc6533..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/Encoder.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/* $Id: Encoder.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.util;
-
-/** Various useful encoding methods for working with html
-*/
-public class Encoder
-{
-  public static final String _rcsid = "@(#)$Id: Encoder.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Escape a string that's inside an html attribute and thence inside javascript.
-  *@param value is the input.
-  *@return the escaped string.
-  */
-  public static String attributeJavascriptEscape(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      // First level of encoding: javascript string
-      if (x == '\\' || x == '"' || x == '\'')
-      {
-        rval.append("\\").append(x);
-      }
-      else if (x == '\n')
-      {
-        rval.append("\\n");
-      }
-      else if (x == '\r')
-      {
-        rval.append("\\r");
-      }
-      else if (x == '\t')
-      {
-        rval.append("\\t");
-      }
-      else
-        rval.append(x);
-    }
-    return attributeEscape(rval.toString());
-  }
-
-  /** Escape a string that's in an html body (script) area and thence inside javascript.
-  *@param value is the input.
-  *@return the escaped string.
-  */
-  public static String bodyJavascriptEscape(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      // First level of encoding: javascript string
-      if (x == '\\' || x == '"' || x == '\'')
-      {
-        rval.append("\\").append(x);
-      }
-      else if (x == '\n')
-      {
-        rval.append("\\n");
-      }
-      else if (x == '\r')
-      {
-        rval.append("\\r");
-      }
-      else if (x == '\t')
-      {
-        rval.append("\\t");
-      }
-      else
-        rval.append(x);
-    }
-    // Body escaping does not seem to be necessary inside <script></script>
-    // blocks, at least when <!-- and //--> surround it.
-    //return bodyEscape(rval.toString());
-    return rval.toString();
-  }
-
-  /** Escape a string that's inside an html attribute.
-  *@param value is the input.
-  *@return the escaped string.
-  */
-  public static String attributeEscape(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '\'' || x == '"' || x == '<' || x == '>' || x == '&'|| (x < ' ' && x >= 0))
-      {
-        rval.append("&#").append(Integer.toString((int)x)).append(";");
-      }
-      else
-        rval.append(x);
-    }
-    return rval.toString();
-  }
-
-  /** Escape a string that's inside an html body.
-  *@param value is the input.
-  *@return the escaped string.
-  */
-  public static String bodyEscape(String value)
-  {
-    StringBuilder rval = new StringBuilder();
-    int i = 0;
-    while (i < value.length())
-    {
-      char x = value.charAt(i++);
-      if (x == '<' || x == '>' || x == '&' || (x < ' ' && x >= 0))
-      {
-        rval.append("&#").append(Integer.toString((int)x)).append(";");
-      }
-      else
-        rval.append(x);
-    }
-    return rval.toString();
-  }
-
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/Formatter.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/Formatter.java
deleted file mode 100644
index 3d3f710..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/Formatter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $Id: Formatter.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.util;
-
-import java.util.*;
-
-/** Various useful formatting methods for working with html
-*/
-public class Formatter
-{
-  public static final String _rcsid = "@(#)$Id: Formatter.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Format a long as an understandable date.
-  *@param time is the long.
-  *@return the date, as a human-readable string.  This date will be in local time.
-  */
-  public static String formatTime(long time)
-  {
-    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ROOT);
-    c.setTimeInMillis(time);
-    // We want to format this string in a compact way:
-    // mm-dd-yyyy hh:mm:ss.mmm
-    StringBuilder returnString = new StringBuilder();
-    writechars(returnString,c.get(Calendar.MONTH)+1,2);
-    returnString.append("-");
-    writechars(returnString,c.get(Calendar.DAY_OF_MONTH),2);
-    returnString.append("-");
-    writechars(returnString,c.get(Calendar.YEAR),4);
-    returnString.append(" ");
-    writechars(returnString,c.get(Calendar.HOUR_OF_DAY),2);
-    returnString.append(":");
-    writechars(returnString,c.get(Calendar.MINUTE),2);
-    returnString.append(":");
-    writechars(returnString,c.get(Calendar.SECOND),2);
-    returnString.append(".");
-    writechars(returnString,c.get(Calendar.MILLISECOND),3);
-    return returnString.toString();
-  }
-
-  /** Format a string as a number of continuation fields, so that the total string is not too long.
-  *@param value is the string to format.
-  *@param maxWidth is the maximum width desired for each field.
-  *@param multiple is true if multiple lines desired.
-  *@param ellipsis is true if ellipses are desired for each non-terminal line.
-  *@return an array of strings representing the split-up value.
-  */
-  public static String[] formatString(String value, int maxWidth, boolean multiple, boolean ellipsis)
-  {
-    ArrayList list = new ArrayList();
-    while (true)
-    {
-      if (list.size() > 0 && multiple == false)
-        break;
-      if (value.length() == 0)
-        break;
-      if (value.length() <= maxWidth)
-      {
-        list.add(value);
-        break;
-      }
-      if (ellipsis && maxWidth >= 4)
-      {
-        list.add(value.substring(0,maxWidth-3) + "...");
-        value = value.substring(maxWidth-3);
-      }
-      else
-      {
-        list.add(value.substring(0,maxWidth));
-        value = value.substring(maxWidth);
-      }
-    }
-    String[] rval = new String[list.size()];
-    int i = 0;
-    while (i < rval.length)
-    {
-      rval[i] = (String)list.get(i);
-      i++;
-    }
-    return rval;
-  }
-
-  // Helpful formatting methods
-
-  protected static void writechars(StringBuilder sb, int value, int length)
-  {
-    String stuff = Integer.toString(value);
-    if (length < stuff.length())
-    {
-      while (length > 0)
-      {
-        sb.append('*');
-        length--;
-      }
-      return;
-    }
-    while (length > stuff.length())
-    {
-      sb.append('0');
-      length--;
-    }
-    sb.append(stuff);
-  }
-
-}
diff --git a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/MultilineParser.java b/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/MultilineParser.java
deleted file mode 100644
index 0079be0..0000000
--- a/framework/ui-core/src/main/java/org/apache/manifoldcf/ui/util/MultilineParser.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $Id: MultilineParser.java 988245 2010-08-23 18:39:35Z kwright $ */
-
-/**
-* 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 org.apache.manifoldcf.ui.util;
-
-import java.util.*;
-
-/** Utility methods for converting multi-line inputs into arrays.
-*/
-public class MultilineParser
-{
-  public static final String _rcsid = "@(#)$Id: MultilineParser.java 988245 2010-08-23 18:39:35Z kwright $";
-
-  /** Read a string as a sequence of individual expressions, urls, etc.
-  */
-  public static ArrayList stringToArray(String input)
-  {
-    ArrayList list = new ArrayList();
-    try
-    {
-      java.io.Reader str = new java.io.StringReader(input);
-      try
-      {
-        java.io.BufferedReader is = new java.io.BufferedReader(str);
-        try
-        {
-          while (true)
-          {
-            String nextString = is.readLine();
-            if (nextString == null)
-              break;
-            if (nextString.length() == 0)
-              continue;
-            if (nextString.startsWith("#"))
-              continue;
-            list.add(nextString);
-          }
-        }
-        finally
-        {
-          is.close();
-        }
-      }
-      finally
-      {
-        str.close();
-      }
-    }
-    catch (java.io.IOException e)
-    {
-      return null;
-    }
-    return list;
-  }
-
-}
diff --git a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties b/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties
deleted file mode 100644
index 04c92d3..0000000
--- a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties
+++ /dev/null
@@ -1,1072 +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.
-
-editconnection.Name=Name
-editconnection.Type=Type
-editconnection.Throttling=Throttling
-editconnection.Addthrottle=Add throttle
-editjob.Name=Name
-editjob.Connection=Connection
-
-viewconnection.NoneGlobalAuthority=None (global authority)
-viewconnection.ClearHistoryAssociatedWithThisConnection=Clear history associated with this connection
-viewconnection.ClearAllRelatedHistory=Clear all related history
-viewconnection.Thiscommandwillclearallhistoryrelatedto=This command will clear all history related to connection
-viewconnection.period=.
-
-listconnections.GlobalAuthority=None(globalAuthority)
-
-editjob.Scheduling=Scheduling
-editjob.HopFilters=Hop Filters
-editjob.am=am
-editjob.pm=pm
-
-index.TheApacheSoftwareFoundation=The Apache® Software Foundation
-index.Copyright=Copyright© 2010-2017
-index.ApacheManifoldCF=Apache ManifoldCF™
-index.WelcomeToApacheManifoldFC=Welcome to Apache ManifoldCF™
-index.ApacheManifoldCFLogin=Apache ManifoldCF™ Login
-index.UserIDColon=User ID:
-index.PasswordColon=Password:
-index.Login=Login
-index.LoginFailed=Login failed!
-
-errorCode.ServerDown=Couldn't connect to the server. Please check if the server is up and running.
-errorCode.InternalServerError=Oops! Looks like something went wrong.
-
-banner.DocumentIngestion=Document Ingestion
-
-navigation.LogOut=Log Out
-navigation.Outputs=Outputs
-navigation.ListTransformationConnections=List Transformation Connections
-navigation.ListOutputConnections=List Output Connections
-navigation.Authorities=Authorities
-navigation.ListUserMappings=List User Mapping Connections
-navigation.ListAuthorityConnections=List Authority Connections
-navigation.ListAuthorityGroups=List Authority Groups
-navigation.Repositories=Repositories
-navigation.ListRepositoryConnections=List Repository Connections
-navigation.Jobs=Jobs
-navigation.ListAllJobs=List all Jobs
-navigation.StatusAndJobManagement=Status and Job Management
-navigation.StatusReports=Status Reports
-navigation.DocumentStatus=Document Status
-navigation.QueueStatus=Queue Status
-navigation.HistoryReports=History Reports
-navigation.SimpleHistory=Simple History
-navigation.MaximumActivity=Maximum Activity
-navigation.MaximumBandwidth=Maximum Bandwidth
-navigation.ResultHistogram=Result Histogram
-navigation.Miscellaneous=Miscellaneous
-navigation.Locale=en_US
-navigation.Help=Help
-navigation.Listtransformationconnections=List transformation connections
-navigation.Listoutputconnections=List output connections
-navigation.Listrepositoryconnections=List repository connections
-navigation.Listusermappings=List user mapping connections
-navigation.Listauthorities=List authorities
-navigation.Listauthoritygroups=List authority groups
-navigation.Listjobs=List jobs
-navigation.Managejobs=Manage jobs
-navigation.Documentstatus=Document status
-navigation.Queuestatus=Queue status
-navigation.Simplehistory=Simple history
-navigation.Maximumactivity=Maximum activity
-navigation.Maximumbandwidth=Maximum bandwidth
-navigation.Resulthistogram=Result histogram
-
-listoutputs.ApacheManifoldCFListOutputConnections=Apache ManifoldCF: List Output Connections
-listoutputs.ListOfOutputConnections=List of Output Connections
-listoutputs.Name=Name
-listoutputs.Description=Description
-listoutputs.ConnectionType=Connection Type
-listoutputs.Max=Max
-listoutputs.AddaNewOutputConnection=Add a new output connection
-listoutputs.View=View
-listoutputs.Edit=Edit
-listoutputs.Delete=Delete
-listoutputs.DeleteOutputConnection=Delete output connection
-listoutputs.AddAnOutputConnection=Add an output connection
-listoutputs.uninstalled=(uninstalled)
-
-editoutput.ApacheManifoldCFEditOutputConnection=Apache ManifoldCF: Edit Output Connection
-editoutput.Name=Name
-editoutput.Type=Type
-editoutput.Throttling=Throttling
-editoutput.EditAnOutputConnection=Edit an Output Connection
-editoutput.EditOutputConnection2=Edit Output Connection
-editoutput.ConnectionTypeColon=Connection type:
-editoutput.Continue=Continue
-editoutput.ContinueToNextPage=Continue to next page
-editoutput.Cancel=Cancel
-editoutput.CancelOutputConnectionEditing=Cancel output connection editing
-editoutput.Save=Save
-editoutput.SaveThisOutputConnection=Save this output connection
-editoutput.MaxConnectionsColon=Max connections:
-editoutput.EditOutputConnection=Edit output connection
-editoutput.NameColon=Name:
-editoutput.DescriptionColon=Description:
-editoutput.ConnectionMustHaveAName=Connection must have a name
-editoutput.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-editoutput.UNREGISTERED=UNREGISTERED
-editoutput.tab=tab
-
-viewoutput.ApacheManifoldCFViewOutputConnectionStatus=Apache ManifoldCF: View Output Connection Status
-viewoutput.ViewOutputConnectionStatus=View Output Connection Status
-viewoutput.NameColon=Name:
-viewoutput.DescriptionColon=Description:
-viewoutput.ConnectionTypeColon=Connection type:
-viewoutput.MaxConnectionsColon=Max connections:
-viewoutput.ConnectionStatusColon=Connection status:
-viewoutput.Refresh=Refresh
-viewoutput.EditThisOutputConnection=Edit this output connection
-viewoutput.Edit=Edit
-viewoutput.DeleteThisOutputConnection=Delete this output connection
-viewoutput.Delete=Delete
-viewoutput.ReIngestAllDocumentsAssociatedWithThisOutputConnection=Re-index all documents associated with this output connection
-viewoutput.ReIngestAllAssociatedDocuments=Re-index all associated documents
-viewoutput.RemoveAllDocumentsAssociatedWithThisOutputConnection=Remove all document output records associated with this output connection
-viewoutput.RemoveAllAssociatedDocuments=Remove all associated records
-viewoutput.Deleteoutputconnection=Delete output connection
-viewoutput.Thiscommandwillforce=This command will force every document associated with output\nconnection
-viewoutput.toberecrawled=to be re-indexed the next time the document is crawled.\nDo you want to continue?
-viewoutput.Thiscommandwillcause=This command will cause ManifoldCF to lose all indexing records for documents\nassociated with output connection
-viewoutput.tobeforgotten=.  Do you want to continue?
-viewoutput.qmark=?
-viewoutput.uninstalled=(uninstalled)
-viewoutput.Connectorisnotinstalled=Connector is not installed.
-viewoutput.Threwexception=Threw exception:
-
-listtransformations.ApacheManifoldCFListTransformationConnections=Apache ManifoldCF: List Transformation Connections
-listtransformations.ListOfTransformationConnections=List of Transformation Connections
-listtransformations.Name=Name
-listtransformations.Description=Description
-listtransformations.ConnectionType=Connection Type
-listtransformations.Max=Max
-listtransformations.AddaNewTransformationConnection=Add a new transformation connection
-listtransformations.View=View
-listtransformations.Edit=Edit
-listtransformations.Delete=Delete
-listtransformations.DeleteTransformationConnection=Delete transformation connection
-listtransformations.AddATransformationConnection=Add a transformation connection
-listtransformations.uninstalled=(uninstalled)
-
-edittransformation.ApacheManifoldCFEditTransformationConnection=Apache ManifoldCF: Edit Transformation Connection
-edittransformation.Name=Name
-edittransformation.Type=Type
-edittransformation.Throttling=Throttling
-edittransformation.EditATransformationConnection=Edit a transformation connection
-edittransformation.EditTransformationConnection2=Edit Transformation Connection
-edittransformation.ConnectionTypeColon=Connection type:
-edittransformation.Continue=Continue
-edittransformation.ContinueToNextPage=Continue to next page
-edittransformation.Cancel=Cancel
-edittransformation.CancelTransformationConnectionEditing=Cancel transformation connection editing
-edittransformation.Save=Save
-edittransformation.SaveThisTransformationConnection=Save this transformation connection
-edittransformation.MaxConnectionsColon=Max connections:
-edittransformation.EditTransformationConnection=Edit transformation connection
-edittransformation.NameColon=Name:
-edittransformation.DescriptionColon=Description:
-edittransformation.ConnectionMustHaveAName=Connection must have a name
-edittransformation.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-edittransformation.UNREGISTERED=UNREGISTERED
-edittransformation.tab=tab
-
-viewtransformation.ApacheManifoldCFViewTransformationConnectionStatus=Apache ManifoldCF: View Transformation Connection Status
-viewtransformation.ViewTransformationConnectionStatus=View Transformation Connection Status
-viewtransformation.NameColon=Name:
-viewtransformation.DescriptionColon=Description:
-viewtransformation.ConnectionTypeColon=Connection type:
-viewtransformation.MaxConnectionsColon=Max connections:
-viewtransformation.ConnectionStatusColon=Connection status:
-viewtransformation.Refresh=Refresh
-viewtransformation.EditThisTransformationConnection=Edit this transformation connection
-viewtransformation.Edit=Edit
-viewtransformation.DeleteThisTransformationConnection=Delete this transformation connection
-viewtransformation.Delete=Delete
-viewtransformation.Deletetransformationconnection=Delete transformation connection
-viewtransformation.qmark=?
-viewtransformation.uninstalled=(uninstalled)
-viewtransformation.Connectorisnotinstalled=Connector is not installed.
-viewtransformation.Threwexception=Threw exception:
-
-listgroups.ApacheManifoldCFListAuthorityGroups=Apache ManifoldCF: List Authority Groups
-listgroups.DeleteAuthorityGroup=Delete authority group
-listgroups.ListOfAuthorityGroups=List of Authority Groups
-listgroups.Name=Name
-listgroups.Description=Description
-listgroups.View=View
-listgroups.Edit=Edit
-listgroups.Delete=Delete
-listgroups.AddNewGroup=Add new authority group
-listgroups.AddaNewGroup=Add a new authority group
-
-listauthorities.ApacheManifoldCFListAuthorities=Apache ManifoldCF: List Authorities
-listauthorities.ListOfAuthorityConnections=List of Authority Connections
-listauthorities.DeleteAuthority=Delete authority
-listauthorities.Name=Name
-listauthorities.Description=Description
-listauthorities.AuthorityType=Authority Type
-listauthorities.Max=Max
-listauthorities.AddaNewConnection=Add a new connection
-listauthorities.AddNewConnection=Add a new connection
-listauthorities.View=View
-listauthorities.Edit=Edit
-listauthorities.Delete=Delete
-listauthorities.uninstalled=(uninstalled)
-
-listmappers.ApacheManifoldCFListMappers=Apache ManifoldCF: List User Mappers
-listmappers.ListOfMappingConnections=List of User Mapping Connections
-listmappers.DeleteMapper=Delete user mapper
-listmappers.Name=Name
-listmappers.Description=Description
-listmappers.MapperType=Mapping Type
-listmappers.Max=Max
-listmappers.AddaNewConnection=Add a new connection
-listmappers.AddNewConnection=Add a new connection
-listmappers.View=View
-listmappers.Edit=Edit
-listmappers.Delete=Delete
-listmappers.uninstalled=(uninstalled)
-
-editgroup.Name=Name
-editgroup.ApacheManifoldCFEditAuthorityGroup=Apache ManifoldCF: Edit Authority Group
-editgroup.AuthorityGroupMustHaveAName=Authority group must have a name
-editgroup.tab=tab
-editgroup.EditGroup=Edit group
-editgroup.EditAGroup=Edit a group
-editgroup.NameColon=Name:
-editgroup.DescriptionColon=Description:
-editgroup.Save=Save
-editgroup.SaveThisAuthorityGroup=Save this authority group
-editgroup.Cancel=Cancel
-editgroup.CancelAuthorityGroupEditing=Cancel authority group editing
-
-editauthority.ApacheManifoldCFEditAuthority=Apache ManifoldCF: Edit Authority
-editauthority.EditAnAuthority=Edit an Authority
-editauthority.NameColon=Name:
-editauthority.DescriptionColon=Description:
-editauthority.ConnectionTypeColon=Connection type:
-editauthority.Continue=Continue
-editauthority.ContinueToNextPage=Continue to next page
-editauthority.MaxConnectionsColon=Max connections:
-editauthority.Cancel=Cancel
-editauthority.CancelAuthorityEditing=Cancel authority editing
-editauthority.Save=Save
-editauthority.SaveThisAuthorityConnection=Save this authority connection
-editauthority.EditAuthority=Edit authority
-editauthority.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-editauthority.ConnectionMustHaveAName=Connection must have a name
-editauthority.NoAuthorityConnectorsRegistered=No authority connectors registered
-editauthority.UNREGISTERED=UNREGISTERED
-editauthority.tab=tab
-editauthority.Name=Name
-editauthority.Type=Type
-editauthority.Throttling=Throttling
-editauthority.EditAuthorityConnection=Edit Authority Connection
-editauthority.Prerequisites=Prerequisites
-editauthority.PrerequisiteUserMappingColon=Prerequisite user mapping:
-editauthority.NoPrerequisites=(No Prerequisites)
-editauthority.AuthorizationDomainColon=Authorization domain:
-editauthority.AuthorityGroupColon=Authority group:
-editauthority.SelectAGroup=--Select a group--
-editauthority.ConnectionMustHaveAGroup=Authority connection must have a group
-editauthority.NoAuthorityGroupsDefinedCreateOneFirst=No authority groups have been defined; create one first
-editauthority.DefaultDomainNone=Default domain (None)
-
-editmapper.ApacheManifoldCFEditMapping=Apache ManifoldCF: Edit Mapping
-editmapper.EditAMapping=Edit A Mapping
-editmapper.NameColon=Name:
-editmapper.DescriptionColon=Description:
-editmapper.ConnectionTypeColon=Connection type:
-editmapper.Continue=Continue
-editmapper.ContinueToNextPage=Continue to next page
-editmapper.MaxConnectionsColon=Max connections:
-editmapper.Cancel=Cancel
-editmapper.CancelMappingEditing=Cancel mapping editing
-editmapper.Save=Save
-editmapper.SaveThisMappingConnection=Save this mapping connection
-editmapper.EditMapping=Edit mapper
-editmapper.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-editmapper.ConnectionMustHaveAName=Connection must have a name
-editmapper.NoMappingConnectorsRegistered=No mapping connectors registered
-editmapper.UNREGISTERED=UNREGISTERED
-editmapper.tab=tab
-editmapper.Name=Name
-editmapper.Type=Type
-editmapper.Throttling=Throttling
-editmapper.EditMappingConnection=Edit Mapping Connection
-editmapper.Prerequisites=Prerequisites
-editmapper.PrerequisiteUserMappingColon=Prerequisite user mapping:
-editmapper.NoPrerequisites=(No Prerequisites)
-
-listconnections.ApacheManifoldCFListConnections=Apache ManifoldCF: List Connections
-listconnections.ListOfRepositoryConnections=List of Repository Connections
-listconnections.Name=Name
-listconnections.Description=Description
-listconnections.ConnectionType=Connection Type
-listconnections.AuthorityGroup=Authority Group
-listconnections.Max=Max
-listconnections.AddNewConnection=Add new connection
-listconnections.View=View
-listconnections.Edit=Edit
-listconnections.Delete=Delete
-listconnections.DeleteConnection=Delete connection
-listconnections.AddAConnection=Add a connection
-listconnections.uninstalled=(uninstalled)
-
-editconnection.ApacheManifoldCFEditConnection=Apache ManifoldCF: Edit Connection
-editconnection.EditAConnection=Edit a Connection
-editconnection.ConnectionTypeColon=Connection type:
-editconnection.AuthorityGroupColon=Authority group:
-editconnection.Cancel=Cancel
-editconnection.CancelConnectionEditing=Cancel connection editing
-editconnection.NameColon=Name:
-editconnection.DescriptionColon=Description:
-editconnection.MaxconnectionsColon=Max connections:
-editconnection.ThrottlingColon=Throttling:
-editconnection.Add=Add
-editconnection.BinRegularExpression=Bin regular expression
-editconnection.Description=Description
-editconnection.MaxAvgFetchesMin=Max avg fetches/min
-editconnection.NoThrottlingSpecified=No throttling specified
-editconnection.Continue=Continue
-editconnection.ContinueToNextPage=Continue to next page
-editconnection.Save=Save
-editconnection.SaveThisAuthorityConnection=Save this connection
-editconnection.EditConnection=Edit connection
-editconnection.GlobalAuthority=None (globalAuthority)
-editconnection.ConnectionMustHaveAName=Connection must have a name
-editconnection.ThrottleRateMustBeAnInteger=Throttle rate must be an integer
-editconnection.TheThrottleExpressionMustBeAValidRegularExpression=The throttle expression must be a valid regular expression
-editconnection.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-editconnection.EditRepositoryConnection=Edit Repository Connection
-editconnection.NoRepositoryConnectorsRegistered=No repository connectors registered
-
-editconnection.UNREGISTERED=UNREGISTERED
-editconnection.tab=tab
-editconnection.Delete=Delete
-editconnection.Deletethrottle=Delete throttle
-
-viewconnection.ApacheManifoldCFViewRepositoryConnectionStatus=Apache ManifoldCF: View Repository Connection Status
-viewconnection.ViewRepositoryConnectionStatus=View Repository Connection Status
-viewconnection.NameColon=Name:
-viewconnection.DescriptionColon=Description:
-viewconnection.ConnectionTypeColon=Connection type:
-viewconnection.MaxConnectionsColon=Max connections:
-viewconnection.AuthorityGroupColon=Authority group:
-viewconnection.ThrottlingColon=Throttling:
-viewconnection.NoThrottles=No throttles
-viewconnection.ConnectionStatusColon=Connection status:
-viewconnection.Refresh=Refresh
-viewconnection.EditThisConnection=Edit this connection
-viewconnection.Edit=Edit
-viewconnection.Delete=Delete
-viewconnection.DeleteConnection=Delete connection
-viewconnection.Deletethisconnection=Delete this connection
-viewconnection.uninstalled=(uninstalled)
-viewconnection.Connectorisnotinstalled=Connector is not installed.
-viewconnection.Threwexception=Threw exception:
-viewconnection.Binregularexpression=Bin regular expression
-viewconnection.Description=Description
-viewconnection.Maxavgfetches=Max avg fetches/min
-viewconnection.qmark=?
-
-listjobs.ApacheManifoldCFListJobDescriptions=Apache ManifoldCF: List job descriptions
-listjobs.JobList=Job List
-listjobs.Name=Name
-listjobs.OutputConnection=Output Connection
-listjobs.RepositoryConnection=Repository Connection
-listjobs.ScheduleType=Schedule Type
-listjobs.AddaNewJob=Add a new job
-listjobs.Addajob=Add a job
-listjobs.View=View
-listjobs.Viewjob=View job
-listjobs.Edit=Edit
-listjobs.Editjob=Editjob
-listjobs.Delete=Delete
-listjobs.DeleteJob=Delete job
-listjobs.Copy=Copy
-listjobs.CopyJob=Copy job
-
-editjob.ApacheManifoldCFEditJob=Apache ManifoldCF: Edit Job
-editjob.EditaJob=Edit a Job
-editjob.EditJob=Edit job
-
-editjob.PipelineColon=Pipeline:
-editjob.StageNumber=Stage
-editjob.StageType=Type
-editjob.StagePrecedent=Precedent
-editjob.StageDescription=Description
-editjob.StageConnectionName=Connection name
-editjob.Repository=Repository
-editjob.Output=Output
-editjob.Transformation=Transformation
-editjob.InsertTransformationBefore=Insert transformation before
-editjob.InsertOutputBefore=Insert output before
-editjob.Insertnewstagehere=Insert new stage here
-editjob.SelectATransformationStageConnectionName=Select a transformation stage connection name
-editjob.SelectAnOutputStageConnectionName=Select an output stage connection name
-editjob.AddAnOutput=Add an output
-editjob.AddOutput=Add output
-editjob.Deletepipelinestage=Delete pipeline stage
-editjob.Insertnewtransformationhere=Insert new transformation here
-editjob.Insertnewoutputhere=Insert new output here
-
-editjob.NoRepositoryConnectionsDefinedCreateOneFirst=No repository connections defined - create one first
-editjob.NoOutputConnectionsDefinedCreateOneFirst=No output connections defined - create one first
-editjob.NameColon=Name:
-editjob.MaximumHopCountForType=Maximum hop count for type
-editjob.colon=:
-editjob.cancel=Cancel
-editjob.CancelJobEditing=Cancel job editing
-editjob.OutputConnectionColon=Output connection:
-editjob.NoneSelected=None selected
-editjob.PriorityColon=Priority:
-editjob.Highest=(Highest)
-editjob.Lowest=(Lowest)
-editjob.StartMethodColon=Start method:
-editjob.RepositoryConnectionColon=Repository connection:
-editjob.Continue=Continue
-editjob.ContinueToNextScreen=Continue to next screen
-editjob.StartWhenScheduleWindowStarts=Start when schedule window starts
-editjob.StartEvenInsideAScheduleWindow=Start even inside a schedule window
-editjob.DontAutomaticallyStartThisJob=Don't automatically start this job
-editjob.ScheduleTypeColon=Schedule type:
-editjob.RescanDocumentsDynamically=Rescan documents dynamically
-editjob.ScanEveryDocumentOnce=Scan every document once
-editjob.RecrawlIntervalIfContinuousColon=Recrawl interval (if continuous):
-editjob.MaxRecrawlIntervalIfContinuousColon=Maximum recrawl interval (if continuous):
-editjob.minutesBlankInfinity=minutes (blank=infinity)
-editjob.ExpirationIntervalIfContinuousColon=Expiration interval (if continuous):
-editjob.ReseedIntervalIfContinuousColon=Reseed interval (if continuous):
-editjob.NoScheduleSpecified=No schedule specified
-editjob.ScheduledTimeColon=Scheduled time:
-editjob.AnyDayOfWeek=Any day of week
-editjob.Sundays=Sundays
-editjob.Mondays=Mondays
-editjob.Tuesdays=Tuesdays
-editjob.Wednesdays=Wednesdays
-editjob.Thursdays=Thursdays
-editjob.Fridays=Fridays
-editjob.Saturdays=Saturdays
-editjob.at=at
-editjob.MidnightAnyHourOfDay=Midnight/Any hour of day
-editjob.plus=plus
-editjob.Nothing=Nothing
-editjob.minutes=minutes
-editjob.in=in
-editjob.EveryMonthOfYear=Every month of year
-editjob.January=January
-editjob.February=February
-editjob.March=March
-editjob.April=April
-editjob.May=May
-editjob.June=June
-editjob.July=July
-editjob.August=August
-editjob.September=September
-editjob.October=October
-editjob.November=November
-editjob.December=December
-editjob.on=on
-editjob.AnyDayOfMonth=Any day of month
-editjob.MaximumRunTimeColon=Maximum run time:
-editjob.RemoveSchedule=Remove Schedule
-editjob.DeleteUnreachableDocuments=Delete unreachable documents
-editjob.KeepUnreachableDocumentsForNow=Keep unreachable documents, for now
-editjob.KeepUnreachableDocumentsForever=Keep unreachable documents, forever
-editjob.HopCountModeColon=Hop count mode:
-editjob.Save=Save
-editjob.SaveThisJob=Save this job
-editjob.AddScheduledTime=Add Scheduled Time
-editjob.AddNewScheduleRecord=Add new schedule record
-editjob.JobMustHaveAName=Job must have a name
-editjob.DurationMustBeAValidInteger=Duration must be a valid integer
-editjob.RecrawlIntervalMustBeAValidIntegerOrNull=Recrawl interval must be a valid integer or null
-editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull=Maximum recrawl interval must be a valid integer or null
-editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval=Maximum recrawl interval must be larger that recrawl interval
-editjob.ReseedIntervalMustBeAValidIntegerOrNull=Reseed interval must be a valid integer or null
-editjob.ExpirationIntervalMustBeAValidIntegerOrNull=Expiration interval must be a valid integer or null
-editjob.RemoveScheduleRecord=Remove schedule record #
-editjob.ForcedMetadata=Forced Metadata
-editjob.ForcedMetadataColon=Forced metadata:
-editjob.ParameterName=Parameter name
-editjob.ParameterValue=Parameter value
-editjob.Deleteforcedmetadatanumber=Delete forced metadata #
-editjob.Delete=Delete
-editjob.NoForcedMetadataSpecified=No forced metadata specified
-editjob.Add=Add
-editjob.Addforcedmetadata=Add forced metadata
-editjob.ForcedMetadataNameMustNotBeNull=Forced metadata name must not be null
-editjob.st=st
-editjob.nd=nd
-editjob.rd=rd
-editjob.th=th
-editjob.dayofmonth=day of month
-editjob.JobInvocationColon=Job invocation:
-editjob.Minimal=Minimal
-editjob.Complete=Complete
-
-editjob.tab=tab
-
-showjobstatus.ApacheManifoldCFStatusOfAllJobs=Apache ManifoldCF: Status of all jobs
-showjobstatus.Name=Name
-showjobstatus.Status=Status
-showjobstatus.StartTime=Start Time
-showjobstatus.EndTime=End Time
-showjobstatus.Documents=Documents
-showjobstatus.Active=Active
-showjobstatus.Processed=Processed
-showjobstatus.RefreshStatus=Refresh status
-showjobstatus.Refresh=Refresh
-showjobstatus.StatusOfJobs=Status of Jobs
-
-showjobstatus.Notyetrun=Not yet run
-showjobstatus.Running=Running
-showjobstatus.Runningnoconnector=Running, no connector
-showjobstatus.Aborting=Aborting
-showjobstatus.Restarting=Restarting
-showjobstatus.Stopping=Stopping
-showjobstatus.Resuming=Resuming
-showjobstatus.Paused=Paused
-showjobstatus.Done=Done
-showjobstatus.Waiting=Waiting
-showjobstatus.Startingup=Starting up
-showjobstatus.Cleaningup=Cleaning up
-showjobstatus.Terminating=Terminating
-showjobstatus.Endnotification=End notification
-showjobstatus.ErrorColon=Error:
-showjobstatus.Unknown=Unknown
-showjobstatus.Notstarted=Not started
-showjobstatus.Aborted=Aborted
-showjobstatus.Neverrun=Never run
-showjobstatus.Start=Start
-showjobstatus.Startminimal=Start minimal
-showjobstatus.Restart=Restart
-showjobstatus.Restartminimal=Restart minimal
-showjobstatus.Pause=Pause
-showjobstatus.Abort=Abort
-showjobstatus.Resume=Resume
-showjobstatus.Startjob=Start job
-showjobstatus.minimally=minimally
-showjobstatus.Restartjob=Restart job
-showjobstatus.Pausejob=Pause job
-showjobstatus.Abortjob=Abort job
-showjobstatus.Resumejob=Resume job
-
-documentstatus.ApacheManifoldCFDocumentStatus=Apache ManifoldCF: Document Status
-documentstatus.DocumentStatus=Document Status
-documentstatus.Connection=Connection:
-documentstatus.TimeOffsetFromNowMinutes=Time offset from now (minutes):
-documentstatus.DocumentState=Document state:
-documentstatus.DocumentIdentifierMatch=Document identifier match:
-documentstatus.Go=Go
-documentstatus.ExecuteThisQuery=Execute this query
-documentstatus.Continue=Continue
-documentstatus.PleaseSelectAtLeastOneJob=Please select at least one job
-documentstatus.PleaseSelectaConnection=Please select a connection
-documentstatus.Previous=Previous
-documentstatus.Next=Next
-documentstatus.Rows=Rows:
-documentstatus.RowsPerPage=Rows per page:
-documentstatus.DocumentsThatHaveNeverBeenProcessed=Documents that have never been processed
-documentstatus.DocumentsProcessedAtLeastOnce=Documents processed at least once
-documentstatus.DocumentsOutOfScope=Documents that are out of scope
-documentstatus.DocumentsThatAreNoLongerActive=Documents that are no longer active
-documentstatus.DocumentsCurrentlyInProgress=Documents currently in progress
-documentstatus.DocumentsCurrentlyBeingExpired=Documents currently being expired
-documentstatus.DocumentsCurrentlyBeingDeleted=Documents currently being deleted
-documentstatus.DocumentsCurrentlyAvailableForProcessing=Documents currently available for processing
-documentstatus.DocumentsCurrentlyAvailableForExpiration=Documents currently available for expiration
-documentstatus.DocumentsNotYetProcessable=Documents not yet processable
-documentstatus.DocumentsNotYetExpirable=Documents not yet expirable
-documentstatus.DocumentsWaitingForever=Documents waiting forever
-documentstatus.DocumentsHopcountExceeded=Documents over hopcount limit
-documentstatus.NotSpecified=Not specified
-documentstatus.Jobs=Jobs:
-documentstatus.Identifier=Identifier
-documentstatus.Job=Job
-documentstatus.State=State
-documentstatus.Status=Status
-documentstatus.Scheduled=Scheduled
-documentstatus.ScheduledAction=Scheduled Action
-documentstatus.RetryCount=Retry Count
-documentstatus.RetryLimit=Retry Limit
-documentstatus.EnterALegalNumberForRowsPerPage=Enter a legal number for rows per page
-documentstatus.IdentifierMatchMustBeAValidRegularExpression=Identifier match must be a valid regular expression
-
-queuestatus.ApacheManifoldCFQueueStatus=Apache ManifoldCF: Queue Status
-queuestatus.QueueStatus=Queue Status
-queuestatus.Connection=Connection:
-queuestatus.NotSpecified=Not specified
-queuestatus.Jobs=Jobs:
-queuestatus.TimeOffsetFromNowMinutes=Time offset from now (minutes):
-queuestatus.DocumentState=Document state:
-queuestatus.DocumentIdentifierMatch=Document identifier match:
-queuestatus.IdentifierClassDescription=Identifier class description:
-queuestatus.Go=Go
-queuestatus.ExecuteThisQuery=Execute this query
-queuestatus.Continue=Continue
-queuestatus.PleaseSelectAtLeastOneJob=Please select at least one job
-queuestatus.PleaseSelectaConnection=Please select a connection
-queuestatus.DocumentsThatHaveNeverBeenProcessed=Documents that have never been processed
-queuestatus.DocumentsProcessedAtLeastOnce=Documents processed at least once
-queuestatus.DocumentsOutOfScope=Documents that are out of scope
-queuestatus.DocumentsThatAreNoLongerActive=Documents that are no longer active
-queuestatus.DocumentsCurrentlyInProgress=Documents currently in progress
-queuestatus.DocumentsCurrentlyBeingExpired=Documents currently being expired
-queuestatus.DocumentsCurrentlyBeingDeleted=Documents currently being deleted
-queuestatus.DocumentsCurrentlyAvailableForProcessing=Documents currently available for processing
-queuestatus.DocumentsCurrentlyAvailableForExpiration=Documents currently available for expiration
-queuestatus.DocumentsNotYetProcessable=Documents not yet processable
-queuestatus.DocumentsNotYetExpirable=Documents not yet expirable
-queuestatus.DocumentsWaitingForever=Documents waiting forever
-queuestatus.DocumentsHopcountExceeded=Documents over hopcount limit
-queuestatus.Rows=Rows:
-queuestatus.RowsPerPage=Rows per page:
-queuestatus.IdentifierClass=Identifier Class
-queuestatus.Inactive=Inactive
-queuestatus.Processing=Processing
-queuestatus.Expiring=Expiring
-queuestatus.Deleting=Deleting
-queuestatus.AboutToProcess=About to Process
-queuestatus.AboutToExpire=About to Expire
-queuestatus.WaitingForProcessing=Waiting for Processing
-queuestatus.WaitingForExpiration=Waiting for Expiration
-queuestatus.WaitingForever=Waiting Forever
-queuestatus.HopcountExceeded=Hopcount Exceeded
-queuestatus.Previous=Previous
-queuestatus.PreviousPage=Previous page
-queuestatus.Next=Next
-queuestatus.NextPage=Next page
-queuestatus.IdentifierClassDescriptionCannotBeEmpty=Identifier class description cannot be empty
-queuestatus.IdentifierClassDescriptionMustBeAValidRegularExpression=Identifier class description must be a valid regular expression
-queuestatus.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Identifier class description must delimit a class with parentheses ('(' and ')')
-queuestatus.EnterALegalNumberForRowsPerPage=Enter a legal number for rows per page
-queuestatus.IdentifierMatchMustBeAValidRegularExpression=Identifier match must be a valid regular expression
-
-simplereport.ApacheManifoldCFSimpleHistoryReport=Apache ManifoldCF: Simple History Report
-simplereport.SimpleHistoryReport=Simple History Report
-simplereport.Connection=Connection:
-simplereport.NotSpecified=Not specified
-simplereport.on= on 
-simplereport.Activities=Activities:
-simplereport.StartTime=Start time:
-simplereport.EndTime=End time:
-simplereport.January=January
-simplereport.February=February
-simplereport.March=March
-simplereport.April=April
-simplereport.May=May
-simplereport.June=June
-simplereport.July=July
-simplereport.August=August
-simplereport.September=September
-simplereport.October=October
-simplereport.November=November
-simplereport.December=December
-simplereport.EntityMatch=Entity match:
-simplereport.ResultCodeMatch=Result code match:
-simplereport.Go=Go
-simplereport.ExecuteThisQuery=Execute this query
-simplereport.Continue=Continue
-simplereport.StartTime=Start Time
-simplereport.Activity=Activity
-simplereport.Identifier=Identifier
-simplereport.ResultCode=Result Code
-simplereport.Bytes=Bytes
-simplereport.Time=Time
-simplereport.ResultDescription=Result Description
-simplereport.Previous=Previous
-simplereport.PreviousPage=Previous page
-simplereport.NextPage=Next page
-simplereport.Next=Next
-simplereport.Rows=Rows:
-simplereport.RowsPerPage=Rows per page:
-simplereport.PleaseSelectAConnection=Please select a connection
-simplereport.EnterALegalNumberForRowsPerPage=Enter a legal number for rows per page
-simplereport.EntityMatchMustBeAValidRegularExpression=Entity match must be a valid regular expression
-simplereport.ResultCodeMatchMustBeAValidRegularExpression=Result code match must be a valid regular expression
-
-maxactivityreport.ApacheManifoldCFMaximumActivityReport=Apache ManifoldCF: Maximum Activity Report
-maxactivityreport.MaximumActivityReport=Maximum Activity Report
-maxactivityreport.Connection=Connection:
-maxactivityreport.NotSpecified=Not specified
-maxactivityreport.on=on
-maxactivityreport.Activities=Activities:
-maxactivityreport.StartTime=Start time:
-maxactivityreport.EndTime=End time:
-maxactivityreport.January=January
-maxactivityreport.February=February
-maxactivityreport.March=March
-maxactivityreport.April=April
-maxactivityreport.May=May
-maxactivityreport.June=June
-maxactivityreport.July=July
-maxactivityreport.August=August
-maxactivityreport.September=September
-maxactivityreport.October=October
-maxactivityreport.November=November
-maxactivityreport.December=December
-maxactivityreport.EntityMatch=Entity match:
-maxactivityreport.ResultCodeMatch=Result code match:
-maxactivityreport.Go=Go
-maxactivityreport.ExecuteThisQuery=Execute this query
-maxactivityreport.Continue=Continue
-maxactivityreport.IdentifierClass=Identifier Class
-maxactivityreport.StartTime=Start Time
-maxactivityreport.IdentifierClassDescription=Identifier class description:
-maxactivityreport.HighestActivityRate=Highest Activity Rate [per min]
-maxactivityreport.SlidingWindowSize=Sliding window size (minutes):
-maxactivityreport.Previous=Previous
-maxactivityreport.PreviousPage=Previous page
-maxactivityreport.NextPage=Next page
-maxactivityreport.Next=Next
-maxactivityreport.Rows=Rows:
-maxactivityreport.RowsPerPage=Rows per page:
-maxactivityreport.PleaseSelectAConnection=Please select a connection
-maxactivityreport.EnterALegalNumberForRowsPerPage=Enter a legal number for rows per page
-maxactivityreport.EnterALegalIntervalSizeInMinutes=Enter a legal interval size, in minutes
-maxactivityreport.IdentifierClassDescriptionCannotBeEmpty=Identifier class description cannot be empty
-maxactivityreport.IdentifierClassDescriptionMustBeAValidRegularExpression=Identifier class description must be a valid regular expression
-maxactivityreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Identifier class description must delimit a class with parentheses ('(' and ')')
-maxactivityreport.EntityMatchMustBeAValidRegularExpression=Entity match must be a valid regular expression
-maxactivityreport.ResultCodeMatchMustBeAValidRegularExpression=Result code match must be a valid regular expression
-
-maxbandwidthreport.ApacheManifoldCFMaximumBandwidthReport=Apache ManifoldCF: Maximum Bandwidth Report
-maxbandwidthreport.MaximumBandwidthReport=Maximum Bandwidth Report
-maxbandwidthreport.Connection=Connection:
-maxbandwidthreport.NotSpecified=Not specified
-maxbandwidthreport.on=on
-maxbandwidthreport.Activities=Activities:
-maxbandwidthreport.StartTime=Start time:
-maxbandwidthreport.EndTime=End time:
-maxbandwidthreport.January=January
-maxbandwidthreport.February=February
-maxbandwidthreport.March=March
-maxbandwidthreport.April=April
-maxbandwidthreport.May=May
-maxbandwidthreport.June=June
-maxbandwidthreport.July=July
-maxbandwidthreport.August=August
-maxbandwidthreport.September=September
-maxbandwidthreport.October=October
-maxbandwidthreport.November=November
-maxbandwidthreport.December=December
-maxbandwidthreport.EntityMatch=Entity match:
-maxbandwidthreport.ResultCodeMatch=Result code match:
-maxbandwidthreport.Go=Go
-maxbandwidthreport.ExecuteThisQuery=Execute this query
-maxbandwidthreport.Continue=Continue
-maxbandwidthreport.IdentifierClass=Identifier Class
-maxbandwidthreport.HighestBandwidth=Highest Bandwidth [bps]
-maxbandwidthreport.StartTime=Start Time
-maxbandwidthreport.IdentifierClassDescription=Identifier class description:
-maxbandwidthreport.SlidingWindowSize=Sliding window size (minutes):
-maxbandwidthreport.Previous=Previous
-maxbandwidthreport.PreviousPage=Previous page
-maxbandwidthreport.NextPage=Next page
-maxbandwidthreport.Next=Next
-maxbandwidthreport.RowsPerPage=Rows per page:
-maxbandwidthreport.PleaseSelectAConnection=Please select a connection
-maxbandwidthreport.HighestBandwidth2=Highest Bandwith
-maxbandwidthreport.Rows=Rows:
-maxbandwidthreport.Next=Next
-maxbandwidthreport.EnterALegalNumberForRowsPerPage=Enter a legal number for rows per page
-maxbandwidthreport.EnterALegalIntervalSizeInMinutes=Enter a legal interval size, in minutes
-maxbandwidthreport.IdentifierClassDescriptionCannotBeEmpty=Identifier class description cannot be empty
-maxbandwidthreport.IdentifierClassDescriptionMustBeAValidRegularExpression=Identifier class description must be a valid regular expression
-maxbandwidthreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Identifier class description must delimit a class with parentheses ('(' and ')')
-maxbandwidthreport.EntityMatchMustBeAValidRegularExpression=Entity match must be a valid regular expression
-maxbandwidthreport.ResultCodeMatchMustBeAValidRegularExpression=Result code match must be a valid regular expression
-
-resultreport.ApacheManifoldCFActivityResultReport=Apache ManifoldCF: Activity Result Report
-resultreport.ActivityResultReport=Activity Result Report
-resultreport.Connection=Connection:
-resultreport.NotSpecified=Not specified
-resultreport.on=on
-resultreport.Activities=Activities:
-resultreport.StartTime=Start time:
-resultreport.EndTime=End time:
-resultreport.January=January
-resultreport.February=February
-resultreport.March=March
-resultreport.April=April
-resultreport.May=May
-resultreport.June=June
-resultreport.July=July
-resultreport.August=August
-resultreport.September=September
-resultreport.October=October
-resultreport.November=November
-resultreport.December=December
-resultreport.EntityMatch=Entity match:
-resultreport.ResultCodeMatch=Result code match:
-resultreport.Go=Go
-resultreport.ExecuteThisQuery=Execute this query
-resultreport.Continue=Continue
-resultreport.IdentifierClassDescription=Identifier class description:
-resultreport.ResultCodeClassDescription=Result code class description:
-resultreport.Previous=Previous
-resultreport.PreviousPage=Previous page
-resultreport.NextPage=Next page
-resultreport.Next=Next
-resultreport.Rows=Rows:
-resultreport.RowsPerPage=Rows per page:
-resultreport.PleaseSelectAConnection=Please select a connection
-resultreport.IdentifierClass=Identifier Class
-resultreport.ResultClass=Result Class
-resultreport.EventCount=Event Count
-resultreport.Next=Next
-resultreport.EnterALegalNumberForRowsPerPage=Enter a legal number for rows per page
-resultreport.IdentifierClassDescriptionCannotBeEmpty=Identifier class description cannot be empty
-resultreport.ResultClassDescriptionCannotBeEmpty=Result class description cannot be empty
-resultreport.IdentifierClassDescriptionMustBeAValidRegularExpression=Identifier class description must be a valid regular expression
-resultreport.ResultClassDescriptionMustBeAValidRegularExpression=Result class description must be a valid regular expression
-resultreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Identifier class description must delimit a class with parentheses ('(' and ')')
-resultreport.ResultClassDescriptionMustDelimitAClassWithParentheses=Result class description must delimit a class with parentheses ('(' and ')')
-resultreport.EntityMatchMustBeAValidRegularExpression=Entity match must be a valid regular expression
-resultreport.ResultCodeMatchMustBeAValidRegularExpression=Result code match must be a valid regular expression
-
-error.ApacheManifoldCFError=Apache ManifoldCF: Error
-error.Error=Error!
-error.Return=Return
-error.Unauthorized=Apache ManifoldCF: Unauthorized activity
-error.UnauthorizedAccess=You do not have permissions to perform this activity
-error.ApacheManifoldCFMaintenanceUnderway=Apache ManifoldCF: Maintenance underway
-error.MaintenanceUnderway=Maintenance underway
-error.PleaseTryAgainLater=This page is unavailable due to maintenance operations.  Please try again later.
-
-viewjob.ApacheManifoldCFViewJob=Apache ManifoldCF: View Job
-viewjob.ViewAJob=View a Job
-
-viewjob.PipelineColon=Pipeline:
-viewjob.StageNumber=Stage
-viewjob.StageType=Type
-viewjob.StagePrecedent=Precedent
-viewjob.StageDescription=Description
-viewjob.StageConnectionName=Connection name
-viewjob.Repository=Repository
-viewjob.Output=Output
-viewjob.Transformation=Transformation
-
-viewjob.ScheduleTypeColon=Schedule type:
-viewjob.MinimumRecrawlIntervalColon=Minimum recrawl interval:
-viewjob.MaximumRecrawlIntervalColon=Maximum recrawl interval:
-viewjob.ExpirationIntervalColon=Expiration interval:
-viewjob.ReseedIntervalColon=Reseed interval:
-viewjob.NoScheduledRunTimes=No scheduled run times
-viewjob.ScheduledTimeColon=Scheduled time:
-viewjob.MaximumRunTimeColon=Maximum run time:
-viewjob.MaximumHopCountForLinkType=Maximum hop count for link type
-viewjob.HopCountModeColon=Hop count mode:
-viewjob.Delete=Delete
-viewjob.DeleteThisJob=Delete this job
-viewjob.Edit=Edit
-viewjob.EditThisJob=Edit this job
-viewjob.Copy=Copy
-viewjob.CopyThisJob=Copy this job
-viewjob.ResetSeeding=Reset seeding
-viewjob.ResetSeedingThisJob=Reset incremental seeding for this job
-viewjob.NameColon=Name:
-viewjob.OutputConnectionColon=Output connection:
-viewjob.RepositoryConnectionColon=Repository connection:
-viewjob.PriorityColon=Priority:
-viewjob.StartMethodColon=Start method:
-viewjob.ForcedMetadataColon=Forced metadata:
-viewjob.NoForcedMetadata=No forced metadata
-viewjob.DeleteJobConfirmation=Warning: Deleting this job will remove all\nassociated documents from the index.\nDo you want to proceed?
-viewjob.StartOverConfirmation=Warning: This action will cause all job documents to be checked during the next job run.\nDo you want to proceed?
-viewjob.Notapplicable=Not applicable
-viewjob.Rescandocumentsdynamically=Rescan documents dynamically
-viewjob.Infinity=Infinity
-viewjob.minutes=minutes
-viewjob.Scaneverydocumentonce=Scan every document once
-viewjob.Startatbeginningofschedulewindow=Start at beginning of schedule window
-viewjob.Startinsideschedulewindow=Start inside schedule window
-viewjob.Dontautomaticallystart=Don't automatically start
-viewjob.Anydayoftheweek=Any day of week
-viewjob.Sundays=Sundays
-viewjob.Mondays=Mondays
-viewjob.Tuesdays=Tuesdays
-viewjob.Wednesdays=Wednesdays
-viewjob.Thursdays=Thursdays
-viewjob.Fridays=Fridays
-viewjob.Saturdays=Saturdays
-viewjob.oneveryhour=on every hour
-viewjob.atmidnight=at midnight
-viewjob.at=at
-viewjob.am=am
-viewjob.pm=pm
-viewjob.plus=plus
-viewjob.ineverymonthofyear=in every month of the year
-viewjob.in=in
-viewjob.January=January
-viewjob.February=February
-viewjob.March=March
-viewjob.April=April
-viewjob.May=May
-viewjob.June=June
-viewjob.July=July
-viewjob.August=August
-viewjob.September=September
-viewjob.October=October
-viewjob.November=November
-viewjob.December=December
-viewjob.onanydayofthemonth=on any day of the month
-viewjob.onthe1stofthemonth=on the 1st of the month
-viewjob.onthe=on the
-viewjob.ofthemonth=of the month
-viewjob.inyears=in year(s)
-viewjob.Nolimit=No limit
-viewjob.Unlimited=Unlimited
-viewjob.Deleteunreachabledocuments=Delete unreachable documents
-viewjob.Nodeletesfornow=No deletes, for now
-viewjob.Nodeletesforever=No deletes, forever
-viewjob.st=st
-viewjob.nd=nd
-viewjob.rd=rd
-viewjob.th=th
-viewjob.JobInvocationColon=Job invocation:
-viewjob.Minimal=Minimal
-viewjob.Complete=Complete
-
-viewgroup.ApacheManifoldCFViewGroup=Apache ManifoldCF: View Authority Group
-viewgroup.ViewAuthorityGroup=View Authority Group
-viewgroup.NameColon=Name:
-viewgroup.DescriptionColon=Description:
-viewgroup.EditThisAuthorityGroup=Edit this authority group
-viewgroup.Edit=Edit
-viewgroup.DeleteThisAuthorityGroup=Delete this authority group
-viewgroup.Delete=Delete
-
-viewauthority.ViewAuthorityConnectionStatus=View Authority Connection Status
-viewauthority.NameColon=Name:
-viewauthority.DescriptionColon=Description:
-viewauthority.AuthorityTypeColon=Authority type:
-viewauthority.MaxConnectionsColon=Max connections:
-viewauthority.ConnectionStatusColon=Connection status:
-viewauthority.Refresh=Refresh
-viewauthority.Edit=Edit
-viewauthority.EditThisAuthorityConnection=Edit this authority connection
-viewauthority.Delete=Delete
-viewauthority.DeleteThisAuthorityConnection=Delete this authority connection
-viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus=Apache ManifoldCF: View Authority Connection Status
-viewauthority.DeleteConnection=Delete connection
-viewauthority.Connectorisnotinstalled=Connector is not installed.
-viewauthority.uninstalled=(uninstalled)
-viewauthority.Threwexception=Threw exception:
-viewauthority.qmark=?
-viewauthority.PrerequisiteUserMappingColon=Prerequisite user mapping:
-viewauthority.NoPrerequisites=No prerequisites
-viewauthority.AuthorizationDomainColon=Authorization domain:
-viewauthority.AuthorityGroupColon=Authority group:
-
-viewmapper.ApacheManifoldCFViewMappingConnectionStatus=Apache ManifoldCF: View Mapping Connection Status
-viewmapper.DeleteConnection=Delete connection
-viewmapper.ViewMappingConnectionStatus=View Mapping Connection Status
-viewmapper.uninstalled=(uninstalled)
-viewmapper.Connectorisnotinstalled=Connector is not installed.
-viewmapper.Threwexception=Threw exception:
-viewmapper.NameColon=Name:
-viewmapper.DescriptionColon=Description:
-viewmapper.MapperTypeColon=Mapping type:
-viewmapper.MaxConnectionsColon=Max connections:
-viewmapper.ConnectionStatusColon=Connection status:
-viewmapper.Refresh=Refresh
-viewmapper.Edit=Edit
-viewmapper.EditThisMappingConnection=Edit this mapping connection
-viewmapper.Delete=Delete
-viewmapper.DeleteThisMappingConnection=Delete this mapping connection
-viewmapper.qmark=?
-viewmapper.PrerequisiteUserMappingColon=Prerequisite user mapping:
-viewmapper.NoPrerequisites=No prerequisites
-
-edittransformation.NoTransformationConnectorsRegistered=No transformation connectors registered
-editoutput.NoOutputConnectorsRegistered=No output connectors registered
-editnotification.NoNotificationConnectorsRegistered=No notification connectors registered
-editnotification.Name=Name
-editnotification.Type=Type
-editnotification.Throttling=Throttling
-editnotification.ApacheManifoldCFEditNotificationConnection=Apache ManifoldCF: Edit Notification Connection
-editnotification.ConnectionMustHaveAName=Connection must have a name
-editnotification.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-editnotification.EditNotificationConnection2=Edit Notification Connection
-editnotification.EditNotificationConnection=Edit notification connection
-editnotification.EditANotificationConnection=Edit a notification connection
-editnotification.tab=tab
-editnotification.NameColon=Name:
-editnotification.DescriptionColon=Description:
-editnotification.TypeColon=Type:
-editnotification.UNREGISTERED=UNREGISTERED
-editnotification.ConnectionTypeColon=Connection type:
-editnotification.MaxConnectionsColon=Max connections:
-editnotification.Save=Save
-editnotification.Continue=Continue
-editnotification.SaveThisNotificationConnection=Save this notification connection
-editnotification.ContinueToNextPage=Continue to next page
-editnotification.Cancel=Cancel
-editnotification.CancelNotificationConnectionEditing=Cancel notification connection editing
-
-listnotifications.ApacheManifoldCFListNotificationConnections=Apache ManifoldCF: List Notification Connections
-listnotifications.DeleteNotificationConnection=Delete notification connection
-listnotifications.ListOfNotificationConnections=List of Notification Connections
-listnotifications.Name=Name
-listnotifications.Description=Description
-listnotifications.ConnectionType=Connection Type
-listnotifications.Max=Max
-listnotifications.uninstalled=(uninstalled)
-listnotifications.View=View
-listnotifications.Edit=Edit
-listnotifications.Delete=Delete
-listnotifications.AddANotificationConnection=Add a notification connection
-listnotifications.AddaNewNotificationConnection=Add a new notification connection
-listnotifications.DeleteNotificationConnection=Delete notification connection
-
-viewnotification.ApacheManifoldCFViewNotificationConnectionStatus=Apache ManifoldCF: View Notification Connection Status
-viewnotification.Deletenotificationconnection=Delete notification connection
-viewnotification.qmark=?
-viewnotification.ViewNotificationConnectionStatus=View Notification Connection Status
-viewnotification.uninstalled=(uninstalled)
-viewnotification.Connectorisnotinstalled=Connector is not installed
-viewnotification.Threwexception=Threw exception:
-viewnotification.NameColon=Name:
-viewnotification.DescriptionColon=Description:
-viewnotification.ConnectionTypeColon=Connection type:
-viewnotification.MaxConnectionsColon=Max connections:
-viewnotification.ConnectionStatusColon=Connection status:
-viewnotification.Refresh=Refresh
-viewnotification.EditThisNotificationConnection=Edit this notification connection
-viewnotification.Edit=Edit
-viewnotification.DeleteThisNotificationConnection=Delete this notification connection
-viewnotification.Delete=Delete
-
-navigation.Listnotificationconnections=List notification connections
-navigation.ListNotificationConnections=List Notification Connections
-
-editjob.SelectANotificationConnectionName=Select a notification connection name
-editjob.NotificationsColon=Notifications:
-editjob.NotificationDescription=Description
-editjob.NotificationConnectionName=Connection name
-editjob.Deletenotification=Delete notification
-editjob.AddNotification=Add notification
-editjob.AddANotification=Add a notification
-
-viewjob.NotificationsColon=Notifications:
-viewjob.NotificationDescription=Description
-viewjob.NotificationConnectionName=Connection name
-viewjob.NoNotificationConnections=No notification connections
diff --git a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_es_ES.properties b/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_es_ES.properties
deleted file mode 100644
index 5c3bfd6..0000000
--- a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_es_ES.properties
+++ /dev/null
@@ -1,1072 +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.
-
-editconnection.Name=Nombre
-editconnection.Type=Tipo
-editconnection.Throttling=Acelerando
-editconnection.Addthrottle=Añadir acelerador
-editjob.Name=Nombre
-editjob.Connection=Conexión
-
-viewconnection.NoneGlobalAuthority=Ninguno (autoridad mundial)
-viewconnection.ClearHistoryAssociatedWithThisConnection=Borrar historial asociado con esta conexión
-viewconnection.ClearAllRelatedHistory=Borrar historial de todos ellos relacionados
-viewconnection.Thiscommandwillclearallhistoryrelatedto=Este comando borrará toda la historia relacionada con la conexión
-viewconnection.period=.
-
-listconnections.GlobalAuthority=Ninguno(Autoridad mundial)
-
-editjob.Scheduling=programación
-editjob.HopFilters=Filtros de Salto
-editjob.am=am
-editjob.pm=pm
-
-index.TheApacheSoftwareFoundation=The Apache® Software Foundation
-index.Copyright=Copyright© 2010-2017
-index.ApacheManifoldCF=Apache ManifoldCF™
-index.WelcomeToApacheManifoldFC=Bienvenido a Apache ManifoldCF™
-index.ApacheManifoldCFLogin=Apache ManifoldCF™ Entrar
-index.UserIDColon=ID de usuario:
-index.PasswordColon=Contraseña:
-index.Login=Iniciar sesión
-index.LoginFailed=error de inicio de sesion!
-
-errorCode.ServerDown=Couldn't connect to the server. Please check if the server is up and running.
-errorCode.InternalServerError=Oops! Looks like something went wrong.
-
-banner.DocumentIngestion=Ingreso de Documento
-
-navigation.LogOut=Cerrar la Sesión
-navigation.Outputs=Salidas
-navigation.ListTransformationConnections=Lista de Conexiones de Transformación
-navigation.ListOutputConnections=Conexiones Lista de Salida
-navigation.Authorities=Autoridades
-navigation.ListUserMappings=Asignación de Usuarios de la Lista de Conexiones
-navigation.ListAuthorityConnections=Lista de Conexiones de Autoridad
-navigation.ListAuthorityGroups=Lista de Grupos de Autoridad
-navigation.Repositories=Repositorios
-navigation.ListRepositoryConnections=Lista de Conexiones del Repositorio
-navigation.Jobs=Trabajo
-navigation.ListAllJobs=Listar todos los Trabajos
-navigation.StatusAndJobManagement=Estado y Gestión de Trabajos
-navigation.StatusReports=Reporte de Estado
-navigation.DocumentStatus=Estado del Documento
-navigation.QueueStatus=Estado de la Cola
-navigation.HistoryReports=Reportes de Historial
-navigation.SimpleHistory=Historia Simple
-navigation.MaximumActivity=Actividad Máxima
-navigation.MaximumBandwidth=Máximo ancho de Banda
-navigation.ResultHistogram=Histograma de Resultados
-navigation.Miscellaneous=Mixto
-navigation.Locale=es_ES
-navigation.Help=Ayuda
-navigation.Listtransformationconnections=Conexiones de transformación Lista
-navigation.Listoutputconnections=Conexiones de salida de lista
-navigation.Listrepositoryconnections=Conexiones de repositorio Lista
-navigation.Listusermappings=Lista de conexiones de correlación de usuario
-navigation.Listauthorities=Autoridades de lista
-navigation.Listauthoritygroups=Grupos de autoridad de lista
-navigation.Listjobs=Empleos de lista
-navigation.Managejobs=administrar trabajos
-navigation.Documentstatus=estado del documento
-navigation.Queuestatus=estado de la cola
-navigation.Simplehistory=historia simple
-navigation.Maximumactivity=La actividad máxima
-navigation.Maximumbandwidth=Máximo ancho de Banda
-navigation.Resulthistogram=Histograma de Resultados
-
-listoutputs.ApacheManifoldCFListOutputConnections=Apache ManifoldCF: Conexiones Lista de Salida
-listoutputs.ListOfOutputConnections=Lista de Conexiones de Salida
-listoutputs.Name=Nombre
-listoutputs.Description=Descripción
-listoutputs.ConnectionType=Tipo de conección
-listoutputs.Max=Max
-listoutputs.AddaNewOutputConnection=Añadir una nueva conexión de salida
-listoutputs.View=Ver
-listoutputs.Edit=Editar
-listoutputs.Delete=Borrar
-listoutputs.DeleteOutputConnection=Eliminar conexión de salida
-listoutputs.AddAnOutputConnection=Agregar una conexión de salida
-listoutputs.uninstalled=(desinstalado)
-
-editoutput.ApacheManifoldCFEditOutputConnection=Apache ManifoldCF: Editar conexión de salida
-editoutput.Name=Nombre
-editoutput.Type=Tipo
-editoutput.Throttling=Acelerando
-editoutput.EditAnOutputConnection=Editar una conexión de salida
-editoutput.EditOutputConnection2=Editar conexión de salida
-editoutput.ConnectionTypeColon=Tipo de conección:
-editoutput.Continue=Continuar
-editoutput.ContinueToNextPage=Continúa en la página siguiente
-editoutput.Cancel=Cancelar
-editoutput.CancelOutputConnectionEditing=Cancelar la edición conexión de salida
-editoutput.Save=Guardar
-editoutput.SaveThisOutputConnection=Guardar esta conexión de salida
-editoutput.MaxConnectionsColon=conexiones Max:
-editoutput.EditOutputConnection=Conexión de salida de Editar
-editoutput.NameColon=Nombre:
-editoutput.DescriptionColon=Descripción:
-editoutput.ConnectionMustHaveAName=La conexión debe tener un nombre
-editoutput.TheMaximumNumberOfConnectionsMustBeAValidInteger=El número máximo de conexiones debe ser un entero válido
-editoutput.UNREGISTERED=NO REGISTRADO
-editoutput.tab=etiqueta
-
-viewoutput.ApacheManifoldCFViewOutputConnectionStatus=Apache ManifoldCF: Ver estado de la conexión de salida
-viewoutput.ViewOutputConnectionStatus=Ver estado de la conexión de salida
-viewoutput.NameColon=Nombre:
-viewoutput.DescriptionColon=Descripción:
-viewoutput.ConnectionTypeColon=Tipo de conección:
-viewoutput.MaxConnectionsColon=conexiones Max:
-viewoutput.ConnectionStatusColon=estado de la conexión:
-viewoutput.Refresh=Refrescar
-viewoutput.EditThisOutputConnection=Editar esta Conexión de salida
-viewoutput.Edit=Editar
-viewoutput.DeleteThisOutputConnection=Eliminar esta conexión de salida
-viewoutput.Delete=Borrar
-viewoutput.ReIngestAllDocumentsAssociatedWithThisOutputConnection=Re-índice todos los documentos asociados con esta conexión de salida
-viewoutput.ReIngestAllAssociatedDocuments=Re-índice todos los documentos asociados
-viewoutput.RemoveAllDocumentsAssociatedWithThisOutputConnection=Retire todos los registros de salida de documentos asociados a esta conexión de salida
-viewoutput.RemoveAllAssociatedDocuments=Eliminar todos los registros asociados
-viewoutput.Deleteoutputconnection=Eliminar conexión de salida
-viewoutput.Thiscommandwillforce=Este comando forzará a todos los documentos asociados a la producción\conexión
-viewoutput.toberecrawled=re-indexar la próxima vez que el documento se rastrea.\Desea continuar?
-viewoutput.Thiscommandwillcause=Este comando hará que ManifoldCF pierda todos los archivos de indexación de documentos\asociado con la conexión de salida
-viewoutput.tobeforgotten=.  Desea continuar?
-viewoutput.qmark=?
-viewoutput.uninstalled=(desinstalado)
-viewoutput.Connectorisnotinstalled=Conector no está instalado.
-viewoutput.Threwexception=lanzó excepción:
-
-listtransformations.ApacheManifoldCFListTransformationConnections=Apache ManifoldCF: Lista de Conexiones de Transformación
-listtransformations.ListOfTransformationConnections=Lista de Conexiones de Transformación
-listtransformations.Name=Nombre
-listtransformations.Description=Descripción
-listtransformations.ConnectionType=Tipo de conección
-listtransformations.Max=Max
-listtransformations.AddaNewTransformationConnection=Añadir una nueva conexión de transformación
-listtransformations.View=Ver
-listtransformations.Edit=Editar
-listtransformations.Delete=Borrar
-listtransformations.DeleteTransformationConnection=Eliminar conexión de transformación
-listtransformations.AddATransformationConnection=Agregar una conexión de transformación
-listtransformations.uninstalled=(desinstalado)
-
-edittransformation.ApacheManifoldCFEditTransformationConnection=Apache ManifoldCF: Conexión Editar Transformación
-edittransformation.Name=Nombre
-edittransformation.Type=Tipo
-edittransformation.Throttling=Acelerando
-edittransformation.EditATransformationConnection=Editar una conexión de transformación
-edittransformation.EditTransformationConnection2=Conexión Editar Transformación
-edittransformation.ConnectionTypeColon=Tipo de conección:
-edittransformation.Continue=Continuar
-edittransformation.ContinueToNextPage=Continúa en la página siguiente
-edittransformation.Cancel=Cancelar
-edittransformation.CancelTransformationConnectionEditing=Cancelar la edición conexión de transformación
-edittransformation.Save=Guardar
-edittransformation.SaveThisTransformationConnection=Guardar esta conexión de transformación
-edittransformation.MaxConnectionsColon=conexiones Max:
-edittransformation.EditTransformationConnection=Conexión de transformación de revisión
-edittransformation.NameColon=Nombre:
-edittransformation.DescriptionColon=Descripción:
-edittransformation.ConnectionMustHaveAName=La conexión debe tener un nombre
-edittransformation.TheMaximumNumberOfConnectionsMustBeAValidInteger=El número máximo de conexiones debe ser un entero válido
-edittransformation.UNREGISTERED=NO REGISTRADO
-edittransformation.tab=etiqueta
-
-viewtransformation.ApacheManifoldCFViewTransformationConnectionStatus=Apache ManifoldCF: Ver estado de la conexión de Transformación
-viewtransformation.ViewTransformationConnectionStatus=Ver estado de la conexión de Transformación
-viewtransformation.NameColon=Nombre:
-viewtransformation.DescriptionColon=Descripción:
-viewtransformation.ConnectionTypeColon=Tipo de conección:
-viewtransformation.MaxConnectionsColon=conexiones Max:
-viewtransformation.ConnectionStatusColon=estado de la conexión:
-viewtransformation.Refresh=Refrescar
-viewtransformation.EditThisTransformationConnection=Editar esta conexión de transformación
-viewtransformation.Edit=Editar
-viewtransformation.DeleteThisTransformationConnection=Eliminar esta conexión de transformación
-viewtransformation.Delete=Borrar
-viewtransformation.Deletetransformationconnection=Eliminar conexión de transformación
-viewtransformation.qmark=?
-viewtransformation.uninstalled=(desinstalado)
-viewtransformation.Connectorisnotinstalled=Conector no está instalado.
-viewtransformation.Threwexception=Lanzó excepción:
-
-listgroups.ApacheManifoldCFListAuthorityGroups=Apache ManifoldCF: Grupos de Autoridad de Lista
-listgroups.DeleteAuthorityGroup=Eliminar grupo de autorización
-listgroups.ListOfAuthorityGroups=Lista de Grupos de Autoridad
-listgroups.Name=Nombre
-listgroups.Description=Descripción
-listgroups.View=Ver
-listgroups.Edit=Editar
-listgroups.Delete=Borrar
-listgroups.AddNewGroup=Añadir un nuevo grupo de autorización
-listgroups.AddaNewGroup=Añadir un nuevo grupo de autorización
-
-listauthorities.ApacheManifoldCFListAuthorities=Apache ManifoldCF: Autoridades de la Lista
-listauthorities.ListOfAuthorityConnections=Lista de Conexiones de la Autoridad
-listauthorities.DeleteAuthority=eliminar autoridad
-listauthorities.Name=Nombre
-listauthorities.Description=Descripción
-listauthorities.AuthorityType=Tipo de Autoridad
-listauthorities.Max=Max
-listauthorities.AddaNewConnection=Añadir una nueva conexión
-listauthorities.AddNewConnection=Añadir una nueva conexión
-listauthorities.View=Ver
-listauthorities.Edit=Editar
-listauthorities.Delete=Borrar
-listauthorities.uninstalled=(desinstalado)
-
-listmappers.ApacheManifoldCFListMappers=Apache ManifoldCF: Lista de Usuario que traza un mapa
-listmappers.ListOfMappingConnections=Lista de Usuario que Traza un mapa de Conexiones
-listmappers.DeleteMapper=Eliminar asignador de usuario
-listmappers.Name=Nombre
-listmappers.Description=Descripción
-listmappers.MapperType=Trazar un mapa de Tipo
-listmappers.Max=Max
-listmappers.AddaNewConnection=Añadir una nueva conexión
-listmappers.AddNewConnection=Añadir una nueva conexión
-listmappers.View=Ver
-listmappers.Edit=Editar
-listmappers.Delete=Borrar
-listmappers.uninstalled=(desinstalado)
-
-editgroup.Name=Nombre
-editgroup.ApacheManifoldCFEditAuthorityGroup=Apache ManifoldCF: Grupo de Autoridad de Revisión
-editgroup.AuthorityGroupMustHaveAName=Grupo Autoridad debe tener un nombre
-editgroup.tab=etiqueta
-editgroup.EditGroup=Editar grupo
-editgroup.EditAGroup=Edición de un grupo
-editgroup.NameColon=Nombre:
-editgroup.DescriptionColon=Descripción:
-editgroup.Save=Guardar
-editgroup.SaveThisAuthorityGroup=Guarde este grupo de autorización
-editgroup.Cancel=Cancelar
-editgroup.CancelAuthorityGroupEditing=Cancelar la edición de grupo de autorización
-
-editauthority.ApacheManifoldCFEditAuthority=Apache ManifoldCF: Editar Autoridad
-editauthority.EditAnAuthority=Editar una Autoridad
-editauthority.NameColon=Nombre:
-editauthority.DescriptionColon=Descripción:
-editauthority.ConnectionTypeColon=Tipo de conección:
-editauthority.Continue=Continuar
-editauthority.ContinueToNextPage=Continúa en la página siguiente
-editauthority.MaxConnectionsColon=conexiones Max:
-editauthority.Cancel=Cancelar
-editauthority.CancelAuthorityEditing=Cancelar la edición de autoridad
-editauthority.Save=Guardar
-editauthority.SaveThisAuthorityConnection=Guarde esta conexión autoridad
-editauthority.EditAuthority=Editar autoridad
-editauthority.TheMaximumNumberOfConnectionsMustBeAValidInteger=El número máximo de conexiones debe ser un entero válido
-editauthority.ConnectionMustHaveAName=La conexión debe tener un nombre
-editauthority.NoAuthorityConnectorsRegistered=No hay conectores autoridad registrados
-editauthority.UNREGISTERED=NO REGISTRADO
-editauthority.tab=Etiqueta
-editauthority.Name=Nombre
-editauthority.Type=Tipo
-editauthority.Throttling=Acelerando
-editauthority.EditAuthorityConnection=Editar Autoridad Conexión
-editauthority.Prerequisites=Requisitos previos
-editauthority.PrerequisiteUserMappingColon=Trazar un mapa de usuario previamente necesario:
-editauthority.NoPrerequisites=(No hay requisitos previos)
-editauthority.AuthorizationDomainColon=Autorización de dominio:
-editauthority.AuthorityGroupColon=grupo de Autoridad:
-editauthority.SelectAGroup=--Seleccione un grupo--
-editauthority.ConnectionMustHaveAGroup=Conexión Autoridad debe tener un grupo
-editauthority.NoAuthorityGroupsDefinedCreateOneFirst=No hay grupos de autoridad se han definido ; crearla primero
-editauthority.DefaultDomainNone=dominio predeterminado (Ninguno)
-
-editmapper.ApacheManifoldCFEditMapping=Apache ManifoldCF: Trazar un mapa de Revisión
-editmapper.EditAMapping=Corrija un Trazado de mapa
-editmapper.NameColon=Nombre:
-editmapper.DescriptionColon=Descripción:
-editmapper.ConnectionTypeColon=Tipo de conección:
-editmapper.Continue=Continuar
-editmapper.ContinueToNextPage=Continúa en la página siguiente
-editmapper.MaxConnectionsColon=conexiones Max:
-editmapper.Cancel=Cancelar
-editmapper.CancelMappingEditing=Cancele el trazar un mapa de ediciòn
-editmapper.Save=Guardar
-editmapper.SaveThisMappingConnection=Guarde esta conexión de trazar un mapa
-editmapper.EditMapping=Editar asignador
-editmapper.TheMaximumNumberOfConnectionsMustBeAValidInteger=El número máximo de conexiones debe ser un entero válido
-editmapper.ConnectionMustHaveAName=La conexión debe tener un nombre
-editmapper.NoMappingConnectorsRegistered=Ninguno conectore de trazar un mapa de se registraron
-editmapper.UNREGISTERED=NO REGISTRADO
-editmapper.tab=etiqueta
-editmapper.Name=Nombre
-editmapper.Type=Tipo
-editmapper.Throttling=Acelerando
-editmapper.EditMappingConnection=Revisión que Traza un mapa de Conexión
-editmapper.Prerequisites=Requisitos previos
-editmapper.PrerequisiteUserMappingColon=Trazar un mapa de usuario previamente necesario:
-editmapper.NoPrerequisites=(Ningùn Requisito previo)
-
-listconnections.ApacheManifoldCFListConnections=Apache ManifoldCF: Conexiones de Lista
-listconnections.ListOfRepositoryConnections=Lista de Conexiones de Depósito
-listconnections.Name=Nombre
-listconnections.Description=Descripción
-listconnections.ConnectionType=Tipo de Conexión
-listconnections.AuthorityGroup=Grupo de Autoridad
-listconnections.Max=Max
-listconnections.AddNewConnection=Añada la nueva conexión
-listconnections.View=Ver
-listconnections.Edit=Editar
-listconnections.Delete=Borrar
-listconnections.DeleteConnection=eliminar conexión
-listconnections.AddAConnection=Agregar una conexión
-listconnections.uninstalled=(desinstalado)
-
-editconnection.ApacheManifoldCFEditConnection=Apache ManifoldCF: Editar conexión
-editconnection.EditAConnection=Edición de una conexión
-editconnection.ConnectionTypeColon=Tipo de conección:
-editconnection.AuthorityGroupColon=grupo de Autoridad:
-editconnection.Cancel=Cancelar
-editconnection.CancelConnectionEditing=Cancelar la edición conexión
-editconnection.NameColon=Nombre:
-editconnection.DescriptionColon=Descripción:
-editconnection.MaxconnectionsColon=conexiones Max:
-editconnection.ThrottlingColon=Acelerando:
-editconnection.Add=Añadir
-editconnection.BinRegularExpression=Expresión regular Bin
-editconnection.Description=Descripción
-editconnection.MaxAvgFetchesMin=Max promedio recuperaciones / min
-editconnection.NoThrottlingSpecified=Ninguna aceleraciòn especificada
-editconnection.Continue=Seguir
-editconnection.ContinueToNextPage=Continúa en la página siguiente
-editconnection.Save=Guardar
-editconnection.SaveThisAuthorityConnection=Guarde esta conexión
-editconnection.EditConnection=Editar conexión
-editconnection.GlobalAuthority=Ninguno (Autoridad global)
-editconnection.ConnectionMustHaveAName=La conexión debe tener un nombre
-editconnection.ThrottleRateMustBeAnInteger=Tasa del acelerador debe ser un entero
-editconnection.TheThrottleExpressionMustBeAValidRegularExpression=La expresión del acelerador debe ser una expresión regular válida
-editconnection.TheMaximumNumberOfConnectionsMustBeAValidInteger=El número máximo de conexiones debe ser un entero válido
-editconnection.EditRepositoryConnection=Conexión de Depósito de Revisión
-editconnection.NoRepositoryConnectorsRegistered=No hay conectores de repositorios registrados
-
-editconnection.UNREGISTERED=NO REGISTRADO
-editconnection.tab=etiqueta
-editconnection.Delete=Borrar
-editconnection.Deletethrottle=eliminar del acelerador
-
-viewconnection.ApacheManifoldCFViewRepositoryConnectionStatus=Apache ManifoldCF: Ver Repositorio Estado de la conexión
-viewconnection.ViewRepositoryConnectionStatus=Ver Repositorio Estado de la conexión
-viewconnection.NameColon=Nombre:
-viewconnection.DescriptionColon=Descripción:
-viewconnection.ConnectionTypeColon=Tipo de conección:
-viewconnection.MaxConnectionsColon=conexiones Max:
-viewconnection.AuthorityGroupColon=grupo de Autoridad:
-viewconnection.ThrottlingColon=Acelerando:
-viewconnection.NoThrottles=No hay aceleradores
-viewconnection.ConnectionStatusColon=estado de la conexión:
-viewconnection.Refresh=Refrescar
-viewconnection.EditThisConnection=Edite esta conexión
-viewconnection.Edit=Editar
-viewconnection.Delete=Borrar
-viewconnection.DeleteConnection=eliminar conexión
-viewconnection.Deletethisconnection=Eliminar esta conexión
-viewconnection.uninstalled=(desinstalado)
-viewconnection.Connectorisnotinstalled=Conector no está instalado.
-viewconnection.Threwexception=lanzó excepción:
-viewconnection.Binregularexpression=Expresión regular Bin
-viewconnection.Description=Descripción
-viewconnection.Maxavgfetches=Max promedio recuperaciones / min
-viewconnection.qmark=?
-
-listjobs.ApacheManifoldCFListJobDescriptions=Apache ManifoldCF: Descripciones de los puestos de lista
-listjobs.JobList=Lista de trabajos
-listjobs.Name=Nombre
-listjobs.OutputConnection=Conexión de salida
-listjobs.RepositoryConnection=Conexión Repositorio
-listjobs.ScheduleType=Tipo de programación
-listjobs.AddaNewJob=Añadir un nuevo trabajo
-listjobs.Addajob=Añadir un empleo
-listjobs.View=ver
-listjobs.Viewjob=Ver trabajo
-listjobs.Edit=Editar
-listjobs.Editjob=Editar trabajo
-listjobs.Delete=Borrar
-listjobs.DeleteJob=eliminar trabajo
-listjobs.Copy=Copia
-listjobs.CopyJob=Copia trabajo
-
-editjob.ApacheManifoldCFEditJob=Apache ManifoldCF: Editar trabajo
-editjob.EditaJob=Edición de un Trabajo
-editjob.EditJob=Editar trabajo
-
-editjob.PipelineColon=Tubería:
-editjob.StageNumber=Escenario
-editjob.StageType=Tipo
-editjob.StagePrecedent=Precedente
-editjob.StageDescription=Descripción
-editjob.StageConnectionName=Nombre de la conexión
-editjob.Repository=Repositorio
-editjob.Output=salida
-editjob.Transformation=Transformación
-editjob.InsertTransformationBefore=Inserte transformación antes
-editjob.InsertOutputBefore=Inserte de salida antes
-editjob.Insertnewstagehere=Inserte nueva etapa aquí
-editjob.SelectATransformationStageConnectionName=Seleccione un nombre de conexión etapa de transformación
-editjob.SelectAnOutputStageConnectionName=Seleccione un nombre de conexión etapa de salida
-editjob.AddAnOutput=Añadir una salida
-editjob.AddOutput=Añadir salida
-editjob.Deletepipelinestage=Eliminar etapa de canalización
-editjob.Insertnewtransformationhere=Inserte nueva transformación aquí
-editjob.Insertnewoutputhere=Insert new output here
-
-editjob.NoRepositoryConnectionsDefinedCreateOneFirst=No hay conexiones de repositorios definidos - crearla primero
-editjob.NoOutputConnectionsDefinedCreateOneFirst=No hay conexiones de salida definidos - crearla primero
-editjob.NameColon=Nombre:
-editjob.MaximumHopCountForType=Número máximo de saltos para el tipo
-editjob.colon=:
-editjob.cancel=Cancelar
-editjob.CancelJobEditing=Cancelar la edición de empleo
-editjob.OutputConnectionColon=conexión de salida:
-editjob.NoneSelected=Ninguna seleccionada
-editjob.PriorityColon=Prioridad:
-editjob.Highest=(Mayor)
-editjob.Lowest=(Menor)
-editjob.StartMethodColon=método Start:
-editjob.RepositoryConnectionColon=conexión Repositorio:
-editjob.Continue=Continuar
-editjob.ContinueToNextScreen=Continuar a la siguiente pantalla
-editjob.StartWhenScheduleWindowStarts=Empieza cuando se inicia ventana de programación
-editjob.StartEvenInsideAScheduleWindow=Comience incluso dentro de una ventana de horario
-editjob.DontAutomaticallyStartThisJob=No inicie automáticamente este trabajo
-editjob.ScheduleTypeColon=tipo de Horario:
-editjob.RescanDocumentsDynamically=Volver a examinar los documentos de forma dinámica
-editjob.ScanEveryDocumentOnce=Analiza todos los documentos una vez
-editjob.RecrawlIntervalIfContinuousColon=intervalo de nuevo rastreo (si continua):
-editjob.MaxRecrawlIntervalIfContinuousColon=Intervalo máximo nuevo rastreo (si continua):
-editjob.minutesBlankInfinity=minuto (en blanco = infinito)
-editjob.ExpirationIntervalIfContinuousColon=Intervalo de caducidad (si continua):
-editjob.ReseedIntervalIfContinuousColon=Reseed intervalo ( si continua):
-editjob.NoScheduleSpecified=Sin planificación especificada
-editjob.ScheduledTimeColon=Hora programada:
-editjob.AnyDayOfWeek=Cualquier día de la semana
-editjob.Sundays=domingos
-editjob.Mondays=lunes
-editjob.Tuesdays=martes
-editjob.Wednesdays=miércoles
-editjob.Thursdays=jueves
-editjob.Fridays=viernes
-editjob.Saturdays=sábados
-editjob.at=a
-editjob.MidnightAnyHourOfDay=Medianoche / cualquier hora del día
-editjob.plus=más
-editjob.Nothing=Nada
-editjob.minutes=minutos
-editjob.in=en
-editjob.EveryMonthOfYear=Cada mes del año
-editjob.January=enero
-editjob.February=febrero
-editjob.March=Marzo
-editjob.April=Abril
-editjob.May=Mayo
-editjob.June=Junio
-editjob.July=Julio
-editjob.August=Augosto
-editjob.September=Setiembre
-editjob.October=Octubre
-editjob.November=Noviembre
-editjob.December=Deciembre
-editjob.on=en
-editjob.AnyDayOfMonth=Cualquier día del mes
-editjob.MaximumRunTimeColon=El tiempo máximo de ejecución:
-editjob.RemoveSchedule=Retire Horario
-editjob.DeleteUnreachableDocuments=Eliminar documentos inalcanzables
-editjob.KeepUnreachableDocumentsForNow=Guarde los documentos inalcanzables, Por ahora
-editjob.KeepUnreachableDocumentsForever=Guarde los documentos inalcanzables, por sienpre
-editjob.HopCountModeColon=Modo de número de saltos:
-editjob.Save=Guardar
-editjob.SaveThisJob=Guardar esta búsqueda
-editjob.AddScheduledTime=Añadir hora programada
-editjob.AddNewScheduleRecord=Añadir nuevo registro de horario
-editjob.JobMustHaveAName=Trabajo debe tener un nombre
-editjob.DurationMustBeAValidInteger=Duración debe ser un entero válido
-editjob.RecrawlIntervalMustBeAValidIntegerOrNull=Intervalo de nuevo rastreo debe ser un número entero o nulo válida
-editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull=Intervalo máximo nuevo rastreo debe ser un número entero o nulo válida
-editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval=Intervalo máximo nuevo rastreo debe ser mayor que el intervalo de nuevo rastreo
-editjob.ReseedIntervalMustBeAValidIntegerOrNull=Reseed intervalo debe ser un número entero o nulo válida
-editjob.ExpirationIntervalMustBeAValidIntegerOrNull=Intervalo de caducidad debe ser un número entero o nulo válida
-editjob.RemoveScheduleRecord=Eliminar registro horario #
-editjob.ForcedMetadata=metadatos forzada
-editjob.ForcedMetadataColon=metadatos forzada:
-editjob.ParameterName=nombre del parámetro
-editjob.ParameterValue=valor del parámetro
-editjob.Deleteforcedmetadatanumber=Eliminar metadatos forzada #
-editjob.Delete=Borrar
-editjob.NoForcedMetadataSpecified=No hay metadatos forzados especificados
-editjob.Add=Añadir
-editjob.Addforcedmetadata=Añada metadata forzado
-editjob.ForcedMetadataNameMustNotBeNull=Nombre metadatos forzoso no debe ser nulo
-editjob.st=st
-editjob.nd=nd
-editjob.rd=rd
-editjob.th=th
-editjob.dayofmonth=día del mes
-editjob.JobInvocationColon=invocación de empleo:
-editjob.Minimal=Mínimo
-editjob.Complete=Completar
-
-editjob.tab=etiqueta
-
-showjobstatus.ApacheManifoldCFStatusOfAllJobs=Apache ManifoldCF: Estado de todos los empleos
-showjobstatus.Name=Nombre
-showjobstatus.Status=Estado
-showjobstatus.StartTime=Hora de inicio
-showjobstatus.EndTime=Hora de finalización
-showjobstatus.Documents=Documentos
-showjobstatus.Active=Activo
-showjobstatus.Processed=Procesado
-showjobstatus.RefreshStatus=Actualizar estado
-showjobstatus.Refresh=Refrescar
-showjobstatus.StatusOfJobs=Estado de los trabajos
-
-showjobstatus.Notyetrun=Todavía no ejecutar
-showjobstatus.Running=Corriendo
-showjobstatus.Runningnoconnector=Correr, sin conector
-showjobstatus.Aborting=Interrupciòn
-showjobstatus.Restarting=Reinicio
-showjobstatus.Stopping=Parada
-showjobstatus.Resuming=Reasumir
-showjobstatus.Paused=En pausa
-showjobstatus.Done=Hecho
-showjobstatus.Waiting=Esperando
-showjobstatus.Startingup=Empezando
-showjobstatus.Cleaningup=Limpiando
-showjobstatus.Terminating=Terminar
-showjobstatus.Endnotification=Notificación de final
-showjobstatus.ErrorColon=Error:
-showjobstatus.Unknown=Desconocido
-showjobstatus.Notstarted=No empezado
-showjobstatus.Aborted=Interrumpir
-showjobstatus.Neverrun=Nunca corriò
-showjobstatus.Start=Empezar
-showjobstatus.Startminimal=Principio mínimo
-showjobstatus.Restart=Reiniciar
-showjobstatus.Restartminimal=Reiniciar mínima
-showjobstatus.Pause=Pausa
-showjobstatus.Abort=Interrumpir
-showjobstatus.Resume=Resumen
-showjobstatus.Startjob=Comience trabajo
-showjobstatus.minimally=mínimamente
-showjobstatus.Restartjob=Reiniciar trabajo
-showjobstatus.Pausejob=trabajo Pausa
-showjobstatus.Abortjob=interrumpir trabajo
-showjobstatus.Resumejob=resumir trabajo
-
-documentstatus.ApacheManifoldCFDocumentStatus=Apache ManifoldCF: Estado del Documento
-documentstatus.DocumentStatus=Estado del Documento
-documentstatus.Connection=Conexión:
-documentstatus.TimeOffsetFromNowMinutes=Tiempo de desplazamiento a partir de ahora (minutos):
-documentstatus.DocumentState=estado del documento:
-documentstatus.DocumentIdentifierMatch=Documento partido identificador:
-documentstatus.Go=Ir
-documentstatus.ExecuteThisQuery=Ejecutar esta consulta
-documentstatus.Continue=Continuar
-documentstatus.PleaseSelectAtLeastOneJob=Por favor, seleccione al menos un puesto de trabajo
-documentstatus.PleaseSelectaConnection=Por favor, seleccione una conexión
-documentstatus.Previous=Anterior
-documentstatus.Next=Siguiente
-documentstatus.Rows=Filas:
-documentstatus.RowsPerPage=Filas por página:
-documentstatus.DocumentsThatHaveNeverBeenProcessed=Los documentos que no han sido procesados
-documentstatus.DocumentsProcessedAtLeastOnce=Documentos procesados al menos una vez
-documentstatus.DocumentsOutOfScope=Documentos que están fuera de alcance
-documentstatus.DocumentsThatAreNoLongerActive=Los documentos que ya no están activas
-documentstatus.DocumentsCurrentlyInProgress=Documentos actualmente en curso
-documentstatus.DocumentsCurrentlyBeingExpired=Documentos que se expiraron actualmente
-documentstatus.DocumentsCurrentlyBeingDeleted=Documentos que se eliminan actualmente
-documentstatus.DocumentsCurrentlyAvailableForProcessing=Documentos disponibles en la actualidad para el procesamiento
-documentstatus.DocumentsCurrentlyAvailableForExpiration=Documentos disponibles para la expiración
-documentstatus.DocumentsNotYetProcessable=Documentos aún no procesables
-documentstatus.DocumentsNotYetExpirable=Documentos aún no expirable
-documentstatus.DocumentsWaitingForever=Documentos de espera para siempre
-documentstatus.DocumentsHopcountExceeded=Documentos sobre límite de número de saltos
-documentstatus.NotSpecified=No especificado
-documentstatus.Jobs=Trabajo:
-documentstatus.Identifier=Identificador
-documentstatus.Job=Trabajo
-documentstatus.State=Estado
-documentstatus.Status=Estado
-documentstatus.Scheduled=Programado
-documentstatus.ScheduledAction=Acción programada
-documentstatus.RetryCount=Vuelva a intentar Conde
-documentstatus.RetryLimit=Límite de reintentos
-documentstatus.EnterALegalNumberForRowsPerPage=Introduzca un número legal de filas por página
-documentstatus.IdentifierMatchMustBeAValidRegularExpression=Partido identificador debe ser una expresión regular válida
-
-queuestatus.ApacheManifoldCFQueueStatus=Apache ManifoldCF: Estado de la Cola
-queuestatus.QueueStatus=Estado de la Cola
-queuestatus.Connection=Conexión:
-queuestatus.NotSpecified=No especificado
-queuestatus.Jobs=Trabajo:
-queuestatus.TimeOffsetFromNowMinutes=Desplazamiento desde ahora (minutos):
-queuestatus.DocumentState=estado del documento:
-queuestatus.DocumentIdentifierMatch=Documento partido identificador:
-queuestatus.IdentifierClassDescription=Descripción de la clase identificador:
-queuestatus.Go=Ir
-queuestatus.ExecuteThisQuery=Ejecutar esta consulta
-queuestatus.Continue=Continuar
-queuestatus.PleaseSelectAtLeastOneJob=Por favor, seleccione al menos un puesto de trabajo
-queuestatus.PleaseSelectaConnection=Por favor, seleccione una conexión
-queuestatus.DocumentsThatHaveNeverBeenProcessed=Los documentos que no han sido procesados
-queuestatus.DocumentsProcessedAtLeastOnce=Documentos procesados al menos una vez
-queuestatus.DocumentsOutOfScope=Documentos que están fuera de alcance
-queuestatus.DocumentsThatAreNoLongerActive=Los documentos que ya no están activas
-queuestatus.DocumentsCurrentlyInProgress=Documentos actualmente en curso
-queuestatus.DocumentsCurrentlyBeingExpired=Documentos que se expiraron actualmente
-queuestatus.DocumentsCurrentlyBeingDeleted=Documentos que se eliminan actualmente
-queuestatus.DocumentsCurrentlyAvailableForProcessing=Documentos disponibles en la actualidad para el procesamiento
-queuestatus.DocumentsCurrentlyAvailableForExpiration=Documentos disponibles para la expiración
-queuestatus.DocumentsNotYetProcessable=Documentos aún no procesables
-queuestatus.DocumentsNotYetExpirable=Documentos aún no expirable
-queuestatus.DocumentsWaitingForever=Documentos de espera para siempre
-queuestatus.DocumentsHopcountExceeded=Documentos sobre límite de número de saltos
-queuestatus.Rows=Filas:
-queuestatus.RowsPerPage=Filas por página:
-queuestatus.IdentifierClass=identificador de clase
-queuestatus.Inactive=Inactivo
-queuestatus.Processing=Tratamiento
-queuestatus.Expiring=Expiración
-queuestatus.Deleting=Borrado
-queuestatus.AboutToProcess=A punto de Proceso
-queuestatus.AboutToExpire=A punto de caducar
-queuestatus.WaitingForProcessing=A la espera de Procesamiento
-queuestatus.WaitingForExpiration=A la espera de Vencimiento
-queuestatus.WaitingForever=Esperando para siempre
-queuestatus.HopcountExceeded=Número de saltos excedido
-queuestatus.Previous=Anterior
-queuestatus.PreviousPage=Página anterior
-queuestatus.Next=Siguiente
-queuestatus.NextPage=Pagina siguiente
-queuestatus.IdentifierClassDescriptionCannotBeEmpty=Descripción de la clase identificador no puede estar vacío
-queuestatus.IdentifierClassDescriptionMustBeAValidRegularExpression=Descripción de la clase identificador debe ser una expresión regular válida
-queuestatus.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Descripción de la clase identificador debe delimitar una clase con paréntesis ('(' y ')')
-queuestatus.EnterALegalNumberForRowsPerPage=Introduzca un número legal de filas por página
-queuestatus.IdentifierMatchMustBeAValidRegularExpression=Partido identificador debe ser una expresión regular válida
-
-simplereport.ApacheManifoldCFSimpleHistoryReport=Apache ManifoldCF: Sencillo Reportar Historia
-simplereport.SimpleHistoryReport=Sencillo Reportar Historia
-simplereport.Connection=Conexión:
-simplereport.NotSpecified=No especificado
-simplereport.on= en
-simplereport.Activities=Ocupaciones:
-simplereport.StartTime=Hora de inicio:
-simplereport.EndTime=Hora de finalización:
-simplereport.January=Enero
-simplereport.February=Febrero
-simplereport.March=Marzo
-simplereport.April=Abril
-simplereport.May=Mayo
-simplereport.June=Junio
-simplereport.July=Julio
-simplereport.August=Augosto
-simplereport.September=Setiembre
-simplereport.October=Octubre
-simplereport.November=Noviembre
-simplereport.December=Diciembre
-simplereport.EntityMatch=partido Entidad:
-simplereport.ResultCodeMatch=Resultado partido código:
-simplereport.Go=Ir
-simplereport.ExecuteThisQuery=Ejecutar esta consulta
-simplereport.Continue=Continuar
-simplereport.StartTime=Hora de inicio
-simplereport.Activity=Actividad
-simplereport.Identifier=Identificador
-simplereport.ResultCode=Código Resultado
-simplereport.Bytes=Bytes
-simplereport.Time=Hora
-simplereport.ResultDescription=Resultado Descripción
-simplereport.Previous=Anterior
-simplereport.PreviousPage=Pagina anterior
-simplereport.NextPage=Pagina siguiente
-simplereport.Next=Siguiente
-simplereport.Rows=Filas:
-simplereport.RowsPerPage=Filas por página:
-simplereport.PleaseSelectAConnection=Por favor, seleccione una conexión
-simplereport.EnterALegalNumberForRowsPerPage=Introduzca un número legal de filas por página
-simplereport.EntityMatchMustBeAValidRegularExpression=Partido Entidad debe ser una expresión regular válida
-simplereport.ResultCodeMatchMustBeAValidRegularExpression=Partido de código de resultado debe ser una expresión regular válida
-
-maxactivityreport.ApacheManifoldCFMaximumActivityReport=Apache ManifoldCF: Informe Máxima Actividad
-maxactivityreport.MaximumActivityReport=Informe Máxima Actividad
-maxactivityreport.Connection=Conexión:
-maxactivityreport.NotSpecified=No especificado
-maxactivityreport.on=en
-maxactivityreport.Activities=Ocupaciones:
-maxactivityreport.StartTime=Hora de inicio:
-maxactivityreport.EndTime=Hora de finalización:
-maxactivityreport.January=Enero
-maxactivityreport.February=Febrero
-maxactivityreport.March=Marzo
-maxactivityreport.April=Abril
-maxactivityreport.May=Mayo
-maxactivityreport.June=Junio
-maxactivityreport.July=Julio
-maxactivityreport.August=Augosto
-maxactivityreport.September=Setiembre
-maxactivityreport.October=Octubre
-maxactivityreport.November=Noviembre
-maxactivityreport.December=Deciembre
-maxactivityreport.EntityMatch=partido Entidad:
-maxactivityreport.ResultCodeMatch=Resultado partido código:
-maxactivityreport.Go=Ir
-maxactivityreport.ExecuteThisQuery=Ejecutar esta consulta
-maxactivityreport.Continue=Continuar
-maxactivityreport.IdentifierClass=identificador de clase
-maxactivityreport.StartTime=Hora de inicio
-maxactivityreport.IdentifierClassDescription=Descripción de la clase identificador:
-maxactivityreport.HighestActivityRate=Mayor tasa de actividad [por min]
-maxactivityreport.SlidingWindowSize=Tamaño de la ventana deslizante (minutos):
-maxactivityreport.Previous=Anterior
-maxactivityreport.PreviousPage=Pagina anterior
-maxactivityreport.NextPage=Pagina siguiente
-maxactivityreport.Next=Siguiente
-maxactivityreport.Rows=Filas:
-maxactivityreport.RowsPerPage=Filas por página:
-maxactivityreport.PleaseSelectAConnection=Por favor, seleccione una conexión
-maxactivityreport.EnterALegalNumberForRowsPerPage=Introduzca un número legal de filas por página
-maxactivityreport.EnterALegalIntervalSizeInMinutes=Introduzca un tamaño legal intervalo, en minutos
-maxactivityreport.IdentifierClassDescriptionCannotBeEmpty=Descripción de la clase identificador no puede estar vacío
-maxactivityreport.IdentifierClassDescriptionMustBeAValidRegularExpression=Descripción de la clase identificador debe ser una expresión regular válida
-maxactivityreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Descripción de la clase identificador debe delimitar una clase con paréntesis ('(' y ')')
-maxactivityreport.EntityMatchMustBeAValidRegularExpression=Partido Entidad debe ser una expresión regular válida
-maxactivityreport.ResultCodeMatchMustBeAValidRegularExpression=Partido de código de resultado debe ser una expresión regular válida
-
-maxbandwidthreport.ApacheManifoldCFMaximumBandwidthReport=Apache ManifoldCF: Informe máximo de ancho de banda
-maxbandwidthreport.MaximumBandwidthReport=Informe máximo de ancho de banda
-maxbandwidthreport.Connection=Conexión:
-maxbandwidthreport.NotSpecified=No especificado
-maxbandwidthreport.on=en
-maxbandwidthreport.Activities=Ocupaciones:
-maxbandwidthreport.StartTime=Hora de inicio:
-maxbandwidthreport.EndTime=Hora de finalización:
-maxbandwidthreport.January=Enero
-maxbandwidthreport.February=Febrero
-maxbandwidthreport.March=Marzo
-maxbandwidthreport.April=Abril
-maxbandwidthreport.May=Mayo
-maxbandwidthreport.June=Junio
-maxbandwidthreport.July=Julio
-maxbandwidthreport.August=Augosto
-maxbandwidthreport.September=Setiembre
-maxbandwidthreport.October=Octubre
-maxbandwidthreport.November=Noviembre
-maxbandwidthreport.December=Deciembre
-maxbandwidthreport.EntityMatch=partido Entidad:
-maxbandwidthreport.ResultCodeMatch=Resultado partido código:
-maxbandwidthreport.Go=Ir
-maxbandwidthreport.ExecuteThisQuery=Ejecutar esta consulta
-maxbandwidthreport.Continue=Continuar
-maxbandwidthreport.IdentifierClass=identificador de clase
-maxbandwidthreport.HighestBandwidth=Mayor ancho de banda [bps]
-maxbandwidthreport.StartTime=Hora de inicio
-maxbandwidthreport.IdentifierClassDescription=Descripción de la clase identificador:
-maxbandwidthreport.SlidingWindowSize=Tamaño de la ventana deslizante (minutos):
-maxbandwidthreport.Previous=Anterior
-maxbandwidthreport.PreviousPage=Pagina anterior
-maxbandwidthreport.NextPage=Pagina siguiente
-maxbandwidthreport.Next=Siguiente
-maxbandwidthreport.RowsPerPage=Filas por página:
-maxbandwidthreport.PleaseSelectAConnection=Por favor, seleccione una conexión
-maxbandwidthreport.HighestBandwidth2=Mayor ancho de banda
-maxbandwidthreport.Rows=Filas:
-maxbandwidthreport.Next=Siguiente
-maxbandwidthreport.EnterALegalNumberForRowsPerPage=Introduzca un número legal de filas por página
-maxbandwidthreport.EnterALegalIntervalSizeInMinutes=Introduzca un tamaño legal intervalo, en minutos
-maxbandwidthreport.IdentifierClassDescriptionCannotBeEmpty=Descripción de la clase identificador no puede estar vacío
-maxbandwidthreport.IdentifierClassDescriptionMustBeAValidRegularExpression=Descripción de la clase identificador debe ser una expresión regular válida
-maxbandwidthreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Descripción de la clase identificador debe delimitar una clase con paréntesis ('(' y ')')
-maxbandwidthreport.EntityMatchMustBeAValidRegularExpression=Partido Entidad debe ser una expresión regular válida
-maxbandwidthreport.ResultCodeMatchMustBeAValidRegularExpression=Partido de código de resultado debe ser una expresión regular válida
-
-resultreport.ApacheManifoldCFActivityResultReport=Apache ManifoldCF: Actividad Resultado Informe
-resultreport.ActivityResultReport=Actividad Resultado Informe
-resultreport.Connection=Conexión:
-resultreport.NotSpecified=No especificado
-resultreport.on=en
-resultreport.Activities=Ocupaciones:
-resultreport.StartTime=Hora de inicio:
-resultreport.EndTime=Hora de finalización:
-resultreport.January=Enero
-resultreport.February=Febrero
-resultreport.March=Marzo
-resultreport.April=Abril
-resultreport.May=Mayo
-resultreport.June=Junio
-resultreport.July=Julio
-resultreport.August=Agosto
-resultreport.September=Setiembre
-resultreport.October=Octubre
-resultreport.November=Noviembre
-resultreport.December=Diciembre
-resultreport.EntityMatch=partido de Entidad:
-resultreport.ResultCodeMatch=partido de código de resultado:
-resultreport.Go=Ir
-resultreport.ExecuteThisQuery=Ejecutar esta consulta
-resultreport.Continue=Continuar
-resultreport.IdentifierClassDescription=Descripción de la clase identificador:
-resultreport.ResultCodeClassDescription=Resultado descripción de clase de código:
-resultreport.Previous=Anterior
-resultreport.PreviousPage=Pagina anterior
-resultreport.NextPage=Pagina siguiente
-resultreport.Next=Siguiente
-resultreport.Rows=Filas:
-resultreport.RowsPerPage=Filas por página:
-resultreport.PleaseSelectAConnection=Por favor, seleccione una conexión
-resultreport.IdentifierClass=identificador de clase
-resultreport.ResultClass=Resultado Clase
-resultreport.EventCount=Conteo de eventos
-resultreport.Next=Siguiente
-resultreport.EnterALegalNumberForRowsPerPage=Introduzca un número legal de filas por página
-resultreport.IdentifierClassDescriptionCannotBeEmpty=Descripción de la clase identificador no puede estar vacío
-resultreport.ResultClassDescriptionCannotBeEmpty=Descripción de la clase El resultado no puede estar vacío
-resultreport.IdentifierClassDescriptionMustBeAValidRegularExpression=Descripción de la clase identificador debe ser una expresión regular válida
-resultreport.ResultClassDescriptionMustBeAValidRegularExpression=Descripción de la clase El resultado debe ser una expresión regular válida
-resultreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=Descripción de la clase identificador debe delimitar una clase con paréntesis ('(' y ')')
-resultreport.ResultClassDescriptionMustDelimitAClassWithParentheses=Descripción de la clase El resultado debe delimitar una clase con paréntesis ('(' y ')')
-resultreport.EntityMatchMustBeAValidRegularExpression=Partido Entidad debe ser una expresión regular válida
-resultreport.ResultCodeMatchMustBeAValidRegularExpression=Partido de código de resultado debe ser una expresión regular válida
-
-error.ApacheManifoldCFError=Apache ManifoldCF: Error
-error.Error=Error!
-error.Return=Regreso
-error.Unauthorized=Apache ManifoldCF: la actividad no autorizada
-error.UnauthorizedAccess=Usted no tiene permisos para realizar esta actividad
-error.ApacheManifoldCFMaintenanceUnderway=Apache ManifoldCF: Mantenimiento en curso
-error.MaintenanceUnderway=Mantenimiento en curso
-error.PleaseTryAgainLater=Esta página no está disponible debido a las operaciones de mantenimiento. Por favor, inténtelo de nuevo más tarde.
-
-viewjob.ApacheManifoldCFViewJob=Apache ManifoldCF: Trabajo de Vista
-viewjob.ViewAJob=Vea un Trabajo
-
-viewjob.PipelineColon=Tubería:
-viewjob.StageNumber=Escenario
-viewjob.StageType=Tipo
-viewjob.StagePrecedent=Precedente
-viewjob.StageDescription=Descripción
-viewjob.StageConnectionName=Nombre de la conexión
-viewjob.Repository=Repositorio
-viewjob.Output=Producción
-viewjob.Transformation=Transformación
-
-viewjob.ScheduleTypeColon=tipo de Horario:
-viewjob.MinimumRecrawlIntervalColon=Intervalo de nuevo rastreo mínimo:
-viewjob.MaximumRecrawlIntervalColon=Intervalo máximo nuevo rastreo:
-viewjob.ExpirationIntervalColon=intervalo de caducidad:
-viewjob.ReseedIntervalColon=Intervalo de nueva semilla:
-viewjob.NoScheduledRunTimes=No hay tiempos de riego programados
-viewjob.ScheduledTimeColon=Hora programada:
-viewjob.MaximumRunTimeColon=El tiempo máximo de ejecución:
-viewjob.MaximumHopCountForLinkType=Número máximo de saltos para el tipo de enlace
-viewjob.HopCountModeColon=Modo de número de saltos:
-viewjob.Delete=Borrar
-viewjob.DeleteThisJob=Eliminar este trabajo
-viewjob.Edit=Editar
-viewjob.EditThisJob=Editar este trabajo
-viewjob.Copy=Copia
-viewjob.CopyThisJob=Copia este trabajo
-viewjob.ResetSeeding=Restablecer la siembra
-viewjob.ResetSeedingThisJob=Restablecer siembra incrementales para este trabajo
-viewjob.NameColon=Nombre:
-viewjob.OutputConnectionColon=conexión de salida:
-viewjob.RepositoryConnectionColon=conexión Repositorio:
-viewjob.PriorityColon=Prioridad:
-viewjob.StartMethodColon=Método de principio:
-viewjob.ForcedMetadataColon=metadatos forzada:
-viewjob.NoForcedMetadata=Sin metadatos forzada
-viewjob.DeleteJobConfirmation=Advertencia: La supresión de este trabajo va a quitar todo\documentos asociados del índice.\Quieres proceder?
-viewjob.StartOverConfirmation=Advertencia: Esta acción hará que todos los documentos de trabajo que se verificará durante la próxima ejecución de empleos.\Quieres proceder?
-viewjob.Notapplicable=No aplica
-viewjob.Rescandocumentsdynamically=Volver a examinar los documentos de forma dinámica
-viewjob.Infinity=Infinito
-viewjob.minutes=minutos
-viewjob.Scaneverydocumentonce=Analiza todos los documentos una vez
-viewjob.Startatbeginningofschedulewindow=Iniciar al inicio de la ventana de programación
-viewjob.Startinsideschedulewindow=Comience dentro de la ventana horario
-viewjob.Dontautomaticallystart=No inicie automáticamente
-viewjob.Anydayoftheweek=Cualquier día de la semana
-viewjob.Sundays=domingos
-viewjob.Mondays=lunes
-viewjob.Tuesdays=Martes
-viewjob.Wednesdays=Miercoles
-viewjob.Thursdays=Jueves
-viewjob.Fridays=Viernes
-viewjob.Saturdays=Sabados
-viewjob.oneveryhour=en cada hora
-viewjob.atmidnight=a la medianoche
-viewjob.at=a
-viewjob.am=am
-viewjob.pm=pm
-viewjob.plus=más
-viewjob.ineverymonthofyear=en todos los meses del año
-viewjob.in=en
-viewjob.January=Enero
-viewjob.February=Febrero
-viewjob.March=Marzo
-viewjob.April=Abril
-viewjob.May=Mayo
-viewjob.June=Junio
-viewjob.July=Julio
-viewjob.August=Agosto
-viewjob.September=Setiembre
-viewjob.October=Octubre
-viewjob.November=Noviembre
-viewjob.December=Deciembre
-viewjob.onanydayofthemonth=en cualquier día del mes
-viewjob.onthe1stofthemonth=en el primero del mes
-viewjob.onthe=en el
-viewjob.ofthemonth=Del mes
-viewjob.inyears=En año(s)
-viewjob.Nolimit=Sin límite
-viewjob.Unlimited=Ilimitado
-viewjob.Deleteunreachabledocuments=Eliminar documentos inalcanzables
-viewjob.Nodeletesfornow=No hay eliminaciones , por ahora
-viewjob.Nodeletesforever=No hay eliminaciones , para siempre
-viewjob.st=st
-viewjob.nd=nd
-viewjob.rd=rd
-viewjob.th=th
-viewjob.JobInvocationColon=invocación de empleo:
-viewjob.Minimal=Mínimo
-viewjob.Complete=Completar
-
-viewgroup.ApacheManifoldCFViewGroup=Apache ManifoldCF: Ver Autoridad Grupo
-viewgroup.ViewAuthorityGroup=Ver Autoridad Grupo
-viewgroup.NameColon=Nombre:
-viewgroup.DescriptionColon=Descripción:
-viewgroup.EditThisAuthorityGroup=Editar este grupo de autorización
-viewgroup.Edit=Editar
-viewgroup.DeleteThisAuthorityGroup=Eliminar este grupo de autorización
-viewgroup.Delete=Borrar
-
-viewauthority.ViewAuthorityConnectionStatus=Ver Autoridad Estado de la conexión
-viewauthority.NameColon=Nombre:
-viewauthority.DescriptionColon=Descripción:
-viewauthority.AuthorityTypeColon=tipo de Autoridad:
-viewauthority.MaxConnectionsColon=conexiones Max:
-viewauthority.ConnectionStatusColon=estado de la conexión:
-viewauthority.Refresh=Refrescar
-viewauthority.Edit=Editar
-viewauthority.EditThisAuthorityConnection=Edite esta conexión autoridad
-viewauthority.Delete=Borrar
-viewauthority.DeleteThisAuthorityConnection=Eliminar esta conexión autoridad
-viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus=Apache ManifoldCF: Ver Autoridad Estado de la conexión
-viewauthority.DeleteConnection=eliminar conexión
-viewauthority.Connectorisnotinstalled=Conector no está instalado.
-viewauthority.uninstalled=(desinstalado)
-viewauthority.Threwexception=lanzó excepción:
-viewauthority.qmark=?
-viewauthority.PrerequisiteUserMappingColon=Trazar un mapa de usuario previamente necesario:
-viewauthority.NoPrerequisites=Ningun requisito previo
-viewauthority.AuthorizationDomainColon=Autorización de dominio:
-viewauthority.AuthorityGroupColon=grupo de Autoridad:
-
-viewmapper.ApacheManifoldCFViewMappingConnectionStatus=Apache ManifoldCF: Ver estado de la conexión de Mapeo
-viewmapper.DeleteConnection=eliminar conexión
-viewmapper.ViewMappingConnectionStatus=Vista que Traza un mapa de Estado de Conexión
-viewmapper.uninstalled=(desinstalado)
-viewmapper.Connectorisnotinstalled=Conector no está instalado.
-viewmapper.Threwexception=lanzó excepción:
-viewmapper.NameColon=Nombre:
-viewmapper.DescriptionColon=Descripción:
-viewmapper.MapperTypeColon=Trazar un mapa de tipo:
-viewmapper.MaxConnectionsColon=conexiones Max:
-viewmapper.ConnectionStatusColon=estado de la conexión:
-viewmapper.Refresh=Refrescar
-viewmapper.Edit=Editar
-viewmapper.EditThisMappingConnection=Edite esta conexión de trazar un mapa
-viewmapper.Delete=Borrar
-viewmapper.DeleteThisMappingConnection=Suprima esta conexión de trazar un mapa
-viewmapper.qmark=?
-viewmapper.PrerequisiteUserMappingColon=La asignación de usuarios Requisito:
-viewmapper.NoPrerequisites=No hay requisitos previos
-
-edittransformation.NoTransformationConnectorsRegistered=No hay conectores de transformación registrados
-editoutput.NoOutputConnectorsRegistered=No hay conectores de salida registrados
-editnotification.NoNotificationConnectorsRegistered=No hay conectores de notificación registrados
-editnotification.Name=Nombre
-editnotification.Type=Tipo
-editnotification.Throttling=Acelerando
-editnotification.ApacheManifoldCFEditNotificationConnection=Apache ManifoldCF: Editar conexión Notificación
-editnotification.ConnectionMustHaveAName=La conexión debe tener un nombre
-editnotification.TheMaximumNumberOfConnectionsMustBeAValidInteger=El número máximo de conexiones debe ser un entero válido
-editnotification.EditNotificationConnection2=Editar conexión Notificación
-editnotification.EditNotificationConnection=Conexión de notificación de revisión
-editnotification.EditANotificationConnection=Corrija una conexión de notificación
-editnotification.tab=etiqueta
-editnotification.NameColon=Nombre:
-editnotification.DescriptionColon=Descripciòn:
-editnotification.TypeColon=Tipo:
-editnotification.UNREGISTERED=NO REGISTRADO
-editnotification.ConnectionTypeColon=Tipo de conección:
-editnotification.MaxConnectionsColon=conexiones Max:
-editnotification.Save=Guardar
-editnotification.Continue=Continuar
-editnotification.SaveThisNotificationConnection=Guarde esta conexión de notificación
-editnotification.ContinueToNextPage=Continúa en la página siguiente
-editnotification.Cancel=Cancelar
-editnotification.CancelNotificationConnectionEditing=Cancelar la edición conexión notificación
-
-listnotifications.ApacheManifoldCFListNotificationConnections=Apache ManifoldCF: Conexiones Lista de notificación
-listnotifications.DeleteNotificationConnection=Eliminar conexión de notificación
-listnotifications.ListOfNotificationConnections=Lista de Conexiones de notificación
-listnotifications.Name=Nombre
-listnotifications.Description=Descripciòn
-listnotifications.ConnectionType=Tipo de conección
-listnotifications.Max=Max
-listnotifications.uninstalled=(desinstalado)
-listnotifications.View=ver
-listnotifications.Edit=Editar
-listnotifications.Delete=Borrar
-listnotifications.AddANotificationConnection=Agregar una conexión de notificación
-listnotifications.AddaNewNotificationConnection=Añadir una nueva conexión de notificación
-listnotifications.DeleteNotificationConnection=Eliminar conexión de notificación
-
-viewnotification.ApacheManifoldCFViewNotificationConnectionStatus=Apache ManifoldCF: Ver estado de la conexión de Notificación
-viewnotification.Deletenotificationconnection=Eliminar conexión de notificación
-viewnotification.qmark=?
-viewnotification.ViewNotificationConnectionStatus=Ver estado de la conexión de Notificación
-viewnotification.uninstalled=(desinstalado)
-viewnotification.Connectorisnotinstalled=Conector no está instalado
-viewnotification.Threwexception=lanzó excepción:
-viewnotification.NameColon=Nombre:
-viewnotification.DescriptionColon=Descripciòn:
-viewnotification.ConnectionTypeColon=Tipo de conección:
-viewnotification.MaxConnectionsColon=conexiones Max:
-viewnotification.ConnectionStatusColon=estado de la conexión:
-viewnotification.Refresh=Refrescar
-viewnotification.EditThisNotificationConnection=Edite esta conexión notificación
-viewnotification.Edit=Editar
-viewnotification.DeleteThisNotificationConnection=Eliminar esta conexión de notificación
-viewnotification.Delete=Borrar
-
-navigation.Listnotificationconnections=Notificación de la lista de conexiones
-navigation.ListNotificationConnections=Notificación de la Lista de Conexiones
-
-editjob.SelectANotificationConnectionName=Seleccione un nombre de conexión de notificación
-editjob.NotificationsColon=Notificaciones:
-editjob.NotificationDescription=Descripción
-editjob.NotificationConnectionName=Nombre de la conexión
-editjob.Deletenotification=borrar notificación
-editjob.AddNotification=Añadir notificación
-editjob.AddANotification=Añadir una notificación
-
-viewjob.NotificationsColon=Notificaciones:
-viewjob.NotificationDescription=Descripción
-viewjob.NotificationConnectionName=Nombre de la conexión
-viewjob.NoNotificationConnections=No hay conexiones de notificación
diff --git a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties b/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties
deleted file mode 100644
index bc80c1f..0000000
--- a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties
+++ /dev/null
@@ -1,1072 +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.
-
-editconnection.Name=名前
-editconnection.Type=タイプ
-editconnection.Throttling=スロットリング
-editconnection.Addthrottle=スロットルを追加
-editjob.Name=名前
-editjob.Connection=コネクション
-
-viewconnection.NoneGlobalAuthority=なし(globalAuthority)
-viewconnection.ClearHistoryAssociatedWithThisConnection=このコネクションに関連した履歴のクリア
-viewconnection.ClearAllRelatedHistory=すべての関連履歴をクリア
-viewconnection.Thiscommandwillclearallhistoryrelatedto=このコマンドは、コネクションに関連するすべての履歴を消去します
-viewconnection.period=.
-
-listconnections.GlobalAuthority=なし(globalAuthority)
-
-editjob.Scheduling=スケジュール
-editjob.HopFilters=ホップフィルタ
-editjob.am=午前
-editjob.pm=午後
-
-index.TheApacheSoftwareFoundation=The Apache® Software Foundation
-index.Copyright=Copyright© 2010-2017
-index.ApacheManifoldCF=Apache ManifoldCF™
-index.WelcomeToApacheManifoldFC=Apache ManifoldCF™へようこそ
-index.ApacheManifoldCFLogin=Apache ManifoldCF™ ログイン
-index.UserIDColon=ユーザーID:
-index.PasswordColon=パスワード:
-index.Login=ログイン
-index.LoginFailed=ログインに失敗しました!
-
-errorCode.ServerDown=Couldn't connect to the server. Please check if the server is up and running.
-errorCode.InternalServerError=Oops! Looks like something went wrong.
-
-banner.DocumentIngestion=コンテンツの読込み
-
-navigation.LogOut=ログアウト
-navigation.Outputs=出力
-navigation.ListTransformationConnections=変換コネクション一覧
-navigation.ListOutputConnections=出力コネクション一覧
-navigation.Authorities=権限
-navigation.ListUserMappings=ユーザーマッピングコネクション一覧
-navigation.ListAuthorityConnections=権限コネクション一覧
-navigation.ListAuthorityGroups=権限グループ一覧
-navigation.Repositories=リポジトリ
-navigation.ListRepositoryConnections=リポジトリコネクション一覧
-navigation.Jobs=ジョブ
-navigation.ListAllJobs=ジョブ一覧
-navigation.StatusAndJobManagement=状態とジョブ管理
-navigation.StatusReports=状態レポート
-navigation.DocumentStatus=コンテンツの状態
-navigation.QueueStatus=キューの状態
-navigation.HistoryReports=履歴レポート
-navigation.SimpleHistory=履歴レポート
-navigation.MaximumActivity=最大アクティビティ
-navigation.MaximumBandwidth=最大帯域幅
-navigation.ResultHistogram=結果ヒストグラム
-navigation.Miscellaneous=その他
-navigation.Locale=ja_JP
-navigation.Help=ヘルプ
-navigation.Listtransformationconnections=変換コネクション一覧
-navigation.Listoutputconnections=出力コネクション一覧
-navigation.Listrepositoryconnections=リポジトリコネクション一覧
-navigation.Listusermappings=ユーザーマッピングコネクション一覧
-navigation.Listauthorities=権限一覧
-navigation.Listauthoritygroups=権限グループ一覧
-navigation.Listjobs=ジョブ一覧
-navigation.Managejobs=ジョブ管理
-navigation.Documentstatus=コンテンツの状態
-navigation.Queuestatus=キューの状態
-navigation.Simplehistory=履歴レポート
-navigation.Maximumactivity=最大アクティビティ
-navigation.Maximumbandwidth=最大帯域幅
-navigation.Resulthistogram=結果ヒストグラム
-
-listoutputs.ApacheManifoldCFListOutputConnections=Apache ManifoldCF: 出力コネクション一覧
-listoutputs.ListOfOutputConnections=出力コネクション一覧
-listoutputs.Name=名前
-listoutputs.Description=説明
-listoutputs.ConnectionType=コネクションタイプ
-listoutputs.Max=最大値
-listoutputs.AddaNewOutputConnection=新しい出力コネクションを追加
-listoutputs.View=表示
-listoutputs.Edit=編集
-listoutputs.Delete=削除
-listoutputs.DeleteOutputConnection=出力コネクションを削除
-listoutputs.AddAnOutputConnection=出力コネクションを追加
-listoutputs.uninstalled=(インストールされていません)
-
-editoutput.ApacheManifoldCFEditOutputConnection=Apache ManifoldCF:出力コネクションの編集
-editoutput.Name=名前
-editoutput.Type=タイプ
-editoutput.Throttling=スロットリング
-editoutput.EditAnOutputConnection=出力コネクションの編集
-editoutput.EditOutputConnection2=出力コネクションを編集
-editoutput.ConnectionTypeColon=コネクションタイプ:
-editoutput.Continue=次へ
-editoutput.ContinueToNextPage=次のページに進む
-editoutput.Cancel=キャンセル
-editoutput.CancelOutputConnectionEditing=出力コネクションの編集をキャンセルする
-editoutput.Save=保存
-editoutput.SaveThisOutputConnection=この出力コネクションを保存する
-editoutput.MaxConnectionsColon=最大コネクション数:
-editoutput.EditOutputConnection=出力コネクションを編集
-editoutput.NameColon=名前:
-editoutput.DescriptionColon=説明:
-editoutput.ConnectionMustHaveAName=コネクションには名前が必要です
-editoutput.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大コネクション数は有効な整数でなければなりません
-editoutput.UNREGISTERED=未登録
-editoutput.tab=タブ
-
-viewoutput.ApacheManifoldCFViewOutputConnectionStatus=Apache ManifoldCF:出力コネクションの状態の表示
-viewoutput.ViewOutputConnectionStatus=出力コネクションの状態の表示
-viewoutput.NameColon=名前:
-viewoutput.DescriptionColon=説明:
-viewoutput.ConnectionTypeColon=コネクションタイプ:
-viewoutput.MaxConnectionsColon=最大コネクション数:
-viewoutput.ConnectionStatusColon=コネクションの状態:
-viewoutput.Refresh=更新
-viewoutput.EditThisOutputConnection=この出力コネクションを編集する
-viewoutput.Edit=編集
-viewoutput.DeleteThisOutputConnection=この出力コネクションを削除する
-viewoutput.Delete=削除
-viewoutput.ReIngestAllDocumentsAssociatedWithThisOutputConnection=この出力コネクションに関連するすべてのコンテンツの再読込みを行なう
-viewoutput.ReIngestAllAssociatedDocuments=関連するすべてのコンテンツの再読込み
-viewoutput.RemoveAllDocumentsAssociatedWithThisOutputConnection=この出力コネクションに関連するすべてのコンテンツを削除します
-viewoutput.RemoveAllAssociatedDocuments=関連するすべてのコンテンツの削除
-viewoutput.Deleteoutputconnection=出力コネクションを削除
-viewoutput.Thiscommandwillforce=このコマンドにより、出力コネクション
-viewoutput.toberecrawled=に関連付けられているすべてのドキュメントは次回クロールされる時に強制的に再インデックス付けされます。\n継続しますか?
-viewoutput.Thiscommandwillcause=このコマンドにより、ManifoldCFは出力コネクション
-viewoutput.tobeforgotten=に関連付けられているコンテンツのすべてのインデックス付けされた記録を失います。続行しますか?
-viewoutput.qmark=?
-viewoutput.uninstalled=(インストールされていません)
-viewoutput.Connectorisnotinstalled=コネクターがインストールされていません
-viewoutput.Threwexception=例外がスローされました:
-
-listtransformations.ApacheManifoldCFListTransformationConnections=Apache ManifoldCF: 変換コネクション一覧
-listtransformations.ListOfTransformationConnections=変換コネクション一覧
-listtransformations.Name=名前
-listtransformations.Description=説明
-listtransformations.ConnectionType=コネクションタイプ
-listtransformations.Max=最大値
-listtransformations.AddaNewTransformationConnection=新しい変換コネクションを追加
-listtransformations.View=表示
-listtransformations.Edit=編集
-listtransformations.Delete=削除
-listtransformations.DeleteTransformationConnection=変換コネクションを削除
-listtransformations.AddATransformationConnection=変換コネクションを追加する
-listtransformations.uninstalled=(インストールされていません)
-
-edittransformation.ApacheManifoldCFEditTransformationConnection=Apache ManifoldCF: 変換コネクションの編集
-edittransformation.Name=名前
-edittransformation.Type=タイプ
-edittransformation.Throttling=スロットリング
-edittransformation.EditATransformationConnection=変換コネクションの編集
-edittransformation.EditTransformationConnection2=変換コネクションの編集
-edittransformation.ConnectionTypeColon=コネクションタイプ:
-edittransformation.Continue=次へ
-edittransformation.ContinueToNextPage=次のページに進む
-edittransformation.Cancel=キャンセル
-edittransformation.CancelTransformationConnectionEditing=変換コネクションの編集をキャンセルする
-edittransformation.Save=保存
-edittransformation.SaveThisTransformationConnection=この変換コネクションを保存する
-edittransformation.MaxConnectionsColon=最大コネクション数:
-edittransformation.EditTransformationConnection=変換コネクションの編集
-edittransformation.NameColon=名前:
-edittransformation.DescriptionColon=説明:
-edittransformation.ConnectionMustHaveAName=コネクションには名前が必要です
-edittransformation.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大コネクション数には有効な整数が必要です
-edittransformation.UNREGISTERED=未登録
-edittransformation.tab=タブ
-
-viewtransformation.ApacheManifoldCFViewTransformationConnectionStatus=Apache ManifoldCF: 変換コネクションの状態の表示
-viewtransformation.ViewTransformationConnectionStatus=変換コネクションの状態の表示
-viewtransformation.NameColon=名前:
-viewtransformation.DescriptionColon=説明:
-viewtransformation.ConnectionTypeColon=コネクションタイプ:
-viewtransformation.MaxConnectionsColon=最大コネクション数:
-viewtransformation.ConnectionStatusColon=コネクションの状態:
-viewtransformation.Refresh=更新
-viewtransformation.EditThisTransformationConnection=この変換コネクションを編集する
-viewtransformation.Edit=編集
-viewtransformation.DeleteThisTransformationConnection=この変換コネクションを削除する
-viewtransformation.Delete=削除
-viewtransformation.Deletetransformationconnection=変換コネクションを削除
-viewtransformation.qmark=?
-viewtransformation.uninstalled=(インストールされていません)
-viewtransformation.Connectorisnotinstalled=コネクターがインストールされていません
-viewtransformation.Threwexception=例外がスローされました:
-
-listgroups.ApacheManifoldCFListAuthorityGroups=Apache ManifoldCF: 権限グループ一覧
-listgroups.DeleteAuthorityGroup=権限グループを削除
-listgroups.ListOfAuthorityGroups=権限グループ一覧
-listgroups.Name=名前
-listgroups.Description=説明
-listgroups.View=表示
-listgroups.Edit=編集
-listgroups.Delete=削除
-listgroups.AddNewGroup=新しいグループを追加する
-listgroups.AddaNewGroup=新しいグループを追加
-
-listauthorities.ApacheManifoldCFListAuthorities=Apache ManifoldCF:権限一覧
-listauthorities.ListOfAuthorityConnections=権限コネクション一覧
-listauthorities.DeleteAuthority=権限を削除
-listauthorities.Name=名前
-listauthorities.Description=説明
-listauthorities.AuthorityType=権限タイプ
-listauthorities.Max=最大値
-listauthorities.AddaNewConnection=新しいコネクションを追加
-listauthorities.AddNewConnection=新しいコネクションを追加する
-listauthorities.View=表示
-listauthorities.Edit=編集
-listauthorities.Delete=削除
-listauthorities.uninstalled=(インストールされていません)
-
-listmappers.ApacheManifoldCFListMappers=Apache ManifoldCF: ユーザーマッピング一覧
-listmappers.ListOfMappingConnections=ユーザーマッピングコネクション一覧
-listmappers.DeleteMapper=ユーザーマッピングを削除
-listmappers.Name=名前
-listmappers.Description=説明
-listmappers.MapperType=マッピングタイプ
-listmappers.Max=最大値
-listmappers.AddaNewConnection=新しいコネクションを追加
-listmappers.AddNewConnection=新しいコネクションを追加する
-listmappers.View=表示
-listmappers.Edit=編集
-listmappers.Delete=削除
-listmappers.uninstalled=(インストールされていません)
-
-editgroup.Name=名前
-editgroup.ApacheManifoldCFEditAuthorityGroup=Apache ManifoldCF: 権限グループの編集
-editgroup.AuthorityGroupMustHaveAName=権限グループには名前が必要です
-editgroup.tab=タブ
-editgroup.EditGroup=グループを編集
-editgroup.EditAGroup=グループを編集
-editgroup.NameColon=名前:
-editgroup.DescriptionColon=説明:
-editgroup.Save=保存
-editgroup.SaveThisAuthorityGroup=この権限グループを保存する
-editgroup.Cancel=キャンセル
-editgroup.CancelAuthorityGroupEditing=権限グループの編集をキャンセルする
-
-editauthority.ApacheManifoldCFEditAuthority=Apache ManifoldCF: 権限の編集
-editauthority.EditAnAuthority=権限の編集
-editauthority.NameColon=名前:
-editauthority.DescriptionColon=説明:
-editauthority.ConnectionTypeColon=コネクションタイプ:
-editauthority.Continue=次へ
-editauthority.ContinueToNextPage=次のページに進む
-editauthority.MaxConnectionsColon=最大コネクション数:
-editauthority.Cancel=キャンセル
-editauthority.CancelAuthorityEditing=権限の編集をキャンセルする
-editauthority.Save=保存
-editauthority.SaveThisAuthorityConnection=この権限コネクションを保存する
-editauthority.EditAuthority=権限の編集
-editauthority.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大コネクション数は有効な整数でなければなりません
-editauthority.ConnectionMustHaveAName=コネクションには名前が必要です
-editauthority.NoAuthorityConnectorsRegistered=権限コネクションが登録されていません
-editauthority.UNREGISTERED=未登録
-editauthority.tab=タブ
-editauthority.Name=名前
-editauthority.Type=タイプ
-editauthority.Throttling=スロットリング
-editauthority.EditAuthorityConnection=権限コネクションを編集
-editauthority.Prerequisites=条件
-editauthority.PrerequisiteUserMappingColon=前提ユーザーマッピング:
-editauthority.NoPrerequisites=(条件無し)
-editauthority.AuthorizationDomainColon=認証ドメイン:
-editauthority.AuthorityGroupColon=権限グループ:
-editauthority.SelectAGroup=--グループを選択--
-editauthority.ConnectionMustHaveAGroup=権限コネクションにはグループが必要です
-editauthority.NoAuthorityGroupsDefinedCreateOneFirst=権限グループが定義されていません。先に作成してください
-editauthority.DefaultDomainNone=デフォルトドメイン (None)
-
-editmapper.ApacheManifoldCFEditMapping=Apache ManifoldCF: マッピングの編集
-editmapper.EditAMapping=マッピングを編集
-editmapper.NameColon=名前:
-editmapper.DescriptionColon=説明:
-editmapper.ConnectionTypeColon=コネクションタイプ:
-editmapper.Continue=次へ
-editmapper.ContinueToNextPage=次のページに進む
-editmapper.MaxConnectionsColon=最大コネクション数:
-editmapper.Cancel=キャンセル
-editmapper.CancelMappingEditing=マッピングの編集をキャンセルする
-editmapper.Save=保存
-editmapper.SaveThisMappingConnection=このマッピングコネクションを保存する
-editmapper.EditMapping=マッピングの編集
-editmapper.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大コネクション数は有効な整数でなければなりません
-editmapper.ConnectionMustHaveAName=コネクションには名前が必要です
-editmapper.NoMappingConnectorsRegistered=マッピングコネクションが登録されていません
-editmapper.UNREGISTERED=未登録
-editmapper.tab=タブ
-editmapper.Name=名前
-editmapper.Type=タイプ
-editmapper.Throttling=スロットリング
-editmapper.EditMappingConnection=マッピングコネクションを編集
-editmapper.Prerequisites=前提条件
-editmapper.PrerequisiteUserMappingColon=前提ユーザーマッピング:
-editmapper.NoPrerequisites=(前提条件無し)
-
-listconnections.ApacheManifoldCFListConnections=Apache ManifoldCF: コネクション一覧
-listconnections.ListOfRepositoryConnections=リポジトリコネクション一覧
-listconnections.Name=名前
-listconnections.Description=説明
-listconnections.ConnectionType=コネクションタイプ
-listconnections.AuthorityGroup=権限グループ
-listconnections.Max=最大値
-listconnections.AddNewConnection=新しいコネクションを追加
-listconnections.View=表示
-listconnections.Edit=編集
-listconnections.Delete=削除
-listconnections.DeleteConnection=コネクションの削除
-listconnections.AddAConnection=コネクションを追加する
-listconnections.uninstalled=(インストールされていません)
-
-editconnection.ApacheManifoldCFEditConnection=Apache ManifoldCF: コネクションの編集
-editconnection.EditAConnection=コネクションの編集
-editconnection.ConnectionTypeColon=コネクションタイプ:
-editconnection.AuthorityGroupColon=権限グループ:
-editconnection.Cancel=キャンセル
-editconnection.CancelConnectionEditing=コネクションの編集をキャンセルする
-editconnection.NameColon=名前:
-editconnection.DescriptionColon=説明:
-editconnection.MaxconnectionsColon=最大コネクション数:
-editconnection.ThrottlingColon=スロットリング:
-editconnection.Add=追加
-editconnection.BinRegularExpression=Bin正規表現
-editconnection.Description=説明
-editconnection.MaxAvgFetchesMin=最大平均取得/分
-editconnection.NoThrottlingSpecified=スロットリングが指定されていません
-editconnection.Continue=次へ
-editconnection.ContinueToNextPage=次のページに進む
-editconnection.Save=保存
-editconnection.SaveThisAuthorityConnection=このコネクションを保存する
-editconnection.EditConnection=コネクションの編集
-editconnection.GlobalAuthority=なし (globalAuthority)
-editconnection.ConnectionMustHaveAName=コネクションには名前が必要です
-editconnection.ThrottleRateMustBeAnInteger=スロットル率は整数でなければなりません
-editconnection.TheThrottleExpressionMustBeAValidRegularExpression=スロットル式は有効な正規表現でなければなりません
-editconnection.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大コネクション数は有効な整数でなければなりません
-editconnection.EditRepositoryConnection=リポジトリコネクションの編集
-editconnection.NoRepositoryConnectorsRegistered=リポジトリコネクションが登録されていません
-
-editconnection.UNREGISTERED=未登録
-editconnection.tab=タブ
-editconnection.Delete=削除
-editconnection.Deletethrottle=スロットルを削除
-
-viewconnection.ApacheManifoldCFViewRepositoryConnectionStatus=Apache ManifoldCF: リポジトリコネクションの状態の表示
-viewconnection.ViewRepositoryConnectionStatus=リポジトリコネクションの状態の表示
-viewconnection.NameColon=名前:
-viewconnection.DescriptionColon=説明:
-viewconnection.ConnectionTypeColon=コネクションタイプ:
-viewconnection.MaxConnectionsColon=最大コネクション数:
-viewconnection.AuthorityGroupColon=権限グループ:
-viewconnection.ThrottlingColon=スロットリング:
-viewconnection.NoThrottles=スロットリングなし
-viewconnection.ConnectionStatusColon=コネクションの状態:
-viewconnection.Refresh=更新
-viewconnection.EditThisConnection=このコネクションを編集する
-viewconnection.Edit=編集
-viewconnection.Delete=削除
-viewconnection.DeleteConnection=コネクションを削除
-viewconnection.Deletethisconnection=このコネクションを削除する
-viewconnection.uninstalled=(インストールされていません)
-viewconnection.Connectorisnotinstalled=コネクターがインストールされていません
-viewconnection.Threwexception=例外がスローされました:
-viewconnection.Binregularexpression=Bin正規表現
-viewconnection.Description=説明
-viewconnection.Maxavgfetches=最大平均取得/分
-viewconnection.qmark=?
-
-listjobs.ApacheManifoldCFListJobDescriptions=Apache ManifoldCF: ジョブ一覧
-listjobs.JobList=ジョブ一覧
-listjobs.Name=名前
-listjobs.OutputConnection=出力コネクション
-listjobs.RepositoryConnection=リポジトリコネクション
-listjobs.ScheduleType=スケジュールタイプ
-listjobs.AddaNewJob=新しいジョブを追加
-listjobs.Addajob=ジョブを追加する
-listjobs.View=表示
-listjobs.Viewjob=ジョブを表示
-listjobs.Edit=編集
-listjobs.Editjob=ジョブを編集
-listjobs.Delete=削除
-listjobs.DeleteJob=ジョブを削除
-listjobs.Copy=コピー
-listjobs.CopyJob=ジョブをコピー
-
-editjob.ApacheManifoldCFEditJob=Apache ManifoldCF: ジョブの編集
-editjob.EditaJob=ジョブの編集
-editjob.EditJob=ジョブの編集
-
-editjob.PipelineColon=パイプライン:
-editjob.StageNumber=ステージ番号
-editjob.StageType=タイプ
-editjob.StagePrecedent=前提
-editjob.StageDescription=説明
-editjob.StageConnectionName=接続名
-editjob.Repository=リポジトリ
-editjob.Output=出力
-editjob.Transformation=変換
-editjob.InsertTransformationBefore=前に変換を挿入
-editjob.InsertOutputBefore=前に出力を挿入
-editjob.Insertnewstagehere=新しいステージを挿入
-editjob.SelectATransformationStageConnectionName=変換ステージ接続名を選択
-editjob.SelectAnOutputStageConnectionName=出力ステージ接続名を選択
-editjob.AddAnOutput=出力を一つ追加
-editjob.AddOutput=出力を追加
-editjob.Deletepipelinestage=パイプラインステージを削除
-editjob.Insertnewtransformationhere=ここに新しい変換を挿入する
-editjob.Insertnewoutputhere=新しい出力を挿入
-
-editjob.NoRepositoryConnectionsDefinedCreateOneFirst=リポジトリコネクションが定義されていません。先に作成してください
-editjob.NoOutputConnectionsDefinedCreateOneFirst=出力コネクションが定義されていません。先に作成してください
-editjob.NameColon=名前:
-editjob.MaximumHopCountForType=タイプの最大ホップ数
-editjob.colon=:
-editjob.cancel=キャンセル
-editjob.CancelJobEditing=ジョブの編集をキャンセルする
-editjob.OutputConnectionColon=出力コネクション:
-editjob.NoneSelected=未指定
-editjob.PriorityColon=優先度:
-editjob.Highest=(最高)
-editjob.Lowest=(最低)
-editjob.StartMethodColon=起動方法:
-editjob.RepositoryConnectionColon=リポジトリコネクション:
-editjob.Continue=次へ
-editjob.ContinueToNextScreen=次のページに移動する
-editjob.StartWhenScheduleWindowStarts=スケジュールウインドウの開始時に開始する
-editjob.StartEvenInsideAScheduleWindow=スケジュールウインドウ内で開始する
-editjob.DontAutomaticallyStartThisJob=ジョブを自動的には開始しない
-editjob.ScheduleTypeColon=スケジュールタイプ:
-editjob.RescanDocumentsDynamically=動的にコンテンツを再スキャン
-editjob.ScanEveryDocumentOnce=コンテンツをすべて一度スキャン
-editjob.RecrawlIntervalIfContinuousColon=再クロール間隔(継続の場合):
-editjob.MaxRecrawlIntervalIfContinuousColon=最大再クロール間隔(継続の場合):
-editjob.minutesBlankInfinity=分 (空白=無限)
-editjob.ExpirationIntervalIfContinuousColon=失効間隔(継続の場合):
-editjob.ReseedIntervalIfContinuousColon=再シード間隔(継続の場合):
-editjob.NoScheduleSpecified=スケジュールが指定されていません
-editjob.ScheduledTimeColon=スケジュール時刻:
-editjob.AnyDayOfWeek=すべての曜日
-editjob.Sundays=日
-editjob.Mondays=月
-editjob.Tuesdays=火
-editjob.Wednesdays=水
-editjob.Thursdays=木
-editjob.Fridays=金
-editjob.Saturdays=土
-editjob.at=
-editjob.MidnightAnyHourOfDay=零時/毎正時
-editjob.plus=
-editjob.Nothing=なし
-editjob.minutes=分
-editjob.in=
-editjob.EveryMonthOfYear=毎月
-editjob.January=1月
-editjob.February=2月
-editjob.March=3月
-editjob.April=4月
-editjob.May=5月
-editjob.June=6月
-editjob.July=7月
-editjob.August=8月
-editjob.September=9月
-editjob.October=10月
-editjob.November=11月
-editjob.December=12月
-editjob.on=
-editjob.AnyDayOfMonth=毎日
-editjob.MaximumRunTimeColon=最大実行時間:
-editjob.RemoveSchedule=スケジュールを削除
-editjob.DeleteUnreachableDocuments=到達不能なコンテンツを削除
-editjob.KeepUnreachableDocumentsForNow=到達不能なコンテンツを一時的に保持
-editjob.KeepUnreachableDocumentsForever=到達不能なコンテンツを永久に保持
-editjob.HopCountModeColon=ホップ数モード:
-editjob.Save=保存
-editjob.SaveThisJob=このジョブを保存する
-editjob.AddScheduledTime=スケジュールを追加
-editjob.AddNewScheduleRecord=スケジュールレコードを追加する
-editjob.JobMustHaveAName=ジョブは名前が必要です
-editjob.DurationMustBeAValidInteger=期間は有効な整数でなければなりません
-editjob.RecrawlIntervalMustBeAValidIntegerOrNull=再クロール間隔は有効な整数またはnullでなければなりません
-editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull=最大再クロール間隔は有効な整数またはnullでなければなりません
-editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval=最大再クロール間隔は再クロール間隔よりも大きくなければなりません
-editjob.ReseedIntervalMustBeAValidIntegerOrNull=再シード間隔は有効な整数またはnullでなければなりません
-editjob.ExpirationIntervalMustBeAValidIntegerOrNull=失効期間は有効な整数またはnullでなければなりません
-editjob.RemoveScheduleRecord=スケジュールレコード # を削除
-editjob.ForcedMetadata=強制メタデータ
-editjob.ForcedMetadataColon=強制メタデータ:
-editjob.ParameterName=パラメータ名
-editjob.ParameterValue=パラメータ値
-editjob.Deleteforcedmetadatanumber=強制メタデータ # を削除
-editjob.Delete=削除
-editjob.NoForcedMetadataSpecified=強制メタデータの指定がありません
-editjob.Add=追加
-editjob.Addforcedmetadata=強制メタデータを追加
-editjob.ForcedMetadataNameMustNotBeNull=強制メタデータ名はnullであってはなりません
-editjob.st=日
-editjob.nd=日
-editjob.rd=日
-editjob.th=日
-editjob.dayofmonth=
-editjob.JobInvocationColon=ジョブ起動:
-editjob.Minimal=最小
-editjob.Complete=完全
-
-editjob.tab=タブ
-
-showjobstatus.ApacheManifoldCFStatusOfAllJobs=Apache ManifoldCF: すべてのジョブの状態
-showjobstatus.Name=名前
-showjobstatus.Status=状態
-showjobstatus.StartTime=開始時刻
-showjobstatus.EndTime=終了時刻
-showjobstatus.Documents=コンテンツ
-showjobstatus.Active=処理中
-showjobstatus.Processed=処理済み
-showjobstatus.RefreshStatus=状態を更新する
-showjobstatus.Refresh=更新
-showjobstatus.StatusOfJobs=ジョブの状態
-
-showjobstatus.Notyetrun=未実行
-showjobstatus.Running=実行中
-showjobstatus.Runningnoconnector=実行中, コネクターはありません
-showjobstatus.Aborting=強制終了
-showjobstatus.Restarting=再開始
-showjobstatus.Stopping=停止
-showjobstatus.Resuming=再開
-showjobstatus.Paused=停止
-showjobstatus.Done=完了
-showjobstatus.Waiting=待機
-showjobstatus.Startingup=開始
-showjobstatus.Cleaningup=クリーニング
-showjobstatus.Terminating=終了
-showjobstatus.Endnotification=終了通知
-showjobstatus.ErrorColon=エラー:
-showjobstatus.Unknown=未知
-showjobstatus.Notstarted=開始されません
-showjobstatus.Aborted=異常終了しました
-showjobstatus.Neverrun=実行されていません
-showjobstatus.Start=開始
-showjobstatus.Startminimal=最小開始
-showjobstatus.Restart=再開始
-showjobstatus.Restartminimal=再最小開始
-showjobstatus.Pause=停止
-showjobstatus.Abort=中断
-showjobstatus.Resume=再開
-showjobstatus.Startjob=ジョブを開始
-showjobstatus.minimally=最小
-showjobstatus.Restartjob=ジョブを再開始
-showjobstatus.Pausejob=ジョブを停止
-showjobstatus.Abortjob=ジョブを中断
-showjobstatus.Resumejob=ジョブを再開
-
-documentstatus.ApacheManifoldCFDocumentStatus=Apache ManifoldCF: コンテンツの状態
-documentstatus.DocumentStatus=コンテンツの状態
-documentstatus.Connection=コネクション:
-documentstatus.TimeOffsetFromNowMinutes=今からの経過時間(分):
-documentstatus.DocumentState=コンテンツの状態:
-documentstatus.DocumentIdentifierMatch=コンテンツID:
-documentstatus.Go=実行
-documentstatus.ExecuteThisQuery=この問い合わせを実行する
-documentstatus.Continue=次へ
-documentstatus.PleaseSelectAtLeastOneJob=ジョブを一つ以上選択してください
-documentstatus.PleaseSelectaConnection=コネクションを選択してください
-documentstatus.Previous=前へ
-documentstatus.Next=次へ
-documentstatus.Rows=行:
-documentstatus.RowsPerPage=行/ページ:
-documentstatus.DocumentsThatHaveNeverBeenProcessed=一度も処理されていないコンテンツ
-documentstatus.DocumentsProcessedAtLeastOnce=1回以上処理されたコンテンツ
-documentstatus.DocumentsOutOfScope=対象外のコンテンツ
-documentstatus.DocumentsThatAreNoLongerActive=アクティブでなくなったコンテンツ
-documentstatus.DocumentsCurrentlyInProgress=処理中のコンテンツ
-documentstatus.DocumentsCurrentlyBeingExpired=失効中のコンテンツ
-documentstatus.DocumentsCurrentlyBeingDeleted=削除中のコンテンツ
-documentstatus.DocumentsCurrentlyAvailableForProcessing=処理可能なコンテンツ
-documentstatus.DocumentsCurrentlyAvailableForExpiration=失効可能なコンテンツ
-documentstatus.DocumentsNotYetProcessable=処理準備中のコンテンツ
-documentstatus.DocumentsNotYetExpirable=失効できないコンテンツ
-documentstatus.DocumentsWaitingForever=無限に待っているコンテンツ
-documentstatus.DocumentsHopcountExceeded=ホップ数制限を超えたコンテンツ
-documentstatus.NotSpecified=未指定
-documentstatus.Jobs=ジョブ:
-documentstatus.Identifier=ID
-documentstatus.Job=ジョブ
-documentstatus.State=状態
-documentstatus.Status=状況
-documentstatus.Scheduled=スケジュール
-documentstatus.ScheduledAction=アクション
-documentstatus.RetryCount=リトライ数
-documentstatus.RetryLimit=最大リトライ数
-documentstatus.EnterALegalNumberForRowsPerPage=正しいページ毎の行数を入力してください
-documentstatus.IdentifierMatchMustBeAValidRegularExpression=IDは有効な正規表現式と一致しなければなりません
-
-queuestatus.ApacheManifoldCFQueueStatus=Apache ManifoldCF: キューの状態
-queuestatus.QueueStatus=キューの状態
-queuestatus.Connection=コネクション:
-queuestatus.NotSpecified=未指定
-queuestatus.Jobs=ジョブ:
-queuestatus.TimeOffsetFromNowMinutes=今からの経過時間(分):
-queuestatus.DocumentState=コンテンツの状態:
-queuestatus.DocumentIdentifierMatch=コンテンツID:
-queuestatus.IdentifierClassDescription=IDクラス説明:
-queuestatus.Go=実行
-queuestatus.ExecuteThisQuery=この問い合わせを実行する
-queuestatus.Continue=次へ
-queuestatus.PleaseSelectAtLeastOneJob=ジョブを一つ以上選択してください
-queuestatus.PleaseSelectaConnection=コネクションを選択してください
-queuestatus.DocumentsThatHaveNeverBeenProcessed=一度も処理されていないコンテンツ
-queuestatus.DocumentsProcessedAtLeastOnce=1回以上処理されたコンテンツ
-queuestatus.DocumentsOutOfScope=対象外のコンテンツ
-queuestatus.DocumentsThatAreNoLongerActive=アクティブでなくなったコンテンツ
-queuestatus.DocumentsCurrentlyInProgress=処理中のコンテンツ
-queuestatus.DocumentsCurrentlyBeingExpired=失効中のコンテンツ
-queuestatus.DocumentsCurrentlyBeingDeleted=削除中のコンテンツ
-queuestatus.DocumentsCurrentlyAvailableForProcessing=処理可能なコンテンツ
-queuestatus.DocumentsCurrentlyAvailableForExpiration=失効可能なコンテンツ
-queuestatus.DocumentsNotYetProcessable=処理準備中のコンテンツ
-queuestatus.DocumentsNotYetExpirable=失効できないコンテンツ
-queuestatus.DocumentsWaitingForever=無限に待っているコンテンツ
-queuestatus.DocumentsHopcountExceeded=ホップ数制限を超えたコンテンツ
-queuestatus.Rows=行:
-queuestatus.RowsPerPage=行/ページ:
-queuestatus.IdentifierClass=IDクラス
-queuestatus.Inactive=無効
-queuestatus.Processing=処理中
-queuestatus.Expiring=失効中
-queuestatus.Deleting=削除中
-queuestatus.AboutToProcess=処理準備中
-queuestatus.AboutToExpire=失効準備中
-queuestatus.WaitingForProcessing=処理待ち中
-queuestatus.WaitingForExpiration=失効待ち中
-queuestatus.WaitingForever=無限待ち
-queuestatus.HopcountExceeded=ホップ数超過
-queuestatus.Previous=前へ
-queuestatus.PreviousPage=前ページ
-queuestatus.Next=次へ
-queuestatus.NextPage=次ページ
-queuestatus.IdentifierClassDescriptionCannotBeEmpty=IDクラスパターンを入力してください
-queuestatus.IdentifierClassDescriptionMustBeAValidRegularExpression=IDクラスパターンには有効な正規表現式を入力してください
-queuestatus.IdentifierClassDescriptionMustDelimitAClassWithParentheses=IDクラスパターンは括弧(「(」,「)」)で区切ってください
-queuestatus.EnterALegalNumberForRowsPerPage=正しいページ毎の行数を入力してください
-queuestatus.IdentifierMatchMustBeAValidRegularExpression=IDは正規表現式と一致する必要があります
-
-simplereport.ApacheManifoldCFSimpleHistoryReport=Apache ManifoldCF: 履歴レポート
-simplereport.SimpleHistoryReport=履歴レポート
-simplereport.Connection=コネクション:
-simplereport.NotSpecified=未指定
-simplereport.on=
-simplereport.Activities=アクティビティ:
-simplereport.StartTime=開始時刻:
-simplereport.EndTime=終了時刻:
-simplereport.January=1月
-simplereport.February=2月
-simplereport.March=3月
-simplereport.April=4月
-simplereport.May=5月
-simplereport.June=6月
-simplereport.July=7月
-simplereport.August=8月
-simplereport.September=9月
-simplereport.October=10月
-simplereport.November=11月
-simplereport.December=12月
-simplereport.EntityMatch=一致するエンティティ:
-simplereport.ResultCodeMatch=一致する結果コード:
-simplereport.Go=実行
-simplereport.ExecuteThisQuery=この問い合わせを実行する
-simplereport.Continue=次へ
-simplereport.StartTime=開始時刻
-simplereport.Activity=アクティビティ
-simplereport.Identifier=ID
-simplereport.ResultCode=結果コード
-simplereport.Bytes=バイト
-simplereport.Time=時間
-simplereport.ResultDescription=結果
-simplereport.Previous=前へ
-simplereport.PreviousPage=前のページ
-simplereport.NextPage=次へ
-simplereport.Next=次へ
-simplereport.Rows=行:
-simplereport.RowsPerPage=行/ページ:
-simplereport.PleaseSelectAConnection=コネクションを選択してください
-simplereport.EnterALegalNumberForRowsPerPage=正しいページ毎の行数を入力してください
-simplereport.EntityMatchMustBeAValidRegularExpression=エンティティパターンは正規表現式に一致する必要があります
-simplereport.ResultCodeMatchMustBeAValidRegularExpression=結果コードは正規表現式に一致する必要があります
-
-maxactivityreport.ApacheManifoldCFMaximumActivityReport=Apache ManifoldCF: 最大アクティビティレポート
-maxactivityreport.MaximumActivityReport=最大アクティビティレポート
-maxactivityreport.Connection=コネクション:
-maxactivityreport.NotSpecified=未指定
-maxactivityreport.on=
-maxactivityreport.Activities=アクティビテ:
-maxactivityreport.StartTime=開始時刻:
-maxactivityreport.EndTime=終了時刻:
-maxactivityreport.January=1月
-maxactivityreport.February=2月
-maxactivityreport.March=3月
-maxactivityreport.April=4月
-maxactivityreport.May=5月
-maxactivityreport.June=6月
-maxactivityreport.July=7月
-maxactivityreport.August=8月
-maxactivityreport.September=9月
-maxactivityreport.October=10月
-maxactivityreport.November=11月
-maxactivityreport.December=12月
-maxactivityreport.EntityMatch=一致するエンティティ:
-maxactivityreport.ResultCodeMatch=一致する結果コード:
-maxactivityreport.Go=実行
-maxactivityreport.ExecuteThisQuery=この問い合わせを実行する
-maxactivityreport.Continue=次へ
-maxactivityreport.IdentifierClass=IDクラス
-maxactivityreport.StartTime=開始時刻
-maxactivityreport.IdentifierClassDescription=IDクラス説明:
-maxactivityreport.HighestActivityRate=最大アクティビティ率(/分)
-maxactivityreport.SlidingWindowSize=スライディングウインドウサイズ(分):
-maxactivityreport.Previous=前へ
-maxactivityreport.PreviousPage=前のページ
-maxactivityreport.NextPage=次のページ
-maxactivityreport.Next=次へ
-maxactivityreport.Rows=行:
-maxactivityreport.RowsPerPage=行/ページ:
-maxactivityreport.PleaseSelectAConnection=コネクションを選択してください
-maxactivityreport.EnterALegalNumberForRowsPerPage=正しいページ毎の行数を入力してください
-maxactivityreport.EnterALegalIntervalSizeInMinutes=正しい間隔値を入力してください(分)
-maxactivityreport.IdentifierClassDescriptionCannotBeEmpty=IDクラスパターンを入力してください
-maxactivityreport.IdentifierClassDescriptionMustBeAValidRegularExpression=IDクラスパターンには正規表現式を入力してください
-maxactivityreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=IDクラスパターンは括弧(「(」,「)」)で区切ってください
-maxactivityreport.EntityMatchMustBeAValidRegularExpression=エンティティパターンは正規表現式に一致する必要があります
-maxactivityreport.ResultCodeMatchMustBeAValidRegularExpression=結果コードは正規表現式に一致する必要があります
-
-maxbandwidthreport.ApacheManifoldCFMaximumBandwidthReport=Apache ManifoldCF: 最大帯域幅レポート
-maxbandwidthreport.MaximumBandwidthReport=最大帯域幅レポート
-maxbandwidthreport.Connection=コネクション:
-maxbandwidthreport.NotSpecified=未指定
-maxbandwidthreport.on=
-maxbandwidthreport.Activities=アクティビティ:
-maxbandwidthreport.StartTime=開始時刻:
-maxbandwidthreport.EndTime=終了時刻:
-maxbandwidthreport.January=1月
-maxbandwidthreport.February=2月
-maxbandwidthreport.March=3月
-maxbandwidthreport.April=4月
-maxbandwidthreport.May=5月
-maxbandwidthreport.June=6月
-maxbandwidthreport.July=7月
-maxbandwidthreport.August=8月
-maxbandwidthreport.September=9月
-maxbandwidthreport.October=10月
-maxbandwidthreport.November=11月
-maxbandwidthreport.December=12月
-maxbandwidthreport.EntityMatch=一致するエンティティ:
-maxbandwidthreport.ResultCodeMatch=一致する結果コード:
-maxbandwidthreport.Go=実行
-maxbandwidthreport.ExecuteThisQuery=この問い合わせを実行する
-maxbandwidthreport.Continue=次へ
-maxbandwidthreport.IdentifierClass=IDクラス
-maxbandwidthreport.HighestBandwidth=最大帯域幅 [bps]
-maxbandwidthreport.StartTime=開始時間
-maxbandwidthreport.IdentifierClassDescription=IDクラス説明:
-maxbandwidthreport.SlidingWindowSize=スライディングウインドウサイズ(分):
-maxbandwidthreport.Previous=前へ
-maxbandwidthreport.PreviousPage=前のページ
-maxbandwidthreport.NextPage=次のページ
-maxbandwidthreport.Next=次へ
-maxbandwidthreport.RowsPerPage=行/ページ:
-maxbandwidthreport.PleaseSelectAConnection=コネクションを選択してください
-maxbandwidthreport.HighestBandwidth2=最大帯域幅
-maxbandwidthreport.Rows=行:
-maxbandwidthreport.Next=次へ
-maxbandwidthreport.EnterALegalNumberForRowsPerPage=正しいページ毎の行数を入力してください
-maxbandwidthreport.EnterALegalIntervalSizeInMinutes=正しい間隔値を入力してください(分)
-maxbandwidthreport.IdentifierClassDescriptionCannotBeEmpty=IDクラスパターンを入力してください
-maxbandwidthreport.IdentifierClassDescriptionMustBeAValidRegularExpression=IDクラスパターンには正規表現式を入力してください
-maxbandwidthreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=IDクラスパターンは括弧(「(」,「)」)で区切ってください
-maxbandwidthreport.EntityMatchMustBeAValidRegularExpression=エンティティパターンは正規表現式に一致する必要があります
-maxbandwidthreport.ResultCodeMatchMustBeAValidRegularExpression=結果コードは正規表現式に一致する必要があります
-
-resultreport.ApacheManifoldCFActivityResultReport=Apache ManifoldCF:結果ヒストグラムレポート
-resultreport.ActivityResultReport=結果ヒストグラムレポート
-resultreport.Connection=コネクション:
-resultreport.NotSpecified=未指定
-resultreport.on=
-resultreport.Activities=アクティビティ:
-resultreport.StartTime=開始時間:
-resultreport.EndTime=終了時間:
-resultreport.January=1月
-resultreport.February=2月
-resultreport.March=3月
-resultreport.April=4月
-resultreport.May=5月
-resultreport.June=6月
-resultreport.July=7月
-resultreport.August=8月
-resultreport.September=9月
-resultreport.October=10月
-resultreport.November=11月
-resultreport.December=12月
-resultreport.EntityMatch=一致するエンティティ:
-resultreport.ResultCodeMatch=一致する結果コード:
-resultreport.Go=実行
-resultreport.ExecuteThisQuery=この問い合わせを実行する
-resultreport.Continue=次へ
-resultreport.IdentifierClassDescription=IDクラス説明:
-resultreport.ResultCodeClassDescription=結果コードクラス説明:
-resultreport.Previous=前へ
-resultreport.PreviousPage=前のページ
-resultreport.NextPage=次のページ
-resultreport.Next=次へ
-resultreport.Rows=行:
-resultreport.RowsPerPage=行/ページ:
-resultreport.PleaseSelectAConnection=コネクションを選択してください
-resultreport.IdentifierClass=IDクラス
-resultreport.ResultClass=結果クラス
-resultreport.EventCount=イベント数
-resultreport.Next=次へ
-resultreport.EnterALegalNumberForRowsPerPage=正しいページ毎の行数を入力してください
-resultreport.IdentifierClassDescriptionCannotBeEmpty=IDクラスパターンを入力してください
-resultreport.ResultClassDescriptionCannotBeEmpty=結果クラスパターンを入力してください
-resultreport.IdentifierClassDescriptionMustBeAValidRegularExpression=IDクラスパターンには正規表現式を入力してください
-resultreport.ResultClassDescriptionMustBeAValidRegularExpression=結果クラスパターンには正規表現式を入力してください
-resultreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=IDクラスパターンは括弧(「(」,「)」)で区切ってください
-resultreport.ResultClassDescriptionMustDelimitAClassWithParentheses=結果クラスパターンは括弧(「(」,「)」)で区切ってください
-resultreport.EntityMatchMustBeAValidRegularExpression=エンティティパターンは正規表現式に一致する必要があります
-resultreport.ResultCodeMatchMustBeAValidRegularExpression=結果コードは正規表現式に一致する必要があります
-
-error.ApacheManifoldCFError=Apache ManifoldCF: エラー
-error.Error=エラー
-error.Return=戻る
-error.Unauthorized=Apache ManifoldCF: Unauthorized activity
-error.UnauthorizedAccess=You do not have permissions to perform this activity
-error.ApacheManifoldCFMaintenanceUnderway=Apache ManifoldCF: Maintenance underway
-error.MaintenanceUnderway=Maintenance underway
-error.PleaseTryAgainLater=保守処理中です。少々お待ちください。
-
-viewjob.ApacheManifoldCFViewJob=Apache ManifoldCF: ジョブの表示
-viewjob.ViewAJob=ジョブの表示
-
-viewjob.PipelineColon=パイプライン:
-viewjob.StageNumber=ステージ番号
-viewjob.StageType=タイプ
-viewjob.StagePrecedent=前提
-viewjob.StageDescription=説明
-viewjob.StageConnectionName=接続名
-viewjob.Repository=リポジトリ
-viewjob.Output=出力
-viewjob.Transformation=変換
-
-viewjob.ScheduleTypeColon=スケジュールタイプ:
-viewjob.MinimumRecrawlIntervalColon=最小再クロール間隔:
-viewjob.MaximumRecrawlIntervalColon=最大再クロール間隔:
-viewjob.ExpirationIntervalColon=失効間隔:
-viewjob.ReseedIntervalColon=再シード間隔:
-viewjob.NoScheduledRunTimes=スケジュールされた実行時間がありません
-viewjob.ScheduledTimeColon=スケジュール時刻:
-viewjob.MaximumRunTimeColon=最大実行時間:
-viewjob.MaximumHopCountForLinkType=リンクタイプの最大ホップ数
-viewjob.HopCountModeColon=ホップ数モード:
-viewjob.Delete=削除
-viewjob.DeleteThisJob=このジョブを削除する
-viewjob.Edit=編集
-viewjob.EditThisJob=このジョブを編集する
-viewjob.Copy=コピー
-viewjob.CopyThisJob=このジョブをコピーする
-viewjob.ResetSeeding=Reset seeding
-viewjob.ResetSeedingThisJob=Reset incremental seeding for this job
-viewjob.NameColon=名前:
-viewjob.OutputConnectionColon=出力コネクション:
-viewjob.RepositoryConnectionColon=リポジトリコネクション:
-viewjob.PriorityColon=優先度:
-viewjob.StartMethodColon=開始方法:
-viewjob.ForcedMetadataColon=強制メタデータ:
-viewjob.NoForcedMetadata=強制メタデータなし
-viewjob.DeleteJobConfirmation=警告: このジョブの削除をすると関連するドキュメントをすべてインデックスから削除します。\nよろしいですか?
-viewjob.StartOverConfirmation=Warning: This action will cause all job documents to be checked during the next job run。\nよろしいですか?
-viewjob.Notapplicable=適用可能ではありません
-viewjob.Rescandocumentsdynamically=ドキュメントを動的に再スキャンします
-viewjob.Infinity=無限
-viewjob.minutes=分
-viewjob.Scaneverydocumentonce=コンテンツをすべて一度スキャン
-viewjob.Startatbeginningofschedulewindow=スケジュールウインドウの開始時に開始する
-viewjob.Startinsideschedulewindow=スケジュールウインドウ内で開始する
-viewjob.Dontautomaticallystart=自動的にスタートしない
-viewjob.Anydayoftheweek=すべての曜日
-viewjob.Sundays=日
-viewjob.Mondays=月
-viewjob.Tuesdays=火
-viewjob.Wednesdays=水
-viewjob.Thursdays=木
-viewjob.Fridays=金
-viewjob.Saturdays=土
-viewjob.oneveryhour=毎時
-viewjob.atmidnight=夜中
-viewjob.at=
-viewjob.am=午前
-viewjob.pm=午後
-viewjob.plus=
-viewjob.ineverymonthofyear=毎月
-viewjob.in=
-viewjob.January=1月
-viewjob.February=2月
-viewjob.March=3月
-viewjob.April=4月
-viewjob.May=5月
-viewjob.June=6月
-viewjob.July=7月
-viewjob.August=8月
-viewjob.September=9月
-viewjob.October=10月
-viewjob.November=11月
-viewjob.December=12月
-viewjob.onanydayofthemonth=舞日
-viewjob.onthe1stofthemonth=毎月1日
-viewjob.onthe=
-viewjob.ofthemonth=
-viewjob.inyears=
-viewjob.Nolimit=限界無し
-viewjob.Unlimited=無制限
-viewjob.Deleteunreachabledocuments=入手できないドキュメントを削除します
-viewjob.Nodeletesfornow=削除は今のところありません
-viewjob.Nodeletesforever=削除はありません
-viewjob.st=日
-viewjob.nd=日
-viewjob.rd=日
-viewjob.th=日
-viewjob.JobInvocationColon=ジョブ起動:
-viewjob.Minimal=最小
-viewjob.Complete=完全
-
-viewgroup.ApacheManifoldCFViewGroup=Apache ManifoldCF: 権限グループの表示
-viewgroup.ViewAuthorityGroup=権限グループの表示
-viewgroup.NameColon=名前:
-viewgroup.DescriptionColon=説明:
-viewgroup.EditThisAuthorityGroup=この権限グループを編集する
-viewgroup.Edit=編集
-viewgroup.DeleteThisAuthorityGroup=この権限グループを削除する
-viewgroup.Delete=削除
-
-viewauthority.ViewAuthorityConnectionStatus=権限コネクションの状態の表示
-viewauthority.NameColon=名前:
-viewauthority.DescriptionColon=説明:
-viewauthority.AuthorityTypeColon=権限タイプ:
-viewauthority.MaxConnectionsColon=最大コネクション数:
-viewauthority.ConnectionStatusColon=コネクションの状態:
-viewauthority.Refresh=更新
-viewauthority.Edit=編集
-viewauthority.EditThisAuthorityConnection=この権限コネクションを編集する
-viewauthority.Delete=削除
-viewauthority.DeleteThisAuthorityConnection=この権限コネクションを削除する
-viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus=Apache ManifoldCF: 権限コネクションの状態の表示
-viewauthority.DeleteConnection=コネクションを削除
-viewauthority.Connectorisnotinstalled=コネクターがインストールされていません
-viewauthority.uninstalled=(インストールされていません)
-viewauthority.Threwexception=例外がスローされました:
-viewauthority.qmark=?
-viewauthority.PrerequisiteUserMappingColon=前提ユーザーマッピング:
-viewauthority.NoPrerequisites=条件無し
-viewauthority.AuthorizationDomainColon=認証ドメイン:
-viewauthority.AuthorityGroupColon=権限グループ:
-
-viewmapper.ApacheManifoldCFViewMappingConnectionStatus=Apache ManifoldCF: マッピングコネクションの状態の表示
-viewmapper.DeleteConnection=コネクションを削除
-viewmapper.ViewMappingConnectionStatus=マッピングコネクションの状態の表示
-viewmapper.uninstalled=(インストールされていません)
-viewmapper.Connectorisnotinstalled=コネクターがインストールされていません
-viewmapper.Threwexception=例外がスローされました:
-viewmapper.NameColon=名前:
-viewmapper.DescriptionColon=説明:
-viewmapper.MapperTypeColon=マッピングタイプ:
-viewmapper.MaxConnectionsColon=最大コネクション数:
-viewmapper.ConnectionStatusColon=コネクションの状態:
-viewmapper.Refresh=更新
-viewmapper.Edit=編集
-viewmapper.EditThisMappingConnection=このマッピングコネクションを編集する
-viewmapper.Delete=削除
-viewmapper.DeleteThisMappingConnection=このマッピングコネクションを削除する
-viewmapper.qmark=?
-viewmapper.PrerequisiteUserMappingColon=前提ユーザーマッピング:
-viewmapper.NoPrerequisites=条件無し
-
-edittransformation.NoTransformationConnectorsRegistered=変換コネクションが登録されていません
-editoutput.NoOutputConnectorsRegistered=出力コネクターが登録されていません
-editnotification.NoNotificationConnectorsRegistered=通知コネクターが登録されていません
-editnotification.Name=名前
-editnotification.Type=タイプ
-editnotification.Throttling=スロットリング
-editnotification.ApacheManifoldCFEditNotificationConnection=Apache ManifoldCF: 通知コネクションの編集
-editnotification.ConnectionMustHaveAName=コネクションには名前が必要です
-editnotification.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大コネクション数は有効な整数でなければなりません
-editnotification.EditNotificationConnection2=通知コネクションを編集
-editnotification.EditNotificationConnection=通知コネクションを編集
-editnotification.EditANotificationConnection=通知コネクションを編集
-editnotification.tab=タブ
-editnotification.NameColon=名前:
-editnotification.DescriptionColon=説明:
-editnotification.TypeColon=タイプ:
-editnotification.UNREGISTERED=未登録
-editnotification.ConnectionTypeColon=コネクションタイプ:
-editnotification.MaxConnectionsColon=最大コネクション数:
-editnotification.Save=保存
-editnotification.Continue=次へ
-editnotification.SaveThisNotificationConnection=この通知コネクションを保存する
-editnotification.ContinueToNextPage=次のページへ
-editnotification.Cancel=キャンセル
-editnotification.CancelNotificationConnectionEditing=通知コネクションの編集をキャンセルする
-
-listnotifications.ApacheManifoldCFListNotificationConnections=Apache ManifoldCF: 通知コネクション一覧
-listnotifications.DeleteNotificationConnection=通知コネクションの削除
-listnotifications.ListOfNotificationConnections=通知コネクション一覧
-listnotifications.Name=名前
-listnotifications.Description=説明
-listnotifications.ConnectionType=コネクションタイプ
-listnotifications.Max=最大
-listnotifications.uninstalled=(インストールされていません)
-listnotifications.View=表示
-listnotifications.Edit=編集
-listnotifications.Delete=削除
-listnotifications.AddANotificationConnection=通知コネクションを追加
-listnotifications.AddaNewNotificationConnection=新しい通知コネクションを追加
-listnotifications.DeleteNotificationConnection=通知コネクションを削除
-
-viewnotification.ApacheManifoldCFViewNotificationConnectionStatus=Apache ManifoldCF: 通知コネクションの状態を表示
-viewnotification.Deletenotificationconnection=通知コネクションを削除
-viewnotification.qmark=?
-viewnotification.ViewNotificationConnectionStatus=通知コネクションの状態を表示
-viewnotification.uninstalled=(インストールされていません)
-viewnotification.Connectorisnotinstalled=コネクターがインストールされていません
-viewnotification.Threwexception=例外がスローされました:
-viewnotification.NameColon=名前:
-viewnotification.DescriptionColon=説明:
-viewnotification.ConnectionTypeColon=コネクションタイプ:
-viewnotification.MaxConnectionsColon=最大コネクション数:
-viewnotification.ConnectionStatusColon=コネクションの状態:
-viewnotification.Refresh=更新
-viewnotification.EditThisNotificationConnection=この通知コネクションを編集する
-viewnotification.Edit=編集
-viewnotification.DeleteThisNotificationConnection=この通知コネクションを削除する
-viewnotification.Delete=削除
-
-navigation.Listnotificationconnections=通知コネクション一覧
-navigation.ListNotificationConnections=通知コネクション一覧
-
-editjob.SelectANotificationConnectionName=通知コネクション名を選択してください
-editjob.NotificationsColon=通知コネクション:
-editjob.NotificationDescription=説明
-editjob.NotificationConnectionName=コネクション名
-editjob.Deletenotification=通知の削除
-editjob.AddNotification=通知の追加
-editjob.AddANotification=通知の追加
-
-viewjob.NotificationsColon=通知:
-viewjob.NotificationDescription=説明
-viewjob.NotificationConnectionName=コネクション名
-viewjob.NoNotificationConnections=通知コネクションなし
diff --git a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_zh_CN.properties b/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_zh_CN.properties
deleted file mode 100644
index fadcbe2..0000000
--- a/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_zh_CN.properties
+++ /dev/null
@@ -1,1073 +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.
-
-editconnection.Name=名称
-editconnection.Type=类型
-editconnection.Throttling=限流
-editconnection.Addthrottle=添加限流器
-editjob.Name=名称
-editjob.Connection=连接
-
-viewconnection.NoneGlobalAuthority=非全局权限
-viewconnection.ClearHistoryAssociatedWithThisConnection=清除此连接的历史记录
-viewconnection.ClearAllRelatedHistory=清除全部历史记录
-viewconnection.Thiscommandwillclearallhistoryrelatedto=此命令删除所有此连接的历史记录
-viewconnection.period=.
-
-listconnections.GlobalAuthority=全局权限
-
-editjob.Scheduling=调度
-editjob.HopFilters=跳过滤器
-editjob.am=上午
-editjob.pm=下午
-
-index.TheApacheSoftwareFoundation=The Apache® Software Foundation
-index.Copyright=Copyright© 2010-2017
-index.ApacheManifoldCF=Apache ManifoldCF™
-index.WelcomeToApacheManifoldFC=欢迎访问Apache ManifoldCF™
-index.ApacheManifoldCFLogin=登录Apache ManifoldCF™
-index.UserIDColon=用户ID:
-index.PasswordColon=密码:
-index.Login=登录
-index.LoginFailed=登录失败!
-
-errorCode.ServerDown=Couldn't connect to the server. Please check if the server is up and running.
-errorCode.InternalServerError=Oops! Looks like something went wrong.
-
-banner.DocumentIngestion=文档爬取
-
-navigation.LogOut=退出
-navigation.Outputs=输出
-navigation.ListTransformationConnections=转换连接列表
-navigation.ListOutputConnections=输出连接列表
-navigation.Authorities=权限
-navigation.ListUserMappings=用户映射列表
-navigation.ListAuthorityConnections=权限连接列表
-navigation.ListAuthorityGroups=权限组列表
-navigation.Repositories=存储库
-navigation.ListRepositoryConnections=存储库连接列表
-navigation.Jobs=作业
-navigation.ListAllJobs=作业列表
-navigation.StatusAndJobManagement=状态和作业管理
-navigation.StatusReports=状态报告
-navigation.DocumentStatus=文档状态
-navigation.QueueStatus=队列状态
-navigation.HistoryReports=历史记录报告
-navigation.SimpleHistory=简易历史记录
-navigation.MaximumActivity=最大活动数
-navigation.MaximumBandwidth=最大带宽
-navigation.ResultHistogram=结果直方图
-navigation.Miscellaneous=其它
-navigation.Locale=zh_CN
-navigation.Help=帮助
-navigation.Listrepositoryconnections=存储库连接列表
-navigation.Listtransformationconnections=转换连接列表
-navigation.Listoutputconnections=输出连接列表
-navigation.Listusermappings=用户映射列表
-navigation.Listauthorities=权限列表
-navigation.Listauthoritygroups=权限组列表
-navigation.Listjobs=作业列表
-navigation.Managejobs=作业管理
-navigation.Documentstatus=文档状态
-navigation.Queuestatus=队列状态
-navigation.Simplehistory=历史记录报告
-navigation.Maximumactivity=最大活动数
-navigation.Maximumbandwidth=最大带宽
-navigation.Resulthistogram=结果直方图
-
-listoutputs.ApacheManifoldCFListOutputConnections=Apache ManifoldCF: 输出连接列表
-listoutputs.ListOfOutputConnections=输出连接列表
-listoutputs.Name=名称
-listoutputs.Description=说明
-listoutputs.ConnectionType=连接类型
-listoutputs.Max=最大值
-listoutputs.AddaNewOutputConnection=添加新输出连接
-listoutputs.View=显示
-listoutputs.Edit=编辑
-listoutputs.Delete=删除
-listoutputs.DeleteOutputConnection=删除输出连接
-listoutputs.AddAnOutputConnection=添加输出连接
-listoutputs.uninstalled=(卸载)
-
-editoutput.ApacheManifoldCFEditOutputConnection=Apache ManifoldCF: 编辑输出连接
-editoutput.Name=名称
-editoutput.Type=类型
-editoutput.Throttling=限流
-editoutput.EditAnOutputConnection=编辑一个输出连接
-editoutput.EditOutputConnection2=编辑输出连接
-editoutput.ConnectionTypeColon=连接类型:
-editoutput.Continue=下一个
-editoutput.ContinueToNextPage=下一页
-editoutput.Cancel=取消
-editoutput.CancelOutputConnectionEditing=取消编辑输出连接
-editoutput.Save=保存
-editoutput.SaveThisOutputConnection=保存输出连接
-editoutput.MaxConnectionsColon=最大连接数:
-editoutput.EditOutputConnection=编辑输出连接
-editoutput.NameColon=名称:
-editoutput.DescriptionColon=说明:
-editoutput.ConnectionMustHaveAName=连接需要命名
-editoutput.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大连接数需为有效整数
-editoutput.UNREGISTERED=未注册
-editoutput.tab=标签
-
-viewoutput.ApacheManifoldCFViewOutputConnectionStatus=Apache ManifoldCF: 显示输出连接状态
-viewoutput.ViewOutputConnectionStatus=显示输出连接状态
-viewoutput.NameColon=名称:
-viewoutput.DescriptionColon=说明:
-viewoutput.ConnectionTypeColon=连接类型:
-viewoutput.MaxConnectionsColon=最大连接数:
-viewoutput.ConnectionStatusColon=连接状态:
-viewoutput.Refresh=刷新
-viewoutput.EditThisOutputConnection=编辑此输出连接
-viewoutput.Edit=编辑
-viewoutput.DeleteThisOutputConnection=删除此输出连接
-viewoutput.Delete=删除
-viewoutput.ReIngestAllDocumentsAssociatedWithThisOutputConnection=重新爬取所有与此输出连接相关的档案
-viewoutput.ReIngestAllAssociatedDocuments=重新爬取所有相关档案
-viewoutput.RemoveAllDocumentsAssociatedWithThisOutputConnection=删除所有与此输出连接相关的文档
-viewoutput.RemoveAllAssociatedDocuments=删除所有相关档案
-viewoutput.Deleteoutputconnection=删除输出连接
-viewoutput.Thiscommandwillforce=此命令将强制适用于所有和输出连接相关的文档
-viewoutput.toberecrawled=爬取将在下次相关作业开始时重新执行。  继续吗?
-viewoutput.Thiscommandwillcause=此命令导致和ManifoldCF的输出连接相关的\n所有档案失去当前信息
-viewoutput.tobeforgotten=.  继续吗?
-viewoutput.qmark=?
-viewoutput.uninstalled=(卸载)
-viewoutput.Connectorisnotinstalled=连接未安装
-viewoutput.Threwexception=抛出异常:
-
-listtransformations.ApacheManifoldCFListTransformationConnections=Apache ManifoldCF: 转换连接列表
-listtransformations.ListOfTransformationConnections=转换连接列表
-listtransformations.Name=名称
-listtransformations.Description=说明
-listtransformations.ConnectionType=连接类型
-listtransformations.Max=最大值
-listtransformations.AddaNewTransformationConnection=添加新转换连接
-listtransformations.View=显示
-listtransformations.Edit=编辑
-listtransformations.Delete=删除
-listtransformations.DeleteTransformationConnection=删除转换连接
-listtransformations.AddATransformationConnection=添加转换连接
-listtransformations.uninstalled=(uninstalled)
-
-edittransformation.ApacheManifoldCFEditTransformationConnection=Apache ManifoldCF: 编辑转换连接
-edittransformation.Name=名称
-edittransformation.Type=类型
-edittransformation.Throttling=限流
-edittransformation.EditATransformationConnection=编辑一个转换连接
-edittransformation.EditTransformationConnection2=编辑转换连接
-edittransformation.ConnectionTypeColon=连接类型:
-edittransformation.Continue=继续
-edittransformation.ContinueToNextPage=下一页
-edittransformation.Cancel=取消
-edittransformation.CancelTransformationConnectionEditing=取消编辑转换连接
-edittransformation.Save=保存
-edittransformation.SaveThisTransformationConnection=保存此转换连接
-edittransformation.MaxConnectionsColon=最大连接数:
-edittransformation.EditTransformationConnection=编辑转换连接
-edittransformation.NameColon=名称:
-edittransformation.DescriptionColon=说明:
-edittransformation.ConnectionMustHaveAName=连接名不能为空
-edittransformation.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大连接数必须为有效整数
-edittransformation.UNREGISTERED=未注册
-edittransformation.tab=标签
-
-viewtransformation.ApacheManifoldCFViewTransformationConnectionStatus=Apache ManifoldCF: 显示转换连接状态
-viewtransformation.ViewTransformationConnectionStatus=显示转换连接状态
-viewtransformation.NameColon=名称:
-viewtransformation.DescriptionColon=说明:
-viewtransformation.ConnectionTypeColon=连接类型:
-viewtransformation.MaxConnectionsColon=最大连接数:
-viewtransformation.ConnectionStatusColon=连接状态:
-viewtransformation.Refresh=刷新
-viewtransformation.EditThisTransformationConnection=编辑此转换连接
-viewtransformation.Edit=编辑
-viewtransformation.DeleteThisTransformationConnection=删除此转换连接
-viewtransformation.Delete=删除
-viewtransformation.Deletetransformationconnection=删除转换连接
-viewtransformation.qmark=?
-viewtransformation.uninstalled=(未安装)
-viewtransformation.Connectorisnotinstalled=连接器未安装。
-viewtransformation.Threwexception=抛出异常:
-
-listgroups.ApacheManifoldCFListAuthorityGroups=Apache ManifoldCF: 权限组列表
-listgroups.DeleteAuthorityGroup=删除权限组
-listgroups.ListOfAuthorityGroups=权限组列表
-listgroups.Name=名称
-listgroups.Description=说明
-listgroups.View=显示
-listgroups.Edit=编辑
-listgroups.Delete=删除
-listgroups.AddNewGroup=添加新组
-listgroups.AddaNewGroup=添加一个新组
-
-listauthorities.ApacheManifoldCFListAuthorities=Apache ManifoldCF: 权限列表
-listauthorities.ListOfAuthorityConnections=权限连接列表
-listauthorities.DeleteAuthority=删除权限
-listauthorities.Name=名称
-listauthorities.Description=说明
-listauthorities.AuthorityType=权限类型
-listauthorities.Max=最大值
-listauthorities.AddaNewConnection=添加一个新连接
-listauthorities.AddNewConnection=添加新连接
-listauthorities.View=显示
-listauthorities.Edit=编辑
-listauthorities.Delete=删除
-listauthorities.uninstalled=(卸载)
-
-listmappers.ApacheManifoldCFListMappers=Apache ManifoldCF: 映射器列表
-listmappers.ListOfMappingConnections=映射连接列表
-listmappers.DeleteMapper=删除映射器
-listmappers.Name=名称
-listmappers.Description=说明
-listmappers.MapperType=映射器类型
-listmappers.Max=最大值
-listmappers.AddaNewConnection=添加一个新连接
-listmappers.AddNewConnection=添加新连接
-listmappers.View=显示
-listmappers.Edit=编辑
-listmappers.Delete=删除
-listmappers.uninstalled=(卸载)
-
-editgroup.Name=名称
-editgroup.ApacheManifoldCFEditAuthorityGroup=Apache ManifoldCF: 编辑权限组
-editgroup.AuthorityGroupMustHaveAName=权限组需要命名
-editgroup.tab=标签
-editgroup.EditGroup=编辑组
-editgroup.EditAGroup=编辑一个组
-editgroup.NameColon=名称:
-editgroup.DescriptionColon=说明:
-editgroup.Save=保存
-editgroup.SaveThisAuthorityGroup=保存权限组
-editgroup.Cancel=取消
-editgroup.CancelAuthorityGroupEditing=取消编辑权限组
-
-editauthority.ApacheManifoldCFEditAuthority=Apache ManifoldCF: 编辑权限
-editauthority.EditAnAuthority=编辑权限
-editauthority.NameColon=名称:
-editauthority.DescriptionColon=说明:
-editauthority.ConnectionTypeColon=连接类型:
-editauthority.Continue=下一个
-editauthority.ContinueToNextPage=下一页
-editauthority.MaxConnectionsColon=最大连接数:
-editauthority.Cancel=取消
-editauthority.CancelAuthorityEditing=取消权限编辑
-editauthority.Save=保存
-editauthority.SaveThisAuthorityConnection=保存权限连接
-editauthority.EditAuthority=编辑权限
-editauthority.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大连接数需为有效整数
-editauthority.ConnectionMustHaveAName=连接需要命名
-editauthority.NoAuthorityConnectorsRegistered=权限连接器未注册
-editauthority.UNREGISTERED=未注册
-editauthority.tab=标签
-editauthority.Name=名称
-editauthority.Type=类型
-editauthority.Throttling=限流
-editauthority.EditAuthorityConnection=编辑权限连接
-editauthority.Prerequisites=前提条件
-editauthority.PrerequisiteUserMappingColon=用户映射前提条件:
-editauthority.NoPrerequisites=(无前提条件)
-editauthority.AuthorizationDomainColon=授权域:
-editauthority.AuthorityGroupColon=权限组:
-editauthority.SelectAGroup=--选择组--
-editauthority.ConnectionMustHaveAGroup=权限连接需持有一个组
-editauthority.NoAuthorityGroupsDefinedCreateOneFirst=权限组未定义; 创建首个
-editauthority.DefaultDomainNone=缺省域 (None)
-
-editmapper.ApacheManifoldCFEditMapping=Apache ManifoldCF: 编辑映射
-editmapper.EditAMapping=编辑映射
-editmapper.NameColon=名称:
-editmapper.DescriptionColon=说明:
-editmapper.ConnectionTypeColon=连接类型:
-editmapper.Continue=下一个
-editmapper.ContinueToNextPage=下一页
-editmapper.MaxConnectionsColon=最大连接数:
-editmapper.Cancel=取消
-editmapper.CancelMappingEditing=取消编辑映射
-editmapper.Save=保存
-editmapper.SaveThisMappingConnection=保存映射连接
-editmapper.EditMapping=编辑映射
-editmapper.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大连接数需为有效整数
-editmapper.ConnectionMustHaveAName=连接需要命名
-editmapper.NoMappingConnectorsRegistered=无映射连接器
-editmapper.UNREGISTERED=未注册
-editmapper.tab=标签
-editmapper.Name=名称
-editmapper.Type=类型
-editmapper.Throttling=限流
-editmapper.EditMappingConnection=编辑映射连接
-editmapper.Prerequisites=前提条件
-editmapper.PrerequisiteUserMappingColon=用户映射前提条件:
-editmapper.NoPrerequisites=(无前提条件)
-
-listconnections.ApacheManifoldCFListConnections=Apache ManifoldCF: 连接列表
-listconnections.ListOfRepositoryConnections=存储库连接列表
-listconnections.Name=名称
-listconnections.Description=説明
-listconnections.ConnectionType=连接类型
-listconnections.AuthorityGroup=Authority Group
-listconnections.Max=最大值
-listconnections.AddNewConnection=添加新连接
-listconnections.View=显示
-listconnections.Edit=编辑
-listconnections.Delete=删除
-listconnections.DeleteConnection=删除连接:
-listconnections.AddAConnection=添加一个连接
-listconnections.uninstalled=(卸载)
-
-editconnection.ApacheManifoldCFEditConnection=Apache ManifoldCF: 编辑连接
-editconnection.EditAConnection=编辑一个连接
-editconnection.ConnectionTypeColon=连接类型:
-editconnection.AuthorityGroupColon=Authority group:
-editconnection.Cancel=取消
-editconnection.CancelConnectionEditing=取消编辑连接
-editconnection.NameColon=名称:
-editconnection.DescriptionColon=说明:
-editconnection.MaxconnectionsColon=最大连接数数:
-editconnection.ThrottlingColon=限流:
-editconnection.Add=添加
-editconnection.BinRegularExpression=Bin正则表达式
-editconnection.Description=説明
-editconnection.MaxAvgFetchesMin=最大平均提取数/分
-editconnection.NoThrottlingSpecified=限流未指定
-editconnection.Continue=下一个
-editconnection.ContinueToNextPage=下一页
-editconnection.Save=保存
-editconnection.SaveThisAuthorityConnection=保存连接
-editconnection.EditConnection=编辑连接
-editconnection.GlobalAuthority=globalAuthority
-editconnection.ConnectionMustHaveAName=连接需要命名
-editconnection.ThrottleRateMustBeAnInteger=限流率需为整数
-editconnection.TheThrottleExpressionMustBeAValidRegularExpression=限流器表达式需为有效正则表达式
-editconnection.TheMaximumNumberOfConnectionsMustBeAValidInteger=最大连接数需为有效整数
-editconnection.EditRepositoryConnection=编辑存储库连接
-editconnection.NoRepositoryConnectorsRegistered=存储库连接器未注册
-
-editconnection.UNREGISTERED=未注册
-editconnection.tab=标签
-editconnection.Delete=删除
-editconnection.Deletethrottle=删除限流器
-
-viewconnection.ApacheManifoldCFViewRepositoryConnectionStatus=Apache ManifoldCF: 显示存储库连接状态
-viewconnection.ViewRepositoryConnectionStatus=显示存储库连接状态
-viewconnection.NameColon=名称:
-viewconnection.DescriptionColon=说明:
-viewconnection.ConnectionTypeColon=连接类型:
-viewconnection.MaxConnectionsColon=最大连接数:
-viewconnection.AuthorityGroupColon=权限组:
-viewconnection.ThrottlingColon=限流:
-viewconnection.NoThrottles=无限流器
-viewconnection.ConnectionStatusColon=连接状态:
-viewconnection.Refresh=刷新
-viewconnection.EditThisConnection=编辑连接
-viewconnection.Edit=编辑
-viewconnection.Delete=删除
-viewconnection.DeleteConnection=删除连接
-viewconnection.Deletethisconnection=删除此连接
-viewconnection.uninstalled=(卸载)
-viewconnection.Connectorisnotinstalled=连接器未安装
-viewconnection.Threwexception=抛出异常:
-viewconnection.Binregularexpression=Bin正则表达式
-viewconnection.Description=説明
-viewconnection.Maxavgfetches=最大平均提取数/分
-viewconnection.qmark=?
-
-listjobs.ApacheManifoldCFListJobDescriptions=Apache ManifoldCF: 作业列表
-listjobs.JobList=作业列表
-listjobs.Name=名称
-listjobs.OutputConnection=输出连接
-listjobs.RepositoryConnection=存储库连接
-listjobs.ScheduleType=调度类型
-listjobs.AddaNewJob=添加一个新作业
-listjobs.Addajob=添加一个作业
-listjobs.View=显示
-listjobs.Viewjob=显示作业
-listjobs.Edit=编辑
-listjobs.Editjob=编辑作业
-listjobs.Delete=删除
-listjobs.DeleteJob=删除作业
-listjobs.Copy=复制
-listjobs.CopyJob=复制作业
-
-editjob.ApacheManifoldCFEditJob=Apache ManifoldCF: 编辑作业
-editjob.EditaJob=编辑一个作业
-editjob.EditJob=编辑作业
-
-editjob.PipelineColon=管道:
-editjob.StageNumber=阶段
-editjob.StageType=类型
-editjob.StagePrecedent=前提
-editjob.StageDescription=说明
-editjob.StageConnectionName=连接名
-editjob.Repository=存储库
-editjob.Output=输出
-editjob.Transformation=转换
-editjob.InsertTransformationBefore=向前插入转换
-editjob.InsertOutputBefore=向前插入输出
-editjob.Insertnewstagehere=插入新阶段
-editjob.SelectATransformationStageConnectionName=选择转换阶段连接名
-editjob.SelectAnOutputStageConnectionName=选择输出阶段连接名
-editjob.AddAnOutput=添加一个输出
-editjob.AddOutput=添加输出
-editjob.Deletepipelinestage=删除管道阶段
-editjob.Insertnewtransformationhere=插入新转换
-editjob.Insertnewoutputhere=插入新输出
-
-editjob.NoRepositoryConnectionsDefinedCreateOneFirst=存储库连接未指定 - 请创建
-editjob.NoOutputConnectionsDefinedCreateOneFirst=输出连接未指定 - 请创建
-editjob.NameColon=名称:
-editjob.MaximumHopCountForType=类型的最大跳数
-editjob.colon=:
-editjob.cancel=取消
-editjob.CancelJobEditing=取消编辑作业
-editjob.OutputConnectionColon=输出连接:
-editjob.NoneSelected=未指定
-editjob.PriorityColon=优先顺序:
-editjob.Highest=(最大)
-editjob.Lowest=(最小)
-editjob.StartMethodColon=启动方法:
-editjob.RepositoryConnectionColon=存储库连接:
-editjob.Continue=下一个
-editjob.ContinueToNextScreen=下一页
-editjob.StartWhenScheduleWindowStarts=当调度窗启动时开始
-editjob.StartEvenInsideAScheduleWindow=即使在调度窗内亦开始
-editjob.DontAutomaticallyStartThisJob=不自动开始作业
-editjob.ScheduleTypeColon=调度类型:
-editjob.RescanDocumentsDynamically=自动重扫文档
-editjob.ScanEveryDocumentOnce=扫描一次所有文档
-editjob.RecrawlIntervalIfContinuousColon=重新爬取间隔 (如继续):
-editjob.MaxRecrawlIntervalIfContinuousColon=最大重新爬取间隔 (如继续):
-editjob.minutesBlankInfinity=分 (空白=无限)
-editjob.ExpirationIntervalIfContinuousColon=过期间隔 (如继续):
-editjob.ReseedIntervalIfContinuousColon=重新播种间隔 (如继续):
-editjob.NoScheduleSpecified=调度未指定
-editjob.ScheduledTimeColon=调度时间:
-editjob.AnyDayOfWeek=每天
-editjob.Sundays=日
-editjob.Mondays=月
-editjob.Tuesdays=火
-editjob.Wednesdays=水
-editjob.Thursdays=木
-editjob.Fridays=金
-editjob.Saturdays=土
-editjob.at=
-editjob.MidnightAnyHourOfDay=零点/每小时
-editjob.plus=
-editjob.Nothing=无
-editjob.minutes=分
-editjob.in=
-editjob.EveryMonthOfYear=每月
-editjob.January=1月
-editjob.February=2月
-editjob.March=3月
-editjob.April=4月
-editjob.May=5月
-editjob.June=6月
-editjob.July=7月
-editjob.August=8月
-editjob.September=9月
-editjob.October=10月
-editjob.November=11月
-editjob.December=12月
-editjob.on=
-editjob.AnyDayOfMonth=每天
-editjob.MaximumRunTimeColon=最大执行时间:
-editjob.RemoveSchedule=删除调度
-editjob.DeleteUnreachableDocuments=删除无法读取的文档信息
-editjob.KeepUnreachableDocumentsForNow=暂时保存无法读取的文档信息
-editjob.KeepUnreachableDocumentsForever=永久保存无法读取的文档信息
-editjob.HopCountModeColon=跳数模式:
-editjob.Save=保存
-editjob.SaveThisJob=保存作业
-editjob.AddScheduledTime=添加调度
-editjob.AddNewScheduleRecord=添加新调度记录
-editjob.JobMustHaveAName=作业需要命名
-editjob.DurationMustBeAValidInteger=持续期间需为有效整数
-editjob.RecrawlIntervalMustBeAValidIntegerOrNull=重新爬取间隔需为有效整数或null
-editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull=最大重新爬取间隔需为有效整数或null
-editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval=最大重新爬取间隔要大于重新爬取间隔
-editjob.ReseedIntervalMustBeAValidIntegerOrNull=重新播种间隔需为有效整数或null
-editjob.ExpirationIntervalMustBeAValidIntegerOrNull=过期间隔需为有效整数或null
-editjob.RemoveScheduleRecord=删除调度记录: #
-editjob.ForcedMetadata=强制性元数据
-editjob.ForcedMetadataColon=强制性元数据:
-editjob.ParameterName=参数名称
-editjob.ParameterValue=参数值
-editjob.Deleteforcedmetadatanumber=删除强制性元数据: #
-editjob.Delete=删除
-editjob.NoForcedMetadataSpecified=强制性元数据未指定
-editjob.Add=添加
-editjob.Addforcedmetadata=添加强制性元数据
-editjob.ForcedMetadataNameMustNotBeNull=强制性元数据名不能为null
-editjob.st=日
-editjob.nd=日
-editjob.rd=日
-editjob.th=日
-editjob.dayofmonth=日
-editjob.JobInvocationColon=作业启动:
-editjob.Minimal=最小
-editjob.Complete=结束
-
-editjob.tab=标签
-
-showjobstatus.ApacheManifoldCFStatusOfAllJobs=Apache ManifoldCF: 所有作业的状态
-showjobstatus.Name=名称
-showjobstatus.Status=状态
-showjobstatus.StartTime=开始时间
-showjobstatus.EndTime=终止时间
-showjobstatus.Documents=文档
-showjobstatus.Active=有效
-showjobstatus.Processed=已处理
-showjobstatus.RefreshStatus=刷新状态列表
-showjobstatus.Refresh=刷新
-showjobstatus.StatusOfJobs=作业状态
-
-showjobstatus.Notyetrun=还未执行
-showjobstatus.Running=执行中
-showjobstatus.Runningnoconnector=执行中, 无连接器
-showjobstatus.Aborting=异常终止
-showjobstatus.Restarting=重启
-showjobstatus.Stopping=停止
-showjobstatus.Resuming=恢复
-showjobstatus.Paused=暂停
-showjobstatus.Done=结束
-showjobstatus.Waiting=待机
-showjobstatus.Startingup=开始
-showjobstatus.Cleaningup=清理
-showjobstatus.Terminating=终止
-showjobstatus.Endnotification=终止通知
-showjobstatus.ErrorColon=错误:
-showjobstatus.Unknown=未知
-showjobstatus.Notstarted=未开始
-showjobstatus.Aborted=异常终止
-showjobstatus.Neverrun=从未执行
-showjobstatus.Start=开始
-showjobstatus.Startminimal=开始最小模式
-showjobstatus.Restart=重新开始
-showjobstatus.Restartminimal=重新开始最小模式
-showjobstatus.Pause=暂停
-showjobstatus.Abort=中断
-showjobstatus.Resume=恢复
-showjobstatus.Startjob=开始作业
-showjobstatus.minimally=最小
-showjobstatus.Restartjob=重新开始作业
-showjobstatus.Pausejob=停止作业
-showjobstatus.Abortjob=中断作业
-showjobstatus.Resumejob=恢复作业
-
-documentstatus.ApacheManifoldCFDocumentStatus=Apache ManifoldCF: 文档状态
-documentstatus.DocumentStatus=文档状态
-documentstatus.Connection=连接:
-documentstatus.TimeOffsetFromNowMinutes=从现在起的经过时间(分):
-documentstatus.DocumentState=文档状态:
-documentstatus.DocumentIdentifierMatch=文档标识符匹配:
-documentstatus.Go=执行
-documentstatus.ExecuteThisQuery=执行此查询
-documentstatus.Continue=下一个
-documentstatus.PleaseSelectAtLeastOneJob=请选择至少一个作业
-documentstatus.PleaseSelectaConnection=请选择一个连接
-documentstatus.Previous=上一个
-documentstatus.Next=下一个
-documentstatus.Rows=行:
-documentstatus.RowsPerPage=行/页:
-documentstatus.DocumentsThatHaveNeverBeenProcessed=从未处理过的文档
-documentstatus.DocumentsProcessedAtLeastOnce=至少处理过一次的文档
-documentstatus.DocumentsOutOfScope=范围之外的文档
-documentstatus.DocumentsThatAreNoLongerActive=无效文档
-documentstatus.DocumentsCurrentlyInProgress=处理中的文档
-documentstatus.DocumentsCurrentlyBeingExpired=过期文档
-documentstatus.DocumentsCurrentlyBeingDeleted=删除中的文档
-documentstatus.DocumentsCurrentlyAvailableForProcessing=可处理的文档
-documentstatus.DocumentsCurrentlyAvailableForExpiration=可过期的文档
-documentstatus.DocumentsNotYetProcessable=准备处理的文档
-documentstatus.DocumentsNotYetExpirable=不可过期的文档
-documentstatus.DocumentsWaitingForever=无限等待中的文档
-documentstatus.DocumentsHopcountExceeded=超过跳数限制的文档
-documentstatus.NotSpecified=未指定
-documentstatus.Jobs=作业:
-documentstatus.Identifier=标识符
-documentstatus.Job=作业
-documentstatus.State=状态
-documentstatus.Status=状況
-documentstatus.Scheduled=调度
-documentstatus.ScheduledAction=调度动作
-documentstatus.RetryCount=重试次数
-documentstatus.RetryLimit=重试上限
-documentstatus.EnterALegalNumberForRowsPerPage=请正确输入每页行数
-documentstatus.IdentifierMatchMustBeAValidRegularExpression=标识符匹配需为有效正则表达式
-
-queuestatus.ApacheManifoldCFQueueStatus=Apache ManifoldCF: 队列状态
-queuestatus.QueueStatus=队列状态
-queuestatus.Connection=连接:
-queuestatus.NotSpecified=未指定
-queuestatus.Jobs=作业:
-queuestatus.TimeOffsetFromNowMinutes=从现在起的经过时间(分):
-queuestatus.DocumentState=文档状态:
-queuestatus.DocumentIdentifierMatch=文档标识符匹配:
-queuestatus.IdentifierClassDescription=标识符类说明:
-queuestatus.Go=执行
-queuestatus.ExecuteThisQuery=执行此查询
-queuestatus.Continue=下一个
-queuestatus.PleaseSelectAtLeastOneJob=请选择至少一个作业
-queuestatus.PleaseSelectaConnection=请选择一个连接
-queuestatus.DocumentsThatHaveNeverBeenProcessed=从未处理过的文档
-queuestatus.DocumentsProcessedAtLeastOnce=至少处理过一次的文档
-queuestatus.DocumentsOutOfScope=范围之外的文档
-queuestatus.DocumentsThatAreNoLongerActive=无效文档
-queuestatus.DocumentsCurrentlyInProgress=处理中的文档
-queuestatus.DocumentsCurrentlyBeingExpired=过期文档
-queuestatus.DocumentsCurrentlyBeingDeleted=删除中的文档
-queuestatus.DocumentsCurrentlyAvailableForProcessing=可处理的文档
-queuestatus.DocumentsCurrentlyAvailableForExpiration=可过期的文档
-queuestatus.DocumentsNotYetProcessable=准备处理中的文档
-queuestatus.DocumentsNotYetExpirable=不可过期的文档
-queuestatus.DocumentsWaitingForever=无限等待中的文档
-queuestatus.DocumentsHopcountExceeded=超过跳数限制的文档
-queuestatus.Rows=行:
-queuestatus.RowsPerPage=行/页:
-queuestatus.IdentifierClass=标识符类
-queuestatus.Inactive=无效
-queuestatus.Processing=处理中
-queuestatus.Expiring=过期中
-queuestatus.Deleting=删除中
-queuestatus.AboutToProcess=即将处理
-queuestatus.AboutToExpire=即将过期
-queuestatus.WaitingForProcessing=等待处理中
-queuestatus.WaitingForExpiration=等待过期中
-queuestatus.WaitingForever=无限等待
-queuestatus.HopcountExceeded=超过跳数限制
-queuestatus.Previous=上一个
-queuestatus.PreviousPage=上一页
-queuestatus.Next=下一个
-queuestatus.NextPage=下一页
-queuestatus.IdentifierClassDescriptionCannotBeEmpty=标识符类说明不能为空
-queuestatus.IdentifierClassDescriptionMustBeAValidRegularExpression=标识符类说明需为有效正则表达式
-queuestatus.IdentifierClassDescriptionMustDelimitAClassWithParentheses=标识符类说明需用括号("(",")")括上
-queuestatus.EnterALegalNumberForRowsPerPage=请正确输入每页的行数
-queuestatus.IdentifierMatchMustBeAValidRegularExpression=标识符匹配需为有效正则表达式
-
-simplereport.ApacheManifoldCFSimpleHistoryReport=Apache ManifoldCF: 历史记录报告
-simplereport.SimpleHistoryReport=历史记录报告
-simplereport.Connection=连接:
-simplereport.NotSpecified=未指定
-simplereport.on=
-simplereport.Activities=活动数:
-simplereport.StartTime=开始时间:
-simplereport.EndTime=终止时间:
-simplereport.January=1月
-simplereport.February=2月
-simplereport.March=3月
-simplereport.April=4月
-simplereport.May=5月
-simplereport.June=6月
-simplereport.July=7月
-simplereport.August=8月
-simplereport.September=9月
-simplereport.October=10月
-simplereport.November=11月
-simplereport.December=12月
-simplereport.EntityMatch=实体匹配:
-simplereport.ResultCodeMatch=结果代码匹配:
-simplereport.Go=执行
-simplereport.ExecuteThisQuery=执行此查询
-simplereport.Continue=下一个
-simplereport.StartTime=开始时间
-simplereport.Activity=活动
-simplereport.Identifier=标识符
-simplereport.ResultCode=结果代码
-simplereport.Bytes=字节数
-simplereport.Time=时间
-simplereport.ResultDescription=结果说明
-simplereport.Previous=上一个
-simplereport.PreviousPage=上一页
-simplereport.NextPage=下一页
-simplereport.Next=下一个
-simplereport.Rows=Rows:
-simplereport.RowsPerPage=行/页:
-simplereport.PleaseSelectAConnection=请选择连接
-simplereport.EnterALegalNumberForRowsPerPage=请正确输入每页的行数
-simplereport.EntityMatchMustBeAValidRegularExpression=实体匹配需为有效正则表达式
-simplereport.ResultCodeMatchMustBeAValidRegularExpression=结果代码需为有效正则表达式
-
-maxactivityreport.ApacheManifoldCFMaximumActivityReport=Apache ManifoldCF: 最大活动报告
-maxactivityreport.MaximumActivityReport=最大活动报告
-maxactivityreport.Connection=连接:
-maxactivityreport.NotSpecified=未指定
-maxactivityreport.on=
-maxactivityreport.Activities=活动数:
-maxactivityreport.StartTime=开始时间:
-maxactivityreport.EndTime=终止时间:
-maxactivityreport.January=1月
-maxactivityreport.February=2月
-maxactivityreport.March=3月
-maxactivityreport.April=4月
-maxactivityreport.May=5月
-maxactivityreport.June=6月
-maxactivityreport.July=7月
-maxactivityreport.August=8月
-maxactivityreport.September=9月
-maxactivityreport.October=10月
-maxactivityreport.November=11月
-maxactivityreport.December=12月
-maxactivityreport.EntityMatch=实体匹配:
-maxactivityreport.ResultCodeMatch=结果代码匹配:
-maxactivityreport.Go=执行
-maxactivityreport.ExecuteThisQuery=执行此查询
-maxactivityreport.Continue=下一个
-maxactivityreport.IdentifierClass=标识符类
-maxactivityreport.HighestActivityRate=最大活动率(/分)
-maxactivityreport.StartTime=开始时间
-maxactivityreport.IdentifierClassDescription=标识符类说明:
-maxactivityreport.SlidingWindowSize=滑动窗大小(分):
-maxactivityreport.Previous=上一个
-maxactivityreport.PreviousPage=上一页
-maxactivityreport.NextPage=下一页
-maxactivityreport.Next=下一个
-maxactivityreport.Rows=Rows:
-maxactivityreport.RowsPerPage=行/页:
-maxactivityreport.PleaseSelectAConnection=请选择连接
-maxactivityreport.EnterALegalNumberForRowsPerPage=请正确输入每页的行数
-maxactivityreport.EnterALegalIntervalSizeInMinutes=请正确输入间隔(分)
-maxactivityreport.IdentifierClassDescriptionCannotBeEmpty=请输入标识符类说明
-maxactivityreport.IdentifierClassDescriptionMustBeAValidRegularExpression=标识符类说明需为有效正则表达式
-maxactivityreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=标识符类说明需用括号("(",")")括上
-maxactivityreport.EntityMatchMustBeAValidRegularExpression=实体匹配需为有效正则表达式
-maxactivityreport.ResultCodeMatchMustBeAValidRegularExpression=结果代码匹配需为有效正则表达式
-
-maxbandwidthreport.ApacheManifoldCFMaximumBandwidthReport=Apache ManifoldCF: 最大带宽报告
-maxbandwidthreport.MaximumBandwidthReport=最大带宽报告
-maxbandwidthreport.Connection=连接:
-maxbandwidthreport.NotSpecified=未指定
-maxbandwidthreport.on=
-maxbandwidthreport.Activities=活动数:
-maxbandwidthreport.StartTime=开始时间:
-maxbandwidthreport.EndTime=终止时间:
-maxbandwidthreport.January=1月
-maxbandwidthreport.February=2月
-maxbandwidthreport.March=3月
-maxbandwidthreport.April=4月
-maxbandwidthreport.May=5月
-maxbandwidthreport.June=6月
-maxbandwidthreport.July=7月
-maxbandwidthreport.August=8月
-maxbandwidthreport.September=9月
-maxbandwidthreport.October=10月
-maxbandwidthreport.November=11月
-maxbandwidthreport.December=12月
-maxbandwidthreport.EntityMatch=实体匹配:
-maxbandwidthreport.ResultCodeMatch=结果代码匹配:
-maxbandwidthreport.Go=执行
-maxbandwidthreport.ExecuteThisQuery=执行此查询
-maxbandwidthreport.Continue=下一个
-maxbandwidthreport.IdentifierClass=标识符类
-maxbandwidthreport.HighestActivityRate=最大活动率(/分)
-maxbandwidthreport.StartTime=开始时间
-maxbandwidthreport.HighestBandwidth=最大带宽 [bps]
-maxbandwidthreport.IdentifierClassDescription=标识符类说明:
-maxbandwidthreport.SlidingWindowSize=滑动窗大小(分):
-maxbandwidthreport.Previous=上一个
-maxbandwidthreport.PreviousPage=上一页
-maxbandwidthreport.NextPage=下一页
-maxbandwidthreport.Next=下一个
-maxbandwidthreport.RowsPerPage=行/页:
-maxbandwidthreport.PleaseSelectAConnection=请选择连接
-maxbandwidthreport.HighestBandwidth2=最大带宽
-maxbandwidthreport.Rows=行:
-maxbandwidthreport.Next=下一页
-maxbandwidthreport.EnterALegalNumberForRowsPerPage=请正确输入每页的行数
-maxbandwidthreport.EnterALegalIntervalSizeInMinutes=请正确输入间隔(分)
-maxbandwidthreport.IdentifierClassDescriptionCannotBeEmpty=请输入标识符类说明
-maxbandwidthreport.IdentifierClassDescriptionMustBeAValidRegularExpression=标识符类说明需为有效正则表达式
-maxbandwidthreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=标识符类说明需用括号("(",")")括上
-maxbandwidthreport.EntityMatchMustBeAValidRegularExpression=实体匹配需为有效正则表达式
-maxbandwidthreport.ResultCodeMatchMustBeAValidRegularExpression=结果代码匹配需为有效正则表达式
-
-resultreport.ApacheManifoldCFActivityResultReport=Apache ManifoldCF: 活动报告
-resultreport.ActivityResultReport=活动报告
-resultreport.Connection=连接:
-resultreport.NotSpecified=未指定
-resultreport.on=
-resultreport.Activities=活动数:
-resultreport.StartTime=开始时间:
-resultreport.EndTime=终止时间:
-resultreport.January=1月
-resultreport.February=2月
-resultreport.March=3月
-resultreport.April=4月
-resultreport.May=5月
-resultreport.June=6月
-resultreport.July=7月
-resultreport.August=8月
-resultreport.September=9月
-resultreport.October=10月
-resultreport.November=11月
-resultreport.December=12月
-resultreport.EntityMatch=实体匹配:
-resultreport.ResultCodeMatch=结果代码匹配:
-resultreport.Go=执行
-resultreport.ExecuteThisQuery=执行此查询
-resultreport.Continue=下一个
-resultreport.IdentifierClassDescription=标识符类说明:
-resultreport.ResultCodeClassDescription=结果代码类说明:
-resultreport.Previous=上一个
-resultreport.PreviousPage=上一页
-resultreport.NextPage=下一页
-resultreport.Next=下一个
-resultreport.Rows=行:
-resultreport.RowsPerPage=行/页:
-resultreport.PleaseSelectAConnection=请选择连接
-resultreport.IdentifierClass=标识符类
-resultreport.ResultClass=结果类
-resultreport.EventCount=事件数
-resultreport.Next=下一个
-resultreport.EnterALegalNumberForRowsPerPage=请正确输入每页的行数
-resultreport.IdentifierClassDescriptionCannotBeEmpty=请输入标识符类说明
-resultreport.ResultClassDescriptionCannotBeEmpty=请输入结果类说明
-resultreport.IdentifierClassDescriptionMustBeAValidRegularExpression=标识符类说明需为有效正则表达式
-resultreport.ResultClassDescriptionMustBeAValidRegularExpression=结果类说明需为有效正则表达式
-resultreport.IdentifierClassDescriptionMustDelimitAClassWithParentheses=标识符类说明需用括号("(",")")括上
-resultreport.ResultClassDescriptionMustDelimitAClassWithParentheses=结果类说明需用括号("(",")")括上
-resultreport.EntityMatchMustBeAValidRegularExpression=实体匹配需为有效正则表达式
-resultreport.ResultCodeMatchMustBeAValidRegularExpression=结果代码匹配需为有效正则表达式
-
-error.ApacheManifoldCFError=Apache ManifoldCF: 错误
-error.Error=错误
-error.Return=返回
-error.Unauthorized=Apache ManifoldCF: Unauthorized activity
-error.UnauthorizedAccess=You do not have permissions to perform this activity
-error.ApacheManifoldCFMaintenanceUnderway=Apache ManifoldCF: Maintenance underway
-error.MaintenanceUnderway=Maintenance underway
-error.PleaseTryAgainLater=维护中。请稍等。
-
-viewjob.ApacheManifoldCFViewJob=Apache ManifoldCF: 作业信息
-viewjob.ViewAJob=作业信息
-
-viewjob.PipelineColon=管道:
-viewjob.StageNumber=阶段
-viewjob.StageType=类型
-viewjob.StagePrecedent=前提
-viewjob.StageDescription=说明
-viewjob.StageConnectionName=连接名
-viewjob.Repository=存储库
-viewjob.Output=输出
-viewjob.Transformation=转换
-
-viewjob.ScheduleTypeColon=调度类型:
-viewjob.MinimumRecrawlIntervalColon=最小重新爬取间隔:
-viewjob.MaximumRecrawlIntervalColon=最大重新爬取间隔:
-viewjob.ExpirationIntervalColon=过期间隔:
-viewjob.ReseedIntervalColon=重新播种间隔:
-viewjob.NoScheduledRunTimes=没有调度执行时间
-viewjob.ScheduledTimeColon=调度时间:
-viewjob.MaximumRunTimeColon=最长执行时间:
-viewjob.MaximumHopCountForLinkType=链接类型的最大跳数
-viewjob.HopCountModeColon=跳数模式:
-viewjob.Delete=删除
-viewjob.DeleteThisJob=删除作业
-viewjob.Edit=编辑
-viewjob.EditThisJob=编辑作业
-viewjob.Copy=复制
-viewjob.CopyThisJob=复制作业
-viewjob.ResetSeeding=重置播种
-viewjob.ResetSeedingThisJob=为此作业重置增量式播种
-viewjob.NameColon=名称:
-viewjob.OutputConnectionColon=输出连接:
-viewjob.RepositoryConnectionColon=存储库连接:
-viewjob.PriorityColon=优先级:
-viewjob.StartMethodColon=开始方法:
-viewjob.ForcedMetadataColon=强制性元数据:
-viewjob.NoForcedMetadata=无强制性元数据
-viewjob.DeleteJobConfirmation=警告: 删除此作业将会删除索引中的所有相关文档\n确认吗?
-viewjob.StartOverConfirmation=警告: 此动作将致使所有作业文档在下一个作业执行期间受到检查。\n继续进行吗?
-viewjob.Notapplicable=不适用
-viewjob.Rescandocumentsdynamically=自动重扫文档
-viewjob.Infinity=无限
-viewjob.minutes=分
-viewjob.Scaneverydocumentonce=一次性扫描所有文档
-viewjob.Startatbeginningofschedulewindow=从调度窗起始位置开始
-viewjob.Startinsideschedulewindow=从调度窗内部开始
-viewjob.Dontautomaticallystart=不自动开始
-viewjob.Anydayoftheweek=每天
-viewjob.Sundays=日
-viewjob.Mondays=月
-viewjob.Tuesdays=火
-viewjob.Wednesdays=水
-viewjob.Thursdays=木
-viewjob.Fridays=金
-viewjob.Saturdays=土
-viewjob.oneveryhour=每时
-viewjob.atmidnight=半夜
-viewjob.at=在
-viewjob.am=上午
-viewjob.pm=下午
-viewjob.plus=加
-viewjob.ineverymonthofyear=每月
-viewjob.in=
-viewjob.January=1月
-viewjob.February=2月
-viewjob.March=3月
-viewjob.April=4月
-viewjob.May=5月
-viewjob.June=6月
-viewjob.July=7月
-viewjob.August=8月
-viewjob.September=9月
-viewjob.October=10月
-viewjob.November=11月
-viewjob.December=12月
-viewjob.onanydayofthemonth=每天
-viewjob.onthe1stofthemonth=每月1日
-viewjob.onthe=于
-viewjob.ofthemonth=本月的
-viewjob.inyears=年里
-viewjob.Nolimit=无上限
-viewjob.Unlimited=无限制
-viewjob.Deleteunreachabledocuments=删除未能获取的文档
-viewjob.Nodeletesfornow=暂无删除
-viewjob.Nodeletesforever=永无删除
-viewjob.st=日
-viewjob.nd=日
-viewjob.rd=日
-viewjob.th=日
-viewjob.JobInvocationColon=作业启动:
-viewjob.Minimal=最小
-viewjob.Complete=结束
-
-viewgroup.ApacheManifoldCFViewGroup=Apache ManifoldCF: 显示权限组
-viewgroup.ViewAuthorityGroup=显示权限组
-viewgroup.NameColon=名称:
-viewgroup.DescriptionColon=说明:
-viewgroup.EditThisAuthorityGroup=编辑权限组
-viewgroup.Edit=编辑
-viewgroup.DeleteThisAuthorityGroup=删除权限组
-viewgroup.Delete=删除
-
-viewauthority.ViewAuthorityConnectionStatus=显示权限连接状态
-viewauthority.NameColon=名称:
-viewauthority.DescriptionColon=说明:
-viewauthority.AuthorityTypeColon=权限类型:
-viewauthority.MaxConnectionsColon=最大连接数:
-viewauthority.ConnectionStatusColon=连接状态:
-viewauthority.Refresh=刷新
-viewauthority.Edit=编辑
-viewauthority.EditThisAuthorityConnection=编辑权限连接
-viewauthority.Delete=删除
-viewauthority.DeleteThisAuthorityConnection=权限删除连接
-viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus=Apache ManifoldCF: 显示权限连接状态
-viewauthority.DeleteConnection=删除连接
-viewauthority.Connectorisnotinstalled=连接器未安装
-viewauthority.uninstalled=(卸载)
-viewauthority.Threwexception=抛出异常:
-viewauthority.qmark=?
-viewauthority.PrerequisiteUserMappingColon=用户映射前提条件:
-viewauthority.NoPrerequisites=无前提条件
-viewauthority.AuthorizationDomainColon=授权域:
-viewauthority.AuthorityGroupColon=权限组:
-
-viewmapper.ApacheManifoldCFViewMappingConnectionStatus=Apache ManifoldCF: 显示映射连接状态
-viewmapper.DeleteConnection=删除连接
-viewmapper.ViewMappingConnectionStatus=显示映射连接状态
-viewmapper.uninstalled=(卸载)
-viewmapper.Connectorisnotinstalled=连接器未安装
-viewmapper.Threwexception=抛出异常:
-viewmapper.NameColon=名称:
-viewmapper.DescriptionColon=说明:
-viewmapper.MapperTypeColon=映射类型:
-viewmapper.MaxConnectionsColon=最大连接数:
-viewmapper.ConnectionStatusColon=连接状态:
-viewmapper.Refresh=刷新
-viewmapper.Edit=编辑
-viewmapper.EditThisMappingConnection=编辑此映射连接
-viewmapper.Delete=删除
-viewmapper.DeleteThisMappingConnection=删除此映射连接
-viewmapper.qmark=?
-viewmapper.PrerequisiteUserMappingColon=用户映射前提条件:
-viewmapper.NoPrerequisites=无前提条件
-
-edittransformation.NoTransformationConnectorsRegistered=No transformation connectors registered
-editoutput.NoOutputConnectorsRegistered=No output connectors registered
-editnotification.NoNotificationConnectorsRegistered=No notification connectors registered
-editnotification.Name=Name
-editnotification.Type=Type
-editnotification.Throttling=Throttling
-editnotification.ApacheManifoldCFEditNotificationConnection=Apache ManifoldCF: Edit Notification Connection
-editnotification.ConnectionMustHaveAName=Connection must have a name
-editnotification.TheMaximumNumberOfConnectionsMustBeAValidInteger=The maximum number of connections must be a valid integer
-editnotification.EditNotificationConnection2=Edit Notification Connection
-editnotification.EditNotificationConnection=Edit notification connection
-editnotification.EditANotificationConnection=Edit a notification connection
-editnotification.tab=tab
-editnotification.NameColon=Name:
-editnotification.DescriptionColon=Description:
-editnotification.TypeColon=Type:
-editnotification.UNREGISTERED=UNREGISTERED
-editnotification.ConnectionTypeColon=Connection type:
-editnotification.MaxConnectionsColon=Max connections:
-editnotification.Save=Save
-editnotification.Continue=Continue
-editnotification.SaveThisNotificationConnection=Save this notification connection
-editnotification.ContinueToNextPage=Continue to next page
-editnotification.Cancel=Cancel
-editnotification.CancelNotificationConnectionEditing=Cancel notification connection editing
-
-listnotifications.ApacheManifoldCFListNotificationConnections=Apache ManifoldCF: List Notification Connections
-listnotifications.DeleteNotificationConnection=Delete notification connection
-listnotifications.ListOfNotificationConnections=List of Notification Connections
-listnotifications.Name=Name
-listnotifications.Description=Description
-listnotifications.ConnectionType=Connection Type
-listnotifications.Max=Max
-listnotifications.uninstalled=(uninstalled)
-listnotifications.View=View
-listnotifications.Edit=Edit
-listnotifications.Delete=Delete
-listnotifications.AddANotificationConnection=Add a notification connection
-listnotifications.AddaNewNotificationConnection=Add a new notification connection
-listnotifications.DeleteNotificationConnection=Delete notification connection
-
-viewnotification.ApacheManifoldCFViewNotificationConnectionStatus=Apache ManifoldCF: View Notification Connection Status
-viewnotification.Deletenotificationconnection=Delete notification connection
-viewnotification.qmark=?
-viewnotification.ViewNotificationConnectionStatus=View Notification Connection Status
-viewnotification.uninstalled=(uninstalled)
-viewnotification.Connectorisnotinstalled=Connector is not installed
-viewnotification.Threwexception=Threw exception:
-viewnotification.NameColon=Name:
-viewnotification.DescriptionColon=Description:
-viewnotification.ConnectionTypeColon=Connection type:
-viewnotification.MaxConnectionsColon=Max connections:
-viewnotification.ConnectionStatusColon=Connection status:
-viewnotification.Refresh=Refresh
-viewnotification.EditThisNotificationConnection=Edit this notification connection
-viewnotification.Edit=Edit
-viewnotification.DeleteThisNotificationConnection=Delete this notification connection
-viewnotification.Delete=Delete
-
-navigation.Listnotificationconnections=List notification connections
-navigation.ListNotificationConnections=List Notification Connections
-
-editjob.SelectANotificationConnectionName=Select a notification connection name
-editjob.NotificationsColon=Notifications:
-editjob.NotificationDescription=Description
-editjob.NotificationConnectionName=Connection name
-editjob.Deletenotification=Delete notification
-editjob.AddNotification=Add notification
-editjob.AddANotification=Add a notification
-
-viewjob.NotificationsColon=Notifications:
-viewjob.NotificationDescription=Description
-viewjob.NotificationConnectionName=Connection name
-viewjob.NoNotificationConnections=No notification connections
diff --git a/lib-license/LICENSE.txt b/lib-license/LICENSE.txt
deleted file mode 100644
index a6c9283..0000000
--- a/lib-license/LICENSE.txt
+++ /dev/null
@@ -1,2329 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-
-Includes software from other Apache Software Foundation projects,
-including, but not limited to:
-  - Apache Tika
-  - Apache Poi
-  - Apache Pdfbox
-  - Apache Tomcat
-  - Apache Commons
-  - Apache Geronimo
-  - Apache Log4j
-  - Apache Axis
-  - Apache Xerces2
-  - Apache Chemistry
-  - Apache OpenNLP
-  - Apache Velocity
-  - Apache Avalon
-  - Apache FOP
-  - Apache XMLGraphics-commons
-  - Apache Mime4J
-  - Apache XMLBeans
-  - Apache SIS
-  - Apache OpenNLP
-  - Apache Kafka
-  - Apache CXF
-
-This product includes a number of slf4j jars.
-License: MIT/X11 license
-
-This product includes a postgresql.jar: http://jdbc.postgresql.org
-License: BSD License (http://jdbc.postgresql.org/license.html)
-
-This product includes a JUnit jar: http://junit.sourceforge.net/
-License: Common Public License - v 1.0 (http://junit.sourceforge.net/cpl-v10.html)
-
-This product includes an eclipse-ecj.jar.
-License: Eclipse Public License - v 1.0 (http://www.eclipse.org/legal/epl-v10.html)
-
-This product includes an hsqldb.jar: http://hsqldb.org/
-License: HSQL Development Group License (http://hsqldb.org/web/hsqlLicense.html)
-
-This product includes JSP API jars.
-License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)
-
-This product includes a stax-api.jar.
-License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a wstx-asl.jar.
-License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a stax-ex.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a org.osgi.core.jar.
-License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a resolver.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jaxb-impl.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a saaj-impl.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a streambuffer.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a jaxws-rt.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes an activation.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a jsr250-api.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a jsr181-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a jaxb-api.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a saaj-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a jaxws-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a mimepull.jar.
-License: COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0  (http://www.opensource.org/licenses/cddl1.php)    License: GPLv2 with classpath exception  (http://www.gnu.org/software/classpath/license.html)
-
-This product includes a h2-support.jar.
-License: MIT/X11 license
-
-This product includes a mail.jar.
-License: Common Development And Distribution License (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)
-
-This product includes a wss4j.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes an opensaml.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a h2.jar.
-License: Dual; MPL 1.1 (http://www.mozilla.org/MPL/), and Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
-Jar included under terms of EPL 1.0.
-
-This product includes a xmlsec.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a wsdl4j.jar.
-License: CPL 1.0 (http://www.opensource.org/licenses/cpl1.0)
-
-This product includes a jstl-api-1.2.jar.
-License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)
-
-This product includes a jstl-impl-1.2.jar.
-License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)
-
-This product includes a dropbox-client.jar.
-License: MIT license (http://opensource.org/licenses/MIT).
-
-This product includes a json-simple.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a json.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sentiment-analysis-parser.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jackson-core.jar, jackson-databind.jar, and jackson-annotations.jar.
-License: Dual license; we choose to distribute under Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-api-client.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-oauth-client.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-api-services-drive-v2.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-api-services-drive-v2.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-http-client.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a google-http-client-jackson2.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a guava.jar.
-License: Apache 2  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a tagsoup.jar.
-License: Apache 2 (http://home.ccil.org/~cowan/XML/tagsoup/)
-
-This product includes a javax.servlet-api.jar.
-License: Dual CDDL 1.0 and GPLv2 with classpath exception (https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-Redistributed under the terms of CDDL 1.0.
-
-This product includes a jhighlight.jar.
-License: Dual CDDL 1.0 and LGPLv2.1 (http://www.opensource.org/licenses/cddl1.php and http://www.opensource.org/licenses/lgpl-license.php)
-Redistributed under the terms of CDDL 1.0.
-
-This product includes a jmatio.jar.
-License: BSD License (https://github.com/sinjax/JMatIO/blob/master/license.txt)
-
-This product includes a java-libpst.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a vorbis-java-core.jar and vorbis-java-tika.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a metadata-extractor.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a bcprov-jdk15.jar and a bcmail-jdk15.jar.
-License: BouncyCastle license (http://www.bouncycastle.org/licence.html) [MIT derivative]
-
-This product includes an xz.jar.
-License: Public domain
-
-This product includes a juniversalchardet.jar.
-License: Mozilla Public License 1.1 (MPL 1.1) (http://www.mozilla.org/MPL/MPL-1.1.html)
-
-This product includes a boilerpipe.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a dom4j.jar.
-License: BSD license (http://dom4j.sourceforge.net/dom4j-1.6.1/license.html)
-
-This product includes an asm.jar, asm-analysis.jar, asm-commons.jar, asm-debug-all.jar,
-asm-tree.jar, and asm-util.jar.
-License: BSD license.
-
-This product includes an xmpcore.jar.
-License: BSD license (http://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html)
-
-This product includes a jdom2.jar.
-License: Apache 2, without attribution requirement. (https://raw.githubusercontent.com/hunterhacker/jdom/master/LICENSE.txt)
-
-This product includes a rome.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes an isoparser.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes an xz.jar.
-License: Public domain
-
-This product includes an xmlschema-core.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a javax.annotation-api.jar.
-License: CDDL + GPLv2 with classpath exception (https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-Redistributed under terms of CDDL 1.0 license.
-
-This product includes a javax.ws.rs-api.jar.
-License: CDDL 1.1 + GPLv2 with classpath exception (http://glassfish.java.net/public/CDDL+GPL_1_1.html)
-Redistributed under terms of CDDL 1.1 license.
-
-This product includes a jetty-server.jar, jetty-servlet.jar, jetty-io.jar, jetty-jndi.jar, jetty-webapp.jar,
-jetty-plus.jar, jetty-util.jar, jetty-http.jar, jetty-security.jar, jetty-continuation.jar, jetty-xml.jar,
-jetty-jsp-jdt.jar, and jetty-schemas.jar.
-License: Dual Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt) and EPL (http://www.eclipse.org/legal/epl-v10.html)
-Distributed under terms of Apache 2 license.
-
-This product includes a resteasy-client.jar and a resteasy-jaxrs.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jsoup.jar.
-License: MIT license (http://opensource.org/licenses/MIT)
-
-This product includes a number of aws-java-sdk-* jars.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a joda-time.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jackcess.jar and a jackcess-encrypt.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a javaee-api.jar.
-License: Dual license consisting of the CDDL v1.0 and GPL v2  (https://glassfish.dev.java.net/public/CDDL+GPL.html)
-Jar included under terms of CDDL v1.0 license.
-
-This product includes a geoapi.jar.
-License: Open Geospatial license (https://raw.githubusercontent.com/opengeospatial/geoapi/master/LICENSE.txt)
-
-This product includes a junrar.jar.
-License: Junrar license (https://raw.github.com/junrar/junrar/master/license.txt)
-
-This product includes a netcdf4.jar, httpservices.jar, grib.jar, cdm.jar, and udunits.jar.
-License: UCAR license (http://www.unidata.ucar.edu/software/netcdf/copyright.html)
-
-This product includes a jcommander.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a jcip-annotations.jar.
-License: Apache 2 (https://github.com/stephenc/jcip-annotations/blob/master/LICENSE.txt)
-
-This product includes a ehcache-core.jar.
-License: Apache 2 (src/assemble/EHCACHE-CORE-LICENSE.txt)
-
-This product includes a bzip2.jar.
-License: MIT license (http://opensource.org/licenses/mit-license.php)
-
-This product includes a jdom2.jar.
-License: Apache 2 without acknowledgment clause (https://raw.github.com/hunterhacker/jdom/master/LICENSE.txt)
-
-This product includes a quartz.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a c3p0.jar.
-License: Dual license consisting of LGPL v2.1 and EPL v1.0 (http://www.gnu.org/licenses/lgpl-2.1.html and http://www.eclipse.org/org/documents/epl-v10.php)
-Jar included under terms of EPL v1.0 license.
-
-This product includes a lz4-java.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a snappy-java.jar.
-License: Apache 2 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes fontbox jar: http://pdfbox.apache.org/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes fontbox jempbox jar: http://www.apache.org/pdfbox-parent/jempbox/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes fontbox pdfbox jar: http://www.apache.org/pdfbox-parent/pdfbox/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a pdfbox-debugger.jar: http://www.apache.org/pdfbox-parent/pdfbox-debugger/
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a pdfbox-tools.jar: http://www.apache.org/pdfbox-parent/pdfbox-debugger
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-metadata.jar: http://sis.apache.org/core/sis-metadata
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-referencing.jar: http://sis.apache.org/core/sis-referencing
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-utility.jar: http://sis.apache.org/core/sis-utility
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-netcdf.jar: http://sis.apache.org/storage/sis-netcdf
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a sis-storage.jar: http://sis.apache.org/storage/sis-storage
-License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product may include pdf files that embed IPA-licensed fonts.
-License: IPA Font License Agreement v1.0 (http://ossipedia.ipa.go.jp/ipafont/index.html#LicenseEng)
-
-This product includes a curvesapi.jar: https://github.com/virtuald/curvesapi
-License: BSD License (http://opensource.org/licenses/BSD-3-Clause)
-
-This product includes a number of selenium jars, e.g.:
-selenium-api.jar, selenium-chrome-driver.jar, selenium-edge-driver.jar, selenium-firefox-driver.jar, selenium-ie-driver.jar,
-selenium-java.jar, selenium-opera-driver.jar, selenium-remote-driver.jar, selenium-safari-driver.jar, selenium-support.jar
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a nuxeo-java-client.jar: https://doc.nuxeo.com/nxdoc/licenses/
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a retrofit.jar.
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a okhttp.jar.
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a okio.jar.
-License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-This product includes a less4j.jar.
-License: Triple license, distributed under Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-==========================================================================
-The following license applies to postgresql.jar, which is available from
-http://jdbc.postgresql.org
---------------------------------------------------------------------------
-Copyright (c) 1997-2010, PostgreSQL Global Development Group
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-3. Neither the name of the PostgreSQL Global Development Group nor the names
-   of its contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================
-The following license applies to JUnit, and
-wsdl4j.jar:
---------------------------------------------------------------------------
-Common Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
-LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
-CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-      a) in the case of the initial Contributor, the initial code and documentation distributed
-          under this Agreement, and
-      b) in the case of each subsequent Contributor:
-
-      i) changes to the Program, and
-
-      ii) additions to the Program;
-
-      where such changes and/or additions to the Program originate from and are distributed
-      by that particular Contributor. A Contribution 'originates' from a Contributor if it was
-      added to the Program by such Contributor itself or anyone acting on such Contributor's
-      behalf. Contributions do not include additions to the Program which: (i) are separate
-      modules of software distributed in conjunction with the Program under their own license
-      agreement, and (ii) are not derivative works of the Program. 
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily
-infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-      a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-          non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare
-          derivative works of, publicly display, publicly perform, distribute and sublicense the
-          Contribution of such Contributor, if any, and such derivative works, in source code
-          and object code form.
-
-      b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-          non-exclusive, worldwide, royalty-free patent license under Licensed Patents to
-          make, use, sell, offer to sell, import and otherwise transfer the Contribution of such
-          Contributor, if any, in source code and object code form. This patent license shall
-          apply to the combination of the Contribution and the Program if, at the time the
-          Contribution is added by the Contributor, such addition of the Contribution causes
-          such combination to be covered by the Licensed Patents. The patent license shall
-          not apply to any other combinations which include the Contribution. No hardware
-          per se is licensed hereunder. 
-
-      c) Recipient understands that although each Contributor grants the licenses to its
-          Contributions set forth herein, no assurances are provided by any Contributor that
-          the Program does not infringe the patent or other intellectual property rights of any
-          other entity. Each Contributor disclaims any liability to Recipient for claims brought
-          by any other entity based on infringement of intellectual property rights or otherwise.
-          As a condition to exercising the rights and licenses granted hereunder, each Recipient
-          hereby assumes sole responsibility to secure any other intellectual property rights
-          needed, if any. For example, if a third party patent license is required to allow
-          Recipient to distribute the Program, it is Recipient's responsibility to acquire that
-          license before distributing the Program.
-
-      d) Each Contributor represents that to its knowledge it has sufficient copyright rights
-          in its Contribution, if any, to grant the copyright license set forth in this Agreement. 
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own
-license agreement, provided that:
-
-      a) it complies with the terms and conditions of this Agreement; and
-
-      b) its license agreement:
-
-      i) effectively disclaims on behalf of all Contributors all warranties and conditions,
-         express and implied, including warranties or conditions of title and non-infringement,
-         and implied warranties or conditions of merchantability and fitness for a particular purpose; 
-
-      ii) effectively excludes on behalf of all Contributors all liability for damages, including
-         direct, indirect, special, incidental and consequential damages, such as lost profits; 
-
-      iii) states that any provisions which differ from this Agreement are offered by that
-          Contributor alone and not by any other party; and
-
-      iv) states that source code for the Program is available from such Contributor, and
-          informs licensees how to obtain it in a reasonable manner on or through a medium
-          customarily used for software exchange. 
-
-When the Program is made available in source code form:
-
-      a) it must be made available under this Agreement; and 
-
-      b) a copy of this Agreement must be included with each copy of the Program. 
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner
-that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end
-users, business partners and the like. While this license is intended to facilitate the
-commercial use of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential liability for other
-Contributors. Therefore, if a Contributor includes the Program in a commercial product
-offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
-every other Contributor ("Indemnified Contributor") against any losses, damages and costs
-(collectively "Losses") arising from claims, lawsuits and other legal actions brought by a
-third party against the Indemnified Contributor to the extent caused by the acts or omissions
-of such Commercial Contributor in connection with its distribution of the Program in a
-commercial product offering. The obligations in this section do not apply to any claims
-or Losses relating to any actual or alleged intellectual property infringement. In order to
-qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in
-writing of such claim, and b) allow the Commercial Contributor to control, and cooperate
-with the Commercial Contributor in, the defense and any related settlement negotiations.
-The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering,
-Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor
-then makes performance claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the other
-Contributors related to those performance claims and warranties, and if a court requires
-any other Contributor to pay any damages as a result, the Commercial Contributor must
-pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
-EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
-CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
-A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
-appropriateness of using and distributing the Program and assumes all risks associated
-with its exercise of rights under this Agreement, including but not limited to the
-risks and costs of program errors, compliance with applicable laws, damage to or
-loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT
-LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE
-PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law,
-it shall not affect the validity or enforceability of the remainder of the terms of this
-Agreement, and without further action by the parties hereto, such provision shall
-be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against a Contributor with respect to a
-patent applicable to software (including a cross-claim or counterclaim in a lawsuit),
-then any patent licenses granted by that Contributor to such Recipient under this
-Agreement shall terminate as of the date such litigation is filed. In addition, if
-Recipient institutes patent litigation against any entity (including a cross-claim
-or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations
-of the Program with other software or hardware) infringes such Recipient's patent(s),
-then such Recipient's rights granted under Section 2(b) shall terminate as of the
-date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with
-any of the material terms or conditions of this Agreement and does not cure such
-failure in a reasonable period of time after becoming aware of such noncompliance.
-If all Recipient's rights under this Agreement terminate, Recipient agrees to cease
-use and distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by Recipient
-relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order
-to avoid inconsistency the Agreement is copyrighted and may only be modified in
-the following manner. The Agreement Steward reserves the right to publish new
-versions (including revisions) of this Agreement from time to time. No one other
-than the Agreement Steward has the right to modify this Agreement. IBM is the
-initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement
-Steward to a suitable separate entity. Each new version of the Agreement will be
-given a distinguishing version number. The Program (including Contributions) may
-always be distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is published, Contributor
-may elect to distribute the Program (including its Contributions) under the new
-version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
-receives no rights or licenses to the intellectual property of any Contributor under
-this Agreement, whether expressly, by implication, estoppel or otherwise. All rights
-in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to this 
-Agreement will bring a legal action under this Agreement more than one year after
-the cause of action arose. Each party waives its rights to a jury trial in any
-resulting litigation.
-
-
-==========================================================================
-The following license applies to:
-eclipse-ecj.jar
-h2.jar
-c3p0.jar
---------------------------------------------------------------------------
-
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this
-    Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that
-particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program 
-by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not 
-include additions to the Program which: (i) are separate modules of software distributed in 
-conjunction with the Program under their own license agreement, and (ii) are not derivative works
-of the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed
-by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of,
-publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if
-any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell,
-offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination of the Contribution
-and the Program if, at the time the Contribution is added by the Contributor, such addition of the
-Contribution causes such combination to be covered by the Licensed Patents. The patent license
-shall not apply to any other combinations which include the Contribution. No hardware per se is
-licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set
-forth herein, no assurances are provided by any Contributor that the Program does not infringe the
-patent or other intellectual property rights of any other entity. Each Contributor disclaims any
-liability to Recipient for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and licenses granted
-hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual
-property rights needed, if any. For example, if a third party patent license is required to allow
-Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its
-Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license
-agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and 
-implied, including warranties or conditions of title and non-infringement, and implied warranties or
-conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct,
-indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor
-alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs
-licensees how to obtain it in a reasonable manner on or through a medium customarily used for
-software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that 
-reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users,
-business partners and the like. While this license is intended to facilitate the commercial use of the
-Program, the Contributor who includes the Program in a commercial product offering should do so in
-a manner which does not create potential liability for other Contributors. Therefore, if a Contributor
-includes the Program in a commercial product offering, such Contributor ("Commercial Contributor")
-hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against
-any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal
-actions brought by a third party against the Indemnified Contributor to the extent caused by the
-acts or omissions of such Commercial Contributor in connection with its distribution of the Program
-in a commercial product offering. The obligations in this section do not apply to any claims or 
-Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an 
-Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such 
-claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial 
-Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor 
-may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X.
-That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes 
-performance claims, or offers warranties related to Product X, those performance claims and 
-warranties are such Commercial Contributor's responsibility alone. Under this section, the 
-Commercial Contributor would have to defend claims against the other Contributors related to 
-those performance claims and warranties, and if a court requires any other Contributor to pay any 
-damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS 
-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED 
-INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, 
-NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient 
-is solely responsible for determining the appropriateness of using and distributing the Program and 
-assumes all risks associated with its exercise of rights under this Agreement , including but not 
-limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss 
-of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY 
-CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
-USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, 
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not 
-affect the validity or enforceability of the remainder of the terms of this Agreement, and without 
-further action by the parties hereto, such provision shall be reformed to the minimum extent 
-necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in
-a lawsuit) alleging that the Program itself (excluding combinations of the Program with other 
-software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted 
-under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the 
-material terms or conditions of this Agreement and does not cure such failure in a reasonable 
-period of time after becoming aware of such noncompliance. If all Recipient's rights under this 
-Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as 
-reasonably practicable. However, Recipient's obligations under this Agreement and any licenses 
-granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid 
-inconsistency the Agreement is copyrighted and may only be modified in the following manner. The 
-Agreement Steward reserves the right to publish new versions (including revisions) of this 
-Agreement from time to time. No one other than the Agreement Steward has the right to modify 
-this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation 
-may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. 
-Each new version of the Agreement will be given a distinguishing version number. The Program 
-(including Contributions) may always be distributed subject to the version of the Agreement under 
-which it was received. In addition, after a new version of the Agreement is published, Contributor 
-may elect to distribute the Program (including its Contributions) under the new version. Except as 
-expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the 
-intellectual property of any Contributor under this Agreement, whether expressly, by implication, 
-estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are 
-reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property 
-laws of the United States of America. No party to this Agreement will bring a legal action under 
-this Agreement more than one year after the cause of action arose. Each party waives its rights to 
-a jury trial in any resulting litigation.
-
-==========================================================================
-The following license applies to hsqldb.jar
---------------------------------------------------------------------------
-For work developed by the HSQL Development Group:
-
-Copyright (c) 2001-2010, The HSQL Development Group
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the HSQL Development Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-For work originally developed by the Hypersonic SQL Group:
-
-Copyright (c) 1995-2000 by the Hypersonic SQL Group.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the Hypersonic SQL Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-This software consists of voluntary contributions made by many individuals on behalf of the
-Hypersonic SQL Group.
-
-==========================================================================
-The following license applies to stax-ex.jar, from 'Java.net' (http://dev.java.net),
-mimepull.jar, from 'mimepull' (https://mimepull.dev.java.net),
-activation.jar, from 'JavaBeans(TM) Activation Framework Specification' (http://www.oracle.com/technetwork/java/jaf11-139815.html),
-jsr250.jar, from 'JSR-250 Common Annotations for the Java(TM) Platform' (http://jcp.org/aboutJava/communityprocess/final/jsr250/index.html),
-jaxb-api.jar, from 'Java Architecture for XML Binding' (https://jaxb.dev.java.net/),
-mail.jar, from http://glassfish.java.net/javaee5/mail/:
---------------------------------------------------------------------------
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-1. Definitions.
-
-1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications.
-
-1.2. Contributor Version means the combination of the Original Software, prior Modifications used by 
-a Contributor (if any), and the Modifications made by that particular Contributor.
-
-1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination 
-of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-1.4. Executable means the Covered Software in any form other than Source Code.
-
-1.5. Initial Developer means the individual or entity that first makes Original Software available under this License.
-
-1.6. Larger Work means a work which combines Covered Software or portions thereof with code not 
-governed by the terms of this License.
-
-1.7. License means this document.
-
-1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the 
-initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-1.9. Modifications means the Source Code and Executable form of any of the following: A. Any file that 
-results from an addition to, deletion from or modification of the contents of a file containing Original 
-Software or previous Modifications; B. Any new file that contains any part of the Original Software or 
-previous Modification; or C. Any new file that is contributed or otherwise made available under the 
-terms of this License.
-
-1.10. Original Software means the Source Code and Executable form of computer software code that is 
-originally released under this License.
-
-1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without 
-limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-1.12. Source Code means (a) the common form of computer software code in which modifications are 
-made and (b) associated documentation included in or with such code.
-
-1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with 
-all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled 
-by, or is under common control with You. For purposes of this definition, control means (a) the 
-power, direct or indirect, to cause the direction or management of such entity, whether by contract 
-or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or 
-beneficial ownership of such entity.
-
-2. License Grants.
-
- 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject 
- to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, 
- royalty-free, non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, 
-to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions 
-thereof), with or without Modifications, and/or as part of a Larger Work; and
-
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have 
-made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or 
-portions thereof);
-
- (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first 
- distributes or otherwise makes the Original Software available to a third party under the terms of this License;
-
- (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete 
- from the Original Software, or (2) for infringements caused by: (i) the modification of the Original 
- Software, or (ii) the combination of the Original Software with other software or devices.
-
-2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third 
-party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, 
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to 
-use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by 
-such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as 
-Covered Software and/or as part of a Larger Work; and
-
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that 
-Contributor either alone and/or in combination with its Contributor Version (or portions of such 
-combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 
-(1) Modifications made by that Contributor (or portions thereof); and (2) the combination of 
-Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-
-(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor 
-first distributes or otherwise makes the Modifications available to a third party.
-
-(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that 
-Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third 
-party modifications of Contributor Version, or (ii) the combination of Modifications made by that 
-Contributor with other software (except as part of the Contributor Version) or other devices; 
-or (3) under Patent Claims infringed by Covered Software in the absence of Modifications 
-made by that Contributor.
-
-3. Distribution Obligations.
-
-3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make 
-available in Executable form must also be made available in Source Code form and that Source 
-Code form must be distributed only under the terms of this License. You must include a copy 
-of this License with every copy of the Source Code form of the Covered Software You distribute 
-or otherwise make available. You must inform recipients of any such Covered Software in 
-Executable form as to how they can obtain such Covered Software in Source Code form in 
-a reasonable manner on or through a medium customarily used for software exchange.
-
-3.2. Modifications. The Modifications that You create or to which You contribute are governed 
-by the terms of this License. You represent that You believe Your Modifications are Your 
-original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-3.3. Required Notices. You must include a notice in each of Your Modifications that identifies 
-You as the Contributor of the Modification. You may not remove or alter any copyright, patent 
-or trademark notices contained within the Covered Software, or any notices of licensing or 
-any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered 
-Software in Source Code form that alters or restricts the applicable version of this License 
-or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, 
-support, indemnity or liability obligations to one or more recipients of Covered Software. 
-However, you may do so only on Your own behalf, and not on behalf of the Initial Developer 
-or any Contributor. You must make it absolutely clear that any such warranty, support, 
-indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify 
-the Initial Developer and every Contributor for any liability incurred by the Initial Developer or 
-such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-
-3.5. Distribution of Executable Versions. You may distribute the Executable form of the 
-Covered Software under the terms of this License or under the terms of a license of Your 
-choice, which may contain terms different from this License, provided that You are in compliance 
-with the terms of this License and that the license for the Executable form does not 
-attempt to limit or alter the recipients rights in the Source Code form from the rights set 
-forth in this License. If You distribute the Covered Software in Executable form under a 
-different license, You must make it absolutely clear that any terms which differ from this 
-License are offered by You alone, not by the Initial Developer or Contributor. You hereby 
-agree to indemnify the Initial Developer and every Contributor for any liability incurred by 
-the Initial Developer or such Contributor as a result of any such terms You offer.
-
-3.6. Larger Works. You may create a Larger Work by combining Covered Software with other 
-code not governed by the terms of this License and distribute the Larger Work as a single 
-product. In such a case, You must make sure the requirements of this License are fulfilled 
-for the Covered Software.
-
-4. Versions of the License.
-
-4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised 
-and/or new versions of this License from time to time. Each version will be given a 
-distinguishing version number. Except as provided in Section 4.3, no one other than the 
-license steward has the right to modify this License.
-
-4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make 
-the Covered Software available under the terms of the version of the License under which 
-You originally received the Covered Software. If the Initial Developer includes a notice in 
-the Original Software prohibiting it from being distributed or otherwise made available under 
-any subsequent version of the License, You must distribute and make the Covered Software 
-available under the terms of the version of the License under which You originally received 
-the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make 
-the Covered Software available under the terms of any subsequent version of the License 
-published by the license steward.
-
-4.3. Modified Versions. When You are an Initial Developer and You want to create a new 
-license for Your Original Software, You may create and use a modified version of this 
-License if You: (a) rename the license and remove any references to the name of the 
-license steward (except to note that the license differs from this License); and (b) 
-otherwise make it clear that the license contains terms which differ from this License.
-
-5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE 
-ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
-INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS 
-FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. 
-THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS 
-WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU 
-(NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY 
-NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY 
-CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE 
-IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail 
-to comply with terms herein and fail to cure such breach within 30 days of becoming 
-aware of the breach. Provisions which, by their nature, must remain in effect beyond 
-the termination of this License shall survive.
-
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) 
-against Initial Developer or a Contributor (the Initial Developer or Contributor against 
-whom You assert such claim is referred to as Participant) alleging that the Participant 
-Software (meaning the Contributor Version where the Participant is a Contributor or 
-the Original Software where the Participant is the Initial Developer) directly or indirectly 
-infringes any patent, then any and all rights granted directly or indirectly to You by 
-such Participant, the Initial Developer (if the Initial Developer is not the Participant) 
-and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days 
-notice from Participant terminate prospectively and automatically at the expiration of 
-such 60 day notice period, unless if within such 60 day period You withdraw Your claim 
-with respect to the Participant Software against such Participant either unilaterally or 
-pursuant to a written agreement with Participant.
-
-6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses 
-that have been validly granted by You or any distributor hereunder prior to termination 
-(excluding licenses granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, 
-WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, 
-THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED 
-SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON 
-FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY 
-CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS 
-OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY 
-AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL 
-HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION 
-OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY 
-RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS 
-SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION 
-OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION 
-MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item, as that 
-term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer 
-software (as that term is defined at 48 C.F.R.  252.227-7014(a)(1)) and commercial 
-computer software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). 
-Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), 
-all U.S. Government End Users acquire Covered Software with only those rights set 
-forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any 
-other FAR, DFAR, or other clause or provision that addresses Government rights in 
-computer software under this License.
-
-9. MISCELLANEOUS. This License represents the complete agreement concerning 
-subject matter hereof. If any provision of this License is held to be unenforceable, 
-such provision shall be reformed only to the extent necessary to make it enforceable. 
-This License shall be governed by the law of the jurisdiction specified in a notice 
-contained within the Original Software (except to the extent applicable law, if any, 
-provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any 
-litigation relating to this License shall be subject to the jurisdiction of the courts 
-located in the jurisdiction and venue specified in a notice contained within the 
-Original Software, with the losing party responsible for costs, including, without 
-limitation, court costs and reasonable attorneys fees and expenses. The application 
-of the United Nations Convention on Contracts for the International Sale of Goods 
-is expressly excluded. Any law or regulation which provides that the language of a 
-contract shall be construed against the drafter shall not apply to this License. You 
-agree that You alone are responsible for compliance with the United States export 
-administration regulations (and the export control laws and regulation of any other 
-countries) when You use, distribute or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, 
-each party is responsible for claims and damages arising, directly or indirectly, out 
-of its utilization of rights under this License and You agree to work with Initial 
-Developer and Contributors to distribute such responsibility on an equitable basis. 
-Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION 
-LICENSE (CDDL) The code released under the CDDL shall be governed by the laws 
-of the State of California (excluding conflict-of-law provisions). Any litigation 
-relating to this License shall be subject to the jurisdiction of the Federal Courts 
-of the Northern District of California and the state courts of the State of California, 
-with venue lying in Santa Clara County, California. 
-
-==========================================================================
-The following license applies to:
-javaee-api.jar, from https://glassfish.java.net/nonav/public/CDDL+GPL.html,
-jaxb-impl.jar, from 'Sun JAXB Reference Implementation Runtime' (https://jaxb.dev.java.net/),
-saaj-impl.jar, from 'Sun SAAJ Standard Implementation' (https://saaj.dev.java.net/),
-streambuffer.jar, from 'XML Stream Buffer Project' (https://xmlstreambuffer.dev.java.net/),
-jaxws-rt.jar, from 'JAX-WS (JSR-224) Reference Implementation' (https://jax-ws.dev.java.net//),
-jsr181-api.jar, from 'Web Services Metadata for Java' (http://jcp.org/en/jsr/summary?id=181),
-saaj-api.jar, from 'SAAJ API' (https://saaj.dev.java.net/),
-jaxws-api.jar, from 'JAX-WS (JSR-224) API' (https://jax-ws.dev.java.net/)
-javax.servlet-api.jar
-javax.annotation-api.jar
---------------------------------------------------------------------------
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-    1. Definitions.
-
-        1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
-
-        1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-
-        1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-        1.4. “Executable” means the Covered Software in any form other than Source Code.
-
-        1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
-
-        1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-
-        1.7. “License” means this document.
-
-        1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-        1.9. “Modifications” means the Source Code and Executable form of any of the following:
-
-            A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-
-            B. Any new file that contains any part of the Original Software or previous Modification; or
-
-            C. Any new file that is contributed or otherwise made available under the terms of this License.
-
-        1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
-
-        1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-        1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-
-        1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
-
-    2. License Grants.
-
-        2.1. The Initial Developer Grant.
-
-        Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-            (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-
-            (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-
-            (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-
-            (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-
-        2.2. Contributor Grant.
-
-        Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-            (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-
-            (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-
-            (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-
-            (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-
-    3. Distribution Obligations.
-
-        3.1. Availability of Source Code.
-
-        Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
-
-        3.2. Modifications.
-
-        The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-        3.3. Required Notices.
-
-        You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-        3.4. Application of Additional Terms.
-
-        You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-
-        3.5. Distribution of Executable Versions.
-
-        You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-
-        3.6. Larger Works.
-
-        You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-
-    4. Versions of the License.
-
-        4.1. New Versions.
-
-        Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-
-        4.2. Effect of New Versions.
-
-        You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
-
-        4.3. Modified Versions.
-
-        When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-
-    5. DISCLAIMER OF WARRANTY.
-
-    COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-    6. TERMINATION.
-
-        6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-        6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
-
-        6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-
-    7. LIMITATION OF LIABILITY.
-
-    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-    8. U.S. GOVERNMENT END USERS.
-
-    The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
-
-    9. MISCELLANEOUS.
-
-    This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
-
-    10. RESPONSIBILITY FOR CLAIMS.
-
-    As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-    NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-    The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-    0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
-
-    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-    1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-    2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-        a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-
-        b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-
-        c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
-
-    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-    3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-        a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-        b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-        c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-
-    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-    4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-    5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
-
-    6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-    7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
-
-    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-    8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-    9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-    10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-    NO WARRANTY
-
-    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-    END OF TERMS AND CONDITIONS
-
-    How to Apply These Terms to Your New Programs
-
-    If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-    To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-        One line to give the program's name and a brief idea of what it does.
-
-        Copyright (C)
-
-        This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-
-        This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-        You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-    Also add information on how to contact you by electronic and paper mail.
-
-    If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-        Gnomovision version 69, Copyright (C) year name of author
-        Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-
-    The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-    You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-        Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-        signature of Ty Coon, 1 April 1989
-        Ty Coon, President of Vice
-
-    This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-    "CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-    Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
-    "Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
-
-    Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
-
-    As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
-
-==========================================================================
-The following license applies to:
-javax.ws.rs-api.jar
---------------------------------------------------------------------------
-
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1
-
-1. Definitions.
-
-1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
-1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-1.4. “Executable” means the Covered Software in any form other than Source Code.
-1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
-1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-1.7. “License” means this document.
-1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-1.9. “Modifications” means the Source Code and Executable form of any of the following:
-A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-B. Any new file that contains any part of the Original Software or previous Modification; or
-C. Any new file that is contributed or otherwise made available under the terms of this License.
-1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
-1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
-2. License Grants.
-
-2.1. The Initial Developer Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-2.2. Contributor Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-3. Distribution Obligations.
-
-3.1. Availability of Source Code.
-Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
-3.2. Modifications.
-The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-3.3. Required Notices.
-You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-3.4. Application of Additional Terms.
-You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-3.5. Distribution of Executable Versions.
-You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-3.6. Larger Works.
-You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-4. Versions of the License.
-
-4.1. New Versions.
-Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-4.2. Effect of New Versions.
-You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
-4.3. Modified Versions.
-When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-5. DISCLAIMER OF WARRANTY.
-
-COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
-6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
-6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-7. LIMITATION OF LIABILITY.
-
-UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
-The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
-
-9. MISCELLANEOUS.
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
-These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-One line to give the program's name and a brief idea of what it does.
-Copyright (C) <year> <name of author>
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-signature of Ty Coon, 1 April 1989
-Ty Coon, President of Vice
-This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-Certain source files distributed by Oracle are subject to the following clarification and special exception to the GPL Version 2, but only where Oracle has expressly included in the particular source file's header the words "Oracle designates this particular file as subject to the "Classpath" exception as provided by Oracle in the License file that accompanied this code." 
-
-Linking this library statically or dynamically with other modules is making a combined work based on this library.  Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination. 
-
-As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.  An independent module is a module which is not derived from or based on this library.  If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.  If you do not wish to do so, delete this exception statement from your version.
-
-==========================================================================
-The following license applies to:
-h2-support.jar
---------------------------------------------------------------------------
-
-Copyright (c) 2011 Carlo Sciolla
-
-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, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-==========================================================================
-The following license applies to:
-asm.jar
-asm-analysis.jar
-asm-commons.jar
-asm-debug-all.jar
-asm-parent.jar
-asm-tree.jar
-asm-util.jar
---------------------------------------------------------------------------
-
-Copyright (c) 2000-2011 INRIA, France Telecom
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the copyright holders nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================
-The following license applies to:
-juniversalchardet.jar
---------------------------------------------------------------------------
-
-Mozilla Public License Version 1.1
-1. Definitions.
-
-1.0.1. "Commercial Use"
-    means distribution or otherwise making the Covered Code available to a third party. 
-1.1. "Contributor"
-    means each entity that creates or contributes to the creation of Modifications. 
-1.2. "Contributor Version"
-    means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 
-1.3. "Covered Code"
-    means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 
-1.4. "Electronic Distribution Mechanism"
-    means a mechanism generally accepted in the software development community for the electronic transfer of data. 
-1.5. "Executable"
-    means Covered Code in any form other than Source Code. 
-1.6. "Initial Developer"
-    means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 
-1.7. "Larger Work"
-    means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 
-1.8. "License"
-    means this document. 
-1.8.1. "Licensable"
-    means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 
-1.9. "Modifications"
-
-    means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:
-
-        Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.
-        Any new file that contains any part of the Original Code or previous Modifications. 
-
-1.10. "Original Code"
-    means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 
-1.10.1. "Patent Claims"
-    means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 
-1.11. "Source Code"
-    means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 
-1.12. "You" (or "Your")
-    means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 
-
-2. Source Code License.
-2.1. The Initial Developer Grant.
-
-The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
-
-    under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and
-    under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof).
-    the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License.
-    Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 
-
-2.2. Contributor Grant.
-
-Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license
-
-    under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and
-    under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-    the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code.
-    Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 
-
-3. Distribution Obligations.
-3.1. Application of License.
-
-The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.
-3.2. Availability of Source Code.
-
-Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
-3.3. Description of Modifications.
-
-You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.
-3.4. Intellectual Property Matters
-(a) Third Party Claims
-
-If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.
-(b) Contributor APIs
-
-If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the legal file.
-(c) Representations.
-
-Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.
-3.5. Required Notices.
-
-You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-3.6. Distribution of Executable Versions.
-
-You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-3.7. Larger Works.
-
-You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.
-4. Inability to Comply Due to Statute or Regulation.
-
-If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the legal file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
-5. Application of this License.
-
-This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.
-6. Versions of the License.
-6.1. New Versions
-
-Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.
-6.2. Effect of New Versions
-
-Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License.
-6.3. Derivative Works
-
-If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)
-7. Disclaimer of warranty
-
-Covered code is provided under this license on an "as is" basis, without warranty of any kind, either expressed or implied, including, without limitation, warranties that the covered code is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the covered code is with you. Should any covered code prove defective in any respect, you (not the initial developer or any other contributor) assume the cost of any necessary servicing, repair or correction. This disclaimer of warranty constitutes an essential part of this license. No use of any covered code is authorized hereunder except under this disclaimer.
-8. Termination
-
-8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that:
-
-    such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above.
-    any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 
-
-8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
-
-8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.
-9. Limitation of liability
-
-Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall you, the initial developer, any other contributor, or any distributor of covered code, or any supplier of any of such parties, be liable to any person for any indirect, special, incidental, or consequential damages of any character including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to you.
-10. U.S. government end users
-
-The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
-11. Miscellaneous
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
-12. Responsibility for claims
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-13. Multiple-licensed code
-
-Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A.
-Exhibit A - Mozilla Public License.
-
-"The contents of this file are subject to the Mozilla Public License
-Version 1.1 (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.mozilla.org/MPL/
-
-Software distributed under the License is distributed on an "AS IS"
-basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-License for the specific language governing rights and limitations
-under the License.
-
-The Original Code is ______________________________________.
-
-The Initial Developer of the Original Code is ________________________.
-Portions created by ______________________ are Copyright (C) ______
-_______________________. All Rights Reserved.
-
-Contributor(s): ______________________________________.
-
-Alternatively, the contents of this file may be used under the terms
-of the _____ license (the  "[___] License"), in which case the
-provisions of [______] License are applicable instead of those
-above. If you wish to allow use of your version of this file only
-under the terms of the [____] License and not to allow others to use
-your version of this file under the MPL, indicate your decision by
-deleting the provisions above and replace them with the notice and
-other provisions required by the [___] License. If you do not delete
-the provisions above, a recipient may use your version of this file
-under either the MPL or the [___] License."
-
-NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. 
-
-==========================================================================
-The following license applies to:
-dom4j.jar
---------------------------------------------------------------------------
- Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met:
-
-    Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document.
-    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-    The name "DOM4J" must not be used to endorse or promote products derived from this Software without prior written permission of MetaStuff, Ltd. For written permission, please contact dom4j-info@metastuff.com.
-    Products derived from this Software may not be called "DOM4J" nor may "DOM4J" appear in their names without prior written permission of MetaStuff, Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
-    Due credit should be given to the DOM4J Project - http://dom4j.sourceforge.net
-
-THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. 
-
-==========================================================================
-The following dual license applies to:
-jhighlight.jar
---------------------------------------------------------------------------
-
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-1. Definitions. 1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. 1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. 1.4. "Executable" means the Covered Software in any form other than Source Code. 1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License. 1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. 1.7. "License" means this document. 1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; B. Any new file that contains any part of the Original Software or previous Modification; or C. Any new file that is contributed or otherwise made available under the terms of this License. 1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License. 1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. 1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. 3.2. Modifications. The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. 3.3. Required Notices. You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. 3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.5. Distribution of Executable Versions. You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.6. Larger Works. You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. 4. Versions of the License. 4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. 4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. 4.3. Modified Versions. When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. 5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 6. TERMINATION. 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. 7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 8. U.S. GOVERNMENT END USERS. The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. ¤ 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. 9. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. 10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-GNU Lesser General Public License
-
-Version 2.1, February 1999
-
-    Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-    [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
-
-This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
-
-When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
-
-To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
-
-For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
-
-We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
-
-To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
-
-Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
-
-Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
-
-When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
-
-We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
-
-For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
-
-In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
-
-Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
-
-The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
-
-A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
-
-The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
-
-"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
-
-1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
-
-    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
-
-    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 
-
-3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
-
-Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
-
-This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
-
-4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
-
-If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
-
-5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
-
-However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
-
-When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
-
-If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
-
-Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
-
-6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
-
-You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
-
-    a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
-
-For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
-
-7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
-
-    b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
-
-8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
-
-10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
-
-11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
-
-14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-END OF TERMS AND CONDITIONS
-How to Apply These Terms to Your New Libraries
-If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
-
-To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and an idea of what it does.> Copyright (C) <year> <name of author>
-
-    This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
-
-    Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-    signature of Ty Coon, 1 April 1990
-    Ty Coon, President of Vice
-
-That's all there is to it! 
-
-==========================================================================
-The following license applies to:
-jmatio.jar
---------------------------------------------------------------------------
-
-Copyright (c) 2006, Wojciech Gradkowski
-All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-* Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in
-the documentation and/or other materials provided with the
-distribution.
-* Neither the name of the JMatIO nor the names of its
-contributors may be used to endorse or promote products derived
-from this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================
-The following license applies to:
-bcprov-jdk15on.jar
-bcmail-jdk15on.jar
-bcpkix-jdk15on:jar
-bcprov-jdk15on:jar
---------------------------------------------------------------------------
-
-Copyright (c) 2000 - 2015 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
-
-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, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
-
-==========================================================================
-The following license applies to:
-netcdf4.jar
-grib.jar
-cdm.jar
-udunits.jar
-httpservices.jar
---------------------------------------------------------------------------
-Copyright 1993-2015 University Corporation for Atmospheric Research/Unidata
-
-Portions of this software were developed by the Unidata Program at the University Corporation for Atmospheric Research.
-
-Access and use of this software shall impose the following obligations and understandings on the user. The user is granted the right, without any fee or cost, to use, copy, modify, alter, enhance and distribute this software, and any derivative works thereof, and its supporting documentation for any purpose whatsoever, provided that this entire notice appears in all copies of the software, derivative works and supporting documentation. Further, UCAR requests that the user credit UCAR/Unidata in any publications that result from the use of this software or in any product that includes this software, although this is not an obligation. The names UCAR and/or Unidata, however, may not be used in any advertising or publicity to endorse or promote any products or commercial entity unless specific written permission is obtained from UCAR/Unidata. The user also understands that UCAR/Unidata is not obligated to provide the user with any support, consulting, training or assistance of any kind with regard to the use, operation and performance of this software nor to provide the user with any updates, revisions, new versions or "bug fixes."
-
-THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR 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 ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
-
-==========================================================================
-The following license applies to:
-junrar.jar
---------------------------------------------------------------------------
- ******    *****   ******   UnRAR - free utility for RAR archives
- **   **  **   **  **   **  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ******   *******  ******    License for use and distribution of
- **   **  **   **  **   **   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- **   **  **   **  **   **         FREE portable version
-                                   ~~~~~~~~~~~~~~~~~~~~~
-
-      The source code of UnRAR utility is freeware. This means:
-
-   1. All copyrights to RAR and the utility UnRAR are exclusively
-      owned by the author - Alexander Roshal.
-
-   2. The UnRAR sources may be used in any software to handle RAR
-      archives without limitations free of charge, but cannot be used
-      to re-create the RAR compression algorithm, which is proprietary.
-      Distribution of modified UnRAR sources in separate form or as a
-      part of other software is permitted, provided that it is clearly
-      stated in the documentation and source comments that the code may
-      not be used to develop a RAR (WinRAR) compatible archiver.
-
-   3. The UnRAR utility may be freely distributed. It is allowed
-      to distribute UnRAR inside of other software packages.
-
-   4. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS".
-      NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.  YOU USE AT 
-      YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, 
-      DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
-      OR MISUSING THIS SOFTWARE.
-
-   5. Installing and using the UnRAR utility signifies acceptance of
-      these terms and conditions of the license.
-
-   6. If you don't agree with terms of the license you must remove
-      UnRAR files from your storage devices and cease to use the
-      utility.
-
-      Thank you for your interest in RAR and UnRAR.
-
-
-                                            Alexander L. Roshal
-					    
-==========================================================================
-The following license applies to:
-geoapi.jar
---------------------------------------------------------------------------
-
-GeoAPI - Java interfaces for OGC/ISO standards
-http://www.geoapi.org
-
-Copyright (C) 2003-2015 Open Geospatial Consortium, Inc.
-All Rights Reserved. http://www.opengeospatial.org/ogc/legal
-
-This OGC work (including software, documents, or other related items) is being
-provided by the copyright holders under the following license. By obtaining,
-using and/or copying this work, you (the licensee) agree that you have read,
-understood, and will comply with the following terms and conditions:
-
-Permission to use, copy, and modify this software and its documentation, with
-or without modification, for any purpose and without fee or royalty is hereby
-granted, provided that you include the following on ALL copies of the software
-and documentation or portions thereof, including modifications, that you make:
-
-   1. The full text of this NOTICE in a location viewable to users of the
-      redistributed or derivative work.
-   2. Notice of any changes or modifications to the OGC files, including the
-      date changes were made. (We recommend you provide URIs to the location
-      from which the code is derived.)
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
-NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
-THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
-PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
-
-The name and trademarks of copyright holders may NOT be used in advertising or
-publicity pertaining to the software without specific, written prior permission.
-Title to copyright in this software and any associated documentation will at all
-times remain with copyright holders.
diff --git a/lib-license/NOTICE.txt b/lib-license/NOTICE.txt
deleted file mode 100644
index 877af98..0000000
--- a/lib-license/NOTICE.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache ManifoldCF
-Copyright 2010-2017 The Apache Software Foundation
-
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/lib-license/README.txt b/lib-license/README.txt
deleted file mode 100644
index b0938d1..0000000
--- a/lib-license/README.txt
+++ /dev/null
@@ -1,198 +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.
-
-Welcome to the Apache ManifoldCF project!
------------------------------------------
-
-Apache ManifoldCF is a multi-repository crawler framework, with multiple connectors.
-
-For a complete description of the ManifoldCF project, team composition, source
-code repositories, and other details, please see the ManifoldCF web site at
-http://manifoldcf.apache.org
-
-
-Getting Started
----------------
-
-This lib package is meant to be used in conjunction with the corresponding
-source package.
-
-1. Download and unpacked the source package.
-
-2. Create a directory called "lib" at the root level in the source tree.
-
-3. Copy the files in this package into the lib directory in the source tree.
-   
-Now you are ready to build the ManifoldCF sources.
-
-
-Files Included In Apache ManifoldCF Lib Distributions
---------------------------------------------------
-
-lib
-  The directory containing the Apache ManifoldCF binary dependencies.
-
-
-Licensing
----------
-
-The binary dependencies of ManifoldCF are licensed in a manner
-consistent with redistribution under Apache License 2.0. See the files
-called LICENSE.txt and NOTICE.txt for more information.
-
-Cryptographic Software Notice
------------------------------
-
-This distribution may include software that has been designed for use
-with cryptographic software. The country in which you currently reside
-may have restrictions on the import, possession, use, and/or re-export
-to another country, of encryption software. BEFORE using any encryption
-software, please check your country's laws, regulations and policies
-concerning the import, possession, or use, and re-export of encryption
-software, to see if this is permitted. See <http://www.wassenaar.org/>
-for more information.
-
-The U.S. Government Department of Commerce, Bureau of Industry and
-Security (BIS), has classified this software as Export Commodity
-Control Number (ECCN) 5D002.C.1, which includes information security
-software using or performing cryptographic functions with asymmetric
-algorithms. The form and manner of this Apache Software Foundation
-distribution makes it eligible for export under the License Exception
-ENC Technology Software Unrestricted (TSU) exception (see the BIS
-Export Administration Regulations, Section 740.13) for both object
-code and source code.
-
-The following provides more details on the included software that
-may be subject to export controls on cryptographic software:
-
-  ManifoldCF interfaces with the
-  Java Secure Socket Extension (JSSE) API to provide
-
-    - HTTPS support
-
-  ManifoldCF interfaces with the
-  Java Cryptography Extension (JCE) API to provide
-
-    - NTLM authentication
-
-  ManifoldCF does not include any
-  implementation of JSSE or JCE.
-
-Contact
--------
-
-  o For general information visit the main project site at
-    http://manifoldcf.apache.org
-
-
-=========================================================================
-==     Jetty Notice                                                    ==
-=========================================================================
-==============================================================
- Jetty Web Container 
- Copyright 1995-2006 Mort Bay Consulting Pty Ltd
-==============================================================
-
-This product includes some software developed at The Apache Software 
-Foundation (http://www.apache.org/).
-
-The javax.servlet package used by Jetty is copyright 
-Sun Microsystems, Inc and Apache Software Foundation. It is 
-distributed under the Common Development and Distribution License.
-You can obtain a copy of the license at 
-https://glassfish.dev.java.net/public/CDDLv1.0.html.
-
-The UnixCrypt.java code ~Implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-
-The default JSP implementation is provided by the Glassfish JSP engine
-from project Glassfish http://glassfish.dev.java.net.  Copyright 2005
-Sun Microsystems, Inc. and portions Copyright Apache Software Foundation.
-
-Some portions of the code are Copyright:
-  2006 Tim Vernum 
-  1999 Jason Gilbert.
-
-The jboss integration module contains some LGPL code.
-
-=========================================================================
-==     HSQLDB Notice                                                   ==
-=========================================================================
-
-For content, code, and products originally developed by Thomas Mueller and the Hypersonic SQL Group:
-
-Copyright (c) 1995-2000 by the Hypersonic SQL Group.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the Hypersonic SQL Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-This software consists of voluntary contributions made by many individuals on behalf of the
-Hypersonic SQL Group.
-
-For work added by the HSQL Development Group (a.k.a. hsqldb_lic.txt):
-
-Copyright (c) 2001-2005, The HSQL Development Group
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the HSQL Development Group nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib-proprietary/README.txt b/lib-proprietary/README.txt
deleted file mode 100644
index 9306020..0000000
--- a/lib-proprietary/README.txt
+++ /dev/null
@@ -1,35 +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.
-
-This directory is meant to contain root-level proprietary jars, usually JDBC drivers such as
-Oracle or MySQL, which cannot be redistributed under the Apache license.
-
-The following JDBC drivers are of interest:
-
-Oracle: oracle ojdbc5 jdk1.5 and ojdbc6 jdk1.6
-MSSQL/Sybase: jtds 1.2
-MySQL: mysql 5.1
-
-To build with Oracle JDBC support, copy the Oracle JDBC
-driver into this directory, calling it "ojdbc.jar", before building.
-To build with Mssql/Sybase, copy a version of the jtds driver here,
-and call it "jtds.jar".
-To build with MySQL support, copy a version of the MySQL driver
-here, and call it "mysql-connector-java.jar".
-
-Then, build ManifoldCF using the normal ant build script.  Further information can be
-found on the "how-to-build-and-deploy.html" documentation page.
-
-
diff --git a/mod-authz-annotate/Makefile b/mod-authz-annotate/Makefile
deleted file mode 100755
index e89d00f..0000000
--- a/mod-authz-annotate/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-##
-## $Id$
-##
-## 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.
-
-##
-##  Makefile -- Build procedure for sample authz_ad_annotate Apache module
-##  Autogenerated via ``apxs -n authz_ad_annotate -g''.
-##
-
-#   the used tools
-APXS=apxs2
-
-CURL_LIBS=-lcurl
-
-
-#   the default target
-all: mod_authz_annotate.so
-
-CPPFLAGS = -Wall -Werror
-LDFLAGS = $(CURL_LIBS)
-
-APXS_CPPFLAGS = ${shell [ -n "${CPPFLAGS}" ] && echo ${CPPFLAGS} | sed -e 's/\([^ ]*\)/-Wc,\1/g'}
-APXS_LDFLAGS  = ${shell [ -n "${LDFLAGS}"  ] && echo ${LDFLAGS} | sed -e 's/\([^ ]*\)/-Wl,\1/g'}
-
-mod_authz_annotate.so: mod_authz_annotate.c
-	$(APXS) -c $(APXS_CPPFLAGS) $(APXS_CFLAGS) $(APXS_LDFLAGS) $<
-	cp .libs/mod_authz_annotate.so .
-
-#   install the DSO file into the Apache installation
-#   and activate it in the Apache configuration
-install: mod_authz_annotate.so
-	$(APXS) -i $(APXS_CPPFLAGS) $(APXS_CFLAGS) $(APXS_LDFLAGS) mod_authz_annotate.so
-
-#   cleanup
-clean:
-	-rm -f mod_authz_annotate.so
-	-rm -rf .libs
-
-
diff --git a/mod-authz-annotate/README b/mod-authz-annotate/README
deleted file mode 100644
index 537af6f..0000000
--- a/mod-authz-annotate/README
+++ /dev/null
@@ -1,87 +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.
-
-$Id$
------------------------------------------------------------------------------
-mod_authz_annotate is used to populate the incoming request with headers
-containing the authorizations of the authenticated user.  It will also
-authorize the request, rejecting it with a 401 based on the configured 
-authority services.
-
-The authorizations are inserted to the headers as:
-
-AAAUSR:<specific identification of the user>
-	There will be only one of these.
-
-AAAGRP:<grouping that user is member of>
-	There can be many of these.
-
-The module is configured with the following directives:
-
-AuthzAnnotateEnable [On|Off]
-    Toggle state of authority feature
-
-AuthzAnnotateAuthority URL
-    URL of an authority service as defined below.  The configured service
-    will be asked for ACLs but no ID.
-
-AuthzAnnotateACLAuthority URL
-    URL of an authority service as defined below.  The configured service
-    will be asked for ACLs but no ID.
-
-AuthzAnnotateIDAuthority URL
-    URL of an authority service as defined below.  The configured service
-    will be asked for an ID but no ACLs.
-
-AuthzAnnotateIDACLAuthority URL
-    URL of an authority service as defined below.  The configured service
-    will be asked for noth IDs AND ACLs.
-
-The XXXAuthority directives may be repeated and/or mixed and matched so a
-single configuration can query multiple authorities.  When multiple
-auhtorities are configured:
-
-TODO!!!
-
-The source of the authorizations are authority services, which are HTTP
-services that take CGI-like parameters in the URL and return ID/TOKEN lists.
-
-The configured URLs can be anything and will be augmented as follows:
-
-http://CONFIGUREDURL[?|&]
-	username=asdf
-	[idneeded=true|false]
-	[aclneeded=true|false]
-
-The ?|& will be added depending of whether the configured URL has CGI-like
-parmaters already or not.
-
-The username paramaters is *always* appended. 
-
-The idneeded and aclneeded paramaters are also currently always appended,
-but the services should be OK with those not being present.
-
-Order of these parameters is not guaranteed.All parameters values will be
-properly URL-encoded.
-
-
-ID:
-TOKEN:
-
-"UNAUTHORIZED"
-"NOTFOUND"
-"OK"
-
-
diff --git a/mod-authz-annotate/constants.h b/mod-authz-annotate/constants.h
deleted file mode 100644
index 41cb76f..0000000
--- a/mod-authz-annotate/constants.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id$ */
-
-/**
-* 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.
-*/
-#ifndef CONSTANTS_H
-#define CONSTANTS_H
-
-#define STATIC_STRLEN(x)        (sizeof((x)) - 1) 
-
-#define GROUP_HEADER_KEY 	"AAAGRP"
-#define USER_HEADER_KEY 	"AAAUSR"
-#define USER_NAME_HEADER_KEY    "AAAUSR_NAME"
-#define WARNING_HEADER_KEY  "AAAWARNING"
-
-#define FAKE_USER_HEADER_KEY   "AAA_FAKE_USER"
-
-#define DEFAULT_NUM_GROUPS 	11
-#define DEFAULT_NUM_USERS 	1
-#define DEFAULT_NUM_WARNING	1
-
-// apache header line separator length in bytes ": "
-#define HEADER_SEPARATOR_LEN          (2)
-
-#endif
diff --git a/mod-authz-annotate/debian/control b/mod-authz-annotate/debian/control
deleted file mode 100644
index 8fc33be..0000000
--- a/mod-authz-annotate/debian/control
+++ /dev/null
@@ -1,26 +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.
-Source: libapache-mod-authz-annotate
-Section: web
-Priority: optional
-Maintainer: MetaCarta <support@metacarta.com>
-Standards-Version: 3.5.8
-Build-Depends: debhelper, autoconf, libcurl4-gnutls-dev | libcurl-dev, dpatch, apache2-threaded-dev (>= 2.2.3-1)
-
-Package: libapache2-mod-authz-annotate
-Architecture: any
-Depends: ${shlibs:Depends}, apache2.2-common
-Description: Apache2 Module providing general authority annotation.
- Apache2 Module providing general authority annotation.
diff --git a/mod-authz-annotate/mod_authz_annotate.c b/mod-authz-annotate/mod_authz_annotate.c
deleted file mode 100644
index f09cff7..0000000
--- a/mod-authz-annotate/mod_authz_annotate.c
+++ /dev/null
@@ -1,1208 +0,0 @@
-/* $Id$ */
-
-/**
-* 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.
-*/
-/* 
-**  mod_authz_annotate.c -- Apache sample authz_annotate module
-**  [Autogenerated via ``apxs -n authz_annotate -g'']
-**
-**  To play with this sample module, first compile it into a
-**  DSO file and install it into Apache's libexec directory 
-**  by running:
-**
-**    $ apxs -c -i mod_authz_annotate.c
-**
-**  Then activate it in Apache's apache.conf file, for instance
-**  for the URL /authz_annotate, as follows:
-**
-**    #   apache.conf
-**    LoadModule authz_annotate_module libexec/mod_authz_annotate.so
-**    <Location /authz_annotate>
-**    SetHandler authz_annotate
-**    </Location>
-**
-**  Then after restarting Apache via
-**
-**    $ apachectl restart
-**
-**  you immediately can request the URL /%NAME and watch for the
-**  output of this module. This can be achieved for instance via:
-**
-**    $ lynx -mime_header http://localhost/authz_annotate 
-**
-**  The output should be similar to the following one:
-**
-**    HTTP/1.1 200 OK
-**    Date: Tue, 31 Mar 1998 14:42:22 GMT
-**    Server: Apache/1.3.4 (Unix)
-**    Connection: close
-**    Content-Type: text/html
-**  
-**    The sample page from mod_authz_annotate.c
-*/ 
-
-
-/* Apache configuration merging strategy:
- *
- * Apache processes <Location> directives in the order in which they
- * appear in the configuration file(s).
- * The merge_config() code below now takes each
- * successive <Location> directive which specifies a given
- * mod_authz_annotate configuration, with one or more authority urls
- * to contact and takes the unique union of those authorities.  If the
- * configurations ask for different combinations of ACLs and IDs, the
- * system favors asking for ACLs and IDs over not (so if one requests
- * it, and the other does not, the union will be to request it).
- *
- *
- * For example given the configuration below:
- *
- * <Location /clients/search/services/saved-search/JSON>
- *  AuthzAnnotateEnable  On
- *  AuthzAnnotateIDAclAuthority http://localhost:7039/UserACLs
- * </Location>
- *
- * <Location /clients/search>
- *  AuthzAnnotateEnable  On
- *  AuthzAnnotateIDAclAuthority http://localhost:7039/UserACLs
- * </Location>
- *
- */
-
-
-// global for the current process to track if curl initialization failed
-static int curl_init_failed;
-
-#include "httpd.h"
-#include "http_config.h"
-#include "http_log.h"
-#include "http_protocol.h"
-#include "http_request.h"
-#include "ap_config.h"
-
-#include "constants.h"
-
-#include <stdio.h>
-
-#include <curl/curl.h>
-
-#define MODULE_NAME "mod_authz_annotate"
-#define MODULE_VERSION "4.6.0"
-
-#define HERE() fprintf(stderr, "\n" __FILE__ ":%d\n\n", __LINE__);
-
-static const char __rcsid_v_[] __attribute__((__unused__)) = "\100(#)" "$Id$";
-
-#define PARAM_USERNAME   "username"
-#define PARAM_ID_NEEDED  "idneeded"
-#define PARAM_ACL_NEEDED "aclneeded"
-
-#define TRUE_STRING     "true"
-#define FALSE_STRING    "false"
-
-/* These are the prefixes for user id and for acl tokens, expected back from the authority services
- */
-#define ID_PREFIX "ID:"
-#define TOKEN_PREFIX "TOKEN:"
-#define UNREACHABLE_PREFIX "UNREACHABLEAUTHORITY:"
-#define NOTFOUND_PREFIX "USERNOTFOUND:"
-#define UNAUTHORIZED_PREFIX "UNAUTHORIZED:"
-#define AUTHORIZED_PREFIX "AUTHORIZED:"
-
-/*
-  Structure that holds all the connect urls
-*/
-struct ConfigURL {
-  struct ConfigURL* next;
-  char* connecturl;
-  int idneeded;
-  int aclneeded;
-};
-
-/*
-  Configuration information structure.
-*/
-struct Config {
-  int activated;
-  int infer_service_authz;
-  // explicit flags are used to favor explicit setting of the flag on over a
-  // default off when merging configs, while still allowing explicit off to work
-  int activated_explicit;
-  int infer_service_authz_explicit;
-  struct ConfigURL* first;
-};
-
-
-/*************************************************************************** 
- Macros To Ease Compatibility
- ***************************************************************************/
-#ifdef STANDARD20_MODULE_STUFF
-#include <apr_strings.h>
-
-#define APR_POOL_T apr_pool_t
-#define APR_TABLE_T apr_table_t
-#define APR_ARRAY_HEADER_T apr_array_header_t
-#define APR_TABLE_ENTRY_T apr_table_entry_t
-#define APACHE_REQUEST_USER r->user
-
-#define log_rerror(file_line, level, r, fmt, rest...) \
-  ap_log_rerror(file_line, level | APLOG_NOERRNO, 0, r, fmt , ## rest);
-
-#else
-
-#define APR_POOL_T pool
-#define APR_TABLE_T table
-#define APR_ARRAY_HEADER_T array_header
-#define APR_TABLE_ENTRY_T table_entry
-#define APACHE_REQUEST_USER r->connection->user
-
-#define apr_psprintf               ap_psprintf
-#define apr_pstrcat                ap_pstrcat
-#define apr_palloc                 ap_palloc
-#define apr_pcalloc                ap_pcalloc
-#define apr_table_make             ap_make_table
-#define apr_table_add              ap_table_add
-#define apr_table_get              ap_table_get
-#define apr_table_set              ap_table_set
-#define apr_table_elts             ap_table_elts
-#define apr_table_unset            ap_table_unset
-#define apr_is_empty_table         ap_is_empty_table
-
-#define log_rerror(file_line, level, r, fmt, rest...) \
-  ap_log_rerror(file_line, level | APLOG_NOERRNO, r, fmt , ## rest);
-
-#endif /* STANDARD20_MODULE_STUFF */
-
-/*
-  Dynamic data accumulation structure.
-*/
-struct DataBlock {
-  int length;
-  void* buffer;
-  int capacity;
-  struct DataBlock* next;
-};
-
-struct DataBuffer {
-  struct APR_POOL_T* p;
-  struct DataBlock* first;
-  struct DataBlock* last;
-};
-
-struct DataIterator {
-  struct DataBlock* currentBlock;
-  int currentOffset;
-};
-
-
-#ifdef STANDARD20_MODULE_STUFF
-module AP_MODULE_DECLARE_DATA authz_annotate_module;
-#else
-module MODULE_VAR_EXPORT authz_annotate_module;
-#endif
-
-/* Take two lists of connecturls, take the list new and insert it into
- * merge.  If the connecturl is not in merge add it.  If the
- * connecturl is already in merge, union the requested parameters (if
- * either reqested an id/acl request the id/acl).
- */
-static
-void
-merge_url_lists(APR_POOL_T *p, struct Config *merge, const struct Config *new) {
-  struct ConfigURL* new_iter;
-  struct ConfigURL* merge_iter;
-  
-  // for every entry in the new list
-  for(new_iter = new->first; new_iter != NULL; new_iter = new_iter->next) {    
-
-    // search for it in the merged list
-    int found = FALSE;
-    for(merge_iter = merge->first; merge_iter != NULL; merge_iter = merge_iter->next) {
-
-      // if we find the new url in the merge list
-      if (! strcmp(new_iter->connecturl, merge_iter->connecturl)) {
-        merge_iter->idneeded = merge_iter->idneeded || new_iter->idneeded;
-        merge_iter->aclneeded = merge_iter->aclneeded || new_iter->aclneeded;
-        found = TRUE;
-        break;
-      }
-    }
-    
-    // if the url was not found add it
-    if (!found) {
-      struct ConfigURL* copyURL = (struct ConfigURL*) apr_pcalloc(p, sizeof(struct ConfigURL));
-      copyURL->connecturl = new_iter->connecturl;
-      copyURL->idneeded = new_iter->idneeded;
-      copyURL->aclneeded = new_iter->aclneeded;
-      copyURL->next = merge->first;
-      merge->first = copyURL;
-    }
-  }
-}
-
-/* insert connecturl into authority list.  if the connecturl is not
- * already in the list add it.  if it is in the list already union the
- * requested parameters (if either requested an id/acl request the
- * id/acl).
- */
-static
-void
-insert_url_into_list(APR_POOL_T *p, struct Config *list, char *connecturl, const int idneeded, const int aclneeded) {
-  struct ConfigURL* list_iter;
-  
-  // search for it in the merged list
-  int found = FALSE;
-  for(list_iter = list->first; list_iter != NULL; list_iter = list_iter->next) {
-    
-    // if we find the new url in the list list
-    if (! strcmp(connecturl, list_iter->connecturl)) {
-      list_iter->idneeded = list_iter->idneeded || idneeded;
-      list_iter->aclneeded = list_iter->aclneeded || aclneeded;
-      found = TRUE;
-      break;
-    }
-  }
-
-  if (!found) {
-    struct ConfigURL* record = (struct ConfigURL*)apr_pcalloc(p, sizeof(struct ConfigURL));
-    record->connecturl = connecturl;
-    record->idneeded = idneeded;
-    record->aclneeded = aclneeded;
-    record->next = list->first;
-    list->first = record;
-  }
-}
-
-/* Set whether this mod is activated.
- */
-static
-const char*
-activation_flag_cmd(cmd_parms *parms, void *mconfig, int flag) {
-  struct Config* cfg = (struct Config*)mconfig;
-  cfg->activated = flag;
-  cfg->activated_explicit = 1;
-  return NULL;
-}
-
-/* Set whether old-style service authz should be inferred
- */
-static
-const char*
-infer_service_authz_cmd(cmd_parms *parms, void *mconfig, int flag) {
-  struct Config* cfg = (struct Config*)mconfig;
-  cfg->infer_service_authz = flag;
-  cfg->infer_service_authz_explicit = 1;
-  return NULL;
-}
-
-/* Set the hostname; no id requested but acls requested.
- */
-static
-const char*
-connecturl_noid_yesacl_cmd(cmd_parms* parms, void* mconfig, char* string) {
-  struct Config* cfg = (struct Config*)mconfig;
-  // Add a new record to the start of the string
-  APR_POOL_T* p = parms->pool;
-  insert_url_into_list(p, cfg, string, FALSE, TRUE);
-  return NULL;
-}
-
-/* Set the hostname; id requested but acls not requested.
- */
-static
-const char*
-connecturl_yesid_noacl_cmd(cmd_parms* parms, void* mconfig, char* string) {
-  struct Config* cfg = (struct Config*)mconfig;
-  // Add a new record to the start of the string
-  APR_POOL_T * p = parms->pool;
-  insert_url_into_list(p, cfg, string, TRUE, FALSE);
-  return NULL;
-}
-
-/* Set the hostname; id requested and acls requested.
- */
-static
-const char*
-connecturl_yesid_yesacl_cmd(cmd_parms* parms, void* mconfig, char* string) {
-  struct Config* cfg = (struct Config*)mconfig;
-  // Add a new record to the start of the string
-  APR_POOL_T* p = parms->pool;
-  insert_url_into_list(p, cfg, string, TRUE, TRUE);
-  return NULL;
-}
-
-/* Create a configuration record for a given dir.
- */
-static
-void*
-create_config(APR_POOL_T *p, char *dir) {
-  struct Config* cfg = (struct Config*) apr_pcalloc(p, sizeof(struct Config));
-  cfg->activated = cfg->activated_explicit = 0;
-  cfg->infer_service_authz = cfg->infer_service_authz_explicit = 0;
-  cfg->first = NULL;
-  return (void *) cfg;
-}
-
-/* Merge two configuration records for a given dir.
- */
-static
-void*
-merge_config(APR_POOL_T *p, void* base_conf, void* new_conf) {
-  // According to apache, we can't modify base_conf and new_conf here, so make a copy
-  struct Config* cfg = (struct Config*) apr_pcalloc(p, sizeof(struct Config));
-  struct Config* oldguy = (struct Config*)base_conf;
-  struct Config* newguy = (struct Config*)new_conf;
-
-  // If old conf had explicit params and newconf doesn't, use old; otherwise use new
-  // (this way later blocks can explicitly turn it off, but will keep switches from
-  // earlier blocks if later blocks just use the defaults)
-  cfg->activated =
-        (oldguy->activated_explicit && (!newguy->activated_explicit)) ?
-        oldguy->activated : newguy->activated;
-  cfg->infer_service_authz =
-        (oldguy->infer_service_authz_explicit && (!newguy->infer_service_authz_explicit)) ?
-        oldguy->infer_service_authz : newguy->infer_service_authz;
-  cfg->activated_explicit =
-        oldguy->activated_explicit || newguy->activated_explicit;
-  cfg->infer_service_authz_explicit =
-        oldguy->infer_service_authz_explicit || newguy->infer_service_authz_explicit;
-
-  cfg->first = NULL;
-  if (oldguy->first != NULL) {
-    if (newguy->first != NULL) {
-      // if both lists have something merge them both
-      merge_url_lists(p, cfg, oldguy);
-      merge_url_lists(p, cfg, newguy);
-    }
-    else {
-      // if new is empty; copy old
-      cfg->first = oldguy->first;
-    }
-  }
-  else if (newguy->first != NULL) {
-    // if old is empty copy new
-    cfg->first = newguy->first;
-  }
-
-  return cfg;
-}
-
-/* Support method for writing request stream.
- */
-static
-size_t
-write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
-  struct DataBuffer* dataBuffer = (struct DataBuffer*)stream;
-  int remainingAmount = size * nmemb;
-  while (1) {
-    int amountToCopy;
-
-    if (remainingAmount == 0) {
-      break;
-    }
-
-    if (dataBuffer->last == NULL || dataBuffer->last->capacity == dataBuffer->last->length) {
-      struct DataBlock* newBlock;
-
-      // Allocate new block
-      newBlock = (struct DataBlock*)apr_palloc(dataBuffer->p,sizeof(struct DataBlock));
-      newBlock->next = NULL;
-      newBlock->length = 0;
-      newBlock->capacity = 4096;
-      newBlock->buffer = (void *)apr_palloc(dataBuffer->p,newBlock->capacity);
-      if (dataBuffer->last == NULL) {
-        dataBuffer->last = newBlock;
-        dataBuffer->first = newBlock;
-      }
-      else {
-        dataBuffer->last->next = newBlock;
-        dataBuffer->last = newBlock;
-      }
-    }
-
-    // See if the remaining amount fits or not
-    amountToCopy = dataBuffer->last->capacity - dataBuffer->last->length;
-    if (amountToCopy > remainingAmount) {
-      amountToCopy = remainingAmount;
-    }
-    memcpy(((unsigned char*)dataBuffer->last->buffer)+dataBuffer->last->length,ptr,amountToCopy);
-    ptr = ((unsigned char*)ptr) + amountToCopy;
-    dataBuffer->last->length += amountToCopy;
-    remainingAmount -= amountToCopy;
-  }
-  return nmemb;
-}
-
-/* Method to initialize a buffer iterator
- */
-static
-void
-iterator_initialize(struct DataIterator* di, struct DataBuffer* dataBuffer) {
-  di->currentBlock = dataBuffer->first;
-  di->currentOffset = 0;
-}
-
-/* Method to read the next line.
- * Return null if end.
- */
-static
-char*
-iterator_getline(struct DataIterator* di, request_rec* r) {
-  // Find length first
-  // This is so we can be precise about allocating each string
-
-  int length;
-  struct DataBlock* current;
-  int currentPos;
-  char* stringBuffer;
-  char* pointer;
-
-  current = di->currentBlock;
-  length = 0;
-  currentPos = di->currentOffset;
-  while(1) {
-    char x;
-
-    if (current == NULL) {
-      if (length == 0) {
-        return NULL;
-      }
-      break;
-    }
-
-    // log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r, "Scanning a block of length %i", current->length);
-
-    x = ((char*)current->buffer)[currentPos++];
-    // log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r, "character: %i", (int)x);
-    if (currentPos == current->length) {
-      current = current->next;
-      currentPos = 0;
-    }
-    if (x == '\n') {
-      break;
-    }
-    if (x == '\r') {
-      continue;
-    }
-    length++;
-  }
-
-
-  // Allocate a string and fill it
-  stringBuffer = (char*)apr_palloc(r->pool,(length+1)*sizeof(char));
-  pointer = stringBuffer;
-  while(1) {
-    char x;   
-
-    if (di->currentBlock == NULL){
-      break;
-    }
-
-    x = ((char*)di->currentBlock->buffer)[di->currentOffset++];
-    if (di->currentOffset == di->currentBlock->length) {
-      di->currentBlock = di->currentBlock->next;
-      di->currentOffset = 0;
-    }
-    if (x == '\n') {
-      break;
-    }
-    if (x == '\r') {
-      continue;
-    }
-    *pointer++ = x;
-  }
-  *pointer = 0;
-
-  return stringBuffer;
-}
-
-
-/* Check if a prefix matches a string
- */
-static
-int
-prefix_matches(const char* prefix, const char* string) {
-  if (strlen(prefix) > strlen(string)) {
-    return FALSE;
-  }
-  while(1) {
-    if (*prefix == 0) {
-      return TRUE;
-    }
-    if (*prefix++ != *string++) {
-      return FALSE;
-    }
-  }
-}
-
-
-/* Do the work of talking to the service, and getting groups back.
- */
-static
-int
-authz_annotate_users_and_groups(request_rec *r,
-                                const char *userName,
-                                APR_TABLE_T *userTable,
-                                APR_TABLE_T *groupTable,
-                                APR_TABLE_T *warningTable) {
-  CURLcode curl_error_code;
-  struct DataBuffer dataBuffer;
-  char* escapedUserName;
-  CURL *curl_handle;
-  char* urlString;
-  struct Config* cfg;
-  int rval = DECLINED;
-  int isKnown;
-  struct ConfigURL* currentURL;
-  const char * auth_line = NULL;
-  const char * auth_type = NULL;
-  struct curl_slist * headers = NULL;
-
-  cfg = (struct Config*) ap_get_module_config(r->per_dir_config, &authz_annotate_module);
-
-  if(curl_init_failed) {
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL global initialization failed");
-    return HTTP_INTERNAL_SERVER_ERROR;
-  }
-  
-  curl_handle = curl_easy_init();
-  if (curl_handle == NULL) {
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy init failed");
-    return HTTP_INTERNAL_SERVER_ERROR;
-  }
-
-  /* no progress meter */
-  curl_error_code = curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
-  if (curl_error_code != CURLE_OK) {
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy set opt failed: %s", curl_easy_strerror(curl_error_code));
-    curl_easy_cleanup(curl_handle);
-    return HTTP_INTERNAL_SERVER_ERROR;    
-  }
-
-  
-  curl_error_code = curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
-  if (curl_error_code != CURLE_OK) {
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy set opt failed: %s", curl_easy_strerror(curl_error_code));
-    curl_easy_cleanup(curl_handle);
-    return HTTP_INTERNAL_SERVER_ERROR;    
-  }
-  
-  curl_error_code = curl_easy_setopt(curl_handle, CURLOPT_FILE, &dataBuffer);
-  if (curl_error_code != CURLE_OK) {
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy set opt failed: %s", curl_easy_strerror(curl_error_code));
-    curl_easy_cleanup(curl_handle);
-    return HTTP_INTERNAL_SERVER_ERROR;    
-  }
-  
-  auth_line = apr_table_get(r->headers_in, "Authorization");
-  if (auth_line != NULL) {
-    /* ap_getword_white returns the first whitespace-delimited word in
-       auth_line, or NULL if no non-whitespace is found. */
-    auth_type = ap_getword_white(r->pool, &auth_line);
-  }
-
-  /* Check to see if the client sent RFC 4459 SPNEGO authorization
-     data. If so, we need to pass the Authorization header to the
-     authority service so that it can be decoded.  Active Directory
-     authorization needs this so that it can get group memberships
-     from the Kerberos PAC. */
-  if (auth_line != NULL && auth_type != NULL && strcasecmp(auth_type, "Negotiate") == 0) {
-    char * authhdr = apr_psprintf(r->pool, "Authorization: %s", auth_line);
-    if (authhdr == NULL) {
-      log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "apache failed to allocate Authorization header");
-      curl_easy_cleanup(curl_handle);
-      return HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    headers = curl_slist_append(NULL, authhdr);
-    if (headers == NULL) {
-      log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL failed to allocated slist");
-      curl_easy_cleanup(curl_handle);
-      return HTTP_INTERNAL_SERVER_ERROR;
-    }
-    
-    curl_error_code = curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
-    if(curl_error_code != CURLE_OK) {
-      log_rerror( APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy set opt failed: %s", curl_easy_strerror(curl_error_code));
-      curl_slist_free_all(headers);
-      curl_easy_cleanup(curl_handle);
-      return HTTP_INTERNAL_SERVER_ERROR;
-    }
-  }
-  else {
-    /* Do not include header data in buffer */
-    curl_error_code = curl_easy_setopt( curl_handle, CURLOPT_HEADER, (long)0);
-    if( curl_error_code != CURLE_OK ) {
-      log_rerror( APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy set opt failed: %s", curl_easy_strerror(curl_error_code));
-      curl_easy_cleanup(curl_handle);
-      return HTTP_INTERNAL_SERVER_ERROR;
-    }
-  }
-
-  escapedUserName = curl_escape(userName,strlen(userName));
-  if (escapedUserName == NULL) {
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "curl escape username failed");
-    curl_slist_free_all(headers);
-    curl_easy_cleanup(curl_handle);
-    return HTTP_INTERNAL_SERVER_ERROR;    
-  }
-
-  // Grab the start of the list of authorities  
-  currentURL = cfg->first;
-
-  // If there are no authorities, the isKnown check defaults to letting
-  // the user in since nobody not knowing about them is not a sin.
-  if (currentURL == NULL) {
-    isKnown = TRUE;
-  }
-  else {
-    isKnown = FALSE;
-  }
-
-  // Loop through all of the configured authorities
-  while (rval == DECLINED && currentURL != NULL) {
-    const char* idneeded_value   = (currentURL->idneeded) ? 
-      TRUE_STRING : FALSE_STRING;
-    const char* aclneeded_value  = (currentURL->aclneeded) ? 
-      TRUE_STRING : FALSE_STRING;
-
-    // Tack on a ? if there are no params in the configured URL,
-    // or an & if there are.
-    const char* initial_delim = (strchr(currentURL->connecturl, '?') == NULL) ? "?" : "&";
-                                              
-    urlString = apr_pstrcat(r->pool,
-                            currentURL->connecturl,
-                            initial_delim,
-                            PARAM_USERNAME, "=", escapedUserName,
-                            "&",
-                            PARAM_ID_NEEDED, "=", idneeded_value,
-                            "&",
-                            PARAM_ACL_NEEDED, "=", aclneeded_value,
-                            NULL);
-                                       
-    // Initialize dataBuffer
-    dataBuffer.p = r->pool;
-    dataBuffer.first = NULL;
-    dataBuffer.last = NULL;
-
-    curl_error_code = curl_easy_setopt(curl_handle, CURLOPT_URL, urlString);
-    if (curl_error_code != CURLE_OK) {
-      log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL easy set opt failed: %s", curl_easy_strerror(curl_error_code));
-      rval = HTTP_INTERNAL_SERVER_ERROR;
-      break;
-    }
-
-    log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r, "About to request %s%s%s from url '%s' (%s)",
-               ((currentURL->idneeded) ? "identifier " : ""),
-               ((currentURL->idneeded && currentURL->aclneeded)? "and " : ""),
-               ((currentURL->aclneeded) ? "acls ":""),
-               currentURL->connecturl, urlString);
-
-    curl_error_code = curl_easy_perform(curl_handle);
-    if (curl_error_code != CURLE_OK) {
-      // failed to connect to authority service; log error and terminate authorization processing
-      log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "CURL error from url '%s': %s", currentURL->connecturl, curl_easy_strerror(curl_error_code));
-      rval = HTTP_INTERNAL_SERVER_ERROR;
-      break;
-    }
-    else {
-
-      // get response code
-      long response_code;
-      curl_error_code = curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &response_code);
-      if (curl_error_code != CURLE_OK) {
-        log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, r, "CURL get response code failed");
-        rval = HTTP_INTERNAL_SERVER_ERROR;
-        break;
-      } else if(response_code == 403) {
-        // if it's 403, the authority is signaling there's no safe way to reply
-        // (e.g., it may not be able to provide the proper deny token), and so
-        // we need to also slam the door shut, regardless of whether the infer
-        // flag is on or not
-        rval = HTTP_UNAUTHORIZED;
-        break;
-      }
-
-      char* responseLine;
-
-      struct DataIterator di;
-
-      iterator_initialize(&di,&dataBuffer);
-
-      log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r, "Decoding response");
-
-      while(1) {
-        responseLine = iterator_getline(&di,r);
-        if(responseLine == NULL) {
-          break;
-        }
-
-        if (prefix_matches(ID_PREFIX,responseLine)) {
-          // Enter string into user table
-          apr_table_set(userTable, responseLine + strlen(ID_PREFIX), "");
-        }
-        else if (prefix_matches(TOKEN_PREFIX,responseLine)) {
-          // Enter this string into the group table
-          apr_table_set(groupTable, responseLine + strlen(TOKEN_PREFIX), "");
-        }
-        else if (prefix_matches(UNREACHABLE_PREFIX,responseLine)
-                || prefix_matches(UNAUTHORIZED_PREFIX,responseLine)) {
-          // note in warning table
-          apr_table_set(warningTable, responseLine, "");
-          // if we're inferring service authz, deny access
-          if(cfg->infer_service_authz) {
-            rval = HTTP_UNAUTHORIZED;
-            break;
-          }
-        }
-        else if (prefix_matches(NOTFOUND_PREFIX,responseLine)) {
-          // note in warning table and do nothing
-          apr_table_set(warningTable, responseLine, "");
-        }
-        else if (prefix_matches(AUTHORIZED_PREFIX,responseLine)) {
-          // note that at least one authority has now authorized the user
-          isKnown = TRUE;
-        }
-        else {
-          // invalid response from authority service; log error and terminate authorization processing
-          log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
-                     "Invalid string from authority service '%s'", responseLine);
-          rval = HTTP_INTERNAL_SERVER_ERROR;
-          break;
-        }
-      }
-    }
-
-    // Free the data buffer
-    // no need, since it's in apache pool
-
-    // Free the full url
-    // no need, since it's in apache pool
-
-    // Next URL
-    currentURL = currentURL->next;
-  }
-
-  log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r, "Completed requests to services");
-
-  curl_easy_cleanup(curl_handle);
-
-  curl_free(escapedUserName);
-
-  // if no one returned authorized and we're inferring service authz from that,
-  // deny access now
-  if (cfg->infer_service_authz && rval == DECLINED && isKnown == FALSE) {
-    curl_slist_free_all(headers);
-    return HTTP_UNAUTHORIZED;
-  }
-
-  curl_slist_free_all(headers);
-  return rval;
-}
-
-
-/*
-  Main method that does everything.
-*/
-static
-int
-authz_annotate(request_rec *r, const char *connection_user,
-               APR_TABLE_T **user_table, APR_TABLE_T **group_table, APR_TABLE_T **warning_table) {
-
-  if (user_table == NULL) {
-    log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "invalid user_table");
-    return HTTP_INTERNAL_SERVER_ERROR;
-  }
-  if (group_table == NULL) {
-    log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "invalid group_table");
-    return HTTP_INTERNAL_SERVER_ERROR;
-  }
-
-  // For the purposes of the java connector, the connection_user is passed in without change  
-
-  //NOTE: do we need to verify that apr_table_make succeeded?
-  *user_table = (APR_TABLE_T *)apr_table_make(r->pool, DEFAULT_NUM_USERS);
-  *group_table = (APR_TABLE_T *)apr_table_make(r->pool, DEFAULT_NUM_GROUPS);
-  *warning_table = (APR_TABLE_T *)apr_table_make(r->pool, DEFAULT_NUM_WARNING);
-
-  // Obtain groups via http
-  return authz_annotate_users_and_groups(r,connection_user,*user_table,*group_table,*warning_table);
-}
-
-
-/*
-  Convert a table to a header.
-*/
-static
-int
-transform_table_to_http_header(APR_TABLE_T* the_table,
-                               request_rec *r,
-                               const char *header_name,
-                               const unsigned int header_name_length,
-                               unsigned int *apache_header_size) {
-  const APR_ARRAY_HEADER_T *the_array;
-  APR_TABLE_ENTRY_T *telts;
-  int i;
-
-  the_array = apr_table_elts(the_table);
-  telts = (APR_TABLE_ENTRY_T*)the_array->elts;
-  
-  for(i = 0; i < the_array->nelts; i++) {
-    apr_table_add(r->headers_in, header_name, telts[i].key);
-
-    if (apache_header_size != NULL) {
-      *apache_header_size += header_name_length + HEADER_SEPARATOR_LEN + strlen(telts[i].key);
-    }
-  }
-  
-  return the_array->nelts;
-}
-
-#if 0
-// List contents of header
-static
-int
-list_stuff(request_rec *r, const char* key, const char* value) {
-  if (strcmp(key,USER_HEADER_KEY) == 0 || strcmp(key,GROUP_HEADER_KEY) == 0) {
-    log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, r,
-               "Found key = %s value = %s",key,value);
-  }
-  return 0;
-}
-#endif
-
-
-/*
-  Clean headers handler.  This will be done regardless of the authorization configuration.
-*/
-static
-int
-authz_clean_headers_handler(request_rec *r) {  
-  struct Config* cfg;
-
-  cfg = (struct Config*) ap_get_module_config(r->per_dir_config, &authz_annotate_module);
-
-  /* Skip processing if we're not active. */
-  if( cfg->activated == 0 ) {
-    return DECLINED;
-  }
-
-  /* Get rid of any passed in authz headers to prevent spoofing. */
-  apr_table_unset(r->headers_in, USER_NAME_HEADER_KEY);
-  apr_table_unset(r->headers_in, USER_HEADER_KEY);
-  apr_table_unset(r->headers_in, GROUP_HEADER_KEY);
-
-  return OK;
-}
-
-
-static
-void
-authz_annotate_add_username_header(request_rec *r) {
-  // if there is a valid username
-  if (APACHE_REQUEST_USER != NULL) {
-    // escape the username to eliminate leading or trailing spaces
-    // which are dropped in http headers
-    char *escaped_username = ap_escape_uri(r->pool, APACHE_REQUEST_USER);
-    
-    // stuff username into headers for webui (tomcat)
-    apr_table_add(r->headers_in, USER_NAME_HEADER_KEY, escaped_username);
-  }
-}
-
-/*
-  This is the content handler
-*/
-static
-int
-authz_annotate_authorization_handler(request_rec *r) {  
-  struct Config* cfg;
-  int authz_annotate_result;
-  APR_TABLE_T *user_table;
-  APR_TABLE_T *group_table;
-  APR_TABLE_T *warning_table;
-
-  cfg = (struct Config*) ap_get_module_config(r->per_dir_config, &authz_annotate_module);
-
-  /* Everything OK by default if we're not even active. */
-  if( cfg->activated == 0 ) {
-    return DECLINED;
-  }
-
-  /* We must have a user to authorize against */
-  if (APACHE_REQUEST_USER == NULL) {
-    return HTTP_UNAUTHORIZED;
-  }
-
-  /* if this is a subrequest, we've already done our annotation work so DECLINE to do anything with it */
-  if (! ap_is_initial_req(r)) {
-    return DECLINED;
-  }
-  
-  log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r,
-             "Authorization request for user '%s'",
-             APACHE_REQUEST_USER);
-
-  // add username header
-  authz_annotate_add_username_header(r);
-  
-  authz_annotate_result = authz_annotate(r, APACHE_REQUEST_USER, &user_table, &group_table, &warning_table);
-
-  if (authz_annotate_result == DECLINED) {
-    unsigned int apache_header_size = 0;
-    unsigned int number_of_users_added = 0;
-    unsigned int number_of_groups_added = 0;
-    unsigned int number_of_warning_added = 0;
-    
-    number_of_users_added = transform_table_to_http_header(user_table,
-                                                           r,
-                                                           USER_HEADER_KEY,
-                                                           STATIC_STRLEN(USER_HEADER_KEY),
-                                                           &apache_header_size);
-    
-    number_of_groups_added = transform_table_to_http_header(group_table,
-                                                            r,
-                                                            GROUP_HEADER_KEY,
-                                                            STATIC_STRLEN(GROUP_HEADER_KEY),
-                                                            &apache_header_size);
-
-    if(!apr_is_empty_table(warning_table)) {
-      number_of_warning_added = transform_table_to_http_header(warning_table,
-                                                               r,
-                                                               WARNING_HEADER_KEY,
-                                                               STATIC_STRLEN(WARNING_HEADER_KEY),
-                                                               &apache_header_size);
-    }
-    
-    log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r,
-               "users(%u) groups(%u) warning(%u) header size: %u",
-               number_of_users_added,
-               number_of_groups_added,
-               number_of_warning_added,
-               apache_header_size);
-  }
-  
-  return authz_annotate_result;
-}
-
-/*
-  Write a table to the request header.
-*/
-static
-void
-print_table_to_client(APR_TABLE_T* the_table,
-                      request_rec *r,
-                      const char *header_name) {
-  const APR_ARRAY_HEADER_T *the_array;
-  APR_TABLE_ENTRY_T *telts;
-  int i;
-
-  the_array = apr_table_elts(the_table);
-  telts = (APR_TABLE_ENTRY_T*)the_array->elts;
-  
-  for(i = 0; i < the_array->nelts; i++) {
-    ap_rprintf(r, "%s: %s\n", header_name, telts[i].key);
-  }
-}
-
-static
-int
-authz_annotate_content_handler(request_rec *r) {  
-  APR_TABLE_T *user_table;
-  APR_TABLE_T *group_table;
-  APR_TABLE_T *warning_table;
-  int authz_annotate_result;
-  const char *user_name;
-
-#ifdef STANDARD20_MODULE_STUFF
-  if (!r->handler || strcmp(r->handler, "authz-annotate")) {
-    return DECLINED;
-  }
-#endif
-  
-  user_name = apr_table_get(r->headers_in, FAKE_USER_HEADER_KEY);
-  if(user_name == NULL) {
-    return HTTP_INTERNAL_SERVER_ERROR;
-  }
-  authz_annotate_result = authz_annotate(r, user_name, &user_table, &group_table, &warning_table);
-
-#ifdef STANDARD20_MODULE_STUFF
-  ap_set_content_type(r, "text/plain");
-#else
-  r->content_type = "text/plain";
-  ap_send_http_header(r);
-#endif
-
-  // TODO: for consistency we should REALLY send the USER_NAME_HEADER here as well
-  
-  if (authz_annotate_result == DECLINED) {
-    print_table_to_client(user_table, r, USER_HEADER_KEY);
-    print_table_to_client(group_table, r, GROUP_HEADER_KEY);
-    print_table_to_client(warning_table, r, WARNING_HEADER_KEY);
-  }
-  else {
-    ap_rprintf(r, "ERROR: internal failure (see /var/log/metacarta/error.log) %d\n", authz_annotate_result);
-  }
-  // MUST return ok, otherwise content will come from elsewhere (and get errors)
-  return OK;
-}
-
-
-#ifdef STANDARD20_MODULE_STUFF
-#define command(name, func, var, type, usage)  \
-  AP_INIT_ ## type (name, (void*) func, NULL, OR_AUTHCFG | RSRC_CONF, usage)
-#else
-#define command(name, func, var, type, usage)  \
-  { name, func, NULL, OR_AUTHCFG | RSRC_CONF, type, usage }
-#endif
-
-/* Configuration command description */
-static const command_rec authz_annotate_cmds[] = {
-  command("AuthzAnnotateEnable", activation_flag_cmd, NULL, FLAG,"Toggle state of authority feature"),
-  command("AuthzAnnotateInferServiceAuthz",infer_service_authz_cmd, NULL, FLAG,"Toggle state of authority feature"),
-  command("AuthzAnnotateAuthority", connecturl_noid_yesacl_cmd, NULL, TAKE1, "Protocol, host, port, and service to connect to"),
-  command("AuthzAnnotateACLAuthority", connecturl_noid_yesacl_cmd, NULL, TAKE1, "Protocol, host, port, and service to connect to"),
-  command("AuthzAnnotateIDAuthority", connecturl_yesid_noacl_cmd, NULL, TAKE1, "Protocol, host, port, and service to connect to"),
-  command("AuthzAnnotateIDACLAuthority", connecturl_yesid_yesacl_cmd, NULL, TAKE1, "Protocol, host, port, and service to connect to"),
-  {NULL}
-};
-
-
-
-#ifdef STANDARD20_MODULE_STUFF
-
-static
-apr_status_t
-authz_annotate_child_cleanup(void *data) {
-  curl_global_cleanup();
-  return APR_SUCCESS;
-}
-
-/* Child initialization. */
-static
-void
-authz_annotate_child_init(APR_POOL_T *p, server_rec *s) {
-  CURLcode curl_error;
-
-  curl_error = curl_global_init(CURL_GLOBAL_NOTHING);
-  if (curl_error != CURLE_OK) {
-    // Write an error to the log
-    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, 0, s, "Couldn't initialize CURL: %d %s", curl_error, curl_easy_strerror(curl_error));
-    curl_init_failed = 1;
-  }
-  else {
-    curl_init_failed = 0;
-  }
-  
-  apr_pool_cleanup_register(p, s, authz_annotate_child_cleanup, authz_annotate_child_cleanup);
-}
-
-
-static
-int
-authz_annotate_init_handler(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) {
-  ap_add_version_component(p, MODULE_NAME "/" MODULE_VERSION); 
-  return OK;
-}
-
-
-static
-void
-authz_annotate_register_hooks(apr_pool_t *p) {
-  ap_log_perror(APLOG_MARK, APLOG_DEBUG|APLOG_ERR, 0, p, "HERE I AM\n");
-
-  ap_hook_post_config(authz_annotate_init_handler, NULL, NULL, APR_HOOK_MIDDLE);
-  ap_hook_child_init(authz_annotate_child_init, NULL, NULL, APR_HOOK_MIDDLE);
-  ap_hook_header_parser(authz_clean_headers_handler, NULL, NULL, APR_HOOK_MIDDLE);
-  ap_hook_auth_checker(authz_annotate_authorization_handler, NULL, NULL, APR_HOOK_FIRST);
-  ap_hook_handler(authz_annotate_content_handler, NULL, NULL, APR_HOOK_MIDDLE);
-}
-
-module AP_MODULE_DECLARE_DATA authz_annotate_module = {
-   STANDARD20_MODULE_STUFF,
-   create_config,                 /* create per-dir    conf structures  */
-   merge_config,                  /* merge  per-dir    conf structures  */
-   NULL,                          /* create per-server conf structures  */
-   NULL,                          /* merge  per-server conf structures  */
-   authz_annotate_cmds,           /* table of configuration directives  */
-   authz_annotate_register_hooks  /* register hooks                     */
-};
-
-#else
-
-/* Child initialization. */
-static
-void
-authz_annotate_child_init(server_rec *s, APR_POOL_T *p) {
-  CURLcode curl_error;
-
-  curl_error = curl_global_init(CURL_GLOBAL_NOTHING);
-  if (curl_error != CURLE_OK) {
-    // Write an error to the log
-    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, "Couldn't initialize CURL: %d %s", curl_error, curl_easy_strerror(curl_error));
-    curl_init_failed = 1;
-  }
-  else {
-    curl_init_failed = 0;
-  }
-}
-
-
-/* Child exit.  */
-static
-void
-authz_annotate_child_exit(server_rec *s, APR_POOL_T *p) {
-  curl_global_cleanup();
-}
-
-/* content handlers */
-static handler_rec authz_annotate_handlers[] = {
-  { "authz-annotate", authz_annotate_content_handler },
-  { NULL }
-};
-
-/* Dispatch list for API hooks */
-module MODULE_VAR_EXPORT authz_annotate_module = {
-  STANDARD_MODULE_STUFF,
-  NULL,                         /* module initializer                  */
-  create_config,                /* create per-dir    config structures */
-  merge_config,                 /* merge  per-dir    config structures */
-  NULL,                         /* create per-server config structures */
-  NULL,                         /* merge  per-server config structures */
-  authz_annotate_cmds,          /* table of config file commands       */
-  authz_annotate_handlers,      /* [#8] MIME-typed-dispatched handlers */
-  NULL,                         /* [#1] URI to filename translation    */
-  NULL,                         /* [#4] validate user id from request  */
-  authz_annotate_authorization_handler, /* [#5] check if the user is ok _here_ */
-  NULL,                         /* [#3] check access by host address   */
-  NULL,                         /* [#6] determine MIME type            */
-  NULL,                         /* [#7] pre-run fixups                 */
-  NULL,                         /* [#9] log a transaction              */
-  authz_clean_headers_handler,  /* [#2] header parser                  */
-  authz_annotate_child_init,    /* child_init                          */
-  authz_annotate_child_exit,    /* child_exit                          */
-  NULL                          /* [#0] post read-request              */
-#ifdef EAPI
-  ,NULL,                        /* EAPI: add_module                    */
-  NULL,                         /* EAPI: remove_module                 */
-  NULL,                         /* EAPI: rewrite_command               */
-  NULL                          /* EAPI: new_connection                */
-#endif
-};
-
-
-#endif
diff --git a/site/pdf/config.xml b/pdf/config.xml
similarity index 100%
rename from site/pdf/config.xml
rename to pdf/config.xml
diff --git a/site/pdf/document-to-fo.xsl b/pdf/document-to-fo.xsl
similarity index 100%
rename from site/pdf/document-to-fo.xsl
rename to pdf/document-to-fo.xsl
diff --git a/site/pdf/output.xmap b/pdf/output.xmap
similarity index 100%
rename from site/pdf/output.xmap
rename to pdf/output.xmap
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 33b44b2..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,306 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-
-<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/xsd/maven-4.0.0.xsd">
-
-  <parent>
-    <groupId>org.apache</groupId>
-    <artifactId>apache</artifactId>
-    <version>16</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>org.apache.manifoldcf</groupId>
-  <artifactId>mcf-parent</artifactId>
-  <version>2.10-SNAPSHOT</version>
-
-  <name>ManifoldCF</name>
-  <packaging>pom</packaging>
-
-  <organization>
-    <name>The Apache Software Foundation</name>
-    <url>http://www.apache.org/</url>
-  </organization>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <!-- dependency versions -->
-    <junit.version>4.12</junit.version>
-    <selenium.version>3.3.1</selenium.version>
-    <mockito.version>1.9.5</mockito.version>
-    <wiremock.version>2.5.1</wiremock.version>
-    <postgresql.version>42.1.3</postgresql.version>
-    <mysql.version>5.1.33</mysql.version>
-    <hsqldb.version>2.3.2</hsqldb.version>
-    <jetty.version>9.2.3.v20140905</jetty.version>
-    <jetty-jsp-jdt.version>2.3.3</jetty-jsp-jdt.version>
-    <jetty-schemas.version>3.1.M0</jetty-schemas.version>
-    <mail.version>1.4.5</mail.version>
-    <activation.version>1.1.1</activation.version>
-    <axis.version>1.4</axis.version>
-    <wsdl4j.version>1.6.2</wsdl4j.version>
-    <castor.version>1.0.5</castor.version>
-    <commons-codec.version>1.10</commons-codec.version>
-    <commons-io.version>2.4</commons-io.version>
-    <commons-logging.version>1.2</commons-logging.version>
-    <commons-collections.version>3.2.1</commons-collections.version>
-    <commons-fileupload.version>1.2.2</commons-fileupload.version>
-    <commons-discovery.version>0.5</commons-discovery.version>
-    <httpcomponent.httpclient.version>4.5.3</httpcomponent.httpclient.version>
-    <httpcomponent.httpcore.version>4.4.6</httpcomponent.httpcore.version>
-    <httpcomponent.httpmime.version>4.5.3</httpcomponent.httpmime.version>
-    <solr.version>7.0.0</solr.version>
-    <noggit.version>0.8</noggit.version>
-    <commons-el.version>1.0</commons-el.version>
-    <commons-lang.version>2.6</commons-lang.version>
-    <xalan.version>2.7.1</xalan.version>
-    <xerces.version>2.10.0</xerces.version>
-    <xml-apis.version>1.4.01</xml-apis.version>
-    <jtds.version>1.2.4</jtds.version>
-    <mariadb.version>1.1.7</mariadb.version>
-    <servlet-api.version>3.1.0</servlet-api.version>
-    <jstl.version>1.2</jstl.version>
-    <glassfish.version>2.1.v20091210</glassfish.version>
-    <log4j.version>2.4.1</log4j.version>
-    <velocity.version>1.7</velocity.version>
-    <slf4j.version>1.7.7</slf4j.version>
-    <jaxb.version>2.2.6</jaxb.version>
-    <zookeeper.version>3.4.10</zookeeper.version>
-    <xmlbeans.version>2.6.0</xmlbeans.version>
-    <poi.version>3.17</poi.version>
-    <tika.version>1.17</tika.version>
-    <boilerpipe.version>1.1.0</boilerpipe.version>
-    <hadoop.version>2.6.0</hadoop.version>
-    <tomcat.version>6.0.35</tomcat.version>
-    <ecj.version>4.3.1</ecj.version>
-    <json-simple.version>1.1.1</json-simple.version>
-    <commons-exec.version>1.3</commons-exec.version>
-    <jna.version>4.1.0</jna.version>
-    <gson.version>2.8.0</gson.version>
-    <guava.version>21.0</guava.version>
-  </properties>
-
-  <modules>
-      <module>framework</module>
-    <module>test-materials</module>
-    <module>connectors</module>
-    <module>framework/jetty-runner</module>
-  </modules>
-
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-source-plugin</artifactId>
-          <version>2.4</version>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>2.3.1</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-    
-    <plugins>
-    
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-sources</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <archive>
-            <!-- Ensure source jars have full manifest entries (note: defaults aren't suitable) -->
-            <manifestEntries>
-              <Specification-Title>${project.name}</Specification-Title>
-              <Specification-Version>${project.version}</Specification-Version>
-              <Specification-Vendor>The Apache Software Foundation</Specification-Vendor>
-              <Implementation-Title>${project.name}</Implementation-Title>
-              <Implementation-Version>${project.version}</Implementation-Version>
-              <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
-              <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-      
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Specification-Title>${project.name}</Specification-Title>
-              <Specification-Version>${project.version}</Specification-Version>
-              <Specification-Vendor>The Apache Software Foundation</Specification-Vendor>
-              <Implementation-Title>${project.name}</Implementation-Title>
-              <Implementation-Version>${project.version}</Implementation-Version>
-              <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
-              <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
-              <url>${project.url}</url>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-      
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.3.2</version>
-        <configuration>
-          <source>1.8</source>
-          <target>1.8</target>
-          <fork>true</fork>
-          <meminitial>128m</meminitial>
-          <maxmem>512m</maxmem>
-        </configuration>
-      </plugin>
-      
-      <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-        <version>2.5</version>
-        <configuration>
-          <encoding>UTF-8</encoding>
-        </configuration>
-      </plugin>
-      
-      <plugin>
-        <artifactId>maven-clean-plugin</artifactId>
-        <version>2.4.1</version>
-      </plugin>
-      
-    </plugins>
-  </build>
-
-  <profiles>
-    <!-- START SNIPPET: release-profile -->
-    <profile>
-        <id>apache-mcf-release</id>
-        <build>
-            <plugins>
-                <!-- Create a source-release artifact that contains the fully buildable project directory source structure. 
-                    This is the artifact which is the official subject of any release vote. -->
-                <plugin>
-                    <artifactId>maven-assembly-plugin</artifactId>
-                    <dependencies>
-                        <dependency>
-                            <groupId>org.apache.apache.resources</groupId>
-                            <artifactId>apache-source-release-assembly-descriptor</artifactId>
-                            <version>1.0.4</version>
-                        </dependency>
-                    </dependencies>
-                    <executions>
-                        <execution>
-                            <id>source-release-assembly</id>
-                            <phase>package</phase>
-                            <goals>
-                                <goal>single</goal>
-                            </goals>
-                            <configuration>
-                                <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
-                                <descriptors>
-                                    <descriptor>src/main/assembly/src.xml</descriptor>
-                                </descriptors>
-                                <tarLongFileMode>gnu</tarLongFileMode>
-                            </configuration>
-                        </execution>
-                    </executions>
-                </plugin>
-                <!-- We want to deploy the artifact to a staging location for perusal -->
-                <plugin>
-                    <inherited>true</inherited>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-deploy-plugin</artifactId>
-                    <configuration>
-                        <updateReleaseInfo>true</updateReleaseInfo>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-source-plugin</artifactId>
-                    <executions>
-                        <execution>
-                            <id>attach-sources</id>
-                            <goals>
-                                <goal>jar</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-javadoc-plugin</artifactId>
-                    <executions>
-                        <execution>
-                            <id>attach-javadocs</id>
-                            <goals>
-                                <goal>jar</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-                <!-- We want to sign the artifact, the POM, and all attached artifacts -->
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-gpg-plugin</artifactId>
-                    <executions>
-                        <execution>
-                            <goals>
-                                <goal>sign</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-            </plugins>
-        </build>
-    </profile>
-    <!-- END SNIPPET: release-profile -->
-    <profile>
-      <id>postgresql</id>
-      <build>
-        <defaultGoal>test</defaultGoal>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <configuration>
-              <includes>
-                <include>**/*PostgresqlTest.java</include>
-              </includes>
-            </configuration>
-            <executions>
-              <execution>
-                <phase>test</phase>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-
-</project>
diff --git a/scripts/sitepatch.bat b/scripts/sitepatch.bat
new file mode 100644
index 0000000..879548c
--- /dev/null
+++ b/scripts/sitepatch.bat
@@ -0,0 +1,7 @@
+"%JAVA_HOME%"\bin\java -jar c:\javadocpatcher\JavadocUpdaterTool.jar -R %1\release\trunk\api

+"%JAVA_HOME%"\bin\java -jar c:\javadocpatcher\JavadocUpdaterTool.jar -R %1\release\release-1.2\api

+"%JAVA_HOME%"\bin\java -jar c:\javadocpatcher\JavadocUpdaterTool.jar -R %1\release\release-1.1.1\api

+"%JAVA_HOME%"\bin\java -jar c:\javadocpatcher\JavadocUpdaterTool.jar -R %1\release\release-1.0.1\api

+"%JAVA_HOME%"\bin\java -jar c:\javadocpatcher\JavadocUpdaterTool.jar -R %1\release\release-0.6\api

+del /s %1\*.orig

+

diff --git a/scripts/update-site.py b/scripts/update-site.py
new file mode 100644
index 0000000..a1403bd
--- /dev/null
+++ b/scripts/update-site.py
@@ -0,0 +1,104 @@
+import sys
+import os
+import shutil
+import subprocess
+
+def svn_command(command_array):
+    """ Invoke svn command """
+    popen = subprocess.Popen(["svn"] + command_array,
+        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    out,err = popen.communicate()
+    rcode = popen.returncode
+    if rcode != 0:
+        raise Exception("svn invocation errored with code %d: %s" % (rcode,err))
+    return out
+    
+def site_merge(source_dir, target_dir):
+    """ Merge the source dir into the target dir, in a way that captures
+        differences that SVN can pick up.
+    """
+    # First, handle deletes.  Go through the target tree and find everything that doesn't
+    # exist in the source...
+    print >> sys.stderr, "Removing obsolete directories and files..."
+    deleted_dirs = { }
+    for root, dirs, files in os.walk(target_dir):
+        if root.find(".svn") == -1:
+            # Remove target_dir prefix from root
+            relative_root = root[len(target_dir):]
+            if len(relative_root) > 0 and (relative_root[0] == "/" or relative_root[0] == "\\"):
+                relative_root = relative_root[1:]
+            if not deleted_dirs.has_key(relative_root):
+                # Remove any dirs that have gone away
+                for dir in dirs:
+                    if dir != ".svn":
+                        relative_dirname = os.path.join(relative_root, dir)
+                        target_dirname = os.path.join(root, dir)
+                        source_dirname = os.path.join(source_dir, relative_dirname)
+                        if os.path.exists(target_dirname):
+                            if not os.path.exists(source_dirname):
+                                print >> sys.stderr, "Deleting directory %s" % relative_dirname
+                                svn_command(["remove",target_dirname])
+                                deleted_dirs[relative_dirname] = True
+                # Process files now.
+                for file in files:
+                    relative_filename = os.path.join(relative_root, file)
+                    target_filename = os.path.join(root, file)
+                    source_filename = os.path.join(source_dir, relative_filename)
+                    if os.path.exists(target_filename):
+                        if not os.path.exists(source_filename):
+                            print >> sys.stderr, "Deleting file %s" % relative_filename
+                            svn_command(["remove",target_filename])
+
+    # Now, we do the same thing for the source tree.  We will add the missing directories and
+    # copy and add the files.
+    print >> sys.stderr, "Adding and updating new directories and files..."
+    for root, dirs, files in os.walk(source_dir):
+        relative_root = root[len(source_dir):]
+        if len(relative_root) > 0 and (relative_root[0] == "/" or relative_root[0] == "\\"):
+            relative_root = relative_root[1:]
+        for dir in dirs:
+            relative_dirname = os.path.join(relative_root, dir)
+            target_dirname = os.path.join(target_dir, relative_dirname)
+            source_dirname = os.path.join(root, dir)
+            #svn_result = svn_command(["status",target_dirname])
+            #print >> sys.stderr, "Target: %s, svn result %s" % (target_dirname,svn_result)
+            #if len(svn_result) == 0 or svn_result[0] == "?":
+            succeeded = False
+            try:
+                svn_command(["mkdir",target_dirname])
+                succeeded = True
+            except:
+                pass
+            if succeeded:
+                print >> sys.stderr, "Adding directory %s" % relative_dirname
+        for file in files:
+            relative_filename = os.path.join(relative_root, file)
+            target_filename = os.path.join(target_dir, relative_filename)
+            source_filename = os.path.join(root, file)
+            # Copy source to target
+            shutil.copyfile(source_filename, target_filename)
+            svn_result = svn_command(["status",target_filename])
+            if len(svn_result) > 0 and svn_result[0] == "?":
+                print >> sys.stderr, "Adding file %s" % relative_filename
+                svn_command(["add",target_filename])
+    
+if __name__ == '__main__':
+    if len(sys.argv) != 2 and len(sys.argv) != 3:
+        print >> sys.stderr, "Usage: %s <src_dir> [<target_dir>]" % sys.argv[0]
+        sys.exit(1)
+    
+    source_dir = sys.argv[1]
+    if len(sys.argv) > 2:
+        target_dir = sys.argv[2]
+    else:
+        target_dir = "publish"
+    
+    svn_command([ "update", target_dir])
+
+    site_merge(source_dir, target_dir)
+    
+    print >> sys.stderr, "Committing changes..."
+    svn_command([ "-m", "Update ManifoldCF site", "commit", target_dir])
+    
+    print >> sys.stderr, "Site updated!"
+    
\ No newline at end of file
diff --git a/site/.htaccess b/site/.htaccess
deleted file mode 100644
index d91d2f5..0000000
--- a/site/.htaccess
+++ /dev/null
@@ -1,33 +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.
-
-Options +FollowSymlinks
-RewriteEngine on
-#RewriteBase http://incubator.apache.org/connectors/
-rewriterule ^end-user-documentation\.html$ http://incubator.apache.org/connectors/en_US/end-user-documentation.html [r=301,nc] 
-rewriterule ^end-user-documentation\.pdf$ http://incubator.apache.org/connectors/en_US/end-user-documentation.pdf [r=301,nc] 
-rewriterule ^how-to-build-and-deploy\.html$ http://incubator.apache.org/connectors/en_US/how-to-build-and-deploy.html [r=301,nc] 
-rewriterule ^developer-resources\.html$ http://incubator.apache.org/connectors/en_US/developer-resources.html [r=301,nc] 
-rewriterule ^mail\.html$ http://incubator.apache.org/connectors/en_US/mail.html [r=301,nc] 
-rewriterule ^download\.html$ http://incubator.apache.org/connectors/en_US/download.html [r=301,nc] 
-rewriterule ^javadoc\.html$ http://incubator.apache.org/connectors/en_US/javadoc.html [r=301,nc] 
-rewriterule ^faq\.html$ http://incubator.apache.org/connectors/en_US/faq.html [r=301,nc] 
-rewriterule ^concepts\.html$ http://incubator.apache.org/connectors/en_US/concepts.html [r=301,nc] 
-rewriterule ^performance-tuning\.html$ http://incubator.apache.org/connectors/en_US/performance-tuning.html [r=301,nc] 
-rewriterule ^javadoc\.html$ http://incubator.apache.org/connectors/en_US/javadoc.html [r=301,nc] 
-rewriterule ^who\.html$ http://incubator.apache.org/connectors/en_US/who.html [r=301,nc] 
-rewriterule ^script\.html$ http://incubator.apache.org/connectors/en_US/script.html [r=301,nc] 
-rewriterule ^programmatic-operation\.html$ http://incubator.apache.org/connectors/en_US/programmatic-operation.html [r=301,nc] 
-rewriterule ^included-connectors\.html$ http://incubator.apache.org/connectors/en_US/included-connectors.html [r=301,nc] 
diff --git a/site/README.txt b/site/README.txt
deleted file mode 100644
index 8299561..0000000
--- a/site/README.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-This directory contains the ManifoldCF web site.
-To update the site, do the following:
-
-    1. Modify the site sources in ./src
-
-    2. Run "forrest site" to generate the site in ./build
-
-    3. Run "forrest run" to review the built site
-    
-    4. Commit the changes
-    
-    5. For externally-viewable site publishing, copy build/site to https://svn.apache.org/repos/asf/manifoldcf/site/publish, and commit
-
-    6. Run "umask 002; svn up /www/manifoldcf.apache.org"
-       on people.apache.org (you'll need karma for this)
-
diff --git a/site/build.xml b/site/build.xml
deleted file mode 100644
index a2db2aa..0000000
--- a/site/build.xml
+++ /dev/null
@@ -1,291 +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.
--->
-
-<project default="all">
-
-    <target name="clean">
-        <delete dir="build"/>
-        <delete dir="tmp"/>
-    </target>
-
-    <target name="get-forrest-root">
-        <property environment="env"/>
-        <echo message="${env.FORREST_HOME}"/>
-        <property name="forrest-root" value="${env.FORREST_HOME}"/>
-    </target>
-    
-    <target name="calculate-forrest-condition" depends="get-forrest-root">
-        <available file="${forrest-root}" property="forrestAvailable"/>
-    </target>
-
-    <target name="forrest-check" depends="calculate-forrest-condition" unless="forrestAvailable">
-        <echo message="Site cannot be built without Apache Forrest installed"/>
-    </target>
-    
-    <target name="calculate-dejavu-condition">
-        <available file="fonts/dejavu-fonts-ttf-2.37.zip" property="dejavuAvailable"/>
-    </target>
-
-    <target name="dejavu-check" depends="download-dejavu-fonts,calculate-dejavu-condition" unless="dejavuAvailable">
-        <echo message="Dejavu fonts cannot be built without dejavu-fonts-ttf-2.37.zip"/>
-    </target>
-
-    <target name="calculate-ipa-condition">
-        <available file="fonts/IPAGTTC00303.zip" property="ipaAvailable"/>
-    </target>
-
-    <target name="ipa-check" depends="download-ipa-fonts,calculate-ipa-condition" unless="ipaAvailable">
-        <echo message="IPA fonts cannot be built without IPAGTTC00303.zip"/>
-    </target>
-
-    <target name="setup-local-forrest" depends="forrest-check" if="forrestAvailable">
-        <mkdir dir="tmp/forrest"/>
-        <copy todir="tmp/forrest">
-            <fileset dir="${forrest-root}"/>
-        </copy>
-        <chmod dir="tmp/forrest/bin" perm="ugo+rx" includes="forrest"/>
-        <chmod dir="tmp/forrest/tools/ant/bin" perm="ugo+rx" includes="ant"/>
-        <!-- Replace the fop jar with a more up-to-date version -->
-        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/lib/fop-0.95.jar"/>
-        <delete file="tmp/forrest/build/plugins/lib/fop-0.95.jar"/>
-        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/lib">
-            <fileset dir="../lib">
-                <include name="fop*.jar"/>
-            </fileset>
-        </copy>
-        <!-- Same with the XML Graphics jar -->
-        <delete file="tmp/forrest/lib/core/xmlgraphics-commons-1.3.1.jar"/>
-        <copy todir="tmp/forrest/lib/core">
-            <fileset dir="../lib">
-                <include name="xmlgraphics-commons*.jar"/>
-            </fileset>
-        </copy>
-        <!-- Replace the file tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/output.xmap with our own patched version -->
-        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/output.xmap"/>
-        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf">
-            <fileset dir="pdf">
-                <include name="output.xmap"/>
-                <include name="config.xml"/>
-            </fileset>
-        </copy>
-        <dirname file="build.xml" property="project-path"/>
-        <replace file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/output.xmap" token="{root}" value="${project-path}"/>
-        <replace file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/config.xml" token="{root}" value="${project-path}"/>
-        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/resources/stylesheets/document-to-fo.xsl"/>
-        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/resources/stylesheets">
-            <fileset dir="pdf">
-                <include name="document-to-fo.xsl"/>
-            </fileset>
-        </copy>
-        <delete file="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/resources/stylesheets/helper-footerinfo.xsl"/>
-        <copy todir="tmp/forrest/plugins/org.apache.forrest.plugin.output.pdf/resources/stylesheets">
-            <fileset dir="pdf">
-                <include name="helper-footerinfo.xsl"/>
-            </fileset>
-        </copy>
-    </target>
-
-    <target name="build-dejavu-fonts" depends="dejavu-check" if="dejavuAvailable">
-        <mkdir dir="tmp/font/dejavu-fonts"/>
-        <unzip src="fonts/dejavu-fonts-ttf-2.37.zip" dest="tmp/font/dejavu-fonts"/>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans.ttf"/>
-            <arg value="tmp/font/DejaVuSans.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans-Oblique.ttf"/>
-            <arg value="tmp/font/DejaVuSans-Oblique.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans-Bold.ttf"/>
-            <arg value="tmp/font/DejaVuSans-Bold.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif.ttf"/>
-            <arg value="tmp/font/DejaVuSerif.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif-Italic.ttf"/>
-            <arg value="tmp/font/DejaVuSerif-Italic.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSerif-Bold.ttf"/>
-            <arg value="tmp/font/DejaVuSerif-Bold.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="tmp/font/dejavu-fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSansMono.ttf"/>
-            <arg value="tmp/font/DejaVuSansMono.xml"/>
-        </java>
-
-    </target>
-    
-    <target name="build-ipa-fonts" depends="ipa-check" if="ipaAvailable">
-        <mkdir dir="tmp/font/ipa-fonts"/>
-        <unzip src="fonts/IPAGTTC00303.zip" dest="tmp/font/ipa-fonts"/>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="-ttcname"/>
-            <arg value="IPAPGothic"/>
-            <arg value="tmp/font/ipa-fonts/IPAGTTC00303/ipag.ttc"/>
-            <arg value="tmp/font/ipapgothic.xml"/>
-        </java>
-        <java classname="org.apache.fop.fonts.apps.TTFReader" fork="true">
-            <classpath>
-                <fileset dir="../lib">
-                    <include name="fop*.jar"/>
-                    <include name="xmlgraphics-commons*.jar"/>
-                    <include name="avalon*.jar"/>
-                    <include name="commons-io*.jar"/>
-                    <include name="commons-logging*.jar"/>
-                </fileset>
-            </classpath>
-            <arg value="-ttcname"/>
-            <arg value="IPAGothic"/>
-            <arg value="tmp/font/ipa-fonts/IPAGTTC00303/ipag.ttc"/>
-            <arg value="tmp/font/ipagothic.xml"/>
-        </java>
-
-    </target>
-    
-    <target name="dependencies-check" depends="ipa-check,dejavu-check,forrest-check">
-        <condition property="dependenciesAvailable">
-          <and>
-              <isset property="ipaAvailable"/>
-              <isset property="dejavuAvailable"/>
-              <isset property="forrestAvailable"/>
-          </and>
-        </condition>
-    </target>
-    
-    <target name="dist" depends="setup-local-forrest,build-ipa-fonts,build-dejavu-fonts,dependencies-check" if="dependenciesAvailable">
-        <dirname file="tmp/forrest/LICENSE.txt" property="forrest-dir"/>
-        <echo message="${forrest-dir}"/>
-        <exec executable="cmd.exe" dir="." searchpath="true" failonerror="true" osfamily="windows">
-            <arg line="/c .\tmp\forrest\bin\forrest.bat site"/>
-            <env key="JAVA_TOOL_OPTIONS" value="-Dfile.encoding=UTF8"/>
-            <env key="FORREST_HOME" value="${forrest-dir}"/>
-        </exec>
-        <exec executable="./tmp/forrest/bin/forrest" dir="." searchpath="true" failonerror="true" osfamily="unix">
-            <arg line="site"/>
-            <env key="JAVA_TOOL_OPTIONS" value="-Dfile.encoding=UTF8"/>
-            <env key="FORREST_HOME" value="${forrest-dir}"/>
-        </exec>
-    </target>
-    
-    <target name="calculate-dejavu-condition-before">
-        <available file="fonts/dejavu-fonts-ttf-2.37.zip" property="dejavuAvailableBefore"/>
-    </target>
-
-    <target name="download-dejavu-fonts" depends="calculate-dejavu-condition-before" unless="dejavuAvailableBefore">
-      <mkdir dir="fonts"/>
-      <get src="http://versaweb.dl.sourceforge.net/project/dejavu/dejavu/2.37/dejavu-fonts-ttf-2.37.zip" dest="fonts"/>
-    </target>
-    
-    <target name="calculate-ipa-condition-before">
-        <available file="fonts/IPAGTTC00303.zip" property="ipaAvailableBefore"/>
-    </target>
-
-    <target name="download-ipa-fonts" depends="calculate-ipa-condition-before" unless="ipaAvailableBefore">
-      <mkdir dir="fonts"/>
-      <!-- http://ossipedia.ipa.go.jp/ipafont/download.html?ruleagreement=%E5%90%8C%E6%84%8F%E3%81%99%E3%82%8B%2FAccept -->
-      <!-- get src="http://ossipedia.ipa.go.jp/ipafont/IPAGTTC00303.php" dest="fonts/IPAGTTC00303.zip"/ -->
-      <!-- get src="http://info.openlab.ipa.go.jp/ipafont/fontdata/IPAGTTC00303.zip" dest="fonts"/ -->
-      <!-- get src="http://ossipedia.ipa.go.jp/ipafont/ipafont/IPAGTTC00303.zip" dest="fonts"/ -->
-      <get src="http://jaist.dl.sourceforge.jp/ipafonts/51867/IPAGTTC00303.zip" dest="fonts"/>
-    </target>
-    
-    <target name="download-dependencies" depends="download-dejavu-fonts,download-ipa-fonts">
-    </target>
-
-    <target name="download-cleanup">
-        <delete dir="fonts"/>
-    </target>
-
-    <target name="all" depends="dist"/>
-    
-</project>
diff --git a/site/forrest.properties.xml b/site/forrest.properties.xml
deleted file mode 100644
index 45cafbe..0000000
--- a/site/forrest.properties.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version='1.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.
--->
-
-<properties>
-  <!-- Default values -->
-  <property name="output.pdf.fontFamily.serif" value="DejaVuSerif"/>
-  <property name="output.pdf.fontFamily.sansSerif" value="DejaVuSans"/>
-  <property name="output.pdf.fontFamily.monospace" value="DejaVuSansMono"/>
-  <!-- Overrides for ja_JP -->
-  <property name="output.pdf.fontFamily.serif.ja_JP" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.sansSerif.ja_JP" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.monospace.ja_JP" value="IPAPGothic"/>
-
-  <!-- property name="output.pdf.fontFamily.arial" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.TimesNewRoman" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.Courier" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.arialMT" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.arial-BoldMT" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.arial-ItalicMT" value="IPAPGothic"/>
-  <property name="output.pdf.fontFamily.TimesNewRomanPSMT" value="IPAPGothic"/ -->
-</properties>
\ No newline at end of file
diff --git a/site/pdf/helper-footerinfo.xsl b/site/pdf/helper-footerinfo.xsl
deleted file mode 100644
index a22b7b5..0000000
--- a/site/pdf/helper-footerinfo.xsl
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                version="1.0">
-<!--
-Named template to generate a short message in the PDF footer, from text in
-skinconf.xml.  By default, the message is a copyright statement.  If a credit
-with @role='pdf' is present, that is used instead.  Eg:
-
-<credit role="pdf">
-  <name>Generated by Apache FOP 1.0-dev</name>
-  <url>http://xml.apache.org/fop/dev/</url>
-</credit>
--->
-  <xsl:template name="info">
-    <xsl:variable name="disable-copyright-footer" select="//skinconfig/pdf/disable-copyright-footer"/>
-    <xsl:variable name="disable-trademark-statement" select="//skinconfig/pdf/disable-trademark-statement"/>
-    <xsl:variable name="pdfcredit" select="//skinconfig/credits/credit[@role = 'pdf']"/>
-    <xsl:variable name="text">
-      <xsl:if test="$pdfcredit">
-        <xsl:value-of select="$pdfcredit/name"/>
-      </xsl:if>
-      <xsl:if test="not($pdfcredit) and not($disable-copyright-footer = 'true')">
-<xsl:text>Copyright &#169; </xsl:text>
-        <xsl:value-of select="//skinconfig/year"/>&#160;<xsl:value-of
-          select="//skinconfig/vendor"/>
-<xsl:text> All rights reserved.</xsl:text>
-      </xsl:if>
-      <xsl:if test="not($pdfcredit) and not($disable-trademark-statement = 'true')">
-        <xsl:value-of select="//skinconfig/trademark-statement"/>
-      </xsl:if>
-    </xsl:variable>
-    <xsl:variable name="url" select="$pdfcredit/url"/>
-    <fo:block-container font-style="italic" absolute-position="absolute"
-      left="0pt" bottom="150pt" height="20pt"
-      font-size="8pt">
-<!-- move copyright down if there is a legal notice 
-              (thus keeping it on same line as line number) -->
-      <xsl:attribute
-            name="top">
-        <xsl:choose>
-          <xsl:when
-                    test="/site/document/footer/legal">22</xsl:when>
-          <xsl:otherwise>6</xsl:otherwise>
-        </xsl:choose>
-      </xsl:attribute>
-      <xsl:if test="not($url)">
-        <fo:block text-align="center" color="lightgrey">
-          <xsl:value-of select="$text"/>
-        </fo:block>
-      </xsl:if>
-      <xsl:if test="$url">
-        <fo:block text-align="center">
-          <fo:basic-link color="lightgrey"
-            external-destination="{$url}">
-            <xsl:value-of select="$text"/>
-          </fo:basic-link>
-        </fo:block>
-        <fo:block text-align="center">
-          <fo:basic-link color="lightgrey"
-            external-destination="{$url}">
-            <xsl:value-of select="$url"/>
-          </fo:basic-link>
-        </fo:block>
-      </xsl:if>
-    </fo:block-container>
-  </xsl:template>
-</xsl:stylesheet>
diff --git a/site/src/documentation/conf/cli.xconf b/site/src/documentation/conf/cli.xconf
deleted file mode 100644
index bdafbcc..0000000
--- a/site/src/documentation/conf/cli.xconf
+++ /dev/null
@@ -1,325 +0,0 @@
-<?xml version="1.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.
--->
-<!--+
-    |  This is the Apache Cocoon command line configuration file.
-    |  Here you give the command line interface details of where
-    |  to find various aspects of your Cocoon installation.
-    |
-    |  If you wish, you can also use this file to specify the URIs
-    |  that you wish to generate.
-    |
-    |  The current configuration information in this file is for
-    |  building the Cocoon documentation. Therefore, all links here
-    |  are relative to the build context dir, which, in the build.xml
-    |  file, is set to ${build.context}
-    |
-    |  Options:
-    |    verbose:            increase amount of information presented
-    |                        to standard output (default: false)
-    |    follow-links:       whether linked pages should also be
-    |                        generated (default: true)
-    |    precompile-only:    precompile sitemaps and XSP pages, but
-    |                        do not generate any pages (default: false)
-    |    confirm-extensions: check the mime type for the generated page
-    |                        and adjust filename and links extensions
-    |                        to match the mime type
-    |                        (e.g. text/html->.html)
-    |
-    |  Note: Whilst using an xconf file to configure the Cocoon
-    |        Command Line gives access to more features, the use of
-    |        command line parameters is more stable, as there are
-    |        currently plans to improve the xconf format to allow
-    |        greater flexibility. If you require a stable and
-    |        consistent method for accessing the CLI, it is recommended
-    |        that you use the command line parameters to configure
-    |        the CLI. See documentation at:
-    |        http://cocoon.apache.org/2.1/userdocs/offline/
-    |        http://wiki.apache.org/cocoon/CommandLine
-    |
-    +-->
-
-<cocoon verbose="true"
-        follow-links="true"
-        precompile-only="false"
-        confirm-extensions="false">
-
-   <!--+
-       |  The context directory is usually the webapp directory
-       |  containing the sitemap.xmap file.
-       |
-       |  The config file is the cocoon.xconf file.
-       |
-       |  The work directory is used by Cocoon to store temporary
-       |  files and cache files.
-       |
-       |  The destination directory is where generated pages will
-       |  be written (assuming the 'simple' mapper is used, see
-       |  below)
-       +-->
-   <context-dir>.</context-dir>
-   <config-file>WEB-INF/cocoon.xconf</config-file>
-   <work-dir>../tmp/cocoon-work</work-dir>
-   <dest-dir>../site</dest-dir>
-
-   <!--+
-       |  A checksum file can be used to store checksums for pages
-       |  as they are generated. When the site is next generated,
-       |  files will not be written if their checksum has not changed.
-       |  This means that it will be easier to detect which files
-       |  need to be uploaded to a server, using the timestamp.
-       |
-       |  The default path is relative to the core webapp directory.
-       |  An asolute path can be used.
-       +-->
-   <!--   <checksums-uri>build/work/checksums</checksums-uri>-->
-
-   <!--+
-       | Broken link reporting options:
-       |   Report into a text file, one link per line:
-       |     <broken-links type="text" report="filename"/>
-       |   Report into an XML file:
-       |     <broken-links type="xml" report="filename"/>
-       |   Ignore broken links (default):
-       |     <broken-links type="none"/>
-       |
-       |   Two attributes to this node specify whether a page should
-       |   be generated when an error has occured. 'generate' specifies
-       |   whether a page should be generated (default: true) and
-       |   extension specifies an extension that should be appended
-       |   to the generated page's filename (default: none)
-       |
-       |   Using this, a quick scan through the destination directory
-       |   will show broken links, by their filename extension.
-       +-->
-   <broken-links type="xml"
-                 file="../brokenlinks.xml"
-                 generate="false"
-                 extension=".error"
-                 show-referrers="true"/>
-
-   <!--+
-       |  Load classes at startup. This is necessary for generating
-       |  from sites that use SQL databases and JDBC.
-       |  The <load-class> element can be repeated if multiple classes
-       |  are needed.
-       +-->
-   <!--
-   <load-class>org.firebirdsql.jdbc.Driver</load-class>
-   -->
-
-   <!--+
-       |  Configures logging.
-       |  The 'log-kit' parameter specifies the location of the log kit
-       |  configuration file (usually called logkit.xconf.
-       |
-       |  Logger specifies the logging category (for all logging prior
-       |  to other Cocoon logging categories taking over)
-       |
-       |  Available log levels are:
-       |    DEBUG:        prints all level of log messages.
-       |    INFO:         prints all level of log messages except DEBUG
-       |                  ones.
-       |    WARN:         prints all level of log messages except DEBUG
-       |                  and INFO ones.
-       |    ERROR:        prints all level of log messages except DEBUG,
-       |                  INFO and WARN ones.
-       |    FATAL_ERROR:  prints only log messages of this level
-       +-->
-   <!-- <logging log-kit="WEB-INF/logkit.xconf" logger="cli" level="ERROR" /> -->
-
-   <!--+
-       |  Specifies the filename to be appended to URIs that
-       |  refer to a directory (i.e. end with a forward slash).
-       +-->
-   <default-filename>index.html</default-filename>
-
-   <!--+
-       |  Specifies a user agent string to the sitemap when
-       |  generating the site.
-       |
-       |  A generic term for a web browser is "user agent". Any
-       |  user agent, when connecting to a web server, will provide
-       |  a string to identify itself (e.g. as Internet Explorer or
-       |  Mozilla). It is possible to have Cocoon serve different
-       |  content depending upon the user agent string provided by
-       |  the browser. If your site does this, then you may want to
-       |  use this <user-agent> entry to provide a 'fake' user agent
-       |  to Cocoon, so that it generates the correct version of your
-       |  site.
-       |
-       |  For most sites, this can be ignored.
-       +-->
-   <!--
-   <user-agent>Cocoon Command Line Environment 2.1</user-agent>
-   -->
-
-   <!--+
-       |  Specifies an accept string to the sitemap when generating
-       |  the site.
-       |  User agents can specify to an HTTP server what types of content
-       |  (by mime-type) they are able to receive. E.g. a browser may be
-       |  able to handle jpegs, but not pngs. The HTTP accept header
-       |  allows the server to take the browser's capabilities into account,
-       |  and only send back content that it can handle.
-       |
-       |  For most sites, this can be ignored.
-       +-->
-
-   <accept>*/*</accept>
-
-   <!--+
-       | Specifies which URIs should be included or excluded, according
-       | to wildcard patterns.
-       |
-       | These includes/excludes are only relevant when you are following
-       | links. A link URI must match an include pattern (if one is given)
-       | and not match an exclude pattern, if it is to be followed by
-       | Cocoon. It can be useful, for example, where there are links in
-       | your site to pages that are not generated by Cocoon, such as
-       | references to api-documentation.
-       |
-       | By default, all URIs are included. If both include and exclude
-       | patterns are specified, a URI is first checked against the
-       | include patterns, and then against the exclude patterns.
-       |
-       | Multiple patterns can be given, using muliple include or exclude
-       | nodes.
-       |
-       | The order of the elements is not significant, as only the first
-       | successful match of each category is used.
-       |
-       | Currently, only the complete source URI can be matched (including
-       | any URI prefix). Future plans include destination URI matching
-       | and regexp matching. If you have requirements for these, contact
-       | dev@cocoon.apache.org.
-       +-->
-
-   <exclude pattern="**/"/>
-   <exclude pattern="**apidocs**"/>
-   <exclude pattern="api/**"/>
-
-<!--
-  This is a workaround for FOR-284 "link rewriting broken when
-  linking to xml source views which contain site: links".
-  See the explanation there and in declare-broken-site-links.xsl
--->
-   <exclude pattern="site:**"/>
-   <exclude pattern="ext:**"/>
-   <exclude pattern="lm:**"/>
-   <exclude pattern="**/site:**"/>
-   <exclude pattern="**/ext:**"/>
-   <exclude pattern="**/lm:**"/>
-
-   <!-- Exclude tokens used in URLs to ASF mirrors (interpreted by a CGI) -->
-   <exclude pattern="[preferred]/**"/>
-   <exclude pattern="[location]"/>
-
-   <!--   <include-links extension=".html"/>-->
-
-   <!--+
-       |  <uri> nodes specify the URIs that should be generated, and
-       |  where required, what should be done with the generated pages.
-       |  They describe the way the URI of the generated file is created
-       |  from the source page's URI. There are three ways that a generated
-       |  file URI can be created: append, replace and insert.
-       |
-       |  The "type" attribute specifies one of (append|replace|insert):
-       |
-       |  append:
-       |  Append the generated page's URI to the end of the source URI:
-       |
-       |   <uri type="append" src-prefix="documents/" src="index.html"
-       |   dest="build/dest/"/>
-       |
-       |  This means that
-       |   (1) the "documents/index.html" page is generated
-       |   (2) the file will be written to "build/dest/documents/index.html"
-       |
-       |  replace:
-       |  Completely ignore the generated page's URI - just
-       |  use the destination URI:
-       |
-       |   <uri type="replace" src-prefix="documents/" src="index.html"
-       |   dest="build/dest/docs.html"/>
-       |
-       |  This means that
-       |   (1) the "documents/index.html" page is generated
-       |   (2) the result is written to "build/dest/docs.html"
-       |   (3) this works only for "single" pages - and not when links
-       |       are followed
-       |
-       |  insert:
-       |  Insert generated page's URI into the destination
-       |  URI at the point marked with a * (example uses fictional
-       |  zip protocol)
-       |
-       |   <uri type="insert" src-prefix="documents/" src="index.html"
-       |   dest="zip://*.zip/page.html"/>
-       |
-       |  This means that
-       |   (1)
-       |
-       |  In any of these scenarios, if the dest attribute is omitted,
-       |  the value provided globally using the <dest-dir> node will
-       |  be used instead.
-       +-->
-   <!--
-   <uri type="replace"
-        src-prefix="samples/"
-        src="hello-world/hello.html"
-        dest="build/dest/hello-world.html"/>
-   -->
-
-   <!--+
-       | <uri> nodes can be grouped together in a <uris> node. This
-       | enables a group of URIs to share properties. The following
-       | properties can be set for a group of URIs:
-       |   * follow-links:       should pages be crawled for links
-       |   * confirm-extensions: should file extensions be checked
-       |                         for the correct mime type
-       |   * src-prefix:         all source URIs should be
-       |                         pre-pended with this prefix before
-       |                         generation. The prefix is not
-       |                         included when calculating the
-       |                         destination URI
-       |   * dest:               the base destination URI to be
-       |                         shared by all pages in this group
-       |   * type:               the method to be used to calculate
-       |                         the destination URI. See above
-       |                         section on <uri> node for details.
-       |
-       | Each <uris> node can have a name attribute. When a name
-       | attribute has been specified, the -n switch on the command
-       | line can be used to tell Cocoon to only process the URIs
-       | within this URI group. When no -n switch is given, all
-       | <uris> nodes are processed. Thus, one xconf file can be
-       | used to manage multiple sites.
-       +-->
-   <!--
-   <uris name="mirrors" follow-links="false">
-     <uri type="append" src="mirrors.html"/>
-   </uris>
-   -->
-
-   <!--+
-       |  File containing URIs (plain text, one per line).
-       +-->
-   <!--
-   <uri-file>uris.txt</uri-file>
-   -->
-</cocoon>
diff --git a/site/src/documentation/content/xdocs/en_US/concepts.xml b/site/src/documentation/content/xdocs/en_US/concepts.xml
deleted file mode 100644
index c14c636..0000000
--- a/site/src/documentation/content/xdocs/en_US/concepts.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Concepts</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Concepts</title>
-      <p>ManifoldCF is a crawler framework which is designed to meet several key goals.</p>
-      <p></p>
-      <ul>
-        <li>It's reliable, and resilient against being shutdown or restarted</li>
-        <li>It's incremental, meaning that jobs describe a set of documents by some criteria, and are meant to be run again and again to pick up any differences</li>
-        <li>It supports connections to multiple kinds of repositories at the same time</li>
-        <li>It defines and fully supports a model of document security, so that each document listed in a search result from the back-end search engine is one that the current user is allowed to see</li>
-        <li>It operates with reasonable efficiency and throughput</li>
-        <li>Its memory usage characteristics are bounded and predictable in advance</li>
-      </ul>
-      <p></p>
-      <p>ManifoldCF meets many of its architectural goals by being implemented on top of a relational database.  The current implementation requires Postgresql or uses the included Derby.  Longer term, we may support other DB bindings.</p>
-      <p></p>
-      <section>
-        <title>ManifoldCF document model</title>
-        <p></p>
-        <p>Each document in ManifoldCF consists of some opaque binary data, plus some opaque associated metadata (which is described by name-value pairs), and is uniquely addressed by a URI.  The back-end search engines which ManifoldCF communicates with are all expected to support, to a greater or lesser degree, this model.</p>
-        <p></p>
-        <p>Documents may also have access tokens associated with them.  These access tokens are described more fully in the next section.</p>
-        <p></p>
-      </section>
-      <section>
-        <title>ManifoldCF security model</title>
-        <p></p>
-        <p>The ManifoldCF security model is based loosely on the standard authorization concepts and hierarchies found in Microsoft's Active Directory.  Active Directory is quite
-          common in the kinds of environments where data repositories exist that are ripe for indexing.  Active Directory's authorization model is also easily used in a general way to 
-          represent authorization for a huge variety of third-party content repositories.</p>
-        <p></p>
-        <p>ManifoldCF defines a concept of an <em>access token</em>.  An access token, to ManifoldCF, is a string which is meaningful only to a specific connector or
-          connectors.  This string describes the ability of a user to view (or not view) some set of documents.  For documents protected by Active Directory itself, an access token
-          would be an Active Directory SID (e.g. "S-1-23-4-1-45").  But, for example, for documents protected by Livelink a wholly different string would be used.</p>
-        <p></p>
-        <p>In the ManifoldCF security model, it is the job of an <em>authority</em> to provide a list of access tokens for a given searching user.  Multiple authorities cooperate
-          in that each one can add to the list of access tokens describing a given user's security.  A user is described in terms of a set of <em>authorization domains</em>
-          and user name tuples.  Any given authority will provide access tokens for a user name corresponding to one authorization domain.  For example,
-          an authority that understands FaceBook users would only respond to a FaceBook user name.  Access tokens from all applicable authorities are added into the final list that is handed to the search engine as part of every
-          search request, so that the search engine may properly exclude documents that the user is not allowed to see.</p>
-        <p></p>
-        <p>When document indexing is done, therefore, it is the job of the crawler to hand access tokens to the search engine, so that it may categorize the documents properly
-          according to their accessibility.  The access tokens the crawler attaches to a document are meaningful only within the space of the governing <em>authority group</em>.  An
-          authority group describes a set of authorities which all can cooperate to provide access tokens for a single given document.  Each authority belongs
-          to exactly one authority group.  Authority groups serve to separate access tokens into different spaces so that they cannot interfere with one another.</p>
-        <p></p>
-        <p>For example, say that you would want to crawl documents from a LiveLink repository, as well as from a Windows shared drive.
-          You will therefore have two kinds of documents that are each secured in an entirely different way.  There is a LiveLink authority connection, which provides LiveLink
-          access tokens, and there is an Active Directory authority connection, which provides Windows access tokens.  Now, you don't want there to be any chance
-          that a LiveLink access token could be confused with an Active Directory SID, so the way you do that in ManifoldCF is to create two distinct
-          authority groups, each of which provides access tokens meant for specific kinds of repository documents.  Thus, documents secured by Active
-          Directory SIDs should be indexed against an Active Directory authority group, and documents secured by LiveLink access tokens should have a LiveLink
-          authority group.  Finally, the Active Directory authority connection should then belong to the Active Directory authority group, and the LiveLink authority connection should
-          belong to the LiveLink authority group.</p>
-        <p></p>
-        <p>In addition to specifying the correct authority group, access tokens can be attached to documents as "grant" tokens, or as "deny" tokens.
-          "Grant" tokens provide access, "deny" tokens restrict it.  "Deny" tokens, if matched, always win over "grant" tokens.
-          And finally, there are multiple levels of tokens, which correspond to Active Directory's concepts
-          of "share" security, specific "directory" security, or "file" security.  (The latter concepts are rarely used except for documents that come from
-          Windows or Samba systems.)  Each level provided must agree that the document is to be visible for the document to appear in search
-          results.</p>
-        <p></p>
-        <p>Once all these documents and their access tokens are handed to the search engine, it is the search engine's job to enforce security by excluding inappropriate documents
-          from the search results.  For Solr and for ElasticSearch, this infrastructure has been included in ManifoldCF releases as a Solr plugin (both 3.x and 4.x varieties) and an
-          ElasticSearch plugin.  Bear in mind that this plug-in is still not a complete solution, as it requires one or more authenticated user
-          names to be passed to it from some upstream source, possibly a JAAS authenticator within an application server framework.</p>
-        <p></p>
-      </section>
-      <section>
-        <title>ManifoldCF conceptual entities</title>
-        <p></p>
-        <section>
-          <title>Connectors</title>
-          <p></p>
-          <p>ManifoldCF defines five different kinds of connectors.  These are:</p>
-          <p></p>
-          <ul>
-            <li>User mapping connectors</li>
-            <li>Authority connectors</li>
-            <li>Repository connectors</li>
-            <li>Transformation connectors</li>
-            <li>Output connectors</li>
-          </ul>
-          <p></p>
-          <p>All connectors share certain characteristics.  First, they are pooled.  This means that ManifoldCF keeps configured and connected instances of a connector around for
-            a while, and has the ability to limit the total number of such instances to within some upper limit.  Connector implementations have specific methods in them for managing
-            their existence in the pools that ManifoldCF keeps them in.  Second, they are configurable.  The configuration description for a connector is an XML document, whose precise
-            format is determined by the connector implementation.  A configured connector instance is called a <em>connection</em>, by common ManifoldCF convention.</p>
-          <p></p>
-          <p>The function of each type of connector is described below.</p>
-          <p></p>
-          <table>
-            <tr><th>Connector type</th><th>Function</th></tr>
-            <tr><td>User mapping connector</td><td>Maps a user name to another (equivalent) user name, typically by means of a regular expression mechanism, or by repository access</td></tr>
-            <tr><td>Authority connector</td><td>Furnishes a standard way of mapping a user name to access tokens that are meaningful for a given type of repository</td></tr>
-            <tr><td>Repository connector</td><td>Fetches documents from a specific kind of repository, such as SharePoint or off the web</td></tr>
-            <tr><td>Transformation connector</td><td>Modifies documents or their metadata, after fetched by a repository connector and before being sent to the index by an output connector</td></tr>
-            <tr><td>Output connector</td><td>Pushes document ingestion requests and deletion requests to a specific kind of back end search engine or other entity, such as Lucene</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Connections</title>
-          <p></p>
-          <p>As described above, a <em>connection</em> is a connector implementation plus connector-specific configuration information.  A user can define a connection of all
-            three types in the crawler UI.</p>
-          <p></p>
-          <p>The kind of information included in the configuration data for a connector typically describes the "how", as opposed to the "what".  For example, you'd configure a
-            LiveLink connection by specifying how to talk to the LiveLink server.  You would <strong>not</strong> include information about which documents to select in such a
-            configuration.</p>
-          <p></p>
-          <p>There is one difference between how you define a <em>repository connection</em> or <em>authority connection</em>, vs. how you would define a <em>transformation connection</em> or <em>output
-            connection</em> or <em>mapping connection</em>.  The difference is that you must specify a governing authority group for your repository connection, and an owning
-            authority group for your authority connection.  This is
-            because <strong>all</strong> documents ingested by ManifoldCF need to include appropriate access tokens, and those access tokens are specific to
-            the governing authority group.</p>
-          <p></p>
-          <p>Another difference in how you define an <em>authority connection</em> or <em>mapping connection</em>, vs. other connections, is that you can specify a prerequisite
-            <em>mapping connection</em> that must occur beforehand.  This means you can have multiple user mappings that occur in a defined sequence, before the authority is
-            invoked.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Jobs</title>
-          <p></p>
-          <p>A <em>job</em> in ManifoldCF parlance is a description of some kind of synchronization that needs to occur between a specified repository connection and a specified
-            output connection.  A job includes the following:</p>
-          <p></p>
-          <ul>
-            <li>A verbal description</li>
-            <li>A repository connection (and thus implicitly an authority group as well)</li>
-            <li>Zero or more transformation connections</li>
-            <li>An output connection</li>
-            <li>A repository-connection-specific description of "what" documents and metadata the job applies to</li>
-            <li>Zero or more transformation-connection-specific descriptions of "how" documents and metadata should be manipulated before indexing</li>
-            <li> An output-connection-specific description of how documents should be indexed</li>
-            <li>A model for crawling: either "run to completion", or "run continuously"</li>
-            <li>A schedule for when the job will run: either within specified time windows, or on demand</li>
-          </ul>
-          <p></p>
-          <p>Jobs are allowed to share the same repository connection, and thus they can overlap in the set of documents they describe.  ManifoldCF permits this situation, although 
-            when it occurs it is probably an accident.</p>
-        </section>
-        <section>
-          <title>Authorization domains</title>
-          <p></p>
-          <p>ManifoldCF supports a federated concept of a user.  The same user, for instance, may have one login name for FaceBook, another for Windows,
-            and yet another for Google.  We can describe this user as having three different authorization domains: "FaceBook", "Windows", and "Google".</p>
-          <p>In ManifoldCF, each authority understands user names or ids from one specific authorization domain.  This allows ManifoldCF to be configured
-            so that access tokens generated from multiple independent sources are amalgamated, even if the incoming user names differ from source to
-            source.</p>
-        </section>
-        <section>
-          <title>Authority groups</title>
-          <p></p>
-          <p>ManifoldCF groups authority connections together in groups, so that multiple authorities can furnish security for a single document.  An authority
-            group is nothing more than a name and a description that is referenced by authority connections that are part of that group, and is referenced also
-            by repository connections that wish to be secured by that group.  For most simple repositories, there is one authority group per authority.  But
-            repositories capable of federated security (e.g. SharePoint with Claim Space support) can use multiple authorities to describe security for a single
-            document.  Authority groups allow configuration of the appropriate many-to-many relationship for this situation.</p>
-        </section>
-      </section>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml b/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml
deleted file mode 100644
index 2cc1292..0000000
--- a/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml
+++ /dev/null
@@ -1,3143 +0,0 @@
-<?xml version="1.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.
--->
-
-<document>
-    <header><title>ManifoldCF- End-user Documentation</title></header>
-    <properties>
-    </properties>
-    <body>
-
-        <section id="overview">
-            <title>Overview</title>
-            <p>This manual is intended for an end-user of ManifoldCF.  It is assumed that the Framework has been properly installed, either by you or by a system integrator,
-                   with all required services running and desired connection types properly registered.  If you think you need to know how to do that yourself, please visit the "Developer Resources" page.
-            </p>
-            <p>Most of this manual describes how to use the ManifoldCF user interface.  On a standard ManifoldCF deployment, you would reach that interface by giving your browser
-                  a URL something like this: <code>http://my-server-name:8345/mcf-crawler-ui</code>.  This will, of course, differ from system to system.  Please contact your system administrator
-                  to find out what URL is appropriate for your environment.
-            </p>
-            <p>The ManifoldCF UI has been tested with Firefox and various incarnations of Internet Explorer.  If you use another browser, there is a small chance that the UI
-                  will not work properly.  Please let your system integrator know if you find any browser incompatibility problems.</p>
-            <p>When you enter the Framework user interface the first time, you will first be asked to log in:</p>
-            <br/><br/>
-            <figure src="images/en_US/login.PNG" alt="Login Screen" width="80%"/>
-            <br/><br/>
-            <p>Enter the login user name and password for your system.  By default, the user name is "admin" and the password is "admin", although your
-                  system administrator can (and should) change this.  Then, click the "Login" button.  If you entered the correct credentials, you should see a
-                  screen that looks something like this:</p>
-            <br/><br/>
-            <figure src="images/en_US/welcome-screen.PNG" alt="Welcome Screen" width="80%"/>
-            <br/><br/>
-            <p>On the left, there are menu options you can select.  The main pane on the right shows a welcome message, but depending on what you select on the left, the contents of the main pane
-                  will change.  Before you try to accomplish anything, please take a moment to read the descriptions below of the menu selections, and thus get an idea of how the Framework works
-                  as a whole.
-            </p>
-            <section id="outputs">
-                <title>Defining Output Connections</title>
-                <p>The Framework UI's left-side menu contains a link for listing output connections.  An output connection is a connection to a system or place where documents fetched from various
-                       repositories can be written to.  This is often a search engine.</p>
-                <p>All jobs must specify an output connection.  You can create an output connection by clicking the "List Output Connections" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-output-connections.PNG" alt="List Output Connections" width="80%"/>
-                <br/><br/>
-                <p>On a freshly created system, there may well be no existing output connections listed.  If there are already output connections, they will be listed on this screen, along with links that allow
-                      you to view, edit, or delete them.  To create a new output connection, click the "Add new output connection" link at the bottom.  The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-output-connection-name.PNG" alt="Add New Output Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your output connection.  Each tab allows you to edit a different characteristic of that connection.  The exact set of tabs you see
-                       depends on the connection type you choose for the connection.</p>
-                <p>Start by giving your connection a name and a description.  Remember that all output connection names must be unique, and cannot be changed after the connection is defined.  The name must be
-                       no more than 32 characters long.  The description can be up to 255 characters long.  When you are done, click on the "Type" tab.  The Type tab for the connection will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-output-connection-type.PNG" alt="Add New Output Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>The list of output connection types in the pulldown box, and what they are each called, is determined by your system integrator.  The configuration tabs for each different kind of output connection
-                       type are described in separate sections below.</p>
-                <p>After you choose an output connection type, click the "Continue" button at the bottom of the pane.  You will then see all the tabs appropriate for that kind of connection appear, and a
-                       "Save" button will also appear at the bottom of the pane.  You <b>must</b> click the "Save" button when you are done in order to create your connection.  If you click "Cancel" instead, the new connection
-                       will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>Every output connection has a "Throttling" tab.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/output-throttling.PNG" alt="Output Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify only one thing: how many open connections are allowed at any given time to the system the output connection talks with.  This restriction helps prevent
-                       that system from being overloaded, or in some cases exceeding its license limitations.  Conversely, making this number larger allows for greater overall throughput.  The default
-                       value is 10, which may not be optimal for all types of output connections.  Please refer to the section of the manual describing your output connection type for more precise
-                       recommendations.
-                </p>
-                <p>Please refer to the section of the manual describing your chosen output connection type for a description of the tabs appropriate for that connection type.</p>
-
-                <p>After you save your connection, a summary screen will be displayed that describes your connection's configuration.  This looks something like this (although the details will differ
-                      somewhat based on what connection type you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-output-connection.PNG" alt="View Output Connection" width="80%"/>
-                <br/><br/>
-                <p>The summary screen contains a line where the connection's status is displayed.  If you did everything correctly, the message "Connection working" will be displayed as a status.
-                      If there was a problem, you will see a connection-type-specific diagnostic message instead.  If this happens, you will need to correct the problem, by either fixing your infrastructure,
-                      or by editing the connection configuration appropriately, before the output connection will work correctly.</p>
-                <p>Also note that there are five buttons along the bottom of the display: "Refresh", "Edit", "Delete", "Re-index all associated documents", and "Remove all associated records".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Refresh" button simply reloads the view page for the output connection, and updates the connection status.  Use this button when you have made changes to the external system
-                      your output connection is connected to that might affect whether the connection will succeed or not.</p>
-                <p>The "Edit" button allows you to go back and edit the connection parameters.  Use this button if you want to change the connection's characteristics or specifications in any way.</p>
-                <p>The "Delete" button allows you to delete the connection.  Use this button if you no longer want the connection to remain in the available list of output connections.  Note that ManifoldCF
-                      will not allow you to delete a connection that is being referenced by a job.</p>
-                <p>The "Re-index all associated documents" button will nullify the recorded versions of all documents currently indexed via this connection.  This is not a button you would use often.  Click
-                      it when you have changed the configuration of whatever system the output connection is describing, and therefore all documents will eventually need to be reindexed.</p>
-                <p>The "Remove all associated documents" button will remove from ManifoldCF all knowledge that any indexing has taken place at all to this connection.  This is also not a button you would use
-                      often.  Click it when you have removed the entire index that the output connection describes from the target repository.</p>
-            </section>
-
-            <section id="transformations">
-                <title>Defining Transformation Connections</title>
-                <p>The Framework UI's left-side menu contains a link for listing transformation connections.  A transformation connection is a connection to an engine where documents fetched from various
-                       repositories can be manipulated.  This typically involves metadata extraction or mapping.</p>
-                <p>A job does not need to specify any transformation connections.  In many cases, the final destination search engine has an included data conversion pipeline.  But in the case
-                       where such data extraction and conversion is not available, ManifoldCF provides a way of taking care of it internally.</p>
-                <p>You can create a transformation connection by clicking the "List Transformation Connections" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-transformation-connections.PNG" alt="List Transformation Connections" width="80%"/>
-                <br/><br/>
-                <p>On a freshly created system, there may well be no existing transformation connections listed.  If there are already transformation connections, they will be listed on this screen, along with links that allow
-                      you to view, edit, or delete them.  To create a new transformation connection, click the "Add new transformation connection" link at the bottom.  The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-transformation-connection-name.PNG" alt="Add New Transformation Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your transformation connection.  Each tab allows you to edit a different characteristic of that connection.  The exact set of tabs you see
-                       depends on the connection type you choose for the connection.</p>
-                <p>Start by giving your connection a name and a description.  Remember that all transformation connection names must be unique, and cannot be changed after the connection is defined.  The name must be
-                       no more than 32 characters long.  The description can be up to 255 characters long.  When you are done, click on the "Type" tab.  The Type tab for the connection will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-transformation-connection-type.PNG" alt="Add New Transformation Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>The list of transformation connection types in the pulldown box, and what they are each called, is determined by your system integrator.  The configuration tabs for each different kind of transformation connection
-                       type are described in separate sections below.</p>
-                <p>After you choose a transformation connection type, click the "Continue" button at the bottom of the pane.  You will then see all the tabs appropriate for that kind of connection appear, and a
-                       "Save" button will also appear at the bottom of the pane.  You <b>must</b> click the "Save" button when you are done in order to create your connection.  If you click "Cancel" instead, the new connection
-                       will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>Every transformation connection has a "Throttling" tab.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/transformation-throttling.PNG" alt="Transformation Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify only one thing: how many open connections are allowed at any given time to the system the transformation connection talks with.  This restriction helps prevent
-                       that system from being overloaded, or in some cases exceeding its license limitations.  Conversely, making this number larger allows for greater overall throughput.  The default
-                       value is 10, which may not be optimal for all types of output connections.  Please refer to the section of the manual describing your transformation connection type for more precise
-                       recommendations.
-                </p>
-                <p>Please refer to the section of the manual describing your chosen transformation connection type for a description of the tabs appropriate for that connection type.</p>
-
-                <p>After you save your connection, a summary screen will be displayed that describes your connection's configuration.  This looks something like this (although the details will differ
-                      somewhat based on what connection type you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-transformation-connection.PNG" alt="View Transformation Connection" width="80%"/>
-                <br/><br/>
-                <p>The summary screen contains a line where the connection's status is displayed.  If you did everything correctly, the message "Connection working" will be displayed as a status.
-                      If there was a problem, you will see a connection-type-specific diagnostic message instead.  If this happens, you will need to correct the problem, by either fixing your infrastructure,
-                      or by editing the connection configuration appropriately, before the transformation connection will work correctly.</p>
-                <p>Also note that there are three buttons along the bottom of the display: "Refresh", "Edit", and "Delete".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Refresh" button simply reloads the view page for the transformation connection, and updates the connection status.  Use this button when you have made changes to the external system
-                      your transformation connection is connected to that might affect whether the connection will succeed or not.</p>
-                <p>The "Edit" button allows you to go back and edit the connection parameters.  Use this button if you want to change the connection's characteristics or specifications in any way.</p>
-                <p>The "Delete" button allows you to delete the connection.  Use this button if you no longer want the connection to remain in the available list of transformation connections.  Note that ManifoldCF
-                      will not allow you to delete a connection that is being referenced by a job.</p>
-            </section>
-
-            <section id="groups">
-                <title>Defining Authority Groups</title>
-                <p>The Framework UI's left-side menu contains a link for listing authority groups.  An authority group is a collection of authorities that all cooperate to furnish
-                      security for each document from repositories that you select.  For example, a SharePoint 2010 repository with the Claims Based authorization feature enabled may
-                      contain documents that are authorized by SharePoint itself, by Active Directory, and by others.  Documents from such a SharePoint
-                      repository would therefore refer to a authority group which would have a SharePoint native authority, a SharePoint Active Directory authority,
-                      and other SharePoint claims based authorities as members.  But most of the time, an authority group will consist of a single authority that is appropriate for
-                      the repository the authority group is meant to secure.</p>
-                <p>Since you need to select an authority group when you define an authority connection, you should define your authority groups <b>before</b> setting
-                      up your authority connections.  If you don't have any authority groups defined, you cannot create authority connections at all.  But if you select the
-                      wrong authority group when setting up your authority connection, you can go back later and change your selection.</p>
-                <p>It is also a good idea to define your authority groups before creating any repository connections, since each repository connection will also need to
-                      refer back to an authority group in order to secure documents.  While it is possible to change the relationship between a repository connection
-                       and its authority group after-the-fact, in practice such changes may cause many documents to be reindexed the next time an associated job is run.</p>
-                <p>You can create an authority group by clicking the "List Authority Groups" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-authority-groups.PNG" alt="List Authority Groups" width="80%"/>
-                <br/><br/>
-                <p>If there are already authority groups, they will be listed on this screen, along with links that allow you to view, edit, or delete them.  To create a new
-                      authority group, click the "Add a new authority group" link at the bottom.  The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-authority-group-name.PNG" alt="Add New Authority Group, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your authority group.  For authority groups, there is only ever one tab, the "Name" tab.</p>
-                <p>Give your authority group a name and a description.  Remember that all authority group names must be unique, and cannot be changed after the
-                      authority group is defined.  The name must be no more than 32 characters long.  The description can be up to 255 characters long.  When you are
-                      done, click on the "Save" button.  You <b>must</b> click the "Save" button when you are done in order to create or update your authority group.
-                      If you click "Cancel" instead, the new authority group will not be created.  (The same thing will happen if you click on any of the navigation links in
-                      the left-hand pane.)</p>
-                <p>After you save your authority group, a summary screen will be displayed that describes the group, and you can proceed on to create any authority
-                      connections that belong to the authority group, or repository connections that refer to the authority group.</p>
-
-            </section>
-
-            <section id="connections">
-                <title>Defining Repository Connections</title>
-                <p>The Framework UI's left-hand menu contains a link for listing repository connections.  A repository connection is a connection to the repository system that contains the documents
-                       that you are interested in indexing.</p>
-                <p>All jobs require you to specify a repository connection, because that is where they get their documents from.  It is therefore necessary to create a repository connection before
-                       indexing any documents.</p>
-                <p>A repository connection also may have an associated authority group.  This specified authority group determines the security environment in which documents
-                      from the repository connection are attached.  While it is possible to change the specified authority group for a repository connection after a crawl has been done,
-                      in practice this will require all documents associated with that repository connection be reindexed in order to be searchable by anyone.  Therefore, we recommend
-                      that you set up your desired authority group before defining your repository connection.</p>
-                <p>You can create a repository connection by clicking the "List Repository Connections" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-repository-connections.PNG" alt="List Repository Connections" width="80%"/>
-                <br/><br/>
-                <p>On a freshly created system, there may well be no existing repository connections listed.  If there are already repository connections, they will be listed on this
-                    screen, along with links that allow you to view, edit, or delete them.  To create a new repository connection, click the "Add a new connection" link at the bottom.
-                    The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-repository-connection-name.PNG" alt="Add New Repository Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your repository connection.  Each tab allows you to edit a different characteristic of that connection.  The exact set of tabs you see
-                       depends on the connection type you choose for the connection.</p>
-                <p>Start by giving your connection a name and a description.  Remember that all repository connection names must be unique, and cannot be changed after the connection is defined.  The name must be
-                       no more than 32 characters long.  The description can be up to 255 characters long.  When you are done, click on the "Type" tab.  The Type tab for the connection will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-repository-connection-type.PNG" alt="Add New Repository Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>The list of repository connection types in the pulldown box, and what they are each called, is determined by your system integrator.  The configuration tabs
-                      for each different kind of repository connection type are described in this document in separate sections below.</p>
-                <p>You may also at this point select the authority group to use to secure all documents fetched from this repository with.  You do not need to define your
-                      authority group's authority connections before doing this step, but you will not be able to search for your documents after indexing them until you do.</p>
-                <p>After you choose the desired repository connection type and an authority group (if desired), click the "Continue" button at the bottom of the pane.  You will
-                      then see all the tabs appropriate for that kind of connection appear, and a "Save" button will also appear at the bottom of the pane.  You <b>must</b> click
-                      the "Save" button when you are done in order to create or update your connection.  If you click "Cancel" instead, the new connection
-                      will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>Every repository connection has a "Throttling" tab.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/repository-throttling.PNG" alt="Repository Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify two things.  The first is how many open connections are allowed at any given time to the system the repository connection talks with.  This restriction helps prevent
-                       that system from being overloaded, or in some cases exceeding its license limitations.  Conversely, making this number larger allows for smaller average search latency.  The default
-                       value is 10, which may not be optimal for all types of repository connections.  Please refer to the section of the manual describing your authority connection type for more precise
-                       recommendations.  The second specifies how rapidly, on average, the crawler will fetch documents via this connection.
-                </p>
-                <p>Each connection type has its own notion of "throttling bin".  A throttling bin is the name of a resource whose access needs to be throttled.  For example, the Web connection type uses a
-                       document's server name as the throttling bin associated with the document, since (presumably) it will be access to each individual server that will need to be throttled independently.
-                </p>
-                <p>On the repository connection "Throttling" tab, you can specify an unrestricted number of throttling descriptions.  Each throttling description consists of a regular expression that describes
-                       a family of throttling bins, plus a helpful description, plus an average number of fetches per minute for each of the throttling bins that matches the regular expression.  If a given
-                       throttling bin matches more than one throttling description, the most conservative fetch rate is chosen.</p>
-                <p>The simplest regular expression you can use is the empty regular expression.  This will match all of the connection's throttle bins, and thus will allow you to specify a default
-                       throttling policy for the connection.  Set the desired average fetch rate, and click the "Add" button.  The throttling tab will then appear something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/repository-throttling-with-throttle.PNG" alt="Repository Connection Throttling With Throttle" width="80%"/>
-                <br/><br/>
-                <p>If no throttle descriptions are added, no fetch-rate throttling will be performed.</p>
-                <p>Please refer to the section of the manual describing your chosen repository connection type for a description of the tabs appropriate for that connection type.</p>
-
-                <p>After you save your connection, a summary screen will be displayed that describes your connection's configuration.  This looks something like this (although the details will differ
-                      somewhat based on what connection type you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-repository-connection.PNG" alt="View Repository Connection" width="80%"/>
-                <br/><br/>
-                <p>The summary screen contains a line where the connection's status is displayed.  If you did everything correctly, the message "Connection working" will be displayed as a status.
-                      If there was a problem, you will see a connection-type-specific diagnostic message instead.  If this happens, you will need to correct the problem, by either fixing your infrastructure,
-                      or by editing the connection configuration appropriately, before the repository connection will work correctly.</p>
-                <p>Also note that there are four buttons along the bottom of the display: "Refresh", "Edit", "Delete", and "Clear all related history".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Refresh" button simply reloads the view page for the repository connection, and updates the connection status.  Use this button when you have made changes to the external system
-                      your repository connection is connected to that might affect whether the connection will succeed or not.</p>
-                <p>The "Edit" button allows you to go back and edit the connection parameters.  Use this button if you want to change the connection's characteristics or specifications in any way.</p>
-                <p>The "Delete" button allows you to delete the connection.  Use this button if you no longer want the connection to remain in the available list of repository connections.  Note that ManifoldCF
-                      will not allow you to delete a connection that is being referenced by a job.</p>
-                <p>The "Clear all related history" button will remove all history data associated with the current repository connection.  This is not a button you would use often.  History data is used to construct
-                      reports, such as the "Simple History" report.  It is valuable as a diagnostic aid to understand what the crawler has been doing.  There is an automated way of configuring ManifoldCF to
-                      remove history that is older than a specified interval before the current time.  But if you want to remove all the history right away, this button will do that.</p>
-            </section>
-
-            <section id="notifications">
-                <title>Defining Notification Connections</title>
-                <p>The Framework UI's left-side menu contains a link for listing notification connections.  A notification connection is a connection to an engine that generates notification messages, such
-                      as email or text messages, specifically to note the end or unexpected termination of a job.</p>
-                <p>Jobs may specify one or more notification connections.  You can create a notification connection by clicking the "List Notification Connections" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-notification-connections.PNG" alt="List Notification Connections" width="80%"/>
-                <br/><br/>
-                <p>On a freshly created system, there may well be no existing notification connections listed.  If there are already notification connections, they will be listed on this screen, along with links that allow
-                      you to view, edit, or delete them.  To create a new notification connection, click the "Add new notification connection" link at the bottom.  The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-notification-connection-name.PNG" alt="Add New Notification Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your notification connection.  Each tab allows you to edit a different characteristic of that connection.  The exact set of tabs you see
-                       depends on the connection type you choose for the connection.</p>
-                <p>Start by giving your connection a name and a description.  Remember that all notification connection names must be unique, and cannot be changed after the connection is defined.  The name must be
-                       no more than 32 characters long.  The description can be up to 255 characters long.  When you are done, click on the "Type" tab.  The Type tab for the connection will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-notification-connection-type.PNG" alt="Add New Notification Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>The list of notification connection types in the pulldown box, and what they are each called, is determined by your system integrator.  The configuration tabs for each different kind of notification connection
-                       type are described in separate sections below.</p>
-                <p>After you choose a notification connection type, click the "Continue" button at the bottom of the pane.  You will then see all the tabs appropriate for that kind of connection appear, and a
-                       "Save" button will also appear at the bottom of the pane.  You <b>must</b> click the "Save" button when you are done in order to create your connection.  If you click "Cancel" instead, the new connection
-                       will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>Every notification connection has a "Throttling" tab.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/notification-throttling.PNG" alt="Notification Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify only one thing: how many open connections are allowed at any given time to the system the notification connection talks with.  This restriction helps prevent
-                       that system from being overloaded, or in some cases exceeding its license limitations.  Conversely, making this number larger allows for greater overall throughput.  The default
-                       value is 10, which may not be optimal for all types of notificaiton connections.  Please refer to the section of the manual describing your notification connection type for more precise
-                       recommendations.
-                </p>
-                <p>Please refer to the section of the manual describing your chosen notification connection type for a description of the tabs appropriate for that connection type.</p>
-
-                <p>After you save your connection, a summary screen will be displayed that describes your connection's configuration.  This looks something like this (although the details will differ
-                      somewhat based on what connection type you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-notification-connection.PNG" alt="View Notification Connection" width="80%"/>
-                <br/><br/>
-                <p>The summary screen contains a line where the connection's status is displayed.  If you did everything correctly, the message "Connection working" will be displayed as a status.
-                      If there was a problem, you will see a connection-type-specific diagnostic message instead.  If this happens, you will need to correct the problem, by either fixing your infrastructure,
-                      or by editing the connection configuration appropriately, before the output connection will work correctly.</p>
-                <p>Also note that there are three buttons along the bottom of the display: "Refresh", "Edit", and "Delete".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Refresh" button simply reloads the view page for the notification connection, and updates the connection status.  Use this button when you have made changes to the external system
-                      your output connection is connected to that might affect whether the connection will succeed or not.</p>
-                <p>The "Edit" button allows you to go back and edit the connection parameters.  Use this button if you want to change the connection's characteristics or specifications in any way.</p>
-                <p>The "Delete" button allows you to delete the connection.  Use this button if you no longer want the connection to remain in the available list of notification connections.  Note that ManifoldCF
-                      will not allow you to delete a connection that is being referenced by a job.</p>
-            </section>
-
-            <section id="mappers">
-                <title>Defining User Mapping Connections</title>
-                <p>The Framework UI's left-side menu contains a link for listing user mapping connections.  A user mapping connection is a connection to a system
-                      that understands how to map a user name into a different user name.  For example, if you want to enforce document security using LiveLink, but
-                      you have only an Active Directory user name, you will need to map the Active Directory user name to a corresponding LiveLink one, before finding
-                      access tokens for it using the LiveLink Authority.</p>
-                <p>Not all user mapping connections need to access other systems in order to be useful.  ManifoldCF, for instance, comes with a regular expression
-                      user mapper that manipulates a user name string using regular expressions alone.  Also, user mapping is not needed for many, if not most, authorities.
-                      You will not need any user mapping connections if the authorities that you intend to create can all operate using the same user name, and that user
-                      name is in the form that will be made available to ManifoldCF's authority servlet at search time.</p>
-                <p>You should define your mapping connections <b>before</b> setting up your authority connections.  An authority connections may specify a mapping
-                      connection that precedes it.  For the same reason, it's also convenient to define your mapping connections in the order that you want to process the
-                      user name.  If you don't manage to do this right the first time, though, there is no reason you cannot go back and fix things up.</p>
-                <p>You can create a mapping connection by clicking the "List User Mapping Connections" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-mapping-connections.PNG" alt="List User Mapping Connections" width="80%"/>
-                <br/><br/>
-                <p>On a freshly created system, there may well be no existing mapping connections listed.  If there are already mapping connections, they will be listed on this screen, along with links
-                       that allow you to view, edit, or delete them.  To create a new mapping connection, click the "Add a new connection" link at the bottom.  The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-mapping-connection-name.PNG" alt="Add New User Mapping Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your mapping connection.  Each tab allows you to edit a different characteristic of that connection.  The exact set of tabs you see
-                       depends on the connection type you choose for the connection.</p>
-                <p>Start by giving your connection a name and a description.  Remember that all mapping connection names must be unique, and cannot be changed after the connection is defined.  The name must be
-                       no more than 32 characters long.  The description can be up to 255 characters long.  When you are done, click on the "Type" tab.  The Type tab for the connection will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-mapping-connection-type.PNG" alt="Add New User Mapping Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>The list of mapping connection types in the pulldown box, and what they are each called, is determined by your system integrator.  The configuration tabs for each different kind of
-                       mapping connection type included with ManifoldCF are described in separate sections below.</p>
-                <p>After you choose a mapping connection type, click the "Continue" button at the bottom of the pane.  You will then see all the tabs appropriate for that kind of connection appear, and a
-                       "Save" button will also appear at the bottom of the pane.  You <b>must</b> click the "Save" button when you are done in order to create your connection.  If you click "Cancel" instead,
-                       the new connection will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>Every mapping connection has a "Prerequisites" tab.  This tab allows you to specify which mapping connection needs to be run before this one (if any).  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/mapping-prerequisites.PNG" alt="User Mapping Connection Prerequisites" width="80%"/>
-                <br/><br/>
-                <p>Note: It is very important that you do not specify prerequisites in such a way as to create a loop.  To make this easier, ManifoldCF will not display any user mapping connections in the pulldown
-                       which, if selected, would lead to a loop.</p>
-                <p>Every mapping connection has a "Throttling" tab.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/mapping-throttling.PNG" alt="User Mapping Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify only one thing: how many open connections are allowed at any given time to the system the mapping connection talks with.  This restriction helps prevent
-                       that system from being overloaded, or in some cases exceeding its license limitations.  Conversely, making this number larger allows for smaller average search latency.  The default
-                       value is 10, which may not be optimal for all types of mapping connections.  Please refer to the section of the manual describing your mapping connection type for more precise
-                       recommendations.
-                </p>
-                <p>Please refer to the section of the manual describing your chosen mapping connection type for a description of the tabs appropriate for that connection type.</p>
-
-                <p>After you save your connection, a summary screen will be displayed that describes your connection's configuration.  This looks something like this (although the details will differ
-                      somewhat based on what connection type you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-mapping-connection.PNG" alt="View Mapping Connection" width="80%"/>
-                <br/><br/>
-                <p>The summary screen contains a line where the connection's status is displayed.  If you did everything correctly, the message "Connection working" will be displayed as a status.
-                      If there was a problem, you will see a connection-type-specific diagnostic message instead.  If this happens, you will need to correct the problem, by either fixing your infrastructure,
-                      or by editing the connection configuration appropriately, before the mapping connection will work correctly.</p>
-                <p>Also note that there are three buttons along the bottom of the display: "Refresh", "Edit", and "Delete".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Refresh" button simply reloads the view page for the mapping connection, and updates the connection status.  Use this button when you have made changes to the external system
-                      your mapping connection is connected to that might affect whether the connection will succeed or not.</p>
-                <p>The "Edit" button allows you to go back and edit the connection parameters.  Use this button if you want to change the connection's characteristics or specifications in any way.</p>
-                <p>The "Delete" button allows you to delete the connection.  Use this button if you no longer want the connection to remain in the available list of mapping connections.  Note that ManifoldCF
-                      will not allow you to delete a connection that is being referenced by another mapping connection or an authority connection.</p>
-            </section>
-
-            <section id="authorities">
-                <title>Defining Authority Connections</title>
-                <p>The Framework UI's left-side menu contains a link for listing authority connections.  An authority connection is a connection to a system that defines a
-                      particular security environment.  For example, if you want to index some documents that are protected by Active Directory, you would need to configure
-                      an Active Directory authority connection.</p>
-                <p>Bear in mind that only specific authority connection types are compatible with a given repository connection type.  Read the details of your desired
-                      repository type in this document in order to understand how it is designed to be used.  You may not need an authority if you do not mind that portions
-                      of all the documents you want to index are visible to everyone.  For web, RSS, and Wiki crawling, this might be the situation.  Most other repositories
-                      have some native security mechanism, however.</p>
-                <p>You can create an authority connection by clicking the "List Authority Connections" link in the left-side navigation menu.  When you do this, the
-                       following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-authority-connections.PNG" alt="List Authority Connections" width="80%"/>
-                <br/><br/>
-                <p>On a freshly created system, there may well be no existing authority connections listed.  If there are already authority connections, they will be listed on this screen, along with links
-                       that allow you to view, edit, or delete them.  To create a new authority connection, click the "Add a new connection" link at the bottom.  The following screen will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-authority-connection-name.PNG" alt="Add New Authority Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>The tabs across the top each present a different view of your authority connection.  Each tab allows you to edit a different characteristic of that connection.  The exact set of tabs you see
-                       depends on the connection type you choose for the connection.</p>
-                <p>Start by giving your connection a name and a description.  Remember that all authority connection names must be unique, and cannot be changed after the connection is defined.  The name must be
-                       no more than 32 characters long.  The description can be up to 255 characters long.  When you are done, click on the "Type" tab.  The Type tab for the connection will then appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-authority-connection-type.PNG" alt="Add New Authority Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>The list of authority connection types in the pulldown box, and what they are each called, is determined by your system integrator.  The configuration tabs for
-                      each different kind of authority connection type are described in this document in separate sections below.</p>
-                <p>On this tab, you must also select the authority group that the authority connection you are creating belongs to.  Select the appropriate authority group from the
-                      pulldown.</p>
-                <p>You also have the option of selecting a non-default authorization domain.  An authorization domain describes which of possibly several user identities the
-                      authority connection is associated with.  For example, a single user may have an Active Directory identity, a LiveLink identity, and a FaceBook identity.
-                      Your authority connection will be appropriate to only one of those identities.  The list of specific authorization domains available is determined by your system
-                      integrator.</p>
-                <p>After you choose an authority connection type, the authority group, and optionally the authorization domain, click the "Continue" button at the bottom of the pane.
-                      You will then see all the tabs appropriate for that kind of connection appear, and a "Save" button will also appear at the bottom of the pane.  You <b>must</b>
-                      click the "Save" button when you are done in order to create your connection.  If you click "Cancel" instead, the new connection
-                      will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>Every authority connection has a "Prerequisites" tab.  This tab allows you to specify which mapping connection needs to be run before this one (if any).  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/authority-prerequisites.PNG" alt="Authority Connection Prerequisites" width="80%"/>
-                <br/><br/>
-                <p>Every authority connection also has a "Throttling" tab.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/authority-throttling.PNG" alt="Authority Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify only one thing: how many open connections are allowed at any given time to the system the authority connection talks with.  This restriction helps prevent
-                       that system from being overloaded, or in some cases exceeding its license limitations.  Conversely, making this number larger allows for smaller average search latency.  The default
-                       value is 10, which may not be optimal for all types of authority connections.  Please refer to the section of the manual describing your authority connection type for more precise
-                       recommendations.
-                </p>
-                <p>Please refer to the section of the manual describing your chosen authority connection type for a description of the tabs appropriate for that connection type.</p>
-
-                <p>After you save your connection, a summary screen will be displayed that describes your connection's configuration.  This looks something like this (although the details will differ
-                      somewhat based on what connection type you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-authority-connection.PNG" alt="View Authority Connection" width="80%"/>
-                <br/><br/>
-                <p>The summary screen contains a line where the connection's status is displayed.  If you did everything correctly, the message "Connection working" will be displayed as a status.
-                      If there was a problem, you will see a connection-type-specific diagnostic message instead.  If this happens, you will need to correct the problem, by either fixing your infrastructure,
-                      or by editing the connection configuration appropriately, before the authority connection will work correctly.</p>
-                <p>Also note that there are three buttons along the bottom of the display: "Refresh", "Edit", and "Delete".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Refresh" button simply reloads the view page for the authority connection, and updates the connection status.  Use this button when you have made changes to the external system
-                      your authority connection is connected to that might affect whether the connection will succeed or not.</p>
-                <p>The "Edit" button allows you to go back and edit the connection parameters.  Use this button if you want to change the connection's characteristics or specifications in any way.</p>
-                <p>The "Delete" button allows you to delete the connection.  Use this button if you no longer want the connection to remain in the available list of authority connections.</p>
-            </section>
-
-            <section id="jobs">
-                <title>Creating Jobs</title>
-                <p>A "job" in ManifoldCF is a description of a set of documents.  The Framework's job is to fetch this set of documents come from a specific repository connection,
-                       transform them using zero or more transformation connections, and
-                       send them to a specific output connection.  The repository connection that is associated with the job will determine exactly how this set of documents is described,
-                       and to some degree how they are indexed.  The output connection associated with the job can also affect how each document is indexed, as will any transformation
-                       connections that are specified.</p>
-                <p>Every job is expected to be run more than once.  Each time a job is run, it is responsible not only for sending new or changed documents to the output connection,
-                       but also for notifying the output connection of any documents that are no longer part of the set.  Note that there are two ways for a document to no longer be part
-                       of the included set of documents: Either the document may have been deleted from the repository, or the document may no longer be included in the allowed set
-                       of documents.  The Framework handles each case properly.</p>
-                <p>Deleting a job causes the output connection to be notified of deletion for all documents belonging to that job.  This makes sense because the job represents the set
-                       of documents, which would otherwise be orphaned when the job was removed.  (Some users make the assumption that a ManifoldCF job represents nothing more
-                       than a task, which is an incorrect assumption.)</p>
-                <p>Note that the Framework allows jobs that describe overlapping sets of documents to be defined.  Documents that exist in more than one job are treated in the
-                       following special ways:</p>
-                <ul>
-                    <li>When a job is deleted, the output connections are notified of deletion of documents belonging to that job only if they don't belong to another job</li>
-                    <li>The version of the document sent to an output connection depends on which job was run last</li>
-                </ul>
-                <p>The subtle logic of overlapping documents means that you probably want to avoid this situation entirely, if it is at all feasible.</p>
-                <p>A typical non-continuous run of a job has the following stages of execution:</p>
-                <ol>
-                    <li>Adding the job's new, changed, or deleted starting points to the queue ("seeding")</li>
-                    <li>Fetching documents, discovering new documents, and detecting deletions</li>
-                    <li>Removing no-longer-included documents from the queue</li>
-                </ol>
-                <p>Jobs can also be run "continuously", which means that the job never completes, unless it is aborted.  A continuous run has different stages of execution:</p>
-                <ol>
-                    <li>Adding the job's new, changed, or deleted starting points to the queue ("seeding")</li>
-                    <li>Fetching documents, discovering new documents, and detecting deletions, while reseeding periodically</li>
-                </ol>
-                <p>Note that continuous jobs <b>cannot</b> remove no-longer-included documents from the queue.  They can only remove documents that have been deleted from
-                     the repository.</p>
-                <p>A job can independently be configured to start when explicitly started by a user, or to run on a user-specified schedule.  If a job is set up to run on a schedule, it
-                       can be made to start only at the beginning of a schedule window, or to start again within any remaining schedule window when the previous job run completes.</p>
-                <p>There is no restriction in ManifoldCF as to how many jobs many running at any given time.</p>
-                <p>You create a job by first clicking on the "List All Jobs" link on the left-side menu.  The following screen will appear:</p>
-                <br/><br/>
-                <figure src="images/en_US/list-jobs.PNG" alt="List Jobs" width="80%"/>
-                <br/><br/>
-                <p>You may view, edit, or delete any existing jobs by clicking on the appropriate link.  You may also create a new job that is a copy of an existing job.  But to create
-                       a brand-new job, click the "Add a new job" link at the bottom.  You will then see the following page:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-job-name.PNG" alt="Add New Job, name tab" width="80%"/>
-                <br/><br/>
-                <p>Give your job a name.  Note that job names do <b>not</b> have to be unique, although it is probably less confusing to have a different name for each one.  Then,
-                       click the "Connection" tab:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-job-connection.PNG" alt="Add New Job, connection tab" width="80%"/>
-                <br/><br/>
-                <p>Now, you should select the repository connection name.  Bear in mind that whatever you select cannot be changed after the
-                       job is saved the first time.</p>
-                <p>Add an output, or more than one, by selecting the output in the pulldown, selecting the prerequisite pipeline stage, and clicking the "Add output" button.
-                      Note that once the job is saved the first time, you cannot delete an output.  But you can rearrange your document processing pipeline in most other ways whenever
-                      you want to, including adding or removing transformation connections.</p>
-                <p>If you do not have any transformation connections defined, you will not be given the option of inserting a transformation connection into the pipeline.  But if
-                       you have transformation connections defined, and you want to include them in the document pipeline, you can select them from the transformation connection
-                       pulldown, type a description into the description box, and then click one of the "Insert before" buttons to insert it into the document pipeline.</p>
-                <p>If you do not have any notification connections defined, you will not be given the option of adding one or more notifications to the end of the job.  But if
-                       you have notification connections defined, and you want to include them, you can select them from the notification connection
-                       pulldown, type a description into the description box, and then click the appropriate "Add" button to add it into the notification list.</p>
-                <p>You also have the opportunity to modify the job's priority and start method at this time.  The priority
-                       controls how important this job's documents are, relative to documents from any other job.  The higher the number, the more important it is considered for that job's
-                       documents to be fetched first.  The start method is as previously described; you get a choice of manual start, starting on the beginning of a scheduling window, or
-                       starting whenever possible within a scheduling window.</p>
-                <p>Make your selections, and click "Continue".  The rest of the job's tabs will now appear, and a
-                       "Save" button will also appear at the bottom of the pane.  You <b>must</b> click the "Save" button when you are done in order to create or update your job.  If
-                       you click "Cancel" instead, the new job will not be created.  (The same thing will happen if you click on any of the navigation links in the left-hand pane.)</p>
-                <p>All jobs have a "Scheduling" tab.  The scheduling tab allows you to set up schedule-related configuration information:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-job-scheduling.PNG" alt="Add New Job, scheduling tab" width="80%"/>
-                <br/><br/>
-                <p>On this tab, you can specify the following parameters:</p>
-                <ul>
-                    <li>Whether the job runs continuously, or scans every document once</li>
-                    <li>How long a document should remain alive before it is 'expired', and removed from the index</li>
-                    <li>The minimum interval before a document is re-checked, to see if it has changed</li>
-                    <li>The maximum interval before a document is re-checked, to see if it has changed</li>
-                    <li>How long to wait before reseeding initial documents</li>
-                </ul>
-                <br/>
-                <p>The last four parameters only make sense if a job is a continuously running one, as the UI indicates.</p>
-                <p>The other thing you can do on this time is to define an appropriate set of scheduling records.  Each scheduling record defines some related set of intervals during
-                       which the job can run.  The intervals are determined by the starting time (which is defined by the day of week, month, day, hour, and minute pulldowns), and the
-                       maximum run time in minutes, which determines when the interval ends.  It is, of course, possible to select multiple values for each of the pulldowns, in which case
-                       you be describing a starting time that had to match at least <b>one</b> of the selected values for <b>each</b> of the specified fields.</p>
-                <p>Once you have selected the schedule values you want, click the "Add Scheduled Time" button:</p>
-                <br/><br/>
-                <figure src="images/en_US/add-new-job-scheduling-with-record.PNG" alt="Add New Job, scheduling tab with record" width="80%"/>
-                <br/><br/>
-                <p>The example shows a schedule where crawls are run on Saturday and Sunday nights at 2 AM, and run for no more than 4 hours.</p>
-                <p>The rest of the job tabs depend on the types of the connections you selected.  Please refer to the section of the manual
-                       describing the appropriate connection types corresponding to your chosen repository and output connections for a description of the job tabs that will appear for
-                       those connections.</p>
-
-                <p>After you save your job, a summary screen will be displayed that describes your job's specification.  This looks something like this (although the details will differ
-                      somewhat based on what connections you chose):</p>
-                <br/><br/>
-                <figure src="images/en_US/view-job.PNG" alt="View Job" width="80%"/>
-                <br/><br/>
-                <p>Also note that there are four buttons along the bottom of the display: "Edit", "Delete", "Copy", and "Reset seeding".  We'll
-                      go into the purpose for each of these buttons in turn.</p>
-                <p>The "Edit" button allows you to go back and edit the job specification.  Use this button if you want to change the job's details in any way.</p>
-                <p>The "Delete" button allows you to delete the job.  Use this button if you no longer want the job to exist.  Note that when you delete a job in ManifoldCF, all
-                      documents that were indexed using that job are removed from the index.</p>
-                <p>The "Copy" button allows you to edit a copy of the current job.  Use this button if you want to create a new job that is based largely on the current job's specification.
-                      This can be helpful if you have many similar jobs to create.</p>
-                <p>The "Reset seeding" button will cause ManifoldCF to forget the seeding history of the job.  Seeding is the process of discovering documents that have been added
-                      or modified.  Clicking this button insures that ManifoldCF will examine all documents in the repository on the next crawl.  This is not something that is done frequently;
-                      ManifoldCF is pretty good at managing this information itself, and will automatically do the same thing whenever a job specification is changed.  Use this option if
-                      you've updated your connector software in a way that requires all documents to be re-examined.</p>
-            </section>
-
-            <section id="executing">
-                <title>Executing Jobs</title>
-                <p>You can follow what is going on, and control the execution of your jobs, by clicking on the "Status and Job Management" link on the left-side navigation menu.  When you do, you might
-                       see something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/job-status.PNG" alt="Job Status" width="80%"/>
-                <br/><br/>
-                <p>From here, you can click the "Refresh" link at the bottom of the main pane to see an updated status display, or you can directly control the job using the links in the leftmost
-                       status column.  Allowed actions you may see at one point or another include:</p>
-                <ul>
-                    <li>Start (start the job)</li>
-                    <li>Start minimal (start the job, but do only the minimal work possible)</li>
-                    <li>Abort(abort the job)</li>
-                    <li>Pause (pause the job)</li>
-                    <li>Resume (resume the job)</li>
-                    <li>Restart (equivalent to aborting the job, and starting it all over again)</li>
-                    <li>Restart minimal (equivalent to aborting the job, and starting it all over again, doing only the minimal work possible)</li>
-                </ul>
-                <br/>
-                <p>The columns "Documents", "Active", and "Processed" have very specific means as far as documents in the job's queue are concerned.  The "Documents" column counts all the documents
-                       that belong to the job.  The "Active" column counts all of the documents for that job that are queued up for processing.  The "Processed" column counts all documents that are on the
-                       queue for the job that have been processed at least once in the past.</p>
-                <p>Using the "minimal" variant of the listed actions will perform the minimum possible amount of work, given the model that the connection type for the job uses.  In some
-                       cases, this will mean that additions and modifications are indexed, but deletions are not detected.  A complete job run is usually necessary to fully synchronize the target
-                       index with the repository contents.</p>
-            </section>
-            <section id="statusreports">
-                <title>Status Reports</title>
-                <p>Every job in ManifoldCF describes a set of documents.  A reference to each document in the set is kept in a job-specific queue.  It is sometimes valuable for
-                       diagnostic reasons to examine this queue for information.  The Framework UI has several canned reports which do just that.</p>
-                <p>Each status report allows you to select what documents you are interested in from a job's queue based on the following information:</p>
-                <ul>
-                    <li>The job</li>
-                    <li>The document identifier</li>
-                    <li>The document's status and state</li>
-                    <li>When the document is scheduled to be processed next</li>
-                </ul>
-                <section id="documentstatus">
-                    <title>Document Status</title>
-                    <p>A document status report simply lists all matching documents from within the queue, along with their state, status, and planned future activity.  You might use this report if you were
-                           trying to figure out (for example) whether a specific document had been processed yet during a job run.</p>
-                    <p>Click on the "Document Status" link on the left-hand menu.  You will see a screen that looks something like this:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/document-status-select-connection.PNG" alt="Document Status, select connection" width="80%"/>
-                    <br/><br/>
-                    <p>Select the desired connection.  You may also select the desired document state and status, as well as specify a regular expression for the document identifier, if you want.  Then,
-                           click the "Continue" button:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/document-status-select-job.PNG" alt="Document Status, select job" width="80%"/>
-                    <br/><br/>
-                    <p>Select the job whose documents you want to see, and click "Continue" once again.  The results will display:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/document-status-example.PNG" alt="Document Status, example" width="80%"/>
-                    <br/><br/>
-                    <p>You may alter the criteria, and click "Go" again, if you so choose.  Or, you can alter the number of result rows displayed at a time, and click "Go" to redisplay.  Finally, you can page
-                           up and down through the results using the "Prev" and "Next" links.</p>
-                </section>
-                <section id="queuestatus">
-                    <title>Queue Status</title>
-                    <p>A queue status report is an aggregate report that counts the number of occurrences of documents in specified classes.  The classes are specified as a grouping within a regular
-                           expression, which is matched against all specified document identifiers.  The results that are displayed are counts of documents.  There will be a column for each combination of
-                           document state and status.</p>
-                    <p>For example, a class specification of "()" will produce exactly one result row, and will provide a count of documents that are in each state/status combination.  A class description
-                           of "(.*)", on the other hand, will create one row for each document identifier, and will put a "1" in the column representing state and status of that document, with a "0" in all other
-                           column positions.</p>
-                    <p>Click the "Queue Status" link on the left-hand menu.  You will see a screen that looks like this:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/queue-status-select-connection.PNG" alt="Queue Status, select connection" width="80%"/>
-                    <br/><br/>
-                    <p>Select the desired connection.  You may also select the desired document state and status, as well as specify a regular expression for the document identifier, if you want.  You
-                           will probably want to change the document identifier class from its default value of "(.*)".  Then, click the "Continue" button:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/queue-status-select-job.PNG" alt="Queue Status, select job" width="80%"/>
-                    <br/><br/>
-                    <p>Select the job whose documents you want to see, and click "Continue" once again.  The results will display:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/queue-status-example.PNG" alt="Queue Status, example" width="80%"/>
-                    <br/><br/>
-                    <p>You may alter the criteria, and click "Go" again, if you so choose.  Or, you can alter the number of result rows displayed at a time, and click "Go" to redisplay.  Finally, you can page
-                           up and down through the results using the "Prev" and "Next" links.</p>
-
-                </section>
-            </section>
-            <section id="historyreports">
-                <title>History Reports</title>
-                <p>For every repository connection, ManifoldCF keeps a history of what has taken place involving that connection.  This history includes both events that the
-                       framework itself logs, as well as events that a repository connection or output connection will log.  These individual events are categorized by "activity type".  Some of the kinds of
-                       activity types that exist are:</p>
-                <ul>
-                    <li>Job start</li>
-                    <li>Job end</li>
-                    <li>Job abort</li>
-                    <li>Various connection-type-specific read or access operations</li>
-                    <li>Various connection-type-specific output or indexing operations</li>
-                </ul>
-                <p>This history can be enormously helpful in understand how your system is behaving, and whether or not it is working properly.  For this reason, the Framework UI has the ability to
-                       generate several canned reports which query this history data and display the results.</p>
-                <p>All history reports allow you to specify what history records you are interested in including.  These records are selected using the following criteria:</p>
-                <ul>
-                    <li>The repository connection name</li>
-                    <li>The activity type(s) desired</li>
-                    <li>The start time desired</li>
-                    <li>The end time desired</li>
-                    <li>The identifier(s) involved, specified as a regular expression</li>
-                    <li>The result(s) produced, specified as a regular expression</li>
-                </ul>
-                <p>The actual reports available are designed to be useful for diagnosing both access issues, and performance issues.  See below for a summary of the types available.</p>
-                <section id="simplehistory">
-                    <title>Simple History Reports</title>
-                    <p>As the name suggests, a simple history report does not attempt to aggregate any data, but instead just lists matching records from the repository connection's history.
-                           These records are initially presented in most-recent-first order, and include columns for the start and end time of the event, the kind of activity represented by the event,
-                           the identifier involved, the number of bytes involved, and the results of the event.  Once displayed, you may choose to display more or less data, or reorder the display by column, or page through the data.</p>
-                    <p>To get started, click on the "Simple History" link on the left-hand menu.  You will see a screen that looks like this:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/simple-history-select-connection.PNG" alt="Simple History Report, select connection" width="80%"/>
-                    <br/><br/>
-                    <p>Now, select the desired repository connection from the pulldown in the upper left hand corner.  If you like, you can also change the specified date/time range, or specify an identifier
-                           regular expression or result code regular expression.  By default, the date/time range selects all events within the last hour, while the identifier regular expression and result code
-                           regular expression matches all identifiers and result codes.</p>
-                    <p>Next, click the "Continue" button.  A list of pertinent activities should then appear in a pulldown in the upper right:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/simple-history-select-activities.PNG" alt="Simple History Report, select activities" width="80%"/>
-                    <br/><br/>
-                    <p>You may select one or more activities that you would like a report on.  When you are done, click the "Go" button.  The results will appear, ordered by time, most recent event first:</p>
-                    <br/><br/>
-                    <figure src="images/en_US/simple-history-example.PNG" alt="Simple History Report, example" width="80%"/>
-                    <br/><br/>
-                    <p>You may alter the criteria, and click "Go" again, if you so choose.  Or, you can alter the number of result rows displayed at a time, and click "Go" to redisplay.  Finally, you can page
-                           up and down through the results using the "Prev" and "Next" links.</p>
-                    <p>Please bear in mind that the report redisplays whatever matches each time you click "Go".  So, if your time interval goes from an hour beforehand to "now", and you have activity
-                           happening, you will see different results each time "Go" is clicked.</p>
-                </section>
-                <section id="maxactivity">
-                    <title>Maximum Activity Reports</title>
-                    <p>A maximum activity report is an aggregate report used primarily to display the maximum rate that events occur within a specified time interval.  MHL</p>
-                </section>
-                <section id="maxbandwidth">
-                    <title>Maximum Bandwidth Reports</title>
-                    <p>A maximum bandwidth report is an aggregate report used primarily to display the maximum byte rate that pertains to events occurring within a specified time interval.  MHL</p>
-                </section>
-                <section id="resulthistogram">
-                    <title>Result Histogram Reports</title>
-                    <p>A result histogram report is an aggregate report is used to count the occurrences of each kind of matching result for all matching events.  MHL</p>
-                </section>
-            </section>
-
-            <section id="credentials">
-                <title>A Note About Credentials</title>
-                <p>If any of your selected connection types require credentials, you may find it necessary to approach your system administrator to obtain an appropriate set.  System administrators
-                       are often reluctant to provide accounts and credentials that have any more power than is utterly necessary, and sometimes not even that.  Great care has been taken in the
-                       development of all connection types to be sure they require no more privilege than is utterly necessary.  If a security-related warning appears when you view a connection's
-                       status, you must inform the system administrator that the credentials are inadequate to allow the connection to accomplish its task, and work with him/her to correct the problem.
-                </p>
-            </section>
-
-        </section>
-
-        <section id="outputconnectiontypes">
-            <title>Output Connection Types</title>
-
-            <section id="amazoncloudsearchoutputconnector">
-                <title>Amazon Cloud Search Output Connection</title>
-                <p>The Amazon Cloud Search output connection type send documents to a specific path within a specified Amazon Cloud Search instance.  The
-                      connection type furthermore "batches" documents to reduce cost as much as is reasonable.  As a result, some specified documents may be sent at the
-                      end of a job run, rather than at the time they would typically be indexed.</p>
-                <p>The connection configuration information for the Amazon Cloud Search Output Connection type includes one additional tab: the "Server" tab.
-                      This tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/amazon-configure-server.PNG" alt="Amazon Output Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>You must supply the "Server host" field in order for the connection to work.</p>
-                <p>The Amazon Cloud Search Output Connection type does not contribute any tabs to a job definition.</p>
-                <p>The Amazon Cloud Search Output Connection type can only accept text content that is encoded in a UTF-8-compatible manner.  It is highly
-                      recommended to use the Tika Content Extractor in the pipeline prior to the Amazon Cloud Search Output Connection type in order to
-                      convert documents to an indexable form.</p>
-                <p></p>
-                <p>In order to successfully index ManifoldCF documents in Amazon Cloud Search, you will need to describe a Cloud Search schema for
-                      receiving them.  The fields that the Amazon Cloud Search output connection type sends are those that it gets specifically from the document
-                      as it comes through the ManifoldCF pipeline, with the addition of two hard-wired fields: "f_bodytext", containing the document body content,
-                      and "document_uri", containing the document's URI.  You may also need to use the Metadata Adjuster transformation connection type to make
-                      sure that document metadata sent to Amazon Cloud Search agree with the schema you have defined there.  Please refer to
-                      <a href="http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-index-fields.html">this document</a> for details of how to set up an Amazon Cloud Search
-                      schema.</p>
-            </section>
-
-            <section id="elasticsearchoutputconnector">
-                <title>ElasticSearch Output Connection</title>
-                <p>The ElasticSearch Output Connection type allows ManifoldCF to submit documents to an ElasticSearch instance, via the XML over HTTP API. The connector has been designed
-            	to be as easy to use as possible.</p>
-                <p>After creating an ElasticSearch output connection, you have to populate the parameters tab. Fill in the fields according your ElasticSearch configuration. Each
-            	ElasticSearch output connector instance works with one index. To work with multiple indexes, just create one output connector for each index.</p>
-                <figure src="images/en_US/elasticsearch-connection-parameters.png" alt="ElasticSearch, parameters tab" width="80%"/>
-                <br />
-                <p>The parameters are:</p>
-                <ul>
-                      <li>Server location: An URL that references your ElasticSearch instance. The default value (http://localhost:9200) is valid if your ElasticSearch instance runs
-                          on the same server than the ManifoldCF instance.</li>
-                      <li>Index name: The connector will populate the index defined here.</li>
-                </ul>
-                <br /><p>Once you created a new job, having selected the ElasticSearch output connector, you will have the ElasticSearch tab. This tab let you:</p>
-                <ul>
-                      <li>Fix the maximum size of a document before deciding to index it. The value is in bytes. The default value is 16MB.</li>
-                      <li>The allowed mime types. Warning it does not work with all repository connectors.</li>
-                      <li>The allowed file extensions. Warning it does not work with all repository connectors.</li>
-                </ul>
-                <figure src="images/en_US/elasticsearch-job-parameters.png" alt="ElasticSearch, job parameters" width="80%"/>
-                <p>In the history report you will be able to monitor all the activites. The connector supports three activites: Document ingestion (Indexation), document deletion and
-                  index optimization. The targeted index is automatically optimized when the job is ending.</p>
-                <figure src="images/en_US/elasticsearch-history-report.png" alt="ElasticSearch, history report" width="80%"/>
-                <p>You may also refer to <a href="http://www.elasticsearch.org/guide">ElasticSearch's user documentation</a>.  Especially important is the
-                       need to configure the ElasticSearch index mapping <em>before</em> you try to index anything.  <strong>If you have not configured the ElasticSearch mapping properly, then the
-                       documents you send to ElasticSearch via ManifoldCF will not be parsed, and once you send a document to the index, you cannot fix this in ElasticSearch
-                       without discarding your index.</strong>  Specifically, you will want a mapping that enables the attachment plug-in, for example something like this:</p>
-                <source>
-{
-  "attachment" :
-  {
-    "properties" :
-    {
-      "file" :
-      {
-        "type" : "attachment",
-        "fields" :
-        {
-          "title" : { "store" : "yes" },
-          "keywords" : { "store" : "yes" },
-          "author" : { "store" : "yes" },
-          "content_type" : {"store" : "yes"},
-          "name" : {"store" : "yes"},
-          "date" : {"store" : "yes"},
-          "file" : { "term_vector":"with_positions_offsets", "store":"yes" }
-        }
-      }
-    }
-  }
-}
-                </source>
-                <p>Obviously, you would want your mapping to have details consistent with your particular indexing task.  You can change the mapping or inspect it using
-                       the <em>curl</em> tool, which you can download from <a href="http://curl.haxx.se">http://curl.haxx.se</a>.  For example, to inspect the mapping
-                       for a version of ElasticSearch running locally on port 9200:</p>
-                <source>
-curl -XGET http://localhost:9200/index/_mapping
-                </source>
-            </section>
-
-            <section id="filesystemoutputconnector">
-                <title>File System Output Connection</title>
-                <p>The File System output connection type allows ManifoldCF to store documents in a local filesystem, using the conventions established by the
-                    Unix utility called <em>wget</em>.  Documents stored by this connection type will not include any metadata or security information, but instead
-                    consist solely of a binary file.</p>
-                <p>The connection configuration information for the File System output connection type includes no additional tabs.  There is an additional job tab,
-                    however, called "Output Path".  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filesystem-job-output-path.PNG" alt="File System Specification, Output Path tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the path you want the connection type to use to write the documents to.  Then, click the "Save" button.</p>
-            </section>
-
-            <section id="hdfsoutputconnector">
-                <title>HDFS Output Connection</title>
-                <p>The HDFS output connection type allows ManifoldCF to store documents in HDFS, using the conventions established by the
-                    Unix utility called <em>wget</em>.  Documents stored by this connection type will not include any metadata or security information, but instead
-                    consist solely of a binary file.</p>
-                <p>The connection configuration information for the HDFS output connection type includes one additional tab: the "Server" tab.  This tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-configure-server.PNG" alt="HDFS Output Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the name node URI and the user name.  Both are required.</p>
-                <p>For the HDFS output connection type, there is an additional job tab called "Output Path".  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-job-output-path.PNG" alt="HDFS Output Specification, Output Path tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the path you want the connection type to use to write the documents to.  Then, click the "Save" button.</p>
-            </section>
-
-
-            <section id="gtsoutputconnector">
-                <title>MetaCarta GTS Output Connection</title>
-                <p>The MetaCarta GTS output connection type is designed to allow ManifoldCF to submit documents to an appropriate MetaCarta GTS search
-                       appliance, via the appliance's HTTP Ingestion API.</p>
-                <p>The connection type implicitly understands that GTS can only handle text, HTML, XML, RTF, PDF, and Microsoft Office documents.  All other document types will be
-                       considered to be unindexable.  This helps prevent jobs based on a GTS-type output connection from fetching data that is large, but of no particular relevance.</p>
-                <p>When you configure a job to use a GTS-type output connection, two additional tabs will be presented to the user: "Collections" and "Document Templates".  These
-                       tabs allow per-job specification of these GTS-specific features.</p>
-                <p>More here later</p>
-            </section>
-
-            <section id="nulloutputconnector">
-                <title>Null Output Connection</title>
-                <p>The null output connection type is meant primarily to function as an aid for people writing repository connection types.  It is not expected to be useful in practice.</p>
-                <p>The null output connection type simply logs indexing and deletion requests, and does nothing else.  It does not have any special configuration tabs, nor does it
-                       contribute tabs to jobs defined that use it.</p>
-            </section>
-
-            <section id="opensearchserveroutputconnector">
-                <title>OpenSearchServer Output Connection</title>
-                <p>The OpenSearchServer Output Connection allow ManifoldCF to submit documents to an OpenSearchServer instance, via the XML over HTTP API. The connector has been designed
-            	to be as easy to use as possible.</p>
-                <p>After creating an OpenSearchServer ouput connection, you have to populate the parameters tab. Fill in the fields according your OpenSearchServer configuration. Each
-            	OpenSearchServer output connector instance works with one index. To work with muliple indexes, just create one output connector for each index.</p>
-                <figure src="images/en_US/opensearchserver-connection-parameters.PNG" alt="OpenSearchServer, parameters tab" width="80%"/>
-                <p>The parameters are:</p><br/>
-                <ul>
-                      <li>Server location: An URL that references your OpenSearchServer instance. The default value (http://localhost:8080) is valid if your OpenSearchServer instance runs
-                          on the same server than the ManifoldCF instance.</li>
-                      <li>Index name: The connector will populate the index defined here.</li>
-                      <li>User name and API Key: The credentials required to connect to the OpenSearchServer instance. It can be left empty if no user has been created. The next figure shows
-                          where to find the user's informations in the OpenSearchServer user interface.</li>
-                </ul>
-                <figure src="images/en_US/opensearchserver-user.PNG" alt="OpenSearchServer, user configuration" width="80%"/>
-                <p>Once you created a new job, having selected the OpenSearchServer output connector, you will have the OpenSearchServer tab. This tab let you:</p><br/>
-                <ul>
-                      <li>Fix the maximum size of a document before deciding to index it. The value is in bytes. The default value is 16MB.</li>
-                      <li>The allowed mime types. Warning it does not work with all repository connectors.</li>
-                      <li>The allowed file extensions. Warning it does not work with all repository connectors.</li>
-                </ul>
-                <figure src="images/en_US/opensearchserver-job-parameters.PNG" alt="OpenSearchServer, job parameters" width="80%"/>
-                <p>In the history report you will be able to monitor all the activites. The connector supports three activites: Document ingestion (Indexation), document deletion and
-                    index optimization. The targeted index is automatically optimized when the job is ending.</p>
-                <figure src="images/en_US/opensearchserver-history-report.PNG" alt="OpenSearchServer, history report" width="80%"/>
-                <p>You may also refer to the <a href="http://www.open-search-server.com/documentation">OpenSearchServer's user documentation</a>.</p>
-            </section>
-
-            <section id="solroutputconnector">
-                <title>Solr Output Connection</title>
-                <p>The Solr output connection type is designed to allow ManifoldCF to submit documents to either an appropriate Apache Solr instance,
-                       via the Solr HTTP API, or alternatively to a Solr Cloud cluster.  The configuration parameters are initially set to appropriate default
-                       values for a stand-alone Solr instance.</p>
-                <p>When you create a Solr output connection, multiple configuration tabs appear.  The first tab is the "Solr type" tab.  Here you select
-                       whether you want your connection to communicate to a standalone Solr instance, or to a Solr Cloud cluster:</p>
-                <br/><br/>
-                <figure src="images/en_US/solr-configure-solr-type.PNG" alt="Solr Configuration, Solr type tab" width="80%"/>
-                <br/><br/>
-                <p>Select which kind of Solr installation you want to communicate with.  Based on your selection, you can proceed to either the "Server"
-                       tab (if a standalone instance) or to the "ZooKeeper" tab (if a SolrCloud cluster).</p>
-                <p>The "Server" tab allows you to configure the HTTP parameters appropriate for communicating with a standalone Solr instance:</p>
-                <br/><br/>
-                <figure src="images/en_US/solr-configure-server.PNG" alt="Solr Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>If your Solr setup is a standalone instance, fill in the fields according to your Solr configuration.  The Solr connection type supports
-                       only basic authentication at this time; if you have this enabled, supply the credentials as requested on the bottom part of the form.</p>
-                <p>The "Zookeeper" tab allows your to configure the connection type to communicate with a Solr Cloud cluster:</p>
-                <br/><br/>
-                <figure src="images/en_US/solr-configure-zookeeper.PNG" alt="Solr Configuration, Zookeeper tab" width="80%"/>
-                <br/><br/>
-                <p>Here, add each ZooKeeper instance in the SolrCloud cluster to the list of ZooKeeper instances.  The connection comes preconfigured with
-                       "localhost" as being a ZooKeeper instance.  You may delete this if it is not the case.</p>
-                <p>The next tab is the "Schema" tab, which allows you to specify the names of various Solr fields into which the Solr connection type will
-                       place built-in document metadata:</p>
-                <br/><br/>
-                <figure src="images/en_US/solr-configure-schema.PNG" alt="Solr Configuration, Schema tab" width="80%"/>
-                <br/><br/>
-                <p>The most important of these is the document identifier field, which MUST be present for the connection type to function.  This field will
-                       be used to uniquely identify the document within Solr, and will contain the document's URL.  The Solr connection type will treat this field as being
-                       a unique key for locating the indexed document for further modification or deletion.  The other Solr fields are optional, and largely self-
-                       explanatory.</p>
-                <p>The next tab is the "Arguments" tab, which allows you to specify arbitrary arguments to be sent to Solr:</p>
-                <br/><br/>
-                <figure src="images/en_US/solr-configure-arguments.PNG" alt="Solr Configuration, Arguments tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the argument name and value, and click the "Add" button.  Bear in mind that if you add an argument with the same name as an existing one, it will replace the
-                       existing one with the new specified value.  You can delete existing arguments by clicking the "Delete" button next to the argument you want to delete.</p>
-                <p>Use this tab to specify any and all desired Solr update request parameters.  You can, for instance, add
-                       <a href="http://wiki.apache.org/solr/UpdateRequestProcessor">update.chain=myChain</a> to select a specific document processing pipeline/chain to
-                       use for processing documents. See the Solr documentation for more valid arguments.</p>
-                <p>The next tab is the "Documents" tab, which allows you to do document filtering based on size and mime types. By specifying a maximum document
-                       length in bytes, you can filter out documents which exceed that size (e.g. 10485760 which is equivalent to 10 MB). If you only want to add
-                       documents with specific mime types, you can enter them into the "included mime types" field (e.g. "text/html" for filtering out all documents but HTML).
-                       The "excluded mime types" field is for excluding documents with specific mime types (e.g. "image/jpeg" for filtering out JPEG images). The tab looks like:</p>
-                <figure src="images/en_US/solr-configure-documents.PNG" alt="Solr Configuration, Documents tab" width="80%"/>
-                <br/><br/>
-                <p>The fifth tab is the "Commits" tab, which allows you to control the commit strategies. As well as committing documents at the end of every job, an
-                       option which is enabled by default, you may also commit each document within a certain time in milliseconds (e.g. "10000" for committing within
-                       10 seconds). The <a href="http://wiki.apache.org/solr/CommitWithin">commit within</a> strategy will leave the responsibility to Solr instead
-                       of ManifoldCF. The tab looks like:</p>
-                <figure src="images/en_US/solr-configure-commits.PNG" alt="Solr Configuration, Documents tab" width="80%"/>
-                <br/><br/>
-                <p>When you are done, don't forget to click the "Save" button to save your changes!  When you do, a connection summary and status screen will be
-                       presented, which may look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/solr-status.PNG" alt="Solr Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the Solr connection is not responding, which is leading to an error status message instead of "Connection working".</p>
-            </section>
-
-
-        </section>
-
-        <section id="transformationconnectiontypes">
-            <title>Transformation Connection Types</title>
-
-            <section id="alloweddocuments">
-                <title>Allowed Documents</title>
-                <p>The Allowed Documents transformation filter is used to limit the documents that will be fetched and passed down the pipeline for indexing.  The
-                      filter allows documents to be restricted by mime type, by extension, and by length.</p>
-                <p>It is important to note that these various methods of filtering rely on the upstream repository connection type to implement.  Some repository connection
-                      types do not implement all of the available methods of filtering.  For example, filtering by URL (and hence file extension) makes little sense in the
-                      context of a repository connection type whose URLs do not include a full file name.</p>
-                <p>As with all document transformers,  more than one Allowed Documents transformation filter can be used in a single pipeline.  This may be useful
-                      if other document transformers (such as the Tika Content Extractor, below) change the characteristics of the document being processed.</p>
-                <p>The Allowed Documents transformation connection type does not require anything other than standard configuration information.</p>
-                <p>The Allowed Documents transformation connection type contributes a single tab to a job definition.  This is the "Allowed Contents" tab, which looks
-                      like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/alloweddocuments-job-allowed-contents.PNG" alt="Allowed Documents specification, Allowed Contents tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the maximum desired document length, the set of extensions that are allowed, and the set of mime types that are allowed.  All extensions and
-                      mime types are case insensitive.  For extensions, the special value "." matches a missing or empty extension.</p>
-            </section>
-
-            <section id="metadataadjuster">
-                <title>Metadata Adjuster</title>
-                <p>The Metadata Adjuster transformation filter reorganizes and concatenates metadata based on rules that you provide.
-                      This can be very helpful in many contexts.  For example, you might use the Metadata Adjuster to label all documents from a particular job with a
-                      particular tag in an index.  Or, you might need to map metadata from (say) SharePoint's schema to your final output connection type's schema.
-                      The Metadata Adjuster permits you to handle both of the scenarios.</p>
-                <p>As with all document transformers,  more than one Metadata Adjuster transformation filter can be used in a single pipeline.  This may be useful
-                      if other document transformers (such as the Tika Content Extractor, below) change the metadata of the document being processed.</p>
-                <p>The Metadata Adjuster transformation connection type does not require anything other than standard configuration information.</p>
-                <p>The Metadata Adjuster transformation connection type contributes one tab to a job definition.  This is the "Metadata expressions" tab.
-                      The "Metadata expressions" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/metadataadjuster-job-expressions-metadata.PNG" alt="Metadata Adjuster specification, Metadata Expressions tab" width="80%"/>
-                <br/><br/>
-                <p>On the left, you must supply the target metadata name.  You may then choose among two possibilities: either you choose to request that this metadata
-                      field be removed from the target document, or you can choose to specify a rule that would provide a value for that target metadata item.  You can
-                      provide more than one rule for the same metadata item, by simply adding additional lines to the table with the same target metadata name.  But if you specify
-                      a rule to remove the metadata field from the document, that selection overrides all others.</p>
-                <p>Metadata rules are just strings, which may have field specifications within them.  For example, the rule value "hello" will generate a single-valued metadata
-                      field with the value "hello".  The rule "hello ${there}", on the other hand, will generate a value for each value in the incoming field  named "there". If the incoming
-                      field had the values "a", "b", and "c", then the rule would generate a three-valued field with values "hello a", "hello b", and "hello c".  If more than one incoming
-                      field is specified, then a combinatoric combination of the field values will be produced.</p>
-                <p>You can also use regular expressions in the substitution string, for example: "${there|[0-9]*}", which will extract the first sequence of sequential numbers it finds in the
-                      value of the field "there", or "${there|string(.*)|1}", which will include everything following "string" in the field value.  (The third argument specifies the regular
-                      expression group number, with an optional suffix of "l" or "u" meaning upper-case or lower-case.)</p>
-                <p>Enter a parameter name, and either select to remove the value or provide an expression.  If you chose to supply an expression, enter the expression in the box.
-                      Then, click the "Add" button.</p>
-                <p>When your expressions have been edited, you can uncheck the "Keep all metadata"
-                      checkbox in order to prevent unspecified metadata fields from being passed through.  Uncheck the "Remove empty metadata values" checkbox if you
-                      want to index empty metadata values.</p>
-            </section>
-
-            <section id="nulltransformer">
-                <title>Null Transformer</title>
-                <p>The null transformer does nothing other than record activity through the transformer.  It is thus useful primarily as a coding model, and a diagnostic
-                      aid.  It requires no non-standard configuration information, and provides no tabs for a job that includes it.</p>
-            </section>
-
-            <section id="tikaextractor">
-                <title>Tika Content Extractor</title>
-                <p>The Tika Content Extractor transformation filter converts a binary document into a UTF-8 text stream, plus metadata.  This transformation filter
-                      is used primarily when incoming binary content is a possibility, or content that is not binary but has a non-standard encoding such as Shift-JIS.
-                      The Tika Content Extractor extracts metadata from the incoming stream as well.  This metadata can be mapped within the Tika Content Extractor
-                      to metadata field names appropriate for further use downstream in the pipeline.</p>
-                <p>As with all document transformers,  more than one Tika Content Extractor transformation filter can be used in a single pipeline.  In the case
-                      of the Tika Content Extractor, this does not seem to be of much utility.</p>
-                <p>The Tika Content Extractor transformation connection type does not require anything other than standard configuration information.</p>
-                <p>The Tika Content Extractor transformation connection type contributes three tabs to a job definition.  These are the "Field mapping" tab, the "Exceptions" tab,
-                      and the "Boilerplate" tab.  The "Field mapping" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/tika-job-field-mapping.PNG" alt="Tika Content Extractor specification, Field Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>Enter a Tika-generated metadata field name, and a final field name, and click the "Add" button to add the mapping to the list.  Uncheck the
-                      "Keep all metadata" checkbox if you want unspecified Tika metadata to be excluded from the final document.</p>
-                <p>The "Exceptions" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/tika-job-exceptions.PNG" alt="Tika Content Extractor specification, Exceptions tab" width="80%"/>
-                <br/><br/>
-                <p>Uncheck the checkbox to allow indexing of document metadata even when Tika fails to extract content from the document.</p>
-                <p>The "Boilerplate" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/tika-job-boilerplate.PNG" alt="Tika Content Extractor specification, Boilerplate tab" width="80%"/>
-                <br/><br/>
-                <p>Select the HTML boilerplate removal option you want.  These are implementations provided by the "Boilerpipe" project; they are lightly documented,
-                      so you will need to experiment with your particular application to find the one most appropriate for your application.</p>
-            </section>
-
-        </section>
-
-        <section id="mappingconnectiontypes">
-            <title>User Mapping Connection Types</title>
-
-            <section id="regexpmapper">
-                <title>Regular Expression User Mapping Connection</title>
-                <p>The Regular Expression user mapping connection type is very helpful for rote user name conversions of all sorts.  For example, it can easily be configured to map the standard "user@domain" form
-                       of an Active Directory user name to (say) a LiveLink equivalent, e.g. "domain\user".  Since many repositories establish such rote conversions, the Regular Expression user mapping connection
-                       type is often all that you will ever need.</p>
-                <br/>
-                <p>A Regular Expression user mapping connection type has one special tab in the user mapping connection editing screen: "User Mapping".  This
-                       tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/regexp-mapping-user-mapping.PNG" alt="Regexp User Mapping, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>The mapping consists of a match expression, which is a regular expression where parentheses ("(" and ")") mark sections you are interested in, and a
-                       replace string.  The sections marked with parentheses are called "groups" in regular expression parlance.  The replace string consists of constant text plus
-                       substitutions of the groups from the match, perhaps modified.  For example, "$(1)" refers to the first group within the match, while "$(1l)" refers to the first
-                       match group mapped to lower case.  Similarly, "$(1u)" refers to the same characters, but mapped to upper case.</p>
-                <p>For example, a match expression of <code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code> with a replace string of <code>$(2)\$(1l)</code> would convert
-                      an Active Directory username of <code>MyUserName@subdomain.domain.com</code> into the user name
-                      <code>subdomain\myusername</code>.</p>
-                <p>When you are done, click the "Save" button.  When you do, a connection summary and status screen will be presented, which may look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/regexp-mapping-status.PNG" alt="Regexp User Mapping Status" width="80%"/>
-                <br/><br/>
-            </section>
-        </section>
-
-        <section id="authorityconnectiontypes">
-            <title>Authority Connection Types</title>
-
-            <section id="adauthority">
-                <title>Active Directory Authority Connection</title>
-                <p>An active directory authority connection is essential for enforcing security for documents from Windows shares, Microsoft SharePoint (in ActiveDirectory mode), and IBM FileNet repositories.
-                       This connection type needs to be provided with information about how to log into an appropriate Windows domain controller, with a user that has sufficient privileges to
-                       be able to look up any user's ID and group relationships.</p>
-                <br/>
-                <p>An Active Directory authority connection type has two special tabs in the authority connection editing screen: "Domain Controller", and "Cache".  The "Domain Controller"
-                       tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/ad-configure-dc.PNG" alt="AD Configuration, Domain Controller tab" width="80%"/>
-                <br/><br/>
-                <p>As you can see, the Active Directory authority allows you to configure multiple connections to different, but presumably related, domain controllers.  The choice of
-                       which domain controller will be accessed is determined by traversing the list of configured domain controllers from top to bottom, and finding the first one that
-                       matches the domain suffix field specified.  Note that a blank value for the domain suffix will match <strong>all</strong> users.</p>
-                <p>To add a domain controller to the end of the list, fill in the requested values.  Note that the "Administrative user name" field usually requires no domain suffix, but
-                       depending on the details of how the domain controller is configured, may sometimes only accept the "name@domain" format.  When you have completed your
-                       entry, click the "Add to end" button to add the domain controller rule to the end of the list.  Later, when other domain controllers are present in the list, you can
-                       click a different button at an appropriate spot to insert the domain controller record into the list where you want it to go.</p>
-                <p>The Active Directory authority connection type also has a "Cache" tab, for managing the caching of individual user responses:</p>
-                <br/><br/>
-                <figure src="images/en_US/ad-configure-cache.PNG" alt="AD Configuration, Cache tab" width="80%"/>
-                <br/><br/>
-                <p>Here you can control how many individual users will be cached, and for how long.</p>
-                <p>When you are done, click the "Save" button.  When you do, a connection summary and status screen will be presented, which may look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/ad-status.PNG" alt="AD Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the Active Directory connection is not responding, which is leading to an error status message instead of "Connection working".</p>
-            </section>
-
-            <section id="alfrescowebscriptauthority">
-                <title>Alfresco Webscript Authority Connection</title>
-                <p>The Alfresco Webscript authority connection type helps secure documents indexed using the Alfresco Webscript repository connection type.</p>
-                <p>Independently of how the permissions schema is finally configured within the Alfresco instance, the Alfresco Webscript Autorithy service can retrieve the ACLs tokens associated to the users
-                  at request time. The connector is based on a single, secured service that directly enquires the Alfresco instance for the users permissions at all levels. The permissions tokens returned will be
-                  consistent with the Alfresco permissions model, therefore this Authority Connector makes sense to work only with the Alfresco Webscript Repository Connector and not any other connector</p>
-                <p>IMPORTANT: in order to put available the required services within Alfresco, it is necessary FIRST to install and deploy within the Alfresco instance the
-                  following <a href="https://github.com/maoo/alfresco-indexer">Alfresco Webscript</a> </p>. Please follow the instructions in the README file.
-                <p>The Alfresco Webscript Authority Connection has a single configuration tab in the authority connection editing screen called "Server" where one needs to configure the Alfresco's services endpoint:</p>
-                <br/><br/>
-                <figure src="images/en_US/alfresco-authority.png" alt="Alfresco Server Endpoint Configuration" width="80%"/>
-                <br/><br/>
-                <p>As you can see, the Alfresco endpoint settings are quite simple and almost self-explicative:</p>
-                <ul>
-                  <li><strong>Protocol:</strong> HTTP or HTTPS depending on your instance</li>
-                  <li><strong>HostName:</strong> IP or domain where the Alfresco instance is hosted in your network</li>
-                  <li><strong>Port:</strong> port where the Alfresco instance has been deployed</li>
-                  <li><strong>Context:</strong> URL path where the webscript services has been deployed (/alfresco/service by default) after installed the WebScript</li>
-                  <li><strong>User:</strong> user ID used for performing the authored request to Alfresco. The user MUST have enough privileges for consulting any other user permissions, therefore admin user used to be a good idea</li>
-                  <li><strong>Password:</strong> password of the above user in Alfresco</li>
-                </ul>
-            </section>
-
-            <section id="cmisauthority">
-              <title>CMIS Authority Connection</title>
-              <p>A CMIS authority connection is required for enforcing security for documents retrieved from CMIS repositories.</p>
-              <p>The CMIS specification includes the concept of authorities only depending on a specific document, this authority connector is only based on a regular expression comparator.</p>
-              <p>A CMIS authority connection has the following special tab that you will need to configure: the "Repository" tab. The "Repository" tab looks like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/cmis-authority-connection-configuration-repository.png" alt="CMIS Authority, Repository configuration" width="80%"/>
-              <br/><br/>
-              <p>The repository configuration will be only used to track an ID for a specific CMIS repository. No calls will be performed against the CMIS repository.</p>
-              <p>When you are done, click the "Save" button.  You will then see a summary and status for the authority connection:</p>
-              <br/><br/>
-              <figure src="images/en_US/cmis-authority-connection-configuration-save.png" alt="CMIS Authority, saving configuration" width="80%"/>
-              <br/><br/>
-            </section>
-
-            <section id="documentumauthority">
-                <title>EMC Documentum Authority Connection</title>
-                <p>A Documentum authority connection is required for enforcing security for documents retrieved from Documentum repositories.</p>
-                <p>This connection type needs to be provided with information about what Content Server to connect to, and the credentials that should be used to retrieve a user's ACLs from that machine.
-                    In addition, you can also specify whether or not you wish to include auto-generated ACLs in every user's list.  Auto-generated ACLs are created within Documentum for every folder
-                    object.  Because there are often a very large number of folders, including these ACLs can bloat the number of ManifoldCF access tokens returned for a user to tens of thousands, which can negatively
-                    impact perfomance.  Even more notably, few Documentum installations make any real use of these ACLs in any way.  Since Documentum's ACLs are purely additive (that is, there are no
-                    mechanisms for 'deny' semantics), the impact of a missing ACLs is only to block a user from seeing something they otherwise could see.  It is thus safe, and often desirable, to simply ignore the
-                    existence of these auto-generated ACLs.</p>
-                <p>A Documentum authority connection has three special tabs you will need to configure: the "Docbase" tab, the "User Mapping" tab, and the "System ACLs" tab.</p>
-                <p>The "Docbase" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-authority-docbase.PNG" alt="Documentum Authority, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the desired Content Server docbase name, and enter the appropriate credentials.  You may leave the "Domain" field blank if the Content Server you specify does not have
-                    Active Directory support enabled.</p>
-                <p>The purpose of the User Mapping tab is to control whether user lookups in Documentum are case sensitive or not.  The "User Mapping" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-authority-user-mapping.PNG" alt="Documentum Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>Here you can specify whether the mapping between incoming user names and Content Server user names is case sensitive or case insensitive.  No other mappings
-                    are currently permitted.  Typically, Documentum instances operate in conjunction with Active Directory, such that Documentum user names are either the same as the Active Directory user names,
-                    or are the Active Directory user names mapped to all lower case characters.  You may need to consult with your Documentum system administrator to decide what the correct setting should be for
-                    this option.</p>
-                <p>The "System ACLs" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-authority-system-acls.PNG" alt="Documentum Authority, System ACLs tab" width="80%"/>
-                <br/><br/>
-                <p>Here, you can choose to ignore all auto-generated ACLs associated with a user.  We recommend that you try ignoring such ACLs, and only choose the default if you have
-                    reason to believe that your Documentum content is protected in a significant way by the use of auto-generated ACLs.  Your may need to consult with your Documentum system administrator to
-                    decide what the proper setting should be for this option.</p>
-                <p>When you are done, click the "Save" button.  When you do, a connection summary and status screen will be presented:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-authority-status.PNG" alt="Documentum Authority Status" width="80%"/>
-                <br/><br/>
-                <p>Pay careful attention to the status, and be prepared to correct any
-                    problems that are displayed.</p>
-            </section>
-
-             <section id="genericauthority">
-              <title>Generic Authority</title>
-              <p>Generic authority is intended to be used with Generic Connector and provide authentication tokens based on generic API. The idea is that you can use it and implement only the API which is designed
-                  to be fine grained and as simple as it is possible to handle all tasks.</p>
-              <p>API should be implemented as xml web page (entry point) returning results based on provided GET params. It may be a simple server script or part of the bigger application.
-                  API can be secured with HTTP basic authentication.</p>
-              <br/>
-              <p>There are 2 actions:</p>
-              <ul>
-                <li>check</li>
-                <li>auth</li>
-              </ul>
-              <p>Action is passed as "action" GET param to the entrypoint.</p>
-              <br/><br/>
-              <p><b>[entrypoint]?action=check</b></p>
-              <p>Should return HTTP status code 200 providing information that entrypoint is working properly. Any content returned will be ignored, only the status code matters.</p>
-              <br/><br/>
-
-              <p><b>[entrypoint]?action=auth&amp;username=UserName@Domain</b></p>
-              <p>Parameters:</p>
-              <ul>
-                <li>username - name of the user we want to resolve and fetch tokens.</li>
-              </ul>
-              <p>Result should be valid XML of form:</p>
-              <source>
-&lt;auth exists="true|false"&gt;
-   &lt;token&gt;token_1&lt;/token&gt;;
-   &lt;token&gt;token_2&lt;/token&gt;;
-   ...
-&lt;/auth&gt;
-              </source>
-              <p><code>exists</code> attribute is required and it carries information whether user is valid or not.</p>
-              <br/><br/>
-            </section>
-
-            <section id="jdbcauthority">
-                <title>Generic Database Authority Connection</title>
-                <p>The generic database connection type allows you to generate access tokens from a database table, served by one of the following databases:</p>
-                <br/>
-                <ul>
-                    <li>Postgresql (via a Postgresql JDBC driver)</li>
-                    <li>SQL Server (via the JTDS JDBC driver)</li>
-                    <li>Oracle (via the Oracle JDBC driver)</li>
-                    <li>Sybase (via the JTDS JDBC driver)</li>
-                    <li>MySQL (via the MySQL JDBC driver)</li>
-                </ul>
-                <br/>
-                <p>This connection type <b>cannot</b> be configured to work with other databases than the ones listed above without software changes.  Depending on your particular installation,
-                       some of the above options may not be available.</p>
-                <p>A generic database authority connection has four special tabs on the repository connection editing screen: the "Database Type" tab, the "Server" tab,
-                      the "Credentials" tab, and the "Queries" tab.  The "Database Type" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-authority-configure-database-type.PNG" alt="Generic Database Authority Connection, Database Type tab" width="80%"/>
-                <br/><br/>
-                <p>Select the kind of database you want to connect to, from the pulldown.</p>
-                <p>Also, select the JDBC access method you want from the access method pulldown.  The access method is provided because the JDBC specification has been
-                    recently clarified, and not all JDBC drivers work the same way as far as resultset column name discovery is concerned.  The "by name" option currently works
-                    with all JDBC drivers in the list except for the MySQL driver.  The "by label" works for the current MySQL driver, and may work for some of the others as well.  If
-                    the queries you supply for your generic database jobs do not work correctly, and you see an error message about not being able to find required columns in the
-                    result, you can change your selection on this pulldown and it may correct the problem.</p>
-                <p>The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-authority-configure-server.PNG" alt="Generic Database Authority Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Here you have a choice.  <strong>Either</strong> you can choose to specify the database host and port, and the database name or instance name,
-                      <strong>or</strong> you can provide a raw JDBC connection string that is appropriate for the database type you have chosen.  This latter option
-                      is provided because many JDBC drivers, such as Oracle's, now can connect to an entire cluster of Oracle servers if you specify the appropriate
-                      connection description string.</p>
-                <p>If you choose the second option, just consult your JDBC driver's documentation and supply your string.  If there is anything entered in the raw connection
-                      string field at all, it will take precedence over the database host and database name fields.</p>
-                <p>If you choose the first option, the server name and port must be provided in the "Database host and port" field.  For example, for Oracle, the standard
-                      Oracle installation uses port 1521, so you would enter something like, "my-oracle-server:1521" for this field.  Postgresql uses port 5432 by default, so
-                      "my-postgresql-server:5432" would be required.  SQL Server's standard port is 1433, so use "my-sql-server:1433".</p>
-                <p>The service name or instance name field describes which instance and database to connect to.  For Oracle or Postgresql, provide just the database name.
-                      For SQL Server, use "my-instance-name/my-database-name".  For SQL Server using the default instance, use just the database name.</p>
-                <p>The "Credentials" tab is straightforward:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-authority-configure-credentials.PNG" alt="Generic Database Authority Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the database user credentials.</p>
-                <p>The "Queries" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-authority-configure-queries.PNG" alt="Generic Database Authority Connection, Queries tab" width="80%"/>
-                <br/><br/>
-                <p>Here you supply two queries.  The first query looks up the user name to find a user id.  The second query looks up access tokens corresponding to the
-                      user id.  Details of what you supply for these queries will depend on your database schema.</p>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-authority-status.PNG" alt="Generic Database Authority Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the generic database authority connection is not properly authenticated, which is leading to an error status message instead
-                      of "Connection working".</p>
-            </section>
-
-
-            <section id="ldapauthority">
-                <title>LDAP Authority Connection</title>
-                <p>An LDAP authority connection can be used to provide document security in situations where there is no native document security
-                      model in place.  Examples include Samba shares, Wiki pages,  RSS feeds, etc.</p>
-                <p>The LDAP authority works by providing user or group names from an LDAP server as access tokens.  These access tokens can
-                      be used by any repository connection type that provides for access tokens entered on a per-job basis, or by the JCIFs connection type,
-                      which has explicit user/group name support built in, meant for Samba shares.</p>
-                <p>This connection type needs to be provided with information about how to log into an appropriate LDAP server, as well as search
-                      expressions needed to look up user and group records.  An active directory authority connection type has a single special tab in the
-                      authority connection editing screen: the "LDAP" tab:</p>
-                <br/><br/>
-                <figure src="images/en_US/ldap-configure-ldap.PNG" alt="LDAP Configuration, LDAP tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the requested values.  Note that the "Server base" field contains the LDAP domain specification you want to search.  For
-                      example, if you have an LDAP domain for "people.myorg.com", the server based might be "dc=com,dc=myorg,dc=people".</p>
-                <p>When you are done, click the "Save" button.  When you do, a connection
-                       summary and status screen will be presented, which
-                       may look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/ldap-status.PNG" alt="LDAP Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the LDAP connection is not responding, which is leading to an error status message instead of "Connection working".</p>
-                <br/><br/>
-				<p>Example configuration for ActiveDirectory server to fetch user groups:</p>
-				<ul>
-				  <li>Server: [xxx.yyy.zzz.ttt]</li>
-				  <li>Port: 389</li>
-				  <li>Server base: [DC=domain,DC=name]</li>
-				  <li>Bind as user: [user@domain.name]</li>
-				  <li>Bind with password: [password for that user]</li>
-				  <li>User search base: CN=Users</li>
-				  <li>User search filter: sAMAccountName={0}</li>
-				  <li>User name attribute: sAMAccountName</li>
-				  <li>Group search base: CN=Users</li>
-				  <li>Group search filter: (member:1.2.840.113556.1.4.1941:={0})</li>
-				  <li>Group name attribute: sAMAccountName</li>
-				  <li>Member attribute is DN: yes (tick the checkbox)</li>
-				</ul>
-				<p><code>member:1.2.840.113556.1.4.1941:</code> gives you recursive check for nested groups</p>
-            </section>
-
-            <section id="livelinkauthority">
-                <title>OpenText LiveLink Authority Connection</title>
-                <p>A LiveLink authority connection is needed to enforce security for documents retrieved from LiveLink repositories.</p>
-                <p>In order to function, this connection type needs to be provided with information about the name of the LiveLink server, and credentials appropriate
-                    for retrieving a user's ACLs from that machine.  Since LiveLink operates with its own list of users, you may also want to specify a rule-based
-                    mapping between an Active Directory user and the corresponding LiveLink user.  The authority type allows you to specify such a mapping using
-                    regular expressions.</p>
-                <p>A LiveLink authority connection has two special tabs you will need to configure: the "Server" tab and the "Cache" tab.</p>
-                <p>The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-authority-server.PNG" alt="LiveLink Authority, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the manner you want the connection to use to communicate with LiveLink.  Your options are:</p>
-                <ul>
-                  <li>Internal (native LiveLink protocol)</li>
-                  <li>HTTP (communication with LiveLink through the IIS web server)</li>
-                  <li>HTTPS (communication with LiveLink through IIS using SSL)</li>
-                </ul>
-                <p>Also, you need to enter the name of the desired LiveLink server, the LiveLink port, and the LiveLink server credentials.  If you have selected communication
-                    using HTTP or HTTPS, you must provide a relative CGI path to your LiveLink.  You may also need to provide web server credentials.  Basic authentication
-                    and older forms of NTLM are supported.  In order to use NTLM, specify a non-blank server domain name in the "Server HTTP domain" field, plus a non-
-                    qualified user name and password.  If basic authentication is desired, leave the "Server HTTP domain" field blank, and provide basic auth credentials in the
-                    "Server HTTP NTLM user name" and "Server HTTP NTLM password" fields.  For no web server authentication, leave these fields all blank.</p>
-                <p>For communication using HTTPS, you will also need to upload your authority certificate(s) on the "Server" tab, to tell the connection which certificates to
-                    trust.  Upload your certificate using the browse button, and then click the "Add" button to add it to the trust store.</p>
-                <p>The "Cache" tab allows you to configure how the authority connection keeps an individual user's information around:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-authority-cache.PNG" alt="LiveLink Authority, Cache tab" width="80%"/>
-                <br/><br/>
-                <p>Here you set the time a user's information is kept around (the "Cache lifetime" field), and how many simultaneous users have their information cached
-                      (the "Cache LRU size" field).</p>
-                <p>When you are done, click the "Save" button.  You will then see a summary and status for the authority connection:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-authority-status.PNG" alt="LiveLink Authority Status" width="80%"/>
-                <br/><br/>
-                <p>We suggest that you examine the status carefully and correct any reported errors before proceeding.  Note that in this example, the LiveLink server would
-                    not accept connections, which is leading to an error status message instead of "Connection working".</p>
-            </section>
-
-
-            <section id="meridioauthority">
-                <title>Autonomy Meridio Authority Connection</title>
-                <p>A Meridio authority connection is required for enforcing security for documents retrieved from Meridio repositories.</p>
-                <p>This connection type needs to be provided with information about what Document Server to connect to, what Records Server to connect to, and what User Service Server
-                    to connect to.  Also needed are the Meridio credentials that should be used to retrieve a user's ACLs from those machines.</p>
-                <p>Note that the User Service is part of the Meridio Authority, and must be installed somewhere in the Meridio system in order for the Meridio Authority to function correctly.
-                    If you do not know whether this has yet been done, or on what server, please ask your system administrator.</p>
-                <p>A Meridio authority connection has the following special tabs you will need to configure: the "Document Server" tab, the "Records Server" tab, the "User Service Server" tab,
-                    and the "Credentials" tab.  The "Document Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-authority-document-server.PNG" alt="Meridio Authority, Document Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the correct protocol, and enter the correct server name, port, and location to reference the Meridio document server services.  If a proxy is involved, enter the proxy host
-                    and port.  Authenticated proxies are not supported by this connection type at this time.</p>
-                <p>Note that, in the Meridio system, while it is possible that different services run on different servers, this is not typically the case.  The connection type, on the other hand, makes
-                    no assumptions, and permits the most general configuration.</p>
-                <p>The "Records Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-authority-records-server.PNG" alt="Meridio Authority, Records Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the correct protocol, and enter the correct server name, port, and location to reference the Meridio records server services.  If a proxy is involved, enter the proxy host
-                    and port.  Authenticated proxies are not supported by this connection type at this time.</p>
-                <p>Note that, in the Meridio system, while it is possible that different services run on different servers, this is not typically the case.  The connection type, on the other hand, makes
-                    no assumptions, and permits the most general configuration.</p>
-                <p>The "User Service Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-authority-user-service-server.PNG" alt="Meridio Authority, User Service Server tab" width="80%"/>
-                <br/><br/>
-                <p>You will require knowledge of where the special Meridio Authority extensions have been installed in order to fill out this tab.</p>
-                <p>Select the correct protocol, and enter the correct server name, port, and location to reference the Meridio user service server services.  If a proxy is involved, enter the proxy host
-                    and port.  Authenticated proxies are not supported by this connection type at this time.</p>
-                <p>Note that, in the Meridio system, while it is possible that different services run on different servers, this is not typically the case.  The connection type, on the other hand, makes
-                    no assumptions, and permits the most general configuration.</p>
-                <p>The "Credentials" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-authority-credentials.PNG" alt="Meridio Authority, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the Meridio server credentials needed to access the Meridio system.</p>
-                <p>When you are done, click the "Save" button.  You will then see a screen looking something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-authority-status.PNG" alt="Meridio Authority Status" width="80%"/>
-                <br/><br/>
-                <p>In this example, logon has not succeeded because the server on which the Meridio Authority is running is unknown to the Windows domain under which Meridio is running.
-                    This results in an error message, instead of the "Connection working" message that you would see if the authority was working properly.</p>
-                <p>Since Meridio uses Windows IIS for authentication, there are many ways in which the configuration of either IIS or the Windows domain under which Meridio runs can affect
-                    the correct functioning of the Meridio Authority.  It is beyond the scope of this manual to describe the kinds of analysis and debugging techniques that might be required to diagnose connection
-                    and authentication problems.  If you have trouble, you will almost certainly need to involve your Meridio IT personnel.  Debugging tools may include (but are not limited to):</p>
-                <br/>
-                <ul>
-                    <li>Windows security event logs</li>
-                    <li>ManifoldCF logs (see below)</li>
-                    <li>Packet captures (using a tool such as WireShark)</li>
-                </ul>
-                <br/>
-                <p>If you need specific ManifoldCF logging information, contact your system integrator.</p>
-            </section>
-
-            <section id="sharepointadauthority">
-                <title>Microsoft SharePoint ActiveDirectory Authority Connection</title>
-                <p>A Microsoft SharePoint ActiveDirectory authority connection is meant to furnish access tokens from Active Directory for a SharePoint instance that is configured
-                    to use Claims Based authorization.  It cannot be used in any other situation.</p>
-                <p>The SharePoint ActiveDirectory authority is meant to work in conjunction with a SharePoint Native authority connection, and provides authorization information from one or
-                    more Active Directory domain controllers.  Thus, it is only needed if Active Directory groups are used to furnish access to documents for users in the SharePoint system.</p>
-                <p>Documents must be indexed using a Microsoft SharePoint repository connection where the "Authority type" is specified to be "Native".  If the "Authority type" is
-                    specified to be "Active Directory", then instead you should configure an Active Directory authority connection, described above.</p>
-                <p>This connection type needs to be provided with information about how to log into an appropriate Windows domain controller, with a user that has sufficient privileges to
-                    be able to look up any user's ID and group relationships.</p>
-                <br/>
-                <p>A SharePoint Active Directory authority connection type has two special tabs in the authority connection editing screen: "Domain Controller", and "Cache".  The "Domain Controller"
-                       tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepointadauthority-configure-dc.PNG" alt="SharePoint AD Configuration, Domain Controller tab" width="80%"/>
-                <br/><br/>
-                <p>As you can see, the SharePoint Active Directory authority allows you to configure multiple connections to different, but presumably related, domain controllers.  The choice of
-                       which domain controller will be accessed is determined by traversing the list of configured domain controllers from top to bottom, and finding the first one that
-                       matches the domain suffix field specified.  Note that a blank value for the domain suffix will match <strong>all</strong> users.</p>
-                <p>To add a domain controller to the end of the list, fill in the requested values.  Note that the "Administrative user name" field usually requires no domain suffix, but
-                       depending on the details of how the domain controller is configured, may sometimes only accept the "name@domain" format.  When you have completed your
-                       entry, click the "Add to end" button to add the domain controller rule to the end of the list.  Later, when other domain controllers are present in the list, you can
-                       click a different button at an appropriate spot to insert the domain controller record into the list where you want it to go.</p>
-                <p>The SharePoint Active Directory authority connection type also has a "Cache" tab, for managing the caching of individual user responses:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepointadauthority-configure-cache.PNG" alt="SharePoint AD Configuration, Cache tab" width="80%"/>
-                <br/><br/>
-                <p>Here you can control how many individual users will be cached, and for how long.</p>
-                <p>When you are done, click the "Save" button.  When you do, a connection summary and status screen will be presented, which may look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepointadauthority-status.PNG" alt="SharePoint AD Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the SharePoint Active Directory connection is not responding, which is leading to an error status message instead of "Connection working".</p>
-
-            </section>
-
-            <section id="sharepointnativeauthority">
-                <title>Microsoft SharePoint Native Authority Connection</title>
-                <p>A Microsoft SharePoint Native authority connection is meant to furnish access tokens from the same SharePoint instance that the documents are coming from.
-                    You should use this authority type whenever you are trying to secure documents using a SharePoint repository connection that is configured to the use "Native"
-                    authority type.</p>
-                <p>If your SharePoint instance is configured to use the Claims Based authorization model, you may combine a SharePoint Native authority connection with other
-                    SharePoint authority types, such as the SharePoint ActiveDirectory authority type, to furnish complete authorization support.  However, if Claims Based authorization is not
-                    configured, the SharePoint Native authority connection is the only authority type you should need to use.</p>
-                <p>A SharePoint authority connection has two special tabs on the authority connection editing screen: the "Server" tab, and the "Cache" tab.
-                    The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepointnativeauthority-configure-server.PNG" alt="SharePoint Native Authority, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select your SharePoint server version from the pulldown.  Check with your SharePoint system administrator if you are not sure
-                    what to select.</p>
-                <p>Select whether your SharePoint server is configured for Claims Based authorization or not.  Check with your SharePoint system administrator if you are
-                    not sure what to select.</p>
-                <p>SharePoint uses a web URL model for addressing sites, subsites, libraries, and files.  The best way to figure out how to set up a SharePoint connection
-                    type is therefore to start with your web browser, and visit the topmost root of the site you wish to crawl.  Then, record the URL you see in your browser.</p>
-                <p>Select the server protocol, and enter the server name and port, based on what you recorded from the URL for your SharePoint site.  For the "Site path"
-                    field, type in the portion of the root site URL that includes everything after the server and port, except for the final "aspx" file.  For example, if the SharePoint
-                    URL is "http://myserver:81/sites/somewhere/index.asp", the site path would be "/sites/somewhere".</p>
-                <p>The SharePoint credentials are, of course, what you used to log into your root site.  The SharePoint connection type always requires the user name to be
-                    in the form "domain\user".</p>
-                <p>If your SharePoint server is using SSL, you will need to supply enough certificates for the connection's trust store so that the SharePoint server's SSL
-                    server certificate can be validated.  This typically consists of either the server certificate, or the certificate from the authority that signed the server certificate.
-                    Browse to the local file containing the certificate, and click the "Add" button.</p>
-                <p>The "Cache" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepointnativeauthority-configure-cache.PNG" alt="SharePoint Native Authority, Cache tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the desired caching parameters.</p>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepointnativeauthority-status.PNG" alt="SharePoint Native Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the SharePoint connection is not actually referencing a SharePoint instance, which is leading to an error status message instead of
-                    "Connection working".</p>
-            </section>
-
-
-       </section>
-
-        <section id="repositoryconnectiontypes">
-            <title>Repository Connection Types</title>
-
-            <section id="alfrescorepository">
-              <title>Alfresco Repository Connection</title>
-              <p>The Alfresco Repository Connection type allows you to index content from an Alfresco repository.</p>
-              <p>This connector is compatible with any Alfresco version (2.x, 3.x and 4.x).</p>
-              <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-              <br/>
-              <p>An Alfresco connection has the following configuration parameters on the repository connection editing screen:</p>
-              <br/><br/>
-              <figure src="images/en_US/alfresco-repository-connection-configuration.png" alt="Alfresco Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>Enter the correct username, password and the endpoint to reference the Alfresco document server services.</p>
-              <p>You also can set a specific Socket Timeout to correctly tune the connector for your own Alfresco repository settings.</p>
-              <p>If you have a Multi-Tenancy environment configured in the repository, be sure to also set the tenant domain parameter.</p>
-              <p>The endpoint consists of the HTTP protocol, hostname, port and the context path of the Alfresco Web Services API exposed by the Alfresco server.</p>
-              <p>By default, if you don't have changed the context path of the Alfresco webapp, you should have an endpoint address similar to the following:</p>
-              <br/><br/>
-              <p><code>http://HOSTNAME:PORT/alfresco/api</code></p>
-              <br/><br/>
-              <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/alfresco-repository-connection-configuration-save.png" alt="Alfresco Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>When you configure a job to use the Alfresco repository connection an additional tab is presented. This is the "Lucene Query" tab:</p>
-              <br/><br/>
-              <figure src="images/en_US/alfresco-repository-connection-job-lucenequery.png" alt="Alfresco Repository Connection, Lucene Query" width="80%"/>
-              <br/><br/>
-              <p>The Lucene Query tab allows you to specify the query based on the Lucene Query Language to get all the result documents that need to be ingested.</p>
-              <p>Please note that if the Lucene Query is null, the connector will ingest all the contents in the Alfresco repository under the Company Home.</p>
-              <p>Please also note that the Alfresco Connector during the ingestion process, for each result, if it will find a folder node (that must have any child association defined for the node type), it will ingest all the children of the folder node; otherwise it will directly ingest the document (that must have any d:content as one of the properties of the node).</p>
-              <p>When you are done, and you click the "Save" button, you will see a summary page looking something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/alfresco-repository-connection-job-save.png" alt="Alfresco Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-
-            <section id="alfrescowebscriptrepository">
-              <title>Alfresco Webscript Repository Connection</title>
-              <p>The Alfresco Webscript Repository connection type allows you to index content from an Alfresco repository.  It also supports document
-                    security, in conjunction with the Alfresco Webscript Authority connection Type.</p>
-              <p>The current connector relies on a set of services that have been developed on top of Alfresco for easing content and metadata retrieving from an Alfresco instance. These services will be available within an Alfresco
-              instance after installing the following artifact: <a href="https://github.com/maoo/alfresco-indexer">Alfresco Indexer</a>. Please, make sure that you, FIRST, install and deploy within the desired Alfresco instance the AMP generated after building the Alfresco Indexer project before trying to index content from ManifoldCF.</p>
-              <p>By default each Alfresco Webscript Connection manages a single Alfresco repository, this means that if you have multiple Alfresco repositories that you want to manage, you need to create a specific connection for each one.</p>
-              <p>The Alfresco Webscript Repository connector has a single configuration tab in the repository connection editing screen called "Server" where one needs to configure the Alfresco's services endpoint:</p>
-              <br/><br/>
-                <figure src="images/en_US/alfresco-connector.png" alt="Alfresco Server Endpoint Configuration" width="80%"/>
-                <br/><br/>
-                <p>As you can see, the Alfresco endpoint settings are quite simple and almost self-explicative:</p>
-                <ul>
-                  <li><strong>Protocol:</strong> HTTP or HTTPS depending on your instance</li>
-                  <li><strong>HostName:</strong> IP or domain where the Alfresco instance is hosted in your network</li>
-                  <li><strong>Port:</strong> port where the Alfresco instance has been deployed</li>
-                  <li><strong>Context:</strong> URL path where the webscript services has been deployed (/alfresco/service by default) after installed the WebScript</li>
-                  <li><strong>Store Protocol: Alfresco's store protocol to be used (workspace/archive)</strong> </li>
-                  <li><strong>StoreID:</strong> store's name</li>
-                  <li><strong>User:</strong> user ID used for performing the authored requests to Alfresco. The user MUST have enough privileges for all the request, therefore admin user used to be a good idea</li>
-                  <li><strong>Password:</strong> password of the above user in Alfresco</li>
-                </ul>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/alfresco-connector-save.png" alt="Alfresco Webscript Repository Connection saving" width="80%"/>
-                <br/><br/>
-                <p>When you configure a job to use the Alfresco Webscript repository connection an additional tab is presented. This is the "Filtering Configuration" tab:</p>
-                <br/><br/>
-                <figure src="images/en_US/alfresco-connector-job.png" alt="Alfresco Content Filtering" width="80%"/>
-                <br/><br/>
-                <p>The Filtering Configuration tab allows you to fully customize the crawling job on Alfresco by defining which kind of content do you want to index from your Alfresco repository.
-                  The configuration tab consist on a list of filters that can be combined for indexing only certain documents or certain parts of the repository:</p>
-                <ul>
-                  <li><strong>Site Filtering:</strong> List of sites to be crawled. Only documents belonging to these sites will be indexed</li>
-                  <li><strong>MimeType Filtering:</strong> Allow to filter documents by mimetype in Alfresco</li>
-                  <li><strong>Aspect Filtering:</strong> index only those documents associated to the configured aspects</li>
-                  <li><strong>Metadata Filtering:</strong> index only those documents that at least have the specified value for one of the configured metadata field</li>
-                </ul>
-            </section>
-
-            <section id="cmisrepository">
-              <title>CMIS Repository Connection</title>
-              <p>The CMIS Repository Connection type allows you to index content from any CMIS-compliant repository.</p>
-              <p>By default each CMIS Connection manages a single CMIS repository, this means that if you have multiple CMIS repositories exposed by a single
-                  endpoint, you need to create a specific connection for each CMIS repository.</p>
-              <p>CMIS repository documents are typically secured by using the CMIS Authority Connection type.  This authority type, however, does not have access
-                    to user groups, since there is no such functionality in the CMIS specification at this time.  As a result, most people only use the CMIS connection type
-                    in an unsecured manner.</p>
-              <br/>
-              <p>A CMIS connection has the following configuration parameters on the repository connection editing screen:</p>
-              <br/><br/>
-              <figure src="images/en_US/cmis-repository-connection-configuration.png" alt="CMIS Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>Select the correct CMIS binding protocol (AtomPub or Web Services) and enter the correct username, password and the endpoint to reference the CMIS document server services.</p>
-              <p>The endpoint consists of the HTTP protocol, hostname, port and the context path of the CMIS service exposed by the CMIS server:</p>
-              <br/><br/>
-              <p><code>http://HOSTNAME:PORT/CMIS_CONTEXT_PATH</code></p>
-              <br/><br/>
-              <p>Optionally you can provide the repository ID to select one of the exposed CMIS repository, if this parameter is null the CMIS Connector will consider the first CMIS repository exposed by the CMIS server.</p>
-              <br/>
-              <p>Note that, in a CMIS system, a specific binding protocol has its own context path, this means that the endpoints are different:</p>
-              <p>for example the endpoint of the AtomPub binding exposed by the actual version of the InMemory Server provided by the OpenCMIS framework is the following:</p>
-              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/atom</code></p>
-              <br/><br/>
-              <p>The Web Services binding is exposed using a different endpoint:</p>
-              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/services/RepositoryService</code></p>
-              <br/><br/>
-              <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/cmis-repository-connection-configuration-save.png" alt="CMIS Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>When you configure a job to use the CMIS repository connection an additional tab is presented. This is the "CMIS Query" tab:</p>
-              <br/><br/>
-              <figure src="images/en_US/cmis-repository-connection-job-cmisquery.png" alt="CMIS Repository Connection, CMIS Query" width="80%"/>
-              <br/><br/>
-              <p>The CMIS Query tab allows you to specify the query based on the CMIS Query Language to get all the result documents that need to be ingested.</p>
-              <p>Note that the CMIS Connector during the ingestion process, for each result, if it will find a folder node (that must have cmis:folder as the baseType), it will ingest all the children of the folder node; otherwise it will directly ingest the document (that must have cmis:document as the baseType).</p>
-              <p>When you are done, and you click the "Save" button, you will see a summary page looking something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/cmis-repository-connection-job-save.png" alt="CMIS Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-
-            <section id="documentumrepository">
-                <title>EMC Documentum Repository Connection</title>
-                <p>The EMC Documentum connection type allows you index content from a Documentum Content Server instance.  A single connection allows you
-                    to reach all documents contained on a single Content Server instance.  Multiple connections are therefore required to reach documents from multiple Content Server instances.</p>
-                <p>For each Content Server instance, the Documentum connection type allows you to index any Documentum content that is of type dm_document, or is derived from dm_document.
-                    Compound documents are handled as well, but only by mean of the component documents that make them up.  No other Documentum construct can be indexed at this time.</p>
-                <p>Documents described by Documentum connections are typically secured by a Documentum authority.  If you have not yet created a Documentum authority, but would like your
-                    documents to be secured, please follow the direction in the section titled "EMC Documentum Authority Connection".</p>
-                <p>A Documentum connection has the following special tabs: "Docbase", and "Webtop".  The "Docbase" tab allows you to select a Content Server to connect to, and also to provide
-                    appropriate credentials.  The "Webtop" tab describes the location of a Webtop server that will be used to display the documents from that Content Server, after they have been indexed.</p>
-                <p>The "Docbase" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-docbase.PNG" alt="Documentum Connection, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the Content Server Docbase instance name, and provide your credentials.  You may leave the "Domain" field blank, if the Content Server instance does not have AD integration enabled.</p>
-                <p>The "Webtop tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-webtop.PNG" alt="Documentum Connection, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the components of the base URL of the Webtop instance you want to use for serving the documents.  Remember that this information will only be used to construct
-                    a URL to the document to allow user inspection; it will not be used for any crawling activities.</p>
-                <p>When you are done, click the "Save" button.  When you do, a connection summary and status screen will be presented:</p>
-                <br/><br/>
-                <figure src="images/en_US/documentum-status.PNG" alt="Documentum Connection Status" width="80%"/>
-                <br/><br/>
-                <p>Pay careful attention to the status, and be prepared to correct any
-                    problems that are displayed.</p>
-                <p></p>
-                <p>A job created to use a Documentum connection has the following additional tabs associated with it: "Paths", "Document Types", "Content Types", "Security", and "Path Metadata".</p>
-                <p>The "Paths" tab allows you to construct the paths within Documentum that you want to scan for content.  If no paths are selected, all content will be considered eligible.</p>
-                <p>The "Document Types" tab allows you to select what document types you want to index.  Only document types that are derived from dm_document, which are flagged by the system administrator
-                    as being "indexable", will be presented for your selection.  On this tab also, for each document type you index, you may choose included specific metadata for documents of that type, or you can
-                    check the "All metadata" checkbox to include all metadata associated with documents of that type.</p>
-                <p>The "Content Types" tab allows you to select which Documentum mime-types are to be included in the document set.  Check the types you want to include, and uncheck the types you want to
-                    exclude.</p>
-                <p>The "Security" tab allows you to disable or enable Documentum security for the documents described by this job.  You can turn off native Documentum security by clicking the "Disable" radio button.
-                    If you do this, you may also enter your own access tokens, which will be applied to all documents described by the job.  The form of the access tokens you enter will depend on the governing
-                    authority connection type.  Click the "Add" button to add each access token.</p>
-                <p>The "Path Metadata" tab allows you to send each document's path information as metadata to the index.  To enable this feature, enter the name of the metadata
-                    attribute you want this information to be sent into the "Path attribute name" field.  Then, add the rules you want to the list of rules.  Each rule has a match expression, which is a regular expression where
-                    parentheses ("(" and ")") mark sections you are interested in.  These sections are called "groups" in regular expression parlance.  The replace string consists of constant text plus
-                    substitutions of the groups from the match, perhaps modified.  For example, "$(1)" refers to the first group within the match, while "$(1l)" refers to the first match group
-                    mapped to lower case.  Similarly, "$(1u)" refers to the same characters, but mapped to upper case.</p>
-                <p>For example, suppose you had a rule which had ".*/(.*)/(.*)/.*" as a match expression, and "$(1) $(2)" as the replace string.  If presented with the path
-                    <code>Project/Folder_1/Folder_2/Filename</code>, it would output the string <code>Folder_1 Folder_2</code>.</p>
-                <p>If more than one rule is present, the rules are all executed in sequence.  That is, the output of the first rule is modified by the second rule, etc.</p>
-            </section>
-
-            <section id="dropboxrepository">
-              <title>Dropbox Repository Connection</title>
-              <p>The Dropbox Repository Connection type allows you to index content from <a href="https://www.dropbox.com/home">Dropbox</a>.</p>
-              <p>Each Dropbox Connection manages access to a single dropbox repository. This means that if you have multiple dropbox repositories (i.e. different users),
-                you need to create a specific connection for each dropbox repository and provide the associated authentication information.</p>
-              <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-              <br/>
-              <p>A Dropbox connection has the following configuration parameters on the repository connection editing screen:</p>
-              <br/><br/>
-              <figure src="images/en_US/dropbox-repository-connection-configuration.PNG" alt="Dropbox Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>As we can see there are 4 pieces of information which are needed to create a succesful connection. The application key and secret are given by dropbox
-                when you register your application for a development license. This is typically done through the application developer <a href="https://www.dropbox.com/developers/apps">Dropbox website</a>.</p>
-              <br/><br/>
-              <figure src="images/en_US/dropbox-repository-create-application.PNG" alt="Dropbox create application" width="80%"/>
-              <br/><br/>
-              <p>For our purposes, we need to select "Core" as the application type as we'll be using REST services to communicate with dropbox. Also we select
-                "full access". This merits a small discussion. Typically an application which wants to store and retreive information does so from an application specific
-                folder. In this case, we assume that the user wants to have access to their files as is, and not copy them into a manifoldcf specific folder. As a result,
-                we have selected full access instead of "App folder".</p>
-              <br/><br/>
-              <figure src="images/en_US/dropbox-repository-application-secret-passwords.PNG" alt="Dropbox get key and secret passwords" width="80%"/>
-              <br/><br/>
-              <p> Afterwards we can see the app key and app secret which are the two pieces of information requested by the connector.</p>
-              <p>Now each user must confirm their acceptance of allowing your application to access their dropbox. This is done through a run-of-the-mill OAUTH
-                approach. After providing your application key and secret, the user is directed to a dropbox website asking them if they wish to grant permission to your
-                application. After they accept the request, dropbox provides a client key and secret. These are the last two pieces of information needed for the dropbox
-                connector. This process is covered in depth at the <a href="https://www.dropbox.com/developers/core/authentication">dropbox website</a>
-                which shows examples of how to generate the two needed client tokens. </p>
-              <br/>
-              <br/><br/>
-              <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/dropbox-repository-connection-configuration-save.PNG" alt="Dropbox Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>When you configure a job to use the Dropbox repository connection an additional tab is presented. This is the "Dropbox Folder to Index" tab:</p>
-              <br/><br/>
-              <figure src="images/en_US/dropbox-repository-connection-job-dropbox-folder-to-index.PNG" alt="Dropbox Repository Connection, Dropbox Folder to Index" width="80%"/>
-              <br/><br/>
-              <p>The Dropbox Folder to Index tab allows you to specify the directory which the dropbox connector will index. Dropbox uses unix style paths, with
-                "/" indicating the root path (and thus the entire dropbox). For example if you want to just index the Photos directory, you would specify "/Photos". </p>
-              <p>Note that the Dropbox Connector during the ingestion process, for each result, when it find a folder node, it will ingest all the children of the folder node;
-                otherwise it will directly ingest the document.</p>
-              <p>When you are done, and you click the "Save" button, you will see a summary page looking something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/dropbox-repository-connection-job-save.PNG" alt="CMIS Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-
-
-            <section id="emailrepository">
-                <title>Individual Email Repository Connection</title>
-                <p>The Individual Email connection type allows you to index content from a single email account, using IMAP, IMAP-SSL, POP3, or
-                    POP3-SSL email protocols.  Multiple connections are required to support multiple email accounts.</p>
-                <p>This connection type provides no support at this time for securing email documents.</p>
-                <p>An Email connection has the following special tabs: "Server" and "URL".  The "Server" tab allows you to describe a server and
-                    email account, while the "URL" tab allows you describe a URL template that will be used to form the URL for individual emails that
-                    are crawled.</p>
-                <p>The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/email-configure-server.PNG" alt="Email Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select an email protocol, and type in the name of the email host.  Also type in the user name and password.  If the port differs from the
-                    default for the selected protocol, you may enter a port as well.</p>
-                <p>The "URL" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/email-configure-url.PNG" alt="Email Connection, URL tab" width="80%"/>
-                <br/><br/>
-                <p>Enter a URL template to be used for generating the URL for each individual email.  Use the special substitution tokens "$(FOLDERNAME)"
-                    and "$(MESSAGEID)" to include the individual message's folder name and message ID in the URL, in url-encoded form.</p>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/email-status.PNG" alt="Email Connection Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the email connection cannot reach the server, which is leading to an error status message instead of
-                    "Connection working".</p>
-                <p></p>
-                <p>When you configure a job to use a repository connection of the email type, two additional tabs are presented.  These are, in order, "Metadata", and "Filter".</p>
-                <p>The "Metadata" tab looks something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/email-job-metadata.PNG" alt="Email Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>Select any of the checkboxes to include that metadata in the crawl.</p>
-                <p></p>
-                <p>The "Filter" tab looks something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/email-job-filter.PNG" alt="Email Job, Filter tab" width="80%"/>
-                <br/><br/>
-                <p>Select one or more folders to include in the pulldown.  Then, if you wish to limit the documents included further by applying search criteria,
-                    you may select a field, type in a search value, and click the "Add" button.  Note that <strong>all</strong> the fields must match for the
-                    email to be included in the crawl.</p>
-            </section>
-
-            <section id="filenetrepository">
-                <title>IBM FileNet P8 Repository Connection</title>
-                <p>The IBM FileNet P8 connection type allows you to index content from a FileNet P8 server instance.  A connection allows you to reach all files
-                      kept on that server.  Multiple connections are required to support multiple servers.</p>
-                <p>This connection type secures documents using the Active Directory authority.  If you have not yet created an Active Directory authority, but would like your
-                    documents to be secured, please follow the direction in the section titled "Active Directory Authority Connection".</p>
-                <p>A FileNet connection has the following special tabs: "Server", "Object Store", "Document URL", and "Credentials".  The "Server" tab allows you to
-                      connect to a specific FileNet P8 Server, while the "Object store" tab allows you to specify the desired FileNet object store.  The "Document URL"
-                      tab allows you to set up the parameters of each indexed document's URL, while the "Credentials" tab allows you to specify the credentials to use
-                      to access the FileNet object store.</p>
-                <p>The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filenet-configure-server.PNG" alt="FileNet Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the appropriate protocol, and provide the server name, port, and service location.</p>
-                <p>The "Object Store" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filenet-configure-objectstore.PNG" alt="FileNet Connection, Object Store tab" width="80%"/>
-                <br/><br/>
-                <p>Type in the name of the FileNet domain you want to connect to, and the name of the FileNet object store within that domain.</p>
-                <p>The "Document URL" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filenet-configure-documenturl.PNG" alt="FileNet Connection, Document URL tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to provide the basic URL that will be how each indexed document will be loaded for the user.  Select the
-                      protocol.  Type in the host name.  Type in the port.  And, type in the location.</p>
-                <p>The "Credentials" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filenet-configure-credentials.PNG" alt="FileNet Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Type in the FileNet user ID and password to allow the FileNet connection type access to the FileNet repository.</p>
-                <p>When you are done filling in the connection information, click the "Save" button.  You should see something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filenet-status.PNG" alt="FileNet Connection Status" width="80%"/>
-                <br/><br/>
-                <p>More here later</p>
-            </section>
-
-            <section id="filesystemrepository">
-                <title>Generic WGET-Compatible File System Repository Connection</title>
-                <p>The generic file system repository connection type was developed in part as an example, demonstration, and testing tool, which reads simple
-                       files in directory paths, and partly as ManifoldCF support for the Unix utility called <em>wget</em>.  In the latter mode, the File System Repository Connector
-                       will parse file names that were created by <em>wget</em>, or by the wget-compatible File System Output Connector, and turn these back
-                       into full URL's to external web content.</p>
-                <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-                <p>The File System repository connection type provides no configuration tabs beyond the standard ones.  However, please consider setting a "Maximum connections per
-                       JVM" value on the "Throttling" tab to at least one per worker thread, or 30, for best performance.</p>
-                <p>Jobs created using a file-system-type repository connection
-                       have two tabs in addition to the standard repertoire: the "Hop Filters" tab, and the "Repository Paths" tab.</p>
-                <p>The "Hop Filters" tab allows you to restrict the document set by the number of child hops from the path root.  While this is not terribly interesting in the case of a file
-                       system, the same basic functionality is also used in the Web connection type, where it is a more important feature.  The file system connection type gives you a way to see
-                       how this feature works, in a more predictable environment:</p>
-                <br/><br/>
-                <figure src="images/en_US/filesystem-job-hopcount.PNG" alt="File System Connection, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>In the case of the File System connection type, there is only one variety of relationship between documents, which is called a "child" relationship.  If you want to
-                       restrict the document set by how far away a document is from the path root, enter the maximum allowed number of hops in the text box.  Leaving the box blank
-                       indicates that no such filtering will take place.</p>
-                <p>On this same tab, you can tell the Framework what to do should there be changes in the distance from the root to a document.  The choice "Delete unreachable
-                       documents" requires the Framework to recalculate the distance to every potentially affected document whenever a change takes place.  This may require
-                       expensive bookkeeping, however, so you also have the option of  ignoring such changes.  There are two varieties of this latter option - you can ignore the changes
-                       for now, with the option of turning back on the aggressive bookkeeping at a later time, or you can decide not to ever allow changes to propagate, in which case
-                       the Framework will discard the necessary bookkeeping information permanently.</p>
-                <p>The "Repository Paths" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/filesystem-job-paths.PNG" alt="File System Connection, Repository Paths tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to type in a set of paths which function as the roots of the crawl.  For each desired path, type in the path, select whether the root should
-                       behave as an WGET repository or not, and click the "Add" button to add it to the list.  The form of the path you type in obviously needs to be meaningful
-                       for the operating system the Framework is running on.</p>
-                <p>Each root path has a set of rules which determines whether a document is included or not in the set for the job.  Once you have added the root path to the list, you
-                       may then add rules to it.  Each rule has a match expression, an indication of whether the rule is intended to match files or directories, and an action (include or exclude).
-                       Rules are evaluated from top to bottom, and the first rule that matches the file name is the one that is chosen.  To add a rule, select the desired pulldowns, type in
-                       a match file specification (e.g. "*.txt"), and click the "Add" button.</p>
-            </section>
-
-            <section id="genericconnector">
-              <title>Generic Connector</title>
-              <p>Generic connector allows you to index any source that follows provided API specification. The idea is that you can use it and implement only the API which is designed
-                    to be fine grained and as simple as it is possible to handle document indexing.</p>
-              <p>API should be implemented as xml web page (entry point) returning results based on provided GET params. It may be a simple server script or part of the bigger application.
-                    API can be secured with HTTP basic authentication.</p>
-              <br/>
-              <p>There are 4 actions:</p>
-              <ul>
-                    <li>check</li>
-                    <li>seed</li>
-                    <li>items</li>
-                    <li>item</li>
-              </ul>
-              <p>Action is passed as "action" GET param to the entrypoint.</p>
-              <br/><br/>
-              <p><b>[entrypoint]?action=check</b></p>
-              <p>Should return HTTP status code 200 providing information that entrypoint is working properly. Any content returned will be ignored, only the status code matters.</p>
-              <br/><br/>
-
-              <p><b>[entrypoint]?action=seed&amp;startDate=YYYY-MM-DDTHH:mm:ssZ&amp;endDate=YYYY-MM-DDTHH:mm:ssZ</b></p>
-              <p>Parameters:</p>
-              <ul>
-                    <li>startDate - the start of time frame which should be applied to returned seeds. If this is a first run - this parameter will not be provided meaning that all documents should be returned.</li>
-                    <li>endDate - the end of time frame. Always provided.</li>
-              </ul>
-              <p><code>startDate</code> and <code>endDate</code> parameters are encoded as <code>YYYY-MM-DD'T'HH:mm:ss'Z'</code>. Result should be valid XML of form:</p>
-              <source>
-&lt;seeds&gt;
-   &lt;seed id="document_id_1" /&gt;
-   &lt;seed id="document_id_2" /&gt;
-   ...
-&lt;/seeds&gt;
-              </source>
-              <p>Attributes <code>id</code> are required.</p>
-              <br/><br/>
-
-              <p><b>[entrypoint]?action=items&amp;id[]=document_id_1&amp;id=document_id_2</b></p>
-              <p>Parameters:</p>
-              <ul>
-                    <li>id[] - array of document IDs that should be returned</li>
-              </ul>
-              <p>Result should be valid XML of form:</p>
-              <source>
-&lt;items&gt;
-   &lt;item id="document_id_1"&gt;
-      &lt;url&gt;[http://document_uri]&lt;/url&gt;
-      &lt;version&gt;[document_version]&lt;/version&gt;
-	  &lt;created&gt;2013-11-11T21:00:00Z&lt;/created&gt;
-	  &lt;updated&gt;2013-11-11T21:00:00Z&lt;/updated&gt;
-	  &lt;filename&gt;filename.ext&lt;/filename&gt;
-	  &lt;mimetype&gt;mime/type&lt;/mimetype&gt;
-	  &lt;metadata&gt;
-	     &lt;meta name="meta_name_1"&gt;meta_value_1&lt;/meta&gt;
-	     &lt;meta name="meta_name_2"&gt;meta_value_2&lt;/meta&gt;
-		 ...
-	  &lt;/metadata&gt;
-	  &lt;auth&gt;
-		 &lt;token&gt;auth_token_1&lt;/token&gt;
-		 &lt;token&gt;auth_token_2&lt;/token&gt;
-		 ...
-	  &lt;/auth&gt;
-	  &lt;related&gt;
-		 &lt;id&gt;other_document_id_1&lt;/id&gt;
-		 &lt;id&gt;other_document_id_2&lt;/id&gt;
-		 ...
-	  &lt;/related&gt;
-	  &lt;content&gt;Document content&lt;/content&gt;
-   &lt;/item&gt;
-   ...
-&lt;/items&gt;
-              </source>
-              <p><code>id, url, version</code> are required, the rest is optional.</p>
-              <p>If <code>auth</code> tag is provided - document will be treated as non-public with defined access tokens, if it is ommited - document will be public.</p>
-              <p>If <code>content</code> tag is ommited - connector will ask for document content as <code>action=item</code> separate API call.</p>
-              <p>You may provide related document ids when document repository is a graph or tree. Provided documents will also be indexed. In case you want to use relations -
-                  seeding do not have to return all documents, only starting points. Rest of documents will be fetched using relations.</p>
-              <br/><br/>
-
-              <p><b>[entrypoint]?action=item&amp;id=document_id</b></p>
-              <p>Parameters:</p>
-              <ul>
-                    <li>id - requested document ID</li>
-              </ul>
-              <p>Result should be the document content. It does not have to be XML - you may return binary data (PDF, DOC, etc) which represent the document.</p>
-              <br/><br/>
-              <p>You may provide custom parameters by defining them in Job specification. All defined parameters will be sent as additional GET parameters with every API call</p>
-              <p>You may override provided auth tokens and define forced tokens in Job specification. If you change security model to "forced" and do not provide any tokens - all documents will be public.</p>
-              <br/><br/>
-            </section>
-
-            <section id="jdbcrepository">
-                <title>Generic Database Repository Connection</title>
-                <p>The generic database connection type allows you to index content from a database table, served by one of the following databases:</p>
-                <br/>
-                <ul>
-                    <li>Postgresql (via a Postgresql JDBC driver)</li>
-                    <li>SQL Server (via the JTDS JDBC driver)</li>
-                    <li>Oracle (via the Oracle JDBC driver)</li>
-                    <li>Sybase (via the JTDS JDBC driver)</li>
-                    <li>MySQL (via the MySQL JDBC driver)</li>
-                </ul>
-                <br/>
-                <p>This connection type <b>cannot</b> be configured to work with other databases than the ones listed above without software changes.  Depending on your particular installation,
-                       some of the above options may not be available.</p>
-                <p>The generic database connection type currently has no per-document notion of security.  It is possible to set document security for all documents specified by a
-                       given job.  Since this form of security requires you to know what the actual access tokens are, you must have detailed knowledge of the authority connection you
-                       intend to use, and what sorts of access tokens it produces.</p>
-                <p>A generic database connection has three special tabs on the repository connection editing screen: the "Database Type" tab, the "Server" tab, and the
-                       "Credentials" tab.  The "Database Type" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-configure-database-type.PNG" alt="Generic Database Connection, Database Type tab" width="80%"/>
-                <br/><br/>
-                <p>Select the kind of database you want to connect to, from the pulldown.</p>
-                <p>Also, select the JDBC access method you want from the access method pulldown.  The access method is provided because the JDBC specification has been
-                    recently clarified, and not all JDBC drivers work the same way as far as resultset column name discovery is concerned.  The "by name" option currently works
-                    with all JDBC drivers in the list except for the MySQL driver.  The "by label" works for the current MySQL driver, and may work for some of the others as well.  If
-                    the queries you supply for your generic database jobs do not work correctly, and you see an error message about not being able to find required columns in the
-                    result, you can change your selection on this pulldown and it may correct the problem.</p>
-                <p>The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-configure-server.PNG" alt="Generic Database Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Here you have a choice.  <strong>Either</strong> you can choose to specify the database host and port, and the database name or instance name,
-                      <strong>or</strong> you can provide a raw JDBC connection string that is appropriate for the database type you have chosen.  This latter option
-                      is provided because many JDBC drivers, such as Oracle's, now can connect to an entire cluster of Oracle servers if you specify the appropriate
-                      connection description string.</p>
-                <p>If you choose the second option, just consult your JDBC driver's documentation and supply your string.  If there is anything entered in the raw connection
-                      string field at all, it will take precedence over the database host and database name fields.</p>
-                <p>If you choose the first option, the server name and port must be provided in the "Database host and port" field.  For example, for Oracle, the standard
-                      Oracle installation uses port 1521, so you would enter something like, "my-oracle-server:1521" for this field.  Postgresql uses port 5432 by default, so
-                      "my-postgresql-server:5432" would be required.  SQL Server's standard port is 1433, so use "my-sql-server:1433".</p>
-                <p>The service name or instance name field describes which instance and database to connect to.  For Oracle or Postgresql, provide just the database name.
-                      For SQL Server, use "my-instance-name/my-database-name".  For SQL Server using the default instance, use just the database name.</p>
-                <p>The "Credentials" tab is straightforward:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-configure-credentials.PNG" alt="Generic Database Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the database user credentials.</p>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-status.PNG" alt="Generic Database Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the generic database connection is not properly authenticated, which is leading to an error status message instead of "Connection working".</p>
-                <p></p>
-                <p>When you configure a job to use a repository connection of the generic database type, several additional tabs are presented.  These are, in order, "Queries", and "Security".</p>
-                <p>The "Queries" tab looks something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jdbc-job-queries.PNG" alt="Generic Database Job, Queries tab" width="80%"/>
-                <br/><br/>
-                <p>You must supply at least two queries.  (All other queries are optional.)  The purpose of these queries is to obtain the data needed for the database to be properly crawled.
-                       But in order for you to write these queries, you must make some decisions first.  Basically, you need to figure out how best to map the constructs within your database
-                       to the requirements of the Framework.  The following are the sorts of queries you can provide:</p>
-                <br/>
-                <ul>
-                    <li>Obtain a list of document identifiers corresponding to changes and additions that occurred within a specified time window (see below)</li>
-                    <li>Given a set of document identifiers, find the corresponding version strings (see below)</li>
-                    <li>Given a set of document identifiers, find the corresponding list of access tokens for each document identifier (see below)</li>
-                    <li>Given a set of document identifiers, find information about the document, consisting of the document's data, access URL, and metadata</li>
-                    <li>Given a set of document identifiers, find multivalued metadata from the document (multiple such queries)</li>
-                </ul>
-                <br/>
-                <p>The Framework uses a unique document identifier to describe every document within the confines of a defined repository connection.  This document identifier is used
-                       as a primary key to locate information about the document.  When you set up a generic-database-type job, the database you are connecting to must have a similar
-                       concept.  If you pick the wrong thing for a document identifier, at the very least you could find that the crawler runs very slowly.</p>
-                <p>Obtaining the list of document identifiers that represents the changes that occurred over the given time frame must return <b>at least</b> all such changes.  It is
-                        acceptable (although not ideal) for the returned list to be bigger than that.</p>
-                <p>If you want your database connection to function in an incremental manner, you must also come up with the format of a "version string".  This string is used by the
-                       Framework to determine if a document has changed.  It must change whenever anything that might affect the document's indexing changes.  (It is not a problem if
-                       it changes for other reasons, as long as it fulfills that principle criteria.)</p>
-                <p>The queries you provide get substituted before they are used by the connection.  The example queries, which are present when the queries tab is first opened for a
-                       new job, show many of these substitutions in roughly the manner in which they are intended to be used.  For example, "$(IDCOLUMN)" will substitute a column
-                       name expected by the connection to contain the document identifier into the query.  The list of substitution strings are as follows:</p>
-                <br/>
-                <table>
-                    <tr><td><b>String name</b></td><td><b>Meaning/use</b></td></tr>
-                    <tr><td>IDCOLUMN</td><td>The name of an expected resultset column containing a document identifier</td></tr>
-                    <tr><td>VERSIONCOLUMN</td><td>The name of an expected resultset column containing a version string</td></tr>
-                    <tr><td>TOKENCOLUMN</td><td>The name of an expected resultset column containing an access token</td></tr>
-                    <tr><td>URLCOLUMN</td><td>The name of an expected resultset column containing a URL</td></tr>
-                    <tr><td>DATACOLUMN</td><td>The name of an expected resultset column containing document data</td></tr>
-                    <tr><td>STARTTIME</td><td>A query string value containing a start time in milliseconds since epoch</td></tr>
-                    <tr><td>ENDTIME</td><td>A query string value containing an end time in milliseconds since epoch</td></tr>
-                    <tr><td>IDLIST</td><td>A query string value containing a parenthesized list of document identifier values</td></tr>
-                </table>
-                <br/>
-                <p>It is often necessary to construct composite values using SQL query operators in order to create the version strings, URLs,
-                      and data which the JDBC connection type needs.  Each database has its own caveats in this regard.  Consult your database
-                      manual to be sure you are constructing your queries in a manner consistent with best practices for that database.  For example,
-                      for MySQL databases, NULL column values will prevent straightforward concatenation of results.  You might expect the following
-                      to work:</p>
-                <br/>
-                <p><code>SELECT id AS $(IDCOLUMN), CONCAT("http://my.base.url/show.html?record=", id) AS $(URLCOLUMN),
-                      CONCAT(name, " ", description, " ", what_ever) AS $(DATACOLUMN)
-                      FROM accounts WHERE id IN $(IDLIST)</code></p>
-                <br/>
-                <p>But, any NULL column values will disrupt the concatenation in MySQL, so you must instead write your query like this:</p>
-                <br/>
-                <p><code>SELECT id AS $(IDCOLUMN), CONCAT("http://my.base.url/show.html?record=", id) AS $(URLCOLUMN),
-                      CONCAT(name, " ", IFNULL(description, ""), " ", IFNULL(what_ever, "")) AS $(DATACOLUMN)
-                      FROM accounts WHERE id IN $(IDLIST)</code></p>
-                <br/>
-                <p>Also, use caution when constructing queries that include time-based
-                        components. "$(STARTTIME)" and "$(ENDTIME)" provide
-                        times in milliseconds since epoch. If the modified date field is not
-                        in this unit, the seeding query may not select the desired document
-                        identifiers. You should convert "$(STARTTIME)" and
-                        "$(ENDTIME)" to the appropriate timestamp unit for your system within your query.
-                        The following table gives several sample query fragments that can be
-                        used to convert the helper strings "$(STARTTIME)" and
-                        "$(ENDTIME)" into other date and time types. The first column names
-                        the SQL database type that the following query phrase corresponds to,
-                        the second column names the output data type for the query phrase, and
-                        the third gives the query phrase itself using "$(STARTTIME)"
-                        as an example time in milliseconds since epoch. These query phrases
-                        are intended as guidelines for creating an appropriate query phrase in
-                        each language. Each query phrase is designed to work with the most
-                        current version of the database software available at the time of
-                        publishing for this document. If your modified date field is not of
-                        the type given in the second column, the query phrase may not provide
-                        an appropriate output for date comparisons.</p>
-                <br/>
-                <table>
-                    <tr><td><b>Database Type</b></td><td><b>Date Type</b></td><td><b>Sample Query Phrase</b></td></tr>
-                    <tr><td>Oracle</td><td>date</td><td><code>TO_DATE ( '1970/01/01:00:00:00', 'yyyy/mm/dd:hh:mi:ss') + ROUND ($(STARTTIME)/86400000)</code></td></tr>
-                    <tr><td>Oracle</td><td>timestamp</td><td><code>TO_TIMESTAMP('1970-01-01 00:00:00') + interval '$(STARTTIME)/1000' second</code></td></tr>
-                    <tr><td>Postgres SQL</td><td>timestamp</td><td><code>date '1970-01-01' + interval '$(STARTTIME) milliseconds'</code></td></tr>
-                    <tr><td>MS SQL Server ($>$6.5)</td><td>datetime</td><td><code>DATEADD(ms, $(STARTTIME), '19700101')</code></td></tr>
-                    <tr><td>Sybase (10+)</td><td>datetime</td><td><code>DATEADD(ms, $(STARTTIME), '19700101')</code></td></tr>
-                </table>
-                <br/>
-                <p>When you create a job based on a general database connection, the job's queries are initially populated with examples.  These examples should give you a good idea of
-                        what columns your queries should return - in most cases, the only columns you need to return are the ones that appear in the example queries.  However,
-                        for the file data query, you may also return columns that are not specified in the example.  <strong>When you do this, the extra return column values will be passed
-                        to the index as metadata for the document.  The metadata name used will be the corresponding resultlist column name of the resultset.</strong></p>
-                <p>For example, the following file data query (written for PostgreSQL) will return documents with the metadata fields "metadata_a" and "metadata_b", in addition to the required primary
-                        document body and URL:</p>
-                <br/>
-                <p><code>SELECT id AS $(IDCOLUMN), characterdata AS $(DATACOLUMN), 'http://mydynamicserver.com?id=' || id AS $(URLCOLUMN),
-                  publisher AS metadata_a, distributor AS metadata_b FROM mytable WHERE id IN $(IDLIST)</code></p>
-                <br/>
-                <p>The "Security" tab simply allows you to add specific access tokens to all documents indexed with a general database job.  In order for you to know what tokens
-                       to add, you must decide with what authority connection these documents will be secured, and understand the form of the access tokens used by that authority connection
-                       type.  This is what the "Security" tab looks like:</p>
-                <br/>
-                <br/>
-                <figure src="images/en_US/jdbc-job-security.PNG" alt="Generic Database Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>Here, you can turn off security, if you want no access tokens to be transmitted with each document.  Or, you can leave security "Enabled", and either create a list of access tokens
-                      by hand, using the widget on this tab, or leave these blank and provide an access token query on the "Queries" tab.  To add access tokens by hand, enter a desired access token, and
-                      click the "Add" button.  You may enter multiple access tokens.</p>
-            </section>
-
-            <section id="googledriverepository">
-              <title>Google Drive Repository Connection</title>
-              <p>The Google Drive Repository Connection type allows you to index content from <a href="https://drive.google.com">Google Drives</a>.</p>
-              <p>Each Google Drive Connection manages access to a single drive repository. This means that if you have multiple Google Drives (i.e. different users),
-                you need to create a specific connection for each drive repository and provide the associated authentication information.</p>
-              <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-              <p>This connection type can index only those documents whose binary content can be obtained through the pertinent Google APIs.  At the moment,
-                  native Google documents such as Google Spreadsheet do not appear to be supported.</p>
-              <br/>
-              <p>A Google Drive connection has the following configuration parameters on the repository connection editing screen:</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-connection-configuration.PNG" alt="googledrive Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>As we can see there are 3 pieces of information which are needed to create a successful connection. The Client ID and Client Secret given by
-                Google Drive when you register your application for a development license. This is typically done through
-                the <a href="https://code.google.com/apis/console/b/0/">Google APIs Console</a>.</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-setup-1.PNG" alt="googledrive create project" width="80%"/>
-              <br/><br/>
-              <p>Once having created a project, we must enable the Google Drive API:</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-setup-2.PNG" alt="googledrive enable drive api" width="80%"/>
-              <br/><br/>
-              <p>Then going to the API Access link on the right side, we need to select create an OAuth 2.0 client ID:</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-setup-3.PNG" alt="googledrive create oauth client" width="80%"/>
-              <br/><br/>
-              <p>After filling in the necessary information, we need to select what type of application we'd like. For our purposes we need to select
-                installed application:</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-setup-4.PNG" alt="googledrive create client id" width="80%"/>
-              <br/><br/>
-              <p>Afterwards the connector requests our Client ID and Client secrets (where the red boxes are):</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-setup-5.PNG" alt="googledrive client id and secret" width="80%"/>
-              <br/><br/>
-              <p>Now each user must confirm their acceptance of allowing your application to access their google drive. This is done through a run-of-the-mill OAUTH
-                approach, but needs to be done beforehand. Once the steps are completed, a long-life refresh token is presented, which is then used by the connector.
-                For completeness, we present the needed steps below since they require some manual work.</p>
-              <br/><br/>
-              <ol>
-                  <li>Browse to here: https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly&amp;state=%2Fprofile&amp;redirect_uri=https%3A%2F%2Flocalhost&amp;response_type=code&amp;client_id=&lt;CLIENT_ID&gt;&amp;approval_prompt=force&amp;access_type=offline</li>
-                  <li>This returns a link (after acceptance), where a code is embedded in the URL: https://localhost/?state=/profile&amp;code=&lt;CODE&gt;</li>
-                  <li>Use a tool like <em>curl</em> (<a href="http://curl.haxx.se">http://curl.haxx.se</a>) to perform a POST to "https://accounts.google.com/o/oauth2/token", using the body: grant_type=authorization_code&amp;redirect_uri=https%3A%2F%2Flocalhost&amp;client_secret=&lt;CLIENT_SECRET&gt;&amp;client_id=&lt;CLIENT_ID&gt;&amp;code=&lt;CODE&gt;</li>
-              <li> The response is then a json response which contains the refresh_token.</li>
-              </ol>
-              <br/><br/>
-              <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-connection-configuration-save.PNG" alt="googledrive Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>When you configure a job to use the Google Drive repository connection an additional tab is presented. This is the "Google Drive Seed Query" tab:</p>
-              <br/><br/>
-              <figure src="images/en_US/googledrive-repository-connection-job-googledrive-seed-query.PNG" alt="googledrive Repository Connection, seed query" width="80%"/>
-              <br/><br/>
-              <p>This tab allows you to specify the query which will be used to seed documents for the indexing process. The query language is
-                specified on the <a href="https://developers.google.com/drive/search-parameters">Drive Search Parameters</a> site. Directories
-                which meet the seed query are fully crawled as the query on applies to seeds. The default query indexes the entire drive. Lastly, native Google
-                documents such as spreadsheets and word documents are exported to PDF and then ingested.</p>
-            </section>
-
-            <section id="hdfsrepository">
-                <title>HDFS Repository Connection (WGET compatible)</title>
-                <p>The HDFS repository connection operates much like the File System Repository Connection, except it reads data from the Hadoop File System rather than a
-                       local disk.  It, too, is capable of understanding directories written in the manner of the Unix utility called <em>wget</em>.  In the latter mode, the HDFS Repository Connector
-                       will parse file names that were created by <em>wget</em>, or by the wget-compatible HDFS Output Connector, and turn these back
-                       into full URL's pointing to external web content.</p>
-                <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-                <p>The HDFS repository connection type has an additional configuration tab above and beyond the standard ones, called "Server".  This is what it looks like:</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-repository-configure-server.PNG" alt="HDFS Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the HDFS name node URI, and the user name, and click the "Save" button.</p>
-                <p>Jobs created using an HDFS repository connection type
-                       have two tabs in addition to the standard repertoire: the "Hop Filters" tab, and the "Repository Paths" tab.</p>
-                <p>The "Hop Filters" tab allows you to restrict the document set by the number of child hops from the path root.  This is what it looks like:</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-job-hopcount.PNG" alt="HDFS Connection, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>In the case of the HDFS connection type, there is only one variety of relationship between documents, which is called a "child" relationship.  If you want to
-                       restrict the document set by how far away a document is from the path root, enter the maximum allowed number of hops in the text box.  Leaving the box blank
-                       indicates that no such filtering will take place.</p>
-                <p>On this same tab, you can tell the Framework what to do should there be changes in the distance from the root to a document.  The choice "Delete unreachable
-                       documents" requires the Framework to recalculate the distance to every potentially affected document whenever a change takes place.  This may require
-                       expensive bookkeeping, however, so you also have the option of  ignoring such changes.  There are two varieties of this latter option - you can ignore the changes
-                       for now, with the option of turning back on the aggressive bookkeeping at a later time, or you can decide not to ever allow changes to propagate, in which case
-                       the Framework will discard the necessary bookkeeping information permanently.</p>
-                <p>The "Repository Paths" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-job-paths.PNG" alt="HDFS Connection, Repository Paths tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to type in a set of paths which function as the roots of the crawl.  For each desired path, type in the path, select whether the root should
-                       behave as an WGET repository or not, and click the "Add" button to add it to the list.</p>
-                <p>Each root path has a set of rules which determines whether a document is included or not in the set for the job.  Once you have added the root path to the list, you
-                       may then add rules to it.  Each rule has a match expression, an indication of whether the rule is intended to match files or directories, and an action (include or exclude).
-                       Rules are evaluated from top to bottom, and the first rule that matches the file name is the one that is chosen.  To add a rule, select the desired pulldowns, type in
-                       a match file specification (e.g. "*.txt"), and click the "Add" button.</p>
-            </section>
-
-            <section id="jirarepository">
-              <title>Jira Repository Connection</title>
-              <p>The Jira Repository Connection type allows you to index tickets from <a href="http://www.atlassian.com/‎">Atlassian</a>'s <a href="http://www.atlassian.com/software/jira">Jira</a>.</p>
-              <p>This repository connection type is meant to secure documents in conjunction with the Jira Authority Connection type.  Please read the associated
-                    documentation to configure document security.</p>
-              <p>A Jira connection has the following configuration parameters on the repository connection editing screen:</p>
-              <br/><br/>
-              <figure src="images/en_US/jira-repository-connection-configuration.PNG" alt="jira Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>As we can see there are 3 pieces of information which are needed to create a successful connection. The Client ID and Client Secret
-                are the username and password of a Jira account. The JiraUrl is the base endpoint of the particular Jira Instance, for example:
-                https://searchbox.atlassian.net is the Jira version for searchbox which is hosted at Atlassian.</p>
-              <br/><br/>
-              <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-              <br/><br/>
-              <figure src="images/en_US/jira-repository-connection-configuration-save.PNG" alt="jira Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>When you configure a job to use the Jira repository connection an additional tab is presented. This is the "Seed Query" tab:</p>
-              <br/><br/>
-              <figure src="images/en_US/jira-repository-connection-job-jira-seed-query.PNG" alt="jira Repository Connection, seed query" width="80%"/>
-              <br/><br/>
-              <p>This tab allows you to specify the query which will be used to find documents for the indexing process. The query language is
-                specified on the <a href="https://confluence.atlassian.com/display/JIRA/Advanced+Searching">Jira Advanced Searching</a> site. Directories
-                which meet the seed query are fully crawled as the query only applies to seeds.</p>
-            </section>
-
-            <section id="livelinkrepository">
-                <title>OpenText LiveLink Repository Connection</title>
-                <p>The LiveLink connection type allows you to index content from LiveLink repositories.  LiveLink has a rich variety of different document types and metadata,
-                    which include basic documents, as well as compound documents, folders, workspaces, and projects.  A LiveLink connection is able to discover documents
-                    contained within all of these constructs.</p>
-                <p>Documents described by LiveLink connections are typically secured by a LiveLink authority.  If you have not yet created a LiveLink authority, but would
-                    like your documents to be secured, please follow the direction in the section titled "OpenText LiveLink Authority Connection".</p>
-                <p>A LiveLink connection has the following special tabs: "Server", "Document Access", and "Document View".  The "Server" tab allows you to select a
-                    LiveLink server to connect to, and also to provide appropriate credentials.  The "Document Access" tab describes the location of the LiveLink web interface,
-                    relative to the server, that will be used to fetch document content from LiveLink. The "Document View" tab affects how URLs to the fetched documents
-                    are constructed, for viewing results of searches.</p>
-                <p>The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-connection-server.PNG" alt="LiveLink Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the manner you want the connection to use to communicate with LiveLink.  Your options are:</p>
-                <ul>
-                  <li>Internal (native LiveLink protocol)</li>
-                  <li>HTTP (communication with LiveLink through the IIS web server)</li>
-                  <li>HTTPS (communication with LiveLink through IIS using SSL)</li>
-                </ul>
-                <p>Also, you need to enter the name of the desired LiveLink server, the LiveLink port, and the LiveLink server credentials.  If you have selected communication
-                    using HTTP or HTTPS, you must provide a relative CGI path to your LiveLink.  You may also need to provide web server credentials.  Basic authentication
-                    and older forms of NTLM are supported.  In order to use NTLM, specify a non-blank server domain name in the "Server HTTP domain" field, plus a non-
-                    qualified user name and password.  If basic authentication is desired, leave the "Server HTTP domain" field blank, and provide basic auth credentials in the
-                    "Server HTTP NTLM user name" and "Server HTTP NTLM password" fields.  For no web server authentication, leave these fields all blank.</p>
-                <p>For communication using HTTPS, you will also need to upload your authority certificate(s) on the "Server" tab, to tell the connection which certificates to
-                    trust.  Upload your certificate using the browse button, and then click the "Add" button to add it to the trust store.</p>
-                <p>The "Document Access" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-connection-document-access.PNG" alt="LiveLink Connection, Document Access tab" width="80%"/>
-                <br/><br/>
-                <p>The server name is presumed to be the same as is on the "Server" tab.  Select the desired protocol for document retrieval.  If your LiveLink server
-                    is using a non-standard HTTP port for the specified protocol for document retrieval, enter the port number.  If your LiveLink server is using NTLM
-                    authentication to access documents, enter an Active Directory user name, password, and domain.  If your LiveLink is using HTTPS, browse locally
-                    for the appropriate certificate authority certificate, and click "Add" to upload that certificate to the connection's trust store.  (You may also use the server's
-                    certificate, but that is less resilient because the server's certificate may be changed periodically.)</p>
-                <p>The "Document View" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-connection-document-view.PNG" alt="LiveLink Connection, Document Viewtab" width="80%"/>
-                <br/><br/>
-                <p>If you want each document's view URL to be the same as its access URL, you can leave this tab unchanged.  If you want to direct users to a different
-                    CGI path when they view search results, you can specify that here.</p>
-                <p>When you are done, click the "Save" button.  You will see a summary screen that looks something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-connection-status.PNG" alt="LiveLink Connection Status" width="80%"/>
-                <br/><br/>
-                <p>Make note of and correct any reported connection errors.  In this example, the connection has been correctly set up, so the connection status is
-                    "Connection working".</p>
-                <p></p>
-                <p>A job created to use a LiveLink connection has the following additional tabs associated with it: "Paths", "Filters", "Security", and "Metadata".</p>
-                <p>The "Paths" tab allows you to manage a list of LiveLink paths that act as starting points for indexing content:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-job-paths.PNG" alt="LiveLink Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>Build each path by selecting from the available dropdown, and clicking the "+" button.  When your path is complete, click the "Add" button to add the path
-                    to the list of starting points.</p>
-                <p>The "Filters" tab controls the criteria the LiveLink job will use to include or exclude content.  The filters are basically a list of rules.  Each rule has a
-                    document match field, and a matching action ("Include" or "Exclude").  When a LiveLink connection encounters a document, it evaluates the rules from
-                    top to bottom.  If the rule matches, then it will be included or excluded from the job's document set depending on what you have selected for the
-                    matching action. A rule's match field specifies a character match, where "*" will match any number of characters, and "?" will match any single character.</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-job-filters.PNG" alt="LiveLink Job, Filters tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the match field value, select the match action, and click the "Add" button to add to the list of filters.</p>
-                <p>The "Security" tab allows you to disable (or enable) LiveLink security for the documents associated with this job:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-job-security.PNG" alt="LiveLink Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>If you disable security, you can add your own access tokens to all
-                    jobs in the document set as they are indexed.  The format of the access tokens you would enter depends on the governing authority associated with the
-                    job's repository connection. Enter a token and click the "Add" button to add it to the list.</p>
-                <p>The "Metadata" tab allows you to select what specific metadata values from LiveLink you want to pass to the index:</p>
-                <br/><br/>
-                <figure src="images/en_US/livelink-job-metadata.PNG" alt="LiveLink Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>If you want to pass all available LiveLink metadata to the index, then click the "All metadata" radio button.  Otherwise, you need to build LiveLink
-                    metadata paths and add them to the metadata list. Select the next metadata path segment, and click the appropriate "+" button to add it to the path.
-                    You may add folder information, or a metadata category, at any point.</p>
-                <p>Once you have drilled down to a metadata category, you can select the metadata attributes to include, or check the "All attributes in this category"
-                    checkbox.  When you are done, click the "Add" button to add the metadata attributes that you want to include in the index.</p>
-                <p>You can also use the "Metadata" tab to have the connection send path data along with each document, as a piece of document metadata.  To enable
-                    this feature, enter the name of the metadata attribute you want this information to be sent into the "Path attribute name" field.  Then, add the rules you
-                    want to the list of rules.  Each rule has a match expression, which is a regular expression where parentheses ("(" and ")") mark sections you are
-                    interested in.  These sections are called "groups" in regular expression parlance.  The replace string consists of constant text plus
-                    substitutions of the groups from the match, perhaps modified.  For example, "$(1)" refers to the first group within the match, while "$(1l)" refers to the
-                    first match group mapped to lower case.  Similarly, "$(1u)" refers to the same characters, but mapped to upper case.</p>
-                <p>For example, suppose you had a rule which had ".*/(.*)/(.*)/.*" as a match expression, and "$(1) $(2)" as the replace string.  If presented with the path
-                    <code>Project/Folder_1/Folder_2/Filename</code>, it would output the string <code>Folder_1 Folder_2</code>.</p>
-                <p>If more than one rule is present, the rules are all executed in sequence.  That is, the output of the first rule is modified by the second rule, etc.</p>
-            </section>
-
-            <section id="meridiorepository">
-                <title>Autonomy Meridio Repository Connection</title>
-                <p>An Autonomy Meridio connection allows you to index documents from a set of Meridio servers.  Meridio's architecture allows you to separate services on multiple machines -
-                    e.g. the document services can run on one machine, and the records services can run on another.  A Meridio connection type correspondingly is configured to describe each
-                    Meridio service independently.</p>
-                <p>Documents described by Meridio connections are typically secured by a Meridio authority.  If you have not yet created a Meridio authority, but would like your
-                    documents to be secured, please follow the direction in the section titled "Autonomy Meridio Authority Connection".</p>
-                <p>A Meridio connection has the following special tabs on the repository connection editing screen: the "Document Server" tab, the "Records Server" tab, the "Web Client" tab,
-                    and the "Credentials" tab.  The "Document Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-connection-document-server.PNG" alt="Meridio Connection, Document Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the correct protocol, and enter the correct server name, port, and location to reference the Meridio document server services.  If a proxy is involved, enter the proxy host
-                    and port.  Authenticated proxies are not supported by this connection type at this time.</p>
-                <p>Note that, in the Meridio system, while it is possible that different services run on different servers, this is not typically the case.  The connection type, on the other hand, makes
-                    no assumptions, and permits the most general configuration.</p>
-                <p>The "Records Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-connection-records-server.PNG" alt="Meridio Connection, Records Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select the correct protocol, and enter the correct server name, port, and location to reference the Meridio records server services.  If a proxy is involved, enter the proxy host
-                    and port.  Authenticated proxies are not supported by this connection type at this time.</p>
-                <p>Note that, in the Meridio system, while it is possible that different services run on different servers, this is not typically the case.  The connection type, on the other hand, makes
-                    no assumptions, and permits the most general configuration.</p>
-                <p>The "Web Client" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-connection-web-client.PNG" alt="Meridio Connection, Web Client tab" width="80%"/>
-                <br/><br/>
-                <p>The purpose of the Meridio Connection web client tab is to allow the connection to build a useful URL for each document it indexes.
-                    Select the correct protocol, and enter the correct server name, port, and location to reference the Meridio web client service.  No proxy information is required, as no documents
-                    will be fetched from this service.</p>
-                <p>The "Credentials" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-connection-credentials.PNG" alt="Meridio Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the Meridio server credentials needed to access the Meridio system.</p>
-                <p>When you are done, click the "Save" button to save the connection.  You will see a summary screen, looking something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/meridio-connection-status.PNG" alt="Meridio Connection Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the Meridio connection is not actually correctly configured, which is leading to an error status message instead of "Connection working".</p>
-                <p>Since Meridio uses Windows IIS for authentication, there are many ways in which the configuration of either IIS or the Windows domain under which Meridio runs can affect
-                    the correct functioning of the Meridio connection.  It is beyond the scope of this manual to describe the kinds of analysis and debugging techniques that might be required to diagnose connection
-                    and authentication problems.  If you have trouble, you will almost certainly need to involve your Meridio IT personnel.  Debugging tools may include (but are not limited to):</p>
-                <br/>
-                <ul>
-                    <li>Windows security event logs</li>
-                    <li>ManifoldCF logs (see below)</li>
-                    <li>Packet captures (using a tool such as WireShark)</li>
-                </ul>
-                <br/>
-                <p>If you need specific ManifoldCF logging information, contact your system integrator.</p>
-                <p></p>
-                <p>Jobs based on Meridio connections have the following special tabs: "Search Paths", "Content Types", "Categories", "Data Types", "Security", and "Metadata".</p>
-                <p>More here later</p>
-            </section>
-
-            <section id="rssrepository">
-                <title>Generic RSS Repository Connection</title>
-                <p>The RSS connection type is specifically designed to crawl RSS feeds.  While the Web connection type can also extract links from RSS feeds, the RSS connection type
-                       differs in the following ways:</p>
-                <br/>
-                <ul>
-                    <li>Links are <b>only</b> extracted from feeds</li>
-                    <li>Feeds themselves are not indexed</li>
-                    <li>There is fine-grained control over how often feeds are refetched, and they are treated distinctly from documents in this regard</li>
-                    <li>The RSS connection type knows how to carry certain data down from the feeds to individual documents, as metadata</li>
-                </ul>
-                <br/>
-                <p>Many users of the RSS connection type set up their jobs to run continuously, configuring their jobs to never refetch documents, but rather to expire them after some 30 days.
-                       This model works reasonably well for news, which is what RSS is often used for.</p>
-                <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-                <p>An RSS connection has the following special tabs: "Email", "Robots", "Bandwidth", and "Proxy".  The "Email" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-configure-email.PNG" alt="RSS Connection, Email tab" width="80%"/>
-                <br/><br/>
-                <p>Enter an email address.  This email address will be included in all requests made by the RSS connection, so that webmasters can report any difficulties that their
-                       sites experience as the result of improper throttling, etc.</p>
-                <p>This field is mandatory.  While an RSS connection makes no effort to validate the correctness of the email
-                       field, you will probably want to remain a good web citizen and provide a valid email address.  Remember that it is very easy for a webmaster to block access to
-                       a crawler that does not seem to be behaving in a polite manner.</p>
-                <p>The "Robots" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-configure-robots.PNG" alt="RSS Connection, Robots tab" width="80%"/>
-                <br/><br/>
-                <p>Select how the connection will interpret robots.txt.  Remember that you have an interest in crawling people's sites as politely as is possible.</p>
-                <p>The "Bandwidth" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-configure-bandwidth.PNG" alt="RSS Connection, Bandwidth tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to control the <b>maximum</b> rate at which the connection fetches data, on a per-server basis, as well as the <b>maximum</b> fetches
-                       per minute, also per-server.  Finally, the maximum number of socket connections made per server at any one time is also controllable by this tab.</p>
-                <p>The screen shot displays parameters that are considered reasonably polite.  The default values for this table are all blank, meaning that, by default, there is no
-                       throttling whatsoever!  Please do not make the mistake of crawling other people's sites without adequate politeness parameters in place.</p>
-                <p>The "Throttle group" parameter allows you to treat multiple RSS-type connections together, for the purposes of throttling.  All RSS-type connections that
-                       have the same throttle group name will use the same pool for throttling purposes.</p>
-                <p>The "Bandwidth" tab is related to the throttles that you can set on the "Throttling" tab in the following ways:</p>
-                <br/>
-                <ul>
-                    <li>The "Bandwidth" tab sets the <b>maximum</b> values, while the "Throttling" tab sets the <b>average</b> values.</li>
-                    <li>The "Bandwidth" tab does not affect how documents are scheduled in the queue; it simply blocks documents until it is safe to go ahead, which will use up a
-                          crawler thread for the entire period that both the wait and the fetch take place.  The "Throttling" tab affects how often documents are scheduled, so it does
-                          not waste threads.</li>
-                </ul>
-                <br/>
-                <p>Because of the above, we suggest that you configure your RSS connection using <b>both</b> the "Bandwidth" <b>and</b> the "Throttling" tabs.  Select maximum
-                       values on the "Bandwidth" tab, and corresponding average values estimates on the "Throttling" tab.  Remember that a document identifier for an RSS connection is the
-                       document's URL, and the bin name for that URL is the server name.  Also, please note that the "Maximum number of connections per JVM" field's default value
-                       of 10 is unlikely to be correct for connections of the RSS type; you should have at least one available connection per worker thread, for best performance.  Since the
-                       default number of worker threads is 30, you should set this parameter to at least a value of 30 for normal operation.</p>
-                <p>The "Proxy" tab allows you to specify a proxy that you want to crawl through.  The RSS connection type supports proxies that are secured with all forms of the NTLM
-                       authentication method.  This is quite typical of large organizations.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-configure-proxy.PNG" alt="RSS Connection, Proxy tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the proxy server you will be proxying through in the "Proxy host" field.  Enter the proxy port in the "Proxy port" field.  If your server is authenticated, enter the
-                       domain, username, and password in the corresponding fields.  Leave all fields blank if you want to use no proxy whatsoever.</p>
-                <p>When you save your RSS connection, you should see a status screen that looks something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-status.PNG" alt="RSS Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>Jobs created using connections of the RSS type have the following additional tabs: "URLs", "Canonicalization", "URL mappings", "Exclusions", "Time Values",
-                       "Security", "Metadata", and "Dechromed Content".  The URLs tab is where you describe the feeds that are part of the job.  It looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-urls.PNG" alt="RSS job, URLs tab" width="80%"/>
-                <br/><br/>
-                <p>Enter the list of feed URLs you want to crawl, separated by newlines.  You may also have comments by starting lines with ("#") characters.</p>
-                <p>The "Canonicalization" tab controls how the job handles url canonicalization.  Canonicalization refers to the fact that many different URLs may all refer to the
-                       same actual resource.  For example, arguments in URLs can often be reordered, so that <code>a=1&amp;b=2</code> is in fact the same as
-                       <code>b=2&amp;a=1</code>.  Other canonical operations include removal of session cookies, which some dynamic web sites include in the URL.</p>
-                <p>The "Canonicalization" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-canonicalization.PNG" alt="RSS job, Canonicalization tab" width="80%"/>
-                <br/><br/>
-                <p>The tab displays a list of canonicalization rules.  Each rule consists of a regular expression (which is matched against a document's URL), and some switch selections.
-                       The switch selections allow you to specify whether arguments are reordered, or whether certain specific kinds of session cookies are removed.  Specific kinds of
-                       session cookies that are recognized and can be removed are: JSP (Java applications servers), ASP (.NET), PHP, and Broadvision (BV).</p>
-                <p>If a URL matches more than one rule, the first matching rule is the one selected.</p>
-                <p>To add a rule, enter an appropriate regular expression, and make your checkbox selections, then click the "Add" button.</p>
-                <p>The "Mappings" tab permits you to change the URL under which documents that are fetched will get indexed.  This is sometimes useful in an intranet setting because
-                       the crawling server might have open access to content, while the users may have restricted access through a somewhat different URL.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-mappings.PNG" alt="RSS job, Mappings tab" width="80%"/>
-                <br/><br/>
-                <p>The "Mappings" tab uses the same regular expression/replacement string paradigm as is used by many connection types running under the Framework.
-                       The mappings consist of a list of rules.  Each rule has a match expression, which is a regular expression where parentheses ("("
-                       and ")") mark sections you are interested in.  These sections are called "groups" in regular expression parlance.  The replace string consists of constant text plus
-                       substitutions of the groups from the match, perhaps modified.  For example, "$(1)" refers to the first group within the match, while "$(1l)" refers to the first match group
-                       mapped to lower case.  Similarly, "$(1u)" refers to the same characters, but mapped to upper case.</p>
-                <p>For example, suppose you had a rule which had "http://(.*)/(.*)/" as a match expression, and "http://$(2)/" as the replace string.  If presented with the path
-                       <code>http://Server/Folder_1/Filename</code>, it would output the string <code>http://Folder_1/Filename</code>.</p>
-                <p>If more than one rule is present, the rules are all executed in sequence.  That is, the output of the first rule is modified by the second rule, etc.</p>
-                <p>To add a rule, fill in the match expression and output string, and click the "Add" button.</p>
-                <p>The "Exclusions" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-exclusions.PNG" alt="RSS job, Exclusions tab" width="80%"/>
-                <br/><br/>
-                <p>Here you can enter a set of regular expressions, one per line, which describe which document URLs to exclude from the job.  This can be very helpful if you
-                     are crawling RSS feeds that include a variety of content where you only want to index a subset of the content.</p>
-                <p>The "Time Values" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-time-values.PNG" alt="RSS job, Time Values tab" width="80%"/>
-                <br/><br/>
-                <p>Fill in the desired time values.  A description of each value is below.</p>
-                <table>
-                    <tr><td><b>Value</b></td><td><b>Description</b></td></tr>
-                    <tr><td>Feed connect timeout</td><td>How long to wait, in seconds, before giving up, when trying to connect to a server</td></tr>
-                    <tr><td>Default feed refetch time</td><td>If a feed specifies no refetch time, this is the time to use instead (in minutes)</td></tr>
-                    <tr><td>Minimum feed refetch time</td><td>Never refetch feeds faster than this specified time, regardless of what the feed says (in minutes)</td></tr>
-                    <tr><td>Bad feed refetch time</td><td>How long to wait before trying to refetch a feed that contains parsing errors (in minutes, empty is infinity)</td></tr>
-                </table>
-                <p>The "Security" tab allows you to assign access tokens to the documents indexed with this job.  In order to use it, you must first decide what authority connection to use
-                       to secure these documents, and what the access tokens from that authority connection look like.  The tab itself looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-security.PNG" alt="RSS job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>To add an access token, fill in the text box with the access token value, and click the "Add" button.  If there are no access tokens, security will be considered
-                       to be "off" for the job.</p>
-                <p>The "Metadata" tab allows you to specify arbitrary metadata to be indexed along with every document from this job.  Documents from connections of the RSS type
-                       already receive some metadata having to do with the feed that referenced them.  Specifically:</p>
-                <table>
-                    <tr><td><b>Name</b></td><td><b>Meaning</b></td></tr>
-                    <tr><td>PubDate</td><td>This contains the document origination time, in milliseconds since Jan 1, 1970.  The date is either obtained from the feed, or if it is
-                                                                absent, the date of fetch is included instead.</td></tr>
-                    <tr><td>Source</td><td>This is the name of the feed that referred to the document.</td></tr>
-                    <tr><td>Title</td><td>This is the title of the document within the feed.</td></tr>
-                    <tr><td>Category</td><td>This is the category of the document within the feed.</td></tr>
-                </table>
-                <p>The "Dechromed Content" tab allows you to index the description of the content from the feed, instead of the document's contents.  This is helpful when the
-                       description of the documents in the feeds you are crawling is sufficient for indexing purposes, and the actual documents are full of navigation clutter or "chrome".
-                       The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/rss-job-dechromed-content.PNG" alt="RSS job, Dechromed Content tab" width="80%"/>
-                <br/><br/>
-                <p>Select the mode you want the connection to operate in.</p>
-            </section>
-
-            <section id="sharepointrepository">
-                <title>Microsoft SharePoint Repository Connection</title>
-                <p>The Microsoft SharePoint connection type allows you to index documents from a Microsoft SharePoint site.  Bear in mind that a single SharePoint
-                    installation actually represents a set of sites.  Some sites in SharePoint are directly related to others (e.g. they are subsites), while some sites operate
-                    relatively independently of one another.</p>
-                <p>The SharePoint connection type is designed so that one SharePoint repository connection can access all SharePoint sites from a specific root site
-                    though its explicit subsites.  It is the case that it is desirable in some very large SharePoint installations to access <b>all</b> SharePoint sites using
-                    a single connection.  But the ManifoldCF SharePoint connection type does not support that model as of yet.  If this functionality is important for you,
-                    contact your system integrator.</p>
-                <p>Documents described by SharePoint connections can be secured in either one of two ways.  Either you can choose to secure documents using Active
-                    Directory SIDs (in which case, you must use the Active Directory authority type), or you may choose to use native SharePoint groups and users for
-                    authorization.  The latter <strong>must</strong> be used in the following cases:</p>
-                <br/>
-                <ul>
-                  <li>You have native SharePoint groups or users created which do not correspond to Active Directory SIDs</li>
-                  <li>Your SharePoint 2010 is configured to use Claims Based authorization mode</li>
-                  <li>You have ActiveDirectory groups that have more than roughly 1000 members</li>
-                </ul>
-                <br/>
-                <p>In general, native SharePoint authorization is the preferred model, except in legacy situations.  If you choose to use native SharePoint authorization, you
-                    will need to define one or more authorities of type "SharePoint/XXX" associated with the same authority group as your SharePoint connection.  Please read
-                    the sections of this manual that describe how to configure SharePoint/Native and SharePoint/AD authorities.  Bear in mind that SharePoint when configured
-                    to run in Claim
-                    Space mode (available starting in SharePoint 2010) uses a federated authorization model, so you should expect to create more than one authority when
-                    working with a SharePoint Claims Based installation.  If your SharePoint is not using Claims Based authorization, then a single authority of type "SharePoint/Native" is
-                    sufficient.</p>
-                <p>If you wish to use the legacy support for the Active Directory authority, then read the section titled "Active Directory Authority Connection" instead.</p>
-                <p>A SharePoint connection has two special tabs on the repository connection editing screen: the "Server" tab, and the "Authority type" tab.  The "Server"
-                    tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepoint-configure-server.PNG" alt="SharePoint Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Select your SharePoint server version from the pulldown.  If you do not select the correct server version, your documents may either be indexed with
-                    insufficient security protection, or you may not be able to index any documents.  Check with your SharePoint system administrator if you are not sure
-                    what to select.</p>
-                <p>SharePoint uses a web URL model for addressing sites, subsites, libraries, and files.  The best way to figure out how to set up a SharePoint connection
-                    type is therefore to start with your web browser, and visit the topmost root of the site you wish to crawl.  Then, record the URL you see in your browser.</p>
-                <p>Select the server protocol, and enter the server name and port, based on what you recorded from the URL for your SharePoint site.  For the "Site path"
-                    field, type in the portion of the root site URL that includes everything after the server and port, except for the final "aspx" file.  For example, if the SharePoint
-                    URL is "http://myserver:81/sites/somewhere/index.asp", the site path would be "/sites/somewhere".</p>
-                <p>The SharePoint credentials are, of course, what you used to log into your root site.  The SharePoint connection type always requires the user name to be
-                    in the form "domain\user".</p>
-                <p>If your SharePoint server is using SSL, you will need to supply enough certificates for the connection's trust store so that the SharePoint server's SSL
-                    server certificate can be validated.  This typically consists of either the server certificate, or the certificate from the authority that signed the server certificate.
-                    Browse to the local file containing the certificate, and click the "Add" button.</p>
-                <p>The SharePoint connection "Authority type" tab allows you to select the authorization model used by the connection.  It looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepoint-configure-authoritytype.PNG" alt="SharePoint Connection, Authority type tab" width="80%"/>
-                <br/><br/>
-                <p>Select the authority model you wish to use.</p>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepoint-status.PNG" alt="SharePoint Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the SharePoint connection is not actually referencing a SharePoint instance, which is leading to an error status message instead of
-                    "Connection working".</p>
-                <p>Since SharePoint uses Windows IIS for authentication, there are many ways in which the configuration of either IIS or the Windows domain under which
-                    SharePoint runs can affect the correct functioning of the SharePoint connection.  It is beyond the scope of this manual to describe the kinds of analysis and
-                    debugging techniques that might be required to diagnose connection and authentication problems.  If you have trouble, you will almost certainly need to involve
-                    your SharePoint IT personnel.  Debugging tools may include (but are not limited to):</p>
-                <br/>
-                <ul>
-                    <li>Windows security event logs</li>
-                    <li>ManifoldCF logs (see below)</li>
-                    <li>Packet captures (using a tool such as WireShark)</li>
-                </ul>
-                <br/>
-                <p>If you need specific ManifoldCF logging information, contact your system integrator.</p>
-                <p></p>
-                <p>When you configure a job to use a repository connection of the generic database type, several additional tabs are presented.  These are, in order, "Paths", "Security", and "Metadata".</p>
-                <p>The "Paths" tab allows you to build a list of rules describing the SharePoint content that you want to include in your job.  When the SharePoint connection type encounters a subsite,
-                    library, list, or file, it looks through this list of rules to determine whether to include the subsite, library, list, or file.  The first matching rule will determine what will be done.</p>
-                <p>Each rule consists of a path, a rule type, and an action.  The actions are "Include" and "Exclude".  The rule type tells the connection what kind of SharePoint entity it is allowed to exactly match.  For
-                    example, a "File" rule will only exactly match SharePoint paths that represent files - it cannot exactly match sites or libraries.  The path itself is just a sequence of characters, where the "*" character
-                    has the special meaning of being able to match any number of any kind of characters, and the "?" character matches exactly one character of any kind.</p>
-                <p>The rule matcher extends strict, exact matching by introducing a concept of implicit inclusion rules.  If your rule action is "Include", and you specify (say) a "File" rule, the matcher presumes
-                    implicit inclusion rules for the corresponding site and library.  So, if you create an "Include File" rule that matches (for example) "/MySite/MyLibrary/MyFile", there is an implied "Site Include" rule
-                    for "/MySite", and an implied "Library Include" rule for "/MySite/MyLibrary".  Similarly, if you create a "Library Include" rule, there is an implied "Site Include" rule that corresponds to it.
-                    Note that these shortcuts only applies to "Include" rules - there are no corresponding implied "Exclude" rules.</p>
-                <p>The "Paths" tab allows you to build these rules one at a time, and add them either to the bottom of the list, or insert them into the list of rules at any point.  Either way, you construct the rule
-                    you want to append or insert by first constructing the path, from left to right, using your choice of text and context-dependent pulldowns with existing server path information listed.  This is what the tab
-                    may look like for you.  Bear in mind that if you are using a connection that does not display the status, "Connection working", you may not see the selections you should in these pulldowns:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepoint-job-paths.PNG" alt="SharePoint Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>To build a rule, first build the rule's matching path.  Make an appropriate selection or enter desired text, then click either the "Add Site", "Add Library", "Add List", or "Add Text" button, depending on your choice.
-                    Repeat this process until the path is what you want it to be.  At this point, if the SharePoint connection does not know what kind of entity your path describes, you will need to select the
-                    SharePoint entity type that you want the rule to match also.  Select whether this is an include or exclude rule.  Then, click the "Add New Rule" button, to add your newly-constructed rule
-                    at the end of the list.</p>
-                <p>The "Security" tab allows you to specify whether SharePoint's security model should be applied to this set of documents, or not.  You also have the option of applying some specified set of access
-                    tokens to the documents described by the job.  The tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepoint-job-security.PNG" alt="SharePoint Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>Select whether SharePoint security is on or off using the radio buttons provided.  If security is off, you may add access tokens in the text box and click the "Add" button.  The access tokens must
-                    be in the proper form expected by the authority that governs your SharePoint connection for this feature to be useful.</p>
-                <p>The "Metadata" tab allows you to specify what metadata will be included for each document.  The tab is similar to the "Paths" tab, which you may want to review above:</p>
-                <br/><br/>
-                <figure src="images/en_US/sharepoint-job-metadata.PNG" alt="SharePoint Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>The main difference is that instead of rules that include or exclude individual sites, libraries, lists, or documents, the rules describe inclusion and exclusion of document or list item metadata.  Since metadata is associated
-                    with files and list items, all of the metadata rules are applied only to file paths and list item paths, and there are no such things as "site" or "library" metadata path rules.</p>
-                <p>If an exclusion rule matches a file's path, it means that <b>no</b> metadata from that file will be included at all.  There is no way to individually exclude a single field using an exclusion rule.</p>
-                <p>To build a rule, first build the rule's matching path.  Make an appropriate selection or enter desired text, then click either the "Add Site", "Add Library", "Add List", or "Add Text" button, depending on your choice.
-                    Repeat this process until the path is what you want it to be.  Select whether this is an include or exclude rule.  Either check the box for "Include all metadata", or select the metadata you want to include
-                    from the pulldown.  (The choices of metadata fields you are presented with are determined by which SharePoint library is selected.  If your rule path does not uniquely specify a library, you cannot select individual
-                    fields to include.  You can only select "All metadata".)  Then, click the "Add New Rule" button, to put your newly-constructed rule
-                    at the end of the list.</p>
-                <p>You can also use the "Metadata" tab to have the connection send path data along with each document, as a piece of document metadata.  To enable this feature, enter the name of the metadata
-                    attribute you want this information to be sent into the "Attribute name" field.  Then, add the rules you want to the list of rules.  Each rule has a match expression, which is a regular expression where
-                    parentheses ("(" and ")") mark sections you are interested in.  These sections are called "groups" in regular expression parlance.  The replace string consists of constant text plus
-                    substitutions of the groups from the match, perhaps modified.  For example, "$(1)" refers to the first group within the match, while "$(1l)" refers to the first match group
-                    mapped to lower case.  Similarly, "$(1u)" refers to the same characters, but mapped to upper case.</p>
-                <p>For example, suppose you had a rule which had ".*/(.*)/(.*)/.*" as a match expression, and "$(1) $(2)" as the replace string.  If presented with the path
-                    <code>Project/Folder_1/Folder_2/Filename</code>, it would output the string <code>Folder_1 Folder_2</code>.</p>
-                <p>If more than one rule is present, the rules are all executed in sequence.  That is, the output of the first rule is modified by the second rule, etc.</p>
-                <br/>
-                <p><b>Example: How to index a SharePoint 2010 Document Library</b></p>
-                <p></p>
-                <p>Let's say we want to index a Document Library named Documents. The following URL displays contents of the library : http://iknow/Documents/Forms/AllItems.aspx</p>
-                <figure src="images/en_US/documents-library-contents.png" alt="Documents Library Contents"/>
-                <p>Note that there exists eight folders and one file in our library. Some folders have sub-folders. And leaf folders contain files. The following <b>single</b> Path Rule is sufficient to index <b>all</b> files in Documents library.</p>
-                <figure src="images/en_US/documents-library-path-rule.png" alt="Documents Library Path Rule"/>
-                <p>If we click Library Tools > Library > Modify View, we will see complete list of all available metadata.</p>
-                <figure src="images/en_US/documents-library-all-metadata.png" alt="Documents Library All Metadata"/>
-                <p>ManifoldCF's UI also displays all available Document Libraries and their associated metadata too. Using this pulldown, you can select which fields you want to index.</p>
-                <figure src="images/en_US/documents-library-metadata.png" alt="Documents Library Selected Metadata"/>
-                <p>To create the metadata rule below, click Metadata tab in Job settings. Select Documents from --Select library-- and "Add Library" button. As soon as you have done this, all available metadata will be listed.
-                     Enter * in the textbox which is right of the Add Text button. And click Add Text button. When you have done this Path Match becomes /Documents/*. After this you can multi select list of metadata.
-                     This action will populate Fields with CheckoutUser, Created, etc. Click Add New Rule button. This action will add this new rule to your Metadata rules.</p>
-                <figure src="images/en_US/documents-library-metadata-rule.png" alt="Documents Library Metadata Rule"/>
-                <p>Finally click the "Save" button at the bottom of the page. You will see a page looking something like this:</p>
-                <figure src="images/en_US/documents-library-summary.png" alt="Documents Library Summary Page"/>
-                <br/>
-                <p><b>Some Final Notes</b></p>
-                <ul>
-                    <li>If you don't add * to Patch match rule, your selected fields won't be used. In other words Path match rule <b>/Documents</b> won't match the document <i>/Documents/ik_docs/diger/sorular.docx</i> </li>
-                    <li>We can include all metadata using the checkbox. (without selecting from the pulldown list)</li>
-                    <li>If we were to index only docx files, our Patch match rule would be <b>/Documents/*.docx</b></li>
-                </ul>
-                <br/>
-
-                <p><b>Example: How to index SharePoint 2010 Lists</b></p>
-                <p></p>
-                <p>Lists are a key part of the architecture of Windows SharePoint Services. A document library is another form of a list, and while it has many similar properties to a standard list, it also includes additional
-                     functions to enable document uploads, retrieval, and other functions to support document management and collaboration. <a href="http://msdn.microsoft.com/en-us/library/dd490727%28v=office.12%29.aspx">[1]</a> </p>
-            	<p>An item added to a document library (and other libraries) must be a file. You can't have a library without a file. A list on the other hand doesn't have a file, it is just a piece of data, just like SQL Table.</p>
-                <p>Let's say we want to index a List named IKGeneralFAQ. The following URL displays contents of the list : http://iknow/Lists/IKGeneralFAQ/AllItems.aspx</p>
-                <figure src="images/en_US/faq-list-contents.png" alt="IKGeneralFAQ List Contents"/>
-                <p>Note that the Lists do not have files. It looks like an Excel spreadsheet. In ManifoldCF Job Settings, Path tab displays all available Lists. It lets you to select the name of the list you want to index.</p>
-                <figure src="images/en_US/add-list.png" alt="Add List"/>
-                <p>After we select IKGeneralFAQ, hit Add List button and Save button, we have the following Path Rule:</p>
-                <figure src="images/en_US/faq-list-path-rule.png" alt="IKGeneralFAQ List Path Rule"/>
-                <p>The above <b>single</b> Path Rule is sufficient to index content of IKGeneralFAQ List. Note that unlike the document libraries, we don't need * here.</p>
-                <p>If we click List Tools > List > Modify View we will see complete list of all available metadata.</p>
-                <figure src="images/en_US/faq-list-all-metadata.png" alt="IKGeneralFAQ List All Metadata"/>
-                <p>ManifoldCF's Metadata UI also displays all available Lists and their associated metadata too. Using this pulldown, you can select which fields you want to index.</p>
-                <figure src="images/en_US/faq-list-metadata.png" alt="IKGeneralFAQ List Selected Metadata"/>
-                <p>To create the metadata rule below, click Metadata tab in Job settings. Select IKGeneralFAQ from --Select list-- and "Add List" button. As soon as you have done this, all available metadata will be listed.
-                     After this you can multi select list of metadata. This action will populate Fields with ID, IKFAQAnswer, IKFAQPage, IKFAQPageID, etc. Click Add New Rule button. This action will add this new rule to your Metadata rules.</p>
-                <figure src="images/en_US/faq-list-metadata-rule.png" alt="IKGeneralFAQ List Metadata Rule"/>
-                <p>Finally click the "Save" button at the bottom of the page. You will see a page looking something like this:</p>
-                <figure src="images/en_US/faq-list-summary.png" alt="IKGeneralFAQ List Summary Page"/>
-                <br/>
-                <p><b>Some Final Notes</b></p>
-                <ul>
-                    <li>Note that, when specifying Metadata rules, UI automatically adds * to Path match rule for Lists. This is not the case with Document Libraries.</li>
-                    <li>We can include all metadata using the checkbox. (without selecting from the pulldown list)</li>
-                </ul>
-            </section>
-
-            <section id="webrepository">
-                <title>Generic Web Repository Connection</title>
-                <p>The Web connection type is effectively a reasonably full-featured web crawler.  It is capable of handling most kinds of authentication (basic, all forms of NTLM,
-                       and session-based), and can extract links from the following kinds of documents:</p>
-                <br/>
-                <ul>
-                    <li>Text</li>
-                    <li>HTML</li>
-                    <li>Generic XML</li>
-                    <li>RSS feeds</li>
-                </ul>
-                <br/>
-                <p>The Web connection type differs from the RSS connection type in the following respects:</p>
-                <br/>
-                <ul>
-                    <li>Feeds are indexed, if the output connection accepts them</li>
-                    <li>Links are extracted from all documents, not just feeds</li>
-                    <li>Feeds are treated just like any other kind of document - you cannot control how often they refetch independently</li>
-                    <li>There is support for limiting crawls based on hop count</li>
-                    <li>There is support for controlling exactly what URLs are considered part of the set, and which are excluded</li>
-                </ul>
-                <br/>
-                <p>In other words, the Web connection type is neither as easy to configure, nor as well-targeted in its separation of links and data, as the RSS connection type.  For that
-                       reason, we strongly encourage you to consider using the RSS connection type for all applications where it might reasonably apply.</p>
-                <p>Many users of the Web connection type set up their jobs to run continuously, configuring their jobs to occasionally refetch documents, or to not refetch documents
-                       ever, and expire them after some period of time.</p>
-                <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-                <p>A Web connection has the following special tabs: "Email", "Robots", "Bandwidth", "Access Credentials", and "Certificates".  The "Email" tab
-                       looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-email.PNG" alt="Web Connection, Email tab" width="80%"/>
-                <br/><br/>
-                <p>Enter an email address.  This email address will be included in all requests made by the Web connection, so that webmasters can report any difficulties that their
-                       sites experience as the result of improper throttling, etc.</p>
-                <p>This field is mandatory.  While a Web connection makes no effort to validate the correctness of the email
-                       field, you will probably want to remain a good web citizen and provide a valid email address.  Remember that it is very easy for a webmaster to block access to
-                       a crawler that does not seem to be behaving in a polite manner.</p>
-                <p>The "Robots" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-robots.PNG" alt="Web Connection, Robots tab" width="80%"/>
-                <br/><br/>
-                <p>Select how the connection will interpret robots.txt and &lt;meta name=&quot;robots ...&gt; tags on HTML pages.  Remember that you have an interest in crawling people's sites as politely as is possible.</p>
-                <p>The "Bandwidth" tab allows you to specify a list of bandwidth rules.  Each rule has a regular expression matched against a URL's throttle bin.
-                       Throttle bins, in connections of the Web type, are simply the server name part of the URL.  Each rule allows you to select a maximum bandwidth, number of
-                       connections, and fetch rate.  You can have as many rules as you like; if a URL matches more than one rule, then the most conservative value will be used.</p>
-                <p>This is what the "Bandwidth" tab looks like:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-bandwidth.PNG" alt="Web Connection, Bandwidth tab" width="80%"/>
-                <br/><br/>
-                <p>The screen shot shows the tab configured with a setting that is reasonably polite.  The default value for this tab is blank, meaning that, by default, there is no throttling
-                       whatsoever!  Please do not make the mistake of crawling other people's sites without adequate politeness parameters in place.</p>
-                <p>To add a rule, fill in the regular expression and the appropriate rule limit values, and click the "Add" button.</p>
-                <p>The "Bandwidth" tab is related to the throttles that you can set on the "Throttling" tab in the following ways:</p>
-                <br/>
-                <ul>
-                    <li>The "Bandwidth" tab sets the <b>maximum</b> values, while the "Throttling" tab sets the <b>average</b> values.</li>
-                    <li>The "Bandwidth" tab does not affect how documents are scheduled in the queue; it simply blocks documents until it is safe to go ahead, which will use up a crawler thread
-                           for the entire period that both the wait and the fetch take place.  The "Throttling" tab affects how often documents are scheduled, so it does not waste threads.</li>
-                </ul>
-                <br/>
-                <p>Because of the above, we suggest that you configure your Web connection using <b>both</b> the "Bandwidth" <b>and</b> the "Throttling" tabs.  Select maximum
-                       values on the "Bandwidth" tab, and corresponding average values estimates on the "Throttling" tab.  Remember that a document identifier for a Web connection is the
-                       document's URL, and the bin name for that URL is the server name.  Also, please note that the "Maximum number of connections per JVM" field's default value of 10 is
-                       unlikely to be correct for connections of the Web type; you should have at least one available connection per worker thread, for best performance.  Since the
-                       default number of worker threads is 30, you should set this parameter to at least a value of 30 for normal operation.</p>
-                <p>The Web connection's "Access Credentials" tab describes how pages get authenticated.  There is support on this tab for both page-based authentication (e.g.
-                       basic auth or all forms of NTLM), as well as session-based authentication (which involves the fetch of many pages to establish a logged-in session).  The initial
-                       appearance of the "Access Credentials" tab shows both kinds of authentication:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-access-credentials.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-
-                <p>Comparing Page and Session Based Authentication:</p>
-                <table>
-                    <tr><td width="20%"><b>Authentication Detail</b></td><td width="40%"><b>Page Based Authentication</b></td><td width="40%"><b>Session Based Authentication</b></td></tr>
-                    <tr>
-                        <td><b>HTTP Return Codes</b></td>
-                        <td>4xx range, usually 401</td>
-                        <td>Usually 3xx range, often 301 or 302</td>
-                    </tr>
-                    <tr>
-                        <td><b>How it's recognized as a login request</b></td>
-                        <td>4xx range codes always indicate a challenged response</td>
-                        <td>Recognized <b>by patterns</b> in the URL or content.
-                            Manifold must be told what to look for.
-                            3xx range HTTP codes are <b>also used for normal content redirects</b>
-                            so there's no built-in way for Manifold to tell the difference,
-                            that's why it needs regex-based rules.</td>
-                    </tr>
-                    <tr>
-                        <td><b>How Login form is Rendered in normal Web Browser</b></td>
-                        <td>Standard Browser popup dialog.
-                            IE, Firefox, Safari, etc. all have their own specific style.</td>
-                        <td>Server sends custom HTML or Javascript.
-                            Might use red text, might not.
-                            Might show a login form, or maybe a &quot;click here to login&quot; link.
-                            Can be a regular page, or Javascript popup, there's no specific standard.</td>
-                    </tr>
-                    <tr>
-                        <td><b>Login Expiration</b></td>
-                        <td>Usually doesn't expire, depends on server's policy.
-                            If it does expire at all, usually based calendar dates
-                            and not related to this specific login.</td>
-                        <td>Often set to several minutes or hours from the
-                            the last login in current browser session.
-                            A long spider run might need to re-login several times.</td>
-                    </tr>
-                    <tr>
-                        <td><b>HTTP Header Fields</b></td>
-                        <td>From server: WWW-Authenticate: Basic or NTLM with Realm<br/>
-                            From client: Authorization: Basic or NTLM</td>
-                        <td>From server: Location: and Set-Cookie:<br/>
-                            From client: Cookie:<br/>
-                            Cookie values frequently change.</td>
-                    </tr>
-                </table>
-                <br/>
-
-                <p>Each kind of authentication has its own list of rules.</p>
-                <p>Specifying a page authentication rule requires simply knowing what URLs are protected, and what the proper
-                       authentication method and credentials are for those URLs.  Enter a regular expression describing the protected URLs, and select the proper authentication method.
-                       Fill in the credentials.  Click the "Add" button.</p>
-                <p>Specifying a correct session authentication rule usually requires some research.  A single session-authentication rule usually corresponds to a single session-protected
-                       site.  For that site, you will need to be able to describe the following for session authentication to function:</p>
-                <br/>
-                <ul>
-                    <li>The URLs of pages that are protected by this particular site session security</li>
-                    <li>How to detect when a page fetch is part of the login sequence</li>
-                    <li>How to fill in the appropriate forms within the login sequence with appropriate login information</li>
-                </ul>
-                <br/>
-                <p>A Web connection labels pages that are part of the login sequence "login pages", and pages that are protected site content "content pages".  A Web
-                       connection will not attempt to index login pages.  They are special pages that have but one purpose: establishing an authenticated session.</p>
-                <p>Remember, the goals of the setup you have to go through are as follows:</p>
-                <br/>
-                <ul>
-                    <li>Identify what site, or part of the site, has protected content</li>
-                    <li>Identify which http/https fetches are not content, but are in fact part of a "login sequence", which a normal person has to go through to get the appropriate cookies</li>
-                </ul>
-                <br/>
-                <p>If all this is not complicated enough, your research also has to cover two very different cases: when you are first entering the site anew, and second when you try to fetch
-                       a content page and you are no longer logged in, because your session has expired.  In both cases, the session authentication rule must be able to properly log in and
-                       fetch content, because you cannot control when a page will be fetched or refetched by the Framework.</p>
-                <p>One key piece of data you will supply is a regular expression that basically describes the set of URLs for which the content is protected, and for which the right cookies have to be
-                      in place for you to get at the "real" content. Once you've specified this, then for each protection zone (described by its URL regexp), you need to specify how
-                      ManifoldCF should identify whether a given fetch should be considered part of the login sequence or not. It's not enough to just identify the URL of login pages,
-                      since (for instance) if your session has expired you may well have a redirection get fetched instead of the content you want. So you specify each class of login page
-                      as one of three types, using not only the URL to identify the class (this is where you get the second regexp), but also something about what is on the page: whether
-                      it is a redirection to a URL (yes, again described by a URL regexp), whether it has a form with a specified name (described by a regexp), or whether it has a
-                      specific link on it (once again, described by a regexp).</p>
-                <p>As you can see, you declare a page to be a login page by identifying it both by its URL, and by what the crawler finds on the page when it fetches it.  For example, some session-protected
-                       sites may redirect you to a login screen when your session expires.  So, instead of fetching content, you would be fetching a redirection to a specific page.  You do <b>not</b>
-                       want either the redirection, or the login screen, to be considered content pages.  The correct way to handle such a setup would be to declare one kind of login page to consist
-                       of a redirection to the login screen URL, and another kind of login page to consist of the login screen URL with the appropriate form.  Furthermore, you would want to supply
-                       the correct login data for the form, and allow the form to be submitted, and so the login form's target may also need to be declared as a login page.</p>
-                <p>The kinds of content that a Web connection can recognize as a login page are the following:</p>
-                <br/>
-                <ul>
-                    <li>A redirection to a specific URL, as described by a regular expression</li>
-                    <li>A page that has a form of a particular name on it, as described by a regular expression</li>
-                    <li>A page that has a link on it to a specific target, as described by a regular expression</li>
-                    <li>A page that has specific content on it, as described by a regular expression</li>
-                </ul>
-                <br/>
-                <p>Note that in three of the cases above that there is an implicit flow through the login sequence that you describe by specifying the pages in the login sequence. For
-                      example, if upon session timeout you expect to see a redirection to a link, or family of links (remember, it's a regexp, so you can describe that easily), then as part
-                      of identifying the redirection as belonging to the login sequence, the web connector also now has a new link to fetch - the redirection link - which is what it does next. The same applies
-                      to forms.  If the form name that was specified is found, then the web connector submits that form using values for the form elements that you specify, and using
-                      the submission type described in the actual form tag (GET, POST, or multi-part). Any other elements of the form are left in whatever state that the HTML specified;
-                      no Javascript is ever evaluated. Thus, if you think a form element's value is being set by Javascript, you have to figure out what it is being set to and enter this
-                      value by hand as part of the specification for the "form" type of login page. Typically this amounts to a user name and password.</p>
-                <p>In the fourth login sequence case, where specific page content is matched to determine that a page belongs in the login sequence, there is no
-                      implicit flow to a subsequent page.  In this case you must supply an <em>override URL</em>,
-                      which describes which page to go to to continue the login sequence.  In fact, you are allowed to provide an override URL for all four cases above,
-                      but this is only recommended when the web connector would not automatically find the right subsequent page URL on its own.</p>
-
-                <p>To add a session authentication rule, fill in a regular expression describing the site pages that are being protected, and click the "Add" button:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-access-credentials-session.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Note that you can now add login page descriptions to the newly-created rule.  To add a login page description, enter a URL regular expression, a type of login page, a
-                       target link or form name regular expression, and click the "Add" button.</p>
-                <p>When you add a login page of the "form" type, you can then add form fill-in information to the login page, as seen below:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-access-credentials-session-form.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Supply a regular expression for the name of the form element you want to set, and also provide a value.  If you want the value to not be visible in clear text, fill in the
-                       "password" column instead of the "value" column.  You can usually figure out the name of the form and its elements by viewing the source of the HTML page in a
-                       browser.  When you are done, click the "Add" button.</p>
-                <p>Form data that is not specified will be posted with the default value determined by the HTML of the page.  The Web connection type is unable, at this time, to execute
-                       Javascript, and therefore you may need to fill out some form values that are filled in by Javascript in order to get the form to post in a useful way.  If you have a form
-                       that relies heavily on Javascript to post properly, you may need considerable effort and web programming skills to figure out how to get these forms to post properly
-                       with a Web connection.  Luckily, such obfuscated login screens are still rare.</p>
-                <p>A series of login pages form a "login page sequence" for the site.  For each login page, the Web connection decides what page to fetch next by what you specified for
-                       the login page criteria.  So, for a redirection to a specific URL, the next page to be fetched will be that redirected URL.  For a form, the next page fetched will be the
-                       action page indicated by the specified form.  For a link to a target, the next page fetched will be the target URL.  When the login page sequence ends, the next page
-                       fetched after that will be the original content page that the Web connection was trying to fetch when the login sequence started.</p>
-                <p>Debugging session authentication problems is best done by looking at a Simple History report for your Web connection.  A Web connection records several
-                       types of events which, between them, can give a very strong picture of what is happening.  These event types are as follows:</p>
-                <br/>
-                <table>
-                    <tr><td><b>Event type</b></td><td><b>Meaning</b></td></tr>
-                    <tr><td>Fetch</td><td>This event records the fetch of a URL.  The HTTP response is recorded as the response code.  In addition, there are several negative
-                        code values which the connect generates when the HTTP operation cannot be done or does not complete.</td></tr>
-                    <tr><td>Begin login</td><td>This event occurs when the connection detects the transition to a login page sequence.  When a login sequence is entered, no other
-                        pages from that protected site will be fetched until the login sequence is completed.</td></tr>
-                    <tr><td>End login</td><td>This event occurs when the connection detects the transition from a login page sequence back to normal content fetching.  When this
-                        occurs, simultaneous fetching for pages from the site are re-enabled.</td></tr>
-                </table>
-                <br/>
-                <p>The "Certificates" tab is used in conjunction with SSL, and permits you to define independent trust certificate stores for URLs matching specified regular expressions.
-                       You can also allow the connection to trust all certificates it sees, if you so choose.  The "Certificates" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-configure-certificates.PNG" alt="Web Connection, Certificates tab" width="80%"/>
-                <br/><br/>
-                <p>Type in a URL regular expression, and either check the "Trust everything" box, or browse for the appropriate certificate authority certificate that you wish to trust.  (It will
-                       also work to simply trust a server's certificate, but that certificate may change from time to time, as it expires.)  Click "Add" to add the certificate rule to the list.</p>
-                <p>When you are done, and you click the "Save" button, you will see a summary page looking something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-status.PNG" alt="Web Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>When you create a job that uses a repository connection of the Web type, the tabs "Hop Filters", "Seeds", "Canonicalization", "Inclusions", "Exclusions", "Security", and "Metadata"
-                       will all appear.  These tabs allow you to configure the job appropriately for a web crawl.</p>
-                <p>The "Hop Filters" tab allows you to specify the maximum number of hops from a seed document that a document can be before it is no longer considered to be part of the job.
-                       For connections of the Web type, there are two different kinds of hops you can count as well: "link" hops, and "redirection" hops.  Each of these represents an independent count
-                       and cutoff value.  A blank value means no cutoff value at all.</p>
-                <p>For example, if you specified a maximum "link" hop count of 5, and left the "redirect" hop count blank, then any document that requires more than five links to reach from a seed
-                       will be considered out-of-set.  If you specified both a maximum "link" hop count of 5, and a maximum "redirect" hop count 2, then any document that requires more than five links to
-                       reach from a seed, <b>and</b> more than two redirections, will be considered out-of-set.</p>
-                <p>The "Hop Filters" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-hop-filters.PNG" alt="Web Job, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>On this same tab, you can tell the Framework what to do should there be changes in the distance from the root to a document.  The choice "Delete unreachable
-                       documents" requires the Framework to recalculate the distance to every potentially affected document whenever a change takes place.  This may require
-                       expensive bookkeeping, however, so you also have the option of  ignoring such changes.  There are two varieties of this latter option - you can ignore the changes
-                       for now, with the option of turning back on the aggressive bookkeeping at a later time, or you can decide not to ever allow changes to propagate, in which case
-                       the Framework will discard the necessary bookkeeping information permanently.  This last option is the most efficient.</p>
-                <p>The "Seeds" tab is where you enter the starting points for your crawl.  It looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-seeds.PNG" alt="Web Job, Seeds tab" width="80%"/>
-                <br/><br/>
-                <p>Enter a list of seeds, separated by newline characters.  Blank lines, or lines that begin with a "#' character, will be ignored.</p>
-                <p>The "Canonicalization" tab controls how a web job converts URLs into a standard form.  It looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-canonicalization.PNG" alt="Web Job, Canonicalization tab" width="80%"/>
-                <br/><br/>
-                <p>The tab displays a list of canonicalization rules.  Each rule consists of a regular expression (which is matched against a document's URL), and some switch selections.
-                       The switch selections allow you to specify whether arguments are reordered, or whether certain specific kinds of session cookies are removed.  Specific kinds of
-                       session cookies that are recognized and can be removed are: JSP (Java applications servers), ASP (.NET), PHP, and Broadvision (BV).</p>
-                <p>If a URL matches more than one rule, the first matching rule is the one selected.</p>
-                <p>To add a rule, enter an appropriate regular expression, and make your checkbox selections, then click the "Add" button.</p>
-                <p>The "Inclusions" tab lets you specify, by means of a set of regular expressions, exactly what URLs will be included as part of the document set for a web job.  The tab
-                       looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-inclusions.PNG" alt="Web Job, Inclusions tab" width="80%"/>
-                <br/><br/>
-                <p>You will need to provide a series of zero or more regular expressions, separated by newlines.  The regular expressions are considered to match if they are
-                      found anywhere within the URL.  They do not need to match the entire URL.</p>
-                <p>Remember that, by default, a web job includes <b>all</b> documents in the world that are linked to your seeds in any way that the web connection type can determine.</p>
-                <p>If you wish to restrict which documents are actually processed within your overall set of included documents, you may want to supply some regular expressions on the
-                       "Exclusions" tab, which looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-exclusions.PNG" alt="Web Job, Exclusions tab" width="80%"/>
-                <br/><br/>
-                <p>Once again you will need to provide a series of zero or more regular expressions, separated by newlines.  The regular expressions are considered to match if they are
-                      found anywhere within the URL.  They do not need to match the entire URL.</p>
-                <p>It is typical to use the "Exclusions" tab to remove documents from
-                       consideration which are suspected to contain content that both has no extractable links, and is not useful to the index you are trying to build, e.g. movie files.</p>
-                <p>The "Security" tab allows you to specify the access tokens that the documents in the web job get indexed with, and looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-security.PNG" alt="Web Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>You will need to know the format of the access tokens for the
-                       governing authority before you can add security to your documents in this way.  Enter the access token you desire and click the "Add" button.</p>
-                <p>The "Metadata" tab allows you to exclude specific optional HTTP header metadata along with all documents belonging to a web job.  (A standard set of
-                      "fixed" HTTP headers are always included.)  It looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/web-job-metadata.PNG" alt="Web Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>Select the desired HTTP header metadata you wish to exclude.</p>
-            </section>
-
-            <section id="jcifsrepository">
-                <title>Windows Share/DFS Repository Connection</title>
-                <p>The Windows Share connection type allows you to access content stored on Windows shares, even from non-Windows systems.  Also supported are Samba and various
-                       third-party Network Attached Storage servers.</p>
-                <p>DFS nodes and referrals are fully supported, provided the referral machine names can be looked up properly via DNS on the server where the Framework is
-                       running.  For each document, a Windows Share connection creates an index identifier that can be either a "file:" IRI's, or a mapped "http:" URI's, depending on how it is
-                       configured.  This allows for a great deal of flexibility in deployment environments, but also may require some work to properly set up.
-                       In particular, if you intend to use file IRI's as your identifiers, you should check with your system integrator to be sure these are being handled properly by the search component of your
-                       system.  When you use a browser such as Internet Explorer to view a document from a Windows file system called <code>\\servername\sharename\dir1\filename.txt</code>,
-                       the browser converts that to an IRI that looks something like this: <code>file://///servername/sharename/dir1/filename.txt</code>.
-                       While this seems simple, major complexities arise when the underlying file name has special characters in it, such as spaces, "#" symbols, or worse still, non-ASCII
-                       characters.  Unfortunately, every version of Internet Explorer handles these situations somewhat differently, so there is not any fully correct way for the Windows
-                       Share connection type to convert file names to IRI's.  Instead, the connection always uses a standard canonical form, and expects the search results display system component to know how to properly form
-                       the right IRI for the browser or client being used.</p>
-                <p>If you are interested in enforcing security for documents crawled with a Windows Share repository connection, you will need to first configure an authority connection
-                       of the Active Directory type to control access to these documents.  The Share/DFS connector type can also be used with the LDAP authority connection type.</p>
-                <p>A Windows Share connection has a single special tab on the repository connection editing screen: the "Server" tab:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-configure-server.PNG" alt="Windows Share Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>You must enter the name of the server to form the connection with in the "Server" field.  This can either be an actual machine name, or a domain name (if you intend
-                       to connect to a Windows domain-based DFS root).  If you supply an actual machine name, it is usually the right thing to do to provide the server name in an unqualified
-                       form, and provide a fully-qualified domain name in the "Domain name" field.  The user name also should usually be unqualified, e.g. "Administrator" rather than
-                       "Administrator@mydomain.com".  Sometimes it may work to leave the "Domain name" field blank, and instead supply a fully-qualified machine name in the "Server"
-                       field.  It never works to supply both a domain name <b>and</b> a fully-qualified server name.</p>
-                <p>The "Use SIDs" checkbox allows you to control whether the connection uses SIDs as access tokens (which is appropriate for Windows servers and NAS servers
-                      that are secured by Active Directory), or user/group names (which is appropriate for Samba servers, and other CIFS servers that use LDAP for security, in conjunction
-                      with the LDAP Authority connection type).  Check the box to use SIDs.</p>
-                <p>Please note that you should probably set the "Maximum number of connections per JVM" field, on the "Throttling" tab, to a number smaller than the default value of
-                       10, because Windows is not especially good at handling multithreaded file requests.  A number less than 5 is likely to perform as well with less chance of causing
-                       server-side problems.</p>
-                <p>After you click the "Save" button, you will see a connection summary screen, which might look something like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-status.PNG" alt="Windows Share Status" width="80%"/>
-                <br/><br/>
-                <p>Note that in this example, the Windows Share connection is not responding, which is leading to an error status message instead of "Connection working".</p>
-                <p></p>
-                <p>When you configure a job to use a repository connection of the Windows Share type, several additional tabs are presented.  These are, in order, "Paths", "Security",
-                       "Metadata", "Content Length", "File Mapping", and "URL Mapping".</p>
-                <p>The "Paths" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-job-paths.PNG" alt="Windows Share Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to construct starting-point paths by drilling down, and then add the constructed paths to a list, or remove existing paths from the list.  Without any
-                       starting paths, your job includes zero documents.</p>
-                <p>Make sure your connection has a status of "Connection working" before you open this tab, or you will see an error message, and you will not be able to build
-                       any paths.</p>
-                <p>For each included path, a list of rules is displayed which determines what folders and documents get included with the job.  These rules
-                       will be evaluated from top to bottom, in order.  Whichever rule first matches a given path is the one that will be used for that path.</p>
-                <p>Each rule describes the path matching criteria.  This consists of the file specification (e.g. "*.txt"), whether the path is a file or folder name, and whether a file is
-                       considered indexable or not by the output connection.  The rule also describes the action to take should the rule be matched: include or exclude.  The file specification
-                       character "*" is a wildcard which matches zero or more characters, while the character "?" matches exactly one character.  All other characters must match
-                       exactly.</p>
-                <p>Remember that your specification must match <strong>all</strong> characters included in the file's path.  That includes all path separator characters ("/").
-                      The path you must match always begins with an initial path separator.  Thus, if you want to exclude the file "foo.txt" at the root level, your exclude rule must
-                      match "/foo.txt".</p>
-                <p>To add a rule for a starting path, select the desired values of all the pulldowns, type in the desired file criteria, and click the "Add" button.  You may also insert
-                       a new rule above any existing rule, by using one of the "Insert" buttons.</p>
-                <p>The "Security" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-job-security.PNG" alt="Windows Share Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>The "Security" tab lets you control three things: File security, share security, and (if security is off) the security tokens attached to all documents indexed by the job.</p>
-                <p><b>File security</b> is the security Windows applies to individual files.  This kind of security is supported by practically all Windows-compatible NAS-type servers,
-                       so you may use this feature without cause for concern.</p>
-                <p><b>Share security</b> is the security Windows applies to Windows shares.  This is an older kind of security that is no longer prevalent in most enterprise organizations.
-                       Many modern NAS systems and Samba also do not support this security model.  If you enable this kind of security in your job while crawling against a system that
-                       does not support it, your job will not run correctly; the first document access will cause an error, and the job will abort.</p>
-                <p>If you turn off file security, you have the option of adding index access tokens of your own to all documents crawled by the job.  These tokens must, of course, be
-                       in a form appropriate for the governing authority connection.  Type the token into the box and click the "Add" button.  It is unusual to use this feature other
-                       than for demonstrations.</p>
-                <p>The "Metadata" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-job-metadata.PNG" alt="Windows Share Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to ingest a document's path, as modified by a set of regular expression rules, as a piece of document metadata.  Enter the metadata name you want
-                       in the "Path attribute name" field.  Then, add the rules you want to the list of rules.  Each rule has a match expression, which is a regular expression where parentheses ("("
-                       and ")") mark sections you are interested in.  These sections are called "groups" in regular expression parlance.  The replace string consists of constant text plus
-                       substitutions of the groups from the match, perhaps modified.  For example, "$(1)" refers to the first group within the match, while "$(1l)" refers to the first match group
-                       mapped to lower case.  Similarly, "$(1u)" refers to the same characters, but mapped to upper case.</p>
-                <p>For example, suppose you had a rule which had ".*/(.*)/(.*)/.*" as a match expression, and "$(1) $(2)" as the replace string.  If presented with the path
-                       <code>Project/Folder_1/Folder_2/Filename</code>, it would output the string <code>Folder_1 Folder_2</code>.</p>
-                <p>If more than one rule is present, the rules are all executed in sequence.  That is, the output of the first rule is modified by the second rule, etc.</p>
-                <p>The "Content Length tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-job-content-length.PNG" alt="Windows Share Job, Content Length tab" width="80%"/>
-                <br/><br/>
-                <p>This tab allows you to set a maximum content length cutoff value, to avoid having the job try to index exceptionally large documents.  Enter the desired maximum value.
-                       A blank value indicates an unlimited cutoff length.</p>
-                <p>The "File Mapping" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-job-file-mapping.PNG" alt="Windows Share Job, File Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>The mappings specified here are similar in all respects to the path attribute mapping setup described above.  The mappings are applied to change the actual file path
-                       discovered by the crawler into a different file path.  This can sometimes be useful if there is some kind of conversion process between raw documents and
-                       parallel data files that contain extracted data.</p>
-                <p>The "URL Mapping" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/jcifs-job-url-mapping.PNG" alt="Windows Share Job, URL Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>The mappings specified here are similar in all respects to the path attribute mapping setup described above.  If no mappings are present, the file path is converted
-                       to a canonical file IRI.  If mappings are present, the conversion is presumed to produce a valid URL, which can be used to access the document via some
-                       variety of Windows Share http server.</p>
-                <p>Accessing some servers may result in "Couldn't connect to server: Logon failure: unknown user name or bad password" Connection Status, because the default version of NTLM used for
-                       authentication is incompatible.  If this is the case, the Windows Share repository connector can be configured to use NTLMv1, rather than the NTLMv2 default. This is done by
-                       setting the property "org.apache.manifoldcf.crawler.connectors.jcifs.usentlmv1" to "true" in properties.xml file.</p>
-
-            </section>
-
-            <section id="wikirepository">
-                <title>Wiki Repository Connection</title>
-                <p>The Wiki repository connection type allows you to index content from the main space of a Wiki or MediaWiki site.  The connection type uses the Wiki API
-                  in order to fetch content.  Only publicly visible documents will be indexed, and there is thus typically no need of an authority for Wiki content.</p>
-                <p>This connection type has no support for any kind of document security, except for hand-entered access tokens provided on a per-job basis.</p>
-                <p>A Wiki connection has only one special tab on the repository connection editing screen: the "Server" tab.  The "Server" tab looks like this:</p>
-                <br/><br/>
-                <figure src="images/en_US/wiki-configure-server.PNG" alt="Wiki Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>The protocol must be selected in the "Protocol" field.  At the moment only the "http" protocol is supported.  The server name must be provided in the "Server name" field.
-                      The server port must be provided in the "Port" field.  Finally, the path part of the Wiki URL must be provided in the "Path name" field and must start with a "/" character.</p>
-                <p>When you configure a job to use a repository connection of the Wiki type, no additional tabs are currently presented.</p>
-            </section>
-
-        </section>
-
-        <section id="notificationconnectiontypes">
-            <title>Notification Connection Types</title>
-
-            <section>
-                <title>Slack Notifications</title>
-	            <p>The Slack notification connection allows you to send job notifications to a Slack channel. The connection type uses the Slack Incoming WebHook API in order to deliver messages to Slack.</p>
-	            <p>A Slack notification connection has only one special tab on the notification connection editing screen: the "Slack WebHook" tab.  The "Slack WebHook" tab looks like this:</p>
-	            <br/><br/>
-	            <figure src="images/en_US/slack-configure-slack-webhook.PNG" alt="Slack Notification Connection, Slack WebHook tab" width="80%"/>
-	            <br/><br/>
-	            <p>When you configure a job to use a notification connection of the Slack notification type, an additional tab "Message" is presented.</p>
-	            <p>The "Messages" tab looks like this:</p>
-	            <br/><br/>
-	            <figure src="images/en_US/slack-job-message.PNG" alt="Slack Notification Job, Message tab" width="80%"/>
-	            <br/><br/>
-	            <p>This tab allows you to set the notification messages for the different job statuses. The "Channel" specifies the name of the Slack channel, where the message will be sent to.
-	                    If no channel is defined, the message is sent to the default channel of the Slack Incoming WebHook.</p>
-	            <p>The "Message" supports Markdown formatting. Refer to the <a href="https://api.slack.com/custom-integrations">Slack Custom Integrations</a> documentation for more information.</p>
-            </section>
-            
-            <section>
-                <title>Rocket.Chat Notifications</title>
-	            <p>The Rocket.Chat notification connection allows you to send job notifications to a Rocket.Chat channel. The connection type uses the Rocket.Chat REST API to post messages.</p>
-	            <p>A Rocket.Chat notification connection has only one special tab on the notification connection editing screen: the "Rocket.Chat REST API" tab.  The tab looks like this:</p>
-	            <br/><br/>
-	            <figure src="images/en_US/rocketchat-configure-restapi.PNG" alt="Rocket.Chat Notification Connection, Rocket.Chat REST API tab" width="80%"/>
-	            <br/><br/>
-	            <p>Enter the server URL of your Rocket.Chat instance and the user credentials here. The user field takes either the username or the email address of your Rocket.Chat user. Fill out the proxy fields if you need
-	               to connect to your Rocket.Chat through an http proxy.</p>
-	            <p>When you configure a job to use a notification connection of the Rocket.Chat notification type, an additional tab "Rocket.Chat Notifications" is presented.</p>
-	            <p>The tab looks like this:</p>
-	            <br/><br/>
-	            <figure src="images/en_US/rocketchat-job-notifications.PNG" alt="Rocket.Chat Notification Job, Notification tab" width="80%"/>
-	            <br/><br/>
-	            <p>This tab allows you to set the notification messages for the different job statuses. The tab begins with a section for global settings, followed by multiple sections for each
-	               notification type. The default channel defines the channel, to which the messages are posted. You can customize the appearance of the posted message with the alias, emoji and avatar fields.</p>
-	            <p>The "Channel" field in the second section allows you to override the default channel for the corresponding notification type. If no channel is defined, the message is sent to the specified default channel.</p>
-	            <p>The "Message" field holds the actual message that will be posted to Rocket.Chat. The field supports Markdown for formatting the message. Refer to the <a href="https://docs.rocket.chat">Rocket.Chat</a> documentation for detailed information.</p>
-            </section>
-
-        </section>
-
-</body>
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/faq.xml b/site/src/documentation/content/xdocs/en_US/faq.xml
deleted file mode 100644
index dcbb464..0000000
--- a/site/src/documentation/content/xdocs/en_US/faq.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Frequently Asked Questions</title> 
-  </header> 
-
-  <body> 
-
-      <section>
-        <title>End-user Questions</title>
-        <p>Currently empty - send your questions to user@manifoldcf.apache.org .</p>
-      </section>
-      
-      <section>
-         <title>Developer/Integrator Questions</title>
-         <p>Your questions/answers are currently located in the wiki, <a href="https://cwiki.apache.org/confluence/display/CONNECTORS/FAQ">here</a>.
-         </p>
-      </section>
-
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml b/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml
deleted file mode 100644
index 50e2807..0000000
--- a/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml
+++ /dev/null
@@ -1,1348 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Building ManifoldCF</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Building ManifoldCF</title>
-      <p></p>
-      <p>ManifoldCF consists of a framework, a set of connectors, and an optional Apache2 plug-in module.  These can be built as follows.</p>
-      <p></p>
-      
-      <section>
-        <title>Building overview</title>
-        <p></p>
-        <p>There are two ways to build ManifoldCF.  The primary means of building (and the most supported) is via Apache Ant.  The ant build is used to
-          create ManifoldCF releases and to run tests, load tests, and UI tests. Maven is also supported for develop building only.  Maven ManifoldCF builds have
-          many restrictions and challenges and are of secondary priority for the development team.</p>
-        <p>The ManifoldCF framework is built without any dependencies on connector code.  It consists of a set of jars, a family of web applications, and
-          a number of java command classes.  Connectors are then built that have well-defined dependencies on the framework
-          modules.  A properly built connector typically consists of:</p>
-        <p></p>
-        <ul>
-           <li>One or more jar files meant to be included in the library area meant for connector jars and their dependencies.</li>
-           <li>Possibly some java commands, which are meant to support or configure the connector in some way.</li>
-           <li>Possibly a connector-specific process or two, each requiring a distinct classpath, which usually serves to isolate the <strong>crawler-ui</strong> servlet,
-            <strong>authority-service</strong> servlet, <strong>agents</strong> process, and any commands from problematic aspects of the client environment</li>
-           <li>A recommended set of java "define" variables, which should be used consistently with all involved processes, e.g. the <strong>agents</strong> process, the
-            application server running the <strong>authority-service</strong> and <strong>crawler-ui</strong>, and any commands.  (This is historical, and no connectors
-            as of this writing have any of these any longer).</li>
-        </ul>
-        <p></p>
-        <p>An individual connector package will typically supply an output connector, or a transformation connector, or a mapping connector, or a repository connector, or
-          sometimes both a repository connector and an authority connector.  The
-          main ant build script automatically forms each individual connector's contribution to the overall system into the overall package.</p>
-      </section>
-      
-      <section>
-        <title>Building the framework and the connectors using Apache Ant</title>
-        <p></p>
-        <p>To build the ManifoldCF framework code, and the particular connectors you are interested in, you currently need to do the following:</p>
-        <p></p>
-        <ol>
-          <li>Check out the desired release from https://svn.apache.org/repos/asf/manifoldcf/tags, or unpack the desired source distribution.</li>
-          <li>cd to the top-level directory.</li>
-          <li><strong>EITHER:</strong> overlay the lib directory from the corresponding lib distribution (preferred, where possible), <strong>OR</strong> run "ant make-core-deps" to
-            build the code dependencies.  The latter is the only possibility if you are building from trunk, but it is not guaranteed to work for older releases.</li>
-          <li>Run "ant make-deps", to download LGPL and other open source but non-Apache compatible libraries.</li>
-          <li>Install proprietary build dependencies.  See below for details.</li>
-          <li>Run "ant build".</li>
-          <li>Install desired dependent proprietary libraries.  See below for details.</li>
-        </ol>
-        <p></p>
-        <p>If you do not run the ant "make-deps" target, and you supply <strong>NO</strong> LGPL or proprietary libraries, not all capabilities of ManifoldCF will be available.
-            The framework itself and the following repository connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Alfresco Webscript connector</li>
-          <li>Amazon S3 connector</li>
-          <li>CMIS connector</li>
-          <li>Atlassian Confluence connector</li>
-          <li>EMC Documentum connector, built against a Documentum API stub</li>
-          <li>DropBox connector</li>
-          <li>Email connector</li>
-          <li>FileNet connector, built against a FileNet API stub</li>
-          <li>WGET-compatible filesystem connector</li>
-          <li>Generic XML repository connector</li>
-          <li>Google Drive connector</li>
-          <li>GridFS connector (mongoDB)</li>
-          <li>HDFS connector</li>
-          <li>JDBC connector, with the just the POSTGRESQL jdbc driver</li>
-          <li>Atlassian Jira connector</li>
-          <li>OpenText LiveLink connector, built against a LiveLink API stub</li>
-          <li>Meridio connector, built against modified Meridio API WSDLs and XSDs</li>
-          <li>RSS connector</li>
-          <li>Microsoft SharePoint connector, built against SharePoint API WSDLs</li>
-          <li>Webcrawler connector</li>
-          <li>Wiki connector</li>
-        </ul>
-        <p></p>
-        <p>The following authority connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Active Directory authority</li>
-          <li>Alfresco Webscript authority</li>
-          <li>Amazon S3 authority</li>
-          <li>CMIS authority</li>
-          <li>Atlassian Confluence authority</li>
-          <li>EMC Documentum authority</li>
-          <li>Atlassian Jira authority</li>
-          <li>LDAP authority</li>
-          <li>OpenText LiveLink authority</li>
-          <li>Meridio authority, built against modified Meridio API WSDLs and XSDs</li>
-          <li>Null authority</li>
-          <li>Microsoft SharePoint/AD authority</li>
-          <li>Microsoft SharePoint/Native authority, built against SharePoint API WSDLs</li>
-        </ul>
-        <p></p>
-        <p>The following output connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Amazon Cloud Search output connector</li>
-          <li>WGET-compatible filesystem output connector</li>
-          <li>MetaCarta GTS output connector</li>
-          <li>Apache Solr output connector</li>
-          <li>OpenSearchServer output connector</li>
-          <li>ElasticSearch output connector</li>
-          <li>WGET-compatible filesystem output connector</li>
-          <li>HDFS output connector</li>
-          <li>Kafka output connector</li>
-          <li>Null output connector</li>
-          <li>Searchblox output connector</li>
-        </ul>
-        <p></p>
-        <p>The following transformation connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Field mapping transformation connector</li>
-          <li>Document filter transformation connector</li>
-          <li>OpenNLP transformation connector</li>
-          <li>Null transformation connector</li>
-          <li>Tika extractor transformation connector</li>
-        </ul>
-        <p></p>
-        <p>The following mapping connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Regular-expression mapping connector</li>
-        </ul>
-        <p></p>
-        <p>The following notification connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Email notification connector</li>
-        </ul>
-        <p></p>
-        <p>The dependencies and build limitations of each individual LGPL and proprietary connector is described in separate sections below.</p>
-        <p></p>
-            
-        <section>
-          <title>Building and testing the legacy Alfresco connector</title>
-          <p></p>
-          <p>The legacy Alfresco connector requires the Alfresco Web Services Client provided by Alfresco in order to be built. Place this jar into the directory <em>connectors/alfresco/lib-proprietary</em> before you build.
-              This will occur automatically if you execute the ant target "make-deps" from the ManifoldCF root directory.</p>
-          <p></p>
-          <p>To run integration tests for the connector you have to copy the alfresco.war including H2 support created by the Maven module test-materials/alfresco-4-war (using "mvn package" inside the folder)
-              into the <em>connectors/alfresco/test-materials-proprietary</em> folder.  Then use the "ant test" or "mvn integration-test" for the standard build to execute integration tests.</p>
-          <p></p>
-        </section>
-
-        <section>
-          <title>Building and testing the Alfresco Webscript connector</title>
-          <p></p>
-          <p>The Alfresco Webscript connector is built against an open-source Alfresco Indexer client, which requires a corresponding Alfresco Indexer plugin
-                to be installed on your Alfresco instance.  This Alfresco Indexer plugin is included with ManifoldCF distributions.  Installation of the plugin should follow the
-                standard Alfresco installation steps, as described <a href="http://docs.alfresco.com/4.1/tasks/amp-install.html">here</a>.
-                See <a href="https://github.com/maoo/alfresco-indexer">this page</a> for configuration details, and for the plugin itself.</p>
-          <p></p>
-        </section>
-
-        <section>
-          <title>Building and running the Documentum connector</title>
-          <p></p>
-          <p>The Documentum connector requires EMC's DFC product in order to be run, but is built against a set of stub classes.
-              The stubs mimic the class structure of DFC 6.0.  If your DFC is newer, it is possible that the class structure of the DFC
-              classes might have changed, and you may need to build the connector yourself.</p>
-          <p>If you need to supply DFC classes during build time, copy the DFC and dependent jars to the source directory
-              <em>connectors/documentum/lib-proprietary</em>, and build using "ant build".  The jars will be copied  into
-              the right place in your <em>dist</em> directory automatically.</p>
-          <p>For a binary distribution, just copy the DFC jars to <em>processes/documentum-server/lib-proprietary</em> instead.</p>
-          <p>If you have done everything right, you should be able to start the Documentum connector's registry and server processes, as per the instructions.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the FileNet connector</title>
-          <p></p>
-          <p>The FileNet connector requires IBM's FileNet P8 API jar in order to be run, but is usually built against a set of stub classes.
-              The stubs mimic the class structure of FileNet P8 API 4.5.  If your FileNet is newer, it is possible that the class structure of the
-              API might have changed, and you may need to build the connector yourself.</p>
-          <p>If you need to supply your own Jace.jar at build time, copy it to the source directory <em>connectors/filenet/lib-proprietary</em>,
-              and build using "ant build".  The Jace.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>
-          <p>If you do not wish to build, simply copy your Jace.jar and the other dependent jars from that installation into the distribution directory
-              <em>processes/filenet-server/lib-proprietary</em>.</p>
-          <p>If correctly done, you will be able to start the FileNet connector's registry and server processes, as per the instructions.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the JDBC connector, including Oracle, MSSQL, MySQL, SQLServer, and Sybase JDBC drivers</title>
-          <p></p>
-          <p>The JDBC connector also knows how to work with Oracle, SQLServer, and Sybase JDBC drivers.  In order to support these databases, start by placing the mysql-connector-java.jar
-            and the jtds.jar in the <em>lib-proprietary</em> directory.  The ant target "make-deps" will do this for you automatically.  For Oracle, download the appropriate
-            Oracle JDBC jar from the Oracle site, and copy it into the same directory before you build ManifoldCF.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the jCIFS/Windows Shares connector</title>
-          <p></p>
-          <p>To build this connector, you need to download jcifs.jar from <a href="http://jcifs.samba.org">http://jcifs.samba.org</a>, and copy it into the <em>connectors/jcifs/lib-proprietary</em>
-              directory before building.  You can also just type "ant make-deps" from the root ManifoldCF directory and this step will be done for you.</p>
-          <p>If you have downloaded a binary distribution, place the jcifs.jar into the <em>connector-lib-proprietary</em> directory, and uncomment the Windows Shares line in the <em>connectors.xml</em> file.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the LiveLink connector</title>
-          <p></p>
-          <p>This connector needs OpenText's LAPI package in order to be run.  It is usually built against a set of stubs. The stubs, however, mimic the
-              class structure of LAPI 9.7.1.  Later versions (such as 10.x) have a different class structure.  Therefore, you may need to rebuild ManifoldCF
-              against your lapi.jar, in order for the connector to work properly.</p>
-          <p>If you need to supply your own lapi.jar and llssl.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".
-              The lapi.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>
-          <p>If you do not wish to build, simply copy your lapi.jar and llssl.jar into the binary distribution's <em>connector-lib-proprietary</em>
-              directory, and uncomment the LiveLink-related connector lines in <em>connectors.xml</em> file.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building the Meridio connector</title>
-          <p></p>
-          <p>The Meridio connector generates interface classes using checked-in wsdls and xsds originally obtained
-              from an installed Meridio instance using <strong>disco.exe</strong>, and subsequently modified to work
-              around limitations in Apache Axis.  The <strong>disco.exe</strong> utility is installed as part of
-              Microsoft Visual Studio, and is typically found under "c:\Program Files\Microsoft SDKs\Windows\V6.x\bin".
-              If desired, you can obtain unmodified wsdls and xsds by interrogating the following Meridio web services:</p>
-          <p></p>
-          <ul>
-             <li>http[s]://&#60;meridio_server&#62;/DMWS/MeridioDMWS.asmx</li>
-             <li>http[s]://&#60;meridio_server&#62;/RMWS/MeridioRMWS.asmx</li>
-          </ul>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the SharePoint connector</title>
-          <p></p>
-          <p>The SharePoint connector generates interface classes using checked-in wsdls originally obtained
-            from an installed Microsoft SharePoint instance using <strong>disco.exe</strong>.  The <strong>disco.exe</strong> utility is installed as part of
-            Microsoft Visual Studio, and is typically found under "c:\Program Files\Microsoft SDKs\Windows\V6.x\bin".
-            If desired, you can obtain unmodified wsdls by interrogating the following SharePoint web services:</p>
-          <p></p>
-          <ul>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Permissions.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Lists.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Dspsts.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/usergroup.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/versions.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/webs.asmx</li>
-          </ul>
-          <p></p>
-          <p><strong>Important:</strong> For SharePoint instances version 3.0 (2007) or higher, in order to run the connector, you also must deploy a custom SharePoint web service
-            on the SharePoint instance you intend to connect to.  This is required because Microsoft overlooked support for web-service-based access to file and folder security information
-            when SharePoint 2007 was released.  For SharePoint version 4.0 (2010), the service is even more critical, because backwards compatibility was not maintained and without
-            this service no crawling can occur.  SharePoint version 5.0 (2013) also requires a plugin; although its functionality is the same as for SharePoint 4.0, the binary you install
-            is built against SharePoint 2013 resources rather than SharePoint 2010 resources, so there is a different distribution.</p>
-          <p>The versions of this service can be found in the distribution directory <em>plugins/sharepoint</em>.
-            Pick the version appropriate for your SharePoint installation, and install it following the instructions in the file <strong>Installation Readme.txt</strong>, found in the
-            corresponding directory.</p>
-          <p></p>
-        </section>
-
-        <section>
-          <title>Running the Apache OpenNLP transformation connector</title>
-          <p></p>
-          <p>The Apache OpenNLP transformation connector requires OpenNLP models in order to be useful.  These models should be downloaded or created by you, and
-            must be placed in the <em>file-resources</em> folder.  This will allow the connector to find them and allow you to use them.</p>
-          <p>The models available publicly for OpenNLP can be downloaded from this URL: <a href="http://opennlp.sourceforge.net/models-1.5/">http://opennlp.sourceforge.net/models-1.5/</a>.  To use the
-            connector, you <strong>must</strong> specify a sentence model and a tokenization model.  You can specify as few or as many content extraction models as you
-            wish.</p>
-          <p></p>
-          <p><strong>If you do not download or otherwise provide models for the OpenNLP connector's use, it will not be possible to define a job which uses the connector.</strong></p>
-        </section>
-
-        <section>
-          <title>Running the Apache Solr output connector</title>
-          <p></p>
-          <p>The Apache Solr output connector requires no special attention to build or run within ManifoldCF.  However, in order for Apache Solr to be able to enforce
-              document security, you must install and properly configure a plugin for Solr.  This plugin is available for both Solr 3.x and for Solr 4.x, and can be used either
-              as a query parser plugin, or as a search component.  Additional index fields are also required to contain the necessary security information.  Much more
-              information can be found in the README.txt file in the plugins themselves.</p>
-          <p>The correct versions of the plugins are included in the <em>plugins/solr</em> directory of the main ManifoldCF distribution.  You can also download updated versions
-              of the plugins from the ManifoldCF download page.  The compatibility matrix is as follows:</p>
-          <p></p>
-          <table>
-            <caption>Apache ManifoldCF Solr 3.x and Solr 4.x plugin compatibility</caption>
-            <tr><th>ManifoldCF versions</th><th>Plugin version</th></tr>
-            <tr><td>0.1.x-1.4.x</td><td>0.x</td></tr>
-            <tr><td>1.5.x</td><td>1.x</td></tr>
-            <tr><td>&#62;=1.6.x</td><td>2.x</td></tr>
-          </table>
-          <p></p>
-          <p><strong>If the proper version of the plugin is not deployed on Solr, documents will not be properly secured.</strong>  Thus, it is essential to verify that the
-              proper plugin version has been deployed for the version of ManifoldCF you are using.</p>
-        </section>
-
-        <section>
-          <title>Running the ElasticSearch output connector</title>
-          <p></p>
-          <p>The ElasticSearch output connector requires no special attention to build or run within ManifoldCF.  However, in order for ElasticSearch to be able to enforce
-              document security, you must install, properly configure, and code against a toolkit plugin for ElasticSearch.
-              Additional index fields are also required to contain the necessary security information.  Much more information can be found in the README.txt file in the
-              plugin itself.</p>
-          <p>The correct versions of the plugin is included in the <em>plugins/elasticsearch</em> directory of the main ManifoldCF distribution.  You can also download updated versions
-              of the plugin from the ManifoldCF download page.  The compatibility matrix is as follows:</p>
-          <p></p>
-          <table>
-            <caption>Apache ManifoldCF ElasticSearch plugin compatibility</caption>
-            <tr><th>ManifoldCF versions</th><th>Plugin version</th></tr>
-            <tr><td>0.1.x-1.4.x</td><td>0.x</td></tr>
-            <tr><td>1.5.x</td><td>1.x</td></tr>
-            <tr><td>&#62;=1.6.x</td><td>2.x</td></tr>
-          </table>
-          <p></p>
-          <p><strong>If the proper version of the plugin is not deployed and properly integrated, documents will not be properly secured.</strong>  Thus, it is essential to verify that the
-              proper plugin version has been deployed for the version of ManifoldCF you are using.</p>
-
-          <p>To work with ManifoldCF, your ElasticSearch instance must also include the appropriate indexes created as well.
-              Here are some simple steps for creating an ElasticSearch index, using the CURL utility:</p>
-          <p></p>
-          <source>
-% curl -XPUT 'http://localhost:9200/manifoldcf'
-% curl -XPUT 'http://localhost:9200/manifoldcf/attachment/_mapping' -d '
-{
-  "attachment" : {
-    "_source" : {
-      "excludes" : [ "file" ]
-    },
-    "properties": { 
-      "allow_token_document" : { 
-        "type" : "string" 
-      },
-      "allow_token_parent" : { 
-        "type" : "string" 
-      },
-      "allow_token_share" : { 
-        "type" : "string" 
-      },
-      "attributes" : {
-        "type" : "string"
-      },
-      "createdOn" : {
-        "type" : "string"
-      },
-      "deny_token_document" : {
-        "type" : "string"
-      },
-      "deny_token_parent" : {
-        "type" : "string"
-      },
-      "deny_token_share" : {
-        "type" : "string"
-      },
-      "lastModified" : {
-        "type" : "string"
-      },
-      "shareName" : {
-        "type" : "string"
-      },
-      "file" : {
-        "type" : "attachment",
-        "path" : "full",
-        "fields" : {
-          "file" : {
-            "store" : true,
-            "term_vector" : "with_positions_offsets",
-            "type" : "string"
-          }
-        }
-      }
-    }
-  }
-}'
-          </source>
-          <p>This command creates an index called <code>manifoldcf</code> with a mapping named <code>attachment</code>
-                which has some generic fields for access tokens and a field <code>file</code> which makes use of the
-                ElasticSearch attachment mapper plugin. It is configured for highlighting (<code>"term_vector" : "with_positions_offsets"</code>).</p>
-          <p>The following part is useful for not saving the source json on the index which reduces the index size significantly. Be
-                aware that you shouldn't do this if you will need to re-index data on the ElasticSearch side or you need access to the
-                whole document:</p>
-          <source>
-"_source" : {
-  "excludes" : [ "file" ]
-},
-          </source>
-        </section>
-
-      </section>
-      
-      <section>
-        <title>Building the framework and the connectors using Apache Maven</title>
-        <p></p>
-        <p>ManifoldCF includes some support for building jars under Maven.  Apache Ant is considered to be ManifoldCF's primary build system, so your mileage with Maven may vary.</p>
-        <p>The biggest limitation of the current Maven build is that it does not support any of the proprietary connectors or the multi-process model of execution.
-            The build includes only the Apache-licensed and LGPL-licensed connectors, thus avoiding conditional compilation, and executes under Maven using only the
-            Quick Start example.</p>
-        <p>A canned version of all configuration files are included as resources.  If you want to change the configuration in any way, you will need to rebuild with Maven accordingly.</p>
-        <section>
-          <title>Preparation</title>
-          <p>No special preparation is required, other than to have access to the Apache Maven repository.</p>
-        </section>
-        <section>
-          <title>How to build</title>
-          <p>Building is straightforward.  In the ManifoldCF root, type:</p>
-          <source>
-mvn clean install
-          </source>
-          <p>This should generate all the necessary artifacts to run with, and also run the Hsqldb-based tests.</p>
-          <p>To build and skip only the integration tests, type:</p>
-          <source>
-mvn clean install -DskipITs   
-          </source>
-          <p>When you have the default package installed locally in your Maven repository, to only build ManifoldCF artifacts, type:</p>
-          <source>
-mvn clean package
-          </source>
-          <p>NOTE: Due to current limitations in the ManifoldCF Maven poms, you MUST run a complete "mvn clean install" as the first step.  You cannot skip steps, or the build will fail.</p>
-        </section>
-      </section>
-      
-      <section>
-        <title>Building ManifoldCF's Apache2 plugin</title>
-        <p></p>
-        <p>To build the mod-authz-annotate plugin, you need to start with a Unix system that has the apache2 development tools installed on it, plus the curl development package
-          (from <a href="http://curl.haxx.se">http://curl.haxx.se</a> or elsewhere).  Then, cd to mod-authz-annotate, and type "make".  The build will produce a file called
-          mod-authz-annotate.so, which should be copied to the appropriate Apache2 directory so it can be used as a plugin.</p>
-        <p></p>
-        <p></p>
-      </section>
-        
-    </section>
-    
-    <section>
-      <title>Running ManifoldCF</title>
-      <p></p>
-      <section>
-        <title>Overview</title>
-        <p>ManifoldCF consists of several components.  These are enumerated below:</p>
-        <p></p>
-        <ul>
-           <li>A database, which is where ManifoldCF keeps all of its configuration and state information, usually PostgreSQL</li>
-           <li>A synchronization directory, which how ManifoldCF coordinates activity among its various processes</li>
-           <li>An <strong>agents</strong> process, which is the process that actually crawls documents and ingests them</li>
-           <li>A <strong>crawler-ui</strong> servlet, which presents the UI users interact with to configure and control the crawler</li>
-           <li>An <strong>authority-service</strong> servlet, which responds to requests for authorization tokens, given a user name</li>
-           <li>An <strong>api-service</strong> servlet, which responds to REST API requests</li>
-        </ul>
-        <p></p>
-        <p>These underlying components can be packaged in many ways.  For example, the three servlets can be deployed in separate
-          war fields as separate web applications.  One may also deploy all three servlets in one combined web application, and also include the
-          agents process.</p>
-        <p></p>
-      </section>
-      <p></p>
-      <section>
-        <title>Binary organization</title>
-        <p>Whether you build ManifoldCF yourself, or download a binary distribution, you will need to know what is what in the build result.  If you build ManifoldCF yourself, the binary build
-          result can be found in the subdirectory <em>dist</em>.  In a binary distribution, the contents of the distribution are the contents of the <em>dist</em> directory.
-          These contents are described below.</p>
-        <p></p>
-        <table>
-          <caption>Distribution directories and files</caption>
-          <tr><th><em>dist</em> file/directory</th><th>Meaning</th></tr>
-          <tr><td><em>connectors.xml</em></td><td>an xml file describing the connectors that should be registered</td></tr>
-          <tr><td><em>connector-lib</em></td><td>jars for all the connectors, referred to by properties.xml</td></tr>
-          <tr><td><em>connector-lib-proprietary</em></td><td>proprietary jars for all the connectors, referred to by properties.xml; not included in binary release</td></tr>
-          <tr><td><em>obfuscation-utility</em></td><td>a utility to obfuscate passwords, for inclusion in properties.xml fields</td></tr>
-          <tr><td><em>lib</em></td><td>jars for all of the examples, referenced by the example scripts</td></tr>
-          <tr><td><em>lib-proprietary</em></td><td>proprietary jars for all of the examples, referenced by the proprietary example scripts</td></tr>
-          <tr><td><em>processes</em></td><td>scripts, classpath jars, and -D switch values needed for the required connector-specific processes</td></tr>
-          <tr><td><em>script-engine</em></td><td>jars and scripts for running the ManifoldCF script interpreter</td></tr>
-          <tr><td><em>example</em></td><td>a jetty-based example that runs in a single process (except for any connector-specific processes), excluding all proprietary libraries</td></tr>
-          <tr><td><em>example-proprietary</em></td><td>a jetty-based example that runs in a single process (except for any connector-specific processes), including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>multiprocess-file-example</em></td><td>scripts and jars for an example that uses the multiple process model using file-based synchronization, excluding all proprietary libraries</td></tr>
-          <tr><td><em>multiprocess-file-example-proprietary</em></td><td>scripts and jars for an example that uses the multiple process model using file-based synchronization, including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>multiprocess-zk-example</em></td><td>scripts and jars for an example that uses the multiple process model using ZooKeeper-based synchronization, excluding all proprietary libraries</td></tr>
-          <tr><td><em>multiprocess-zk-example-proprietary</em></td><td>scripts and jars for an example that uses the multiple process model using ZooKeeper-based synchronization, including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>web</em></td><td>app-server deployable web applications (wars), excluding all proprietary libraries</td></tr>
-          <tr><td><em>web-proprietary</em></td><td>app-server deployable web applications (wars), including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>doc</em></td><td>javadocs for framework and all included connectors</td></tr>
-          <tr><td><em>plugins</em></td><td>pre-built integration components to deploy on target systems, e.g. for Solr</td></tr>
-          <tr><td><em>file-resources</em></td><td>a directory meant to contain file resources that are identically present on all cluster members, e.g. models for OpenNLP</td></tr>
-        </table>
-        <p></p>
-        <p>If you downloaded the binary distribution, you may notice that the <em>connector-lib-proprietary</em> directory contains only a number of 
-            <em>&#60;connector&#62;-README.txt</em> files.
-            This is because under Apache licensing rules, incompatibly-licensed jars may not be redistributed.  Each such <em>&#60;connector&#62;-README.txt</em> describes
-            the jars that you need to add to the <em>connector-lib-proprietary</em> directory in order to get the corresponding connector working.  You will also then need to uncomment
-            the appropriate entries in the <em>connectors.xml</em> file accordingly to enable the connector for use.</p>
-        <p></p>
-        <p>NOTE: The prebuilt binary distribution cannot, at this time, include support for MySQL.  Nor can the JDBC Connector access MySQL, MSSQL, SyBase, or Oracle databases in that
-            distribution.  In order to use these JDBC drivers, you must build ManifoldCF yourself.  Start by downloading the drivers and placing them in the <em>lib-proprietary</em> directory.  The command
-            <em>ant download-dependencies</em> will do most of this for you, with the exception of the Oracle JDBC driver.</p>
-        <p></p>
-        <p>The directory titled <em>processes</em> include separate processes which must be started in order for the associated connector to function.
-            The number of produced <em>processes</em> subdirectories may vary, because optional individual connectors may or may not supply processes that
-            must be run to support the connector.  For each of the <em>processes</em> subdirectories above, any scripts that pertain to that connector-supplied
-            process will be placed in the root level of the subdirectory.
-            The supplied scripts for a process generally take care of building an appropriate classpath and setting necessary -D switches.  (Note: none of the current
-            connectors require special -D switches at this time.)  If you need to construct a classpath by hand, it is important to remember that "more" is not necessarily
-            "better".  The process deployment strategy implied by the build structure has
-            been carefully thought out to avoid jar conflicts.  Indeed, several connectors are structured using multiple processes precisely for that reason.</p>
-        <p>The proprietary libraries required by the secondary process <em>processes</em> subdirectories should be in the directory <em>processes/xxx/lib-proprietary</em>.
-            These jars are not included in the binary distribution, and you will need to supply them in order to make the process work.  A README.txt file is placed
-            in each <em>lib-proprietary</em> directory describing what needs to be provided there.</p>
-        <p></p>
-        <p>The <em>plugins</em> directory contains components you may need to deploy on the target system to make the associated connector function correctly.  For example, the Solr
-            connector includes plug-in classes for enforcing ManifoldCF security on Solr 3.x and 4.x.  See the README file in each directory for detailed instructions on how to deploy the components.</p>
-        <p></p>
-        <p>The <em>file-resources</em> directory contains a README.txt file plus any files your connectors specifically need access to across all cluster members.
-            You should have an exact copy of this directory present on every machine that a related ManifoldCF process runs on, and the properties.xml file parameter
-            <em>org.apache.manifoldcf.fileresources</em> should point to it.  Any third-party or custom files needed by your connector configuration (e.g. OpenNLP models)
-            should be created or downloaded and placed here.</p>
-        <p></p>
-        <p>Inside the <em>example</em> directory, you will find everything you need to fire up ManifoldCF in a single-process model under Jetty.  Everything is included so that all you need to do is change
-            to that directory, and start it using the command <em>&lt;java&gt; -jar start.jar</em>.  This is described in more detail later, and is the recommended way for beginners to try out ManifoldCF.
-            The directory <em>example-proprietary</em> contains an equivalent example that includes proprietary connectors and jars.  This is the standard place to start if you build ManifoldCF yourself.</p>
-        <p></p>
-      </section>
-
-      <section>
-        <title>Example deployments</title>
-        <p>There are many different ways to run ManifoldCF out-of-the-box.  These are enumerated below:</p>
-        <ul>
-          <li>Quick-start single process model</li>
-          <li>Single-process deployable war</li>
-          <li>Simplified multi-process model</li>
-          <li>Command-driven multi-process model</li>
-        </ul>
-        <p>Each way has advantages and disadvantages.  For example, single-process models limit the flexibility of deploying ManifoldCF components.  Multi-process models require that
-          inter-process synchronization be properly configured.  If you are just starting out with ManifoldCF, we suggest you try the quick-start single process model first, since that is
-          the easiest.</p>
-        <section>
-          <title>Quick-start single process model</title>
-          <p></p>
-          <p>You can run most of ManifoldCF in a single process, for evaluation and convenience.  This single-process version uses Jetty to handle its web applications, and Hsqldb as
-            an embedded database.  All you need to do to run this version of ManifoldCF is to follow the Ant-based build instructions above, and then:</p>
-          <p></p>
-          <source>
-cd example
-start[.bat|.sh]
-          </source>
-          <p></p>
-          <p>In the quick-start model, all database initialization and connector registration takes place automatically whenever ManifoldCF is started (at the cost of some startup delay).
-            The crawler UI can be found at http://&#60;host&#62;:8345/mcf-crawler-ui.  The authority service can be found at http://&#60;host&#62;:8345/mcf-authority-service/UserACLs.
-            The programmatic API is at http://&#60;host&#62;:8345/mcf-api-service.</p>
-          <p></p>
-          <p>You can stop the quick-start ManifoldCF at any time using ^C, or by using the script <em>stop[.bat|.sh]</em></p>
-          <p></p>
-          <p>Bear in mind that Hsqldb is not as full-featured a database as is PostgreSQL.  This means that any performance testing you may do against the quick start example may
-            not be applicable to a full installation.  Furthermore, embedded Hsqldb only permits one process at a time to be connected to its databases, so you <strong>cannot</strong> use any
-            of the ManifoldCF commands (as described below) while the quick-start ManifoldCF is running.</p>
-          <p></p>
-          <p>Another caveat that you will need to be aware of with the quick-start version of ManifoldCF is that it in no way removes the need for you to run any separate processes
-            that individual connectors require.  Specifically, the Documentum and FileNet connectors require processes to be independently started in order to function.  You will need
-            to read about these connector-specific processes below in order to use the corresponding connectors.  Scripts for running these processes can be found in the directories
-            named <em>processes/xxx</em>.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Single-process deployable war</title>
-          <p></p>
-          <p>Under the distribution directory <em>web/war</em>, there is a war file called <em>mcf-combined-service.war</em>.  This web application contains the exact same
-            functionality as the quick-start example, but bundled up as a single war instead.  An example script is provided to run this web application under Jetty.  You can execute
-            the script as follows:</p>
-          <p></p>
-          <source>
-  cd example
-  start-combined[.sh|.bat]
-          </source>
-          <p></p>
-          <p>The combined web service presents the crawler UI at the root path for the web application, which is <em>http://&#60;host&#62;:8345/mcf/</em>.  The authority
-            service functionality can be found at <em>http://&#60;host&#62;:8345/mcf/UserACLs</em>, similar to the quick-start example.  However, the programmatic API service has a path
-            other than the root: <em>http://&#60;host&#62;:8345/mcf/api/</em>.</p>
-          <p>The script that starts the combined-service web application uses the same database instance (Hsqldb by default) as does the quick-start, and the same <em>properties.xml</em>
-            file.  The same caveats about required individual connector processes also apply as they do for the quick-start example.</p>
-          <p></p>
-
-          <section>
-            <title>Running single-process combined war example using Tomcat</title>
-            <p>In order to run the ManifoldCF single-process combined war example under Tomcat, you will need to take the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>
-              <li>Start Tomcat.</li>
-              <li>Deploy and start the mcf-combined-service web application, preferably using the Tomcat administration client.</li>
-            </ol>
-          </section>
-
-        </section>
-
-        <section>
-          <title>Simplified multi-process model using file-based synchronization</title>
-          <p></p>
-          <p>ManifoldCF can also be deployed in a simplified multi-process model which uses files to synchronize processes.  Inside the <em>multiprocess-file-example</em> directory, you will find everything you need to do this.  (The
-              <em>multiprocess-file-example-proprietary</em> directory is similar but includes proprietary material and is available only if you build ManifoldCF yourself.)  Below is a list of
-              what you will find in this directory.</p>
-          <p></p>
-          <table>
-            <caption>File-based multiprocess example files and directories</caption>
-            <tr><th><em>multiprocess-file-example</em> file/directory</th><th>Meaning</th></tr>
-            <tr><td><em>web</em></td><td>Web applications that should be deployed on tomcat or the equivalent, plus recommended application server -D switch names and values</td></tr>
-            <tr><td><em>processes</em></td><td>classpath jars that should be included in the class path for all non-connector-specific processes, along with -D switches, using the same convention as described for tomcat, above</td></tr>
-            <tr><td><em>properties.xml</em></td><td>an example ManifoldCF configuration file, in the right place for the multiprocess script to find it</td></tr>
-            <tr><td><em>logging.xml</em></td><td>an example ManifoldCF logging configuration file, in the right place for the properties.xml to find it</td></tr>
-            <tr><td><em>syncharea</em></td><td>an example ManifoldCF synchronization directory, which must be writable in order for multiprocess ManifoldCF to work</td></tr>
-            <tr><td><em>logs</em></td><td>where the ManifoldCF logs get written to</td></tr>
-            <tr><td><em>start-database[.sh|.bat]</em></td><td>script to start the HSQLDB database</td></tr>
-            <tr><td><em>initialize[.sh|.bat]</em></td><td>script to create the database instance, create all database tables, and register connectors</td></tr>
-            <tr><td><em>start-webapps[.sh|.bat]</em></td><td>script to start Jetty with the ManifoldCF web applications deployed</td></tr>
-            <tr><td><em>start-agents[.sh|.bat]</em></td><td>script to start the (first) agents process</td></tr>
-            <tr><td><em>start-agents-2[.sh|.bat]</em></td><td>script to start a second agents process</td></tr>
-            <tr><td><em>stop-agents[.sh|.bat]</em></td><td>script to stop all running agents processes cleanly</td></tr>
-            <tr><td><em>lock-clean[.sh|.bat]</em></td><td>script to clean up dirty locks (run only when all webapps and processes are stopped)</td></tr>
-          </table>
-          <p></p>
-          <section>
-            <title>Initializing the database and running</title>
-            <p></p>
-            <p>If you run the file-based multiprocess model, after you first start the database (using <em>start-database[.sh|.bat]</em>), you will need to initialize the database before you start the agents process or use the crawler UI.  To do this, all you need to do is
-                run the <em>initialize[.sh|.bat]</em> script.  Then, you will need to start the web applications (using <em>start-webapps[.sh|.bat]</em>) and the agents process (using
-                <em>start-agents[.sh|.bat]</em>), and optionally the second agents process (using <em>start-agents-2[.sh|.bat]</em>).</p>
-            <p></p>
-          </section>
-
-          <section>
-            <title>Running multiprocess file-based example using Tomcat</title>
-            <p>In order to run the ManifoldCF multiprocess file-based example under Tomcat, you will need to take the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>
-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>
-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>
-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>
-              <li>Start Tomcat.</li>
-              <li>Deploy and start the mcf-crawler-ui, mcf-authority-service, and mcf-api-service web applications, preferably using the Tomcat administration client.</li>
-            </ol>
-          </section>
-
-        </section>
-
-        <section>
-          <title>Simplified multi-process model using ZooKeeper-based synchronization</title>
-          <p></p>
-          <p>ManifoldCF can be deployed in a simplified multi-process model which uses Apache ZooKeeper to synchronize processes.  Inside the <em>multiprocess-kz-example</em> directory, you will find everything you need to do this.  (The
-              <em>multiprocess-zk-example-proprietary</em> directory is similar but includes proprietary material and is available only if you build ManifoldCF yourself.)  Below is a list of
-              what you will find in this directory.</p>
-          <p></p>
-          <table>
-            <caption>ZooKeeper-based multiprocess example files and directories</caption>
-            <tr><th><em>multiprocess-zk-example</em> file/directory</th><th>Meaning</th></tr>
-            <tr><td><em>web</em></td><td>Web applications that should be deployed on tomcat or the equivalent, plus recommended application server -D switch names and values</td></tr>
-            <tr><td><em>processes</em></td><td>classpath jars that should be included in the class path for all non-connector-specific processes, along with -D switches, using the same convention as described for tomcat, above</td></tr>
-            <tr><td><em>properties.xml</em></td><td>an example ManifoldCF configuration file, in the right place for the multiprocess script to find it</td></tr>
-            <tr><td><em>properties-global.xml</em></td><td>an example ManifoldCF shared configuration file, in the right place for the setglobalproperties script to find it</td></tr>
-            <tr><td><em>logging.xml</em></td><td>an example ManifoldCF logging configuration file, in the right place for the properties.xml to find it</td></tr>
-            <tr><td><em>zookeeper</em></td><td>the example ZooKeeper storage directory, which must be writable in order for ZooKeeper to work</td></tr>
-            <tr><td><em>logs</em></td><td>where the ManifoldCF logs get written to</td></tr>
-            <tr><td><em>runzookeeper[.sh|.bat]</em></td><td>script to run a ZooKeeper server instance</td></tr>
-            <tr><td><em>setglobalproperties[.sh|.bat]</em></td><td>script to initialize ZooKeeper with properties from properties-global.xml</td></tr>
-            <tr><td><em>start-database[.sh|.bat]</em></td><td>script to start the HSQLDB database</td></tr>
-            <tr><td><em>initialize[.sh|.bat]</em></td><td>script to create the database instance, create all database tables, and register connectors</td></tr>
-            <tr><td><em>start-webapps[.sh|.bat]</em></td><td>script to start Jetty with the ManifoldCF web applications deployed</td></tr>
-            <tr><td><em>start-agents[.sh|.bat]</em></td><td>script to start (the first) agents process</td></tr>
-            <tr><td><em>start-agents-2[.sh|.bat]</em></td><td>script to start a second agents process</td></tr>
-            <tr><td><em>stop-agents[.sh|.bat]</em></td><td>script to stop all running agents processes cleanly</td></tr>
-          </table>
-          <p></p>
-          <section>
-            <title>Initializing the database and running</title>
-            <p></p>
-            <p>If you run the ZooKeeper-based multiprocess example, then you must follow the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Start ZooKeeper (using the <em>runzookeeper[.sh|.bat]</em> script)</li>
-              <li>Initialize the ManifoldCF shared configuration data (using <em>setglobalproperties[.sh|.bat]</em>)</li>
-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>
-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>
-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>
-              <li>Start the web applications (using <em>start-webapps[.sh|.bat]</em>)</li>
-            </ol>
-            <p></p>
-          </section>
-
-          <section>
-            <title>Running multiprocess ZooKeeper example using Tomcat</title>
-            <p>In order to run the ManifoldCF ZooKeeper example under Tomcat, you will need to take the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Start ZooKeeper (using the <em>runzookeeper[.sh|.bat]</em> script)</li>
-              <li>Initialize the ManifoldCF shared configuration data (using <em>setglobalproperties[.sh|.bat]</em>)</li>
-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>
-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>
-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>
-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>
-              <li>Start Tomcat.</li>
-              <li>Deploy and start the mcf-crawler-ui, mcf-authority-service, and mcf-api-service web applications, preferably using the Tomcat administration client.</li>
-            </ol>
-          </section>
-          
-        </section>
-
-        <section>
-          <title>Command-driven multi-process model</title>
-          <p></p>
-          <p>The most generic way of deploying ManifoldCF involves calling ManifoldCF operations using scripts.  There are a number of java classes among the ManifoldCF classes
-            that are intended to be called directly, to perform specific actions in the environment or in the database.  These classes are usually invoked from the command line, with
-            appropriate arguments supplied, and are thus considered to be ManifoldCF <strong>commands</strong>.  Basic functionality supplied by these command classes is
-            as follows:</p>
-
-          <p></p>
-          <ul>
-             <li>Create/Destroy the ManifoldCF database instance</li>
-             <li>Start/Stop the <strong>agents</strong> process</li>
-             <li>Register/Unregister an agent class (there's currently only one included)</li>
-             <li>Register/Unregister an output connector</li>
-             <li>Register/Unregister a transformation connector</li>
-             <li>Register/Unregister a repository connector</li>
-             <li>Register/Unregister an authority connector</li>
-             <li>Register/Unregister a mapping connector</li>
-             <li>Clean up synchronization directory garbage resulting from an ungraceful interruption of an ManifoldCF process</li>
-             <li>Query for certain kinds of job-related information</li>
-          </ul>
-          <p></p>
-          <p>Individual connectors may contribute additional command classes and processes to this picture.</p>
-          <p></p>
-          <p>The multiprocess command execution scripts are delivered in the <em>processes</em> subdirectory.  The script for executing commands is
-            <em>processes/executecommand[.sh|.bat]</em>. This script requires two environment variables to be set before execution: JAVA_HOME, and
-            MCF_HOME, which should point to ManifoldCF's home execution directory, where the <em>properties.xml</em> file is found.)</p>
-            
-          <p></p>
-          <p>The basic steps required to set up and run ManifoldCF in command-driven file-based multi-process mode are as follows:</p>
-          <p></p>
-          <ul>
-            <li>Install PostgreSQL or MySQL.  The PostgreSQL JDBC driver included with ManifoldCF is known to work with version 9.1, so that version is the currently recommended
-              one.  If you want to use MySQL, the ant "download-dependencies" build target will fetch the appropriate MySQL JDBC driver.</li>
-            <li>Configure the database for your environment; the default configuration is acceptable for testing and experimentation.</li>
-            <li>Create the database instance (see commands below)</li>
-            <li>Initialize the database instance (see commands below)</li>
-            <li>Register the pull agent (org.apache.manifoldcf.crawler.system.CrawlerAgent, see below)</li>
-            <li>Register your connectors and authorities (see below)</li>
-            <li>Install a Java application server, such as Tomcat.</li>
-            <li>Deploy the war files from <em>web/war</em>, except for <em>mcf-combined.war</em>, to your application server (see below).</li>
-            <li>Set the starting environment variables for your app server to include any -D commands found in <em>web/define</em>.  The -D commands should be of the
-              form, "-D&#60;file name&#62;=&#60;file contents&#62;".  You will also need a "-Dorg.apache.manifoldcf.configfile=&#60;properties file&#62;" define option, or the
-              equivalent, in the application server's JVM startup in order for ManifoldCF to be able to locate its configuration file.</li>
-            <li>Use the <em>processes/executecommand[.bat|.sh]</em> command from execute the appropriate commands from the next section below, being sure to first set the
-              JAVA_HOME and MCF_HOME environment variables properly.</li>
-            <li>Start any supporting processes that result from your build.  (Some connectors such as Documentum and FileNet have auxiliary processes you need to run to make
-              these connectors functional.)</li>
-            <li>Start your application server.</li>
-            <li>Start the ManifoldCF agents process.</li>
-            <li>At this point, you should be able to interact with the ManifoldCF UI, which can be accessed via the mcf-crawler-ui web application</li>
-          </ul>
-          <p></p>
-          <p>The detailed list of commands is presented below.</p>
-          <p></p>
-          <section>
-            <title>Commands</title>
-            <p></p>
-            <p>After you have created the necessary configuration files, you will need to initialize the database, register the "pull-agent" agent, and then register your individual connectors.
-              ManifoldCF provides a set of commands for performing these actions, and others as well.  The classes implementing these commands are specified below.</p>
-            <p></p>
-            <table>
-              <tr><th>Core Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.core.DBCreate</td><td><em>dbuser</em> [<em>dbpassword</em>]</td><td>Create ManifoldCF database instance</td></tr>
-              <tr><td>org.apache.manifoldcf.core.DBDrop</td><td><em>dbuser</em> [<em>dbpassword</em>]</td><td>Drop ManifoldCF database instance</td></tr>
-              <tr><td>org.apache.manifoldcf.core.LockClean</td><td>None</td><td>Clean out synchronization directory</td></tr>
-              <tr><td>org.apache.manifoldcf.core.Obfuscate</td><td>string</td><td>Obfuscate a string, for use as an obfuscated parameter value</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>Agents Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.agents.Install</td><td>None</td><td>Create ManifoldCF agents tables</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.Uninstall</td><td>None</td><td>Remove ManifoldCF agents tables</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.Register</td><td><em>classname</em></td><td>Register an agent class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegister</td><td><em>classname</em></td><td>Un-register an agent class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAll</td><td>None</td><td>Un-register all current agent classes</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.SynchronizeAll</td><td>None</td><td>Un-register all registered agent classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.RegisterOutput</td><td><em>classname</em> <em>description</em></td><td>Register an output connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterOutput</td><td><em>classname</em></td><td>Un-register an output connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAllOutputs</td><td>None</td><td>Un-register all current output connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.SynchronizeOutputs</td><td>None</td><td>Un-register all registered output connector classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.RegisterTransformation</td><td><em>classname</em> <em>description</em></td><td>Register a transformation connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterTransformation</td><td><em>classname</em></td><td>Un-register a transformation connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAllTransformations</td><td>None</td><td>Un-register all current transformation connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.SynchronizeTransformations</td><td>None</td><td>Un-register all registered transformation connector classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.AgentRun</td><td>None</td><td>Main <strong>agents</strong> process class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.AgentStop</td><td>None</td><td>Stops the running <strong>agents</strong> process</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>Crawler Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.crawler.Register</td><td><em>classname</em> <em>description</em></td><td>Register a repository connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.UnRegister</td><td><em>classname</em></td><td>Un-register a repository connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.UnRegisterAll</td><td>None</td><td>Un-register all repository connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.SynchronizeConnectors</td><td>None</td><td>Un-register all registered repository connector classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.ExportConfiguration</td><td><em>filename</em> [<em>passcode</em>]</td><td>Export crawler configuration to a file</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.ImportConfiguration</td><td><em>filename</em> [<em>passcode</em>]</td><td>Import crawler configuration from a file</td></tr>
-            </table>
-            <p></p>
-            <p>NOTE: By adding a passcode as a second argument to the ExportConfiguration command class, the exported file will be encrypted by using the AES algorithm. This can be useful to
-              prevent repository passwords to be stored in clear text. In order to use this functionality, you must enter a salt value to your configuration file. The same passcode along
-              with the salt value are used to decrypt the file with the ImportConfiguration command class. See the documentation for the commands and properties above to find the
-              correct arguments and settings.</p>
-            <p></p>
-            <table>
-              <tr><th>Authorization Domain Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.authorities.RegisterDomain</td><td><em>domainname</em> <em>description</em></td><td>Register an authorization domain</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterDomain</td><td><em>domainname</em></td><td>Un-register an authorization domain</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>User Mapping Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.authorities.RegisterMapper</td><td><em>classname</em> <em>description</em></td><td>Register a mapping connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterMapper</td><td><em>classname</em></td><td>Un-register a mapping connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAllMappers</td><td>None</td><td>Un-register all mapping connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.SynchronizeMappers</td><td>None</td><td>Un-register all registered mapping connector classes that can't be found</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>Authority Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.authorities.RegisterAuthority</td><td><em>classname</em> <em>description</em></td><td>Register an authority connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAuthority</td><td><em>classname</em></td><td>Un-register an authority connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAllAuthorities</td><td>None</td><td>Un-register all authority connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.SynchronizeAuthorities</td><td>None</td><td>Un-register all registered authority connector classes that can't be found</td></tr>
-            </table>
-            <p></p>
-            <p>Remember that you need to include all the jars under <em>multiprocess-file-example/processes/lib</em> in the classpath whenever you run one of these commands!
-                But, luckily, there are scripts which do this for you.  These can be found in <em>multiprocess-file-example/processes/executecommand[.sh,.bat]</em>.
-                The scripts require some environment variables to be set, such as <em>MCF_HOME</em> and <em>JAVA_HOME</em>, and expect the configuration file to be
-                found at <em>MCF_HOME/properties.xml</em>.</p>
-            <p></p>
-          </section>
-          <section>
-            <title>Deploying the <strong>mcf-crawler-ui</strong>, <strong>mcf-authority-service</strong>, and <strong>mcf-api-service</strong> web applications</title>
-            <p></p>
-            <p>If you built ManifoldCF using ant, then the ant build will have constructed four war files for you under <em>web/war</em>.  You should ignore the <em>mcf-combined</em>
-                war in this directory for this deployment model.  If you intend to run ManifoldCF in multiprocess mode, you will need to deploy the other web applications on you application server.
-                There is no requirement that the <strong>mcf-crawler-ui</strong>, <strong>mcf-authority-service</strong>, and <strong>mcf-api-service</strong> web
-                applications be deployed on the same instance of the application server.  With the current architecture of ManifoldCF, they must be deployed on the same physical server, however.</p>
-            <p></p>
-            <p>For each of the application servers involved with ManifoldCF, you must set the following define, so that the ManifoldCF web applications can locate the configuration file:</p>
-            <source>
--Dorg.apache.manifoldcf.configfile=&#60;configuration file path&#62;
-            </source>
-            <p></p>
-          </section>
-          <section>
-            <title>Running the <strong>agents</strong> process</title>
-            <p></p>
-            <p>The <strong>agents</strong> process is the process that actually performs the crawling for ManifoldCF.  Start this process by running the command
-              "org.apache.manifoldcf.agents.AgentRun".  This class will run until stopped by invoking the command "org.apache.manifoldcf.agents.AgentStop".  It is highly
-              recommended that you stop the process in this way.  You may also stop the process using a SIGTERM signal, but "kill -9" or the equivalent is NOT recommended,
-              because that may result in dangling locks in the ManifoldCF synchronization directory.  (If you have to, clean up these locks by shutting down all ManifoldCF
-              processes, including the application server instances that are running the web applications, and invoking the command "org.apache.manifoldcf.core.LockClean".)</p>
-            <p></p>
-          </section>
-        </section>
-      </section>
-      
-      <section>
-        <title>The <em>connectors.xml</em> configuration file</title>
-        <p></p>
-        <p>The quick-start, combined, and simplified multi-process sample deployments of ManifoldCF have their own configuration file, called <em>connectors.xml</em>,
-          which is used to register the available connectors in the database.  The file has this basic format:</p>
-        <p></p>
-        <source>
-&#60;?xml version="1.0" encoding="UTF-8" ?&#62;
-&#60;connectors&#62;
- (clauses)
-&#60;/connectors&#62;
-        </source>
-        <p></p>
-        <p>The following tags are available to specify your connectors and authorization domains:</p>
-        <p></p>
-        <p>&#60;repositoryconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;authorityconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;mappingconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;outputconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;transformationconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;authorizationdomain name="<em>pretty_name</em>" domain="<em>domain_name</em>"/&#62;</p>
-        <p></p>
-        <p>The <em>connectors.xml</em> file typically has some connectors commented out - namely the ones build with stubs which require you to supply a
-          third-party library in order for the connector to run.  If you build ManifoldCF yourself, the <em>example-proprietary</em> and <em>multiprocess-file-example-proprietary</em>
-          and <em>multiprocess-zk-example-proprietary</em> directories instead use <em>connectors-proprietary.xml</em>.  The connectors you build against the proprietary libraries you supply will not have their
-          <em>connectors-proprietary.xml</em> tags commented out.</p>
-        <p></p>
-      </section>
-
-      <section>
-        <title>Running connector-specific processes</title>
-        <p></p>
-        <p>Connector-specific processes require the classpath for their invocation to include all the jars that are in the corresponding
-          <em>processes/&#60;process_name&#62;</em> directory.  The Documentum and FileNet connectors are the only two connectors that currently require additional processes. 
-          Start these processes using the commands listed below, and stop them with SIGTERM (or ^C, if they are running in a shell).</p>
-        <p></p>
-        <table>
-          <tr><th>Connector</th><th>Process</th><th>Main class</th><th>Script name (relative to <em>dist</em>)</th></tr>
-          <tr><td>Documentum</td><td>processes/documentum-server</td><td>org.apache.manifoldcf.crawler.server.DCTM.DCTM</td><td>processes/documentum-server/run[.sh|.bat]</td></tr>
-          <tr><td>Documentum</td><td>processes/documentum-registry</td><td>org.apache.manifoldcf.crawler.registry.DCTM.DCTM</td><td>processes/documentum-registry/run[.sh|.bat]</td></tr>
-          <tr><td>FileNet</td><td>processes/filenet-server</td><td>org.apache.manifoldcf.crawler.server.filenet.Filenet</td><td>processes/filenet-server/run[.sh|.bat]</td></tr>
-          <tr><td>FileNet</td><td>processes/filenet-registry</td><td>org.apache.manifoldcf.crawler.registry.filenet.Filenet</td><td>processes/filenet-registry/run[.sh|.bat]</td></tr>
-        </table>
-        <p>The registry process in all cases must be started before the corresponding server process, or the server process will report an error.  (It will, however, retry after some period of time.)
-            The scripts all require an MCF_HOME environment variable pointing to the place where properties.xml is found, as well as a JAVA_HOME environment variable pointing the JDK.
-            The server scripts also require other environment variables as well, consistent with the needs of the DFC or the FileNet API respectively.  For example, DFC requires the
-            DOCUMENTUM environment variable to be set, while the FileNet server script requires the WASP_HOME environment variable.</p>
-        <p>It is important to understand that the scripts work by building a classpath out of all jars that get copied into the <em>lib</em> and <em>lib-proprietary</em> directory underneath
-            each process during the ant build.  The <em>lib-proprietary</em> jars cannot be distributed in the binary version of ManifoldCF, so if you use this option you will still need to
-            copy them there yourself for the processes to run.  If you build ManifoldCF yourself, these jars are copied from the <em>lib-proprietary</em> directories underneath the documentum
-            or filenet connector directories.  For the server startup scripts to work properly, the <em>lib-proprietary</em> directories should have <strong>all</strong> of the jars needed to
-            allow the api code to function.</p>
-        <p></p>
-      </section>
-
-      <section>
-        <title>Database selection</title>
-        <p></p>
-        <p>You have a variety of open-source databases to choose from when deploying ManifoldCF.  The supported databases each have their own strengths and weaknesses, and
-          are listed below:</p>
-        <ul>
-          <li>PostgreSQL (preferred)</li>
-          <li>MySQL (preferred)</li>
-          <li>MariaDB (not yet evaluated))</li>
-          <li>HSQLDB</li>
-        </ul>
-        <p>You can select the database of your choice by setting the approprate properties in the applicable <em>properties.xml</em> file.  The choice of database is largely orthogonal
-          to the choice of deployment model.  The ManifoldCF deployment examples provided can thus be readily altered to use the database you desire.  The details and caveats of
-          each choice is described below.</p>
-        <p></p>
-        <section>
-          <title>Configuring a PostgreSQL database</title>
-          <p></p>
-          <p>Despite having an internal architecture that cleanly abstracts from specific database details, ManifoldCF is currently fairly specific to PostgreSQL at this time.  There are a number of reasons for this.</p>
-          <p></p>
-          <ul>
-             <li>ManifoldCF uses the database for its document queue, which places a significant load on it.  The back-end database is thus a significant factor in ManifoldCF's performance.  But, in exchange, ManifoldCF benefits enormously from the underlying ACID properties of the database.</li>
-             <li>The strategy for getting optimal query plans from the database is not abstracted.  For example, PostgreSQL 8.3+ is very sensitive to certain statistics about a database table, and will not generate a performant plan if the statistics are inaccurate by even a little, in some cases.  So, for PostgreSQL, the database table must be analyzed very frequently, to avoid catastrophically bad plans.  But luckily, PostgreSQL is pretty good at doing analysis quickly.  Oracle, on the other hand, takes a very long time to perform analysis, but its plans are much less sensitive.</li>
-             <li>PostgreSQL always does a sequential scan in order to count the number of rows in a table, while other databases return this efficiently.  This has affected the design of the ManifoldCF UI.</li>
-             <li>The choice of query form influences the query plan.  Ideally, this is not true, but for both PostgreSQL and for (say) Oracle, it is.</li>
-             <li>PostgreSQL has a high degree of parallelism and lack of internal single-threadedness.</li>
-          </ul>
-          <p></p>
-          <p>ManifoldCF has been tested against version 8.3.7, 8.4.5, 9.1, 9.2, and 9.3 of PostgreSQL.  We recommend the following configuration parameter settings to work optimally with ManifoldCF:</p>
-          <p></p>
-          <ul>
-             <li>A default database encoding of UTF-8</li>
-             <li><em>postgresql.conf</em> settings as described in the table below</li>
-             <li><em>pg_hba.conf</em> settings to allow password access for TCP/IP connections from ManifoldCF</li>
-             <li>A maintenance strategy involving cronjob-style vacuuming, rather than PostgreSQL autovacuum</li>
-          </ul>
-          <p></p>
-          <table>
-            <caption>Postgresql.conf parameters</caption>
-            <tr><th><em>postgresql.conf</em> parameter</th><th>Tested value</th></tr>
-            <tr><td>standard_conforming_strings</td><td>on</td></tr>
-            <tr><td>shared_buffers</td><td>1024MB</td></tr>
-            <tr><td>checkpoint_segments</td><td>300</td></tr>
-            <tr><td>maintenance<em>work</em>mem</td><td>2MB</td></tr>
-            <tr><td>tcpip_socket</td><td>true</td></tr>
-            <tr><td>max_connections</td><td>400</td></tr>
-            <tr><td>checkpoint_timeout</td><td>900</td></tr>
-            <tr><td>datestyle</td><td>ISO,European</td></tr>
-            <tr><td>autovacuum</td><td>off</td></tr>
-          </table>
-          <p></p>
-          <p>Note well: The <em>standard_conforming_strings</em> parameter setting is important to prevent any possibility of SQL injection attacks.  While ManifoldCF
-            uses parameterized queries in almost all cases, when it does do string quoting it presumes that the SQL standard for quoting is adhered to.  It is in general good practice
-            to set this parameter when working with PostgreSQL for this reason.</p>
-          <p></p>
-          <section>
-            <title>A note about PostgreSQL database maintenance</title>
-            <p></p>
-            <p>PostgreSQL's architecture causes it to accumulate dead tuples in its data files, which do not interfere with its performance but do bloat the database over time.  The
-              usage pattern of ManifoldCF is such that it can cause significant bloat to occur to the underlying PostgreSQL database in only a few days, under sufficient load.  PostgreSQL
-              has a feature to address this bloat, called <strong>vacuuming</strong>.  This comes in three varieties: autovacuum, manual vacuum, and manual full vacuum.</p>
-            <p></p>
-            <p>We have found that PostgreSQL's autovacuum feature is inadequate under such conditions, because it not only fights for database resources pretty much all the time,
-              but it falls further and further behind as well.  PostgreSQL's in-place manual vacuum functionality is a bit better, but is still much, much slower than actually making a new
-              copy of the database files, which is what happens when a manual full vacuum is performed.</p>
-            <p></p>
-            <p>Dead-tuple bloat also occurs in indexes in PostgreSQL, so tables that have had a lot of activity may benefit from being reindexed at the time of maintenance. </p>
-            <p>We therefore recommend periodic, scheduled maintenance operations instead, consisting of the following:</p>
-            <p></p>
-            <ul>
-             <li>VACUUM FULL VERBOSE;</li>
-             <li>REINDEX DATABASE &#60;the_db_name&#62;;</li>
-            </ul>
-            <p> </p>
-            <p>During maintenance, PostgreSQL locks tables one at a time.  Nevertheless, the crawler ui may become unresponsive for some operations, such as when counting
-              outstanding documents on the job status page.  ManifoldCF thus has the ability to check for the existence of a file prior to such sensitive operations, and will display a
-              useful "maintenance in progress" message if that file is found.  This allows a user to set up a maintenance system that provides adequate feedback for an ManifoldCF
-              user of the overall status of the system.</p>
-            <p></p>
-          </section>
-        </section>
-
-        <section>
-          <title>Configuring a MySQL database</title>
-          <p></p>
-          <p>MySQL is not quite as fast as PostgreSQL, but it is a relatively close second in performance tests.  Nevertheless, the ManifoldCF team does not have a large amount
-            of experience with this database at this time.  More details will be added to this section as information and experience becomes available.</p>
-        </section>
-        
-        <section>
-          <title>Configuring an HSQLDB database</title>
-          <p></p>
-          <p>HSQLDB's performance seems closely tied to how much of the database can be actually held in memory.  Performance at this time is about half that of PostgreSQL.</p>
-          <p>HSQLDB can be used with ManifoldCF in either an embedded fashion (which only works with single-process deployments), or in external fashion, with a database instance running in a separate
-            process.  See the <em>properties.xml</em> property descriptions for configuration details.</p>
-        </section>
-        
-      </section>
-        
-      <section>
-        <title>The ManifoldCF configuration files</title>
-        <p></p>
-        <p>Currently, ManifoldCF requires two configuration files: the main configuration property file, and the logging configuration file.</p>
-        <p></p>
-        <section>
-          <title><em>properties.xml</em> file properties</title>
-
-          <p>The <em>properties.xml</em> property file path can be specified by the system property "org.apache.manifoldcf.configfile".  If not specified through a -D operation, its
-              name is presumed to be <em>&#60;user_home&#62;/lcf/properties.xml</em>.  The form of the property file is XML, of the following basic form:</p>
-          <p></p>
-          <source>
-&#60;?xml version="1.0" encoding="UTF-8" ?&#62;
-&#60;configuration&#62;
- (clauses)
-&#60;/configuration&#62;
-          </source>
-          <p></p>
-          <p>The <em>properties.xml</em> file allows properties to be specified.  A property clause has the form:</p>
-          <p></p>
-          <p>&#60;property name="<em>property_name</em>" value="<em>property_value</em>"/&#62;</p>
-          <p></p>
-          <p>One of the optional properties is the name of the logging configuration file.  This property's name is "org.apache.manifoldcf.logconfigfile".  If not present, the logging configuration file will be assumed to be <em>&#60;user_home&#62;/manifoldcf/logging.xml</em>.  The logging configuration file is a standard commons-logging property file, and should be formatted accordingly.</p>
-          <p></p>
-          <p>Note that all properties described below can also be specified on the command line, via a -D switch.  If both methods of setting the property are used, the -D switch value will override the property file value.</p>
-          <p></p>
-          <p>The following table describes the configuration property file properties, and what they do:</p>
-          <p></p>
-          <table>
-            <caption>property.xml properties</caption>
-            <tr><th>Property</th><th>Required?</th><th>Function</th></tr>
-            <tr><td>org.apache.manifoldcf.authimplementationclass</td><td>No</td><td>Auth implementation class (defaults to "org.apache.manifoldcf.core.auth.DefaultAuthenticator", set to "org.apache.manifoldcf.core.auth.LdapAuthenticator" for LDAP)</td></tr>
-            <tr><td>org.apache.manifoldcf.login.name</td><td>No</td><td>Default auth implementation crawler UI login user ID (defaults to "admin")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.password</td><td>No</td><td>Default auth implementation crawler UI login user password (defaults to "admin")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.password.obfuscated</td><td>No</td><td>Default auth implementation obfuscated crawler UI login user password (defaults to "admin")</td></tr>
-            <tr><td>org.apache.manifoldcf.apilogin.name</td><td>No</td><td>Default auth implementation API login user ID (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.apilogin.password</td><td>No</td><td>Default auth implementation API login user password (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.apilogin.password.obfuscated</td><td>No</td><td>Default auth implementation obfuscated API login user password (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.providerurl</td><td>No</td><td>LDAP auth implementation provider URL (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.securityauthenticationtype</td><td>No</td><td>LDAP auth implementation auth type (defaults to "simple")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.securityprincipal</td><td>No</td><td>LDAP auth implementation security principal (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.contextsearchquery</td><td>No</td><td>LDAP auth implementation search query (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.searchattribute</td><td>No</td><td>LDAP auth implementation search attribute (defaults to "uid")</td></tr>
-            <tr><td>org.apache.manifoldcf.crawleruiwarpath</td><td>Yes, for Jetty</td><td>Location of Crawler UI war</td></tr>
-            <tr><td>org.apache.manifoldcf.authorityservicewarpath</td><td>Yes, for Jetty</td><td>Location of Authority Service war</td></tr>
-            <tr><td>org.apache.manifoldcf.apiservicewarpath</td><td>Yes, for Jetty</td><td>Location of API Service war</td></tr>
-            <tr><td>org.apache.manifoldcf.usejettyparentclassloader</td><td>Yes, for Jetty</td><td>true for single-process example, false for multiprocess example.</td></tr>
-            <tr><td>org.apache.manifoldcf.connectorsconfigurationfile</td><td>No</td><td>Location of connectors.xml file, for QuickStart, so ManifoldCF can register connectors.</td></tr>
-            <tr><td>org.apache.manifoldcf.dbsuperusername</td><td>No</td><td>Database superuser name, for QuickStart, so ManifoldCF can create database instance.</td></tr>
-            <tr><td>org.apache.manifoldcf.dbsuperuserpassword</td><td>No</td><td>Database superuser password, for QuickStart, so ManifoldCF can create database instance.</td></tr>
-            <tr><td>org.apache.manifoldcf.dbsuperuserpassword.obfuscated</td><td>No</td><td>Obfuscated database superuser password, for QuickStart, so ManifoldCF can create database instance.</td></tr>
-            <tr><td>org.apache.manifoldcf.ui.maxstatuscount</td><td>No</td><td>The maximum number of documents ManifoldCF will try to count for the job status display.  Defaults to 500000.</td></tr>
-            <tr><td>org.apache.manifoldcf.databaseimplementationclass</td><td>No</td><td>Specifies the class to use to implement database access.
-                Default is a built-in Hsqldb implementation.  Supported choices are:
-                org.apache.manifoldcf.core.database.DBInterfacePostgreSQL, 
-                org.apache.manifoldcf.core.database.DBInterfaceMySQL,
-                org.apache.manifoldcf.core.database.DBInterfaceMariaDB,
-                org.apache.manifoldcf.core.database.DBInterfaceHSQLDB</td></tr>
-            <tr><td>org.apache.manifoldcf.postgresql.hostname</td><td>No</td><td>PostgreSQL server host name, or localhost if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.postgresql.port</td><td>No</td><td>PostgreSQL server port, or standard port if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.postgresql.ssl</td><td>No</td><td>Set to "true" for ssl communication with PostgreSQL.</td></tr>
-            <tr><td>org.apache.manifoldcf.mysql.server</td><td>No</td><td>The MySQL or MariaDB server name.  Defaults to 'localhost'.</td></tr>
-            <tr><td>org.apache.manifoldcf.mysql.client</td><td>No</td><td>The MySQL or MariaDB client property.  Defaults to 'localhost'.  You may want to set this to '%' for a multi-machine setup.</td></tr>
-            <tr><td>org.apache.manifoldcf.mysql.ssl</td><td>No</td><td>Set to "true" for ssl communication with MySQL or MariaDB.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabasepath</td><td>No</td><td>Absolute or relative path to HSQLDB database; default is '.'.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseprotocol</td><td>Yes, for remote HSQLDB connection</td><td>The HSQLDB JDBC protocol; choices are 'hsql', 'http', or 'https'. Default is blank (which means an embedded instance)</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseserver</td><td>Yes, for remote HSQLDB connection</td><td>The HSQLDB remote server name.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseport</td><td>No</td><td>The HSQLDB remote server port.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseinstance</td><td>No</td><td>The HSQLDB remote database instance name.</td></tr>
-            <tr><td>org.apache.manifoldcf.lockmanagerclass</td><td>No</td><td>Specifies the class to use to implement synchronization.  Default
-                is either file-based synchronization or in-memory synchronization, using the org.apache.manifoldcf.core.lockmanager.LockManager class.
-                Options include org.apache.manifoldcf.core.lockmanager.BaseLockManager, org.apache.manifoldcf.core.FileLockManager, and
-                org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager.</td></tr>
-            <tr><td>org.apache.manifoldcf.synchdirectory</td><td>Yes, if file-based synchronization class is specified</td><td>Specifies the path of a
-                synchronization directory.  All ManifoldCF process owners <strong>must</strong> have read/write privileges to this directory.</td></tr>
-            <tr><td>org.apache.manifoldcf.zookeeper.connectstring</td><td>Yes, if ZooKeeper-based synchronization class is specified</td><td>Specifies the ZooKeeper
-                connection string, consisting of comma-separated hostname:port pairs.</td></tr>
-            <tr><td>org.apache.manifoldcf.zookeeper.sessiontimeout</td><td>No</td><td>Specifies the ZooKeeper
-                session timeout, if ZooKeeperLockManager is specified.  Defaults to 2000.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.maxhandles</td><td>No</td><td>Specifies the maximum number of database connection handles that will by pooled.  Recommended value is 200.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.handletimeout</td><td>No</td><td>Specifies the maximum time a handle is to live before it is presumed dead.  Recommend a value of 604800, which is the maximum allowable.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.connectiontracking</td><td>No</td><td>True or false.  When "true", will track all allocated database connection handles, and will dump an allocation stack trace when the pool is exhausted.  Useful for diagnosing connection leaks.</td></tr>
-            <tr><td>org.apache.manifoldcf.logconfigfile</td><td>No</td><td>Specifies location of logging configuration file.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.name</td><td>No</td><td>Describes database name for ManifoldCF; defaults to "dbname" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.username</td><td>No</td><td>Describes database user name for ManifoldCF; defaults to "manifoldcf" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.password</td><td>No</td><td>Describes database user's password for ManifoldCF; defaults to "local_pg_password" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.password.obfuscated</td><td>No</td><td>Obfuscated database user's password for ManifoldCF; defaults to "local_pg_password" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.threads</td><td>No</td><td>Number of crawler worker threads created.  Suggest a value of 30.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.expirethreads</td><td>No</td><td>Number of crawler expiration threads created.  Suggest a value of 10.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.cleanupthreads</td><td>No</td><td>Number of crawler cleanup threads created.  Suggest a value of 10.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.deletethreads</td><td>No</td><td>Number of crawler delete threads created.  Suggest a value of 10.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.historycleanupinterval</td><td>No</td><td>Milliseconds to retain history records.  Default is 0.  Zero means "forever".</td></tr>
-            <tr><td>org.apache.manifoldcf.misc</td><td>No</td><td>Miscellaneous debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.db</td><td>No</td><td>Database debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.lock</td><td>No</td><td>Lock management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.cache</td><td>No</td><td>Cache management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.agents</td><td>No</td><td>Agent management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.perf</td><td>No</td><td>Performance logging debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawlerthreads</td><td>No</td><td>Log crawler thread activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.hopcount</td><td>No</td><td>Log hopcount tracking activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.jobs</td><td>No</td><td>Log job activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.connectors</td><td>No</td><td>Log connector activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.scheduling</td><td>No</td><td>Log document scheduling activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.authorityconnectors</td><td>No</td><td>Log authority connector activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.authorityservice</td><td>No</td><td>Log authority service activity.  Legal values are INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.salt</td><td>Yes, if file encryption is used</td><td>Specify the salt value to be used for encrypting the file to which the crawler configuration is exported.</td></tr>
-          </table>
-          <p></p>
-          <p>The following table describes 'advanced' configuration property file properties.  They shouldn't need to be changed but provide a greater level of customization:</p>
-          <p></p>
-          <table>
-            <caption>Advanced property.xml properties</caption>
-            <tr><th>Property</th><th>Required?</th><th>Default</th><th>Function</th></tr>
-            <tr><td>org.apache.manifoldcf.crawler.repository.store_history</td><td>No</td><td>true</td><td>If you do not require reports from within this will disable logging to the repository history (although the reports will still run they will not contain any content). This can increase throughput and reduce the rate of growth of the database.</td></tr>
-            <tr><td>org.apache.manifoldcf.db.postgres.analyze.&#60;tablename&#62;</td><td>No</td><td>2000</td><td>For postgresql, specify how many changes should be carried out before carrying out an 'ANALYZE' on the specified table.</td></tr>
-            <tr><td>org.apache.manifoldcf.db.postgres.reindex.&#60;tablename&#62;</td><td>No</td><td>250000</td><td>For postgresql, specify how many changes should be carried out before carrying out an 'REINDEX' on the specified table.</td></tr>
-            <tr><td>org.apache.manifoldcf.db.mysql.analyze.&#60;tablename&#62;</td><td>No</td><td>2000</td><td>For MySql or MariaDB, specify how many changes should be carried out before carrying out an 'ANALYZE' on the specified table.</td></tr>
-            <tr><td>org.apache.manifoldcf.ui.maxstatuscount</td><td>No</td><td>500000</td><td>Set the upper limit for the precise document count to be returned on the 'Status and Job Management' page.</td></tr>
-          </table>
-          <p></p>
-          <p>The configuration file can also specify a set of directories which will be searched for connector jars.  The directive that adds to the class path is:</p>
-          <p></p>
-          <p>&#60;libdir path="<em>path</em>"/&#62;</p>
-          <p></p>
-          <p>Note that the path can be relative.  For the purposes of path resolution, "." means the directory in which the <em>properties.xml</em> file is itself located.</p>
-          <p></p>
-        </section>
-          
-        <section>
-          <title>Logging configuration file properties</title>
-          <p></p>
-          <p>The <em>logging.xml</em> file contains Apache log4j2 properties in a log4j2 xml format.  The way the
-            ManifoldCF logging output is formatted is controlled through this file, as are any loggers that ManifoldCF doesn't explicitly define (e.g. loggers for Apache HttpComponent/HttpClient).
-            Other resources are therefore best suited to describe the parameters that can be used and to what effect.</p>
-        </section>
-          
-      </section>
-      
-      <section>
-        <title>Running the ManifoldCF Apache2 plug in</title>
-        <p></p>
-        <p>The ManifoldCF Apache2 plugin, mod-authz-annotate, is designed to convert an authenticated principle (e.g. from mod-auth-kerb), and query a set of authority services
-          for access tokens using an HTTP request.  These access tokens are then passed to a (not included) search engine UI, which can use them to help compose a search that
-          properly excludes content that the user is not supposed to see.</p>
-        <p></p>
-        <p>The list of authority services so queried is configured in Apache's httpd.conf file.  This project includes only one such service: the java authority service, which uses
-          authority connections defined in the crawler UI to obtain appropriate access tokens.</p>
-        <p></p>
-        <p>In order for mod-authz-annotate to be used, it must be placed into Apache2's extensions directory, and configured appropriately in the httpd.conf file.</p>
-        <p></p>
-        <p>Note: The ManifoldCF project now contains support for converting a Kerberos principal to a list of Active Directory SIDs.  This functionality is contained in the
-          Active Directory Authority.  The following connectors are expected to make use of this authority:</p>
-        <p></p>
-        <ul>
-         <li>FileNet</li>
-         <li>CIFS</li>
-         <li>SharePoint</li>
-        </ul>
-        <p></p>
-        <section>
-          <title>Configuring the ManifoldCF Apache2 plug in</title>
-          <p></p>
-          <p>mod-authz-annotate understands the following httpd.conf commands:</p>
-          <p></p>
-          <table>
-            <tr><th>Command</th><th>Meaning</th><th>Values</th></tr>
-            <tr><td>AuthzAnnotateEnable</td><td>Turn on/off the plugin</td><td>"On", "Off"</td></tr>
-            <tr><td>AuthzAnnotateAuthority</td><td>Point to an authority service that supports ACL queries, but not ID queries</td><td>The authority URL</td></tr>
-            <tr><td>AuthzAnnotateACLAuthority</td><td>Point to an authority service that supports ACL queries, but not ID queries</td><td>The authority URL</td></tr>
-            <tr><td>AuthzAnnotateIDAuthority</td><td>Point to an authority service that supports ID queries, but not ACL queries</td><td>The authority URL</td></tr>
-            <tr><td>AuthzAnnotateIDACLAuthority</td><td>Point to an authority service that supports both ACL queries and ID queries</td><td>The authority URL</td></tr>
-          </table>
-        </section>
-      </section>
-    
-      <section>
-        <title>Running ManifoldCF with Apache Maven</title>
-        <p></p>
-        <p>If you build ManifoldCF with Maven, then you will need to run ManifoldCF under Maven.  You currently don't get a lot of options here; the only model
-            offered is the QuickStart single process model.  To run it, all you need to do is:</p>
-        <source>
-cd framework/jetty-runner
-mvn exec:exec
-        </source>
-      </section>
-
-    </section>
-
-    <section>
-      <title>Running ManifoldCF tests</title>
-      <p></p>
-      <p>ManifoldCF has a large suite of tests which helps verify the integrity of a ManifoldCF release.  These tests come in several varieties:</p>
-      <p></p>
-      <ul>
-        <li>Unit tests, which test specific classes</li>
-        <li>Integration tests, which test connectors running in the MCF environment</li>
-        <li>Load tests, which are designed to run connectors under load over a long period of time</li>
-        <li>UI tests, which are like integration tests but are meant to exercise the UI</li>
-      </ul>
-      <p>There are no special considerations for unit tests.  These are executed across the whole project by the main ant target "run-tests".</p>
-      <p>Integration tests have a second dimension of variety, namely which database the test is meant to run on.  The testing databases are:</p>
-      <p></p>
-      <ul>
-        <li>HSQLDB (an embedded database)</li>
-        <li>HSQLDBext (running against HSQLDB as an external service)</li>
-        <li>PostgreSQL (requires a local installation of PostgreSQL to run against)</li>
-        <li>MySQL (requires a local installation of MySQL to run against)</li>
-      </ul>
-      <p>For both the PostgreSQL and Mysql tests, the databases that are installed locally must have a specific superuser and password set when they are installed, so that the
-         tests can create a test database instance and tear it down again.  The superuser name and password for PostgreSQL should be "postgres"/"postgres".  The superuser name
-         and password for MySQL should be "root"/"mysql".</p>
-      <p>Once set up, you can run the tests you want against the database you want by invoking the ant targets as follows:</p>
-      <table>
-        <caption>Databases and ant targets</caption>
-        <tr><th>Database</th><th>ant targets</th></tr>
-        <tr><td>HSQLDB, HSQLDBext</td><td>test-hs, load-hs</td></tr>
-        <tr><td>PostgreSQL</td><td>test-pg, load-pg</td></tr>
-        <tr><td>MySQL</td><td>test-my, load-my</td></tr>
-      </table>
-      <p></p>
-      <p>Running the UI tests requires some additional software installation and configuration as well.  This is what you will need:</p>
-      <p></p>
-      <ul>
-        <li>Install the Google Chrome browser on your testing machine</li>
-        <li>Download the appropriate Selenium Chrome driver from this <a href="https://chromedriver.storage.googleapis.com/index.html?path=2.28/">URL</a></li>
-        <li>Unpack the driver executable and place it in the location of your choice</li>
-        <li>Set the environment variable <em>SL_CHROME_DRIVER</em> to point to the executable</li>
-      </ul>
-      <p>After this, you should be able to run the UI tests using the ant target "uitests".  (This executes only the HSQLDB UI tests at this time.)</p>
-    </section>
-    
-    <section>
-      <title>Integrating ManifoldCF into another application</title>
-      <p></p>
-      <p>ManifoldCF can be integrated into another application through a variety of methods.  We'll cover these below.</p>
-      <p></p>
-
-      <section>
-        <title>Integrating the Quick Start example</title>
-        <p></p>
-        <p>The Quick Start example can readily be integrated into a single-process application, by using the support methods found in the org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner class.
-          For the web application components of ManifoldCF, you can either use this class to start them under Jetty, or you can choose to deploy them yourself.  Please note, however, that if you start the ManifoldCF
-          agents process within a web application, you are effectively not running a single-process version of ManifoldCF anymore, because each web application will effectively
-          have its own set of static classes.</p>
-        <p>If you want to try the single-process integration, you should learn what you need by reading the Javadoc for the ManifoldCFJettyRunner class.</p>
-      </section>
-      
-      <section>
-        <title>Integrating a multi-process setup</title>
-        <p></p>
-        <p>In a multi process setup, all of the ManifoldCF processes might as well exist on their own.  You can learn how to programmatically start the agents process by looking at the code
-          in the AgentRun command class, as described above.  Similarly, the command classes that register connectors are very small and should be easy to understand.</p>
-      </section>
-
-      <section>
-          <title>Integrating ManifoldCF with a search engine</title>
-          <p></p>
-          <p>ManifoldCF's Authority Service is designed to allow maximum flexibility in integrating ManifoldCF security with search engines.  The
-                service receives a user identity (as a set of authorization domain/user name tuples), and produces a set of tokens.  It also returns a 
-                summary of the status of all authorities that were involved in the assembly of the set of tokens, as a nicety.  A search engine user
-                interface could thus signal the user when the results they might be seeing are incomplete, and why.</p>
-          <p>The Authority Service expects the following arguments, passed as URL arguments and properly URL encoded:</p>
-          <p></p>
-          <table>
-            <caption>Authority Service URL parameters</caption>
-            <tr><th>Authority Service URL parameter</th><th>Meaning</th></tr>
-            <tr><td>username</td><td>the username, if there is only one authorization domain</td></tr>
-            <tr><td>domain</td><td>the optional authorization domain if there is only one authorization domain (defaults to empty string)</td></tr>
-            <tr><td>username_<em>XX</em></td><td>username number <em>XX</em>, where <em>XX</em> is an integer starting at zero</td></tr>
-            <tr><td>domain_<em>XX</em></td><td>authorization domain <em>XX</em>, where <em>XX</em> is an integer starting at zero</td></tr>
-          </table>
-          <p></p>
-          <p>Access tokens and authority statuses are returned in the HTTP response separated by newline characters.  Each line has a prefix
-                as follows:</p>
-          <p></p>
-          <table>
-            <caption>Authority Service response prefixes</caption>
-            <tr><th>Authority Service response prefix</th><th>Meaning</th></tr>
-            <tr><td>TOKEN:</td><td>An access token</td></tr>
-            <tr><td>AUTHORIZED:</td><td>The name of an authority that found the user to be authorized</td></tr>
-            <tr><td>UNREACHABLEAUTHORITY:</td><td>The name of an authority that was found to be unreachable or unusable</td></tr>
-            <tr><td>UNAUTHORIZED:</td><td>The name of an authority that found the user to be unauthorized</td></tr>
-            <tr><td>USERNOTFOUND:</td><td>The name of an authority that could not find the user</td></tr>
-          </table>
-          <p></p>
-          <p>It is important to remember that only the "TOKEN:" lines actually matter for security.  Even if any of the error conditions apply, the set
-                of tokens returned by the Authority Service will be correctly supplied in order to apply appropriate security to documents being searched.</p>
-          <p>If you choose to deploy a search-engine plugin supplied by the Apache ManifoldCF project (for example, the Solr plugin), you will not need
-                know any of the above, since part of the plugin's purpose is to communicate with the Authority Service and apply the access tokens that are
-                returned to the search query automatically.  Some plugins, such as the ElasticSearch plugin, are more or less like toolkits, but still hide most
-                of the above from the integrator.  In a more highly customized system, however, you may need to develop your own code which interacts
-                with the Authority Service in order to meet your goals.</p>
-      </section>
-
-    </section>
-  </body>
-
-</document>
-
-
-
-
-
-
-
-
-
-
diff --git a/site/src/documentation/content/xdocs/en_US/included-connectors.xml b/site/src/documentation/content/xdocs/en_US/included-connectors.xml
deleted file mode 100644
index 804a58d..0000000
--- a/site/src/documentation/content/xdocs/en_US/included-connectors.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document>
-
-  <header>
-    <title>Included connectors</title>
-  </header>
-
-  <body>
-    <section>
-      <title>Included connectors</title>
-      <p>ManifoldCF supports the following connectors:</p>
-      <p></p>
-      <table>
-        <caption>Repository Connector interoperability table</caption>
-        <tr><th>System</th><th>Connector Platform</th><th>Server Platform</th><th>Client Version</th><th>Server Version</th></tr>
-        <tr><td>Alfresco</td><td>Pure Java</td><td>Various</td><td>Tested using the Alfresco Web Services Client 4.0.b</td><td>Tested with Alfresco 2.x, 3.x and 4.x</td></tr>
-        <tr><td>Alfresco WebScripts</td><td>Pure Java</td><td>Various</td><td>Tested using the Alfresco Indexer WebScripts 0.8.1</td><td>Tested with Alfresco 5.0.d, 5.0.2 Enterprise</td></tr>
-        <tr><td>Amazon S3</td><td>Pure Java</td><td>Various</td><td> N/A </td><td> N/A </td></tr>
-        <tr><td>Confluence</td><td>Pure Java</td><td>Various</td><td> N/A </td><td> N/A </td></tr>
-        <tr><td>CMIS</td><td>Pure Java</td><td>Various</td><td>CMIS 1.1</td><td>CMIS 1.1</td></tr>
-        <tr><td>DropBox</td><td>Pure Java</td><td>Various</td><td>1.5.3</td><td>N/A</td></tr>
-        <tr><td>Documentum (EMC)</td><td> Win, RedHat </td><td> Win, RedHat </td><td> Tested with DFC 5.3 SP5, 6.7.1, 7.2</td><td> Tested against 5.3, 6.0, and 6.5 servers </td></tr>
-        <tr><td>Email</td><td>Pure Java</td><td>Various</td><td>Javamail 1.4</td><td>N/A</td></tr>
-        <tr><td>FileNet (IBM)</td><td>Pure Java</td><td>Win, RedHat</td><td>Tested with P8 V4.1, V4.5</td><td>Tested with P8 V4.1, V4.5</td></tr>
-        <tr><td>File System</td><td>Pure Java</td><td>Win/*NIX</td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>Google Drive</td><td>Pure Java</td><td>Various</td><td>v2-rev64-1.14.1-beta</td><td>N/A</td></tr>
-        <tr><td>GridFS</td><td>Pure Java</td><td>Various</td><td> N/A </td><td> N/A </td></tr>
-        <tr><td>HDFS</td><td>Pure Java</td><td>Various</td><td>2.2.0</td><td>1.1.2</td></tr>
-        <tr><td>JDBC</td><td> Pure Java </td><td> Various </td><td> Supports JDBC V2, V3, V4; tested with Oracle 10, JTDS 1.2, PostgreSQL 9.1, MySQL 5.5 drivers </td><td> Various </td></tr>
-        <tr><td>Jira</td><td> Pure Java </td><td>Various</td><td>N/A</td><td>5.0-6.1</td></tr>
-        <tr><td>Kafka</td><td> Pure Java </td><td>Various</td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>LiveLink (OpenText)</td><td> Pure Java </td><td> Win </td><td> LAPI 9.7.1, 10.2.0 </td><td> Tested with 9.2.0 - 10.2.0 </td></tr>
-        <tr><td>Meridio (Autonomy)</td><td> Pure Java </td><td> Win </td><td> N/A </td><td> Tested with Meridio 4.1, 5.0 </td></tr> 
-        <tr><td>RSS</td><td> Pure Java </td><td> N/A </td><td> N/A </td><td>Atom, RSS 2.0, others </td></tr>
-        <tr><td>SharePoint (MSFT)</td><td>Pure Java </td><td>Win</td><td> N/A </td><td> Tested with SharePoint 2003 (2.0), 2007 (3.0), 2010 (4.0), 2013 (5.0)</td></tr>
-        <tr><td>Web</td><td> Pure Java </td><td>N/A</td><td> N/A </td><td>HTML Version 1.0, 1.1, 2.0, Atom, RSS 2.0, others </td></tr>
-        <tr><td>Windows Shares</td><td>Pure Java</td><td> Win, Samba, NetApp, other NAS systems </td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>Wiki</td><td> Pure Java </td><td>N/A</td><td> N/A </td><td>Wiki version 1.8 and above </td></tr>
-
-      </table>
-      
-      <table>
-      	<caption>Output Connector interoperability table</caption>
-      	<tr><th>System</th><th>Connector Platform</th><th>Server Platform</th><th>Client Version</th><th>Server Version</th></tr>
-      	<tr><td>Amazon CloudSearch</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> N/A </td></tr>
-      	<tr><td>ElasticSearch</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> Tested with ElasticSearch 1.0, 1.1, 1.2, 1.3 </td></tr>
-      	<tr><td>OpenSearchServer</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> Tested with OpenSearchServer 1.2.1, 1.2.2, 1.2.3, 1.3, 1.4, 1.5.x </td></tr>
-      	<tr><td>SearchBlox</td><td>Pure Java</td><td>Various</td><td>Various</td><td>Various</td></tr>
-      	<tr><td>Solr</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> Tested with Solr 1.4, 3.6.2, 4.0.0, 4.1.0, 4.2.0, 4.3.0, 4.5.1 </td></tr>
-      </table>
-      
-      <table>
-      	<caption>Authority Connector interoperability table</caption>
-      	<tr><th>System</th><th>Connector Platform</th><th>Server Platform</th><th>Client Version</th><th>Server Version</th></tr>
-      	<tr><td>Active Directory</td><td>Pure Java</td><td>Various</td><td>Various</td><td>Various</td></tr>
-        <tr><td>Alfresco WebScripts</td><td>Pure Java</td><td>Various</td><td>Tested using the Alfresco Indexer WebScripts 0.8.1</td><td>Tested with Alfresco 5.0.d, 5.0.2 Enterprise</td></tr>
-      	<tr><td>Amazon S3</td><td>Pure Java</td><td>Various</td><td> N/A </td><td> N/A </td></tr>
-      	<tr><td>Confluence</td><td>Pure Java</td><td>Various</td><td> N/A </td><td> N/A </td></tr>
-      	<tr><td>LDAP</td><td>Pure Java</td><td>Various</td><td>Various</td><td>Various</td></tr>
-      	
-      </table>
-      
-      <table>
-      	<caption>Transformation Connector interoperability table</caption>
-      	<tr><th>System</th><th>Connector Platform</th><th>Server Platform</th><th>Client Version</th><th>Server Version</th></tr>
-      	<tr><td>OpenNLP Extractor</td><td>Pure Java</td><td>Various</td><td>Various</td><td>Various</td></tr>
-      	<tr><td>Tika Content Extractor</td><td>Pure Java</td><td>Various</td><td>Various</td><td>Various</td></tr>
-      </table>
-      
-      <table>
-      	<caption>Notification Connector interoperability table</caption>
-      	<tr><td>Email</td><td>Pure Java</td><td>Various</td><td>Javamail 1.4</td><td>N/A</td></tr>
-      	<tr><td>Rocket.Chat</td><td>Pure Java</td><td> N/A </td><td> N/A </td><td>Tested with Rocket.Chat 0.58.1</td></tr>
-      	<tr><td>Slack</td><td>Pure Java</td><td> N/A </td><td> N/A </td><td>Tested with Slack API November 2016</td></tr>
-      </table>
-    </section>
-  </body>
-</document>
-
diff --git a/site/src/documentation/content/xdocs/en_US/index.xml b/site/src/documentation/content/xdocs/en_US/index.xml
deleted file mode 100644
index 05225b0..0000000
--- a/site/src/documentation/content/xdocs/en_US/index.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Welcome to ManifoldCF release documentation!</title> 
-  </header> 
-
-  <body> 
-    <section>
-	<title>What Is ManifoldCF?</title>
-	<p>ManifoldCF is an effort to provide an open source framework for connecting source content repositories like Microsoft Sharepoint and EMC Documentum, to target repositories or indexes, such as Apache Solr , OpenSearchServer or ElasticSearch.  ManifoldCF also defines a security model for target repositories that permits them to enforce source-repository security policies.</p>
-	<p>Currently included connectors support FileNet P8 (IBM), Documentum (EMC), LiveLink (OpenText), Meridio (Autonomy), Windows shares (Microsoft), and SharePoint (Microsoft).  Also included are a general CMIS connector, a generic file system connector, a general JDBC connector, an RSS feed connector, a Wiki connector, and a general web connector.
-            Currently supported targets include Apache Solr, QBase (formerly MetaCarta) GTS , OpenSearchServer and ElasticSearch.  The complete repository compatibility list can be found <a href="included-connectors.html">here</a>.</p>
-	<p>The original ManifoldCF code base was granted by MetaCarta, Inc., to the Apache Software Foundation in December 2009.  The MetaCarta effort represented more than five years of successful development and testing in multiple, challenging enterprise environments.</p>
-    </section>
-
-    <section>
-	<title>A philosophical note about third-party repositories</title>
-	<p>Many of the connectors included with ManifoldCF currently require third-party libraries, packages, or other licensed materials in order to be built.
-              The code for these connectors can be distributed under Apache guidelines because they are conditionally compiled; that is, you as a developer must
-              supply the necessary third-party components before the connector will build.  While we have every intention of trying to reduce the number of
-              affected connectors by means of clean-room development under the auspices of ASF, realistically the current situation will not change in any
-              dramatic way very quickly.  The focus of this group remains primarily on providing solutions.</p>
-	<p>The required libraries, tools, and procedures for building each of the connectors are well documented in these pages.</p>
-    </section>
-
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/javadoc.xml b/site/src/documentation/content/xdocs/en_US/javadoc.xml
deleted file mode 100644
index 69c70ce..0000000
--- a/site/src/documentation/content/xdocs/en_US/javadoc.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document>
-
-  <header>
-    <title>ManifoldCF Javadoc</title>
-  </header>
-
-  <body>
-    <section>
-      <title>ManifoldCF Javadoc</title>
-      <p></p>
-      <p>The javadoc for the last released version of ManifoldCF and its connectors can be found by following the links below.</p>
-      <p><a href="../api/framework/index.html">ManifoldCF Framework</a></p>
-      <p><a href="../api/activedirectory/index.html">Active Directory authority</a></p>
-      <p><a href="../api/alfresco-webscript/index.html">Alfresco webscript authority and connector</a></p>
-      <p><a href="../api/alfresco/index.html">Alfresco connector</a></p>
-      <p><a href="../api/amazoncloudsearch/index.html">AmazonCloudSearch output connector</a></p>
-      <p><a href="../api/amazons3/index.html">Amazon S3 authority and connector</a></p>
-      <p><a href="../api/cmis/index.html">CMIS authority and connector</a></p>
-      <p><a href="../api/confluence/index.html">Confluence authority and connector</a></p>
-      <p><a href="../api/documentum/index.html">Documentum authority, connector, and support processes</a></p>
-      <p><a href="../api/dropbox/index.html">Dropbox connector</a></p>
-      <p><a href="../api/email/index.html">Email connector and notification connector</a></p>
-      <p><a href="../api/elasticsearch/index.html">ElasticSearch output connector</a></p>
-      <p><a href="../api/filenet/index.html">FileNet connector and support processes</a></p>
-      <p><a href="../api/filesystem/index.html">File system repository and output connector</a></p>
-      <p><a href="../api/forcedmetadata/index.html">Metadata transformation connector</a></p>
-      <p><a href="../api/generic/index.html">Generic connector</a></p>
-      <p><a href="../api/googledrive/index.html">GoogleDrive connector</a></p>
-      <p><a href="../api/gridfs/index.html">GridFS connector</a></p>
-      <p><a href="../api/gts/index.html">qBase GTS output connector</a></p>
-      <p><a href="../api/hdfs/index.html">HDFS repository and output connector</a></p>
-      <p><a href="../api/jcifs/index.html">CIFS connector</a></p>
-      <p><a href="../api/jira/index.html">JIRA connector and authority</a></p>
-      <p><a href="../api/jdbc/index.html">JDBC connector</a></p>
-      <p><a href="../api/kafka/index.html">Kafka output connector</a></p>
-      <p><a href="../api/livelink/index.html">LiveLink authority and connector</a></p>
-      <p><a href="../api/meridio/index.html">Meridio authority and connector</a></p>
-      <p><a href="../api/opensearchserver/index.html">OpenSearchServer output connector</a></p>
-      <p><a href="../api/opennlp/index.html">OpenNLP transformation connector</a></p>
-      <p><a href="../api/elasticsearch/index.html">ElasticSearch output connector</a></p>
-      <p><a href="../api/nullauthority/index.html">Null authority</a></p>
-      <p><a href="../api/nulloutput/index.html">Null output connector</a></p>
-      <p><a href="../api/regexpmapper/index.html">Regular expression mapping connector</a></p>
-      <p><a href="../api/rss/index.html">RSS connector</a></p>
-      <p><a href="../api/searchblox/index.html">Searchblox output connector</a></p>
-      <p><a href="../api/sharepoint/index.html">SharePoint connector</a></p>
-      <p><a href="../api/slack/index.html">Slack notification connector</a></p>
-      <p><a href="../api/solr/index.html">Solr output connector</a></p>
-      <p><a href="../api/tika/index.html">Tika transformation connector</a></p>
-      <p><a href="../api/webcrawler/index.html">Web connector</a></p>
-      <p><a href="../api/wiki/index.html">Wiki connector</a></p>
-    </section>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/performance-tuning.xml b/site/src/documentation/content/xdocs/en_US/performance-tuning.xml
deleted file mode 100644
index 2f9f0bc..0000000
--- a/site/src/documentation/content/xdocs/en_US/performance-tuning.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Performance tuning</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Performance tuning</title>
-      <p></p>
-      <p>
-        In order to get the most out of ManifoldCF, performance-wise, there are a few things you need to know.  First, you need to know how to configure the project so that it performs optimally.  You'll also want to know what hardware would work best.  And, no doubt, you want to have some idea whether you've actually done everything properly, so you need data to compare with.
-        This page will hopefully answer all of those questions.
-      </p>
-      <section>
-        <title>Configuration for performance</title>
-        <p></p>
-        <p>
-          The goal of performance tuning for ManifoldCF is to take maximum advantage of parallelism in the system doing the work, and to make sure there are no bottlenecks anywhere that would slow things down.
-          The most important underpinning of ManifoldCF is the database, since that is the only persistent storage mechanism ManifoldCF uses.  Getting the database right is therefore the first goal.
-        </p>
-        <section>
-          <title>Selecting the database</title>
-          <p>
-            Start by using PostgreSQL rather than Derby, because Derby has known performance problems when it comes to handling deadlocks.
-            Database deadlocks arise naturally in systems like ManifoldCF that are highly threaded, and while the risk of their arising can be reduced, it cannot entirely be eliminated.
-            Derby, on the other hand, has the ability to deadlock with a simple SELECT against a table happening at the same time as a DELETE against the same table, and Derby requires a hang of a minute before it detects the deadlock.
-            Obviously that behavior is incompatible with high performance.  So, use PostgreSQL if you care at all about crawler performance.  See the <a href="how-to-build-and-deploy.html">how-to-deploy</a> page for a description of how to run ManifoldCF under PostgreSQL.
-          </p>
-          <p>
-            Certain PostgreSQL versions are also known to generate bad plans for ManifoldCF queries.  When this happens, crawls of any size may become extremely slow.
-            The ManifoldCF log will start to include many warnings of the sort, "Query took more than a minute", with a corresponding dumped plan that shows a sequential scan of a large table.
-            At this point you should suspect you have a bad version of PostgreSQL.  Known bad versions include 8.3.12.  Known good versions are 8.3.7, 8.3.8, and 8.4.5.
-          </p>
-        </section>
-        <section>
-          <title>Configuring PostgreSQL correctly</title>
-          <p>
-            The key configuration changes you need to make to PostgreSQL from its out-of-the-box settings are intended to:
-          </p>
-          <ul>
-            <li>Set PostgreSQL up with enough database handles so that that will not be a bottleneck;</li>
-            <li>Make sure PostgreSQL has enough shared memory allocated to support the number of handles you selected;</li>
-            <li>Turn off autovacuuming.</li>
-          </ul>
-          <p>
-            The <em>postgresql.conf</em> file is where you set most of these options.  Some recommended settings are described in <a href="how-to-build-and-deploy.html">the deployment page</a>.
-            The postgresql.conf file describes the relationship between parameters, especially between the number of database handles and the amount of shared memory allocated.  This can differ significantly
-            from version to version, so it never hurts to read the text in that file, and understand what you are trying to achieve.
-          </p>
-          <p>
-            The number of database handles you need will depend on your ManifoldCF setup.  If you use the Quick Start, for instance, fewer handles are needed, because only one process is used.  The formula relating handle count to other
-            parameters of ManifoldCF is presented below.
-          </p>
-          <p></p>
-          <p>manifoldcf_db_pool_size * number_of_manifoldcf_processes &lt;= maximum_postgresql_database_handles - 2</p>
-          <p></p>
-          <p>
-            The number of processes you might have depends on how you deployed ManifoldCF.  If you used the Quick Start, you will only have one process.  But if you deployed in a more distributed way,
-            you will have at least a process for the agents daemon, as well as at one process for each web application.  If you anticipate that a command-line utility could be used at the same time,
-            that's one more process.  These multiply quickly, so the number of database handles you need to make available can get quite large, unless you limit the ManifoldCF pool size artificially
-            instead.
-          </p>
-          <p>Setting the parameters that control the size of the database connection pool is covered in the next section.</p>
-        </section>
-        <section>
-          <title>Setting the ManifoldCF database handle pool size</title>
-          <p>
-            The database handle pool size must be set correctly, or ManifoldCF will not perform well, and may even deadlock waiting to get a database handle.
-            The properties.xml parameter that controls this is <em>org.apache.manifoldcf.database.maxhandles</em>.  The formula you should use to properly set the value is below.
-          </p>
-          <p></p>
-          <p>worker_thread_count + delete_thread_count + expiration_thread_count + cleanup_thread_count + 10 &lt; manifoldcf_db_pool_size</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Setting the number of worker, delete, and expiration threads</title>
-          <p>
-            The number of each variety of thread you choose depends on a number of factors that are specific to the kinds of tasks you expect to do.
-            First, note that constraints based on your hardware may have the effect of setting an upper bound on the total number of threads.  If, for example, memory constraints
-            on your system have the effect of limiting the number of available PostgreSQL handles, the total threads will also be limited as a result of applying the formulas already given.
-          </p>
-          <p>
-            If you do not have any such constraints, then you can choose the number of threads based on other hardware factors.  Typically, the number of processors would be what you'd consider
-            in coming up with the total thread count.  A value of between 12 and 35 threads per processor is typical.  The optimal number for you will require some experimentation.
-          </p>
-          <p>The threads then have to be allocated to the worker, deletion, or expiration category.  If your work load does not require much in the way of deleting documents or expiring them,
-            it is usually adequate to retain the default of 10 deletion and 10 expiration threads, and simply adjust the worker thread count.  The worker thread count parameter is <em>org.apache.manifoldcf.crawler.threads</em>.
-            See <a href="how-to-build-and-deploy.html">the deployment page</a> for a list of all of these parameters.
-          </p>
-        </section>
-        <section>
-          <title>Database maintenance</title>
-          <p>
-            Once you have the database and ManifoldCF configurated correctly, you will discover that the performance of the system gradually degrades over time.  This is because PostgreSQL
-            requires periodic maintenance in order to function optimally.  This maintenance is called <em>vacuuming</em>.
-          </p>
-          <p>
-            Our recommendation is to vacuum on a schedule, and to use the "full" variant of the vacuum command (e.g. "VACUUM FULL").  PostgreSQL gives you the option of lesser
-            vacuums, some of which can be done in background, but in our experience these are very expensive performance-wise, and are not very helpful either.  "VACUUM FULL" makes a
-            complete new copy of the database, a table at a time, stored in an optimal way.  It is also reasonably quick, considering what it is doing.
-          </p>
-        </section>
-      </section>
-      <section>
-        <title>Some results</title>
-        <p>
-          We've run performance test on several systems.  Depending on hardware configuration, we've seen as fast as 57 documents per second to 16 documents per second.  We tested with three different systems and ran the test
-          across 306,944 documents.  The table below shows the relevant configurations and results:
-        </p>
-        <table>
-          <tr><th>System</th><th>Processors (2+ Ghz)</th><th>Memory</th><th>Disk drives</th><th>Elapsed time (seconds)</th><th>Documents per second</th></tr>
-          <tr><td>Desktop</td><td>2</td><td>8 GB</td><td>7,200 RPM</td><td>19,492</td><td>16</td></tr>
-          <tr><td>Laptop</td><td>2</td><td>4 GB</td><td>Samsung SSD RBX</td><td>9,230</td><td>33</td></tr>
-          <tr><td>Server</td><td>8</td><td>8 GB</td><td>10,000 RPM</td><td>5,366</td><td>57</td></tr>
-        </table>
-        <p>
-          For these tests, we ran the Quick-Start example configuration from ManifoldCF as is, with the exception of using an external PostgreSQL database instead of the embedded Derby.
-          We altered the ManifoldCF and PostgreSQL configuration from their default settings to maximize system resource usage.  The table below shows the key configuration changes.
-        </p>
-        <table>
-          <tr><th>Workers</th><th>ManifoldCF DB Connections</th><th>PostgreSQL Connections</th><th>Max repository connections</th><th>JVM Memory</th></tr>
-          <tr><td>100</td><td>105</td><td>200</td><td>105</td><td>1024 MB</td></tr>
-        </table>
-        <p>Additionally, we made postgresql.conf changes as shown in the table below:</p>
-        <table>
-          <tr><th>Parameter</th><th>Value</th></tr>
-          <tr><td>shared_buffers</td><td>1024MB</td></tr>
-          <tr><td>checkpoint_segments</td><td>300</td></tr>
-          <tr><td>maintenanceworkmem</td><td>2MB</td></tr>
-          <tr><td>tcpip_socket</td><td>true</td></tr>
-          <tr><td>max_connections</td><td>200</td></tr>
-          <tr><td>checkpoint_timeout</td><td>900</td></tr>
-          <tr><td>datestyle</td><td>ISO,European</td></tr>
-          <tr><td>autovacuum</td><td>off</td></tr>
-        </table>
-        <p>There are some interesting conclusions, for example the use of Solid State Drives for the laptop.  Even though addressable memory was reduced to 4 GB, the system processed twice as much documents than the desktop did with slower disks.  The other interesting fact is that the server had lower performing disks, but 4 times as many processors, and it was twice as fast as the laptop.</p>
-      </section>
-    </section>
-  </body>
-</document>
-
-
-
-
-
-
-        
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml b/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml
deleted file mode 100644
index 58b9005..0000000
--- a/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml
+++ /dev/null
@@ -1,659 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Programmatic Operation</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Programmatic Operation</title>
-      <p></p>
-      <p>A certain subset of ManifoldCF users want to think of ManifoldCF as an engine that they can poke from whatever other system they are developing.  While
-        ManifoldCF is not precisely a document indexing engine per se, it can certainly be controlled programmatically.  Right now, there are three principle ways of
-        achieving this control.</p>
-      <p></p>
-      <section>
-        <title>Control by Servlet API</title>
-        <p></p>
-        <p>ManifoldCF provides a servlet-based JSON API that gives you the complete ability to define connections and jobs, and control job execution.  You can read
-          about JSON <a href="http://www.json.org">here</a>.  The API is designed to be RESTful in character.  Thus, it makes full use of the HTTP verbs
-          GET, PUT, POST, and DELETE, and represents objects as URLs.</p>
-        <section>
-          <title>URL format</title>
-          <p></p>
-          <p>The basic format of the JSON servlet resource URLs is as follows:</p>
-          <p></p>
-          <p>http[s]://<em>&lt;server_and_port&gt;</em>/mcf-api-service/json/<em>&lt;resource&gt;</em></p>
-          <p></p>
-          <p>The servlet ignores request data, except when the PUT or POST verb is used.  In that case, the request data is presumed to be a JSON object.  The servlet
-            responds either with an error response code (either 400 or 500) with an appropriate explanatory message, or with a 200 (OK), 201 (CREATED), 
-            401 (UNAUTHORIZED), or 404 (NOT FOUND) response code along with a response JSON object.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>JSON equivalents for ManifoldCF</title>
-          <p></p>
-          <p>ManifoldCF treats certain JSON forms as equivalent, for the purposes of readability.  For example, the array form <strong>"foo" : [ { ... } ]</strong> is
-            treated equivalently to <strong>"foo" : { }</strong>, whenever there is only one array element.  This gives a coder some flexibility as to how s/he encodes
-            JSON in requests.  Please also be aware that similar compressions will occur in the JSON responses from the API servlet, and your code must be able to deal
-            with this possibility.  The following table describes some of the equivalences:</p>
-          <p></p>
-          <p></p>
-          <p></p>
-          <table>
-            <tr><th>Form</th><th>Equivalent</th></tr>
-            <tr><td>[ { ... } ]</td><td>{ ... }</td></tr>
-            <tr><td>"foo" : { "_value_" : "bar" }</td><td>"foo" : "bar"</td></tr>
-            <tr><td>"_children_" : [ "foo":{ ... }, "foo":{ ... } ]</td><td>"foo" : [ { ... }, { ... } ]</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Resources and commands</title>
-          <p></p>
-          <p>The actual available resources and commands are as follows:</p>
-          <p></p>
-          <p></p>
-          <p></p>
-          <table>
-            <tr><th>Resource</th><th>Verb</th><th>What it does</th><th>Input format/query args</th><th>Output format</th></tr>
-            <tr><td>LOGIN</td><td>POST</td><td>Log in the specified user</td><td>{"userID":<em>&lt;user_name&gt;</em>, "password":<em>&lt;password&gt;</em>}</td><td>{}</td></tr>
-            <tr><td>authorizationdomains</td><td>GET</td><td>List all registered authorization domains</td><td>N/A</td><td>{"authorizationdomain":[<em>&lt;list_of_authorization_domain_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnectors</td><td>GET</td><td>List all registered output connectors</td><td>N/A</td><td>{"outputconnector":[<em>&lt;list_of_output_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnectors</td><td>GET</td><td>List all registered transformation connectors</td><td>N/A</td><td>{"transformationconnector":[<em>&lt;list_of_transformation_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnectors</td><td>GET</td><td>List all registered mapping connectors</td><td>N/A</td><td>{"mappingconnector":[<em>&lt;list_of_mapping_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnectors</td><td>GET</td><td>List all registered authority connectors</td><td>N/A</td><td>{"authorityconnector":[<em>&lt;list_of_authority_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectors</td><td>GET</td><td>List all registered repository connectors</td><td>N/A</td><td>{"repositoryconnector":[<em>&lt;list_of_repository_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnectors</td><td>GET</td><td>List all registered notification connectors</td><td>N/A</td><td>{"notificationconnector":[<em>&lt;list_of_notification_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups</td><td>GET</td><td>List all authority groups</td><td>N/A</td><td>{"authoritygroup":[<em>&lt;list_of_authority_group_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>GET</td><td>Get a specific authority group</td><td>N/A</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>PUT</td><td>Save or create an authority group</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>DELETE</td><td>Delete an authority group</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections</td><td>GET</td><td>List all output connections</td><td>N/A</td><td>{"outputconnection":[<em>&lt;list_of_output_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific output connection</td><td>N/A</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an output connection</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete an output connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of an output connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/outputconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections</td><td>GET</td><td>List all transformation connections</td><td>N/A</td><td>{"transformationconnection":[<em>&lt;list_of_transformation_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific transformation connection</td><td>N/A</td><td>{"transformationconnection":<em>&lt;transformation_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a transformation connection</td><td>{"outputconnection":<em>&lt;transformation_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a transformation connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a transformation connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/transformationconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>clearversions/<em>&lt;encoded_output_connection_name&gt;</em></td><td>PUT</td><td>Forget previous indexed document versions</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>clearrecords/<em>&lt;encoded_output_connection_name&gt;</em></td><td>PUT</td><td>Remove all previous indexing records</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections</td><td>GET</td><td>List all mapping connections</td><td>N/A</td><td>{"mappingconnection":[<em>&lt;list_of_mapping_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific mapping connection</td><td>N/A</td><td>{"mappingconnection":<em>&lt;mapping_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a mapping connection</td><td>{"mappingconnection":<em>&lt;mapping_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a mapping connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a mapping connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections</td><td>GET</td><td>List all authority connections</td><td>N/A</td><td>{"authorityconnection":[<em>&lt;list_of_authority_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific authority connection</td><td>N/A</td><td>{"authorityconnection":<em>&lt;authority_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an authority connection</td><td>{"authorityconnection":<em>&lt;authority_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete an authority connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of an authority connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections</td><td>GET</td><td>List all repository connections</td><td>N/A</td><td>{"repositoryconnection":[<em>&lt;list_of_repository_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific repository connection</td><td>N/A</td><td>{"repositoryconnection":<em>&lt;repository_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a repository connection</td><td>{"repositoryconnection":<em>&lt;repository_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a repository connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a repository connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/repositoryconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections</td><td>GET</td><td>List all notification connections</td><td>N/A</td><td>{"notificationconnection":[<em>&lt;list_of_notification_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific notification connection</td><td>N/A</td><td>{"notificationconnection":<em>&lt;notification_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a notification connection</td><td>{"notificationconnection":<em>&lt;notification_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a notification connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a notification connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/notificationconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>clearhistory/<em>&lt;encoded_repository_connection_name&gt;</em></td><td>PUT</td><td>Clear history linked with repository connection</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs</td><td>GET</td><td>List all job definitions</td><td>N/A</td><td>{"job":[<em>&lt;list_of_job_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs</td><td>POST</td><td>Create a job</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{"job_id":<em>&lt;job_identifier&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job definition</td><td>N/A</td><td>{"job":<em>&lt;job_object_&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Save a job definition</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>DELETE</td><td>Delete a job definition</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobstatuses</td><td>GET</td><td>List all jobs and their status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobstatuses/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
-            <tr><td>jobstatusesnocounts<em>&lt;job_id&gt;</em></td><td>GET</td><td>List all jobs and their status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
-            <tr><td>jobstatusesnocounts/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
-            <tr><td>start/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>startminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>abort/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Abort a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>restart/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Stop and start a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>restartminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Stop and start a specified job, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>pause/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Pause a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>resume/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Resume a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>reseed/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Reset incremental seeding for a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-
-            <tr><td>repositoryconnectionhistory/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a history report</td><td><em>&lt;history_query_parameters&gt;</em></td><td>{"row":[{"column":[{"name":<em>&lt;col_name&gt;</em>,"value":<em>&lt;col_value&gt;</em>}, ...]}, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectionquery/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a queue report</td><td><em>&lt;queue_query_parameters&gt;</em></td><td>{"row":[{"column":[{"name":<em>&lt;col_name&gt;</em>,"value":<em>&lt;col_value&gt;</em>}, ...]}, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectionactivities/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a list of legal activities for a connection</td><td>N/A</td><td>{"activity":[<em>&lt;activity_name&gt;</em>, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectionjobs/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a list of jobs for a connection</td><td>N/A</td><td>{"job":[<em>&lt;list_of_job_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>History query parameters</title>
-          <p></p>
-          <p>The history query parameters and their meanings are as follows:</p>
-          <table>
-            <tr><th>Parameter</th><th>Report type</th><th>Multivalued?</th><th>Meaning</th></tr>
-            <tr><td>report</td><td>All</td><td>No</td><td>The kind of history report desired; legal values are "simple", "maxactivity", "maxbandwidth", and "result"; defaults to "simple"</td></tr>
-            <tr><td>starttime</td><td>All</td><td>No</td><td>Starting time in ms since epoch; defaults to "0"</td></tr>
-            <tr><td>endtime</td><td>All</td><td>No</td><td>Ending time in ms since epoch; defaults to now</td></tr>
-            <tr><td>activity</td><td>All</td><td>Yes</td><td>Which activities you want to see</td></tr>
-            <tr><td>entitymatch</td><td>All</td><td>No</td><td>Regular expression matching entity identifier; defaults to ""</td></tr>
-            <tr><td>entitymatch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of entitymatch</td></tr>
-            <tr><td>resultcodematch</td><td>All</td><td>No</td><td>Regular expression match result code; defaults to ""</td></tr>
-            <tr><td>resultcodematch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of resultcodematch</td></tr>
-            <tr><td>sortcolumn</td><td>All</td><td>Yes</td><td>Result column to sort the result by</td></tr>
-            <tr><td>sortcolumn_direction</td><td>All</td><td>Yes</td><td>Direction to sort the corresponding column ("ascending" or "descending")</td></tr>
-            <tr><td>startrow</td><td>All</td><td>No</td><td>Starting row in resultset to return; defaults to 0</td></tr>
-            <tr><td>rowcount</td><td>All</td><td>No</td><td>Maximum number of rows to return; defaults to 20</td></tr>
-            <tr><td>idbucket</td><td>maxactivity, maxbandwidth, result</td><td>No</td><td>Regular expression selecting which part of the entity identifier to use as an aggregation key; defaults to "()"</td></tr>
-            <tr><td>idbucket_insensitive</td><td>maxactivity, maxbandwidth, result</td><td>No</td><td>Case insensitive version of idbucket</td></tr>
-            <tr><td>resultcodebucket</td><td>result</td><td>No</td><td>Regular expression selecting which part of the result code to use as an aggregation key; defaults to "(.*)"</td></tr>
-            <tr><td>resultcodebucket_insensitive</td><td>result</td><td>No</td><td>Case insensitive version of resultcodebucket</td></tr>
-            <tr><td>interval</td><td>maxactivity, maxbandwidth</td><td>No</td><td>Size of window in milliseconds for assessing rate; defaults to 300000</td></tr>
-          </table>
-          <p></p>
-          <p>Each report type has different return columns, as listed below:</p>
-          <p></p>
-          <table>
-            <tr><th>Report type</th><th>Return columns</th></tr>
-            <tr><td>simple</td><td>starttime, resultcode, resultdesc, identifier, activity, bytes, elapsedtime</td></tr>
-            <tr><td>maxactivity</td><td>starttime, endtime, activitycount, idbucket</td></tr>
-            <tr><td>maxbandwidth</td><td>starttime, endtime, bytecount, idbucket</td></tr>
-            <tr><td>result</td><td>idbucket, resultcodebucket, eventcount</td></tr>
-          </table>
-        </section>
-        <section>
-          <title>Queue query parameters</title>
-          <p></p>
-          <p>The queue query parameters and their meanings are as follows:</p>
-          <table>
-            <tr><th>Parameter</th><th>Report type</th><th>Multivalued?</th><th>Meaning</th></tr>
-            <tr><td>report</td><td>All</td><td>No</td><td>The kind of queue report desired; legal values are "document" or "status"; defaults to "document"</td></tr>
-            <tr><td>now</td><td>All</td><td>No</td><td>The time in milliseconds since epoch to perform the queue assessment relative to; defaults to current time</td></tr>
-            <tr><td>idmatch</td><td>All</td><td>No</td><td>Regular expression matching document identifier; defaults to ""</td></tr>
-            <tr><td>idmatch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of idmatch</td></tr>
-            <tr><td>statematch</td><td>All</td><td>Yes</td><td>State to match; valid values are "neverprocessed", "previouslyprocessed", "outofscope"</td></tr>
-            <tr><td>statusmatch</td><td>All</td><td>Yes</td><td>Status to match; valid values are "inactive", "processing", "expiring", "deleting", "readyforprocessing", "readyforexpiration", "waitingforprocessing", "waitingforexpiration", "waitingforever", and "hopcountexceeded"</td></tr>
-            <tr><td>sortcolumn</td><td>All</td><td>Yes</td><td>Result column to sort the result by</td></tr>
-            <tr><td>sortcolumn_direction</td><td>All</td><td>Yes</td><td>Direction to sort the corresponding column ("ascending" or "descending")</td></tr>
-            <tr><td>startrow</td><td>All</td><td>No</td><td>Starting row in resultset to return; defaults to 0</td></tr>
-            <tr><td>rowcount</td><td>All</td><td>No</td><td>Maximum number of rows to return; defaults to 20</td></tr>
-            <tr><td>idbucket</td><td>status</td><td>No</td><td>Regular expression selecting which part of the document identifier to use as an aggregation key; defaults to "()"</td></tr>
-            <tr><td>idbucket_insensitive</td><td>status</td><td>No</td><td>Case insensitive version of idbucket</td></tr>
-          </table>
-          <p></p>
-          <p>Each report type has different return columns, as listed below:</p>
-          <p></p>
-          <table>
-            <tr><th>Report type</th><th>Return columns</th></tr>
-            <tr><td>document</td><td>identifier, job, state, status, scheduled, action, retrycount, retrylimit</td></tr>
-            <tr><td>status</td><td>idbucket, inactive, processing, expiring, deleting, processready, expireready, processwaiting, expirewaiting, waitingforever, hopcountexceeded</td></tr>
-          </table>
-        </section>
-        <section>
-          <title>Authorization domain objects</title>
-          <p></p>
-          <p>The JSON fields an authorization domain object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the authorization domain</td></tr>
-            <tr><td>"domain_name"</td><td>The internal name of the authorization domain, i.e. what is sent to the Authority Service</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Output connector objects</title>
-          <p></p>
-          <p>The JSON fields an output connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Transformation connector objects</title>
-          <p></p>
-          <p>The JSON fields a transformation connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Mapping connector objects</title>
-          <p></p>
-          <p>The JSON fields a mapping connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Authority connector objects</title>
-          <p></p>
-          <p>The JSON fields an authority connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Repository connector objects</title>
-          <p></p>
-          <p>The JSON fields a repository connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Notification connector objects</title>
-          <p></p>
-          <p>The JSON fields a repository connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Authority group objects</title>
-          <p></p>
-          <p>Authority group names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields an authority group object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the group</td></tr>
-            <tr><td>"description"</td><td>The description of the group</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Output connection objects</title>
-          <p></p>
-          <p>Output connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields an output connection object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Transformation connection objects</title>
-          <p></p>
-          <p>Transformation connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields an output connection object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Mapping connection objects</title>
-          <p></p>
-          <p>Mapping connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for a mapping connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Authority connection objects</title>
-          <p></p>
-          <p>Authority connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for an authority connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>
-            <tr><td>"authdomain"</td><td>The authorization domain for the authority connection, if any</td></tr>
-            <tr><td>"authgroup"</td><td>The required authority group for the authority connection</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Repository connection objects</title>
-          <p></p>
-          <p>Repository connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for a repository connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"acl_authority"</td><td>The (optional) name of the authority group that will enforce security for this connection</td></tr>
-            <tr><td>"throttle"</td><td>An array of throttle objects, which control how quickly documents can be requested from this connection</td></tr>
-          </table>
-          <p></p>
-          <p>Each throttle object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"match"</td><td>The regular expression which is used to match a document's bins to determine if the throttle should be applied</td></tr>
-            <tr><td>"match_description"</td><td>Optional text describing the meaning of the throttle</td></tr>
-            <tr><td>"rate"</td><td>The maximum fetch rate to use if the throttle applies, in fetches per minute</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Notification connection objects</title>
-          <p></p>
-          <p>Notification connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for a notification connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Job objects</title>
-          <p></p>
-          <p>The JSON fields for a job are is as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"id"</td><td>The job's identifier, if present.  If not present, ManifoldCF will create one (and will also create the job when saved).</td></tr>
-            <tr><td>"description"</td><td>Text describing the job</td></tr>
-            <tr><td>"repository_connection"</td><td>The name of the repository connection to use with the job</td></tr>
-            <tr><td>"document_specification"</td><td>The document specification object for the job, whose format is repository-connection specific</td></tr>
-            <tr><td>"start_mode"</td><td>The start mode for the job, which can be one of "schedule window start", "schedule window anytime", or "manual"</td></tr>
-            <tr><td>"run_mode"</td><td>The run mode for the job, which can be either "continuous" or "scan once"</td></tr>
-            <tr><td>"hopcount_mode"</td><td>The hopcount mode for the job, which can be either "accurate", "no delete", "never delete"</td></tr>
-            <tr><td>"priority"</td><td>The job's priority, typically "5"</td></tr>
-            <tr><td>"recrawl_interval"</td><td>The default time between recrawl of documents (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"max_recrawl_interval"</td><td>The maximum time between recrawl of documents (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"expiration_interval"</td><td>The time until a document expires (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"reseed_interval"</td><td>The time between reseeding operations (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"hopcount"</td><td>An array of hopcount objects, describing the link types and associated maximum hops permitted for the job</td></tr>
-            <tr><td>"schedule"</td><td>An array of schedule objects, describing when the job should be started and run</td></tr>
-            <tr><td>"pipelinestage"</td><td>An array of pipelinestage objects, describing what the transformation pipeline is</td></tr>
-            <tr><td>"notificationstage"</td><td>An array of notificationstage objects, describing what the notifications are</td></tr>
-          </table>
-          <p></p>
-          <p>Each pipelinestage object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"stage_id"</td><td>The unique identifier for the pipeline stage</td></tr>
-            <tr><td>"stage_prerequisite"</td><td>The unique identifier for the preceding pipeline stage; may be missing if none</td></tr>
-            <tr><td>"stage_isoutput"</td><td>"true" if the stage is an output connection</td></tr>
-            <tr><td>"stage_connectionname"</td><td>The connection name for the pipeline stage</td></tr>
-            <tr><td>"stage_description"</td><td>A description of the pipeline stage</td></tr>
-            <tr><td>"stage_specification"</td><td>The specification string for the pipeline stage</td></tr>
-          </table>
-          <p></p>
-          <p>Each notificationstage object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"stage_id"</td><td>The unique identifier for the notification stage</td></tr>
-            <tr><td>"stage_connectionname"</td><td>The connection name for the notification stage</td></tr>
-            <tr><td>"stage_description"</td><td>A description of the notification stage</td></tr>
-            <tr><td>"stage_specification"</td><td>The specification string for the notification stage</td></tr>
-          </table>
-          <p></p>
-          <p>Each hopcount object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"link_type"</td><td>The connection-type-dependent type of a link for which a hop count restriction is specified</td></tr>
-            <tr><td>"count"</td><td>The maximum number of hops allowed for the associated link type, starting at a seed</td></tr>
-          </table>
-          <p></p>
-          <p>Each schedule object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"timezone"</td><td>The optional time zone for the schedule object; if not present the default server time zone is used</td></tr>
-            <tr><td>"duration"</td><td>The optional length of the described time window, in milliseconds; if not present, duration is considered infinite</td></tr>
-            <tr><td>"dayofweek"</td><td>The optional day-of-the-week enumeration object</td></tr>
-            <tr><td>"monthofyear"</td><td>The optional month-of-the-year enumeration object</td></tr>
-            <tr><td>"dayofmonth"</td><td>The optional day-of-the-month enumeration object</td></tr>
-            <tr><td>"year"</td><td>The optional year enumeration object</td></tr>
-            <tr><td>"hourofday"</td><td>The optional hour-of-the-day enumeration object</td></tr>
-            <tr><td>"minutesofhour"</td><td>The optional minutes-of-the-hour enumeration object</td></tr>
-            <tr><td>"requestminimum"</td><td>Optional flag indicating whether the job run will be minimal or not ("true" means minimal)</td></tr>
-          </table>
-          <p></p>
-          <p>Each enumeration object describes an array of integers using the form:</p>
-          <p></p>
-          <p>{"value":[<em>&lt;integer_list&gt;</em>]}</p>
-          <p></p>
-          <p>Each integer is a zero-based index describing which entity is being specified.  For example, for "dayofweek", 0 corresponds to Sunday, etc., and thus "dayofweek":{"value":[0,6]} would describe Saturdays and Sundays.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Job status objects</title>
-          <p></p>
-          <p>The JSON fields of a job status object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"job_id"</td><td>The job identifier</td></tr>
-            <tr><td>"status"</td><td>The job status, having the possible values: "not yet run", "running", "paused", "done", "waiting", "stopping", "resuming", "starting up", "cleaning up", "error", "aborting", "restarting", "running no connector", and "terminating"</td></tr>
-            <tr><td>"error_text"</td><td>The error text, if the status is "error"</td></tr>
-            <tr><td>"start_time"</td><td>The job start time, in milliseconds since Jan 1, 1970</td></tr>
-            <tr><td>"end_time"</td><td>The job end time, in milliseconds since Jan 1, 1970</td></tr>
-            <tr><td>"documents_in_queue"</td><td>The total number of documents in the queue for the job</td></tr>
-            <tr><td>"documents_outstanding"</td><td>The number of documents for the job that are currently considered 'active'</td></tr>
-            <tr><td>"documents_processed"</td><td>The number of documents that in the queue for the job that have been processed at least once</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Connection-type-specific objects</title>
-          <p></p>
-          <p>As you may note when trying to use the above JSON API methods, you cannot get very far in defining connections or jobs without knowing the JSON format of a connection's configuration information, or a job's connection-specific document specification and output specification information.  The form of these objects is controlled by the Java implementation of the underlying connector, and is translated directly into JSON, so if you write your own connector you should be able to figure out what it will be in the API.  For connectors already part of ManifoldCF, it remains an ongoing task to document these connector-specific objects.  This task is not yet underway.</p>
-          <p></p>
-          <p>Luckily, it is pretty easy to learn a lot about the objects in question by simply creating connections and jobs in the ManifoldCF crawler UI, and then inspecting the resulting JSON objects through the API.  In this way, it should be possible to do a decent job of coding most API-based integrations.  The one place where difficulties will certainly occur will be if you try to completely replace the ManifoldCF crawler UI with one of your own.  This is because most connectors have methods that communicate with their respective back-ends in order to allow the user to select appropriate values.  For example, the path drill-down that is presented by the LiveLink connector requires that the connector interrogate the appropriate LiveLink repository in order to populate its path selection pull-downs.  There is, at this time, only one sanctioned way to accomplish the same job using the API, which is to use the appropriate "<em>connection_type</em>/execute/<em>type-specific_command</em>" command to perform the necessary functions.  Some set of useful functions has been coded for every appropriate connector, but the exact commands for every connector, and their JSON syntax, remains undocumented for now.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>File system connector</title>
-          <p></p>
-          <p>The file system connector has no configuration information, and no connector-specific commands.  However, it does have document specification information.  The information looks something like this:</p>
-          <p></p>
-          <p>{"startpoint":[{"_attribute_path":"c:\path_to_files","include":[{"_attribute_type":"file","_attribute_match":"*.txt"},{"_attribute_type":"file","_attribute_match":"*.doc"\,"_attribute_type":"directory","_attribute_match":"*"],"exclude":["*.mov"]]}</p>
-          <p></p>
-          <p>As you can see, multiple starting paths are possible, and the inclusion and exclusion rules also can be one or multiple.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Control via Commands</title>
-        <p></p>
-        <p>For script writers, there currently exist a number of ManifoldCF execution commands.  These commands are primarily rich in the area of definition of connections and jobs, controlling jobs, and running reports.  The following table lists the current suite.</p>
-        <p></p>
-        <table>
-          <tr><th>Command</th><th>What it does</th></tr>
-          <tr><td>org.apache.manifoldcf.agents.DefineOutputConnection</td><td>Create a new output connection</td></tr>
-          <tr><td>org.apache.manifoldcf.agents.DeleteOutputConnection</td><td>Delete an existing output connection</td></tr>
-          <tr><td>org.apache.manifoldcf.agents.DefineTransformationConnection</td><td>Create a new transformation connection</td></tr>
-          <tr><td>org.apache.manifoldcf.agents.DeleteTransformationConnection</td><td>Delete an existing transformation connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.ChangeAuthSpec</td><td>Modify an authority's configuration information</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.CheckAll</td><td>Check all authorities to be sure they are functioning</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DefineAuthorityConnection</td><td>Create a new authority connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DeleteAuthorityConnection</td><td>Delete an existing authority connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DefineMappingConnection</td><td>Create a new mapping connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DeleteMappingConnection</td><td>Delete an existing mapping connection</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.AbortJob</td><td>Abort a running job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.AddScheduledTime</td><td>Add a schedule record to a job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ChangeJobDocSpec</td><td>Modify a job's specification information</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DefineJob</td><td>Create a new job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DefineRepositoryConnection</td><td>Create a new repository connection</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DeleteJob</td><td>Delete an existing job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DeleteRepositoryConnection</td><td>Delete an existing repository connection</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ExportConfiguration</td><td>Write the complete list of all connection definitions and job specifications to a file</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.FindJob</td><td>Locate a job identifier given a job's name</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.GetJobSchedule</td><td>Find a job's schedule given a job's identifier</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ImportConfiguration</td><td>Import configuration as written by a previous ExportConfiguration command</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ListJobStatuses</td><td>List the status of all jobs</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ListJobs</td><td>List the identifiers for all jobs</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.PauseJob</td><td>Given a job identifier, pause the specified job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RestartJob</td><td>Given a job identifier, restart the specified job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunDocumentStatus</td><td>Run a document status report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunMaxActivityHistory</td><td>Run a maximum activity report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunMaxBandwidthHistory</td><td>Run a maximum bandwidth report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunQueueStatus</td><td>Run a queue status report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunResultHistory</td><td>Run a result history report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunSimpleHistory</td><td>Run a simply history report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.StartJob</td><td>Start a job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.WaitForJobDeleted</td><td>After a job has been deleted, wait until the delete has completed</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.WaitForJobInactive</td><td>After a job has been started or aborted, wait until the job ceases all activity</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.WaitJobPaused</td><td>After a job has been paused, wait for the pause to take effect</td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Control by direct code</title>
-        <p></p>
-        <p>Control by direct java code is quite a reasonable thing to do.  The sources of the above commands should give a pretty clear idea how to proceed, if that's what you
-          want to do.</p>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Caveats</title>
-        <p></p>
-        <p>The above commands know nothing about the differences between connection types.  Instead, they deal with configuration and specification information in the
-          form of XML documents.  Normally, these XML documents are hidden from a system integrator, unless they happen to look into the database with a tool such as
-          psql.  But the API commands above often will require such XML documents to be included as part of the command execution.</p>
-        <p></p>
-        <p>This has one major consequence.  Any application that would manipulate connections and jobs directly cannot be connection-type independent - these
-          applications must know the proper form of XML to submit to the command.  So, it is not possible to use these command APIs to write one's own UI wrapper,
-          without sacrificing some of the repository independence that ManifoldCF by itself maintains.</p>
-      </section>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/script.xml b/site/src/documentation/content/xdocs/en_US/script.xml
deleted file mode 100644
index d8996f9..0000000
--- a/site/src/documentation/content/xdocs/en_US/script.xml
+++ /dev/null
@@ -1,437 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>ManifoldCF Scripting Language</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Overview</title>
-      <p></p>
-      <p>The ManifoldCF scripting language allows symbolic communication with the ManifoldCF API Service
-        in order to define connections and jobs, and perform crawls.  The language provides support for JSON-like hierarchical
-        documents, as well as the ability to construct properly encoded REST URLs.  It also has support for simple control flow
-        and error handling.</p>
-    </section>
-    
-    <section>
-      <title>How to use the script interpreter</title>
-      <p></p>
-      <p>The ManifoldCF script interpreter can be used in two ways - either as a real-time shell (executing a script as it is typed),
-        or interpreting a script file.  The main class of the interpreter is <em>org.apache.manifoldcf.scriptengine.ScriptParser</em>,
-        and the two ways of invoking it are:</p>
-      <source>
-java -cp ... org.apache.manifoldcf.scriptengine.ScriptParser
-      </source>
-      <p>or:</p>
-      <source>
-java -cp ... org.apache.manifoldcf.scriptengine.ScriptParser &lt;script_file&gt; &lt;arg1&gt; ... &lt;argN&gt;
-      </source>
-      <p>If you choose to invoke ScriptParser in interactive mode, simply type your script one line at a time.  Any errors will be reported immediately,
-        and the ScriptParser will accordingly exit.  You can also type ^Z to terminate the script.</p>
-      <p>If you use ScriptParser with a scripting file, that file will be read and interpreted.  The arguments you provide will be loaded into an array
-        of strings, which is accessible from your script as the variable named <em>__args__</em>.</p>
-      <section>
-        <title>Running the script interpreter by hand</title>
-        <p></p>
-        <p>When you build ManifoldCF, the required dependent jars for the scripting language are copied to <em>dist/script-engine/lib</em>.
-          You can run the interpreter in interactive mode by typing:</p>
-        <source>
-cd dist\script-engine
-run-script.bat &lt;args&gt;
-        </source>
-        <p>Or, on Linux:</p>
-        <source>
-cd dist/script-engine
-run-script.sh &lt;args&gt;
-        </source>
-        <p>You will need to set the environment variable <strong>ENGINE_HOME</strong> to point at the <em>dist/script-engine</em> directory beforehand, so that
-            the scripts can locate the appropriate jars.</p>
-      </section>
-      <section>
-        <title>Running the script interpreter using Ant</title>
-        <p></p>
-        <p>You can also start the script interpreter with all the correct required jars using Ant.  Simply type the following:</p>
-        <source>
-ant run-script-interpreter
-        </source>
-        <p>This will start the script interpreter in interactive mode only.</p>
-      </section>
-      <section>
-        <title>Running the script interpreter using Maven</title>
-        <p></p>
-        <p>You can also run the script interpreter using maven.  The commands are:</p>
-        <source>
-cd framework/script-engine
-mvn exec:exec
-        </source>
-        <p>This, once again, will start the interpreter in interactive mode.</p>
-      </section>
-    </section>
-
-    <section>
-      <title>Script language syntax</title>
-      <p></p>
-      <p>A ManifoldCF script is not sensitive to whitespace or indenting.  All comments begin with a '#' character and end with the end of that line.
-        Unquoted tokens can include alphanumeric characters, plus '_', '$', and '@'.  Numeric tokens always begin with a number ('0'-'9'), and are
-        considered floating-point if they include a decimal point ('.').  Otherwise they are integers.  String tokens can be quoted with either a double quote
-        ('"') or a single quote, and within strings characters can be escaped with a preceding backslash ('\').</p>
-      <p>A ManifoldCF script has a syntax that is readily described with a BNF grammar.  See below.</p>
-      <source>
-program:
---&gt; statements
-  
-statements:
---&gt; statement1 ... statementN
-
-statement:
---&gt; 'set' expression '=' expression ';'
---&gt; 'print' expression ';'
---&gt; 'if' expression 'then' statements ['else' statements] ';'
---&gt; 'while' expression 'do' statements ';'
---&gt; 'break' ';'
---&gt; 'error' expression ';'
---&gt; 'insert' expression 'into' expression ['at' expression] ';'
---&gt; 'remove' expression 'from' expression ';'
---&gt; 'wait' expression ';'
---&gt; 'GET' expression '=' expression ';'
---&gt; 'PUT' expression '=' expression 'to' expression ';'
---&gt; 'POST' expression '=' expression 'to' expression ';'
---&gt; 'DELETE' expression ';'
-
-expression:
---&gt; '(' expression ')'
---&gt; expression '&amp;&amp;' expression
---&gt; expression '||' expression
---&gt; '!' expression
---&gt; expression '&amp;' expression
---&gt; expression '|' expression
---&gt; expression '==' expression
---&gt; expression '!=' expression
---&gt; expression '&gt;=' expression
---&gt; expression '&lt;=' expression
---&gt; expression '&gt;' expression
---&gt; expression '&lt;' expression
---&gt; expression '+' expression
---&gt; expression '-' expression
---&gt; expression '*' expression
---&gt; expression '/' expression
---&gt; '-' expression
---&gt; '[' [expression [',' expression ...]] ']'
---&gt; '{' [expression [',' expression ...]] '}'
---&gt; '&lt;&lt;' expression ':' expression ':' [expression '=' expression [',' expression '=' expression ...]] ':' [expression [',' expression ...]] '&gt;&gt;'
---&gt; expression '[' expression ']'
---&gt; expression '.' token
---&gt; token
---&gt; string
---&gt; number
---&gt; 'true' | 'false'
---&gt; 'null'
---&gt; 'new' newexpression
---&gt; 'isnull' expression
-
-newexpression:
---&gt; 'url' expression
---&gt; 'connectionname' expression
---&gt; 'configuration'
---&gt; 'configurationnode' expression
---&gt; 'array'
---&gt; 'dictionary'
---&gt; 'queryarg' expression ['=' expression] 
-
-      </source>  
-    </section>
-    
-    <section>
-      <title>Script language variables</title>
-      <p></p>
-      <p>Variables in the ManifoldCF scripting language determine the behavior of all aspects of expression evaluation, with the exception of operator precedence.
-        In particular, every canonical variable has the ability to support arbitrary <em>attributes</em> (which are named properties of the variable), 
-        <em>subscripts</em> (children which are accessed by a numeric subscript), and all other <em>operations</em>, such as '+' or '=='.  Not all kinds of
-        variable instance will in fact support all such features.  Should you try to use a feature with a variable that does not support it, you will receive a
-        ScriptException telling you what you did wrong.</p>
-      <p>Since the actual operation details are bound to the variable, for binary operations the left-hand variable typically determines what actually takes place.  For example:</p>
-      <source>
-print 3+7;
-     [java] 10
-print "3"+7;
-     [java] 37
-      </source>
-      <p>There is, of course, a way to caste a variable to a different type.  For example:</p>
-      <source>
-print "3".__int__+7;
-     [java] 10
-      </source>
-      <p>Here, we are using the built-in attribute <em>__int__</em> to obtain the integer equivalent of the original string variable "3".  See the following table for
-        a list of some of the standard attributes and their meanings:</p>
-      <table>
-        <caption>Standard attributes</caption>
-        <tr><th>Attribute name</th><th>Meaning</th></tr>
-        <tr><td>__script__</td><td>Returns the script code that would create this variable</td></tr>
-        <tr><td>__string__</td><td>Returns the string value of the variable, if any</td></tr>
-        <tr><td>__int__</td><td>Returns the integer value of the variable, if any</td></tr>
-        <tr><td>__float__</td><td>Returns the floating-point value of the variable, if any</td></tr>
-        <tr><td>__boolean__</td><td>Returns the boolean value of the variable, if any</td></tr>
-        <tr><td>__size__</td><td>Typically returns the number of subscript children</td></tr>
-        <tr><td>__type__</td><td>Returns the 'type' of the variable</td></tr>
-        <tr><td>__value__</td><td>Returns the 'value' of the variable</td></tr>
-        <tr><td>__dict__</td><td>Returns a dictionary equivalent of the variable</td></tr>
-        <tr><td>__OK__</td><td>Returns a boolean 'true' if the variable was "OK", false otherwise</td></tr>
-        <tr><td>__NOTFOUND__</td><td>Returns a boolean 'true' if the variable was "NOTFOUND", false otherwise</td></tr>
-        <tr><td>__CREATED__</td><td>Returns a boolean 'true' if the variable was "CREATED", false otherwise</td></tr>
-      </table>
-      <p>Obviously, only some variables will support each of the standard attributes.  You will receive a script exception if you try to obtain a non-existent
-        attribute for a variable.</p>
-      <section>
-        <title>Integers</title>
-        <p>Integer variable types are created by non-quoted numeric values that do not have a '.' in them.  For example, the character '4' will create an integer
-          variable type with a value of 4.</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Integer operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Addition, yielding an integer</td><td>4+7</td></tr>
-          <tr><td>binary -</td><td>Subtraction, yielding an integer</td><td>7-4</td></tr>
-          <tr><td>binary *</td><td>Multiplication, yielding an integer</td><td>7*4</td></tr>
-          <tr><td>binary /</td><td>Division, yielding an integer</td><td>7/4</td></tr>
-          <tr><td>unary -</td><td>Negation, yielding an integer</td><td>-4</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7 == 4</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7 != 4</td></tr>
-          <tr><td>binary &gt;=</td><td>Greater or equals comparison, yielding a boolean</td><td>7 &gt;= 4</td></tr>
-          <tr><td>binary &lt;=</td><td>Less or equals comparison, yielding a boolean</td><td>7 &lt;= 4</td></tr>
-          <tr><td>binary &gt;</td><td>Greater comparison, yielding a boolean</td><td>7 &gt; 4</td></tr>
-          <tr><td>binary &lt;</td><td>Less comparison, yielding a boolean</td><td>7 &lt; 4</td></tr>
-          <tr><td>binary &amp;</td><td>Bitwise AND, yielding an integer</td><td>7 &amp; 4</td></tr>
-          <tr><td>binary |</td><td>Bitwise OR, yielding an integer</td><td>7 | 4</td></tr>
-          <tr><td>unary !</td><td>Bitwise NOT, yielding an integer</td><td>! 7</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by integer types.</p>
-      </section>
-      <section>
-        <title>Strings</title>
-        <p>String variable types are created by quoted sequences of characters.  For example, the character '"hello world"' will create a string
-          variable type with an (unquoted) value of "hello world".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>String operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Concatenation, yielding a string</td><td>"hi" + "there"</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>"hi" == "there"</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>"hi" != "there"</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by string types.</p>
-      </section>
-      <section>
-        <title>Floating-point numbers</title>
-        <p>Float variable types are created by non-quoted numeric values that have a '.' in them.  For example, the token '4.1' will create a float
-          variable type with a value of 4.1</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Float operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Addition, yielding a float</td><td>4.0+7.0</td></tr>
-          <tr><td>binary -</td><td>Subtraction, yielding a float</td><td>7.0-4.0</td></tr>
-          <tr><td>binary *</td><td>Multiplication, yielding a float</td><td>7.0*4.0</td></tr>
-          <tr><td>binary /</td><td>Division, yielding a float</td><td>7.0/4.0</td></tr>
-          <tr><td>unary -</td><td>Negation, yielding a float</td><td>-4.0</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7.0 == 4.0</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7.0 != 4.0</td></tr>
-          <tr><td>binary &gt;=</td><td>Greater or equals comparison, yielding a boolean</td><td>7.0 &gt;= 4.0</td></tr>
-          <tr><td>binary &lt;=</td><td>Less or equals comparison, yielding a boolean</td><td>7.0 &lt;= 4.0</td></tr>
-          <tr><td>binary &gt;</td><td>Greater comparison, yielding a boolean</td><td>7.0 &gt; 4.0</td></tr>
-          <tr><td>binary &lt;</td><td>Less comparison, yielding a boolean</td><td>7.0 &lt; 4.0</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by float types.</p>
-      </section>
-      <section>
-        <title>Booleans</title>
-        <p>Boolean variable types are created by the keywords <strong>true</strong> and <strong>false</strong>.  For example, the code 'true' will create a boolean
-          variable type with a value of "true".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Boolean operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7.0 == 4.0</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7.0 != 4.0</td></tr>
-          <tr><td>binary &amp;&amp;</td><td>AND logical operation, yielding a boolean</td><td>true &amp;&amp; false</td></tr>
-          <tr><td>binary ||</td><td>OR logical operation, yielding a boolean</td><td>true || false</td></tr>
-          <tr><td>binary &amp;</td><td>AND logical operation, yielding a boolean</td><td>true &amp; false</td></tr>
-          <tr><td>binary |</td><td>OR logical operation, yielding a boolean</td><td>true | false</td></tr>
-          <tr><td>unary !</td><td>NOT logical operation, yielding a boolean</td><td>! true</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__boolean__</em> are supported 
-          by boolean types.</p>
-      </section>
-      <section>
-        <title>Arrays</title>
-        <p>Array variable types are created by an initializer of the form <strong>[</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ...]] <strong>]</strong>.  For example, the script code '[3, 4]' will create an array
-          variable type with two values,  the integer "3" and the integer "4".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Array operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified subscript variable, yielding the variable</td><td>[3,4] [0]</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__size__</em> are supported 
-          by array types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>Dictionaries</title>
-        <p>Dictionary variable types are created using the "new" operator, e.g. <strong>new</strong> <strong>dictionary</strong>.</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Array operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified key, yielding the keyed variable</td><td>mydict ["keyname"]</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__size__</em> are supported 
-          by dictionary types.</p>
-      </section>
-      <section>
-        <title>Configurations</title>
-        <p>Configuration variables contain the equivalent of the JSON used to communicate with the ManifoldCF API.  They can be created using an initializer
-          of the form <strong>{</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ...]] <strong>}</strong>.  For example, the script code '{ &lt;&lt; "outputconnector" : "" :  : , &lt;&lt; "description" : "Solr" :  :  &gt;&gt;, &lt;&lt; "class_name" : "org.apache.manifoldcf.agents.output.solr.SolrConnector" :  :  &gt;&gt; &gt;&gt; }'
-          would create a configuration variable equivalent to one that might be returned from the ManifoldCF API if it was queried for the output connectors registered by the system.</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Configuration operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified child configuration node variable, yielding the variable</td><td>myconfig [0]</td></tr>
-          <tr><td>binary +</td><td>Append a configuration child node variable to the list</td><td>myconfig + &lt;&lt; "something" : "somethingvalue" : : &gt;&gt;</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__dict__</em>, and <em>__size__</em> are supported 
-          by configuration variable types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>Configuration nodes</title>
-        <p>Configuration node variable types are children of configuration variable types or configuration node variable types.  They have several components, as listed below:</p>
-        <ul>
-          <li>A type</li>
-          <li>A value</li>
-          <li>Attributes, described as a set of name/value pairs</li>
-          <li>Children, which must be configuration node variable types</li>
-        </ul>
-        <p>Configuration node variable types can be created using an initializer of the form <strong>&lt;&lt;</strong> <em>expression</em> <strong>:</strong> <em>expression</em> <strong>:</strong> [<em>expression</em> <strong>=</strong> <em>expression</em> [<strong>,</strong> <em>expression</em> <strong>=</strong> <em>expression</em> ...]] <strong>:</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ... ]] '&gt;&gt;'.
-          The first expression represents the type of the node.  The second is the node's value.  The series of '=' expressions represents attribute names and values.  The last series represents
-          the children of the node.  For example, the script code '&lt;&lt; "description" : "Solr" :  :  &gt;&gt;' represents a node of type 'description' with a value of 'Solr', with no attributes or children.</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Configuration node operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified child configuration node variable, yielding the variable</td><td>myconfig [0]</td></tr>
-          <tr><td>binary +</td><td>Append a configuration child node variable to the list</td><td>myconfig + &lt;&lt; "something" : "somethingvalue" : : &gt;&gt;</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__size__</em>, <em>__type__</em>, <em>__dict__</em> and <em>__value__</em> are supported 
-          by configuration node variable types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>URLs</title>
-        <p>URL variable types exist to take care of the details of URL encoding while assembling the REST URL's needed to describe objects in ManifoldCF's REST API.  A URL variable
-          type can be created using a 'new' operation of the form <strong>new</strong> <strong>url</strong> <em>expression</em>, where the expression is the already-encoded root path.  For example, the script code 'new url "http://localhost:8345/mcf-api-service/json"'
-          would create a URL variable type with the root path "http://localhost:8345/mcf-api-service/json".</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>URL operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>url1 == url2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>url1 != url2</td></tr>
-          <tr><td>binary +</td><td>Append and encode another path or query argument element, yielding a URL</td><td>url1 + "repositoryconnections"</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by URL variable types.</p>
-      </section>
-      <section>
-        <title>Query Arguments</title>
-        <p>Query Argument variable types exist to take care of the details of URL encoding while assembling the query arguments of a REST URL for ManifoldCF's REST API.  A Query Argument variable
-          type can be created using a 'new' operation of the form <strong>new</strong> <strong>queryarg</strong> <em>expression</em> [<strong>=</strong> <em>expression</em>], where the first expression is the
-          query argument name, and the second optional expression is the query argument value.  For example, the script code 'new queryarg "report" = "simple"'
-          would create a Query Argument variable type representing the query argument "report=simple".  To add query arguments to a URL, simply add them using the '+' operator,
-          for example "urlvar = urlvar + new queryarg 'report' = 'simple';" .</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Query Argument operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>arg1 == arg2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>arg1 != arg2</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by Query Argument variable types.</p>
-      </section>
-      <section>
-        <title>Connection names</title>
-        <p>Connection name variable types exist to perform the extra URL encoding needed for ManifoldCF's REST API.  Connection names must be specially encoded so that they do not
-          contain slash characters ('/').  Connection name variable types take care of this encoding.</p>
-        <p>You can create a connection name variable type using the following syntax: <strong>new</strong> <strong>connectionname</strong> <em>expression</em>, where the expression is the name of the connection.
-        </p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>URL operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>cn1 == cn2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>cn1 != cn2</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by connection name variable types.</p>
-      </section>
-      <section>
-        <title>Results</title>
-        <p>Result variable types capture the result of a GET, PUT, POST, or DELETE statement.  They consist of two parts:</p>
-        <ul>
-          <li>A result code</li>
-          <li>A result configuration value</li>
-        </ul>
-        <p>There is no way to directly create a result variable type, nor does it support any operations.  However, the standard attributes <em>__script__</em>, <em>__string__</em>,
-          <em>__value__</em>, <em>__OK__</em>, <em>__NOTFOUND__</em>, and <em>__CREATED__</em> are all supported by result variable types.</p>
-      </section>
-    </section>
-    
-    <section>
-      <title>Statements</title>
-      <p>The statements available to a ManifoldCF script programmer are designed to support interaction with the ManifoldCF API.  Thus, there is support for
-        all four HTTP verbs, as well as basic variable setting and control flow.  The table below describes each statement type:</p>
-      <table>
-        <caption>Statement types</caption>
-        <tr><th>Statement</th><th>Meaning</th><th>Example</th></tr>
-        <tr><td>'set' expression '=' expression ';'</td><td>Sets the variable described by the first expression with the value computed for the second</td><td>set myvar = 4 + 5;</td></tr>
-        <tr><td>'print' expression ';'</td><td>Prints the string value of the expression to stdout</td><td>print "hello world";</td></tr>
-        <tr><td>'if' expression 'then' statements ['else' statements] ';'</td><td>If the boolean value of the expression is 'true', executes the first set of statements, otherwise executes the (optional) second set</td><td>if true then print "hello"; else print "there"; ;</td></tr>
-        <tr><td>'while' expression 'do' statements ';'</td><td>While expression is true, execute the specified statements, and repeat</td><td>while count > 0 do set count = count - 1; ;</td></tr>
-        <tr><td>'break' ';'</td><td>Exits from the nearest enclosing while loop</td><td>while true do break; ;</td></tr>
-        <tr><td>'error' expression ';'</td><td>Aborts the script with a script exception based on the string value of the expression</td><td>error "bad stuff";</td></tr>
-        <tr><td>'wait' expression ';'</td><td>Waits the number of milliseconds corresponding to the integer value of the expression</td><td>wait 1000;</td></tr>
-        <tr><td>'insert' expression 'into' expression ['at' expression] ';'</td><td>Inserts the first expression into the second variable expression, either at the end or optionally at the position specified by the third expression</td><td>insert 4 into myarray at 0 ;</td></tr>
-        <tr><td>'delete' expression 'from' expression ';'</td><td>Deletes the element described by the first expression from the second expression</td><td>delete 0 from myarray ;</td></tr>
-        <tr><td>'GET' expression '=' expression ';'</td><td>Perform an HTTP GET from the URL specified in the second expression capturing the result in the first expression</td><td>GET result = new url "http://localhost:8345/mcf-api-service/json/repositoryconnections" ;</td></tr>
-        <tr><td>'DELETE' expression '=' expression ';'</td><td>Perform an HTTP DELETE on the URL specified in the second expression capturing the result in the first expression</td><td>DELETE result = myurl ;</td></tr>
-        <tr><td>'PUT' expression '=' expression 'to' expression ';'</td><td>Perform an HTTP PUT of the second expression to the URL specified in the third expression capturing the result in the first expression</td><td>PUT result = configurationObject to myurl ;</td></tr>
-        <tr><td>'POST' expression '=' expression 'to' expression ';'</td><td>Perform an HTTP POST of the second expression to the URL specified in the third expression capturing the result in the first expression</td><td>POST result = configurationObject to myurl ;</td></tr>
-      </table>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/technical-resources.xml b/site/src/documentation/content/xdocs/en_US/technical-resources.xml
deleted file mode 100644
index 4df07ee..0000000
--- a/site/src/documentation/content/xdocs/en_US/technical-resources.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.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.
--->
-
-<document>
-<header><title>ManifoldCF - Technical Resources</title></header>
-<properties>
-</properties>
-<body>
-
-    <section id="securityarchitecturediagrams">
-          <title>Security Architecture Diagrams</title>
-          <p>For those who prefer a pictorial representation of ManifoldCF's security architecture, this might help.</p>
-          <br/><br/>
-          <figure src="images/en_US/SecurityArchitecture.png" alt="ManifoldCF Security Architecture" width="80%"/>
-          <br/><br/>
-          <p>If you are using Apache to perform authentication, the model is slightly different.</p>
-          <br/><br/>
-          <figure src="images/en_US/LCFApacheArchitecture.png" alt="ManifoldCF Security Architecture, with Apache" width="80%"/>
-          <br/><br/>
-    </section>
-
-    <section id="processarchitecturediagrams">
-          <title>Process Architecture Diagrams</title>
-          <p>A pictorial representation of ManifoldCF's process architecture is below.</p>
-          <br/><br/>
-          <figure src="images/en_US/MCFProcessArchitecture.png" alt="ManifoldCF Process Architecture" width="80%"/>
-          <br/><br/>
-    </section>
-
-    <section id="howtowriteconnectors">
-	<title>How to Write Connectors</title>
-	<p>Writing connectors for ManifoldCF is a great way to learn about the project and contribute something useful!  Read about how to do that by navigating to the links provided below.
-	</p> 
-	<ul>
-	    <li><a href="writing-output-connectors.html">How to write an output connector</a></li>
-	    <li><a href="writing-transformation-connectors.html">How to write a transformation connector</a></li>
-	    <li><a href="writing-mapping-connectors.html">How to write a user mapping connector</a></li>
-	    <li><a href="writing-authority-connectors.html">How to write an authority connector</a></li>
-	    <li><a href="writing-repository-connectors.html">How to write a repository connector</a></li>
-	</ul>
-    </section>
-
-</body>
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/writing-authority-connectors.xml b/site/src/documentation/content/xdocs/en_US/writing-authority-connectors.xml
deleted file mode 100644
index 2634423..0000000
--- a/site/src/documentation/content/xdocs/en_US/writing-authority-connectors.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing authority connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing an Authority Connector</title>
-      <p></p>
-      <p>An authority connector to a repository allows a repository's security model to be enforced by a search engine.  Its only function is to convert a user name (which is often a Kerberos principal name) into a set of _access tokens_.</p>
-      <p></p>
-      <p>The definition of an access token within ManifoldCF for a given repository is completely defined by the connectors that deal with that repository, with one exception.  That exception is for Active Directory.  Active Directory is so prevalent as a repository authorization mechanism that ManifoldCF currently treats it as the "default" authority - that is, if you don't specify another authority when you define a repository connection, ManifoldCF presumes that you mean that Active Directory should be the controlling authority for the connection.  In that case, an access token is simply an Active Directory SID.</p>
-      <p></p>
-      <p>For those repositories that do not use Active Directory as their authorization mechanism, an authority connector should be written, along with the repository connector for the repository.  Access tokens in that case represent a contract between your implementation of the authority connector for the repository, and the repository connector for the repository.  They must work together to define access tokens that will limit document access when used properly within any search engine query.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an authority connector consists of a single parts:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.authorities.interfaces.IAuthorityConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The authority connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific authority connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Authority connection</td><td>An authority connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>User name</td><td>The name of a user, which is often a Kerberos principal name, e.g. <em>john@apache.org</em></td></tr>
-          <tr><td>Access token</td><td>An arbitrary string, which is only meaningful within the context of a specific authority connector, that describes a quantum of authorization</td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual authority connector class instance is managed and used</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Authority Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the authority connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided authority connector implementations.  The Documentum connector, the LiveLink connector, the Memex connector, and the Meridio connector all include authority connectors which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that all of these connectors extend a framework-provided authority connector base class, found at <em>org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an authority connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>getAuthorizationResponse()</strong></td><td>Obtain the authorization response, given a user name</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an authority connection <em>ConfigParams</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in two broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection.  Together they do the heavy lifting of your connector.</p>
-          <p></p>
-          <p>The <em>getAuthorizationResponse()</em> method returns an <em>AuthorizationResponse</em> object, which can describe a number of conditions:</p>
-          <p></p>
-          <table>
-            <tr><th>Condition</th><th>Meaning</th></tr>
-            <tr><td>RESPONSE_OK</td><td>The access tokens for the user were successfully obtained from the repository, and are being returned</td></tr>
-            <tr><td>RESPONSE_UNREACHABLE</td><td>The repository is currently unreachable, and appropriate disabling tokens are being returned</td></tr>
-            <tr><td>RESPONSE_USERNOTFOUND</td><td>The user was not found within the repository, and appropriate disabling tokens are being returned</td></tr>
-            <tr><td>RESPONSE_USERUNAUTHORIZED</td><td>The user was found, but was in some way disabled, and appropriate disabling tokens are being returned</td></tr>
-          </table>
-          <p></p>
-          <p></p>
-          <p>In all cases, the connector returns access tokens.  But in the case where token lookup has failed in some way, it is the responsibility of the connector to insure that inappropriate content is not viewed.  Usually, this is done by ingesting a "global deny" token attached to all documents from the given repository, and then having the associated authority connector return this global deny token when error conditions apply.</p>
-          <p></p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied authority connector's UI code, both for a description of the arguments to each page, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/en_US/writing-mapping-connectors.xml b/site/src/documentation/content/xdocs/en_US/writing-mapping-connectors.xml
deleted file mode 100644
index 4b60153..0000000
--- a/site/src/documentation/content/xdocs/en_US/writing-mapping-connectors.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing user mapping connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing a User Mapping Connector</title>
-      <p></p>
-      <p>A user mapping connector allows a user name to be transformed in a manner that depends on the functionality of the connector.  In some cases, no connection to
-            an external repository is required (for example, simple string transformations), while in some cases one might imagine such a connector consulting with (say) an
-            LDAP system to look up a specific name.</p>
-      <p></p>
-      <p>A user name is just a string, which is designed to represent a user identity.  Some user names have specific forms - for instance, Active Directory user names are
-            often represented in the form <code>user@domain</code>.  But, most importantly, the exact name used can often depend on the particular system being addressed.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, a user mapping connector consists of a single part:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.authorities.interfaces.IMappingConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The mapping connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific mapping connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Mapping connection</td><td>An mapping connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>User name</td><td>The name of a user, which is often a Kerberos principal name, e.g. <em>john@apache.org</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual mapping connector class instance is managed and used</td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Mapping Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the mapping connector interface.  You will note that the javadoc describes the usage and pooling model for a
-              connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing,
-              must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided mapping connector implementations.  The only connector presently included (the Regular Expression
-              user mapping connector) demonstrates some of the sorts of techniques you will need for an effective
-              implementation.  You will also note that all of these connectors extend a framework-provided mapping connector base class, found at
-              <em>org.apache.manifoldcf.authorities.mappers.BaseMappingConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the
-              connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have
-              database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not
-              very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating a mapping connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>mapUser()</strong></td><td>Given an input user name, find the corresponding output user name</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for a mapping connection <em>ConfigParams</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in two broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection.  Together they
-                do the heavy lifting of your connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods 
-                above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is
-                displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel
-                to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied mapping connector's UI code, both for a description of the arguments
-                to each page, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.
-              (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however,
-              some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email
-              to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/en_US/writing-output-connectors.xml b/site/src/documentation/content/xdocs/en_US/writing-output-connectors.xml
deleted file mode 100644
index db007c0..0000000
--- a/site/src/documentation/content/xdocs/en_US/writing-output-connectors.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing output connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing an Output Connector</title>
-      <p></p>
-      <p>An output connector furnishes the mechanism by which content that has been fetched from a repository gets handed to a back-end repository for processing.  It also furnishes a mechanism for removing previously-processed content from that back end repository.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an output connector consists of a single part, which is:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.agents.interfaces.IOutputConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The output connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific output connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Output connection</td><td>An output connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Document URI</td><td>The unique URI (or, in some cases, file IRI) of a document, which is meant to be displayed in search engine results as the link to the document</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual output connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework, e.g. recording activities; see <em>org.apache.manifoldcf.agents.interfaces.IOutputAddActivity</em> and <em>org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity</em></td></tr>
-          <tr><td>Output specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific output connector should do in the context of a specific job; see <em>org.apache.manifoldcf.agents.interfaces.OutputSpecification</em></td></tr>
-          <tr><td>Output version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if an ingestion operation needs to be repeated as a result of changes to the output specification in effect for a document</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Output Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the output connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided output connector implementations.  The GTS connector, the SOLR connector, the OpenSearchServer connector, the ElasticSearch connector, and the Null Output connector all are output connectors which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that all of these connectors extend a framework-provided output connector base class, found at <em>org.apache.manifoldcf.agents.output.BaseOutputConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an output connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>checkMimetypeIndexable()</strong></td><td>Decide whether a document with a given mime type is indexable or not</td></tr>
-            <tr><td><strong>checkDocumentIndexable()</strong></td><td>Decide whether a file is indexable or not</td></tr>
-            <tr><td><strong>checkLengthIndexable()</strong></td><td>Decide whether a document of a given length is indexable or not</td></tr>
-            <tr><td><strong>checkURLIndexable()</strong></td><td>Decide whether a document with a given URL is indexable or not</td></tr>
-            <tr><td><strong>getPipelineDescription()</strong></td><td>Use the supplied output specification to come up with an output version string</td></tr>
-            <tr><td><strong>addOrReplaceDocument()</strong></td><td>Add or replace the specified document within the target repository, or signal if the document cannot be handled</td></tr>
-            <tr><td><strong>removeDocument()</strong></td><td>Remove the specified document from the target repository</td></tr>
-            <tr><td><strong>noteJobComplete()</strong></td><td>Called at the end of a job run or job deletion, so that the index can be updated in batch</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an output connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the output specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the output version string</title>
-          <p></p>
-          <p>The output version string is used by ManifoldCF to determine whether or not the output specification or configuration changed in such a way as to require that the document be reprocessed.  ManifoldCF therefore requests the output version string for any document that is ready for processing, and usually does not process the document again if the returned output version string agrees with the output version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what an output connector writer needs to do is include everything in the output version string that could potentially affect how the document gets ingested, save that which is specific to the repository connector.  That may include bits of output connector configuration information, as well as data from the output specification.  When it's time to ingest, it's usually the correct thing to do to obtain the necessary data for ingestion out of the output version string, rather than calculating it or fetching it anew, because that guarantees that the document processing was done in a manner that agrees with its recorded output version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of the UI methods must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each method, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the framework's HTML or any specific repository connector's HTML.  The <em>OutputSpecification</em> HTML especially may be prone to collisions, because within any given job, this HTML is included in the same page as HTML from the chosen repository connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/en_US/writing-repository-connectors.xml b/site/src/documentation/content/xdocs/en_US/writing-repository-connectors.xml
deleted file mode 100644
index fa283f1..0000000
--- a/site/src/documentation/content/xdocs/en_US/writing-repository-connectors.xml
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing repository connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing repository connectors</title>
-      <p></p>
-      <p>A repository connector furnishes the mechanism for obtaining documents, metadata, and authority tokens from a repository.  The documents are expected to be handed to an output connector (described elsewhere) for ingestion into some other back-end repository.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an output connector consists of only one part:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.crawler.interfaces.IRepositoryConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The repository connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific repository connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Repository connection</td><td>A repository connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Document identifier</td><td>An arbitrary identifier, whose meaning determined only within the context of a specific repository connector, which the connector uses to describe a document within a repository</td></tr>
-          <tr><td>Component identifier</td><td>An arbitrary identifier, whose meaning determined only within the context of a specific document, which the connector uses to describe a component of a document within a repository</td></tr>
-          <tr><td>Document URI</td><td>The unique URI (or, in some cases, file IRI) of a document, which is meant to be displayed in search engine results as the link to the document</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Access token</td><td>A string, which is only meaningful in the context of a specific authority, that describes a quantum of authorization for a user</td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual repository connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework, e.g. recording the activity history; see <em>org.apache.manifoldcf.crawler.interfaces.IVersionActivity</em>, and <em>org.apache.manifoldcf.crawler.interfaces.IProcessActivity</em>, and <em>org.apache.manifoldcf.crawler.interfaces.ISeedingActivity</em></td></tr>
-          <tr><td>Document specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific repository connector should do in the context of a specific job; see <em>org.apache.manifoldcf.crawler.interfaces.DocumentSpecification</em></td></tr>
-          <tr><td>Document version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if a fetch or ingestion operation needs to be repeated as a result of changes to the document specification in effect for a document, or because of changes to the document itself</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Repository Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the repository connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided repository connector implementations.  There are a wide variety of connectors include with ManifoldCF that exercise just about every aspect of the repository connector interface.  These are:</p>
-        <p></p>
-        <ul>
-          <li>Documentum (uses RMI to segregate native code, etc.)</li>
-          <li>FileNet (also uses RMI, but because it is picky about its open-source jar versions)</li>
-          <li>File system (a good, but simple, example)</li>
-          <li>Jira (demonstrates good use of session management)</li>
-          <li>LiveLink (demonstrates use of local keystore infrastructure)</li>
-          <li>Meridio (local keystore, web services, result sets)</li>
-          <li>SharePoint (local keystore, web services)</li>
-          <li>RSS (local keystore, binning, fuzzy xml parsing)</li>
-          <li>Web (local database schema, local keystore, binning, events and prerequisites, cache management, fuzzy xml parsing)</li>
-          <li>Wiki (binning, rigorous xml parsing)</li>
-        </ul>
-        <p></p>
-        <p>You will also note that all of these connectors extend a framework-provided repository connector base class, found at <em>org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating a repository connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>addSeedDocuments()</strong></td><td>Use the supplied document specification to come up with an initial set of document identifiers</td></tr>
-            <tr><td><strong>processDocuments()</strong></td><td>For a set of documents, compute a version string, and take the appropriate action (e.g. ingest, or extract references from, or whatever)</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for a repository connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the document specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Model</title>
-          <p></p>
-          <p>Each connector must declare a specific model which it adheres to.  These models basically describe what the <strong>addSeedDocuments()</strong> method actually does, and are described below.</p>
-          <p></p>
-          <table>
-            <tr><th>Model</th><th>Description</th></tr>
-            <tr><td><em>MODEL_ALL</em></td><td>The <strong>addSeedDocuments()</strong> method supplies all specified documents on each call</td></tr>
-            <tr><td><em>MODEL_PARTIAL</em></td><td>The <strong>addSeedDocuments()</strong> does not return a complete list of documents that match the criteria and time interval, because some of those documents are no longer discoverable</td></tr>
-            <tr><td><em>MODEL_ADD</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least all the matching documents that have been added to the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_ADD_CHANGE</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least those matching documents that have been added or changed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_ADD_CHANGE_DELETE</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least those matching documents that have been added, changed, or removed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least all the matching documents that have been added to the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD_CHANGE</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least those matching documents that have been added or changed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD_CHANGE_DELETE</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least those matching documents that have been added, changed, or removed in the repository, within the specified time interval</td></tr>
-          </table>
-          <p></p>
-          <p>Note that the choice of model is actually much more subtle than the above description might indicate.  It may, for one thing, be affected by characteristics of
-            the repository, such as whether the repository considers a document to have been changed if its security information was changed.  This would mean that,
-            even though most document changes are picked up and thus one might be tempted to declare the connector to be <em>MODEL_ADD_CHANGE</em>, the
-            correct choice would in fact be <em>MODEL_ADD</em>.</p>
-          <p></p>
-          <p>Another subtle point is what documents the connector is actually supposed to return by means of the <strong>addSeedDocuments()</strong> method.  The
-            start time and end time parameters handed to the method do not have to be strictly adhered to, for instance; it is always okay to return more documents.  It is never
-            okay for the connector to return fewer documents than were requested, on the other hand.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing a document identifier format</title>
-          <p></p>
-          <p>In order to decide on the format for a document identifier, you need to understand what this identifier is used for, and what it represents.  A document identifier usually corresponds to some entity within the source repository, such as a document or a folder.  Note that there is <strong>no</strong> requirement that the identifier represent indexable content.</p>
-          <p></p>
-          <p>The document identifier must be capable of furnishing enough information to:</p>
-          <p></p>
-          <ul>
-            <li>Calculate a version string for the document</li>
-            <li>Find child references for the document</li>
-            <li>Get the document's content, metadata, and access tokens, and/or component content, metadata, and access tokens</li>
-          </ul>
-          <p></p>
-          <p>We highly recommend that no additional information be included in the document identifier, other than what is needed for the above, as that will almost certainly cause problems.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the document version string</title>
-          <p></p>
-          <p>The document version string is used by ManifoldCF to determine whether or not the document or configuration changed in such a way as to require that the document
-            be reprocessed.  ManifoldCF therefore requires a version string for any document that is to be indexed, and connectors usually do not process the document again if the
-            returned version string agrees with the version string it has stored.</p>
-          <p></p>
-          <p>Thinking about this carefully, it is clear that what a connector writer needs to do is include everything in the version string that could potentially affect how the
-            document gets processed.  That may include the version of the document in the repository, bits of configuration information, metadata, and even access tokens (if the
-            underlying repository versions these things independently from the document itself).  Storing all of that information in the version string seems like a lot - but the string
-            is unlimited in length, and it is the only way ManifoldCF knows to determine if something has changed in the repository.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Document components</title>
-          <p></p>
-          <p>ManifoldCF considers all documents to consist of zero or more components.  A component is what is actually indexed, which means that each component has its own
-            identifier, data, metadata, access tokens, and URI.  It is up to your repository connector to break documents into components, if needed.  Most of the time, a repository document
-            consists of a single component.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods
-            above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is
-            displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the
-            rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each page, and
-            for some decent ideas of ways to organize your connector's UI code.  </p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the
-            framework's HTML or any specific output connector's HTML.  The <em>DocumentSpecification</em> editing HTML especially may be prone to collisions, because
-            within any given job, this HTML is included in the same page as HTML from the chosen output connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.
-          (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however,
-          some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email
-          to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/en_US/writing-transformation-connectors.xml b/site/src/documentation/content/xdocs/en_US/writing-transformation-connectors.xml
deleted file mode 100644
index 4b701ec..0000000
--- a/site/src/documentation/content/xdocs/en_US/writing-transformation-connectors.xml
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing transformation connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing a Transformation Connector</title>
-      <p></p>
-      <p>A transformation connector provides a mechanism by which content that has been fetched from a repository can be modified before it gets handed to a back-end repository for processing.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, a transformation connector consists of a single part, which is:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.agents.interfaces.ITransformationConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The transformation connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific
-            transformation connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Transformation connection</td><td>An output connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or
-            streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual output connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework,
-            e.g. recording activities; see <em>org.apache.manifoldcf.agents.interfaces.IOutputAddActivity</em> and <em>org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity</em></td></tr>
-          <tr><td>Output specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific
-            transformation connector should do in the context of a specific job; see <em>org.apache.manifoldcf.agents.interfaces.OutputSpecification</em></td></tr>
-          <tr><td>Transformation version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if an ingestion operation needs
-            to be repeated as a result of changes to the output specification in effect for a document</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the transformation engine is unavailable, and gives a best estimate
-            of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Transformation Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the transformation connector interface.  You will note that the javadoc describes the usage and pooling model for a
-          connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must
-          be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine the provided transformation connector implementations.  The only currently enabled connector is the null transformation connector,
-          which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that this connector extends a framework-provided
-          transformation connector base class, found at <em>org.apache.manifoldcf.agents.transformation.BaseTransformationConnector</em>.  This base class furnishes some basic
-          bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors
-          are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however,
-          not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an output connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>checkMimetypeIndexable()</strong></td><td>Decide whether a document with a given mime type is indexable or not</td></tr>
-            <tr><td><strong>checkDocumentIndexable()</strong></td><td>Decide whether a file is indexable or not</td></tr>
-            <tr><td><strong>checkLengthIndexable()</strong></td><td>Decide whether a document of a given length is indexable or not</td></tr>
-            <tr><td><strong>checkURLIndexable()</strong></td><td>Decide whether a document with a given URL is indexable or not</td></tr>
-            <tr><td><strong>getPipelineDescription()</strong></td><td>Use the supplied output specification to come up with an output version string</td></tr>
-            <tr><td><strong>addOrReplaceDocument()</strong></td><td>Add or replace the specified document within the target repository, or signal if the document cannot be handled</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an output connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the output specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the transformation version string</title>
-          <p></p>
-          <p>The output version string is used by ManifoldCF to determine whether or not the output specification or configuration changed in such a way as to require that the document be reprocessed.  ManifoldCF therefore requests the output version string for any document that is ready for processing, and usually does not process the document again if the returned output version string agrees with the output version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what an output connector writer needs to do is include everything in the output version string that could potentially affect how the document gets ingested, save that which is specific to the repository connector.  That may include bits of output connector configuration information, as well as data from the output specification.  When it's time to ingest, it's usually the correct thing to do to obtain the necessary data for ingestion out of the output version string, rather than calculating it or fetching it anew, because that guarantees that the document processing was done in a manner that agrees with its recorded output version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of the UI methods must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each method, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the framework's HTML or any specific repository connector's HTML.  The <em>OutputSpecification</em> HTML especially may be prone to collisions, because within any given job, this HTML is included in the same page as HTML from the chosen repository connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/index.xml b/site/src/documentation/content/xdocs/index.xml
deleted file mode 100644
index b83a385..0000000
--- a/site/src/documentation/content/xdocs/index.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-  <header>
-    <title>Welcome to Apache ManifoldCF release documentation!</title>
-  </header>
-  <body>
-    <p>Please click the appropriate tab above to see documentation in the language of your choice.</p>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/concepts.xml b/site/src/documentation/content/xdocs/ja_JP/concepts.xml
deleted file mode 100644
index c56fc44..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/concepts.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>概要</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>概要</title>
-      <p>ManifoldCFは次のような目的のために設計されたクローラフレームワークです。</p>
-      <p></p>
-      <ul>
-        <li>シャットダウン及び再起動からの回復力に強く信頼性の高いフレームワーク</li>
-        <li>差分更新に対応。収集するコンテンツの条件はジョブに定義します。ジョブを継続的に実行してコンテンツの差分を収集することができます</li>
-        <li>同時に並行して異なるリポジトリの種類と接続してコンテンツを収集することが可能です</li>
-        <li>コンテンツセキュリティに対応しています。ユーザ毎に閲覧可能なコンテンツのみの検索結果が表示されます</li>
-        <li>高速。多くのコンテンツをそれなりの時間内に処理することができます</li>
-        <li>メモリ利用を予測することができます</li>
-      </ul>
-      <p></p>
-      <p>ManifoldCFはリレーショナルデータベースを利用することで多くのアーキテクチャの目的を達成しています。現バージョンはPostgresql、Derby、MySQLに対応しています。その他のデータベースの利用も検討しています。</p>
-      <p></p>
-      <section>
-        <title>ManifoldCFコンテンツモデル</title>
-        <p></p>
-        <p>ManifoldCFの各コンテンツはバイナリデータとそれに関連するメタデータから構成され、ユニークURIに関連付けられています。検索用に組み合わせて利用する検索エンジンはこのモデルに対応する必要があります。</p>
-        <p></p>
-        <p>コンテンツはアクセストークンと関連つけることができます。アクセストークンについては次の節で説明します。</p>
-        <p></p>
-      </section>
-      <section>
-        <title>ManifoldCFセキュリティモデル</title>
-        <p></p>
-        <p>ManifoldCFセキュリティモデルは、マイクロソフトActive Directoryの認証及び階層のモデルに対応しています。ファイル及びコンテンツの承認/権限にActive Directoryを利用している企業が多いからです。また、Active Directoryは多くの第三者ソフトウエアでも利用されているからです。</p>
-        <p></p>
-        <p>ManifoldCFは<em>アクセストークン</em>という概念を使っています。ManifoldCFでアクセストークンとは、コネクタに内容が依存する文字列です。ユーザにコンテンツを表示するか、表示しないかはこの文字列で制御されます。Active Directoryを利用する場合は、アクセストークンはActive Directory SID(例:S-1-23-4-1-45)です。LiveLinkでは別の意味をもつ文字列になります。</p>
-        <p></p>
-        <p>ManifoldCFセキュリティモデルでは、<em>権限コネクタ</em>が検索を実行したユーザのアクセストークン一覧を作成します。複数の異なるセキュリティで管理されたサーバを検索する場合は、権限コネクタがアクセストークンを組み合わせます。作成されたアクセストークン一覧は検索結果と共に検索エンジンに送られます。検索エンジンはこの情報を元にユーザに表示する内容を制限することができます。</p>
-        <p></p>
-        <p>コンテンツの索引を作成した後に、ManifoldCFはアクセストークンを検索エンジンに送ります。アクセストークンには「許可」と「拒否」の2種類のトークンがあります。なお、アクセストークンはActive Directoryと同様に「共有」,「フォルダ」,「ファイル」にセキュリティを設定することができます。</p>
-        <p></p>
-        <p>検索エンジンはアクセストークンの内容に基づき表示する検索結果の内容を決めます。検索エンジンにSolr 1.5を利用される場合はこの処理を標準で行えるようにするためにApache SolrプロジェクトにSearchComponentプラグインとそれを利用する説明書を提供しています( <a href="https://issues.apache.org/jira/browse/SOLR-1895">SOLR-1895</a>)。</p>
-        <p></p>
-      </section>
-      <section>
-        <title>ManifoldCF論理エンティティ</title>
-        <p></p>
-        <section>
-          <title>コネクタ</title>
-          <p></p>
-          <p>ManifoldCFには次の3つのコネクタがあります:</p>
-          <p></p>
-          <ul>
-            <li>権限コネクタ</li>
-            <li>リポジトリコネクタ</li>
-            <li>出力コネクタ</li>
-          </ul>
-          <p></p>
-          <p>すべてのコネクタには共通した機能があります。先ず、すべてのコネクタはプールされています。ManifoldCFは設定したコネクタのインスタンスを管理します。インスタンス数の上限を設定することもできます。コネクタの実装はManifoldCFが管理するプール内で自身を管理するためのメソッドを実装しています。コネクタは設定可能です。コネクタの設定はコネクタの実装に依存したXML文で行えます。ManifoldCFでは、設定されたコネクタのインスタンスを<em>コネクション</em>と呼びます。</p>
-          <p></p>
-          <p>コネクタは次のような機能をもちます:</p>
-          <p></p>
-          <table>
-            <tr><th>コネクタタイプ</th><th>機能</th></tr>
-            <tr><td>権限コネクタ</td><td>リポジトリに意味あるようにユーザ名とアクセストークンを対応づける</td></tr>
-            <tr><td>リポジトリコネクタ</td><td>指定されたリポジトリ(例:SharePointやWeb)からコンテンツを収集する</td></tr>
-            <tr><td>出力コネクタ</td><td>収集したコンテンツと処理(追加や削除など)をバックエンド検索エンジン又はLuceneのようなエンティティに送信する</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>コネクション</title>
-          <p></p>
-          <p>上で説明した通りに、<em>コネクション</em>とはコネクタの実装とコネクタ固有の設定情報です。Webブラウザからこれらの設定を行うことができます。</p>
-          <p></p>
-          <p>コネクタには「何を」よりも「どのように」という情報を設定します。例えば、LiveLinkコネクションにはLiveLinkサーバと接続の仕方を設定します。どの文書ファイルを収集するかのような情報は設定しません。</p>
-          <p></p>
-          <p><em>リポジトリコネクション</em>と<em>権限コネクション</em>及び出力コネクションの設定は異なります。リポジトリコネクションには、権限コネクションを設定します。ManifoldCFが収集する<strong>すべて</strong>の文書は適切なアクセストークンが必要だからです。</p>
-          <p></p>
-        </section>
-        <section>
-          <title>ジョブ</title>
-          <p></p>
-          <p>ManifoldCFで<em>ジョブ</em>とは、指定したリポジトリコネクションと出力コネクションの同期をとるための情報です。ジョブには次の情報を含みます:</p>
-          <p></p>
-          <ul>
-            <li>詳細説明</li>
-            <li>リポジトリコネクション(暗黙的に権限コネクションを含む)</li>
-            <li>出力コネクション</li>
-            <li>リポジトリコネクションに特定したジョブが対象とするコンテンツとメタデータの説明</li>
-            <li>クロールモデル:「最後まで実行」又は「継続実行」</li>
-            <li>ジョブの実行スケジュール:指定された時間帯または即時</li>
-          </ul>
-          <p></p>
-          <p>複数のジョブで同じリポジトリコネクションを使うことができます。即ち、ManifoldCFでは複数のジョブで同じ文書を収集するように設定することを許可していますが、普通は同じ文書を異なるジョブで収集しないように設定します。</p>
-        </section>
-      </section>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/end-user-documentation.xml b/site/src/documentation/content/xdocs/ja_JP/end-user-documentation.xml
deleted file mode 100644
index b536511..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/end-user-documentation.xml
+++ /dev/null
@@ -1,1616 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- 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.
--->
-
-<document>
-    <header><title>ManifoldCF- エンドユーザマニュアル</title></header>
-    <properties>
-    </properties>
-    <body>
-
-        <section id="overview">
-            <title>概要</title>
-            <p>本マニュアルはManifoldCFを利用するエンドユーザ向けのマニュアルです。ManifoldCFフレームワークが既にインストール/セットアップされていて、すべての必須なサービスが正常に動作し、利用するコネクションタイプが正しく登録されていることを前提にします。これらの作業を自分で行う場合は、「開発者リソース」ページを参照してください。
-            </p>
-            <p>本マニュアルは主にManifoldCFのユーザインタフェースの使い方について説明します。ManifoldCFの標準的な設定では、ブラウザーで次のURLを開きます:<code>http://my-server-name:8345/mcf-crawler-ui</code>。もちろん、これはシステム毎に異なるでしょう。ご自身の環境での適切なURLについてはシステム管理者に問い合わせてください。
-            </p>
-            <p>ManifoldCFのUIはFirefox及び色々なバージョンのIEでテストされています。他のWebブラウザーを利用される場合は、正しく動作しない可能性もあります。ブラウザーの非互換性の問題を見つけた場合は、システム管理者に連絡してください。</p>
-            <p>フレームワークのユーザインタフェースを初めて表示した時に、まずログインするように求められます:</p>
-            <br/><br/>
-            <figure src="images/ja_JP/login_ja_JP.PNG" alt="ログイン画面" width="80%"/>
-            <br/><br/>
-            <p>WebページからURLを開くと、以下のようなページが表示されます:</p>
-            <br/><br/>
-            <figure src="images/ja_JP/welcome-screen_ja_JP.PNG" alt="歓迎の画面" width="80%"/>
-            <br/><br/>
-            <p>左側に選択できるメニューが表示されます。右側には挨拶メッセージが表示されていますが、左側のメニューから項目を選択すると、右側に表示される内容が変わります。本格的に始める前に、下のメニューの説明に目を通してManifoldCFの機能の概要を理解することをお勧めします。
-            </p>
-            <section id="outputs">
-                <title>出力コネクションの定義</title>
-                <p>フレームワークのUIの左側のメニューには、出力コネクションの一覧へのリンクがあります。出力コネクションとは、様々なリポジトリから取得したドキュメントを書き込むことのできるシステムや場所へのコネクションです。これは多くの場合、検索エンジンです。</p>
-                <p>ジョブにはすべて出力コネクションを指定することが必要です。出力コネクションを作成するには、左側メニューから「出力コネクション一覧」を選択してください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-output-connections_ja_JP.PNG" alt="出力コネクション一覧" width="80%"/>
-                <br/><br/>
-                <p>初めて利用する場合は、出力コネクションが表示されていないかもしれません。出力コネクションが定義されている場合は、この画面に一覧表示されます。出力コネクションを表示したり、編集したり、削除したりするためのリンクも合わせて表示されています。新しい出力コネクションを定義する場合は、一覧の下の「新しい出力コネクションを追加」リンクをクリックしてください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-output-connection-name_ja_JP.PNG" alt="新しい出力コネクションの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれ出力コネクションの様々な見方を表しています。各タブでコネクションの様々な属性を編集できます。選択したコネクションタイプに依存して、表示されるタブは異なります。</p>
-                <p>まず、コネクションに付ける名前と説明を入力してください。出力コネクション名は一意でなければなりません。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力したら、「タイプ」タブを選択してください。コネクションのタイプタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-output-connection-type_ja_JP.PNG" alt="新しい出力コネクションの追加とタイプの選択" width="80%"/>
-                <br/><br/>
-                <p>プルダウンボックスの中に表示される出力コネクションタイプの一覧とそれぞれの名前は、システムインテグレータにより決められます。以降の節で各出力コネクションタイプに対するタブの設定内容を説明します。</p>
-                <p>出力コネクションタイプを選択して、下の「次へ」ボタンを押してください。選択された出力コネクションに対応するタブが表示されます。また、下に「保存」ボタンも表示されます。コネクションを作成する場合は、この「保存」ボタンを<b>必ず</b>押してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>出力コネクションにはすべて「スロットリング」タブがあります。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/output-throttling_ja_JP.PNG" alt="出力コネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>このタブには項目は一つのみです: システムがこの出力コネクション用に利用できる最大のコネクション数です。この制限は、システムが過負荷になったり、またある場合にはライセンスの制限を超えたりするのを防ぐのに使えます。逆に、値を大きくすると、スループットが上がります。デフォルト値は10ですが、出力コネクションのタイプすべてに対して最適というわけではないかもしれません。より正確な値については、以降の各種の出力コネクションタイプを説明している節を参照してください。
-                </p>
-                <p>各コネクションタイプに対応するタブの説明は、対象の出力コネクションタイプを説明している節を参照してください。</p>
-                
-                <p>コネクションを保存すると、設定したコネクションの内容の要約画面が表示されます。(どのコネクションタイプを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-output-connection_ja_JP.PNG" alt="出力コネクション" width="80%"/>
-                <br/><br/>
-                <p>要約画面にはコネクションの状態も表示されます。コネクションが正しく設定された場合は、状態は「Connection working」(正常)と表示されます。設定に間違いがある場合は、代わりにコネクションタイプに固有の診断メッセージが表示されます。そうなったら、インフラを修理するかコネクションの設定を適切に編集するかして、問題を修正してください。</p>
-                <p>下に「更新」、「編集」、「削除」、「関連するすべてのコンテンツの再読込み」、「関連するすべてのコンテンツの削除」の5つのボタンがあります。各ボタンの目的を順に詳しく説明します。</p>
-                <p>「更新」ボタンは、単に出力コネクションの画面をリロードして、コネクションの状態を更新します。出力コネクションが接続されている外部のシステムに変更を加え、その変更がコネクションが成功するか否かに影響する場合に、このボタンを使います。</p>
-                <p>「編集」ボタンを押すと、前に戻ってコネクションパラメータの編集ができます。コネクションの属性または仕様を変更したい場合にこのボタンを使います。</p>
-                <p>「削除」ボタンを押すと、コネクションが削除できます。利用可能な出力コネクションの一覧からコネクションを削除したい場合に、このボタンを使います。ManifoldCFでジョブから参照中のコネクションは削除できないことに注意してください。</p>
-                <p>「関連するすべてのコンテンツの再読込み」ボタンを押すと、このコネクションで現在索引が作成されているコンテンツすべての記録されている版を無効にします。これは頻繁に使うボタンではありません。出力コネクションに書かれているシステムの構成を変更して、その結果、コンテンツすべての索引の再作成が必要になった時にクリックしてください。</p>
-                <p>「関連するすべてのコンテンツの削除」ボタンを押すと、このコネクションに関連して行なわれた索引に関する情報をすべてManifoldCFから削除します。これも頻繁に使うボタンではありません。対象のリポジトリから出力コネクションに書かれている索引をすべて削除した時に、クリックしてください。</p>
-            </section>
-
-            <section id="transformations">
-                <title>変換コネクションの定義</title>
-                <p>フレームワークのUIの左側のメニューには変換コネクションの一覧へのリンクがあります。変換コネクションとは様々なリポジトリから取得したドキュメントを操作可能なエンジンへのコネクションです。通常メタデータ抽出やマッピングを伴います。</p>
-                <p>ジョブは必ずしも変換コネクションを指定する必要はありません。多くの場合、最終目的の検索エンジンには、付属のデータ変換パイプラインがあります。しかし、そのようなデータ抽出や変換が利用できない場合、ManifoldCFは内部的にそのような処理を引き受ける方法を提供します。</p>
-                <p>変換コネクションを作成するには、左側メニューから「変換コネクション一覧」を選択してください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-transformation-connections_ja_JP.png" alt="変換コネクション一覧" width="80%"/>
-                <br/><br/>
-                <p>初めて利用する場合は、変換コネクションは定義されていないかもしれません。変換コネクションが定義されている場合は、この画面に一覧表示されます。変換コネクションを表示したり、編集したり、削除したりするためのリンクも合わせて表示されています。新しい変換コネクションを定義する場合は、一覧の下の「新しい変換コネクションを追加」リンクを選択してください。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-transformation-connection-name_ja_JP.png" alt="新しい変換コネクションの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれ変換コネクションの様々な見方を表しています。各タブでコネクションの様々な属性を編集できます。選択したコネクションタイプに依存して、表示されるタブは異なります。</p>
-                <p>まず、コネクションに付ける名前と説明を入力してください。変換コネクション名は一意でなければなりません。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力したら、「タイプ」タブを選択してください。コネクションのタイプタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-transformation-connection-type_ja_JP.png" alt="新しい変換コネクションの追加とタイプの指定" width="80%"/>
-                <br/><br/>
-                <p>プルダウンボックスの中に表示される変換コネクションタイプの一覧とそれぞれの名前は、システムインテグレータにより決められます。以降の節で各変換コネクションタイプに対するタブの設定内容を説明します。</p>
-                <p>変換コネクションタイプを選択して、下の「次へ」ボタンを押してください。選択された変換コネクションに対応するタブが表示されます。また、ページの下に「保存」ボタンも表示されます。コネクションを作成する場合はこの「保存」ボタンを<b>必ず</b>選択してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>変換コネクションタイプにはすべて「スロットリング」タブがあります。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/transformation-throttling_ja_JP.png" alt="変換コネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>このタブには項目は一つのみです: システムがこの変換コネクション用に利用できる最大のコネクション数です。この制限は、システムが過負荷になったり、またある場合にはライセンスの制限を超えたりするのを防ぐのに使えます。逆に、値を大きくすると、スループットが上がります。デフォルト値は10ですが、変換コネクションのタイプすべてに対して最適というわけではないかもしれません。より正確な値については、以降の各種の変換コネクションタイプを説明している節を参照してください。
-                </p>
-                <p>各コネクションタイプに対応するタブの説明は、対象の変換コネクションタイプを説明している節を参照してください。</p>
-                
-                <p>コネクションを保存すると、設定したコネクションの内容の要約画面が表示されます。(どのコネクションタイプを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-transformation-connection_ja_JP.png" alt="変換コネクション" width="80%"/>
-                <br/><br/>
-                <p>要約画面にはコネクションの状態も表示されます。コネクションが正しく設定された場合は、状態は「Connection working」(正常)と表示されます。設定に間違いがある場合は、代わりにコネクションタイプに固有の診断メッセージが表示されます。そうなったら、インフラを修理するかコネクションの設定を適切に編集するかして、問題を修正してください。</p>
-                <p>下に「更新」、「編集」、「削除」の3つのボタンがあります。各ボタンの目的を順に詳しく説明します。</p>
-                <p>「更新」ボタンは、単に変換コネクションの画面をリロードして、コネクションの状態を更新します。変換コネクションが接続されている外部のシステムに変更を加え、その変更がコネクションが成功するか否かに影響する場合に、このボタンを使います。</p>
-                <p>「編集」ボタンを押すと、前に戻ってコネクションパラメータの編集ができます。コネクションの属性または仕様を変更したい場合にこのボタンを使ってください。</p>
-                <p>「削除」ボタンを押すと、コネクションが削除できます。利用可能な変換コネクションの一覧からコネクションを削除したい場合に、このボタンを使います。ManifoldCFでジョブから参照中のコネクションは削除できないことに注意してください。</p>
-            </section>
-
-            <section id="groups">
-                <title>権限グループの定義</title>
-                <p>フレームワークのUIの左側メニュには権限グループ一覧へのリンクがあります。権限グループとは、リポジトリの取得対象ドキュメントに対し協調してセキュリティを提供するための権限の集合です。例えば、クレームベース認証のSharePoint 2010リポジトリに含まれるドキュメントはSharePoint自身、Active Directory(アクティブディレクトリ)、その他により認証されます。従って、このようなSharePointリポジトリのドキュメントはSharePointネイティブ権限、SharePoint Active Directory権限、その他SharePointクレームベース権限をメンバーとする権限グループを参照する必要があります。ただしほとんどの場合、一つの権限のみで構成された権限グループでもリポジトリのセキュリティ保護は十分です。</p>
-                <p>権限コネクションを定義する際に権限グループを選択する必要があるため、権限コネクションを定義する<b>前</b>に権限グループを定義してください。権限グループが未定義の場合、権限コネクションを作成できません。しかし、権限コネクションを定義する際に間違った権限グループを選択した場合、後で修正することは可能です。</p>
-                <p>任意のリポジトリコネクションを作成する前に、権限グループを作成しておくこともお薦めします。その理由は、リポジトリコネクションもセキュアなドキュメントのために逆に権限グループを参照する場合があるからです。後でリポジトリコネクションと権限グループの関係を変更することも可能ですが、関連ジョブが次に実行される時に多くのドキュメントが再インデックス付けされる場合があります。</p>
-                <p>権限グループを作成するには、左側メニューから「権限グループ一覧」を選択してください。次のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-authority-groups_ja_JP.png" alt="権限グループ一覧" width="80%"/>
-                <br/><br/>
-                <p>権限グループが定義されている場合は、一覧表示されます。権限グループの左に表示される「表示」、「編集」、「削除」リンクを選択して設定内容を表示、編集、削除することができます。新しい権限グループを定義する場合は、一覧の下の「新しい権限グループを追加」リンクを選択してください。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-authority-group-name_ja_JP.png" alt="新しい権限グループの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれ権限グループの様々な見方を表しています。権限グループには「名前」タブしか表示されません。</p>
-                <p>権限グループに名前と説明を入力してください。権限グループ名は一意である必要があります。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力した後に「保存」ボタンをクリックしてください。権限グループを作成または更新した際は<b>必ず</b>「保存」ボタンをクリックしてください。代わりに「キャンセル」ボタンを押せば新しい権限グループは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>権限グループを保存した後、要約画面にグループ情報が表示されます。その後、本権限グループに属する任意の権限コネクション、または本権限グループを参照するリポジトリコネクションを作成してください。</p>
-
-            </section>
-            
-            <section id="connections">
-                <title>リポジトリコネクションの定義</title>
-                <p>フレームワークのUIの左側メニューには、リポジトリコネクションの一覧へのリンクがあります。リポジトリコネクションとは、索引を作成するコンテンツを保管しているリポジトリシステムへのコネクションです。</p>
-                <p>そこからコンテンツを読み込むので、ジョブはすべてリポジトリコネクションを指定することが必要です。そのため、コンテンツから索引を作成する前に、リポジトリコネクションを作成することが必要です。</p>
-                <p>リポジトリコネクションに関連する権限グループを指定することもできます。ここで指定された権限グループは、リポジトリコネクションで読み込むコンテンツのセキュリティ環境を決定します。クローラーを実行した後にもリポジトリコネクションに対応した権限グループを変更することもできますが、この場合は誰でも検索可能であるためリポジトリコネクションが対象とするすべてのコンテンツの索引を再構成することが必要です。そのため、リポジトリコネクションを定義する前に権限グループを設定することを推奨します。</p>
-                <p>リポジトリコネクションを作成するには左側のメニューから「リポジトリコネクション一覧」を選択します。次のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-repository-connections_ja_JP.PNG" alt="リポジトリコネクション一覧" width="80%"/>
-                <br/><br/>
-                <p>初めて利用する場合は、リポジトリコネクションは表示されていないかもしれません。リポジトリコネクションが定義されている場合は、この画面に一覧表示されます。リポジトリコネクションを表示したり、編集したり、削除したりするためのリンクも合わせて表示されています。新しいリポジトリコネクションを定義する場合は、一覧の下の「新しいコネクションを追加」リンクをクリックしてください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-repository-connection-name_ja_JP.PNG" alt="新しいリポジトリコネクションの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれリポジトリコネクションの様々な見方を表しています。各タブでコネクションの様々な属性を編集できます。選択したコネクションタイプに依存して、表示されるタブは異なります。</p>
-                <p>まず、コネクションに付ける名前と説明を入力してください。リポジトリコネクション名は一意でなければなりません。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力したら、「タイプ」タブを選択してください。コネクションのタイプタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-repository-connection-type_ja_JP.PNG" alt="新しいリポジトリコネクションの追加とタイプの選択" width="80%"/>
-                <br/><br/>
-                <p>プルダウンボックスの中に表示されるリポジトリコネクションタイプの一覧とそれぞれの名前は、システムインテグレータにより決められます。以降の節で各リポジトリコネクションタイプに対するタブの設定内容を説明します。</p>
-                <p>この時点でリポジトリから読み込むコンテンツを保護するのに使う権限グループを選択することもできます。この段階より前に権限グループの権限コネクションを定義する必要はありませんが、そうしないと索引を作成したコンテンツを検索できません。</p>
-                <p>リポジトリコネクションタイプと(ご希望なら)権限グループを選択した後は下の「次へ」ボタンをクリックしてください。選択されたリポジトリコネクションに対応するタブが表示されます。また、ページの下に「保存」ボタンも表示されます。コネクションを作成する場合はこの「保存」ボタンを<b>必ず</b>押してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>リポジトリコネクションにはすべて「スロットリング」タブがあります。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/repository-throttling_ja_JP.PNG" alt="リポジトリコネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>このタブには二つの項目があります。まず一つ目は、システムがこのリポジトリコネクション用に利用できる最大のコネクション数です。この制限は、システムが過負荷になったり、またある場合にはライセンスの制限を超えたりするのを防ぐのに使えます。逆に、値を大きくすると、スループットが上がります。デフォルト値は10ですが、リポジトリコネクションのタイプすべてに対して最適というわけではないかもしれません。より正確な値については、以降の各種のリポジトリコネクションタイプを説明している節を参照してください。二つ目は、クローラーがこのコネクションを利用して平均的にどれだけ早くコンテンツを読み込むかです。
-                </p>
-                <p>コネクション毎に「スロットルbin」を設定することができます。スロットルbinとは、読み込み頻度を制限するリソースの名前です。(恐らく)個々のサーバは独立して頻度を制御することが必要でしょうから、Webコネクションはコンテンツのサーバ名をスロットルbinとして使います。
-                </p>
-                <p>リポジトリコネクションの「スロットリング」タブではスロットリング設定を数に制限なく定義できます。各スロットリング設定は、スロットルbin集を表す正規表現、説明文、正規表現に一致するスロットルbin毎の1分あたりの平均読み込み頻度から構成されています。スロットルbinが1つ以上のスロットリング設定と一致した場合は、一番資源を利用しない読み込み設定が選ばれます。</p>
-                <p>一番簡単な正規表現は空の正規表現です。この場合はコネクションのスロットルbinすべてと一致します。コネクションにデフォルトのスロットル設定を指定する場合には、この方法を使って設定することができます。平均読込み率を指定して、「追加」ボタンをクリックしてください。以下のようなスロットリングタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/repository-throttling-with-throttle_ja_JP.PNG" alt="スロットルありのリポジトリコネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>スロットル設定を行わない場合は、コンテンツの読込みはスロットルされません。</p>
-                <p>各コネクションタイプに対応するタブの説明は、対象のリポジトリコネクションタイプを説明している節を参照してください。</p>
-
-                <p>コネクションを保存すると、設定したコネクションの内容の要約画面が表示されます。(どのコネクションタイプを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-repository-connection_ja_JP.PNG" alt="View Repository Connection" width="80%"/>
-                <br/><br/>
-                <p>要約画面にはコネクションの状態も表示されます。コネクションが正しく設定された場合は、状態は「Connection working」(正常)と表示されます。設定に間違いがある場合は、代わりにコネクションタイプに固有の診断メッセージが表示されます。そうなったら、インフラを修理するかコネクションの設定を適切に編集するかして、問題を修正してください。</p>
-                <p>下に「更新」、「編集」、「削除」、「すべての関連履歴をクリア」の4つのボタンがあります。各ボタンの目的を順に詳しく説明します。</p>
-                <p>「更新」ボタンは、単にリポジトリコネクションの画面をリロードして、コネクションの状態を更新します。リポジトリコネクションが接続されている外部のシステムに変更を加え、その変更がコネクションが成功するか否かに影響する場合に、このボタンを使います。</p>
-                <p>「編集」ボタンを押すと、前に戻ってコネクションパラメータの編集ができます。コネクションの属性または仕様を変更したい場合にこのボタンを使います。</p>
-                <p>「削除」ボタンを押すと、コネクションが削除できます。利用可能なリポジトリコネクションの一覧からコネクションを削除したい場合に、このボタンを使います。ManifoldCFでジョブから参照中のコネクションは削除できないことに注意してください。</p>
-                <p>「すべての関連履歴をクリア」ボタンを押すと、現在のリポジトリコネクションに関連する履歴データをすべて削除します。これは頻繁に使うボタンではありません。履歴データは、「履歴レポート」などの、レポートを作るのに使われます。現時刻から指定された期間よりも古い履歴を自動的に削除するようにManifoldCFを設定する方法があります。しかし、今すぐ履歴をすべて削除したい場合には、このボタンを使います。</p>
-            </section>
-
-            <section id="notifications">
-                <title>通知コネクションの定義</title>
-                <p>フレームワークのUIの左側メニューには、通知コネクションの一覧へのリンクがあります。通知コネクションとは、メールやテキストメッセージのような通知メッセージを生成するエンジンへのコネクションです。通知メッセージは、特にジョブの完了や意図せぬ終了を通知します。</p>
-                <p>ジョブには1つ、もしくはそれ以上の通知コネクションを指定できます。通知コネクションを作成するには、左側メニューから「通知コネクション一覧」を選択してください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-notification-connections_ja_JP.PNG" alt="通知コネクション一覧" width="80%"/>
-                <br/><br/>
-                <p>初めて利用する場合は、通知コネクションが表示されていないかもしれません。通知コネクションが定義されている場合は、この画面に一覧表示されます。通知コネクションを表示したり、編集したり、削除したりするためのリンクも合わせて表示されています。新しい通知コネクションを定義する場合は、一覧の下の「新しい通知コネクションを追加」リンクをクリックしてください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-notification-connection-name_ja_JP.PNG" alt="新しい通知コネクションの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれ通知コネクションの様々な見方を表しています。各タブでコネクションの様々な属性を編集できます。選択したコネクションタイプに依存して、表示されるタブは異なります。</p>
-                <p>まず、コネクションに付ける名前と説明を入力してください。出力コネクション名は一意でなければなりません。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力したら、「タイプ」タブを選択してください。コネクションのタイプタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-notification-connection-type_ja_JP.PNG" alt="新しい通知コネクションの追加とタイプの選択" width="80%"/>
-                <br/><br/>
-                <p>プルダウンボックスの中に表示される通知コネクションタイプの一覧とそれぞれの名前は、システムインテグレータにより決められます。以降の節で各出力コネクションタイプに対するタブの設定内容を説明します。</p>
-                <p>通知コネクションタイプを選択して、下の「次へ」ボタンを押してください。選択された通知コネクションに対応するタブが表示されます。また、下に「保存」ボタンも表示されます。コネクションを作成する場合は、この「保存」ボタンを<b>必ず</b>押してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>通知コネクションにはすべて「スロットリング」タブがあります。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/notification-throttling_ja_JP.PNG" alt="通知コネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>このタブには指定できる項目は一つのみです: システムがこの通知コネクション用に利用できる最大のコネクション数です。この制限は、システムが過負荷になったり、またある場合にはライセンスの制限を超えたりするのを防ぐのに使えます。逆に、値を大きくすると、スループットが上がります。デフォルト値は10ですが、通知コネクションのタイプすべてに対して最適というわけではないかもしれません。より正確な値については、以降の各種の通知コネクションタイプを説明している節を参照してください。
-                </p>
-                <p>各コネクションタイプに対応するタブの説明は、対象の通知コネクションタイプを説明している節を参照してください。</p>
-                
-                <p>コネクションを保存すると、設定したコネクションの内容の要約画面が表示されます。(どのコネクションタイプを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-notification-connection_ja_JP.PNG" alt="通知コネクション" width="80%"/>
-                <br/><br/>
-                <p>要約画面にはコネクションの状態も表示されます。コネクションが正しく設定された場合は、状態は「Connection working」(正常)と表示されます。設定に間違いがある場合は、代わりにコネクションタイプに固有の診断メッセージが表示されます。そうなったら、インフラを修理するかコネクションの設定を適切に編集するかして、問題を修正してください。</p>
-                <p>下に「更新」、「編集」、「削除」の3つのボタンがあります。各ボタンの目的を順に詳しく説明します。</p>
-                <p>「更新」ボタンは、単に通知コネクションの画面をリロードして、コネクションの状態を更新します。通知コネクションが接続されている外部のシステムに変更を加え、その変更がコネクションが成功するか否かに影響する場合に、このボタンを使います。</p>
-                <p>「編集」ボタンを押すと、前に戻ってコネクションパラメータの編集ができます。コネクションの属性または仕様を変更したい場合にこのボタンを使います。</p>
-                <p>「削除」ボタンを押すと、コネクションが削除できます。利用可能な通知コネクションの一覧からコネクションを削除したい場合に、このボタンを使います。ManifoldCFでジョブから参照中のコネクションは削除できないことに注意してください。</p>
-            </section>
-
-            <section id="mappers">
-                <title>ユーザーマッピングコネクションの定義</title>
-                <p>フレームワークのUIの左側メニューにはユーザーマッピングコネクション一覧へのリンクがあります。ユーザーマッピングコネクションとは、ユーザ名を別ユーザ名にマッピングする方法を理解しているシステムへのコネクションです。例えば、LiveLinkを用いた文書安全対策を実施したいが、Active Directoryユーザー名しか持っていない場合、LiveLink権限で使うためのアクセストークンを発見する前に、Active Directoryユーザー名を該当するLiveLinkユーザ名にマッピングする必要があります。</p>
-                <p>実用的なユーザーマッピングコネクションはすべて他のシステムにアクセスすることが必要というわけではありません。ManifoldCFには、例えば、ユーザ名文字列を独自に正規表現で処理するための正規表現ユーザーマッパーが付いています。また、ユーザマッピングはほとんどではないにしても多くの権限において必要ありません。作成予定の権限が同じユーザ名で完全に操作できて、かつそのユーザ名が検索時にManifoldCFの権限サーブレットにおいて利用可能である場合、ユーザーマッピングコネクションは必要ありません。</p>
-                <p>権限コネクションを設定する<b>前</b>にマッピングコネクションを定義すべきです。理由は、権限コネクションで予め定義されたマッピングコネクションを指定する場合があるからです。同様な理由から、ユーザ名を処理したい場合もマッピングコネクションを定義しておくのが便利です。初回で正しく設定できなくても、後で戻って修正可能です。</p>
-                <p>ユーザーマッピングコネクションを作成するには、左側メニューから「ユーザーマッピングコネクション一覧」を選択してください。次のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-mapping-connections_ja_JP.png" alt="ユーザーマッピングコネクション一覧" width="80%"/>
-                <br/><br/>
-                <p>初めて利用する場合は、ユーザーマッピングコネクションは定義されていないかもしれません。ユーザーマッピングコネクションが定義されている場合は、この画面に一覧表示されます。ユーザーマッピングコネクションを表示したり、編集したり、削除したりするためのリンクも合わせて表示されています。新しいユーザーマッピングコネクションを定義する場合は、一覧の下の「新しいコネクションを追加」リンクを選択してください。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-mapping-connection-name_ja_JP.png" alt="新しいユーザーマッピングコネクションの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれマッピングコネクションの様々な見方を表しています。各タブでコネクションの様々な属性を編集できます。選択したコネクションタイプに依存して、表示されるタブは異なります。</p>
-                <p>まず、コネクションに付ける名前と説明を入力してください。ユーザーマッピングコネクション名は一意でなければなりません。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力したら、「タイプ」タブを選択してください。コネクションのタイプタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-mapping-connection-type_ja_JP.png" alt="新しいユーザーマッピングコネクションの追加とタイプの選択" width="80%"/>
-                <br/><br/>
-                <p>プルダウンボックスの中に表示されるマッピングコネクションタイプの一覧とそれぞれの名前は、システムインテグレータにより決められます。以降の節でManifoldCFに含まれる各マッピングコネクションタイプに対するタブの設定内容を説明します。</p>
-                <p>マッピングコネクションタイプを選択して、下の「次へ」ボタンを選択してください。選択されたユーザーマッピングコネクションに対応するタブが表示されます。また、ページの下に「保存」ボタンも表示されます。コネクションを作成する場合はこの「保存」ボタンを<b>必ず</b>選択してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>マッピングコネクションにはすべて「条件」タブがあります。このタブで、(もしあれば)このコネクションに先立って実行すべきマッピングコネクションを指定できます。タブは以下の通りです:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/mapping-prerequisites_ja_JP.png" alt="ユーザーマッピング条件" width="80%"/>
-                <br/><br/>
-                <p>注意: ループ関係にある複数条件を指定することは絶対避けてください。そのため、ManifoldCFはプルダウンリストにループに陥るようなユーザーマッピングコネクションを表示しないようにしています。</p>
-                <p>マッピングコネクションタイプにはすべて「スロットリング」タブがあります。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/mapping-throttling_ja_JP.png" alt="ユーザーマッピングコネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>このタブには項目は一つのみです: システムがこのユーザーマッピングコネクション用に利用できる最大のコネクション数です。この制限は、システムが過負荷になったり、またある場合にはライセンスの制限を超えたりするのを防ぐのに使えます。逆に、値を大きくすると、スループットが上がります。デフォルト値は10ですが、マッピングコネクションのタイプすべてに対して最適というわけではないかもしれません。より正確な値については、以降の各種のユーザーマッピングコネクションタイプを説明している節を参照してください。
-                </p>
-                <p>各コネクションタイプに対応するタブの説明は、対象のマッピングコネクションタイプを説明している節を参照してください。</p>
-
-                <p>コネクションを保存すると、設定したコネクションの内容の要約画面が表示されます。(どのコネクションタイプを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-mapping-connection_ja_JP.png" alt="マッピングコネクション" width="80%"/>
-                <br/><br/>
-                <p>要約画面にはコネクションの状態も表示されます。コネクションが正しく設定された場合は、状態は「Connection working」(正常)と表示されます。設定に間違いがある場合は、代わりにコネクションタイプに固有の診断メッセージが表示されます。そうなったら、インフラを修理するかコネクションの設定を適切に編集するかして、問題を修正してください。</p>
-                <p>下に「更新」、「編集」、「削除」の3つのボタンがあります。各ボタンの目的を順に詳しく説明します。</p>
-                <p>「更新」ボタンは、単にマッピングコネクションの画面をリロードして、コネクションの状態を更新します。マッピングコネクションが接続されている外部のシステムに変更を加え、その変更がコネクションが成功するか否かに影響する場合に、このボタンを使います。</p>
-                <p>「編集」ボタンを押すと、前に戻ってコネクションパラメータの編集ができます。コネクションの属性または仕様を変更したい場合にこのボタンを使います。</p>
-                <p>「削除」ボタンを押すと、コネクションが削除できます。利用可能なマッピングコネクションの一覧からコネクションを削除したい場合に、このボタンを使います。ManifoldCFでジョブから参照中のコネクションは削除できないことに注意してください。</p>
-            </section>
-
-            <section id="authorities">
-                <title>権限コネクションの定義</title>
-                <p>フレームワークのUIの左側メニューに権限コネクション一覧へのリンクがあります。権限コネクションとは、特定のセキュリティ環境を定義するシステムへのコネクションです。例えば、Active Directoryで保護されているファイルの索引を作る場合は、Active Directory権限コネクションを定義します。</p>
-                <p>特定の権限コネクションのみが特定のリポジトリコネクションタイプと互換性があることに注意してください。どのように使われることを想定しているのかを理解するには、この文書の対応するリポジトリタイプの詳細を読んでください。索引を作りたいコンテンツが誰からも見えることを気にしないのであれば、権限は必要ありません。例えば、ウェブ、RSS、Wikiをクロールする場合が当てはまるでしょう。しかしながら、それ以外リポジトリには独自のセキュリティ機構がある場合がほとんどです。</p>
-                <p>権限コネクションを作成するには、左側メニューから「権限コネクション一覧」を選択してください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-authority-connections_ja_JP.PNG" alt="権限コネクション一覧" width="80%"/>
-                <br/><br/>
-                <p>初めて利用する場合は、権限コネクションが表示されていないかもしれません。権限コネクションが定義されている場合は、この画面に一覧表示されます。出力コネクションを表示したり、編集したり、削除したりするためのリンクも合わせて表示されています。新しい権限コネクションを定義する場合は、一覧の下の「新しいコネクションを追加」リンクをクリックしてください。以下のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-authority-connection-name_ja_JP.PNG" alt="新しい権限コネクションの追加と名前の指定" width="80%"/>
-                <br/><br/>
-                <p>上に表示されるタブはそれぞれ権限コネクションの様々な見方を表しています。各タブでコネクションの様々な属性を編集できます。選択したコネクションタイプに依存して、表示されるタブは異なります。</p>
-                <p>まず、コネクションに付ける名前と説明を入力してください。権限コネクション名は一意でなければなりません。また、一旦設定すると変更できませんので注意してください。名前は32文字以内、説明は255文字以内で設定してください。入力したら、「タイプ」タブを選択してください。コネクションのタイプタブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-authority-connection-type_ja_JP.PNG" alt="新しい権限コネクションの追加とタイプの選択" width="80%"/>
-                <br/><br/>
-                <p>プルダウンボックスの中に表示される権限コネクションタイプの一覧とそれぞれの名前は、システムインテグレータにより決められます。以降の節で各権限コネクションタイプに対するタブの設定内容を説明します。</p>
-                <p>このタブでは作成している権限コネクションが属する権限グループも選ばなければなりません。プルダウンメニューから適切な権限グループを選んでください。</p>
-                <p>デフォルトでない認証ドメインを選ぶこともできます。認証ドメインは権限コネクションにどのユーザーIDが関連するかを記述するものです。例えば、1人のユーザーがActive DirectoryのID、LiveLinkのIDおよびFaceBookのIDを持っているかもしれません。ある権限コネクションはそのIDの1つに対してだけ適切でしょう。利用可能な認証ドメインの一覧はシステムインテグレータにより決められます。</p>
-                <p>権限コネクションタイプ、権限グループ、必要なら認証ドメインを選択して、下の「次へ」ボタンを押してください。選択された権限コネクションに対応するタブが表示されます。また、下に「保存」ボタンも表示されます。コネクションを作成する場合は、この「保存」ボタンを<b>必ず</b>押してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>権限コネクションにはすべて「条件」タブがあります。このタブで、(もしあれば)このコネクションに先立って実行すべきマッピングコネクションを指定できます。タブは以下の通りです:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/authority-prerequisites_ja_JP.PNG" alt="権限コネクション条件" width="80%"/>
-                <br/><br/>
-                <p>権限コネクションにはすべて「スロットリング」タブもあります。選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/authority-throttling_ja_JP.PNG" alt="権限コネクションスロットリング" width="80%"/>
-                <br/><br/>
-                <p>このタブには項目は一つのみです: システムがこの権限コネクション用に利用できる最大のコネクション数です。この制限は、システムが過負荷になったり、またある場合にはライセンスの制限を超えたりするのを防ぐのに使えます。逆に、値を大きくすると、スループットが上がります。デフォルト値は10ですが、権限コネクションのタイプすべてに対して最適というわけではないかもしれません。より正確な値については、以降の各種の権限コネクションタイプを説明している節を参照してください。
-                </p>
-                <p>各コネクションタイプに対応するタブの説明は、対象の権限コネクションタイプを説明している節を参照してください。</p>
-
-                <p>コネクションを保存すると、設定したコネクションの内容の要約画面が表示されます。(どのコネクションタイプを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-authority-connection_ja_JP.PNG" alt="権限コネクション" width="80%"/>
-                <br/><br/>
-                <p>要約画面にはコネクションの状態も表示されます。コネクションが正しく設定された場合は、状態は「Connection working」(正常)と表示されます。設定に間違いがある場合は、代わりにコネクションタイプに固有の診断メッセージが表示されます。そうなったら、インフラを修理するかコネクションの設定を適切に編集するかして、問題を修正してください。</p>
-                <p>下に「更新」、「編集」、「削除」の3つのボタンがあります。各ボタンの目的を順に詳しく説明します。</p>
-                <p>「更新」ボタンは、単に権限コネクションの画面をリロードして、コネクションの状態を更新します。権限コネクションが接続されている外部のシステムに変更を加え、その変更がコネクションが成功するか否かに影響する場合に、このボタンを使います。</p>
-                <p>「編集」ボタンを押すと、前に戻ってコネクションパラメータの編集ができます。コネクションの属性または仕様を変更したい場合にこのボタンを使います。</p>
-                <p>「削除」ボタンを押すと、コネクションが削除できます。利用可能な権限コネクションの一覧からコネクションを削除したい場合に、このボタンを使います。</p>
-            </section>
-
-            <section id="jobs">
-                <title>ジョブの作成</title>
-                <p>ManifoldCFの「ジョブ」とは、コンテンツの集まりを記述したものです。フレームワークのジョブは指定されたリポジトリコネクションからコンテンツを読込み、0個以上の変換コネクションを使って変換し、指定された出力コネクションに書込みます。ジョブの内容とコンテンツの索引作成方法は、関連するリポジトリコネクションに依存します。コンテンツの索引作成方法は、関連する出力コネクションや指定された変換コネクションにも依存します。</p>
-                <p>ジョブはすべて1回以上、実行されます。ジョブが実行される度に、新規のコンテンツ及び変更されたコンテンツを出力コネクションに送る他にも、対象外になったコンテンツに付いても出力コネクションに通知します。コンテンツは2つの方法で対象外になります: コンテンツがリポジトリから削除された場合、コンテンツがもはや許可されたコンテンツの集まりに含まれていない場合。フレームワークはこの両方の場合に対応しています。</p>
-                <p>ジョブを削除すると、そのジョブに関連したコンテンツすべてが削除されたことを出力コネクションに通知します。ジョブはそのジョブに関連したコンテンツを表していますので、この動作は道理にかなっています。ジョブが削除された場合に、関連したコンテンツも削除されないと、そのコンテンツに親がなくなってしまいます。(ManifoldCFのジョブはタスクにすぎないと決めてかかる人もいますが、間違った想定です。)</p>
-                <p>フレームワークでは複数のジョブで1つのコンテンツを読込むことができます。1つ以上のジョブに関連したコンテンツは以下のように特別に処理されます:</p>
-                <ul>
-                    <li>ジョブを削除すると、他ジョブの対象に含まれていないコンテンツの削除の通知が出力コネクションに送られます。</li>
-                    <li>出力コネクションに通知が送られるコンテンツのバージョンはどのジョブが最後に実行されるかによります。</li>
-                </ul>
-                <p>コンテンツが複数ジョブの対象の場合の処理は複雑なため、できる限りこのような状況は避けたほうがよいです。</p>
-                <p>ジョブの非継続的な実行は典型的には以下のようなステージで行なわれます:</p>
-                <ol>
-                    <li>ジョブの新規、変更、削除の開始点をキューに登録(「シーディング」)</li>
-                    <li>コンテンツを読込み、新コンテンツを発見、削除を検出</li>
-                    <li>キューから読込み対象外になったコンテンツを削除</li>
-                </ol>
-                <p>ジョブを「継続的」に走らせることもできます。継続的に走っているジョブは中断されるまで実行を継続します。継続ジョブは以下のようなステージで実行されます:</p>
-                <ol>
-                    <li>ジョブの新規、変更、削除の開始点をキューに登録(「シーディング」)</li>
-                    <li>定期的に再シーディングしている間、コンテンツを読込み、新コンテンツを発見、削除を検出。</li>
-                </ol>
-                <p>継続ジョブは除外コンテンツをキューから削除することは<b>できない</b>ことに注意してください。リポジトリから削除されたコンテンツをキューから外すことだけができます。</p>
-                <p>ジョブはユーザーが明示的に開始したときに即時に実行することも、ユーザーが指定したスケジュールで実行することも独立に設定できます。スケジュールで実行するよう設定した場合は、指定日時に開始することも、他ジョブが完了した後に実行するように設定することもできます。</p>
-                <p>ManifoldCFで並列実行可能なジョブ数に制限は設けられていません。</p>
-                <p>ジョブを作成する場合は、まず左メニューの「ジョブ一覧」リンクを選択します。次のような画面が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/list-jobs_ja_JP.PNG" alt="ジョブ一覧" width="80%"/>
-                <br/><br/>
-                <p>定義されたジョブを表示、編集、削除するには、対応するリンクを選択してください。定義したジョブを複製することもできます。新規にジョブを定義する場合は、下の「新しいジョブの追加」リンクを選択してください。次のページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-job-name_ja_JP.PNG" alt="新しいジョブの追加、名前タブ" width="80%"/>
-                <br/><br/>
-                <p>ジョブ名を入力してください。ジョブ名は一意である必要は<b>ありません</b>。ただし、一意にした方が分かりやすいので一意にする事を推奨します。入力した後に「コネクション」タブを選択してください:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-job-connection_ja_JP.PNG" alt="新しいジョブの追加、コネクションタブ" width="80%"/>
-                <br/><br/>
-                <p>続いて、リポジトリコネクション名を選択してください。ジョブ定義を保存すると、選択したコネクションを変更することができなくなりますので注意してください。</p>
-                <p>プルダウンの出力を選び、条件パイプラインステージを選び、「出力を追加ボタン」を押して、出力コネクションを1つもしくは複数、追加してください。ジョブ定義を保存すると、出力を削除することができなくなりますので注意してください。しかし、変換コネクションを追加したり削除したりするなど他の方法で、必要なときにはいつでもコンテンツ処理パイプラインを再構成することはできます。</p>
-                <p>変換コネクションを定義していなければ、パイプラインに変換コネクションを挿入することはできません。しかし、変換コネクションが定義してあり、コンテンツパイプラインに含めたいのであれば、変換コネクションプルダウンから選んで、説明を説明ボックスに書き、「前に変換を挿入」ボタンの1つをクリックしてコンテンツパイプラインに挿入します。</p>
-                <p>通知コネクションを定義していなければ、ジョブの終了時に通知を1つ以上追加することはできません。しかし、通知コネクションが定義してあり、含めたいのであれば、通知コネクションプルダウンから選んで、説明を説明ボックスに書き、「追加」ボタンをクリックして通知一覧に追加します。</p>
-                <p>ここでジョブの優先度及び開始方法を指定することができます。優先度とは、他ジョブと相対比較した場合にコンテンツを読み込む重要さです。高く設定された数値のジョブの方が最初に読み込まれます。開始方法とは先ほど説明したように、手動で開始、スケジュールされた日時に開始、他スケジュールされたジョブの後に開始です。</p>
-                <p>設定を指定した後に「次へ」ボタンを押下してください。その他のタブとページ下に「保存」ボタンが表示されます。ジョブを登録または更新する場合は<b>必ず</b>「保存」ボタンを押下してください。代わりに「キャンセル」ボタンを押せばコネクションは作成されません。(左に表示されるメニュー項目を選択しても同じことです。)</p>
-                <p>すべてのジョブには「スケジュール」タブがあります。スケジュールタブからは、スケジュール関連の設定を行なえます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-job-scheduling_ja_JP.PNG" alt="新しいジョブの追加、スケジュールタブ" width="80%"/>
-                <br/><br/>
-                <p>このタブでは、以下のパラメータの設定を行なえます:</p>
-                <ul>
-                    <li>ジョブを継続的に実行するか、各コンテンツを一回だけ読み込むか</li>
-                    <li>コンテンツが無効になるまでの時間。無効になると索引から削除されます</li>
-                    <li>コンテンツの更新を確認する最小間隔</li>
-                    <li>コンテンツの更新を確認する最大間隔</li>
-                    <li>初期コンテンツを再シーディングするまでの待ち時間</li>
-                </ul>
-                <br/>
-                <p>UIが示しているように、最後の4つのパラメータは継続実行の場合のみ有効です。</p>
-                <p>このページからスケジュール期間を定義することもできます。スケジュール期間とは、ジョブを実行することが可能な時間帯です。時間帯は開始日時(曜日、月、日、時、分)と最大実行時間(分)で指定します。各プルダウンメニューから複数の設定を選択された場合は、各プルダウンメニューで選択された設定の中の<b>一つ</b>と一致した日時にジョブは開始されます。</p>
-                <p>スケジュールを入力した後に、「スケジュールの追加」ボタンを押下してください:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/add-new-job-scheduling-with-record_ja_JP.PNG" alt="新しいジョブの追加、レコードありのスケジュールタブ" width="80%"/>
-                <br/><br/>
-                <p>画面例ではジョブを土曜日と日曜日夜、午前2時から最大4時間(午前6時まで)に実行するように定義しています。</p>
-                <p>この他のタブは選択されたコネクションタイプによって異なります。これらのタブの詳細に付いて、選択された出力コネクション及びリポジトリコネクションの章を参照してください。</p>
-                
-                <p>ジョブを保存すると、ジョブの設定の要約画面が表示されます。(どのコネクションを選んだかによって詳細は多少異なりますが)以下のようになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/view-job_ja_JP.PNG" alt="ジョブ情報" width="80%"/>
-                <br/><br/>
-                <p>下に「編集」、「削除」、「コピー」、「シーディングの再設定」の4つのボタンがあります。各ボタンの目的について順に述べます。</p>
-                <p>「編集」ボタンでは、戻ってジョブの詳細を編集できます。ジョブの詳細を変更したい場合にはこのボタンを使います。</p>
-                <p>「削除」ボタンでは、ジョブを削除できます。存在するジョブがもはや必要ない場合にこのボタンを使います。ManifoldCFでジョブを削除すると、そのジョブを使って索引を作成したコンテンツがすべて索引から削除されることに注意してください。</p>
-                <p>「コピー」ボタンでは、現在のジョブのコピーを編集できるようになります。大部分が現在のジョブの仕様に基づく新しいジョブを作成したい場合にこのボタンを使います。似たようなジョブを数多く作成する場合には便利でしょう。</p>
-                <p>「シーディングを再設定」ボタンでは、ManifoldCFからジョブのシーディングの履歴が消えます。シーディングとはコンテンツが追加されたり修正されたりしたことを発見した過程です。このボタンをクリックすると、ManifoldCFは次回のクロールでリポジトリ内のコンテンツをすべて確認するようになります。これは頻繁に行なうべきことではありません。ManifoldCFは自身でこの情報を適切に管理し、ジョブの詳細が変更された時には必ず同じことを自動的に行ないます。コンテンツをすべて再確認しないといけないような方法でコネクタソフトウェアを更新した場合に、このオプションを使ってください。</p>
-            </section>
-
-            <section id="executing">
-                <title>ジョブの実行</title>
-                <p>ジョブの実行状態を把握するには、左メニューから「状態とジョブ管理」リンクを選択してください。以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/job-status_ja_JP.PNG" alt="ジョブの状態" width="80%"/>
-                <br/><br/>
-                <p>ジョブの現在の状態を表示するにはページ下の「更新」ボタンを押下してください。一番左の状態列にあるリンクを使って、ジョブを直接制御できます。可能な処理には次のようなものがあります:</p>
-                <ul>
-                    <li>開始(ジョブを開始)</li>
-                    <li>最小限の開始(ジョブを開始しますが、できる限り作業を少なくします)</li>
-                    <li>中断(ジョブを中断)</li>
-                    <li>停止(ジョブを一時停止)</li>
-                    <li>再開(ジョブを再開)</li>
-                    <li>再実行(ジョブを中断して再度実行することと同じです)</li>
-                    <li>最小限の再実行(ジョブを中断して、できる限り作業を少なくして再度実行することと同じです)</li>
-                </ul>
-                <br/>
-                <p>ジョブのキューにあるコンテンツに関しては、列「コンテンツ」、「処理中」、「処理済み」は特別な意味があります。「コンテンツ」列はジョブに属しているコンテンツすべての数です。「処理中」列はそのジョブで処理を待っているコンテンツの数です。「処理済み」列はジョブのキューに入っていて、一回以上は処理されたコンテンツの数です。</p>
-                <p>列挙した処理のうち「最小限の」がついたものを使うと、そのジョブのコネクションタイプが使うモデルを仮定して最小限の作業量で動作します。ある場合には、これは追加や更新は索引が作られますが、削除は検出されないという意味になります。対象の索引とリポジトリのコンテンツを完全に同期するには、完全なジョブの実行が通常は必要です。</p>
-            </section>
-            <section id="statusreports">
-                <title>状態レポート</title>
-                <p>ManifoldCFのすべてのジョブはコンテンツ・セットに関連しています。セットに含まれるコンテンツの場所情報はジョブキューに保管されています。ManifoldCFのGUIページからこのキューを参照することができます。</p>
-                <p>各状態レポートから以下の情報でジョブキューのコンテンツを選択することができます:</p>
-                <ul>
-                    <li>ジョブ</li>
-                    <li>コンテンツID</li>
-                    <li>コンテンツの状態と状況</li>
-                    <li>コンテンツが次に処理されるスケジュール</li>
-                </ul>
-                <section id="documentstatus">
-                    <title>コンテンツ状態</title>
-                    <p>コンテンツ状態レポートは、指定した条件に一致したコンテンツとその状態、状況、予定されている処理の一覧を表示します。実行中のジョブがコンテンツを処理したか確認する場合などに使うことができます。</p>
-                    <p>左メニューから「コンテンツ状態」リンクを選択すると、以下のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/document-status-select-connection_ja_JP.PNG" alt="コンテンツ状態、コネクションの選択" width="80%"/>
-                    <br/><br/>
-                    <p>検索するコネクションを選択してください。コンテンツの状態、状況と、コンテンツIDをフィルタする正規表現を指定することもできます。「次へ」ボタンを押下すると以下のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/document-status-select-job_ja_JP.PNG" alt="コンテンツ状態、ジョブの選択" width="80%"/>
-                    <br/><br/>
-                    <p>右に表示されるドロップダウンリストから、ジョブを選択して、再び「次へ」ボタンを押下してください。以下のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/document-status-example_ja_JP.PNG" alt="コンテンツ状態、例" width="80%"/>
-                    <br/><br/>
-                    <p>条件を変更して「実行」ボタンを押下して表示するコンテンツ情報を変更することもできます。また、表示する結果数を変更して「実行」ボタンを押下して、1ページに表示するコンテンツ数を変更することもできます。1ページにすべての一致したコンテンツが表示できない場合は、「前へ」リンクと「次へ」リンクを押下した表示する内容を移動することができます。</p>
-                </section>
-                <section id="queuestatus">
-                    <title>キューの状態</title>
-                    <p>キューの状態レポートは、指定したclassに現れるコンテンツの回数を表示します。classは指定されたコンテンツIDに一致した正規表現のグループとして指定されます。結果はコンテンツの数として表示します。コンテンツの状態と状況の組み合わせ毎に列が設けられます。</p>
-                    <p>例えば、「()」クラスを指定した場合は状態/状況の組み合わせ毎を1行で表示します。「(.*)」クラスと指定した場合は、コンテンツID毎に行が設けられ、関連しているコンテンツの状態/状況の列に「1」が記入され、それ以外の列には「0」が記入されます。</p>
-                    <p>左メニューから「キューの状態」リンクを選択すると、以下のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/queue-status-select-connection_ja_JP.PNG" alt="キューの状態、コネクションの選択" width="80%"/>
-                    <br/><br/>
-                    <p>検索するコネクションを選択してください。コンテンツの状態、状況と、コンテンツIDをフィルタする正規表現を指定することもできます。コンテンツIDクラスはデフォルトでは「(.*)」です。必要に応じて変更してください。「次へ」ボタンを押下すると以下のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/queue-status-select-job_ja_JP.PNG" alt="キューの状態、ジョブの選択" width="80%"/>
-                    <br/><br/>
-                    <p>右の表示されるドロップダウンリストから、ジョブを選択して、再び「次へ」ボタンを押下してください。以下のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/queue-status-example_ja_JP.PNG" alt="キューの状態、例" width="80%"/>
-                    <br/><br/>
-                    <p>条件を変更して「実行」ボタンを押下して表示するコンテンツ情報を変更することもできます。また、表示する結果数を変更して「実行」ボタンを押下して、1ページに表示するコンテンツ数を変更することもできます。1ページにすべての一致したコンテンツが表示できない場合は、「前へ」リンクと「次へ」リンクを押下した表示する内容を移動することができます。</p>
-
-                </section>
-            </section>
-            <section id="historyreports">
-                <title>履歴レポート</title>
-                <p>ManifoldCFは、コネクション毎にそのコネクションで起こった処理の履歴を記録しています。この履歴には、ManifoldCF基盤が記録したイベントと、リポジトリコネクション及び出力コネクションのイベントが含まれます。イベントは「アクティビティタイプ」として分類されます。以下のようなアクティビティタイプがあります:</p>
-                <ul>
-                    <li>ジョブの開始</li>
-                    <li>ジョブの終了</li>
-                    <li>ジョブの中断</li>
-                    <li>複数のconnection-type-specific読み込み及びアクセス処理</li>
-                    <li>複数のconnection-type-specific出力及び索引作成処理</li>
-                </ul>
-                <p>どのようにコンテンツを処理しているのかや、正しく動作しているのかを確認する場合に履歴レポートを使うことができます。ManifoldCFには履歴データを元にした複数のレポートが用意されています。</p>
-                <p>履歴レポートすべては、表示する内容を絞ることができるようになっています。以下の項目で絞り込む条件を指定できます:</p>
-                <ul>
-                    <li>リポジトリコネクション名</li>
-                    <li>アクティビティタイプ(複数選択可)</li>
-                    <li>開始時刻</li>
-                    <li>終了時刻</li>
-                    <li>対象とするコンテンツのID(正規表現で指定)</li>
-                    <li>結果(正規表現で指定)</li>
-                </ul>
-                <p>レポートは処理問題や性能問題の原因を究明するのに使うことができます。各履歴レポートの詳細については以下の章を参照にしてください。</p>
-                <section id="simplehistory">
-                    <title>履歴レポート</title>
-                    <p>履歴レポートは、集計などは行わずに、条件に一致したリポジトリコネクションの履歴データを表示します。最新イベントから古い順に開始時間、終了時間、処理、ID、データ量(バイト)、結果などが表示されます。表示したレポートのイベント数を変えたり、指定した列順にソートしたり、ページを移動したりすることができます。</p>
-                    <p>左メニューから「履歴レポート」リンクを選択してください。次のようなページが表示されます:</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/simple-history-select-connection_ja_JP.PNG" alt="履歴レポート、コネクションの選択" width="80%"/>
-                    <br/><br/>
-                    <p>左上のプロダウンメニューからリポジトリコネクションを選択してください。開始と終了日付と時間、対象にするID及び結果コードを正規表現で指定することもできます。デフォルト設定では1時間前のすべてのイベントが選択されます。</p>
-                    <p>「次へ」ボタンを押下してください。右上のプルダウンメニューからアクティビティが表示されます。</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/simple-history-select-activities_ja_JP.PNG" alt="履歴レポート、アクティビティの選択" width="80%"/>
-                    <br/><br/>
-                    <p>プロダウンメニューから1つ以上のアクティビティを選択し、「実行」ボタンを押下してください。該当するイベントが最新イベント順に表示します</p>
-                    <br/><br/>
-                    <figure src="images/ja_JP/simple-history-example_ja_JP.PNG" alt="管理履歴レポート、例" width="80%"/>
-                    <br/><br/>
-                    <p>違う条件で検索する場合は、条件を変更して「実行」ボタンを再び押下してください。また、表示する結果数を変更して「実行」ボタンを押下して、1ページに表示するコンテンツ数を変更することもできます。1ページにすべての一致したコンテンツが表示できない場合は、「前へ」リンクと「次へ」リンクを押下した表示する内容を移動することができます。</p>
-                    <p>「実行」ボタンを押下すると、押された時間の条件での結果が表示されます。即ち、「実行」ボタンを押下した時点から1時間前までに起こったイベントが表示されます。ジョブが実行中の場合は、押す度に表示が変わる場合があります。</p>
-                </section>
-                <section id="maxactivity">
-                    <title>最大アクティビティレポート</title>
-                    <p>最大アクティビティレポートは、指定された時間帯に起こった最大のイベント発生率を表示します。(あとで追記)</p>
-                </section>
-                <section id="maxbandwidth">
-                    <title>最大帯域幅レポート</title>
-                    <p>最大帯域幅レポートは、指定された時間帯のイベントの最大バイト転送率を表示します。(あとで追記)</p>
-                </section>
-                <section id="resulthistogram">
-                    <title>結果ヒストグラムレポート</title>
-                    <p>結果ヒストグラムレポートは、指定したイベントに一致する各結果の数を表示します。</p>
-                </section>
-            </section>
-            
-            <section id="credentials">
-                <title>認証についての覚え書き</title>
-                <p>選択されたコネクションタイプに認証が必要な場合は、システム管理者から必要な情報を入手してください。システム管理者は必要以上に力のあるアカウントと認証を提供するのをしばしば渋り、ときには提供すらしません。各コネクションは、コンテンツを読み取るのに最低限に必要とする認証で動作するように多大な注意を払って設計されています。もしコネクションの状態にセキュリティに関しての警告が表示された場合は、コネクションがその作業を完了するのに認証の権限が不十分であることをシステム管理者に知らせて、協力して問題を修正して下さい。
-                </p>
-            </section>
-
-        </section>
-        
-        <section id="outputconnectiontypes">
-            <title>出力コネクションタイプ</title>
-
-            <section id="amazoncloudsearchoutputconnector">
-                <title>Amazon Cloud Search出力コネクション</title>
-                <p>Amazon Cloud Search出力コネクションタイプは指定されたAmazon Cloud Searchインスタンス内の特定パスにドキュメントを送ります。このコネクションタイプは出来る限りコストを適切なところまで下げるため、更にドキュメントを一括処理します。従って、一部ドキュメントは通常のインデックシング時ではなくジョブ実行の最後に送信される場合があります。</p>
-                <p>Amazon Cloud Search出力コネクションタイプのコネクション設定情報には追加の「サーバー」タブが含まれています:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/amazon-configure-server_ja_JP.png" alt="Amazon Output Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>コネクションが機能するためには「サーバー名」を必ず入力しなければなりません。</p>
-                <p>ジョブ定義時にAmazon Cloud Search出力コネクションタイプと関連するタブは提供されません。</p>
-                <p>Amazon Cloud Search出力コネクションタイプはUTF-8と互換性のあるテキストコンテンツのみアクセス可能です。Amazon Cloud Search出力コネクションタイプに先立って、パイプライン経由でTika Content Extractorを用いてドキュメントをインデックシング可能な形式に変換することをお薦めします。</p>
-            </section>
-
-            <section id="elasticsearchoutputconnector">
-            	<title>ElasticSearch出力コネクション</title>
-            	<p>ElasticSearch出力コネクションは、XML文書をHTTP APIを介してElasticSearchに送ります。このコネクタは、できるだけ簡単に利用できるように設計されています。</p>
-            	<p>ElasticSearch出力コネクションタイプを選択した後には、「引数」タブの項目をElasticSearchの設定に従って入力してください。各ElasticSearch出力コネクションは1つの索引と対応しています。一つ以上の索引を利用する場合は、索引毎に出力コネクションを作成してください。</p>
-            	<figure src="images/ja_JP/elasticsearch-connection-parameters_ja_JP.png" alt="ElasticSearch、引数タブ" width="80%"/>
-            	<br/>
-                <p>引数:</p>
-                <ul>
-                      <li>サーバアドレス:ElasticSearchインスタンスのURL。デフォルトURL(http://localhost:9200)はElasticSearchがManifoldCFと同じサーバで起動している場合のアドレスです。</li>
-                      <li>索引名:コネクタは指定された索引にデータを作成します。</li>
-            	</ul>
-            	<p>ジョブでElasticSearch出力コネクションを選択した場合は、「ElasticSearch」タブが表示されます。このタブから以下の設定を指定する事ができます:</p><br/>
-            	<ul>
-                      <li>対象とするコンテンツの最大サイズ(バイト)。デフォルトでは16MBです。</li>
-                      <li>対象とするMIMEタイプ。リポジトリコネクションによっては正しく処理されません。</li>
-                      <li>対象とするファイル拡張子。リポジトリコネクションによっては正しく処理されません。</li>
-            	</ul>
-            	<figure src="images/ja_JP/elasticsearch-job-parameters_ja_JP.png" alt="ElasticSearch, job parameters" width="80%"/>
-            	<p>すべてのアクティビティは履歴レポートから参照することができます。コネクタは3つのアクティビティに対応しています:コンテンツの読込み(索引の作成)、コンテンツの削除、索引の最適化。ジョブが終了すると索引は最適化されます。</p>
-            	<figure src="images/ja_JP/elasticsearch-history-report_ja_JP.png" alt="ElasticSearch, history report" width="80%"/>
-             	<p>ElasticSearchの詳細に付いては<a href="http://www.elasticsearch.org/guide">ElasticSearchユーザマニュアル</a>を参照してください。</p>
-            </section>
-
-            <section id="filesystemoutputconnector">
-                <title>ファイルシステム出力コネクション</title>
-                <p>ファイルシステム出力コネクションは、Unixユーティリティの<em>wget</em>のようにローカルファイルシステムに文書を保管することができます。このコネクションタイプによって格納されたドキュメントは、メタデータまたはセキュリティ情報を含んでいませんが、バイナリ·ファイルのみから構成されています。</p>
-                <p>ファイルシステム出力コネクションタイプの接続構成情報には追加のタブを含みません。しかしながら、付加的なJobタブがあり、「出力パス」と呼びます。タブはこのように見えます。</p>
-                <br/><br/>
-                <figure src="images/en_US/filesystem-job-output-path.PNG" alt="File System Specification, Output Path tab" width="80%"/>
-                <br/><br/>
-                <p>ドキュメントを出力したいパスを入力して、「保存」をクリックしてください。</p>
-            </section>
-
-            <section id="hdfsoutputconnector">
-                <title>HDFS出力コネクション</title>
-                <p>HDFS出力コネクションは、Unixユーティリティの<em>wget</em>のようにHDFS(Hadoop Distributed File System)に文書を保管することができます。このコネクションタイプによって格納されたドキュメントは、メタデータまたはセキュリティ情報を含んでいませんが、バイナリ·ファイルのみから構成されています。</p>
-                <p>HDFS出力コネクションタイプのための接続構成情報は「サーバー」タブという追加のタブを1つ含んでいます。このタブこのように見えます。</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-configure-server.PNG" alt="HDFS Output Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>HDFSネームノードのURIおよびHDFSユーザー名を書き入れてください。両方とも必要となります。</p>
-                <p>HDFS出力接続タイプについては、「出力パス」と呼ばれる付加的なJobタブがあります。このタブこのように見えます。</p>
-                <br/><br/>
-                <figure src="images/en_US/hdfs-job-output-path.PNG" alt="HDFS Output Specification, Output Path tab" width="80%"/>
-                <br/><br/>
-                <p>ドキュメントを出力したいパスを入力して、「保存」をクリックしてください。</p>
-            </section>
-
-            
-            <section id="gtsoutputconnector">
-                <title>MetaCarta GTS出力コネクション</title>
-                <p>MetaCarta GTS出力コネクションタイプはHTTP APIを介してMetaCarta GTS検索エンジンにコンテンツを送ります。</p>
-                <p>GTSはHTML,XML,RTF、PDF,マイクロソフトオフィス文書のみ処理することができます。他型の文書から索引を作成することはできません。その制限により、大きな対象外のコンテンツは取得されません。</p>
-                <p>ジョブでGTSタイプ出力コネクションを選択すると、2つのタブが表示されます:「コレクション」と「コンテンツ・テンプレート」。この2つのタブからGTS特定機能を設定を行うことができます。</p>
-            </section>
-
-            <section id="nulloutputconnector">
-                <title>Null出力コネクション</title>
-                <p>null出力コネクションは、主にリポジトリコネクションタイプを開発する技術者向けに用意されています。実運用で使うことは少ないと思います。</p>
-                <p>Null出力コネクションタイプは索引及び削除リクエストをログするだけです。その他の処理は行いません。Null出力コネクション固有のタブはありません。</p>
-            </section>
-
-            <section id="opensearchserveroutputconnector">
-            	<title>OpenSearchServer出力コネクション</title>
-            	<p>OpenSearchServer出力コネクションは、XML文書をHTTP APIを介してOpenSearchServerに送ります。このコネクタは、できるだけ簡単に利用できるように設計されています。</p>
-            	<p>OpenSearchServer出力コネクションタイプを選択した後には、「引数」タブの項目をOpenSearchServerの設定に従って入力してください。各OpenSearchServer出力コネクションは1つの索引と対応しています。一つ以上の索引を利用する場合は、索引毎に出力コネクションを作成してください。</p>
-            	<figure src="images/ja_JP/opensearchserver-connection-parameters_ja_JP.PNG" alt="OpenSearchServer, parameters tab" width="80%"/>
-            	<p>引数:</p><br/>
-            	<ul>
-            		<li>サーバアドレス:OpenSearchServerインスタンスのURL。デフォルトURL(http://localhost:8080)はOpenSearchServerがManifoldCFと同じサーバで起動している場合のアドレスです。</li>
-            		<li>索引名:コネクタは指定された索引にデータを作成します。</li>
-            		<li>ユーザ名とAPIキー:OpenSearchServerインスタンスに接続するためのユーザ認証情報。ユーザが作成されていない場合は、空白にしてください。次の画像はOpenSearchServerで、認証情報が記載されている画面です。</li>
-            	</ul>
-            	<figure src="images/ja_JP/opensearchserver-user_ja_JP.PNG" alt="OpenSearchServer, user configuration" width="80%"/>
-            	<p>ジョブでOpenSearchServer出力コネクションを選択した場合は、「OpenSearchServer」タブが表示されます。このタブから以下の設定を指定する事ができます:</p><br/>
-            	<ul>
-            		<li>対象とするコンテンツの最大サイズ(バイト)。デフォルトでは16MBです。</li>
-            		<li>対象とするMIMEタイプ。リポジトリコネクションによっては正しく処理されません。</li>
-            		<li>対象とするファイル拡張子。リポジトリコネクションによっては正しく処理されません。</li>
-            	</ul>
-            	<figure src="images/ja_JP/opensearchserver-job-parameters_ja_JP.PNG" alt="OpenSearchServer, job parameters" width="80%"/>
-            	<p>すべてのアクティビティは履歴レポートから参照することができます。コネクタは3つのアクティビティに対応しています:コンテンツの読込み(索引の作成)、コンテンツの削除、索引の最適化。ジョブが終了すると索引は最適化されます。</p>
-            	<figure src="images/ja_JP/opensearchserver-history-report_ja_JP.PNG" alt="OpenSearchServer, history report" width="80%"/>
-             	<p>OpenSearchServerの詳細に付いては<a href="http://www.open-search-server.com/documentation">OpenSearchServerユーザマニュアル</a>を参照してください。</p>
-            </section>
-
-            <section id="solroutputconnector">
-                <title>Solr出力コネクション</title>
-                <p>Solr出力コネクションタイプは、Solr HTTP APIを介してSolrにコンテンツを送ります。コネクションはSolrのデフォルト値にデフォルトで設定されます。Solrコネクションは索引可否に関係なく、すべてのコンテンツを処理します。設定されたパイプラインがコンテンツを利用するか判断するはずです。</p>
-                <p>ただし、すべてのコンテンツが送られるため映像のような大きなファイルもフィルタを設定しないと送られてしまい、システムに大きな負荷を掛けてしまいます。不足/間違っている設定を発見してこのような問題を回避するために、Solrコネクションのすべてのクロール結果をレビューすることを推奨します。</p>
-                <p>Solr出力コネクションを選択すると、5つのタブが表示されます。「サーバ」タブからHTTPターゲットを指定することができます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/solr-configure-server_ja_JP.PNG" alt="Solr Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>Solrの設定を入力してください。現リリースではベーシック認証のみ対応しています。下の部分にユーザ/パスワードを入力してください。</p>
-                <p>「スキーマ」タブからドキュメントIDに使うSolr項目を指定することができます。Solrコネクションはこの項目をコンテンツを検索するキーとして使います。</p>
-                <br/><br/>
-                <figure src="images/ja_JP/solr-configure-schema_ja_JP.PNG" alt="Solr Configuration, Schema tab" width="80%"/>
-                <br/><br/>
-                <p>「引数」タブからはSolrに送る任意の引数を指定することができます。Solrの更新リクエストに利用できる任意の引数を利用することができます。
-たとえば、Solrのドキュメントを処理するために使われるパイプライン/チェイン:update.chain=myChainを追加することができます。その他に指定可能な引数に付いてはSolrのマニュアルを参照してください。タブは以下のように表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/solr-configure-arguments_ja_JP.PNG" alt="Solr Configuration, Arguments tab" width="80%"/>
-                <br/><br/>
-                <p>引数名と値を入力して、「追加」ボタンを押下してください。名前が既に存在する場合は、既存の値は新しく指定した値で置き換わります。引数を削除する場合は、削除する引数の左に表示されている「削除」ボタンを押下してください。</p>
-                <p>4番目のタブは"コンテンツ"タブです。これはドキュメントのサイズやMIMEタイプに基づいてフィルタリングを行うことができます。ドキュメントのバイト単位の最大長を指定することによって、そのサイズ(例えば10485760は10MBと同じです)を超えたドキュメントを除外することができます。特定のMIMEタイプのドキュメントだけを追加したい場合は、"含むMIMEタイプ"フィールドにそれらを入力することができます(例えばHTML以外のドキュメントを除外するなら"text/html"と登録します)。"除外するMIMEタイプ"フィールドは、特定のMIMEタイプのドキュメントを除外するためのものです(例えばJPEG画像を除外するなら"image/jpeg"と登録します)。タブは以下のように表示されます:</p>
-                <figure src="images/ja_JP/solr-configure-documents_ja_JP.PNG" alt="Solr Configuration, Documents tab" width="80%"/>
-                <br/><br/>
-                <p>5番目のタブは"コミット"タブです。これはコミットの動作を制御することができます。すべてのジョブの終了時にドキュメントをコミットするようデフォルトで有効になっています。また、ミリ秒単位で一定時間内に各ドキュメントをコミットすることができます(10秒以内にコミットなら"10000"と登録します)。<a href="http://wiki.apache.org/solr/CommitWithin">commit within</a>の挙動はManifoldCFでなくSolrに委ねられています。タブは以下のように表示されます:</p>
-                <figure src="images/ja_JP/solr-configure-commits_ja_JP.PNG" alt="Solr Configuration, Documents tab" width="80%"/>
-                <br/><br/>
-                <p>設定の入力を完了した場合は、「保存」ボタンを押下してください。次のような入力した設定一覧が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/solr-status_ja_JP.PNG" alt="Solr Status" width="80%"/>
-                <br/><br/>
-                <p>画面例では、Solrコネクションは正常に動作していないため、エラーメッセージが表示されています。</p>
-            </section>
-
-
-        </section>
-
-        <section id="mappingconnectiontypes">
-            <title>ユーザーマッピングコネクションタイプ</title>
-            
-            <section id="regexpmapper">
-                <title>正規表現ユーザーマッピングコネクション</title>
-                <p>正規表現ユーザーマッピングコネクションタイプは、あらゆる種類のユーザー名の機械的な変換に大変便利です。例えば、Active Directoryのユーザー名の標準的な"user@domain"形式からLiveLinkの"domain\user"に変換するように簡単に設定できます。多くのリポジトリでそのような機械的な変換が確立されていますので、正規表現ユーザーマッピングコネクションタイプだけでたいていの用は足ります。</p>
-                <br/>
-                <p>正規表現ユーザーマッピングコネクションタイプを選択すると「ユーザーマッピング」タブが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/regexp-mapping-user-mapping_ja_JP.PNG" alt="正規表現ユーザーマッピング、ユーザーマッピングタブ" width="80%"/>
-                <br/><br/>
-                <p>マッピングは一致する正規表現と置換文字列で構成されます。一致する正規表現は関心のある部分を括弧(「(」と「)」)で括った正規表現のことです。括弧で括られた部分は正規表現の言葉で「グループ」と呼ばれます。置換文字列は固定文字と一致するグループの参照(変更されているかもしれません)から構成されます。例えば、「$(1)」は1番目に一致したグループを参照し、「$(1l)」は小文字に変換された1番目に一致するグループを参照します。同様に、「$(1u)」は同じ文字を参照しますが、大文字に変換されます。</p>
-                <p>例えば、一致正規表現<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>と置換文字列<code>$(2)\$(1l)</code>はActive Directoryユーザー名<code>MyUserName@subdomain.domain.com</code>をユーザー名<code>subdomain\myusername</code>に変換します。</p>
-                <p>入力後に「保存」ボタンを押すと、次のようなコネクションの概要と状態のページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/regexp-mapping-status_ja_JP.PNG" alt="正規表現ユーザーマッピング状態" width="80%"/>
-                <br/><br/>
-            </section>
-        </section>
-
-        <section id="authorityconnectiontypes">
-            <title>権限コネクションタイプ</title>
-            
-            <section id="adauthority">
-                <title>Active Directory権限コネクション</title>
-                <p>Active Directory権限コネクションは、MS Windows共有ディレクトリ、(ActiveDirectoryモードでの)MS SharePoint、IBM FileNetリポジトリのファイル権限を有効に利用する場合に使います。Active Directory権限コネクションタイプを利用する場合は、Windowsドメインコントローラにログインして他ユーザIDとグループ関係を参照できる認証情報を設定する必要があります。</p>まだ以下のような場合では利用制限がありますが、一般的なWindowsセキュリティアーキテクチャを利用する場合に使うことができます:
-                <br/>
-                <p>Active Directory権限コネクションタイプは編集画面に独自タブが2つあります。「ドメインコントローラ」と「キャッシュ」です。「ドメインコントローラ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/ad-configure-dc_ja_JP.PNG" alt="AD設定、ドメインコントローラタブ" width="80%"/>
-                <br/><br/>
-                <p>見ての通り、Active Directory権限では、異なってはいるがおそらく関連するドメインコントローラに対して複数のコネクションを設定できます。どのドメインコントローラにアクセスするかは、設定されたドメインコントローラの一覧を上から下まで見て、指定されたドメインサフィックスフィールドが最初に一致するものを選びます。ドメインサフィックスを空にすると<strong>すべての</strong>ユーザに一致すること注意してください。</p>
-                <p>一覧の最後にドメインコントローラを追加するには、必要な項目を入力してください。普通は「管理者ユーザ名」にはドメインを入力する必要はありませんが、ドメインコントローラの構成によっては「ユーザ名@ドメイン」形式で記入する必要があります。入力し終わったら「最後に追加する」ボタンを押して、一覧の最後にドメインコントローラを追加してください。後で、他のドメインコントローラが一覧にあれば、適切な所にある別のボタンを押してドメインコントローラを好きな所に挿入できます。</p>
-                <p>Active Directory権限コネクションタイプには個々のユーザの応答のキャッシュを制御するための「キャッシュ」タブもあります。</p>
-                <br/><br/>
-                <figure src="images/ja_JP/ad-configure-cache_ja_JP.PNG" alt="AD設定、キャッシュタブ" width="80%"/>
-                <br/><br/>
-                <p>ここではどれだけ多くの個々のユーザをどのくらい長くキャッシュするかを制御できます</p>
-                <p>入力した後に「保存」ボタンを押下すると、次のような設定概要と状態ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/ad-status_ja_JP.PNG" alt="AD状態" width="80%"/>
-                <br/><br/>
-                <p>画面ではActive Directoryと接続できないため、"Connection working"の代わりにエラーメッセージが表示されています。</p>
-            </section>
-            
-            <section id="ldapauthority">
-                <title>LDAP権限コネクション</title>
-                <p>LDAP権限コネクションは、ネイティブなドキュメントセキュリティモデルがない状況でドキュメントセキュリティを提供するために使うことができます。例としては、Samba共有やWikiページやRSSフィード等が含まれます。</p>
-                <p>LDAP権限はLDAPサーバーからユーザーまたはグループ名をアクセストークンとして供給することで動作します。これらのアクセストークンは、ジョブごとに入力されたアクセストークンを供給するリポジトリコネクション、またはSamba共有用の、明示的なユーザ/グループ名をサポートしているJCIFSコネクションタイプで使うことができます。</p>
-                <p>このコネクションタイプは適切なLDAPサーバーにログインするための情報を入力する必要があります。サーチ表現もまたユーザやグループのレコードを検索するために必要です。この権限コネクションタイプはひとつの特殊なタブがあります。LDAPタブです:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/ldap-configure-ldap.PNG" alt="LDAP Configuration, LDAP tab" width="80%"/>
-                <br/><br/>
-                <p>求められる値を入力してください。サーバーベースフィールドは検索したいLDAPドメインを含むことに注意してください。たとえばドメインがpeople.myorg.comならば、サーバーベースはdc=com,dc=myorg,dc=peopleとなります。</p>
-                <p>終わったらセーブボタンをクリックします。コネクションのサマリとステータスが表示されます。それは次のようなものになります:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/ldap-status.PNG" alt="LDAP Status" width="80%"/>
-                <br/><br/>
-                <p>注意点ですが、このサンプルではLDAPコネクションは応答していません。"Connection working"の代わりにエラーステータスのメッセージを表示しています。</p>
-            </section>
-
-            <section id="livelinkauthority">
-                <title>OpenText LiveLink権限コネクション</title>
-                <p>LiveLink権限コネクションは、LiveLinkリポジトリからコンテンツを取得する場合のセキュリティを指定する場合に利用します。</p>
-                <p>利用する場合はLiveLinkサーバ、ユーザのACLを取得できるユーザ認証情報を指定する必要があります。LiveLinkは独自でユーザ管理を行います。マッピングルールを定義または正規表現を利用してActive DirectoryとLiveLinkユーザと対応付けることもできます。</p>
-                <p>LiveLink権限コネクションを選択すると2つのタブが表示されます:「サーバ」タブと「ユーザマップ」タブ。</p>
-                <p>「サーバ」タグを選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-authority-server_ja_JP.PNG" alt="LiveLink Authority, Server tab" width="80%"/>
-                <br/><br/>
-                <p>LiveLinkeサーバ、ポート、認証情報を入力してください。</p>
-                <p>「ユーザマップ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-authority-user-mapping_ja_JP.PNG" alt="LiveLink Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>「ユーザマップ」タブから、ユーザ名及びドメイン(通常はActive Directoryから)からの情報をLiveLinkに対応付けることができます。対応は正規表現で定義します。変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、一致条件<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>と置き換え文字列<code>$(2)\$(1l)</code>はActive Directoryユーザ名を<code>MyUserName@subdomain.domain.com</code>をLiveLinkユーザ名<code>subdomain\myusername</code>に対応付けます。</p>
-                <p>対応情報を入力した後に「保存」ボタンを押下すると、次のような概要及び状態情報が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-authority-status_ja_JP.PNG" alt="LiveLink Authority Status" width="80%"/>
-                <br/><br/>
-                <p>内容を確認してください。ページ例では、LiveLinkサーバに接続できないためエラーメッセージが表示されています。</p>
-            </section>
-            
-            <section id="documentumauthority">
-                <title>EMC Documentum権限コネクション</title>
-                <p>Documentum権限コネクションは、Documentumリポジトリからコンテンツを取得する場合のセキュリティを指定する場合に利用します。</p>
-                <p>利用する場合は、Documentumコンテンツサーバの情報とユーザのACL情報を取得できる認証情報を指定する必要があります。
-ユーザ一覧毎に自動生成したACLを含むかも指定することができます。自動ACLはフォルダオブジェクト毎に生成されます。フォルダが多い場合は、ACLが多くなりユーザに戻されるManifoldCFアクセストークンが多くなり、性能を劣化させます。なお、多くの場合はDocumentumはこのACLを利用しません。そのため、多くの場合は、このACLを無視するように設定しても問題はありません。</p>
-                <p>Documentum権限コネクションを選択すると3つのタブが表示されます:「Docbase」、「ユーザマップ」、「システムACL」。</p>
-                <p>「Docbase」タブを選択すると、次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-authority-docbase_ja_JP.PNG" alt="Documentum Authority, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>コンテンツサーバdocbase名と認証情報を入力してください。コンテンツサーバでActive Directoryが有効に設定されていない場合は、項目「ドメイン」は空白にしてください。</p>
-                <p>「ユーザマップ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-authority-user-mapping_ja_JP.PNG" alt="Documentum Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>入力するユーザ名とコンテンツサーバユーザ名を対応付ける場合に大文字/小文字を区別するかを指定します。その他の対応は未対応です。多くの場合は、DocumentumインスタンスはActive Directoryと連動して、Documentumユーザ名はActive Directoryのユーザ名と同じ、またはActive Directoryユーザ名はただ小文字にされています。詳細に付いては、Documentumシステム管理者ガイドを参照してください。</p>
-                <p>「システムACL」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-authority-system-acls_ja_JP.PNG" alt="Documentum Authority, System ACLs tab" width="80%"/>
-                <br/><br/>
-                <p>自動生成されたACLを無視するように指定することができます。まず無視するように設定して、必要であれば有効にすることを推奨します。Documentumシステム管理者に連絡して正しい設定を聞いてください。</p>
-                <p>入力した後に「保存」ボタンを押下すると、次のような概要及び状態情報が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-authority-status_ja_JP.PNG" alt="Documentum Authority Status" width="80%"/>
-                <br/><br/>
-                <p>状態を確認して、必要であれば設定内容を修正してください。</p>
-            </section>
-            
-            <section id="memexauthority">
-                <title>Memex Patriarch権限コネクション</title>
-                <p>Memex権限コネクションは、Memexリポジトリからコンテンツを取得する場合のセキュリティを指定する場合に利用します。</p>
-                <p>接続するMemexサーバとユーザマッピング情報、Memexサーバからユーザ権限情報を取得するためのユーザの認証情報を指定することが必要です。</p>
-                <p>Memex権限コネクションを選択すると、次の2つのタブが表示されます:「Memexサーバ」、「ユーザマップ」。「Memexサーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/memex-authority-memex-server_ja_JP.PNG" alt="Memex Authority, Memex Server tab" width="80%"/>
-                <br/><br/>
-                <p>Memexサーバ、ポート、Memexユーザ情報を取得できるユーザの認証情報を入力してください。また、Memexサーバも文字エンコーディングを選択してください。文字エンコーディングが不明な場合は、Memexシステム管理者に問い合わせてください。</p>
-                <p>「ユーザマッピング」タブを選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/memex-authority-user-mapping_ja_JP.PNG" alt="Memex Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>「ユーザマップ」タブから、ユーザ名及びドメイン(通常はActive Directoryから)からの情報をMemexに対応付けることができます。対応は正規表現で定義します
-変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、一致条件<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>と置き換え文字列<code>$(2)\$(1l)</code>はActive Directoryユーザ名を<code>MyUserName@subdomain.domain.com</code>をMemexユーザ名<code>subdomain\myusername</code>に対応付けます</p>
-                <p>対応情報を入力した後に「保存」ボタンを押下すると、次のような概要及び状態情報が表示されます</p>
-                <br/><br/>
-                <figure src="images/ja_JP/memex-authority-status_ja_JP.PNG" alt="Memex Authority Status" width="80%"/>
-                <br/><br/>
-                <p>内容を確認してください。ページ例では、Memexサーバに接続できないためエラーメッセージが表示されています。</p>
-            </section>
-            
-            <section id="meridioauthority">
-                <title>Autonomy Meridio権限コネクション</title>
-                <p>Meridio権限コネクションは、Meridioリポジトリからコンテンツを取得する場合のセキュリティを指定する場合に利用します。</p>
-                <p>接続するドキュメントサーバ、レコードサーバ、ユーザサービスの情報を指定してください。ユーザのACL情報を取得するために利用するMeridioユーザの認証情報も必要です。</p>
-                <p>ユーザサービスはMeridio Authorityの一部です。Meridio Authorityを利用する場合は、Meridioシステムにインストールしてください。
-不明な場合は、Meridioサーバ管理者に問い合わせてください。</p>
-                <p>Meridio権限コネクションを選択すると4つのタブが表示されます:「ドキュメントサーバ」、「レコードサーバ」、「ユーザサービスサーバ」、「認証」。「ドキュメントサーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-authority-document-server_ja_JP.PNG" alt="Meridio Authority, Document Server tab" width="80%"/>
-                <br/><br/>
-                <p>プロトコル、サーバ名、ポート、Meridioドキュメントサーバサービスのアドレスを入力してください。プロキシを利用している場合は、プロキシホストとポート番号も入力してください。認証プロキシは現リリースでは未対応です。</p>
-                <p>Meridioシステムの場合は異なるサービス毎にサーバを設けることができますが、一般には複数のサービスが同じサーバで動作しています。ただし、コネクションタイプ設定からは異なるサーバを指定することもできます。</p>
-                <p>「レコードサーバ」タブを選択すると、次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-authority-records-server_ja_JP.PNG" alt="Meridio Authority, Records Server tab" width="80%"/>
-                <br/><br/>
-                <p>プロトコル、サーバ名、ポート番号、Meridioレコードサーバサービスのアドレスを入力してください。プロキシを利用している場合は、プロキシホストとポート番号も入力してください。認証プロキシは現リリースでは未対応です。</p>
-                <p>Meridioシステムの場合は異なるサービス毎にサーバを設けることができますが、一般には複数のサービスが同じサーバで動作しています。ただし、コネクションタイプ設定からは異なるサーバを指定することもできます。</p>
-                <p>「ユーザサービスサーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-authority-user-service-server_ja_JP.PNG" alt="Meridio Authority, User Service Server tab" width="80%"/>
-                <br/><br/>
-                <p>ページ内容を記入するには、Meridio Authorith extensionのインストール先を知る必要があります。</p>
-                <p>プロトコル、サーバ名、ポート番号、Meridioユーザサービスサーバサービスのアドレスを入力してください。プロキシを利用している場合は、プロキシホストとポート番号も入力してください。認証プロキシは現リリースでは未対応です。</p>
-                <p>Meridioシステムの場合は異なるサービス毎にサーバを設けることができますが、一般には複数のサービスが同じサーバで動作しています。ただし、コネクションタイプ設定からは異なるサーバを指定することもできます。</p>
-                <p>「認証」タブを選択すると、以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-authority-credentials_ja_JP.PNG" alt="Meridio Authority, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Meridioシステム用ユーザの認証情報を入力してください。</p>
-                <p>入力したら、「保存」ボタンを押下してください。次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-authority-status_ja_JP.PNG" alt="Meridio Authority Status" width="80%"/>
-                <br/><br/>
-                <p>表示されている画面ではMeridio権限サーバがWindowsドメインに接続できないためエラーになっています。</p>
-                <p>MeridioはWindows IISの認証機能を利用します。IIS及びWindowsドメインが正しく設定されていない場合は、Meridioも正常に動作しない場合があります。問題が発生した場合は、Meridio担当技術者に問い合わせてください。また、以下のようなデバッグツールを使うこともできます:</p>
-                <br/>
-                <ul>
-                    <li>Windowsセキュリティイベントログ</li>
-                    <li>ManifoldCFログ(以下の参照)</li>
-                    <li>パケットキャプチャ(例:WireShark)</li>
-                </ul>
-                <br/>
-                <p>特定のManifoldCFログ情報が必要な場合は、ManifoldCF担当者に連絡してください。</p>
-            </section>
-            
-            <section id="cmisauthority">
-              <title>CMIS権限コネクション</title>
-              <p>CMIS権限コネクションは、CMISリポジトリから取得する場合のセキュリティを指定する場合に利用します。</p>
-              <p>CMIS仕様で特定のコンテンツに関しての権限設定をできるようになっている場合は、正規表現で指定することができます。</p>
-              <p>CMIS権限コネクションを選択すると、次の2つのタブが表示されます:「リポジトリ」、「ユーザマップ」。「リポジトリ」タブを選択すると次のようなページが表示されます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-authority-connection-configuration-repository_ja_JP.PNG" alt="CMIS Authority, Repository configuration" width="80%"/>
-              <br/><br/>
-              <p>リポジトリ設定は特定のCMISリポジトリのIDを追跡するためだけに使われます。CMISリポジトリを検索しません。</p>
-              <br/><br/>
-              <p>「ユーザマップ」タブからユーザの対応付けを指定することができます。</p>
-              <p>「ユーザマップ」タブを選択すると次のようなページが表示されます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-authority-connection-configuration-usermapping_ja_JP.PNG" alt="CMIS Authority, User Mapping configuration" width="80%"/>
-              <br/><br/>
-              <p>「ユーザマップ」タブから、ユーザ名及びドメイン(通常はActive Directoryから)からの情報をCMISに対応付けることができます。対応は正規表現で定義します。
-変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、一致条件<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>と置き換え文字列<code>$(2)\$(1l)</code>はActive Directoryユーザ名を<code>MyUserName@subdomain.domain.com</code>をCMISユーザ名<code>subdomain\myusername</code>に対応付けます。</p>
-              <p>対応情報を入力した後に「保存」ボタンを押下すると、次のような概要及び状態情報が表示されます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-authority-connection-configuration-save_ja_JP.PNG" alt="CMIS Authority, saving configuration" width="80%"/>
-              <br/><br/>
-            </section>
-            
-        </section>
-        
-        <section id="repositoryconnectiontypes">
-            <title>リポジトリコネクションタイプ</title>
-
-            <section id="filesystemrepository">
-                <title>汎用ファイルシステムリポジトリコネクション</title>
-                <p>汎用ファイルシステムリポジトリコネクションタイプは主に例題、デモ、テストツールのために開発されました。ManifoldCFがインストールされているサーバのローカルファイルの索引を作成します。ただし、権限設定を行うことはできません。</p>
-                <p>ファイルシステムリポジトリコネクションタイプ固有のタブはありません。ただし、性能のために「スロットルリング」タブの「最大接続/JVM」値をワーカスレッド毎に最低でも1つ、または30に設定してください。</p>
-                <p>ジョブ定義でファイルシステムタイプリポジトリコネクションを選ぶと標準のものに加えて次の2つのタブが現れます。「ホップフィルタ」タブと「パス」タブです。</p>
-                <p>「ホップフィルタ」タブからは、ファイルを取得するサブディレクトリの深さ指定することがでます。ファイルシステムの場合は、使われる場合は少ないかも知れませんが、この設定はWebコネクションタイプでも指定できます。ファイルシステムでこの設定の動作を確認することができます。</p>
-                <br/><br/>
-                <figure src="images/ja_JP/filesystem-job-hopcount_ja_JP.PNG" alt="File System Connection, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>ファイルシステムコネクションタイプの場合は、コンテンツ間の関係は「子」の一つに限られています。コンテンツを取得するサブディレクトリのルートディレクトリからの深さを指定することが出来ます。空白の場合は、フィルタは無効と見なされます。</p>
-                <p>同じページから、コンテンツが存在するサブディレクトリの深さが変わった場合の処理を指定することができます。「読込めないコンテンツを削除」を選択すると、変更が発見されると、関係する可能性がすべてのコンテンツの深さを再計算します。再計算するとサーバに負荷が掛かります。再計算を行わないようにする場合は、一時的に行わないようにする設定と、永久に行わない設定があります。永久に行わないを選択すると、情報を削除します。</p>
-                <p>「パス」タブを選択すると、以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/filesystem-job-paths_ja_JP.PNG" alt="File System Connection, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>このページからコンテンツを読込むパスを指定することができます。パスを入力して「追加」ボタンを押下するとパスが一覧に追加されます。パスの指定はManifoldCFが動作しているOSの形式で入力してください。</p>
-                <p>ルートパス毎に、コンテンツがジョブに含まれているかを判断するルールがあります。ルートパスを一覧に追加後にルールを定義することができます。ルール毎に、一致条件式、ファイルまたはディレクトリを対象にするかのフラグ、一致した場合にコンテンツを含むか除外するかを指定することができます。ルールは上から下に評価されます。最初にファイル名に一致したルールが適用されます。ルールを追加するには、プルダウンからタイプを選択して、一致する条件を入力してください(例:*.txt)。入力後に「追加」ボタンを押下してください。</p>
-            </section>
-            
-
-            <section id="rssrepository">
-                <title>汎用RSSリポジトリコネクション</title>
-                <p>RSSコネクションタイプは、RSSフィードから索引を作成する場合に使います。Webコネクションタイプを利用してRSSフィードから索引を作成することもできますが、RSSコネクションタイプは以下の機能があります:</p>
-                <br/>
-                <ul>
-                    <li>フィード<b>のみ</b>からリンクを抽出する</li>
-                    <li>フィード本体からは索引を作成しない</li>
-                    <li>フィードを再取得する条件を細かく指定することができる。また、通常のコンテンツとは異なる方法で処理される</li>
-                    <li>RSSコネクションタイプは特定のデータをメタデータとしてフィードからコンテンツに関連付ける</li>
-                </ul>
-                <br/>
-                <p>多くの場合、RSSコネクションタイプを利用するジョブは、継続的に実行され、コンテンツを再読込みしないように設定し、30日後にコンテンツを無効にします。この設定はニュースのRSSフィードから索引を作成する場合によく使われます。</p>
-                <p>RSSコネクションには4つの固有タグがあります:「メール」、「ロボット」、「バンド幅」、「プロキシ」。「メール」タブを選択すると以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-configure-email_ja_JP.PNG" alt="RSS Connection, Email tab" width="80%"/>
-                <br/><br/>
-                <p>メールアドレスを入力して下さい。入力されたメールアドレスは、RSSコネクションのすべてのリクエストに含まれ、サーバ管理者が見ることができます。もし、スロットリング設定が大きすぎる場合でサーバ負荷が大きすぎる場合は、サーバ管理者からこのメールアドレスに連絡がされる可能性があります。</p>
-                <p>この項目は必須です。RSSコネクションはメールアドレスは妥当性を検証しませんが、ウェブ住民として正しいアドレスを入力してください。なお、サーバ管理者は「悪い」リクエストを拒否するように設定を変えることができますので、相手側サーバのことも考えてスロットリング設定を行ってください。</p>
-                <p>「ロボット」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-configure-robots_ja_JP.PNG" alt="RSS Connection, Robots tab" width="80%"/>
-                <br/><br/>
-                <p>robots.txtをどのように処理するかをプルダウンリストから選択してください。相手側サーバのことを考慮して選択してください。</p>
-                <p>「バンド幅」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-configure-bandwidth_ja_JP.PNG" alt="RSS Connection, Bandwidth tab" width="80%"/>
-                <br/><br/>
-                <p>サーバ毎に、コネクションがデータを取得する<b>最大</b>転送率及びサーバ毎に1分毎の<b>最大</b>転送率を設定できます。サーバ毎の最大ソケットコネクション数も指定できます。</p>
-                <p>ページの設定例の値は<b>親切</b>な設定になっています。デフォルトではすべての設定が空白ですので注意してください。このデフォルト設定では、スロットリングがされず、サーバに負荷を掛け、迷惑を掛けます。</p>
-                <p>「スロットリンググループ」は、複数のRSSタイプコネクションのスロットリング設定を1つに纏めるための設定です。スロットリンググループ名が同じRSSタイプコネクションは同じスロットリングプールに纏められます。</p>
-                <p>「バンド幅」タブは「スロットリング」タブは次のように違います:</p>
-                <br/>
-                <ul>
-                    <li>「バンド幅」タブからは<b>最大</b>値を設定できます。「スロットリング」タブからは<b>平均</b>値を設定することができます。</li>
-                    <li>「バンド幅」タブからはコンテンツがどのようにキューにスケジュールされるかは設定できません。ただ、キューへのスケジューリングを遅らせるだけです。この待ち時間の間でもスレッドは使われます。「スロットリング」タブはコンテンツのジョブスケジューリングを行うため、待ち時間でスレッドを無駄に使いません。</li>
-                </ul>
-                <br/>
-                <p>そのような理由のため、RSSコネクションには「バンド幅」タブと「スロットリング」タブの<b>両方</b>を設定することを推奨します。最大転送率を「バンド幅」タブで設定し、平均転送率を「スロットリング」タグで設定します。RSSコネクションのコンテンツIDはコンテンツのURLです。URLのbin名はサーバ名です。なお、「最大コネクション数/JVM」はデフォルトでは10です。この値は、RSSコネクションタイプには最適ではない可能性が高いです。ワーカスレッド毎にコネクションを1つ設けることを推奨します。デフォルトではワーカスレッド数は30ですので、「最大コネクション数/JVM」を30に設定にすることを推奨します。</p>
-                <p>プロキシを利用する場合は、「プロキシ」タブからプロキシ情報を入力してください。RSSコネクションタイプはNTLM認証のプロキシに対応しています。「プロキシ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-configure-proxy_ja_JP.PNG" alt="RSS Connection, Proxy tab" width="80%"/>
-                <br/><br/>
-                <p>「プロキシホスト」にはプロキシサーバアドレスを入力してください。「プロキシポート」にはプロキシのポート番号を入力してください。認証が必要な場合は、ドメイン名、ユーザ名、パスワードを入力してください。プロキシを利用しない場合は、プロキシ関連のすべての項目を空にして置いてください。</p>
-                <p>RSSコネクションを保存すると、以下のような状態が表示されます。</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-status_ja_JP.PNG" alt="RSS Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>ジョブでRSSコネクションタイプを選択すると、次のタブが表示されます:「URL」、「正規化」、「マッピング」、「時間」、「セキュリティ」、「メタデータ」、「索引対象」。「URL」タブからジョブで対象にするRSSフィードの情報を指定します。「URL」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-job-urls_ja_JP.PNG" alt="RSS job, URLs tab" width="80%"/>
-                <br/><br/>
-                <p>読込むRSSフィードのURLを改行で区切って入力してください。コメントを記入する場合は、行の先頭に「#」文字を入れて下さい。</p>
-                <p>「正規化」タブからはジョブがどのようにURLの正規化を処理するかを指定することができます。同一コンテンツに異なるURIが付けられている場合もあります。「正規化」機能は、このようなURLを同じURIと見なすために使います。例えば、URIの引数の順が異なっていても同じコンテンツを指します: <code>a=1&amp;b=2</code>と<code>b=2&amp;a=1</code>は同じコンテンツを指すはずです。その他にもURIにセッションクッキー情報の有無もあります。</p>
-                <p>「正規化」タブを選択すると、次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-job-canonicalization_ja_JP.PNG" alt="RSS job, Canonicalization tab" width="80%"/>
-                <br/><br/>
-                <p>正規化するルール一覧が表示されます。各ルールは正規表現(対象URIを検索する)と条件項目から構成されます。条件項目で引数順の有無やセッションクッキー情報の排除などを指定することができます。次のセッションクッキー情報を排除することが出来ます:JSP(Javaアプリケーションサーバ)、ASP(.NET)、PHP、Broadvision(BV)。</p>
-                <p>ルールが複数のルールに一致する場合は、最初に一致したルールが適用されます。</p>
-                <p>ルールを追加するには、正規表現を入力して、条件項目のチェックボックスをチェックした後に、「追加」ボタンを押下してください。</p>
-                <p>「マッピング」タブから取得するコンテンツのURIを変更することが出来ます。例えばイントラネットのコンテンツを取得する場合に、一般ユーザが利用するURIと異なるURIを使ってコンテンツをクロールすることもあります。「マッピング」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-job-mappings_ja_JP.PNG" alt="RSS job, Mappings tab" width="80%"/>
-                <br/><br/>
-                <p>「マッピング」タブからはManifoldCFの他のタブで使われているのと同じ正規表現の仕組みで文字列の置き換えを設定することができます。マップはルールから構成されます。各ルールは一致する正規表現の式で構成されます。変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、ルール<code>http://(.*)/(.*)/</code>と置き換え文字列<code>http://$(2)/</code>は、<code>http://Server/Folder_1/Filename</code>を<code>http://Folder_1/Filename</code>に置き換えます。</p>
-                <p>1つ以上のルールが存在する場合は、上から実行され、上のルールの結果は下のルールで変更されます。</p>
-                <p>ルールを追加するには、一致する条件と出力文字列を入力して「追加」ボタンを押下してください。</p>
-                <p>「時間」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-job-time-values_ja_JP.PNG" alt="RSS job, Time Values tab" width="80%"/>
-                <br/><br/>
-                <p>設定したい時間制限値を入力してください。以下は項目の説明です:</p>
-                <table>
-                    <tr><td><b>値</b></td><td><b>説明</b></td></tr>
-                    <tr><td>フィードタイムアウト</td><td>サーバ接続に待つ時間(秒)</td></tr>
-                    <tr><td>デフォルトフィード再取得時間</td><td>フィードに再取得時間が設定されていない場合に使う時間(分)</td></tr>
-                    <tr><td>最低再取得時間</td><td>フィードに設定した時間とは関係なく、設定した時間よりも短時間でフィードを再取得しない時間(分)</td></tr>
-                    <tr><td>エラーフィード再取得時間</td><td>解析エラーになったフィードを再取得するまでの待ち時間(分、空の場合は無限)</td></tr>
-                </table>
-                <p>「セキュリティ」タブからは、ジョブが利用する認証情報を設定することができます。利用する前に、利用する権限コネクションを決める必要があります。「セキュリティ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-job-security_ja_JP.PNG" alt="RSS job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>アクセストークンを追加するには、アクセストークンの値を入力して「追加」ボタンを押下してください。アクセストークンが無い場合は、ジョブのセキュリティは無効とされます。</p>
-                <p>「メタデータ」タブからは、ジョブのすべてのコンテンツからの索引に添付するメタデータを指定することができます。RSSコネクションタイプのコンテンツは、以下のような標準でメタデータが付けられます:</p>
-                <table>
-                    <tr><td><b>名前</b></td><td><b>説明</b></td></tr>
-                    <tr><td>PubDate</td><td>コンテンツが作成された日時(1970年1月1日からのミリ秒)。作成日を取得できない場合は、コンテンツを取得した日時になります。</td></tr>
-                    <tr><td>Source</td><td>コンテンツの名前。</td></tr>
-                    <tr><td>Title</td><td>フィード内のコンテンツの題名。</td></tr>
-                    <tr><td>Category</td><td>フィード内のコンテンツの分類。</td></tr>
-                </table>
-                <p>「索引対象」タブからは、コンテンツからではなく、フィードの概要から索引を作成するように指定することができます。内容がリンク一覧のようなフィードで、フィードの概要から索引を作成する場合に使うことができます。「索引対象」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/rss-job-dechromed-content_ja_JP.PNG" alt="RSS job, Dechromed Content tab" width="80%"/>
-                <br/><br/>
-                <p>コネクションで利用するモードを選択してください。</p>
-            </section>
-            
-            <section id="webrepository">
-                <title>汎用Webリポジトリコネクション</title>
-                <p>Webコネクションタイプは、Webクローラです。基本認証、NTLM認証、セッション認証に対応しています。以下のようなコンテンツを処理することができます:</p>
-                <br/>
-                <ul>
-                    <li>テキスト</li>
-                    <li>HTML</li>
-                    <li>汎用XML</li>
-                    <li>RSSフィード</li>
-                </ul>
-                <br/>
-                <p>WebコネクションタイプはRSSコネクションタイプと以下の機能が異なります:</p>
-                <br/>
-                <ul>
-                    <li>出力コネクションがフィードを受け付けた場合は、フィードから索引は作成されます。</li>
-                    <li>すべてのコンテンツからリンクも抽出されます。</li>
-                    <li>フィードは他コンテンツと同じように処理されます-一つだけの再取得設定を行うことはできません。</li>
-                    <li>ホップ数による制限を設けることができます。</li>
-                    <li>URIセットに含める/除外することができます。</li>
-                </ul>
-                <br/>
-                <p>WebコネクションタイプはRSSコネクションタイプよりも設定が複雑で、RSSフィードの詳細設定を行うことはできません。その結果、RSSの索引を作成する場合は、RSSコネクションタイプを利用することを推奨します。</p>
-                <p>Webコネクションタイプを利用する多くのジョブは、継続的に実行され、定期的にコンテンツを再取得するか、コンテンツを一回限り取得して再取得しないように設定され、指定した期間後に無効になるように設定されます。</p>
-                <p>Webコネクションタイプを選択すると次のタブが表示します:「メール」、「ロボット」、「バンド幅」、「認証」、「証明書」。「メール」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-email_ja_JP.PNG" alt="Web Connection, Email tab" width="80%"/>
-                <br/><br/>
-                <p>メールアドレスを入力して下さい。入力されたメールアドレスは、Webコネクションのすべてのリクエストに含まれ、サーバ管理者が見ることができます。もし、スロットリング設定が大きすぎる場合でサーバ負荷が大きすぎる場合は、サーバ管理者からこのメールアドレスに連絡がされる可能性があります。</p>
-                <p>この項目は必須です。Webコネクションはメールアドレスは妥当性を検証しませんが、ウェブ住民として正しいアドレスを入力してください。なお、サーバ管理者は「悪い」リクエストを拒否するように設定を変えることができますので、相手側サーバのことも考えてスロットリング設定を行ってください</p>
-                <p>「ロボット」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-robots_ja_JP.PNG" alt="Web Connection, Robots tab" width="80%"/>
-                <br/><br/>
-                <p>robots.txtをどのように処理するかをプルダウンリストから選択してください。相手側サーバのことを考慮して選択してください。</p>
-                <p>「バンド幅」タブからはバンド幅ルール一覧を設定することができます。ルール毎にURLスロットルbinを選択する正規表現を指定します。WebタイプのスロットルbinはURIのサーバ名です。ルール毎に最大バンド幅、コネクション数、読込み率を指定することができます。任意の数だけルールを作成することができます。もしURLが複数のルールと一致した場合は、一番保守的なルールが利用されます。</p>
-                <p>「バンド幅」タブを選択すると、次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-bandwidth_ja_JP.PNG" alt="Web Connection, Bandwidth tab" width="80%"/>
-                <br/><br/>
-
-                <p>ページの設定例の値は<b>親切</b>な設定になっています。デフォルトではすべての設定が空白ですので注意してください。このデフォルト設定では、スロットリングがされず、サーバに負荷を掛け、迷惑を掛けます。</p>
-
-                <p>ルールを追加するには、正規表現と制限値を入力して「追加」ボタンを押下してください。</p>
-                <p>「バンド幅」タブと「スロットリング」タブは次のように違います:</p>
-                <br/>
-                <ul>
-                    <li>「バンド幅」タブからは<b>最大</b>値を設定できます。「スロットリング」タブからは<b>平均</b>値を設定することができます。</li>
-                    <li>「バンド幅」タブからはコンテンツがどのようにキューにスケジュールされるかは設定できません。ただ、キューへのスケジューリングを遅らせるだけです。この待ち時間の間でもスレッドは使われます。「スロットリング」タブはコンテンツのジョブスケジューリングを行うため、待ち時間でスレッドを無駄に使いません。</li>
-                </ul>
-                <br/>
-                <p>そのような理由のため、Webコネクションには「バンド幅」タブと「スロットリング」タブの<b>両方</b>を設定することを推奨します。最大転送率を「バンド幅」タブで設定し、平均転送率を「スロットリング」タグで設定します。WebコネクションのコンテンツIDはコンテンツのURLです。URLのbin名はサーバ名です。なお、「最大コネクション数/JVM」はデフォルトでは10です。この値は、Webコネクションタイプには最適ではない可能性が高いです。ワーカスレッド毎にコネクションを1つ設けることを推奨します。デフォルトではワーカスレッド数は30ですので、「最大コネクション数/JVM」を30に設定にすることを推奨します。</p>
-                <p>Webコネクションの「認証」タブからはページ認証方法を指定することができます。ページ認証(例:基本認証、NTLM認証)及びセッション認証(ログインセッション)に対応しています。「認証」タブの初期ページには両方の認証方法が表示されています:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-access-credentials_ja_JP.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>認証方法毎にルール一覧を設けることができます。</p>
-                <p>ページ認証を設定する場合は、認証を必要なURI、認証方法とそのユーザ/パスワードを指定します。これらの項目を入力した後に「追加」ボタンを押下してください。</p>
-                <p>セッション認証を設定する場合は、少し調べる必要があります。セッションで保護されているサイト毎にセッション認証ルールを設ける必要があるかもしれません。サイト毎に次のような情報が必要です:</p>
-                <br/>
-                <ul>
-                    <li>セッションセキュリティで保護されているページのURI。</li>
-                    <li>ログイン処理中のページの取得する手順。</li>
-                    <li>ログインページにログイン情報の入力方法。</li>
-                </ul>
-                <br/>
-                <p>Webコネクションはログイン処理中のページを「login pages」とし、保護されているページを「content pages」とします。Webコネクションはログインページの索引を作成しません。ログインページは認証情報の入力用のページでコンテンツ情報が含まれていないからです。</p>
-                <p>また、サイトに初めて訪問する場合と、セッションが無効になってログインしていなくてコンテンツを取得しようとする場合も考慮する必要があります。両方の場合は、セッション認証ルールを適用してコンテンツを取得する必要があります。ManifoldCFフレームワークでは何時コンテンツを取得または再取得するか制御はできません。</p>
-                <p>ログインページのURI及び特徴的な内容からログインページを示します。例えば、セッションが無効になった場合はログインページにリダイレクトするサイトもあります。このような場合は、コンテンツを取得するよりも、ログインページへのリダイレクト情報を取得します。一般的には、ログインページ及びリダイレクト情報をコンテンツと区別して索引を作らないようにします。このような場合は、3つのログイン情報を登録します:一つはログインページへのリダイレクト、もう一つはログインページのURL、最後の一つはログインフォームの送信先。ログインページにログイン情報を設定して、送信するようにします。</p>
-                <p>Webコネクションは次のような内容をログインページと見なすことができます:</p>
-                <br/>
-                <ul>
-                    <li>特定のURI(正規表現に一致)へのリダイレクト</li>
-                    <li>指定した名前(正規表現に一致)のフォーム(FORM)が存在するページ</li>
-                    <li>特定のページへのリンク(正規表現に一致)を含んだページ</li>
-                </ul>
-                <br/>
-                <p>セッション認証ルールを追加する場合は、保護されたページを特定する正規表現を入力して「追加」ボタンを押下します。次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-access-credentials-session_ja_JP.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>新規に作成されたルールにログインページの情報を入力することができます。ログインページ情報を入力するには、URI正規表現、ログインページタイプ、ターゲットリンクまたはフォーム名正規表現を入力して、「追加」ボタンを押下してください。</p>
-                <p>「フォーム」型のログインページを追加した場合は、次のようにフォームにログイン情報を入力することができます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-access-credentials-session-form_ja_JP.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>フォームの項目に入力する値を設定してください。入力内容を非表示にする場合は、「値」列の代わりに「パスワード」列に値を入力してください。フォームの項目名はログインページのHTMLソースコードを表示して、調べてください。入力した後に「追加」ボタンを押下してください。</p>
-                <p>指定されていないフォーム項目はログインページのデフォルト値で送信されます。現バージョンでは、Javascriptは未対応です。ログインフォームにJavascriptが利用されている場合は、スクリプトの結果を事前に計算して、その結果を登録してください。複雑なJavascriptを含むログインページの場合は、設定値を探すのに時間が掛かる場合があります。</p>
-                <p>複数のログインページフォームはサイトの「ログインページ手順」です。Webコネクションは、ログインページ毎に次に取得する内容をログインページ条件で決めます。例えば、特定のURIへのリダイレクトの場合は、リダイレクトURIを取得します。フォームの場合は、フォームのactionで指定したページを取得します。ターゲットへのリンクの場合は、ターゲットURIを取得します。ログインページ手順の最後にはWebコネクションがログイン手順を開始する前に元々取得するページを取得します。</p>
-                <p>セッション認証をデバッグする場合は、Webコネクションの履歴レポートを参照することを推奨します。Webコネクションのイベント履歴を参照することで大体の動作が分かるはずです。以下のようなイベントがあります:</p>
-                <br/>
-                <table>
-                    <tr><td><b>イベントタイプ</b></td><td><b>説明</b></td></tr>
-                    <tr><td>Fetch</td><td>URIの取得履歴です。HTTPからの戻り値はレスポンスコードとして記録されます。HTTP処理が失敗または不完了のイベントは負の値で記録されます。</td></tr>
-                    <tr><td>Begin login</td><td>ログイン手順を実行する場合に記録されます。ログイン手順が実行されると、ログインが完了するまでは他の保護されたサイトからコンテンツは取得されません。</td></tr>
-                    <tr><td>End login</td><td>ログイン手順から元のコンテンツの取得に戻った時に記録されます。元のコンテンツの取得に戻った場合は、サイトから並行してコンテンツの取得を再開します。</td></tr>
-                </table>
-                <br/>
-                <p>「証明書」タブはSSLと一緒に利用され、信用した正規表現と一致したURIの証明書情報を設定します。すべての証明書を信用することもできます。「証明書」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-configure-certificates_ja_JP.PNG" alt="Web Connection, Certificates tab" width="80%"/>
-                <br/><br/>
-                <p>URI正規表現を入力し、「すべての信用する」チェックボックスをチェックするか、証明書を参照してください。(サーバの証明書を信用することもできますが、証明書が期限切れになる場合もあります。)証明書を一覧に追加する場合は「追加」ボタンを押下してください。</p>
-                <p>入力した後に「保存」ボタンを押下すると次のような設定内容の概要ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-status_ja_JP.PNG" alt="Web Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>ジョブでWebタイプのリポジトリコネクションを選択した場合は、次のタブが表示されます:「ホップフィルタ」、「シード」、「正規化」、「含む」、「除外」、「セキュリティ」、「メタデータ」。</p>
-                <p>「ホップフィルタ」タブからは、シードコンテンツからの最大ホップ数を指定することができます。Webタイプのコネクションには2種類のホップ数があります:「リンク」ホップと「リダイレクション」ホップ。ホップの種類毎に最大数を設定することができます。空白の場合は、無限と見なされます。</p>
-                <p>例えば、最大「リンク」ホップ数を5に設定して、「リダイレクト」ホップ数を空白にした場合は、シードコンテンツから5ホップより多いコンテンツは対象外とされます。最大「リンク」ホップ数を5に設定して、最大「リダイレクト」ホップ数を2に設定した場合は、シードコンテンツから5ホップより多くて<b>かつ</b>リダイレクトのホップ数が2より多いコンテンツは対象外とされます。</p>
-                <p>「ホップフィルタ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-hop-filters_ja_JP.PNG" alt="Web Job, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>このページからルートからコンテンツのホップ数が変更された場合に行う処理を指定することができます。「読込めないコンテンツを削除」を選択すると、変更が発見されると、関係する可能性があるすべてのコンテンツの深さを再計算します。再計算するとサーバに負荷が掛かります。再計算を行わないようにする場合は、一時的に行わないようにする設定と、永久に行わない設定があります。永久に行わないを選択すると、情報を削除します。</p>
-                <p>「シード」タブからクロールを始めるコンテンツを指定します。「シード」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-seeds_ja_JP.PNG" alt="Web Job, Seeds tab" width="80%"/>
-                <br/><br/>
-                <p>シードを改行で区切って入力してください。空行及び「#」から始まる行は無視されます。</p>
-                <p>「正規化」タブからURIを標準形式に変換するルールを入力することができます。「正規化」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-canonicalization_ja_JP.PNG" alt="Web Job, Canonicalization tab" width="80%"/>
-                <br/><br/>
-                <p>正規化するルール一覧を表示します。各ルールは正規表現(対象URIを検索する)と条件項目から構成されます。条件項目で引数順の有無やセッションクッキー情報の排除などを指定することができます。次のセッションクッキー情報を排除することが出来ます:JSP(Javaアプリケーションサーバ)、ASP(.NET)、PHP、Broadvision(BV)。</p>
-                <p>ルールが複数のルールに一致する場合は、最初に一致したルールが適用されます。</p>
-                <p>ルールを追加するには、正規表現を入力して、条件項目のチェックボックスをチェックした後に、「追加」ボタンを押下してください。</p>
-                <p>「含む」タブからWebジョブに含むURI正規表現一覧を指定することができます。「含む」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-inclusions_ja_JP.PNG" alt="Web Job, Inclusions tab" width="80%"/>
-                <br/><br/>
-                <p>改行区切りで0以上の正規表現を指定してください。</p>
-                <p>Webジョブはデフォルトでは、シードにリンクされているインターネット上の<b>すべて</b>のコンテンツを含みます。</p>
-                <p>対象にするコンテンツを制限したい場合は、「除外」タブから指定してください。「除外」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-exclusions_ja_JP.PNG" alt="Web Job, Exclusions tab" width="80%"/>
-                <br/><br/>
-                <p>改行区切りで0以上の正規表現を指定してください。索引を作成できないコンテンツは、索引をする必要がないコンテンツを除外することを推奨します。例えば動画や映像などからは索引を作成できないので除外の対象です。</p>
-                <p>「セキュリティ」タブからWebジョブが索引を作成するコンテンツのアクセストークンを指定することができます。「セキュリティ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-security_ja_JP.PNG" alt="Web Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>コンテンツにセキュリティを追加する前に、アクセストークンの形式の情報が必要です。アクセストークンを入力して「追加」ボタンを押下してください。</p>
-                <p>「メタデータ」タグからコンテンツにメタデータを付けることができます。「メタデータ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/web-job-metadata_ja_JP.PNG" alt="Web Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>設定するメタデータ名と値を入力して「追加」ボタンを押下してください。</p>
-            </section>
-
-
-            <section id="jcifsrepository">
-                <title>Windows Share/DFSリポジトリコネクション</title>
-                <p>Windows共有コネクションタイプは、Windowsの共有フォルダにあるコンテンツを索引する場合に使います。Windows以外のOSのシステムからも利用することができます。Sambaや第三者のNASサーバにも対応しています。</p>
-                <p>DFSノードと参照はすべて対応しています。ただし、参照するサーバ名はManifoldCFがインスールされたサーバが利用しているDNSから参照できることを前提とします。Windows共有コネクションは、コンテンツ毎に索引IDを作成します。索引IDは「file:」IRIまたは「http:」URIです。柔軟なデプロイ環境が可能ですが、設定に少し時間が必要になります。特にファイルIRIを利用する場合は、システムの検索コンポーネントが正しく対応しているのか確認してください。Internet ExplorerのようなWebブラウザからWindowsファイルシステムのコンテンツを閲覧する場合は、<code>\\servername\sharename\dir1\filename.txt</code>のようなアドレスを<code>file://///servername/sharename/dir1/filename.txt</code>のようなIRIに変換します。簡単のようですが空白、「#」、英数以外の文字がファイル名に含まれている場合は複雑になります。Internet Explorerのバージョンによって異なる方法で処理するため、一つの方法でWindows共有ファイルパスをIRIに変換することはできません。代わりにコネクションは標準正規化アドレスを利用して、システムが索引結果をWebブラウザ及びクライアントに正しい方法で変換することを期待します。</p>
-                <p>権限付きでWindows共有リポジトリコネクションでコンテンツをクロールする場合は、事前にActive Directory権限コネクタを作成してください。</p>
-                <p>Windows共有コネクションはリポジトリコネクション編集ページで1つの固有タブがあります:「サーバ」タブ。「サーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-configure-server_ja_JP.PNG" alt="Windows Share Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>接続するサーバ名を入力してください。サーバ名は、実サーバ名またはWindowsドメインDFSルートに接続する場合はドメイン名で指定することができます。実サーバ名を入力する場合は、サーバ名に未修飾名を入力して、「ドメイン名」に完全修飾ドメイン名を入力してください。ユーザ名は未修飾名を入力して下さい(例:「Administrator@mydomain.com」ではなく、「Administrator」と入力してください)。「ドメイン名」を空白にして、「サーバ」に完全修飾サーバ名を入力する場合もあります。ただし、ドメイン名と完全修飾サーバ名の<b>両方</b>を入力しないでください。</p>
-                <p>"Use SIDs"チェックボックスは、コネクションがSIDsをアクセストークンとして使うか(これはActive Directoryによるセキュリティ制御されたWindowsサーバやNASサーバに適しています)、あるいはユーザ/グループ名を使うか(これはSambaサーバや、LDAP権限コネクションタイプと連携してLDAPを使う他のCIFSサーバに適しています)を制御します。SIDsを使うならチェックしてください。</p>
-                <p>サーバ側の負荷を軽減するために、「スロットリング」タブの「最大コネクション数/JVM」をデフォルト値の10より少ない値に変更することを推奨します。Windowsはマルチスレッド処理をそんなに良くしません。5以下に設定してもそんなに取得性能は変わりません。</p>
-                <p>入力した後に「保存」ボタンを押下してください。次のような設定概要ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-status_ja_JP.PNG" alt="Windows Share Status" width="80%"/>
-                <br/><br/>
-                <p>画面例では、Windows共有コネクションはサーバに接続できないためエラーメッセージが表示されています。</p>
-                <p></p>
-                <p>ジョブでWindows共有タイプを選択すると次のタブが表示されます:「パス」、「セキュリティ」、「メタデータ」、「Content Length」、「ファイルマップ」、「URLマップ」。</p>
-                <p>「パス」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-job-paths_ja_JP.PNG" alt="Windows Share Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>このページから起点パスの指定、生成パスの追加、既存パス一覧からパスの削除することができます。起点パスを指定しないと、ジョブが対象とするコンテンツはありません。</p>
-                <p>コネクションの状態が「起動」になっていることを確認してください。エラーメッセージが表示している場合は、パスは作成されません。</p>
-                <p>含むパス毎にジョブが対象とするフォルダ及びコンテンツを特定するルール一覧が表示します。ルールは上から下へ評価されます。最初に一致したルールが使われます。</p>
-                <p>各ルールはパスを特定する条件を指定します。各ルールはファイル名条件(例:「*.txt」)、ファイルまたはフォルダ名を特定するのかの指定、出力コネクションでファイルから索引を作成するか否か、ファイルを含むか除外するかの指定が含まれます。ファイル名の指定にはワイルドカード文字「*」と「?」を使うこともできます。「*」は0以上の任意の文字と一致します。「?」は任意の1文字と一致します。その他の文字は記述通りに一致する必要があります。</p>
-                <p>起点パスのルールを追加する場合は、プルダウンメニューから値を選択して、ファイル選択条件を入力して、「追加」ボタンを押下してください。既にあるルールの上にルールを挿入する場合は「挿入」ボタンを押下してください。</p>
-                <p>「セキュリティ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-job-security_ja_JP.PNG" alt="Windows Share Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>「セキュリティ」タブからは次の3機能を設定することができます:ファイルセキュリティ、共有セキュリティ、ジョブで索引が作成されたすべてのコンテンツのセキュリティトークン(セキュリティが無効の場合)。</p>
-                <p><b>ファイルセキュリティ</b>とは、Windowsが各ファイルに適用しているセキュリティです。
-ほとんどのWindows互換のNASタイプサーバでサポートされています。</p>
-                <p><b>共有セキュリティ</b>とは、WindowsがWindows共有フォルダで使っているセキュリティです。古いセキュリティの仕組みで、このセキュリティを利用しているユーザは少なくなっています。最新のNASシステムやSambaではサポートされていない場合があります。Windows共有セキュリティがサポートされていないシステムでこのコネクタを利用しても正しくされません。コンテンツを取得しようとするとエラーになり、ジョブは中断されます。</p>
-                <p>ファイルセキュリティを無効にすると、ジョブでクロールするすべてのコンテンツに索引アクセストークンを追加することができます。ただしこのトークンはサーバのトークンと一致している必要があります。トークンを入力して「追加」ボタンを押下してください。この機能はデモ以外に使われることは少ないと思います。</p>
-                <p>「メタデータ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-job-metadata_ja_JP.PNG" alt="Windows Share Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>正規表現により変換されたコンテンツパスをコンテンツのメタデータとして取得することをできるようにする設定を行えます。「パス属性名」にメタデータ名を入力した後にルール一覧にルールを追加してください。各ルールは一致する正規表現の式で構成されます。変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、ルール<code>http://(.*)/(.*)/</code>と置き換え文字列<code>http://$(2)/</code>は、<code>http://Server/Folder_1/Filename</code>を<code>http://Folder_1/Filename</code>に置き換えます。</p>
-                <p>1つ以上のルールが存在する場合は、上から実行され、上のルールの結果は下のルールで変更されます。</p>
-                <p>「Content Length」タグを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-job-content-length_ja_JP.PNG" alt="Windows Share Job, Content Length tab" width="80%"/>
-                <br/><br/>
-                <p>ジョブが長いコンテンツの作成を作成しないように、コンテンツを処理する最大長さを指定することができます。指定した長さより長いコンテンツは、指定した長さで切り捨てられます。最大長さを入力してください。最大長を設定しない場合は、空白にしてください。</p>
-                <p>「ファイルマップ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-job-file-mapping_ja_JP.PNG" alt="Windows Share Job, File Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>ファイルマップはパス属性マップと同じように設定します。ファイルマップは実ファイルパスを変換します。元コンテンツと抽出したデータの間に変換が必要な場合に使うことができます。</p>
-                <p>「URLマップ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jcifs-job-url-mapping_ja_JP.PNG" alt="Windows Share Job, URL Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>URLマップはパス属性マップと同じように設定します。マップが存在しない場合は、ファイルパスは標準ファイルIRIに変換されます。マップが存在する場合は、Windows共有HTTPサーバを介して取得できる正しいURIへ変換されることを前提にします。</p>
-
-            </section>
-
-            <section id="jdbcrepository">
-                <title>汎用データベースリポジトリコネクション</title>
-                <p>汎用データベースコネクションタイプは次のデータベースのテーブルの内容から索引を作成します:</p>
-                <br/>
-                <ul>
-                    <li>Postgresql (Postgresql JDBCドライバ)</li>
-                    <li>SQL Server (JTDS JDBCドライバ)</li>
-                    <li>Oracle (Oracle JDBCドライバ)</li>
-                    <li>Sybase (JTDS JDBCドライバ)</li>
-                    <li>MySQL (MySQL JDBCドライバ)</li>
-                </ul>
-                <br/>
-                <p>その他のデータベースを利用する場合はソフトウエアを<b>修正する必要</b>があります。データベースのセットアップによっては、利用できないデータベースもあります。</p>
-                <p>汎用データベースコネクションタイプはコンテンツ単位のセキュリティをサポートしていません。ただし、ジョブ単位ですべてのコンテンツのセキュリティを指定することはできます。設定するにはアクセストークンが必要になります。</p>
-                <p>リポジトリコネクション編集ページから汎用データベースコネクションを選択すると3つのタブが表示されます:「データベースタイプ」、「サーバ」、「認証」。「データベースタイプ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jdbc-configure-database-type_ja_JP.PNG" alt="Generic Database Connection, Database Type tab" width="80%"/>
-                <br/><br/>
-                <p>プルダウンメニューから索引を作成するデータベースの種類を選択してください。</p>
-                <p>また、JDBCアクセス方式をプルダウンから選択します。このアクセス方式は、JDBC仕様で最近明らかにされたのですが、カラム名の取得に関してすべてのJDBCドライバが同じ方法で動作するとは限らない、ということに基づいて提供されました。"by name"オプションは現在のところ、MySQLドライバを除いて、リスト内のすべてのJDBCドライバで動作します。"by label"は現在のMySQLドライバで動作します。他のドライバでも動作するかもしれません。汎用データベースのジョブで定義したクエリが正常動作しない場合や、カラムを見つけることができないというようなエラーメッセージが表示された場合は、このプルダウンを変更することによって解決するかもしれません。</p>
-                <p>「サーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jdbc-configure-server_ja_JP.PNG" alt="Generic Database Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>サーバ名とポート番号を項目「データベースホストとポート」に入力してください。例えば、Oracleデータベースのデフォルトポート番号は1521なので、「my-oracle-server:1521」のように入力します。Postgresqlのデフォルトポート番号は5432なので、「my-postgresql-server:5432」のように入力します。SQL Serverのデフォルトポート番号は1433なので、「my-sql-server:1433」のように入力します。</p>
-                <p>サービス名及びインスタンス名には利用するデータベースのインスタンス名を入力してください。Oracle及びPostgresqlの場合は、データベース名を入力してください。SQL Serverの場合は「my-instance-name/my-database-name」のように入力してください。SQL Serverのデフォルトのインスタンスを利用する場合は、データベースのみを入力してください。</p>
-                <p>「認証」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jdbc-configure-credentials_ja_JP.PNG" alt="Generic Database Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>データベースに接続するためのユーザ認証情報を入力してください。</p>
-                <p>入力した後に「保存」ボタンを押下してください。次のような設定内容概要ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jdbc-status_ja_JP.PNG" alt="Generic Database Status" width="80%"/>
-                <br/><br/>
-                <p>画面例では汎用データベースコネクションはデータベースと接続できないためにエラーメッセージが表示されています。</p>
-                <p></p>
-                <p>ジョブのリポジトリコネクションに汎用データベースコネクションタイプを選択すると「クエリー」と「セキュリティ」タブが表示されます。</p>
-                <p>「クエリー」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/jdbc-job-queries_ja_JP.PNG" alt="Generic Database Job, Queries tab" width="80%"/>
-                <br/><br/>
-                <p>最低でも2つのクエリーを設定する必要があります(3つめのクエリーは任意です)。これらのクエリーに基づいてデータベースからコンテンツを取得します。クエリーを入力する前に、データベース構造をどのようにManifoldCFフレームワークの構造に対応付けるか決める必要があります。</p>
-                <br/>
-                <ul>
-                    <li>時間帯に発生する追加及び変更したコンテンツID一覧を取得します(下を参照)。</li>
-                    <li>コンテンツIDからバージョン情報を取得します(下を参照)。</li>
-                    <li>コンテンツIDとバージョン情報からコンテンツ情報を取得します。コンテンツ情報は、コンテンツの内容、URI、メタデータから構成されます。</li>
-                </ul>
-                <br/>
-                <p>ManifoldCFはリポジトリコネクション内のすべてのコンテンツを識別するためにIDを使います。このIDはコンテンツを取得するために主キーとして使われます。ジョブの汎用データベースタイプで使うデータベースにも同じような概念が必要です。間違ったIDを選択した場合は、処理が遅くなる場合もあります。</p>
-                <p>時間帯に発生したすべての変更のコンテンツID一覧を取得する必要があります。変更されていないコンテンツのIDを一覧に含めることも出来ますが、最適ではありません。</p>
-                <p>コンテンツを追加するように設定する場合は、「バージョン情報」も設定してください。この文字列を利用してコンテンツが変更したかを確認します。索引を変更する場合は、このバージョン情報も変わる必要があります。(その他の原因で変わっても問題はありません。)</p>
-                <p>入力されたクエリーはコネクションが使う前にクエリーに含まれている置き換え文字列に値が入れられます。デフォルトで入力されているクエリーには代表的な置き換え文字列が利用されています。例えば、「$(IDCOLUMN)」はコネクションが利用するIDの列名に置き換えられます。その他の置き換え文字列は次の通りです:</p>
-                <br/>
-                <table>
-                    <tr><td><b>名前</b></td><td><b>説明</b></td></tr>
-                    <tr><td>IDCOLUMN</td><td>コンテンツIDを含む結果セットの列</td></tr>
-                    <tr><td>VERSIONCOLUMN</td><td>バージョン情報を含む結果セットの列</td></tr>
-                    <tr><td>URLCOLUMN</td><td>URIを含む結果セットの列</td></tr>
-                    <tr><td>DATACOLUMN</td><td>コンテンツデータを含む結果セットの列</td></tr>
-                    <tr><td>STARTTIME</td><td>開始時間を1970年1月1日からの経過時間(ミリ秒)</td></tr>
-                    <tr><td>ENDTIME</td><td>終了時間を1970年1月1日からの経過時間(ミリ秒)</td></tr>
-                    <tr><td>IDLIST</td><td>括弧で囲まれたコンテンツID一覧</td></tr>
-                </table>
-                <br/>
-                <p>時間の置き換え文字列を含むクエリーを作成する場合は、「$(STARTTIME)」と「$(ENDTIME)」は1970年1月1日からの経過時間をミリ秒で表した値に置き換えられることに注意してください。「$(STARTTIME)」と「$(ENDTIME)」をシステムのタイムスタンプに置き換えることを推奨します。</p>
-                <p>以下は「$(STARTTIME)」と「$(ENDTIME)」を他形式の日付と時間に変換するサンプルクエリーの部分です。先頭の列はクエリー句が対応するSQLデータベースです。2列目はクエリーの出力データ型です。3列目は、「$(STARTTIME)」を利用した例です。これらはクエリーの例です。変更したデータ型が2列目のデータ型と異なる場合は、日付比較は正しくされない場合もあります。</p>
-                <br/>
-                <table>
-                    <tr><td><b>データベース</b></td><td><b>型</b></td><td><b>サンプルクエリー</b></td></tr>
-                    <tr><td>Oracle</td><td>date</td><td><code>TO_DATE ( '1970/01/01:00:00:00', 'yyyy/mm/dd:hh:mi:ss') + ROUND ($(STARTTIME)/86400000)</code></td></tr>
-                    <tr><td>Oracle</td><td>timestamp</td><td><code>TO_TIMESTAMP('1970-01-01 00:00:00') + interval '$(STARTTIME)/1000' second</code></td></tr>
-                    <tr><td>Postgres SQL</td><td>timestamp</td><td><code>date '1970-01-01' + interval '$(STARTTIME) milliseconds'</code></td></tr>
-                    <tr><td>MS SQL Server ($>$6.5)</td><td>datetime</td><td><code>DATEADD(ms, $(STARTTIME), '19700101')</code></td></tr>
-                    <tr><td>Sybase (10+)</td><td>datetime</td><td><code>DATEADD(ms, $(STARTTIME), '19700101')</code></td></tr>
-                </table>
-                <br/>
-                <p>汎用データコネクションを利用したジョブを作成する場合は、ジョブのクエリーには例題クエリーが入力されています。クエリーが返す列はこれらを参考にして下さい。多くの場合は、例題で返されている列のみで充分です。ただし、ファイルデータクエリーの場合はそれ以外の列も返すことがあります。この場合は、列値はコンテンツのメタデータとして索引に渡されます。メタデータ名は結果セットの列名になります。</p>
-                <p>「セキュリティ」タブは、汎用データベースジョブで作成された索引のコンテンツにアクセストークンを追加します。追加するトークンは、どの権限コネクションを利用するか決めてその権限コネクションのアクセストークンに依存します。「セキュリティ」タブを選択すると次のようなページが表示されます:</p>
-                <br/>
-                <br/>
-                <figure src="images/ja_JP/jdbc-job-security_ja_JP.PNG" alt="Generic Database Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>アクセストークンを選択して、「追加」ボタンを選択してください。複数のアクセストークンを設定することも可能です。</p>
-            </section>
-
-            <section id="filenetrepository">
-                <title>IBM FileNet P8リポジトリコネクション</title>
-                <p>IBM FileNet P8コネクションタイプは、FileNet P8サーバーインスタンスのコンテンツから索引を作成する場合に利用します。1つのコネクションからそのサーバにあるファイルすべてを取得できます。複数のサーバーをサポートするには複数のコネクションが必要です。</p>
-                <p>このコネクションタイプはActive Directory権限コネクションを使ってコンテンツの権限を管理します。まだActive Directory権限コネクションを作成しておらず、コンテンツの権限を管理したいのであれば、「Active Directory権限コネクション」の節の指示に従ってください。</p>
-                <p>FileNetを選択すると次の独自のタブが表示されます: 「サーバ」、「オブジェクトストア」、「ドキュメントURL」、「認証」。「サーバ」タブでは接続するFileNet P8の指定が、「オブジェクトストア」タブでは希望するFileNetオブジェクトストアの指定ができます。 「ドキュメントURL」タブでは索引を作成するコンテンツの各URLのパラメータを、「認証」タブではFileNetオブジェクトストアへのアクセスに使う認証情報を指定します。</p>
-                <p>「サーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/filenet-configure-server_ja_JP.PNG" alt="FileNetコネクション、サーバタブ" width="80%"/>
-                <br/><br/>
-                <p>適切なプロトコルを選択し、サーバ名、ポート、サービスを指定してください。</p>
-                <p>「オブジェクトストア」タブを選択すると次のようなページが表示されます:</p>
-                <figure src="images/ja_JP/filenet-configure-objectstore_ja_JP.PNG" alt="FileNetコネクション、オブジェクトストアタブ" width="80%"/>
-                <br/><br/>
-                <p>接続するFileNetドメイン名とドメイン内のFileNetオブジェクトストア名を入力してください。</p>
-                <br/><br/>
-                <p>「ドキュメントURL」を選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/filenet-configure-documenturl_ja_JP.PNG" alt="FileNetコネクション、ドキュメントURLタブ" width="80%"/>
-                <br/><br/>
-                <p>このタブでは索引を作成するコンテンツをどのようにロードするかの基盤となるURLを指定できます。プロトコルを選択してください。ホスト名を入力してください。ポートを入力してください。そして、URLを入力してください。</p>
-                <p>「認証」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/filenet-configure-credentials_ja_JP.PNG" alt="FileNetコネクション、認証タブ" width="80%"/>
-                <br/><br/>
-                <p>FileNetリポジトリに対してFileNetコネクションタイプアクセスできるようにFileNetユーザーIDとパスワードを入力してください。</p>
-                <p>コネクション情報の入力が終わったら、「保存」ボタンを押してください。次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/filenet-status_ja_JP.PNG" alt="FileNetコネクション状態" width="80%"/>
-                <br/><br/>
-            </section>
-            
-            <section id="documentumrepository">
-                <title>EMC Documentumリポジトリコネクション</title>
-                <p>EMC Documentumコネクションタイプは、Documentum Content Serverインスタンスのコンテンツから索引を作成する場合に利用します。1つのコネクションから1つのContent Serverインスタンスのすべてのコンテンツを取得することができます。複数のContent Serverインスタンスのコンテンツの索引を作成する場合は、サーバインスタンス毎にコネクションを定義する必要があります。</p>
-                <p>Documentumコネクションタイプは、Content Serverインスタンス毎にdm_document型及びdm_document型から派生した型のすべてのDocumentumコンテンツから索引を作成できます。複合ドキュメントは構成する複合ドキュメントに対応しています。その他のDocumentum構成には未対応です。</p>
-                <p>Documentumコネクションで扱うコンテンツはDocumentum権限コネクションで権限管理されています。Documentum権限を利用する場合は「EMC Documentum権限コネクション」を参照してください。</p>
-                <p>Documentumコネクションを選択すると次のタブが表示されます:「Docbase」、「Webtop」。「Docbase」タブからは接続するコンテンツサーバの指定と、認証情報の設定ができます。索引を作成した後に、「Webtop」タブからはコンテンツサーバの内容を表示するWebtopサーバの指定することができます。</p>
-                <p>「Docbase」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-docbase_ja_JP.PNG" alt="Documentum Connection, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>コンテンツサーバDocbaseインスタンス名と認証情報を入力してください。コンテンツサーバインスタンスがActive Directoryと統合されていない場合は、「ドメイン」を空白にしてください。</p>
-                <p>「Webtop」タブを選択すると次のようなページが表示されます;</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-webtop_ja_JP.PNG" alt="Documentum Connection, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>WebtopインスタンスのベースURIを入力してください。このURIはユーザが元コンテンツを参照する場合のみ利用されます。クロールには利用されません。</p>
-                <p>入力をした後に「保存」ボタンを押下してください。次のような設定内容の概要と状態が表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/documentum-status_ja_JP.PNG" alt="Documentum Connection Status" width="80%"/>
-                <br/><br/>
-                <p>状態にエラーメッセージが表示されている場合は、設定内容を修正してください。</p>
-                <p></p>
-                <p>ジョブでDocumentumコネクションを選択すると、次のタブが表示されます:「パス」、「ドキュメントタイプ」、「コンテンツタイプ」、「セキュリティ」、「パスメタデータ」。</p>
-                <p>「パス」タブからはコンテンツを読込むDocumentum内のパスを設定することができます。パスが設定されていない場合は、すべてのコンテンツを読込みの対象にします。</p>
-                <p>「ドキュメントタイプ」タブからは、読込みの対象にするドキュメントタイプを指定します。システム管理者が索引対象と指定したdm_documentから派生したドキュメントタイプのみから選択することができます。また、索引を作成するドキュメントタイプ毎に含むメタデータを指定することもできます。ドキュメントタイプのすべてのメタデータを含む場合は「すべてのメタデータ」チェックボックスをチェックしてください。</p>
-                <p>「コンテントタイプ」タブからは、コンテンツセットに含むDocumentumのmimeタイプを指定することができます。含むタイプにチェックをし、除外するタイプからはチェックを外してください。</p>
-                <p>「セキュリティ」タブからは、このジョブでDocumentumセキュリティを有効/無効にするか指定することができます。Documentumセキュリティを無効にする場合は「無効」ラジオボタンを選択してください。無効にした場合は、ジョブのすべてのコンテンツ取得で利用するアクセストークンを設定することができます。アクセストークンは利用する権限コネクションタイプによります。アクセストークンの入力毎に「追加」ボタンを押下してください。</p>
-                <p>「パスメタデータ」タブからはコンテンツ毎のパス情報を索引にメタデータとして送るように指定することができます。送るようにする場合は、項目「パス属性名」にメタデータ属性名を入力して、ルールをルール一覧に追加してください。各ルールに一致する正規表現の式で構成されます。変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、ルールの一致条件が<code>.*/(.*)/(.*)/.*</code>で置き換え文字列<code>$(1) $(2)/</code>とした場合、パス<code>Project/Folder_1/Folder_2/Filename</code>は<code>Folder_1 Folder_2</code>に変換されます。</p>
-                <p>1つ以上のルールが存在する場合は、上から実行され、上のルールの結果は下のルールで変更されます。</p>
-            </section>
-            
-            <section id="dropboxrepository">
-              <title>Dropboxリポジトリコネクション</title>
-              <p>Dropboxリポジトリコネクションは、<a href="https://www.dropbox.com/home">Dropbox</a>の内容をインデクシングすることができます。</p>
-              <p>それぞれのDropboxコネクションは、ひとつのDropboxリポジトリへのアクセスを管理します。これは、たとえば異なるユーザを使って、複数のDropboxを持っている場合、それぞれのDropboxリポジトリに対してひとつずつコネクションを作り、その関連した権限情報を用意する必要があることを意味します。</p>
-              <br/>
-              <p>ひとつのDropboxコネクションは、次のような設定パラメータを、リポジトリコネクションの編集画面に持っています。</p>
-              <br/><br/>
-              <figure src="images/ja_JP/dropbox-repository-connection-configuration.PNG" alt="Dropbox Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>コネクションに接続するためには、4つの情報が必要です。Application KeyとApplication Secretは、開発ライセンスであなたのアプリケーションを登録した時に、Dropboxから提供されます。これは基本的には、アプリケーション開発者用の<a href="https://www.dropbox.com/developers/apps">Dropbox website</a>を通して行われます。</p>
-              <br/><br/>
-              <figure src="images/ja_JP/dropbox-repository-create-application.PNG" alt="Dropbox create application" width="80%"/>
-              <br/><br/>
-              <p>今回の用途としては、DropboxとコミュニケートするためにRESTサービスを使いますので、アプリケーションタイプとして"Core"を選択する必要があります。また、"full access"を選択します。これには少々議論があります。基本的に、情報を格納したり取得したりするアプリケーションでは、アプリケーションの固有フォルダからフルアクセスします。今回のケースでは、ユーザーがユーザーのファイルをそのままアクセスし、manifoldcfの固有フォルダにコピーしないことを想定しています。結果的には、"App folder"の代わりに"full access"を選択しています。</p>
-              <br/><br/>
-              <figure src="images/ja_JP/dropbox-repository-application-secret-passwords.PNG" alt="Dropbox get key and secret passwords" width="80%"/>
-              <br/><br/>
-              <p>その後、このコネクタで求められる2つの情報、App keyとApp secretを見ることができます。</p>
-              <p>ここで、それぞれのユーザは、ユーザのアプリケーションがDropboxにアクセスできるよう受諾されることを確認しなければなりません。これは普通のOAUTHアプローチを通してなされます。ユーザのアプリケーションのkeyとsecretが提供された後、ユーザは、ユーザのアプリケーションの権限を許可してもらうことを、Dropboxのウェブサイトに対して問い合わせするよう指示されます。彼らがそのリクエストを受諾すると、Dropboxはclient keyとsecretを提供します。このkeyとsecretが、Dropboxコネクタで必要になる最後の2つです。このプロセスの深い内容については、<a href="https://www.dropbox.com/developers/core/authentication">dropbox website</a>で説明されており、どのようにこの2つのclientトークンを生成するかの例が示されています。</p>
-              <br/>
-              <br/><br/>
-              <p>保存ボタンをクリックしたら、コネクションのサマリ画面を見ることになります。これは以下のようなものになります。</p>
-              <br/><br/>
-              <figure src="images/ja_JP/dropbox-repository-connection-configuration-save.PNG" alt="Dropbox Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>Dropboxリポジトリコネクションを使用するジョブを設定した場合は、追加タブが表示されます。これは、"Dropbox Folder to Index" です。</p>
-              <br/><br/>
-              <figure src="images/ja_JP/dropbox-repository-connection-job-dropbox-folder-to-index.PNG" alt="Dropbox Repository Connection, Dropbox Folder to Index" width="80%"/>
-              <br/><br/>
-              <p>このタブでは、Dropboxコネクタがインデクシングするディレクトリを指定することができます。Dropboxはunixスタイルのパスを使います。"/"はルートパスを意味します(したがって全体のDropboxを指定することになります)。たとえば、Photosディレクトリをインデクシングしたい場合は、"/Photos"と指定することになります。</p>
-              <p>注意点は、Dropboxコネクタは取り込み処理中、それぞれの結果について、フォルダの階層を見つけた時、そのフォルダの子供のすべてのフォルダを取り込もうとします。フォルダでなければ、直接ドキュメントを取り込もうとします。</p>
-              <p>ジョブの設定が終わったら、保存ボタンをクリックし、サマリ画面を見ます。これは以下のようなものになります。</p>
-              <br/><br/>
-              <figure src="images/ja_JP/dropbox-repository-connection-job-save.PNG" alt="CMIS Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-            
-            <section id="livelinkrepository">
-                <title>OpenText LiveLinkリポジトリコネクション</title>
-                <p>OpenText LiveLinkコネクションタイプは、LiveLinkリポジトリからのコンテンツから索引を作成します。LiveLinkには基本ドキュメント、複合ドキュメント、フォルダ、ワークスペース、プロジェクトのような多くのドキュメントタイプがあります。LiveLinkコネクションはこれらのすべてのドキュメント種類のコンテンツを処理することができます。</p>
-                <p>LiveLinkコネクションで処理するコンテンツのセキュリティはLiveLink権限で管理されています。LiveLink権限コネクションについては「OpenText LiveLink権限コネクション」を参照してください。</p>
-                <p>LiveLinkコネクションを選択すると次のタブが表示します:「サーバ」、「ドキュメントアクセス」、「ドキュメント表示」。「サーバ」タブからは、接続するLiveLinkサーバの選択と接続するための認証情報を設定することができます。「ドキュメントアクセス」タブからはLiveLinkからコンテンツを取得するためのLiveLinkのwebインタフェースの情報を設定します。「ドキュメント表示」タブからは、検索結果を表示する取得したコンテンツのURIを作成方法を指定します。</p>
-                <p>「サーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-connection-server_ja_JP.PNG" alt="LiveLink Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>LiveLinkサーバ名、ポート番号、認証情報を入力してください。</p>
-                <p>「ドキュメントアクセス」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-connection-document-access_ja_JP.PNG" alt="LiveLink Connection, Document Access tab" width="80%"/>
-                <br/><br/>
-                <p>サーバ名は「サーバ」タブに入力した値と同じと想定されます。プロトコルを選択してください。LiveLinkサーバはHTTPデフォルト以外のポート番号を利用している場合はポート番号を入力してください。LiveLinkサーバがNTLM認証を利用している場合は、Active Directoryのユーザ名、パスワードとドメイン名を入力してください。LiveLinkサーバがHTTPSを利用している場合は、「追加」ボタンを押下して証明書をアップロードしてください。(サーバの証明書を使うこともできますが、サーバの証明書は変わる可能性がありますので注意してください。)</p>
-                <p>「ドキュメント表示」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-connection-document-view_ja_JP.PNG" alt="LiveLink Connection, Document Viewtab" width="80%"/>
-                <br/><br/>
-                <p>各ドキュメントの表示URIをアクセスURIと同じにする場合は、内容を変更しないでください。検索結果を異なるCGIで表示する場合は、このページから設定を行ってください。</p>
-                <p>入力した後に「保存」ボタンを押下してくだしあ。次のような設定内容概要ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-connection-status_ja_JP.PNG" alt="LiveLink Connection Status" width="80%"/>
-                <br/><br/>
-                <p>エラーメッセージが表示された場合は、設定を修正してください。画面例では正しく設定されたため、コネクション状態は「起動」と表示されています。</p>
-                <p></p>
-                <p>ジョブでLiveLinkコネクションを選択すると次のタブが表示します:「パス」、「フィルタ」、「セキュリティ」、「メタデータ」。</p>
-                <p>「パス」タブからはLiveLinkが索引を作成する起点となるパス一覧を設定します。「パス」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-job-paths_ja_JP.PNG" alt="LiveLink Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>ドロップダウンリストから選択して「+」ボタンを押下してパスを作成してください。パスを作成し終わったら「追加」ボタンを押下して一覧に追加してください。</p>
-                <p>「フィルタ」タブからはLiveLinkジョブが対象する含む/除外するコンテンツの条件を指定します。ファイルはルール一覧です。各ルールはパスを特定する条件を指定します。各ルールはファイル名条件(例:「*.txt」)、ファイルまたはフォルダ名を特定するのかの指定、出力コネクションでファイルから索引を作成するか否か、ファイルを含むか除外するかの指定が含まれます。ファイル名の指定にはワイルドカード文字「*」と「?」を使うこともできます。「*」は0以上の任意の文字と一致します。「?」は任意の1文字と一致します。その他の文字は記述通りに一致する必要があります。</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-job-filters_ja_JP.PNG" alt="LiveLink Job, Filters tab" width="80%"/>
-                <br/><br/>
-                <p>一致させる値を入力し、一致した場合の処理を選択した後に「追加」ボタンを押下してルールをフィルタ一覧に追加してください。</p>
-                <p>「セキュリティ」タブからジョブで対象とするコンテンツのLiveLinkセキュリティを無効/有効に設定することができます。「セキュリティ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-job-security_ja_JP.PNG" alt="LiveLink Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>セキュリティを無効にするとアクセストークンをジョブのすべての索引を作成するコンテンツに指定することができます。アクセストークンの形式はジョブのリポジトリコネクションで利用する権限によります。トークンを入力して「追加」ボタンを押下して一覧に追加してください。</p>
-                <p>「メタデータ」タブからは索引に渡すLiveLinkのメタデータを指定することができます。「メタデータ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/livelink-job-metadata_ja_JP.PNG" alt="LiveLink Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>LiveLinkのすべてのメタデータを索引に渡す場合は、「すべてのメタデータ」ラジオボタンをチェックしてください。特定のメタデータのみを渡す場合は、LiveLinkメタデータパスをメタデータ一覧に追加してください。次のメタデータ句を選択して「+」ボタンを押下してパスに追加してください。フォルダ情報、メタデータカテゴリを追加することができます。</p>
-                <p>メタデータカテゴリに辿りついたら、メタデータ属性を選択するか、「このカテゴリのすべての属性」チェックボックスをチェックしてください。入力が終わったら「追加」ボタンを押下して索引に含むメタデータ属性を追加してください。</p>
-                <p>「パスメタデータ」タブからはコンテンツ毎のパス情報を索引にメタデータとして送るように指定することができます。送るようにする場合は、項目「パス属性名」にメタデータ属性名を入力して、ルールをルール一覧に追加してください。各ルールに一致する正規表現の式で構成されます。変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、ルールの一致条件が<code>.*/(.*)/(.*)/.*</code>で置き換え文字列<code>$(1) $(2)/</code>とした場合、パス<code>Project/Folder_1/Folder_2/Filename</code>は<code>Folder_1 Folder_2</code>に変換されます。</p>
-                <p>1つ以上のルールが存在する場合は、上から実行され、上のルールの結果は下のルールで変更されます。</p>
-            </section>
-            
-            <section id="mexexrepository">
-                <title>Memex Patriarchリポジトリコネクション</title>
-                <p>Memex PatriachコネクションはMemexサーバのコンテンツの索引を作成します。</p>
-                <p>Memexコネクションで処理するコンテンツのセキュリティはMemex権限で管理されています。Memex権限コネクションの設定については「Memex Patriarch権限コネクション」を参照してください。</p>
-                <p>リポジトリコネクション編集ページからMemexコネクションを選択すると次のタブが表示されます:「Memexサーバ」、「Webサーバ」。「Memexサーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/memex-connection-memex-server_ja_JP.PNG" alt="Memex Connection, Memex Server tab" width="80%"/>
-                <br/><br/>
-                <p>Memexサーバ名、コネクションポート番号、コンテンツを取得できる権限をもつMemexユーザの認証情報を入力して下さい。また、Memexサーバで利用している文字エンコーディングとタイムゾーンも入力してください。</p>
-                <p>「Webサーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/memex-connection-web-server_ja_JP.PNG" alt="Memex Connection, Web Server tab" width="80%"/>
-                <br/><br/>
-                <p>Memexコンテンツ毎に一意のURLを作成できる情報を入力してください。プロトコルを選択して、サーバ名とポート番号を入力してください。</p>
-                <p>入力した後に「保存」ボタンを押下してください。次のような状態ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/memex-connection-status_ja_JP.PNG" alt="Memex Connection Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>ジョブからMemexコネクションを選択すると次のタブが表示されます:「レコード条件」、「エンティティ」、「セキュリティ」。</p>
-
-            </section>
-            
-            <section id="meridiorepository">
-                <title>Meridioリポジトリコネクション</title>
-                <p>Autonomy Meridioコネクションは、Meridoサーバのコンテンツから索引を作成します。Meridioのアーキテクチャはサービスを複数のサーバに分散させることを可能にしています(例:ドキュメントサービスを一つのサーバで稼動させ、レコードサービスを別のサーバで稼動させる)。そのため、Meridioコネクションタイプでは、Meridioサーバ毎に設定を行えるようになっています。</p>
-                <p>Meridioコネクションで処理するコンテンツのセキュリティはMeridio権限を利用します。Meridio権限コネクションについてはMeridio権限コネクション」を参照してください。</p>
-                <p>リポジトリコネクションページからMeridioコネクションを選択すると次のタブが表示します:「ドキュメントサーバ」、「レコードサーバ」、「Webクライアント」、「認証」。「ドキュメントサーバ」タブを選択すると次のようなページが表示します:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-connection-document-server_ja_JP.PNG" alt="Meridio Connection, Document Server tab" width="80%"/>
-                <br/><br/>
-                <p>プロトコルを選択してサーバ名、ポート番号、Meridioドキュメントサーバサービスのアドレスを入力してください。プロキシを利用している場合は、プロキシホストアドレスとポート番号を入力してください。認証プロキシは現リリースでは未対応です。</p>
-                <p>Meridioシステムの場合は異なるサービス毎にサーバを設けることができますが、一般には複数のサービスが同じサーバで動作しています。ただし、コネクションタイプ設定からは異なるサーバを指定することもできます。</p>
-                <p>「レコードサーバ」タブを選択すると、次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-connection-records-server_ja_JP.PNG" alt="Meridio Connection, Records Server tab" width="80%"/>
-                <br/><br/>
-                <p>プロトコル、サーバ名、ポート番号、Meridioレコードサーバサービスのアドレスを入力してください。プロキシを利用している場合は、プロキシホストとポート番号も入力してください。認証プロキシは現リリースでは未対応です。</p>
-                <p>Meridioシステムの場合は異なるサービス毎にサーバを設けることができますが、一般には複数のサービスが同じサーバで動作しています。ただし、コネクションタイプ設定からは異なるサーバを指定することもできます。</p>
-
-                <p>「Webクライアント」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-connection-web-client_ja_JP.PNG" alt="Meridio Connection, Web Client tab" width="80%"/>
-                <br/><br/>
-                <p>Meridioコネクションwebクライアントタブからは索引を作成したコンテンツ毎にURIを作成します。プロトコルを選択して、サーバ名、ポート番号、Miridio webクライアントサービスのアドレスを入力してください。このサービスからコンテンツを取得しないため、プロキシ情報は不要です。</p>
-                <p>「認証」タブを選択すると、以下のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-connection-credentials_ja_JP.PNG" alt="Meridio Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>Meridioシステム用ユーザの認証情報を入力してください。</p>
-                <p>入力したら、「保存」ボタンを押下してください。次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/meridio-connection-status_ja_JP.PNG" alt="Meridio Connection Status" width="80%"/>
-                <br/><br/>
-                <p>表示されている画面ではMeridio権限サーバがWindowsドメインに接続できないためエラーになっています。</p>
-                <p>MeridioはWindows IISの認証機能を利用します。IIS及びWindowsドメインが正しく設定されていない場合は、Meridioも正常に動作しない場合があります。問題が発生した場合は、Meridio担当技術者に問い合わせてください。また、以下のようなデバッグツールを使うこともできます:</p>
-                <br/>
-                <ul>
-                    <li>Windowsセキュリティイベントログ</li>
-                    <li>ManifoldCFログ(以下の参照)</li>
-                    <li>パケットキャプチャ(WireSharkなどのツールを利用)</li>
-                </ul>
-                <br/>
-                <p>その他のManifoldCFログ情報が必要な場合はソフトウエアを修正する必要があります。</p>
-                <p></p>
-                <p>ジョブからMeridioコネクションを選択した場合は次のタブが表示されます:「検索パス」、「コンテンツタイプ」、「分類」、「データタイプ」、「セキュリティ」、「メタデータ」。</p>
-            </section>
-            
-            <section id="sharepointrepository">
-                <title>Microsoft SharePointリポジトリコネクション</title>
-                <p>Microsoft SharePointコネクションタイプは、Microsoft SharePointサイトのコンテンツの索引を作成します。SharePointサーバに複数のサイトを構築することができます。SharePointには関連しているサイト(例えばサブサイトの場合)と単独なサイトがあります。</p>
-                <p>SharePointコネクションタイプは1つのSharePointリポジトリコネクションからルートサイトの明示的なサブサイトを介してすべてのSharePointサイトをアクセスできるように設計されています。大きなSharePointサイトの場合はこのような1つのコネクションから<b>すべて</b>のSharePointサイトをアクセスできるようにする要求が高いです。ただし現バージョンのManifoldCFでは未対応です。</p>
-                <p>SharePointはサイト、サブサイト、ライブラリ、ファイルをアドレスにweb URIを利用します。そのため、SharePointコネクションタイプを調べる一番よい方法はwebブラウザからクロールしたいサイトのルートからページを開いていき、URLを記録することです。</p>
-                <p>多くの場合は、SharePointコネクションで処理されるコンテンツのセキュリティはActive Directoryで管理されています。Active Directory権限を作成していない場合は、「Active Directory権限コネクション」を参照してください。</p>
-                <p>リポジトリコネクション編集からSharePointコネクションを選択すると「サーバ」タブが表示します。「サーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/sharepoint-configure-server_ja_JP.PNG" alt="SharePoint Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>プロダウンリストからSharePointサーバのバージョンを選択してください。間違ったバージョンを選択すると、索引ができなかったり権限情報が正しく取得されない場合があります。</p>
-                <p>サーバのプロトコルを選択してSharePointサイトを調べて記録したURIからサーバ名とポート番号を入力してください。項目「サイトパス」にはルートサイトURIのサーバアドレスとポート番号以降の最後の「aspx」ファイル以外の文字列を入力してください。例えばSharePoint URIが「http://myserver:81/sites/somewhere/index.asp」の場合は、サイトパスは「/sites/somewhere」です。</p>
-                <p>SharePointの認証を使ってルートサイトにログインします。SharePointコネクションタイプのユーザ名は必ず「domain\user」形式で記入してください。</p>
-                <p>SharePointサーバがSSLを利用している場合は、SharePointサーバのSSLサーバ認証サーバ証明書または認証局からの証明書を設定してください。参照から証明書を選択して、「追加」ボタンを押下してください。</p>
-                <p>「保存」ボタンを押下すると次のような接続設定概要ページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/sharepoint-status_ja_JP.PNG" alt="SharePoint Status" width="80%"/>
-                <br/><br/>
-                <p>画面例ではSharePointコネクションはSharePointインスタンスを参照できないためエラーメッセージが表示されています。</p>
-                <p>SharePointは認証にWindows IISを利用します。SharePointが稼動しているIIS及びWindowsドメインでの問題のためSharePointコネクションが正常に動作しない場合もありますので注意してください。問題が発生した場合は次のようなデバッグツールを使うことができます:</p>
-                <br/>
-                <ul>
-                    <li>Windowsセキュリティイベントログ</li>
-                    <li>ManifoldCFログ(以下の参照)</li>
-                    <li>パケットキャプチャ(WireSharkなどのツールを利用)</li>
-                </ul>
-                <br/>
-                <p>標準以外のログ情報が必要な場合はソフトウエアを修正する必要があります。</p>
-                <p></p>
-                <p>SharePointリポジトリコネクションを選択した場合は、次のようなタブが表示されます:「パス」、「セキュリティ」、「メタデータ」。</p>
-                <p>「パス」タブからはジョブに含む/除外するSharePointコンテンツを指定するルール一覧を作成ことができます。SharePointコネクションタイプがサブサイト、ライブラリ、ファイルを見つけた場合は、このルール一覧を参照して含むか除外するかを判断します。最初に一致したルールが適用されます。</p>
-                <p>各ルールはパス、ルールタイプ、処理から構成されます。処理とは「含む」か「除外」するかです。ルールタイプはコネクションにどのタイプのSharePointエンティティかを識別ます。例えば、「ファイル」ルールはSharePointパスがファイルの場合のみ一致して、サイト及びライブラリには一致しません。パスは文字列です。ワイルドカード文字「*」と「?」を使うこともできます。「*」は0以上の任意の文字と一致します。「?」は任意の1文字と一致します。その他の文字は記述通りに一致する必要があります。</p>
-                <p>暗黙的に一致するルールも定義することができます。「含む」の「ファイル」を選択した場合は、サイトとライブラリも暗黙的に「含む」になります。例えば、「/MySite/MyLibrary/MyFile」を「含む」ルールを定義した場合は、暗黙的に「"/MySite」サイトを含むサイトルールと「/MySite/MyLibrary」を含むライブラリルールも定義されます。同じようにライブラリを含むルールを定義した場合はサイトを含むルールも定義されます。これらの暗黙ルールは「含む」ルールのみに定義されます。除外ルールには暗黙ルールはありません。</p>
-                <p>「パス」タブからルールを作成して一覧に追加/挿入することができます。「パス」タブを選択すると次のようなページが表示されます。コネクションが正常に動作していない場合は、プルダウンに表示する項目が少ない場合もあります。</p>
-                <br/><br/>
-                <figure src="images/ja_JP/sharepoint-job-paths_ja_JP.PNG" alt="SharePoint Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>ルールを定義するには、まず一致するパスを指定します。パスを選択または入力して「サイトの追加」ボタン、「ライブラリの追加」ボタン、「テキストの追加」ボタンの一つを押下してください。完全のパスを指定するまで、追加を繰り返してください。SharePointコネクションがパスのエンティティを判断できない場合は、SharePointエンティティを手動で選択してください。次に「含む」または「除外」用のルールかを選択してください。最後に「新しいルールを追加」ボタンを押下してルールをルール一覧に追加してください。</p>
-                <p>「セキュリティ」タブからSharePointセキュリティをコンテンツに適用するか指定することができます。ジョブが対象とするコンテンツにアクセストークンを付けることもできます。「セキュリティ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/sharepoint-job-security_ja_JP.PNG" alt="SharePoint Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>SharePointセキュリティ有効/無効のラジオボタンを選択してください。セキュリティを無効にした場合は、アクセストークンを設定することができます。アクセストークンを入力して「追加」ボタンを押下してくだしあ。アクセストークンはSharePointコネクションが利用できる形式にしてください。</p>
-                <p>「メタデータ」タブからは各コンテンツに含むメタデータを指定することができます。「メタデータ」タブの内容は「パス」タブと類似しています。「メタデータ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/sharepoint-job-metadata_ja_JP.PNG" alt="SharePoint Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>「パス」タブとの違いは、個々のサイト、ライブラリ、コンテンツを含む/除外するルールを定義する代わりにコンテンツに含む/除外するメタデータを定義します。メタデータはファイルのみに提供可能なため、サイト及びライブラリ用のメタデータパスルールはありません。</p>
-                <p>除外ルールがファイルパスに一致した場合は、そのファイルからの<b>すべて</b>のメタデータが除外されます。除外ルールで個々の項目を除外することはできません。</p>
-                <p>ルールを定義するには、まず一致するパスを指定します。パスを選択または入力して「サイトの追加」ボタン、「ライブラリの追加」ボタン、「テキストの追加」ボタンの一つを押下してください。完全のパスを指定するまで、追加を繰り返してください。SharePointコネクションがパスのエンティティを判断できない場合は、SharePointエンティティを手動で選択してください。次に「含む」または「除外」用のルールかを選択してください。最後に「新しいルールを追加」ボタンを押下してルールをルール一覧に追加してください。</p>
-                <p>「パスメタデータ」タブからはコンテンツ毎のパス情報を索引にメタデータとして送るように指定することができます。送るようにする場合は、項目「パス属性名」にメタデータ属性名を入力して、ルールをルール一覧に追加してください。各ルールに一致する正規表現の式で構成されます。変換元と値は括弧(「(」と「)」)で囲みます。括弧に囲まれた部分を「グループ」と言います。置き換え文字列は、固定文字と置き換えグループから構成されます。例えば、「$(1)」は最初に一致したグループを示し、「$(1l)」は最初に一致した小文字のグループを示します。同じように「$(1u)」は大文字にマップしたグループを示します。</p>
-                <p>例えば、ルールの一致条件が<code>.*/(.*)/(.*)/.*</code>で置き換え文字列<code>$(1) $(2)/</code>とした場合、パス<code>Project/Folder_1/Folder_2/Filename</code>は<code>Folder_1 Folder_2</code>に変換されます。</p>
-                <p>1つ以上のルールが存在する場合は、上から実行され、上のルールの結果は下のルールで変更されます。</p>
-            </section>
-            
-            <section id="cmisrepository">
-              <title>CMISリポジトリコネクション</title>
-              <p>CMISリポジトリコネクションタイプは、CMIS準拠リポジトリのコンテンツの索引を作成します。</p>
-              <p>デフォルト設定では、各CMISコネクションは一つのCMISリポジトリを処理します。複数のCMISリポジトリがある場合は、CMISリポジトリ毎にCMISコネクションを作成する必要があります。</p>
-              <br/>
-              <p>リポジトリコネクション編集ページからCMISコネクションを選択すると次のような項目を設定することができます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-repository-connection-configuration_ja_JP.PNG" alt="CMIS Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>CMISバインディングプロトコル(AtomPubまたはWeb Service)を選択して、ユーザ名、パスワード、CMISドキュメントサーバサービスのエンドポイントを入力してください。</p>
-              <p>エンドポイントはCMISサービスのHTTPプロトコル、ホスト名、ポート番号、コンテキストパスから構成されます:</p>
-              <br/><br/>
-              <p><code>http://ホスト名:ポート番号/CMISコンテキストパス</code></p>
-              <br/><br/>
-              <p>公開されているCMISリポジトリを一つ選択するためにリポジトリIDを入力することもできます。もしnullの場合は、CMISコネクタはCMISサーバが公開している最初のCMISリポジトリを利用します。</p>
-              <br/>
-              <p>CMISシステムは特定のバイディングプロトコルは独自のコンテキストパスがあります。即ち、エンドポイントは異なります:</p>
-              <p>OpenCMISが提供する実際のInMemoryサーバが公開するAtomPubバイディングのエンドポイントは次の通りです:</p>
-              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/atom</code></p>
-              <br/><br/>
-              <p>Web Serviceは別のエンドポイントで公開されます:</p>
-              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/services/RepositoryService</code></p>
-              <br/><br/>
-              <p>「保存」ボタンを押下すると、次のようなコネクション概要ページが表示されます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-repository-connection-configuration-save_ja_JP.PNG" alt="CMIS Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>ジョブでCMISリポジトリコネクションを選択すると「CMISクエリー」タブが表示されます。「CMISクエリー」タブを選択すると次のようなページが表示されます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-repository-connection-job-cmisquery_ja_JP.PNG" alt="CMIS Repository Connection, CMIS Query" width="80%"/>
-              <br/><br/>
-              <p>「CMISクエリー」タブからはコンテンツを取得するCMISクエリー言語のクエリー文を設定することができます。</p>
-              <p>CMISコネクタはコンテンツの読込み中にフォルダノード(baseTypeがcmis:folderのノード)を見つけた場合は、フォルダ内のコンテンツも読込みます。フォルダではない場合(baseTypeがcmis:document)は、コンテンツを読込んで処理します。</p>
-              <p>入力した後には「保存」ボタンを押下してください。次のように設定概要が表示されます:</p>
-              <br/><br/>
-              <figure src="images/ja_JP/cmis-repository-connection-job-save_ja_JP.PNG" alt="CMIS Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-
-            <section id="wikirepository">
-                <title>Wikiリポジトリコネクション</title>
-                <p>Wikiリポジトリコネクションタイプは、Wiki及びMediaWikiサイトのコンテンツから索引を作成します。WikiリポジトリコネクションタイプはWiki APIを介してコンテンツを取得します。一般公開されている内容のみから索引を作成するため、認証設定はありません。</p>
-                <p>このコネクションタイプでは、ジョブごとに手入力されたアクセストークン以外のいかなる種類の文書セキュリティもサポートされていません。</p>
-                <p>リポジトリ編集ページで、Wikiコネクションを選択すると、「サーバ」タブが表示されます。「サーバ」タブを選択すると次のようなページが表示されます:</p>
-                <br/><br/>
-                <figure src="images/ja_JP/wiki-configure-server_ja_JP.PNG" alt="Wikiコネクション、サーバタブ" width="80%"/>
-                <br/><br/>
-                <p>プロトコルは「プロトコル」ドロップダウンリストから選択してください。現バージョンは「http」プロトコルのみに対応しています。サーバ名を項目「サーバ名」に、ポート番号を項目「ポート」に入力してください。最後に、WikiのURLのパス部分を項目「パス名」に入力してください。URLのパス部分の先頭は文字「/」にしてください。</p>
-                <p>ジョブのリポジトリコネクションにはWikiタイプ固有のタブは現バージョンにはありません。</p>
-            </section>
-            
-            
-        </section>
-
-</body>
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/faq.xml b/site/src/documentation/content/xdocs/ja_JP/faq.xml
deleted file mode 100644
index b2d3202..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/faq.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Q&A</title> 
-  </header> 
-
-  <body> 
-
-      <section>
-        <title>エンドユーザ</title>
-        <p>質問はuser@manifoldcf.apache.orgへメールしてください。</p>
-      </section>
-      
-      <section>
-         <title>開発者</title>
-         <p><a href="https://cwiki.apache.org/confluence/display/CONNECTORS/FAQ">Wiki</a>を参照してください。
-         </p>
-      </section>
-
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml b/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml
deleted file mode 100644
index 50e2807..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml
+++ /dev/null
@@ -1,1348 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Building ManifoldCF</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Building ManifoldCF</title>
-      <p></p>
-      <p>ManifoldCF consists of a framework, a set of connectors, and an optional Apache2 plug-in module.  These can be built as follows.</p>
-      <p></p>
-      
-      <section>
-        <title>Building overview</title>
-        <p></p>
-        <p>There are two ways to build ManifoldCF.  The primary means of building (and the most supported) is via Apache Ant.  The ant build is used to
-          create ManifoldCF releases and to run tests, load tests, and UI tests. Maven is also supported for develop building only.  Maven ManifoldCF builds have
-          many restrictions and challenges and are of secondary priority for the development team.</p>
-        <p>The ManifoldCF framework is built without any dependencies on connector code.  It consists of a set of jars, a family of web applications, and
-          a number of java command classes.  Connectors are then built that have well-defined dependencies on the framework
-          modules.  A properly built connector typically consists of:</p>
-        <p></p>
-        <ul>
-           <li>One or more jar files meant to be included in the library area meant for connector jars and their dependencies.</li>
-           <li>Possibly some java commands, which are meant to support or configure the connector in some way.</li>
-           <li>Possibly a connector-specific process or two, each requiring a distinct classpath, which usually serves to isolate the <strong>crawler-ui</strong> servlet,
-            <strong>authority-service</strong> servlet, <strong>agents</strong> process, and any commands from problematic aspects of the client environment</li>
-           <li>A recommended set of java "define" variables, which should be used consistently with all involved processes, e.g. the <strong>agents</strong> process, the
-            application server running the <strong>authority-service</strong> and <strong>crawler-ui</strong>, and any commands.  (This is historical, and no connectors
-            as of this writing have any of these any longer).</li>
-        </ul>
-        <p></p>
-        <p>An individual connector package will typically supply an output connector, or a transformation connector, or a mapping connector, or a repository connector, or
-          sometimes both a repository connector and an authority connector.  The
-          main ant build script automatically forms each individual connector's contribution to the overall system into the overall package.</p>
-      </section>
-      
-      <section>
-        <title>Building the framework and the connectors using Apache Ant</title>
-        <p></p>
-        <p>To build the ManifoldCF framework code, and the particular connectors you are interested in, you currently need to do the following:</p>
-        <p></p>
-        <ol>
-          <li>Check out the desired release from https://svn.apache.org/repos/asf/manifoldcf/tags, or unpack the desired source distribution.</li>
-          <li>cd to the top-level directory.</li>
-          <li><strong>EITHER:</strong> overlay the lib directory from the corresponding lib distribution (preferred, where possible), <strong>OR</strong> run "ant make-core-deps" to
-            build the code dependencies.  The latter is the only possibility if you are building from trunk, but it is not guaranteed to work for older releases.</li>
-          <li>Run "ant make-deps", to download LGPL and other open source but non-Apache compatible libraries.</li>
-          <li>Install proprietary build dependencies.  See below for details.</li>
-          <li>Run "ant build".</li>
-          <li>Install desired dependent proprietary libraries.  See below for details.</li>
-        </ol>
-        <p></p>
-        <p>If you do not run the ant "make-deps" target, and you supply <strong>NO</strong> LGPL or proprietary libraries, not all capabilities of ManifoldCF will be available.
-            The framework itself and the following repository connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Alfresco Webscript connector</li>
-          <li>Amazon S3 connector</li>
-          <li>CMIS connector</li>
-          <li>Atlassian Confluence connector</li>
-          <li>EMC Documentum connector, built against a Documentum API stub</li>
-          <li>DropBox connector</li>
-          <li>Email connector</li>
-          <li>FileNet connector, built against a FileNet API stub</li>
-          <li>WGET-compatible filesystem connector</li>
-          <li>Generic XML repository connector</li>
-          <li>Google Drive connector</li>
-          <li>GridFS connector (mongoDB)</li>
-          <li>HDFS connector</li>
-          <li>JDBC connector, with the just the POSTGRESQL jdbc driver</li>
-          <li>Atlassian Jira connector</li>
-          <li>OpenText LiveLink connector, built against a LiveLink API stub</li>
-          <li>Meridio connector, built against modified Meridio API WSDLs and XSDs</li>
-          <li>RSS connector</li>
-          <li>Microsoft SharePoint connector, built against SharePoint API WSDLs</li>
-          <li>Webcrawler connector</li>
-          <li>Wiki connector</li>
-        </ul>
-        <p></p>
-        <p>The following authority connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Active Directory authority</li>
-          <li>Alfresco Webscript authority</li>
-          <li>Amazon S3 authority</li>
-          <li>CMIS authority</li>
-          <li>Atlassian Confluence authority</li>
-          <li>EMC Documentum authority</li>
-          <li>Atlassian Jira authority</li>
-          <li>LDAP authority</li>
-          <li>OpenText LiveLink authority</li>
-          <li>Meridio authority, built against modified Meridio API WSDLs and XSDs</li>
-          <li>Null authority</li>
-          <li>Microsoft SharePoint/AD authority</li>
-          <li>Microsoft SharePoint/Native authority, built against SharePoint API WSDLs</li>
-        </ul>
-        <p></p>
-        <p>The following output connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Amazon Cloud Search output connector</li>
-          <li>WGET-compatible filesystem output connector</li>
-          <li>MetaCarta GTS output connector</li>
-          <li>Apache Solr output connector</li>
-          <li>OpenSearchServer output connector</li>
-          <li>ElasticSearch output connector</li>
-          <li>WGET-compatible filesystem output connector</li>
-          <li>HDFS output connector</li>
-          <li>Kafka output connector</li>
-          <li>Null output connector</li>
-          <li>Searchblox output connector</li>
-        </ul>
-        <p></p>
-        <p>The following transformation connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Field mapping transformation connector</li>
-          <li>Document filter transformation connector</li>
-          <li>OpenNLP transformation connector</li>
-          <li>Null transformation connector</li>
-          <li>Tika extractor transformation connector</li>
-        </ul>
-        <p></p>
-        <p>The following mapping connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Regular-expression mapping connector</li>
-        </ul>
-        <p></p>
-        <p>The following notification connectors will be built:</p>
-        <p></p>
-        <ul>
-          <li>Email notification connector</li>
-        </ul>
-        <p></p>
-        <p>The dependencies and build limitations of each individual LGPL and proprietary connector is described in separate sections below.</p>
-        <p></p>
-            
-        <section>
-          <title>Building and testing the legacy Alfresco connector</title>
-          <p></p>
-          <p>The legacy Alfresco connector requires the Alfresco Web Services Client provided by Alfresco in order to be built. Place this jar into the directory <em>connectors/alfresco/lib-proprietary</em> before you build.
-              This will occur automatically if you execute the ant target "make-deps" from the ManifoldCF root directory.</p>
-          <p></p>
-          <p>To run integration tests for the connector you have to copy the alfresco.war including H2 support created by the Maven module test-materials/alfresco-4-war (using "mvn package" inside the folder)
-              into the <em>connectors/alfresco/test-materials-proprietary</em> folder.  Then use the "ant test" or "mvn integration-test" for the standard build to execute integration tests.</p>
-          <p></p>
-        </section>
-
-        <section>
-          <title>Building and testing the Alfresco Webscript connector</title>
-          <p></p>
-          <p>The Alfresco Webscript connector is built against an open-source Alfresco Indexer client, which requires a corresponding Alfresco Indexer plugin
-                to be installed on your Alfresco instance.  This Alfresco Indexer plugin is included with ManifoldCF distributions.  Installation of the plugin should follow the
-                standard Alfresco installation steps, as described <a href="http://docs.alfresco.com/4.1/tasks/amp-install.html">here</a>.
-                See <a href="https://github.com/maoo/alfresco-indexer">this page</a> for configuration details, and for the plugin itself.</p>
-          <p></p>
-        </section>
-
-        <section>
-          <title>Building and running the Documentum connector</title>
-          <p></p>
-          <p>The Documentum connector requires EMC's DFC product in order to be run, but is built against a set of stub classes.
-              The stubs mimic the class structure of DFC 6.0.  If your DFC is newer, it is possible that the class structure of the DFC
-              classes might have changed, and you may need to build the connector yourself.</p>
-          <p>If you need to supply DFC classes during build time, copy the DFC and dependent jars to the source directory
-              <em>connectors/documentum/lib-proprietary</em>, and build using "ant build".  The jars will be copied  into
-              the right place in your <em>dist</em> directory automatically.</p>
-          <p>For a binary distribution, just copy the DFC jars to <em>processes/documentum-server/lib-proprietary</em> instead.</p>
-          <p>If you have done everything right, you should be able to start the Documentum connector's registry and server processes, as per the instructions.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the FileNet connector</title>
-          <p></p>
-          <p>The FileNet connector requires IBM's FileNet P8 API jar in order to be run, but is usually built against a set of stub classes.
-              The stubs mimic the class structure of FileNet P8 API 4.5.  If your FileNet is newer, it is possible that the class structure of the
-              API might have changed, and you may need to build the connector yourself.</p>
-          <p>If you need to supply your own Jace.jar at build time, copy it to the source directory <em>connectors/filenet/lib-proprietary</em>,
-              and build using "ant build".  The Jace.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>
-          <p>If you do not wish to build, simply copy your Jace.jar and the other dependent jars from that installation into the distribution directory
-              <em>processes/filenet-server/lib-proprietary</em>.</p>
-          <p>If correctly done, you will be able to start the FileNet connector's registry and server processes, as per the instructions.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the JDBC connector, including Oracle, MSSQL, MySQL, SQLServer, and Sybase JDBC drivers</title>
-          <p></p>
-          <p>The JDBC connector also knows how to work with Oracle, SQLServer, and Sybase JDBC drivers.  In order to support these databases, start by placing the mysql-connector-java.jar
-            and the jtds.jar in the <em>lib-proprietary</em> directory.  The ant target "make-deps" will do this for you automatically.  For Oracle, download the appropriate
-            Oracle JDBC jar from the Oracle site, and copy it into the same directory before you build ManifoldCF.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the jCIFS/Windows Shares connector</title>
-          <p></p>
-          <p>To build this connector, you need to download jcifs.jar from <a href="http://jcifs.samba.org">http://jcifs.samba.org</a>, and copy it into the <em>connectors/jcifs/lib-proprietary</em>
-              directory before building.  You can also just type "ant make-deps" from the root ManifoldCF directory and this step will be done for you.</p>
-          <p>If you have downloaded a binary distribution, place the jcifs.jar into the <em>connector-lib-proprietary</em> directory, and uncomment the Windows Shares line in the <em>connectors.xml</em> file.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the LiveLink connector</title>
-          <p></p>
-          <p>This connector needs OpenText's LAPI package in order to be run.  It is usually built against a set of stubs. The stubs, however, mimic the
-              class structure of LAPI 9.7.1.  Later versions (such as 10.x) have a different class structure.  Therefore, you may need to rebuild ManifoldCF
-              against your lapi.jar, in order for the connector to work properly.</p>
-          <p>If you need to supply your own lapi.jar and llssl.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".
-              The lapi.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>
-          <p>If you do not wish to build, simply copy your lapi.jar and llssl.jar into the binary distribution's <em>connector-lib-proprietary</em>
-              directory, and uncomment the LiveLink-related connector lines in <em>connectors.xml</em> file.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building the Meridio connector</title>
-          <p></p>
-          <p>The Meridio connector generates interface classes using checked-in wsdls and xsds originally obtained
-              from an installed Meridio instance using <strong>disco.exe</strong>, and subsequently modified to work
-              around limitations in Apache Axis.  The <strong>disco.exe</strong> utility is installed as part of
-              Microsoft Visual Studio, and is typically found under "c:\Program Files\Microsoft SDKs\Windows\V6.x\bin".
-              If desired, you can obtain unmodified wsdls and xsds by interrogating the following Meridio web services:</p>
-          <p></p>
-          <ul>
-             <li>http[s]://&#60;meridio_server&#62;/DMWS/MeridioDMWS.asmx</li>
-             <li>http[s]://&#60;meridio_server&#62;/RMWS/MeridioRMWS.asmx</li>
-          </ul>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Building and running the SharePoint connector</title>
-          <p></p>
-          <p>The SharePoint connector generates interface classes using checked-in wsdls originally obtained
-            from an installed Microsoft SharePoint instance using <strong>disco.exe</strong>.  The <strong>disco.exe</strong> utility is installed as part of
-            Microsoft Visual Studio, and is typically found under "c:\Program Files\Microsoft SDKs\Windows\V6.x\bin".
-            If desired, you can obtain unmodified wsdls by interrogating the following SharePoint web services:</p>
-          <p></p>
-          <ul>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Permissions.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Lists.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Dspsts.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/usergroup.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/versions.asmx</li>
-             <li>http[s]://&#60;server_name&#62;/_vti_bin/webs.asmx</li>
-          </ul>
-          <p></p>
-          <p><strong>Important:</strong> For SharePoint instances version 3.0 (2007) or higher, in order to run the connector, you also must deploy a custom SharePoint web service
-            on the SharePoint instance you intend to connect to.  This is required because Microsoft overlooked support for web-service-based access to file and folder security information
-            when SharePoint 2007 was released.  For SharePoint version 4.0 (2010), the service is even more critical, because backwards compatibility was not maintained and without
-            this service no crawling can occur.  SharePoint version 5.0 (2013) also requires a plugin; although its functionality is the same as for SharePoint 4.0, the binary you install
-            is built against SharePoint 2013 resources rather than SharePoint 2010 resources, so there is a different distribution.</p>
-          <p>The versions of this service can be found in the distribution directory <em>plugins/sharepoint</em>.
-            Pick the version appropriate for your SharePoint installation, and install it following the instructions in the file <strong>Installation Readme.txt</strong>, found in the
-            corresponding directory.</p>
-          <p></p>
-        </section>
-
-        <section>
-          <title>Running the Apache OpenNLP transformation connector</title>
-          <p></p>
-          <p>The Apache OpenNLP transformation connector requires OpenNLP models in order to be useful.  These models should be downloaded or created by you, and
-            must be placed in the <em>file-resources</em> folder.  This will allow the connector to find them and allow you to use them.</p>
-          <p>The models available publicly for OpenNLP can be downloaded from this URL: <a href="http://opennlp.sourceforge.net/models-1.5/">http://opennlp.sourceforge.net/models-1.5/</a>.  To use the
-            connector, you <strong>must</strong> specify a sentence model and a tokenization model.  You can specify as few or as many content extraction models as you
-            wish.</p>
-          <p></p>
-          <p><strong>If you do not download or otherwise provide models for the OpenNLP connector's use, it will not be possible to define a job which uses the connector.</strong></p>
-        </section>
-
-        <section>
-          <title>Running the Apache Solr output connector</title>
-          <p></p>
-          <p>The Apache Solr output connector requires no special attention to build or run within ManifoldCF.  However, in order for Apache Solr to be able to enforce
-              document security, you must install and properly configure a plugin for Solr.  This plugin is available for both Solr 3.x and for Solr 4.x, and can be used either
-              as a query parser plugin, or as a search component.  Additional index fields are also required to contain the necessary security information.  Much more
-              information can be found in the README.txt file in the plugins themselves.</p>
-          <p>The correct versions of the plugins are included in the <em>plugins/solr</em> directory of the main ManifoldCF distribution.  You can also download updated versions
-              of the plugins from the ManifoldCF download page.  The compatibility matrix is as follows:</p>
-          <p></p>
-          <table>
-            <caption>Apache ManifoldCF Solr 3.x and Solr 4.x plugin compatibility</caption>
-            <tr><th>ManifoldCF versions</th><th>Plugin version</th></tr>
-            <tr><td>0.1.x-1.4.x</td><td>0.x</td></tr>
-            <tr><td>1.5.x</td><td>1.x</td></tr>
-            <tr><td>&#62;=1.6.x</td><td>2.x</td></tr>
-          </table>
-          <p></p>
-          <p><strong>If the proper version of the plugin is not deployed on Solr, documents will not be properly secured.</strong>  Thus, it is essential to verify that the
-              proper plugin version has been deployed for the version of ManifoldCF you are using.</p>
-        </section>
-
-        <section>
-          <title>Running the ElasticSearch output connector</title>
-          <p></p>
-          <p>The ElasticSearch output connector requires no special attention to build or run within ManifoldCF.  However, in order for ElasticSearch to be able to enforce
-              document security, you must install, properly configure, and code against a toolkit plugin for ElasticSearch.
-              Additional index fields are also required to contain the necessary security information.  Much more information can be found in the README.txt file in the
-              plugin itself.</p>
-          <p>The correct versions of the plugin is included in the <em>plugins/elasticsearch</em> directory of the main ManifoldCF distribution.  You can also download updated versions
-              of the plugin from the ManifoldCF download page.  The compatibility matrix is as follows:</p>
-          <p></p>
-          <table>
-            <caption>Apache ManifoldCF ElasticSearch plugin compatibility</caption>
-            <tr><th>ManifoldCF versions</th><th>Plugin version</th></tr>
-            <tr><td>0.1.x-1.4.x</td><td>0.x</td></tr>
-            <tr><td>1.5.x</td><td>1.x</td></tr>
-            <tr><td>&#62;=1.6.x</td><td>2.x</td></tr>
-          </table>
-          <p></p>
-          <p><strong>If the proper version of the plugin is not deployed and properly integrated, documents will not be properly secured.</strong>  Thus, it is essential to verify that the
-              proper plugin version has been deployed for the version of ManifoldCF you are using.</p>
-
-          <p>To work with ManifoldCF, your ElasticSearch instance must also include the appropriate indexes created as well.
-              Here are some simple steps for creating an ElasticSearch index, using the CURL utility:</p>
-          <p></p>
-          <source>
-% curl -XPUT 'http://localhost:9200/manifoldcf'
-% curl -XPUT 'http://localhost:9200/manifoldcf/attachment/_mapping' -d '
-{
-  "attachment" : {
-    "_source" : {
-      "excludes" : [ "file" ]
-    },
-    "properties": { 
-      "allow_token_document" : { 
-        "type" : "string" 
-      },
-      "allow_token_parent" : { 
-        "type" : "string" 
-      },
-      "allow_token_share" : { 
-        "type" : "string" 
-      },
-      "attributes" : {
-        "type" : "string"
-      },
-      "createdOn" : {
-        "type" : "string"
-      },
-      "deny_token_document" : {
-        "type" : "string"
-      },
-      "deny_token_parent" : {
-        "type" : "string"
-      },
-      "deny_token_share" : {
-        "type" : "string"
-      },
-      "lastModified" : {
-        "type" : "string"
-      },
-      "shareName" : {
-        "type" : "string"
-      },
-      "file" : {
-        "type" : "attachment",
-        "path" : "full",
-        "fields" : {
-          "file" : {
-            "store" : true,
-            "term_vector" : "with_positions_offsets",
-            "type" : "string"
-          }
-        }
-      }
-    }
-  }
-}'
-          </source>
-          <p>This command creates an index called <code>manifoldcf</code> with a mapping named <code>attachment</code>
-                which has some generic fields for access tokens and a field <code>file</code> which makes use of the
-                ElasticSearch attachment mapper plugin. It is configured for highlighting (<code>"term_vector" : "with_positions_offsets"</code>).</p>
-          <p>The following part is useful for not saving the source json on the index which reduces the index size significantly. Be
-                aware that you shouldn't do this if you will need to re-index data on the ElasticSearch side or you need access to the
-                whole document:</p>
-          <source>
-"_source" : {
-  "excludes" : [ "file" ]
-},
-          </source>
-        </section>
-
-      </section>
-      
-      <section>
-        <title>Building the framework and the connectors using Apache Maven</title>
-        <p></p>
-        <p>ManifoldCF includes some support for building jars under Maven.  Apache Ant is considered to be ManifoldCF's primary build system, so your mileage with Maven may vary.</p>
-        <p>The biggest limitation of the current Maven build is that it does not support any of the proprietary connectors or the multi-process model of execution.
-            The build includes only the Apache-licensed and LGPL-licensed connectors, thus avoiding conditional compilation, and executes under Maven using only the
-            Quick Start example.</p>
-        <p>A canned version of all configuration files are included as resources.  If you want to change the configuration in any way, you will need to rebuild with Maven accordingly.</p>
-        <section>
-          <title>Preparation</title>
-          <p>No special preparation is required, other than to have access to the Apache Maven repository.</p>
-        </section>
-        <section>
-          <title>How to build</title>
-          <p>Building is straightforward.  In the ManifoldCF root, type:</p>
-          <source>
-mvn clean install
-          </source>
-          <p>This should generate all the necessary artifacts to run with, and also run the Hsqldb-based tests.</p>
-          <p>To build and skip only the integration tests, type:</p>
-          <source>
-mvn clean install -DskipITs   
-          </source>
-          <p>When you have the default package installed locally in your Maven repository, to only build ManifoldCF artifacts, type:</p>
-          <source>
-mvn clean package
-          </source>
-          <p>NOTE: Due to current limitations in the ManifoldCF Maven poms, you MUST run a complete "mvn clean install" as the first step.  You cannot skip steps, or the build will fail.</p>
-        </section>
-      </section>
-      
-      <section>
-        <title>Building ManifoldCF's Apache2 plugin</title>
-        <p></p>
-        <p>To build the mod-authz-annotate plugin, you need to start with a Unix system that has the apache2 development tools installed on it, plus the curl development package
-          (from <a href="http://curl.haxx.se">http://curl.haxx.se</a> or elsewhere).  Then, cd to mod-authz-annotate, and type "make".  The build will produce a file called
-          mod-authz-annotate.so, which should be copied to the appropriate Apache2 directory so it can be used as a plugin.</p>
-        <p></p>
-        <p></p>
-      </section>
-        
-    </section>
-    
-    <section>
-      <title>Running ManifoldCF</title>
-      <p></p>
-      <section>
-        <title>Overview</title>
-        <p>ManifoldCF consists of several components.  These are enumerated below:</p>
-        <p></p>
-        <ul>
-           <li>A database, which is where ManifoldCF keeps all of its configuration and state information, usually PostgreSQL</li>
-           <li>A synchronization directory, which how ManifoldCF coordinates activity among its various processes</li>
-           <li>An <strong>agents</strong> process, which is the process that actually crawls documents and ingests them</li>
-           <li>A <strong>crawler-ui</strong> servlet, which presents the UI users interact with to configure and control the crawler</li>
-           <li>An <strong>authority-service</strong> servlet, which responds to requests for authorization tokens, given a user name</li>
-           <li>An <strong>api-service</strong> servlet, which responds to REST API requests</li>
-        </ul>
-        <p></p>
-        <p>These underlying components can be packaged in many ways.  For example, the three servlets can be deployed in separate
-          war fields as separate web applications.  One may also deploy all three servlets in one combined web application, and also include the
-          agents process.</p>
-        <p></p>
-      </section>
-      <p></p>
-      <section>
-        <title>Binary organization</title>
-        <p>Whether you build ManifoldCF yourself, or download a binary distribution, you will need to know what is what in the build result.  If you build ManifoldCF yourself, the binary build
-          result can be found in the subdirectory <em>dist</em>.  In a binary distribution, the contents of the distribution are the contents of the <em>dist</em> directory.
-          These contents are described below.</p>
-        <p></p>
-        <table>
-          <caption>Distribution directories and files</caption>
-          <tr><th><em>dist</em> file/directory</th><th>Meaning</th></tr>
-          <tr><td><em>connectors.xml</em></td><td>an xml file describing the connectors that should be registered</td></tr>
-          <tr><td><em>connector-lib</em></td><td>jars for all the connectors, referred to by properties.xml</td></tr>
-          <tr><td><em>connector-lib-proprietary</em></td><td>proprietary jars for all the connectors, referred to by properties.xml; not included in binary release</td></tr>
-          <tr><td><em>obfuscation-utility</em></td><td>a utility to obfuscate passwords, for inclusion in properties.xml fields</td></tr>
-          <tr><td><em>lib</em></td><td>jars for all of the examples, referenced by the example scripts</td></tr>
-          <tr><td><em>lib-proprietary</em></td><td>proprietary jars for all of the examples, referenced by the proprietary example scripts</td></tr>
-          <tr><td><em>processes</em></td><td>scripts, classpath jars, and -D switch values needed for the required connector-specific processes</td></tr>
-          <tr><td><em>script-engine</em></td><td>jars and scripts for running the ManifoldCF script interpreter</td></tr>
-          <tr><td><em>example</em></td><td>a jetty-based example that runs in a single process (except for any connector-specific processes), excluding all proprietary libraries</td></tr>
-          <tr><td><em>example-proprietary</em></td><td>a jetty-based example that runs in a single process (except for any connector-specific processes), including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>multiprocess-file-example</em></td><td>scripts and jars for an example that uses the multiple process model using file-based synchronization, excluding all proprietary libraries</td></tr>
-          <tr><td><em>multiprocess-file-example-proprietary</em></td><td>scripts and jars for an example that uses the multiple process model using file-based synchronization, including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>multiprocess-zk-example</em></td><td>scripts and jars for an example that uses the multiple process model using ZooKeeper-based synchronization, excluding all proprietary libraries</td></tr>
-          <tr><td><em>multiprocess-zk-example-proprietary</em></td><td>scripts and jars for an example that uses the multiple process model using ZooKeeper-based synchronization, including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>web</em></td><td>app-server deployable web applications (wars), excluding all proprietary libraries</td></tr>
-          <tr><td><em>web-proprietary</em></td><td>app-server deployable web applications (wars), including proprietary libraries; not included in binary release</td></tr>
-          <tr><td><em>doc</em></td><td>javadocs for framework and all included connectors</td></tr>
-          <tr><td><em>plugins</em></td><td>pre-built integration components to deploy on target systems, e.g. for Solr</td></tr>
-          <tr><td><em>file-resources</em></td><td>a directory meant to contain file resources that are identically present on all cluster members, e.g. models for OpenNLP</td></tr>
-        </table>
-        <p></p>
-        <p>If you downloaded the binary distribution, you may notice that the <em>connector-lib-proprietary</em> directory contains only a number of 
-            <em>&#60;connector&#62;-README.txt</em> files.
-            This is because under Apache licensing rules, incompatibly-licensed jars may not be redistributed.  Each such <em>&#60;connector&#62;-README.txt</em> describes
-            the jars that you need to add to the <em>connector-lib-proprietary</em> directory in order to get the corresponding connector working.  You will also then need to uncomment
-            the appropriate entries in the <em>connectors.xml</em> file accordingly to enable the connector for use.</p>
-        <p></p>
-        <p>NOTE: The prebuilt binary distribution cannot, at this time, include support for MySQL.  Nor can the JDBC Connector access MySQL, MSSQL, SyBase, or Oracle databases in that
-            distribution.  In order to use these JDBC drivers, you must build ManifoldCF yourself.  Start by downloading the drivers and placing them in the <em>lib-proprietary</em> directory.  The command
-            <em>ant download-dependencies</em> will do most of this for you, with the exception of the Oracle JDBC driver.</p>
-        <p></p>
-        <p>The directory titled <em>processes</em> include separate processes which must be started in order for the associated connector to function.
-            The number of produced <em>processes</em> subdirectories may vary, because optional individual connectors may or may not supply processes that
-            must be run to support the connector.  For each of the <em>processes</em> subdirectories above, any scripts that pertain to that connector-supplied
-            process will be placed in the root level of the subdirectory.
-            The supplied scripts for a process generally take care of building an appropriate classpath and setting necessary -D switches.  (Note: none of the current
-            connectors require special -D switches at this time.)  If you need to construct a classpath by hand, it is important to remember that "more" is not necessarily
-            "better".  The process deployment strategy implied by the build structure has
-            been carefully thought out to avoid jar conflicts.  Indeed, several connectors are structured using multiple processes precisely for that reason.</p>
-        <p>The proprietary libraries required by the secondary process <em>processes</em> subdirectories should be in the directory <em>processes/xxx/lib-proprietary</em>.
-            These jars are not included in the binary distribution, and you will need to supply them in order to make the process work.  A README.txt file is placed
-            in each <em>lib-proprietary</em> directory describing what needs to be provided there.</p>
-        <p></p>
-        <p>The <em>plugins</em> directory contains components you may need to deploy on the target system to make the associated connector function correctly.  For example, the Solr
-            connector includes plug-in classes for enforcing ManifoldCF security on Solr 3.x and 4.x.  See the README file in each directory for detailed instructions on how to deploy the components.</p>
-        <p></p>
-        <p>The <em>file-resources</em> directory contains a README.txt file plus any files your connectors specifically need access to across all cluster members.
-            You should have an exact copy of this directory present on every machine that a related ManifoldCF process runs on, and the properties.xml file parameter
-            <em>org.apache.manifoldcf.fileresources</em> should point to it.  Any third-party or custom files needed by your connector configuration (e.g. OpenNLP models)
-            should be created or downloaded and placed here.</p>
-        <p></p>
-        <p>Inside the <em>example</em> directory, you will find everything you need to fire up ManifoldCF in a single-process model under Jetty.  Everything is included so that all you need to do is change
-            to that directory, and start it using the command <em>&lt;java&gt; -jar start.jar</em>.  This is described in more detail later, and is the recommended way for beginners to try out ManifoldCF.
-            The directory <em>example-proprietary</em> contains an equivalent example that includes proprietary connectors and jars.  This is the standard place to start if you build ManifoldCF yourself.</p>
-        <p></p>
-      </section>
-
-      <section>
-        <title>Example deployments</title>
-        <p>There are many different ways to run ManifoldCF out-of-the-box.  These are enumerated below:</p>
-        <ul>
-          <li>Quick-start single process model</li>
-          <li>Single-process deployable war</li>
-          <li>Simplified multi-process model</li>
-          <li>Command-driven multi-process model</li>
-        </ul>
-        <p>Each way has advantages and disadvantages.  For example, single-process models limit the flexibility of deploying ManifoldCF components.  Multi-process models require that
-          inter-process synchronization be properly configured.  If you are just starting out with ManifoldCF, we suggest you try the quick-start single process model first, since that is
-          the easiest.</p>
-        <section>
-          <title>Quick-start single process model</title>
-          <p></p>
-          <p>You can run most of ManifoldCF in a single process, for evaluation and convenience.  This single-process version uses Jetty to handle its web applications, and Hsqldb as
-            an embedded database.  All you need to do to run this version of ManifoldCF is to follow the Ant-based build instructions above, and then:</p>
-          <p></p>
-          <source>
-cd example
-start[.bat|.sh]
-          </source>
-          <p></p>
-          <p>In the quick-start model, all database initialization and connector registration takes place automatically whenever ManifoldCF is started (at the cost of some startup delay).
-            The crawler UI can be found at http://&#60;host&#62;:8345/mcf-crawler-ui.  The authority service can be found at http://&#60;host&#62;:8345/mcf-authority-service/UserACLs.
-            The programmatic API is at http://&#60;host&#62;:8345/mcf-api-service.</p>
-          <p></p>
-          <p>You can stop the quick-start ManifoldCF at any time using ^C, or by using the script <em>stop[.bat|.sh]</em></p>
-          <p></p>
-          <p>Bear in mind that Hsqldb is not as full-featured a database as is PostgreSQL.  This means that any performance testing you may do against the quick start example may
-            not be applicable to a full installation.  Furthermore, embedded Hsqldb only permits one process at a time to be connected to its databases, so you <strong>cannot</strong> use any
-            of the ManifoldCF commands (as described below) while the quick-start ManifoldCF is running.</p>
-          <p></p>
-          <p>Another caveat that you will need to be aware of with the quick-start version of ManifoldCF is that it in no way removes the need for you to run any separate processes
-            that individual connectors require.  Specifically, the Documentum and FileNet connectors require processes to be independently started in order to function.  You will need
-            to read about these connector-specific processes below in order to use the corresponding connectors.  Scripts for running these processes can be found in the directories
-            named <em>processes/xxx</em>.</p>
-          <p></p>
-        </section>
-        
-        <section>
-          <title>Single-process deployable war</title>
-          <p></p>
-          <p>Under the distribution directory <em>web/war</em>, there is a war file called <em>mcf-combined-service.war</em>.  This web application contains the exact same
-            functionality as the quick-start example, but bundled up as a single war instead.  An example script is provided to run this web application under Jetty.  You can execute
-            the script as follows:</p>
-          <p></p>
-          <source>
-  cd example
-  start-combined[.sh|.bat]
-          </source>
-          <p></p>
-          <p>The combined web service presents the crawler UI at the root path for the web application, which is <em>http://&#60;host&#62;:8345/mcf/</em>.  The authority
-            service functionality can be found at <em>http://&#60;host&#62;:8345/mcf/UserACLs</em>, similar to the quick-start example.  However, the programmatic API service has a path
-            other than the root: <em>http://&#60;host&#62;:8345/mcf/api/</em>.</p>
-          <p>The script that starts the combined-service web application uses the same database instance (Hsqldb by default) as does the quick-start, and the same <em>properties.xml</em>
-            file.  The same caveats about required individual connector processes also apply as they do for the quick-start example.</p>
-          <p></p>
-
-          <section>
-            <title>Running single-process combined war example using Tomcat</title>
-            <p>In order to run the ManifoldCF single-process combined war example under Tomcat, you will need to take the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>
-              <li>Start Tomcat.</li>
-              <li>Deploy and start the mcf-combined-service web application, preferably using the Tomcat administration client.</li>
-            </ol>
-          </section>
-
-        </section>
-
-        <section>
-          <title>Simplified multi-process model using file-based synchronization</title>
-          <p></p>
-          <p>ManifoldCF can also be deployed in a simplified multi-process model which uses files to synchronize processes.  Inside the <em>multiprocess-file-example</em> directory, you will find everything you need to do this.  (The
-              <em>multiprocess-file-example-proprietary</em> directory is similar but includes proprietary material and is available only if you build ManifoldCF yourself.)  Below is a list of
-              what you will find in this directory.</p>
-          <p></p>
-          <table>
-            <caption>File-based multiprocess example files and directories</caption>
-            <tr><th><em>multiprocess-file-example</em> file/directory</th><th>Meaning</th></tr>
-            <tr><td><em>web</em></td><td>Web applications that should be deployed on tomcat or the equivalent, plus recommended application server -D switch names and values</td></tr>
-            <tr><td><em>processes</em></td><td>classpath jars that should be included in the class path for all non-connector-specific processes, along with -D switches, using the same convention as described for tomcat, above</td></tr>
-            <tr><td><em>properties.xml</em></td><td>an example ManifoldCF configuration file, in the right place for the multiprocess script to find it</td></tr>
-            <tr><td><em>logging.xml</em></td><td>an example ManifoldCF logging configuration file, in the right place for the properties.xml to find it</td></tr>
-            <tr><td><em>syncharea</em></td><td>an example ManifoldCF synchronization directory, which must be writable in order for multiprocess ManifoldCF to work</td></tr>
-            <tr><td><em>logs</em></td><td>where the ManifoldCF logs get written to</td></tr>
-            <tr><td><em>start-database[.sh|.bat]</em></td><td>script to start the HSQLDB database</td></tr>
-            <tr><td><em>initialize[.sh|.bat]</em></td><td>script to create the database instance, create all database tables, and register connectors</td></tr>
-            <tr><td><em>start-webapps[.sh|.bat]</em></td><td>script to start Jetty with the ManifoldCF web applications deployed</td></tr>
-            <tr><td><em>start-agents[.sh|.bat]</em></td><td>script to start the (first) agents process</td></tr>
-            <tr><td><em>start-agents-2[.sh|.bat]</em></td><td>script to start a second agents process</td></tr>
-            <tr><td><em>stop-agents[.sh|.bat]</em></td><td>script to stop all running agents processes cleanly</td></tr>
-            <tr><td><em>lock-clean[.sh|.bat]</em></td><td>script to clean up dirty locks (run only when all webapps and processes are stopped)</td></tr>
-          </table>
-          <p></p>
-          <section>
-            <title>Initializing the database and running</title>
-            <p></p>
-            <p>If you run the file-based multiprocess model, after you first start the database (using <em>start-database[.sh|.bat]</em>), you will need to initialize the database before you start the agents process or use the crawler UI.  To do this, all you need to do is
-                run the <em>initialize[.sh|.bat]</em> script.  Then, you will need to start the web applications (using <em>start-webapps[.sh|.bat]</em>) and the agents process (using
-                <em>start-agents[.sh|.bat]</em>), and optionally the second agents process (using <em>start-agents-2[.sh|.bat]</em>).</p>
-            <p></p>
-          </section>
-
-          <section>
-            <title>Running multiprocess file-based example using Tomcat</title>
-            <p>In order to run the ManifoldCF multiprocess file-based example under Tomcat, you will need to take the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>
-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>
-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>
-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>
-              <li>Start Tomcat.</li>
-              <li>Deploy and start the mcf-crawler-ui, mcf-authority-service, and mcf-api-service web applications, preferably using the Tomcat administration client.</li>
-            </ol>
-          </section>
-
-        </section>
-
-        <section>
-          <title>Simplified multi-process model using ZooKeeper-based synchronization</title>
-          <p></p>
-          <p>ManifoldCF can be deployed in a simplified multi-process model which uses Apache ZooKeeper to synchronize processes.  Inside the <em>multiprocess-kz-example</em> directory, you will find everything you need to do this.  (The
-              <em>multiprocess-zk-example-proprietary</em> directory is similar but includes proprietary material and is available only if you build ManifoldCF yourself.)  Below is a list of
-              what you will find in this directory.</p>
-          <p></p>
-          <table>
-            <caption>ZooKeeper-based multiprocess example files and directories</caption>
-            <tr><th><em>multiprocess-zk-example</em> file/directory</th><th>Meaning</th></tr>
-            <tr><td><em>web</em></td><td>Web applications that should be deployed on tomcat or the equivalent, plus recommended application server -D switch names and values</td></tr>
-            <tr><td><em>processes</em></td><td>classpath jars that should be included in the class path for all non-connector-specific processes, along with -D switches, using the same convention as described for tomcat, above</td></tr>
-            <tr><td><em>properties.xml</em></td><td>an example ManifoldCF configuration file, in the right place for the multiprocess script to find it</td></tr>
-            <tr><td><em>properties-global.xml</em></td><td>an example ManifoldCF shared configuration file, in the right place for the setglobalproperties script to find it</td></tr>
-            <tr><td><em>logging.xml</em></td><td>an example ManifoldCF logging configuration file, in the right place for the properties.xml to find it</td></tr>
-            <tr><td><em>zookeeper</em></td><td>the example ZooKeeper storage directory, which must be writable in order for ZooKeeper to work</td></tr>
-            <tr><td><em>logs</em></td><td>where the ManifoldCF logs get written to</td></tr>
-            <tr><td><em>runzookeeper[.sh|.bat]</em></td><td>script to run a ZooKeeper server instance</td></tr>
-            <tr><td><em>setglobalproperties[.sh|.bat]</em></td><td>script to initialize ZooKeeper with properties from properties-global.xml</td></tr>
-            <tr><td><em>start-database[.sh|.bat]</em></td><td>script to start the HSQLDB database</td></tr>
-            <tr><td><em>initialize[.sh|.bat]</em></td><td>script to create the database instance, create all database tables, and register connectors</td></tr>
-            <tr><td><em>start-webapps[.sh|.bat]</em></td><td>script to start Jetty with the ManifoldCF web applications deployed</td></tr>
-            <tr><td><em>start-agents[.sh|.bat]</em></td><td>script to start (the first) agents process</td></tr>
-            <tr><td><em>start-agents-2[.sh|.bat]</em></td><td>script to start a second agents process</td></tr>
-            <tr><td><em>stop-agents[.sh|.bat]</em></td><td>script to stop all running agents processes cleanly</td></tr>
-          </table>
-          <p></p>
-          <section>
-            <title>Initializing the database and running</title>
-            <p></p>
-            <p>If you run the ZooKeeper-based multiprocess example, then you must follow the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Start ZooKeeper (using the <em>runzookeeper[.sh|.bat]</em> script)</li>
-              <li>Initialize the ManifoldCF shared configuration data (using <em>setglobalproperties[.sh|.bat]</em>)</li>
-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>
-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>
-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>
-              <li>Start the web applications (using <em>start-webapps[.sh|.bat]</em>)</li>
-            </ol>
-            <p></p>
-          </section>
-
-          <section>
-            <title>Running multiprocess ZooKeeper example using Tomcat</title>
-            <p>In order to run the ManifoldCF ZooKeeper example under Tomcat, you will need to take the following steps:</p>
-            <p></p>
-            <ol>
-              <li>Start ZooKeeper (using the <em>runzookeeper[.sh|.bat]</em> script)</li>
-              <li>Initialize the ManifoldCF shared configuration data (using <em>setglobalproperties[.sh|.bat]</em>)</li>
-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>
-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>
-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>
-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>
-              <li>Start Tomcat.</li>
-              <li>Deploy and start the mcf-crawler-ui, mcf-authority-service, and mcf-api-service web applications, preferably using the Tomcat administration client.</li>
-            </ol>
-          </section>
-          
-        </section>
-
-        <section>
-          <title>Command-driven multi-process model</title>
-          <p></p>
-          <p>The most generic way of deploying ManifoldCF involves calling ManifoldCF operations using scripts.  There are a number of java classes among the ManifoldCF classes
-            that are intended to be called directly, to perform specific actions in the environment or in the database.  These classes are usually invoked from the command line, with
-            appropriate arguments supplied, and are thus considered to be ManifoldCF <strong>commands</strong>.  Basic functionality supplied by these command classes is
-            as follows:</p>
-
-          <p></p>
-          <ul>
-             <li>Create/Destroy the ManifoldCF database instance</li>
-             <li>Start/Stop the <strong>agents</strong> process</li>
-             <li>Register/Unregister an agent class (there's currently only one included)</li>
-             <li>Register/Unregister an output connector</li>
-             <li>Register/Unregister a transformation connector</li>
-             <li>Register/Unregister a repository connector</li>
-             <li>Register/Unregister an authority connector</li>
-             <li>Register/Unregister a mapping connector</li>
-             <li>Clean up synchronization directory garbage resulting from an ungraceful interruption of an ManifoldCF process</li>
-             <li>Query for certain kinds of job-related information</li>
-          </ul>
-          <p></p>
-          <p>Individual connectors may contribute additional command classes and processes to this picture.</p>
-          <p></p>
-          <p>The multiprocess command execution scripts are delivered in the <em>processes</em> subdirectory.  The script for executing commands is
-            <em>processes/executecommand[.sh|.bat]</em>. This script requires two environment variables to be set before execution: JAVA_HOME, and
-            MCF_HOME, which should point to ManifoldCF's home execution directory, where the <em>properties.xml</em> file is found.)</p>
-            
-          <p></p>
-          <p>The basic steps required to set up and run ManifoldCF in command-driven file-based multi-process mode are as follows:</p>
-          <p></p>
-          <ul>
-            <li>Install PostgreSQL or MySQL.  The PostgreSQL JDBC driver included with ManifoldCF is known to work with version 9.1, so that version is the currently recommended
-              one.  If you want to use MySQL, the ant "download-dependencies" build target will fetch the appropriate MySQL JDBC driver.</li>
-            <li>Configure the database for your environment; the default configuration is acceptable for testing and experimentation.</li>
-            <li>Create the database instance (see commands below)</li>
-            <li>Initialize the database instance (see commands below)</li>
-            <li>Register the pull agent (org.apache.manifoldcf.crawler.system.CrawlerAgent, see below)</li>
-            <li>Register your connectors and authorities (see below)</li>
-            <li>Install a Java application server, such as Tomcat.</li>
-            <li>Deploy the war files from <em>web/war</em>, except for <em>mcf-combined.war</em>, to your application server (see below).</li>
-            <li>Set the starting environment variables for your app server to include any -D commands found in <em>web/define</em>.  The -D commands should be of the
-              form, "-D&#60;file name&#62;=&#60;file contents&#62;".  You will also need a "-Dorg.apache.manifoldcf.configfile=&#60;properties file&#62;" define option, or the
-              equivalent, in the application server's JVM startup in order for ManifoldCF to be able to locate its configuration file.</li>
-            <li>Use the <em>processes/executecommand[.bat|.sh]</em> command from execute the appropriate commands from the next section below, being sure to first set the
-              JAVA_HOME and MCF_HOME environment variables properly.</li>
-            <li>Start any supporting processes that result from your build.  (Some connectors such as Documentum and FileNet have auxiliary processes you need to run to make
-              these connectors functional.)</li>
-            <li>Start your application server.</li>
-            <li>Start the ManifoldCF agents process.</li>
-            <li>At this point, you should be able to interact with the ManifoldCF UI, which can be accessed via the mcf-crawler-ui web application</li>
-          </ul>
-          <p></p>
-          <p>The detailed list of commands is presented below.</p>
-          <p></p>
-          <section>
-            <title>Commands</title>
-            <p></p>
-            <p>After you have created the necessary configuration files, you will need to initialize the database, register the "pull-agent" agent, and then register your individual connectors.
-              ManifoldCF provides a set of commands for performing these actions, and others as well.  The classes implementing these commands are specified below.</p>
-            <p></p>
-            <table>
-              <tr><th>Core Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.core.DBCreate</td><td><em>dbuser</em> [<em>dbpassword</em>]</td><td>Create ManifoldCF database instance</td></tr>
-              <tr><td>org.apache.manifoldcf.core.DBDrop</td><td><em>dbuser</em> [<em>dbpassword</em>]</td><td>Drop ManifoldCF database instance</td></tr>
-              <tr><td>org.apache.manifoldcf.core.LockClean</td><td>None</td><td>Clean out synchronization directory</td></tr>
-              <tr><td>org.apache.manifoldcf.core.Obfuscate</td><td>string</td><td>Obfuscate a string, for use as an obfuscated parameter value</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>Agents Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.agents.Install</td><td>None</td><td>Create ManifoldCF agents tables</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.Uninstall</td><td>None</td><td>Remove ManifoldCF agents tables</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.Register</td><td><em>classname</em></td><td>Register an agent class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegister</td><td><em>classname</em></td><td>Un-register an agent class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAll</td><td>None</td><td>Un-register all current agent classes</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.SynchronizeAll</td><td>None</td><td>Un-register all registered agent classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.RegisterOutput</td><td><em>classname</em> <em>description</em></td><td>Register an output connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterOutput</td><td><em>classname</em></td><td>Un-register an output connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAllOutputs</td><td>None</td><td>Un-register all current output connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.SynchronizeOutputs</td><td>None</td><td>Un-register all registered output connector classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.RegisterTransformation</td><td><em>classname</em> <em>description</em></td><td>Register a transformation connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterTransformation</td><td><em>classname</em></td><td>Un-register a transformation connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAllTransformations</td><td>None</td><td>Un-register all current transformation connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.SynchronizeTransformations</td><td>None</td><td>Un-register all registered transformation connector classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.AgentRun</td><td>None</td><td>Main <strong>agents</strong> process class</td></tr>
-              <tr><td>org.apache.manifoldcf.agents.AgentStop</td><td>None</td><td>Stops the running <strong>agents</strong> process</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>Crawler Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.crawler.Register</td><td><em>classname</em> <em>description</em></td><td>Register a repository connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.UnRegister</td><td><em>classname</em></td><td>Un-register a repository connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.UnRegisterAll</td><td>None</td><td>Un-register all repository connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.SynchronizeConnectors</td><td>None</td><td>Un-register all registered repository connector classes that can't be found</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.ExportConfiguration</td><td><em>filename</em> [<em>passcode</em>]</td><td>Export crawler configuration to a file</td></tr>
-              <tr><td>org.apache.manifoldcf.crawler.ImportConfiguration</td><td><em>filename</em> [<em>passcode</em>]</td><td>Import crawler configuration from a file</td></tr>
-            </table>
-            <p></p>
-            <p>NOTE: By adding a passcode as a second argument to the ExportConfiguration command class, the exported file will be encrypted by using the AES algorithm. This can be useful to
-              prevent repository passwords to be stored in clear text. In order to use this functionality, you must enter a salt value to your configuration file. The same passcode along
-              with the salt value are used to decrypt the file with the ImportConfiguration command class. See the documentation for the commands and properties above to find the
-              correct arguments and settings.</p>
-            <p></p>
-            <table>
-              <tr><th>Authorization Domain Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.authorities.RegisterDomain</td><td><em>domainname</em> <em>description</em></td><td>Register an authorization domain</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterDomain</td><td><em>domainname</em></td><td>Un-register an authorization domain</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>User Mapping Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.authorities.RegisterMapper</td><td><em>classname</em> <em>description</em></td><td>Register a mapping connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterMapper</td><td><em>classname</em></td><td>Un-register a mapping connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAllMappers</td><td>None</td><td>Un-register all mapping connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.SynchronizeMappers</td><td>None</td><td>Un-register all registered mapping connector classes that can't be found</td></tr>
-            </table>
-            <p></p>
-            <table>
-              <tr><th>Authority Command Class</th><th>Arguments</th><th>Function</th></tr>
-              <tr><td>org.apache.manifoldcf.authorities.RegisterAuthority</td><td><em>classname</em> <em>description</em></td><td>Register an authority connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAuthority</td><td><em>classname</em></td><td>Un-register an authority connector class</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAllAuthorities</td><td>None</td><td>Un-register all authority connector classes</td></tr>
-              <tr><td>org.apache.manifoldcf.authorities.SynchronizeAuthorities</td><td>None</td><td>Un-register all registered authority connector classes that can't be found</td></tr>
-            </table>
-            <p></p>
-            <p>Remember that you need to include all the jars under <em>multiprocess-file-example/processes/lib</em> in the classpath whenever you run one of these commands!
-                But, luckily, there are scripts which do this for you.  These can be found in <em>multiprocess-file-example/processes/executecommand[.sh,.bat]</em>.
-                The scripts require some environment variables to be set, such as <em>MCF_HOME</em> and <em>JAVA_HOME</em>, and expect the configuration file to be
-                found at <em>MCF_HOME/properties.xml</em>.</p>
-            <p></p>
-          </section>
-          <section>
-            <title>Deploying the <strong>mcf-crawler-ui</strong>, <strong>mcf-authority-service</strong>, and <strong>mcf-api-service</strong> web applications</title>
-            <p></p>
-            <p>If you built ManifoldCF using ant, then the ant build will have constructed four war files for you under <em>web/war</em>.  You should ignore the <em>mcf-combined</em>
-                war in this directory for this deployment model.  If you intend to run ManifoldCF in multiprocess mode, you will need to deploy the other web applications on you application server.
-                There is no requirement that the <strong>mcf-crawler-ui</strong>, <strong>mcf-authority-service</strong>, and <strong>mcf-api-service</strong> web
-                applications be deployed on the same instance of the application server.  With the current architecture of ManifoldCF, they must be deployed on the same physical server, however.</p>
-            <p></p>
-            <p>For each of the application servers involved with ManifoldCF, you must set the following define, so that the ManifoldCF web applications can locate the configuration file:</p>
-            <source>
--Dorg.apache.manifoldcf.configfile=&#60;configuration file path&#62;
-            </source>
-            <p></p>
-          </section>
-          <section>
-            <title>Running the <strong>agents</strong> process</title>
-            <p></p>
-            <p>The <strong>agents</strong> process is the process that actually performs the crawling for ManifoldCF.  Start this process by running the command
-              "org.apache.manifoldcf.agents.AgentRun".  This class will run until stopped by invoking the command "org.apache.manifoldcf.agents.AgentStop".  It is highly
-              recommended that you stop the process in this way.  You may also stop the process using a SIGTERM signal, but "kill -9" or the equivalent is NOT recommended,
-              because that may result in dangling locks in the ManifoldCF synchronization directory.  (If you have to, clean up these locks by shutting down all ManifoldCF
-              processes, including the application server instances that are running the web applications, and invoking the command "org.apache.manifoldcf.core.LockClean".)</p>
-            <p></p>
-          </section>
-        </section>
-      </section>
-      
-      <section>
-        <title>The <em>connectors.xml</em> configuration file</title>
-        <p></p>
-        <p>The quick-start, combined, and simplified multi-process sample deployments of ManifoldCF have their own configuration file, called <em>connectors.xml</em>,
-          which is used to register the available connectors in the database.  The file has this basic format:</p>
-        <p></p>
-        <source>
-&#60;?xml version="1.0" encoding="UTF-8" ?&#62;
-&#60;connectors&#62;
- (clauses)
-&#60;/connectors&#62;
-        </source>
-        <p></p>
-        <p>The following tags are available to specify your connectors and authorization domains:</p>
-        <p></p>
-        <p>&#60;repositoryconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;authorityconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;mappingconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;outputconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;transformationconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>
-        <p>&#60;authorizationdomain name="<em>pretty_name</em>" domain="<em>domain_name</em>"/&#62;</p>
-        <p></p>
-        <p>The <em>connectors.xml</em> file typically has some connectors commented out - namely the ones build with stubs which require you to supply a
-          third-party library in order for the connector to run.  If you build ManifoldCF yourself, the <em>example-proprietary</em> and <em>multiprocess-file-example-proprietary</em>
-          and <em>multiprocess-zk-example-proprietary</em> directories instead use <em>connectors-proprietary.xml</em>.  The connectors you build against the proprietary libraries you supply will not have their
-          <em>connectors-proprietary.xml</em> tags commented out.</p>
-        <p></p>
-      </section>
-
-      <section>
-        <title>Running connector-specific processes</title>
-        <p></p>
-        <p>Connector-specific processes require the classpath for their invocation to include all the jars that are in the corresponding
-          <em>processes/&#60;process_name&#62;</em> directory.  The Documentum and FileNet connectors are the only two connectors that currently require additional processes. 
-          Start these processes using the commands listed below, and stop them with SIGTERM (or ^C, if they are running in a shell).</p>
-        <p></p>
-        <table>
-          <tr><th>Connector</th><th>Process</th><th>Main class</th><th>Script name (relative to <em>dist</em>)</th></tr>
-          <tr><td>Documentum</td><td>processes/documentum-server</td><td>org.apache.manifoldcf.crawler.server.DCTM.DCTM</td><td>processes/documentum-server/run[.sh|.bat]</td></tr>
-          <tr><td>Documentum</td><td>processes/documentum-registry</td><td>org.apache.manifoldcf.crawler.registry.DCTM.DCTM</td><td>processes/documentum-registry/run[.sh|.bat]</td></tr>
-          <tr><td>FileNet</td><td>processes/filenet-server</td><td>org.apache.manifoldcf.crawler.server.filenet.Filenet</td><td>processes/filenet-server/run[.sh|.bat]</td></tr>
-          <tr><td>FileNet</td><td>processes/filenet-registry</td><td>org.apache.manifoldcf.crawler.registry.filenet.Filenet</td><td>processes/filenet-registry/run[.sh|.bat]</td></tr>
-        </table>
-        <p>The registry process in all cases must be started before the corresponding server process, or the server process will report an error.  (It will, however, retry after some period of time.)
-            The scripts all require an MCF_HOME environment variable pointing to the place where properties.xml is found, as well as a JAVA_HOME environment variable pointing the JDK.
-            The server scripts also require other environment variables as well, consistent with the needs of the DFC or the FileNet API respectively.  For example, DFC requires the
-            DOCUMENTUM environment variable to be set, while the FileNet server script requires the WASP_HOME environment variable.</p>
-        <p>It is important to understand that the scripts work by building a classpath out of all jars that get copied into the <em>lib</em> and <em>lib-proprietary</em> directory underneath
-            each process during the ant build.  The <em>lib-proprietary</em> jars cannot be distributed in the binary version of ManifoldCF, so if you use this option you will still need to
-            copy them there yourself for the processes to run.  If you build ManifoldCF yourself, these jars are copied from the <em>lib-proprietary</em> directories underneath the documentum
-            or filenet connector directories.  For the server startup scripts to work properly, the <em>lib-proprietary</em> directories should have <strong>all</strong> of the jars needed to
-            allow the api code to function.</p>
-        <p></p>
-      </section>
-
-      <section>
-        <title>Database selection</title>
-        <p></p>
-        <p>You have a variety of open-source databases to choose from when deploying ManifoldCF.  The supported databases each have their own strengths and weaknesses, and
-          are listed below:</p>
-        <ul>
-          <li>PostgreSQL (preferred)</li>
-          <li>MySQL (preferred)</li>
-          <li>MariaDB (not yet evaluated))</li>
-          <li>HSQLDB</li>
-        </ul>
-        <p>You can select the database of your choice by setting the approprate properties in the applicable <em>properties.xml</em> file.  The choice of database is largely orthogonal
-          to the choice of deployment model.  The ManifoldCF deployment examples provided can thus be readily altered to use the database you desire.  The details and caveats of
-          each choice is described below.</p>
-        <p></p>
-        <section>
-          <title>Configuring a PostgreSQL database</title>
-          <p></p>
-          <p>Despite having an internal architecture that cleanly abstracts from specific database details, ManifoldCF is currently fairly specific to PostgreSQL at this time.  There are a number of reasons for this.</p>
-          <p></p>
-          <ul>
-             <li>ManifoldCF uses the database for its document queue, which places a significant load on it.  The back-end database is thus a significant factor in ManifoldCF's performance.  But, in exchange, ManifoldCF benefits enormously from the underlying ACID properties of the database.</li>
-             <li>The strategy for getting optimal query plans from the database is not abstracted.  For example, PostgreSQL 8.3+ is very sensitive to certain statistics about a database table, and will not generate a performant plan if the statistics are inaccurate by even a little, in some cases.  So, for PostgreSQL, the database table must be analyzed very frequently, to avoid catastrophically bad plans.  But luckily, PostgreSQL is pretty good at doing analysis quickly.  Oracle, on the other hand, takes a very long time to perform analysis, but its plans are much less sensitive.</li>
-             <li>PostgreSQL always does a sequential scan in order to count the number of rows in a table, while other databases return this efficiently.  This has affected the design of the ManifoldCF UI.</li>
-             <li>The choice of query form influences the query plan.  Ideally, this is not true, but for both PostgreSQL and for (say) Oracle, it is.</li>
-             <li>PostgreSQL has a high degree of parallelism and lack of internal single-threadedness.</li>
-          </ul>
-          <p></p>
-          <p>ManifoldCF has been tested against version 8.3.7, 8.4.5, 9.1, 9.2, and 9.3 of PostgreSQL.  We recommend the following configuration parameter settings to work optimally with ManifoldCF:</p>
-          <p></p>
-          <ul>
-             <li>A default database encoding of UTF-8</li>
-             <li><em>postgresql.conf</em> settings as described in the table below</li>
-             <li><em>pg_hba.conf</em> settings to allow password access for TCP/IP connections from ManifoldCF</li>
-             <li>A maintenance strategy involving cronjob-style vacuuming, rather than PostgreSQL autovacuum</li>
-          </ul>
-          <p></p>
-          <table>
-            <caption>Postgresql.conf parameters</caption>
-            <tr><th><em>postgresql.conf</em> parameter</th><th>Tested value</th></tr>
-            <tr><td>standard_conforming_strings</td><td>on</td></tr>
-            <tr><td>shared_buffers</td><td>1024MB</td></tr>
-            <tr><td>checkpoint_segments</td><td>300</td></tr>
-            <tr><td>maintenance<em>work</em>mem</td><td>2MB</td></tr>
-            <tr><td>tcpip_socket</td><td>true</td></tr>
-            <tr><td>max_connections</td><td>400</td></tr>
-            <tr><td>checkpoint_timeout</td><td>900</td></tr>
-            <tr><td>datestyle</td><td>ISO,European</td></tr>
-            <tr><td>autovacuum</td><td>off</td></tr>
-          </table>
-          <p></p>
-          <p>Note well: The <em>standard_conforming_strings</em> parameter setting is important to prevent any possibility of SQL injection attacks.  While ManifoldCF
-            uses parameterized queries in almost all cases, when it does do string quoting it presumes that the SQL standard for quoting is adhered to.  It is in general good practice
-            to set this parameter when working with PostgreSQL for this reason.</p>
-          <p></p>
-          <section>
-            <title>A note about PostgreSQL database maintenance</title>
-            <p></p>
-            <p>PostgreSQL's architecture causes it to accumulate dead tuples in its data files, which do not interfere with its performance but do bloat the database over time.  The
-              usage pattern of ManifoldCF is such that it can cause significant bloat to occur to the underlying PostgreSQL database in only a few days, under sufficient load.  PostgreSQL
-              has a feature to address this bloat, called <strong>vacuuming</strong>.  This comes in three varieties: autovacuum, manual vacuum, and manual full vacuum.</p>
-            <p></p>
-            <p>We have found that PostgreSQL's autovacuum feature is inadequate under such conditions, because it not only fights for database resources pretty much all the time,
-              but it falls further and further behind as well.  PostgreSQL's in-place manual vacuum functionality is a bit better, but is still much, much slower than actually making a new
-              copy of the database files, which is what happens when a manual full vacuum is performed.</p>
-            <p></p>
-            <p>Dead-tuple bloat also occurs in indexes in PostgreSQL, so tables that have had a lot of activity may benefit from being reindexed at the time of maintenance. </p>
-            <p>We therefore recommend periodic, scheduled maintenance operations instead, consisting of the following:</p>
-            <p></p>
-            <ul>
-             <li>VACUUM FULL VERBOSE;</li>
-             <li>REINDEX DATABASE &#60;the_db_name&#62;;</li>
-            </ul>
-            <p> </p>
-            <p>During maintenance, PostgreSQL locks tables one at a time.  Nevertheless, the crawler ui may become unresponsive for some operations, such as when counting
-              outstanding documents on the job status page.  ManifoldCF thus has the ability to check for the existence of a file prior to such sensitive operations, and will display a
-              useful "maintenance in progress" message if that file is found.  This allows a user to set up a maintenance system that provides adequate feedback for an ManifoldCF
-              user of the overall status of the system.</p>
-            <p></p>
-          </section>
-        </section>
-
-        <section>
-          <title>Configuring a MySQL database</title>
-          <p></p>
-          <p>MySQL is not quite as fast as PostgreSQL, but it is a relatively close second in performance tests.  Nevertheless, the ManifoldCF team does not have a large amount
-            of experience with this database at this time.  More details will be added to this section as information and experience becomes available.</p>
-        </section>
-        
-        <section>
-          <title>Configuring an HSQLDB database</title>
-          <p></p>
-          <p>HSQLDB's performance seems closely tied to how much of the database can be actually held in memory.  Performance at this time is about half that of PostgreSQL.</p>
-          <p>HSQLDB can be used with ManifoldCF in either an embedded fashion (which only works with single-process deployments), or in external fashion, with a database instance running in a separate
-            process.  See the <em>properties.xml</em> property descriptions for configuration details.</p>
-        </section>
-        
-      </section>
-        
-      <section>
-        <title>The ManifoldCF configuration files</title>
-        <p></p>
-        <p>Currently, ManifoldCF requires two configuration files: the main configuration property file, and the logging configuration file.</p>
-        <p></p>
-        <section>
-          <title><em>properties.xml</em> file properties</title>
-
-          <p>The <em>properties.xml</em> property file path can be specified by the system property "org.apache.manifoldcf.configfile".  If not specified through a -D operation, its
-              name is presumed to be <em>&#60;user_home&#62;/lcf/properties.xml</em>.  The form of the property file is XML, of the following basic form:</p>
-          <p></p>
-          <source>
-&#60;?xml version="1.0" encoding="UTF-8" ?&#62;
-&#60;configuration&#62;
- (clauses)
-&#60;/configuration&#62;
-          </source>
-          <p></p>
-          <p>The <em>properties.xml</em> file allows properties to be specified.  A property clause has the form:</p>
-          <p></p>
-          <p>&#60;property name="<em>property_name</em>" value="<em>property_value</em>"/&#62;</p>
-          <p></p>
-          <p>One of the optional properties is the name of the logging configuration file.  This property's name is "org.apache.manifoldcf.logconfigfile".  If not present, the logging configuration file will be assumed to be <em>&#60;user_home&#62;/manifoldcf/logging.xml</em>.  The logging configuration file is a standard commons-logging property file, and should be formatted accordingly.</p>
-          <p></p>
-          <p>Note that all properties described below can also be specified on the command line, via a -D switch.  If both methods of setting the property are used, the -D switch value will override the property file value.</p>
-          <p></p>
-          <p>The following table describes the configuration property file properties, and what they do:</p>
-          <p></p>
-          <table>
-            <caption>property.xml properties</caption>
-            <tr><th>Property</th><th>Required?</th><th>Function</th></tr>
-            <tr><td>org.apache.manifoldcf.authimplementationclass</td><td>No</td><td>Auth implementation class (defaults to "org.apache.manifoldcf.core.auth.DefaultAuthenticator", set to "org.apache.manifoldcf.core.auth.LdapAuthenticator" for LDAP)</td></tr>
-            <tr><td>org.apache.manifoldcf.login.name</td><td>No</td><td>Default auth implementation crawler UI login user ID (defaults to "admin")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.password</td><td>No</td><td>Default auth implementation crawler UI login user password (defaults to "admin")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.password.obfuscated</td><td>No</td><td>Default auth implementation obfuscated crawler UI login user password (defaults to "admin")</td></tr>
-            <tr><td>org.apache.manifoldcf.apilogin.name</td><td>No</td><td>Default auth implementation API login user ID (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.apilogin.password</td><td>No</td><td>Default auth implementation API login user password (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.apilogin.password.obfuscated</td><td>No</td><td>Default auth implementation obfuscated API login user password (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.providerurl</td><td>No</td><td>LDAP auth implementation provider URL (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.securityauthenticationtype</td><td>No</td><td>LDAP auth implementation auth type (defaults to "simple")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.securityprincipal</td><td>No</td><td>LDAP auth implementation security principal (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.contextsearchquery</td><td>No</td><td>LDAP auth implementation search query (defaults to "")</td></tr>
-            <tr><td>org.apache.manifoldcf.login.ldap.searchattribute</td><td>No</td><td>LDAP auth implementation search attribute (defaults to "uid")</td></tr>
-            <tr><td>org.apache.manifoldcf.crawleruiwarpath</td><td>Yes, for Jetty</td><td>Location of Crawler UI war</td></tr>
-            <tr><td>org.apache.manifoldcf.authorityservicewarpath</td><td>Yes, for Jetty</td><td>Location of Authority Service war</td></tr>
-            <tr><td>org.apache.manifoldcf.apiservicewarpath</td><td>Yes, for Jetty</td><td>Location of API Service war</td></tr>
-            <tr><td>org.apache.manifoldcf.usejettyparentclassloader</td><td>Yes, for Jetty</td><td>true for single-process example, false for multiprocess example.</td></tr>
-            <tr><td>org.apache.manifoldcf.connectorsconfigurationfile</td><td>No</td><td>Location of connectors.xml file, for QuickStart, so ManifoldCF can register connectors.</td></tr>
-            <tr><td>org.apache.manifoldcf.dbsuperusername</td><td>No</td><td>Database superuser name, for QuickStart, so ManifoldCF can create database instance.</td></tr>
-            <tr><td>org.apache.manifoldcf.dbsuperuserpassword</td><td>No</td><td>Database superuser password, for QuickStart, so ManifoldCF can create database instance.</td></tr>
-            <tr><td>org.apache.manifoldcf.dbsuperuserpassword.obfuscated</td><td>No</td><td>Obfuscated database superuser password, for QuickStart, so ManifoldCF can create database instance.</td></tr>
-            <tr><td>org.apache.manifoldcf.ui.maxstatuscount</td><td>No</td><td>The maximum number of documents ManifoldCF will try to count for the job status display.  Defaults to 500000.</td></tr>
-            <tr><td>org.apache.manifoldcf.databaseimplementationclass</td><td>No</td><td>Specifies the class to use to implement database access.
-                Default is a built-in Hsqldb implementation.  Supported choices are:
-                org.apache.manifoldcf.core.database.DBInterfacePostgreSQL, 
-                org.apache.manifoldcf.core.database.DBInterfaceMySQL,
-                org.apache.manifoldcf.core.database.DBInterfaceMariaDB,
-                org.apache.manifoldcf.core.database.DBInterfaceHSQLDB</td></tr>
-            <tr><td>org.apache.manifoldcf.postgresql.hostname</td><td>No</td><td>PostgreSQL server host name, or localhost if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.postgresql.port</td><td>No</td><td>PostgreSQL server port, or standard port if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.postgresql.ssl</td><td>No</td><td>Set to "true" for ssl communication with PostgreSQL.</td></tr>
-            <tr><td>org.apache.manifoldcf.mysql.server</td><td>No</td><td>The MySQL or MariaDB server name.  Defaults to 'localhost'.</td></tr>
-            <tr><td>org.apache.manifoldcf.mysql.client</td><td>No</td><td>The MySQL or MariaDB client property.  Defaults to 'localhost'.  You may want to set this to '%' for a multi-machine setup.</td></tr>
-            <tr><td>org.apache.manifoldcf.mysql.ssl</td><td>No</td><td>Set to "true" for ssl communication with MySQL or MariaDB.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabasepath</td><td>No</td><td>Absolute or relative path to HSQLDB database; default is '.'.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseprotocol</td><td>Yes, for remote HSQLDB connection</td><td>The HSQLDB JDBC protocol; choices are 'hsql', 'http', or 'https'. Default is blank (which means an embedded instance)</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseserver</td><td>Yes, for remote HSQLDB connection</td><td>The HSQLDB remote server name.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseport</td><td>No</td><td>The HSQLDB remote server port.</td></tr>
-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseinstance</td><td>No</td><td>The HSQLDB remote database instance name.</td></tr>
-            <tr><td>org.apache.manifoldcf.lockmanagerclass</td><td>No</td><td>Specifies the class to use to implement synchronization.  Default
-                is either file-based synchronization or in-memory synchronization, using the org.apache.manifoldcf.core.lockmanager.LockManager class.
-                Options include org.apache.manifoldcf.core.lockmanager.BaseLockManager, org.apache.manifoldcf.core.FileLockManager, and
-                org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager.</td></tr>
-            <tr><td>org.apache.manifoldcf.synchdirectory</td><td>Yes, if file-based synchronization class is specified</td><td>Specifies the path of a
-                synchronization directory.  All ManifoldCF process owners <strong>must</strong> have read/write privileges to this directory.</td></tr>
-            <tr><td>org.apache.manifoldcf.zookeeper.connectstring</td><td>Yes, if ZooKeeper-based synchronization class is specified</td><td>Specifies the ZooKeeper
-                connection string, consisting of comma-separated hostname:port pairs.</td></tr>
-            <tr><td>org.apache.manifoldcf.zookeeper.sessiontimeout</td><td>No</td><td>Specifies the ZooKeeper
-                session timeout, if ZooKeeperLockManager is specified.  Defaults to 2000.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.maxhandles</td><td>No</td><td>Specifies the maximum number of database connection handles that will by pooled.  Recommended value is 200.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.handletimeout</td><td>No</td><td>Specifies the maximum time a handle is to live before it is presumed dead.  Recommend a value of 604800, which is the maximum allowable.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.connectiontracking</td><td>No</td><td>True or false.  When "true", will track all allocated database connection handles, and will dump an allocation stack trace when the pool is exhausted.  Useful for diagnosing connection leaks.</td></tr>
-            <tr><td>org.apache.manifoldcf.logconfigfile</td><td>No</td><td>Specifies location of logging configuration file.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.name</td><td>No</td><td>Describes database name for ManifoldCF; defaults to "dbname" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.username</td><td>No</td><td>Describes database user name for ManifoldCF; defaults to "manifoldcf" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.password</td><td>No</td><td>Describes database user's password for ManifoldCF; defaults to "local_pg_password" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.database.password.obfuscated</td><td>No</td><td>Obfuscated database user's password for ManifoldCF; defaults to "local_pg_password" if not specified.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.threads</td><td>No</td><td>Number of crawler worker threads created.  Suggest a value of 30.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.expirethreads</td><td>No</td><td>Number of crawler expiration threads created.  Suggest a value of 10.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.cleanupthreads</td><td>No</td><td>Number of crawler cleanup threads created.  Suggest a value of 10.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.deletethreads</td><td>No</td><td>Number of crawler delete threads created.  Suggest a value of 10.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawler.historycleanupinterval</td><td>No</td><td>Milliseconds to retain history records.  Default is 0.  Zero means "forever".</td></tr>
-            <tr><td>org.apache.manifoldcf.misc</td><td>No</td><td>Miscellaneous debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.db</td><td>No</td><td>Database debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.lock</td><td>No</td><td>Lock management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.cache</td><td>No</td><td>Cache management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.agents</td><td>No</td><td>Agent management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.perf</td><td>No</td><td>Performance logging debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.crawlerthreads</td><td>No</td><td>Log crawler thread activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.hopcount</td><td>No</td><td>Log hopcount tracking activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.jobs</td><td>No</td><td>Log job activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.connectors</td><td>No</td><td>Log connector activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.scheduling</td><td>No</td><td>Log document scheduling activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.authorityconnectors</td><td>No</td><td>Log authority connector activity.  Legal values INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.authorityservice</td><td>No</td><td>Log authority service activity.  Legal values are INFO, WARN, or DEBUG.</td></tr>
-            <tr><td>org.apache.manifoldcf.salt</td><td>Yes, if file encryption is used</td><td>Specify the salt value to be used for encrypting the file to which the crawler configuration is exported.</td></tr>
-          </table>
-          <p></p>
-          <p>The following table describes 'advanced' configuration property file properties.  They shouldn't need to be changed but provide a greater level of customization:</p>
-          <p></p>
-          <table>
-            <caption>Advanced property.xml properties</caption>
-            <tr><th>Property</th><th>Required?</th><th>Default</th><th>Function</th></tr>
-            <tr><td>org.apache.manifoldcf.crawler.repository.store_history</td><td>No</td><td>true</td><td>If you do not require reports from within this will disable logging to the repository history (although the reports will still run they will not contain any content). This can increase throughput and reduce the rate of growth of the database.</td></tr>
-            <tr><td>org.apache.manifoldcf.db.postgres.analyze.&#60;tablename&#62;</td><td>No</td><td>2000</td><td>For postgresql, specify how many changes should be carried out before carrying out an 'ANALYZE' on the specified table.</td></tr>
-            <tr><td>org.apache.manifoldcf.db.postgres.reindex.&#60;tablename&#62;</td><td>No</td><td>250000</td><td>For postgresql, specify how many changes should be carried out before carrying out an 'REINDEX' on the specified table.</td></tr>
-            <tr><td>org.apache.manifoldcf.db.mysql.analyze.&#60;tablename&#62;</td><td>No</td><td>2000</td><td>For MySql or MariaDB, specify how many changes should be carried out before carrying out an 'ANALYZE' on the specified table.</td></tr>
-            <tr><td>org.apache.manifoldcf.ui.maxstatuscount</td><td>No</td><td>500000</td><td>Set the upper limit for the precise document count to be returned on the 'Status and Job Management' page.</td></tr>
-          </table>
-          <p></p>
-          <p>The configuration file can also specify a set of directories which will be searched for connector jars.  The directive that adds to the class path is:</p>
-          <p></p>
-          <p>&#60;libdir path="<em>path</em>"/&#62;</p>
-          <p></p>
-          <p>Note that the path can be relative.  For the purposes of path resolution, "." means the directory in which the <em>properties.xml</em> file is itself located.</p>
-          <p></p>
-        </section>
-          
-        <section>
-          <title>Logging configuration file properties</title>
-          <p></p>
-          <p>The <em>logging.xml</em> file contains Apache log4j2 properties in a log4j2 xml format.  The way the
-            ManifoldCF logging output is formatted is controlled through this file, as are any loggers that ManifoldCF doesn't explicitly define (e.g. loggers for Apache HttpComponent/HttpClient).
-            Other resources are therefore best suited to describe the parameters that can be used and to what effect.</p>
-        </section>
-          
-      </section>
-      
-      <section>
-        <title>Running the ManifoldCF Apache2 plug in</title>
-        <p></p>
-        <p>The ManifoldCF Apache2 plugin, mod-authz-annotate, is designed to convert an authenticated principle (e.g. from mod-auth-kerb), and query a set of authority services
-          for access tokens using an HTTP request.  These access tokens are then passed to a (not included) search engine UI, which can use them to help compose a search that
-          properly excludes content that the user is not supposed to see.</p>
-        <p></p>
-        <p>The list of authority services so queried is configured in Apache's httpd.conf file.  This project includes only one such service: the java authority service, which uses
-          authority connections defined in the crawler UI to obtain appropriate access tokens.</p>
-        <p></p>
-        <p>In order for mod-authz-annotate to be used, it must be placed into Apache2's extensions directory, and configured appropriately in the httpd.conf file.</p>
-        <p></p>
-        <p>Note: The ManifoldCF project now contains support for converting a Kerberos principal to a list of Active Directory SIDs.  This functionality is contained in the
-          Active Directory Authority.  The following connectors are expected to make use of this authority:</p>
-        <p></p>
-        <ul>
-         <li>FileNet</li>
-         <li>CIFS</li>
-         <li>SharePoint</li>
-        </ul>
-        <p></p>
-        <section>
-          <title>Configuring the ManifoldCF Apache2 plug in</title>
-          <p></p>
-          <p>mod-authz-annotate understands the following httpd.conf commands:</p>
-          <p></p>
-          <table>
-            <tr><th>Command</th><th>Meaning</th><th>Values</th></tr>
-            <tr><td>AuthzAnnotateEnable</td><td>Turn on/off the plugin</td><td>"On", "Off"</td></tr>
-            <tr><td>AuthzAnnotateAuthority</td><td>Point to an authority service that supports ACL queries, but not ID queries</td><td>The authority URL</td></tr>
-            <tr><td>AuthzAnnotateACLAuthority</td><td>Point to an authority service that supports ACL queries, but not ID queries</td><td>The authority URL</td></tr>
-            <tr><td>AuthzAnnotateIDAuthority</td><td>Point to an authority service that supports ID queries, but not ACL queries</td><td>The authority URL</td></tr>
-            <tr><td>AuthzAnnotateIDACLAuthority</td><td>Point to an authority service that supports both ACL queries and ID queries</td><td>The authority URL</td></tr>
-          </table>
-        </section>
-      </section>
-    
-      <section>
-        <title>Running ManifoldCF with Apache Maven</title>
-        <p></p>
-        <p>If you build ManifoldCF with Maven, then you will need to run ManifoldCF under Maven.  You currently don't get a lot of options here; the only model
-            offered is the QuickStart single process model.  To run it, all you need to do is:</p>
-        <source>
-cd framework/jetty-runner
-mvn exec:exec
-        </source>
-      </section>
-
-    </section>
-
-    <section>
-      <title>Running ManifoldCF tests</title>
-      <p></p>
-      <p>ManifoldCF has a large suite of tests which helps verify the integrity of a ManifoldCF release.  These tests come in several varieties:</p>
-      <p></p>
-      <ul>
-        <li>Unit tests, which test specific classes</li>
-        <li>Integration tests, which test connectors running in the MCF environment</li>
-        <li>Load tests, which are designed to run connectors under load over a long period of time</li>
-        <li>UI tests, which are like integration tests but are meant to exercise the UI</li>
-      </ul>
-      <p>There are no special considerations for unit tests.  These are executed across the whole project by the main ant target "run-tests".</p>
-      <p>Integration tests have a second dimension of variety, namely which database the test is meant to run on.  The testing databases are:</p>
-      <p></p>
-      <ul>
-        <li>HSQLDB (an embedded database)</li>
-        <li>HSQLDBext (running against HSQLDB as an external service)</li>
-        <li>PostgreSQL (requires a local installation of PostgreSQL to run against)</li>
-        <li>MySQL (requires a local installation of MySQL to run against)</li>
-      </ul>
-      <p>For both the PostgreSQL and Mysql tests, the databases that are installed locally must have a specific superuser and password set when they are installed, so that the
-         tests can create a test database instance and tear it down again.  The superuser name and password for PostgreSQL should be "postgres"/"postgres".  The superuser name
-         and password for MySQL should be "root"/"mysql".</p>
-      <p>Once set up, you can run the tests you want against the database you want by invoking the ant targets as follows:</p>
-      <table>
-        <caption>Databases and ant targets</caption>
-        <tr><th>Database</th><th>ant targets</th></tr>
-        <tr><td>HSQLDB, HSQLDBext</td><td>test-hs, load-hs</td></tr>
-        <tr><td>PostgreSQL</td><td>test-pg, load-pg</td></tr>
-        <tr><td>MySQL</td><td>test-my, load-my</td></tr>
-      </table>
-      <p></p>
-      <p>Running the UI tests requires some additional software installation and configuration as well.  This is what you will need:</p>
-      <p></p>
-      <ul>
-        <li>Install the Google Chrome browser on your testing machine</li>
-        <li>Download the appropriate Selenium Chrome driver from this <a href="https://chromedriver.storage.googleapis.com/index.html?path=2.28/">URL</a></li>
-        <li>Unpack the driver executable and place it in the location of your choice</li>
-        <li>Set the environment variable <em>SL_CHROME_DRIVER</em> to point to the executable</li>
-      </ul>
-      <p>After this, you should be able to run the UI tests using the ant target "uitests".  (This executes only the HSQLDB UI tests at this time.)</p>
-    </section>
-    
-    <section>
-      <title>Integrating ManifoldCF into another application</title>
-      <p></p>
-      <p>ManifoldCF can be integrated into another application through a variety of methods.  We'll cover these below.</p>
-      <p></p>
-
-      <section>
-        <title>Integrating the Quick Start example</title>
-        <p></p>
-        <p>The Quick Start example can readily be integrated into a single-process application, by using the support methods found in the org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner class.
-          For the web application components of ManifoldCF, you can either use this class to start them under Jetty, or you can choose to deploy them yourself.  Please note, however, that if you start the ManifoldCF
-          agents process within a web application, you are effectively not running a single-process version of ManifoldCF anymore, because each web application will effectively
-          have its own set of static classes.</p>
-        <p>If you want to try the single-process integration, you should learn what you need by reading the Javadoc for the ManifoldCFJettyRunner class.</p>
-      </section>
-      
-      <section>
-        <title>Integrating a multi-process setup</title>
-        <p></p>
-        <p>In a multi process setup, all of the ManifoldCF processes might as well exist on their own.  You can learn how to programmatically start the agents process by looking at the code
-          in the AgentRun command class, as described above.  Similarly, the command classes that register connectors are very small and should be easy to understand.</p>
-      </section>
-
-      <section>
-          <title>Integrating ManifoldCF with a search engine</title>
-          <p></p>
-          <p>ManifoldCF's Authority Service is designed to allow maximum flexibility in integrating ManifoldCF security with search engines.  The
-                service receives a user identity (as a set of authorization domain/user name tuples), and produces a set of tokens.  It also returns a 
-                summary of the status of all authorities that were involved in the assembly of the set of tokens, as a nicety.  A search engine user
-                interface could thus signal the user when the results they might be seeing are incomplete, and why.</p>
-          <p>The Authority Service expects the following arguments, passed as URL arguments and properly URL encoded:</p>
-          <p></p>
-          <table>
-            <caption>Authority Service URL parameters</caption>
-            <tr><th>Authority Service URL parameter</th><th>Meaning</th></tr>
-            <tr><td>username</td><td>the username, if there is only one authorization domain</td></tr>
-            <tr><td>domain</td><td>the optional authorization domain if there is only one authorization domain (defaults to empty string)</td></tr>
-            <tr><td>username_<em>XX</em></td><td>username number <em>XX</em>, where <em>XX</em> is an integer starting at zero</td></tr>
-            <tr><td>domain_<em>XX</em></td><td>authorization domain <em>XX</em>, where <em>XX</em> is an integer starting at zero</td></tr>
-          </table>
-          <p></p>
-          <p>Access tokens and authority statuses are returned in the HTTP response separated by newline characters.  Each line has a prefix
-                as follows:</p>
-          <p></p>
-          <table>
-            <caption>Authority Service response prefixes</caption>
-            <tr><th>Authority Service response prefix</th><th>Meaning</th></tr>
-            <tr><td>TOKEN:</td><td>An access token</td></tr>
-            <tr><td>AUTHORIZED:</td><td>The name of an authority that found the user to be authorized</td></tr>
-            <tr><td>UNREACHABLEAUTHORITY:</td><td>The name of an authority that was found to be unreachable or unusable</td></tr>
-            <tr><td>UNAUTHORIZED:</td><td>The name of an authority that found the user to be unauthorized</td></tr>
-            <tr><td>USERNOTFOUND:</td><td>The name of an authority that could not find the user</td></tr>
-          </table>
-          <p></p>
-          <p>It is important to remember that only the "TOKEN:" lines actually matter for security.  Even if any of the error conditions apply, the set
-                of tokens returned by the Authority Service will be correctly supplied in order to apply appropriate security to documents being searched.</p>
-          <p>If you choose to deploy a search-engine plugin supplied by the Apache ManifoldCF project (for example, the Solr plugin), you will not need
-                know any of the above, since part of the plugin's purpose is to communicate with the Authority Service and apply the access tokens that are
-                returned to the search query automatically.  Some plugins, such as the ElasticSearch plugin, are more or less like toolkits, but still hide most
-                of the above from the integrator.  In a more highly customized system, however, you may need to develop your own code which interacts
-                with the Authority Service in order to meet your goals.</p>
-      </section>
-
-    </section>
-  </body>
-
-</document>
-
-
-
-
-
-
-
-
-
-
diff --git a/site/src/documentation/content/xdocs/ja_JP/included-connectors.xml b/site/src/documentation/content/xdocs/ja_JP/included-connectors.xml
deleted file mode 100644
index 2f254c8..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/included-connectors.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document>
-
-  <header>
-    <title>コネクタ一覧</title>
-  </header>
-
-  <body>
-    <section>
-      <title>コネクタ一覧</title>
-      <p>ManifoldCFは次のコネクタをサポートしています:</p>
-      <p></p>
-      <table>
-        <caption>コネクタの対応表</caption>
-        <tr><th>コネクタ名</th><th>コネクタプラットフォーム</th><th>サーバプラットフォーム</th><th>クライアントバージョン</th><th>サーババージョン</th></tr>
-        <tr><td>Alfresco</td><td>Pure Java</td><td>複数</td><td>Alfrescoウェブサービスクライアント 4.0.bで検証済み</td><td>Alfresco 2.x, 3.x, 4.xで検証済み</td></tr>
-        <tr><td>CMIS</td><td>Pure Java</td><td>複数</td><td>CMIS 1.0</td><td>CMIS 1.0</td></tr>
-        <tr><td>DropBox</td><td>Pure Java</td><td>複数</td><td>1.5.3</td><td>N/A</td></tr>
-        <tr><td>Email</td><td>Pure Java</td><td>複数</td><td>Javamail 1.4</td><td>N/A</td></tr>
-        <tr><td>ファイルシステム</td><td>Pure Java</td><td>Win/*NIX</td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>Googleドライブ</td><td>Pure Java</td><td>複数</td><td>v2-rev64-1.14.1-beta</td><td>N/A</td></tr>
-        <tr><td>HDFS</td><td>Pure Java</td><td>複数</td><td>2.2.0</td><td>1.1.2</td></tr>
-        <tr><td>Windows共有</td><td>Pure Java</td><td> Win, Samba, NetApp,その他のNASシステム</td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>JDBC</td><td>Pure Java</td><td>複数</td><td>JDBC V2, V3, V4対応;Oracle 10, JTDS 1.2, PostgreSQL 9.1, MySQL 5.5ドライバで検証済み</td><td>複数</td></tr>
-        <tr><td>Jira</td><td>Pure Java</td><td>複数</td><td>N/A</td><td>5.0-6.1</td></tr>
-        <tr><td>RSS</td><td>Pure Java</td><td> N/A </td><td> N/A </td><td>Atom, RSS 2.0, その他 </td></tr>
-        <tr><td>Web</td><td>Pure Java</td><td>N/A</td><td> N/A </td><td>HTMLバージョン1.0, 1.1, 2.0, Atom, RSS 2.0,その他</td></tr>
-        <tr><td>Wiki</td><td>Pure Java</td><td>N/A</td><td> N/A </td><td>Wiki 1.8以降</td></tr>
-        <tr><td>LiveLink (OpenText)</td><td>Pure Java</td><td> Win </td><td> LAPI 9.7.1, 10.2.0 </td><td>9.2.0 - 10.2.0で検証済み</td></tr>
-        <tr><td>Solr</td><td>Pure Java </td><td> N/A </td><td> N/A</td><td>Solr 1.4, 3.6.2, 4.0.0, 4.1.0, 4.2.0, 4.3.0, 4.5.1で検証済み</td></tr>
-        <tr><td>OpenSearchServer</td><td>Pure Java </td><td> N/A </td><td> N/A</td><td>OpenSearchServer 1.2.1, 1.2.2, 1.2.3, 1.3, 1.4, 1.5.xで検証済み</td></tr>
-        <tr><td>ElasticSearch</td><td>Pure Java </td><td> N/A </td><td> N/A</td><td>ElasticSearch 1.0, 1.1, 1.2, 1.3で検証済み</td></tr>
-        <tr><td>Documentum (EMC)</td><td>Win, RedHat</td><td> Win, RedHat </td><td>DFC 5.3 SP5で検証済み</td><td>5.3, 6.0, 6.5サーバで検証済み</td></tr>
-        <tr><td>SharePoint (MSFT)</td><td>Pure Java </td><td>Win</td><td> N/A </td><td>SharePoint 2003 (2.0), 2007 (3.0), 2010 (4.0), 2013 (5.0)で検証済み</td></tr>
-        <tr><td>Meridio (Autonomy)</td><td>Pure Java </td><td> Win </td><td> N/A </td><td>Meridio 4.1, 5.0で検証済み</td></tr>
-        <tr><td>FileNet (IBM)</td><td>Pure Java</td><td>Win, RedHat</td><td>P8 V4.1, V4.5で検証済み</td><td>P8 V4.1, V4.5で検証済み</td></tr>
-        <tr><td>Slack</td><td>Pure Java</td><td> N/A </td><td> N/A </td><td>Slack API November 2016で検証済み</td></tr>
-      </table>
-    </section>
-  </body>
-</document>
-
diff --git a/site/src/documentation/content/xdocs/ja_JP/index.xml b/site/src/documentation/content/xdocs/ja_JP/index.xml
deleted file mode 100644
index 4a15804..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/index.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>ManifoldCFにようこそ!</title> 
-  </header> 
-
-  <body> 
-    <section>
-	<title>ManifoldCFとは?</title>
-	<p>ManifoldCFとは、インターネットやイントラネットの様々なサーバに保管されている文書ファイルやWebページなどコンテンツを収集し、それを検索エンジンに送るJavaプログラムです。なお、コンテンツを収集する際にActiveDirectoryなど認証基盤と連携してコンテンツ毎に権限情報も収集し、検索するときにその権限情報を利用して表示内容を制限することもできます。例えば、人事情報に関する文書は、人事部のユーザが検索した時のみに表示するようにできます。</p>
-	<p>現バージョンのManifoldCFは、FileNet P8 (IBM), Documentum (EMC), LiveLink (OpenText), Meridio (Autonomy), Windows共有(Microsoft), SharePoint (Microsoft)のような商用商品に保存されているコンテンツと次のような汎用コネクタを使って様々なコンテンツを収集することができます:CMISコネクタ, ファイルシステムコネクタ, JDBCコネクタ, RSSフィードコネクタ, Wikiコネクタ, HTMLコネクタ。また収集したコンテンツをApache Solr, QBase(旧MetaCarta) GTS, OpenSearchServer, ElasticSearchに送ることができます。対応している製品及び規格一覧は<a href="included-connectors.html">ここ</a>にあります。</p>
-	<p>Apache ManifoldCFはMetaCarta, Inc.により開発されました。5年間の年月の間に複数企業用に開発/テストが繰り返された後の2009年12月にApache Software Foundationにコードソースが寄贈されました。</p>
-    </section>
-
-    <section>
-	<title>サードパーティのリポジトリについて</title>
-	<p>ManifoldCFにふくまれる商用ソフトウェア用のコネクタをビルドするには、サードパーティのライブラリ、パッケージ、そのソフトウェアが必要な場合があります。開発者はビルドする時にこれらサードパーティのソフトウェアを入手する必要はありますが、条件付きでコンパイルすることができるため、コネクタ自体のソースコードはApacheとして配布することができます。できる限りすべてをApacheライセンスに準拠するようにしたいと思っていますが、現実的には状況はすぐには変わりません。</p>
-	<p>サードパーティのソフトウェアを含めてビルドする手順はWikiページに掲載しています。</p>
-    </section>
-
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/javadoc.xml b/site/src/documentation/content/xdocs/ja_JP/javadoc.xml
deleted file mode 100644
index 3e8fdc8..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/javadoc.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document>
-
-  <header>
-    <title>ManifoldCF Javadoc</title>
-  </header>
-
-  <body>
-    <section>
-      <title>ManifoldCF Javadoc</title>
-      <p></p>
-      <p>The javadoc for the last released version of ManifoldCF and its connectors can be found by following the links below.</p>
-      <p><a href="../api/framework/index.html">ManifoldCF Framework</a></p>
-      <p><a href="../api/activedirectory/index.html">Active Directory authority</a></p>
-      <p><a href="../api/alfresco/index.html">Alfresco connector</a></p>
-      <p><a href="../api/cmis/index.html">CMIS authority and connector</a></p>
-      <p><a href="../api/documentum/index.html">Documentum authority, connector, and support processes</a></p>
-      <p><a href="../api/dropbox/index.html">Dropbox connector</a></p>
-      <p><a href="../api/email/index.html">Email connector</a></p>
-      <p><a href="../api/filenet/index.html">FileNet connector and support processes</a></p>
-      <p><a href="../api/filesystem/index.html">File system repository and output connector</a></p>
-      <p><a href="../api/googledrive/index.html">GoogleDrive connector</a></p>
-      <p><a href="../api/gridfs/index.html">GridFS connector</a></p>
-      <p><a href="../api/gts/index.html">qBase GTS output connector</a></p>
-      <p><a href="../api/hdfs/index.html">HDFS repository and output connector</a></p>
-      <p><a href="../api/jcifs/index.html">CIFS connector</a></p>
-      <p><a href="../api/jira/index.html">JIRA connector and authority</a></p>
-      <p><a href="../api/jdbc/index.html">JDBC connector</a></p>
-      <p><a href="../api/livelink/index.html">LiveLink authority and connector</a></p>
-      <p><a href="../api/meridio/index.html">Meridio authority and connector</a></p>
-      <p><a href="../api/opensearchserver/index.html">OpenSearchServer output connector</a></p>
-      <p><a href="../api/elasticsearch/index.html">ElasticSearch output connector</a></p>
-      <p><a href="../api/nullauthority/index.html">Null authority</a></p>
-      <p><a href="../api/nulloutput/index.html">Null output connector</a></p>
-      <p><a href="../api/regexpmapper/index.html">Regular expression mapping connector</a></p>
-      <p><a href="../api/rss/index.html">RSS connector</a></p>
-      <p><a href="../api/sharepoint/index.html">SharePoint connector</a></p>
-      <p><a href="../api/slack/index.html">Slack notification connector</a></p>
-      <p><a href="../api/solr/index.html">Solr output connector</a></p>
-      <p><a href="../api/webcrawler/index.html">Web connector</a></p>
-      <p><a href="../api/wiki/index.html">Wiki connector</a></p>
-    </section>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/performance-tuning.xml b/site/src/documentation/content/xdocs/ja_JP/performance-tuning.xml
deleted file mode 100644
index 2f9f0bc..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/performance-tuning.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Performance tuning</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Performance tuning</title>
-      <p></p>
-      <p>
-        In order to get the most out of ManifoldCF, performance-wise, there are a few things you need to know.  First, you need to know how to configure the project so that it performs optimally.  You'll also want to know what hardware would work best.  And, no doubt, you want to have some idea whether you've actually done everything properly, so you need data to compare with.
-        This page will hopefully answer all of those questions.
-      </p>
-      <section>
-        <title>Configuration for performance</title>
-        <p></p>
-        <p>
-          The goal of performance tuning for ManifoldCF is to take maximum advantage of parallelism in the system doing the work, and to make sure there are no bottlenecks anywhere that would slow things down.
-          The most important underpinning of ManifoldCF is the database, since that is the only persistent storage mechanism ManifoldCF uses.  Getting the database right is therefore the first goal.
-        </p>
-        <section>
-          <title>Selecting the database</title>
-          <p>
-            Start by using PostgreSQL rather than Derby, because Derby has known performance problems when it comes to handling deadlocks.
-            Database deadlocks arise naturally in systems like ManifoldCF that are highly threaded, and while the risk of their arising can be reduced, it cannot entirely be eliminated.
-            Derby, on the other hand, has the ability to deadlock with a simple SELECT against a table happening at the same time as a DELETE against the same table, and Derby requires a hang of a minute before it detects the deadlock.
-            Obviously that behavior is incompatible with high performance.  So, use PostgreSQL if you care at all about crawler performance.  See the <a href="how-to-build-and-deploy.html">how-to-deploy</a> page for a description of how to run ManifoldCF under PostgreSQL.
-          </p>
-          <p>
-            Certain PostgreSQL versions are also known to generate bad plans for ManifoldCF queries.  When this happens, crawls of any size may become extremely slow.
-            The ManifoldCF log will start to include many warnings of the sort, "Query took more than a minute", with a corresponding dumped plan that shows a sequential scan of a large table.
-            At this point you should suspect you have a bad version of PostgreSQL.  Known bad versions include 8.3.12.  Known good versions are 8.3.7, 8.3.8, and 8.4.5.
-          </p>
-        </section>
-        <section>
-          <title>Configuring PostgreSQL correctly</title>
-          <p>
-            The key configuration changes you need to make to PostgreSQL from its out-of-the-box settings are intended to:
-          </p>
-          <ul>
-            <li>Set PostgreSQL up with enough database handles so that that will not be a bottleneck;</li>
-            <li>Make sure PostgreSQL has enough shared memory allocated to support the number of handles you selected;</li>
-            <li>Turn off autovacuuming.</li>
-          </ul>
-          <p>
-            The <em>postgresql.conf</em> file is where you set most of these options.  Some recommended settings are described in <a href="how-to-build-and-deploy.html">the deployment page</a>.
-            The postgresql.conf file describes the relationship between parameters, especially between the number of database handles and the amount of shared memory allocated.  This can differ significantly
-            from version to version, so it never hurts to read the text in that file, and understand what you are trying to achieve.
-          </p>
-          <p>
-            The number of database handles you need will depend on your ManifoldCF setup.  If you use the Quick Start, for instance, fewer handles are needed, because only one process is used.  The formula relating handle count to other
-            parameters of ManifoldCF is presented below.
-          </p>
-          <p></p>
-          <p>manifoldcf_db_pool_size * number_of_manifoldcf_processes &lt;= maximum_postgresql_database_handles - 2</p>
-          <p></p>
-          <p>
-            The number of processes you might have depends on how you deployed ManifoldCF.  If you used the Quick Start, you will only have one process.  But if you deployed in a more distributed way,
-            you will have at least a process for the agents daemon, as well as at one process for each web application.  If you anticipate that a command-line utility could be used at the same time,
-            that's one more process.  These multiply quickly, so the number of database handles you need to make available can get quite large, unless you limit the ManifoldCF pool size artificially
-            instead.
-          </p>
-          <p>Setting the parameters that control the size of the database connection pool is covered in the next section.</p>
-        </section>
-        <section>
-          <title>Setting the ManifoldCF database handle pool size</title>
-          <p>
-            The database handle pool size must be set correctly, or ManifoldCF will not perform well, and may even deadlock waiting to get a database handle.
-            The properties.xml parameter that controls this is <em>org.apache.manifoldcf.database.maxhandles</em>.  The formula you should use to properly set the value is below.
-          </p>
-          <p></p>
-          <p>worker_thread_count + delete_thread_count + expiration_thread_count + cleanup_thread_count + 10 &lt; manifoldcf_db_pool_size</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Setting the number of worker, delete, and expiration threads</title>
-          <p>
-            The number of each variety of thread you choose depends on a number of factors that are specific to the kinds of tasks you expect to do.
-            First, note that constraints based on your hardware may have the effect of setting an upper bound on the total number of threads.  If, for example, memory constraints
-            on your system have the effect of limiting the number of available PostgreSQL handles, the total threads will also be limited as a result of applying the formulas already given.
-          </p>
-          <p>
-            If you do not have any such constraints, then you can choose the number of threads based on other hardware factors.  Typically, the number of processors would be what you'd consider
-            in coming up with the total thread count.  A value of between 12 and 35 threads per processor is typical.  The optimal number for you will require some experimentation.
-          </p>
-          <p>The threads then have to be allocated to the worker, deletion, or expiration category.  If your work load does not require much in the way of deleting documents or expiring them,
-            it is usually adequate to retain the default of 10 deletion and 10 expiration threads, and simply adjust the worker thread count.  The worker thread count parameter is <em>org.apache.manifoldcf.crawler.threads</em>.
-            See <a href="how-to-build-and-deploy.html">the deployment page</a> for a list of all of these parameters.
-          </p>
-        </section>
-        <section>
-          <title>Database maintenance</title>
-          <p>
-            Once you have the database and ManifoldCF configurated correctly, you will discover that the performance of the system gradually degrades over time.  This is because PostgreSQL
-            requires periodic maintenance in order to function optimally.  This maintenance is called <em>vacuuming</em>.
-          </p>
-          <p>
-            Our recommendation is to vacuum on a schedule, and to use the "full" variant of the vacuum command (e.g. "VACUUM FULL").  PostgreSQL gives you the option of lesser
-            vacuums, some of which can be done in background, but in our experience these are very expensive performance-wise, and are not very helpful either.  "VACUUM FULL" makes a
-            complete new copy of the database, a table at a time, stored in an optimal way.  It is also reasonably quick, considering what it is doing.
-          </p>
-        </section>
-      </section>
-      <section>
-        <title>Some results</title>
-        <p>
-          We've run performance test on several systems.  Depending on hardware configuration, we've seen as fast as 57 documents per second to 16 documents per second.  We tested with three different systems and ran the test
-          across 306,944 documents.  The table below shows the relevant configurations and results:
-        </p>
-        <table>
-          <tr><th>System</th><th>Processors (2+ Ghz)</th><th>Memory</th><th>Disk drives</th><th>Elapsed time (seconds)</th><th>Documents per second</th></tr>
-          <tr><td>Desktop</td><td>2</td><td>8 GB</td><td>7,200 RPM</td><td>19,492</td><td>16</td></tr>
-          <tr><td>Laptop</td><td>2</td><td>4 GB</td><td>Samsung SSD RBX</td><td>9,230</td><td>33</td></tr>
-          <tr><td>Server</td><td>8</td><td>8 GB</td><td>10,000 RPM</td><td>5,366</td><td>57</td></tr>
-        </table>
-        <p>
-          For these tests, we ran the Quick-Start example configuration from ManifoldCF as is, with the exception of using an external PostgreSQL database instead of the embedded Derby.
-          We altered the ManifoldCF and PostgreSQL configuration from their default settings to maximize system resource usage.  The table below shows the key configuration changes.
-        </p>
-        <table>
-          <tr><th>Workers</th><th>ManifoldCF DB Connections</th><th>PostgreSQL Connections</th><th>Max repository connections</th><th>JVM Memory</th></tr>
-          <tr><td>100</td><td>105</td><td>200</td><td>105</td><td>1024 MB</td></tr>
-        </table>
-        <p>Additionally, we made postgresql.conf changes as shown in the table below:</p>
-        <table>
-          <tr><th>Parameter</th><th>Value</th></tr>
-          <tr><td>shared_buffers</td><td>1024MB</td></tr>
-          <tr><td>checkpoint_segments</td><td>300</td></tr>
-          <tr><td>maintenanceworkmem</td><td>2MB</td></tr>
-          <tr><td>tcpip_socket</td><td>true</td></tr>
-          <tr><td>max_connections</td><td>200</td></tr>
-          <tr><td>checkpoint_timeout</td><td>900</td></tr>
-          <tr><td>datestyle</td><td>ISO,European</td></tr>
-          <tr><td>autovacuum</td><td>off</td></tr>
-        </table>
-        <p>There are some interesting conclusions, for example the use of Solid State Drives for the laptop.  Even though addressable memory was reduced to 4 GB, the system processed twice as much documents than the desktop did with slower disks.  The other interesting fact is that the server had lower performing disks, but 4 times as many processors, and it was twice as fast as the laptop.</p>
-      </section>
-    </section>
-  </body>
-</document>
-
-
-
-
-
-
-        
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml b/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml
deleted file mode 100644
index 58b9005..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml
+++ /dev/null
@@ -1,659 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Programmatic Operation</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Programmatic Operation</title>
-      <p></p>
-      <p>A certain subset of ManifoldCF users want to think of ManifoldCF as an engine that they can poke from whatever other system they are developing.  While
-        ManifoldCF is not precisely a document indexing engine per se, it can certainly be controlled programmatically.  Right now, there are three principle ways of
-        achieving this control.</p>
-      <p></p>
-      <section>
-        <title>Control by Servlet API</title>
-        <p></p>
-        <p>ManifoldCF provides a servlet-based JSON API that gives you the complete ability to define connections and jobs, and control job execution.  You can read
-          about JSON <a href="http://www.json.org">here</a>.  The API is designed to be RESTful in character.  Thus, it makes full use of the HTTP verbs
-          GET, PUT, POST, and DELETE, and represents objects as URLs.</p>
-        <section>
-          <title>URL format</title>
-          <p></p>
-          <p>The basic format of the JSON servlet resource URLs is as follows:</p>
-          <p></p>
-          <p>http[s]://<em>&lt;server_and_port&gt;</em>/mcf-api-service/json/<em>&lt;resource&gt;</em></p>
-          <p></p>
-          <p>The servlet ignores request data, except when the PUT or POST verb is used.  In that case, the request data is presumed to be a JSON object.  The servlet
-            responds either with an error response code (either 400 or 500) with an appropriate explanatory message, or with a 200 (OK), 201 (CREATED), 
-            401 (UNAUTHORIZED), or 404 (NOT FOUND) response code along with a response JSON object.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>JSON equivalents for ManifoldCF</title>
-          <p></p>
-          <p>ManifoldCF treats certain JSON forms as equivalent, for the purposes of readability.  For example, the array form <strong>"foo" : [ { ... } ]</strong> is
-            treated equivalently to <strong>"foo" : { }</strong>, whenever there is only one array element.  This gives a coder some flexibility as to how s/he encodes
-            JSON in requests.  Please also be aware that similar compressions will occur in the JSON responses from the API servlet, and your code must be able to deal
-            with this possibility.  The following table describes some of the equivalences:</p>
-          <p></p>
-          <p></p>
-          <p></p>
-          <table>
-            <tr><th>Form</th><th>Equivalent</th></tr>
-            <tr><td>[ { ... } ]</td><td>{ ... }</td></tr>
-            <tr><td>"foo" : { "_value_" : "bar" }</td><td>"foo" : "bar"</td></tr>
-            <tr><td>"_children_" : [ "foo":{ ... }, "foo":{ ... } ]</td><td>"foo" : [ { ... }, { ... } ]</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Resources and commands</title>
-          <p></p>
-          <p>The actual available resources and commands are as follows:</p>
-          <p></p>
-          <p></p>
-          <p></p>
-          <table>
-            <tr><th>Resource</th><th>Verb</th><th>What it does</th><th>Input format/query args</th><th>Output format</th></tr>
-            <tr><td>LOGIN</td><td>POST</td><td>Log in the specified user</td><td>{"userID":<em>&lt;user_name&gt;</em>, "password":<em>&lt;password&gt;</em>}</td><td>{}</td></tr>
-            <tr><td>authorizationdomains</td><td>GET</td><td>List all registered authorization domains</td><td>N/A</td><td>{"authorizationdomain":[<em>&lt;list_of_authorization_domain_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnectors</td><td>GET</td><td>List all registered output connectors</td><td>N/A</td><td>{"outputconnector":[<em>&lt;list_of_output_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnectors</td><td>GET</td><td>List all registered transformation connectors</td><td>N/A</td><td>{"transformationconnector":[<em>&lt;list_of_transformation_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnectors</td><td>GET</td><td>List all registered mapping connectors</td><td>N/A</td><td>{"mappingconnector":[<em>&lt;list_of_mapping_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnectors</td><td>GET</td><td>List all registered authority connectors</td><td>N/A</td><td>{"authorityconnector":[<em>&lt;list_of_authority_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectors</td><td>GET</td><td>List all registered repository connectors</td><td>N/A</td><td>{"repositoryconnector":[<em>&lt;list_of_repository_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnectors</td><td>GET</td><td>List all registered notification connectors</td><td>N/A</td><td>{"notificationconnector":[<em>&lt;list_of_notification_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups</td><td>GET</td><td>List all authority groups</td><td>N/A</td><td>{"authoritygroup":[<em>&lt;list_of_authority_group_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>GET</td><td>Get a specific authority group</td><td>N/A</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>PUT</td><td>Save or create an authority group</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>DELETE</td><td>Delete an authority group</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections</td><td>GET</td><td>List all output connections</td><td>N/A</td><td>{"outputconnection":[<em>&lt;list_of_output_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific output connection</td><td>N/A</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an output connection</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete an output connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of an output connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/outputconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections</td><td>GET</td><td>List all transformation connections</td><td>N/A</td><td>{"transformationconnection":[<em>&lt;list_of_transformation_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific transformation connection</td><td>N/A</td><td>{"transformationconnection":<em>&lt;transformation_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a transformation connection</td><td>{"outputconnection":<em>&lt;transformation_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a transformation connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a transformation connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/transformationconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>clearversions/<em>&lt;encoded_output_connection_name&gt;</em></td><td>PUT</td><td>Forget previous indexed document versions</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>clearrecords/<em>&lt;encoded_output_connection_name&gt;</em></td><td>PUT</td><td>Remove all previous indexing records</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections</td><td>GET</td><td>List all mapping connections</td><td>N/A</td><td>{"mappingconnection":[<em>&lt;list_of_mapping_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific mapping connection</td><td>N/A</td><td>{"mappingconnection":<em>&lt;mapping_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a mapping connection</td><td>{"mappingconnection":<em>&lt;mapping_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a mapping connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a mapping connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections</td><td>GET</td><td>List all authority connections</td><td>N/A</td><td>{"authorityconnection":[<em>&lt;list_of_authority_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific authority connection</td><td>N/A</td><td>{"authorityconnection":<em>&lt;authority_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an authority connection</td><td>{"authorityconnection":<em>&lt;authority_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete an authority connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of an authority connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections</td><td>GET</td><td>List all repository connections</td><td>N/A</td><td>{"repositoryconnection":[<em>&lt;list_of_repository_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific repository connection</td><td>N/A</td><td>{"repositoryconnection":<em>&lt;repository_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a repository connection</td><td>{"repositoryconnection":<em>&lt;repository_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a repository connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a repository connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/repositoryconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections</td><td>GET</td><td>List all notification connections</td><td>N/A</td><td>{"notificationconnection":[<em>&lt;list_of_notification_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific notification connection</td><td>N/A</td><td>{"notificationconnection":<em>&lt;notification_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a notification connection</td><td>{"notificationconnection":<em>&lt;notification_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a notification connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>status/notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a notification connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>info/notificationconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>clearhistory/<em>&lt;encoded_repository_connection_name&gt;</em></td><td>PUT</td><td>Clear history linked with repository connection</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs</td><td>GET</td><td>List all job definitions</td><td>N/A</td><td>{"job":[<em>&lt;list_of_job_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs</td><td>POST</td><td>Create a job</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{"job_id":<em>&lt;job_identifier&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job definition</td><td>N/A</td><td>{"job":<em>&lt;job_object_&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Save a job definition</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>DELETE</td><td>Delete a job definition</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobstatuses</td><td>GET</td><td>List all jobs and their status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobstatuses/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
-            <tr><td>jobstatusesnocounts<em>&lt;job_id&gt;</em></td><td>GET</td><td>List all jobs and their status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
-            <tr><td>jobstatusesnocounts/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
-            <tr><td>start/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>startminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>abort/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Abort a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>restart/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Stop and start a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>restartminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Stop and start a specified job, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>pause/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Pause a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>resume/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Resume a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>reseed/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Reset incremental seeding for a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-
-            <tr><td>repositoryconnectionhistory/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a history report</td><td><em>&lt;history_query_parameters&gt;</em></td><td>{"row":[{"column":[{"name":<em>&lt;col_name&gt;</em>,"value":<em>&lt;col_value&gt;</em>}, ...]}, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectionquery/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a queue report</td><td><em>&lt;queue_query_parameters&gt;</em></td><td>{"row":[{"column":[{"name":<em>&lt;col_name&gt;</em>,"value":<em>&lt;col_value&gt;</em>}, ...]}, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectionactivities/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a list of legal activities for a connection</td><td>N/A</td><td>{"activity":[<em>&lt;activity_name&gt;</em>, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>repositoryconnectionjobs/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a list of jobs for a connection</td><td>N/A</td><td>{"job":[<em>&lt;list_of_job_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>History query parameters</title>
-          <p></p>
-          <p>The history query parameters and their meanings are as follows:</p>
-          <table>
-            <tr><th>Parameter</th><th>Report type</th><th>Multivalued?</th><th>Meaning</th></tr>
-            <tr><td>report</td><td>All</td><td>No</td><td>The kind of history report desired; legal values are "simple", "maxactivity", "maxbandwidth", and "result"; defaults to "simple"</td></tr>
-            <tr><td>starttime</td><td>All</td><td>No</td><td>Starting time in ms since epoch; defaults to "0"</td></tr>
-            <tr><td>endtime</td><td>All</td><td>No</td><td>Ending time in ms since epoch; defaults to now</td></tr>
-            <tr><td>activity</td><td>All</td><td>Yes</td><td>Which activities you want to see</td></tr>
-            <tr><td>entitymatch</td><td>All</td><td>No</td><td>Regular expression matching entity identifier; defaults to ""</td></tr>
-            <tr><td>entitymatch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of entitymatch</td></tr>
-            <tr><td>resultcodematch</td><td>All</td><td>No</td><td>Regular expression match result code; defaults to ""</td></tr>
-            <tr><td>resultcodematch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of resultcodematch</td></tr>
-            <tr><td>sortcolumn</td><td>All</td><td>Yes</td><td>Result column to sort the result by</td></tr>
-            <tr><td>sortcolumn_direction</td><td>All</td><td>Yes</td><td>Direction to sort the corresponding column ("ascending" or "descending")</td></tr>
-            <tr><td>startrow</td><td>All</td><td>No</td><td>Starting row in resultset to return; defaults to 0</td></tr>
-            <tr><td>rowcount</td><td>All</td><td>No</td><td>Maximum number of rows to return; defaults to 20</td></tr>
-            <tr><td>idbucket</td><td>maxactivity, maxbandwidth, result</td><td>No</td><td>Regular expression selecting which part of the entity identifier to use as an aggregation key; defaults to "()"</td></tr>
-            <tr><td>idbucket_insensitive</td><td>maxactivity, maxbandwidth, result</td><td>No</td><td>Case insensitive version of idbucket</td></tr>
-            <tr><td>resultcodebucket</td><td>result</td><td>No</td><td>Regular expression selecting which part of the result code to use as an aggregation key; defaults to "(.*)"</td></tr>
-            <tr><td>resultcodebucket_insensitive</td><td>result</td><td>No</td><td>Case insensitive version of resultcodebucket</td></tr>
-            <tr><td>interval</td><td>maxactivity, maxbandwidth</td><td>No</td><td>Size of window in milliseconds for assessing rate; defaults to 300000</td></tr>
-          </table>
-          <p></p>
-          <p>Each report type has different return columns, as listed below:</p>
-          <p></p>
-          <table>
-            <tr><th>Report type</th><th>Return columns</th></tr>
-            <tr><td>simple</td><td>starttime, resultcode, resultdesc, identifier, activity, bytes, elapsedtime</td></tr>
-            <tr><td>maxactivity</td><td>starttime, endtime, activitycount, idbucket</td></tr>
-            <tr><td>maxbandwidth</td><td>starttime, endtime, bytecount, idbucket</td></tr>
-            <tr><td>result</td><td>idbucket, resultcodebucket, eventcount</td></tr>
-          </table>
-        </section>
-        <section>
-          <title>Queue query parameters</title>
-          <p></p>
-          <p>The queue query parameters and their meanings are as follows:</p>
-          <table>
-            <tr><th>Parameter</th><th>Report type</th><th>Multivalued?</th><th>Meaning</th></tr>
-            <tr><td>report</td><td>All</td><td>No</td><td>The kind of queue report desired; legal values are "document" or "status"; defaults to "document"</td></tr>
-            <tr><td>now</td><td>All</td><td>No</td><td>The time in milliseconds since epoch to perform the queue assessment relative to; defaults to current time</td></tr>
-            <tr><td>idmatch</td><td>All</td><td>No</td><td>Regular expression matching document identifier; defaults to ""</td></tr>
-            <tr><td>idmatch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of idmatch</td></tr>
-            <tr><td>statematch</td><td>All</td><td>Yes</td><td>State to match; valid values are "neverprocessed", "previouslyprocessed", "outofscope"</td></tr>
-            <tr><td>statusmatch</td><td>All</td><td>Yes</td><td>Status to match; valid values are "inactive", "processing", "expiring", "deleting", "readyforprocessing", "readyforexpiration", "waitingforprocessing", "waitingforexpiration", "waitingforever", and "hopcountexceeded"</td></tr>
-            <tr><td>sortcolumn</td><td>All</td><td>Yes</td><td>Result column to sort the result by</td></tr>
-            <tr><td>sortcolumn_direction</td><td>All</td><td>Yes</td><td>Direction to sort the corresponding column ("ascending" or "descending")</td></tr>
-            <tr><td>startrow</td><td>All</td><td>No</td><td>Starting row in resultset to return; defaults to 0</td></tr>
-            <tr><td>rowcount</td><td>All</td><td>No</td><td>Maximum number of rows to return; defaults to 20</td></tr>
-            <tr><td>idbucket</td><td>status</td><td>No</td><td>Regular expression selecting which part of the document identifier to use as an aggregation key; defaults to "()"</td></tr>
-            <tr><td>idbucket_insensitive</td><td>status</td><td>No</td><td>Case insensitive version of idbucket</td></tr>
-          </table>
-          <p></p>
-          <p>Each report type has different return columns, as listed below:</p>
-          <p></p>
-          <table>
-            <tr><th>Report type</th><th>Return columns</th></tr>
-            <tr><td>document</td><td>identifier, job, state, status, scheduled, action, retrycount, retrylimit</td></tr>
-            <tr><td>status</td><td>idbucket, inactive, processing, expiring, deleting, processready, expireready, processwaiting, expirewaiting, waitingforever, hopcountexceeded</td></tr>
-          </table>
-        </section>
-        <section>
-          <title>Authorization domain objects</title>
-          <p></p>
-          <p>The JSON fields an authorization domain object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the authorization domain</td></tr>
-            <tr><td>"domain_name"</td><td>The internal name of the authorization domain, i.e. what is sent to the Authority Service</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Output connector objects</title>
-          <p></p>
-          <p>The JSON fields an output connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Transformation connector objects</title>
-          <p></p>
-          <p>The JSON fields a transformation connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Mapping connector objects</title>
-          <p></p>
-          <p>The JSON fields a mapping connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Authority connector objects</title>
-          <p></p>
-          <p>The JSON fields an authority connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Repository connector objects</title>
-          <p></p>
-          <p>The JSON fields a repository connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Notification connector objects</title>
-          <p></p>
-          <p>The JSON fields a repository connector object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>
-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Authority group objects</title>
-          <p></p>
-          <p>Authority group names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields an authority group object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the group</td></tr>
-            <tr><td>"description"</td><td>The description of the group</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Output connection objects</title>
-          <p></p>
-          <p>Output connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields an output connection object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Transformation connection objects</title>
-          <p></p>
-          <p>Transformation connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields an output connection object has are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Mapping connection objects</title>
-          <p></p>
-          <p>Mapping connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for a mapping connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Authority connection objects</title>
-          <p></p>
-          <p>Authority connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for an authority connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>
-            <tr><td>"authdomain"</td><td>The authorization domain for the authority connection, if any</td></tr>
-            <tr><td>"authgroup"</td><td>The required authority group for the authority connection</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Repository connection objects</title>
-          <p></p>
-          <p>Repository connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for a repository connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"acl_authority"</td><td>The (optional) name of the authority group that will enforce security for this connection</td></tr>
-            <tr><td>"throttle"</td><td>An array of throttle objects, which control how quickly documents can be requested from this connection</td></tr>
-          </table>
-          <p></p>
-          <p>Each throttle object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"match"</td><td>The regular expression which is used to match a document's bins to determine if the throttle should be applied</td></tr>
-            <tr><td>"match_description"</td><td>Optional text describing the meaning of the throttle</td></tr>
-            <tr><td>"rate"</td><td>The maximum fetch rate to use if the throttle applies, in fetches per minute</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Notification connection objects</title>
-          <p></p>
-          <p>Notification connection names, when they are part of a URL, should be encoded as follows:</p>
-          <p></p>
-          <ol>
-            <li>All instances of '.' should be replaced by '..'.</li>
-            <li>All instances of '/' should be replaced by '.+'.</li>
-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
-          </ol>
-          <p></p>
-          <p>The JSON fields for a notification connection object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>
-            <tr><td>"description"</td><td>The description of the connection</td></tr>
-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Job objects</title>
-          <p></p>
-          <p>The JSON fields for a job are is as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"id"</td><td>The job's identifier, if present.  If not present, ManifoldCF will create one (and will also create the job when saved).</td></tr>
-            <tr><td>"description"</td><td>Text describing the job</td></tr>
-            <tr><td>"repository_connection"</td><td>The name of the repository connection to use with the job</td></tr>
-            <tr><td>"document_specification"</td><td>The document specification object for the job, whose format is repository-connection specific</td></tr>
-            <tr><td>"start_mode"</td><td>The start mode for the job, which can be one of "schedule window start", "schedule window anytime", or "manual"</td></tr>
-            <tr><td>"run_mode"</td><td>The run mode for the job, which can be either "continuous" or "scan once"</td></tr>
-            <tr><td>"hopcount_mode"</td><td>The hopcount mode for the job, which can be either "accurate", "no delete", "never delete"</td></tr>
-            <tr><td>"priority"</td><td>The job's priority, typically "5"</td></tr>
-            <tr><td>"recrawl_interval"</td><td>The default time between recrawl of documents (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"max_recrawl_interval"</td><td>The maximum time between recrawl of documents (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"expiration_interval"</td><td>The time until a document expires (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"reseed_interval"</td><td>The time between reseeding operations (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>
-            <tr><td>"hopcount"</td><td>An array of hopcount objects, describing the link types and associated maximum hops permitted for the job</td></tr>
-            <tr><td>"schedule"</td><td>An array of schedule objects, describing when the job should be started and run</td></tr>
-            <tr><td>"pipelinestage"</td><td>An array of pipelinestage objects, describing what the transformation pipeline is</td></tr>
-            <tr><td>"notificationstage"</td><td>An array of notificationstage objects, describing what the notifications are</td></tr>
-          </table>
-          <p></p>
-          <p>Each pipelinestage object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"stage_id"</td><td>The unique identifier for the pipeline stage</td></tr>
-            <tr><td>"stage_prerequisite"</td><td>The unique identifier for the preceding pipeline stage; may be missing if none</td></tr>
-            <tr><td>"stage_isoutput"</td><td>"true" if the stage is an output connection</td></tr>
-            <tr><td>"stage_connectionname"</td><td>The connection name for the pipeline stage</td></tr>
-            <tr><td>"stage_description"</td><td>A description of the pipeline stage</td></tr>
-            <tr><td>"stage_specification"</td><td>The specification string for the pipeline stage</td></tr>
-          </table>
-          <p></p>
-          <p>Each notificationstage object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"stage_id"</td><td>The unique identifier for the notification stage</td></tr>
-            <tr><td>"stage_connectionname"</td><td>The connection name for the notification stage</td></tr>
-            <tr><td>"stage_description"</td><td>A description of the notification stage</td></tr>
-            <tr><td>"stage_specification"</td><td>The specification string for the notification stage</td></tr>
-          </table>
-          <p></p>
-          <p>Each hopcount object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"link_type"</td><td>The connection-type-dependent type of a link for which a hop count restriction is specified</td></tr>
-            <tr><td>"count"</td><td>The maximum number of hops allowed for the associated link type, starting at a seed</td></tr>
-          </table>
-          <p></p>
-          <p>Each schedule object has the following fields:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"timezone"</td><td>The optional time zone for the schedule object; if not present the default server time zone is used</td></tr>
-            <tr><td>"duration"</td><td>The optional length of the described time window, in milliseconds; if not present, duration is considered infinite</td></tr>
-            <tr><td>"dayofweek"</td><td>The optional day-of-the-week enumeration object</td></tr>
-            <tr><td>"monthofyear"</td><td>The optional month-of-the-year enumeration object</td></tr>
-            <tr><td>"dayofmonth"</td><td>The optional day-of-the-month enumeration object</td></tr>
-            <tr><td>"year"</td><td>The optional year enumeration object</td></tr>
-            <tr><td>"hourofday"</td><td>The optional hour-of-the-day enumeration object</td></tr>
-            <tr><td>"minutesofhour"</td><td>The optional minutes-of-the-hour enumeration object</td></tr>
-            <tr><td>"requestminimum"</td><td>Optional flag indicating whether the job run will be minimal or not ("true" means minimal)</td></tr>
-          </table>
-          <p></p>
-          <p>Each enumeration object describes an array of integers using the form:</p>
-          <p></p>
-          <p>{"value":[<em>&lt;integer_list&gt;</em>]}</p>
-          <p></p>
-          <p>Each integer is a zero-based index describing which entity is being specified.  For example, for "dayofweek", 0 corresponds to Sunday, etc., and thus "dayofweek":{"value":[0,6]} would describe Saturdays and Sundays.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Job status objects</title>
-          <p></p>
-          <p>The JSON fields of a job status object are as follows:</p>
-          <p></p>
-          <table>
-            <tr><th>Field</th><th>Meaning</th></tr>
-            <tr><td>"job_id"</td><td>The job identifier</td></tr>
-            <tr><td>"status"</td><td>The job status, having the possible values: "not yet run", "running", "paused", "done", "waiting", "stopping", "resuming", "starting up", "cleaning up", "error", "aborting", "restarting", "running no connector", and "terminating"</td></tr>
-            <tr><td>"error_text"</td><td>The error text, if the status is "error"</td></tr>
-            <tr><td>"start_time"</td><td>The job start time, in milliseconds since Jan 1, 1970</td></tr>
-            <tr><td>"end_time"</td><td>The job end time, in milliseconds since Jan 1, 1970</td></tr>
-            <tr><td>"documents_in_queue"</td><td>The total number of documents in the queue for the job</td></tr>
-            <tr><td>"documents_outstanding"</td><td>The number of documents for the job that are currently considered 'active'</td></tr>
-            <tr><td>"documents_processed"</td><td>The number of documents that in the queue for the job that have been processed at least once</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>Connection-type-specific objects</title>
-          <p></p>
-          <p>As you may note when trying to use the above JSON API methods, you cannot get very far in defining connections or jobs without knowing the JSON format of a connection's configuration information, or a job's connection-specific document specification and output specification information.  The form of these objects is controlled by the Java implementation of the underlying connector, and is translated directly into JSON, so if you write your own connector you should be able to figure out what it will be in the API.  For connectors already part of ManifoldCF, it remains an ongoing task to document these connector-specific objects.  This task is not yet underway.</p>
-          <p></p>
-          <p>Luckily, it is pretty easy to learn a lot about the objects in question by simply creating connections and jobs in the ManifoldCF crawler UI, and then inspecting the resulting JSON objects through the API.  In this way, it should be possible to do a decent job of coding most API-based integrations.  The one place where difficulties will certainly occur will be if you try to completely replace the ManifoldCF crawler UI with one of your own.  This is because most connectors have methods that communicate with their respective back-ends in order to allow the user to select appropriate values.  For example, the path drill-down that is presented by the LiveLink connector requires that the connector interrogate the appropriate LiveLink repository in order to populate its path selection pull-downs.  There is, at this time, only one sanctioned way to accomplish the same job using the API, which is to use the appropriate "<em>connection_type</em>/execute/<em>type-specific_command</em>" command to perform the necessary functions.  Some set of useful functions has been coded for every appropriate connector, but the exact commands for every connector, and their JSON syntax, remains undocumented for now.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>File system connector</title>
-          <p></p>
-          <p>The file system connector has no configuration information, and no connector-specific commands.  However, it does have document specification information.  The information looks something like this:</p>
-          <p></p>
-          <p>{"startpoint":[{"_attribute_path":"c:\path_to_files","include":[{"_attribute_type":"file","_attribute_match":"*.txt"},{"_attribute_type":"file","_attribute_match":"*.doc"\,"_attribute_type":"directory","_attribute_match":"*"],"exclude":["*.mov"]]}</p>
-          <p></p>
-          <p>As you can see, multiple starting paths are possible, and the inclusion and exclusion rules also can be one or multiple.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Control via Commands</title>
-        <p></p>
-        <p>For script writers, there currently exist a number of ManifoldCF execution commands.  These commands are primarily rich in the area of definition of connections and jobs, controlling jobs, and running reports.  The following table lists the current suite.</p>
-        <p></p>
-        <table>
-          <tr><th>Command</th><th>What it does</th></tr>
-          <tr><td>org.apache.manifoldcf.agents.DefineOutputConnection</td><td>Create a new output connection</td></tr>
-          <tr><td>org.apache.manifoldcf.agents.DeleteOutputConnection</td><td>Delete an existing output connection</td></tr>
-          <tr><td>org.apache.manifoldcf.agents.DefineTransformationConnection</td><td>Create a new transformation connection</td></tr>
-          <tr><td>org.apache.manifoldcf.agents.DeleteTransformationConnection</td><td>Delete an existing transformation connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.ChangeAuthSpec</td><td>Modify an authority's configuration information</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.CheckAll</td><td>Check all authorities to be sure they are functioning</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DefineAuthorityConnection</td><td>Create a new authority connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DeleteAuthorityConnection</td><td>Delete an existing authority connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DefineMappingConnection</td><td>Create a new mapping connection</td></tr>
-          <tr><td>org.apache.manifoldcf.authorities.DeleteMappingConnection</td><td>Delete an existing mapping connection</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.AbortJob</td><td>Abort a running job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.AddScheduledTime</td><td>Add a schedule record to a job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ChangeJobDocSpec</td><td>Modify a job's specification information</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DefineJob</td><td>Create a new job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DefineRepositoryConnection</td><td>Create a new repository connection</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DeleteJob</td><td>Delete an existing job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.DeleteRepositoryConnection</td><td>Delete an existing repository connection</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ExportConfiguration</td><td>Write the complete list of all connection definitions and job specifications to a file</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.FindJob</td><td>Locate a job identifier given a job's name</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.GetJobSchedule</td><td>Find a job's schedule given a job's identifier</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ImportConfiguration</td><td>Import configuration as written by a previous ExportConfiguration command</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ListJobStatuses</td><td>List the status of all jobs</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.ListJobs</td><td>List the identifiers for all jobs</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.PauseJob</td><td>Given a job identifier, pause the specified job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RestartJob</td><td>Given a job identifier, restart the specified job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunDocumentStatus</td><td>Run a document status report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunMaxActivityHistory</td><td>Run a maximum activity report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunMaxBandwidthHistory</td><td>Run a maximum bandwidth report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunQueueStatus</td><td>Run a queue status report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunResultHistory</td><td>Run a result history report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.RunSimpleHistory</td><td>Run a simply history report</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.StartJob</td><td>Start a job</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.WaitForJobDeleted</td><td>After a job has been deleted, wait until the delete has completed</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.WaitForJobInactive</td><td>After a job has been started or aborted, wait until the job ceases all activity</td></tr>
-          <tr><td>org.apache.manifoldcf.crawler.WaitJobPaused</td><td>After a job has been paused, wait for the pause to take effect</td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Control by direct code</title>
-        <p></p>
-        <p>Control by direct java code is quite a reasonable thing to do.  The sources of the above commands should give a pretty clear idea how to proceed, if that's what you
-          want to do.</p>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Caveats</title>
-        <p></p>
-        <p>The above commands know nothing about the differences between connection types.  Instead, they deal with configuration and specification information in the
-          form of XML documents.  Normally, these XML documents are hidden from a system integrator, unless they happen to look into the database with a tool such as
-          psql.  But the API commands above often will require such XML documents to be included as part of the command execution.</p>
-        <p></p>
-        <p>This has one major consequence.  Any application that would manipulate connections and jobs directly cannot be connection-type independent - these
-          applications must know the proper form of XML to submit to the command.  So, it is not possible to use these command APIs to write one's own UI wrapper,
-          without sacrificing some of the repository independence that ManifoldCF by itself maintains.</p>
-      </section>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/script.xml b/site/src/documentation/content/xdocs/ja_JP/script.xml
deleted file mode 100644
index d8996f9..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/script.xml
+++ /dev/null
@@ -1,437 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>ManifoldCF Scripting Language</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Overview</title>
-      <p></p>
-      <p>The ManifoldCF scripting language allows symbolic communication with the ManifoldCF API Service
-        in order to define connections and jobs, and perform crawls.  The language provides support for JSON-like hierarchical
-        documents, as well as the ability to construct properly encoded REST URLs.  It also has support for simple control flow
-        and error handling.</p>
-    </section>
-    
-    <section>
-      <title>How to use the script interpreter</title>
-      <p></p>
-      <p>The ManifoldCF script interpreter can be used in two ways - either as a real-time shell (executing a script as it is typed),
-        or interpreting a script file.  The main class of the interpreter is <em>org.apache.manifoldcf.scriptengine.ScriptParser</em>,
-        and the two ways of invoking it are:</p>
-      <source>
-java -cp ... org.apache.manifoldcf.scriptengine.ScriptParser
-      </source>
-      <p>or:</p>
-      <source>
-java -cp ... org.apache.manifoldcf.scriptengine.ScriptParser &lt;script_file&gt; &lt;arg1&gt; ... &lt;argN&gt;
-      </source>
-      <p>If you choose to invoke ScriptParser in interactive mode, simply type your script one line at a time.  Any errors will be reported immediately,
-        and the ScriptParser will accordingly exit.  You can also type ^Z to terminate the script.</p>
-      <p>If you use ScriptParser with a scripting file, that file will be read and interpreted.  The arguments you provide will be loaded into an array
-        of strings, which is accessible from your script as the variable named <em>__args__</em>.</p>
-      <section>
-        <title>Running the script interpreter by hand</title>
-        <p></p>
-        <p>When you build ManifoldCF, the required dependent jars for the scripting language are copied to <em>dist/script-engine/lib</em>.
-          You can run the interpreter in interactive mode by typing:</p>
-        <source>
-cd dist\script-engine
-run-script.bat &lt;args&gt;
-        </source>
-        <p>Or, on Linux:</p>
-        <source>
-cd dist/script-engine
-run-script.sh &lt;args&gt;
-        </source>
-        <p>You will need to set the environment variable <strong>ENGINE_HOME</strong> to point at the <em>dist/script-engine</em> directory beforehand, so that
-            the scripts can locate the appropriate jars.</p>
-      </section>
-      <section>
-        <title>Running the script interpreter using Ant</title>
-        <p></p>
-        <p>You can also start the script interpreter with all the correct required jars using Ant.  Simply type the following:</p>
-        <source>
-ant run-script-interpreter
-        </source>
-        <p>This will start the script interpreter in interactive mode only.</p>
-      </section>
-      <section>
-        <title>Running the script interpreter using Maven</title>
-        <p></p>
-        <p>You can also run the script interpreter using maven.  The commands are:</p>
-        <source>
-cd framework/script-engine
-mvn exec:exec
-        </source>
-        <p>This, once again, will start the interpreter in interactive mode.</p>
-      </section>
-    </section>
-
-    <section>
-      <title>Script language syntax</title>
-      <p></p>
-      <p>A ManifoldCF script is not sensitive to whitespace or indenting.  All comments begin with a '#' character and end with the end of that line.
-        Unquoted tokens can include alphanumeric characters, plus '_', '$', and '@'.  Numeric tokens always begin with a number ('0'-'9'), and are
-        considered floating-point if they include a decimal point ('.').  Otherwise they are integers.  String tokens can be quoted with either a double quote
-        ('"') or a single quote, and within strings characters can be escaped with a preceding backslash ('\').</p>
-      <p>A ManifoldCF script has a syntax that is readily described with a BNF grammar.  See below.</p>
-      <source>
-program:
---&gt; statements
-  
-statements:
---&gt; statement1 ... statementN
-
-statement:
---&gt; 'set' expression '=' expression ';'
---&gt; 'print' expression ';'
---&gt; 'if' expression 'then' statements ['else' statements] ';'
---&gt; 'while' expression 'do' statements ';'
---&gt; 'break' ';'
---&gt; 'error' expression ';'
---&gt; 'insert' expression 'into' expression ['at' expression] ';'
---&gt; 'remove' expression 'from' expression ';'
---&gt; 'wait' expression ';'
---&gt; 'GET' expression '=' expression ';'
---&gt; 'PUT' expression '=' expression 'to' expression ';'
---&gt; 'POST' expression '=' expression 'to' expression ';'
---&gt; 'DELETE' expression ';'
-
-expression:
---&gt; '(' expression ')'
---&gt; expression '&amp;&amp;' expression
---&gt; expression '||' expression
---&gt; '!' expression
---&gt; expression '&amp;' expression
---&gt; expression '|' expression
---&gt; expression '==' expression
---&gt; expression '!=' expression
---&gt; expression '&gt;=' expression
---&gt; expression '&lt;=' expression
---&gt; expression '&gt;' expression
---&gt; expression '&lt;' expression
---&gt; expression '+' expression
---&gt; expression '-' expression
---&gt; expression '*' expression
---&gt; expression '/' expression
---&gt; '-' expression
---&gt; '[' [expression [',' expression ...]] ']'
---&gt; '{' [expression [',' expression ...]] '}'
---&gt; '&lt;&lt;' expression ':' expression ':' [expression '=' expression [',' expression '=' expression ...]] ':' [expression [',' expression ...]] '&gt;&gt;'
---&gt; expression '[' expression ']'
---&gt; expression '.' token
---&gt; token
---&gt; string
---&gt; number
---&gt; 'true' | 'false'
---&gt; 'null'
---&gt; 'new' newexpression
---&gt; 'isnull' expression
-
-newexpression:
---&gt; 'url' expression
---&gt; 'connectionname' expression
---&gt; 'configuration'
---&gt; 'configurationnode' expression
---&gt; 'array'
---&gt; 'dictionary'
---&gt; 'queryarg' expression ['=' expression] 
-
-      </source>  
-    </section>
-    
-    <section>
-      <title>Script language variables</title>
-      <p></p>
-      <p>Variables in the ManifoldCF scripting language determine the behavior of all aspects of expression evaluation, with the exception of operator precedence.
-        In particular, every canonical variable has the ability to support arbitrary <em>attributes</em> (which are named properties of the variable), 
-        <em>subscripts</em> (children which are accessed by a numeric subscript), and all other <em>operations</em>, such as '+' or '=='.  Not all kinds of
-        variable instance will in fact support all such features.  Should you try to use a feature with a variable that does not support it, you will receive a
-        ScriptException telling you what you did wrong.</p>
-      <p>Since the actual operation details are bound to the variable, for binary operations the left-hand variable typically determines what actually takes place.  For example:</p>
-      <source>
-print 3+7;
-     [java] 10
-print "3"+7;
-     [java] 37
-      </source>
-      <p>There is, of course, a way to caste a variable to a different type.  For example:</p>
-      <source>
-print "3".__int__+7;
-     [java] 10
-      </source>
-      <p>Here, we are using the built-in attribute <em>__int__</em> to obtain the integer equivalent of the original string variable "3".  See the following table for
-        a list of some of the standard attributes and their meanings:</p>
-      <table>
-        <caption>Standard attributes</caption>
-        <tr><th>Attribute name</th><th>Meaning</th></tr>
-        <tr><td>__script__</td><td>Returns the script code that would create this variable</td></tr>
-        <tr><td>__string__</td><td>Returns the string value of the variable, if any</td></tr>
-        <tr><td>__int__</td><td>Returns the integer value of the variable, if any</td></tr>
-        <tr><td>__float__</td><td>Returns the floating-point value of the variable, if any</td></tr>
-        <tr><td>__boolean__</td><td>Returns the boolean value of the variable, if any</td></tr>
-        <tr><td>__size__</td><td>Typically returns the number of subscript children</td></tr>
-        <tr><td>__type__</td><td>Returns the 'type' of the variable</td></tr>
-        <tr><td>__value__</td><td>Returns the 'value' of the variable</td></tr>
-        <tr><td>__dict__</td><td>Returns a dictionary equivalent of the variable</td></tr>
-        <tr><td>__OK__</td><td>Returns a boolean 'true' if the variable was "OK", false otherwise</td></tr>
-        <tr><td>__NOTFOUND__</td><td>Returns a boolean 'true' if the variable was "NOTFOUND", false otherwise</td></tr>
-        <tr><td>__CREATED__</td><td>Returns a boolean 'true' if the variable was "CREATED", false otherwise</td></tr>
-      </table>
-      <p>Obviously, only some variables will support each of the standard attributes.  You will receive a script exception if you try to obtain a non-existent
-        attribute for a variable.</p>
-      <section>
-        <title>Integers</title>
-        <p>Integer variable types are created by non-quoted numeric values that do not have a '.' in them.  For example, the character '4' will create an integer
-          variable type with a value of 4.</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Integer operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Addition, yielding an integer</td><td>4+7</td></tr>
-          <tr><td>binary -</td><td>Subtraction, yielding an integer</td><td>7-4</td></tr>
-          <tr><td>binary *</td><td>Multiplication, yielding an integer</td><td>7*4</td></tr>
-          <tr><td>binary /</td><td>Division, yielding an integer</td><td>7/4</td></tr>
-          <tr><td>unary -</td><td>Negation, yielding an integer</td><td>-4</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7 == 4</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7 != 4</td></tr>
-          <tr><td>binary &gt;=</td><td>Greater or equals comparison, yielding a boolean</td><td>7 &gt;= 4</td></tr>
-          <tr><td>binary &lt;=</td><td>Less or equals comparison, yielding a boolean</td><td>7 &lt;= 4</td></tr>
-          <tr><td>binary &gt;</td><td>Greater comparison, yielding a boolean</td><td>7 &gt; 4</td></tr>
-          <tr><td>binary &lt;</td><td>Less comparison, yielding a boolean</td><td>7 &lt; 4</td></tr>
-          <tr><td>binary &amp;</td><td>Bitwise AND, yielding an integer</td><td>7 &amp; 4</td></tr>
-          <tr><td>binary |</td><td>Bitwise OR, yielding an integer</td><td>7 | 4</td></tr>
-          <tr><td>unary !</td><td>Bitwise NOT, yielding an integer</td><td>! 7</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by integer types.</p>
-      </section>
-      <section>
-        <title>Strings</title>
-        <p>String variable types are created by quoted sequences of characters.  For example, the character '"hello world"' will create a string
-          variable type with an (unquoted) value of "hello world".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>String operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Concatenation, yielding a string</td><td>"hi" + "there"</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>"hi" == "there"</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>"hi" != "there"</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by string types.</p>
-      </section>
-      <section>
-        <title>Floating-point numbers</title>
-        <p>Float variable types are created by non-quoted numeric values that have a '.' in them.  For example, the token '4.1' will create a float
-          variable type with a value of 4.1</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Float operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Addition, yielding a float</td><td>4.0+7.0</td></tr>
-          <tr><td>binary -</td><td>Subtraction, yielding a float</td><td>7.0-4.0</td></tr>
-          <tr><td>binary *</td><td>Multiplication, yielding a float</td><td>7.0*4.0</td></tr>
-          <tr><td>binary /</td><td>Division, yielding a float</td><td>7.0/4.0</td></tr>
-          <tr><td>unary -</td><td>Negation, yielding a float</td><td>-4.0</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7.0 == 4.0</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7.0 != 4.0</td></tr>
-          <tr><td>binary &gt;=</td><td>Greater or equals comparison, yielding a boolean</td><td>7.0 &gt;= 4.0</td></tr>
-          <tr><td>binary &lt;=</td><td>Less or equals comparison, yielding a boolean</td><td>7.0 &lt;= 4.0</td></tr>
-          <tr><td>binary &gt;</td><td>Greater comparison, yielding a boolean</td><td>7.0 &gt; 4.0</td></tr>
-          <tr><td>binary &lt;</td><td>Less comparison, yielding a boolean</td><td>7.0 &lt; 4.0</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by float types.</p>
-      </section>
-      <section>
-        <title>Booleans</title>
-        <p>Boolean variable types are created by the keywords <strong>true</strong> and <strong>false</strong>.  For example, the code 'true' will create a boolean
-          variable type with a value of "true".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Boolean operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7.0 == 4.0</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7.0 != 4.0</td></tr>
-          <tr><td>binary &amp;&amp;</td><td>AND logical operation, yielding a boolean</td><td>true &amp;&amp; false</td></tr>
-          <tr><td>binary ||</td><td>OR logical operation, yielding a boolean</td><td>true || false</td></tr>
-          <tr><td>binary &amp;</td><td>AND logical operation, yielding a boolean</td><td>true &amp; false</td></tr>
-          <tr><td>binary |</td><td>OR logical operation, yielding a boolean</td><td>true | false</td></tr>
-          <tr><td>unary !</td><td>NOT logical operation, yielding a boolean</td><td>! true</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__boolean__</em> are supported 
-          by boolean types.</p>
-      </section>
-      <section>
-        <title>Arrays</title>
-        <p>Array variable types are created by an initializer of the form <strong>[</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ...]] <strong>]</strong>.  For example, the script code '[3, 4]' will create an array
-          variable type with two values,  the integer "3" and the integer "4".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Array operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified subscript variable, yielding the variable</td><td>[3,4] [0]</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__size__</em> are supported 
-          by array types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>Dictionaries</title>
-        <p>Dictionary variable types are created using the "new" operator, e.g. <strong>new</strong> <strong>dictionary</strong>.</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Array operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified key, yielding the keyed variable</td><td>mydict ["keyname"]</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__size__</em> are supported 
-          by dictionary types.</p>
-      </section>
-      <section>
-        <title>Configurations</title>
-        <p>Configuration variables contain the equivalent of the JSON used to communicate with the ManifoldCF API.  They can be created using an initializer
-          of the form <strong>{</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ...]] <strong>}</strong>.  For example, the script code '{ &lt;&lt; "outputconnector" : "" :  : , &lt;&lt; "description" : "Solr" :  :  &gt;&gt;, &lt;&lt; "class_name" : "org.apache.manifoldcf.agents.output.solr.SolrConnector" :  :  &gt;&gt; &gt;&gt; }'
-          would create a configuration variable equivalent to one that might be returned from the ManifoldCF API if it was queried for the output connectors registered by the system.</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Configuration operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified child configuration node variable, yielding the variable</td><td>myconfig [0]</td></tr>
-          <tr><td>binary +</td><td>Append a configuration child node variable to the list</td><td>myconfig + &lt;&lt; "something" : "somethingvalue" : : &gt;&gt;</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__dict__</em>, and <em>__size__</em> are supported 
-          by configuration variable types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>Configuration nodes</title>
-        <p>Configuration node variable types are children of configuration variable types or configuration node variable types.  They have several components, as listed below:</p>
-        <ul>
-          <li>A type</li>
-          <li>A value</li>
-          <li>Attributes, described as a set of name/value pairs</li>
-          <li>Children, which must be configuration node variable types</li>
-        </ul>
-        <p>Configuration node variable types can be created using an initializer of the form <strong>&lt;&lt;</strong> <em>expression</em> <strong>:</strong> <em>expression</em> <strong>:</strong> [<em>expression</em> <strong>=</strong> <em>expression</em> [<strong>,</strong> <em>expression</em> <strong>=</strong> <em>expression</em> ...]] <strong>:</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ... ]] '&gt;&gt;'.
-          The first expression represents the type of the node.  The second is the node's value.  The series of '=' expressions represents attribute names and values.  The last series represents
-          the children of the node.  For example, the script code '&lt;&lt; "description" : "Solr" :  :  &gt;&gt;' represents a node of type 'description' with a value of 'Solr', with no attributes or children.</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Configuration node operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified child configuration node variable, yielding the variable</td><td>myconfig [0]</td></tr>
-          <tr><td>binary +</td><td>Append a configuration child node variable to the list</td><td>myconfig + &lt;&lt; "something" : "somethingvalue" : : &gt;&gt;</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__size__</em>, <em>__type__</em>, <em>__dict__</em> and <em>__value__</em> are supported 
-          by configuration node variable types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>URLs</title>
-        <p>URL variable types exist to take care of the details of URL encoding while assembling the REST URL's needed to describe objects in ManifoldCF's REST API.  A URL variable
-          type can be created using a 'new' operation of the form <strong>new</strong> <strong>url</strong> <em>expression</em>, where the expression is the already-encoded root path.  For example, the script code 'new url "http://localhost:8345/mcf-api-service/json"'
-          would create a URL variable type with the root path "http://localhost:8345/mcf-api-service/json".</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>URL operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>url1 == url2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>url1 != url2</td></tr>
-          <tr><td>binary +</td><td>Append and encode another path or query argument element, yielding a URL</td><td>url1 + "repositoryconnections"</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by URL variable types.</p>
-      </section>
-      <section>
-        <title>Query Arguments</title>
-        <p>Query Argument variable types exist to take care of the details of URL encoding while assembling the query arguments of a REST URL for ManifoldCF's REST API.  A Query Argument variable
-          type can be created using a 'new' operation of the form <strong>new</strong> <strong>queryarg</strong> <em>expression</em> [<strong>=</strong> <em>expression</em>], where the first expression is the
-          query argument name, and the second optional expression is the query argument value.  For example, the script code 'new queryarg "report" = "simple"'
-          would create a Query Argument variable type representing the query argument "report=simple".  To add query arguments to a URL, simply add them using the '+' operator,
-          for example "urlvar = urlvar + new queryarg 'report' = 'simple';" .</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Query Argument operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>arg1 == arg2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>arg1 != arg2</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by Query Argument variable types.</p>
-      </section>
-      <section>
-        <title>Connection names</title>
-        <p>Connection name variable types exist to perform the extra URL encoding needed for ManifoldCF's REST API.  Connection names must be specially encoded so that they do not
-          contain slash characters ('/').  Connection name variable types take care of this encoding.</p>
-        <p>You can create a connection name variable type using the following syntax: <strong>new</strong> <strong>connectionname</strong> <em>expression</em>, where the expression is the name of the connection.
-        </p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>URL operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>cn1 == cn2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>cn1 != cn2</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by connection name variable types.</p>
-      </section>
-      <section>
-        <title>Results</title>
-        <p>Result variable types capture the result of a GET, PUT, POST, or DELETE statement.  They consist of two parts:</p>
-        <ul>
-          <li>A result code</li>
-          <li>A result configuration value</li>
-        </ul>
-        <p>There is no way to directly create a result variable type, nor does it support any operations.  However, the standard attributes <em>__script__</em>, <em>__string__</em>,
-          <em>__value__</em>, <em>__OK__</em>, <em>__NOTFOUND__</em>, and <em>__CREATED__</em> are all supported by result variable types.</p>
-      </section>
-    </section>
-    
-    <section>
-      <title>Statements</title>
-      <p>The statements available to a ManifoldCF script programmer are designed to support interaction with the ManifoldCF API.  Thus, there is support for
-        all four HTTP verbs, as well as basic variable setting and control flow.  The table below describes each statement type:</p>
-      <table>
-        <caption>Statement types</caption>
-        <tr><th>Statement</th><th>Meaning</th><th>Example</th></tr>
-        <tr><td>'set' expression '=' expression ';'</td><td>Sets the variable described by the first expression with the value computed for the second</td><td>set myvar = 4 + 5;</td></tr>
-        <tr><td>'print' expression ';'</td><td>Prints the string value of the expression to stdout</td><td>print "hello world";</td></tr>
-        <tr><td>'if' expression 'then' statements ['else' statements] ';'</td><td>If the boolean value of the expression is 'true', executes the first set of statements, otherwise executes the (optional) second set</td><td>if true then print "hello"; else print "there"; ;</td></tr>
-        <tr><td>'while' expression 'do' statements ';'</td><td>While expression is true, execute the specified statements, and repeat</td><td>while count > 0 do set count = count - 1; ;</td></tr>
-        <tr><td>'break' ';'</td><td>Exits from the nearest enclosing while loop</td><td>while true do break; ;</td></tr>
-        <tr><td>'error' expression ';'</td><td>Aborts the script with a script exception based on the string value of the expression</td><td>error "bad stuff";</td></tr>
-        <tr><td>'wait' expression ';'</td><td>Waits the number of milliseconds corresponding to the integer value of the expression</td><td>wait 1000;</td></tr>
-        <tr><td>'insert' expression 'into' expression ['at' expression] ';'</td><td>Inserts the first expression into the second variable expression, either at the end or optionally at the position specified by the third expression</td><td>insert 4 into myarray at 0 ;</td></tr>
-        <tr><td>'delete' expression 'from' expression ';'</td><td>Deletes the element described by the first expression from the second expression</td><td>delete 0 from myarray ;</td></tr>
-        <tr><td>'GET' expression '=' expression ';'</td><td>Perform an HTTP GET from the URL specified in the second expression capturing the result in the first expression</td><td>GET result = new url "http://localhost:8345/mcf-api-service/json/repositoryconnections" ;</td></tr>
-        <tr><td>'DELETE' expression '=' expression ';'</td><td>Perform an HTTP DELETE on the URL specified in the second expression capturing the result in the first expression</td><td>DELETE result = myurl ;</td></tr>
-        <tr><td>'PUT' expression '=' expression 'to' expression ';'</td><td>Perform an HTTP PUT of the second expression to the URL specified in the third expression capturing the result in the first expression</td><td>PUT result = configurationObject to myurl ;</td></tr>
-        <tr><td>'POST' expression '=' expression 'to' expression ';'</td><td>Perform an HTTP POST of the second expression to the URL specified in the third expression capturing the result in the first expression</td><td>POST result = configurationObject to myurl ;</td></tr>
-      </table>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/technical-resources.xml b/site/src/documentation/content/xdocs/ja_JP/technical-resources.xml
deleted file mode 100644
index 960a4f7..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/technical-resources.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- 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.
--->
-
-<document>
-<header><title>ManifoldCF - 開発者リソース</title></header>
-<properties>
-</properties>
-<body>
-
-    <section id="securityarchitecturediagrams">
-          <title>セキュリティアーキテクチャ図</title>
-          <p>以下はManifoldCFのセキュリティアーキテクチャ図です:</p>
-          <br/><br/>
-          <figure src="images/ja_JP/SecurityArchitecture.png" alt="ManifoldCFセキュリティアーキテクチャ" width="80%"/>
-          <br/><br/>
-          <p>Apacheを使って認証を行う場合は、以下のようなモデルになります:</p>
-          <br/><br/>
-          <figure src="images/ja_JP/LCFApacheArchitecture.png" alt="ManifoldCFセキュリティアーキテクチャ、Apacheを使う場合" width="80%"/>
-          <br/><br/>
-    </section>
-
-    <section id="processarchitecturediagrams">
-          <title>プロセスアーキテクチャ図</title>
-          <p>以下はManifoldCFのプロセスアーキテクチャ図です:</p>
-          <br/><br/>
-          <figure src="images/ja_JP/MCFProcessArchitecture.png" alt="ManifoldCFプロセスアーキテクチャ" width="80%"/>
-          <br/><br/>
-    </section>
-
-    <section id="howtowriteconnectors">
-	<title>コネクタの作成</title>
-	<p>コネクタを作成するとManifoldCFプロジェクトのことをよりよく理解できます。また、成果物をプロジェクトに貢献することもできます。やり方は以下のリンクをたどって読んでください。
-	</p> 
-	<ul>
-	    <li><a href="writing-output-connectors.html">出力コネクタの作成</a></li>
-	    <li><a href="writing-transformation-connectors.html">変換コネクタの作成</a></li>
-	    <li><a href="writing-mapping-connectors.html">ユーザーマッピングコネクタの作成</a></li>
-	    <li><a href="writing-authority-connectors.html">権限コネクタの作成</a></li>
-	    <li><a href="writing-repository-connectors.html">リポジトリコネクタの作成</a></li>
-	</ul>
-    </section>
-
-</body>
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/writing-authority-connectors.xml b/site/src/documentation/content/xdocs/ja_JP/writing-authority-connectors.xml
deleted file mode 100644
index 2634423..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/writing-authority-connectors.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing authority connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing an Authority Connector</title>
-      <p></p>
-      <p>An authority connector to a repository allows a repository's security model to be enforced by a search engine.  Its only function is to convert a user name (which is often a Kerberos principal name) into a set of _access tokens_.</p>
-      <p></p>
-      <p>The definition of an access token within ManifoldCF for a given repository is completely defined by the connectors that deal with that repository, with one exception.  That exception is for Active Directory.  Active Directory is so prevalent as a repository authorization mechanism that ManifoldCF currently treats it as the "default" authority - that is, if you don't specify another authority when you define a repository connection, ManifoldCF presumes that you mean that Active Directory should be the controlling authority for the connection.  In that case, an access token is simply an Active Directory SID.</p>
-      <p></p>
-      <p>For those repositories that do not use Active Directory as their authorization mechanism, an authority connector should be written, along with the repository connector for the repository.  Access tokens in that case represent a contract between your implementation of the authority connector for the repository, and the repository connector for the repository.  They must work together to define access tokens that will limit document access when used properly within any search engine query.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an authority connector consists of a single parts:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.authorities.interfaces.IAuthorityConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The authority connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific authority connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Authority connection</td><td>An authority connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>User name</td><td>The name of a user, which is often a Kerberos principal name, e.g. <em>john@apache.org</em></td></tr>
-          <tr><td>Access token</td><td>An arbitrary string, which is only meaningful within the context of a specific authority connector, that describes a quantum of authorization</td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual authority connector class instance is managed and used</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Authority Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the authority connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided authority connector implementations.  The Documentum connector, the LiveLink connector, the Memex connector, and the Meridio connector all include authority connectors which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that all of these connectors extend a framework-provided authority connector base class, found at <em>org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an authority connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>getAuthorizationResponse()</strong></td><td>Obtain the authorization response, given a user name</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an authority connection <em>ConfigParams</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in two broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection.  Together they do the heavy lifting of your connector.</p>
-          <p></p>
-          <p>The <em>getAuthorizationResponse()</em> method returns an <em>AuthorizationResponse</em> object, which can describe a number of conditions:</p>
-          <p></p>
-          <table>
-            <tr><th>Condition</th><th>Meaning</th></tr>
-            <tr><td>RESPONSE_OK</td><td>The access tokens for the user were successfully obtained from the repository, and are being returned</td></tr>
-            <tr><td>RESPONSE_UNREACHABLE</td><td>The repository is currently unreachable, and appropriate disabling tokens are being returned</td></tr>
-            <tr><td>RESPONSE_USERNOTFOUND</td><td>The user was not found within the repository, and appropriate disabling tokens are being returned</td></tr>
-            <tr><td>RESPONSE_USERUNAUTHORIZED</td><td>The user was found, but was in some way disabled, and appropriate disabling tokens are being returned</td></tr>
-          </table>
-          <p></p>
-          <p></p>
-          <p>In all cases, the connector returns access tokens.  But in the case where token lookup has failed in some way, it is the responsibility of the connector to insure that inappropriate content is not viewed.  Usually, this is done by ingesting a "global deny" token attached to all documents from the given repository, and then having the associated authority connector return this global deny token when error conditions apply.</p>
-          <p></p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied authority connector's UI code, both for a description of the arguments to each page, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/ja_JP/writing-mapping-connectors.xml b/site/src/documentation/content/xdocs/ja_JP/writing-mapping-connectors.xml
deleted file mode 100644
index 4b60153..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/writing-mapping-connectors.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing user mapping connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing a User Mapping Connector</title>
-      <p></p>
-      <p>A user mapping connector allows a user name to be transformed in a manner that depends on the functionality of the connector.  In some cases, no connection to
-            an external repository is required (for example, simple string transformations), while in some cases one might imagine such a connector consulting with (say) an
-            LDAP system to look up a specific name.</p>
-      <p></p>
-      <p>A user name is just a string, which is designed to represent a user identity.  Some user names have specific forms - for instance, Active Directory user names are
-            often represented in the form <code>user@domain</code>.  But, most importantly, the exact name used can often depend on the particular system being addressed.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, a user mapping connector consists of a single part:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.authorities.interfaces.IMappingConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The mapping connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific mapping connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Mapping connection</td><td>An mapping connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>User name</td><td>The name of a user, which is often a Kerberos principal name, e.g. <em>john@apache.org</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual mapping connector class instance is managed and used</td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Mapping Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the mapping connector interface.  You will note that the javadoc describes the usage and pooling model for a
-              connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing,
-              must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided mapping connector implementations.  The only connector presently included (the Regular Expression
-              user mapping connector) demonstrates some of the sorts of techniques you will need for an effective
-              implementation.  You will also note that all of these connectors extend a framework-provided mapping connector base class, found at
-              <em>org.apache.manifoldcf.authorities.mappers.BaseMappingConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the
-              connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have
-              database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not
-              very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating a mapping connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>mapUser()</strong></td><td>Given an input user name, find the corresponding output user name</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for a mapping connection <em>ConfigParams</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in two broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection.  Together they
-                do the heavy lifting of your connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods 
-                above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is
-                displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel
-                to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied mapping connector's UI code, both for a description of the arguments
-                to each page, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.
-              (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however,
-              some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email
-              to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/ja_JP/writing-output-connectors.xml b/site/src/documentation/content/xdocs/ja_JP/writing-output-connectors.xml
deleted file mode 100644
index 2cecac1..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/writing-output-connectors.xml
+++ /dev/null
@@ -1,149 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing output connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing an Output Connector</title>
-      <p></p>
-      <p>An output connector furnishes the mechanism by which content that has been fetched from a repository gets handed to a back-end repository for processing.  It also furnishes a mechanism for removing previously-processed content from that back end repository.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an output connector consists of a single part, which is:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.agents.interfaces.IOutputConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The output connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific output connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Output connection</td><td>An output connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Document URI</td><td>The unique URI (or, in some cases, file IRI) of a document, which is meant to be displayed in search engine results as the link to the document</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual output connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework, e.g. recording activities; see <em>org.apache.manifoldcf.agents.interfaces.IOutputAddActivity</em> and <em>org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity</em></td></tr>
-          <tr><td>Output specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific output connector should do in the context of a specific job; see <em>org.apache.manifoldcf.agents.interfaces.OutputSpecification</em></td></tr>
-          <tr><td>Output version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if an ingestion operation needs to be repeated as a result of changes to the output specification in effect for a document</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Output Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the output connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided output connector implementations.  The GTS connector, the SOLR connector, the OpenSearchServer connector, the ElasticSearch connector, and the Null Output connector all are output connectors which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that all of these connectors extend a framework-provided output connector base class, found at <em>org.apache.manifoldcf.agents.output.BaseOutputConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an output connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>checkMimetypeIndexable()</strong></td><td>Decide whether a document with a given mime type is indexable or not</td></tr>
-            <tr><td><strong>checkDocumentIndexable()</strong></td><td>Decide whether a file is indexable or not</td></tr>
-            <tr><td><strong>checkLengthIndexable()</strong></td><td>Decide whether a document of a given length is indexable or not</td></tr>
-            <tr><td><strong>checkURLIndexable()</strong></td><td>Decide whether a document with a given URL is indexable or not</td></tr>
-            <tr><td><strong>getPipelineDescription()</strong></td><td>Use the supplied output specification to come up with an output version string</td></tr>
-            <tr><td><strong>addOrReplaceDocument()</strong></td><td>Add or replace the specified document within the target repository, or signal if the document cannot be handled</td></tr>
-            <tr><td><strong>removeDocument()</strong></td><td>Remove the specified document from the target repository</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an output connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the output specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the output version string</title>
-          <p></p>
-          <p>The output version string is used by ManifoldCF to determine whether or not the output specification or configuration changed in such a way as to require that the document be reprocessed.  ManifoldCF therefore requests the output version string for any document that is ready for processing, and usually does not process the document again if the returned output version string agrees with the output version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what an output connector writer needs to do is include everything in the output version string that could potentially affect how the document gets ingested, save that which is specific to the repository connector.  That may include bits of output connector configuration information, as well as data from the output specification.  When it's time to ingest, it's usually the correct thing to do to obtain the necessary data for ingestion out of the output version string, rather than calculating it or fetching it anew, because that guarantees that the document processing was done in a manner that agrees with its recorded output version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of the UI methods must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each method, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the framework's HTML or any specific repository connector's HTML.  The <em>OutputSpecification</em> HTML especially may be prone to collisions, because within any given job, this HTML is included in the same page as HTML from the chosen repository connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/ja_JP/writing-repository-connectors.xml b/site/src/documentation/content/xdocs/ja_JP/writing-repository-connectors.xml
deleted file mode 100644
index af25100..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/writing-repository-connectors.xml
+++ /dev/null
@@ -1,223 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing repository connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing repository connectors</title>
-      <p></p>
-      <p>A repository connector furnishes the mechanism for obtaining documents, metadata, and authority tokens from a repository.  The documents are expected to be handed to an output connector (described elsewhere) for ingestion into some other back-end repository.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an output connector consists of only one part:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.crawler.interfaces.IRepositoryConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The repository connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific repository connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Repository connection</td><td>A repository connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Document identifier</td><td>An arbitrary identifier, whose meaning determined only within the context of a specific repository connector, which the connector uses to describe a document within a repository</td></tr>
-          <tr><td>Document URI</td><td>The unique URI (or, in some cases, file IRI) of a document, which is meant to be displayed in search engine results as the link to the document</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Access token</td><td>A string, which is only meaningful in the context of a specific authority, that describes a quantum of authorization for a user</td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual repository connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework, e.g. recording the activity history; see <em>org.apache.manifoldcf.crawler.interfaces.IVersionActivity</em>, and <em>org.apache.manifoldcf.crawler.interfaces.IProcessActivity</em>, and <em>org.apache.manifoldcf.crawler.interfaces.ISeedingActivity</em></td></tr>
-          <tr><td>Document specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific repository connector should do in the context of a specific job; see <em>org.apache.manifoldcf.crawler.interfaces.DocumentSpecification</em></td></tr>
-          <tr><td>Document version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if a fetch or ingestion operation needs to be repeated as a result of changes to the document specification in effect for a document, or because of changes to the document itself</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Repository Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the repository connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided repository connector implementations.  There are a wide variety of connectors include with ManifoldCF that exercise just about every aspect of the repository connector interface.  These are:</p>
-        <p></p>
-        <ul>
-          <li>Documentum (uses RMI to segregate native code, etc.)</li>
-          <li>FileNet (also uses RMI, but because it is picky about its open-source jar versions)</li>
-          <li>File system (a good, but simple, example)</li>
-          <li>LiveLink (demonstrates use of local keystore infrastructure)</li>
-          <li>Meridio (local keystore, web services, result sets)</li>
-          <li>SharePoint (local keystore, web services)</li>
-          <li>RSS (local keystore, binning, fuzzy xml parsing)</li>
-          <li>Web (local database schema, local keystore, binning, events and prerequisites, cache management, fuzzy xml parsing)</li>
-          <li>Wiki (binning, rigorous xml parsing)</li>
-        </ul>
-        <p></p>
-        <p>You will also note that all of these connectors extend a framework-provided repository connector base class, found at <em>org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating a repository connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>addSeedDocuments()</strong></td><td>Use the supplied document specification to come up with an initial set of document identifiers</td></tr>
-            <tr><td><strong>getDocumentVersions()</strong></td><td>Come up with a version string for each of the documents described by the supplied set of document identifiers, or signal if the document is no longer present</td></tr>
-            <tr><td><strong>processDocuments()</strong></td><td>Take the appropriate action (e.g. ingest, or extract references from, or whatever) for a given set of documents described by document identifier and version string</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for a repository connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the document specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Model</title>
-          <p></p>
-          <p>Each connector must declare a specific model which it adheres to.  These models basically describe what the <strong>addSeedDocuments()</strong> method actually does, and are described below.</p>
-          <p></p>
-          <table>
-            <tr><th>Model</th><th>Description</th></tr>
-            <tr><td><em>MODEL_ALL</em></td><td>The <strong>addSeedDocuments()</strong> method supplies all specified documents on each call</td></tr>
-            <tr><td><em>MODEL_PARTIAL</em></td><td>The <strong>addSeedDocuments()</strong> does not return a complete list of documents that match the criteria and time interval, because some of those documents are no longer discoverable</td></tr>
-            <tr><td><em>MODEL_ADD</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least all the matching documents that have been added to the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_ADD_CHANGE</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least those matching documents that have been added or changed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_ADD_CHANGE_DELETE</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least those matching documents that have been added, changed, or removed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least all the matching documents that have been added to the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD_CHANGE</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least those matching documents that have been added or changed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD_CHANGE_DELETE</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least those matching documents that have been added, changed, or removed in the repository, within the specified time interval</td></tr>
-          </table>
-          <p></p>
-          <p>Note that the choice of model is actually much more subtle than the above description might indicate.  It may, for one thing, be affected by characteristics of
-            the repository, such as whether the repository considers a document to have been changed if its security information was changed.  This would mean that,
-            even though most document changes are picked up and thus one might be tempted to declare the connector to be <em>MODEL_ADD_CHANGE</em>, the
-            correct choice would in fact be <em>MODEL_ADD</em>.</p>
-          <p></p>
-          <p>Another subtle point is what documents the connector is actually supposed to return by means of the <strong>addSeedDocuments()</strong> method.  The
-            start time and end time parameters handed to the method do not have to be strictly adhered to, for instance; it is always okay to return more documents.  It is never
-            okay for the connector to return fewer documents than were requested, on the other hand.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing a document identifier format</title>
-          <p></p>
-          <p>In order to decide on the format for a document identifier, you need to understand what this identifier is used for, and what it represents.  A document identifier usually corresponds to some entity within the source repository, such as a document or a folder.  Note that there is <strong>no</strong> requirement that the identifier represent indexable content.</p>
-          <p></p>
-          <p>The document identifier must be capable of furnishing enough information to:</p>
-          <p></p>
-          <ul>
-            <li>Calculate a version string for the document</li>
-            <li>Find child references for the document</li>
-            <li>Get the document's content, metadata, and access tokens</li>
-          </ul>
-          <p></p>
-          <p>We highly recommend that no additional information be included in the document identifier, other than what is needed for the above, as that will almost certainly cause problems.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the document version string</title>
-          <p></p>
-          <p>The document version string is used by ManifoldCF to determine whether or not the document or configuration changed in such a way as to require that the document
-            be reprocessed.  ManifoldCF therefore requests the version string for any document that is ready for processing, and usually does not process the document again if the
-            returned version string agrees with the version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what a connector writer needs to do is include everything in the version string that could potentially affect how the
-            document gets processed.  That may include the version of the document in the repository, bits of configuration information, metadata, and even access tokens (if the
-            underlying repository versions these things independently from the document itself).  Storing all of that information in the version string seems like a lot - but the string
-            is unlimited in length, and it actually serves another useful purpose to do it that way.  Specifically, when it comes time to do the actual processing, it's often the correct
-            thing to do to obtain the necessary data out of the version string, rather than calculating it or fetching it anew.  That way of working guarantees that the document
-            processing was done in a manner that agrees with its recorded version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-          <p>For longer data that needs to persist between the <strong>getDocumentVersions()</strong> method call and the <strong>processDocuments()</strong> method
-            call, the connector is welcome to save this information in a temporary disk file.  To help make sure nothing leaks which this approach is used, the IRepositoryConnector
-            interface has a method that will be called to clean up any temporary files that might have been created in the handling of a given document identifier.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods
-            above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is
-            displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the
-            rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each page, and
-            for some decent ideas of ways to organize your connector's UI code.  </p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the
-            framework's HTML or any specific output connector's HTML.  The <em>DocumentSpecification</em> editing HTML especially may be prone to collisions, because
-            within any given job, this HTML is included in the same page as HTML from the chosen output connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.
-          (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however,
-          some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email
-          to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/ja_JP/writing-transformation-connectors.xml b/site/src/documentation/content/xdocs/ja_JP/writing-transformation-connectors.xml
deleted file mode 100644
index 4b701ec..0000000
--- a/site/src/documentation/content/xdocs/ja_JP/writing-transformation-connectors.xml
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing transformation connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing a Transformation Connector</title>
-      <p></p>
-      <p>A transformation connector provides a mechanism by which content that has been fetched from a repository can be modified before it gets handed to a back-end repository for processing.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, a transformation connector consists of a single part, which is:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.agents.interfaces.ITransformationConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The transformation connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific
-            transformation connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Transformation connection</td><td>An output connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or
-            streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual output connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework,
-            e.g. recording activities; see <em>org.apache.manifoldcf.agents.interfaces.IOutputAddActivity</em> and <em>org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity</em></td></tr>
-          <tr><td>Output specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific
-            transformation connector should do in the context of a specific job; see <em>org.apache.manifoldcf.agents.interfaces.OutputSpecification</em></td></tr>
-          <tr><td>Transformation version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if an ingestion operation needs
-            to be repeated as a result of changes to the output specification in effect for a document</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the transformation engine is unavailable, and gives a best estimate
-            of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Transformation Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the transformation connector interface.  You will note that the javadoc describes the usage and pooling model for a
-          connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must
-          be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine the provided transformation connector implementations.  The only currently enabled connector is the null transformation connector,
-          which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that this connector extends a framework-provided
-          transformation connector base class, found at <em>org.apache.manifoldcf.agents.transformation.BaseTransformationConnector</em>.  This base class furnishes some basic
-          bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors
-          are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however,
-          not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an output connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>checkMimetypeIndexable()</strong></td><td>Decide whether a document with a given mime type is indexable or not</td></tr>
-            <tr><td><strong>checkDocumentIndexable()</strong></td><td>Decide whether a file is indexable or not</td></tr>
-            <tr><td><strong>checkLengthIndexable()</strong></td><td>Decide whether a document of a given length is indexable or not</td></tr>
-            <tr><td><strong>checkURLIndexable()</strong></td><td>Decide whether a document with a given URL is indexable or not</td></tr>
-            <tr><td><strong>getPipelineDescription()</strong></td><td>Use the supplied output specification to come up with an output version string</td></tr>
-            <tr><td><strong>addOrReplaceDocument()</strong></td><td>Add or replace the specified document within the target repository, or signal if the document cannot be handled</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an output connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the output specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the transformation version string</title>
-          <p></p>
-          <p>The output version string is used by ManifoldCF to determine whether or not the output specification or configuration changed in such a way as to require that the document be reprocessed.  ManifoldCF therefore requests the output version string for any document that is ready for processing, and usually does not process the document again if the returned output version string agrees with the output version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what an output connector writer needs to do is include everything in the output version string that could potentially affect how the document gets ingested, save that which is specific to the repository connector.  That may include bits of output connector configuration information, as well as data from the output specification.  When it's time to ingest, it's usually the correct thing to do to obtain the necessary data for ingestion out of the output version string, rather than calculating it or fetching it anew, because that guarantees that the document processing was done in a manner that agrees with its recorded output version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of the UI methods must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each method, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the framework's HTML or any specific repository connector's HTML.  The <em>OutputSpecification</em> HTML especially may be prone to collisions, because within any given job, this HTML is included in the same page as HTML from the chosen repository connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/site.xml b/site/src/documentation/content/xdocs/site.xml
deleted file mode 100644
index fad0689..0000000
--- a/site/src/documentation/content/xdocs/site.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2002-2004 The Apache Software Foundation
-
-  Licensed 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.
--->
-
-<site label="ManifoldCF" href="" xmlns="http://apache.org/forrest/linkmap/1.0" tab="launch">
-
-  <launch label="Select Language" href="index.html" tab="launch"/>
-  
-  <english label="English" href="en_US/" tab="en_US">
-  
-    <news        label="Welcome"          href="index.html" tab="en_US" />    
-      
-    <docs label="Documentation">
-      <dev label="Concepts" href="concepts.html"/>
-      <dev label="Compatibility Matrix" href="included-connectors.html"/>
-      <dev label="Frequently Asked Questions" href="faq.html"/>
-      <dev label="API Documentation" href="programmatic-operation.html"/>
-      <dev label="Javadoc" href="javadoc.html"/>
-      <dev label="Building and Deploying" href="how-to-build-and-deploy.html"/>
-      <dev label="Technical Resources" href="technical-resources.html"/>
-      <dev label="Performance tuning" href="performance-tuning.html"/>
-      <dev label="Scripting Language" href="script.html"/>
-      <dev label="End-user Documentation (HTML)" href="end-user-documentation.html"/>
-      <dev label="End-user Documentation (PDF)" href="end-user-documentation.pdf"/>
-    </docs>
-    
-  </english>
-  
-  <japanese label="日本語" href="ja_JP/" tab="ja_JP">
-    <index label="概要" href="index.html" tab="ja_JP"/>
-    
-    <docs label="ドキュメント">
-      <dev label="概要" href="concepts.html"/>
-      <dev label="コネクタ一覧" href="included-connectors.html"/>
-      <dev label="Q&A" href="faq.html"/>
-      <dev label="Javadoc" href="javadoc.html"/>
-      <dev label="開発者リソース" href="technical-resources.html"/>
-      <dev label="エンドユーザマニュアル (HTML)" href="end-user-documentation.html"/>
-      <dev label="エンドユーザマニュアル (PDF)" href="end-user-documentation.pdf"/>
-    </docs>
-    
-  </japanese>
-
-  <chinese label="中文" href="zh_CN/" tab="zh_CN">
-    <index label="概要" href="index.html" tab="zh_CN"/>
-    
-    <docs label="文档">
-      <dev label="概要" href="concepts.html"/>
-      <dev label="连接器一览" href="included-connectors.html"/>
-      <dev label="Q&amp;A" href="faq.html"/>
-      <dev label="Javadoc" href="javadoc.html"/>
-      <dev label="开发人员资源" href="technical-resources.html"/>
-      <dev label="用户手册(HTML)" href="end-user-documentation.html"/>
-    </docs>
-    
-  </chinese>
-
-  <external-refs>
-  </external-refs>
-
- 
-</site>
diff --git a/site/src/documentation/content/xdocs/tabs.xml b/site/src/documentation/content/xdocs/tabs.xml
deleted file mode 100644
index 324b690..0000000
--- a/site/src/documentation/content/xdocs/tabs.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE tabs PUBLIC "-//APACHE//DTD Cocoon Documentation Tab V1.0//EN" 
-          "tab-cocoon-v10.dtd">
-
-<!--
- 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.
--->
-
-<tabs software="Lucene"
-      title="Lucene"
-      copyright="The Apache Software Foundation"
-      xmlns:xlink="http://www.w3.org/1999/xlink">
-
-  <!-- The rules are:
-    @dir will always have /index.html added.
-    @href is not modified unless it is root-relative and obviously specifies a
-    directory (ends in '/'), in which case /index.html will be added
-  -->
-
-  <tab id="launch" label="Hello!"/>  
-  <tab id="en_US" label="English" dir="en_US"/>  
-  <tab id="ja_JP" label="日本語" dir="ja_JP"/> 
-  <tab id="zh_CN" label="中文" dir="zh_CN"/> 
-</tabs>
diff --git a/site/src/documentation/content/xdocs/zh_CN/concepts.xml b/site/src/documentation/content/xdocs/zh_CN/concepts.xml
deleted file mode 100644
index c09c8a9..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/concepts.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>概要</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>概要</title>
-      <p>ManifoldCF是为下述目的而设计的爬虫框架。</p>
-      <p></p>
-      <ul>
-        <li>可信赖,可从关闭或重启状态迅速恢复</li>
-        <li>增量式,事先在作业中定义所搜集的文档条件,并反复执行作业而获取文档差分</li>
-        <li>可同时连接不同类型的存储库搜集文档</li>
-        <li>定义并完全支持文档安全模型。根据不同的用户权限显示文档的搜索结果</li>
-        <li>保持切合实际的运转效率,并具有高吞吐量</li>
-        <li>可控制和预测内存使用量</li>
-      </ul>
-      <p></p>
-      <p>ManifoldCF使用关系型数据库实现其体系结构。当前版本支持Postgresql,Derby,MySQL。其它数据库的使用也在考虑中。</p>
-      <p></p>
-      <section>
-        <title>ManifoldCF文档模型</title>
-        <p></p>
-        <p>ManifoldCF的各文档由二进制数据和相关元数据构成,并附上唯一的URI。与其组合使用的搜索引擎需支持此规格。</p>
-        <p></p>
-        <p>文档可以和访问令牌联系起来。关于访问令牌将在下一节说明。</p>
-        <p></p>
-      </section>
-      <section>
-        <title>ManifoldCF安全模型</title>
-        <p></p>
-        <p>ManifoldCF安全模型支持微软的Active Directory认证以及层次模型。这是因为许多企业使用Active Directory管理文件和文档的许可/权限。还有,Active Directory由很多第三方软件所利用。</p>
-        <p></p>
-        <p>ManifoldCF使用<em>访问令牌</em>的概念。ManifoldCF里访问令牌为,依赖于连接器的字符串。是否将文档显示给用户由此字符串所控制。利用Active Directory时,访问令牌为Active Directory SID(例:S-1-23-4-1-45)です。在LiveLink里访问令牌为具有其它含义的字符串。</p>
-        <p></p>
-        <p>ManifoldCF安全模型中,由<em>权限连接器</em>为将执行搜索的用户生成访问令牌一览。搜索受多个安全管理的服务器时,权限连接器组合访问令牌。所生成的访问令牌一览伴随搜索结果发送到搜索引擎。搜索引擎通过此信息限制向用户公开的内容。</p>
-        <p></p>
-        <p>生成文档索引后,ManifoldCF将访问令牌传给搜索引擎。访问令牌包括[允许]和[拒绝]两种令牌。另外,访问令牌和Active Directory同样可[共享],[フォルダ],[ファイル]に安全を设置することができます。</p>
-        <p></p>
-        <p>搜索引擎根据访问令牌决定所显示的搜索結果。作为搜索引擎使用Solr 1.5时,为使其标准化提供Apache Solr工程的SearchComponent插件和说明书( <a href="https://issues.apache.org/jira/browse/SOLR-1895">SOLR-1895</a>)。</p>
-        <p></p>
-      </section>
-      <section>
-        <title>ManifoldCF概念性实体</title>
-        <p></p>
-        <section>
-          <title>连接器</title>
-          <p></p>
-          <p>ManifoldCF具有如下三个连接器:</p>
-          <p></p>
-          <ul>
-            <li>权限连接器</li>
-            <li>存储库连接器</li>
-            <li>输出连接器</li>
-          </ul>
-          <p></p>
-          <p>所有连接器具有共同功能。首先,所有连接器被池化。ManifoldCF管理所设连接器的实例。还可设实例数的上限。连接器实现了在ManifoldCF管理的缓冲池内管理自身的方法。连接器可以设置。连接器设置可通过依赖于连接器实现的XML语句实现。在ManifoldCF,所设连接器的实例称为<em>连接</em>。</p>
-          <p></p>
-          <p>连接器具有下述功能:</p>
-          <p></p>
-          <table>
-            <tr><th>连接器类型</th><th>功能</th></tr>
-            <tr><td>权限连接器</td><td>保证存储库做到将用户名和访问令牌联系起来。</td></tr>
-            <tr><td>存储库连接器</td><td>可从指定的存储库(例:SharePoint,Web)搜集文档</td></tr>
-            <tr><td>输出连接器</td><td>将搜集文档和相关处理(添加,删除等)发到后台搜索引擎或象Lucene的实体</td></tr>
-          </table>
-          <p></p>
-        </section>
-        <section>
-          <title>连接</title>
-          <p></p>
-          <p>正如上述说明,<em>连接</em>是指连接的实现及连接器固有的设置信息。可从Web浏览器加以设置。</p>
-          <p></p>
-          <p>连接器设置用来设置“如何搜集”而非“搜集什么”。比如,LiveLink连接设置和LiveLink服务器的连接方法。并不设置搜集哪些文档。</p>
-          <p></p>
-          <p><em>存储库连接</em>和<em>权限连接</em>以及输出连接的设置不尽相同。存储库连接里设置权限连接。这是因为ManifoldCF所搜集的<strong>所有</strong>文档需要适当的访问令牌。</p>
-          <p></p>
-        </section>
-        <section>
-          <title>作业</title>
-          <p></p>
-          <p>ManifoldCF中<em>作业</em>是指定存储库连接和输出连接的同步操作。作业包括:</p>
-          <p></p>
-          <ul>
-            <li>详细说明</li>
-            <li>存储库连接(暗含权限组)</li>
-            <li>输出连接</li>
-            <li>存储库连接指定的作业对象文档和元数据的说明</li>
-            <li>爬取模型:“运行至完成”或“连续执行”</li>
-            <li>作业调度:指定时间段或立即执行</li>
-          </ul>
-          <p></p>
-          <p>多个作业可共享存储库连接器。即,ManifoldCF允许设置可从多个作业搜集同一个文档,但不推荐通过不同作业搜集相同文档。</p>
-        </section>
-        <section>
-          <title>授权域</title>
-          <p></p>
-          <p>ManifoldCF支持用户联合概念。举个例子,假设一个用户针对FaceBook, Windows, Google拥有各自的登录名。
-		    我们可为此用户定义三个不同的授权域:"FaceBook", "Windows", "Google".</p>
-          <p>在ManifoldCF, 每一个权限了解来自指定授权域的用户名和ID。这将允许ManifoldCF被设置成
-            可以合并生成自多个独立源的访问令牌,即使每一个源被输入不同的用户名。</p>
-        </section>
-        <section>
-          <title>权限组</title>
-          <p></p>
-          <p>ManifoldCF按权限连接加以分组,故可将多个权限赋予同一个文档。
-            一个权限组只不过是一个名称和描述,它被属于此权限组的权限连接所参照,同时还被希望受此权限组保护的存储库连接所参照。
-            至于最简单的存储库,通常一个权限就是一个权限组。
-            但是,具有联邦安全能力的存储库(如,支持Claim空间的SharePoint)可以使用多个权限为一个文档定义安全。
-            在次情形下,权限组允许设置适当的多对多关系。</p>
-        </section>
-      </section>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/end-user-documentation.xml b/site/src/documentation/content/xdocs/zh_CN/end-user-documentation.xml
deleted file mode 100644
index 352299e..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/end-user-documentation.xml
+++ /dev/null
@@ -1,1364 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- 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.
--->
-
-<document>
-<header><title>ManifoldCF- 终端用户手册</title></header>
-<properties>
-</properties>
-<body>
-
-        <section id="overview">
-            <title>概要</title>
-            <p>本手册面向使用ManifoldCF的终端用户。前提条件为已安装并设置ManifoldCF框架,正常启动所有必要的服务,正确注册要使用的连接类型。如手动执行上述操作,请参照[开发人员资源]页。
-            </p>
-            <p>本手册主要说明ManifoldCF的用户界面及其使用方法。在缺省设置下,在Web浏览器打开URL:<code>http://my-server-name:8345/mcf-crawler-ui</code>。在非缺省设置下,URL会发生变化,请咨询系统管理员。
-            </p>
-            <p>ManifoldCF的用户界面在Firefox和IE通过测试。使用别的Web浏览器可能无法正常运行。如无法正常运行,请联系系统管理员。</p>
-            <p>从Web网页打开上述URL,将会看到如下页面:</p>
-            <br/><br/>
-            <figure src="images/zh_CN/welcome-screen.PNG" alt="Welcome Screen" width="80%"/>
-            <br/><br/>
-            <p>左侧为菜单,右侧显示欢迎页。选择左侧菜单项,右侧会显示相应的内容。建议在进入设置之前,先过目下述说明并理解ManifoldCF的概要。
-            </p>
-            <section id="outputs">
-                <title>输出连接器的定义</title>
-                <p>左侧菜单包含用来输出爬取文档的输出连接器列表。在很多场合下,将输出到搜索引擎。</p>
-                <p>所有作业必须要指定输出连接。要指定输出连接,请从左侧菜单选择[输出连接列表]。将会看到如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/list-output-connections.PNG" alt="输出连接列表" width="80%"/>
-                <br/><br/>
-                <p>初次使用时,输出连接还未定义。如已定义输出连接,会显示在列表中。可通过输出连接左端的[显示],[编辑],[删除]链接,显示、编辑、删除设置内容。要定义新输出连接,单击列表下方的[添加新输出连接]。将会看到如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-output-connection-name.PNG" alt="Add New Output Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>输出连接上方的标签是输出连接的属性群。根据不同的连接类型标签也有所不同。</p>
-                <p>首先,输入连接的名称和说明。输出连接名用来识别连接,无需具有唯一性。注意,一经设置就无法修改。名称不能超过32个字符,说明不应超出255字符。输入完毕,请选择[类型]标签。将会看到如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-output-connection-type.PNG" alt="Add New Output Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>选择[连接类型]下拉菜单,会显示输出连接列表。列表中所显示的输出连接器及其名称,会根据安装设置Apache ManifoldCF的系统集成而有所不同。显示标签,随所选连接类型发生变化。后续章节会说明标签设置内容。</p>
-                <p>从下拉列表选择输出连接类型,单击[下一个]按钮。会显示输出连接定义所需属性的标签。页下显示[保存]按钮。生成连接时<b>必须</b>要单击此[保存]按钮。放弃设置内容时,单击[取消]按钮或选择左菜单项目。</p>
-                <p>所有输出连接类型附上[限流器链接]标签。选择后会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/output-throttling.PNG" alt="Output Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>此页仅有一个项目:系统使用此输出连接时的最大连接数。可调整系统负荷,根据版权限制连接数。设置值越大,吞吐量也增大。所有连接类型的缺省值为10,但根据输出连接和类型此值或许并非为最佳值。关于详情,参阅后续各种输出连接和类型的说明。</p>
-                <p>保存连接,会显示所设置的内容和连接状态。连接设置正确时,状态为[正常]。设置有误时,显示错误。出错时,请修改设置。</p>
-            </section>
-            <section id="authorities">
-                <title>定义权限连接</title>
-                <p>从左侧菜单选择[权限列表],会显示权限连接列表。权限连接,用来连接到具有特定安全环境的系统。比如,访问由ActiveDirectory管理的文件时,需定义ActiveDirectory权限连接。</p>
-                <p>仅爬去公开文档时,无需定义权限连接,比如爬去互联网上无需认证任何人均可参阅的Web网页, RSS, Wiki。相反,搜索公司内部文档时,多数需要用户认证,需定义权限连接。</p>
-                <p>在定义存储库连接之<b>前</b>先定义权限连接。虽过后也可以改变存储库连接和权限连接的关系,但有可能需要重新爬去文档。</p>
-                <p>要定义权限连接,从右側菜单选择[权限列表]。会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/list-authority-connections.PNG" alt="List Authority Connections" width="80%"/>
-                <br/><br/>
-                <p>初次使用时,权限连接还未定义。权限连接已定义时,会显示列表。权限连接左方显示[显示],[编辑],[删除]链接,用来显示,编辑或删除设置。定义新权限连接时,选择列表下方[添加新权限连接]链接。选择后会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-authority-connection-name.PNG" alt="Add New Authority Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>上面显示的标签为权限连接的属性群。随连接类型显示标签有所不同。</p>
-                <p>首先,输入连接名称和说明。权限连接名用来区分连接,故需要唯一。注意,一经设置就无法改变。名称最长为32字符,说明最长为255字符。输入后单击[类型]标签。会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-authority-connection-type.PNG" alt="Add New Authority Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>选择连接类型和下拉列表,会显示权限连接列表。列表显示的权限连接器及名称,根据安装设置Apache ManifoldCF的系统集成会有所不同。显示标签,根据所选连接类型发生变化。后续章节说明标签设置内容。</p>
-                <p>从下拉列表选择权限连接类型,单击[下一个]按钮。会显示所选权限连接定义所需属性的标签。另,页下显示[保存]按钮。生成连接时<b>必须</b>要单击此[保存]按钮。放弃设置内容时,单击[取消]按钮或左方菜单项。</p>
-                <p>所有输出连接类型有[限流器链接]标签。选择后会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/authority-throttling.PNG" alt="Authority Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>此页仅有一个项目:系统使用此输出连接时的最大连接数。可调整系统负荷,根据版权限制连接数。值越大,吞吐量也增大。所有连接类型的缺省值为10,随输出连接和类型此值并非最佳。关于详情,参阅后续各输出连接和类型说明。</p>
-                <p>关于连接类型标签的详情,参阅关于权限连接和类型所显示标签的说明。</p>
-                <p>保存连接,会显示所设连接内容页和连接状态。连接正确设置时,状态为[正常]。设置有误时,显示错误。显示出错信息时,请修改设置内容。</p>
-                       
-            </section>
-            <section id="connectors">
-                <title>定义存储库连接</title>
-                <p>从左侧菜单选择[存储库列表],看到存储库连接列表。存储库连接是指向保存要生成索引文档的存储库的连接。
-它被要求能够连接到备特定安全环境的系统。比如,访问ActiveDirectory管理的文件时,需定义ActiveDirectory权限连接。</p>
-                <p>所有作业需指定存储库连接。作业从指定存储库连接读入文档。在定义用以从文档生成索引的作业之前,先生成存储库连接。</p>
-                <p>还可以在存储库连接指定权限连接。权限连接用来指定存储库连接所读取文档的安全环境。还可以在爬虫执行后修改存储库连接所对应的权限连接,但必须重新读入存储库连接的所有对象文档并重建索引。因此,建议在定义存储库连接之前定义权限连接。限流器链接</p>
-                <p>要定义存储库连接,从左侧菜单选择[存储库连接列表]。将看到如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/list-repository-connections.PNG" alt="List Repository Connections" width="80%"/>
-                <br/><br/>
-                <p>开始使用时,存储库连接尚未定义。存储库连接已定义时,会显示列表。选择存储库连接的左端显示的[显示],[编辑],[删除]链接显示设置内容,可编辑或删除。定义存储库输出连接时,选择列表下方[添加新存储库连接]链接。会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-repository-connection-name.PNG" alt="Add New Repository Connection, specify Name" width="80%"/>
-                <br/><br/>
-                <p>上方显示的标签时存储库连接的属性。根据连接类型会显示不同标签。</p>
-                <p>首先,输入连接的名称和说明。存储库连接名用来识别连接,应具唯一性。另,一经设置就无法更改。名称最长为32字符,说明最长为255字符。输入后,选择[类型]标签,会显示如下页面:</p>
-                <br/><br/>关于连接类型标签的详细信息,请参阅权限连接和类型所显示标签的说明。
-                <figure src="images/zh_CN/add-new-repository-connection-type.PNG" alt="Add New Repository Connection, select Type" width="80%"/>
-                <br/><br/>
-                <p>选择连接类型和下拉列表,会显示存储库连接列表。列表显示的存储库连接器及名称,根据安装设置Apache ManifoldCF的系统集成会有所不同。显示的标签,根据所选择的连接类型而变化。后续内容将说明标签设置。</p>
-                <p>还可以指定从存储库读取文档的权限信息。权限连接有时会依赖于存储库连接。详情请参阅所使用存储库连接及权限连接的说明。</p>
-                <p>选择存储库连接类型和权限连接后选择[下一个]按钮。会显示定义所选存储库连接所需属性的标签。另外,页面下方显示[保存]按钮。生成连接时<b>必须</b>要单击[保存]按钮。取消设置内容时,单击[取消]按钮或左方菜单项。</p>
-                <p>所有输出连接类型具有[限流器链接]标签。选择后会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/repository-throttling.PNG" alt="Repository Connection Throttling" width="80%"/>
-                <br/><br/>
-                <p>此页有两个项目:首先,系统可以使用此输出连接的最大连接数。从而,可调整系统负荷,或根据版权限制而限制连接数。该值过大时,吞吐量会上升。所有连接类型的缺省值为10,根据输出连接和类型此值或许不是最适值。关于详细信息,参阅后续各种输出连接和类型的说明。其二,爬虫使用此连接时,可以以多大平均速度读取文档。 </p>
-                <p>可为每一个连接设置[限流器bin]。限流器bin是用来显示读取频度的资源名称。比如,Web连接可为每一个HTTP服务器名指定限流器bin。由此,可按HTTP服务器名指定文档读取频度。</p>
-                <p>从存储库连接的[限流器链接]标签可定义无限的限流器链接设置。按限流器链接设置指定限流器bin集的正则表达式,说明文,并为每一个正则表达式指定相应的限流器bin平均读取频度。当限流器bin和一个以上限流器链接设置匹配时,选择最不使用资源的读取设置设为有效</p>
-                <p>最为简单的正则表达式为空表达式。此时所有限流器bin与之匹配。当在连接指定缺省限流器设置可使用此方法。指定平均读取率,请单击[添加]按钮,显示如下限流器链接标签:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/repository-throttling-with-throttle.PNG" alt="Repository Connection Throttling With Throttle" width="80%"/>
-                <br/><br/>
-                <p>限流器未设置时,文档读取不会被限制。</p>
-                <p>关于连接类型的标签,请参阅根据存储库连接和类型所显示标签的说明。</p>
-
-                <p>保存连接,会显示所设置连接的内容。连接状态亦会显示。连接被正确设置时,状态显示为[正常]。设置有误时,会显示错误。出错时,请修改设置。</p>
-                       
-            </section>
-            <section id="jobs">
-                <title>生成作业</title>
-                <p>ManifoldCF的[作业],指读取文档的集合。ManifoldCF通过存储库连接读取所指定的文档集,并写入指定的输出连接。作业的内容和文档索引的生成方法,依赖于相关存储库连接。文档的索引生成方法,还依赖于输出连接。</p>
-                <p>所定义的多数作业会执行一次以上。每当执行作业,不仅将新文档及更新文档发送到输出连接,还要将对象外文档通知输出连接。文档可用两个方法排除对象之外:从存储库删除文档时,从读取对象排除文档时。这两种方法ManifoldCF均可处理</p>
-                <p>如删除作业,会通知输出连接和作业相关的所有文档已被删除。作业显示该作业的相关文档。作业被删除时,与其它作业不相关的文档也会被删除。(注:ManifoldCF作业并不仅仅是用来执行文档读取任务。)</p>
-                <p>ManifoldCF可从多个作业读取一个文档。和一个以上作业相关的文档以如下方式处理:</p>
-                <ul>
-                    <li>删除作业时,不含在别的作业对象中的文档信息将通知到输出连接。</li>
-                    <li>通知到输出连接的文档版本取决于最后执行的作业。</li>
-                </ul>
-                <p>文档为多个作业的对象时处理变为复杂,所以应尽量避免。</p>
-                <p>非连续作业按如下步骤执行:</p>
-                <ol>
-                    <li>将作业的新建,修改,删除的开始点登录到队列([播种])</li>
-                    <li>读取文档,发现新文档,获取删除对象信息</li>
-                    <li>从队列删除读取对象外文档</li>
-                </ol>
-                <p>还可让作业[连续]执行。连续作业将一直直行直到中断为止。连续作业按如下步骤执行:</p>
-                <ol>放弃设置内容时,选择[取消]按钮或左方菜单项。
-                    <li>将作业的新建,修改,删除的开始点登录的队列([播种])</li>
-
-                    <li>读取文档,发现新文档,获取删除对象信息。定期登录种子</li>
-                </ol>
-                <p>注:连续作业无法从队列删除<b>排除</b>文档。只有从存储库删除的文档可以出队。
-</p>
-                <p>作业可由用户立即执行,还可调度。调度时,可指定开始时间,还可设置在别的作业结束后执行。</p>
-                <p>可并行执行的作业数并无限制。</p>
-                <p>定义作业时,选择左菜单的[作业列表]。会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/list-jobs.PNG" alt="List Jobs" width="80%"/>
-                <br/><br/>
-                <p>当显示,编辑,删除所定义的作业时,单击显示在作业列表中的作业右方的链接。还可以复制定义的作业。定义新作业时,选择列表下方所显示的[添加新作业]链接,会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-job-name.PNG" alt="Add New Job, name tab" width="80%"/>
-                <br/><br/>
-                <p>请输入作业名。作业名无需保持唯一性。但是,具有唯一性便于使用,故推荐保持唯一性。输入后选择[连接]标签:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-job-connection.PNG" alt="Add New Job, connection tab" width="80%"/>
-                <br/><br/>
-                <p>选择输出连接名和存储库连接名。注意保存作业定义后就不能修改所选连接。</p>
-                <p>可以指定作业的优先级及开始方法。优先级,指和其它作业相比时读入文档的重要性。设置值高的作业优先读入文档。开始方法如上所述,手工开始,按调度时间开始,或在别的调度作业后开始。</p>
-                <p>设置完毕单击[下一个]按钮。会看到其它标签和页下的[保存]按钮。登录或更新作业时<b>必须</b>要单击[保存]按钮。放弃设置内容时,单击[取消]按钮或左方的菜单项。</p>
-                <p>所有作业有[调度]标签。从调度标签,可进行调度相关设置:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-job-scheduling.PNG" alt="Add New Job, scheduling tab" width="80%"/>
-                <br/><br/>
-                <p>可进行以下设置:</p>
-                <ul>
-                    <li>连续执行作业,还是一次性读入所有文档</li>
-                    <li>文档变成无效的时间。无效文档的索引将被删除</li>
-                    <li>确认文档更新的间隔</li>
-                    <li>初期文档重新播种的等待时间</li>
-                </ul>
-                <br/>
-                <p>最后三个设置仅在连续执行时有效。</p>
-                <p>从此页还可定义调度期间。调度期间指,可执行作业的时间段。时间段由开始日期(星期,月,日,时,分)和最大执行时间(分)指定。从各下拉菜单选择多个设置时,作业开始时间为各下拉菜单中所选日期设置中的<b>一个</b>匹配时。</p>
-                <p>输入调度后,单击[添加调度]按钮:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/add-new-job-scheduling-with-record.PNG" alt="Add New Job, scheduling tab with record" width="80%"/>
-                <br/><br/>
-                <p>示例页面定义为,作业将从星期六和星期日的上午2点到最长4个小时(上午6点)执行。</p>
-                <p>其它标签随所选连接类型不同而不同。关于这些标签的详情,参阅所选输出连接及存储库连接的章节。</p>
-            </section>
-            <section id="executing">
-                <title>执行作业</title>
-                <p>要把握作业执行状态,从左菜单选择[状态与管理]。会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/job-status.PNG" alt="Job Status" width="80%"/>
-                <br/><br/>
-                <p>要显示作业的当前状态单击画面下方的[更新]按钮。更改作业的状态,选择显示待更改作业名左方的状态链接。具有如下处理状态:</p>
-                <ul>
-                    <li>开始 (开始作业)</li>
-                    <li>中断(中断作业)</li>
-                    <li>结束 (暂时结束作业)</li>
-                    <li>重开 (重新开始作业)</li>
-                    <li>重新执行 (中断作业并重新执行)</li>
-                </ul>
-                <br/>
-                <p>[文档数],[处理中],[已处理]栏表示队列中的作业信息。[文档数]指作业对象的所有文档数。[处理中]指队列中待处理文档数。[已处理]指至少一次放进队列并处理过的文档数。</p>
-            </section>
-            <section id="statusreports">
-                <title>状态报告</title>
-                <p>ManifoldCF的所有作业和文档集相关。包含在集和中的文档位置信息保存在作业队列中。ManifoldCF可从GUI页确认此队列。</p>
-                <p>从各状态报告可通过以下信息选择作业队列的文档:</p>
-                <ul>
-                    <li>作业</li>
-                    <li>文档ID</li>
-                    <li>文档状态</li>
-                    <li>文档的下次调度时间</li>
-                </ul>
-                <section id="documentstatus">
-                    <title>文档状态</title>
-                    <p>文档状态报告,显示和指定条件相吻合的文档及其状态,预定处理列表。还可确认执行中的作业是否处理某一个文档。</p>
-                    <p>从左菜单选择[文档状态]链接,会显示如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/document-status-select-connection.PNG" alt="Document Status, select connection" width="80%"/>
-                    <br/><br/>
-                    <p>选择要搜索的连接。还可以指定用来过滤文档状态和文档ID的正则表达式。单击[下一个]按钮会显示如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/document-status-select-job.PNG" alt="Document Status, select job" width="80%"/>
-                    <br/><br/>
-                    <p>从右方下拉列表,选择作业,再一次单击[下一个]按钮。会显示如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/document-status-example.PNG" alt="Document Status, example" width="80%"/>
-                    <br/><br/>
-                    <p>可以修改条件并单击[执行]按钮来更改要显示的文档信息。还可以通过修改显示结果数并单击[执行]按钮,更改每一页的显示文档数。一页中无法显示所有匹配文档时,单击[上一个]链接或[下一个]链接来移动并显示。</p>
-                </section>
-                <section id="queuestatus">
-                    <title>队列状态</title>
-                    <p>队列状态报告,显示指定类中出现的文档次数。指定类时,使用文档ID和匹配正则表达式的组。结果为文档数。文档状态/状況组成为一列。</p>
-                    <p>比如,指定类为[()]时一行由状态/状況组构成。指定类为[(.*)],一行由每一个文档ID构成,相关文档的状态/状況列设为[1],其它列设为[0]。</p>
-                    <p>从左菜单选择[队列状态]链接,显示如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/queue-status-select-connection.PNG" alt="Queue Status, select connection" width="80%"/>
-                    <br/><br/>
-                    <p>选择要搜索的连接。还可指定用来过滤文档状态/状況和文档ID的正则表达式。文档ID类缺省为[(.*)]。请根据需要修改。单击[下一个]按钮会显示如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/queue-status-select-job.PNG" alt="Queue Status, select job" width="80%"/>
-                    <br/><br/>
-                    <p>从右方下拉列表,选择作业,再一次单击[下一个]按钮。会显示如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/queue-status-example.PNG" alt="Queue Status, example" width="80%"/>
-                    <br/><br/>
-                    <p>可以通过修改条件并单击[执行]按钮来更改显示的文档信息。还可以通过修改显示结果数并单击[执行]按钮,来修改每一页的显示文档数。所有匹配文档无法显示在同一页时,单击[上一个]链接和[下一个]链接来移动并显示。</p>
-
-                </section>
-            </section>
-            <section id="historyreports">
-                <title>历史记录报告</title>
-                <p>ManifoldCF记录每一个连接所处理的历史记录。此历史记录包括ManifoldCF核心所记录的事件和,存储库连接及输出连接的事件。事件以[活动类型]加以分类。存在如下活动类型:</p>
-                <ul>
-                    <li>开始作业</li>
-                    <li>结束作业</li>
-                    <li>中断作业</li>
-                    <li>多个connection-type-specific读入及访问处理</li>
-                    <li>多个connection-type-specific输出及索引生成处理</li>
-                </ul>
-                <p>历史记录报告可用来确认正在如何处理文档,是否在正常运行。ManifoldCF配有基于历史记录数据的多个报告。</p>
-                <p>所有历史记录报告,可以过滤显示内容。可使用如下项目指定过滤条件:</p>
-                <ul>
-                    <li>存储库连接名</li>
-                    <li>活动类型(可选择多个)</li>
-                    <li>开始时间</li>
-                    <li>结束时间</li>
-                    <li>对象文档ID(以正则表达式指定)</li>
-                    <li>结果(以正则表达式指定)</li>
-                </ul>
-                <p>报告可用来查出处理中的問題或性能問題的原因。各历史记录报告的详情请参照下面章节。</p>
-                <section id="simplehistory">
-                    <title>简易历史记录报告</title>
-                    <p>简易报告并不进行统计,只显示和指定条件匹配的存储库连接的历史记录数据。从新到旧显示事件的开始时间,结束时间,处理内容,ID,数据量(字节),结果等。还可以改变要显示的报告事件数,按指定列顺次排序,移动页。</p>
-                    <p>请从左菜单选择[简易历史记录]。将看到如下页面:</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/simple-history-select-connection.PNG" alt="Simple History Report, select connection" width="80%"/>
-                    <br/><br/>
-                    <p>请从左上下拉菜单选择存储库连接。还可以指定以正则表达式开始和结束日期和时间,对象ID及结果代码。缺省设置下显示前一小时之内的所有事件。</p>
-                    <p>单击[下一个]按钮。可从右上下拉菜单看到活动。</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/simple-history-select-activities.PNG" alt="Simple History Report, select activities" width="80%"/>
-                    <br/><br/>
-                    <p>从下拉菜单选择一个或一个以上活动,单击[执行]按钮。相应事件会按由新到旧的顺序显示</p>
-                    <br/><br/>
-                    <figure src="images/zh_CN/simple-history-example.PNG" alt="Simple History Report, example" width="80%"/>
-                    <br/><br/>
-                    <p>如改变搜索条件时,修改条件后单击[执行]按钮。另外,改变显示结果数并单击[执行]按钮,改变1页中所显示的文档数。所有匹配文档无法显示在同一页时,还可以单击[上一个]链接和[下一个]链接来移动显示内容。</p>
-                    <p>单击[执行]按钮,会按当前时间作为条件显示结果。即,显示单击[执行]按钮前一小时之内的事件。作业执行中时,每次单击会显示不同结果。</p>
-                </section>
-                <section id="maxactivity">
-                    <title>最大活动报告</title>
-                    <p>最大活动报告,用来显示在指定时间段活动的最大发生率。</p>
-                </section>
-                <section id="maxbandwidth">
-                    <title>最大带宽报告</title>
-                    <p>最大带宽报告,表示在指定时间段活动的最大字节传输率。</p>
-                </section>
-                <section id="resulthistogram">
-                    <title>结果历史记录报告</title>
-                    <p>结果历史记录报告,显示指定活动相应的结果数量。</p>
-                </section>
-            </section>
-            
-            <section id="credentials">
-                <title>关于认证</title>
-                <p>所选连接类型需要认证时,请从系统管理员获取需要的信息。各个连接设计时考虑到,读取文档时要求最低限度的认证。执行中发生安全警告时,请核实认证的权限。</p>
-            </section>
-
-        </section>
-        
-        <section id="outputconnectiontypes">
-            <title>输出连接类型</title>
-            
-            <section id="solroutputconnector">
-                <title>Solr输出连接</title>
-                <p>Solr输出连接类型,通过Solr HTTP API发送文档到Solr。连接预先设置为Solr的缺省值。Solr连接不管可否建立索引,处理所有文档。设置管道判断是否使用文档。</p>
-                <p>但是,因发送所有文档所以如不设置过滤器,象图片等大型文件也会被发送,给系统施加很大负荷。为避免发生此类问题,建议检查Solr连接的所有爬取结果,从而发现不足或错误的设置。</p>
-                <p>选择Solr输出连接,会显示5个标签。[服务器]标签指定HTTP对象:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/solr-configure-server.PNG" alt="Solr Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>输入Solr设置。当前版本只支持基本认证。在如下部分输入用户/密码。</p>
-                <p>从[模式]标签,可指定Solr字段作为文档ID。Solr连接将使用此字段作为主键来搜索文档。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/solr-configure-schema.PNG" alt="Solr Configuration, Schema tab" width="80%"/>
-                <br/><br/>
-                <p>从[参数]标签指定发到Solr的任意参数。可以使用可用在Solr更新请求的任意参数。
-比如,可以添加为处理Solr文档所使用的管道/链:update.chain=myChain。其它可指定的参数参阅Solr手册。标签显示如下:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/solr-configure-arguments.PNG" alt="Solr Configuration, Arguments tab" width="80%"/>
-                <br/><br/>
-                <p>输入参数名和值,单击[添加]按钮。名称已存在时,现有值被新值覆盖。删除参数时,单击在删除参数左方的[删除]按钮。</p>
-                <p>第4个标签为[文档]标签。这可根据文档大小和MIME类型来过进行滤器。按字节単位指定文档的最大长度,排除超过设置(比如10485760等于10MB)的文档。要只添加特定MIME类型的文档,可在"包含MIME类型"栏输入(比如要排除HTML以外的文档,登录"text/html")。"排除MIME类型"栏,用以排除特定MIME类型的文档(比如要排除JPEG图片就登录"image/jpeg")。标签显示如下:</p>
-                <figure src="images/zh_CN/solr-configure-documents.PNG" alt="Solr Configuration, Documents tab" width="80%"/>
-                <br/><br/>
-                <p>第5个标签为"提交"标签。用来控制提交操作。所有作业在缺省状态下设置为结束时自动文档。另,还可以毫秒单位在指定时间内提交各文档(如在10秒之内提交则登录"10000")。<a href="http://wiki.apache.org/solr/CommitWithin">commit within</a>的动作取决于Solr而非ManifoldCF。标签显示如下:</p>
-                <figure src="images/zh_CN/solr-configure-commits.PNG" alt="Solr Configuration, Documents tab" width="80%"/>
-                <br/><br/>
-                <p>输入完设置,单击[保存]按钮。显示如下输入设置列表:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/solr-status.PNG" alt="Solr Status" width="80%"/>
-                <br/><br/>
-                <p>示例页面,显示因Solr连接无法正常运行而出错。</p>
-                <p>在作业选择Solr类型连接,显示[项目映射]标签。从此标签可将在作业连接类型中获取的元数据字段和Solr接收字段对应上。元数据字段名称由存储库设置,有可能和Solr模式不相配。在此标签,还可以设置将指定的元数据字段排除在索引生成对象之外。标签如下:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/solr-job-field-mapping.PNG" alt="Solr Specification, Field Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>添加新映射时,在[源]项输入元数据名,[目标]里输入Solr的输出字段名并单击[添加]按钮。关于不发送到Solr的字段,[目标]置为空。</p>
-            </section>
-
-            <section id="filesystemoutputconnector">
-                <title>文件系统输出连接</title>
-                <p>文件系统输出连接,可以象Unix工具<em>wget</em>在本地文件系统保存文档。此连接类型保存的文档,不包含元数据或安全信息,仅由二进制文件构成。</p>
-                <p>文件系统输出连接类型的连接构成信息不含添加标签。但,有附加的作业标签,称作[输出路径]。标签如下。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/filesystem-job-output-path.PNG" alt="File System Specification, Output Path tab" width="80%"/>
-                <br/><br/>
-                <p>输入文档要输出的路径,单击[保存]。</p>
-            </section>
-
-            <section id="hdfsoutputconnector">
-                <title>HDFS输出连接</title>
-                <p>HDFS输出连接,象Unix工具<em>wget</em>可在HDFS(Hadoop Distributed File System)保存文档。此连接类型的保存文档,不含元数据或安全信息,仅由二进制文件构成。</p>
-                <p>HDFS输出连接类型的连接构成信息包含叫做[服务器]标签的添加标签。此标签如下所示。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/hdfs-configure-server.PNG" alt="HDFS Output Configuration, Server tab" width="80%"/>
-                <br/><br/>
-                <p>输入HDFS名称节点的URI及HDFS用户名。两者均需输入。</p>
-                <p>关于HDFS输出连接类型,拥有叫做[输出路径]的附加的作业标签。此标签如下。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/hdfs-job-output-path.PNG" alt="HDFS Output Specification, Output Path tab" width="80%"/>
-                <br/><br/>
-                <p>输入文档要输出的路径,单击[保存]。</p>
-            </section>
-            
-            <section id="osssoutputconnector">
-            	<title>OpenSearchServer输出连接</title>
-            	<p>OpenSearchServer输出连接,通过HTTP API将XML文档送到OpenSearchServer。此连接器设计为尽量方便使用。</p>
-            	<p>选择OpenSearchServer输出连接类型后,按照OpenSearchServer设置输入[参数]标签项。各OpenSearchServer输出连接对应着一个索引。使用一个以上索引时,请为每一个索引生成输出连接。</p>
-            	<figure src="images/zh_CN/opensearchserver-connection-parameters.PNG" alt="OpenSearchServer, parameters tab" width="80%"/>
-            	<p>参数:</p><br/>
-            	<ul>
-            		<li>服务器地址:OpenSearchServer实例的URL。缺省URL(http://localhost:8080)为当OpenSearchServer和ManifoldCF在同一台服务器运行时的地址。</li>
-            		<li>索引名:连接器在指定索引生成数据。</li>
-            		<li>用户名和API键:为连接到OpenSearchServer实例的用户认证信息。用户未生成时,置空。下面的图像显示OpenSearchServer中记载认证信息时的页面。</li>
-            	</ul>
-            	<figure src="images/zh_CN/opensearchserver-user.PNG" alt="OpenSearchServer, user configuration" width="80%"/>
-            	<p>在作业选择OpenSearchServer输出连接,会显示[OpenSearchServer]标签。此标签可设置如下事宜:</p><br/>
-            	<ul>
-            		<li>对象文档的最大大小(字节)。缺省为16MB。</li>
-            		<li>对象MIME类型。个别存储库连接无法正常处理。</li>
-            		<li>对象文件扩展名。个别存储库连接无法正常处理。</li>
-            	</ul>
-            	<figure src="images/zh_CN/opensearchserver-job-parameters.PNG" alt="OpenSearchServer, job parameters" width="80%"/>
-            	<p>所有活动可从历史记录报告确认。连接器支持三种活动:读取文档(生成索引),删除文档,优化索引。结束作业索引被优化。</p>
-            	<figure src="images/zh_CN/opensearchserver-history-report.PNG" alt="OpenSearchServer, history report" width="80%"/>
-             	<p>关于OpenSearchServer的详情参阅<a href="http://www.open-search-server.com/documentation">OpenSearchServer用户手册</a>。</p>
-            </section>
-            
-            <section id="esssoutputconnector">
-            	<title>ElasticSearch输出连接</title>
-            	<p>ElasticSearch输出连接,通过HTTP API将XML文档送到ElasticSearch。设计此连接器时考虑到尽量方便使用。</p>
-            	<p>选择ElasticSearch输出连接类型后,按照ElasticSearch设置输入[参数]标签项。各ElasticSearch输出连接对应着一个索引。使用一个以上索引时,请为每一个索引生成输出连接。</p>
-            	<figure src="images/zh_CN/elasticsearch-connection-parameters.png" alt="ElasticSearch, parameters tab" width="80%"/>
-            	<p>参数:</p><br/>
-            	<ul>
-            		<li>服务器地址:ElasticSearch实例的URL。缺省URL(http://localhost:8080)为当ElasticSearch和ManifoldCF运行在同一台服务器时的地址。</li>
-            		<li>索引名:连接器在指定索引生成数据。</li>
-            		<li>用户名和API键:为连接到ElasticSearch实例的用户认证信息。用户未生成时,置空。下面图像显示ElasticSearch中记载认证信息时的页面。</li>
-            	</ul>
-            	<p>在作业选择ElasticSearch输出连接,会显示[ElasticSearch]标签。此标签中可设置如下事宜:</p><br/>
-            	<ul>
-            		<li>对象文档的最大大小(字节)。缺省为16MB。</li>
-            		<li>对象MIME类型。个别存储库连接无法正常处理。</li>
-            		<li>对象文件扩展名。个别存储库连接无法正常处理。</li>
-            	</ul>
-            	<figure src="images/zh_CN/elasticsearch-job-parameters.png" alt="ElasticSearch, job parameters" width="80%"/>
-            	<p>所有活动可从历史记录报告确认。连接器支持三种活动:读取文档(生成索引),删除文档,优化索引。结束作业索引被优化。</p>
-            	<figure src="images/zh_CN/elasticsearch-history-report.png" alt="ElasticSearch, history report" width="80%"/>
-             	<p>ElasticSearch的详情参阅<a href="http://www.elasticsearch.org/guide">ElasticSearch用户手册</a>。</p>
-            </section>
-            
-            <section id="gtsoutputconnector">
-                <title>MetaCarta GTS输出连接</title>
-                <p>MetaCarta GTS输出连接类型通过HTTP API发送文档到MetaCarta GTS搜索引擎。</p>
-                <p>GTS只能处理HTML,XML,RTF,PDF,微软Office文档。不能从其它类型文档建立索引。受此限制,较大的对象外文档不会被获取。</p>
-                <p>在作业选择GTS类型输出连接,会显示两个标签:[搜集]和[文档和模版]。从这些标签设置GTS特定功能。</p>
-            </section>
-            
-            <section id="nulloutputconnector">
-                <title>Null输出连接</title>
-                <p>null输出连接,主要为存储库连接类型的开发人员而配备。很少在实际运用中使用。</p>
-                <p>Null输出连接类型只为索引及删除请求输出日志。不进行任何其它处理。Null输出连接无固有标签。</p>
-            </section>
-            
-        </section>
-        
-        <section id="authorityconnectiontypes">
-            <title>权限连接类型</title>
-            
-            <section id="adauthority">
-                <title>ActiveDirectory权限连接</title>
-                <p>ActiveDirectory权限连接,当利用MS Windows共享目录,MS SharePoint,IBM FileNet存储库设置文件权限时加以使用。使用ActiveDirectory权限连接类型时,需设置可以登录到Windows域名控制器参照其他用户ID和组关系的认证信息。虽有如下限制,使用通常的Windows安全体系结构时并无问题:</p>
-                <br/>
-                <ul>
-                    <li>存在子备注时</li>
-                    <li>请求数/秒较大时</li>
-                </ul>
-                <br/>
-                <p>选择ActiveDirectory权限连接会显示[域名控制器]标签:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/ad-configure-dc.PNG" alt="AD Configuration, Domain Controller tab" width="80%"/>
-                <br/><br/>
-                <p>输入所需项。通常在[管理员用户名]无需输入域名,根据域名控制器的构造需按[用户名@域名]格式输入。</p>
-                <p>输入后单击[保存]按钮,会显示如下设置概要和状态页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/ad-status.PNG" alt="AD Status" width="80%"/>
-                <br/><br/>
-                <p>示例页面显示因ActiveDirectory无法连接而出错。</p>
-            </section>
-            
-            <section id="ldapauthority">
-                <title>LDAP权限连接</title>
-                <p>LDAP权限连接,当没有本地文档安全模型的状況下提供文档安全时而使用。比如,包括Samba共享,Wiki页或RSS馈送等。</p>
-                <p>LDAP权限作为访问令牌使用LDAP服务器提供的用户或组名。这些访问令牌可以在,提供按作业所输入的访问令牌的存储库连接,或Samba共享用的支持明示用户/组名的JCIFS连接类型等使用。</p>
-                <p>此连接类型需输入为登录到适当LDAP服务器所需信息。为搜索用户或组的记录还需指定搜索。此权限连接类型由一个特殊LDAP标签:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/ldap-configure-ldap.PNG" alt="LDAP Configuration, LDAP tab" width="80%"/>
-                <br/><br/>
-                <p>输入要求值。注意基于服务器的域包括要搜索的LDAP域名。如域名为people.myorg.com,基于服务器的域为dc=com,dc=myorg,dc=people等。</p>
-                <p>结束后单击保存按钮。会看到如下连接概要和状态:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/ldap-status.PNG" alt="LDAP Status" width="80%"/>
-                <br/><br/>
-                <p>注意,在此样本LDAP连接不做响应,显示出错信息而非"Connection working"。</p>
-            </section>
-
-            <section id="livelinkauthority">
-                <title>OpenText LiveLink权限连接</title>
-                <p>LiveLink权限连接,用来指定从LiveLink存储库获取文档时的安全。</p>
-                <p>使用LiveLink服务器,需指定可获取用户ACL的用户认证信息。LiveLink单独管理用户。还可以通过定义映射规则或使用正则表达式把ActiveDirectory和LiveLink用户联系起来。</p>
-                <p>选择LiveLink权限连接会显示如下两个标签:[服务器]标签和[用户映射]标签。</p>
-                <p>选择[服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-authority-server.PNG" alt="LiveLink Authority, Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入LiveLinke服务器,端口,认证信息。</p>
-                <p>选择[用户映射]标签显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-authority-user-mapping.PNG" alt="LiveLink Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>从[用户映射]标签,可将用户名及域名(通常来自ActiveDirectory)信息和LiveLink联系上。映射用正则表达式定义。转换源和值用([(]和[)])括上。被括弧括上的部分称为[组]。替换字符串,由固定字符和替换组构成。比如,[$(1)]表示首个匹配组,[$(1l)]表示首个匹配小写字符。同样[$(1u)]表示大写字符的映射组。</p>
-                <p>比如,匹配条件<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>和替换字符串<code>$(2)\$(1l)</code>将ActiveDirectory用户名<code>MyUserName@subdomain.domain.com</code>对应到LiveLink用户名<code>subdomain\myusername</code>。</p>
-                <p>输入相应信息后单击[保存]按钮,会显示如下概要及状态信息:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-authority-status.PNG" alt="LiveLink Authority Status" width="80%"/>
-                <br/><br/>
-                <p>请确认内容。示例页中因LiveLink服务器无法连接而显示出错信息。</p>
-            </section>
-            
-            <section id="documentumauthority">
-                <title>EMC Documentum权限连接</title>
-                <p>Documentum权限连接,用来指定从Documentum存储库获取文档时的安全。</p>
-                <p>使用时,需指定可获取Documentum文档服务器信息和用户ACL信息的认证信息。
-还可以指定是否包含按用户列表自动生成的ACL。自动ACL针对每一个文件夹对象生成。存在很多文件夹时,随着大量的ACL返回用户的ManifoldCF访问令牌亦会增加,导致性能恶化。另外,在很多场合Documentum并不适用这些ACL。因此,在多数情况设置为忽略这些ACL也不成问题。</p>
-                <p>选择Documentum权限连接会显示如下三个标签:[Docbase],[用户映射],[系统ACL]。</p>
-                <p>选择Documentum权限连接,会显示如下[Docbase]标签:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-authority-docbase.PNG" alt="Documentum Authority, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>请输入文档服务器docbase名和认证信息。当文档服务器中ActiveDirectory没有设为有效时,请将[域名]项置为空。</p>
-                <p>选择[用户映射]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-authority-user-mapping.PNG" alt="Documentum Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>在对应所输入用户名和文档服务器用户名时可指定是否区分大小写字符。其它对应未支持此功能。在很多场合,Documentum实例和ActiveDirectory连锁,Documentum用户名和ActiveDirectory的用户名一致,或ActiveDirectory用户名只使用小写字符。详情参阅Documentum系统管理员向导。</p>
-                <p>选择[系统ACL]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-authority-system-acls.PNG" alt="Documentum Authority, System ACLs tab" width="80%"/>
-                <br/><br/>
-                <p>可指定忽略自动生成的ACL。建议先设置为忽略,根据需要改设为有效。请联系Documentum系统管理员询问正确设置。</p>
-                <p>输入后单击[保存]按钮,会显示如下概要及状态信息:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-authority-status.PNG" alt="Documentum Authority Status" width="80%"/>
-                <br/><br/>
-                <p>请确认状态,根据需要修改设置。</p>
-            </section>
-            
-            <section id="memexauthority">
-                <title>Memex Patriarch权限连接</title>
-                <p>Memem权限连接,用来指定从Memex存储库获取文档时的安全。</p>
-                <p>许指定所要连接的Memex服务器和用户的映射信息,为从Memex服务器获取用户权限信息所需的用户认证信息。</p>
-                <p>选择Memex权限连接,会显示两个标签:[Memex服务器],[用户映射]。选择[Memex服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/memex-authority-memex-server.PNG" alt="Memex Authority, Memex Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入Memex服务器,端口,获取Memex用户信息所需的用户认证信息。另,选择Memex服务器的字符编码。字符编码不明时,请咨询Memex系统管理员。</p>
-                <p>[用户映射]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/memex-authority-user-mapping.PNG" alt="Memex Authority, User Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>从[用户映射]标签,可将用户名及域名(通常来自ActiveDirectory)信息对应到Memex。对应用正则表达式定义
-转换源和值用括弧([(]和[)])括上。由括弧括上的部分成为[组]。替换字符串由固定字符和替换组构成。比如,[$(1)]指首个匹配组,[$(1l)]指首个小写字符匹配组。同样[$(1u)]指大写字符匹配组。</p>
-                <p>比如,匹配条件<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>和替换字符串<code>$(2)\$(1l)</code>,将ActiveDirectory用户名<code>MyUserName@subdomain.domain.com</code>映射到Memex用户名<code>subdomain\myusername</code></p>
-                <p>输入对应信息后单击[保存]按钮,会显示如下概要及状态信息</p>
-                <br/><br/>
-                <figure src="images/zh_CN/memex-authority-status.PNG" alt="Memex Authority Status" width="80%"/>
-                <br/><br/>
-                <p>请确认内容。示例页中因Memex服务器无法连接而发生出错信息。</p>
-            </section>
-            
-            <section id="meridioauthority">
-                <title>Autonomy Meridio权限连接</title>
-                <p>Meridio权限连接,用来指定从Meridio存储库获取文档所需的安全。</p>
-                <p>请指定所要连接文档服务器,记录服务器,用户服务的信息。亦需指定为获取用户ACL信息所需的Meridio用户认证信息。</p>
-                <p>用户服务为Meridio Authority的一部分。如使用Meridio Authority,请安装Meridio系统。
-不清楚时,请咨询Meridio服务器管理员。</p>
-                <p>选择Meridio权限连接会显示四个标签:[文档服务器],[记录服务器],[用户服务服务器],[认证]。选择[文档服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-authority-document-server.PNG" alt="Meridio Authority, Document Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入协议,服务器名,端口,Meridio文档服务器服务地址。使用代理服务器时,请输入代理服务器主机和端口号。认证代理服务器在当前版本不支持。</p>
-                <p>Meridio系统可为不同服务配备不同服务器,通常多个服务运行在同一个服务器。但是,从连接类型设置还可指定不同服务器。</p>
-                <p>选择[记录服务器]标签,会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-authority-records-server.PNG" alt="Meridio Authority, Records Server tab" width="80%"/>
-                <br/><br/>
-                <p>输入协议,服务器名,端口号,Meridio记录服务器的服务地址。使用代理服务器时,输入代理服务器主机和端口号。认证代理服务器在当前版本不受支持。</p>
-                <p>Meridio系统虽可为每一个不同的服务配备服务器,通常多个服务运行在同一个服务器。但是,从连接类型设置可指定不同的服务器。</p>
-                <p>选择[用户服务服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-authority-user-service-server.PNG" alt="Meridio Authority, User Service Server tab" width="80%"/>
-                <br/><br/>
-                <p>输入页面内容,需先安装Meridio Authorith extension。</p>
-                <p>输入协议,服务器名,端口号,Meridio用户服务服务器的服务地址。使用代理服务器时,输入代理服务器主机和端口号。当前版本不支持认证代理服务器。</p>
-                <p>Meridio系统可为不同服务配备不同的服务器,通常多个服务运行在同一个服务器。但是,从连接类型设置可指定不同服务器。</p>
-                <p>选择[认证]标签,会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-authority-credentials.PNG" alt="Meridio Authority, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>输入Meridio系统用户的认证信息。</p>
-                <p>输入完单击[保存]按钮。会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-authority-status.PNG" alt="Meridio Authority Status" width="80%"/>
-                <br/><br/>
-                <p>示例页面因Meridio权限服务器无法连接到Windows域名而出错。</p>
-                <p>Meridio使用Windows IIS认证功能。IIS及Windows域名没用正确设置时,Meridio无法正常运行。如发生问题,请咨询Meridio技术负责人。另外,还可以使用如下调试工具:</p>
-                <br/>
-                <ul>
-                    <li>Windows安全事件日志</li>
-                    <li>ManifoldCF日志(参阅下述内容)</li>
-                    <li>数据包截取器(例:WireShark)</li>
-                </ul>
-                <br/>
-                <p>需要特定ManifoldCF日志信息时,请联系ManifoldCF负责人。</p>
-            </section>
-            
-            <section id="cmisauthority">
-              <title>CMIS权限连接</title>
-              <p>CMIS权限连接,用来指定从CMIS存储库获取文档时的安全。</p>
-              <p>CMIS规格可设置相关特定文档权限时、可递归地指定。</p>
-              <p>选择CMIS权限连接,显示两个标签:[存储库],[用户映射]。选择[存储库]标签会显示如下页面:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-authority-connection-configuration-repository.png" alt="CMIS Authority, Repository configuration" width="80%"/>
-              <br/><br/>
-              <p>存储库设置只为跟踪特定CMIS存储库ID而使用。不搜索CMIS存储库。</p>
-              <br/><br/>
-              <p>从[用户映射]标签指定用户的对应关系。</p>
-              <p>选择[用户映射]标签会显示如下页面:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-authority-connection-configuration-usermapping.png" alt="CMIS Authority, User Mapping configuration" width="80%"/>
-              <br/><br/>
-              <p>从[用户映射]标签,可将来自用户名及域名(通常从ActiveDirectory)的信息和CMIS对应起来。对应由正则表达式定义。
-转换源和值用括弧([(]和[)])括上。由括弧括上的部分称为[组]。替换字符串由固定字符和替换组组成。比如,[$(1)]表示首个匹配组,[$(1l)]为首个小写字符匹配组。同样[$(1u)]为大写字符匹配组。</p>
-                <p>比如,匹配条件<code>^(.*)\@([A-Z|a-z|0-9|_|-]*)\.(.*)$</code>和替换字符串<code>$(2)\$(1l)</code>将ActiveDirectory用户名<code>MyUserName@subdomain.domain.com</code>和LiveLink用户名<code>subdomain\myusername</code>对应上。</p>
-              <p>输入对应信息后单击[保存]按钮,会显示如下概要及状态信息:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-authority-connection-configuration-save.png" alt="CMIS Authority, saving configuration" width="80%"/>
-              <br/><br/>
-            </section>
-            
-        </section>
-        
-        <section id="repositoryconnectiontypes">
-            <title>存储库连接类型</title>
-
-            <section id="filesystemrepository">
-                <title>通用文件系统存储库连接</title>
-                <p>通用文件系统存储库连接类型主要为例题,演示,测试工具而开发。生成ManifoldCF所安装服务器的本地文件的索引。但是,不能设置权限。</p>
-                <p>文件系统存储库连接类型没有固有标签。但是,从性能考虑请将[限流器链接]标签的[最大连接/JVM]值设为每一个工作线程至少一个或30。</p>
-                <p>作业定义中的文件系统类型存储库</p>
-                <p>从[跳过滤器]标签,可指定获取文件的子目录深度。虽文件系统或许会很少使用此设置,但此设置还可为Web连接类型指定。在文件系统可确认该设置是否运行。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/filesystem-job-hopcount.PNG" alt="File System Connection, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>在文件系统连接类型,文档間关系仅限于一个[子]。可为获取文档对象的子目录设置从根目录深度。空白时,过滤器视为无效。</p>
-                <p>在同一页,还可指定当文档所在子目录深度发生变化时的动作。如选择[删除无法读取的文档],如发现变化,会重新计算所有相关文档的深度。重计算会增加服务器的负荷。如不需重新计算,可设为临时无效或永久无效。如选择永久会删除信息。</p>
-                <p>如选择[路径]标签,显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/filesystem-job-paths.PNG" alt="File System Connection, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>可从此页设置读取文档的路径。输入路径单击[添加]按钮,路径会添加到列表。输入路径请遵循ManifoldCF所运行的OS的格式。</p>
-                <p>每一个根路径,存在判断文档是否包含在作业中的规则。还可以在添加根路径到列表之后定义规则。每一个规则里可指定,匹配条件式,是否将文件或目录作为对象的标志,匹配时是包含还是排除文档。规则从上到下加以评价。首先使用文件名的匹配规则。为添加规则,从下拉菜单选择类型,并输入匹配条件(例:*.txt)。输入后单击[添加]按钮。</p>
-            </section>
-            
-
-            <section id="rssrepository">
-                <title>通用RSS存储库连接</title>
-                <p>RSS连接类型用来从RSS馈送生成索引。还可以使用Web连接类型从RSS馈送生成索引,RSS连接类型有以下功能:</p>
-                <br/>
-                <ul>
-                    <li><b>仅</b>从馈送提取链接</li>
-                    <li>不会从馈送本身生成索引</li>
-                    <li>可详细设置重获馈送条件。另,可用不同方法处理通常文档</li>
-                    <li>RSS连接类型可以将特定数据作为元数据从馈送附加在文档</li>
-                </ul>
-                <br/>
-                <p>在很多场合,使用RSS连接类型的作业会连续执行,设为不重读取文档,30天后文档失效。此设置经常在新闻的RSS馈送生成索引时使用。</p>
-                <p>RSS连接有四个固有标签:[邮箱],[机器人],[带宽],[代理服务器]。选择[邮箱]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-configure-email.PNG" alt="RSS Connection, Email tab" width="80%"/>
-                <br/><br/>
-                <p>请输入邮箱地址。所输入的邮箱地址,会包含在RSS连接的所有请求,可由服务器管理员参阅。如果限流器链接设置过大而服务器负荷过大时,服务器管理员会利用此邮箱地址进行联络。</p>
-                <p>此项目为必填。虽RSS连接不验证邮箱地址,作为网民请输入正确地址。另,服务器管理员可以改变设置排除[恶意]请求,所以设置限流器链接时还请考虑对方的服务器。</p>
-                <p>选择[机器人]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-configure-robots.PNG" alt="RSS Connection, Robots tab" width="80%"/>
-                <br/><br/>
-                <p>从下拉菜单列表选择如何处理robots.txt。同时还请考虑对方服务器。</p>
-                <p>选择[带宽]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-configure-bandwidth.PNG" alt="RSS Connection, Bandwidth tab" width="80%"/>
-                <br/><br/>
-                <p>每一个服务器可设置一个连接获取数据时的<b>最大</b>传输率以及每一个服务器在每一分钟内的<b>最大</b>传输率。还可指定每一个服务器的最大套接字连接数。</p>
-                <p>设置例中的值为<b>宽松</b>的设置。注意在缺省下所有设置为空。此缺省设置下,限流器链接设置为空,会给服务器增加负荷。</p>
-                <p>[限流器链接组]用来将多个RSS类型连接的限流器链接设置集中在一起。具有相同链接组名的RSS类型连接会管理在同一个限流器链接池。</p>
-                <p>[带宽]标签和[限流器链接]标签有如下区别:</p>
-                <br/>
-                <ul>
-                    <li>从[带宽]标签设置<b>最大</b>值。而从[限流器链接]标签设置<b>平均</b>值。</li>
-                    <li>从[带宽]标签无法设置文档如何调度到队列。只用来延迟向队列的调度链接。即使在此等待时间也会使用线程。[限流器链接]标签因进行文档作业的调度链接,所以不会因等待时间而浪费线程。</li>
-                </ul>
-                <br/>
-                <p>由上述理由,建议<b>同时</b>设置RSS连接的[带宽]标签和[限流器链接]标签。在[带宽]标签设置最大传输率,在[限流器链接]标签平均传输率。RSS连接的文档ID为文档的URL。URL的bin名为服务器名。还有,[最大连接数/JVM]缺省为10。此值有时不适合于RSS连接类型。故建议为每一个工作线程配备连接。工作线程数缺省为30,建议将[最大连接数/JVM]设为30。</p>
-                <p>如使用代理服务器,从[代理服务器]标签输入代理服务器信息。RSS连接类型支持NTLM认证代理服务器。选择[代理服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-configure-proxy.PNG" alt="RSS Connection, Proxy tab" width="80%"/>
-                <br/><br/>
-                <p>在[代理服务器主机]输入代理服务器服务器地址。在[代理服务器端口]输入代理服务器的端口号。需要认证时,请输入域名,用户名,密码。不使用代理服务器时,请将代理服务器的所有相关项目置为空。</p>
-                <p>输入信息后[保存]</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-status.PNG" alt="RSS Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>在作业选择RSS连接类型,显示如下标签:[URL],[正规化],[映射],[时间],[安全],[元数据],[索引对象]。从[URL]标签指定作业对象RSS馈送信息。选择[URL]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-urls.PNG" alt="RSS job, URLs tab" width="80%"/>
-                <br/><br/>
-                <p>请输入要读取RSS馈送的URL,多个URL用换行符分隔。输入备注时,在行头输入[#]字符。</p>
-                <p>从[正规化]标签指定作业如何处理URL正规化。有时同一文档会附上不同URI。[正规化]功能,用来将这些URL视为同一个URI。比如,URI参数顺序不同也视为相同文档: <code>a=1&amp;b=2</code>和<code>b=2&amp;a=1</code>指同一个文档。另外,还可以指定URI里有无会话cookie信息。</p>
-                <p>选择[正规化]标签,会显示下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-canonicalization.PNG" alt="RSS job, Canonicalization tab" width="80%"/>
-                <br/><br/>
-                <p>显示正规化规则列表。各规则由正则表达式(搜索对象URI)和条件项目构成。条件项目可指定有无参数顺序,会话cookie信息的排除等。可排除如下会话cookie信息:JSP(Java应用服务器),ASP(.NET),PHP,Broadvision(BV)。</p>
-                <p>规则和多个规则相匹配时,使用首个匹配规则。</p>
-                <p>添加规则,输入正则表达式,在条件项目打勾,单击[添加]按钮。</p>
-                <p>从[映射]标签可修改获取文档的URI。比如当获取企业内部网的文档时,可利用与一般用户不同的URI爬取文档。选择[映射]标签显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-mappings.PNG" alt="RSS job, Mappings tab" width="80%"/>
-                <br/><br/>
-                <p>从[映射]标签可使用与ManifoldCF其它标签相同的正则表达式机制设置替换字符串。映射由规则构成。各规则由正则表达式的匹配式构成。转换源和值由括弧([(]和[)])括上。由括弧括上的部分称为[组]。替换字符串,由固定字符和替换组构成。比如,[$(1)]为首个匹配组,[$(1l)]为首个小写字符匹配组。同样[$(1u)]为大写字符匹配组。</p>
-                <p>比如,规则<code>http://(.*)/(.*)/</code>和替换字符串<code>http://$(2)/</code>,将<code>http://Server/Folder_1/Filename</code>替换成<code>http://Folder_1/Filename</code>。</p>
-                <p>存在一个以上规则时,从上往下执行,上方规则的结果由下方规则覆盖。</p>
-                <p>添加规则,输入匹配条件和输出字符串并单击[添加]按钮。</p>
-                <p>选择[时间]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-time-values.PNG" alt="RSS job, Time Values tab" width="80%"/>
-                <br/><br/>
-                <p>输入要设置的时间限制值。下面是项目说明:</p>
-                <table>
-                    <tr><td><b>值</b></td><td><b>说明</b></td></tr>
-                    <tr><td>馈送超时</td><td>服务器连接等待时间(秒)</td></tr>
-                    <tr><td>缺省馈送重获时间</td><td>馈送未设重获时间时所使用的时间(分)</td></tr>
-                    <tr><td>最小重获时间</td><td>不考虑馈送设置时间,比设置时间还要短的时间内不重获馈送的时间(分)</td></tr>
-                    <tr><td>错误馈送重获时间</td><td>重获解析错误馈送的等待时间(分,置空为无限)</td></tr>
-                </table>
-                <p>从[安全]标签,可以设置作业使用的认证信息。使用前,需决定所使用的权限连接。选择[安全]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-security.PNG" alt="RSS job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>添加访问令牌,输入访问令牌值并单击[添加]按钮。无访问令牌时,作业安全视为无效。</p>
-                <p>从[元数据]标签,可以指定附上作业中所有文档的索引上的元数据。RSS连接类型文档,按如下标准附上元数据:</p>
-                <table>
-                    <tr><td><b>名称</b></td><td><b>说明</b></td></tr>
-                    <tr><td>PubDate</td><td>文档生成时间(从1970年1月1日经过的毫秒)。无法获取生成日期时,使用文档的获取时间。</td></tr>
-                    <tr><td>Source</td><td>文档名称。</td></tr>
-                    <tr><td>Title</td><td>馈送内文档标题。</td></tr>
-                    <tr><td>Category</td><td>馈送内文档种类。</td></tr>
-                </table>
-                <p>可从[元数据]标签添加任意元数据。选择[元数据]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-metadata.PNG" alt="RSS job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>输入元数据名和值,单击[添加]按钮添加到列表。</p>
-                <p>从[索引对象]标签,可指定从馈送概要生成索引而非文档。这可以在内容为象链接列表的馈送,馈送概要生成索引。选择[索引对象]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/rss-job-dechromed-content.PNG" alt="RSS job, Dechromed Content tab" width="80%"/>
-                <br/><br/>
-                <p>请选择连接所使用的模式。</p>
-            </section>
-            
-            <section id="webrepository">
-                <title>通用Web存储库连接</title>
-                <p>Web连接类型是指Web爬虫。支持基本认证,NTLM认证,会话认证。可以处理如下文档:</p>
-                <br/>
-                <ul>
-                    <li>文本</li>
-                    <li>HTML</li>
-                    <li>通用XML</li>
-                    <li>RSS馈送</li>
-                </ul>
-                <br/>
-                <p>Web连接类型和RSS连接类型相比,在以下功能有不同点:</p>
-                <br/>
-                <ul>
-                    <li>输出连接收到馈送时,从馈送生成索引。</li>
-                    <li>从所有文档提取链接。</li>
-                    <li>馈送的处理和其它文档相同-不能仅对一个设置重获取设置。</li>
-                    <li>可配备跳数限制。</li>
-                    <li>可放进URI集或从中排除。</li>
-                </ul>
-                <br/>
-                <p>Web连接类型设置比RSS连接类型还要复杂,无法进行RSS馈送的详细设置。所以,建立RSS索引时,建议使用RSS连接类型。</p>
-                <p>使用Web连接类型的多数作业,会持续执行,设置为要么定期重获文档,要么仅获一次文档不再获取,经过指定期间后变为无效。</p>
-                <p>选择Web连接类型会显示如下标签:[邮箱],[机器人],[带宽],[认证],[证书]。选择[邮箱]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-email.PNG" alt="Web Connection, Email tab" width="80%"/>
-                <br/><br/>
-                <p>请输入邮箱地址。所输入的邮箱地址,会包含在RSS连接的所有请求,可由服务器管理员参阅。如果限流器链接设置过大而服务器负荷过大时,服务器管理员会利用此邮箱地址进行联络。</p>
-                <p>此项目为必填。虽RSS连接不验证邮箱地址,作为网民请输入正确地址。另,服务器管理员可以改变设置排除[恶意]请求,所以设置限流器链接时还请考虑对方的服务器。</p>
-                <p>选择[机器人]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-robots.PNG" alt="Web Connection, Robots tab" width="80%"/>
-                <br/><br/>
-                <p>从下拉菜单列表选择如何处理robots.txt。同时还请考虑对方服务器。</p>
-                <p>从[带宽]标签可设置带宽规则列表。每一个规则指定用来选择URL限流器bin的正则表达式。Web类型的限流器ルbin为URI的服务器名。每一个规则可指定最大带宽,连接数,读取率。可以生成任意数量的规则。若URL匹配于多个规则,会使用最为保守的规则。</p>
-                <p>选择[带宽]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-bandwidth.PNG" alt="Web Connection, Bandwidth tab" width="80%"/>
-                <br/><br/>
-
-                <p>设置例的值设得较为<b>和善</b>。注意缺省状态下所有设置为空白。此缺省设置下,无限流器链接,从而会加大服务器负荷带来影响。</p>
-
-                <p>添加规则,输入正则表达式和限制值单击[添加]按钮。</p>
-                <p>[带宽]标签和[限流器链接]标签有如下不同:</p>
-                <br/>
-                <ul>
-                    <li>从[带宽]标签可设置<b>最大</b>值。可从[限流器链接]标签设置<b>平均</b>值。</li>
-                    <li>从[带宽]标签不能设置文档如何调度到队列。只会延迟队列调度。此等待时间内线程仍可使用。[限流器链接]标签用来调度文档作业,不会应等待时间而浪费线程。</li>
-                </ul>
-                <br/>
-                <p>由上述理由,在RSS连接建议同时设置[带宽]和[限流器链接]<b>两个</b>标签。最大传输率在[带宽]标签设置,平均传输率在[限流器链接]标签设置。RSS连接的文档ID为文档URL。URL的bin名为服务器名。还有,[最大连接数/JVM]缺省为10。此值,对RSS连接类型而言很有可能并非是最佳值。建议为每一个工作线程配备一个连接。缺省工作线程数为30,故推荐将[最大连接数/JVM]设置为30。</p>
-                <p>从Web连接[认证]标签可指定页面认证方法。支持页面认证(例:基本认证,NTLM认证)及会话认证(登录会话)。[认证]标签的首页显示这两种认证方法:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-access-credentials.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>可按认证方法配备规则列表。</p>
-                <p>设置页面认证时,指定认证所需的URI,认证方法和其用户/密码。输入这些项目后单击[添加]按钮。</p>
-                <p>设置会话认证时,需要些许检查。受会话保护的每一个网站或许需要配备会话认证规则。每一个网站需要如下信息:</p>
-                <br/>
-                <ul>
-                    <li>受会话安全保护的页面的URI。</li>
-                    <li>登录处理中获取页面的手续。</li>
-                    <li>在登录页面登录信息时的输入方法。</li>
-                </ul>
-                <br/>
-                <p>Web连接将登录处理中的页面称为[login pages],受保护的页面称为[content pages]。Web连接不生成登录页索引。因为登录页仅用来输入认证信息而不包含文档信息。</p>
-                <p>另外,还需考虑初次访问网站或因会话切断而需登录时如何获取文档。两种情况,均需适用会话认证规则来获取文档。ManifoldCF框架里无法控制何时获取文档或重新获取。</p>
-                <p>根据登录页URI及有特征的的内容显示登录页。比如,有些网站当会话无效时会重返登录页。此时,会获取重回登录页的信息,而非获取文档。一般来说,登录页及重定向信息和文档区別开来不生成索引。此时,登录三个登录信息:一个是登录页的重定向,另一个为登录页URL,最后一个为登录表单的发送目标。在登录页设置登录信息加以发送。</p>
-                <p>Web连接可将如下内容视为登录页:</p>
-                <br/>
-                <ul>
-                    <li>特定URI(匹配正则表达式)的重定向</li>
-                    <li>指定名称(匹配正则表达式)表单(FORM)的存在页</li>
-                    <li>包含向特定页的链接(匹配正则表达式)的页面</li>
-                </ul>
-                <br/>
-                <p>添加会话认证规则时,输入确定受保护页的正则表达式单击[添加]按钮。显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-access-credentials-session.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>在新生成的规则可输入登录页信息。输入登录页信息,URI正则表达式,登录页类型,目标链接或表单名正则表达式,单击[添加]按钮。</p>
-                <p>添加[表单]型登录页时,可在如下表单输入登录信息:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-access-credentials-session-form.PNG" alt="Web Connection, Access Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>请设置表单项目的输入值。不显示输入内容时,在[密码]列输入而不是[值]列。表单项目名可通过显示登录页HTML源代码来调查。输入后单击[添加]按钮。</p>
-                <p>未指定的表单项目被设为登录页的缺省值。当前版本不支持Javascript。在登录表单使用Javascript时,请事先计算脚本语言的结果登録之。包含复杂的Javascript时,寻找设置值有时需要很长时间。</p>
-                <p>多个登录页表单是网站的[登录页步骤]。Web连接,每一个登录页通过登录页条件决定下一个获取内容。比如,重定向到特定URI时,获取重定向URI。表单的话,通过表单action获取指定页。指向目标的链接时,获取目标URI。最后的登录页手順,获取在Web连接开始登录步骤之前应获取的页面。</p>
-                <p>调试会话认证时,建议参照Web连接的简易历史记录报告。可通过Web连接的事件历史记录了解大体的运行状况。存在如下事件:</p>
-                <br/>
-                <table>
-                    <tr><td><b>事件类型</b></td><td><b>说明</b></td></tr>
-                    <tr><td>Fetch</td><td>获取URI的历史记录。HTTP的返回值记录为相应代码。HTTP处理失败或不完整时事件记录为负值。</td></tr>
-                    <tr><td>Begin login</td><td>执行登录步骤时被记录。执行登录步骤时,直到登录结束为止无法从受保护网站获取文档。</td></tr>
-                    <tr><td>End login</td><td>从登录步骤手順回到获取元文档时被记录。回到获取元文档时,和网站并行重新获取文档。</td></tr>
-                </table>
-                <br/>
-                <p>[证书]标签和SSL一起使用,设置可信赖正则表达式和匹配URI的证书信息。还可以信任所有证书。选择[证书]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-configure-certificates.PNG" alt="Web Connection, Certificates tab" width="80%"/>
-                <br/><br/>
-                <p>输入URI正则表达式,选择[信任所有]复选框,或参阅证书。(虽可以信任服务器证书,但有时证书会过期)。添加证书到列表时单击[添加]按钮。</p>
-                <p>输入后单击[保存]按钮,将显示如下设置内容的概要:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-status.PNG" alt="Web Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>在作业当选择Web类型存储库连接,会显示标签:[跳过滤器],[种子],[正规化],[包含],[排除],[安全],[元数据]。</p>
-                <p>从[跳过滤器]标签,可以指定从种子文档的最大跳数。Web类型连接有两种跳数:[链接]跳[重定向]跳。每一个跳类型可设置最大数。置空时,视为无限。</p>
-                <p>比如,将最大[链接]跳数设为5,[重定向]跳数置为空,从种子文档的跳数超过5的文档被排除在外。最大[链接]跳数设为5,最大[重定向]跳数为2时,从种子文档的跳数超过5跳<b>且</b>重定向跳数超过2的文档被排除在外。</p>
-                <p>选择[跳过滤器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-hop-filters.PNG" alt="Web Job, Hop Filters tab" width="80%"/>
-                <br/><br/>
-                <p>此页可指定当从根的文档跳数改变时的动作。如选择[删除无法读取的文档],当发现变化时,会重新计算所有相关文档的深度。重计算会增加服务器的负荷。如不需重新计算,可设为临时无效或永久无效。如选择永久会删除信息。</p>
-                <p>从[种子]标签指定开始爬取的邮箱文档。选择[种子]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-seeds.PNG" alt="Web Job, Seeds tab" width="80%"/>
-                <br/><br/>
-                <p>请将种子分行输入。空行及始于[#]的行被忽略。</p>
-                <p>从[正规化]标签还可输入将URI转换为标准格式的规则。选择[正规化]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-canonicalization.PNG" alt="Web Job, Canonicalization tab" width="80%"/>
-                <br/><br/>
-                <p>显示正规化规则列表,各规则由正则表达式(搜索对象URI)和条件项构成。条件项还可指定有无参数顺序或排除会话cookie信息等。可排除如下会话cookie信息:JSP(Java应用服务器),ASP(.NET),PHP,Broadvision(BV)。</p>
-                <p>规则匹配多个规则时,使用第一个匹配规则。</p>
-                <p>添加规则时,输入正则表达式,选择条件项的复选框,单击[添加]按钮。</p>
-                <p>从[包含]标签指定包含在Web作业的URI正则表达式列表。选择[包含]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-inclusions.PNG" alt="Web Job, Inclusions tab" width="80%"/>
-                <br/><br/>
-                <p>请将0以上正则表达式分行指定。</p>
-                <p>Web作业在缺省情况下,包含和种子链接的互联网上<b>所有</b>文档。</p>
-                <p>如要限制对象文档,从[排除]标签指定。选择[排除]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-exclusions.PNG" alt="Web Job, Exclusions tab" width="80%"/>
-                <br/><br/>
-                <p>请将0以上正则表达式分行指定。建议排除无法生成索引的文档,或无需索引的文档。比如动画或视频等无法生成索引的文档应排除在外。</p>
-                <p>可从[安全]标签为Web作业要建立索引的文档指定访问令牌。选择[安全]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-security.PNG" alt="Web Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>向文档添加安全之前,需要访问令牌格式信息。输入访问令牌并单击[添加]按钮。</p>
-                <p>可从[元数据]标签向文档附上元数据。选择[元数据]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/web-job-metadata.PNG" alt="Web Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>输入要设置元数据名和值并单击[添加]按钮。</p>
-            </section>
-
-
-            <section id="jcifsrepository">
-                <title>Windows Share/DFS存储库连接</title>
-                <p>Windows共享连接类型,用来为Windows共享文件夹中的文档建立索引。还可从Windows以外OS系统使用。支持Samba或第三方NAS服务器。</p>
-                <p>支持所有DFS节点和参照。但前提是,所参照服务器名必须可从ManifoldCF安装服务器所使用的DNS访问。Windows共享连接,为每一个文档生成索引ID。索引ID为[file:]IRI或[http:]URI。可灵活配置环境,但设置需要些许时间。特别是使用文件IRI时,请确认系统搜索组件是否正确配置。从象Internet Explorer的Web浏览器阅读Windows文件系统文档,将象<code>\\servername\sharename\dir1\filename.txt</code>的地址转换为<code>file://///servername/sharename/dir1/filename.txt</code>IRI。貌似简单,但文件名包含空白,[#],英数以外字符时变为复杂。根据Internet Explorer版本会出现不同处理方法,故转换Windows共享文件路径为IRI的方法也并不唯一。理想的做法是,连接中使用标准正规化地址,系统为Web浏览器及客户端通过正确的方法转换索引结果。</p>
-                <p>在具有权限的Windows共享存储库连接爬取文档时,请事先生成ActiveDirectory权限连接器。</p>
-                <p>Windows共享连接在存储库连接编辑页有一个固有标签:[服务器]标签。选择[服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-configure-server.PNG" alt="Windows Share Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入连接服务器名。服务器名,可以指定实际服务器名或域名(当连接到Windows域DFS根时)。输入实际服务器名时,服务器名输入未修饰名,[域名]输入完整修饰域名。用户名输入未修饰名(例:不是[Administrator@mydomain.com],而是[Administrator])。有时[域名]值为空,[服务器]输入完整修饰服务器名。但是,不要<b>同时</b>输入域名和完整修饰服务器名。</p>
-                <p>"Use SIDs"选择框,控制连接是否将SIDs使用为访问令牌(这适用于受Active Directory安全控制的Windows服务器或NAS服务器等),或是否使用用户/组名(适用于和Samba服务器,LDAP权限连接类型连动起来使用LDAP的CIFS服务器)。使用SIDs请打勾。</p>
-                <p>为减轻服务器方的负荷,推荐[限流器链接]标签的[最大连接数/JVM]修改为少于缺省值10。Windows的多线程性能并不高。设置为5以下其获取性能不会有太大变化。</p>
-                <p>输入后单击[保存]按钮。显示如下设置概要:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-status.PNG" alt="Windows Share Status" width="80%"/>
-                <br/><br/>
-                <p>画面示例,Windows共享连接因服务器无法连接而出错。</p>
-                <p></p>
-                <p>作业中选择Windows共享类型,会显示如下标签:[路径],[安全],[元数据],[Content Length],[文件映射],[URL映射]。</p>
-                <p>选择[路径]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-job-paths.PNG" alt="Windows Share Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>指定从此页的起点路径,添加生成路径,可以从现有路径列表删除路径。不指定起点路径,作业不会拥有对象文档。</p>
-                <p>确认连接状态为[起動]。出错时,路径不会生成。</p>
-                <p>针对所包含的每一个路径,显示为确定作业的对象文件夹及文档的规则列表。规则从上而下加以评价。使用首个匹配规则。</p>
-                <p>各规则指定用来确定路径的条件。各规则包括指定,文件名条件(例:[*.txt]),是否确定文件或文件夹名,是否在输出连接从文件建立索引,是否包含文件等。文件名指定还可以使用通配符[*]和[?]。[*]和0或0以上任意字符相匹配。[?]和任意1字符匹配。其它字符需按定义匹配。</p>
-                <p>添加起点路径规则时,从下拉菜单选择值,输入文件选择条件,并单击[添加]按钮。在现有规则上添加规则时单击[插入]按钮。</p>
-                <p>选择[安全]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-job-security.PNG" alt="Windows Share Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>从[安全]标签可设置下述3功能:文件安全,共享安全,作业中生成索引的所有文档的安全令牌(安全设为无效时)。</p>
-                <p><b>文件安全</b>,Windows运用在各文件的安全。
-在几乎所有Windows兼容的NAS类型服务器。</p>
-                <p><b>共享安全</b>是指,Windows在Windows共享文件夹使用的安全。这是较旧的安全机制,使用此安全的用户越来越少。最新NAS系统或Samba有时未被支持。在不支持Windows共享安全的系统中此连接器无法正常使用。试图获取文档会发生错误,作业会中断。</p>
-                <p>如文件安全设为无效,可以向作业所爬取的所有文档添加索引访问令牌。但是此令牌需和服务器令牌相匹配。输入令牌单击[添加]按钮。此功能除了演示很少被使用。</p>
-                <p>选择[元数据]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-job-metadata.PNG" alt="Windows Share Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>设置可将由正则表达式转换而成的文档路径作为文档元数据加以获取。输入元数据名到[路径属性名]后,添加规则到规则列表。各规则由相应正则表达式构成。转换源和值由括弧([(]和[)])括上。由括弧括上的部分称为[组]。替换字符串由固定字符和替换组构成。比如,[$(1)]表示首个匹配组,[$(1l)]表示首个小写字符匹配组。同样[$(1u)]表示大写字符匹配组。</p>
-                <p>比如,规则<code>http://(.*)/(.*)/</code>和替换字符串<code>http://$(2)/</code>,将<code>http://Server/Folder_1/Filename</code>置换成<code>http://Folder_1/Filename</code>。</p>
-                <p>如存在一个以上规则,从上往下执行,上方规则结果由下方规则覆盖。</p>
-                <p>选择[Content Length]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-job-content-length.PNG" alt="Windows Share Job, Content Length tab" width="80%"/>
-                <br/><br/>
-                <p>为使作业不生成长文档,可指定文档处理的最大长度。超过指定长的文档,在指定长度被切断。请输入最大长度。如不设最大长度时,请置空。</p>
-                <p>选择[文件映射]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-job-file-mapping.PNG" alt="Windows Share Job, File Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>文件映射的设置和路径属性映射相同。文件映射将转换实际的文件路径。使用于当元文档和提取数据间需要转换的情况。</p>
-                <p>选择[URL映射]标签显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jcifs-job-url-mapping.PNG" alt="Windows Share Job, URL Mapping tab" width="80%"/>
-                <br/><br/>
-                <p>URL映射的设置和路径属性映射相同。映射不存在时,文件路径转换为标准文件IRI。映射存在时,作为前提应能转换为通过Windows共享HTTP服务器获取的正确URI。</p>
-
-            </section>
-
-            <section id="wikirepository">
-                <title>Wiki存储库连接</title>
-                <p>Wiki存储库连接类型,用来从Wiki及MediaWiki网站的文档生成索引。Wiki存储库连接类型通过Wiki API获取文档。仅从一般公开的内容生成索引,无需认证设置。</p>
-                <p>在存储库编辑页,选择Wiki连接,显示[服务器]标签。选择[服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/wiki-configure-server.PNG" alt="Wiki Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>协议可从[协议]下拉列表选择。当前版本只支持[http]协议。输入服务器名到项目[服务器名],端口号到项目[端口]。最后,输入Wiki的URI到项目[路径名]。URI的头字符应为[/]。</p>
-                <p>当前版本不存在作业的存储库连接不存在Wiki类型固有标签。</p>
-            </section>
-            
-            <section id="jdbcrepository">
-                <title>通用数据库存储库连接</title>
-                <p>通用数据库连接类型从下述数据库表格内容生成索引:</p>
-                <br/>
-                <ul>
-                    <li>Postgresql (Postgresql JDBC驱动程序)</li>
-                    <li>SQL Server (JTDS JDBC驱动程序)</li>
-                    <li>Oracle (Oracle JDBC驱动程序)</li>
-                    <li>Sybase (JTDS JDBC驱动程序)</li>
-                    <li>MySQL (MySQL JDBC驱动程序)</li>
-                </ul>
-                <br/>
-                <p>如使用其它数据库<b>需要修改</b>软件。根据数据库的设置,无法使用某些数据库。</p>
-                <p>通用数据库连接类型不支持文档単位的安全。但是,可以按作业指定所有文档的安全。设置需要访问令牌。</p>
-                <p>从存储库连接编辑页选择通用数据库连接,看到三个标签:[数据库类型],[服务器],[认证]。选择[数据库类型]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jdbc-configure-database-type.PNG" alt="Generic Database Connection, Database Type tab" width="80%"/>
-                <br/><br/>
-                <p>请从下拉菜单选择建立索引的数据库类型。</p>
-                <p>还有,从下拉菜单选择JDBC访问方式。此访问方式遵循JDBC规格,而获取列名方法在各个JDBC驱动程序会有所不同。目前,"by name"选项可运行在除MySQL驱动程序在外的的列表内所有JDBC驱动程序。"by label"可运行于现在的MySQL驱动程序,或许亦可运行在其它驱动程序。当通用数据库的作业中定义的查询非正常运行时,或显示无法找到列的出错信息时,或许通过改变此下拉菜单得以解決。</p>
-                <p>选择[服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jdbc-configure-server.PNG" alt="Generic Database Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>输入服务器名和端口号到项目[数据库主机和端口]。比如,Oracle数据库的缺省端口号是1521,可输入[my-oracle-server:1521]。Postgresql的缺省端口号为5432,应输入[my-postgresql-server:5432]。SQL Server的缺省端口号为1433,输入[my-sql-server:1433]。</p>
-                <p>服务名及实例名请输入所使用数据库的实例名。Oracle及Postgresql,输入数据库名。SQL Server输入[my-instance-name/my-database-name]。使用SQL Server缺省实例时,只输入数据库。</p>
-                <p>选择[认证]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jdbc-configure-credentials.PNG" alt="Generic Database Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>请输入连接数据库所需的用户认证信息。</p>
-                <p>输入后单击[保存]按钮。会显示如下设置内容概要页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jdbc-status.PNG" alt="Generic Database Status" width="80%"/>
-                <br/><br/>
-                <p>画面示例中通用数据库连接因无法连接到数据库而出错。</p>
-                <p></p>
-                <p>作业的存储库连接中选择通用数据库连接类型,会显示[查询]和[安全]标签。</p>
-                <p>选择[查询]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/jdbc-job-queries.PNG" alt="Generic Database Job, Queries tab" width="80%"/>
-                <br/><br/>
-                <p>需至少设置两个查询(从第三个查询为任意)。基于这些查询,从数据库获取文档。输入查询之前,先决定如何将数据库结构联系到ManifoldCF框架结构。</p>
-                <br/>
-                <ul>
-                    <li>获取在某时间段发生添加及更改的文档ID列表(参阅下述内容)。</li>
-                    <li>从文档ID获取版本信息(参阅下述内容)。</li>
-                    <li>从文档ID和版本信息获取文档信息。文档信息由文档内容,URI,元数据构成。</li>
-                </ul>
-                <br/>
-                <p>ManifoldCF使用ID识别存储库连接内的所有文档。此ID将成为获取文档时的主键。在作业的通用数据库类型中所使用的数据库也需类似的概念。错误选择ID,会导致处理变慢。</p>
-                <p>需获取在某时间段的所有更新文档ID列表。也可添加未更新文档的ID到列表,但并非最适。</p>
-                <p>设置为添加文档时,还要设置[版本信息]。利用此字符串检查文档是否修改过。更改索引时,此版本信息亦需变化。(因其它原因发生变化也不成问题。)</p>
-                <p>连接中使用所输入的查询之前,首先将查询中的替换字符串转变为实际值。缺省状态下被输入的查询使用典型的替换字符串。比如,[$(IDCOLUMN)]被替换成连接使用的ID字段名。其它替换字符串如下所示:</p>
-                <br/>
-                <table>
-                    <tr><td><b>名称</b></td><td><b>说明</b></td></tr>
-                    <tr><td>IDCOLUMN</td><td>包含文档ID的结果集的列</td></tr>
-                    <tr><td>VERSIONCOLUMN</td><td>包含版本信息的结果集的列</td></tr>
-                    <tr><td>URLCOLUMN</td><td>包含URI的结果集的列</td></tr>
-                    <tr><td>DATACOLUMN</td><td>包含文档数据的结果集的列</td></tr>
-                    <tr><td>STARTTIME</td><td>开始时间。从1970年1月1日的经过时间(毫秒)</td></tr>
-                    <tr><td>ENDTIME</td><td>结束时间。从1970年1月1日的经过时间(毫秒)</td></tr>
-                    <tr><td>IDLIST</td><td>由括弧括上的文档ID列表</td></tr>
-                </table>
-                <br/>
-                <p>注意,当生成包含时间替换字符串的查询时,[$(STARTTIME)]和[$(ENDTIME)]被替换成从1970年1月1日所经过时间的毫秒值。建议将[$(STARTTIME)]和[$(ENDTIME)]替换成系统时间。</p>
-                <p>下面是将[$(STARTTIME)]和[$(ENDTIME)]转换为其它格式的日期和时间的样本查询部分。首列为查询语句支持的SQL数据库。第2列为查询输出数据类型。第3列为,[$(STARTTIME)]的使用例。这些是查询的例子。当所更改的数据类型不同于第2列数据类型时,会无法正确比較日期。</p>
-                <br/>
-                <table>
-                    <tr><td><b>数据库</b></td><td><b>类型</b></td><td><b>查询样本</b></td></tr>
-                    <tr><td>Oracle</td><td>date</td><td><code>TO_DATE ( '1970/01/01:00:00:00', 'yyyy/mm/dd:hh:mi:ss') + ROUND ($(STARTTIME)/86400000)</code></td></tr>
-                    <tr><td>Oracle</td><td>timestamp</td><td><code>TO_TIMESTAMP('1970-01-01 00:00:00') + interval '$(STARTTIME)/1000' second</code></td></tr>
-                    <tr><td>Postgres SQL</td><td>timestamp</td><td><code>date '1970-01-01' + interval '$(STARTTIME) milliseconds'</code></td></tr>
-                    <tr><td>MS SQL Server ($>$6.5)</td><td>datetime</td><td><code>DATEADD(ms, $(STARTTIME), '19700101')</code></td></tr>
-                    <tr><td>Sybase (10+)</td><td>datetime</td><td><code>DATEADD(ms, $(STARTTIME), '19700101')</code></td></tr>
-                </table>
-                <br/>
-                <p>当生成使用通用数据连接的作业时,作业的查询中已输入样本查询。查询返回列请参考此。在很多场合,仅样本的返回列就已足够。但是,文件数据查询时会返回其它列。此时,列值作为文档的元数据传到索引。元数据名将成为结果集列名。</p>
-                <p>在[安全]标签,向通用数据库作业中所生成索引的文档添加访问令牌。被添加的令牌决定使用哪一个权限连接,并依赖于此权限连接的访问令牌。选择[安全]标签会显示如下页面:</p>
-                <br/>
-                <br/>
-                <figure src="images/zh_CN/jdbc-job-security.PNG" alt="Generic Database Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>选择访问令牌,并选择[添加]按钮。还可设置多个访问令牌。</p>
-            </section>
-
-            <section id="filenetrepository">
-                <title>IBM FileNet P8存储库连接</title>
-            </section>
-            
-            <section id="documentumrepository">
-                <title>EMC Documentum存储库连接</title>
-                <p>EMC Documentum连接类型,用来从Documentum Content Server实例文档生成索引。可通过一个连接获取一个Content Server实例的所有文档。为多个Content Server实例的文档生成索引时,需为每服务器实例定义连接。</p>
-                <p>Documentum连接类型,可从每Content Server实例的dm_document型及其派生类的所有Documentum文档建立索引。还支持复合文档结构。不支持其它Documentum结构。</p>
-                <p>Documentum连接所处理的文档使用Documentum权限连接管理权限。使用Documentum权限时请参阅[EMC Documentum权限连接]。</p>
-                <p>选择Documentum连接会显示如下标签:[Docbase],[Webtop]。从[Docbase]标签指定要连接的文档服务器并设置认证信息。索引生成后,从[Webtop]标签指定用来显示文档服务器内容的Webtop服务器。</p>
-                <p>选择[Docbase]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-docbase.PNG" alt="Documentum Connection, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>请输入文档服务器Docbase实例名和认证信息。文档服务器实例未被集成到ActiveDirectory时,[域名]置为空。</p>
-                <p>选择[Webtop]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-webtop.PNG" alt="Documentum Connection, Docbase tab" width="80%"/>
-                <br/><br/>
-                <p>输入Webtop实例的基URI。此URI仅在用户参照元文档时才被使用。不使用在爬取。</p>
-                <p>输入后单击[保存]按钮。会显示如下设置内容的概要和状态:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/documentum-status.PNG" alt="Documentum Connection Status" width="80%"/>
-                <br/><br/>
-                <p>状态显示出错信息时,请修改设置内容。</p>
-                <p></p>
-                <p>作业中选择Documentum连接,会显示下述标签:[路径],[文档类型],[内容类型],[安全],[路径元数据]。</p>
-                <p>从[路径]标签可以设置用来读取文档的Documentum内路径。路径未被设置时,所有文档成为读取对象。</p>
-                <p>从[文档类型]标签,指定读取对象的文档类型。只许从由系统管理员指定索引对象的dm_document派生的文档类型。另外,可针对每一个建立索引的文档类型指定包含元数据。包含文档类型所有元数据时请在[所有元数据]复选框选中。</p>
-                <p>从[文档类型]标签,可以指定文档集所包含Documentum的mime类型。在包含类型选中,从排除类型清除。</p>
-                <p>从[安全]标签,可以将此作业的Documentum安全设为有效/无效。要Documentum安全设为无效时请选择[无效]单选框。当无效时,可以设置用来获取作业所有文档的访问令牌。访问令牌依赖于所使用的权限连接类型。每输入访问令牌请单击[添加]按钮。</p>
-                <p>从[路径元数据]标签,可指定按文档将路径信息作为元数据发给索引。发送时,输入元数据属性名到项目[路径属性名],添加规则到规则列表。各规则由相应正则表达式构成。转换源和值用括号([(]和[)])括上。由括弧括上的部分称为[组]。替换字符串,由固定字符和替换组构成。比如,[$(1)]表示首个匹配组,[$(1l)]表示首个小写字符的匹配组。同样[$(1u)]表示大写字符的匹配组。</p>
-                <p>比如,规则的匹配条件为<code>.*/(.*)/(.*)/.*</code>,替换字符串为<code>$(1) $(2)/</code>时,路径<code>Project/Folder_1/Folder_2/Filename</code>转换为<code>Folder_1 Folder_2</code>。</p>
-                <p>存在一个以上规则时,将从上往下执行,上方规则的结果会被下方规则覆盖。</p>
-            </section>
-            
-            <section id="dropboxrepository">
-              <title>Dropbox存储库连接</title>
-              <p>Dropbox存储库连接,可从<a href="https://www.dropbox.com/home">Dropbox</a>的内容建立索引。</p>
-              <p>每一个Dropbox连接,管理一个指向Dropbox存储库的访问。这意味着如使用不同用户拥有多个时,需对每一个Dropbox存储库建立连接,并需准备相关权限信息。</p>
-              <br/>
-              <p>一个Dropbox连接,在存储库连接的编辑画面拥有如下参数可设置。</p>
-              <br/><br/>
-              <figure src="images/zh_CN/dropbox-repository-connection-configuration.PNG" alt="Dropbox Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>为连接到[连接],需要四个信息。Application Key和Application Secret,当以开发版权登录你的应用程序时,由Dropbox提供。通常通过应用开发人员用<a href="https://www.dropbox.com/developers/apps">Dropbox website</a>。</p>
-              <br/><br/>
-              <figure src="images/zh_CN/dropbox-repository-create-application.PNG" alt="Dropbox create application" width="80%"/>
-              <br/><br/>
-              <p>这里的用途是,为和Dropbox交流而使用REST服务,作为应用类型需选择"Core"。另,选择"full access"。在此还存在些许争论。关于用来保存或获取信息的应用程序,通常通过应用程序的固有文件夹进行完全访问。这里假定用户仅访问用户的文件,而不拷贝到manifoldcf的固有文件夹。结果,选择"App folder"而不是"full access"。</p>
-              <br/><br/>
-              <figure src="images/zh_CN/dropbox-repository-application-secret-passwords.PNG" alt="Dropbox get key and secret passwords" width="80%"/>
-              <br/><br/>
-              <p>而后,可看到此连接器要求的两个信息,App key和App secret。</p>
-              <p>这里,每一个用户许确认用户的应用程序被允许访问Dropbox。这通过一般的OAUTH手段来实现。当用户应用程序被提供key和secret之后,用户将被要求,向Dropbox的网站发出请求来给予用户应用程序相应权限。如请求被接受,Dropbox将提供client key和secret。此key和secret,Dropbox连接器所需的最后亮点。关于此过程更详细的内容,在<a href="https://www.dropbox.com/developers/core/authentication">dropbox website</a>有关于如何生成这两个client令牌的说明和示例。</p>
-              <br/>
-              <br/><br/>
-              <p>单击保存按钮,看到如下连接概要页面。</p>
-              <br/><br/>
-              <figure src="images/zh_CN/dropbox-repository-connection-configuration-save.PNG" alt="Dropbox Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>当已设置使用Dropbox存储库连接的作业,会显示添加标签"Dropbox Folder to Index"。</p>
-              <br/><br/>
-              <figure src="images/zh_CN/dropbox-repository-connection-job-dropbox-folder-to-index.PNG" alt="Dropbox Repository Connection, Dropbox Folder to Index" width="80%"/>
-              <br/><br/>
-              <p>在此标签,可指定Dropbox连接器要建立索引的目标目录。Dropbox使用unix风格的路径。"/"表示根路径(意味着指定所有Dropbox)。比如,要为Photos目录建立索引时,指定为"/Photos"。</p>
-              <p>注意,Dropbox连接器当获取处理中,针对每一个结果,如发现文件夹层,试图获取所有其子文件夹。如不是文件夹,会直接获取文档。</p>
-              <p>设置完作业,单击保存按钮,看到如下概要页。</p>
-              <br/><br/>
-              <figure src="images/zh_CN/dropbox-repository-connection-job-save.PNG" alt="CMIS Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-            
-            <section id="livelinkrepository">
-                <title>OpenText LiveLink存储库连接</title>
-                <p>OpenText LiveLink连接类型,从LiveLink存储库的文档建立索引。LiveLink包括基本文档,复合文档,文件夹,工作区,工程等多种文档类型。LiveLink连接可处理所有上述文档类型的文档。</p>
-                <p>LiveLink连接所处理文档的安全由LiveLink权限管理。关于LiveLink权限连接请参阅[OpenText LiveLink权限连接]。</p>
-                <p>选择LiveLink连接会显示如下标签:[服务器],[文档访问],[文档显示]。从[服务器]标签,可选择要连接LiveLink服务器并设置连接所需的认证信息。从[文档访问]标签设置通过LiveLink获取文档所需的LiveLink的web接口信息。从[文档显示]标签,为显示搜索结果,指定获取文档URI的生成方法。</p>
-                <p>选择[服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-connection-server.PNG" alt="LiveLink Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入LiveLink服务器名,端口号,认证信息。</p>
-                <p>选择[访问文档]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-connection-document-access.PNG" alt="LiveLink Connection, Document Access tab" width="80%"/>
-                <br/><br/>
-                <p>服务器名假定为和[服务器]标签的输入值一致。请选择协议。当LiveLink服务器将使用HTTP非缺省端口号,请输入端口号。LiveLink服务器使用NTLM认证时,请输入ActiveDirectory用户名,密码和域名。LiveLink服务器使用HTTPS时,单击[添加]按钮上传证书。(也可以使用服务器的证书,但注意服务器的证书可能发生变化。)</p>
-                <p>选择[显示文档]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-connection-document-view.PNG" alt="LiveLink Connection, Document Viewtab" width="80%"/>
-                <br/><br/>
-                <p>如要各文档的显示URI和访问URI保持一致,请不要更改内容。搜索结果显示在不同CGI时,在此页加以设置。</p>
-                <p>输入后单击[保存]按钮,会显示如下设置内容概要页:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-connection-status.PNG" alt="LiveLink Connection Status" width="80%"/>
-                <br/><br/>
-                <p>如显示出错信息,请修改设置。示例页面中设置正确,故连接状态显示为[起動]。</p>
-                <p></p>
-                <p>在作业选择LiveLink连接会显示如下标签:[路径],[过滤器],[安全],[元数据]。</p>
-                <p>从[路径]标签设置LiveLink要建立索引的起点路径列表。选择[路径]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-job-paths.PNG" alt="LiveLink Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>请选择下拉列表单击[+]按钮生成路径。生成完路径单击[添加]按钮添加到列表。</p>
-                <p>从[过滤器]标签指定LiveLink作业的处理对象中包含/排除的文档条件。文件为规则列表。各规则定义指定路径条件。各规则指定文件名条件(例:[*.txt]),指定是否确定文件或文件夹名,是否在输出连接从文件生成索引,是否包含或排除文件。文件名可用通配符[*]和[?]指定。[*]匹配于0或0以上任意字符。[?]和任意1字符匹配。其它字符需按定义匹配。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-job-filters.PNG" alt="LiveLink Job, Filters tab" width="80%"/>
-                <br/><br/>
-                <p>输入匹配条件,并选择匹配时的处理后单击[添加]按钮将规则添加到过滤器列表。</p>
-                <p>从[安全]标签可将作业中对象文档的LiveLink安全设为无效/有效。选择[安全]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-job-security.PNG" alt="LiveLink Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>如安全设为无效,可在作业中要建立索引的所有文档指定访问令牌。访问令牌的格式依赖于作业中存储库连接所使用的权限。输入令牌单击[添加]按钮添加到列表。</p>
-                <p>从[元数据]标签可指定传给索引的LiveLink元数据。选择[元数据]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/livelink-job-metadata.PNG" alt="LiveLink Job, Metadata tab" width="80%"/>
-                <br/><br/>
-                <p>当将LiveLink的所有元数据传给索引时,请在[所有元数据]单选框打勾。仅传给特定元数据是,把LiveLink元数据路径添加到元数据列表。选择如下元数据语句单击[+]按钮添加到路径。也可以添加文件夹信息,元数据种类。</p>
-                <p>到达元数据种类处,要么选择元数据属性,要么在[此种类所有属性]复选框打勾。输入完单击[添加]按钮来添加要包含在索引的元数据属性。</p>
-                <p>从[路径元数据]标签文档,指定将每一个路径信息作为元数据发送到索引。发送时,在[路径属性名]项输入元数据属性名,将规则添加到规则列表。各规则由响应正则表达式构成。转换源和值用括号([(]和[)])括上。由括号括上的部分称为[组]。替换字符串,由固定字符和替换组构成。比如,[$(1)]表示首个匹配组,[$(1l)]表示首个匹配的小写字符的组。同样[$(1u)]表示和大写字符相配的组。</p>
-                <p>比如,规则的匹配条件为<code>.*/(.*)/(.*)/.*</code>,替换字符串为<code>$(1) $(2)/</code>时,路径<code>Project/Folder_1/Folder_2/Filename</code>将被转换成<code>Folder_1 Folder_2</code>。</p>
-                <p>存在一个或一个以上规则时,从上往下执行,上方规则的结果由下方规则覆盖。</p>
-            </section>
-            
-            <section id="mexexrepository">
-                <title>Memex Patriarch存储库连接</title>
-                <p>Memex Patriach连接用来建立Memex服务器文档的索引。</p>
-                <p>Memex连接所处理文档的安全由Memex权限管理。关于Memex权限连接的设置请参阅[Memex Patriarch权限连接]。</p>
-                <p>从存储库连接编辑页选择Memex连接会显示如下标签:[Memex服务器],[Web服务器]。选择[Memex服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/memex-connection-memex-server.PNG" alt="Memex Connection, Memex Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入Memex服务器名,连接端口号等具有获取文档权限的Memex用户认证信息。另外,请输入Memex服务器所使用的字符编码和时区。</p>
-                <p>选择[Web服务器]标签会看到如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/memex-connection-web-server.PNG" alt="Memex Connection, Web Server tab" width="80%"/>
-                <br/><br/>
-                <p>请给每一个Memex文档输入可生成唯一URL的信息。选择协议,输入服务器名和端口号。</p>
-                <p>输入后单击[保存]按钮。会显示如下状态页:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/memex-connection-status.PNG" alt="Memex Connection Status" width="80%"/>
-                <br/><br/>
-                <p></p>
-                <p>从作业选择Memex连接会显示如下标签:[记录条件],[实体],[安全]。</p>
-
-            </section>
-            
-            <section id="meridiorepository">
-                <title>Meridio存储库连接</title>
-                <p>Autonomy Meridio连接,从Merido服务器的文档生成索引。Meridio的体系结构允许将服务分布于多个服务器(比如:文档服务和记录服务运行在不同的服务器)。因此,Meridio连接类型,可为每一个Meridio服务器进行设置。</p>
-                <p>Meridio连接所处理文档的安全使用Meridio权限。关于Meridio权限连接请参阅[Meridio权限连接]。</p>
-                <p>从存储库连接页选择Meridio连接选择如会显示如下标签:[文档服务器],[记录服务器],[Web客户端],[认证]。选择[文档服务器]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-connection-document-server.PNG" alt="Meridio Connection, Document Server tab" width="80%"/>
-                <br/><br/>
-                <p>选择协议并输入服务器名,端口号,Meridio文档服务器服务地址。使用代理服务器时,输入代理服务器主机地址和端口号。当前版本不支持认证代理服务器。</p>
-                <p>Meridio系统时,虽可为每一个不同的服务配备服务器,通常多个服务运行在同一个服务器。但是,从连接类型设置还可以指定不同的服务器。</p>
-                <p>如选择[记录服务器]标签,会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-connection-records-server.PNG" alt="Meridio Connection, Records Server tab" width="80%"/>
-                <br/><br/>
-                <p>请输入协议,服务器名,端口号,Meridio记录服务器服务地址。使用代理服务器时,请输入代理服务器主机和端口号。当前版本不支持认证代理服务器。</p>
-                <p>虽Meridio系统可为每一个服务配备不同服务器,通常多个服务运行在同一台服务器。但是,从连接类型设置还可以指定不同的服务器。</p>
-
-                <p>选择[Web客户端]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-connection-web-client.PNG" alt="Meridio Connection, Web Client tab" width="80%"/>
-                <br/><br/>
-                <p>从[Meridio连接Web客户端]标签针对每一个用以生成索引的内容而生成URI。选择协议,并输入服务器名,端口号,Miridio Web客户端服务地址。因不会从此服务获取文档,故无需代理服务器信息。</p>
-                <p>选择[认证]标签,会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-connection-credentials.PNG" alt="Meridio Connection, Credentials tab" width="80%"/>
-                <br/><br/>
-                <p>请输入Meridio系统的用户认证信息。</p>
-                <p>输入后单击[保存]按钮。显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/meridio-connection-status.PNG" alt="Meridio Connection Status" width="80%"/>
-                <br/><br/>
-                <p>所显示画面中因Meridio权限服务器无法连接到Windows域名而出错。</p>
-                <p>Meridio使用Windows IIS的认证功能。IIS及Windows域名设置有误时,Meridio也会无法正常运行。如发生问题,请咨询Meridio技术负责人。还可使用如下调试工具:</p>
-                <br/>
-                <ul>
-                    <li>Windows安全事件日志</li>
-                    <li>ManifoldCF日志(以参阅下述内容)</li>
-                    <li>数据包截取器(使用WireShark等工具)</li>
-                </ul>
-                <br/>
-                <p>需要其它ManifoldCF日志信息时需修改软件。</p>
-                <p></p>
-                <p>从作业选择Meridio连接会显示如下标签:[搜索路径],[文档类型],[种类],[数据类型],[安全],[元数据]。</p>
-            </section>
-            
-            <section id="sharepointrepository">
-                <title>Microsoft SharePoint存储库连接</title>
-                <p>Microsoft SharePoint连接类型,生成Microsoft SharePoint网站的文档索引。可以在SharePoint服务器建立多个网站。SharePoint包括相关网站(比如子网站的场合)和单独网站。</p>
-                <p>SharePoint连接类型设计为,由一个SharePoint存储库连接通过根网站的明示子网站访问所有SharePoint网站。尤其大型SharePoint网站要求从一个连接访问<b>所有</b>SharePoint网站。但是当前版本的ManifoldCF未支持。</p>
-                <p>SharePoint以web URI作为地址访问网站,子网站,库,文件。因此,检查SharePoint连接类型首选方法是利用web浏览器从爬取对象根网站顺次打开页面,记录URL。</p>
-                <p>在很多场合,SharePoint连接所处理文档的安全由ActiveDirectory管理。生成ActiveDirectory权限,请参照[ActiveDirectory权限连接]。</p>
-                <p>从存储库连接编辑选择SharePoint连接,会看到[服务器]标签。选择[服务器]标签显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/sharepoint-configure-server.PNG" alt="SharePoint Connection, Server tab" width="80%"/>
-                <br/><br/>
-                <p>请从下拉菜单选择SharePoint服务器版本。如版本选择有误,导致无法生成索引或无法正确获取权限信息。</p>
-                <p>选择服务器协议,参照从SharePoint网站记录下的URI,输入服务器名和端口号。[网站路径]项输入根网站URI的服务器地址和端口号以后的除最后[aspx]文件以外字符串。比如SharePoint URI为[http://myserver:81/sites/somewhere/index.asp]时,网站路径为[/sites/somewhere]。</p>
-                <p>使用SharePoint认证登录到根网站。SharePoint连接类型的用户名必须以[domain\user]格式输入。</p>
-                <p>SharePoint服务器使用SSL时,请设置SharePoint服务器的SSL服务器认证服务器证书或来自认证局的证书。从参照选择证书,单击[添加]按钮。</p>
-                <p>单击[保存]按钮显示如下连接设置概要页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/sharepoint-status.PNG" alt="SharePoint Status" width="80%"/>
-                <br/><br/>
-                <p>画面示例中因SharePoint连接无法访问SharePoint实例而显示出错信息。</p>
-                <p>SharePoint使用Windows IIS加以认证。注意有时因SharePoint所运行的IIS及Windows域名出现问题导致SharePoint连接无法正常运行。如发生问题可使用下述调试工具:</p>
-                <br/>
-                <ul>
-                    <li>Windows安全事件日志</li>
-                    <li>ManifoldCF日志(参阅下述内容)</li>
-                    <li>数据包截取器(使用WireShark等工具)</li>
-                </ul>
-                <br/>
-                <p>如需非标准的日志信息需修改软件。</p>
-                <p></p>
-                <p>选择SharePoint存储库连接,显示如下标签:[路径],[安全],[元数据]。</p>
-                <p>可从[路径]标签生成规则列表,指定包含在或排除于作业的SharePoint文档。SharePoint连接类型发现子网站,库,文件时,将参照此规则列表判断是否包含或排除。首先使用匹配规则。</p>
-                <p>各规则由路径,规则类型,处理所构成。处理指[包含]或[排除]。规则类型用来区分为当前连接使用何种SharePoint实体。比如,[文件]规则仅在SharePoint路径为文件时才会匹配,不会匹配于网站及库。路径为字符串。还可以使用通配符[*]和[?]。[*]和0或以上的任意字符相配。[?]和任意1字符相匹配。其它字符需按字面匹配。</p>
-                <p>还可以定义默认的匹配规则。当选择[包含]的[文件],网站和库也默认地视为[包含]。比如,当[/MySite/MyLibrary/MyFile]定义为[包含]规则,["/MySite]网站的包含规则和[/MySite/MyLibrary]库的包含规则也被默认地定义。同样定义库的包含规则也意味着定义了网站的包含规则。这些默认规则只适用于[包含]规则。排除规则不存在默认规则。</p>
-                <p>还可以从[路径]标签生成规则并添加或插入到列表。选择[路径]标签会显示如下页面。连接没有正常运行时,下拉菜单所显示的项目会减少。</p>
-                <br/><br/>
-                <figure src="images/zh_CN/sharepoint-job-paths.PNG" alt="SharePoint Job, Paths tab" width="80%"/>
-                <br/><br/>
-                <p>要定义规则,首先指定相应路径。选择输入或路径单击[添加网站]按钮,[添加库]按钮,[添加文本]按钮中的一个。请重复添加操作直到完全指定路径为止。SharePoint连接无法判断路径实体时,请手动选择SharePoint实体。然后选择是[包含]还是[排除]规则。最后,单击[添加新规则]按钮将规则添加到规则列表。</p>
-                <p>从[安全]标签可指定是否将SharePoint安全应用于文档。还可以针对作业对象文档附上访问令牌。选择[安全]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/sharepoint-job-security.PNG" alt="SharePoint Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>请选择SharePoint安全的有效/无效单选框。当安全设为无效时,可以设置访问令牌。输入访问令牌,单击[添加]按钮。访问令牌应设为SharePoint连接可以使用的格式。</p>
-                <p>从[元数据]标签可以指定包含在各文档的元数据。[元数据]标签内容类似于[路径]标签。选择[元数据]标签会显示如下页面:</p>
-                <br/><br/>
-                <figure src="images/zh_CN/sharepoint-job-metadata.PNG" alt="SharePoint Job, Security tab" width="80%"/>
-                <br/><br/>
-                <p>和[路径]标签的区别在于,定义文档包含/排除的元数据,而不定义各个网站,库,文档的包含/排除规则。因元数据只适用于文件,不存在针对网站及库的元数据路径规则。</p>
-                <p>当排除规则匹配文件路径时,该文件的<b>所有</b>元数据将被排除。不能从排除规则排除个别项目。</p>
-                <p>定义规则,首先指定相应路径。选择或输入路径并单击[添加网站]按钮,[添加库]按钮,[添加文本]按钮中的一个。重复添加直至设置完整路径。当SharePoint连接无法判断路径实体时,请手动选择SharePoint实体。然后选择是[包含]还是[排除]规则。最后单击[添加新规则]按钮添加规则到规则列表。</p>
-                <p>可以从[路径元数据]标签指定为,将文档的路径信息作为元数据发送到索引。指定方法是,在[路径属性名]项目输入元数据属性名,并将规则添加到规则列表。各规则由相应正则表达式构成。转换源和值用括号([(]和[)])括上。由括号括上的部分称为[组]。替换字符串,由固定字符和替换组构成。比如,[$(1)]表示首个匹配组,[$(1l)]表示首个匹配的小写字符的组。同样[$(1u)]表示和大写字符相配的组。</p>
-                <p>比如,规则的匹配条件为<code>.*/(.*)/(.*)/.*</code>,替换字符串为<code>$(1) $(2)/</code>时,路径<code>Project/Folder_1/Folder_2/Filename</code>将被转换成<code>Folder_1 Folder_2</code>。</p>
-                <p>如存在一个以上规则时,从上往下执行,上面的规则的结果被下面的规则所更改。</p>
-            </section>
-            
-            <section id="cmisrepository">
-              <title>CMIS存储库连接</title>
-              <p>CMIS存储库连接类型,生成基于CMIS存储库文档的索引。</p>
-              <p>缺省设置下,各CMIS连接处理一个CMIS存储库。存在多个CMIS存储库时,需为每一个CMIS存储库生成CMIS连接。</p>
-              <br/>
-              <p>从存储库连接编辑页选择CMIS连接,可以设置如下项目:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-repository-connection-configuration.png" alt="CMIS Repository Connection, configuration parameters" width="80%"/>
-              <br/><br/>
-              <p>选择CMIS绑定协议(AtomPub或Web Service),请输入用户名,密码,CMIS文档服务器服务端点。</p>
-              <p>端点由CMIS服务的HTTP协议,主机名,端口号,上下文路径所构成:</p>
-              <br/><br/>
-              <p><code>http://主机名:端口号/CMIS上下文路径</code></p>
-              <br/><br/>
-              <p>还可以输入存储库ID,选择一个公开的CMIS存储库。null时,CMIS连接器将使用CMIS服务器所公开的第一个CMIS存储库。</p>
-              <br/>
-              <p>CMIS系统中特定的绑定协议具有各自的上下文路径。即,端点各自不同:</p>
-              <p>由OpenCMIS提供的実際的InMemory服务器所公开的AtomPub绑定端点如下所示:</p>
-              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/atom</code></p>
-              <br/><br/>
-              <p>Web Service于别的端点公开:</p>
-              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/services/RepositoryService</code></p>
-              <br/><br/>
-              <p>如单击[保存]按钮,会显示如下连接概要页面:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-repository-connection-configuration-save.png" alt="CMIS Repository Connection, saving configuration" width="80%"/>
-              <br/><br/>
-              <p>如在作业选择CMIS存储库连接,会看到[CMIS查询]标签。选择[CMIS查询]标签显示如下页面:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-repository-connection-job-cmisquery.png" alt="CMIS Repository Connection, CMIS Query" width="80%"/>
-              <br/><br/>
-              <p>从[CMIS查询]标签可用CMIS查询语言设置获取文档的查询语句。</p>
-              <p>CMIS连接器在读取文档时如发现文件夹节点(baseType为cmis:folder的节点),还会读取文件夹内的文档。非文件夹时(baseType为cmis:document),读取文档并处理。</p>
-              <p>输入后单击[保存]按钮。会显示如下设置概要:</p>
-              <br/><br/>
-              <figure src="images/zh_CN/cmis-repository-connection-job-save.png" alt="CMIS Repository Connection, saving job" width="80%"/>
-              <br/><br/>
-            </section>
-            
-        </section>
-
-</body>
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/faq.xml b/site/src/documentation/content/xdocs/zh_CN/faq.xml
deleted file mode 100755
index 20f94af..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/faq.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Q&amp;A</title> 
-  </header> 
-
-  <body> 
-
-      <section>
-        <title>终端用户</title>
-        <p>如有提问请发电子邮件到user@manifoldcf.apache.org。</p>
-      </section>
-      
-      <section>
-         <title>开发人员</title>
-         <p>请参照<a href="https://cwiki.apache.org/confluence/display/CONNECTORS/FAQ">Wiki</a>。
-         </p>
-      </section>
-
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/how-to-build-and-deploy.xml b/site/src/documentation/content/xdocs/zh_CN/how-to-build-and-deploy.xml
deleted file mode 100644
index 5fccdb2..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/how-to-build-and-deploy.xml
+++ /dev/null
@@ -1,1348 +0,0 @@
-<?xml version="1.0"?>

-

-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 

-          "http://forrest.apache.org/dtd/document-v20.dtd">

-

-<!--

- 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.

--->

-

-<document> 

-

-  <header> 

-    <title>Building ManifoldCF</title> 

-  </header> 

-

-  <body> 

-    <section>

-      <title>Building ManifoldCF</title>

-      <p></p>

-      <p>ManifoldCF consists of a framework, a set of connectors, and an optional Apache2 plug-in module.  These can be built as follows.</p>

-      <p></p>

-      

-      <section>

-        <title>Building overview</title>

-        <p></p>

-        <p>There are two ways to build ManifoldCF.  The primary means of building (and the most supported) is via Apache Ant.  The ant build is used to

-          create ManifoldCF releases and to run tests, load tests, and UI tests. Maven is also supported for develop building only.  Maven ManifoldCF builds have

-          many restrictions and challenges and are of secondary priority for the development team.</p>

-        <p>The ManifoldCF framework is built without any dependencies on connector code.  It consists of a set of jars, a family of web applications, and

-          a number of java command classes.  Connectors are then built that have well-defined dependencies on the framework

-          modules.  A properly built connector typically consists of:</p>

-        <p></p>

-        <ul>

-           <li>One or more jar files meant to be included in the library area meant for connector jars and their dependencies.</li>

-           <li>Possibly some java commands, which are meant to support or configure the connector in some way.</li>

-           <li>Possibly a connector-specific process or two, each requiring a distinct classpath, which usually serves to isolate the <strong>crawler-ui</strong> servlet,

-            <strong>authority-service</strong> servlet, <strong>agents</strong> process, and any commands from problematic aspects of the client environment</li>

-           <li>A recommended set of java "define" variables, which should be used consistently with all involved processes, e.g. the <strong>agents</strong> process, the

-            application server running the <strong>authority-service</strong> and <strong>crawler-ui</strong>, and any commands.  (This is historical, and no connectors

-            as of this writing have any of these any longer).</li>

-        </ul>

-        <p></p>

-        <p>An individual connector package will typically supply an output connector, or a transformation connector, or a mapping connector, or a repository connector, or

-          sometimes both a repository connector and an authority connector.  The

-          main ant build script automatically forms each individual connector's contribution to the overall system into the overall package.</p>

-      </section>

-      

-      <section>

-        <title>Building the framework and the connectors using Apache Ant</title>

-        <p></p>

-        <p>To build the ManifoldCF framework code, and the particular connectors you are interested in, you currently need to do the following:</p>

-        <p></p>

-        <ol>

-          <li>Check out the desired release from https://svn.apache.org/repos/asf/manifoldcf/tags, or unpack the desired source distribution.</li>

-          <li>cd to the top-level directory.</li>

-          <li><strong>EITHER:</strong> overlay the lib directory from the corresponding lib distribution (preferred, where possible), <strong>OR</strong> run "ant make-core-deps" to

-            build the code dependencies.  The latter is the only possibility if you are building from trunk, but it is not guaranteed to work for older releases.</li>

-          <li>Run "ant make-deps", to download LGPL and other open source but non-Apache compatible libraries.</li>

-          <li>Install proprietary build dependencies.  See below for details.</li>

-          <li>Run "ant build".</li>

-          <li>Install desired dependent proprietary libraries.  See below for details.</li>

-        </ol>

-        <p></p>

-        <p>If you do not run the ant "make-deps" target, and you supply <strong>NO</strong> LGPL or proprietary libraries, not all capabilities of ManifoldCF will be available.

-            The framework itself and the following repository connectors will be built:</p>

-        <p></p>

-        <ul>

-          <li>Alfresco Webscript connector</li>

-          <li>Amazon S3 connector</li>

-          <li>CMIS connector</li>

-          <li>Atlassian Confluence connector</li>

-          <li>EMC Documentum connector, built against a Documentum API stub</li>

-          <li>DropBox connector</li>

-          <li>Email connector</li>

-          <li>FileNet connector, built against a FileNet API stub</li>

-          <li>WGET-compatible filesystem connector</li>

-          <li>Generic XML repository connector</li>

-          <li>Google Drive connector</li>

-          <li>GridFS connector (mongoDB)</li>

-          <li>HDFS connector</li>

-          <li>JDBC connector, with the just the POSTGRESQL jdbc driver</li>

-          <li>Atlassian Jira connector</li>

-          <li>OpenText LiveLink connector, built against a LiveLink API stub</li>

-          <li>Meridio connector, built against modified Meridio API WSDLs and XSDs</li>

-          <li>RSS connector</li>

-          <li>Microsoft SharePoint connector, built against SharePoint API WSDLs</li>

-          <li>Webcrawler connector</li>

-          <li>Wiki connector</li>

-        </ul>

-        <p></p>

-        <p>The following authority connectors will be built:</p>

-        <p></p>

-        <ul>

-          <li>Active Directory authority</li>

-          <li>Alfresco Webscript authority</li>

-          <li>Amazon S3 authority</li>

-          <li>CMIS authority</li>

-          <li>Atlassian Confluence authority</li>

-          <li>EMC Documentum authority</li>

-          <li>Atlassian Jira authority</li>

-          <li>LDAP authority</li>

-          <li>OpenText LiveLink authority</li>

-          <li>Meridio authority, built against modified Meridio API WSDLs and XSDs</li>

-          <li>Null authority</li>

-          <li>Microsoft SharePoint/AD authority</li>

-          <li>Microsoft SharePoint/Native authority, built against SharePoint API WSDLs</li>

-        </ul>

-        <p></p>

-        <p>The following output connectors will be built:</p>

-        <p></p>

-        <ul>

-          <li>Amazon Cloud Search output connector</li>

-          <li>WGET-compatible filesystem output connector</li>

-          <li>MetaCarta GTS output connector</li>

-          <li>Apache Solr output connector</li>

-          <li>OpenSearchServer output connector</li>

-          <li>ElasticSearch output connector</li>

-          <li>WGET-compatible filesystem output connector</li>

-          <li>HDFS output connector</li>

-          <li>Kafka output connector</li>

-          <li>Null output connector</li>

-          <li>Searchblox output connector</li>

-        </ul>

-        <p></p>

-        <p>The following transformation connectors will be built:</p>

-        <p></p>

-        <ul>

-          <li>Field mapping transformation connector</li>

-          <li>Document filter transformation connector</li>

-          <li>OpenNLP transformation connector</li>

-          <li>Null transformation connector</li>

-          <li>Tika extractor transformation connector</li>

-        </ul>

-        <p></p>

-        <p>The following mapping connectors will be built:</p>

-        <p></p>

-        <ul>

-          <li>Regular-expression mapping connector</li>

-        </ul>

-        <p></p>

-        <p>The following notification connectors will be built:</p>

-        <p></p>

-        <ul>

-          <li>Email notification connector</li>

-        </ul>

-        <p></p>

-        <p>The dependencies and build limitations of each individual LGPL and proprietary connector is described in separate sections below.</p>

-        <p></p>

-            

-        <section>

-          <title>Building and testing the legacy Alfresco connector</title>

-          <p></p>

-          <p>The legacy Alfresco connector requires the Alfresco Web Services Client provided by Alfresco in order to be built. Place this jar into the directory <em>connectors/alfresco/lib-proprietary</em> before you build.

-              This will occur automatically if you execute the ant target "make-deps" from the ManifoldCF root directory.</p>

-          <p></p>

-          <p>To run integration tests for the connector you have to copy the alfresco.war including H2 support created by the Maven module test-materials/alfresco-4-war (using "mvn package" inside the folder)

-              into the <em>connectors/alfresco/test-materials-proprietary</em> folder.  Then use the "ant test" or "mvn integration-test" for the standard build to execute integration tests.</p>

-          <p></p>

-        </section>

-

-        <section>

-          <title>Building and testing the Alfresco Webscript connector</title>

-          <p></p>

-          <p>The Alfresco Webscript connector is built against an open-source Alfresco Indexer client, which requires a corresponding Alfresco Indexer plugin

-                to be installed on your Alfresco instance.  This Alfresco Indexer plugin is included with ManifoldCF distributions.  Installation of the plugin should follow the

-                standard Alfresco installation steps, as described <a href="http://docs.alfresco.com/4.1/tasks/amp-install.html">here</a>.

-                See <a href="https://github.com/maoo/alfresco-indexer">this page</a> for configuration details, and for the plugin itself.</p>

-          <p></p>

-        </section>

-

-        <section>

-          <title>Building and running the Documentum connector</title>

-          <p></p>

-          <p>The Documentum connector requires EMC's DFC product in order to be run, but is built against a set of stub classes.

-              The stubs mimic the class structure of DFC 6.0.  If your DFC is newer, it is possible that the class structure of the DFC

-              classes might have changed, and you may need to build the connector yourself.</p>

-          <p>If you need to supply DFC classes during build time, copy the DFC and dependent jars to the source directory

-              <em>connectors/documentum/lib-proprietary</em>, and build using "ant build".  The jars will be copied  into

-              the right place in your <em>dist</em> directory automatically.</p>

-          <p>For a binary distribution, just copy the DFC jars to <em>processes/documentum-server/lib-proprietary</em> instead.</p>

-          <p>If you have done everything right, you should be able to start the Documentum connector's registry and server processes, as per the instructions.</p>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Building and running the FileNet connector</title>

-          <p></p>

-          <p>The FileNet connector requires IBM's FileNet P8 API jar in order to be run, but is usually built against a set of stub classes.

-              The stubs mimic the class structure of FileNet P8 API 4.5.  If your FileNet is newer, it is possible that the class structure of the

-              API might have changed, and you may need to build the connector yourself.</p>

-          <p>If you need to supply your own Jace.jar at build time, copy it to the source directory <em>connectors/filenet/lib-proprietary</em>,

-              and build using "ant build".  The Jace.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>

-          <p>If you do not wish to build, simply copy your Jace.jar and the other dependent jars from that installation into the distribution directory

-              <em>processes/filenet-server/lib-proprietary</em>.</p>

-          <p>If correctly done, you will be able to start the FileNet connector's registry and server processes, as per the instructions.</p>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Building and running the JDBC connector, including Oracle, MSSQL, MySQL, SQLServer, and Sybase JDBC drivers</title>

-          <p></p>

-          <p>The JDBC connector also knows how to work with Oracle, SQLServer, and Sybase JDBC drivers.  In order to support these databases, start by placing the mysql-connector-java.jar

-            and the jtds.jar in the <em>lib-proprietary</em> directory.  The ant target "make-deps" will do this for you automatically.  For Oracle, download the appropriate

-            Oracle JDBC jar from the Oracle site, and copy it into the same directory before you build ManifoldCF.</p>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Building and running the jCIFS/Windows Shares connector</title>

-          <p></p>

-          <p>To build this connector, you need to download jcifs.jar from <a href="http://jcifs.samba.org">http://jcifs.samba.org</a>, and copy it into the <em>connectors/jcifs/lib-proprietary</em>

-              directory before building.  You can also just type "ant make-deps" from the root ManifoldCF directory and this step will be done for you.</p>

-          <p>If you have downloaded a binary distribution, place the jcifs.jar into the <em>connector-lib-proprietary</em> directory, and uncomment the Windows Shares line in the <em>connectors.xml</em> file.</p>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Building and running the LiveLink connector</title>

-          <p></p>

-          <p>This connector needs OpenText's LAPI package in order to be run.  It is usually built against a set of stubs. The stubs, however, mimic the

-              class structure of LAPI 9.7.1.  Later versions (such as 10.x) have a different class structure.  Therefore, you may need to rebuild ManifoldCF

-              against your lapi.jar, in order for the connector to work properly.</p>

-          <p>If you need to supply your own lapi.jar and llssl.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".

-              The lapi.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>

-          <p>If you do not wish to build, simply copy your lapi.jar and llssl.jar into the binary distribution's <em>connector-lib-proprietary</em>

-              directory, and uncomment the LiveLink-related connector lines in <em>connectors.xml</em> file.</p>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Building the Meridio connector</title>

-          <p></p>

-          <p>The Meridio connector generates interface classes using checked-in wsdls and xsds originally obtained

-              from an installed Meridio instance using <strong>disco.exe</strong>, and subsequently modified to work

-              around limitations in Apache Axis.  The <strong>disco.exe</strong> utility is installed as part of

-              Microsoft Visual Studio, and is typically found under "c:\Program Files\Microsoft SDKs\Windows\V6.x\bin".

-              If desired, you can obtain unmodified wsdls and xsds by interrogating the following Meridio web services:</p>

-          <p></p>

-          <ul>

-             <li>http[s]://&#60;meridio_server&#62;/DMWS/MeridioDMWS.asmx</li>

-             <li>http[s]://&#60;meridio_server&#62;/RMWS/MeridioRMWS.asmx</li>

-          </ul>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Building and running the SharePoint connector</title>

-          <p></p>

-          <p>The SharePoint connector generates interface classes using checked-in wsdls originally obtained

-            from an installed Microsoft SharePoint instance using <strong>disco.exe</strong>.  The <strong>disco.exe</strong> utility is installed as part of

-            Microsoft Visual Studio, and is typically found under "c:\Program Files\Microsoft SDKs\Windows\V6.x\bin".

-            If desired, you can obtain unmodified wsdls by interrogating the following SharePoint web services:</p>

-          <p></p>

-          <ul>

-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Permissions.asmx</li>

-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Lists.asmx</li>

-             <li>http[s]://&#60;server_name&#62;/_vti_bin/Dspsts.asmx</li>

-             <li>http[s]://&#60;server_name&#62;/_vti_bin/usergroup.asmx</li>

-             <li>http[s]://&#60;server_name&#62;/_vti_bin/versions.asmx</li>

-             <li>http[s]://&#60;server_name&#62;/_vti_bin/webs.asmx</li>

-          </ul>

-          <p></p>

-          <p><strong>Important:</strong> For SharePoint instances version 3.0 (2007) or higher, in order to run the connector, you also must deploy a custom SharePoint web service

-            on the SharePoint instance you intend to connect to.  This is required because Microsoft overlooked support for web-service-based access to file and folder security information

-            when SharePoint 2007 was released.  For SharePoint version 4.0 (2010), the service is even more critical, because backwards compatibility was not maintained and without

-            this service no crawling can occur.  SharePoint version 5.0 (2013) also requires a plugin; although its functionality is the same as for SharePoint 4.0, the binary you install

-            is built against SharePoint 2013 resources rather than SharePoint 2010 resources, so there is a different distribution.</p>

-          <p>The versions of this service can be found in the distribution directory <em>plugins/sharepoint</em>.

-            Pick the version appropriate for your SharePoint installation, and install it following the instructions in the file <strong>Installation Readme.txt</strong>, found in the

-            corresponding directory.</p>

-          <p></p>

-        </section>

-

-        <section>

-          <title>Running the Apache OpenNLP transformation connector</title>

-          <p></p>

-          <p>The Apache OpenNLP transformation connector requires OpenNLP models in order to be useful.  These models should be downloaded or created by you, and

-            must be placed in the <em>file-resources</em> folder.  This will allow the connector to find them and allow you to use them.</p>

-          <p>The models available publicly for OpenNLP can be downloaded from this URL: <a href="http://opennlp.sourceforge.net/models-1.5/">http://opennlp.sourceforge.net/models-1.5/</a>.  To use the

-            connector, you <strong>must</strong> specify a sentence model and a tokenization model.  You can specify as few or as many content extraction models as you

-            wish.</p>

-          <p></p>

-          <p><strong>If you do not download or otherwise provide models for the OpenNLP connector's use, it will not be possible to define a job which uses the connector.</strong></p>

-        </section>

-

-        <section>

-          <title>Running the Apache Solr output connector</title>

-          <p></p>

-          <p>The Apache Solr output connector requires no special attention to build or run within ManifoldCF.  However, in order for Apache Solr to be able to enforce

-              document security, you must install and properly configure a plugin for Solr.  This plugin is available for both Solr 3.x and for Solr 4.x, and can be used either

-              as a query parser plugin, or as a search component.  Additional index fields are also required to contain the necessary security information.  Much more

-              information can be found in the README.txt file in the plugins themselves.</p>

-          <p>The correct versions of the plugins are included in the <em>plugins/solr</em> directory of the main ManifoldCF distribution.  You can also download updated versions

-              of the plugins from the ManifoldCF download page.  The compatibility matrix is as follows:</p>

-          <p></p>

-          <table>

-            <caption>Apache ManifoldCF Solr 3.x and Solr 4.x plugin compatibility</caption>

-            <tr><th>ManifoldCF versions</th><th>Plugin version</th></tr>

-            <tr><td>0.1.x-1.4.x</td><td>0.x</td></tr>

-            <tr><td>1.5.x</td><td>1.x</td></tr>

-            <tr><td>&#62;=1.6.x</td><td>2.x</td></tr>

-          </table>

-          <p></p>

-          <p><strong>If the proper version of the plugin is not deployed on Solr, documents will not be properly secured.</strong>  Thus, it is essential to verify that the

-              proper plugin version has been deployed for the version of ManifoldCF you are using.</p>

-        </section>

-

-        <section>

-          <title>Running the ElasticSearch output connector</title>

-          <p></p>

-          <p>The ElasticSearch output connector requires no special attention to build or run within ManifoldCF.  However, in order for ElasticSearch to be able to enforce

-              document security, you must install, properly configure, and code against a toolkit plugin for ElasticSearch.

-              Additional index fields are also required to contain the necessary security information.  Much more information can be found in the README.txt file in the

-              plugin itself.</p>

-          <p>The correct versions of the plugin is included in the <em>plugins/elasticsearch</em> directory of the main ManifoldCF distribution.  You can also download updated versions

-              of the plugin from the ManifoldCF download page.  The compatibility matrix is as follows:</p>

-          <p></p>

-          <table>

-            <caption>Apache ManifoldCF ElasticSearch plugin compatibility</caption>

-            <tr><th>ManifoldCF versions</th><th>Plugin version</th></tr>

-            <tr><td>0.1.x-1.4.x</td><td>0.x</td></tr>

-            <tr><td>1.5.x</td><td>1.x</td></tr>

-            <tr><td>&#62;=1.6.x</td><td>2.x</td></tr>

-          </table>

-          <p></p>

-          <p><strong>If the proper version of the plugin is not deployed and properly integrated, documents will not be properly secured.</strong>  Thus, it is essential to verify that the

-              proper plugin version has been deployed for the version of ManifoldCF you are using.</p>

-

-          <p>To work with ManifoldCF, your ElasticSearch instance must also include the appropriate indexes created as well.

-              Here are some simple steps for creating an ElasticSearch index, using the CURL utility:</p>

-          <p></p>

-          <source>

-% curl -XPUT 'http://localhost:9200/manifoldcf'

-% curl -XPUT 'http://localhost:9200/manifoldcf/attachment/_mapping' -d '

-{

-  "attachment" : {

-    "_source" : {

-      "excludes" : [ "file" ]

-    },

-    "properties": { 

-      "allow_token_document" : { 

-        "type" : "string" 

-      },

-      "allow_token_parent" : { 

-        "type" : "string" 

-      },

-      "allow_token_share" : { 

-        "type" : "string" 

-      },

-      "attributes" : {

-        "type" : "string"

-      },

-      "createdOn" : {

-        "type" : "string"

-      },

-      "deny_token_document" : {

-        "type" : "string"

-      },

-      "deny_token_parent" : {

-        "type" : "string"

-      },

-      "deny_token_share" : {

-        "type" : "string"

-      },

-      "lastModified" : {

-        "type" : "string"

-      },

-      "shareName" : {

-        "type" : "string"

-      },

-      "file" : {

-        "type" : "attachment",

-        "path" : "full",

-        "fields" : {

-          "file" : {

-            "store" : true,

-            "term_vector" : "with_positions_offsets",

-            "type" : "string"

-          }

-        }

-      }

-    }

-  }

-}'

-          </source>

-          <p>This command creates an index called <code>manifoldcf</code> with a mapping named <code>attachment</code>

-                which has some generic fields for access tokens and a field <code>file</code> which makes use of the

-                ElasticSearch attachment mapper plugin. It is configured for highlighting (<code>"term_vector" : "with_positions_offsets"</code>).</p>

-          <p>The following part is useful for not saving the source json on the index which reduces the index size significantly. Be

-                aware that you shouldn't do this if you will need to re-index data on the ElasticSearch side or you need access to the

-                whole document:</p>

-          <source>

-"_source" : {

-  "excludes" : [ "file" ]

-},

-          </source>

-        </section>

-

-      </section>

-      

-      <section>

-        <title>Building the framework and the connectors using Apache Maven</title>

-        <p></p>

-        <p>ManifoldCF includes some support for building jars under Maven.  Apache Ant is considered to be ManifoldCF's primary build system, so your mileage with Maven may vary.</p>

-        <p>The biggest limitation of the current Maven build is that it does not support any of the proprietary connectors or the multi-process model of execution.

-            The build includes only the Apache-licensed and LGPL-licensed connectors, thus avoiding conditional compilation, and executes under Maven using only the

-            Quick Start example.</p>

-        <p>A canned version of all configuration files are included as resources.  If you want to change the configuration in any way, you will need to rebuild with Maven accordingly.</p>

-        <section>

-          <title>Preparation</title>

-          <p>No special preparation is required, other than to have access to the Apache Maven repository.</p>

-        </section>

-        <section>

-          <title>How to build</title>

-          <p>Building is straightforward.  In the ManifoldCF root, type:</p>

-          <source>

-mvn clean install

-          </source>

-          <p>This should generate all the necessary artifacts to run with, and also run the Hsqldb-based tests.</p>

-          <p>To build and skip only the integration tests, type:</p>

-          <source>

-mvn clean install -DskipITs   

-          </source>

-          <p>When you have the default package installed locally in your Maven repository, to only build ManifoldCF artifacts, type:</p>

-          <source>

-mvn clean package

-          </source>

-          <p>NOTE: Due to current limitations in the ManifoldCF Maven poms, you MUST run a complete "mvn clean install" as the first step.  You cannot skip steps, or the build will fail.</p>

-        </section>

-      </section>

-      

-      <section>

-        <title>Building ManifoldCF's Apache2 plugin</title>

-        <p></p>

-        <p>To build the mod-authz-annotate plugin, you need to start with a Unix system that has the apache2 development tools installed on it, plus the curl development package

-          (from <a href="http://curl.haxx.se">http://curl.haxx.se</a> or elsewhere).  Then, cd to mod-authz-annotate, and type "make".  The build will produce a file called

-          mod-authz-annotate.so, which should be copied to the appropriate Apache2 directory so it can be used as a plugin.</p>

-        <p></p>

-        <p></p>

-      </section>

-        

-    </section>

-    

-    <section>

-      <title>Running ManifoldCF</title>

-      <p></p>

-      <section>

-        <title>Overview</title>

-        <p>ManifoldCF consists of several components.  These are enumerated below:</p>

-        <p></p>

-        <ul>

-           <li>A database, which is where ManifoldCF keeps all of its configuration and state information, usually PostgreSQL</li>

-           <li>A synchronization directory, which how ManifoldCF coordinates activity among its various processes</li>

-           <li>An <strong>agents</strong> process, which is the process that actually crawls documents and ingests them</li>

-           <li>A <strong>crawler-ui</strong> servlet, which presents the UI users interact with to configure and control the crawler</li>

-           <li>An <strong>authority-service</strong> servlet, which responds to requests for authorization tokens, given a user name</li>

-           <li>An <strong>api-service</strong> servlet, which responds to REST API requests</li>

-        </ul>

-        <p></p>

-        <p>These underlying components can be packaged in many ways.  For example, the three servlets can be deployed in separate

-          war fields as separate web applications.  One may also deploy all three servlets in one combined web application, and also include the

-          agents process.</p>

-        <p></p>

-      </section>

-      <p></p>

-      <section>

-        <title>Binary organization</title>

-        <p>Whether you build ManifoldCF yourself, or download a binary distribution, you will need to know what is what in the build result.  If you build ManifoldCF yourself, the binary build

-          result can be found in the subdirectory <em>dist</em>.  In a binary distribution, the contents of the distribution are the contents of the <em>dist</em> directory.

-          These contents are described below.</p>

-        <p></p>

-        <table>

-          <caption>Distribution directories and files</caption>

-          <tr><th><em>dist</em> file/directory</th><th>Meaning</th></tr>

-          <tr><td><em>connectors.xml</em></td><td>an xml file describing the connectors that should be registered</td></tr>

-          <tr><td><em>connector-lib</em></td><td>jars for all the connectors, referred to by properties.xml</td></tr>

-          <tr><td><em>connector-lib-proprietary</em></td><td>proprietary jars for all the connectors, referred to by properties.xml; not included in binary release</td></tr>

-          <tr><td><em>obfuscation-utility</em></td><td>a utility to obfuscate passwords, for inclusion in properties.xml fields</td></tr>

-          <tr><td><em>lib</em></td><td>jars for all of the examples, referenced by the example scripts</td></tr>

-          <tr><td><em>lib-proprietary</em></td><td>proprietary jars for all of the examples, referenced by the proprietary example scripts</td></tr>

-          <tr><td><em>processes</em></td><td>scripts, classpath jars, and -D switch values needed for the required connector-specific processes</td></tr>

-          <tr><td><em>script-engine</em></td><td>jars and scripts for running the ManifoldCF script interpreter</td></tr>

-          <tr><td><em>example</em></td><td>a jetty-based example that runs in a single process (except for any connector-specific processes), excluding all proprietary libraries</td></tr>

-          <tr><td><em>example-proprietary</em></td><td>a jetty-based example that runs in a single process (except for any connector-specific processes), including proprietary libraries; not included in binary release</td></tr>

-          <tr><td><em>multiprocess-file-example</em></td><td>scripts and jars for an example that uses the multiple process model using file-based synchronization, excluding all proprietary libraries</td></tr>

-          <tr><td><em>multiprocess-file-example-proprietary</em></td><td>scripts and jars for an example that uses the multiple process model using file-based synchronization, including proprietary libraries; not included in binary release</td></tr>

-          <tr><td><em>multiprocess-zk-example</em></td><td>scripts and jars for an example that uses the multiple process model using ZooKeeper-based synchronization, excluding all proprietary libraries</td></tr>

-          <tr><td><em>multiprocess-zk-example-proprietary</em></td><td>scripts and jars for an example that uses the multiple process model using ZooKeeper-based synchronization, including proprietary libraries; not included in binary release</td></tr>

-          <tr><td><em>web</em></td><td>app-server deployable web applications (wars), excluding all proprietary libraries</td></tr>

-          <tr><td><em>web-proprietary</em></td><td>app-server deployable web applications (wars), including proprietary libraries; not included in binary release</td></tr>

-          <tr><td><em>doc</em></td><td>javadocs for framework and all included connectors</td></tr>

-          <tr><td><em>plugins</em></td><td>pre-built integration components to deploy on target systems, e.g. for Solr</td></tr>

-          <tr><td><em>file-resources</em></td><td>a directory meant to contain file resources that are identically present on all cluster members, e.g. models for OpenNLP</td></tr>

-        </table>

-        <p></p>

-        <p>If you downloaded the binary distribution, you may notice that the <em>connector-lib-proprietary</em> directory contains only a number of 

-            <em>&#60;connector&#62;-README.txt</em> files.

-            This is because under Apache licensing rules, incompatibly-licensed jars may not be redistributed.  Each such <em>&#60;connector&#62;-README.txt</em> describes

-            the jars that you need to add to the <em>connector-lib-proprietary</em> directory in order to get the corresponding connector working.  You will also then need to uncomment

-            the appropriate entries in the <em>connectors.xml</em> file accordingly to enable the connector for use.</p>

-        <p></p>

-        <p>NOTE: The prebuilt binary distribution cannot, at this time, include support for MySQL.  Nor can the JDBC Connector access MySQL, MSSQL, SyBase, or Oracle databases in that

-            distribution.  In order to use these JDBC drivers, you must build ManifoldCF yourself.  Start by downloading the drivers and placing them in the <em>lib-proprietary</em> directory.  The command

-            <em>ant download-dependencies</em> will do most of this for you, with the exception of the Oracle JDBC driver.</p>

-        <p></p>

-        <p>The directory titled <em>processes</em> include separate processes which must be started in order for the associated connector to function.

-            The number of produced <em>processes</em> subdirectories may vary, because optional individual connectors may or may not supply processes that

-            must be run to support the connector.  For each of the <em>processes</em> subdirectories above, any scripts that pertain to that connector-supplied

-            process will be placed in the root level of the subdirectory.

-            The supplied scripts for a process generally take care of building an appropriate classpath and setting necessary -D switches.  (Note: none of the current

-            connectors require special -D switches at this time.)  If you need to construct a classpath by hand, it is important to remember that "more" is not necessarily

-            "better".  The process deployment strategy implied by the build structure has

-            been carefully thought out to avoid jar conflicts.  Indeed, several connectors are structured using multiple processes precisely for that reason.</p>

-        <p>The proprietary libraries required by the secondary process <em>processes</em> subdirectories should be in the directory <em>processes/xxx/lib-proprietary</em>.

-            These jars are not included in the binary distribution, and you will need to supply them in order to make the process work.  A README.txt file is placed

-            in each <em>lib-proprietary</em> directory describing what needs to be provided there.</p>

-        <p></p>

-        <p>The <em>plugins</em> directory contains components you may need to deploy on the target system to make the associated connector function correctly.  For example, the Solr

-            connector includes plug-in classes for enforcing ManifoldCF security on Solr 3.x and 4.x.  See the README file in each directory for detailed instructions on how to deploy the components.</p>

-        <p></p>

-        <p>The <em>file-resources</em> directory contains a README.txt file plus any files your connectors specifically need access to across all cluster members.

-            You should have an exact copy of this directory present on every machine that a related ManifoldCF process runs on, and the properties.xml file parameter

-            <em>org.apache.manifoldcf.fileresources</em> should point to it.  Any third-party or custom files needed by your connector configuration (e.g. OpenNLP models)

-            should be created or downloaded and placed here.</p>

-        <p></p>

-        <p>Inside the <em>example</em> directory, you will find everything you need to fire up ManifoldCF in a single-process model under Jetty.  Everything is included so that all you need to do is change

-            to that directory, and start it using the command <em>&lt;java&gt; -jar start.jar</em>.  This is described in more detail later, and is the recommended way for beginners to try out ManifoldCF.

-            The directory <em>example-proprietary</em> contains an equivalent example that includes proprietary connectors and jars.  This is the standard place to start if you build ManifoldCF yourself.</p>

-        <p></p>

-      </section>

-

-      <section>

-        <title>Example deployments</title>

-        <p>There are many different ways to run ManifoldCF out-of-the-box.  These are enumerated below:</p>

-        <ul>

-          <li>Quick-start single process model</li>

-          <li>Single-process deployable war</li>

-          <li>Simplified multi-process model</li>

-          <li>Command-driven multi-process model</li>

-        </ul>

-        <p>Each way has advantages and disadvantages.  For example, single-process models limit the flexibility of deploying ManifoldCF components.  Multi-process models require that

-          inter-process synchronization be properly configured.  If you are just starting out with ManifoldCF, we suggest you try the quick-start single process model first, since that is

-          the easiest.</p>

-        <section>

-          <title>Quick-start single process model</title>

-          <p></p>

-          <p>You can run most of ManifoldCF in a single process, for evaluation and convenience.  This single-process version uses Jetty to handle its web applications, and Hsqldb as

-            an embedded database.  All you need to do to run this version of ManifoldCF is to follow the Ant-based build instructions above, and then:</p>

-          <p></p>

-          <source>

-cd example

-start[.bat|.sh]

-          </source>

-          <p></p>

-          <p>In the quick-start model, all database initialization and connector registration takes place automatically whenever ManifoldCF is started (at the cost of some startup delay).

-            The crawler UI can be found at http://&#60;host&#62;:8345/mcf-crawler-ui.  The authority service can be found at http://&#60;host&#62;:8345/mcf-authority-service/UserACLs.

-            The programmatic API is at http://&#60;host&#62;:8345/mcf-api-service.</p>

-          <p></p>

-          <p>You can stop the quick-start ManifoldCF at any time using ^C, or by using the script <em>stop[.bat|.sh]</em></p>

-          <p></p>

-          <p>Bear in mind that Hsqldb is not as full-featured a database as is PostgreSQL.  This means that any performance testing you may do against the quick start example may

-            not be applicable to a full installation.  Furthermore, embedded Hsqldb only permits one process at a time to be connected to its databases, so you <strong>cannot</strong> use any

-            of the ManifoldCF commands (as described below) while the quick-start ManifoldCF is running.</p>

-          <p></p>

-          <p>Another caveat that you will need to be aware of with the quick-start version of ManifoldCF is that it in no way removes the need for you to run any separate processes

-            that individual connectors require.  Specifically, the Documentum and FileNet connectors require processes to be independently started in order to function.  You will need

-            to read about these connector-specific processes below in order to use the corresponding connectors.  Scripts for running these processes can be found in the directories

-            named <em>processes/xxx</em>.</p>

-          <p></p>

-        </section>

-        

-        <section>

-          <title>Single-process deployable war</title>

-          <p></p>

-          <p>Under the distribution directory <em>web/war</em>, there is a war file called <em>mcf-combined-service.war</em>.  This web application contains the exact same

-            functionality as the quick-start example, but bundled up as a single war instead.  An example script is provided to run this web application under Jetty.  You can execute

-            the script as follows:</p>

-          <p></p>

-          <source>

-  cd example

-  start-combined[.sh|.bat]

-          </source>

-          <p></p>

-          <p>The combined web service presents the crawler UI at the root path for the web application, which is <em>http://&#60;host&#62;:8345/mcf/</em>.  The authority

-            service functionality can be found at <em>http://&#60;host&#62;:8345/mcf/UserACLs</em>, similar to the quick-start example.  However, the programmatic API service has a path

-            other than the root: <em>http://&#60;host&#62;:8345/mcf/api/</em>.</p>

-          <p>The script that starts the combined-service web application uses the same database instance (Hsqldb by default) as does the quick-start, and the same <em>properties.xml</em>

-            file.  The same caveats about required individual connector processes also apply as they do for the quick-start example.</p>

-          <p></p>

-

-          <section>

-            <title>Running single-process combined war example using Tomcat</title>

-            <p>In order to run the ManifoldCF single-process combined war example under Tomcat, you will need to take the following steps:</p>

-            <p></p>

-            <ol>

-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>

-              <li>Start Tomcat.</li>

-              <li>Deploy and start the mcf-combined-service web application, preferably using the Tomcat administration client.</li>

-            </ol>

-          </section>

-

-        </section>

-

-        <section>

-          <title>Simplified multi-process model using file-based synchronization</title>

-          <p></p>

-          <p>ManifoldCF can also be deployed in a simplified multi-process model which uses files to synchronize processes.  Inside the <em>multiprocess-file-example</em> directory, you will find everything you need to do this.  (The

-              <em>multiprocess-file-example-proprietary</em> directory is similar but includes proprietary material and is available only if you build ManifoldCF yourself.)  Below is a list of

-              what you will find in this directory.</p>

-          <p></p>

-          <table>

-            <caption>File-based multiprocess example files and directories</caption>

-            <tr><th><em>multiprocess-file-example</em> file/directory</th><th>Meaning</th></tr>

-            <tr><td><em>web</em></td><td>Web applications that should be deployed on tomcat or the equivalent, plus recommended application server -D switch names and values</td></tr>

-            <tr><td><em>processes</em></td><td>classpath jars that should be included in the class path for all non-connector-specific processes, along with -D switches, using the same convention as described for tomcat, above</td></tr>

-            <tr><td><em>properties.xml</em></td><td>an example ManifoldCF configuration file, in the right place for the multiprocess script to find it</td></tr>

-            <tr><td><em>logging.xml</em></td><td>an example ManifoldCF logging configuration file, in the right place for the properties.xml to find it</td></tr>

-            <tr><td><em>syncharea</em></td><td>an example ManifoldCF synchronization directory, which must be writable in order for multiprocess ManifoldCF to work</td></tr>

-            <tr><td><em>logs</em></td><td>where the ManifoldCF logs get written to</td></tr>

-            <tr><td><em>start-database[.sh|.bat]</em></td><td>script to start the HSQLDB database</td></tr>

-            <tr><td><em>initialize[.sh|.bat]</em></td><td>script to create the database instance, create all database tables, and register connectors</td></tr>

-            <tr><td><em>start-webapps[.sh|.bat]</em></td><td>script to start Jetty with the ManifoldCF web applications deployed</td></tr>

-            <tr><td><em>start-agents[.sh|.bat]</em></td><td>script to start the (first) agents process</td></tr>

-            <tr><td><em>start-agents-2[.sh|.bat]</em></td><td>script to start a second agents process</td></tr>

-            <tr><td><em>stop-agents[.sh|.bat]</em></td><td>script to stop all running agents processes cleanly</td></tr>

-            <tr><td><em>lock-clean[.sh|.bat]</em></td><td>script to clean up dirty locks (run only when all webapps and processes are stopped)</td></tr>

-          </table>

-          <p></p>

-          <section>

-            <title>Initializing the database and running</title>

-            <p></p>

-            <p>If you run the file-based multiprocess model, after you first start the database (using <em>start-database[.sh|.bat]</em>), you will need to initialize the database before you start the agents process or use the crawler UI.  To do this, all you need to do is

-                run the <em>initialize[.sh|.bat]</em> script.  Then, you will need to start the web applications (using <em>start-webapps[.sh|.bat]</em>) and the agents process (using

-                <em>start-agents[.sh|.bat]</em>), and optionally the second agents process (using <em>start-agents-2[.sh|.bat]</em>).</p>

-            <p></p>

-          </section>

-

-          <section>

-            <title>Running multiprocess file-based example using Tomcat</title>

-            <p>In order to run the ManifoldCF multiprocess file-based example under Tomcat, you will need to take the following steps:</p>

-            <p></p>

-            <ol>

-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>

-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>

-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>

-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>

-              <li>Start Tomcat.</li>

-              <li>Deploy and start the mcf-crawler-ui, mcf-authority-service, and mcf-api-service web applications, preferably using the Tomcat administration client.</li>

-            </ol>

-          </section>

-

-        </section>

-

-        <section>

-          <title>Simplified multi-process model using ZooKeeper-based synchronization</title>

-          <p></p>

-          <p>ManifoldCF can be deployed in a simplified multi-process model which uses Apache ZooKeeper to synchronize processes.  Inside the <em>multiprocess-kz-example</em> directory, you will find everything you need to do this.  (The

-              <em>multiprocess-zk-example-proprietary</em> directory is similar but includes proprietary material and is available only if you build ManifoldCF yourself.)  Below is a list of

-              what you will find in this directory.</p>

-          <p></p>

-          <table>

-            <caption>ZooKeeper-based multiprocess example files and directories</caption>

-            <tr><th><em>multiprocess-zk-example</em> file/directory</th><th>Meaning</th></tr>

-            <tr><td><em>web</em></td><td>Web applications that should be deployed on tomcat or the equivalent, plus recommended application server -D switch names and values</td></tr>

-            <tr><td><em>processes</em></td><td>classpath jars that should be included in the class path for all non-connector-specific processes, along with -D switches, using the same convention as described for tomcat, above</td></tr>

-            <tr><td><em>properties.xml</em></td><td>an example ManifoldCF configuration file, in the right place for the multiprocess script to find it</td></tr>

-            <tr><td><em>properties-global.xml</em></td><td>an example ManifoldCF shared configuration file, in the right place for the setglobalproperties script to find it</td></tr>

-            <tr><td><em>logging.xml</em></td><td>an example ManifoldCF logging configuration file, in the right place for the properties.xml to find it</td></tr>

-            <tr><td><em>zookeeper</em></td><td>the example ZooKeeper storage directory, which must be writable in order for ZooKeeper to work</td></tr>

-            <tr><td><em>logs</em></td><td>where the ManifoldCF logs get written to</td></tr>

-            <tr><td><em>runzookeeper[.sh|.bat]</em></td><td>script to run a ZooKeeper server instance</td></tr>

-            <tr><td><em>setglobalproperties[.sh|.bat]</em></td><td>script to initialize ZooKeeper with properties from properties-global.xml</td></tr>

-            <tr><td><em>start-database[.sh|.bat]</em></td><td>script to start the HSQLDB database</td></tr>

-            <tr><td><em>initialize[.sh|.bat]</em></td><td>script to create the database instance, create all database tables, and register connectors</td></tr>

-            <tr><td><em>start-webapps[.sh|.bat]</em></td><td>script to start Jetty with the ManifoldCF web applications deployed</td></tr>

-            <tr><td><em>start-agents[.sh|.bat]</em></td><td>script to start (the first) agents process</td></tr>

-            <tr><td><em>start-agents-2[.sh|.bat]</em></td><td>script to start a second agents process</td></tr>

-            <tr><td><em>stop-agents[.sh|.bat]</em></td><td>script to stop all running agents processes cleanly</td></tr>

-          </table>

-          <p></p>

-          <section>

-            <title>Initializing the database and running</title>

-            <p></p>

-            <p>If you run the ZooKeeper-based multiprocess example, then you must follow the following steps:</p>

-            <p></p>

-            <ol>

-              <li>Start ZooKeeper (using the <em>runzookeeper[.sh|.bat]</em> script)</li>

-              <li>Initialize the ManifoldCF shared configuration data (using <em>setglobalproperties[.sh|.bat]</em>)</li>

-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>

-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>

-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>

-              <li>Start the web applications (using <em>start-webapps[.sh|.bat]</em>)</li>

-            </ol>

-            <p></p>

-          </section>

-

-          <section>

-            <title>Running multiprocess ZooKeeper example using Tomcat</title>

-            <p>In order to run the ManifoldCF ZooKeeper example under Tomcat, you will need to take the following steps:</p>

-            <p></p>

-            <ol>

-              <li>Start ZooKeeper (using the <em>runzookeeper[.sh|.bat]</em> script)</li>

-              <li>Initialize the ManifoldCF shared configuration data (using <em>setglobalproperties[.sh|.bat]</em>)</li>

-              <li>Start the database (using <em>start-database[.sh|.bat]</em>)</li>

-              <li>Initialize the database (using <em>initialize[.sh|.bat]</em>)</li>

-              <li>Start the agents process (using <em>start-agents[.sh|.bat]</em>, and optionally <em>start-agents-2[.sh|.bat]</em>)</li>

-              <li>Modify the Tomcat startup script, or use the Tomcat service administration client, to set a Java "-Dorg.apache.manifoldcf.configfile" switch to point to the example's <em>properties.xml</em> file.</li>

-              <li>Start Tomcat.</li>

-              <li>Deploy and start the mcf-crawler-ui, mcf-authority-service, and mcf-api-service web applications, preferably using the Tomcat administration client.</li>

-            </ol>

-          </section>

-          

-        </section>

-

-        <section>

-          <title>Command-driven multi-process model</title>

-          <p></p>

-          <p>The most generic way of deploying ManifoldCF involves calling ManifoldCF operations using scripts.  There are a number of java classes among the ManifoldCF classes

-            that are intended to be called directly, to perform specific actions in the environment or in the database.  These classes are usually invoked from the command line, with

-            appropriate arguments supplied, and are thus considered to be ManifoldCF <strong>commands</strong>.  Basic functionality supplied by these command classes is

-            as follows:</p>

-

-          <p></p>

-          <ul>

-             <li>Create/Destroy the ManifoldCF database instance</li>

-             <li>Start/Stop the <strong>agents</strong> process</li>

-             <li>Register/Unregister an agent class (there's currently only one included)</li>

-             <li>Register/Unregister an output connector</li>

-             <li>Register/Unregister a transformation connector</li>

-             <li>Register/Unregister a repository connector</li>

-             <li>Register/Unregister an authority connector</li>

-             <li>Register/Unregister a mapping connector</li>

-             <li>Clean up synchronization directory garbage resulting from an ungraceful interruption of an ManifoldCF process</li>

-             <li>Query for certain kinds of job-related information</li>

-          </ul>

-          <p></p>

-          <p>Individual connectors may contribute additional command classes and processes to this picture.</p>

-          <p></p>

-          <p>The multiprocess command execution scripts are delivered in the <em>processes</em> subdirectory.  The script for executing commands is

-            <em>processes/executecommand[.sh|.bat]</em>. This script requires two environment variables to be set before execution: JAVA_HOME, and

-            MCF_HOME, which should point to ManifoldCF's home execution directory, where the <em>properties.xml</em> file is found.)</p>

-            

-          <p></p>

-          <p>The basic steps required to set up and run ManifoldCF in command-driven file-based multi-process mode are as follows:</p>

-          <p></p>

-          <ul>

-            <li>Install PostgreSQL or MySQL.  The PostgreSQL JDBC driver included with ManifoldCF is known to work with version 9.1, so that version is the currently recommended

-              one.  If you want to use MySQL, the ant "download-dependencies" build target will fetch the appropriate MySQL JDBC driver.</li>

-            <li>Configure the database for your environment; the default configuration is acceptable for testing and experimentation.</li>

-            <li>Create the database instance (see commands below)</li>

-            <li>Initialize the database instance (see commands below)</li>

-            <li>Register the pull agent (org.apache.manifoldcf.crawler.system.CrawlerAgent, see below)</li>

-            <li>Register your connectors and authorities (see below)</li>

-            <li>Install a Java application server, such as Tomcat.</li>

-            <li>Deploy the war files from <em>web/war</em>, except for <em>mcf-combined.war</em>, to your application server (see below).</li>

-            <li>Set the starting environment variables for your app server to include any -D commands found in <em>web/define</em>.  The -D commands should be of the

-              form, "-D&#60;file name&#62;=&#60;file contents&#62;".  You will also need a "-Dorg.apache.manifoldcf.configfile=&#60;properties file&#62;" define option, or the

-              equivalent, in the application server's JVM startup in order for ManifoldCF to be able to locate its configuration file.</li>

-            <li>Use the <em>processes/executecommand[.bat|.sh]</em> command from execute the appropriate commands from the next section below, being sure to first set the

-              JAVA_HOME and MCF_HOME environment variables properly.</li>

-            <li>Start any supporting processes that result from your build.  (Some connectors such as Documentum and FileNet have auxiliary processes you need to run to make

-              these connectors functional.)</li>

-            <li>Start your application server.</li>

-            <li>Start the ManifoldCF agents process.</li>

-            <li>At this point, you should be able to interact with the ManifoldCF UI, which can be accessed via the mcf-crawler-ui web application</li>

-          </ul>

-          <p></p>

-          <p>The detailed list of commands is presented below.</p>

-          <p></p>

-          <section>

-            <title>Commands</title>

-            <p></p>

-            <p>After you have created the necessary configuration files, you will need to initialize the database, register the "pull-agent" agent, and then register your individual connectors.

-              ManifoldCF provides a set of commands for performing these actions, and others as well.  The classes implementing these commands are specified below.</p>

-            <p></p>

-            <table>

-              <tr><th>Core Command Class</th><th>Arguments</th><th>Function</th></tr>

-              <tr><td>org.apache.manifoldcf.core.DBCreate</td><td><em>dbuser</em> [<em>dbpassword</em>]</td><td>Create ManifoldCF database instance</td></tr>

-              <tr><td>org.apache.manifoldcf.core.DBDrop</td><td><em>dbuser</em> [<em>dbpassword</em>]</td><td>Drop ManifoldCF database instance</td></tr>

-              <tr><td>org.apache.manifoldcf.core.LockClean</td><td>None</td><td>Clean out synchronization directory</td></tr>

-              <tr><td>org.apache.manifoldcf.core.Obfuscate</td><td>string</td><td>Obfuscate a string, for use as an obfuscated parameter value</td></tr>

-            </table>

-            <p></p>

-            <table>

-              <tr><th>Agents Command Class</th><th>Arguments</th><th>Function</th></tr>

-              <tr><td>org.apache.manifoldcf.agents.Install</td><td>None</td><td>Create ManifoldCF agents tables</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.Uninstall</td><td>None</td><td>Remove ManifoldCF agents tables</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.Register</td><td><em>classname</em></td><td>Register an agent class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.UnRegister</td><td><em>classname</em></td><td>Un-register an agent class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAll</td><td>None</td><td>Un-register all current agent classes</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.SynchronizeAll</td><td>None</td><td>Un-register all registered agent classes that can't be found</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.RegisterOutput</td><td><em>classname</em> <em>description</em></td><td>Register an output connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.UnRegisterOutput</td><td><em>classname</em></td><td>Un-register an output connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAllOutputs</td><td>None</td><td>Un-register all current output connector classes</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.SynchronizeOutputs</td><td>None</td><td>Un-register all registered output connector classes that can't be found</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.RegisterTransformation</td><td><em>classname</em> <em>description</em></td><td>Register a transformation connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.UnRegisterTransformation</td><td><em>classname</em></td><td>Un-register a transformation connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.UnRegisterAllTransformations</td><td>None</td><td>Un-register all current transformation connector classes</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.SynchronizeTransformations</td><td>None</td><td>Un-register all registered transformation connector classes that can't be found</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.AgentRun</td><td>None</td><td>Main <strong>agents</strong> process class</td></tr>

-              <tr><td>org.apache.manifoldcf.agents.AgentStop</td><td>None</td><td>Stops the running <strong>agents</strong> process</td></tr>

-            </table>

-            <p></p>

-            <table>

-              <tr><th>Crawler Command Class</th><th>Arguments</th><th>Function</th></tr>

-              <tr><td>org.apache.manifoldcf.crawler.Register</td><td><em>classname</em> <em>description</em></td><td>Register a repository connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.crawler.UnRegister</td><td><em>classname</em></td><td>Un-register a repository connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.crawler.UnRegisterAll</td><td>None</td><td>Un-register all repository connector classes</td></tr>

-              <tr><td>org.apache.manifoldcf.crawler.SynchronizeConnectors</td><td>None</td><td>Un-register all registered repository connector classes that can't be found</td></tr>

-              <tr><td>org.apache.manifoldcf.crawler.ExportConfiguration</td><td><em>filename</em> [<em>passcode</em>]</td><td>Export crawler configuration to a file</td></tr>

-              <tr><td>org.apache.manifoldcf.crawler.ImportConfiguration</td><td><em>filename</em> [<em>passcode</em>]</td><td>Import crawler configuration from a file</td></tr>

-            </table>

-            <p></p>

-            <p>NOTE: By adding a passcode as a second argument to the ExportConfiguration command class, the exported file will be encrypted by using the AES algorithm. This can be useful to

-              prevent repository passwords to be stored in clear text. In order to use this functionality, you must enter a salt value to your configuration file. The same passcode along

-              with the salt value are used to decrypt the file with the ImportConfiguration command class. See the documentation for the commands and properties above to find the

-              correct arguments and settings.</p>

-            <p></p>

-            <table>

-              <tr><th>Authorization Domain Command Class</th><th>Arguments</th><th>Function</th></tr>

-              <tr><td>org.apache.manifoldcf.authorities.RegisterDomain</td><td><em>domainname</em> <em>description</em></td><td>Register an authorization domain</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterDomain</td><td><em>domainname</em></td><td>Un-register an authorization domain</td></tr>

-            </table>

-            <p></p>

-            <table>

-              <tr><th>User Mapping Command Class</th><th>Arguments</th><th>Function</th></tr>

-              <tr><td>org.apache.manifoldcf.authorities.RegisterMapper</td><td><em>classname</em> <em>description</em></td><td>Register a mapping connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterMapper</td><td><em>classname</em></td><td>Un-register a mapping connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAllMappers</td><td>None</td><td>Un-register all mapping connector classes</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.SynchronizeMappers</td><td>None</td><td>Un-register all registered mapping connector classes that can't be found</td></tr>

-            </table>

-            <p></p>

-            <table>

-              <tr><th>Authority Command Class</th><th>Arguments</th><th>Function</th></tr>

-              <tr><td>org.apache.manifoldcf.authorities.RegisterAuthority</td><td><em>classname</em> <em>description</em></td><td>Register an authority connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAuthority</td><td><em>classname</em></td><td>Un-register an authority connector class</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.UnRegisterAllAuthorities</td><td>None</td><td>Un-register all authority connector classes</td></tr>

-              <tr><td>org.apache.manifoldcf.authorities.SynchronizeAuthorities</td><td>None</td><td>Un-register all registered authority connector classes that can't be found</td></tr>

-            </table>

-            <p></p>

-            <p>Remember that you need to include all the jars under <em>multiprocess-file-example/processes/lib</em> in the classpath whenever you run one of these commands!

-                But, luckily, there are scripts which do this for you.  These can be found in <em>multiprocess-file-example/processes/executecommand[.sh,.bat]</em>.

-                The scripts require some environment variables to be set, such as <em>MCF_HOME</em> and <em>JAVA_HOME</em>, and expect the configuration file to be

-                found at <em>MCF_HOME/properties.xml</em>.</p>

-            <p></p>

-          </section>

-          <section>

-            <title>Deploying the <strong>mcf-crawler-ui</strong>, <strong>mcf-authority-service</strong>, and <strong>mcf-api-service</strong> web applications</title>

-            <p></p>

-            <p>If you built ManifoldCF using ant, then the ant build will have constructed four war files for you under <em>web/war</em>.  You should ignore the <em>mcf-combined</em>

-                war in this directory for this deployment model.  If you intend to run ManifoldCF in multiprocess mode, you will need to deploy the other web applications on you application server.

-                There is no requirement that the <strong>mcf-crawler-ui</strong>, <strong>mcf-authority-service</strong>, and <strong>mcf-api-service</strong> web

-                applications be deployed on the same instance of the application server.  With the current architecture of ManifoldCF, they must be deployed on the same physical server, however.</p>

-            <p></p>

-            <p>For each of the application servers involved with ManifoldCF, you must set the following define, so that the ManifoldCF web applications can locate the configuration file:</p>

-            <source>

--Dorg.apache.manifoldcf.configfile=&#60;configuration file path&#62;

-            </source>

-            <p></p>

-          </section>

-          <section>

-            <title>Running the <strong>agents</strong> process</title>

-            <p></p>

-            <p>The <strong>agents</strong> process is the process that actually performs the crawling for ManifoldCF.  Start this process by running the command

-              "org.apache.manifoldcf.agents.AgentRun".  This class will run until stopped by invoking the command "org.apache.manifoldcf.agents.AgentStop".  It is highly

-              recommended that you stop the process in this way.  You may also stop the process using a SIGTERM signal, but "kill -9" or the equivalent is NOT recommended,

-              because that may result in dangling locks in the ManifoldCF synchronization directory.  (If you have to, clean up these locks by shutting down all ManifoldCF

-              processes, including the application server instances that are running the web applications, and invoking the command "org.apache.manifoldcf.core.LockClean".)</p>

-            <p></p>

-          </section>

-        </section>

-      </section>

-      

-      <section>

-        <title>The <em>connectors.xml</em> configuration file</title>

-        <p></p>

-        <p>The quick-start, combined, and simplified multi-process sample deployments of ManifoldCF have their own configuration file, called <em>connectors.xml</em>,

-          which is used to register the available connectors in the database.  The file has this basic format:</p>

-        <p></p>

-        <source>

-&#60;?xml version="1.0" encoding="UTF-8" ?&#62;

-&#60;connectors&#62;

- (clauses)

-&#60;/connectors&#62;

-        </source>

-        <p></p>

-        <p>The following tags are available to specify your connectors and authorization domains:</p>

-        <p></p>

-        <p>&#60;repositoryconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>

-        <p>&#60;authorityconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>

-        <p>&#60;mappingconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>

-        <p>&#60;outputconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>

-        <p>&#60;transformationconnector name="<em>pretty_name</em>" class="<em>connector_class</em>"/&#62;</p>

-        <p>&#60;authorizationdomain name="<em>pretty_name</em>" domain="<em>domain_name</em>"/&#62;</p>

-        <p></p>

-        <p>The <em>connectors.xml</em> file typically has some connectors commented out - namely the ones build with stubs which require you to supply a

-          third-party library in order for the connector to run.  If you build ManifoldCF yourself, the <em>example-proprietary</em> and <em>multiprocess-file-example-proprietary</em>

-          and <em>multiprocess-zk-example-proprietary</em> directories instead use <em>connectors-proprietary.xml</em>.  The connectors you build against the proprietary libraries you supply will not have their

-          <em>connectors-proprietary.xml</em> tags commented out.</p>

-        <p></p>

-      </section>

-

-      <section>

-        <title>Running connector-specific processes</title>

-        <p></p>

-        <p>Connector-specific processes require the classpath for their invocation to include all the jars that are in the corresponding

-          <em>processes/&#60;process_name&#62;</em> directory.  The Documentum and FileNet connectors are the only two connectors that currently require additional processes. 

-          Start these processes using the commands listed below, and stop them with SIGTERM (or ^C, if they are running in a shell).</p>

-        <p></p>

-        <table>

-          <tr><th>Connector</th><th>Process</th><th>Main class</th><th>Script name (relative to <em>dist</em>)</th></tr>

-          <tr><td>Documentum</td><td>processes/documentum-server</td><td>org.apache.manifoldcf.crawler.server.DCTM.DCTM</td><td>processes/documentum-server/run[.sh|.bat]</td></tr>

-          <tr><td>Documentum</td><td>processes/documentum-registry</td><td>org.apache.manifoldcf.crawler.registry.DCTM.DCTM</td><td>processes/documentum-registry/run[.sh|.bat]</td></tr>

-          <tr><td>FileNet</td><td>processes/filenet-server</td><td>org.apache.manifoldcf.crawler.server.filenet.Filenet</td><td>processes/filenet-server/run[.sh|.bat]</td></tr>

-          <tr><td>FileNet</td><td>processes/filenet-registry</td><td>org.apache.manifoldcf.crawler.registry.filenet.Filenet</td><td>processes/filenet-registry/run[.sh|.bat]</td></tr>

-        </table>

-        <p>The registry process in all cases must be started before the corresponding server process, or the server process will report an error.  (It will, however, retry after some period of time.)

-            The scripts all require an MCF_HOME environment variable pointing to the place where properties.xml is found, as well as a JAVA_HOME environment variable pointing the JDK.

-            The server scripts also require other environment variables as well, consistent with the needs of the DFC or the FileNet API respectively.  For example, DFC requires the

-            DOCUMENTUM environment variable to be set, while the FileNet server script requires the WASP_HOME environment variable.</p>

-        <p>It is important to understand that the scripts work by building a classpath out of all jars that get copied into the <em>lib</em> and <em>lib-proprietary</em> directory underneath

-            each process during the ant build.  The <em>lib-proprietary</em> jars cannot be distributed in the binary version of ManifoldCF, so if you use this option you will still need to

-            copy them there yourself for the processes to run.  If you build ManifoldCF yourself, these jars are copied from the <em>lib-proprietary</em> directories underneath the documentum

-            or filenet connector directories.  For the server startup scripts to work properly, the <em>lib-proprietary</em> directories should have <strong>all</strong> of the jars needed to

-            allow the api code to function.</p>

-        <p></p>

-      </section>

-

-      <section>

-        <title>Database selection</title>

-        <p></p>

-        <p>You have a variety of open-source databases to choose from when deploying ManifoldCF.  The supported databases each have their own strengths and weaknesses, and

-          are listed below:</p>

-        <ul>

-          <li>PostgreSQL (preferred)</li>

-          <li>MySQL (preferred)</li>

-          <li>MariaDB (not yet evaluated))</li>

-          <li>HSQLDB</li>

-        </ul>

-        <p>You can select the database of your choice by setting the approprate properties in the applicable <em>properties.xml</em> file.  The choice of database is largely orthogonal

-          to the choice of deployment model.  The ManifoldCF deployment examples provided can thus be readily altered to use the database you desire.  The details and caveats of

-          each choice is described below.</p>

-        <p></p>

-        <section>

-          <title>Configuring a PostgreSQL database</title>

-          <p></p>

-          <p>Despite having an internal architecture that cleanly abstracts from specific database details, ManifoldCF is currently fairly specific to PostgreSQL at this time.  There are a number of reasons for this.</p>

-          <p></p>

-          <ul>

-             <li>ManifoldCF uses the database for its document queue, which places a significant load on it.  The back-end database is thus a significant factor in ManifoldCF's performance.  But, in exchange, ManifoldCF benefits enormously from the underlying ACID properties of the database.</li>

-             <li>The strategy for getting optimal query plans from the database is not abstracted.  For example, PostgreSQL 8.3+ is very sensitive to certain statistics about a database table, and will not generate a performant plan if the statistics are inaccurate by even a little, in some cases.  So, for PostgreSQL, the database table must be analyzed very frequently, to avoid catastrophically bad plans.  But luckily, PostgreSQL is pretty good at doing analysis quickly.  Oracle, on the other hand, takes a very long time to perform analysis, but its plans are much less sensitive.</li>

-             <li>PostgreSQL always does a sequential scan in order to count the number of rows in a table, while other databases return this efficiently.  This has affected the design of the ManifoldCF UI.</li>

-             <li>The choice of query form influences the query plan.  Ideally, this is not true, but for both PostgreSQL and for (say) Oracle, it is.</li>

-             <li>PostgreSQL has a high degree of parallelism and lack of internal single-threadedness.</li>

-          </ul>

-          <p></p>

-          <p>ManifoldCF has been tested against version 8.3.7, 8.4.5, 9.1, 9.2, and 9.3 of PostgreSQL.  We recommend the following configuration parameter settings to work optimally with ManifoldCF:</p>

-          <p></p>

-          <ul>

-             <li>A default database encoding of UTF-8</li>

-             <li><em>postgresql.conf</em> settings as described in the table below</li>

-             <li><em>pg_hba.conf</em> settings to allow password access for TCP/IP connections from ManifoldCF</li>

-             <li>A maintenance strategy involving cronjob-style vacuuming, rather than PostgreSQL autovacuum</li>

-          </ul>

-          <p></p>

-          <table>

-            <caption>Postgresql.conf parameters</caption>

-            <tr><th><em>postgresql.conf</em> parameter</th><th>Tested value</th></tr>

-            <tr><td>standard_conforming_strings</td><td>on</td></tr>

-            <tr><td>shared_buffers</td><td>1024MB</td></tr>

-            <tr><td>checkpoint_segments</td><td>300</td></tr>

-            <tr><td>maintenance<em>work</em>mem</td><td>2MB</td></tr>

-            <tr><td>tcpip_socket</td><td>true</td></tr>

-            <tr><td>max_connections</td><td>400</td></tr>

-            <tr><td>checkpoint_timeout</td><td>900</td></tr>

-            <tr><td>datestyle</td><td>ISO,European</td></tr>

-            <tr><td>autovacuum</td><td>off</td></tr>

-          </table>

-          <p></p>

-          <p>Note well: The <em>standard_conforming_strings</em> parameter setting is important to prevent any possibility of SQL injection attacks.  While ManifoldCF

-            uses parameterized queries in almost all cases, when it does do string quoting it presumes that the SQL standard for quoting is adhered to.  It is in general good practice

-            to set this parameter when working with PostgreSQL for this reason.</p>

-          <p></p>

-          <section>

-            <title>A note about PostgreSQL database maintenance</title>

-            <p></p>

-            <p>PostgreSQL's architecture causes it to accumulate dead tuples in its data files, which do not interfere with its performance but do bloat the database over time.  The

-              usage pattern of ManifoldCF is such that it can cause significant bloat to occur to the underlying PostgreSQL database in only a few days, under sufficient load.  PostgreSQL

-              has a feature to address this bloat, called <strong>vacuuming</strong>.  This comes in three varieties: autovacuum, manual vacuum, and manual full vacuum.</p>

-            <p></p>

-            <p>We have found that PostgreSQL's autovacuum feature is inadequate under such conditions, because it not only fights for database resources pretty much all the time,

-              but it falls further and further behind as well.  PostgreSQL's in-place manual vacuum functionality is a bit better, but is still much, much slower than actually making a new

-              copy of the database files, which is what happens when a manual full vacuum is performed.</p>

-            <p></p>

-            <p>Dead-tuple bloat also occurs in indexes in PostgreSQL, so tables that have had a lot of activity may benefit from being reindexed at the time of maintenance. </p>

-            <p>We therefore recommend periodic, scheduled maintenance operations instead, consisting of the following:</p>

-            <p></p>

-            <ul>

-             <li>VACUUM FULL VERBOSE;</li>

-             <li>REINDEX DATABASE &#60;the_db_name&#62;;</li>

-            </ul>

-            <p> </p>

-            <p>During maintenance, PostgreSQL locks tables one at a time.  Nevertheless, the crawler ui may become unresponsive for some operations, such as when counting

-              outstanding documents on the job status page.  ManifoldCF thus has the ability to check for the existence of a file prior to such sensitive operations, and will display a

-              useful "maintenance in progress" message if that file is found.  This allows a user to set up a maintenance system that provides adequate feedback for an ManifoldCF

-              user of the overall status of the system.</p>

-            <p></p>

-          </section>

-        </section>

-

-        <section>

-          <title>Configuring a MySQL database</title>

-          <p></p>

-          <p>MySQL is not quite as fast as PostgreSQL, but it is a relatively close second in performance tests.  Nevertheless, the ManifoldCF team does not have a large amount

-            of experience with this database at this time.  More details will be added to this section as information and experience becomes available.</p>

-        </section>

-        

-        <section>

-          <title>Configuring an HSQLDB database</title>

-          <p></p>

-          <p>HSQLDB's performance seems closely tied to how much of the database can be actually held in memory.  Performance at this time is about half that of PostgreSQL.</p>

-          <p>HSQLDB can be used with ManifoldCF in either an embedded fashion (which only works with single-process deployments), or in external fashion, with a database instance running in a separate

-            process.  See the <em>properties.xml</em> property descriptions for configuration details.</p>

-        </section>

-        

-      </section>

-        

-      <section>

-        <title>The ManifoldCF configuration files</title>

-        <p></p>

-        <p>Currently, ManifoldCF requires two configuration files: the main configuration property file, and the logging configuration file.</p>

-        <p></p>

-        <section>

-          <title><em>properties.xml</em> file properties</title>

-

-          <p>The <em>properties.xml</em> property file path can be specified by the system property "org.apache.manifoldcf.configfile".  If not specified through a -D operation, its

-              name is presumed to be <em>&#60;user_home&#62;/lcf/properties.xml</em>.  The form of the property file is XML, of the following basic form:</p>

-          <p></p>

-          <source>

-&#60;?xml version="1.0" encoding="UTF-8" ?&#62;

-&#60;configuration&#62;

- (clauses)

-&#60;/configuration&#62;

-          </source>

-          <p></p>

-          <p>The <em>properties.xml</em> file allows properties to be specified.  A property clause has the form:</p>

-          <p></p>

-          <p>&#60;property name="<em>property_name</em>" value="<em>property_value</em>"/&#62;</p>

-          <p></p>

-          <p>One of the optional properties is the name of the logging configuration file.  This property's name is "org.apache.manifoldcf.logconfigfile".  If not present, the logging configuration file will be assumed to be <em>&#60;user_home&#62;/manifoldcf/logging.xml</em>.  The logging configuration file is a standard commons-logging property file, and should be formatted accordingly.</p>

-          <p></p>

-          <p>Note that all properties described below can also be specified on the command line, via a -D switch.  If both methods of setting the property are used, the -D switch value will override the property file value.</p>

-          <p></p>

-          <p>The following table describes the configuration property file properties, and what they do:</p>

-          <p></p>

-          <table>

-            <caption>property.xml properties</caption>

-            <tr><th>Property</th><th>Required?</th><th>Function</th></tr>

-            <tr><td>org.apache.manifoldcf.authimplementationclass</td><td>No</td><td>Auth implementation class (defaults to "org.apache.manifoldcf.core.auth.DefaultAuthenticator", set to "org.apache.manifoldcf.core.auth.LdapAuthenticator" for LDAP)</td></tr>

-            <tr><td>org.apache.manifoldcf.login.name</td><td>No</td><td>Default auth implementation crawler UI login user ID (defaults to "admin")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.password</td><td>No</td><td>Default auth implementation crawler UI login user password (defaults to "admin")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.password.obfuscated</td><td>No</td><td>Default auth implementation obfuscated crawler UI login user password (defaults to "admin")</td></tr>

-            <tr><td>org.apache.manifoldcf.apilogin.name</td><td>No</td><td>Default auth implementation API login user ID (defaults to "")</td></tr>

-            <tr><td>org.apache.manifoldcf.apilogin.password</td><td>No</td><td>Default auth implementation API login user password (defaults to "")</td></tr>

-            <tr><td>org.apache.manifoldcf.apilogin.password.obfuscated</td><td>No</td><td>Default auth implementation obfuscated API login user password (defaults to "")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.ldap.providerurl</td><td>No</td><td>LDAP auth implementation provider URL (defaults to "")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.ldap.securityauthenticationtype</td><td>No</td><td>LDAP auth implementation auth type (defaults to "simple")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.ldap.securityprincipal</td><td>No</td><td>LDAP auth implementation security principal (defaults to "")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.ldap.contextsearchquery</td><td>No</td><td>LDAP auth implementation search query (defaults to "")</td></tr>

-            <tr><td>org.apache.manifoldcf.login.ldap.searchattribute</td><td>No</td><td>LDAP auth implementation search attribute (defaults to "uid")</td></tr>

-            <tr><td>org.apache.manifoldcf.crawleruiwarpath</td><td>Yes, for Jetty</td><td>Location of Crawler UI war</td></tr>

-            <tr><td>org.apache.manifoldcf.authorityservicewarpath</td><td>Yes, for Jetty</td><td>Location of Authority Service war</td></tr>

-            <tr><td>org.apache.manifoldcf.apiservicewarpath</td><td>Yes, for Jetty</td><td>Location of API Service war</td></tr>

-            <tr><td>org.apache.manifoldcf.usejettyparentclassloader</td><td>Yes, for Jetty</td><td>true for single-process example, false for multiprocess example.</td></tr>

-            <tr><td>org.apache.manifoldcf.connectorsconfigurationfile</td><td>No</td><td>Location of connectors.xml file, for QuickStart, so ManifoldCF can register connectors.</td></tr>

-            <tr><td>org.apache.manifoldcf.dbsuperusername</td><td>No</td><td>Database superuser name, for QuickStart, so ManifoldCF can create database instance.</td></tr>

-            <tr><td>org.apache.manifoldcf.dbsuperuserpassword</td><td>No</td><td>Database superuser password, for QuickStart, so ManifoldCF can create database instance.</td></tr>

-            <tr><td>org.apache.manifoldcf.dbsuperuserpassword.obfuscated</td><td>No</td><td>Obfuscated database superuser password, for QuickStart, so ManifoldCF can create database instance.</td></tr>

-            <tr><td>org.apache.manifoldcf.ui.maxstatuscount</td><td>No</td><td>The maximum number of documents ManifoldCF will try to count for the job status display.  Defaults to 500000.</td></tr>

-            <tr><td>org.apache.manifoldcf.databaseimplementationclass</td><td>No</td><td>Specifies the class to use to implement database access.

-                Default is a built-in Hsqldb implementation.  Supported choices are:

-                org.apache.manifoldcf.core.database.DBInterfacePostgreSQL, 

-                org.apache.manifoldcf.core.database.DBInterfaceMySQL,

-                org.apache.manifoldcf.core.database.DBInterfaceMariaDB,

-                org.apache.manifoldcf.core.database.DBInterfaceHSQLDB</td></tr>

-            <tr><td>org.apache.manifoldcf.postgresql.hostname</td><td>No</td><td>PostgreSQL server host name, or localhost if not specified.</td></tr>

-            <tr><td>org.apache.manifoldcf.postgresql.port</td><td>No</td><td>PostgreSQL server port, or standard port if not specified.</td></tr>

-            <tr><td>org.apache.manifoldcf.postgresql.ssl</td><td>No</td><td>Set to "true" for ssl communication with PostgreSQL.</td></tr>

-            <tr><td>org.apache.manifoldcf.mysql.server</td><td>No</td><td>The MySQL or MariaDB server name.  Defaults to 'localhost'.</td></tr>

-            <tr><td>org.apache.manifoldcf.mysql.client</td><td>No</td><td>The MySQL or MariaDB client property.  Defaults to 'localhost'.  You may want to set this to '%' for a multi-machine setup.</td></tr>

-            <tr><td>org.apache.manifoldcf.mysql.ssl</td><td>No</td><td>Set to "true" for ssl communication with MySQL or MariaDB.</td></tr>

-            <tr><td>org.apache.manifoldcf.hsqldbdatabasepath</td><td>No</td><td>Absolute or relative path to HSQLDB database; default is '.'.</td></tr>

-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseprotocol</td><td>Yes, for remote HSQLDB connection</td><td>The HSQLDB JDBC protocol; choices are 'hsql', 'http', or 'https'. Default is blank (which means an embedded instance)</td></tr>

-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseserver</td><td>Yes, for remote HSQLDB connection</td><td>The HSQLDB remote server name.</td></tr>

-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseport</td><td>No</td><td>The HSQLDB remote server port.</td></tr>

-            <tr><td>org.apache.manifoldcf.hsqldbdatabaseinstance</td><td>No</td><td>The HSQLDB remote database instance name.</td></tr>

-            <tr><td>org.apache.manifoldcf.lockmanagerclass</td><td>No</td><td>Specifies the class to use to implement synchronization.  Default

-                is either file-based synchronization or in-memory synchronization, using the org.apache.manifoldcf.core.lockmanager.LockManager class.

-                Options include org.apache.manifoldcf.core.lockmanager.BaseLockManager, org.apache.manifoldcf.core.FileLockManager, and

-                org.apache.manifoldcf.core.lockmanager.ZooKeeperLockManager.</td></tr>

-            <tr><td>org.apache.manifoldcf.synchdirectory</td><td>Yes, if file-based synchronization class is specified</td><td>Specifies the path of a

-                synchronization directory.  All ManifoldCF process owners <strong>must</strong> have read/write privileges to this directory.</td></tr>

-            <tr><td>org.apache.manifoldcf.zookeeper.connectstring</td><td>Yes, if ZooKeeper-based synchronization class is specified</td><td>Specifies the ZooKeeper

-                connection string, consisting of comma-separated hostname:port pairs.</td></tr>

-            <tr><td>org.apache.manifoldcf.zookeeper.sessiontimeout</td><td>No</td><td>Specifies the ZooKeeper

-                session timeout, if ZooKeeperLockManager is specified.  Defaults to 2000.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.maxhandles</td><td>No</td><td>Specifies the maximum number of database connection handles that will by pooled.  Recommended value is 200.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.handletimeout</td><td>No</td><td>Specifies the maximum time a handle is to live before it is presumed dead.  Recommend a value of 604800, which is the maximum allowable.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.connectiontracking</td><td>No</td><td>True or false.  When "true", will track all allocated database connection handles, and will dump an allocation stack trace when the pool is exhausted.  Useful for diagnosing connection leaks.</td></tr>

-            <tr><td>org.apache.manifoldcf.logconfigfile</td><td>No</td><td>Specifies location of logging configuration file.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.name</td><td>No</td><td>Describes database name for ManifoldCF; defaults to "dbname" if not specified.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.username</td><td>No</td><td>Describes database user name for ManifoldCF; defaults to "manifoldcf" if not specified.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.password</td><td>No</td><td>Describes database user's password for ManifoldCF; defaults to "local_pg_password" if not specified.</td></tr>

-            <tr><td>org.apache.manifoldcf.database.password.obfuscated</td><td>No</td><td>Obfuscated database user's password for ManifoldCF; defaults to "local_pg_password" if not specified.</td></tr>

-            <tr><td>org.apache.manifoldcf.crawler.threads</td><td>No</td><td>Number of crawler worker threads created.  Suggest a value of 30.</td></tr>

-            <tr><td>org.apache.manifoldcf.crawler.expirethreads</td><td>No</td><td>Number of crawler expiration threads created.  Suggest a value of 10.</td></tr>

-            <tr><td>org.apache.manifoldcf.crawler.cleanupthreads</td><td>No</td><td>Number of crawler cleanup threads created.  Suggest a value of 10.</td></tr>

-            <tr><td>org.apache.manifoldcf.crawler.deletethreads</td><td>No</td><td>Number of crawler delete threads created.  Suggest a value of 10.</td></tr>

-            <tr><td>org.apache.manifoldcf.crawler.historycleanupinterval</td><td>No</td><td>Milliseconds to retain history records.  Default is 0.  Zero means "forever".</td></tr>

-            <tr><td>org.apache.manifoldcf.misc</td><td>No</td><td>Miscellaneous debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.db</td><td>No</td><td>Database debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.lock</td><td>No</td><td>Lock management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.cache</td><td>No</td><td>Cache management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.agents</td><td>No</td><td>Agent management debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.perf</td><td>No</td><td>Performance logging debugging output.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.crawlerthreads</td><td>No</td><td>Log crawler thread activity.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.hopcount</td><td>No</td><td>Log hopcount tracking activity.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.jobs</td><td>No</td><td>Log job activity.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.connectors</td><td>No</td><td>Log connector activity.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.scheduling</td><td>No</td><td>Log document scheduling activity.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.authorityconnectors</td><td>No</td><td>Log authority connector activity.  Legal values INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.authorityservice</td><td>No</td><td>Log authority service activity.  Legal values are INFO, WARN, or DEBUG.</td></tr>

-            <tr><td>org.apache.manifoldcf.salt</td><td>Yes, if file encryption is used</td><td>Specify the salt value to be used for encrypting the file to which the crawler configuration is exported.</td></tr>

-          </table>

-          <p></p>

-          <p>The following table describes 'advanced' configuration property file properties.  They shouldn't need to be changed but provide a greater level of customization:</p>

-          <p></p>

-          <table>

-            <caption>Advanced property.xml properties</caption>

-            <tr><th>Property</th><th>Required?</th><th>Default</th><th>Function</th></tr>

-            <tr><td>org.apache.manifoldcf.crawler.repository.store_history</td><td>No</td><td>true</td><td>If you do not require reports from within this will disable logging to the repository history (although the reports will still run they will not contain any content). This can increase throughput and reduce the rate of growth of the database.</td></tr>

-            <tr><td>org.apache.manifoldcf.db.postgres.analyze.&#60;tablename&#62;</td><td>No</td><td>2000</td><td>For postgresql, specify how many changes should be carried out before carrying out an 'ANALYZE' on the specified table.</td></tr>

-            <tr><td>org.apache.manifoldcf.db.postgres.reindex.&#60;tablename&#62;</td><td>No</td><td>250000</td><td>For postgresql, specify how many changes should be carried out before carrying out an 'REINDEX' on the specified table.</td></tr>

-            <tr><td>org.apache.manifoldcf.db.mysql.analyze.&#60;tablename&#62;</td><td>No</td><td>2000</td><td>For MySql or MariaDB, specify how many changes should be carried out before carrying out an 'ANALYZE' on the specified table.</td></tr>

-            <tr><td>org.apache.manifoldcf.ui.maxstatuscount</td><td>No</td><td>500000</td><td>Set the upper limit for the precise document count to be returned on the 'Status and Job Management' page.</td></tr>

-          </table>

-          <p></p>

-          <p>The configuration file can also specify a set of directories which will be searched for connector jars.  The directive that adds to the class path is:</p>

-          <p></p>

-          <p>&#60;libdir path="<em>path</em>"/&#62;</p>

-          <p></p>

-          <p>Note that the path can be relative.  For the purposes of path resolution, "." means the directory in which the <em>properties.xml</em> file is itself located.</p>

-          <p></p>

-        </section>

-          

-        <section>

-          <title>Logging configuration file properties</title>

-          <p></p>

-          <p>The <em>logging.xml</em> file contains Apache log4j2 properties in a log4j2 xml format.  The way the

-            ManifoldCF logging output is formatted is controlled through this file, as are any loggers that ManifoldCF doesn't explicitly define (e.g. loggers for Apache HttpComponent/HttpClient).

-            Other resources are therefore best suited to describe the parameters that can be used and to what effect.</p>

-        </section>

-          

-      </section>

-      

-      <section>

-        <title>Running the ManifoldCF Apache2 plug in</title>

-        <p></p>

-        <p>The ManifoldCF Apache2 plugin, mod-authz-annotate, is designed to convert an authenticated principle (e.g. from mod-auth-kerb), and query a set of authority services

-          for access tokens using an HTTP request.  These access tokens are then passed to a (not included) search engine UI, which can use them to help compose a search that

-          properly excludes content that the user is not supposed to see.</p>

-        <p></p>

-        <p>The list of authority services so queried is configured in Apache's httpd.conf file.  This project includes only one such service: the java authority service, which uses

-          authority connections defined in the crawler UI to obtain appropriate access tokens.</p>

-        <p></p>

-        <p>In order for mod-authz-annotate to be used, it must be placed into Apache2's extensions directory, and configured appropriately in the httpd.conf file.</p>

-        <p></p>

-        <p>Note: The ManifoldCF project now contains support for converting a Kerberos principal to a list of Active Directory SIDs.  This functionality is contained in the

-          Active Directory Authority.  The following connectors are expected to make use of this authority:</p>

-        <p></p>

-        <ul>

-         <li>FileNet</li>

-         <li>CIFS</li>

-         <li>SharePoint</li>

-        </ul>

-        <p></p>

-        <section>

-          <title>Configuring the ManifoldCF Apache2 plug in</title>

-          <p></p>

-          <p>mod-authz-annotate understands the following httpd.conf commands:</p>

-          <p></p>

-          <table>

-            <tr><th>Command</th><th>Meaning</th><th>Values</th></tr>

-            <tr><td>AuthzAnnotateEnable</td><td>Turn on/off the plugin</td><td>"On", "Off"</td></tr>

-            <tr><td>AuthzAnnotateAuthority</td><td>Point to an authority service that supports ACL queries, but not ID queries</td><td>The authority URL</td></tr>

-            <tr><td>AuthzAnnotateACLAuthority</td><td>Point to an authority service that supports ACL queries, but not ID queries</td><td>The authority URL</td></tr>

-            <tr><td>AuthzAnnotateIDAuthority</td><td>Point to an authority service that supports ID queries, but not ACL queries</td><td>The authority URL</td></tr>

-            <tr><td>AuthzAnnotateIDACLAuthority</td><td>Point to an authority service that supports both ACL queries and ID queries</td><td>The authority URL</td></tr>

-          </table>

-        </section>

-      </section>

-    

-      <section>

-        <title>Running ManifoldCF with Apache Maven</title>

-        <p></p>

-        <p>If you build ManifoldCF with Maven, then you will need to run ManifoldCF under Maven.  You currently don't get a lot of options here; the only model

-            offered is the QuickStart single process model.  To run it, all you need to do is:</p>

-        <source>

-cd framework/jetty-runner

-mvn exec:exec

-        </source>

-      </section>

-

-    </section>

-

-    <section>

-      <title>Running ManifoldCF tests</title>

-      <p></p>

-      <p>ManifoldCF has a large suite of tests which helps verify the integrity of a ManifoldCF release.  These tests come in several varieties:</p>

-      <p></p>

-      <ul>

-        <li>Unit tests, which test specific classes</li>

-        <li>Integration tests, which test connectors running in the MCF environment</li>

-        <li>Load tests, which are designed to run connectors under load over a long period of time</li>

-        <li>UI tests, which are like integration tests but are meant to exercise the UI</li>

-      </ul>

-      <p>There are no special considerations for unit tests.  These are executed across the whole project by the main ant target "run-tests".</p>

-      <p>Integration tests have a second dimension of variety, namely which database the test is meant to run on.  The testing databases are:</p>

-      <p></p>

-      <ul>

-        <li>HSQLDB (an embedded database)</li>

-        <li>HSQLDBext (running against HSQLDB as an external service)</li>

-        <li>PostgreSQL (requires a local installation of PostgreSQL to run against)</li>

-        <li>MySQL (requires a local installation of MySQL to run against)</li>

-      </ul>

-      <p>For both the PostgreSQL and Mysql tests, the databases that are installed locally must have a specific superuser and password set when they are installed, so that the

-         tests can create a test database instance and tear it down again.  The superuser name and password for PostgreSQL should be "postgres"/"postgres".  The superuser name

-         and password for MySQL should be "root"/"mysql".</p>

-      <p>Once set up, you can run the tests you want against the database you want by invoking the ant targets as follows:</p>

-      <table>

-        <caption>Databases and ant targets</caption>

-        <tr><th>Database</th><th>ant targets</th></tr>

-        <tr><td>HSQLDB, HSQLDBext</td><td>test-hs, load-hs</td></tr>

-        <tr><td>PostgreSQL</td><td>test-pg, load-pg</td></tr>

-        <tr><td>MySQL</td><td>test-my, load-my</td></tr>

-      </table>

-      <p></p>

-      <p>Running the UI tests requires some additional software installation and configuration as well.  This is what you will need:</p>

-      <p></p>

-      <ul>

-        <li>Install the Google Chrome browser on your testing machine</li>

-        <li>Download the appropriate Selenium Chrome driver from this <a href="https://chromedriver.storage.googleapis.com/index.html?path=2.28/">URL</a></li>

-        <li>Unpack the driver executable and place it in the location of your choice</li>

-        <li>Set the environment variable <em>SL_CHROME_DRIVER</em> to point to the executable</li>

-      </ul>

-      <p>After this, you should be able to run the UI tests using the ant target "uitests".  (This executes only the HSQLDB UI tests at this time.)</p>

-    </section>

-    

-    <section>

-      <title>Integrating ManifoldCF into another application</title>

-      <p></p>

-      <p>ManifoldCF can be integrated into another application through a variety of methods.  We'll cover these below.</p>

-      <p></p>

-

-      <section>

-        <title>Integrating the Quick Start example</title>

-        <p></p>

-        <p>The Quick Start example can readily be integrated into a single-process application, by using the support methods found in the org.apache.manifoldcf.jettyrunner.ManifoldCFJettyRunner class.

-          For the web application components of ManifoldCF, you can either use this class to start them under Jetty, or you can choose to deploy them yourself.  Please note, however, that if you start the ManifoldCF

-          agents process within a web application, you are effectively not running a single-process version of ManifoldCF anymore, because each web application will effectively

-          have its own set of static classes.</p>

-        <p>If you want to try the single-process integration, you should learn what you need by reading the Javadoc for the ManifoldCFJettyRunner class.</p>

-      </section>

-      

-      <section>

-        <title>Integrating a multi-process setup</title>

-        <p></p>

-        <p>In a multi process setup, all of the ManifoldCF processes might as well exist on their own.  You can learn how to programmatically start the agents process by looking at the code

-          in the AgentRun command class, as described above.  Similarly, the command classes that register connectors are very small and should be easy to understand.</p>

-      </section>

-

-      <section>

-          <title>Integrating ManifoldCF with a search engine</title>

-          <p></p>

-          <p>ManifoldCF's Authority Service is designed to allow maximum flexibility in integrating ManifoldCF security with search engines.  The

-                service receives a user identity (as a set of authorization domain/user name tuples), and produces a set of tokens.  It also returns a 

-                summary of the status of all authorities that were involved in the assembly of the set of tokens, as a nicety.  A search engine user

-                interface could thus signal the user when the results they might be seeing are incomplete, and why.</p>

-          <p>The Authority Service expects the following arguments, passed as URL arguments and properly URL encoded:</p>

-          <p></p>

-          <table>

-            <caption>Authority Service URL parameters</caption>

-            <tr><th>Authority Service URL parameter</th><th>Meaning</th></tr>

-            <tr><td>username</td><td>the username, if there is only one authorization domain</td></tr>

-            <tr><td>domain</td><td>the optional authorization domain if there is only one authorization domain (defaults to empty string)</td></tr>

-            <tr><td>username_<em>XX</em></td><td>username number <em>XX</em>, where <em>XX</em> is an integer starting at zero</td></tr>

-            <tr><td>domain_<em>XX</em></td><td>authorization domain <em>XX</em>, where <em>XX</em> is an integer starting at zero</td></tr>

-          </table>

-          <p></p>

-          <p>Access tokens and authority statuses are returned in the HTTP response separated by newline characters.  Each line has a prefix

-                as follows:</p>

-          <p></p>

-          <table>

-            <caption>Authority Service response prefixes</caption>

-            <tr><th>Authority Service response prefix</th><th>Meaning</th></tr>

-            <tr><td>TOKEN:</td><td>An access token</td></tr>

-            <tr><td>AUTHORIZED:</td><td>The name of an authority that found the user to be authorized</td></tr>

-            <tr><td>UNREACHABLEAUTHORITY:</td><td>The name of an authority that was found to be unreachable or unusable</td></tr>

-            <tr><td>UNAUTHORIZED:</td><td>The name of an authority that found the user to be unauthorized</td></tr>

-            <tr><td>USERNOTFOUND:</td><td>The name of an authority that could not find the user</td></tr>

-          </table>

-          <p></p>

-          <p>It is important to remember that only the "TOKEN:" lines actually matter for security.  Even if any of the error conditions apply, the set

-                of tokens returned by the Authority Service will be correctly supplied in order to apply appropriate security to documents being searched.</p>

-          <p>If you choose to deploy a search-engine plugin supplied by the Apache ManifoldCF project (for example, the Solr plugin), you will not need

-                know any of the above, since part of the plugin's purpose is to communicate with the Authority Service and apply the access tokens that are

-                returned to the search query automatically.  Some plugins, such as the ElasticSearch plugin, are more or less like toolkits, but still hide most

-                of the above from the integrator.  In a more highly customized system, however, you may need to develop your own code which interacts

-                with the Authority Service in order to meet your goals.</p>

-      </section>

-

-    </section>

-  </body>

-

-</document>

-

-

-

-

-

-

-

-

-

-

diff --git a/site/src/documentation/content/xdocs/zh_CN/included-connectors.xml b/site/src/documentation/content/xdocs/zh_CN/included-connectors.xml
deleted file mode 100755
index bb373be..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/included-connectors.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document>
-
-  <header>
-    <title></title>
-  </header>
-
-  <body>
-    <section>
-      <title>连接器一览</title>
-      <p>ManifoldCF提供如下连接器:</p>
-      <p></p>
-      <table>
-        <caption>支持连接器</caption>
-        <tr><th>连接器名</th><th>连接器平台</th><th>服务器平台</th><th>客户端版本</th><th>服务器版本</th></tr>
-        <tr><td>CMIS</td><td>Java</td><td>多个</td><td>CMIS 1.0</td><td>CMIS 1.0</td></tr>
-        <tr><td>DropBox</td><td>Java</td><td>多个</td><td>1.5.3</td><td>N/A</td></tr>
-        <tr><td>Email</td><td>Java</td><td>多个</td><td>Javamail 1.4</td><td>N/A</td></tr>
-        <tr><td>File System</td><td>Java</td><td>Win/*NIX</td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>Google Drive</td><td>Java</td><td>多个</td><td>v2-rev64-1.14.1-beta</td><td>N/A</td></tr>
-        <tr><td>HDFS</td><td>Java</td><td>多个</td><td>2.2.0</td><td>1.1.2</td></tr>
-        <tr><td>Windows共享</td><td>Java</td><td> Win, Samba, NetApp,其它NAS系统</td><td>N/A</td><td>N/A</td></tr>
-        <tr><td>JDBC</td><td>Java </td><td>多个</td><td>支持JDBC V2, V3, V4;Oracle 10, JTDS 1.2, Postgresql 9.1, MySQL 5.5等驱动器通过验证</td><td>多个</td></tr>
-        <tr><td>Jira</td><td>Java </td><td>多个</td><td>N/A</td><td>5.0-6.1</td></tr>
-        <tr><td>RSS</td><td>Java </td><td> N/A </td><td> N/A </td><td>Atom,RSS 2.0及其它</td></tr>
-        <tr><td>Web</td><td>Java </td><td>N/A</td><td> N/A </td><td>HTML 1.0, 1.1, 2.0, Atom, RSS 2.0及其它</td></tr>
-        <tr><td>Wiki</td><td>Java </td><td>N/A</td><td> N/A </td><td>Wiki 1.8或以上</td></tr>
-        <tr><td>LiveLink (OpenText)</td><td>Java </td><td> Win </td><td> LAPI 9.7.1 </td><td>9.2.0 - 10.2.0通过验证</td></tr>
-        <tr><td>Solr</td><td>Java </td><td> N/A </td><td> N/A</td><td>Solr 1.4, 3.6.2, 4.0.0, 4.1.0, 4.2.0, 4.3.0通过验证</td></tr>
-        <tr><td>OpenSearchServer</td><td>Java </td><td> N/A </td><td> N/A</td><td>OpenSearchServer 1.2.1, 1.2.2, 1.2.3通过验证</td></tr>
-        <tr><td>ElasticSearch</td><td>Java </td><td> N/A </td><td> N/A</td><td>ElasticSearch 1.0, 1.1, 1.2, 1.3通过验证</td></tr>
-        <tr><td>Documentum (EMC)</td><td>Win, RedHat</td><td> Win, RedHat </td><td>DFC 5.3 SP5通过验证</td><td>5.3, 6.0和6.5服务器通过验证</td></tr>
-        <tr><td>SharePoint (MSFT)</td><td>Java </td><td>Win</td><td> N/A </td><td>SharePoint 2003 (2.0), 2007 (3.0)通过验证, 无Claim Space Auth条件下验证2010 (4.0)</td></tr>
-        <tr><td>Meridio (Autonomy)</td><td>Java </td><td> Win </td><td> N/A </td><td>Meridio 4.1, 5.0通过验证</td></tr>
-        <tr><td>FileNet (IBM)</td><td>Java</td><td>Win, RedHat</td><td>P8 V4.1, V4.5通过验证</td><td>P8 V4.1, V4.5通过验证</td></tr>
-        <tr><td>Slack</td><td>Pure Java</td><td> N/A </td><td> N/A </td><td>Slack API November 2016通过验证</td></tr>
-      </table>
-    </section>
-  </body>
-</document>
-
diff --git a/site/src/documentation/content/xdocs/zh_CN/index.xml b/site/src/documentation/content/xdocs/zh_CN/index.xml
deleted file mode 100755
index 63c0db7..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/index.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>欢迎来到ManifoldCF!</title> 
-  </header> 
-
-  <body> 
-    <section>
-	<title>什么是ManifoldCF?</title>
-	<p>ManifoldCF由Java程序实现,它可以搜集保存在互联网或企业网上各种服务器里的文档或Web网页,并将其发送到搜索引擎。在搜集文档的同时还在ActiveDirectory等认证系统的协同下搜集文档的权限信息,并利用这些权限信息对其搜索结果加以限制。比如,人事档案仅限由人事部搜索时才加以显示。</p>
-	<p>ManifoldCF现版本可利用下述通用连接器搜集FileNet P8 (IBM),Documentum (EMC),LiveLink (OpenText),Meridio (Autonomy), Windows共享(Microsoft),SharePoint (Microsoft)等商用系统保存着的各种文档,如:CMIS连接器,File System连接器,JDBC连接器,RSS Feed连接器,Wiki连接器,HTML连接器。而且,还可将搜集到的文档发送到Apache Solr,QBase(旧MetaCarta) GTS,OpenSearchServer,Elasticsearch。所支持的产品及规格一览请参照<a href="included-connectors.html">这里</a>。</p>
-	<p>Apache ManifoldCF由MetaCarta, Inc.开发,为供给多家企业经历5年反反复复的开发,调试之后,2009年12月其源代码赠送到Apache Software Foundation。</p>
-    </section>
-
-    <section>
-	<title>关于第三方存储库</title>
-	<p>为生成ManifoldCF包含的面向商业软件的连接器,有时需第三方软件库,包或软件本身。虽然开发人员需得到这些第三方软件,但可以有条件地编译连接器自身的源代码并作为Apache发布之。我们虽期望并努力做到使一切遵照Apache版权,但现状不会立即发生变化。</p>
-	<p>关于包括第三方软件的生成步骤,请参照Wiki页面。</p>
-    </section>
-
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/javadoc.xml b/site/src/documentation/content/xdocs/zh_CN/javadoc.xml
deleted file mode 100755
index 17c91f3..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/javadoc.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document>
-
-  <header>
-    <title>ManifoldCF Javadoc</title>
-  </header>
-
-  <body>
-    <section>
-      <title>ManifoldCF Javadoc</title>
-      <p></p>
-      <p>关于最新版ManifoldCF及其连接器的Javadoc可通过下述链接加以参照</p>
-      <p><a href="../api/framework/index.html">ManifoldCF框架</a></p>
-      <p><a href="../api/activedirectory/index.html">Active Directory权限</a></p>
-      <p><a href="../api/alfresco/index.html">Alfresco连接器</a></p>
-      <p><a href="../api/cmis/index.html">CMIS authority连接器</a></p>
-      <p><a href="../api/documentum/index.html">Documentum权限,连接器和支持处理</a></p>
-      <p><a href="../api/dropbox/index.html">Dropbox连接器</a></p>
-      <p><a href="../api/email/index.html">Email连接器</a></p>
-      <p><a href="../api/filenet/index.html">FileNet连接器和支持处理</a></p>
-      <p><a href="../api/filesystem/index.html">File system存储器和输出连接器</a></p>
-      <p><a href="../api/googledrive/index.html">GoogleDrive连接器</a></p>
-      <p><a href="../api/gridfs/index.html">GridFS连接器</a></p>
-      <p><a href="../api/gts/index.html">qBase GTS输出连接器</a></p>
-      <p><a href="../api/hdfs/index.html">HDFS存储器和输出连接器</a></p>
-      <p><a href="../api/jcifs/index.html">CIFS连接器</a></p>
-      <p><a href="../api/jira/index.html">JIRA连接器和权限</a></p>
-      <p><a href="../api/jdbc/index.html">JDBC连接器</a></p>
-      <p><a href="../api/livelink/index.html">LiveLink权限和连接器</a></p>
-      <p><a href="../api/meridio/index.html">Meridio权限和连接器</a></p>
-      <p><a href="../api/opensearchserver/index.html">OpenSearchServer输出连接器</a></p>
-      <p><a href="../api/elasticsearch/index.html">ElasticSearch输出连接器</a></p>
-      <p><a href="../api/nullauthority/index.html">Null权限</a></p>
-      <p><a href="../api/nulloutput/index.html">Null输出连接器</a></p>
-      <p><a href="../api/regexpmapper/index.html">Regular expression mapping连接器</a></p>
-      <p><a href="../api/rss/index.html">RSS连接器</a></p>
-      <p><a href="../api/sharepoint/index.html">SharePoint连接器</a></p>
-      <p><a href="../api/slack/index.html">Slack连接器</a></p>
-      <p><a href="../api/solr/index.html">Solr输出连接器</a></p>
-      <p><a href="../api/webcrawler/index.html">Web连接器</a></p>
-      <p><a href="../api/wiki/index.html">Wiki连接器</a></p>
-    </section>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/performance-tuning.xml b/site/src/documentation/content/xdocs/zh_CN/performance-tuning.xml
deleted file mode 100644
index 3847907..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/performance-tuning.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>性能调优</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>性能调优</title>
-      <p></p>
-      <p>
-        为了让ManifoldCF最大限度的发挥功能和效率, 需了解如下几点。首先,要掌握如何设置项目使其在最佳状态下运行。您还需了解最佳硬件配置。另外,毫无疑问,您需要判断您所做的一切操作是否正常结束,为此我们需要一些数据来加以比较。
-        此页旨在供您关于上述问题的答案。
-      </p>
-      <section>
-        <title>性能相关设置</title>
-        <p></p>
-        <p>
-          ManifoldCF性能调优的目标在于,最大限度的利用系统的并行处理,并保证不存在任何瓶颈使系统减慢。
-          ManifoldCF最为重要的基础是数据库,因为它是ManifoldCF所使用的唯一的持久性存储机制。故如何正确使用数据库将是我们的第一目标。
-        </p>
-        <section>
-          <title>选择数据库</title>
-          <p>
-            起初使用PostgreSQL胜过Derby,因为Derby在处理死锁时具有已知的性能问题。
-            在像ManifoldCF高度线程化的系统,数据库死锁的发生不足为奇,我们可以降低由它引发的风险,但不能完全排除。
-            换句话说,Derby具有死锁功能,不如在DELETE一个表格的同时SELECT同一个表格,此时Derby要求悬挂片刻检验该死锁。
-            显然,此动作与高性能格格不入,因此当您在意一切爬虫性能时请使用PostgreSQL。请参照<a href="how-to-build-and-deploy.html">how-to-deploy</a> 了解如何在PostgreSQL下驱动ManifoldCF。
-          </p>
-          <p>
-            某些PostgreSQL版本同样具有给ManifoldCF查询生不良计划的已知问题。当它发生时,任何大小的爬取都将变得异常缓慢。
-            ManifoldCF日志开始包含许多此类警告问题,如"Query took more than a minute"加上相应的转储计划,表明正在全表扫描一个大表格。
-            从这一点,你应怀疑你或许在使用糟糕的版本,如8.3.12。相反,8.3.7, 8.3.8,8.4.5均没有问题。
-          </p>
-        </section>
-        <section>
-          <title>正确配置PostgreSQL</title>
-          <p>
-            The key configuration changes you need to make to PostgreSQL from its 预设配置 settings are intended to:
-          </p>
-          <ul>
-            <li>Set PostgreSQL up with enough database handles so that that will not be a bottleneck;</li>
-            <li>Make sure PostgreSQL has enough shared memory allocated to support the number of handles you selected;</li>
-            <li>Turn off autovacuuming.</li>
-          </ul>
-          <p>
-            The <em>postgresql.conf</em> file is where you set most of these options.  Some recommended settings are described in <a href="how-to-build-and-deploy.html">the deployment page</a>.
-            The postgresql.conf file describes the relationship between parameters, especially between the number of database handles and the amount of shared memory allocated.  This can differ significantly
-            from version to version, so it never hurts to read the text in that file, and understand what you are trying to achieve.
-          </p>
-          <p>
-            The number of database handles you need will depend on your ManifoldCF setup.  If you use the Quick Start, for instance, fewer handles are needed, because only one process is used.  The formula relating handle count to other
-            parameters of ManifoldCF is presented below.
-          </p>
-          <p></p>
-          <p>manifoldcf_db_pool_size * number_of_manifoldcf_processes &lt;= maximum_postgresql_database_handles - 2</p>
-          <p></p>
-          <p>
-            The number of processes you might have depends on how you deployed ManifoldCF.  If you used the Quick Start, you will only have one process.  But if you deployed in a more distributed way,
-            you will have at least a process for the agents daemon, as well as at one process for each web application.  If you anticipate that a command-line utility could be used at the same time,
-            that's one more process.  These multiply quickly, so the number of database handles you need to make available can get quite large, unless you limit the ManifoldCF pool size artificially
-            instead.
-          </p>
-          <p>Setting the parameters that control the size of the database connection pool is covered in the next section.</p>
-        </section>
-        <section>
-          <title>Setting the ManifoldCF database handle pool size</title>
-          <p>
-            The database handle pool size must be set correctly, or ManifoldCF will not perform well, and may even deadlock waiting to get a database handle.
-            The properties.xml parameter that controls this is <em>org.apache.manifoldcf.database.maxhandles</em>.  The formula you should use to properly set the value is below.
-          </p>
-          <p></p>
-          <p>worker_thread_count + delete_thread_count + expiration_thread_count + cleanup_thread_count + 10 &lt; manifoldcf_db_pool_size</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Setting the number of worker, delete, and expiration threads</title>
-          <p>
-            The number of each variety of thread you choose depends on a number of factors that are specific to the kinds of tasks you expect to do.
-            First, note that constraints based on your hardware may have the effect of setting an upper bound on the total number of threads.  If, for example, memory constraints
-            on your system have the effect of limiting the number of available PostgreSQL handles, the total threads will also be limited as a result of applying the formulas already given.
-          </p>
-          <p>
-            If you do not have any such constraints, then you can choose the number of threads based on other hardware factors.  Typically, the number of processors would be what you'd consider
-            in coming up with the total thread count.  A value of between 12 and 35 threads per processor is typical.  The optimal number for you will require some experimentation.
-          </p>
-          <p>The threads then have to be allocated to the worker, deletion, or expiration category.  If your work load does not require much in the way of deleting documents or expiring them,
-            it is usually adequate to retain the default of 10 deletion and 10 expiration threads, and simply adjust the worker thread count.  The worker thread count parameter is <em>org.apache.manifoldcf.crawler.threads</em>.
-            See <a href="how-to-build-and-deploy.html">the deployment page</a> for a list of all of these parameters.
-          </p>
-        </section>
-        <section>
-          <title>Database maintenance</title>
-          <p>
-            Once you have the database and ManifoldCF configurated correctly, you will discover that the performance of the system gradually degrades over time.  This is because PostgreSQL
-            requires periodic maintenance in order to function optimally.  This maintenance is called <em>vacuuming</em>.
-          </p>
-          <p>
-            Our recommendation is to vacuum on a schedule, and to use the "full" variant of the vacuum command (e.g. "VACUUM FULL").  PostgreSQL gives you the option of lesser
-            vacuums, some of which can be done in background, but in our experience these are very expensive performance-wise, and are not very helpful either.  "VACUUM FULL" makes a
-            complete new copy of the database, a table at a time, stored in an optimal way.  It is also reasonably quick, considering what it is doing.
-          </p>
-        </section>
-      </section>
-      <section>
-        <title>Some results</title>
-        <p>
-          We've run performance test on several systems.  Depending on hardware configuration, we've seen as fast as 57 documents per second to 16 documents per second.  We tested with three different systems and ran the test
-          across 306,944 documents.  The table below shows the relevant configurations and results:
-        </p>
-        <table>
-          <tr><th>System</th><th>Processors (2+ Ghz)</th><th>Memory</th><th>Disk drives</th><th>Elapsed time (seconds)</th><th>Documents per second</th></tr>
-          <tr><td>Desktop</td><td>2</td><td>8 GB</td><td>7,200 RPM</td><td>19,492</td><td>16</td></tr>
-          <tr><td>Laptop</td><td>2</td><td>4 GB</td><td>Samsung SSD RBX</td><td>9,230</td><td>33</td></tr>
-          <tr><td>Server</td><td>8</td><td>8 GB</td><td>10,000 RPM</td><td>5,366</td><td>57</td></tr>
-        </table>
-        <p>
-          For these tests, we ran the Quick-Start example configuration from ManifoldCF as is, with the exception of using an external PostgreSQL database instead of the embedded Derby.
-          We altered the ManifoldCF and PostgreSQL configuration from their default settings to maximize system resource usage.  The table below shows the key configuration changes.
-        </p>
-        <table>
-          <tr><th>Workers</th><th>ManifoldCF DB Connections</th><th>PostgreSQL Connections</th><th>Max repository connections</th><th>JVM Memory</th></tr>
-          <tr><td>100</td><td>105</td><td>200</td><td>105</td><td>1024 MB</td></tr>
-        </table>
-        <p>Additionally, we made postgresql.conf changes as shown in the table below:</p>
-        <table>
-          <tr><th>Parameter</th><th>Value</th></tr>
-          <tr><td>shared_buffers</td><td>1024MB</td></tr>
-          <tr><td>checkpoint_segments</td><td>300</td></tr>
-          <tr><td>maintenanceworkmem</td><td>2MB</td></tr>
-          <tr><td>tcpip_socket</td><td>true</td></tr>
-          <tr><td>max_connections</td><td>200</td></tr>
-          <tr><td>checkpoint_timeout</td><td>900</td></tr>
-          <tr><td>datestyle</td><td>ISO,European</td></tr>
-          <tr><td>autovacuum</td><td>off</td></tr>
-        </table>
-        <p>这里有有趣的结论,for example the use of Solid State Drives for the laptop.  Even though addressable memory was reduced to 4 GB, the system processed twice as much documents than the desktop did with slower disks.  The other interesting fact is that the server had lower performing disks, but 4 times as many processors, and it was twice as fast as the laptop.</p>
-      </section>
-    </section>
-  </body>
-</document>
-
-
-
-
-
-
-        
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/zh_CN/programmatic-operation.xml b/site/src/documentation/content/xdocs/zh_CN/programmatic-operation.xml
deleted file mode 100644
index ab1fdd7..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/programmatic-operation.xml
+++ /dev/null
@@ -1,659 +0,0 @@
-<?xml version="1.0"?>

-

-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 

-          "http://forrest.apache.org/dtd/document-v20.dtd">

-

-<!--

- 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.

--->

-

-<document> 

-

-  <header> 

-    <title>Programmatic Operation</title> 

-  </header> 

-

-  <body> 

-    <section>

-      <title>Programmatic Operation</title>

-      <p></p>

-      <p>A certain subset of ManifoldCF users want to think of ManifoldCF as an engine that they can poke from whatever other system they are developing.  While

-        ManifoldCF is not precisely a document indexing engine per se, it can certainly be controlled programmatically.  Right now, there are three principle ways of

-        achieving this control.</p>

-      <p></p>

-      <section>

-        <title>Control by Servlet API</title>

-        <p></p>

-        <p>ManifoldCF provides a servlet-based JSON API that gives you the complete ability to define connections and jobs, and control job execution.  You can read

-          about JSON <a href="http://www.json.org">here</a>.  The API is designed to be RESTful in character.  Thus, it makes full use of the HTTP verbs

-          GET, PUT, POST, and DELETE, and represents objects as URLs.</p>

-        <section>

-          <title>URL format</title>

-          <p></p>

-          <p>The basic format of the JSON servlet resource URLs is as follows:</p>

-          <p></p>

-          <p>http[s]://<em>&lt;server_and_port&gt;</em>/mcf-api-service/json/<em>&lt;resource&gt;</em></p>

-          <p></p>

-          <p>The servlet ignores request data, except when the PUT or POST verb is used.  In that case, the request data is presumed to be a JSON object.  The servlet

-            responds either with an error response code (either 400 or 500) with an appropriate explanatory message, or with a 200 (OK), 201 (CREATED), 

-            401 (UNAUTHORIZED), or 404 (NOT FOUND) response code along with a response JSON object.</p>

-          <p></p>

-        </section>

-        <section>

-          <title>JSON equivalents for ManifoldCF</title>

-          <p></p>

-          <p>ManifoldCF treats certain JSON forms as equivalent, for the purposes of readability.  For example, the array form <strong>"foo" : [ { ... } ]</strong> is

-            treated equivalently to <strong>"foo" : { }</strong>, whenever there is only one array element.  This gives a coder some flexibility as to how s/he encodes

-            JSON in requests.  Please also be aware that similar compressions will occur in the JSON responses from the API servlet, and your code must be able to deal

-            with this possibility.  The following table describes some of the equivalences:</p>

-          <p></p>

-          <p></p>

-          <p></p>

-          <table>

-            <tr><th>Form</th><th>Equivalent</th></tr>

-            <tr><td>[ { ... } ]</td><td>{ ... }</td></tr>

-            <tr><td>"foo" : { "_value_" : "bar" }</td><td>"foo" : "bar"</td></tr>

-            <tr><td>"_children_" : [ "foo":{ ... }, "foo":{ ... } ]</td><td>"foo" : [ { ... }, { ... } ]</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Resources and commands</title>

-          <p></p>

-          <p>The actual available resources and commands are as follows:</p>

-          <p></p>

-          <p></p>

-          <p></p>

-          <table>

-            <tr><th>Resource</th><th>Verb</th><th>What it does</th><th>Input format/query args</th><th>Output format</th></tr>

-            <tr><td>LOGIN</td><td>POST</td><td>Log in the specified user</td><td>{"userID":<em>&lt;user_name&gt;</em>, "password":<em>&lt;password&gt;</em>}</td><td>{}</td></tr>

-            <tr><td>authorizationdomains</td><td>GET</td><td>List all registered authorization domains</td><td>N/A</td><td>{"authorizationdomain":[<em>&lt;list_of_authorization_domain_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>outputconnectors</td><td>GET</td><td>List all registered output connectors</td><td>N/A</td><td>{"outputconnector":[<em>&lt;list_of_output_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>transformationconnectors</td><td>GET</td><td>List all registered transformation connectors</td><td>N/A</td><td>{"transformationconnector":[<em>&lt;list_of_transformation_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>mappingconnectors</td><td>GET</td><td>List all registered mapping connectors</td><td>N/A</td><td>{"mappingconnector":[<em>&lt;list_of_mapping_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authorityconnectors</td><td>GET</td><td>List all registered authority connectors</td><td>N/A</td><td>{"authorityconnector":[<em>&lt;list_of_authority_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnectors</td><td>GET</td><td>List all registered repository connectors</td><td>N/A</td><td>{"repositoryconnector":[<em>&lt;list_of_repository_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>notificationconnectors</td><td>GET</td><td>List all registered notification connectors</td><td>N/A</td><td>{"notificationconnector":[<em>&lt;list_of_notification_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authoritygroups</td><td>GET</td><td>List all authority groups</td><td>N/A</td><td>{"authoritygroup":[<em>&lt;list_of_authority_group_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>GET</td><td>Get a specific authority group</td><td>N/A</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>PUT</td><td>Save or create an authority group</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>DELETE</td><td>Delete an authority group</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>outputconnections</td><td>GET</td><td>List all output connections</td><td>N/A</td><td>{"outputconnection":[<em>&lt;list_of_output_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific output connection</td><td>N/A</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an output connection</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete an output connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>status/outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of an output connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>info/outputconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>transformationconnections</td><td>GET</td><td>List all transformation connections</td><td>N/A</td><td>{"transformationconnection":[<em>&lt;list_of_transformation_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific transformation connection</td><td>N/A</td><td>{"transformationconnection":<em>&lt;transformation_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a transformation connection</td><td>{"outputconnection":<em>&lt;transformation_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a transformation connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>status/transformationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a transformation connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>info/transformationconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>clearversions/<em>&lt;encoded_output_connection_name&gt;</em></td><td>PUT</td><td>Forget previous indexed document versions</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>clearrecords/<em>&lt;encoded_output_connection_name&gt;</em></td><td>PUT</td><td>Remove all previous indexing records</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>mappingconnections</td><td>GET</td><td>List all mapping connections</td><td>N/A</td><td>{"mappingconnection":[<em>&lt;list_of_mapping_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific mapping connection</td><td>N/A</td><td>{"mappingconnection":<em>&lt;mapping_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a mapping connection</td><td>{"mappingconnection":<em>&lt;mapping_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a mapping connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>status/mappingconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a mapping connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authorityconnections</td><td>GET</td><td>List all authority connections</td><td>N/A</td><td>{"authorityconnection":[<em>&lt;list_of_authority_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific authority connection</td><td>N/A</td><td>{"authorityconnection":<em>&lt;authority_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an authority connection</td><td>{"authorityconnection":<em>&lt;authority_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete an authority connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>status/authorityconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of an authority connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnections</td><td>GET</td><td>List all repository connections</td><td>N/A</td><td>{"repositoryconnection":[<em>&lt;list_of_repository_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific repository connection</td><td>N/A</td><td>{"repositoryconnection":<em>&lt;repository_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a repository connection</td><td>{"repositoryconnection":<em>&lt;repository_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a repository connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>status/repositoryconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a repository connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>info/repositoryconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>notificationconnections</td><td>GET</td><td>List all notification connections</td><td>N/A</td><td>{"notificationconnection":[<em>&lt;list_of_notification_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific notification connection</td><td>N/A</td><td>{"notificationconnection":<em>&lt;notification_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create a notification connection</td><td>{"notificationconnection":<em>&lt;notification_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>DELETE</td><td>Delete a notification connection</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>status/notificationconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Check the status of a notification connection</td><td>N/A</td><td>{"check_result":<em>&lt;message&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>info/notificationconnections/<em>&lt;encoded_connection_name&gt;</em>/<em>&lt;connector_specific_resource&gt;</em></td><td>GET</td><td>Retrieve arbitrary connector-specific resource</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>clearhistory/<em>&lt;encoded_repository_connection_name&gt;</em></td><td>PUT</td><td>Clear history linked with repository connection</td><td>N/A</td><td><em>&lt;response_data&gt;</em> <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} <strong>OR</strong> {"service_interruption":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobs</td><td>GET</td><td>List all job definitions</td><td>N/A</td><td>{"job":[<em>&lt;list_of_job_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobs</td><td>POST</td><td>Create a job</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{"job_id":<em>&lt;job_identifier&gt;</em>} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job definition</td><td>N/A</td><td>{"job":<em>&lt;job_object_&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Save a job definition</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>DELETE</td><td>Delete a job definition</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobstatuses</td><td>GET</td><td>List all jobs and their status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>jobstatuses/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>

-            <tr><td>jobstatusesnocounts<em>&lt;job_id&gt;</em></td><td>GET</td><td>List all jobs and their status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>

-            <tr><td>jobstatusesnocounts/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>

-            <tr><td>start/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>startminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>abort/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Abort a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>restart/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Stop and start a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>restartminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Stop and start a specified job, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>pause/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Pause a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>resume/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Resume a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>reseed/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Reset incremental seeding for a specified job</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-

-            <tr><td>repositoryconnectionhistory/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a history report</td><td><em>&lt;history_query_parameters&gt;</em></td><td>{"row":[{"column":[{"name":<em>&lt;col_name&gt;</em>,"value":<em>&lt;col_value&gt;</em>}, ...]}, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnectionquery/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a queue report</td><td><em>&lt;queue_query_parameters&gt;</em></td><td>{"row":[{"column":[{"name":<em>&lt;col_name&gt;</em>,"value":<em>&lt;col_value&gt;</em>}, ...]}, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnectionactivities/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a list of legal activities for a connection</td><td>N/A</td><td>{"activity":[<em>&lt;activity_name&gt;</em>, ...]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-            <tr><td>repositoryconnectionjobs/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a list of jobs for a connection</td><td>N/A</td><td>{"job":[<em>&lt;list_of_job_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>

-

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>History query parameters</title>

-          <p></p>

-          <p>The history query parameters and their meanings are as follows:</p>

-          <table>

-            <tr><th>Parameter</th><th>Report type</th><th>Multivalued?</th><th>Meaning</th></tr>

-            <tr><td>report</td><td>All</td><td>No</td><td>The kind of history report desired; legal values are "simple", "maxactivity", "maxbandwidth", and "result"; defaults to "simple"</td></tr>

-            <tr><td>starttime</td><td>All</td><td>No</td><td>Starting time in ms since epoch; defaults to "0"</td></tr>

-            <tr><td>endtime</td><td>All</td><td>No</td><td>Ending time in ms since epoch; defaults to now</td></tr>

-            <tr><td>activity</td><td>All</td><td>Yes</td><td>Which activities you want to see</td></tr>

-            <tr><td>entitymatch</td><td>All</td><td>No</td><td>Regular expression matching entity identifier; defaults to ""</td></tr>

-            <tr><td>entitymatch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of entitymatch</td></tr>

-            <tr><td>resultcodematch</td><td>All</td><td>No</td><td>Regular expression match result code; defaults to ""</td></tr>

-            <tr><td>resultcodematch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of resultcodematch</td></tr>

-            <tr><td>sortcolumn</td><td>All</td><td>Yes</td><td>Result column to sort the result by</td></tr>

-            <tr><td>sortcolumn_direction</td><td>All</td><td>Yes</td><td>Direction to sort the corresponding column ("ascending" or "descending")</td></tr>

-            <tr><td>startrow</td><td>All</td><td>No</td><td>Starting row in resultset to return; defaults to 0</td></tr>

-            <tr><td>rowcount</td><td>All</td><td>No</td><td>Maximum number of rows to return; defaults to 20</td></tr>

-            <tr><td>idbucket</td><td>maxactivity, maxbandwidth, result</td><td>No</td><td>Regular expression selecting which part of the entity identifier to use as an aggregation key; defaults to "()"</td></tr>

-            <tr><td>idbucket_insensitive</td><td>maxactivity, maxbandwidth, result</td><td>No</td><td>Case insensitive version of idbucket</td></tr>

-            <tr><td>resultcodebucket</td><td>result</td><td>No</td><td>Regular expression selecting which part of the result code to use as an aggregation key; defaults to "(.*)"</td></tr>

-            <tr><td>resultcodebucket_insensitive</td><td>result</td><td>No</td><td>Case insensitive version of resultcodebucket</td></tr>

-            <tr><td>interval</td><td>maxactivity, maxbandwidth</td><td>No</td><td>Size of window in milliseconds for assessing rate; defaults to 300000</td></tr>

-          </table>

-          <p></p>

-          <p>Each report type has different return columns, as listed below:</p>

-          <p></p>

-          <table>

-            <tr><th>Report type</th><th>Return columns</th></tr>

-            <tr><td>simple</td><td>starttime, resultcode, resultdesc, identifier, activity, bytes, elapsedtime</td></tr>

-            <tr><td>maxactivity</td><td>starttime, endtime, activitycount, idbucket</td></tr>

-            <tr><td>maxbandwidth</td><td>starttime, endtime, bytecount, idbucket</td></tr>

-            <tr><td>result</td><td>idbucket, resultcodebucket, eventcount</td></tr>

-          </table>

-        </section>

-        <section>

-          <title>Queue query parameters</title>

-          <p></p>

-          <p>The queue query parameters and their meanings are as follows:</p>

-          <table>

-            <tr><th>Parameter</th><th>Report type</th><th>Multivalued?</th><th>Meaning</th></tr>

-            <tr><td>report</td><td>All</td><td>No</td><td>The kind of queue report desired; legal values are "document" or "status"; defaults to "document"</td></tr>

-            <tr><td>now</td><td>All</td><td>No</td><td>The time in milliseconds since epoch to perform the queue assessment relative to; defaults to current time</td></tr>

-            <tr><td>idmatch</td><td>All</td><td>No</td><td>Regular expression matching document identifier; defaults to ""</td></tr>

-            <tr><td>idmatch_insensitive</td><td>All</td><td>No</td><td>Case insensitive version of idmatch</td></tr>

-            <tr><td>statematch</td><td>All</td><td>Yes</td><td>State to match; valid values are "neverprocessed", "previouslyprocessed", "outofscope"</td></tr>

-            <tr><td>statusmatch</td><td>All</td><td>Yes</td><td>Status to match; valid values are "inactive", "processing", "expiring", "deleting", "readyforprocessing", "readyforexpiration", "waitingforprocessing", "waitingforexpiration", "waitingforever", and "hopcountexceeded"</td></tr>

-            <tr><td>sortcolumn</td><td>All</td><td>Yes</td><td>Result column to sort the result by</td></tr>

-            <tr><td>sortcolumn_direction</td><td>All</td><td>Yes</td><td>Direction to sort the corresponding column ("ascending" or "descending")</td></tr>

-            <tr><td>startrow</td><td>All</td><td>No</td><td>Starting row in resultset to return; defaults to 0</td></tr>

-            <tr><td>rowcount</td><td>All</td><td>No</td><td>Maximum number of rows to return; defaults to 20</td></tr>

-            <tr><td>idbucket</td><td>status</td><td>No</td><td>Regular expression selecting which part of the document identifier to use as an aggregation key; defaults to "()"</td></tr>

-            <tr><td>idbucket_insensitive</td><td>status</td><td>No</td><td>Case insensitive version of idbucket</td></tr>

-          </table>

-          <p></p>

-          <p>Each report type has different return columns, as listed below:</p>

-          <p></p>

-          <table>

-            <tr><th>Report type</th><th>Return columns</th></tr>

-            <tr><td>document</td><td>identifier, job, state, status, scheduled, action, retrycount, retrylimit</td></tr>

-            <tr><td>status</td><td>idbucket, inactive, processing, expiring, deleting, processready, expireready, processwaiting, expirewaiting, waitingforever, hopcountexceeded</td></tr>

-          </table>

-        </section>

-        <section>

-          <title>Authorization domain objects</title>

-          <p></p>

-          <p>The JSON fields an authorization domain object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the authorization domain</td></tr>

-            <tr><td>"domain_name"</td><td>The internal name of the authorization domain, i.e. what is sent to the Authority Service</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Output connector objects</title>

-          <p></p>

-          <p>The JSON fields an output connector object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>

-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Transformation connector objects</title>

-          <p></p>

-          <p>The JSON fields a transformation connector object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>

-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Mapping connector objects</title>

-          <p></p>

-          <p>The JSON fields a mapping connector object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>

-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Authority connector objects</title>

-          <p></p>

-          <p>The JSON fields an authority connector object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>

-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Repository connector objects</title>

-          <p></p>

-          <p>The JSON fields a repository connector object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>

-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Notification connector objects</title>

-          <p></p>

-          <p>The JSON fields a repository connector object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"description"</td><td>The optional description of the connector</td></tr>

-            <tr><td>"class_name"</td><td>The class name of the class implementing the connector</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Authority group objects</title>

-          <p></p>

-          <p>Authority group names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields an authority group object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the group</td></tr>

-            <tr><td>"description"</td><td>The description of the group</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Output connection objects</title>

-          <p></p>

-          <p>Output connection names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields an output connection object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>

-            <tr><td>"description"</td><td>The description of the connection</td></tr>

-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>

-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>

-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Transformation connection objects</title>

-          <p></p>

-          <p>Transformation connection names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields an output connection object has are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>

-            <tr><td>"description"</td><td>The description of the connection</td></tr>

-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>

-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>

-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Mapping connection objects</title>

-          <p></p>

-          <p>Mapping connection names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields for a mapping connection object are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>

-            <tr><td>"description"</td><td>The description of the connection</td></tr>

-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>

-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>

-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>

-            <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Authority connection objects</title>

-          <p></p>

-          <p>Authority connection names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields for an authority connection object are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>

-            <tr><td>"description"</td><td>The description of the connection</td></tr>

-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>

-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>

-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>

-            <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>

-            <tr><td>"authdomain"</td><td>The authorization domain for the authority connection, if any</td></tr>

-            <tr><td>"authgroup"</td><td>The required authority group for the authority connection</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Repository connection objects</title>

-          <p></p>

-          <p>Repository connection names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields for a repository connection object are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>

-            <tr><td>"description"</td><td>The description of the connection</td></tr>

-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>

-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>

-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>

-            <tr><td>"acl_authority"</td><td>The (optional) name of the authority group that will enforce security for this connection</td></tr>

-            <tr><td>"throttle"</td><td>An array of throttle objects, which control how quickly documents can be requested from this connection</td></tr>

-          </table>

-          <p></p>

-          <p>Each throttle object has the following fields:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"match"</td><td>The regular expression which is used to match a document's bins to determine if the throttle should be applied</td></tr>

-            <tr><td>"match_description"</td><td>Optional text describing the meaning of the throttle</td></tr>

-            <tr><td>"rate"</td><td>The maximum fetch rate to use if the throttle applies, in fetches per minute</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Notification connection objects</title>

-          <p></p>

-          <p>Notification connection names, when they are part of a URL, should be encoded as follows:</p>

-          <p></p>

-          <ol>

-            <li>All instances of '.' should be replaced by '..'.</li>

-            <li>All instances of '/' should be replaced by '.+'.</li>

-            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>

-          </ol>

-          <p></p>

-          <p>The JSON fields for a notification connection object are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"name"</td><td>The unique name of the connection</td></tr>

-            <tr><td>"description"</td><td>The description of the connection</td></tr>

-            <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>

-            <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>

-            <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Job objects</title>

-          <p></p>

-          <p>The JSON fields for a job are is as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"id"</td><td>The job's identifier, if present.  If not present, ManifoldCF will create one (and will also create the job when saved).</td></tr>

-            <tr><td>"description"</td><td>Text describing the job</td></tr>

-            <tr><td>"repository_connection"</td><td>The name of the repository connection to use with the job</td></tr>

-            <tr><td>"document_specification"</td><td>The document specification object for the job, whose format is repository-connection specific</td></tr>

-            <tr><td>"start_mode"</td><td>The start mode for the job, which can be one of "schedule window start", "schedule window anytime", or "manual"</td></tr>

-            <tr><td>"run_mode"</td><td>The run mode for the job, which can be either "continuous" or "scan once"</td></tr>

-            <tr><td>"hopcount_mode"</td><td>The hopcount mode for the job, which can be either "accurate", "no delete", "never delete"</td></tr>

-            <tr><td>"priority"</td><td>The job's priority, typically "5"</td></tr>

-            <tr><td>"recrawl_interval"</td><td>The default time between recrawl of documents (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>

-            <tr><td>"max_recrawl_interval"</td><td>The maximum time between recrawl of documents (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>

-            <tr><td>"expiration_interval"</td><td>The time until a document expires (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>

-            <tr><td>"reseed_interval"</td><td>The time between reseeding operations (if the job is "continuous"), in milliseconds, or "infinite" for infinity</td></tr>

-            <tr><td>"hopcount"</td><td>An array of hopcount objects, describing the link types and associated maximum hops permitted for the job</td></tr>

-            <tr><td>"schedule"</td><td>An array of schedule objects, describing when the job should be started and run</td></tr>

-            <tr><td>"pipelinestage"</td><td>An array of pipelinestage objects, describing what the transformation pipeline is</td></tr>

-            <tr><td>"notificationstage"</td><td>An array of notificationstage objects, describing what the notifications are</td></tr>

-          </table>

-          <p></p>

-          <p>Each pipelinestage object has the following fields:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"stage_id"</td><td>The unique identifier for the pipeline stage</td></tr>

-            <tr><td>"stage_prerequisite"</td><td>The unique identifier for the preceding pipeline stage; may be missing if none</td></tr>

-            <tr><td>"stage_isoutput"</td><td>"true" if the stage is an output connection</td></tr>

-            <tr><td>"stage_connectionname"</td><td>The connection name for the pipeline stage</td></tr>

-            <tr><td>"stage_description"</td><td>A description of the pipeline stage</td></tr>

-            <tr><td>"stage_specification"</td><td>The specification string for the pipeline stage</td></tr>

-          </table>

-          <p></p>

-          <p>Each notificationstage object has the following fields:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"stage_id"</td><td>The unique identifier for the notification stage</td></tr>

-            <tr><td>"stage_connectionname"</td><td>The connection name for the notification stage</td></tr>

-            <tr><td>"stage_description"</td><td>A description of the notification stage</td></tr>

-            <tr><td>"stage_specification"</td><td>The specification string for the notification stage</td></tr>

-          </table>

-          <p></p>

-          <p>Each hopcount object has the following fields:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"link_type"</td><td>The connection-type-dependent type of a link for which a hop count restriction is specified</td></tr>

-            <tr><td>"count"</td><td>The maximum number of hops allowed for the associated link type, starting at a seed</td></tr>

-          </table>

-          <p></p>

-          <p>Each schedule object has the following fields:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"timezone"</td><td>The optional time zone for the schedule object; if not present the default server time zone is used</td></tr>

-            <tr><td>"duration"</td><td>The optional length of the described time window, in milliseconds; if not present, duration is considered infinite</td></tr>

-            <tr><td>"dayofweek"</td><td>The optional day-of-the-week enumeration object</td></tr>

-            <tr><td>"monthofyear"</td><td>The optional month-of-the-year enumeration object</td></tr>

-            <tr><td>"dayofmonth"</td><td>The optional day-of-the-month enumeration object</td></tr>

-            <tr><td>"year"</td><td>The optional year enumeration object</td></tr>

-            <tr><td>"hourofday"</td><td>The optional hour-of-the-day enumeration object</td></tr>

-            <tr><td>"minutesofhour"</td><td>The optional minutes-of-the-hour enumeration object</td></tr>

-            <tr><td>"requestminimum"</td><td>Optional flag indicating whether the job run will be minimal or not ("true" means minimal)</td></tr>

-          </table>

-          <p></p>

-          <p>Each enumeration object describes an array of integers using the form:</p>

-          <p></p>

-          <p>{"value":[<em>&lt;integer_list&gt;</em>]}</p>

-          <p></p>

-          <p>Each integer is a zero-based index describing which entity is being specified.  For example, for "dayofweek", 0 corresponds to Sunday, etc., and thus "dayofweek":{"value":[0,6]} would describe Saturdays and Sundays.</p>

-          <p></p>

-        </section>

-        <section>

-          <title>Job status objects</title>

-          <p></p>

-          <p>The JSON fields of a job status object are as follows:</p>

-          <p></p>

-          <table>

-            <tr><th>Field</th><th>Meaning</th></tr>

-            <tr><td>"job_id"</td><td>The job identifier</td></tr>

-            <tr><td>"status"</td><td>The job status, having the possible values: "not yet run", "running", "paused", "done", "waiting", "stopping", "resuming", "starting up", "cleaning up", "error", "aborting", "restarting", "running no connector", and "terminating"</td></tr>

-            <tr><td>"error_text"</td><td>The error text, if the status is "error"</td></tr>

-            <tr><td>"start_time"</td><td>The job start time, in milliseconds since Jan 1, 1970</td></tr>

-            <tr><td>"end_time"</td><td>The job end time, in milliseconds since Jan 1, 1970</td></tr>

-            <tr><td>"documents_in_queue"</td><td>The total number of documents in the queue for the job</td></tr>

-            <tr><td>"documents_outstanding"</td><td>The number of documents for the job that are currently considered 'active'</td></tr>

-            <tr><td>"documents_processed"</td><td>The number of documents that in the queue for the job that have been processed at least once</td></tr>

-          </table>

-          <p></p>

-        </section>

-        <section>

-          <title>Connection-type-specific objects</title>

-          <p></p>

-          <p>As you may note when trying to use the above JSON API methods, you cannot get very far in defining connections or jobs without knowing the JSON format of a connection's configuration information, or a job's connection-specific document specification and output specification information.  The form of these objects is controlled by the Java implementation of the underlying connector, and is translated directly into JSON, so if you write your own connector you should be able to figure out what it will be in the API.  For connectors already part of ManifoldCF, it remains an ongoing task to document these connector-specific objects.  This task is not yet underway.</p>

-          <p></p>

-          <p>Luckily, it is pretty easy to learn a lot about the objects in question by simply creating connections and jobs in the ManifoldCF crawler UI, and then inspecting the resulting JSON objects through the API.  In this way, it should be possible to do a decent job of coding most API-based integrations.  The one place where difficulties will certainly occur will be if you try to completely replace the ManifoldCF crawler UI with one of your own.  This is because most connectors have methods that communicate with their respective back-ends in order to allow the user to select appropriate values.  For example, the path drill-down that is presented by the LiveLink connector requires that the connector interrogate the appropriate LiveLink repository in order to populate its path selection pull-downs.  There is, at this time, only one sanctioned way to accomplish the same job using the API, which is to use the appropriate "<em>connection_type</em>/execute/<em>type-specific_command</em>" command to perform the necessary functions.  Some set of useful functions has been coded for every appropriate connector, but the exact commands for every connector, and their JSON syntax, remains undocumented for now.</p>

-          <p></p>

-        </section>

-        <section>

-          <title>File system connector</title>

-          <p></p>

-          <p>The file system connector has no configuration information, and no connector-specific commands.  However, it does have document specification information.  The information looks something like this:</p>

-          <p></p>

-          <p>{"startpoint":[{"_attribute_path":"c:\path_to_files","include":[{"_attribute_type":"file","_attribute_match":"*.txt"},{"_attribute_type":"file","_attribute_match":"*.doc"\,"_attribute_type":"directory","_attribute_match":"*"],"exclude":["*.mov"]]}</p>

-          <p></p>

-          <p>As you can see, multiple starting paths are possible, and the inclusion and exclusion rules also can be one or multiple.</p>

-          <p></p>

-          <p></p>

-        </section>

-      </section>

-      <section>

-        <title>Control via Commands</title>

-        <p></p>

-        <p>For script writers, there currently exist a number of ManifoldCF execution commands.  These commands are primarily rich in the area of definition of connections and jobs, controlling jobs, and running reports.  The following table lists the current suite.</p>

-        <p></p>

-        <table>

-          <tr><th>Command</th><th>What it does</th></tr>

-          <tr><td>org.apache.manifoldcf.agents.DefineOutputConnection</td><td>Create a new output connection</td></tr>

-          <tr><td>org.apache.manifoldcf.agents.DeleteOutputConnection</td><td>Delete an existing output connection</td></tr>

-          <tr><td>org.apache.manifoldcf.agents.DefineTransformationConnection</td><td>Create a new transformation connection</td></tr>

-          <tr><td>org.apache.manifoldcf.agents.DeleteTransformationConnection</td><td>Delete an existing transformation connection</td></tr>

-          <tr><td>org.apache.manifoldcf.authorities.ChangeAuthSpec</td><td>Modify an authority's configuration information</td></tr>

-          <tr><td>org.apache.manifoldcf.authorities.CheckAll</td><td>Check all authorities to be sure they are functioning</td></tr>

-          <tr><td>org.apache.manifoldcf.authorities.DefineAuthorityConnection</td><td>Create a new authority connection</td></tr>

-          <tr><td>org.apache.manifoldcf.authorities.DeleteAuthorityConnection</td><td>Delete an existing authority connection</td></tr>

-          <tr><td>org.apache.manifoldcf.authorities.DefineMappingConnection</td><td>Create a new mapping connection</td></tr>

-          <tr><td>org.apache.manifoldcf.authorities.DeleteMappingConnection</td><td>Delete an existing mapping connection</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.AbortJob</td><td>Abort a running job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.AddScheduledTime</td><td>Add a schedule record to a job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.ChangeJobDocSpec</td><td>Modify a job's specification information</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.DefineJob</td><td>Create a new job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.DefineRepositoryConnection</td><td>Create a new repository connection</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.DeleteJob</td><td>Delete an existing job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.DeleteRepositoryConnection</td><td>Delete an existing repository connection</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.ExportConfiguration</td><td>Write the complete list of all connection definitions and job specifications to a file</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.FindJob</td><td>Locate a job identifier given a job's name</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.GetJobSchedule</td><td>Find a job's schedule given a job's identifier</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.ImportConfiguration</td><td>Import configuration as written by a previous ExportConfiguration command</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.ListJobStatuses</td><td>List the status of all jobs</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.ListJobs</td><td>List the identifiers for all jobs</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.PauseJob</td><td>Given a job identifier, pause the specified job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RestartJob</td><td>Given a job identifier, restart the specified job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RunDocumentStatus</td><td>Run a document status report</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RunMaxActivityHistory</td><td>Run a maximum activity report</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RunMaxBandwidthHistory</td><td>Run a maximum bandwidth report</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RunQueueStatus</td><td>Run a queue status report</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RunResultHistory</td><td>Run a result history report</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.RunSimpleHistory</td><td>Run a simply history report</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.StartJob</td><td>Start a job</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.WaitForJobDeleted</td><td>After a job has been deleted, wait until the delete has completed</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.WaitForJobInactive</td><td>After a job has been started or aborted, wait until the job ceases all activity</td></tr>

-          <tr><td>org.apache.manifoldcf.crawler.WaitJobPaused</td><td>After a job has been paused, wait for the pause to take effect</td></tr>

-        </table>

-        <p></p>

-      </section>

-      <section>

-        <title>Control by direct code</title>

-        <p></p>

-        <p>Control by direct java code is quite a reasonable thing to do.  The sources of the above commands should give a pretty clear idea how to proceed, if that's what you

-          want to do.</p>

-        <p></p>

-        <p></p>

-      </section>

-      <section>

-        <title>Caveats</title>

-        <p></p>

-        <p>The above commands know nothing about the differences between connection types.  Instead, they deal with configuration and specification information in the

-          form of XML documents.  Normally, these XML documents are hidden from a system integrator, unless they happen to look into the database with a tool such as

-          psql.  But the API commands above often will require such XML documents to be included as part of the command execution.</p>

-        <p></p>

-        <p>This has one major consequence.  Any application that would manipulate connections and jobs directly cannot be connection-type independent - these

-          applications must know the proper form of XML to submit to the command.  So, it is not possible to use these command APIs to write one's own UI wrapper,

-          without sacrificing some of the repository independence that ManifoldCF by itself maintains.</p>

-      </section>

-    </section>

-  </body>

-

-</document>

diff --git a/site/src/documentation/content/xdocs/zh_CN/script.xml b/site/src/documentation/content/xdocs/zh_CN/script.xml
deleted file mode 100644
index d8996f9..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/script.xml
+++ /dev/null
@@ -1,437 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>ManifoldCF Scripting Language</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Overview</title>
-      <p></p>
-      <p>The ManifoldCF scripting language allows symbolic communication with the ManifoldCF API Service
-        in order to define connections and jobs, and perform crawls.  The language provides support for JSON-like hierarchical
-        documents, as well as the ability to construct properly encoded REST URLs.  It also has support for simple control flow
-        and error handling.</p>
-    </section>
-    
-    <section>
-      <title>How to use the script interpreter</title>
-      <p></p>
-      <p>The ManifoldCF script interpreter can be used in two ways - either as a real-time shell (executing a script as it is typed),
-        or interpreting a script file.  The main class of the interpreter is <em>org.apache.manifoldcf.scriptengine.ScriptParser</em>,
-        and the two ways of invoking it are:</p>
-      <source>
-java -cp ... org.apache.manifoldcf.scriptengine.ScriptParser
-      </source>
-      <p>or:</p>
-      <source>
-java -cp ... org.apache.manifoldcf.scriptengine.ScriptParser &lt;script_file&gt; &lt;arg1&gt; ... &lt;argN&gt;
-      </source>
-      <p>If you choose to invoke ScriptParser in interactive mode, simply type your script one line at a time.  Any errors will be reported immediately,
-        and the ScriptParser will accordingly exit.  You can also type ^Z to terminate the script.</p>
-      <p>If you use ScriptParser with a scripting file, that file will be read and interpreted.  The arguments you provide will be loaded into an array
-        of strings, which is accessible from your script as the variable named <em>__args__</em>.</p>
-      <section>
-        <title>Running the script interpreter by hand</title>
-        <p></p>
-        <p>When you build ManifoldCF, the required dependent jars for the scripting language are copied to <em>dist/script-engine/lib</em>.
-          You can run the interpreter in interactive mode by typing:</p>
-        <source>
-cd dist\script-engine
-run-script.bat &lt;args&gt;
-        </source>
-        <p>Or, on Linux:</p>
-        <source>
-cd dist/script-engine
-run-script.sh &lt;args&gt;
-        </source>
-        <p>You will need to set the environment variable <strong>ENGINE_HOME</strong> to point at the <em>dist/script-engine</em> directory beforehand, so that
-            the scripts can locate the appropriate jars.</p>
-      </section>
-      <section>
-        <title>Running the script interpreter using Ant</title>
-        <p></p>
-        <p>You can also start the script interpreter with all the correct required jars using Ant.  Simply type the following:</p>
-        <source>
-ant run-script-interpreter
-        </source>
-        <p>This will start the script interpreter in interactive mode only.</p>
-      </section>
-      <section>
-        <title>Running the script interpreter using Maven</title>
-        <p></p>
-        <p>You can also run the script interpreter using maven.  The commands are:</p>
-        <source>
-cd framework/script-engine
-mvn exec:exec
-        </source>
-        <p>This, once again, will start the interpreter in interactive mode.</p>
-      </section>
-    </section>
-
-    <section>
-      <title>Script language syntax</title>
-      <p></p>
-      <p>A ManifoldCF script is not sensitive to whitespace or indenting.  All comments begin with a '#' character and end with the end of that line.
-        Unquoted tokens can include alphanumeric characters, plus '_', '$', and '@'.  Numeric tokens always begin with a number ('0'-'9'), and are
-        considered floating-point if they include a decimal point ('.').  Otherwise they are integers.  String tokens can be quoted with either a double quote
-        ('"') or a single quote, and within strings characters can be escaped with a preceding backslash ('\').</p>
-      <p>A ManifoldCF script has a syntax that is readily described with a BNF grammar.  See below.</p>
-      <source>
-program:
---&gt; statements
-  
-statements:
---&gt; statement1 ... statementN
-
-statement:
---&gt; 'set' expression '=' expression ';'
---&gt; 'print' expression ';'
---&gt; 'if' expression 'then' statements ['else' statements] ';'
---&gt; 'while' expression 'do' statements ';'
---&gt; 'break' ';'
---&gt; 'error' expression ';'
---&gt; 'insert' expression 'into' expression ['at' expression] ';'
---&gt; 'remove' expression 'from' expression ';'
---&gt; 'wait' expression ';'
---&gt; 'GET' expression '=' expression ';'
---&gt; 'PUT' expression '=' expression 'to' expression ';'
---&gt; 'POST' expression '=' expression 'to' expression ';'
---&gt; 'DELETE' expression ';'
-
-expression:
---&gt; '(' expression ')'
---&gt; expression '&amp;&amp;' expression
---&gt; expression '||' expression
---&gt; '!' expression
---&gt; expression '&amp;' expression
---&gt; expression '|' expression
---&gt; expression '==' expression
---&gt; expression '!=' expression
---&gt; expression '&gt;=' expression
---&gt; expression '&lt;=' expression
---&gt; expression '&gt;' expression
---&gt; expression '&lt;' expression
---&gt; expression '+' expression
---&gt; expression '-' expression
---&gt; expression '*' expression
---&gt; expression '/' expression
---&gt; '-' expression
---&gt; '[' [expression [',' expression ...]] ']'
---&gt; '{' [expression [',' expression ...]] '}'
---&gt; '&lt;&lt;' expression ':' expression ':' [expression '=' expression [',' expression '=' expression ...]] ':' [expression [',' expression ...]] '&gt;&gt;'
---&gt; expression '[' expression ']'
---&gt; expression '.' token
---&gt; token
---&gt; string
---&gt; number
---&gt; 'true' | 'false'
---&gt; 'null'
---&gt; 'new' newexpression
---&gt; 'isnull' expression
-
-newexpression:
---&gt; 'url' expression
---&gt; 'connectionname' expression
---&gt; 'configuration'
---&gt; 'configurationnode' expression
---&gt; 'array'
---&gt; 'dictionary'
---&gt; 'queryarg' expression ['=' expression] 
-
-      </source>  
-    </section>
-    
-    <section>
-      <title>Script language variables</title>
-      <p></p>
-      <p>Variables in the ManifoldCF scripting language determine the behavior of all aspects of expression evaluation, with the exception of operator precedence.
-        In particular, every canonical variable has the ability to support arbitrary <em>attributes</em> (which are named properties of the variable), 
-        <em>subscripts</em> (children which are accessed by a numeric subscript), and all other <em>operations</em>, such as '+' or '=='.  Not all kinds of
-        variable instance will in fact support all such features.  Should you try to use a feature with a variable that does not support it, you will receive a
-        ScriptException telling you what you did wrong.</p>
-      <p>Since the actual operation details are bound to the variable, for binary operations the left-hand variable typically determines what actually takes place.  For example:</p>
-      <source>
-print 3+7;
-     [java] 10
-print "3"+7;
-     [java] 37
-      </source>
-      <p>There is, of course, a way to caste a variable to a different type.  For example:</p>
-      <source>
-print "3".__int__+7;
-     [java] 10
-      </source>
-      <p>Here, we are using the built-in attribute <em>__int__</em> to obtain the integer equivalent of the original string variable "3".  See the following table for
-        a list of some of the standard attributes and their meanings:</p>
-      <table>
-        <caption>Standard attributes</caption>
-        <tr><th>Attribute name</th><th>Meaning</th></tr>
-        <tr><td>__script__</td><td>Returns the script code that would create this variable</td></tr>
-        <tr><td>__string__</td><td>Returns the string value of the variable, if any</td></tr>
-        <tr><td>__int__</td><td>Returns the integer value of the variable, if any</td></tr>
-        <tr><td>__float__</td><td>Returns the floating-point value of the variable, if any</td></tr>
-        <tr><td>__boolean__</td><td>Returns the boolean value of the variable, if any</td></tr>
-        <tr><td>__size__</td><td>Typically returns the number of subscript children</td></tr>
-        <tr><td>__type__</td><td>Returns the 'type' of the variable</td></tr>
-        <tr><td>__value__</td><td>Returns the 'value' of the variable</td></tr>
-        <tr><td>__dict__</td><td>Returns a dictionary equivalent of the variable</td></tr>
-        <tr><td>__OK__</td><td>Returns a boolean 'true' if the variable was "OK", false otherwise</td></tr>
-        <tr><td>__NOTFOUND__</td><td>Returns a boolean 'true' if the variable was "NOTFOUND", false otherwise</td></tr>
-        <tr><td>__CREATED__</td><td>Returns a boolean 'true' if the variable was "CREATED", false otherwise</td></tr>
-      </table>
-      <p>Obviously, only some variables will support each of the standard attributes.  You will receive a script exception if you try to obtain a non-existent
-        attribute for a variable.</p>
-      <section>
-        <title>Integers</title>
-        <p>Integer variable types are created by non-quoted numeric values that do not have a '.' in them.  For example, the character '4' will create an integer
-          variable type with a value of 4.</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Integer operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Addition, yielding an integer</td><td>4+7</td></tr>
-          <tr><td>binary -</td><td>Subtraction, yielding an integer</td><td>7-4</td></tr>
-          <tr><td>binary *</td><td>Multiplication, yielding an integer</td><td>7*4</td></tr>
-          <tr><td>binary /</td><td>Division, yielding an integer</td><td>7/4</td></tr>
-          <tr><td>unary -</td><td>Negation, yielding an integer</td><td>-4</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7 == 4</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7 != 4</td></tr>
-          <tr><td>binary &gt;=</td><td>Greater or equals comparison, yielding a boolean</td><td>7 &gt;= 4</td></tr>
-          <tr><td>binary &lt;=</td><td>Less or equals comparison, yielding a boolean</td><td>7 &lt;= 4</td></tr>
-          <tr><td>binary &gt;</td><td>Greater comparison, yielding a boolean</td><td>7 &gt; 4</td></tr>
-          <tr><td>binary &lt;</td><td>Less comparison, yielding a boolean</td><td>7 &lt; 4</td></tr>
-          <tr><td>binary &amp;</td><td>Bitwise AND, yielding an integer</td><td>7 &amp; 4</td></tr>
-          <tr><td>binary |</td><td>Bitwise OR, yielding an integer</td><td>7 | 4</td></tr>
-          <tr><td>unary !</td><td>Bitwise NOT, yielding an integer</td><td>! 7</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by integer types.</p>
-      </section>
-      <section>
-        <title>Strings</title>
-        <p>String variable types are created by quoted sequences of characters.  For example, the character '"hello world"' will create a string
-          variable type with an (unquoted) value of "hello world".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>String operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Concatenation, yielding a string</td><td>"hi" + "there"</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>"hi" == "there"</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>"hi" != "there"</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by string types.</p>
-      </section>
-      <section>
-        <title>Floating-point numbers</title>
-        <p>Float variable types are created by non-quoted numeric values that have a '.' in them.  For example, the token '4.1' will create a float
-          variable type with a value of 4.1</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Float operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary +</td><td>Addition, yielding a float</td><td>4.0+7.0</td></tr>
-          <tr><td>binary -</td><td>Subtraction, yielding a float</td><td>7.0-4.0</td></tr>
-          <tr><td>binary *</td><td>Multiplication, yielding a float</td><td>7.0*4.0</td></tr>
-          <tr><td>binary /</td><td>Division, yielding a float</td><td>7.0/4.0</td></tr>
-          <tr><td>unary -</td><td>Negation, yielding a float</td><td>-4.0</td></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7.0 == 4.0</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7.0 != 4.0</td></tr>
-          <tr><td>binary &gt;=</td><td>Greater or equals comparison, yielding a boolean</td><td>7.0 &gt;= 4.0</td></tr>
-          <tr><td>binary &lt;=</td><td>Less or equals comparison, yielding a boolean</td><td>7.0 &lt;= 4.0</td></tr>
-          <tr><td>binary &gt;</td><td>Greater comparison, yielding a boolean</td><td>7.0 &gt; 4.0</td></tr>
-          <tr><td>binary &lt;</td><td>Less comparison, yielding a boolean</td><td>7.0 &lt; 4.0</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__int__</em>, and <em>__float__</em> are supported 
-          by float types.</p>
-      </section>
-      <section>
-        <title>Booleans</title>
-        <p>Boolean variable types are created by the keywords <strong>true</strong> and <strong>false</strong>.  For example, the code 'true' will create a boolean
-          variable type with a value of "true".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Boolean operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equality comparison, yielding a boolean</td><td>7.0 == 4.0</td></tr>
-          <tr><td>binary !=</td><td>Inequality comparison, yielding a boolean</td><td>7.0 != 4.0</td></tr>
-          <tr><td>binary &amp;&amp;</td><td>AND logical operation, yielding a boolean</td><td>true &amp;&amp; false</td></tr>
-          <tr><td>binary ||</td><td>OR logical operation, yielding a boolean</td><td>true || false</td></tr>
-          <tr><td>binary &amp;</td><td>AND logical operation, yielding a boolean</td><td>true &amp; false</td></tr>
-          <tr><td>binary |</td><td>OR logical operation, yielding a boolean</td><td>true | false</td></tr>
-          <tr><td>unary !</td><td>NOT logical operation, yielding a boolean</td><td>! true</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__boolean__</em> are supported 
-          by boolean types.</p>
-      </section>
-      <section>
-        <title>Arrays</title>
-        <p>Array variable types are created by an initializer of the form <strong>[</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ...]] <strong>]</strong>.  For example, the script code '[3, 4]' will create an array
-          variable type with two values,  the integer "3" and the integer "4".</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Array operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified subscript variable, yielding the variable</td><td>[3,4] [0]</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__size__</em> are supported 
-          by array types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>Dictionaries</title>
-        <p>Dictionary variable types are created using the "new" operator, e.g. <strong>new</strong> <strong>dictionary</strong>.</p>
-        <p>The operations supported for this variable type, and their meanings, are listed in the table below:</p>
-        <table>
-          <caption>Array operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified key, yielding the keyed variable</td><td>mydict ["keyname"]</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__size__</em> are supported 
-          by dictionary types.</p>
-      </section>
-      <section>
-        <title>Configurations</title>
-        <p>Configuration variables contain the equivalent of the JSON used to communicate with the ManifoldCF API.  They can be created using an initializer
-          of the form <strong>{</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ...]] <strong>}</strong>.  For example, the script code '{ &lt;&lt; "outputconnector" : "" :  : , &lt;&lt; "description" : "Solr" :  :  &gt;&gt;, &lt;&lt; "class_name" : "org.apache.manifoldcf.agents.output.solr.SolrConnector" :  :  &gt;&gt; &gt;&gt; }'
-          would create a configuration variable equivalent to one that might be returned from the ManifoldCF API if it was queried for the output connectors registered by the system.</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Configuration operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified child configuration node variable, yielding the variable</td><td>myconfig [0]</td></tr>
-          <tr><td>binary +</td><td>Append a configuration child node variable to the list</td><td>myconfig + &lt;&lt; "something" : "somethingvalue" : : &gt;&gt;</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__dict__</em>, and <em>__size__</em> are supported 
-          by configuration variable types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>Configuration nodes</title>
-        <p>Configuration node variable types are children of configuration variable types or configuration node variable types.  They have several components, as listed below:</p>
-        <ul>
-          <li>A type</li>
-          <li>A value</li>
-          <li>Attributes, described as a set of name/value pairs</li>
-          <li>Children, which must be configuration node variable types</li>
-        </ul>
-        <p>Configuration node variable types can be created using an initializer of the form <strong>&lt;&lt;</strong> <em>expression</em> <strong>:</strong> <em>expression</em> <strong>:</strong> [<em>expression</em> <strong>=</strong> <em>expression</em> [<strong>,</strong> <em>expression</em> <strong>=</strong> <em>expression</em> ...]] <strong>:</strong> [<em>expression</em> [<strong>,</strong> <em>expression</em> ... ]] '&gt;&gt;'.
-          The first expression represents the type of the node.  The second is the node's value.  The series of '=' expressions represents attribute names and values.  The last series represents
-          the children of the node.  For example, the script code '&lt;&lt; "description" : "Solr" :  :  &gt;&gt;' represents a node of type 'description' with a value of 'Solr', with no attributes or children.</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Configuration node operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>subscript []</td><td>Find the specified child configuration node variable, yielding the variable</td><td>myconfig [0]</td></tr>
-          <tr><td>binary +</td><td>Append a configuration child node variable to the list</td><td>myconfig + &lt;&lt; "something" : "somethingvalue" : : &gt;&gt;</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em>, <em>__string__</em>, <em>__size__</em>, <em>__type__</em>, <em>__dict__</em> and <em>__value__</em> are supported 
-          by configuration node variable types, as well as the <em>insert</em> and <em>remove</em> statements.</p>
-      </section>
-      <section>
-        <title>URLs</title>
-        <p>URL variable types exist to take care of the details of URL encoding while assembling the REST URL's needed to describe objects in ManifoldCF's REST API.  A URL variable
-          type can be created using a 'new' operation of the form <strong>new</strong> <strong>url</strong> <em>expression</em>, where the expression is the already-encoded root path.  For example, the script code 'new url "http://localhost:8345/mcf-api-service/json"'
-          would create a URL variable type with the root path "http://localhost:8345/mcf-api-service/json".</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>URL operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>url1 == url2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>url1 != url2</td></tr>
-          <tr><td>binary +</td><td>Append and encode another path or query argument element, yielding a URL</td><td>url1 + "repositoryconnections"</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by URL variable types.</p>
-      </section>
-      <section>
-        <title>Query Arguments</title>
-        <p>Query Argument variable types exist to take care of the details of URL encoding while assembling the query arguments of a REST URL for ManifoldCF's REST API.  A Query Argument variable
-          type can be created using a 'new' operation of the form <strong>new</strong> <strong>queryarg</strong> <em>expression</em> [<strong>=</strong> <em>expression</em>], where the first expression is the
-          query argument name, and the second optional expression is the query argument value.  For example, the script code 'new queryarg "report" = "simple"'
-          would create a Query Argument variable type representing the query argument "report=simple".  To add query arguments to a URL, simply add them using the '+' operator,
-          for example "urlvar = urlvar + new queryarg 'report' = 'simple';" .</p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>Query Argument operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>arg1 == arg2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>arg1 != arg2</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by Query Argument variable types.</p>
-      </section>
-      <section>
-        <title>Connection names</title>
-        <p>Connection name variable types exist to perform the extra URL encoding needed for ManifoldCF's REST API.  Connection names must be specially encoded so that they do not
-          contain slash characters ('/').  Connection name variable types take care of this encoding.</p>
-        <p>You can create a connection name variable type using the following syntax: <strong>new</strong> <strong>connectionname</strong> <em>expression</em>, where the expression is the name of the connection.
-        </p>
-        <p>The operations supported for this variable type, and their meanings are listed in the table below:</p>
-        <table>
-          <caption>URL operations</caption>
-          <tr><th>Operation</th><th>Meaning</th><th>Example</th></tr>
-          <tr><td>binary ==</td><td>Equals comparison, yielding a boolean</td><td>cn1 == cn2</td></tr>
-          <tr><td>binary !=</td><td>Non-equals comparison, yielding a boolean</td><td>cn1 != cn2</td></tr>
-        </table>
-        <p>In addition, the standard attributes <em>__script__</em> and <em>__string__</em>  are supported 
-          by connection name variable types.</p>
-      </section>
-      <section>
-        <title>Results</title>
-        <p>Result variable types capture the result of a GET, PUT, POST, or DELETE statement.  They consist of two parts:</p>
-        <ul>
-          <li>A result code</li>
-          <li>A result configuration value</li>
-        </ul>
-        <p>There is no way to directly create a result variable type, nor does it support any operations.  However, the standard attributes <em>__script__</em>, <em>__string__</em>,
-          <em>__value__</em>, <em>__OK__</em>, <em>__NOTFOUND__</em>, and <em>__CREATED__</em> are all supported by result variable types.</p>
-      </section>
-    </section>
-    
-    <section>
-      <title>Statements</title>
-      <p>The statements available to a ManifoldCF script programmer are designed to support interaction with the ManifoldCF API.  Thus, there is support for
-        all four HTTP verbs, as well as basic variable setting and control flow.  The table below describes each statement type:</p>
-      <table>
-        <caption>Statement types</caption>
-        <tr><th>Statement</th><th>Meaning</th><th>Example</th></tr>
-        <tr><td>'set' expression '=' expression ';'</td><td>Sets the variable described by the first expression with the value computed for the second</td><td>set myvar = 4 + 5;</td></tr>
-        <tr><td>'print' expression ';'</td><td>Prints the string value of the expression to stdout</td><td>print "hello world";</td></tr>
-        <tr><td>'if' expression 'then' statements ['else' statements] ';'</td><td>If the boolean value of the expression is 'true', executes the first set of statements, otherwise executes the (optional) second set</td><td>if true then print "hello"; else print "there"; ;</td></tr>
-        <tr><td>'while' expression 'do' statements ';'</td><td>While expression is true, execute the specified statements, and repeat</td><td>while count > 0 do set count = count - 1; ;</td></tr>
-        <tr><td>'break' ';'</td><td>Exits from the nearest enclosing while loop</td><td>while true do break; ;</td></tr>
-        <tr><td>'error' expression ';'</td><td>Aborts the script with a script exception based on the string value of the expression</td><td>error "bad stuff";</td></tr>
-        <tr><td>'wait' expression ';'</td><td>Waits the number of milliseconds corresponding to the integer value of the expression</td><td>wait 1000;</td></tr>
-        <tr><td>'insert' expression 'into' expression ['at' expression] ';'</td><td>Inserts the first expression into the second variable expression, either at the end or optionally at the position specified by the third expression</td><td>insert 4 into myarray at 0 ;</td></tr>
-        <tr><td>'delete' expression 'from' expression ';'</td><td>Deletes the element described by the first expression from the second expression</td><td>delete 0 from myarray ;</td></tr>
-        <tr><td>'GET' expression '=' expression ';'</td><td>Perform an HTTP GET from the URL specified in the second expression capturing the result in the first expression</td><td>GET result = new url "http://localhost:8345/mcf-api-service/json/repositoryconnections" ;</td></tr>
-        <tr><td>'DELETE' expression '=' expression ';'</td><td>Perform an HTTP DELETE on the URL specified in the second expression capturing the result in the first expression</td><td>DELETE result = myurl ;</td></tr>
-        <tr><td>'PUT' expression '=' expression 'to' expression ';'</td><td>Perform an HTTP PUT of the second expression to the URL specified in the third expression capturing the result in the first expression</td><td>PUT result = configurationObject to myurl ;</td></tr>
-        <tr><td>'POST' expression '=' expression 'to' expression ';'</td><td>Perform an HTTP POST of the second expression to the URL specified in the third expression capturing the result in the first expression</td><td>POST result = configurationObject to myurl ;</td></tr>
-      </table>
-    </section>
-  </body>
-
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/technical-resources.xml b/site/src/documentation/content/xdocs/zh_CN/technical-resources.xml
deleted file mode 100755
index c5d3e4f..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/technical-resources.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- 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.
--->
-
-<document>
-<header><title>ManifoldCF - 开发人员资源</title></header>
-<properties>
-</properties>
-<body>
-
-    <section id="securityarchitecturediagrams">
-          <title>安全结构图</title>
-          <p>下面是ManifoldCF的安全结构图:</p>
-          <br/><br/>
-          <figure src="images/zh_CN/SecurityArchitecture.png" alt="ManifoldCF Security Architecture" width="80%"/>
-          <br/><br/>
-          <p>如使用Apache认证,模型变为:</p>
-          <br/><br/>
-          <figure src="images/zh_CN/LCFApacheArchitecture.png" alt="ManifoldCF Security Architecture, with Apache" width="80%"/>
-          <br/><br/>
-    </section>
-
-    <section id="processarchitecturediagrams">
-          <title>流程结构图</title>
-          <p>下面是ManifoldCF的流程结构图:</p>
-          <br/><br/>
-          <figure src="images/zh_CN/MCFProcessArchitecture.png" alt="ManifoldCF Process Architecture" width="80%"/>
-          <br/><br/>
-    </section>
-
-    <section id="howtowriteconnectors">
-	<title>创建连接器</title>
-	<p>通过创建连接器可进一步了解ManifoldCF工程。亦可将成果贡赠送此工程。
-	</p> 
-	<ul>
-	    <li><a href="writing-output-connectors.html">如何创建输出连接器</a></li>
-	    <li><a href="writing-transformation-connectors.html">如何创建转换连接器</a></li>
-	    <li><a href="writing-mapping-connectors.html">如何创建用户映射连接器</a></li>
-	    <li><a href="writing-authority-connectors.html">如何创建权限连接器</a></li>
-	    <li><a href="writing-repository-connectors.html">如何创建存储库连接器</a></li>
-	</ul>
-    </section>
-
-</body>
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/writing-authority-connectors.xml b/site/src/documentation/content/xdocs/zh_CN/writing-authority-connectors.xml
deleted file mode 100644
index 2634423..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/writing-authority-connectors.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing authority connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing an Authority Connector</title>
-      <p></p>
-      <p>An authority connector to a repository allows a repository's security model to be enforced by a search engine.  Its only function is to convert a user name (which is often a Kerberos principal name) into a set of _access tokens_.</p>
-      <p></p>
-      <p>The definition of an access token within ManifoldCF for a given repository is completely defined by the connectors that deal with that repository, with one exception.  That exception is for Active Directory.  Active Directory is so prevalent as a repository authorization mechanism that ManifoldCF currently treats it as the "default" authority - that is, if you don't specify another authority when you define a repository connection, ManifoldCF presumes that you mean that Active Directory should be the controlling authority for the connection.  In that case, an access token is simply an Active Directory SID.</p>
-      <p></p>
-      <p>For those repositories that do not use Active Directory as their authorization mechanism, an authority connector should be written, along with the repository connector for the repository.  Access tokens in that case represent a contract between your implementation of the authority connector for the repository, and the repository connector for the repository.  They must work together to define access tokens that will limit document access when used properly within any search engine query.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an authority connector consists of a single parts:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.authorities.interfaces.IAuthorityConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The authority connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific authority connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Authority connection</td><td>An authority connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>User name</td><td>The name of a user, which is often a Kerberos principal name, e.g. <em>john@apache.org</em></td></tr>
-          <tr><td>Access token</td><td>An arbitrary string, which is only meaningful within the context of a specific authority connector, that describes a quantum of authorization</td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual authority connector class instance is managed and used</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Authority Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the authority connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided authority connector implementations.  The Documentum connector, the LiveLink connector, the Memex connector, and the Meridio connector all include authority connectors which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that all of these connectors extend a framework-provided authority connector base class, found at <em>org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an authority connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>getAuthorizationResponse()</strong></td><td>Obtain the authorization response, given a user name</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an authority connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an authority connection <em>ConfigParams</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in two broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection.  Together they do the heavy lifting of your connector.</p>
-          <p></p>
-          <p>The <em>getAuthorizationResponse()</em> method returns an <em>AuthorizationResponse</em> object, which can describe a number of conditions:</p>
-          <p></p>
-          <table>
-            <tr><th>Condition</th><th>Meaning</th></tr>
-            <tr><td>RESPONSE_OK</td><td>The access tokens for the user were successfully obtained from the repository, and are being returned</td></tr>
-            <tr><td>RESPONSE_UNREACHABLE</td><td>The repository is currently unreachable, and appropriate disabling tokens are being returned</td></tr>
-            <tr><td>RESPONSE_USERNOTFOUND</td><td>The user was not found within the repository, and appropriate disabling tokens are being returned</td></tr>
-            <tr><td>RESPONSE_USERUNAUTHORIZED</td><td>The user was found, but was in some way disabled, and appropriate disabling tokens are being returned</td></tr>
-          </table>
-          <p></p>
-          <p></p>
-          <p>In all cases, the connector returns access tokens.  But in the case where token lookup has failed in some way, it is the responsibility of the connector to insure that inappropriate content is not viewed.  Usually, this is done by ingesting a "global deny" token attached to all documents from the given repository, and then having the associated authority connector return this global deny token when error conditions apply.</p>
-          <p></p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied authority connector's UI code, both for a description of the arguments to each page, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/zh_CN/writing-mapping-connectors.xml b/site/src/documentation/content/xdocs/zh_CN/writing-mapping-connectors.xml
deleted file mode 100644
index 4b60153..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/writing-mapping-connectors.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing user mapping connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing a User Mapping Connector</title>
-      <p></p>
-      <p>A user mapping connector allows a user name to be transformed in a manner that depends on the functionality of the connector.  In some cases, no connection to
-            an external repository is required (for example, simple string transformations), while in some cases one might imagine such a connector consulting with (say) an
-            LDAP system to look up a specific name.</p>
-      <p></p>
-      <p>A user name is just a string, which is designed to represent a user identity.  Some user names have specific forms - for instance, Active Directory user names are
-            often represented in the form <code>user@domain</code>.  But, most importantly, the exact name used can often depend on the particular system being addressed.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, a user mapping connector consists of a single part:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.authorities.interfaces.IMappingConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The mapping connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific mapping connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Mapping connection</td><td>An mapping connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>User name</td><td>The name of a user, which is often a Kerberos principal name, e.g. <em>john@apache.org</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual mapping connector class instance is managed and used</td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Mapping Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the mapping connector interface.  You will note that the javadoc describes the usage and pooling model for a
-              connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing,
-              must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided mapping connector implementations.  The only connector presently included (the Regular Expression
-              user mapping connector) demonstrates some of the sorts of techniques you will need for an effective
-              implementation.  You will also note that all of these connectors extend a framework-provided mapping connector base class, found at
-              <em>org.apache.manifoldcf.authorities.mappers.BaseMappingConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the
-              connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have
-              database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not
-              very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating a mapping connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>mapUser()</strong></td><td>Given an input user name, find the corresponding output user name</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from a mapping connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for a mapping connection <em>ConfigParams</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in two broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection.  Together they
-                do the heavy lifting of your connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods 
-                above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is
-                displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel
-                to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied mapping connector's UI code, both for a description of the arguments
-                to each page, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.
-              (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however,
-              some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email
-              to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/zh_CN/writing-output-connectors.xml b/site/src/documentation/content/xdocs/zh_CN/writing-output-connectors.xml
deleted file mode 100644
index 2cecac1..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/writing-output-connectors.xml
+++ /dev/null
@@ -1,149 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing output connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing an Output Connector</title>
-      <p></p>
-      <p>An output connector furnishes the mechanism by which content that has been fetched from a repository gets handed to a back-end repository for processing.  It also furnishes a mechanism for removing previously-processed content from that back end repository.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an output connector consists of a single part, which is:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.agents.interfaces.IOutputConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The output connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific output connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Output connection</td><td>An output connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Document URI</td><td>The unique URI (or, in some cases, file IRI) of a document, which is meant to be displayed in search engine results as the link to the document</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual output connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework, e.g. recording activities; see <em>org.apache.manifoldcf.agents.interfaces.IOutputAddActivity</em> and <em>org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity</em></td></tr>
-          <tr><td>Output specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific output connector should do in the context of a specific job; see <em>org.apache.manifoldcf.agents.interfaces.OutputSpecification</em></td></tr>
-          <tr><td>Output version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if an ingestion operation needs to be repeated as a result of changes to the output specification in effect for a document</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Output Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the output connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided output connector implementations.  The GTS connector, the SOLR connector, the OpenSearchServer connector, the ElasticSearch connector, and the Null Output connector all are output connectors which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that all of these connectors extend a framework-provided output connector base class, found at <em>org.apache.manifoldcf.agents.output.BaseOutputConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an output connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>checkMimetypeIndexable()</strong></td><td>Decide whether a document with a given mime type is indexable or not</td></tr>
-            <tr><td><strong>checkDocumentIndexable()</strong></td><td>Decide whether a file is indexable or not</td></tr>
-            <tr><td><strong>checkLengthIndexable()</strong></td><td>Decide whether a document of a given length is indexable or not</td></tr>
-            <tr><td><strong>checkURLIndexable()</strong></td><td>Decide whether a document with a given URL is indexable or not</td></tr>
-            <tr><td><strong>getPipelineDescription()</strong></td><td>Use the supplied output specification to come up with an output version string</td></tr>
-            <tr><td><strong>addOrReplaceDocument()</strong></td><td>Add or replace the specified document within the target repository, or signal if the document cannot be handled</td></tr>
-            <tr><td><strong>removeDocument()</strong></td><td>Remove the specified document from the target repository</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an output connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the output specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the output version string</title>
-          <p></p>
-          <p>The output version string is used by ManifoldCF to determine whether or not the output specification or configuration changed in such a way as to require that the document be reprocessed.  ManifoldCF therefore requests the output version string for any document that is ready for processing, and usually does not process the document again if the returned output version string agrees with the output version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what an output connector writer needs to do is include everything in the output version string that could potentially affect how the document gets ingested, save that which is specific to the repository connector.  That may include bits of output connector configuration information, as well as data from the output specification.  When it's time to ingest, it's usually the correct thing to do to obtain the necessary data for ingestion out of the output version string, rather than calculating it or fetching it anew, because that guarantees that the document processing was done in a manner that agrees with its recorded output version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of the UI methods must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each method, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the framework's HTML or any specific repository connector's HTML.  The <em>OutputSpecification</em> HTML especially may be prone to collisions, because within any given job, this HTML is included in the same page as HTML from the chosen repository connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/content/xdocs/zh_CN/writing-repository-connectors.xml b/site/src/documentation/content/xdocs/zh_CN/writing-repository-connectors.xml
deleted file mode 100644
index af25100..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/writing-repository-connectors.xml
+++ /dev/null
@@ -1,223 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing repository connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing repository connectors</title>
-      <p></p>
-      <p>A repository connector furnishes the mechanism for obtaining documents, metadata, and authority tokens from a repository.  The documents are expected to be handed to an output connector (described elsewhere) for ingestion into some other back-end repository.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, an output connector consists of only one part:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.crawler.interfaces.IRepositoryConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The repository connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific repository connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Repository connection</td><td>A repository connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Document identifier</td><td>An arbitrary identifier, whose meaning determined only within the context of a specific repository connector, which the connector uses to describe a document within a repository</td></tr>
-          <tr><td>Document URI</td><td>The unique URI (or, in some cases, file IRI) of a document, which is meant to be displayed in search engine results as the link to the document</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Access token</td><td>A string, which is only meaningful in the context of a specific authority, that describes a quantum of authorization for a user</td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual repository connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework, e.g. recording the activity history; see <em>org.apache.manifoldcf.crawler.interfaces.IVersionActivity</em>, and <em>org.apache.manifoldcf.crawler.interfaces.IProcessActivity</em>, and <em>org.apache.manifoldcf.crawler.interfaces.ISeedingActivity</em></td></tr>
-          <tr><td>Document specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific repository connector should do in the context of a specific job; see <em>org.apache.manifoldcf.crawler.interfaces.DocumentSpecification</em></td></tr>
-          <tr><td>Document version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if a fetch or ingestion operation needs to be repeated as a result of changes to the document specification in effect for a document, or because of changes to the document itself</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the output repository is unavailable, and gives a best estimate of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Repository Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the repository connector interface.  You will note that the javadoc describes the usage and pooling model for a connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine some of the provided repository connector implementations.  There are a wide variety of connectors include with ManifoldCF that exercise just about every aspect of the repository connector interface.  These are:</p>
-        <p></p>
-        <ul>
-          <li>Documentum (uses RMI to segregate native code, etc.)</li>
-          <li>FileNet (also uses RMI, but because it is picky about its open-source jar versions)</li>
-          <li>File system (a good, but simple, example)</li>
-          <li>LiveLink (demonstrates use of local keystore infrastructure)</li>
-          <li>Meridio (local keystore, web services, result sets)</li>
-          <li>SharePoint (local keystore, web services)</li>
-          <li>RSS (local keystore, binning, fuzzy xml parsing)</li>
-          <li>Web (local database schema, local keystore, binning, events and prerequisites, cache management, fuzzy xml parsing)</li>
-          <li>Wiki (binning, rigorous xml parsing)</li>
-        </ul>
-        <p></p>
-        <p>You will also note that all of these connectors extend a framework-provided repository connector base class, found at <em>org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector</em>.  This base class furnishes some basic bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however, not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating a repository connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>addSeedDocuments()</strong></td><td>Use the supplied document specification to come up with an initial set of document identifiers</td></tr>
-            <tr><td><strong>getDocumentVersions()</strong></td><td>Come up with a version string for each of the documents described by the supplied set of document identifiers, or signal if the document is no longer present</td></tr>
-            <tr><td><strong>processDocuments()</strong></td><td>Take the appropriate action (e.g. ingest, or extract references from, or whatever) for a given set of documents described by document identifier and version string</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from a repository connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for a repository connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the document specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Model</title>
-          <p></p>
-          <p>Each connector must declare a specific model which it adheres to.  These models basically describe what the <strong>addSeedDocuments()</strong> method actually does, and are described below.</p>
-          <p></p>
-          <table>
-            <tr><th>Model</th><th>Description</th></tr>
-            <tr><td><em>MODEL_ALL</em></td><td>The <strong>addSeedDocuments()</strong> method supplies all specified documents on each call</td></tr>
-            <tr><td><em>MODEL_PARTIAL</em></td><td>The <strong>addSeedDocuments()</strong> does not return a complete list of documents that match the criteria and time interval, because some of those documents are no longer discoverable</td></tr>
-            <tr><td><em>MODEL_ADD</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least all the matching documents that have been added to the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_ADD_CHANGE</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least those matching documents that have been added or changed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_ADD_CHANGE_DELETE</em></td><td>The <strong>addSeedDocuments()</strong> method supplies at least those matching documents that have been added, changed, or removed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least all the matching documents that have been added to the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD_CHANGE</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least those matching documents that have been added or changed in the repository, within the specified time interval</td></tr>
-            <tr><td><em>MODEL_CHAINED_ADD_CHANGE_DELETE</em></td><td>The <strong>addSeedDocuments()</strong> method, plus documents reachable by discovery from seeds, supplies at least those matching documents that have been added, changed, or removed in the repository, within the specified time interval</td></tr>
-          </table>
-          <p></p>
-          <p>Note that the choice of model is actually much more subtle than the above description might indicate.  It may, for one thing, be affected by characteristics of
-            the repository, such as whether the repository considers a document to have been changed if its security information was changed.  This would mean that,
-            even though most document changes are picked up and thus one might be tempted to declare the connector to be <em>MODEL_ADD_CHANGE</em>, the
-            correct choice would in fact be <em>MODEL_ADD</em>.</p>
-          <p></p>
-          <p>Another subtle point is what documents the connector is actually supposed to return by means of the <strong>addSeedDocuments()</strong> method.  The
-            start time and end time parameters handed to the method do not have to be strictly adhered to, for instance; it is always okay to return more documents.  It is never
-            okay for the connector to return fewer documents than were requested, on the other hand.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing a document identifier format</title>
-          <p></p>
-          <p>In order to decide on the format for a document identifier, you need to understand what this identifier is used for, and what it represents.  A document identifier usually corresponds to some entity within the source repository, such as a document or a folder.  Note that there is <strong>no</strong> requirement that the identifier represent indexable content.</p>
-          <p></p>
-          <p>The document identifier must be capable of furnishing enough information to:</p>
-          <p></p>
-          <ul>
-            <li>Calculate a version string for the document</li>
-            <li>Find child references for the document</li>
-            <li>Get the document's content, metadata, and access tokens</li>
-          </ul>
-          <p></p>
-          <p>We highly recommend that no additional information be included in the document identifier, other than what is needed for the above, as that will almost certainly cause problems.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the document version string</title>
-          <p></p>
-          <p>The document version string is used by ManifoldCF to determine whether or not the document or configuration changed in such a way as to require that the document
-            be reprocessed.  ManifoldCF therefore requests the version string for any document that is ready for processing, and usually does not process the document again if the
-            returned version string agrees with the version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what a connector writer needs to do is include everything in the version string that could potentially affect how the
-            document gets processed.  That may include the version of the document in the repository, bits of configuration information, metadata, and even access tokens (if the
-            underlying repository versions these things independently from the document itself).  Storing all of that information in the version string seems like a lot - but the string
-            is unlimited in length, and it actually serves another useful purpose to do it that way.  Specifically, when it comes time to do the actual processing, it's often the correct
-            thing to do to obtain the necessary data out of the version string, rather than calculating it or fetching it anew.  That way of working guarantees that the document
-            processing was done in a manner that agrees with its recorded version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-          <p>For longer data that needs to persist between the <strong>getDocumentVersions()</strong> method call and the <strong>processDocuments()</strong> method
-            call, the connector is welcome to save this information in a temporary disk file.  To help make sure nothing leaks which this approach is used, the IRepositoryConnector
-            interface has a method that will be called to clean up any temporary files that might have been created in the handling of a given document identifier.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of these elements must properly implement the tabbed model.  This means that the "header" methods
-            above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is
-            displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the
-            rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each page, and
-            for some decent ideas of ways to organize your connector's UI code.  </p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the
-            framework's HTML or any specific output connector's HTML.  The <em>DocumentSpecification</em> editing HTML especially may be prone to collisions, because
-            within any given job, this HTML is included in the same page as HTML from the chosen output connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.
-          (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however,
-          some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email
-          to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
diff --git a/site/src/documentation/content/xdocs/zh_CN/writing-transformation-connectors.xml b/site/src/documentation/content/xdocs/zh_CN/writing-transformation-connectors.xml
deleted file mode 100644
index 4b701ec..0000000
--- a/site/src/documentation/content/xdocs/zh_CN/writing-transformation-connectors.xml
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
-          "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<!--
- 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.
--->
-
-<document> 
-
-  <header> 
-    <title>Writing transformation connectors</title> 
-  </header> 
-
-  <body> 
-    <section>
-      <title>Writing a Transformation Connector</title>
-      <p></p>
-      <p>A transformation connector provides a mechanism by which content that has been fetched from a repository can be modified before it gets handed to a back-end repository for processing.</p>
-      <p></p>
-      <p>As is the case with all connectors under the ManifoldCF umbrella, a transformation connector consists of a single part, which is:</p>
-      <p></p>
-      <ul>
-        <li>A class implementing an interface (in this case, <em>org.apache.manifoldcf.agents.interfaces.ITransformationConnector</em>)</li>
-      </ul>
-      <p></p>
-      <section>
-        <title>Key concepts</title>
-        <p></p>
-        <p>The transformation connector abstraction makes use of, or introduces, the following concepts:</p>
-        <p></p>
-        <table>
-          <tr><th>Concept</th><th>What it is</th></tr>
-          <tr><td>Configuration parameters</td><td>A hierarchical structure, internally represented as an XML document, which describes a specific configuration of a specific
-            transformation connector, i.e. <strong>how</strong> the connector should do its job; see <em>org.apache.manifoldcf.core.interfaces.ConfigParams</em></td></tr>
-          <tr><td>Transformation connection</td><td>An output connector instance that has been furnished with configuration data</td></tr>
-          <tr><td>Repository document</td><td>An object that describes a document's contents, including raw document data (as a stream), metadata (as either strings or
-            streams), and access tokens; see <em>org.apache.manifoldcf.agents.interfaces.RepositoryDocument</em></td></tr>
-          <tr><td>Connection management/threading/pooling model</td><td>How an individual output connector class instance is managed and used</td></tr>
-          <tr><td>Activity infrastructure</td><td>The framework API provided to specific methods allowing those methods to perform specific actions within the framework,
-            e.g. recording activities; see <em>org.apache.manifoldcf.agents.interfaces.IOutputAddActivity</em> and <em>org.apache.manifoldcf.agents.interfaces.IOutputRemoveActivity</em></td></tr>
-          <tr><td>Output specification</td><td>A hierarchical structure, internally represented as an XML document, which describes <strong>what</strong> a specific
-            transformation connector should do in the context of a specific job; see <em>org.apache.manifoldcf.agents.interfaces.OutputSpecification</em></td></tr>
-          <tr><td>Transformation version string</td><td>A simple string, used for comparison purposes, that allows ManifoldCF to figure out if an ingestion operation needs
-            to be repeated as a result of changes to the output specification in effect for a document</td></tr>
-          <tr><td>Service interruption</td><td>A specific kind of exception that signals ManifoldCF that the transformation engine is unavailable, and gives a best estimate
-            of when it might become available again; see <em>org.apache.manifoldcf.agents.interfaces.ServiceInterruption</em></td></tr>
-        </table>
-        <p></p>
-        <p></p>
-      </section>
-      <section>
-        <title>Implementing the Transformation Connector class</title>
-        <p></p>
-        <p>A very good place to start is to read the javadoc for the transformation connector interface.  You will note that the javadoc describes the usage and pooling model for a
-          connector class pretty thoroughly.  It is very important to understand the model thoroughly in order to write reliable connectors!  Use of static variables, for one thing, must
-          be done in a very careful way, to avoid issues that would be hard to detect with a cursory test.</p>
-        <p></p>
-        <p>The second thing to do is to examine the provided transformation connector implementations.  The only currently enabled connector is the null transformation connector,
-          which demonstrate (to some degree) the sorts of techniques you will need for an effective implementation.  You will also note that this connector extends a framework-provided
-          transformation connector base class, found at <em>org.apache.manifoldcf.agents.transformation.BaseTransformationConnector</em>.  This base class furnishes some basic
-          bookkeeping logic for managing the connector pool, as well as default implementations of some of the less typical functionality a connector may have.  For example, connectors
-          are allowed to have database tables of their own, which are instantiated when the connector is registered, and are torn down when the connector is removed.  This is, however,
-          not very typical, and the base implementation reflects that.</p>
-        <p></p>
-        <section>
-          <title>Principle methods</title>
-          <p></p>
-          <p>The principle methods an implementer should be concerned with for creating an output connector are the following:</p>
-          <p></p>
-          <table>
-            <tr><th>Method</th><th>What it should do</th></tr>
-            <tr><td><strong>checkMimetypeIndexable()</strong></td><td>Decide whether a document with a given mime type is indexable or not</td></tr>
-            <tr><td><strong>checkDocumentIndexable()</strong></td><td>Decide whether a file is indexable or not</td></tr>
-            <tr><td><strong>checkLengthIndexable()</strong></td><td>Decide whether a document of a given length is indexable or not</td></tr>
-            <tr><td><strong>checkURLIndexable()</strong></td><td>Decide whether a document with a given URL is indexable or not</td></tr>
-            <tr><td><strong>getPipelineDescription()</strong></td><td>Use the supplied output specification to come up with an output version string</td></tr>
-            <tr><td><strong>addOrReplaceDocument()</strong></td><td>Add or replace the specified document within the target repository, or signal if the document cannot be handled</td></tr>
-            <tr><td><strong>outputConfigurationHeader()</strong></td><td>Output the head-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>outputConfigurationBody()</strong></td><td>Output the body-section part of an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>processConfigurationPost()</strong></td><td>Receive and process form data from an output connection <em>ConfigParams</em> editing page</td></tr>
-            <tr><td><strong>viewConfiguration()</strong></td><td>Output the viewing HTML for an output connection <em>ConfigParams</em> object</td></tr>
-            <tr><td><strong>outputSpecificationHeader()</strong></td><td>Output the head-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>outputSpecificationBody()</strong></td><td>Output the body-section part of a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>processSpecificationPost()</strong></td><td>Receive and process form data from a <em>Specification</em> editing page</td></tr>
-            <tr><td><strong>viewSpecification()</strong></td><td>Output the viewing page for a <em>Specification</em> object</td></tr>
-          </table>
-          <p></p>
-          <p>These methods come in three broad classes: (a) functional methods for doing the work of the connector; (b) UI methods for configuring a connection; and (c) UI methods for editing the output specification for a job.  Together they do the heavy lifting of your connector.  But before you can write any code at all, you need to plan things out a bit.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Choosing the form of the transformation version string</title>
-          <p></p>
-          <p>The output version string is used by ManifoldCF to determine whether or not the output specification or configuration changed in such a way as to require that the document be reprocessed.  ManifoldCF therefore requests the output version string for any document that is ready for processing, and usually does not process the document again if the returned output version string agrees with the output version string it has stored.</p>
-          <p></p>
-          <p>Thinking about it more carefully, it is clear that what an output connector writer needs to do is include everything in the output version string that could potentially affect how the document gets ingested, save that which is specific to the repository connector.  That may include bits of output connector configuration information, as well as data from the output specification.  When it's time to ingest, it's usually the correct thing to do to obtain the necessary data for ingestion out of the output version string, rather than calculating it or fetching it anew, because that guarantees that the document processing was done in a manner that agrees with its recorded output version string, thus eliminating any chance of ManifoldCF getting confused.</p>
-          <p></p>
-        </section>
-        <section>
-          <title>Notes on connector UI methods</title>
-          <p></p>
-          <p>The crawler UI uses a tabbed layout structure, and thus each of the UI methods must properly implement the tabbed model.  This means that the "header" methods above must add the desired tab names to a specified array, and the "body" methods must provide appropriate HTML which handles both the case where a tab is displayed, and where it is not displayed.  Also, it makes sense to use the appropriate css definitions, so that the connector UI pages have a similar look-and-feel to the rest of ManifoldCF's crawler ui.  We strongly suggest starting with one of the supplied connector's UI code, both for a description of the arguments to each method, and for some decent ideas of ways to organize your connector's UI code.</p>
-          <p></p>
-          <p>Please also note that it is good practice to name the form fields in your HTML in such a way that they cannot collide with form fields that may come from the framework's HTML or any specific repository connector's HTML.  The <em>OutputSpecification</em> HTML especially may be prone to collisions, because within any given job, this HTML is included in the same page as HTML from the chosen repository connector.</p>
-          <p></p>
-          <p></p>
-        </section>
-      </section>
-      <section>
-        <title>Implementation support provided by the framework</title>
-        <p></p>
-        <p>ManifoldCF's framework provides a number of helpful services designed to make the creation of a connector easier.  These services are summarized below.  (This is not an exhaustive list, by any means.)</p>
-        <p></p>
-        <ul>
-          <li>Lock management and synchronization (see <em>org.apache.manifoldcf.core.interfaces.LockManagerFactory</em>)</li>
-          <li>Cache management (see <em>org.apache.manifoldcf.core.interfaces.CacheManagerFactory</em>)</li>
-          <li>Local keystore management (see <em>org.apache.manifoldcf.core.KeystoreManagerFactory</em>)</li>
-          <li>Database management (see <em>org.apache.manifoldcf.core.DBInterfaceFactory</em>)</li>
-        </ul>
-        <p></p>
-        <p>For UI method support, these too are very useful:</p>
-        <p></p>
-        <ul>
-          <li>Multipart form processing (see <em>org.apache.manifoldcf.ui.multipart.MultipartWrapper</em>)</li>
-          <li>HTML encoding (see <em>org.apache.manifoldcf.ui.util.Encoder</em>)</li>
-          <li>HTML formatting (see <em>org.apache.manifoldcf.ui.util.Formatter</em>)</li>
-        </ul>
-        <p></p>
-      </section>
-      <section>
-        <title>DO's and DON'T DO's</title>
-        <p></p>
-        <p>It's always a good idea to make use of an existing infrastructure component, if it's meant for that purpose, rather than inventing your own.  There are, however, some limitations we recommend you adhere to.</p>
-        <p></p>
-        <ul>
-          <li>DO make use of infrastructure components described in the section above</li>
-          <li>DON'T make use of infrastructure components that aren't mentioned, without checking first</li>
-          <li>NEVER write connector code that directly uses framework database tables, other than the ones installed and managed by your connector</li>
-        </ul>
-        <p></p>
-        <p>If you are tempted to violate these rules, it may well mean you don't understand something important.  At the very least, we'd like to know why.  Send email to dev@manifoldcf.apache.org with a description of your problem and how you are tempted to solve it.</p>
-      </section>
-    </section>
-  </body>
-</document>
\ No newline at end of file
diff --git a/site/src/documentation/resources/images/en_US/LCFApacheArchitecture.png b/site/src/documentation/resources/images/en_US/LCFApacheArchitecture.png
deleted file mode 100644
index 185beef..0000000
--- a/site/src/documentation/resources/images/en_US/LCFApacheArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/MCFProcessArchitecture.png b/site/src/documentation/resources/images/en_US/MCFProcessArchitecture.png
deleted file mode 100644
index f051d18..0000000
--- a/site/src/documentation/resources/images/en_US/MCFProcessArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/SecurityArchitecture.png b/site/src/documentation/resources/images/en_US/SecurityArchitecture.png
deleted file mode 100644
index 271e747..0000000
--- a/site/src/documentation/resources/images/en_US/SecurityArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/ad-configure-cache.PNG b/site/src/documentation/resources/images/en_US/ad-configure-cache.PNG
deleted file mode 100644
index 32f48e0..0000000
--- a/site/src/documentation/resources/images/en_US/ad-configure-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/ad-configure-dc.PNG b/site/src/documentation/resources/images/en_US/ad-configure-dc.PNG
deleted file mode 100644
index 539a74c..0000000
--- a/site/src/documentation/resources/images/en_US/ad-configure-dc.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/ad-status.PNG b/site/src/documentation/resources/images/en_US/ad-status.PNG
deleted file mode 100644
index d935bfd..0000000
--- a/site/src/documentation/resources/images/en_US/ad-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-list.png b/site/src/documentation/resources/images/en_US/add-list.png
deleted file mode 100644
index a835d59..0000000
--- a/site/src/documentation/resources/images/en_US/add-list.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-authority-connection-name.PNG b/site/src/documentation/resources/images/en_US/add-new-authority-connection-name.PNG
deleted file mode 100644
index 1eba006..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-authority-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-authority-connection-type.PNG b/site/src/documentation/resources/images/en_US/add-new-authority-connection-type.PNG
deleted file mode 100644
index da97862..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-authority-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-authority-group-name.PNG b/site/src/documentation/resources/images/en_US/add-new-authority-group-name.PNG
deleted file mode 100644
index ccfcb5d..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-authority-group-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-job-connection.PNG b/site/src/documentation/resources/images/en_US/add-new-job-connection.PNG
deleted file mode 100644
index 4a8c5e5..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-job-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-job-name.PNG b/site/src/documentation/resources/images/en_US/add-new-job-name.PNG
deleted file mode 100644
index ee915c5..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-job-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-job-scheduling-with-record.PNG b/site/src/documentation/resources/images/en_US/add-new-job-scheduling-with-record.PNG
deleted file mode 100644
index f6b4b2a..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-job-scheduling-with-record.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-job-scheduling.PNG b/site/src/documentation/resources/images/en_US/add-new-job-scheduling.PNG
deleted file mode 100644
index cd58821..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-job-scheduling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-mapping-connection-name.PNG b/site/src/documentation/resources/images/en_US/add-new-mapping-connection-name.PNG
deleted file mode 100644
index 2700bbe..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-mapping-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-mapping-connection-type.PNG b/site/src/documentation/resources/images/en_US/add-new-mapping-connection-type.PNG
deleted file mode 100644
index 68cd0c1..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-mapping-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-notification-connection-name.PNG b/site/src/documentation/resources/images/en_US/add-new-notification-connection-name.PNG
deleted file mode 100644
index be2ea47..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-notification-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-notification-connection-type.PNG b/site/src/documentation/resources/images/en_US/add-new-notification-connection-type.PNG
deleted file mode 100644
index 452491d..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-notification-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-output-connection-name.PNG b/site/src/documentation/resources/images/en_US/add-new-output-connection-name.PNG
deleted file mode 100644
index db3a614..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-output-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-output-connection-type.PNG b/site/src/documentation/resources/images/en_US/add-new-output-connection-type.PNG
deleted file mode 100644
index 6965683..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-output-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-repository-connection-name.PNG b/site/src/documentation/resources/images/en_US/add-new-repository-connection-name.PNG
deleted file mode 100644
index 4dbf4da..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-repository-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-repository-connection-type.PNG b/site/src/documentation/resources/images/en_US/add-new-repository-connection-type.PNG
deleted file mode 100644
index 3548901..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-repository-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-transformation-connection-name.PNG b/site/src/documentation/resources/images/en_US/add-new-transformation-connection-name.PNG
deleted file mode 100644
index 387eecf..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-transformation-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/add-new-transformation-connection-type.PNG b/site/src/documentation/resources/images/en_US/add-new-transformation-connection-type.PNG
deleted file mode 100644
index d09673b..0000000
--- a/site/src/documentation/resources/images/en_US/add-new-transformation-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-authority.png b/site/src/documentation/resources/images/en_US/alfresco-authority.png
deleted file mode 100644
index d15656a..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-authority.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-connector-job.png b/site/src/documentation/resources/images/en_US/alfresco-connector-job.png
deleted file mode 100644
index 9c3c94e..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-connector-job.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-connector-save.png b/site/src/documentation/resources/images/en_US/alfresco-connector-save.png
deleted file mode 100644
index 5f33b44..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-connector-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-connector.png b/site/src/documentation/resources/images/en_US/alfresco-connector.png
deleted file mode 100644
index 6cf9455..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-connector.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-configuration-save.png b/site/src/documentation/resources/images/en_US/alfresco-repository-connection-configuration-save.png
deleted file mode 100644
index 013b8cb..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-configuration-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-configuration.png b/site/src/documentation/resources/images/en_US/alfresco-repository-connection-configuration.png
deleted file mode 100644
index 0fbcdfa..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-configuration.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-job-lucenequery.png b/site/src/documentation/resources/images/en_US/alfresco-repository-connection-job-lucenequery.png
deleted file mode 100644
index 8ba0655..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-job-lucenequery.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-job-save.png b/site/src/documentation/resources/images/en_US/alfresco-repository-connection-job-save.png
deleted file mode 100644
index 362cee9..0000000
--- a/site/src/documentation/resources/images/en_US/alfresco-repository-connection-job-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/alloweddocuments-job-allowed-contents.PNG b/site/src/documentation/resources/images/en_US/alloweddocuments-job-allowed-contents.PNG
deleted file mode 100644
index 772568f..0000000
--- a/site/src/documentation/resources/images/en_US/alloweddocuments-job-allowed-contents.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/amazon-configure-server.PNG b/site/src/documentation/resources/images/en_US/amazon-configure-server.PNG
deleted file mode 100644
index af09c78..0000000
--- a/site/src/documentation/resources/images/en_US/amazon-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/authority-prerequisites.PNG b/site/src/documentation/resources/images/en_US/authority-prerequisites.PNG
deleted file mode 100644
index 2b6439a..0000000
--- a/site/src/documentation/resources/images/en_US/authority-prerequisites.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/authority-throttling.PNG b/site/src/documentation/resources/images/en_US/authority-throttling.PNG
deleted file mode 100644
index aa11214..0000000
--- a/site/src/documentation/resources/images/en_US/authority-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/cmis-authority-connection-configuration-repository.png b/site/src/documentation/resources/images/en_US/cmis-authority-connection-configuration-repository.png
deleted file mode 100644
index da3c68d..0000000
--- a/site/src/documentation/resources/images/en_US/cmis-authority-connection-configuration-repository.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/cmis-authority-connection-configuration-save.png b/site/src/documentation/resources/images/en_US/cmis-authority-connection-configuration-save.png
deleted file mode 100644
index 77e023d..0000000
--- a/site/src/documentation/resources/images/en_US/cmis-authority-connection-configuration-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/cmis-repository-connection-configuration-save.png b/site/src/documentation/resources/images/en_US/cmis-repository-connection-configuration-save.png
deleted file mode 100644
index c29a79b..0000000
--- a/site/src/documentation/resources/images/en_US/cmis-repository-connection-configuration-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/cmis-repository-connection-configuration.png b/site/src/documentation/resources/images/en_US/cmis-repository-connection-configuration.png
deleted file mode 100644
index 10b2ecc..0000000
--- a/site/src/documentation/resources/images/en_US/cmis-repository-connection-configuration.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/cmis-repository-connection-job-cmisquery.png b/site/src/documentation/resources/images/en_US/cmis-repository-connection-job-cmisquery.png
deleted file mode 100644
index f97d9eb..0000000
--- a/site/src/documentation/resources/images/en_US/cmis-repository-connection-job-cmisquery.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/cmis-repository-connection-job-save.png b/site/src/documentation/resources/images/en_US/cmis-repository-connection-job-save.png
deleted file mode 100644
index 9965825..0000000
--- a/site/src/documentation/resources/images/en_US/cmis-repository-connection-job-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/document-status-example.PNG b/site/src/documentation/resources/images/en_US/document-status-example.PNG
deleted file mode 100644
index 662c141..0000000
--- a/site/src/documentation/resources/images/en_US/document-status-example.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/document-status-select-connection.PNG b/site/src/documentation/resources/images/en_US/document-status-select-connection.PNG
deleted file mode 100644
index eeb6598..0000000
--- a/site/src/documentation/resources/images/en_US/document-status-select-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/document-status-select-job.PNG b/site/src/documentation/resources/images/en_US/document-status-select-job.PNG
deleted file mode 100644
index c1b3c4d..0000000
--- a/site/src/documentation/resources/images/en_US/document-status-select-job.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documents-library-all-metadata.png b/site/src/documentation/resources/images/en_US/documents-library-all-metadata.png
deleted file mode 100644
index 892d7fe..0000000
--- a/site/src/documentation/resources/images/en_US/documents-library-all-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documents-library-contents.png b/site/src/documentation/resources/images/en_US/documents-library-contents.png
deleted file mode 100644
index d3616d1..0000000
--- a/site/src/documentation/resources/images/en_US/documents-library-contents.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documents-library-metadata-rule.png b/site/src/documentation/resources/images/en_US/documents-library-metadata-rule.png
deleted file mode 100644
index fbc57de..0000000
--- a/site/src/documentation/resources/images/en_US/documents-library-metadata-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documents-library-metadata.png b/site/src/documentation/resources/images/en_US/documents-library-metadata.png
deleted file mode 100644
index fd519ce..0000000
--- a/site/src/documentation/resources/images/en_US/documents-library-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documents-library-path-rule.png b/site/src/documentation/resources/images/en_US/documents-library-path-rule.png
deleted file mode 100644
index e90d9f8..0000000
--- a/site/src/documentation/resources/images/en_US/documents-library-path-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documents-library-summary.png b/site/src/documentation/resources/images/en_US/documents-library-summary.png
deleted file mode 100644
index 3bab5ee..0000000
--- a/site/src/documentation/resources/images/en_US/documents-library-summary.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-authority-docbase.PNG b/site/src/documentation/resources/images/en_US/documentum-authority-docbase.PNG
deleted file mode 100644
index 91fbd23..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-authority-docbase.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-authority-status.PNG b/site/src/documentation/resources/images/en_US/documentum-authority-status.PNG
deleted file mode 100644
index 6ac940f..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-authority-system-acls.PNG b/site/src/documentation/resources/images/en_US/documentum-authority-system-acls.PNG
deleted file mode 100644
index 916aa4b..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-authority-system-acls.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-authority-user-mapping.PNG b/site/src/documentation/resources/images/en_US/documentum-authority-user-mapping.PNG
deleted file mode 100644
index 2acaa88..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-authority-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-docbase.PNG b/site/src/documentation/resources/images/en_US/documentum-docbase.PNG
deleted file mode 100644
index c58d195..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-docbase.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-status.PNG b/site/src/documentation/resources/images/en_US/documentum-status.PNG
deleted file mode 100644
index 526e7f4..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/documentum-webtop.PNG b/site/src/documentation/resources/images/en_US/documentum-webtop.PNG
deleted file mode 100644
index a3f7eeb..0000000
--- a/site/src/documentation/resources/images/en_US/documentum-webtop.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/dropbox-repository-application-secret-passwords.PNG b/site/src/documentation/resources/images/en_US/dropbox-repository-application-secret-passwords.PNG
deleted file mode 100644
index 5a7b728..0000000
--- a/site/src/documentation/resources/images/en_US/dropbox-repository-application-secret-passwords.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/en_US/dropbox-repository-connection-configuration-save.PNG
deleted file mode 100644
index e527725..0000000
--- a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-configuration.PNG b/site/src/documentation/resources/images/en_US/dropbox-repository-connection-configuration.PNG
deleted file mode 100644
index 8e4c4ae..0000000
--- a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-job-dropbox-folder-to-index.PNG b/site/src/documentation/resources/images/en_US/dropbox-repository-connection-job-dropbox-folder-to-index.PNG
deleted file mode 100644
index 9e164b5..0000000
--- a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-job-dropbox-folder-to-index.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-job-save.PNG b/site/src/documentation/resources/images/en_US/dropbox-repository-connection-job-save.PNG
deleted file mode 100644
index b988b60..0000000
--- a/site/src/documentation/resources/images/en_US/dropbox-repository-connection-job-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/dropbox-repository-create-application.PNG b/site/src/documentation/resources/images/en_US/dropbox-repository-create-application.PNG
deleted file mode 100644
index b33b9b2..0000000
--- a/site/src/documentation/resources/images/en_US/dropbox-repository-create-application.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/elasticsearch-connection-parameters.png b/site/src/documentation/resources/images/en_US/elasticsearch-connection-parameters.png
deleted file mode 100644
index d4054f9..0000000
--- a/site/src/documentation/resources/images/en_US/elasticsearch-connection-parameters.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/elasticsearch-history-report.png b/site/src/documentation/resources/images/en_US/elasticsearch-history-report.png
deleted file mode 100644
index c8a500c..0000000
--- a/site/src/documentation/resources/images/en_US/elasticsearch-history-report.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/elasticsearch-job-parameters.png b/site/src/documentation/resources/images/en_US/elasticsearch-job-parameters.png
deleted file mode 100644
index 78d8209..0000000
--- a/site/src/documentation/resources/images/en_US/elasticsearch-job-parameters.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/email-configure-server.PNG b/site/src/documentation/resources/images/en_US/email-configure-server.PNG
deleted file mode 100644
index 4da9692..0000000
--- a/site/src/documentation/resources/images/en_US/email-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/email-configure-url.PNG b/site/src/documentation/resources/images/en_US/email-configure-url.PNG
deleted file mode 100644
index ec000ec..0000000
--- a/site/src/documentation/resources/images/en_US/email-configure-url.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/email-job-filter.PNG b/site/src/documentation/resources/images/en_US/email-job-filter.PNG
deleted file mode 100644
index 5250762..0000000
--- a/site/src/documentation/resources/images/en_US/email-job-filter.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/email-job-metadata.PNG b/site/src/documentation/resources/images/en_US/email-job-metadata.PNG
deleted file mode 100644
index bfad7fa..0000000
--- a/site/src/documentation/resources/images/en_US/email-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/email-status.PNG b/site/src/documentation/resources/images/en_US/email-status.PNG
deleted file mode 100644
index 6798a33..0000000
--- a/site/src/documentation/resources/images/en_US/email-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/faq-list-all-metadata.png b/site/src/documentation/resources/images/en_US/faq-list-all-metadata.png
deleted file mode 100644
index 6287712..0000000
--- a/site/src/documentation/resources/images/en_US/faq-list-all-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/faq-list-contents.png b/site/src/documentation/resources/images/en_US/faq-list-contents.png
deleted file mode 100644
index 776100d..0000000
--- a/site/src/documentation/resources/images/en_US/faq-list-contents.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/faq-list-metadata-rule.png b/site/src/documentation/resources/images/en_US/faq-list-metadata-rule.png
deleted file mode 100644
index efad356..0000000
--- a/site/src/documentation/resources/images/en_US/faq-list-metadata-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/faq-list-metadata.png b/site/src/documentation/resources/images/en_US/faq-list-metadata.png
deleted file mode 100644
index 3d4106c..0000000
--- a/site/src/documentation/resources/images/en_US/faq-list-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/faq-list-path-rule.png b/site/src/documentation/resources/images/en_US/faq-list-path-rule.png
deleted file mode 100644
index edab981..0000000
--- a/site/src/documentation/resources/images/en_US/faq-list-path-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/faq-list-summary.png b/site/src/documentation/resources/images/en_US/faq-list-summary.png
deleted file mode 100644
index c985749..0000000
--- a/site/src/documentation/resources/images/en_US/faq-list-summary.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filenet-configure-credentials.PNG b/site/src/documentation/resources/images/en_US/filenet-configure-credentials.PNG
deleted file mode 100644
index 06ed8b8..0000000
--- a/site/src/documentation/resources/images/en_US/filenet-configure-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filenet-configure-documenturl.PNG b/site/src/documentation/resources/images/en_US/filenet-configure-documenturl.PNG
deleted file mode 100644
index 43b153f..0000000
--- a/site/src/documentation/resources/images/en_US/filenet-configure-documenturl.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filenet-configure-objectstore.PNG b/site/src/documentation/resources/images/en_US/filenet-configure-objectstore.PNG
deleted file mode 100644
index 6629ff5..0000000
--- a/site/src/documentation/resources/images/en_US/filenet-configure-objectstore.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filenet-configure-server.PNG b/site/src/documentation/resources/images/en_US/filenet-configure-server.PNG
deleted file mode 100644
index 1ceb11e..0000000
--- a/site/src/documentation/resources/images/en_US/filenet-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filenet-status.PNG b/site/src/documentation/resources/images/en_US/filenet-status.PNG
deleted file mode 100644
index 7a91587..0000000
--- a/site/src/documentation/resources/images/en_US/filenet-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filesystem-job-hopcount.PNG b/site/src/documentation/resources/images/en_US/filesystem-job-hopcount.PNG
deleted file mode 100644
index b2a7e75..0000000
--- a/site/src/documentation/resources/images/en_US/filesystem-job-hopcount.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filesystem-job-output-path.PNG b/site/src/documentation/resources/images/en_US/filesystem-job-output-path.PNG
deleted file mode 100644
index c115708..0000000
--- a/site/src/documentation/resources/images/en_US/filesystem-job-output-path.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/filesystem-job-paths.PNG b/site/src/documentation/resources/images/en_US/filesystem-job-paths.PNG
deleted file mode 100644
index 7036308..0000000
--- a/site/src/documentation/resources/images/en_US/filesystem-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-connection-configuration-save.PNG
deleted file mode 100644
index 2e76eee..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-connection-configuration.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-connection-configuration.PNG
deleted file mode 100644
index a90cea1..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-connection-job-googledrive-seed-query.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-connection-job-googledrive-seed-query.PNG
deleted file mode 100644
index 9458235..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-connection-job-googledrive-seed-query.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-1.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-setup-1.PNG
deleted file mode 100644
index 0ac4c2e..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-1.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-2.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-setup-2.PNG
deleted file mode 100644
index 4800c35..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-2.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-3.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-setup-3.PNG
deleted file mode 100644
index c82e350..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-3.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-4.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-setup-4.PNG
deleted file mode 100644
index c500993..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-4.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-5.PNG b/site/src/documentation/resources/images/en_US/googledrive-repository-setup-5.PNG
deleted file mode 100644
index fc79595..0000000
--- a/site/src/documentation/resources/images/en_US/googledrive-repository-setup-5.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/hdfs-configure-server.PNG b/site/src/documentation/resources/images/en_US/hdfs-configure-server.PNG
deleted file mode 100644
index 29d37cc..0000000
--- a/site/src/documentation/resources/images/en_US/hdfs-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/hdfs-job-hopcount.PNG b/site/src/documentation/resources/images/en_US/hdfs-job-hopcount.PNG
deleted file mode 100644
index 239e052..0000000
--- a/site/src/documentation/resources/images/en_US/hdfs-job-hopcount.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/hdfs-job-output-path.PNG b/site/src/documentation/resources/images/en_US/hdfs-job-output-path.PNG
deleted file mode 100644
index 6c8f411..0000000
--- a/site/src/documentation/resources/images/en_US/hdfs-job-output-path.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/hdfs-job-paths.PNG b/site/src/documentation/resources/images/en_US/hdfs-job-paths.PNG
deleted file mode 100644
index 2243f1c..0000000
--- a/site/src/documentation/resources/images/en_US/hdfs-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/hdfs-repository-configure-server.PNG b/site/src/documentation/resources/images/en_US/hdfs-repository-configure-server.PNG
deleted file mode 100644
index 3e55f43..0000000
--- a/site/src/documentation/resources/images/en_US/hdfs-repository-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-configure-server.PNG b/site/src/documentation/resources/images/en_US/jcifs-configure-server.PNG
deleted file mode 100644
index d42affd..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-job-content-length.PNG b/site/src/documentation/resources/images/en_US/jcifs-job-content-length.PNG
deleted file mode 100644
index a1ed333..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-job-content-length.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-job-file-mapping.PNG b/site/src/documentation/resources/images/en_US/jcifs-job-file-mapping.PNG
deleted file mode 100644
index 30eb50a..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-job-file-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-job-metadata.PNG b/site/src/documentation/resources/images/en_US/jcifs-job-metadata.PNG
deleted file mode 100644
index 68d3d43..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-job-paths.PNG b/site/src/documentation/resources/images/en_US/jcifs-job-paths.PNG
deleted file mode 100644
index 119066a..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-job-security.PNG b/site/src/documentation/resources/images/en_US/jcifs-job-security.PNG
deleted file mode 100644
index c70a4fd..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-job-url-mapping.PNG b/site/src/documentation/resources/images/en_US/jcifs-job-url-mapping.PNG
deleted file mode 100644
index 0dd36be..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-job-url-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jcifs-status.PNG b/site/src/documentation/resources/images/en_US/jcifs-status.PNG
deleted file mode 100644
index 626ecb2..0000000
--- a/site/src/documentation/resources/images/en_US/jcifs-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-credentials.PNG b/site/src/documentation/resources/images/en_US/jdbc-authority-configure-credentials.PNG
deleted file mode 100644
index 7b90e04..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-database-type.PNG b/site/src/documentation/resources/images/en_US/jdbc-authority-configure-database-type.PNG
deleted file mode 100644
index 82e122f..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-database-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-queries.PNG b/site/src/documentation/resources/images/en_US/jdbc-authority-configure-queries.PNG
deleted file mode 100644
index d0e7005..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-queries.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-server.PNG b/site/src/documentation/resources/images/en_US/jdbc-authority-configure-server.PNG
deleted file mode 100644
index d0e5647..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-authority-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-authority-status.PNG b/site/src/documentation/resources/images/en_US/jdbc-authority-status.PNG
deleted file mode 100644
index 74d3c85..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-configure-credentials.PNG b/site/src/documentation/resources/images/en_US/jdbc-configure-credentials.PNG
deleted file mode 100644
index 0f9e53e..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-configure-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-configure-database-type.PNG b/site/src/documentation/resources/images/en_US/jdbc-configure-database-type.PNG
deleted file mode 100644
index dfa6b7c..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-configure-database-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-configure-server.PNG b/site/src/documentation/resources/images/en_US/jdbc-configure-server.PNG
deleted file mode 100644
index 544e199..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-job-queries.PNG b/site/src/documentation/resources/images/en_US/jdbc-job-queries.PNG
deleted file mode 100644
index 19817c3..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-job-queries.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-job-security.PNG b/site/src/documentation/resources/images/en_US/jdbc-job-security.PNG
deleted file mode 100644
index 8a37b80..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jdbc-status.PNG b/site/src/documentation/resources/images/en_US/jdbc-status.PNG
deleted file mode 100644
index 5ce8c46..0000000
--- a/site/src/documentation/resources/images/en_US/jdbc-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jira-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/en_US/jira-repository-connection-configuration-save.PNG
deleted file mode 100644
index 211f36f..0000000
--- a/site/src/documentation/resources/images/en_US/jira-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jira-repository-connection-configuration.PNG b/site/src/documentation/resources/images/en_US/jira-repository-connection-configuration.PNG
deleted file mode 100644
index 53443a1..0000000
--- a/site/src/documentation/resources/images/en_US/jira-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/jira-repository-connection-job-jira-seed-query.PNG b/site/src/documentation/resources/images/en_US/jira-repository-connection-job-jira-seed-query.PNG
deleted file mode 100644
index 0e82571..0000000
--- a/site/src/documentation/resources/images/en_US/jira-repository-connection-job-jira-seed-query.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/job-status.PNG b/site/src/documentation/resources/images/en_US/job-status.PNG
deleted file mode 100644
index b66d070..0000000
--- a/site/src/documentation/resources/images/en_US/job-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/ldap-configure-ldap.PNG b/site/src/documentation/resources/images/en_US/ldap-configure-ldap.PNG
deleted file mode 100644
index 2703ca5..0000000
--- a/site/src/documentation/resources/images/en_US/ldap-configure-ldap.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/ldap-status.PNG b/site/src/documentation/resources/images/en_US/ldap-status.PNG
deleted file mode 100644
index 4fbfae8..0000000
--- a/site/src/documentation/resources/images/en_US/ldap-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-authority-connections.PNG b/site/src/documentation/resources/images/en_US/list-authority-connections.PNG
deleted file mode 100644
index 23a27dc..0000000
--- a/site/src/documentation/resources/images/en_US/list-authority-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-authority-groups.PNG b/site/src/documentation/resources/images/en_US/list-authority-groups.PNG
deleted file mode 100644
index d05a06f..0000000
--- a/site/src/documentation/resources/images/en_US/list-authority-groups.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-jobs.PNG b/site/src/documentation/resources/images/en_US/list-jobs.PNG
deleted file mode 100644
index b32727e..0000000
--- a/site/src/documentation/resources/images/en_US/list-jobs.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-mapping-connections.PNG b/site/src/documentation/resources/images/en_US/list-mapping-connections.PNG
deleted file mode 100644
index b5dd698..0000000
--- a/site/src/documentation/resources/images/en_US/list-mapping-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-notification-connections.PNG b/site/src/documentation/resources/images/en_US/list-notification-connections.PNG
deleted file mode 100644
index d7ac462..0000000
--- a/site/src/documentation/resources/images/en_US/list-notification-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-output-connections.PNG b/site/src/documentation/resources/images/en_US/list-output-connections.PNG
deleted file mode 100644
index fbb6dda..0000000
--- a/site/src/documentation/resources/images/en_US/list-output-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-repository-connections.PNG b/site/src/documentation/resources/images/en_US/list-repository-connections.PNG
deleted file mode 100644
index c95e337..0000000
--- a/site/src/documentation/resources/images/en_US/list-repository-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/list-transformation-connections.PNG b/site/src/documentation/resources/images/en_US/list-transformation-connections.PNG
deleted file mode 100644
index d1d0086..0000000
--- a/site/src/documentation/resources/images/en_US/list-transformation-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-authority-cache.PNG b/site/src/documentation/resources/images/en_US/livelink-authority-cache.PNG
deleted file mode 100644
index 0f7a596..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-authority-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-authority-server.PNG b/site/src/documentation/resources/images/en_US/livelink-authority-server.PNG
deleted file mode 100644
index a893088..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-authority-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-authority-status.PNG b/site/src/documentation/resources/images/en_US/livelink-authority-status.PNG
deleted file mode 100644
index 8c23cef..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-connection-document-access.PNG b/site/src/documentation/resources/images/en_US/livelink-connection-document-access.PNG
deleted file mode 100644
index bed49f4..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-connection-document-access.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-connection-document-view.PNG b/site/src/documentation/resources/images/en_US/livelink-connection-document-view.PNG
deleted file mode 100644
index 9dc2b53..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-connection-document-view.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-connection-server.PNG b/site/src/documentation/resources/images/en_US/livelink-connection-server.PNG
deleted file mode 100644
index fe3cd46..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-connection-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-connection-status.PNG b/site/src/documentation/resources/images/en_US/livelink-connection-status.PNG
deleted file mode 100644
index 88292e3..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-connection-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-job-filters.PNG b/site/src/documentation/resources/images/en_US/livelink-job-filters.PNG
deleted file mode 100644
index 5bf3d30..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-job-filters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-job-metadata.PNG b/site/src/documentation/resources/images/en_US/livelink-job-metadata.PNG
deleted file mode 100644
index 60d4816..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-job-paths.PNG b/site/src/documentation/resources/images/en_US/livelink-job-paths.PNG
deleted file mode 100644
index c83fa76..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/livelink-job-security.PNG b/site/src/documentation/resources/images/en_US/livelink-job-security.PNG
deleted file mode 100644
index 7b3adbc..0000000
--- a/site/src/documentation/resources/images/en_US/livelink-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/login.PNG b/site/src/documentation/resources/images/en_US/login.PNG
deleted file mode 100644
index 25d1410..0000000
--- a/site/src/documentation/resources/images/en_US/login.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/mapping-prerequisites.PNG b/site/src/documentation/resources/images/en_US/mapping-prerequisites.PNG
deleted file mode 100644
index e6313af..0000000
--- a/site/src/documentation/resources/images/en_US/mapping-prerequisites.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/mapping-throttling.PNG b/site/src/documentation/resources/images/en_US/mapping-throttling.PNG
deleted file mode 100644
index 4261a4c..0000000
--- a/site/src/documentation/resources/images/en_US/mapping-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/memex-authority-memex-server.PNG b/site/src/documentation/resources/images/en_US/memex-authority-memex-server.PNG
deleted file mode 100644
index b4d5cc0..0000000
--- a/site/src/documentation/resources/images/en_US/memex-authority-memex-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/memex-authority-status.PNG b/site/src/documentation/resources/images/en_US/memex-authority-status.PNG
deleted file mode 100644
index aa4171c..0000000
--- a/site/src/documentation/resources/images/en_US/memex-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/memex-authority-user-mapping.PNG b/site/src/documentation/resources/images/en_US/memex-authority-user-mapping.PNG
deleted file mode 100644
index 23f3663..0000000
--- a/site/src/documentation/resources/images/en_US/memex-authority-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/memex-connection-memex-server.PNG b/site/src/documentation/resources/images/en_US/memex-connection-memex-server.PNG
deleted file mode 100644
index 7390624..0000000
--- a/site/src/documentation/resources/images/en_US/memex-connection-memex-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/memex-connection-status.PNG b/site/src/documentation/resources/images/en_US/memex-connection-status.PNG
deleted file mode 100644
index 8371894..0000000
--- a/site/src/documentation/resources/images/en_US/memex-connection-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/memex-connection-web-server.PNG b/site/src/documentation/resources/images/en_US/memex-connection-web-server.PNG
deleted file mode 100644
index 475dc0e..0000000
--- a/site/src/documentation/resources/images/en_US/memex-connection-web-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-authority-credentials.PNG b/site/src/documentation/resources/images/en_US/meridio-authority-credentials.PNG
deleted file mode 100644
index ab6c1b5..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-authority-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-authority-document-server.PNG b/site/src/documentation/resources/images/en_US/meridio-authority-document-server.PNG
deleted file mode 100644
index 4a9a89e..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-authority-document-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-authority-records-server.PNG b/site/src/documentation/resources/images/en_US/meridio-authority-records-server.PNG
deleted file mode 100644
index 460a0ec..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-authority-records-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-authority-status.PNG b/site/src/documentation/resources/images/en_US/meridio-authority-status.PNG
deleted file mode 100644
index e701bcf..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-authority-user-service-server.PNG b/site/src/documentation/resources/images/en_US/meridio-authority-user-service-server.PNG
deleted file mode 100644
index e1bb92d..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-authority-user-service-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-connection-credentials.PNG b/site/src/documentation/resources/images/en_US/meridio-connection-credentials.PNG
deleted file mode 100644
index 89eea46..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-connection-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-connection-document-server.PNG b/site/src/documentation/resources/images/en_US/meridio-connection-document-server.PNG
deleted file mode 100644
index 0997d46..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-connection-document-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-connection-records-server.PNG b/site/src/documentation/resources/images/en_US/meridio-connection-records-server.PNG
deleted file mode 100644
index 1bed4f1..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-connection-records-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-connection-status.PNG b/site/src/documentation/resources/images/en_US/meridio-connection-status.PNG
deleted file mode 100644
index 8eff7e9..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-connection-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/meridio-connection-web-client.PNG b/site/src/documentation/resources/images/en_US/meridio-connection-web-client.PNG
deleted file mode 100644
index a914530..0000000
--- a/site/src/documentation/resources/images/en_US/meridio-connection-web-client.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/metadataadjuster-job-expressions-metadata.PNG b/site/src/documentation/resources/images/en_US/metadataadjuster-job-expressions-metadata.PNG
deleted file mode 100644
index 4a91bf8..0000000
--- a/site/src/documentation/resources/images/en_US/metadataadjuster-job-expressions-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/notification-throttling.PNG b/site/src/documentation/resources/images/en_US/notification-throttling.PNG
deleted file mode 100644
index 6caf7da..0000000
--- a/site/src/documentation/resources/images/en_US/notification-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/opensearchserver-connection-parameters.PNG b/site/src/documentation/resources/images/en_US/opensearchserver-connection-parameters.PNG
deleted file mode 100644
index 502861b..0000000
--- a/site/src/documentation/resources/images/en_US/opensearchserver-connection-parameters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/opensearchserver-history-report.PNG b/site/src/documentation/resources/images/en_US/opensearchserver-history-report.PNG
deleted file mode 100644
index d81780b..0000000
--- a/site/src/documentation/resources/images/en_US/opensearchserver-history-report.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/opensearchserver-job-parameters.PNG b/site/src/documentation/resources/images/en_US/opensearchserver-job-parameters.PNG
deleted file mode 100644
index 25064ec..0000000
--- a/site/src/documentation/resources/images/en_US/opensearchserver-job-parameters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/opensearchserver-user.PNG b/site/src/documentation/resources/images/en_US/opensearchserver-user.PNG
deleted file mode 100644
index 437cfe5..0000000
--- a/site/src/documentation/resources/images/en_US/opensearchserver-user.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/output-throttling.PNG b/site/src/documentation/resources/images/en_US/output-throttling.PNG
deleted file mode 100644
index 0d2871c..0000000
--- a/site/src/documentation/resources/images/en_US/output-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/queue-status-example.PNG b/site/src/documentation/resources/images/en_US/queue-status-example.PNG
deleted file mode 100644
index fbd0db2..0000000
--- a/site/src/documentation/resources/images/en_US/queue-status-example.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/queue-status-select-connection.PNG b/site/src/documentation/resources/images/en_US/queue-status-select-connection.PNG
deleted file mode 100644
index b2bae28..0000000
--- a/site/src/documentation/resources/images/en_US/queue-status-select-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/queue-status-select-job.PNG b/site/src/documentation/resources/images/en_US/queue-status-select-job.PNG
deleted file mode 100644
index bce2235..0000000
--- a/site/src/documentation/resources/images/en_US/queue-status-select-job.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/regexp-mapping-status.PNG b/site/src/documentation/resources/images/en_US/regexp-mapping-status.PNG
deleted file mode 100644
index aba7a37..0000000
--- a/site/src/documentation/resources/images/en_US/regexp-mapping-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/regexp-mapping-user-mapping.PNG b/site/src/documentation/resources/images/en_US/regexp-mapping-user-mapping.PNG
deleted file mode 100644
index f20a0a4..0000000
--- a/site/src/documentation/resources/images/en_US/regexp-mapping-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/repository-throttling-with-throttle.PNG b/site/src/documentation/resources/images/en_US/repository-throttling-with-throttle.PNG
deleted file mode 100644
index 41ebb7f..0000000
--- a/site/src/documentation/resources/images/en_US/repository-throttling-with-throttle.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/repository-throttling.PNG b/site/src/documentation/resources/images/en_US/repository-throttling.PNG
deleted file mode 100644
index 674bff4..0000000
--- a/site/src/documentation/resources/images/en_US/repository-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rocketchat-configure-restapi.PNG b/site/src/documentation/resources/images/en_US/rocketchat-configure-restapi.PNG
deleted file mode 100644
index 8340b0d..0000000
--- a/site/src/documentation/resources/images/en_US/rocketchat-configure-restapi.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rocketchat-job-notifications.PNG b/site/src/documentation/resources/images/en_US/rocketchat-job-notifications.PNG
deleted file mode 100644
index 6e1384e..0000000
--- a/site/src/documentation/resources/images/en_US/rocketchat-job-notifications.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-configure-bandwidth.PNG b/site/src/documentation/resources/images/en_US/rss-configure-bandwidth.PNG
deleted file mode 100644
index a106367..0000000
--- a/site/src/documentation/resources/images/en_US/rss-configure-bandwidth.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-configure-email.PNG b/site/src/documentation/resources/images/en_US/rss-configure-email.PNG
deleted file mode 100644
index 0da46d1..0000000
--- a/site/src/documentation/resources/images/en_US/rss-configure-email.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-configure-proxy.PNG b/site/src/documentation/resources/images/en_US/rss-configure-proxy.PNG
deleted file mode 100644
index 21390c1..0000000
--- a/site/src/documentation/resources/images/en_US/rss-configure-proxy.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-configure-robots.PNG b/site/src/documentation/resources/images/en_US/rss-configure-robots.PNG
deleted file mode 100644
index 4c085ca..0000000
--- a/site/src/documentation/resources/images/en_US/rss-configure-robots.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-canonicalization.PNG b/site/src/documentation/resources/images/en_US/rss-job-canonicalization.PNG
deleted file mode 100644
index 03668c6..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-canonicalization.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-dechromed-content.PNG b/site/src/documentation/resources/images/en_US/rss-job-dechromed-content.PNG
deleted file mode 100644
index 3b99821..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-dechromed-content.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-exclusions.PNG b/site/src/documentation/resources/images/en_US/rss-job-exclusions.PNG
deleted file mode 100644
index 2a6ff3f..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-exclusions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-mappings.PNG b/site/src/documentation/resources/images/en_US/rss-job-mappings.PNG
deleted file mode 100644
index 98f5a0c..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-mappings.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-security.PNG b/site/src/documentation/resources/images/en_US/rss-job-security.PNG
deleted file mode 100644
index 73c6122..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-time-values.PNG b/site/src/documentation/resources/images/en_US/rss-job-time-values.PNG
deleted file mode 100644
index 2edd1f8..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-time-values.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-job-urls.PNG b/site/src/documentation/resources/images/en_US/rss-job-urls.PNG
deleted file mode 100644
index 66695b4..0000000
--- a/site/src/documentation/resources/images/en_US/rss-job-urls.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/rss-status.PNG b/site/src/documentation/resources/images/en_US/rss-status.PNG
deleted file mode 100644
index 5c4ae6b..0000000
--- a/site/src/documentation/resources/images/en_US/rss-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepoint-configure-authoritytype.PNG b/site/src/documentation/resources/images/en_US/sharepoint-configure-authoritytype.PNG
deleted file mode 100644
index 1bec5d8..0000000
--- a/site/src/documentation/resources/images/en_US/sharepoint-configure-authoritytype.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepoint-configure-server.PNG b/site/src/documentation/resources/images/en_US/sharepoint-configure-server.PNG
deleted file mode 100644
index ccfdb4d..0000000
--- a/site/src/documentation/resources/images/en_US/sharepoint-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepoint-job-metadata.PNG b/site/src/documentation/resources/images/en_US/sharepoint-job-metadata.PNG
deleted file mode 100644
index 35fec2e..0000000
--- a/site/src/documentation/resources/images/en_US/sharepoint-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepoint-job-paths.PNG b/site/src/documentation/resources/images/en_US/sharepoint-job-paths.PNG
deleted file mode 100644
index 4c6c7ff..0000000
--- a/site/src/documentation/resources/images/en_US/sharepoint-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepoint-job-security.PNG b/site/src/documentation/resources/images/en_US/sharepoint-job-security.PNG
deleted file mode 100644
index 302f7cf..0000000
--- a/site/src/documentation/resources/images/en_US/sharepoint-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepoint-status.PNG b/site/src/documentation/resources/images/en_US/sharepoint-status.PNG
deleted file mode 100644
index cc02e18..0000000
--- a/site/src/documentation/resources/images/en_US/sharepoint-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepointadauthority-configure-cache.PNG b/site/src/documentation/resources/images/en_US/sharepointadauthority-configure-cache.PNG
deleted file mode 100644
index bf733f5..0000000
--- a/site/src/documentation/resources/images/en_US/sharepointadauthority-configure-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepointadauthority-configure-dc.PNG b/site/src/documentation/resources/images/en_US/sharepointadauthority-configure-dc.PNG
deleted file mode 100644
index 51905c2..0000000
--- a/site/src/documentation/resources/images/en_US/sharepointadauthority-configure-dc.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepointadauthority-status.PNG b/site/src/documentation/resources/images/en_US/sharepointadauthority-status.PNG
deleted file mode 100644
index cdfc4e5..0000000
--- a/site/src/documentation/resources/images/en_US/sharepointadauthority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepointnativeauthority-configure-cache.PNG b/site/src/documentation/resources/images/en_US/sharepointnativeauthority-configure-cache.PNG
deleted file mode 100644
index d7b0a03..0000000
--- a/site/src/documentation/resources/images/en_US/sharepointnativeauthority-configure-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepointnativeauthority-configure-server.PNG b/site/src/documentation/resources/images/en_US/sharepointnativeauthority-configure-server.PNG
deleted file mode 100644
index ab6066f..0000000
--- a/site/src/documentation/resources/images/en_US/sharepointnativeauthority-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/sharepointnativeauthority-status.PNG b/site/src/documentation/resources/images/en_US/sharepointnativeauthority-status.PNG
deleted file mode 100644
index 35b2185..0000000
--- a/site/src/documentation/resources/images/en_US/sharepointnativeauthority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/simple-history-example.PNG b/site/src/documentation/resources/images/en_US/simple-history-example.PNG
deleted file mode 100644
index c71611e..0000000
--- a/site/src/documentation/resources/images/en_US/simple-history-example.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/simple-history-select-activities.PNG b/site/src/documentation/resources/images/en_US/simple-history-select-activities.PNG
deleted file mode 100644
index 878eda4..0000000
--- a/site/src/documentation/resources/images/en_US/simple-history-select-activities.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/simple-history-select-connection.PNG b/site/src/documentation/resources/images/en_US/simple-history-select-connection.PNG
deleted file mode 100644
index e9d2be0..0000000
--- a/site/src/documentation/resources/images/en_US/simple-history-select-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/slack-configure-slack-webhook.PNG b/site/src/documentation/resources/images/en_US/slack-configure-slack-webhook.PNG
deleted file mode 100644
index dca00b9..0000000
--- a/site/src/documentation/resources/images/en_US/slack-configure-slack-webhook.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/slack-job-message.PNG b/site/src/documentation/resources/images/en_US/slack-job-message.PNG
deleted file mode 100644
index 5802226..0000000
--- a/site/src/documentation/resources/images/en_US/slack-job-message.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-arguments.PNG b/site/src/documentation/resources/images/en_US/solr-configure-arguments.PNG
deleted file mode 100644
index cc6d653..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-arguments.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-commits.PNG b/site/src/documentation/resources/images/en_US/solr-configure-commits.PNG
deleted file mode 100644
index 64b60d0..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-commits.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-documents.PNG b/site/src/documentation/resources/images/en_US/solr-configure-documents.PNG
deleted file mode 100644
index 67aba5a..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-documents.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-schema.PNG b/site/src/documentation/resources/images/en_US/solr-configure-schema.PNG
deleted file mode 100644
index c90f4a9..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-schema.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-server.PNG b/site/src/documentation/resources/images/en_US/solr-configure-server.PNG
deleted file mode 100644
index c3561bf..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-solr-type.PNG b/site/src/documentation/resources/images/en_US/solr-configure-solr-type.PNG
deleted file mode 100644
index 9602fef..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-solr-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-configure-zookeeper.PNG b/site/src/documentation/resources/images/en_US/solr-configure-zookeeper.PNG
deleted file mode 100644
index b99c3f9..0000000
--- a/site/src/documentation/resources/images/en_US/solr-configure-zookeeper.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/solr-status.PNG b/site/src/documentation/resources/images/en_US/solr-status.PNG
deleted file mode 100644
index 6bce05f..0000000
--- a/site/src/documentation/resources/images/en_US/solr-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/tika-job-boilerplate.PNG b/site/src/documentation/resources/images/en_US/tika-job-boilerplate.PNG
deleted file mode 100644
index 13d23a5..0000000
--- a/site/src/documentation/resources/images/en_US/tika-job-boilerplate.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/tika-job-exceptions.PNG b/site/src/documentation/resources/images/en_US/tika-job-exceptions.PNG
deleted file mode 100644
index 3a04986..0000000
--- a/site/src/documentation/resources/images/en_US/tika-job-exceptions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/tika-job-field-mapping.PNG b/site/src/documentation/resources/images/en_US/tika-job-field-mapping.PNG
deleted file mode 100644
index 56bf772..0000000
--- a/site/src/documentation/resources/images/en_US/tika-job-field-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/transformation-throttling.PNG b/site/src/documentation/resources/images/en_US/transformation-throttling.PNG
deleted file mode 100644
index 71e5290..0000000
--- a/site/src/documentation/resources/images/en_US/transformation-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-authority-connection.PNG b/site/src/documentation/resources/images/en_US/view-authority-connection.PNG
deleted file mode 100644
index 4ed00bc..0000000
--- a/site/src/documentation/resources/images/en_US/view-authority-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-job.PNG b/site/src/documentation/resources/images/en_US/view-job.PNG
deleted file mode 100644
index 28ef6e7..0000000
--- a/site/src/documentation/resources/images/en_US/view-job.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-mapping-connection.PNG b/site/src/documentation/resources/images/en_US/view-mapping-connection.PNG
deleted file mode 100644
index cfb4e55..0000000
--- a/site/src/documentation/resources/images/en_US/view-mapping-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-notification-connection.PNG b/site/src/documentation/resources/images/en_US/view-notification-connection.PNG
deleted file mode 100644
index f5579b5..0000000
--- a/site/src/documentation/resources/images/en_US/view-notification-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-output-connection.PNG b/site/src/documentation/resources/images/en_US/view-output-connection.PNG
deleted file mode 100644
index c19a08c..0000000
--- a/site/src/documentation/resources/images/en_US/view-output-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-repository-connection.PNG b/site/src/documentation/resources/images/en_US/view-repository-connection.PNG
deleted file mode 100644
index f70a750..0000000
--- a/site/src/documentation/resources/images/en_US/view-repository-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/view-transformation-connection.PNG b/site/src/documentation/resources/images/en_US/view-transformation-connection.PNG
deleted file mode 100644
index b5b58f0..0000000
--- a/site/src/documentation/resources/images/en_US/view-transformation-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-access-credentials-session-form.PNG b/site/src/documentation/resources/images/en_US/web-configure-access-credentials-session-form.PNG
deleted file mode 100644
index 31b8e6c..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-access-credentials-session-form.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-access-credentials-session.PNG b/site/src/documentation/resources/images/en_US/web-configure-access-credentials-session.PNG
deleted file mode 100644
index d9cc779..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-access-credentials-session.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-access-credentials.PNG b/site/src/documentation/resources/images/en_US/web-configure-access-credentials.PNG
deleted file mode 100644
index 4625ba1..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-access-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-bandwidth.PNG b/site/src/documentation/resources/images/en_US/web-configure-bandwidth.PNG
deleted file mode 100644
index 59286c6..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-bandwidth.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-certificates.PNG b/site/src/documentation/resources/images/en_US/web-configure-certificates.PNG
deleted file mode 100644
index 3669185..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-certificates.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-email.PNG b/site/src/documentation/resources/images/en_US/web-configure-email.PNG
deleted file mode 100644
index 815940c..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-email.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-configure-robots.PNG b/site/src/documentation/resources/images/en_US/web-configure-robots.PNG
deleted file mode 100644
index fa66627..0000000
--- a/site/src/documentation/resources/images/en_US/web-configure-robots.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-canonicalization.PNG b/site/src/documentation/resources/images/en_US/web-job-canonicalization.PNG
deleted file mode 100644
index fd0e4f7..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-canonicalization.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-exclusions.PNG b/site/src/documentation/resources/images/en_US/web-job-exclusions.PNG
deleted file mode 100644
index 4bb0459..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-exclusions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-hop-filters.PNG b/site/src/documentation/resources/images/en_US/web-job-hop-filters.PNG
deleted file mode 100644
index b6999ba..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-hop-filters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-inclusions.PNG b/site/src/documentation/resources/images/en_US/web-job-inclusions.PNG
deleted file mode 100644
index 9dc4a0e..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-inclusions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-metadata.PNG b/site/src/documentation/resources/images/en_US/web-job-metadata.PNG
deleted file mode 100644
index ea23d03..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-security.PNG b/site/src/documentation/resources/images/en_US/web-job-security.PNG
deleted file mode 100644
index db19734..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-job-seeds.PNG b/site/src/documentation/resources/images/en_US/web-job-seeds.PNG
deleted file mode 100644
index 1de34f1..0000000
--- a/site/src/documentation/resources/images/en_US/web-job-seeds.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/web-status.PNG b/site/src/documentation/resources/images/en_US/web-status.PNG
deleted file mode 100644
index 0227591..0000000
--- a/site/src/documentation/resources/images/en_US/web-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/welcome-screen.PNG b/site/src/documentation/resources/images/en_US/welcome-screen.PNG
deleted file mode 100644
index c1b1792..0000000
--- a/site/src/documentation/resources/images/en_US/welcome-screen.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/en_US/wiki-configure-server.PNG b/site/src/documentation/resources/images/en_US/wiki-configure-server.PNG
deleted file mode 100644
index 0b71829..0000000
--- a/site/src/documentation/resources/images/en_US/wiki-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/LCFApacheArchitecture.png b/site/src/documentation/resources/images/ja_JP/LCFApacheArchitecture.png
deleted file mode 100644
index 185beef..0000000
--- a/site/src/documentation/resources/images/ja_JP/LCFApacheArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/MCFProcessArchitecture.png b/site/src/documentation/resources/images/ja_JP/MCFProcessArchitecture.png
deleted file mode 100644
index f051d18..0000000
--- a/site/src/documentation/resources/images/ja_JP/MCFProcessArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/ManifoldCF-Logo_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/ManifoldCF-Logo_ja_JP.PNG
deleted file mode 100644
index c8c5476..0000000
--- a/site/src/documentation/resources/images/ja_JP/ManifoldCF-Logo_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/SecurityArchitecture.png b/site/src/documentation/resources/images/ja_JP/SecurityArchitecture.png
deleted file mode 100644
index 271e747..0000000
--- a/site/src/documentation/resources/images/ja_JP/SecurityArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/ad-configure-cache_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/ad-configure-cache_ja_JP.PNG
deleted file mode 100644
index 86c853c..0000000
--- a/site/src/documentation/resources/images/ja_JP/ad-configure-cache_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/ad-configure-dc_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/ad-configure-dc_ja_JP.PNG
deleted file mode 100644
index 8866a9f..0000000
--- a/site/src/documentation/resources/images/ja_JP/ad-configure-dc_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/ad-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/ad-status_ja_JP.PNG
deleted file mode 100644
index f2429d1..0000000
--- a/site/src/documentation/resources/images/ja_JP/ad-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-authority-connection-name_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-authority-connection-name_ja_JP.PNG
deleted file mode 100644
index f6ea1f1..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-authority-connection-name_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-authority-connection-type_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-authority-connection-type_ja_JP.PNG
deleted file mode 100644
index 164e324..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-authority-connection-type_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-authority-group-name_ja_JP.png b/site/src/documentation/resources/images/ja_JP/add-new-authority-group-name_ja_JP.png
deleted file mode 100644
index de2efed..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-authority-group-name_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-job-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-job-connection_ja_JP.PNG
deleted file mode 100644
index 4eb0db3..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-job-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-job-name_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-job-name_ja_JP.PNG
deleted file mode 100644
index a64ff0c..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-job-name_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-job-scheduling-with-record_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-job-scheduling-with-record_ja_JP.PNG
deleted file mode 100644
index 21e41b5..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-job-scheduling-with-record_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-job-scheduling_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-job-scheduling_ja_JP.PNG
deleted file mode 100644
index f37c74b..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-job-scheduling_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-mapping-connection-name_ja_JP.png b/site/src/documentation/resources/images/ja_JP/add-new-mapping-connection-name_ja_JP.png
deleted file mode 100644
index 12eb059..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-mapping-connection-name_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-mapping-connection-type_ja_JP.png b/site/src/documentation/resources/images/ja_JP/add-new-mapping-connection-type_ja_JP.png
deleted file mode 100644
index ee13538..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-mapping-connection-type_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-notification-connection-name_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-notification-connection-name_ja_JP.PNG
deleted file mode 100644
index be2ea47..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-notification-connection-name_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-notification-connection-type_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-notification-connection-type_ja_JP.PNG
deleted file mode 100644
index 452491d..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-notification-connection-type_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-output-connection-name_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-output-connection-name_ja_JP.PNG
deleted file mode 100644
index aae03fa..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-output-connection-name_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-output-connection-type_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-output-connection-type_ja_JP.PNG
deleted file mode 100644
index 7fdcd4e..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-output-connection-type_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-repository-connection-name_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-repository-connection-name_ja_JP.PNG
deleted file mode 100644
index 8c0ea16..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-repository-connection-name_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-repository-connection-type_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/add-new-repository-connection-type_ja_JP.PNG
deleted file mode 100644
index 45d295b..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-repository-connection-type_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-transformation-connection-name_ja_JP.png b/site/src/documentation/resources/images/ja_JP/add-new-transformation-connection-name_ja_JP.png
deleted file mode 100644
index 6636adb..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-transformation-connection-name_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/add-new-transformation-connection-type_ja_JP.png b/site/src/documentation/resources/images/ja_JP/add-new-transformation-connection-type_ja_JP.png
deleted file mode 100644
index cfbc839..0000000
--- a/site/src/documentation/resources/images/ja_JP/add-new-transformation-connection-type_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/amazon-configure-server_ja_JP.png b/site/src/documentation/resources/images/ja_JP/amazon-configure-server_ja_JP.png
deleted file mode 100644
index 9e4ad99..0000000
--- a/site/src/documentation/resources/images/ja_JP/amazon-configure-server_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/apache_feather.gif b/site/src/documentation/resources/images/ja_JP/apache_feather.gif
deleted file mode 100644
index 1a0c3e6..0000000
--- a/site/src/documentation/resources/images/ja_JP/apache_feather.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/authority-prerequisites_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/authority-prerequisites_ja_JP.PNG
deleted file mode 100644
index 2b6439a..0000000
--- a/site/src/documentation/resources/images/ja_JP/authority-prerequisites_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/authority-throttling_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/authority-throttling_ja_JP.PNG
deleted file mode 100644
index da7d4db..0000000
--- a/site/src/documentation/resources/images/ja_JP/authority-throttling_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-repository_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-repository_ja_JP.PNG
deleted file mode 100644
index 08c33e8..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-repository_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-save_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-save_ja_JP.PNG
deleted file mode 100644
index f7ef049..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-save_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-usermapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-usermapping_ja_JP.PNG
deleted file mode 100644
index a806e4c..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-authority-connection-configuration-usermapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-configuration-save_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-configuration-save_ja_JP.PNG
deleted file mode 100644
index 452dbe1..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-configuration-save_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-configuration_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-configuration_ja_JP.PNG
deleted file mode 100644
index bcafcd2..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-configuration_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-job-cmisquery_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-job-cmisquery_ja_JP.PNG
deleted file mode 100644
index 99a44e5..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-job-cmisquery_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-job-save_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-job-save_ja_JP.PNG
deleted file mode 100644
index b56e0a7..0000000
--- a/site/src/documentation/resources/images/ja_JP/cmis-repository-connection-job-save_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/document-status-example_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/document-status-example_ja_JP.PNG
deleted file mode 100644
index 2a74c1c..0000000
--- a/site/src/documentation/resources/images/ja_JP/document-status-example_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/document-status-select-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/document-status-select-connection_ja_JP.PNG
deleted file mode 100644
index 12b9ca6..0000000
--- a/site/src/documentation/resources/images/ja_JP/document-status-select-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/document-status-select-job_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/document-status-select-job_ja_JP.PNG
deleted file mode 100644
index 11dcb63..0000000
--- a/site/src/documentation/resources/images/ja_JP/document-status-select-job_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-authority-docbase_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-authority-docbase_ja_JP.PNG
deleted file mode 100644
index 5e40970..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-authority-docbase_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-authority-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-authority-status_ja_JP.PNG
deleted file mode 100644
index 1f40054..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-authority-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-authority-system-acls_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-authority-system-acls_ja_JP.PNG
deleted file mode 100644
index 46e3f91..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-authority-system-acls_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-authority-user-mapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-authority-user-mapping_ja_JP.PNG
deleted file mode 100644
index 11f8ed4..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-authority-user-mapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-docbase_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-docbase_ja_JP.PNG
deleted file mode 100644
index 555d001..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-docbase_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-status_ja_JP.PNG
deleted file mode 100644
index 9fd8f14..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/documentum-webtop_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/documentum-webtop_ja_JP.PNG
deleted file mode 100644
index 01da2dd..0000000
--- a/site/src/documentation/resources/images/ja_JP/documentum-webtop_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/dropbox-repository-application-secret-passwords.PNG b/site/src/documentation/resources/images/ja_JP/dropbox-repository-application-secret-passwords.PNG
deleted file mode 100644
index 5a7b728..0000000
--- a/site/src/documentation/resources/images/ja_JP/dropbox-repository-application-secret-passwords.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-configuration-save.PNG
deleted file mode 100644
index 38e9f73..0000000
--- a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-configuration.PNG b/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-configuration.PNG
deleted file mode 100644
index 7c7da3a..0000000
--- a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-job-dropbox-folder-to-index.PNG b/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-job-dropbox-folder-to-index.PNG
deleted file mode 100644
index 8d1a153..0000000
--- a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-job-dropbox-folder-to-index.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-job-save.PNG b/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-job-save.PNG
deleted file mode 100644
index e51e624..0000000
--- a/site/src/documentation/resources/images/ja_JP/dropbox-repository-connection-job-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/dropbox-repository-create-application.PNG b/site/src/documentation/resources/images/ja_JP/dropbox-repository-create-application.PNG
deleted file mode 100644
index b33b9b2..0000000
--- a/site/src/documentation/resources/images/ja_JP/dropbox-repository-create-application.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/elasticsearch-connection-parameters_ja_JP.png b/site/src/documentation/resources/images/ja_JP/elasticsearch-connection-parameters_ja_JP.png
deleted file mode 100644
index 11afee5..0000000
--- a/site/src/documentation/resources/images/ja_JP/elasticsearch-connection-parameters_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/elasticsearch-history-report_ja_JP.png b/site/src/documentation/resources/images/ja_JP/elasticsearch-history-report_ja_JP.png
deleted file mode 100644
index f2c3043..0000000
--- a/site/src/documentation/resources/images/ja_JP/elasticsearch-history-report_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/elasticsearch-job-parameters_ja_JP.png b/site/src/documentation/resources/images/ja_JP/elasticsearch-job-parameters_ja_JP.png
deleted file mode 100644
index 843861e..0000000
--- a/site/src/documentation/resources/images/ja_JP/elasticsearch-job-parameters_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/favicon.ico b/site/src/documentation/resources/images/ja_JP/favicon.ico
deleted file mode 100644
index 161bcf7..0000000
--- a/site/src/documentation/resources/images/ja_JP/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filenet-configure-credentials_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filenet-configure-credentials_ja_JP.PNG
deleted file mode 100644
index a494331..0000000
--- a/site/src/documentation/resources/images/ja_JP/filenet-configure-credentials_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filenet-configure-documenturl_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filenet-configure-documenturl_ja_JP.PNG
deleted file mode 100644
index 2cd735b..0000000
--- a/site/src/documentation/resources/images/ja_JP/filenet-configure-documenturl_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filenet-configure-objectstore_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filenet-configure-objectstore_ja_JP.PNG
deleted file mode 100644
index 1bd7860..0000000
--- a/site/src/documentation/resources/images/ja_JP/filenet-configure-objectstore_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filenet-configure-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filenet-configure-server_ja_JP.PNG
deleted file mode 100644
index 58cce7f..0000000
--- a/site/src/documentation/resources/images/ja_JP/filenet-configure-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filenet-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filenet-status_ja_JP.PNG
deleted file mode 100644
index 6f452ae..0000000
--- a/site/src/documentation/resources/images/ja_JP/filenet-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filesystem-job-hopcount_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filesystem-job-hopcount_ja_JP.PNG
deleted file mode 100644
index a0355d5..0000000
--- a/site/src/documentation/resources/images/ja_JP/filesystem-job-hopcount_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/filesystem-job-paths_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/filesystem-job-paths_ja_JP.PNG
deleted file mode 100644
index 064cd95..0000000
--- a/site/src/documentation/resources/images/ja_JP/filesystem-job-paths_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-configure-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-configure-server_ja_JP.PNG
deleted file mode 100644
index 13760b2..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-configure-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-job-content-length_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-job-content-length_ja_JP.PNG
deleted file mode 100644
index fb86676..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-job-content-length_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-job-file-mapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-job-file-mapping_ja_JP.PNG
deleted file mode 100644
index 5637fdb..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-job-file-mapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-job-metadata_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-job-metadata_ja_JP.PNG
deleted file mode 100644
index 6b4d6fe..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-job-metadata_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-job-paths_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-job-paths_ja_JP.PNG
deleted file mode 100644
index 1d7c26a..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-job-paths_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-job-security_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-job-security_ja_JP.PNG
deleted file mode 100644
index b3e086c..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-job-security_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-job-url-mapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-job-url-mapping_ja_JP.PNG
deleted file mode 100644
index a744119..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-job-url-mapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jcifs-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jcifs-status_ja_JP.PNG
deleted file mode 100644
index e7de922..0000000
--- a/site/src/documentation/resources/images/ja_JP/jcifs-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jdbc-configure-credentials_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jdbc-configure-credentials_ja_JP.PNG
deleted file mode 100644
index cac100a..0000000
--- a/site/src/documentation/resources/images/ja_JP/jdbc-configure-credentials_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jdbc-configure-database-type_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jdbc-configure-database-type_ja_JP.PNG
deleted file mode 100644
index f19dd5f..0000000
--- a/site/src/documentation/resources/images/ja_JP/jdbc-configure-database-type_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jdbc-configure-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jdbc-configure-server_ja_JP.PNG
deleted file mode 100644
index 789e600..0000000
--- a/site/src/documentation/resources/images/ja_JP/jdbc-configure-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jdbc-job-queries_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jdbc-job-queries_ja_JP.PNG
deleted file mode 100644
index 907d691..0000000
--- a/site/src/documentation/resources/images/ja_JP/jdbc-job-queries_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jdbc-job-security_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jdbc-job-security_ja_JP.PNG
deleted file mode 100644
index a713f8c..0000000
--- a/site/src/documentation/resources/images/ja_JP/jdbc-job-security_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/jdbc-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/jdbc-status_ja_JP.PNG
deleted file mode 100644
index 9c2e127..0000000
--- a/site/src/documentation/resources/images/ja_JP/jdbc-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/job-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/job-status_ja_JP.PNG
deleted file mode 100644
index 048333b..0000000
--- a/site/src/documentation/resources/images/ja_JP/job-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/ldap-configure-ldap.PNG b/site/src/documentation/resources/images/ja_JP/ldap-configure-ldap.PNG
deleted file mode 100644
index b20d308..0000000
--- a/site/src/documentation/resources/images/ja_JP/ldap-configure-ldap.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/ldap-status.PNG b/site/src/documentation/resources/images/ja_JP/ldap-status.PNG
deleted file mode 100644
index 79467dd..0000000
--- a/site/src/documentation/resources/images/ja_JP/ldap-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-authority-connections_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/list-authority-connections_ja_JP.PNG
deleted file mode 100644
index 949ede6..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-authority-connections_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-authority-groups_ja_JP.png b/site/src/documentation/resources/images/ja_JP/list-authority-groups_ja_JP.png
deleted file mode 100644
index e85012d..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-authority-groups_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-jobs_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/list-jobs_ja_JP.PNG
deleted file mode 100644
index 2169e68..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-jobs_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-mapping-connections_ja_JP.png b/site/src/documentation/resources/images/ja_JP/list-mapping-connections_ja_JP.png
deleted file mode 100644
index 520f90d..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-mapping-connections_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-notification-connections_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/list-notification-connections_ja_JP.PNG
deleted file mode 100644
index d7ac462..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-notification-connections_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-output-connections_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/list-output-connections_ja_JP.PNG
deleted file mode 100644
index 71c135b..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-output-connections_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-repository-connections_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/list-repository-connections_ja_JP.PNG
deleted file mode 100644
index 18633ac..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-repository-connections_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/list-transformation-connections_ja_JP.png b/site/src/documentation/resources/images/ja_JP/list-transformation-connections_ja_JP.png
deleted file mode 100644
index e0df049..0000000
--- a/site/src/documentation/resources/images/ja_JP/list-transformation-connections_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-authority-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-authority-server_ja_JP.PNG
deleted file mode 100644
index 8b72892..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-authority-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-authority-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-authority-status_ja_JP.PNG
deleted file mode 100644
index 2dfd4c0..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-authority-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-authority-user-mapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-authority-user-mapping_ja_JP.PNG
deleted file mode 100644
index ed29b1f..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-authority-user-mapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-connection-document-access_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-connection-document-access_ja_JP.PNG
deleted file mode 100644
index d7091da..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-connection-document-access_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-connection-document-view_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-connection-document-view_ja_JP.PNG
deleted file mode 100644
index 0d5bd85..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-connection-document-view_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-connection-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-connection-server_ja_JP.PNG
deleted file mode 100644
index 7556d79..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-connection-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-connection-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-connection-status_ja_JP.PNG
deleted file mode 100644
index 31e85ae..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-connection-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-job-filters_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-job-filters_ja_JP.PNG
deleted file mode 100644
index 27d82a9..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-job-filters_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-job-metadata_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-job-metadata_ja_JP.PNG
deleted file mode 100644
index dafed44..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-job-metadata_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-job-paths_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-job-paths_ja_JP.PNG
deleted file mode 100644
index 0e797bb..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-job-paths_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/livelink-job-security_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/livelink-job-security_ja_JP.PNG
deleted file mode 100644
index 3780185..0000000
--- a/site/src/documentation/resources/images/ja_JP/livelink-job-security_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/login_ja_JP.png b/site/src/documentation/resources/images/ja_JP/login_ja_JP.png
deleted file mode 100644
index 3345b69..0000000
--- a/site/src/documentation/resources/images/ja_JP/login_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_green_100.gif b/site/src/documentation/resources/images/ja_JP/lucene_green_100.gif
deleted file mode 100644
index b7e06d9..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_green_100.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_green_150.gif b/site/src/documentation/resources/images/ja_JP/lucene_green_150.gif
deleted file mode 100644
index 4948017..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_green_150.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_green_200.gif b/site/src/documentation/resources/images/ja_JP/lucene_green_200.gif
deleted file mode 100644
index e8ab18e..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_green_200.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_green_250.gif b/site/src/documentation/resources/images/ja_JP/lucene_green_250.gif
deleted file mode 100644
index a09bd95..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_green_250.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_green_300.gif b/site/src/documentation/resources/images/ja_JP/lucene_green_300.gif
deleted file mode 100644
index 7c82298..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_green_300.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_outline_100.gif b/site/src/documentation/resources/images/ja_JP/lucene_outline_100.gif
deleted file mode 100644
index b64ea09..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_outline_100.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_outline_150.gif b/site/src/documentation/resources/images/ja_JP/lucene_outline_150.gif
deleted file mode 100644
index 0100293..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_outline_150.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_outline_200.gif b/site/src/documentation/resources/images/ja_JP/lucene_outline_200.gif
deleted file mode 100644
index 4e3a37e..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_outline_200.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_outline_250.gif b/site/src/documentation/resources/images/ja_JP/lucene_outline_250.gif
deleted file mode 100644
index d07b20d..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_outline_250.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/lucene_outline_300.gif b/site/src/documentation/resources/images/ja_JP/lucene_outline_300.gif
deleted file mode 100644
index 10f7dcf..0000000
--- a/site/src/documentation/resources/images/ja_JP/lucene_outline_300.gif
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/mapping-prerequisites_ja_JP.png b/site/src/documentation/resources/images/ja_JP/mapping-prerequisites_ja_JP.png
deleted file mode 100644
index 7a4d78e..0000000
--- a/site/src/documentation/resources/images/ja_JP/mapping-prerequisites_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/mapping-throttling_ja_JP.png b/site/src/documentation/resources/images/ja_JP/mapping-throttling_ja_JP.png
deleted file mode 100644
index 39d2786..0000000
--- a/site/src/documentation/resources/images/ja_JP/mapping-throttling_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/memex-authority-memex-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/memex-authority-memex-server_ja_JP.PNG
deleted file mode 100644
index d7ef914..0000000
--- a/site/src/documentation/resources/images/ja_JP/memex-authority-memex-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/memex-authority-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/memex-authority-status_ja_JP.PNG
deleted file mode 100644
index 1da58c0..0000000
--- a/site/src/documentation/resources/images/ja_JP/memex-authority-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/memex-authority-user-mapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/memex-authority-user-mapping_ja_JP.PNG
deleted file mode 100644
index cd86fab..0000000
--- a/site/src/documentation/resources/images/ja_JP/memex-authority-user-mapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/memex-connection-memex-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/memex-connection-memex-server_ja_JP.PNG
deleted file mode 100644
index b68716f..0000000
--- a/site/src/documentation/resources/images/ja_JP/memex-connection-memex-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/memex-connection-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/memex-connection-status_ja_JP.PNG
deleted file mode 100644
index 7f77f54..0000000
--- a/site/src/documentation/resources/images/ja_JP/memex-connection-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/memex-connection-web-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/memex-connection-web-server_ja_JP.PNG
deleted file mode 100644
index bb03279..0000000
--- a/site/src/documentation/resources/images/ja_JP/memex-connection-web-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-authority-credentials_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-authority-credentials_ja_JP.PNG
deleted file mode 100644
index f97f47e..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-authority-credentials_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-authority-document-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-authority-document-server_ja_JP.PNG
deleted file mode 100644
index a179fb2..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-authority-document-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-authority-records-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-authority-records-server_ja_JP.PNG
deleted file mode 100644
index 6fff306..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-authority-records-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-authority-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-authority-status_ja_JP.PNG
deleted file mode 100644
index 4218e19..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-authority-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-authority-user-service-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-authority-user-service-server_ja_JP.PNG
deleted file mode 100644
index 2e3d7c4..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-authority-user-service-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-connection-credentials_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-connection-credentials_ja_JP.PNG
deleted file mode 100644
index b3fa47a..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-connection-credentials_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-connection-document-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-connection-document-server_ja_JP.PNG
deleted file mode 100644
index d015c6b..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-connection-document-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-connection-records-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-connection-records-server_ja_JP.PNG
deleted file mode 100644
index 2e2ee8d..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-connection-records-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-connection-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-connection-status_ja_JP.PNG
deleted file mode 100644
index 97c1b9b..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-connection-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/meridio-connection-web-client_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/meridio-connection-web-client_ja_JP.PNG
deleted file mode 100644
index 71dfb69..0000000
--- a/site/src/documentation/resources/images/ja_JP/meridio-connection-web-client_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/notification-throttling_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/notification-throttling_ja_JP.PNG
deleted file mode 100644
index 6caf7da..0000000
--- a/site/src/documentation/resources/images/ja_JP/notification-throttling_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/opensearchserver-connection-parameters_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/opensearchserver-connection-parameters_ja_JP.PNG
deleted file mode 100644
index 8d72bb5..0000000
--- a/site/src/documentation/resources/images/ja_JP/opensearchserver-connection-parameters_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/opensearchserver-history-report_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/opensearchserver-history-report_ja_JP.PNG
deleted file mode 100644
index da6576e..0000000
--- a/site/src/documentation/resources/images/ja_JP/opensearchserver-history-report_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/opensearchserver-job-parameters_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/opensearchserver-job-parameters_ja_JP.PNG
deleted file mode 100644
index e225e1d..0000000
--- a/site/src/documentation/resources/images/ja_JP/opensearchserver-job-parameters_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/opensearchserver-user_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/opensearchserver-user_ja_JP.PNG
deleted file mode 100644
index 437cfe5..0000000
--- a/site/src/documentation/resources/images/ja_JP/opensearchserver-user_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/output-throttling_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/output-throttling_ja_JP.PNG
deleted file mode 100644
index cb28447..0000000
--- a/site/src/documentation/resources/images/ja_JP/output-throttling_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/queue-status-example_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/queue-status-example_ja_JP.PNG
deleted file mode 100644
index ab9f4c5..0000000
--- a/site/src/documentation/resources/images/ja_JP/queue-status-example_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/queue-status-select-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/queue-status-select-connection_ja_JP.PNG
deleted file mode 100644
index 2f72bc4..0000000
--- a/site/src/documentation/resources/images/ja_JP/queue-status-select-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/queue-status-select-job_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/queue-status-select-job_ja_JP.PNG
deleted file mode 100644
index 5c1a670..0000000
--- a/site/src/documentation/resources/images/ja_JP/queue-status-select-job_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/regexp-mapping-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/regexp-mapping-status_ja_JP.PNG
deleted file mode 100644
index 95ec983..0000000
--- a/site/src/documentation/resources/images/ja_JP/regexp-mapping-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/regexp-mapping-user-mapping_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/regexp-mapping-user-mapping_ja_JP.PNG
deleted file mode 100644
index a1005e9..0000000
--- a/site/src/documentation/resources/images/ja_JP/regexp-mapping-user-mapping_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/repository-throttling-with-throttle_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/repository-throttling-with-throttle_ja_JP.PNG
deleted file mode 100644
index 34650af..0000000
--- a/site/src/documentation/resources/images/ja_JP/repository-throttling-with-throttle_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/repository-throttling_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/repository-throttling_ja_JP.PNG
deleted file mode 100644
index fcabcc5..0000000
--- a/site/src/documentation/resources/images/ja_JP/repository-throttling_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-configure-bandwidth_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-configure-bandwidth_ja_JP.PNG
deleted file mode 100644
index bfad749..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-configure-bandwidth_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-configure-email_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-configure-email_ja_JP.PNG
deleted file mode 100644
index e6357e3..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-configure-email_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-configure-proxy_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-configure-proxy_ja_JP.PNG
deleted file mode 100644
index 9d4d055..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-configure-proxy_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-configure-robots_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-configure-robots_ja_JP.PNG
deleted file mode 100644
index beeedef..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-configure-robots_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-job-canonicalization_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-job-canonicalization_ja_JP.PNG
deleted file mode 100644
index d2b17c9..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-job-canonicalization_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-job-dechromed-content_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-job-dechromed-content_ja_JP.PNG
deleted file mode 100644
index 714822f..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-job-dechromed-content_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-job-mappings_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-job-mappings_ja_JP.PNG
deleted file mode 100644
index 3463b61..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-job-mappings_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-job-security_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-job-security_ja_JP.PNG
deleted file mode 100644
index 51b855c..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-job-security_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-job-time-values_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-job-time-values_ja_JP.PNG
deleted file mode 100644
index 551406b..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-job-time-values_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-job-urls_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-job-urls_ja_JP.PNG
deleted file mode 100644
index 698690e..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-job-urls_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/rss-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/rss-status_ja_JP.PNG
deleted file mode 100644
index 22a352c..0000000
--- a/site/src/documentation/resources/images/ja_JP/rss-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/sharepoint-configure-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/sharepoint-configure-server_ja_JP.PNG
deleted file mode 100644
index 08f588a..0000000
--- a/site/src/documentation/resources/images/ja_JP/sharepoint-configure-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/sharepoint-job-metadata_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/sharepoint-job-metadata_ja_JP.PNG
deleted file mode 100644
index 0bf5623..0000000
--- a/site/src/documentation/resources/images/ja_JP/sharepoint-job-metadata_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/sharepoint-job-paths_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/sharepoint-job-paths_ja_JP.PNG
deleted file mode 100644
index 66d4bf9..0000000
--- a/site/src/documentation/resources/images/ja_JP/sharepoint-job-paths_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/sharepoint-job-security_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/sharepoint-job-security_ja_JP.PNG
deleted file mode 100644
index 1c7b6bf..0000000
--- a/site/src/documentation/resources/images/ja_JP/sharepoint-job-security_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/sharepoint-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/sharepoint-status_ja_JP.PNG
deleted file mode 100644
index af0e7ea..0000000
--- a/site/src/documentation/resources/images/ja_JP/sharepoint-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/simple-history-example_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/simple-history-example_ja_JP.PNG
deleted file mode 100644
index e1867dd..0000000
--- a/site/src/documentation/resources/images/ja_JP/simple-history-example_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/simple-history-select-activities_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/simple-history-select-activities_ja_JP.PNG
deleted file mode 100644
index 84a9fd4..0000000
--- a/site/src/documentation/resources/images/ja_JP/simple-history-select-activities_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/simple-history-select-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/simple-history-select-connection_ja_JP.PNG
deleted file mode 100644
index cb0ff7f..0000000
--- a/site/src/documentation/resources/images/ja_JP/simple-history-select-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/solr-configure-arguments_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/solr-configure-arguments_ja_JP.PNG
deleted file mode 100644
index 3bfb409..0000000
--- a/site/src/documentation/resources/images/ja_JP/solr-configure-arguments_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/solr-configure-commits_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/solr-configure-commits_ja_JP.PNG
deleted file mode 100644
index b85afc4..0000000
--- a/site/src/documentation/resources/images/ja_JP/solr-configure-commits_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/solr-configure-documents_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/solr-configure-documents_ja_JP.PNG
deleted file mode 100644
index b9b0b52..0000000
--- a/site/src/documentation/resources/images/ja_JP/solr-configure-documents_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/solr-configure-schema_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/solr-configure-schema_ja_JP.PNG
deleted file mode 100644
index 5a4d523..0000000
--- a/site/src/documentation/resources/images/ja_JP/solr-configure-schema_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/solr-configure-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/solr-configure-server_ja_JP.PNG
deleted file mode 100644
index ca7912c..0000000
--- a/site/src/documentation/resources/images/ja_JP/solr-configure-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/solr-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/solr-status_ja_JP.PNG
deleted file mode 100644
index ad4633b..0000000
--- a/site/src/documentation/resources/images/ja_JP/solr-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/transformation-throttling_ja_JP.png b/site/src/documentation/resources/images/ja_JP/transformation-throttling_ja_JP.png
deleted file mode 100644
index 29dcfb0..0000000
--- a/site/src/documentation/resources/images/ja_JP/transformation-throttling_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-authority-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/view-authority-connection_ja_JP.PNG
deleted file mode 100644
index 4ed00bc..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-authority-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-job_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/view-job_ja_JP.PNG
deleted file mode 100644
index 46fa31a..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-job_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-mapping-connection_ja_JP.png b/site/src/documentation/resources/images/ja_JP/view-mapping-connection_ja_JP.png
deleted file mode 100644
index 9cbb3b4..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-mapping-connection_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-notification-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/view-notification-connection_ja_JP.PNG
deleted file mode 100644
index f5579b5..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-notification-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-output-connection_ja_JP.png b/site/src/documentation/resources/images/ja_JP/view-output-connection_ja_JP.png
deleted file mode 100644
index e91e2e3..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-output-connection_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-repository-connection_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/view-repository-connection_ja_JP.PNG
deleted file mode 100644
index f70a750..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-repository-connection_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/view-transformation-connection_ja_JP.png b/site/src/documentation/resources/images/ja_JP/view-transformation-connection_ja_JP.png
deleted file mode 100644
index 099cc07..0000000
--- a/site/src/documentation/resources/images/ja_JP/view-transformation-connection_ja_JP.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials-session-form_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials-session-form_ja_JP.PNG
deleted file mode 100644
index 32f0366..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials-session-form_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials-session_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials-session_ja_JP.PNG
deleted file mode 100644
index 0dc3c21..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials-session_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials_ja_JP.PNG
deleted file mode 100644
index d01825b..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-access-credentials_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-bandwidth_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-bandwidth_ja_JP.PNG
deleted file mode 100644
index 71082d8..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-bandwidth_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-certificates_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-certificates_ja_JP.PNG
deleted file mode 100644
index 7ef5982..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-certificates_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-email_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-email_ja_JP.PNG
deleted file mode 100644
index b924bdc..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-email_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-configure-robots_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-configure-robots_ja_JP.PNG
deleted file mode 100644
index 0144640..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-configure-robots_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-canonicalization_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-canonicalization_ja_JP.PNG
deleted file mode 100644
index 6cfc0c6..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-canonicalization_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-exclusions_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-exclusions_ja_JP.PNG
deleted file mode 100644
index 7f03bd8..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-exclusions_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-hop-filters_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-hop-filters_ja_JP.PNG
deleted file mode 100644
index ccd0080..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-hop-filters_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-inclusions_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-inclusions_ja_JP.PNG
deleted file mode 100644
index b60c67b..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-inclusions_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-metadata_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-metadata_ja_JP.PNG
deleted file mode 100644
index 0cf98fd..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-metadata_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-security_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-security_ja_JP.PNG
deleted file mode 100644
index d47b836..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-security_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-job-seeds_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-job-seeds_ja_JP.PNG
deleted file mode 100644
index 983adab..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-job-seeds_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/web-status_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/web-status_ja_JP.PNG
deleted file mode 100644
index 04e48b2..0000000
--- a/site/src/documentation/resources/images/ja_JP/web-status_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/welcome-screen_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/welcome-screen_ja_JP.PNG
deleted file mode 100644
index 9dfd829..0000000
--- a/site/src/documentation/resources/images/ja_JP/welcome-screen_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/ja_JP/wiki-configure-server_ja_JP.PNG b/site/src/documentation/resources/images/ja_JP/wiki-configure-server_ja_JP.PNG
deleted file mode 100644
index ae15262..0000000
--- a/site/src/documentation/resources/images/ja_JP/wiki-configure-server_ja_JP.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/LCFApacheArchitecture.png b/site/src/documentation/resources/images/zh_CN/LCFApacheArchitecture.png
deleted file mode 100644
index 185beef..0000000
--- a/site/src/documentation/resources/images/zh_CN/LCFApacheArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/MCFProcessArchitecture.png b/site/src/documentation/resources/images/zh_CN/MCFProcessArchitecture.png
deleted file mode 100644
index f051d18..0000000
--- a/site/src/documentation/resources/images/zh_CN/MCFProcessArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/SecurityArchitecture.png b/site/src/documentation/resources/images/zh_CN/SecurityArchitecture.png
deleted file mode 100644
index 271e747..0000000
--- a/site/src/documentation/resources/images/zh_CN/SecurityArchitecture.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/ad-configure-cache.PNG b/site/src/documentation/resources/images/zh_CN/ad-configure-cache.PNG
deleted file mode 100644
index 32f48e0..0000000
--- a/site/src/documentation/resources/images/zh_CN/ad-configure-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/ad-configure-dc.PNG b/site/src/documentation/resources/images/zh_CN/ad-configure-dc.PNG
deleted file mode 100644
index 539a74c..0000000
--- a/site/src/documentation/resources/images/zh_CN/ad-configure-dc.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/ad-status.PNG b/site/src/documentation/resources/images/zh_CN/ad-status.PNG
deleted file mode 100644
index d935bfd..0000000
--- a/site/src/documentation/resources/images/zh_CN/ad-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-list.png b/site/src/documentation/resources/images/zh_CN/add-list.png
deleted file mode 100644
index a835d59..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-list.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-authority-connection-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-authority-connection-name.PNG
deleted file mode 100644
index 1eba006..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-authority-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-authority-connection-type.PNG b/site/src/documentation/resources/images/zh_CN/add-new-authority-connection-type.PNG
deleted file mode 100644
index da97862..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-authority-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-authority-group-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-authority-group-name.PNG
deleted file mode 100644
index ccfcb5d..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-authority-group-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-job-connection.PNG b/site/src/documentation/resources/images/zh_CN/add-new-job-connection.PNG
deleted file mode 100644
index 4a8c5e5..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-job-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-job-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-job-name.PNG
deleted file mode 100644
index ee915c5..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-job-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-job-scheduling-with-record.PNG b/site/src/documentation/resources/images/zh_CN/add-new-job-scheduling-with-record.PNG
deleted file mode 100644
index f6b4b2a..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-job-scheduling-with-record.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-job-scheduling.PNG b/site/src/documentation/resources/images/zh_CN/add-new-job-scheduling.PNG
deleted file mode 100644
index cd58821..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-job-scheduling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-mapping-connection-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-mapping-connection-name.PNG
deleted file mode 100644
index 2700bbe..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-mapping-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-mapping-connection-type.PNG b/site/src/documentation/resources/images/zh_CN/add-new-mapping-connection-type.PNG
deleted file mode 100644
index 68cd0c1..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-mapping-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-output-connection-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-output-connection-name.PNG
deleted file mode 100644
index db3a614..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-output-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-output-connection-type.PNG b/site/src/documentation/resources/images/zh_CN/add-new-output-connection-type.PNG
deleted file mode 100644
index 6965683..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-output-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-repository-connection-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-repository-connection-name.PNG
deleted file mode 100644
index 4dbf4da..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-repository-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-repository-connection-type.PNG b/site/src/documentation/resources/images/zh_CN/add-new-repository-connection-type.PNG
deleted file mode 100644
index 3548901..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-repository-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-transformation-connection-name.PNG b/site/src/documentation/resources/images/zh_CN/add-new-transformation-connection-name.PNG
deleted file mode 100644
index 387eecf..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-transformation-connection-name.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/add-new-transformation-connection-type.PNG b/site/src/documentation/resources/images/zh_CN/add-new-transformation-connection-type.PNG
deleted file mode 100644
index d09673b..0000000
--- a/site/src/documentation/resources/images/zh_CN/add-new-transformation-connection-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-configuration-save.png b/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-configuration-save.png
deleted file mode 100644
index 013b8cb..0000000
--- a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-configuration-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-configuration.png b/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-configuration.png
deleted file mode 100644
index 0fbcdfa..0000000
--- a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-configuration.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-job-lucenequery.png b/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-job-lucenequery.png
deleted file mode 100644
index 8ba0655..0000000
--- a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-job-lucenequery.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-job-save.png b/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-job-save.png
deleted file mode 100644
index 362cee9..0000000
--- a/site/src/documentation/resources/images/zh_CN/alfresco-repository-connection-job-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/alloweddocuments-job-allowed-contents.PNG b/site/src/documentation/resources/images/zh_CN/alloweddocuments-job-allowed-contents.PNG
deleted file mode 100644
index 772568f..0000000
--- a/site/src/documentation/resources/images/zh_CN/alloweddocuments-job-allowed-contents.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/amazon-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/amazon-configure-server.PNG
deleted file mode 100644
index af09c78..0000000
--- a/site/src/documentation/resources/images/zh_CN/amazon-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/authority-prerequisites.PNG b/site/src/documentation/resources/images/zh_CN/authority-prerequisites.PNG
deleted file mode 100644
index 2b6439a..0000000
--- a/site/src/documentation/resources/images/zh_CN/authority-prerequisites.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/authority-throttling.PNG b/site/src/documentation/resources/images/zh_CN/authority-throttling.PNG
deleted file mode 100644
index aa11214..0000000
--- a/site/src/documentation/resources/images/zh_CN/authority-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-repository.png b/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-repository.png
deleted file mode 100644
index da3c68d..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-repository.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-save.png b/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-save.png
deleted file mode 100644
index 77e023d..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-usermapping.png b/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-usermapping.png
deleted file mode 100644
index 4107627..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-authority-connection-configuration-usermapping.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-configuration-save.png b/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-configuration-save.png
deleted file mode 100644
index c29a79b..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-configuration-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-configuration.png b/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-configuration.png
deleted file mode 100644
index 10b2ecc..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-configuration.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-job-cmisquery.png b/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-job-cmisquery.png
deleted file mode 100644
index f97d9eb..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-job-cmisquery.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-job-save.png b/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-job-save.png
deleted file mode 100644
index 9965825..0000000
--- a/site/src/documentation/resources/images/zh_CN/cmis-repository-connection-job-save.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/document-status-example.PNG b/site/src/documentation/resources/images/zh_CN/document-status-example.PNG
deleted file mode 100644
index 662c141..0000000
--- a/site/src/documentation/resources/images/zh_CN/document-status-example.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/document-status-select-connection.PNG b/site/src/documentation/resources/images/zh_CN/document-status-select-connection.PNG
deleted file mode 100644
index eeb6598..0000000
--- a/site/src/documentation/resources/images/zh_CN/document-status-select-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/document-status-select-job.PNG b/site/src/documentation/resources/images/zh_CN/document-status-select-job.PNG
deleted file mode 100644
index c1b3c4d..0000000
--- a/site/src/documentation/resources/images/zh_CN/document-status-select-job.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documents-library-all-metadata.png b/site/src/documentation/resources/images/zh_CN/documents-library-all-metadata.png
deleted file mode 100644
index 892d7fe..0000000
--- a/site/src/documentation/resources/images/zh_CN/documents-library-all-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documents-library-contents.png b/site/src/documentation/resources/images/zh_CN/documents-library-contents.png
deleted file mode 100644
index d3616d1..0000000
--- a/site/src/documentation/resources/images/zh_CN/documents-library-contents.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documents-library-metadata-rule.png b/site/src/documentation/resources/images/zh_CN/documents-library-metadata-rule.png
deleted file mode 100644
index fbc57de..0000000
--- a/site/src/documentation/resources/images/zh_CN/documents-library-metadata-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documents-library-metadata.png b/site/src/documentation/resources/images/zh_CN/documents-library-metadata.png
deleted file mode 100644
index fd519ce..0000000
--- a/site/src/documentation/resources/images/zh_CN/documents-library-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documents-library-path-rule.png b/site/src/documentation/resources/images/zh_CN/documents-library-path-rule.png
deleted file mode 100644
index e90d9f8..0000000
--- a/site/src/documentation/resources/images/zh_CN/documents-library-path-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documents-library-summary.png b/site/src/documentation/resources/images/zh_CN/documents-library-summary.png
deleted file mode 100644
index 3bab5ee..0000000
--- a/site/src/documentation/resources/images/zh_CN/documents-library-summary.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-authority-docbase.PNG b/site/src/documentation/resources/images/zh_CN/documentum-authority-docbase.PNG
deleted file mode 100644
index 91fbd23..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-authority-docbase.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-authority-status.PNG b/site/src/documentation/resources/images/zh_CN/documentum-authority-status.PNG
deleted file mode 100644
index 6ac940f..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-authority-system-acls.PNG b/site/src/documentation/resources/images/zh_CN/documentum-authority-system-acls.PNG
deleted file mode 100644
index 916aa4b..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-authority-system-acls.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-authority-user-mapping.PNG b/site/src/documentation/resources/images/zh_CN/documentum-authority-user-mapping.PNG
deleted file mode 100644
index 2acaa88..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-authority-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-docbase.PNG b/site/src/documentation/resources/images/zh_CN/documentum-docbase.PNG
deleted file mode 100644
index c58d195..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-docbase.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-status.PNG b/site/src/documentation/resources/images/zh_CN/documentum-status.PNG
deleted file mode 100644
index 526e7f4..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/documentum-webtop.PNG b/site/src/documentation/resources/images/zh_CN/documentum-webtop.PNG
deleted file mode 100644
index a3f7eeb..0000000
--- a/site/src/documentation/resources/images/zh_CN/documentum-webtop.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/dropbox-repository-application-secret-passwords.PNG b/site/src/documentation/resources/images/zh_CN/dropbox-repository-application-secret-passwords.PNG
deleted file mode 100644
index 5a7b728..0000000
--- a/site/src/documentation/resources/images/zh_CN/dropbox-repository-application-secret-passwords.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-configuration-save.PNG
deleted file mode 100644
index e527725..0000000
--- a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-configuration.PNG b/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-configuration.PNG
deleted file mode 100644
index 8e4c4ae..0000000
--- a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-job-dropbox-folder-to-index.PNG b/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-job-dropbox-folder-to-index.PNG
deleted file mode 100644
index 9e164b5..0000000
--- a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-job-dropbox-folder-to-index.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-job-save.PNG b/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-job-save.PNG
deleted file mode 100644
index b988b60..0000000
--- a/site/src/documentation/resources/images/zh_CN/dropbox-repository-connection-job-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/dropbox-repository-create-application.PNG b/site/src/documentation/resources/images/zh_CN/dropbox-repository-create-application.PNG
deleted file mode 100644
index b33b9b2..0000000
--- a/site/src/documentation/resources/images/zh_CN/dropbox-repository-create-application.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/elasticsearch-connection-parameters.png b/site/src/documentation/resources/images/zh_CN/elasticsearch-connection-parameters.png
deleted file mode 100644
index d4054f9..0000000
--- a/site/src/documentation/resources/images/zh_CN/elasticsearch-connection-parameters.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/elasticsearch-history-report.png b/site/src/documentation/resources/images/zh_CN/elasticsearch-history-report.png
deleted file mode 100644
index c8a500c..0000000
--- a/site/src/documentation/resources/images/zh_CN/elasticsearch-history-report.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/elasticsearch-job-parameters.png b/site/src/documentation/resources/images/zh_CN/elasticsearch-job-parameters.png
deleted file mode 100644
index 78d8209..0000000
--- a/site/src/documentation/resources/images/zh_CN/elasticsearch-job-parameters.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/email-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/email-configure-server.PNG
deleted file mode 100644
index 4da9692..0000000
--- a/site/src/documentation/resources/images/zh_CN/email-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/email-configure-url.PNG b/site/src/documentation/resources/images/zh_CN/email-configure-url.PNG
deleted file mode 100644
index ec000ec..0000000
--- a/site/src/documentation/resources/images/zh_CN/email-configure-url.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/email-job-filter.PNG b/site/src/documentation/resources/images/zh_CN/email-job-filter.PNG
deleted file mode 100644
index 5250762..0000000
--- a/site/src/documentation/resources/images/zh_CN/email-job-filter.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/email-job-metadata.PNG b/site/src/documentation/resources/images/zh_CN/email-job-metadata.PNG
deleted file mode 100644
index bfad7fa..0000000
--- a/site/src/documentation/resources/images/zh_CN/email-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/email-status.PNG b/site/src/documentation/resources/images/zh_CN/email-status.PNG
deleted file mode 100644
index 6798a33..0000000
--- a/site/src/documentation/resources/images/zh_CN/email-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/faq-list-all-metadata.png b/site/src/documentation/resources/images/zh_CN/faq-list-all-metadata.png
deleted file mode 100644
index 6287712..0000000
--- a/site/src/documentation/resources/images/zh_CN/faq-list-all-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/faq-list-contents.png b/site/src/documentation/resources/images/zh_CN/faq-list-contents.png
deleted file mode 100644
index 776100d..0000000
--- a/site/src/documentation/resources/images/zh_CN/faq-list-contents.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/faq-list-metadata-rule.png b/site/src/documentation/resources/images/zh_CN/faq-list-metadata-rule.png
deleted file mode 100644
index efad356..0000000
--- a/site/src/documentation/resources/images/zh_CN/faq-list-metadata-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/faq-list-metadata.png b/site/src/documentation/resources/images/zh_CN/faq-list-metadata.png
deleted file mode 100644
index 3d4106c..0000000
--- a/site/src/documentation/resources/images/zh_CN/faq-list-metadata.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/faq-list-path-rule.png b/site/src/documentation/resources/images/zh_CN/faq-list-path-rule.png
deleted file mode 100644
index edab981..0000000
--- a/site/src/documentation/resources/images/zh_CN/faq-list-path-rule.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/faq-list-summary.png b/site/src/documentation/resources/images/zh_CN/faq-list-summary.png
deleted file mode 100644
index c985749..0000000
--- a/site/src/documentation/resources/images/zh_CN/faq-list-summary.png
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filenet-configure-credentials.PNG b/site/src/documentation/resources/images/zh_CN/filenet-configure-credentials.PNG
deleted file mode 100644
index 06ed8b8..0000000
--- a/site/src/documentation/resources/images/zh_CN/filenet-configure-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filenet-configure-documenturl.PNG b/site/src/documentation/resources/images/zh_CN/filenet-configure-documenturl.PNG
deleted file mode 100644
index 43b153f..0000000
--- a/site/src/documentation/resources/images/zh_CN/filenet-configure-documenturl.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filenet-configure-objectstore.PNG b/site/src/documentation/resources/images/zh_CN/filenet-configure-objectstore.PNG
deleted file mode 100644
index 6629ff5..0000000
--- a/site/src/documentation/resources/images/zh_CN/filenet-configure-objectstore.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filenet-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/filenet-configure-server.PNG
deleted file mode 100644
index 1ceb11e..0000000
--- a/site/src/documentation/resources/images/zh_CN/filenet-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filenet-status.PNG b/site/src/documentation/resources/images/zh_CN/filenet-status.PNG
deleted file mode 100644
index 7a91587..0000000
--- a/site/src/documentation/resources/images/zh_CN/filenet-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filesystem-job-hopcount.PNG b/site/src/documentation/resources/images/zh_CN/filesystem-job-hopcount.PNG
deleted file mode 100644
index b2a7e75..0000000
--- a/site/src/documentation/resources/images/zh_CN/filesystem-job-hopcount.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filesystem-job-output-path.PNG b/site/src/documentation/resources/images/zh_CN/filesystem-job-output-path.PNG
deleted file mode 100644
index c115708..0000000
--- a/site/src/documentation/resources/images/zh_CN/filesystem-job-output-path.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/filesystem-job-paths.PNG b/site/src/documentation/resources/images/zh_CN/filesystem-job-paths.PNG
deleted file mode 100644
index 7036308..0000000
--- a/site/src/documentation/resources/images/zh_CN/filesystem-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-configuration-save.PNG
deleted file mode 100644
index 2e76eee..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-configuration.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-configuration.PNG
deleted file mode 100644
index a90cea1..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-job-googledrive-seed-query.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-job-googledrive-seed-query.PNG
deleted file mode 100644
index 9458235..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-connection-job-googledrive-seed-query.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-1.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-1.PNG
deleted file mode 100644
index 0ac4c2e..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-1.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-2.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-2.PNG
deleted file mode 100644
index 4800c35..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-2.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-3.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-3.PNG
deleted file mode 100644
index c82e350..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-3.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-4.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-4.PNG
deleted file mode 100644
index c500993..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-4.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-5.PNG b/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-5.PNG
deleted file mode 100644
index fc79595..0000000
--- a/site/src/documentation/resources/images/zh_CN/googledrive-repository-setup-5.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/hdfs-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/hdfs-configure-server.PNG
deleted file mode 100644
index 29d37cc..0000000
--- a/site/src/documentation/resources/images/zh_CN/hdfs-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/hdfs-job-hopcount.PNG b/site/src/documentation/resources/images/zh_CN/hdfs-job-hopcount.PNG
deleted file mode 100644
index 239e052..0000000
--- a/site/src/documentation/resources/images/zh_CN/hdfs-job-hopcount.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/hdfs-job-output-path.PNG b/site/src/documentation/resources/images/zh_CN/hdfs-job-output-path.PNG
deleted file mode 100644
index 6c8f411..0000000
--- a/site/src/documentation/resources/images/zh_CN/hdfs-job-output-path.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/hdfs-job-paths.PNG b/site/src/documentation/resources/images/zh_CN/hdfs-job-paths.PNG
deleted file mode 100644
index 2243f1c..0000000
--- a/site/src/documentation/resources/images/zh_CN/hdfs-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/hdfs-repository-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/hdfs-repository-configure-server.PNG
deleted file mode 100644
index 3e55f43..0000000
--- a/site/src/documentation/resources/images/zh_CN/hdfs-repository-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-configure-server.PNG
deleted file mode 100644
index d42affd..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-job-content-length.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-job-content-length.PNG
deleted file mode 100644
index a1ed333..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-job-content-length.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-job-file-mapping.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-job-file-mapping.PNG
deleted file mode 100644
index 30eb50a..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-job-file-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-job-metadata.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-job-metadata.PNG
deleted file mode 100644
index 68d3d43..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-job-paths.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-job-paths.PNG
deleted file mode 100644
index 119066a..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-job-security.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-job-security.PNG
deleted file mode 100644
index c70a4fd..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-job-url-mapping.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-job-url-mapping.PNG
deleted file mode 100644
index 0dd36be..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-job-url-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jcifs-status.PNG b/site/src/documentation/resources/images/zh_CN/jcifs-status.PNG
deleted file mode 100644
index 626ecb2..0000000
--- a/site/src/documentation/resources/images/zh_CN/jcifs-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-credentials.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-credentials.PNG
deleted file mode 100644
index 7b90e04..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-database-type.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-database-type.PNG
deleted file mode 100644
index 82e122f..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-database-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-queries.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-queries.PNG
deleted file mode 100644
index d0e7005..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-queries.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-server.PNG
deleted file mode 100644
index d0e5647..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-authority-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-authority-status.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-authority-status.PNG
deleted file mode 100644
index 74d3c85..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-configure-credentials.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-configure-credentials.PNG
deleted file mode 100644
index 0f9e53e..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-configure-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-configure-database-type.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-configure-database-type.PNG
deleted file mode 100644
index dfa6b7c..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-configure-database-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-configure-server.PNG
deleted file mode 100644
index 544e199..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-job-queries.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-job-queries.PNG
deleted file mode 100644
index 6666797..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-job-queries.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-job-security.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-job-security.PNG
deleted file mode 100644
index 3debcc6..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jdbc-status.PNG b/site/src/documentation/resources/images/zh_CN/jdbc-status.PNG
deleted file mode 100644
index 5ce8c46..0000000
--- a/site/src/documentation/resources/images/zh_CN/jdbc-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jira-repository-connection-configuration-save.PNG b/site/src/documentation/resources/images/zh_CN/jira-repository-connection-configuration-save.PNG
deleted file mode 100644
index 211f36f..0000000
--- a/site/src/documentation/resources/images/zh_CN/jira-repository-connection-configuration-save.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jira-repository-connection-configuration.PNG b/site/src/documentation/resources/images/zh_CN/jira-repository-connection-configuration.PNG
deleted file mode 100644
index 53443a1..0000000
--- a/site/src/documentation/resources/images/zh_CN/jira-repository-connection-configuration.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/jira-repository-connection-job-jira-seed-query.PNG b/site/src/documentation/resources/images/zh_CN/jira-repository-connection-job-jira-seed-query.PNG
deleted file mode 100644
index 0e82571..0000000
--- a/site/src/documentation/resources/images/zh_CN/jira-repository-connection-job-jira-seed-query.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/job-status.PNG b/site/src/documentation/resources/images/zh_CN/job-status.PNG
deleted file mode 100644
index b66d070..0000000
--- a/site/src/documentation/resources/images/zh_CN/job-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/ldap-configure-ldap.PNG b/site/src/documentation/resources/images/zh_CN/ldap-configure-ldap.PNG
deleted file mode 100644
index 2703ca5..0000000
--- a/site/src/documentation/resources/images/zh_CN/ldap-configure-ldap.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/ldap-status.PNG b/site/src/documentation/resources/images/zh_CN/ldap-status.PNG
deleted file mode 100644
index 4fbfae8..0000000
--- a/site/src/documentation/resources/images/zh_CN/ldap-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-authority-connections.PNG b/site/src/documentation/resources/images/zh_CN/list-authority-connections.PNG
deleted file mode 100644
index 23a27dc..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-authority-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-authority-groups.PNG b/site/src/documentation/resources/images/zh_CN/list-authority-groups.PNG
deleted file mode 100644
index d05a06f..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-authority-groups.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-jobs.PNG b/site/src/documentation/resources/images/zh_CN/list-jobs.PNG
deleted file mode 100644
index b32727e..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-jobs.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-mapping-connections.PNG b/site/src/documentation/resources/images/zh_CN/list-mapping-connections.PNG
deleted file mode 100644
index b5dd698..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-mapping-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-output-connections.PNG b/site/src/documentation/resources/images/zh_CN/list-output-connections.PNG
deleted file mode 100644
index fbb6dda..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-output-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-repository-connections.PNG b/site/src/documentation/resources/images/zh_CN/list-repository-connections.PNG
deleted file mode 100644
index c95e337..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-repository-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/list-transformation-connections.PNG b/site/src/documentation/resources/images/zh_CN/list-transformation-connections.PNG
deleted file mode 100644
index d1d0086..0000000
--- a/site/src/documentation/resources/images/zh_CN/list-transformation-connections.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-authority-cache.PNG b/site/src/documentation/resources/images/zh_CN/livelink-authority-cache.PNG
deleted file mode 100644
index 0f7a596..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-authority-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-authority-server.PNG b/site/src/documentation/resources/images/zh_CN/livelink-authority-server.PNG
deleted file mode 100644
index a893088..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-authority-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-authority-status.PNG b/site/src/documentation/resources/images/zh_CN/livelink-authority-status.PNG
deleted file mode 100644
index 8c23cef..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-authority-user-mapping.PNG b/site/src/documentation/resources/images/zh_CN/livelink-authority-user-mapping.PNG
deleted file mode 100644
index 6eb3f93..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-authority-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-connection-document-access.PNG b/site/src/documentation/resources/images/zh_CN/livelink-connection-document-access.PNG
deleted file mode 100644
index bed49f4..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-connection-document-access.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-connection-document-view.PNG b/site/src/documentation/resources/images/zh_CN/livelink-connection-document-view.PNG
deleted file mode 100644
index 9dc2b53..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-connection-document-view.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-connection-server.PNG b/site/src/documentation/resources/images/zh_CN/livelink-connection-server.PNG
deleted file mode 100644
index fe3cd46..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-connection-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-connection-status.PNG b/site/src/documentation/resources/images/zh_CN/livelink-connection-status.PNG
deleted file mode 100644
index 88292e3..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-connection-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-job-filters.PNG b/site/src/documentation/resources/images/zh_CN/livelink-job-filters.PNG
deleted file mode 100644
index 5bf3d30..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-job-filters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-job-metadata.PNG b/site/src/documentation/resources/images/zh_CN/livelink-job-metadata.PNG
deleted file mode 100644
index 60d4816..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-job-paths.PNG b/site/src/documentation/resources/images/zh_CN/livelink-job-paths.PNG
deleted file mode 100644
index c83fa76..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/livelink-job-security.PNG b/site/src/documentation/resources/images/zh_CN/livelink-job-security.PNG
deleted file mode 100644
index 7b3adbc..0000000
--- a/site/src/documentation/resources/images/zh_CN/livelink-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/login.PNG b/site/src/documentation/resources/images/zh_CN/login.PNG
deleted file mode 100644
index 25d1410..0000000
--- a/site/src/documentation/resources/images/zh_CN/login.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/mapping-prerequisites.PNG b/site/src/documentation/resources/images/zh_CN/mapping-prerequisites.PNG
deleted file mode 100644
index e6313af..0000000
--- a/site/src/documentation/resources/images/zh_CN/mapping-prerequisites.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/mapping-throttling.PNG b/site/src/documentation/resources/images/zh_CN/mapping-throttling.PNG
deleted file mode 100644
index 4261a4c..0000000
--- a/site/src/documentation/resources/images/zh_CN/mapping-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/memex-authority-memex-server.PNG b/site/src/documentation/resources/images/zh_CN/memex-authority-memex-server.PNG
deleted file mode 100644
index b4d5cc0..0000000
--- a/site/src/documentation/resources/images/zh_CN/memex-authority-memex-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/memex-authority-status.PNG b/site/src/documentation/resources/images/zh_CN/memex-authority-status.PNG
deleted file mode 100644
index aa4171c..0000000
--- a/site/src/documentation/resources/images/zh_CN/memex-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/memex-authority-user-mapping.PNG b/site/src/documentation/resources/images/zh_CN/memex-authority-user-mapping.PNG
deleted file mode 100644
index 23f3663..0000000
--- a/site/src/documentation/resources/images/zh_CN/memex-authority-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/memex-connection-memex-server.PNG b/site/src/documentation/resources/images/zh_CN/memex-connection-memex-server.PNG
deleted file mode 100644
index 7390624..0000000
--- a/site/src/documentation/resources/images/zh_CN/memex-connection-memex-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/memex-connection-status.PNG b/site/src/documentation/resources/images/zh_CN/memex-connection-status.PNG
deleted file mode 100644
index 8371894..0000000
--- a/site/src/documentation/resources/images/zh_CN/memex-connection-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/memex-connection-web-server.PNG b/site/src/documentation/resources/images/zh_CN/memex-connection-web-server.PNG
deleted file mode 100644
index 475dc0e..0000000
--- a/site/src/documentation/resources/images/zh_CN/memex-connection-web-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-authority-credentials.PNG b/site/src/documentation/resources/images/zh_CN/meridio-authority-credentials.PNG
deleted file mode 100644
index ab6c1b5..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-authority-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-authority-document-server.PNG b/site/src/documentation/resources/images/zh_CN/meridio-authority-document-server.PNG
deleted file mode 100644
index 4a9a89e..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-authority-document-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-authority-records-server.PNG b/site/src/documentation/resources/images/zh_CN/meridio-authority-records-server.PNG
deleted file mode 100644
index 460a0ec..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-authority-records-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-authority-status.PNG b/site/src/documentation/resources/images/zh_CN/meridio-authority-status.PNG
deleted file mode 100644
index e701bcf..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-authority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-authority-user-service-server.PNG b/site/src/documentation/resources/images/zh_CN/meridio-authority-user-service-server.PNG
deleted file mode 100644
index e1bb92d..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-authority-user-service-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-connection-credentials.PNG b/site/src/documentation/resources/images/zh_CN/meridio-connection-credentials.PNG
deleted file mode 100644
index 89eea46..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-connection-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-connection-document-server.PNG b/site/src/documentation/resources/images/zh_CN/meridio-connection-document-server.PNG
deleted file mode 100644
index 0997d46..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-connection-document-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-connection-records-server.PNG b/site/src/documentation/resources/images/zh_CN/meridio-connection-records-server.PNG
deleted file mode 100644
index 1bed4f1..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-connection-records-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-connection-status.PNG b/site/src/documentation/resources/images/zh_CN/meridio-connection-status.PNG
deleted file mode 100644
index 8eff7e9..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-connection-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/meridio-connection-web-client.PNG b/site/src/documentation/resources/images/zh_CN/meridio-connection-web-client.PNG
deleted file mode 100644
index a914530..0000000
--- a/site/src/documentation/resources/images/zh_CN/meridio-connection-web-client.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/metadataadjuster-job-add-metadata.PNG b/site/src/documentation/resources/images/zh_CN/metadataadjuster-job-add-metadata.PNG
deleted file mode 100644
index bf2fd77..0000000
--- a/site/src/documentation/resources/images/zh_CN/metadataadjuster-job-add-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/metadataadjuster-job-move-metadata.PNG b/site/src/documentation/resources/images/zh_CN/metadataadjuster-job-move-metadata.PNG
deleted file mode 100644
index b435f7b..0000000
--- a/site/src/documentation/resources/images/zh_CN/metadataadjuster-job-move-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/opensearchserver-connection-parameters.PNG b/site/src/documentation/resources/images/zh_CN/opensearchserver-connection-parameters.PNG
deleted file mode 100644
index 502861b..0000000
--- a/site/src/documentation/resources/images/zh_CN/opensearchserver-connection-parameters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/opensearchserver-history-report.PNG b/site/src/documentation/resources/images/zh_CN/opensearchserver-history-report.PNG
deleted file mode 100644
index d81780b..0000000
--- a/site/src/documentation/resources/images/zh_CN/opensearchserver-history-report.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/opensearchserver-job-parameters.PNG b/site/src/documentation/resources/images/zh_CN/opensearchserver-job-parameters.PNG
deleted file mode 100644
index 25064ec..0000000
--- a/site/src/documentation/resources/images/zh_CN/opensearchserver-job-parameters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/opensearchserver-user.PNG b/site/src/documentation/resources/images/zh_CN/opensearchserver-user.PNG
deleted file mode 100644
index 437cfe5..0000000
--- a/site/src/documentation/resources/images/zh_CN/opensearchserver-user.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/output-throttling.PNG b/site/src/documentation/resources/images/zh_CN/output-throttling.PNG
deleted file mode 100644
index 0d2871c..0000000
--- a/site/src/documentation/resources/images/zh_CN/output-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/queue-status-example.PNG b/site/src/documentation/resources/images/zh_CN/queue-status-example.PNG
deleted file mode 100644
index fbd0db2..0000000
--- a/site/src/documentation/resources/images/zh_CN/queue-status-example.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/queue-status-select-connection.PNG b/site/src/documentation/resources/images/zh_CN/queue-status-select-connection.PNG
deleted file mode 100644
index b2bae28..0000000
--- a/site/src/documentation/resources/images/zh_CN/queue-status-select-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/queue-status-select-job.PNG b/site/src/documentation/resources/images/zh_CN/queue-status-select-job.PNG
deleted file mode 100644
index bce2235..0000000
--- a/site/src/documentation/resources/images/zh_CN/queue-status-select-job.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/regexp-mapping-status.PNG b/site/src/documentation/resources/images/zh_CN/regexp-mapping-status.PNG
deleted file mode 100644
index aba7a37..0000000
--- a/site/src/documentation/resources/images/zh_CN/regexp-mapping-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/regexp-mapping-user-mapping.PNG b/site/src/documentation/resources/images/zh_CN/regexp-mapping-user-mapping.PNG
deleted file mode 100644
index f20a0a4..0000000
--- a/site/src/documentation/resources/images/zh_CN/regexp-mapping-user-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/repository-throttling-with-throttle.PNG b/site/src/documentation/resources/images/zh_CN/repository-throttling-with-throttle.PNG
deleted file mode 100644
index 41ebb7f..0000000
--- a/site/src/documentation/resources/images/zh_CN/repository-throttling-with-throttle.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/repository-throttling.PNG b/site/src/documentation/resources/images/zh_CN/repository-throttling.PNG
deleted file mode 100644
index 674bff4..0000000
--- a/site/src/documentation/resources/images/zh_CN/repository-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-configure-bandwidth.PNG b/site/src/documentation/resources/images/zh_CN/rss-configure-bandwidth.PNG
deleted file mode 100644
index a106367..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-configure-bandwidth.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-configure-email.PNG b/site/src/documentation/resources/images/zh_CN/rss-configure-email.PNG
deleted file mode 100644
index 0da46d1..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-configure-email.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-configure-proxy.PNG b/site/src/documentation/resources/images/zh_CN/rss-configure-proxy.PNG
deleted file mode 100644
index 21390c1..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-configure-proxy.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-configure-robots.PNG b/site/src/documentation/resources/images/zh_CN/rss-configure-robots.PNG
deleted file mode 100644
index 4c085ca..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-configure-robots.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-canonicalization.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-canonicalization.PNG
deleted file mode 100644
index 03668c6..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-canonicalization.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-dechromed-content.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-dechromed-content.PNG
deleted file mode 100644
index 3b99821..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-dechromed-content.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-exclusions.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-exclusions.PNG
deleted file mode 100644
index 2a6ff3f..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-exclusions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-mappings.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-mappings.PNG
deleted file mode 100644
index 98f5a0c..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-mappings.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-metadata.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-metadata.PNG
deleted file mode 100644
index 429a9ae..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-security.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-security.PNG
deleted file mode 100644
index 73c6122..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-time-values.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-time-values.PNG
deleted file mode 100644
index 2edd1f8..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-time-values.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-job-urls.PNG b/site/src/documentation/resources/images/zh_CN/rss-job-urls.PNG
deleted file mode 100644
index 66695b4..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-job-urls.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/rss-status.PNG b/site/src/documentation/resources/images/zh_CN/rss-status.PNG
deleted file mode 100644
index 5c4ae6b..0000000
--- a/site/src/documentation/resources/images/zh_CN/rss-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepoint-configure-authoritytype.PNG b/site/src/documentation/resources/images/zh_CN/sharepoint-configure-authoritytype.PNG
deleted file mode 100644
index 1bec5d8..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepoint-configure-authoritytype.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepoint-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/sharepoint-configure-server.PNG
deleted file mode 100644
index ccfdb4d..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepoint-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepoint-job-metadata.PNG b/site/src/documentation/resources/images/zh_CN/sharepoint-job-metadata.PNG
deleted file mode 100644
index 35fec2e..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepoint-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepoint-job-paths.PNG b/site/src/documentation/resources/images/zh_CN/sharepoint-job-paths.PNG
deleted file mode 100644
index 4c6c7ff..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepoint-job-paths.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepoint-job-security.PNG b/site/src/documentation/resources/images/zh_CN/sharepoint-job-security.PNG
deleted file mode 100644
index 302f7cf..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepoint-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepoint-status.PNG b/site/src/documentation/resources/images/zh_CN/sharepoint-status.PNG
deleted file mode 100644
index cc02e18..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepoint-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepointadauthority-configure-cache.PNG b/site/src/documentation/resources/images/zh_CN/sharepointadauthority-configure-cache.PNG
deleted file mode 100644
index bf733f5..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepointadauthority-configure-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepointadauthority-configure-dc.PNG b/site/src/documentation/resources/images/zh_CN/sharepointadauthority-configure-dc.PNG
deleted file mode 100644
index 51905c2..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepointadauthority-configure-dc.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepointadauthority-status.PNG b/site/src/documentation/resources/images/zh_CN/sharepointadauthority-status.PNG
deleted file mode 100644
index cdfc4e5..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepointadauthority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-configure-cache.PNG b/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-configure-cache.PNG
deleted file mode 100644
index d7b0a03..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-configure-cache.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-configure-server.PNG
deleted file mode 100644
index ab6066f..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-status.PNG b/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-status.PNG
deleted file mode 100644
index 35b2185..0000000
--- a/site/src/documentation/resources/images/zh_CN/sharepointnativeauthority-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/simple-history-example.PNG b/site/src/documentation/resources/images/zh_CN/simple-history-example.PNG
deleted file mode 100644
index c71611e..0000000
--- a/site/src/documentation/resources/images/zh_CN/simple-history-example.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/simple-history-select-activities.PNG b/site/src/documentation/resources/images/zh_CN/simple-history-select-activities.PNG
deleted file mode 100644
index 878eda4..0000000
--- a/site/src/documentation/resources/images/zh_CN/simple-history-select-activities.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/simple-history-select-connection.PNG b/site/src/documentation/resources/images/zh_CN/simple-history-select-connection.PNG
deleted file mode 100644
index e9d2be0..0000000
--- a/site/src/documentation/resources/images/zh_CN/simple-history-select-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-arguments.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-arguments.PNG
deleted file mode 100644
index cc6d653..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-arguments.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-commits.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-commits.PNG
deleted file mode 100644
index 64b60d0..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-commits.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-documents.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-documents.PNG
deleted file mode 100644
index 67aba5a..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-documents.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-schema.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-schema.PNG
deleted file mode 100644
index c90f4a9..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-schema.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-server.PNG
deleted file mode 100644
index c3561bf..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-solr-type.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-solr-type.PNG
deleted file mode 100644
index 9602fef..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-solr-type.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-configure-zookeeper.PNG b/site/src/documentation/resources/images/zh_CN/solr-configure-zookeeper.PNG
deleted file mode 100644
index b99c3f9..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-configure-zookeeper.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-job-field-mapping.PNG b/site/src/documentation/resources/images/zh_CN/solr-job-field-mapping.PNG
deleted file mode 100644
index fe01b15..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-job-field-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/solr-status.PNG b/site/src/documentation/resources/images/zh_CN/solr-status.PNG
deleted file mode 100644
index 6bce05f..0000000
--- a/site/src/documentation/resources/images/zh_CN/solr-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/tika-job-exceptions.PNG b/site/src/documentation/resources/images/zh_CN/tika-job-exceptions.PNG
deleted file mode 100644
index 3a04986..0000000
--- a/site/src/documentation/resources/images/zh_CN/tika-job-exceptions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/tika-job-field-mapping.PNG b/site/src/documentation/resources/images/zh_CN/tika-job-field-mapping.PNG
deleted file mode 100644
index 56bf772..0000000
--- a/site/src/documentation/resources/images/zh_CN/tika-job-field-mapping.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/transformation-throttling.PNG b/site/src/documentation/resources/images/zh_CN/transformation-throttling.PNG
deleted file mode 100644
index 71e5290..0000000
--- a/site/src/documentation/resources/images/zh_CN/transformation-throttling.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/view-authority-connection.PNG b/site/src/documentation/resources/images/zh_CN/view-authority-connection.PNG
deleted file mode 100644
index 4ed00bc..0000000
--- a/site/src/documentation/resources/images/zh_CN/view-authority-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/view-job.PNG b/site/src/documentation/resources/images/zh_CN/view-job.PNG
deleted file mode 100644
index 28ef6e7..0000000
--- a/site/src/documentation/resources/images/zh_CN/view-job.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/view-mapping-connection.PNG b/site/src/documentation/resources/images/zh_CN/view-mapping-connection.PNG
deleted file mode 100644
index cfb4e55..0000000
--- a/site/src/documentation/resources/images/zh_CN/view-mapping-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/view-output-connection.PNG b/site/src/documentation/resources/images/zh_CN/view-output-connection.PNG
deleted file mode 100644
index c19a08c..0000000
--- a/site/src/documentation/resources/images/zh_CN/view-output-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/view-repository-connection.PNG b/site/src/documentation/resources/images/zh_CN/view-repository-connection.PNG
deleted file mode 100644
index f70a750..0000000
--- a/site/src/documentation/resources/images/zh_CN/view-repository-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/view-transformation-connection.PNG b/site/src/documentation/resources/images/zh_CN/view-transformation-connection.PNG
deleted file mode 100644
index b5b58f0..0000000
--- a/site/src/documentation/resources/images/zh_CN/view-transformation-connection.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials-session-form.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials-session-form.PNG
deleted file mode 100644
index 31b8e6c..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials-session-form.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials-session.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials-session.PNG
deleted file mode 100644
index d9cc779..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials-session.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials.PNG
deleted file mode 100644
index 4625ba1..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-access-credentials.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-bandwidth.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-bandwidth.PNG
deleted file mode 100644
index 59286c6..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-bandwidth.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-certificates.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-certificates.PNG
deleted file mode 100644
index 3669185..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-certificates.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-email.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-email.PNG
deleted file mode 100644
index 815940c..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-email.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-configure-robots.PNG b/site/src/documentation/resources/images/zh_CN/web-configure-robots.PNG
deleted file mode 100644
index 8921368..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-configure-robots.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-canonicalization.PNG b/site/src/documentation/resources/images/zh_CN/web-job-canonicalization.PNG
deleted file mode 100644
index fd0e4f7..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-canonicalization.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-exclusions.PNG b/site/src/documentation/resources/images/zh_CN/web-job-exclusions.PNG
deleted file mode 100644
index 4bb0459..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-exclusions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-hop-filters.PNG b/site/src/documentation/resources/images/zh_CN/web-job-hop-filters.PNG
deleted file mode 100644
index b6999ba..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-hop-filters.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-inclusions.PNG b/site/src/documentation/resources/images/zh_CN/web-job-inclusions.PNG
deleted file mode 100644
index 9dc4a0e..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-inclusions.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-metadata.PNG b/site/src/documentation/resources/images/zh_CN/web-job-metadata.PNG
deleted file mode 100644
index 2cda66c..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-metadata.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-security.PNG b/site/src/documentation/resources/images/zh_CN/web-job-security.PNG
deleted file mode 100644
index db19734..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-security.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-job-seeds.PNG b/site/src/documentation/resources/images/zh_CN/web-job-seeds.PNG
deleted file mode 100644
index 1de34f1..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-job-seeds.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/web-status.PNG b/site/src/documentation/resources/images/zh_CN/web-status.PNG
deleted file mode 100644
index 0227591..0000000
--- a/site/src/documentation/resources/images/zh_CN/web-status.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/welcome-screen.PNG b/site/src/documentation/resources/images/zh_CN/welcome-screen.PNG
deleted file mode 100644
index cd20b67..0000000
--- a/site/src/documentation/resources/images/zh_CN/welcome-screen.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/resources/images/zh_CN/wiki-configure-server.PNG b/site/src/documentation/resources/images/zh_CN/wiki-configure-server.PNG
deleted file mode 100644
index 0b71829..0000000
--- a/site/src/documentation/resources/images/zh_CN/wiki-configure-server.PNG
+++ /dev/null
Binary files differ
diff --git a/site/src/documentation/skinconf.xml b/site/src/documentation/skinconf.xml
deleted file mode 100644
index 8844c44..0000000
--- a/site/src/documentation/skinconf.xml
+++ /dev/null
@@ -1,373 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Copyright 2002-2004 The Apache Software Foundation
-
-  Licensed 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.
--->
-
-<!--
-Skin configuration file. This file contains details of your project,
-which will be used to configure the chosen Forrest skin.
--->
-
-<!DOCTYPE skinconfig PUBLIC "-//APACHE//DTD Skin Configuration V0.8-2//EN" "http://forrest.apache.org/dtd/skinconfig-v08-2.dtd">
-<skinconfig>
-  <!-- To enable lucene search add provider="lucene" (default is google).
-    Add box-location="alt" to move the search box to an alternate location
-    (if the skin supports it) and box-location="all" to show it in all
-    available locations on the page.  Remove the <search> element to show
-    no search box. @domain will enable sitesearch for the specific domain with google.
-    In other words google will search the @domain for the query string.
-
-  -->
-  <search name="Lucene" domain="incubator.apache.org" provider="Solr"/>
-
-  <!-- Disable the print link? If enabled, invalid HTML 4.0.1 -->
-  <disable-print-link>true</disable-print-link>  
-  <!-- Disable the PDF link? -->
-  <disable-pdf-link>true</disable-pdf-link>
-  <!-- Disable the POD link? -->
-  <disable-pod-link>true</disable-pod-link>
-  <!-- Disable the Text link? FIXME: NOT YET IMPLEMENETED. -->
-  <disable-txt-link>true</disable-txt-link>
-  <!-- Disable the xml source link? -->
-  <!-- The xml source link makes it possible to access the xml rendition
-    of the source frim the html page, and to have it generated statically.
-    This can be used to enable other sites and services to reuse the
-    xml format for their uses. Keep this disabled if you don't want other
-    sites to easily reuse your pages.-->
-  <disable-xml-link>true</disable-xml-link>
-
-  <!-- Disable navigation icons on all external links? -->
-  <disable-external-link-image>true</disable-external-link-image>
-
-  <!-- Disable w3c compliance links? 
-    Use e.g. align="center" to move the compliance links logos to 
-    an alternate location default is left.
-    (if the skin supports it) -->
-  <disable-compliance-links>true</disable-compliance-links>
-
-  <!-- Render mailto: links unrecognisable by spam harvesters? -->
-  <obfuscate-mail-links>false</obfuscate-mail-links>
-
-  <!-- Disable the javascript facility to change the font size -->
-  <disable-font-script>true</disable-font-script>
-
-  <!-- mandatory project logo
-       default skin: renders it at the top -->
-  <project-name>Apache ManifoldCF</project-name>
-  <project-description>ManifoldCF</project-description>
-  <project-url>http://manifoldcf.apache.org</project-url>
-  <project-logo>images/ManifoldCF-logo.PNG</project-logo>
-  <!-- Alternative static image:
-  <project-logo>images/project-logo.gif</project-logo> -->
-
-  <!-- optional group logo
-       default skin: renders it at the top-left corner -->
-  <group-name>Apache</group-name>
-  <group-description>Apache Software Foundation</group-description>
-  <group-url>http://www.apache.org</group-url>
-  <group-logo>images/asf_logo.png</group-logo>
-  <!-- Alternative static image:
-  <group-logo>images/group-logo.gif</group-logo> -->
-
-  <!-- optional host logo (e.g. sourceforge logo)
-       default skin: renders it at the bottom-left corner -->
-  <host-url></host-url>
-  <host-logo></host-logo>
-
-  <!-- relative url of a favicon file, normally favicon.ico -->
-  <favicon-url>images/favicon.ico</favicon-url>
-
-  <!-- The following are used to construct a copyright statement -->
-  <year>2009-2017</year>
-  <vendor>The Apache Software Foundation.</vendor>
-  <copyright-link>http://www.apache.org/licenses/</copyright-link>
-  <!-- Optional text trademark statement below the copyright statement -->
-  <trademark-statement>
-    Apache ManifoldCF, ManifoldCF, Apache Forrest, Forrest, Apache Solr, Solr, Apache, the Apache feather logo, the Apache Forrest
-    logo, and the Apache ManifoldCF logo are trademarks of The Apache Software Foundation.
-    Documentum and EMC are a trademarks of EMC Corporation.
-    SharePoint, Windows, and Microsoft are trademarks of Microsoft, Inc.
-    FileNet P8 and IBM are trademarks of IBM, Inc.
-    LiveLink and OpenText are trademarks of OpenText, Inc.
-    QBase, MetaCarta, and GTS are trademarks of QBase, Inc.
-    Meridio and Autonomy are trademarks of Hewlett Packard, Inc.
-    Alfresco is a trademark of Alfresco Software, Inc.
-    Jira is a trademark of Atlassian, Inc.
-  </trademark-statement>
-
-  <!-- Some skins use this to form a 'breadcrumb trail' of links.
-    Use location="alt" to move the trail to an alternate location
-    (if the skin supports it).
-	  Omit the location attribute to display the trail in the default location.
-	  Use location="none" to not display the trail (if the skin supports it).
-    For some skins just set the attributes to blank.
-  -->
-  <trail>
-    <link1 name="Apache" href="http://www.apache.org/"/>
-    <link2 name="ManifoldCF" href="http://manifoldcf.apache.org"/>
-    <link3 name="Release Documentation" href=""/>
-  </trail>
-
-  <!-- Configure the TOC, i.e. the Table of Contents.
-  @max-depth
-   how many "section" levels need to be included in the
-   generated Table of Contents (TOC). 
-  @min-sections
-   Minimum required to create a TOC.
-  @location ("page","menu","page,menu", "none")
-   Where to show the TOC.
-  -->
-  <toc max-depth="2" min-sections="1" location="page"/>
-
-  <!-- Heading types can be clean|underlined|boxed  -->
-  <headings type="clean"/>
-  
-  <!-- The optional feedback element will be used to construct a
-    feedback link in the footer with the page pathname appended:
-    <a href="@href">{@to}</a>
-  <feedback to="webmaster@foo.com"
-    href="mailto:webmaster@foo.com?subject=Feedback&#160;" >
-    Send feedback about the website to:
-  </feedback>
-    -->
-  <!--
-    extra-css - here you can define custom css-elements that are 
-    a. overriding the fallback elements or 
-    b. adding the css definition from new elements that you may have 
-       used in your documentation.
-    -->
-  <extra-css>
-    <!--Example of b. 
-        To define the css definition of a new element that you may have used
-        in the class attribute of a <p> node. 
-        e.g. <p class="quote"/>
-    -->
-    p.quote {
-      margin-left: 2em;
-      padding: .5em;
-      background-color: #f0f0f0;
-      font-family: monospace;
-    }
-    img.float-right {
-      float: right;
-      margin-left: 2em;
-      padding: .5em;
-    }
-    <!-- avoid using white links in the footer  -->
-    #footer a:visited { color:black }
-    #footer a:hover { color:black }
-    #footer a { color:black }
-  </extra-css>
-
-  <colors>
-  <!-- These values are used for the generated CSS files. -->
-
-  <!-- Krysalis -->
-<!--
-    <color name="header"    value="#FFFFFF"/>
-
-    <color name="tab-selected" value="#a5b6c6" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="tab-unselected" value="#F7F7F7"  link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-selected" value="#a5b6c6"  link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-unselected" value="#a5b6c6"  link="#000000" vlink="#000000" hlink="#000000"/>
-
-    <color name="heading" value="#a5b6c6"/>
-    <color name="subheading" value="#CFDCED"/>
-        
-    <color name="navstrip" value="#CFDCED" font="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="toolbox" value="#a5b6c6"/>
-    <color name="border" value="#a5b6c6"/>
-        
-    <color name="menu" value="#F7F7F7" link="#000000" vlink="#000000" hlink="#000000"/>    
-    <color name="dialog" value="#F7F7F7"/>
-            
-    <color name="body"    value="#ffffff" link="#0F3660" vlink="#009999" hlink="#000066"/>
-    
-    <color name="table" value="#a5b6c6"/>    
-    <color name="table-cell" value="#ffffff"/>    
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#a5b6c6"/>
-        
-    <color name="footer" value="#a5b6c6"/>
--->
-  
-  <!-- Forrest -->
-<!--
-    <color name="header"    value="#294563"/>
-
-    <color name="tab-selected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="tab-unselected" value="#b5c7e7" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="subtab-selected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="subtab-unselected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-
-    <color name="heading" value="#294563"/>
-    <color name="subheading" value="#4a6d8c"/>
-        
-    <color name="navstrip" value="#cedfef" font="#0F3660" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="toolbox" value="#4a6d8c"/>
-    <color name="border" value="#294563"/>
-    
-    <color name="menu" value="#4a6d8c" font="#cedfef" link="#ffffff" vlink="#ffffff" hlink="#ffcf00"/>    
-    <color name="dialog" value="#4a6d8c"/>
-            
-    <color name="body" value="#ffffff"  link="#0F3660" vlink="#009999" hlink="#000066"/>
-    
-    <color name="table" value="#7099C5"/>    
-    <color name="table-cell" value="#f0f0ff"/>    
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#CFDCED"/>
-        
-    <color name="footer" value="#cedfef"/>
--->
-
-  <!-- Collabnet --> 
-<!--
-    <color name="header"    value="#003366"/>
-
-    <color name="tab-selected" value="#dddddd" link="#555555" vlink="#555555" hlink="#555555"/>
-    <color name="tab-unselected" value="#999999" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-    <color name="subtab-selected" value="#cccccc" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-unselected" value="#cccccc" link="#555555" vlink="#555555" hlink="#555555"/>
-
-    <color name="heading" value="#003366"/>
-    <color name="subheading" value="#888888"/>
-    
-    <color name="navstrip" value="#dddddd" font="#555555"/>
-    <color name="toolbox" value="#dddddd" font="#555555"/>
-    <color name="border" value="#999999"/>
-    
-    <color name="menu" value="#ffffff"/>    
-    <color name="dialog" value="#eeeeee"/>
-            
-    <color name="body"      value="#ffffff"/>
-    
-    <color name="table" value="#ccc"/>    
-    <color name="table-cell" value="#ffffff"/>   
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#003366"/>
-        
-    <color name="footer" value="#ffffff"/>
--->
- <!-- Lenya using pelt-->
-<!--
-    <color name="header" value="#ffffff"/>
-
-    <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-    <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-selected" value="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-
-    <color name="heading" value="#E5E4D9"/>
-    <color name="subheading" value="#000000"/>
-    <color name="published" value="#4C6C8F" font="#FFFFFF"/>
-    <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
-    <color name="navstrip" value="#E5E4D9" font="#000000"/>
-
-    <color name="toolbox" value="#CFDCED" font="#000000"/>
-
-    <color name="border" value="#999999"/>
-    <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff" current="#FFCC33" />    
-    <color name="menuheading" value="#cfdced" font="#000000" />
-    <color name="searchbox" value="#E5E4D9" font="#000000"/>
-    
-    <color name="dialog" value="#CFDCED"/>
-    <color name="body" value="#ffffff" />            
-    
-    <color name="table" value="#ccc"/>    
-    <color name="table-cell" value="#ffffff"/>   
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#003366"/>
-        
-    <color name="footer" value="#E5E4D9"/>
--->
-  </colors>
- 
-  <!-- Settings specific to PDF output. -->
-  <pdf>
-    <!-- 
-       Supported page sizes are a0, a1, a2, a3, a4, a5, executive,
-       folio, legal, ledger, letter, quarto, tabloid (default letter).
-       Supported page orientations are portrait, landscape (default
-       portrait).
-       Supported text alignments are left, right, justify (default left).
-    -->
-    <page size="letter" orientation="portrait" text-align="left"/>
-
-    <!--
-       Margins can be specified for top, bottom, inner, and outer
-       edges. If double-sided="false", the inner edge is always left
-       and the outer is always right. If double-sided="true", the
-       inner edge will be left on odd pages, right on even pages,
-       the outer edge vice versa.
-       Specified below are the default settings.
-    -->
-    <margins double-sided="false">
-      <top>1in</top>
-      <bottom>1in</bottom>
-      <inner>1.25in</inner>
-      <outer>1in</outer>
-    </margins>
-
-    <!--
-      Print the URL text next to all links going outside the file
-    -->
-    <show-external-urls>false</show-external-urls>
-
-    <!--
-      Disable the copyright footer on each page of the PDF.
-      A footer is composed for each page. By default, a "credit" with role=pdf
-      will be used, as explained below. Otherwise a copyright statement
-      will be generated. This latter can be disabled.
-    -->
-    <disable-copyright-footer>false</disable-copyright-footer>
-  </pdf>
-
-  <!-- Credits are typically rendered as a set of small clickable
-    images in the page footer.
-    Use box-location="alt" to move the credit to an alternate location
-    (if the skin supports it). 
-  -->
-  <credits>
-    <credit box-location="alt">
-      <name>Built with Apache Forrest</name>
-      <url>http://forrest.apache.org/</url>
-      <image>images/built-with-forrest-button.png</image>
-      <width>88</width>
-      <height>31</height>
-    </credit>
-    <!-- A credit with @role="pdf" will be used to compose a footer
-     for each page in the PDF, using either "name" or "url" or both.
-    -->
-    <!--
-    <credit role="pdf">
-      <name>Built with Apache Forrest</name>
-      <url>http://forrest.apache.org/</url>
-    </credit>
-    -->
-  </credits>
-
-</skinconfig>
diff --git a/site/src/documentation/README.txt b/src/documentation/README.txt
similarity index 100%
rename from site/src/documentation/README.txt
rename to src/documentation/README.txt
diff --git a/site/src/documentation/classes/CatalogManager.properties b/src/documentation/classes/CatalogManager.properties
similarity index 100%
rename from site/src/documentation/classes/CatalogManager.properties
rename to src/documentation/classes/CatalogManager.properties
diff --git a/src/documentation/conf/cli.xconf b/src/documentation/conf/cli.xconf
new file mode 100644
index 0000000..8f23a5e
--- /dev/null
+++ b/src/documentation/conf/cli.xconf
@@ -0,0 +1,325 @@
+<?xml version="1.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.
+-->
+<!--+
+    |  This is the Apache Cocoon command line configuration file.
+    |  Here you give the command line interface details of where
+    |  to find various aspects of your Cocoon installation.
+    |
+    |  If you wish, you can also use this file to specify the URIs
+    |  that you wish to generate.
+    |
+    |  The current configuration information in this file is for
+    |  building the Cocoon documentation. Therefore, all links here
+    |  are relative to the build context dir, which, in the build.xml
+    |  file, is set to ${build.context}
+    |
+    |  Options:
+    |    verbose:            increase amount of information presented
+    |                        to standard output (default: false)
+    |    follow-links:       whether linked pages should also be
+    |                        generated (default: true)
+    |    precompile-only:    precompile sitemaps and XSP pages, but
+    |                        do not generate any pages (default: false)
+    |    confirm-extensions: check the mime type for the generated page
+    |                        and adjust filename and links extensions
+    |                        to match the mime type
+    |                        (e.g. text/html->.html)
+    |
+    |  Note: Whilst using an xconf file to configure the Cocoon
+    |        Command Line gives access to more features, the use of
+    |        command line parameters is more stable, as there are
+    |        currently plans to improve the xconf format to allow
+    |        greater flexibility. If you require a stable and
+    |        consistent method for accessing the CLI, it is recommended
+    |        that you use the command line parameters to configure
+    |        the CLI. See documentation at:
+    |        http://cocoon.apache.org/2.1/userdocs/offline/
+    |        http://wiki.apache.org/cocoon/CommandLine
+    |
+    +-->
+
+<cocoon verbose="true"
+        follow-links="true"
+        precompile-only="false"
+        confirm-extensions="false">
+
+   <!--+
+       |  The context directory is usually the webapp directory
+       |  containing the sitemap.xmap file.
+       |
+       |  The config file is the cocoon.xconf file.
+       |
+       |  The work directory is used by Cocoon to store temporary
+       |  files and cache files.
+       |
+       |  The destination directory is where generated pages will
+       |  be written (assuming the 'simple' mapper is used, see
+       |  below)
+       +-->
+   <context-dir>.</context-dir>
+   <config-file>WEB-INF/cocoon.xconf</config-file>
+   <work-dir>../tmp/cocoon-work</work-dir>
+   <dest-dir>../site</dest-dir>
+
+   <!--+
+       |  A checksum file can be used to store checksums for pages
+       |  as they are generated. When the site is next generated,
+       |  files will not be written if their checksum has not changed.
+       |  This means that it will be easier to detect which files
+       |  need to be uploaded to a server, using the timestamp.
+       |
+       |  The default path is relative to the core webapp directory.
+       |  An asolute path can be used.
+       +-->
+   <!--   <checksums-uri>build/work/checksums</checksums-uri>-->
+
+   <!--+
+       | Broken link reporting options:
+       |   Report into a text file, one link per line:
+       |     <broken-links type="text" report="filename"/>
+       |   Report into an XML file:
+       |     <broken-links type="xml" report="filename"/>
+       |   Ignore broken links (default):
+       |     <broken-links type="none"/>
+       |
+       |   Two attributes to this node specify whether a page should
+       |   be generated when an error has occured. 'generate' specifies
+       |   whether a page should be generated (default: true) and
+       |   extension specifies an extension that should be appended
+       |   to the generated page's filename (default: none)
+       |
+       |   Using this, a quick scan through the destination directory
+       |   will show broken links, by their filename extension.
+       +-->
+   <broken-links type="xml"
+                 file="../brokenlinks.xml"
+                 generate="false"
+                 extension=".error"
+                 show-referrers="true"/>
+
+   <!--+
+       |  Load classes at startup. This is necessary for generating
+       |  from sites that use SQL databases and JDBC.
+       |  The <load-class> element can be repeated if multiple classes
+       |  are needed.
+       +-->
+   <!--
+   <load-class>org.firebirdsql.jdbc.Driver</load-class>
+   -->
+
+   <!--+
+       |  Configures logging.
+       |  The 'log-kit' parameter specifies the location of the log kit
+       |  configuration file (usually called logkit.xconf.
+       |
+       |  Logger specifies the logging category (for all logging prior
+       |  to other Cocoon logging categories taking over)
+       |
+       |  Available log levels are:
+       |    DEBUG:        prints all level of log messages.
+       |    INFO:         prints all level of log messages except DEBUG
+       |                  ones.
+       |    WARN:         prints all level of log messages except DEBUG
+       |                  and INFO ones.
+       |    ERROR:        prints all level of log messages except DEBUG,
+       |                  INFO and WARN ones.
+       |    FATAL_ERROR:  prints only log messages of this level
+       +-->
+   <!-- <logging log-kit="WEB-INF/logkit.xconf" logger="cli" level="ERROR" /> -->
+
+   <!--+
+       |  Specifies the filename to be appended to URIs that
+       |  refer to a directory (i.e. end with a forward slash).
+       +-->
+   <default-filename>index.html</default-filename>
+
+   <!--+
+       |  Specifies a user agent string to the sitemap when
+       |  generating the site.
+       |
+       |  A generic term for a web browser is "user agent". Any
+       |  user agent, when connecting to a web server, will provide
+       |  a string to identify itself (e.g. as Internet Explorer or
+       |  Mozilla). It is possible to have Cocoon serve different
+       |  content depending upon the user agent string provided by
+       |  the browser. If your site does this, then you may want to
+       |  use this <user-agent> entry to provide a 'fake' user agent
+       |  to Cocoon, so that it generates the correct version of your
+       |  site.
+       |
+       |  For most sites, this can be ignored.
+       +-->
+   <!--
+   <user-agent>Cocoon Command Line Environment 2.1</user-agent>
+   -->
+
+   <!--+
+       |  Specifies an accept string to the sitemap when generating
+       |  the site.
+       |  User agents can specify to an HTTP server what types of content
+       |  (by mime-type) they are able to receive. E.g. a browser may be
+       |  able to handle jpegs, but not pngs. The HTTP accept header
+       |  allows the server to take the browser's capabilities into account,
+       |  and only send back content that it can handle.
+       |
+       |  For most sites, this can be ignored.
+       +-->
+
+   <accept>*/*</accept>
+
+   <!--+
+       | Specifies which URIs should be included or excluded, according
+       | to wildcard patterns.
+       |
+       | These includes/excludes are only relevant when you are following
+       | links. A link URI must match an include pattern (if one is given)
+       | and not match an exclude pattern, if it is to be followed by
+       | Cocoon. It can be useful, for example, where there are links in
+       | your site to pages that are not generated by Cocoon, such as
+       | references to api-documentation.
+       |
+       | By default, all URIs are included. If both include and exclude
+       | patterns are specified, a URI is first checked against the
+       | include patterns, and then against the exclude patterns.
+       |
+       | Multiple patterns can be given, using muliple include or exclude
+       | nodes.
+       |
+       | The order of the elements is not significant, as only the first
+       | successful match of each category is used.
+       |
+       | Currently, only the complete source URI can be matched (including
+       | any URI prefix). Future plans include destination URI matching
+       | and regexp matching. If you have requirements for these, contact
+       | dev@cocoon.apache.org.
+       +-->
+
+   <exclude pattern="**/"/>
+   <exclude pattern="**apidocs**"/>
+   <exclude pattern="release/**"/>
+
+<!--
+  This is a workaround for FOR-284 "link rewriting broken when
+  linking to xml source views which contain site: links".
+  See the explanation there and in declare-broken-site-links.xsl
+-->
+   <exclude pattern="site:**"/>
+   <exclude pattern="ext:**"/>
+   <exclude pattern="lm:**"/>
+   <exclude pattern="**/site:**"/>
+   <exclude pattern="**/ext:**"/>
+   <exclude pattern="**/lm:**"/>
+
+   <!-- Exclude tokens used in URLs to ASF mirrors (interpreted by a CGI) -->
+   <exclude pattern="[preferred]/**"/>
+   <exclude pattern="[location]"/>
+
+   <!--   <include-links extension=".html"/>-->
+
+   <!--+
+       |  <uri> nodes specify the URIs that should be generated, and
+       |  where required, what should be done with the generated pages.
+       |  They describe the way the URI of the generated file is created
+       |  from the source page's URI. There are three ways that a generated
+       |  file URI can be created: append, replace and insert.
+       |
+       |  The "type" attribute specifies one of (append|replace|insert):
+       |
+       |  append:
+       |  Append the generated page's URI to the end of the source URI:
+       |
+       |   <uri type="append" src-prefix="documents/" src="index.html"
+       |   dest="build/dest/"/>
+       |
+       |  This means that
+       |   (1) the "documents/index.html" page is generated
+       |   (2) the file will be written to "build/dest/documents/index.html"
+       |
+       |  replace:
+       |  Completely ignore the generated page's URI - just
+       |  use the destination URI:
+       |
+       |   <uri type="replace" src-prefix="documents/" src="index.html"
+       |   dest="build/dest/docs.html"/>
+       |
+       |  This means that
+       |   (1) the "documents/index.html" page is generated
+       |   (2) the result is written to "build/dest/docs.html"
+       |   (3) this works only for "single" pages - and not when links
+       |       are followed
+       |
+       |  insert:
+       |  Insert generated page's URI into the destination
+       |  URI at the point marked with a * (example uses fictional
+       |  zip protocol)
+       |
+       |   <uri type="insert" src-prefix="documents/" src="index.html"
+       |   dest="zip://*.zip/page.html"/>
+       |
+       |  This means that
+       |   (1)
+       |
+       |  In any of these scenarios, if the dest attribute is omitted,
+       |  the value provided globally using the <dest-dir> node will
+       |  be used instead.
+       +-->
+   <!--
+   <uri type="replace"
+        src-prefix="samples/"
+        src="hello-world/hello.html"
+        dest="build/dest/hello-world.html"/>
+   -->
+
+   <!--+
+       | <uri> nodes can be grouped together in a <uris> node. This
+       | enables a group of URIs to share properties. The following
+       | properties can be set for a group of URIs:
+       |   * follow-links:       should pages be crawled for links
+       |   * confirm-extensions: should file extensions be checked
+       |                         for the correct mime type
+       |   * src-prefix:         all source URIs should be
+       |                         pre-pended with this prefix before
+       |                         generation. The prefix is not
+       |                         included when calculating the
+       |                         destination URI
+       |   * dest:               the base destination URI to be
+       |                         shared by all pages in this group
+       |   * type:               the method to be used to calculate
+       |                         the destination URI. See above
+       |                         section on <uri> node for details.
+       |
+       | Each <uris> node can have a name attribute. When a name
+       | attribute has been specified, the -n switch on the command
+       | line can be used to tell Cocoon to only process the URIs
+       | within this URI group. When no -n switch is given, all
+       | <uris> nodes are processed. Thus, one xconf file can be
+       | used to manage multiple sites.
+       +-->
+   <!--
+   <uris name="mirrors" follow-links="false">
+     <uri type="append" src="mirrors.html"/>
+   </uris>
+   -->
+
+   <!--+
+       |  File containing URIs (plain text, one per line).
+       +-->
+   <!--
+   <uri-file>uris.txt</uri-file>
+   -->
+</cocoon>
diff --git a/src/documentation/content/xdocs/en_US/books-and-presentations.xml b/src/documentation/content/xdocs/en_US/books-and-presentations.xml
new file mode 100644
index 0000000..751d471
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/books-and-presentations.xml
@@ -0,0 +1,51 @@
+<?xml version="1.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.
+-->
+
+<document>
+    <header>
+        <title>ManifoldCF - Books and Presentations</title>
+    </header>
+    <body>
+  <section id="books"><title>ManifoldCF Books</title>
+    <p>All the books about the ManifoldCF project.</p>
+    <ul>
+      <li><a href="https://github.com/DaddyWri/manifoldcfinaction/tree/master/pdfs" target="_blank">Updated ManifoldCF in Action chapters, revised PDFs</a></li>
+    </ul>
+  </section>
+  <section id="presentations"><title>ManifoldCF Presentations</title>
+    <p>Some presentations about the ManifoldCF project.</p>
+    <ul>
+      <li><a href="http://www.slideshare.net/lucenerevolution/wright-nokia-manifoldcfeurocon-2011" target="_blank">Securing Documents in Solr with ManifoldCF by Karl Wright</a></li>
+      <li><a href="http://www.slideshare.net/PiergiorgioLucidi/apache-manifoldcf-9508286" target="_blank">Apache ManifoldCF by Piergiorgio Lucidi</a></li>
+      <li><a href="http://www.slideshare.net/ShinichiroAbe/apache-manifoldcf-9231499" target="_blank">Apache ManifoldCF by Shinichiro Abe</a></li>
+      <li><a href="http://www.open4dev.com/journal/2013/11/9/my-two-talks-at-alfresco-summit-2013-in-barcelona.html" target="_blank">Barcelona presentations by Piergiorgio Lucidi</a></li>
+      <li><a href="http://summit.alfresco.com/barcelona/sessions/super-size-your-search" target="_blank">Alfresco Summit presentation by Piergiorgio Lucidi</a></li>
+      <li><a href="https://feathercast.apache.org/2017/10/30/oss-prague-apache-manifoldcf-and-incubation-piergiorgio-lucidi/" target="_blank">Open Source Summit presentation by Piergiorgio Lucidi</a></li>
+    </ul>
+  </section>
+  <section id="podcasts"><title>ManifoldCF Videos/Podcasts</title>
+    <p>All the videos/podcasts about the ManifoldCF project.</p>
+    <ul>
+      <li><a title="Teach Me To Code - Karl Wright - ManifoldCF" href="http://teachmetocode.com/podcast/077-tmtc-karl-wright-manifoldcf/" target="_blank">077 TMTC Karl Wright - ManifoldCF</a> (ApacheCON North America, 2011)</li>
+      <li><a title="Securing Documents in Solr with ManifoldCF by Karl Wright" href="http://vimeo.com/33082485" target="_blank">Lucene Revolutions Eurocon 2011 - Karl Wright - ManifoldCF</a> (Lucene Revolutions Eurocon, 2011)</li>
+      <li><a title="WAT" href="https://www.destroyallsoftware.com/talks/wat" target="_blank">WAT Lightning Talk</a> (Gary Bernhardt, CodeMash 2012)</li>
+    </ul>
+  </section>
+    </body>
+</document>
\ No newline at end of file
diff --git a/src/documentation/content/xdocs/en_US/developer-resources.xml b/src/documentation/content/xdocs/en_US/developer-resources.xml
new file mode 100644
index 0000000..c6bfdeb
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/developer-resources.xml
@@ -0,0 +1,68 @@
+<?xml version="1.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.
+-->
+
+<document>
+<header><title>ManifoldCF - Developer Resources</title></header>
+<properties>
+</properties>
+<body>
+
+    <section id="source">
+	<title>Source Code</title>
+	<p>The source files are stored using Subversion (see <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a> and 
+              <a href="http://svnbook.red-bean.com/">http://svnbook.red-bean.com/</a>)</p>
+	<p>
+	    <code>svn checkout http://svn.apache.org/repos/asf/manifoldcf/trunk mcf-trunk</code>
+	</p>
+	<p>A read-only Git hub is also available for those who use Git.   The URL for Git is:</p>
+	<p>
+	    <code>git://git.apache.org/manifoldcf.git</code>
+	</p>
+    </section>
+
+    <section id="debugging">
+	<title>Debugging Connections</title>
+	<p>Sooner or later, you will encounter a repository that should be supported, but doesn't seem to want to connect properly to ManifoldCF.  When that happens, you will need all the help you
+	    can get.  Start <a href="https://cwiki.apache.org/confluence/display/CONNECTORS/Debugging+Connections">here</a>, and if you find a new hint, technique,
+	    or trick, don't forget to add it to the page!</p>
+    </section>
+    
+    <section id="Changes">
+	<title>Changes List</title>
+	<p>Current changes list (as of the most recent nightly build) is available 
+	    <a href="http://svn.apache.org/repos/asf/manifoldcf/trunk/CHANGES.txt">here</a>.
+	</p>
+    </section>
+    
+    <section id="Bugs">
+          <title>Reporting a Bug, Problem, or Feature Request</title>
+          <p>If you think you've found a problem, or you just have a good idea for an improvement, you can create a JIRA ticket <a href="https://issues.apache.org/jira/browse/CONNECTORS/">here</a>.  You may need to create yourself an account.
+          </p>
+          <p>Please make every effort to search through the current issues list before creating a new ticket.  Your problem might already have been logged!</p>
+    </section>
+    
+    <section id="Making a Contribution">
+	<title>Making a Contribution</title>
+	<p>ManifoldCF is always looking for contributions.  See the <a href="http://cwiki.apache.org/confluence/display/CONNECTORS/HowToContribute">Wiki</a> for details on contributing. </p>
+	<p>We're also looking for logo ideas.  Here are the <a href="http://cwiki.apache.org/confluence/display/CONNECTORS/Logo+Criteria">guidelines</a>.
+	</p>
+    </section>
+
+</body>
+</document>
diff --git a/src/documentation/content/xdocs/en_US/download.xml b/src/documentation/content/xdocs/en_US/download.xml
new file mode 100644
index 0000000..1a32cbd
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/download.xml
@@ -0,0 +1,1284 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+
+<document> 
+
+  <header> 
+    <title>Download</title> 
+  </header> 
+
+  <body> 
+
+    <section>
+      <title>How to verify releases</title>
+      <p>Verifying ManifoldCF release binaries is easy.  Please read the page <a href="verify.html">here</a>.</p>
+    </section>
+
+    <section>
+      <title>ManifoldCF™</title>
+      
+      <section>
+        <title>Latest 2.x release (Apache ManifoldCF 2.9.1, 2018 Jan 15)</title>
+        <p>
+          <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1.KEYS">KEYS</a><br/>
+          <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>Sources only:<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz">apache-manifoldcf-2.9.1-src.tar.gz</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.sha512">SHA</a>]<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip">apache-manifoldcf-2.9.1-src.zip</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.sha512">SHA</a>]<br/>
+        </p>
+
+        <p>Binary:<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz">apache-manifoldcf-2.9.1-bin.tar.gz</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.sha512">SHA</a>]<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip">apache-manifoldcf-2.9.1-bin.zip</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.sha512">SHA</a>]<br/>
+        </p>
+
+        <p>Library:<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz">apache-manifoldcf-2.9.1-lib.tar.gz</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.sha512">SHA</a>]<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip">apache-manifoldcf-2.9.1-lib.zip</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.sha512">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Latest 1.x release (Apache ManifoldCF 1.10, 2015 Sep 07)</title>
+        <p>
+          <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10.KEYS">KEYS</a><br/>
+          <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>Sources only:<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz">apache-manifoldcf-1.10-src.tar.gz</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip">apache-manifoldcf-1.10-src.zip</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>Binary:<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz">apache-manifoldcf-1.10-bin.tar.gz</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip">apache-manifoldcf-1.10-bin.zip</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>Library:<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz">apache-manifoldcf-1.10-lib.tar.gz</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip">apache-manifoldcf-1.10-lib.zip</a>
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.asc">PGP</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.md5">MD5</a>]
+            [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+
+      <section>
+        <title>Earlier releases</title>
+
+        <section>
+          <title>Apache ManifoldCF 2.8.1, 2017 Sep 07</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz">apache-manifoldcf-2.8.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip">apache-manifoldcf-2.8.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz">apache-manifoldcf-2.8.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip">apache-manifoldcf-2.8.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz">apache-manifoldcf-2.8.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip">apache-manifoldcf-2.8.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.7.1, 2017 May 10</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz">apache-manifoldcf-2.7.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip">apache-manifoldcf-2.7.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz">apache-manifoldcf-2.7.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip">apache-manifoldcf-2.7.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz">apache-manifoldcf-2.7.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip">apache-manifoldcf-2.7.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.6, 2016 Dec 30</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz">apache-manifoldcf-2.6-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip">apache-manifoldcf-2.6-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz">apache-manifoldcf-2.6-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip">apache-manifoldcf-2.6-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz">apache-manifoldcf-2.6-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip">apache-manifoldcf-2.6-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.5, 2016 Aug 18</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz">apache-manifoldcf-2.5-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip">apache-manifoldcf-2.5-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz">apache-manifoldcf-2.5-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip">apache-manifoldcf-2.5-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz">apache-manifoldcf-2.5-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip">apache-manifoldcf-2.5-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.4, 2016 Apr 23</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz">apache-manifoldcf-2.4-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip">apache-manifoldcf-2.4-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz">apache-manifoldcf-2.4-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip">apache-manifoldcf-2.4-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz">apache-manifoldcf-2.4-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip">apache-manifoldcf-2.4-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.3, 2015 Dec 17</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz">apache-manifoldcf-2.3-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip">apache-manifoldcf-2.3-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz">apache-manifoldcf-2.3-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip">apache-manifoldcf-2.3-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz">apache-manifoldcf-2.3-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip">apache-manifoldcf-2.3-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.2, 2015 Aug 31</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz">apache-manifoldcf-2.2-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip">apache-manifoldcf-2.2-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz">apache-manifoldcf-2.2-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip">apache-manifoldcf-2.2-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz">apache-manifoldcf-2.2-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip">apache-manifoldcf-2.2-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.1, 2015 May 04</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz">apache-manifoldcf-2.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip">apache-manifoldcf-2.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz">apache-manifoldcf-2.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip">apache-manifoldcf-2.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz">apache-manifoldcf-2.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip">apache-manifoldcf-2.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.9, 2015 May 03</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz">apache-manifoldcf-1.9-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip">apache-manifoldcf-1.9-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz">apache-manifoldcf-1.9-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip">apache-manifoldcf-1.9-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz">apache-manifoldcf-1.9-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip">apache-manifoldcf-1.9-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 2.0.2, 2015 Mar 02</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz">apache-manifoldcf-2.0.2-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip">apache-manifoldcf-2.0.2-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz">apache-manifoldcf-2.0.2-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip">apache-manifoldcf-2.0.2-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz">apache-manifoldcf-2.0.2-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip">apache-manifoldcf-2.0.2-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.8.2, 2015 Mar 02</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz">apache-manifoldcf-1.8.2-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip">apache-manifoldcf-1.8.2-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz">apache-manifoldcf-1.8.2-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip">apache-manifoldcf-1.8.2-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz">apache-manifoldcf-1.8.2-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip">apache-manifoldcf-1.8.2-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.7.2, 2014 Nov 9</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz">apache-manifoldcf-1.7.2-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip">apache-manifoldcf-1.7.2-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz">apache-manifoldcf-1.7.2-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip">apache-manifoldcf-1.7.2-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz">apache-manifoldcf-1.7.2-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip">apache-manifoldcf-1.7.2-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.6.1, 2014 Jun 01</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz">apache-manifoldcf-1.6.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip">apache-manifoldcf-1.6.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz">apache-manifoldcf-1.6.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip">apache-manifoldcf-1.6.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz">apache-manifoldcf-1.6.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip">apache-manifoldcf-1.6.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.5.1, 2014 Feb 20</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz">apache-manifoldcf-1.5.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip">apache-manifoldcf-1.5.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz">apache-manifoldcf-1.5.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip">apache-manifoldcf-1.5.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz">apache-manifoldcf-1.5.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip">apache-manifoldcf-1.5.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.sha1">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.4.1, 2013 Nov 16</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz">apache-manifoldcf-1.4.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip">apache-manifoldcf-1.4.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz">apache-manifoldcf-1.4.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip">apache-manifoldcf-1.4.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz">apache-manifoldcf-1.4.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip">apache-manifoldcf-1.4.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.sha1">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.3, 2013 Jul 29</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz">apache-manifoldcf-1.3-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip">apache-manifoldcf-1.3-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz">apache-manifoldcf-1.3-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip">apache-manifoldcf-1.3-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz">apache-manifoldcf-1.3-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip">apache-manifoldcf-1.3-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.sha1">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.2, 2013 May 11</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz">apache-manifoldcf-1.2-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip">apache-manifoldcf-1.2-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz">apache-manifoldcf-1.2-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip">apache-manifoldcf-1.2-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz">apache-manifoldcf-1.2-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip">apache-manifoldcf-1.2-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.sha1">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.1.1, 2013 Feb 13</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz">apache-manifoldcf-1.1.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/closer.lua/manifoldcf/apache-manifoldcf-1.1.1-src.zip">apache-manifoldcf-1.1.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz">apache-manifoldcf-1.1.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip">apache-manifoldcf-1.1.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz">apache-manifoldcf-1.1.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip">apache-manifoldcf-1.1.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.sha1">SHA</a>]<br/>
+          </p>
+        </section>
+
+        <section>
+          <title>Apache ManifoldCF 1.0.1, 2012 Oct 18</title>
+          <p>
+            <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1.KEYS">KEYS</a><br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz">apache-manifoldcf-1.0.1-src.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip">apache-manifoldcf-1.0.1-src.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz">apache-manifoldcf-1.0.1-bin.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip">apache-manifoldcf-1.0.1-bin.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.sha1">SHA</a>]<br/>
+          </p>
+
+          <p>Library:<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz">apache-manifoldcf-1.0.1-lib.tar.gz</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.sha1">SHA</a>]<br/>
+            <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip">apache-manifoldcf-1.0.1-lib.zip</a>
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.asc">PGP</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.md5">MD5</a>]
+              [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.sha1">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+    </section>
+    
+    <section>
+      <title>Plug-ins</title>
+      
+      <section>
+        <title>Plugin for Apache Solr 3.x</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Apache Solr 3.x , version 2.2, 2015 Jul 25)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.tar.gz">apache-manifoldcf-solr-3.x-plugin-2.2-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.zip">apache-manifoldcf-solr-3.x-plugin-2.2-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.tar.gz">apache-manifoldcf-solr-3.x-plugin-2.2-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.zip">apache-manifoldcf-solr-3.x-plugin-2.2-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-3.x-plugin-2.2/apache-manifoldcf-solr-3.x-plugin-2.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+      </section>
+      
+      <section>
+        <title>Plugin for Apache Solr 4.x</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Apache Solr 4.x, version 2.2, 2015 Jul 25)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.tar.gz">apache-manifoldcf-solr-4.x-plugin-2.2-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.zip">apache-manifoldcf-solr-4.x-plugin-2.2-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.tar.gz">apache-manifoldcf-solr-4.x-plugin-2.2-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.zip">apache-manifoldcf-solr-4.x-plugin-2.2-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-4.x-plugin-2.2/apache-manifoldcf-solr-4.x-plugin-2.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+      </section>
+
+      <section>
+        <title>Plugin for Apache Solr 5.x</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Apache Solr 5.x, version 2.2, 2015 Jul 25)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.tar.gz">apache-manifoldcf-solr-5.x-plugin-2.2-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.zip">apache-manifoldcf-solr-5.x-plugin-2.2-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.tar.gz">apache-manifoldcf-solr-5.x-plugin-2.2-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.zip">apache-manifoldcf-solr-5.x-plugin-2.2-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-5.x-plugin-2.2/apache-manifoldcf-solr-5.x-plugin-2.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+      </section>
+
+      <section>
+        <title>Plugin for Apache Solr 6.x</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Apache Solr 6.x, version 2.2, 2016 May 13)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.tar.gz">apache-manifoldcf-solr-6.x-plugin-2.2-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.zip">apache-manifoldcf-solr-6.x-plugin-2.2-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.tar.gz">apache-manifoldcf-solr-6.x-plugin-2.2-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.zip">apache-manifoldcf-solr-6.x-plugin-2.2-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-6.x-plugin-2.2/apache-manifoldcf-solr-6.x-plugin-2.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+      </section>
+
+      <section>
+        <title>Plugin for Apache Solr 7.x</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Apache Solr 7.x, version 2.2, 2017 Sep 24)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.tar.gz">apache-manifoldcf-solr-7.x-plugin-2.2-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.tar.gz.sha512">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.zip">apache-manifoldcf-solr-7.x-plugin-2.2-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-src.zip.sha512">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.tar.gz">apache-manifoldcf-solr-7.x-plugin-2.2-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.tar.gz.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.tar.gz.sha512">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.zip">apache-manifoldcf-solr-7.x-plugin-2.2-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.zip.md5">MD5</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-solr-7.x-plugin-2.2/apache-manifoldcf-solr-7.x-plugin-2.2-bin.zip.sha512">SHA</a>]<br/>
+          </p>
+        </section>
+      </section>
+
+      <section>
+        <title>Plugin for SharePoint 2007</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for SharePoint 2007, version 0.5, 2013 Oct 8)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.tar.gz">apache-manifoldcf-sharepoint-2007-plugin-0.5-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.zip">apache-manifoldcf-sharepoint-2007-plugin-0.5-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.tar.gz">apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.zip">apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2007-plugin-0.5/apache-manifoldcf-sharepoint-2007-plugin-0.5-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+      
+      <section>
+        <title>Plugin for SharePoint 2010</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for SharePoint 2010, version 0.4, 2013 Dec 03)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.tar.gz">apache-manifoldcf-sharepoint-2010-plugin-0.4-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.zip">apache-manifoldcf-sharepoint-2010-plugin-0.4-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.tar.gz">apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.zip">apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2010-plugin-0.4/apache-manifoldcf-sharepoint-2010-plugin-0.4-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+
+      <section>
+        <title>Plugin for SharePoint 2013</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for SharePoint 2013, version 0.1, 2014 Jul 28)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.tar.gz">apache-manifoldcf-sharepoint-2013-plugin-0.1-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.zip">apache-manifoldcf-sharepoint-2013-plugin-0.1-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.tar.gz">apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.zip">apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2013-plugin-0.1/apache-manifoldcf-sharepoint-2013-plugin-0.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+
+      <section>
+        <title>Plugin for SharePoint 2016</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for SharePoint 2016, version 0.1, 2017 Apr 5)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.tar.gz">apache-manifoldcf-sharepoint-2016-plugin-0.1-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.zip">apache-manifoldcf-sharepoint-2016-plugin-0.1-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.tar.gz">apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.zip">apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-sharepoint-2016-plugin-0.1/apache-manifoldcf-sharepoint-2016-plugin-0.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+
+      <section>
+        <title>Plugin for Elastic Search 1.5</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Elastic Search 1.5, version 2.0.2, 2015 May 21)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.tar.gz">apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.zip">apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.tar.gz">apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.zip">apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2/apache-manifoldcf-elasticsearch-1.5-plugin-2.0.2-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+
+      <section>
+        <title>Plugin for Elastic Search (toolkit only)</title>
+        <section>
+          <title>Latest release (Apache ManifoldCF Plugin for Elastic Search, version 2.1, 2015 Jul 25)</title>
+          <p>
+            <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1.KEYS">KEYS</a><br/>
+            <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1.CHANGES.txt">CHANGES.txt</a><br/>
+          </p>
+
+          <p>Sources only:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.tar.gz">apache-manifoldcf-elasticsearch-plugin-2.1-src.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.zip">apache-manifoldcf-elasticsearch-plugin-2.1-src.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-src.zip.sha">SHA</a>]<br/>
+          </p>
+
+          <p>Binary:<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.tar.gz">apache-manifoldcf-elasticsearch-plugin-2.1-bin.tar.gz</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.tar.gz.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.tar.gz.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.tar.gz.sha">SHA</a>]<br/>
+            <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.zip">apache-manifoldcf-elasticsearch-plugin-2.1-bin.zip</a>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.zip.asc">PGP</a>]
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.zip.md5">MD5</a>]<br/>
+              [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-elasticsearch-plugin-2.1/apache-manifoldcf-elasticsearch-plugin-2.1-bin.zip.sha">SHA</a>]<br/>
+          </p>
+        </section>
+
+      </section>
+
+    </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/en_US/index.xml b/src/documentation/content/xdocs/en_US/index.xml
new file mode 100644
index 0000000..725c9cd
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/index.xml
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>Welcome to Apache ManifoldCF™!</title> 
+  </header> 
+
+  <body> 
+    <section>
+	<title>What Is Apache ManifoldCF?</title>
+	<p>Apache ManifoldCF is an effort to provide an open source framework for connecting source content repositories like Microsoft Sharepoint
+            and EMC Documentum, to target repositories or indexes, such as Apache Solr, Open Search Server, or ElasticSearch.  Apache ManifoldCF also
+            defines a security model for target repositories that permits them to enforce source-repository security policies.</p>
+	<p>Currently included connectors support FileNet P8 (IBM), Documentum (EMC), LiveLink (OpenText), Meridio (Autonomy), Windows shares
+            (Microsoft), and SharePoint (Microsoft).  Also included are a general CMIS connector, a generic file system connector, a general JDBC
+            connector, an RSS feed connector, a Wiki connector, a DropBox connector, an email connector, and a general web connector.
+            Currently supported targets include Apache Solr, QBase (formerly MetaCarta) GTS , OpenSearchServer and ElasticSearch.  The complete repository
+            compatibility list can be found in the release documentation <a href="release-documentation.html">here</a>.</p>
+	<p>The original ManifoldCF code base was granted by MetaCarta, Inc., to the Apache Software Foundation in December 2009.  The MetaCarta effort
+            represented more than five years of successful development and testing in multiple, challenging enterprise environments.</p>
+    </section>
+
+    <section>
+	<title>Project status</title>
+	<p>Apache ManifoldCF 2.9.1 is available!  Download it <a href="download.html">here</a>.</p>
+    </section>
+
+    <section>
+	<title>A philosophical note about third-party repositories</title>
+	<p>Many of the connectors included with ManifoldCF currently require third-party libraries, packages, or other licensed materials in
+            order to be built.  The code for these connectors can be distributed under Apache guidelines because they are conditionally compiled,
+            or compiled against stubs;
+            that is, you as a developer must supply the necessary third-party components before the connector will build.  While we have every
+            intention of trying to reduce the number of affected connectors by means of clean-room development under the auspices of ASF,
+            realistically the current situation will not change in any dramatic way very quickly.  The focus of this group remains primarily on
+            providing solutions.</p>
+    </section>
+
+    <section>
+        <title>News</title>
+          <section>
+              <title>15 Jan 2018 - ManifoldCF 2.9.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>22 Dec 2017 - ManifoldCF 2.9 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>07 Sep 2017 - ManifoldCF 2.8.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>18 Aug 2017 - ManifoldCF 2.8 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>10 May 2017 - ManifoldCF 2.7.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>20 Apr 2017 - ManifoldCF 2.7 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>30 Dec 2016 - ManifoldCF 2.6 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>18 Aug 2016 - ManifoldCF 2.5 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>23 Apr 2016 - ManifoldCF 2.4 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>17 Dec 2015 - ManifoldCF 2.3 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>07 Sep 2015 - ManifoldCF 1.10 is released!</title>
+                <p>Developer community signs off on last planned backwards-compatible 1.x release.</p>
+          </section>
+          <section>
+              <title>31 Aug 2015 - ManifoldCF 2.2 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>04 May 2015 - ManifoldCF 2.1 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>03 May 2015 - ManifoldCF 1.9 is released!</title>
+                <p>Developer community signs off on next backwards-compatible 1.x release.</p>
+          </section>
+          <section>
+              <title>02 Mar 2015 - ManifoldCF 2.0.2 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>02 Mar 2015 - ManifoldCF 1.8.2 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>03 Feb 2015 - ManifoldCF 2.0.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>03 Feb 2015 - ManifoldCF 1.8.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>26 Dec 2014 - ManifoldCF 2.0 is released!</title>
+                <p>Developer community signs off on second generation ManifoldCF release.</p>
+          </section>
+          <section>
+              <title>26 Dec 2014 - ManifoldCF 1.8 is released!</title>
+                <p>Developer community signs off on next backwards-compatible 1.x release.</p>
+          </section>
+          <section>
+              <title>09 Nov 2014 - ManifoldCF 1.7.2 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>22 Sep 2014 - ManifoldCF 1.7.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>24 Aug 2014 - ManifoldCF 1.7 is released!</title>
+                <p>Developer community signs off on release 1.7.</p>
+          </section>
+          <section>
+              <title>01 Jun 2014 - ManifoldCF 1.6.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>30 Apr 2014 - ManifoldCF 1.6 is released!</title>
+                <p>Developer community signs off on release 1.6.  This release includes a revised build system, upgrades to newest versions of
+		HttpClient and other libraries, and significant bug fixes.</p>
+          </section>
+          <section>
+              <title>20 Feb 2014 - ManifoldCF 1.5.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>07 Feb 2014 - ManifoldCF 1.5 is released!</title>
+                <p>Developer community signs off on release 1.5.  This is a major release, with significant new capabilities in both the platform and the connectors,
+                  including federated authority support, multiple authorization domains, Apache ZooKeeper process coordination, multiple agents processes,
+                  support for SharePoint Claims-based authorization, an email connector, and a revamped look-and-feel.</p>
+          </section>
+          <section>
+              <title>16 Nov 2013 - ManifoldCF 1.4.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>28 Oct 2013 - ManifoldCF 1.4 is released!</title>
+                <p>Developer community signs off on release 1.4.</p>
+          </section>
+          <section>
+              <title>29 Jul 2013 - ManifoldCF 1.3 is released!</title>
+                <p>Developer community signs off on release 1.3.</p>
+          </section>
+          <section>
+              <title>11 May 2013 - ManifoldCF 1.2 is released!</title>
+                <p>Developer community signs off on release 1.2.</p>
+          </section>
+          <section>
+              <title>13 Feb 2013 - ManifoldCF 1.1.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>03 Feb 2013 - ManifoldCF 1.1 is released!</title>
+                <p>Developer community signs off on release 1.1.</p>
+          </section>
+          <section>
+              <title>18 Oct 2012 - ManifoldCF 1.0.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>03 Oct 2012 - ManifoldCF 1.0 is released!</title>
+                <p>Developer community signs off on release 1.0.</p>
+          </section>
+          <section>
+              <title>13 Jul 2012 - ManifoldCF 0.6 is released!</title>
+                <p>Developer community signs off on sixth release.</p>
+          </section>
+          <section>
+              <title>22 May 2012 - ManifoldCF 0.5.1 is released!</title>
+                <p>Developer community signs off on point bugfix release.</p>
+          </section>
+          <section>
+              <title>16 May 2012 - ManifoldCF graduates from Apache Incubator!</title>
+                  <p>Apache Board signs off on creation of ManifoldCF as a Top Level Project.</p>
+          </section>
+          <section>
+              <title>15 Apr 2012 - ManifoldCF 0.5-incubating is released!</title>
+                <p>Developer community and Apache Incubator sign off on fifth release:</p>
+                <p>Some of the new features of this release:</p>
+                <ul>
+                  <li>Apache Velocity support for connector UI templates</li>
+                  <li>ElasticSearch Output Connector</li>
+                  <li>CMIS Connector upgraded to CMIS 0.6.0</li>
+                  <li>Support for MySQL database</li>
+                  <li>Prebuilt connector support for proprietary connectors - just add jars and go!</li>
+                  <li>Internationalized, with new Japanese localization</li>
+                </ul>
+          </section>
+          <section>
+             <title>02 Feb 2012 - ManifoldCF 0.4-incubating is released!</title>
+                <p>Developer community and Apache Incubator sign off on fourth release.</p>
+          </section>      
+          <section>
+             <title>08 Nov 2011 - ManifoldCF in Vancouver</title>
+                <p>ManifoldCF general talk planned for Apache North America 2011, Vancouver, British Columbia, Canada</p>
+          </section>
+          <section>
+             <title>19 Oct 2011 - ManifoldCF in Barcelona</title>
+                <p>ManifoldCF authorization talk planned for Apache Eurocon 2011, Barcelona, Catalonia, Spain</p>
+          </section>
+          <section>
+             <title>20 Sep 2011 - ManifoldCF 0.3-incubating is released!</title>
+                <p>Developer community and Apache Incubator sign off on third release</p>
+                <p>Some of the new features and improvements of this latest release:</p>
+                <ul>
+                  <li>CMIS Connector</li>
+                  <li>OpenSearchServer Connector</li>
+                  <li>Scripting Language</li>
+                  <li><a href="http://alturl.com/j7gtq">Several bug fixes</a> over the 0.2-incubating release</li>
+                </ul>
+          </section>
+	  <section>
+	     <title>17 May 2011 - ManifoldCF 0.2-incubating is released!</title>
+                <p>Developer community and Apache Incubator sign off on second release</p>
+	  </section>
+	  <section>
+	     <title>31 January 2011 - ManifoldCF 0.1-incubating is released!</title>
+                <p>Developer community and Apache Incubator sign off on first release</p>
+	  </section>
+	  <section>
+	     <title>03 October 2010 - Apache Connectors Framework officially becomes Apache ManifoldCF</title>
+                <p>Developer community approves second name change</p>
+	  </section>
+	  <section>
+	     <title>19 August 2010 - Lucene Connectors Framework officially becomes Apache Connectors Framework</title>
+                <p>Developer community approves name change</p>
+	  </section>
+            <section>
+                <title>07 July 2010 - Lucene Connectors Framework first release proposed</title>
+                <p>Criteria for LCF's first official release proposed</p>
+            </section>
+            <section>
+                <title>21 May 2010 - Lucene Connectors Framework in Prague</title>
+                <p>LCF introductory talk planned for Lucene/Solr Eurocon, Prague, Czech Republic</p>
+            </section>
+            <section>
+                <title>12 January 2010 - Lucene Connectors Framework launches!</title>
+                <p>LCF officially becomes an incubating project of the Apache Software Foundation</p>
+            </section>
+
+    </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/en_US/mail.xml b/src/documentation/content/xdocs/en_US/mail.xml
new file mode 100644
index 0000000..cc8b718
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/mail.xml
@@ -0,0 +1,62 @@
+<?xml version="1.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.
+-->
+
+<document>
+    <header>
+        <title>ManifoldCF - Mailing Lists</title>
+    </header>
+    <body>
+	<section id="ManifoldCF Mailing Lists"><title>ManifoldCF Mailing Lists</title>
+		<p>The ManifoldCF project supports several mailing lists.</p>
+	</section>
+	<section id="user"><title>ManifoldCF User Mailing List</title>
+		<p>User questions on how to use ManifoldCF.</p>
+		<ul>
+			<li><a href="mailto:user-subscribe@manifoldcf.apache.org">Subscribe</a></li>
+			<li><a href="mailto:user-unsubscribe@manifoldcf.apache.org">Unsubscribe</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-user/">Archive</a></li>
+		</ul>
+	</section>
+	<section id="dev"><title>ManifoldCF Development Mailing List</title>
+		<p>Discussion on the development of the internals of ManifoldCF.</p>
+		<ul>
+			<li><a href="mailto:dev-subscribe@manifoldcf.apache.org">Subscribe</a></li>
+			<li><a href="mailto:dev-unsubscribe@manifoldcf.apache.org">Unsubscribe</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-dev/">Archive</a></li>
+		</ul>
+	</section>
+	<section id="commits"><title>ManifoldCF Commits Mailing List</title>
+		<p>Commit messages</p>
+		<ul>
+			<li><a href="mailto:commits-subscribe@manifoldcf.apache.org">Subscribe</a></li>
+			<li><a href="mailto:commits-unsubscribe@manifoldcf.apache.org">Unsubscribe</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-commits/">Archive</a></li>
+		</ul>
+	</section>
+		
+	<section id="archives"><title>ManifoldCF Email Archives</title>
+		<p>Emails sent to the group distributions are archived and accessible via the links below.</p>
+		<ul>
+			<li><a href="http://www.mail-archive.com/dev@manifoldcf.apache.org/index.html">dev@incubator.apache.org</a></li>
+			<li><a href="http://www.mail-archive.com/user@manifoldcf.apache.org/index.html">user@incubator.apache.org</a></li>
+		</ul>
+	</section>
+
+    </body>
+</document>
diff --git a/src/documentation/content/xdocs/en_US/release-documentation.xml b/src/documentation/content/xdocs/en_US/release-documentation.xml
new file mode 100644
index 0000000..53192cf
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/release-documentation.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>ManifoldCF Release Documentation</title> 
+  </header> 
+
+  <body> 
+    <section>
+      <title>ManifoldCF Release Documentation</title>
+      <p></p>
+      <p>The release documentation for the following ManifoldCF versions is available for your review:</p>
+      <!--p><a href="../release/trunk/en_US/index.html">Trunk (currently under development)</a></p-->
+      <p><a href="../release/release-2.9.1/en_US/index.html">Release 2.9.1</a></p>
+      <p><a href="../release/release-2.8.1/en_US/index.html">Release 2.8.1</a></p>
+      <p><a href="../release/release-1.10/en_US/index.html">Release 1.10</a></p>
+    </section>
+  </body>
+</document>
diff --git a/src/documentation/content/xdocs/en_US/security.xml b/src/documentation/content/xdocs/en_US/security.xml
new file mode 100644
index 0000000..d1a8494
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/security.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>ManifoldCF Document Security</title> 
+  </header> 
+
+  <body> 
+
+      <section>
+        <title>Document Security Issues</title>
+        <section>
+            <title>Overview</title>
+            <p>ManifoldCF provides a security model for documents which is typically enforced by the search engine the documents are indexed
+                  with.  Often, this search engine is Apache Lucene, but others may be used either now or in the future.  This page describes
+                  how document security is enforced, and what the limitations are of this technique.</p>
+            <section>
+                <title>How Search Engines Work</title>
+                <p>A standard search engine has one or more <em>indexes</em>, which associate <em>terms</em> with <em>documents</em>.  A
+                    <em>query</em> is issued to the search engine, which uses one or more of the indexes to generate a list of documents.  The
+                    list of documents is then <em>scored</em>, which means that they are given a numeric ranking value based on how closely they
+                    match the query.  The scoring operation typically also makes use of statistic measures, such as how frequently a term appears in
+                    documents in the index.</p>
+            </section>
+            
+            <section>
+                <title>Security Definitions</title>
+                <p>Complete definitions of security usually include elements of <em>confidentiality</em>, <em>integrity</em>, and <em>availability</em>.
+                      Confidentiality has a strict definition, which not only prevents a user from seeing information belonging to another user, but also
+                      prevents a user from even knowing about the existence of information belonging to another user.  Integrity means that a user
+                      can see everything they are allowed to see.  And availability means that information is as available as possible to the user who
+                      is supposed to have access to it.</p>
+
+            </section>
+            
+            <section>
+                <title>How ManifoldCF Applies Security</title>
+                <p>Typically, documents are excluded by what is known as <em>query modification</em>.  This means that the query presented to the
+                      search engine is modified in such a way as to exclude the documents that the user is not supposed to see.  This is typically done
+                      by a ManifoldCF Plugin, which the system integrator must use to apply user-level security.  The query modification is performed
+                      in such a way that it does not affect the relative scoring of documents.</p>
+            </section>
+          </section>
+          
+          <section>
+            <title>Potential Security Issues with ManifoldCF</title>
+            <section>
+                <title>Scoring-based Discovery of Document Keywords</title>
+                <p>One way that confidentiality can be breached in part with a search engine like Lucene relies on the fact that its scoring uses
+                      global document statistics.  It is theoretically possible to determine information about how many documents contain a term, or
+                      whether the number of documents that contain the term changes over time, by submitting queries to the system and examining
+                      the relative ordering of the results.</p>
+                <p>While this technically is a violation of the confidentiality principle, an attacker still cannot see the contents or extracts of
+                      documents that are restricted.  The ability of an unauthorized user to know about the existence of other documents with
+                      certain keywords may or may not be of concern to the system designers, depending on the situation.  But if it <strong>is</strong> a concern,
+                      the right solution is to modify how the search engine does scoring, so that it either does not score documents based on global term
+                      statistics, or perhaps it adjusts scores by a random factor, etc.  There exist papers on this subject, which we encourage
+                      especially security-conscious developers to consult.</p>
+            </section>
+        </section>
+      </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/en_US/verify.xml b/src/documentation/content/xdocs/en_US/verify.xml
new file mode 100644
index 0000000..ddf1421
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/verify.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+
+<document> 
+
+  <header> 
+    <title>Verifying ManifoldCF releases</title> 
+  </header> 
+
+  <body> 
+
+    <section>
+      <title>Tools</title>
+      <p>
+        To verify ManifoldCF releases after version 1.6, you will need OpenPGP, which can be downloaded from
+        <a href="http://www.gnupg.org/download/">here</a>.  
+      </p>
+    </section>
+    
+    <section>
+      <title>Verifying a release</title>
+      
+      <section>
+        <title>Importing the public keys</title>
+        <p>Each release comes with a KEYS file.  Before you can verify the release artifacts, you must import the
+            KEYS file into OpenPGP.</p>
+        <p>Start by downloading the KEYS file for the release to your local machine.  Be sure that you download this
+            file from an Apache server -- not a mirror, or third-party server, but from www.apache.org itself.
+            If you want, you can also verify that the contents of the KEYS file consists only of public keys that have been
+            registered with various key authorities, such as <a href="http://pgp.mit.edu/">MIT's</a>.</p>
+        <p>Next, load the KEYS file into OpenPGP, using a command like this:</p>
+        <p><code>gpg --import KEYS</code></p>
+        <p>Perform the most basic level of verification by downloading the ASC signature file for the artifact, and then
+            running a command such as this (good for both Windows and Unix):</p>
+        <p><code>gpg --verify apache-manifoldcf-X.X.X-src.tar.gz.asc</code></p>
+      </section>
+      
+      <section>
+        <title>Verifying the MD5 signature</title>
+        <p>To verify the MD5 signature of a release, download the artifact and the MD5 signature file for the artifact, and then
+            run a Unix command such as this:</p>
+        <p><code>gpg --print-md MD5 apache-manifoldcf-X.X.X-src.tar.gz | diff - apache-manifoldcf-X.X.X-src.tar.gz.md5</code></p>
+        <p>On Windows:</p>
+        <p>
+          <code>gpg --print-md MD5 apache-manifoldcf-X.X.X-src.tar.gz > capture.md5</code><br/>
+          <code>fc capture.md5 apache-manifoldcf-X.X.X-src.tar.gz.md5</code>
+        </p>
+        <p>No differences will be printed if the signatures agree. If there are differences, then validity of the release cannot be verified.</p>
+      </section>
+
+      <section>
+        <title>Verifying an SHA signature</title>
+        <p>To verify the SHA signature of a release, download the artifact and the SHA signature file for the artifact, and then
+            run a Unix command such as this:</p>
+        <p><code>gpg --print-md SHA512 apache-manifoldcf-X.X.X-src.tar.gz | diff - apache-manifoldcf-X.X.X-src.tar.gz.sha</code></p>
+        <p>On Windows:</p>
+        <p>
+          <code>gpg --print-md SHA512 apache-manifoldcf-X.X.X-src.tar.gz > capture.sha</code><br/>
+          <code>fc capture.sha apache-manifoldcf-X.X.X-src.tar.gz.sha</code>
+        </p>
+        <p>No differences will be printed if the signatures agree. If there are differences, then validity of the release cannot be verified.</p>
+      </section>
+
+    </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/en_US/who.xml b/src/documentation/content/xdocs/en_US/who.xml
new file mode 100644
index 0000000..ac4da71
--- /dev/null
+++ b/src/documentation/content/xdocs/en_US/who.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>Who We Are</title> 
+  </header> 
+
+  <body> 
+
+      <section>
+        <title>Committers</title>
+  
+        <p>
+        (in alphabetical order): 
+        </p>
+  
+        <ul>
+        <li>Shinichiro Abe &lt;shinichiro&gt; </li>
+        <li>Ahmet Arslan &lt;iorixxx&gt; </li>
+        <li>Erlend Gar&aring;sen &lt;ridder&gt; </li>
+        <li>Rafa Haro &lt;rharo&gt; </li>
+        <li>Furkan KAMACI &lt;kamaci&gt; </li>
+	<li>Maciej Lizewski &lt;mlizewski&gt; </li>
+        <li>Piergiorgio Lucidi &lt;piergiorgio&gt; </li>
+        <li>Minoru Osuka &lt;minoru&gt; </li>
+        <li>Graeme Seaton &lt;graemes&gt; </li>
+        <li>Simon Willnauer &lt;simonw&gt; </li>
+        <li>Karl Wright &lt;kwright&gt; </li>
+        <li>Mingchun Zhao &lt;mingchun&gt; </li>
+        <li>Jukka Zitting &lt;jukka&gt; </li>
+        </ul>
+  
+      </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/index.xml b/src/documentation/content/xdocs/index.xml
new file mode 100644
index 0000000..a43855c
--- /dev/null
+++ b/src/documentation/content/xdocs/index.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+  <header>
+    <title>Welcome to the Apache ManifoldCF™ project!</title>
+  </header>
+  <body>
+    <p>Please click the appropriate tab above to see this site in the language of your choice.</p>
+  </body>
+</document>
diff --git a/src/documentation/content/xdocs/ja_JP/books-and-presentations.xml b/src/documentation/content/xdocs/ja_JP/books-and-presentations.xml
new file mode 100644
index 0000000..751d471
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/books-and-presentations.xml
@@ -0,0 +1,51 @@
+<?xml version="1.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.
+-->
+
+<document>
+    <header>
+        <title>ManifoldCF - Books and Presentations</title>
+    </header>
+    <body>
+  <section id="books"><title>ManifoldCF Books</title>
+    <p>All the books about the ManifoldCF project.</p>
+    <ul>
+      <li><a href="https://github.com/DaddyWri/manifoldcfinaction/tree/master/pdfs" target="_blank">Updated ManifoldCF in Action chapters, revised PDFs</a></li>
+    </ul>
+  </section>
+  <section id="presentations"><title>ManifoldCF Presentations</title>
+    <p>Some presentations about the ManifoldCF project.</p>
+    <ul>
+      <li><a href="http://www.slideshare.net/lucenerevolution/wright-nokia-manifoldcfeurocon-2011" target="_blank">Securing Documents in Solr with ManifoldCF by Karl Wright</a></li>
+      <li><a href="http://www.slideshare.net/PiergiorgioLucidi/apache-manifoldcf-9508286" target="_blank">Apache ManifoldCF by Piergiorgio Lucidi</a></li>
+      <li><a href="http://www.slideshare.net/ShinichiroAbe/apache-manifoldcf-9231499" target="_blank">Apache ManifoldCF by Shinichiro Abe</a></li>
+      <li><a href="http://www.open4dev.com/journal/2013/11/9/my-two-talks-at-alfresco-summit-2013-in-barcelona.html" target="_blank">Barcelona presentations by Piergiorgio Lucidi</a></li>
+      <li><a href="http://summit.alfresco.com/barcelona/sessions/super-size-your-search" target="_blank">Alfresco Summit presentation by Piergiorgio Lucidi</a></li>
+      <li><a href="https://feathercast.apache.org/2017/10/30/oss-prague-apache-manifoldcf-and-incubation-piergiorgio-lucidi/" target="_blank">Open Source Summit presentation by Piergiorgio Lucidi</a></li>
+    </ul>
+  </section>
+  <section id="podcasts"><title>ManifoldCF Videos/Podcasts</title>
+    <p>All the videos/podcasts about the ManifoldCF project.</p>
+    <ul>
+      <li><a title="Teach Me To Code - Karl Wright - ManifoldCF" href="http://teachmetocode.com/podcast/077-tmtc-karl-wright-manifoldcf/" target="_blank">077 TMTC Karl Wright - ManifoldCF</a> (ApacheCON North America, 2011)</li>
+      <li><a title="Securing Documents in Solr with ManifoldCF by Karl Wright" href="http://vimeo.com/33082485" target="_blank">Lucene Revolutions Eurocon 2011 - Karl Wright - ManifoldCF</a> (Lucene Revolutions Eurocon, 2011)</li>
+      <li><a title="WAT" href="https://www.destroyallsoftware.com/talks/wat" target="_blank">WAT Lightning Talk</a> (Gary Bernhardt, CodeMash 2012)</li>
+    </ul>
+  </section>
+    </body>
+</document>
\ No newline at end of file
diff --git a/src/documentation/content/xdocs/ja_JP/developer-resources.xml b/src/documentation/content/xdocs/ja_JP/developer-resources.xml
new file mode 100644
index 0000000..c223bd9
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/developer-resources.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ 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.
+-->
+
+<document>
+<header><title>ManifoldCF - 開発者リソース</title></header>
+<properties>
+</properties>
+<body>
+
+    <section id="Source">
+	<title>ソースコード</title>
+	<p>ManifoldCFのソースファイルはsvnで管理されています(参照: <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a> and <a href="http://svnbook.red-bean.com/">http://svnbook.red-bean.com/</a>)
+	</p>
+	<p>
+	    <code>svn checkout http://svn.apache.org/repos/asf/manifoldcf/trunk mcf-trunk</code>
+	</p>
+    </section>
+
+    <section id="Debugging">
+	<title>コネクションのデバグ</title>
+	<p>ManifoldCFを使っていると何かの理由でリポジトリに接続できない場合もあります。このような場合は<a href="https://cwiki.apache.org/confluence/display/CONNECTORS/Debugging+Connections">ここ</a>から始めてください。新しいデバグ方法、ヒントなどを発見した場合は教えてください!</p>
+    </section>
+    
+    <section id="Changes">
+	<title>更新履歴</title>
+	<p>最新の変更履歴は 
+	    <a href="http://svn.apache.org/repos/asf/manifoldcf/trunk/CHANGES.txt">ここ</a>にあります。
+	</p>
+    </section>
+    
+    <section id="Bugs">
+          <title>バグ報告、新機能案</title>
+          <p>問題を発見した場合やよい新機能の案がありましたら<a href="http://issues.apache.org/jira">JIRAのチケット</a>を作成してください。チケットを作成するには先ずアカウントを作成する必要があります。その場合は、「ManifoldCF」プロジェクトを選択してください。
+          </p>
+          <p>ただし新しいチケットを作成する前に既に同様の内容のチケットがあるか確認してください。</p>
+    </section>
+    
+    <section id="Making a Contribution">
+	<title>寄付</title>
+	<p>ManifoldCF is always looking for contributions.  See the <a href="http://cwiki.apache.org/confluence/display/CONNECTORS/HowToContribute">Wiki</a> for details on contributing. </p>
+	<p>We're also looking for logo ideas.  Here are the <a href="http://cwiki.apache.org/confluence/display/CONNECTORS/Logo+Criteria">guidelines</a>.
+	</p>
+    </section>
+
+</body>
+</document>
diff --git a/src/documentation/content/xdocs/ja_JP/download.xml b/src/documentation/content/xdocs/ja_JP/download.xml
new file mode 100644
index 0000000..e463f1f
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/download.xml
@@ -0,0 +1,1094 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+
+<document> 
+
+  <header> 
+    <title>ダウンロード</title> 
+  </header> 
+
+  <body> 
+
+    <section>
+      <title>最新 (Apache ManifoldCF 2.9.1, 2018年01月15日)</title>
+      <p>
+        <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1.KEYS">KEYS</a><br/>
+        <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1.CHANGES.txt">CHANGES.txt</a><br/>
+      </p>
+
+      <p>ソース:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz">apache-manifoldcf-2.9.1-src.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.sha512">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip">apache-manifoldcf-2.9.1-src.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.sha512">SHA</a>]<br/>
+      </p>
+
+      <p>バイナリ:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz">apache-manifoldcf-2.9.1-bin.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.sha512">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip">apache-manifoldcf-2.9.1-bin.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.sha512">SHA</a>]<br/>
+      </p>
+
+      <p>ライブラリ:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz">apache-manifoldcf-2.9.1-lib.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.sha512">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip">apache-manifoldcf-2.9.1-lib.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.sha512">SHA</a>]<br/>
+      </p>
+    </section>
+
+    <section>
+      <title>最新 (Apache ManifoldCF 1.10, 2015年09月07日)</title>
+      <p>
+        <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10.KEYS">KEYS</a><br/>
+        <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10.CHANGES.txt">CHANGES.txt</a><br/>
+      </p>
+
+      <p>ソース:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz">apache-manifoldcf-1.10-src.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.sha">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip">apache-manifoldcf-1.10-src.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.sha">SHA</a>]<br/>
+      </p>
+
+      <p>バイナリ:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz">apache-manifoldcf-1.10-bin.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.sha">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip">apache-manifoldcf-1.10-bin.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.sha">SHA</a>]<br/>
+      </p>
+
+      <p>ライブラリ:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz">apache-manifoldcf-1.10-lib.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.sha">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip">apache-manifoldcf-1.10-lib.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.sha">SHA</a>]<br/>
+      </p>
+    </section>
+      
+    <section>
+      <title>旧リリース</title>
+
+      <section>
+        <title>Apache ManifoldCF 2.8.1, 2017年09月07日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz">apache-manifoldcf-2.8.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip">apache-manifoldcf-2.8.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz">apache-manifoldcf-2.8.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip">apache-manifoldcf-2.8.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz">apache-manifoldcf-2.8.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip">apache-manifoldcf-2.8.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.7.1, 2017年05月10日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz">apache-manifoldcf-2.7.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip">apache-manifoldcf-2.7.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz">apache-manifoldcf-2.7.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip">apache-manifoldcf-2.7.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz">apache-manifoldcf-2.7.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip">apache-manifoldcf-2.7.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.6, 2016年12月30日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz">apache-manifoldcf-2.6-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip">apache-manifoldcf-2.6-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz">apache-manifoldcf-2.6-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip">apache-manifoldcf-2.6-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz">apache-manifoldcf-2.6-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip">apache-manifoldcf-2.6-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.5, 2016年08月18日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz">apache-manifoldcf-2.5-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip">apache-manifoldcf-2.5-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz">apache-manifoldcf-2.5-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip">apache-manifoldcf-2.5-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz">apache-manifoldcf-2.5-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip">apache-manifoldcf-2.5-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.4, 2016年04月23日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz">apache-manifoldcf-2.4-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip">apache-manifoldcf-2.4-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz">apache-manifoldcf-2.4-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip">apache-manifoldcf-2.4-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz">apache-manifoldcf-2.4-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip">apache-manifoldcf-2.4-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.3, 2015年12月17日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz">apache-manifoldcf-2.3-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip">apache-manifoldcf-2.3-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz">apache-manifoldcf-2.3-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip">apache-manifoldcf-2.3-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz">apache-manifoldcf-2.3-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip">apache-manifoldcf-2.3-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.2, 2015年08月31日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz">apache-manifoldcf-2.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip">apache-manifoldcf-2.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz">apache-manifoldcf-2.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip">apache-manifoldcf-2.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz">apache-manifoldcf-2.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip">apache-manifoldcf-2.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.1, 2015年08月31日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz">apache-manifoldcf-2.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip">apache-manifoldcf-2.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz">apache-manifoldcf-2.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip">apache-manifoldcf-2.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz">apache-manifoldcf-2.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip">apache-manifoldcf-2.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.9, 2015年05月03日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz">apache-manifoldcf-1.9-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip">apache-manifoldcf-1.9-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz">apache-manifoldcf-1.9-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip">apache-manifoldcf-1.9-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz">apache-manifoldcf-1.9-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip">apache-manifoldcf-1.9-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.0.2, 2015年03月02日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz">apache-manifoldcf-2.0.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip">apache-manifoldcf-2.0.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz">apache-manifoldcf-2.0.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip">apache-manifoldcf-2.0.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz">apache-manifoldcf-2.0.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip">apache-manifoldcf-2.0.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.8.2, 2015年03月02日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz">apache-manifoldcf-1.8.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip">apache-manifoldcf-1.8.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz">apache-manifoldcf-1.8.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip">apache-manifoldcf-1.8.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz">apache-manifoldcf-1.8.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip">apache-manifoldcf-1.8.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.7.2, 2014年11月09日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz">apache-manifoldcf-1.7.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip">apache-manifoldcf-1.7.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz">apache-manifoldcf-1.7.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip">apache-manifoldcf-1.7.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz">apache-manifoldcf-1.7.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip">apache-manifoldcf-1.7.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.6.1, 2014年06月01日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz">apache-manifoldcf-1.6.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip">apache-manifoldcf-1.6.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz">apache-manifoldcf-1.6.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip">apache-manifoldcf-1.6.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz">apache-manifoldcf-1.6.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip">apache-manifoldcf-1.6.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.5.1, 2014年02月20日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz">apache-manifoldcf-1.5.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip">apache-manifoldcf-1.5.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz">apache-manifoldcf-1.5.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip">apache-manifoldcf-1.5.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz">apache-manifoldcf-1.5.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip">apache-manifoldcf-1.5.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.4.1, 2013年11月16日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz">apache-manifoldcf-1.4.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip">apache-manifoldcf-1.4.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz">apache-manifoldcf-1.4.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip">apache-manifoldcf-1.4.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz">apache-manifoldcf-1.4.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip">apache-manifoldcf-1.4.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.3, 2013年07月29日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz">apache-manifoldcf-1.3-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip">apache-manifoldcf-1.3-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz">apache-manifoldcf-1.3-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip">apache-manifoldcf-1.3-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz">apache-manifoldcf-1.3-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip">apache-manifoldcf-1.3-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.2, 2013年05月11日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz">apache-manifoldcf-1.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip">apache-manifoldcf-1.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz">apache-manifoldcf-1.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip">apache-manifoldcf-1.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.md5">MD5</a>]<br/>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz">apache-manifoldcf-1.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip">apache-manifoldcf-1.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.1.1, 2013年02月13日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz">apache-manifoldcf-1.1.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip">apache-manifoldcf-1.1.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz">apache-manifoldcf-1.1.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip">apache-manifoldcf-1.1.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz">apache-manifoldcf-1.1.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip">apache-manifoldcf-1.1.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.0.1, 2012年10月18日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz">apache-manifoldcf-1.0.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip">apache-manifoldcf-1.0.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz">apache-manifoldcf-1.0.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip">apache-manifoldcf-1.0.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz">apache-manifoldcf-1.0.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip">apache-manifoldcf-1.0.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.6, 2012年07月13日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz">apache-manifoldcf-0.6-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip">apache-manifoldcf-0.6-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz">apache-manifoldcf-0.6-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip">apache-manifoldcf-0.6-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz">apache-manifoldcf-0.6-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip">apache-manifoldcf-0.6-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.5.1, 2012年05月22日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz">apache-manifoldcf-0.5.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip">apache-manifoldcf-0.5.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz">apache-manifoldcf-0.5.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip">apache-manifoldcf-0.5.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>ライブラリ:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz">apache-manifoldcf-0.5.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip">apache-manifoldcf-0.5.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.4-incubating, 2012年02月02日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.tar.gz">apache-manifoldcf-0.4-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.zip">apache-manifoldcf-0.4-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>ソース+バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.tar.gz">apache-manifoldcf-0.4-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.zip">apache-manifoldcf-0.4-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.3-incubating, 2011年09月20日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.tar.gz">apache-manifoldcf-0.3-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.zip">apache-manifoldcf-0.3-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>ソース+バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.tar.gz">apache-manifoldcf-0.3-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.zip">apache-manifoldcf-0.3-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+
+      </section>
+
+       <section>
+        <title>Apache ManifoldCF 0.2-incubating, 2011年05月17日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.tar.gz">apache-manifoldcf-0.2-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.zip">apache-manifoldcf-0.2-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>ソース+バイナリ:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.tar.gz">apache-manifoldcf-0.2-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.zip">apache-manifoldcf-0.2-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.1-incubating, 2011年1月31日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>ソース<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.tar.gz">apache-manifoldcf-0.1-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.zip">apache-manifoldcf-0.1-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>ソース+バイナリ<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.tar.gz">apache-manifoldcf-0.1-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.zip">apache-manifoldcf-0.1-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p><strong>Known issue:</strong> Inability to automatically create database user 'manifoldcf' when using PostgreSQL.  Workaround steps:</p>
+        <ol>
+          <li>Enter the PostgreSQL utility program psql, as the database superuser: "psql -U &lt;<em>superuser_name</em>&gt;"</li>
+          <li>Create the database user, with the command: "CREATE USER manifoldcf PASSWORD 'local_pg_passwd';"</li>
+          <li>Exit psql: "\q"</li>
+          <li>Either proceed to set up the PostgreSQL database using the DBCreate command normally, or run the Quick Start normally</li>
+        </ol>
+      </section>
+    </section>
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/ja_JP/index.xml b/src/documentation/content/xdocs/ja_JP/index.xml
new file mode 100644
index 0000000..12ca852
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/index.xml
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>Apache ManifoldCF™にようこそ!</title> 
+  </header> 
+
+  <body> 
+    <section>
+	<title>Apache ManifoldCFとは?</title>
+	<p>Apache ManifoldCFとは、インターネットやイントラネットの様々なサーバに保管されている文書ファイルやWebページなどコンテンツを収集し、それを検索エンジンに送るJavaプログラムです。なお、コンテンツを収集する際にActiveDirectoryなど認証基盤と連携してコンテンツ毎に権限情報も収集し、検索するときにその権限情報を利用して表示内容を制限することもできます。例えば、人事情報に関する文書は、人事部のユーザが検索した時のみに表示するようにできます。</p>
+	<p>現バージョンのManifoldCFは、FileNet P8 (IBM), Documentum (EMC), LiveLink (OpenText), Meridio (Autonomy), Windows共有(Microsoft), SharePoint (Microsoft)のような商用商品に保存されているコンテンツと次のような汎用コネクタを使って様々なコンテンツを収集することができます:CMISコネクタ, ファイルシステムコネクタ, JDBCコネクタ, RSSフィードコネクタ, Wikiコネクタ, HTMLコネクタ。また収集したコンテンツをApache Solr, QBase(旧MetaCarta) GTS, Open Search Server, ElasticSearchに送ることができます。対応している製品及び規格一覧は<a href="release-documentation.html">ここ</a>にあります。</p>
+	<p>Apache ManifoldCFはMetaCarta, Inc.により開発されました。5年間の年月の間に複数企業用に開発/テストが繰り返された後の2009年12月にApache Software Foundationにコードソースが寄贈されました。</p>
+    </section>
+
+    <section>
+	<title>プロジェクトの状況</title>
+	<p>Apache ManifoldCF 2.9.1は<a href="download.html">ここ</a>からダウンロードすることができます。</p>
+    </section>
+
+    <section>
+	<title>サードパーティのリポジトリについて</title>
+	<p>ManifoldCFにふくまれる商用ソフトウェア用のコネクタをビルドするには、サードパーティのライブラリ、パッケージ、そのソフトウェアが必要な場合があります。開発者はビルドする時にこれらサードパーティのソフトウェアを入手する必要はありますが、条件付きでコンパイルすることができるため、コネクタ自体のソースコードはApacheとして配布することができます。できる限りすべてをApacheライセンスに準拠するようにしたいと思っていますが、現実的には状況はすぐには変わりません。</p>
+	<p>サードパーティのソフトウェアを含めてビルドする手順はWikiページに掲載しています。</p>
+    </section>
+
+    <section>
+        <title>ニュース</title>
+          <section>
+              <title>2018年01月15日 - ManifoldCF 2.9.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2017年12月22日 - ManifoldCF 2.9を公開しました!</title>
+                <p>開発者コミュニティは2.9リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2017年09月07日 - ManifoldCF 2.8.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2017年08月18日 - ManifoldCF 2.8を公開しました!</title>
+                <p>開発者コミュニティは2.8リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2017年05月10日 - ManifoldCF 2.7.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2017年04月20日 - ManifoldCF 2.7を公開しました!</title>
+                <p>開発者コミュニティは2.7リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2016年12月30日 - ManifoldCF 2.6を公開しました!</title>
+                <p>開発者コミュニティは2.6リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2016年08月18日 - ManifoldCF 2.5を公開しました!</title>
+                <p>開発者コミュニティは2.5リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2016年04月23日 - ManifoldCF 2.4を公開しました!</title>
+                <p>開発者コミュニティは2.4リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年12月17日 - ManifoldCF 2.3を公開しました!</title>
+                <p>開発者コミュニティは2.3リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年09月07日 - ManifoldCF 1.10を公開しました!</title>
+                <p>開発者コミュニティは1.10リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年08月31日 - ManifoldCF 2.2を公開しました!</title>
+                <p>開発者コミュニティは2.2リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年05月04日 - ManifoldCF 2.1を公開しました!</title>
+                <p>開発者コミュニティは2.1リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年05月03日 - ManifoldCF 1.9を公開しました!</title>
+                <p>開発者コミュニティは1.9リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年03月02日 - ManifoldCF 2.0.2を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年03月02日 - ManifoldCF 1.8.2を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年02月03日 - ManifoldCF 2.0.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2015年02月03日 - ManifoldCF 1.8.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年12月26日 - ManifoldCF 2.0を公開しました!</title>
+                <p>開発者コミュニティは2.0リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年12月26日 - ManifoldCF 1.8を公開しました!</title>
+                <p>開発者コミュニティは1.8リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年11月02日 - ManifoldCF 1.7.2を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年09月22日 - ManifoldCF 1.7.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年08月24日 - ManifoldCF 1.7を公開しました!</title>
+                <p>開発者コミュニティは1.7リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年06月01日 - ManifoldCF 1.6.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年04月30日 - ManifoldCF 1.6を公開しました!</title>
+                <p>開発者コミュニティは1.6リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年02月20日 - ManifoldCF 1.5.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2014年02月07日 - ManifoldCF 1.5を公開しました!</title>
+                <p>開発者コミュニティは1.5リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2013年11月16日 - ManifoldCF 1.4.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2013年10月28日 - ManifoldCF 1.4を公開しました!</title>
+                <p>開発者コミュニティは1.4リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2013年07月29日 - ManifoldCF 1.3を公開しました!</title>
+                <p>開発者コミュニティは1.3リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2013年05月11日 - ManifoldCF 1.2を公開しました!</title>
+                <p>開発者コミュニティは1.2リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2013年02月13日 - ManifoldCF 1.1.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2013年02月03日 - ManifoldCF 1.1を公開しました!</title>
+                <p>開発者コミュニティは1.1リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2012年10月18日 - ManifoldCF 1.0.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2012年10月03日 - ManifoldCF 1.0を公開しました!</title>
+                <p>開発者コミュニティは1.0リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2012年7月13日 - ManifoldCF 0.6を公開しました!</title>
+                <p>開発者コミュニティは6版を承認しました</p>
+          </section>
+          <section>
+              <title>2012年5月22日 - ManifoldCF 0.5.1を公開しました!</title>
+                <p>開発者コミュニティはバグ修正版リリースを承認しました</p>
+          </section>
+          <section>
+              <title>2012年5月16日 - ManifoldCFはApacheのインキュベータから卒業しました!</title>
+                  <p>Apacheの理事会はManifoldCFをトップレベルプロジェクトとして承認しました</p>
+          </section>
+          <section>
+              <title>2012年04月15日 - ManifoldCF 0.5-incubatingを公開しました!</title>
+                <p>開発者コミュニティ及びApacheインキュベータは5版を承認しました</p>
+                <p>主な追加機能:</p>
+                <ul>
+                  <li>コネクタUIテンプレートのApache Velocityサポート</li>
+                  <li>ElasticSearch出力コネクタ</li>
+                  <li>CMISコネクタのCMIS 0.6.0のアップグレード</li>
+                  <li>MySQLのサポート</li>
+                  <li>プロプライエタリコネクタのプレビルドのサポート</li>
+                  <li>多言語対応, 日本語ローカリゼーション</li>
+                </ul>
+          </section>
+          <section>
+            <title>2012年02月02日 - ManifoldCF 0.4-incubatingを公開しました!</title>
+                <p>開発者コミュニティ及びApacheインキュベータは4版を承認しました</p>
+          </section>
+          <section>
+             <title>2011年11月08日 - バンクーバーでManifoldCFについて講演しました</title>
+                <p>Apache North America 2011, バンクーバー, ブリティッシュコロンビア, カナダで、ManifoldCFの概要について発表しました</p>
+          </section>
+          <section>
+             <title>2011年10月19日 - バルセロナでManifoldCFについて発表しました</title>
+                <p>Apache Eurocon 2011, バルセロナ, カタルーニャ, スペインで、ManifoldCFの権限機能について発表しました</p>
+          </section>
+          <section>
+             <title>2011年09月20日 - ManifoldCF 0.3-incubatingを公開しました!</title>
+                <p>開発者コミュニティ及びApacheインキュベータは3版を承認しました</p>
+          </section>
+	  <section>
+	     <title>2011年05月17日 - ManifoldCF 0.2-incubatingを公開しました!</title>
+                <p>開発者コミュニティ及びApacheインキュベータは2版を承認しました</p>
+	  </section>
+	  <section>
+	     <title>2011年01月31日 - ManifoldCF 0.1-incubatingを公開しました!</title>
+                <p>開発者コミュニティ及びApacheインキュベータは初期リリースを承認しました</p>
+	  </section>
+	  <section>
+	     <title>2010年10月03日 - Apacheコネクタフレームワークは正式にApache ManifoldCFに命名変更しました</title>
+                <p>開発者コミュニティは2回目の名前変更を承認しました</p>
+	  </section>
+	  <section>
+	     <title>2010年08月19日 - LuceneコネクタフレームワークはApacheコネクタフレームワークに命名変更しました</title>
+                <p>開発者コミュニティは名前変更を承認しました</p>
+	  </section>
+            <section>
+                <title>2010年07月07日 - Luceneコネクタフレームワークの初期リリースが提案されました</title>
+                <p>LCFの初期リリースの条件が提案されました</p>
+            </section>
+            <section>
+                <title>2010年05月21日 - プラハでLuceneコネクタフレームワークについて発表しました</title>
+                <p>Lucene/Solr Eurocon, プラハ, チェコ共和国で、LCFの紹介を発表しました</p>
+            </section>
+            <section>
+                <title>2010年01月12日 - Luceneコネクタフレームワークを開始しました!</title>
+                <p>LCFが正式にApache Software Foundationインキュベーションプロジェクトになりました</p>
+            </section>
+
+    </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/ja_JP/mail.xml b/src/documentation/content/xdocs/ja_JP/mail.xml
new file mode 100644
index 0000000..cc01d85
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/mail.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ 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.
+-->
+
+<document>
+    <header>
+        <title>ManifoldCF - メーリングリスト</title>
+    </header>
+    <body>
+	<section id="ManifoldCF Mailing Lists"><title>ManifoldCFメーリングリスト</title>
+		<p>ManifoldCFプロジェクトには以下のメーリングリストがあります:</p>
+	</section>
+	<section id="user"><title>ユーザメーリングリスト</title>
+		<p>ManifoldCFの使い方</p>
+		<ul>
+			<li><a href="mailto:user-subscribe@manifoldcf.apache.org">参加</a></li>
+			<li><a href="mailto:user-unsubscribe@manifoldcf.apache.org">脱退</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-user/">過去のメッセージ</a></li>
+		</ul>
+	</section>
+	<section id="dev"><title>開発者メーリングリスト</title>
+		<p>ManifoldCFの開発について</p>
+		<ul>
+			<li><a href="mailto:dev-subscribe@manifoldcf.apache.org">参加</a></li>
+			<li><a href="mailto:dev-unsubscribe@manifoldcf.apache.org">脱退</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-dev/">過去のメッセージ</a></li>
+		</ul>
+	</section>
+	<section id="commits"><title>コミットメーリングリスト</title>
+		<p>コミットメッセージ</p>
+		<ul>
+			<li><a href="mailto:commits-subscribe@manifoldcf.apache.org">参加</a></li>
+			<li><a href="mailto:commits-unsubscribe@manifoldcf.apache.org">脱退</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-commits/">過去のメッセージ</a></li>
+		</ul>
+	</section>
+		
+	<section id="archives"><title>過去のメッセージ</title>
+		<p>過去のメッセージは以下のリンクから参照することができます:</p>
+		<ul>
+			<li><a href="http://www.mail-archive.com/dev@manifoldcf.apache.org/index.html">dev@manifoldcf.apache.org</a></li>
+			<li><a href="http://www.mail-archive.com/user@manifoldcf.apache.org/index.html">user@manifoldcf.apache.org</a></li>
+		</ul>
+	</section>
+
+    </body>
+</document>
diff --git a/src/documentation/content/xdocs/ja_JP/release-documentation.xml b/src/documentation/content/xdocs/ja_JP/release-documentation.xml
new file mode 100644
index 0000000..4379450
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/release-documentation.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>ManifoldCFリリースドキュメント</title> 
+  </header> 
+
+  <body> 
+    <section>
+      <title>ManifoldCFリリースドキュメント</title>
+      <p></p>
+      <p>下記ManifoldCFバージョンのリリースドキュメントが参照可能となります:</p>
+      <!--p><a href="../release/trunk/ja_JP/index.html">Trunk (開発中)</a></p-->
+      <p><a href="../release/release-2.9.1/ja_JP/index.html">2.9.1リリース</a></p>
+      <p><a href="../release/release-2.8.1/ja_JP/index.html">2.8.1リリース</a></p>
+      <p><a href="../release/release-1.10/ja_JP/index.html">1.10リリース</a></p>
+    </section>
+  </body>
+</document>
diff --git a/src/documentation/content/xdocs/ja_JP/who.xml b/src/documentation/content/xdocs/ja_JP/who.xml
new file mode 100644
index 0000000..56aa797
--- /dev/null
+++ b/src/documentation/content/xdocs/ja_JP/who.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>Who We Are</title> 
+  </header> 
+
+  <body> 
+
+      <section>
+        <title>Committers</title>
+  
+        <p>
+        (in alphabetical order): 
+        </p>
+  
+        <ul>
+        <li>Shinichiro Abe &lt;shinichiro&gt; </li>
+        <li>Ahmet Arslan &lt;iorixxx&gt; </li>
+        <li>Erlend Gar&aring;sen &lt;ridder&gt; </li>
+        <li>Furkan KAMACI &lt;kamaci&gt; </li>
+		<li>Maciej Lizewski &lt;mlizewski&gt; </li>
+        <li>Piergiorgio Lucidi &lt;piergiorgio&gt; </li>
+        <li>Minoru Osuka &lt;minoru&gt; </li>
+        <li>Simon Willnauer &lt;simonw&gt; </li>
+        <li>Karl Wright &lt;kwright&gt; </li>
+        <li>Mingchun Zhao &lt;mingchun&gt; </li>
+        <li>Jukka Zitting &lt;jukka&gt; </li>
+        </ul>
+  
+      </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/site.xml b/src/documentation/content/xdocs/site.xml
new file mode 100644
index 0000000..50760ca
--- /dev/null
+++ b/src/documentation/content/xdocs/site.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation
+
+  Licensed 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.
+-->
+
+<site label="Apache ManifoldCF" href="" xmlns="http://apache.org/forrest/linkmap/1.0" tab="launch">
+
+  <launch label="Select Language" href="index.html" tab="launch"/>
+  
+  <english label="English" href="en_US/" tab="en_US">
+  
+    <news        label="Welcome"          href="index.html" tab="en_US" />    
+    <dev label="Download" href="download.html" />
+    
+    <project label="License">
+      <license label="Apache License" href="ext:license" />
+    </project>
+
+    <project label="About">
+      <who         label="Who We Are"       href="who.html" />
+      <book        label="Get the Book"      href="ext:book" />
+      <books-and-presentations label="Books and Presentations" href="books-and-presentations.html" />
+      <store       label="Buy Stuff"        href="ext:store" />    
+      <sponsor     label="Sponsor Apache"     href="ext:sponsor" />    
+      <thanks      label="Sponsors of Apache" href="ext:thanks" />    
+    </project>
+    
+    <docs label="Documentation">
+      <dev label="Release Documentation" href="release-documentation.html"/>
+    </docs>
+    
+    <resources label="Resources">
+      <mail        label="Mailing Lists"    href="mail.html" />    
+      <dev label="Developer/Integrator Resources" href="developer-resources.html"/>
+      <dev label="Security Analysis" href="security.html"/>
+      <security label="Report Security Problems" href="ext:security"/>
+    </resources>
+
+    <rel label="Related-Projects">    
+      <droids      label="Droids"           href="ext:droids" />
+      <java        label="Java"             href="ext:java" />
+      <lucene.net  label="Lucene.Net"       href="ext:lucene.net" />    
+      <lucy        label="Lucy"             href="ext:lucy" />
+      <mahout      label="Mahout"           href="ext:mahout" />
+      <nutch       label="Nutch"            href="ext:nutch" />    
+      <orp       	 label="Open Relevance"            href="ext:orp" />
+      <pylucene    label="PyLucene"         href="ext:pylucene"/>
+      <solr        label="Solr"             href="ext:solr" />
+      <tika        label="Tika"             href="ext:tika" />
+    </rel>
+
+  </english>
+  
+  <japanese label="日本語" href="ja_JP/" tab="ja_JP">
+    <index label="概要" href="index.html" tab="ja_JP"/>
+    <dev label="ダウンロード" href="download.html" />
+    
+    <docs label="ドキュメント">
+      <dev label="リリースドキュメント" href="release-documentation.html"/>
+      <mail label="メーリングリスト"    href="mail.html" />   
+      <dev label="開発者リソース" href="developer-resources.html"/>
+    </docs>
+    
+  </japanese>
+
+  <chinese label="中文" href="zh_CN/" tab="zh_CN">
+    <index label="概要" href="index.html" tab="zh_CN"/>
+    <dev label="下载" href="download.html" />
+    
+    <docs label="文档">
+      <dev label="发布文档" href="release-documentation.html"/>
+      <mail label="邮件列表"    href="mail.html" />   
+      <dev label="开发人员资源" href="developer-resources.html"/>
+    </docs>
+    
+  </chinese>
+
+  <external-refs>
+    <java      href="http://lucene.apache.org/core" />
+    <nutch     href="http://nutch.apache.org" />
+    <lucy      href="http://lucy.apache.org" />
+    <orp      href="http://lucene.apache.org/openrelevance/" />
+    <solr      href="http://lucene.apache.org/solr/" />
+    <lucene.net href="http://incubator.apache.org/lucene.net/" />
+    <tika      href="http://tika.apache.org" />
+    <mahout    href="http://mahout.apache.org" />
+    <droids    href="http://incubator.apache.org/droids/" />
+    <pylucene    href="http://lucene.apache.org/pylucene/" />
+    <book     href="http://www.manning.com/wright/" />
+    <store     href="http://www.cafepress.com/lucene/" />
+    <license   href="http://www.apache.org/licenses/" />
+    <sponsor   href="http://www.apache.org/foundation/sponsorship.html" />
+    <thanks    href="http://www.apache.org/foundation/thanks.html" />
+    <security href="http://www.apache.org/security/" />
+  </external-refs>
+
+ 
+</site>
diff --git a/src/documentation/content/xdocs/tabs.xml b/src/documentation/content/xdocs/tabs.xml
new file mode 100644
index 0000000..6f9233c
--- /dev/null
+++ b/src/documentation/content/xdocs/tabs.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE tabs PUBLIC "-//APACHE//DTD Cocoon Documentation Tab V1.0//EN" 
+          "tab-cocoon-v10.dtd">
+
+<!--
+ 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.
+-->
+
+<tabs software="Lucene"
+      title="Lucene"
+      copyright="The Apache Software Foundation"
+      xmlns:xlink="http://www.w3.org/1999/xlink">
+
+  <!-- The rules are:
+    @dir will always have /index.html added.
+    @href is not modified unless it is root-relative and obviously specifies a
+    directory (ends in '/'), in which case /index.html will be added
+  -->
+
+  <tab id="launch" label="Hello!"/>  
+  <tab id="en_US" label="English" dir="en_US"/>  
+  <tab id="ja_JP" label="日本語" dir="ja_JP"/> 
+  <tab id="zh_CN" label="中文" dir="zh_CN"/> 
+  <tab id="wiki" label="Wiki" href="http://cwiki.apache.org/confluence/display/CONNECTORS/Index"/>
+</tabs>
diff --git a/src/documentation/content/xdocs/zh_CN/books-and-presentations.xml b/src/documentation/content/xdocs/zh_CN/books-and-presentations.xml
new file mode 100644
index 0000000..3fa9515
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/books-and-presentations.xml
@@ -0,0 +1,51 @@
+<?xml version="1.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.

+-->

+

+<document>

+    <header>

+        <title>ManifoldCF - Books and Presentations</title>

+    </header>

+    <body>

+  <section id="books"><title>ManifoldCF Books</title>

+    <p>All the books about the ManifoldCF project.</p>

+    <ul>

+      <li><a href="https://github.com/DaddyWri/manifoldcfinaction/tree/master/pdfs" target="_blank">Updated ManifoldCF in Action chapters, revised PDFs</a></li>

+    </ul>

+  </section>

+  <section id="presentations"><title>ManifoldCF Presentations</title>

+    <p>Some presentations about the ManifoldCF project.</p>

+    <ul>

+      <li><a href="http://www.slideshare.net/lucenerevolution/wright-nokia-manifoldcfeurocon-2011" target="_blank">Securing Documents in Solr with ManifoldCF by Karl Wright</a></li>

+      <li><a href="http://www.slideshare.net/PiergiorgioLucidi/apache-manifoldcf-9508286" target="_blank">Apache ManifoldCF by Piergiorgio Lucidi</a></li>

+      <li><a href="http://www.slideshare.net/ShinichiroAbe/apache-manifoldcf-9231499" target="_blank">Apache ManifoldCF by Shinichiro Abe</a></li>

+      <li><a href="http://www.open4dev.com/journal/2013/11/9/my-two-talks-at-alfresco-summit-2013-in-barcelona.html" target="_blank">Barcelona presentations by Piergiorgio Lucidi</a></li>

+      <li><a href="http://summit.alfresco.com/barcelona/sessions/super-size-your-search" target="_blank">Alfresco Summit presentation by Piergiorgio Lucidi</a></li>

+      <li><a href="https://feathercast.apache.org/2017/10/30/oss-prague-apache-manifoldcf-and-incubation-piergiorgio-lucidi/" target="_blank">Open Source Summit presentation by Piergiorgio Lucidi</a></li>

+    </ul>

+  </section>

+  <section id="podcasts"><title>ManifoldCF Videos/Podcasts</title>

+    <p>All the videos/podcasts about the ManifoldCF project.</p>

+    <ul>

+      <li><a title="Teach Me To Code - Karl Wright - ManifoldCF" href="http://teachmetocode.com/podcast/077-tmtc-karl-wright-manifoldcf/" target="_blank">077 TMTC Karl Wright - ManifoldCF</a> (ApacheCON North America, 2011)</li>

+      <li><a title="Securing Documents in Solr with ManifoldCF by Karl Wright" href="http://vimeo.com/33082485" target="_blank">Lucene Revolutions Eurocon 2011 - Karl Wright - ManifoldCF</a> (Lucene Revolutions Eurocon, 2011)</li>

+      <li><a title="WAT" href="https://www.destroyallsoftware.com/talks/wat" target="_blank">WAT Lightning Talk</a> (Gary Bernhardt, CodeMash 2012)</li>

+    </ul>

+  </section>

+    </body>

+</document>
\ No newline at end of file
diff --git a/src/documentation/content/xdocs/zh_CN/developer-resources.xml b/src/documentation/content/xdocs/zh_CN/developer-resources.xml
new file mode 100644
index 0000000..e256d68
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/developer-resources.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ 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.
+-->
+
+<document>
+<header><title>ManifoldCF - 开发人员资源</title></header>
+<properties>
+</properties>
+<body>
+
+    <section id="Source">
+	<title>源代码</title>
+	<p>ManifoldCF的源代码在svn加以管理(参阅: <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a> 和 <a href="http://svnbook.red-bean.com/">http://svnbook.red-bean.com/</a>)
+	</p>
+	<p>
+	    <code>svn checkout http://svn.apache.org/repos/asf/manifoldcf/trunk mcf-trunk</code>
+	</p>
+    </section>
+
+    <section id="Debugging">
+	<title>调试连接</title>
+	<p>ManifoldCF的使用中有时会因某种原因而无法连接到存储库。此时请从<a href="https://cwiki.apache.org/confluence/display/CONNECTORS/Debugging+Connections">这里</a>开始调查。如发现新的调试方法,主意请告之!</p>
+    </section>
+    
+    <section id="Changes">
+	<title>修改历史记录</title>
+	<p>最新修改历史记录请参阅
+	    <a href="http://svn.apache.org/repos/asf/manifoldcf/trunk/CHANGES.txt">这里</a>。
+	</p>
+    </section>
+    
+    <section id="Bugs">
+          <title>报告Bug,新功能案</title>
+          <p>如发现问题或有新功能案请创建<a href="http://issues.apache.org/jira">JIRA问题</a>。创建问题需先注册帐号,注册时请选择[ManifoldCF]项目。
+          </p>
+          <p>但在创建新问题之前先查看是否已存在同样的问题。</p>
+    </section>
+    
+    <section id="Making a Contribution">
+	<title>贡献</title>
+	<p>ManifoldCF一直在寻求贡献者。关于贡献的详情请参阅<a href="http://cwiki.apache.org/confluence/display/CONNECTORS/HowToContribute">Wiki</a>。</p>
+	<p>我们还寻找徽标创意。请参阅<a href="http://cwiki.apache.org/confluence/display/CONNECTORS/Logo+Criteria">指南</a>。
+	</p>
+    </section>
+
+</body>
+</document>
diff --git a/src/documentation/content/xdocs/zh_CN/download.xml b/src/documentation/content/xdocs/zh_CN/download.xml
new file mode 100644
index 0000000..e3b792c
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/download.xml
@@ -0,0 +1,1094 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+
+<document> 
+
+  <header> 
+    <title>下载</title> 
+  </header> 
+
+  <body> 
+
+    <section>
+      <title>最新版 (Apache ManifoldCF 2.9.1, 2018年01月15日)</title>
+      <p>
+        <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1.KEYS">KEYS</a><br/>
+        <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1.CHANGES.txt">CHANGES.txt</a><br/>
+      </p>
+
+      <p>源代码:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz">apache-manifoldcf-2.9.1-src.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.tar.gz.sha512">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip">apache-manifoldcf-2.9.1-src.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-src.zip.sha512">SHA</a>]<br/>
+      </p>
+
+      <p>二进制执行文件:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz">apache-manifoldcf-2.9.1-bin.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.tar.gz.sha512">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip">apache-manifoldcf-2.9.1-bin.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-bin.zip.sha512">SHA</a>]<br/>
+      </p>
+
+      <p>库文件:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz">apache-manifoldcf-2.9.1-lib.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.tar.gz.sha512">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip">apache-manifoldcf-2.9.1-lib.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-2.9.1/apache-manifoldcf-2.9.1-lib.zip.sha512">SHA</a>]<br/>
+      </p>
+    </section>
+
+    <section>
+      <title>最新版 (Apache ManifoldCF 1.10, 2015年09月07日)</title>
+      <p>
+        <a href="https://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10.KEYS">KEYS</a><br/>
+        <a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10.CHANGES.txt">CHANGES.txt</a><br/>
+      </p>
+
+      <p>源代码:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz">apache-manifoldcf-1.10-src.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.tar.gz.sha">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip">apache-manifoldcf-1.10-src.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-src.zip.sha">SHA</a>]<br/>
+      </p>
+
+      <p>二进制执行文件:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz">apache-manifoldcf-1.10-bin.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.tar.gz.sha">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip">apache-manifoldcf-1.10-bin.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-bin.zip.sha">SHA</a>]<br/>
+      </p>
+
+      <p>库文件:<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz">apache-manifoldcf-1.10-lib.tar.gz</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.tar.gz.sha">SHA</a>]<br/>
+        <a href="http://www.apache.org/dyn/closer.lua/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip">apache-manifoldcf-1.10-lib.zip</a>
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.asc">PGP</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.md5">MD5</a>]
+          [<a href="http://www.apache.org/dist/manifoldcf/apache-manifoldcf-1.10/apache-manifoldcf-1.10-lib.zip.sha">SHA</a>]<br/>
+      </p>
+    </section>
+      
+    <section>
+      <title>旧版本</title>
+
+      <section>
+        <title>Apache ManifoldCF 2.8.1, 2017年09月07日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz">apache-manifoldcf-2.8.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip">apache-manifoldcf-2.8.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz">apache-manifoldcf-2.8.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip">apache-manifoldcf-2.8.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz">apache-manifoldcf-2.8.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip">apache-manifoldcf-2.8.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.8.1/apache-manifoldcf-2.8.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.7.1, 2017年05月10日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz">apache-manifoldcf-2.7.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip">apache-manifoldcf-2.7.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz">apache-manifoldcf-2.7.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip">apache-manifoldcf-2.7.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz">apache-manifoldcf-2.7.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip">apache-manifoldcf-2.7.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.7.1/apache-manifoldcf-2.7.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.6, 2016年12月30日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz">apache-manifoldcf-2.6-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip">apache-manifoldcf-2.6-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz">apache-manifoldcf-2.6-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip">apache-manifoldcf-2.6-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz">apache-manifoldcf-2.6-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip">apache-manifoldcf-2.6-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.6/apache-manifoldcf-2.6-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.5, 2016年08月18日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz">apache-manifoldcf-2.5-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip">apache-manifoldcf-2.5-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz">apache-manifoldcf-2.5-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip">apache-manifoldcf-2.5-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz">apache-manifoldcf-2.5-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip">apache-manifoldcf-2.5-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.5/apache-manifoldcf-2.5-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.4, 2016年04月23日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz">apache-manifoldcf-2.4-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip">apache-manifoldcf-2.4-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz">apache-manifoldcf-2.4-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip">apache-manifoldcf-2.4-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz">apache-manifoldcf-2.4-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip">apache-manifoldcf-2.4-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.4/apache-manifoldcf-2.4-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.3, 2015年12月17日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz">apache-manifoldcf-2.3-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip">apache-manifoldcf-2.3-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz">apache-manifoldcf-2.3-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip">apache-manifoldcf-2.3-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz">apache-manifoldcf-2.3-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip">apache-manifoldcf-2.3-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.3/apache-manifoldcf-2.3-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.2, 2015年08月31日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz">apache-manifoldcf-2.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip">apache-manifoldcf-2.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz">apache-manifoldcf-2.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip">apache-manifoldcf-2.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz">apache-manifoldcf-2.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip">apache-manifoldcf-2.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.2/apache-manifoldcf-2.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.1, 2015年05月03日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz">apache-manifoldcf-2.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip">apache-manifoldcf-2.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz">apache-manifoldcf-2.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip">apache-manifoldcf-2.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz">apache-manifoldcf-2.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip">apache-manifoldcf-2.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.1/apache-manifoldcf-2.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.9, 2015年05月03日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz">apache-manifoldcf-1.9-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip">apache-manifoldcf-1.9-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz">apache-manifoldcf-1.9-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip">apache-manifoldcf-1.9-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz">apache-manifoldcf-1.9-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip">apache-manifoldcf-1.9-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.9/apache-manifoldcf-1.9-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 2.0.2, 2015年03月02日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz">apache-manifoldcf-2.0.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip">apache-manifoldcf-2.0.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz">apache-manifoldcf-2.0.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip">apache-manifoldcf-2.0.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz">apache-manifoldcf-2.0.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip">apache-manifoldcf-2.0.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-2.0.2/apache-manifoldcf-2.0.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.8.2, 2015年03月02日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz">apache-manifoldcf-1.8.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip">apache-manifoldcf-1.8.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz">apache-manifoldcf-1.8.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip">apache-manifoldcf-1.8.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz">apache-manifoldcf-1.8.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip">apache-manifoldcf-1.8.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.8.2/apache-manifoldcf-1.8.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.7.2, 2014年11月09日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz">apache-manifoldcf-1.7.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip">apache-manifoldcf-1.7.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz">apache-manifoldcf-1.7.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip">apache-manifoldcf-1.7.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz">apache-manifoldcf-1.7.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip">apache-manifoldcf-1.7.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.7.2/apache-manifoldcf-1.7.2-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.6.1, 2014年06月01日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz">apache-manifoldcf-1.6.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip">apache-manifoldcf-1.6.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-src.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz">apache-manifoldcf-1.6.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip">apache-manifoldcf-1.6.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-bin.zip.sha">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz">apache-manifoldcf-1.6.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.tar.gz.sha">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip">apache-manifoldcf-1.6.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.6.1-lib.zip.sha">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.5.1, 2014年02月20日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz">apache-manifoldcf-1.5.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip">apache-manifoldcf-1.5.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz">apache-manifoldcf-1.5.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip">apache-manifoldcf-1.5.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz">apache-manifoldcf-1.5.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip">apache-manifoldcf-1.5.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.5.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.4.1, 2013年11月16日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz">apache-manifoldcf-1.4.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip">apache-manifoldcf-1.4.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz">apache-manifoldcf-1.4.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip">apache-manifoldcf-1.4.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz">apache-manifoldcf-1.4.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip">apache-manifoldcf-1.4.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.4.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.3, 2013年07月29日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz">apache-manifoldcf-1.3-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip">apache-manifoldcf-1.3-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz">apache-manifoldcf-1.3-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip">apache-manifoldcf-1.3-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz">apache-manifoldcf-1.3-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip">apache-manifoldcf-1.3-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.3-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.2, 2013年05月11日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz">apache-manifoldcf-1.2-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip">apache-manifoldcf-1.2-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz">apache-manifoldcf-1.2-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip">apache-manifoldcf-1.2-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.md5">MD5</a>]<br/>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz">apache-manifoldcf-1.2-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip">apache-manifoldcf-1.2-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.2-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.1.1, 2013年02月13日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz">apache-manifoldcf-1.1.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip">apache-manifoldcf-1.1.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz">apache-manifoldcf-1.1.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip">apache-manifoldcf-1.1.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz">apache-manifoldcf-1.1.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip">apache-manifoldcf-1.1.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.1.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 1.0.1, 2012年10月18日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz">apache-manifoldcf-1.0.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip">apache-manifoldcf-1.0.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz">apache-manifoldcf-1.0.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip">apache-manifoldcf-1.0.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz">apache-manifoldcf-1.0.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip">apache-manifoldcf-1.0.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-1.0.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.6, 2012年07月13日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz">apache-manifoldcf-0.6-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip">apache-manifoldcf-0.6-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz">apache-manifoldcf-0.6-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip">apache-manifoldcf-0.6-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz">apache-manifoldcf-0.6-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip">apache-manifoldcf-0.6-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.6-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.5.1, 2012年05月22日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz">apache-manifoldcf-0.5.1-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip">apache-manifoldcf-0.5.1-src.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-src.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz">apache-manifoldcf-0.5.1-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip">apache-manifoldcf-0.5.1-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-bin.zip.sha1">SHA</a>]<br/>
+        </p>
+
+        <p>库文件:<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz">apache-manifoldcf-0.5.1-lib.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.tar.gz.sha1">SHA</a>]<br/>
+          <a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip">apache-manifoldcf-0.5.1-lib.zip</a>
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip.md5">MD5</a>]
+            [<a href="http://archive.apache.org/dist/manifoldcf/apache-manifoldcf-0.5.1-lib.zip.sha1">SHA</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.4-incubating, 2012年02月02日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.tar.gz">apache-manifoldcf-0.4-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.zip">apache-manifoldcf-0.4-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>源代码+二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.tar.gz">apache-manifoldcf-0.4-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.zip">apache-manifoldcf-0.4-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.4-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.3-incubating, 2011年09月20日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.tar.gz">apache-manifoldcf-0.3-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.zip">apache-manifoldcf-0.3-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>源代码+二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.tar.gz">apache-manifoldcf-0.3-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.zip">apache-manifoldcf-0.3-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.3-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+
+      </section>
+
+       <section>
+        <title>Apache ManifoldCF 0.2-incubating, 2011年05月17日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.tar.gz">apache-manifoldcf-0.2-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.zip">apache-manifoldcf-0.2-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>源代码+二进制执行文件:<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.tar.gz">apache-manifoldcf-0.2-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.zip">apache-manifoldcf-0.2-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.2-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+
+      </section>
+
+      <section>
+        <title>Apache ManifoldCF 0.1-incubating, 2011年1月31日</title>
+        <p>
+          <a href="https://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating.KEYS">KEYS</a><br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating.CHANGES.txt">CHANGES.txt</a><br/>
+        </p>
+
+        <p>源代码<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.tar.gz">apache-manifoldcf-0.1-incubating-src.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.zip">apache-manifoldcf-0.1-incubating-src.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-src.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p>源代码+二进制执行文件<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.tar.gz">apache-manifoldcf-0.1-incubating-bin.tar.gz</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.tar.gz.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.tar.gz.md5">MD5</a>]<br/>
+          <a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.zip">apache-manifoldcf-0.1-incubating-bin.zip</a>
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.zip.asc">PGP</a>]
+            [<a href="http://archive.apache.org/dist/incubator/manifoldcf/apache-manifoldcf-0.1-incubating-bin.zip.md5">MD5</a>]<br/>
+        </p>
+
+        <p><strong>Known issue:</strong> Inability to automatically create database user 'manifoldcf' when using PostgreSQL.  Workaround steps:</p>
+        <ol>
+          <li>Enter the PostgreSQL utility program psql, as the database superuser: "psql -U &lt;<em>superuser_name</em>&gt;"</li>
+          <li>Create the database user, with the command: "CREATE USER manifoldcf PASSWORD 'local_pg_passwd';"</li>
+          <li>Exit psql: "\q"</li>
+          <li>Either proceed to set up the PostgreSQL database using the DBCreate command normally, or run the Quick Start normally</li>
+        </ol>
+      </section>
+    </section>
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/zh_CN/index.xml b/src/documentation/content/xdocs/zh_CN/index.xml
new file mode 100644
index 0000000..453f598
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/index.xml
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>欢迎来到Apache ManifoldCF™!</title> 
+  </header> 
+
+  <body> 
+    <section>
+	<title>什么是ManifoldCF?</title>
+	<p>ManifoldCF由Java程序实现,它可以搜集保存在互联网或企业网上各种服务器里的文档或Web网页,并将其发送到搜索引擎。在搜集文档的同时还在ActiveDirectory等认证系统的协同下搜集文档的权限信息,并利用这些权限信息对其搜索结果加以限制。比如,人事档案仅限由人事部搜索时才加以显示。</p>
+	<p>ManifoldCF现版本可利用下述通用连接器搜集FileNet P8 (IBM),Documentum (EMC),LiveLink (OpenText),Meridio (Autonomy), Windows共享(Microsoft),SharePoint (Microsoft)等商用系统保存着的各种文档,如:CMIS连接器,File System连接器,JDBC连接器,RSS Feed连接器,Wiki连接器,HTML连接器。而且,还可将搜集到的文档发送到Apache Solr,QBase(旧MetaCarta) GTS,OpenSearchServer,Elasticsearch。所支持的产品及规格一览请参照<a href="release-documentation.html">这里</a>。</p>
+	<p>Apache ManifoldCF由MetaCarta, Inc.开发,为供给多家企业经历5年反反复复的开发,调试之后,2009年12月其源代码赠送到Apache Software Foundation。</p>
+    </section>
+
+    <section>
+	<title>项目的状况</title>
+	<p>Apache ManifoldCF 2.9.1可从<a href="download.html">这里</a>下载。</p>
+    </section>
+
+    <section>
+	<title>关于第三方存储库</title>
+	<p>为生成ManifoldCF包含的面向商业软件的连接器,有时需第三方软件库,包或软件本身。虽然开发人员需得到这些第三方软件,但可以有条件地编译连接器自身的源代码并作为Apache发布之。我们虽期望并努力做到使一切遵照Apache版权,但现状不会立即发生变化。</p>
+	<p>关于包括第三方软件的生成步骤,请参照Wiki页面。</p>
+    </section>
+
+    <section>
+        <title>新闻</title>
+          <section>
+              <title>2018年01月15日 - ManifoldCF 2.9.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2017年12月22日 - ManifoldCF 2.9发布了!</title>
+                <p>开发人员社区批准发布2.9版</p>
+          </section>
+          <section>
+              <title>2017年09月07日 - ManifoldCF 2.8.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2017年08月18日 - ManifoldCF 2.8发布了!</title>
+                <p>开发人员社区批准发布2.8版</p>
+          </section>
+          <section>
+              <title>2017年05月10日 - ManifoldCF 2.7.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2017年04月20日 - ManifoldCF 2.7发布了!</title>
+                <p>开发人员社区批准发布2.7版</p>
+          </section>
+          <section>
+              <title>2016年12月30日 - ManifoldCF 2.6发布了!</title>
+                <p>开发人员社区批准发布2.6版</p>
+          </section>
+          <section>
+              <title>2016年08月18日 - ManifoldCF 2.5发布了!</title>
+                <p>开发人员社区批准发布2.5版</p>
+          </section>
+          <section>
+              <title>2016年04月23日 - ManifoldCF 2.4发布了!</title>
+                <p>开发人员社区批准发布2.4版</p>
+          </section>
+          <section>
+              <title>2015年12月17日 - ManifoldCF 2.3发布了!</title>
+                <p>开发人员社区批准发布2.3版</p>
+          </section>
+          <section>
+              <title>2015年09月07日 - ManifoldCF 1.10发布了!</title>
+                <p>开发人员社区批准发布1.10版</p>
+          </section>
+          <section>
+              <title>2015年08月31日 - ManifoldCF 2.2发布了!</title>
+                <p>开发人员社区批准发布2.2版</p>
+          </section>
+          <section>
+              <title>2015年05月04日 - ManifoldCF 2.1发布了!</title>
+                <p>开发人员社区批准发布2.1版</p>
+          </section>
+          <section>
+              <title>2015年05月03日 - ManifoldCF 1.9发布了!</title>
+                <p>开发人员社区批准发布1.9版</p>
+          </section>
+          <section>
+              <title>2015年03月03日 - ManifoldCF 2.0.2发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2015年03月02日 - ManifoldCF 1.8.2发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2015年02月03日 - ManifoldCF 2.0.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2015年02月03日 - ManifoldCF 1.8.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2014年12月26日 - ManifoldCF 2.0发布了!</title>
+                <p>开发人员社区批准发布2.0版</p>
+          </section>
+          <section>
+              <title>2014年12月26日 - ManifoldCF 1.8发布了!</title>
+                <p>开发人员社区批准发布1.8版</p>
+          </section>
+          <section>
+              <title>2014年11月09日 - ManifoldCF 1.7.2发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2014年09月22日 - ManifoldCF 1.7.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2014年08月24日 - ManifoldCF 1.7发布了!</title>
+                <p>开发人员社区批准发布1.7版</p>
+          </section>
+          <section>
+              <title>2014年06月01日 - ManifoldCF 1.6.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2014年04月30日 - ManifoldCF 1.6发布了!</title>
+                <p>开发人员社区批准发布1.6版</p>
+          </section>
+          <section>
+              <title>2014年02月20日 - ManifoldCF 1.5.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2014年02月07日 - ManifoldCF 1.5发布了!</title>
+                <p>开发人员社区批准发布1.5版</p>
+          </section>
+          <section>
+              <title>2013年11月16日 - ManifoldCF 1.4.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2013年10月28日 - ManifoldCF 1.4发布了!</title>
+                <p>开发人员社区批准发布1.4版</p>
+          </section>
+          <section>
+              <title>2013年07月29日 - ManifoldCF 1.3发布了!</title>
+                <p>开发人员社区批准发布1.3版</p>
+          </section>
+          <section>
+              <title>2013年05月11日 - ManifoldCF 1.2发布了!</title>
+                <p>开发人员社区批准发布1.2版</p>
+          </section>
+          <section>
+              <title>2013年02月13日 - ManifoldCF 1.1.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2013年02月03日 - ManifoldCF 1.1发布了!</title>
+                <p>开发人员社区批准了1.1版</p>
+          </section>
+          <section>
+              <title>2012年10月18日 - ManifoldCF 1.0.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2012年10月03日 - ManifoldCF 1.0发布了!</title>
+                <p>开发人员社区批准了1.0版</p>
+          </section>
+          <section>
+              <title>2012年7月13日 - ManifoldCF 0.6发布了!</title>
+                <p>开发人员社区批准了6版</p>
+          </section>
+          <section>
+              <title>2012年5月22日 - ManifoldCF 0.5.1发布了!</title>
+                <p>开发人员社区批准发布Bug修改版</p>
+          </section>
+          <section>
+              <title>2012年5月16日 - ManifoldCF从Apache孵化器毕业!</title>
+                  <p>Apache理事会批准ManifoldCF成为顶级项目</p>
+          </section>
+          <section>
+              <title>2012年04月15日 - ManifoldCF 0.5-incubating发布了!</title>
+                <p>开发人员社区及Apache孵化器批准了5版</p>
+                <p>主要添加功能:</p>
+                <ul>
+                  <li>支持连接器UI模板Apache Velocity</li>
+                  <li>ElasticSearch输出连接器</li>
+                  <li>CMIS连接器升级为CMIS 0.6.0</li>
+                  <li>支持MySQL</li>
+                  <li>支持预构建专有连接器</li>
+                  <li>支持多国语, 日语本地化</li>
+                </ul>
+          </section>
+          <section>
+            <title>2012年02月02日 - ManifoldCF 0.4-incubating发布了!</title>
+                <p>开发人员社区及Apache孵化器批准了4版</p>
+          </section>
+          <section>
+             <title>2011年11月08日 - 在温哥华发表关于ManifoldCF的演讲</title>
+                <p>Apache North America 2011, 在加拿大,不列颠哥伦比亚, 温哥华,发表了ManifoldCF的概要</p>
+          </section>
+          <section>
+             <title>2011年10月19日 - 在巴塞罗那发表关于ManifoldCF</title>
+                <p>Apache Eurocon 2011, 在西班牙,加泰罗尼亚,巴塞罗那,发表关于ManifoldCF的权限功能</p>
+          </section>
+          <section>
+             <title>2011年09月20日 - ManifoldCF 0.3-incubating发布了!</title>
+                <p>开发人员社区及Apache孵化器批准了3版</p>
+          </section>
+	  <section>
+	     <title>2011年05月17日 - ManifoldCF 0.2-incubating发布了!</title>
+                <p>开发人员社区及Apache孵化器批准了2版</p>
+	  </section>
+	  <section>
+	     <title>2011年01月31日 - ManifoldCF 0.1-incubating发布了!</title>
+                <p>开发人员社区及Apache孵化器批准发布初期版本</p>
+	  </section>
+	  <section>
+	     <title>2010年10月03日 - Apache连接器框架正式更名为Apache ManifoldCF</title>
+                <p>开发人员社区批准了第二次更名</p>
+	  </section>
+	  <section>
+	     <title>2010年08月19日 - Lucene连接器框架更名为Apache连接器框架</title>
+                <p>开发人员社区批准了更名</p>
+	  </section>
+            <section>
+                <title>2010年07月07日 - Lucene连接器框架的初期版本被提议</title>
+                <p>LCF初期版本条件被提议</p>
+            </section>
+            <section>
+                <title>2010年05月21日 - 在布拉格发表关于Lucene连接器框架</title>
+                <p>Lucene/Solr Eurocon, 在捷克共和国,布拉格,介绍了LCF</p>
+            </section>
+            <section>
+                <title>2010年01月12日 - Lucene连接器框架启动了!</title>
+                <p>LCF正式成为Apache Software Foundation孵化项目</p>
+            </section>
+
+    </section>
+
+  </body>
+
+</document>
diff --git a/src/documentation/content/xdocs/zh_CN/mail.xml b/src/documentation/content/xdocs/zh_CN/mail.xml
new file mode 100644
index 0000000..bef4315
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/mail.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ 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.
+-->
+
+<document>
+    <header>
+        <title>ManifoldCF - 邮件列表</title>
+    </header>
+    <body>
+	<section id="ManifoldCF Mailing Lists"><title>ManifoldCF邮件列表</title>
+		<p>ManifoldCF项目有以下邮件列表:</p>
+	</section>
+	<section id="user"><title>用户邮件列表</title>
+		<p>ManifoldCF的使用方法</p>
+		<ul>
+			<li><a href="mailto:user-subscribe@manifoldcf.apache.org">加入</a></li>
+			<li><a href="mailto:user-unsubscribe@manifoldcf.apache.org">退出</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-user/">过去信息</a></li>
+		</ul>
+	</section>
+	<section id="dev"><title>开发人员邮件列表</title>
+		<p>关于ManifoldCF的开发</p>
+		<ul>
+			<li><a href="mailto:dev-subscribe@manifoldcf.apache.org">加入</a></li>
+			<li><a href="mailto:dev-unsubscribe@manifoldcf.apache.org">退出</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-dev/">过去信息</a></li>
+		</ul>
+	</section>
+	<section id="commits"><title>提交邮件列表</title>
+		<p>提交信息</p>
+		<ul>
+			<li><a href="mailto:commits-subscribe@manifoldcf.apache.org">加入</a></li>
+			<li><a href="mailto:commits-unsubscribe@manifoldcf.apache.org">退出</a></li>
+			<li><a href="http://mail-archives.apache.org/mod_mbox/manifoldcf-commits/">过去信息</a></li>
+		</ul>
+	</section>
+		
+	<section id="archives"><title>过去信息</title>
+		<p>过去信息可从以下链接参阅:</p>
+		<ul>
+			<li><a href="http://www.mail-archive.com/dev@manifoldcf.apache.org/index.html">dev@manifoldcf.apache.org</a></li>
+			<li><a href="http://www.mail-archive.com/user@manifoldcf.apache.org/index.html">user@manifoldcf.apache.org</a></li>
+		</ul>
+	</section>
+
+    </body>
+</document>
diff --git a/src/documentation/content/xdocs/zh_CN/release-documentation.xml b/src/documentation/content/xdocs/zh_CN/release-documentation.xml
new file mode 100644
index 0000000..349d854
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/release-documentation.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>ManifoldCF发布文档</title> 
+  </header> 
+
+  <body> 
+    <section>
+      <title>ManifoldCF发布文档</title>
+      <p></p>
+      <p>关于下述ManifoldCF版本的发布文档可供您参阅:</p>
+      <!--p><a href="../release/trunk/zh_CN/index.html">Trunk (开发中)</a></p-->
+      <p><a href="../release/release-2.9.1/zh_CN/index.html">2.9.1版</a></p>
+      <p><a href="../release/release-2.8.1/zh_CN/index.html">2.8.1版</a></p>
+      <p><a href="../release/release-1.10/zh_CN/index.html">1.10版</a></p>
+    </section>
+  </body>
+</document>
diff --git a/src/documentation/content/xdocs/zh_CN/who.xml b/src/documentation/content/xdocs/zh_CN/who.xml
new file mode 100644
index 0000000..56aa797
--- /dev/null
+++ b/src/documentation/content/xdocs/zh_CN/who.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" 
+          "http://forrest.apache.org/dtd/document-v20.dtd">
+
+<!--
+ 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.
+-->
+
+<document> 
+
+  <header> 
+    <title>Who We Are</title> 
+  </header> 
+
+  <body> 
+
+      <section>
+        <title>Committers</title>
+  
+        <p>
+        (in alphabetical order): 
+        </p>
+  
+        <ul>
+        <li>Shinichiro Abe &lt;shinichiro&gt; </li>
+        <li>Ahmet Arslan &lt;iorixxx&gt; </li>
+        <li>Erlend Gar&aring;sen &lt;ridder&gt; </li>
+        <li>Furkan KAMACI &lt;kamaci&gt; </li>
+		<li>Maciej Lizewski &lt;mlizewski&gt; </li>
+        <li>Piergiorgio Lucidi &lt;piergiorgio&gt; </li>
+        <li>Minoru Osuka &lt;minoru&gt; </li>
+        <li>Simon Willnauer &lt;simonw&gt; </li>
+        <li>Karl Wright &lt;kwright&gt; </li>
+        <li>Mingchun Zhao &lt;mingchun&gt; </li>
+        <li>Jukka Zitting &lt;jukka&gt; </li>
+        </ul>
+  
+      </section>
+
+  </body>
+
+</document>
diff --git a/site/src/documentation/resources/images/ManifoldCF-logo.PNG b/src/documentation/resources/images/ManifoldCF-logo.PNG
similarity index 100%
rename from site/src/documentation/resources/images/ManifoldCF-logo.PNG
rename to src/documentation/resources/images/ManifoldCF-logo.PNG
Binary files differ
diff --git a/src/documentation/resources/images/asf_18_years.png b/src/documentation/resources/images/asf_18_years.png
new file mode 100644
index 0000000..4a23e05
--- /dev/null
+++ b/src/documentation/resources/images/asf_18_years.png
Binary files differ
diff --git a/site/src/documentation/resources/images/asf_logo.png b/src/documentation/resources/images/asf_logo.png
similarity index 100%
rename from site/src/documentation/resources/images/asf_logo.png
rename to src/documentation/resources/images/asf_logo.png
Binary files differ
diff --git a/site/src/documentation/resources/images/favicon.ico b/src/documentation/resources/images/favicon.ico
similarity index 100%
rename from site/src/documentation/resources/images/favicon.ico
rename to src/documentation/resources/images/favicon.ico
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_green_100.gif b/src/documentation/resources/images/lucene_green_100.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_green_100.gif
rename to src/documentation/resources/images/lucene_green_100.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_green_150.gif b/src/documentation/resources/images/lucene_green_150.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_green_150.gif
rename to src/documentation/resources/images/lucene_green_150.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_green_200.gif b/src/documentation/resources/images/lucene_green_200.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_green_200.gif
rename to src/documentation/resources/images/lucene_green_200.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_green_250.gif b/src/documentation/resources/images/lucene_green_250.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_green_250.gif
rename to src/documentation/resources/images/lucene_green_250.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_green_300.gif b/src/documentation/resources/images/lucene_green_300.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_green_300.gif
rename to src/documentation/resources/images/lucene_green_300.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_outline_100.gif b/src/documentation/resources/images/lucene_outline_100.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_outline_100.gif
rename to src/documentation/resources/images/lucene_outline_100.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_outline_150.gif b/src/documentation/resources/images/lucene_outline_150.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_outline_150.gif
rename to src/documentation/resources/images/lucene_outline_150.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_outline_200.gif b/src/documentation/resources/images/lucene_outline_200.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_outline_200.gif
rename to src/documentation/resources/images/lucene_outline_200.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_outline_250.gif b/src/documentation/resources/images/lucene_outline_250.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_outline_250.gif
rename to src/documentation/resources/images/lucene_outline_250.gif
Binary files differ
diff --git a/site/src/documentation/resources/images/lucene_outline_300.gif b/src/documentation/resources/images/lucene_outline_300.gif
similarity index 100%
rename from site/src/documentation/resources/images/lucene_outline_300.gif
rename to src/documentation/resources/images/lucene_outline_300.gif
Binary files differ
diff --git a/src/documentation/skinconf.xml b/src/documentation/skinconf.xml
new file mode 100644
index 0000000..23d4745
--- /dev/null
+++ b/src/documentation/skinconf.xml
@@ -0,0 +1,371 @@
+<?xml version="1.0"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation
+
+  Licensed 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.
+-->
+
+<!--
+Skin configuration file. This file contains details of your project,
+which will be used to configure the chosen Forrest skin.
+-->
+
+<!DOCTYPE skinconfig PUBLIC "-//APACHE//DTD Skin Configuration V0.8-2//EN" "http://forrest.apache.org/dtd/skinconfig-v08-2.dtd">
+<skinconfig>
+  <!-- To enable lucene search add provider="lucene" (default is google).
+    Add box-location="alt" to move the search box to an alternate location
+    (if the skin supports it) and box-location="all" to show it in all
+    available locations on the page.  Remove the <search> element to show
+    no search box. @domain will enable sitesearch for the specific domain with google.
+    In other words google will search the @domain for the query string.
+
+  -->
+  <search name="Lucene" domain="incubator.apache.org" provider="Solr"/>
+
+  <!-- Disable the print link? If enabled, invalid HTML 4.0.1 -->
+  <disable-print-link>true</disable-print-link>  
+  <!-- Disable the PDF link? -->
+  <disable-pdf-link>true</disable-pdf-link>
+  <!-- Disable the POD link? -->
+  <disable-pod-link>true</disable-pod-link>
+  <!-- Disable the Text link? FIXME: NOT YET IMPLEMENETED. -->
+  <disable-txt-link>true</disable-txt-link>
+  <!-- Disable the xml source link? -->
+  <!-- The xml source link makes it possible to access the xml rendition
+    of the source frim the html page, and to have it generated statically.
+    This can be used to enable other sites and services to reuse the
+    xml format for their uses. Keep this disabled if you don't want other
+    sites to easily reuse your pages.-->
+  <disable-xml-link>true</disable-xml-link>
+
+  <!-- Disable navigation icons on all external links? -->
+  <disable-external-link-image>true</disable-external-link-image>
+
+  <!-- Disable w3c compliance links? 
+    Use e.g. align="center" to move the compliance links logos to 
+    an alternate location default is left.
+    (if the skin supports it) -->
+  <disable-compliance-links>true</disable-compliance-links>
+
+  <!-- Render mailto: links unrecognisable by spam harvesters? -->
+  <obfuscate-mail-links>false</obfuscate-mail-links>
+
+  <!-- Disable the javascript facility to change the font size -->
+  <disable-font-script>true</disable-font-script>
+
+  <!-- mandatory project logo
+       default skin: renders it at the top -->
+  <project-name>Apache ManifoldCF</project-name>
+  <project-description>ManifoldCF</project-description>
+  <project-url>http://manifoldcf.apache.org</project-url>
+  <project-logo>images/ManifoldCF-logo.PNG</project-logo>
+  <!-- Alternative static image:
+  <project-logo>images/project-logo.gif</project-logo> -->
+
+  <!-- optional group logo
+       default skin: renders it at the top-left corner -->
+  <group-name>Apache</group-name>
+  <group-description>Apache Software Foundation</group-description>
+  <group-url>http://www.apache.org</group-url>
+  <group-logo>images/asf_18_years.png</group-logo>
+  <!-- Alternative static image:
+  <group-logo>images/group-logo.gif</group-logo> -->
+
+  <!-- optional host logo (e.g. sourceforge logo)
+       default skin: renders it at the bottom-left corner -->
+  <host-url></host-url>
+  <host-logo></host-logo>
+
+  <!-- relative url of a favicon file, normally favicon.ico -->
+  <favicon-url>images/favicon.ico</favicon-url>
+
+  <!-- The following are used to construct a copyright statement -->
+  <year>2009-2017</year>
+  <vendor>The Apache Software Foundation.</vendor>
+  <copyright-link>http://www.apache.org/licenses/</copyright-link>
+  <!-- Optional text trademark statement below the copyright statement -->
+  <trademark-statement>
+    Apache ManifoldCF, ManifoldCF, Apache Forrest, Forrest, Apache Solr, Solr, Apache, the Apache feather logo, the Apache Forrest
+    logo, and the Apache ManifoldCF logo are trademarks of The Apache Software Foundation.
+    Documentum and EMC are a trademarks of EMC Corporation.
+    SharePoint, Windows, and Microsoft are trademarks of Microsoft, Inc.
+    FileNet P8 and IBM are trademarks of IBM, Inc.
+    LiveLink and OpenText are trademarks of OpenText, Inc.
+    QBase, MetaCarta, and GTS are trademarks of QBase, Inc.
+    Meridio and Autonomy are trademarks of Hewlett Packard, Inc.
+    Alfresco is a trademark of Alfresco Software, Inc.
+  </trademark-statement>
+  <!-- Some skins use this to form a 'breadcrumb trail' of links.
+    Use location="alt" to move the trail to an alternate location
+    (if the skin supports it).
+	  Omit the location attribute to display the trail in the default location.
+	  Use location="none" to not display the trail (if the skin supports it).
+    For some skins just set the attributes to blank.
+  -->
+  <trail>
+    <link1 name="Apache" href="http://www.apache.org/"/>
+    <link2 name="ManifoldCF" href="http://manifoldcf.apache.org"/>
+    <link3 name="Project" href=""/>
+  </trail>
+
+  <!-- Configure the TOC, i.e. the Table of Contents.
+  @max-depth
+   how many "section" levels need to be included in the
+   generated Table of Contents (TOC). 
+  @min-sections
+   Minimum required to create a TOC.
+  @location ("page","menu","page,menu", "none")
+   Where to show the TOC.
+  -->
+  <toc max-depth="2" min-sections="1" location="page"/>
+
+  <!-- Heading types can be clean|underlined|boxed  -->
+  <headings type="clean"/>
+  
+  <!-- The optional feedback element will be used to construct a
+    feedback link in the footer with the page pathname appended:
+    <a href="@href">{@to}</a>
+  <feedback to="webmaster@foo.com"
+    href="mailto:webmaster@foo.com?subject=Feedback&#160;" >
+    Send feedback about the website to:
+  </feedback>
+    -->
+  <!--
+    extra-css - here you can define custom css-elements that are 
+    a. overriding the fallback elements or 
+    b. adding the css definition from new elements that you may have 
+       used in your documentation.
+    -->
+  <extra-css>
+    <!--Example of b. 
+        To define the css definition of a new element that you may have used
+        in the class attribute of a <p> node. 
+        e.g. <p class="quote"/>
+    -->
+    p.quote {
+      margin-left: 2em;
+      padding: .5em;
+      background-color: #f0f0f0;
+      font-family: monospace;
+    }
+    img.float-right {
+      float: right;
+      margin-left: 2em;
+      padding: .5em;
+    }
+    <!-- avoid using white links in the footer  -->
+    #footer a:visited { color:black }
+    #footer a:hover { color:black }
+    #footer a { color:black }
+  </extra-css>
+
+  <colors>
+  <!-- These values are used for the generated CSS files. -->
+
+  <!-- Krysalis -->
+<!--
+    <color name="header"    value="#FFFFFF"/>
+
+    <color name="tab-selected" value="#a5b6c6" link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="tab-unselected" value="#F7F7F7"  link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="subtab-selected" value="#a5b6c6"  link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="subtab-unselected" value="#a5b6c6"  link="#000000" vlink="#000000" hlink="#000000"/>
+
+    <color name="heading" value="#a5b6c6"/>
+    <color name="subheading" value="#CFDCED"/>
+        
+    <color name="navstrip" value="#CFDCED" font="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="toolbox" value="#a5b6c6"/>
+    <color name="border" value="#a5b6c6"/>
+        
+    <color name="menu" value="#F7F7F7" link="#000000" vlink="#000000" hlink="#000000"/>    
+    <color name="dialog" value="#F7F7F7"/>
+            
+    <color name="body"    value="#ffffff" link="#0F3660" vlink="#009999" hlink="#000066"/>
+    
+    <color name="table" value="#a5b6c6"/>    
+    <color name="table-cell" value="#ffffff"/>    
+    <color name="highlight" value="#ffff00"/>
+    <color name="fixme" value="#cc6600"/>
+    <color name="note" value="#006699"/>
+    <color name="warning" value="#990000"/>
+    <color name="code" value="#a5b6c6"/>
+        
+    <color name="footer" value="#a5b6c6"/>
+-->
+  
+  <!-- Forrest -->
+<!--
+    <color name="header"    value="#294563"/>
+
+    <color name="tab-selected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
+    <color name="tab-unselected" value="#b5c7e7" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
+    <color name="subtab-selected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
+    <color name="subtab-unselected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
+
+    <color name="heading" value="#294563"/>
+    <color name="subheading" value="#4a6d8c"/>
+        
+    <color name="navstrip" value="#cedfef" font="#0F3660" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
+    <color name="toolbox" value="#4a6d8c"/>
+    <color name="border" value="#294563"/>
+    
+    <color name="menu" value="#4a6d8c" font="#cedfef" link="#ffffff" vlink="#ffffff" hlink="#ffcf00"/>    
+    <color name="dialog" value="#4a6d8c"/>
+            
+    <color name="body" value="#ffffff"  link="#0F3660" vlink="#009999" hlink="#000066"/>
+    
+    <color name="table" value="#7099C5"/>    
+    <color name="table-cell" value="#f0f0ff"/>    
+    <color name="highlight" value="#ffff00"/>
+    <color name="fixme" value="#cc6600"/>
+    <color name="note" value="#006699"/>
+    <color name="warning" value="#990000"/>
+    <color name="code" value="#CFDCED"/>
+        
+    <color name="footer" value="#cedfef"/>
+-->
+
+  <!-- Collabnet --> 
+<!--
+    <color name="header"    value="#003366"/>
+
+    <color name="tab-selected" value="#dddddd" link="#555555" vlink="#555555" hlink="#555555"/>
+    <color name="tab-unselected" value="#999999" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+    <color name="subtab-selected" value="#cccccc" link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="subtab-unselected" value="#cccccc" link="#555555" vlink="#555555" hlink="#555555"/>
+
+    <color name="heading" value="#003366"/>
+    <color name="subheading" value="#888888"/>
+    
+    <color name="navstrip" value="#dddddd" font="#555555"/>
+    <color name="toolbox" value="#dddddd" font="#555555"/>
+    <color name="border" value="#999999"/>
+    
+    <color name="menu" value="#ffffff"/>    
+    <color name="dialog" value="#eeeeee"/>
+            
+    <color name="body"      value="#ffffff"/>
+    
+    <color name="table" value="#ccc"/>    
+    <color name="table-cell" value="#ffffff"/>   
+    <color name="highlight" value="#ffff00"/>
+    <color name="fixme" value="#cc6600"/>
+    <color name="note" value="#006699"/>
+    <color name="warning" value="#990000"/>
+    <color name="code" value="#003366"/>
+        
+    <color name="footer" value="#ffffff"/>
+-->
+ <!-- Lenya using pelt-->
+<!--
+    <color name="header" value="#ffffff"/>
+
+    <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
+    <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="subtab-selected" value="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
+    <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
+
+    <color name="heading" value="#E5E4D9"/>
+    <color name="subheading" value="#000000"/>
+    <color name="published" value="#4C6C8F" font="#FFFFFF"/>
+    <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
+    <color name="navstrip" value="#E5E4D9" font="#000000"/>
+
+    <color name="toolbox" value="#CFDCED" font="#000000"/>
+
+    <color name="border" value="#999999"/>
+    <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff" current="#FFCC33" />    
+    <color name="menuheading" value="#cfdced" font="#000000" />
+    <color name="searchbox" value="#E5E4D9" font="#000000"/>
+    
+    <color name="dialog" value="#CFDCED"/>
+    <color name="body" value="#ffffff" />            
+    
+    <color name="table" value="#ccc"/>    
+    <color name="table-cell" value="#ffffff"/>   
+    <color name="highlight" value="#ffff00"/>
+    <color name="fixme" value="#cc6600"/>
+    <color name="note" value="#006699"/>
+    <color name="warning" value="#990000"/>
+    <color name="code" value="#003366"/>
+        
+    <color name="footer" value="#E5E4D9"/>
+-->
+  </colors>
+ 
+  <!-- Settings specific to PDF output. -->
+  <pdf>
+    <!-- 
+       Supported page sizes are a0, a1, a2, a3, a4, a5, executive,
+       folio, legal, ledger, letter, quarto, tabloid (default letter).
+       Supported page orientations are portrait, landscape (default
+       portrait).
+       Supported text alignments are left, right, justify (default left).
+    -->
+    <page size="letter" orientation="portrait" text-align="left"/>
+
+    <!--
+       Margins can be specified for top, bottom, inner, and outer
+       edges. If double-sided="false", the inner edge is always left
+       and the outer is always right. If double-sided="true", the
+       inner edge will be left on odd pages, right on even pages,
+       the outer edge vice versa.
+       Specified below are the default settings.
+    -->
+    <margins double-sided="false">
+      <top>1in</top>
+      <bottom>1in</bottom>
+      <inner>1.25in</inner>
+      <outer>1in</outer>
+    </margins>
+
+    <!--
+      Print the URL text next to all links going outside the file
+    -->
+    <show-external-urls>false</show-external-urls>
+
+    <!--
+      Disable the copyright footer on each page of the PDF.
+      A footer is composed for each page. By default, a "credit" with role=pdf
+      will be used, as explained below. Otherwise a copyright statement
+      will be generated. This latter can be disabled.
+    -->
+    <disable-copyright-footer>false</disable-copyright-footer>
+  </pdf>
+
+  <!-- Credits are typically rendered as a set of small clickable
+    images in the page footer.
+    Use box-location="alt" to move the credit to an alternate location
+    (if the skin supports it). 
+  -->
+  <credits>
+    <credit box-location="alt">
+      <name>Built with Apache Forrest</name>
+      <url>http://forrest.apache.org/</url>
+      <image>images/built-with-forrest-button.png</image>
+      <width>88</width>
+      <height>31</height>
+    </credit>
+    <!-- A credit with @role="pdf" will be used to compose a footer
+     for each page in the PDF, using either "name" or "url" or both.
+    -->
+    <!--
+    <credit role="pdf">
+      <name>Built with Apache Forrest</name>
+      <url>http://forrest.apache.org/</url>
+    </credit>
+    -->
+  </credits>
+
+</skinconfig>
diff --git a/site/src/documentation/skins/common/css/forrest.css.xslt b/src/documentation/skins/common/css/forrest.css.xslt
similarity index 100%
rename from site/src/documentation/skins/common/css/forrest.css.xslt
rename to src/documentation/skins/common/css/forrest.css.xslt
diff --git a/site/src/documentation/skins/common/images/README.txt b/src/documentation/skins/common/images/README.txt
similarity index 100%
rename from site/src/documentation/skins/common/images/README.txt
rename to src/documentation/skins/common/images/README.txt
diff --git a/site/src/documentation/skins/common/images/corner-imports.svg.xslt b/src/documentation/skins/common/images/corner-imports.svg.xslt
similarity index 100%
rename from site/src/documentation/skins/common/images/corner-imports.svg.xslt
rename to src/documentation/skins/common/images/corner-imports.svg.xslt
diff --git a/site/src/documentation/skins/common/images/dc.svg.xslt b/src/documentation/skins/common/images/dc.svg.xslt
similarity index 100%
rename from site/src/documentation/skins/common/images/dc.svg.xslt
rename to src/documentation/skins/common/images/dc.svg.xslt
diff --git a/site/src/documentation/skins/common/images/instruction_arrow.png b/src/documentation/skins/common/images/instruction_arrow.png
similarity index 100%
rename from site/src/documentation/skins/common/images/instruction_arrow.png
rename to src/documentation/skins/common/images/instruction_arrow.png
Binary files differ
diff --git a/site/src/documentation/skins/common/images/poddoc.svg.xslt b/src/documentation/skins/common/images/poddoc.svg.xslt
similarity index 100%
rename from site/src/documentation/skins/common/images/poddoc.svg.xslt
rename to src/documentation/skins/common/images/poddoc.svg.xslt
diff --git a/site/src/documentation/skins/common/images/rc.svg.xslt b/src/documentation/skins/common/images/rc.svg.xslt
similarity index 100%
rename from site/src/documentation/skins/common/images/rc.svg.xslt
rename to src/documentation/skins/common/images/rc.svg.xslt
diff --git a/site/src/documentation/skins/common/images/txtdoc.svg.xslt b/src/documentation/skins/common/images/txtdoc.svg.xslt
similarity index 100%
rename from site/src/documentation/skins/common/images/txtdoc.svg.xslt
rename to src/documentation/skins/common/images/txtdoc.svg.xslt
diff --git a/site/src/documentation/skins/common/scripts/breadcrumbs-optimized.js b/src/documentation/skins/common/scripts/breadcrumbs-optimized.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/breadcrumbs-optimized.js
rename to src/documentation/skins/common/scripts/breadcrumbs-optimized.js
diff --git a/site/src/documentation/skins/common/scripts/breadcrumbs.js b/src/documentation/skins/common/scripts/breadcrumbs.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/breadcrumbs.js
rename to src/documentation/skins/common/scripts/breadcrumbs.js
diff --git a/site/src/documentation/skins/common/scripts/fontsize.js b/src/documentation/skins/common/scripts/fontsize.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/fontsize.js
rename to src/documentation/skins/common/scripts/fontsize.js
diff --git a/site/src/documentation/skins/common/scripts/getBlank.js b/src/documentation/skins/common/scripts/getBlank.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/getBlank.js
rename to src/documentation/skins/common/scripts/getBlank.js
diff --git a/site/src/documentation/skins/common/scripts/getMenu.js b/src/documentation/skins/common/scripts/getMenu.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/getMenu.js
rename to src/documentation/skins/common/scripts/getMenu.js
diff --git a/site/src/documentation/skins/common/scripts/menu.js b/src/documentation/skins/common/scripts/menu.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/menu.js
rename to src/documentation/skins/common/scripts/menu.js
diff --git a/site/src/documentation/skins/common/scripts/prototype.js b/src/documentation/skins/common/scripts/prototype.js
similarity index 100%
rename from site/src/documentation/skins/common/scripts/prototype.js
rename to src/documentation/skins/common/scripts/prototype.js
diff --git a/site/src/documentation/skins/common/skinconf.xsl b/src/documentation/skins/common/skinconf.xsl
similarity index 100%
rename from site/src/documentation/skins/common/skinconf.xsl
rename to src/documentation/skins/common/skinconf.xsl
diff --git a/site/src/documentation/skins/common/translations/CommonMessages_de.xml b/src/documentation/skins/common/translations/CommonMessages_de.xml
similarity index 100%
rename from site/src/documentation/skins/common/translations/CommonMessages_de.xml
rename to src/documentation/skins/common/translations/CommonMessages_de.xml
diff --git a/site/src/documentation/skins/common/translations/CommonMessages_en_US.xml b/src/documentation/skins/common/translations/CommonMessages_en_US.xml
similarity index 100%
rename from site/src/documentation/skins/common/translations/CommonMessages_en_US.xml
rename to src/documentation/skins/common/translations/CommonMessages_en_US.xml
diff --git a/site/src/documentation/skins/common/translations/CommonMessages_es.xml b/src/documentation/skins/common/translations/CommonMessages_es.xml
similarity index 100%
rename from site/src/documentation/skins/common/translations/CommonMessages_es.xml
rename to src/documentation/skins/common/translations/CommonMessages_es.xml
diff --git a/site/src/documentation/skins/common/translations/CommonMessages_fr.xml b/src/documentation/skins/common/translations/CommonMessages_fr.xml
similarity index 100%
rename from site/src/documentation/skins/common/translations/CommonMessages_fr.xml
rename to src/documentation/skins/common/translations/CommonMessages_fr.xml
diff --git a/site/src/documentation/skins/common/xslt/fo/document-to-fo.xsl b/src/documentation/skins/common/xslt/fo/document-to-fo.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/fo/document-to-fo.xsl
rename to src/documentation/skins/common/xslt/fo/document-to-fo.xsl
diff --git a/site/src/documentation/skins/common/xslt/fo/footerinfo.xsl b/src/documentation/skins/common/xslt/fo/footerinfo.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/fo/footerinfo.xsl
rename to src/documentation/skins/common/xslt/fo/footerinfo.xsl
diff --git a/site/src/documentation/skins/common/xslt/fo/pdfoutline.xsl b/src/documentation/skins/common/xslt/fo/pdfoutline.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/fo/pdfoutline.xsl
rename to src/documentation/skins/common/xslt/fo/pdfoutline.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/book-to-menu.xsl b/src/documentation/skins/common/xslt/html/book-to-menu.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/book-to-menu.xsl
rename to src/documentation/skins/common/xslt/html/book-to-menu.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/document-to-html.xsl b/src/documentation/skins/common/xslt/html/document-to-html.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/document-to-html.xsl
rename to src/documentation/skins/common/xslt/html/document-to-html.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/dotdots.xsl b/src/documentation/skins/common/xslt/html/dotdots.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/dotdots.xsl
rename to src/documentation/skins/common/xslt/html/dotdots.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/pathutils.xsl b/src/documentation/skins/common/xslt/html/pathutils.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/pathutils.xsl
rename to src/documentation/skins/common/xslt/html/pathutils.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/renderlogo.xsl b/src/documentation/skins/common/xslt/html/renderlogo.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/renderlogo.xsl
rename to src/documentation/skins/common/xslt/html/renderlogo.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/site-to-xhtml.xsl b/src/documentation/skins/common/xslt/html/site-to-xhtml.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/site-to-xhtml.xsl
rename to src/documentation/skins/common/xslt/html/site-to-xhtml.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/split.xsl b/src/documentation/skins/common/xslt/html/split.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/split.xsl
rename to src/documentation/skins/common/xslt/html/split.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/strip_namespaces.xsl b/src/documentation/skins/common/xslt/html/strip_namespaces.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/strip_namespaces.xsl
rename to src/documentation/skins/common/xslt/html/strip_namespaces.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/tab-to-menu.xsl b/src/documentation/skins/common/xslt/html/tab-to-menu.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/tab-to-menu.xsl
rename to src/documentation/skins/common/xslt/html/tab-to-menu.xsl
diff --git a/site/src/documentation/skins/common/xslt/html/tabutils.xsl b/src/documentation/skins/common/xslt/html/tabutils.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/html/tabutils.xsl
rename to src/documentation/skins/common/xslt/html/tabutils.xsl
diff --git a/site/src/documentation/skins/common/xslt/svg/document-to-svg.xsl b/src/documentation/skins/common/xslt/svg/document-to-svg.xsl
similarity index 100%
rename from site/src/documentation/skins/common/xslt/svg/document-to-svg.xsl
rename to src/documentation/skins/common/xslt/svg/document-to-svg.xsl
diff --git a/site/src/documentation/skins/lucene/css/basic.css b/src/documentation/skins/lucene/css/basic.css
similarity index 100%
rename from site/src/documentation/skins/lucene/css/basic.css
rename to src/documentation/skins/lucene/css/basic.css
diff --git a/site/src/documentation/skins/lucene/css/print.css b/src/documentation/skins/lucene/css/print.css
similarity index 100%
rename from site/src/documentation/skins/lucene/css/print.css
rename to src/documentation/skins/lucene/css/print.css
diff --git a/site/src/documentation/skins/lucene/css/profile.css.xslt b/src/documentation/skins/lucene/css/profile.css.xslt
similarity index 100%
rename from site/src/documentation/skins/lucene/css/profile.css.xslt
rename to src/documentation/skins/lucene/css/profile.css.xslt
diff --git a/site/src/documentation/skins/lucene/css/screen.css b/src/documentation/skins/lucene/css/screen.css
similarity index 100%
rename from site/src/documentation/skins/lucene/css/screen.css
rename to src/documentation/skins/lucene/css/screen.css
diff --git a/site/src/documentation/skins/lucene/images/chapter.gif b/src/documentation/skins/lucene/images/chapter.gif
similarity index 100%
rename from site/src/documentation/skins/lucene/images/chapter.gif
rename to src/documentation/skins/lucene/images/chapter.gif
Binary files differ
diff --git a/site/src/documentation/skins/lucene/images/current.gif b/src/documentation/skins/lucene/images/current.gif
similarity index 100%
rename from site/src/documentation/skins/lucene/images/current.gif
rename to src/documentation/skins/lucene/images/current.gif
Binary files differ
diff --git a/site/src/documentation/skins/lucene/images/instruction_arrow.png b/src/documentation/skins/lucene/images/instruction_arrow.png
similarity index 100%
rename from site/src/documentation/skins/lucene/images/instruction_arrow.png
rename to src/documentation/skins/lucene/images/instruction_arrow.png
Binary files differ
diff --git a/site/src/documentation/skins/lucene/images/page.gif b/src/documentation/skins/lucene/images/page.gif
similarity index 100%
rename from site/src/documentation/skins/lucene/images/page.gif
rename to src/documentation/skins/lucene/images/page.gif
Binary files differ
diff --git a/site/src/documentation/skins/lucene/note.txt b/src/documentation/skins/lucene/note.txt
similarity index 100%
rename from site/src/documentation/skins/lucene/note.txt
rename to src/documentation/skins/lucene/note.txt
diff --git a/site/src/documentation/skins/lucene/skinconf.xsl b/src/documentation/skins/lucene/skinconf.xsl
similarity index 100%
rename from site/src/documentation/skins/lucene/skinconf.xsl
rename to src/documentation/skins/lucene/skinconf.xsl
diff --git a/site/src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl b/src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl
similarity index 100%
rename from site/src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl
rename to src/documentation/skins/lucene/xslt/fo/document-to-fo.xsl
diff --git a/site/src/documentation/skins/lucene/xslt/html/book-to-menu.xsl b/src/documentation/skins/lucene/xslt/html/book-to-menu.xsl
similarity index 100%
rename from site/src/documentation/skins/lucene/xslt/html/book-to-menu.xsl
rename to src/documentation/skins/lucene/xslt/html/book-to-menu.xsl
diff --git a/site/src/documentation/skins/lucene/xslt/html/document-to-html.xsl b/src/documentation/skins/lucene/xslt/html/document-to-html.xsl
similarity index 100%
rename from site/src/documentation/skins/lucene/xslt/html/document-to-html.xsl
rename to src/documentation/skins/lucene/xslt/html/document-to-html.xsl
diff --git a/site/src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl b/src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl
similarity index 100%
rename from site/src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl
rename to src/documentation/skins/lucene/xslt/html/site-to-xhtml.xsl
diff --git a/site/src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl b/src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl
similarity index 100%
rename from site/src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl
rename to src/documentation/skins/lucene/xslt/html/tab-to-menu.xsl
diff --git a/src/main/assembly/src.xml b/src/main/assembly/src.xml
deleted file mode 100644
index 0c3c233..0000000
--- a/src/main/assembly/src.xml
+++ /dev/null
@@ -1,74 +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.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org/>.
- -->
-<assembly>
-    <id>src</id>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <fileSets>
-        <!-- Release materials -->
-        <fileSet>
-          <directory></directory>
-          <outputDirectory></outputDirectory>
-          <excludes>
-            <exclude>**/.*</exclude>
-            <exclude>**/.*/**</exclude>
-            <exclude>lib/</exclude>
-            <exclude>connectors/*/lib/</exclude>
-            <exclude>framework/lib/</exclude>
-            <exclude>**/lib-proprietary/**</exclude>
-            <exclude>**/build/</exclude>
-            <exclude>**/tmp/</exclude>
-            <exclude>site/fonts/</exclude>
-            <exclude>dist/</exclude>
-            <exclude>connectors/*/dist/</exclude>
-            <exclude>framework/dist/</exclude>
-            <exclude>**/target/</exclude>
-            <exclude>**/test-output/</exclude>
-            <exclude>**/test-HSQLDB-output/</exclude>
-            <exclude>**/test-HSQLDBext-output/</exclude>
-            <exclude>**/test-postgresql-output/</exclude>
-            <exclude>**/test-mysql-output/</exclude>
-            <exclude>**/test-materials/*.jar</exclude>
-            <exclude>**/test-materials/*.war</exclude>
-            <exclude>**/test-materials/*.wsdl</exclude>
-            <exclude>**/test-materials/*.xsd</exclude>
-            <exclude>**/test-materials-proprietary/*.jar</exclude>
-            <exclude>**/test-materials-proprietary/*.war</exclude>
-            <exclude>**/test-materials-proprietary/*.wsdl</exclude>
-            <exclude>**/test-materials-proprietary/*.xsd</exclude>
-            <exclude>**/lib-proprietary/*.jar</exclude>
-            <exclude>**/lib-proprietary/*.war</exclude>
-            <exclude>**/lib-proprietary/*.wsdl</exclude>
-            <exclude>**/lib-proprietary/*.xsd</exclude>
-            <exclude>connectors/elasticsearch/test-materials-proprietary/elasticsearch-1.0.1/</exclude>
-            <exclude>legacy-*/</exclude>
-            <exclude>apache-manifoldcf-*/</exclude>
-          </excludes>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/test-materials/.gitignore b/test-materials/.gitignore
deleted file mode 100644
index b4b43c8..0000000
--- a/test-materials/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.project
-/.settings/
-/alfresco-4-war/overlays/
diff --git a/test-materials/alfresco-4-war/.gitignore b/test-materials/alfresco-4-war/.gitignore
deleted file mode 100644
index 8bd3a05..0000000
--- a/test-materials/alfresco-4-war/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
diff --git a/test-materials/alfresco-4-war/jetty/jetty-env.xml b/test-materials/alfresco-4-war/jetty/jetty-env.xml
deleted file mode 100755
index 6d01acb..0000000
--- a/test-materials/alfresco-4-war/jetty/jetty-env.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-<?xml version="1.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.
--->
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
-
-<Configure class="org.mortbay.jetty.webapp.WebAppContext">
-    <New id="myDataSource"
-         class="org.mortbay.jetty.plus.naming.Resource">
-        <Arg>jdbc/dataSource</Arg>
-        <Arg>
-            <New class="org.h2.jdbcx.JdbcDataSource">
-                <Set name="URL">jdbc:h2:alf_data_jetty/h2_data/alf_jetty</Set>
-                <Set name="User">alfresco</Set>
-                <Set name="Password">alfresco</Set>
-            </New>
-        </Arg>
-    </New>
-</Configure>
diff --git a/test-materials/alfresco-4-war/pom.xml b/test-materials/alfresco-4-war/pom.xml
deleted file mode 100644
index 1a87217..0000000
--- a/test-materials/alfresco-4-war/pom.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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. -->
-    
-<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>
-    <artifactId>alfresco-4-war</artifactId>
-    <version>2.10-SNAPSHOT</version>
-    <name>ManifoldCF - Test Materials - Alfresco WAR</name>
-    <description>Alfresco WAR builder</description>
-    <packaging>war</packaging>
-
-    <parent>
-        <groupId>org.apache.manifoldcf</groupId>
-        <artifactId>mcf-test-materials</artifactId>
-        <version>2.10-SNAPSHOT</version>
-    </parent>
-    
-    <properties>
-        <alfresco.groupId>org.alfresco</alfresco.groupId>
-        <alfresco.version>4.2.c</alfresco.version>
-        <app.log.root.level>WARN</app.log.root.level>
-        <alfresco.data.location>alf_data_dev</alfresco.data.location>
-        <!-- This controls which properties will be picked in src/test/properties for embedded run -->
-        <env>local</env>
-        <alfresco.db.name>alf_jetty</alfresco.db.name>
-        <alfresco.db.url>jdbc:h2:${alfresco.data.location}/h2_data/${alfresco.db.name}</alfresco.db.url>
-        <alfresco.db.driver>org.h2.Driver</alfresco.db.driver>
-        <alfresco.db.username>alfresco</alfresco.db.username>
-        <alfresco.db.password>alfresco</alfresco.db.password>
-        <alfresco.db.hibernate.dialect>org.hibernate.dialect.H2Dialect</alfresco.db.hibernate.dialect>
-    </properties>
-    
-    <!-- Here we realize the connection with the Alfresco selected platform (e.g.version and edition) -->
-   <dependencyManagement>
-     <dependencies>
-          <!-- This will import the dependencyManagement for all artifacts in the selected Alfresco plaftorm
-               (see http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Importing_Dependencies)
-               NOTE: You still need to define dependencies in your POM, but you can omit version as it's enforced by this dependencyManagement.
-               NOTE: It defaults to the latest version this SDK pom has been tested with, but alfresco version can/should be overridden in your project's pom   
-           -->
-          <dependency>
-              <groupId>${alfresco.groupId}</groupId>
-              <artifactId>alfresco-platform-distribution</artifactId>
-              <version>${alfresco.version}</version>
-              <type>pom</type>
-              <scope>import</scope>
-          </dependency>
-     </dependencies>
-  </dependencyManagement>
-  
-    <!--
-    No more repos are needed since they will be inherited by the parent POM. 
-    This is needed to download the alfresco-plaftorm POM.
-    -->
-    <repositories>
-        <repository>
-            <id>alfresco-artifacts</id>
-            <url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
-        </repository>
-        <repository>
-            <id>alfresco-artifacts-snapshots</id>
-            <url>https://artifacts.alfresco.com/nexus/content/groups/public-snapshots</url>
-        </repository>
-    </repositories>
-
-    <dependencies>
-        <dependency>
-            <groupId>${alfresco.groupId}</groupId>
-            <artifactId>alfresco</artifactId>
-            <type>war</type>
-        </dependency>
-        <dependency>
-		      <groupId>tk.skuro.alfresco</groupId>
-		      <artifactId>h2-support</artifactId>
-		      <version>1.5</version>
-		    </dependency>
-		    <dependency>
-		        <groupId>com.h2database</groupId>
-		        <artifactId>h2</artifactId>
-		        <version>1.3.172</version>
-		    </dependency>
-    </dependencies>
-
-    <build>
-        <finalName>alfresco</finalName>
-        <!--
-      In certain cases we do build time filtering with the single sourcing
-      alfresco-global.properties
-    -->
-    <filters>
-      <filter>src/main/properties/${env}/alfresco-global.properties</filter>
-    </filters>
-    
-    <resources>
-      <resource>
-        <directory>src/main/properties/${env}</directory>
-        <includes>
-          <include>alfresco-global.properties</include>
-        </includes>
-        <filtering>true</filtering>
-      </resource>
-    </resources>
-    
-        <plugins>
-            <plugin>
-                <artifactId>maven-war-plugin</artifactId>
-                <version>2.3</version>
-                <configuration>
-                    <!--  Here is can control the order of overlay of your (WAR, AMP, etc.) dependencies
-                        | NOTE: At least one WAR dependency must be uncompressed first
-                        | NOTE: In order to have a dependency effectively added to the WAR you need to 
-                        | explicitly mention it in the overlay section.
-                        | NOTE: First-win resource strategy is used by the WAR plugin
-                         -->
-                    <overlays>
-                        <!-- Current project customizations -->
-                        <overlay/>
-                        <!-- The Alfresco WAR -->
-                        <overlay>
-                            <groupId>${alfresco.groupId}</groupId>
-                            <artifactId>alfresco</artifactId>
-                            <type>war</type>
-                            <!-- To allow inclusion of META-INF -->
-                            <excludes/>
-                        </overlay>
-                    </overlays>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/test-materials/alfresco-4-war/src/main/properties/local/alfresco-global.properties b/test-materials/alfresco-4-war/src/main/properties/local/alfresco-global.properties
deleted file mode 100644
index 94712e6..0000000
--- a/test-materials/alfresco-4-war/src/main/properties/local/alfresco-global.properties
+++ /dev/null
@@ -1,316 +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.
-# RUN TIME PROPERTIES
-# -------------------
-
-# Sample custom content and index data location
-# This will create alf_data Relative to appserver run folder
-# In this default file we take the property from the POM (for compatbility with local jetty and jboss deployments) but it can also be edited here.
-
-###############################
-## Common Alfresco Properties #
-###############################
-
-cifs.enabled=false
-ftp.enabled=false
-nfs.enabled=false
-
-dir.root=${alfresco.data.location}
-# Allowed values are: NONE, AUTO, FULL
-index.recovery.mode=NONE
-
-# Fail or not when there are node integrity checker errors
-integrity.failOnError=true
-
-# database connection properties
-# MySQL connection (This is default and requires mysql-connector-java-5.0.3-bin.jar, which ships with the Alfresco server)
-
-db.driver=${alfresco.db.driver}
-db.url=${alfresco.db.url}
-db.username=${alfresco.db.username}
-db.password=${alfresco.db.password}
-
-db.pool.initial=10
-db.pool.max=100
-
-# Dialect is autodetected starting from 3.2
-# H2 dialect
-hibernate.dialect=${alfresco.db.hibernate.dialect}
-
-index.subsystem.name=lucene
-solr.host=localhost
-solr.port=8080
-solr.secureComms=none
-# Setting Solr backup for the future. Tweak this if needed (ideally in other env properties files) 
-solr.backup.alfresco.cronExpression=0 30 2 * * ? 2050  
-solr.backup.archive.cronExpression=0 30 3 * * ? 2050
-solr.backup.alfresco.remoteBackupLocation=${dir.root}/solrBackup/alfresco
-solr.backup.archive.remoteBackupLocation=${dir.root}/solrBackup/archive
-# We are in the local DEV properties file, no need for Solr backup
-solr.backup.alfresco.numberToKeep=0
-solr.backup.archive.numberToKeep=0
-
-# These jobs seem to require Lucene (Unsupported Operation with Solr) so we disasble them / set to future date
-# See https://forums.alfresco.com/en/viewtopic.php?f=52&t=41597
-# If you want to enable them (and so full WQS functionality), please also set index.subsystem.name=lucene
-wcmqs.dynamicCollectionProcessor.schedule=0 30 2 * * ? 2060
-wcmqs.feedbackProcessor.schedule=0 40 2 * * ? 2060
-wcmqs.publishQueueProcessor.schedule=0 50 2 * * ? 2060
-
-
-#
-# Sample custom content and index data location
-#
-#dir.root=/srv/alfresco/alf_data
-#dir.keystore=${dir.root}/keystore
-
-#
-# Sample database connection properties
-#
-#db.username=alfresco
-#db.password=alfresco
-
-#
-# External locations
-#-------------
-#ooo.exe=soffice
-#ooo.enabled=false
-#jodconverter.officeHome=./OpenOffice.org
-#jodconverter.portNumbers=8101
-#jodconverter.enabled=true
-#img.root=./ImageMagick
-#swf.exe=./bin/pdf2swf
-
-#
-# Property to control whether schema updates are performed automatically.
-# Updates must be enabled during upgrades as, apart from the static upgrade scripts,
-# there are also auto-generated update scripts that will need to be executed.  After
-# upgrading to a new version, this can be disabled.
-#
-#db.schema.update=true
-
-#
-# MySQL connection
-#
-#db.driver=org.gjt.mm.mysql.Driver
-#db.url=jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8
-
-#
-# Oracle connection
-#
-#db.driver=oracle.jdbc.OracleDriver
-#db.url=jdbc:oracle:thin:@localhost:1521:alfresco
-
-#
-# SQLServer connection
-# Requires jTDS driver version 1.2.5 and SNAPSHOT isolation mode
-# Enable TCP protocol on fixed port 1433
-# Prepare the database with:
-# ALTER DATABASE alfresco SET ALLOW_SNAPSHOT_ISOLATION ON; 
-#
-#db.driver=net.sourceforge.jtds.jdbc.Driver
-#db.url=jdbc:jtds:sqlserver://localhost:1433/alfresco
-#db.txn.isolation=4096
-
-#
-# PostgreSQL connection (requires postgresql-8.2-504.jdbc3.jar or equivalent)
-#
-#db.driver=org.postgresql.Driver
-#db.url=jdbc:postgresql://localhost:5432/alfresco
-
-#
-# DB2 connection
-#
-#db.driver=com.ibm.db2.jcc.DB2Driver
-#db.url=jdbc:db2://localhost:50000/alfresco:retrieveMessagesFromServerOnGetMessage=true;
-
-#
-# Index Recovery Mode
-#-------------
-#index.recovery.mode=AUTO
-
-#
-# Outbound Email Configuration
-#-------------
-#mail.host=
-#mail.port=25
-#mail.username=anonymous
-#mail.password=
-#mail.encoding=UTF-8
-#mail.from.default=alfresco@alfresco.org
-#mail.smtp.auth=false
-
-#
-# Alfresco Email Service and Email Server
-#-------------
-
-# Enable/Disable the inbound email service.  The service could be used by processes other than
-# the Email Server (e.g. direct RMI access) so this flag is independent of the Email Service.
-#-------------
-#email.inbound.enabled=true
-
-# Email Server properties 
-#-------------
-#email.server.enabled=true
-#email.server.port=25
-#email.server.domain=alfresco.com
-#email.inbound.unknownUser=anonymous
-
-# A comma separated list of email REGEX patterns of allowed senders.
-# If there are any values in the list then all sender email addresses
-# must match. For example:
-#   .*\@alfresco\.com, .*\@alfresco\.org
-# Allow anyone:
-#-------------
-#email.server.allowed.senders=.*
-
-#
-# The default authentication chain
-# To configure external authentication subsystems see:
-# http://wiki.alfresco.com/wiki/Alfresco_Authentication_Subsystems
-#-------------
-#authentication.chain=alfrescoNtlm1:alfrescoNtlm
-
-#
-# URL Generation Parameters (The ${localname} token is replaced by the local server name)
-#-------------
-#alfresco.context=alfresco
-#alfresco.host=${localname}
-#alfresco.port=8080
-#alfresco.protocol=http
-#
-#share.context=share
-#share.host=${localname}
-#share.port=8080
-#share.protocol=http
-
-#imap.server.enabled=true
-#imap.server.port=143
-#imap.server.host=localhost
-
-# Default value of alfresco.rmi.services.host is 0.0.0.0 which means 'listen on all adapters'.
-# This allows connections to JMX both remotely and locally.
-#
-alfresco.rmi.services.host=0.0.0.0
-
-#
-# RMI service ports for the individual services.
-# These seven services are available remotely.
-#
-# Assign individual ports for each service for best performance 
-# or run several services on the same port. You can even run everything on 50500 if needed.
-#
-# Select 0 to use a random unused port.
-# 
-#avm.rmi.service.port=50501
-#avmsync.rmi.service.port=50502
-#attribute.rmi.service.port=50503
-#authentication.rmi.service.port=50504
-#repo.rmi.service.port=50505
-#action.rmi.service.port=50506
-#wcm-deployment-receiver.rmi.service.port=50507
-#monitor.rmi.service.port=50508
-
-
-# Dialect is autodetected starting from 3.2
-# H2 dialect
-#hibernate.dialect=org.hibernate.dialect.H2Dialect
-
-
-# Property to control whether schema updates are performed automatically.
-# Updates must be enabled during upgrades as, apart from the static upgrade scripts,
-# there are also auto-generated update scripts that will need to be executed.  After
-# upgrading to a new version, this can be disabled.
-#db.schema.update=true
-
-
-# File servers related properties 
-# For local builds we disable CIFS and FTP. Edit the following property to reenable them
-smb.server.enabled=false
-smb.server.name=CFS_SHARE_LOCAL
-smb.server.domain=mycompany.com
-smb.server.bindto=127.0.0.1
-smb.tcpip.port=1445
-netbios.session.port=1139
-netbios.name.port=1137
-netbios.datagram.port=1138
-ftp.server.enabled=false
-ftp.port=1121
-ftp.authenticator=alfresco
-
-# This properties file is used to configure LDAP authentication
-# NB: The following LDAP related properties are read only in case -Denteprise mvn build property is specified
-# Wheter to allow silent deletion of users in the Alfresco UI (note: users will be then resynced in the next synchronization)
-ldap.authentication.allowDeleteUser=true
-# LDAP JNDI provider
-ldap.authentication.provider=com.sun.jndi.ldap.LdapCtxFactory
-# Url and protocol for LDAP server to carry authentication against 
-ldap.authentication.url=ldap://ldap.mycompany.com:636
-# can be (simple, ssl)
-ldap.authentication.protcol=ssl
-# Credentials with full access to the directoty used
-ldap.authentication.adminUser=ou=Admin,ou=Services,o=Company
-ldap.authentication.adminPassword=secret
-# Wheter to allow unauthenticated guest a read only login
-ldap.authentication.guestLogin.allowed=false
-# Wheter users can be created on the fly upon successful external (e.g. LDAP) authentication. Useful to avoid user synchronization in case just uid and pwd are needed for a user
-server.transaction.allow-writes=true
-# Wheter user names are case sensitive
-user.name.caseSensitive=true
-# Wheter the synchronization process has to process duplicated users (e.g. synced users and users coming from the sync)
-personService.processDuplicates=true
-# Which action to take when processin duplicates. One of:  LEAVE, SPLIT, DELETE 
-personService.duplicateMode=DELETE
-# Which of the users (in case of SPLIT duplicates policy) should be considered valid
-personService.lastIsBest=true
-# Wheter auto created users should be considered when processing duplicates
-personService.includeAutoCreated=true
-# The query to find the people to import
-ldap.synchronisation.personQuery=(objectclass=inetOrgPerson)
-# The search base of the query to find people to import
-ldap.synchronisation.personSearchBase=ou=Identities,ou=mycompany,o=com
-# The attribute name on people objects found in LDAP to use as the uid in Alfresco
-ldap.synchronisation.userIdAttributeName=cn
-# The attribute on person objects in LDAP to map to the first name property in Alfresco
-ldap.synchronisation.userFirstNameAttributeName=givenName
-# The attribute on person objects in LDAP to map to the last name property in Alfresco
-ldap.synchronisation.userLastNameAttributeName=sn
-# The attribute on person objects in LDAP to map to the email property in Alfresco
-ldap.synchronisation.userEmailAttributeName=cn
-# The attribute on person objects in LDAP to map to the organizational id  property in Alfresco
-ldap.synchronisation.userOrganizationalIdAttributeName=maildomain
-# The default home folder provider to use for people created via LDAP import
-ldap.synchronisation.defaultHomeFolderProvider=companyHomeFolderProvider
-# The query to find group objects
-ldap.synchronisation.groupQuery=(objectclass=AlfrescoGroup)
-# The search base to use to find group objects
-ldap.synchronisation.groupSearchBase=ou=AlfrescoGroups,ou=mycompany,o=com
-# The attribute on LDAP group objects to map to the gid property in Alfrecso
-ldap.synchronisation.groupIdAttributeName=cn
-# The group type in LDAP
-ldap.synchronisation.groupType=AlfrescoGroup
-# The person type in LDAP
-ldap.synchronisation.personType=inetOrgPerson
-# The attribute in LDAP on group objects that defines the DN for its members
-ldap.synchronisation.groupMemberAttributeName=member
-# The cron expression defining when people imports should take place (e.g. every evening at 22:00 hours)
-ldap.synchronisation.import.person.cron=0 0 22 * * ?
-# The cron expression defining when group imports should take place (e.g. every evening at 21:45 hours)
-ldap.synchronisation.import.group.cron=0 45 21 * * ?
-# Should all groups be cleared out at import time?
-# - this is safe as groups are not used in Alfresco for other things (unlike person objects which you should never clear out during an import)
-# - setting this to true means old group definitions will be tidied up.
-ldap.synchronisation.import.group.clearAllChildren=false
-
diff --git a/test-materials/alfresco-4-war/src/main/webapp/WEB-INF/faces-config-custom.xml b/test-materials/alfresco-4-war/src/main/webapp/WEB-INF/faces-config-custom.xml
deleted file mode 100644
index bf9ab69..0000000
--- a/test-materials/alfresco-4-war/src/main/webapp/WEB-INF/faces-config-custom.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-    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.
-    
--->
-<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
-                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
-<faces-config>
-	<!--
-		|
-		|  Insert here custom faces configurations like:
-		|  <managed-bean>
-		|  <navigation-rule>
-		|
-		|  This is loaded as part of the alfresco convention over configuration
-		-->
-
-
-</faces-config>
-
diff --git a/test-materials/pom.xml b/test-materials/pom.xml
deleted file mode 100644
index db38b0a..0000000
--- a/test-materials/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.apache.manifoldcf</groupId>
-    <artifactId>mcf-parent</artifactId>
-    <version>2.10-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>mcf-test-materials</artifactId>
-  <name>ManifoldCF - Test materials</name>
-  <packaging>pom</packaging>
-  <modules>
-    <module>alfresco-4-war</module>
-  </modules>
-  <build>
-    <defaultGoal>package</defaultGoal>
-  </build>
-</project>
\ No newline at end of file